diff --git a/admin/auth-admin.php b/admin/auth-admin.php index 97394bb8..f2d1b07f 100644 --- a/admin/auth-admin.php +++ b/admin/auth-admin.php @@ -61,7 +61,7 @@ if ($_SESSION['USER_RIGHT_SUPERADMIN'] != 1) include_once(dirname(__FILE__) . "/../functions/functions.xhtml.php"); xhtml_head(); print "

" . T_("You do not have permission to access this area") . "

"; - print "

" . T_("Logout") . "

"; + print "

" . T_("Logout") . "

"; xhtml_foot(); die(); } diff --git a/admin/clients.php b/admin/clients.php index 8cd39947..b9bfdd93 100644 --- a/admin/clients.php +++ b/admin/clients.php @@ -88,7 +88,7 @@ if (isset($_POST['client']) && !empty($_POST['client'])) if ($db->Execute($sql)) { - $sql = "UPDATE " . LIME_PREFIX . "users SET `users_name` = $client, `full_name` = $firstname, `email` = $email"; + $sql = "UPDATE users SET `users_name` = $client, `full_name` = $firstname, `email` = $email"; /* rewrite 'password' only if not blank in edit mode */ if (isset($_GET['edit']) && $_GET['edit'] >0 && isset($_POST['password']) && !empty($_POST['password'])) { @@ -114,8 +114,8 @@ if (isset($_POST['client']) && !empty($_POST['client'])) include_once("../include/sha256.php"); //Insert into lime_users - $sql = "INSERT INTO " . LIME_PREFIX . "users (`users_name`,`password`,`full_name`,`parent_id`,`superadmin`,`email`,`lang`) - VALUES ($client, '" . SHA256::hashing($_POST['password']) . "', $firstname ,1,0,$email,'auto')"; + $sql = "INSERT INTO users (`users_name`,`password`,`full_name`,`superadmin`,`email`) + VALUES ($client, '" . SHA256::hashing($_POST['password']) . "', $firstname ,0,$email)"; if ($db->Execute($sql)) $a = T_("Added") . ": " . $client; else $a = T_("Error adding client"); } @@ -139,7 +139,7 @@ if (isset($_GET['edit']) && $_GET['edit'] >0 ) { $clid = intval($_GET['edit']); - $sql = "SELECT client.*, u.email, u.uid from client, " . LIME_PREFIX . "users as u WHERE client_id=$clid and u.users_name=username"; + $sql = "SELECT client.*, u.email, u.uid from client, users as u WHERE client_id=$clid and u.users_name=username"; $cdata = $db->GetRow($sql); diff --git a/admin/index.php b/admin/index.php index c232f6be..eed00332 100644 --- a/admin/index.php +++ b/admin/index.php @@ -102,7 +102,7 @@ include ("../functions/functions.operator.php"); diff --git a/admin/operatorlist.php b/admin/operatorlist.php index 671d6fce..66b6cc77 100644 --- a/admin/operatorlist.php +++ b/admin/operatorlist.php @@ -68,7 +68,7 @@ if (isset($_POST['submit'])) $uname = $db->GetOne($sql); - $sql = "UPDATE " . LIME_PREFIX . "users + $sql = "UPDATE users SET users_name = " . $db->qstr($_POST['username']) . ", email = " . $db->qstr($_POST['email']) . ", full_name = " . $db->qstr($_POST['firstName']) . ", @@ -145,8 +145,8 @@ if (isset($_GET['edit'])) $operator_id = intval($_GET['edit']); - $sql = "SELECT o.*,l.superadmin,l.email,l.parent_id - FROM operator as o, " . LIME_PREFIX ."users as l + $sql = "SELECT o.*,l.superadmin,l.email + FROM operator as o, users as l WHERE o.operator_id = $operator_id AND l.users_name = o.username"; @@ -283,7 +283,7 @@ function generate() {
-
" data-off="" data-offstyle="primary" data-onstyle="danger" value="1"/>
+
" data-off="" data-offstyle="primary" data-onstyle="danger" value="1"/>
diff --git a/admin/operators.php b/admin/operators.php index 1549aed5..e684034e 100644 --- a/admin/operators.php +++ b/admin/operators.php @@ -118,8 +118,8 @@ if (isset($_POST['operator']) && isset($_POST['adduser'])) include_once("../include/sha256.php"); //Insert into lime_users - $sql = "INSERT INTO " . LIME_PREFIX . "users (`users_name`,`password`,`full_name`,`parent_id`,`superadmin`,`email`,`lang`) - VALUES ($operator, '" . SHA256::hashing($_POST['password']) . "',$firstname,1,$admin,$email,'auto')"; + $sql = "INSERT INTO users (`users_name`,`password`,`full_name`,`superadmin`,`email`) + VALUES ($operator, '" . SHA256::hashing($_POST['password']) . "',$firstname,$admin,$email)"; $db->Execute($sql); diff --git a/config.default.php b/config.default.php index 5fb103b0..4cb917ee 100644 --- a/config.default.php +++ b/config.default.php @@ -294,6 +294,15 @@ if (!defined('ADMIN_PANEL_NAME')) define ('ADMIN_PANEL_NAME',' Administration Pa */ if (!defined('LS_SESSION_NAME')) define ('LS_SESSION_NAME', 'ls28629164789259281352'); +/* CAS Authentication + * + */ +if (!defined('CAS_ENABLED')) define ('CAS_ENABLED', false); +if (!defined('CAS_AUTH_SERVER')) define ('CAS_AUTH_SERVER', 'www.acspri.org.au'); +if (!defined('CAS_AUTH_PORT')) define ('CAS_AUTH_PORT', 443); +if (!defined('CAS_AUTH_URI')) define ('CAS_AUTH_URI', 'cas'); + + /** * Debugging */ diff --git a/db.inc.php b/db.inc.php index 031b7909..a7d3fd73 100644 --- a/db.inc.php +++ b/db.inc.php @@ -128,4 +128,42 @@ function set_setting($name,$value) return $db->Execute($sql); } + +/** + * Get the IP address of the client + */ +function getIPAddress() +{ + if (!empty($_SERVER['REMOTE_ADDR'])) + { + return $_SERVER['REMOTE_ADDR']; + } + else + { + return '127.0.0.1'; + } +} + +/** +* Creates a random sequence of characters +* +* @param mixed $length Length of resulting string +* @param string $pattern To define which characters should be in the resulting string +* +* From Limesurvey +*/ +function sRandomChars($length = 15,$pattern="23456789abcdefghijkmnpqrstuvwxyz") +{ + $patternlength = strlen($pattern)-1; + for($i=0;$i<$length;$i++) + { + if(isset($key)) + $key .= $pattern{mt_rand(0,$patternlength)}; + else + $key = $pattern{mt_rand(0,$patternlength)}; + } + return $key; +} + + ?> diff --git a/endwork.php b/endwork.php index 432f130a..a8317bb8 100644 --- a/endwork.php +++ b/endwork.php @@ -79,7 +79,7 @@ if (ALLOW_OPERATOR_EXTENSION_SELECT && VOIP_ENABLED) } print "

" . T_("Go back to work") . "

"; -print "

" . T_("Logout") . "

"; +print "

" . T_("Logout") . "

"; xhtml_foot(); diff --git a/functions/functions.operator.php b/functions/functions.operator.php index 31a42c01..42bdc73c 100644 --- a/functions/functions.operator.php +++ b/functions/functions.operator.php @@ -43,27 +43,6 @@ include_once(dirname(__FILE__).'/../config.inc.php'); */ include_once(dirname(__FILE__).'/../db.inc.php'); -/** -* Creates a random sequence of characters -* -* @param mixed $length Length of resulting string -* @param string $pattern To define which characters should be in the resulting string -* -* From Limesurvey -*/ -function sRandomChars($length = 15,$pattern="23456789abcdefghijkmnpqrstuvwxyz") -{ - $patternlength = strlen($pattern)-1; - for($i=0;$i<$length;$i++) - { - if(isset($key)) - $key .= $pattern{mt_rand(0,$patternlength)}; - else - $key = $pattern{mt_rand(0,$patternlength)}; - } - return $key; -} - /** * Check if the project associated with this case is using * questionnaire availability diff --git a/include/limesurvey/.gitignore b/include/limesurvey/.gitignore deleted file mode 100644 index 8a57a94c..00000000 --- a/include/limesurvey/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ - -/upload/surveys/* diff --git a/include/limesurvey/COPYRIGHT.php b/include/limesurvey/COPYRIGHT.php deleted file mode 100644 index 69b8d886..00000000 --- a/include/limesurvey/COPYRIGHT.php +++ /dev/null @@ -1,65 +0,0 @@ - - -LimeSurvey derives from copyrighted works licensed under the GNU General -Public License. This version has been modified pursuant to the GNU -General Public License as of August 5, 2007, and as distributed, it -includes or is derivative of works licensed under the GNU General Public -License or other free or open source software licenses, including works -copyrighted by any or all of the following, from 2003 through 2010: -Jason Cleeland, Carsten Schmitz, Thibault Le Meur, Josef Prandstetter, -Tony Partner, David Olivier, Gustavo San Roman, S�bastien Gaugry, -Esteban Adri�n P�rez, Gasper Koren, Yeung Kai Sun, Shawn Wales, Ronald -Leenes, Mario Marani, Darrel O'Pry, Marco Ermini, Patrick McKnight, -Chris Wessells, Johannes Kutsam, Livio Finos, Karyl Stein, Arjen -Gideonse, Nikolay Tsanov, Thomas Lee, Liang Zhao, Katarina Pavic, Mikkel -Skovgaard S�rensen, Rolf Njor Jensen, Johan Geertsma, Ronald Leenes, -Peter De Berdt, Patrick Drews, Peter Sereinigg, Artemis Mendrinos, David -Selmeczi, Gabriele Carioli, Masaru Ryumae, Odd-Jarle Kristoffersen, -Eirik Sunde, Rosaura Gazzola, Job Vieira L�cio, Bogdan Anastasiei, -Alexei G. Tchernov, Alexander Shilov, Gasper Koren, Luis M. Martinez, -Juan Rafael Fern�ndez, Jose Luis Ramirez, Bj�rn Mildh, Niklas Andersson, -Vinh Ngo and Mitchell Butler. LimeSurvey also includes or is derivative -of works distributed under the following copyright notices: PHPSurveyor ----- Copyright: Jason Cleeland, 2003 License: GNU General Public License -(GPL V2 or later) ADOdb ---- Copyright: John Lim, 2004 License: GNU -Lesser General Public License (LGPL) PHP-gettext ---- Copyright: Danilo -Segan, 2003, 2006 License: GNU General Public License (GPL V2 or later) - -DHTML Calendar Widget ---- Copyright: Mihai Bazon, 2002-2005 License: -GNU Lesser General Public License (LGPL) Slider ---- Copyright: Erik -Arvidsson, 1999 - 2002 License: GNU General Public License SHA256 static -class ---- Copyright: Developer's Network (2005) Author: feyd _at_ -devnetwork .dot. net License: GNU Lesser General Public License (LGPL) - -tabPANE ---- Copyright: Emil A Eklund (2004) http://webfx.eae.net -License: Apache Software License 2.0 PEAR ---- Copyright: 1997-2004 The -PHP Group License: PHP license phpMailer ---- Copyright: 2001 - 2003 -Brent R. Matzelle License: GNU Lesser General Public License (LGPL) - -Sanitize Library ---- Copyright: 2002,2003 Free Software Foundation -License: GNU General Public License (GPL) TCPDF Class ---- Copyright: -2006 Nicola Asuni License: GNU Lesser General Public License (LGPL) - -mint_idea Template ---- Copyright: David Kohout -http://www.davidkohout.cz License: GNU General Public License (GPL) - -arPHP Class ---- Copyright: 2009 Khaled Al-Shamaa http://www.ar-php.org -License: GNU Lesser General Public License (LGPL) - diff --git a/include/limesurvey/LICENSE.php b/include/limesurvey/LICENSE.php deleted file mode 100644 index 9175b4a1..00000000 --- a/include/limesurvey/LICENSE.php +++ /dev/null @@ -1,266 +0,0 @@ -GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 -Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA Everyone is permitted to copy and distribute verbatim -copies of this license document, but changing it is not allowed. - -Preamble The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software Foundation's -software and to any other program whose authors commit to using it. -(Some other Free Software Foundation software is covered by the GNU -Library General Public License instead.) You can apply it to your -programs, too. When we speak of free software, we are referring to -freedom, not price. Our General Public Licenses are designed to make -sure that you have the freedom to distribute copies of free software -(and charge for this service if you wish), that you receive source code -or can get it if you want it, that you can change the software or use -pieces of it in new free programs; and that you know you can do these -things. To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. For example, if -you distribute copies of such a program, whether gratis or for a fee, -you must give the recipients all the rights that you have. You must make -sure that they, too, receive or can get the source code. And you must -show them these terms so they know their rights. We protect your rights -with two steps: (1) copyright the software, and (2) offer you this -license which gives you legal permission to copy, distribute and/or -modify the software. Also, for each author's protection and ours, we -want to make certain that everyone understands that there is no warranty -for this free software. If the software is modified by someone else and -passed on, we want its recipients to know that what they have is not the -original, so that any problems introduced by others will not reflect on -the original authors' reputations. Finally, any free program is -threatened constantly by software patents. We wish to avoid the danger -that redistributors of a free program will individually obtain patent -licenses, in effect making the program proprietary. To prevent this, we -have made it clear that any patent must be licensed for everyone's free -use or not licensed at all. The precise terms and conditions for -copying, distribution and modification follow. GNU GENERAL PUBLIC -LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License applies to any program or other work which contains a -notice placed by the copyright holder saying it may be distributed under -the terms of this General Public License. The "Program", below, refers -to any such program or work, and a "work based on the Program" means -either the Program or any derivative work under copyright law: that is -to say, a work containing the Program or a portion of it, either -verbatim or with modifications and/or translated into another language. -(Hereinafter, translation is included without limitation in the term -"modification".) Each licensee is addressed as "you". Activities other -than copying, distribution and modification are not covered by this -License; they are outside its scope. The act of running the Program is -not restricted, and the output from the Program is covered only if its -contents constitute a work based on the Program (independent of having -been made by running the Program). Whether that is true depends on what -the Program does. 1. You may copy and distribute verbatim copies of the -Program's source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the notices -that refer to this License and to the absence of any warranty; and give -any other recipients of the Program a copy of this License along with -the Program. You may charge a fee for the physical act of transferring a -copy, and you may at your option offer warranty protection in exchange -for a fee. 2. You may modify your copy or copies of the Program or any -portion of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: a) You must -cause the modified files to carry prominent notices stating that you -changed the files and the date of any change. b) You must cause any work -that you distribute or publish, that in whole or in part contains or is -derived from the Program or any part thereof, to be licensed as a whole -at no charge to all third parties under the terms of this License. c) If -the modified program normally reads commands interactively when run, you -must cause it, when started running for such interactive use in the most -ordinary way, to print or display an announcement including an -appropriate copyright notice and a notice that there is no warranty (or -else, saying that you provide a warranty) and that users may -redistribute the program under these conditions, and telling the user -how to view a copy of this License. (Exception: if the Program itself is -interactive but does not normally print such an announcement, your work -based on the Program is not required to print an announcement.) These -requirements apply to the modified work as a whole. If identifiable -sections of that work are not derived from the Program, and can be -reasonably considered independent and separate works in themselves, then -this License, and its terms, do not apply to those sections when you -distribute them as separate works. But when you distribute the same -sections as part of a whole which is a work based on the Program, the -distribution of the whole must be on the terms of this License, whose -permissions for other licensees extend to the entire whole, and thus to -each and every part regardless of who wrote it. Thus, it is not the -intent of this section to claim rights or contest your rights to work -written entirely by you; rather, the intent is to exercise the right to -control the distribution of derivative or collective works based on the -Program. In addition, mere aggregation of another work not based on the -Program with the Program (or with a work based on the Program) on a -volume of a storage or distribution medium does not bring the other work -under the scope of this License. 3. You may copy and distribute the -Program (or a work based on it, under Section 2) in object code or -executable form under the terms of Sections 1 and 2 above provided that -you also do one of the following: a) Accompany it with the complete -corresponding machine-readable source code, which must be distributed -under the terms of Sections 1 and 2 above on a medium customarily used -for software interchange; or, b) Accompany it with a written offer, -valid for at least three years, to give any third party, for a charge no -more than your cost of physically performing source distribution, a -complete machine-readable copy of the corresponding source code, to be -distributed under the terms of Sections 1 and 2 above on a medium -customarily used for software interchange; or, c) Accompany it with the -information you received as to the offer to distribute corresponding -source code. (This alternative is allowed only for noncommercial -distribution and only if you received the program in object code or -executable form with such an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source code -means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to control -compilation and installation of the executable. However, as a special -exception, the source code distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies the -executable. If distribution of executable or object code is made by -offering access to copy from a designated place, then offering -equivalent access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. 4. You may not -copy, modify, sublicense, or distribute the Program except as expressly -provided under this License. Any attempt otherwise to copy, modify, -sublicense or distribute the Program is void, and will automatically -terminate your rights under this License. However, parties who have -received copies, or rights, from you under this License will not have -their licenses terminated so long as such parties remain in full -compliance. 5. You are not required to accept this License, since you -have not signed it. However, nothing else grants you permission to -modify or distribute the Program or its derivative works. These actions -are prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and all -its terms and conditions for copying, distributing or modifying the -Program or works based on it. 6. Each time you redistribute the Program -(or any work based on the Program), the recipient automatically receives -a license from the original licensor to copy, distribute or modify the -Program subject to these terms and conditions. You may not impose any -further restrictions on the recipients' exercise of the rights granted -herein. You are not responsible for enforcing compliance by third -parties to this License. 7. If, as a consequence of a court judgment or -allegation of patent infringement or for any other reason (not limited -to patent issues), conditions are imposed on you (whether by court -order, agreement or otherwise) that contradict the conditions of this -License, they do not excuse you from the conditions of this License. If -you cannot distribute so as to satisfy simultaneously your obligations -under this License and any other pertinent obligations, then as a -consequence you may not distribute the Program at all. For example, if a -patent license would not permit royalty-free redistribution of the -Program by all those who receive copies directly or indirectly through -you, then the only way you could satisfy both it and this License would -be to refrain entirely from distribution of the Program. If any portion -of this section is held invalid or unenforceable under any particular -circumstance, the balance of the section is intended to apply and the -section as a whole is intended to apply in other circumstances. It is -not the purpose of this section to induce you to infringe any patents or -other property right claims or to contest validity of any such claims; -this section has the sole purpose of protecting the integrity of the -free software distribution system, which is implemented by public -license practices. Many people have made generous contributions to the -wide range of software distributed through that system in reliance on -consistent application of that system; it is up to the author/donor to -decide if he or she is willing to distribute software through any other -system and a licensee cannot impose that choice. This section is -intended to make thoroughly clear what is believed to be a consequence -of the rest of this License. 8. If the distribution and/or use of the -Program is restricted in certain countries either by patents or by -copyrighted interfaces, the original copyright holder who places the -Program under this License may add an explicit geographical distribution -limitation excluding those countries, so that distribution is permitted -only in or among countries not thus excluded. In such case, this License -incorporates the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. Each version is given a distinguishing -version number. If the Program specifies a version number of this -License which applies to it and "any later version", you have the option -of following the terms and conditions either of that version or of any -later version published by the Free Software Foundation. If the Program -does not specify a version number of this License, you may choose any -version ever published by the Free Software Foundation. 10. If you wish -to incorporate parts of the Program into other free programs whose -distribution conditions are different, write to the author to ask for -permission. For software which is copyrighted by the Free Software -Foundation, write to the Free Software Foundation; we sometimes make -exceptions for this. Our decision will be guided by the two goals of -preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE -ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH -YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL -NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS -REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT -HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE -PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS -OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply -These Terms to Your New Programs If you develop a new program, and you -want it to be of the greatest possible use to the public, the best way -to achieve this is to make it free software which everyone can -redistribute and change under these terms. To do so, attach the -following notices to the program. It is safest to attach them to the -start of each source file to most effectively convey the exclusion of -warranty; and each file should have at least the "copyright" line and a -pointer to where the full notice is found. - - -Copyright (C) - - - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. This program is distributed in the hope that -it will be useful, but WITHOUT ANY WARRANTY; without even the implied -warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. You should have received a -copy of the GNU General Public License along with this program; if not, -write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, -Boston, MA 02111-1307 USA Also add information on how to contact you by -electronic and paper mail. If the program is interactive, make it output -a short notice like this when it starts in an interactive mode: - -Gnomovision version 69, Copyright (C) year name of author Gnomovision -comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is -free software, and you are welcome to redistribute it under certain -conditions; type `show c' for details. The hypothetical commands `show -w' and `show c' should show the appropriate parts of the General Public -License. Of course, the commands you use may be called something other -than `show w' and `show c'; they could even be mouse-clicks or menu -items--whatever suits your program. You should also get your employer -(if you work as a programmer) or your school, if any, to sign a -"copyright disclaimer" for the program, if necessary. Here is a sample; -alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest -in the program `Gnomovision' (which makes passes at compilers) written -by James Hacker. - - -, 1 April 1989 Ty Coon, President of Vice This General Public License -does not permit incorporating your program into proprietary programs. If -your program is a subroutine library, you may consider it more useful to -permit linking proprietary applications with the library. If this is -what you want to do, use the GNU Library General Public License instead -of this License. diff --git a/include/limesurvey/admin/access_denied.php b/include/limesurvey/admin/access_denied.php deleted file mode 100644 index 2b064cfb..00000000 --- a/include/limesurvey/admin/access_denied.php +++ /dev/null @@ -1,148 +0,0 @@ -".$clang->gT("Access denied!")."
\n"; - - $action=returnglobal('action'); - if ( $action == "dumpdb" ) - { - $accesssummary .= "

".$clang->gT("You are not allowed dump the database!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "dumplabel") - { - $accesssummary .= "

".$clang->gT("You are not allowed export a label set!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "edituser") - { - $accesssummary .= "

".$clang->gT("You are not allowed to change user data!"); - $accesssummary .= "

".$clang->gT("Continue")."
 \n"; - } - elseif($action == "newsurvey") - { - $accesssummary .= "

".$clang->gT("You are not allowed to create new surveys!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "deletesurvey") - { - $accesssummary .= "

".$clang->gT("You are not allowed to delete this survey!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "addquestion") - { - $accesssummary .= "

".$clang->gT("You are not allowed to add new questions for this survey!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "activate") - { - $accesssummary .= "

".$clang->gT("You are not allowed to activate this survey!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "deactivate") - { - $accesssummary .= "

".$clang->gT("You are not allowed to deactivate this survey!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "addgroup") - { - $accesssummary .= "

".$clang->gT("You are not allowed to add a group to this survey!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "ordergroups") - { - $accesssummary .= "

".$clang->gT("You are not allowed to order groups in this survey!")."
"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "editsurvey") - { - $accesssummary .= "

".$clang->gT("You are not allowed to edit this survey!")."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "editgroup") - { - $accesssummary .= "

".$clang->gT("You are not allowed to edit groups in this survey!")."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "browse_response" || $action == "listcolumn" || $action == "vvexport" || $action == "vvimport") - { - $accesssummary .= "

".$clang->gT("You are not allowed to browse responses!")."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "assessment") - { - $accesssummary .= "

".$clang->gT("You are not allowed to set assessment rules!")."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "delusergroup") - { - $accesssummary .= "

".$clang->gT("You are not allowed to delete this group!")."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "importsurvey") - { - $accesssummary .= "

".$clang->gT("You are not allowed to import a survey!")."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - - elseif($action == "importgroup") - { - $accesssummary .= "

".$clang->gT("You are not allowed to import a group!")."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "importquestion") - { - $accesssummary .= "

".$clang->gT("You are not allowed to to import a question!")."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "CSRFwarn") - { - $sURLID=''; - if (isset($sid)) { - $sURLID="?sid={$sid}"; - } - $accesssummary .= "

".$clang->gT("Security alert").": ".$clang->gT("Someone may be trying to use your LimeSurvey session (CSRF attack suspected). If you just clicked on a malicious link, please report this to your system administrator.").'
'.$clang->gT('Also this problem can occur when you are working/editing in LimeSurvey in several browser windows/tabs at the same time.')."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - elseif($action == "FakeGET") - { - $accesssummary .= "

".$clang->gT("Security alert").": ".$clang->gT("Someone may be trying to use your LimeSurvey session (CSRF attack suspected). If you just clicked on a malicious link, please report this to your system administrator.").'
'.$clang->gT('Also this problem can occur when you are working/editing in LimeSurvey in several browser windows/tabs at the same time.')."

"; - $accesssummary .= "".$clang->gT("Continue")."
 \n"; - } - else - { - $accesssummary .= "
".$clang->gT("You are not allowed to perform this operation!")."
\n"; - if(!empty($sid)) - { - $accesssummary .= "

".$clang->gT("Continue")."
 \n"; - } - else - { - $accesssummary .= "

".$clang->gT("Continue")."
 \n"; - } - } - -} -?> diff --git a/include/limesurvey/admin/activate.php b/include/limesurvey/admin/activate.php deleted file mode 100644 index bdd48c15..00000000 --- a/include/limesurvey/admin/activate.php +++ /dev/null @@ -1,91 +0,0 @@ -\n
\n"; - $activateoutput .= "
".$clang->gT("Activate Survey")." ($surveyid)
\n"; - $activateoutput .= "
\n".$clang->gT("Error")."
\n"; - $activateoutput .= $clang->gT("Survey does not pass consistency check")."
\n"; - $activateoutput .= "

\n"; - $activateoutput .= "".$clang->gT("The following problems have been found:")."
\n"; - $activateoutput .= "

    \n"; - if (isset($failedcheck) && $failedcheck) - { - foreach ($failedcheck as $fc) - { - $activateoutput .= "
  • Question qid-{$fc[0]} (\"{$fc[1]}\"){$fc[2]}
  • \n"; - } - } - if (isset($failedgroupcheck) && $failedgroupcheck) - { - foreach ($failedgroupcheck as $fg) - { - $activateoutput .= "\t\t\t\t
  • Group gid-{$fg[0]} (\"{$fg[1]}\"){$fg[2]}
  • \n"; - } - } - $activateoutput .= "
\n"; - $activateoutput .= $clang->gT("The survey cannot be activated until these problems have been resolved.")."\n"; - $activateoutput .= "

 \n"; - - return; - } - - $activateoutput .= "
\n
\n"; - $activateoutput .= "
".$clang->gT("Activate Survey")." ($surveyid)
\n"; - $activateoutput .= "
\n"; - $activateoutput .= $clang->gT("Warning")."
\n"; - $activateoutput .= $clang->gT("READ THIS CAREFULLY BEFORE PROCEEDING")."\n"; - $activateoutput .= "\t
\n"; - $activateoutput .= $clang->gT("You should only activate a survey when you are absolutely certain that your survey setup is finished and will not need changing.")."

\n"; - $activateoutput .= $clang->gT("Once a survey is activated you can no longer:")."
  • ".$clang->gT("Add or delete groups")."
  • ".$clang->gT("Add or delete questions")."
  • ".$clang->gT("Add or delete subquestions or change their codes")."
\n"; - $activateoutput .= $clang->gT("However you can still:")."
  • ".$clang->gT("Edit your questions code/title/text and advanced options")."
  • ".$clang->gT("Edit your group names or descriptions")."
  • ".$clang->gT("Add, remove or edit answer options")."
  • ".$clang->gT("Change survey name or description")."
\n"; - $activateoutput .= $clang->gT("Once data has been entered into this survey, if you want to add or remove groups or questions, you will need to deactivate this survey, which will move all data that has already been entered into a separate archived table.")."

\n"; - $activateoutput .= "\tgT("Activate Survey")."\" onclick=\"".get2post("$scriptname?action=activate&ok=Y&sid={$_GET['sid']}")."\" />\n"; - $activateoutput .= "

 \n"; - -} -else -{ - $activateoutput = activateSurvey($postsid,$surveyid); - //also activate tokens queXS addition - if(bHasSurveyPermission($surveyid,'tokens','read')) - { - $_POST['createtable'] = 'Y'; - $_SESSION['FileManagerContext']="edit:emailsettings:$surveyid"; - include('tokens.php'); - } -} - diff --git a/include/limesurvey/admin/activate_functions.php b/include/limesurvey/admin/activate_functions.php deleted file mode 100644 index bc78b907..00000000 --- a/include/limesurvey/admin/activate_functions.php +++ /dev/null @@ -1,554 +0,0 @@ - $fixnumbering -*/ -function fixNumbering($fixnumbering) -{ - - global $dbprefix, $connect, $clang, $surveyid; - - LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); - //Fix a question id - requires renumbering a question - $oldqid = sanitize_int($fixnumbering); - $query = "SELECT qid FROM {$dbprefix}questions ORDER BY qid DESC"; - $result = db_select_limit_assoc($query, 1) or safe_die($query."
".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) {$lastqid=$row['qid'];} - $newqid=$lastqid+1; - $query = "UPDATE {$dbprefix}questions SET qid=$newqid WHERE qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); - // Update subquestions - $query = "UPDATE {$dbprefix}questions SET parent_qid=$newqid WHERE parent_qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); - //Update conditions.. firstly conditions FOR this question - $query = "UPDATE {$dbprefix}conditions SET qid=$newqid WHERE qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); - //Now conditions based upon this question - $query = "SELECT cqid, cfieldname FROM {$dbprefix}conditions WHERE cqid=$oldqid"; - $result = db_execute_assoc($query) or safe_die($query."
".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - $switcher[]=array("cqid"=>$row['cqid'], "cfieldname"=>$row['cfieldname']); - } - if (isset($switcher)) - { - foreach ($switcher as $switch) - { - $query = "UPDATE {$dbprefix}conditions - SET cqid=$newqid, - cfieldname='".str_replace("X".$oldqid, "X".$newqid, $switch['cfieldname'])."' - WHERE cqid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); - } - } - //Now question_attributes - $query = "UPDATE {$dbprefix}question_attributes SET qid=$newqid WHERE qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); - //Now answers - $query = "UPDATE {$dbprefix}answers SET qid=$newqid WHERE qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
".$connect->ErrorMsg()); - - LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); -} -/** -* checks consistency of groups -* @global $dbprefix -* @global $connect -* @global $clang -* @return -*/ -function checkGroup($postsid) -{ - global $dbprefix, $connect, $clang; - - $baselang = GetBaseLanguageFromSurveyID($postsid); - $groupquery = "SELECT g.gid,g.group_name,count(q.qid) as count from {$dbprefix}questions as q RIGHT JOIN {$dbprefix}groups as g ON q.gid=g.gid AND g.language=q.language WHERE g.sid=$postsid AND g.language='$baselang' group by g.gid,g.group_name;"; - $groupresult=db_execute_assoc($groupquery) or safe_die($groupquery."
".$connect->ErrorMsg()); - while ($row=$groupresult->FetchRow()) - { //TIBO - if ($row['count'] == 0) - { - $failedgroupcheck[]=array($row['gid'], $row['group_name'], ": ".$clang->gT("This group does not contain any question(s).")); - } - } - if(isset($failedgroupcheck)) - return $failedgroupcheck; - else - return false; - -} -/** -* checks questions in a survey for consistency -* @global $dbprefix -* @global $connect -* @global $clang -* @param $postsid -* @param $surveyid -* @return array $faildcheck -*/ -function checkQuestions($postsid, $surveyid, $qtypes) -{ - global $dbprefix, $connect, $clang; - - - //CHECK TO MAKE SURE ALL QUESTION TYPES THAT REQUIRE ANSWERS HAVE ACTUALLY GOT ANSWERS - //THESE QUESTION TYPES ARE: - // # "L" -> LIST - // # "O" -> LIST WITH COMMENT - // # "M" -> Multiple choice - // # "P" -> Multiple choice with comments - // # "A", "B", "C", "E", "F", "H", "^" -> Various Array Types - // # "R" -> RANKING - // # "U" -> FILE CSV MORE - // # "I" -> LANGUAGE SWITCH - // # ":" -> Array Multi Flexi Numbers - // # ";" -> Array Multi Flexi Text - // # "1" -> MULTI SCALE - - $chkquery = "SELECT qid, question, gid, type FROM {$dbprefix}questions WHERE sid={$surveyid} and parent_qid=0"; - $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't get list of questions
$chkquery
".$connect->ErrorMsg()); - while ($chkrow = $chkresult->FetchRow()) - { - if ($qtypes[$chkrow['type']]['subquestions']>0) - { - $chaquery = "SELECT * FROM {$dbprefix}questions WHERE parent_qid = {$chkrow['qid']} ORDER BY question_order"; - $charesult=$connect->Execute($chaquery); - $chacount=$charesult->RecordCount(); - if ($chacount == 0) - { - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question is a subquestion type question but has no configured subquestions."), $chkrow['gid']); - } - } - if ($qtypes[$chkrow['type']]['answerscales']>0) - { - $chaquery = "SELECT * FROM {$dbprefix}answers WHERE qid = {$chkrow['qid']} ORDER BY sortorder, answer"; - $charesult=$connect->Execute($chaquery); - $chacount=$charesult->RecordCount(); - if ($chacount == 0) - { - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question is a multiple answer type question but has no answers."), $chkrow['gid']); - } - } - } - - //NOW CHECK THAT ALL QUESTIONS HAVE A 'QUESTION TYPE' FIELD SET - $chkquery = "SELECT qid, question, gid FROM {$dbprefix}questions WHERE sid={$surveyid} AND type = ''"; - $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing types
$chkquery
".$connect->ErrorMsg()); - while ($chkrow = $chkresult->FetchRow()) - { - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question does not have a question 'type' set."), $chkrow['gid']); - } - - - - - //ChECK THAT certain array question types have answers set - $chkquery = "SELECT q.qid, question, gid FROM {$dbprefix}questions as q WHERE (select count(*) from {$dbprefix}answers as a where a.qid=q.qid and scale_id=0)=0 and sid={$surveyid} AND type IN ('F', 'H', 'W', 'Z', '1') and q.parent_qid=0"; - $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing answers
$chkquery
".$connect->ErrorMsg()); - while($chkrow = $chkresult->FetchRow()){ - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question requires answers, but none are set."), $chkrow['gid']); - } // while - - //CHECK THAT DUAL Array has answers set - $chkquery = "SELECT q.qid, question, gid FROM {$dbprefix}questions as q WHERE (select count(*) from {$dbprefix}answers as a where a.qid=q.qid and scale_id=1)=0 and sid={$surveyid} AND type='1' and q.parent_qid=0"; - $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing 2nd answer set
$chkquery
".$connect->ErrorMsg()); - while($chkrow = $chkresult->FetchRow()){ - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question requires a second answer set but none is set."), $chkrow['gid']); - } // while - - - //CHECK THAT ALL CONDITIONS SET ARE FOR QUESTIONS THAT PRECEED THE QUESTION CONDITION - //A: Make an array of all the qids in order of appearance - // $qorderquery="SELECT * FROM {$dbprefix}questions, {$dbprefix}groups WHERE {$dbprefix}questions.gid={$dbprefix}groups.gid AND {$dbprefix}questions.sid={$surveyid} ORDER BY {$dbprefix}groups.sortorder, {$dbprefix}questions.title"; - // $qorderresult=$connect->Execute($qorderquery) or safe_die("Couldn't generate a list of questions in order
$qorderquery
".$connect->ErrorMsg()); - // $qordercount=$qorderresult->RecordCount(); - // $c=0; - // while ($qorderrow=$qorderresult->FetchRow()) - // { - // $qidorder[]=array($c, $qorderrow['qid']); - // $c++; - // } - //TO AVOID NATURAL SORT ORDER ISSUES, FIRST GET ALL QUESTIONS IN NATURAL SORT ORDER, AND FIND OUT WHICH NUMBER IN THAT ORDER THIS QUESTION IS - $qorderquery = "SELECT * FROM {$dbprefix}questions WHERE sid=$surveyid AND type not in ('S', 'D', 'T', 'Q')"; - $qorderresult = db_execute_assoc($qorderquery) or safe_die ("$qorderquery
".$connect->ErrorMsg()); - $qrows = array(); //Create an empty array in case FetchRow does not return any rows - while ($qrow = $qorderresult->FetchRow()) {$qrows[] = $qrow;} // Get table output into array - usort($qrows, 'GroupOrderThenQuestionOrder'); // Perform a case insensitive natural sort on group name then question title of a multidimensional array - $c=0; - foreach ($qrows as $qr) - { - $qidorder[]=array($c, $qrow['qid']); - $c++; - } - $qordercount=""; - //1: Get each condition's question id - $conquery= "SELECT {$dbprefix}conditions.qid, cqid, {$dbprefix}questions.question, " - . "{$dbprefix}questions.gid " - . "FROM {$dbprefix}conditions, {$dbprefix}questions, {$dbprefix}groups " - . "WHERE {$dbprefix}conditions.qid={$dbprefix}questions.qid " - . "AND {$dbprefix}questions.gid={$dbprefix}groups.gid ORDER BY {$dbprefix}conditions.qid"; - $conresult=db_execute_assoc($conquery) or safe_die("Couldn't check conditions for relative consistency
$conquery
".$connect->ErrorMsg()); - //2: Check each conditions cqid that it occurs later than the cqid - while ($conrow=$conresult->FetchRow()) - { - $cqidfound=0; - $qidfound=0; - $b=0; - while ($b<$qordercount) - { - if ($conrow['cqid'] == $qidorder[$b][1]) - { - $cqidfound = 1; - $b=$qordercount; - } - if ($conrow['qid'] == $qidorder[$b][1]) - { - $qidfound = 1; - $b=$qordercount; - } - if ($qidfound == 1) - { - $failedcheck[]=array($conrow['qid'], $conrow['question'], ": ".$clang->gT("This question has a condition set, however the condition is based on a question that appears after it."), $conrow['gid']); - } - $b++; - } - } - //CHECK THAT ALL THE CREATED FIELDS WILL BE UNIQUE - $fieldmap=createFieldMap($surveyid, 'full', true,false, GetBaseLanguageFromSurveyID($surveyid));// createFieldMap($surveyid, $styl, $force_refresh,$questionid, $sQuestionLanguage); - $clang = new limesurvey_lang($_SESSION['adminlang']); - if (isset($fieldmap)) - { - foreach($fieldmap as $fielddata) - { - $fieldlist[]=$fielddata['fieldname']; - } - $fieldlist=array_reverse($fieldlist); //let's always change the later duplicate, not the earlier one - } - $checkKeysUniqueComparison = create_function('$value','if ($value > 1) return true;'); - @$duplicates = array_keys (array_filter (array_count_values($fieldlist), $checkKeysUniqueComparison)); - if (isset($duplicates)) - { - foreach ($duplicates as $dup) - { - $badquestion=arraySearchByKey($dup, $fieldmap, "fieldname", 1); - $fix = "[Click Here to Fix]"; - $failedcheck[]=array($badquestion['qid'], $badquestion['question'], ": Bad duplicate fieldname $fix", $badquestion['gid']); - } - } - if(isset($failedcheck)) - return $failedcheck; - else - return false; -} -/** -* Function to activate a survey -* @global $dbprefix $dbprefix -* @global $connect $connect -* @global $clang $clang -* @param int $postsid -* @param int $surveyid -* @return string -*/ -function activateSurvey($postsid,$surveyid, $scriptname='admin.php') -{ - global $dbprefix, $connect, $clang, $databasetype,$databasetabletype, $uploaddir; - - $createsurvey=''; - $activateoutput=''; - $createsurveytimings=''; - $createsurveydirectory=false; - //Check for any additional fields for this survey and create necessary fields (token and datestamp) - $pquery = "SELECT anonymized, allowregister, datestamp, ipaddr, refurl, savetimings FROM {$dbprefix}surveys WHERE sid={$postsid}"; - $presult=db_execute_assoc($pquery); - $prow=$presult->FetchRow(); - if ($prow['allowregister'] == "Y") - { - $surveyallowsregistration="TRUE"; - } - if ($prow['savetimings'] == "Y") - { - $savetimings="TRUE"; - } - - //Get list of questions for the base language - $fieldmap=createFieldMap($surveyid, 'full', true,false, GetBaseLanguageFromSurveyID($surveyid));// createFieldMap($surveyid, $styl, $force_refresh,$questionid, $sQuestionLanguage); - foreach ($fieldmap as $arow) //With each question, create the appropriate field(s) - { - if ($createsurvey!='') {$createsurvey .= ",\n";} - $createsurvey .= ' `'.$arow['fieldname'].'`'; - switch($arow['type']) - { - case 'startlanguage': - $createsurvey .= " C(20) NOTNULL"; - break; - case 'id': - $createsurvey .= " I NOTNULL AUTO PRIMARY"; - $createsurveytimings .= " `{$arow['fieldname']}` I NOTNULL PRIMARY,\n"; - break; - case "startdate": - case "datestamp": - $createsurvey .= " T NOTNULL"; - break; - case "submitdate": - $createsurvey .= " T"; - break; - case "lastpage": - $createsurvey .= " I"; - break; - case "N": //NUMERICAL - $createsurvey .= " F"; - break; - case "S": //SHORT TEXT - if ($databasetype=='mysql' || $databasetype=='mysqli') {$createsurvey .= " X";} - else {$createsurvey .= " C(255)";} - break; - case "L": //LIST (RADIO) - case "!": //LIST (DROPDOWN) - case "M": //Multiple choice - case "P": //Multiple choice with comment - case "O": //DROPDOWN LIST WITH COMMENT - if ($arow['aid'] != 'other' && strpos($arow['aid'],'comment')===false && strpos($arow['aid'],'othercomment')===false) - { - $createsurvey .= " C(5)"; - } - else - { - $createsurvey .= " X"; - } - break; - case "K": // Multiple Numerical - $createsurvey .= " F"; - break; - case "U": //Huge text - case "Q": //Multiple short text - case "T": //LONG TEXT - case ";": //Multi Flexi - case ":": //Multi Flexi - $createsurvey .= " X"; - break; - case "D": //DATE - if ($databasetype=='odbc_mssql' || $databasetype=='odbtp' || $databasetype=='mssql_n' || $databasetype=='mssqlnative') { - $createsurvey .= " T"; - } - else - $createsurvey .= " D"; - break; - case "5": //5 Point Choice - case "G": //Gender - case "Y": //YesNo - case "X": //Boilerplate - $createsurvey .= " C(1)"; - break; - case "I": //Language switch - $createsurvey .= " C(20)"; - break; - case "|": - $createsurveydirectory = true; - if (strpos($arow['fieldname'], "_")) - $createsurvey .= " I1"; - else - $createsurvey .= " X"; - break; - case "ipaddress": - if ($prow['ipaddr'] == "Y") - $createsurvey .= " X"; - break; - case "url": - if ($prow['refurl'] == "Y") - $createsurvey .= " X"; - break; - case "token": - if ($prow['anonymized'] == "N") - { - $createsurvey .= " C(36)"; - } - break; - case '*': // Equation - $createsurvey .= " X"; // could be anything, from numeric to a long message, so default to text - break; - default: - $createsurvey .= " C(5)"; - } - } - $timingsfieldmap = createTimingsFieldMap($surveyid); - $createsurveytimings .= '`'.implode("` F DEFAULT '0',\n`",array_keys($timingsfieldmap)) . "` F DEFAULT '0'"; - - // If last question is of type MCABCEFHP^QKJR let's get rid of the ending coma in createsurvey - $createsurvey = rtrim($createsurvey, ",\n")."\n"; // Does nothing if not ending with a comma - - $tabname = "{$dbprefix}survey_{$postsid}"; # not using db_table_name as it quotes the table name (as does CreateTableSQL) - - $taboptarray = array('mysql' => 'ENGINE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci', - 'mysqli'=> 'ENGINE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci'); - $dict = NewDataDictionary($connect); - $sqlarray = $dict->CreateTableSQL($tabname, $createsurvey, $taboptarray); - - if (isset($savetimings) && $savetimings=="TRUE") - { - $tabnametimings = $tabname .'_timings'; - $sqlarraytimings = $dict->CreateTableSQL($tabnametimings, $createsurveytimings, $taboptarray); - } - - $execresult=$dict->ExecuteSQLArray($sqlarray,1); - - //queXS Addition - add an index on the token - $createtokenindex = $dict->CreateIndexSQL("{$tabname}_idx", $tabname, array('token')); - $dict->ExecuteSQLArray($createtokenindex, false) or safe_die ("Failed to create token index
$createtokenindex

".$connect->ErrorMsg()); - - if ($execresult==0 || $execresult==1) - { - $activateoutput .= "
\n
\n" . - "
".$clang->gT("Activate Survey")." ($surveyid)
\n" . - "
".$clang->gT("Survey could not be actived.")."
\n" . - "

" . - $clang->gT("Database error:")."\n " . $connect->ErrorMsg() . "\n" . - "

$createsurvey
\n - ".$clang->gT("Main Admin Screen")."\n
" ; - } - if ($execresult != 0 && $execresult !=1) - { - $anquery = "SELECT autonumber_start FROM {$dbprefix}surveys WHERE sid={$postsid}"; - if ($anresult=db_execute_assoc($anquery)) - { - //if there is an autonumber_start field, start auto numbering here - while($row=$anresult->FetchRow()) - { - if ($row['autonumber_start'] > 0) - { - if ($databasetype=='odbc_mssql' || $databasetype=='odbtp' || $databasetype=='mssql_n' || $databasetype=='mssqlnative') { - mssql_drop_primary_index('survey_'.$postsid); - mssql_drop_constraint('id','survey_'.$postsid); - $autonumberquery = "alter table {$dbprefix}survey_{$postsid} drop column id "; - $connect->Execute($autonumberquery); - $autonumberquery = "alter table {$dbprefix}survey_{$postsid} add [id] int identity({$row['autonumber_start']},1)"; - $connect->Execute($autonumberquery); - } - else - { - $autonumberquery = "ALTER TABLE {$dbprefix}survey_{$postsid} AUTO_INCREMENT = ".$row['autonumber_start']; - $result = @$connect->Execute($autonumberquery); - - } - } - } - if (isset($savetimings) && $savetimings=="TRUE") - { - $dict->ExecuteSQLArray($sqlarraytimings,1); // create a timings table for this survey - } - } - - $activateoutput .= "
\n
\n"; - $activateoutput .= "
".$clang->gT("Activate Survey")." ($surveyid)
\n"; - $activateoutput .= "
".$clang->gT("Survey has been activated. Results table has been successfully created.")."


\n"; - - // create the survey directory where the uploaded files can be saved - if ($createsurveydirectory) - if (!file_exists($uploaddir."/surveys/" . $postsid . "/files")) - { - if (!(mkdir($uploaddir."/surveys/" . $postsid . "/files", 0777, true))) - { - $activateoutput .= "
". - $clang->gT("The required directory for saving the uploaded files couldn't be created. Please check file premissions on the limesurvey/upload/surveys directory.") . "
"; - - } - else - { - file_put_contents($uploaddir."/surveys/" . $postsid . "/files/index.html",''); - } - } - - $acquery = "UPDATE {$dbprefix}surveys SET active='Y' WHERE sid=".$surveyid; - $acresult = $connect->Execute($acquery); - - $query=db_select_tables_like("{$dbprefix}old\_tokens\_".$surveyid."\_%"); - $result=db_execute_num($query) or safe_die("Couldn't get old table list
".$query."
".$connect->ErrorMsg()); - $tcount=$result->RecordCount(); - if ($tcount==0) - { - $sTokenActivationLink="$scriptname?action=tokens&sid={$postsid}&createtable=Y"; - } - else - { - $sTokenActivationLink="$scriptname?action=tokens&sid={$postsid}"; - } - - if (isset($surveyallowsregistration) && $surveyallowsregistration == "TRUE") - { - $activateoutput .= $clang->gT("This survey allows public registration. A token table must also be created.")."

\n"; - $activateoutput .= "\n"; - } - else - { - $activateoutput .= $clang->gT("This survey is now active, and responses can be recorded.")."

\n"; -//queXS Removal -// $activateoutput .= "".$clang->gT("Open-access mode").": ".$clang->gT("No invitation code is needed to complete the survey.")."
".$clang->gT("You can switch to the closed-access mode by initialising a token table with the button below.")."

\n"; - // $activateoutput .= "\n"; - // $activateoutput .= "\n"; - } - $activateoutput .= "

 \n"; - $lsrcOutput = true; - } - - if($scriptname=='lsrc') - { - if($lsrcOutput==true) - return true; - else - return $activateoutput; - } - else - { - return $activateoutput; - } -} - -function mssql_drop_constraint($fieldname, $tablename) -{ - global $dbprefix, $connect, $modifyoutput; - // find out the name of the default constraint - // Did I already mention that this is the most suckiest thing I have ever seen in MSSQL database? - $dfquery ="SELECT c_obj.name AS constraint_name - FROM sys.sysobjects AS c_obj INNER JOIN - sys.sysobjects AS t_obj ON c_obj.parent_obj = t_obj.id INNER JOIN - sys.sysconstraints AS con ON c_obj.id = con.constid INNER JOIN - sys.syscolumns AS col ON t_obj.id = col.id AND con.colid = col.colid - WHERE (c_obj.xtype = 'D') AND (col.name = '$fieldname') AND (t_obj.name='{$dbprefix}{$tablename}')"; - $defaultname=$connect->GetRow($dfquery); - if ($defaultname!=false) - { - modify_database("","ALTER TABLE [prefix_$tablename] DROP CONSTRAINT {$defaultname[0]}"); echo $modifyoutput; flush(); - } -} - - -function mssql_drop_primary_index($tablename) -{ - global $dbprefix, $connect, $modifyoutput; - // find out the constraint name of the old primary key - $pkquery = "SELECT CONSTRAINT_NAME " - ."FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS " - ."WHERE (TABLE_NAME = '{$dbprefix}{$tablename}') AND (CONSTRAINT_TYPE = 'PRIMARY KEY')"; - - $primarykey=$connect->GetOne($pkquery); - if ($primarykey!=false) - { - modify_database("","ALTER TABLE [prefix_{$tablename}] DROP CONSTRAINT {$primarykey}"); echo $modifyoutput; flush(); - } -} diff --git a/include/limesurvey/admin/admin_functions.php b/include/limesurvey/admin/admin_functions.php deleted file mode 100644 index 31339dc9..00000000 --- a/include/limesurvey/admin/admin_functions.php +++ /dev/null @@ -1,408 +0,0 @@ -Execute('SET IDENTITY_INSERT '.db_table_name($table).' ON'); - } - else - { - $connect->Execute('SET IDENTITY_INSERT '.db_table_name($table).' OFF'); - } - } -} - -/** - * Returns true if a user has permissions in the particular survey - * - * @param $iSID The survey ID - * @param $sPermission - * @param $sCRUD - * @param $iUID User ID - if not given the one of the current user is used - * @return bool - */ -function bHasSurveyPermission($iSID, $sPermission, $sCRUD, $iUID=null) -{ - global $dbprefix, $connect; - if (!in_array($sCRUD,array('create','read','update','delete','import','export'))) return false; - $sCRUD=$sCRUD.'_p'; - $iSID = (int)$iSID; - global $aSurveyPermissionCache; - - if (is_null($iUID)) - { - if (isset($_SESSION['loginID'])) $iUID = $_SESSION['loginID']; - else return false; - if ($_SESSION['USER_RIGHT_SUPERADMIN']==1) return true; //Superadmin has access to all - } - - if (!isset($aSurveyPermissionCache[$iSID][$iUID][$sPermission][$sCRUD])) - { - $sSQL = "SELECT {$sCRUD} FROM " . db_table_name('survey_permissions') . " - WHERE sid={$iSID} AND uid = {$iUID} - and permission=".db_quoteall($sPermission); //Getting rights for this survey - $bPermission = $connect->GetOne($sSQL); - if ($bPermission==0 || is_null($bPermission)) $bPermission=false; - if ($bPermission==1) $bPermission=true; - $aSurveyPermissionCache[$iSID][$iUID][$sPermission][$sCRUD]=$bPermission; - } - return $aSurveyPermissionCache[$iSID][$iUID][$sPermission][$sCRUD]; -} - -/** - * Returns true if the given survey has a File Upload Question Type - * @param $surveyid The survey ID - * @return bool - */ -function bHasFileUploadQuestion($surveyid) { - $fieldmap = createFieldMap($surveyid); - - foreach ($fieldmap as $field) { - if (isset($field['type']) && $field['type'] === '|') return true; - } -} - -/** - * Returns true if a user has global permission for a certain action. Available permissions are - * - * USER_RIGHT_CREATE_SURVEY - * USER_RIGHT_CONFIGURATOR - * USER_RIGHT_CREATE_USER - * USER_RIGHT_DELETE_USER - * USER_RIGHT_SUPERADMIN - * USER_RIGHT_MANAGE_TEMPLATE - * USER_RIGHT_MANAGE_LABEL - * - * @param $sPermission - * @return bool - */ -function bHasGlobalPermission($sPermission) -{ - global $dbprefix, $connect; - global $aSurveyGlobalPermissionCache; - - if (isset($_SESSION['loginID'])) $iUID = $_SESSION['loginID']; - else return false; - if ($_SESSION['USER_RIGHT_SUPERADMIN']==1) return true; //Superadmin has access to all - if ($_SESSION[$sPermission]==1) - { - return true; - } - else - { - return false; - } - -} - -/** -* Set the survey permissions for a user. Beware that all survey permissions for the particual survey are removed before the new ones are written. -* -* @param int $iUserID The User ID -* @param int $iSurveyID The Survey ID -* @param array $aPermissions Array with permissions in format =>array('create'=>0/1,'read'=>0/1,'update'=>0/1,'delete'=>0/1) -*/ -function SetSurveyPermissions($iUserID, $iSurveyID, $aPermissions) -{ - global $connect, $surveyid; - $iUserID=sanitize_int($iUserID); - $sQuery = "delete from ".db_table_name('survey_permissions')." WHERE sid = {$iSurveyID} AND uid = {$iUserID}"; - $connect->Execute($sQuery); - $bResult=true; - - foreach($aPermissions as $sPermissionname=>$aPermissions) - { - if (!isset($aPermissions['create'])) {$aPermissions['create']=0;} - if (!isset($aPermissions['read'])) {$aPermissions['read']=0;} - if (!isset($aPermissions['update'])) {$aPermissions['update']=0;} - if (!isset($aPermissions['delete'])) {$aPermissions['delete']=0;} - if (!isset($aPermissions['import'])) {$aPermissions['import']=0;} - if (!isset($aPermissions['export'])) {$aPermissions['export']=0;} - if ($aPermissions['create']==1 || $aPermissions['read']==1 ||$aPermissions['update']==1 || $aPermissions['delete']==1 || $aPermissions['import']==1 || $aPermissions['export']==1) - { - $sQuery = "INSERT INTO ".db_table_name('survey_permissions')." (sid, uid, permission, create_p, read_p, update_p, delete_p, import_p, export_p) - VALUES ({$iSurveyID},{$iUserID},'{$sPermissionname}',{$aPermissions['create']},{$aPermissions['read']},{$aPermissions['update']},{$aPermissions['delete']},{$aPermissions['import']},{$aPermissions['export']})"; - $bResult=$connect->Execute($sQuery); - } - } - return $bResult; -} - -/** -* Gives all available survey permissions for a certain survey to a user -* -* @param mixed $iUserID The User ID -* @param mixed $iSurveyID The Survey ID -*/ -function GiveAllSurveyPermissions($iUserID, $iSurveyID) -{ - $aPermissions=aGetBaseSurveyPermissions(); - $aPermissionsToSet=array(); - foreach ($aPermissions as $sPermissionName=>$aPermissionDetails) - { - foreach ($aPermissionDetails as $sPermissionDetailKey=>$sPermissionDetailValue) - { - if (in_array($sPermissionDetailKey,array('create','read','update','delete','import','export')) && $sPermissionDetailValue==true) - { - $aPermissionsToSet[$sPermissionName][$sPermissionDetailKey]=1; - } - - } - } - SetSurveyPermissions($iUserID, $iSurveyID, $aPermissionsToSet); -} - -function gettemplatelist() -{ - global $usertemplaterootdir, $standardtemplates,$standardtemplaterootdir; - - if (!$usertemplaterootdir) {die("gettemplatelist() no template directory");} - if ($handle = opendir($standardtemplaterootdir)) - { - while (false !== ($file = readdir($handle))) - { - if (!is_file("$standardtemplaterootdir/$file") && $file != "." && $file != ".." && $file!=".svn" && isStandardTemplate($file)) - { - $list_of_files[$file] = $standardtemplaterootdir.DIRECTORY_SEPARATOR.$file; - } - } - closedir($handle); - } - - if ($handle = opendir($usertemplaterootdir)) - { - while (false !== ($file = readdir($handle))) - { - if (!is_file("$usertemplaterootdir/$file") && $file != "." && $file != ".." && $file!=".svn") - { - $list_of_files[$file] = $usertemplaterootdir.DIRECTORY_SEPARATOR.$file; - } - } - closedir($handle); - } - ksort($list_of_files); - return $list_of_files; -} - - -/** -* This function set a question attribute to a certain value -* -* @param mixed $qid -* @param mixed $sAttributeName -* @param mixed $sAttributeValue -*/ -function setQuestionAttribute($qid,$sAttributeName,$sAttributeValue) -{ - global $dbprefix,$connect; - $tablename=$dbprefix.'question_attributes'; - $aInsertArray=array('qid'=>$qid, - 'attribute'=>$sAttributeName, - 'value'=>$sAttributeValue); - $sQuery=$connect->GetInsertSQL($tablename,$aInsertArray); - $connect->Execute('delete from '.db_table_name('question_attributes')." where qid={$qid} and attribute=".db_quoteall($sAttributeName)); - $connect->Execute($sQuery); -} - -/** -* Returns the default email template texts as array -* -* @param mixed $oLanguage Required language translationb object -* @param string $mode Escape mode for the translation function -* @return array -*/ -function aTemplateDefaultTexts($oLanguage, $mode='html'){ - return array( - 'admin_detailed_notification_subject'=>$oLanguage->gT("Response submission for survey {SURVEYNAME} with results",$mode), - 'admin_detailed_notification'=>$oLanguage->gT("Hello,\n\nA new response was submitted for your survey '{SURVEYNAME}'.\n\nClick the following link to reload the survey:\n{RELOADURL}\n\nClick the following link to see the individual response:\n{VIEWRESPONSEURL}\n\nClick the following link to edit the individual response:\n{EDITRESPONSEURL}\n\nView statistics by clicking here:\n{STATISTICSURL}\n\n\nThe following answers were given by the participant:\n{ANSWERTABLE}",$mode), - 'admin_detailed_notification_css'=>'', - 'admin_notification_subject'=>$oLanguage->gT("Response submission for survey {SURVEYNAME}",$mode), - 'admin_notification'=>$oLanguage->gT("Hello,\n\nA new response was submitted for your survey '{SURVEYNAME}'.\n\nClick the following link to reload the survey:\n{RELOADURL}\n\nClick the following link to see the individual response:\n{VIEWRESPONSEURL}\n\nClick the following link to edit the individual response:\n{EDITRESPONSEURL}\n\nView statistics by clicking here:\n{STATISTICSURL}",$mode), - 'confirmation_subject'=>$oLanguage->gT("Confirmation of completion of questionnaire"), - 'confirmation'=>$oLanguage->gT("Dear {FIRSTNAME},\n\nThis email is to confirm that you have completed the online questionnaire and your response has been saved.\n\nThank you for participating.",$mode), - 'invitation_subject'=>$oLanguage->gT("Invitation to complete questionnaire online",$mode), - 'invitation'=>$oLanguage->gT("Dear {FIRSTNAME},\n\nThank you for requesting to complete this questionnaire online.\n\n----------------------------------------------\nClick here to complete the questionnaire:\n{SURVEYURL}",$mode)."\n\n".$oLanguage->gT("If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:\n{OPTOUTURL}",$mode), - 'reminder_subject'=>$oLanguage->gT("Reminder to participate in a survey",$mode), - 'reminder'=>$oLanguage->gT("Dear {FIRSTNAME},\n\nRecently we invited you to participate in a survey.\n\nWe note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.\n\nThe survey is titled:\n\"{SURVEYNAME}\"\n\n\"{SURVEYDESCRIPTION}\"\n\nTo participate, please click on the link below.\n\nSincerely,\n\n{ADMINNAME} ({ADMINEMAIL})\n\n----------------------------------------------\nClick here to do the survey:\n{SURVEYURL}",$mode)."\n\n".$oLanguage->gT("If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:\n{OPTOUTURL}",$mode), - 'registration_subject'=>$oLanguage->gT("Survey registration confirmation",$mode), - 'registration'=>$oLanguage->gT("Dear {FIRSTNAME},\n\nYou, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.\n\nTo complete this survey, click on the following URL:\n\n{SURVEYURL}\n\nIf you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.",$mode) - ); -} - -// Closing PHP tag intentionally left out - yes, it is okay - -function doAdminHeader() -{ - echo getAdminHeader(); -} - -function getAdminHeader($meta=false) -{ - global $sitename, $admintheme, $rooturl, $defaultlang, $css_admin_includes, $homeurl; - if (!isset($_SESSION['adminlang']) || $_SESSION['adminlang']=='') {$_SESSION['adminlang']=$defaultlang;} - $strAdminHeader="\n" - ."\n"; - $strAdminHeader.= "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n"; - - if ($_SESSION['adminlang']!='en') - { - $strAdminHeader.= "\n"; - } - - $strAdminHeader.= "$sitename\n"; - - $strAdminHeader.= "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n"; - - if (getLanguageRTL($_SESSION['adminlang'])) - { - $strAdminHeader.="\n"; - } - - $css_admin_includes = array_unique($css_admin_includes); - - foreach ($css_admin_includes as $cssinclude) - { - $strAdminHeader .= "\n"; - } - $strAdminHeader.= use_firebug() - . "\n\n"; - if (isset($_SESSION['dateformat'])) - { - $formatdata=getDateFormatData($_SESSION['dateformat']); - $strAdminHeader .= ""; - } - // Prepare flashmessage - if (isset($_SESSION['flashmessage']) && $_SESSION['flashmessage']!='') - { - $strAdminHeader .=''; - unset($_SESSION['flashmessage']); - } - - // Standard header - $strAdminHeader .="
{$sitename}
\n"; - return $strAdminHeader; -} diff --git a/include/limesurvey/admin/assessments.php b/include/limesurvey/admin/assessments.php deleted file mode 100644 index 70bb06ea..00000000 --- a/include/limesurvey/admin/assessments.php +++ /dev/null @@ -1,324 +0,0 @@ -\n"; - -$assessmentlangs = GetAdditionalLanguagesFromSurveyID($surveyid); -$baselang = GetBaseLanguageFromSurveyID($surveyid); -array_unshift($assessmentlangs,$baselang); // makes an array with ALL the languages supported by the survey -> $assessmentlangs - -if (!bHasSurveyPermission($surveyid, 'assessments','read')) -{ - $action = "assessment"; - include("access_denied.php"); - include("admin.php"); - exit; -} - - -if ($action == "assessmentadd" && bHasSurveyPermission($surveyid, 'assessments','create')) { - $inserttable=$dbprefix."assessments"; - $first=true; - foreach ($assessmentlangs as $assessmentlang) - { - if (!isset($_POST['gid'])) $_POST['gid']=0; - - $datarray=array( - 'sid' => $surveyid, - 'scope' => $_POST['scope'], - 'gid' => $_POST['gid'], - 'minimum' => $_POST['minimum'], - 'maximum' => $_POST['maximum'], - 'name' => $_POST['name_'.$assessmentlang], - 'language' => $assessmentlang, - 'message' => $_POST['assessmentmessage_'.$assessmentlang]); - - if ($first==false) - { - $datarray['id']=$aid; - } - - $query = $connect->GetInsertSQL($inserttable, $datarray, get_magic_quotes_gpc()); - $result=$connect->Execute($query) or safe_die("Error inserting
$query
".$connect->ErrorMsg()); - if ($first==true) - { - $first=false; - $aid=$connect->Insert_ID(db_table_name_nq('assessments'),"id"); - } - } -} elseif ($action == "assessmentupdate" && bHasSurveyPermission($surveyid, 'assessments','update')) { - - if ($filterxsshtml) - { - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - } - - foreach ($assessmentlangs as $assessmentlang) - { - - if (!isset($_POST['gid'])) $_POST['gid']=0; - if ($filterxsshtml) - { - $_POST['name_'.$assessmentlang]=$myFilter->process($_POST['name_'.$assessmentlang]); - $_POST['assessmentmessage_'.$assessmentlang]=$myFilter->process($_POST['assessmentmessage_'.$assessmentlang]); - } - $query = "UPDATE {$dbprefix}assessments - SET scope='".db_quote($_POST['scope'],true)."', - gid=".sanitize_int($_POST['gid']).", - minimum='".sanitize_signedint($_POST['minimum'])."', - maximum='".sanitize_signedint($_POST['maximum'])."', - name='".db_quote($_POST['name_'.$assessmentlang],true)."', - message='".db_quote($_POST['assessmentmessage_'.$assessmentlang],true)."' - WHERE language='$assessmentlang' and id=".sanitize_int($_POST['id']); - $result = $connect->Execute($query) or safe_die("Error updating
$query
".$connect->ErrorMsg()); - } -} elseif ($action == "assessmentdelete" && bHasSurveyPermission($surveyid, 'assessments','delete')) { - $query = "DELETE FROM {$dbprefix}assessments - WHERE id=".sanitize_int($_POST['id']); - $result=$connect->Execute($query); -} - -if (bHasSurveyPermission($surveyid, 'assessments','read')) -{ - - $assessmentsoutput=PrepareEditorScript(); - $assessmentsoutput.="\n"; - $assessmentsoutput.="\n"; - $assessmentsoutput .= "

 

"; //CSS Firefox 2 transition fix - - if ($surveyid == "") { - $assessmentsoutput.= $clang->gT("No SID Provided"); - exit; - } - - $assessments=getAssessments($surveyid); - //$assessmentsoutput.= "
";print_r($assessments);echo "
"; - $groups=getGroups($surveyid); - $groupselect="\n"; - $headings=array($clang->gT("Scope"), $clang->gT("Question group"), $clang->gT("Minimum"), $clang->gT("Maximum")); - $actiontitle=$clang->gT("Add"); - $actionvalue="assessmentadd"; - $thisid=""; - - if ($action == "assessmentedit" && bHasSurveyPermission($surveyid, 'assessments','update')) { - $query = "SELECT * FROM {$dbprefix}assessments WHERE id=".sanitize_int($_POST['id'])." and language='$baselang'"; - $results = db_execute_assoc($query); - while($row=$results->FetchRow()) { - $editdata=$row; - } - $groupselect=str_replace("'".$editdata['gid']."'", "'".$editdata['gid']."' selected", $groupselect); - $actiontitle=$clang->gT("Edit"); - $actionvalue="assessmentupdate"; - $thisid=$editdata['id']; - } - //$assessmentsoutput.= "
"; print_r($edits); $assessmentsoutput.= "
"; - //PRESENT THE PAGE - - - $assessmentsoutput.= "
".$clang->gT("Assessment rules")."
" - - - ."" - ."\n"; - foreach ($headings as $head) { - $assessmentsoutput.= "\n"; - } - $assessmentsoutput.= ""; - $assessmentsoutput.= "\n"; - $flipflop=true; - foreach($assessments as $assess) { - $flipflop=!$flipflop; - $assessmentsoutput.= "\n"; - if ($flipflop==true){$assessmentsoutput.= "\n";} - else {$assessmentsoutput.= "\n";} - $assessmentsoutput.= "\n"; - $assessmentsoutput.= "\n"; - - if ($assess['scope'] == "T") - { - $assessmentsoutput.= "\n"; - $assessmentsoutput.= "\n"; - } - else - { - $assessmentsoutput.= "\n"; - $assessmentsoutput.= "\n"; - } - - - $assessmentsoutput.= "\n"; - $assessmentsoutput.= "\n"; - $assessmentsoutput.= "\n"; - $assessmentsoutput.= "\n"; - - $assessmentsoutput.= "\n"; - } - $assessmentsoutput.= "
".$clang->gT("ID")."".$clang->gT("Actions")."".$clang->gT("SID")."$head".$clang->gT("Title")."".$clang->gT("Message")."
".$assess['id'].""; - if (bHasSurveyPermission($surveyid, 'assessments','update')) - { - $assessmentsoutput.="
- - - -
"; - } - - if (bHasSurveyPermission($surveyid, 'assessments','delete')) - { - $assessmentsoutput.="
- - - -
"; - } - $assessmentsoutput.= "
".$assess['sid']."".$clang->gT("Total")."-".$clang->gT("Question group")."".$groups[$assess['gid']]['group_name']." (".$assess['gid'].")".$assess['minimum']."".$assess['maximum']."".stripslashes($assess['name'])."".strip_tags(strip_javascript($assess['message']))."
"; - - if ((bHasSurveyPermission($surveyid, 'assessments','update') && $actionvalue=="assessmentupdate") || (bHasSurveyPermission($surveyid, 'assessments','create')&& $actionvalue=="assessmentadd")) - { - - //now present edit/insert form - $assessmentsoutput.= "
\n"; - $assessmentsoutput.= "$actiontitle
\n"; - - $assessmentsoutput.="
    \n" - ."
  • gT("Total")." - gT("Group")."
  • \n"; - $assessmentsoutput.="
  • $groupselect
  • \n" - ."
  • "; - - // start tabs - $assessmentsoutput.= "
    " - ."\n"; - foreach ($assessmentlangs as $assessmentlang) - { - $heading=''; $message=''; - if ($action == "assessmentedit") - { - $query = "SELECT * FROM {$dbprefix}assessments WHERE id=".sanitize_int($_POST['id'])." and language='$assessmentlang'"; - $results = db_execute_assoc($query); - while($row=$results->FetchRow()) { - $editdata=$row; - } - $heading=htmlspecialchars($editdata['name'],ENT_QUOTES); - $message=htmlspecialchars($editdata['message']); - } - $assessmentsoutput .= "
    \n" - ."\t
    \n" - ."\t\t".$clang->gT("Heading")."\n" - ."\t\t\n" - ."\t
    \n" - ."\t
    \n" - ."\t\t".$clang->gT("Message")."\n" - ."\t\t\n\t\t\t\n"; - $assessmentsoutput.=getEditor("assessment-text","assessmentmessage_$assessmentlang", "[".$clang->gT("Message:", "js")."]",$surveyid,$gid,$qid,$action); - $assessmentsoutput .="\n\t
    \n" - ."\t
    \n" - ."
    "; - } - $assessmentsoutput .='
    '; - - $assessmentsoutput.= "

    \n" - ."\n"; - if ($action == "assessmentedit") $assessmentsoutput.= "    \n"; - $assessmentsoutput.= "\n" - ."\n" - ."\n" - ."

    \n" - ."
  • \n"; - } -} - -function getAssessments($surveyid) { - global $dbprefix, $connect, $baselang; - $query = "SELECT id, sid, scope, gid, minimum, maximum, name, message - FROM ".db_table_name('assessments')." - WHERE sid='$surveyid' and language='$baselang' - ORDER BY scope, gid"; - $result=db_execute_assoc($query) or safe_die("Error getting assessments
    $query
    ".$connect->ErrorMsg()); - $output=array(); - while($row=$result->FetchRow()) { - $output[]=$row; - } - return $output; -} - -function getGroups($surveyid) { - global $dbprefix, $connect; - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $query = "SELECT gid, group_name - FROM ".db_table_name('groups')." - WHERE sid='$surveyid' and language='$baselang' - ORDER BY group_order"; - $result = db_execute_assoc($query) or safe_die("Error getting groups
    $query
    ".$connect->ErrorMsg()); - $output=array(); - while($row=$result->FetchRow()) { - $output[$row['gid']]=$row; - } - return $output; -} -?> diff --git a/include/limesurvey/admin/bounceprocessing.php b/include/limesurvey/admin/bounceprocessing.php deleted file mode 100644 index e388ab5a..00000000 --- a/include/limesurvey/admin/bounceprocessing.php +++ /dev/null @@ -1,163 +0,0 @@ -date; - $datelcu = strtotime($datelc); - $gettimestamp = "select bouncetime from ".db_table_name("surveys")." where sid='$surveyidoriginal';"; - $datelcufiles = $connect->Execute($gettimestamp); - $datelcufile = substr($datelcufiles,11); - while($datelcu > $datelcufile) - { - $lasthinfo=imap_headerinfo($mbox,$count); - $datelc=$lasthinfo->date; - $datelcu = strtotime($datelc); - $header = explode("\r\n", imap_body($mbox,$count)); - foreach ($header as $item) - { - if (preg_match('/^X-surveyid/',$item)) - { - $surveyid=explode(": ",$item); - } - if (preg_match('/^X-tokenid/',$item)) - { - $token=explode(": ",$item); - if($surveyidoriginal == $surveyid[1]) - { - $bouncequery = "UPDATE ".db_table_name("tokens_$surveyidoriginal")." set emailstatus='bounced', usesleft=0 where token='".db_quote($token[1])."';"; - $anish=$connect->Execute($bouncequery); - $bouncetotal++; - } - } - } - $count--; - $lasthinfo=imap_headerinfo($mbox,$count); - $datelc=$lasthinfo->date; - $datelcu = strtotime($datelc); - $checktotal++; - } - @$count=imap_num_msg($mbox); - @$lastcheckedinfo=imap_headerinfo($mbox,$count); - $datelcfinal=$lastcheckedinfo->date; - $datelcfinalu = strtotime($datelcfinal); - $entertimestamp = "update ".db_table_name("surveys")." set bouncetime='$datelcfinalu' where sid='$surveyidoriginal';"; - $executetimestamp = $connect->Execute($entertimestamp); - } - else - { - echo "Please check your settings"; - } - } - elseif($accounttype='POP') - { - if($hostencryption=='SSL') - { - $finalhostname='{'.$hostname.'/pop3/ssl/novalidate-cert}INBOX'; - } - elseif($hostencryption=='TLS') - { - $finalhostname='{'.$hostname.'/pop3/tls/novalidate-cert}INBOX'; - } - else - { - $finalhostname='{'.$hostname.'/pop3/novalidate-cert}INBOX'; - } - if(@$mbox=imap_open($finalhostname,$username,$pass)) - { - @$count=imap_num_msg($mbox); - while($count>0) - { @$header = explode("\r\n", imap_body($mbox,$count)); - foreach ($header as $item) - { - if (preg_match('/^X-surveyid/',$item)) - { - $surveyid=explode(": ",$item); - } - if (preg_match('/^X-tokenid/',$item)) - { - $token=explode(": ",$item); - if($surveyidoriginal == $surveyid[1]) - { - $bouncequery = "UPDATE ".db_table_name("tokens_$surveyidoriginal")." set emailstatus='bounced', usesleft=0 where token='".db_quote($token[1])."';"; - $anish=$connect->Execute($bouncequery) or safe_die ("Couldn't update sent field
    $query
    ".$connect->ErrorMsg()); - $bouncetotal++; - } - } - } - $count--; - $checktotal++; - } - imap_errors(); - imap_close($mbox); - } - else - { - echo "Please check your settings"; - } - } -if($bouncetotal>0) - { -echo "
    $checktotal messages were scanned out of which $bouncetotal were marked as bounce by the system.


    Please reload the browse table to view results
    "; - } -else - { - -echo "
    $checktotal messages were scanned out of which $bouncetotal were marked as bounce by the system.
    "; - - } -} - -} - -?> - diff --git a/include/limesurvey/admin/browse.php b/include/limesurvey/admin/browse.php deleted file mode 100644 index 1ca82d81..00000000 --- a/include/limesurvey/admin/browse.php +++ /dev/null @@ -1,1252 +0,0 @@ -
    " - . $clang->gT("Browse Responses")."
    " - .$clang->gT("Error")."\t
    \n" - . $clang->gT("You have not selected a survey to browse.")."
    \n" - ."
    \n" - ."
"; - return; -} -//CHECK IF SURVEY IS ACTIVATED AND EXISTS -$actquery = "SELECT * FROM ".db_table_name('surveys')." as a inner join ".db_table_name('surveys_languagesettings')." as b on (b.surveyls_survey_id=a.sid and b.surveyls_language=a.language) WHERE a.sid=$surveyid"; - -$actresult = db_execute_assoc($actquery); -$actcount = $actresult->RecordCount(); -if ($actcount > 0) -{ - while ($actrow = $actresult->FetchRow()) - { - $surveytable = db_table_name("survey_".$actrow['sid']); - $surveytimingstable = db_table_name("survey_".$actrow['sid']."_timings"); - $tokentable = $dbprefix."tokens_".$actrow['sid']; - /* - * DO NEVER EVER PUT VARIABLES AND FUNCTIONS WHICH GIVE BACK DIFFERENT QUOTES - * IN DOUBLE QUOTED(' and " and \" is used) JAVASCRIPT/HTML CODE!!! (except for: you know what you are doing) - * - * Used for deleting a record, fix quote bugs.. - */ - $surveytableNq = db_table_name_nq("survey_".$surveyid); - - $surveyname = "{$actrow['surveyls_title']}"; - if ($actrow['active'] == "N") //SURVEY IS NOT ACTIVE YET - { - $browseoutput = "\t
" - . $clang->gT("Browse Responses")."
" - .$clang->gT("Error")."\t
\n" - . $clang->gT("This survey has not been activated. There are no results to browse.")."
\n" - ."
\n" - ."
"; - return; - } - } -} -else //SURVEY MATCHING $surveyid DOESN'T EXIST -{ - $browseoutput = "\t
" - . $clang->gT("Browse Responses")."
" - .$clang->gT("Error")."\t
\n" - . $clang->gT("There is no matching survey.")."
\n" - ."
\n" - ."
"; - return; -} - -//OK. IF WE GOT THIS FAR, THEN THE SURVEY EXISTS AND IT IS ACTIVE, SO LETS GET TO WORK. - -$surveyinfo=getSurveyInfo($surveyid); -include_once("../quexs.php"); -require_once(dirname(__FILE__).'/sessioncontrol.php'); - -// Set language for questions and labels to base language of this survey - -if (isset($browselang) && $browselang!='') -{ - $_SESSION['browselang']=$browselang; - $language=$_SESSION['browselang']; -} -elseif (isset($_SESSION['browselang'])) -{ - $language=$_SESSION['browselang']; - $languagelist = GetAdditionalLanguagesFromSurveyID($surveyid); - $languagelist[]=GetBaseLanguageFromSurveyID($surveyid); - if (!in_array($language,$languagelist)) - { - $language = GetBaseLanguageFromSurveyID($surveyid); - } -} -else -{ - $language = GetBaseLanguageFromSurveyID($surveyid); -} - -$surveyoptions = browsemenubar($clang->gT("Browse Responses")); -$browseoutput = ""; - -$js_admin_includes[]='scripts/browse.js'; - -$qulanguage = GetBaseLanguageFromSurveyID($surveyid); - - -// Looking at a SINGLE entry - -if ($subaction == "id") -{ - $dateformatdetails=getDateFormatData($_SESSION['dateformat']); - - //SHOW HEADER - if (!isset($_SESSION['sql']) || !$_SESSION['sql']) {$browseoutput .= $surveyoptions;} // Don't show options if coming from tokens/statistics script - //FIRST LETS GET THE NAMES OF THE QUESTIONS AND MATCH THEM TO THE FIELD NAMES FOR THE DATABASE - - $fncount = 0; - - - $fieldmap=createFieldMap($surveyid,'full',false,false,$language); - - //add token to top of list if survey is not private - if ($surveyinfo['anonymized'] == "N" && tableExists('tokens_'.$surveyid)) - { - $fnames[] = array("token", "Token", $clang->gT("Token ID"), 0); - $fnames[] = array("firstname", "First name", $clang->gT("First name"), 0); - $fnames[] = array("lastname", "Last name", $clang->gT("Last name"), 0); - $fnames[] = array("email", "Email", $clang->gT("Email"), 0); - } - $fnames[] = array("submitdate", $clang->gT("Submission date"), $clang->gT("Completed"), "0", 'D'); - $fnames[] = array("completed", $clang->gT("Completed"), "0"); - - foreach ($fieldmap as $field) - { - if ($field['fieldname']=='lastpage' || $field['fieldname'] == 'submitdate') - continue; - if ($field['type']=='interview_time') - continue; - if ($field['type']=='page_time') - continue; - if ($field['type']=='answer_time') - continue; - - $question=$field['question']; - if ($field['type'] != "|") - { - if (isset($field['subquestion']) && $field['subquestion']!='') - $question .=' ('.$field['subquestion'].')'; - if (isset($field['subquestion1']) && isset($field['subquestion2'])) - $question .=' ('.$field['subquestion1'].':'.$field['subquestion2'].')'; - if (isset($field['scale_id'])) - $question .='['.$field['scale'].']'; - $fnames[]=array($field['fieldname'],$question); - } - else - { - if ($field['aid']!=='filecount') - { - $qidattributes=getQuestionAttributes($field['qid']); - - for ($i = 0; $i < $field['max_files']; $i++) - { - if ($qidattributes['show_title'] == 1) - $fnames[] = array($field['fieldname'], "File ".($i+1)." - ".$field['question']." (Title)", "type"=>"|", "metadata"=>"title", "index"=>$i); - - if ($qidattributes['show_comment'] == 1) - $fnames[] = array($field['fieldname'], "File ".($i+1)." - ".$field['question']." (Comment)", "type"=>"|", "metadata"=>"comment", "index"=>$i); - - $fnames[] = array($field['fieldname'], "File ".($i+1)." - ".$field['question']." (File name)", "type"=>"|", "metadata"=>"name", "index"=>$i); - $fnames[] = array($field['fieldname'], "File ".($i+1)." - ".$field['question']." (File size)", "type"=>"|", "metadata"=>"size", "index"=>$i); - //$fnames[] = array($field['fieldname'], "File ".($i+1)." - ".$field['question']." (extension)", "type"=>"|", "metadata"=>"ext", "index"=>$i); - } - } - else - $fnames[] = array($field['fieldname'], "File count"); - } -} - - $nfncount = count($fnames)-1; - //SHOW INDIVIDUAL RECORD - $idquery = "SELECT * FROM {$surveytable} s"; - if ($surveyinfo['anonymized'] == "N" && db_tables_exist($tokentable)) - $idquery .= " LEFT JOIN {$tokentable} t ON s.token = t.token "; - - - //queXS Addition - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $query .= " JOIN `case` AS c ON (s.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $query .= " JOIN `sample` AS ss ON (ss.sample_id = c.sample_id AND ss.import_id = '{$qfs[1]}') "; - } - - - if (incompleteAnsFilterstate() == "inc") - $idquery .= " WHERE (submitdate = ".$connect->DBDate('1980-01-01'). " OR submitdate IS NULL) AND "; - elseif (incompleteAnsFilterstate() == "filter") - $idquery .= " WHERE submitdate >= ".$connect->DBDate('1980-01-01'). " AND "; - else - $idquery .= " WHERE "; - if ($id < 1) { $id = 1; } - $idquery .= " s.id = $id"; - $idresult = db_execute_assoc($idquery) or safe_die ("Couldn't get entry
\n$idquery
\n".$connect->ErrorMsg()); - while ($idrow = $idresult->FetchRow()) - { - $id=$idrow['id']; - $rlanguage=$idrow['startlanguage']; - } - $next=$id+1; - $last=$id-1; - $browseoutput .= "\n"; - - $browseoutput .= "\n"; - $idresult = db_execute_assoc($idquery) or safe_die ("Couldn't get entry
$idquery
".$connect->ErrorMsg()); - while ($idrow = $idresult->FetchRow()) - { - $highlight=false; - for ($i = 0; $i < $nfncount+1; $i++) - { - if ($fnames[$i][0] != 'completed' && is_null($idrow[$fnames[$i][0]])) - { - continue; // irrelevant, so don't show - } - $inserthighlight=''; - if ($highlight) - $inserthighlight="class='highlight'"; - $browseoutput .= "\t\n" - ."\n" - .""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo "
" - .strip_tags(strip_javascript($fnames[$i][1])).""; - if ($fnames[$i][0] == 'completed') - { - if ($idrow['submitdate'] == NULL || $idrow['submitdate'] == "N") { $browseoutput .= "N"; } - else { $browseoutput .= "Y"; } - } - else - { - if (isset($fnames[$i]['type']) && $fnames[$i]['type'] == "|") - { - $index = $fnames[$i]['index']; - $metadata = $fnames[$i]['metadata']; - $phparray = json_decode($idrow[$fnames[$i][0]], true); - if (isset($phparray[$index])) - { - if ($metadata === "size") - $browseoutput .= rawurldecode(((int)($phparray[$index][$metadata]))." KB"); - else if ($metadata === "name") - $browseoutput .= ", , , , ); - */ - - $browseoutput .= "\n\n"; - $browseoutput .= $surveyoptions; - $bClearFilter=returnglobal('clearfilter'); - if ($bClearFilter) - { - unset($_SESSION['sql']); - } - if (isset($_SESSION['sql'])) - { - $browseoutput .= "
-

".$clang->gT("Note:").' '.$clang->gT("Showing Filtered Results")." " - ."  - - - -

\n"; - } - - //Delete Individual answer using inrow delete buttons/links - checked - if (isset($_POST['deleteanswer']) && $_POST['deleteanswer'] != '' && $_POST['deleteanswer'] != 'marked' && bHasSurveyPermission($surveyid,'responses','delete')) - { - $_POST['deleteanswer']=(int) $_POST['deleteanswer']; // sanitize the value - - // delete the files as well if its a fuqt - - $fieldmap = createFieldMap($surveyid); - $fuqtquestions = array(); - // find all fuqt questions - foreach ($fieldmap as $field) - { - if ($field['type'] == "|" && strpos($field['fieldname'], "_filecount") == 0) - $fuqtquestions[] = $field['fieldname']; - } - if (!empty($fuqtquestions)) - { - // find all responses (filenames) to the fuqt questions - $query="SELECT " . implode(", ", $fuqtquestions) . " FROM $surveytable where id={$_POST['deleteanswer']}"; - $responses = db_execute_assoc($query) or safe_die("Could not fetch responses
$query
".$connect->ErrorMsg()); - - while($json = $responses->FetchRow()) - { - foreach ($fuqtquestions as $fieldname) - { - $phparray = json_decode($json[$fieldname]); - foreach($phparray as $metadata) - { - $path = "{$uploaddir}/surveys/{$surveyid}/files/"; - unlink($path.$metadata->filename); // delete the file - } - } - } - } - - // delete the row - $query="delete FROM $surveytable where id={$_POST['deleteanswer']}"; - $connect->execute($query) or safe_die("Could not delete response
$dtquery
".$connect->ErrorMsg()); // checked - } - // Marked responses -> deal with the whole batch of marked responses - if (isset($_POST['markedresponses']) && count($_POST['markedresponses'])>0 && bHasSurveyPermission($surveyid,'responses','delete')) - { - // Delete the marked responses - checked - if (isset($_POST['deleteanswer']) && $_POST['deleteanswer'] === 'marked') - { - $fieldmap = createFieldMap($surveyid); - $fuqtquestions = array(); - // find all fuqt questions - foreach ($fieldmap as $field) - { - if ($field['type'] == "|" && strpos($field['fieldname'], "_filecount") == 0) - $fuqtquestions[] = $field['fieldname']; - } - - foreach ($_POST['markedresponses'] as $iResponseID) - { - $iResponseID = (int)$iResponseID; // sanitize the value - - if (!empty($fuqtquestions)) - { - // find all responses (filenames) to the fuqt questions - $query="SELECT " . implode(", ", $fuqtquestions) . " FROM $surveytable where id={$iResponseID}"; - $responses = db_execute_assoc($query) or safe_die("Could not fetch responses
$query
".$connect->ErrorMsg()); - - while($json = $responses->FetchRow()) - { - foreach ($fuqtquestions as $fieldname) - { - $phparray = json_decode($json[$fieldname]); - foreach($phparray as $metadata) - { - $path = "{$uploaddir}/surveys/{$surveyid}/files/"; - unlink($path.$metadata->filename); // delete the file - } - } - } - } - - $query="delete FROM {$surveytable} where id={$iResponseID}"; - $connect->execute($query) or safe_die("Could not delete response
{$dtquery}
".$connect->ErrorMsg()); // checked - } - } - // Download all files for all marked responses - checked - else if (isset($_POST['downloadfile']) && $_POST['downloadfile'] === 'marked') - { - // Now, zip all the files in the filelist - $zipfilename = "Responses_for_survey_" . $surveyid . ".zip"; - zipFiles($_POST['markedresponses'], $zipfilename); - } - } - // Download all files for this entry - checked - else if (isset($_POST['downloadfile']) && $_POST['downloadfile'] != '' && $_POST['downloadfile'] !== true) - { - // Now, zip all the files in the filelist - $zipfilename = "LS_Responses_for_" . $_POST['downloadfile'] . ".zip"; - zipFiles($_POST['downloadfile'], $zipfilename); - } - else if (isset($_POST['downloadindividualfile']) && $_POST['downloadindividualfile'] != '') - { - $id = (int)$_POST['id']; - $downloadindividualfile = $_POST['downloadindividualfile']; - $fieldname = $_POST['fieldname']; - - $query = "SELECT ".db_quote_id($fieldname)." FROM {$surveytable} WHERE id={$id}"; - $result=db_execute_num($query); - $row=$result->FetchRow(); - $phparray = json_decode($row[0]); - - for ($i = 0; $i < count($phparray); $i++) - { - if ($phparray[$i]->name == $downloadindividualfile) - { - $file = $uploaddir. "/surveys/" . $surveyid . "/files/" . $phparray[$i]->filename; - if (file_exists($file)) { - header('Content-Description: File Transfer'); - header('Content-Type: application/octet-stream'); - header('Content-Disposition: attachment; filename="' . rawurldecode($phparray[$i]->name) . '"'); - header('Content-Transfer-Encoding: binary'); - header('Expires: 0'); - header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); - header('Pragma: public'); - header('Content-Length: ' . filesize($file)); - ob_clean(); - flush(); - readfile($file); - exit; - } - break; - } - } - } - - - //add token to top of list if survey is not private - if ($surveyinfo['anonymized'] == "N" && db_tables_exist($tokentable)) //add token to top of list if survey is not private - { - $fnames[] = array("token", "Token", $clang->gT("Token ID"), 0); - $fnames[] = array("firstname", "First name", $clang->gT("First name"), 0); - $fnames[] = array("lastname", "Last name", $clang->gT("Last name"), 0); - $fnames[] = array("email", "Email", $clang->gT("Email"), 0); - } - - $fnames[] = array("submitdate", $clang->gT("Completed"), $clang->gT("Completed"), "0", 'D'); - $fields = createFieldMap($surveyid, 'full', false, false, $language); - - foreach ($fields as $fielddetails) - { - if ($fielddetails['fieldname']=='lastpage' || $fielddetails['fieldname'] == 'submitdate') - continue; - - $question=$fielddetails['question']; - if ($fielddetails['type'] != "|") - { - if ($fielddetails['fieldname']=='lastpage' || $fielddetails['fieldname'] == 'submitdate' || $fielddetails['fieldname'] == 'token') - continue; - - // no headers for time data - if ($fielddetails['type']=='interview_time') - continue; - if ($fielddetails['type']=='page_time') - continue; - if ($fielddetails['type']=='answer_time') - continue; - if (isset($fielddetails['subquestion']) && $fielddetails['subquestion']!='') - $question .=' ('.$fielddetails['subquestion'].')'; - if (isset($fielddetails['subquestion1']) && isset($fielddetails['subquestion2'])) - $question .=' ('.$fielddetails['subquestion1'].':'.$fielddetails['subquestion2'].')'; - if (isset($fielddetails['scale_id'])) - $question .='['.$fielddetails['scale'].']'; - $fnames[]=array($fielddetails['fieldname'],$question); - } - else - { - if ($fielddetails['aid']!=='filecount') - { - $qidattributes=getQuestionAttributes($fielddetails['qid']); - - for ($i = 0; $i < $fielddetails['max_files']; $i++) - { - if ($qidattributes['show_title'] == 1) - $fnames[] = array($fielddetails['fieldname'], "File ".($i+1)." - ".$fielddetails['question']."(Title)", "type"=>"|", "metadata"=>"title", "index"=>$i); - - if ($qidattributes['show_comment'] == 1) - $fnames[] = array($fielddetails['fieldname'], "File ".($i+1)." - ".$fielddetails['question']."(Comment)", "type"=>"|", "metadata"=>"comment", "index"=>$i); - - $fnames[] = array($fielddetails['fieldname'], "File ".($i+1)." - ".$fielddetails['question']."(File name)", "type"=>"|", "metadata"=>"name", "index"=>$i); - $fnames[] = array($fielddetails['fieldname'], "File ".($i+1)." - ".$fielddetails['question']."(File size)", "type"=>"|", "metadata"=>"size", "index"=>$i); - //$fnames[] = array($fielddetails['fieldname'], "File ".($i+1)." - ".$fielddetails['question']."(extension)", "type"=>"|", "metadata"=>"ext", "index"=>$i); - } - } - else - $fnames[] = array($fielddetails['fieldname'], "File count"); - } - } - - $fncount = count($fnames); - - //NOW LETS CREATE A TABLE WITH THOSE HEADINGS - - $tableheader = ""; - if ($fncount < 10) {$tableheader .= "\n";} - else {$tableheader .= "
\n";} - $tableheader .= "\t\n" - . "\n" - . "\n"; - foreach ($fnames as $fn) - { - if (!isset($currentgroup)) {$currentgroup = $fn[1]; $gbc = "odd";} - if ($currentgroup != $fn[1]) - { - $currentgroup = $fn[1]; - if ($gbc == "odd") {$gbc = "even";} - else {$gbc = "odd";} - } - $tableheader .= "\n"; - } - $tableheader .= "\t\n\n"; - $tableheader .= "\t\n\n"; - - $start=returnglobal('start'); - $limit=returnglobal('limit'); - if (!isset($limit) || $limit== '') {$limit = 50;} - if (!isset($start) || $start =='') {$start = 0;} - - //Create the query - if ($surveyinfo['anonymized'] == "N" && db_tables_exist($tokentable)) - { - $sql_from = "{$surveytable} LEFT JOIN {$tokentable} ON {$surveytable}.token = {$tokentable}.token"; - } else { - $sql_from = $surveytable; - } - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $sql_from .= " JOIN `case` AS c ON ({$surveytable}.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $sql_from .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - - - $selectedgroup = returnglobal('selectgroup'); // group token id - - $sql_where = ""; - if (incompleteAnsFilterstate() == "inc") - { - $sql_where .= "submitdate IS NULL"; - - } - elseif (incompleteAnsFilterstate() == "filter") - { - $sql_where .= "submitdate IS NOT NULL"; - - } - - //LETS COUNT THE DATA - //$dtquery = "SELECT count(*) FROM $sql_from $sql_where"; - $dtquery = "SELECT count(*) FROM $sql_from"; - if ($sql_where!="") - { - $dtquery .=" WHERE $sql_where"; - } - $dtresult=db_execute_num($dtquery) or safe_die("Couldn't get response data
$dtquery
".$connect->ErrorMsg()); - while ($dtrow=$dtresult->FetchRow()) {$dtcount=$dtrow[0];} - - if ($limit > $dtcount) {$limit=$dtcount;} - - //NOW LETS SHOW THE DATA - if (isset($_SESSION['sql'])) - { - if ($_SESSION['sql'] == "NULL" ) - { - if ($surveyinfo['anonymized'] == "N" && db_tables_exist($tokentable)) - $dtquery = "SELECT * FROM $surveytable LEFT JOIN $tokentable ON $surveytable.token = $tokentable.token "; - else - $dtquery = "SELECT * FROM $surveytable "; - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $dtquery .= " JOIN `case` AS c ON ({$surveytable}.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $dtquery .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - // group token id - $selectedgroup = returnglobal('selectgroup'); - if (incompleteAnsFilterstate() == "inc") - { - $dtquery .= "WHERE submitdate IS NULL "; - } - elseif (incompleteAnsFilterstate() == "filter") - { - $dtquery .= " WHERE submitdate IS NOT NULL "; - } - - $dtquery .= " ORDER BY {$surveytable}.id"; - } - else - { - - if ($surveytable['anonymized'] == "N" && db_tables_exist($tokentable)) - $dtquery = "SELECT * FROM $surveytable LEFT JOIN $tokentable ON $surveytable.token = $tokentable.token WHERE 1=1 "; - else - $dtquery = "SELECT * FROM $surveytable WHERE 1=1 "; - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $dtquery .= " JOIN `case` AS c ON ({$surveytable}.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $dtquery .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - $selectedgroup = returnglobal('selectgroup'); - if (incompleteAnsFilterstate() == "inc") - { - $dtquery .= " AND submitdate IS NULL "; - - } - elseif (incompleteAnsFilterstate() == "filter") - { - $dtquery .= " AND submitdate IS NOT NULL "; - } - if ($_SESSION['sql'] !== "") - { - $dtquery .= ' AND '.$_SESSION['sql']." "; - } - $dtquery .= " ORDER BY {$surveytable}.id"; - } - } - else - { - if ($surveyinfo['anonymized'] == "N" && db_tables_exist($tokentable)) - $dtquery = "SELECT * FROM $surveytable LEFT JOIN $tokentable ON $surveytable.token = $tokentable.token "; - else - $dtquery = "SELECT * FROM $surveytable "; - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $dtquery .= " JOIN `case` AS c ON ({$surveytable}.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $dtquery .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - - if (incompleteAnsFilterstate() == "inc") - { - $dtquery .= " WHERE submitdate IS NULL "; - - } - elseif (incompleteAnsFilterstate() == "filter") - { - $dtquery .= " WHERE submitdate IS NOT NULL "; - } - - $dtquery .= " ORDER BY {$surveytable}.id"; - } - if ($order == "desc") {$dtquery .= " DESC";} - - if (isset($limit)) - { - if (!isset($start)) {$start = 0;} - $dtresult = db_select_limit_assoc($dtquery, $limit, $start) or safe_die("Couldn't get surveys
$dtquery
".$connect->ErrorMsg()); - } - else - { - $dtresult = db_execute_assoc($dtquery) or safe_die("Couldn't get surveys
$dtquery
".$connect->ErrorMsg()); - } - $dtcount2 = $dtresult->RecordCount(); - $cells = $fncount+1; - - - //CONTROL MENUBAR - $last=$start-$limit; - $next=$start+$limit; - $end=$dtcount-$limit; - if ($end < 0) {$end=0;} - if ($last <0) {$last=0;} - if ($next >= $dtcount) {$next=$dtcount-$limit;} - if ($end < 0) {$end=0;} - - $browseoutput .= "\n"; - - $browseoutput .= $tableheader; - $dateformatdetails=getDateFormatData($_SESSION['dateformat']); - - while ($dtrow = $dtresult->FetchRow()) - { - if (!isset($bgcc)) {$bgcc="even";} - else - { - if ($bgcc == "even") {$bgcc = "odd";} - else {$bgcc = "even";} - } - $browseoutput .= "\t\n" - ."\n" - .""; - $i = 0; - //If not private, display the token info and link to the token screen - if ($surveyinfo['anonymized'] == "N" && $dtrow['token'] && db_tables_exist($tokentable)) - { - if (isset($dtrow['tid']) && !empty($dtrow['tid'])) - { - //If we have a token, create a link to edit it - $browsedatafield = ""; - $browsedatafield .= "{$dtrow['token']}"; - $browsedatafield .= ""; - } else { - //No corresponding token in the token tabel, just display the token - $browsedatafield .= "{$dtrow['token']}"; - } - $browseoutput .= "\n"; - $i++; //We skip the first record (=token) as we just outputted that one - } - - for ($i; $i<$fncount; $i++) - { - $browsedatafield=htmlspecialchars($dtrow[$fnames[$i][0]]); - - if ( isset($fnames[$i][4]) && $fnames[$i][4] == 'D' && $fnames[$i][0] != '') - { - if ($dtrow[$fnames[$i][0]] == NULL) - $browsedatafield = "N"; - else - $browsedatafield = "Y"; - } - if (isset($fnames[$i]['type']) && $fnames[$i]['type'] == "|") - { - $index = $fnames[$i]['index']; - $metadata = $fnames[$i]['metadata']; - $phparray = json_decode($dtrow[$fnames[$i][0]], true); - if (isset($phparray[$index])) - { - if ($metadata === "size") - $browseoutput .= "\n"; - else if ($metadata === "name") - $browseoutput .= "\n"; - else - $browseoutput .= "\n"; - } - else - $browseoutput .= "\n"; - } - else - $browseoutput .= "\n"; - } - $browseoutput .= "\t\n"; - } - $browseoutput .= "
".$clang->gT('Actions')."" - . FlattenText("$fn[1]") - . "
"; - if (bHasSurveyPermission($surveyid,'responses','delete')) - { - $tableheader .= "".$clang->gT("; - } - if (bHasFileUploadQuestion($surveyid)) - $tableheader .="".$clang->gT("; - - $tableheader .="
- ".$clang->gT("; - - if (bHasSurveyPermission($surveyid,'responses','update')) - { - $browseoutput .= " ".$clang->gT("; - } - - // Do not show the download image if the question doesn't contain the File Upload Question Type - if (bHasFileUploadQuestion($surveyid)) - $browseoutput .=" ".$clang->gT("; - - if (bHasSurveyPermission($surveyid,'responses','delete')) - { - $browseoutput .= "".$clang->gT(\n"; - } - $browseoutput .= "$browsedatafield".rawurldecode(((int)($phparray[$index][$metadata]))." KB")."".rawurldecode($phparray[$index][$metadata])."".rawurldecode($phparray[$index][$metadata])." $browsedatafield
- - - - - \n
\n"; -} -elseif ($surveyinfo['savetimings']=="Y" && $subaction == "time"){ - $browseoutput .= $surveyoptions; - $browseoutput .= '
'.$clang->gT('Time statistics').'
'; - - // table of time statistics - only display completed surveys - $browseoutput .= "\n\n"; - - if (isset($_POST['deleteanswer']) && $_POST['deleteanswer']!='') - { - $_POST['deleteanswer']=(int) $_POST['deleteanswer']; // sanitize the value - $query="delete FROM $surveytable where id={$_POST['deleteanswer']}"; - $connect->execute($query) or safe_die("Could not delete response
$dtquery
".$connect->ErrorMsg()); // checked - } - - if (isset($_POST['markedresponses']) && count($_POST['markedresponses'])>0) - { - foreach ($_POST['markedresponses'] as $iResponseID) - { - $iResponseID=(int)$iResponseID; // sanitize the value - $query="delete FROM $surveytable where id={$iResponseID}"; - $connect->execute($query) or safe_die("Could not delete response
$dtquery
".$connect->ErrorMsg()); // checked - } - } - - $fields=createTimingsFieldMap($surveyid,'full'); - - foreach ($fields as $fielddetails) - { - // headers for answer id and time data - if ($fielddetails['type']=='id') - $fnames[]=array($fielddetails['fieldname'],$fielddetails['question']); - if ($fielddetails['type']=='interview_time') - $fnames[]=array($fielddetails['fieldname'],$clang->gT('Total time')); - if ($fielddetails['type']=='page_time') - $fnames[]=array($fielddetails['fieldname'],$clang->gT('Group').": ".$fielddetails['group_name']); - if ($fielddetails['type']=='answer_time') - $fnames[]=array($fielddetails['fieldname'],$clang->gT('Question').": ".$fielddetails['title']); - } - $fncount = count($fnames); - - //NOW LETS CREATE A TABLE WITH THOSE HEADINGS - $tableheader = ""; - if ($fncount < 10) {$tableheader .= "\n";} - else {$tableheader .= "
\n";} - $tableheader .= "\t\n" - . "\n" - . "\n"; - foreach ($fnames as $fn) - { - if (!isset($currentgroup)) {$currentgroup = $fn[1]; $gbc = "oddrow";} - if ($currentgroup != $fn[1]) - { - $currentgroup = $fn[1]; - if ($gbc == "oddrow") {$gbc = "evenrow";} - else {$gbc = "oddrow";} - } - $tableheader .= "\n"; - } - $tableheader .= "\t\n\n"; - $tableheader .= "\t\n\n"; - - $start=returnglobal('start'); - $limit=returnglobal('limit'); - if (!isset($limit) || $limit== '') {$limit = 50;} - if (!isset($start) || $start =='') {$start = 0;} - - //LETS COUNT THE DATA - $dtquery = "SELECT count(t.id) FROM {$surveytimingstable} t INNER JOIN {$surveytable} ON t.id={$surveytable}.id WHERE submitdate IS NOT NULL "; - - $dtresult=db_execute_num($dtquery) or safe_die("Couldn't get response data
$dtquery
".$connect->ErrorMsg()); - while ($dtrow=$dtresult->FetchRow()) {$dtcount=$dtrow[0];} - - if ($limit > $dtcount) {$limit=$dtcount;} - - //NOW LETS SHOW THE DATA - $dtquery = "SELECT t.* FROM {$surveytimingstable} t INNER JOIN {$surveytable} ON t.id={$surveytable}.id WHERE submitdate IS NOT NULL ORDER BY {$surveytable}.id"; - - if ($order == "desc") {$dtquery .= " DESC";} - - if (isset($limit)) - { - if (!isset($start)) {$start = 0;} - $dtresult = db_select_limit_assoc($dtquery, $limit, $start) or safe_die("Couldn't get surveys
$dtquery
".$connect->ErrorMsg()); - } -else -{ - $dtresult = db_execute_assoc($dtquery) or safe_die("Couldn't get surveys
$dtquery
".$connect->ErrorMsg()); - } - $dtcount2 = $dtresult->RecordCount(); - $cells = $fncount+1; - - //CONTROL MENUBAR - $last=$start-$limit; - $next=$start+$limit; - $end=$dtcount-$limit; - if ($end < 0) {$end=0;} - if ($last <0) {$last=0;} - if ($next >= $dtcount) {$next=$dtcount-$limit;} - if ($end < 0) {$end=0;} - - $browseoutput .= "\n"; - - $browseoutput .= $tableheader; - $dateformatdetails=getDateFormatData($_SESSION['dateformat']); - - while ($dtrow = $dtresult->FetchRow()) - { - if (!isset($bgcc)) {$bgcc="evenrow";} - else - { - if ($bgcc == "evenrow") {$bgcc = "oddrow";} - else {$bgcc = "evenrow";} - } - $browseoutput .= "\t\n" - ."\n" - ."\n"; - - for ($i = 0; $i<$fncount; $i++) - { - $browsedatafield=htmlspecialchars($dtrow[$fnames[$i][0]]); - - // seconds -> minutes & seconds - if (strtolower(substr($fnames[$i][0],-4)) == "time") - { - $minutes = (int)($browsedatafield/60); - $seconds = $browsedatafield%60; - $browsedatafield = ''; - if ($minutes > 0) - $browsedatafield .= "$minutes min "; - $browsedatafield .= "$seconds s"; - } - $browseoutput .= "\n"; - } - $browseoutput .= "\t\n"; - } - $browseoutput .= "
".$clang->gT('Actions')."" - . strip_javascript("$fn[1]") - . "
" - ."".$clang->gT(" - ."\t
- ".$clang->gT( - ".$clang->gT( - ".$clang->gT($browsedatafield
- - - - \n
\n"; - - // Interview time - $browseoutput .= '
'.$clang->gT('Interview time').'
'; - - //interview Time statistics - $count=false; - //$survstats=substr($surveytableNq); - $queryAvg="SELECT AVG(timings.interviewtime) AS avg, COUNT(timings.id) AS count FROM {$surveytableNq}_timings AS timings JOIN {$surveytable} AS surv ON timings.id=surv.id WHERE surv.submitdate IS NOT NULL"; - $queryAll="SELECT timings.interviewtime FROM {$surveytableNq}_timings AS timings JOIN {$surveytable} AS surv ON timings.id=surv.id WHERE surv.submitdate IS NOT NULL ORDER BY timings.interviewtime"; - $browseoutput .= ''; - if($result=db_execute_assoc($queryAvg)){ - - $row=$result->FetchRow(); - $min = (int)($row['avg']/60); - $sec = $row['avg']%60; - $count=$row['count']; - $browseoutput .= '"; - } - - if($count && $result=db_execute_assoc($queryAll)){ - - $middleval = floor(($count-1)/2); - $i=0; - if($count%2){ - while($row=$result->FetchRow()){ - - if($i==$middleval){ - $median=$row['interviewtime']; - break; - } - $i++; - } - }else{ - while($row=$result->FetchRow()){ - if($i==$middleval){ - $nextrow=$result->FetchRow(); - $median=($row['interviewtime']+$nextrow['interviewtime'])/2; - break; - } - $i++; - } - } - $min = (int)($median/60); - $sec = $median%60; - $browseoutput.='"; - } - $browseoutput .= '
'.$clang->gT('Average interview time: ')."{$min} min. {$sec} sec.
'.$clang->gT('Median: ')."{$min} min. {$sec} sec.
'; -} -elseif ($subaction=="time") -{ - $browseoutput .= $surveyoptions; - $browseoutput .= "
".$clang->gT("Timings")."
"; - $browseoutput .= "Timing saving is disabled or the timing table does not exist. Try to reactivate survey.\n"; -} -else -{ - $browseoutput .= $surveyoptions; - $num_total_answers=0; - $num_completed_answers=0; - $gnquery = "SELECT count(id) FROM $surveytable"; - $gnquery2 = "SELECT count(id) FROM $surveytable WHERE submitdate IS NOT NULL"; - $gnresult = db_execute_num($gnquery); - $gnresult2 = db_execute_num($gnquery2); - - while ($gnrow=$gnresult->FetchRow()) {$num_total_answers=$gnrow[0];} - while ($gnrow2=$gnresult2->FetchRow()) {$num_completed_answers=$gnrow2[0];} - $browseoutput .= "
".$clang->gT("Response summary")."
" - ."

\n" - ."" - ."\t" - ."" - ."" - ."
".$clang->gT("Total responses:")."".$num_total_answers."
".$clang->gT("Full responses:")."".$num_completed_answers."
".$clang->gT("Incomplete responses:")."".($num_total_answers-$num_completed_answers)."
"; - -} - -/** - * Supply an array with the responseIds and all files will be added to the zip - * and it will be be spit out on success - * - * @param array $responseIds - * @return ZipArchive - */ -function zipFiles($responseIds, $zipfilename) { - global $uploaddir, $surveyid, $surveytable; - - require_once('classes/pclzip/pclzip.lib.php'); - $tmpdir = $uploaddir. "/surveys/" . $surveyid . "/files/"; - - $filelist = array(); - $fieldmap = createFieldMap($surveyid, 'full'); - - foreach ($fieldmap as $field) - { - if ($field['type'] == "|" && $field['aid']!=='filecount') - { - $filequestion[] = $field['fieldname']; - } - } - $filequestion = array_map('db_quote_id',$filequestion); - $initquery = "SELECT " . implode(', ', $filequestion); - - foreach ((array)$responseIds as $responseId) - { - $responseId=(int)$responseId; // sanitize the value - - $query = $initquery . " FROM $surveytable WHERE id=$responseId"; - $filearray = db_execute_assoc($query) or safe_die("Could not download response
$query
".$connect->ErrorMsg()); - $metadata = array(); - $filecount = 0; - while ($metadata = $filearray->FetchRow()) - { - foreach ($metadata as $data) - { - $phparray = json_decode($data, true); - if (is_array($phparray)) { - foreach($phparray as $file) { - $filecount++; - $file['responseid'] = $responseId; - $file['name'] = rawurldecode($file['name']); - $file['index'] = $filecount; - /* - * Now add the file to the archive, prefix files with responseid_index to keep them - * unique. This way we can have 234_1_image1.gif, 234_2_image1.gif as it could be - * files from a different source with the same name. - */ - $filelist[] = array(PCLZIP_ATT_FILE_NAME =>$tmpdir . $file['filename'], - PCLZIP_ATT_FILE_NEW_FULL_NAME =>sprintf("%05s_%02s_%s", $file['responseid'], $file['index'], $file['name'])); - } - } - } - } - } - - if (count($filelist)>0) { - $zip = new PclZip($tmpdir . $zipfilename); - if ($zip->create($filelist)===0) { - //Oops something has gone wrong! - } - - if (file_exists($tmpdir."/".$zipfilename)) { - header('Content-Description: File Transfer'); - header('Content-Type: application/octet-stream'); - header('Content-Disposition: attachment; filename='.basename($zipfilename)); - header('Content-Transfer-Encoding: binary'); - header('Expires: 0'); - header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); - header('Pragma: public'); - header('Content-Length: ' . filesize($tmpdir."/".$zipfilename)); - ob_clean(); - flush(); - readfile($tmpdir . "/" . $zipfilename); - unlink($tmpdir . "/" . $zipfilename); - exit; - } - } -} diff --git a/include/limesurvey/admin/classes/core/class.progressbar.php b/include/limesurvey/admin/classes/core/class.progressbar.php deleted file mode 100644 index c396ba4d..00000000 --- a/include/limesurvey/admin/classes/core/class.progressbar.php +++ /dev/null @@ -1,571 +0,0 @@ - false); // ProgressBar Frame - /* 'show' => false, # frame show (true/false) - 'left' => 200, # frame position from left - 'top' => 100, # frame position from top - 'width' => 300, # frame width - 'height' => 75, # frame height - 'color' => '#c0c0c0', # frame color - 'border' => 2, # frame border - 'brd_color' => '#dfdfdf #404040 #404040 #dfdfdf' # frame border color - */ - - var $label = array(); // ProgressBar Labels - /* 'name' => array( # label name - 'type' => 'text', # label type (text,button,step,percent,crossbar) - 'value' => 'Please wait ...', # label value - 'left' => 10, # label position from left - 'top' => 20, # label position from top - 'width' => 0, # label width - 'height' => 0, # label height - 'align' => 'left', # label align - 'font-size' => 11, # label font size - 'font-family' => 'Verdana, Tahoma, Arial', # label font family - 'font-weight' => '', # label font weight - 'color' => '#000000', # label font color - 'bgr_color' => '' # label background color - ) - */ - - // constructor - - function ProgressBar($width=0,$height=0) - { - $this->code = substr(md5(microtime()), 0, 6); - if ($width>0) {$this->width = $width;} - if ($height>0) {$this->height = $height;} - } - - // private functions - - function _calculatePercent($step) - { - $percent = round(($step - $this->min) / ($this->max - $this->min) * 100); - if ($percent > 100) {$percent = 100;} - return $percent; - } - - function _calculatePosition($step) - { - switch ($this->direction) { - case 'right': - case 'left': - $bar = $this->width; - break; - case 'down': - case 'up': - $bar = $this->height; - break; - } - - $pixel = round(($step - $this->min) * ($bar - ($this->pedding * 2)) / ($this->max - $this->min)); - if ($step <= $this->min) {$pixel = 0;} - if ($step >= $this->max) {$pixel = $bar - ($this->pedding * 2);} - - switch ($this->direction) { - case 'right': - $position['left'] = $this->pedding; - $position['top'] = $this->pedding; - $position['width'] = $pixel; - $position['height'] = $this->height - ($this->pedding * 2); - break; - case 'left': - $position['left'] = $this->width - $this->pedding - $pixel; - $position['top'] = $this->pedding; - $position['width'] = $pixel; - $position['height'] = $this->height - ($this->pedding * 2); - break; - case 'down': - $position['left'] = $this->pedding; - $position['top'] = $this->pedding; - $position['width'] = $this->width - ($this->pedding * 2); - $position['height'] = $pixel; - break; - case 'up': - $position['left'] = $this->pedding; - $position['top'] = $this->height - $this->pedding - $pixel; - $position['width'] = $this->width - ($this->pedding * 2); - $position['height'] = $pixel; - break; - } - return $position; - } - - function _setStep($step) - { - if ($step > $this->max) {$step = $this->max;} - if ($step < $this->min) {$step = $this->min;} - $this->step = $step; - } - - // public functions - - function setFrame($width=0,$height=0) - { - $this->frame = array( - 'show' => true, - 'left' => 20, - 'top' => 35, - 'width' => 320, - 'height' => 90, - 'color' => '#c0c0c0', - 'border' => 2, - 'brd_color' => '#dfdfdf #404040 #404040 #dfdfdf' - ); - - if ($width>0) {$this->frame['width'] = $width;} - if ($height>0) {$this->frame['height'] = $height;} - } - - function addLabel($type,$name,$value=' ') - { - switch($type) { - case 'text': - $this->label[$name] = array( - 'type' => 'text', - 'value' => $value, - 'left' => $this->left, - 'top' => $this->top - 16, - 'width' => 0, - 'height' => 0, - 'align' => 'left', - 'font-size' => 11, - 'font-family' => 'Verdana, Tahoma, Arial', - 'font-weight' => 'normal', - 'color' => '#000000', - 'bgr_color' => '' - ); - break; - case 'button': - $this->label[$name] = array( - 'type' => 'button', - 'value' => $value, - 'action' => '', - 'target' => 'self', - 'left' => $this->left, - 'top' => $this->top + $this->height + 10, - 'width' => 0, - 'height' => 0, - 'align' => 'center', - 'font-size' => 11, - 'font-family' => 'Verdana, Tahoma, Arial', - 'font-weight' => 'normal', - 'color' => '#000000', - 'bgr_color' => '' - ); - break; - case 'step': - $this->label[$name] = array( - 'type' => 'step', - 'value' => $value, - 'left' => $this->left + 5, - 'top' => $this->top + 5, - 'width' => 10, - 'height' => 0, - 'align' => 'right', - 'font-size' => 11, - 'font-family' => 'Verdana, Tahoma, Arial', - 'font-weight' => 'normal', - 'color' => '#000000', - 'bgr_color' => '' - ); - break; - case 'percent': - $this->label[$name] = array( - 'type' => 'percent', - 'value' => $value, - 'left' => $this->left + $this->width - 50, - 'top' => $this->top - 16, - 'width' => 50, - 'height' => 0, - 'align' => 'right', - 'font-size' => 11, - 'font-family' => 'Verdana, Tahoma, Arial', - 'font-weight' => 'normal', - 'color' => '#000000', - 'bgr_color' => '' - ); - break; - case 'crossbar': - $this->label[$name] = array( - 'type' => 'crossbar', - 'value' => $value, - 'left' => $this->left + ($this->width / 2), - 'top' => $this->top - 16, - 'width' => 10, - 'height' => 0, - 'align' => 'center', - 'font-size' => 11, - 'font-family' => 'Verdana, Tahoma, Arial', - 'font-weight' => 'normal', - 'color' => '#000000', - 'bgr_color' => '' - ); - break; - } - } - - function addButton($name,$value,$action,$target='self') - { - $this->addLabel('button',$name,$value); - $this->label[$name]['action'] = $action; - $this->label[$name]['target'] = $target; - } - - function setLabelPosition($name,$left,$top,$width,$height,$align='') - { - $this->label[$name]['top'] = intval($top); - $this->label[$name]['left'] = intval($left); - $this->label[$name]['width'] = intval($width); - $this->label[$name]['height'] = intval($height); - if ($align!='') {$this->label[$name]['align'] = $align;} - - if ($this->status!='new') { - echo ''."\n"; - flush(); - } - } - - function setLabelColor($name,$color) - { - $this->label[$name]['color'] = $color; - if ($this->status!='new') { - echo ''."\n"; - flush(); - } - } - - function setLabelBackground($name,$color) - { - $this->label[$name]['bgr_color'] = $color; - if ($this->status!='new') { - echo ''."\n"; - flush(); - } - } - - function setLabelFont($name,$size,$family='',$weight='') - { - $this->label[$name]['font-size'] = intval($size); - if ($family!='') {$this->label[$name]['font-family'] = $family;} - if ($weight!='') {$this->label[$name]['font-weight'] = $weight;} - - if ($this->status!='new') { - echo ''."\n"; - flush(); - } - } - - function setLabelValue($name,$value) - { - $this->label[$name]['value'] = $value; - if ($this->status!='new') { - echo ''."\n"; - flush(); - } - } - - function setBarColor($color) - { - $this->color = $color; - if ($this->status!='new') { - echo ''."\n"; - flush(); - } - } - - function setBarBackground($color) - { - $this->bgr_color = $color; - if ($this->status!='new') { - echo ''."\n"; - flush(); - } - } - - function setBarDirection($direction) - { - $this->direction = $direction; - - if ($this->status!='new') { - $this->position = $this->_calculatePosition($this->step); - - echo ''."\n"; - flush(); - } - } - - function getHtml() - { - $html = ''; - $js = ''; - - $this->_setStep($this->step); - $this->position = $this->_calculatePosition($this->step); - - $style_brd = 'position:absolute;top:'.$this->top.'px;left:'.$this->left.'px;width:'.$this->width.'px;height:'.$this->height.'px;background:'.$this->bgr_color.';'; - if ($this->border>0) {$style_brd .= 'border:'.$this->border.'px solid;border-color:'.$this->brd_color.';';} - - $style_bar = 'position:absolute;top:'.$this->position['top'].'px;left:'.$this->position['left'].'px;'.'width:'.$this->position['width'].'px;height:'.$this->position['height'].'px;background:'.$this->color.';'; - - if ($this->frame['show']==true) { - if ($this->frame['border']>0) {$border = 'border:'.$this->frame['border'].'px solid;border-color:'.$this->frame['brd_color'].';';} - $html = '

'."\n"; - } - - $html .= '
'."\n"; - $html .= '
'."\n"; - - $js .= 'function PBposition'.$this->code.'(item,pixel) {'."\n"; - $js .= ' pixel = parseInt(pixel);'."\n"; - $js .= ' switch(item) {'."\n"; - $js .= ' case "left": document.getElementById("pbar'.$this->code.'").style.left=(pixel) + \'px\'; break;'."\n"; - $js .= ' case "top": document.getElementById("pbar'.$this->code.'").style.top=(pixel) + \'px\'; break;'."\n"; - $js .= ' case "width": document.getElementById("pbar'.$this->code.'").style.width=(pixel) + \'px\'; break;'."\n"; - $js .= ' case "height": document.getElementById("pbar'.$this->code.'").style.height=(pixel) + \'px\'; break;'."\n"; - $js .= ' }'."\n"; - $js .= '}'."\n"; - - foreach($this->label as $name => $data) { - $style_lbl = 'position:absolute;top:'.$data['top'].'px;left:'.$data['left'].'px;text-align:'.$data['align'].';'; - if ($data['width']>0) {$style_lbl .= 'width:'.$data['width'].'px;';} - if ($data['height']>0) {$style_lbl .= 'height:'.$data['height'].'px;';} - - if (array_key_exists('font-size', $data)) {$style_lbl .= 'font-size:'.$data['font-size'].'px;';} - if (array_key_exists('font-family', $data)) {$style_lbl .= 'font-family:'.$data['font-family'].';';} - if (array_key_exists('font-weight', $data)) {$style_lbl .= 'font-weight:'.$data['font-weight'].';';} - if (array_key_exists('bgr_color', $data) && ($data['bgr_color']!='')) {$style_lbl .= 'background:'.$data['bgr_color'].';';} - - if (array_key_exists('type', $data)) { - switch ($data['type']) { - case 'text': - $html .= '
'.$data['value'].'
'."\n"; - break; - case 'button': - $html .= '
'."\n"; - break; - case 'step': - $html .= '
'.$this->step.'
'."\n"; - break; - case 'percent': - $html .= '
'.$this->_calculatePercent($this->step).'%
'."\n"; - break; - case 'crossbar': - $html .= '
'.$data['value'].'
'."\n"; - - $js .= 'function PBrotaryCross'.$name.$this->code.'() {'."\n"; - $js .= ' cross = document.getElementById("plbl'.$name.$this->code.'").firstChild.nodeValue;'."\n"; - $js .= ' switch(cross) {'."\n"; - $js .= ' case "--": cross = "\\\\"; break;'."\n"; - $js .= ' case "\\\\": cross = "|"; break;'."\n"; - $js .= ' case "|": cross = "/"; break;'."\n"; - $js .= ' default: cross = "--"; break;'."\n"; - $js .= ' }'."\n"; - $js .= ' document.getElementById("plbl'.$name.$this->code.'").firstChild.nodeValue = cross;'."\n"; - $js .= '}'."\n"; - break; - } - } - } - - if(count($this->label)>0) { - - $js .= 'function PBlabelText'.$this->code.'(name,text) {'."\n"; - $js .= ' name = "plbl" + name + "'.$this->code.'";'."\n"; - $js .= ' document.getElementById(name).firstChild.nodeValue=text;'."\n"; - $js .= '}'."\n"; - } - - if ($this->frame['show']==true) { - $html .= '
'."\n"; - } - - $html .= ''."\n"; - - return $html; - } - - function show() - { - $this->status = 'show'; - echo $this->getHtml(); - flush(); - } - - function moveStep($step) - { - $last_step = $this->step; - $this->_setStep($step); - - $js = ''; - - $new_position = $this->_calculatePosition($this->step); - if ($new_position['width']!=$this->position['width'] && ($this->direction=='right' || $this->direction=='left')) { - if ($this->direction=='left') { - $js .= 'PBposition'.$this->code.'("left",'.$new_position['left'].');'; - } - $js .= 'PBposition'.$this->code.'("width",'.$new_position['width'].');'; - } - if ($new_position['height']!=$this->position['height'] && ($this->direction=='up' || $this->direction=='down')) { - if ($this->direction=='up') { - $js .= 'PBposition'.$this->code.'("top",'.$new_position['top'].');'; - } - $js .= 'PBposition'.$this->code.'("height",'.$new_position['height'].');'; - } - $this->position = $new_position; - - foreach($this->label as $name => $data) { - if (array_key_exists('type', $data)) { - switch($data['type']) { - case 'step': - if ($this->step!=$last_step) { - $js .= 'PBlabelText'.$this->code.'("'.$name.'","'.$this->step.'/'.$this->max.'");'; - } - break; - case 'percent': - $percent = $this->_calculatePercent($this->step); - if ($percent!=$this->_calculatePercent($last_step)) { - $js .= 'PBlabelText'.$this->code.'("'.$name.'","'.$percent.'%");'; - } - break; - case 'crossbar': - $js .= 'PBrotaryCross'.$name.$this->code.'();'; - break; - } - } - } - if ($js!='') { - echo ''."\n"; - flush (); - } - } - - function moveNext() - { - $this->moveStep($this->step + 1); - } - - function moveMin() - { - $this->moveStep($this->min); - } - - function hide() - { - if ($this->status=='show') { - $this->status = 'hide'; - - echo ''."\n"; - flush(); - } - } - - function unhide() - { - if ($this->status=='hide') { - $this->status = 'show'; - - echo ''."\n"; - flush(); - } - } - -} -?> diff --git a/include/limesurvey/admin/classes/core/domxml-php4-to-php5.php b/include/limesurvey/admin/classes/core/domxml-php4-to-php5.php deleted file mode 100644 index dc733e21..00000000 --- a/include/limesurvey/admin/classes/core/domxml-php4-to-php5.php +++ /dev/null @@ -1,483 +0,0 @@ -=5.1 for XPath evaluation functions, and PHP>=5.1/libxml for DOMXML error reports) - - Typical use: - { - if (version_compare(PHP_VERSION,'5','>=')) - require_once('domxml-php4-to-php5.php'); - } - - Version 1.19, 2007-09-30, http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/ - - ------------------------------------------------------------------ - Written by Alexandre Alapetite, http://alexandre.alapetite.net/cv/ - - Copyright 2004-2007, Licence: Creative Commons "Attribution-ShareAlike 2.0 France" BY-SA (FR), - http://creativecommons.org/licenses/by-sa/2.0/fr/ - http://alexandre.alapetite.net/divers/apropos/#by-sa - - Attribution. You must give the original author credit - - Share Alike. If you alter, transform, or build upon this work, - you may distribute the resulting work only under a license identical to this one - (Can be included in GPL/LGPL projects) - - The French law is authoritative - - Any of these conditions can be waived if you get permission from Alexandre Alapetite - - Please send to Alexandre Alapetite the modifications you make, - in order to improve this file for the benefit of everybody - - If you want to distribute this code, please do it as a link to: - http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/ - */ -@ini_set('zend.ze1_compatibility_mode', '0'); -define('DOMXML_LOAD_PARSING',0); -define('DOMXML_LOAD_VALIDATING',1); -define('DOMXML_LOAD_RECOVERING',2); -define('DOMXML_LOAD_SUBSTITUTE_ENTITIES',4); -//define('DOMXML_LOAD_COMPLETE_ATTRS',8); -define('DOMXML_LOAD_DONT_KEEP_BLANKS',16); - -function domxml_new_doc($version) {return new php4DOMDocument();} -function domxml_new_xmldoc($version) {return new php4DOMDocument();} -function domxml_open_file($filename,$mode=DOMXML_LOAD_PARSING,&$error=null) -{ - $dom=new php4DOMDocument($mode); - $errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION'); - if ($errorMode) libxml_use_internal_errors(true); - if (!$dom->myDOMNode->load($filename)) $dom=null; - if ($errorMode) - { - $error=array_map('_error_report',libxml_get_errors()); - libxml_clear_errors(); - } - return $dom; -} -function domxml_open_mem($str,$mode=DOMXML_LOAD_PARSING,&$error=null) -{ - $dom=new php4DOMDocument($mode); - $errorMode=(func_num_args()>2)&&defined('LIBXML_VERSION'); - if ($errorMode) libxml_use_internal_errors(true); - if (!$dom->myDOMNode->loadXML($str)) $dom=null; - if ($errorMode) - { - $error=array_map('_error_report',libxml_get_errors()); - libxml_clear_errors(); - } - return $dom; -} -function html_doc($html_doc,$from_file=false) -{ - $dom=new php4DOMDocument(); - if ($from_file) $result=$dom->myDOMNode->loadHTMLFile($html_doc); - else $result=$dom->myDOMNode->loadHTML($html_doc); - return $result ? $dom : null; -} -function html_doc_file($filename) {return html_doc($filename,true);} -function xmldoc($str) {return domxml_open_mem($str);} -function xmldocfile($filename) {return domxml_open_file($filename);} -function xpath_eval($xpath_context,$eval_str,$contextnode=null) {return $xpath_context->xpath_eval($eval_str,$contextnode);} -function xpath_new_context($dom_document) {return new php4DOMXPath($dom_document);} -function xpath_register_ns($xpath_context,$prefix,$namespaceURI) {return $xpath_context->myDOMXPath->registerNamespace($prefix,$namespaceURI);} -function _entityDecode($text) {return html_entity_decode(strtr($text,array('''=>'\'')),ENT_QUOTES,'UTF-8');} -function _error_report($error) {return array('errormessage'=>$error->message,'nodename'=>'','line'=>$error->line,'col'=>$error->column)+($error->file==''?array():array('directory'=>dirname($error->file),'file'=>basename($error->file)));} - -class php4DOMAttr extends php4DOMNode -{ - function name() {return $this->myDOMNode->name;} - function set_content($text) {} - //function set_value($content) {return $this->myDOMNode->value=htmlspecialchars($content,ENT_QUOTES);} - function specified() {return $this->myDOMNode->specified;} - function value() {return $this->myDOMNode->value;} -} - -class php4DOMDocument extends php4DOMNode -{ - function php4DOMDocument($mode=DOMXML_LOAD_PARSING) - { - $this->myDOMNode=new DOMDocument(); - $this->myOwnerDocument=$this; - if ($mode & DOMXML_LOAD_VALIDATING) $this->myDOMNode->validateOnParse=true; - if ($mode & DOMXML_LOAD_RECOVERING) $this->myDOMNode->recover=true; - if ($mode & DOMXML_LOAD_SUBSTITUTE_ENTITIES) $this->myDOMNode->substituteEntities=true; - if ($mode & DOMXML_LOAD_DONT_KEEP_BLANKS) $this->myDOMNode->preserveWhiteSpace=false; - } - function add_root($name) - { - if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild); - return new php4DOMElement($this->myDOMNode->appendChild($this->myDOMNode->createElement($name)),$this->myOwnerDocument); - } - function create_attribute($name,$value) - { - $myAttr=$this->myDOMNode->createAttribute($name); - $myAttr->value=htmlspecialchars($value,ENT_QUOTES); - return new php4DOMAttr($myAttr,$this); - } - function create_cdata_section($content) {return new php4DOMNode($this->myDOMNode->createCDATASection($content),$this);} - function create_comment($data) {return new php4DOMNode($this->myDOMNode->createComment($data),$this);} - function create_element($name) {return new php4DOMElement($this->myDOMNode->createElement($name),$this);} - function create_element_ns($uri,$name,$prefix=null) - { - if ($prefix==null) $prefix=$this->myDOMNode->lookupPrefix($uri); - if (($prefix==null)&&(($this->myDOMNode->documentElement==null)||(!$this->myDOMNode->documentElement->isDefaultNamespace($uri)))) $prefix='a'.sprintf('%u',crc32($uri)); - return new php4DOMElement($this->myDOMNode->createElementNS($uri,$prefix==null ? $name : $prefix.':'.$name),$this); - } - function create_entity_reference($content) {return new php4DOMNode($this->myDOMNode->createEntityReference($content),$this);} //By Walter Ebert 2007-01-22 - function create_processing_instruction($target,$data=''){return new php4DomProcessingInstruction($this->myDOMNode->createProcessingInstruction($target,$data),$this);} - function create_text_node($content) {return new php4DOMText($this->myDOMNode->createTextNode($content),$this);} - function document_element() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);} - function dump_file($filename,$compressionmode=false,$format=false) - { - $format0=$this->myDOMNode->formatOutput; - $this->myDOMNode->formatOutput=$format; - $res=$this->myDOMNode->save($filename); - $this->myDOMNode->formatOutput=$format0; - return $res; - } - function dump_mem($format=false,$encoding=false) - { - $format0=$this->myDOMNode->formatOutput; - $this->myDOMNode->formatOutput=$format; - $encoding0=$this->myDOMNode->encoding; - if ($encoding) $this->myDOMNode->encoding=$encoding; - $dump=$this->myDOMNode->saveXML(); - $this->myDOMNode->formatOutput=$format0; - if ($encoding) $this->myDOMNode->encoding= $encoding0=='' ? 'UTF-8' : $encoding0; //UTF-8 is XML default encoding - return $dump; - } - function free() - { - if ($this->myDOMNode->hasChildNodes()) $this->myDOMNode->removeChild($this->myDOMNode->firstChild); - $this->myDOMNode=null; - $this->myOwnerDocument=null; - } - function get_element_by_id($id) {return parent::_newDOMElement($this->myDOMNode->getElementById($id),$this);} - function get_elements_by_tagname($name) - { - $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name); - $nodeSet=array(); - $i=0; - if (isset($myDOMNodeList)) - while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this); - return $nodeSet; - } - function html_dump_mem() {return $this->myDOMNode->saveHTML();} - function root() {return parent::_newDOMElement($this->myDOMNode->documentElement,$this);} - function xpath_new_context() {return new php4DOMXPath($this);} -} - -class php4DOMElement extends php4DOMNode -{ - function add_namespace($uri,$prefix) - { - if ($this->myDOMNode->hasAttributeNS('http://www.w3.org/2000/xmlns/',$prefix)) return false; - else - { - $this->myDOMNode->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$prefix,$uri); //By Daniel Walker 2006-09-08 - return true; - } - } - function get_attribute($name) {return $this->myDOMNode->getAttribute($name);} - function get_attribute_node($name) {return parent::_newDOMElement($this->myDOMNode->getAttributeNode($name),$this->myOwnerDocument);} - function get_elements_by_tagname($name) - { - $myDOMNodeList=$this->myDOMNode->getElementsByTagName($name); - $nodeSet=array(); - $i=0; - if (isset($myDOMNodeList)) - while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMElement($node,$this->myOwnerDocument); - return $nodeSet; - } - function has_attribute($name) {return $this->myDOMNode->hasAttribute($name);} - function remove_attribute($name) {return $this->myDOMNode->removeAttribute($name);} - function set_attribute($name,$value) - { - //return $this->myDOMNode->setAttribute($name,$value); //Does not return a DomAttr - $myAttr=$this->myDOMNode->ownerDocument->createAttribute($name); - $myAttr->value=htmlspecialchars($value,ENT_QUOTES); //Entity problem reported by AL-DesignWorks 2007-09-07 - $this->myDOMNode->setAttributeNode($myAttr); - return new php4DOMAttr($myAttr,$this->myOwnerDocument); - } - /*function set_attribute_node($attr) - { - $this->myDOMNode->setAttributeNode($this->_importNode($attr)); - return $attr; - }*/ - function set_name($name) - { - if ($this->myDOMNode->prefix=='') $newNode=$this->myDOMNode->ownerDocument->createElement($name); - else $newNode=$this->myDOMNode->ownerDocument->createElementNS($this->myDOMNode->namespaceURI,$this->myDOMNode->prefix.':'.$name); - $myDOMNodeList=$this->myDOMNode->attributes; - $i=0; - if (isset($myDOMNodeList)) - while ($node=$myDOMNodeList->item($i++)) - if ($node->namespaceURI=='') $newNode->setAttribute($node->name,$node->value); - else $newNode->setAttributeNS($node->namespaceURI,$node->nodeName,$node->value); - $myDOMNodeList=$this->myDOMNode->childNodes; - if (isset($myDOMNodeList)) - while ($node=$myDOMNodeList->item(0)) $newNode->appendChild($node); - $this->myDOMNode->parentNode->replaceChild($newNode,$this->myDOMNode); - $this->myDOMNode=$newNode; - return true; - } - function tagname() {return $this->myDOMNode->tagName;} -} - -class php4DOMNode -{ - public $myDOMNode; - public $myOwnerDocument; - function php4DOMNode($aDomNode,$aOwnerDocument) - { - $this->myDOMNode=$aDomNode; - $this->myOwnerDocument=$aOwnerDocument; - } - function __get($name) - { - switch ($name) - { - case 'type': return $this->myDOMNode->nodeType; - case 'tagname': return $this->myDOMNode->tagName; //DomElement - case 'content': return $this->myDOMNode->textContent; - case 'name': return $this->myDOMNode->name; //DomAttribute - case 'value': return $this->myDOMNode->value; - default: - $myErrors=debug_backtrace(); - trigger_error('Undefined property: '.get_class($this).'::$'.$name.' ['.$myErrors[0]['file'].':'.$myErrors[0]['line'].']',E_USER_NOTICE); - return false; - } - } - function add_child($newnode) {return append_child($newnode);} - function add_namespace($uri,$prefix) {return false;} - function append_child($newnode) {return self::_newDOMElement($this->myDOMNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);} - function append_sibling($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->appendChild($this->_importNode($newnode)),$this->myOwnerDocument);} - function attributes() - { - $myDOMNodeList=$this->myDOMNode->attributes; - $nodeSet=array(); - $i=0; - if (isset($myDOMNodeList)) - while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=new php4DOMAttr($node,$this->myOwnerDocument); - return $nodeSet; - } - function child_nodes() - { - $myDOMNodeList=$this->myDOMNode->childNodes; - $nodeSet=array(); - $i=0; - if (isset($myDOMNodeList)) - while ($node=$myDOMNodeList->item($i++)) $nodeSet[]=self::_newDOMElement($node,$this->myOwnerDocument); - return $nodeSet; - } - function children() {return $this->child_nodes();} - function clone_node($deep=false) {return self::_newDOMElement($this->myDOMNode->cloneNode($deep),$this->myOwnerDocument);} - //dump_node($node) should only be called on php4DOMDocument - function dump_node($node=null) {return $node==null ? $this->myOwnerDocument->myDOMNode->saveXML($this->myDOMNode) : $this->myOwnerDocument->myDOMNode->saveXML($node->myDOMNode);} - function first_child() {return self::_newDOMElement($this->myDOMNode->firstChild,$this->myOwnerDocument);} - function get_content() {return $this->myDOMNode->textContent;} - function has_attributes() {return $this->myDOMNode->hasAttributes();} - function has_child_nodes() {return $this->myDOMNode->hasChildNodes();} - function insert_before($newnode,$refnode) {return self::_newDOMElement($this->myDOMNode->insertBefore($this->_importNode($newnode),$refnode==null?null:$refnode->myDOMNode),$this->myOwnerDocument);} - function is_blank_node() {return ($this->myDOMNode->nodeType===XML_TEXT_NODE)&&preg_match('%^\s*$%',$this->myDOMNode->nodeValue);} - function last_child() {return self::_newDOMElement($this->myDOMNode->lastChild,$this->myOwnerDocument);} - function new_child($name,$content) - { - $mySubNode=$this->myDOMNode->ownerDocument->createElement($name); - $mySubNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($content))); - $this->myDOMNode->appendChild($mySubNode); - return new php4DOMElement($mySubNode,$this->myOwnerDocument); - } - function next_sibling() {return self::_newDOMElement($this->myDOMNode->nextSibling,$this->myOwnerDocument);} - function node_name() {return ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) ? $this->myDOMNode->localName : $this->myDOMNode->nodeName;} //Avoid namespace prefix for DOMElement - function node_type() {return $this->myDOMNode->nodeType;} - function node_value() {return $this->myDOMNode->nodeValue;} - function owner_document() {return $this->myOwnerDocument;} - function parent_node() {return self::_newDOMElement($this->myDOMNode->parentNode,$this->myOwnerDocument);} - function prefix() {return $this->myDOMNode->prefix;} - function previous_sibling() {return self::_newDOMElement($this->myDOMNode->previousSibling,$this->myOwnerDocument);} - function remove_child($oldchild) {return self::_newDOMElement($this->myDOMNode->removeChild($oldchild->myDOMNode),$this->myOwnerDocument);} - function replace_child($newnode,$oldnode) {return self::_newDOMElement($this->myDOMNode->replaceChild($this->_importNode($newnode),$oldnode->myDOMNode),$this->myOwnerDocument);} - function replace_node($newnode) {return self::_newDOMElement($this->myDOMNode->parentNode->replaceChild($this->_importNode($newnode),$this->myDOMNode),$this->myOwnerDocument);} - function set_content($text) {return $this->myDOMNode->appendChild($this->myDOMNode->ownerDocument->createTextNode(_entityDecode($text)));} //Entity problem reported by AL-DesignWorks 2007-09-07 - //function set_name($name) {return $this->myOwnerDocument->renameNode($this->myDOMNode,$this->myDOMNode->namespaceURI,$name);} - function set_namespace($uri,$prefix=null) - {//Contributions by Daniel Walker 2006-09-08 - $nsprefix=$this->myDOMNode->lookupPrefix($uri); - if ($nsprefix==null) - { - $nsprefix= $prefix==null ? $nsprefix='a'.sprintf('%u',crc32($uri)) : $prefix; - if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) - { - if (($prefix!=null)&&$this->myDOMNode->ownerElement->hasAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)&& - ($this->myDOMNode->ownerElement->getAttributeNS('http://www.w3.org/2000/xmlns/',$nsprefix)!=$uri)) - {//Remove namespace - $parent=$this->myDOMNode->ownerElement; - $parent->removeAttributeNode($this->myDOMNode); - $parent->setAttribute($this->myDOMNode->localName,$this->myDOMNode->nodeValue); - $this->myDOMNode=$parent->getAttributeNode($this->myDOMNode->localName); - return; - } - $this->myDOMNode->ownerElement->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:'.$nsprefix,$uri); - } - } - if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) - { - $parent=$this->myDOMNode->ownerElement; - $parent->removeAttributeNode($this->myDOMNode); - $parent->setAttributeNS($uri,$nsprefix.':'.$this->myDOMNode->localName,$this->myDOMNode->nodeValue); - $this->myDOMNode=$parent->getAttributeNodeNS($uri,$this->myDOMNode->localName); - } - elseif ($this->myDOMNode->nodeType===XML_ELEMENT_NODE) - { - $NewNode=$this->myDOMNode->ownerDocument->createElementNS($uri,$nsprefix.':'.$this->myDOMNode->localName); - foreach ($this->myDOMNode->attributes as $n) $NewNode->appendChild($n->cloneNode(true)); - foreach ($this->myDOMNode->childNodes as $n) $NewNode->appendChild($n->cloneNode(true)); - $xpath=new DOMXPath($this->myDOMNode->ownerDocument); - $myDOMNodeList=$xpath->query('namespace::*[name()!="xml"]',$this->myDOMNode); //Add old namespaces - foreach ($myDOMNodeList as $n) $NewNode->setAttributeNS('http://www.w3.org/2000/xmlns/',$n->nodeName,$n->nodeValue); - $this->myDOMNode->parentNode->replaceChild($NewNode,$this->myDOMNode); - $this->myDOMNode=$NewNode; - } - } - function unlink_node() - { - if ($this->myDOMNode->parentNode!=null) - { - if ($this->myDOMNode->nodeType===XML_ATTRIBUTE_NODE) $this->myDOMNode->parentNode->removeAttributeNode($this->myDOMNode); - else $this->myDOMNode->parentNode->removeChild($this->myDOMNode); - } - } - protected function _importNode($newnode) {return $this->myOwnerDocument===$newnode->myOwnerDocument ? $newnode->myDOMNode : $this->myOwnerDocument->myDOMNode->importNode($newnode->myDOMNode,true);} //To import DOMNode from another DOMDocument - static function _newDOMElement($aDOMNode,$aOwnerDocument) - {//Check the PHP5 DOMNode before creating a new associated PHP4 DOMNode wrapper - if ($aDOMNode==null) return null; - switch ($aDOMNode->nodeType) - { - case XML_ELEMENT_NODE: return new php4DOMElement($aDOMNode,$aOwnerDocument); - case XML_TEXT_NODE: return new php4DOMText($aDOMNode,$aOwnerDocument); - case XML_ATTRIBUTE_NODE: return new php4DOMAttr($aDOMNode,$aOwnerDocument); - case XML_PI_NODE: return new php4DomProcessingInstruction($aDOMNode,$aOwnerDocument); - default: return new php4DOMNode($aDOMNode,$aOwnerDocument); - } - } -} - -class php4DomProcessingInstruction extends php4DOMNode -{ - function data() {return $this->myDOMNode->data;} - function target() {return $this->myDOMNode->target;} -} - -class php4DOMText extends php4DOMNode -{ - function __get($name) - { - if ($name==='tagname') return '#text'; - else return parent::__get($name); - } - function tagname() {return '#text';} - function set_content($text) {$this->myDOMNode->nodeValue=$text; return true;} -} - -if (!defined('XPATH_NODESET')) -{ - define('XPATH_UNDEFINED',0); - define('XPATH_NODESET',1); - define('XPATH_BOOLEAN',2); - define('XPATH_NUMBER',3); - define('XPATH_STRING',4); - /*define('XPATH_POINT',5); - define('XPATH_RANGE',6); - define('XPATH_LOCATIONSET',7); - define('XPATH_USERS',8); - define('XPATH_XSLT_TREE',9);*/ -} - -class php4DOMNodelist -{ - private $myDOMNodelist; - public $nodeset; - public $type; - public $value; - function php4DOMNodelist($aDOMNodelist,$aOwnerDocument) - { - if (is_object($aDOMNodelist)||is_array($aDOMNodelist)) - { - $this->myDOMNodelist=$aDOMNodelist; - $this->nodeset=array(); - if (isset($this->myDOMNodelist)) - { - $this->type=XPATH_NODESET; - $i=0; - while ($node=$this->myDOMNodelist->item($i++)) $this->nodeset[]=php4DOMNode::_newDOMElement($node,$aOwnerDocument); - } - else $this->type=XPATH_UNDEFINED; - } - elseif (is_int($aDOMNodelist)||is_float($aDOMNodelist)) - { - $this->type=XPATH_NUMBER; - $this->value=$aDOMNodelist; - } - elseif (is_bool($aDOMNodelist)) - { - $this->type=XPATH_BOOLEAN; - $this->value=$aDOMNodelist; - } - elseif (is_string($aDOMNodelist)) - { - $this->type=XPATH_STRING; - $this->value=$aDOMNodelist; - } - else $this->type=XPATH_UNDEFINED; - } -} - -class php4DOMXPath -{ - public $myDOMXPath; - private $myOwnerDocument; - function php4DOMXPath($dom_document) - { - //TODO: If $dom_document is a DomElement, make that default $contextnode and modify XPath. Ex: '/test' - $this->myOwnerDocument=$dom_document->myOwnerDocument; - $this->myDOMXPath=new DOMXPath($this->myOwnerDocument->myDOMNode); - } - function xpath_eval($eval_str,$contextnode=null) - { - if (method_exists($this->myDOMXPath,'evaluate')) - return isset($contextnode) ? new php4DOMNodelist($this->myDOMXPath->evaluate($eval_str,$contextnode->myDOMNode),$this->myOwnerDocument) : new php4DOMNodelist($this->myDOMXPath->evaluate($eval_str),$this->myOwnerDocument); - else return isset($contextnode) ? new php4DOMNodelist($this->myDOMXPath->query($eval_str,$contextnode->myDOMNode),$this->myOwnerDocument) : new php4DOMNodelist($this->myDOMXPath->query($eval_str),$this->myOwnerDocument); - } - function xpath_register_ns($prefix,$namespaceURI) {return $this->myDOMXPath->registerNamespace($prefix,$namespaceURI);} -} - -if (extension_loaded('xsl')) -{//See also: http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/ -function domxml_xslt_stylesheet($xslstring) {return new php4DomXsltStylesheet(DOMDocument::loadXML($xslstring));} -function domxml_xslt_stylesheet_doc($dom_document) {return new php4DomXsltStylesheet($dom_document);} -function domxml_xslt_stylesheet_file($xslfile) {return new php4DomXsltStylesheet(DOMDocument::load($xslfile));} -class php4DomXsltStylesheet -{ - private $myxsltProcessor; - function php4DomXsltStylesheet($dom_document) - { - $this->myxsltProcessor=new xsltProcessor(); - $this->myxsltProcessor->importStyleSheet($dom_document); - } - function process($dom_document,$xslt_parameters=array(),$param_is_xpath=false) - { - foreach ($xslt_parameters as $param=>$value) $this->myxsltProcessor->setParameter('',$param,$value); - $myphp4DOMDocument=new php4DOMDocument(); - $myphp4DOMDocument->myDOMNode=$this->myxsltProcessor->transformToDoc($dom_document->myDOMNode); - return $myphp4DOMDocument; - } - function result_dump_file($dom_document,$filename) - { - $html=$dom_document->myDOMNode->saveHTML(); - file_put_contents($filename,$html); - return $html; - } - function result_dump_mem($dom_document) {return $dom_document->myDOMNode->saveHTML();} -} -} -?> diff --git a/include/limesurvey/admin/classes/core/settingsstorage.php b/include/limesurvey/admin/classes/core/settingsstorage.php deleted file mode 100644 index d3bb7c11..00000000 --- a/include/limesurvey/admin/classes/core/settingsstorage.php +++ /dev/null @@ -1,54 +0,0 @@ -offsetExists($index)) { - throw new Exception("No entry is registered for key '$index'"); - } - - return $instance->offsetGet($index); - } - - public static function set($index, $value) - { - $instance = self::getInstance(); - $instance->offsetSet($index, $value); - } - - public static function isRegistered($index) - { - if (self::$_instance === null) { - return false; - } - return self::$_instance->offsetExists($index); - } - - /** - * Workaround for http://bugs.php.net/bug.php?id=40442 (ZF-960). - */ - public function offsetExists($index) - { - return array_key_exists($index, $this); - } - - -} -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/gtranslate/COPYING b/include/limesurvey/admin/classes/gtranslate/COPYING deleted file mode 100644 index 94a9ed02..00000000 --- a/include/limesurvey/admin/classes/gtranslate/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/include/limesurvey/admin/classes/gtranslate/GTranslate.php b/include/limesurvey/admin/classes/gtranslate/GTranslate.php deleted file mode 100644 index c5473395..00000000 --- a/include/limesurvey/admin/classes/gtranslate/GTranslate.php +++ /dev/null @@ -1,320 +0,0 @@ -. -* -* @author Jose da Silva -* @since 2009/11/18 -* @version 0.7.4 -* @licence LGPL v3 -* -* -* english_to_german("hello world"); -* } catch (GTranslateException $ge) -* { -* echo $ge->getMessage(); -* } -* ?> -* -*/ - - -/** -* Exception class for GTranslated Exceptions -*/ - -class GTranslateException extends Exception -{ - public function __construct($string) { - parent::__construct($string, 0); - } - - public function __toString() { - return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; - } -} - -class GTranslate -{ - /** - * Google Translate(TM) Api endpoint - * @access private - * @var String - */ - private $url = "https://www.googleapis.com/language/translate/v2"; - - /** - * Google Translate (TM) Api Version - * @access private - * @var String - */ - private $api_version = "2"; - - /** - * Comunication Transport Method - * Available: http / curl - * @access private - * @var String - */ - private $request_type = "http"; - - /** - * Path to available languages file - * @access private - * @var String - */ - private $available_languages_file = "languages.ini"; - - /** - * Holder to the parse of the ini file - * @access private - * @var Array - */ - private $available_languages = array(); - - /** - * Google Translate api key - * @access private - * @var string - */ - private $api_key = null; - - /** - * Google request User IP - * @access private - * @var string - */ - private $user_ip = null; - - /** - * Constructor sets up {@link $available_languages} - */ - public function __construct() - { - $this->available_languages = parse_ini_file("languages.ini"); - } - - /** - * URL Formater to use on request - * @access private - * @param array $lang_pair - * @param array $string - * "returns String $url - */ - - private function urlFormat($lang_pair,$string) - { - $parameters = array( - "q" => $string, - "source" => $lang_pair[0], - "target" => $lang_pair[1], - ); - - if(!empty($this->api_key)) - { - $parameters["key"] = $this->api_key; - } - else - { - $parameters["key"] = getGlobalSetting('googletranslateapikey'); - } - - $url = ""; - - foreach($parameters as $k=>$p) - { - $url .= $k."=".urlencode($p)."&"; - } - return $url; - } - - /** - * Define the request type - * @access public - * @param string $request_type - * return boolean - */ - public function setRequestType($request_type = 'http') { - if (!empty($request_type)) { - $this->request_type = $request_type; - return true; - } - return false; - } - - /** - * Define the Google Translate Api Key - * @access public - * @param string $api_key - * return boolean - */ - public function setApiKey($api_key) { - if (!empty($api_key)) { - $this->api_key = $api_key; - return true; - } - return false; - } - - /** - * Define the User Ip for the query - * @access public - * @param string $ip - * return boolean - */ - public function setUserIp($ip) { - if (!empty($ip)) { - $this->user_ip = $ip; - return true; - } - return false; - } - - /** - * Query the Google(TM) endpoint - * @access private - * @param array $lang_pair - * @param array $string - * returns String $response - */ - - public function query($lang_pair,$string) - { - $query_url = $this->urlFormat($lang_pair,$string); - $response = $this->{"request".ucwords($this->request_type)}($query_url); - return $response; - } - - /** - * Query Wrapper for Http Transport - * @access private - * @param String $url - * returns String $response - */ - - private function requestHttp($url) - { - $fullurl = $this->url."?".$url; - $return = file_get_contents($fullurl); - $json = json_decode($return); - return GTranslate::evalResponse($json); - } - - /** - * Query Wrapper for Curl Transport - * @access private - * @param String $url - * returns String $response - */ - - private function requestCurl($url) - { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $this->url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_REFERER, !empty($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : ""); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, $url); - $body = curl_exec($ch); - curl_close($ch); - return GTranslate::evalResponse(json_decode($body)); - } - - /** - * Response Evaluator, validates the response - * Throws an exception on error - * @access private - * @param String $json_response - * returns String $response - */ - - private function evalResponse($json_response) - { - if (isset($json_response->data->translations)) - { - return $json_response->data->translations[0]->translatedText; - } - else - { - throw new GTranslateException("Unable to perform Translation:".$json_response->data); - } - } - - - /** - * Validates if the language pair is valid - * Throws an exception on error - * @access private - * @param Array $languages - * returns Array $response Array with formated languages pair - */ - - private function isValidLanguage($languages) - { - $language_list = $this->available_languages; - - $languages = array_map( "strtolower", $languages ); - $language_list_v = array_map( "strtolower", array_values($language_list) ); - $language_list_k = array_map( "strtolower", array_keys($language_list) ); - $valid_languages = false; - if( TRUE == in_array($languages[0],$language_list_v) AND TRUE == in_array($languages[1],$language_list_v) ) - { - $valid_languages = true; - } - - if( FALSE === $valid_languages AND TRUE == in_array($languages[0],$language_list_k) AND TRUE == in_array($languages[1],$language_list_k) ) - { - $languages = array($language_list[strtoupper($languages[0])],$language_list[strtoupper($languages[1])]); - $valid_languages = true; - } - - if( FALSE === $valid_languages ) - { - throw new GTranslateException("Unsupported languages"); - } - - return $languages; - } - - /** - * Magic method to understande translation comman - * Evaluates methods like language_to_language - * @access public - * @param String $name - * @param Array $args - * returns String $response Translated Text - */ - - - public function __call($name,$args) - { - $languages_list = explode("_to_",strtolower($name)); - $languages = $this->isValidLanguage($languages_list); - - $string = $args[0]; - - return $this->query($languages,$string); - } -} - -?> diff --git a/include/limesurvey/admin/classes/gtranslate/languages.ini b/include/limesurvey/admin/classes/gtranslate/languages.ini deleted file mode 100644 index d7a7bf76..00000000 --- a/include/limesurvey/admin/classes/gtranslate/languages.ini +++ /dev/null @@ -1,110 +0,0 @@ -AFRIKAANS = af -ALBANIAN = sq -AMHARIC = am -ARABIC = ar -ARMENIAN = hy -AZERBAIJANI = az -BASQUE = eu -BELARUSIAN = be -BENGALI = bn -BIHARI = bh -BRETON = br -BULGARIAN = bg -BURMESE = my -CATALAN = ca -CHEROKEE = chr -CHINESE = zh -CHINESE_SIMPLIFIED = zh-Hans -CHINESE_TRADITIONAL = zh-Hant -CORSICAN = co -CROATIAN = hr -CZECH = cs -DANISH = da -DHIVEHI = dv -DUTCH = nl -ENGLISH = en -ESPERANTO = eo -ESTONIAN = et -FAROESE = fo -FILIPINO = tl -FINNISH = fi -FRENCH = fr -FRISIAN = fy -GALICIAN = gl -GEORGIAN = ka -GERMAN = de -GERMAN INFORMAL= de-informal -GREEK = el -GUJARATI = gu -HAITIAN_CREOLE = ht -HEBREW = iw -HINDI = hi -HUNGARIAN = hu -ICELANDIC = is -INDONESIAN = id -INUKTITUT = iu -IRISH = ga -ITALIAN = it -JAPANESE = ja -JAVANESE = jw -KANNADA = kn -KAZAKH = kk -KHMER = km -KOREAN = ko -KURDISH = ku -KYRGYZ = ky -LAO = lo -LATIN = la -LATVIAN = lv -LITHUANIAN = lt -LUXEMBOURGISH = lb -MACEDONIAN = mk -MALAY = ms -MALAYALAM = ml -MALTESE = mt -MAORI = mi -MARATHI = mr -MONGOLIAN = mn -NEPALI = ne -NORWEGIAN = no -NORWEGIAN NYNORSK = nn -NORWEGIAN BOKMAL = nb -OCCITAN = oc -ORIYA = or -PASHTO = ps -PERSIAN = fa -POLISH = pl -PORTUGUESE = pt -PORTUGUESE_PORTUGAL = pt-PT -PUNJABI = pa -QUECHUA = qu -ROMANIAN = ro -RUSSIAN = ru -SANSKRIT = sa -SCOTS_GAELIC = gd -SERBIAN = sr -SINDHI = sd -SINHALESE = si -SLOVAK = sk -SLOVENIAN = sl -SPANISH = es -SUNDANESE = su -SWAHILI = sw -SWEDISH = sv -SYRIAC = syr -TAJIK = tg -TAMIL = ta -TATAR = tt -TELUGU = te -THAI = th -TIBETAN = bo -TONGA = to -TURKISH = tr -UKRAINIAN = uk -URDU = ur -UZBEK = uz -UIGHUR = ug -VIETNAMESE = vi -WELSH = cy -YIDDISH = yi -YORUBA = yo diff --git a/include/limesurvey/admin/classes/http/LICENSE.txt b/include/limesurvey/admin/classes/http/LICENSE.txt deleted file mode 100644 index 29e83e17..00000000 --- a/include/limesurvey/admin/classes/http/LICENSE.txt +++ /dev/null @@ -1,36 +0,0 @@ -HTTP client PHP class - -This LICENSE is in the BSD license style. - -License Version Control: -@(#) $Id: LICENSE.txt,v 1.1 2006/04/17 19:44:04 mlemos Exp $ - -Copyright (c) 1999 - 2006, Manuel Lemos -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 Manuel Lemos nor the names of his 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 REGENTS 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/include/limesurvey/admin/classes/http/http.php b/include/limesurvey/admin/classes/http/http.php deleted file mode 100644 index 84035f75..00000000 --- a/include/limesurvey/admin/classes/http/http.php +++ /dev/null @@ -1,1982 +0,0 @@ -"01", - "Feb"=>"02", - "Mar"=>"03", - "Apr"=>"04", - "May"=>"05", - "Jun"=>"06", - "Jul"=>"07", - "Aug"=>"08", - "Sep"=>"09", - "Oct"=>"10", - "Nov"=>"11", - "Dec"=>"12"); - var $session=''; - var $connection_close=0; - - /* Private methods - DO NOT CALL */ - - Function Tokenize($string,$separator="") - { - if(!strcmp($separator,"")) - { - $separator=$string; - $string=$this->next_token; - } - for($character=0;$characternext_token=substr($string,$found+1); - return(substr($string,0,$found)); - } - else - { - $this->next_token=""; - return($string); - } - } - - Function CookieEncode($value, $name) - { - return($name ? str_replace("=", "%25", $value) : str_replace(";", "%3B", $value)); - } - - Function SetError($error) - { - return($this->error=$error); - } - - Function SetPHPError($error, &$php_error_message) - { - if(IsSet($php_error_message) - && strlen($php_error_message)) - $error.=": ".$php_error_message; - return($this->SetError($error)); - } - - Function SetDataAccessError($error,$check_connection=0) - { - $this->error=$error; - if(!$this->use_curl - && function_exists("socket_get_status")) - { - $status=socket_get_status($this->connection); - if($status["timed_out"]) - $this->error.=": data access time out"; - elseif($status["eof"]) - { - if($check_connection) - $this->error=""; - else - $this->error.=": the server disconnected"; - } - } - } - - Function OutputDebug($message) - { - $message.="\n"; - if($this->html_debug) - $message=str_replace("\n","
\n",HtmlEntities($message)); - echo $message; - flush(); - } - - Function GetLine() - { - for($line="";;) - { - if($this->use_curl) - { - $eol=strpos($this->response,"\n",$this->read_response); - $data=($eol ? substr($this->response,$this->read_response,$eol+1-$this->read_response) : ""); - $this->read_response+=strlen($data); - } - else - { - if(feof($this->connection)) - { - $this->SetDataAccessError("reached the end of data while reading from the HTTP server connection"); - return(0); - } - $data=fgets($this->connection,100); - } - if(GetType($data)!="string" - || strlen($data)==0) - { - $this->SetDataAccessError("it was not possible to read line from the HTTP server"); - return(0); - } - $line.=$data; - $length=strlen($line); - if($length - && !strcmp(substr($line,$length-1,1),"\n")) - { - $length-=(($length>=2 && !strcmp(substr($line,$length-2,1),"\r")) ? 2 : 1); - $line=substr($line,0,$length); - if($this->debug) - $this->OutputDebug("S $line"); - return($line); - } - } - } - - Function PutLine($line) - { - if($this->debug) - $this->OutputDebug("C $line"); - if(!fputs($this->connection,$line."\r\n")) - { - $this->SetDataAccessError("it was not possible to send a line to the HTTP server"); - return(0); - } - return(1); - } - - Function PutData($data) - { - if(strlen($data)) - { - if($this->debug) - $this->OutputDebug('C '.$data); - if(!fputs($this->connection,$data)) - { - $this->SetDataAccessError("it was not possible to send data to the HTTP server"); - return(0); - } - } - return(1); - } - - Function FlushData() - { - if(!fflush($this->connection)) - { - $this->SetDataAccessError("it was not possible to send data to the HTTP server"); - return(0); - } - return(1); - } - - Function ReadChunkSize() - { - if($this->remaining_chunk==0) - { - $debug=$this->debug; - if(!$this->debug_response_body) - $this->debug=0; - $line=$this->GetLine(); - $this->debug=$debug; - if(GetType($line)!="string") - return($this->SetError("4 could not read chunk start: ".$this->error)); - $this->remaining_chunk=hexdec($line); - } - return(""); - } - - Function ReadBytes($length) - { - if($this->use_curl) - { - $bytes=substr($this->response,$this->read_response,min($length,strlen($this->response)-$this->read_response)); - $this->read_response+=strlen($bytes); - if($this->debug - && $this->debug_response_body - && strlen($bytes)) - $this->OutputDebug("S ".$bytes); - } - else - { - if($this->chunked) - { - for($bytes="",$remaining=$length;$remaining;) - { - if(strlen($this->ReadChunkSize())) - return(""); - if($this->remaining_chunk==0) - { - $this->last_chunk_read=1; - break; - } - $ask=min($this->remaining_chunk,$remaining); - $chunk=@fread($this->connection,$ask); - $read=strlen($chunk); - if($read==0) - { - $this->SetDataAccessError("it was not possible to read data chunk from the HTTP server"); - return(""); - } - if($this->debug - && $this->debug_response_body) - $this->OutputDebug("S ".$chunk); - $bytes.=$chunk; - $this->remaining_chunk-=$read; - $remaining-=$read; - if($this->remaining_chunk==0) - { - if(feof($this->connection)) - return($this->SetError("reached the end of data while reading the end of data chunk mark from the HTTP server")); - $data=@fread($this->connection,2); - if(strcmp($data,"\r\n")) - { - $this->SetDataAccessError("it was not possible to read end of data chunk from the HTTP server"); - return(""); - } - } - } - } - else - { - $bytes=@fread($this->connection,$length); - if(strlen($bytes)) - { - if($this->debug - && $this->debug_response_body) - $this->OutputDebug("S ".$bytes); - } - else - $this->SetDataAccessError("it was not possible to read data from the HTTP server", $this->connection_close); - } - } - return($bytes); - } - - Function EndOfInput() - { - if($this->use_curl) - return($this->read_response>=strlen($this->response)); - if($this->chunked) - return($this->last_chunk_read); - return(feof($this->connection)); - } - - Function Resolve($domain, &$ip, $server_type) - { - if(preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$domain)) - $ip=$domain; - else - { - if($this->debug) - $this->OutputDebug('Resolving '.$server_type.' server domain "'.$domain.'"...'); - if(!strcmp($ip=@gethostbyname($domain),$domain)) - $ip=""; - } - if(strlen($ip)==0 - || (strlen($this->exclude_address) - && !strcmp(@gethostbyname($this->exclude_address),$ip))) - return($this->SetError("could not resolve the host domain \"".$domain."\"")); - return(''); - } - - Function Connect($host_name, $host_port, $ssl, $server_type = 'HTTP') - { - $domain=$host_name; - $port = $host_port; - if(strlen($error = $this->Resolve($domain, $ip, $server_type))) - return($error); - if(strlen($this->socks_host_name)) - { - switch($this->socks_version) - { - case '4': - $version = 4; - break; - case '5': - $version = 5; - break; - default: - return('it was not specified a supported SOCKS protocol version'); - break; - } - $host_ip = $ip; - $port = $this->socks_host_port; - $host_server_type = $server_type; - $server_type = 'SOCKS'; - if(strlen($error = $this->Resolve($this->socks_host_name, $ip, $server_type))) - return($error); - } - if($this->debug) - $this->OutputDebug('Connecting to '.$server_type.' server IP '.$ip.' port '.$port.'...'); - if($ssl) - $ip="ssl://".$ip; - if(($this->connection=($this->timeout ? @fsockopen($ip, $port, $errno, $error, $this->timeout) : @fsockopen($ip, $port, $errno)))==0) - { - switch($errno) - { - case -3: - return($this->SetError("-3 socket could not be created")); - case -4: - return($this->SetError("-4 dns lookup on hostname \"".$host_name."\" failed")); - case -5: - return($this->SetError("-5 connection refused or timed out")); - case -6: - return($this->SetError("-6 fdopen() call failed")); - case -7: - return($this->SetError("-7 setvbuf() call failed")); - default: - return($this->SetPHPError($errno." could not connect to the host \"".$host_name."\"",$php_errormsg)); - } - } - else - { - if($this->data_timeout - && function_exists("socket_set_timeout")) - socket_set_timeout($this->connection,$this->data_timeout,0); - if(strlen($this->socks_host_name)) - { - if($this->debug) - $this->OutputDebug('Connected to the SOCKS server '.$this->socks_host_name); - $send_error = 'it was not possible to send data to the SOCKS server'; - $receive_error = 'it was not possible to receive data from the SOCKS server'; - switch($version) - { - case 4: - $command = 1; - if(!fputs($this->connection, chr($version).chr($command).pack('nN', $host_port, ip2long($host_ip)).$this->user.Chr(0))) - $error = $this->SetDataAccessError($send_error); - else - { - $response = fgets($this->connection, 9); - if(strlen($response) != 8) - $error = $this->SetDataAccessError($receive_error); - else - { - $socks_errors = array( - "\x5a"=>'', - "\x5b"=>'request rejected', - "\x5c"=>'request failed because client is not running identd (or not reachable from the server)', - "\x5d"=>'request failed because client\'s identd could not confirm the user ID string in the request', - ); - $error_code = $response[1]; - $error = (IsSet($socks_errors[$error_code]) ? $socks_errors[$error_code] : 'unknown'); - if(strlen($error)) - $error = 'SOCKS error: '.$error; - } - } - break; - case 5: - if($this->debug) - $this->OutputDebug('Negotiating the authentication method ...'); - $methods = 1; - $method = 0; - if(!fputs($this->connection, chr($version).chr($methods).chr($method))) - $error = $this->SetDataAccessError($send_error); - else - { - $response = fgets($this->connection, 3); - if(strlen($response) != 2) - $error = $this->SetDataAccessError($receive_error); - elseif(Ord($response[1]) != $method) - $error = 'the SOCKS server requires an authentication method that is not yet supported'; - else - { - if($this->debug) - $this->OutputDebug('Connecting to '.$host_server_type.' server IP '.$host_ip.' port '.$host_port.'...'); - $command = 1; - $address_type = 1; - if(!fputs($this->connection, chr($version).chr($command)."\x00".chr($address_type).pack('Nn', ip2long($host_ip), $host_port))) - $error = $this->SetDataAccessError($send_error); - else - { - $response = fgets($this->connection, 11); - if(strlen($response) != 10) - $error = $this->SetDataAccessError($receive_error); - else - { - $socks_errors = array( - "\x00"=>'', - "\x01"=>'general SOCKS server failure', - "\x02"=>'connection not allowed by ruleset', - "\x03"=>'Network unreachable', - "\x04"=>'Host unreachable', - "\x05"=>'Connection refused', - "\x06"=>'TTL expired', - "\x07"=>'Command not supported', - "\x08"=>'Address type not supported' - ); - $error_code = $response[1]; - $error = (IsSet($socks_errors[$error_code]) ? $socks_errors[$error_code] : 'unknown'); - if(strlen($error)) - $error = 'SOCKS error: '.$error; - } - } - } - } - break; - default: - $error = 'support for SOCKS protocol version '.$this->socks_version.' is not yet implemented'; - break; - } - if(strlen($error)) - { - fclose($this->connection); - return($error); - } - } - if($this->debug) - $this->OutputDebug("Connected to $host_name"); - if(strlen($this->proxy_host_name) - && !strcmp(strtolower($this->protocol), 'https')) - { - if(function_exists('stream_socket_enable_crypto') - && in_array('ssl', stream_get_transports())) - $this->state = "ConnectedToProxy"; - else - { - $this->OutputDebug("It is not possible to start SSL after connecting to the proxy server. If the proxy refuses to forward the SSL request, you may need to upgrade to PHP 5.1 or later with OpenSSL support enabled."); - $this->state="Connected"; - } - } - else - $this->state="Connected"; - return(""); - } - } - - Function Disconnect() - { - if($this->debug) - $this->OutputDebug("Disconnected from ".$this->host_name); - if($this->use_curl) - { - curl_close($this->connection); - $this->response=""; - } - else - fclose($this->connection); - $this->state="Disconnected"; - return(""); - } - - /* Public methods */ - - Function GetRequestArguments($url, &$arguments) - { - $this->error = ''; - $arguments=array(); - $url = str_replace(' ', '%20', $url); - $parameters=@parse_url($url); - if(!$parameters) - return($this->SetError("it was not specified a valid URL")); - if(!IsSet($parameters["scheme"])) - return($this->SetError("it was not specified the protocol type argument")); - switch(strtolower($parameters["scheme"])) - { - case "http": - case "https": - $arguments["Protocol"]=$parameters["scheme"]; - break; - default: - return($parameters["scheme"]." connection scheme is not yet supported"); - } - if(!IsSet($parameters["host"])) - return($this->SetError("it was not specified the connection host argument")); - $arguments["HostName"]=$parameters["host"]; - $arguments["Headers"]=array("Host"=>$parameters["host"].(IsSet($parameters["port"]) ? ":".$parameters["port"] : "")); - if(IsSet($parameters["user"])) - { - $arguments["AuthUser"]=UrlDecode($parameters["user"]); - if(!IsSet($parameters["pass"])) - $arguments["AuthPassword"]=""; - } - if(IsSet($parameters["pass"])) - { - if(!IsSet($parameters["user"])) - $arguments["AuthUser"]=""; - $arguments["AuthPassword"]=UrlDecode($parameters["pass"]); - } - if(IsSet($parameters["port"])) - { - if(strcmp($parameters["port"],strval(intval($parameters["port"])))) - return($this->SetError("it was not specified a valid connection host argument")); - $arguments["HostPort"]=intval($parameters["port"]); - } - else - $arguments["HostPort"]=0; - $arguments["RequestURI"]=(IsSet($parameters["path"]) ? $parameters["path"] : "/").(IsSet($parameters["query"]) ? "?".$parameters["query"] : ""); - if(strlen($this->user_agent)) - $arguments["Headers"]["User-Agent"]=$this->user_agent; - return(""); - } - - Function Open($arguments) - { - if(strlen($this->error)) - return($this->error); - if($this->state!="Disconnected") - return("1 already connected"); - if(IsSet($arguments["HostName"])) - $this->host_name=$arguments["HostName"]; - if(IsSet($arguments["HostPort"])) - $this->host_port=$arguments["HostPort"]; - if(IsSet($arguments["ProxyHostName"])) - $this->proxy_host_name=$arguments["ProxyHostName"]; - if(IsSet($arguments["ProxyHostPort"])) - $this->proxy_host_port=$arguments["ProxyHostPort"]; - if(IsSet($arguments["SOCKSHostName"])) - $this->socks_host_name=$arguments["SOCKSHostName"]; - if(IsSet($arguments["SOCKSHostPort"])) - $this->socks_host_port=$arguments["SOCKSHostPort"]; - if(IsSet($arguments["SOCKSVersion"])) - $this->socks_version=$arguments["SOCKSVersion"]; - if(IsSet($arguments["Protocol"])) - $this->protocol=$arguments["Protocol"]; - switch(strtolower($this->protocol)) - { - case "http": - $default_port=80; - break; - case "https": - $default_port=443; - break; - default: - return($this->SetError("2 it was not specified a valid connection protocol")); - } - if(strlen($this->proxy_host_name)==0) - { - if(strlen($this->host_name)==0) - return($this->SetError("2 it was not specified a valid hostname")); - $host_name=$this->host_name; - $host_port=($this->host_port ? $this->host_port : $default_port); - $server_type = 'HTTP'; - } - else - { - $host_name=$this->proxy_host_name; - $host_port=$this->proxy_host_port; - $server_type = 'HTTP proxy'; - } - $ssl=(strtolower($this->protocol)=="https" && strlen($this->proxy_host_name)==0); - if($ssl - && strlen($this->socks_host_name)) - return($this->SetError('establishing SSL connections via a SOCKS server is not yet supported')); - $this->use_curl=($ssl && $this->prefer_curl && function_exists("curl_init")); - if($this->debug) - $this->OutputDebug("Connecting to ".$this->host_name); - if($this->use_curl) - { - $error=(($this->connection=curl_init($this->protocol."://".$this->host_name.($host_port==$default_port ? "" : ":".strval($host_port))."/")) ? "" : "Could not initialize a CURL session"); - if(strlen($error)==0) - { - if(IsSet($arguments["SSLCertificateFile"])) - curl_setopt($this->connection,CURLOPT_SSLCERT,$arguments["SSLCertificateFile"]); - if(IsSet($arguments["SSLCertificatePassword"])) - curl_setopt($this->connection,CURLOPT_SSLCERTPASSWD,$arguments["SSLCertificatePassword"]); - if(IsSet($arguments["SSLKeyFile"])) - curl_setopt($this->connection,CURLOPT_SSLKEY,$arguments["SSLKeyFile"]); - if(IsSet($arguments["SSLKeyPassword"])) - curl_setopt($this->connection,CURLOPT_SSLKEYPASSWD,$arguments["SSLKeyPassword"]); - } - $this->state="Connected"; - } - else - { - $error=""; - if(strlen($this->proxy_host_name) - && (IsSet($arguments["SSLCertificateFile"]) - || IsSet($arguments["SSLCertificateFile"]))) - $error="establishing SSL connections using certificates or private keys via non-SSL proxies is not supported"; - else - { - if($ssl) - { - if(IsSet($arguments["SSLCertificateFile"])) - $error="establishing SSL connections using certificates is only supported when the cURL extension is enabled"; - elseif(IsSet($arguments["SSLKeyFile"])) - $error="establishing SSL connections using a private key is only supported when the cURL extension is enabled"; - else - { - $version=explode(".",function_exists("phpversion") ? phpversion() : "3.0.7"); - $php_version=intval($version[0])*1000000+intval($version[1])*1000+intval($version[2]); - if($php_version<4003000) - $error="establishing SSL connections requires at least PHP version 4.3.0 or having the cURL extension enabled"; - elseif(!function_exists("extension_loaded") - || !extension_loaded("openssl")) - $error="establishing SSL connections requires the OpenSSL extension enabled"; - } - } - if(strlen($error)==0) - $error=$this->Connect($host_name, $host_port, $ssl, $server_type); - } - } - if(strlen($error)) - return($this->SetError($error)); - $this->session=md5(uniqid("")); - return(""); - } - - Function Close() - { - if($this->state=="Disconnected") - return("1 already disconnected"); - $error=$this->Disconnect(); - if(strlen($error)==0) - $this->state="Disconnected"; - return($error); - } - - Function PickCookies(&$cookies,$secure) - { - if(IsSet($this->cookies[$secure])) - { - $now=gmdate("Y-m-d H-i-s"); - for($domain=0,Reset($this->cookies[$secure]);$domaincookies[$secure]);Next($this->cookies[$secure]),$domain++) - { - $domain_pattern=Key($this->cookies[$secure]); - $match=strlen($this->request_host)-strlen($domain_pattern); - if($match>=0 - && !strcmp($domain_pattern,substr($this->request_host,$match)) - && ($match==0 - || $domain_pattern[0]=="." - || $this->request_host[$match-1]==".")) - { - for(Reset($this->cookies[$secure][$domain_pattern]),$path_part=0;$path_partcookies[$secure][$domain_pattern]);Next($this->cookies[$secure][$domain_pattern]),$path_part++) - { - $path=Key($this->cookies[$secure][$domain_pattern]); - if(strlen($this->request_uri)>=strlen($path) - && substr($this->request_uri,0,strlen($path))==$path) - { - for(Reset($this->cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookiecookies[$secure][$domain_pattern][$path]);Next($this->cookies[$secure][$domain_pattern][$path]),$cookie++) - { - $cookie_name=Key($this->cookies[$secure][$domain_pattern][$path]); - $expires=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"]; - if($expires=="" - || strcmp($now,$expires)<0) - $cookies[$cookie_name]=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]; - } - } - } - } - } - } - } - - Function GetFileDefinition($file, &$definition) - { - $name=""; - if(IsSet($file["FileName"])) - $name=basename($file["FileName"]); - if(IsSet($file["Name"])) - $name=$file["Name"]; - if(strlen($name)==0) - return("it was not specified the file part name"); - if(IsSet($file["Content-Type"])) - { - $content_type=$file["Content-Type"]; - $type=$this->Tokenize(strtolower($content_type),"/"); - $sub_type=$this->Tokenize(""); - switch($type) - { - case "text": - case "image": - case "audio": - case "video": - case "application": - case "message": - break; - case "automatic": - switch($sub_type) - { - case "name": - switch(GetType($dot=strrpos($name,"."))=="integer" ? strtolower(substr($name,$dot)) : "") - { - case ".xls": - $content_type="application/excel"; - break; - case ".hqx": - $content_type="application/macbinhex40"; - break; - case ".doc": - case ".dot": - case ".wrd": - $content_type="application/msword"; - break; - case ".pdf": - $content_type="application/pdf"; - break; - case ".pgp": - $content_type="application/pgp"; - break; - case ".ps": - case ".eps": - case ".ai": - $content_type="application/postscript"; - break; - case ".ppt": - $content_type="application/powerpoint"; - break; - case ".rtf": - $content_type="application/rtf"; - break; - case ".tgz": - case ".gtar": - $content_type="application/x-gtar"; - break; - case ".gz": - $content_type="application/x-gzip"; - break; - case ".php": - case ".php3": - $content_type="application/x-httpd-php"; - break; - case ".js": - $content_type="application/x-javascript"; - break; - case ".ppd": - case ".psd": - $content_type="application/x-photoshop"; - break; - case ".swf": - case ".swc": - case ".rf": - $content_type="application/x-shockwave-flash"; - break; - case ".tar": - $content_type="application/x-tar"; - break; - case ".zip": - $content_type="application/zip"; - break; - case ".mid": - case ".midi": - case ".kar": - $content_type="audio/midi"; - break; - case ".mp2": - case ".mp3": - case ".mpga": - $content_type="audio/mpeg"; - break; - case ".ra": - $content_type="audio/x-realaudio"; - break; - case ".wav": - $content_type="audio/wav"; - break; - case ".bmp": - $content_type="image/bitmap"; - break; - case ".gif": - $content_type="image/gif"; - break; - case ".iff": - $content_type="image/iff"; - break; - case ".jb2": - $content_type="image/jb2"; - break; - case ".jpg": - case ".jpe": - case ".jpeg": - $content_type="image/jpeg"; - break; - case ".jpx": - $content_type="image/jpx"; - break; - case ".png": - $content_type="image/png"; - break; - case ".tif": - case ".tiff": - $content_type="image/tiff"; - break; - case ".wbmp": - $content_type="image/vnd.wap.wbmp"; - break; - case ".xbm": - $content_type="image/xbm"; - break; - case ".css": - $content_type="text/css"; - break; - case ".txt": - $content_type="text/plain"; - break; - case ".htm": - case ".html": - $content_type="text/html"; - break; - case ".xml": - $content_type="text/xml"; - break; - case ".mpg": - case ".mpe": - case ".mpeg": - $content_type="video/mpeg"; - break; - case ".qt": - case ".mov": - $content_type="video/quicktime"; - break; - case ".avi": - $content_type="video/x-ms-video"; - break; - case ".eml": - $content_type="message/rfc822"; - break; - default: - $content_type="application/octet-stream"; - break; - } - break; - default: - return($content_type." is not a supported automatic content type detection method"); - } - break; - default: - return($content_type." is not a supported file content type"); - } - } - else - $content_type="application/octet-stream"; - $definition=array( - "Content-Type"=>$content_type, - "NAME"=>$name - ); - if(IsSet($file["FileName"])) - { - if(GetType($length=@filesize($file["FileName"]))!="integer") - { - $error="it was not possible to determine the length of the file ".$file["FileName"]; - if(IsSet($php_errormsg) - && strlen($php_errormsg)) - $error.=": ".$php_errormsg; - if(!file_exists($file["FileName"])) - $error="it was not possible to access the file ".$file["FileName"]; - return($error); - } - $definition["FILENAME"]=$file["FileName"]; - $definition["Content-Length"]=$length; - } - elseif(IsSet($file["Data"])) - $definition["Content-Length"]=strlen($definition["DATA"]=$file["Data"]); - else - return("it was not specified a valid file name"); - return(""); - } - - Function ConnectFromProxy($arguments, &$headers) - { - if(!$this->PutLine('CONNECT '.$this->host_name.':'.($this->host_port ? $this->host_port : 443).' HTTP/1.0') - || (strlen($this->user_agent) - && !$this->PutLine('User-Agent: '.$this->user_agent)) - || (IsSet($arguments['Headers']['Proxy-Authorization']) - && !$this->PutLine('Proxy-Authorization: '.$arguments['Headers']['Proxy-Authorization'])) - || !$this->PutLine('')) - { - $this->Disconnect(); - return($this->error); - } - $this->state = "ConnectSent"; - if(strlen($error=$this->ReadReplyHeadersResponse($headers))) - return($error); - $proxy_authorization=""; - while(!strcmp($this->response_status, "100")) - { - $this->state="ConnectSent"; - if(strlen($error=$this->ReadReplyHeadersResponse($headers))) - return($error); - } - switch($this->response_status) - { - case "200": - if(!@stream_socket_enable_crypto($this->connection, 1, STREAM_CRYPTO_METHOD_SSLv23_CLIENT)) - { - $this->SetPHPError('it was not possible to start a SSL encrypted connection via this proxy', $php_errormsg); - $this->Disconnect(); - return($this->error); - } - $this->state = "Connected"; - break; - case "407": - if(strlen($error=$this->Authenticate($headers, -1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation))) - return($error); - break; - default: - return($this->SetError("unable to send request via proxy")); - } - return(""); - } - - Function SendRequest($arguments) - { - if(strlen($this->error)) - return($this->error); - if(IsSet($arguments["ProxyUser"])) - $this->proxy_request_user=$arguments["ProxyUser"]; - elseif(IsSet($this->proxy_user)) - $this->proxy_request_user=$this->proxy_user; - if(IsSet($arguments["ProxyPassword"])) - $this->proxy_request_password=$arguments["ProxyPassword"]; - elseif(IsSet($this->proxy_password)) - $this->proxy_request_password=$this->proxy_password; - if(IsSet($arguments["ProxyRealm"])) - $this->proxy_request_realm=$arguments["ProxyRealm"]; - elseif(IsSet($this->proxy_realm)) - $this->proxy_request_realm=$this->proxy_realm; - if(IsSet($arguments["ProxyWorkstation"])) - $this->proxy_request_workstation=$arguments["ProxyWorkstation"]; - elseif(IsSet($this->proxy_workstation)) - $this->proxy_request_workstation=$this->proxy_workstation; - switch($this->state) - { - case "Disconnected": - return($this->SetError("1 connection was not yet established")); - case "Connected": - $connect = 0; - break; - case "ConnectedToProxy": - if(strlen($error = $this->ConnectFromProxy($arguments, $headers))) - return($error); - $connect = 1; - break; - default: - return($this->SetError("2 can not send request in the current connection state")); - } - if(IsSet($arguments["RequestMethod"])) - $this->request_method=$arguments["RequestMethod"]; - if(IsSet($arguments["User-Agent"])) - $this->user_agent=$arguments["User-Agent"]; - if(!IsSet($arguments["Headers"]["User-Agent"]) - && strlen($this->user_agent)) - $arguments["Headers"]["User-Agent"]=$this->user_agent; - if(strlen($this->request_method)==0) - return($this->SetError("3 it was not specified a valid request method")); - if(IsSet($arguments["RequestURI"])) - $this->request_uri=$arguments["RequestURI"]; - if(strlen($this->request_uri)==0 - || substr($this->request_uri,0,1)!="/") - return($this->SetError("4 it was not specified a valid request URI")); - $this->request_arguments=$arguments; - $this->request_headers=(IsSet($arguments["Headers"]) ? $arguments["Headers"] : array()); - $body_length=0; - $this->request_body=""; - $get_body=1; - if($this->request_method=="POST" - || $this->request_method=="PUT") - { - if(IsSet($arguments['StreamRequest'])) - { - $get_body = 0; - $this->request_headers["Transfer-Encoding"]="chunked"; - } - elseif(IsSet($arguments["PostFiles"]) - || ($this->force_multipart_form_post - && IsSet($arguments["PostValues"]))) - { - $boundary="--".md5(uniqid(time())); - $this->request_headers["Content-Type"]="multipart/form-data; boundary=".$boundary.(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : ""); - $post_parts=array(); - if(IsSet($arguments["PostValues"])) - { - $values=$arguments["PostValues"]; - if(GetType($values)!="array") - return($this->SetError("5 it was not specified a valid POST method values array")); - for(Reset($values),$value=0;$value$headers,"DATA"=>$data); - $body_length+=strlen($headers)+strlen($data)+strlen("\r\n"); - } - } - $body_length+=strlen("--".$boundary."--\r\n"); - $files=(IsSet($arguments["PostFiles"]) ? $arguments["PostFiles"] : array()); - Reset($files); - $end=(GetType($input=Key($files))!="string"); - for(;!$end;) - { - if(strlen($error=$this->GetFileDefinition($files[$input],$definition))) - return("3 ".$error); - $headers="--".$boundary."\r\nContent-Disposition: form-data; name=\"".$input."\"; filename=\"".$definition["NAME"]."\"\r\nContent-Type: ".$definition["Content-Type"]."\r\n\r\n"; - $part=count($post_parts); - $post_parts[$part]=array("HEADERS"=>$headers); - if(IsSet($definition["FILENAME"])) - { - $post_parts[$part]["FILENAME"]=$definition["FILENAME"]; - $data=""; - } - else - $data=$definition["DATA"]; - $post_parts[$part]["DATA"]=$data; - $body_length+=strlen($headers)+$definition["Content-Length"]+strlen("\r\n"); - Next($files); - $end=(GetType($input=Key($files))!="string"); - } - $get_body=0; - } - elseif(IsSet($arguments["PostValues"])) - { - $values=$arguments["PostValues"]; - if(GetType($values)!="array") - return($this->SetError("5 it was not specified a valid POST method values array")); - for(Reset($values),$value=0;$value0) - $this->request_body.="&"; - $this->request_body.=UrlEncode($k)."=".UrlEncode($values[$k][$v]); - } - } - else - { - if($value>0) - $this->request_body.="&"; - $this->request_body.=UrlEncode($k)."=".UrlEncode($values[$k]); - } - } - $this->request_headers["Content-Type"]="application/x-www-form-urlencoded".(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : ""); - $get_body=0; - } - } - if($get_body - && (IsSet($arguments["Body"]) - || IsSet($arguments["BodyStream"]))) - { - if(IsSet($arguments["Body"])) - $this->request_body=$arguments["Body"]; - else - { - $stream=$arguments["BodyStream"]; - $this->request_body=""; - for($part=0; $partrequest_body.=$stream[$part]["Data"]; - elseif(IsSet($stream[$part]["File"])) - { - if(!($file=@fopen($stream[$part]["File"],"rb"))) - return($this->SetPHPError("could not open upload file ".$stream[$part]["File"], $php_errormsg)); - while(!feof($file)) - { - if(GetType($block=@fread($file,$this->file_buffer_length))!="string") - { - $error=$this->SetPHPError("could not read body stream file ".$stream[$part]["File"], $php_errormsg); - fclose($file); - return($error); - } - $this->request_body.=$block; - } - fclose($file); - } - else - return("5 it was not specified a valid file or data body stream element at position ".$part); - } - } - if(!IsSet($this->request_headers["Content-Type"])) - $this->request_headers["Content-Type"]="application/octet-stream".(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : ""); - } - if(IsSet($arguments["AuthUser"])) - $this->request_user=$arguments["AuthUser"]; - elseif(IsSet($this->user)) - $this->request_user=$this->user; - if(IsSet($arguments["AuthPassword"])) - $this->request_password=$arguments["AuthPassword"]; - elseif(IsSet($this->password)) - $this->request_password=$this->password; - if(IsSet($arguments["AuthRealm"])) - $this->request_realm=$arguments["AuthRealm"]; - elseif(IsSet($this->realm)) - $this->request_realm=$this->realm; - if(IsSet($arguments["AuthWorkstation"])) - $this->request_workstation=$arguments["AuthWorkstation"]; - elseif(IsSet($this->workstation)) - $this->request_workstation=$this->workstation; - if(strlen($this->proxy_host_name)==0 - || $connect) - $request_uri=$this->request_uri; - else - { - switch(strtolower($this->protocol)) - { - case "http": - $default_port=80; - break; - case "https": - $default_port=443; - break; - } - $request_uri=strtolower($this->protocol)."://".$this->host_name.(($this->host_port==0 || $this->host_port==$default_port) ? "" : ":".$this->host_port).$this->request_uri; - } - if($this->use_curl) - { - $version=(GetType($v=curl_version())=="array" ? (IsSet($v["version"]) ? $v["version"] : "0.0.0") : (preg_match("/^libcurl\\/([0-9]+\\.[0-9]+\\.[0-9]+)/",$v,$m) ? $m[1] : "0.0.0")); - $curl_version=100000*intval($this->Tokenize($version,"."))+1000*intval($this->Tokenize("."))+intval($this->Tokenize("")); - $protocol_version=($curl_version<713002 ? "1.0" : $this->protocol_version); - } - else - $protocol_version=$this->protocol_version; - $this->request=$this->request_method." ".$request_uri." HTTP/".$protocol_version; - if($body_length - || ($body_length=strlen($this->request_body))) - $this->request_headers["Content-Length"]=$body_length; - for($headers=array(),$host_set=0,Reset($this->request_headers),$header=0;$headerrequest_headers);Next($this->request_headers),$header++) - { - $header_name=Key($this->request_headers); - $header_value=$this->request_headers[$header_name]; - if(GetType($header_value)=="array") - { - for(Reset($header_value),$value=0;$valuerequest_headers))=="host") - { - $this->request_host=strtolower($header_value); - $host_set=1; - } - } - if(!$host_set) - { - $headers[]="Host: ".$this->host_name; - $this->request_host=strtolower($this->host_name); - } - if(count($this->cookies)) - { - $cookies=array(); - $this->PickCookies($cookies,0); - if(strtolower($this->protocol)=="https") - $this->PickCookies($cookies,1); - if(count($cookies)) - { - $h=count($headers); - $headers[$h]="Cookie:"; - for(Reset($cookies),$cookie=0;$cookieuse_curl) - { - if(IsSet($arguments['StreamRequest'])) - return($this->SetError("Streaming request data is not supported when using Curl")); - if($body_length - && strlen($this->request_body)==0) - { - for($request_body="",$success=1,$part=0;$partSetPHPError("could not open upload file ".$post_parts[$part]["FILENAME"], $php_errormsg); - $success=0; - break; - } - while(!feof($file)) - { - if(GetType($block=@fread($file,$this->file_buffer_length))!="string") - { - $this->SetPHPError("could not read upload file", $php_errormsg); - $success=0; - break; - } - $request_body.=$block; - } - fclose($file); - if(!$success) - break; - } - $request_body.="\r\n"; - } - $request_body.="--".$boundary."--\r\n"; - } - else - $request_body=$this->request_body; - curl_setopt($this->connection,CURLOPT_HEADER,1); - curl_setopt($this->connection,CURLOPT_RETURNTRANSFER,1); - if($this->timeout) - curl_setopt($this->connection,CURLOPT_TIMEOUT,$this->timeout); - curl_setopt($this->connection,CURLOPT_SSL_VERIFYPEER,0); - curl_setopt($this->connection,CURLOPT_SSL_VERIFYHOST,0); - $request=$this->request."\r\n".implode("\r\n",$headers)."\r\n\r\n".$request_body; - curl_setopt($this->connection,CURLOPT_CUSTOMREQUEST,$request); - if($this->debug) - $this->OutputDebug("C ".$request); - if(!($success=(strlen($this->response=curl_exec($this->connection))!=0))) - { - $error=curl_error($this->connection); - $this->SetError("Could not execute the request".(strlen($error) ? ": ".$error : "")); - } - } - else - { - if(($success=$this->PutLine($this->request))) - { - for($header=0;$headerPutLine($headers[$header])) - break; - } - if($success - && ($success=$this->PutLine(""))) - { - if(IsSet($arguments['StreamRequest'])) - $next_state = "SendingRequestBody"; - elseif($body_length) - { - if(strlen($this->request_body)) - $success=$this->PutData($this->request_body); - else - { - for($part=0;$partPutData($post_parts[$part]["HEADERS"])) - || !($success=$this->PutData($post_parts[$part]["DATA"]))) - break; - if(IsSet($post_parts[$part]["FILENAME"])) - { - if(!($file=@fopen($post_parts[$part]["FILENAME"],"rb"))) - { - $this->SetPHPError("could not open upload file ".$post_parts[$part]["FILENAME"], $php_errormsg); - $success=0; - break; - } - while(!feof($file)) - { - if(GetType($block=@fread($file,$this->file_buffer_length))!="string") - { - $this->SetPHPError("could not read upload file", $php_errormsg); - $success=0; - break; - } - if(!($success=$this->PutData($block))) - break; - } - fclose($file); - if(!$success) - break; - } - if(!($success=$this->PutLine(""))) - break; - } - if($success) - $success=$this->PutLine("--".$boundary."--"); - } - if($success) - $sucess=$this->FlushData(); - } - } - } - } - if(!$success) - return($this->SetError("5 could not send the HTTP request: ".$this->error)); - $this->state=$next_state; - return(""); - } - - Function SetCookie($name, $value, $expires="" , $path="/" , $domain="" , $secure=0, $verbatim=0) - { - if(strlen($this->error)) - return($this->error); - if(strlen($name)==0) - return($this->SetError("it was not specified a valid cookie name")); - if(strlen($path)==0 - || strcmp($path[0],"/")) - return($this->SetError($path." is not a valid path for setting cookie ".$name)); - if($domain=="" - || !strpos($domain,".",$domain[0]=="." ? 1 : 0)) - return($this->SetError($domain." is not a valid domain for setting cookie ".$name)); - $domain=strtolower($domain); - if(!strcmp($domain[0],".")) - $domain=substr($domain,1); - if(!$verbatim) - { - $name=$this->CookieEncode($name,1); - $value=$this->CookieEncode($value,0); - } - $secure=intval($secure); - $this->cookies[$secure][$domain][$path][$name]=array( - "name"=>$name, - "value"=>$value, - "domain"=>$domain, - "path"=>$path, - "expires"=>$expires, - "secure"=>$secure - ); - return(""); - } - - Function SendRequestBody($data, $end_of_data) - { - if(strlen($this->error)) - return($this->error); - switch($this->state) - { - case "Disconnected": - return($this->SetError("1 connection was not yet established")); - case "Connected": - case "ConnectedToProxy": - return($this->SetError("2 request was not sent")); - case "SendingRequestBody": - break; - case "RequestSent": - return($this->SetError("3 request body was already sent")); - default: - return($this->SetError("4 can not send the request body in the current connection state")); - } - $length = strlen($data); - if($length) - { - $size = dechex($length)."\r\n"; - if(!$this->PutData($size) - || !$this->PutData($data)) - return($this->error); - } - if($end_of_data) - { - $size = "0\r\n"; - if(!$this->PutData($size)) - return($this->error); - $this->state = "RequestSent"; - } - return(""); - } - - Function ReadReplyHeadersResponse(&$headers) - { - $headers=array(); - if(strlen($this->error)) - return($this->error); - switch($this->state) - { - case "Disconnected": - return($this->SetError("1 connection was not yet established")); - case "Connected": - return($this->SetError("2 request was not sent")); - case "ConnectedToProxy": - return($this->SetError("2 connection from the remote server from the proxy was not yet established")); - case "SendingRequestBody": - return($this->SetError("4 request body data was not completely sent")); - case "ConnectSent": - $connect = 1; - break; - case "RequestSent": - $connect = 0; - break; - default: - return($this->SetError("3 can not get request headers in the current connection state")); - } - $this->content_length=$this->read_length=$this->read_response=$this->remaining_chunk=0; - $this->content_length_set=$this->chunked=$this->last_chunk_read=$chunked=0; - $this->connection_close=0; - for($this->response_status="";;) - { - $line=$this->GetLine(); - if(GetType($line)!="string") - return($this->SetError("4 could not read request reply: ".$this->error)); - if(strlen($this->response_status)==0) - { - if(!preg_match($match="/^http\\/[0-9]+\\.[0-9]+[ \t]+([0-9]+)[ \t]*(.*)\$/i",$line,$matches)) - return($this->SetError("3 it was received an unexpected HTTP response status")); - $this->response_status=$matches[1]; - $this->response_message=$matches[2]; - } - if($line=="") - { - if(strlen($this->response_status)==0) - return($this->SetError("3 it was not received HTTP response status")); - $this->state=($connect ? "GotConnectHeaders" : "GotReplyHeaders"); - break; - } - $header_name=strtolower($this->Tokenize($line,":")); - $header_value=Trim(Chop($this->Tokenize("\r\n"))); - if(IsSet($headers[$header_name])) - { - if(GetType($headers[$header_name])=="string") - $headers[$header_name]=array($headers[$header_name]); - $headers[$header_name][]=$header_value; - } - else - $headers[$header_name]=$header_value; - if(!$connect) - { - switch($header_name) - { - case "content-length": - $this->content_length=intval($headers[$header_name]); - $this->content_length_set=1; - break; - case "transfer-encoding": - $encoding=$this->Tokenize($header_value,"; \t"); - if(!$this->use_curl - && !strcmp($encoding,"chunked")) - $chunked=1; - break; - case "set-cookie": - if($this->support_cookies) - { - if(GetType($headers[$header_name])=="array") - $cookie_headers=$headers[$header_name]; - else - $cookie_headers=array($headers[$header_name]); - for($cookie=0;$cookieTokenize($cookie_headers[$cookie],"=")); - $cookie_value=$this->Tokenize(";"); - $domain=$this->request_host; - $path="/"; - $expires=""; - $secure=0; - while(($name=trim(UrlDecode($this->Tokenize("="))))!="") - { - $value=UrlDecode($this->Tokenize(";")); - switch($name) - { - case "domain": - $domain=$value; - break; - case "path": - $path=$value; - break; - case "expires": - if(preg_match("/^((Mon|Monday|Tue|Tuesday|Wed|Wednesday|Thu|Thursday|Fri|Friday|Sat|Saturday|Sun|Sunday), )?([0-9]{2})\\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\-([0-9]{2,4}) ([0-9]{2})\\:([0-9]{2})\\:([0-9]{2}) GMT\$/",$value,$matches)) - { - $year=intval($matches[5]); - if($year<1900) - $year+=($year<70 ? 2000 : 1900); - $expires="$year-".$this->months[$matches[4]]."-".$matches[3]." ".$matches[6].":".$matches[7].":".$matches[8]; - } - break; - case "secure": - $secure=1; - break; - } - } - if(strlen($this->SetCookie($cookie_name, $cookie_value, $expires, $path , $domain, $secure, 1))) - $this->error=""; - } - } - break; - case "connection": - $this->connection_close=!strcmp(strtolower($header_value),"close"); - break; - } - } - } - $this->chunked=$chunked; - if($this->content_length_set) - $this->connection_close=0; - return(""); - } - - Function Redirect(&$headers) - { - if($this->follow_redirect) - { - if(!IsSet($headers["location"]) - || (GetType($headers["location"])!="array" - && strlen($location=$headers["location"])==0) - || (GetType($headers["location"])=="array" - && strlen($location=$headers["location"][0])==0)) - return($this->SetError("3 it was received a redirect without location URL")); - if(strcmp($location[0],"/")) - { - $location_arguments=parse_url($location); - if(!IsSet($location_arguments["scheme"])) - $location=((GetType($end=strrpos($this->request_uri,"/"))=="integer" && $end>1) ? substr($this->request_uri,0,$end) : "")."/".$location; - } - if(!strcmp($location[0],"/")) - $location=$this->protocol."://".$this->host_name.($this->host_port ? ":".$this->host_port : "").$location; - $error=$this->GetRequestArguments($location,$arguments); - if(strlen($error)) - return($this->SetError("could not process redirect url: ".$error)); - $arguments["RequestMethod"]="GET"; - if(strlen($error=$this->Close())==0 - && strlen($error=$this->Open($arguments))==0 - && strlen($error=$this->SendRequest($arguments))==0) - { - $this->redirection_level++; - if($this->redirection_level>$this->redirection_limit) - $error="it was exceeded the limit of request redirections"; - else - $error=$this->ReadReplyHeaders($headers); - $this->redirection_level--; - } - if(strlen($error)) - return($this->SetError($error)); - } - return(""); - } - - Function Authenticate(&$headers, $proxy, &$proxy_authorization, &$user, &$password, &$realm, &$workstation) - { - if($proxy) - { - $authenticate_header="proxy-authenticate"; - $authorization_header="Proxy-Authorization"; - $authenticate_status="407"; - $authentication_mechanism=$this->proxy_authentication_mechanism; - } - else - { - $authenticate_header="www-authenticate"; - $authorization_header="Authorization"; - $authenticate_status="401"; - $authentication_mechanism=$this->authentication_mechanism; - } - if(IsSet($headers[$authenticate_header])) - { - if(function_exists("class_exists") - && !class_exists("sasl_client_class")) - return($this->SetError("the SASL client class needs to be loaded to be able to authenticate".($proxy ? " with the proxy server" : "")." and access this site")); - if(GetType($headers[$authenticate_header])=="array") - $authenticate=$headers[$authenticate_header]; - else - $authenticate=array($headers[$authenticate_header]); - for($response="", $mechanisms=array(),$m=0;$mTokenize($authenticate[$m]," "); - $response=$this->Tokenize(""); - if(strlen($authentication_mechanism)) - { - if(!strcmp($authentication_mechanism,$mechanism)) - { - $mechanisms[]=$mechanism; - break; - } - } - else - $mechanisms[]=$mechanism; - } - $sasl=new sasl_client_class; - if(IsSet($user)) - $sasl->SetCredential("user",$user); - if(IsSet($password)) - $sasl->SetCredential("password",$password); - if(IsSet($realm)) - $sasl->SetCredential("realm",$realm); - if(IsSet($workstation)) - $sasl->SetCredential("workstation",$workstation); - $sasl->SetCredential("uri",$this->request_uri); - $sasl->SetCredential("method",$this->request_method); - $sasl->SetCredential("session",$this->session); - do - { - $status=$sasl->Start($mechanisms,$message,$interactions); - } - while($status==SASL_INTERACT); - switch($status) - { - case SASL_CONTINUE: - break; - case SASL_NOMECH: - return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".(strlen($authentication_mechanism) ? "authentication mechanism ".$authentication_mechanism." may not be used: " : "").$sasl->error)); - default: - return($this->SetError("Could not start the SASL ".($proxy ? "proxy " : "")."authentication client: ".$sasl->error)); - } - if($proxy >= 0) - { - for(;;) - { - if(strlen($error=$this->ReadReplyBody($body,$this->file_buffer_length))) - return($error); - if(strlen($body)==0) - break; - } - } - $authorization_value=$sasl->mechanism.(IsSet($message) ? " ".($sasl->encode_response ? base64_encode($message) : $message) : ""); - $request_arguments=$this->request_arguments; - $arguments=$request_arguments; - $arguments["Headers"][$authorization_header]=$authorization_value; - if(!$proxy - && strlen($proxy_authorization)) - $arguments["Headers"]["Proxy-Authorization"]=$proxy_authorization; - if(strlen($error=$this->Close()) - || strlen($error=$this->Open($arguments))) - return($this->SetError($error)); - $authenticated=0; - if(IsSet($message)) - { - if($proxy < 0) - { - if(strlen($error=$this->ConnectFromProxy($arguments, $headers))) - return($this->SetError($error)); - } - else - { - if(strlen($error=$this->SendRequest($arguments)) - || strlen($error=$this->ReadReplyHeadersResponse($headers))) - return($this->SetError($error)); - } - if(!IsSet($headers[$authenticate_header])) - $authenticate=array(); - elseif(GetType($headers[$authenticate_header])=="array") - $authenticate=$headers[$authenticate_header]; - else - $authenticate=array($headers[$authenticate_header]); - for($mechanism=0;$mechanismTokenize($authenticate[$mechanism]," "),$sasl->mechanism)) - { - $response=$this->Tokenize(""); - break; - } - } - switch($this->response_status) - { - case $authenticate_status: - break; - case "301": - case "302": - case "303": - case "307": - if($proxy >= 0) - return($this->Redirect($headers)); - default: - if(intval($this->response_status/100)==2) - { - if($proxy) - $proxy_authorization=$authorization_value; - $authenticated=1; - break; - } - if($proxy - && !strcmp($this->response_status,"401")) - { - $proxy_authorization=$authorization_value; - $authenticated=1; - break; - } - return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".$this->response_status." ".$this->response_message)); - } - } - for(;!$authenticated;) - { - do - { - $status=$sasl->Step($response,$message,$interactions); - } - while($status==SASL_INTERACT); - switch($status) - { - case SASL_CONTINUE: - $authorization_value=$sasl->mechanism.(IsSet($message) ? " ".($sasl->encode_response ? base64_encode($message) : $message) : ""); - $arguments=$request_arguments; - $arguments["Headers"][$authorization_header]=$authorization_value; - if(!$proxy - && strlen($proxy_authorization)) - $arguments["Headers"]["Proxy-Authorization"]=$proxy_authorization; - if($proxy < 0) - { - if(strlen($error=$this->ConnectFromProxy($arguments, $headers))) - return($this->SetError($error)); - } - else - { - if(strlen($error=$this->SendRequest($arguments)) - || strlen($error=$this->ReadReplyHeadersResponse($headers))) - return($this->SetError($error)); - } - switch($this->response_status) - { - case $authenticate_status: - if(GetType($headers[$authenticate_header])=="array") - $authenticate=$headers[$authenticate_header]; - else - $authenticate=array($headers[$authenticate_header]); - for($response="",$mechanism=0;$mechanismTokenize($authenticate[$mechanism]," "),$sasl->mechanism)) - { - $response=$this->Tokenize(""); - break; - } - } - if($proxy >= 0) - { - for(;;) - { - if(strlen($error=$this->ReadReplyBody($body,$this->file_buffer_length))) - return($error); - if(strlen($body)==0) - break; - } - } - $this->state="Connected"; - break; - case "301": - case "302": - case "303": - case "307": - if($proxy >= 0) - return($this->Redirect($headers)); - default: - if(intval($this->response_status/100)==2) - { - if($proxy) - $proxy_authorization=$authorization_value; - $authenticated=1; - break; - } - if($proxy - && !strcmp($this->response_status,"401")) - { - $proxy_authorization=$authorization_value; - $authenticated=1; - break; - } - return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".$this->response_status." ".$this->response_message)); - } - break; - default: - return($this->SetError("Could not process the SASL ".($proxy ? "proxy " : "")."authentication step: ".$sasl->error)); - } - } - } - return(""); - } - - Function ReadReplyHeaders(&$headers) - { - if(strlen($error=$this->ReadReplyHeadersResponse($headers))) - return($error); - $proxy_authorization=""; - while(!strcmp($this->response_status, "100")) - { - $this->state="RequestSent"; - if(strlen($error=$this->ReadReplyHeadersResponse($headers))) - return($error); - } - switch($this->response_status) - { - case "301": - case "302": - case "303": - case "307": - if(strlen($error=$this->Redirect($headers))) - return($error); - break; - case "407": - if(strlen($error=$this->Authenticate($headers, 1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation))) - return($error); - if(strcmp($this->response_status,"401")) - return(""); - case "401": - return($this->Authenticate($headers, 0, $proxy_authorization, $this->request_user, $this->request_password, $this->request_realm, $this->request_workstation)); - } - return(""); - } - - Function ReadReplyBody(&$body,$length) - { - $body=""; - if(strlen($this->error)) - return($this->error); - switch($this->state) - { - case "Disconnected": - return($this->SetError("1 connection was not yet established")); - case "Connected": - case "ConnectedToProxy": - return($this->SetError("2 request was not sent")); - case "RequestSent": - if(($error=$this->ReadReplyHeaders($headers))!="") - return($error); - break; - case "GotReplyHeaders": - break; - default: - return($this->SetError("3 can not get request headers in the current connection state")); - } - if($this->content_length_set) - $length=min($this->content_length-$this->read_length,$length); - if($length>0 - && !$this->EndOfInput() - && ($body=$this->ReadBytes($length))=="") - { - if(strlen($this->error)) - return($this->SetError("4 could not get the request reply body: ".$this->error)); - } - $this->read_length+=strlen($body); - return(""); - } - - Function SaveCookies(&$cookies, $domain='', $secure_only=0, $persistent_only=0) - { - $now=gmdate("Y-m-d H-i-s"); - $cookies=array(); - for($secure_cookies=0,Reset($this->cookies);$secure_cookiescookies);Next($this->cookies),$secure_cookies++) - { - $secure=Key($this->cookies); - if(!$secure_only - || $secure) - { - for($cookie_domain=0,Reset($this->cookies[$secure]);$cookie_domaincookies[$secure]);Next($this->cookies[$secure]),$cookie_domain++) - { - $domain_pattern=Key($this->cookies[$secure]); - $match=strlen($domain)-strlen($domain_pattern); - if(strlen($domain)==0 - || ($match>=0 - && !strcmp($domain_pattern,substr($domain,$match)) - && ($match==0 - || $domain_pattern[0]=="." - || $domain[$match-1]=="."))) - { - for(Reset($this->cookies[$secure][$domain_pattern]),$path_part=0;$path_partcookies[$secure][$domain_pattern]);Next($this->cookies[$secure][$domain_pattern]),$path_part++) - { - $path=Key($this->cookies[$secure][$domain_pattern]); - for(Reset($this->cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookiecookies[$secure][$domain_pattern][$path]);Next($this->cookies[$secure][$domain_pattern][$path]),$cookie++) - { - $cookie_name=Key($this->cookies[$secure][$domain_pattern][$path]); - $expires=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"]; - if((!$persistent_only - && strlen($expires)==0) - || (strlen($expires) - && strcmp($now,$expires)<0)) - $cookies[$secure][$domain_pattern][$path][$cookie_name]=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]; - } - } - } - } - } - } - } - - Function SavePersistentCookies(&$cookies, $domain='', $secure_only=0) - { - $this->SaveCookies($cookies, $domain, $secure_only, 1); - } - - Function GetPersistentCookies(&$cookies, $domain='', $secure_only=0) - { - $this->SavePersistentCookies($cookies, $domain, $secure_only); - } - - Function RestoreCookies($cookies, $clear=1) - { - $new_cookies=($clear ? array() : $this->cookies); - for($secure_cookies=0, Reset($cookies); $secure_cookiesSetError("invalid cookie secure value type (".serialize($secure).")")); - for($cookie_domain=0,Reset($cookies[$secure]);$cookie_domainSetError("invalid cookie domain value type (".serialize($domain_pattern).")")); - for(Reset($cookies[$secure][$domain_pattern]),$path_part=0;$path_partSetError("invalid cookie path value type (".serialize($path).")")); - for(Reset($cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookieSetError("invalid cookie expiry value type (".serialize($expires).")")); - $new_cookies[$secure][$domain_pattern][$path][$cookie_name]=array( - "name"=>$cookie_name, - "value"=>$value, - "domain"=>$domain_pattern, - "path"=>$path, - "expires"=>$expires, - "secure"=>$secure - ); - } - } - } - } - $this->cookies=$new_cookies; - return(""); - } -}; - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/http/testfiles.zip b/include/limesurvey/admin/classes/http/testfiles.zip deleted file mode 100644 index db7729c1..00000000 Binary files a/include/limesurvey/admin/classes/http/testfiles.zip and /dev/null differ diff --git a/include/limesurvey/admin/classes/json/JSON.php b/include/limesurvey/admin/classes/json/JSON.php deleted file mode 100644 index 008200e7..00000000 --- a/include/limesurvey/admin/classes/json/JSON.php +++ /dev/null @@ -1,806 +0,0 @@ - - * @author Matt Knapp - * @author Brett Stimmerman - * @copyright 2005 Michal Migurski - * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ - * @license http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 - */ - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_SLICE', 1); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_STR', 2); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_ARR', 3); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_OBJ', 4); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_CMT', 5); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_LOOSE_TYPE', 16); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_SUPPRESS_ERRORS', 32); - -/** - * Converts to and from JSON format. - * - * Brief example of use: - * - * - * // create a new instance of Services_JSON - * $json = new Services_JSON(); - * - * // convert a complexe value to JSON notation, and send it to the browser - * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); - * $output = $json->encode($value); - * - * print($output); - * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] - * - * // accept incoming POST data, assumed to be in JSON notation - * $input = file_get_contents('php://input', 1000000); - * $value = $json->decode($input); - * - */ -class Services_JSON -{ - /** - * constructs a new JSON instance - * - * @param int $use object behavior flags; combine with boolean-OR - * - * possible values: - * - SERVICES_JSON_LOOSE_TYPE: loose typing. - * "{...}" syntax creates associative arrays - * instead of objects in decode(). - * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. - * Values which can't be encoded (e.g. resources) - * appear as NULL instead of throwing errors. - * By default, a deeply-nested resource will - * bubble up with an error, so all return values - * from encode() should be checked with isError() - */ - function Services_JSON($use = 0) - { - $this->use = $use; - } - - /** - * convert a string from one UTF-16 char to one UTF-8 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf16 UTF-16 character - * @return string UTF-8 character - * @access private - */ - function utf162utf8($utf16) - { - // oh please oh please oh please oh please oh please - if(function_exists('mb_convert_encoding')) { - return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); - } - - $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); - - switch(true) { - case ((0x7F & $bytes) == $bytes): - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x7F & $bytes); - - case (0x07FF & $bytes) == $bytes: - // return a 2-byte UTF-8 character - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0xC0 | (($bytes >> 6) & 0x1F)) - . chr(0x80 | ($bytes & 0x3F)); - - case (0xFFFF & $bytes) == $bytes: - // return a 3-byte UTF-8 character - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0xE0 | (($bytes >> 12) & 0x0F)) - . chr(0x80 | (($bytes >> 6) & 0x3F)) - . chr(0x80 | ($bytes & 0x3F)); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * convert a string from one UTF-8 char to one UTF-16 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf8 UTF-8 character - * @return string UTF-16 character - * @access private - */ - function utf82utf16($utf8) - { - // oh please oh please oh please oh please oh please - if(function_exists('mb_convert_encoding')) { - return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); - } - - switch(strlen($utf8)) { - case 1: - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return $utf8; - - case 2: - // return a UTF-16 character from a 2-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x07 & (ord($utf8{0}) >> 2)) - . chr((0xC0 & (ord($utf8{0}) << 6)) - | (0x3F & ord($utf8{1}))); - - case 3: - // return a UTF-16 character from a 3-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr((0xF0 & (ord($utf8{0}) << 4)) - | (0x0F & (ord($utf8{1}) >> 2))) - . chr((0xC0 & (ord($utf8{1}) << 6)) - | (0x7F & ord($utf8{2}))); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * encodes an arbitrary variable into JSON format - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - function encode($var) - { - switch (gettype($var)) { - case 'boolean': - return $var ? 'true' : 'false'; - - case 'NULL': - return 'null'; - - case 'integer': - return (int) $var; - - case 'double': - case 'float': - return (float) $var; - - case 'string': - // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT - $ascii = ''; - $strlen_var = strlen($var); - - /* - * Iterate over every character in the string, - * escaping with a slash or encoding to UTF-8 where necessary - */ - for ($c = 0; $c < $strlen_var; ++$c) { - - $ord_var_c = ord($var{$c}); - - switch (true) { - case $ord_var_c == 0x08: - $ascii .= '\b'; - break; - case $ord_var_c == 0x09: - $ascii .= '\t'; - break; - case $ord_var_c == 0x0A: - $ascii .= '\n'; - break; - case $ord_var_c == 0x0C: - $ascii .= '\f'; - break; - case $ord_var_c == 0x0D: - $ascii .= '\r'; - break; - - case $ord_var_c == 0x22: - case $ord_var_c == 0x2F: - case $ord_var_c == 0x5C: - // double quote, slash, slosh - $ascii .= '\\'.$var{$c}; - break; - - case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): - // characters U-00000000 - U-0000007F (same as ASCII) - $ascii .= $var{$c}; - break; - - case (($ord_var_c & 0xE0) == 0xC0): - // characters U-00000080 - U-000007FF, mask 110XXXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, ord($var{$c + 1})); - $c += 1; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF0) == 0xE0): - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2})); - $c += 2; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF8) == 0xF0): - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3})); - $c += 3; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFC) == 0xF8): - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4})); - $c += 4; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFE) == 0xFC): - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4}), - ord($var{$c + 5})); - $c += 5; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - } - } - - return '"'.$ascii.'"'; - - case 'array': - /* - * As per JSON spec if any array key is not an integer - * we must treat the the whole array as an object. We - * also try to catch a sparsely populated associative - * array with numeric keys here because some JS engines - * will create an array with empty indexes up to - * max_index which can cause memory issues and because - * the keys, which may be relevant, will be remapped - * otherwise. - * - * As per the ECMA and JSON specification an object may - * have any string as a property. Unfortunately due to - * a hole in the ECMA specification if the key is a - * ECMA reserved word or starts with a digit the - * parameter is only accessible using ECMAScript's - * bracket notation. - */ - - // treat as a JSON object - if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { - $properties = array_map(array($this, 'name_value'), - array_keys($var), - array_values($var)); - - foreach($properties as $property) { - if(Services_JSON::isError($property)) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - } - - // treat it like a regular array - $elements = array_map(array($this, 'encode'), $var); - - foreach($elements as $element) { - if(Services_JSON::isError($element)) { - return $element; - } - } - - return '[' . join(',', $elements) . ']'; - - case 'object': - $vars = get_object_vars($var); - - $properties = array_map(array($this, 'name_value'), - array_keys($vars), - array_values($vars)); - - foreach($properties as $property) { - if(Services_JSON::isError($property)) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - - default: - return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) - ? 'null' - : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); - } - } - - /** - * array-walking function for use in generating JSON-formatted name-value pairs - * - * @param string $name name of key to use - * @param mixed $value reference to an array element to be encoded - * - * @return string JSON-formatted name-value pair, like '"name":value' - * @access private - */ - function name_value($name, $value) - { - $encoded_value = $this->encode($value); - - if(Services_JSON::isError($encoded_value)) { - return $encoded_value; - } - - return $this->encode(strval($name)) . ':' . $encoded_value; - } - - /** - * reduce a string by removing leading and trailing comments and whitespace - * - * @param $str string string value to strip of comments and whitespace - * - * @return string string value stripped of comments and whitespace - * @access private - */ - function reduce_string($str) - { - $str = preg_replace(array( - - // eliminate single line comments in '// ...' form - '#^\s*//(.+)$#m', - - // eliminate multi-line comments in '/* ... */' form, at start of string - '#^\s*/\*(.+)\*/#Us', - - // eliminate multi-line comments in '/* ... */' form, at end of string - '#/\*(.+)\*/\s*$#Us' - - ), '', $str); - - // eliminate extraneous space - return trim($str); - } - - /** - * decodes a JSON string into appropriate variable - * - * @param string $str JSON-formatted string - * - * @return mixed number, boolean, string, array, or object - * corresponding to given JSON input string. - * See argument 1 to Services_JSON() above for object-output behavior. - * Note that decode() always returns strings - * in ASCII or UTF-8 format! - * @access public - */ - function decode($str) - { - $str = $this->reduce_string($str); - - switch (strtolower($str)) { - case 'true': - return true; - - case 'false': - return false; - - case 'null': - return null; - - default: - $m = array(); - - if (is_numeric($str)) { - // Lookie-loo, it's a number - - // This would work on its own, but I'm trying to be - // good about returning integers where appropriate: - // return (float)$str; - - // Return float or int, as appropriate - return ((float)$str == (integer)$str) - ? (integer)$str - : (float)$str; - - } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { - // STRINGS RETURNED IN UTF-8 FORMAT - $delim = substr($str, 0, 1); - $chrs = substr($str, 1, -1); - $utf8 = ''; - $strlen_chrs = strlen($chrs); - - for ($c = 0; $c < $strlen_chrs; ++$c) { - - $substr_chrs_c_2 = substr($chrs, $c, 2); - $ord_chrs_c = ord($chrs{$c}); - - switch (true) { - case $substr_chrs_c_2 == '\b': - $utf8 .= chr(0x08); - ++$c; - break; - case $substr_chrs_c_2 == '\t': - $utf8 .= chr(0x09); - ++$c; - break; - case $substr_chrs_c_2 == '\n': - $utf8 .= chr(0x0A); - ++$c; - break; - case $substr_chrs_c_2 == '\f': - $utf8 .= chr(0x0C); - ++$c; - break; - case $substr_chrs_c_2 == '\r': - $utf8 .= chr(0x0D); - ++$c; - break; - - case $substr_chrs_c_2 == '\\"': - case $substr_chrs_c_2 == '\\\'': - case $substr_chrs_c_2 == '\\\\': - case $substr_chrs_c_2 == '\\/': - if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || - ($delim == "'" && $substr_chrs_c_2 != '\\"')) { - $utf8 .= $chrs{++$c}; - } - break; - - case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): - // single, escaped unicode character - $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) - . chr(hexdec(substr($chrs, ($c + 4), 2))); - $utf8 .= $this->utf162utf8($utf16); - $c += 5; - break; - - case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): - $utf8 .= $chrs{$c}; - break; - - case ($ord_chrs_c & 0xE0) == 0xC0: - // characters U-00000080 - U-000007FF, mask 110XXXXX - //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 2); - ++$c; - break; - - case ($ord_chrs_c & 0xF0) == 0xE0: - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 3); - $c += 2; - break; - - case ($ord_chrs_c & 0xF8) == 0xF0: - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 4); - $c += 3; - break; - - case ($ord_chrs_c & 0xFC) == 0xF8: - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 5); - $c += 4; - break; - - case ($ord_chrs_c & 0xFE) == 0xFC: - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 6); - $c += 5; - break; - - } - - } - - return $utf8; - - } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { - // array, or object notation - - if ($str{0} == '[') { - $stk = array(SERVICES_JSON_IN_ARR); - $arr = array(); - } else { - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $stk = array(SERVICES_JSON_IN_OBJ); - $obj = array(); - } else { - $stk = array(SERVICES_JSON_IN_OBJ); - $obj = new stdClass(); - } - } - - array_push($stk, array('what' => SERVICES_JSON_SLICE, - 'where' => 0, - 'delim' => false)); - - $chrs = substr($str, 1, -1); - $chrs = $this->reduce_string($chrs); - - if ($chrs == '') { - if (reset($stk) == SERVICES_JSON_IN_ARR) { - return $arr; - - } else { - return $obj; - - } - } - - //print("\nparsing {$chrs}\n"); - - $strlen_chrs = strlen($chrs); - - for ($c = 0; $c <= $strlen_chrs; ++$c) { - - $top = end($stk); - $substr_chrs_c_2 = substr($chrs, $c, 2); - - if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { - // found a comma that is not inside a string, array, etc., - // OR we've reached the end of the character list - $slice = substr($chrs, $top['where'], ($c - $top['where'])); - array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); - //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - if (reset($stk) == SERVICES_JSON_IN_ARR) { - // we are in an array, so just push an element onto the stack - array_push($arr, $this->decode($slice)); - - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { - // we are in an object, so figure - // out the property name and set an - // element in an associative array, - // for now - $parts = array(); - - if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { - // "name":value pair - $key = $this->decode($parts[1]); - $val = $this->decode($parts[2]); - - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { - // name:value pair, where name is unquoted - $key = $parts[1]; - $val = $this->decode($parts[2]); - - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } - - } - - } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { - // found a quote, and we are not inside a string - array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); - //print("Found start of string at {$c}\n"); - - } elseif (($chrs{$c} == $top['delim']) && - ($top['what'] == SERVICES_JSON_IN_STR) && - ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { - // found a quote, we're in a string, and it's not escaped - // we know that it's not escaped becase there is _not_ an - // odd number of backslashes at the end of the string so far - array_pop($stk); - //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '[') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a left-bracket, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); - //print("Found start of array at {$c}\n"); - - } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { - // found a right-bracket, and we're in an array - array_pop($stk); - //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '{') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a left-brace, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); - //print("Found start of object at {$c}\n"); - - } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { - // found a right-brace, and we're in an object - array_pop($stk); - //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($substr_chrs_c_2 == '/*') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a comment start, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); - $c++; - //print("Found start of comment at {$c}\n"); - - } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { - // found a comment end, and we're in one now - array_pop($stk); - $c++; - - for ($i = $top['where']; $i <= $c; ++$i) - $chrs = substr_replace($chrs, ' ', $i, 1); - - //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } - - } - - if (reset($stk) == SERVICES_JSON_IN_ARR) { - return $arr; - - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { - return $obj; - - } - - } - } - } - - /** - * @todo Ultimately, this should just call PEAR::isError() - */ - function isError($data, $code = null) - { - if (class_exists('pear')) { - return PEAR::isError($data, $code); - } elseif (is_object($data) && (get_class($data) == 'services_json_error' || - is_subclass_of($data, 'services_json_error'))) { - return true; - } - - return false; - } -} - -if (class_exists('PEAR_Error')) { - - class Services_JSON_Error extends PEAR_Error - { - function Services_JSON_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - parent::PEAR_Error($message, $code, $mode, $options, $userinfo); - } - } - -} else { - - /** - * @todo Ultimately, this class shall be descended from PEAR_Error - */ - class Services_JSON_Error - { - function Services_JSON_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - - } - } - -} - -?> diff --git a/include/limesurvey/admin/classes/pclzip/gnu-lgpl.txt b/include/limesurvey/admin/classes/pclzip/gnu-lgpl.txt deleted file mode 100644 index b1e3f5a2..00000000 --- a/include/limesurvey/admin/classes/pclzip/gnu-lgpl.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/include/limesurvey/admin/classes/pclzip/pclerror.lib.php b/include/limesurvey/admin/classes/pclzip/pclerror.lib.php deleted file mode 100644 index c776c0ce..00000000 --- a/include/limesurvey/admin/classes/pclzip/pclerror.lib.php +++ /dev/null @@ -1,132 +0,0 @@ -"; - $v_message .= "

PclError Library has detected a fatal error on file '$p_file', line $p_line

"; - $v_message .= "

$p_error_string

"; - $v_message .= ""; - die($v_message); - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclErrorReset() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function PclErrorReset() - { - global $g_pcl_error_string; - global $g_pcl_error_code; - - $g_pcl_error_code = 1; - $g_pcl_error_string = ""; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclErrorCode() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function PclErrorCode() - { - global $g_pcl_error_string; - global $g_pcl_error_code; - - return($g_pcl_error_code); - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclErrorString() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function PclErrorString() - { - global $g_pcl_error_string; - global $g_pcl_error_code; - - return($g_pcl_error_string." [code $g_pcl_error_code]"); - } - // -------------------------------------------------------------------------------- - - - // ----- End of double include look -} -?> diff --git a/include/limesurvey/admin/classes/pclzip/pcltrace.lib.php b/include/limesurvey/admin/classes/pclzip/pcltrace.lib.php deleted file mode 100644 index 876896f2..00000000 --- a/include/limesurvey/admin/classes/pclzip/pcltrace.lib.php +++ /dev/null @@ -1,737 +0,0 @@ -"; - echo "
"; - echo "
Trace
"; - echo ""; - - // ----- Content header - echo ""; - - // ----- Display - $v_again=0; - for ($i=0; $i"; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - } - - // ----- Content footer - echo "
"; - $n = ($g_pcl_trace_entries[$i]['index']+1)*10; - echo ""; - - echo ""; - switch ($g_pcl_trace_entries[$i]['type']) { - case 1: - echo ""; - break; - case 2: - echo ""; - break; - case 3: - case 4: - echo ""; - break; - default: - echo ""; - } - echo "
"; - - for ($j=0; $j<=$g_pcl_trace_entries[$i]['index']; $j++) - { - if ($j==$g_pcl_trace_entries[$i]['index']) - { - if (($g_pcl_trace_entries[$i]['type'] == 1) || ($g_pcl_trace_entries[$i]['type'] == 2)) - echo ""; - } - else - echo ""; - } - //echo ""; - echo "
+
|
 
".$g_pcl_trace_entries[$i]['name']."(".$g_pcl_trace_entries[$i]['param'].")".$g_pcl_trace_entries[$i]['name']."()=".$g_pcl_trace_entries[$i]['param']."
"; - echo "".$g_pcl_trace_entries[$i]['message'].""; - echo "
".$g_pcl_trace_entries[$i]['name']."(".$g_pcl_trace_entries[$i]['param'].")
".basename($g_pcl_trace_entries[$i]['file'])."".$g_pcl_trace_entries[$i]['line']."
"; - - // ----- Trace footer - echo "
"; - echo "
"; - echo "
 
"; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : TrDisplayNew() -// Description : -// Parameters : -// -------------------------------------------------------------------------------- -function PclTraceDisplayNew() -{ - global $g_pcl_trace_level; - global $g_pcl_trace_mode; - global $g_pcl_trace_filename; - global $g_pcl_trace_name; - global $g_pcl_trace_index; - global $g_pcl_trace_entries; - global $g_pcl_trace_suspend; - - // ----- Look for disabled trace - if (($g_pcl_trace_level <= 0) || ($g_pcl_trace_mode != "memory") || ($g_pcl_trace_suspend)) - return; - - ?> - - - - - - - -
-
Trace
-
"; - echo ""; - echo "".basename($g_pcl_trace_entries[$i]['file']).""; - echo ""; - echo "".$g_pcl_trace_entries[$i]['line'].""; - echo ""; - */ - } - - // ----- Trace footer - ?> - - -   - - - - -
-

- -

-
- - - - - - - - - - - - - - -
+ " - onClick="PclTraceToggleView(document.getElementById(''));"> - -
- - - - - - - - - - - - - - -
-
.
-
-
- - ".$p_entry['name']."(".$p_entry['param'].") : ".$p_entry['message']." [".$p_entry[file].", ".$p_entry[line]."]
"; - else if ($p_entry['type'] == 2) - echo "".$p_entry['name']."()=".$p_entry['param']." : ".$p_entry['message']." [".$p_entry[file].", ".$p_entry[line]."]
"; - else - echo $p_entry['message']." [".$p_entry['file'].", ".$p_entry['line']."]
"; - } -} -// -------------------------------------------------------------------------------- - -?> diff --git a/include/limesurvey/admin/classes/pclzip/pclzip-trace.lib.php b/include/limesurvey/admin/classes/pclzip/pclzip-trace.lib.php deleted file mode 100644 index ec1f21d3..00000000 --- a/include/limesurvey/admin/classes/pclzip/pclzip-trace.lib.php +++ /dev/null @@ -1,6348 +0,0 @@ -zipname = $p_zipname; - $this->zip_fd = 0; - $this->magic_quotes_status = -1; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, 1); - return; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // create($p_filelist, $p_add_dir="", $p_remove_dir="") - // create($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two different synopsis. The first one is historical. - // This method creates a Zip Archive. The Zip file is created in the - // filesystem. The files and directories indicated in $p_filelist - // are added in the archive. See the parameters description for the - // supported format of $p_filelist. - // When a directory is in the list, the directory and its content is added - // in the archive. - // In this synopsis, the function takes an optional variable list of - // options. See bellow the supported options. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function create($p_filelist) - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ..."); - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove from the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected"); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis"); - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Invalid number / type of arguments"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } - - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - if ($v_string != '') { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Ignore an empty filename"); - } - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - } - - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Call the create fct - $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $p_result_list); - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // add($p_filelist, $p_add_dir="", $p_remove_dir="") - // add($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two synopsis. The first one is historical. - // This methods add the list of files in an existing archive. - // If a file with the same name already exists, it is added at the end of the - // archive, the first one is still present. - // If the archive does not exist, it is created. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_OPT_ADD_COMMENT : - // PCLZIP_OPT_PREPEND_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function add($p_filelist) - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::add', "filelist='$p_filelist', ..."); - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected"); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_ADD_COMMENT => 'optional', - PCLZIP_OPT_PREPEND_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis"); - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } - - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - } - - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Call the create fct - $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $p_result_list); - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : listContent() - // Description : - // This public method, gives the list of the files and directories, with their - // properties. - // The properties of each entries in the list are (used also in other functions) : - // filename : Name of the file. For a create or add action it is the filename - // given by the user. For an extract function it is the filename - // of the extracted file. - // stored_filename : Name of the file / directory stored in the archive. - // size : Size of the stored file. - // compressed_size : Size of the file's data compressed in the archive - // (without the headers overhead) - // mtime : Last known modification date of the file (UNIX timestamp) - // comment : Comment associated with the file - // folder : true | false - // index : index of the file in the archive - // status : status of the action (depending of the action) : - // Values are : - // ok : OK ! - // filtered : the file / dir is not extracted (filtered by user) - // already_a_directory : the file can not be extracted because a - // directory with the same name already exists - // write_protected : the file can not be extracted because a file - // with the same name already exists and is - // write protected - // newer_exist : the file was not extracted because a newer file exists - // path_creation_fail : the file is not extracted because the folder - // does not exist and can not be created - // write_error : the file was not extracted because there was a - // error while writing the file - // read_error : the file was not extracted because there was a error - // while reading the file - // invalid_header : the file was not extracted because of an archive - // format error (bad file header) - // Note that each time a method can continue operating when there - // is an action error on a file, the error is only logged in the file status. - // Return Values : - // 0 on an unrecoverable failure, - // The list of the files in the archive. - // -------------------------------------------------------------------------------- - function listContent() - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::listContent', ""); - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return(0); - } - - // ----- Call the extracting fct - $p_list = array(); - if (($v_result = $this->privList($p_list)) != 1) - { - unset($p_list); - PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); - return(0); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // extract($p_path="./", $p_remove_path="") - // extract([$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method extract all the files / directories from the archive to the - // folder indicated in $p_path. - // If you want to ignore the 'root' part of path of the memorized files - // you can indicate this in the optional $p_remove_path parameter. - // By default, if a newer file with the same name already exists, the - // file is not extracted. - // - // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions - // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append - // at the end of the path value of PCLZIP_OPT_PATH. - // Parameters : - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 or a negative value on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function extract() - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::extract", ""); - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return(0); - } - - // ----- Set default values - $v_options = array(); - // $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options"); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis"); - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Trace - PclTraceFctMessage(__FILE__, __LINE__, 2, "path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'"); - - // ----- Call the extracting fct - $p_list = array(); - $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, - $v_remove_all_path, $v_options); - if ($v_result < 1) { - unset($p_list); - PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); - return(0); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // Function : - // extractByIndex($p_index, $p_path="./", $p_remove_path="") - // extractByIndex($p_index, [$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method is doing a partial extract of the archive. - // The extracted files or folders are identified by their index in the - // archive (from 0 to n). - // Note that if the index identify a folder, only the folder entry is - // extracted, not all the files included in the archive. - // Parameters : - // $p_index : A single index (integer) or a string of indexes of files to - // extract. The form of the string is "0,4-6,8-12" with only numbers - // and '-' for range or ',' to separate ranges. No spaces or ';' - // are allowed. - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and - // not as files. - // The resulting content is in a new field 'content' in the file - // structure. - // This option must be used alone (any other options are ignored). - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - //function extractByIndex($p_index, options...) - function extractByIndex($p_index) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::extractByIndex", "index='$p_index', ..."); - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return(0); - } - - // ----- Set default values - $v_options = array(); - // $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options"); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING not set."); - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING set."); - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis"); - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return 0; - } - } - } - - // ----- Trace - PclTraceFctMessage(__FILE__, __LINE__, 2, "index='$p_index', path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'"); - - // ----- Trick - // Here I want to reuse extractByRule(), so I need to parse the $p_index - // with privParseOptions() - $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); - $v_options_trick = array(); - $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, - array (PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Call the extracting fct - if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); - return(0); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // delete([$p_option, $p_option_value, ...]) - // Description : - // This method removes files from the archive. - // If no parameters are given, then all the archive is emptied. - // Parameters : - // None or optional arguments. - // Options : - // PCLZIP_OPT_BY_INDEX : - // PCLZIP_OPT_BY_NAME : - // PCLZIP_OPT_BY_EREG : - // PCLZIP_OPT_BY_PREG : - // Return Values : - // 0 on failure, - // The list of the files which are still present in the archive. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function delete() - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::delete", ""); - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return(0); - } - - // ----- Set default values - $v_options = array(); - - // ----- Look for variable options arguments - $v_size = func_num_args(); - PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - } - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Call the delete fct - $v_list = array(); - if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { - $this->privSwapBackMagicQuotes(); - unset($v_list); - PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); - return(0); - } - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_list); - return $v_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : deleteByIndex() - // Description : - // ***** Deprecated ***** - // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. - // -------------------------------------------------------------------------------- - function deleteByIndex($p_index) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::deleteByIndex", "index='$p_index'"); - - $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $p_list); - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : properties() - // Description : - // This method gives the properties of the archive. - // The properties are : - // nb : Number of files in the archive - // comment : Comment associated with the archive file - // status : not_exist, ok - // Parameters : - // None - // Return Values : - // 0 on failure, - // An array with the archive properties. - // -------------------------------------------------------------------------------- - function properties() - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::properties", ""); - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, 0); - return(0); - } - - // ----- Default properties - $v_prop = array(); - $v_prop['comment'] = ''; - $v_prop['nb'] = 0; - $v_prop['status'] = 'not_exist'; - - // ----- Look if file exists - if (@is_file($this->zipname)) - { - // ----- Open the zip file - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), 0); - return 0; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, 0); - return 0; - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Set the user attributes - $v_prop['comment'] = $v_central_dir['comment']; - $v_prop['nb'] = $v_central_dir['entries']; - $v_prop['status'] = 'ok'; - } - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_prop); - return $v_prop; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : duplicate() - // Description : - // This method creates an archive by copying the content of an other one. If - // the archive already exist, it is replaced by the new one without any warning. - // Parameters : - // $p_archive : The filename of a valid archive, or - // a valid PclZip object. - // Return Values : - // 1 on success. - // 0 or a negative value on error (error code). - // -------------------------------------------------------------------------------- - function duplicate($p_archive) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::duplicate", ""); - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the $p_archive is a PclZip object - if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is valid PclZip object '".$p_archive->zipname."'"); - - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive->zipname); - } - - // ----- Look if the $p_archive is a string (so a filename) - else if (is_string($p_archive)) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is a filename '$p_archive'"); - - // ----- Check that $p_archive is a valid zip file - // TBC : Should also check the archive format - if (!is_file($p_archive)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); - $v_result = PCLZIP_ERR_MISSING_FILE; - } - else { - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive); - } - } - - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : merge() - // Description : - // This method merge the $p_archive_to_add archive at the end of the current - // one ($this). - // If the archive ($this) does not exist, the merge becomes a duplicate. - // If the $p_archive_to_add archive does not exist, the merge is a success. - // Parameters : - // $p_archive_to_add : It can be directly the filename of a valid zip archive, - // or a PclZip object archive. - // Return Values : - // 1 on success, - // 0 or negative values on error (see below). - // -------------------------------------------------------------------------------- - function merge($p_archive_to_add) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::merge", ""); - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - PclTraceFctEnd(__FILE__, __LINE__, 0); - return(0); - } - - // ----- Look if the $p_archive_to_add is a PclZip object - if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is valid PclZip object"); - - // ----- Merge the archive - $v_result = $this->privMerge($p_archive_to_add); - } - - // ----- Look if the $p_archive_to_add is a string (so a filename) - else if (is_string($p_archive_to_add)) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is a filename"); - - // ----- Create a temporary archive - $v_object_archive = new PclZip($p_archive_to_add); - - // ----- Merge the archive - $v_result = $this->privMerge($v_object_archive); - } - - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - - - // -------------------------------------------------------------------------------- - // Function : errorCode() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorCode() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorCode()); - } - else { - return($this->error_code); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorName() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorName($p_with_code=false) - { - $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', - PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', - PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', - PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', - PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', - PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', - PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', - PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', - PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', - PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', - PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', - PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', - PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', - PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', - PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', - PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', - PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', - PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', - PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' - ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' - ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' - ); - - if (isset($v_name[$this->error_code])) { - $v_value = $v_name[$this->error_code]; - } - else { - $v_value = 'NoName'; - } - - if ($p_with_code) { - return($v_value.' ('.$this->error_code.')'); - } - else { - return($v_value); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorInfo() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorInfo($p_full=false) - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorString()); - } - else { - if ($p_full) { - return($this->errorName(true)." : ".$this->error_string); - } - else { - return($this->error_string." [code ".$this->error_code."]"); - } - } - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** - // ***** ***** - // ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** - // -------------------------------------------------------------------------------- - - - - // -------------------------------------------------------------------------------- - // Function : privCheckFormat() - // Description : - // This method check that the archive exists and is a valid zip archive. - // Several level of check exists. (futur) - // Parameters : - // $p_level : Level of check. Default 0. - // 0 : Check the first bytes (magic codes) (default value)) - // 1 : 0 + Check the central directory (futur) - // 2 : 1 + Check each file header (futur) - // Return Values : - // true on success, - // false on error, the error code is set. - // -------------------------------------------------------------------------------- - function privCheckFormat($p_level=0) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFormat", ""); - $v_result = true; - - // ----- Reset the file system cache - clearstatcache(); - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the file exits - if (!is_file($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); - PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo()); - return(false); - } - - // ----- Check that the file is readeable - if (!is_readable($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); - PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo()); - return(false); - } - - // ----- Check the magic code - // TBC - - // ----- Check the central header - // TBC - - // ----- Check each file header - // TBC - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privParseOptions() - // Description : - // This internal methods reads the variable list of arguments ($p_options_list, - // $p_size) and generate an array with the options and values ($v_result_list). - // $v_requested_options contains the options that can be present and those that - // must be present. - // $v_requested_options is an array, with the option value as key, and 'optional', - // or 'mandatory' as value. - // Parameters : - // See above. - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", ""); - $v_result=1; - - // ----- Read the options - $i=0; - while ($i<$p_size) { - PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'"); - - // ----- Check if the option is supported - if (!isset($v_requested_options[$p_options_list[$i]])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Look for next option - switch ($p_options_list[$i]) { - // ----- Look for options that request a path value - case PCLZIP_OPT_PATH : - case PCLZIP_OPT_REMOVE_PATH : - case PCLZIP_OPT_ADD_PATH : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_THRESHOLD : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Check the value - $v_value = $p_options_list[$i+1]; - if ((!is_integer($v_value)) || ($v_value<0)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value (and convert it in bytes) - $v_result_list[$p_options_list[$i]] = $v_value*1048576; - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_ON : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - break; - - case PCLZIP_OPT_TEMP_FILE_OFF : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - break; - - case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value - if ( is_string($p_options_list[$i+1]) - && ($p_options_list[$i+1] != '')) { - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - $i++; - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." set with an empty value is ignored."); - } - break; - - // ----- Look for options that request an array of string for value - case PCLZIP_OPT_BY_NAME : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - //PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - $i++; - break; - - // ----- Look for options that request an EREG or PREG expression - case PCLZIP_OPT_BY_EREG : - // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG - // to PCLZIP_OPT_BY_PREG - $p_options_list[$i] = PCLZIP_OPT_BY_PREG; - case PCLZIP_OPT_BY_PREG : - //case PCLZIP_OPT_CRYPT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - $i++; - break; - - // ----- Look for options that takes a string - case PCLZIP_OPT_COMMENT : - case PCLZIP_OPT_ADD_COMMENT : - case PCLZIP_OPT_PREPEND_COMMENT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, - "Missing parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, - "Wrong parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - $i++; - break; - - // ----- Look for options that request an array of index - case PCLZIP_OPT_BY_INDEX : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value - $v_work_list = array(); - if (is_string($p_options_list[$i+1])) { - PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'"); - - // ----- Remove spaces - $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); - - // ----- Parse items - $v_work_list = explode(",", $p_options_list[$i+1]); - } - else if (is_integer($p_options_list[$i+1])) { - PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'"); - $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array"); - $v_work_list = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Reduce the index list - // each index item in the list must be a couple with a start and - // an end value : [0,3], [5-5], [8-10], ... - // ----- Check the format of each item - $v_sort_flag=false; - $v_sort_value=0; - for ($j=0; $j= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); - $i++; - break; - - // ----- Look for options that request a call-back - case PCLZIP_CB_PRE_EXTRACT : - case PCLZIP_CB_POST_EXTRACT : - case PCLZIP_CB_PRE_ADD : - case PCLZIP_CB_POST_ADD : - /* for futur use - case PCLZIP_CB_PRE_DELETE : - case PCLZIP_CB_POST_DELETE : - case PCLZIP_CB_PRE_LIST : - case PCLZIP_CB_POST_LIST : - */ - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Get the value - $v_function_name = $p_options_list[$i+1]; - PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'"); - - // ----- Check that the value is a valid existing function - if (!function_exists($v_function_name)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Set the attribute - $v_result_list[$p_options_list[$i]] = $v_function_name; - $i++; - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '" - .$p_options_list[$i]."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Next options - $i++; - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")"); - // ----- Look if present - if (!isset($v_result_list[$key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - } - } - - // ----- Look for default values - if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - PclTraceFctMessage(__FILE__, __LINE__, 3,"Calculate auto threshold"); - - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOptionDefaultThreshold() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privOptionDefaultThreshold(&$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOptionDefaultThreshold", ""); - $v_result=1; - - if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - PclTraceFctMessage(__FILE__, __LINE__, 3,"Create an auto-threshold for use of temporay files"); - // ----- Get 'memory_limit' configuration value - $v_memory_limit = ini_get('memory_limit'); - $v_memory_limit = trim($v_memory_limit); - $last = strtolower(substr($v_memory_limit, -1)); - - if($last == 'g') - //$v_memory_limit = $v_memory_limit*1024*1024*1024; - $v_memory_limit = $v_memory_limit*1073741824; - if($last == 'm') - //$v_memory_limit = $v_memory_limit*1024*1024; - $v_memory_limit = $v_memory_limit*1048576; - if($last == 'k') - $v_memory_limit = $v_memory_limit*1024; - - $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); - - PclTraceFctMessage(__FILE__, __LINE__, 3,"Current memory usage : ".memory_get_usage(TRUE)." bytes"); - PclTraceFctMessage(__FILE__, __LINE__, 3,"Threshold value is : ".$p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]." bytes"); - - // ----- Sanity check : No threshold if value lower than 1M - if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { - PclTraceFctMessage(__FILE__, __LINE__, 3,"Unset the threshold (value ".$p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD].") because under 1Mo sanity check)"); - unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrParseAtt() - // Description : - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrParseAtt", ""); - $v_result=1; - - // ----- For each file in the list check the attributes - foreach ($p_file_list as $v_key => $v_value) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$v_key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Look for attribute - switch ($v_key) { - case PCLZIP_ATT_FILE_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'"); - - if ($p_filedescr['filename'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - break; - - case PCLZIP_ATT_FILE_NEW_SHORT_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'"); - - if ($p_filedescr['new_short_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - break; - - case PCLZIP_ATT_FILE_NEW_FULL_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'"); - - if ($p_filedescr['new_full_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - break; - - // ----- Look for options that takes a string - case PCLZIP_ATT_FILE_COMMENT : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - $p_filedescr['comment'] = $v_value; - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'"); - break; - - case PCLZIP_ATT_FILE_MTIME : - if (!is_integer($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - $p_filedescr['mtime'] = $v_value; - PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'"); - break; - - case PCLZIP_ATT_FILE_CONTENT : - $p_filedescr['content'] = $v_value; - //PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'"); - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '".$v_key."'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")"); - // ----- Look if present - if (!isset($p_file_list[$key])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - } - } - - // end foreach - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrExpand() - // Description : - // This method look for each item of the list to see if its a file, a folder - // or a string to be added as file. For any other type of files (link, other) - // just ignore the item. - // Then prepare the information that will be stored for that file. - // When its a folder, expand the folder with all the files that are in that - // folder (recursively). - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrExpand(&$p_filedescr_list, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrExpand", ""); - $v_result=1; - - // ----- Create a result list - $v_result_list = array(); - - // ----- Look each entry - for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); - - // ----- Add the descriptor in result list - $v_result_list[sizeof($v_result_list)] = $v_descr; - - // ----- Look for folder - if ($v_descr['type'] == 'folder') { - // ----- List of items in folder - $v_dirlist_descr = array(); - $v_dirlist_nb = 0; - if ($v_folder_handler = @opendir($v_descr['filename'])) { - while (($v_item_handler = @readdir($v_folder_handler)) !== false) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for '".$v_item_handler."' in the directory"); - - // ----- Skip '.' and '..' - if (($v_item_handler == '.') || ($v_item_handler == '..')) { - continue; - } - - // ----- Compose the full filename - $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; - - // ----- Look for different stored filename - // Because the name of the folder was changed, the name of the - // files/sub-folders also change - if (($v_descr['stored_filename'] != $v_descr['filename']) - && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { - PclTraceFctMessage(__FILE__, __LINE__, 3,"Inherite parent folder stored path"); - if ($v_descr['stored_filename'] != '') { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; - } - else { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; - } - } - - $v_dirlist_nb++; - } - - @closedir($v_folder_handler); - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to open dir '".$v_descr['filename']."' in read mode. Skipped."); - // TBC : unable to open folder in read mode - } - - // ----- Expand each element of the list - if ($v_dirlist_nb != 0) { - // ----- Expand - if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Concat the resulting list - PclTraceFctMessage(__FILE__, __LINE__, 2, "Merging result list (size '".sizeof($v_result_list)."') with dirlist (size '".sizeof($v_dirlist_descr)."')"); - $v_result_list = array_merge($v_result_list, $v_dirlist_descr); - PclTraceFctMessage(__FILE__, __LINE__, 2, "merged result list is size '".sizeof($v_result_list)."'"); - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Nothing in this folder to expand."); - } - - // ----- Free local array - unset($v_dirlist_descr); - } - } - - // ----- Get the result list - $p_filedescr_list = $v_result_list; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCreate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCreate($p_filedescr_list, &$p_result_list, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCreate", "list"); - $v_result=1; - $v_list_detail = array(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the file in write mode - if (($v_result = $this->privOpenFd('wb')) != 1) - { - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Add the list of files - $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); - - // ----- Close - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAdd() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAdd($p_filedescr_list, &$p_result_list, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAdd", "list"); - $v_result=1; - $v_list_detail = array(); - - // ----- Look if the archive exists or is empty - if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, or is empty, create it."); - - // ----- Do a create - $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Go to beginning of File - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'"); - @rewind($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'"); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset"); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = @fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Create the Central Dir files header - for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = $v_central_dir['comment']; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { - $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOpenFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privOpenFd($p_mode) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOpenFd", 'mode='.$p_mode); - $v_result=1; - - // ----- Look if already open - if ($this->zip_fd != 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Open the zip file - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Open file in '.$p_mode.' mode'); - if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCloseFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privCloseFd() - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCloseFd", ""); - $v_result=1; - - if ($this->zip_fd != 0) - @fclose($this->zip_fd); - $this->zip_fd = 0; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddList() - // Description : - // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is - // different from the real path of the file. This is usefull if you want to have PclTar - // running in any directory, and memorize relative path from an other directory. - // Parameters : - // $p_list : An array containing the file or directory names to add in the tar - // $p_result_list : list of added files with their properties (specially the status field) - // $p_add_dir : Path to add in the filename path archived - // $p_remove_dir : Path to remove in the filename path archived - // Return Values : - // -------------------------------------------------------------------------------- - // function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) - function privAddList($p_filedescr_list, &$p_result_list, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddList", "list"); - $v_result=1; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Create the Central Dir files header - for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileList() - // Description : - // Parameters : - // $p_filedescr_list : An array containing the file description - // or directory names to add in the zip - // $p_result_list : list of added files with their properties (specially the status field) - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileList", "filedescr_list"); - $v_result=1; - $v_header = array(); - - // ----- Recuperate the current number of elt in list - $v_nb = sizeof($p_result_list); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Before add, list have ".$v_nb." elements"); - - // ----- Loop on the files - for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, - $p_options); - if ($v_result != 1) { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Store the file infos - $p_result_list[$v_nb++] = $v_header; - } - } - PclTraceFctMessage(__FILE__, __LINE__, 4, "After add, list have ".$v_nb." elements"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFile($p_filedescr, &$p_header, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFile", "filename='".$p_filedescr['filename']."'"); - $v_result=1; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - // TBC : Already done in the fileAtt check ... ? - if ($p_filename == "") { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Look for a stored different filename - /* TBC : Removed - if (isset($p_filedescr['stored_filename'])) { - $v_stored_filename = $p_filedescr['stored_filename']; - PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is NOT the same "'.$v_stored_filename.'"'); - } - else { - $v_stored_filename = $p_filedescr['stored_filename']; - PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is the same'); - } - */ - - // ----- Set the file properties - clearstatcache(); - $p_header['version'] = 20; - $p_header['version_extracted'] = 10; - $p_header['flag'] = 0; - $p_header['compression'] = 0; - $p_header['crc'] = 0; - $p_header['compressed_size'] = 0; - $p_header['filename_len'] = strlen($p_filename); - $p_header['extra_len'] = 0; - $p_header['disk'] = 0; - $p_header['internal'] = 0; - $p_header['offset'] = 0; - $p_header['filename'] = $p_filename; - // TBC : Removed $p_header['stored_filename'] = $v_stored_filename; - $p_header['stored_filename'] = $p_filedescr['stored_filename']; - $p_header['extra'] = ''; - $p_header['status'] = 'ok'; - $p_header['index'] = -1; - - // ----- Look for regular file - if ($p_filedescr['type']=='file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for regular folder - else if ($p_filedescr['type']=='folder') { - $p_header['external'] = 0x00000010; - $p_header['mtime'] = filemtime($p_filename); - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for virtual file - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = strlen($p_filedescr['content']); - } - - PclTraceFctMessage(__FILE__, __LINE__, 5, "Header external extension '".sprintf("0x%X",$p_header['external'])."'"); - - // ----- Look for filetime - if (isset($p_filedescr['mtime'])) { - PclTraceFctMessage(__FILE__, __LINE__, 3,"Overload mtime value with :'".$p_filedescr['mtime']."'"); - $p_header['mtime'] = $p_filedescr['mtime']; - } - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['mtime'] = time(); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Virtual file : use current time '".$p_header['mtime']."' for mtime value."); - } - else { - $p_header['mtime'] = filemtime($p_filename); - } - - // ------ Look for file comment - if (isset($p_filedescr['comment'])) { - $p_header['comment_len'] = strlen($p_filedescr['comment']); - $p_header['comment'] = $p_filedescr['comment']; - } - else { - $p_header['comment_len'] = 0; - $p_header['comment'] = ''; - } - - // ----- Look for pre-add callback - if (isset($p_options[PCLZIP_CB_PRE_ADD])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_ADD]."()') is defined for the extraction"); - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_header['status'] = "skipped"; - $v_result = 1; - } - - // ----- Update the informations - // Only some fields can be modified - if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { - $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); - PclTraceFctMessage(__FILE__, __LINE__, 2, "New stored filename is '".$p_header['stored_filename']."'"); - } - } - - // ----- Look for empty stored filename - if ($p_header['stored_filename'] == "") { - $p_header['status'] = "filtered"; - } - - // ----- Check the path length - if (strlen($p_header['stored_filename']) > 0xFF) { - $p_header['status'] = 'filename_too_long'; - } - - // ----- Look if no error, or file not skipped - if ($p_header['status'] == 'ok') { - - // ----- Look for a file - if ($p_filedescr['type'] == 'file') { - // ----- Look for using temporary file to zip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { - $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Use "in memory" zip algo - else { - PclTraceFctMessage(__FILE__, __LINE__, 2,"In memory compression."); - PclTraceFctMessage(__FILE__, __LINE__, 2,"Current memory usage : ".memory_get_usage(TRUE)." bytes"); - PclTraceFctMessage(__FILE__, __LINE__, 2,"Current memory peak : ".memory_get_peak_usage(TRUE)." bytes"); - PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file"); - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Read the file content - $v_content = @fread($v_file, $p_header['size']); - PclTraceFctMessage(__FILE__, __LINE__, 2,"Memory usage after reading file : ".memory_get_usage(TRUE)." bytes"); - PclTraceFctMessage(__FILE__, __LINE__, 2,"Memory peak after reading file : ".memory_get_peak_usage(TRUE)." bytes"); - - // ----- Close the file - @fclose($v_file); - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed"); - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed"); - // ----- Compress the content - $v_content = @gzdeflate($v_content); - PclTraceFctMessage(__FILE__, __LINE__, 2,"Memory usage after gzdeflate : ".memory_get_usage(TRUE)." bytes"); - PclTraceFctMessage(__FILE__, __LINE__, 2,"Memory peak after gzdeflate : ".memory_get_peak_usage(TRUE)." bytes"); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - - } - - } - - // ----- Look for a virtual file (a file from string) - else if ($p_filedescr['type'] == 'virtual_file') { - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Add by string"); - $v_content = $p_filedescr['content']; - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed"); - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed"); - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - } - - // ----- Look for a directory - else if ($p_filedescr['type'] == 'folder') { - PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a folder"); - // ----- Look for directory last '/' - if (@substr($p_header['stored_filename'], -1) != '/') { - $p_header['stored_filename'] .= '/'; - } - - // ----- Set the file properties - $p_header['size'] = 0; - //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked - $p_header['external'] = 0x00000010; // Value for a folder : to be checked - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) - { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - } - } - - // ----- Look for post-add callback - if (isset($p_options[PCLZIP_CB_POST_ADD])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_ADD]."()') is defined for the extraction"); - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Ignored - $v_result = 1; - } - - // ----- Update the informations - // Nothing can be modified - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileUsingTempFile", "filename='".$p_filedescr['filename']."'"); - $v_result=PCLZIP_ERR_NO_ERROR; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file"); - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Creates a compressed temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = filesize($p_filename); - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read ".$v_read_size." bytes"); - $v_buffer = @fread($v_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @gzputs($v_file_compressed, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file); - @gzclose($v_file_compressed); - - // ----- Check the minimum file size - PclTraceFctMessage(__FILE__, __LINE__, 4, "gzip file size ".filesize($v_gzip_temp_name)); - if (filesize($v_gzip_temp_name) < 18) { - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Extract the compressed attributes - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Read the gzip file header - $v_binary_data = @fread($v_file_compressed, 10); - $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); - - // ----- Check some parameters - PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[id1]='.bin2hex($v_data_header['id1'])); - PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[id2]='.bin2hex($v_data_header['id2'])); - PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[cm]='.bin2hex($v_data_header['cm'])); - PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[flag]='.bin2hex($v_data_header['flag'])); - PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[mtime]='.$v_data_header['mtime']); - PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[xfl]='.bin2hex($v_data_header['xfl'])); - PclTraceFctMessage(__FILE__, __LINE__, 4, '$v_data_header[os]='.bin2hex($v_data_header['os'])); - $v_data_header['os'] = bin2hex($v_data_header['os']); - - // ----- Read the gzip file footer - PclTraceFctMessage(__FILE__, __LINE__, 4, "File position after header ".ftell($v_file_compressed)); - @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); - PclTraceFctMessage(__FILE__, __LINE__, 4, "File position at beginning of footer ".ftell($v_file_compressed)); - $v_binary_data = @fread($v_file_compressed, 8); - PclTraceFctMessage(__FILE__, __LINE__, 4, "File position after footer ".ftell($v_file_compressed)); - $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); - - // ----- Set the attributes - $p_header['compression'] = ord($v_data_header['cm']); - //$p_header['mtime'] = $v_data_header['mtime']; - $p_header['crc'] = $v_data_footer['crc']; - PclTraceFctMessage(__FILE__, __LINE__, 4, "Compressed size ".(filesize($v_gzip_temp_name)-18)); - $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Add the compressed data - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) - { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - fseek($v_file_compressed, 10); - PclTraceFctMessage(__FILE__, __LINE__, 4, "File position before reading compressed data ".ftell($v_file_compressed)); - PclTraceFctMessage(__FILE__, __LINE__, 4, ' '.$p_header['compressed_size'].' bytes to read'); - $v_size = $p_header['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read ".$v_read_size." bytes"); - $v_buffer = @fread($v_file_compressed, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Unlink the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCalculateStoredFilename() - // Description : - // Based on file descriptor properties and global options, this method - // calculate the filename that will be stored in the archive. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCalculateStoredFilename(&$p_filedescr, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCalculateStoredFilename", "filename='".$p_filedescr['filename']."'"); - $v_result=1; - - // ----- Working variables - $p_filename = $p_filedescr['filename']; - if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { - $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; - } - else { - $p_add_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { - $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; - } - else { - $p_remove_dir = ''; - } - PclTraceFctMessage(__FILE__, __LINE__, 3, "Remove path ='".$p_remove_dir."'"); - if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - else { - $p_remove_all_dir = 0; - } - - - // ----- Look for full name change - if (isset($p_filedescr['new_full_name'])) { - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing full name of '".$p_filename."' for '".$v_stored_filename."'"); - } - - // ----- Look for path and/or short name change - else { - - // ----- Look for short name change - // Its when we cahnge just the filename but not the path - if (isset($p_filedescr['new_short_name'])) { - $v_path_info = pathinfo($p_filename); - $v_dir = ''; - if ($v_path_info['dirname'] != '') { - $v_dir = $v_path_info['dirname'].'/'; - } - $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; - PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing short name of '".$p_filename."' for '".$v_stored_filename."'"); - } - else { - // ----- Calculate the stored filename - $v_stored_filename = $p_filename; - } - - // ----- Look for all path to remove - if ($p_remove_all_dir) { - $v_stored_filename = basename($p_filename); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove all path selected change '".$p_filename."' for '".$v_stored_filename."'"); - } - // ----- Look for partial path remove - else if ($p_remove_dir != "") { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Partial path to remove"); - if (substr($p_remove_dir, -1) != '/') - $p_remove_dir .= "/"; - - if ( (substr($p_filename, 0, 2) == "./") - || (substr($p_remove_dir, 0, 2) == "./")) { - - if ( (substr($p_filename, 0, 2) == "./") - && (substr($p_remove_dir, 0, 2) != "./")) { - $p_remove_dir = "./".$p_remove_dir; - } - if ( (substr($p_filename, 0, 2) != "./") - && (substr($p_remove_dir, 0, 2) == "./")) { - $p_remove_dir = substr($p_remove_dir, 2); - } - } - - $v_compare = PclZipUtilPathInclusion($p_remove_dir, - $v_stored_filename); - if ($v_compare > 0) { - if ($v_compare == 2) { - $v_stored_filename = ""; - PclTraceFctMessage(__FILE__, __LINE__, 4, "Path to remove is the current folder"); - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove path '$p_remove_dir' in file '$v_stored_filename'"); - $v_stored_filename = substr($v_stored_filename, - strlen($p_remove_dir)); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Result is '$v_stored_filename'"); - } - } - } - - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); - - // ----- Look for path to add - if ($p_add_dir != "") { - if (substr($p_add_dir, -1) == "/") - $v_stored_filename = $p_add_dir.$v_stored_filename; - else - $v_stored_filename = $p_add_dir."/".$v_stored_filename; - PclTraceFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'"); - } - } - - // ----- Filename (reduce the path of stored name) - $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); - $p_filedescr['stored_filename'] = $v_stored_filename; - PclTraceFctMessage(__FILE__, __LINE__, 2, "Stored filename will be '".$p_filedescr['stored_filename']."', strlen ".strlen($p_filedescr['stored_filename'])); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteFileHeader(&$p_header) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"'); - $v_result=1; - - // ----- Store the offset position of the file - $p_header['offset'] = ftell($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 2, 'File offset of the header :'.$p_header['offset']); - - // ----- Transform UNIX mtime to DOS format mdate/mtime - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - // ----- Packed data - $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, - $p_header['version_extracted'], $p_header['flag'], - $p_header['compression'], $v_mtime, $v_mdate, - $p_header['crc'], $p_header['compressed_size'], - $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len']); - - // ----- Write the first 148 bytes of the header in the archive - fputs($this->zip_fd, $v_binary_data, 30); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralFileHeader(&$p_header) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"'); - $v_result=1; - - // TBC - //for(reset($p_header); $key = key($p_header); next($p_header)) { - // PclTraceFctMessage(__FILE__, __LINE__, 3, "header[$key] = ".$p_header[$key]); - //} - - // ----- Transform UNIX mtime to DOS format mdate/mtime - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment size : \''.$p_header['comment_len'].'\''); - - // ----- Packed data - $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, - $p_header['version'], $p_header['version_extracted'], - $p_header['flag'], $p_header['compression'], - $v_mtime, $v_mdate, $p_header['crc'], - $p_header['compressed_size'], $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len'], $p_header['comment_len'], - $p_header['disk'], $p_header['internal'], - $p_header['external'], $p_header['offset']); - - // ----- Write the 42 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 46); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - if ($p_header['comment_len'] != 0) - { - fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralHeader", 'nb_entries='.$p_nb_entries.', size='.$p_size.', offset='.$p_offset.', comment="'.$p_comment.'"'); - $v_result=1; - - // ----- Packed data - $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, - $p_nb_entries, $p_size, - $p_offset, strlen($p_comment)); - - // ----- Write the 22 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 22); - - // ----- Write the variable fields - if (strlen($p_comment) != 0) - { - fputs($this->zip_fd, $p_comment, strlen($p_comment)); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privList() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privList(&$p_list) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privList", "list"); - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Go to beginning of Central Dir - PclTraceFctMessage(__FILE__, __LINE__, 3, "Offset : ".$v_central_dir['offset']."'"); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'"); - @rewind($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'"); - if (@fseek($this->zip_fd, $v_central_dir['offset'])) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'"); - - // ----- Read each entry - for ($i=0; $i<$v_central_dir['entries']; $i++) - { - // ----- Read the file header - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - $v_header['index'] = $i; - - // ----- Get the only interesting attributes - $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); - unset($v_header); - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privConvertHeader2FileInfo() - // Description : - // This function takes the file informations from the central directory - // entries and extract the interesting parameters that will be given back. - // The resulting file infos are set in the array $p_info - // $p_info['filename'] : Filename with full path. Given by user (add), - // extracted in the filesystem (extract). - // $p_info['stored_filename'] : Stored filename in the archive. - // $p_info['size'] = Size of the file. - // $p_info['compressed_size'] = Compressed size of the file. - // $p_info['mtime'] = Last modification date of the file. - // $p_info['comment'] = Comment associated with the file. - // $p_info['folder'] = true/false : indicates if the entry is a folder or not. - // $p_info['status'] = status of the action on the file. - // $p_info['crc'] = CRC of the file content. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privConvertHeader2FileInfo($p_header, &$p_info) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privConvertHeader2FileInfo", "Filename='".$p_header['filename']."'"); - $v_result=1; - - // ----- Get the interesting attributes - $v_temp_path = PclZipUtilPathReduction($p_header['filename']); - $p_info['filename'] = $v_temp_path; - $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); - $p_info['stored_filename'] = $v_temp_path; - $p_info['size'] = $p_header['size']; - $p_info['compressed_size'] = $p_header['compressed_size']; - $p_info['mtime'] = $p_header['mtime']; - $p_info['comment'] = $p_header['comment']; - $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); - $p_info['index'] = $p_header['index']; - $p_info['status'] = $p_header['status']; - $p_info['crc'] = $p_header['crc']; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractByRule() - // Description : - // Extract a file or directory depending of rules (by index, by name, ...) - // Parameters : - // $p_file_list : An array where will be placed the properties of each - // extracted file - // $p_path : Path to add while writing the extracted files - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_remove_path does not apply to 'list' mode. - // $p_path and $p_remove_path are commulative. - // Return Values : - // 1 on success,0 or less on error (see error code list) - // -------------------------------------------------------------------------------- - function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privExtractByRule", "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'"); - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check the path - if ( ($p_path == "") - || ( (substr($p_path, 0, 1) != "/") - && (substr($p_path, 0, 3) != "../") - && (substr($p_path,1,2)!=":/"))) - $p_path = "./".$p_path; - - // ----- Reduce the path last (and duplicated) '/' - if (($p_path != "./") && ($p_path != "/")) - { - // ----- Look for the path end '/' - while (substr($p_path, -1) == "/") - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'"); - $p_path = substr($p_path, 0, strlen($p_path)-1); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]"); - } - } - - // ----- Look for path to remove format (should end by /) - if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) - { - $p_remove_path .= '/'; - } - $p_remove_path_size = strlen($p_remove_path); - - // ----- Open the zip file - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_result = $this->privOpenFd('rb')) != 1) - { - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - - // ----- Read each entry - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry : '$i'"); - - // ----- Read next Central dir entry - PclTraceFctMessage(__FILE__, __LINE__, 4, "Position before rewind : ".ftell($this->zip_fd)."'"); - @rewind($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Position after rewind : ".ftell($this->zip_fd)."'"); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - PclTraceFctMessage(__FILE__, __LINE__, 3, "Position after fseek : ".ftell($this->zip_fd)."'"); - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Store the index - $v_header['index'] = $i; - - // ----- Store the file position - $v_pos_entry = ftell($this->zip_fd); - - // ----- Look for the specific extract rules - $v_extract = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'"); - - // ----- Look if the filename is in the list - for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path"); - $v_extract = true; - } - } - // ----- Look for a filename - elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one."); - $v_extract = true; - } - } - } - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'"); - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression"); - $v_extract = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'"); - - // ----- Look if the index is in the list - for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range"); - $v_extract = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop"); - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop"); - break; - } - } - } - - // ----- Look for no rule, which means extract all the archive - else { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with no rule (extract all)"); - $v_extract = true; - } - - // ----- Check compression method - if ( ($v_extract) - && ( ($v_header['compression'] != 8) - && ($v_header['compression'] != 0))) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported compression method (".$v_header['compression'].")"); - $v_header['status'] = 'unsupported_compression'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, - "Filename '".$v_header['stored_filename']."' is " - ."compressed by an unsupported compression " - ."method (".$v_header['compression'].") "); - - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - - // ----- Check encrypted files - if (($v_extract) && (($v_header['flag'] & 1) == 1)) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported file encryption"); - $v_header['status'] = 'unsupported_encryption'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, - "Unsupported encryption for " - ." filename '".$v_header['stored_filename'] - ."'"); - - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - - // ----- Look for real extraction - if (($v_extract) && ($v_header['status'] != 'ok')) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "No need for extract"); - $v_result = $this->privConvertHeader2FileInfo($v_header, - $p_file_list[$v_nb_extracted++]); - if ($v_result != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - $v_extract = false; - } - - // ----- Look for real extraction - if ($v_extract) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file '".$v_header['filename']."', index '$i'"); - - // ----- Go to the file position - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'"); - @rewind($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'"); - if (@fseek($this->zip_fd, $v_header['offset'])) - { - // ----- Close the zip file - $this->privCloseFd(); - - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'"); - - // ----- Look for extraction as string - if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { - - $v_string = ''; - - // ----- Extracting the file - $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result1); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Set the file content - $p_file_list[$v_nb_extracted]['content'] = $v_string; - - // ----- Next extracted file - $v_nb_extracted++; - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for extraction in standard output - elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) - && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { - // ----- Extracting the file in standard output - $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result1); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for normal extraction - else { - // ----- Extracting the file - $v_result1 = $this->privExtractFile($v_header, - $p_path, $p_remove_path, - $p_remove_all_path, - $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result1); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - } - } - - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFile() - // Description : - // Parameters : - // Return Values : - // - // 1 : ... ? - // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback - // -------------------------------------------------------------------------------- - function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFile', "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'"); - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'"); - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for all path to remove - if ($p_remove_all_path == true) { - // ----- Look for folder entry that not need to be extracted - if (($p_entry['external']&0x00000010)==0x00000010) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "The entry is a folder : need to be filtered"); - - $p_entry['status'] = "filtered"; - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - PclTraceFctMessage(__FILE__, __LINE__, 3, "All path is removed"); - // ----- Get the basename of the path - $p_entry['filename'] = basename($p_entry['filename']); - } - - // ----- Look for path to remove - else if ($p_remove_path != "") - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Look for some path to remove"); - if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "The folder is the same as the removed path '".$p_entry['filename']."'"); - - // ----- Change the file status - $p_entry['status'] = "filtered"; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - $p_remove_path_size = strlen($p_remove_path); - if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '".$p_entry['filename']."'"); - - // ----- Remove the path - $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); - - PclTraceFctMessage(__FILE__, __LINE__, 3, "Resulting file is '".$p_entry['filename']."'"); - } - } - - // ----- Add the path - if ($p_path != '') { - $p_entry['filename'] = $p_path."/".$p_entry['filename']; - } - - // ----- Check a base_dir_restriction - if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Check the extract directory restriction"); - $v_inclusion - = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], - $p_entry['filename']); - if ($v_inclusion == 0) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_EXTRACT_DIR_RESTRICTION is selected, file is outside restriction"); - - PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, - "Filename '".$p_entry['filename']."' is " - ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); - - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction"); - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'"); - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'"); - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Look for specific actions while the file exist - if (file_exists($p_entry['filename'])) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_entry['filename']."' already exists"); - - // ----- Look if file is a directory - if (is_dir($p_entry['filename'])) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is a directory"); - - // ----- Change the file status - $p_entry['status'] = "already_a_directory"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); - - PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, - "Filename '".$p_entry['filename']."' is " - ."already used by an existing directory"); - - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - // ----- Look if file is write protected - else if (!is_writeable($p_entry['filename'])) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is write protected"); - - // ----- Change the file status - $p_entry['status'] = "write_protected"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Filename '".$p_entry['filename']."' exists " - ."and is write protected"); - - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - - // ----- Look if the extracted file is older - else if (filemtime($p_entry['filename']) > $p_entry['mtime']) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is newer (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")"); - // ----- Change the file status - if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) - && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_REPLACE_NEWER is selected, file will be replaced"); - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be replaced"); - $p_entry['status'] = "newer_exist"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Newer version of '".$p_entry['filename']."' exists " - ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); - - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is older than the extrated one - will be replaced by the extracted one (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")"); - } - } - - // ----- Check the directory availability and create it if necessary - else { - if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) - $v_dir_to_check = $p_entry['filename']; - else if (!strstr($p_entry['filename'], "/")) - $v_dir_to_check = ""; - else - $v_dir_to_check = dirname($p_entry['filename']); - - if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '".$p_entry['filename']."'"); - - // ----- Change the file status - $p_entry['status'] = "path_creation_fail"; - - // ----- Return - //PclTraceFctEnd(__FILE__, __LINE__, $v_result); - //return $v_result; - $v_result = 1; - } - } - } - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) - { - // ----- Look for not compressed file - if ($p_entry['compression'] == 0) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file"); - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode"); - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Read '".$p_entry['size']."' bytes"); - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes"); - $v_buffer = @fread($this->zip_fd, $v_read_size); - /* Try to speed up the code - $v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_binary_data, $v_read_size); - */ - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Closing the destination file - fclose($v_dest_file); - - // ----- Change the file mtime - touch($p_entry['filename'], $p_entry['mtime']); - - - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (Compression method ".$p_entry['compression'].")"); - // ----- TBC - // Need to be finished - if (($p_entry['flag'] & 1) == 1) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File is encrypted"); - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - - // ----- Look for using temporary file to unzip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { - $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Look for extract in memory - else { - - PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".$p_entry['compressed_size']."' compressed bytes"); - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = @gzinflate($v_buffer); - unset($v_buffer); - if ($v_file_content === FALSE) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to inflate compressed file"); - - // ----- Change the file status - // TBC - $p_entry['status'] = "error"; - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode"); - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Write the uncompressed data - @fwrite($v_dest_file, $v_file_content, $p_entry['size']); - unset($v_file_content); - - // ----- Closing the destination file - @fclose($v_dest_file); - - } - - // ----- Change the file mtime - @touch($p_entry['filename'], $p_entry['mtime']); - } - - // ----- Look for chmod option - if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "chmod option activated '".$p_options[PCLZIP_OPT_SET_CHMOD]."'"); - - // ----- Change the mode of the file - @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done"); - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction"); - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileUsingTempFile(&$p_entry, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileUsingTempFile', "filename='".$p_entry['filename']."'"); - $v_result=1; - - // ----- Creates a temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Start extraction of '".$p_entry['filename']."'"); - - // ----- Write gz file format header - $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); - @fwrite($v_dest_file, $v_binary_data, 10); - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - PclTraceFctMessage(__FILE__, __LINE__, 2, "Compressed Size :".$v_size.""); - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 2, "Read ".$v_read_size." bytes"); - $v_buffer = @fread($this->zip_fd, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Write gz file format footer - $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); - @fwrite($v_dest_file, $v_binary_data, 8); - - // ----- Close the temporary file - @fclose($v_dest_file); - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode"); - $p_entry['status'] = "write_error"; - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Open the temporary gz file - if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { - @fclose($v_dest_file); - $p_entry['status'] = "read_error"; - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, 'File size is '.filesize($v_gzip_temp_name)); - PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes"); - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['size']; - PclTraceFctMessage(__FILE__, __LINE__, 2, "Size :".$v_size.""); - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 2, "Read ".$v_read_size." bytes"); - $v_buffer = @gzread($v_src_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - @fclose($v_dest_file); - @gzclose($v_src_file); - - // ----- Delete the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileInOutput() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileInOutput(&$p_entry, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileInOutput', ""); - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'"); - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction"); - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'"); - } - - // ----- Trace - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'"); - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - if ($p_entry['compressed_size'] == $p_entry['size']) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file"); - PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes"); - - // ----- Read the file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Send the file to the output - echo $v_buffer; - unset($v_buffer); - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file"); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Reading '".$p_entry['size']."' bytes"); - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = gzinflate($v_buffer); - unset($v_buffer); - - // ----- Send the file to the output - echo $v_file_content; - unset($v_file_content); - } - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done"); - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction"); - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileAsString() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileAsString', "p_entry['filename']='".$p_entry['filename']."'"); - $v_result=1; - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'"); - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction"); - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'"); - } - - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file in string (with path) '".$p_entry['filename']."', size '$v_header[size]'"); - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - // if ($p_entry['compressed_size'] == $p_entry['size']) - if ($p_entry['compression'] == 0) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file"); - PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes"); - - // ----- Reading the file - $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (compression method '".$p_entry['compression']."')"); - - // ----- Reading the file - $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - if (($p_string = @gzinflate($v_data)) === FALSE) { - // TBC - } - } - - // ----- Trace - PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done"); - } - else { - // TBC : error : can not extract a folder in a string - } - - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction"); - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Swap the content to header - $v_local_header['content'] = $p_string; - $p_string = ''; - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Swap back the content to header - $p_string = $v_local_header['content']; - unset($v_local_header['content']); - - // ----- Look for abort result - if ($v_result == 2) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadFileHeader(&$p_header) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadFileHeader", ""); - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'"); - $v_data = unpack('Vid', $v_binary_data); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'"); - - // ----- Check signature - if ($v_data['id'] != 0x04034b50) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid File header"); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 26); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 26) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Extract the values - PclTraceFctMessage(__FILE__, __LINE__, 2, "Header : '".$v_binary_data."'"); - PclTraceFctMessage(__FILE__, __LINE__, 2, "Header (Hex) : '".bin2hex($v_binary_data)."'"); - $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); - - // ----- Get filename - PclTraceFctMessage(__FILE__, __LINE__, 3, "File name length : ".$v_data['filename_len']); - $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename : \''.$p_header['filename'].'\''); - - // ----- Get extra_fields - PclTraceFctMessage(__FILE__, __LINE__, 3, "Extra field length : ".$v_data['extra_len']); - if ($v_data['extra_len'] != 0) { - $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); - } - else { - $p_header['extra'] = ''; - } - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Extra field : \''.bin2hex($p_header['extra']).'\''); - - // ----- Extract properties - $p_header['version_extracted'] = $v_data['version']; - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : ('.$p_header['version_extracted'].') \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\''); - $p_header['compression'] = $v_data['compression']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compression method : \''.$p_header['compression'].'\''); - $p_header['size'] = $v_data['size']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_header['size'].'\''); - $p_header['compressed_size'] = $v_data['compressed_size']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_header['compressed_size'].'\''); - $p_header['crc'] = $v_data['crc']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\''); - $p_header['flag'] = $v_data['flag']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag : \''.$p_header['flag'].'\''); - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag bit 11 (from right) : \''.($p_header['flag']&0x0400).'\''); - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag bit 11 (from left) : \''.($p_header['flag']&0x0020).'\''); - $p_header['filename_len'] = $v_data['filename_len']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename_len : \''.$p_header['filename_len'].'\''); - - // ----- Recuperate date in UNIX format - $p_header['mdate'] = $v_data['mdate']; - $p_header['mtime'] = $v_data['mtime']; - if ($p_header['mdate'] && $p_header['mtime']) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); - } - else - { - $p_header['mtime'] = time(); - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); - } - - // TBC - //for(reset($v_data); $key = key($v_data); next($v_data)) { - // PclTraceFctMessage(__FILE__, __LINE__, 3, "Attribut[$key] = ".$v_data[$key]); - //} - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set the status field - $p_header['status'] = "ok"; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadCentralFileHeader(&$p_header) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadCentralFileHeader", ""); - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'"); - $v_data = unpack('Vid', $v_binary_data); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'"); - - // ----- Check signature - if ($v_data['id'] != 0x02014b50) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid Central Dir File signature"); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 42); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 42) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Extract the values - PclTraceFctMessage(__FILE__, __LINE__, 5, "Header : '".$v_binary_data."'"); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Header (Hex) : '".bin2hex($v_binary_data)."'"); - $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); - - // ----- Get filename - PclTraceFctMessage(__FILE__, __LINE__, 4, "File name length : ".$p_header['filename_len']); - if ($p_header['filename_len'] != 0) - $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); - else - $p_header['filename'] = ''; - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Filename : \''.$p_header['filename'].'\''); - - // ----- Get extra - PclTraceFctMessage(__FILE__, __LINE__, 4, "Extra length : ".$p_header['extra_len']); - if ($p_header['extra_len'] != 0) - $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); - else - $p_header['extra'] = ''; - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Extra : \''.$p_header['extra'].'\''); - - // ----- Get comment - PclTraceFctMessage(__FILE__, __LINE__, 4, "Comment length : ".$p_header['comment_len']); - if ($p_header['comment_len'] != 0) - $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); - else - $p_header['comment'] = ''; - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Comment : \''.$p_header['comment'].'\''); - - // ----- Extract properties - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version : \''.($p_header['version']/10).'.'.($p_header['version']%10).'\''); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\''); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Size : \''.$p_header['size'].'\''); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Compressed Size : \''.$p_header['compressed_size'].'\''); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\''); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Flag : \''.$p_header['flag'].'\''); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Offset : \''.$p_header['offset'].'\''); - - // ----- Recuperate date in UNIX format - //if ($p_header['mdate'] && $p_header['mtime']) - // TBC : bug : this was ignoring time with 0/0/0 - if (1) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); - } - else - { - $p_header['mtime'] = time(); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); - } - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set default status to ok - $p_header['status'] = 'ok'; - - // ----- Look if it is a directory - PclTraceFctMessage(__FILE__, __LINE__, 5, "Internal (Hex) : '".sprintf("Ox%04X", $p_header['internal'])."'"); - PclTraceFctMessage(__FILE__, __LINE__, 4, "External (Hex) : '".sprintf("Ox%04X", $p_header['external'])."' (".(($p_header['external']&0x00000010)==0x00000010?'is a folder':'is a file').')'); - if (substr($p_header['filename'], -1) == '/') { - //$p_header['external'] = 0x41FF0010; - $p_header['external'] = 0x00000010; - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Force folder external : \''.sprintf("Ox%04X", $p_header['external']).'\''); - } - - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Header of filename : \''.$p_header['filename'].'\''); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCheckFileHeaders() - // Description : - // Parameters : - // Return Values : - // 1 on success, - // 0 on error; - // -------------------------------------------------------------------------------- - function privCheckFileHeaders(&$p_local_header, &$p_central_header) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFileHeaders", ""); - $v_result=1; - - // ----- Check the static values - // TBC - if ($p_local_header['filename'] != $p_central_header['filename']) { - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename" : TBC To Be Completed'); - } - if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "version_extracted" : TBC To Be Completed'); - } - if ($p_local_header['flag'] != $p_central_header['flag']) { - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "flag" : TBC To Be Completed'); - } - if ($p_local_header['compression'] != $p_central_header['compression']) { - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "compression" : TBC To Be Completed'); - } - if ($p_local_header['mtime'] != $p_central_header['mtime']) { - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "mtime" : TBC To Be Completed'); - } - if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename_len" : TBC To Be Completed'); - } - - // ----- Look for flag bit 3 - if (($p_local_header['flag'] & 8) == 8) { - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Purpose bit flag bit 3 set !'); - PclTraceFctMessage(__FILE__, __LINE__, 3, 'File size, compression size and crc found in central header'); - $p_local_header['size'] = $p_central_header['size']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_local_header['size'].'\''); - $p_local_header['compressed_size'] = $p_central_header['compressed_size']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_local_header['compressed_size'].'\''); - $p_local_header['crc'] = $p_central_header['crc']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_local_header['crc']).'\''); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadEndCentralDir() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadEndCentralDir(&$p_central_dir) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadEndCentralDir", ""); - $v_result=1; - - // ----- Go to the end of the zip file - $v_size = filesize($this->zipname); - PclTraceFctMessage(__FILE__, __LINE__, 2, "Size of the file :$v_size"); - @fseek($this->zip_fd, $v_size); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position at end of zip file : \''.ftell($this->zip_fd).'\''); - if (@ftell($this->zip_fd) != $v_size) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- First try : look if this is an archive with no commentaries (most of the time) - // in this case the end of central dir is at 22 bytes of the file end - $v_found = 0; - if ($v_size > 26) { - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Look for central dir with no comment'); - @fseek($this->zip_fd, $v_size-22); - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after min central position : \''.ftell($this->zip_fd).'\''); - if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Read for bytes - $v_binary_data = @fread($this->zip_fd, 4); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Binary data is : '".sprintf("%08x", $v_binary_data)."'"); - $v_data = @unpack('Vid', $v_binary_data); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'"); - - // ----- Check signature - if ($v_data['id'] == 0x06054b50) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Found central dir at the default position."); - $v_found = 1; - } - - $v_pos = ftell($this->zip_fd); - } - - // ----- Go back to the maximum possible size of the Central Dir End Record - if (!$v_found) { - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Start extended search of end central dir'); - $v_maximum_size = 65557; // 0xFFFF + 22; - if ($v_maximum_size > $v_size) - $v_maximum_size = $v_size; - @fseek($this->zip_fd, $v_size-$v_maximum_size); - if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after max central position : \''.ftell($this->zip_fd).'\''); - - // ----- Read byte per byte in order to find the signature - $v_pos = ftell($this->zip_fd); - $v_bytes = 0x00000000; - while ($v_pos < $v_size) - { - // ----- Read a byte - $v_byte = @fread($this->zip_fd, 1); - - // ----- Add the byte - //$v_bytes = ($v_bytes << 8) | Ord($v_byte); - // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number - // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. - $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); - - // ----- Compare the bytes - if ($v_bytes == 0x504b0506) - { - PclTraceFctMessage(__FILE__, __LINE__, 4, 'Found End Central Dir signature at position : \''.ftell($this->zip_fd).'\''); - $v_pos++; - break; - } - - $v_pos++; - } - - // ----- Look if not found end of central dir - if ($v_pos == $v_size) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to find End of Central Dir Record signature"); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - - // ----- Read the first 18 bytes of the header - $v_binary_data = fread($this->zip_fd, 18); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 18) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Extract the values - //PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record : '".$v_binary_data."'"); - //PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record (Hex) : '".bin2hex($v_binary_data)."'"); - $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); - - // ----- Check the global size - PclTraceFctMessage(__FILE__, __LINE__, 3, "Comment length : ".$v_data['comment_size']); - if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { - PclTraceFctMessage(__FILE__, __LINE__, 2, "The central dir is not at the end of the archive. Some trailing bytes exists after the archive."); - - // ----- Removed in release 2.2 see readme file - // The check of the file size is a little too strict. - // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. - // While decrypted, zip has training 0 bytes - if (0) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, - 'The central dir is not at the end of the archive.' - .' Some trailing bytes exists after the archive.'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - } - - // ----- Get comment - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment size : \''.$v_data['comment_size'].'\''); - if ($v_data['comment_size'] != 0) { - $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); - } - else - $p_central_dir['comment'] = ''; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment : \''.$p_central_dir['comment'].'\''); - - $p_central_dir['entries'] = $v_data['entries']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries : \''.$p_central_dir['entries'].'\''); - $p_central_dir['disk_entries'] = $v_data['disk_entries']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries for this disk : \''.$p_central_dir['disk_entries'].'\''); - $p_central_dir['offset'] = $v_data['offset']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Offset of Central Dir : \''.$p_central_dir['offset'].'\''); - $p_central_dir['size'] = $v_data['size']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size of Central Dir : \''.$p_central_dir['size'].'\''); - $p_central_dir['disk'] = $v_data['disk']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Disk number : \''.$p_central_dir['disk'].'\''); - $p_central_dir['disk_start'] = $v_data['disk_start']; - PclTraceFctMessage(__FILE__, __LINE__, 3, 'Start disk number : \''.$p_central_dir['disk_start'].'\''); - - // TBC - //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { - // PclTraceFctMessage(__FILE__, __LINE__, 3, "central_dir[$key] = ".$p_central_dir[$key]); - //} - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDeleteByRule() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDeleteByRule(&$p_result_list, &$p_options) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDeleteByRule", ""); - $v_result=1; - $v_list_detail = array(); - - // ----- Open the zip file - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Go to beginning of File - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'"); - @rewind($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'"); - - // ----- Scan all the files - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'"); - @rewind($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'"); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'"); - - // ----- Read each entry - $v_header_list = array(); - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry (index '$i')"); - - // ----- Read the file header - $v_header_list[$v_nb_extracted] = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename (index '$i') : '".$v_header_list[$v_nb_extracted]['stored_filename']."'"); - - // ----- Store the index - $v_header_list[$v_nb_extracted]['index'] = $i; - - // ----- Look for the specific extract rules - $v_found = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'"); - - // ----- Look if the filename is in the list - for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path"); - $v_found = true; - } - elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ - && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "The entry is the searched directory"); - $v_found = true; - } - } - // ----- Look for a filename - elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one."); - $v_found = true; - } - } - } - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'"); - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression"); - $v_found = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'"); - - // ----- Look if the index is in the list - for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range"); - $v_found = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop"); - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop"); - break; - } - } - } - else { - PclTraceFctMessage(__FILE__, __LINE__, 3, "No argument mean remove all file"); - $v_found = true; - } - - // ----- Look for deletion - if ($v_found) - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' need to be deleted"); - unset($v_header_list[$v_nb_extracted]); - } - else - { - PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' will not be deleted"); - $v_nb_extracted++; - } - } - - // ----- Look if something need to be deleted - if ($v_nb_extracted > 0) { - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Creates a temporary zip archive - $v_temp_zip = new PclZip($v_zip_temp_name); - - // ----- Open the temporary zip file in write mode - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary write mode"); - if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { - $this->privCloseFd(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look which file need to be kept - for ($i=0; $izip_fd)."'"); - @rewind($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'"); - if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'"); - - // ----- Read the file header - $v_local_header = array(); - if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Check that local file header is same as central file header - if ($this->privCheckFileHeaders($v_local_header, - $v_header_list[$i]) != 1) { - // TBC - } - unset($v_local_header); - - // ----- Write the file header - if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset for this file is '".$v_header_list[$i]['offset']."'"); - - // ----- Read/write the data block - if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_temp_zip->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 5, "New offset of central dir : $v_offset"); - - // ----- Re-Create the Central Dir files header - PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the new central directory"); - for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Transform the header to a 'usable' info - $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the central directory footer"); - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { - // ----- Reset the file list - unset($v_header_list); - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Close - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Destroy the temporary archive - unset($v_temp_zip); - } - - // ----- Remove every files : reset the file - else if ($v_central_dir['entries'] != 0) { - $this->privCloseFd(); - - if (($v_result = $this->privOpenFd('wb')) != 1) { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - $this->privCloseFd(); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDirCheck() - // Description : - // Check if a directory exists, if not it creates it and all the parents directory - // which may be useful. - // Parameters : - // $p_dir : Directory path to check. - // Return Values : - // 1 : OK - // -1 : Unable to create directory - // -------------------------------------------------------------------------------- - function privDirCheck($p_dir, $p_is_dir=false) - { - $v_result = 1; - - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDirCheck", "entry='$p_dir', is_dir='".($p_is_dir?"true":"false")."'"); - - // ----- Remove the final '/' - if (($p_is_dir) && (substr($p_dir, -1)=='/')) - { - $p_dir = substr($p_dir, 0, strlen($p_dir)-1); - } - PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for entry '$p_dir'"); - - // ----- Check the directory availability - if ((is_dir($p_dir)) || ($p_dir == "")) - { - PclTraceFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory"); - return 1; - } - - // ----- Extract parent directory - $p_parent_dir = dirname($p_dir); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'"); - - // ----- Just a check - if ($p_parent_dir != $p_dir) - { - // ----- Look for parent directory - if ($p_parent_dir != "") - { - if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) - { - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - } - } - - // ----- Create the directory - PclTraceFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'"); - if (!@mkdir($p_dir, 0777)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created"); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privMerge() - // Description : - // If $p_archive_to_add does not exist, the function exit with a success result. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privMerge(&$p_archive_to_add) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privMerge", "archive='".$p_archive_to_add->zipname."'"); - $v_result=1; - - // ----- Look if the archive_to_add exists - if (!is_file($p_archive_to_add->zipname)) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to add does not exist. End of merge."); - - // ----- Nothing to merge, so merge is a success - $v_result = 1; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look if the archive exists - if (!is_file($this->zipname)) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, duplicate the archive_to_add."); - - // ----- Do a duplicate - $v_result = $this->privDuplicate($p_archive_to_add->zipname); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Open the zip file - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Go to beginning of File - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'"); - @rewind($this->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'"); - - // ----- Open the archive_to_add file - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open archive_to_add in binary read mode"); - if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) - { - $this->privCloseFd(); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir_to_add = array(); - if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Go to beginning of File - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'"); - @rewind($p_archive_to_add->zip_fd); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'"); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the files from the archive_to_add into the temporary file - $v_size = $v_central_dir_to_add['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_zip_temp_fd); - PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset"); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = @fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the block of file headers from the archive_to_add - $v_size = $v_central_dir_to_add['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Merge the file comments - $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; - - // ----- Calculate the size of the (new) central header - $v_size = @ftell($v_zip_temp_fd)-$v_offset; - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive fd - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - @fclose($v_zip_temp_fd); - $this->zip_fd = null; - - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDuplicate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDuplicate($p_archive_filename) - { - PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDuplicate", "archive_filename='$p_archive_filename'"); - $v_result=1; - - // ----- Look if the $p_archive_filename exists - if (!is_file($p_archive_filename)) - { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to duplicate does not exist. End of duplicate."); - - // ----- Nothing to duplicate, so duplicate is a success. - $v_result = 1; - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Open the zip file - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_result=$this->privOpenFd('wb')) != 1) - { - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Open the temporary file in write mode - PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); - if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) - { - $this->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = filesize($p_archive_filename); - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Read $v_read_size bytes"); - $v_buffer = fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorLog() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorLog($p_error_code=0, $p_error_string='') - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclError($p_error_code, $p_error_string); - } - else { - $this->error_code = $p_error_code; - $this->error_string = $p_error_string; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorReset() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorReset() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclErrorReset(); - } - else { - $this->error_code = 0; - $this->error_string = ''; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDisableMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDisableMagicQuotes() - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDisableMagicQuotes', ""); - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported"); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look if already done - if ($this->magic_quotes_status != -1) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote already disabled"); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Get and memorize the magic_quote value - $this->magic_quotes_status = @get_magic_quotes_runtime(); - PclTraceFctMessage(__FILE__, __LINE__, 3, "Current magic_quotes_runtime status is '".($this->magic_quotes_status==0?'disable':'enable')."'"); - - // ----- Disable magic_quotes - if ($this->magic_quotes_status == 1) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Disable magic_quotes"); - @set_magic_quotes_runtime(0); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privSwapBackMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privSwapBackMagicQuotes() - { - PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privSwapBackMagicQuotes', ""); - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported"); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Look if something to do - if ($this->magic_quotes_status != -1) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote not modified"); - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - - // ----- Swap back magic_quotes - if ($this->magic_quotes_status == 1) { - PclTraceFctMessage(__FILE__, __LINE__, 3, "Enable back magic_quotes"); - @set_magic_quotes_runtime($this->magic_quotes_status); - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; - } - // -------------------------------------------------------------------------------- - -} -// End of class -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilPathReduction() -// Description : -// Parameters : -// Return Values : -// -------------------------------------------------------------------------------- -function PclZipUtilPathReduction($p_dir) -{ - PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathReduction", "dir='$p_dir'"); - $v_result = ""; - - // ----- Look for not empty path - if ($p_dir != "") { - // ----- Explode path by directory names - $v_list = explode("/", $p_dir); - - // ----- Study directories from last to first - $v_skip = 0; - for ($i=sizeof($v_list)-1; $i>=0; $i--) { - // ----- Look for current path - if ($v_list[$i] == ".") { - // ----- Ignore this directory - // Should be the first $i=0, but no check is done - } - else if ($v_list[$i] == "..") { - $v_skip++; - } - else if ($v_list[$i] == "") { - // ----- First '/' i.e. root slash - if ($i == 0) { - $v_result = "/".$v_result; - if ($v_skip > 0) { - // ----- It is an invalid path, so the path is not modified - // TBC - $v_result = $p_dir; - PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid path is unchanged"); - $v_skip = 0; - } - } - // ----- Last '/' i.e. indicates a directory - else if ($i == (sizeof($v_list)-1)) { - $v_result = $v_list[$i]; - } - // ----- Double '/' inside the path - else { - // ----- Ignore only the double '//' in path, - // but not the first and last '/' - } - } - else { - // ----- Look for item to skip - if ($v_skip > 0) { - $v_skip--; - } - else { - $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); - } - } - } - - // ----- Look for skip - if ($v_skip > 0) { - while ($v_skip > 0) { - $v_result = '../'.$v_result; - $v_skip--; - } - } - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilPathInclusion() -// Description : -// This function indicates if the path $p_path is under the $p_dir tree. Or, -// said in an other way, if the file or sub-dir $p_path is inside the dir -// $p_dir. -// The function indicates also if the path is exactly the same as the dir. -// This function supports path with duplicated '/' like '//', but does not -// support '.' or '..' statements. -// Parameters : -// Return Values : -// 0 if $p_path is not inside directory $p_dir -// 1 if $p_path is inside directory $p_dir -// 2 if $p_path is exactly the same as $p_dir -// -------------------------------------------------------------------------------- -function PclZipUtilPathInclusion($p_dir, $p_path) -{ - PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathInclusion", "dir='$p_dir', path='$p_path'"); - $v_result = 1; - - // ----- Look for path beginning by ./ - if ( ($p_dir == '.') - || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { - $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_dir '".$p_dir."'"); - } - if ( ($p_path == '.') - || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { - $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_path '".$p_path."'"); - } - - // ----- Explode dir and path by directory separator - $v_list_dir = explode("/", $p_dir); - $v_list_dir_size = sizeof($v_list_dir); - $v_list_path = explode("/", $p_path); - $v_list_path_size = sizeof($v_list_path); - - // ----- Study directories paths - $i = 0; - $j = 0; - while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { - PclTraceFctMessage(__FILE__, __LINE__, 5, "Working on dir($i)='".$v_list_dir[$i]."' and path($j)='".$v_list_path[$j]."'"); - - // ----- Look for empty dir (path reduction) - if ($v_list_dir[$i] == '') { - $i++; - continue; - } - if ($v_list_path[$j] == '') { - $j++; - continue; - } - - // ----- Compare the items - if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { - PclTraceFctMessage(__FILE__, __LINE__, 5, "Items ($i,$j) are different"); - $v_result = 0; - } - - // ----- Next items - $i++; - $j++; - } - - // ----- Look if everything seems to be the same - if ($v_result) { - PclTraceFctMessage(__FILE__, __LINE__, 5, "Look for tie break"); - // ----- Skip all the empty items - while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; - while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; - PclTraceFctMessage(__FILE__, __LINE__, 5, "Looking on dir($i)='".($i < $v_list_dir_size?$v_list_dir[$i]:'')."' and path($j)='".($j < $v_list_path_size?$v_list_path[$j]:'')."'"); - - if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { - // ----- There are exactly the same - $v_result = 2; - } - else if ($i < $v_list_dir_size) { - // ----- The path is shorter than the dir - $v_result = 0; - } - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilCopyBlock() -// Description : -// Parameters : -// $p_mode : read/write compression mode -// 0 : src & dest normal -// 1 : src gzip, dest normal -// 2 : src normal, dest gzip -// 3 : src & dest gzip -// Return Values : -// -------------------------------------------------------------------------------- -function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) -{ - PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilCopyBlock", "size=$p_size, mode=$p_mode"); - $v_result = 1; - - if ($p_mode==0) - { - PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset before read :".(@ftell($p_src))); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset before write :".(@ftell($p_dest))); - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = @fread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset after read :".(@ftell($p_src))); - PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset after write :".(@ftell($p_dest))); - } - else if ($p_mode==1) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = @gzread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==2) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = @fread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==3) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); - $v_buffer = @gzread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilRename() -// Description : -// This function tries to do a simple rename() function. If it fails, it -// tries to copy the $p_src file in a new $p_dest file and then unlink the -// first one. -// Parameters : -// $p_src : Old filename -// $p_dest : New filename -// Return Values : -// 1 on success, 0 on failure. -// -------------------------------------------------------------------------------- -function PclZipUtilRename($p_src, $p_dest) -{ - PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilRename", "source=$p_src, destination=$p_dest"); - $v_result = 1; - - // ----- Try to rename the files - if (!@rename($p_src, $p_dest)) { - PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to rename file, try copy+unlink"); - - // ----- Try to copy & unlink the src - if (!@copy($p_src, $p_dest)) { - PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to copy file"); - $v_result = 0; - } - else if (!@unlink($p_src)) { - PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to unlink old filename"); - $v_result = 0; - } - } - - // ----- Return - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilOptionText() -// Description : -// Translate option value in text. Mainly for debug purpose. -// Parameters : -// $p_option : the option value. -// Return Values : -// The option text value. -// -------------------------------------------------------------------------------- -function PclZipUtilOptionText($p_option) -{ - PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilOptionText", "option='".$p_option."'"); - - $v_list = get_defined_constants(); - for (reset($v_list); $v_key = key($v_list); next($v_list)) { - $v_prefix = substr($v_key, 0, 10); - if (( ($v_prefix == 'PCLZIP_OPT') - || ($v_prefix == 'PCLZIP_CB_') - || ($v_prefix == 'PCLZIP_ATT')) - && ($v_list[$v_key] == $p_option)) { - PclTraceFctEnd(__FILE__, __LINE__, $v_key); - return $v_key; - } - } - - $v_result = 'Unknown'; - - PclTraceFctEnd(__FILE__, __LINE__, $v_result); - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilTranslateWinPath() -// Description : -// Translate windows path by replacing '\' by '/' and optionally removing -// drive letter. -// Parameters : -// $p_path : path to translate. -// $p_remove_disk_letter : true | false -// Return Values : -// The path translated. -// -------------------------------------------------------------------------------- -function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) -{ - if (stristr(php_uname(), 'windows')) { - // ----- Look for potential disk letter - if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { - $p_path = substr($p_path, $v_position+1); - } - // ----- Change potential windows directory separator - if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { - $p_path = strtr($p_path, '\\', '/'); - } - } - return $p_path; -} -// -------------------------------------------------------------------------------- - - -?> diff --git a/include/limesurvey/admin/classes/pclzip/pclzip.lib.php b/include/limesurvey/admin/classes/pclzip/pclzip.lib.php deleted file mode 100644 index 7e96630b..00000000 --- a/include/limesurvey/admin/classes/pclzip/pclzip.lib.php +++ /dev/null @@ -1,5670 +0,0 @@ -zipname = $p_zipname; - $this->zip_fd = 0; - $this->magic_quotes_status = -1; - - // ----- Return - return; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // create($p_filelist, $p_add_dir="", $p_remove_dir="") - // create($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two different synopsis. The first one is historical. - // This method creates a Zip Archive. The Zip file is created in the - // filesystem. The files and directories indicated in $p_filelist - // are added in the archive. See the parameters description for the - // supported format of $p_filelist. - // When a directory is in the list, the directory and its content is added - // in the archive. - // In this synopsis, the function takes an optional variable list of - // options. See bellow the supported options. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function create($p_filelist) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove from the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Invalid number / type of arguments"); - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } - - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - if ($v_string != '') { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - else { - } - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - return 0; - } - } - - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Call the create fct - $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Return - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // add($p_filelist, $p_add_dir="", $p_remove_dir="") - // add($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two synopsis. The first one is historical. - // This methods add the list of files in an existing archive. - // If a file with the same name already exists, it is added at the end of the - // archive, the first one is still present. - // If the archive does not exist, it is created. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_OPT_ADD_COMMENT : - // PCLZIP_OPT_PREPEND_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function add($p_filelist) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_ADD_COMMENT => 'optional', - PCLZIP_OPT_PREPEND_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } - - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } - - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - return 0; - } - } - - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Call the create fct - $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - return 0; - } - - // ----- Return - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : listContent() - // Description : - // This public method, gives the list of the files and directories, with their - // properties. - // The properties of each entries in the list are (used also in other functions) : - // filename : Name of the file. For a create or add action it is the filename - // given by the user. For an extract function it is the filename - // of the extracted file. - // stored_filename : Name of the file / directory stored in the archive. - // size : Size of the stored file. - // compressed_size : Size of the file's data compressed in the archive - // (without the headers overhead) - // mtime : Last known modification date of the file (UNIX timestamp) - // comment : Comment associated with the file - // folder : true | false - // index : index of the file in the archive - // status : status of the action (depending of the action) : - // Values are : - // ok : OK ! - // filtered : the file / dir is not extracted (filtered by user) - // already_a_directory : the file can not be extracted because a - // directory with the same name already exists - // write_protected : the file can not be extracted because a file - // with the same name already exists and is - // write protected - // newer_exist : the file was not extracted because a newer file exists - // path_creation_fail : the file is not extracted because the folder - // does not exist and can not be created - // write_error : the file was not extracted because there was a - // error while writing the file - // read_error : the file was not extracted because there was a error - // while reading the file - // invalid_header : the file was not extracted because of an archive - // format error (bad file header) - // Note that each time a method can continue operating when there - // is an action error on a file, the error is only logged in the file status. - // Return Values : - // 0 on an unrecoverable failure, - // The list of the files in the archive. - // -------------------------------------------------------------------------------- - function listContent() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Call the extracting fct - $p_list = array(); - if (($v_result = $this->privList($p_list)) != 1) - { - unset($p_list); - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // extract($p_path="./", $p_remove_path="") - // extract([$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method extract all the files / directories from the archive to the - // folder indicated in $p_path. - // If you want to ignore the 'root' part of path of the memorized files - // you can indicate this in the optional $p_remove_path parameter. - // By default, if a newer file with the same name already exists, the - // file is not extracted. - // - // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions - // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append - // at the end of the path value of PCLZIP_OPT_PATH. - // Parameters : - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 or a negative value on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function extract() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); - // $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Trace - - // ----- Call the extracting fct - $p_list = array(); - $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, - $v_remove_all_path, $v_options); - if ($v_result < 1) { - unset($p_list); - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // Function : - // extractByIndex($p_index, $p_path="./", $p_remove_path="") - // extractByIndex($p_index, [$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method is doing a partial extract of the archive. - // The extracted files or folders are identified by their index in the - // archive (from 0 to n). - // Note that if the index identify a folder, only the folder entry is - // extracted, not all the files included in the archive. - // Parameters : - // $p_index : A single index (integer) or a string of indexes of files to - // extract. The form of the string is "0,4-6,8-12" with only numbers - // and '-' for range or ',' to separate ranges. No spaces or ';' - // are allowed. - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and - // not as files. - // The resulting content is in a new field 'content' in the file - // structure. - // This option must be used alone (any other options are ignored). - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - //function extractByIndex($p_index, options...) - function extractByIndex($p_index) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); - // $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - } - else { - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } - - // ----- Trace - - // ----- Trick - // Here I want to reuse extractByRule(), so I need to parse the $p_index - // with privParseOptions() - $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); - $v_options_trick = array(); - $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, - array (PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - return 0; - } - $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Call the extracting fct - if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { - return(0); - } - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // delete([$p_option, $p_option_value, ...]) - // Description : - // This method removes files from the archive. - // If no parameters are given, then all the archive is emptied. - // Parameters : - // None or optional arguments. - // Options : - // PCLZIP_OPT_BY_INDEX : - // PCLZIP_OPT_BY_NAME : - // PCLZIP_OPT_BY_EREG : - // PCLZIP_OPT_BY_PREG : - // Return Values : - // 0 on failure, - // The list of the files which are still present in the archive. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function delete() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Set default values - $v_options = array(); - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - return 0; - } - } - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Call the delete fct - $v_list = array(); - if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { - $this->privSwapBackMagicQuotes(); - unset($v_list); - return(0); - } - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : deleteByIndex() - // Description : - // ***** Deprecated ***** - // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. - // -------------------------------------------------------------------------------- - function deleteByIndex($p_index) - { - - $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : properties() - // Description : - // This method gives the properties of the archive. - // The properties are : - // nb : Number of files in the archive - // comment : Comment associated with the archive file - // status : not_exist, ok - // Parameters : - // None - // Return Values : - // 0 on failure, - // An array with the archive properties. - // -------------------------------------------------------------------------------- - function properties() - { - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - $this->privSwapBackMagicQuotes(); - return(0); - } - - // ----- Default properties - $v_prop = array(); - $v_prop['comment'] = ''; - $v_prop['nb'] = 0; - $v_prop['status'] = 'not_exist'; - - // ----- Look if file exists - if (@is_file($this->zipname)) - { - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - return 0; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - return 0; - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Set the user attributes - $v_prop['comment'] = $v_central_dir['comment']; - $v_prop['nb'] = $v_central_dir['entries']; - $v_prop['status'] = 'ok'; - } - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_prop; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : duplicate() - // Description : - // This method creates an archive by copying the content of an other one. If - // the archive already exist, it is replaced by the new one without any warning. - // Parameters : - // $p_archive : The filename of a valid archive, or - // a valid PclZip object. - // Return Values : - // 1 on success. - // 0 or a negative value on error (error code). - // -------------------------------------------------------------------------------- - function duplicate($p_archive) - { - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the $p_archive is a PclZip object - if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) - { - - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive->zipname); - } - - // ----- Look if the $p_archive is a string (so a filename) - else if (is_string($p_archive)) - { - - // ----- Check that $p_archive is a valid zip file - // TBC : Should also check the archive format - if (!is_file($p_archive)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); - $v_result = PCLZIP_ERR_MISSING_FILE; - } - else { - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive); - } - } - - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : merge() - // Description : - // This method merge the $p_archive_to_add archive at the end of the current - // one ($this). - // If the archive ($this) does not exist, the merge becomes a duplicate. - // If the $p_archive_to_add archive does not exist, the merge is a success. - // Parameters : - // $p_archive_to_add : It can be directly the filename of a valid zip archive, - // or a PclZip object archive. - // Return Values : - // 1 on success, - // 0 or negative values on error (see below). - // -------------------------------------------------------------------------------- - function merge($p_archive_to_add) - { - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } - - // ----- Look if the $p_archive_to_add is a PclZip object - if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) - { - - // ----- Merge the archive - $v_result = $this->privMerge($p_archive_to_add); - } - - // ----- Look if the $p_archive_to_add is a string (so a filename) - else if (is_string($p_archive_to_add)) - { - - // ----- Create a temporary archive - $v_object_archive = new PclZip($p_archive_to_add); - - // ----- Merge the archive - $v_result = $this->privMerge($v_object_archive); - } - - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - - - // -------------------------------------------------------------------------------- - // Function : errorCode() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorCode() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorCode()); - } - else { - return($this->error_code); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorName() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorName($p_with_code=false) - { - $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', - PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', - PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', - PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', - PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', - PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', - PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', - PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', - PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', - PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', - PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', - PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', - PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', - PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', - PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', - PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', - PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', - PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', - PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' - ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' - ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' - ); - - if (isset($v_name[$this->error_code])) { - $v_value = $v_name[$this->error_code]; - } - else { - $v_value = 'NoName'; - } - - if ($p_with_code) { - return($v_value.' ('.$this->error_code.')'); - } - else { - return($v_value); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorInfo() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorInfo($p_full=false) - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorString()); - } - else { - if ($p_full) { - return($this->errorName(true)." : ".$this->error_string); - } - else { - return($this->error_string." [code ".$this->error_code."]"); - } - } - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** - // ***** ***** - // ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** - // -------------------------------------------------------------------------------- - - - - // -------------------------------------------------------------------------------- - // Function : privCheckFormat() - // Description : - // This method check that the archive exists and is a valid zip archive. - // Several level of check exists. (futur) - // Parameters : - // $p_level : Level of check. Default 0. - // 0 : Check the first bytes (magic codes) (default value)) - // 1 : 0 + Check the central directory (futur) - // 2 : 1 + Check each file header (futur) - // Return Values : - // true on success, - // false on error, the error code is set. - // -------------------------------------------------------------------------------- - function privCheckFormat($p_level=0) - { - $v_result = true; - - // ----- Reset the file system cache - clearstatcache(); - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the file exits - if (!is_file($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); - return(false); - } - - // ----- Check that the file is readeable - if (!is_readable($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); - return(false); - } - - // ----- Check the magic code - // TBC - - // ----- Check the central header - // TBC - - // ----- Check each file header - // TBC - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privParseOptions() - // Description : - // This internal methods reads the variable list of arguments ($p_options_list, - // $p_size) and generate an array with the options and values ($v_result_list). - // $v_requested_options contains the options that can be present and those that - // must be present. - // $v_requested_options is an array, with the option value as key, and 'optional', - // or 'mandatory' as value. - // Parameters : - // See above. - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) - { - $v_result=1; - - // ----- Read the options - $i=0; - while ($i<$p_size) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$p_options_list[$i]])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for next option - switch ($p_options_list[$i]) { - // ----- Look for options that request a path value - case PCLZIP_OPT_PATH : - case PCLZIP_OPT_REMOVE_PATH : - case PCLZIP_OPT_ADD_PATH : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_THRESHOLD : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - return PclZip::errorCode(); - } - - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - return PclZip::errorCode(); - } - - // ----- Check the value - $v_value = $p_options_list[$i+1]; - if ((!is_integer($v_value)) || ($v_value<0)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - return PclZip::errorCode(); - } - - // ----- Get the value (and convert it in bytes) - $v_result_list[$p_options_list[$i]] = $v_value*1048576; - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_ON : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - break; - - case PCLZIP_OPT_TEMP_FILE_OFF : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); - return PclZip::errorCode(); - } - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - break; - - case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if ( is_string($p_options_list[$i+1]) - && ($p_options_list[$i+1] != '')) { - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - $i++; - } - else { - } - break; - - // ----- Look for options that request an array of string for value - case PCLZIP_OPT_BY_NAME : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that request an EREG or PREG expression - case PCLZIP_OPT_BY_EREG : - // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG - // to PCLZIP_OPT_BY_PREG - $p_options_list[$i] = PCLZIP_OPT_BY_PREG; - case PCLZIP_OPT_BY_PREG : - //case PCLZIP_OPT_CRYPT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that takes a string - case PCLZIP_OPT_COMMENT : - case PCLZIP_OPT_ADD_COMMENT : - case PCLZIP_OPT_PREPEND_COMMENT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, - "Missing parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, - "Wrong parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that request an array of index - case PCLZIP_OPT_BY_INDEX : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_work_list = array(); - if (is_string($p_options_list[$i+1])) { - - // ----- Remove spaces - $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); - - // ----- Parse items - $v_work_list = explode(",", $p_options_list[$i+1]); - } - else if (is_integer($p_options_list[$i+1])) { - $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_work_list = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Reduce the index list - // each index item in the list must be a couple with a start and - // an end value : [0,3], [5-5], [8-10], ... - // ----- Check the format of each item - $v_sort_flag=false; - $v_sort_value=0; - for ($j=0; $j= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - $i++; - break; - - // ----- Look for options that request a call-back - case PCLZIP_CB_PRE_EXTRACT : - case PCLZIP_CB_POST_EXTRACT : - case PCLZIP_CB_PRE_ADD : - case PCLZIP_CB_POST_ADD : - /* for futur use - case PCLZIP_CB_PRE_DELETE : - case PCLZIP_CB_POST_DELETE : - case PCLZIP_CB_PRE_LIST : - case PCLZIP_CB_POST_LIST : - */ - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Get the value - $v_function_name = $p_options_list[$i+1]; - - // ----- Check that the value is a valid existing function - if (!function_exists($v_function_name)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Set the attribute - $v_result_list[$p_options_list[$i]] = $v_function_name; - $i++; - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '" - .$p_options_list[$i]."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Next options - $i++; - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - // ----- Look if present - if (!isset($v_result_list[$key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - - // ----- Return - return PclZip::errorCode(); - } - } - } - } - - // ----- Look for default values - if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOptionDefaultThreshold() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privOptionDefaultThreshold(&$p_options) - { - $v_result=1; - - if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { - return $v_result; - } - - // ----- Get 'memory_limit' configuration value - $v_memory_limit = ini_get('memory_limit'); - $v_memory_limit = trim($v_memory_limit); - $last = strtolower(substr($v_memory_limit, -1)); - - if($last == 'g') - //$v_memory_limit = $v_memory_limit*1024*1024*1024; - $v_memory_limit = $v_memory_limit*1073741824; - if($last == 'm') - //$v_memory_limit = $v_memory_limit*1024*1024; - $v_memory_limit = $v_memory_limit*1048576; - if($last == 'k') - $v_memory_limit = $v_memory_limit*1024; - - $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); - - - // ----- Sanity check : No threshold if value lower than 1M - if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { - unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrParseAtt() - // Description : - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) - { - $v_result=1; - - // ----- For each file in the list check the attributes - foreach ($p_file_list as $v_key => $v_value) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$v_key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for attribute - switch ($v_key) { - case PCLZIP_ATT_FILE_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['filename'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - break; - - case PCLZIP_ATT_FILE_NEW_SHORT_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['new_short_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - break; - - case PCLZIP_ATT_FILE_NEW_FULL_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['new_full_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - break; - - // ----- Look for options that takes a string - case PCLZIP_ATT_FILE_COMMENT : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['comment'] = $v_value; - break; - - case PCLZIP_ATT_FILE_MTIME : - if (!is_integer($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['mtime'] = $v_value; - break; - - case PCLZIP_ATT_FILE_CONTENT : - $p_filedescr['content'] = $v_value; - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '".$v_key."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - // ----- Look if present - if (!isset($p_file_list[$key])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - return PclZip::errorCode(); - } - } - } - } - - // end foreach - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrExpand() - // Description : - // This method look for each item of the list to see if its a file, a folder - // or a string to be added as file. For any other type of files (link, other) - // just ignore the item. - // Then prepare the information that will be stored for that file. - // When its a folder, expand the folder with all the files that are in that - // folder (recursively). - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrExpand(&$p_filedescr_list, &$p_options) - { - $v_result=1; - - // ----- Create a result list - $v_result_list = array(); - - // ----- Look each entry - for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); - - // ----- Add the descriptor in result list - $v_result_list[sizeof($v_result_list)] = $v_descr; - - // ----- Look for folder - if ($v_descr['type'] == 'folder') { - // ----- List of items in folder - $v_dirlist_descr = array(); - $v_dirlist_nb = 0; - if ($v_folder_handler = @opendir($v_descr['filename'])) { - while (($v_item_handler = @readdir($v_folder_handler)) !== false) { - - // ----- Skip '.' and '..' - if (($v_item_handler == '.') || ($v_item_handler == '..')) { - continue; - } - - // ----- Compose the full filename - $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; - - // ----- Look for different stored filename - // Because the name of the folder was changed, the name of the - // files/sub-folders also change - if (($v_descr['stored_filename'] != $v_descr['filename']) - && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { - if ($v_descr['stored_filename'] != '') { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; - } - else { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; - } - } - - $v_dirlist_nb++; - } - - @closedir($v_folder_handler); - } - else { - // TBC : unable to open folder in read mode - } - - // ----- Expand each element of the list - if ($v_dirlist_nb != 0) { - // ----- Expand - if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { - return $v_result; - } - - // ----- Concat the resulting list - $v_result_list = array_merge($v_result_list, $v_dirlist_descr); - } - else { - } - - // ----- Free local array - unset($v_dirlist_descr); - } - } - - // ----- Get the result list - $p_filedescr_list = $v_result_list; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCreate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCreate($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the file in write mode - if (($v_result = $this->privOpenFd('wb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Add the list of files - $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); - - // ----- Close - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAdd() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAdd($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Look if the archive exists or is empty - if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) - { - - // ----- Do a create - $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); - - // ----- Return - return $v_result; - } - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Create the Central Dir files header - for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = $v_central_dir['comment']; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { - $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOpenFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privOpenFd($p_mode) - { - $v_result=1; - - // ----- Look if already open - if ($this->zip_fd != 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCloseFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privCloseFd() - { - $v_result=1; - - if ($this->zip_fd != 0) - @fclose($this->zip_fd); - $this->zip_fd = 0; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddList() - // Description : - // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is - // different from the real path of the file. This is usefull if you want to have PclTar - // running in any directory, and memorize relative path from an other directory. - // Parameters : - // $p_list : An array containing the file or directory names to add in the tar - // $p_result_list : list of added files with their properties (specially the status field) - // $p_add_dir : Path to add in the filename path archived - // $p_remove_dir : Path to remove in the filename path archived - // Return Values : - // -------------------------------------------------------------------------------- - // function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) - function privAddList($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Create the Central Dir files header - for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - // ----- Return - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - return $v_result; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileList() - // Description : - // Parameters : - // $p_filedescr_list : An array containing the file description - // or directory names to add in the zip - // $p_result_list : list of added files with their properties (specially the status field) - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_header = array(); - - // ----- Recuperate the current number of elt in list - $v_nb = sizeof($p_result_list); - - // ----- Loop on the files - for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, - $p_options); - if ($v_result != 1) { - return $v_result; - } - - // ----- Store the file infos - $p_result_list[$v_nb++] = $v_header; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFile($p_filedescr, &$p_header, &$p_options) - { - $v_result=1; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - // TBC : Already done in the fileAtt check ... ? - if ($p_filename == "") { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for a stored different filename - /* TBC : Removed - if (isset($p_filedescr['stored_filename'])) { - $v_stored_filename = $p_filedescr['stored_filename']; - } - else { - $v_stored_filename = $p_filedescr['stored_filename']; - } - */ - - // ----- Set the file properties - clearstatcache(); - $p_header['version'] = 20; - $p_header['version_extracted'] = 10; - $p_header['flag'] = 0; - $p_header['compression'] = 0; - $p_header['crc'] = 0; - $p_header['compressed_size'] = 0; - $p_header['filename_len'] = strlen($p_filename); - $p_header['extra_len'] = 0; - $p_header['disk'] = 0; - $p_header['internal'] = 0; - $p_header['offset'] = 0; - $p_header['filename'] = $p_filename; - // TBC : Removed $p_header['stored_filename'] = $v_stored_filename; - $p_header['stored_filename'] = $p_filedescr['stored_filename']; - $p_header['extra'] = ''; - $p_header['status'] = 'ok'; - $p_header['index'] = -1; - - // ----- Look for regular file - if ($p_filedescr['type']=='file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for regular folder - else if ($p_filedescr['type']=='folder') { - $p_header['external'] = 0x00000010; - $p_header['mtime'] = filemtime($p_filename); - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for virtual file - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = strlen($p_filedescr['content']); - } - - - // ----- Look for filetime - if (isset($p_filedescr['mtime'])) { - $p_header['mtime'] = $p_filedescr['mtime']; - } - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['mtime'] = time(); - } - else { - $p_header['mtime'] = filemtime($p_filename); - } - - // ------ Look for file comment - if (isset($p_filedescr['comment'])) { - $p_header['comment_len'] = strlen($p_filedescr['comment']); - $p_header['comment'] = $p_filedescr['comment']; - } - else { - $p_header['comment_len'] = 0; - $p_header['comment'] = ''; - } - - // ----- Look for pre-add callback - if (isset($p_options[PCLZIP_CB_PRE_ADD])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_header['status'] = "skipped"; - $v_result = 1; - } - - // ----- Update the informations - // Only some fields can be modified - if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { - $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); - } - } - - // ----- Look for empty stored filename - if ($p_header['stored_filename'] == "") { - $p_header['status'] = "filtered"; - } - - // ----- Check the path length - if (strlen($p_header['stored_filename']) > 0xFF) { - $p_header['status'] = 'filename_too_long'; - } - - // ----- Look if no error, or file not skipped - if ($p_header['status'] == 'ok') { - - // ----- Look for a file - if ($p_filedescr['type'] == 'file') { - // ----- Look for using temporary file to zip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { - $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Use "in memory" zip algo - else { - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - return PclZip::errorCode(); - } - - // ----- Read the file content - $v_content = @fread($v_file, $p_header['size']); - - // ----- Close the file - @fclose($v_file); - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - - } - - } - - // ----- Look for a virtual file (a file from string) - else if ($p_filedescr['type'] == 'virtual_file') { - - $v_content = $p_filedescr['content']; - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - } - - // ----- Look for a directory - else if ($p_filedescr['type'] == 'folder') { - // ----- Look for directory last '/' - if (@substr($p_header['stored_filename'], -1) != '/') { - $p_header['stored_filename'] .= '/'; - } - - // ----- Set the file properties - $p_header['size'] = 0; - //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked - $p_header['external'] = 0x00000010; // Value for a folder : to be checked - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) - { - return $v_result; - } - } - } - - // ----- Look for post-add callback - if (isset($p_options[PCLZIP_CB_POST_ADD])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Ignored - $v_result = 1; - } - - // ----- Update the informations - // Nothing can be modified - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) - { - $v_result=PCLZIP_ERR_NO_ERROR; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - return PclZip::errorCode(); - } - - // ----- Creates a compressed temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = filesize($p_filename); - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @gzputs($v_file_compressed, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file); - @gzclose($v_file_compressed); - - // ----- Check the minimum file size - if (filesize($v_gzip_temp_name) < 18) { - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); - return PclZip::errorCode(); - } - - // ----- Extract the compressed attributes - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - // ----- Read the gzip file header - $v_binary_data = @fread($v_file_compressed, 10); - $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); - - // ----- Check some parameters - $v_data_header['os'] = bin2hex($v_data_header['os']); - - // ----- Read the gzip file footer - @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); - $v_binary_data = @fread($v_file_compressed, 8); - $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); - - // ----- Set the attributes - $p_header['compression'] = ord($v_data_header['cm']); - //$p_header['mtime'] = $v_data_header['mtime']; - $p_header['crc'] = $v_data_footer['crc']; - $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - return $v_result; - } - - // ----- Add the compressed data - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) - { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - fseek($v_file_compressed, 10); - $v_size = $p_header['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_file_compressed, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Unlink the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCalculateStoredFilename() - // Description : - // Based on file descriptor properties and global options, this method - // calculate the filename that will be stored in the archive. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCalculateStoredFilename(&$p_filedescr, &$p_options) - { - $v_result=1; - - // ----- Working variables - $p_filename = $p_filedescr['filename']; - if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { - $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; - } - else { - $p_add_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { - $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; - } - else { - $p_remove_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - else { - $p_remove_all_dir = 0; - } - - - // ----- Look for full name change - if (isset($p_filedescr['new_full_name'])) { - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); - } - - // ----- Look for path and/or short name change - else { - - // ----- Look for short name change - // Its when we cahnge just the filename but not the path - if (isset($p_filedescr['new_short_name'])) { - $v_path_info = pathinfo($p_filename); - $v_dir = ''; - if ($v_path_info['dirname'] != '') { - $v_dir = $v_path_info['dirname'].'/'; - } - $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; - } - else { - // ----- Calculate the stored filename - $v_stored_filename = $p_filename; - } - - // ----- Look for all path to remove - if ($p_remove_all_dir) { - $v_stored_filename = basename($p_filename); - } - // ----- Look for partial path remove - else if ($p_remove_dir != "") { - if (substr($p_remove_dir, -1) != '/') - $p_remove_dir .= "/"; - - if ( (substr($p_filename, 0, 2) == "./") - || (substr($p_remove_dir, 0, 2) == "./")) { - - if ( (substr($p_filename, 0, 2) == "./") - && (substr($p_remove_dir, 0, 2) != "./")) { - $p_remove_dir = "./".$p_remove_dir; - } - if ( (substr($p_filename, 0, 2) != "./") - && (substr($p_remove_dir, 0, 2) == "./")) { - $p_remove_dir = substr($p_remove_dir, 2); - } - } - - $v_compare = PclZipUtilPathInclusion($p_remove_dir, - $v_stored_filename); - if ($v_compare > 0) { - if ($v_compare == 2) { - $v_stored_filename = ""; - } - else { - $v_stored_filename = substr($v_stored_filename, - strlen($p_remove_dir)); - } - } - } - - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); - - // ----- Look for path to add - if ($p_add_dir != "") { - if (substr($p_add_dir, -1) == "/") - $v_stored_filename = $p_add_dir.$v_stored_filename; - else - $v_stored_filename = $p_add_dir."/".$v_stored_filename; - } - } - - // ----- Filename (reduce the path of stored name) - $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); - $p_filedescr['stored_filename'] = $v_stored_filename; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteFileHeader(&$p_header) - { - $v_result=1; - - // ----- Store the offset position of the file - $p_header['offset'] = ftell($this->zip_fd); - - // ----- Transform UNIX mtime to DOS format mdate/mtime - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - // ----- Packed data - $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, - $p_header['version_extracted'], $p_header['flag'], - $p_header['compression'], $v_mtime, $v_mdate, - $p_header['crc'], $p_header['compressed_size'], - $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len']); - - // ----- Write the first 148 bytes of the header in the archive - fputs($this->zip_fd, $v_binary_data, 30); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralFileHeader(&$p_header) - { - $v_result=1; - - // TBC - //for(reset($p_header); $key = key($p_header); next($p_header)) { - //} - - // ----- Transform UNIX mtime to DOS format mdate/mtime - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - - // ----- Packed data - $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, - $p_header['version'], $p_header['version_extracted'], - $p_header['flag'], $p_header['compression'], - $v_mtime, $v_mdate, $p_header['crc'], - $p_header['compressed_size'], $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len'], $p_header['comment_len'], - $p_header['disk'], $p_header['internal'], - $p_header['external'], $p_header['offset']); - - // ----- Write the 42 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 46); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - if ($p_header['comment_len'] != 0) - { - fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) - { - $v_result=1; - - // ----- Packed data - $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, - $p_nb_entries, $p_size, - $p_offset, strlen($p_comment)); - - // ----- Write the 22 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 22); - - // ----- Write the variable fields - if (strlen($p_comment) != 0) - { - fputs($this->zip_fd, $p_comment, strlen($p_comment)); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privList() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privList(&$p_list) - { - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Go to beginning of Central Dir - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_central_dir['offset'])) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read each entry - for ($i=0; $i<$v_central_dir['entries']; $i++) - { - // ----- Read the file header - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - $v_header['index'] = $i; - - // ----- Get the only interesting attributes - $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); - unset($v_header); - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privConvertHeader2FileInfo() - // Description : - // This function takes the file informations from the central directory - // entries and extract the interesting parameters that will be given back. - // The resulting file infos are set in the array $p_info - // $p_info['filename'] : Filename with full path. Given by user (add), - // extracted in the filesystem (extract). - // $p_info['stored_filename'] : Stored filename in the archive. - // $p_info['size'] = Size of the file. - // $p_info['compressed_size'] = Compressed size of the file. - // $p_info['mtime'] = Last modification date of the file. - // $p_info['comment'] = Comment associated with the file. - // $p_info['folder'] = true/false : indicates if the entry is a folder or not. - // $p_info['status'] = status of the action on the file. - // $p_info['crc'] = CRC of the file content. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privConvertHeader2FileInfo($p_header, &$p_info) - { - $v_result=1; - - // ----- Get the interesting attributes - $v_temp_path = PclZipUtilPathReduction($p_header['filename']); - $p_info['filename'] = $v_temp_path; - $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); - $p_info['stored_filename'] = $v_temp_path; - $p_info['size'] = $p_header['size']; - $p_info['compressed_size'] = $p_header['compressed_size']; - $p_info['mtime'] = $p_header['mtime']; - $p_info['comment'] = $p_header['comment']; - $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); - $p_info['index'] = $p_header['index']; - $p_info['status'] = $p_header['status']; - $p_info['crc'] = $p_header['crc']; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractByRule() - // Description : - // Extract a file or directory depending of rules (by index, by name, ...) - // Parameters : - // $p_file_list : An array where will be placed the properties of each - // extracted file - // $p_path : Path to add while writing the extracted files - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_remove_path does not apply to 'list' mode. - // $p_path and $p_remove_path are commulative. - // Return Values : - // 1 on success,0 or less on error (see error code list) - // -------------------------------------------------------------------------------- - function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check the path - if ( ($p_path == "") - || ( (substr($p_path, 0, 1) != "/") - && (substr($p_path, 0, 3) != "../") - && (substr($p_path,1,2)!=":/"))) - $p_path = "./".$p_path; - - // ----- Reduce the path last (and duplicated) '/' - if (($p_path != "./") && ($p_path != "/")) - { - // ----- Look for the path end '/' - while (substr($p_path, -1) == "/") - { - $p_path = substr($p_path, 0, strlen($p_path)-1); - } - } - - // ----- Look for path to remove format (should end by /) - if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) - { - $p_remove_path .= '/'; - } - $p_remove_path_size = strlen($p_remove_path); - - // ----- Open the zip file - if (($v_result = $this->privOpenFd('rb')) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - - // ----- Read each entry - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - - // ----- Read next Central dir entry - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Store the index - $v_header['index'] = $i; - - // ----- Store the file position - $v_pos_entry = ftell($this->zip_fd); - - // ----- Look for the specific extract rules - $v_extract = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - - // ----- Look if the filename is in the list - for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_extract = true; - } - } - // ----- Look for a filename - elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - $v_extract = true; - } - } - } - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { - $v_extract = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - - // ----- Look if the index is in the list - for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - $v_extract = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - break; - } - } - } - - // ----- Look for no rule, which means extract all the archive - else { - $v_extract = true; - } - - // ----- Check compression method - if ( ($v_extract) - && ( ($v_header['compression'] != 8) - && ($v_header['compression'] != 0))) { - $v_header['status'] = 'unsupported_compression'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, - "Filename '".$v_header['stored_filename']."' is " - ."compressed by an unsupported compression " - ."method (".$v_header['compression'].") "); - - return PclZip::errorCode(); - } - } - - // ----- Check encrypted files - if (($v_extract) && (($v_header['flag'] & 1) == 1)) { - $v_header['status'] = 'unsupported_encryption'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, - "Unsupported encryption for " - ." filename '".$v_header['stored_filename'] - ."'"); - - return PclZip::errorCode(); - } - } - - // ----- Look for real extraction - if (($v_extract) && ($v_header['status'] != 'ok')) { - $v_result = $this->privConvertHeader2FileInfo($v_header, - $p_file_list[$v_nb_extracted++]); - if ($v_result != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - $v_extract = false; - } - - // ----- Look for real extraction - if ($v_extract) - { - - // ----- Go to the file position - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_header['offset'])) - { - // ----- Close the zip file - $this->privCloseFd(); - - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for extraction as string - if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { - - $v_string = ''; - - // ----- Extracting the file - $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Set the file content - $p_file_list[$v_nb_extracted]['content'] = $v_string; - - // ----- Next extracted file - $v_nb_extracted++; - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for extraction in standard output - elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) - && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { - // ----- Extracting the file in standard output - $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for normal extraction - else { - // ----- Extracting the file - $v_result1 = $this->privExtractFile($v_header, - $p_path, $p_remove_path, - $p_remove_all_path, - $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - } - } - - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFile() - // Description : - // Parameters : - // Return Values : - // - // 1 : ... ? - // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback - // -------------------------------------------------------------------------------- - function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for all path to remove - if ($p_remove_all_path == true) { - // ----- Look for folder entry that not need to be extracted - if (($p_entry['external']&0x00000010)==0x00000010) { - - $p_entry['status'] = "filtered"; - - return $v_result; - } - - // ----- Get the basename of the path - $p_entry['filename'] = basename($p_entry['filename']); - } - - // ----- Look for path to remove - else if ($p_remove_path != "") - { - if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) - { - - // ----- Change the file status - $p_entry['status'] = "filtered"; - - // ----- Return - return $v_result; - } - - $p_remove_path_size = strlen($p_remove_path); - if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) - { - - // ----- Remove the path - $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); - - } - } - - // ----- Add the path - if ($p_path != '') { - $p_entry['filename'] = $p_path."/".$p_entry['filename']; - } - - // ----- Check a base_dir_restriction - if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { - $v_inclusion - = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], - $p_entry['filename']); - if ($v_inclusion == 0) { - - PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, - "Filename '".$p_entry['filename']."' is " - ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); - - return PclZip::errorCode(); - } - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Look for specific actions while the file exist - if (file_exists($p_entry['filename'])) - { - - // ----- Look if file is a directory - if (is_dir($p_entry['filename'])) - { - - // ----- Change the file status - $p_entry['status'] = "already_a_directory"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, - "Filename '".$p_entry['filename']."' is " - ."already used by an existing directory"); - - return PclZip::errorCode(); - } - } - // ----- Look if file is write protected - else if (!is_writeable($p_entry['filename'])) - { - - // ----- Change the file status - $p_entry['status'] = "write_protected"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Filename '".$p_entry['filename']."' exists " - ."and is write protected"); - - return PclZip::errorCode(); - } - } - - // ----- Look if the extracted file is older - else if (filemtime($p_entry['filename']) > $p_entry['mtime']) - { - // ----- Change the file status - if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) - && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { - } - else { - $p_entry['status'] = "newer_exist"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Newer version of '".$p_entry['filename']."' exists " - ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); - - return PclZip::errorCode(); - } - } - } - else { - } - } - - // ----- Check the directory availability and create it if necessary - else { - if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) - $v_dir_to_check = $p_entry['filename']; - else if (!strstr($p_entry['filename'], "/")) - $v_dir_to_check = ""; - else - $v_dir_to_check = dirname($p_entry['filename']); - - if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { - - // ----- Change the file status - $p_entry['status'] = "path_creation_fail"; - - // ----- Return - //return $v_result; - $v_result = 1; - } - } - } - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) - { - // ----- Look for not compressed file - if ($p_entry['compression'] == 0) { - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) - { - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - // ----- Return - return $v_result; - } - - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - /* Try to speed up the code - $v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_binary_data, $v_read_size); - */ - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Closing the destination file - fclose($v_dest_file); - - // ----- Change the file mtime - touch($p_entry['filename'], $p_entry['mtime']); - - - } - else { - // ----- TBC - // Need to be finished - if (($p_entry['flag'] & 1) == 1) { - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); - return PclZip::errorCode(); - } - - - // ----- Look for using temporary file to unzip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { - $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Look for extract in memory - else { - - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = @gzinflate($v_buffer); - unset($v_buffer); - if ($v_file_content === FALSE) { - - // ----- Change the file status - // TBC - $p_entry['status'] = "error"; - - return $v_result; - } - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - return $v_result; - } - - // ----- Write the uncompressed data - @fwrite($v_dest_file, $v_file_content, $p_entry['size']); - unset($v_file_content); - - // ----- Closing the destination file - @fclose($v_dest_file); - - } - - // ----- Change the file mtime - @touch($p_entry['filename'], $p_entry['mtime']); - } - - // ----- Look for chmod option - if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { - - // ----- Change the mode of the file - @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); - } - - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileUsingTempFile(&$p_entry, &$p_options) - { - $v_result=1; - - // ----- Creates a temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - - - // ----- Write gz file format header - $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); - @fwrite($v_dest_file, $v_binary_data, 10); - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Write gz file format footer - $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); - @fwrite($v_dest_file, $v_binary_data, 8); - - // ----- Close the temporary file - @fclose($v_dest_file); - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - $p_entry['status'] = "write_error"; - return $v_result; - } - - // ----- Open the temporary gz file - if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { - @fclose($v_dest_file); - $p_entry['status'] = "read_error"; - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['size']; - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($v_src_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - @fclose($v_dest_file); - @gzclose($v_src_file); - - // ----- Delete the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileInOutput() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileInOutput(&$p_entry, &$p_options) - { - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) { - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - // ----- Trace - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - if ($p_entry['compressed_size'] == $p_entry['size']) { - - // ----- Read the file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Send the file to the output - echo $v_buffer; - unset($v_buffer); - } - else { - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = gzinflate($v_buffer); - unset($v_buffer); - - // ----- Send the file to the output - echo $v_file_content; - unset($v_file_content); - } - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileAsString() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) - { - $v_result=1; - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - // if ($p_entry['compressed_size'] == $p_entry['size']) - if ($p_entry['compression'] == 0) { - - // ----- Reading the file - $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); - } - else { - - // ----- Reading the file - $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - if (($p_string = @gzinflate($v_data)) === FALSE) { - // TBC - } - } - - // ----- Trace - } - else { - // TBC : error : can not extract a folder in a string - } - - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Swap the content to header - $v_local_header['content'] = $p_string; - $p_string = ''; - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. - // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Swap back the content to header - $p_string = $v_local_header['content']; - unset($v_local_header['content']); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadFileHeader(&$p_header) - { - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] != 0x04034b50) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 26); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 26) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); - - // ----- Get filename - $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); - - // ----- Get extra_fields - if ($v_data['extra_len'] != 0) { - $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); - } - else { - $p_header['extra'] = ''; - } - - // ----- Extract properties - $p_header['version_extracted'] = $v_data['version']; - $p_header['compression'] = $v_data['compression']; - $p_header['size'] = $v_data['size']; - $p_header['compressed_size'] = $v_data['compressed_size']; - $p_header['crc'] = $v_data['crc']; - $p_header['flag'] = $v_data['flag']; - $p_header['filename_len'] = $v_data['filename_len']; - - // ----- Recuperate date in UNIX format - $p_header['mdate'] = $v_data['mdate']; - $p_header['mtime'] = $v_data['mtime']; - if ($p_header['mdate'] && $p_header['mtime']) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - } - else - { - $p_header['mtime'] = time(); - } - - // TBC - //for(reset($v_data); $key = key($v_data); next($v_data)) { - //} - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set the status field - $p_header['status'] = "ok"; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadCentralFileHeader(&$p_header) - { - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] != 0x02014b50) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 42); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 42) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); - - // ----- Get filename - if ($p_header['filename_len'] != 0) - $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); - else - $p_header['filename'] = ''; - - // ----- Get extra - if ($p_header['extra_len'] != 0) - $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); - else - $p_header['extra'] = ''; - - // ----- Get comment - if ($p_header['comment_len'] != 0) - $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); - else - $p_header['comment'] = ''; - - // ----- Extract properties - - // ----- Recuperate date in UNIX format - //if ($p_header['mdate'] && $p_header['mtime']) - // TBC : bug : this was ignoring time with 0/0/0 - if (1) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - } - else - { - $p_header['mtime'] = time(); - } - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set default status to ok - $p_header['status'] = 'ok'; - - // ----- Look if it is a directory - if (substr($p_header['filename'], -1) == '/') { - //$p_header['external'] = 0x41FF0010; - $p_header['external'] = 0x00000010; - } - - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCheckFileHeaders() - // Description : - // Parameters : - // Return Values : - // 1 on success, - // 0 on error; - // -------------------------------------------------------------------------------- - function privCheckFileHeaders(&$p_local_header, &$p_central_header) - { - $v_result=1; - - // ----- Check the static values - // TBC - if ($p_local_header['filename'] != $p_central_header['filename']) { - } - if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { - } - if ($p_local_header['flag'] != $p_central_header['flag']) { - } - if ($p_local_header['compression'] != $p_central_header['compression']) { - } - if ($p_local_header['mtime'] != $p_central_header['mtime']) { - } - if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { - } - - // ----- Look for flag bit 3 - if (($p_local_header['flag'] & 8) == 8) { - $p_local_header['size'] = $p_central_header['size']; - $p_local_header['compressed_size'] = $p_central_header['compressed_size']; - $p_local_header['crc'] = $p_central_header['crc']; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadEndCentralDir() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadEndCentralDir(&$p_central_dir) - { - $v_result=1; - - // ----- Go to the end of the zip file - $v_size = filesize($this->zipname); - @fseek($this->zip_fd, $v_size); - if (@ftell($this->zip_fd) != $v_size) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- First try : look if this is an archive with no commentaries (most of the time) - // in this case the end of central dir is at 22 bytes of the file end - $v_found = 0; - if ($v_size > 26) { - @fseek($this->zip_fd, $v_size-22); - if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read for bytes - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = @unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] == 0x06054b50) { - $v_found = 1; - } - - $v_pos = ftell($this->zip_fd); - } - - // ----- Go back to the maximum possible size of the Central Dir End Record - if (!$v_found) { - $v_maximum_size = 65557; // 0xFFFF + 22; - if ($v_maximum_size > $v_size) - $v_maximum_size = $v_size; - @fseek($this->zip_fd, $v_size-$v_maximum_size); - if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read byte per byte in order to find the signature - $v_pos = ftell($this->zip_fd); - $v_bytes = 0x00000000; - while ($v_pos < $v_size) - { - // ----- Read a byte - $v_byte = @fread($this->zip_fd, 1); - - // ----- Add the byte - //$v_bytes = ($v_bytes << 8) | Ord($v_byte); - // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number - // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. - $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); - - // ----- Compare the bytes - if ($v_bytes == 0x504b0506) - { - $v_pos++; - break; - } - - $v_pos++; - } - - // ----- Look if not found end of central dir - if ($v_pos == $v_size) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); - - // ----- Return - return PclZip::errorCode(); - } - } - - // ----- Read the first 18 bytes of the header - $v_binary_data = fread($this->zip_fd, 18); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 18) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); - - // ----- Check the global size - if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { - - // ----- Removed in release 2.2 see readme file - // The check of the file size is a little too strict. - // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. - // While decrypted, zip has training 0 bytes - if (0) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, - 'The central dir is not at the end of the archive.' - .' Some trailing bytes exists after the archive.'); - - // ----- Return - return PclZip::errorCode(); - } - } - - // ----- Get comment - if ($v_data['comment_size'] != 0) { - $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); - } - else - $p_central_dir['comment'] = ''; - - $p_central_dir['entries'] = $v_data['entries']; - $p_central_dir['disk_entries'] = $v_data['disk_entries']; - $p_central_dir['offset'] = $v_data['offset']; - $p_central_dir['size'] = $v_data['size']; - $p_central_dir['disk'] = $v_data['disk']; - $p_central_dir['disk_start'] = $v_data['disk_start']; - - // TBC - //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { - //} - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDeleteByRule() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDeleteByRule(&$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Scan all the files - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read each entry - $v_header_list = array(); - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - - // ----- Read the file header - $v_header_list[$v_nb_extracted] = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - - return $v_result; - } - - - // ----- Store the index - $v_header_list[$v_nb_extracted]['index'] = $i; - - // ----- Look for the specific extract rules - $v_found = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - - // ----- Look if the filename is in the list - for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_found = true; - } - elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ - && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_found = true; - } - } - // ----- Look for a filename - elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - $v_found = true; - } - } - } - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { - $v_found = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - - // ----- Look if the index is in the list - for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - $v_found = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - break; - } - } - } - else { - $v_found = true; - } - - // ----- Look for deletion - if ($v_found) - { - unset($v_header_list[$v_nb_extracted]); - } - else - { - $v_nb_extracted++; - } - } - - // ----- Look if something need to be deleted - if ($v_nb_extracted > 0) { - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Creates a temporary zip archive - $v_temp_zip = new PclZip($v_zip_temp_name); - - // ----- Open the temporary zip file in write mode - if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { - $this->privCloseFd(); - - // ----- Return - return $v_result; - } - - // ----- Look which file need to be kept - for ($i=0; $izip_fd); - if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the file header - $v_local_header = array(); - if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Check that local file header is same as central file header - if ($this->privCheckFileHeaders($v_local_header, - $v_header_list[$i]) != 1) { - // TBC - } - unset($v_local_header); - - // ----- Write the file header - if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Read/write the data block - if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_temp_zip->zip_fd); - - // ----- Re-Create the Central Dir files header - for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Transform the header to a 'usable' info - $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { - // ----- Reset the file list - unset($v_header_list); - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Close - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Destroy the temporary archive - unset($v_temp_zip); - } - - // ----- Remove every files : reset the file - else if ($v_central_dir['entries'] != 0) { - $this->privCloseFd(); - - if (($v_result = $this->privOpenFd('wb')) != 1) { - return $v_result; - } - - if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { - return $v_result; - } - - $this->privCloseFd(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDirCheck() - // Description : - // Check if a directory exists, if not it creates it and all the parents directory - // which may be useful. - // Parameters : - // $p_dir : Directory path to check. - // Return Values : - // 1 : OK - // -1 : Unable to create directory - // -------------------------------------------------------------------------------- - function privDirCheck($p_dir, $p_is_dir=false) - { - $v_result = 1; - - - // ----- Remove the final '/' - if (($p_is_dir) && (substr($p_dir, -1)=='/')) - { - $p_dir = substr($p_dir, 0, strlen($p_dir)-1); - } - - // ----- Check the directory availability - if ((is_dir($p_dir)) || ($p_dir == "")) - { - return 1; - } - - // ----- Extract parent directory - $p_parent_dir = dirname($p_dir); - - // ----- Just a check - if ($p_parent_dir != $p_dir) - { - // ----- Look for parent directory - if ($p_parent_dir != "") - { - if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) - { - return $v_result; - } - } - } - - // ----- Create the directory - if (!@mkdir($p_dir, 0777)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privMerge() - // Description : - // If $p_archive_to_add does not exist, the function exit with a success result. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privMerge(&$p_archive_to_add) - { - $v_result=1; - - // ----- Look if the archive_to_add exists - if (!is_file($p_archive_to_add->zipname)) - { - - // ----- Nothing to merge, so merge is a success - $v_result = 1; - - // ----- Return - return $v_result; - } - - // ----- Look if the archive exists - if (!is_file($this->zipname)) - { - - // ----- Do a duplicate - $v_result = $this->privDuplicate($p_archive_to_add->zipname); - - // ----- Return - return $v_result; - } - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Open the archive_to_add file - if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) - { - $this->privCloseFd(); - - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir_to_add = array(); - if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - return $v_result; - } - - // ----- Go to beginning of File - @rewind($p_archive_to_add->zip_fd); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the files from the archive_to_add into the temporary file - $v_size = $v_central_dir_to_add['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_zip_temp_fd); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the block of file headers from the archive_to_add - $v_size = $v_central_dir_to_add['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Merge the file comments - $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; - - // ----- Calculate the size of the (new) central header - $v_size = @ftell($v_zip_temp_fd)-$v_offset; - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive fd - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - @fclose($v_zip_temp_fd); - $this->zip_fd = null; - - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDuplicate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDuplicate($p_archive_filename) - { - $v_result=1; - - // ----- Look if the $p_archive_filename exists - if (!is_file($p_archive_filename)) - { - - // ----- Nothing to duplicate, so duplicate is a success. - $v_result = 1; - - // ----- Return - return $v_result; - } - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('wb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) - { - $this->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = filesize($p_archive_filename); - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorLog() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorLog($p_error_code=0, $p_error_string='') - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclError($p_error_code, $p_error_string); - } - else { - $this->error_code = $p_error_code; - $this->error_string = $p_error_string; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorReset() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorReset() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclErrorReset(); - } - else { - $this->error_code = 0; - $this->error_string = ''; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDisableMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDisableMagicQuotes() - { - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - return $v_result; - } - - // ----- Look if already done - if ($this->magic_quotes_status != -1) { - return $v_result; - } - - // ----- Get and memorize the magic_quote value - $this->magic_quotes_status = @get_magic_quotes_runtime(); - - // ----- Disable magic_quotes - if ($this->magic_quotes_status == 1) { - @set_magic_quotes_runtime(0); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privSwapBackMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privSwapBackMagicQuotes() - { - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - return $v_result; - } - - // ----- Look if something to do - if ($this->magic_quotes_status != -1) { - return $v_result; - } - - // ----- Swap back magic_quotes - if ($this->magic_quotes_status == 1) { - @set_magic_quotes_runtime($this->magic_quotes_status); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - -} -// End of class -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilPathReduction() -// Description : -// Parameters : -// Return Values : -// -------------------------------------------------------------------------------- -function PclZipUtilPathReduction($p_dir) -{ - $v_result = ""; - - // ----- Look for not empty path - if ($p_dir != "") { - // ----- Explode path by directory names - $v_list = explode("/", $p_dir); - - // ----- Study directories from last to first - $v_skip = 0; - for ($i=sizeof($v_list)-1; $i>=0; $i--) { - // ----- Look for current path - if ($v_list[$i] == ".") { - // ----- Ignore this directory - // Should be the first $i=0, but no check is done - } - else if ($v_list[$i] == "..") { - $v_skip++; - } - else if ($v_list[$i] == "") { - // ----- First '/' i.e. root slash - if ($i == 0) { - $v_result = "/".$v_result; - if ($v_skip > 0) { - // ----- It is an invalid path, so the path is not modified - // TBC - $v_result = $p_dir; - $v_skip = 0; - } - } - // ----- Last '/' i.e. indicates a directory - else if ($i == (sizeof($v_list)-1)) { - $v_result = $v_list[$i]; - } - // ----- Double '/' inside the path - else { - // ----- Ignore only the double '//' in path, - // but not the first and last '/' - } - } - else { - // ----- Look for item to skip - if ($v_skip > 0) { - $v_skip--; - } - else { - $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); - } - } - } - - // ----- Look for skip - if ($v_skip > 0) { - while ($v_skip > 0) { - $v_result = '../'.$v_result; - $v_skip--; - } - } - } - - // ----- Return - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilPathInclusion() -// Description : -// This function indicates if the path $p_path is under the $p_dir tree. Or, -// said in an other way, if the file or sub-dir $p_path is inside the dir -// $p_dir. -// The function indicates also if the path is exactly the same as the dir. -// This function supports path with duplicated '/' like '//', but does not -// support '.' or '..' statements. -// Parameters : -// Return Values : -// 0 if $p_path is not inside directory $p_dir -// 1 if $p_path is inside directory $p_dir -// 2 if $p_path is exactly the same as $p_dir -// -------------------------------------------------------------------------------- -function PclZipUtilPathInclusion($p_dir, $p_path) -{ - $v_result = 1; - - // ----- Look for path beginning by ./ - if ( ($p_dir == '.') - || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { - $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); - } - if ( ($p_path == '.') - || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { - $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); - } - - // ----- Explode dir and path by directory separator - $v_list_dir = explode("/", $p_dir); - $v_list_dir_size = sizeof($v_list_dir); - $v_list_path = explode("/", $p_path); - $v_list_path_size = sizeof($v_list_path); - - // ----- Study directories paths - $i = 0; - $j = 0; - while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { - - // ----- Look for empty dir (path reduction) - if ($v_list_dir[$i] == '') { - $i++; - continue; - } - if ($v_list_path[$j] == '') { - $j++; - continue; - } - - // ----- Compare the items - if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { - $v_result = 0; - } - - // ----- Next items - $i++; - $j++; - } - - // ----- Look if everything seems to be the same - if ($v_result) { - // ----- Skip all the empty items - while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; - while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; - - if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { - // ----- There are exactly the same - $v_result = 2; - } - else if ($i < $v_list_dir_size) { - // ----- The path is shorter than the dir - $v_result = 0; - } - } - - // ----- Return - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilCopyBlock() -// Description : -// Parameters : -// $p_mode : read/write compression mode -// 0 : src & dest normal -// 1 : src gzip, dest normal -// 2 : src normal, dest gzip -// 3 : src & dest gzip -// Return Values : -// -------------------------------------------------------------------------------- -function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) -{ - $v_result = 1; - - if ($p_mode==0) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==1) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==2) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==3) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - - // ----- Return - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilRename() -// Description : -// This function tries to do a simple rename() function. If it fails, it -// tries to copy the $p_src file in a new $p_dest file and then unlink the -// first one. -// Parameters : -// $p_src : Old filename -// $p_dest : New filename -// Return Values : -// 1 on success, 0 on failure. -// -------------------------------------------------------------------------------- -function PclZipUtilRename($p_src, $p_dest) -{ - $v_result = 1; - - // ----- Try to rename the files - if (!@rename($p_src, $p_dest)) { - - // ----- Try to copy & unlink the src - if (!@copy($p_src, $p_dest)) { - $v_result = 0; - } - else if (!@unlink($p_src)) { - $v_result = 0; - } - } - - // ----- Return - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilOptionText() -// Description : -// Translate option value in text. Mainly for debug purpose. -// Parameters : -// $p_option : the option value. -// Return Values : -// The option text value. -// -------------------------------------------------------------------------------- -function PclZipUtilOptionText($p_option) -{ - - $v_list = get_defined_constants(); - for (reset($v_list); $v_key = key($v_list); next($v_list)) { - $v_prefix = substr($v_key, 0, 10); - if (( ($v_prefix == 'PCLZIP_OPT') - || ($v_prefix == 'PCLZIP_CB_') - || ($v_prefix == 'PCLZIP_ATT')) - && ($v_list[$v_key] == $p_option)) { - return $v_key; - } - } - - $v_result = 'Unknown'; - - return $v_result; -} -// -------------------------------------------------------------------------------- - -// -------------------------------------------------------------------------------- -// Function : PclZipUtilTranslateWinPath() -// Description : -// Translate windows path by replacing '\' by '/' and optionally removing -// drive letter. -// Parameters : -// $p_path : path to translate. -// $p_remove_disk_letter : true | false -// Return Values : -// The path translated. -// -------------------------------------------------------------------------------- -function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) -{ - if (stristr(php_uname(), 'windows')) { - // ----- Look for potential disk letter - if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { - $p_path = substr($p_path, $v_position+1); - } - // ----- Change potential windows directory separator - if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { - $p_path = strtr($p_path, '\\', '/'); - } - } - return $p_path; -} -// -------------------------------------------------------------------------------- - - -?> diff --git a/include/limesurvey/admin/classes/pclzip/readme.txt b/include/limesurvey/admin/classes/pclzip/readme.txt deleted file mode 100644 index 5ca099d6..00000000 --- a/include/limesurvey/admin/classes/pclzip/readme.txt +++ /dev/null @@ -1,412 +0,0 @@ -// -------------------------------------------------------------------------------- -// PclZip 2.8.1 - readme.txt -// -------------------------------------------------------------------------------- -// License GNU/LGPL - August 2009 -// Vincent Blavet - vincent@phpconcept.net -// http://www.phpconcept.net -// -------------------------------------------------------------------------------- -// $Id: readme.txt,v 1.58 2009/08/11 14:58:12 vblavet Exp $ -// -------------------------------------------------------------------------------- - - - -0 - Sommaire -============ - 1 - Introduction - 2 - What's new - 3 - Corrected bugs - 4 - Known bugs or limitations - 5 - License - 6 - Warning - 7 - Documentation - 8 - Author - 9 - Contribute - -1 - Introduction -================ - - PclZip is a library that allow you to manage a Zip archive. - - Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip - -2 - What's new -============== - - Version 2.8.1 : - - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is - deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will - automatically replace it by PCLZIP_OPT_BY_PREG. - - Version 2.8 : - - Improve extraction of zip archive for large files by using temporary files - This feature is working like the one defined in r2.7. - Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF, - PCLZIP_OPT_TEMP_FILE_THRESHOLD - - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto - sense of temporary file use. - - Bug correction : Reduce filepath in returned file list to remove ennoying - './/' preambule in file path. - - Version 2.7 : - - Improve creation of zip archive for large files : - PclZip will now autosense the configured memory and use temporary files - when large file is suspected. - This feature can also ne triggered by manual options in create() and add() - methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files, - 'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, - 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size - threshold to use temporary files. - Using "temporary files" rather than "memory" might take more time, but - might give the ability to zip very large files : - Tested on my win laptop with a 88Mo file : - Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo) - Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo) - - Replace use of mktime() by time() to limit the E_STRICT error messages. - - Bug correction : When adding files with full windows path (drive letter) - PclZip is now working. Before, if the drive letter is not the default - path, PclZip was not able to add the file. - - Version 2.6 : - - Code optimisation - - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to - add a comment for a specific file. (Don't really know if this is usefull) - - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string - as a file. - - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with - a file. - - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted - with current time - - Add CRC value in the informations returned back for each file after an - action. - - Add missing closedir() statement. - - When adding a folder, and removing the path of this folder, files were - incorrectly added with a '/' at the beginning. Which means files are - related to root in unix systems. Corrected. - - Add conditional if before constant definition. This will allow users - to redefine constants without changing the file, and then improve - upgrade of pclzip code for new versions. - - Version 2.5 : - - Introduce the ability to add file/folder with individual properties (file descriptor). - This gives for example the ability to change the filename of a zipped file. - . Able to add files individually - . Able to change full name - . Able to change short name - . Compatible with global options - - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME - - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE - - Add a security control feature. PclZip can extract any file in any folder - of a system. People may use this to upload a zip file and try to override - a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the - ability to forgive any directory transversal behavior. - - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path - - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION - - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend - by current path (getcwd()) - - Version 2.4 : - - Code improvment : try to speed up the code by removing unusefull call to pack() - - Correct bug in delete() : delete() should be called with no argument. This was not - the case in 2.3. This is corrected in 2.4. - - Correct a bug in path_inclusion function. When the path has several '../../', the - result was bad. - - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will - disable it while working and det it back to its original value. - This resolve a lots of bad formated archive errors. - - Bug correction : PclZip now correctly unzip file in some specific situation, - when compressed content has same size as uncompressed content. - - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', - directories are not any more created. - - Code improvment : correct unclosed opendir(), better handling of . and .. in - loops. - - - Version 2.3 : - - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not - give the same result in PHP4 and PHP5 .... - - Version 2.2 : - - Try development of PCLZIP_OPT_CRYPT ..... - However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers, - the result (greater than a long) is not supported by PHP. Even the use of bcmath - functions does not help. I did not find yet a solution ...; - - Add missing '/' at end of directory entries - - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or - error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION. - - Corrected : Bad "version need to extract" field in local file header - - Add private method privCheckFileHeaders() in order to check local and central - file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives - the ability to have a local file header without size, compressed size and crc filled. - - Add a generic status 'error' for file status - - Add control of compression type. PclZip only support deflate compression method. - Before v2.2, PclZip does not check the compression method used in an archive while - extracting. With v2.2 PclZip returns a new error status for a file using an unsupported - compression method. New status is "unsupported_compression". New error code is - PCLZIP_ERR_UNSUPPORTED_COMPRESSION. - - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files - when errors like 'a folder with same name exists' or 'a newer file exists' or - 'a write protected file' exists, rather than set a status for the concerning file - and resume the extract of the zip. - - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the - replacement of the file, even if a newer version of the file exists. - Note that today if a file with the same name already exists but is older it will be - replaced by the extracted one. - - Improve PclZipUtilOption() - - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central - directory structure is the last data in the archive. Crypt encryption/decryption of - zip archive put trailing 0 bytes after decryption. PclZip is now supporting this. - - Version 2.1 : - - Add the ability to abort the extraction by using a user callback function. - The user can now return the value '2' in its callback which indicates to stop the - extraction. For a pre call-back extract is stopped before the extration of the current - file. For a post call back, the extraction is stopped after. - - Add the ability to extract a file (or several files) directly in the standard output. - This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract(). - - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT, - PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments - in the zip archive. - - When merging two archives, the comments are not any more lost, but merged, with a - blank space separator. - - Corrected bug : Files are not deleted when all files are asked to be deleted. - - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature. - - - Version 2.0 : - ***** Warning : Some new features may break the backward compatibility for your scripts. - Please carefully read the readme file. - - Add the ability to delete by Index, name and regular expression. This feature is - performed by the method delete(), which uses the optional parameters - PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG. - - Add the ability to extract by regular expression. To extract by regexp you must use the method - extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG - (depending if you want to use ereg() or preg_match() syntax) followed by the - regular expression pattern. - - Add the ability to extract by index, directly with the extract() method. This is a - code improvment of the extractByIndex() method. - - Add the ability to extract by name. To extract by name you must use the method - extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to - extract or an array of filenames to extract. To extract all a folder, use the folder - name rather than the filename with a '/' at the end. - - Add the ability to add files without compression. This is done with a new attribute - which is PCLZIP_OPT_NO_COMPRESSION. - - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly - in a string without using any file (or temporary file). - - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string. - The default separator is now a comma (,) and not any more a blank space. - THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with - your script. - - Improve algorythm performance by removing the use of temporary files when adding or - extracting files in an archive. - - Add (correct) detection of empty filename zipping. This can occurs when the removed - path is the same - as a zipped dir. The dir is not zipped (['status'] = filtered), only its content. - - Add better support for windows paths (thanks for help from manus@manusfreedom.com). - - Corrected bug : When the archive file already exists with size=0, the add() method - fails. Corrected in 2.0. - - Remove the use of OS_WINDOWS constant. Use php_uname() function rather. - - Control the order of index ranges in extract by index feature. - - Change the internal management of folders (better handling of internal flag). - - - Version 1.3 : - - Removing the double include check. This is now done by include_once() and require_once() - PHP directives. - - Changing the error handling mecanism : Remove the use of an external error library. - The former PclError...() functions are replaced by internal equivalent methods. - By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library. - Introducing the use of constants for error codes rather than integer values. This will help - in futur improvment. - Introduction of error handling functions like errorCode(), errorName() and errorInfo(). - - Remove the deprecated use of calling function with arguments passed by reference. - - Add the calling of extract(), extractByIndex(), create() and add() functions - with variable options rather than fixed arguments. - - Add the ability to remove all the file path while extracting or adding, - without any need to specify the path to remove. - This is available for extract(), extractByIndex(), create() and add() functionS by using - the new variable options parameters : - - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct. - - Ability to change the mode of a file after the extraction (chmod()). - This is available for extract() and extractByIndex() functionS by using - the new variable options parameters. - - PCLZIP_OPT_SET_CHMOD : by setting the value of this option. - - Ability to definition call-back options. These call-back will be called during the adding, - or the extracting of file (extract(), extractByIndex(), create() and add() functions) : - - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user - can trigerred the change the filename of the extracted file. The user can triggered the - skip of the extraction. This is adding a 'skipped' status in the file list result value. - - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file. - Nothing can be triggered from that point. - - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user - can trigerred the change the stored filename of the added file. The user can triggered the - skip of the add. This is adding a 'skipped' status in the file list result value. - - PCLZIP_CB_POST_ADD : will be called after each add of a file. - Nothing can be triggered from that point. - - Two status are added in the file list returned as function result : skipped & filename_too_long - 'skipped' is used when a call-back function ask for skipping the file. - 'filename_too_long' is used while adding a file with a too long filename to archive (the file is - not added) - - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into - a directory. - - Add a check of the presence of the archive file before some actions (like list, ...) - - Add the initialisation of field "index" in header array. This means that by - default index will be -1 when not explicitly set by the methods. - - Version 1.2 : - - Adding a duplicate function. - - Adding a merge function. The merge function is a "quick merge" function, - it just append the content of an archive at the end of the first one. There - is no check for duplicate files or more recent files. - - Improve the search of the central directory end. - - Version 1.1.2 : - - - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license - (see License section). - - Adding the optional support of a static temporary directory. You will need to configure - the constant PCLZIP_TEMPORARY_DIR if you want to use this feature. - - Improving the rename() function. In some cases rename() does not work (different - Filesystems), so it will be replaced by a copy() + unlink() functions. - - Version 1.1.1 : - - - Maintenance release, no new feature. - - Version 1.1 : - - - New method Add() : adding files in the archive - - New method ExtractByIndex() : partial extract of the archive, files are identified by - their index in the archive - - New method DeleteByIndex() : delete some files/folder entries from the archive, - files are identified by their index in the archive. - - Adding a test of the zlib extension presence. If not present abort the script. - - Version 1.0.1 : - - - No new feature - - -3 - Corrected bugs -================== - - Corrected in Version 2.0 : - - Corrected : During an extraction, if a call-back fucntion is used and try to skip - a file, all the extraction process is stopped. - - Corrected in Version 1.3 : - - Corrected : Support of static synopsis for method extract() is broken. - - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF). - - Corrected : When an extract is done with a remove_path parameter, the entry for - the directory with exactly the same path is not skipped/filtered. - - Corrected : extractByIndex() and deleteByIndex() were not managing index in the - right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This - is due to a sort of the index resulting table that puts 11 before 3-5 (sort on - string and not interger). The sort is temporarilly removed, this means that - you must provide a sorted list of index ranges. - - Corrected in Version 1.2 : - - - Nothing. - - Corrected in Version 1.1.2 : - - - Corrected : Winzip is unable to delete or add new files in a PclZip created archives. - - Corrected in Version 1.1.1 : - - - Corrected : When archived file is not compressed (0% compression), the - extract method fails. - - Corrected in Version 1.1 : - - - Corrected : Adding a complete tree of folder may result in a bad archive - creation. - - Corrected in Version 1.0.1 : - - - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). - - -4 - Known bugs or limitations -============================= - - Please publish bugs reports in SourceForge : - http://sourceforge.net/tracker/?group_id=40254&atid=427564 - - In Version 2.x : - - PclZip does only support file uncompressed or compressed with deflate (compression method 8) - - PclZip does not support password protected zip archive - - Some concern were seen when changing mtime of a file while archiving. - Seems to be linked to Daylight Saving Time (PclTest_changing_mtime). - - In Version 1.2 : - - - merge() methods does not check for duplicate files or last date of modifications. - - In Version 1.1 : - - - Limitation : Using 'extract' fields in the file header in the zip archive is not supported. - - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to - add a file in a PclZip created archive. (Corrected in v.1.2) - - In Version 1.0.1 : - - - Adding a complete tree of folder may result in a bad archive - creation. (Corrected in V.1.1). - - Path given to methods must be in the unix format (/) and not the Windows format (\). - Workaround : Use only / directory separators. - - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz - added suffix. Files with these names may already exist and may be overwritten. - Workaround : none. - - PclZip does not check if the zlib extension is present. If it is absent, the zip - file is not created and the lib abort without warning. - Workaround : enable the zlib extension on the php install - - In Version 1.0 : - - - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). - (Corrected in v.1.0.1) - - Limitation : Multi-disk zip archive are not supported. - - -5 - License -=========== - - Since version 1.1.2, PclZip Library is released under GNU/LGPL license. - This library is free, so you can use it at no cost. - - HOWEVER, if you release a script, an application, a library or any kind of - code using PclZip library (or a part of it), YOU MUST : - - Indicate in the documentation (or a readme file), that your work - uses PclZip Library, and make a reference to the author and the web site - http://www.phpconcept.net - - Gives the ability to the final user to update the PclZip libary. - - I will also appreciate that you send me a mail (vincent@phpconcept.net), just to - be aware that someone is using PclZip. - - For more information about GNU/LGPL license : http://www.gnu.org - -6 - Warning -================= - - This library and the associated files are non commercial, non professional work. - It should not have unexpected results. However if any damage is caused by this software - the author can not be responsible. - The use of this software is at the risk of the user. - -7 - Documentation -================= - PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php - A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/ - -8 - Author -========== - - This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time. - -9 - Contribute -============== - If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net. - If you can help in financing PhpConcept hosting service, please go to - http://www.phpconcept.net/soutien.php diff --git a/include/limesurvey/admin/classes/pear/OLE/OLE.php b/include/limesurvey/admin/classes/pear/OLE/OLE.php deleted file mode 100644 index c26093a3..00000000 --- a/include/limesurvey/admin/classes/pear/OLE/OLE.php +++ /dev/null @@ -1,412 +0,0 @@ - | -// | Based on OLE::Storage_Lite by Kawai, Takanori | -// +----------------------------------------------------------------------+ -// -// $Id: OLE.php,v 1.7 2003/08/21 15:15:40 xnoguer Exp $ - - -/** - * Constants for OLE package - */ -define('OLE_PPS_TYPE_ROOT', 5); -define('OLE_PPS_TYPE_DIR', 1); -define('OLE_PPS_TYPE_FILE', 2); -define('OLE_DATA_SIZE_SMALL', 0x1000); -define('OLE_LONG_INT_SIZE', 4); -define('OLE_PPS_SIZE', 0x80); - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); -require_once($homedir.'/classes/pear/PEAR.php'); -require_once $homedir.'/classes/pear/OLE/PPS.php'; - -/** - * OLE package base class. - * - * @author Xavier Noguer - * @category Structures - * @package OLE - */ -class OLE extends PEAR -{ - /** - * The file handle for reading an OLE container - * @var resource - */ - var $_file_handle; - - /** - * Array of PPS's found on the OLE container - * @var array - */ - var $_list; - - /** - * Creates a new OLE object - * Remember to use ampersand when creating an OLE object ($my_ole =& new OLE();) - * @access public - */ - function OLE() - { - $this->_list = array(); - } - - /** - * Reads an OLE container from the contents of the file given. - * - * @acces public - * @param string $file - * @return mixed true on success, PEAR_Error on failure - */ - function read($file) - { - /* consider storing offsets as constants */ - $big_block_size_offset = 30; - $iBdbCnt_offset = 44; - $bd_start_offset = 68; - - $fh = @fopen($file, "r"); - if ($fh == false) { - return $this->raiseError("Can't open file $file"); - } - $this->_file_handle = $fh; - - /* begin reading OLE attributes */ - fseek($fh, 0); - $signature = fread($fh, 8); - if ("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" != $signature) { - return $this->raiseError("File doesn't seem to be an OLE container."); - } - fseek($fh, $big_block_size_offset); - $packed_array = unpack("v", fread($fh, 2)); - $big_block_size = pow(2, $packed_array['']); - - $packed_array = unpack("v", fread($fh, 2)); - $small_block_size = pow(2, $packed_array['']); - $i1stBdL = ($big_block_size - 0x4C) / OLE_LONG_INT_SIZE; - - fseek($fh, $iBdbCnt_offset); - $packed_array = unpack("V", fread($fh, 4)); - $iBdbCnt = $packed_array['']; - - $packed_array = unpack("V", fread($fh, 4)); - $pps_wk_start = $packed_array['']; - - fseek($fh, $bd_start_offset); - $packed_array = unpack("V", fread($fh, 4)); - $bd_start = $packed_array['']; - $packed_array = unpack("V", fread($fh, 4)); - $bd_count = $packed_array['']; - $packed_array = unpack("V", fread($fh, 4)); - $iAll = $packed_array['']; // this may be wrong - /* create OLE_PPS objects from */ - $ret = $this->_readPpsWks($pps_wk_start, $big_block_size); - if (PEAR::isError($ret)) { - return $ret; - } - return true; - } - - /** - * Destructor (using PEAR) - * Just closes the file handle on the OLE file. - * - * @access private - */ - function _OLE() - { - fclose($this->_file_handle); - } - - /** - * Gets information about all PPS's on the OLE container from the PPS WK's - * creates an OLE_PPS object for each one. - * - * @access private - * @param integer $pps_wk_start Position inside the OLE file where PPS WK's start - * @param integer $big_block_size Size of big blobks in the OLE file - * @return mixed true on success, PEAR_Error on failure - */ - function _readPpsWks($pps_wk_start, $big_block_size) - { - $pointer = ($pps_wk_start + 1) * $big_block_size; - while (1) - { - fseek($this->_file_handle, $pointer); - $pps_wk = fread($this->_file_handle, OLE_PPS_SIZE); - if (strlen($pps_wk) != OLE_PPS_SIZE) { - break; // Excel likes to add a trailing byte sometimes - //return $this->raiseError("PPS at $pointer seems too short: ".strlen($pps_wk)); - } - $name_length = unpack("c", substr($pps_wk, 64, 2)); // FIXME (2 bytes??) - $name_length = $name_length[''] - 2; - $name = substr($pps_wk, 0, $name_length); - $type = unpack("c", substr($pps_wk, 66, 1)); - if (($type[''] != OLE_PPS_TYPE_ROOT) and - ($type[''] != OLE_PPS_TYPE_DIR) and - ($type[''] != OLE_PPS_TYPE_FILE)) - { - return $this->raiseError("PPS at $pointer has unknown type: {$type['']}"); - } - $prev = unpack("V", substr($pps_wk, 68, 4)); - $next = unpack("V", substr($pps_wk, 72, 4)); - $dir = unpack("V", substr($pps_wk, 76, 4)); - // there is no magic number, it can take different values. - //$magic = unpack("V", strrev(substr($pps_wk, 92, 4))); - $time_1st = substr($pps_wk, 100, 8); - $time_2nd = substr($pps_wk, 108, 8); - $start_block = unpack("V", substr($pps_wk, 116, 4)); - $size = unpack("V", substr($pps_wk, 120, 4)); - // _data member will point to position in file!! - // OLE_PPS object is created with an empty children array!! - $this->_list[] = new OLE_PPS(null, '', $type[''], $prev[''], $next[''], - $dir[''], OLE::OLE2LocalDate($time_1st), - OLE::OLE2LocalDate($time_2nd), - ($start_block[''] + 1) * $big_block_size, array()); - // give it a size - $this->_list[count($this->_list) - 1]->Size = $size['']; - // check if the PPS tree (starting from root) is complete - if ($this->_ppsTreeComplete(0)) { - break; - } - $pointer += OLE_PPS_SIZE; - } - } - - /** - * It checks whether the PPS tree is complete (all PPS's read) - * starting with the given PPS (not necessarily root) - * - * @access private - * @param integer $index The index of the PPS from which we are checking - * @return boolean Whether the PPS tree for the given PPS is complete - */ - function _ppsTreeComplete($index) - { - if ($this->_list[$index]->NextPps != -1) { - if (!isset($this->_list[$this->_list[$index]->NextPps])) { - return false; - } - else { - return $this->_ppsTreeComplete($this->_list[$index]->NextPps); - } - } - if ($this->_list[$index]->DirPps != -1) { - if (!isset($this->_list[$this->_list[$index]->DirPps])) { - return false; - } - else { - return $this->_ppsTreeComplete($this->_list[$index]->DirPps); - } - } - return true; - } - - /** - * Checks whether a PPS is a File PPS or not. - * If there is no PPS for the index given, it will return false. - * - * @access public - * @param integer $index The index for the PPS - * @return bool true if it's a File PPS, false otherwise - */ - function isFile($index) - { - if (isset($this->_list[$index])) { - return ($this->_list[$index]->Type == OLE_PPS_TYPE_FILE); - } - return false; - } - - /** - * Checks whether a PPS is a Root PPS or not. - * If there is no PPS for the index given, it will return false. - * - * @access public - * @param integer $index The index for the PPS. - * @return bool true if it's a Root PPS, false otherwise - */ - function isRoot($index) - { - if (isset($this->_list[$index])) { - return ($this->_list[$index]->Type == OLE_PPS_TYPE_ROOT); - } - return false; - } - - /** - * Gives the total number of PPS's found in the OLE container. - * - * @access public - * @return integer The total number of PPS's found in the OLE container - */ - function ppsTotal() - { - return count($this->_list); - } - - /** - * Gets data from a PPS - * If there is no PPS for the index given, it will return an empty string. - * - * @access public - * @param integer $index The index for the PPS - * @param integer $position The position from which to start reading - * (relative to the PPS) - * @param integer $length The amount of bytes to read (at most) - * @return string The binary string containing the data requested - */ - function getData($index, $position, $length) - { - // if position is not valid return empty string - if (!isset($this->_list[$index]) or ($position >= $this->_list[$index]->Size) or ($position < 0)) { - return ''; - } - // Beware!!! _data member is actually a position - fseek($this->_file_handle, $this->_list[$index]->_data + $position); - return fread($this->_file_handle, $length); - } - - /** - * Gets the data length from a PPS - * If there is no PPS for the index given, it will return 0. - * - * @access public - * @param integer $index The index for the PPS - * @return integer The amount of bytes in data the PPS has - */ - function getDataLength($index) - { - if (isset($this->_list[$index])) { - return $this->_list[$index]->Size; - } - return 0; - } - - /** - * Utility function to transform ASCII text to Unicode - * - * @access public - * @static - * @param string $ascii The ASCII string to transform - * @return string The string in Unicode - */ - static function Asc2Ucs($ascii) - { - $rawname = ''; - for ($i = 0; $i < strlen($ascii); $i++) { - $rawname .= $ascii{$i}."\x00"; - } - return $rawname; - } - - /** - * Utility function - * Returns a string for the OLE container with the date given - * - * @access public - * @static - * @param integer $date A timestamp - * @return string The string for the OLE container - */ - static function LocalDate2OLE($date = null) - { - if (!isset($date)) { - return "\x00\x00\x00\x00\x00\x00\x00\x00"; - } - - // factor used for separating numbers into 4 bytes parts - $factor = pow(2,32); - - // days from 1-1-1601 until the beggining of UNIX era - $days = 134774; - // calculate seconds - $big_date = $days*24*3600 + gmmktime(date("H",$date),date("i",$date),date("s",$date), - date("m",$date),date("d",$date),date("Y",$date)); - // multiply just to make MS happy - $big_date *= 10000000; - - $high_part = floor($big_date/$factor); - // lower 4 bytes - $low_part = floor((($big_date/$factor) - $high_part)*$factor); - - // Make HEX string - $res = ''; - - for ($i=0; $i<4; $i++) - { - $hex = $low_part % 0x100; - $res .= pack('c', $hex); - $low_part /= 0x100; - } - for ($i=0; $i<4; $i++) - { - $hex = $high_part % 0x100; - $res .= pack('c', $hex); - $high_part /= 0x100; - } - return $res; - } - - /** - * Returns a timestamp from an OLE container's date - * - * @access public - * @static - * @param integer $string A binary string with the encoded date - * @return string The timestamp corresponding to the string - */ - static function OLE2LocalDate($string) - { - if (strlen($string) != 8) { - return new PEAR_Error("Expecting 8 byte string"); - } - - // factor used for separating numbers into 4 bytes parts - $factor = pow(2,32); - $high_part = 0; - for ($i=0; $i<4; $i++) - { - $al = unpack('C', $string{(7 - $i)}); - $high_part += $al['']; - if ($i < 3) { - $high_part *= 0x100; - } - } - $low_part = 0; - for ($i=4; $i<8; $i++) - { - $al = unpack('C', $string{(7 - $i)}); - $low_part += $al['']; - if ($i < 7) { - $low_part *= 0x100; - } - } - $big_date = ($high_part*$factor) + $low_part; - // translate to seconds - $big_date /= 10000000; - - // days from 1-1-1601 until the beggining of UNIX era - $days = 134774; - - // translate to seconds from beggining of UNIX era - $big_date -= $days*24*3600; - return floor($big_date); - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/OLE/PPS.php b/include/limesurvey/admin/classes/pear/OLE/PPS.php deleted file mode 100644 index 330ba52e..00000000 --- a/include/limesurvey/admin/classes/pear/OLE/PPS.php +++ /dev/null @@ -1,220 +0,0 @@ - | -// | Based on OLE::Storage_Lite by Kawai, Takanori | -// +----------------------------------------------------------------------+ -// -// $Id: PPS.php,v 1.5 2003/12/14 18:12:28 xnoguer Exp $ - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); -require_once($homedir.'/classes/pear/PEAR.php'); -require_once($homedir.'/classes/pear/OLE/OLE.php'); - -/** - * Class for creating PPS's for OLE containers - * - * @author Xavier Noguer - * @category Structures - * @package OLE - */ -class OLE_PPS extends PEAR -{ - /** - * The PPS index - * @var integer - */ - var $No; - - /** - * The PPS name (in Unicode) - * @var string - */ - var $Name; - - /** - * The PPS type. Dir, Root or File - * @var integer - */ - var $Type; - - /** - * The index of the previous PPS - * @var integer - */ - var $PrevPps; - - /** - * The index of the next PPS - * @var integer - */ - var $NextPps; - - /** - * The index of it's first child if this is a Dir or Root PPS - * @var integer - */ - var $DirPps; - - /** - * A timestamp - * @var integer - */ - var $Time1st; - - /** - * A timestamp - * @var integer - */ - var $Time2nd; - - /** - * Starting block (small or big) for this PPS's data inside the container - * @var integer - */ - var $_StartBlock; - - /** - * The size of the PPS's data (in bytes) - * @var integer - */ - var $Size; - - /** - * The PPS's data (only used if it's not using a temporary file) - * @var string - */ - var $_data; - - /** - * Array of child PPS's (only used by Root and Dir PPS's) - * @var array - */ - var $children = array(); - - /** - * The constructor - * - * @access public - * @param integer $No The PPS index - * @param string $name The PPS name (in Unicode) - * @param integer $type The PPS type. Dir, Root or File - * @param integer $prev The index of the previous PPS - * @param integer $next The index of the next PPS - * @param integer $dir The index of it's first child if this is a Dir or Root PPS - * @param integer $time_1st A timestamp - * @param integer $time_2nd A timestamp - * @param array $children Array containing children PPS for this PPS - */ - function OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) - { - $this->No = $No; - $this->Name = $name; - $this->Type = $type; - $this->PrevPps = $prev; - $this->NextPps = $next; - $this->DirPps = $dir; - $this->Time1st = $time_1st; - $this->Time2nd = $time_2nd; - $this->_data = $data; - $this->children = $children; - if ($data != '') { - $this->Size = strlen($data); - } - else { - $this->Size = 0; - } - } - - /** - * Returns the amount of data saved for this PPS - * - * @access private - * @return integer The amount of data (in bytes) - */ - function _DataLen() - { - if (!isset($this->_data)) { - return 0; - } - if (isset($this->_PPS_FILE)) - { - fseek($this->_PPS_FILE, 0); - $stats = fstat($this->_PPS_FILE); - return $stats[7]; - } - else { - return strlen($this->_data); - } - } - - /** - * Returns a string with the PPS's WK (What is a WK?) - * - * @access private - * @return string The binary string - */ - function _getPpsWk() - { - $ret = $this->Name; - for ($i = 0; $i < (64 - strlen($this->Name)); $i++) { - $ret .= "\x00"; - } - $ret .= pack("v", strlen($this->Name) + 2) // 66 - . pack("c", $this->Type) // 67 - . pack("c", 0x00) //UK // 68 - . pack("V", $this->PrevPps) //Prev // 72 - . pack("V", $this->NextPps) //Next // 76 - . pack("V", $this->DirPps) //Dir // 80 - . "\x00\x09\x02\x00" // 84 - . "\x00\x00\x00\x00" // 88 - . "\xc0\x00\x00\x00" // 92 - . "\x00\x00\x00\x46" // 96 // Seems to be ok only for Root - . "\x00\x00\x00\x00" // 100 - . OLE::LocalDate2OLE($this->Time1st) // 108 - . OLE::LocalDate2OLE($this->Time2nd) // 116 - . pack("V", isset($this->_StartBlock)? - $this->_StartBlock:0) // 120 - . pack("V", $this->Size) // 124 - . pack("V", 0); // 128 - return $ret; - } - - /** - * Updates index and pointers to previous, next and children PPS's for this - * PPS. I don't think it'll work with Dir PPS's. - * - * @access private - * @param array &$pps_array Reference to the array of PPS's for the whole OLE - * container - * @return integer The index for this PPS - */ - function _savePpsSetPnt(&$pps_array) - { - $pps_array[count($pps_array)] = &$this; - $this->No = count($pps_array) - 1; - $this->PrevPps = 0xFFFFFFFF; - $this->NextPps = 0xFFFFFFFF; - if (count($this->children) > 0) { - $this->DirPps = $this->children[0]->_savePpsSetPnt($pps_array); - } - else { - $this->DirPps = 0xFFFFFFFF; - } - return $this->No; - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/OLE/PPS/File.php b/include/limesurvey/admin/classes/pear/OLE/PPS/File.php deleted file mode 100644 index 68f83ef1..00000000 --- a/include/limesurvey/admin/classes/pear/OLE/PPS/File.php +++ /dev/null @@ -1,115 +0,0 @@ - | -// | Based on OLE::Storage_Lite by Kawai, Takanori | -// +----------------------------------------------------------------------+ -// -// $Id: File.php,v 1.8 2003/12/12 21:10:10 xnoguer Exp $ - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); -require_once ($homedir.'/classes/pear/OLE/PPS.php'); - -/** - * Class for creating File PPS's for OLE containers - * - * @author Xavier Noguer - * @category Structures - * @package OLE - */ -class OLE_PPS_File extends OLE_PPS -{ - /** - * The temporary dir for storing the OLE file - * @var string - */ - var $_tmp_dir; - - /** - * The constructor - * - * @access public - * @param string $name The name of the file (in Unicode) - * @see OLE::Asc2Ucs() - */ - function OLE_PPS_File($name) - { - $this->_tmp_dir = ''; - $this->OLE_PPS( - null, - $name, - OLE_PPS_TYPE_FILE, - null, - null, - null, - null, - null, - '', - array()); - } - - /** - * Sets the temp dir used for storing the OLE file - * - * @access public - * @param string $dir The dir to be used as temp dir - * @return true if given dir is valid, false otherwise - */ - function setTempDir($dir) - { - if (is_dir($dir)) { - $this->_tmp_dir = $dir; - return true; - } - return false; - } - - /** - * Initialization method. Has to be called right after OLE_PPS_File(). - * - * @access public - * @return mixed true on success. PEAR_Error on failure - */ - function init() - { - $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_File"); - $fh = @fopen($this->_tmp_filename, "w+b"); - if ($fh == false) { - return $this->raiseError("Can't create temporary file"); - } - $this->_PPS_FILE = $fh; - if ($this->_PPS_FILE) { - fseek($this->_PPS_FILE, 0); - } - } - - /** - * Append data to PPS - * - * @access public - * @param string $data The data to append - */ - function append($data) - { - if ($this->_PPS_FILE) { - fwrite($this->_PPS_FILE, $data); - } - else { - $this->_data .= $data; - } - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/OLE/PPS/Root.php b/include/limesurvey/admin/classes/pear/OLE/PPS/Root.php deleted file mode 100644 index 9c0c03c3..00000000 --- a/include/limesurvey/admin/classes/pear/OLE/PPS/Root.php +++ /dev/null @@ -1,520 +0,0 @@ - | -// | Based on OLE::Storage_Lite by Kawai, Takanori | -// +----------------------------------------------------------------------+ -// -// $Id: Root.php,v 1.7 2003/12/12 21:10:10 xnoguer Exp $ - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); -require_once ($homedir.'/classes/pear/OLE/PPS.php'); - -/** - * Class for creating Root PPS's for OLE containers - * - * @author Xavier Noguer - * @category Structures - * @package OLE - */ -class OLE_PPS_Root extends OLE_PPS -{ - /** - * The temporary dir for storing the OLE file - * @var string - */ - var $_tmp_dir; - - /** - * Constructor - * - * @access public - * @param integer $time_1st A timestamp - * @param integer $time_2nd A timestamp - */ - function OLE_PPS_Root($time_1st, $time_2nd, $raChild) - { - $this->_tmp_dir = ''; - $this->OLE_PPS( - null, - OLE::Asc2Ucs('Root Entry'), - OLE_PPS_TYPE_ROOT, - null, - null, - null, - $time_1st, - $time_2nd, - null, - $raChild); - } - - /** - * Sets the temp dir used for storing the OLE file - * - * @access public - * @param string $dir The dir to be used as temp dir - * @return true if given dir is valid, false otherwise - */ - function setTempDir($dir) - { - if (is_dir($dir)) { - $this->_tmp_dir = $dir; - return true; - } - return false; - } - - /** - * Method for saving the whole OLE container (including files). - * In fact, if called with an empty argument (or '-'), it saves to a - * temporary file and then outputs it's contents to stdout. - * - * @param string $filename The name of the file where to save the OLE container - * @access public - * @return mixed true on success, PEAR_Error on failure - */ - function save($filename) - { - // Initial Setting for saving - $this->_BIG_BLOCK_SIZE = pow(2, - ((isset($this->_BIG_BLOCK_SIZE))? $this->_adjust2($this->_BIG_BLOCK_SIZE) : 9)); - $this->_SMALL_BLOCK_SIZE= pow(2, - ((isset($this->_SMALL_BLOCK_SIZE))? $this->_adjust2($this->_SMALL_BLOCK_SIZE): 6)); - - // Open temp file if we are sending output to stdout - if (($filename == '-') or ($filename == '')) - { - $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_Root"); - $this->_FILEH_ = @fopen($this->_tmp_filename,"w+b"); - if ($this->_FILEH_ == false) { - return $this->raiseError("Can't create temporary file."); - } - } - else - { - $this->_FILEH_ = @fopen($filename, "wb"); - if ($this->_FILEH_ == false) { - return $this->raiseError("Can't open $filename. It may be in use or protected."); - } - } - // Make an array of PPS's (for Save) - $aList = array(); - $this->_savePpsSetPnt($aList); - // calculate values for header - list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->_calcSize($aList); //, $rhInfo); - // Save Header - $this->_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt); - - // Make Small Data string (write SBD) - $this->_data = $this->_makeSmallData($aList); - - // Write BB - $this->_saveBigData($iSBDcnt, $aList); - // Write PPS - $this->_savePps($aList); - // Write Big Block Depot and BDList and Adding Header informations - $this->_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt); - // Close File, send it to stdout if necessary - if(($filename == '-') or ($filename == '')) - { - fseek($this->_FILEH_, 0); - fpassthru($this->_FILEH_); - @fclose($this->_FILEH_); - // Delete the temporary file. - @unlink($this->_tmp_filename); - } - else { - @fclose($this->_FILEH_); - } - return true; - } - - /** - * Calculate some numbers - * - * @access private - * @param array $raList Reference to an array of PPS's - * @return array The array of numbers - */ - function _calcSize(&$raList) - { - // Calculate Basic Setting - list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0); - $iSmallLen = 0; - $iSBcnt = 0; - for ($i = 0; $i < count($raList); $i++) { - if($raList[$i]->Type == OLE_PPS_TYPE_FILE) { - $raList[$i]->Size = $raList[$i]->_DataLen(); - if($raList[$i]->Size < OLE_DATA_SIZE_SMALL) { - $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) - + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); - } - else { - $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + - (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); - } - } - } - $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE; - $iSlCnt = floor($this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE); - $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0); - $iBBcnt += (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) + - (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0)); - $iCnt = count($raList); - $iBdCnt = $this->_BIG_BLOCK_SIZE / OLE_PPS_SIZE; - $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0)); - - return array($iSBDcnt, $iBBcnt, $iPPScnt); - } - - /** - * Helper function for caculating a magic value for block sizes - * - * @access private - * @param integer $i2 The argument - * @see save() - * @return integer - */ - function _adjust2($i2) - { - $iWk = log($i2)/log(2); - return ($iWk > floor($iWk))? floor($iWk)+1:$iWk; - } - - /** - * Save OLE header - * - * @access private - * @param integer $iSBDcnt - * @param integer $iBBcnt - * @param integer $iPPScnt - */ - function _saveHeader($iSBDcnt, $iBBcnt, $iPPScnt) - { - $FILE = $this->_FILEH_; - - // Calculate Basic Setting - $iBlCnt = $this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE; - $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / OLE_LONG_INT_SIZE; - - $iBdExL = 0; - $iAll = $iBBcnt + $iPPScnt + $iSBDcnt; - $iAllW = $iAll; - $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); - $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); - - // Calculate BD count - if ($iBdCnt >$i1stBdL) - { - while (1) - { - $iBdExL++; - $iAllW++; - $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); - $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); - if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) { - break; - } - } - } - - // Save Header - fwrite($FILE, - "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" - . "\x00\x00\x00\x00" - . "\x00\x00\x00\x00" - . "\x00\x00\x00\x00" - . "\x00\x00\x00\x00" - . pack("v", 0x3b) - . pack("v", 0x03) - . pack("v", -2) - . pack("v", 9) - . pack("v", 6) - . pack("v", 0) - . "\x00\x00\x00\x00" - . "\x00\x00\x00\x00" - . pack("V", $iBdCnt) - . pack("V", $iBBcnt+$iSBDcnt) //ROOT START - . pack("V", 0) - . pack("V", 0x1000) - . pack("V", 0) //Small Block Depot - . pack("V", 1) - ); - // Extra BDList Start, Count - if ($iBdCnt < $i1stBdL) - { - fwrite($FILE, - pack("V", -2). // Extra BDList Start - pack("V", 0) // Extra BDList Count - ); - } - else - { - fwrite($FILE, pack("V", $iAll+$iBdCnt) . pack("V", $iBdExL)); - } - - // BDList - for ($i=0; $i<$i1stBdL and $i < $iBdCnt; $i++) { - fwrite($FILE, pack("V", $iAll+$i)); - } - if ($i < $i1stBdL) - { - for ($j = 0; $j < ($i1stBdL-$i); $j++) { - fwrite($FILE, (pack("V", -1))); - } - } - } - - /** - * Saving big data (PPS's with data bigger than OLE_DATA_SIZE_SMALL) - * - * @access private - * @param integer $iStBlk - * @param array &$raList Reference to array of PPS's - */ - function _saveBigData($iStBlk, &$raList) - { - $FILE = $this->_FILEH_; - - // cycle through PPS's - for ($i = 0; $i < count($raList); $i++) - { - if($raList[$i]->Type != OLE_PPS_TYPE_DIR) - { - $raList[$i]->Size = $raList[$i]->_DataLen(); - if(($raList[$i]->Size >= OLE_DATA_SIZE_SMALL) or - (($raList[$i]->Type == OLE_PPS_TYPE_ROOT) and isset($raList[$i]->_data))) - { - // Write Data - if(isset($raList[$i]->_PPS_FILE)) - { - $iLen = 0; - fseek($raList[$i]->_PPS_FILE, 0); // To The Top - while($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) - { - $iLen += strlen($sBuff); - fwrite($FILE, $sBuff); - } - } - else { - fwrite($FILE, $raList[$i]->_data); - } - - if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) - { - for ($j = 0; $j < ($this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)); $j++) { - fwrite($FILE, "\x00"); - } - } - // Set For PPS - $raList[$i]->_StartBlock = $iStBlk; - $iStBlk += - (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + - (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); - } - // Close file for each PPS, and unlink it - if (isset($raList[$i]->_PPS_FILE)) - { - @fclose($raList[$i]->_PPS_FILE); - $raList[$i]->_PPS_FILE = null; - @unlink($raList[$i]->_tmp_filename); - } - } - } - } - - /** - * get small data (PPS's with data smaller than OLE_DATA_SIZE_SMALL) - * - * @access private - * @param array &$raList Reference to array of PPS's - */ - function _makeSmallData(&$raList) - { - $sRes = ''; - $FILE = $this->_FILEH_; - $iSmBlk = 0; - - for ($i = 0; $i < count($raList); $i++) - { - // Make SBD, small data string - if ($raList[$i]->Type == OLE_PPS_TYPE_FILE) - { - if ($raList[$i]->Size <= 0) { - continue; - } - if ($raList[$i]->Size < OLE_DATA_SIZE_SMALL) - { - $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) - + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); - // Add to SBD - for ($j = 0; $j < ($iSmbCnt-1); $j++) { - fwrite($FILE, pack("V", $j+$iSmBlk+1)); - } - fwrite($FILE, pack("V", -2)); - - // Add to Data String(this will be written for RootEntry) - if ($raList[$i]->_PPS_FILE) - { - fseek($raList[$i]->_PPS_FILE, 0); // To The Top - while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { - $sRes .= $sBuff; - } - } - else { - $sRes .= $raList[$i]->_data; - } - if($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) - { - for ($j = 0; $j < ($this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)); $j++) { - $sRes .= "\x00"; - } - } - // Set for PPS - $raList[$i]->_StartBlock = $iSmBlk; - $iSmBlk += $iSmbCnt; - } - } - } - $iSbCnt = floor($this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE); - if($iSmBlk % $iSbCnt) - { - for ($i = 0; $i < ($iSbCnt - ($iSmBlk % $iSbCnt)); $i++) { - fwrite($FILE, pack("V", -1)); - } - } - return $sRes; - } - - /** - * Saves all the PPS's WKs - * - * @access private - * @param array $raList Reference to an array with all PPS's - */ - function _savePps(&$raList) - { - // Save each PPS WK - for ($i = 0; $i < count($raList); $i++) { - fwrite($this->_FILEH_, $raList[$i]->_getPpsWk()); - } - // Adjust for Block - $iCnt = count($raList); - $iBCnt = $this->_BIG_BLOCK_SIZE / OLE_PPS_SIZE; - if ($iCnt % $iBCnt) - { - for ($i = 0; $i < (($iBCnt - ($iCnt % $iBCnt)) * OLE_PPS_SIZE); $i++) { - fwrite($this->_FILEH_, "\x00"); - } - } - } - - /** - * Saving Big Block Depot - * - * @access private - * @param integer $iSbdSize - * @param integer $iBsize - * @param integer $iPpsCnt - */ - function _saveBbd($iSbdSize, $iBsize, $iPpsCnt) - { - $FILE = $this->_FILEH_; - // Calculate Basic Setting - $iBbCnt = $this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE; - $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / OLE_LONG_INT_SIZE; - - $iBdExL = 0; - $iAll = $iBsize + $iPpsCnt + $iSbdSize; - $iAllW = $iAll; - $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); - $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); - // Calculate BD count - if ($iBdCnt >$i1stBdL) - { - while (1) - { - $iBdExL++; - $iAllW++; - $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); - $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); - if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) { - break; - } - } - } - - // Making BD - // Set for SBD - if ($iSbdSize > 0) - { - for ($i = 0; $i<($iSbdSize-1); $i++) { - fwrite($FILE, pack("V", $i+1)); - } - fwrite($FILE, pack("V", -2)); - } - // Set for B - for ($i = 0; $i<($iBsize-1); $i++) { - fwrite($FILE, pack("V", $i+$iSbdSize+1)); - } - fwrite($FILE, pack("V", -2)); - - // Set for PPS - for ($i = 0; $i<($iPpsCnt-1); $i++) { - fwrite($FILE, pack("V", $i+$iSbdSize+$iBsize+1)); - } - fwrite($FILE, pack("V", -2)); - // Set for BBD itself ( 0xFFFFFFFD : BBD) - for ($i=0; $i<$iBdCnt;$i++) { - fwrite($FILE, pack("V", 0xFFFFFFFD)); - } - // Set for ExtraBDList - for ($i=0; $i<$iBdExL;$i++) { - fwrite($FILE, pack("V", 0xFFFFFFFC)); - } - // Adjust for Block - if (($iAllW + $iBdCnt) % $iBbCnt) - { - for ($i = 0; $i < ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); $i++) { - fwrite($FILE, pack("V", -1)); - } - } - // Extra BDList - if ($iBdCnt > $i1stBdL) - { - $iN=0; - $iNb=0; - for ($i=$i1stBdL;$i<$iBdCnt; $i++, $iN++) - { - if ($iN>=($iBbCnt-1)) - { - $iN = 0; - $iNb++; - fwrite($FILE, pack("V", $iAll+$iBdCnt+$iNb)); - } - fwrite($FILE, pack("V", $iBsize+$iSbdSize+$iPpsCnt+$i)); - } - if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) - { - for ($i = 0; $i < (($iBbCnt-1) - (($iBdCnt-$i1stBdL) % ($iBbCnt-1))); $i++) { - fwrite($FILE, pack("V", -1)); - } - } - fwrite($FILE, pack("V", -2)); - } - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/PEAR.php b/include/limesurvey/admin/classes/pear/PEAR.php deleted file mode 100644 index 869038ff..00000000 --- a/include/limesurvey/admin/classes/pear/PEAR.php +++ /dev/null @@ -1,1095 +0,0 @@ - - * @author Stig Bakken - * @author Tomas V.V.Cox - * @author Greg Beaver - * @copyright 1997-2005 The PHP Group - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: PEAR.php,v 1.96 2005/09/21 00:12:35 cellog Exp $ - * @link http://pear.php.net/package/PEAR - * @since File available since Release 0.1 - */ - -/**#@+ - * ERROR constants - */ -define('PEAR_ERROR_RETURN', 1); -define('PEAR_ERROR_PRINT', 2); -define('PEAR_ERROR_TRIGGER', 4); -define('PEAR_ERROR_DIE', 8); -define('PEAR_ERROR_CALLBACK', 16); -/** - * WARNING: obsolete - * @deprecated - */ -define('PEAR_ERROR_EXCEPTION', 32); -/**#@-*/ -define('PEAR_ZE2', (function_exists('version_compare') && -version_compare(zend_version(), "2-dev", "ge"))); - -if (substr(PHP_OS, 0, 3) == 'WIN') { - define('OS_WINDOWS', true); - define('OS_UNIX', false); - define('PEAR_OS', 'Windows'); -} else { - define('OS_WINDOWS', false); - define('OS_UNIX', true); - define('PEAR_OS', 'Unix'); // blatant assumption -} - -// instant backwards compatibility -if (!defined('PATH_SEPARATOR')) { - if (OS_WINDOWS) { - define('PATH_SEPARATOR', ';'); - } else { - define('PATH_SEPARATOR', ':'); - } -} - -$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; -$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; -$GLOBALS['_PEAR_destructor_object_list'] = array(); -$GLOBALS['_PEAR_shutdown_funcs'] = array(); -$GLOBALS['_PEAR_error_handler_stack'] = array(); - -@ini_set('track_errors', true); - -/** - * Base class for other PEAR classes. Provides rudimentary - * emulation of destructors. - * - * If you want a destructor in your class, inherit PEAR and make a - * destructor method called _yourclassname (same name as the - * constructor, but with a "_" prefix). Also, in your constructor you - * have to call the PEAR constructor: $this->PEAR();. - * The destructor method will be called without parameters. Note that - * at in some SAPI implementations (such as Apache), any output during - * the request shutdown (in which destructors are called) seems to be - * discarded. If you need to get any debug information from your - * destructor, use error_log(), syslog() or something similar. - * - * IMPORTANT! To use the emulated destructors you need to create the - * objects by reference: $obj =& new PEAR_child; - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V.V. Cox - * @author Greg Beaver - * @copyright 1997-2005 The PHP Group - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: 1.4.5 - * @link http://pear.php.net/package/PEAR - * @see PEAR_Error - * @since Class available since PHP 4.0.2 - * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear - */ -class PEAR -{ - // {{{ properties - - /** - * Whether to enable internal debug messages. - * - * @var bool - * @access private - */ - var $_debug = false; - - /** - * Default error mode for this object. - * - * @var int - * @access private - */ - var $_default_error_mode = null; - - /** - * Default error options used for this object when error mode - * is PEAR_ERROR_TRIGGER. - * - * @var int - * @access private - */ - var $_default_error_options = null; - - /** - * Default error handler (callback) for this object, if error mode is - * PEAR_ERROR_CALLBACK. - * - * @var string - * @access private - */ - var $_default_error_handler = ''; - - /** - * Which class to use for error objects. - * - * @var string - * @access private - */ - var $_error_class = 'PEAR_Error'; - - /** - * An array of expected errors. - * - * @var array - * @access private - */ - var $_expected_errors = array(); - - // }}} - - // {{{ constructor - - /** - * Constructor. Registers this object in - * $_PEAR_destructor_object_list for destructor emulation if a - * destructor object exists. - * - * @param string $error_class (optional) which class to use for - * error objects, defaults to PEAR_Error. - * @access public - * @return void - */ - function PEAR($error_class = null) - { - $classname = strtolower(get_class($this)); - if ($this->_debug) { - print "PEAR constructor called, class=$classname\n"; - } - if ($error_class !== null) { - $this->_error_class = $error_class; - } - while ($classname && strcasecmp($classname, "pear")) { - $destructor = "_$classname"; - if (method_exists($this, $destructor)) { - global $_PEAR_destructor_object_list; - $_PEAR_destructor_object_list[] = &$this; - if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { - register_shutdown_function("_PEAR_call_destructors"); - $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; - } - break; - } else { - $classname = get_parent_class($classname); - } - } - } - - // }}} - // {{{ destructor - - /** - * Destructor (the emulated type of...). Does nothing right now, - * but is included for forward compatibility, so subclass - * destructors should always call it. - * - * See the note in the class desciption about output from - * destructors. - * - * @access public - * @return void - */ - function _PEAR() { - if ($this->_debug) { - printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); - } - } - - // }}} - // {{{ getStaticProperty() - - /** - * If you have a class that's mostly/entirely static, and you need static - * properties, you can use this method to simulate them. Eg. in your method(s) - * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); - * You MUST use a reference, or they will not persist! - * - * @access public - * @param string $class The calling classname, to prevent clashes - * @param string $var The variable to retrieve. - * @return mixed A reference to the variable. If not set it will be - * auto initialised to NULL. - */ - function &getStaticProperty($class, $var) - { - static $properties; - return $properties[$class][$var]; - } - - // }}} - // {{{ registerShutdownFunc() - - /** - * Use this function to register a shutdown method for static - * classes. - * - * @access public - * @param mixed $func The function name (or array of class/method) to call - * @param mixed $args The arguments to pass to the function - * @return void - */ - function registerShutdownFunc($func, $args = array()) - { - $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); - } - - // }}} - // {{{ isError() - - /** - * Tell whether a value is a PEAR error. - * - * @param mixed $data the value to test - * @param int $code if $data is an error object, return true - * only if $code is a string and - * $obj->getMessage() == $code or - * $code is an integer and $obj->getCode() == $code - * @access public - * @return bool true if parameter is an error - */ - function isError($data, $code = null) - { - if ($data instanceof PEAR_Error) { - if (is_null($code)) { - return true; - } elseif (is_string($code)) { - return $data->getMessage() == $code; - } else { - return $data->getCode() == $code; - } - } - return false; - } - - // }}} - // {{{ setErrorHandling() - - /** - * Sets how errors generated by this object should be handled. - * Can be invoked both in objects and statically. If called - * statically, setErrorHandling sets the default behaviour for all - * PEAR objects. If called in an object, setErrorHandling sets - * the default behaviour for that object. - * - * @param int $mode - * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. - * - * @param mixed $options - * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one - * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * - * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected - * to be the callback function or method. A callback - * function is a string with the name of the function, a - * callback method is an array of two elements: the element - * at index 0 is the object, and the element at index 1 is - * the name of the method to call in the object. - * - * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is - * a printf format string used when printing the error - * message. - * - * @access public - * @return void - * @see PEAR_ERROR_RETURN - * @see PEAR_ERROR_PRINT - * @see PEAR_ERROR_TRIGGER - * @see PEAR_ERROR_DIE - * @see PEAR_ERROR_CALLBACK - * @see PEAR_ERROR_EXCEPTION - * - * @since PHP 4.0.5 - */ - - function setErrorHandling($mode = null, $options = null) - { - if (isset($this) && is_a($this, 'PEAR')) { - $setmode = &$this->_default_error_mode; - $setoptions = &$this->_default_error_options; - } else { - $setmode = &$GLOBALS['_PEAR_default_error_mode']; - $setoptions = &$GLOBALS['_PEAR_default_error_options']; - } - - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $setmode = $mode; - $setoptions = $options; - break; - - case PEAR_ERROR_CALLBACK: - $setmode = $mode; - // class/object method callback - if (is_callable($options)) { - $setoptions = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - } - - // }}} - // {{{ expectError() - - /** - * This method is used to tell which errors you expect to get. - * Expected errors are always returned with error mode - * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, - * and this method pushes a new element onto it. The list of - * expected errors are in effect until they are popped off the - * stack with the popExpect() method. - * - * Note that this method can not be called statically - * - * @param mixed $code a single error code or an array of error codes to expect - * - * @return int the new depth of the "expected errors" stack - * @access public - */ - function expectError($code = '*') - { - if (is_array($code)) { - array_push($this->_expected_errors, $code); - } else { - array_push($this->_expected_errors, array($code)); - } - return sizeof($this->_expected_errors); - } - - // }}} - // {{{ popExpect() - - /** - * This method pops one element off the expected error codes - * stack. - * - * @return array the list of error codes that were popped - */ - function popExpect() - { - return array_pop($this->_expected_errors); - } - - // }}} - // {{{ _checkDelExpect() - - /** - * This method checks unsets an error code if available - * - * @param mixed error code - * @return bool true if the error code was unset, false otherwise - * @access private - * @since PHP 4.3.0 - */ - function _checkDelExpect($error_code) - { - $deleted = false; - - foreach ($this->_expected_errors AS $key => $error_array) { - if (in_array($error_code, $error_array)) { - unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); - $deleted = true; - } - - // clean up empty arrays - if (0 == count($this->_expected_errors[$key])) { - unset($this->_expected_errors[$key]); - } - } - return $deleted; - } - - // }}} - // {{{ delExpect() - - /** - * This method deletes all occurences of the specified element from - * the expected error codes stack. - * - * @param mixed $error_code error code that should be deleted - * @return mixed list of error codes that were deleted or error - * @access public - * @since PHP 4.3.0 - */ - function delExpect($error_code) - { - $deleted = false; - - if ((is_array($error_code) && (0 != count($error_code)))) { - // $error_code is a non-empty array here; - // we walk through it trying to unset all - // values - foreach($error_code as $key => $error) { - if ($this->_checkDelExpect($error)) { - $deleted = true; - } else { - $deleted = false; - } - } - return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME - } elseif (!empty($error_code)) { - // $error_code comes alone, trying to unset it - if ($this->_checkDelExpect($error_code)) { - return true; - } else { - return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME - } - } else { - // $error_code is empty - return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME - } - } - - // }}} - // {{{ raiseError() - - /** - * This method is a wrapper that returns an instance of the - * configured error class with this object's default error - * handling applied. If the $mode and $options parameters are not - * specified, the object's defaults are used. - * - * @param mixed $message a text error message or a PEAR error object - * - * @param int $code a numeric error code (it is up to your class - * to define these if you want to use codes) - * - * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, - * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. - * - * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter - * specifies the PHP-internal error level (one of - * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). - * If $mode is PEAR_ERROR_CALLBACK, this - * parameter specifies the callback function or - * method. In other error modes this parameter - * is ignored. - * - * @param string $userinfo If you need to pass along for example debug - * information, this parameter is meant for that. - * - * @param string $error_class The returned error object will be - * instantiated from this class, if specified. - * - * @param bool $skipmsg If true, raiseError will only pass error codes, - * the error message parameter will be dropped. - * - * @access public - * @return object a PEAR error object - * @see PEAR::setErrorHandling - * @since PHP 4.0.5 - */ - function &raiseError($message = null, - $code = null, - $mode = null, - $options = null, - $userinfo = null, - $error_class = null, - $skipmsg = false) - { - // The error is yet a PEAR error object - if (is_object($message)) { - $code = $message->getCode(); - $userinfo = $message->getUserInfo(); - $error_class = $message->getType(); - $message->error_message_prefix = ''; - $message = $message->getMessage(); - } - - if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { - if ($exp[0] == "*" || - (is_int(reset($exp)) && in_array($code, $exp)) || - (is_string(reset($exp)) && in_array($message, $exp))) { - $mode = PEAR_ERROR_RETURN; - } - } - // No mode given, try global ones - if ($mode === null) { - // Class error handler - if (isset($this) && isset($this->_default_error_mode)) { - $mode = $this->_default_error_mode; - $options = $this->_default_error_options; - // Global error handler - } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { - $mode = $GLOBALS['_PEAR_default_error_mode']; - $options = $GLOBALS['_PEAR_default_error_options']; - } - } - - if ($error_class !== null) { - $ec = $error_class; - } elseif (isset($this) && isset($this->_error_class)) { - $ec = $this->_error_class; - } else { - $ec = 'PEAR_Error'; - } - if ($skipmsg) { - $a = new $ec($code, $mode, $options, $userinfo); - return $a; - } else { - $a = new $ec($message, $code, $mode, $options, $userinfo); - return $a; - } - } - - // }}} - // {{{ throwError() - - /** - * Simpler form of raiseError with fewer options. In most cases - * message, code and userinfo are enough. - * - * @param string $message - * - */ - function &throwError($message = null, - $code = null, - $userinfo = null) - { - if (isset($this) && is_a($this, 'PEAR')) { - $a = &$this->raiseError($message, $code, null, null, $userinfo); - return $a; - } else { - $a = &PEAR::raiseError($message, $code, null, null, $userinfo); - return $a; - } - } - - // }}} - function staticPushErrorHandling($mode, $options = null) - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - $def_mode = &$GLOBALS['_PEAR_default_error_mode']; - $def_options = &$GLOBALS['_PEAR_default_error_options']; - $stack[] = array($def_mode, $def_options); - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $def_mode = $mode; - $def_options = $options; - break; - - case PEAR_ERROR_CALLBACK: - $def_mode = $mode; - // class/object method callback - if (is_callable($options)) { - $def_options = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - $stack[] = array($mode, $options); - return true; - } - - function staticPopErrorHandling() - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - $setmode = &$GLOBALS['_PEAR_default_error_mode']; - $setoptions = &$GLOBALS['_PEAR_default_error_options']; - array_pop($stack); - list($mode, $options) = $stack[sizeof($stack) - 1]; - array_pop($stack); - switch ($mode) { - case PEAR_ERROR_EXCEPTION: - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - case null: - $setmode = $mode; - $setoptions = $options; - break; - - case PEAR_ERROR_CALLBACK: - $setmode = $mode; - // class/object method callback - if (is_callable($options)) { - $setoptions = $options; - } else { - trigger_error("invalid error callback", E_USER_WARNING); - } - break; - - default: - trigger_error("invalid error mode", E_USER_WARNING); - break; - } - return true; - } - - // {{{ pushErrorHandling() - - /** - * Push a new error handler on top of the error handler options stack. With this - * you can easily override the actual error handler for some code and restore - * it later with popErrorHandling. - * - * @param mixed $mode (same as setErrorHandling) - * @param mixed $options (same as setErrorHandling) - * - * @return bool Always true - * - * @see PEAR::setErrorHandling - */ - function pushErrorHandling($mode, $options = null) - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - if (isset($this) && is_a($this, 'PEAR')) { - $def_mode = &$this->_default_error_mode; - $def_options = &$this->_default_error_options; - } else { - $def_mode = &$GLOBALS['_PEAR_default_error_mode']; - $def_options = &$GLOBALS['_PEAR_default_error_options']; - } - $stack[] = array($def_mode, $def_options); - - if (isset($this) && is_a($this, 'PEAR')) { - $this->setErrorHandling($mode, $options); - } else { - PEAR::setErrorHandling($mode, $options); - } - $stack[] = array($mode, $options); - return true; - } - - // }}} - // {{{ popErrorHandling() - - /** - * Pop the last error handler used - * - * @return bool Always true - * - * @see PEAR::pushErrorHandling - */ - function popErrorHandling() - { - $stack = &$GLOBALS['_PEAR_error_handler_stack']; - array_pop($stack); - list($mode, $options) = $stack[sizeof($stack) - 1]; - array_pop($stack); - if (isset($this) && is_a($this, 'PEAR')) { - $this->setErrorHandling($mode, $options); - } else { - PEAR::setErrorHandling($mode, $options); - } - return true; - } - - // }}} - // {{{ loadExtension() - - /** - * OS independant PHP extension load. Remember to take care - * on the correct extension name for case sensitive OSes. - * - * @param string $ext The extension name - * @return bool Success or not on the dl() call - */ - function loadExtension($ext) - { - if (!extension_loaded($ext)) { - // if either returns true dl() will produce a FATAL error, stop that - if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { - return false; - } - if (OS_WINDOWS) { - $suffix = '.dll'; - } elseif (PHP_OS == 'HP-UX') { - $suffix = '.sl'; - } elseif (PHP_OS == 'AIX') { - $suffix = '.a'; - } elseif (PHP_OS == 'OSX') { - $suffix = '.bundle'; - } else { - $suffix = '.so'; - } - return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); - } - return true; - } - - // }}} -} - -// {{{ _PEAR_call_destructors() - -function _PEAR_call_destructors() -{ - global $_PEAR_destructor_object_list; - if (is_array($_PEAR_destructor_object_list) && - sizeof($_PEAR_destructor_object_list)) - { - reset($_PEAR_destructor_object_list); - if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) { - $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); - } - while (list($k, $objref) = each($_PEAR_destructor_object_list)) { - $classname = get_class($objref); - while ($classname) { - $destructor = "_$classname"; - if (method_exists($objref, $destructor)) { - $objref->$destructor(); - break; - } else { - $classname = get_parent_class($classname); - } - } - } - // Empty the object list to ensure that destructors are - // not called more than once. - $_PEAR_destructor_object_list = array(); - } - - // Now call the shutdown functions - if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { - foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { - call_user_func_array($value[0], $value[1]); - } - } -} - -// }}} -/** - * Standard PEAR error class for PHP 4 - * - * This class is supserseded by {@link PEAR_Exception} in PHP 5 - * - * @category pear - * @package PEAR - * @author Stig Bakken - * @author Tomas V.V. Cox - * @author Gregory Beaver - * @copyright 1997-2005 The PHP Group - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: 1.4.5 - * @link http://pear.php.net/manual/en/core.pear.pear-error.php - * @see PEAR::raiseError(), PEAR::throwError() - * @since Class available since PHP 4.0.2 - */ -class PEAR_Error -{ - // {{{ properties - - var $error_message_prefix = ''; - var $mode = PEAR_ERROR_RETURN; - var $level = E_USER_NOTICE; - var $code = -1; - var $message = ''; - var $userinfo = ''; - var $backtrace = null; - - // }}} - // {{{ constructor - - /** - * PEAR_Error constructor - * - * @param string $message message - * - * @param int $code (optional) error code - * - * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, - * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, - * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION - * - * @param mixed $options (optional) error level, _OR_ in the case of - * PEAR_ERROR_CALLBACK, the callback function or object/method - * tuple. - * - * @param string $userinfo (optional) additional user/debug info - * - * @access public - * - */ - function PEAR_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - if ($mode === null) { - $mode = PEAR_ERROR_RETURN; - } - $this->message = $message; - $this->code = $code; - $this->mode = $mode; - $this->userinfo = $userinfo; - if (function_exists("debug_backtrace")) { - if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { - $this->backtrace = debug_backtrace(); - } - } - if ($mode & PEAR_ERROR_CALLBACK) { - $this->level = E_USER_NOTICE; - $this->callback = $options; - } else { - if ($options === null) { - $options = E_USER_NOTICE; - } - $this->level = $options; - $this->callback = null; - } - if ($this->mode & PEAR_ERROR_PRINT) { - if (is_null($options) || is_int($options)) { - $format = "%s"; - } else { - $format = $options; - } - printf($format, $this->getMessage()); - } - if ($this->mode & PEAR_ERROR_TRIGGER) { - trigger_error($this->getMessage(), $this->level); - } - if ($this->mode & PEAR_ERROR_DIE) { - $msg = $this->getMessage(); - if (is_null($options) || is_int($options)) { - $format = "%s"; - if (substr($msg, -1) != "\n") { - $msg .= "\n"; - } - } else { - $format = $options; - } - die(sprintf($format, $msg)); - } - if ($this->mode & PEAR_ERROR_CALLBACK) { - if (is_callable($this->callback)) { - call_user_func($this->callback, $this); - } - } - if ($this->mode & PEAR_ERROR_EXCEPTION) { - trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); - eval('$e = new Exception($this->message, $this->code);throw($e);'); - } - } - - // }}} - // {{{ getMode() - - /** - * Get the error mode from an error object. - * - * @return int error mode - * @access public - */ - function getMode() { - return $this->mode; - } - - // }}} - // {{{ getCallback() - - /** - * Get the callback function/method from an error object. - * - * @return mixed callback function or object/method array - * @access public - */ - function getCallback() { - return $this->callback; - } - - // }}} - // {{{ getMessage() - - - /** - * Get the error message from an error object. - * - * @return string full error message - * @access public - */ - function getMessage() - { - return ($this->error_message_prefix . $this->message); - } - - - // }}} - // {{{ getCode() - - /** - * Get error code from an error object - * - * @return int error code - * @access public - */ - function getCode() - { - return $this->code; - } - - // }}} - // {{{ getType() - - /** - * Get the name of this error/exception. - * - * @return string error/exception name (type) - * @access public - */ - function getType() - { - return get_class($this); - } - - // }}} - // {{{ getUserInfo() - - /** - * Get additional user-supplied information. - * - * @return string user-supplied information - * @access public - */ - function getUserInfo() - { - return $this->userinfo; - } - - // }}} - // {{{ getDebugInfo() - - /** - * Get additional debug information supplied by the application. - * - * @return string debug information - * @access public - */ - function getDebugInfo() - { - return $this->getUserInfo(); - } - - // }}} - // {{{ getBacktrace() - - /** - * Get the call backtrace from where the error was generated. - * Supported with PHP 4.3.0 or newer. - * - * @param int $frame (optional) what frame to fetch - * @return array Backtrace, or NULL if not available. - * @access public - */ - function getBacktrace($frame = null) - { - if (defined('PEAR_IGNORE_BACKTRACE')) { - return null; - } - if ($frame === null) { - return $this->backtrace; - } - return $this->backtrace[$frame]; - } - - // }}} - // {{{ addUserInfo() - - function addUserInfo($info) - { - if (empty($this->userinfo)) { - $this->userinfo = $info; - } else { - $this->userinfo .= " ** $info"; - } - } - - // }}} - // {{{ toString() - - /** - * Make a string representation of this object. - * - * @return string a string with an object summary - * @access public - */ - function toString() { - $modes = array(); - $levels = array(E_USER_NOTICE => 'notice', - E_USER_WARNING => 'warning', - E_USER_ERROR => 'error'); - if ($this->mode & PEAR_ERROR_CALLBACK) { - if (is_array($this->callback)) { - $callback = (is_object($this->callback[0]) ? - strtolower(get_class($this->callback[0])) : - $this->callback[0]) . '::' . - $this->callback[1]; - } else { - $callback = $this->callback; - } - return sprintf('[%s: message="%s" code=%d mode=callback '. - 'callback=%s prefix="%s" info="%s"]', - strtolower(get_class($this)), $this->message, $this->code, - $callback, $this->error_message_prefix, - $this->userinfo); - } - if ($this->mode & PEAR_ERROR_PRINT) { - $modes[] = 'print'; - } - if ($this->mode & PEAR_ERROR_TRIGGER) { - $modes[] = 'trigger'; - } - if ($this->mode & PEAR_ERROR_DIE) { - $modes[] = 'die'; - } - if ($this->mode & PEAR_ERROR_RETURN) { - $modes[] = 'return'; - } - return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. - 'prefix="%s" info="%s"]', - strtolower(get_class($this)), $this->message, $this->code, - implode("|", $modes), $levels[$this->level], - $this->error_message_prefix, - $this->userinfo); - } - - // }}} -} - -/* - * Local Variables: - * mode: php - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ -?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer.php deleted file mode 100644 index 7f6ef067..00000000 --- a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * PERL Spreadsheet::WriteExcel module. - * - * The author of the Spreadsheet::WriteExcel module is John McNamara - * - * - * I _DO_ maintain this code, and John McNamara has nothing to do with the - * porting of this code to PHP. Any questions directly related to this - * class library should be directed to me. - * - * License Information: - * - * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets - * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -@require_once $homedir.'/classes/pear/PEAR.php'; -@require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Workbook.php'; - -/** - * Class for writing Excel Spreadsheets. This class should change COMPLETELY. - * - * @author Xavier Noguer - * @category FileFormats - * @package Spreadsheet_Excel_Writer - */ - -class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook -{ - /** - * The constructor. It just creates a Workbook - * - * @param string $filename The optional filename for the Workbook. - * @return Spreadsheet_Excel_Writer_Workbook The Workbook created - */ - function Spreadsheet_Excel_Writer($filename = '') - { - $this->_filename = $filename; - $this->Spreadsheet_Excel_Writer_Workbook($filename); - } - - /** - * Send HTTP headers for the Excel file. - * - * @param string $filename The filename to use for HTTP headers - * @access public - */ - function send($filename) - { - header("Content-type: application/vnd.ms-excel"); - header("Content-Disposition: attachment; filename=\"$filename\""); - header("Expires: 0"); - header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); - header("Pragma: public"); - } - - /** - * Utility function for writing formulas - * Converts a cell's coordinates to the A1 format. - * - * @access public - * @static - * @param integer $row Row for the cell to convert (0-indexed). - * @param integer $col Column for the cell to convert (0-indexed). - * @return string The cell identifier in A1 format - */ - function rowcolToCell($row, $col) - { - if ($col > 255) { //maximum column value exceeded - return new PEAR_Error("Maximum column value exceeded: $col"); - } - - $int = (int)($col / 26); - $frac = $col % 26; - $chr1 = ''; - - if ($int > 0) { - $chr1 = chr(ord('A') + $int - 1); - } - - $chr2 = chr(ord('A') + $frac); - $row++; - - return $chr1 . $chr2 . $row; - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php deleted file mode 100644 index 2ebe7a27..00000000 --- a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php +++ /dev/null @@ -1,240 +0,0 @@ - - * - * The majority of this is _NOT_ my code. I simply ported it from the - * PERL Spreadsheet::WriteExcel module. - * - * The author of the Spreadsheet::WriteExcel module is John McNamara - * - * - * I _DO_ maintain this code, and John McNamara has nothing to do with the - * porting of this code to PHP. Any questions directly related to this - * class library should be directed to me. - * - * License Information: - * - * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets - * Copyright (c) 2002-2003 Xavier Noguer xnoguer@php.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); -require_once $homedir.'/classes/pear/PEAR.php'; - -/** - * Class for writing Excel BIFF records. - * - * From "MICROSOFT EXCEL BINARY FILE FORMAT" by Mark O'Brien (Microsoft Corporation): - * - * BIFF (BInary File Format) is the file format in which Excel documents are - * saved on disk. A BIFF file is a complete description of an Excel document. - * BIFF files consist of sequences of variable-length records. There are many - * different types of BIFF records. For example, one record type describes a - * formula entered into a cell; one describes the size and location of a - * window into a document; another describes a picture format. - * - * @author Xavier Noguer - * @category FileFormats - * @package Spreadsheet_Excel_Writer - */ - -class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR -{ - /** - * The BIFF/Excel version (5). - * @var integer - */ - var $_BIFF_version = 0x0500; - - /** - * The byte order of this architecture. 0 => little endian, 1 => big endian - * @var integer - */ - var $_byte_order; - - /** - * The string containing the data of the BIFF stream - * @var string - */ - var $_data; - - /** - * The size of the data in bytes. Should be the same as strlen($this->_data) - * @var integer - */ - var $_datasize; - - /** - * The maximun length for a BIFF record. See _addContinue() - * @var integer - * @see _addContinue() - */ - var $_limit; - - /** - * Constructor - * - * @access public - */ - function Spreadsheet_Excel_Writer_BIFFwriter() - { - $this->_byte_order = ''; - $this->_data = ''; - $this->_datasize = 0; - $this->_limit = 2080; - // Set the byte order - $this->_setByteOrder(); - } - - /** - * Determine the byte order and store it as class data to avoid - * recalculating it for each call to new(). - * - * @access private - */ - function _setByteOrder() - { - // Check if "pack" gives the required IEEE 64bit float - $teststr = pack("d", 1.2345); - $number = pack("C8", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); - if ($number == $teststr) { - $byte_order = 0; // Little Endian - } elseif ($number == strrev($teststr)){ - $byte_order = 1; // Big Endian - } else { - // Give up. I'll fix this in a later version. - return $this->raiseError("Required floating point format ". - "not supported on this platform."); - } - $this->_byte_order = $byte_order; - } - - /** - * General storage function - * - * @param string $data binary data to prepend - * @access private - */ - function _prepend($data) - { - if (strlen($data) > $this->_limit) { - $data = $this->_addContinue($data); - } - $this->_data = $data.$this->_data; - $this->_datasize += strlen($data); - } - - /** - * General storage function - * - * @param string $data binary data to append - * @access private - */ - function _append($data) - { - if (strlen($data) > $this->_limit) { - $data = $this->_addContinue($data); - } - $this->_data = $this->_data.$data; - $this->_datasize += strlen($data); - } - - /** - * Writes Excel BOF record to indicate the beginning of a stream or - * sub-stream in the BIFF file. - * - * @param integer $type Type of BIFF file to write: 0x0005 Workbook, - * 0x0010 Worksheet. - * @access private - */ - function _storeBof($type) - { - $record = 0x0809; // Record identifier - - // According to the SDK $build and $year should be set to zero. - // However, this throws a warning in Excel 5. So, use magic numbers. - if ($this->_BIFF_version == 0x0500) { - $length = 0x0008; - $unknown = ''; - $build = 0x096C; - $year = 0x07C9; - } elseif ($this->_BIFF_version == 0x0600) { - $length = 0x0010; - $unknown = pack("VV", 0x00000041, 0x00000006); //unknown last 8 bytes for BIFF8 - $build = 0x0DBB; - $year = 0x07CC; - } - $version = $this->_BIFF_version; - - $header = pack("vv", $record, $length); - $data = pack("vvvv", $version, $type, $build, $year); - $this->_prepend($header . $data . $unknown); - } - - /** - * Writes Excel EOF record to indicate the end of a BIFF stream. - * - * @access private - */ - function _storeEof() - { - $record = 0x000A; // Record identifier - $length = 0x0000; // Number of bytes to follow - $header = pack("vv", $record, $length); - $this->_append($header); - } - - /** - * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In - * Excel 97 the limit is 8228 bytes. Records that are longer than these limits - * must be split up into CONTINUE blocks. - * - * This function takes a long BIFF record and inserts CONTINUE records as - * necessary. - * - * @param string $data The original binary data to be written - * @return string A very convenient string of continue blocks - * @access private - */ - function _addContinue($data) - { - $limit = $this->_limit; - $record = 0x003C; // Record identifier - - // The first 2080/8224 bytes remain intact. However, we have to change - // the length field of the record. - $tmp = substr($data, 0, 2).pack("v", $limit-4).substr($data, 4, $limit - 4); - - $header = pack("vv", $record, $limit); // Headers for continue records - - // Retrieve chunks of 2080/8224 bytes +4 for the header. - $data_length = strlen($data); - for ($i = $limit; $i < ($data_length - $limit); $i += $limit) { - $tmp .= $header; - $tmp .= substr($data, $i, $limit); - } - - // Retrieve the last chunk of data - $header = pack("vv", $record, strlen($data) - $i); - $tmp .= $header; - $tmp .= substr($data, $i, strlen($data) - $i); - - return $tmp; - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Format.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Format.php deleted file mode 100644 index 0ce3dcbf..00000000 --- a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Format.php +++ /dev/null @@ -1,1105 +0,0 @@ - - * - * The majority of this is _NOT_ my code. I simply ported it from the - * PERL Spreadsheet::WriteExcel module. - * - * The author of the Spreadsheet::WriteExcel module is John McNamara - * - * - * I _DO_ maintain this code, and John McNamara has nothing to do with the - * porting of this code to PHP. Any questions directly related to this - * class library should be directed to me. - * - * License Information: - * - * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets - * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); - -require_once $homedir.'/classes/pear/PEAR.php'; - -/** - * Class for generating Excel XF records (formats) - * - * @author Xavier Noguer - * @category FileFormats - * @package Spreadsheet_Excel_Writer - */ - -class Spreadsheet_Excel_Writer_Format extends PEAR -{ - /** - * The index given by the workbook when creating a new format. - * @var integer - */ - var $_xf_index; - - /** - * Index to the FONT record. - * @var integer - */ - var $font_index; - - /** - * The font name (ASCII). - * @var string - */ - var $_font_name; - - /** - * Height of font (1/20 of a point) - * @var integer - */ - var $_size; - - /** - * Bold style - * @var integer - */ - var $_bold; - - /** - * Bit specifiying if the font is italic. - * @var integer - */ - var $_italic; - - /** - * Index to the cell's color - * @var integer - */ - var $_color; - - /** - * The text underline property - * @var integer - */ - var $_underline; - - /** - * Bit specifiying if the font has strikeout. - * @var integer - */ - var $_font_strikeout; - - /** - * Bit specifiying if the font has outline. - * @var integer - */ - var $_font_outline; - - /** - * Bit specifiying if the font has shadow. - * @var integer - */ - var $_font_shadow; - - /** - * 2 bytes specifiying the script type for the font. - * @var integer - */ - var $_font_script; - - /** - * Byte specifiying the font family. - * @var integer - */ - var $_font_family; - - /** - * Byte specifiying the font charset. - * @var integer - */ - var $_font_charset; - - /** - * An index (2 bytes) to a FORMAT record (number format). - * @var integer - */ - var $_num_format; - - /** - * Bit specifying if formulas are hidden. - * @var integer - */ - var $_hidden; - - /** - * Bit specifying if the cell is locked. - * @var integer - */ - var $_locked; - - /** - * The three bits specifying the text horizontal alignment. - * @var integer - */ - var $_text_h_align; - - /** - * Bit specifying if the text is wrapped at the right border. - * @var integer - */ - var $_text_wrap; - - /** - * The three bits specifying the text vertical alignment. - * @var integer - */ - var $_text_v_align; - - /** - * 1 bit, apparently not used. - * @var integer - */ - var $_text_justlast; - - /** - * The two bits specifying the text rotation. - * @var integer - */ - var $_rotation; - - /** - * The cell's foreground color. - * @var integer - */ - var $_fg_color; - - /** - * The cell's background color. - * @var integer - */ - var $_bg_color; - - /** - * The cell's background fill pattern. - * @var integer - */ - var $_pattern; - - /** - * Style of the bottom border of the cell - * @var integer - */ - var $_bottom; - - /** - * Color of the bottom border of the cell. - * @var integer - */ - var $_bottom_color; - - /** - * Style of the top border of the cell - * @var integer - */ - var $_top; - - /** - * Color of the top border of the cell. - * @var integer - */ - var $_top_color; - - /** - * Style of the left border of the cell - * @var integer - */ - var $_left; - - /** - * Color of the left border of the cell. - * @var integer - */ - var $_left_color; - - /** - * Style of the right border of the cell - * @var integer - */ - var $_right; - - /** - * Color of the right border of the cell. - * @var integer - */ - var $_right_color; - - /** - * Constructor - * - * @access private - * @param integer $index the XF index for the format. - * @param array $properties array with properties to be set on initialization. - */ - function Spreadsheet_Excel_Writer_Format($BIFF_version, $index = 0, $properties = array()) - { - $this->_xf_index = $index; - $this->_BIFF_version = $BIFF_version; - $this->font_index = 0; - $this->_font_name = 'Arial'; - $this->_size = 10; - $this->_bold = 0x0190; - $this->_italic = 0; - $this->_color = 0x7FFF; - $this->_underline = 0; - $this->_font_strikeout = 0; - $this->_font_outline = 0; - $this->_font_shadow = 0; - $this->_font_script = 0; - $this->_font_family = 0; - $this->_font_charset = 0; - - $this->_num_format = 0; - - $this->_hidden = 0; - $this->_locked = 0; - - $this->_text_h_align = 0; - $this->_text_wrap = 0; - $this->_text_v_align = 2; - $this->_text_justlast = 0; - $this->_rotation = 0; - - $this->_fg_color = 0x40; - $this->_bg_color = 0x41; - - $this->_pattern = 0; - - $this->_bottom = 0; - $this->_top = 0; - $this->_left = 0; - $this->_right = 0; - $this->_diag = 0; - - $this->_bottom_color = 0x40; - $this->_top_color = 0x40; - $this->_left_color = 0x40; - $this->_right_color = 0x40; - $this->_diag_color = 0x40; - - // Set properties passed to Spreadsheet_Excel_Writer_Workbook::addFormat() - foreach ($properties as $property => $value) - { - if (method_exists($this, 'set'.ucwords($property))) { - $method_name = 'set'.ucwords($property); - $this->$method_name($value); - } - } - } - - - /** - * Generate an Excel BIFF XF record (style or cell). - * - * @param string $style The type of the XF record ('style' or 'cell'). - * @return string The XF record - */ - function getXf($style) - { - // Set the type of the XF record and some of the attributes. - if ($style == 'style') { - $style = 0xFFF5; - } else { - $style = $this->_locked; - $style |= $this->_hidden << 1; - } - - // Flags to indicate if attributes have been set. - $atr_num = ($this->_num_format != 0)?1:0; - $atr_fnt = ($this->font_index != 0)?1:0; - $atr_alc = ($this->_text_wrap)?1:0; - $atr_bdr = ($this->_bottom || - $this->_top || - $this->_left || - $this->_right)?1:0; - $atr_pat = (($this->_fg_color != 0x40) || - ($this->_bg_color != 0x41) || - $this->_pattern)?1:0; - $atr_prot = $this->_locked | $this->_hidden; - - // Zero the default border colour if the border has not been set. - if ($this->_bottom == 0) { - $this->_bottom_color = 0; - } - if ($this->_top == 0) { - $this->_top_color = 0; - } - if ($this->_right == 0) { - $this->_right_color = 0; - } - if ($this->_left == 0) { - $this->_left_color = 0; - } - if ($this->_diag == 0) { - $this->_diag_color = 0; - } - - $record = 0x00E0; // Record identifier - if ($this->_BIFF_version == 0x0500) { - $length = 0x0010; // Number of bytes to follow - } - if ($this->_BIFF_version == 0x0600) { - $length = 0x0014; - } - - $ifnt = $this->font_index; // Index to FONT record - $ifmt = $this->_num_format; // Index to FORMAT record - if ($this->_BIFF_version == 0x0500) { - $align = $this->_text_h_align; // Alignment - $align |= $this->_text_wrap << 3; - $align |= $this->_text_v_align << 4; - $align |= $this->_text_justlast << 7; - $align |= $this->_rotation << 8; - $align |= $atr_num << 10; - $align |= $atr_fnt << 11; - $align |= $atr_alc << 12; - $align |= $atr_bdr << 13; - $align |= $atr_pat << 14; - $align |= $atr_prot << 15; - - $icv = $this->_fg_color; // fg and bg pattern colors - $icv |= $this->_bg_color << 7; - - $fill = $this->_pattern; // Fill and border line style - $fill |= $this->_bottom << 6; - $fill |= $this->_bottom_color << 9; - - $border1 = $this->_top; // Border line style and color - $border1 |= $this->_left << 3; - $border1 |= $this->_right << 6; - $border1 |= $this->_top_color << 9; - - $border2 = $this->_left_color; // Border color - $border2 |= $this->_right_color << 7; - - $header = pack("vv", $record, $length); - $data = pack("vvvvvvvv", $ifnt, $ifmt, $style, $align, - $icv, $fill, - $border1, $border2); - } elseif ($this->_BIFF_version == 0x0600) { - $align = $this->_text_h_align; // Alignment - $align |= $this->_text_wrap << 3; - $align |= $this->_text_v_align << 4; - $align |= $this->_text_justlast << 7; - - $used_attrib = $atr_num << 2; - $used_attrib |= $atr_fnt << 3; - $used_attrib |= $atr_alc << 4; - $used_attrib |= $atr_bdr << 5; - $used_attrib |= $atr_pat << 6; - $used_attrib |= $atr_prot << 7; - - $icv = $this->_fg_color; // fg and bg pattern colors - $icv |= $this->_bg_color << 7; - - $border1 = $this->_left; // Border line style and color - $border1 |= $this->_right << 4; - $border1 |= $this->_top << 8; - $border1 |= $this->_bottom << 12; - $border1 |= $this->_left_color << 16; - $border1 |= $this->_right_color << 23; - $diag_tl_to_rb = 0; // FIXME: add method - $diag_tr_to_lb = 0; // FIXME: add method - $border1 |= $diag_tl_to_rb << 30; - $border1 |= $diag_tr_to_lb << 31; - - $border2 = $this->_top_color; // Border color - $border2 |= $this->_bottom_color << 7; - $border2 |= $this->_diag_color << 14; - $border2 |= $this->_diag << 21; - $border2 |= $this->_pattern << 26; - - $header = pack("vv", $record, $length); - - $rotation = 0x00; - $biff8_options = 0x00; - $data = pack("vvvC", $ifnt, $ifmt, $style, $align); - $data .= pack("CCC", $rotation, $biff8_options, $used_attrib); - $data .= pack("VVv", $border1, $border2, $icv); - } - - return($header . $data); - } - - /** - * Generate an Excel BIFF FONT record. - * - * @return string The FONT record - */ - function getFont() - { - $dyHeight = $this->_size * 20; // Height of font (1/20 of a point) - $icv = $this->_color; // Index to color palette - $bls = $this->_bold; // Bold style - $sss = $this->_font_script; // Superscript/subscript - $uls = $this->_underline; // Underline - $bFamily = $this->_font_family; // Font family - $bCharSet = $this->_font_charset; // Character set - $encoding = 0; // TODO: Unicode support - - $cch = strlen($this->_font_name); // Length of font name - $record = 0x31; // Record identifier - if ($this->_BIFF_version == 0x0500) { - $length = 0x0F + $cch; // Record length - } elseif ($this->_BIFF_version == 0x0600) { - $length = 0x10 + $cch; - } - $reserved = 0x00; // Reserved - $grbit = 0x00; // Font attributes - if ($this->_italic) { - $grbit |= 0x02; - } - if ($this->_font_strikeout) { - $grbit |= 0x08; - } - if ($this->_font_outline) { - $grbit |= 0x10; - } - if ($this->_font_shadow) { - $grbit |= 0x20; - } - - $header = pack("vv", $record, $length); - if ($this->_BIFF_version == 0x0500) { - $data = pack("vvvvvCCCCC", $dyHeight, $grbit, $icv, $bls, - $sss, $uls, $bFamily, - $bCharSet, $reserved, $cch); - } elseif ($this->_BIFF_version == 0x0600) { - $data = pack("vvvvvCCCCCC", $dyHeight, $grbit, $icv, $bls, - $sss, $uls, $bFamily, - $bCharSet, $reserved, $cch, $encoding); - } - return($header . $data . $this->_font_name); - } - - /** - * Returns a unique hash key for a font. - * Used by Spreadsheet_Excel_Writer_Workbook::_storeAllFonts() - * - * The elements that form the key are arranged to increase the probability of - * generating a unique key. Elements that hold a large range of numbers - * (eg. _color) are placed between two binary elements such as _italic - * - * @return string A key for this font - */ - function getFontKey() - { - $key = "$this->_font_name$this->_size"; - $key .= "$this->_font_script$this->_underline"; - $key .= "$this->_font_strikeout$this->_bold$this->_font_outline"; - $key .= "$this->_font_family$this->_font_charset"; - $key .= "$this->_font_shadow$this->_color$this->_italic"; - $key = str_replace(' ', '_', $key); - return ($key); - } - - /** - * Returns the index used by Spreadsheet_Excel_Writer_Worksheet::_XF() - * - * @return integer The index for the XF record - */ - function getXfIndex() - { - return($this->_xf_index); - } - - /** - * Used in conjunction with the set_xxx_color methods to convert a color - * string into a number. Color range is 0..63 but we will restrict it - * to 8..63 to comply with Gnumeric. Colors 0..7 are repeated in 8..15. - * - * @access private - * @param string $name_color name of the color (i.e.: 'blue', 'red', etc..). Optional. - * @return integer The color index - */ - function _getColor($name_color = '') - { - $colors = array( - 'aqua' => 0x0F, - 'cyan' => 0x0F, - 'black' => 0x08, - 'blue' => 0x0C, - 'brown' => 0x10, - 'magenta' => 0x0E, - 'fuchsia' => 0x0E, - 'gray' => 0x17, - 'grey' => 0x17, - 'green' => 0x11, - 'lime' => 0x0B, - 'navy' => 0x12, - 'orange' => 0x35, - 'purple' => 0x14, - 'red' => 0x0A, - 'silver' => 0x16, - 'white' => 0x09, - 'yellow' => 0x0D - ); - - // Return the default color, 0x7FFF, if undef, - if ($name_color == '') { - return(0x7FFF); - } - - // or the color string converted to an integer, - if (isset($colors[$name_color])) { - return($colors[$name_color]); - } - - // or the default color if string is unrecognised, - if (preg_match("/\D/",$name_color)) { - return(0x7FFF); - } - - // or an index < 8 mapped into the correct range, - if ($name_color < 8) { - return($name_color + 8); - } - - // or the default color if arg is outside range, - if ($name_color > 63) { - return(0x7FFF); - } - - // or an integer in the valid range - return($name_color); - } - - /** - * Set cell alignment. - * - * @access public - * @param string $location alignment for the cell ('left', 'right', etc...). - */ - function setAlign($location) - { - if (preg_match("/\d/",$location)) { - return; // Ignore numbers - } - - $location = strtolower($location); - - if ($location == 'left') { - $this->_text_h_align = 1; - } - if ($location == 'centre') { - $this->_text_h_align = 2; - } - if ($location == 'center') { - $this->_text_h_align = 2; - } - if ($location == 'right') { - $this->_text_h_align = 3; - } - if ($location == 'fill') { - $this->_text_h_align = 4; - } - if ($location == 'justify') { - $this->_text_h_align = 5; - } - if ($location == 'merge') { - $this->_text_h_align = 6; - } - if ($location == 'equal_space') { // For T.K. - $this->_text_h_align = 7; - } - if ($location == 'top') { - $this->_text_v_align = 0; - } - if ($location == 'vcentre') { - $this->_text_v_align = 1; - } - if ($location == 'vcenter') { - $this->_text_v_align = 1; - } - if ($location == 'bottom') { - $this->_text_v_align = 2; - } - if ($location == 'vjustify') { - $this->_text_v_align = 3; - } - if ($location == 'vequal_space') { // For T.K. - $this->_text_v_align = 4; - } - } - - /** - * Set cell horizontal alignment. - * - * @access public - * @param string $location alignment for the cell ('left', 'right', etc...). - */ - function setHAlign($location) - { - if (preg_match("/\d/",$location)) { - return; // Ignore numbers - } - - $location = strtolower($location); - - if ($location == 'left') { - $this->_text_h_align = 1; - } - if ($location == 'centre') { - $this->_text_h_align = 2; - } - if ($location == 'center') { - $this->_text_h_align = 2; - } - if ($location == 'right') { - $this->_text_h_align = 3; - } - if ($location == 'fill') { - $this->_text_h_align = 4; - } - if ($location == 'justify') { - $this->_text_h_align = 5; - } - if ($location == 'merge') { - $this->_text_h_align = 6; - } - if ($location == 'equal_space') { // For T.K. - $this->_text_h_align = 7; - } - } - - /** - * Set cell vertical alignment. - * - * @access public - * @param string $location alignment for the cell ('top', 'vleft', 'vright', etc...). - */ - function setVAlign($location) - { - if (preg_match("/\d/",$location)) { - return; // Ignore numbers - } - - $location = strtolower($location); - - if ($location == 'top') { - $this->_text_v_align = 0; - } - if ($location == 'vcentre') { - $this->_text_v_align = 1; - } - if ($location == 'vcenter') { - $this->_text_v_align = 1; - } - if ($location == 'bottom') { - $this->_text_v_align = 2; - } - if ($location == 'vjustify') { - $this->_text_v_align = 3; - } - if ($location == 'vequal_space') { // For T.K. - $this->_text_v_align = 4; - } - } - - /** - * This is an alias for the unintuitive setAlign('merge') - * - * @access public - */ - function setMerge() - { - $this->setAlign('merge'); - } - - /** - * Sets the boldness of the text. - * Bold has a range 100..1000. - * 0 (400) is normal. 1 (700) is bold. - * - * @access public - * @param integer $weight Weight for the text, 0 maps to 400 (normal text), - 1 maps to 700 (bold text). Valid range is: 100-1000. - It's Optional, default is 1 (bold). - */ - function setBold($weight = 1) - { - if ($weight == 1) { - $weight = 0x2BC; // Bold text - } - if ($weight == 0) { - $weight = 0x190; // Normal text - } - if ($weight < 0x064) { - $weight = 0x190; // Lower bound - } - if ($weight > 0x3E8) { - $weight = 0x190; // Upper bound - } - $this->_bold = $weight; - } - - - /************************************ - * FUNCTIONS FOR SETTING CELLS BORDERS - */ - - /** - * Sets the width for the bottom border of the cell - * - * @access public - * @param integer $style style of the cell border. 1 => thin, 2 => thick. - */ - function setBottom($style) - { - $this->_bottom = $style; - } - - /** - * Sets the width for the top border of the cell - * - * @access public - * @param integer $style style of the cell top border. 1 => thin, 2 => thick. - */ - function setTop($style) - { - $this->_top = $style; - } - - /** - * Sets the width for the left border of the cell - * - * @access public - * @param integer $style style of the cell left border. 1 => thin, 2 => thick. - */ - function setLeft($style) - { - $this->_left = $style; - } - - /** - * Sets the width for the right border of the cell - * - * @access public - * @param integer $style style of the cell right border. 1 => thin, 2 => thick. - */ - function setRight($style) - { - $this->_right = $style; - } - - - /** - * Set cells borders to the same style - * - * @access public - * @param integer $style style to apply for all cell borders. 1 => thin, 2 => thick. - */ - function setBorder($style) - { - $this->setBottom($style); - $this->setTop($style); - $this->setLeft($style); - $this->setRight($style); - } - - - /******************************************* - * FUNCTIONS FOR SETTING CELLS BORDERS COLORS - */ - - /** - * Sets all the cell's borders to the same color - * - * @access public - * @param mixed $color The color we are setting. Either a string (like 'blue'), - * or an integer (range is [8...63]). - */ - function setBorderColor($color) - { - $this->setBottomColor($color); - $this->setTopColor($color); - $this->setLeftColor($color); - $this->setRightColor($color); - } - - /** - * Sets the cell's bottom border color - * - * @access public - * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). - */ - function setBottomColor($color) - { - $value = $this->_getColor($color); - $this->_bottom_color = $value; - } - - /** - * Sets the cell's top border color - * - * @access public - * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). - */ - function setTopColor($color) - { - $value = $this->_getColor($color); - $this->_top_color = $value; - } - - /** - * Sets the cell's left border color - * - * @access public - * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). - */ - function setLeftColor($color) - { - $value = $this->_getColor($color); - $this->_left_color = $value; - } - - /** - * Sets the cell's right border color - * - * @access public - * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). - */ - function setRightColor($color) - { - $value = $this->_getColor($color); - $this->_right_color = $value; - } - - - /** - * Sets the cell's foreground color - * - * @access public - * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). - */ - function setFgColor($color) - { - $value = $this->_getColor($color); - $this->_fg_color = $value; - if ($this->_pattern == 0) { // force color to be seen - $this->_pattern = 1; - } - } - - /** - * Sets the cell's background color - * - * @access public - * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). - */ - function setBgColor($color) - { - $value = $this->_getColor($color); - $this->_bg_color = $value; - if ($this->_pattern == 0) { // force color to be seen - $this->_pattern = 1; - } - } - - /** - * Sets the cell's color - * - * @access public - * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). - */ - function setColor($color) - { - $value = $this->_getColor($color); - $this->_color = $value; - } - - /** - * Sets the fill pattern attribute of a cell - * - * @access public - * @param integer $arg Optional. Defaults to 1. Meaningful values are: 0-18, - * 0 meaning no background. - */ - function setPattern($arg = 1) - { - $this->_pattern = $arg; - } - - /** - * Sets the underline of the text - * - * @access public - * @param integer $underline The value for underline. Possible values are: - * 1 => underline, 2 => double underline. - */ - function setUnderline($underline) - { - $this->_underline = $underline; - } - - /** - * Sets the font style as italic - * - * @access public - */ - function setItalic() - { - $this->_italic = 1; - } - - /** - * Sets the font size - * - * @access public - * @param integer $size The font size (in pixels I think). - */ - function setSize($size) - { - $this->_size = $size; - } - - /** - * Sets text wrapping - * - * @access public - */ - function setTextWrap() - { - $this->_text_wrap = 1; - } - - /** - * Sets the orientation of the text - * - * @access public - * @param integer $angle The rotation angle for the text (clockwise). Possible - values are: 0, 90, 270 and -1 for stacking top-to-bottom. - */ - function setTextRotation($angle) - { - switch ($angle) - { - case 0: - $this->_rotation = 0; - break; - case 90: - $this->_rotation = 3; - break; - case 270: - $this->_rotation = 2; - break; - case -1: - $this->_rotation = 1; - break; - default : - return $this->raiseError("Invalid value for angle.". - " Possible values are: 0, 90, 270 and -1 ". - "for stacking top-to-bottom."); - $this->_rotation = 0; - break; - } - } - - /** - * Sets the numeric format. - * It can be date, time, currency, etc... - * - * @access public - * @param integer $num_format The numeric format. - */ - function setNumFormat($num_format) - { - $this->_num_format = $num_format; - } - - /** - * Sets font as strikeout. - * - * @access public - */ - function setStrikeOut() - { - $this->_font_strikeout = 1; - } - - /** - * Sets outlining for a font. - * - * @access public - */ - function setOutLine() - { - $this->_font_outline = 1; - } - - /** - * Sets font as shadow. - * - * @access public - */ - function setShadow() - { - $this->_font_shadow = 1; - } - - /** - * Sets the script type of the text - * - * @access public - * @param integer $script The value for script type. Possible values are: - * 1 => superscript, 2 => subscript. - */ - function setScript($script) - { - $this->_font_script = $script; - } - - /** - * Locks a cell. - * - * @access public - */ - function setLocked() - { - $this->_locked = 1; - } - - /** - * Unlocks a cell. Useful for unprotecting particular cells of a protected sheet. - * - * @access public - */ - function setUnLocked() - { - $this->_locked = 0; - } - - /** - * Sets the font family name. - * - * @access public - * @param string $fontfamily The font family name. Possible values are: - * 'Times New Roman', 'Arial', 'Courier'. - */ - function setFontFamily($font_family) - { - $this->_font_name = $font_family; - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Parser.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Parser.php deleted file mode 100644 index 1876be42..00000000 --- a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Parser.php +++ /dev/null @@ -1,1691 +0,0 @@ -" - */ -define('SPREADSHEET_EXCEL_WRITER_GT', ">"); - -/** - * @const SPREADSHEET_EXCEL_WRITER_LT token identifier for character "<" - */ -define('SPREADSHEET_EXCEL_WRITER_LT', "<"); - -/** - * @const SPREADSHEET_EXCEL_WRITER_LE token identifier for character "<=" - */ -define('SPREADSHEET_EXCEL_WRITER_LE', "<="); - -/** - * @const SPREADSHEET_EXCEL_WRITER_GE token identifier for character ">=" - */ -define('SPREADSHEET_EXCEL_WRITER_GE', ">="); - -/** - * @const SPREADSHEET_EXCEL_WRITER_EQ token identifier for character "=" - */ -define('SPREADSHEET_EXCEL_WRITER_EQ', "="); - -/** - * @const SPREADSHEET_EXCEL_WRITER_NE token identifier for character "<>" - */ -define('SPREADSHEET_EXCEL_WRITER_NE', "<>"); - - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); -@require_once $homedir.'/classes/pear/PEAR.php'; - -/** - * Class for parsing Excel formulas - * - * @author Xavier Noguer - * @category FileFormats - * @package Spreadsheet_Excel_Writer - */ - -class Spreadsheet_Excel_Writer_Parser extends PEAR -{ - /** - * The index of the character we are currently looking at - * @var integer - */ - var $_current_char; - - /** - * The token we are working on. - * @var string - */ - var $_current_token; - - /** - * The formula to parse - * @var string - */ - var $_formula; - - /** - * The character ahead of the current char - * @var string - */ - var $_lookahead; - - /** - * The parse tree to be generated - * @var string - */ - var $_parse_tree; - - /** - * The byte order. 1 => big endian, 0 => little endian. - * @var integer - */ - var $_byte_order; - - /** - * Array of external sheets - * @var array - */ - var $_ext_sheets; - - /** - * Array of sheet references in the form of REF structures - * @var array - */ - var $_references; - - /** - * The BIFF version for the workbook - * @var integer - */ - var $_BIFF_version; - - /** - * The class constructor - * - * @param integer $byte_order The byte order (Little endian or Big endian) of the architecture - (optional). 1 => big endian, 0 (default) little endian. - */ - function Spreadsheet_Excel_Writer_Parser($byte_order, $biff_version) - { - $this->_current_char = 0; - $this->_BIFF_version = $biff_version; - $this->_current_token = ''; // The token we are working on. - $this->_formula = ''; // The formula to parse. - $this->_lookahead = ''; // The character ahead of the current char. - $this->_parse_tree = ''; // The parse tree to be generated. - $this->_initializeHashes(); // Initialize the hashes: ptg's and function's ptg's - $this->_byte_order = $byte_order; // Little Endian or Big Endian - $this->_ext_sheets = array(); - $this->_references = array(); - } - - /** - * Initialize the ptg and function hashes. - * - * @access private - */ - function _initializeHashes() - { - // The Excel ptg indices - $this->ptg = array( - 'ptgExp' => 0x01, - 'ptgTbl' => 0x02, - 'ptgAdd' => 0x03, - 'ptgSub' => 0x04, - 'ptgMul' => 0x05, - 'ptgDiv' => 0x06, - 'ptgPower' => 0x07, - 'ptgConcat' => 0x08, - 'ptgLT' => 0x09, - 'ptgLE' => 0x0A, - 'ptgEQ' => 0x0B, - 'ptgGE' => 0x0C, - 'ptgGT' => 0x0D, - 'ptgNE' => 0x0E, - 'ptgIsect' => 0x0F, - 'ptgUnion' => 0x10, - 'ptgRange' => 0x11, - 'ptgUplus' => 0x12, - 'ptgUminus' => 0x13, - 'ptgPercent' => 0x14, - 'ptgParen' => 0x15, - 'ptgMissArg' => 0x16, - 'ptgStr' => 0x17, - 'ptgAttr' => 0x19, - 'ptgSheet' => 0x1A, - 'ptgEndSheet' => 0x1B, - 'ptgErr' => 0x1C, - 'ptgBool' => 0x1D, - 'ptgInt' => 0x1E, - 'ptgNum' => 0x1F, - 'ptgArray' => 0x20, - 'ptgFunc' => 0x21, - 'ptgFuncVar' => 0x22, - 'ptgName' => 0x23, - 'ptgRef' => 0x24, - 'ptgArea' => 0x25, - 'ptgMemArea' => 0x26, - 'ptgMemErr' => 0x27, - 'ptgMemNoMem' => 0x28, - 'ptgMemFunc' => 0x29, - 'ptgRefErr' => 0x2A, - 'ptgAreaErr' => 0x2B, - 'ptgRefN' => 0x2C, - 'ptgAreaN' => 0x2D, - 'ptgMemAreaN' => 0x2E, - 'ptgMemNoMemN' => 0x2F, - 'ptgNameX' => 0x39, - 'ptgRef3d' => 0x3A, - 'ptgArea3d' => 0x3B, - 'ptgRefErr3d' => 0x3C, - 'ptgAreaErr3d' => 0x3D, - 'ptgArrayV' => 0x40, - 'ptgFuncV' => 0x41, - 'ptgFuncVarV' => 0x42, - 'ptgNameV' => 0x43, - 'ptgRefV' => 0x44, - 'ptgAreaV' => 0x45, - 'ptgMemAreaV' => 0x46, - 'ptgMemErrV' => 0x47, - 'ptgMemNoMemV' => 0x48, - 'ptgMemFuncV' => 0x49, - 'ptgRefErrV' => 0x4A, - 'ptgAreaErrV' => 0x4B, - 'ptgRefNV' => 0x4C, - 'ptgAreaNV' => 0x4D, - 'ptgMemAreaNV' => 0x4E, - 'ptgMemNoMemN' => 0x4F, - 'ptgFuncCEV' => 0x58, - 'ptgNameXV' => 0x59, - 'ptgRef3dV' => 0x5A, - 'ptgArea3dV' => 0x5B, - 'ptgRefErr3dV' => 0x5C, - 'ptgAreaErr3d' => 0x5D, - 'ptgArrayA' => 0x60, - 'ptgFuncA' => 0x61, - 'ptgFuncVarA' => 0x62, - 'ptgNameA' => 0x63, - 'ptgRefA' => 0x64, - 'ptgAreaA' => 0x65, - 'ptgMemAreaA' => 0x66, - 'ptgMemErrA' => 0x67, - 'ptgMemNoMemA' => 0x68, - 'ptgMemFuncA' => 0x69, - 'ptgRefErrA' => 0x6A, - 'ptgAreaErrA' => 0x6B, - 'ptgRefNA' => 0x6C, - 'ptgAreaNA' => 0x6D, - 'ptgMemAreaNA' => 0x6E, - 'ptgMemNoMemN' => 0x6F, - 'ptgFuncCEA' => 0x78, - 'ptgNameXA' => 0x79, - 'ptgRef3dA' => 0x7A, - 'ptgArea3dA' => 0x7B, - 'ptgRefErr3dA' => 0x7C, - 'ptgAreaErr3d' => 0x7D - ); - - // Thanks to Michael Meeks and Gnumeric for the initial arg values. - // - // The following hash was generated by "function_locale.pl" in the distro. - // Refer to function_locale.pl for non-English function names. - // - // The array elements are as follow: - // ptg: The Excel function ptg code. - // args: The number of arguments that the function takes: - // >=0 is a fixed number of arguments. - // -1 is a variable number of arguments. - // class: The reference, value or array class of the function args. - // vol: The function is volatile. - // - $this->_functions = array( - // function ptg args class vol - 'COUNT' => array( 0, -1, 0, 0 ), - 'IF' => array( 1, -1, 1, 0 ), - 'ISNA' => array( 2, 1, 1, 0 ), - 'ISERROR' => array( 3, 1, 1, 0 ), - 'SUM' => array( 4, -1, 0, 0 ), - 'AVERAGE' => array( 5, -1, 0, 0 ), - 'MIN' => array( 6, -1, 0, 0 ), - 'MAX' => array( 7, -1, 0, 0 ), - 'ROW' => array( 8, -1, 0, 0 ), - 'COLUMN' => array( 9, -1, 0, 0 ), - 'NA' => array( 10, 0, 0, 0 ), - 'NPV' => array( 11, -1, 1, 0 ), - 'STDEV' => array( 12, -1, 0, 0 ), - 'DOLLAR' => array( 13, -1, 1, 0 ), - 'FIXED' => array( 14, -1, 1, 0 ), - 'SIN' => array( 15, 1, 1, 0 ), - 'COS' => array( 16, 1, 1, 0 ), - 'TAN' => array( 17, 1, 1, 0 ), - 'ATAN' => array( 18, 1, 1, 0 ), - 'PI' => array( 19, 0, 1, 0 ), - 'SQRT' => array( 20, 1, 1, 0 ), - 'EXP' => array( 21, 1, 1, 0 ), - 'LN' => array( 22, 1, 1, 0 ), - 'LOG10' => array( 23, 1, 1, 0 ), - 'ABS' => array( 24, 1, 1, 0 ), - 'INT' => array( 25, 1, 1, 0 ), - 'SIGN' => array( 26, 1, 1, 0 ), - 'ROUND' => array( 27, 2, 1, 0 ), - 'LOOKUP' => array( 28, -1, 0, 0 ), - 'INDEX' => array( 29, -1, 0, 1 ), - 'REPT' => array( 30, 2, 1, 0 ), - 'MID' => array( 31, 3, 1, 0 ), - 'LEN' => array( 32, 1, 1, 0 ), - 'VALUE' => array( 33, 1, 1, 0 ), - 'TRUE' => array( 34, 0, 1, 0 ), - 'FALSE' => array( 35, 0, 1, 0 ), - 'AND' => array( 36, -1, 0, 0 ), - 'OR' => array( 37, -1, 0, 0 ), - 'NOT' => array( 38, 1, 1, 0 ), - 'MOD' => array( 39, 2, 1, 0 ), - 'DCOUNT' => array( 40, 3, 0, 0 ), - 'DSUM' => array( 41, 3, 0, 0 ), - 'DAVERAGE' => array( 42, 3, 0, 0 ), - 'DMIN' => array( 43, 3, 0, 0 ), - 'DMAX' => array( 44, 3, 0, 0 ), - 'DSTDEV' => array( 45, 3, 0, 0 ), - 'VAR' => array( 46, -1, 0, 0 ), - 'DVAR' => array( 47, 3, 0, 0 ), - 'TEXT' => array( 48, 2, 1, 0 ), - 'LINEST' => array( 49, -1, 0, 0 ), - 'TREND' => array( 50, -1, 0, 0 ), - 'LOGEST' => array( 51, -1, 0, 0 ), - 'GROWTH' => array( 52, -1, 0, 0 ), - 'PV' => array( 56, -1, 1, 0 ), - 'FV' => array( 57, -1, 1, 0 ), - 'NPER' => array( 58, -1, 1, 0 ), - 'PMT' => array( 59, -1, 1, 0 ), - 'RATE' => array( 60, -1, 1, 0 ), - 'MIRR' => array( 61, 3, 0, 0 ), - 'IRR' => array( 62, -1, 0, 0 ), - 'RAND' => array( 63, 0, 1, 1 ), - 'MATCH' => array( 64, -1, 0, 0 ), - 'DATE' => array( 65, 3, 1, 0 ), - 'TIME' => array( 66, 3, 1, 0 ), - 'DAY' => array( 67, 1, 1, 0 ), - 'MONTH' => array( 68, 1, 1, 0 ), - 'YEAR' => array( 69, 1, 1, 0 ), - 'WEEKDAY' => array( 70, -1, 1, 0 ), - 'HOUR' => array( 71, 1, 1, 0 ), - 'MINUTE' => array( 72, 1, 1, 0 ), - 'SECOND' => array( 73, 1, 1, 0 ), - 'NOW' => array( 74, 0, 1, 1 ), - 'AREAS' => array( 75, 1, 0, 1 ), - 'ROWS' => array( 76, 1, 0, 1 ), - 'COLUMNS' => array( 77, 1, 0, 1 ), - 'OFFSET' => array( 78, -1, 0, 1 ), - 'SEARCH' => array( 82, -1, 1, 0 ), - 'TRANSPOSE' => array( 83, 1, 1, 0 ), - 'TYPE' => array( 86, 1, 1, 0 ), - 'ATAN2' => array( 97, 2, 1, 0 ), - 'ASIN' => array( 98, 1, 1, 0 ), - 'ACOS' => array( 99, 1, 1, 0 ), - 'CHOOSE' => array( 100, -1, 1, 0 ), - 'HLOOKUP' => array( 101, -1, 0, 0 ), - 'VLOOKUP' => array( 102, -1, 0, 0 ), - 'ISREF' => array( 105, 1, 0, 0 ), - 'LOG' => array( 109, -1, 1, 0 ), - 'CHAR' => array( 111, 1, 1, 0 ), - 'LOWER' => array( 112, 1, 1, 0 ), - 'UPPER' => array( 113, 1, 1, 0 ), - 'PROPER' => array( 114, 1, 1, 0 ), - 'LEFT' => array( 115, -1, 1, 0 ), - 'RIGHT' => array( 116, -1, 1, 0 ), - 'EXACT' => array( 117, 2, 1, 0 ), - 'TRIM' => array( 118, 1, 1, 0 ), - 'REPLACE' => array( 119, 4, 1, 0 ), - 'SUBSTITUTE' => array( 120, -1, 1, 0 ), - 'CODE' => array( 121, 1, 1, 0 ), - 'FIND' => array( 124, -1, 1, 0 ), - 'CELL' => array( 125, -1, 0, 1 ), - 'ISERR' => array( 126, 1, 1, 0 ), - 'ISTEXT' => array( 127, 1, 1, 0 ), - 'ISNUMBER' => array( 128, 1, 1, 0 ), - 'ISBLANK' => array( 129, 1, 1, 0 ), - 'T' => array( 130, 1, 0, 0 ), - 'N' => array( 131, 1, 0, 0 ), - 'DATEVALUE' => array( 140, 1, 1, 0 ), - 'TIMEVALUE' => array( 141, 1, 1, 0 ), - 'SLN' => array( 142, 3, 1, 0 ), - 'SYD' => array( 143, 4, 1, 0 ), - 'DDB' => array( 144, -1, 1, 0 ), - 'INDIRECT' => array( 148, -1, 1, 1 ), - 'CALL' => array( 150, -1, 1, 0 ), - 'CLEAN' => array( 162, 1, 1, 0 ), - 'MDETERM' => array( 163, 1, 2, 0 ), - 'MINVERSE' => array( 164, 1, 2, 0 ), - 'MMULT' => array( 165, 2, 2, 0 ), - 'IPMT' => array( 167, -1, 1, 0 ), - 'PPMT' => array( 168, -1, 1, 0 ), - 'COUNTA' => array( 169, -1, 0, 0 ), - 'PRODUCT' => array( 183, -1, 0, 0 ), - 'FACT' => array( 184, 1, 1, 0 ), - 'DPRODUCT' => array( 189, 3, 0, 0 ), - 'ISNONTEXT' => array( 190, 1, 1, 0 ), - 'STDEVP' => array( 193, -1, 0, 0 ), - 'VARP' => array( 194, -1, 0, 0 ), - 'DSTDEVP' => array( 195, 3, 0, 0 ), - 'DVARP' => array( 196, 3, 0, 0 ), - 'TRUNC' => array( 197, -1, 1, 0 ), - 'ISLOGICAL' => array( 198, 1, 1, 0 ), - 'DCOUNTA' => array( 199, 3, 0, 0 ), - 'ROUNDUP' => array( 212, 2, 1, 0 ), - 'ROUNDDOWN' => array( 213, 2, 1, 0 ), - 'RANK' => array( 216, -1, 0, 0 ), - 'ADDRESS' => array( 219, -1, 1, 0 ), - 'DAYS360' => array( 220, -1, 1, 0 ), - 'TODAY' => array( 221, 0, 1, 1 ), - 'VDB' => array( 222, -1, 1, 0 ), - 'MEDIAN' => array( 227, -1, 0, 0 ), - 'SUMPRODUCT' => array( 228, -1, 2, 0 ), - 'SINH' => array( 229, 1, 1, 0 ), - 'COSH' => array( 230, 1, 1, 0 ), - 'TANH' => array( 231, 1, 1, 0 ), - 'ASINH' => array( 232, 1, 1, 0 ), - 'ACOSH' => array( 233, 1, 1, 0 ), - 'ATANH' => array( 234, 1, 1, 0 ), - 'DGET' => array( 235, 3, 0, 0 ), - 'INFO' => array( 244, 1, 1, 1 ), - 'DB' => array( 247, -1, 1, 0 ), - 'FREQUENCY' => array( 252, 2, 0, 0 ), - 'ERROR.TYPE' => array( 261, 1, 1, 0 ), - 'REGISTER.ID' => array( 267, -1, 1, 0 ), - 'AVEDEV' => array( 269, -1, 0, 0 ), - 'BETADIST' => array( 270, -1, 1, 0 ), - 'GAMMALN' => array( 271, 1, 1, 0 ), - 'BETAINV' => array( 272, -1, 1, 0 ), - 'BINOMDIST' => array( 273, 4, 1, 0 ), - 'CHIDIST' => array( 274, 2, 1, 0 ), - 'CHIINV' => array( 275, 2, 1, 0 ), - 'COMBIN' => array( 276, 2, 1, 0 ), - 'CONFIDENCE' => array( 277, 3, 1, 0 ), - 'CRITBINOM' => array( 278, 3, 1, 0 ), - 'EVEN' => array( 279, 1, 1, 0 ), - 'EXPONDIST' => array( 280, 3, 1, 0 ), - 'FDIST' => array( 281, 3, 1, 0 ), - 'FINV' => array( 282, 3, 1, 0 ), - 'FISHER' => array( 283, 1, 1, 0 ), - 'FISHERINV' => array( 284, 1, 1, 0 ), - 'FLOOR' => array( 285, 2, 1, 0 ), - 'GAMMADIST' => array( 286, 4, 1, 0 ), - 'GAMMAINV' => array( 287, 3, 1, 0 ), - 'CEILING' => array( 288, 2, 1, 0 ), - 'HYPGEOMDIST' => array( 289, 4, 1, 0 ), - 'LOGNORMDIST' => array( 290, 3, 1, 0 ), - 'LOGINV' => array( 291, 3, 1, 0 ), - 'NEGBINOMDIST' => array( 292, 3, 1, 0 ), - 'NORMDIST' => array( 293, 4, 1, 0 ), - 'NORMSDIST' => array( 294, 1, 1, 0 ), - 'NORMINV' => array( 295, 3, 1, 0 ), - 'NORMSINV' => array( 296, 1, 1, 0 ), - 'STANDARDIZE' => array( 297, 3, 1, 0 ), - 'ODD' => array( 298, 1, 1, 0 ), - 'PERMUT' => array( 299, 2, 1, 0 ), - 'POISSON' => array( 300, 3, 1, 0 ), - 'TDIST' => array( 301, 3, 1, 0 ), - 'WEIBULL' => array( 302, 4, 1, 0 ), - 'SUMXMY2' => array( 303, 2, 2, 0 ), - 'SUMX2MY2' => array( 304, 2, 2, 0 ), - 'SUMX2PY2' => array( 305, 2, 2, 0 ), - 'CHITEST' => array( 306, 2, 2, 0 ), - 'CORREL' => array( 307, 2, 2, 0 ), - 'COVAR' => array( 308, 2, 2, 0 ), - 'FORECAST' => array( 309, 3, 2, 0 ), - 'FTEST' => array( 310, 2, 2, 0 ), - 'INTERCEPT' => array( 311, 2, 2, 0 ), - 'PEARSON' => array( 312, 2, 2, 0 ), - 'RSQ' => array( 313, 2, 2, 0 ), - 'STEYX' => array( 314, 2, 2, 0 ), - 'SLOPE' => array( 315, 2, 2, 0 ), - 'TTEST' => array( 316, 4, 2, 0 ), - 'PROB' => array( 317, -1, 2, 0 ), - 'DEVSQ' => array( 318, -1, 0, 0 ), - 'GEOMEAN' => array( 319, -1, 0, 0 ), - 'HARMEAN' => array( 320, -1, 0, 0 ), - 'SUMSQ' => array( 321, -1, 0, 0 ), - 'KURT' => array( 322, -1, 0, 0 ), - 'SKEW' => array( 323, -1, 0, 0 ), - 'ZTEST' => array( 324, -1, 0, 0 ), - 'LARGE' => array( 325, 2, 0, 0 ), - 'SMALL' => array( 326, 2, 0, 0 ), - 'QUARTILE' => array( 327, 2, 0, 0 ), - 'PERCENTILE' => array( 328, 2, 0, 0 ), - 'PERCENTRANK' => array( 329, -1, 0, 0 ), - 'MODE' => array( 330, -1, 2, 0 ), - 'TRIMMEAN' => array( 331, 2, 0, 0 ), - 'TINV' => array( 332, 2, 1, 0 ), - 'CONCATENATE' => array( 336, -1, 1, 0 ), - 'POWER' => array( 337, 2, 1, 0 ), - 'RADIANS' => array( 342, 1, 1, 0 ), - 'DEGREES' => array( 343, 1, 1, 0 ), - 'SUBTOTAL' => array( 344, -1, 0, 0 ), - 'SUMIF' => array( 345, -1, 0, 0 ), - 'COUNTIF' => array( 346, 2, 0, 0 ), - 'COUNTBLANK' => array( 347, 1, 0, 0 ), - 'ROMAN' => array( 354, -1, 1, 0 ) - ); - } - - /** - * Convert a token to the proper ptg value. - * - * @access private - * @param mixed $token The token to convert. - * @return mixed the converted token on success. PEAR_Error if the token - * is not recognized - */ - function _convert($token) - { - if (preg_match("/^\"[^\"]{0,255}\"$/", $token)) { - return $this->_convertString($token); - - } elseif (is_numeric($token)) { - return $this->_convertNumber($token); - - // match references like A1 or $A$1 - } elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/',$token)) { - return $this->_convertRef2d($token); - - // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 - } elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z](\d+)$/u",$token)) { - return $this->_convertRef3d($token); - - // match external references like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1 - } elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z](\d+)$/u",$token)) { - return $this->_convertRef3d($token); - - // match ranges like A1:B2 - } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\:(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/",$token)) { - return $this->_convertRange2d($token); - - // match ranges like A1..B2 - } elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/",$token)) { - return $this->_convertRange2d($token); - - // match external ranges like Sheet1!A1 or Sheet1:Sheet2!A1:B2 - } elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/u",$token)) { - return $this->_convertRange3d($token); - - // match external ranges like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 - } elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/u",$token)) { - return $this->_convertRange3d($token); - - // operators (including parentheses) - } elseif (isset($this->ptg[$token])) { - return pack("C", $this->ptg[$token]); - - // commented so argument number can be processed correctly. See toReversePolish(). - /*elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]+/",$token)) - { - return($this->_convertFunction($token,$this->_func_args)); - }*/ - - // if it's an argument, ignore the token (the argument remains) - } elseif ($token == 'arg') { - return ''; - } - // TODO: use real error codes - return $this->raiseError("Unknown token $token"); - } - - /** - * Convert a number token to ptgInt or ptgNum - * - * @access private - * @param mixed $num an integer or double for conversion to its ptg value - */ - function _convertNumber($num) - { - // Integer in the range 0..2**16-1 - if ((preg_match("/^\d+$/", $num)) and ($num <= 65535)) { - return pack("Cv", $this->ptg['ptgInt'], $num); - } else { // A float - if ($this->_byte_order) { // if it's Big Endian - $num = strrev($num); - } - return pack("Cd", $this->ptg['ptgNum'], $num); - } - } - - /** - * Convert a string token to ptgStr - * - * @access private - * @param string $string A string for conversion to its ptg value. - * @return mixed the converted token on success. PEAR_Error if the string - * is longer than 255 characters. - */ - function _convertString($string) - { - // chop away beggining and ending quotes - $string = substr($string, 1, strlen($string) - 2); - if (strlen($string) > 255) { - return $this->raiseError("String is too long"); - } - - if ($this->_BIFF_version == 0x0500) { - return pack("CC", $this->ptg['ptgStr'], strlen($string)).$string; - } elseif ($this->_BIFF_version == 0x0600) { - $encoding = 0; // TODO: Unicode support - return pack("CCC", $this->ptg['ptgStr'], strlen($string), $encoding).$string; - } - } - - /** - * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of - * args that it takes. - * - * @access private - * @param string $token The name of the function for convertion to ptg value. - * @param integer $num_args The number of arguments the function receives. - * @return string The packed ptg for the function - */ - function _convertFunction($token, $num_args) - { - $args = $this->_functions[$token][1]; - $volatile = $this->_functions[$token][3]; - - // Fixed number of args eg. TIME($i,$j,$k). - if ($args >= 0) { - return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]); - } - // Variable number of args eg. SUM($i,$j,$k, ..). - if ($args == -1) { - return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]); - } - } - - /** - * Convert an Excel range such as A1:D4 to a ptgRefV. - * - * @access private - * @param string $range An Excel range in the A1:A2 or A1..A2 format. - */ - function _convertRange2d($range) - { - $class = 2; // as far as I know, this is magick. - - // Split the range into 2 cell refs - if (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\:([A-Ia-i]?[A-Za-z])(\d+)$/", $range)) { - list($cell1, $cell2) = split(':', $range); - } elseif (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\.\.([A-Ia-i]?[A-Za-z])(\d+)$/", $range)) { - list($cell1, $cell2) = split('\.\.', $range); - - } else { - // TODO: use real error codes - return $this->raiseError("Unknown range separator", 0, PEAR_ERROR_DIE); - } - - // Convert the cell references - $cell_array1 = $this->_cellToPackedRowcol($cell1); - if (PEAR::isError($cell_array1)) { - return $cell_array1; - } - list($row1, $col1) = $cell_array1; - $cell_array2 = $this->_cellToPackedRowcol($cell2); - if (PEAR::isError($cell_array2)) { - return $cell_array2; - } - list($row2, $col2) = $cell_array2; - - // The ptg value depends on the class of the ptg. - if ($class == 0) { - $ptgArea = pack("C", $this->ptg['ptgArea']); - } elseif ($class == 1) { - $ptgArea = pack("C", $this->ptg['ptgAreaV']); - } elseif ($class == 2) { - $ptgArea = pack("C", $this->ptg['ptgAreaA']); - } else { - // TODO: use real error codes - return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); - } - return $ptgArea . $row1 . $row2 . $col1. $col2; - } - - /** - * Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to - * a ptgArea3d. - * - * @access private - * @param string $token An Excel range in the Sheet1!A1:A2 format. - * @return mixed The packed ptgArea3d token on success, PEAR_Error on failure. - */ - function _convertRange3d($token) - { - $class = 2; // as far as I know, this is magick. - - // Split the ref at the ! symbol - list($ext_ref, $range) = split('!', $token); - - // Convert the external reference part (different for BIFF8) - if ($this->_BIFF_version == 0x0500) { - $ext_ref = $this->_packExtRef($ext_ref); - if (PEAR::isError($ext_ref)) { - return $ext_ref; - } - } elseif ($this->_BIFF_version == 0x0600) { - $ext_ref = $this->_getRefIndex($ext_ref); - if (PEAR::isError($ext_ref)) { - return $ext_ref; - } - } - - // Split the range into 2 cell refs - list($cell1, $cell2) = split(':', $range); - - // Convert the cell references - if (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/", $cell1)) { - $cell_array1 = $this->_cellToPackedRowcol($cell1); - if (PEAR::isError($cell_array1)) { - return $cell_array1; - } - list($row1, $col1) = $cell_array1; - $cell_array2 = $this->_cellToPackedRowcol($cell2); - if (PEAR::isError($cell_array2)) { - return $cell_array2; - } - list($row2, $col2) = $cell_array2; - } else { // It's a rows range (like 26:27) - $cells_array = $this->_rangeToPackedRange($cell1.':'.$cell2); - if (PEAR::isError($cells_array)) { - return $cells_array; - } - list($row1, $col1, $row2, $col2) = $cells_array; - } - - // The ptg value depends on the class of the ptg. - if ($class == 0) { - $ptgArea = pack("C", $this->ptg['ptgArea3d']); - } elseif ($class == 1) { - $ptgArea = pack("C", $this->ptg['ptgArea3dV']); - } elseif ($class == 2) { - $ptgArea = pack("C", $this->ptg['ptgArea3dA']); - } else { - return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); - } - - return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2; - } - - /** - * Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV. - * - * @access private - * @param string $cell An Excel cell reference - * @return string The cell in packed() format with the corresponding ptg - */ - function _convertRef2d($cell) - { - $class = 2; // as far as I know, this is magick. - - // Convert the cell reference - $cell_array = $this->_cellToPackedRowcol($cell); - if (PEAR::isError($cell_array)) { - return $cell_array; - } - list($row, $col) = $cell_array; - - // The ptg value depends on the class of the ptg. - if ($class == 0) { - $ptgRef = pack("C", $this->ptg['ptgRef']); - } elseif ($class == 1) { - $ptgRef = pack("C", $this->ptg['ptgRefV']); - } elseif ($class == 2) { - $ptgRef = pack("C", $this->ptg['ptgRefA']); - } else { - // TODO: use real error codes - return $this->raiseError("Unknown class $class"); - } - return $ptgRef.$row.$col; - } - - /** - * Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a - * ptgRef3d. - * - * @access private - * @param string $cell An Excel cell reference - * @return mixed The packed ptgRef3d token on success, PEAR_Error on failure. - */ - function _convertRef3d($cell) - { - $class = 2; // as far as I know, this is magick. - - // Split the ref at the ! symbol - list($ext_ref, $cell) = split('!', $cell); - - // Convert the external reference part (different for BIFF8) - if ($this->_BIFF_version == 0x0500) { - $ext_ref = $this->_packExtRef($ext_ref); - if (PEAR::isError($ext_ref)) { - return $ext_ref; - } - } elseif ($this->_BIFF_version == 0x0600) { - $ext_ref = $this->_getRefIndex($ext_ref); - if (PEAR::isError($ext_ref)) { - return $ext_ref; - } - } - - // Convert the cell reference part - list($row, $col) = $this->_cellToPackedRowcol($cell); - - // The ptg value depends on the class of the ptg. - if ($class == 0) { - $ptgRef = pack("C", $this->ptg['ptgRef3d']); - } elseif ($class == 1) { - $ptgRef = pack("C", $this->ptg['ptgRef3dV']); - } elseif ($class == 2) { - $ptgRef = pack("C", $this->ptg['ptgRef3dA']); - } else { - return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); - } - - return $ptgRef . $ext_ref. $row . $col; - } - - /** - * Convert the sheet name part of an external reference, for example "Sheet1" or - * "Sheet1:Sheet2", to a packed structure. - * - * @access private - * @param string $ext_ref The name of the external reference - * @return string The reference index in packed() format - */ - function _packExtRef($ext_ref) - { - $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. - $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. - - // Check if there is a sheet range eg., Sheet1:Sheet2. - if (preg_match("/:/", $ext_ref)) { - list($sheet_name1, $sheet_name2) = split(':', $ext_ref); - - $sheet1 = $this->_getSheetIndex($sheet_name1); - if ($sheet1 == -1) { - return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); - } - $sheet2 = $this->_getSheetIndex($sheet_name2); - if ($sheet2 == -1) { - return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); - } - - // Reverse max and min sheet numbers if necessary - if ($sheet1 > $sheet2) { - list($sheet1, $sheet2) = array($sheet2, $sheet1); - } - } else { // Single sheet name only. - $sheet1 = $this->_getSheetIndex($ext_ref); - if ($sheet1 == -1) { - return $this->raiseError("Unknown sheet name $ext_ref in formula"); - } - $sheet2 = $sheet1; - } - - // References are stored relative to 0xFFFF. - $offset = -1 - $sheet1; - - return pack('vdvv', $offset, 0x00, $sheet1, $sheet2); - } - - /** - * Look up the REF index that corresponds to an external sheet name - * (or range). If it doesn't exist yet add it to the workbook's references - * array. It assumes all sheet names given must exist. - * - * @access private - * @param string $ext_ref The name of the external reference - * @return mixed The reference index in packed() format on success, - * PEAR_Error on failure - */ - function _getRefIndex($ext_ref) - { - $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. - $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. - - // Check if there is a sheet range eg., Sheet1:Sheet2. - if (preg_match("/:/", $ext_ref)) { - list($sheet_name1, $sheet_name2) = split(':', $ext_ref); - - $sheet1 = $this->_getSheetIndex($sheet_name1); - if ($sheet1 == -1) { - return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); - } - $sheet2 = $this->_getSheetIndex($sheet_name2); - if ($sheet2 == -1) { - return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); - } - - // Reverse max and min sheet numbers if necessary - if ($sheet1 > $sheet2) { - list($sheet1, $sheet2) = array($sheet2, $sheet1); - } - } else { // Single sheet name only. - $sheet1 = $this->_getSheetIndex($ext_ref); - if ($sheet1 == -1) { - return $this->raiseError("Unknown sheet name $ext_ref in formula"); - } - $sheet2 = $sheet1; - } - - // assume all references belong to this document - $supbook_index = 0x00; - $ref = pack('vvv', $supbook_index, $sheet1, $sheet2); - $total_references = count($this->_references); - $index = -1; - for ($i = 0; $i < $total_references; $i++) { - if ($ref == $this->_references[$i]) { - $index = $i; - break; - } - } - // if REF was not found add it to references array - if ($index == -1) { - $this->_references[$total_references] = $ref; - $index = $total_references; - } - - return pack('v', $index); - } - - /** - * Look up the index that corresponds to an external sheet name. The hash of - * sheet names is updated by the addworksheet() method of the - * Spreadsheet_Excel_Writer_Workbook class. - * - * @access private - * @return integer The sheet index, -1 if the sheet was not found - */ - function _getSheetIndex($sheet_name) - { - if (!isset($this->_ext_sheets[$sheet_name])) { - return -1; - } else { - return $this->_ext_sheets[$sheet_name]; - } - } - - /** - * This method is used to update the array of sheet names. It is - * called by the addWorksheet() method of the - * Spreadsheet_Excel_Writer_Workbook class. - * - * @access public - * @see Spreadsheet_Excel_Writer_Workbook::addWorksheet() - * @param string $name The name of the worksheet being added - * @param integer $index The index of the worksheet being added - */ - function setExtSheet($name, $index) - { - $this->_ext_sheets[$name] = $index; - } - - /** - * pack() row and column into the required 3 or 4 byte format. - * - * @access private - * @param string $cell The Excel cell reference to be packed - * @return array Array containing the row and column in packed() format - */ - function _cellToPackedRowcol($cell) - { - $cell = strtoupper($cell); - list($row, $col, $row_rel, $col_rel) = $this->_cellToRowcol($cell); - if ($col >= 256) { - return $this->raiseError("Column in: $cell greater than 255"); - } - // FIXME: change for BIFF8 - if ($row >= 16384) { - return $this->raiseError("Row in: $cell greater than 16384 "); - } - - // Set the high bits to indicate if row or col are relative. - if ($this->_BIFF_version == 0x0500) { - $row |= $col_rel << 14; - $row |= $row_rel << 15; - $col = pack('C', $col); - } elseif ($this->_BIFF_version == 0x0600) { - $col |= $col_rel << 14; - $col |= $row_rel << 15; - $col = pack('v', $col); - } - $row = pack('v', $row); - - return array($row, $col); - } - - /** - * pack() row range into the required 3 or 4 byte format. - * Just using maximum col/rows, which is probably not the correct solution - * - * @access private - * @param string $range The Excel range to be packed - * @return array Array containing (row1,col1,row2,col2) in packed() format - */ - function _rangeToPackedRange($range) - { - preg_match('/(\$)?(\d+)\:(\$)?(\d+)/', $range, $match); - // return absolute rows if there is a $ in the ref - $row1_rel = empty($match[1]) ? 1 : 0; - $row1 = $match[2]; - $row2_rel = empty($match[3]) ? 1 : 0; - $row2 = $match[4]; - // Convert 1-index to zero-index - $row1--; - $row2--; - // Trick poor inocent Excel - $col1 = 0; - $col2 = 16383; // FIXME: maximum possible value for Excel 5 (change this!!!) - - // FIXME: this changes for BIFF8 - if (($row1 >= 16384) or ($row2 >= 16384)) { - return $this->raiseError("Row in: $range greater than 16384 "); - } - - // Set the high bits to indicate if rows are relative. - if ($this->_BIFF_version == 0x0500) { - $row1 |= $row1_rel << 14; // FIXME: probably a bug - $row2 |= $row2_rel << 15; - $col1 = pack('C', $col1); - $col2 = pack('C', $col2); - } elseif ($this->_BIFF_version == 0x0600) { - $col1 |= $row1_rel << 15; - $col2 |= $row2_rel << 15; - $col1 = pack('v', $col1); - $col2 = pack('v', $col2); - } - $row1 = pack('v', $row1); - $row2 = pack('v', $row2); - - return array($row1, $col1, $row2, $col2); - } - - /** - * Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero - * indexed row and column number. Also returns two (0,1) values to indicate - * whether the row or column are relative references. - * - * @access private - * @param string $cell The Excel cell reference in A1 format. - * @return array - */ - function _cellToRowcol($cell) - { - preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/',$cell,$match); - // return absolute column if there is a $ in the ref - $col_rel = empty($match[1]) ? 1 : 0; - $col_ref = $match[2]; - $row_rel = empty($match[3]) ? 1 : 0; - $row = $match[4]; - - // Convert base26 column string to a number. - $expn = strlen($col_ref) - 1; - $col = 0; - $col_ref_length = strlen($col_ref); - for ($i = 0; $i < $col_ref_length; $i++) { - $col += (ord($col_ref{$i}) - ord('A') + 1) * pow(26, $expn); - $expn--; - } - - // Convert 1-index to zero-index - $row--; - $col--; - - return array($row, $col, $row_rel, $col_rel); - } - - /** - * Advance to the next valid token. - * - * @access private - */ - function _advance() - { - $i = $this->_current_char; - $formula_length = strlen($this->_formula); - // eat up white spaces - if ($i < $formula_length) { - while ($this->_formula{$i} == " ") { - $i++; - } - - if ($i < ($formula_length - 1)) { - $this->_lookahead = $this->_formula{$i+1}; - } - $token = ''; - } - - while ($i < $formula_length) { - $token .= $this->_formula{$i}; - if ($i < ($formula_length - 1)) { - $this->_lookahead = $this->_formula{$i+1}; - } else { - $this->_lookahead = ''; - } - - if ($this->_match($token) != '') { - //if ($i < strlen($this->_formula) - 1) { - // $this->_lookahead = $this->_formula{$i+1}; - //} - $this->_current_char = $i + 1; - $this->_current_token = $token; - return 1; - } - - if ($i < ($formula_length - 2)) { - $this->_lookahead = $this->_formula{$i+2}; - } else { // if we run out of characters _lookahead becomes empty - $this->_lookahead = ''; - } - $i++; - } - //die("Lexical error ".$this->_current_char); - } - - /** - * Checks if it's a valid token. - * - * @access private - * @param mixed $token The token to check. - * @return mixed The checked token or false on failure - */ - function _match($token) - { - switch($token) { - case SPREADSHEET_EXCEL_WRITER_ADD: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_SUB: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_MUL: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_DIV: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_OPEN: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_CLOSE: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_COMA: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_SEMICOLON: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_GT: - if ($this->_lookahead == '=') { // it's a GE token - break; - } - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_LT: - // it's a LE or a NE token - if (($this->_lookahead == '=') or ($this->_lookahead == '>')) { - break; - } - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_GE: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_LE: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_EQ: - return $token; - break; - case SPREADSHEET_EXCEL_WRITER_NE: - return $token; - break; - default: - // if it's a reference - if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and - !preg_match("/[0-9]/",$this->_lookahead) and - ($this->_lookahead != ':') and ($this->_lookahead != '.') and - ($this->_lookahead != '!')) - { - return $token; - } - // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) - elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z][0-9]+$/u",$token) and - !preg_match("/[0-9]/",$this->_lookahead) and - ($this->_lookahead != ':') and ($this->_lookahead != '.')) - { - return $token; - } - // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1) - elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z][0-9]+$/u",$token) and - !preg_match("/[0-9]/",$this->_lookahead) and - ($this->_lookahead != ':') and ($this->_lookahead != '.')) - { - return $token; - } - // if it's a range (A1:A2) - elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and - !preg_match("/[0-9]/",$this->_lookahead)) - { - return $token; - } - // if it's a range (A1..A2) - elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and - !preg_match("/[0-9]/",$this->_lookahead)) - { - return $token; - } - // If it's an external range like Sheet1!A1 or Sheet1:Sheet2!A1:B2 - elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$token) and - !preg_match("/[0-9]/",$this->_lookahead)) - { - return $token; - } - // If it's an external range like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 - elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$token) and - !preg_match("/[0-9]/",$this->_lookahead)) - { - return $token; - } - // If it's a number (check that it's not a sheet name or range) - elseif (is_numeric($token) and - (!is_numeric($token.$this->_lookahead) or ($this->_lookahead == '')) and - ($this->_lookahead != '!') and ($this->_lookahead != ':')) - { - return $token; - } - // If it's a string (of maximum 255 characters) - elseif (preg_match("/^\"[^\"]{0,255}\"$/",$token)) - { - return $token; - } - // if it's a function call - elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i",$token) and ($this->_lookahead == "(")) - { - return $token; - } - return ''; - } - } - - /** - * The parsing method. It parses a formula. - * - * @access public - * @param string $formula The formula to parse, without the initial equal - * sign (=). - * @return mixed true on success, PEAR_Error on failure - */ - function parse($formula) - { - $this->_current_char = 0; - $this->_formula = $formula; - $this->_lookahead = $formula{1}; - $this->_advance(); - $this->_parse_tree = $this->_condition(); - if (PEAR::isError($this->_parse_tree)) { - return $this->_parse_tree; - } - return true; - } - - /** - * It parses a condition. It assumes the following rule: - * Cond -> Expr [(">" | "<") Expr] - * - * @access private - * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure - */ - function _condition() - { - $result = $this->_expression(); - if (PEAR::isError($result)) { - return $result; - } - if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LT) { - $this->_advance(); - $result2 = $this->_expression(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgLT', $result, $result2); - } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GT) { - $this->_advance(); - $result2 = $this->_expression(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgGT', $result, $result2); - } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LE) { - $this->_advance(); - $result2 = $this->_expression(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgLE', $result, $result2); - } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GE) { - $this->_advance(); - $result2 = $this->_expression(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgGE', $result, $result2); - } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_EQ) { - $this->_advance(); - $result2 = $this->_expression(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgEQ', $result, $result2); - } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_NE) { - $this->_advance(); - $result2 = $this->_expression(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgNE', $result, $result2); - } - return $result; - } - - /** - * It parses a expression. It assumes the following rule: - * Expr -> Term [("+" | "-") Term] - * -> "string" - * -> "-" Term - * - * @access private - * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure - */ - function _expression() - { - // If it's a string return a string node - if (preg_match("/^\"[^\"]{0,255}\"$/", $this->_current_token)) { - $result = $this->_createTree($this->_current_token, '', ''); - $this->_advance(); - return $result; - } elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB) { - // catch "-" Term - $this->_advance(); - $result2 = $this->_expression(); - $result = $this->_createTree('ptgUminus', $result2, ''); - return $result; - } - $result = $this->_term(); - if (PEAR::isError($result)) { - return $result; - } - while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) or - ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB)) { - /**/ - if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) { - $this->_advance(); - $result2 = $this->_term(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgAdd', $result, $result2); - } else { - $this->_advance(); - $result2 = $this->_term(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgSub', $result, $result2); - } - } - return $result; - } - - /** - * This function just introduces a ptgParen element in the tree, so that Excel - * doesn't get confused when working with a parenthesized formula afterwards. - * - * @access private - * @see _fact() - * @return array The parsed ptg'd tree - */ - function _parenthesizedExpression() - { - $result = $this->_createTree('ptgParen', $this->_expression(), ''); - return $result; - } - - /** - * It parses a term. It assumes the following rule: - * Term -> Fact [("*" | "/") Fact] - * - * @access private - * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure - */ - function _term() - { - $result = $this->_fact(); - if (PEAR::isError($result)) { - return $result; - } - while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) or - ($this->_current_token == SPREADSHEET_EXCEL_WRITER_DIV)) { - /**/ - if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) { - $this->_advance(); - $result2 = $this->_fact(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgMul', $result, $result2); - } else { - $this->_advance(); - $result2 = $this->_fact(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('ptgDiv', $result, $result2); - } - } - return $result; - } - - /** - * It parses a factor. It assumes the following rule: - * Fact -> ( Expr ) - * | CellRef - * | CellRange - * | Number - * | Function - * - * @access private - * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure - */ - function _fact() - { - if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_OPEN) { - $this->_advance(); // eat the "(" - $result = $this->_parenthesizedExpression(); - if ($this->_current_token != SPREADSHEET_EXCEL_WRITER_CLOSE) { - return $this->raiseError("')' token expected."); - } - $this->_advance(); // eat the ")" - return $result; - } - // if it's a reference - if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$this->_current_token)) - { - $result = $this->_createTree($this->_current_token, '', ''); - $this->_advance(); - return $result; - } - // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) - elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z][0-9]+$/u",$this->_current_token)) - { - $result = $this->_createTree($this->_current_token, '', ''); - $this->_advance(); - return $result; - } - // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1) - elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\![A-Ia-i]?[A-Za-z][0-9]+$/u",$this->_current_token)) - { - $result = $this->_createTree($this->_current_token, '', ''); - $this->_advance(); - return $result; - } - // if it's a range - elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token) or - preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token)) - { - $result = $this->_current_token; - $this->_advance(); - return $result; - } - // If it's an external range (Sheet1!A1 or Sheet1!A1:B2) - elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$this->_current_token)) - { - $result = $this->_current_token; - $this->_advance(); - return $result; - } - // If it's an external range ('Sheet1'!A1 or 'Sheet1'!A1:B2) - elseif (preg_match("/^'[\w -]+(\:[\w -]+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/u",$this->_current_token)) - { - $result = $this->_current_token; - $this->_advance(); - return $result; - } - elseif (is_numeric($this->_current_token)) - { - $result = $this->_createTree($this->_current_token, '', ''); - $this->_advance(); - return $result; - } - // if it's a function call - elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i",$this->_current_token)) - { - $result = $this->_func(); - return $result; - } - return $this->raiseError("Syntax error: ".$this->_current_token. - ", lookahead: ".$this->_lookahead. - ", current char: ".$this->_current_char); - } - - /** - * It parses a function call. It assumes the following rule: - * Func -> ( Expr [,Expr]* ) - * - * @access private - * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure - */ - function _func() - { - $num_args = 0; // number of arguments received - $function = strtoupper($this->_current_token); - $result = ''; // initialize result - $this->_advance(); - $this->_advance(); // eat the "(" - while ($this->_current_token != ')') { - /**/ - if ($num_args > 0) { - if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_COMA or - $this->_current_token == SPREADSHEET_EXCEL_WRITER_SEMICOLON) - { - $this->_advance(); // eat the "," or ";" - } else { - return $this->raiseError("Syntax error: comma expected in ". - "function $function, arg #{$num_args}"); - } - $result2 = $this->_condition(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('arg', $result, $result2); - } else { // first argument - $result2 = $this->_condition(); - if (PEAR::isError($result2)) { - return $result2; - } - $result = $this->_createTree('arg', '', $result2); - } - $num_args++; - } - if (!isset($this->_functions[$function])) { - return $this->raiseError("Function $function() doesn't exist"); - } - $args = $this->_functions[$function][1]; - // If fixed number of args eg. TIME($i,$j,$k). Check that the number of args is valid. - if (($args >= 0) and ($args != $num_args)) { - return $this->raiseError("Incorrect number of arguments in function $function() "); - } - - $result = $this->_createTree($function, $result, $num_args); - $this->_advance(); // eat the ")" - return $result; - } - - /** - * Creates a tree. In fact an array which may have one or two arrays (sub-trees) - * as elements. - * - * @access private - * @param mixed $value The value of this node. - * @param mixed $left The left array (sub-tree) or a final node. - * @param mixed $right The right array (sub-tree) or a final node. - * @return array A tree - */ - function _createTree($value, $left, $right) - { - return array('value' => $value, 'left' => $left, 'right' => $right); - } - - /** - * Builds a string containing the tree in reverse polish notation (What you - * would use in a HP calculator stack). - * The following tree: - * - * + - * / \ - * 2 3 - * - * produces: "23+" - * - * The following tree: - * - * + - * / \ - * 3 * - * / \ - * 6 A1 - * - * produces: "36A1*+" - * - * In fact all operands, functions, references, etc... are written as ptg's - * - * @access public - * @param array $tree The optional tree to convert. - * @return string The tree in reverse polish notation - */ - function toReversePolish($tree = array()) - { - $polish = ""; // the string we are going to return - if (empty($tree)) { // If it's the first call use _parse_tree - $tree = $this->_parse_tree; - } - if (is_array($tree['left'])) { - $converted_tree = $this->toReversePolish($tree['left']); - if (PEAR::isError($converted_tree)) { - return $converted_tree; - } - $polish .= $converted_tree; - } elseif ($tree['left'] != '') { // It's a final node - $converted_tree = $this->_convert($tree['left']); - if (PEAR::isError($converted_tree)) { - return $converted_tree; - } - $polish .= $converted_tree; - } - if (is_array($tree['right'])) { - $converted_tree = $this->toReversePolish($tree['right']); - if (PEAR::isError($converted_tree)) { - return $converted_tree; - } - $polish .= $converted_tree; - } elseif ($tree['right'] != '') { // It's a final node - $converted_tree = $this->_convert($tree['right']); - if (PEAR::isError($converted_tree)) { - return $converted_tree; - } - $polish .= $converted_tree; - } - // if it's a function convert it here (so we can set it's arguments) - if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and - !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/',$tree['value']) and - !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/",$tree['value']) and - !is_numeric($tree['value']) and - !isset($this->ptg[$tree['value']])) - { - // left subtree for a function is always an array. - if ($tree['left'] != '') { - $left_tree = $this->toReversePolish($tree['left']); - } else { - $left_tree = ''; - } - if (PEAR::isError($left_tree)) { - return $left_tree; - } - // add it's left subtree and return. - return $left_tree.$this->_convertFunction($tree['value'], $tree['right']); - } else { - $converted_tree = $this->_convert($tree['value']); - if (PEAR::isError($converted_tree)) { - return $converted_tree; - } - } - $polish .= $converted_tree; - return $polish; - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Validator.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Validator.php deleted file mode 100644 index f10b84d1..00000000 --- a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Validator.php +++ /dev/null @@ -1,230 +0,0 @@ - - * - * License Information: - * - * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets - * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -//require_once('PEAR.php'); - -// Possible operator types - -/* -FIXME: change prefixes -*/ -define("OP_BETWEEN", 0x00); -define("OP_NOTBETWEEN", 0x01); -define("OP_EQUAL", 0x02); -define("OP_NOTEQUAL", 0x03); -define("OP_GT", 0x04); -define("OP_LT", 0x05); -define("OP_GTE", 0x06); -define("OP_LTE", 0x07); - -/** - * Baseclass for generating Excel DV records (validations) - * - * @author Herman Kuiper - * @category FileFormats - * @package Spreadsheet_Excel_Writer - */ -class Spreadsheet_Excel_Writer_Validator -{ - var $_type; - var $_style; - var $_fixedList; - var $_blank; - var $_incell; - var $_showprompt; - var $_showerror; - var $_title_prompt; - var $_descr_prompt; - var $_title_error; - var $_descr_error; - var $_operator; - var $_formula1; - var $_formula2; - /** - * The parser from the workbook. Used to parse validation formulas also - * @var Spreadsheet_Excel_Writer_Parser - */ - var $_parser; - - function Spreadsheet_Excel_Writer_Validator(&$parser) - { - $this->_parser = $parser; - $this->_type = 0x01; // FIXME: add method for setting datatype - $this->_style = 0x00; - $this->_fixedList = false; - $this->_blank = false; - $this->_incell = false; - $this->_showprompt = false; - $this->_showerror = true; - $this->_title_prompt = "\x00"; - $this->_descr_prompt = "\x00"; - $this->_title_error = "\x00"; - $this->_descr_error = "\x00"; - $this->_operator = 0x00; // default is equal - $this->_formula1 = ''; - $this->_formula2 = ''; - } - - function setPrompt($promptTitle = "\x00", $promptDescription = "\x00", $showPrompt = true) - { - $this->_showprompt = $showPrompt; - $this->_title_prompt = $promptTitle; - $this->_descr_prompt = $promptDescription; - } - - function setError($errorTitle = "\x00", $errorDescription = "\x00", $showError = true) - { - $this->_showerror = $showError; - $this->_title_error = $errorTitle; - $this->_descr_error = $errorDescription; - } - - function allowBlank() - { - $this->_blank = true; - } - - function onInvalidStop() - { - $this->_style = 0x00; - } - - function onInvalidWarn() - { - $this->_style = 0x01; - } - - function onInvalidInfo() - { - $this->_style = 0x02; - } - - function setFormula1($formula) - { - // Parse the formula using the parser in Parser.php - $error = $this->_parser->parse($formula); - if (PEAR::isError($error)) { - return $this->_formula1; - } - - $this->_formula1 = $this->_parser->toReversePolish(); - if (PEAR::isError($this->_formula1)) { - return $this->_formula1; - } - return true; - } - - function setFormula2($formula) - { - // Parse the formula using the parser in Parser.php - $error = $this->_parser->parse($formula); - if (PEAR::isError($error)) { - return $this->_formula2; - } - - $this->_formula2 = $this->_parser->toReversePolish(); - if (PEAR::isError($this->_formula2)) { - return $this->_formula2; - } - return true; - } - - function _getOptions() - { - $options = $this->_type; - $options |= $this->_style << 3; - if ($this->_fixedList) { - $options |= 0x80; - } - if ($this->_blank) { - $options |= 0x100; - } - if (!$this->_incell) { - $options |= 0x200; - } - if ($this->_showprompt) { - $options |= 0x40000; - } - if ($this->_showerror) { - $options |= 0x80000; - } - $options |= $this->_operator << 20; - - return $options; - } - - function _getData() - { - $title_prompt_len = strlen($this->_title_prompt); - $descr_prompt_len = strlen($this->_descr_prompt); - $title_error_len = strlen($this->_title_error); - $descr_error_len = strlen($this->_descr_error); - - $formula1_size = strlen($this->_formula1); - $formula2_size = strlen($this->_formula2); - - $data = pack("V", $this->_getOptions()); - $data .= pack("vC", $title_prompt_len, 0x00) . $this->_title_prompt; - $data .= pack("vC", $title_error_len, 0x00) . $this->_title_error; - $data .= pack("vC", $descr_prompt_len, 0x00) . $this->_descr_prompt; - $data .= pack("vC", $descr_error_len, 0x00) . $this->_descr_error; - - $data .= pack("vv", $formula1_size, 0x0000) . $this->_formula1; - $data .= pack("vv", $formula2_size, 0x0000) . $this->_formula2; - - return $data; - } -} - -/*class Spreadsheet_Excel_Writer_Validation_List extends Spreadsheet_Excel_Writer_Validation - { - function Spreadsheet_Excel_Writer_Validation_list() - { - parent::Spreadsheet_Excel_Writer_Validation(); - $this->_type = 0x03; - } - - function setList($source, $incell = true) - { - $this->_incell = $incell; - $this->_fixedList = true; - - $source = implode("\x00", $source); - $this->_formula1 = pack("CCC", 0x17, strlen($source), 0x0c) . $source; - } - - function setRow($row, $col1, $col2, $incell = true) - { - $this->_incell = $incell; - //$this->_formula1 = ...; - } - - function setCol($col, $row1, $row2, $incell = true) - { - $this->_incell = $incell; - //$this->_formula1 = ...; - } - }*/ - -?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Workbook.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Workbook.php deleted file mode 100644 index 25b42f66..00000000 --- a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Workbook.php +++ /dev/null @@ -1,1606 +0,0 @@ - - * - * The majority of this is _NOT_ my code. I simply ported it from the - * PERL Spreadsheet::WriteExcel module. - * - * The author of the Spreadsheet::WriteExcel module is John McNamara - * - * - * I _DO_ maintain this code, and John McNamara has nothing to do with the - * porting of this code to PHP. Any questions directly related to this - * class library should be directed to me. - * - * License Information: - * - * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets - * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); -require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Format.php'; -require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php'; -require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Worksheet.php'; -require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Parser.php'; -require_once $homedir.'/classes/pear/OLE/PPS/Root.php'; -require_once $homedir.'/classes/pear/OLE/PPS/File.php'; - -/** - * Class for generating Excel Spreadsheets - * - * @author Xavier Noguer - * @category FileFormats - * @package Spreadsheet_Excel_Writer - */ - -class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwriter -{ - /** - * Filename for the Workbook - * @var string - */ - var $_filename; - - /** - * Formula parser - * @var object Parser - */ - var $_parser; - - /** - * Flag for 1904 date system (0 => base date is 1900, 1 => base date is 1904) - * @var integer - */ - var $_1904; - - /** - * The active worksheet of the workbook (0 indexed) - * @var integer - */ - var $_activesheet; - - /** - * 1st displayed worksheet in the workbook (0 indexed) - * @var integer - */ - var $_firstsheet; - - /** - * Number of workbook tabs selected - * @var integer - */ - var $_selected; - - /** - * Index for creating adding new formats to the workbook - * @var integer - */ - var $_xf_index; - - /** - * Flag for preventing close from being called twice. - * @var integer - * @see close() - */ - var $_fileclosed; - - /** - * The BIFF file size for the workbook. - * @var integer - * @see _calcSheetOffsets() - */ - var $_biffsize; - - /** - * The default sheetname for all sheets created. - * @var string - */ - var $_sheetname; - - /** - * The default XF format. - * @var object Format - */ - var $_tmp_format; - - /** - * Array containing references to all of this workbook's worksheets - * @var array - */ - var $_worksheets; - - /** - * Array of sheetnames for creating the EXTERNSHEET records - * @var array - */ - var $_sheetnames; - - /** - * Array containing references to all of this workbook's formats - * @var array - */ - var $_formats; - - /** - * Array containing the colour palette - * @var array - */ - var $_palette; - - /** - * The default format for URLs. - * @var object Format - */ - var $_url_format; - - /** - * The codepage indicates the text encoding used for strings - * @var integer - */ - var $_codepage; - - /** - * The country code used for localization - * @var integer - */ - var $_country_code; - - /** - * The temporary dir for storing the OLE file - * @var string - */ - var $_tmp_dir; - - /** - * number of bytes for sizeinfo of strings - * @var integer - */ - var $_string_sizeinfo_size; - - /** - * Class constructor - * - * @param string filename for storing the workbook. "-" for writing to stdout. - * @access public - */ - function Spreadsheet_Excel_Writer_Workbook($filename) - { - // It needs to call its parent's constructor explicitly - $this->Spreadsheet_Excel_Writer_BIFFwriter(); - - $this->_filename = $filename; - $this->_parser = new Spreadsheet_Excel_Writer_Parser($this->_byte_order, $this->_BIFF_version); - $this->_1904 = 0; - $this->_activesheet = 0; - $this->_firstsheet = 0; - $this->_selected = 0; - $this->_xf_index = 16; // 15 style XF's and 1 cell XF. - $this->_fileclosed = 0; - $this->_biffsize = 0; - $this->_sheetname = 'Sheet'; - $this->_tmp_format = new Spreadsheet_Excel_Writer_Format($this->_BIFF_version); - $this->_worksheets = array(); - $this->_sheetnames = array(); - $this->_formats = array(); - $this->_palette = array(); - $this->_codepage = 0x04E4; // FIXME: should change for BIFF8 - $this->_country_code = -1; - $this->_string_sizeinfo = 3; - - // Add the default format for hyperlinks - $this->_url_format =& $this->addFormat(array('color' => 'blue', 'underline' => 1)); - $this->_str_total = 0; - $this->_str_unique = 0; - $this->_str_table = array(); - $this->_setPaletteXl97(); - $this->_tmp_dir = ''; - } - - /** - * Calls finalization methods. - * This method should always be the last one to be called on every workbook - * - * @access public - * @return mixed true on success. PEAR_Error on failure - */ - function close() - { - if ($this->_fileclosed) { // Prevent close() from being called twice. - return true; - } - $res = $this->_storeWorkbook(); - if ($this->isError($res)) { - return $this->raiseError($res->getMessage()); - } - $this->_fileclosed = 1; - return true; - } - - /** - * An accessor for the _worksheets[] array - * Returns an array of the worksheet objects in a workbook - * It actually calls to worksheets() - * - * @access public - * @see worksheets() - * @return array - */ - function sheets() - { - return $this->worksheets(); - } - - /** - * An accessor for the _worksheets[] array. - * Returns an array of the worksheet objects in a workbook - * - * @access public - * @return array - */ - function worksheets() - { - return $this->_worksheets; - } - - /** - * Sets the BIFF version. - * This method exists just to access experimental functionality - * from BIFF8. It will be deprecated ! - * Only possible value is 8 (Excel 97/2000). - * For any other value it fails silently. - * - * @access public - * @param integer $version The BIFF version - */ - function setVersion($version) - { - if ($version == 8) { // only accept version 8 - $version = 0x0600; - $this->_BIFF_version = $version; - // change BIFFwriter limit for CONTINUE records - $this->_limit = 8228; - $this->_tmp_format->_BIFF_version = $version; - $this->_url_format->_BIFF_version = $version; - $this->_parser->_BIFF_version = $version; - - $total_worksheets = count($this->_worksheets); - // change version for all worksheets too - for ($i = 0; $i < $total_worksheets; $i++) { - $this->_worksheets[$i]->_BIFF_version = $version; - } - - $total_formats = count($this->_formats); - // change version for all formats too - for ($i = 0; $i < $total_formats; $i++) { - $this->_formats[$i]->_BIFF_version = $version; - } - } - } - - /** - * Set the country identifier for the workbook - * - * @access public - * @param integer $code Is the international calling country code for the - * chosen country. - */ - function setCountry($code) - { - $this->_country_code = $code; - } - - /** - * Add a new worksheet to the Excel workbook. - * If no name is given the name of the worksheet will be Sheeti$i, with - * $i in [1..]. - * - * @access public - * @param string $name the optional name of the worksheet - * @return mixed reference to a worksheet object on success, PEAR_Error - * on failure - */ - function &addWorksheet($name = '') - { - $index = count($this->_worksheets); - $sheetname = $this->_sheetname; - - if ($name == '') { - $name = $sheetname.($index+1); - } - - // Check that sheetname is <= 31 chars (Excel limit before BIFF8). - if ($this->_BIFF_version != 0x0600) - { - if (strlen($name) > 31) { - return $this->raiseError("Sheetname $name must be <= 31 chars"); - } - } - - // Check that the worksheet name doesn't already exist: a fatal Excel error. - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - if ($this->_worksheets[$i]->getName() == $name) { - return $this->raiseError("Worksheet '$name' already exists"); - } - } - - $worksheet = new Spreadsheet_Excel_Writer_Worksheet($this->_BIFF_version, - $name, $index, - $this->_activesheet, $this->_firstsheet, - $this->_str_total, $this->_str_unique, - $this->_str_table, $this->_url_format, - $this->_parser); - - $this->_worksheets[$index] = &$worksheet; // Store ref for iterator - $this->_sheetnames[$index] = $name; // Store EXTERNSHEET names - $this->_parser->setExtSheet($name, $index); // Register worksheet name with parser - return $worksheet; - } - - /** - * Add a new format to the Excel workbook. - * Also, pass any properties to the Format constructor. - * - * @access public - * @param array $properties array with properties for initializing the format. - * @return &Spreadsheet_Excel_Writer_Format reference to an Excel Format - */ - function &addFormat($properties = array()) - { - $format = new Spreadsheet_Excel_Writer_Format($this->_BIFF_version, $this->_xf_index, $properties); - $this->_xf_index += 1; - $this->_formats[] = &$format; - return $format; - } - - /** - * Create new validator. - * - * @access public - * @return &Spreadsheet_Excel_Writer_Validator reference to a Validator - */ - function &addValidator() - { - include_once 'Spreadsheet/Excel/Writer/Validator.php'; - /* FIXME: check for successful inclusion*/ - $valid = new Spreadsheet_Excel_Writer_Validator($this->_parser); - return $valid; - } - - /** - * Change the RGB components of the elements in the colour palette. - * - * @access public - * @param integer $index colour index - * @param integer $red red RGB value [0-255] - * @param integer $green green RGB value [0-255] - * @param integer $blue blue RGB value [0-255] - * @return integer The palette index for the custom color - */ - function setCustomColor($index, $red, $green, $blue) - { - // Match a HTML #xxyyzz style parameter - /*if (defined $_[1] and $_[1] =~ /^#(\w\w)(\w\w)(\w\w)/ ) { - @_ = ($_[0], hex $1, hex $2, hex $3); - }*/ - - // Check that the colour index is the right range - if ($index < 8 or $index > 64) { - // TODO: assign real error codes - return $this->raiseError("Color index $index outside range: 8 <= index <= 64"); - } - - // Check that the colour components are in the right range - if (($red < 0 or $red > 255) || - ($green < 0 or $green > 255) || - ($blue < 0 or $blue > 255)) - { - return $this->raiseError("Color component outside range: 0 <= color <= 255"); - } - - $index -= 8; // Adjust colour index (wingless dragonfly) - - // Set the RGB value - $this->_palette[$index] = array($red, $green, $blue, 0); - return($index + 8); - } - - /** - * Sets the colour palette to the Excel 97+ default. - * - * @access private - */ - function _setPaletteXl97() - { - $this->_palette = array( - array(0x00, 0x00, 0x00, 0x00), // 8 - array(0xff, 0xff, 0xff, 0x00), // 9 - array(0xff, 0x00, 0x00, 0x00), // 10 - array(0x00, 0xff, 0x00, 0x00), // 11 - array(0x00, 0x00, 0xff, 0x00), // 12 - array(0xff, 0xff, 0x00, 0x00), // 13 - array(0xff, 0x00, 0xff, 0x00), // 14 - array(0x00, 0xff, 0xff, 0x00), // 15 - array(0x80, 0x00, 0x00, 0x00), // 16 - array(0x00, 0x80, 0x00, 0x00), // 17 - array(0x00, 0x00, 0x80, 0x00), // 18 - array(0x80, 0x80, 0x00, 0x00), // 19 - array(0x80, 0x00, 0x80, 0x00), // 20 - array(0x00, 0x80, 0x80, 0x00), // 21 - array(0xc0, 0xc0, 0xc0, 0x00), // 22 - array(0x80, 0x80, 0x80, 0x00), // 23 - array(0x99, 0x99, 0xff, 0x00), // 24 - array(0x99, 0x33, 0x66, 0x00), // 25 - array(0xff, 0xff, 0xcc, 0x00), // 26 - array(0xcc, 0xff, 0xff, 0x00), // 27 - array(0x66, 0x00, 0x66, 0x00), // 28 - array(0xff, 0x80, 0x80, 0x00), // 29 - array(0x00, 0x66, 0xcc, 0x00), // 30 - array(0xcc, 0xcc, 0xff, 0x00), // 31 - array(0x00, 0x00, 0x80, 0x00), // 32 - array(0xff, 0x00, 0xff, 0x00), // 33 - array(0xff, 0xff, 0x00, 0x00), // 34 - array(0x00, 0xff, 0xff, 0x00), // 35 - array(0x80, 0x00, 0x80, 0x00), // 36 - array(0x80, 0x00, 0x00, 0x00), // 37 - array(0x00, 0x80, 0x80, 0x00), // 38 - array(0x00, 0x00, 0xff, 0x00), // 39 - array(0x00, 0xcc, 0xff, 0x00), // 40 - array(0xcc, 0xff, 0xff, 0x00), // 41 - array(0xcc, 0xff, 0xcc, 0x00), // 42 - array(0xff, 0xff, 0x99, 0x00), // 43 - array(0x99, 0xcc, 0xff, 0x00), // 44 - array(0xff, 0x99, 0xcc, 0x00), // 45 - array(0xcc, 0x99, 0xff, 0x00), // 46 - array(0xff, 0xcc, 0x99, 0x00), // 47 - array(0x33, 0x66, 0xff, 0x00), // 48 - array(0x33, 0xcc, 0xcc, 0x00), // 49 - array(0x99, 0xcc, 0x00, 0x00), // 50 - array(0xff, 0xcc, 0x00, 0x00), // 51 - array(0xff, 0x99, 0x00, 0x00), // 52 - array(0xff, 0x66, 0x00, 0x00), // 53 - array(0x66, 0x66, 0x99, 0x00), // 54 - array(0x96, 0x96, 0x96, 0x00), // 55 - array(0x00, 0x33, 0x66, 0x00), // 56 - array(0x33, 0x99, 0x66, 0x00), // 57 - array(0x00, 0x33, 0x00, 0x00), // 58 - array(0x33, 0x33, 0x00, 0x00), // 59 - array(0x99, 0x33, 0x00, 0x00), // 60 - array(0x99, 0x33, 0x66, 0x00), // 61 - array(0x33, 0x33, 0x99, 0x00), // 62 - array(0x33, 0x33, 0x33, 0x00), // 63 - ); - } - - /** - * Assemble worksheets into a workbook and send the BIFF data to an OLE - * storage. - * - * @access private - * @return mixed true on success. PEAR_Error on failure - */ - function _storeWorkbook() - { - // Ensure that at least one worksheet has been selected. - if ($this->_activesheet == 0) { - $this->_worksheets[0]->selected = 1; - } - - // Calculate the number of selected worksheet tabs and call the finalization - // methods for each worksheet - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - if ($this->_worksheets[$i]->selected) { - $this->_selected++; - } - $this->_worksheets[$i]->close($this->_sheetnames); - } - - // Add Workbook globals - $this->_storeBof(0x0005); - $this->_storeCodepage(); - if ($this->_BIFF_version == 0x0600) { - $this->_storeWindow1(); - } - if ($this->_BIFF_version == 0x0500) { - $this->_storeExterns(); // For print area and repeat rows - } - $this->_storeNames(); // For print area and repeat rows - if ($this->_BIFF_version == 0x0500) { - $this->_storeWindow1(); - } - $this->_storeDatemode(); - $this->_storeAllFonts(); - $this->_storeAllNumFormats(); - $this->_storeAllXfs(); - $this->_storeAllStyles(); - $this->_storePalette(); - $this->_calcSheetOffsets(); - - // Add BOUNDSHEET records - for ($i = 0; $i < $total_worksheets; $i++) { - $this->_storeBoundsheet($this->_worksheets[$i]->name,$this->_worksheets[$i]->offset); - } - - if ($this->_country_code != -1) { - $this->_storeCountry(); - } - - if ($this->_BIFF_version == 0x0600) { - //$this->_storeSupbookInternal(); - /* TODO: store external SUPBOOK records and XCT and CRN records - in case of external references for BIFF8 */ - //$this->_storeExternsheetBiff8(); - $this->_storeSharedStringsTable(); - } - - // End Workbook globals - $this->_storeEof(); - - // Store the workbook in an OLE container - $res = $this->_storeOLEFile(); - if ($this->isError($res)) { - return $this->raiseError($res->getMessage()); - } - return true; - } - - /** - * Sets the temp dir used for storing the OLE file - * - * @access public - * @param string $dir The dir to be used as temp dir - * @return true if given dir is valid, false otherwise - */ - function setTempDir($dir) - { - if (is_dir($dir)) { - $this->_tmp_dir = $dir; - return true; - } - return false; - } - - /** - * Store the workbook in an OLE container - * - * @access private - * @return mixed true on success. PEAR_Error on failure - */ - function _storeOLEFile() - { - $OLE = new OLE_PPS_File(OLE::Asc2Ucs('Book')); - if ($this->_tmp_dir != '') { - $OLE->setTempDir($this->_tmp_dir); - } - $res = $OLE->init(); - if ($this->isError($res)) { - return $this->raiseError("OLE Error: ".$res->getMessage()); - } - $OLE->append($this->_data); - - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - while ($tmp = $this->_worksheets[$i]->getData()) { - $OLE->append($tmp); - } - } - - $root = new OLE_PPS_Root(time(), time(), array($OLE)); - if ($this->_tmp_dir != '') { - $root->setTempDir($this->_tmp_dir); - } - - $res = $root->save($this->_filename); - if ($this->isError($res)) { - return $this->raiseError("OLE Error: ".$res->getMessage()); - } - return true; - } - - /** - * Calculate offsets for Worksheet BOF records. - * - * @access private - */ - function _calcSheetOffsets() - { - if ($this->_BIFF_version == 0x0600) { - $boundsheet_length = 12; // fixed length for a BOUNDSHEET record - } else { - $boundsheet_length = 11; - } - $EOF = 4; - $offset = $this->_datasize; - - if ($this->_BIFF_version == 0x0600) { - // add the length of the SST - /* TODO: check this works for a lot of strings (> 8224 bytes) */ - $offset += $this->_calculateSharedStringsSizes(); - if ($this->_country_code != -1) { - $offset += 8; // adding COUNTRY record - } - // add the lenght of SUPBOOK, EXTERNSHEET and NAME records - //$offset += 8; // FIXME: calculate real value when storing the records - } - $total_worksheets = count($this->_worksheets); - // add the length of the BOUNDSHEET records - for ($i = 0; $i < $total_worksheets; $i++) { - $offset += $boundsheet_length + strlen($this->_worksheets[$i]->name); - } - $offset += $EOF; - - for ($i = 0; $i < $total_worksheets; $i++) { - $this->_worksheets[$i]->offset = $offset; - $offset += $this->_worksheets[$i]->_datasize; - } - $this->_biffsize = $offset; - } - - /** - * Store the Excel FONT records. - * - * @access private - */ - function _storeAllFonts() - { - // tmp_format is added by the constructor. We use this to write the default XF's - $format = $this->_tmp_format; - $font = $format->getFont(); - - // Note: Fonts are 0-indexed. According to the SDK there is no index 4, - // so the following fonts are 0, 1, 2, 3, 5 - // - for ($i = 1; $i <= 5; $i++){ - $this->_append($font); - } - - // Iterate through the XF objects and write a FONT record if it isn't the - // same as the default FONT and if it hasn't already been used. - // - $fonts = array(); - $index = 6; // The first user defined FONT - - $key = $format->getFontKey(); // The default font from _tmp_format - $fonts[$key] = 0; // Index of the default font - - $total_formats = count($this->_formats); - for ($i = 0; $i < $total_formats; $i++) { - $key = $this->_formats[$i]->getFontKey(); - if (isset($fonts[$key])) { - // FONT has already been used - $this->_formats[$i]->font_index = $fonts[$key]; - } else { - // Add a new FONT record - $fonts[$key] = $index; - $this->_formats[$i]->font_index = $index; - $index++; - $font = $this->_formats[$i]->getFont(); - $this->_append($font); - } - } - } - - /** - * Store user defined numerical formats i.e. FORMAT records - * - * @access private - */ - function _storeAllNumFormats() - { - // Leaning num_format syndrome - $hash_num_formats = array(); - $num_formats = array(); - $index = 164; - - // Iterate through the XF objects and write a FORMAT record if it isn't a - // built-in format type and if the FORMAT string hasn't already been used. - $total_formats = count($this->_formats); - for ($i = 0; $i < $total_formats; $i++) { - $num_format = $this->_formats[$i]->_num_format; - - // Check if $num_format is an index to a built-in format. - // Also check for a string of zeros, which is a valid format string - // but would evaluate to zero. - // - if (!preg_match("/^0+\d/", $num_format)) { - if (preg_match("/^\d+$/", $num_format)) { // built-in format - continue; - } - } - - if (isset($hash_num_formats[$num_format])) { - // FORMAT has already been used - $this->_formats[$i]->_num_format = $hash_num_formats[$num_format]; - } else{ - // Add a new FORMAT - $hash_num_formats[$num_format] = $index; - $this->_formats[$i]->_num_format = $index; - array_push($num_formats,$num_format); - $index++; - } - } - - // Write the new FORMAT records starting from 0xA4 - $index = 164; - foreach ($num_formats as $num_format) { - $this->_storeNumFormat($num_format,$index); - $index++; - } - } - - /** - * Write all XF records. - * - * @access private - */ - function _storeAllXfs() - { - // _tmp_format is added by the constructor. We use this to write the default XF's - // The default font index is 0 - // - $format = $this->_tmp_format; - for ($i = 0; $i <= 14; $i++) { - $xf = $format->getXf('style'); // Style XF - $this->_append($xf); - } - - $xf = $format->getXf('cell'); // Cell XF - $this->_append($xf); - - // User defined XFs - $total_formats = count($this->_formats); - for ($i = 0; $i < $total_formats; $i++) { - $xf = $this->_formats[$i]->getXf('cell'); - $this->_append($xf); - } - } - - /** - * Write all STYLE records. - * - * @access private - */ - function _storeAllStyles() - { - $this->_storeStyle(); - } - - /** - * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for - * the NAME records. - * - * @access private - */ - function _storeExterns() - { - // Create EXTERNCOUNT with number of worksheets - $this->_storeExterncount(count($this->_worksheets)); - - // Create EXTERNSHEET for each worksheet - foreach ($this->_sheetnames as $sheetname) { - $this->_storeExternsheet($sheetname); - } - } - - /** - * Write the NAME record to define the print area and the repeat rows and cols. - * - * @access private - */ - function _storeNames() - { - // Create the print area NAME records - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - // Write a Name record if the print area has been defined - if (isset($this->_worksheets[$i]->print_rowmin)) { - $this->_storeNameShort( - $this->_worksheets[$i]->index, - 0x06, // NAME type - $this->_worksheets[$i]->print_rowmin, - $this->_worksheets[$i]->print_rowmax, - $this->_worksheets[$i]->print_colmin, - $this->_worksheets[$i]->print_colmax - ); - } - } - - // Create the print title NAME records - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - $rowmin = $this->_worksheets[$i]->title_rowmin; - $rowmax = $this->_worksheets[$i]->title_rowmax; - $colmin = $this->_worksheets[$i]->title_colmin; - $colmax = $this->_worksheets[$i]->title_colmax; - - // Determine if row + col, row, col or nothing has been defined - // and write the appropriate record - // - if (isset($rowmin) && isset($colmin)) { - // Row and column titles have been defined. - // Row title has been defined. - $this->_storeNameLong( - $this->_worksheets[$i]->index, - 0x07, // NAME type - $rowmin, - $rowmax, - $colmin, - $colmax - ); - } elseif (isset($rowmin)) { - // Row title has been defined. - $this->_storeNameShort( - $this->_worksheets[$i]->index, - 0x07, // NAME type - $rowmin, - $rowmax, - 0x00, - 0xff - ); - } elseif (isset($colmin)) { - // Column title has been defined. - $this->_storeNameShort( - $this->_worksheets[$i]->index, - 0x07, // NAME type - 0x0000, - 0x3fff, - $colmin, - $colmax - ); - } else { - // Print title hasn't been defined. - } - } - } - - - - - /****************************************************************************** - * - * BIFF RECORDS - * - */ - - /** - * Stores the CODEPAGE biff record. - * - * @access private - */ - function _storeCodepage() - { - $record = 0x0042; // Record identifier - $length = 0x0002; // Number of bytes to follow - $cv = $this->_codepage; // The code page - - $header = pack('vv', $record, $length); - $data = pack('v', $cv); - - $this->_append($header . $data); - } - - /** - * Write Excel BIFF WINDOW1 record. - * - * @access private - */ - function _storeWindow1() - { - $record = 0x003D; // Record identifier - $length = 0x0012; // Number of bytes to follow - - $xWn = 0x0000; // Horizontal position of window - $yWn = 0x0000; // Vertical position of window - $dxWn = 0x25BC; // Width of window - $dyWn = 0x1572; // Height of window - - $grbit = 0x0038; // Option flags - $ctabsel = $this->_selected; // Number of workbook tabs selected - $wTabRatio = 0x0258; // Tab to scrollbar ratio - - $itabFirst = $this->_firstsheet; // 1st displayed worksheet - $itabCur = $this->_activesheet; // Active worksheet - - $header = pack("vv", $record, $length); - $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, - $grbit, - $itabCur, $itabFirst, - $ctabsel, $wTabRatio); - $this->_append($header . $data); - } - - /** - * Writes Excel BIFF BOUNDSHEET record. - * FIXME: inconsistent with BIFF documentation - * - * @param string $sheetname Worksheet name - * @param integer $offset Location of worksheet BOF - * @access private - */ - function _storeBoundsheet($sheetname,$offset) - { - $record = 0x0085; // Record identifier - if ($this->_BIFF_version == 0x0600) { - $length = 0x08 + strlen($sheetname); // Number of bytes to follow - } else { - $length = 0x07 + strlen($sheetname); // Number of bytes to follow - } - - $grbit = 0x0000; // Visibility and sheet type - $cch = strlen($sheetname); // Length of sheet name - - $header = pack("vv", $record, $length); - if ($this->_BIFF_version == 0x0600) { - $data = pack("Vvv", $offset, $grbit, $cch); - } else { - $data = pack("VvC", $offset, $grbit, $cch); - } - $this->_append($header.$data.$sheetname); - } - - /** - * Write Internal SUPBOOK record - * - * @access private - */ - function _storeSupbookInternal() - { - $record = 0x01AE; // Record identifier - $length = 0x0004; // Bytes to follow - - $header = pack("vv", $record, $length); - $data = pack("vv", count($this->_worksheets), 0x0104); - $this->_append($header . $data); - } - - /** - * Writes the Excel BIFF EXTERNSHEET record. These references are used by - * formulas. - * - * @param string $sheetname Worksheet name - * @access private - */ - function _storeExternsheetBiff8() - { - $total_references = count($this->_parser->_references); - $record = 0x0017; // Record identifier - $length = 2 + 6 * $total_references; // Number of bytes to follow - - $supbook_index = 0; // FIXME: only using internal SUPBOOK record - $header = pack("vv", $record, $length); - $data = pack('v', $total_references); - for ($i = 0; $i < $total_references; $i++) { - $data .= $this->_parser->_references[$i]; - } - $this->_append($header . $data); - } - - /** - * Write Excel BIFF STYLE records. - * - * @access private - */ - function _storeStyle() - { - $record = 0x0293; // Record identifier - $length = 0x0004; // Bytes to follow - - $ixfe = 0x8000; // Index to style XF - $BuiltIn = 0x00; // Built-in style - $iLevel = 0xff; // Outline style level - - $header = pack("vv", $record, $length); - $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); - $this->_append($header . $data); - } - - - /** - * Writes Excel FORMAT record for non "built-in" numerical formats. - * - * @param string $format Custom format string - * @param integer $ifmt Format index code - * @access private - */ - function _storeNumFormat($format, $ifmt) - { - $record = 0x041E; // Record identifier - - if ($this->_BIFF_version == 0x0600) { - $length = 5 + strlen($format); // Number of bytes to follow - $encoding = 0x0; - } elseif ($this->_BIFF_version == 0x0500) { - $length = 3 + strlen($format); // Number of bytes to follow - } - - $cch = strlen($format); // Length of format string - - $header = pack("vv", $record, $length); - if ($this->_BIFF_version == 0x0600) { - $data = pack("vvC", $ifmt, $cch, $encoding); - } elseif ($this->_BIFF_version == 0x0500) { - $data = pack("vC", $ifmt, $cch); - } - $this->_append($header . $data . $format); - } - - /** - * Write DATEMODE record to indicate the date system in use (1904 or 1900). - * - * @access private - */ - function _storeDatemode() - { - $record = 0x0022; // Record identifier - $length = 0x0002; // Bytes to follow - - $f1904 = $this->_1904; // Flag for 1904 date system - - $header = pack("vv", $record, $length); - $data = pack("v", $f1904); - $this->_append($header . $data); - } - - - /** - * Write BIFF record EXTERNCOUNT to indicate the number of external sheet - * references in the workbook. - * - * Excel only stores references to external sheets that are used in NAME. - * The workbook NAME record is required to define the print area and the repeat - * rows and columns. - * - * A similar method is used in Worksheet.php for a slightly different purpose. - * - * @param integer $cxals Number of external references - * @access private - */ - function _storeExterncount($cxals) - { - $record = 0x0016; // Record identifier - $length = 0x0002; // Number of bytes to follow - - $header = pack("vv", $record, $length); - $data = pack("v", $cxals); - $this->_append($header . $data); - } - - - /** - * Writes the Excel BIFF EXTERNSHEET record. These references are used by - * formulas. NAME record is required to define the print area and the repeat - * rows and columns. - * - * A similar method is used in Worksheet.php for a slightly different purpose. - * - * @param string $sheetname Worksheet name - * @access private - */ - function _storeExternsheet($sheetname) - { - $record = 0x0017; // Record identifier - $length = 0x02 + strlen($sheetname); // Number of bytes to follow - - $cch = strlen($sheetname); // Length of sheet name - $rgch = 0x03; // Filename encoding - - $header = pack("vv", $record, $length); - $data = pack("CC", $cch, $rgch); - $this->_append($header . $data . $sheetname); - } - - - /** - * Store the NAME record in the short format that is used for storing the print - * area, repeat rows only and repeat columns only. - * - * @param integer $index Sheet index - * @param integer $type Built-in name type - * @param integer $rowmin Start row - * @param integer $rowmax End row - * @param integer $colmin Start colum - * @param integer $colmax End column - * @access private - */ - function _storeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax) - { - $record = 0x0018; // Record identifier - $length = 0x0024; // Number of bytes to follow - - $grbit = 0x0020; // Option flags - $chKey = 0x00; // Keyboard shortcut - $cch = 0x01; // Length of text name - $cce = 0x0015; // Length of text definition - $ixals = $index + 1; // Sheet index - $itab = $ixals; // Equal to ixals - $cchCustMenu = 0x00; // Length of cust menu text - $cchDescription = 0x00; // Length of description text - $cchHelptopic = 0x00; // Length of help topic text - $cchStatustext = 0x00; // Length of status bar text - $rgch = $type; // Built-in name type - - $unknown03 = 0x3b; - $unknown04 = 0xffff-$index; - $unknown05 = 0x0000; - $unknown06 = 0x0000; - $unknown07 = 0x1087; - $unknown08 = 0x8005; - - $header = pack("vv", $record, $length); - $data = pack("v", $grbit); - $data .= pack("C", $chKey); - $data .= pack("C", $cch); - $data .= pack("v", $cce); - $data .= pack("v", $ixals); - $data .= pack("v", $itab); - $data .= pack("C", $cchCustMenu); - $data .= pack("C", $cchDescription); - $data .= pack("C", $cchHelptopic); - $data .= pack("C", $cchStatustext); - $data .= pack("C", $rgch); - $data .= pack("C", $unknown03); - $data .= pack("v", $unknown04); - $data .= pack("v", $unknown05); - $data .= pack("v", $unknown06); - $data .= pack("v", $unknown07); - $data .= pack("v", $unknown08); - $data .= pack("v", $index); - $data .= pack("v", $index); - $data .= pack("v", $rowmin); - $data .= pack("v", $rowmax); - $data .= pack("C", $colmin); - $data .= pack("C", $colmax); - $this->_append($header . $data); - } - - - /** - * Store the NAME record in the long format that is used for storing the repeat - * rows and columns when both are specified. This shares a lot of code with - * _storeNameShort() but we use a separate method to keep the code clean. - * Code abstraction for reuse can be carried too far, and I should know. ;-) - * - * @param integer $index Sheet index - * @param integer $type Built-in name type - * @param integer $rowmin Start row - * @param integer $rowmax End row - * @param integer $colmin Start colum - * @param integer $colmax End column - * @access private - */ - function _storeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax) - { - $record = 0x0018; // Record identifier - $length = 0x003d; // Number of bytes to follow - $grbit = 0x0020; // Option flags - $chKey = 0x00; // Keyboard shortcut - $cch = 0x01; // Length of text name - $cce = 0x002e; // Length of text definition - $ixals = $index + 1; // Sheet index - $itab = $ixals; // Equal to ixals - $cchCustMenu = 0x00; // Length of cust menu text - $cchDescription = 0x00; // Length of description text - $cchHelptopic = 0x00; // Length of help topic text - $cchStatustext = 0x00; // Length of status bar text - $rgch = $type; // Built-in name type - - $unknown01 = 0x29; - $unknown02 = 0x002b; - $unknown03 = 0x3b; - $unknown04 = 0xffff-$index; - $unknown05 = 0x0000; - $unknown06 = 0x0000; - $unknown07 = 0x1087; - $unknown08 = 0x8008; - - $header = pack("vv", $record, $length); - $data = pack("v", $grbit); - $data .= pack("C", $chKey); - $data .= pack("C", $cch); - $data .= pack("v", $cce); - $data .= pack("v", $ixals); - $data .= pack("v", $itab); - $data .= pack("C", $cchCustMenu); - $data .= pack("C", $cchDescription); - $data .= pack("C", $cchHelptopic); - $data .= pack("C", $cchStatustext); - $data .= pack("C", $rgch); - $data .= pack("C", $unknown01); - $data .= pack("v", $unknown02); - // Column definition - $data .= pack("C", $unknown03); - $data .= pack("v", $unknown04); - $data .= pack("v", $unknown05); - $data .= pack("v", $unknown06); - $data .= pack("v", $unknown07); - $data .= pack("v", $unknown08); - $data .= pack("v", $index); - $data .= pack("v", $index); - $data .= pack("v", 0x0000); - $data .= pack("v", 0x3fff); - $data .= pack("C", $colmin); - $data .= pack("C", $colmax); - // Row definition - $data .= pack("C", $unknown03); - $data .= pack("v", $unknown04); - $data .= pack("v", $unknown05); - $data .= pack("v", $unknown06); - $data .= pack("v", $unknown07); - $data .= pack("v", $unknown08); - $data .= pack("v", $index); - $data .= pack("v", $index); - $data .= pack("v", $rowmin); - $data .= pack("v", $rowmax); - $data .= pack("C", 0x00); - $data .= pack("C", 0xff); - // End of data - $data .= pack("C", 0x10); - $this->_append($header . $data); - } - - /** - * Stores the COUNTRY record for localization - * - * @access private - */ - function _storeCountry() - { - $record = 0x008C; // Record identifier - $length = 4; // Number of bytes to follow - - $header = pack('vv', $record, $length); - /* using the same country code always for simplicity */ - $data = pack('vv', $this->_country_code, $this->_country_code); - $this->_append($header . $data); - } - - /** - * Stores the PALETTE biff record. - * - * @access private - */ - function _storePalette() - { - $aref = $this->_palette; - - $record = 0x0092; // Record identifier - $length = 2 + 4 * count($aref); // Number of bytes to follow - $ccv = count($aref); // Number of RGB values to follow - $data = ''; // The RGB data - - // Pack the RGB data - foreach ($aref as $color) { - foreach ($color as $byte) { - $data .= pack("C",$byte); - } - } - - $header = pack("vvv", $record, $length, $ccv); - $this->_append($header . $data); - } - - /** - * Calculate - * Handling of the SST continue blocks is complicated by the need to include an - * additional continuation byte depending on whether the string is split between - * blocks or whether it starts at the beginning of the block. (There are also - * additional complications that will arise later when/if Rich Strings are - * supported). - * - * @access private - */ - function _calculateSharedStringsSizes() - { - /* Iterate through the strings to calculate the CONTINUE block sizes. - For simplicity we use the same size for the SST and CONTINUE records: - 8228 : Maximum Excel97 block size - -4 : Length of block header - -8 : Length of additional SST header information - -8 : Arbitrary number to keep within _add_continue() limit - = 8208 - */ - $continue_limit = 8208; - $block_length = 0; - $written = 0; - $this->_block_sizes = array(); - $continue = 0; - - foreach (array_keys($this->_str_table) as $string) { - $string_length = strlen($string); - $headerinfo = unpack("vlength/Cencoding", $string); - $encoding = $headerinfo["encoding"]; - $split_string = 0; - - // Block length is the total length of the strings that will be - // written out in a single SST or CONTINUE block. - $block_length += $string_length; - - // We can write the string if it doesn't cross a CONTINUE boundary - if ($block_length < $continue_limit) { - $written += $string_length; - continue; - } - - // Deal with the cases where the next string to be written will exceed - // the CONTINUE boundary. If the string is very long it may need to be - // written in more than one CONTINUE record. - while ($block_length >= $continue_limit) { - - // We need to avoid the case where a string is continued in the first - // n bytes that contain the string header information. - $header_length = 3; // Min string + header size -1 - $space_remaining = $continue_limit - $written - $continue; - - - /* TODO: Unicode data should only be split on char (2 byte) - boundaries. Therefore, in some cases we need to reduce the - amount of available - */ - $align = 0; - - # Only applies to Unicode strings - if ($encoding == 1) { - # Min string + header size -1 - $header_length = 4; - - if ($space_remaining > $header_length) { - # String contains 3 byte header => split on odd boundary - if (!$split_string && $space_remaining % 2 != 1) { - $space_remaining--; - $align = 1; - } - # Split section without header => split on even boundary - else if ($split_string && $space_remaining % 2 == 1) { - $space_remaining--; - $align = 1; - } - - $split_string = 1; - } - } - - - if ($space_remaining > $header_length) { - // Write as much as possible of the string in the current block - $written += $space_remaining; - - // Reduce the current block length by the amount written - $block_length -= $continue_limit - $continue - $align; - - // Store the max size for this block - $this->_block_sizes[] = $continue_limit - $align; - - // If the current string was split then the next CONTINUE block - // should have the string continue flag (grbit) set unless the - // split string fits exactly into the remaining space. - if ($block_length > 0) { - $continue = 1; - } else { - $continue = 0; - } - } else { - // Store the max size for this block - $this->_block_sizes[] = $written + $continue; - - // Not enough space to start the string in the current block - $block_length -= $continue_limit - $space_remaining - $continue; - $continue = 0; - - } - - // If the string (or substr) is small enough we can write it in the - // new CONTINUE block. Else, go through the loop again to write it in - // one or more CONTINUE blocks - if ($block_length < $continue_limit) { - $written = $block_length; - } else { - $written = 0; - } - } - } - - // Store the max size for the last block unless it is empty - if ($written + $continue) { - $this->_block_sizes[] = $written + $continue; - } - - - /* Calculate the total length of the SST and associated CONTINUEs (if any). - The SST record will have a length even if it contains no strings. - This length is required to set the offsets in the BOUNDSHEET records since - they must be written before the SST records - */ - - $tmp_block_sizes = array(); - $tmp_block_sizes = $this->_block_sizes; - - $length = 12; - if (!empty($tmp_block_sizes)) { - $length += array_shift($tmp_block_sizes); # SST - } - while (!empty($tmp_block_sizes)) { - $length += 4 + array_shift($tmp_block_sizes); # CONTINUEs - } - - return $length; - } - - /** - * Write all of the workbooks strings into an indexed array. - * See the comments in _calculate_shared_string_sizes() for more information. - * - * The Excel documentation says that the SST record should be followed by an - * EXTSST record. The EXTSST record is a hash table that is used to optimise - * access to SST. However, despite the documentation it doesn't seem to be - * required so we will ignore it. - * - * @access private - */ - function _storeSharedStringsTable() - { - $record = 0x00fc; // Record identifier - $length = 0x0008; // Number of bytes to follow - $total = 0x0000; - - // Iterate through the strings to calculate the CONTINUE block sizes - $continue_limit = 8208; - $block_length = 0; - $written = 0; - $continue = 0; - - // sizes are upside down - $tmp_block_sizes = $this->_block_sizes; - // $tmp_block_sizes = array_reverse($this->_block_sizes); - - # The SST record is required even if it contains no strings. Thus we will - # always have a length - # - if (!empty($tmp_block_sizes)) { - $length = 8 + array_shift($tmp_block_sizes); - } - else { - # No strings - $length = 8; - } - - - - // Write the SST block header information - $header = pack("vv", $record, $length); - $data = pack("VV", $this->_str_total, $this->_str_unique); - $this->_append($header . $data); - - - - - /* TODO: not good for performance */ - foreach (array_keys($this->_str_table) as $string) { - - $string_length = strlen($string); - $headerinfo = unpack("vlength/Cencoding", $string); - $encoding = $headerinfo["encoding"]; - $split_string = 0; - - // Block length is the total length of the strings that will be - // written out in a single SST or CONTINUE block. - // - $block_length += $string_length; - - - // We can write the string if it doesn't cross a CONTINUE boundary - if ($block_length < $continue_limit) { - $this->_append($string); - $written += $string_length; - continue; - } - - // Deal with the cases where the next string to be written will exceed - // the CONTINUE boundary. If the string is very long it may need to be - // written in more than one CONTINUE record. - // - while ($block_length >= $continue_limit) { - - // We need to avoid the case where a string is continued in the first - // n bytes that contain the string header information. - // - $header_length = 3; // Min string + header size -1 - $space_remaining = $continue_limit - $written - $continue; - - - // Unicode data should only be split on char (2 byte) boundaries. - // Therefore, in some cases we need to reduce the amount of available - // space by 1 byte to ensure the correct alignment. - $align = 0; - - // Only applies to Unicode strings - if ($encoding == 1) { - // Min string + header size -1 - $header_length = 4; - - if ($space_remaining > $header_length) { - // String contains 3 byte header => split on odd boundary - if (!$split_string && $space_remaining % 2 != 1) { - $space_remaining--; - $align = 1; - } - // Split section without header => split on even boundary - else if ($split_string && $space_remaining % 2 == 1) { - $space_remaining--; - $align = 1; - } - - $split_string = 1; - } - } - - - if ($space_remaining > $header_length) { - // Write as much as possible of the string in the current block - $tmp = substr($string, 0, $space_remaining); - $this->_append($tmp); - - // The remainder will be written in the next block(s) - $string = substr($string, $space_remaining); - - // Reduce the current block length by the amount written - $block_length -= $continue_limit - $continue - $align; - - // If the current string was split then the next CONTINUE block - // should have the string continue flag (grbit) set unless the - // split string fits exactly into the remaining space. - // - if ($block_length > 0) { - $continue = 1; - } else { - $continue = 0; - } - } else { - // Not enough space to start the string in the current block - $block_length -= $continue_limit - $space_remaining - $continue; - $continue = 0; - } - - // Write the CONTINUE block header - if (!empty($this->_block_sizes)) { - $record = 0x003C; - $length = array_shift($tmp_block_sizes); - - $header = pack('vv', $record, $length); - if ($continue) { - $header .= pack('C', $encoding); - } - $this->_append($header); - } - - // If the string (or substr) is small enough we can write it in the - // new CONTINUE block. Else, go through the loop again to write it in - // one or more CONTINUE blocks - // - if ($block_length < $continue_limit) { - $this->_append($string); - $written = $block_length; - } else { - $written = 0; - } - } - } - } -} -?> diff --git a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Worksheet.php b/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Worksheet.php deleted file mode 100644 index aadf3ed3..00000000 --- a/include/limesurvey/admin/classes/pear/Spreadsheet/Excel/Writer/Worksheet.php +++ /dev/null @@ -1,3504 +0,0 @@ - - * - * The majority of this is _NOT_ my code. I simply ported it from the - * PERL Spreadsheet::WriteExcel module. - * - * The author of the Spreadsheet::WriteExcel module is John McNamara - * - * - * I _DO_ maintain this code, and John McNamara has nothing to do with the - * porting of this code to PHP. Any questions directly related to this - * class library should be directed to me. - * - * License Information: - * - * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets - * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} -if (!isset($homedir)) die(); -require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/Parser.php'; -require_once $homedir.'/classes/pear/Spreadsheet/Excel/Writer/BIFFwriter.php'; - -/** - * Class for generating Excel Spreadsheets - * - * @author Xavier Noguer - * @category FileFormats - * @package Spreadsheet_Excel_Writer - */ - -class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwriter -{ - /** - * Name of the Worksheet - * @var string - */ - var $name; - - /** - * Index for the Worksheet - * @var integer - */ - var $index; - - /** - * Reference to the (default) Format object for URLs - * @var object Format - */ - var $_url_format; - - /** - * Reference to the parser used for parsing formulas - * @var object Format - */ - var $_parser; - - /** - * Filehandle to the temporary file for storing data - * @var resource - */ - var $_filehandle; - - /** - * Boolean indicating if we are using a temporary file for storing data - * @var bool - */ - var $_using_tmpfile; - - /** - * Maximum number of rows for an Excel spreadsheet (BIFF5) - * @var integer - */ - var $_xls_rowmax; - - /** - * Maximum number of columns for an Excel spreadsheet (BIFF5) - * @var integer - */ - var $_xls_colmax; - - /** - * Maximum number of characters for a string (LABEL record in BIFF5) - * @var integer - */ - var $_xls_strmax; - - /** - * First row for the DIMENSIONS record - * @var integer - * @see _storeDimensions() - */ - var $_dim_rowmin; - - /** - * Last row for the DIMENSIONS record - * @var integer - * @see _storeDimensions() - */ - var $_dim_rowmax; - - /** - * First column for the DIMENSIONS record - * @var integer - * @see _storeDimensions() - */ - var $_dim_colmin; - - /** - * Last column for the DIMENSIONS record - * @var integer - * @see _storeDimensions() - */ - var $_dim_colmax; - - /** - * Array containing format information for columns - * @var array - */ - var $_colinfo; - - /** - * Array containing the selected area for the worksheet - * @var array - */ - var $_selection; - - /** - * Array containing the panes for the worksheet - * @var array - */ - var $_panes; - - /** - * The active pane for the worksheet - * @var integer - */ - var $_active_pane; - - /** - * Bit specifying if panes are frozen - * @var integer - */ - var $_frozen; - - /** - * Bit specifying if the worksheet is selected - * @var integer - */ - var $selected; - - /** - * The paper size (for printing) (DOCUMENT!!!) - * @var integer - */ - var $_paper_size; - - /** - * Bit specifying paper orientation (for printing). 0 => landscape, 1 => portrait - * @var integer - */ - var $_orientation; - - /** - * The page header caption - * @var string - */ - var $_header; - - /** - * The page footer caption - * @var string - */ - var $_footer; - - /** - * The horizontal centering value for the page - * @var integer - */ - var $_hcenter; - - /** - * The vertical centering value for the page - * @var integer - */ - var $_vcenter; - - /** - * The margin for the header - * @var float - */ - var $_margin_head; - - /** - * The margin for the footer - * @var float - */ - var $_margin_foot; - - /** - * The left margin for the worksheet in inches - * @var float - */ - var $_margin_left; - - /** - * The right margin for the worksheet in inches - * @var float - */ - var $_margin_right; - - /** - * The top margin for the worksheet in inches - * @var float - */ - var $_margin_top; - - /** - * The bottom margin for the worksheet in inches - * @var float - */ - var $_margin_bottom; - - /** - * First row to reapeat on each printed page - * @var integer - */ - var $title_rowmin; - - /** - * Last row to reapeat on each printed page - * @var integer - */ - var $title_rowmax; - - /** - * First column to reapeat on each printed page - * @var integer - */ - var $title_colmin; - - /** - * First row of the area to print - * @var integer - */ - var $print_rowmin; - - /** - * Last row to of the area to print - * @var integer - */ - var $print_rowmax; - - /** - * First column of the area to print - * @var integer - */ - var $print_colmin; - - /** - * Last column of the area to print - * @var integer - */ - var $print_colmax; - - /** - * Whether to use outline. - * @var integer - */ - var $_outline_on; - - /** - * Auto outline styles. - * @var bool - */ - var $_outline_style; - - /** - * Whether to have outline summary below. - * @var bool - */ - var $_outline_below; - - /** - * Whether to have outline summary at the right. - * @var bool - */ - var $_outline_right; - - /** - * Outline row level. - * @var integer - */ - var $_outline_row_level; - - /** - * Whether to fit to page when printing or not. - * @var bool - */ - var $_fit_page; - - /** - * Number of pages to fit wide - * @var integer - */ - var $_fit_width; - - /** - * Number of pages to fit high - * @var integer - */ - var $_fit_height; - - /** - * Reference to the total number of strings in the workbook - * @var integer - */ - var $_str_total; - - /** - * Reference to the number of unique strings in the workbook - * @var integer - */ - var $_str_unique; - - /** - * Reference to the array containing all the unique strings in the workbook - * @var array - */ - var $_str_table; - - /** - * Merged cell ranges - * @var array - */ - var $_merged_ranges; - - /** - * Charset encoding currently used when calling writeString() - * @var string - */ - var $_input_encoding; - - /** - * Constructor - * - * @param string $name The name of the new worksheet - * @param integer $index The index of the new worksheet - * @param mixed &$activesheet The current activesheet of the workbook we belong to - * @param mixed &$firstsheet The first worksheet in the workbook we belong to - * @param mixed &$url_format The default format for hyperlinks - * @param mixed &$parser The formula parser created for the Workbook - * @access private - */ - function Spreadsheet_Excel_Writer_Worksheet($BIFF_version, $name, - $index, &$activesheet, - &$firstsheet, &$str_total, - &$str_unique, &$str_table, - &$url_format, &$parser) - { - // It needs to call its parent's constructor explicitly - $this->Spreadsheet_Excel_Writer_BIFFwriter(); - $this->_BIFF_version = $BIFF_version; - $rowmax = 65536; // 16384 in Excel 5 - $colmax = 256; - - $this->name = $name; - $this->index = $index; - $this->activesheet = &$activesheet; - $this->firstsheet = &$firstsheet; - $this->_str_total = &$str_total; - $this->_str_unique = &$str_unique; - $this->_str_table = &$str_table; - $this->_url_format = &$url_format; - $this->_parser = &$parser; - - //$this->ext_sheets = array(); - $this->_filehandle = ''; - $this->_using_tmpfile = true; - //$this->fileclosed = 0; - //$this->offset = 0; - $this->_xls_rowmax = $rowmax; - $this->_xls_colmax = $colmax; - $this->_xls_strmax = 255; - $this->_dim_rowmin = $rowmax + 1; - $this->_dim_rowmax = 0; - $this->_dim_colmin = $colmax + 1; - $this->_dim_colmax = 0; - $this->_colinfo = array(); - $this->_selection = array(0,0,0,0); - $this->_panes = array(); - $this->_active_pane = 3; - $this->_frozen = 0; - $this->selected = 0; - - $this->_paper_size = 0x0; - $this->_orientation = 0x1; - $this->_header = ''; - $this->_footer = ''; - $this->_hcenter = 0; - $this->_vcenter = 0; - $this->_margin_head = 0.50; - $this->_margin_foot = 0.50; - $this->_margin_left = 0.75; - $this->_margin_right = 0.75; - $this->_margin_top = 1.00; - $this->_margin_bottom = 1.00; - - $this->title_rowmin = null; - $this->title_rowmax = null; - $this->title_colmin = null; - $this->title_colmax = null; - $this->print_rowmin = null; - $this->print_rowmax = null; - $this->print_colmin = null; - $this->print_colmax = null; - - $this->_print_gridlines = 1; - $this->_screen_gridlines = 1; - $this->_print_headers = 0; - - $this->_fit_page = 0; - $this->_fit_width = 0; - $this->_fit_height = 0; - - $this->_hbreaks = array(); - $this->_vbreaks = array(); - - $this->_protect = 0; - $this->_password = null; - - $this->col_sizes = array(); - $this->_row_sizes = array(); - - $this->_zoom = 100; - $this->_print_scale = 100; - - $this->_outline_row_level = 0; - $this->_outline_style = 0; - $this->_outline_below = 1; - $this->_outline_right = 1; - $this->_outline_on = 1; - - $this->_merged_ranges = array(); - - $this->_input_encoding = ''; - - $this->_dv = array(); - - $this->_initialize(); - } - - /** - * Open a tmp file to store the majority of the Worksheet data. If this fails, - * for example due to write permissions, store the data in memory. This can be - * slow for large files. - * - * @access private - */ - function _initialize() - { - // Open tmp file for storing Worksheet data - $fh = @tmpfile(); - if ($fh) { - // Store filehandle - $this->_filehandle = $fh; - } else { - // If tmpfile() fails store data in memory - $this->_using_tmpfile = false; - } - } - - /** - * Add data to the beginning of the workbook (note the reverse order) - * and to the end of the workbook. - * - * @access public - * @see Spreadsheet_Excel_Writer_Workbook::storeWorkbook() - * @param array $sheetnames The array of sheetnames from the Workbook this - * worksheet belongs to - */ - function close($sheetnames) - { - $num_sheets = count($sheetnames); - - /*********************************************** - * Prepend in reverse order!! - */ - - // Prepend the sheet dimensions - $this->_storeDimensions(); - - // Prepend the sheet password - $this->_storePassword(); - - // Prepend the sheet protection - $this->_storeProtect(); - - // Prepend the page setup - $this->_storeSetup(); - - /* FIXME: margins are actually appended */ - // Prepend the bottom margin - $this->_storeMarginBottom(); - - // Prepend the top margin - $this->_storeMarginTop(); - - // Prepend the right margin - $this->_storeMarginRight(); - - // Prepend the left margin - $this->_storeMarginLeft(); - - // Prepend the page vertical centering - $this->_storeVcenter(); - - // Prepend the page horizontal centering - $this->_storeHcenter(); - - // Prepend the page footer - $this->_storeFooter(); - - // Prepend the page header - $this->_storeHeader(); - - // Prepend the vertical page breaks - $this->_storeVbreak(); - - // Prepend the horizontal page breaks - $this->_storeHbreak(); - - // Prepend WSBOOL - $this->_storeWsbool(); - - // Prepend GRIDSET - $this->_storeGridset(); - - // Prepend GUTS - if ($this->_BIFF_version == 0x0500) { - $this->_storeGuts(); - } - - // Prepend PRINTGRIDLINES - $this->_storePrintGridlines(); - - // Prepend PRINTHEADERS - $this->_storePrintHeaders(); - - // Prepend EXTERNSHEET references - if ($this->_BIFF_version == 0x0500) { - for ($i = $num_sheets; $i > 0; $i--) { - $sheetname = $sheetnames[$i-1]; - $this->_storeExternsheet($sheetname); - } - } - - // Prepend the EXTERNCOUNT of external references. - if ($this->_BIFF_version == 0x0500) { - $this->_storeExterncount($num_sheets); - } - - // Prepend the COLINFO records if they exist - if (!empty($this->_colinfo)) { - $colcount = count($this->_colinfo); - for ($i = 0; $i < $colcount; $i++) { - $this->_storeColinfo($this->_colinfo[$i]); - } - $this->_storeDefcol(); - } - - // Prepend the BOF record - $this->_storeBof(0x0010); - - /* - * End of prepend. Read upwards from here. - ***********************************************/ - - // Append - $this->_storeWindow2(); - $this->_storeZoom(); - if (!empty($this->_panes)) { - $this->_storePanes($this->_panes); - } - $this->_storeSelection($this->_selection); - $this->_storeMergedCells(); - /* TODO: add data validity */ - /*if ($this->_BIFF_version == 0x0600) { - $this->_storeDataValidity(); - }*/ - $this->_storeEof(); - } - - /** - * Retrieve the worksheet name. - * This is usefull when creating worksheets without a name. - * - * @access public - * @return string The worksheet's name - */ - function getName() - { - return $this->name; - } - - /** - * Retrieves data from memory in one chunk, or from disk in $buffer - * sized chunks. - * - * @return string The data - */ - function getData() - { - $buffer = 4096; - - // Return data stored in memory - if (isset($this->_data)) { - $tmp = $this->_data; - unset($this->_data); - $fh = $this->_filehandle; - if ($this->_using_tmpfile) { - fseek($fh, 0); - } - return $tmp; - } - // Return data stored on disk - if ($this->_using_tmpfile) { - if ($tmp = fread($this->_filehandle, $buffer)) { - return $tmp; - } - } - - // No data to return - return ''; - } - - /** - * Sets a merged cell range - * - * @access public - * @param integer $first_row First row of the area to merge - * @param integer $first_col First column of the area to merge - * @param integer $last_row Last row of the area to merge - * @param integer $last_col Last column of the area to merge - */ - function setMerge($first_row, $first_col, $last_row, $last_col) - { - if (($last_row < $first_row) || ($last_col < $first_col)) { - return; - } - // don't check rowmin, rowmax, etc... because we don't know when this - // is going to be called - $this->_merged_ranges[] = array($first_row, $first_col, $last_row, $last_col); - } - - /** - * Set this worksheet as a selected worksheet, - * i.e. the worksheet has its tab highlighted. - * - * @access public - */ - function select() - { - $this->selected = 1; - } - - /** - * Set this worksheet as the active worksheet, - * i.e. the worksheet that is displayed when the workbook is opened. - * Also set it as selected. - * - * @access public - */ - function activate() - { - $this->selected = 1; - $this->activesheet = $this->index; - } - - /** - * Set this worksheet as the first visible sheet. - * This is necessary when there are a large number of worksheets and the - * activated worksheet is not visible on the screen. - * - * @access public - */ - function setFirstSheet() - { - $this->firstsheet = $this->index; - } - - /** - * Set the worksheet protection flag - * to prevent accidental modification and to - * hide formulas if the locked and hidden format properties have been set. - * - * @access public - * @param string $password The password to use for protecting the sheet. - */ - function protect($password) - { - $this->_protect = 1; - $this->_password = $this->_encodePassword($password); - } - - /** - * Set the width of a single column or a range of columns. - * - * @access public - * @param integer $firstcol first column on the range - * @param integer $lastcol last column on the range - * @param integer $width width to set - * @param mixed $format The optional XF format to apply to the columns - * @param integer $hidden The optional hidden atribute - * @param integer $level The optional outline level - */ - function setColumn($firstcol, $lastcol, $width, $format = null, $hidden = 0, $level = 0) - { - $this->_colinfo[] = array($firstcol, $lastcol, $width, &$format, $hidden, $level); - - // Set width to zero if column is hidden - $width = ($hidden) ? 0 : $width; - - for ($col = $firstcol; $col <= $lastcol; $col++) { - $this->col_sizes[$col] = $width; - } - } - - /** - * Set which cell or cells are selected in a worksheet - * - * @access public - * @param integer $first_row first row in the selected quadrant - * @param integer $first_column first column in the selected quadrant - * @param integer $last_row last row in the selected quadrant - * @param integer $last_column last column in the selected quadrant - */ - function setSelection($first_row,$first_column,$last_row,$last_column) - { - $this->_selection = array($first_row,$first_column,$last_row,$last_column); - } - - /** - * Set panes and mark them as frozen. - * - * @access public - * @param array $panes This is the only parameter received and is composed of the following: - * 0 => Vertical split position, - * 1 => Horizontal split position - * 2 => Top row visible - * 3 => Leftmost column visible - * 4 => Active pane - */ - function freezePanes($panes) - { - $this->_frozen = 1; - $this->_panes = $panes; - } - - /** - * Set panes and mark them as unfrozen. - * - * @access public - * @param array $panes This is the only parameter received and is composed of the following: - * 0 => Vertical split position, - * 1 => Horizontal split position - * 2 => Top row visible - * 3 => Leftmost column visible - * 4 => Active pane - */ - function thawPanes($panes) - { - $this->_frozen = 0; - $this->_panes = $panes; - } - - /** - * Set the page orientation as portrait. - * - * @access public - */ - function setPortrait() - { - $this->_orientation = 1; - } - - /** - * Set the page orientation as landscape. - * - * @access public - */ - function setLandscape() - { - $this->_orientation = 0; - } - - /** - * Set the paper type. Ex. 1 = US Letter, 9 = A4 - * - * @access public - * @param integer $size The type of paper size to use - */ - function setPaper($size = 0) - { - $this->_paper_size = $size; - } - - - /** - * Set the page header caption and optional margin. - * - * @access public - * @param string $string The header text - * @param float $margin optional head margin in inches. - */ - function setHeader($string,$margin = 0.50) - { - if (strlen($string) >= 255) { - //carp 'Header string must be less than 255 characters'; - return; - } - $this->_header = $string; - $this->_margin_head = $margin; - } - - /** - * Set the page footer caption and optional margin. - * - * @access public - * @param string $string The footer text - * @param float $margin optional foot margin in inches. - */ - function setFooter($string,$margin = 0.50) - { - if (strlen($string) >= 255) { - //carp 'Footer string must be less than 255 characters'; - return; - } - $this->_footer = $string; - $this->_margin_foot = $margin; - } - - /** - * Center the page horinzontally. - * - * @access public - * @param integer $center the optional value for centering. Defaults to 1 (center). - */ - function centerHorizontally($center = 1) - { - $this->_hcenter = $center; - } - - /** - * Center the page vertically. - * - * @access public - * @param integer $center the optional value for centering. Defaults to 1 (center). - */ - function centerVertically($center = 1) - { - $this->_vcenter = $center; - } - - /** - * Set all the page margins to the same value in inches. - * - * @access public - * @param float $margin The margin to set in inches - */ - function setMargins($margin) - { - $this->setMarginLeft($margin); - $this->setMarginRight($margin); - $this->setMarginTop($margin); - $this->setMarginBottom($margin); - } - - /** - * Set the left and right margins to the same value in inches. - * - * @access public - * @param float $margin The margin to set in inches - */ - function setMargins_LR($margin) - { - $this->setMarginLeft($margin); - $this->setMarginRight($margin); - } - - /** - * Set the top and bottom margins to the same value in inches. - * - * @access public - * @param float $margin The margin to set in inches - */ - function setMargins_TB($margin) - { - $this->setMarginTop($margin); - $this->setMarginBottom($margin); - } - - /** - * Set the left margin in inches. - * - * @access public - * @param float $margin The margin to set in inches - */ - function setMarginLeft($margin = 0.75) - { - $this->_margin_left = $margin; - } - - /** - * Set the right margin in inches. - * - * @access public - * @param float $margin The margin to set in inches - */ - function setMarginRight($margin = 0.75) - { - $this->_margin_right = $margin; - } - - /** - * Set the top margin in inches. - * - * @access public - * @param float $margin The margin to set in inches - */ - function setMarginTop($margin = 1.00) - { - $this->_margin_top = $margin; - } - - /** - * Set the bottom margin in inches. - * - * @access public - * @param float $margin The margin to set in inches - */ - function setMarginBottom($margin = 1.00) - { - $this->_margin_bottom = $margin; - } - - /** - * Set the rows to repeat at the top of each printed page. - * - * @access public - * @param integer $first_row First row to repeat - * @param integer $last_row Last row to repeat. Optional. - */ - function repeatRows($first_row, $last_row = null) - { - $this->title_rowmin = $first_row; - if (isset($last_row)) { //Second row is optional - $this->title_rowmax = $last_row; - } else { - $this->title_rowmax = $first_row; - } - } - - /** - * Set the columns to repeat at the left hand side of each printed page. - * - * @access public - * @param integer $first_col First column to repeat - * @param integer $last_col Last column to repeat. Optional. - */ - function repeatColumns($first_col, $last_col = null) - { - $this->title_colmin = $first_col; - if (isset($last_col)) { // Second col is optional - $this->title_colmax = $last_col; - } else { - $this->title_colmax = $first_col; - } - } - - /** - * Set the area of each worksheet that will be printed. - * - * @access public - * @param integer $first_row First row of the area to print - * @param integer $first_col First column of the area to print - * @param integer $last_row Last row of the area to print - * @param integer $last_col Last column of the area to print - */ - function printArea($first_row, $first_col, $last_row, $last_col) - { - $this->print_rowmin = $first_row; - $this->print_colmin = $first_col; - $this->print_rowmax = $last_row; - $this->print_colmax = $last_col; - } - - - /** - * Set the option to hide gridlines on the printed page. - * - * @access public - */ - function hideGridlines() - { - $this->_print_gridlines = 0; - } - - /** - * Set the option to hide gridlines on the worksheet (as seen on the screen). - * - * @access public - */ - function hideScreenGridlines() - { - $this->_screen_gridlines = 0; - } - - /** - * Set the option to print the row and column headers on the printed page. - * - * @access public - * @param integer $print Whether to print the headers or not. Defaults to 1 (print). - */ - function printRowColHeaders($print = 1) - { - $this->_print_headers = $print; - } - - /** - * Set the vertical and horizontal number of pages that will define the maximum area printed. - * It doesn't seem to work with OpenOffice. - * - * @access public - * @param integer $width Maximun width of printed area in pages - * @param integer $height Maximun heigth of printed area in pages - * @see setPrintScale() - */ - function fitToPages($width, $height) - { - $this->_fit_page = 1; - $this->_fit_width = $width; - $this->_fit_height = $height; - } - - /** - * Store the horizontal page breaks on a worksheet (for printing). - * The breaks represent the row after which the break is inserted. - * - * @access public - * @param array $breaks Array containing the horizontal page breaks - */ - function setHPagebreaks($breaks) - { - foreach ($breaks as $break) { - array_push($this->_hbreaks, $break); - } - } - - /** - * Store the vertical page breaks on a worksheet (for printing). - * The breaks represent the column after which the break is inserted. - * - * @access public - * @param array $breaks Array containing the vertical page breaks - */ - function setVPagebreaks($breaks) - { - foreach ($breaks as $break) { - array_push($this->_vbreaks, $break); - } - } - - - /** - * Set the worksheet zoom factor. - * - * @access public - * @param integer $scale The zoom factor - */ - function setZoom($scale = 100) - { - // Confine the scale to Excel's range - if ($scale < 10 || $scale > 400) { - $this->raiseError("Zoom factor $scale outside range: 10 <= zoom <= 400"); - $scale = 100; - } - - $this->_zoom = floor($scale); - } - - /** - * Set the scale factor for the printed page. - * It turns off the "fit to page" option - * - * @access public - * @param integer $scale The optional scale factor. Defaults to 100 - */ - function setPrintScale($scale = 100) - { - // Confine the scale to Excel's range - if ($scale < 10 || $scale > 400) { - $this->raiseError("Print scale $scale outside range: 10 <= zoom <= 400"); - $scale = 100; - } - - // Turn off "fit to page" option - $this->_fit_page = 0; - - $this->_print_scale = floor($scale); - } - - /** - * Map to the appropriate write method acording to the token recieved. - * - * @access public - * @param integer $row The row of the cell we are writing to - * @param integer $col The column of the cell we are writing to - * @param mixed $token What we are writing - * @param mixed $format The optional format to apply to the cell - */ - function write($row, $col, $token, $format = null) - { - // Check for a cell reference in A1 notation and substitute row and column - /*if ($_[0] =~ /^\D/) { - @_ = $this->_substituteCellref(@_); - }*/ - - if (preg_match("/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/", $token)) { - // Match number - return $this->writeNumber($row, $col, $token, $format); - } elseif (preg_match("/^[fh]tt?p:\/\//", $token)) { - // Match http or ftp URL - return $this->writeUrl($row, $col, $token, '', $format); - } elseif (preg_match("/^mailto:/", $token)) { - // Match mailto: - return $this->writeUrl($row, $col, $token, '', $format); - } elseif (preg_match("/^(?:in|ex)ternal:/", $token)) { - // Match internal or external sheet link - return $this->writeUrl($row, $col, $token, '', $format); - } elseif (preg_match("/^=/", $token)) { - // Match formula - return $this->writeFormula($row, $col, $token, $format); - } elseif (preg_match("/^@/", $token)) { - // Match formula - return $this->writeFormula($row, $col, $token, $format); - } elseif ($token == '') { - // Match blank - return $this->writeBlank($row, $col, $format); - } else { - // Default: match string - return $this->writeString($row, $col, $token, $format); - } - } - - /** - * Write an array of values as a row - * - * @access public - * @param integer $row The row we are writing to - * @param integer $col The first col (leftmost col) we are writing to - * @param array $val The array of values to write - * @param mixed $format The optional format to apply to the cell - * @return mixed PEAR_Error on failure - */ - - function writeRow($row, $col, $val, $format = null) - { - $retval = ''; - if (is_array($val)) { - foreach ($val as $v) { - if (is_array($v)) { - $this->writeCol($row, $col, $v, $format); - } else { - $this->write($row, $col, $v, $format); - } - $col++; - } - } else { - $retval = new PEAR_Error('$val needs to be an array'); - } - return($retval); - } - - /** - * Write an array of values as a column - * - * @access public - * @param integer $row The first row (uppermost row) we are writing to - * @param integer $col The col we are writing to - * @param array $val The array of values to write - * @param mixed $format The optional format to apply to the cell - * @return mixed PEAR_Error on failure - */ - - function writeCol($row, $col, $val, $format = null) - { - $retval = ''; - if (is_array($val)) { - foreach ($val as $v) { - $this->write($row, $col, $v, $format); - $row++; - } - } else { - $retval = new PEAR_Error('$val needs to be an array'); - } - return($retval); - } - - /** - * Returns an index to the XF record in the workbook - * - * @access private - * @param mixed &$format The optional XF format - * @return integer The XF record index - */ - function _XF(&$format) - { - if ($format) { - return($format->getXfIndex()); - } else { - return(0x0F); - } - } - - - /****************************************************************************** - ******************************************************************************* - * - * Internal methods - */ - - - /** - * Store Worksheet data in memory using the parent's class append() or to a - * temporary file, the default. - * - * @access private - * @param string $data The binary data to append - */ - function _append($data) - { - if ($this->_using_tmpfile) { - // Add CONTINUE records if necessary - if (strlen($data) > $this->_limit) { - $data = $this->_addContinue($data); - } - fwrite($this->_filehandle, $data); - $this->_datasize += strlen($data); - } else { - parent::_append($data); - } - } - - /** - * Substitute an Excel cell reference in A1 notation for zero based row and - * column values in an argument list. - * - * Ex: ("A4", "Hello") is converted to (3, 0, "Hello"). - * - * @access private - * @param string $cell The cell reference. Or range of cells. - * @return array - */ - function _substituteCellref($cell) - { - $cell = strtoupper($cell); - - // Convert a column range: 'A:A' or 'B:G' - if (preg_match("/([A-I]?[A-Z]):([A-I]?[A-Z])/", $cell, $match)) { - list($no_use, $col1) = $this->_cellToRowcol($match[1] .'1'); // Add a dummy row - list($no_use, $col2) = $this->_cellToRowcol($match[2] .'1'); // Add a dummy row - return(array($col1, $col2)); - } - - // Convert a cell range: 'A1:B7' - if (preg_match("/\$?([A-I]?[A-Z]\$?\d+):\$?([A-I]?[A-Z]\$?\d+)/", $cell, $match)) { - list($row1, $col1) = $this->_cellToRowcol($match[1]); - list($row2, $col2) = $this->_cellToRowcol($match[2]); - return(array($row1, $col1, $row2, $col2)); - } - - // Convert a cell reference: 'A1' or 'AD2000' - if (preg_match("/\$?([A-I]?[A-Z]\$?\d+)/", $cell)) { - list($row1, $col1) = $this->_cellToRowcol($match[1]); - return(array($row1, $col1)); - } - - // TODO use real error codes - $this->raiseError("Unknown cell reference $cell", 0, PEAR_ERROR_DIE); - } - - /** - * Convert an Excel cell reference in A1 notation to a zero based row and column - * reference; converts C1 to (0, 2). - * - * @access private - * @param string $cell The cell reference. - * @return array containing (row, column) - */ - function _cellToRowcol($cell) - { - preg_match("/\$?([A-I]?[A-Z])\$?(\d+)/",$cell,$match); - $col = $match[1]; - $row = $match[2]; - - // Convert base26 column string to number - $chars = split('', $col); - $expn = 0; - $col = 0; - - while ($chars) { - $char = array_pop($chars); // LS char first - $col += (ord($char) -ord('A') +1) * pow(26,$expn); - $expn++; - } - - // Convert 1-index to zero-index - $row--; - $col--; - - return(array($row, $col)); - } - - /** - * Based on the algorithm provided by Daniel Rentz of OpenOffice. - * - * @access private - * @param string $plaintext The password to be encoded in plaintext. - * @return string The encoded password - */ - function _encodePassword($plaintext) - { - $password = 0x0000; - $i = 1; // char position - - // split the plain text password in its component characters - $chars = preg_split('//', $plaintext, -1, PREG_SPLIT_NO_EMPTY); - foreach ($chars as $char) { - $value = ord($char) << $i; // shifted ASCII value - $rotated_bits = $value >> 15; // rotated bits beyond bit 15 - $value &= 0x7fff; // first 15 bits - $password ^= ($value | $rotated_bits); - $i++; - } - - $password ^= strlen($plaintext); - $password ^= 0xCE4B; - - return($password); - } - - /** - * This method sets the properties for outlining and grouping. The defaults - * correspond to Excel's defaults. - * - * @param bool $visible - * @param bool $symbols_below - * @param bool $symbols_right - * @param bool $auto_style - */ - function setOutline($visible = true, $symbols_below = true, $symbols_right = true, $auto_style = false) - { - $this->_outline_on = $visible; - $this->_outline_below = $symbols_below; - $this->_outline_right = $symbols_right; - $this->_outline_style = $auto_style; - - // Ensure this is a boolean vale for Window2 - if ($this->_outline_on) { - $this->_outline_on = 1; - } - } - - /****************************************************************************** - ******************************************************************************* - * - * BIFF RECORDS - */ - - - /** - * Write a double to the specified row and column (zero indexed). - * An integer can be written as a double. Excel will display an - * integer. $format is optional. - * - * Returns 0 : normal termination - * -2 : row or column out of range - * - * @access public - * @param integer $row Zero indexed row - * @param integer $col Zero indexed column - * @param float $num The number to write - * @param mixed $format The optional XF format - * @return integer - */ - function writeNumber($row, $col, $num, $format = null) - { - $record = 0x0203; // Record identifier - $length = 0x000E; // Number of bytes to follow - - $xf = $this->_XF($format); // The cell format - - // Check that row and col are valid and store max and min values - if ($row >= $this->_xls_rowmax) { - return(-2); - } - if ($col >= $this->_xls_colmax) { - return(-2); - } - if ($row < $this->_dim_rowmin) { - $this->_dim_rowmin = $row; - } - if ($row > $this->_dim_rowmax) { - $this->_dim_rowmax = $row; - } - if ($col < $this->_dim_colmin) { - $this->_dim_colmin = $col; - } - if ($col > $this->_dim_colmax) { - $this->_dim_colmax = $col; - } - - $header = pack("vv", $record, $length); - $data = pack("vvv", $row, $col, $xf); - $xl_double = pack("d", $num); - if ($this->_byte_order) { // if it's Big Endian - $xl_double = strrev($xl_double); - } - - $this->_append($header.$data.$xl_double); - return(0); - } - - /** - * Write a string to the specified row and column (zero indexed). - * NOTE: there is an Excel 5 defined limit of 255 characters. - * $format is optional. - * Returns 0 : normal termination - * -2 : row or column out of range - * -3 : long string truncated to 255 chars - * - * @access public - * @param integer $row Zero indexed row - * @param integer $col Zero indexed column - * @param string $str The string to write - * @param mixed $format The XF format for the cell - * @return integer - */ - function writeString($row, $col, $str, $format = null) - { - if ($this->_BIFF_version == 0x0600) { - return $this->writeStringBIFF8($row, $col, $str, $format); - } - $strlen = strlen($str); - $record = 0x0204; // Record identifier - $length = 0x0008 + $strlen; // Bytes to follow - $xf = $this->_XF($format); // The cell format - - $str_error = 0; - - // Check that row and col are valid and store max and min values - if ($row >= $this->_xls_rowmax) { - return(-2); - } - if ($col >= $this->_xls_colmax) { - return(-2); - } - if ($row < $this->_dim_rowmin) { - $this->_dim_rowmin = $row; - } - if ($row > $this->_dim_rowmax) { - $this->_dim_rowmax = $row; - } - if ($col < $this->_dim_colmin) { - $this->_dim_colmin = $col; - } - if ($col > $this->_dim_colmax) { - $this->_dim_colmax = $col; - } - - if ($strlen > $this->_xls_strmax) { // LABEL must be < 255 chars - $str = substr($str, 0, $this->_xls_strmax); - $length = 0x0008 + $this->_xls_strmax; - $strlen = $this->_xls_strmax; - $str_error = -3; - } - - $header = pack("vv", $record, $length); - $data = pack("vvvv", $row, $col, $xf, $strlen); - $this->_append($header . $data . $str); - return($str_error); - } - - /** - * Sets Input Encoding for writing strings - * - * @access public - * @param string $encoding The encoding. Ex: 'UTF-16LE', 'utf-8', 'ISO-859-7' - */ - function setInputEncoding($encoding) - { - if ($encoding != 'UTF-16LE' && !function_exists('iconv')) { - $this->raiseError("Using an input encoding other than UTF-16LE requires PHP support for iconv"); - } - $this->_input_encoding = $encoding; - } - - /** - * Write a string to the specified row and column (zero indexed). - * This is the BIFF8 version (no 255 chars limit). - * $format is optional. - * Returns 0 : normal termination - * -2 : row or column out of range - * -3 : long string truncated to 255 chars - * - * @access public - * @param integer $row Zero indexed row - * @param integer $col Zero indexed column - * @param string $str The string to write - * @param mixed $format The XF format for the cell - * @return integer - */ - function writeStringBIFF8($row, $col, $str, $format = null) - { - if ($this->_input_encoding == 'UTF-16LE') - { - $strlen = function_exists('mb_strlen') ? mb_strlen($str, 'UTF-16LE') : (strlen($str) / 2); - $encoding = 0x1; - } - elseif ($this->_input_encoding != '') - { - $str = @iconv($this->_input_encoding, 'UTF-16LE', $str); - $strlen = function_exists('mb_strlen') ? mb_strlen($str, 'UTF-16LE') : (strlen($str) / 2); - $encoding = 0x1; - } - else - { - $strlen = strlen($str); - $encoding = 0x0; - } - $record = 0x00FD; // Record identifier - $length = 0x000A; // Bytes to follow - $xf = $this->_XF($format); // The cell format - - $str_error = 0; - - // Check that row and col are valid and store max and min values - if ($this->_checkRowCol($row, $col) == false) { - return -2; - } - - $str = pack('vC', $strlen, $encoding).$str; - - /* check if string is already present */ - if (!isset($this->_str_table[$str])) { - $this->_str_table[$str] = $this->_str_unique++; - } - $this->_str_total++; - - $header = pack('vv', $record, $length); - $data = pack('vvvV', $row, $col, $xf, $this->_str_table[$str]); - $this->_append($header.$data); - return $str_error; - } - - /** - * Check row and col before writing to a cell, and update the sheet's - * dimensions accordingly - * - * @access private - * @param integer $row Zero indexed row - * @param integer $col Zero indexed column - * @return boolean true for success, false if row and/or col are grester - * then maximums allowed. - */ - function _checkRowCol($row, $col) - { - if ($row >= $this->_xls_rowmax) { - return false; - } - if ($col >= $this->_xls_colmax) { - return false; - } - if ($row < $this->_dim_rowmin) { - $this->_dim_rowmin = $row; - } - if ($row > $this->_dim_rowmax) { - $this->_dim_rowmax = $row; - } - if ($col < $this->_dim_colmin) { - $this->_dim_colmin = $col; - } - if ($col > $this->_dim_colmax) { - $this->_dim_colmax = $col; - } - return true; - } - - /** - * Writes a note associated with the cell given by the row and column. - * NOTE records don't have a length limit. - * - * @access public - * @param integer $row Zero indexed row - * @param integer $col Zero indexed column - * @param string $note The note to write - */ - function writeNote($row, $col, $note) - { - $note_length = strlen($note); - $record = 0x001C; // Record identifier - $max_length = 2048; // Maximun length for a NOTE record - //$length = 0x0006 + $note_length; // Bytes to follow - - // Check that row and col are valid and store max and min values - if ($row >= $this->_xls_rowmax) { - return(-2); - } - if ($col >= $this->_xls_colmax) { - return(-2); - } - if ($row < $this->_dim_rowmin) { - $this->_dim_rowmin = $row; - } - if ($row > $this->_dim_rowmax) { - $this->_dim_rowmax = $row; - } - if ($col < $this->_dim_colmin) { - $this->_dim_colmin = $col; - } - if ($col > $this->_dim_colmax) { - $this->_dim_colmax = $col; - } - - // Length for this record is no more than 2048 + 6 - $length = 0x0006 + min($note_length, 2048); - $header = pack("vv", $record, $length); - $data = pack("vvv", $row, $col, $note_length); - $this->_append($header . $data . substr($note, 0, 2048)); - - for ($i = $max_length; $i < $note_length; $i += $max_length) { - $chunk = substr($note, $i, $max_length); - $length = 0x0006 + strlen($chunk); - $header = pack("vv", $record, $length); - $data = pack("vvv", -1, 0, strlen($chunk)); - $this->_append($header.$data.$chunk); - } - return(0); - } - - /** - * Write a blank cell to the specified row and column (zero indexed). - * A blank cell is used to specify formatting without adding a string - * or a number. - * - * A blank cell without a format serves no purpose. Therefore, we don't write - * a BLANK record unless a format is specified. - * - * Returns 0 : normal termination (including no format) - * -1 : insufficient number of arguments - * -2 : row or column out of range - * - * @access public - * @param integer $row Zero indexed row - * @param integer $col Zero indexed column - * @param mixed $format The XF format - */ - function writeBlank($row, $col, $format) - { - // Don't write a blank cell unless it has a format - if (!$format) { - return(0); - } - - $record = 0x0201; // Record identifier - $length = 0x0006; // Number of bytes to follow - $xf = $this->_XF($format); // The cell format - - // Check that row and col are valid and store max and min values - if ($row >= $this->_xls_rowmax) { - return(-2); - } - if ($col >= $this->_xls_colmax) { - return(-2); - } - if ($row < $this->_dim_rowmin) { - $this->_dim_rowmin = $row; - } - if ($row > $this->_dim_rowmax) { - $this->_dim_rowmax = $row; - } - if ($col < $this->_dim_colmin) { - $this->_dim_colmin = $col; - } - if ($col > $this->_dim_colmax) { - $this->_dim_colmax = $col; - } - - $header = pack("vv", $record, $length); - $data = pack("vvv", $row, $col, $xf); - $this->_append($header . $data); - return 0; - } - - /** - * Write a formula to the specified row and column (zero indexed). - * The textual representation of the formula is passed to the parser in - * Parser.php which returns a packed binary string. - * - * Returns 0 : normal termination - * -1 : formula errors (bad formula) - * -2 : row or column out of range - * - * @access public - * @param integer $row Zero indexed row - * @param integer $col Zero indexed column - * @param string $formula The formula text string - * @param mixed $format The optional XF format - * @return integer - */ - function writeFormula($row, $col, $formula, $format = null) - { - $record = 0x0006; // Record identifier - - // Excel normally stores the last calculated value of the formula in $num. - // Clearly we are not in a position to calculate this a priori. Instead - // we set $num to zero and set the option flags in $grbit to ensure - // automatic calculation of the formula when the file is opened. - // - $xf = $this->_XF($format); // The cell format - $num = 0x00; // Current value of formula - $grbit = 0x03; // Option flags - $unknown = 0x0000; // Must be zero - - - // Check that row and col are valid and store max and min values - if ($this->_checkRowCol($row, $col) == false) { - return -2; - } - - // Strip the '=' or '@' sign at the beginning of the formula string - if (preg_match("/^=/", $formula)) { - $formula = preg_replace("/(^=)/", "", $formula); - } elseif (preg_match("/^@/", $formula)) { - $formula = preg_replace("/(^@)/", "", $formula); - } else { - // Error handling - $this->writeString($row, $col, 'Unrecognised character for formula'); - return -1; - } - - // Parse the formula using the parser in Parser.php - $error = $this->_parser->parse($formula); - if ($this->isError($error)) { - $this->writeString($row, $col, $error->getMessage()); - return -1; - } - - $formula = $this->_parser->toReversePolish(); - if ($this->isError($formula)) { - $this->writeString($row, $col, $formula->getMessage()); - return -1; - } - - $formlen = strlen($formula); // Length of the binary string - $length = 0x16 + $formlen; // Length of the record data - - $header = pack("vv", $record, $length); - $data = pack("vvvdvVv", $row, $col, $xf, $num, - $grbit, $unknown, $formlen); - - $this->_append($header . $data . $formula); - return 0; - } - - /** - * Write a hyperlink. - * This is comprised of two elements: the visible label and - * the invisible link. The visible label is the same as the link unless an - * alternative string is specified. The label is written using the - * writeString() method. Therefore the 255 characters string limit applies. - * $string and $format are optional. - * - * The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external - * directory url. - * - * Returns 0 : normal termination - * -2 : row or column out of range - * -3 : long string truncated to 255 chars - * - * @access public - * @param integer $row Row - * @param integer $col Column - * @param string $url URL string - * @param string $string Alternative label - * @param mixed $format The cell format - * @return integer - */ - function writeUrl($row, $col, $url, $string = '', $format = null) - { - // Add start row and col to arg list - return($this->_writeUrlRange($row, $col, $row, $col, $url, $string, $format)); - } - - /** - * This is the more general form of writeUrl(). It allows a hyperlink to be - * written to a range of cells. This function also decides the type of hyperlink - * to be written. These are either, Web (http, ftp, mailto), Internal - * (Sheet1!A1) or external ('c:\temp\foo.xls#Sheet1!A1'). - * - * @access private - * @see writeUrl() - * @param integer $row1 Start row - * @param integer $col1 Start column - * @param integer $row2 End row - * @param integer $col2 End column - * @param string $url URL string - * @param string $string Alternative label - * @param mixed $format The cell format - * @return integer - */ - - function _writeUrlRange($row1, $col1, $row2, $col2, $url, $string = '', $format = null) - { - - // Check for internal/external sheet links or default to web link - if (preg_match('[^internal:]', $url)) { - return($this->_writeUrlInternal($row1, $col1, $row2, $col2, $url, $string, $format)); - } - if (preg_match('[^external:]', $url)) { - return($this->_writeUrlExternal($row1, $col1, $row2, $col2, $url, $string, $format)); - } - return($this->_writeUrlWeb($row1, $col1, $row2, $col2, $url, $string, $format)); - } - - - /** - * Used to write http, ftp and mailto hyperlinks. - * The link type ($options) is 0x03 is the same as absolute dir ref without - * sheet. However it is differentiated by the $unknown2 data stream. - * - * @access private - * @see writeUrl() - * @param integer $row1 Start row - * @param integer $col1 Start column - * @param integer $row2 End row - * @param integer $col2 End column - * @param string $url URL string - * @param string $str Alternative label - * @param mixed $format The cell format - * @return integer - */ - function _writeUrlWeb($row1, $col1, $row2, $col2, $url, $str, $format = null) - { - $record = 0x01B8; // Record identifier - $length = 0x00000; // Bytes to follow - - if (!$format) { - $format = $this->_url_format; - } - - // Write the visible label using the writeString() method. - if ($str == '') { - $str = $url; - } - $str_error = $this->writeString($row1, $col1, $str, $format); - if (($str_error == -2) || ($str_error == -3)) { - return $str_error; - } - - // Pack the undocumented parts of the hyperlink stream - $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); - $unknown2 = pack("H*", "E0C9EA79F9BACE118C8200AA004BA90B"); - - // Pack the option flags - $options = pack("V", 0x03); - - // Convert URL to a null terminated wchar string - $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); - $url = $url . "\0\0\0"; - - // Pack the length of the URL - $url_len = pack("V", strlen($url)); - - // Calculate the data length - $length = 0x34 + strlen($url); - - // Pack the header data - $header = pack("vv", $record, $length); - $data = pack("vvvv", $row1, $row2, $col1, $col2); - - // Write the packed data - $this->_append($header . $data . - $unknown1 . $options . - $unknown2 . $url_len . $url); - return($str_error); - } - - /** - * Used to write internal reference hyperlinks such as "Sheet1!A1". - * - * @access private - * @see writeUrl() - * @param integer $row1 Start row - * @param integer $col1 Start column - * @param integer $row2 End row - * @param integer $col2 End column - * @param string $url URL string - * @param string $str Alternative label - * @param mixed $format The cell format - * @return integer - */ - function _writeUrlInternal($row1, $col1, $row2, $col2, $url, $str, $format = null) - { - $record = 0x01B8; // Record identifier - $length = 0x00000; // Bytes to follow - - if (!$format) { - $format = $this->_url_format; - } - - // Strip URL type - $url = preg_replace('/^internal:/', '', $url); - - // Write the visible label - if ($str == '') { - $str = $url; - } - $str_error = $this->writeString($row1, $col1, $str, $format); - if (($str_error == -2) || ($str_error == -3)) { - return $str_error; - } - - // Pack the undocumented parts of the hyperlink stream - $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); - - // Pack the option flags - $options = pack("V", 0x08); - - // Convert the URL type and to a null terminated wchar string - $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); - $url = $url . "\0\0\0"; - - // Pack the length of the URL as chars (not wchars) - $url_len = pack("V", floor(strlen($url)/2)); - - // Calculate the data length - $length = 0x24 + strlen($url); - - // Pack the header data - $header = pack("vv", $record, $length); - $data = pack("vvvv", $row1, $row2, $col1, $col2); - - // Write the packed data - $this->_append($header . $data . - $unknown1 . $options . - $url_len . $url); - return($str_error); - } - - /** - * Write links to external directory names such as 'c:\foo.xls', - * c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. - * - * Note: Excel writes some relative links with the $dir_long string. We ignore - * these cases for the sake of simpler code. - * - * @access private - * @see writeUrl() - * @param integer $row1 Start row - * @param integer $col1 Start column - * @param integer $row2 End row - * @param integer $col2 End column - * @param string $url URL string - * @param string $str Alternative label - * @param mixed $format The cell format - * @return integer - */ - function _writeUrlExternal($row1, $col1, $row2, $col2, $url, $str, $format = null) - { - // Network drives are different. We will handle them separately - // MS/Novell network drives and shares start with \\ - if (preg_match('[^external:\\\\]', $url)) { - return; //($this->_writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format)); - } - - $record = 0x01B8; // Record identifier - $length = 0x00000; // Bytes to follow - - if (!$format) { - $format = $this->_url_format; - } - - // Strip URL type and change Unix dir separator to Dos style (if needed) - // - $url = preg_replace('/^external:/', '', $url); - $url = preg_replace('/\//', "\\", $url); - - // Write the visible label - if ($str == '') { - $str = preg_replace('/\#/', ' - ', $url); - } - $str_error = $this->writeString($row1, $col1, $str, $format); - if (($str_error == -2) or ($str_error == -3)) { - return $str_error; - } - - // Determine if the link is relative or absolute: - // relative if link contains no dir separator, "somefile.xls" - // relative if link starts with up-dir, "..\..\somefile.xls" - // otherwise, absolute - - $absolute = 0x02; // Bit mask - if (!preg_match("/\\\/", $url)) { - $absolute = 0x00; - } - if (preg_match("/^\.\.\\\/", $url)) { - $absolute = 0x00; - } - $link_type = 0x01 | $absolute; - - // Determine if the link contains a sheet reference and change some of the - // parameters accordingly. - // Split the dir name and sheet name (if it exists) - /*if (preg_match("/\#/", $url)) { - list($dir_long, $sheet) = split("\#", $url); - } else { - $dir_long = $url; - } - - if (isset($sheet)) { - $link_type |= 0x08; - $sheet_len = pack("V", strlen($sheet) + 0x01); - $sheet = join("\0", split('', $sheet)); - $sheet .= "\0\0\0"; - } else { - $sheet_len = ''; - $sheet = ''; - }*/ - $dir_long = $url; - if (preg_match("/\#/", $url)) { - $link_type |= 0x08; - } - - - - // Pack the link type - $link_type = pack("V", $link_type); - - // Calculate the up-level dir count e.g.. (..\..\..\ == 3) - $up_count = preg_match_all("/\.\.\\\/", $dir_long, $useless); - $up_count = pack("v", $up_count); - - // Store the short dos dir name (null terminated) - $dir_short = preg_replace("/\.\.\\\/", '', $dir_long) . "\0"; - - // Store the long dir name as a wchar string (non-null terminated) - //$dir_long = join("\0", split('', $dir_long)); - $dir_long = $dir_long . "\0"; - - // Pack the lengths of the dir strings - $dir_short_len = pack("V", strlen($dir_short) ); - $dir_long_len = pack("V", strlen($dir_long) ); - $stream_len = pack("V", 0);//strlen($dir_long) + 0x06); - - // Pack the undocumented parts of the hyperlink stream - $unknown1 = pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000' ); - $unknown2 = pack("H*",'0303000000000000C000000000000046' ); - $unknown3 = pack("H*",'FFFFADDE000000000000000000000000000000000000000'); - $unknown4 = pack("v", 0x03 ); - - // Pack the main data stream - $data = pack("vvvv", $row1, $row2, $col1, $col2) . - $unknown1 . - $link_type . - $unknown2 . - $up_count . - $dir_short_len. - $dir_short . - $unknown3 . - $stream_len ;/*. - $dir_long_len . - $unknown4 . - $dir_long . - $sheet_len . - $sheet ;*/ - - // Pack the header data - $length = strlen($data); - $header = pack("vv", $record, $length); - - // Write the packed data - $this->_append($header. $data); - return($str_error); - } - - - /** - * This method is used to set the height and format for a row. - * - * @access public - * @param integer $row The row to set - * @param integer $height Height we are giving to the row. - * Use null to set XF without setting height - * @param mixed $format XF format we are giving to the row - * @param bool $hidden The optional hidden attribute - * @param integer $level The optional outline level for row, in range [0,7] - */ - function setRow($row, $height, $format = null, $hidden = false, $level = 0) - { - $record = 0x0208; // Record identifier - $length = 0x0010; // Number of bytes to follow - - $colMic = 0x0000; // First defined column - $colMac = 0x0000; // Last defined column - $irwMac = 0x0000; // Used by Excel to optimise loading - $reserved = 0x0000; // Reserved - $grbit = 0x0000; // Option flags - $ixfe = $this->_XF($format); // XF index - - // set _row_sizes so _sizeRow() can use it - $this->_row_sizes[$row] = $height; - - // Use setRow($row, null, $XF) to set XF format without setting height - if ($height != null) { - $miyRw = $height * 20; // row height - } else { - $miyRw = 0xff; // default row height is 256 - } - - $level = max(0, min($level, 7)); // level should be between 0 and 7 - $this->_outline_row_level = max($level, $this->_outline_row_level); - - - // Set the options flags. fUnsynced is used to show that the font and row - // heights are not compatible. This is usually the case for WriteExcel. - // The collapsed flag 0x10 doesn't seem to be used to indicate that a row - // is collapsed. Instead it is used to indicate that the previous row is - // collapsed. The zero height flag, 0x20, is used to collapse a row. - - $grbit |= $level; - if ($hidden) { - $grbit |= 0x0020; - } - $grbit |= 0x0040; // fUnsynced - if ($format) { - $grbit |= 0x0080; - } - $grbit |= 0x0100; - - $header = pack("vv", $record, $length); - $data = pack("vvvvvvvv", $row, $colMic, $colMac, $miyRw, - $irwMac,$reserved, $grbit, $ixfe); - $this->_append($header.$data); - } - - /** - * Writes Excel DIMENSIONS to define the area in which there is data. - * - * @access private - */ - function _storeDimensions() - { - $record = 0x0200; // Record identifier - $row_min = $this->_dim_rowmin; // First row - $row_max = $this->_dim_rowmax + 1; // Last row plus 1 - $col_min = $this->_dim_colmin; // First column - $col_max = $this->_dim_colmax + 1; // Last column plus 1 - $reserved = 0x0000; // Reserved by Excel - - if ($this->_BIFF_version == 0x0500) { - $length = 0x000A; // Number of bytes to follow - $data = pack("vvvvv", $row_min, $row_max, - $col_min, $col_max, $reserved); - } elseif ($this->_BIFF_version == 0x0600) { - $length = 0x000E; - $data = pack("VVvvv", $row_min, $row_max, - $col_min, $col_max, $reserved); - } - $header = pack("vv", $record, $length); - $this->_prepend($header.$data); - } - - /** - * Write BIFF record Window2. - * - * @access private - */ - function _storeWindow2() - { - $record = 0x023E; // Record identifier - if ($this->_BIFF_version == 0x0500) { - $length = 0x000A; // Number of bytes to follow - } elseif ($this->_BIFF_version == 0x0600) { - $length = 0x0012; - } - - $grbit = 0x00B6; // Option flags - $rwTop = 0x0000; // Top row visible in window - $colLeft = 0x0000; // Leftmost column visible in window - - - // The options flags that comprise $grbit - $fDspFmla = 0; // 0 - bit - $fDspGrid = $this->_screen_gridlines; // 1 - $fDspRwCol = 1; // 2 - $fFrozen = $this->_frozen; // 3 - $fDspZeros = 1; // 4 - $fDefaultHdr = 1; // 5 - $fArabic = 0; // 6 - $fDspGuts = $this->_outline_on; // 7 - $fFrozenNoSplit = 0; // 0 - bit - $fSelected = $this->selected; // 1 - $fPaged = 1; // 2 - - $grbit = $fDspFmla; - $grbit |= $fDspGrid << 1; - $grbit |= $fDspRwCol << 2; - $grbit |= $fFrozen << 3; - $grbit |= $fDspZeros << 4; - $grbit |= $fDefaultHdr << 5; - $grbit |= $fArabic << 6; - $grbit |= $fDspGuts << 7; - $grbit |= $fFrozenNoSplit << 8; - $grbit |= $fSelected << 9; - $grbit |= $fPaged << 10; - - $header = pack("vv", $record, $length); - $data = pack("vvv", $grbit, $rwTop, $colLeft); - // FIXME !!! - if ($this->_BIFF_version == 0x0500) { - $rgbHdr = 0x00000000; // Row/column heading and gridline color - $data .= pack("V", $rgbHdr); - } elseif ($this->_BIFF_version == 0x0600) { - $rgbHdr = 0x0040; // Row/column heading and gridline color index - $zoom_factor_page_break = 0x0000; - $zoom_factor_normal = 0x0000; - $data .= pack("vvvvV", $rgbHdr, 0x0000, $zoom_factor_page_break, $zoom_factor_normal, 0x00000000); - } - $this->_append($header.$data); - } - - /** - * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. - * - * @access private - */ - function _storeDefcol() - { - $record = 0x0055; // Record identifier - $length = 0x0002; // Number of bytes to follow - $colwidth = 0x0008; // Default column width - - $header = pack("vv", $record, $length); - $data = pack("v", $colwidth); - $this->_prepend($header . $data); - } - - /** - * Write BIFF record COLINFO to define column widths - * - * Note: The SDK says the record length is 0x0B but Excel writes a 0x0C - * length record. - * - * @access private - * @param array $col_array This is the only parameter received and is composed of the following: - * 0 => First formatted column, - * 1 => Last formatted column, - * 2 => Col width (8.43 is Excel default), - * 3 => The optional XF format of the column, - * 4 => Option flags. - * 5 => Optional outline level - */ - function _storeColinfo($col_array) - { - if (isset($col_array[0])) { - $colFirst = $col_array[0]; - } - if (isset($col_array[1])) { - $colLast = $col_array[1]; - } - if (isset($col_array[2])) { - $coldx = $col_array[2]; - } else { - $coldx = 8.43; - } - if (isset($col_array[3])) { - $format = $col_array[3]; - } else { - $format = 0; - } - if (isset($col_array[4])) { - $grbit = $col_array[4]; - } else { - $grbit = 0; - } - if (isset($col_array[5])) { - $level = $col_array[5]; - } else { - $level = 0; - } - $record = 0x007D; // Record identifier - $length = 0x000B; // Number of bytes to follow - - $coldx += 0.72; // Fudge. Excel subtracts 0.72 !? - $coldx *= 256; // Convert to units of 1/256 of a char - - $ixfe = $this->_XF($format); - $reserved = 0x00; // Reserved - - $level = max(0, min($level, 7)); - $grbit |= $level << 8; - - $header = pack("vv", $record, $length); - $data = pack("vvvvvC", $colFirst, $colLast, $coldx, - $ixfe, $grbit, $reserved); - $this->_prepend($header.$data); - } - - /** - * Write BIFF record SELECTION. - * - * @access private - * @param array $array array containing ($rwFirst,$colFirst,$rwLast,$colLast) - * @see setSelection() - */ - function _storeSelection($array) - { - list($rwFirst,$colFirst,$rwLast,$colLast) = $array; - $record = 0x001D; // Record identifier - $length = 0x000F; // Number of bytes to follow - - $pnn = $this->_active_pane; // Pane position - $rwAct = $rwFirst; // Active row - $colAct = $colFirst; // Active column - $irefAct = 0; // Active cell ref - $cref = 1; // Number of refs - - if (!isset($rwLast)) { - $rwLast = $rwFirst; // Last row in reference - } - if (!isset($colLast)) { - $colLast = $colFirst; // Last col in reference - } - - // Swap last row/col for first row/col as necessary - if ($rwFirst > $rwLast) { - list($rwFirst, $rwLast) = array($rwLast, $rwFirst); - } - - if ($colFirst > $colLast) { - list($colFirst, $colLast) = array($colLast, $colFirst); - } - - $header = pack("vv", $record, $length); - $data = pack("CvvvvvvCC", $pnn, $rwAct, $colAct, - $irefAct, $cref, - $rwFirst, $rwLast, - $colFirst, $colLast); - $this->_append($header . $data); - } - - /** - * Store the MERGEDCELLS record for all ranges of merged cells - * - * @access private - */ - function _storeMergedCells() - { - // if there are no merged cell ranges set, return - if (count($this->_merged_ranges) == 0) { - return; - } - $record = 0x00E5; - $length = 2 + count($this->_merged_ranges) * 8; - - $header = pack('vv', $record, $length); - $data = pack('v', count($this->_merged_ranges)); - foreach ($this->_merged_ranges as $range) { - $data .= pack('vvvv', $range[0], $range[2], $range[1], $range[3]); - } - $this->_append($header . $data); - } - - /** - * Write BIFF record EXTERNCOUNT to indicate the number of external sheet - * references in a worksheet. - * - * Excel only stores references to external sheets that are used in formulas. - * For simplicity we store references to all the sheets in the workbook - * regardless of whether they are used or not. This reduces the overall - * complexity and eliminates the need for a two way dialogue between the formula - * parser the worksheet objects. - * - * @access private - * @param integer $count The number of external sheet references in this worksheet - */ - function _storeExterncount($count) - { - $record = 0x0016; // Record identifier - $length = 0x0002; // Number of bytes to follow - - $header = pack("vv", $record, $length); - $data = pack("v", $count); - $this->_prepend($header . $data); - } - - /** - * Writes the Excel BIFF EXTERNSHEET record. These references are used by - * formulas. A formula references a sheet name via an index. Since we store a - * reference to all of the external worksheets the EXTERNSHEET index is the same - * as the worksheet index. - * - * @access private - * @param string $sheetname The name of a external worksheet - */ - function _storeExternsheet($sheetname) - { - $record = 0x0017; // Record identifier - - // References to the current sheet are encoded differently to references to - // external sheets. - // - if ($this->name == $sheetname) { - $sheetname = ''; - $length = 0x02; // The following 2 bytes - $cch = 1; // The following byte - $rgch = 0x02; // Self reference - } else { - $length = 0x02 + strlen($sheetname); - $cch = strlen($sheetname); - $rgch = 0x03; // Reference to a sheet in the current workbook - } - - $header = pack("vv", $record, $length); - $data = pack("CC", $cch, $rgch); - $this->_prepend($header . $data . $sheetname); - } - - /** - * Writes the Excel BIFF PANE record. - * The panes can either be frozen or thawed (unfrozen). - * Frozen panes are specified in terms of an integer number of rows and columns. - * Thawed panes are specified in terms of Excel's units for rows and columns. - * - * @access private - * @param array $panes This is the only parameter received and is composed of the following: - * 0 => Vertical split position, - * 1 => Horizontal split position - * 2 => Top row visible - * 3 => Leftmost column visible - * 4 => Active pane - */ - function _storePanes($panes) - { - $y = $panes[0]; - $x = $panes[1]; - $rwTop = $panes[2]; - $colLeft = $panes[3]; - if (count($panes) > 4) { // if Active pane was received - $pnnAct = $panes[4]; - } else { - $pnnAct = null; - } - $record = 0x0041; // Record identifier - $length = 0x000A; // Number of bytes to follow - - // Code specific to frozen or thawed panes. - if ($this->_frozen) { - // Set default values for $rwTop and $colLeft - if (!isset($rwTop)) { - $rwTop = $y; - } - if (!isset($colLeft)) { - $colLeft = $x; - } - } else { - // Set default values for $rwTop and $colLeft - if (!isset($rwTop)) { - $rwTop = 0; - } - if (!isset($colLeft)) { - $colLeft = 0; - } - - // Convert Excel's row and column units to the internal units. - // The default row height is 12.75 - // The default column width is 8.43 - // The following slope and intersection values were interpolated. - // - $y = 20*$y + 255; - $x = 113.879*$x + 390; - } - - - // Determine which pane should be active. There is also the undocumented - // option to override this should it be necessary: may be removed later. - // - if (!isset($pnnAct)) { - if ($x != 0 && $y != 0) { - $pnnAct = 0; // Bottom right - } - if ($x != 0 && $y == 0) { - $pnnAct = 1; // Top right - } - if ($x == 0 && $y != 0) { - $pnnAct = 2; // Bottom left - } - if ($x == 0 && $y == 0) { - $pnnAct = 3; // Top left - } - } - - $this->_active_pane = $pnnAct; // Used in _storeSelection - - $header = pack("vv", $record, $length); - $data = pack("vvvvv", $x, $y, $rwTop, $colLeft, $pnnAct); - $this->_append($header . $data); - } - - /** - * Store the page setup SETUP BIFF record. - * - * @access private - */ - function _storeSetup() - { - $record = 0x00A1; // Record identifier - $length = 0x0022; // Number of bytes to follow - - $iPaperSize = $this->_paper_size; // Paper size - $iScale = $this->_print_scale; // Print scaling factor - $iPageStart = 0x01; // Starting page number - $iFitWidth = $this->_fit_width; // Fit to number of pages wide - $iFitHeight = $this->_fit_height; // Fit to number of pages high - $grbit = 0x00; // Option flags - $iRes = 0x0258; // Print resolution - $iVRes = 0x0258; // Vertical print resolution - $numHdr = $this->_margin_head; // Header Margin - $numFtr = $this->_margin_foot; // Footer Margin - $iCopies = 0x01; // Number of copies - - $fLeftToRight = 0x0; // Print over then down - $fLandscape = $this->_orientation; // Page orientation - $fNoPls = 0x0; // Setup not read from printer - $fNoColor = 0x0; // Print black and white - $fDraft = 0x0; // Print draft quality - $fNotes = 0x0; // Print notes - $fNoOrient = 0x0; // Orientation not set - $fUsePage = 0x0; // Use custom starting page - - $grbit = $fLeftToRight; - $grbit |= $fLandscape << 1; - $grbit |= $fNoPls << 2; - $grbit |= $fNoColor << 3; - $grbit |= $fDraft << 4; - $grbit |= $fNotes << 5; - $grbit |= $fNoOrient << 6; - $grbit |= $fUsePage << 7; - - $numHdr = pack("d", $numHdr); - $numFtr = pack("d", $numFtr); - if ($this->_byte_order) { // if it's Big Endian - $numHdr = strrev($numHdr); - $numFtr = strrev($numFtr); - } - - $header = pack("vv", $record, $length); - $data1 = pack("vvvvvvvv", $iPaperSize, - $iScale, - $iPageStart, - $iFitWidth, - $iFitHeight, - $grbit, - $iRes, - $iVRes); - $data2 = $numHdr.$numFtr; - $data3 = pack("v", $iCopies); - $this->_prepend($header . $data1 . $data2 . $data3); - } - - /** - * Store the header caption BIFF record. - * - * @access private - */ - function _storeHeader() - { - $record = 0x0014; // Record identifier - - $str = $this->_header; // header string - $cch = strlen($str); // Length of header string - if ($this->_BIFF_version == 0x0600) { - $encoding = 0x0; // TODO: Unicode support - $length = 3 + $cch; // Bytes to follow - } else { - $length = 1 + $cch; // Bytes to follow - } - - $header = pack("vv", $record, $length); - if ($this->_BIFF_version == 0x0600) { - $data = pack("vC", $cch, $encoding); - } else { - $data = pack("C", $cch); - } - - $this->_prepend($header.$data.$str); - } - - /** - * Store the footer caption BIFF record. - * - * @access private - */ - function _storeFooter() - { - $record = 0x0015; // Record identifier - - $str = $this->_footer; // Footer string - $cch = strlen($str); // Length of footer string - if ($this->_BIFF_version == 0x0600) { - $encoding = 0x0; // TODO: Unicode support - $length = 3 + $cch; // Bytes to follow - } else { - $length = 1 + $cch; - } - - $header = pack("vv", $record, $length); - if ($this->_BIFF_version == 0x0600) { - $data = pack("vC", $cch, $encoding); - } else { - $data = pack("C", $cch); - } - - $this->_prepend($header . $data . $str); - } - - /** - * Store the horizontal centering HCENTER BIFF record. - * - * @access private - */ - function _storeHcenter() - { - $record = 0x0083; // Record identifier - $length = 0x0002; // Bytes to follow - - $fHCenter = $this->_hcenter; // Horizontal centering - - $header = pack("vv", $record, $length); - $data = pack("v", $fHCenter); - - $this->_prepend($header.$data); - } - - /** - * Store the vertical centering VCENTER BIFF record. - * - * @access private - */ - function _storeVcenter() - { - $record = 0x0084; // Record identifier - $length = 0x0002; // Bytes to follow - - $fVCenter = $this->_vcenter; // Horizontal centering - - $header = pack("vv", $record, $length); - $data = pack("v", $fVCenter); - $this->_prepend($header . $data); - } - - /** - * Store the LEFTMARGIN BIFF record. - * - * @access private - */ - function _storeMarginLeft() - { - $record = 0x0026; // Record identifier - $length = 0x0008; // Bytes to follow - - $margin = $this->_margin_left; // Margin in inches - - $header = pack("vv", $record, $length); - $data = pack("d", $margin); - if ($this->_byte_order) { // if it's Big Endian - $data = strrev($data); - } - - $this->_prepend($header . $data); - } - - /** - * Store the RIGHTMARGIN BIFF record. - * - * @access private - */ - function _storeMarginRight() - { - $record = 0x0027; // Record identifier - $length = 0x0008; // Bytes to follow - - $margin = $this->_margin_right; // Margin in inches - - $header = pack("vv", $record, $length); - $data = pack("d", $margin); - if ($this->_byte_order) { // if it's Big Endian - $data = strrev($data); - } - - $this->_prepend($header . $data); - } - - /** - * Store the TOPMARGIN BIFF record. - * - * @access private - */ - function _storeMarginTop() - { - $record = 0x0028; // Record identifier - $length = 0x0008; // Bytes to follow - - $margin = $this->_margin_top; // Margin in inches - - $header = pack("vv", $record, $length); - $data = pack("d", $margin); - if ($this->_byte_order) { // if it's Big Endian - $data = strrev($data); - } - - $this->_prepend($header . $data); - } - - /** - * Store the BOTTOMMARGIN BIFF record. - * - * @access private - */ - function _storeMarginBottom() - { - $record = 0x0029; // Record identifier - $length = 0x0008; // Bytes to follow - - $margin = $this->_margin_bottom; // Margin in inches - - $header = pack("vv", $record, $length); - $data = pack("d", $margin); - if ($this->_byte_order) { // if it's Big Endian - $data = strrev($data); - } - - $this->_prepend($header . $data); - } - - /** - * Merges the area given by its arguments. - * This is an Excel97/2000 method. It is required to perform more complicated - * merging than the normal setAlign('merge'). - * - * @access public - * @param integer $first_row First row of the area to merge - * @param integer $first_col First column of the area to merge - * @param integer $last_row Last row of the area to merge - * @param integer $last_col Last column of the area to merge - */ - function mergeCells($first_row, $first_col, $last_row, $last_col) - { - $record = 0x00E5; // Record identifier - $length = 0x000A; // Bytes to follow - $cref = 1; // Number of refs - - // Swap last row/col for first row/col as necessary - if ($first_row > $last_row) { - list($first_row, $last_row) = array($last_row, $first_row); - } - - if ($first_col > $last_col) { - list($first_col, $last_col) = array($last_col, $first_col); - } - - $header = pack("vv", $record, $length); - $data = pack("vvvvv", $cref, $first_row, $last_row, - $first_col, $last_col); - - $this->_append($header.$data); - } - - /** - * Write the PRINTHEADERS BIFF record. - * - * @access private - */ - function _storePrintHeaders() - { - $record = 0x002a; // Record identifier - $length = 0x0002; // Bytes to follow - - $fPrintRwCol = $this->_print_headers; // Boolean flag - - $header = pack("vv", $record, $length); - $data = pack("v", $fPrintRwCol); - $this->_prepend($header . $data); - } - - /** - * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the - * GRIDSET record. - * - * @access private - */ - function _storePrintGridlines() - { - $record = 0x002b; // Record identifier - $length = 0x0002; // Bytes to follow - - $fPrintGrid = $this->_print_gridlines; // Boolean flag - - $header = pack("vv", $record, $length); - $data = pack("v", $fPrintGrid); - $this->_prepend($header . $data); - } - - /** - * Write the GRIDSET BIFF record. Must be used in conjunction with the - * PRINTGRIDLINES record. - * - * @access private - */ - function _storeGridset() - { - $record = 0x0082; // Record identifier - $length = 0x0002; // Bytes to follow - - $fGridSet = !($this->_print_gridlines); // Boolean flag - - $header = pack("vv", $record, $length); - $data = pack("v", $fGridSet); - $this->_prepend($header . $data); - } - - /** - * Write the GUTS BIFF record. This is used to configure the gutter margins - * where Excel outline symbols are displayed. The visibility of the gutters is - * controlled by a flag in WSBOOL. - * - * @see _storeWsbool() - * @access private - */ - function _storeGuts() - { - $record = 0x0080; // Record identifier - $length = 0x0008; // Bytes to follow - - $dxRwGut = 0x0000; // Size of row gutter - $dxColGut = 0x0000; // Size of col gutter - - $row_level = $this->_outline_row_level; - $col_level = 0; - - // Calculate the maximum column outline level. The equivalent calculation - // for the row outline level is carried out in setRow(). - $colcount = count($this->_colinfo); - for ($i = 0; $i < $colcount; $i++) { - // Skip cols without outline level info. - if (count($col_level) >= 6) { - $col_level = max($this->_colinfo[$i][5], $col_level); - } - } - - // Set the limits for the outline levels (0 <= x <= 7). - $col_level = max(0, min($col_level, 7)); - - // The displayed level is one greater than the max outline levels - if ($row_level) { - $row_level++; - } - if ($col_level) { - $col_level++; - } - - $header = pack("vv", $record, $length); - $data = pack("vvvv", $dxRwGut, $dxColGut, $row_level, $col_level); - - $this->_prepend($header.$data); - } - - - /** - * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction - * with the SETUP record. - * - * @access private - */ - function _storeWsbool() - { - $record = 0x0081; // Record identifier - $length = 0x0002; // Bytes to follow - $grbit = 0x0000; - - // The only option that is of interest is the flag for fit to page. So we - // set all the options in one go. - // - /*if ($this->_fit_page) { - $grbit = 0x05c1; - } else { - $grbit = 0x04c1; - }*/ - // Set the option flags - $grbit |= 0x0001; // Auto page breaks visible - if ($this->_outline_style) { - $grbit |= 0x0020; // Auto outline styles - } - if ($this->_outline_below) { - $grbit |= 0x0040; // Outline summary below - } - if ($this->_outline_right) { - $grbit |= 0x0080; // Outline summary right - } - if ($this->_fit_page) { - $grbit |= 0x0100; // Page setup fit to page - } - if ($this->_outline_on) { - $grbit |= 0x0400; // Outline symbols displayed - } - - $header = pack("vv", $record, $length); - $data = pack("v", $grbit); - $this->_prepend($header . $data); - } - - /** - * Write the HORIZONTALPAGEBREAKS BIFF record. - * - * @access private - */ - function _storeHbreak() - { - // Return if the user hasn't specified pagebreaks - if (empty($this->_hbreaks)) { - return; - } - - // Sort and filter array of page breaks - $breaks = $this->_hbreaks; - sort($breaks, SORT_NUMERIC); - if ($breaks[0] == 0) { // don't use first break if it's 0 - array_shift($breaks); - } - - $record = 0x001b; // Record identifier - $cbrk = count($breaks); // Number of page breaks - if ($this->_BIFF_version == 0x0600) { - $length = 2 + 6*$cbrk; // Bytes to follow - } else { - $length = 2 + 2*$cbrk; // Bytes to follow - } - - $header = pack("vv", $record, $length); - $data = pack("v", $cbrk); - - // Append each page break - foreach ($breaks as $break) { - if ($this->_BIFF_version == 0x0600) { - $data .= pack("vvv", $break, 0x0000, 0x00ff); - } else { - $data .= pack("v", $break); - } - } - - $this->_prepend($header.$data); - } - - - /** - * Write the VERTICALPAGEBREAKS BIFF record. - * - * @access private - */ - function _storeVbreak() - { - // Return if the user hasn't specified pagebreaks - if (empty($this->_vbreaks)) { - return; - } - - // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. - // It is slightly higher in Excel 97/200, approx. 1026 - $breaks = array_slice($this->_vbreaks,0,1000); - - // Sort and filter array of page breaks - sort($breaks, SORT_NUMERIC); - if ($breaks[0] == 0) { // don't use first break if it's 0 - array_shift($breaks); - } - - $record = 0x001a; // Record identifier - $cbrk = count($breaks); // Number of page breaks - if ($this->_BIFF_version == 0x0600) { - $length = 2 + 6*$cbrk; // Bytes to follow - } else { - $length = 2 + 2*$cbrk; // Bytes to follow - } - - $header = pack("vv", $record, $length); - $data = pack("v", $cbrk); - - // Append each page break - foreach ($breaks as $break) { - if ($this->_BIFF_version == 0x0600) { - $data .= pack("vvv", $break, 0x0000, 0xffff); - } else { - $data .= pack("v", $break); - } - } - - $this->_prepend($header . $data); - } - - /** - * Set the Biff PROTECT record to indicate that the worksheet is protected. - * - * @access private - */ - function _storeProtect() - { - // Exit unless sheet protection has been specified - if ($this->_protect == 0) { - return; - } - - $record = 0x0012; // Record identifier - $length = 0x0002; // Bytes to follow - - $fLock = $this->_protect; // Worksheet is protected - - $header = pack("vv", $record, $length); - $data = pack("v", $fLock); - - $this->_prepend($header.$data); - } - - /** - * Write the worksheet PASSWORD record. - * - * @access private - */ - function _storePassword() - { - // Exit unless sheet protection and password have been specified - if (($this->_protect == 0) || (!isset($this->_password))) { - return; - } - - $record = 0x0013; // Record identifier - $length = 0x0002; // Bytes to follow - - $wPassword = $this->_password; // Encoded password - - $header = pack("vv", $record, $length); - $data = pack("v", $wPassword); - - $this->_prepend($header . $data); - } - - - /** - * Insert a 24bit bitmap image in a worksheet. - * - * @access public - * @param integer $row The row we are going to insert the bitmap into - * @param integer $col The column we are going to insert the bitmap into - * @param string $bitmap The bitmap filename - * @param integer $x The horizontal position (offset) of the image inside the cell. - * @param integer $y The vertical position (offset) of the image inside the cell. - * @param integer $scale_x The horizontal scale - * @param integer $scale_y The vertical scale - */ - function insertBitmap($row, $col, $bitmap, $x = 0, $y = 0, $scale_x = 1, $scale_y = 1) - { - $bitmap_array = $this->_processBitmap($bitmap); - if ($this->isError($bitmap_array)) { - $this->writeString($row, $col, $bitmap_array->getMessage()); - return; - } - list($width, $height, $size, $data) = $bitmap_array; //$this->_processBitmap($bitmap); - - // Scale the frame of the image. - $width *= $scale_x; - $height *= $scale_y; - - // Calculate the vertices of the image and write the OBJ record - $this->_positionImage($col, $row, $x, $y, $width, $height); - - // Write the IMDATA record to store the bitmap data - $record = 0x007f; - $length = 8 + $size; - $cf = 0x09; - $env = 0x01; - $lcb = $size; - - $header = pack("vvvvV", $record, $length, $cf, $env, $lcb); - $this->_append($header.$data); - } - - /** - * Calculate the vertices that define the position of the image as required by - * the OBJ record. - * - * +------------+------------+ - * | A | B | - * +-----+------------+------------+ - * | |(x1,y1) | | - * | 1 |(A1)._______|______ | - * | | | | | - * | | | | | - * +-----+----| BITMAP |-----+ - * | | | | | - * | 2 | |______________. | - * | | | (B2)| - * | | | (x2,y2)| - * +---- +------------+------------+ - * - * Example of a bitmap that covers some of the area from cell A1 to cell B2. - * - * Based on the width and height of the bitmap we need to calculate 8 vars: - * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. - * The width and height of the cells are also variable and have to be taken into - * account. - * The values of $col_start and $row_start are passed in from the calling - * function. The values of $col_end and $row_end are calculated by subtracting - * the width and height of the bitmap from the width and height of the - * underlying cells. - * The vertices are expressed as a percentage of the underlying cell width as - * follows (rhs values are in pixels): - * - * x1 = X / W *1024 - * y1 = Y / H *256 - * x2 = (X-1) / W *1024 - * y2 = (Y-1) / H *256 - * - * Where: X is distance from the left side of the underlying cell - * Y is distance from the top of the underlying cell - * W is the width of the cell - * H is the height of the cell - * - * @access private - * @note the SDK incorrectly states that the height should be expressed as a - * percentage of 1024. - * @param integer $col_start Col containing upper left corner of object - * @param integer $row_start Row containing top left corner of object - * @param integer $x1 Distance to left side of object - * @param integer $y1 Distance to top of object - * @param integer $width Width of image frame - * @param integer $height Height of image frame - */ - function _positionImage($col_start, $row_start, $x1, $y1, $width, $height) - { - // Initialise end cell to the same as the start cell - $col_end = $col_start; // Col containing lower right corner of object - $row_end = $row_start; // Row containing bottom right corner of object - - // Zero the specified offset if greater than the cell dimensions - if ($x1 >= $this->_sizeCol($col_start)) { - $x1 = 0; - } - if ($y1 >= $this->_sizeRow($row_start)) { - $y1 = 0; - } - - $width = $width + $x1 -1; - $height = $height + $y1 -1; - - // Subtract the underlying cell widths to find the end cell of the image - while ($width >= $this->_sizeCol($col_end)) { - $width -= $this->_sizeCol($col_end); - $col_end++; - } - - // Subtract the underlying cell heights to find the end cell of the image - while ($height >= $this->_sizeRow($row_end)) { - $height -= $this->_sizeRow($row_end); - $row_end++; - } - - // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell - // with zero eight or width. - // - if ($this->_sizeCol($col_start) == 0) { - return; - } - if ($this->_sizeCol($col_end) == 0) { - return; - } - if ($this->_sizeRow($row_start) == 0) { - return; - } - if ($this->_sizeRow($row_end) == 0) { - return; - } - - // Convert the pixel values to the percentage value expected by Excel - $x1 = $x1 / $this->_sizeCol($col_start) * 1024; - $y1 = $y1 / $this->_sizeRow($row_start) * 256; - $x2 = $width / $this->_sizeCol($col_end) * 1024; // Distance to right side of object - $y2 = $height / $this->_sizeRow($row_end) * 256; // Distance to bottom of object - - $this->_storeObjPicture($col_start, $x1, - $row_start, $y1, - $col_end, $x2, - $row_end, $y2); - } - - /** - * Convert the width of a cell from user's units to pixels. By interpolation - * the relationship is: y = 7x +5. If the width hasn't been set by the user we - * use the default value. If the col is hidden we use a value of zero. - * - * @access private - * @param integer $col The column - * @return integer The width in pixels - */ - function _sizeCol($col) - { - // Look up the cell value to see if it has been changed - if (isset($this->col_sizes[$col])) { - if ($this->col_sizes[$col] == 0) { - return(0); - } else { - return(floor(7 * $this->col_sizes[$col] + 5)); - } - } else { - return(64); - } - } - - /** - * Convert the height of a cell from user's units to pixels. By interpolation - * the relationship is: y = 4/3x. If the height hasn't been set by the user we - * use the default value. If the row is hidden we use a value of zero. (Not - * possible to hide row yet). - * - * @access private - * @param integer $row The row - * @return integer The width in pixels - */ - function _sizeRow($row) - { - // Look up the cell value to see if it has been changed - if (isset($this->_row_sizes[$row])) { - if ($this->_row_sizes[$row] == 0) { - return(0); - } else { - return(floor(4/3 * $this->_row_sizes[$row])); - } - } else { - return(17); - } - } - - /** - * Store the OBJ record that precedes an IMDATA record. This could be generalise - * to support other Excel objects. - * - * @access private - * @param integer $colL Column containing upper left corner of object - * @param integer $dxL Distance from left side of cell - * @param integer $rwT Row containing top left corner of object - * @param integer $dyT Distance from top of cell - * @param integer $colR Column containing lower right corner of object - * @param integer $dxR Distance from right of cell - * @param integer $rwB Row containing bottom right corner of object - * @param integer $dyB Distance from bottom of cell - */ - function _storeObjPicture($colL,$dxL,$rwT,$dyT,$colR,$dxR,$rwB,$dyB) - { - $record = 0x005d; // Record identifier - $length = 0x003c; // Bytes to follow - - $cObj = 0x0001; // Count of objects in file (set to 1) - $OT = 0x0008; // Object type. 8 = Picture - $id = 0x0001; // Object ID - $grbit = 0x0614; // Option flags - - $cbMacro = 0x0000; // Length of FMLA structure - $Reserved1 = 0x0000; // Reserved - $Reserved2 = 0x0000; // Reserved - - $icvBack = 0x09; // Background colour - $icvFore = 0x09; // Foreground colour - $fls = 0x00; // Fill pattern - $fAuto = 0x00; // Automatic fill - $icv = 0x08; // Line colour - $lns = 0xff; // Line style - $lnw = 0x01; // Line weight - $fAutoB = 0x00; // Automatic border - $frs = 0x0000; // Frame style - $cf = 0x0009; // Image format, 9 = bitmap - $Reserved3 = 0x0000; // Reserved - $cbPictFmla = 0x0000; // Length of FMLA structure - $Reserved4 = 0x0000; // Reserved - $grbit2 = 0x0001; // Option flags - $Reserved5 = 0x0000; // Reserved - - - $header = pack("vv", $record, $length); - $data = pack("V", $cObj); - $data .= pack("v", $OT); - $data .= pack("v", $id); - $data .= pack("v", $grbit); - $data .= pack("v", $colL); - $data .= pack("v", $dxL); - $data .= pack("v", $rwT); - $data .= pack("v", $dyT); - $data .= pack("v", $colR); - $data .= pack("v", $dxR); - $data .= pack("v", $rwB); - $data .= pack("v", $dyB); - $data .= pack("v", $cbMacro); - $data .= pack("V", $Reserved1); - $data .= pack("v", $Reserved2); - $data .= pack("C", $icvBack); - $data .= pack("C", $icvFore); - $data .= pack("C", $fls); - $data .= pack("C", $fAuto); - $data .= pack("C", $icv); - $data .= pack("C", $lns); - $data .= pack("C", $lnw); - $data .= pack("C", $fAutoB); - $data .= pack("v", $frs); - $data .= pack("V", $cf); - $data .= pack("v", $Reserved3); - $data .= pack("v", $cbPictFmla); - $data .= pack("v", $Reserved4); - $data .= pack("v", $grbit2); - $data .= pack("V", $Reserved5); - - $this->_append($header . $data); - } - - /** - * Convert a 24 bit bitmap into the modified internal format used by Windows. - * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the - * MSDN library. - * - * @access private - * @param string $bitmap The bitmap to process - * @return array Array with data and properties of the bitmap - */ - function _processBitmap($bitmap) - { - // Open file. - $bmp_fd = @fopen($bitmap,"rb"); - if (!$bmp_fd) { - $this->raiseError("Couldn't import $bitmap"); - } - - // Slurp the file into a string. - $data = fread($bmp_fd, filesize($bitmap)); - - // Check that the file is big enough to be a bitmap. - if (strlen($data) <= 0x36) { - $this->raiseError("$bitmap doesn't contain enough data.\n"); - } - - // The first 2 bytes are used to identify the bitmap. - $identity = unpack("A2ident", $data); - if ($identity['ident'] != "BM") { - $this->raiseError("$bitmap doesn't appear to be a valid bitmap image.\n"); - } - - // Remove bitmap data: ID. - $data = substr($data, 2); - - // Read and remove the bitmap size. This is more reliable than reading - // the data size at offset 0x22. - // - $size_array = unpack("Vsa", substr($data, 0, 4)); - $size = $size_array['sa']; - $data = substr($data, 4); - $size -= 0x36; // Subtract size of bitmap header. - $size += 0x0C; // Add size of BIFF header. - - // Remove bitmap data: reserved, offset, header length. - $data = substr($data, 12); - - // Read and remove the bitmap width and height. Verify the sizes. - $width_and_height = unpack("V2", substr($data, 0, 8)); - $width = $width_and_height[1]; - $height = $width_and_height[2]; - $data = substr($data, 8); - if ($width > 0xFFFF) { - $this->raiseError("$bitmap: largest image width supported is 65k.\n"); - } - if ($height > 0xFFFF) { - $this->raiseError("$bitmap: largest image height supported is 65k.\n"); - } - - // Read and remove the bitmap planes and bpp data. Verify them. - $planes_and_bitcount = unpack("v2", substr($data, 0, 4)); - $data = substr($data, 4); - if ($planes_and_bitcount[2] != 24) { // Bitcount - $this->raiseError("$bitmap isn't a 24bit true color bitmap.\n"); - } - if ($planes_and_bitcount[1] != 1) { - $this->raiseError("$bitmap: only 1 plane supported in bitmap image.\n"); - } - - // Read and remove the bitmap compression. Verify compression. - $compression = unpack("Vcomp", substr($data, 0, 4)); - $data = substr($data, 4); - - //$compression = 0; - if ($compression['comp'] != 0) { - $this->raiseError("$bitmap: compression not supported in bitmap image.\n"); - } - - // Remove bitmap data: data size, hres, vres, colours, imp. colours. - $data = substr($data, 20); - - // Add the BITMAPCOREHEADER data - $header = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); - $data = $header . $data; - - return (array($width, $height, $size, $data)); - } - - /** - * Store the window zoom factor. This should be a reduced fraction but for - * simplicity we will store all fractions with a numerator of 100. - * - * @access private - */ - function _storeZoom() - { - // If scale is 100 we don't need to write a record - if ($this->_zoom == 100) { - return; - } - - $record = 0x00A0; // Record identifier - $length = 0x0004; // Bytes to follow - - $header = pack("vv", $record, $length); - $data = pack("vv", $this->_zoom, 100); - $this->_append($header . $data); - } - - /** - * FIXME: add comments - */ - function setValidation($row1, $col1, $row2, $col2, &$validator) - { - $this->_dv[] = $validator->_getData() . - pack("vvvvv", 1, $row1, $row2, $col1, $col2); - } - - /** - * Store the DVAL and DV records. - * - * @access private - */ - function _storeDataValidity() - { - $record = 0x01b2; // Record identifier - $length = 0x0012; // Bytes to follow - - $grbit = 0x0002; // Prompt box at cell, no cached validity data at DV records - $horPos = 0x00000000; // Horizontal position of prompt box, if fixed position - $verPos = 0x00000000; // Vertical position of prompt box, if fixed position - $objId = 0xffffffff; // Object identifier of drop down arrow object, or -1 if not visible - - $header = pack('vv', $record, $length); - $data = pack('vVVVV', $grbit, $horPos, $verPos, $objId, - count($this->_dv)); - $this->_append($header.$data); - - $record = 0x01be; // Record identifier - foreach ($this->_dv as $dv) { - $length = strlen($dv); // Bytes to follow - $header = pack("vv", $record, $length); - $this->_append($header . $dv); - } - } -} -?> diff --git a/include/limesurvey/admin/classes/phpzip/phpzip.inc.php b/include/limesurvey/admin/classes/phpzip/phpzip.inc.php deleted file mode 100644 index 437d35ec..00000000 --- a/include/limesurvey/admin/classes/phpzip/phpzip.inc.php +++ /dev/null @@ -1,271 +0,0 @@ - GetFileList($dir); - } - - if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir); - else chdir($curdir); - - if (count($filelist)>0) - { - foreach($filelist as $filename) - { - if (is_file($filename) && basename($filename)!='.htaccess') - { - $fd = fopen ($filename, "r"); - $content = @fread ($fd, filesize ($filename)); - fclose ($fd); - - if (is_array($dir)) $filename = basename($filename); - $this -> addFile($content, $filename); - } - } - $out = $this -> file(); - - chdir($curdir); - $fp = fopen($zipfilename, "w"); - fwrite($fp, $out, strlen($out)); - fclose($fp); - } - return 1; - } - else return 0; - } - - function GetFileList($dir) - { - $file=Array(); - if (file_exists($dir)) - { - $args = func_get_args(); - if(isset($args[1])) {$pref = $args[1];} else {$pref="";} - - $dh = opendir($dir); - while($files = readdir($dh)) - { - if (($files!=".")&&($files!="..")) - { - if (!is_dir($dir.$files)) - { - $file[]=$pref.$files; - } - } - } - closedir($dh); - } - return $file; - } - - var $datasec = array(); - var $ctrl_dir = array(); - var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; - var $old_offset = 0; - - /** - * Converts an Unix timestamp to a four byte DOS date and time format (date - * in high two bytes, time in low two bytes allowing magnitude comparison). - * - * @param integer the current Unix timestamp - * - * @return integer the current date in a four byte DOS format - * - * @access private - */ - function unix2DosTime($unixtime = 0) { - $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime); - - if ($timearray['year'] < 1980) { - $timearray['year'] = 1980; - $timearray['mon'] = 1; - $timearray['mday'] = 1; - $timearray['hours'] = 0; - $timearray['minutes'] = 0; - $timearray['seconds'] = 0; - } // end if - - return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | - ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); - } // end of the 'unix2DosTime()' method - - - /** - * Adds "file" to archive - * - * @param string file contents - * @param string name of the file in the archive (may contains the path) - * @param integer the current timestamp - * - * @access public - */ - function addFile($data, $name, $time = 0) - { - $name = str_replace('\\', '/', $name); - - $dtime = dechex($this->unix2DosTime($time)); - $hexdtime = '\x' . $dtime[6] . $dtime[7] - . '\x' . $dtime[4] . $dtime[5] - . '\x' . $dtime[2] . $dtime[3] - . '\x' . $dtime[0] . $dtime[1]; - eval('$hexdtime = "' . $hexdtime . '";'); - - $fr = "\x50\x4b\x03\x04"; - $fr .= "\x14\x00"; // ver needed to extract - $fr .= "\x00\x00"; // gen purpose bit flag - $fr .= "\x08\x00"; // compression method - $fr .= $hexdtime; // last mod time and date - - // "local file header" segment - $unc_len = strlen($data); - $crc = crc32($data); - $zdata = gzcompress($data); - $c_len = strlen($zdata); - $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug - $fr .= pack('V', $crc); // crc32 - $fr .= pack('V', $c_len); // compressed filesize - $fr .= pack('V', $unc_len); // uncompressed filesize - $fr .= pack('v', strlen($name)); // length of filename - $fr .= pack('v', 0); // extra field length - $fr .= $name; - - // "file data" segment - $fr .= $zdata; - - // "data descriptor" segment (optional but necessary if archive is not - // served as file) - $fr .= pack('V', $crc); // crc32 - $fr .= pack('V', $c_len); // compressed filesize - $fr .= pack('V', $unc_len); // uncompressed filesize - - // add this entry to array - $this -> datasec[] = $fr; - $new_offset = strlen(implode('', $this->datasec)); - - // now add to central directory record - $cdrec = "\x50\x4b\x01\x02"; - $cdrec .= "\x00\x00"; // version made by - $cdrec .= "\x14\x00"; // version needed to extract - $cdrec .= "\x00\x00"; // gen purpose bit flag - $cdrec .= "\x08\x00"; // compression method - $cdrec .= $hexdtime; // last mod time & date - $cdrec .= pack('V', $crc); // crc32 - $cdrec .= pack('V', $c_len); // compressed filesize - $cdrec .= pack('V', $unc_len); // uncompressed filesize - $cdrec .= pack('v', strlen($name) ); // length of filename - $cdrec .= pack('v', 0 ); // extra field length - $cdrec .= pack('v', 0 ); // file comment length - $cdrec .= pack('v', 0 ); // disk number start - $cdrec .= pack('v', 0 ); // internal file attributes - $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set - - $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header - $this -> old_offset = $new_offset; - - $cdrec .= $name; - - // optional extra field, file comment goes here - // save to central directory - $this -> ctrl_dir[] = $cdrec; - } // end of the 'addFile()' method - - - /** - * Dumps out file - * - * @return string the zipped file - * - * @access public - */ - function file() - { - $data = implode('', $this -> datasec); - $ctrldir = implode('', $this -> ctrl_dir); - - return - $data . - $ctrldir . - $this -> eof_ctrl_dir . - pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk" - pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall - pack('V', strlen($ctrldir)) . // size of central dir - pack('V', strlen($data)) . // offset to start of central dir - "\x00\x00"; // .zip file comment length - } // end of the 'file()' method - - - // This comes from http://de.tikiwiki.org/xref-BRANCH-1-9/nav.html?lib/sheet/include/org/apicnet/io/archive/CZip.php.source.html - function extract($dir, $zipfilename){ - if (function_exists("zip_open")) { - - $this->createDir($dir); - $zip = zip_open($zipfilename); - if ($zip) { - while ($zip_entry = zip_read($zip)) { - if (zip_entry_open($zip, $zip_entry, "r")) { - $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); - - // LimeSurvey Only extract first dir for the moment - if ( ! preg_match("/(\/)/i", zip_entry_name($zip_entry))) - { - $this->createFile($dir."/".zip_entry_name($zip_entry), $buf,zip_entry_filesize($zip_entry)); - } - zip_entry_close($zip_entry); - } - } - zip_close($zip); - } - else - { - return "Error:OpenZip"; - } - } - return 'OK'; - } - - function createDir($dir){ - if (preg_match("/(\/$)/", $dir)) @mkdir (substr($dir, 0, strlen($dir) - 1)); - else @mkdir ($dir); - } - - - // This comes from http://fr.php.net/zip - function createFile($file, $data, $size){ - //$file = new File($file, TRUE); - //if ($file->exists()) { - // $file->delFile(); - // $file->createFile(); - //} - //$file->writeData($data); - - if (is_file($file)) - { - unlink($file); - } - $fopen = fopen($file, "w"); - fwrite($fopen,$data,$size); - } - -} // end of the 'PHPZip' class -?> diff --git a/include/limesurvey/admin/classes/quexml/quexmlpdf.php b/include/limesurvey/admin/classes/quexml/quexmlpdf.php deleted file mode 100644 index 0f043099..00000000 --- a/include/limesurvey/admin/classes/quexml/quexmlpdf.php +++ /dev/null @@ -1,2153 +0,0 @@ - - * @copyright (c) 2010 Australian Consortium for Social and Political Research Incorporated (ACSPRI) - * @since 2010-09-02 - * @link http://www.acspri.org.au/software - * @link http://quexml.sourceforge.net - * @link http://quexf.sourceforge.net - */ -class queXMLPDF extends TCPDF { - - /** - * Define an inch in MM - * - * @const float Defaults to 25.4 - */ - const INCH_IN_MM = 25.4; - - /** - * Pixels per inch of exported document - * - * @var int Defaults to 300. - */ - protected $ppi = 300; - - /** - * Whether a page break has occured - * - * @var bool - */ - private $pageBreakOccured; - - /** - * Corner border (the number of mm between the edge of the page and the start of the document) - * - * @var int Defaults to 15. - * @since 2010-09-02 - */ - protected $cornerBorder = 14; - - /** - * The length in MM of a corner line - * - * @var mixed Defaults to 20. - * @since 2010-09-20 - */ - protected $cornerLength = 20; - - /** - * The width in MM of a corner line - * - * @var mixed Defaults to 0.5. - * @since 2010-09-20 - */ - protected $cornerWidth = 0.5; - - - /** - * The TCPDF barcode type - * - * @var bool Defaults to 'I25'. - * @since 2010-09-20 - * @see write1DBarcode - */ - protected $barcodeType = 'I25'; - - /** - * The x position in MM of the barcode - * - * @var bool Defaults to 138. - * @since 2010-09-20 - * @deprecated - * @see $barcodeMarginX - */ - //protected $barcodeX = 138; - - /** - * The distance between the right hand page border and - * the end of the barcode in MM - * - * @var bool Defaults to 23. - * @since 2011-10-25 - */ - protected $barcodeMarginX = 23; - - /** - * Y position of barcode in mm - * - * @var bool Defaults to 6. - * @since 2010-09-20 - */ - protected $barcodeY = 6; - - /** - * Width of the barcode in mm - * - * @var bool Defaults to 49. - * @since 2010-09-20 - */ - protected $barcodeW = 49; - - /** - * Height of the barcode in mm - * - * @var bool Defaults to 6. - * @since 2010-09-20 - */ - protected $barcodeH = 6; - - /** - * The questionnaire ID of this form - * - * @var mixed Defaults to 1. - * @since 2010-09-20 - */ - protected $questionnaireId = 1; - - /** - * The length of a the id portion barcode - * - * @var int Defaults to 6. - * @since 2010-09-20 - * @see $pageLength - */ - protected $idLength = 6; - - /** - * The length of the page portion of the barcode - * - * @var mixed Defaults to 2. - * @since 2010-09-20 - * @see $idLength - */ - protected $pageLength = 2; - - /** - * width of the question title column in MM - * - * @var mixed Defaults to 14. - * @since 2010-09-20 - */ - protected $questionTitleWidth = 14; - - /** - * Width of question text in MM - * - * @var mixed Defaults to 120. - * @since 2010-09-20 - */ - protected $questionTextWidth = 120; - - /** - * Height of the border between questions in MM - * - * @var mixed Defaults to 1. - * @since 2010-09-20 - */ - protected $questionBorderBottom = 1; - - /** - * Width of the skip column area (where skip text is written) - * - * @var string Defaults to 20. - * @since 2010-09-20 - */ - protected $skipColumnWidth = 20; - - /** - * The default style for the text of the questionnaire - * - * @var string Defaults to "". - * @since 2010-09-16 - */ - protected $style = ""; - - /** - * Width of the area of each single response - * - * @var string Defaults to 10. - * @since 2010-09-20 - * Height of the area of a single response where displayed horizontally - * - * @var string Defaults to 10.5. - * @since 2011-12-20 - */ - protected $singleResponseHorizontalHeight = 10.5; - - /** - */ - protected $singleResponseAreaWidth = 10; - - /** - * Height of the are of each single response (includes guiding lines) - * - * @var string Defaults to 9. - * @since 2010-09-20 - */ - protected $singleResponseAreaHeight = 9; - - /** - * Width of a single response box - * - * @var string Defaults to 5. - * @since 2010-09-20 - */ - protected $singleResponseBoxWidth = 5; - - /** - * Height of a single response box - * - * @var string Defaults to 5. - * @since 2010-09-20 - */ - protected $singleResponseBoxHeight = 5; - - /** - * Width of a response boxes border - * - * @var string Defaults to 0.1. - * @since 2010-09-20 - */ - protected $singleResponseBoxBorder = 0.15; - - /** - * Length of the "eye guide" for a vertical response box - * - * @var string Defaults to 1. - * @since 2010-09-20 - */ - protected $singleResponseBoxLineLength = 1; - - /** - * Vertical area taken up by a response box - * - * @var string Defaults to 15. - * @since 2010-09-20 - */ - protected $singleResponseVerticalAreaWidth = 15; - - /** - * Vertical area taken up by a "small" vertical response area - * - * @var string Defaults to 9. - * @since 2010-09-20 - */ - protected $singleResponseVerticalAreaWidthSmall = 9; - - /** - * Maximum number of horizontal boxes to display normally before shrinking horizontal area width - * - * @var int Defaults to 10. - * @since 2010-09-08 - */ - protected $singleResponseHorizontalMax = 10; - - /** - * The height of an arrow - * - * @var array Defaults to 3. - * @since 2010-09-20 - */ - protected $arrowHeight = 3; - - /** - * The width of a text response box - * - * @var mixed Defaults to 6. - * @since 2010-09-20 - */ - protected $textResponseWidth = 6; - - /** - * The border width of a text resposne box - * - * @var mixed Defaults to 0.15. Any less than this may produce printing problems - * @since 2010-09-20 - */ - protected $textResponseBorder = 0.15; - - /** - * The height of a text response box - * - * @var mixed Defaults to 8. - * @since 2010-09-20 - */ - protected $textResponseHeight = 8; - - /** - * The maximum number of text responses per line - * - * @var mixed Defaults to 24. - * @since 2010-09-20 - * @deprecated - * @see $textResponseMarginX - */ - //protected $textResponsesPerLine = 24; - - /** - * The left hand margin of text responses to auto calculate responses - * per line (mm) - * - * @var mixed Defaults to 13. - * @since 2011-10-25 - */ - protected $textResponseMarginX = 13; - - /** - * Maximum number of text responses boxes where the label should appear on the same line - * - * @var mixed Defaults to 16. - * @since 2010-09-20 - * @deprecated - * @see $labelTextResponsesSameLineMarginX - */ - //protected $labelTextResponsesSameLine = 16; - - /** - * The left hand margin of text responses to auto calculated responses - * per line where the label should appear on the same line (mm) - * - * @var mixed Defaults to 62. - * @since 2011-10-25 - */ - protected $labelTextResponsesSameLineMarginX = 62; - - /** - * The gap between multi line text responses - * - * @var mixed Defaults to 1. - * @since 2010-09-20 - */ - protected $textResponseLineSpacing = 1; - - /** - * The vertical gap between subquestions in mm - * - * @var string Defaults to 2. - * @since 2010-09-02 - */ - protected $subQuestionLineSpacing = 2; - - /** - * The multiplier from long text response width specified to the height in mm - * - * @var mixed Defaults to 1. - * @since 2010-09-20 - */ - protected $longTextResponseHeightMultiplier = 1; - - /** - * Width of a long text response box - * - * @var mixed Defaults to 145. - * @since 2010-09-20 - */ - protected $longTextResponseWidth = 145; - - /** - * Default number of characters to store in a long text field - * - * @var int Default is 1024; - * @since 2010-09-02 - */ - protected $longTextStorageWidth = 1024; - - - /** - * The layout of the form for importing in to queXF - * - * @var array Defaults to empty array - * @link http://quexf.sourceforge.net/ - */ - protected $layout = array(); - - /** - * Array to store section information for layout - * - * @var array Defaults to empty array - * @since 2010-09-02 - */ - protected $section = array(); - - /** - * Page counter pointer (links to barcode id of page) - * - * @var mixed Defaults to "". - * @since 2010-09-02 - */ - protected $layoutCP = ""; - - /** - * Section counter pointer - * - * @var string Defaults to 0. - * @since 2010-09-02 - */ - protected $sectionCP = 0; - - /** - * Box group counter pointer - * - * @var bool Defaults to 0. - * @since 2010-09-02 - */ - protected $boxGroupCP = 0; - - /** - * Box counter pointer - * - * @var int Defaults to 0. - */ - protected $boxCP = 0; - - /** - * Background colour of a question - * - * @var bool Defaults to array(220,220,220). - * @since 2010-09-15 - */ - protected $backgroundColourQuestion = array(241,241,241); - - /** - * The bacground colour of a section - * - * @var bool Defaults to array(200,200,200). - * @since 2010-09-20 - */ - protected $backgroundColourSection = array(221,221,221); - - /** - * Empty background colour - * - * @var bool Defaults to array(255,255,255). - * @since 2010-09-20 - */ - protected $backgroundColourEmpty = array(255,255,255); - - /** - * The colour of a line/fill - * - * @var mixed Defaults to array(0,0,0). - * @since 2010-09-20 - */ - protected $lineColour = array(0,0,0); - - /** - * The text to display before a skip - * - * @var string Defaults to "Skip to ". - * @since 2010-09-16 - */ - protected $skipToText = "Skip to "; - - /** - * Should fonts be embedded in the document? - * - * @var mixed Defaults to true. - * @since 2010-09-20 - */ - protected $embedFonts = true; - - /** - * Height in MM of a VAS response - * - * @var mixed Defaults to 8. - * @since 2010-09-20 - */ - protected $vasAreaHeight = 8; - - /** - * Width of a VAS line - * - * @var mixed Defaults to 0.5. - * @since 2010-09-20 - */ - protected $vasLineWidth = 0.5; - - /** - * Height of the VAS ending lines in mm - * - * @var mixed Defaults to 4. - * @since 2010-09-20 - */ - protected $vasHeight = 4; - - /** - * Length of the vas line itself - * - * @var mixed Defaults to 100. - * @since 2010-09-20 - */ - protected $vasLength = 100; - - /** - * The number of increments stored on a vas line - * - * @var mixed Defaults to 100. - * @since 2010-09-20 - */ - protected $vasIncrements = 100; - - /** - * The text to separate parent text and subquestion text - * - * @var string Defaults to " : ". - * @since 2010-09-22 - */ - protected $subQuestionTextSeparator = " : "; - - /** - * The top margin for questionnaireInfo section - * - * @var mixed Defaults to 5. - * @since 2010-10-29 - */ - protected $questionnaireInfoMargin = 20; - - /** - * Height of a response label - * - * @var resource Defaults to 10. - * @since 2010-11-05 - */ - protected $responseLabelHeight = 10; - - /** - * Font size for response label - * - * @var resource Defaults to 8. - * @since 2010-11-05 - */ - protected $responseLabelFontSize = 8; - - /** - * Font size for response text - * - * @var resource Defaults to 10. - * @since 2010-11-05 - */ - protected $responseTextFontSize = 10; - - /** - * Font size of the skip to text - * - * @var string Defaults to 8. - * @since 2010-11-05 - */ - protected $skipToTextFontSize = 8; - - /** - * Default font - * - * @var string Defaults to 'freeserif'. - * @since 2010-11-05 - */ - protected $defaultFont = 'freeserif'; - - /** - * Height of a section break in mm - * - * @var string Defaults to 18. - * @since 2010-11-05 - */ - protected $sectionHeight = 18; - - /** - * Add a box group to the page layout system - * - * VALUES(0, 'Temporary'); - * VALUES(1, 'Single choice'); - * VALUES(2, 'Multiple choice'); - * VALUES(3, 'Text'); - * VALUES(4, 'Number'); - * VALUES(5, 'Barcode'); - * VALUES(6, 'Long text'); - * - * @param int $type The type of box group for verification purposes - * @param string $varname The variable name - * @param string $label The label for the box group Optional, defaults to "". - * @param int $width The width of this group Optional, defaults to 1. - * - * @author Adam Zammit - * @since 2010-09-02 - */ - protected function addBoxGroup($type,$varname,$label = "", $width = 1) - { - $this->boxGroupCP++; - $this->layout[$this->layoutCP]['boxgroup'][$this->boxGroupCP] = - array( 'type' => $type, - 'width' => $width, - 'varname' => $varname, - 'sortorder' => $this->boxGroupCP, - 'label' => $label, - 'groupsection' => $this->sectionCP, - 'box' => array()); - } - - - /** - * Add a box to the page layout system - * - * @param int $tlx Top left X - * @param int $tly Top left Y - * @param int $brx Bottom right X - * @param int $bry Bottom right Y - * @param string $value Optional, defaults to "". - * @param string $label Optional, defaults to "". - * - */ - protected function addBox($tlx,$tly,$brx,$bry,$value = "",$label = "") - { - $this->boxCP++; - $this->layout[$this->layoutCP]['boxgroup'][$this->boxGroupCP]['box'][] = - array( 'tlx' => $this->mm2px($tlx), - 'tly' => $this->mm2px($tly), - 'brx' => $this->mm2px($brx), - 'bry' => $this->mm2px($bry), - 'value' => $value, - 'label'=> $label, - ); - - //Update the width of the parent boxgroup given its type and this additional box - $type = $this->layout[$this->layoutCP]['boxgroup'][$this->boxGroupCP]['type']; - $count = count($this->layout[$this->layoutCP]['boxgroup'][$this->boxGroupCP]['box']); - $width = $this->layout[$this->layoutCP]['boxgroup'][$this->boxGroupCP]['width']; - - switch($type){ - case 1: //Single choice - case 2: //Multiple choice - if (strlen($value) > $width) $width = strlen($value); - if (strlen($count) > $width) $width = strlen($count); - break; - case 3: //Text - case 4: //Numbers - $width = $count; - break; - case 6: //Longtext - $width = $this->longTextStorageWidth; - } - - $this->layout[$this->layoutCP]['boxgroup'][$this->boxGroupCP]['width'] = $width; - } - - - /** - * Export the layout as an XML file - * - * @return string The XML layout in queXF Banding XML format - * @author Adam Zammit - * @since 2010-09-20 - */ - public function getLayout() - { - $doc = new DomDocument('1.0'); - $root = $doc->createElement('queXF'); - - $q = $doc->createElement('questionnaire'); - - $id = $doc->createElement('id'); - $value = $doc->createTextNode($this->questionnaireId); - $id->appendChild($value); - $q->appendChild($id); - - foreach($this->section as $key => $val) - { - $s = $doc->createElement('section'); - $s->setAttribute('id',$key); - foreach ($val as $sk => $sv) - { - $tmpe = $doc->createElement($sk); - $tmpv = $doc->createTextNode($sv); - $tmpe->appendChild($tmpv); - $s->appendChild($tmpe); - } - $q->appendChild($s); - } - foreach($this->layout as $key => $val) - { - $p = $doc->createElement('page'); - - foreach ($val as $pk => $pv) - { - if ($pk != 'boxgroup') - { - $tmpe = $doc->createElement($pk); - $tmpv = $doc->createTextNode($pv); - $tmpe->appendChild($tmpv); - $p->appendChild($tmpe); - } - } - - foreach ($val['boxgroup'] as $bg) - { - $bgE = $doc->createElement('boxgroup'); - foreach ($bg as $pk => $pv) - { - if ($pk == 'groupsection') - { - $gs = $doc->createElement('groupsection'); - $gs->setAttribute('idref',$pv); - $bgE->appendChild($gs); - } - else if ($pk != 'box') - { - $tmpe = $doc->createElement($pk); - $tmpv = $doc->createTextNode($pv); - $tmpe->appendChild($tmpv); - $bgE->appendChild($tmpe); - } - } - - foreach($bg['box'] as $b) - { - $bE = $doc->createElement('box'); - foreach($b as $bk => $bv) - { - $tmpe = $doc->createElement($bk); - $tmpv = $doc->createTextNode($bv); - $tmpe->appendChild($tmpv); - $bE->appendChild($tmpe); - } - $bgE->appendChild($bE); - } - $p->appendChild($bgE); - } - $q->appendChild($p); - } - $root->appendChild($q); - $doc->appendChild($root); - $doc->formatOutput = true; //make it look nice - return $doc->saveXML(); - } - - /** - * Set font size and style - * - * @param string $size Optional, defaults to 12 - * @param string $style Optional, defaults to ''. - * - * @return TODO - * @author Adam Zammit - * @since 2010-11-05 - */ - protected function setDefaultFont($size = 12,$style = '') - { - $this->SetFont($this->defaultFont,$style); - $this->SetFontSize($size); - } - - /** - * Initialise TCPDF width some default values and embedded fonts - * - * @return TODO - * @author Adam Zammit - * @since 2010-09-20 - */ - protected function init() - { - if ($this->embedFonts) - { - $this->setFontSubsetting(false); //we want full subsetting - $this->AddFont('freesans',''); - $this->AddFont('freesans','B'); - $this->AddFont('freesans','I'); - $this->AddFont('freesans','BI'); - $this->AddFont('freeserif',''); - $this->AddFont('freeserif','B'); - $this->AddFont('freeserif','I'); - $this->AddFont('freeserif','BI'); - - $this->SetFont($this->defaultFont); - } - - // set document information - $this->SetCreator('queXMLPDF (http://quexml.sourceforge.net)'); - $this->SetAuthor('Adam Zammit '); - $this->SetTitle('queXML Document'); - $this->SetSubject('queXML'); - $this->SetKeywords('queXML queXF'); - } - - /** - * Override of TCPDF Header function to blank - * - * @author Adam Zammit - * @since 2010-09-20 - */ - public function Header(){ - } - - /** - * Override of TCPDF Footer function to blank - * - * @author Adam Zammit - */ - public function Footer(){ - } - - /** - * Set the background wash of the page - * - * @param mixed $type Optional, defaults to 'empty'. - * - * @author Adam Zammit - * @since 2010-09-02 - */ - protected function setBackground($type = 'empty') - { - switch ($type) { - case 'question': - $this->SetFillColor($this->backgroundColourQuestion[0],$this->backgroundColourQuestion[1],$this->backgroundColourQuestion[0]); - break; - case 'section': - $this->SetFillColor($this->backgroundColourSection[0],$this->backgroundColourSection[1],$this->backgroundColourSection[0]); - break; - case 'empty': - $this->SetFillColor($this->backgroundColourEmpty[0],$this->backgroundColourEmpty[1],$this->backgroundColourEmpty[0]); - break; - - } - } - - /* - * The X coordinate of the start of the page proper - * - * @return int The X coordinate of the start of the page - * @author Adam Zammit - * @since 2010-09-02 - */ - public function getMainPageX() - { - return ($this->cornerBorder + $this->cornerWidth); - } - - /** - * The width of the writeable page - * - * @return int The width of the writeable page - * @author Adam Zammit - * @since 2010-09-02 - */ - public function getMainPageWidth() - { - return ($this->getPageWidth() - (($this->cornerBorder * 2.0) + ($this->cornerWidth * 2.0))); - } - - /** - * Draw a horizontal response box with possible eye guides and arrows - * - * @param int $x The x position of the box area (top left) - * @param int $y The y position of the box area (top left) - * @param string $position What position the box is in for the eye guides - * @param bool $downarrow Draw a down arrow? - * @param bool $rightarrow Draw an arrow to the right? - * @param bool $smallwidth Whether or not to use the small width - * - */ - protected function drawHorizontalResponseBox($x,$y,$position = 'only',$downarrow = false, $rightarrow = false, $smallwidth = false) - { - $this->SetDrawColor($this->lineColour[0],$this->lineColour[1],$this->lineColour[2]); - $this->SetLineWidth($this->singleResponseBoxBorder); - - //centre for the line - $boxmid = ($y + ($this->singleResponseHorizontalHeight / 2.0)); - - //centre on y - $y = $y + (($this->singleResponseHorizontalHeight - $this->singleResponseBoxHeight) / 2.0); - - if ($smallwidth) - $areawidth = $this->singleResponseVerticalAreaWidthSmall; - else - $areawidth = $this->singleResponseVerticalAreaWidth; - - - $linelength = (($areawidth - $this->singleResponseBoxWidth) / 2.0); - - $this->SetLineStyle(array('dash' => '1')); - - if ($position == 'last' || $position == 'middle') - { - $this->Line($x, $boxmid, $x + $linelength,$boxmid); - } - if ($position == 'first' || $position == 'middle') - { - $this->Line($x + $linelength + $this->singleResponseBoxWidth, $boxmid, $x + ($linelength * 2) + $this->singleResponseBoxWidth,$boxmid); - } - - $this->SetLineStyle(array('dash' => '0')); - - $this->Rect($x + $linelength,$y,$this->singleResponseBoxWidth,$this->singleResponseBoxHeight,'DF',array(),$this->backgroundColourEmpty); - $this->setBackground('question'); - return array($x + $linelength,$y,$x + $linelength + $this->singleResponseBoxWidth, $y + $this->singleResponseBoxHeight); //return the posistion for banding - } - - /** - * Draw a vertical response box with possible eye guides and arrows - * - * @param int $x The x position of the box area (top left) - * @param int $y The y position of the box area (top left) - * @param string $position What position the box is in for the eye guides - * @param bool $downarrow Draw a down arrow? - * @param bool $rightarrow Draw an arrow to the right? - * - */ - protected function drawVerticalResponseBox($x,$y,$position = 'only',$downarrow = false, $rightarrow = false) - { - $this->SetDrawColor($this->lineColour[0],$this->lineColour[1],$this->lineColour[2]); - $this->SetLineWidth($this->singleResponseBoxBorder); - - if (!$downarrow) - { - if ($position == 'only') $y = $y + (($this->singleResponseAreaHeight - $this->singleResponseBoxHeight) / 2.0); - else if ($position == 'first' || $position == 'last') $y = $y + (($this->singleResponseAreaHeight - ($this->singleResponseBoxHeight + $this->singleResponseBoxLineLength)) / 2.0); - else if ($position == 'middle') $y = $y + (($this->singleResponseAreaHeight - ($this->singleResponseBoxHeight + ($this->singleResponseBoxLineLength * 2.0))) / 2.0); - } - - $boxmid = ($x + ($this->singleResponseBoxWidth / 2.0)); - if ($position == 'first' || $position == 'middle') - { - $this->Line($boxmid, ($y + $this->singleResponseBoxHeight), $boxmid, ($y + $this->singleResponseBoxHeight + $this->singleResponseBoxLineLength)); - } - if ($position == 'last' || $position == 'middle') - { - $this->Line($boxmid, $y, $boxmid, ($y - $this->singleResponseBoxLineLength)); - } - - if ($downarrow) - { - $this->Polygon(array($x, $y + $this->singleResponseBoxHeight, $boxmid, $y + $this->singleResponseBoxHeight + $this->arrowHeight, $x + $this->singleResponseBoxWidth, $y + $this->singleResponseBoxHeight),'DF',array(),$this->lineColour); - } - - if ($rightarrow !== false) - { - //Draw skipto - $boxymid = ($y + ($this->singleResponseBoxHeight / 2.0)); - $this->Polygon(array($x + $this->singleResponseBoxWidth, $y, $x + $this->singleResponseBoxWidth + $this->arrowHeight, $boxymid, $x + $this->singleResponseBoxWidth, $y + $this->singleResponseBoxHeight),'DF',array(),$this->lineColour); - //Now draw the text - - //Start at $x + singleResponseboxWidth + arrowHeight, $y - siongleresponseboxlinelength and go to $skipcolumnwidth wide and singleresponseareHeight high - $this->setBackground('question'); - $text = $this->skipToText . $rightarrow; - $ypos = $this->GetY(); - - $this->setDefaultFont($this->skipToTextFontSize,'B'); - - $this->MultiCell($this->skipColumnWidth,$this->singleResponseBoxHeight,$text,0,'L',false,0,($this->getPageWidth() - $this->getMainPageX() - $this->skipColumnWidth),$y,true,0,false,true,$this->singleResponseBoxHeight,'M',true); - - //Reset to non bold as causing problems with TCPDF HTML CSS conversion - $this->setDefaultFont($this->skipToTextFontSize,''); - - //$this->writeHTMLCell($this->skipColumnWidth, 0, $this->getPageWidth() - $this->getMainPageX() - $this->skipColumnWidth ,$y, $this->style . $html,0,0,true,true,'C',true); - $this->SetY($ypos,false); - } - - $this->Rect($x,$y,$this->singleResponseBoxWidth,$this->singleResponseBoxHeight,'DF',array(),$this->backgroundColourEmpty); - $this->setBackground('question'); - return array($x,$y,$x + $this->singleResponseBoxWidth, $y + $this->singleResponseBoxHeight); //return the posistion for banding - } - - - /** - * Return capital letter(s) corresponding to the given number - * - * @param integer $number - * - * @return string Letter(s) corresponding to the number - * @author Adam Zammit - * @since 2010-09-08 - */ - public function numberToLetter($number) - { - if ($number < 1) $number = 1; - - if ($number > 26) - return chr((($number - 1) / 26) + 64) . chr((($number - 1) % 26) + 65); - else - return chr($number + 64); - } - - - /** - * Get the questionnaire id - * - * @return int The questionnaire Id - * @author Adam Zammit - * @since 2010-09-23 - */ - public function getQuestionnaireId() - { - return $this->questionnaireId; - } - - /** - * Converts a queXML file to the array format required for the create function - * - * @param string $quexml The queXML file - * - * @return array An array readable by create - * @author Adam Zammit - * @since 2010-09-08 - * @see create - */ - public function createqueXML($quexml) - { - $xml = new SimpleXMLElement($quexml); - - $q = array(); - - $scount = 1; - $sl = ""; - - $q['id'] = $xml['id']; - - foreach ($xml->questionnaireInfo as $qitmp) - { - if ($qitmp->position == 'after') - { - if (!isset($q['infoafter'])) - $q['infoafter'] = ""; - - $q['infoafter'] .= $qitmp->text . "

"; - } - else if ($qitmp->position == 'before') - { - if (!isset($q['infobefore'])) - $q['infobefore'] = ""; - - $q['infobefore'] .= $qitmp->text . "

"; - } - } - - foreach($xml->section as $s) - { - $stmp = array(); - $sl = $this->numberToLetter($scount); - $stmp['title'] = "Section " . $sl; - $stmp['info'] = ""; - $stmp['text'] = ""; - - foreach ($s->sectionInfo as $sitmp) - { - if ($sitmp->position == 'title') - { - $stmp['text'] .= $sitmp->text; - } - if ($sitmp->position == 'before' || $sitmp->position == 'during') - { - $stmp['info'] .= $sitmp->text . "
"; - } - } - - $qcount = 1; - foreach ($s->question as $qu) - { - $qtmp = array(); - $rstmp = array(); - - $qtmp['title'] = $sl . $qcount . "."; - $qtmp['text'] = ""; - - foreach ($qu->text as $ttmp) - { - //Add a new line if we aren't at the end - if ($ttmp != end($qu->text)){ $qtmp['text'] .= "
"; } - - $qtmp['text'] .= $ttmp; - } - - foreach ($qu->directive as $ttmp) - { - if ($ttmp->administration == 'self' && $ttmp->position != 'after') - { - if (!isset($qtmp['helptext'])) - $qtmp['helptext'] = ""; - - $qtmp['helptext'] .= $ttmp->text; - } - if ($ttmp->administration == 'self' && $ttmp->position == 'after') - { - if (!isset($qtmp['helptextafter'])) - $qtmp['helptextafter'] = ""; - - $qtmp['helptextafter'] .= $ttmp->text; - } - } - - foreach ($qu->subQuestion as $sq) - { - $sqtmp = array(); - $sqtmp['text'] = ""; - foreach ($sq->text as $ttmp) - { - $sqtmp['text'] .= $ttmp; - } - $sqtmp['varname'] = $sq['varName']; - $rstmp['subquestions'][] = $sqtmp; - } - - foreach ($qu->response as $r) - { - $rtmp = array(); - $rstmp['varname'] = $r['varName']; - if (isset($r->fixed)) - { - $rtmp['type'] = 'fixed'; - $rtmp['width'] = count($r->fixed->category); - if ($r->fixed['rotate'] == "true") - $rtmp['rotate'] = "true"; - $ctmp = array(); - foreach ($r->fixed->category as $c) - { - $cat = array(); - $cat['text'] = current($c->label); - $cat['value'] = current($c->value); - if (isset($c->skipTo)) $cat['skipto'] = current($c->skipTo); - if (isset($c->contingentQuestion)) - { - //Need to handle contingent questions - $oarr = array(); - $oarr['width'] = current($c->contingentQuestion->length); - $oarr['text'] = current($c->contingentQuestion->text); - $oarr['varname'] = $c->contingentQuestion['varName']; - $cat['other'] = $oarr; - } - $ctmp[] = $cat; - } - $rtmp['categories'] = $ctmp; - } - else if (isset($r->free)) - { - $format = strtolower(trim(current($r->free->format))); - if ($format == 'longtext') - $rtmp['type'] = 'longtext'; - else if ($format == 'number' || $format == 'numeric' || $format == 'integer') - $rtmp['type'] = 'number'; - else - $rtmp['type'] = 'text'; - $rtmp['width'] = current($r->free->length); - $rtmp['text'] = current($r->free->label); - } - else if (isset($r->vas)) - { - $rtmp['type'] = 'vas'; - $rtmp['width'] = 100; - $rtmp['labelleft'] = current($r->vas->labelleft); - $rtmp['labelright'] = current($r->vas->labelright); - } - $rstmp['response'] = $rtmp; - $qtmp['responses'][] = $rstmp; - } - $stmp['questions'][] = $qtmp; - $qcount++; - } - $q['sections'][] = $stmp; - - $scount++; - } - return $q; - } - - /** - * Create a queXML PDF document based on an array - * that is structured like a queXML document - * - * sections (title, text, info) - * questions (title, text, varname, helptext, helptextafter) - * responses (varname) - * subquestion (text, varname) - * response (type, width, text, rotate) - * categories (text, value) - * - * @param array $questionnaire The questionnaire in the array format above - */ - public function create($questionnaire) - { - $this->init(); - $this->questionnaireId = intval($questionnaire['id']); - $this->newPage(); - - //Draw questionnaireInfo before if exists - if (isset($questionnaire['infobefore'])) - { - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $this->questionnaireInfoMargin, $this->getMainPageX(), $this->GetY() - $this->questionBorderBottom, "
",0,1,true,true); - $html = "
getMainPageWidth() . "mm\" class=\"questionnaireInfo\">{$questionnaire['infobefore']}
"; - $this->writeHTMLCell($this->getMainPageWidth(), 1, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - } - - - - foreach($questionnaire['sections'] as $sk => $sv) - { - //link the section title with the first question for pagination purposes - $questions = count($sv['questions']); - - $this->startTransaction(); - $this->addSection($sv['text'],$sv['title'],$sv['info']); - if ($questions != 0) $this->createQuestion($sv['questions'][0]); - if ($this->pageBreakOccured) - { - $this->pageBreakOccured = false; - $this->rollBackTransaction(true); - $this->SetAutoPageBreak(false); //Temporarily set so we don't trigger a page break - $this->fillPageBackground(); - $this->newPage(); - $this->addSection($sv['text'],$sv['title'],$sv['info']); - if ($questions != 0) $this->createQuestion($sv['questions'][0]); - } - else - $this->commitTransaction(); - - //start from the second question as first is linked to the section - foreach(array_slice($sv['questions'], 1) as $qk => $qv) - { - $this->startTransaction(); - //add question here - $this->createQuestion($qv); - if ($this->pageBreakOccured) - { - $this->pageBreakOccured = false; - $this->rollBackTransaction(true); - $this->SetAutoPageBreak(false); //Temporarily set so we don't trigger a page break - //now draw a background to the bottom of the page - $this->fillPageBackground(); - - $this->newPage(); - //retry question here - $this->createQuestion($qv); - } - else - $this->commitTransaction(); - } - } - - //Draw questionnaireInfo after if exists - if (isset($questionnaire['infoafter'])) - { - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $this->questionnaireInfoMargin, $this->getMainPageX(), $this->GetY() - $this->questionBorderBottom, "
",0,1,true,true); - $html = "
getMainPageWidth() . "mm\" class=\"questionnaireInfo\">{$questionnaire['infoafter']}
"; - $this->writeHTMLCell($this->getMainPageWidth(), 1, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - } - - - //fill to the end of the last page - $this->fillPageBackground(); - } - - /** - * Create a question that may have multiple response groups - * - * questions (title, text, helptext, helptextafter) - * responses (varname) - * subquestions - * subquestion(text, varname) - * response (type, width, text, rotate) - * categories - * category(text, value, skipto, other) - * - * @param array $question The questions portion of the array - * @see create - */ - protected function createQuestion($question) - { - $help = false; - if (isset($question['helptext'])) $help = $question['helptext']; - - //Question header - $this->drawQuestionHead($question['title'], $question['text'],$help); - - $text = ""; - if (isset($question['text'])) $text = $question['text']; - - //Loop over response groups and produce questions of various types - if (isset($question['responses'])) { foreach($question['responses'] as $r) - { - $varname = $r['varname']; - - if (isset($r['subquestions'])) - { - $response = $r['response']; - $subquestions = $r['subquestions']; - $type = $response['type']; - - $bgtype = 3; //box group type temp set to 3 (text) - - switch ($type) - { - case 'fixed': - $categories = $response['categories']; - - if (isset($response['rotate'])) - $this->drawSingleChoiceVertical($categories,$subquestions,$text); - else - $this->drawSingleChoiceHorizontal($categories,$subquestions,$text); - - break; - case 'number': - $bgtype = 4; - case 'currency': - case 'text': - if (isset($response['rotate'])) - $this->drawMatrixTextHorizontal($subquestions,$response['width'],$text,$bgtype); - else - $this->drawMatrixTextVertical($subquestions,$response['width'],$text,$bgtype); - break; - case 'vas': - $this->drawMatrixVas($subquestions,$text,$response['labelleft'],$response['labelright']); - break; - - } - } - else - { - $response = $r['response']; - $type = $response['type']; - - if (isset($response['text']) && !empty($response['text'])) - $rtext = $text . $this->subQuestionTextSeparator . $response['text']; - else - $rtext = $text; - - $bgtype = 3; //box group type temp set to 3 (text) - - switch ($type) - { - case 'fixed': - if (isset($response['rotate'])) - $this->drawSingleChoiceHorizontal($response['categories'],array(array('text' => '', 'varname' => $varname)),$rtext); - else - $this->drawSingleChoiceVertical($response['categories'],array(array('text' => '', 'varname' => $varname)),$rtext); - break; - case 'longtext': - $this->addBoxGroup(6,$varname,$rtext); - $this->drawLongText($response['width']); - break; - case 'number': - $bgtype = 4; - case 'currency': - case 'text': - $this->addBoxGroup($bgtype,$varname,$rtext,$response['width']); - $this->drawText($response['text'],$response['width']); - //Insert a gap here - $this->Rect($this->getMainPageX(),$this->GetY(),$this->getMainPageWidth(),$this->subQuestionLineSpacing,'F',array(),$this->backgroundColourQuestion); - $this->SetY($this->GetY() + $this->subQuestionLineSpacing,false); - break; - case 'vas': - $this->addBoxGroup(1,$varname,$rtext,strlen($this->vasIncrements)); - $this->drawVas("",$response['labelleft'],$response['labelright']); - break; - - } - } - }} - - //If there is some help text for after the question - if (isset($question['helptextafter'])) - { - $this->setBackground('question'); - $html = "
getMainPageWidth() . "mm\" class=\"questionHelpAfter\">{$question['helptextafter']}
"; - $this->writeHTMLCell($this->getMainPageWidth(), 1, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - - } - - //Leave a border at the bottom of the question - if ($this->questionBorderBottom > 0) //question border - $this->SetY($this->GetY() + $this->questionBorderBottom,false); //new line - } - - - - /** - * Draw text responses line by line - * - * @param array $subquestions The subquestions containing text and varname - * @param int $width The width of the text element - * @param string|bool $parenttext The question text of the parent or false if not specified - * @param int $bgtype The box group type (default is 3 - text) - * - * @author Adam Zammit - * @since 2010-09-02 - */ - protected function drawMatrixTextVertical($subquestions,$width,$parenttext = false,$bgtype = 3) - { - $c = count($subquestions); - for($i = 0; $i < $c; $i++) - { - $s = $subquestions[$i]; - - if ($parenttext == false) - $this->addBoxGroup($bgtype,$s['varname'],$s['text'],$width); - else - $this->addBoxGroup($bgtype,$s['varname'],$parenttext . $this->subQuestionTextSeparator . $s['text'],$width); - - - - $this->drawText($s['text'],$width); - - $currentY = $this->GetY(); - - //Insert a gap here - $this->Rect($this->getMainPageX(),$this->GetY(),$this->getMainPageWidth(),$this->subQuestionLineSpacing,'F',array(),$this->backgroundColourQuestion); - $this->SetY($currentY + $this->subQuestionLineSpacing,false); - } - } - - /** - * Draw multiple VAS items - * - * @param array $subquestions The subquestions containing text and varname - * @param string|bool $parenttext The question text of the parent or false if not specified - * @param string $labelleft The left hand side label - * @param string $labelright The right hand side label - * - * @author Adam Zammit - * @since 2010-09-20 - */ - protected function drawMatrixVas($subquestions,$parenttext = false,$labelleft,$labelright) - { - $c = count($subquestions); - - $width = strlen($this->vasIncrements); - - $heading = true; - for ($i = 0; $i < $c; $i++) - { - $s = $subquestions[$i]; - - if ($parenttext == false) - $this->addBoxGroup(1,$s['varname'],$s['text'],$width); - else - $this->addBoxGroup(1,$s['varname'],$parenttext . $this->subQuestionTextSeparator . $s['text'],$width); - - - - - $this->drawVas($s['text'],$labelleft,$labelright,$heading); - - $currentY = $this->GetY(); - - //Insert a gap here - $this->Rect($this->getMainPageX(),$this->GetY(),$this->getMainPageWidth(),$this->subQuestionLineSpacing,'F',array(),$this->backgroundColourQuestion); - $this->SetY($currentY + $this->subQuestionLineSpacing,false); - - $heading = false; - - } - - } - - - /** - * Draw a large empty box for writing in text - * - * @param mixed $width The "width" of the box. This relates to the number of "lines" high - * - * @author Adam Zammit - * @since 2010-09-02 - */ - protected function drawLongText($width) - { - $currentY = $this->GetY(); - $height = $width * $this->longTextResponseHeightMultiplier; - $html = "
"; - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $height, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - $this->SetY($currentY,false); - $this->setBackground('empty'); - $border = array('LTRB' => array('width' => $this->textResponseBorder, 'dash' => 0)); - //Align to skip column on right - $this->SetX(($this->getPageWidth() - $this->getMainPageX() - $this->skipColumnWidth - $this->longTextResponseWidth),false); - //Add to pay layout - $this->addBox($this->GetX(),$this->GetY(),$this->GetX() + $this->longTextResponseWidth, $this->GetY() + $height); - $this->SetDrawColor($this->lineColour[0],$this->lineColour[1],$this->lineColour[2]); - $this->Cell($this->longTextResponseWidth,$height,'',$border,0,'',true,'',0,false,'T','C'); - $currentY = $currentY + $height; - $this->SetY($currentY,false); - } - - - /** - * Draw a VAS - * - * @param string $text The text of this item - * @param string $labelleft The left hand side label - * @param string $labelright The right hand side label - * @param bool $heading Whether to draw a heading or not - * - * @author Adam Zammit - * @since 2010-09-20 - */ - protected function drawVas($text, $labelleft,$labelright,$heading = true) - { - $textwidth = $this->getMainPageWidth() - $this->skipColumnWidth - ($this->vasLength + ($this->vasLineWidth * 2.0)) - 2; - $this->setBackground('question'); - - if ($heading) - { - //draw heading - $lwidth = 20; - $slwidth = $textwidth - ($lwidth / 2); - $gapwidth = ($this->vasLength + ($this->vasLineWidth * 2.0)) - $lwidth; - - - $html = "
$labelleft$labelright
"; - - - $this->writeHTMLCell($this->getMainPageWidth(), 0, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,false); - } - - $currentY = $this->GetY(); - - - $html = "
$text
"; - - $textwidth += 2; - - - $this->writeHTMLCell($this->getMainPageWidth(), $this->vasAreaHeight, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,false); - - $ncurrentY = $this->GetY(); - - $this->SetY($currentY,false); - $this->SetX($textwidth + $this->getMainPageX(),false); - - $this->SetLineWidth($this->vasLineWidth); - $this->SetDrawColor($this->lineColour[0],$this->lineColour[1],$this->lineColour[2]); - - //Draw the VAS left vert line - $ly = (($this->vasAreaHeight - $this->vasHeight) / 2.0) + $currentY; - $lx = $textwidth + $this->getMainPageX(); - $this->Line($lx,$ly,$lx,$ly + $this->vasHeight); - - //Right vert line - $lx = $textwidth + $this->getMainPageX() + $this->vasLength + $this->vasLineWidth; - $this->Line($lx,$ly,$lx,$ly + $this->vasHeight); - - //Line itself - $ly = ($this->vasAreaHeight / 2.0) + $currentY; - $lx = $textwidth + $this->getMainPageX() + ($this->vasLineWidth / 2.0); - $this->Line($lx,$ly,$lx + $this->vasLength,$ly); - - //Add to layout system - $bw = ($this->vasLength / $this->vasIncrements); - $ly = (($this->vasAreaHeight - $this->vasHeight) / 2.0) + $currentY; - for ($i = 0; $i < $this->vasIncrements; $i++) - { - $this->addBox($lx,$ly,$lx + $bw,$ly + $this->vasHeight, $i + 1, $i + 1); - $lx += $bw; - } - - //Go back to the right Y position - $this->SetY($ncurrentY,false); - } - - /** - * Draw a text response - * - * @param string $text The text label if any (can be HTML) - * @param int $width The number of boxes to draw - */ - protected function drawText($text,$width) - { - $this->SetDrawColor($this->lineColour[0],$this->lineColour[1],$this->lineColour[2]); - - //calculate text responses per line - $textResponsesPerLine = round(($this->getMainPageWidth() - $this->skipColumnWidth - $this->textResponseMarginX) / ($this->textResponseWidth + $this->textResponseBorder)); - $labelTextResponsesSameLine = round(($this->getMainPageWidth() - $this->skipColumnWidth - $this->labelTextResponsesSameLineMarginX) / ($this->textResponseWidth + $this->textResponseBorder)); - - //draw boxes - can draw up to $textResponsesPerLine for each line - $lines = ceil($width / $textResponsesPerLine); - - //draw the text label on the top of this box - if ($width > $labelTextResponsesSameLine && !empty($text)) - { - $this->setBackground('question'); - $html = "
questionTitleWidth}mm\">getMainPageWidth() - $this->skipColumnWidth - $this->questionTitleWidth) . "mm\" class=\"responseAboveText\">$text
"; - $this->writeHTMLCell($this->getMainPageWidth(), 1, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - } - - $currentY = $this->GetY(); - - for ($i = 0; $i < $lines; $i++) - { - if ($lines == 1) $cells = $width; //one line only - else if (($i + 1 == $lines)) $cells = ($width - ($textResponsesPerLine * $i)); //last line - else $cells = $textResponsesPerLine; //middle line - - - $textwidth = ($this->getMainPageWidth() - $this->skipColumnWidth) - (($this->textResponseWidth + $this->textResponseBorder ) * $cells); - - //print "textwidth: $textwidth cells: $cells mainpagex: " . $this->getMainPageX() . "
"; - //First draw a background of height $this->responseLabelHeight - $html = "
"; - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $this->textResponseHeight, $this->getMainPageX(), $this->GetY() , $this->style . $html,0,1,true,false); - - if ($lines == 1 && $cells <= $labelTextResponsesSameLine && !empty($text)) - { - $this->setDefaultFont($this->responseTextFontSize); - - $this->MultiCell($textwidth,$this->textResponseHeight,$text,0,'R',false,1,$this->getMainPageX(),$currentY,true,0,false,true,$this->textResponseHeight,'M',true); - - - //$html = "
$text
"; - } - - - $ncurrentY = $this->GetY(); - - $this->SetY($currentY,false); - $this->SetX($textwidth + $this->getMainPageX() + 2,false); //set the X position to the first cell - - $this->drawCells($cells); - - $currentY = $ncurrentY; - - //New line - $this->SetY($currentY,false); //new line - - - if (!(($i + 1) == $lines) && $this->textResponseLineSpacing > 0) //if there should be a gap between text responses and not the last - { - $this->SetX($this->getMainPageX(),false); - $this->setBackground('question'); - $this->Cell($this->getMainPageWidth(),$this->textResponseLineSpacing,'','',0,'',true,'',0,false,'T','C'); - $currentY += $this->textResponseLineSpacing; - $this->SetY($currentY,false); //new line - } - - } - - } - - /** - * Draw X number of cells at the current X Y position - * - * @param int $cells The number of text cells to draw - * - * @author Adam Zammit - * @since 2010-09-08 - */ - protected function drawCells($cells) - { - $this->setBackground('empty'); - $this->SetDrawColor($this->lineColour[0],$this->lineColour[1],$this->lineColour[2]); - - for ($j = 0; $j < $cells; $j++) - { - //draw text cells - if ($cells == 1) //only - $border = array('LTR' => array('width' => $this->textResponseBorder, 'dash' => 0), 'B' => array('width' => ($this->textResponseBorder * 2), 'dash' => 0)); - else if ($j == 0) //first - $border = array('LT' => array('width' => $this->textResponseBorder, 'dash' => 0), 'R' => array('width' => $this->textResponseBorder, 'dash' => 1), 'B' => array('width' => ($this->textResponseBorder * 2), 'dash' => 0)); - else if (($j + 1) == $cells) //last - { - $border = array('TR' => array('width' => $this->textResponseBorder, 'dash' => 0), 'B' => array('width' => ($this->textResponseBorder * 2), 'dash' => 0)); - - //add a border gap - $this->SetX($this->GetX() + ($this->textResponseBorder),false); - } - else //middle - { - $border = array('T' => array('width' => $this->textResponseBorder, 'dash' => 0), 'R' => array('width' => $this->textResponseBorder, 'dash' => 1), 'B' => array('width' => ($this->textResponseBorder * 2), 'dash' => 0)); - //add a border gap - $this->SetX($this->GetX() + ($this->textResponseBorder),false); - } - - //Add the box to the layout scheme - $this->addBox($this->GetX(),$this->GetY(),$this->GetX() + $this->textResponseWidth,$this->GetY() + $this->textResponseHeight); - - //Draw the box - $this->Cell($this->textResponseWidth,$this->textResponseHeight,'',$border,0,'',true,'',0,false,'T','C'); - - } - - //add some spacing for the bottom border - //$this->SetY(($this->GetY() + ($this->textResponseBorder * 2)),false); - } - - /** - * Draw a horizontal table of text boxes - * - * @param array $subquestions The subquestions - * @param int $width The width - * @param string|bool $parenttext The question text of the parent or false if not specified - * @param int $bgtype The type of the box group (defaults to 3 - text) - * - * @author Adam Zammit - * @since 2010-09-08 - */ - protected function drawMatrixTextHorizontal($subquestions,$width,$parenttext = false,$bgtype = 3) - { - $total = count($subquestions); - $currentY = $this->GetY(); - - $rwidth = ($width * ($this->textResponseWidth + $this->textResponseBorder + $this->textResponseLineSpacing)); - - $textwidth = ($this->getMainPageWidth() - $this->skipColumnWidth) - ($rwidth * $total); - - $html = ""; - foreach ($subquestions as $r) - { - $html .= ""; - } - $html .= "
{$r['text']}
"; - $this->writeHTMLCell($this->getMainPageWidth(), $this->singleResponseAreaHeight, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - $currentY = $this->GetY(); - - $html = "
"; - $this->writeHTMLCell($this->getMainPageWidth(), $this->singleResponseAreaHeight, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - - $ncurrentY = $this->GetY(); - - $this->SetY($currentY,false); - - //Set X position - $this->SetX($this->getMainPageX() + $textwidth,false); - - - foreach ($subquestions as $s) - { - //Add box group to current layout - if ($parenttext == false) - $this->addBoxGroup($bgtype,$s['varname'],$s['text']); - else - $this->addBoxGroup($bgtype,$s['varname'],$parenttext . $this->subQuestionTextSeparator . $s['text']); - - - - //Draw the cells - $this->drawCells($width); - - //Move X for a gap - $this->SetX($this->GetX() + $this->textResponseLineSpacing,false); - $this->SetY($currentY,false); - } - - //Move cursor back to the right spot - $this->SetY($ncurrentY,false); - } - - /** - * Draw a horizontal table of respones including "eye guides" - * - * @param array $categories The response categories - * @param array $subquestions The subquestions if any - * @param string|bool $parenttext The question text of the parent or false if not specified - * - * @author Adam Zammit - * @since 2010-09-08 - */ - protected function drawSingleChoiceHorizontal($categories, $subquestions = array(array('text' => '')),$parenttext = false) - { - $total = count($categories); - $currentY = $this->GetY(); - - if ($total > $this->singleResponseHorizontalMax) //change if too many cats - $rwidth = $this->singleResponseVerticalAreaWidthSmall; - else - $rwidth = $this->singleResponseVerticalAreaWidth; - - $textwidth = ($this->getMainPageWidth() - $this->skipColumnWidth) - ($rwidth * $total); - - - //First draw a background of height $this->responseLabelHeight - $html = "
"; - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $this->responseLabelHeight, $this->getMainPageX(), $currentY , $this->style . $html,0,1,true,true); - - $this->setDefaultFont($this->responseLabelFontSize); - - $count = 0; - //Draw a Cell for each rwidth from $textwidth + $this->getMainPageX(),currentY - foreach ($categories as $r) - { - $y = $currentY; - $x = ($textwidth + $this->getMainPageX() + ($rwidth * $count)); - $this->MultiCell($rwidth,$this->responseLabelHeight,$r['text'],0,'C',false,0,$x,$y,true,0,false,true,$this->responseLabelHeight,'B',true); - $count++; - } - $currentY += $this->responseLabelHeight; - - //reset font size - - - foreach ($subquestions as $s) - { - //Add box group to current layout - if ($parenttext == false) - $this->addBoxGroup(1,$s['varname'],$s['text']); - else - $this->addBoxGroup(1,$s['varname'],$parenttext . $this->subQuestionTextSeparator . $s['text']); - - //$html = "
" . $s['text'] . "
"; - //$this->writeHTMLCell($this->getMainPageWidth(), $this->singleResponseAreaHeight, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - - //Draw background - $html = "
"; - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $this->singleResponseHorizontalHeight, $this->getMainPageX(), $currentY, $this->style . $html,0,1,true,true); - $this->setDefaultFont($this->responseTextFontSize); - - $this->MultiCell($textwidth,$this->singleResponseHorizontalHeight,$s['text'],0,'R',false,0,$this->getMainPageX(),$currentY,true,0,false,true,$this->singleResponseHorizontalHeight,'M',true); - - - - - - //Draw the categories horizontally - $rnum = 1; - foreach ($categories as $r) - { - if ($total == 1) $num = 'only'; - else if ($rnum == 1) $num = 'first'; - else if ($rnum < $total) $num = 'middle'; - else if ($rnum == $total) $num = 'last'; - - $position = $this->drawHorizontalResponseBox(($this->getMainPageX() + $textwidth + (($rnum - 1) * $rwidth)),$currentY, $num,false,false,($total > $this->singleResponseHorizontalMax)); - - //Add box to the current layout - $this->addBox($position[0],$position[1],$position[2],$position[3],$r['value'],$r['text']); - - $rnum++; - } - - if (($this->GetY() - $currentY) > $this->singleResponseHorizontalHeight) - $currentY = $this->GetY(); - else - $currentY = $currentY + $this->singleResponseHorizontalHeight; - - $this->SetY($currentY,false); - - } - - } - - /** - * Draw a vertical table of single choice responses including "eye guides" - * - * @param array $categories An array containing the category text, value, skipto and other - * @param array $subquestions An array containing the subquestions if any - * @param string|bool $parenttext The question text of the parent or false if not specified - * - * @author Adam Zammit - * @since 2010-09-02 - */ - protected function drawSingleChoiceVertical($categories, $subquestions = array(array('text' => '')),$parenttext = false) - { - $currentY = $this->GetY(); - $total = count($subquestions); - - $rwidth = $this->singleResponseAreaWidth; - - $textwidth = ($this->getMainPageWidth() - $this->skipColumnWidth) - ($rwidth * $total); - - if (count($categories) > 1) - { - $isempty = true; - $count = 0; - - //First draw a background of height $this->responseLabelHeight - $html = "
"; - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $this->responseLabelHeight, $this->getMainPageX(), $currentY , $this->style . $html,0,1,true,true); - - - $this->setDefaultFont($this->responseLabelFontSize); - - //Draw a Cell for each rwidth from $textwidth + $this->getMainPageX(),currentY - foreach ($subquestions as $r) - { - $y = $currentY; - $x = ($textwidth + $this->getMainPageX() + ($rwidth * $count)); - $this->MultiCell($rwidth,$this->responseLabelHeight,$r['text'],0,'C',false,0,$x,$y,true,0,false,true,$this->responseLabelHeight,'B',true); - if (!empty($r['text'])) $isempty = false; - $count++; - } - - if ($isempty) - $this->SetY($currentY,false); - else - $this->SetY($currentY+$this->responseLabelHeight); - - } - - $currentY = $this->GetY(); - $firstY = $currentY; - - $snum = 0; - $total = count($categories); - $ypos = array(); - - foreach($subquestions as $s) - { - $rnum = 1; - - $this->SetY($firstY, false); - $currentY = $firstY; - - if ($parenttext == false) - $this->addBoxGroup(1,$s['varname'],$s['text']); - else - $this->addBoxGroup(1,$s['varname'],$parenttext . $this->subQuestionTextSeparator . $s['text']); - - $x = $this->getMainPageX() + $textwidth + ($rwidth * $snum) + ((($rwidth - $this->singleResponseBoxWidth) / 2.0 )); - - $other = false; - - foreach($categories as $r) - { - if ($total == 1) $num = 'only'; - else if ($rnum == 1) $num = 'first'; - else if ($rnum < $total) $num = 'middle'; - else if ($rnum == $total) $num = 'last'; - - //add a new line for each response that goes to - if ($snum == 0) - { - //only have to do this once - //Draw background - $html = "
"; - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $this->singleResponseAreaHeight, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - $this->setDefaultFont($this->responseTextFontSize); - - $this->MultiCell($textwidth,$this->singleResponseAreaHeight,$r['text'],0,'R',false,0,$this->getMainPageX(),$currentY,true,0,false,true,$this->singleResponseAreaHeight,'M',true); - - } - - $skipto = false; - $other = false; - - if (isset($r['skipto'])) $skipto = $r['skipto']; - if (isset($r['other']) && $rnum == $total) $other = $r['other']; //only set for last in set - - //Draw the box over the top - $position = $this->drawVerticalResponseBox($x,$currentY, $num, $other, $skipto); - - //Add box to the current layout - $this->addBox($position[0],$position[1],$position[2],$position[3],$r['value'],$r['text']); - - //Store ypos for next round of boxes - if ($snum == 0) - { - if (($this->GetY() - $currentY) > $this->singleResponseAreaHeight) - $currentY = $this->GetY(); - else - $currentY = $currentY + $this->singleResponseAreaHeight; - - $ypos[$rnum] = $currentY; - } - else - $currentY = $ypos[$rnum]; - - $this->SetY($currentY,false); - - $rnum++; - } - - if ($other !== false) - { - //Display the "other" variable - $this->addBoxGroup(3,$other['varname'],$other['text'],$other['width']); - $this->drawText($other['text'],$other['width']); - //Insert a gap here - $this->Rect($this->getMainPageX(),$this->GetY(),$this->getMainPageWidth(),$this->subQuestionLineSpacing,'F',array(),$this->backgroundColourQuestion); - $this->SetY($this->GetY() + $this->subQuestionLineSpacing,false); - } - - $snum++; - } - } - - /** - * Draw the header of a question (question title, text and help text if any) - * - * @param string $title The question title (number) - * @param string $text The question text (can be HTML) - * @param string|bool $help The question help text or false if none (can be HTML) - */ - protected function drawQuestionHead($title,$text,$help = false) - { - $this->setBackground('question'); - //Cell for question number (title) and text including a white border at the bottom - - $html = "
questionTitleWidth . "mm\">$titlequestionTextWidth . "mm\">$text
"; - - $this->writeHTMLCell($this->getMainPageWidth(), 1, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - - if ($help != false) - { - $html = "
getMainPageWidth() - $this->skipColumnWidth) . "mm\" class=\"questionHelp\">$help
"; - $this->writeHTMLCell($this->getMainPageWidth(), 1, $this->getMainPageX(), $this->GetY(), $this->style . $html,0,1,true,true); - - } - } - - /** - * Add a new section to the page - * - * @param string $text The text of the section - * @param string $desc The description of this section - * @param string $info Information for this section - */ - protected function addSection($desc = 'queXMLPDF Section',$title = false,$info = false) - { - $this->sectionCP++; - - if ($title === false) - $title = $this->sectionCP; - - $this->section[$this->sectionCP] = array('label' => $desc, 'title' => $title); - - $html = "$title: $desc"; - - if ($info && !empty($info)) - $html .= "
$info
"; - - $this->setBackground('section'); - $this->writeHTMLCell($this->getPageWidth() - (($this->cornerBorder *2) + ($this->cornerWidth * 2)),$this->sectionHeight,$this->getMainPageX(),$this->getY(),$this->style . $html,array('B' => array('width' => 1, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $this->backgroundColourEmpty)),1,true,true,''); - } - - /** - * Convert mm to pixels based on the set ppi (dpi) - * - * @param float $mm Measurement in millimetres - * @return int Pixel value as an integer - */ - public function mm2px($mm) - { - return round($mm * ($this->ppi / self::INCH_IN_MM)); - } - - /** - * Draw the background from the current Y position to the bottom of the page - * - * @param bool $last Optional, defaults to false. If this is the last page - * - * @author Adam Zammit - * @since 2010-09-15 - */ - protected function fillPageBackground($last = false) - { - $height = $this->getPageHeight() - $this->cornerBorder - $this->GetY() + $this->questionBorderBottom; - $html = "
"; - $this->setBackground('question'); - $this->writeHTMLCell($this->getMainPageWidth(), $height, $this->getMainPageX(), $this->GetY() - $this->questionBorderBottom, $this->style . $html,0,1,true,true); - } - - /** - * Create a new queXML PDF page - * - * Draw the barcode and page corners - * - */ - protected function newPage() - { - $this->AddPage(); - - //Set Auto page break to false - $this->SetAutoPageBreak(false); - - $this->SetMargins(0,0,0); - $this->SetHeaderMargin(0); - $this->SetFooterMargin(0); - - //Shortcuts to make the code (a bit) nicer - $width = $this->getPageWidth(); - $height = $this->getPageHeight(); - $cb = $this->cornerBorder; - $cl = $this->cornerLength; - - $barcodeStyle = array('border' => false, 'padding' => '0', 'fgcolor' => $this->lineColour, 'bgcolor' => false, 'text' => false, 'stretch' => true); - $lineStyle = array('width' => $this->cornerWidth, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)); - - //Top left - $this->Line($cb,$cb,$cb + $cl,$cb,$lineStyle); - $this->Line($cb,$cb,$cb,$cb + $cl,$lineStyle); - - //Top right - $this->Line($width - $cb,$cb,$width - $cb - $cl,$cb,$lineStyle); - $this->Line($width - $cb,$cb,$width - $cb,$cb + $cl,$lineStyle); - - //Bottom left - $this->Line($cb,$height - $cb,$cb + $cl,$height - $cb,$lineStyle); - $this->Line($cb,$height - $cb,$cb,$height - ($cb + $cl),$lineStyle); - - //Bottom right - $this->Line($width - $cb,$height - $cb,$width - $cb - $cl,$height - $cb,$lineStyle); - $this->Line($width - $cb,$height - $cb,$width - $cb,$height - ($cb + $cl),$lineStyle); - - $barcodeValue = substr(str_pad($this->questionnaireId,$this->idLength,"0",STR_PAD_LEFT),0,$this->idLength) . substr(str_pad($this->getPage(),$this->pageLength,"0",STR_PAD_LEFT),0,$this->pageLength); - - //Calc X position of barcode from page width - $barcodeX = $width - ($this->barcodeMarginX + $this->barcodeW); - - $this->write1DBarcode($barcodeValue, $this->barcodeType, $barcodeX, $this->barcodeY, $this->barcodeW, $this->barcodeH,'', $barcodeStyle, 'N'); - - //Add this page to the layout system - $b = $this->cornerBorder + ($this->cornerWidth / 2.0); //temp calc for middle of line - $this->layout[$barcodeValue] = array( 'id' => $barcodeValue, - 'tlx' => $this->mm2px($b), - 'tly' => $this->mm2px($b), - 'trx' => $this->mm2px($width - $b), - 'try' => $this->mm2px($b), - 'brx' => $this->mm2px($width - $b), - 'bry' => $this->mm2px($height - $b), - 'blx' => $this->mm2px($b), - 'bly' => $this->mm2px($height - $b), - 'rotation' => 0, - 'boxgroup' => array() - ); - $this->layoutCP = $barcodeValue; - - $this->SetXY($cb + $this->cornerWidth, $cb + $this->cornerWidth); - $this->SetAutoPageBreak(true,$this->getMainPageX()); - } - - /** - * Override of the acceptPageBreak function - * - * Allow our page handling function to know that a page break has occured - * - * $return bool Returns false so no page break is automatically issued - */ - public function AcceptPageBreak() - { - $this->pageBreakOccured = true; - return FALSE; - } -} diff --git a/include/limesurvey/admin/classes/tcpdf/2dbarcodes.php b/include/limesurvey/admin/classes/tcpdf/2dbarcodes.php deleted file mode 100644 index 8b73857d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/2dbarcodes.php +++ /dev/null @@ -1,177 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -// ------------------------------------------------------------------- -// -// Description : PHP class to creates array representations for -// 2D barcodes to be used with TCPDF. -// -//============================================================+ - -/** - * PHP class to creates array representations for 2D barcodes to be used with TCPDF. - * @package com.tecnick.tcpdf - * @abstract Functions for generating string representation of 2D barcodes. - * @author Nicola Asuni - * @copyright 2009-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @version 1.0.007 - */ - - /** - * PHP class to creates array representations for 2D barcodes to be used with TCPDF (http://www.tcpdf.org).
- * @name TCPDFBarcode - * @package com.tecnick.tcpdf - * @version 1.0.007 - * @author Nicola Asuni - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - */ -class TCPDF2DBarcode { - - /** - * @var array representation of barcode. - * @access protected - */ - protected $barcode_array = false; - - /** - * This is the class constructor. - * Return an array representations for 2D barcodes:
    - *
  • $arrcode['code'] code to be printed on text label
  • - *
  • $arrcode['num_rows'] required number of rows
  • - *
  • $arrcode['num_cols'] required number of columns
  • - *
  • $arrcode['bcode'][$r][$c] value of the cell is $r row and $c column (0 = transparent, 1 = black)
- * @param string $code code to print - * @param string $type type of barcode:
  • RAW: raw mode - comma-separad list of array rows
  • RAW2: raw mode - array rows are surrounded by square parenthesis.
  • QRCODE : QR-CODE Low error correction
  • QRCODE,L : QR-CODE Low error correction
  • QRCODE,M : QR-CODE Medium error correction
  • QRCODE,Q : QR-CODE Better error correction
  • QRCODE,H : QR-CODE Best error correction
  • PDF417 : PDF417 (ISO/IEC 15438:2006)
  • PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6 : PDF417 with parameters: a = aspect ratio (width/height); e = error correction level (0-8); t = total number of macro segments; s = macro segment index (0-99998); f = file ID; o0 = File Name (text); o1 = Segment Count (numeric); o2 = Time Stamp (numeric); o3 = Sender (text); o4 = Addressee (text); o5 = File Size (numeric); o6 = Checksum (numeric). NOTES: Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional. To use a comma character ',' on text options, replace it with the character 255: "\xff".
- */ - public function __construct($code, $type) { - $this->setBarcode($code, $type); - } - - /** - * Return an array representations of barcode. - * @return array - */ - public function getBarcodeArray() { - return $this->barcode_array; - } - - /** - * Set the barcode. - * @param string $code code to print - * @param string $type type of barcode:
  • RAW: raw mode - comma-separad list of array rows
  • RAW2: raw mode - array rows are surrounded by square parenthesis.
  • QRCODE : QR-CODE Low error correction
  • QRCODE,L : QR-CODE Low error correction
  • QRCODE,M : QR-CODE Medium error correction
  • QRCODE,Q : QR-CODE Better error correction
  • QRCODE,H : QR-CODE Best error correction
  • PDF417 : PDF417 (ISO/IEC 15438:2006)
  • PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6 : PDF417 with parameters: a = aspect ratio (width/height); e = error correction level (0-8); t = total number of macro segments; s = macro segment index (0-99998); f = file ID; o0 = File Name (text); o1 = Segment Count (numeric); o2 = Time Stamp (numeric); o3 = Sender (text); o4 = Addressee (text); o5 = File Size (numeric); o6 = Checksum (numeric). NOTES: Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional. To use a comma character ',' on text options, replace it with the character 255: "\xff".
- * @return array - */ - public function setBarcode($code, $type) { - $mode = explode(',', $type); - $qrtype = strtoupper($mode[0]); - switch ($qrtype) { - case 'QRCODE': { // QR-CODE - require_once(dirname(__FILE__).'/qrcode.php'); - if (!isset($mode[1]) OR (!in_array($mode[1],array('L','M','Q','H')))) { - $mode[1] = 'L'; // Ddefault: Low error correction - } - $qrcode = new QRcode($code, strtoupper($mode[1])); - $this->barcode_array = $qrcode->getBarcodeArray(); - break; - } - case 'PDF417': { // PDF417 (ISO/IEC 15438:2006) - require_once(dirname(__FILE__).'/pdf417.php'); - if (!isset($mode[1]) OR ($mode[1] === '')) { - $aspectratio = 2; // default aspect ratio (width / height) - } else { - $aspectratio = floatval($mode[1]); - } - if (!isset($mode[2]) OR ($mode[2] === '')) { - $ecl = -1; // default error correction level (auto) - } else { - $ecl = intval($mode[2]); - } - // set macro block - $macro = array(); - if (isset($mode[3]) AND ($mode[3] !== '') AND isset($mode[4]) AND ($mode[4] !== '') AND isset($mode[5]) AND ($mode[5] !== '')) { - $macro['segment_total'] = intval($mode[3]); - $macro['segment_index'] = intval($mode[4]); - $macro['file_id'] = strtr($mode[5], "\xff", ','); - for ($i = 0; $i < 7; ++$i) { - $o = $i + 6; - if (isset($mode[$o]) AND ($mode[$o] !== '')) { - // add option - $macro['option_'.$i] = strtr($mode[$o], "\xff", ','); - } - } - } - $qrcode = new PDF417($code, $ecl, $aspectratio, $macro); - $this->barcode_array = $qrcode->getBarcodeArray(); - break; - } - case 'RAW': - case 'RAW2': { // RAW MODE - // remove spaces - $code = preg_replace('/[\s]*/si', '', $code); - if (strlen($code) < 3) { - break; - } - if ($qrtype == 'RAW') { - // comma-separated rows - $rows = explode(',', $code); - } else { // RAW2 - // rows enclosed in square parentheses - $code = substr($code, 1, -1); - $rows = explode('][', $code); - } - $this->barcode_array['num_rows'] = count($rows); - $this->barcode_array['num_cols'] = strlen($rows[0]); - $this->barcode_array['bcode'] = array(); - foreach ($rows as $r) { - $this->barcode_array['bcode'][] = str_split($r, 1); - } - break; - } - case 'TEST': { // TEST MODE - $this->barcode_array['num_rows'] = 5; - $this->barcode_array['num_cols'] = 15; - $this->barcode_array['bcode'] = array( - array(1,1,1,0,1,1,1,0,1,1,1,0,1,1,1), - array(0,1,0,0,1,0,0,0,1,0,0,0,0,1,0), - array(0,1,0,0,1,1,0,0,1,1,1,0,0,1,0), - array(0,1,0,0,1,0,0,0,0,0,1,0,0,1,0), - array(0,1,0,0,1,1,1,0,1,1,1,0,0,1,0)); - break; - } - default: { - $this->barcode_array = false; - } - } - } -} // end of class - -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/tcpdf/CHANGELOG.TXT b/include/limesurvey/admin/classes/tcpdf/CHANGELOG.TXT deleted file mode 100644 index 0f2effc6..00000000 --- a/include/limesurvey/admin/classes/tcpdf/CHANGELOG.TXT +++ /dev/null @@ -1,1789 +0,0 @@ -5.9.011 (2010-11-02) - - Bug item #3101486 "Bug Fix for image loading" was fixed. - -5.9.010 (2010-10-27) - - Support for CSS properties 'border-spacing' and 'padding' for tables were added. - - Several language files were added. - -5.9.009 (2010-10-21) - - HTML text alignment was improved to include the case of RTL text on LTR direction and LTR text on RTL direction. - -5.9.008 (2010-10-21) - - Bug item #3091502 "Bookmark oddity" was fixed. - - HTML internal links now accepts page number and Y position. - - The method write1DBarcode() was improved to accept separate horizontal and vertical padding (see example n. 27). - -5.9.007 (2010-10-20) - - Method adjustCellPadding() was fixed to handle bad input. - -5.9.006 (2010-10-19) - - Support for AES 256 bit encryption was added (see example n. 16). - - Method getNumLines() was fixed for the empty string case. - -5.9.005 (2010-10-18) - - Method addPageRegion() was changed to accept regions starting exactly from the top of the page. - -5.9.004 (2010-10-18) - - A bug related to annotations was fixed. - - The file unicode_data.php was canged to encapsulate all data in a class. - - The file htmlcolors.php was changed to remove the global variable. - -5.9.003 (2010-10-15) - - Support for no-write page regions was added. Check the example n. 64 and new methods setPageRegions(), addPageRegion(), getPageRegions(), removePageRegion(). - - A bug on Right-To-Left alignment was fixed. - -5.9.002 (2010-10-08) - - Cell method was improved to preserve the font stretching and spacing values when using the $stretch parameter (see example n. 4). - -5.9.001 (2010-10-07) - - The problem of blank page for nobr table higher than a single page was fixed. - -5.9.000 (2010-10-06) - - Support for text stretching and spacing (kerning) was added, see example n. 63 and methods setFontStretching(), getFontStretching(), setFontSpacing(), getFontSpacing(). - - Support for CSS properties 'font-stretch' and 'letter-spacing' was added (see example n. 63). - - The cMargin state was replaced by cell_padding array that can be set/get using setCellPadding() and getCellPadding() methods. - - Methods getCellPaddings() and setCellPaddings() were added to fine tune cell paddings (see example n. 5). - - Methods getCellMargins() and setCellMargins() were added to fine tune cell margins (see example n. 5). - - Method write1DBarcode() was improved to permit custom labels (see example n. 27). - - Method ImagePngAlpha() now includes support for ImageMagick to improve performances. - - XObject Template support was extended to support Multicell(), writeHTML() and writeHTMLCell() methods. - - The signature of getNumLines() and getStringHeight() methods is changed. - - Example n. 57 was updated. - -// ------------------------------------------------------------------- - -5.8.034 (2010-09-27) - - A bug related to SetFont on XObject templates was fixed. - -5.8.033 (2010-09-25) - - A problem with Footer() and multiple columns was fixed. - -5.8.032 (2010-09-22) - - Bug #3073165 "Issues with changes to addHTMLVertSpace()" was fixed. - -5.8.031 (2010-09-20) - - Bug #3071961 "Spaces in HTML" was fixed. - -5.8.030 (2010-09-17) - - SVG support was improved and some bugs were fixed. - -5.8.029 (2010-09-16) - - A problem with HTML borders was fixed. - -5.8.028 (2010-09-13) - - Bug #3065224 "mcrypt_create_iv error on TCPDF 5.8.027 on PHP 5.3.2" was fixed. - -5.8.027 (2010-09-13) - - Bug #3065118 "mcrypt_decrypt error on TCPDF 5.8.026 on PHP 5.3.2" was fixed. - -5.8.026 (2010-09-13) - - A bug on addHTMLTOC() method was fixed. Note: be sure that the #TOC_PAGE_NUMBER# template has enough width to be printed correctly. - -5.8.025 (2010-09-09) - - Bug #3062692 "Textarea inside a table" was fixed. - -5.8.024 (2010-09-08) - - Bug #3062005 "Undefined variable: ann_obj_id" was fixed. - -5.8.023 (2010-08-31) - - Forms bug added on version 5.8.019 was fixed. - -5.8.022 (2010-08-31) - - Bug #3056632 "SVG rendered vertically flipped" was fixed. - -5.8.021 (2010-08-30) - - A new CID-0 'chinese' font was added for traditional Chinese. - - Bug #3054287 'Inner tags are ignored due to "align" attribute' was fixed. - -5.8.020 (2010-08-26) - - CSS "catch-all" class selector is now supported. - -5.8.019 (2010-08-26) - - XObject Templates now includes support for links and annotations. - - A problem related to link alignment on cell was fixed. - - A problem related to SVG styles was fixed. - -5.8.018 (2010-08-25) - - Method getNumberOfColumns() was added. - - A problem related to table header was fixed. - - Method getSVGTransformMatrix() was fixed to apply SVG transformations in the correct order. - - SVG support was improved and several bugs were fixed. - -5.8.017 (2010-08-25) - - This version includes support for XObject Templates (see the new example n. 62). - - Methods starttemplate(), endTemplate() and printTemplate() were added (see the new example n. 62). - -5.8.016 (2010-08-24) - - Alignment problem on write2DBarcode was fixed. - -5.8.015 (2010-08-24) - - A problem arised with the latest bugfix was fixed. - -5.8.014 (2010-08-23) - - Method _getxobjectdict() was added for better compatibility with external extensions. - - A bug related to radiobuttons was fixed. - - Bug #3051509 "new line after punctuation marks" was fixed (partially). - -5.8.013 (2010-08-23) - - SVG support for 'direction' property was added. - - A problem on default width calculation for linear barcodes was fixed. - - New option was added to write1DBarcode() method to improve alignments (see example n. 27). - - Bug #3050896 "Nested HTML tables: styles are not applied" was fixed. - - Method _putresourcedict() was improved to include external XObject templates. - -5.8.012 (2010-08-22) - - Support for SVG 'text-anchor' property was added. - -5.8.011 (2010-08-21) - - Method write1DBarcode() was improved to be backward compatible (check the new example n. 27). - - Support for CSS width and height properties on images were added. - -5.8.010 (2010-08-20) - - Documentation of unhtmlentities() was fixed. - - The 'fitwidth' option was added and border color problem was fixed on write1DBarcode() method (check the example n. 27). - -5.8.009 (2010-08-20) - - Internal object numbering was improved. - - Some errors in object encryption were fixed. - -5.8.008 (2010-08-19) - - Method write1DBarcode() was changed, check the example n. 27. - - Method Footer() was changed to account for barcode changes. - - Automatic calculation of K_PATH_URL constant was fixed on configuration file. - - Method setEqualColumns() was fixed for $width=0 case. - - Method AddTOC() was fixed for multipage and multicolumn modes. - - Better support for SVG "font-family" property. - - A problem on default Page Zoom mode was fixed. - - Several Annotation bugs were fixed. - -5.8.007 (2010-08-18) - - A bug affecting HTML tables was fixed. - - Bug #3047500 "SVG not rendering paths properly" was fixed. - -5.8.006 (2010-08-17) - - A bug affecting HTML table nesting was fixed. - -5.8.005 (2010-08-17) - - A bug affecting the HTML 'select' tag in certain conditions was fixed. - -5.8.004 (2010-08-17) - - Better support for HTML "font-family" property. - - A bug related to HTML multicolumn was fixed. - -5.8.003 (2010-08-16) - - Better support for HTML "font-family" property. - -5.8.002 (2010-08-14) - - HTML alignments were improved - - IMPORTANT: Default regular expression to find spaces has been changed to exclude the non-breaking-space (160 DEC- A0 HEX). If you are using setSpacesRE() method, please read the new documentation. - - Example n. 1 was updated. - -5.8.001 (2010-08-12) - - Bug #3043650 "subsetchars incorrectly cached" was fixed. - -5.8.000 (2010-08-11) - - A control to avoid bookmarking page 0 was added. - - addTOC() method now includes support for multicolumn mode. - - Support for tables in multicolumn mode was improved. - - Example n.10 was updated. - - All trimming functions were replaced with stringLeftTrim(), stringRightTrim() and stringTrim(). - - HTML alignments were improved. - ------------------------------------------------------------- - -5.7.003 (2010-08-08) - - Bug #3041263 "php source ending is bad" was fixed (all PHP files were updated, including fonts). - -5.7.002 (2010-08-06) - - Methods copyPage(), movePage() and deletePage() were changed to account for internal markings. - -5.7.001 (2010-08-05) - - Bug #3040105 "Broken PDF when using TOC (example 45)" was fixed. - -5.7.000 (2010-08-03) - - CSS borders are now supported for HTML tables and other block tags (see example n. 61); - - Cell borders were improved (see example n. 57); - - Minor bugs were fixed. -encry ------------------------------------------------------------- - -5.6.000 (2010-07-31) - - A bug with object IDs was fixes. - - Performances were improved. - ------------------------------------------------------------- - -5.5.015 (2010-07-29) - - Automatic fix for unclosed self-closing tag. - - Support for deprecated 's' and 'strike' tags was added. - - Empty list items problem was fixed. - -5.5.014 (2010-07-15) - - Support for external images was improved. - -5.5.013 (2010-07-14) - - Bug #3029338 "FI and FO output destination filename bug" was fixed (previous fix was wrong). - -5.5.012 (2010-07-14) - - Bug #3029310 "Font baseline inconsistencies with line-height and font-size" was fixed. - - Bug #3029338 "FI and FO output destination filename bug" was fixed. - -5.5.011 (2010-07-09) - - Support for multiple CSS classes was added. - - The method getColumn() was added to return the current column number. - - Some regular Expressions were fixed to be more compatible with UTF-8. - -5.5.010 (2010-07-06) - - Bug item #3025772 "Borders in all image functions are still flawed" was fixed. - -5.5.009 (2010-07-05) - - A problem related to last page footer was fixed. - - Image alignments and fit-on-page features were improved. - -5.5.008 (2010-07-02) - - A problem on table header alignment in booklet mode was fixed. - - Default graphic vars are now applied for setHeader(); - -5.5.007 (2010-07-02) - - Attribute "readonly" was added to input and textarea form fields. - - Vertical alignment feature was added on MultiCell() method only for simple text mode (see example n. 5). - - Text-Fit feature was added on MultiCell() method only for simple text mode (see example n. 5). - -5.5.006 (2010-06-29) - - getStringHeight() and getNumLines() methods were fixed. - -5.5.005 (2010-06-28) - - Bug #3022170 "getFontDescent() does not return correct descent value" was fixed. - - Some problems with multicolumn mode were fixed. - -5.5.004 (2010-06-27) - - Bug #3021803 "SVG Border" was fixed. - -5.5.003 (2010-06-26) - - On Write() method, blank lines at the beginning of a page or column are now automatically removed. - -5.5.002 (2010-06-24) - - ToUnicode Identity-H name was replaced with a full CMap (to avoid preflight syntax error). - - Bug #3020638 "str_split() not available in php4" was fixed. - - Bug #3020665 "file_get_contents() too many parameters for php4" was fixed. - -5.5.001 (2010-06-23) - - A problem on image streams was fixed. - -5.5.000 (2010-06-22) - - Several PDF syntax errors (and related bugs) were fixed. - - Bug #3019090 "/Length values are wrong if AES encryption is used" was fixed. - ------------------------------------------------------------- - -5.4.003 (2010-06-19) - - A problem related to page boxes was fixed. - - Bug #3016920 "Font subsetting issues when editing pdf" was partially fixed (Note that flattening transparency layers is currently incompatible with TrueTypeUnicode fonts). - -5.4.002 (2010-06-18) - - A problem related with setProtection() method was fixed. - -5.4.001 (2010-06-18) - - A problem related with setProtection() method was fixed. - -5.4.000 (2010-06-18) - - The method setSignatureAppearance() was added, check the example n. 52. - - Several problems related to font subsetting were fixed. - ------------------------------------------------------------- - -5.3.010 (2010-06-15) - - Previous release was corrupted. - -5.3.009 (2010-06-15) - - Bug #3015934 "Bullets don't display correctly" was fixed. - -5.3.008 (2010-06-13) - - This version fixes some problems of SVG rasterization. - -5.3.007 (2010-06-13) - - This version improves SVG support. - -5.3.006 (2010-06-10) - - This version includes a change in uniqid calls for backward compatibility with PHP4. - -5.3.005 (2010-06-09) - - The method getPageSizeFromFormat() was changed to include all standard page formats (includes 281 page formats + variation). - -5.3.004 (2010-06-08) - - Bug #3013291 "HTML table cell width" was fixed. - - Bug #3013294 "HTML table cell alignment" was fixed. - - The columns widths of HTML tables are now inherited from the first row. - -5.3.003 (2010-06-08) - - Bug #3013102 "HTML table header misaligned after page break" was fixed. - -5.3.002 (2010-06-07) - - The methods setFontSubsetting() and setFontSubsetting() were added to control the default font subsetting mode (see example n. 1). - - Bug #3012596 "Whitespace should not appeared after use Thai top characters" was fixed. - - Examples n. 1, 14, and 54 were updated. - -5.3.001 (2010-06-06) - - Barcode PDF417 was improved to support Macro Code Blocks (see example n. 50). - -5.3.000 (2010-06-05) - - License was changed to GNU-LGPLv3 (see the updated LICENSE.TXT file). - - PDF417 barcode support was added (check the example n. 50). - - The method write2DBarcode() was improved (some parameters were added and other changed - check example n. 50). - ------------------------------------------------------------- - -5.2.000 (2010-06-02) - - IMPORTANT: Support for font subsetting was added by default to reduce the size of documents using large unicode font files. - If you embed the whole font in the PDF, the person on the other end can make changes to it even if he didn't have your font. - If you subset the font, file size of the PDF will be smaller but the person who receives your PDF would need to have your same font in order to make changes to your PDF. - - The signature of the SetFont() and AddFont() methods were changed to include the font subsetting option (subsetting is applied by default). - - Examples 14 and 54 were updated. - ------------------------------------------------------------- - -5.1.002 (2010-05-27) - - Bug #3007818 "SetAutoPageBreak fails with MultiCell" was fixed. - - A bug related to MultiCell() minimun height was fixed. - -5.1.001 (2010-05-26) - - The problem of blank page after table was fixed. - -5.1.000 (2010-05-25) - - This version includes support for CSS (Cascading Style Sheets) (see example n. 61). - - The convertHTMLColorToDec() method was improved. - ------------------------------------------------------------- - -5.0.014 (2010-05-21) - - A problem on color and style of HTML links was fixed. - - A bug relative to gradients was fixed. - - The getStringHeight() method was added and getNumLines() method was improved. - - All examples were updated. - -5.0.013 (2010-05-19) - - A bug related to page-breaks and table cells was fixed. - -5.0.012 (2010-05-19) - - Page orientation bug was fixed. - - The access to method setPageFormat() was changed to 'protected' because it is not intended to be directly called. - -5.0.011 (2010-05-19) - - Page orientation bug was fixed. - - Bug #3003966 "Multiple columns and nested lists" was fixed. - -5.0.010 (2010-05-17) - - The methods setPageFormat(), setPageOrientation() and related methods were extended to include page boxes, page rotations and page transitions. - - The method setPageBoxes() was added to set page boundaries (MediaBox, CropBox, BleedBox, TrimBox, ArtBox); - - A bug relative to underline, overline and linethrough was fixed. - -5.0.009 (2010-05-16) - - Bug #3002381 "Multiple columns and nested lists" was fixed. - -5.0.008 (2010-05-15) - - Bug "Columns WriteHTML and Justification" was fixed. - -5.0.007 (2010-05-14) - - Bug #3001347 "Bug when using WriteHTML with setEqualColumns()" was fixed. - - Bug #3001505 "problem with sup and sub tags at the beginning of a line" was fixed. - -5.0.006 (2010-05-13) - - Length of hr tag was fixed. - - An error on 2d barcode method was fixed. - -5.0.005 (2010-05-12) - - WARNING: The logic of permissions on the SetProtection() method has been inverted and extended (see example 16). Now you have to specify the features you want to block. - - SetProtection() method was extended to support RSA and AES 128 encryption and public-keys (see example 16). - - Bug #2999489 "setEqualColumns() and TOC uses wrong columns" was fixed (see the example 10). - -5.0.004 (2010-05-10) - - HTML line alignment when using sub and sup tags was fixed. - -5.0.003 (2010-05-07) - - Horizontal alignment was fixed for images and barcodes. Now the X coordinate is always relative to the left margin. Use GetAbsX() instead of GetX() to get the X relative to left margin. - - Header() method was changed to account for new image alignment rules. - -5.0.002 (2010-05-06) - - Bookmark() and related methods were fixed to accept HTML code. - - A problem on HTML links was fixed. - -5.0.001 (2010-05-06) - - Protected method _putstream was re-added for backward compatibility. - - The following method were added to display HTML Table Of Content (see example n. 59): - addTOCPage(), endTOCPage(), addHTMLTOC(). - -5.0.000 (2010-05-05) - - Method ImageSVG() was added to embedd SVG images (see example n. 58). Note that not all SVG images are supported. - - Method setRasterizeVectorImages() was added to enable/disable rasterization for vector images via ImageMagick library. - - Method RoundedRectXY() was added. - - Method PieSectorXY() was added. - - Gradient() method is now public and support new features. - - Shading to transparency is now supported. - - Image alignments were fixed. - - Support for dynamic images were improved. - - PDF_IMAGE_SCALE_RATIO has been changed to 1.25 for better compatibility with SVG. - - RAW and RAW2 modes were added to 2D Barcodes (see example n. 50). - - Automatic padding feature was added on barcodes (see examples n. 27 and 50). - - Bug #2995003 "Reproduced thead bug" was fixed. - - The Output() method now accepts FI and FD destinations to save the document on server before sending it to the client. - - Ellipse() method was improved and fixed (see page 2 of example n. 12). - ------------------------------------------------------------- - -4.9.018 (2010-04-21) - - Bug item #2990356 "Current font size not respected with more than two HTML

" was fixed. - -4.9.017 (2010-04-21) - - Bug item #2990224 "Different behaviour for equivalent HTML strings" was fixed. - - Bug item #2990314 "Dash is not appearing with SHY character" was fixed. - -4.9.016 (2010-04-20) - - An error on htmlcolors.php was fixed. - - getImageFileType() method was improved. - - GIF images with transparency are now better supported. - - Automatic page orientation was improved. - -4.9.015 (2010-04-20) - - A new method copyPage() was added to clone pages (see example n. 44). - - Support for text overline was added. - - Underline and linethrough methods were fixed. - - Bug #2989058 "SHY character causes unnecessary word-wrapping" was fixed. - -4.9.014 (2010-04-18) - - Bug item #2988845 was fixed. - -4.9.013 (2010-04-15) - - Image() and ImageEPS() methods were fixed and improved; $fitonpage parameter was added. - -4.9.012 (2010-04-12) - - The hyphenateText() method was added to automatically hyphenate text (see example n. 46). - -4.9.011 (2010-04-07) - - Vertical alignments for Cell() method were improved (see example n. 57). - -4.9.010 (2010-04-06) - - Signature of Cell() method now includes new parameters for vertical alignment (see example n. 57). - - Text() method was extended to include all Cell() parameters. - - HTML line alignment procedure was changed to fix some bugs. - -4.9.009 (2010-04-05) - - Text() method was fixed for backward compatibility. - -4.9.008 (2010-04-03) - - Additional line space after table header was removed. - - Support for HTML lists in multicolumn mode was added. - - The method setTextRenderingMode() was added to set text rendering modes (see the example n. 26). - - The following HTML attributes were added to set text rendering modes (see the example n. 26): stroke, strokecolor, fill. - -4.9.007 (2010-04-03) - - Font Descent computation was fixed (patch #2981441). - -4.9.006 (2010-04-02) - - The constant K_TCPDF_CALLS_IN_HTML was added on configuration file to enable/disable the ability to call TCPDF methods in HTML. - - The usage of tcpdf tag in HTML mode was changed to remove the possible security flaw offered by the eval() function (thanks to Matthias Hecker for spotting this security problem). See the new example n. 49 for further information. - -4.9.005 (2010-04-01) - - Bug# 2980354 "Wrong File attachment description with security" was fixed. - - Several problems with HTML line alignment were fixed. - - The constant K_THAI_TOPCHAR was added on configuration file to enable/disable the special procedure used to avoid the overlappind of symbols on Thai language. - - A problem with font name directory was fixed. - - A bug on _destroy() method was fixed. - -4.9.004 (2010-03-31) - - Patch #979681 "GetCharWidth - default character width" was applied (bugfix). - -4.9.003 (2010-03-30) - - Problem of first
on multiple columns was fixed. - - HTML line alignment was fixed. - - A QR-code bug was fixed. - -4.9.002 (2010-03-29) - - Patch #2978349 "$ignore_min_height is ignored in function Cell()" was applied. - - Bug #2978607 "2D Barcodes are wrong" was fixed. - - A problem with HTML block tags was fixed. - - Artificial italic for CID-0 fonts was added. - - Several multicolumn bugs were fixed. - - Support for HTML tables on multicolumn was added. - -4.9.001 (2010-03-28) - - QR Code minor bug was fixed. - - Multicolumn mode was added (see the new example n. 10). - - The following methods were added: setEqualColumns(), setColumnsArray(), selectColumn(). - - Thai diacritics support were changed (note that this is incompatible with html justification). - -4.9.000 (2010-03-27) - - QR Code (2D barcode) support was added (see example n. 50). - - The following methods were added to print crop and registration marks (see example n. 56): colorRegistrationBar(), cropMark(), registrationMark(). - - Limited support for CSS line-height property was added. - - Gradient method now supports Gray, RGB and CMYK space color. - - Example n. 51 was updated. - - Vertical alignment of font inside cell was fixed. - - Support for multiple Thai diacritics was added. - - Bug item #2974929 "Duplicate case values" was fixed. - - Bug item #2976729 "File attachment not working with security" was fixed. - ------------------------------------------------------------- - -4.8.039 (2010-03-20) - - Problems related to custom locale settings were fixed. - - Problems related to HTML on Header and Footer were fixed. - -4.8.038 (2010-03-13) - - Various bugs related to page-break in HTML mode were fixed. - - Bug item #2968974 "Another pagebreak problem" was fixed. - - Bug item #2969276 "justification problem" was fixed. - - Bug item #2969289 "bug when using justified text and custom headers" was fixed. - - Images are now automatically resized to be contained on the page. - - Some HTML line alignments were fixed. - - Signature of AddPage() and SetMargins() methods were changed to include an option to set default page margins. - -4.8.037 (2010-03-03) - - Bug item #2962068 was fixed. - - Bug item #2967017 "Problems with and pagebreaks" was fixed. - - Bug item #2967023 "table header lost with pagebreak" was fixed. - - Bug item #2967032 "Header lost with nested tables" was fixed. - -4.8.036 (2010-02-24) - - Automatic page break for HTML images was improved. - - Example 10 was updated. - - Japanese was removed from example 8 because the freeserif font doesn't contain japanese (you can display it using arialunicid0 font). - -4.8.035 (2010-02-23) - - Automatic page break for HTML images was added. - - Support for multicolumn HTML was added (example 10 was updated). - -4.8.034 (2010-02-17) - - Language files were updated. - -4.8.033 (2010-02-12) - - A bug related to protection mode with links was fixed. - -4.8.032 (2010-02-04) - - A bug related to $maxh parameter on Write() and MultiCell() was fixed. - - Support for body tag was added. - -4.8.031 (2010-01-30) - - Bug item #2941589 "paragraph justify not working on some non-C locales" was fixed. - -4.8.030 (2010-01-27) - - Some text alignment cases were fixed. - -4.8.029 (2010-01-27) - - Bug item #2941057 "TOC Error in PDF File Output" was fixed. - - Some text alignment cases were fixed. - -4.8.028 (2010-01-26) - - Text alignment for RTL mode was fixed. - -4.8.027 (2010-01-25) - - Bug item #2938412 "Table related problems - thead, nobr, table width" was fixed. - -4.8.026 (2010-01-19) - - The misspelled word "lenght" was replaced with "length" in some variables and comments. - -4.8.025 (2010-01-18) - - addExtGState() method was improved to reuse existing ExtGState objects. - -4.8.024 (2010-01-15) - - Justification mode for HTML was fixed (Bug item #2932470). - -4.8.023 (2010-01-15) - - Bug item #2932470 "Some HTML entities breaks justification" was fixed. - -4.8.022 (2010-01-14) - - Source code documentation was fixed. - -4.8.021 (2010-01-03) - - A Bug relative to Table Of Content index was fixed. - -4.8.020 (2009-12-21) - - Bug item #2918545 "Display problem of the first row of a table with larger font" was fixed. - - A Bug relative to table rowspan mode was fixed. - -4.8.019 (2009-12-16) - - Bug item #2915684 "Image size" was fixed. - - Bug item #2914995 "Image jpeg quality" was fixed. - - The signature of the Image() method was changed (check the documentation for the $resize parameter). - -4.8.018 (2009-12-15) - - Bug item #2914352 "write error" was fixed. - -4.8.017 (2009-11-27) - - THEAD problem when table is used on header/footer was fixed. - - A first line alignment on HTML justification was fixed. - - Method getImageFileType() was added. - - Images with unknown extension and type are now supported via ImageMagick PHP extension. - -4.8.016 (2009-11-21) - - Document Information Dictionary was fixed. - - CSS attributes 'page-break-before', 'page-break-after' and 'page-break-inside' are now supported. - - Problem of unclosed last page was fixed. - - Problem of 'thead' unnecessarily repeated on the next page was fixed. - -4.8.015 (2009-11-20) - - A problem with some PNG transparency images was fixed. - - Bug #2900762 "Sort issues in Bookmarks" was fixed. - - Text justification was fixed for various modes: underline, strikeout and background. - -4.8.014 (2009-11-04) - - Bug item #2891316 "writeHTML, underlining replacing spaces" was fixed. - - The handling of temporary RTL text direction mode was fixed. - -4.8.013 (2009-10-26) - - Bug item #2884729 "Problem with word-wrap and hyphen" was fixed. - -4.8.012 (2009-10-23) - - Table cell alignments for RTL booklet mode were fixed. - - Images and barcode alignments for booklet mode were fixed. - -4.8.011 (2009-10-22) - - DejaVu fonts were updated to latest version. - -4.8.010 (2009-10-21) - - Bookmark for TOC page was added. - - Signature of addTOC() method is changed. - - Bookmarks are now automatically sorted by page and Y position. - - Example n. 45 was updated. - - Example n. 55 was added to display all charactes available on core fonts. - -4.8.009 (2009-09-30) - - Compatibility with PHP 5.3 was improved. - - All examples were updated. - - Index file for examples was added. - -4.8.008 (2009-09-29) - - Example 49 was updated. - - Underline and linethrough now works with cell stretching mode. - -4.8.007 (2009-09-23) - - Infinite loop problem caused by nobr attribute was fixed. - -4.8.006 (2009-09-23) - - Bug item #2864522 "No images if DOCUMENT_ROOT=='/'" was fixed. - - Support for text-indent CSS attribute was added. - - Method rollbackTransaction() was changed to support self-reassigment of previous object (check source code documentation). - - Support for the HTML "nobr" attribute was added to avoid splitting a table or a table row on two pages (i.e.: ...). - -4.8.005 (2009-09-17) - - A bug relative to multiple transformations and annotations was fixed. - -4.8.004 (2009-09-16) - - A bug on _putannotsrefs() method was fixed. - -4.8.003 (2009-09-15) - - Bug item #2858754 "Division by zero" was fixed. - - A bug relative to HTML list items was fixed. - - A bug relative to form fields on multiple pages was fixed. - - PolyLine() method was added (see example n. 12). - - Signature of Polygon() method was changed. - -4.8.002 (2009-09-12) - - A problem related to CID-0 fonts offset was fixed: if the $cw[1] entry on the CID-0 font file is not defined, then a CID keys offset is introduced. - -4.8.001 (2009-09-09) - - The appearance streams (AP) for anotations form fields was fixed (see examples n. 14 and 54). - - Radiobuttons were fixed. - -4.8.000 (2009-09-07) - - This version includes some support for Forms fields (see example n. 14) and XHTML forms (see example n. 54). - - The following methods were changed to work without JavaScript: TextField(), RadioButton(), ListBox(), ComboBox(), CheckBox(), Button(). - - Support for Widget annotations was improved. - - Alignment of annotation objects was fixed (examples 36 and 41 were updated). - - addJavascriptObject() method was added. - - Signature of Image() method was changed. - - htmlcolors.php file was updated. - ------------------------------------------------------------- - -4.7.003 (2009-09-03) - - Support for TCPDF methods on HTML was improved (see example n. 49). - -4.7.002 (2009-09-02) - - Bug item #2848892 "writeHTML + table: Gaps between rows" was fixed. - - JavaScript support was fixed (see example n. 53). - -4.7.001 (2009-08-30) - - The Polygon() and Arrow() methods were fixed and improved (see example n. 12). - -4.7.000 (2009-08-29) - - This is a major release. - - Some procedures were internally optimized. - - The problem of mixed signature and annotations was fixed (example n. 52). - -4.6.030 (2009-08-29) - - IMPORTANT: percentages on table cell widths are now relative to the full table width (as in standard HTML). - - Various minor bugs were fixed. - - Example n. 52 (digital signature) was updated. - -4.6.029 (2009-08-26) - - PHP4 version was fixed. - -4.6.028 (2009-08-25) - - Signature algorithm was finally fixed (see example n. 52). - -4.6.027 (2009-08-24) - - TCPDF now supports unembedded TrueTypeUnicode Fonts (just comment the $file entry on the fonts' php file. - -4.6.026 (2009-08-21) - - Bug #2841693 "Problem with MultiCell and ishtml and justification" was fixed. - - Signature functions were improved but not yet fixed (tcpdf.crt and example n. 52 were updated). - -4.6.025 (2009-08-17) - - Carriage returns (\r) were removed from source code. - - Problem related to set_magic_quotes_runtime() depracated was fixed. - -4.6.024 (2009-08-07) - - Bug item #2833556 "justification using other units than mm" was fixed. - - Documentation was fixed/updated. - -4.6.023 (2009-08-02) - - Bug item #2830537 "MirrorH can show mask for transparent PNGs" was fixed. - -4.6.022 (2009-07-24) - - A bug relative to single line printing when using WriteHTMLCell() was fixed. - - Signature support were improved but is still experimental. - - Fonts Free and Dejavu were updated to latest versions. - -4.6.021 (2009-07-20) - - Bug item #2824015 "XHTML Ampersand & in hyperlink bug" was fixed. - - Bug item #2824036 "Image as hyperlink in table, text displaced at page break" was fixed. - - Links alignment on justified text was fixed. - - Unicode "\u" modifier was added to re_spaces variable by default. - -4.6.020 (2009-07-16) - - Bug item #2821921 "issue in example 18" was fixed. - - Signature of SetRTL() method was changed. - -4.6.019 (2009-07-13) - - Bug item #2820703 "xref table broken" was fixed. - -4.6.018 (2009-07-10) - - Bug item #2819319 "Text over text" was fixed. - - Method Arrow() was added to print graphic arrows (example 12 was updated). - -4.6.017 (2009-07-05) - - Bug item #2816079 "Example 48 not working" was fixed. - - The signature of the checkPageBreak() was changed. The parameter $addpage was added to turn off the automatic page creation. - -4.6.016 (2009-06-16) - - Method setSpacesRE() was added to set the regular expression used for detecting withespaces or word separators. If you are using chinese, try: setSpacesRE('/[\s\p{Z}\p{Lo}]/');, otherwise you can use setSpacesRE('/[\s\p{Z}]/'); - - The method _putinfo() now automatically fills the metadata with '?' in case of empty string. - -4.6.015 (2009-06-11) - - Bug #2804667 "word wrap bug" was fixed. - -4.6.014 (2009-06-04) - - Bug #2800931 "Table thead tag bug" was fixed. - - A bug related to

 tag was fixed.
-
-4.6.013 (2009-05-28)
-	- List bullets position was fixed for RTL languages.
-
-4.6.012 (2009-05-23)
-	- setUserRights() method doesn't work anymore unless you call the setSignature() method with the Adobe private key!
-
-4.6.011 (2009-05-18)
-	- Signature of the Image() method was changed to include the new $fitbox parameter (see source code documentation).
-
-4.6.010 (2009-05-17)
-	- Image() method was improved: now is possible to specify the maximum dimensions for a constraint box defined by $w and $h parameters, and setting the $resize parameter to null.
-	-  tag indent problem was fixed.
-	- $y parameter was added to checkPageBreak() method.
-	- Bug n. 2791773 "writeHTML" was fixed.
-
-4.6.009 (2009-05-13)
-	- xref table for embedded files was fixed.
-
-4.6.008 (2009-05-07)
-	- setSignature() method was improved (but is still experimental).
-	- Example n. 52 was added.
-
-4.6.007 (2009-05-05)
-	- Bug #2786685 "writeHtmlCell and 
in custom footer" was fixed. - - Table header repeating bug was fixed. - - Some newlines and tabs are now automatically removed from HTML strings. - -4.6.006 (2009-04-28) - - Support for "..." was added. - - By default TCPDF requires PCRE Unicode support turned on but now works also without it (with limited ability to detect some Unicode blank spaces). - -4.6.005 (2009-04-25) - - Points (pt) conversion in getHTMLUnitToUnits() was fixed. - - Default tcpdf.pem certificate file was added. - - Experimental support for signing document was added but it is not yet completed (some help is needed - I think that the calculation of the ByteRange is OK and the problem is on the signature calculation). - -4.6.004 (2009-04-23) - - Method deletePage() was added to delete pages (see example n. 44). - -4.6.003 (2009-04-21) - - The caching mechanism of the UTF8StringToArray() method was fixed. - -4.6.002 (2009-04-20) - - Documentation of rollbackTransaction() method was fixed. - - The setImageScale() and getImageScale() methods now set and get the adjusting parameter used by pixelsToUnits() method. - - HTML images now support other units of measure than pixels (getHTMLUnitToUnits() is now used instead of pixelsToUnits()). - - WARNING: PDF_IMAGE_SCALE_RATIO has been changed by default to 1. - -4.6.001 (2009-04-17) - - Spaces between HTML block tags are now automatically removed. - - The bug related to cMargin changes between tables was fixed. - -4.6.000 (2009-04-16) - - WARNING: THIS VERSION CHANGES THE BEHAVIOUR OF $x and $y parameters for several TCPDF methods: - zero coordinates for $x and $y are now valid coordinates; - set $x and $y as empty strings to get the current value. - - Some error caused by 'empty' funtion were fixed. - - Default color for convertHTMLColorToDec() method was changed to white and the return value for invalid color is false. - - HTML on footer bug was fixed. - - The following examples were fixed: 5,7,10,17,19,20,21,33,42,43. - -4.5.043 (2009-04-15) - - Barcode class (barcode.php) was extended to include new linear barcode types (see example n. 27): - C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9 - C39+ : CODE 39 with checksum - C39E : CODE 39 EXTENDED - C39E+ : CODE 39 EXTENDED + CHECKSUM - C93 : CODE 93 - USS-93 - S25 : Standard 2 of 5 - S25+ : Standard 2 of 5 + CHECKSUM - I25 : Interleaved 2 of 5 - I25+ : Interleaved 2 of 5 + CHECKSUM - C128A : CODE 128 A - C128B : CODE 128 B - C128C : CODE 128 C - EAN2 : 2-Digits UPC-Based Extention - EAN5 : 5-Digits UPC-Based Extention - EAN8 : EAN 8 - EAN13 : EAN 13 - UPCA : UPC-A - UPCE : UPC-E - MSI : MSI (Variation of Plessey code) - MSI+ : MSI + CHECKSUM (modulo 11) - POSTNET : POSTNET - PLANET : PLANET - RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) - KIX : KIX (Klant index - Customer index) - IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200 (NOTE: requires BCMath PHP extension) - CODABAR : CODABAR - CODE11 : CODE 11 - PHARMA : PHARMACODE - PHARMA2T : PHARMACODE TWO-TRACKS - -4.5.042 (2009-04-15) - - Method Write() was fixed for the strings containing only zero value. - -4.5.041 (2009-04-14) - - Barcode methods were fixed. - -4.5.040 (2009-04-14) - - Method Write() was fixed to handle empty strings. - -4.5.039 (2009-04-11) - - Support for linear barcodes was extended (see example n. 27 and barcodes.php documentation). - -4.5.038 (2009-04-10) - - Write() method was improved to support separators for Japanese, Korean, Chinese Traditional and Chinese Simplified. - -4.5.037 (2009-04-09) - - General performances were improved. - - The signature of the method utf8Bidi() was changed. - - The method UniArrSubString() was added. - - Experimental support for 2D barcodes were added (see example n. 50 and 2dbarcodes.php class). - -4.5.036 (2009-04-03) - - TCPDF methods can be called inside the HTML code (see example n. 49). - - All tag attributes, such as

must be enclosed within double quotes. - -4.5.035 (2009-03-28) - - Bug #2717436 "writeHTML rowspan problem (continued)" was fixed. - - Bug #2719090 "writeHTML fix follow up" was fixed. - - The method _putuserrights() was changed to avoid Adobe Reader 9.1 crash. This broken the 'trick' that was used to display forms in Acrobat Reader. - -4.5.034 (2009-03-27) - - Bug #2716914 "Bug writeHTML of a table in body and footer related with pb" was fixed. - - Bug #2717056 ] "writeHTML problem when setting tr style" was fixed. - - The signature of the Cell() method was changed. - -4.5.033 (2009-03-27) - - The support for rowspan/colspan on HTML tables was improved (see example n. 48). - -4.5.032 (2009-03-23) - - setPrintFooter(false) bug was fixed. - -4.5.031 (2009-03-20) - - Table header support was extended to multiple pages. - -4.5.030 (2009-03-20) - - thead tag is now supported on HTML tables (header rows are repeated after page breaks). - - The startTransaction() was improved to autocommit. - - List bullets now uses the foreground color (putHtmlListBullet()). - -4.5.029 (2009-03-19) - - The following methods were added to UNDO commands (see example 47): startTransaction(), commitTransaction(), rollbackTransaction(). - - All examples were updated. - -4.5.028 (2009-03-18) - - Bug #2690945 "List Bugs" was fixed. - - HTML text alignment on lists was fixed. - - The constant PDF_FONT_MONOSPACED was added to the configuration file to define the default monospaced font. - - The following methods were fixed: getPageWidth(), getPageHeight(), getBreakMargin(). - - All examples were updated. - -4.5.027 (2009-03-16) - - Method getPageDimensions() was added to get page dimensions. - - The signature of the following methos were changed: getPageWidth(), getPageHeight(), getBreakMargin(). - - _parsepng() method was fixed for PNG URL images (fread bug). - -4.5.026 (2009-03-11) - - Bug #2681793 affecting URL images with spaces was fixed. - -4.5.025 (2009-03-10) - - A small bug affecting hyphenation support was fixed. - - The method SetDefaultMonospacedFont() was added to define the default monospaced font. - -4.5.024 (2009-03-07) - - The bug #2666493 was fixed "Footer corrupts document". - -4.5.023 (2009-03-06) - - The bug #2666688 was fixed "Rowspan in tables". - -4.5.022 (2009-03-05) - - The bug #2659676 was fixed "refer to #2157099 test 4 < BR > problem still not fixed". - - addTOC() function bug was fixed. - -4.5.020 (2009-03-03) - - The following bug was fixed: "function removeSHY corrupts unicode". - -4.5.019 (2009-02-28) - - The problem of decimal separator using different locale was fixed. - - The text hyphenation is now supported (see example n. 46). - -4.5.018 (2009-02-26) - - The _destroy() method was added to unset all class variables and frees memory. - - Now it's possible to call Output() method multiple times. - -4.5.017 (2009-02-24) - - A minor bug that raises a PHP warning was fixed. - -4.5.016 (2009-02-24) - - Bug item #2631200 "getNumLines() counts wrong" was fixed. - - Multiple attachments bug was fixed. - - All class variables are now cleared on Output() for memory otpimization. - -4.5.015 (2009-02-18) - - Bug item #2612553 "function Write() must not break a line on   character" was fixed. - -4.5.014 (2009-02-13) - - Bug item #2595015 "POSTNET Barcode Checksum Error" was fixed (on barcode.php). - - Pagebreak bug for barcode was fixed. - -4.5.013 (2009-02-12) - - border attribute is now supported on HTML images (only accepts the same values accepted by Cell()). - -4.5.012 (2009-02-12) - - An error on image border feature was fixed. - -4.5.011 (2009-02-12) - - HTML links for images are now supported. - - height attribute is now supported on HTML cells. - - $border parameter was added to Image() and ImageEps() methods. - - The method getNumLines() was added to estimate the number of lines required for the specified text. - -4.5.010 (2009-01-29) - - Bug n. 2546108 "BarCode Y position" was fixed. - -4.5.009 (2009-01-26) - - Bug n. 2538094 "Empty pdf file created" was fixed. - -4.5.008 (2009-01-26) - - setPage() method was fixed to correctly restore graphic states. - - Source code was cleaned up for performances. - -4.5.007 (2009-01-24) - - checkPageBreak() and write1DBarcode() methods were fixed. - - Source code was cleaned up for performances. - - barcodes.php was updated. - -4.5.006 (2009-01-23) - - getHTMLUnitToPoints() method was replaced by getHTMLUnitToUnits() to fix HTML units bugs. - -4.5.005 (2009-01-23) - - Page closing bug was fixed. - -4.5.004 (2009-01-21) - - The access of convertHTMLColorToDec() method was changed to public - - Fixed bug on UL tag. - -4.5.003 (2009-01-19) - - Fonts on different folders are now supported. - -4.5.002 (2009-01-07) - - addTOC() function was improved (see example n. 45). - -4.5.001 (2009-01-04) - - The signature of startPageGroup() function was changed. - - Method Footer() was improved to automatically print page or page-group number (see example n. 23). - - Protected method formatTOCPageNumber() was added to customize the format of page numbers on the Table Of Content. - - The signature of addTOC() was changed to include the font used for page numbers. - -4.5.000 (2009-01-03) - - A new $diskcache parameter was added to class constructor to enable disk caching and reduce RAM memory usage (see example n. 43). - - The method movePageTo() was added to move pages to previous positions (see example n. 44). - - The methods getAliasNumPage() and getPageNumGroupAlias() were added to get the alias for page number (needed when using movepageTo()). - - The methods addTOC() was added to print a Table Of Content (see example n. 45). - - Imagick class constant was removed for better compatibility with PHP4. - - All existing examples were updated and new examples were added. - -4.4.009 (2008-12-29) - - Examples 1 and 35 were fixed. - -4.4.008 (2008-12-28) - - Bug #2472169 "Unordered bullet size not adjusted for unit type" was fixed. - -4.4.007 (2008-12-23) - - Bug #2459935 "no unit conversion for header line" was fixed. - - Example n. 42 for image alpha channel was added. - - All examples were updated. - -4.4.006 (2008-12-11) - - Method setLIsymbol() was changed to reflect latest changes in HTML list handling. - -4.4.005 (2008-12-10) - - Bug item #2413870 "ordered list override value" was fixed. - -4.4.004 (2008-12-10) - - The protected method getHTMLUnitToPoints() was added to accept various HTML units of measure (em, ex, px, in, cm, mm, pt, pc, %). - - The method intToRoman() was added to convert integer number to Roman representation. - - Support fot HTML lists was improved: the CSS property list-style-type is now supported. - -4.4.003 (2008-12-09) - - Bug item #2412147 "Warning on line 3367" was fixed. - - Method setHtmlLinksStyle() was added to set default HTML link colors and font style. - - Method addHtmlLink() was changed to use color and style defined on the inline CSS. - -4.4.002 (2008-12-09) - - Borders on Multicell() were fixed. - - Problem of Multicell() on Header function (Bug item #2407579) was fixed. - - Problem on graphics tranformations applied to Multicell() was fixed. - - Support for ImageMagick was added. - - Width calculation for nested tables was fixed. - -4.4.001 (2008-12-08) - - Some missing core fonts were added on fonts directory. - - CID0 fonts rendering was fixed. - - HTML support was improved (

 and  tags are now supported).
-	- Bug item #2406022 "Left padding bug in MultiCell with maxh" was fixed.
-
-4.4.000 (2008-12-07)
-	- File attachments are now supported (see example n. 41).
-	- Font functions were optimized to reduce document size.
-	- makefont.php was updated.
-	- Linux binaries were added on /fonts/utils
-	- All fonts were updated.
-	- $autopadding parameter was added to Multicell() to disable automatic padding features.
-	- $maxh parameter was added to Multicell() and Write() to set a maximum height.
-
-4.3.009 (2008-12-05)
-	- Bug item #2392989 (Custom header + setlinewidth + cell border bug) was fixed.
-
-4.3.008 (2008-12-05)
-	- Bug item #2390566 "rect bug" was fixed.
-	- File path was fixed for font embedded files.
-	- SetFont() method signature was changed to include the font filename.
-	- Some font-related methods were improved.
-	- Methods getFontFamily() and getFontStyle() were added.
-
-4.3.007 (2008-12-03)
-	- PNG alpha channel is now supported (GD library is required).
-	- AddFont() function now support custom font file path on $file parameter.
-	- The default width variable ($dw) is now always defined for any font.
-	- The 'Style' attribute on CID-0 fonts was removed because of protection bug.
-
-4.3.006 (2008-12-01)
-	- A regular expression on getHtmlDomArray() to find HTML tags was fixed.
-
-4.3.005 (2008-11-25)
-	- makefont.php was fixed.
-	- Bug item #2339877 was fixed (false loop condition detected on WriteHTML()).
-	- Bug item #2336733 was fixed (lasth value update on Multicell() when border and fill are disabled).
-	- Bug item #2342303 was fixed (automatic page-break on Image() and ImageEPS()).
-
-4.3.004 (2008-11-19)
-	- Function _textstring() was fixed (bug 2309051).
-	- All examples were updated.
-
-4.3.003 (2008-11-18)
-	- CID-0 font bug was fixed.
-	- Some functions were optimized.
-	- Function getGroupPageNoFormatted() was added.
-	- Example n. 23 was updated.
-
-4.3.002 (2008-11-17)
-	- Bug item #2305518 "CID-0 font don't work with encryption" was fixed.
-
-4.3.001 (2008-11-17)
-	- Bug item #2300007 "download mimetype pdf" was fixed.
-	- Double quotes were replaced by single quotes to improve PHP performances.
-	- A bug relative to HTML cell borders was fixed.
-
-4.3.000 (2008-11-14)
-	- The function setOpenCell() was added to set the top/bottom cell sides to be open or closed when the cell cross the page.
-	- A bug relative to list items indentation was fixed.
-	- A bug relative to borders on HTML tables and Multicell was fixed.
-	- A bug relative to rowspanned cells was fixed.
-	- A bug relative to html images across pages was fixed.
-
-4.2.009 (2008-11-13)
-	- Spaces between li tags are now automatically removed.
-
-4.2.008 (2008-11-12)
-	- A bug relative to fill color on next page was fixed.
-
-4.2.007 (2008-11-12)
-	- The function setListIndentWidth() was added to set custom indentation widht for HTML lists.
-
-4.2.006 (2008-11-06)
-	- A bug relative to HTML justification was fixed.
-
-4.2.005 (2008-11-06)
-	- A bug relative to HTML justification was fixed.
-	- The methods formatPageNumber() and PageNoFormatted() were added to format page numbers.
-	- Default Footer() method was changed to use PageNoFormatted() instead of PageNo().
-	- Example 6 was updated.
-
-4.2.004 (2008-11-04)
-	- Bug item n. 2217039 "filename handling improvement" was fixed.
-
-4.2.003 (2008-10-31)
-	- Font style bug was fixed.
-
-4.2.002 (2008-10-31)
-	- Bug item #2210922 (htm element br not work) was fixed.
-	- Write() function was improved to support margin changes.
-
-4.2.001 (2008-10-30)
-	- setHtmlVSpace($tagvs) function was added to set custom vertical spaces for HTML tags.
-	- writeHTML() function now support margin changes during execution.
-	- Signature of addHTMLVertSpace() function is changed.
-
-4.2.000 (2008-10-29)
-	- htmlcolors.php was changed to support class-loaders.
-	- ImageEps() function was improved in performances.
-	- Signature of Link() And Annotation() functions were changed.
-	- (Bug item #2198926) Links and Annotations alignment were fixed (support for geometric tranformations was added).
-	- rowspan mode for HTML table cells was improved and fixed.
-	- Booklet mode for double-sided pages was added; see SetBooklet() function and example n. 40.
-	- lastPage() signature is changed.
-	- Signature of Write() function is changed.
-	- Some HTML justification problems were fixed.
-	- Some functions were fixed to better support RTL mode.
-	- Example n. 10 was changed to support RTL mode.
-	- All examples were updated.
-
-4.1.004 (2008-10-23)
-	- unicode_data.php was changed to support class-loaders.
-	- Bug item #2186040/2 (writeHTML margin problem) was fixed.
-
-4.1.003 (2008-10-22)
-	- Bug item #2185399 was fixed (rowspan and page break).
-	- Bugs item #2186040 was fixed (writeHTML margin problem).
-	- Newline after table was removed.
-
-4.1.002 (2008-10-21)
-	- Bug item #2184525 was fixed (rowspan on HTML cell).
-
-4.1.001 (2008-10-21)
-	- Support for "start" attribute was added to HTML ordered list.
-	- unicode_data.php file was changed to include UTF-8 to ASCII table.
-	- Some functions were modified to better support UTF-8 extensions to core fonts.
-	- Support for images on HTML lists was improved.
-	- Examples n. 1 and 6 were updated.
-
-4.1.000 (2008-10-18)
-	- Page-break bug using HTML content was fixed.
-	- The "false" parameter was reintroduced to class_exists function on PHP5 version to avoid autoload.
-	- addHtmlLink() function was improved to support internal links (i.e.: link to page 23).
-	- Justification alignment is now supported on HTML (see example n. 39).
-	- example_006.php was updated.
-
-4.0.033 (2008-10-13)
-	- Bug n. 2157099 was fixed.
-	- SetX() and SetY() functions were improved.
-	- SetY() includes a new parameter to avoid the X reset.
-
-4.0.032 (2008-10-10)
-	- Bug n. 2156926 was fixed (bold, italic, underlined, linethrough).
-	- setStyle() method was removed.
-	- Configuration file was changed to use helvetica (non-unicode) font by default.
-	- The use of mixed font types was improved.
-	- All examples were updated.
-
-4.0.031 (2008-10-09)
-	- _putannots() and _putbookmarks() links alignments were fixed.
-
-4.0.030 (2008-10-07)
-	- _putbookmarks() function was fixed.
-	- _putannots() was fixed to include internal links.
-
-4.0.029 (2008-09-27)
-	- Infinite loop bug was fixed [Bug item #130309].
-	- Multicell() problem on Header() was fixed.
-
-4.0.028 (2008-09-26)
-	- setLIsymbol() was added to set the LI symbol used on UL lists.
-	- Missing $padding and $encryption_key variables declarations were added [Bug item #2129058].
-
-4.0.027 (2008-09-19)
-	- Bug #2118588 "Undefined offset in tcpdf.php on line 9581" was fixed.
-	- arailunicid0.php font was updated.
-	- The problem of javascript form fields duplication after saving was fixed.
-
-4.0.026 (2008-09-17)
-	- convertHTMLColorToDec() function was improved to support rgb(RR,GG,BB) notation.
-	- The following inline CSS attributes are now supported: text-decoration, color, background-color and font-size names: xx-small, x-small, small, medium, large, x-large, xx-large
-	- Example n. 6 was updated.
-
-4.0.025 (2008-09-15)
-	- _putcidfont0 function was improved to include CJK fonts (Chinese, Japanese, Korean, CJK, Asian fonts) without embedding.
-	- arialunicid0 font was added (see the new example n. 38).
-	- The following Unicode to CID-0 tables were added on fonts folder: uni2cid_ak12.php, uni2cid_aj16.php, uni2cid_ag15.php, uni2cid_ac15.php.
-
-4.0.024 (2008-09-12)
-	- "stripos" function was replaced with "strpos + strtolower" for backward compatibility with PHP4.
-	- support for Spot Colors were added. Check the new example n. 37 and the following new functions:
-		AddSpotColor()
-		SetDrawSpotColor()
-		SetFillSpotColor()
-		SetTextSpotColor()
-		_putspotcolors()
-	- Bookmark() function was improved to fix wrong levels.
-	- $lasth changes after header/footer calls were fixed.
-
-4.0.023 (2008-09-05)
-	- Some HTML related problems were fixed.
-	- Image alignment on HTML was changed, now it always defaults to the normal mode (see example_006.php).
-
-4.0.022 (2008-08-28)
-	- Line height on HTML was fixed.
-	- Image inside an HTML cell problem was fixed.
-	- A new "zarbold" persian font was added.
-
-4.0.021 (2008-08-24)
-	- HTTP headers were fixed on Output function().
-	- getAliasNbPages() and getPageGroupAlias() functions were changed to support non-unicode fonts on unicode documents.
-	- Function Write() was fixed.
-	- The problem of additional vertical spaces on HTML was fixed.
-	- The problem of frame around HTML links was fixed.
-
-4.0.020 (2008-08-15)
-	- "[2052259] WriteHTML  & " bug was fixed.
-
-4.0.019 (2008-08-13)
-	- "Rowspan on first cell" bug was fixed.
-
-4.0.018 (2008-08-08)
-	- Default cellpadding for HTML tables was fixed.
-	- Annotation() function was added to support some PDF annotations (see example_036.php and section 8.4 of PDF reference 1.7).
-	- HTML links are now correclty shifted during line alignments.
-	- function getAliasNbPages() was added and Footer() was updated.
-	- RowSpan mode for HTML tables was fixed.
-	- Bugs item #2043610 "Multiple sizes vertical align wrong" was fixed.
-	- ImageEPS() function was improved and RTL alignment was fixed (see example_032.php).
-
-4.0.017 (2008-08-05)
-	- Missing CNZ and CEO style modes were added to Rect() function.
-	- Fonts utils were updated to include support for OpenType fonts.
-	- getLastH() function was added.
-
-4.0.016 (2008-07-30)
-	- setPageMark() function was added. This function must be called after calling Image() function for a background image.
-
-4.0.015 (2008-07-29)
-	- Some functions were changed to support different page formats (see example_028.php).
-	- The signature of setPage() function is changed.
-
-4.0.014 (2008-07-29)
-	- K_PATH_MAIN calculation on tcpdf_config.php was fixed.
-	- HTML support for EPS/AI images was added (see example_006.php).
-	- Bugs item #2030807 "Truncated text on multipage html fields" was fixed.
-	- PDF header bug was fixed.
-	- helvetica was added as default font family.
-	- Stroke mode was fixed on Text function.
-	- several minor bugs were fixed.
-
-4.0.013 (2008-07-27)
-	- Bugs item #2027799 " Big spaces between lines after page break" was fixed.
-	- K_PATH_MAIN calculation on tcpdf_config.php was changed.
-	- Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message.
-
-4.0.012 (2008-07-24)
-	- Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions.
-	- The following functions were added:
-			setHeader()
-			setFooter()
-			getImageRBX()
-			getImageRBY()
-			getCellHeightRatio()
-			getHeaderFont()
-			getFooterFont()
-			getRTL()
-			getBarcode()
-			getHeaderData()
-			getHeaderMargin()
-			getFooterMargin()
-
-4.0.011 (2008-07-23)
-	- Font support was improved.
-	- The folder /fonts/utils contains new utilities and instructions for embedd font files.
-	- Documentation was updated.
-
-4.0.010 (2008-07-22)
-	- HTML tables were fixed to work across pages.
-	- Header() and Footer() functions were updated to preserve previous settings.
-	- example_035.php was added.
-
-4.0.009 (2008-07-21)
-	- UTF8StringToArray() function was fixed for non-unicode mode.
-
-4.0.008 (2008-07-21)
-	- Barcodes alignment was fixed (see example_027.php).
-	- unicode_data.php was updated.
-	- Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed.
-
-4.0.007 (2008-07-18)
-	- str_split was replaced by preg_split for compatibility with PHP4 version.
-	- Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php).
-
-4.0.006 (2008-07-16)
-	- HTML rowspan bug was fixed.
-	- Line style for MultiCell() was fixed.
-	- WriteHTML() function was improved.
-	- CODE128C barcode was fixed (barcodes.php).
-
-4.0.005 (2008-07-11)
-	- Bug [2015715] "PHP Error/Warning" was fixed.
-
-4.0.004 (2008-07-09)
-	- HTML cell internal padding was fixed.
-
-4.0.003 (2008-07-08)
-	- Removed URL encoding when F option is selected on Output() function.
-	- fixed some minor bugs in html tables.
-
-4.0.002 (2008-07-07)
-	- Bug [2000861] was still unfixed and has been fixed.
-
-4.0.001 (2008-07-05)
-	- Bug [2000861] was fixed.
-
-4.0.000 (2008-07-03)
-	- THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES
-	- Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed).
-	- HTML support was completely rewritten and improved (see example 6).
-	- Alignments parameters were fixed.
-	- Functions GetArrStringWidth() and GetStringWidth() now include font parameters.
-	- Fonts support was improved.
-	- All core fonts were replaced and moved to fonts/ directory.
-	- The following functions were added: getMargins(), getFontSize(), getFontSizePt().
-	- File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated.
-	- Multicell and WriteHTMLCell fill function was fixed.
-	- Several minor bugs were fixed.
-	- barcodes.php was updated.
-	- All examples were updated.
-
-------------------------------------------------------------
-
-3.1.001 (2008-06-13)
-	- Bug [1992515] "K_PATH_FONTS default value wrong" was fixed.
-	- Vera font was removed, DejaVu font and Free fonts were updated.
-	- Image handling was improved.
-	- All examples were updated.
-
-3.1.000 (2008-06-11)
-	- setPDFVersion() was added to change the default PDF version (currently 1.7).
-	- setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29).
-	- SetDisplayMode() signature was changed (new options were added).
-	- LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30).
-	- PieSector() function was added to render render pie charts (see example 31).
-	- ImageEps() was added to display EPS and AI images with limited support (see example 32).
-	- writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added.
-	- The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions.
-	- HTML lists were improved and could be nested (you may now represent trees).
-	- AddFont() bug was fixed.
-	- _putfonts() bug was fixed.
-	- graphics functions were fixed.
-	- unicode_data.php file was updated (fixed).
-	- almohanad font was updated.
-	- example 18 was updated (Farsi and Arabic languages).
-	- source code cleanup.
-	- All examples were updated and new examples were added.
-
-3.0.015 (2008-06-06)
-	- AddPage() function signature is changed to include page format.
-	- example 28 was added to show page format changes.
-	- setPageUnit() function was added to change the page units of measure.
-	- setPageFormat() function was added to change the page format and orientation between pages.
-	- setPageOrientation() function was added to change the page orientation.
-	- Arabic font shaping was fixed for laa letter and square boxes (see the example 18).
-
-3.0.014 (2008-06-04)
-	- Arabic font shaping was fixed.
-	- setDefaultTableColumns() function was added.
-	- $cell_height_ratio variable was added.
-	- setCellHeightRatio() function was added to define the default height of cell repect font height.
-
-3.0.013 (2008-06-03)
-	- Multicell height parameter was fixed.
-	- Arabic font shaping was improved.
-	- unicode_data.php was updated.
-
-3.0.012 (2008-05-30)
-	- K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file.
-	- DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated).
-	- Arabic font shaping was improved.
-	- TranslateY() function was fixed (bug [1977962]).
-	- setVisibility() function was fixed.
-	- writeBarcode() function was fixed to scale using $xref parameter.
-	- All examples were updated.
-
-3.0.011 (2008-05-23)
-	- CMYK color support was added to all graphic functions.
-	- HTML table support was improved:
-	  -- now it's possible to include additional html tags inside a cell;
-	  -- colspan attribute was added.
-	- example 006 was updated.
-
-3.0.010 (2008-05-21)
-	- fixed $laa_array inclusion on utf8Bidi() function.
-
-3.0.009 (2008-05-20)
-	- unicode_data.php was updated.
-	- Arabic laa letter problem was fixed.
-
-3.0.008 (2008-05-12)
-	- Arabic support was fixed and improved (unicode_data.php was updated).
-	- Polycurve() function was added to draw a poly-Bezier curve.
-	- list items alignment was fixed.
-	- example 6 was updated.
-
-3.0.007 (2008-05-06)
-	- Arabic support was fixed and improved.
-	- AlMohanad (arabic) font was added.
-	- C128 barcode bugs were fixed.
-
-3.0.006 (2008-04-21)
-	- Condition to check negative width values was added.
-
-3.0.005 (2008-04-18)
-	- back-Slash character escape was fixed on writeHTML() function.
-	- Exampe 6 was updated.
-
-3.0.004 (2008-04-11)
-	- Bug [1939304] (Right to Left Issue) was fixed.
-
-3.0.003 (2008-04-07)
-	- Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed.
-	- "face" attribute of "font" tag is now fully supported.
-
-3.0.002 (2008-04-01)
-	- Write() functions now return the number of cells and not the number of lines.
-	- TCPDF is released under LGPL 2.1, or any later version.
-
-3.0.001 (2008-05-28)
-	- _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng().
-	- function writeBarcode() was fixed.
-	- all examples were updated.
-	- example 27 was added to show various barcodes.
-
-3.0.000 (2008-03-27)
-	- private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug.
-	- Image-related functions were rewritten.
-	- resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9).
-	- TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM.
-	- CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22).
-	- Page Groups were added (see example 23).
-	- setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24).
-	- All private variables and functions were changed to protected.
-	- setAlpha() function was added to give transparency support for all objects (see example 25).
-	- Clipping and stroke modes were added to Text() function (see example 26).
-	- All examples were moved to "examples" directory.
-	- function setJPEGQuality() was added to set the JPEG image comrpession (see example 9).
-
-2.9.000 (2008-03-26)
-	- htmlcolors.php file was added to include html colors.
-	- Support for HTML color names and three-digit hexadecimal color codes was added.
-	- private function convertColorHexToDec() was renamed convertHTMLColorToDec().
-	- color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported).
-	- Write() function were fixed.
-	- example_006.php was updated.
-	- private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14)
-
-2.8.000 (2008-03-20)
-	- Private variables were changed to protected.
-	- Function Write() was fixed and improved.
-	- Support for dl, dt, dd, del HTML tags was introduced.
-	- Line-trought mode was added for HTML and text.
-	- Text vertical alignment on cells were fixed.
-	- Examples were updated to reflect changes.
-
-2.7.002 (2008-03-13)
-	- Bug "[1912142] Encrypted PDF created/modified date" was fixed.
-
-2.7.001 (2008-03-10)
-	- Cell justification was fixed for non-unicode mode.
-
-2.7.000 (2008-03-09)
-	- Cell() stretching mode 4 (forced character spacing) was fixed.
-	- writeHTMLCell() now uses Multicell() to write.
-	- Multicell() has a new parameter $ishtml to act as writeHTMLCell().
-	- Write() speed was improved for non-arabic strings.
-	- Example n. 20 was changed.
-
-2.6.000 (2008-03-07)
-	- various alignments bugs were fixed.
-
-2.5.000 (2008-03-07)
-	- Several bugs were fixed.
-	- example_019.php was added to test non-unicode mode using old fonts.
-
-2.4.000 (2008-03-06)
-	- RTL support was deeply improved.
-	- GetStringWidth() was fixed to support RTL languages.
-	- Text() RTL alignment was fixed.
-	- Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi().
-	- example_018.php was added and test_unicode.php was removed.
-
-2.3.000 (2008-03-05)
-	- MultiCell() signature is changed. Now support multiple columns across pages (see example_017).
-	- Write() signature is changed. Now support the cell mode to be used with MultiCell.
-	- Header() and Footer() were changed.
-	- The following functions were added: UTF8ArrSubString() and unichr().
-	- Examples were updated to reflect last changes.
-
-2.2.004 (2008-03-04)
-	- Several examples were added.
-	- AddPage() Header() and Footer() were fixed.
-	- Documentation is now available on http://www.tcpdf.org
-
-2.2.003 (2008-03-03)
-	- [1894853] Performance of MultiCell() was improved.
-	- RadioButton and ListBox functions were added.
-	- javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf.
-
-2.2.002 (2008-02-28)
-	- [1900495] html images path was fixed.
-	- Legacy image functions were reintroduced to allow PNG and JPEG support without GD library.
-
-2.2.001 (2008-02-16)
-	- The bug "[1894700] bug with replace relative path" was fixed
-	- Justification was fixed
-
-2.2.000 (2008-02-12)
-	- fixed javascript bug introduced with latest release
-
-2.1.002 (2008-02-12)
-	- Justify function was fixed on PHP4 version.
-	- Bookmank function was added ([1578250] Table of contents).
-	- Javascript and Form fields support was added ([1796359] Form fields).
-
-2.1.001 (2008-02-10)
-	- The bug "[1885776] Race Condition in function justitfy" was fixed.
-	- The bug "[1890217] xpdf complains that pdf is incorrect" was fixed.
-
-2.1.000 (2008-01-07)
-	- FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file
-	- Bidirectional Algorithm to correctly reverse bidirectional languages was added.
-	- SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed.
-	- SetCellPadding function was added.
-	- writeHTML was updated with new parameters.
-	- Text function was fixed.
-	- MultiCell function was fixed, now works also across multiple pages.
-	- Line width was fixed on Header and Footer functions and 
tag. - - "GetImageSize" was renamed "getimagesize". - - Document version was changed from 1.3 to 1.5. - - _begindoc() function was fixed. - - ChangeDate was fixed and ModDate was added. - - The following functions were added: - setPage() : Move pointer to the specified document page. - getPage() : Get current document page number. - lastpage() : Reset pointer to the last document page. - getNumPages() : Get the total number of inserted pages. - GetNumChars() : count the number of (UTF-8) characters in a string. - - $stretch parameter was added to Cell() function to fit text on cell: - 0 = disabled - 1 = horizontal scaling only if necessary - 2 = forced horizontal scaling - 3 = character spacing only if necessary - 4 = forced character spacing - - Line function was fixed for RTL. - - Graphic transformation functions were added [1811158]: - StartTransform() - StopTransform() - ScaleX() - ScaleY() - ScaleXY() - Scale() - MirrorH() - MirrorV() - MirrorP() - MirrorL() - TranslateX() - TranslateY() - Translate() - Rotate() - SkewX() - SkewY() - Skew() - - Graphic function were added/updated [1688549]: - SetLineStyle() - _outPoint() - _outLine() - _outRect() - _outCurve() - Line() - Rect() - Curve - Ellipse - Circle - Polygon - RegularPolygon - -2.0.000 (2008-01-04) - - RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files. - - setRTL($enable) method was added to manually enable/disable the RTL text direction. - - The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left. - - RC4 40bit encryption was added. Check the SetProtection method. - - [1815213] Improved image support for GIF, JPEG, PNG formats. - - [1800094] Attribute "value" was added to ordered list items
  • . - - Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be: - T: top-right for LTR or top-left for RTL - M: middle-right for LTR or middle-left for RTL - B: bottom-right for LTR or bottom-left for RTL - N: next line - - Attribute "align" was added to html tag to set the above image "align" parameter. Possible values are: - top: top-right for LTR or top-left for RTL - middle: middle-right for LTR or middle-left for RTL - bottom: bottom-right for LTR or bottom-left for RTL - - [1798103] newline was added after , and

    tages. - - [1816393] Documentation was updated. - - 'ln' parameter was fixed on writeHTMLCell. Now it's possible to print two or more columns across several pages; - - The method lastPage() was added to move the pointer on the last page; - ------------------------------------------------------------- - -1.53.0.TC034 (2007-07-30) - - fixed htmlentities conversion. - - MultiCell() function returns the number of cells. - -1.53.0.TC033 (2007-07-30) - - fixed bug 1762550: case sensitive for font files - - NOTE: all fonts files names must be in lowercase! - -1.53.0.TC032 (2007-07-27) - - setLastH method was added to resolve bug 1689071. - - all fonts names were converted in lowercase (bug 1713005). - - bug 1740954 was fixed. - - justification was added as Cell option. - -1.53.0.TC031 (2007-03-20) - - ToUnicode CMap were added on _puttruetypeunicode function. Now you may search and copy unicode text. - -1.53.0.TC030 (2007-03-06) - - fixed bug on PHP4 version. - -1.53.0.TC029 (2007-03-06) - - DejaVu Fonts were added. - -1.53.0.TC028 (2007-03-03) - - MultiCell function signature were changed: the $ln parameter were added. Check documentation for further information. - - Greek language were added on example sentences. - - setPrintHeader() and setPrintFooter() functions were added to enable or disable page header and footer. - -1.53.0.TC027 (2006-12-14) - - $attr['face'] bug were fixed. - - K_TCPDF_EXTERNAL_CONFIG control where introduced on /config/tcpdf_config.php to use external configuration files. - -1.53.0.TC026 (2006-10-28) - - writeHTML function call were fixed on examples. - -1.53.0.TC025 (2006-10-27) - - Bugs item #1421290 were fixed (0D - 0A substitution in some characters) - - Bugs item #1573174 were fixed (MultiCell documentation) - -1.53.0.TC024 (2006-09-26) - - getPageHeight() function were fixed (bug 1543476). - - fixed missing breaks on closedHTMLTagHandler function (bug 1535263). - - fixed extra spaces on Write function (bug 1535262). - -1.53.0.TC023 (2006-08-04) - - paths to barcode directory were fixed. - - documentation were updated. - -1.53.0.TC022 (2006-07-16) - - fixed bug: [ 1516858 ] Probs with PHP autoloader and class_exists() - -1.53.0.TC021 (2006-07-01) - - HTML attributes with whitespaces are now supported (thanks to Nelson Benitez for his support) - -1.53.0.TC020 (2006-06-23) - - code cleanup - -1.53.0.TC019 (2006-05-21) - - fixed and closing tags - -1.53.0.TC018 (2006-05-18) - - fixed font names bug - -1.53.0.TC017 (2006-05-18) - - the TTF2UFM utility to convert True Type fonts for TCPDF were included on fonts folder. - - new free unicode fonts were included on /fonts/freefont. - - test_unicode.php example were exended. - - parameter $fill were added on Write, writeHTML and writeHTMLCell functions. - - documentation were updated. - -1.53.0.TC016 (2006-03-09) - - fixed closing tag on html parser. - -1.53.0.TC016 (2005-08-28) - - fpdf.php and tcpdf.php files were joined in one single class (you can still extend TCPDF with your own class). - - fixed problem when mb_internal_encoding is set. - -1.53.0.TC014 (2005-05-29) - - fixed WriteHTMLCell new page issue. - -1.53.0.TC013 (2005-05-29) - - fixed WriteHTMLCell across pages. - -1.53.0.TC012 (2005-05-29) - - font color attribute bug were fixed. - -1.53.0.TC011 (2005-03-31) - - SetFont function were fixed (thank Sjaak Lauwers for bug notice). - -1.53.0.TC010 (2005-03-22) - - the html functions were improved (thanks to Manfred Vervuert for bug reporting). - -1.53.0.TC009 (2005-03-19) - - a wrong reference to convertColorHexToDec were fixed. - -1.53.0.TC008 (2005-02-07) - - removed some extra bytes from PHP files. - -1.53.0.TC007 (2005-01-08) - - fill attribute were removed from writeHTMLCell method. - -1.53.0.TC006 (2005-01-08) - - the documentation were updated. - -1.53.0.TC005 (2005-01-05) - - Steven Wittens's unicode methods were removed. - - All unicode methods were rewritten from scratch. - - TCPDF is now licensed as LGPL. - -1.53.0.TC004 (2005-01-04) - - this changelog were added. - - removed commercial fonts for licensing issue. - - Bitstream Vera Fonts were added (http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html). - - Now the AddFont and SetFont functions returns the basic font if the styled version do not exist. - -EOF -------------------------------------------------------- diff --git a/include/limesurvey/admin/classes/tcpdf/LICENSE.TXT b/include/limesurvey/admin/classes/tcpdf/LICENSE.TXT deleted file mode 100644 index daf21f7d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/LICENSE.TXT +++ /dev/null @@ -1,858 +0,0 @@ -********************************************************************** -* TCPDF LICENSE -********************************************************************** - - TCPDF is free software: you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - -********************************************************************** -********************************************************************** - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. - -********************************************************************** -********************************************************************** - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - -********************************************************************** -********************************************************************** diff --git a/include/limesurvey/admin/classes/tcpdf/README.TXT b/include/limesurvey/admin/classes/tcpdf/README.TXT deleted file mode 100644 index 5ecb56c0..00000000 --- a/include/limesurvey/admin/classes/tcpdf/README.TXT +++ /dev/null @@ -1,86 +0,0 @@ -TCPDF - README -============================================================ - -I WISH TO IMPROVE AND EXPAND TCPDF BUT I NEED YOUR SUPPORT. -PLEASE MAKE A DONATION: -http://sourceforge.net/donate/index.php?group_id=128076 - ------------------------------------------------------------- - -Name: TCPDF -Version: 5.9.011 -Release date: 2010-11-02 -Author: Nicola Asuni - -Copyright (c) 2002-2010: - Nicola Asuni - Tecnick.com s.r.l. - Via Della Pace, 11 - 09044 Quartucciu (CA) - ITALY - www.tecnick.com - -URLs: - http: www.tcpdf.org - http: www.sourceforge.net/projects/tcpdf - -Description: - TCPDF is a PHP class for generating PDF files on-the-fly without requiring external extensions. - -Main Features: - * no external libraries are required for the basic functions; - * all standard page formats, custom page formats, custom margins and units of measure; - * UTF-8 Unicode and Right-To-Left languages; - * TrueTypeUnicode, OpenTypeUnicode, TrueType, OpenType, Type1 and CID-0 fonts; - * font subsetting; - * methods to publish some XHTML + CSS code, Javascript and Forms; - * images, graphic (geometric figures) and transformation methods; - * supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http: www.imagemagick.org/www/formats.html) - * 1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, QR-Code, PDF417; - * Grayscale, RGB, CMYK, Spot Colors and Transparencies; - * automatic page header and footer management; - * document encryption up to 256 bit and digital signature certifications; - * transactions to UNDO commands; - * PDF annotations, including links, text and file attachments; - * text rendering modes (fill, stroke and clipping); - * multiple columns mode; - * no-write page regions; - * bookmarks and table of content; - * text hyphenation; - * text stretching and spacing (tracking/kerning); - * automatic page break, line break and text alignments including justification; - * automatic page numbering and page groups; - * move and delete pages; - * page compression (requires php-zlib extension); - * XOBject Templates; - -Installation (full instructions on http: www.tcpdf.org): - 1. copy the folder on your Web server - 2. set your installation path and other parameters on the config/tcpdf_config.php - 3. call the examples/example_001.php page with your browser to see an example - -Source Code Documentation: - doc/index.html - -For Additional Documentation: - http: www.tcpdf.org - -License - Copyright (C) 2002-2010 Nicola Asuni - Tecnick.com S.r.l. - - TCPDF is free software: you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - TCPDF 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with TCPDF. If not, see . - - See LICENSE.TXT file for more information. - -============================================================ diff --git a/include/limesurvey/admin/classes/tcpdf/barcodes.php b/include/limesurvey/admin/classes/tcpdf/barcodes.php deleted file mode 100644 index 4efb7a47..00000000 --- a/include/limesurvey/admin/classes/tcpdf/barcodes.php +++ /dev/null @@ -1,1969 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -// ------------------------------------------------------------------- -// -// Description : PHP class to creates array representations for -// common 1D barcodes to be used with TCPDF. -// -//============================================================+ - -/** - * PHP class to creates array representations for common 1D barcodes to be used with TCPDF. - * @package com.tecnick.tcpdf - * @abstract Functions for generating string representation of common 1D barcodes. - * @author Nicola Asuni - * @copyright 2008-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @version 1.0.011 - */ - - /** - * PHP class to creates array representations for common 1D barcodes to be used with TCPDF (http://www.tcpdf.org).
    - * @name TCPDFBarcode - * @package com.tecnick.tcpdf - * @version 1.0.011 - * @author Nicola Asuni - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - */ -class TCPDFBarcode { - - /** - * @var array representation of barcode. - * @access protected - */ - protected $barcode_array; - - /** - * This is the class constructor. - * Return an array representations for common 1D barcodes:
      - *
    • $arrcode['code'] code to be printed on text label
    • - *
    • $arrcode['maxh'] max bar height
    • - *
    • $arrcode['maxw'] max bar width
    • - *
    • $arrcode['bcode'][$k] single bar or space in $k position
    • - *
    • $arrcode['bcode'][$k]['t'] bar type: true = bar, false = space.
    • - *
    • $arrcode['bcode'][$k]['w'] bar width in units.
    • - *
    • $arrcode['bcode'][$k]['h'] bar height in units.
    • - *
    • $arrcode['bcode'][$k]['p'] bar top position (0 = top, 1 = middle)
    - * @param string $code code to print - * @param string $type type of barcode:
    • C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
    • C39+ : CODE 39 with checksum
    • C39E : CODE 39 EXTENDED
    • C39E+ : CODE 39 EXTENDED + CHECKSUM
    • C93 : CODE 93 - USS-93
    • S25 : Standard 2 of 5
    • S25+ : Standard 2 of 5 + CHECKSUM
    • I25 : Interleaved 2 of 5
    • I25+ : Interleaved 2 of 5 + CHECKSUM
    • C128A : CODE 128 A
    • C128B : CODE 128 B
    • C128C : CODE 128 C
    • EAN2 : 2-Digits UPC-Based Extention
    • EAN5 : 5-Digits UPC-Based Extention
    • EAN8 : EAN 8
    • EAN13 : EAN 13
    • UPCA : UPC-A
    • UPCE : UPC-E
    • MSI : MSI (Variation of Plessey code)
    • MSI+ : MSI + CHECKSUM (modulo 11)
    • POSTNET : POSTNET
    • PLANET : PLANET
    • RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
    • KIX : KIX (Klant index - Customer index)
    • IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200
    • CODABAR : CODABAR
    • CODE11 : CODE 11
    • PHARMA : PHARMACODE
    • PHARMA2T : PHARMACODE TWO-TRACKS
    - */ - public function __construct($code, $type) { - $this->setBarcode($code, $type); - } - - /** - * Return an array representations of barcode. - * @return array - */ - public function getBarcodeArray() { - return $this->barcode_array; - } - - /** - * Set the barcode. - * @param string $code code to print - * @param string $type type of barcode:
    • C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
    • C39+ : CODE 39 with checksum
    • C39E : CODE 39 EXTENDED
    • C39E+ : CODE 39 EXTENDED + CHECKSUM
    • C93 : CODE 93 - USS-93
    • S25 : Standard 2 of 5
    • S25+ : Standard 2 of 5 + CHECKSUM
    • I25 : Interleaved 2 of 5
    • I25+ : Interleaved 2 of 5 + CHECKSUM
    • C128A : CODE 128 A
    • C128B : CODE 128 B
    • C128C : CODE 128 C
    • EAN2 : 2-Digits UPC-Based Extention
    • EAN5 : 5-Digits UPC-Based Extention
    • EAN8 : EAN 8
    • EAN13 : EAN 13
    • UPCA : UPC-A
    • UPCE : UPC-E
    • MSI : MSI (Variation of Plessey code)
    • MSI+ : MSI + CHECKSUM (modulo 11)
    • POSTNET : POSTNET
    • PLANET : PLANET
    • RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
    • KIX : KIX (Klant index - Customer index)
    • IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200
    • CODABAR : CODABAR
    • CODE11 : CODE 11
    • PHARMA : PHARMACODE
    • PHARMA2T : PHARMACODE TWO-TRACKS
    - * @return array - */ - public function setBarcode($code, $type) { - switch (strtoupper($type)) { - case 'C39': { // CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. - $arrcode = $this->barcode_code39($code, false, false); - break; - } - case 'C39+': { // CODE 39 with checksum - $arrcode = $this->barcode_code39($code, false, true); - break; - } - case 'C39E': { // CODE 39 EXTENDED - $arrcode = $this->barcode_code39($code, true, false); - break; - } - case 'C39E+': { // CODE 39 EXTENDED + CHECKSUM - $arrcode = $this->barcode_code39($code, true, true); - break; - } - case 'C93': { // CODE 93 - USS-93 - $arrcode = $this->barcode_code93($code); - break; - } - case 'S25': { // Standard 2 of 5 - $arrcode = $this->barcode_s25($code, false); - break; - } - case 'S25+': { // Standard 2 of 5 + CHECKSUM - $arrcode = $this->barcode_s25($code, true); - break; - } - case 'I25': { // Interleaved 2 of 5 - $arrcode = $this->barcode_i25($code, false); - break; - } - case 'I25+': { // Interleaved 2 of 5 + CHECKSUM - $arrcode = $this->barcode_i25($code, true); - break; - } - case 'C128A': { // CODE 128 A - $arrcode = $this->barcode_c128($code, 'A'); - break; - } - case 'C128B': { // CODE 128 B - $arrcode = $this->barcode_c128($code, 'B'); - break; - } - case 'C128C': { // CODE 128 C - $arrcode = $this->barcode_c128($code, 'C'); - break; - } - case 'EAN2': { // 2-Digits UPC-Based Extention - $arrcode = $this->barcode_eanext($code, 2); - break; - } - case 'EAN5': { // 5-Digits UPC-Based Extention - $arrcode = $this->barcode_eanext($code, 5); - break; - } - case 'EAN8': { // EAN 8 - $arrcode = $this->barcode_eanupc($code, 8); - break; - } - case 'EAN13': { // EAN 13 - $arrcode = $this->barcode_eanupc($code, 13); - break; - } - case 'UPCA': { // UPC-A - $arrcode = $this->barcode_eanupc($code, 12); - break; - } - case 'UPCE': { // UPC-E - $arrcode = $this->barcode_eanupc($code, 6); - break; - } - case 'MSI': { // MSI (Variation of Plessey code) - $arrcode = $this->barcode_msi($code, false); - break; - } - case 'MSI+': { // MSI + CHECKSUM (modulo 11) - $arrcode = $this->barcode_msi($code, true); - break; - } - case 'POSTNET': { // POSTNET - $arrcode = $this->barcode_postnet($code, false); - break; - } - case 'PLANET': { // PLANET - $arrcode = $this->barcode_postnet($code, true); - break; - } - case 'RMS4CC': { // RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) - $arrcode = $this->barcode_rms4cc($code, false); - break; - } - case 'KIX': { // KIX (Klant index - Customer index) - $arrcode = $this->barcode_rms4cc($code, true); - break; - } - case 'IMB': { // IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 - $arrcode = $this->barcode_imb($code); - break; - } - case 'CODABAR': { // CODABAR - $arrcode = $this->barcode_codabar($code); - break; - } - case 'CODE11': { // CODE 11 - $arrcode = $this->barcode_code11($code); - break; - } - case 'PHARMA': { // PHARMACODE - $arrcode = $this->barcode_pharmacode($code); - break; - } - case 'PHARMA2T': { // PHARMACODE TWO-TRACKS - $arrcode = $this->barcode_pharmacode2t($code); - break; - } - default: { - $this->barcode_array = false; - $arrcode = false; - break; - } - } - $this->barcode_array = $arrcode; - } - - /** - * CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. - * General-purpose code in very wide use world-wide - * @param string $code code to represent. - * @param boolean $checksum if true add a checksum to the code - * @return array barcode representation. - * @access protected - */ - protected function barcode_code39($code, $extended=false, $checksum=false) { - $chr['0'] = '111221211'; - $chr['1'] = '211211112'; - $chr['2'] = '112211112'; - $chr['3'] = '212211111'; - $chr['4'] = '111221112'; - $chr['5'] = '211221111'; - $chr['6'] = '112221111'; - $chr['7'] = '111211212'; - $chr['8'] = '211211211'; - $chr['9'] = '112211211'; - $chr['A'] = '211112112'; - $chr['B'] = '112112112'; - $chr['C'] = '212112111'; - $chr['D'] = '111122112'; - $chr['E'] = '211122111'; - $chr['F'] = '112122111'; - $chr['G'] = '111112212'; - $chr['H'] = '211112211'; - $chr['I'] = '112112211'; - $chr['J'] = '111122211'; - $chr['K'] = '211111122'; - $chr['L'] = '112111122'; - $chr['M'] = '212111121'; - $chr['N'] = '111121122'; - $chr['O'] = '211121121'; - $chr['P'] = '112121121'; - $chr['Q'] = '111111222'; - $chr['R'] = '211111221'; - $chr['S'] = '112111221'; - $chr['T'] = '111121221'; - $chr['U'] = '221111112'; - $chr['V'] = '122111112'; - $chr['W'] = '222111111'; - $chr['X'] = '121121112'; - $chr['Y'] = '221121111'; - $chr['Z'] = '122121111'; - $chr['-'] = '121111212'; - $chr['.'] = '221111211'; - $chr[' '] = '122111211'; - $chr['$'] = '121212111'; - $chr['/'] = '121211121'; - $chr['+'] = '121112121'; - $chr['%'] = '111212121'; - $chr['*'] = '121121211'; - - $code = strtoupper($code); - if ($extended) { - // extended mode - $code = $this->encode_code39_ext($code); - } - if ($code === false) { - return false; - } - if ($checksum) { - // checksum - $code .= $this->checksum_code39($code); - } - // add start and stop codes - $code = '*'.$code.'*'; - - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - $k = 0; - $clen = strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $char = $code{$i}; - if(!isset($chr[$char])) { - // invalid character - return false; - } - for ($j = 0; $j < 9; ++$j) { - if (($j % 2) == 0) { - $t = true; // bar - } else { - $t = false; // space - } - $w = $chr[$char]{$j}; - $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); - $bararray['maxw'] += $w; - ++$k; - } - $bararray['bcode'][$k] = array('t' => false, 'w' => 1, 'h' => 1, 'p' => 0); - $bararray['maxw'] += 1; - ++$k; - } - return $bararray; - } - - /** - * Encode a string to be used for CODE 39 Extended mode. - * @param string $code code to represent. - * @return encoded string. - * @access protected - */ - protected function encode_code39_ext($code) { - $encode = array( - chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C', - chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G', - chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => '£K', - chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O', - chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S', - chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W', - chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A', - chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E', - chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C', - chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G', - chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K', - chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O', - chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', - chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', - chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F', - chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J', - chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', - chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', - chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', - chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', - chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', - chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', - chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K', - chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O', - chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C', - chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G', - chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) => '+K', - chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O', - chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S', - chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W', - chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P', - chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T'); - $code_ext = ''; - $clen = strlen($code); - for ($i = 0 ; $i < $clen; ++$i) { - if (ord($code{$i}) > 127) { - return false; - } - $code_ext .= $encode[$code{$i}]; - } - return $code_ext; - } - - /** - * Calculate CODE 39 checksum (modulo 43). - * @param string $code code to represent. - * @return char checksum. - * @access protected - */ - protected function checksum_code39($code) { - $chars = array( - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - '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', '-', '.', ' ', '$', '/', '+', '%'); - $sum = 0; - $clen = strlen($code); - for ($i = 0 ; $i < $clen; ++$i) { - $k = array_keys($chars, $code{$i}); - $sum += $k[0]; - } - $j = ($sum % 43); - return $chars[$j]; - } - - /** - * CODE 93 - USS-93 - * Compact code similar to Code 39 - * @param string $code code to represent. - * @param boolean $checksum if true add a checksum to the code - * @return array barcode representation. - * @access protected - */ - protected function barcode_code93($code) { - $chr['0'] = '131112'; - $chr['1'] = '111213'; - $chr['2'] = '111312'; - $chr['3'] = '111411'; - $chr['4'] = '121113'; - $chr['5'] = '121212'; - $chr['6'] = '121311'; - $chr['7'] = '111114'; - $chr['8'] = '131211'; - $chr['9'] = '141111'; - $chr['A'] = '211113'; - $chr['B'] = '211212'; - $chr['C'] = '211311'; - $chr['D'] = '221112'; - $chr['E'] = '221211'; - $chr['F'] = '231111'; - $chr['G'] = '112113'; - $chr['H'] = '112212'; - $chr['I'] = '112311'; - $chr['J'] = '122112'; - $chr['K'] = '132111'; - $chr['L'] = '111123'; - $chr['M'] = '111222'; - $chr['N'] = '111321'; - $chr['O'] = '121122'; - $chr['P'] = '131121'; - $chr['Q'] = '212112'; - $chr['R'] = '212211'; - $chr['S'] = '211122'; - $chr['T'] = '211221'; - $chr['U'] = '221121'; - $chr['V'] = '222111'; - $chr['W'] = '112122'; - $chr['X'] = '112221'; - $chr['Y'] = '122121'; - $chr['Z'] = '123111'; - $chr['-'] = '121131'; - $chr['.'] = '311112'; - $chr[' '] = '311211'; - $chr['$'] = '321111'; - $chr['/'] = '112131'; - $chr['+'] = '113121'; - $chr['%'] = '211131'; - $chr[128] = '121221'; // ($) - $chr[129] = '311121'; // (/) - $chr[130] = '122211'; // (+) - $chr[131] = '312111'; // (%) - $chr['*'] = '111141'; - $code = strtoupper($code); - $encode = array( - chr(0) => chr(131).'U', chr(1) => chr(128).'A', chr(2) => chr(128).'B', chr(3) => chr(128).'C', - chr(4) => chr(128).'D', chr(5) => chr(128).'E', chr(6) => chr(128).'F', chr(7) => chr(128).'G', - chr(8) => chr(128).'H', chr(9) => chr(128).'I', chr(10) => chr(128).'J', chr(11) => '£K', - chr(12) => chr(128).'L', chr(13) => chr(128).'M', chr(14) => chr(128).'N', chr(15) => chr(128).'O', - chr(16) => chr(128).'P', chr(17) => chr(128).'Q', chr(18) => chr(128).'R', chr(19) => chr(128).'S', - chr(20) => chr(128).'T', chr(21) => chr(128).'U', chr(22) => chr(128).'V', chr(23) => chr(128).'W', - chr(24) => chr(128).'X', chr(25) => chr(128).'Y', chr(26) => chr(128).'Z', chr(27) => chr(131).'A', - chr(28) => chr(131).'B', chr(29) => chr(131).'C', chr(30) => chr(131).'D', chr(31) => chr(131).'E', - chr(32) => ' ', chr(33) => chr(129).'A', chr(34) => chr(129).'B', chr(35) => chr(129).'C', - chr(36) => chr(129).'D', chr(37) => chr(129).'E', chr(38) => chr(129).'F', chr(39) => chr(129).'G', - chr(40) => chr(129).'H', chr(41) => chr(129).'I', chr(42) => chr(129).'J', chr(43) => chr(129).'K', - chr(44) => chr(129).'L', chr(45) => '-', chr(46) => '.', chr(47) => chr(129).'O', - chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', - chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', - chr(56) => '8', chr(57) => '9', chr(58) => chr(129).'Z', chr(59) => chr(131).'F', - chr(60) => chr(131).'G', chr(61) => chr(131).'H', chr(62) => chr(131).'I', chr(63) => chr(131).'J', - chr(64) => chr(131).'V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', - chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', - chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', - chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', - chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', - chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', - chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => chr(131).'K', - chr(92) => chr(131).'L', chr(93) => chr(131).'M', chr(94) => chr(131).'N', chr(95) => chr(131).'O', - chr(96) => chr(131).'W', chr(97) => chr(130).'A', chr(98) => chr(130).'B', chr(99) => chr(130).'C', - chr(100) => chr(130).'D', chr(101) => chr(130).'E', chr(102) => chr(130).'F', chr(103) => chr(130).'G', - chr(104) => chr(130).'H', chr(105) => chr(130).'I', chr(106) => chr(130).'J', chr(107) => chr(130).'K', - chr(108) => chr(130).'L', chr(109) => chr(130).'M', chr(110) => chr(130).'N', chr(111) => chr(130).'O', - chr(112) => chr(130).'P', chr(113) => chr(130).'Q', chr(114) => chr(130).'R', chr(115) => chr(130).'S', - chr(116) => chr(130).'T', chr(117) => chr(130).'U', chr(118) => chr(130).'V', chr(119) => chr(130).'W', - chr(120) => chr(130).'X', chr(121) => chr(130).'Y', chr(122) => chr(130).'Z', chr(123) => chr(131).'P', - chr(124) => chr(131).'Q', chr(125) => chr(131).'R', chr(126) => chr(131).'S', chr(127) => chr(131).'T'); - $code_ext = ''; - $clen = strlen($code); - for ($i = 0 ; $i < $clen; ++$i) { - if (ord($code{$i}) > 127) { - return false; - } - $code_ext .= $encode[$code{$i}]; - } - // checksum - $code .= $this->checksum_code93($code); - // add start and stop codes - $code = '*'.$code.'*'; - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - $k = 0; - $clen = strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $char = $code{$i}; - if(!isset($chr[$char])) { - // invalid character - return false; - } - for ($j = 0; $j < 6; ++$j) { - if (($j % 2) == 0) { - $t = true; // bar - } else { - $t = false; // space - } - $w = $chr[$char]{$j}; - $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); - $bararray['maxw'] += $w; - ++$k; - } - } - $bararray['bcode'][$k] = array('t' => true, 'w' => 1, 'h' => 1, 'p' => 0); - $bararray['maxw'] += 1; - ++$k; - return $bararray; - } - - /** - * Calculate CODE 93 checksum (modulo 47). - * @param string $code code to represent. - * @return string checksum code. - * @access protected - */ - protected function checksum_code93($code) { - $chars = array( - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - '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', '-', '.', ' ', '$', '/', '+', '%'); - // translate special characters - $code = strtr($code, chr(128).chr(129).chr(130).chr(131), '$/+%'); - $len = strlen($code); - // calculate check digit C - $p = 1; - $check = 0; - for ($i = ($len - 1); $i >= 0; --$i) { - $k = array_keys($chars, $code{$i}); - $check += ($k[0] * $p); - ++$p; - if ($p > 20) { - $p = 1; - } - } - $check %= 47; - $c = $chars[$check]; - $code .= $c; - // calculate check digit K - $p = 1; - $check = 0; - for ($i = $len; $i >= 0; --$i) { - $k = array_keys($chars, $code{$i}); - $check += ($k[0] * $p); - ++$p; - if ($p > 15) { - $p = 1; - } - } - $check %= 47; - $k = $chars[$check]; - return $c.$k; - } - - /** - * Checksum for standard 2 of 5 barcodes. - * @param string $code code to process. - * @return int checksum. - * @access protected - */ - protected function checksum_s25($code) { - $len = strlen($code); - $sum = 0; - for ($i = 0; $i < $len; $i+=2) { - $sum += $code{$i}; - } - $sum *= 3; - for ($i = 1; $i < $len; $i+=2) { - $sum += ($code{$i}); - } - $r = $sum % 10; - if($r > 0) { - $r = (10 - $r); - } - return $r; - } - - /** - * MSI. - * Variation of Plessey code, with similar applications - * Contains digits (0 to 9) and encodes the data only in the width of bars. - * @param string $code code to represent. - * @param boolean $checksum if true add a checksum to the code (modulo 11) - * @return array barcode representation. - * @access protected - */ - protected function barcode_msi($code, $checksum=false) { - $chr['0'] = '100100100100'; - $chr['1'] = '100100100110'; - $chr['2'] = '100100110100'; - $chr['3'] = '100100110110'; - $chr['4'] = '100110100100'; - $chr['5'] = '100110100110'; - $chr['6'] = '100110110100'; - $chr['7'] = '100110110110'; - $chr['8'] = '110100100100'; - $chr['9'] = '110100100110'; - $chr['A'] = '110100110100'; - $chr['B'] = '110100110110'; - $chr['C'] = '110110100100'; - $chr['D'] = '110110100110'; - $chr['E'] = '110110110100'; - $chr['F'] = '110110110110'; - if ($checksum) { - // add checksum - $clen = strlen($code); - $p = 2; - $check = 0; - for ($i = ($clen - 1); $i >= 0; --$i) { - $check += (hexdec($code{$i}) * $p); - ++$p; - if ($p > 7) { - $p = 2; - } - } - $check %= 11; - if ($check > 0) { - $check = 11 - $check; - } - $code .= $check; - } - $seq = '110'; // left guard - $clen = strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $digit = $code{$i}; - if (!isset($chr[$digit])) { - // invalid character - return false; - } - $seq .= $chr[$digit]; - } - $seq .= '1001'; // right guard - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - return $this->binseq_to_array($seq, $bararray); - } - - /** - * Standard 2 of 5 barcodes. - * Used in airline ticket marking, photofinishing - * Contains digits (0 to 9) and encodes the data only in the width of bars. - * @param string $code code to represent. - * @param boolean $checksum if true add a checksum to the code - * @return array barcode representation. - * @access protected - */ - protected function barcode_s25($code, $checksum=false) { - $chr['0'] = '10101110111010'; - $chr['1'] = '11101010101110'; - $chr['2'] = '10111010101110'; - $chr['3'] = '11101110101010'; - $chr['4'] = '10101110101110'; - $chr['5'] = '11101011101010'; - $chr['6'] = '10111011101010'; - $chr['7'] = '10101011101110'; - $chr['8'] = '10101110111010'; - $chr['9'] = '10111010111010'; - if ($checksum) { - // add checksum - $code .= $this->checksum_s25($code); - } - if((strlen($code) % 2) != 0) { - // add leading zero if code-length is odd - $code = '0'.$code; - } - $seq = '11011010'; - $clen = strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $digit = $code{$i}; - if (!isset($chr[$digit])) { - // invalid character - return false; - } - $seq .= $chr[$digit]; - } - $seq .= '1101011'; - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - return $this->binseq_to_array($seq, $bararray); - } - - /** - * Convert binary barcode sequence to TCPDF barcode array - * @param string $seq barcode as binary sequence - * òparam array $bararray TCPDF barcode array to fill up - * @return array barcode representation. - * @access protected - */ - protected function binseq_to_array($seq, $bararray) { - $len = strlen($seq); - $w = 0; - $k = 0; - for ($i = 0; $i < $len; ++$i) { - $w += 1; - if (($i == ($len - 1)) OR (($i < ($len - 1)) AND ($seq{$i} != $seq{($i+1)}))) { - if ($seq{$i} == '1') { - $t = true; // bar - } else { - $t = false; // space - } - $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); - $bararray['maxw'] += $w; - ++$k; - $w = 0; - } - } - return $bararray; - } - - /** - * Interleaved 2 of 5 barcodes. - * Compact numeric code, widely used in industry, air cargo - * Contains digits (0 to 9) and encodes the data in the width of both bars and spaces. - * @param string $code code to represent. - * @param boolean $checksum if true add a checksum to the code - * @return array barcode representation. - * @access protected - */ - protected function barcode_i25($code, $checksum=false) { - $chr['0'] = '11221'; - $chr['1'] = '21112'; - $chr['2'] = '12112'; - $chr['3'] = '22111'; - $chr['4'] = '11212'; - $chr['5'] = '21211'; - $chr['6'] = '12211'; - $chr['7'] = '11122'; - $chr['8'] = '21121'; - $chr['9'] = '12121'; - $chr['A'] = '11'; - $chr['Z'] = '21'; - if ($checksum) { - // add checksum - $code .= $this->checksum_s25($code); - } - if((strlen($code) % 2) != 0) { - // add leading zero if code-length is odd - $code = '0'.$code; - } - // add start and stop codes - $code = 'AA'.strtolower($code).'ZA'; - - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - $k = 0; - $clen = strlen($code); - for ($i = 0; $i < $clen; $i = ($i + 2)) { - $char_bar = $code{$i}; - $char_space = $code{$i+1}; - if((!isset($chr[$char_bar])) OR (!isset($chr[$char_space]))) { - // invalid character - return false; - } - // create a bar-space sequence - $seq = ''; - $chrlen = strlen($chr[$char_bar]); - for ($s = 0; $s < $chrlen; $s++){ - $seq .= $chr[$char_bar]{$s} . $chr[$char_space]{$s}; - } - $seqlen = strlen($seq); - for ($j = 0; $j < $seqlen; ++$j) { - if (($j % 2) == 0) { - $t = true; // bar - } else { - $t = false; // space - } - $w = $seq{$j}; - $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); - $bararray['maxw'] += $w; - ++$k; - } - } - return $bararray; - } - - /** - * C128 barcodes. - * Very capable code, excellent density, high reliability; in very wide use world-wide - * @param string $code code to represent. - * @param string $type barcode type: A, B or C - * @return array barcode representation. - * @access protected - */ - protected function barcode_c128($code, $type='B') { - $chr = array( - '212222', /* 00 */ - '222122', /* 01 */ - '222221', /* 02 */ - '121223', /* 03 */ - '121322', /* 04 */ - '131222', /* 05 */ - '122213', /* 06 */ - '122312', /* 07 */ - '132212', /* 08 */ - '221213', /* 09 */ - '221312', /* 10 */ - '231212', /* 11 */ - '112232', /* 12 */ - '122132', /* 13 */ - '122231', /* 14 */ - '113222', /* 15 */ - '123122', /* 16 */ - '123221', /* 17 */ - '223211', /* 18 */ - '221132', /* 19 */ - '221231', /* 20 */ - '213212', /* 21 */ - '223112', /* 22 */ - '312131', /* 23 */ - '311222', /* 24 */ - '321122', /* 25 */ - '321221', /* 26 */ - '312212', /* 27 */ - '322112', /* 28 */ - '322211', /* 29 */ - '212123', /* 30 */ - '212321', /* 31 */ - '232121', /* 32 */ - '111323', /* 33 */ - '131123', /* 34 */ - '131321', /* 35 */ - '112313', /* 36 */ - '132113', /* 37 */ - '132311', /* 38 */ - '211313', /* 39 */ - '231113', /* 40 */ - '231311', /* 41 */ - '112133', /* 42 */ - '112331', /* 43 */ - '132131', /* 44 */ - '113123', /* 45 */ - '113321', /* 46 */ - '133121', /* 47 */ - '313121', /* 48 */ - '211331', /* 49 */ - '231131', /* 50 */ - '213113', /* 51 */ - '213311', /* 52 */ - '213131', /* 53 */ - '311123', /* 54 */ - '311321', /* 55 */ - '331121', /* 56 */ - '312113', /* 57 */ - '312311', /* 58 */ - '332111', /* 59 */ - '314111', /* 60 */ - '221411', /* 61 */ - '431111', /* 62 */ - '111224', /* 63 */ - '111422', /* 64 */ - '121124', /* 65 */ - '121421', /* 66 */ - '141122', /* 67 */ - '141221', /* 68 */ - '112214', /* 69 */ - '112412', /* 70 */ - '122114', /* 71 */ - '122411', /* 72 */ - '142112', /* 73 */ - '142211', /* 74 */ - '241211', /* 75 */ - '221114', /* 76 */ - '413111', /* 77 */ - '241112', /* 78 */ - '134111', /* 79 */ - '111242', /* 80 */ - '121142', /* 81 */ - '121241', /* 82 */ - '114212', /* 83 */ - '124112', /* 84 */ - '124211', /* 85 */ - '411212', /* 86 */ - '421112', /* 87 */ - '421211', /* 88 */ - '212141', /* 89 */ - '214121', /* 90 */ - '412121', /* 91 */ - '111143', /* 92 */ - '111341', /* 93 */ - '131141', /* 94 */ - '114113', /* 95 */ - '114311', /* 96 */ - '411113', /* 97 */ - '411311', /* 98 */ - '113141', /* 99 */ - '114131', /* 100 */ - '311141', /* 101 */ - '411131', /* 102 */ - '211412', /* 103 START A */ - '211214', /* 104 START B */ - '211232', /* 105 START C */ - '233111', /* STOP */ - '200000' /* END */ - ); - $keys = ''; - switch(strtoupper($type)) { - case 'A': { - $startid = 103; - $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'; - for ($i = 0; $i < 32; ++$i) { - $keys .= chr($i); - } - break; - } - case 'B': { - $startid = 104; - $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.chr(127); - break; - } - case 'C': { - $startid = 105; - $keys = ''; - if ((strlen($code) % 2) != 0) { - // The length of barcode value must be even ($code). You must pad the number with zeros - return false; - } - for ($i = 0; $i <= 99; ++$i) { - $keys .= chr($i); - } - $new_code = ''; - $hclen = (strlen($code) / 2); - for ($i = 0; $i < $hclen; ++$i) { - $new_code .= chr(intval($code{(2 * $i)}.$code{(2 * $i + 1)})); - } - $code = $new_code; - break; - } - default: { - return false; - } - } - // calculate check character - $sum = $startid; - $clen = strlen($code); - for ($i = 0; $i < $clen; ++$i) { - $sum += (strpos($keys, $code{$i}) * ($i+1)); - } - $check = ($sum % 103); - // add start, check and stop codes - $code = chr($startid).$code.chr($check).chr(106).chr(107); - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - $k = 0; - $len = strlen($code); - for ($i = 0; $i < $len; ++$i) { - $ck = strpos($keys, $code{$i}); - if (($i == 0) OR ($i > ($len-4))) { - $char_num = ord($code{$i}); - $seq = $chr[$char_num]; - } elseif(($ck >= 0) AND isset($chr[$ck])) { - $seq = $chr[$ck]; - } else { - // invalid character - return false; - } - for ($j = 0; $j < 6; ++$j) { - if (($j % 2) == 0) { - $t = true; // bar - } else { - $t = false; // space - } - $w = $seq{$j}; - $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); - $bararray['maxw'] += $w; - ++$k; - } - } - return $bararray; - } - - /** - * EAN13 and UPC-A barcodes. - * EAN13: European Article Numbering international retail product code - * UPC-A: Universal product code seen on almost all retail products in the USA and Canada - * UPC-E: Short version of UPC symbol - * @param string $code code to represent. - * @param string $len barcode type: 6 = UPC-E, 8 = EAN8, 13 = EAN13, 12 = UPC-A - * @return array barcode representation. - * @access protected - */ - protected function barcode_eanupc($code, $len=13) { - $upce = false; - if ($len == 6) { - $len = 12; // UPC-A - $upce = true; // UPC-E mode - } - $data_len = $len - 1; - //Padding - $code = str_pad($code, $data_len, '0', STR_PAD_LEFT); - $code_len = strlen($code); - // calculate check digit - $sum_a = 0; - for ($i = 1; $i < $data_len; $i+=2) { - $sum_a += $code{$i}; - } - if ($len > 12) { - $sum_a *= 3; - } - $sum_b = 0; - for ($i = 0; $i < $data_len; $i+=2) { - $sum_b += ($code{$i}); - } - if ($len < 13) { - $sum_b *= 3; - } - $r = ($sum_a + $sum_b) % 10; - if($r > 0) { - $r = (10 - $r); - } - if ($code_len == $data_len) { - // add check digit - $code .= $r; - } elseif ($r !== intval($code{$data_len})) { - // wrong checkdigit - return false; - } - if ($len == 12) { - // UPC-A - $code = '0'.$code; - ++$len; - } - if ($upce) { - // convert UPC-A to UPC-E - $tmp = substr($code, 4, 3); - if (($tmp == '000') OR ($tmp == '100') OR ($tmp == '200')) { - // manufacturer code ends in 000, 100, or 200 - $upce_code = substr($code, 2, 2).substr($code, 9, 3).substr($code, 4, 1); - } else { - $tmp = substr($code, 5, 2); - if ($tmp == '00') { - // manufacturer code ends in 00 - $upce_code = substr($code, 2, 3).substr($code, 10, 2).'3'; - } else { - $tmp = substr($code, 6, 1); - if ($tmp == '0') { - // manufacturer code ends in 0 - $upce_code = substr($code, 2, 4).substr($code, 11, 1).'4'; - } else { - // manufacturer code does not end in zero - $upce_code = substr($code, 2, 5).substr($code, 11, 1); - } - } - } - } - //Convert digits to bars - $codes = array( - 'A'=>array( // left odd parity - '0'=>'0001101', - '1'=>'0011001', - '2'=>'0010011', - '3'=>'0111101', - '4'=>'0100011', - '5'=>'0110001', - '6'=>'0101111', - '7'=>'0111011', - '8'=>'0110111', - '9'=>'0001011'), - 'B'=>array( // left even parity - '0'=>'0100111', - '1'=>'0110011', - '2'=>'0011011', - '3'=>'0100001', - '4'=>'0011101', - '5'=>'0111001', - '6'=>'0000101', - '7'=>'0010001', - '8'=>'0001001', - '9'=>'0010111'), - 'C'=>array( // right - '0'=>'1110010', - '1'=>'1100110', - '2'=>'1101100', - '3'=>'1000010', - '4'=>'1011100', - '5'=>'1001110', - '6'=>'1010000', - '7'=>'1000100', - '8'=>'1001000', - '9'=>'1110100') - ); - $parities = array( - '0'=>array('A','A','A','A','A','A'), - '1'=>array('A','A','B','A','B','B'), - '2'=>array('A','A','B','B','A','B'), - '3'=>array('A','A','B','B','B','A'), - '4'=>array('A','B','A','A','B','B'), - '5'=>array('A','B','B','A','A','B'), - '6'=>array('A','B','B','B','A','A'), - '7'=>array('A','B','A','B','A','B'), - '8'=>array('A','B','A','B','B','A'), - '9'=>array('A','B','B','A','B','A') - ); - $upce_parities = array(); - $upce_parities[0] = array( - '0'=>array('B','B','B','A','A','A'), - '1'=>array('B','B','A','B','A','A'), - '2'=>array('B','B','A','A','B','A'), - '3'=>array('B','B','A','A','A','B'), - '4'=>array('B','A','B','B','A','A'), - '5'=>array('B','A','A','B','B','A'), - '6'=>array('B','A','A','A','B','B'), - '7'=>array('B','A','B','A','B','A'), - '8'=>array('B','A','B','A','A','B'), - '9'=>array('B','A','A','B','A','B') - ); - $upce_parities[1] = array( - '0'=>array('A','A','A','B','B','B'), - '1'=>array('A','A','B','A','B','B'), - '2'=>array('A','A','B','B','A','B'), - '3'=>array('A','A','B','B','B','A'), - '4'=>array('A','B','A','A','B','B'), - '5'=>array('A','B','B','A','A','B'), - '6'=>array('A','B','B','B','A','A'), - '7'=>array('A','B','A','B','A','B'), - '8'=>array('A','B','A','B','B','A'), - '9'=>array('A','B','B','A','B','A') - ); - $k = 0; - $seq = '101'; // left guard bar - if ($upce) { - $bararray = array('code' => $upce_code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - $p = $upce_parities[$code{1}][$r]; - for ($i = 0; $i < 6; ++$i) { - $seq .= $codes[$p[$i]][$upce_code{$i}]; - } - $seq .= '010101'; // right guard bar - } else { - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - $half_len = ceil($len / 2); - if ($len == 8) { - for ($i = 0; $i < $half_len; ++$i) { - $seq .= $codes['A'][$code{$i}]; - } - } else { - $p = $parities[$code{0}]; - for ($i = 1; $i < $half_len; ++$i) { - $seq .= $codes[$p[$i-1]][$code{$i}]; - } - } - $seq .= '01010'; // center guard bar - for ($i = $half_len; $i < $len; ++$i) { - $seq .= $codes['C'][$code{$i}]; - } - $seq .= '101'; // right guard bar - } - $clen = strlen($seq); - $w = 0; - for ($i = 0; $i < $clen; ++$i) { - $w += 1; - if (($i == ($clen - 1)) OR (($i < ($clen - 1)) AND ($seq{$i} != $seq{($i+1)}))) { - if ($seq{$i} == '1') { - $t = true; // bar - } else { - $t = false; // space - } - $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); - $bararray['maxw'] += $w; - ++$k; - $w = 0; - } - } - return $bararray; - } - - /** - * UPC-Based Extentions - * 2-Digit Ext.: Used to indicate magazines and newspaper issue numbers - * 5-Digit Ext.: Used to mark suggested retail price of books - * @param string $code code to represent. - * @param string $len barcode type: 2 = 2-Digit, 5 = 5-Digit - * @return array barcode representation. - * @access protected - */ - protected function barcode_eanext($code, $len=5) { - //Padding - $code = str_pad($code, $len, '0', STR_PAD_LEFT); - // calculate check digit - if ($len == 2) { - $r = $code % 4; - } elseif ($len == 5) { - $r = (3 * ($code{0} + $code{2} + $code{4})) + (9 * ($code{1} + $code{3})); - $r %= 10; - } else { - return false; - } - //Convert digits to bars - $codes = array( - 'A'=>array( // left odd parity - '0'=>'0001101', - '1'=>'0011001', - '2'=>'0010011', - '3'=>'0111101', - '4'=>'0100011', - '5'=>'0110001', - '6'=>'0101111', - '7'=>'0111011', - '8'=>'0110111', - '9'=>'0001011'), - 'B'=>array( // left even parity - '0'=>'0100111', - '1'=>'0110011', - '2'=>'0011011', - '3'=>'0100001', - '4'=>'0011101', - '5'=>'0111001', - '6'=>'0000101', - '7'=>'0010001', - '8'=>'0001001', - '9'=>'0010111') - ); - $parities = array(); - $parities[2] = array( - '0'=>array('A','A'), - '1'=>array('A','B'), - '2'=>array('B','A'), - '3'=>array('B','B') - ); - $parities[5] = array( - '0'=>array('B','B','A','A','A'), - '1'=>array('B','A','B','A','A'), - '2'=>array('B','A','A','B','A'), - '3'=>array('B','A','A','A','B'), - '4'=>array('A','B','B','A','A'), - '5'=>array('A','A','B','B','A'), - '6'=>array('A','A','A','B','B'), - '7'=>array('A','B','A','B','A'), - '8'=>array('A','B','A','A','B'), - '9'=>array('A','A','B','A','B') - ); - $p = $parities[$len][$r]; - $seq = '1011'; // left guard bar - $seq .= $codes[$p[0]][$code{0}]; - for ($i = 1; $i < $len; ++$i) { - $seq .= '01'; // separator - $seq .= $codes[$p[$i]][$code{$i}]; - } - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - return $this->binseq_to_array($seq, $bararray); - } - - /** - * POSTNET and PLANET barcodes. - * Used by U.S. Postal Service for automated mail sorting - * @param string $code zip code to represent. Must be a string containing a zip code of the form DDDDD or DDDDD-DDDD. - * @param boolean $planet if true print the PLANET barcode, otherwise print POSTNET - * @return array barcode representation. - * @access protected - */ - protected function barcode_postnet($code, $planet=false) { - // bar lenght - if ($planet) { - $barlen = Array( - 0 => Array(1,1,2,2,2), - 1 => Array(2,2,2,1,1), - 2 => Array(2,2,1,2,1), - 3 => Array(2,2,1,1,2), - 4 => Array(2,1,2,2,1), - 5 => Array(2,1,2,1,2), - 6 => Array(2,1,1,2,2), - 7 => Array(1,2,2,2,1), - 8 => Array(1,2,2,1,2), - 9 => Array(1,2,1,2,2) - ); - } else { - $barlen = Array( - 0 => Array(2,2,1,1,1), - 1 => Array(1,1,1,2,2), - 2 => Array(1,1,2,1,2), - 3 => Array(1,1,2,2,1), - 4 => Array(1,2,1,1,2), - 5 => Array(1,2,1,2,1), - 6 => Array(1,2,2,1,1), - 7 => Array(2,1,1,1,2), - 8 => Array(2,1,1,2,1), - 9 => Array(2,1,2,1,1) - ); - } - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 2, 'bcode' => array()); - $k = 0; - $code = str_replace('-', '', $code); - $code = str_replace(' ', '', $code); - $len = strlen($code); - // calculate checksum - $sum = 0; - for ($i = 0; $i < $len; ++$i) { - $sum += intval($code{$i}); - } - $chkd = ($sum % 10); - if($chkd > 0) { - $chkd = (10 - $chkd); - } - $code .= $chkd; - $len = strlen($code); - // start bar - $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['maxw'] += 2; - for ($i = 0; $i < $len; ++$i) { - for ($j = 0; $j < 5; ++$j) { - $h = $barlen[$code{$i}][$j]; - $p = floor(1 / $h); - $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); - $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['maxw'] += 2; - } - } - // end bar - $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['maxw'] += 1; - return $bararray; - } - - /** - * RMS4CC - CBC - KIX - * RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) - KIX (Klant index - Customer index) - * RM4SCC is the name of the barcode symbology used by the Royal Mail for its Cleanmail service. - * @param string $code code to print - * @param boolean $kix if true prints the KIX variation (doesn't use the start and end symbols, and the checksum) - in this case the house number must be sufficed with an X and placed at the end of the code. - * @return array barcode representation. - * @access protected - */ - protected function barcode_rms4cc($code, $kix=false) { - $notkix = !$kix; - // bar mode - // 1 = pos 1, length 2 - // 2 = pos 1, length 3 - // 3 = pos 2, length 1 - // 4 = pos 2, length 2 - $barmode = array( - '0' => array(3,3,2,2), - '1' => array(3,4,1,2), - '2' => array(3,4,2,1), - '3' => array(4,3,1,2), - '4' => array(4,3,2,1), - '5' => array(4,4,1,1), - '6' => array(3,1,4,2), - '7' => array(3,2,3,2), - '8' => array(3,2,4,1), - '9' => array(4,1,3,2), - 'A' => array(4,1,4,1), - 'B' => array(4,2,3,1), - 'C' => array(3,1,2,4), - 'D' => array(3,2,1,4), - 'E' => array(3,2,2,3), - 'F' => array(4,1,1,4), - 'G' => array(4,1,2,3), - 'H' => array(4,2,1,3), - 'I' => array(1,3,4,2), - 'J' => array(1,4,3,2), - 'K' => array(1,4,4,1), - 'L' => array(2,3,3,2), - 'M' => array(2,3,4,1), - 'N' => array(2,4,3,1), - 'O' => array(1,3,2,4), - 'P' => array(1,4,1,4), - 'Q' => array(1,4,2,3), - 'R' => array(2,3,1,4), - 'S' => array(2,3,2,3), - 'T' => array(2,4,1,3), - 'U' => array(1,1,4,4), - 'V' => array(1,2,3,4), - 'W' => array(1,2,4,3), - 'X' => array(2,1,3,4), - 'Y' => array(2,1,4,3), - 'Z' => array(2,2,3,3) - ); - $code = strtoupper($code); - $len = strlen($code); - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 3, 'bcode' => array()); - if ($notkix) { - // table for checksum calculation (row,col) - $checktable = array( - '0' => array(1,1), - '1' => array(1,2), - '2' => array(1,3), - '3' => array(1,4), - '4' => array(1,5), - '5' => array(1,0), - '6' => array(2,1), - '7' => array(2,2), - '8' => array(2,3), - '9' => array(2,4), - 'A' => array(2,5), - 'B' => array(2,0), - 'C' => array(3,1), - 'D' => array(3,2), - 'E' => array(3,3), - 'F' => array(3,4), - 'G' => array(3,5), - 'H' => array(3,0), - 'I' => array(4,1), - 'J' => array(4,2), - 'K' => array(4,3), - 'L' => array(4,4), - 'M' => array(4,5), - 'N' => array(4,0), - 'O' => array(5,1), - 'P' => array(5,2), - 'Q' => array(5,3), - 'R' => array(5,4), - 'S' => array(5,5), - 'T' => array(5,0), - 'U' => array(0,1), - 'V' => array(0,2), - 'W' => array(0,3), - 'X' => array(0,4), - 'Y' => array(0,5), - 'Z' => array(0,0) - ); - $row = 0; - $col = 0; - for ($i = 0; $i < $len; ++$i) { - $row += $checktable[$code{$i}][0]; - $col += $checktable[$code{$i}][1]; - } - $row %= 6; - $col %= 6; - $chk = array_keys($checktable, array($row,$col)); - $code .= $chk[0]; - ++$len; - } - $k = 0; - if ($notkix) { - // start bar - $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['maxw'] += 2; - } - for ($i = 0; $i < $len; ++$i) { - for ($j = 0; $j < 4; ++$j) { - switch ($barmode[$code{$i}][$j]) { - case 1: { - $p = 0; - $h = 2; - break; - } - case 2: { - $p = 0; - $h = 3; - break; - } - case 3: { - $p = 1; - $h = 1; - break; - } - case 4: { - $p = 1; - $h = 2; - break; - } - } - $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); - $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['maxw'] += 2; - } - } - if ($notkix) { - // stop bar - $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 3, 'p' => 0); - $bararray['maxw'] += 1; - } - return $bararray; - } - - /** - * CODABAR barcodes. - * Older code often used in library systems, sometimes in blood banks - * @param string $code code to represent. - * @return array barcode representation. - * @access protected - */ - protected function barcode_codabar($code) { - $chr = array( - '0' => '11111221', - '1' => '11112211', - '2' => '11121121', - '3' => '22111111', - '4' => '11211211', - '5' => '21111211', - '6' => '12111121', - '7' => '12112111', - '8' => '12211111', - '9' => '21121111', - '-' => '11122111', - '$' => '11221111', - ':' => '21112121', - '/' => '21211121', - '.' => '21212111', - '+' => '11222221', - 'A' => '11221211', - 'B' => '12121121', - 'C' => '11121221', - 'D' => '11122211' - ); - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - $k = 0; - $w = 0; - $seq = ''; - $code = 'A'.strtoupper($code).'A'; - $len = strlen($code); - for ($i = 0; $i < $len; ++$i) { - if (!isset($chr[$code{$i}])) { - return false; - } - $seq = $chr[$code{$i}]; - for ($j = 0; $j < 8; ++$j) { - if (($j % 2) == 0) { - $t = true; // bar - } else { - $t = false; // space - } - $w = $seq{$j}; - $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); - $bararray['maxw'] += $w; - ++$k; - } - } - return $bararray; - } - - /** - * CODE11 barcodes. - * Used primarily for labeling telecommunications equipment - * @param string $code code to represent. - * @return array barcode representation. - * @access protected - */ - protected function barcode_code11($code) { - $chr = array( - '0' => '111121', - '1' => '211121', - '2' => '121121', - '3' => '221111', - '4' => '112121', - '5' => '212111', - '6' => '122111', - '7' => '111221', - '8' => '211211', - '9' => '211111', - '-' => '112111', - 'S' => '112211' - ); - - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - $k = 0; - $w = 0; - $seq = ''; - $len = strlen($code); - // calculate check digit C - $p = 1; - $check = 0; - for ($i = ($len - 1); $i >= 0; --$i) { - $digit = $code{$i}; - if ($digit == '-') { - $dval = 10; - } else { - $dval = intval($digit); - } - $check += ($dval * $p); - ++$p; - if ($p > 10) { - $p = 1; - } - } - $check %= 11; - if ($check == 10) { - $check = '-'; - } - $code .= $check; - if ($len > 10) { - // calculate check digit K - $p = 1; - $check = 0; - for ($i = $len; $i >= 0; --$i) { - $digit = $code{$i}; - if ($digit == '-') { - $dval = 10; - } else { - $dval = intval($digit); - } - $check += ($dval * $p); - ++$p; - if ($p > 9) { - $p = 1; - } - } - $check %= 11; - $code .= $check; - ++$len; - } - $code = 'S'.$code.'S'; - $len += 3; - for ($i = 0; $i < $len; ++$i) { - if (!isset($chr[$code{$i}])) { - return false; - } - $seq = $chr[$code{$i}]; - for ($j = 0; $j < 6; ++$j) { - if (($j % 2) == 0) { - $t = true; // bar - } else { - $t = false; // space - } - $w = $seq{$j}; - $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); - $bararray['maxw'] += $w; - ++$k; - } - } - return $bararray; - } - - /** - * Pharmacode - * Contains digits (0 to 9) - * @param string $code code to represent. - * @return array barcode representation. - * @access protected - */ - protected function barcode_pharmacode($code) { - $seq = ''; - $code = intval($code); - while ($code > 0) { - if (($code % 2) == 0) { - $seq .= '11100'; - $code -= 2; - } else { - $seq .= '100'; - $code -= 1; - } - $code /= 2; - } - $seq = substr($seq, 0, -2); - $seq = strrev($seq); - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); - return $this->binseq_to_array($seq, $bararray); - } - - /** - * Pharmacode two-track - * Contains digits (0 to 9) - * @param string $code code to represent. - * @return array barcode representation. - * @access protected - */ - protected function barcode_pharmacode2t($code) { - $seq = ''; - $code = intval($code); - do { - switch ($code % 3) { - case 0: { - $seq .= '3'; - $code = ($code - 3) / 3; - break; - } - case 1: { - $seq .= '1'; - $code = ($code - 1) / 3; - break; - } - case 2: { - $seq .= '2'; - $code = ($code - 2) / 3; - break; - } - } - } while($code != 0); - $seq = strrev($seq); - $k = 0; - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 2, 'bcode' => array()); - $len = strlen($seq); - for ($i = 0; $i < $len; ++$i) { - switch ($seq{$i}) { - case '1': { - $p = 1; - $h = 1; - break; - } - case '2': { - $p = 0; - $h = 1; - break; - } - case '3': { - $p = 0; - $h = 2; - break; - } - } - $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); - $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['maxw'] += 2; - } - unset($bararray['bcode'][($k - 1)]); - --$bararray['maxw']; - return $bararray; - } - - - /** - * IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 - * (requires PHP bcmath extension) - * Intelligent Mail barcode is a 65-bar code for use on mail in the United States. - * The fields are described as follows:
    • The Barcode Identifier shall be assigned by USPS to encode the presort identification that is currently printed in human readable form on the optional endorsement line (OEL) as well as for future USPS use. This shall be two digits, with the second digit in the range of 0–4. The allowable encoding ranges shall be 00–04, 10–14, 20–24, 30–34, 40–44, 50–54, 60–64, 70–74, 80–84, and 90–94.
    • The Service Type Identifier shall be assigned by USPS for any combination of services requested on the mailpiece. The allowable encoding range shall be 000http://it2.php.net/manual/en/function.dechex.php–999. Each 3-digit value shall correspond to a particular mail class with a particular combination of service(s). Each service program, such as OneCode Confirm and OneCode ACS, shall provide the list of Service Type Identifier values.
    • The Mailer or Customer Identifier shall be assigned by USPS as a unique, 6 or 9 digit number that identifies a business entity. The allowable encoding range for the 6 digit Mailer ID shall be 000000- 899999, while the allowable encoding range for the 9 digit Mailer ID shall be 900000000-999999999.
    • The Serial or Sequence Number shall be assigned by the mailer for uniquely identifying and tracking mailpieces. The allowable encoding range shall be 000000000–999999999 when used with a 6 digit Mailer ID and 000000-999999 when used with a 9 digit Mailer ID. e. The Delivery Point ZIP Code shall be assigned by the mailer for routing the mailpiece. This shall replace POSTNET for routing the mailpiece to its final delivery point. The length may be 0, 5, 9, or 11 digits. The allowable encoding ranges shall be no ZIP Code, 00000–99999, 000000000–999999999, and 00000000000–99999999999.
    - * @param string $code code to print, separate the ZIP (routing code) from the rest using a minus char '-' (BarcodeID_ServiceTypeID_MailerID_SerialNumber-RoutingCode) - * @return array barcode representation. - * @access protected - */ - protected function barcode_imb($code) { - $asc_chr = array(4,0,2,6,3,5,1,9,8,7,1,2,0,6,4,8,2,9,5,3,0,1,3,7,4,6,8,9,2,0,5,1,9,4,3,8,6,7,1,2,4,3,9,5,7,8,3,0,2,1,4,0,9,1,7,0,2,4,6,3,7,1,9,5,8); - $dsc_chr = array(7,1,9,5,8,0,2,4,6,3,5,8,9,7,3,0,6,1,7,4,6,8,9,2,5,1,7,5,4,3,8,7,6,0,2,5,4,9,3,0,1,6,8,2,0,4,5,9,6,7,5,2,6,3,8,5,1,9,8,7,4,0,2,6,3); - $asc_pos = array(3,0,8,11,1,12,8,11,10,6,4,12,2,7,9,6,7,9,2,8,4,0,12,7,10,9,0,7,10,5,7,9,6,8,2,12,1,4,2,0,1,5,4,6,12,1,0,9,4,7,5,10,2,6,9,11,2,12,6,7,5,11,0,3,2); - $dsc_pos = array(2,10,12,5,9,1,5,4,3,9,11,5,10,1,6,3,4,1,10,0,2,11,8,6,1,12,3,8,6,4,4,11,0,6,1,9,11,5,3,7,3,10,7,11,8,2,10,3,5,8,0,3,12,11,8,4,5,1,3,0,7,12,9,8,10); - $code_arr = explode('-', $code); - $tracking_number = $code_arr[0]; - if (isset($code_arr[1])) { - $routing_code = $code_arr[1]; - } else { - $routing_code = ''; - } - // Conversion of Routing Code - switch (strlen($routing_code)) { - case 0: { - $binary_code = 0; - break; - } - case 5: { - $binary_code = bcadd($routing_code, '1'); - break; - } - case 9: { - $binary_code = bcadd($routing_code, '100001'); - break; - } - case 11: { - $binary_code = bcadd($routing_code, '1000100001'); - break; - } - default: { - return false; - break; - } - } - $binary_code = bcmul($binary_code, 10); - $binary_code = bcadd($binary_code, $tracking_number{0}); - $binary_code = bcmul($binary_code, 5); - $binary_code = bcadd($binary_code, $tracking_number{1}); - $binary_code .= substr($tracking_number, 2, 18); - // convert to hexadecimal - $binary_code = $this->dec_to_hex($binary_code); - // pad to get 13 bytes - $binary_code = str_pad($binary_code, 26, '0', STR_PAD_LEFT); - // convert string to array of bytes - $binary_code_arr = chunk_split($binary_code, 2, "\r"); - $binary_code_arr = substr($binary_code_arr, 0, -1); - $binary_code_arr = explode("\r", $binary_code_arr); - // calculate frame check sequence - $fcs = $this->imb_crc11fcs($binary_code_arr); - // exclude first 2 bits from first byte - $first_byte = sprintf('%2s', dechex((hexdec($binary_code_arr[0]) << 2) >> 2)); - $binary_code_102bit = $first_byte.substr($binary_code, 2); - // convert binary data to codewords - $codewords = array(); - $data = $this->hex_to_dec($binary_code_102bit); - $codewords[0] = bcmod($data, 636) * 2; - $data = bcdiv($data, 636); - for ($i = 1; $i < 9; ++$i) { - $codewords[$i] = bcmod($data, 1365); - $data = bcdiv($data, 1365); - } - $codewords[9] = $data; - if (($fcs >> 10) == 1) { - $codewords[9] += 659; - } - // generate lookup tables - $table2of13 = $this->imb_tables(2, 78); - $table5of13 = $this->imb_tables(5, 1287); - // convert codewords to characters - $characters = array(); - $bitmask = 512; - foreach($codewords as $k => $val) { - if ($val <= 1286) { - $chrcode = $table5of13[$val]; - } else { - $chrcode = $table2of13[($val - 1287)]; - } - if (($fcs & $bitmask) > 0) { - // bitwise invert - $chrcode = ((~$chrcode) & 8191); - } - $characters[] = $chrcode; - $bitmask /= 2; - } - $characters = array_reverse($characters); - // build bars - $k = 0; - $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 3, 'bcode' => array()); - for ($i = 0; $i < 65; ++$i) { - $asc = (($characters[$asc_chr[$i]] & pow(2, $asc_pos[$i])) > 0); - $dsc = (($characters[$dsc_chr[$i]] & pow(2, $dsc_pos[$i])) > 0); - if ($asc AND $dsc) { - // full bar (F) - $p = 0; - $h = 3; - } elseif ($asc) { - // ascender (A) - $p = 0; - $h = 2; - } elseif ($dsc) { - // descender (D) - $p = 1; - $h = 2; - } else { - // tracker (T) - $p = 1; - $h = 1; - } - $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); - $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); - $bararray['maxw'] += 2; - } - unset($bararray['bcode'][($k - 1)]); - --$bararray['maxw']; - return $bararray; - } - - /** - * Convert large integer number to hexadecimal representation. - * (requires PHP bcmath extension) - * @param string $number number to convert specified as a string - * @return string hexadecimal representation - */ - public function dec_to_hex($number) { - $i = 0; - $hex = array(); - if($number == 0) { - return '00'; - } - while($number > 0) { - if($number == 0) { - array_push($hex, '0'); - } else { - array_push($hex, strtoupper(dechex(bcmod($number, '16')))); - $number = bcdiv($number, '16', 0); - } - } - $hex = array_reverse($hex); - return implode($hex); - } - - /** - * Convert large hexadecimal number to decimal representation (string). - * (requires PHP bcmath extension) - * @param string $hex hexadecimal number to convert specified as a string - * @return string hexadecimal representation - */ - public function hex_to_dec($hex) { - $dec = 0; - $bitval = 1; - $len = strlen($hex); - for($pos = ($len - 1); $pos >= 0; --$pos) { - $dec = bcadd($dec, bcmul(hexdec($hex{$pos}), $bitval)); - $bitval = bcmul($bitval, 16); - } - return $dec; - } - - /** - * Intelligent Mail Barcode calculation of Frame Check Sequence - * @param string $code_arr array of hexadecimal values (13 bytes holding 102 bits right justified). - * @return int 11 bit Frame Check Sequence as integer (decimal base) - * @access protected - */ - protected function imb_crc11fcs($code_arr) { - $genpoly = 0x0F35; // generator polynomial - $fcs = 0x07FF; // Frame Check Sequence - // do most significant byte skipping the 2 most significant bits - $data = hexdec($code_arr[0]) << 5; - for ($bit = 2; $bit < 8; ++$bit) { - if (($fcs ^ $data) & 0x400) { - $fcs = ($fcs << 1) ^ $genpoly; - } else { - $fcs = ($fcs << 1); - } - $fcs &= 0x7FF; - $data <<= 1; - } - // do rest of bytes - for ($byte = 1; $byte < 13; ++$byte) { - $data = hexdec($code_arr[$byte]) << 3; - for ($bit = 0; $bit < 8; ++$bit) { - if (($fcs ^ $data) & 0x400) { - $fcs = ($fcs << 1) ^ $genpoly; - } else { - $fcs = ($fcs << 1); - } - $fcs &= 0x7FF; - $data <<= 1; - } - } - return $fcs; - } - - /** - * Reverse unsigned short value - * @param int $num value to reversr - * @return int reversed value - * @access protected - */ - protected function imb_reverse_us($num) { - $rev = 0; - for ($i = 0; $i < 16; ++$i) { - $rev <<= 1; - $rev |= ($num & 1); - $num >>= 1; - } - return $rev; - } - - /** - * generate Nof13 tables used for Intelligent Mail Barcode - * @param int $n is the type of table: 2 for 2of13 table, 5 for 5of13table - * @param int $size size of table (78 for n=2 and 1287 for n=5) - * @return array requested table - * @access protected - */ - protected function imb_tables($n, $size) { - $table = array(); - $lli = 0; // LUT lower index - $lui = $size - 1; // LUT upper index - for ($count = 0; $count < 8192; ++$count) { - $bit_count = 0; - for ($bit_index = 0; $bit_index < 13; ++$bit_index) { - $bit_count += intval(($count & (1 << $bit_index)) != 0); - } - // if we don't have the right number of bits on, go on to the next value - if ($bit_count == $n) { - $reverse = ($this->imb_reverse_us($count) >> 3); - // if the reverse is less than count, we have already visited this pair before - if ($reverse >= $count) { - // If count is symmetric, place it at the first free slot from the end of the list. - // Otherwise, place it at the first free slot from the beginning of the list AND place $reverse ath the next free slot from the beginning of the list - if ($reverse == $count) { - $table[$lui] = $count; - --$lui; - } else { - $table[$lli] = $count; - ++$lli; - $table[$lli] = $reverse; - ++$lli; - } - } - } - } - return $table; - } - -} // end of class -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/tcpdf/cache/chapter_demo_1.txt b/include/limesurvey/admin/classes/tcpdf/cache/chapter_demo_1.txt deleted file mode 100644 index 4025de93..00000000 --- a/include/limesurvey/admin/classes/tcpdf/cache/chapter_demo_1.txt +++ /dev/null @@ -1,19 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc. - -Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa. - -Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu. - -Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra. - -Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat. - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc. - -Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa. - -Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu. - -Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra. - -Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat. diff --git a/include/limesurvey/admin/classes/tcpdf/cache/chapter_demo_2.txt b/include/limesurvey/admin/classes/tcpdf/cache/chapter_demo_2.txt deleted file mode 100644 index cd7bfe68..00000000 --- a/include/limesurvey/admin/classes/tcpdf/cache/chapter_demo_2.txt +++ /dev/null @@ -1,23 +0,0 @@ -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.

    - - - -

    Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.

    - -

    Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu.

    - -

    Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra.

    - -

    Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat.

    - -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.

    - - - -

    Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.

    - -

    Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu.

    - -

    Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra.

    - -

    Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat.

    diff --git a/include/limesurvey/admin/classes/tcpdf/cache/table_data_demo.txt b/include/limesurvey/admin/classes/tcpdf/cache/table_data_demo.txt deleted file mode 100644 index 5a48a42e..00000000 --- a/include/limesurvey/admin/classes/tcpdf/cache/table_data_demo.txt +++ /dev/null @@ -1,15 +0,0 @@ -Austria;Vienna;83859;8075 -Belgium;Brussels;30518;10192 -Denmark;Copenhagen;43094;5295 -Finland;Helsinki;304529;5147 -France;Paris;543965;58728 -Germany;Berlin;357022;82057 -Greece;Athens;131625;10511 -Ireland;Dublin;70723;3694 -Italy;Roma;301316;57563 -Luxembourg;Luxembourg;2586;424 -Netherlands;Amsterdam;41526;15654 -Portugal;Lisbon;91906;9957 -Spain;Madrid;504790;39348 -Sweden;Stockholm;410934;8839 -United Kingdom;London;243820;58862 diff --git a/include/limesurvey/admin/classes/tcpdf/cache/utf8test.txt b/include/limesurvey/admin/classes/tcpdf/cache/utf8test.txt deleted file mode 100644 index af794dfd..00000000 --- a/include/limesurvey/admin/classes/tcpdf/cache/utf8test.txt +++ /dev/null @@ -1,122 +0,0 @@ -Sentences that contain all letters commonly used in a language --------------------------------------------------------------- - -Markus Kuhn -- 2001-09-02 - -This file is UTF-8 encoded. - - -Danish (da) ---------- - - Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen - Wolther spillede på xylofon. - (= Quiz contestants were eating strawbery with cream while Wolther - the circus clown played on xylophone.) - -German (de) ------------ - - Falsches Üben von Xylophonmusik quält jeden größeren Zwerg - (= Wrongful practicing of xylophone music tortures every larger dwarf) - - Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich - (= Twelve boxing fighters hunted Eva across the dike of Sylt) - - Heizölrückstoßabdämpfung - (= fuel oil recoil absorber) - (jqvwxy missing, but all non-ASCII letters in one word) - -English (en) ------------- - - The quick brown fox jumps over the lazy dog - -Spanish (es) ------------- - - El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y - frío, añoraba a su querido cachorro. - (Contains every letter and every accent, but not every combination - of vowel + acute.) - -French (fr) ------------ - - Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à - côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce - qui lui permet de penser à la cænogenèse de l'être dont il est question - dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, - pense-t-il, diminue çà et là la qualité de son œuvre. - - l'île exiguë - Où l'obèse jury mûr - Fête l'haï volapük, - Âne ex aéquo au whist, - Ôtez ce vœu déçu. - - Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en - canoë au delà des îles, près du mälström où brûlent les novæ. - -Irish Gaelic (ga) ------------------ - - D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh - -Hungarian (hu) --------------- - - Árvíztűrő tükörfúrógép - (= flood-proof mirror-drilling machine, only all non-ASCII letters) - -Icelandic (is) --------------- - - Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa - - Sævör grét áðan því úlpan var ónýt - (some ASCII letters missing) - -Greek (el) -------------- - - Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο - (= No more shall I see acacias or myrtles in the golden clearing) - - Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία - (= I uncover the soul-destroying abhorrence) - -Hebrew (iw) ------------ - - ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה - -Polish (pl) ------------ - - Pchnąć w tę łódź jeża lub osiem skrzyń fig - (= To push a hedgehog or eight bins of figs in this boat) - - Zażółć gęślą jaźń - -Russian (ru) ------------- - - В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! - (= Would a citrus live in the bushes of south? Yes, but only a fake one!) - -Thai (th) ---------- - - [--------------------------|------------------------] - ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน - จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร - ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย - ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ - - [The copyright for the Thai example is owned by The Computer - Association of Thailand under the Royal Patronage of His Majesty the - King.] - -Please let me know if you find others! Special thanks to the people -from all over the world who contributed these sentences. diff --git a/include/limesurvey/admin/classes/tcpdf/config/lang/afr.php b/include/limesurvey/admin/classes/tcpdf/config/lang/afr.php deleted file mode 100644 index 45b6c337..00000000 --- a/include/limesurvey/admin/classes/tcpdf/config/lang/afr.php +++ /dev/null @@ -1,50 +0,0 @@ -SetAutoPageBreak(true,10); - $this->AliasNbPages(); - - } - - function intopdf($text,$format='',$bStripHTML=true) - { - if ($bStripHTML) - { - $text = $this->delete_html($text); - } - $oldformat = $this->FontStyle; - $this->SetFont('',$format,$this->FontSizePt); - $this->Write(5,$text); - $this->ln(5); - $this->SetFont('',$oldformat,$this->FontSizePt); - } - function helptextintopdf($text) - { - $oldsize = $this->FontSizePt; - $this->SetFontSize($oldsize-2); - $this->Write(5,$this->delete_html($text)); - $this->ln(5); - $this->SetFontSize($oldsize); - } - function titleintopdf($title,$description='') - { - if(!empty($title)) - { - $title = $this->delete_html($title); - $oldsize = $this->FontSizePt; - $this->SetFontSize($oldsize+4); - $this->Line(5,$this->y,($this->w-5),$this->y); - $this->ln(3); - $this->MultiCell('','',$title,'','C',0); - if(!empty($description) && isset($description)) - { - $description = $this->delete_html($description); - $this->ln(7); - $this->SetFontSize($oldsize+2); - $this->MultiCell('','',$description,'','C',0); - $this->ln(2); - } - else - { - $this->ln(4); - } - $this->Line(5,$this->y,($this->w-5),$this->y); - $this->ln(5); - $this->SetFontSize($oldsize); - } - } - function tableintopdf($array) - { - $maxwidth = array(); - $maxwidth = $this->getmaxwidth($array); - for($a=0;$aCell($maxwidth[$b]*($this->FontSize),4,$this->delete_html($array[$a][$b]),0,0,'C'); - } - $this->ln(); - } - $this->ln(5); - } - function getmaxwidth($array) - { - for($i=0;$i=0) - { - if(strlen($array[($i-1)][$j]) < strlen($array[$i][$j])) - { - $width[$j] = strlen($array[$i][$j]); - } - } - else - { - $width[$j]=strlen($array[$i][$j]); - } - } - } - return ($width); - } - function write_out($name) - { - $this->Output($name,"D"); - } - - function delete_html($text) - { - $text = html_entity_decode($text); - return strip_tags($text); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/README.TXT b/include/limesurvey/admin/classes/tcpdf/fonts/README.TXT deleted file mode 100644 index c27086f2..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/README.TXT +++ /dev/null @@ -1,3 +0,0 @@ -This folder contains fonts descriptions for TCPDF. -All fonts names must be in lowercase. -Please read the documentation on subfolders for copyright, license and other information. \ No newline at end of file diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/ZarBold.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/ZarBold.ctg.z deleted file mode 100644 index e096e5cc..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/ZarBold.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/ZarBold.z b/include/limesurvey/admin/classes/tcpdf/fonts/ZarBold.z deleted file mode 100644 index 41df8dab..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/ZarBold.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.ctg.z deleted file mode 100644 index 8e9b577e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.php b/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.php deleted file mode 100644 index 787921eb..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.php +++ /dev/null @@ -1,102 +0,0 @@ -1093,'Descent'=>-509,'CapHeight'=>1093,'Flags'=>32,'FontBBox'=>'[-278 -507 1124 1093]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); -$up=-136; -$ut=64; -$dw=600; -$cw=array( - 0=>0,32=>139,33=>185,34=>308,35=>278,36=>278,37=>556,38=>463,39=>154,40=>185,41=>185,42=>278,43=>317,44=>139,45=>185,46=>139, - 47=>154,48=>278,49=>278,50=>278,51=>278,52=>278,53=>278,54=>278,55=>278,56=>278,57=>278,58=>185,59=>185,60=>317,61=>317,62=>317, - 63=>278,64=>517,65=>401,66=>371,67=>401,68=>402,69=>371,70=>339,71=>432,72=>430,73=>214,74=>278,75=>424,76=>369,77=>524,78=>401, - 79=>432,80=>339,81=>432,82=>396,83=>309,84=>371,85=>401,86=>401,87=>556,88=>401,89=>401,90=>371,91=>185,92=>154,93=>185,94=>323, - 95=>278,96=>185,97=>278,98=>309,99=>247,100=>309,101=>247,102=>185,103=>278,104=>309,105=>154,106=>185,107=>309,108=>154,109=>463,110=>309, - 111=>278,112=>309,113=>309,114=>247,115=>216,116=>185,117=>309,118=>278,119=>401,120=>278,121=>278,122=>247,123=>219,124=>122,125=>219,126=>289, - 8364=>278,1027=>339,8218=>185,1107=>254,8222=>278,8230=>556,8224=>278,8225=>278,710=>185,8240=>556,352=>309,8249=>185,338=>556,1036=>432,381=>371,1039=>432, - 8216=>185,8217=>185,8220=>278,8221=>278,8226=>194,8211=>278,8212=>556,732=>185,8482=>556,353=>216,8250=>185,339=>401,1116=>297,382=>247,376=>401,161=>185, - 162=>278,163=>278,164=>278,165=>278,166=>122,167=>278,168=>185,169=>415,170=>167,171=>278,172=>317,174=>415,175=>185,176=>222,177=>317,178=>167, - 179=>167,180=>185,181=>309,182=>300,183=>139,184=>185,185=>167,186=>183,187=>278,188=>417,189=>417,190=>417,191=>278,192=>401,193=>401,194=>401, - 195=>401,196=>401,197=>401,198=>556,199=>401,200=>371,201=>371,202=>371,203=>371,204=>216,205=>216,206=>216,207=>216,208=>401,209=>401,210=>432, - 211=>432,212=>432,213=>432,214=>432,215=>317,216=>432,217=>401,218=>401,219=>401,220=>401,221=>401,222=>339,223=>309,224=>278,225=>278,226=>278, - 227=>278,228=>278,229=>278,230=>401,231=>247,232=>247,233=>247,234=>247,235=>247,236=>154,237=>154,238=>154,239=>154,240=>278,241=>309,242=>278, - 243=>278,244=>278,245=>278,246=>278,247=>317,248=>278,249=>309,250=>309,251=>309,252=>309,253=>278,254=>309,255=>278,256=>401,257=>278,258=>401, - 259=>278,260=>401,261=>278,262=>401,263=>247,264=>401,265=>247,266=>401,267=>247,268=>401,269=>247,270=>401,271=>309,272=>401,273=>309,274=>371, - 275=>247,276=>371,277=>247,278=>371,279=>247,280=>371,281=>247,282=>371,283=>247,284=>432,285=>278,286=>432,287=>278,288=>432,289=>278,290=>432, - 291=>278,292=>432,293=>309,294=>432,295=>309,296=>216,297=>154,298=>216,299=>154,300=>216,301=>154,302=>216,303=>154,304=>216,305=>154,306=>490, - 307=>270,308=>278,309=>185,310=>432,311=>309,312=>297,313=>371,314=>154,315=>371,316=>154,317=>371,318=>154,319=>371,320=>293,321=>371,322=>154, - 323=>401,324=>309,325=>401,326=>309,327=>401,328=>309,329=>391,330=>401,331=>309,332=>432,333=>278,334=>432,335=>278,336=>432,337=>278,340=>401, - 341=>247,342=>401,343=>247,344=>401,345=>247,346=>309,347=>216,348=>309,349=>216,350=>309,351=>216,354=>371,355=>185,356=>371,357=>185,358=>371, - 359=>185,360=>401,361=>309,362=>401,363=>309,364=>401,365=>309,366=>401,367=>309,368=>401,369=>309,370=>401,371=>309,372=>556,373=>401,374=>401, - 375=>278,377=>371,378=>247,379=>371,380=>247,383=>185,450=>317,477=>247,484=>432,485=>278,536=>309,537=>216,538=>371,539=>185,658=>282,711=>185, - 728=>185,729=>185,730=>185,731=>185,733=>185,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, - 779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0, - 795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0, - 811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0, - 827=>0,828=>0,829=>0,830=>0,831=>0,864=>0,865=>0,884=>111,885=>111,890=>0,894=>185,900=>100,901=>183,902=>401,903=>139,904=>451, - 905=>532,906=>316,908=>451,910=>501,911=>451,912=>183,913=>401,914=>371,915=>339,916=>422,917=>371,918=>371,919=>432,920=>432,921=>216,922=>432, - 923=>401,924=>524,925=>401,926=>361,927=>432,928=>451,929=>339,931=>361,932=>371,933=>401,934=>482,935=>401,936=>482,937=>451,938=>0,939=>401, - 940=>336,941=>244,942=>336,943=>183,944=>306,945=>336,946=>306,947=>306,948=>306,949=>244,950=>275,951=>336,952=>306,953=>183,954=>338,955=>275, - 956=>336,957=>275,958=>275,959=>306,960=>336,961=>306,962=>244,963=>306,964=>244,965=>306,966=>367,967=>275,968=>397,969=>397,970=>183,971=>306, - 972=>306,973=>306,974=>397,976=>306,977=>306,978=>401,979=>401,980=>401,981=>367,982=>336,986=>283,987=>237,988=>339,989=>261,1024=>371,1025=>371, - 1026=>371,1028=>401,1029=>309,1030=>216,1031=>216,1032=>278,1033=>573,1034=>573,1035=>449,1037=>432,1038=>401,1040=>401,1041=>371,1042=>371,1043=>328,1044=>432, - 1045=>371,1046=>615,1047=>313,1048=>429,1049=>429,1050=>424,1051=>432,1052=>524,1053=>432,1054=>432,1055=>430,1056=>339,1057=>401,1058=>371,1059=>401,1060=>444, - 1061=>401,1062=>429,1063=>432,1064=>618,1065=>618,1066=>482,1067=>539,1068=>350,1069=>401,1070=>619,1071=>408,1072=>278,1073=>278,1074=>279,1075=>246,1076=>309, - 1077=>247,1078=>417,1079=>227,1080=>319,1081=>319,1082=>297,1083=>302,1084=>376,1085=>309,1086=>278,1087=>309,1088=>309,1089=>247,1090=>274,1091=>278,1092=>458, - 1093=>278,1094=>309,1095=>309,1096=>454,1097=>454,1098=>340,1099=>423,1100=>284,1101=>247,1102=>439,1103=>284,1104=>247,1105=>247,1106=>309,1108=>247,1109=>216, - 1110=>154,1111=>154,1112=>185,1113=>440,1114=>437,1115=>309,1117=>309,1118=>278,1119=>309,1164=>339,1165=>284,1166=>339,1167=>309,1168=>339,1169=>254,1170=>339, - 1171=>254,1172=>339,1173=>254,1174=>615,1175=>417,1176=>322,1177=>216,1178=>432,1179=>297,1180=>432,1181=>297,1182=>432,1183=>297,1184=>537,1185=>352,1186=>432, - 1187=>309,1188=>563,1189=>408,1190=>432,1191=>461,1192=>401,1193=>247,1194=>401,1195=>247,1196=>371,1197=>274,1198=>401,1199=>278,1200=>401,1201=>278,1202=>401, - 1203=>278,1204=>581,1205=>432,1206=>432,1207=>309,1208=>432,1209=>309,1210=>432,1211=>309,1212=>367,1213=>247,1214=>367,1215=>247,1216=>216,1217=>615,1218=>417, - 1219=>432,1220=>297,1223=>432,1224=>309,1227=>432,1228=>309,1232=>401,1233=>278,1234=>401,1235=>278,1236=>556,1237=>401,1238=>371,1239=>247,1240=>367,1241=>247, - 1242=>367,1243=>247,1244=>615,1245=>417,1246=>313,1247=>227,1248=>322,1249=>216,1250=>432,1251=>309,1252=>432,1253=>309,1254=>432,1255=>278,1256=>432,1257=>278, - 1258=>432,1259=>278,1260=>401,1261=>247,1262=>401,1263=>278,1264=>401,1265=>278,1266=>401,1267=>278,1268=>432,1269=>309,1272=>548,1273=>423,1488=>280,1489=>280, - 1490=>174,1491=>280,1492=>280,1493=>158,1494=>158,1495=>280,1496=>280,1497=>158,1498=>287,1499=>280,1500=>280,1501=>280,1502=>280,1503=>156,1504=>158,1505=>280, - 1506=>280,1507=>292,1508=>280,1509=>273,1510=>280,1511=>305,1512=>285,1513=>299,1514=>280,1548=>195,1563=>246,1567=>340,1569=>392,1570=>306,1571=>247,1572=>447, - 1573=>247,1574=>602,1575=>192,1576=>635,1577=>369,1578=>635,1579=>635,1580=>548,1581=>1173,1582=>548,1583=>363,1584=>363,1585=>439,1586=>442,1587=>875,1588=>875, - 1589=>1061,1590=>1061,1591=>811,1592=>811,1593=>549,1594=>547,1600=>389,1601=>755,1602=>574,1603=>717,1604=>555,1605=>423,1606=>532,1607=>371,1608=>454,1609=>633, - 1610=>643,1611=>-19,1612=>-26,1613=>-20,1614=>-19,1615=>-18,1616=>-19,1617=>-19,1618=>-15,1632=>383,1633=>383,1634=>383,1635=>383,1636=>383,1637=>383,1638=>383, - 1639=>383,1640=>383,1641=>383,1642=>383,1645=>398,7936=>336,7937=>336,7938=>336,7939=>336,7940=>336,7941=>336,7942=>336,7943=>336,7944=>401,7945=>401,7946=>401, - 7947=>401,7948=>401,7949=>401,7950=>401,7951=>401,7952=>244,7953=>244,7954=>244,7955=>244,7956=>244,7957=>244,7960=>371,7961=>371,7962=>371,7963=>371,7964=>371, - 7965=>371,7968=>336,7969=>336,7970=>336,7971=>336,7972=>336,7973=>336,7974=>336,7975=>336,7976=>432,7977=>432,7978=>432,7979=>432,7980=>432,7981=>432,7982=>432, - 7983=>432,7984=>183,7985=>183,7986=>183,7987=>183,7988=>183,7989=>183,7990=>183,7991=>183,7992=>216,7993=>216,7994=>216,7995=>216,7996=>216,7997=>216,7998=>216, - 7999=>216,8000=>306,8001=>306,8002=>306,8003=>306,8004=>306,8005=>306,8008=>432,8009=>432,8010=>432,8011=>432,8012=>432,8013=>432,8016=>306,8017=>306,8018=>306, - 8019=>306,8020=>306,8021=>306,8022=>306,8023=>306,8025=>401,8027=>401,8029=>401,8031=>401,8032=>397,8033=>397,8034=>397,8035=>397,8036=>397,8037=>397,8038=>397, - 8039=>397,8040=>451,8041=>451,8042=>451,8043=>451,8044=>451,8045=>451,8046=>451,8047=>451,8048=>336,8049=>336,8050=>244,8051=>244,8052=>336,8053=>336,8054=>183, - 8055=>183,8056=>306,8057=>306,8058=>306,8059=>306,8060=>397,8061=>397,8064=>336,8065=>336,8066=>336,8067=>336,8068=>336,8069=>336,8070=>336,8071=>336,8072=>401, - 8073=>401,8074=>401,8075=>401,8076=>401,8077=>401,8078=>401,8079=>401,8080=>336,8081=>336,8082=>336,8083=>336,8084=>336,8085=>336,8086=>336,8087=>336,8088=>432, - 8089=>432,8090=>432,8091=>432,8092=>432,8093=>432,8094=>432,8095=>432,8096=>397,8097=>397,8098=>397,8099=>397,8100=>397,8101=>397,8102=>397,8103=>397,8104=>451, - 8105=>451,8106=>451,8107=>451,8108=>451,8109=>451,8110=>451,8111=>451,8112=>336,8113=>336,8114=>336,8115=>336,8116=>336,8118=>336,8119=>336,8120=>401,8121=>401, - 8122=>401,8123=>401,8124=>401,8125=>278,8126=>0,8127=>278,8128=>278,8129=>306,8130=>336,8131=>336,8132=>336,8134=>336,8135=>336,8136=>371,8137=>371,8138=>432, - 8139=>432,8140=>432,8141=>278,8142=>278,8143=>278,8144=>183,8145=>183,8146=>183,8147=>183,8150=>183,8151=>183,8152=>216,8153=>216,8154=>216,8155=>216,8157=>278, - 8158=>278,8159=>278,8160=>306,8161=>306,8162=>306,8163=>306,8164=>306,8165=>306,8166=>306,8167=>306,8168=>401,8169=>401,8170=>401,8171=>401,8172=>339,8173=>306, - 8174=>306,8175=>278,8178=>397,8179=>397,8180=>397,8182=>397,8183=>397,8184=>432,8185=>432,8186=>451,8187=>451,8188=>451,8189=>278,8190=>278,8208=>185,8209=>185, - 8219=>185,8223=>278,8227=>311,8241=>1011,8248=>261,8251=>404,8253=>386,8255=>529,8256=>529,8257=>188,8258=>517,8259=>185,8260=>93,8261=>184,8262=>184,8267=>300, - 8308=>167,8309=>556,8321=>167,8322=>167,8323=>167,8324=>167,8352=>394,8353=>401,8354=>435,8355=>339,8356=>278,8357=>463,8358=>401,8359=>389,8361=>556,8470=>530, - 8471=>415,8479=>401,8483=>401,8486=>451,8487=>451,8494=>306,8498=>339,8543=>417,8706=>274,8710=>340,8721=>396,8722=>317,8730=>305,8734=>418,8800=>317,8804=>317, - 8805=>317,9674=>274,12353=>556,12354=>556,12355=>556,12356=>556,12357=>556,12358=>556,12359=>556,12360=>556,12361=>556,12362=>556,12363=>556,12364=>556,12365=>556,12366=>556, - 12367=>556,12368=>556,12369=>556,12370=>556,12371=>556,12372=>556,12373=>556,12374=>556,12375=>556,12376=>556,12377=>556,12378=>556,12379=>556,12380=>556,12381=>556,12382=>556, - 12383=>556,12384=>556,12385=>556,12386=>556,12387=>556,12388=>556,12389=>556,12390=>556,12391=>556,12392=>556,12393=>556,12394=>556,12395=>556,12396=>556,12397=>556,12398=>556, - 12399=>556,12400=>556,12401=>556,12402=>556,12403=>556,12404=>556,12405=>556,12406=>556,12407=>556,12408=>556,12409=>556,12410=>556,12411=>556,12412=>556,12413=>556,12414=>556, - 12415=>556,12416=>556,12417=>556,12418=>556,12419=>556,12420=>556,12421=>556,12422=>556,12423=>556,12424=>556,12425=>556,12426=>556,12427=>556,12428=>556,12429=>556,12430=>556, - 12431=>556,12432=>556,12433=>556,12434=>556,12435=>556,12449=>556,12450=>556,12451=>556,12452=>556,12453=>556,12454=>556,12455=>556,12456=>556,12457=>556,12458=>556,12459=>556, - 12460=>556,12461=>556,12462=>556,12463=>556,12464=>556,12465=>556,12466=>556,12467=>556,12468=>556,12469=>556,12470=>556,12471=>556,12472=>556,12473=>556,12474=>556,12475=>556, - 12476=>556,12477=>556,12478=>556,12479=>556,12480=>556,12481=>556,12482=>556,12483=>556,12484=>556,12485=>556,12486=>556,12487=>556,12488=>556,12489=>556,12490=>556,12491=>556, - 12492=>556,12493=>556,12494=>556,12495=>556,12496=>556,12497=>556,12498=>556,12499=>556,12500=>556,12501=>556,12502=>556,12503=>556,12504=>556,12505=>556,12506=>556,12507=>556, - 12508=>556,12509=>556,12510=>556,12511=>556,12512=>556,12513=>556,12514=>556,12515=>556,12516=>556,12517=>556,12518=>556,12519=>556,12520=>556,12521=>556,12522=>556,12523=>556, - 12524=>556,12525=>556,12526=>556,12527=>556,12528=>556,12529=>556,12530=>556,12531=>556,12532=>556,12533=>556,12534=>556,63033=>278,63034=>278,63035=>278,63036=>278,63037=>278, - 63038=>278,63039=>278,63040=>278,63041=>278,63171=>185,63196=>278,64256=>309,64257=>309,64258=>309,64259=>463,64260=>463,64262=>402,64606=>0,64607=>0,64608=>0,64609=>0, - 64610=>0,64830=>467,64831=>467,65010=>814,65152=>392,65153=>306,65154=>281,65155=>247,65156=>250,65157=>447,65158=>412,65159=>247,65160=>222,65161=>602,65162=>535,65163=>360, - 65164=>329,65165=>192,65166=>220,65167=>635,65168=>644,65169=>338,65170=>321,65171=>369,65172=>419,65173=>635,65174=>644,65175=>345,65176=>336,65177=>635,65178=>644,65179=>393, - 65180=>345,65181=>548,65182=>553,65183=>637,65184=>652,65185=>548,65186=>546,65187=>637,65188=>656,65189=>548,65190=>544,65191=>637,65192=>656,65193=>363,65194=>439,65195=>363, - 65196=>439,65197=>440,65198=>471,65199=>439,65200=>474,65201=>875,65202=>871,65203=>608,65204=>588,65205=>875,65206=>871,65207=>609,65208=>587,65209=>1061,65210=>1033,65211=>794, - 65212=>758,65213=>1061,65214=>1033,65215=>794,65216=>761,65217=>811,65218=>793,65219=>659,65220=>647,65221=>811,65222=>793,65223=>659,65224=>642,65225=>549,65226=>481,65227=>512, - 65228=>409,65229=>547,65230=>476,65231=>512,65232=>409,65233=>755,65234=>748,65235=>416,65236=>442,65237=>574,65238=>550,65239=>416,65240=>442,65241=>717,65242=>687,65243=>883, - 65244=>409,65245=>555,65246=>511,65247=>338,65248=>297,65249=>423,65250=>478,65251=>489,65252=>476,65253=>532,65254=>548,65255=>336,65256=>326,65257=>371,65258=>391,65259=>524, - 65260=>412,65261=>454,65262=>412,65263=>633,65264=>566,65265=>643,65266=>560,65267=>357,65268=>333,65269=>623,65270=>617,65271=>603,65272=>621,65273=>576,65274=>617,65275=>576, - 65276=>625); -$enc=''; -$diff=''; -$file='almohanad.z'; -$ctg='almohanad.ctg.z'; -$originalsize=227760; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.z b/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.z deleted file mode 100644 index 27426a68..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/almohanad.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/arialunicid0.php b/include/limesurvey/admin/classes/tcpdf/fonts/arialunicid0.php deleted file mode 100644 index 59aa08da..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/arialunicid0.php +++ /dev/null @@ -1,1769 +0,0 @@ -1069,'Descent'=>-271,'CapHeight'=>1069,'Flags'=>32,'FontBBox'=>'[-1011 -330 2260 1078]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); -$up=-100; -$ut=50; -$dw=1000; -$cw=array( - 32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278, - 48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556, - 64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778, - 80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>469,95=>500, - 96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556, - 112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,8364=>556, - 1027=>567,8218=>222,402=>278,8222=>333,8230=>1000,8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>333,338=>1000,1036=>584,381=>611,1039=>723,8216=>222, - 8217=>222,8220=>333,8221=>333,8226=>350,8211=>500,8212=>1000,732=>333,8482=>1000,353=>500,8250=>333,339=>944,1116=>437,382=>500,376=>667,160=>278,161=>333, - 162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>500,176=>400,177=>584, - 178=>333,179=>333,180=>333,181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>667,193=>667, - 194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722, - 210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, - 226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556, - 242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>667,257=>556, - 258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500,268=>722,269=>500,270=>722,271=>627,272=>722,273=>556, - 274=>667,275=>556,276=>667,277=>556,278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556,288=>778,289=>556, - 290=>778,291=>556,292=>722,293=>556,294=>722,295=>556,296=>278,297=>222,298=>278,299=>222,300=>278,301=>222,302=>278,303=>222,304=>278,305=>278, - 306=>751,307=>444,308=>500,309=>222,310=>667,311=>500,312=>437,313=>556,314=>222,315=>556,316=>222,317=>556,318=>222,319=>556,320=>318,321=>556, - 322=>222,323=>722,324=>556,325=>722,326=>556,327=>722,328=>556,329=>626,330=>723,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556, - 340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500,350=>667,351=>500,354=>611,355=>278,356=>611,357=>406, - 358=>611,359=>278,360=>722,361=>556,362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556,372=>944,373=>722, - 374=>667,375=>500,377=>611,378=>500,379=>611,380=>500,383=>222,384=>556,385=>740,386=>655,387=>556,388=>556,389=>556,390=>722,391=>766,392=>579, - 393=>722,394=>789,395=>655,396=>556,397=>557,398=>667,399=>729,400=>604,401=>611,403=>791,404=>649,405=>806,406=>245,407=>322,408=>667,409=>500, - 410=>322,411=>500,412=>833,413=>722,414=>556,415=>778,416=>776,417=>556,418=>1019,419=>782,420=>735,421=>556,422=>722,423=>667,424=>500,425=>602, - 426=>366,427=>278,428=>571,429=>278,430=>611,431=>776,432=>620,433=>748,434=>667,435=>752,436=>615,437=>611,438=>500,439=>628,440=>628,441=>526, - 442=>480,443=>556,444=>556,445=>526,446=>556,447=>556,448=>278,449=>464,450=>474,451=>278,452=>1333,453=>1222,454=>1056,455=>1030,456=>778,457=>444, - 458=>1222,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722, - 474=>556,475=>722,476=>556,477=>556,478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556,488=>667,489=>500, - 490=>778,491=>556,492=>778,493=>556,494=>534,495=>534,496=>222,497=>1333,498=>1222,499=>1056,500=>778,501=>556,506=>667,507=>556,508=>1000,509=>889, - 510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667,519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556, - 526=>778,527=>556,528=>722,529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,592=>556,593=>556,594=>556,595=>556,596=>500,597=>500, - 598=>556,599=>556,600=>556,601=>556,602=>777,603=>485,604=>485,605=>686,606=>519,607=>260,608=>556,609=>556,610=>557,611=>500,612=>500,613=>556, - 614=>556,615=>556,616=>242,617=>282,618=>356,619=>356,620=>425,621=>222,622=>635,623=>833,624=>833,625=>833,626=>556,627=>556,628=>558,629=>556, - 630=>715,631=>674,632=>558,633=>333,634=>333,635=>333,636=>333,637=>333,638=>312,639=>312,640=>530,641=>530,642=>500,643=>216,644=>276,645=>216, - 646=>222,647=>278,648=>278,649=>596,650=>558,651=>556,652=>500,653=>722,654=>500,655=>500,656=>500,657=>564,658=>530,659=>530,660=>464,661=>464, - 662=>464,663=>500,664=>614,665=>526,666=>519,667=>557,668=>558,669=>222,670=>500,671=>416,672=>556,673=>464,674=>464,675=>966,676=>966,677=>1030, - 678=>689,679=>484,680=>718,688=>326,689=>326,690=>153,691=>201,692=>201,693=>201,694=>304,695=>389,696=>278,697=>222,698=>372,699=>222,700=>222, - 701=>222,702=>222,703=>222,704=>250,705=>250,706=>320,707=>320,708=>320,709=>320,711=>333,712=>192,713=>333,714=>333,715=>333,716=>192,717=>333, - 718=>333,719=>333,720=>300,721=>300,722=>222,723=>222,724=>340,725=>340,726=>280,727=>362,728=>333,729=>333,730=>333,731=>333,733=>333,734=>333, - 736=>278,737=>153,738=>270,739=>274,740=>325,741=>360,742=>360,743=>360,744=>360,745=>360,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, - 774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0, - 790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0, - 806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0, - 822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0, - 864=>0,865=>0,884=>308,885=>308,890=>278,894=>278,900=>278,901=>278,902=>667,903=>278,904=>704,905=>759,906=>315,908=>778,910=>746,911=>758, - 912=>222,913=>667,914=>667,915=>550,916=>682,917=>667,918=>611,919=>722,920=>778,921=>278,922=>667,923=>667,924=>833,925=>722,926=>650,927=>778, - 928=>722,929=>667,931=>602,932=>611,933=>667,934=>808,935=>667,936=>804,937=>758,938=>278,939=>667,940=>576,941=>434,942=>556,943=>222,944=>551, - 945=>576,946=>563,947=>500,948=>557,949=>434,950=>440,951=>556,952=>556,953=>222,954=>498,955=>500,956=>553,957=>500,958=>432,959=>556,960=>678, - 961=>571,962=>472,963=>619,964=>382,965=>551,966=>649,967=>522,968=>729,969=>766,970=>222,971=>551,972=>556,973=>551,974=>766,976=>563,977=>616, - 978=>631,979=>726,980=>631,981=>644,982=>781,986=>722,988=>578,990=>570,992=>692,994=>880,995=>833,996=>684,997=>558,998=>680,999=>529,1000=>557, - 1001=>505,1002=>623,1003=>603,1004=>610,1005=>611,1006=>568,1007=>434,1008=>600,1009=>571,1010=>500,1011=>222,1025=>667,1026=>865,1028=>717,1029=>667,1030=>278, - 1031=>278,1032=>500,1033=>1105,1034=>1009,1035=>867,1038=>635,1040=>667,1041=>655,1042=>667,1043=>567,1044=>677,1045=>667,1046=>923,1047=>604,1048=>722,1049=>722, - 1050=>584,1051=>705,1052=>833,1053=>722,1054=>778,1055=>723,1056=>667,1057=>722,1058=>611,1059=>635,1060=>760,1061=>667,1062=>740,1063=>684,1064=>920,1065=>939, - 1066=>793,1067=>883,1068=>655,1069=>717,1070=>1006,1071=>722,1072=>556,1073=>573,1074=>531,1075=>383,1076=>583,1077=>556,1078=>669,1079=>458,1080=>559,1081=>559, - 1082=>437,1083=>571,1084=>683,1085=>552,1086=>556,1087=>542,1088=>556,1089=>500,1090=>458,1091=>500,1092=>823,1093=>500,1094=>562,1095=>533,1096=>802,1097=>823, - 1098=>620,1099=>717,1100=>523,1101=>510,1102=>744,1103=>542,1105=>556,1106=>556,1107=>383,1108=>510,1109=>500,1110=>222,1111=>278,1112=>222,1113=>873,1114=>811, - 1115=>556,1118=>500,1119=>542,1120=>976,1121=>766,1122=>656,1123=>521,1124=>950,1125=>694,1126=>667,1127=>597,1128=>952,1129=>817,1130=>654,1131=>600,1132=>932, - 1133=>817,1134=>604,1135=>458,1136=>804,1137=>729,1138=>778,1139=>556,1140=>667,1141=>500,1142=>667,1143=>500,1144=>1279,1145=>1060,1146=>778,1147=>556,1148=>976, - 1149=>766,1150=>976,1151=>766,1152=>722,1153=>514,1154=>686,1155=>334,1156=>382,1157=>334,1158=>334,1168=>435,1169=>339,1170=>567,1171=>383,1172=>656,1173=>556, - 1174=>923,1175=>669,1176=>604,1177=>458,1178=>584,1179=>437,1180=>584,1181=>437,1182=>584,1183=>437,1184=>764,1185=>537,1186=>741,1187=>573,1188=>900,1189=>670, - 1190=>736,1191=>560,1192=>778,1193=>560,1194=>722,1195=>500,1196=>611,1197=>458,1198=>667,1199=>500,1200=>667,1201=>500,1202=>667,1203=>500,1204=>916,1205=>661, - 1206=>684,1207=>533,1208=>684,1209=>533,1210=>684,1211=>556,1212=>829,1213=>667,1214=>829,1215=>667,1216=>278,1217=>923,1218=>669,1219=>584,1220=>437,1223=>735, - 1224=>570,1227=>684,1228=>533,1232=>667,1233=>556,1234=>667,1235=>556,1236=>1000,1237=>889,1238=>667,1239=>556,1240=>729,1241=>556,1242=>729,1243=>556,1244=>923, - 1245=>669,1246=>604,1247=>458,1248=>604,1249=>492,1250=>722,1251=>559,1252=>722,1253=>559,1254=>778,1255=>556,1256=>778,1257=>556,1258=>778,1259=>556,1262=>635, - 1263=>500,1264=>635,1265=>500,1266=>635,1267=>500,1268=>684,1269=>533,1272=>883,1273=>717,1329=>635,1330=>531,1331=>583,1332=>583,1333=>531,1334=>531,1335=>427, - 1336=>531,1337=>750,1338=>635,1339=>531,1340=>375,1341=>583,1342=>698,1343=>531,1344=>427,1345=>531,1346=>583,1347=>531,1348=>635,1349=>698,1350=>635,1351=>635, - 1352=>531,1353=>531,1354=>698,1355=>531,1356=>635,1357=>531,1358=>698,1359=>583,1360=>479,1361=>583,1362=>531,1363=>698,1364=>698,1365=>635,1366=>750,1369=>271, - 1370=>271,1371=>150,1372=>300,1373=>271,1374=>271,1375=>420,1377=>583,1378=>427,1379=>427,1380=>427,1381=>427,1382=>427,1383=>427,1384=>427,1385=>459,1386=>427, - 1387=>427,1388=>323,1389=>531,1390=>427,1391=>427,1392=>427,1393=>427,1394=>427,1395=>427,1396=>427,1397=>271,1398=>427,1399=>375,1400=>427,1401=>375,1402=>583, - 1403=>427,1404=>427,1405=>427,1406=>427,1407=>583,1408=>427,1409=>427,1410=>323,1411=>583,1412=>375,1413=>375,1414=>583,1415=>527,1417=>271,1425=>360,1426=>360, - 1427=>360,1428=>360,1429=>360,1430=>360,1431=>360,1432=>360,1433=>360,1434=>360,1435=>360,1436=>360,1437=>360,1438=>360,1439=>360,1440=>360,1441=>360,1443=>360, - 1444=>360,1445=>360,1446=>360,1447=>360,1448=>360,1449=>360,1450=>360,1451=>360,1452=>360,1453=>360,1454=>360,1455=>360,1456=>360,1457=>360,1458=>360,1459=>360, - 1460=>360,1461=>360,1462=>360,1463=>360,1464=>360,1465=>360,1467=>360,1468=>360,1469=>360,1470=>366,1471=>360,1472=>225,1473=>360,1474=>360,1475=>238,1476=>360, - 1488=>577,1489=>563,1490=>411,1491=>512,1492=>594,1493=>316,1494=>326,1495=>594,1496=>594,1497=>316,1498=>507,1499=>527,1500=>484,1501=>594,1502=>594,1503=>316, - 1504=>338,1505=>604,1506=>550,1507=>567,1508=>569,1509=>505,1510=>514,1511=>583,1512=>507,1513=>700,1514=>633,1520=>590,1521=>590,1522=>590,1523=>216,1524=>412, - 1548=>278,1563=>278,1567=>556,1569=>529,1570=>243,1571=>243,1572=>470,1573=>243,1574=>731,1575=>243,1576=>771,1577=>514,1578=>771,1579=>771,1580=>544,1581=>544, - 1582=>544,1583=>430,1584=>430,1585=>421,1586=>421,1587=>1194,1588=>1194,1589=>1291,1590=>1291,1591=>843,1592=>843,1593=>594,1594=>594,1600=>279,1601=>957,1602=>800, - 1603=>757,1604=>662,1605=>589,1606=>692,1607=>514,1608=>470,1609=>731,1610=>731,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0, - 1632=>480,1633=>480,1634=>480,1635=>480,1636=>480,1637=>480,1638=>480,1639=>480,1640=>480,1641=>480,1642=>547,1643=>278,1644=>278,1645=>438,1648=>0,1649=>243, - 1650=>243,1651=>243,1652=>0,1653=>380,1654=>470,1655=>548,1656=>772,1657=>771,1658=>771,1659=>771,1660=>771,1661=>771,1662=>771,1663=>771,1664=>771,1665=>544, - 1666=>544,1667=>544,1668=>544,1669=>544,1670=>544,1671=>544,1672=>430,1673=>430,1674=>430,1675=>430,1676=>430,1677=>430,1678=>430,1679=>430,1680=>430,1681=>421, - 1682=>421,1683=>421,1684=>421,1685=>421,1686=>419,1687=>421,1688=>421,1689=>421,1690=>1194,1691=>1194,1692=>1194,1693=>1291,1694=>1291,1695=>843,1696=>594,1697=>957, - 1698=>957,1699=>957,1700=>957,1701=>957,1702=>957,1703=>800,1704=>800,1705=>828,1706=>1058,1707=>828,1708=>757,1709=>757,1710=>757,1711=>828,1712=>828,1713=>828, - 1714=>828,1715=>828,1716=>828,1717=>662,1718=>662,1719=>662,1722=>692,1723=>692,1724=>692,1725=>692,1726=>706,1728=>514,1729=>509,1730=>509,1731=>509,1732=>470, - 1733=>470,1734=>470,1735=>470,1736=>470,1737=>470,1738=>470,1739=>470,1740=>731,1741=>841,1742=>731,1744=>731,1745=>731,1746=>550,1747=>550,1748=>279,1749=>514, - 1750=>726,1751=>558,1752=>321,1753=>318,1754=>342,1755=>373,1756=>716,1757=>688,1758=>852,1759=>288,1760=>288,1761=>388,1762=>350,1763=>716,1764=>146,1765=>282, - 1766=>339,1767=>339,1768=>415,1769=>514,1770=>220,1771=>220,1772=>220,1773=>350,1776=>480,1777=>480,1778=>480,1779=>480,1780=>480,1781=>480,1782=>480,1783=>480, - 1784=>480,1785=>480,2305=>0,2306=>0,2307=>294,2309=>693,2310=>910,2311=>533,2312=>533,2313=>590,2314=>713,2315=>920,2316=>677,2317=>611,2318=>611,2319=>611, - 2320=>611,2321=>910,2322=>910,2323=>910,2324=>910,2325=>667,2326=>732,2327=>593,2328=>639,2329=>624,2330=>688,2331=>713,2332=>688,2333=>712,2334=>697,2335=>502, - 2336=>533,2337=>583,2338=>523,2339=>693,2340=>585,2341=>638,2342=>533,2343=>640,2344=>585,2345=>585,2346=>565,2347=>699,2348=>592,2349=>689,2350=>633,2351=>600, - 2352=>486,2353=>486,2354=>680,2355=>730,2356=>730,2357=>592,2358=>684,2359=>608,2360=>646,2361=>546,2364=>0,2365=>373,2366=>319,2367=>319,2368=>319,2369=>0, - 2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>319,2378=>319,2379=>319,2380=>319,2381=>0,2384=>884,2385=>0,2386=>0,2387=>0, - 2388=>0,2392=>667,2393=>732,2394=>593,2395=>688,2396=>583,2397=>523,2398=>699,2399=>600,2400=>920,2401=>677,2402=>0,2403=>0,2404=>331,2405=>513,2406=>639, - 2407=>639,2408=>639,2409=>639,2410=>639,2411=>639,2412=>639,2413=>639,2414=>639,2415=>639,2416=>362,2433=>0,2434=>430,2435=>430,2437=>786,2438=>1030,2439=>582, - 2440=>603,2441=>648,2442=>757,2443=>758,2444=>630,2447=>685,2448=>746,2451=>711,2452=>776,2453=>779,2454=>655,2455=>606,2456=>645,2457=>661,2458=>554,2459=>585, - 2460=>729,2461=>752,2462=>893,2463=>567,2464=>625,2465=>648,2466=>567,2467=>598,2468=>680,2469=>645,2470=>609,2471=>596,2472=>595,2474=>635,2475=>780,2476=>593, - 2477=>677,2478=>621,2479=>601,2480=>593,2482=>640,2486=>598,2487=>596,2488=>637,2489=>582,2492=>0,2494=>245,2495=>245,2496=>245,2497=>0,2498=>0,2499=>0, - 2500=>0,2503=>309,2504=>309,2507=>932,2508=>932,2509=>0,2519=>245,2524=>648,2525=>553,2527=>596,2528=>758,2529=>630,2530=>0,2531=>335,2534=>610,2535=>559, - 2536=>595,2537=>711,2538=>610,2539=>661,2540=>661,2541=>559,2542=>661,2543=>600,2544=>593,2545=>593,2546=>601,2547=>567,2548=>601,2549=>699,2550=>661,2551=>267, - 2552=>610,2553=>424,2554=>548,2562=>0,2565=>691,2566=>936,2567=>803,2568=>803,2569=>678,2570=>678,2575=>557,2576=>691,2579=>678,2580=>691,2581=>602,2582=>567, - 2583=>641,2584=>688,2585=>565,2586=>592,2587=>603,2588=>591,2589=>541,2590=>558,2591=>543,2592=>581,2593=>596,2594=>640,2595=>640,2596=>591,2597=>564,2598=>640, - 2599=>564,2600=>581,2602=>564,2603=>551,2604=>560,2605=>549,2606=>558,2607=>652,2608=>540,2610=>677,2611=>677,2613=>601,2614=>558,2616=>558,2617=>549,2620=>0, - 2622=>246,2623=>246,2624=>246,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2649=>567,2650=>690,2651=>591,2652=>591,2654=>581,2662=>591, - 2663=>591,2664=>591,2665=>591,2666=>591,2667=>591,2668=>591,2669=>591,2670=>591,2671=>591,2672=>0,2673=>0,2674=>557,2675=>678,2676=>894,2689=>0,2690=>0, - 2691=>300,2693=>781,2694=>1044,2695=>589,2696=>589,2697=>560,2698=>758,2699=>806,2701=>781,2703=>781,2704=>781,2705=>1044,2707=>1044,2708=>1044,2709=>413,2710=>773, - 2711=>606,2712=>558,2713=>483,2714=>600,2715=>691,2716=>811,2717=>647,2718=>651,2719=>453,2720=>450,2721=>425,2722=>478,2723=>694,2724=>534,2725=>553,2726=>446, - 2727=>541,2728=>582,2730=>572,2731=>437,2732=>663,2733=>756,2734=>594,2735=>493,2736=>392,2738=>613,2739=>656,2741=>538,2742=>611,2743=>507,2744=>663,2745=>587, - 2748=>0,2749=>478,2750=>273,2751=>273,2752=>273,2753=>0,2754=>0,2755=>0,2756=>0,2757=>0,2759=>0,2760=>0,2761=>273,2763=>273,2764=>273,2765=>0, - 2768=>843,2784=>893,2790=>625,2791=>625,2792=>625,2793=>625,2794=>625,2795=>625,2796=>625,2797=>625,2798=>625,2799=>625,2817=>0,2818=>306,2819=>391,2821=>590, - 2822=>808,2823=>658,2824=>658,2825=>633,2826=>654,2827=>636,2828=>540,2831=>560,2832=>938,2835=>600,2836=>973,2837=>603,2838=>620,2839=>620,2840=>605,2841=>712, - 2842=>579,2843=>579,2844=>593,2845=>564,2846=>581,2847=>604,2848=>578,2849=>579,2850=>579,2851=>607,2852=>579,2853=>587,2854=>579,2855=>602,2856=>579,2858=>605, - 2859=>728,2860=>579,2861=>643,2862=>605,2863=>628,2864=>619,2866=>653,2867=>593,2870=>620,2871=>605,2872=>605,2873=>579,2876=>0,2877=>333,2878=>218,2879=>0, - 2880=>294,2881=>0,2882=>0,2883=>0,2887=>479,2888=>479,2891=>1026,2892=>1026,2893=>0,2902=>0,2903=>218,2908=>579,2909=>579,2911=>599,2912=>636,2913=>540, - 2918=>578,2919=>480,2920=>480,2921=>622,2922=>506,2923=>605,2924=>529,2925=>548,2926=>512,2927=>528,2928=>561,2946=>0,2947=>742,2949=>1002,2950=>1118,2951=>994, - 2952=>660,2953=>1012,2954=>1231,2958=>726,2959=>731,2960=>870,2962=>763,2963=>763,2964=>1636,2965=>667,2969=>830,2970=>584,2972=>876,2974=>986,2975=>802,2979=>1295, - 2980=>656,2984=>630,2985=>1012,2986=>694,2990=>727,2991=>790,2992=>545,2993=>718,2994=>821,2995=>871,2996=>724,2997=>873,2999=>1087,3000=>1098,3001=>1274,3006=>547, - 3007=>172,3008=>93,3009=>519,3010=>814,3014=>748,3015=>681,3016=>956,3018=>1666,3019=>1666,3020=>1994,3021=>0,3031=>871,3047=>667,3048=>1012,3049=>751,3050=>740, - 3051=>924,3052=>884,3053=>726,3054=>1002,3055=>825,3056=>717,3057=>719,3058=>774,3073=>365,3074=>601,3075=>346,3077=>720,3078=>786,3079=>567,3080=>1159,3081=>690, - 3082=>1047,3083=>1299,3084=>913,3086=>625,3087=>625,3088=>712,3090=>655,3091=>655,3092=>862,3093=>515,3094=>680,3095=>526,3096=>943,3097=>655,3098=>684,3099=>684, - 3100=>670,3101=>1205,3102=>732,3103=>888,3104=>597,3105=>709,3106=>709,3107=>809,3108=>715,3109=>702,3110=>702,3111=>702,3112=>607,3114=>623,3115=>623,3116=>681, - 3117=>681,3118=>932,3119=>1203,3120=>597,3121=>893,3122=>631,3123=>608,3125=>620,3126=>541,3127=>667,3128=>640,3129=>911,3134=>644,3135=>298,3136=>298,3137=>361, - 3138=>682,3139=>342,3140=>704,3142=>624,3143=>624,3144=>900,3146=>849,3147=>849,3148=>976,3149=>669,3157=>298,3158=>119,3168=>1620,3169=>1281,3174=>840,3175=>840, - 3176=>840,3177=>840,3178=>840,3179=>840,3180=>840,3181=>840,3182=>840,3183=>840,3202=>440,3203=>251,3205=>654,3206=>654,3207=>631,3208=>891,3209=>957,3210=>1293, - 3211=>1044,3212=>744,3214=>650,3215=>650,3216=>659,3218=>667,3219=>667,3220=>667,3221=>462,3222=>749,3223=>543,3224=>779,3225=>674,3226=>682,3227=>660,3228=>667, - 3229=>1171,3230=>926,3231=>671,3232=>557,3233=>669,3234=>669,3235=>728,3236=>544,3237=>672,3238=>672,3239=>672,3240=>560,3242=>668,3243=>668,3244=>681,3245=>687, - 3246=>972,3247=>1101,3248=>556,3249=>677,3250=>661,3251=>545,3253=>666,3254=>553,3255=>670,3256=>549,3257=>716,3262=>425,3263=>341,3264=>680,3265=>354,3266=>714, - 3267=>386,3268=>638,3270=>307,3271=>670,3272=>462,3274=>908,3275=>1251,3276=>434,3277=>336,3285=>344,3286=>404,3294=>673,3296=>1695,3297=>978,3302=>549,3303=>549, - 3304=>549,3305=>549,3306=>549,3307=>549,3308=>549,3309=>549,3310=>549,3311=>549,3330=>368,3331=>305,3333=>1201,3334=>1351,3335=>905,3336=>1459,3337=>635,3338=>1198, - 3339=>861,3340=>957,3342=>1211,3343=>1202,3344=>1839,3346=>642,3347=>1114,3348=>1195,3349=>861,3350=>982,3351=>874,3352=>1354,3353=>957,3354=>1016,3355=>1266,3356=>712, - 3357=>1454,3358=>1215,3359=>563,3360=>565,3361=>1192,3362=>1244,3363=>1268,3364=>878,3365=>966,3366=>545,3367=>879,3368=>879,3370=>1031,3371=>1175,3372=>1334,3373=>546, - 3374=>643,3375=>949,3376=>642,3377=>555,3378=>945,3379=>631,3380=>553,3381=>959,3382=>936,3383=>1122,3384=>1190,3385=>1112,3390=>475,3391=>418,3392=>442,3393=>340, - 3394=>340,3395=>473,3398=>640,3399=>530,3400=>1279,3402=>1368,3403=>1258,3404=>1447,3405=>0,3415=>553,3424=>861,3425=>1100,3430=>1095,3431=>929,3432=>854,3433=>1181, - 3434=>658,3435=>972,3436=>1210,3437=>650,3438=>959,3439=>896,3585=>595,3586=>648,3587=>665,3588=>608,3589=>608,3590=>665,3591=>471,3592=>556,3593=>652,3594=>664, - 3595=>681,3596=>816,3597=>849,3598=>620,3599=>620,3600=>541,3601=>785,3602=>826,3603=>887,3604=>598,3605=>605,3606=>595,3607=>650,3608=>541,3609=>652,3610=>608, - 3611=>608,3612=>630,3613=>630,3614=>695,3615=>695,3616=>620,3617=>581,3618=>588,3619=>501,3620=>595,3621=>569,3622=>620,3623=>519,3624=>592,3625=>659,3626=>574, - 3627=>654,3628=>695,3629=>566,3630=>574,3631=>517,3632=>452,3633=>0,3634=>496,3635=>496,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0, - 3647=>687,3648=>302,3649=>571,3650=>478,3651=>515,3652=>515,3653=>496,3654=>506,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0, - 3663=>555,3664=>598,3665=>640,3666=>688,3667=>690,3668=>657,3669=>657,3670=>635,3671=>839,3672=>693,3673=>769,3674=>673,3675=>994,3713=>775,3714=>707,3716=>724, - 3719=>524,3720=>690,3722=>678,3725=>711,3732=>719,3733=>834,3734=>776,3735=>916,3737=>744,3738=>740,3739=>740,3740=>834,3741=>834,3742=>854,3743=>854,3745=>775, - 3746=>724,3747=>697,3749=>700,3751=>700,3754=>708,3755=>916,3757=>700,3758=>697,3759=>658,3760=>432,3761=>534,3762=>476,3763=>476,3764=>778,3765=>778,3766=>778, - 3767=>778,3768=>778,3769=>778,3771=>778,3772=>778,3773=>670,3776=>420,3777=>806,3778=>430,3779=>446,3780=>346,3782=>571,3784=>778,3785=>778,3786=>778,3787=>778, - 3788=>778,3789=>778,3792=>721,3793=>719,3794=>601,3795=>711,3796=>686,3797=>686,3798=>834,3799=>756,3800=>724,3801=>906,3804=>1272,3805=>1272,3840=>600,3841=>600, - 3842=>600,3843=>600,3844=>600,3845=>600,3846=>600,3847=>600,3848=>600,3849=>600,3850=>600,3851=>600,3852=>600,3853=>600,3854=>600,3855=>600,3856=>600,3857=>600, - 3858=>600,3859=>600,3860=>600,3861=>600,3862=>600,3863=>600,3864=>600,3865=>600,3866=>600,3867=>600,3868=>600,3869=>600,3870=>600,3871=>600,3872=>600,3873=>600, - 3874=>600,3875=>600,3876=>600,3877=>600,3878=>600,3879=>600,3880=>600,3881=>600,3882=>600,3883=>600,3884=>600,3885=>600,3886=>600,3887=>600,3888=>600,3889=>600, - 3890=>600,3891=>600,3892=>600,3893=>600,3894=>600,3895=>600,3896=>600,3897=>600,3898=>600,3899=>600,3900=>600,3901=>600,3902=>600,3903=>600,3904=>600,3905=>600, - 3906=>600,3907=>600,3908=>600,3909=>600,3910=>600,3911=>600,3913=>600,3914=>600,3915=>600,3916=>600,3917=>600,3918=>600,3919=>600,3920=>600,3921=>600,3922=>600, - 3923=>600,3924=>600,3925=>600,3926=>600,3927=>600,3928=>600,3929=>600,3930=>600,3931=>600,3932=>600,3933=>600,3934=>600,3935=>600,3936=>600,3937=>600,3938=>600, - 3939=>600,3940=>600,3941=>600,3942=>600,3943=>600,3944=>600,3945=>600,3953=>600,3954=>600,3955=>600,3956=>600,3957=>600,3958=>600,3959=>600,3960=>600,3961=>600, - 3962=>600,3963=>600,3964=>600,3965=>600,3966=>600,3967=>600,3968=>600,3969=>600,3970=>600,3971=>600,3972=>600,3973=>600,3974=>600,3975=>600,3976=>600,3977=>600, - 3978=>600,3979=>600,3984=>600,3985=>600,3986=>600,3987=>600,3988=>600,3989=>600,3991=>600,3993=>600,3994=>600,3995=>600,3996=>600,3997=>600,3998=>600,3999=>600, - 4000=>600,4001=>600,4002=>600,4003=>600,4004=>600,4005=>600,4006=>600,4007=>600,4008=>600,4009=>600,4010=>600,4011=>600,4012=>600,4013=>600,4017=>600,4018=>600, - 4019=>600,4020=>600,4021=>600,4022=>600,4023=>600,4025=>600,4256=>662,4257=>677,4258=>708,4259=>696,4260=>609,4261=>790,4262=>664,4263=>785,4264=>560,4265=>634, - 4266=>782,4267=>701,4268=>629,4269=>682,4270=>705,4271=>692,4272=>734,4273=>615,4274=>592,4275=>680,4276=>679,4277=>705,4278=>643,4279=>623,4280=>623,4281=>629, - 4282=>633,4283=>770,4284=>592,4285=>662,4286=>629,4287=>672,4288=>735,4289=>576,4290=>606,4291=>605,4292=>676,4293=>792,4304=>435,4305=>556,4306=>565,4307=>872, - 4308=>506,4309=>544,4310=>723,4311=>868,4312=>530,4313=>532,4314=>955,4315=>552,4316=>565,4317=>712,4318=>547,4319=>574,4320=>685,4321=>554,4322=>806,4323=>810, - 4324=>777,4325=>502,4326=>686,4327=>512,4328=>552,4329=>496,4330=>568,4331=>552,4332=>592,4333=>565,4334=>552,4335=>741,4336=>549,4337=>659,4338=>559,4339=>524, - 4340=>482,4341=>565,4342=>822,4347=>506,4352=>1000,4353=>1000,4354=>1000,4355=>1000,4356=>1000,4357=>1000,4358=>1000,4359=>1000,4360=>1000,4361=>1000,4362=>1000,4363=>1000, - 4364=>1000,4365=>1000,4366=>1000,4367=>1000,4368=>1000,4369=>1000,4370=>1000,4371=>1000,4372=>1000,4373=>1000,4374=>1000,4375=>1000,4376=>1000,4377=>1000,4378=>1000,4379=>1000, - 4380=>1000,4381=>1000,4382=>1000,4383=>1000,4384=>1000,4385=>1000,4386=>1000,4387=>1000,4388=>1000,4389=>1000,4390=>1000,4391=>1000,4392=>1000,4393=>1000,4394=>1000,4395=>1000, - 4396=>1000,4397=>1000,4398=>1000,4399=>1000,4400=>1000,4401=>1000,4402=>1000,4403=>1000,4404=>1000,4405=>1000,4406=>1000,4407=>1000,4408=>1000,4409=>1000,4410=>1000,4411=>1000, - 4412=>1000,4413=>1000,4414=>1000,4415=>1000,4416=>1000,4417=>1000,4418=>1000,4419=>1000,4420=>1000,4421=>1000,4422=>1000,4423=>1000,4424=>1000,4425=>1000,4426=>1000,4427=>1000, - 4428=>1000,4429=>1000,4430=>1000,4431=>1000,4432=>1000,4433=>1000,4434=>1000,4435=>1000,4436=>1000,4437=>1000,4438=>1000,4439=>1000,4440=>1000,4441=>1000,4447=>1000,4448=>1000, - 4449=>1000,4450=>1000,4451=>1000,4452=>1000,4453=>1000,4454=>1000,4455=>1000,4456=>1000,4457=>1000,4458=>1000,4459=>1000,4460=>1000,4461=>1000,4462=>1000,4463=>1000,4464=>1000, - 4465=>1000,4466=>1000,4467=>1000,4468=>1000,4469=>1000,4470=>1000,4471=>1000,4472=>1000,4473=>1000,4474=>1000,4475=>1000,4476=>1000,4477=>1000,4478=>1000,4479=>1000,4480=>1000, - 4481=>1000,4482=>1000,4483=>1000,4484=>1000,4485=>1000,4486=>1000,4487=>1000,4488=>1000,4489=>1000,4490=>1000,4491=>1000,4492=>1000,4493=>1000,4494=>1000,4495=>1000,4496=>1000, - 4497=>1000,4498=>1000,4499=>1000,4500=>1000,4501=>1000,4502=>1000,4503=>1000,4504=>1000,4505=>1000,4506=>1000,4507=>1000,4508=>1000,4509=>1000,4510=>1000,4511=>1000,4512=>1000, - 4513=>1000,4514=>1000,4520=>1000,4521=>1000,4522=>1000,4523=>1000,4524=>1000,4525=>1000,4526=>1000,4527=>1000,4528=>1000,4529=>1000,4530=>1000,4531=>1000,4532=>1000,4533=>1000, - 4534=>1000,4535=>1000,4536=>1000,4537=>1000,4538=>1000,4539=>1000,4540=>1000,4541=>1000,4542=>1000,4543=>1000,4544=>1000,4545=>1000,4546=>1000,4547=>1000,4548=>1000,4549=>1000, - 4550=>1000,4551=>1000,4552=>1000,4553=>1000,4554=>1000,4555=>1000,4556=>1000,4557=>1000,4558=>1000,4559=>1000,4560=>1000,4561=>1000,4562=>1000,4563=>1000,4564=>1000,4565=>1000, - 4566=>1000,4567=>1000,4568=>1000,4569=>1000,4570=>1000,4571=>1000,4572=>1000,4573=>1000,4574=>1000,4575=>1000,4576=>1000,4577=>1000,4578=>1000,4579=>1000,4580=>1000,4581=>1000, - 4582=>1000,4583=>1000,4584=>1000,4585=>1000,4586=>1000,4587=>1000,4588=>1000,4589=>1000,4590=>1000,4591=>1000,4592=>1000,4593=>1000,4594=>1000,4595=>1000,4596=>1000,4597=>1000, - 4598=>1000,4599=>1000,4600=>1000,4601=>1000,7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722,7691=>556, - 7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556, - 7708=>667,7709=>556,7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722,7721=>556,7722=>722,7723=>556, - 7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222, - 7740=>556,7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556, - 7756=>778,7757=>556,7758=>778,7759=>556,7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333,7770=>722,7771=>333, - 7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278, - 7788=>611,7789=>278,7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556, - 7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500, - 7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556,7831=>278,7832=>722,7833=>500,7834=>556,7835=>278, - 7840=>667,7841=>556,7842=>667,7843=>556,7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667,7855=>556, - 7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556, - 7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778,7885=>556,7886=>778,7887=>556, - 7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778,7895=>556,7896=>778,7897=>556,7898=>776,7899=>556,7900=>776,7901=>556,7902=>776,7903=>556, - 7904=>776,7905=>556,7906=>776,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>776,7913=>620,7914=>776,7915=>620,7916=>776,7917=>620,7918=>776,7919=>620, - 7920=>776,7921=>620,7922=>667,7923=>500,7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>576,7937=>576,7938=>576,7939=>576,7940=>576,7941=>576, - 7942=>576,7943=>576,7944=>667,7945=>667,7946=>680,7947=>680,7948=>680,7949=>680,7950=>718,7951=>718,7952=>434,7953=>434,7954=>434,7955=>434,7956=>434,7957=>434, - 7960=>692,7961=>692,7962=>823,7963=>823,7964=>823,7965=>823,7968=>556,7969=>556,7970=>556,7971=>556,7972=>556,7973=>556,7974=>556,7975=>556,7976=>747,7977=>747, - 7978=>878,7979=>878,7980=>878,7981=>878,7982=>923,7983=>923,7984=>222,7985=>222,7986=>222,7987=>222,7988=>222,7989=>222,7990=>222,7991=>222,7992=>303,7993=>303, - 7994=>434,7995=>434,7996=>434,7997=>434,7998=>479,7999=>479,8000=>556,8001=>556,8002=>556,8003=>556,8004=>556,8005=>556,8008=>778,8009=>778,8010=>894,8011=>894, - 8012=>894,8013=>894,8016=>551,8017=>551,8018=>551,8019=>551,8020=>551,8021=>551,8022=>551,8023=>551,8025=>777,8027=>893,8029=>885,8031=>940,8032=>766,8033=>766, - 8034=>766,8035=>766,8036=>766,8037=>766,8038=>766,8039=>766,8040=>758,8041=>758,8042=>874,8043=>874,8044=>868,8045=>867,8046=>911,8047=>911,8048=>576,8049=>576, - 8050=>434,8051=>434,8052=>556,8053=>556,8054=>222,8055=>222,8056=>556,8057=>556,8058=>551,8059=>551,8060=>766,8061=>766,8064=>576,8065=>576,8066=>576,8067=>576, - 8068=>576,8069=>576,8070=>576,8071=>576,8072=>667,8073=>667,8074=>680,8075=>680,8076=>680,8077=>680,8078=>718,8079=>718,8080=>556,8081=>556,8082=>556,8083=>556, - 8084=>556,8085=>556,8086=>556,8087=>556,8088=>747,8089=>747,8090=>878,8091=>878,8092=>878,8093=>878,8094=>923,8095=>923,8096=>766,8097=>766,8098=>766,8099=>766, - 8100=>766,8101=>766,8102=>766,8103=>766,8104=>758,8105=>758,8106=>874,8107=>874,8108=>868,8109=>867,8110=>911,8111=>911,8112=>576,8113=>576,8114=>576,8115=>576, - 8116=>576,8118=>576,8119=>576,8120=>667,8121=>667,8122=>667,8123=>667,8124=>667,8125=>278,8126=>278,8127=>278,8128=>278,8129=>278,8130=>556,8131=>556,8132=>556, - 8134=>556,8135=>556,8136=>693,8137=>704,8138=>748,8139=>759,8140=>722,8141=>278,8142=>278,8143=>278,8144=>222,8145=>222,8146=>222,8147=>222,8150=>222,8151=>222, - 8152=>278,8153=>278,8154=>304,8155=>304,8157=>278,8158=>278,8159=>278,8160=>551,8161=>551,8162=>551,8163=>551,8164=>571,8165=>571,8166=>551,8167=>551,8168=>667, - 8169=>667,8170=>742,8171=>746,8172=>693,8173=>278,8174=>278,8175=>278,8178=>766,8179=>766,8180=>766,8182=>766,8183=>766,8184=>778,8185=>778,8186=>758,8187=>758, - 8188=>758,8189=>278,8190=>278,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>100,8202=>50,8203=>0,8204=>0, - 8205=>0,8208=>333,8209=>333,8210=>556,8213=>564,8214=>428,8215=>500,8219=>222,8223=>333,8227=>350,8228=>278,8229=>556,8231=>278,8232=>0,8233=>0,8241=>1330, - 8242=>222,8243=>372,8244=>522,8245=>206,8246=>356,8247=>506,8248=>312,8251=>1000,8252=>471,8253=>556,8254=>500,8255=>945,8256=>945,8257=>312,8258=>820,8259=>333, - 8260=>167,8261=>278,8262=>278,8304=>333,8308=>333,8309=>333,8310=>333,8311=>333,8312=>333,8313=>333,8314=>333,8315=>333,8316=>333,8317=>210,8318=>210,8319=>333, - 8320=>333,8321=>333,8322=>333,8323=>333,8324=>333,8325=>333,8326=>333,8327=>333,8328=>333,8329=>333,8330=>333,8331=>333,8332=>333,8333=>210,8334=>210,8352=>556, - 8353=>556,8354=>556,8355=>556,8356=>556,8357=>833,8358=>556,8359=>556,8360=>1024,8361=>940,8362=>784,8363=>556,8400=>600,8401=>600,8402=>600,8403=>600,8404=>700, - 8405=>700,8406=>600,8407=>600,8408=>600,8409=>600,8410=>600,8411=>600,8412=>600,8413=>900,8414=>900,8415=>900,8416=>900,8417=>700,8448=>889,8449=>889,8450=>667, - 8451=>1022,8452=>611,8453=>889,8454=>889,8455=>501,8456=>667,8457=>921,8458=>510,8459=>906,8460=>988,8461=>722,8462=>500,8463=>500,8464=>688,8465=>553,8466=>708, - 8467=>291,8468=>778,8469=>722,8470=>1073,8471=>737,8472=>740,8473=>556,8474=>722,8475=>927,8476=>795,8477=>667,8478=>667,8479=>667,8480=>1000,8481=>1174,8483=>722, - 8484=>611,8485=>542,8486=>768,8487=>768,8488=>698,8489=>321,8490=>667,8491=>667,8492=>927,8493=>646,8494=>556,8495=>385,8496=>615,8497=>688,8498=>611,8499=>1115, - 8500=>406,8501=>688,8502=>688,8503=>344,8504=>688,8531=>834,8532=>834,8533=>834,8534=>834,8535=>834,8536=>834,8537=>834,8538=>834,8539=>834,8540=>834,8541=>834, - 8542=>834,8543=>834,8544=>278,8545=>555,8546=>832,8547=>933,8548=>667,8549=>934,8550=>1031,8551=>1268,8552=>944,8553=>667,8554=>944,8555=>1035,8556=>556,8557=>722, - 8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>700,8564=>500,8565=>700,8566=>922,8567=>1144,8568=>712,8569=>500,8570=>712,8571=>934,8572=>222,8573=>500, - 8574=>556,8575=>833,8576=>983,8577=>722,8578=>983,8592=>713,8593=>713,8594=>713,8595=>713,8596=>713,8597=>713,8598=>713,8599=>713,8600=>713,8601=>713,8602=>713, - 8603=>713,8604=>713,8605=>713,8606=>713,8607=>713,8608=>713,8609=>713,8610=>713,8611=>713,8612=>713,8613=>713,8614=>713,8615=>713,8616=>713,8617=>713,8618=>713, - 8619=>713,8620=>713,8621=>813,8622=>813,8623=>713,8624=>713,8625=>713,8626=>713,8627=>713,8628=>713,8629=>713,8630=>713,8631=>713,8632=>713,8633=>713,8634=>800, - 8635=>800,8636=>713,8637=>713,8638=>713,8639=>713,8640=>713,8641=>713,8642=>713,8643=>713,8644=>713,8645=>713,8646=>713,8647=>713,8648=>713,8649=>713,8650=>713, - 8651=>713,8652=>713,8653=>713,8654=>950,8655=>713,8656=>713,8657=>713,8658=>713,8659=>713,8660=>863,8661=>713,8662=>713,8663=>713,8664=>713,8665=>713,8666=>713, - 8667=>713,8668=>813,8669=>813,8670=>713,8671=>713,8672=>713,8673=>713,8674=>713,8675=>713,8676=>713,8677=>713,8678=>713,8679=>713,8680=>713,8681=>713,8682=>713, - 8704=>600,8705=>600,8706=>494,8707=>600,8708=>600,8709=>800,8710=>612,8711=>612,8712=>549,8713=>549,8714=>549,8715=>549,8716=>549,8717=>549,8718=>549,8719=>823, - 8720=>823,8721=>713,8722=>584,8723=>584,8724=>584,8725=>167,8726=>278,8727=>389,8728=>400,8729=>400,8730=>600,8731=>600,8732=>600,8733=>549,8734=>549,8735=>584, - 8736=>584,8737=>584,8738=>584,8739=>260,8740=>444,8741=>418,8742=>602,8743=>561,8744=>561,8745=>561,8746=>561,8747=>506,8748=>806,8749=>1106,8750=>506,8751=>806, - 8752=>1106,8753=>506,8754=>506,8755=>506,8756=>561,8757=>561,8758=>422,8759=>561,8760=>584,8761=>584,8762=>584,8763=>584,8764=>584,8765=>584,8766=>584,8767=>584, - 8768=>422,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584,8775=>584,8776=>584,8777=>584,8778=>584,8779=>584,8780=>584,8781=>584,8782=>584,8783=>584, - 8784=>584,8785=>584,8786=>584,8787=>584,8788=>737,8789=>737,8790=>584,8791=>584,8792=>584,8793=>584,8794=>584,8795=>584,8796=>584,8797=>584,8798=>584,8799=>584, - 8800=>584,8801=>584,8802=>584,8803=>584,8804=>584,8805=>584,8806=>584,8807=>584,8808=>584,8809=>584,8810=>969,8811=>969,8812=>584,8813=>584,8814=>584,8815=>584, - 8816=>584,8817=>584,8818=>584,8819=>584,8820=>584,8821=>584,8822=>584,8823=>584,8824=>584,8825=>584,8826=>584,8827=>584,8828=>584,8829=>584,8830=>584,8831=>584, - 8832=>584,8833=>584,8834=>678,8835=>678,8836=>678,8837=>678,8838=>678,8839=>678,8840=>678,8841=>678,8842=>678,8843=>678,8844=>561,8845=>561,8846=>561,8847=>678, - 8848=>678,8849=>673,8850=>673,8851=>561,8852=>561,8853=>800,8854=>800,8855=>800,8856=>800,8857=>800,8858=>800,8859=>800,8860=>800,8861=>800,8862=>800,8863=>800, - 8864=>800,8865=>800,8866=>549,8867=>549,8868=>549,8869=>549,8870=>399,8871=>399,8872=>549,8873=>549,8874=>549,8875=>672,8876=>549,8877=>549,8878=>549,8879=>672, - 8880=>549,8881=>549,8882=>549,8883=>549,8884=>549,8885=>549,8886=>713,8887=>713,8888=>713,8889=>549,8890=>549,8891=>584,8892=>584,8893=>584,8894=>584,8895=>584, - 8896=>561,8897=>561,8898=>561,8899=>561,8900=>549,8901=>250,8902=>549,8903=>649,8904=>630,8905=>630,8906=>630,8907=>630,8908=>630,8909=>584,8910=>561,8911=>561, - 8912=>668,8913=>668,8914=>668,8915=>668,8916=>561,8917=>602,8918=>584,8919=>584,8920=>1354,8921=>1354,8922=>584,8923=>584,8924=>584,8925=>584,8926=>584,8927=>584, - 8928=>584,8929=>584,8930=>673,8931=>673,8932=>673,8933=>673,8934=>584,8935=>584,8936=>584,8937=>584,8938=>584,8939=>584,8940=>584,8941=>584,8942=>278,8943=>1000, - 8944=>1000,8945=>1000,8960=>549,8962=>549,8963=>549,8964=>549,8965=>549,8966=>549,8967=>549,8968=>449,8969=>449,8970=>449,8971=>449,8972=>549,8973=>549,8974=>549, - 8975=>549,8976=>549,8977=>549,8978=>800,8979=>800,8980=>549,8981=>549,8982=>549,8983=>650,8984=>780,8985=>549,8986=>549,8987=>549,8988=>549,8989=>549,8990=>549, - 8991=>549,8992=>506,8993=>506,8994=>713,8995=>713,8996=>1000,8997=>1000,8998=>1000,8999=>1000,9000=>1000,9001=>329,9002=>329,9003=>1000,9004=>549,9005=>549,9006=>549, - 9007=>549,9008=>549,9009=>549,9010=>549,9011=>549,9012=>549,9013=>549,9014=>600,9015=>600,9016=>600,9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600, - 9023=>600,9024=>600,9025=>600,9026=>600,9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600,9037=>600,9038=>600, - 9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600,9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600, - 9055=>600,9056=>600,9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600,9067=>600,9068=>600,9069=>600,9070=>600, - 9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600,9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9109=>600,9216=>600,9217=>600,9218=>600, - 9219=>600,9220=>600,9221=>600,9222=>600,9223=>600,9224=>600,9225=>600,9226=>600,9227=>600,9228=>600,9229=>600,9230=>600,9231=>600,9232=>600,9233=>600,9234=>600, - 9235=>600,9236=>600,9237=>600,9238=>600,9239=>600,9240=>600,9241=>600,9242=>600,9243=>600,9244=>600,9245=>600,9246=>600,9247=>600,9248=>600,9249=>600,9250=>600, - 9251=>600,9252=>600,9280=>604,9281=>604,9282=>604,9283=>604,9284=>604,9285=>604,9286=>750,9287=>750,9288=>750,9289=>750,9290=>604,9312=>1000,9313=>1000,9314=>1000, - 9315=>1000,9316=>1000,9317=>1000,9318=>1000,9319=>1000,9320=>1000,9321=>1000,9322=>1000,9323=>1000,9324=>1000,9325=>1000,9326=>1000,9327=>1000,9328=>1000,9329=>1000,9330=>1000, - 9331=>1000,9332=>1000,9333=>1000,9334=>1000,9335=>1000,9336=>1000,9337=>1000,9338=>1000,9339=>1000,9340=>1000,9341=>1000,9342=>1000,9343=>1000,9344=>1000,9345=>1000,9346=>1000, - 9347=>1000,9348=>1000,9349=>1000,9350=>1000,9351=>1000,9352=>1000,9353=>1000,9354=>1000,9355=>1000,9356=>1000,9357=>1000,9358=>1000,9359=>1000,9360=>1000,9361=>1000,9362=>1000, - 9363=>1000,9364=>1000,9365=>1000,9366=>1000,9367=>1000,9368=>1000,9369=>1000,9370=>1000,9371=>1000,9372=>1000,9373=>1000,9374=>1000,9375=>1000,9376=>1000,9377=>1000,9378=>1000, - 9379=>1000,9380=>1000,9381=>1000,9382=>1000,9383=>1000,9384=>1000,9385=>1000,9386=>1000,9387=>1000,9388=>1000,9389=>1000,9390=>1000,9391=>1000,9392=>1000,9393=>1000,9394=>1000, - 9395=>1000,9396=>1000,9397=>1000,9398=>1000,9399=>1000,9400=>1000,9401=>1000,9402=>1000,9403=>1000,9404=>1000,9405=>1000,9406=>1000,9407=>1000,9408=>1000,9409=>1000,9410=>1000, - 9411=>1000,9412=>1000,9413=>1000,9414=>1000,9415=>1000,9416=>1000,9417=>1000,9418=>1000,9419=>1000,9420=>1000,9421=>1000,9422=>1000,9423=>1000,9424=>1000,9425=>1000,9426=>1000, - 9427=>1000,9428=>1000,9429=>1000,9430=>1000,9431=>1000,9432=>1000,9433=>1000,9434=>1000,9435=>1000,9436=>1000,9437=>1000,9438=>1000,9439=>1000,9440=>1000,9441=>1000,9442=>1000, - 9443=>1000,9444=>1000,9445=>1000,9446=>1000,9447=>1000,9448=>1000,9449=>1000,9450=>1000,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600, - 9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600, - 9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600, - 9512=>600,9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600,9527=>600, - 9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600, - 9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600, - 9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600, - 9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600, - 9592=>600,9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600,9607=>600, - 9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600, - 9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600, - 9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600, - 9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600,9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600, - 9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600,9693=>600,9694=>600,9695=>600,9696=>600,9697=>600, - 9698=>600,9699=>600,9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9728=>750,9729=>1000, - 9730=>750,9731=>750,9732=>1000,9733=>816,9734=>823,9735=>500,9736=>500,9737=>800,9738=>800,9739=>800,9740=>800,9741=>800,9742=>719,9743=>719,9744=>734,9745=>734, - 9746=>734,9747=>762,9754=>960,9755=>960,9756=>939,9757=>939,9758=>939,9759=>939,9760=>750,9761=>600,9762=>750,9763=>750,9764=>580,9765=>460,9766=>444,9767=>650, - 9768=>444,9769=>768,9770=>800,9771=>850,9772=>675,9773=>800,9774=>750,9775=>750,9776=>900,9777=>900,9778=>900,9779=>900,9780=>900,9781=>900,9782=>900,9783=>900, - 9784=>750,9785=>750,9786=>750,9787=>750,9788=>750,9789=>750,9790=>750,9791=>740,9792=>740,9793=>740,9794=>740,9795=>653,9796=>490,9797=>632,9798=>780,9799=>560, - 9800=>838,9801=>780,9802=>734,9803=>887,9804=>780,9805=>1080,9806=>896,9807=>1080,9808=>804,9809=>868,9810=>922,9811=>696,9812=>1000,9813=>1000,9814=>1000,9815=>1000, - 9816=>1000,9817=>1000,9818=>1000,9819=>1000,9820=>1000,9821=>1000,9822=>1000,9823=>1000,9824=>722,9825=>734,9826=>674,9827=>804,9828=>722,9829=>734,9830=>674,9831=>804, - 9832=>860,9833=>423,9834=>592,9835=>750,9836=>750,9837=>439,9838=>439,9839=>439,9985=>974,9986=>961,9987=>974,9988=>980,9990=>789,9991=>790,9992=>791,9993=>690, - 9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846,10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759, - 10012=>754,10013=>494,10014=>552,10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10025=>823,10026=>789,10027=>841,10028=>823, - 10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749,10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708, - 10045=>682,10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786,10056=>787,10057=>713,10058=>791,10059=>785,10061=>873, - 10063=>762,10064=>762,10065=>759,10066=>759,10070=>784,10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10081=>732,10082=>544,10083=>544,10084=>910, - 10085=>667,10086=>760,10087=>760,10102=>788,10103=>788,10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788,10114=>788, - 10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788,10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788, - 10131=>788,10132=>894,10136=>748,10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924,10147=>924,10148=>917,10149=>930, - 10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867,10157=>696,10158=>696,10159=>874,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771, - 10167=>888,10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,12288=>1000,12289=>1000,12290=>1000,12291=>1000,12292=>1000,12293=>1000,12294=>1000,12295=>1000, - 12296=>1000,12297=>1000,12298=>1000,12299=>1000,12300=>1000,12301=>1000,12302=>1000,12303=>1000,12304=>1000,12305=>1000,12306=>1000,12307=>1000,12308=>1000,12309=>1000,12310=>1000,12311=>1000, - 12312=>1000,12313=>1000,12314=>1000,12315=>1000,12316=>1000,12317=>1000,12318=>1000,12319=>1000,12320=>1000,12321=>1000,12322=>1000,12323=>1000,12324=>1000,12325=>1000,12326=>1000,12327=>1000, - 12328=>1000,12329=>1000,12330=>1000,12331=>1000,12332=>1000,12333=>1000,12334=>1000,12335=>1000,12336=>1000,12337=>1000,12338=>1000,12339=>1000,12340=>1000,12341=>1000,12342=>1000,12343=>1000, - 12351=>1000,12353=>1000,12354=>1000,12355=>1000,12356=>1000,12357=>1000,12358=>1000,12359=>1000,12360=>1000,12361=>1000,12362=>1000,12363=>1000,12364=>1000,12365=>1000,12366=>1000,12367=>1000, - 12368=>1000,12369=>1000,12370=>1000,12371=>1000,12372=>1000,12373=>1000,12374=>1000,12375=>1000,12376=>1000,12377=>1000,12378=>1000,12379=>1000,12380=>1000,12381=>1000,12382=>1000,12383=>1000, - 12384=>1000,12385=>1000,12386=>1000,12387=>1000,12388=>1000,12389=>1000,12390=>1000,12391=>1000,12392=>1000,12393=>1000,12394=>1000,12395=>1000,12396=>1000,12397=>1000,12398=>1000,12399=>1000, - 12400=>1000,12401=>1000,12402=>1000,12403=>1000,12404=>1000,12405=>1000,12406=>1000,12407=>1000,12408=>1000,12409=>1000,12410=>1000,12411=>1000,12412=>1000,12413=>1000,12414=>1000,12415=>1000, - 12416=>1000,12417=>1000,12418=>1000,12419=>1000,12420=>1000,12421=>1000,12422=>1000,12423=>1000,12424=>1000,12425=>1000,12426=>1000,12427=>1000,12428=>1000,12429=>1000,12430=>1000,12431=>1000, - 12432=>1000,12433=>1000,12434=>1000,12435=>1000,12436=>1000,12441=>1000,12442=>1000,12443=>1000,12444=>1000,12445=>1000,12446=>1000,12449=>1000,12450=>1000,12451=>1000,12452=>1000,12453=>1000, - 12454=>1000,12455=>1000,12456=>1000,12457=>1000,12458=>1000,12459=>1000,12460=>1000,12461=>1000,12462=>1000,12463=>1000,12464=>1000,12465=>1000,12466=>1000,12467=>1000,12468=>1000,12469=>1000, - 12470=>1000,12471=>1000,12472=>1000,12473=>1000,12474=>1000,12475=>1000,12476=>1000,12477=>1000,12478=>1000,12479=>1000,12480=>1000,12481=>1000,12482=>1000,12483=>1000,12484=>1000,12485=>1000, - 12486=>1000,12487=>1000,12488=>1000,12489=>1000,12490=>1000,12491=>1000,12492=>1000,12493=>1000,12494=>1000,12495=>1000,12496=>1000,12497=>1000,12498=>1000,12499=>1000,12500=>1000,12501=>1000, - 12502=>1000,12503=>1000,12504=>1000,12505=>1000,12506=>1000,12507=>1000,12508=>1000,12509=>1000,12510=>1000,12511=>1000,12512=>1000,12513=>1000,12514=>1000,12515=>1000,12516=>1000,12517=>1000, - 12518=>1000,12519=>1000,12520=>1000,12521=>1000,12522=>1000,12523=>1000,12524=>1000,12525=>1000,12526=>1000,12527=>1000,12528=>1000,12529=>1000,12530=>1000,12531=>1000,12532=>1000,12533=>1000, - 12534=>1000,12535=>1000,12536=>1000,12537=>1000,12538=>1000,12539=>1000,12540=>1000,12541=>1000,12542=>1000,12549=>1000,12550=>1000,12551=>1000,12552=>1000,12553=>1000,12554=>1000,12555=>1000, - 12556=>1000,12557=>1000,12558=>1000,12559=>1000,12560=>1000,12561=>1000,12562=>1000,12563=>1000,12564=>1000,12565=>1000,12566=>1000,12567=>1000,12568=>1000,12569=>1000,12570=>1000,12571=>1000, - 12572=>1000,12573=>1000,12574=>1000,12575=>1000,12576=>1000,12577=>1000,12578=>1000,12579=>1000,12580=>1000,12581=>1000,12582=>1000,12583=>1000,12584=>1000,12585=>1000,12586=>1000,12587=>1000, - 12588=>1000,12593=>1000,12594=>1000,12595=>1000,12596=>1000,12597=>1000,12598=>1000,12599=>1000,12600=>1000,12601=>1000,12602=>1000,12603=>1000,12604=>1000,12605=>1000,12606=>1000,12607=>1000, - 12608=>1000,12609=>1000,12610=>1000,12611=>1000,12612=>1000,12613=>1000,12614=>1000,12615=>1000,12616=>1000,12617=>1000,12618=>1000,12619=>1000,12620=>1000,12621=>1000,12622=>1000,12623=>1000, - 12624=>1000,12625=>1000,12626=>1000,12627=>1000,12628=>1000,12629=>1000,12630=>1000,12631=>1000,12632=>1000,12633=>1000,12634=>1000,12635=>1000,12636=>1000,12637=>1000,12638=>1000,12639=>1000, - 12640=>1000,12641=>1000,12642=>1000,12643=>1000,12644=>1000,12645=>1000,12646=>1000,12647=>1000,12648=>1000,12649=>1000,12650=>1000,12651=>1000,12652=>1000,12653=>1000,12654=>1000,12655=>1000, - 12656=>1000,12657=>1000,12658=>1000,12659=>1000,12660=>1000,12661=>1000,12662=>1000,12663=>1000,12664=>1000,12665=>1000,12666=>1000,12667=>1000,12668=>1000,12669=>1000,12670=>1000,12671=>1000, - 12672=>1000,12673=>1000,12674=>1000,12675=>1000,12676=>1000,12677=>1000,12678=>1000,12679=>1000,12680=>1000,12681=>1000,12682=>1000,12683=>1000,12684=>1000,12685=>1000,12686=>1000,12688=>1000, - 12689=>1000,12690=>1000,12691=>1000,12692=>1000,12693=>1000,12694=>1000,12695=>1000,12696=>1000,12697=>1000,12698=>1000,12699=>1000,12700=>1000,12701=>1000,12702=>1000,12703=>1000,12800=>1000, - 12801=>1000,12802=>1000,12803=>1000,12804=>1000,12805=>1000,12806=>1000,12807=>1000,12808=>1000,12809=>1000,12810=>1000,12811=>1000,12812=>1000,12813=>1000,12814=>1000,12815=>1000,12816=>1000, - 12817=>1000,12818=>1000,12819=>1000,12820=>1000,12821=>1000,12822=>1000,12823=>1000,12824=>1000,12825=>1000,12826=>1000,12827=>1000,12828=>1000,12832=>1000,12833=>1000,12834=>1000,12835=>1000, - 12836=>1000,12837=>1000,12838=>1000,12839=>1000,12840=>1000,12841=>1000,12842=>1000,12843=>1000,12844=>1000,12845=>1000,12846=>1000,12847=>1000,12848=>1000,12849=>1000,12850=>1000,12851=>1000, - 12852=>1000,12853=>1000,12854=>1000,12855=>1000,12856=>1000,12857=>1000,12858=>1000,12859=>1000,12860=>1000,12861=>1000,12862=>1000,12863=>1000,12864=>1000,12865=>1000,12866=>1000,12867=>1000, - 12896=>1000,12897=>1000,12898=>1000,12899=>1000,12900=>1000,12901=>1000,12902=>1000,12903=>1000,12904=>1000,12905=>1000,12906=>1000,12907=>1000,12908=>1000,12909=>1000,12910=>1000,12911=>1000, - 12912=>1000,12913=>1000,12914=>1000,12915=>1000,12916=>1000,12917=>1000,12918=>1000,12919=>1000,12920=>1000,12921=>1000,12922=>1000,12923=>1000,12927=>1000,12928=>1000,12929=>1000,12930=>1000, - 12931=>1000,12932=>1000,12933=>1000,12934=>1000,12935=>1000,12936=>1000,12937=>1000,12938=>1000,12939=>1000,12940=>1000,12941=>1000,12942=>1000,12943=>1000,12944=>1000,12945=>1000,12946=>1000, - 12947=>1000,12948=>1000,12949=>1000,12950=>1000,12951=>1000,12952=>1000,12953=>1000,12954=>1000,12955=>1000,12956=>1000,12957=>1000,12958=>1000,12959=>1000,12960=>1000,12961=>1000,12962=>1000, - 12963=>1000,12964=>1000,12965=>1000,12966=>1000,12967=>1000,12968=>1000,12969=>1000,12970=>1000,12971=>1000,12972=>1000,12973=>1000,12974=>1000,12975=>1000,12976=>1000,12992=>1000,12993=>1000, - 12994=>1000,12995=>1000,12996=>1000,12997=>1000,12998=>1000,12999=>1000,13000=>1000,13001=>1000,13002=>1000,13003=>1000,13008=>1000,13009=>1000,13010=>1000,13011=>1000,13012=>1000,13013=>1000, - 13014=>1000,13015=>1000,13016=>1000,13017=>1000,13018=>1000,13019=>1000,13020=>1000,13021=>1000,13022=>1000,13023=>1000,13024=>1000,13025=>1000,13026=>1000,13027=>1000,13028=>1000,13029=>1000, - 13030=>1000,13031=>1000,13032=>1000,13033=>1000,13034=>1000,13035=>1000,13036=>1000,13037=>1000,13038=>1000,13039=>1000,13040=>1000,13041=>1000,13042=>1000,13043=>1000,13044=>1000,13045=>1000, - 13046=>1000,13047=>1000,13048=>1000,13049=>1000,13050=>1000,13051=>1000,13052=>1000,13053=>1000,13054=>1000,13056=>1000,13057=>1000,13058=>1000,13059=>1000,13060=>1000,13061=>1000,13062=>1000, - 13063=>1000,13064=>1000,13065=>1000,13066=>1000,13067=>1000,13068=>1000,13069=>1000,13070=>1000,13071=>1000,13072=>1000,13073=>1000,13074=>1000,13075=>1000,13076=>1000,13077=>1000,13078=>1000, - 13079=>1000,13080=>1000,13081=>1000,13082=>1000,13083=>1000,13084=>1000,13085=>1000,13086=>1000,13087=>1000,13088=>1000,13089=>1000,13090=>1000,13091=>1000,13092=>1000,13093=>1000,13094=>1000, - 13095=>1000,13096=>1000,13097=>1000,13098=>1000,13099=>1000,13100=>1000,13101=>1000,13102=>1000,13103=>1000,13104=>1000,13105=>1000,13106=>1000,13107=>1000,13108=>1000,13109=>1000,13110=>1000, - 13111=>1000,13112=>1000,13113=>1000,13114=>1000,13115=>1000,13116=>1000,13117=>1000,13118=>1000,13119=>1000,13120=>1000,13121=>1000,13122=>1000,13123=>1000,13124=>1000,13125=>1000,13126=>1000, - 13127=>1000,13128=>1000,13129=>1000,13130=>1000,13131=>1000,13132=>1000,13133=>1000,13134=>1000,13135=>1000,13136=>1000,13137=>1000,13138=>1000,13139=>1000,13140=>1000,13141=>1000,13142=>1000, - 13143=>1000,13144=>1000,13145=>1000,13146=>1000,13147=>1000,13148=>1000,13149=>1000,13150=>1000,13151=>1000,13152=>1000,13153=>1000,13154=>1000,13155=>1000,13156=>1000,13157=>1000,13158=>1000, - 13159=>1000,13160=>1000,13161=>1000,13162=>1000,13163=>1000,13164=>1000,13165=>1000,13166=>1000,13167=>1000,13168=>1000,13169=>1000,13170=>1000,13171=>1000,13172=>1000,13173=>1000,13174=>1000, - 13179=>1000,13180=>1000,13181=>1000,13182=>1000,13183=>1000,13184=>1000,13185=>1000,13186=>1000,13187=>1000,13188=>1000,13189=>1000,13190=>1000,13191=>1000,13192=>1000,13193=>1000,13194=>1000, - 13195=>1000,13196=>1000,13197=>1000,13198=>1000,13199=>1000,13200=>1000,13201=>1000,13202=>1000,13203=>1000,13204=>1000,13205=>1000,13206=>1000,13207=>1000,13208=>1000,13209=>1000,13210=>1000, - 13211=>1000,13212=>1000,13213=>1000,13214=>1000,13215=>1000,13216=>1000,13217=>1000,13218=>1000,13219=>1000,13220=>1000,13221=>1000,13222=>1000,13223=>1000,13224=>1000,13225=>1000,13226=>1000, - 13227=>1000,13228=>1000,13229=>1000,13230=>1000,13231=>1000,13232=>1000,13233=>1000,13234=>1000,13235=>1000,13236=>1000,13237=>1000,13238=>1000,13239=>1000,13240=>1000,13241=>1000,13242=>1000, - 13243=>1000,13244=>1000,13245=>1000,13246=>1000,13247=>1000,13248=>1000,13249=>1000,13250=>1000,13251=>1000,13252=>1000,13253=>1000,13254=>1000,13255=>1000,13256=>1000,13257=>1000,13258=>1000, - 13259=>1000,13260=>1000,13261=>1000,13262=>1000,13263=>1000,13264=>1000,13265=>1000,13266=>1000,13267=>1000,13268=>1000,13269=>1000,13270=>1000,13271=>1000,13272=>1000,13273=>1000,13274=>1000, - 13275=>1000,13276=>1000,13277=>1000,13280=>1000,13281=>1000,13282=>1000,13283=>1000,13284=>1000,13285=>1000,13286=>1000,13287=>1000,13288=>1000,13289=>1000,13290=>1000,13291=>1000,13292=>1000, - 13293=>1000,13294=>1000,13295=>1000,13296=>1000,13297=>1000,13298=>1000,13299=>1000,13300=>1000,13301=>1000,13302=>1000,13303=>1000,13304=>1000,13305=>1000,13306=>1000,13307=>1000,13308=>1000, - 13309=>1000,13310=>1000,59393=>316,59394=>507,59395=>507,59396=>484,59397=>484,59416=>0,59492=>480,59495=>480,59536=>458,59557=>466,59558=>480,59559=>903,61441=>500,61442=>500, - 63232=>541,63233=>0,63234=>0,63235=>0,63236=>0,63237=>0,63238=>0,63239=>0,63240=>0,63241=>0,63242=>0,63243=>0,63244=>0,63245=>0,63246=>0,63247=>849, - 63248=>0,63249=>0,63250=>0,63251=>0,63252=>0,63253=>0,63254=>0,63255=>0,63256=>0,63257=>0,63258=>0,63260=>333,63261=>287,63744=>1000,63745=>1000,63746=>1000, - 63747=>1000,63748=>1000,63749=>1000,63750=>1000,63751=>1000,63752=>1000,63753=>1000,63754=>1000,63755=>1000,63756=>1000,63757=>1000,63758=>1000,63759=>1000,63760=>1000,63761=>1000,63762=>1000, - 63763=>1000,63764=>1000,63765=>1000,63766=>1000,63767=>1000,63768=>1000,63769=>1000,63770=>1000,63771=>1000,63772=>1000,63773=>1000,63774=>1000,63775=>1000,63776=>1000,63777=>1000,63778=>1000, - 63779=>1000,63780=>1000,63781=>1000,63782=>1000,63783=>1000,63784=>1000,63785=>1000,63786=>1000,63787=>1000,63788=>1000,63789=>1000,63790=>1000,63791=>1000,63792=>1000,63793=>1000,63794=>1000, - 63795=>1000,63796=>1000,63797=>1000,63798=>1000,63799=>1000,63800=>1000,63801=>1000,63802=>1000,63803=>1000,63804=>1000,63805=>1000,63806=>1000,63807=>1000,63808=>1000,63809=>1000,63810=>1000, - 63811=>1000,63812=>1000,63813=>1000,63814=>1000,63815=>1000,63816=>1000,63817=>1000,63818=>1000,63819=>1000,63820=>1000,63821=>1000,63822=>1000,63823=>1000,63824=>1000,63825=>1000,63826=>1000, - 63827=>1000,63828=>1000,63829=>1000,63830=>1000,63831=>1000,63832=>1000,63833=>1000,63834=>1000,63835=>1000,63836=>1000,63837=>1000,63838=>1000,63839=>1000,63840=>1000,63841=>1000,63842=>1000, - 63843=>1000,63844=>1000,63845=>1000,63846=>1000,63847=>1000,63848=>1000,63849=>1000,63850=>1000,63851=>1000,63852=>1000,63853=>1000,63854=>1000,63855=>1000,63856=>1000,63857=>1000,63858=>1000, - 63859=>1000,63860=>1000,63861=>1000,63862=>1000,63863=>1000,63864=>1000,63865=>1000,63866=>1000,63867=>1000,63868=>1000,63869=>1000,63870=>1000,63871=>1000,63872=>1000,63873=>1000,63874=>1000, - 63875=>1000,63876=>1000,63877=>1000,63878=>1000,63879=>1000,63880=>1000,63881=>1000,63882=>1000,63883=>1000,63884=>1000,63885=>1000,63886=>1000,63887=>1000,63888=>1000,63889=>1000,63890=>1000, - 63891=>1000,63892=>1000,63893=>1000,63894=>1000,63895=>1000,63896=>1000,63897=>1000,63898=>1000,63899=>1000,63900=>1000,63901=>1000,63902=>1000,63903=>1000,63904=>1000,63905=>1000,63906=>1000, - 63907=>1000,63908=>1000,63909=>1000,63910=>1000,63911=>1000,63912=>1000,63913=>1000,63914=>1000,63915=>1000,63916=>1000,63917=>1000,63918=>1000,63919=>1000,63920=>1000,63921=>1000,63922=>1000, - 63923=>1000,63924=>1000,63925=>1000,63926=>1000,63927=>1000,63928=>1000,63929=>1000,63930=>1000,63931=>1000,63932=>1000,63933=>1000,63934=>1000,63935=>1000,63936=>1000,63937=>1000,63938=>1000, - 63939=>1000,63940=>1000,63941=>1000,63942=>1000,63943=>1000,63944=>1000,63945=>1000,63946=>1000,63947=>1000,63948=>1000,63949=>1000,63950=>1000,63951=>1000,63952=>1000,63953=>1000,63954=>1000, - 63955=>1000,63956=>1000,63957=>1000,63958=>1000,63959=>1000,63960=>1000,63961=>1000,63962=>1000,63963=>1000,63964=>1000,63965=>1000,63966=>1000,63967=>1000,63968=>1000,63969=>1000,63970=>1000, - 63971=>1000,63972=>1000,63973=>1000,63974=>1000,63975=>1000,63976=>1000,63977=>1000,63978=>1000,63979=>1000,63980=>1000,63981=>1000,63982=>1000,63983=>1000,63984=>1000,63985=>1000,63986=>1000, - 63987=>1000,63988=>1000,63989=>1000,63990=>1000,63991=>1000,63992=>1000,63993=>1000,63994=>1000,63995=>1000,63996=>1000,63997=>1000,63998=>1000,63999=>1000,64000=>1000,64001=>1000,64002=>1000, - 64003=>1000,64004=>1000,64005=>1000,64006=>1000,64007=>1000,64008=>1000,64009=>1000,64010=>1000,64011=>1000,64012=>1000,64013=>1000,64014=>1000,64015=>1000,64016=>1000,64017=>1000,64018=>1000, - 64019=>1000,64020=>1000,64021=>1000,64022=>1000,64023=>1000,64024=>1000,64025=>1000,64026=>1000,64027=>1000,64028=>1000,64029=>1000,64030=>1000,64031=>1000,64032=>1000,64033=>1000,64034=>1000, - 64035=>1000,64036=>1000,64037=>1000,64038=>1000,64039=>1000,64040=>1000,64041=>1000,64042=>1000,64043=>1000,64044=>1000,64045=>1000,64256=>537,64257=>500,64258=>500,64259=>778,64260=>750, - 64261=>532,64262=>758,64275=>784,64276=>784,64277=>784,64278=>784,64279=>893,64286=>333,64287=>590,64288=>550,64289=>709,64290=>649,64291=>730,64292=>656,64293=>605,64294=>730, - 64295=>633,64296=>794,64297=>584,64298=>700,64299=>700,64300=>700,64301=>700,64302=>577,64303=>577,64304=>577,64305=>563,64306=>411,64307=>512,64308=>594,64309=>316,64310=>326, - 64312=>594,64313=>316,64314=>507,64315=>527,64316=>484,64318=>594,64320=>338,64321=>604,64323=>567,64324=>569,64326=>514,64327=>583,64328=>507,64329=>700,64330=>633,64331=>316, - 64332=>563,64333=>527,64334=>569,64335=>577,64336=>243,64337=>273,64338=>771,64339=>788,64340=>276,64341=>243,64342=>771,64343=>788,64344=>276,64345=>243,64346=>771,64347=>788, - 64348=>276,64349=>243,64350=>771,64351=>788,64352=>276,64353=>243,64354=>771,64355=>788,64356=>276,64357=>243,64358=>771,64359=>788,64360=>276,64361=>243,64362=>957,64363=>903, - 64364=>466,64365=>480,64366=>957,64367=>903,64368=>466,64369=>480,64370=>544,64371=>658,64372=>646,64373=>637,64374=>544,64375=>658,64376=>646,64377=>637,64378=>544,64379=>658, - 64380=>646,64381=>637,64382=>544,64383=>658,64384=>646,64385=>637,64386=>430,64387=>458,64388=>430,64389=>458,64390=>430,64391=>458,64392=>430,64393=>458,64394=>421,64395=>436, - 64396=>421,64397=>436,64398=>828,64399=>942,64400=>432,64401=>549,64402=>828,64403=>942,64404=>432,64405=>549,64406=>828,64407=>942,64408=>432,64409=>549,64410=>828,64411=>942, - 64412=>432,64413=>549,64414=>692,64415=>723,64416=>692,64417=>723,64418=>276,64419=>243,64420=>514,64421=>477,64422=>514,64423=>509,64424=>273,64425=>427,64426=>706,64427=>706, - 64428=>686,64429=>686,64430=>550,64431=>461,64432=>550,64433=>461,64467=>757,64468=>733,64469=>432,64470=>549,64471=>470,64472=>466,64473=>470,64474=>466,64475=>470,64476=>466, - 64477=>470,64478=>470,64479=>466,64480=>470,64481=>466,64482=>470,64483=>466,64484=>781,64485=>933,64486=>276,64487=>243,64488=>276,64489=>243,64490=>547,64491=>517,64492=>783, - 64493=>753,64494=>740,64495=>710,64496=>740,64497=>710,64498=>740,64499=>710,64500=>740,64501=>710,64502=>1207,64503=>1177,64504=>517,64505=>1067,64506=>1037,64507=>517,64508=>731, - 64509=>793,64510=>276,64511=>243,64512=>932,64513=>932,64514=>914,64515=>1067,64516=>1077,64517=>935,64518=>935,64519=>935,64520=>917,64521=>1070,64522=>1080,64523=>932,64524=>932, - 64525=>932,64526=>914,64527=>1067,64528=>1077,64529=>932,64530=>914,64531=>1067,64532=>1077,64533=>1305,64534=>1287,64535=>1305,64536=>1287,64537=>1305,64538=>1305,64539=>1287,64540=>1429, - 64541=>1429,64542=>1429,64543=>1411,64544=>1476,64545=>1458,64546=>1476,64547=>1476,64548=>1476,64549=>1458,64550=>1392,64551=>1374,64552=>1374,64553=>1245,64554=>1227,64555=>1245,64556=>1227, - 64557=>1125,64558=>1125,64559=>1125,64560=>1107,64561=>1260,64562=>1270,64563=>1125,64564=>1107,64565=>1260,64566=>1270,64567=>706,64568=>1091,64569=>1091,64570=>1091,64571=>1106,64572=>1073, - 64573=>1226,64574=>1236,64575=>932,64576=>932,64577=>932,64578=>914,64579=>1067,64580=>1077,64581=>1140,64582=>1140,64583=>1140,64584=>1122,64585=>1275,64586=>1285,64587=>932,64588=>932, - 64589=>932,64590=>914,64591=>1067,64592=>1077,64593=>1345,64594=>1327,64595=>1480,64596=>1490,64597=>932,64598=>932,64599=>932,64600=>914,64601=>1067,64602=>1077,64603=>430,64604=>421, - 64605=>731,64606=>296,64607=>300,64608=>300,64609=>300,64610=>300,64611=>300,64612=>680,64613=>680,64614=>884,64615=>967,64616=>1037,64617=>1047,64618=>680,64619=>680,64620=>884, - 64621=>967,64622=>1037,64623=>1047,64624=>680,64625=>680,64626=>884,64627=>967,64628=>1037,64629=>1047,64630=>680,64631=>680,64632=>884,64633=>967,64634=>1037,64635=>1047,64636=>1274, - 64637=>1284,64638=>1274,64639=>1284,64640=>821,64641=>1221,64642=>1188,64643=>1341,64644=>1351,64645=>884,64646=>1037,64647=>1047,64648=>806,64649=>1173,64650=>680,64651=>680,64652=>884, - 64653=>967,64654=>1037,64655=>1047,64656=>793,64657=>680,64658=>680,64659=>884,64660=>967,64661=>1037,64662=>1047,64663=>911,64664=>911,64665=>911,64666=>806,64667=>679,64668=>911, - 64669=>911,64670=>911,64671=>806,64672=>679,64673=>911,64674=>911,64675=>911,64676=>806,64677=>679,64678=>806,64679=>1284,64680=>1179,64681=>1284,64682=>1179,64683=>1284,64684=>1179, - 64685=>1408,64686=>1408,64687=>1408,64688=>1303,64689=>1455,64690=>1455,64691=>1350,64692=>1455,64693=>1455,64694=>1455,64695=>1350,64696=>1371,64697=>1266,64698=>1224,64699=>1119,64700=>1224, - 64701=>1119,64702=>1104,64703=>1104,64704=>1104,64705=>999,64706=>1104,64707=>999,64708=>1070,64709=>1070,64710=>1070,64711=>676,64712=>965,64713=>911,64714=>911,64715=>911,64716=>806, - 64717=>679,64718=>1119,64719=>1119,64720=>1119,64721=>1014,64722=>911,64723=>911,64724=>911,64725=>806,64726=>679,64727=>1324,64728=>1219,64729=>686,64730=>911,64731=>911,64732=>911, - 64733=>806,64734=>679,64735=>776,64736=>649,64737=>776,64738=>649,64739=>776,64740=>649,64741=>776,64742=>649,64743=>1303,64744=>1176,64745=>1303,64746=>1176,64747=>793,64748=>1082, - 64749=>776,64750=>776,64751=>649,64752=>776,64753=>649,64754=>306,64755=>302,64756=>298,64757=>1527,64758=>1537,64759=>1380,64760=>1390,64761=>1380,64762=>1390,64763=>1564,64764=>1574, - 64765=>1564,64766=>1574,64767=>1440,64768=>1450,64769=>1440,64770=>1450,64771=>1440,64772=>1450,64773=>1611,64774=>1621,64775=>1611,64776=>1621,64777=>1429,64778=>1429,64779=>1429,64780=>1411, - 64781=>1207,64782=>1207,64783=>1254,64784=>1254,64785=>1527,64786=>1537,64787=>1348,64788=>1358,64789=>1348,64790=>1358,64791=>1564,64792=>1574,64793=>1564,64794=>1574,64795=>1431,64796=>1441, - 64797=>1431,64798=>1441,64799=>1431,64800=>1441,64801=>1611,64802=>1621,64803=>1611,64804=>1621,64805=>1429,64806=>1429,64807=>1429,64808=>1411,64809=>1207,64810=>1207,64811=>1254,64812=>1254, - 64813=>1408,64814=>1408,64815=>1408,64816=>1303,64817=>1176,64818=>1176,64819=>1266,64820=>1408,64821=>1408,64822=>1408,64823=>1408,64824=>1408,64825=>1408,64826=>1266,64827=>1266,64828=>273, - 64829=>243,64830=>600,64831=>600,64848=>1444,64849=>1541,64850=>1549,64851=>1444,64852=>1444,64853=>1444,64854=>1444,64855=>1444,64856=>1830,64857=>1817,64858=>1975,64859=>1964,64860=>2046, - 64861=>2046,64862=>2202,64863=>1962,64864=>1941,64865=>1941,64866=>1944,64867=>1836,64868=>2114,64869=>2093,64870=>1991,64871=>2049,64872=>1941,64873=>2212,64874=>1962,64875=>1941,64876=>1944, - 64877=>1836,64878=>2249,64879=>2096,64880=>1988,64881=>1925,64882=>1904,64883=>1799,64884=>2070,64885=>1833,64886=>1729,64887=>1652,64888=>1881,64889=>1729,64890=>1892,64891=>1881,64892=>1759, - 64893=>1637,64894=>1670,64895=>1654,64896=>1522,64897=>1686,64898=>1675,64899=>1549,64900=>1541,64901=>1522,64902=>1444,64903=>1436,64904=>1444,64905=>1757,64906=>1652,64907=>1975,64908=>1757, - 64909=>1652,64910=>1757,64911=>1652,64914=>1757,64915=>1857,64916=>1752,64917=>1444,64918=>1675,64919=>1522,64920=>1444,64921=>1675,64922=>1581,64923=>1570,64924=>1417,64925=>1362,64926=>1686, - 64927=>1686,64928=>1675,64929=>1686,64930=>1675,64931=>1581,64932=>1570,64933=>1975,64934=>2069,64935=>1964,64936=>2202,64937=>2259,64938=>2212,64939=>2259,64940=>1686,64941=>1581,64942=>1686, - 64943=>1686,64944=>1581,64945=>1870,64946=>1817,64947=>1686,64948=>1637,64949=>1444,64950=>1892,64951=>1886,64952=>1549,64953=>1975,64954=>1444,64955=>1723,64956=>1522,64957=>1541,64958=>2080, - 64959=>2080,64960=>1975,64961=>1817,64962=>1686,64963=>1499,64964=>1757,64965=>1883,64966=>2212,64967=>1686,65008=>1523,65009=>1172,65010=>1159,65011=>1356,65012=>2111,65013=>2258,65014=>2130, - 65015=>1552,65016=>2046,65017=>1856,65018=>1930,65019=>1070,65056=>450,65057=>450,65058=>450,65059=>450,65072=>1000,65073=>1000,65074=>1000,65075=>1000,65076=>1000,65077=>1000,65078=>1000, - 65079=>1000,65080=>1000,65081=>1000,65082=>1000,65083=>1000,65084=>1000,65085=>1000,65086=>1000,65087=>1000,65088=>1000,65089=>1000,65090=>1000,65091=>1000,65092=>1000,65097=>1000,65098=>1000, - 65099=>1000,65100=>1000,65101=>1000,65102=>1000,65103=>1000,65104=>167,65105=>250,65106=>167,65108=>167,65109=>167,65110=>334,65111=>167,65112=>600,65113=>200,65114=>200,65115=>200, - 65116=>200,65117=>200,65118=>200,65119=>334,65120=>400,65121=>233,65122=>350,65123=>200,65124=>350,65125=>350,65126=>350,65128=>167,65129=>334,65130=>533,65131=>609,65136=>300, - 65137=>298,65138=>296,65140=>298,65142=>300,65143=>298,65144=>300,65145=>302,65146=>298,65147=>296,65148=>306,65149=>306,65150=>154,65151=>154,65152=>529,65153=>243,65154=>273, - 65155=>243,65156=>273,65157=>470,65158=>466,65159=>243,65160=>273,65161=>731,65162=>793,65163=>276,65164=>243,65165=>243,65166=>273,65167=>771,65168=>788,65169=>276,65170=>243, - 65171=>514,65172=>477,65173=>771,65174=>788,65175=>276,65176=>243,65177=>771,65178=>788,65179=>276,65180=>243,65181=>544,65182=>658,65183=>646,65184=>637,65185=>544,65186=>658, - 65187=>646,65188=>637,65189=>544,65190=>658,65191=>646,65192=>637,65193=>430,65194=>458,65195=>430,65196=>458,65197=>421,65198=>436,65199=>421,65200=>436,65201=>1194,65202=>1194, - 65203=>770,65204=>770,65205=>1194,65206=>1194,65207=>770,65208=>770,65209=>1291,65210=>1291,65211=>817,65212=>817,65213=>1291,65214=>1291,65215=>817,65216=>817,65217=>843,65218=>843, - 65219=>733,65220=>733,65221=>843,65222=>843,65223=>733,65224=>733,65225=>594,65226=>556,65227=>586,65228=>554,65229=>594,65230=>556,65231=>586,65232=>554,65233=>957,65234=>903, - 65235=>466,65236=>480,65237=>800,65238=>823,65239=>466,65240=>480,65241=>757,65242=>733,65243=>432,65244=>549,65245=>662,65246=>673,65247=>273,65248=>243,65249=>589,65250=>640, - 65251=>481,65252=>532,65253=>692,65254=>723,65255=>276,65256=>243,65257=>514,65258=>477,65259=>686,65260=>405,65261=>470,65262=>466,65263=>731,65264=>793,65265=>731,65266=>803, - 65267=>276,65268=>243,65269=>551,65270=>603,65271=>551,65272=>603,65273=>551,65274=>603,65275=>551,65276=>603,65281=>1000,65282=>1000,65283=>1000,65284=>1000,65285=>1000,65286=>1000, - 65287=>1000,65288=>1000,65289=>1000,65290=>1000,65291=>1000,65292=>1000,65293=>1000,65294=>1000,65295=>1000,65296=>1000,65297=>1000,65298=>1000,65299=>1000,65300=>1000,65301=>1000,65302=>1000, - 65303=>1000,65304=>1000,65305=>1000,65306=>1000,65307=>1000,65308=>1000,65309=>1000,65310=>1000,65311=>1000,65312=>1000,65313=>1000,65314=>1000,65315=>1000,65316=>1000,65317=>1000,65318=>1000, - 65319=>1000,65320=>1000,65321=>1000,65322=>1000,65323=>1000,65324=>1000,65325=>1000,65326=>1000,65327=>1000,65328=>1000,65329=>1000,65330=>1000,65331=>1000,65332=>1000,65333=>1000,65334=>1000, - 65335=>1000,65336=>1000,65337=>1000,65338=>1000,65339=>1000,65340=>1000,65341=>1000,65342=>1000,65343=>1000,65344=>1000,65345=>1000,65346=>1000,65347=>1000,65348=>1000,65349=>1000,65350=>1000, - 65351=>1000,65352=>1000,65353=>1000,65354=>1000,65355=>1000,65356=>1000,65357=>1000,65358=>1000,65359=>1000,65360=>1000,65361=>1000,65362=>1000,65363=>1000,65364=>1000,65365=>1000,65366=>1000, - 65367=>1000,65368=>1000,65369=>1000,65370=>1000,65371=>1000,65372=>1000,65373=>1000,65374=>1000,65377=>500,65378=>500,65379=>500,65380=>500,65381=>500,65382=>500,65383=>500,65384=>500, - 65385=>500,65386=>500,65387=>500,65388=>500,65389=>500,65390=>500,65391=>500,65392=>500,65393=>500,65394=>500,65395=>500,65396=>500,65397=>500,65398=>500,65399=>500,65400=>500, - 65401=>500,65402=>500,65403=>500,65404=>500,65405=>500,65406=>500,65407=>500,65408=>500,65409=>500,65410=>500,65411=>500,65412=>500,65413=>500,65414=>500,65415=>500,65416=>500, - 65417=>500,65418=>500,65419=>500,65420=>500,65421=>500,65422=>500,65423=>500,65424=>500,65425=>500,65426=>500,65427=>500,65428=>500,65429=>500,65430=>500,65431=>500,65432=>500, - 65433=>500,65434=>500,65435=>500,65436=>500,65437=>500,65438=>500,65439=>500,65440=>500,65441=>500,65442=>500,65443=>500,65444=>500,65445=>500,65446=>500,65447=>500,65448=>500, - 65449=>500,65450=>500,65451=>500,65452=>500,65453=>500,65454=>500,65455=>500,65456=>500,65457=>500,65458=>500,65459=>500,65460=>500,65461=>500,65462=>500,65463=>500,65464=>500, - 65465=>500,65466=>500,65467=>500,65468=>500,65469=>500,65470=>500,65474=>500,65475=>500,65476=>500,65477=>500,65478=>500,65479=>500,65482=>500,65483=>500,65484=>500,65485=>500, - 65486=>500,65487=>500,65490=>500,65491=>500,65492=>500,65493=>500,65494=>500,65495=>500,65498=>500,65499=>500,65500=>500,65504=>1000,65505=>1000,65506=>1000,65507=>1000,65508=>1000, - 65509=>1000,65510=>1000,65512=>500,65513=>500,65514=>500,65515=>500,65516=>500,65517=>500,65518=>500,65532=>1000,65533=>1000,19968=>1000,19969=>1000,19970=>1000,19971=>1000,19972=>1000, - 19973=>1000,19974=>1000,19975=>1000,19976=>1000,19977=>1000,19978=>1000,19979=>1000,19980=>1000,19981=>1000,19982=>1000,19983=>1000,19984=>1000,19985=>1000,19986=>1000,19987=>1000,19988=>1000, - 19989=>1000,19990=>1000,19991=>1000,19992=>1000,19993=>1000,19994=>1000,19995=>1000,19996=>1000,19997=>1000,19998=>1000,19999=>1000,20000=>1000,20001=>1000,20002=>1000,20003=>1000,20004=>1000, - 20005=>1000,20006=>1000,20007=>1000,20008=>1000,20009=>1000,20010=>1000,20011=>1000,20012=>1000,20013=>1000,20014=>1000,20015=>1000,20016=>1000,20017=>1000,20018=>1000,20019=>1000,20020=>1000, - 20021=>1000,20022=>1000,20023=>1000,20024=>1000,20025=>1000,20026=>1000,20027=>1000,20028=>1000,20029=>1000,20030=>1000,20031=>1000,20032=>1000,20033=>1000,20034=>1000,20035=>1000,20036=>1000, - 20037=>1000,20038=>1000,20039=>1000,20040=>1000,20041=>1000,20042=>1000,20043=>1000,20044=>1000,20045=>1000,20046=>1000,20047=>1000,20048=>1000,20049=>1000,20050=>1000,20051=>1000,20052=>1000, - 20053=>1000,20054=>1000,20055=>1000,20056=>1000,20057=>1000,20058=>1000,20059=>1000,20060=>1000,20061=>1000,20062=>1000,20063=>1000,20064=>1000,20065=>1000,20066=>1000,20067=>1000,20068=>1000, - 20069=>1000,20070=>1000,20071=>1000,20072=>1000,20073=>1000,20074=>1000,20075=>1000,20076=>1000,20077=>1000,20078=>1000,20079=>1000,20080=>1000,20081=>1000,20082=>1000,20083=>1000,20084=>1000, - 20085=>1000,20086=>1000,20087=>1000,20088=>1000,20089=>1000,20090=>1000,20091=>1000,20092=>1000,20093=>1000,20094=>1000,20095=>1000,20096=>1000,20097=>1000,20098=>1000,20099=>1000,20100=>1000, - 20101=>1000,20102=>1000,20103=>1000,20104=>1000,20105=>1000,20106=>1000,20107=>1000,20108=>1000,20109=>1000,20110=>1000,20111=>1000,20112=>1000,20113=>1000,20114=>1000,20115=>1000,20116=>1000, - 20117=>1000,20118=>1000,20119=>1000,20120=>1000,20121=>1000,20122=>1000,20123=>1000,20124=>1000,20125=>1000,20126=>1000,20127=>1000,20128=>1000,20129=>1000,20130=>1000,20131=>1000,20132=>1000, - 20133=>1000,20134=>1000,20135=>1000,20136=>1000,20137=>1000,20138=>1000,20139=>1000,20140=>1000,20141=>1000,20142=>1000,20143=>1000,20144=>1000,20145=>1000,20146=>1000,20147=>1000,20148=>1000, - 20149=>1000,20150=>1000,20151=>1000,20152=>1000,20153=>1000,20154=>1000,20155=>1000,20156=>1000,20157=>1000,20158=>1000,20159=>1000,20160=>1000,20161=>1000,20162=>1000,20163=>1000,20164=>1000, - 20165=>1000,20166=>1000,20167=>1000,20168=>1000,20169=>1000,20170=>1000,20171=>1000,20172=>1000,20173=>1000,20174=>1000,20175=>1000,20176=>1000,20177=>1000,20178=>1000,20179=>1000,20180=>1000, - 20181=>1000,20182=>1000,20183=>1000,20184=>1000,20185=>1000,20186=>1000,20187=>1000,20188=>1000,20189=>1000,20190=>1000,20191=>1000,20192=>1000,20193=>1000,20194=>1000,20195=>1000,20196=>1000, - 20197=>1000,20198=>1000,20199=>1000,20200=>1000,20201=>1000,20202=>1000,20203=>1000,20204=>1000,20205=>1000,20206=>1000,20207=>1000,20208=>1000,20209=>1000,20210=>1000,20211=>1000,20212=>1000, - 20213=>1000,20214=>1000,20215=>1000,20216=>1000,20217=>1000,20218=>1000,20219=>1000,20220=>1000,20221=>1000,20222=>1000,20223=>1000,20224=>1000,20225=>1000,20226=>1000,20227=>1000,20228=>1000, - 20229=>1000,20230=>1000,20231=>1000,20232=>1000,20233=>1000,20234=>1000,20235=>1000,20236=>1000,20237=>1000,20238=>1000,20239=>1000,20240=>1000,20241=>1000,20242=>1000,20243=>1000,20244=>1000, - 20245=>1000,20246=>1000,20247=>1000,20248=>1000,20249=>1000,20250=>1000,20251=>1000,20252=>1000,20253=>1000,20254=>1000,20255=>1000,20256=>1000,20257=>1000,20258=>1000,20259=>1000,20260=>1000, - 20261=>1000,20262=>1000,20263=>1000,20264=>1000,20265=>1000,20266=>1000,20267=>1000,20268=>1000,20269=>1000,20270=>1000,20271=>1000,20272=>1000,20273=>1000,20274=>1000,20275=>1000,20276=>1000, - 20277=>1000,20278=>1000,20279=>1000,20280=>1000,20281=>1000,20282=>1000,20283=>1000,20284=>1000,20285=>1000,20286=>1000,20287=>1000,20288=>1000,20289=>1000,20290=>1000,20291=>1000,20292=>1000, - 20293=>1000,20294=>1000,20295=>1000,20296=>1000,20297=>1000,20298=>1000,20299=>1000,20300=>1000,20301=>1000,20302=>1000,20303=>1000,20304=>1000,20305=>1000,20306=>1000,20307=>1000,20308=>1000, - 20309=>1000,20310=>1000,20311=>1000,20312=>1000,20313=>1000,20314=>1000,20315=>1000,20316=>1000,20317=>1000,20318=>1000,20319=>1000,20320=>1000,20321=>1000,20322=>1000,20323=>1000,20324=>1000, - 20325=>1000,20326=>1000,20327=>1000,20328=>1000,20329=>1000,20330=>1000,20331=>1000,20332=>1000,20333=>1000,20334=>1000,20335=>1000,20336=>1000,20337=>1000,20338=>1000,20339=>1000,20340=>1000, - 20341=>1000,20342=>1000,20343=>1000,20344=>1000,20345=>1000,20346=>1000,20347=>1000,20348=>1000,20349=>1000,20350=>1000,20351=>1000,20352=>1000,20353=>1000,20354=>1000,20355=>1000,20356=>1000, - 20357=>1000,20358=>1000,20359=>1000,20360=>1000,20361=>1000,20362=>1000,20363=>1000,20364=>1000,20365=>1000,20366=>1000,20367=>1000,20368=>1000,20369=>1000,20370=>1000,20371=>1000,20372=>1000, - 20373=>1000,20374=>1000,20375=>1000,20376=>1000,20377=>1000,20378=>1000,20379=>1000,20380=>1000,20381=>1000,20382=>1000,20383=>1000,20384=>1000,20385=>1000,20386=>1000,20387=>1000,20388=>1000, - 20389=>1000,20390=>1000,20391=>1000,20392=>1000,20393=>1000,20394=>1000,20395=>1000,20396=>1000,20397=>1000,20398=>1000,20399=>1000,20400=>1000,20401=>1000,20402=>1000,20403=>1000,20404=>1000, - 20405=>1000,20406=>1000,20407=>1000,20408=>1000,20409=>1000,20410=>1000,20411=>1000,20412=>1000,20413=>1000,20414=>1000,20415=>1000,20416=>1000,20417=>1000,20418=>1000,20419=>1000,20420=>1000, - 20421=>1000,20422=>1000,20423=>1000,20424=>1000,20425=>1000,20426=>1000,20427=>1000,20428=>1000,20429=>1000,20430=>1000,20431=>1000,20432=>1000,20433=>1000,20434=>1000,20435=>1000,20436=>1000, - 20437=>1000,20438=>1000,20439=>1000,20440=>1000,20441=>1000,20442=>1000,20443=>1000,20444=>1000,20445=>1000,20446=>1000,20447=>1000,20448=>1000,20449=>1000,20450=>1000,20451=>1000,20452=>1000, - 20453=>1000,20454=>1000,20455=>1000,20456=>1000,20457=>1000,20458=>1000,20459=>1000,20460=>1000,20461=>1000,20462=>1000,20463=>1000,20464=>1000,20465=>1000,20466=>1000,20467=>1000,20468=>1000, - 20469=>1000,20470=>1000,20471=>1000,20472=>1000,20473=>1000,20474=>1000,20475=>1000,20476=>1000,20477=>1000,20478=>1000,20479=>1000,20480=>1000,20481=>1000,20482=>1000,20483=>1000,20484=>1000, - 20485=>1000,20486=>1000,20487=>1000,20488=>1000,20489=>1000,20490=>1000,20491=>1000,20492=>1000,20493=>1000,20494=>1000,20495=>1000,20496=>1000,20497=>1000,20498=>1000,20499=>1000,20500=>1000, - 20501=>1000,20502=>1000,20503=>1000,20504=>1000,20505=>1000,20506=>1000,20507=>1000,20508=>1000,20509=>1000,20510=>1000,20511=>1000,20512=>1000,20513=>1000,20514=>1000,20515=>1000,20516=>1000, - 20517=>1000,20518=>1000,20519=>1000,20520=>1000,20521=>1000,20522=>1000,20523=>1000,20524=>1000,20525=>1000,20526=>1000,20527=>1000,20528=>1000,20529=>1000,20530=>1000,20531=>1000,20532=>1000, - 20533=>1000,20534=>1000,20535=>1000,20536=>1000,20537=>1000,20538=>1000,20539=>1000,20540=>1000,20541=>1000,20542=>1000,20543=>1000,20544=>1000,20545=>1000,20546=>1000,20547=>1000,20548=>1000, - 20549=>1000,20550=>1000,20551=>1000,20552=>1000,20553=>1000,20554=>1000,20555=>1000,20556=>1000,20557=>1000,20558=>1000,20559=>1000,20560=>1000,20561=>1000,20562=>1000,20563=>1000,20564=>1000, - 20565=>1000,20566=>1000,20567=>1000,20568=>1000,20569=>1000,20570=>1000,20571=>1000,20572=>1000,20573=>1000,20574=>1000,20575=>1000,20576=>1000,20577=>1000,20578=>1000,20579=>1000,20580=>1000, - 20581=>1000,20582=>1000,20583=>1000,20584=>1000,20585=>1000,20586=>1000,20587=>1000,20588=>1000,20589=>1000,20590=>1000,20591=>1000,20592=>1000,20593=>1000,20594=>1000,20595=>1000,20596=>1000, - 20597=>1000,20598=>1000,20599=>1000,20600=>1000,20601=>1000,20602=>1000,20603=>1000,20604=>1000,20605=>1000,20606=>1000,20607=>1000,20608=>1000,20609=>1000,20610=>1000,20611=>1000,20612=>1000, - 20613=>1000,20614=>1000,20615=>1000,20616=>1000,20617=>1000,20618=>1000,20619=>1000,20620=>1000,20621=>1000,20622=>1000,20623=>1000,20624=>1000,20625=>1000,20626=>1000,20627=>1000,20628=>1000, - 20629=>1000,20630=>1000,20631=>1000,20632=>1000,20633=>1000,20634=>1000,20635=>1000,20636=>1000,20637=>1000,20638=>1000,20639=>1000,20640=>1000,20641=>1000,20642=>1000,20643=>1000,20644=>1000, - 20645=>1000,20646=>1000,20647=>1000,20648=>1000,20649=>1000,20650=>1000,20651=>1000,20652=>1000,20653=>1000,20654=>1000,20655=>1000,20656=>1000,20657=>1000,20658=>1000,20659=>1000,20660=>1000, - 20661=>1000,20662=>1000,20663=>1000,20664=>1000,20665=>1000,20666=>1000,20667=>1000,20668=>1000,20669=>1000,20670=>1000,20671=>1000,20672=>1000,20673=>1000,20674=>1000,20675=>1000,20676=>1000, - 20677=>1000,20678=>1000,20679=>1000,20680=>1000,20681=>1000,20682=>1000,20683=>1000,20684=>1000,20685=>1000,20686=>1000,20687=>1000,20688=>1000,20689=>1000,20690=>1000,20691=>1000,20692=>1000, - 20693=>1000,20694=>1000,20695=>1000,20696=>1000,20697=>1000,20698=>1000,20699=>1000,20700=>1000,20701=>1000,20702=>1000,20703=>1000,20704=>1000,20705=>1000,20706=>1000,20707=>1000,20708=>1000, - 20709=>1000,20710=>1000,20711=>1000,20712=>1000,20713=>1000,20714=>1000,20715=>1000,20716=>1000,20717=>1000,20718=>1000,20719=>1000,20720=>1000,20721=>1000,20722=>1000,20723=>1000,20724=>1000, - 20725=>1000,20726=>1000,20727=>1000,20728=>1000,20729=>1000,20730=>1000,20731=>1000,20732=>1000,20733=>1000,20734=>1000,20735=>1000,20736=>1000,20737=>1000,20738=>1000,20739=>1000,20740=>1000, - 20741=>1000,20742=>1000,20743=>1000,20744=>1000,20745=>1000,20746=>1000,20747=>1000,20748=>1000,20749=>1000,20750=>1000,20751=>1000,20752=>1000,20753=>1000,20754=>1000,20755=>1000,20756=>1000, - 20757=>1000,20758=>1000,20759=>1000,20760=>1000,20761=>1000,20762=>1000,20763=>1000,20764=>1000,20765=>1000,20766=>1000,20767=>1000,20768=>1000,20769=>1000,20770=>1000,20771=>1000,20772=>1000, - 20773=>1000,20774=>1000,20775=>1000,20776=>1000,20777=>1000,20778=>1000,20779=>1000,20780=>1000,20781=>1000,20782=>1000,20783=>1000,20784=>1000,20785=>1000,20786=>1000,20787=>1000,20788=>1000, - 20789=>1000,20790=>1000,20791=>1000,20792=>1000,20793=>1000,20794=>1000,20795=>1000,20796=>1000,20797=>1000,20798=>1000,20799=>1000,20800=>1000,20801=>1000,20802=>1000,20803=>1000,20804=>1000, - 20805=>1000,20806=>1000,20807=>1000,20808=>1000,20809=>1000,20810=>1000,20811=>1000,20812=>1000,20813=>1000,20814=>1000,20815=>1000,20816=>1000,20817=>1000,20818=>1000,20819=>1000,20820=>1000, - 20821=>1000,20822=>1000,20823=>1000,20824=>1000,20825=>1000,20826=>1000,20827=>1000,20828=>1000,20829=>1000,20830=>1000,20831=>1000,20832=>1000,20833=>1000,20834=>1000,20835=>1000,20836=>1000, - 20837=>1000,20838=>1000,20839=>1000,20840=>1000,20841=>1000,20842=>1000,20843=>1000,20844=>1000,20845=>1000,20846=>1000,20847=>1000,20848=>1000,20849=>1000,20850=>1000,20851=>1000,20852=>1000, - 20853=>1000,20854=>1000,20855=>1000,20856=>1000,20857=>1000,20858=>1000,20859=>1000,20860=>1000,20861=>1000,20862=>1000,20863=>1000,20864=>1000,20865=>1000,20866=>1000,20867=>1000,20868=>1000, - 20869=>1000,20870=>1000,20871=>1000,20872=>1000,20873=>1000,20874=>1000,20875=>1000,20876=>1000,20877=>1000,20878=>1000,20879=>1000,20880=>1000,20881=>1000,20882=>1000,20883=>1000,20884=>1000, - 20885=>1000,20886=>1000,20887=>1000,20888=>1000,20889=>1000,20890=>1000,20891=>1000,20892=>1000,20893=>1000,20894=>1000,20895=>1000,20896=>1000,20897=>1000,20898=>1000,20899=>1000,20900=>1000, - 20901=>1000,20902=>1000,20903=>1000,20904=>1000,20905=>1000,20906=>1000,20907=>1000,20908=>1000,20909=>1000,20910=>1000,20911=>1000,20912=>1000,20913=>1000,20914=>1000,20915=>1000,20916=>1000, - 20917=>1000,20918=>1000,20919=>1000,20920=>1000,20921=>1000,20922=>1000,20923=>1000,20924=>1000,20925=>1000,20926=>1000,20927=>1000,20928=>1000,20929=>1000,20930=>1000,20931=>1000,20932=>1000, - 20933=>1000,20934=>1000,20935=>1000,20936=>1000,20937=>1000,20938=>1000,20939=>1000,20940=>1000,20941=>1000,20942=>1000,20943=>1000,20944=>1000,20945=>1000,20946=>1000,20947=>1000,20948=>1000, - 20949=>1000,20950=>1000,20951=>1000,20952=>1000,20953=>1000,20954=>1000,20955=>1000,20956=>1000,20957=>1000,20958=>1000,20959=>1000,20960=>1000,20961=>1000,20962=>1000,20963=>1000,20964=>1000, - 20965=>1000,20966=>1000,20967=>1000,20968=>1000,20969=>1000,20970=>1000,20971=>1000,20972=>1000,20973=>1000,20974=>1000,20975=>1000,20976=>1000,20977=>1000,20978=>1000,20979=>1000,20980=>1000, - 20981=>1000,20982=>1000,20983=>1000,20984=>1000,20985=>1000,20986=>1000,20987=>1000,20988=>1000,20989=>1000,20990=>1000,20991=>1000,20992=>1000,20993=>1000,20994=>1000,20995=>1000,20996=>1000, - 20997=>1000,20998=>1000,20999=>1000,21000=>1000,21001=>1000,21002=>1000,21003=>1000,21004=>1000,21005=>1000,21006=>1000,21007=>1000,21008=>1000,21009=>1000,21010=>1000,21011=>1000,21012=>1000, - 21013=>1000,21014=>1000,21015=>1000,21016=>1000,21017=>1000,21018=>1000,21019=>1000,21020=>1000,21021=>1000,21022=>1000,21023=>1000,21024=>1000,21025=>1000,21026=>1000,21027=>1000,21028=>1000, - 21029=>1000,21030=>1000,21031=>1000,21032=>1000,21033=>1000,21034=>1000,21035=>1000,21036=>1000,21037=>1000,21038=>1000,21039=>1000,21040=>1000,21041=>1000,21042=>1000,21043=>1000,21044=>1000, - 21045=>1000,21046=>1000,21047=>1000,21048=>1000,21049=>1000,21050=>1000,21051=>1000,21052=>1000,21053=>1000,21054=>1000,21055=>1000,21056=>1000,21057=>1000,21058=>1000,21059=>1000,21060=>1000, - 21061=>1000,21062=>1000,21063=>1000,21064=>1000,21065=>1000,21066=>1000,21067=>1000,21068=>1000,21069=>1000,21070=>1000,21071=>1000,21072=>1000,21073=>1000,21074=>1000,21075=>1000,21076=>1000, - 21077=>1000,21078=>1000,21079=>1000,21080=>1000,21081=>1000,21082=>1000,21083=>1000,21084=>1000,21085=>1000,21086=>1000,21087=>1000,21088=>1000,21089=>1000,21090=>1000,21091=>1000,21092=>1000, - 21093=>1000,21094=>1000,21095=>1000,21096=>1000,21097=>1000,21098=>1000,21099=>1000,21100=>1000,21101=>1000,21102=>1000,21103=>1000,21104=>1000,21105=>1000,21106=>1000,21107=>1000,21108=>1000, - 21109=>1000,21110=>1000,21111=>1000,21112=>1000,21113=>1000,21114=>1000,21115=>1000,21116=>1000,21117=>1000,21118=>1000,21119=>1000,21120=>1000,21121=>1000,21122=>1000,21123=>1000,21124=>1000, - 21125=>1000,21126=>1000,21127=>1000,21128=>1000,21129=>1000,21130=>1000,21131=>1000,21132=>1000,21133=>1000,21134=>1000,21135=>1000,21136=>1000,21137=>1000,21138=>1000,21139=>1000,21140=>1000, - 21141=>1000,21142=>1000,21143=>1000,21144=>1000,21145=>1000,21146=>1000,21147=>1000,21148=>1000,21149=>1000,21150=>1000,21151=>1000,21152=>1000,21153=>1000,21154=>1000,21155=>1000,21156=>1000, - 21157=>1000,21158=>1000,21159=>1000,21160=>1000,21161=>1000,21162=>1000,21163=>1000,21164=>1000,21165=>1000,21166=>1000,21167=>1000,21168=>1000,21169=>1000,21170=>1000,21171=>1000,21172=>1000, - 21173=>1000,21174=>1000,21175=>1000,21176=>1000,21177=>1000,21178=>1000,21179=>1000,21180=>1000,21181=>1000,21182=>1000,21183=>1000,21184=>1000,21185=>1000,21186=>1000,21187=>1000,21188=>1000, - 21189=>1000,21190=>1000,21191=>1000,21192=>1000,21193=>1000,21194=>1000,21195=>1000,21196=>1000,21197=>1000,21198=>1000,21199=>1000,21200=>1000,21201=>1000,21202=>1000,21203=>1000,21204=>1000, - 21205=>1000,21206=>1000,21207=>1000,21208=>1000,21209=>1000,21210=>1000,21211=>1000,21212=>1000,21213=>1000,21214=>1000,21215=>1000,21216=>1000,21217=>1000,21218=>1000,21219=>1000,21220=>1000, - 21221=>1000,21222=>1000,21223=>1000,21224=>1000,21225=>1000,21226=>1000,21227=>1000,21228=>1000,21229=>1000,21230=>1000,21231=>1000,21232=>1000,21233=>1000,21234=>1000,21235=>1000,21236=>1000, - 21237=>1000,21238=>1000,21239=>1000,21240=>1000,21241=>1000,21242=>1000,21243=>1000,21244=>1000,21245=>1000,21246=>1000,21247=>1000,21248=>1000,21249=>1000,21250=>1000,21251=>1000,21252=>1000, - 21253=>1000,21254=>1000,21255=>1000,21256=>1000,21257=>1000,21258=>1000,21259=>1000,21260=>1000,21261=>1000,21262=>1000,21263=>1000,21264=>1000,21265=>1000,21266=>1000,21267=>1000,21268=>1000, - 21269=>1000,21270=>1000,21271=>1000,21272=>1000,21273=>1000,21274=>1000,21275=>1000,21276=>1000,21277=>1000,21278=>1000,21279=>1000,21280=>1000,21281=>1000,21282=>1000,21283=>1000,21284=>1000, - 21285=>1000,21286=>1000,21287=>1000,21288=>1000,21289=>1000,21290=>1000,21291=>1000,21292=>1000,21293=>994,21294=>1000,21295=>1000,21296=>1000,21297=>1000,21298=>1000,21299=>1000,21300=>1000, - 21301=>1000,21302=>1000,21303=>1000,21304=>1000,21305=>1000,21306=>1000,21307=>1000,21308=>1000,21309=>1000,21310=>1000,21311=>1000,21312=>1000,21313=>1000,21314=>1000,21315=>1000,21316=>1000, - 21317=>1000,21318=>1000,21319=>1000,21320=>1000,21321=>1000,21322=>1000,21323=>1000,21324=>1000,21325=>1000,21326=>1000,21327=>1000,21328=>1000,21329=>1000,21330=>1000,21331=>1000,21332=>1000, - 21333=>1000,21334=>1000,21335=>1000,21336=>1000,21337=>1000,21338=>1000,21339=>1000,21340=>1000,21341=>1000,21342=>1000,21343=>1000,21344=>1000,21345=>1000,21346=>1000,21347=>1000,21348=>1000, - 21349=>1000,21350=>1000,21351=>1000,21352=>1000,21353=>1000,21354=>1000,21355=>1000,21356=>1000,21357=>1000,21358=>1000,21359=>1000,21360=>1000,21361=>1000,21362=>1000,21363=>1000,21364=>1000, - 21365=>1000,21366=>1000,21367=>1000,21368=>1000,21369=>1000,21370=>1000,21371=>1000,21372=>1000,21373=>1000,21374=>1000,21375=>1000,21376=>1000,21377=>1000,21378=>1000,21379=>1000,21380=>1000, - 21381=>1000,21382=>1000,21383=>1000,21384=>1000,21385=>1000,21386=>1000,21387=>1000,21388=>1000,21389=>1000,21390=>1000,21391=>1000,21392=>1000,21393=>1000,21394=>1000,21395=>1000,21396=>1000, - 21397=>1000,21398=>1000,21399=>1000,21400=>1000,21401=>1000,21402=>1000,21403=>1000,21404=>1000,21405=>1000,21406=>1000,21407=>1000,21408=>1000,21409=>1000,21410=>1000,21411=>1000,21412=>1000, - 21413=>1000,21414=>1000,21415=>1000,21416=>1000,21417=>1000,21418=>1000,21419=>1000,21420=>1000,21421=>1000,21422=>1000,21423=>1000,21424=>1000,21425=>1000,21426=>1000,21427=>1000,21428=>1000, - 21429=>1000,21430=>1000,21431=>1000,21432=>1000,21433=>1000,21434=>1000,21435=>1000,21436=>1000,21437=>1000,21438=>1000,21439=>1000,21440=>1000,21441=>1000,21442=>1000,21443=>1000,21444=>1000, - 21445=>1000,21446=>1000,21447=>1000,21448=>1000,21449=>1000,21450=>1000,21451=>1000,21452=>1000,21453=>1000,21454=>1000,21455=>1000,21456=>1000,21457=>1000,21458=>1000,21459=>1000,21460=>1000, - 21461=>1000,21462=>1000,21463=>1000,21464=>1000,21465=>1000,21466=>1000,21467=>1000,21468=>1000,21469=>1000,21470=>1000,21471=>1000,21472=>1000,21473=>1000,21474=>1000,21475=>1000,21476=>1000, - 21477=>1000,21478=>1000,21479=>1000,21480=>1000,21481=>1000,21482=>1000,21483=>1000,21484=>1000,21485=>1000,21486=>1000,21487=>1000,21488=>1000,21489=>1000,21490=>1000,21491=>1000,21492=>1000, - 21493=>1000,21494=>1000,21495=>1000,21496=>1000,21497=>1000,21498=>1000,21499=>1000,21500=>1000,21501=>1000,21502=>1000,21503=>1000,21504=>1000,21505=>1000,21506=>1000,21507=>1000,21508=>1000, - 21509=>1000,21510=>1000,21511=>1000,21512=>1000,21513=>1000,21514=>1000,21515=>1000,21516=>1000,21517=>1000,21518=>1000,21519=>1000,21520=>1000,21521=>1000,21522=>1000,21523=>1000,21524=>1000, - 21525=>1000,21526=>1000,21527=>1000,21528=>1000,21529=>1000,21530=>1000,21531=>1000,21532=>1000,21533=>1000,21534=>1000,21535=>1000,21536=>1000,21537=>1000,21538=>1000,21539=>1000,21540=>1000, - 21541=>1000,21542=>1000,21543=>1000,21544=>1000,21545=>1000,21546=>1000,21547=>1000,21548=>1000,21549=>1000,21550=>1000,21551=>1000,21552=>1000,21553=>1000,21554=>1000,21555=>1000,21556=>1000, - 21557=>1000,21558=>1000,21559=>1000,21560=>1000,21561=>1000,21562=>1000,21563=>1000,21564=>1000,21565=>1000,21566=>1000,21567=>1000,21568=>1000,21569=>1000,21570=>1000,21571=>1000,21572=>1000, - 21573=>1000,21574=>1000,21575=>1000,21576=>1000,21577=>1000,21578=>1000,21579=>1000,21580=>1000,21581=>1000,21582=>1000,21583=>1000,21584=>1000,21585=>1000,21586=>1000,21587=>1000,21588=>1000, - 21589=>1000,21590=>1000,21591=>1000,21592=>1000,21593=>1000,21594=>1000,21595=>1000,21596=>1000,21597=>1000,21598=>1000,21599=>1000,21600=>1000,21601=>1000,21602=>1000,21603=>1000,21604=>1000, - 21605=>1000,21606=>1000,21607=>1000,21608=>1000,21609=>1000,21610=>1000,21611=>1000,21612=>1000,21613=>1000,21614=>1000,21615=>1000,21616=>1000,21617=>1000,21618=>1000,21619=>1000,21620=>1000, - 21621=>1000,21622=>1000,21623=>1000,21624=>1000,21625=>1000,21626=>1000,21627=>1000,21628=>1000,21629=>1000,21630=>1000,21631=>1000,21632=>1000,21633=>1000,21634=>1000,21635=>1000,21636=>1000, - 21637=>1000,21638=>1000,21639=>1000,21640=>1000,21641=>1000,21642=>1000,21643=>1000,21644=>1000,21645=>1000,21646=>1000,21647=>1000,21648=>1000,21649=>1000,21650=>1000,21651=>1000,21652=>1000, - 21653=>1000,21654=>1000,21655=>1000,21656=>1000,21657=>1000,21658=>1000,21659=>1000,21660=>1000,21661=>1000,21662=>1000,21663=>1000,21664=>1000,21665=>1000,21666=>1000,21667=>1000,21668=>1000, - 21669=>1000,21670=>1000,21671=>1000,21672=>1000,21673=>1000,21674=>1000,21675=>1000,21676=>1000,21677=>1000,21678=>1000,21679=>1000,21680=>1000,21681=>1000,21682=>1000,21683=>1000,21684=>1000, - 21685=>1000,21686=>1000,21687=>1000,21688=>1000,21689=>1000,21690=>1000,21691=>1000,21692=>1000,21693=>1000,21694=>1000,21695=>1000,21696=>1000,21697=>1000,21698=>1000,21699=>1000,21700=>1000, - 21701=>1000,21702=>1000,21703=>1000,21704=>1000,21705=>1000,21706=>1000,21707=>1000,21708=>1000,21709=>1000,21710=>1000,21711=>1000,21712=>1000,21713=>1000,21714=>1000,21715=>1000,21716=>1000, - 21717=>1000,21718=>1000,21719=>1000,21720=>1000,21721=>1000,21722=>1000,21723=>1000,21724=>1000,21725=>1000,21726=>1000,21727=>1000,21728=>1000,21729=>1000,21730=>1000,21731=>1000,21732=>1000, - 21733=>1000,21734=>1000,21735=>1000,21736=>1000,21737=>1000,21738=>1000,21739=>1000,21740=>1000,21741=>1000,21742=>1000,21743=>1000,21744=>1000,21745=>1000,21746=>1000,21747=>1000,21748=>1000, - 21749=>1000,21750=>1000,21751=>1000,21752=>1000,21753=>1000,21754=>1000,21755=>1000,21756=>1000,21757=>1000,21758=>1000,21759=>1000,21760=>1000,21761=>1000,21762=>1000,21763=>1000,21764=>1000, - 21765=>1000,21766=>1000,21767=>1000,21768=>1000,21769=>1000,21770=>1000,21771=>1000,21772=>1000,21773=>1000,21774=>1000,21775=>1000,21776=>1000,21777=>1000,21778=>1000,21779=>1000,21780=>1000, - 21781=>1000,21782=>1000,21783=>1000,21784=>1000,21785=>1000,21786=>1000,21787=>1000,21788=>1000,21789=>1000,21790=>1000,21791=>1000,21792=>1000,21793=>1000,21794=>1000,21795=>1000,21796=>1000, - 21797=>1000,21798=>1000,21799=>1000,21800=>1000,21801=>1000,21802=>1000,21803=>1000,21804=>1000,21805=>1000,21806=>1000,21807=>1000,21808=>1000,21809=>1000,21810=>1000,21811=>1000,21812=>1000, - 21813=>1000,21814=>1000,21815=>1000,21816=>1000,21817=>1000,21818=>1000,21819=>1000,21820=>1000,21821=>1000,21822=>1000,21823=>1000,21824=>1000,21825=>1000,21826=>1000,21827=>1000,21828=>1000, - 21829=>1000,21830=>1000,21831=>1000,21832=>1000,21833=>1000,21834=>1000,21835=>1000,21836=>1000,21837=>1000,21838=>1000,21839=>1000,21840=>1000,21841=>1000,21842=>1000,21843=>1000,21844=>1000, - 21845=>1000,21846=>1000,21847=>1000,21848=>1000,21849=>1000,21850=>1000,21851=>1000,21852=>1000,21853=>1000,21854=>1000,21855=>1000,21856=>1000,21857=>1000,21858=>1000,21859=>1000,21860=>1000, - 21861=>1000,21862=>1000,21863=>1000,21864=>1000,21865=>1000,21866=>1000,21867=>1000,21868=>1000,21869=>1000,21870=>1000,21871=>1000,21872=>1000,21873=>1000,21874=>1000,21875=>1000,21876=>1000, - 21877=>1000,21878=>1000,21879=>1000,21880=>1000,21881=>1000,21882=>1000,21883=>1000,21884=>1000,21885=>1000,21886=>1000,21887=>1000,21888=>1000,21889=>1000,21890=>1000,21891=>1000,21892=>1000, - 21893=>1000,21894=>1000,21895=>1000,21896=>1000,21897=>1000,21898=>1000,21899=>1000,21900=>1000,21901=>1000,21902=>1000,21903=>1000,21904=>1000,21905=>1000,21906=>1000,21907=>1000,21908=>1000, - 21909=>1000,21910=>1000,21911=>1000,21912=>1000,21913=>1000,21914=>1000,21915=>1000,21916=>1000,21917=>1000,21918=>1000,21919=>1000,21920=>1000,21921=>1000,21922=>1000,21923=>1000,21924=>1000, - 21925=>1000,21926=>1000,21927=>1000,21928=>1000,21929=>1000,21930=>1000,21931=>1000,21932=>1000,21933=>1000,21934=>1000,21935=>1000,21936=>1000,21937=>1000,21938=>1000,21939=>1000,21940=>1000, - 21941=>1000,21942=>1000,21943=>1000,21944=>1000,21945=>1000,21946=>1000,21947=>1000,21948=>1000,21949=>1000,21950=>1000,21951=>1000,21952=>1000,21953=>1000,21954=>1000,21955=>1000,21956=>1000, - 21957=>1000,21958=>1000,21959=>1000,21960=>1000,21961=>1000,21962=>1000,21963=>1000,21964=>1000,21965=>1000,21966=>1000,21967=>1000,21968=>1000,21969=>1000,21970=>1000,21971=>1000,21972=>1000, - 21973=>1000,21974=>1000,21975=>1000,21976=>1000,21977=>1000,21978=>1000,21979=>1000,21980=>1000,21981=>1000,21982=>1000,21983=>1000,21984=>1000,21985=>1000,21986=>1000,21987=>1000,21988=>1000, - 21989=>1000,21990=>1000,21991=>1000,21992=>1000,21993=>1000,21994=>1000,21995=>1000,21996=>1000,21997=>1000,21998=>1000,21999=>1000,22000=>1000,22001=>1000,22002=>1000,22003=>1000,22004=>1000, - 22005=>1000,22006=>1000,22007=>1000,22008=>1000,22009=>1000,22010=>1000,22011=>1000,22012=>1000,22013=>1000,22014=>1000,22015=>1000,22016=>1000,22017=>1000,22018=>1000,22019=>1000,22020=>1000, - 22021=>1000,22022=>1000,22023=>1000,22024=>1000,22025=>1000,22026=>1000,22027=>1000,22028=>1000,22029=>1000,22030=>1000,22031=>1000,22032=>1000,22033=>1000,22034=>1000,22035=>1000,22036=>1000, - 22037=>1000,22038=>1000,22039=>1000,22040=>1000,22041=>1000,22042=>1000,22043=>1000,22044=>1000,22045=>1000,22046=>1000,22047=>1000,22048=>1000,22049=>1000,22050=>1000,22051=>1000,22052=>1000, - 22053=>1000,22054=>1000,22055=>1000,22056=>1000,22057=>1000,22058=>1000,22059=>1000,22060=>1000,22061=>1000,22062=>1000,22063=>1000,22064=>1000,22065=>1000,22066=>1000,22067=>1000,22068=>1000, - 22069=>1000,22070=>1000,22071=>1000,22072=>1000,22073=>1000,22074=>1000,22075=>1000,22076=>1000,22077=>1000,22078=>1000,22079=>1000,22080=>1000,22081=>1000,22082=>1000,22083=>1000,22084=>1000, - 22085=>1000,22086=>1000,22087=>1000,22088=>1000,22089=>1000,22090=>1000,22091=>1000,22092=>1000,22093=>1000,22094=>1000,22095=>1000,22096=>1000,22097=>1000,22098=>1000,22099=>1000,22100=>1000, - 22101=>1000,22102=>1000,22103=>1000,22104=>1000,22105=>1000,22106=>1000,22107=>1000,22108=>1000,22109=>1000,22110=>1000,22111=>1000,22112=>1000,22113=>1000,22114=>1000,22115=>1000,22116=>1000, - 22117=>1000,22118=>1000,22119=>1000,22120=>1000,22121=>1000,22122=>1000,22123=>1000,22124=>1000,22125=>1000,22126=>1000,22127=>1000,22128=>1000,22129=>1000,22130=>1000,22131=>1000,22132=>1000, - 22133=>1000,22134=>1000,22135=>1000,22136=>1000,22137=>1000,22138=>1000,22139=>1000,22140=>1000,22141=>1000,22142=>1000,22143=>1000,22144=>1000,22145=>1000,22146=>1000,22147=>1000,22148=>1000, - 22149=>1000,22150=>1000,22151=>1000,22152=>1000,22153=>1000,22154=>1000,22155=>1000,22156=>1000,22157=>1000,22158=>1000,22159=>1000,22160=>1000,22161=>1000,22162=>1000,22163=>1000,22164=>1000, - 22165=>1000,22166=>1000,22167=>1000,22168=>1000,22169=>1000,22170=>1000,22171=>1000,22172=>1000,22173=>1000,22174=>1000,22175=>1000,22176=>1000,22177=>1000,22178=>1000,22179=>1000,22180=>1000, - 22181=>1000,22182=>1000,22183=>1000,22184=>1000,22185=>1000,22186=>1000,22187=>1000,22188=>1000,22189=>1000,22190=>1000,22191=>1000,22192=>1000,22193=>1000,22194=>1000,22195=>1000,22196=>1000, - 22197=>1000,22198=>1000,22199=>1000,22200=>1000,22201=>1000,22202=>1000,22203=>1000,22204=>1000,22205=>1000,22206=>1000,22207=>1000,22208=>1000,22209=>1000,22210=>1000,22211=>1000,22212=>1000, - 22213=>1000,22214=>1000,22215=>1000,22216=>1000,22217=>1000,22218=>1000,22219=>1000,22220=>1000,22221=>1000,22222=>1000,22223=>1000,22224=>1000,22225=>1000,22226=>1000,22227=>1000,22228=>1000, - 22229=>1000,22230=>1000,22231=>1000,22232=>1000,22233=>1000,22234=>1000,22235=>1000,22236=>1000,22237=>1000,22238=>1000,22239=>1000,22240=>1000,22241=>1000,22242=>1000,22243=>1000,22244=>1000, - 22245=>1000,22246=>1000,22247=>1000,22248=>1000,22249=>1000,22250=>1000,22251=>1000,22252=>1000,22253=>1000,22254=>1000,22255=>1000,22256=>1000,22257=>1000,22258=>1000,22259=>1000,22260=>1000, - 22261=>1000,22262=>1000,22263=>1000,22264=>1000,22265=>1000,22266=>1000,22267=>1000,22268=>1000,22269=>1000,22270=>1000,22271=>1000,22272=>1000,22273=>1000,22274=>1000,22275=>1000,22276=>1000, - 22277=>1000,22278=>1000,22279=>1000,22280=>1000,22281=>1000,22282=>1000,22283=>1000,22284=>1000,22285=>1000,22286=>1000,22287=>1000,22288=>1000,22289=>1000,22290=>1000,22291=>1000,22292=>1000, - 22293=>1000,22294=>1000,22295=>1000,22296=>1000,22297=>1000,22298=>1000,22299=>1000,22300=>1000,22301=>1000,22302=>1000,22303=>1000,22304=>1000,22305=>1000,22306=>1000,22307=>1000,22308=>1000, - 22309=>1000,22310=>1000,22311=>1000,22312=>1000,22313=>1000,22314=>1000,22315=>1000,22316=>1000,22317=>1000,22318=>1000,22319=>1000,22320=>1000,22321=>1000,22322=>1000,22323=>1000,22324=>1000, - 22325=>1000,22326=>1000,22327=>1000,22328=>1000,22329=>1000,22330=>1000,22331=>1000,22332=>1000,22333=>1000,22334=>1000,22335=>1000,22336=>1000,22337=>1000,22338=>1000,22339=>1000,22340=>1000, - 22341=>1000,22342=>1000,22343=>1000,22344=>1000,22345=>1000,22346=>1000,22347=>1000,22348=>1000,22349=>1000,22350=>1000,22351=>1000,22352=>1000,22353=>1000,22354=>1000,22355=>1000,22356=>1000, - 22357=>1000,22358=>1000,22359=>1000,22360=>1000,22361=>1000,22362=>1000,22363=>1000,22364=>1000,22365=>1000,22366=>1000,22367=>1000,22368=>1000,22369=>1000,22370=>1000,22371=>1000,22372=>1000, - 22373=>1000,22374=>1000,22375=>1000,22376=>1000,22377=>1000,22378=>1000,22379=>1000,22380=>1000,22381=>1000,22382=>1000,22383=>1000,22384=>1000,22385=>1000,22386=>1000,22387=>1000,22388=>1000, - 22389=>1000,22390=>1000,22391=>1000,22392=>1000,22393=>1000,22394=>1000,22395=>1000,22396=>1000,22397=>1000,22398=>1000,22399=>1000,22400=>1000,22401=>1000,22402=>1000,22403=>1000,22404=>1000, - 22405=>1000,22406=>1000,22407=>1000,22408=>1000,22409=>1000,22410=>1000,22411=>1000,22412=>1000,22413=>1000,22414=>1000,22415=>1000,22416=>1000,22417=>1000,22418=>1000,22419=>1000,22420=>1000, - 22421=>1000,22422=>1000,22423=>1000,22424=>1000,22425=>1000,22426=>1000,22427=>1000,22428=>1000,22429=>1000,22430=>1000,22431=>1000,22432=>1000,22433=>1000,22434=>1000,22435=>1000,22436=>1000, - 22437=>1000,22438=>1000,22439=>1000,22440=>1000,22441=>1000,22442=>1000,22443=>1000,22444=>1000,22445=>1000,22446=>1000,22447=>1000,22448=>1000,22449=>1000,22450=>1000,22451=>1000,22452=>1000, - 22453=>1000,22454=>1000,22455=>1000,22456=>1000,22457=>1000,22458=>1000,22459=>1000,22460=>1000,22461=>1000,22462=>1000,22463=>1000,22464=>1000,22465=>1000,22466=>1000,22467=>1000,22468=>1000, - 22469=>1000,22470=>1000,22471=>1000,22472=>1000,22473=>1000,22474=>1000,22475=>1000,22476=>1000,22477=>1000,22478=>1000,22479=>1000,22480=>1000,22481=>1000,22482=>1000,22483=>1000,22484=>1000, - 22485=>1000,22486=>1000,22487=>1000,22488=>1000,22489=>1000,22490=>1000,22491=>1000,22492=>1000,22493=>1000,22494=>1000,22495=>1000,22496=>1000,22497=>1000,22498=>1000,22499=>1000,22500=>1000, - 22501=>1000,22502=>1000,22503=>1000,22504=>1000,22505=>1000,22506=>1000,22507=>1000,22508=>1000,22509=>1000,22510=>1000,22511=>1000,22512=>1000,22513=>1000,22514=>1000,22515=>1000,22516=>1000, - 22517=>1000,22518=>1000,22519=>1000,22520=>1000,22521=>1000,22522=>1000,22523=>1000,22524=>1000,22525=>1000,22526=>1000,22527=>1000,22528=>1000,22529=>1000,22530=>1000,22531=>1000,22532=>1000, - 22533=>1000,22534=>1000,22535=>1000,22536=>1000,22537=>1000,22538=>1000,22539=>1000,22540=>1000,22541=>1000,22542=>1000,22543=>1000,22544=>1000,22545=>1000,22546=>1000,22547=>1000,22548=>1000, - 22549=>1000,22550=>1000,22551=>1000,22552=>1000,22553=>1000,22554=>1000,22555=>1000,22556=>1000,22557=>1000,22558=>1000,22559=>1000,22560=>1000,22561=>1000,22562=>1000,22563=>1000,22564=>1000, - 22565=>1000,22566=>1000,22567=>1000,22568=>1000,22569=>1000,22570=>1000,22571=>1000,22572=>1000,22573=>1000,22574=>1000,22575=>1000,22576=>1000,22577=>1000,22578=>1000,22579=>1000,22580=>1000, - 22581=>1000,22582=>1000,22583=>1000,22584=>1000,22585=>1000,22586=>1000,22587=>1000,22588=>1000,22589=>1000,22590=>1000,22591=>1000,22592=>1000,22593=>1000,22594=>1000,22595=>1000,22596=>1000, - 22597=>1000,22598=>1000,22599=>1000,22600=>1000,22601=>1000,22602=>1000,22603=>1000,22604=>1000,22605=>1000,22606=>1000,22607=>1000,22608=>1000,22609=>1000,22610=>1000,22611=>1000,22612=>1000, - 22613=>1000,22614=>1000,22615=>1000,22616=>1000,22617=>1000,22618=>1000,22619=>1000,22620=>1000,22621=>1000,22622=>1000,22623=>1000,22624=>1000,22625=>1000,22626=>1000,22627=>1000,22628=>1000, - 22629=>1000,22630=>1000,22631=>1000,22632=>1000,22633=>1000,22634=>1000,22635=>1000,22636=>1000,22637=>1000,22638=>1000,22639=>1000,22640=>1000,22641=>1000,22642=>1000,22643=>1000,22644=>1000, - 22645=>1000,22646=>1000,22647=>1000,22648=>1000,22649=>1000,22650=>1000,22651=>1000,22652=>1000,22653=>1000,22654=>1000,22655=>1000,22656=>1000,22657=>1000,22658=>1000,22659=>1000,22660=>1000, - 22661=>1000,22662=>1000,22663=>1000,22664=>1000,22665=>1000,22666=>1000,22667=>1000,22668=>1000,22669=>1000,22670=>1000,22671=>1000,22672=>1000,22673=>1000,22674=>1000,22675=>1000,22676=>1000, - 22677=>1000,22678=>1000,22679=>1000,22680=>1000,22681=>1000,22682=>1000,22683=>1000,22684=>1000,22685=>1000,22686=>1000,22687=>1000,22688=>1000,22689=>1000,22690=>1000,22691=>1000,22692=>1000, - 22693=>1000,22694=>1000,22695=>1000,22696=>1000,22697=>1000,22698=>1000,22699=>1000,22700=>1000,22701=>1000,22702=>1000,22703=>1000,22704=>1000,22705=>1000,22706=>1000,22707=>1000,22708=>1000, - 22709=>1000,22710=>1000,22711=>1000,22712=>1000,22713=>1000,22714=>1000,22715=>1000,22716=>1000,22717=>1000,22718=>1000,22719=>1000,22720=>1000,22721=>1000,22722=>1000,22723=>1000,22724=>1000, - 22725=>1000,22726=>1000,22727=>1000,22728=>1000,22729=>1000,22730=>1000,22731=>1000,22732=>1000,22733=>1000,22734=>1000,22735=>1000,22736=>1000,22737=>1000,22738=>1000,22739=>1000,22740=>1000, - 22741=>1000,22742=>1000,22743=>1000,22744=>1000,22745=>1000,22746=>1000,22747=>1000,22748=>1000,22749=>1000,22750=>1000,22751=>1000,22752=>1000,22753=>1000,22754=>1000,22755=>1000,22756=>1000, - 22757=>1000,22758=>1000,22759=>1000,22760=>1000,22761=>1000,22762=>1000,22763=>1000,22764=>1000,22765=>1000,22766=>1000,22767=>1000,22768=>1000,22769=>1000,22770=>1000,22771=>1000,22772=>1000, - 22773=>1000,22774=>1000,22775=>1000,22776=>1000,22777=>1000,22778=>1000,22779=>1000,22780=>1000,22781=>1000,22782=>1000,22783=>1000,22784=>1000,22785=>1000,22786=>1000,22787=>1000,22788=>1000, - 22789=>1000,22790=>1000,22791=>1000,22792=>1000,22793=>1000,22794=>1000,22795=>1000,22796=>1000,22797=>1000,22798=>1000,22799=>1000,22800=>1000,22801=>1000,22802=>1000,22803=>1000,22804=>1000, - 22805=>1000,22806=>1000,22807=>1000,22808=>1000,22809=>1000,22810=>1000,22811=>1000,22812=>1000,22813=>1000,22814=>1000,22815=>1000,22816=>1000,22817=>1000,22818=>1000,22819=>1000,22820=>1000, - 22821=>1000,22822=>1000,22823=>1000,22824=>1000,22825=>1000,22826=>1000,22827=>1000,22828=>1000,22829=>1000,22830=>1000,22831=>1000,22832=>1000,22833=>1000,22834=>1000,22835=>1000,22836=>1000, - 22837=>1000,22838=>1000,22839=>1000,22840=>1000,22841=>1000,22842=>1000,22843=>1000,22844=>1000,22845=>1000,22846=>1000,22847=>1000,22848=>1000,22849=>1000,22850=>1000,22851=>1000,22852=>1000, - 22853=>1000,22854=>1000,22855=>1000,22856=>1000,22857=>1000,22858=>1000,22859=>1000,22860=>1000,22861=>1000,22862=>1000,22863=>1000,22864=>1000,22865=>1000,22866=>1000,22867=>1000,22868=>1000, - 22869=>1000,22870=>1000,22871=>1000,22872=>1000,22873=>1000,22874=>1000,22875=>1000,22876=>1000,22877=>1000,22878=>1000,22879=>1000,22880=>1000,22881=>1000,22882=>1000,22883=>1000,22884=>1000, - 22885=>1000,22886=>1000,22887=>1000,22888=>1000,22889=>1000,22890=>1000,22891=>1000,22892=>1000,22893=>1000,22894=>1000,22895=>1000,22896=>1000,22897=>1000,22898=>1000,22899=>1000,22900=>1000, - 22901=>1000,22902=>1000,22903=>1000,22904=>1000,22905=>1000,22906=>1000,22907=>1000,22908=>1000,22909=>1000,22910=>1000,22911=>1000,22912=>1000,22913=>1000,22914=>1000,22915=>1000,22916=>1000, - 22917=>1000,22918=>1000,22919=>1000,22920=>1000,22921=>1000,22922=>1000,22923=>1000,22924=>1000,22925=>1000,22926=>1000,22927=>1000,22928=>1000,22929=>1000,22930=>1000,22931=>1000,22932=>1000, - 22933=>1000,22934=>1000,22935=>1000,22936=>1000,22937=>1000,22938=>1000,22939=>1000,22940=>1000,22941=>1000,22942=>1000,22943=>1000,22944=>1000,22945=>1000,22946=>1000,22947=>1000,22948=>1000, - 22949=>1000,22950=>1000,22951=>1000,22952=>1000,22953=>1000,22954=>1000,22955=>1000,22956=>1000,22957=>1000,22958=>1000,22959=>1000,22960=>1000,22961=>1000,22962=>1000,22963=>1000,22964=>1000, - 22965=>1000,22966=>1000,22967=>1000,22968=>1000,22969=>1000,22970=>1000,22971=>1000,22972=>1000,22973=>1000,22974=>1000,22975=>1000,22976=>1000,22977=>1000,22978=>1000,22979=>1000,22980=>1000, - 22981=>1000,22982=>1000,22983=>1000,22984=>1000,22985=>1000,22986=>1000,22987=>1000,22988=>1000,22989=>1000,22990=>1000,22991=>1000,22992=>1000,22993=>1000,22994=>1000,22995=>1000,22996=>1000, - 22997=>1000,22998=>1000,22999=>1000,23000=>1000,23001=>1000,23002=>1000,23003=>1000,23004=>1000,23005=>1000,23006=>1000,23007=>1000,23008=>1000,23009=>1000,23010=>1000,23011=>1000,23012=>1000, - 23013=>1000,23014=>1000,23015=>1000,23016=>1000,23017=>1000,23018=>1000,23019=>1000,23020=>1000,23021=>1000,23022=>1000,23023=>1000,23024=>1000,23025=>1000,23026=>1000,23027=>1000,23028=>1000, - 23029=>1000,23030=>1000,23031=>1000,23032=>1000,23033=>1000,23034=>1000,23035=>1000,23036=>1000,23037=>1000,23038=>1000,23039=>1000,23040=>1000,23041=>1000,23042=>1000,23043=>1000,23044=>1000, - 23045=>1000,23046=>1000,23047=>1000,23048=>1000,23049=>1000,23050=>1000,23051=>1000,23052=>1000,23053=>1000,23054=>1000,23055=>1000,23056=>1000,23057=>1000,23058=>1000,23059=>1000,23060=>1000, - 23061=>1000,23062=>1000,23063=>1000,23064=>1000,23065=>1000,23066=>1000,23067=>1000,23068=>1000,23069=>1000,23070=>1000,23071=>1000,23072=>1000,23073=>1000,23074=>1000,23075=>1000,23076=>1000, - 23077=>1000,23078=>1000,23079=>1000,23080=>1000,23081=>1000,23082=>1000,23083=>1000,23084=>1000,23085=>1000,23086=>1000,23087=>1000,23088=>1000,23089=>1000,23090=>1000,23091=>1000,23092=>1000, - 23093=>1000,23094=>1000,23095=>1000,23096=>1000,23097=>1000,23098=>1000,23099=>1000,23100=>1000,23101=>1000,23102=>1000,23103=>1000,23104=>1000,23105=>1000,23106=>1000,23107=>1000,23108=>1000, - 23109=>1000,23110=>1000,23111=>1000,23112=>1000,23113=>1000,23114=>1000,23115=>1000,23116=>1000,23117=>1000,23118=>1000,23119=>1000,23120=>1000,23121=>1000,23122=>1000,23123=>1000,23124=>1000, - 23125=>1000,23126=>1000,23127=>1000,23128=>1000,23129=>1000,23130=>1000,23131=>1000,23132=>1000,23133=>1000,23134=>1000,23135=>1000,23136=>1000,23137=>1000,23138=>1000,23139=>1000,23140=>1000, - 23141=>1000,23142=>1000,23143=>1000,23144=>1000,23145=>1000,23146=>1000,23147=>1000,23148=>1000,23149=>1000,23150=>1000,23151=>1000,23152=>1000,23153=>1000,23154=>1000,23155=>1000,23156=>1000, - 23157=>1000,23158=>1000,23159=>1000,23160=>1000,23161=>1000,23162=>1000,23163=>1000,23164=>1000,23165=>1000,23166=>1000,23167=>1000,23168=>1000,23169=>1000,23170=>1000,23171=>1000,23172=>1000, - 23173=>1000,23174=>1000,23175=>1000,23176=>1000,23177=>1000,23178=>1000,23179=>1000,23180=>1000,23181=>1000,23182=>1000,23183=>1000,23184=>1000,23185=>1000,23186=>1000,23187=>1000,23188=>1000, - 23189=>1000,23190=>1000,23191=>1000,23192=>1000,23193=>1000,23194=>1000,23195=>1000,23196=>1000,23197=>1000,23198=>1000,23199=>1000,23200=>1000,23201=>1000,23202=>1000,23203=>1000,23204=>1000, - 23205=>1000,23206=>1000,23207=>1000,23208=>1000,23209=>1000,23210=>1000,23211=>1000,23212=>1000,23213=>1000,23214=>1000,23215=>1000,23216=>1000,23217=>1000,23218=>1000,23219=>1000,23220=>1000, - 23221=>1000,23222=>1000,23223=>1000,23224=>1000,23225=>1000,23226=>1000,23227=>1000,23228=>1000,23229=>1000,23230=>1000,23231=>1000,23232=>1000,23233=>1000,23234=>1000,23235=>1000,23236=>1000, - 23237=>1000,23238=>1000,23239=>1000,23240=>1000,23241=>1000,23242=>1000,23243=>1000,23244=>1000,23245=>1000,23246=>1000,23247=>1000,23248=>1000,23249=>1000,23250=>1000,23251=>1000,23252=>1000, - 23253=>1000,23254=>1000,23255=>1000,23256=>1000,23257=>1000,23258=>1000,23259=>1000,23260=>1000,23261=>1000,23262=>1000,23263=>1000,23264=>1000,23265=>1000,23266=>1000,23267=>1000,23268=>1000, - 23269=>1000,23270=>1000,23271=>1000,23272=>1000,23273=>1000,23274=>1000,23275=>1000,23276=>1000,23277=>1000,23278=>1000,23279=>1000,23280=>1000,23281=>1000,23282=>1000,23283=>1000,23284=>1000, - 23285=>1000,23286=>1000,23287=>1000,23288=>1000,23289=>1000,23290=>1000,23291=>1000,23292=>1000,23293=>1000,23294=>1000,23295=>1000,23296=>1000,23297=>1000,23298=>1000,23299=>1000,23300=>1000, - 23301=>1000,23302=>1000,23303=>1000,23304=>1000,23305=>1000,23306=>1000,23307=>1000,23308=>1000,23309=>1000,23310=>1000,23311=>1000,23312=>1000,23313=>1000,23314=>1000,23315=>1000,23316=>1000, - 23317=>1000,23318=>1000,23319=>1000,23320=>1000,23321=>1000,23322=>1000,23323=>1000,23324=>1000,23325=>1000,23326=>1000,23327=>1000,23328=>1000,23329=>1000,23330=>1000,23331=>1000,23332=>1000, - 23333=>1000,23334=>1000,23335=>1000,23336=>1000,23337=>1000,23338=>1000,23339=>1000,23340=>1000,23341=>1000,23342=>1000,23343=>1000,23344=>1000,23345=>1000,23346=>1000,23347=>1000,23348=>1000, - 23349=>1000,23350=>1000,23351=>1000,23352=>1000,23353=>1000,23354=>1000,23355=>1000,23356=>1000,23357=>1000,23358=>1000,23359=>1000,23360=>1000,23361=>1000,23362=>1000,23363=>1000,23364=>1000, - 23365=>1000,23366=>1000,23367=>1000,23368=>1000,23369=>1000,23370=>1000,23371=>1000,23372=>1000,23373=>1000,23374=>1000,23375=>1000,23376=>1000,23377=>1000,23378=>1000,23379=>1000,23380=>1000, - 23381=>1000,23382=>1000,23383=>1000,23384=>1000,23385=>1000,23386=>1000,23387=>1000,23388=>1000,23389=>1000,23390=>1000,23391=>1000,23392=>1000,23393=>1000,23394=>1000,23395=>1000,23396=>1000, - 23397=>1000,23398=>1000,23399=>1000,23400=>1000,23401=>1000,23402=>1000,23403=>1000,23404=>1000,23405=>1000,23406=>1000,23407=>1000,23408=>1000,23409=>1000,23410=>1000,23411=>1000,23412=>1000, - 23413=>1000,23414=>1000,23415=>1000,23416=>1000,23417=>1000,23418=>1000,23419=>1000,23420=>1000,23421=>1000,23422=>1000,23423=>1000,23424=>1000,23425=>1000,23426=>1000,23427=>1000,23428=>1000, - 23429=>1000,23430=>1000,23431=>1000,23432=>1000,23433=>1000,23434=>1000,23435=>1000,23436=>1000,23437=>1000,23438=>1000,23439=>1000,23440=>1000,23441=>1000,23442=>1000,23443=>1000,23444=>1000, - 23445=>1000,23446=>1000,23447=>1000,23448=>1000,23449=>1000,23450=>1000,23451=>1000,23452=>1000,23453=>1000,23454=>1000,23455=>1000,23456=>1000,23457=>1000,23458=>1000,23459=>1000,23460=>1000, - 23461=>1000,23462=>1000,23463=>1000,23464=>1000,23465=>1000,23466=>1000,23467=>1000,23468=>1000,23469=>1000,23470=>1000,23471=>1000,23472=>1000,23473=>1000,23474=>1000,23475=>1000,23476=>1000, - 23477=>1000,23478=>1000,23479=>1000,23480=>1000,23481=>1000,23482=>1000,23483=>1000,23484=>1000,23485=>1000,23486=>1000,23487=>1000,23488=>1000,23489=>1000,23490=>1000,23491=>1000,23492=>1000, - 23493=>1000,23494=>1000,23495=>1000,23496=>1000,23497=>1000,23498=>1000,23499=>1000,23500=>1000,23501=>1000,23502=>1000,23503=>1000,23504=>1000,23505=>1000,23506=>1000,23507=>1000,23508=>1000, - 23509=>1000,23510=>1000,23511=>1000,23512=>1000,23513=>1000,23514=>1000,23515=>1000,23516=>1000,23517=>1000,23518=>1000,23519=>1000,23520=>1000,23521=>1000,23522=>1000,23523=>1000,23524=>1000, - 23525=>1000,23526=>1000,23527=>1000,23528=>1000,23529=>1000,23530=>1000,23531=>1000,23532=>1000,23533=>1000,23534=>1000,23535=>1000,23536=>1000,23537=>1000,23538=>1000,23539=>1000,23540=>1000, - 23541=>1000,23542=>1000,23543=>1000,23544=>1000,23545=>1000,23546=>1000,23547=>1000,23548=>1000,23549=>1000,23550=>1000,23551=>1000,23552=>1000,23553=>1000,23554=>1000,23555=>1000,23556=>1000, - 23557=>1000,23558=>1000,23559=>1000,23560=>1000,23561=>1000,23562=>1000,23563=>1000,23564=>1000,23565=>1000,23566=>1000,23567=>1000,23568=>1000,23569=>1000,23570=>1000,23571=>1000,23572=>1000, - 23573=>1000,23574=>1000,23575=>1000,23576=>1000,23577=>1000,23578=>1000,23579=>1000,23580=>1000,23581=>1000,23582=>1000,23583=>1000,23584=>1000,23585=>1000,23586=>1000,23587=>1000,23588=>1000, - 23589=>1000,23590=>1000,23591=>1000,23592=>1000,23593=>1000,23594=>1000,23595=>1000,23596=>1000,23597=>1000,23598=>1000,23599=>1000,23600=>1000,23601=>1000,23602=>1000,23603=>1000,23604=>1000, - 23605=>1000,23606=>1000,23607=>1000,23608=>1000,23609=>1000,23610=>1000,23611=>1000,23612=>1000,23613=>1000,23614=>1000,23615=>1000,23616=>1000,23617=>1000,23618=>1000,23619=>1000,23620=>1000, - 23621=>1000,23622=>1000,23623=>1000,23624=>1000,23625=>1000,23626=>1000,23627=>1000,23628=>1000,23629=>1000,23630=>1000,23631=>1000,23632=>1000,23633=>1000,23634=>1000,23635=>1000,23636=>1000, - 23637=>1000,23638=>1000,23639=>1000,23640=>1000,23641=>1000,23642=>1000,23643=>1000,23644=>1000,23645=>1000,23646=>1000,23647=>1000,23648=>1000,23649=>1000,23650=>1000,23651=>1000,23652=>1000, - 23653=>1000,23654=>1000,23655=>1000,23656=>1000,23657=>1000,23658=>1000,23659=>1000,23660=>1000,23661=>1000,23662=>1000,23663=>1000,23664=>1000,23665=>1000,23666=>1000,23667=>1000,23668=>1000, - 23669=>1000,23670=>1000,23671=>1000,23672=>1000,23673=>1000,23674=>1000,23675=>1000,23676=>1000,23677=>1000,23678=>1000,23679=>1000,23680=>1000,23681=>1000,23682=>1000,23683=>1000,23684=>1000, - 23685=>1000,23686=>1000,23687=>1000,23688=>1000,23689=>1000,23690=>1000,23691=>1000,23692=>1000,23693=>1000,23694=>1000,23695=>1000,23696=>1000,23697=>1000,23698=>1000,23699=>1000,23700=>1000, - 23701=>1000,23702=>1000,23703=>1000,23704=>1000,23705=>1000,23706=>1000,23707=>1000,23708=>1000,23709=>1000,23710=>1000,23711=>1000,23712=>1000,23713=>1000,23714=>1000,23715=>1000,23716=>1000, - 23717=>1000,23718=>1000,23719=>1000,23720=>1000,23721=>1000,23722=>1000,23723=>1000,23724=>1000,23725=>1000,23726=>1000,23727=>1000,23728=>1000,23729=>1000,23730=>1000,23731=>1000,23732=>1000, - 23733=>1000,23734=>1000,23735=>1000,23736=>1000,23737=>1000,23738=>1000,23739=>1000,23740=>1000,23741=>1000,23742=>1000,23743=>1000,23744=>1000,23745=>1000,23746=>1000,23747=>1000,23748=>1000, - 23749=>1000,23750=>1000,23751=>1000,23752=>1000,23753=>1000,23754=>1000,23755=>1000,23756=>1000,23757=>1000,23758=>1000,23759=>1000,23760=>1000,23761=>1000,23762=>1000,23763=>1000,23764=>1000, - 23765=>1000,23766=>1000,23767=>1000,23768=>1000,23769=>1000,23770=>1000,23771=>1000,23772=>1000,23773=>1000,23774=>1000,23775=>1000,23776=>1000,23777=>1000,23778=>1000,23779=>1000,23780=>1000, - 23781=>1000,23782=>1000,23783=>1000,23784=>1000,23785=>1000,23786=>1000,23787=>1000,23788=>1000,23789=>1000,23790=>1000,23791=>1000,23792=>1000,23793=>1000,23794=>1000,23795=>1000,23796=>1000, - 23797=>1000,23798=>1000,23799=>1000,23800=>1000,23801=>1000,23802=>1000,23803=>1000,23804=>1000,23805=>1000,23806=>1000,23807=>1000,23808=>1000,23809=>1000,23810=>1000,23811=>1000,23812=>1000, - 23813=>1000,23814=>1000,23815=>1000,23816=>1000,23817=>1000,23818=>1000,23819=>1000,23820=>1000,23821=>1000,23822=>1000,23823=>1000,23824=>1000,23825=>1000,23826=>1000,23827=>1000,23828=>1000, - 23829=>1000,23830=>1000,23831=>1000,23832=>1000,23833=>1000,23834=>1000,23835=>1000,23836=>1000,23837=>1000,23838=>1000,23839=>1000,23840=>1000,23841=>1000,23842=>1000,23843=>1000,23844=>1000, - 23845=>1000,23846=>1000,23847=>1000,23848=>1000,23849=>1000,23850=>1000,23851=>1000,23852=>1000,23853=>1000,23854=>1000,23855=>1000,23856=>1000,23857=>1000,23858=>1000,23859=>1000,23860=>1000, - 23861=>1000,23862=>1000,23863=>1000,23864=>1000,23865=>1000,23866=>1000,23867=>1000,23868=>1000,23869=>1000,23870=>1000,23871=>1000,23872=>1000,23873=>1000,23874=>1000,23875=>1000,23876=>1000, - 23877=>1000,23878=>1000,23879=>1000,23880=>1000,23881=>1000,23882=>1000,23883=>1000,23884=>1000,23885=>1000,23886=>1000,23887=>1000,23888=>1000,23889=>1000,23890=>1000,23891=>1000,23892=>1000, - 23893=>1000,23894=>1000,23895=>1000,23896=>1000,23897=>1000,23898=>1000,23899=>1000,23900=>1000,23901=>1000,23902=>1000,23903=>1000,23904=>1000,23905=>1000,23906=>1000,23907=>1000,23908=>1000, - 23909=>1000,23910=>1000,23911=>1000,23912=>1000,23913=>1000,23914=>1000,23915=>1000,23916=>1000,23917=>1000,23918=>1000,23919=>1000,23920=>1000,23921=>1000,23922=>1000,23923=>1000,23924=>1000, - 23925=>1000,23926=>1000,23927=>1000,23928=>1000,23929=>1000,23930=>1000,23931=>1000,23932=>1000,23933=>1000,23934=>1000,23935=>1000,23936=>1000,23937=>1000,23938=>1000,23939=>1000,23940=>1000, - 23941=>1000,23942=>1000,23943=>1000,23944=>1000,23945=>1000,23946=>1000,23947=>1000,23948=>1000,23949=>1000,23950=>1000,23951=>1000,23952=>1000,23953=>1000,23954=>1000,23955=>1000,23956=>1000, - 23957=>1000,23958=>1000,23959=>1000,23960=>1000,23961=>1000,23962=>1000,23963=>1000,23964=>1000,23965=>1000,23966=>1000,23967=>1000,23968=>1000,23969=>1000,23970=>1000,23971=>1000,23972=>1000, - 23973=>1000,23974=>1000,23975=>1000,23976=>1000,23977=>1000,23978=>1000,23979=>1000,23980=>1000,23981=>1000,23982=>1000,23983=>1000,23984=>1000,23985=>1000,23986=>1000,23987=>1000,23988=>1000, - 23989=>1000,23990=>1000,23991=>1000,23992=>1000,23993=>1000,23994=>1000,23995=>1000,23996=>1000,23997=>1000,23998=>1000,23999=>1000,24000=>1000,24001=>1000,24002=>1000,24003=>1000,24004=>1000, - 24005=>1000,24006=>1000,24007=>1000,24008=>1000,24009=>1000,24010=>1000,24011=>1000,24012=>1000,24013=>1000,24014=>1000,24015=>1000,24016=>1000,24017=>1000,24018=>1000,24019=>1000,24020=>1000, - 24021=>1000,24022=>1000,24023=>1000,24024=>1000,24025=>1000,24026=>1000,24027=>1000,24028=>1000,24029=>1000,24030=>1000,24031=>1000,24032=>1000,24033=>1000,24034=>1000,24035=>1000,24036=>1000, - 24037=>1000,24038=>1000,24039=>1000,24040=>1000,24041=>1000,24042=>1000,24043=>1000,24044=>1000,24045=>1000,24046=>1000,24047=>1000,24048=>1000,24049=>1000,24050=>1000,24051=>1000,24052=>1000, - 24053=>1000,24054=>1000,24055=>1000,24056=>1000,24057=>1000,24058=>1000,24059=>1000,24060=>1000,24061=>1000,24062=>1000,24063=>1000,24064=>1000,24065=>1000,24066=>1000,24067=>1000,24068=>1000, - 24069=>1000,24070=>1000,24071=>1000,24072=>1000,24073=>1000,24074=>1000,24075=>1000,24076=>1000,24077=>1000,24078=>1000,24079=>1000,24080=>1000,24081=>1000,24082=>1000,24083=>1000,24084=>1000, - 24085=>1000,24086=>1000,24087=>1000,24088=>1000,24089=>1000,24090=>1000,24091=>1000,24092=>1000,24093=>1000,24094=>1000,24095=>1000,24096=>1000,24097=>1000,24098=>1000,24099=>1000,24100=>1000, - 24101=>1000,24102=>1000,24103=>1000,24104=>1000,24105=>1000,24106=>1000,24107=>1000,24108=>1000,24109=>1000,24110=>1000,24111=>1000,24112=>1000,24113=>1000,24114=>1000,24115=>1000,24116=>1000, - 24117=>1000,24118=>1000,24119=>1000,24120=>1000,24121=>1000,24122=>1000,24123=>1000,24124=>1000,24125=>1000,24126=>1000,24127=>1000,24128=>1000,24129=>1000,24130=>1000,24131=>1000,24132=>1000, - 24133=>1000,24134=>1000,24135=>1000,24136=>1000,24137=>1000,24138=>1000,24139=>1000,24140=>1000,24141=>1000,24142=>1000,24143=>1000,24144=>1000,24145=>1000,24146=>1000,24147=>1000,24148=>1000, - 24149=>1000,24150=>1000,24151=>1000,24152=>1000,24153=>1000,24154=>1000,24155=>1000,24156=>1000,24157=>1000,24158=>1000,24159=>1000,24160=>1000,24161=>1000,24162=>1000,24163=>1000,24164=>1000, - 24165=>1000,24166=>1000,24167=>1000,24168=>1000,24169=>1000,24170=>1000,24171=>1000,24172=>1000,24173=>1000,24174=>1000,24175=>1000,24176=>1000,24177=>1000,24178=>1000,24179=>1000,24180=>1000, - 24181=>1000,24182=>1000,24183=>1000,24184=>1000,24185=>1000,24186=>1000,24187=>1000,24188=>1000,24189=>1000,24190=>1000,24191=>1000,24192=>1000,24193=>1000,24194=>1000,24195=>1000,24196=>1000, - 24197=>1000,24198=>1000,24199=>1000,24200=>1000,24201=>1000,24202=>1000,24203=>1000,24204=>1000,24205=>1000,24206=>1000,24207=>1000,24208=>1000,24209=>1000,24210=>1000,24211=>1000,24212=>1000, - 24213=>1000,24214=>1000,24215=>1000,24216=>1000,24217=>1000,24218=>1000,24219=>1000,24220=>1000,24221=>1000,24222=>1000,24223=>1000,24224=>1000,24225=>1000,24226=>1000,24227=>1000,24228=>1000, - 24229=>1000,24230=>1000,24231=>1000,24232=>1000,24233=>1000,24234=>1000,24235=>1000,24236=>1000,24237=>1000,24238=>1000,24239=>1000,24240=>1000,24241=>1000,24242=>1000,24243=>1000,24244=>1000, - 24245=>1000,24246=>1000,24247=>1000,24248=>1000,24249=>1000,24250=>1000,24251=>1000,24252=>1000,24253=>1000,24254=>1000,24255=>1000,24256=>1000,24257=>1000,24258=>1000,24259=>1000,24260=>1000, - 24261=>1000,24262=>1000,24263=>1000,24264=>1000,24265=>1000,24266=>1000,24267=>1000,24268=>1000,24269=>1000,24270=>1000,24271=>1000,24272=>1000,24273=>1000,24274=>1000,24275=>1000,24276=>1000, - 24277=>1000,24278=>1000,24279=>1000,24280=>1000,24281=>1000,24282=>1000,24283=>1000,24284=>1000,24285=>1000,24286=>1000,24287=>1000,24288=>1000,24289=>1000,24290=>1000,24291=>1000,24292=>1000, - 24293=>1000,24294=>1000,24295=>1000,24296=>1000,24297=>1000,24298=>1000,24299=>1000,24300=>1000,24301=>1000,24302=>1000,24303=>1000,24304=>1000,24305=>1000,24306=>1000,24307=>1000,24308=>1000, - 24309=>1000,24310=>1000,24311=>1000,24312=>1000,24313=>1000,24314=>1000,24315=>1000,24316=>1000,24317=>1000,24318=>1000,24319=>1000,24320=>1000,24321=>1000,24322=>1000,24323=>1000,24324=>1000, - 24325=>1000,24326=>1000,24327=>1000,24328=>1000,24329=>1000,24330=>1000,24331=>1000,24332=>1000,24333=>1000,24334=>1000,24335=>1000,24336=>1000,24337=>1000,24338=>1000,24339=>1000,24340=>1000, - 24341=>1000,24342=>1000,24343=>1000,24344=>1000,24345=>1000,24346=>1000,24347=>1000,24348=>1000,24349=>1000,24350=>1000,24351=>1000,24352=>1000,24353=>1000,24354=>1000,24355=>1000,24356=>1000, - 24357=>1000,24358=>1000,24359=>1000,24360=>1000,24361=>1000,24362=>1000,24363=>1000,24364=>1000,24365=>1000,24366=>1000,24367=>1000,24368=>1000,24369=>1000,24370=>1000,24371=>1000,24372=>1000, - 24373=>1000,24374=>1000,24375=>1000,24376=>1000,24377=>1000,24378=>1000,24379=>1000,24380=>1000,24381=>1000,24382=>1000,24383=>1000,24384=>1000,24385=>1000,24386=>1000,24387=>1000,24388=>1000, - 24389=>1000,24390=>1000,24391=>1000,24392=>1000,24393=>1000,24394=>1000,24395=>1000,24396=>1000,24397=>1000,24398=>1000,24399=>1000,24400=>1000,24401=>1000,24402=>1000,24403=>1000,24404=>1000, - 24405=>1000,24406=>1000,24407=>1000,24408=>1000,24409=>1000,24410=>1000,24411=>1000,24412=>1000,24413=>1000,24414=>1000,24415=>1000,24416=>1000,24417=>1000,24418=>1000,24419=>1000,24420=>1000, - 24421=>1000,24422=>1000,24423=>1000,24424=>1000,24425=>1000,24426=>1000,24427=>1000,24428=>1000,24429=>1000,24430=>1000,24431=>1000,24432=>1000,24433=>1000,24434=>1000,24435=>1000,24436=>1000, - 24437=>1000,24438=>1000,24439=>1000,24440=>1000,24441=>1000,24442=>1000,24443=>1000,24444=>1000,24445=>1000,24446=>1000,24447=>1000,24448=>1000,24449=>1000,24450=>1000,24451=>1000,24452=>1000, - 24453=>1000,24454=>1000,24455=>1000,24456=>1000,24457=>1000,24458=>1000,24459=>1000,24460=>1000,24461=>1000,24462=>1000,24463=>1000,24464=>1000,24465=>1000,24466=>1000,24467=>1000,24468=>1000, - 24469=>1000,24470=>1000,24471=>1000,24472=>1000,24473=>1000,24474=>1000,24475=>1000,24476=>1000,24477=>1000,24478=>1000,24479=>1000,24480=>1000,24481=>1000,24482=>1000,24483=>1000,24484=>1000, - 24485=>1000,24486=>1000,24487=>1000,24488=>1000,24489=>1000,24490=>1000,24491=>1000,24492=>1000,24493=>1000,24494=>1000,24495=>1000,24496=>1000,24497=>1000,24498=>1000,24499=>1000,24500=>1000, - 24501=>1000,24502=>1000,24503=>1000,24504=>1000,24505=>1000,24506=>1000,24507=>1000,24508=>1000,24509=>1000,24510=>1000,24511=>1000,24512=>1000,24513=>1000,24514=>1000,24515=>1000,24516=>1000, - 24517=>1000,24518=>1000,24519=>1000,24520=>1000,24521=>1000,24522=>1000,24523=>1000,24524=>1000,24525=>1000,24526=>1000,24527=>1000,24528=>1000,24529=>1000,24530=>1000,24531=>1000,24532=>1000, - 24533=>1000,24534=>1000,24535=>1000,24536=>1000,24537=>1000,24538=>1000,24539=>1000,24540=>1000,24541=>1000,24542=>1000,24543=>1000,24544=>1000,24545=>1000,24546=>1000,24547=>1000,24548=>1000, - 24549=>1000,24550=>1000,24551=>1000,24552=>1000,24553=>1000,24554=>1000,24555=>1000,24556=>1000,24557=>1000,24558=>1000,24559=>1000,24560=>1000,24561=>1000,24562=>1000,24563=>1000,24564=>1000, - 24565=>1000,24566=>1000,24567=>1000,24568=>1000,24569=>1000,24570=>1000,24571=>1000,24572=>1000,24573=>1000,24574=>1000,24575=>1000,24576=>1000,24577=>1000,24578=>1000,24579=>1000,24580=>1000, - 24581=>1000,24582=>1000,24583=>1000,24584=>1000,24585=>1000,24586=>1000,24587=>1000,24588=>1000,24589=>1000,24590=>1000,24591=>1000,24592=>1000,24593=>1000,24594=>1000,24595=>1000,24596=>1000, - 24597=>1000,24598=>1000,24599=>1000,24600=>1000,24601=>1000,24602=>1000,24603=>1000,24604=>1000,24605=>1000,24606=>1000,24607=>1000,24608=>1000,24609=>1000,24610=>1000,24611=>1000,24612=>1000, - 24613=>1000,24614=>1000,24615=>1000,24616=>1000,24617=>1000,24618=>1000,24619=>1000,24620=>1000,24621=>1000,24622=>1000,24623=>1000,24624=>1000,24625=>1000,24626=>1000,24627=>1000,24628=>1000, - 24629=>1000,24630=>1000,24631=>1000,24632=>1000,24633=>1000,24634=>1000,24635=>1000,24636=>1000,24637=>1000,24638=>1000,24639=>1000,24640=>1000,24641=>1000,24642=>1000,24643=>1000,24644=>1000, - 24645=>1000,24646=>1000,24647=>1000,24648=>1000,24649=>1000,24650=>1000,24651=>1000,24652=>1000,24653=>1000,24654=>1000,24655=>1000,24656=>1000,24657=>1000,24658=>1000,24659=>1000,24660=>1000, - 24661=>1000,24662=>1000,24663=>1000,24664=>1000,24665=>1000,24666=>1000,24667=>1000,24668=>1000,24669=>1000,24670=>1000,24671=>1000,24672=>1000,24673=>1000,24674=>1000,24675=>1000,24676=>1000, - 24677=>1000,24678=>1000,24679=>1000,24680=>1000,24681=>1000,24682=>1000,24683=>1000,24684=>1000,24685=>1000,24686=>1000,24687=>1000,24688=>1000,24689=>1000,24690=>1000,24691=>1000,24692=>1000, - 24693=>1000,24694=>1000,24695=>1000,24696=>1000,24697=>1000,24698=>1000,24699=>1000,24700=>1000,24701=>1000,24702=>1000,24703=>1000,24704=>1000,24705=>1000,24706=>1000,24707=>1000,24708=>1000, - - 24709=>1000,24710=>1000,24711=>1000,24712=>1000,24713=>1000,24714=>1000,24715=>1000,24716=>1000,24717=>1000,24718=>1000,24719=>1000,24720=>1000,24721=>1000,24722=>1000,24723=>1000,24724=>1000, - 24725=>1000,24726=>1000,24727=>1000,24728=>1000,24729=>1000,24730=>1000,24731=>1000,24732=>1000,24733=>1000,24734=>1000,24735=>1000,24736=>1000,24737=>1000,24738=>1000,24739=>1000,24740=>1000, - 24741=>1000,24742=>1000,24743=>1000,24744=>1000,24745=>1000,24746=>1000,24747=>1000,24748=>1000,24749=>1000,24750=>1000,24751=>1000,24752=>1000,24753=>1000,24754=>1000,24755=>1000,24756=>1000, - 24757=>1000,24758=>1000,24759=>1000,24760=>1000,24761=>1000,24762=>1000,24763=>1000,24764=>1000,24765=>1000,24766=>1000,24767=>1000,24768=>1000,24769=>1000,24770=>1000,24771=>1000,24772=>1000, - 24773=>1000,24774=>1000,24775=>1000,24776=>1000,24777=>1000,24778=>1000,24779=>1000,24780=>1000,24781=>1000,24782=>1000,24783=>1000,24784=>1000,24785=>1000,24786=>1000,24787=>1000,24788=>1000, - 24789=>1000,24790=>1000,24791=>1000,24792=>1000,24793=>1000,24794=>1000,24795=>1000,24796=>1000,24797=>1000,24798=>1000,24799=>1000,24800=>1000,24801=>1000,24802=>1000,24803=>1000,24804=>1000, - 24805=>1000,24806=>1000,24807=>1000,24808=>1000,24809=>1000,24810=>1000,24811=>1000,24812=>1000,24813=>1000,24814=>1000,24815=>1000,24816=>1000,24817=>1000,24818=>1000,24819=>1000,24820=>1000, - 24821=>1000,24822=>1000,24823=>1000,24824=>1000,24825=>1000,24826=>1000,24827=>1000,24828=>1000,24829=>1000,24830=>1000,24831=>1000,24832=>1000,24833=>1000,24834=>1000,24835=>1000,24836=>1000, - 24837=>1000,24838=>1000,24839=>1000,24840=>1000,24841=>1000,24842=>1000,24843=>1000,24844=>1000,24845=>1000,24846=>1000,24847=>1000,24848=>1000,24849=>1000,24850=>1000,24851=>1000,24852=>1000, - 24853=>1000,24854=>1000,24855=>1000,24856=>1000,24857=>1000,24858=>1000,24859=>1000,24860=>1000,24861=>1000,24862=>1000,24863=>1000,24864=>1000,24865=>1000,24866=>1000,24867=>1000,24868=>1000, - 24869=>1000,24870=>1000,24871=>1000,24872=>1000,24873=>1000,24874=>1000,24875=>1000,24876=>1000,24877=>1000,24878=>1000,24879=>1000,24880=>1000,24881=>1000,24882=>1000,24883=>1000,24884=>1000, - 24885=>1000,24886=>1000,24887=>1000,24888=>1000,24889=>1000,24890=>1000,24891=>1000,24892=>1000,24893=>1000,24894=>1000,24895=>1000,24896=>1000,24897=>1000,24898=>1000,24899=>1000,24900=>1000, - 24901=>1000,24902=>1000,24903=>1000,24904=>1000,24905=>1000,24906=>1000,24907=>1000,24908=>1000,24909=>1000,24910=>1000,24911=>1000,24912=>1000,24913=>1000,24914=>1000,24915=>1000,24916=>1000, - 24917=>1000,24918=>1000,24919=>1000,24920=>1000,24921=>1000,24922=>1000,24923=>1000,24924=>1000,24925=>1000,24926=>1000,24927=>1000,24928=>1000,24929=>1000,24930=>1000,24931=>1000,24932=>1000, - 24933=>1000,24934=>1000,24935=>1000,24936=>1000,24937=>1000,24938=>1000,24939=>1000,24940=>1000,24941=>1000,24942=>1000,24943=>1000,24944=>1000,24945=>1000,24946=>1000,24947=>1000,24948=>1000, - 24949=>1000,24950=>1000,24951=>1000,24952=>1000,24953=>1000,24954=>1000,24955=>1000,24956=>1000,24957=>1000,24958=>1000,24959=>1000,24960=>1000,24961=>1001,24962=>1000,24963=>1000,24964=>1000, - 24965=>1000,24966=>1000,24967=>1000,24968=>1000,24969=>1000,24970=>1000,24971=>1000,24972=>1000,24973=>1000,24974=>1000,24975=>1000,24976=>1000,24977=>1000,24978=>1000,24979=>1000,24980=>1000, - 24981=>1000,24982=>1000,24983=>1000,24984=>1000,24985=>1000,24986=>1000,24987=>1000,24988=>1000,24989=>1000,24990=>1000,24991=>1000,24992=>1000,24993=>1000,24994=>1000,24995=>1000,24996=>1000, - 24997=>1000,24998=>1000,24999=>1000,25000=>1000,25001=>1000,25002=>1000,25003=>1000,25004=>1000,25005=>1000,25006=>1000,25007=>1000,25008=>1000,25009=>1000,25010=>1000,25011=>1000,25012=>1000, - 25013=>1000,25014=>1000,25015=>1000,25016=>1000,25017=>1000,25018=>1000,25019=>1000,25020=>1000,25021=>1000,25022=>1000,25023=>1000,25024=>1000,25025=>1000,25026=>1000,25027=>1000,25028=>1000, - 25029=>1000,25030=>1000,25031=>1000,25032=>1000,25033=>1000,25034=>1000,25035=>1000,25036=>1000,25037=>1000,25038=>1000,25039=>1000,25040=>1000,25041=>1000,25042=>1000,25043=>1000,25044=>1000, - 25045=>1000,25046=>1000,25047=>1000,25048=>1000,25049=>1000,25050=>1000,25051=>1000,25052=>1000,25053=>1000,25054=>1000,25055=>1000,25056=>1000,25057=>1000,25058=>1000,25059=>1000,25060=>1000, - 25061=>1000,25062=>1000,25063=>1000,25064=>1000,25065=>1000,25066=>1000,25067=>1000,25068=>1000,25069=>1000,25070=>1000,25071=>1000,25072=>1000,25073=>1000,25074=>1000,25075=>1000,25076=>1000, - 25077=>1000,25078=>1000,25079=>1000,25080=>1000,25081=>1000,25082=>1000,25083=>1000,25084=>1000,25085=>1000,25086=>1000,25087=>1000,25088=>1000,25089=>1000,25090=>1000,25091=>1000,25092=>1000, - 25093=>1000,25094=>1000,25095=>1000,25096=>1000,25097=>1000,25098=>1000,25099=>1000,25100=>1000,25101=>1000,25102=>1000,25103=>1000,25104=>1000,25105=>1000,25106=>1000,25107=>1000,25108=>1000, - 25109=>1000,25110=>1000,25111=>1000,25112=>1000,25113=>1000,25114=>1000,25115=>1000,25116=>1000,25117=>1000,25118=>1000,25119=>1000,25120=>1000,25121=>1000,25122=>1000,25123=>1000,25124=>1000, - 25125=>1000,25126=>1000,25127=>1000,25128=>1000,25129=>1000,25130=>1000,25131=>1000,25132=>1000,25133=>1000,25134=>1000,25135=>1000,25136=>1000,25137=>1000,25138=>1000,25139=>1000,25140=>1000, - 25141=>1000,25142=>1000,25143=>1000,25144=>1000,25145=>1000,25146=>1000,25147=>1000,25148=>1000,25149=>1000,25150=>1000,25151=>1000,25152=>1000,25153=>1000,25154=>1000,25155=>1000,25156=>1000, - 25157=>1000,25158=>1000,25159=>1000,25160=>1000,25161=>1000,25162=>1000,25163=>1000,25164=>1000,25165=>1000,25166=>1000,25167=>1000,25168=>1000,25169=>1000,25170=>1000,25171=>1000,25172=>1000, - 25173=>1000,25174=>1000,25175=>1000,25176=>1000,25177=>1000,25178=>1000,25179=>1000,25180=>1000,25181=>1000,25182=>1000,25183=>1000,25184=>1000,25185=>1000,25186=>1000,25187=>1000,25188=>1000, - 25189=>1000,25190=>1000,25191=>1000,25192=>1000,25193=>1000,25194=>1000,25195=>1000,25196=>1000,25197=>1000,25198=>1000,25199=>1000,25200=>1000,25201=>1000,25202=>1000,25203=>1000,25204=>1000, - 25205=>1000,25206=>1000,25207=>1000,25208=>1000,25209=>1000,25210=>1000,25211=>1000,25212=>1000,25213=>1000,25214=>1000,25215=>1000,25216=>1000,25217=>1000,25218=>1000,25219=>1000,25220=>1000, - 25221=>1000,25222=>1000,25223=>1000,25224=>1000,25225=>1000,25226=>1000,25227=>1000,25228=>1000,25229=>1000,25230=>1000,25231=>1000,25232=>1000,25233=>1000,25234=>1000,25235=>1000,25236=>1000, - 25237=>1000,25238=>1000,25239=>1000,25240=>1000,25241=>1000,25242=>1000,25243=>1000,25244=>1000,25245=>1000,25246=>1000,25247=>1000,25248=>1000,25249=>1000,25250=>1000,25251=>1000,25252=>1000, - 25253=>1000,25254=>1000,25255=>1000,25256=>1000,25257=>1000,25258=>1000,25259=>1000,25260=>1000,25261=>1000,25262=>1000,25263=>1000,25264=>1000,25265=>1000,25266=>1000,25267=>1000,25268=>1000, - 25269=>1000,25270=>1000,25271=>1000,25272=>1000,25273=>1000,25274=>1000,25275=>1000,25276=>1000,25277=>1000,25278=>1000,25279=>1000,25280=>1000,25281=>1000,25282=>1000,25283=>1000,25284=>1000, - 25285=>1000,25286=>1000,25287=>1000,25288=>1000,25289=>1000,25290=>1000,25291=>1000,25292=>1000,25293=>1000,25294=>1000,25295=>1000,25296=>1000,25297=>1000,25298=>1000,25299=>1000,25300=>1000, - 25301=>1000,25302=>1000,25303=>1000,25304=>1000,25305=>1000,25306=>1000,25307=>1000,25308=>1000,25309=>1000,25310=>1000,25311=>1000,25312=>1000,25313=>1000,25314=>1000,25315=>1000,25316=>1000, - 25317=>1000,25318=>1000,25319=>1000,25320=>1000,25321=>1000,25322=>1000,25323=>1000,25324=>1000,25325=>1000,25326=>1000,25327=>1000,25328=>1000,25329=>1000,25330=>1000,25331=>1000,25332=>1000, - 25333=>1000,25334=>1000,25335=>1000,25336=>1000,25337=>1000,25338=>1000,25339=>1000,25340=>1000,25341=>1000,25342=>1000,25343=>1000,25344=>1000,25345=>1000,25346=>1000,25347=>1000,25348=>1000, - 25349=>1000,25350=>1000,25351=>1000,25352=>1000,25353=>1000,25354=>1000,25355=>1000,25356=>1000,25357=>1000,25358=>1000,25359=>1000,25360=>1000,25361=>1000,25362=>1000,25363=>1000,25364=>1000, - 25365=>1000,25366=>1000,25367=>1000,25368=>1000,25369=>1000,25370=>1000,25371=>1000,25372=>1000,25373=>1000,25374=>1000,25375=>1000,25376=>1000,25377=>1000,25378=>1000,25379=>1000,25380=>1000, - 25381=>1000,25382=>1000,25383=>1000,25384=>1000,25385=>1000,25386=>1000,25387=>1000,25388=>1000,25389=>1000,25390=>1000,25391=>1000,25392=>1000,25393=>1000,25394=>1000,25395=>1000,25396=>1000, - 25397=>1000,25398=>1000,25399=>1000,25400=>1000,25401=>1000,25402=>1000,25403=>1000,25404=>1000,25405=>1000,25406=>1000,25407=>1000,25408=>1000,25409=>1000,25410=>1000,25411=>1000,25412=>1000, - 25413=>1000,25414=>1000,25415=>1000,25416=>1000,25417=>1000,25418=>1000,25419=>1000,25420=>1000,25421=>1000,25422=>1000,25423=>1000,25424=>1000,25425=>1000,25426=>1000,25427=>1000,25428=>1000, - 25429=>1000,25430=>1000,25431=>1000,25432=>1000,25433=>1000,25434=>1000,25435=>1000,25436=>1000,25437=>1000,25438=>1000,25439=>1000,25440=>1000,25441=>1000,25442=>1000,25443=>1000,25444=>1000, - 25445=>1000,25446=>1000,25447=>1000,25448=>1000,25449=>1000,25450=>1000,25451=>1000,25452=>1000,25453=>1000,25454=>1000,25455=>1000,25456=>1000,25457=>1000,25458=>1000,25459=>1000,25460=>1000, - 25461=>1000,25462=>1000,25463=>1000,25464=>1000,25465=>1000,25466=>1000,25467=>1000,25468=>1000,25469=>1000,25470=>1000,25471=>1000,25472=>1000,25473=>1000,25474=>1000,25475=>1000,25476=>1000, - 25477=>1000,25478=>1000,25479=>1000,25480=>1000,25481=>1000,25482=>1000,25483=>1000,25484=>1000,25485=>1000,25486=>1000,25487=>1000,25488=>1000,25489=>1000,25490=>1000,25491=>1000,25492=>1000, - 25493=>1000,25494=>1000,25495=>1000,25496=>1000,25497=>1000,25498=>1000,25499=>1000,25500=>1000,25501=>1000,25502=>1000,25503=>1000,25504=>1000,25505=>1000,25506=>1000,25507=>1000,25508=>1000, - 25509=>1000,25510=>1000,25511=>1000,25512=>1000,25513=>1000,25514=>1000,25515=>1000,25516=>1000,25517=>1000,25518=>1000,25519=>1000,25520=>1000,25521=>1000,25522=>1000,25523=>1000,25524=>1000, - 25525=>1000,25526=>1000,25527=>1000,25528=>1000,25529=>1000,25530=>1000,25531=>1000,25532=>1000,25533=>1000,25534=>1000,25535=>1000,25536=>1000,25537=>1000,25538=>1000,25539=>1000,25540=>1000, - 25541=>1000,25542=>1000,25543=>1000,25544=>1000,25545=>1000,25546=>1000,25547=>1000,25548=>1000,25549=>1000,25550=>1000,25551=>1000,25552=>1000,25553=>1000,25554=>1000,25555=>1000,25556=>1000, - 25557=>1000,25558=>1000,25559=>1000,25560=>1000,25561=>1000,25562=>1000,25563=>1000,25564=>1000,25565=>1000,25566=>1000,25567=>1000,25568=>1000,25569=>1000,25570=>1000,25571=>1000,25572=>1000, - 25573=>1000,25574=>1000,25575=>1000,25576=>1000,25577=>1000,25578=>1000,25579=>1000,25580=>1000,25581=>1000,25582=>1000,25583=>1000,25584=>1000,25585=>1000,25586=>1000,25587=>1000,25588=>1000, - 25589=>1000,25590=>1000,25591=>1000,25592=>1000,25593=>1000,25594=>1000,25595=>1000,25596=>1000,25597=>1000,25598=>1000,25599=>1000,25600=>1000,25601=>1000,25602=>1000,25603=>1000,25604=>1000, - 25605=>1000,25606=>1000,25607=>1000,25608=>1000,25609=>1000,25610=>1000,25611=>1000,25612=>1000,25613=>1000,25614=>1000,25615=>1000,25616=>1000,25617=>1000,25618=>1000,25619=>1000,25620=>1000, - 25621=>1000,25622=>1000,25623=>1000,25624=>1000,25625=>1000,25626=>1000,25627=>1000,25628=>1000,25629=>1000,25630=>1000,25631=>1000,25632=>1000,25633=>1000,25634=>1000,25635=>1000,25636=>1000, - 25637=>1000,25638=>1000,25639=>1000,25640=>1000,25641=>1000,25642=>1000,25643=>1000,25644=>1000,25645=>1000,25646=>1000,25647=>1000,25648=>1000,25649=>1000,25650=>1000,25651=>1000,25652=>1000, - 25653=>1000,25654=>1000,25655=>1000,25656=>1000,25657=>1000,25658=>1000,25659=>1000,25660=>1000,25661=>1000,25662=>1000,25663=>1000,25664=>1000,25665=>1000,25666=>1000,25667=>1000,25668=>1000, - 25669=>1000,25670=>1000,25671=>1000,25672=>1000,25673=>1000,25674=>1000,25675=>1000,25676=>1000,25677=>1000,25678=>1000,25679=>1000,25680=>1000,25681=>1000,25682=>1000,25683=>1000,25684=>1000, - 25685=>1000,25686=>1000,25687=>1000,25688=>1000,25689=>1000,25690=>1000,25691=>1000,25692=>1000,25693=>1000,25694=>1000,25695=>1000,25696=>1000,25697=>1000,25698=>1000,25699=>1000,25700=>1000, - 25701=>1000,25702=>1000,25703=>1000,25704=>1000,25705=>1000,25706=>1000,25707=>1000,25708=>1000,25709=>1000,25710=>1000,25711=>1000,25712=>1000,25713=>1000,25714=>1000,25715=>1000,25716=>1000, - 25717=>1000,25718=>1000,25719=>1000,25720=>1000,25721=>1000,25722=>1000,25723=>1000,25724=>1000,25725=>1000,25726=>1000,25727=>1000,25728=>1000,25729=>1000,25730=>1000,25731=>1000,25732=>1000, - 25733=>1000,25734=>1000,25735=>1000,25736=>1000,25737=>1000,25738=>1000,25739=>1000,25740=>1000,25741=>1000,25742=>1000,25743=>1000,25744=>1000,25745=>1000,25746=>1000,25747=>1000,25748=>1000, - 25749=>1000,25750=>1000,25751=>1000,25752=>1000,25753=>1000,25754=>1000,25755=>1000,25756=>1000,25757=>1000,25758=>1000,25759=>1000,25760=>1000,25761=>1000,25762=>1000,25763=>1000,25764=>1000, - 25765=>1000,25766=>1000,25767=>1000,25768=>1000,25769=>1000,25770=>1000,25771=>1000,25772=>1000,25773=>1000,25774=>1000,25775=>1000,25776=>1000,25777=>1000,25778=>1000,25779=>1000,25780=>1000, - 25781=>1000,25782=>1000,25783=>1000,25784=>1000,25785=>1000,25786=>1000,25787=>1000,25788=>1000,25789=>1000,25790=>1000,25791=>1000,25792=>1000,25793=>1000,25794=>1000,25795=>1000,25796=>1000, - 25797=>1000,25798=>1000,25799=>1000,25800=>1000,25801=>1000,25802=>1000,25803=>1000,25804=>1000,25805=>1000,25806=>1000,25807=>1000,25808=>1000,25809=>1000,25810=>1000,25811=>1000,25812=>1000, - 25813=>1000,25814=>1000,25815=>1000,25816=>1000,25817=>1000,25818=>1000,25819=>1000,25820=>1000,25821=>1000,25822=>1000,25823=>1000,25824=>1000,25825=>1000,25826=>1000,25827=>1000,25828=>1000, - 25829=>1000,25830=>1000,25831=>1000,25832=>1000,25833=>1000,25834=>1000,25835=>1000,25836=>1000,25837=>1000,25838=>1000,25839=>1000,25840=>1000,25841=>1000,25842=>1000,25843=>1000,25844=>1000, - 25845=>1000,25846=>1000,25847=>1000,25848=>1000,25849=>1000,25850=>1000,25851=>1000,25852=>1000,25853=>1000,25854=>1000,25855=>1000,25856=>1000,25857=>1000,25858=>1000,25859=>1000,25860=>1000, - 25861=>1000,25862=>1000,25863=>1000,25864=>1000,25865=>1000,25866=>1000,25867=>1000,25868=>1000,25869=>1000,25870=>1000,25871=>1000,25872=>1000,25873=>1000,25874=>1000,25875=>1000,25876=>1000, - 25877=>1000,25878=>1000,25879=>1000,25880=>1000,25881=>1000,25882=>1000,25883=>1000,25884=>1000,25885=>1000,25886=>1000,25887=>1000,25888=>1000,25889=>1000,25890=>1000,25891=>1000,25892=>1000, - 25893=>1000,25894=>1000,25895=>1000,25896=>1000,25897=>1000,25898=>1000,25899=>1000,25900=>1000,25901=>1000,25902=>1000,25903=>1000,25904=>1000,25905=>1000,25906=>1000,25907=>1000,25908=>1000, - 25909=>1000,25910=>1000,25911=>1000,25912=>1000,25913=>1000,25914=>1000,25915=>1000,25916=>1000,25917=>1000,25918=>1000,25919=>1000,25920=>1000,25921=>1000,25922=>1000,25923=>1000,25924=>1000, - 25925=>1000,25926=>1000,25927=>1000,25928=>1000,25929=>1000,25930=>1000,25931=>1000,25932=>1000,25933=>1000,25934=>1000,25935=>1000,25936=>1000,25937=>1000,25938=>1000,25939=>1000,25940=>1000, - 25941=>1000,25942=>1000,25943=>1000,25944=>1000,25945=>1000,25946=>1000,25947=>1000,25948=>1000,25949=>1000,25950=>1000,25951=>1000,25952=>1000,25953=>1000,25954=>1000,25955=>1000,25956=>1000, - 25957=>1000,25958=>1000,25959=>1000,25960=>1000,25961=>1000,25962=>1000,25963=>1000,25964=>1000,25965=>1000,25966=>1000,25967=>1000,25968=>1000,25969=>1000,25970=>1000,25971=>1000,25972=>1000, - 25973=>1000,25974=>1000,25975=>1000,25976=>1000,25977=>1000,25978=>1000,25979=>1000,25980=>1000,25981=>1000,25982=>1000,25983=>1000,25984=>1000,25985=>1000,25986=>1000,25987=>1000,25988=>1000, - 25989=>1000,25990=>1000,25991=>1000,25992=>1000,25993=>1000,25994=>1000,25995=>1000,25996=>1000,25997=>1000,25998=>1000,25999=>1000,26000=>1000,26001=>1000,26002=>1000,26003=>1000,26004=>1000, - 26005=>1000,26006=>1000,26007=>1000,26008=>1000,26009=>1000,26010=>1000,26011=>1000,26012=>1000,26013=>1000,26014=>1000,26015=>1000,26016=>1000,26017=>1000,26018=>1000,26019=>1000,26020=>1000, - 26021=>1000,26022=>1000,26023=>1000,26024=>1000,26025=>1000,26026=>1000,26027=>1000,26028=>1000,26029=>1000,26030=>1000,26031=>1000,26032=>1000,26033=>1000,26034=>1000,26035=>1000,26036=>1000, - 26037=>1000,26038=>1000,26039=>1000,26040=>1000,26041=>1000,26042=>1000,26043=>1000,26044=>1000,26045=>1000,26046=>1000,26047=>1000,26048=>1000,26049=>1000,26050=>1000,26051=>1000,26052=>1000, - 26053=>1000,26054=>1000,26055=>1000,26056=>1000,26057=>1000,26058=>1000,26059=>1000,26060=>1000,26061=>1000,26062=>1000,26063=>1000,26064=>1000,26065=>1000,26066=>1000,26067=>1000,26068=>1000, - 26069=>1000,26070=>1000,26071=>1000,26072=>1000,26073=>1000,26074=>1000,26075=>1000,26076=>1000,26077=>1000,26078=>1000,26079=>1000,26080=>1000,26081=>1000,26082=>1000,26083=>1000,26084=>1000, - 26085=>1000,26086=>1000,26087=>1000,26088=>1000,26089=>1000,26090=>1000,26091=>1000,26092=>1000,26093=>1000,26094=>1000,26095=>1000,26096=>1000,26097=>1000,26098=>1000,26099=>1000,26100=>1000, - 26101=>1000,26102=>1000,26103=>1000,26104=>1000,26105=>1000,26106=>1000,26107=>1000,26108=>1000,26109=>1000,26110=>1000,26111=>1000,26112=>1000,26113=>1000,26114=>1000,26115=>1000,26116=>1000, - 26117=>1000,26118=>1000,26119=>1000,26120=>1000,26121=>1000,26122=>1000,26123=>1000,26124=>1000,26125=>1000,26126=>1000,26127=>1000,26128=>1000,26129=>1000,26130=>1000,26131=>1000,26132=>1000, - 26133=>1000,26134=>1000,26135=>1000,26136=>1000,26137=>1000,26138=>1000,26139=>1000,26140=>1000,26141=>1000,26142=>1000,26143=>1000,26144=>1000,26145=>1000,26146=>1000,26147=>1000,26148=>1000, - 26149=>1000,26150=>1000,26151=>1000,26152=>1000,26153=>1000,26154=>1000,26155=>1000,26156=>1000,26157=>1000,26158=>1000,26159=>1000,26160=>1000,26161=>1000,26162=>1000,26163=>1000,26164=>1000, - 26165=>1000,26166=>1000,26167=>1000,26168=>1000,26169=>1000,26170=>1000,26171=>1000,26172=>1000,26173=>1000,26174=>1000,26175=>1000,26176=>1000,26177=>1000,26178=>1000,26179=>1000,26180=>1000, - 26181=>1000,26182=>1000,26183=>1000,26184=>1000,26185=>1000,26186=>1000,26187=>1000,26188=>1000,26189=>1000,26190=>1000,26191=>1000,26192=>1000,26193=>1000,26194=>1000,26195=>1000,26196=>1000, - 26197=>1000,26198=>1000,26199=>1000,26200=>1000,26201=>1000,26202=>1000,26203=>1000,26204=>1000,26205=>1000,26206=>1000,26207=>1000,26208=>1000,26209=>1000,26210=>1000,26211=>1000,26212=>1000, - 26213=>1000,26214=>1000,26215=>1000,26216=>1000,26217=>1000,26218=>1000,26219=>1000,26220=>1000,26221=>1000,26222=>1000,26223=>1000,26224=>1000,26225=>1000,26226=>1000,26227=>1000,26228=>1000, - 26229=>1000,26230=>1000,26231=>1000,26232=>1000,26233=>1000,26234=>1000,26235=>1000,26236=>1000,26237=>1000,26238=>1000,26239=>1000,26240=>1000,26241=>1000,26242=>1000,26243=>1000,26244=>1000, - 26245=>1000,26246=>1000,26247=>1000,26248=>1000,26249=>1000,26250=>1000,26251=>1000,26252=>1000,26253=>1000,26254=>1000,26255=>1000,26256=>1000,26257=>1000,26258=>1000,26259=>1000,26260=>1000, - 26261=>1000,26262=>1000,26263=>1000,26264=>1000,26265=>1000,26266=>1000,26267=>1000,26268=>1000,26269=>1000,26270=>1000,26271=>1000,26272=>1000,26273=>1000,26274=>1000,26275=>1000,26276=>1000, - 26277=>1000,26278=>1000,26279=>1000,26280=>1000,26281=>1000,26282=>1000,26283=>1000,26284=>1000,26285=>1000,26286=>1000,26287=>1000,26288=>1000,26289=>1000,26290=>1000,26291=>1000,26292=>1000, - 26293=>1000,26294=>1000,26295=>1000,26296=>1000,26297=>1000,26298=>1000,26299=>1000,26300=>1000,26301=>1000,26302=>1000,26303=>1000,26304=>1000,26305=>1000,26306=>1000,26307=>1000,26308=>1000, - 26309=>1000,26310=>1000,26311=>1000,26312=>1000,26313=>1000,26314=>1000,26315=>1000,26316=>1000,26317=>1000,26318=>1000,26319=>1000,26320=>1000,26321=>1000,26322=>1000,26323=>1000,26324=>1000, - 26325=>1000,26326=>1000,26327=>1000,26328=>1000,26329=>1000,26330=>1000,26331=>1000,26332=>1000,26333=>1000,26334=>1000,26335=>1000,26336=>1000,26337=>1000,26338=>1000,26339=>1000,26340=>1000, - 26341=>1000,26342=>1000,26343=>1000,26344=>1000,26345=>1000,26346=>1000,26347=>1000,26348=>1000,26349=>1000,26350=>1000,26351=>1000,26352=>1000,26353=>1000,26354=>1000,26355=>1000,26356=>1000, - 26357=>1000,26358=>1000,26359=>1000,26360=>1000,26361=>1000,26362=>1000,26363=>1000,26364=>1000,26365=>1000,26366=>1000,26367=>1000,26368=>1000,26369=>1000,26370=>1000,26371=>1000,26372=>1000, - 26373=>1000,26374=>1000,26375=>1000,26376=>1000,26377=>1000,26378=>1000,26379=>1000,26380=>1000,26381=>1000,26382=>1000,26383=>1000,26384=>1000,26385=>1000,26386=>1000,26387=>1000,26388=>1000, - 26389=>1000,26390=>1000,26391=>1000,26392=>1000,26393=>1000,26394=>1000,26395=>1000,26396=>1000,26397=>1000,26398=>1000,26399=>1000,26400=>1000,26401=>1000,26402=>1000,26403=>1000,26404=>1000, - 26405=>1000,26406=>1000,26407=>1000,26408=>1000,26409=>1000,26410=>1000,26411=>1000,26412=>1000,26413=>1000,26414=>1000,26415=>1000,26416=>1000,26417=>1000,26418=>1000,26419=>1000,26420=>1000, - 26421=>1000,26422=>1000,26423=>1000,26424=>1000,26425=>1000,26426=>1000,26427=>1000,26428=>1000,26429=>1000,26430=>1000,26431=>1000,26432=>1000,26433=>1000,26434=>1000,26435=>1000,26436=>1000, - 26437=>1000,26438=>1000,26439=>1000,26440=>1000,26441=>1000,26442=>1000,26443=>1000,26444=>1000,26445=>1000,26446=>1000,26447=>1000,26448=>1000,26449=>1000,26450=>1000,26451=>1000,26452=>1000, - 26453=>1000,26454=>1000,26455=>1000,26456=>1000,26457=>1000,26458=>1000,26459=>1000,26460=>1000,26461=>1000,26462=>1000,26463=>1000,26464=>1000,26465=>1000,26466=>1000,26467=>1000,26468=>1000, - 26469=>1000,26470=>1000,26471=>1000,26472=>1000,26473=>1000,26474=>1000,26475=>1000,26476=>1000,26477=>1000,26478=>1000,26479=>1000,26480=>1000,26481=>1000,26482=>1000,26483=>1000,26484=>1000, - 26485=>1000,26486=>1000,26487=>1000,26488=>1000,26489=>1000,26490=>1000,26491=>1000,26492=>1000,26493=>1000,26494=>1000,26495=>1000,26496=>1000,26497=>1000,26498=>1000,26499=>1000,26500=>1000, - 26501=>1000,26502=>1000,26503=>1000,26504=>1000,26505=>1000,26506=>1000,26507=>1000,26508=>1000,26509=>1000,26510=>1000,26511=>1000,26512=>1000,26513=>1000,26514=>1000,26515=>1000,26516=>1000, - 26517=>1000,26518=>1000,26519=>1000,26520=>1000,26521=>1000,26522=>1000,26523=>1000,26524=>1000,26525=>1000,26526=>1000,26527=>1000,26528=>1000,26529=>1000,26530=>1000,26531=>1000,26532=>1000, - 26533=>1000,26534=>1000,26535=>1000,26536=>1000,26537=>1000,26538=>1000,26539=>1000,26540=>1000,26541=>1000,26542=>1000,26543=>1000,26544=>1000,26545=>1000,26546=>1000,26547=>1000,26548=>1000, - 26549=>1000,26550=>1000,26551=>1000,26552=>1000,26553=>1000,26554=>1000,26555=>1000,26556=>1000,26557=>1000,26558=>1000,26559=>1000,26560=>1000,26561=>1000,26562=>1000,26563=>1000,26564=>1000, - 26565=>1000,26566=>1000,26567=>1000,26568=>1000,26569=>1000,26570=>1000,26571=>1000,26572=>1000,26573=>1000,26574=>1000,26575=>1000,26576=>1000,26577=>1000,26578=>1000,26579=>1000,26580=>1000, - 26581=>1000,26582=>1000,26583=>1000,26584=>1000,26585=>1000,26586=>1000,26587=>1000,26588=>1000,26589=>1000,26590=>1000,26591=>1000,26592=>1000,26593=>1000,26594=>1000,26595=>1000,26596=>1000, - 26597=>1000,26598=>1000,26599=>1000,26600=>1000,26601=>1000,26602=>1000,26603=>1000,26604=>1000,26605=>1000,26606=>1000,26607=>1000,26608=>1000,26609=>1000,26610=>1000,26611=>1000,26612=>1000, - 26613=>1000,26614=>1000,26615=>1000,26616=>1000,26617=>1000,26618=>1000,26619=>1000,26620=>1000,26621=>1000,26622=>1000,26623=>1000,26624=>1000,26625=>1000,26626=>1000,26627=>1000,26628=>1000, - 26629=>1000,26630=>1000,26631=>1000,26632=>1000,26633=>1000,26634=>1000,26635=>1000,26636=>1000,26637=>1000,26638=>1000,26639=>1000,26640=>1000,26641=>1000,26642=>1000,26643=>1000,26644=>1000, - 26645=>1000,26646=>1000,26647=>1000,26648=>1000,26649=>1000,26650=>1000,26651=>1000,26652=>1000,26653=>1000,26654=>1000,26655=>1000,26656=>1000,26657=>1000,26658=>1000,26659=>1000,26660=>1000, - 26661=>1000,26662=>1000,26663=>1000,26664=>1000,26665=>1000,26666=>1000,26667=>1000,26668=>1000,26669=>1000,26670=>1000,26671=>1000,26672=>1000,26673=>1000,26674=>1000,26675=>1000,26676=>1000, - 26677=>1000,26678=>1000,26679=>1000,26680=>1000,26681=>1000,26682=>1000,26683=>1000,26684=>1000,26685=>1000,26686=>1000,26687=>1000,26688=>1000,26689=>1000,26690=>1000,26691=>1000,26692=>1000, - 26693=>1000,26694=>1000,26695=>1000,26696=>1000,26697=>1000,26698=>1000,26699=>1000,26700=>1000,26701=>1000,26702=>1000,26703=>1000,26704=>1000,26705=>1000,26706=>1000,26707=>1000,26708=>1000, - 26709=>1000,26710=>1000,26711=>1000,26712=>1000,26713=>1000,26714=>1000,26715=>1000,26716=>1000,26717=>1000,26718=>1000,26719=>1000,26720=>1000,26721=>1000,26722=>1000,26723=>1000,26724=>1000, - 26725=>1000,26726=>1000,26727=>1000,26728=>1000,26729=>1000,26730=>1000,26731=>1000,26732=>1000,26733=>1000,26734=>1000,26735=>1000,26736=>1000,26737=>1000,26738=>1000,26739=>1000,26740=>1000, - 26741=>1000,26742=>1000,26743=>1000,26744=>1000,26745=>1000,26746=>1000,26747=>1000,26748=>1000,26749=>1000,26750=>1000,26751=>1000,26752=>1000,26753=>1000,26754=>1000,26755=>1000,26756=>1000, - 26757=>1000,26758=>1000,26759=>1000,26760=>1000,26761=>1000,26762=>1000,26763=>1000,26764=>1000,26765=>1000,26766=>1000,26767=>1000,26768=>1000,26769=>1000,26770=>1000,26771=>1000,26772=>1000, - 26773=>1000,26774=>1000,26775=>1000,26776=>1000,26777=>1000,26778=>1000,26779=>1000,26780=>1000,26781=>1000,26782=>1000,26783=>1000,26784=>1000,26785=>1000,26786=>1000,26787=>1000,26788=>1000, - 26789=>1000,26790=>1000,26791=>1000,26792=>1000,26793=>1000,26794=>1000,26795=>1000,26796=>1000,26797=>1000,26798=>1000,26799=>1000,26800=>1000,26801=>1000,26802=>1000,26803=>1000,26804=>1000, - 26805=>1000,26806=>1000,26807=>1000,26808=>1000,26809=>1000,26810=>1000,26811=>1000,26812=>1000,26813=>1000,26814=>1000,26815=>1000,26816=>1000,26817=>1000,26818=>1000,26819=>1000,26820=>1000, - 26821=>1000,26822=>1000,26823=>1000,26824=>1000,26825=>1000,26826=>1000,26827=>1000,26828=>1000,26829=>1000,26830=>1000,26831=>1000,26832=>1000,26833=>1000,26834=>1000,26835=>1000,26836=>1000, - 26837=>1000,26838=>1000,26839=>1000,26840=>1000,26841=>1000,26842=>1000,26843=>1000,26844=>1000,26845=>1000,26846=>1000,26847=>1000,26848=>1000,26849=>1000,26850=>1000,26851=>1000,26852=>1000, - 26853=>1000,26854=>1000,26855=>1000,26856=>1000,26857=>1000,26858=>1000,26859=>1000,26860=>1000,26861=>1000,26862=>1000,26863=>1000,26864=>1000,26865=>1000,26866=>1000,26867=>1000,26868=>1000, - 26869=>1000,26870=>1000,26871=>1000,26872=>1000,26873=>1000,26874=>1000,26875=>1000,26876=>1000,26877=>1000,26878=>1000,26879=>1000,26880=>1000,26881=>1000,26882=>1000,26883=>1000,26884=>1000, - 26885=>1000,26886=>1000,26887=>1000,26888=>1000,26889=>1000,26890=>1000,26891=>1000,26892=>1000,26893=>1000,26894=>1000,26895=>1000,26896=>1000,26897=>1000,26898=>1000,26899=>1000,26900=>1000, - 26901=>1000,26902=>1000,26903=>1000,26904=>1000,26905=>1000,26906=>1000,26907=>1000,26908=>1000,26909=>1000,26910=>1000,26911=>1000,26912=>1000,26913=>1000,26914=>1000,26915=>1000,26916=>1000, - 26917=>1000,26918=>1000,26919=>1000,26920=>1000,26921=>1000,26922=>1000,26923=>1000,26924=>1000,26925=>1000,26926=>1000,26927=>1000,26928=>1000,26929=>1000,26930=>1000,26931=>1000,26932=>1000, - 26933=>1000,26934=>1000,26935=>1000,26936=>1000,26937=>1000,26938=>1000,26939=>1000,26940=>1000,26941=>1000,26942=>1000,26943=>1000,26944=>1000,26945=>1000,26946=>1000,26947=>1000,26948=>1000, - 26949=>1000,26950=>1000,26951=>1000,26952=>1000,26953=>1000,26954=>1000,26955=>1000,26956=>1000,26957=>1000,26958=>1000,26959=>1000,26960=>1000,26961=>1000,26962=>1000,26963=>1000,26964=>1000, - 26965=>1000,26966=>1000,26967=>1000,26968=>1000,26969=>1000,26970=>1000,26971=>1000,26972=>1000,26973=>1000,26974=>1000,26975=>1000,26976=>1000,26977=>1000,26978=>1000,26979=>1000,26980=>1000, - 26981=>1000,26982=>1000,26983=>1000,26984=>1000,26985=>1000,26986=>1000,26987=>1000,26988=>1000,26989=>1000,26990=>1000,26991=>1000,26992=>1000,26993=>1000,26994=>1000,26995=>1000,26996=>1000, - 26997=>1000,26998=>1000,26999=>1000,27000=>1000,27001=>1000,27002=>1000,27003=>1000,27004=>1000,27005=>1000,27006=>1000,27007=>1000,27008=>1000,27009=>1000,27010=>1000,27011=>1000,27012=>1000, - 27013=>1000,27014=>1000,27015=>1000,27016=>1000,27017=>1000,27018=>1000,27019=>1000,27020=>1000,27021=>1000,27022=>1000,27023=>1000,27024=>1000,27025=>1000,27026=>1000,27027=>1000,27028=>1000, - 27029=>1000,27030=>1000,27031=>1000,27032=>1000,27033=>1000,27034=>1000,27035=>1000,27036=>1000,27037=>1000,27038=>1000,27039=>1000,27040=>1000,27041=>1000,27042=>1000,27043=>1000,27044=>1000, - 27045=>1000,27046=>1000,27047=>1000,27048=>1000,27049=>1000,27050=>1000,27051=>1000,27052=>1000,27053=>1000,27054=>1000,27055=>1000,27056=>1000,27057=>1000,27058=>1000,27059=>1000,27060=>1000, - 27061=>1000,27062=>1000,27063=>1000,27064=>1000,27065=>1000,27066=>1000,27067=>1000,27068=>1000,27069=>1000,27070=>1000,27071=>1000,27072=>1000,27073=>1000,27074=>1000,27075=>1000,27076=>1000, - 27077=>1000,27078=>1000,27079=>1000,27080=>1000,27081=>1000,27082=>1000,27083=>1000,27084=>1000,27085=>1000,27086=>1000,27087=>1000,27088=>1000,27089=>1000,27090=>1000,27091=>1000,27092=>1000, - 27093=>1000,27094=>1000,27095=>1000,27096=>1000,27097=>1000,27098=>1000,27099=>1000,27100=>1000,27101=>1000,27102=>1000,27103=>1000,27104=>1000,27105=>1000,27106=>1000,27107=>1000,27108=>1000, - 27109=>1000,27110=>1000,27111=>1000,27112=>1000,27113=>1000,27114=>1000,27115=>1000,27116=>1000,27117=>1000,27118=>1000,27119=>1000,27120=>1000,27121=>1000,27122=>1000,27123=>1000,27124=>1000, - 27125=>1000,27126=>1000,27127=>1000,27128=>1000,27129=>1000,27130=>1000,27131=>1000,27132=>1000,27133=>1000,27134=>1000,27135=>1000,27136=>1000,27137=>1000,27138=>1000,27139=>1000,27140=>1000, - 27141=>1000,27142=>1000,27143=>1000,27144=>1000,27145=>1000,27146=>1000,27147=>1000,27148=>1000,27149=>1000,27150=>1000,27151=>1000,27152=>1000,27153=>1000,27154=>1000,27155=>1000,27156=>1000, - 27157=>1000,27158=>1000,27159=>1000,27160=>1000,27161=>1000,27162=>1000,27163=>1000,27164=>1000,27165=>1000,27166=>1000,27167=>1000,27168=>1000,27169=>1000,27170=>1000,27171=>1000,27172=>1000, - 27173=>1000,27174=>1000,27175=>1000,27176=>1000,27177=>1000,27178=>1000,27179=>1000,27180=>1000,27181=>1000,27182=>1000,27183=>1000,27184=>1000,27185=>1000,27186=>1000,27187=>1000,27188=>1000, - 27189=>1000,27190=>1000,27191=>1000,27192=>1000,27193=>1000,27194=>1000,27195=>1000,27196=>1000,27197=>1000,27198=>1000,27199=>1000,27200=>1000,27201=>1000,27202=>1000,27203=>1000,27204=>1000, - 27205=>1000,27206=>1000,27207=>1000,27208=>1000,27209=>1000,27210=>1000,27211=>1000,27212=>1000,27213=>1000,27214=>1000,27215=>1000,27216=>1000,27217=>1000,27218=>1000,27219=>1000,27220=>1000, - 27221=>1000,27222=>1000,27223=>1000,27224=>1000,27225=>1000,27226=>1000,27227=>1000,27228=>1000,27229=>1000,27230=>1000,27231=>1000,27232=>1000,27233=>1000,27234=>1000,27235=>1000,27236=>1000, - 27237=>1000,27238=>1000,27239=>1000,27240=>1000,27241=>1000,27242=>1000,27243=>1000,27244=>1000,27245=>1000,27246=>1000,27247=>1000,27248=>1000,27249=>1000,27250=>1000,27251=>1000,27252=>1000, - 27253=>1000,27254=>1000,27255=>1000,27256=>1000,27257=>1000,27258=>1000,27259=>1000,27260=>1000,27261=>1000,27262=>1000,27263=>1000,27264=>1000,27265=>1000,27266=>1000,27267=>1000,27268=>1000, - 27269=>1000,27270=>1000,27271=>1000,27272=>1000,27273=>1000,27274=>1000,27275=>1000,27276=>1000,27277=>1000,27278=>1000,27279=>1000,27280=>1000,27281=>1000,27282=>1000,27283=>1000,27284=>1000, - 27285=>1000,27286=>1000,27287=>1000,27288=>1000,27289=>1000,27290=>1000,27291=>1000,27292=>1000,27293=>1000,27294=>1000,27295=>1000,27296=>1000,27297=>1000,27298=>1000,27299=>1000,27300=>1000, - 27301=>1000,27302=>1000,27303=>1000,27304=>1000,27305=>1000,27306=>1000,27307=>1000,27308=>1000,27309=>1000,27310=>1000,27311=>1000,27312=>1000,27313=>1000,27314=>1000,27315=>1000,27316=>1000, - 27317=>1000,27318=>1000,27319=>1000,27320=>1000,27321=>1000,27322=>1000,27323=>1000,27324=>1000,27325=>1000,27326=>1000,27327=>1000,27328=>1000,27329=>1000,27330=>1000,27331=>1000,27332=>1000, - 27333=>1000,27334=>1000,27335=>1000,27336=>1000,27337=>1000,27338=>1000,27339=>1000,27340=>1000,27341=>1000,27342=>1000,27343=>1000,27344=>1000,27345=>1000,27346=>1000,27347=>1000,27348=>1000, - 27349=>1000,27350=>1000,27351=>1000,27352=>1000,27353=>1000,27354=>1000,27355=>1000,27356=>1000,27357=>1000,27358=>1000,27359=>1000,27360=>1000,27361=>1000,27362=>1000,27363=>1000,27364=>1000, - 27365=>1000,27366=>1000,27367=>1000,27368=>1000,27369=>1000,27370=>1000,27371=>1000,27372=>1000,27373=>1000,27374=>1000,27375=>1000,27376=>1000,27377=>1000,27378=>1000,27379=>1000,27380=>1000, - 27381=>1000,27382=>1000,27383=>1000,27384=>1000,27385=>1000,27386=>1000,27387=>1000,27388=>1000,27389=>1000,27390=>1000,27391=>1000,27392=>1000,27393=>1000,27394=>1000,27395=>1000,27396=>1000, - 27397=>1000,27398=>1000,27399=>1000,27400=>1000,27401=>1000,27402=>1000,27403=>1000,27404=>1000,27405=>1000,27406=>1000,27407=>1000,27408=>1000,27409=>1000,27410=>1000,27411=>1000,27412=>1000, - 27413=>1000,27414=>1000,27415=>1000,27416=>1000,27417=>1000,27418=>1000,27419=>1000,27420=>1000,27421=>1000,27422=>1000,27423=>1000,27424=>1000,27425=>1000,27426=>1000,27427=>1000,27428=>1000, - 27429=>1000,27430=>1000,27431=>1000,27432=>1000,27433=>1000,27434=>1000,27435=>1000,27436=>1000,27437=>1000,27438=>1000,27439=>1000,27440=>1000,27441=>1000,27442=>1000,27443=>1000,27444=>1000, - 27445=>1000,27446=>1000,27447=>1000,27448=>1000,27449=>1000,27450=>1000,27451=>1000,27452=>1000,27453=>1000,27454=>1000,27455=>1000,27456=>1000,27457=>1000,27458=>1000,27459=>1000,27460=>1000, - 27461=>1000,27462=>1000,27463=>1000,27464=>1000,27465=>1000,27466=>1000,27467=>1000,27468=>1000,27469=>1000,27470=>1000,27471=>1000,27472=>1000,27473=>1000,27474=>1000,27475=>1000,27476=>1000, - 27477=>1000,27478=>1000,27479=>1000,27480=>1000,27481=>1000,27482=>1000,27483=>1000,27484=>1000,27485=>1000,27486=>1000,27487=>1000,27488=>1000,27489=>1000,27490=>1000,27491=>1000,27492=>1000, - 27493=>1000,27494=>1000,27495=>1000,27496=>1000,27497=>1000,27498=>1000,27499=>1000,27500=>1000,27501=>1000,27502=>1000,27503=>1000,27504=>1000,27505=>1000,27506=>1000,27507=>1000,27508=>1000, - 27509=>1000,27510=>1000,27511=>1000,27512=>1000,27513=>1000,27514=>1000,27515=>1000,27516=>1000,27517=>1000,27518=>1000,27519=>1000,27520=>1000,27521=>1000,27522=>1000,27523=>1000,27524=>1000, - 27525=>1000,27526=>1000,27527=>1000,27528=>1000,27529=>1000,27530=>1000,27531=>1000,27532=>1000,27533=>1000,27534=>1000,27535=>1000,27536=>1000,27537=>1000,27538=>1000,27539=>1000,27540=>1000, - 27541=>1000,27542=>1000,27543=>1000,27544=>1000,27545=>1000,27546=>1000,27547=>1000,27548=>1000,27549=>1000,27550=>1000,27551=>1000,27552=>1000,27553=>1000,27554=>1000,27555=>1000,27556=>1000, - 27557=>1000,27558=>1000,27559=>1000,27560=>1000,27561=>1000,27562=>1000,27563=>1000,27564=>1000,27565=>1000,27566=>1000,27567=>1000,27568=>1000,27569=>1000,27570=>1000,27571=>1000,27572=>1000, - 27573=>1000,27574=>1000,27575=>1000,27576=>1000,27577=>1000,27578=>1000,27579=>1000,27580=>1000,27581=>1000,27582=>1000,27583=>1000,27584=>1000,27585=>1000,27586=>1000,27587=>1000,27588=>1000, - 27589=>1000,27590=>1000,27591=>1000,27592=>1000,27593=>1000,27594=>1000,27595=>1000,27596=>1000,27597=>1000,27598=>1000,27599=>1000,27600=>1000,27601=>1000,27602=>1000,27603=>1000,27604=>1000, - 27605=>1000,27606=>1000,27607=>1000,27608=>1000,27609=>1000,27610=>1000,27611=>1000,27612=>1000,27613=>1000,27614=>1000,27615=>1000,27616=>1000,27617=>1000,27618=>1000,27619=>1000,27620=>1000, - 27621=>1000,27622=>1000,27623=>1000,27624=>1000,27625=>1000,27626=>1000,27627=>1000,27628=>1000,27629=>1000,27630=>1000,27631=>1000,27632=>1000,27633=>1000,27634=>1000,27635=>1000,27636=>1000, - 27637=>1000,27638=>1000,27639=>1000,27640=>1000,27641=>1000,27642=>1000,27643=>1000,27644=>1000,27645=>1000,27646=>1000,27647=>1000,27648=>1000,27649=>1000,27650=>1000,27651=>1000,27652=>1000, - 27653=>1000,27654=>1000,27655=>1000,27656=>1000,27657=>1000,27658=>1000,27659=>1000,27660=>1000,27661=>1000,27662=>1000,27663=>1000,27664=>1000,27665=>1000,27666=>1000,27667=>1000,27668=>1000, - 27669=>1000,27670=>1000,27671=>1000,27672=>1000,27673=>1000,27674=>1000,27675=>1000,27676=>1000,27677=>1000,27678=>1000,27679=>1000,27680=>1000,27681=>1000,27682=>1000,27683=>1000,27684=>1000, - 27685=>1000,27686=>1000,27687=>1000,27688=>1000,27689=>1000,27690=>1000,27691=>1000,27692=>1000,27693=>1000,27694=>1000,27695=>1000,27696=>1000,27697=>1000,27698=>1000,27699=>1000,27700=>1000, - 27701=>1000,27702=>1000,27703=>1000,27704=>1000,27705=>1000,27706=>1000,27707=>1000,27708=>1000,27709=>1000,27710=>1000,27711=>1000,27712=>1000,27713=>1000,27714=>1000,27715=>1000,27716=>1000, - 27717=>1000,27718=>1000,27719=>1000,27720=>1000,27721=>1000,27722=>1000,27723=>1000,27724=>1000,27725=>1000,27726=>1000,27727=>1000,27728=>1000,27729=>1000,27730=>1000,27731=>1000,27732=>1000, - 27733=>1000,27734=>1000,27735=>1000,27736=>1000,27737=>1000,27738=>1000,27739=>1000,27740=>1000,27741=>1000,27742=>1000,27743=>1000,27744=>1000,27745=>1000,27746=>1000,27747=>1000,27748=>1000, - 27749=>1000,27750=>1000,27751=>1000,27752=>1000,27753=>1000,27754=>1000,27755=>1000,27756=>1000,27757=>1000,27758=>1000,27759=>1000,27760=>1000,27761=>1000,27762=>1000,27763=>1000,27764=>1000, - 27765=>1000,27766=>1000,27767=>1000,27768=>1000,27769=>1000,27770=>1000,27771=>1000,27772=>1000,27773=>1000,27774=>1000,27775=>1000,27776=>1000,27777=>1000,27778=>1000,27779=>1000,27780=>1000, - 27781=>1000,27782=>1000,27783=>1000,27784=>1000,27785=>1000,27786=>1000,27787=>1000,27788=>1000,27789=>1000,27790=>1000,27791=>1000,27792=>1000,27793=>1000,27794=>1000,27795=>1000,27796=>1000, - 27797=>1000,27798=>1000,27799=>1000,27800=>1000,27801=>1000,27802=>1000,27803=>1000,27804=>1000,27805=>1000,27806=>1000,27807=>1000,27808=>1000,27809=>1000,27810=>1000,27811=>1000,27812=>1000, - 27813=>1000,27814=>1000,27815=>1000,27816=>1000,27817=>1000,27818=>1000,27819=>1000,27820=>1000,27821=>1000,27822=>1000,27823=>1000,27824=>1000,27825=>1000,27826=>1000,27827=>1000,27828=>1000, - 27829=>1000,27830=>1000,27831=>1000,27832=>1000,27833=>1000,27834=>1000,27835=>1000,27836=>1000,27837=>1000,27838=>1000,27839=>1000,27840=>1000,27841=>1000,27842=>1000,27843=>1000,27844=>1000, - 27845=>1000,27846=>1000,27847=>1000,27848=>1000,27849=>1000,27850=>1000,27851=>1000,27852=>1000,27853=>1000,27854=>1000,27855=>1000,27856=>1000,27857=>1000,27858=>1000,27859=>1000,27860=>1000, - 27861=>1000,27862=>1000,27863=>1000,27864=>1000,27865=>1000,27866=>1000,27867=>1000,27868=>1000,27869=>1000,27870=>1000,27871=>1000,27872=>1000,27873=>1000,27874=>1000,27875=>1000,27876=>1000, - 27877=>1000,27878=>1000,27879=>1000,27880=>1000,27881=>1000,27882=>1000,27883=>1000,27884=>1000,27885=>1000,27886=>1000,27887=>1000,27888=>1000,27889=>1000,27890=>1000,27891=>1000,27892=>1000, - 27893=>1000,27894=>1000,27895=>1000,27896=>1000,27897=>1000,27898=>1000,27899=>1000,27900=>1000,27901=>1000,27902=>1000,27903=>1000,27904=>1000,27905=>1000,27906=>1000,27907=>1000,27908=>1000, - 27909=>1000,27910=>1000,27911=>1000,27912=>1000,27913=>1000,27914=>1000,27915=>1000,27916=>1000,27917=>1000,27918=>1000,27919=>1000,27920=>1000,27921=>1000,27922=>1000,27923=>1000,27924=>1000, - 27925=>1000,27926=>1000,27927=>1000,27928=>1000,27929=>1000,27930=>1000,27931=>1000,27932=>1000,27933=>1000,27934=>1000,27935=>1000,27936=>1000,27937=>1000,27938=>1000,27939=>1000,27940=>1000, - 27941=>1000,27942=>1000,27943=>1000,27944=>1000,27945=>1000,27946=>1000,27947=>1000,27948=>1000,27949=>1000,27950=>1000,27951=>1000,27952=>1000,27953=>1000,27954=>1000,27955=>1000,27956=>1000, - 27957=>1000,27958=>1000,27959=>1000,27960=>1000,27961=>1000,27962=>1000,27963=>1000,27964=>1000,27965=>1000,27966=>1000,27967=>1000,27968=>1000,27969=>1000,27970=>1000,27971=>1000,27972=>1000, - 27973=>1000,27974=>1000,27975=>1000,27976=>1000,27977=>1000,27978=>1000,27979=>1000,27980=>1000,27981=>1000,27982=>1000,27983=>1000,27984=>1000,27985=>1000,27986=>1000,27987=>1000,27988=>1000, - 27989=>1000,27990=>1000,27991=>1000,27992=>1000,27993=>1000,27994=>1000,27995=>1000,27996=>1000,27997=>1000,27998=>1000,27999=>1000,28000=>1000,28001=>1000,28002=>1000,28003=>1000,28004=>1000, - 28005=>1000,28006=>1000,28007=>1000,28008=>1000,28009=>1000,28010=>1000,28011=>1000,28012=>1000,28013=>1000,28014=>1000,28015=>1000,28016=>1000,28017=>1000,28018=>1000,28019=>1000,28020=>1000, - 28021=>1000,28022=>1000,28023=>1000,28024=>1000,28025=>1000,28026=>1000,28027=>1000,28028=>1000,28029=>1000,28030=>1000,28031=>1000,28032=>1000,28033=>1000,28034=>1000,28035=>1000,28036=>1000, - 28037=>1000,28038=>1000,28039=>1000,28040=>1000,28041=>1000,28042=>1000,28043=>1000,28044=>1000,28045=>1000,28046=>1000,28047=>1000,28048=>1000,28049=>1000,28050=>1000,28051=>1000,28052=>1000, - 28053=>1000,28054=>1000,28055=>1000,28056=>1000,28057=>1000,28058=>1000,28059=>1000,28060=>1000,28061=>1000,28062=>1000,28063=>1000,28064=>1000,28065=>1000,28066=>1000,28067=>1000,28068=>1000, - 28069=>1000,28070=>1000,28071=>1000,28072=>1000,28073=>1000,28074=>1000,28075=>1000,28076=>1000,28077=>1000,28078=>1000,28079=>1000,28080=>1000,28081=>1000,28082=>1000,28083=>1000,28084=>1000, - 28085=>1000,28086=>1000,28087=>1000,28088=>1000,28089=>1000,28090=>1000,28091=>1000,28092=>1000,28093=>1000,28094=>1000,28095=>1000,28096=>1000,28097=>1000,28098=>1000,28099=>1000,28100=>1000, - 28101=>1000,28102=>1000,28103=>1000,28104=>1000,28105=>1000,28106=>1000,28107=>1000,28108=>1000,28109=>1000,28110=>1000,28111=>1000,28112=>1000,28113=>1000,28114=>1000,28115=>1000,28116=>1000, - 28117=>1000,28118=>1000,28119=>1000,28120=>1000,28121=>1000,28122=>1000,28123=>1000,28124=>1000,28125=>1000,28126=>1000,28127=>1000,28128=>1000,28129=>1000,28130=>1000,28131=>1000,28132=>1000, - 28133=>1000,28134=>1000,28135=>1000,28136=>1000,28137=>1000,28138=>1000,28139=>1000,28140=>1000,28141=>1000,28142=>1000,28143=>1000,28144=>1000,28145=>1000,28146=>1000,28147=>1000,28148=>1000, - 28149=>1000,28150=>1000,28151=>1000,28152=>1000,28153=>1000,28154=>1000,28155=>1000,28156=>1000,28157=>1000,28158=>1000,28159=>1000,28160=>1000,28161=>1000,28162=>1000,28163=>1000,28164=>1000, - 28165=>1000,28166=>1000,28167=>1000,28168=>1000,28169=>1000,28170=>1000,28171=>1000,28172=>1000,28173=>1000,28174=>1000,28175=>1000,28176=>1000,28177=>1000,28178=>1000,28179=>1000,28180=>1000, - 28181=>1000,28182=>1000,28183=>1000,28184=>1000,28185=>1000,28186=>1000,28187=>1000,28188=>1000,28189=>1000,28190=>1000,28191=>1000,28192=>1000,28193=>1000,28194=>1000,28195=>1000,28196=>1000, - 28197=>1000,28198=>1000,28199=>1000,28200=>1000,28201=>1000,28202=>1000,28203=>1000,28204=>1000,28205=>1000,28206=>1000,28207=>1000,28208=>1000,28209=>1000,28210=>1000,28211=>1000,28212=>1000, - 28213=>1000,28214=>1000,28215=>1000,28216=>1000,28217=>1000,28218=>1000,28219=>1000,28220=>1000,28221=>1000,28222=>1000,28223=>1000,28224=>1000,28225=>1000,28226=>1000,28227=>1000,28228=>1000, - 28229=>1000,28230=>1000,28231=>1000,28232=>1000,28233=>1000,28234=>1000,28235=>1000,28236=>1000,28237=>1000,28238=>1000,28239=>1000,28240=>1000,28241=>1000,28242=>1000,28243=>1000,28244=>1000, - 28245=>1000,28246=>1000,28247=>1000,28248=>1000,28249=>1000,28250=>1000,28251=>1000,28252=>1000,28253=>1000,28254=>1000,28255=>1000,28256=>1000,28257=>1000,28258=>1000,28259=>1000,28260=>1000, - 28261=>1000,28262=>1000,28263=>1000,28264=>1000,28265=>1000,28266=>1000,28267=>1000,28268=>1000,28269=>1000,28270=>1000,28271=>1000,28272=>1000,28273=>1000,28274=>1000,28275=>1000,28276=>1000, - 28277=>1000,28278=>1000,28279=>1000,28280=>1000,28281=>1000,28282=>1000,28283=>1000,28284=>1000,28285=>1000,28286=>1000,28287=>1000,28288=>1000,28289=>1000,28290=>1000,28291=>1000,28292=>1000, - 28293=>1000,28294=>1000,28295=>1000,28296=>1000,28297=>1000,28298=>1000,28299=>1000,28300=>1000,28301=>1000,28302=>1000,28303=>1000,28304=>1000,28305=>1000,28306=>1000,28307=>1000,28308=>1000, - 28309=>1000,28310=>1000,28311=>1000,28312=>1000,28313=>1000,28314=>1000,28315=>1000,28316=>1000,28317=>1000,28318=>1000,28319=>1000,28320=>1000,28321=>1000,28322=>1000,28323=>1000,28324=>1000, - 28325=>1000,28326=>1000,28327=>1000,28328=>1000,28329=>1000,28330=>1000,28331=>1000,28332=>1000,28333=>1000,28334=>1000,28335=>1000,28336=>1000,28337=>1000,28338=>1000,28339=>1000,28340=>1000, - 28341=>1000,28342=>1000,28343=>1000,28344=>1000,28345=>1000,28346=>1000,28347=>1000,28348=>1000,28349=>1000,28350=>1000,28351=>1000,28352=>1000,28353=>1000,28354=>1000,28355=>1000,28356=>1000, - 28357=>1000,28358=>1000,28359=>1000,28360=>1000,28361=>1000,28362=>1000,28363=>1000,28364=>1000,28365=>1000,28366=>1000,28367=>1000,28368=>1000,28369=>1000,28370=>1000,28371=>1000,28372=>1000, - 28373=>1000,28374=>1000,28375=>1000,28376=>1000,28377=>1000,28378=>1000,28379=>1000,28380=>1000,28381=>1000,28382=>1000,28383=>1000,28384=>1000,28385=>1000,28386=>1000,28387=>1000,28388=>1000, - 28389=>1000,28390=>1000,28391=>1000,28392=>1000,28393=>1000,28394=>1000,28395=>1000,28396=>1000,28397=>1000,28398=>1000,28399=>1000,28400=>1000,28401=>1000,28402=>1000,28403=>1000,28404=>1000, - 28405=>1000,28406=>1000,28407=>1000,28408=>1000,28409=>1000,28410=>1000,28411=>1000,28412=>1000,28413=>1000,28414=>1000,28415=>1000,28416=>1000,28417=>1000,28418=>1000,28419=>1000,28420=>1000, - 28421=>1000,28422=>1000,28423=>1000,28424=>1000,28425=>1000,28426=>1000,28427=>1000,28428=>1000,28429=>1000,28430=>1000,28431=>1000,28432=>1000,28433=>1000,28434=>1000,28435=>1000,28436=>1000, - 28437=>1000,28438=>1000,28439=>1000,28440=>1000,28441=>1000,28442=>1000,28443=>1000,28444=>1000,28445=>1000,28446=>1000,28447=>1000,28448=>1000,28449=>1000,28450=>1000,28451=>1000,28452=>1000, - 28453=>1000,28454=>1000,28455=>1000,28456=>1000,28457=>1000,28458=>1000,28459=>1000,28460=>1000,28461=>1000,28462=>1000,28463=>1000,28464=>1000,28465=>1000,28466=>1000,28467=>1000,28468=>1000, - 28469=>1000,28470=>1000,28471=>1000,28472=>1000,28473=>1000,28474=>1000,28475=>1000,28476=>1000,28477=>1000,28478=>1000,28479=>1000,28480=>1000,28481=>1000,28482=>1000,28483=>1000,28484=>1000, - 28485=>1000,28486=>1000,28487=>1000,28488=>1000,28489=>1000,28490=>1000,28491=>1000,28492=>1000,28493=>1000,28494=>1000,28495=>1000,28496=>1000,28497=>1000,28498=>1000,28499=>1000,28500=>1000, - 28501=>1000,28502=>1000,28503=>1000,28504=>1000,28505=>1000,28506=>1000,28507=>1000,28508=>1000,28509=>1000,28510=>1000,28511=>1000,28512=>1000,28513=>1000,28514=>1000,28515=>1000,28516=>1000, - 28517=>1000,28518=>1000,28519=>1000,28520=>1000,28521=>1000,28522=>1000,28523=>1000,28524=>1000,28525=>1000,28526=>1000,28527=>1000,28528=>1000,28529=>1000,28530=>1000,28531=>1000,28532=>1000, - 28533=>1000,28534=>1000,28535=>1000,28536=>1000,28537=>1000,28538=>1000,28539=>1000,28540=>1000,28541=>1000,28542=>1000,28543=>1000,28544=>1000,28545=>1000,28546=>1000,28547=>1000,28548=>1000, - 28549=>1000,28550=>1000,28551=>1000,28552=>1000,28553=>1000,28554=>1000,28555=>1000,28556=>1000,28557=>1000,28558=>1000,28559=>1000,28560=>1000,28561=>1000,28562=>1000,28563=>1000,28564=>1000, - 28565=>1000,28566=>1000,28567=>1000,28568=>1000,28569=>1000,28570=>1000,28571=>1000,28572=>1000,28573=>1000,28574=>1000,28575=>1000,28576=>1000,28577=>1000,28578=>1000,28579=>1000,28580=>1000, - 28581=>1000,28582=>1000,28583=>1000,28584=>1000,28585=>1000,28586=>1000,28587=>1000,28588=>1000,28589=>1000,28590=>1000,28591=>1000,28592=>1000,28593=>1000,28594=>1000,28595=>1000,28596=>1000, - 28597=>1000,28598=>1000,28599=>1000,28600=>1000,28601=>1000,28602=>1000,28603=>1000,28604=>1000,28605=>1000,28606=>1000,28607=>1000,28608=>1000,28609=>1000,28610=>1000,28611=>1000,28612=>1000, - 28613=>1000,28614=>1000,28615=>1000,28616=>1000,28617=>1000,28618=>1000,28619=>1000,28620=>1000,28621=>1000,28622=>1000,28623=>1000,28624=>1000,28625=>1000,28626=>1000,28627=>1000,28628=>1000, - 28629=>1000,28630=>1000,28631=>1000,28632=>1000,28633=>1000,28634=>1000,28635=>1000,28636=>1000,28637=>1000,28638=>1000,28639=>1000,28640=>1000,28641=>1000,28642=>1000,28643=>1000,28644=>1000, - 28645=>1000,28646=>1000,28647=>1000,28648=>1000,28649=>1000,28650=>1000,28651=>1000,28652=>1000,28653=>1000,28654=>1000,28655=>1000,28656=>1000,28657=>1000,28658=>1000,28659=>1000,28660=>1000, - 28661=>1000,28662=>1000,28663=>1000,28664=>1000,28665=>1000,28666=>1000,28667=>1000,28668=>1000,28669=>1000,28670=>1000,28671=>1000,28672=>1000,28673=>1000,28674=>1000,28675=>1000,28676=>1000, - 28677=>1000,28678=>1000,28679=>1000,28680=>1000,28681=>1000,28682=>1000,28683=>1000,28684=>1000,28685=>1000,28686=>1000,28687=>1000,28688=>1000,28689=>1000,28690=>1000,28691=>1000,28692=>1000, - 28693=>1000,28694=>1000,28695=>1000,28696=>1000,28697=>1000,28698=>1000,28699=>1000,28700=>1000,28701=>1000,28702=>1000,28703=>1000,28704=>1000,28705=>1000,28706=>1000,28707=>1000,28708=>1000, - 28709=>1000,28710=>1000,28711=>1000,28712=>1000,28713=>1000,28714=>1000,28715=>1000,28716=>1000,28717=>1000,28718=>1000,28719=>1000,28720=>1000,28721=>1000,28722=>1000,28723=>1000,28724=>1000, - 28725=>1000,28726=>1000,28727=>1000,28728=>1000,28729=>1000,28730=>1000,28731=>1000,28732=>1000,28733=>1000,28734=>1000,28735=>1000,28736=>1000,28737=>1000,28738=>1000,28739=>1000,28740=>1000, - 28741=>1000,28742=>1000,28743=>1000,28744=>1000,28745=>1000,28746=>1000,28747=>1000,28748=>1000,28749=>1000,28750=>1000,28751=>1000,28752=>1000,28753=>1000,28754=>1000,28755=>1000,28756=>1000, - 28757=>1000,28758=>1000,28759=>1000,28760=>1000,28761=>1000,28762=>1000,28763=>1000,28764=>1000,28765=>1000,28766=>1000,28767=>1000,28768=>1000,28769=>1000,28770=>1000,28771=>1000,28772=>1000, - 28773=>1000,28774=>1000,28775=>1000,28776=>1000,28777=>1000,28778=>1000,28779=>1000,28780=>1000,28781=>1000,28782=>1000,28783=>1000,28784=>1000,28785=>1000,28786=>1000,28787=>1000,28788=>1000, - 28789=>1000,28790=>1000,28791=>1000,28792=>1000,28793=>1000,28794=>1000,28795=>1000,28796=>1000,28797=>1000,28798=>1000,28799=>1000,28800=>1000,28801=>1000,28802=>1000,28803=>1000,28804=>1000, - 28805=>1000,28806=>1000,28807=>1000,28808=>1000,28809=>1000,28810=>1000,28811=>1000,28812=>1000,28813=>1000,28814=>1000,28815=>1000,28816=>1000,28817=>1000,28818=>1000,28819=>1000,28820=>1000, - 28821=>1000,28822=>1000,28823=>1000,28824=>1000,28825=>1000,28826=>1000,28827=>1000,28828=>1000,28829=>1000,28830=>1000,28831=>1000,28832=>1000,28833=>1000,28834=>1000,28835=>1000,28836=>1000, - 28837=>1000,28838=>1000,28839=>1000,28840=>1000,28841=>1000,28842=>1000,28843=>1000,28844=>1000,28845=>1000,28846=>1000,28847=>1000,28848=>1000,28849=>1000,28850=>1000,28851=>1000,28852=>1000, - 28853=>1000,28854=>1000,28855=>1000,28856=>1000,28857=>1000,28858=>1000,28859=>1000,28860=>1000,28861=>1000,28862=>1000,28863=>1000,28864=>1000,28865=>1000,28866=>1000,28867=>1000,28868=>1000, - 28869=>1000,28870=>1000,28871=>1000,28872=>1000,28873=>1000,28874=>1000,28875=>1000,28876=>1000,28877=>1000,28878=>1000,28879=>1000,28880=>1000,28881=>1000,28882=>1000,28883=>1000,28884=>1000, - 28885=>1000,28886=>1000,28887=>1000,28888=>1000,28889=>1000,28890=>1000,28891=>1000,28892=>1000,28893=>1000,28894=>1000,28895=>1000,28896=>1000,28897=>1000,28898=>1000,28899=>1000,28900=>1000, - 28901=>1000,28902=>1000,28903=>1000,28904=>1000,28905=>1000,28906=>1000,28907=>1000,28908=>1000,28909=>1000,28910=>1000,28911=>1000,28912=>1000,28913=>1000,28914=>1000,28915=>1000,28916=>1000, - 28917=>1000,28918=>1000,28919=>1000,28920=>1000,28921=>1000,28922=>1000,28923=>1000,28924=>1000,28925=>1000,28926=>1000,28927=>1000,28928=>1000,28929=>1000,28930=>1000,28931=>1000,28932=>1000, - 28933=>1000,28934=>1000,28935=>1000,28936=>1000,28937=>1000,28938=>1000,28939=>1000,28940=>1000,28941=>1000,28942=>1000,28943=>1000,28944=>1000,28945=>1000,28946=>1000,28947=>1000,28948=>1000, - 28949=>1000,28950=>1000,28951=>1000,28952=>1000,28953=>1000,28954=>1000,28955=>1000,28956=>1000,28957=>1000,28958=>1000,28959=>1000,28960=>1000,28961=>1000,28962=>1000,28963=>1000,28964=>1000, - 28965=>1000,28966=>1000,28967=>1000,28968=>1000,28969=>1000,28970=>1000,28971=>1000,28972=>1000,28973=>1000,28974=>1000,28975=>1000,28976=>1000,28977=>1000,28978=>1000,28979=>1000,28980=>1000, - 28981=>1000,28982=>1000,28983=>1000,28984=>1000,28985=>1000,28986=>1000,28987=>1000,28988=>1000,28989=>1000,28990=>1000,28991=>1000,28992=>1000,28993=>1000,28994=>1000,28995=>1000,28996=>1000, - 28997=>1000,28998=>1000,28999=>1000,29000=>1000,29001=>1000,29002=>1000,29003=>1000,29004=>1000,29005=>1000,29006=>1000,29007=>1000,29008=>1000,29009=>1000,29010=>1000,29011=>1000,29012=>1000, - 29013=>1000,29014=>1000,29015=>1000,29016=>1000,29017=>1000,29018=>1000,29019=>1000,29020=>1000,29021=>1000,29022=>1000,29023=>1000,29024=>1000,29025=>1000,29026=>1000,29027=>1000,29028=>1000, - 29029=>1000,29030=>1000,29031=>1000,29032=>1000,29033=>1000,29034=>1000,29035=>1000,29036=>1000,29037=>1000,29038=>1000,29039=>1000,29040=>1000,29041=>1000,29042=>1000,29043=>1000,29044=>1000, - 29045=>1000,29046=>1000,29047=>1000,29048=>1000,29049=>1000,29050=>1000,29051=>1000,29052=>1000,29053=>1000,29054=>1000,29055=>1000,29056=>1000,29057=>1000,29058=>1000,29059=>1000,29060=>1000, - 29061=>1000,29062=>1000,29063=>1000,29064=>1000,29065=>1000,29066=>1000,29067=>1000,29068=>1000,29069=>1000,29070=>1000,29071=>1000,29072=>1000,29073=>1000,29074=>1000,29075=>1000,29076=>1000, - 29077=>1000,29078=>1000,29079=>1000,29080=>1000,29081=>1000,29082=>1000,29083=>1000,29084=>1000,29085=>1000,29086=>1000,29087=>1000,29088=>1000,29089=>1000,29090=>1000,29091=>1000,29092=>1000, - 29093=>1000,29094=>1000,29095=>1000,29096=>1000,29097=>1000,29098=>1000,29099=>1000,29100=>1000,29101=>1000,29102=>1000,29103=>1000,29104=>1000,29105=>1000,29106=>1000,29107=>1000,29108=>1000, - 29109=>1000,29110=>1000,29111=>1000,29112=>1000,29113=>1000,29114=>1000,29115=>1000,29116=>1000,29117=>1000,29118=>1000,29119=>1000,29120=>1000,29121=>1000,29122=>1000,29123=>1000,29124=>1000, - 29125=>1000,29126=>1000,29127=>1000,29128=>1000,29129=>1000,29130=>1000,29131=>1000,29132=>1000,29133=>1000,29134=>1000,29135=>1000,29136=>1000,29137=>1000,29138=>1000,29139=>1000,29140=>1000, - 29141=>1000,29142=>1000,29143=>1000,29144=>1000,29145=>1000,29146=>1000,29147=>1000,29148=>1000,29149=>1000,29150=>1000,29151=>1000,29152=>1000,29153=>1000,29154=>1000,29155=>1000,29156=>1000, - 29157=>1000,29158=>1000,29159=>1000,29160=>1000,29161=>1000,29162=>1000,29163=>1000,29164=>1000,29165=>1000,29166=>1000,29167=>1000,29168=>1000,29169=>1000,29170=>1000,29171=>1000,29172=>1000, - 29173=>1000,29174=>1000,29175=>1000,29176=>1000,29177=>1000,29178=>1000,29179=>1000,29180=>1000,29181=>1000,29182=>1000,29183=>1000,29184=>1000,29185=>1000,29186=>1000,29187=>1000,29188=>1000, - 29189=>1000,29190=>1000,29191=>1000,29192=>1000,29193=>1000,29194=>1000,29195=>1000,29196=>1000,29197=>1000,29198=>1000,29199=>1000,29200=>1000,29201=>1000,29202=>1000,29203=>1000,29204=>1000, - 29205=>1000,29206=>1000,29207=>1000,29208=>1000,29209=>1000,29210=>1000,29211=>1000,29212=>1000,29213=>1000,29214=>1000,29215=>1000,29216=>1000,29217=>1000,29218=>1000,29219=>1000,29220=>1000, - 29221=>1000,29222=>1000,29223=>1000,29224=>1000,29225=>1000,29226=>1000,29227=>1000,29228=>1000,29229=>1000,29230=>1000,29231=>1000,29232=>1000,29233=>1000,29234=>1000,29235=>1000,29236=>1000, - 29237=>1000,29238=>1000,29239=>1000,29240=>1000,29241=>1000,29242=>1000,29243=>1000,29244=>1000,29245=>1000,29246=>1000,29247=>1000,29248=>1000,29249=>1000,29250=>1000,29251=>1000,29252=>1000, - 29253=>1000,29254=>1000,29255=>1000,29256=>1000,29257=>1000,29258=>1000,29259=>1000,29260=>1000,29261=>1000,29262=>1000,29263=>1000,29264=>1000,29265=>1000,29266=>1000,29267=>1000,29268=>1000, - 29269=>1000,29270=>1000,29271=>1000,29272=>1000,29273=>1000,29274=>1000,29275=>1000,29276=>1000,29277=>1000,29278=>1000,29279=>1000,29280=>1000,29281=>1000,29282=>1000,29283=>1000,29284=>1000, - 29285=>1000,29286=>1000,29287=>1000,29288=>1000,29289=>1000,29290=>1000,29291=>1000,29292=>1000,29293=>1000,29294=>1000,29295=>1000,29296=>1000,29297=>1000,29298=>1000,29299=>1000,29300=>1000, - 29301=>1000,29302=>1000,29303=>1000,29304=>1000,29305=>1000,29306=>1000,29307=>1000,29308=>1000,29309=>1000,29310=>1000,29311=>1000,29312=>1000,29313=>1000,29314=>1000,29315=>1000,29316=>1000, - 29317=>1000,29318=>1000,29319=>1000,29320=>1000,29321=>1000,29322=>1000,29323=>1000,29324=>1000,29325=>1000,29326=>1000,29327=>1000,29328=>1000,29329=>1000,29330=>1000,29331=>1000,29332=>1000, - 29333=>1000,29334=>1000,29335=>1000,29336=>1000,29337=>1000,29338=>1000,29339=>1000,29340=>1000,29341=>1000,29342=>1000,29343=>1000,29344=>1000,29345=>1000,29346=>1000,29347=>1000,29348=>1000, - 29349=>1000,29350=>1000,29351=>1000,29352=>1000,29353=>1000,29354=>1000,29355=>1000,29356=>1000,29357=>1000,29358=>1000,29359=>1000,29360=>1000,29361=>1000,29362=>1000,29363=>1000,29364=>1000, - 29365=>1000,29366=>1000,29367=>1000,29368=>1000,29369=>1000,29370=>1000,29371=>1000,29372=>1000,29373=>1000,29374=>1000,29375=>1000,29376=>1000,29377=>1000,29378=>1000,29379=>1000,29380=>1000, - 29381=>1000,29382=>1000,29383=>1000,29384=>1000,29385=>1000,29386=>1000,29387=>1000,29388=>1000,29389=>1000,29390=>1000,29391=>1000,29392=>1000,29393=>1000,29394=>1000,29395=>1000,29396=>1000, - 29397=>1000,29398=>1000,29399=>1000,29400=>1000,29401=>1000,29402=>1000,29403=>1000,29404=>1000,29405=>1000,29406=>1000,29407=>1000,29408=>1000,29409=>1000,29410=>1000,29411=>1000,29412=>1000, - 29413=>1000,29414=>1000,29415=>1000,29416=>1000,29417=>1000,29418=>1000,29419=>1000,29420=>1000,29421=>1000,29422=>1000,29423=>1000,29424=>1000,29425=>1000,29426=>1000,29427=>1000,29428=>1000, - 29429=>1000,29430=>1000,29431=>1000,29432=>1000,29433=>1000,29434=>1000,29435=>1000,29436=>1000,29437=>1000,29438=>1000,29439=>1000,29440=>1000,29441=>1000,29442=>1000,29443=>1000,29444=>1000, - 29445=>1000,29446=>1000,29447=>1000,29448=>1000,29449=>1000,29450=>1000,29451=>1000,29452=>1000,29453=>1000,29454=>1000,29455=>1000,29456=>1000,29457=>1000,29458=>1000,29459=>1000,29460=>1000, - 29461=>1000,29462=>1000,29463=>1000,29464=>1000,29465=>1000,29466=>1000,29467=>1000,29468=>1000,29469=>1000,29470=>1000,29471=>1000,29472=>1000,29473=>1000,29474=>1000,29475=>1000,29476=>1000, - 29477=>1000,29478=>1000,29479=>1000,29480=>1000,29481=>1000,29482=>1000,29483=>1000,29484=>1000,29485=>1000,29486=>1000,29487=>1000,29488=>1000,29489=>1000,29490=>1000,29491=>1000,29492=>1000, - 29493=>1000,29494=>1000,29495=>1000,29496=>1000,29497=>1000,29498=>1000,29499=>1000,29500=>1000,29501=>1000,29502=>1000,29503=>1000,29504=>1000,29505=>1000,29506=>1000,29507=>1000,29508=>1000, - 29509=>1000,29510=>1000,29511=>1000,29512=>1000,29513=>1000,29514=>1000,29515=>1000,29516=>1000,29517=>1000,29518=>1000,29519=>1000,29520=>1000,29521=>1000,29522=>1000,29523=>1000,29524=>1000, - 29525=>1000,29526=>1000,29527=>1000,29528=>1000,29529=>1000,29530=>1000,29531=>1000,29532=>1000,29533=>1000,29534=>1000,29535=>1000,29536=>1000,29537=>1000,29538=>1000,29539=>1000,29540=>1000, - 29541=>1000,29542=>1000,29543=>1000,29544=>1000,29545=>1000,29546=>1000,29547=>1000,29548=>1000,29549=>1000,29550=>1000,29551=>1000,29552=>1000,29553=>1000,29554=>1000,29555=>1000,29556=>1000, - 29557=>1000,29558=>1000,29559=>1000,29560=>1000,29561=>1000,29562=>1000,29563=>1000,29564=>1000,29565=>1000,29566=>1000,29567=>1000,29568=>1000,29569=>1000,29570=>1000,29571=>1000,29572=>1000, - 29573=>1000,29574=>1000,29575=>1000,29576=>1000,29577=>1000,29578=>1000,29579=>1000,29580=>1000,29581=>1000,29582=>1000,29583=>1000,29584=>1000,29585=>1000,29586=>1000,29587=>1000,29588=>1000, - 29589=>1000,29590=>1000,29591=>1000,29592=>1000,29593=>1000,29594=>1000,29595=>1000,29596=>1000,29597=>1000,29598=>1000,29599=>1000,29600=>1000,29601=>1000,29602=>1000,29603=>1000,29604=>1000, - 29605=>1000,29606=>1000,29607=>1000,29608=>1000,29609=>1000,29610=>1000,29611=>1000,29612=>1000,29613=>1000,29614=>1000,29615=>1000,29616=>1000,29617=>1000,29618=>1000,29619=>1000,29620=>1000, - 29621=>1000,29622=>1000,29623=>1000,29624=>1000,29625=>1000,29626=>1000,29627=>1000,29628=>1000,29629=>1000,29630=>1000,29631=>1000,29632=>1000,29633=>1000,29634=>1000,29635=>1000,29636=>1000, - 29637=>1000,29638=>1000,29639=>1000,29640=>1000,29641=>1000,29642=>1000,29643=>1000,29644=>1000,29645=>1000,29646=>1000,29647=>1000,29648=>1000,29649=>1000,29650=>1000,29651=>1000,29652=>1000, - 29653=>1000,29654=>1000,29655=>1000,29656=>1000,29657=>1000,29658=>1000,29659=>1000,29660=>1000,29661=>1000,29662=>1000,29663=>1000,29664=>1000,29665=>1000,29666=>1000,29667=>1000,29668=>1000, - 29669=>1000,29670=>1000,29671=>1000,29672=>1000,29673=>1000,29674=>1000,29675=>1000,29676=>1000,29677=>1000,29678=>1000,29679=>1000,29680=>1000,29681=>1000,29682=>1000,29683=>1000,29684=>1000, - 29685=>1000,29686=>1000,29687=>1000,29688=>1000,29689=>1000,29690=>1000,29691=>1000,29692=>1000,29693=>1000,29694=>1000,29695=>1000,29696=>1000,29697=>1000,29698=>1000,29699=>1000,29700=>1000, - 29701=>1000,29702=>1000,29703=>1000,29704=>1000,29705=>1000,29706=>1000,29707=>1000,29708=>1000,29709=>1000,29710=>1000,29711=>1000,29712=>1000,29713=>1000,29714=>1000,29715=>1000,29716=>1000, - 29717=>1000,29718=>1000,29719=>1000,29720=>1000,29721=>1000,29722=>1000,29723=>1000,29724=>1000,29725=>1000,29726=>1000,29727=>1000,29728=>1000,29729=>1000,29730=>1000,29731=>1000,29732=>1000, - 29733=>1000,29734=>1000,29735=>1000,29736=>1000,29737=>1000,29738=>1000,29739=>1000,29740=>1000,29741=>1000,29742=>1000,29743=>1000,29744=>1000,29745=>1000,29746=>1000,29747=>1000,29748=>1000, - 29749=>1000,29750=>1000,29751=>1000,29752=>1000,29753=>1000,29754=>1000,29755=>1000,29756=>1000,29757=>1000,29758=>1000,29759=>1000,29760=>1000,29761=>1000,29762=>1000,29763=>1000,29764=>1000, - 29765=>1000,29766=>1000,29767=>1000,29768=>1000,29769=>1000,29770=>1000,29771=>1000,29772=>1000,29773=>1000,29774=>1000,29775=>1000,29776=>1000,29777=>1000,29778=>1000,29779=>1000,29780=>1000, - 29781=>1000,29782=>1000,29783=>1000,29784=>1000,29785=>1000,29786=>1000,29787=>1000,29788=>1000,29789=>1000,29790=>1000,29791=>1000,29792=>1000,29793=>1000,29794=>1000,29795=>1000,29796=>1000, - 29797=>1000,29798=>1000,29799=>1000,29800=>1000,29801=>1000,29802=>1000,29803=>1000,29804=>1000,29805=>1000,29806=>1000,29807=>1000,29808=>1000,29809=>1000,29810=>1000,29811=>1000,29812=>1000, - 29813=>1000,29814=>1000,29815=>1000,29816=>1000,29817=>1000,29818=>1000,29819=>1000,29820=>1000,29821=>1000,29822=>1000,29823=>1000,29824=>1000,29825=>1000,29826=>1000,29827=>1000,29828=>1000, - 29829=>1000,29830=>1000,29831=>1000,29832=>1000,29833=>1000,29834=>1000,29835=>1000,29836=>1000,29837=>1000,29838=>1000,29839=>1000,29840=>1000,29841=>1000,29842=>1000,29843=>1000,29844=>1000, - 29845=>1000,29846=>1000,29847=>1000,29848=>1000,29849=>1000,29850=>1000,29851=>1000,29852=>1000,29853=>1000,29854=>1000,29855=>1000,29856=>1000,29857=>1000,29858=>1000,29859=>1000,29860=>1000, - 29861=>1000,29862=>1000,29863=>1000,29864=>1000,29865=>1000,29866=>1000,29867=>1000,29868=>1000,29869=>1000,29870=>1000,29871=>1000,29872=>1000,29873=>1000,29874=>1000,29875=>1000,29876=>1000, - 29877=>1000,29878=>1000,29879=>1000,29880=>1000,29881=>1000,29882=>1000,29883=>1000,29884=>1000,29885=>1000,29886=>1000,29887=>1000,29888=>1000,29889=>1000,29890=>1000,29891=>1000,29892=>1000, - 29893=>1000,29894=>1000,29895=>1000,29896=>1000,29897=>1000,29898=>1000,29899=>1000,29900=>1000,29901=>1000,29902=>1000,29903=>1000,29904=>1000,29905=>1000,29906=>1000,29907=>1000,29908=>1000, - 29909=>1000,29910=>1000,29911=>1000,29912=>1000,29913=>1000,29914=>1000,29915=>1000,29916=>1000,29917=>1000,29918=>1000,29919=>1000,29920=>1000,29921=>1000,29922=>1000,29923=>1000,29924=>1000, - 29925=>1000,29926=>1000,29927=>1000,29928=>1000,29929=>1000,29930=>1000,29931=>1000,29932=>1000,29933=>1000,29934=>1000,29935=>1000,29936=>1000,29937=>1000,29938=>1000,29939=>1000,29940=>1000, - 29941=>1000,29942=>1000,29943=>1000,29944=>1000,29945=>1000,29946=>1000,29947=>1000,29948=>1000,29949=>1000,29950=>1000,29951=>1000,29952=>1000,29953=>1000,29954=>1000,29955=>1000,29956=>1000, - 29957=>1000,29958=>1000,29959=>1000,29960=>1000,29961=>1000,29962=>1000,29963=>1000,29964=>1000,29965=>1000,29966=>1000,29967=>1000,29968=>1000,29969=>1000,29970=>1000,29971=>1000,29972=>1000, - 29973=>1000,29974=>1000,29975=>1000,29976=>1000,29977=>1000,29978=>1000,29979=>1000,29980=>1000,29981=>1000,29982=>1000,29983=>1000,29984=>1000,29985=>1000,29986=>1000,29987=>1000,29988=>1000, - 29989=>1000,29990=>1000,29991=>1000,29992=>1000,29993=>1000,29994=>1000,29995=>1000,29996=>1000,29997=>1000,29998=>1000,29999=>1000,30000=>1000,30001=>1000,30002=>1000,30003=>1000,30004=>1000, - 30005=>1000,30006=>1000,30007=>1000,30008=>1000,30009=>1000,30010=>1000,30011=>1000,30012=>1000,30013=>1000,30014=>1000,30015=>1000,30016=>1000,30017=>1000,30018=>1000,30019=>1000,30020=>1000, - 30021=>1000,30022=>1000,30023=>1000,30024=>1000,30025=>1000,30026=>1000,30027=>1000,30028=>1000,30029=>1000,30030=>1000,30031=>1000,30032=>1000,30033=>1000,30034=>1000,30035=>1000,30036=>1000, - 30037=>1000,30038=>1000,30039=>1000,30040=>1000,30041=>1000,30042=>1000,30043=>1000,30044=>1000,30045=>1000,30046=>1000,30047=>1000,30048=>1000,30049=>1000,30050=>1000,30051=>1000,30052=>1000, - 30053=>1000,30054=>1000,30055=>1000,30056=>1000,30057=>1000,30058=>1000,30059=>1000,30060=>1000,30061=>1000,30062=>1000,30063=>1000,30064=>1000,30065=>1000,30066=>1000,30067=>1000,30068=>1000, - 30069=>1000,30070=>1000,30071=>1000,30072=>1000,30073=>1000,30074=>1000,30075=>1000,30076=>1000,30077=>1000,30078=>1000,30079=>1000,30080=>1000,30081=>1000,30082=>1000,30083=>1000,30084=>1000, - 30085=>1000,30086=>1000,30087=>1000,30088=>1000,30089=>1000,30090=>1000,30091=>1000,30092=>1000,30093=>1000,30094=>1000,30095=>1000,30096=>1000,30097=>1000,30098=>1000,30099=>1000,30100=>1000, - 30101=>1000,30102=>1000,30103=>1000,30104=>1000,30105=>1000,30106=>1000,30107=>1000,30108=>1000,30109=>1000,30110=>1000,30111=>1000,30112=>1000,30113=>1000,30114=>1000,30115=>1000,30116=>1000, - 30117=>1000,30118=>1000,30119=>1000,30120=>1000,30121=>1000,30122=>1000,30123=>1000,30124=>1000,30125=>1000,30126=>1000,30127=>1000,30128=>1000,30129=>1000,30130=>1000,30131=>1000,30132=>1000, - 30133=>1000,30134=>1000,30135=>1000,30136=>1000,30137=>1000,30138=>1000,30139=>1000,30140=>1000,30141=>1000,30142=>1000,30143=>1000,30144=>1000,30145=>1000,30146=>1000,30147=>1000,30148=>1000, - 30149=>1000,30150=>1000,30151=>1000,30152=>1000,30153=>1000,30154=>1000,30155=>1000,30156=>1000,30157=>1000,30158=>1000,30159=>1000,30160=>1000,30161=>1000,30162=>1000,30163=>1000,30164=>1000, - 30165=>1000,30166=>1000,30167=>1000,30168=>1000,30169=>1000,30170=>1000,30171=>1000,30172=>1000,30173=>1000,30174=>1000,30175=>1000,30176=>1000,30177=>1000,30178=>1000,30179=>1000,30180=>1000, - 30181=>1000,30182=>1000,30183=>1000,30184=>1000,30185=>1000,30186=>1000,30187=>1000,30188=>1000,30189=>1000,30190=>1000,30191=>1000,30192=>1000,30193=>1000,30194=>1000,30195=>1000,30196=>1000, - 30197=>1000,30198=>1000,30199=>1000,30200=>1000,30201=>1000,30202=>1000,30203=>1000,30204=>1000,30205=>1000,30206=>1000,30207=>1000,30208=>1000,30209=>1000,30210=>1000,30211=>1000,30212=>1000, - 30213=>1000,30214=>1000,30215=>1000,30216=>1000,30217=>1000,30218=>1000,30219=>1000,30220=>1000,30221=>1000,30222=>1000,30223=>1000,30224=>1000,30225=>1000,30226=>1000,30227=>1000,30228=>1000, - 30229=>1000,30230=>1000,30231=>1000,30232=>1000,30233=>1000,30234=>1000,30235=>1000,30236=>1000,30237=>1000,30238=>1000,30239=>1000,30240=>1000,30241=>1000,30242=>1000,30243=>1000,30244=>1000, - 30245=>1000,30246=>1000,30247=>1000,30248=>1000,30249=>1000,30250=>1000,30251=>1000,30252=>1000,30253=>1000,30254=>1000,30255=>1000,30256=>1000,30257=>1000,30258=>1000,30259=>1000,30260=>1000, - 30261=>1000,30262=>1000,30263=>1000,30264=>1000,30265=>1000,30266=>1000,30267=>1000,30268=>1000,30269=>1000,30270=>1000,30271=>1000,30272=>1000,30273=>1000,30274=>1000,30275=>1000,30276=>1000, - 30277=>1000,30278=>1000,30279=>1000,30280=>1000,30281=>1000,30282=>1000,30283=>1000,30284=>1000,30285=>1000,30286=>1000,30287=>1000,30288=>1000,30289=>1000,30290=>1000,30291=>1000,30292=>1000, - 30293=>1000,30294=>1000,30295=>1000,30296=>1000,30297=>1000,30298=>1000,30299=>1000,30300=>1000,30301=>1000,30302=>1000,30303=>1000,30304=>1000,30305=>1000,30306=>1000,30307=>1000,30308=>1000, - 30309=>1000,30310=>1000,30311=>1000,30312=>1000,30313=>1000,30314=>1000,30315=>1000,30316=>1000,30317=>1000,30318=>1000,30319=>1000,30320=>1000,30321=>1000,30322=>1000,30323=>1000,30324=>1000, - 30325=>1000,30326=>1000,30327=>1000,30328=>1000,30329=>1000,30330=>1000,30331=>1000,30332=>1000,30333=>1000,30334=>1000,30335=>1000,30336=>1000,30337=>1000,30338=>1000,30339=>1000,30340=>1000, - 30341=>1000,30342=>1000,30343=>1000,30344=>1000,30345=>1000,30346=>1000,30347=>1000,30348=>1000,30349=>1000,30350=>1000,30351=>1000,30352=>1000,30353=>1000,30354=>1000,30355=>1000,30356=>1000, - 30357=>1000,30358=>1000,30359=>1000,30360=>1000,30361=>1000,30362=>1000,30363=>1000,30364=>1000,30365=>1000,30366=>1000,30367=>1000,30368=>1000,30369=>1000,30370=>1000,30371=>1000,30372=>1000, - 30373=>1000,30374=>1000,30375=>1000,30376=>1000,30377=>1000,30378=>1000,30379=>1000,30380=>1000,30381=>1000,30382=>1000,30383=>1000,30384=>1000,30385=>1000,30386=>1000,30387=>1000,30388=>1000, - 30389=>1000,30390=>1000,30391=>1000,30392=>1000,30393=>1000,30394=>1000,30395=>1000,30396=>1000,30397=>1000,30398=>1000,30399=>1000,30400=>1000,30401=>1000,30402=>1000,30403=>1000,30404=>1000, - 30405=>1000,30406=>1000,30407=>1000,30408=>1000,30409=>1000,30410=>1000,30411=>1000,30412=>1000,30413=>1000,30414=>1000,30415=>1000,30416=>1000,30417=>1000,30418=>1000,30419=>1000,30420=>1000, - 30421=>1000,30422=>1000,30423=>1000,30424=>1000,30425=>1000,30426=>1000,30427=>1000,30428=>1000,30429=>1000,30430=>1000,30431=>1000,30432=>1000,30433=>1000,30434=>1000,30435=>1000,30436=>1000, - 30437=>1000,30438=>1000,30439=>1000,30440=>1000,30441=>1000,30442=>1000,30443=>1000,30444=>1000,30445=>1000,30446=>1000,30447=>1000,30448=>1000,30449=>1000,30450=>1000,30451=>1000,30452=>1000, - 30453=>1000,30454=>1000,30455=>1000,30456=>1000,30457=>1000,30458=>1000,30459=>1000,30460=>1000,30461=>1000,30462=>1000,30463=>1000,30464=>1000,30465=>1000,30466=>1000,30467=>1000,30468=>1000, - 30469=>1000,30470=>1000,30471=>1000,30472=>1000,30473=>1000,30474=>1000,30475=>1000,30476=>1000,30477=>1000,30478=>1000,30479=>1000,30480=>1000,30481=>1000,30482=>1000,30483=>1000,30484=>1000, - 30485=>1000,30486=>1000,30487=>1000,30488=>1000,30489=>1000,30490=>1000,30491=>1000,30492=>1000,30493=>1000,30494=>1000,30495=>1000,30496=>1000,30497=>1000,30498=>1000,30499=>1000,30500=>1000, - 30501=>1000,30502=>1000,30503=>1000,30504=>1000,30505=>1000,30506=>1000,30507=>1000,30508=>1000,30509=>1000,30510=>1000,30511=>1000,30512=>1000,30513=>1000,30514=>1000,30515=>1000,30516=>1000, - 30517=>1000,30518=>1000,30519=>1000,30520=>1000,30521=>1000,30522=>1000,30523=>1000,30524=>1000,30525=>1000,30526=>1000,30527=>1000,30528=>1000,30529=>1000,30530=>1000,30531=>1000,30532=>1000, - 30533=>1000,30534=>1000,30535=>1000,30536=>1000,30537=>1000,30538=>1000,30539=>1000,30540=>1000,30541=>1000,30542=>1000,30543=>1000,30544=>1000,30545=>1000,30546=>1000,30547=>1000,30548=>1000, - 30549=>1000,30550=>1000,30551=>1000,30552=>1000,30553=>1000,30554=>1000,30555=>1000,30556=>1000,30557=>1000,30558=>1000,30559=>1000,30560=>1000,30561=>1000,30562=>1000,30563=>1000,30564=>1000, - 30565=>1000,30566=>1000,30567=>1000,30568=>1000,30569=>1000,30570=>1000,30571=>1000,30572=>1000,30573=>1000,30574=>1000,30575=>1000,30576=>1000,30577=>1000,30578=>1000,30579=>1000,30580=>1000, - 30581=>1000,30582=>1000,30583=>1000,30584=>1000,30585=>1000,30586=>1000,30587=>1000,30588=>1000,30589=>1000,30590=>1000,30591=>1000,30592=>1000,30593=>1000,30594=>1000,30595=>1000,30596=>1000, - 30597=>1000,30598=>1000,30599=>1000,30600=>1000,30601=>1000,30602=>1000,30603=>1000,30604=>1000,30605=>1000,30606=>1000,30607=>1000,30608=>1000,30609=>1000,30610=>1000,30611=>1000,30612=>1000, - 30613=>1000,30614=>1000,30615=>1000,30616=>1000,30617=>1000,30618=>1000,30619=>1000,30620=>1000,30621=>1000,30622=>1000,30623=>1000,30624=>1000,30625=>1000,30626=>1000,30627=>1000,30628=>1000, - 30629=>1000,30630=>1000,30631=>1000,30632=>1000,30633=>1000,30634=>1000,30635=>1000,30636=>1000,30637=>1000,30638=>1000,30639=>1000,30640=>1000,30641=>1000,30642=>1000,30643=>1000,30644=>1000, - 30645=>1000,30646=>1000,30647=>1000,30648=>1000,30649=>1000,30650=>1000,30651=>1000,30652=>1000,30653=>1000,30654=>1000,30655=>1000,30656=>1000,30657=>1000,30658=>1000,30659=>1000,30660=>1000, - 30661=>1000,30662=>1000,30663=>1000,30664=>1000,30665=>1000,30666=>1000,30667=>1000,30668=>1000,30669=>1000,30670=>1000,30671=>1000,30672=>1000,30673=>1000,30674=>1000,30675=>1000,30676=>1000, - 30677=>1000,30678=>1000,30679=>1000,30680=>1000,30681=>1000,30682=>1000,30683=>1000,30684=>1000,30685=>1000,30686=>1000,30687=>1000,30688=>1000,30689=>1000,30690=>1000,30691=>1000,30692=>1000, - 30693=>1000,30694=>1000,30695=>1000,30696=>1000,30697=>1000,30698=>1000,30699=>1000,30700=>1000,30701=>1000,30702=>1000,30703=>1000,30704=>1000,30705=>1000,30706=>1000,30707=>1000,30708=>1000, - 30709=>1000,30710=>1000,30711=>1000,30712=>1000,30713=>1000,30714=>1000,30715=>1000,30716=>1000,30717=>1000,30718=>1000,30719=>1000,30720=>1000,30721=>1000,30722=>1000,30723=>1000,30724=>1000, - 30725=>1000,30726=>1000,30727=>1000,30728=>1000,30729=>1000,30730=>1000,30731=>1000,30732=>1000,30733=>1000,30734=>1000,30735=>1000,30736=>1000,30737=>1000,30738=>1000,30739=>1000,30740=>1000, - 30741=>1000,30742=>1000,30743=>1000,30744=>1000,30745=>1000,30746=>1000,30747=>1000,30748=>1000,30749=>1000,30750=>1000,30751=>1000,30752=>1000,30753=>1000,30754=>1000,30755=>1000,30756=>1000, - 30757=>1000,30758=>1000,30759=>1000,30760=>1000,30761=>1000,30762=>1000,30763=>1000,30764=>1000,30765=>1000,30766=>1000,30767=>1000,30768=>1000,30769=>1000,30770=>1000,30771=>1000,30772=>1000, - 30773=>1000,30774=>1000,30775=>1000,30776=>1000,30777=>1000,30778=>1000,30779=>1000,30780=>1000,30781=>1000,30782=>1000,30783=>1000,30784=>1000,30785=>1000,30786=>1000,30787=>1000,30788=>1000, - 30789=>1000,30790=>1000,30791=>1000,30792=>1000,30793=>1000,30794=>1000,30795=>1000,30796=>1000,30797=>1000,30798=>1000,30799=>1000,30800=>1000,30801=>1000,30802=>1000,30803=>1000,30804=>1000, - 30805=>1000,30806=>1000,30807=>1000,30808=>1000,30809=>1000,30810=>1000,30811=>1000,30812=>1000,30813=>1000,30814=>1000,30815=>1000,30816=>1000,30817=>1000,30818=>1000,30819=>1000,30820=>1000, - 30821=>1000,30822=>1000,30823=>1000,30824=>1000,30825=>1000,30826=>1000,30827=>1000,30828=>1000,30829=>1000,30830=>1000,30831=>1000,30832=>1000,30833=>1000,30834=>1000,30835=>1000,30836=>1000, - 30837=>1000,30838=>1000,30839=>1000,30840=>1000,30841=>1000,30842=>1000,30843=>1000,30844=>1000,30845=>1000,30846=>1000,30847=>1000,30848=>1000,30849=>1000,30850=>1000,30851=>1000,30852=>1000, - 30853=>1000,30854=>1000,30855=>1000,30856=>1000,30857=>1000,30858=>1000,30859=>1000,30860=>1000,30861=>1000,30862=>1000,30863=>1000,30864=>1000,30865=>1000,30866=>1000,30867=>1000,30868=>1000, - 30869=>1000,30870=>1000,30871=>1000,30872=>1000,30873=>1000,30874=>1000,30875=>1000,30876=>1000,30877=>1000,30878=>1000,30879=>1000,30880=>1000,30881=>1000,30882=>1000,30883=>1000,30884=>1000, - 30885=>1000,30886=>1000,30887=>1000,30888=>1000,30889=>1000,30890=>1000,30891=>1000,30892=>1000,30893=>1000,30894=>1000,30895=>1000,30896=>1000,30897=>1000,30898=>1000,30899=>1000,30900=>1000, - 30901=>1000,30902=>1000,30903=>1000,30904=>1000,30905=>1000,30906=>1000,30907=>1000,30908=>1000,30909=>1000,30910=>1000,30911=>1000,30912=>1000,30913=>1000,30914=>1000,30915=>1000,30916=>1000, - 30917=>1000,30918=>1000,30919=>1000,30920=>1000,30921=>1000,30922=>1000,30923=>1000,30924=>1000,30925=>1000,30926=>1000,30927=>1000,30928=>1000,30929=>1000,30930=>1000,30931=>1000,30932=>1000, - 30933=>1000,30934=>1000,30935=>1000,30936=>1000,30937=>1000,30938=>1000,30939=>1000,30940=>1000,30941=>1000,30942=>1000,30943=>1000,30944=>1000,30945=>1000,30946=>1000,30947=>1000,30948=>1000, - 30949=>1000,30950=>1000,30951=>1000,30952=>1000,30953=>1000,30954=>1000,30955=>1000,30956=>1000,30957=>1000,30958=>1000,30959=>1000,30960=>1000,30961=>1000,30962=>1000,30963=>1000,30964=>1000, - 30965=>1000,30966=>1000,30967=>1000,30968=>1000,30969=>1000,30970=>1000,30971=>1000,30972=>1000,30973=>1000,30974=>1000,30975=>1000,30976=>1000,30977=>1000,30978=>1000,30979=>1000,30980=>1000, - 30981=>1000,30982=>1000,30983=>1000,30984=>1000,30985=>1000,30986=>1000,30987=>1000,30988=>1000,30989=>1000,30990=>1000,30991=>1000,30992=>1000,30993=>1000,30994=>1000,30995=>1000,30996=>1000, - 30997=>1000,30998=>1000,30999=>1000,31000=>1000,31001=>1000,31002=>1000,31003=>1000,31004=>1000,31005=>1000,31006=>1000,31007=>1000,31008=>1000,31009=>1000,31010=>1000,31011=>1000,31012=>1000, - 31013=>1000,31014=>1000,31015=>1000,31016=>1000,31017=>1000,31018=>1000,31019=>1000,31020=>1000,31021=>1000,31022=>1000,31023=>1000,31024=>1000,31025=>1000,31026=>1000,31027=>1000,31028=>1000, - 31029=>1000,31030=>1000,31031=>1000,31032=>1000,31033=>1000,31034=>1000,31035=>1000,31036=>1000,31037=>1000,31038=>1000,31039=>1000,31040=>1000,31041=>1000,31042=>1000,31043=>1000,31044=>1000, - 31045=>1000,31046=>1000,31047=>1000,31048=>1000,31049=>1000,31050=>1000,31051=>1000,31052=>1000,31053=>1000,31054=>1000,31055=>1000,31056=>1000,31057=>1000,31058=>1000,31059=>1000,31060=>1000, - 31061=>1000,31062=>1000,31063=>1000,31064=>1000,31065=>1000,31066=>1000,31067=>1000,31068=>1000,31069=>1000,31070=>1000,31071=>1000,31072=>1000,31073=>1000,31074=>1000,31075=>1000,31076=>1000, - 31077=>1000,31078=>1000,31079=>1000,31080=>1000,31081=>1000,31082=>1000,31083=>1000,31084=>1000,31085=>1000,31086=>1000,31087=>1000,31088=>1000,31089=>1000,31090=>1000,31091=>1000,31092=>1000, - 31093=>1000,31094=>1000,31095=>1000,31096=>1000,31097=>1000,31098=>1000,31099=>1000,31100=>1000,31101=>1000,31102=>1000,31103=>1000,31104=>1000,31105=>1000,31106=>1000,31107=>1000,31108=>1000, - 31109=>1000,31110=>1000,31111=>1000,31112=>1000,31113=>1000,31114=>1000,31115=>1000,31116=>1000,31117=>1000,31118=>1000,31119=>1000,31120=>1000,31121=>1000,31122=>1000,31123=>1000,31124=>1000, - 31125=>1000,31126=>1000,31127=>1000,31128=>1000,31129=>1000,31130=>1000,31131=>1000,31132=>1000,31133=>1000,31134=>1000,31135=>1000,31136=>1000,31137=>1000,31138=>1000,31139=>1000,31140=>1000, - 31141=>1000,31142=>1000,31143=>1000,31144=>1000,31145=>1000,31146=>1000,31147=>1000,31148=>1000,31149=>1000,31150=>1000,31151=>1000,31152=>1000,31153=>1000,31154=>1000,31155=>1000,31156=>1000, - 31157=>1000,31158=>1000,31159=>1000,31160=>1000,31161=>1000,31162=>1000,31163=>1000,31164=>1000,31165=>1000,31166=>1000,31167=>1000,31168=>1000,31169=>1000,31170=>1000,31171=>1000,31172=>1000, - 31173=>1000,31174=>1000,31175=>1000,31176=>1000,31177=>1000,31178=>1000,31179=>1000,31180=>1000,31181=>1000,31182=>1000,31183=>1000,31184=>1000,31185=>1000,31186=>1000,31187=>1000,31188=>1000, - 31189=>1000,31190=>1000,31191=>1000,31192=>1000,31193=>1000,31194=>1000,31195=>1000,31196=>1000,31197=>1000,31198=>1000,31199=>1000,31200=>1000,31201=>1000,31202=>1000,31203=>1000,31204=>1000, - 31205=>1000,31206=>1000,31207=>1000,31208=>1000,31209=>1000,31210=>1000,31211=>1000,31212=>1000,31213=>1000,31214=>1000,31215=>1000,31216=>1000,31217=>1000,31218=>1000,31219=>1000,31220=>1000, - 31221=>1000,31222=>1000,31223=>1000,31224=>1000,31225=>1000,31226=>1000,31227=>1000,31228=>1000,31229=>1000,31230=>1000,31231=>1000,31232=>1000,31233=>1000,31234=>1000,31235=>1000,31236=>1000, - 31237=>1000,31238=>1000,31239=>1000,31240=>1000,31241=>1000,31242=>1000,31243=>1000,31244=>1000,31245=>1000,31246=>1000,31247=>1000,31248=>1000,31249=>1000,31250=>1000,31251=>1000,31252=>1000, - 31253=>1000,31254=>1000,31255=>1000,31256=>1000,31257=>1000,31258=>1000,31259=>1000,31260=>1000,31261=>1000,31262=>1000,31263=>1000,31264=>1000,31265=>1000,31266=>1000,31267=>1000,31268=>1000, - 31269=>1000,31270=>1000,31271=>1000,31272=>1000,31273=>1000,31274=>1000,31275=>1000,31276=>1000,31277=>1000,31278=>1000,31279=>1000,31280=>1000,31281=>1000,31282=>1000,31283=>1000,31284=>1000, - 31285=>1000,31286=>1000,31287=>1000,31288=>1000,31289=>1000,31290=>1000,31291=>1000,31292=>1000,31293=>1000,31294=>1000,31295=>1000,31296=>1000,31297=>1000,31298=>1000,31299=>1000,31300=>1000, - 31301=>1000,31302=>1000,31303=>1000,31304=>1000,31305=>1000,31306=>1000,31307=>1000,31308=>1000,31309=>1000,31310=>1000,31311=>1000,31312=>1000,31313=>1000,31314=>1000,31315=>1000,31316=>1000, - 31317=>1000,31318=>1000,31319=>1000,31320=>1000,31321=>1000,31322=>1000,31323=>1000,31324=>1000,31325=>1000,31326=>1000,31327=>1000,31328=>1000,31329=>1000,31330=>1000,31331=>1000,31332=>1000, - 31333=>1000,31334=>1000,31335=>1000,31336=>1000,31337=>1000,31338=>1000,31339=>1000,31340=>1000,31341=>1000,31342=>1000,31343=>1000,31344=>1000,31345=>1000,31346=>1000,31347=>1000,31348=>1000, - 31349=>1000,31350=>1000,31351=>1000,31352=>1000,31353=>1000,31354=>1000,31355=>1000,31356=>1000,31357=>1000,31358=>1000,31359=>1000,31360=>1000,31361=>1000,31362=>1000,31363=>1000,31364=>1000, - 31365=>1000,31366=>1000,31367=>1000,31368=>1000,31369=>1000,31370=>1000,31371=>1000,31372=>1000,31373=>1000,31374=>1000,31375=>1000,31376=>1000,31377=>1000,31378=>1000,31379=>1000,31380=>1000, - 31381=>1000,31382=>1000,31383=>1000,31384=>1000,31385=>1000,31386=>1000,31387=>1000,31388=>1000,31389=>1000,31390=>1000,31391=>1000,31392=>1000,31393=>1000,31394=>1000,31395=>1000,31396=>1000, - 31397=>1000,31398=>1000,31399=>1000,31400=>1000,31401=>1000,31402=>1000,31403=>1000,31404=>1000,31405=>1000,31406=>1000,31407=>1000,31408=>1000,31409=>1000,31410=>1000,31411=>1000,31412=>1000, - 31413=>1000,31414=>1000,31415=>1000,31416=>1000,31417=>1000,31418=>1000,31419=>1000,31420=>1000,31421=>1000,31422=>1000,31423=>1000,31424=>1000,31425=>1000,31426=>1000,31427=>1000,31428=>1000, - 31429=>1000,31430=>1000,31431=>1000,31432=>1000,31433=>1000,31434=>1000,31435=>1000,31436=>1000,31437=>1000,31438=>1000,31439=>1000,31440=>1000,31441=>1000,31442=>1000,31443=>1000,31444=>1000, - 31445=>1000,31446=>1000,31447=>1000,31448=>1000,31449=>1000,31450=>1000,31451=>1000,31452=>1000,31453=>1000,31454=>1000,31455=>1000,31456=>1000,31457=>1000,31458=>1000,31459=>1000,31460=>1000, - 31461=>1000,31462=>1000,31463=>1000,31464=>1000,31465=>1000,31466=>1000,31467=>1000,31468=>1000,31469=>1000,31470=>1000,31471=>1000,31472=>1000,31473=>1000,31474=>1000,31475=>1000,31476=>1000, - 31477=>1000,31478=>1000,31479=>1000,31480=>1000,31481=>1000,31482=>1000,31483=>1000,31484=>1000,31485=>1000,31486=>1000,31487=>1000,31488=>1000,31489=>1000,31490=>1000,31491=>1000,31492=>1000, - 31493=>1000,31494=>1000,31495=>1000,31496=>1000,31497=>1000,31498=>1000,31499=>1000,31500=>1000,31501=>1000,31502=>1000,31503=>1000,31504=>1000,31505=>1000,31506=>1000,31507=>1000,31508=>1000, - 31509=>1000,31510=>1000,31511=>1000,31512=>1000,31513=>1000,31514=>1000,31515=>1000,31516=>1000,31517=>1000,31518=>1000,31519=>1000,31520=>1000,31521=>1000,31522=>1000,31523=>1000,31524=>1000, - 31525=>1000,31526=>1000,31527=>1000,31528=>1000,31529=>1000,31530=>1000,31531=>1000,31532=>1000,31533=>1000,31534=>1000,31535=>1000,31536=>1000,31537=>1000,31538=>1000,31539=>1000,31540=>1000, - 31541=>1000,31542=>1000,31543=>1000,31544=>1000,31545=>1000,31546=>1000,31547=>1000,31548=>1000,31549=>1000,31550=>1000,31551=>1000,31552=>1000,31553=>1000,31554=>1000,31555=>1000,31556=>1000, - 31557=>1000,31558=>1000,31559=>1000,31560=>1000,31561=>1000,31562=>1000,31563=>1000,31564=>1000,31565=>1000,31566=>1000,31567=>1000,31568=>1000,31569=>1000,31570=>1000,31571=>1000,31572=>1000, - 31573=>1000,31574=>1000,31575=>1000,31576=>1000,31577=>1000,31578=>1000,31579=>1000,31580=>1000,31581=>1000,31582=>1000,31583=>1000,31584=>1000,31585=>1000,31586=>1000,31587=>1000,31588=>1000, - 31589=>1000,31590=>1000,31591=>1000,31592=>1000,31593=>1000,31594=>1000,31595=>1000,31596=>1000,31597=>1000,31598=>1000,31599=>1000,31600=>1000,31601=>1000,31602=>1000,31603=>1000,31604=>1000, - 31605=>1000,31606=>1000,31607=>1000,31608=>1000,31609=>1000,31610=>1000,31611=>1000,31612=>1000,31613=>1000,31614=>1000,31615=>1000,31616=>1000,31617=>1000,31618=>1000,31619=>1000,31620=>1000, - 31621=>1000,31622=>1000,31623=>1000,31624=>1000,31625=>1000,31626=>1000,31627=>1000,31628=>1000,31629=>1000,31630=>1000,31631=>1000,31632=>1000,31633=>1000,31634=>1000,31635=>1000,31636=>1000, - 31637=>1000,31638=>1000,31639=>1000,31640=>1000,31641=>1000,31642=>1000,31643=>1000,31644=>1000,31645=>1000,31646=>1000,31647=>1000,31648=>1000,31649=>1000,31650=>1000,31651=>1000,31652=>1000, - 31653=>1000,31654=>1000,31655=>1000,31656=>1000,31657=>1000,31658=>1000,31659=>1000,31660=>1000,31661=>1000,31662=>1000,31663=>1000,31664=>1000,31665=>1000,31666=>1000,31667=>1000,31668=>1000, - 31669=>1000,31670=>1000,31671=>1000,31672=>1000,31673=>1000,31674=>1000,31675=>1000,31676=>1000,31677=>1000,31678=>1000,31679=>1000,31680=>1000,31681=>1000,31682=>1000,31683=>1000,31684=>1000, - 31685=>1000,31686=>1000,31687=>1000,31688=>1000,31689=>1000,31690=>1000,31691=>1000,31692=>1000,31693=>1000,31694=>1000,31695=>1000,31696=>1000,31697=>1000,31698=>1000,31699=>1000,31700=>1000, - 31701=>1000,31702=>1000,31703=>1000,31704=>1000,31705=>1000,31706=>1000,31707=>1000,31708=>1000,31709=>1000,31710=>1000,31711=>1000,31712=>1000,31713=>1000,31714=>1000,31715=>1000,31716=>1000, - 31717=>1000,31718=>1000,31719=>1000,31720=>1000,31721=>1000,31722=>1000,31723=>1000,31724=>1000,31725=>1000,31726=>1000,31727=>1000,31728=>1000,31729=>1000,31730=>1000,31731=>1000,31732=>1000, - 31733=>1000,31734=>1000,31735=>1000,31736=>1000,31737=>1000,31738=>1000,31739=>1000,31740=>1000,31741=>1000,31742=>1000,31743=>1000,31744=>1000,31745=>1000,31746=>1000,31747=>1000,31748=>1000, - 31749=>1000,31750=>1000,31751=>1000,31752=>1000,31753=>1000,31754=>1000,31755=>1000,31756=>1000,31757=>1000,31758=>1000,31759=>1000,31760=>1000,31761=>1000,31762=>1000,31763=>1000,31764=>1000, - 31765=>1000,31766=>1000,31767=>1000,31768=>1000,31769=>1000,31770=>1000,31771=>1000,31772=>1000,31773=>1000,31774=>1000,31775=>1000,31776=>1000,31777=>1000,31778=>1000,31779=>1000,31780=>1000, - 31781=>1000,31782=>1000,31783=>1000,31784=>1000,31785=>1000,31786=>1000,31787=>1000,31788=>1000,31789=>1000,31790=>1000,31791=>1000,31792=>1000,31793=>1000,31794=>1000,31795=>1000,31796=>1000, - 31797=>1000,31798=>1000,31799=>1000,31800=>1000,31801=>1000,31802=>1000,31803=>1000,31804=>1000,31805=>1000,31806=>1000,31807=>1000,31808=>1000,31809=>1000,31810=>1000,31811=>1000,31812=>1000, - 31813=>1000,31814=>1000,31815=>1000,31816=>1000,31817=>1000,31818=>1000,31819=>1000,31820=>1000,31821=>1000,31822=>1000,31823=>1000,31824=>1000,31825=>1000,31826=>1000,31827=>1000,31828=>1000, - 31829=>1000,31830=>1000,31831=>1000,31832=>1000,31833=>1000,31834=>1000,31835=>1000,31836=>1000,31837=>1000,31838=>1000,31839=>1000,31840=>1000,31841=>1000,31842=>1000,31843=>1000,31844=>1000, - 31845=>1000,31846=>1000,31847=>1000,31848=>1000,31849=>1000,31850=>1000,31851=>1000,31852=>1000,31853=>1000,31854=>1000,31855=>1000,31856=>1000,31857=>1000,31858=>1000,31859=>1000,31860=>1000, - 31861=>1000,31862=>1000,31863=>1000,31864=>1000,31865=>1000,31866=>1000,31867=>1000,31868=>1000,31869=>1000,31870=>1000,31871=>1000,31872=>1000,31873=>1000,31874=>1000,31875=>1000,31876=>1000, - 31877=>1000,31878=>1000,31879=>1000,31880=>1000,31881=>1000,31882=>1000,31883=>1000,31884=>1000,31885=>1000,31886=>1000,31887=>1000,31888=>1000,31889=>1000,31890=>1000,31891=>1000,31892=>1000, - 31893=>1000,31894=>1000,31895=>1000,31896=>1000,31897=>1000,31898=>1000,31899=>1000,31900=>1000,31901=>1000,31902=>1000,31903=>1000,31904=>1000,31905=>1000,31906=>1000,31907=>1000,31908=>1000, - 31909=>1000,31910=>1000,31911=>1000,31912=>1000,31913=>1000,31914=>1000,31915=>1000,31916=>1000,31917=>1000,31918=>1000,31919=>1000,31920=>1000,31921=>1000,31922=>1000,31923=>1000,31924=>1000, - 31925=>1000,31926=>1000,31927=>1000,31928=>1000,31929=>1000,31930=>1000,31931=>1000,31932=>1000,31933=>1000,31934=>1000,31935=>1000,31936=>1000,31937=>1000,31938=>1000,31939=>1000,31940=>1000, - 31941=>1000,31942=>1000,31943=>1000,31944=>1000,31945=>1000,31946=>1000,31947=>1000,31948=>1000,31949=>1000,31950=>1000,31951=>1000,31952=>1000,31953=>1000,31954=>1000,31955=>1000,31956=>1000, - 31957=>1000,31958=>1000,31959=>1000,31960=>1000,31961=>1000,31962=>1000,31963=>1000,31964=>1000,31965=>1000,31966=>1000,31967=>1000,31968=>1000,31969=>1000,31970=>1000,31971=>1000,31972=>1000, - 31973=>1000,31974=>1000,31975=>1000,31976=>1000,31977=>1000,31978=>1000,31979=>1000,31980=>1000,31981=>1000,31982=>1000,31983=>1000,31984=>1000,31985=>1000,31986=>1000,31987=>1000,31988=>1000, - 31989=>1000,31990=>1000,31991=>1000,31992=>1000,31993=>1000,31994=>1000,31995=>1000,31996=>1000,31997=>1000,31998=>1000,31999=>1000,32000=>1000,32001=>1000,32002=>1000,32003=>1000,32004=>1000, - 32005=>1000,32006=>1000,32007=>1000,32008=>1000,32009=>1000,32010=>1000,32011=>1000,32012=>1000,32013=>1000,32014=>1000,32015=>1000,32016=>1000,32017=>1000,32018=>1000,32019=>1000,32020=>1000, - 32021=>1000,32022=>1000,32023=>1000,32024=>1000,32025=>1000,32026=>1000,32027=>1000,32028=>1000,32029=>1000,32030=>1000,32031=>1000,32032=>1000,32033=>1000,32034=>1000,32035=>1000,32036=>1000, - 32037=>1000,32038=>1000,32039=>1000,32040=>1000,32041=>1000,32042=>1000,32043=>1000,32044=>1000,32045=>1000,32046=>1000,32047=>1000,32048=>1000,32049=>1000,32050=>1000,32051=>1000,32052=>1000, - 32053=>1000,32054=>1000,32055=>1000,32056=>1000,32057=>1000,32058=>1000,32059=>1000,32060=>1000,32061=>1000,32062=>1000,32063=>1000,32064=>1000,32065=>1000,32066=>1000,32067=>1000,32068=>1000, - 32069=>1000,32070=>1000,32071=>1000,32072=>1000,32073=>1000,32074=>1000,32075=>1000,32076=>1000,32077=>1000,32078=>1000,32079=>1000,32080=>1000,32081=>1000,32082=>1000,32083=>1000,32084=>1000, - 32085=>1000,32086=>1000,32087=>1000,32088=>1000,32089=>1000,32090=>1000,32091=>1000,32092=>1000,32093=>1000,32094=>1000,32095=>1000,32096=>1000,32097=>1000,32098=>1000,32099=>1000,32100=>1000, - 32101=>1000,32102=>1000,32103=>1000,32104=>1000,32105=>1000,32106=>1000,32107=>1000,32108=>1000,32109=>1000,32110=>1000,32111=>1000,32112=>1000,32113=>1000,32114=>1000,32115=>1000,32116=>1000, - 32117=>1000,32118=>1000,32119=>1000,32120=>1000,32121=>1000,32122=>1000,32123=>1000,32124=>1000,32125=>1000,32126=>1000,32127=>1000,32128=>1000,32129=>1000,32130=>1000,32131=>1000,32132=>1000, - 32133=>1000,32134=>1000,32135=>1000,32136=>1000,32137=>1000,32138=>1000,32139=>1000,32140=>1000,32141=>1000,32142=>1000,32143=>1000,32144=>1000,32145=>1000,32146=>1000,32147=>1000,32148=>1000, - 32149=>1000,32150=>1000,32151=>1000,32152=>1000,32153=>1000,32154=>1000,32155=>1000,32156=>1000,32157=>1000,32158=>1000,32159=>1000,32160=>1000,32161=>1000,32162=>1000,32163=>1000,32164=>1000, - 32165=>1000,32166=>1000,32167=>1000,32168=>1000,32169=>1000,32170=>1000,32171=>1000,32172=>1000,32173=>1000,32174=>1000,32175=>1000,32176=>1000,32177=>1000,32178=>1000,32179=>1000,32180=>1000, - 32181=>1000,32182=>1000,32183=>1000,32184=>1000,32185=>1000,32186=>1000,32187=>1000,32188=>1000,32189=>1000,32190=>1000,32191=>1000,32192=>1000,32193=>1000,32194=>1000,32195=>1000,32196=>1000, - 32197=>1000,32198=>1000,32199=>1000,32200=>1000,32201=>1000,32202=>1000,32203=>1000,32204=>1000,32205=>1000,32206=>1000,32207=>1000,32208=>1000,32209=>1000,32210=>1000,32211=>1000,32212=>1000, - 32213=>1000,32214=>1000,32215=>1000,32216=>1000,32217=>1000,32218=>1000,32219=>1000,32220=>1000,32221=>1000,32222=>1000,32223=>1000,32224=>1000,32225=>1000,32226=>1000,32227=>1000,32228=>1000, - 32229=>1000,32230=>1000,32231=>1000,32232=>1000,32233=>1000,32234=>1000,32235=>1000,32236=>1000,32237=>1000,32238=>1000,32239=>1000,32240=>1000,32241=>1000,32242=>1000,32243=>1000,32244=>1000, - 32245=>1000,32246=>1000,32247=>1000,32248=>1000,32249=>1000,32250=>1000,32251=>1000,32252=>1000,32253=>1000,32254=>1000,32255=>1000,32256=>1000,32257=>1000,32258=>1000,32259=>1000,32260=>1000, - 32261=>1000,32262=>1000,32263=>1000,32264=>1000,32265=>1000,32266=>1000,32267=>1000,32268=>1000,32269=>1000,32270=>1000,32271=>1000,32272=>1000,32273=>1000,32274=>1000,32275=>1000,32276=>1000, - 32277=>1000,32278=>1000,32279=>1000,32280=>1000,32281=>1000,32282=>1000,32283=>1000,32284=>1000,32285=>1000,32286=>1000,32287=>1000,32288=>1000,32289=>1000,32290=>1000,32291=>1000,32292=>1000, - 32293=>1000,32294=>1000,32295=>1000,32296=>1000,32297=>1000,32298=>1000,32299=>1000,32300=>1000,32301=>1000,32302=>1000,32303=>1000,32304=>1000,32305=>1000,32306=>1000,32307=>1000,32308=>1000, - 32309=>1000,32310=>1000,32311=>1000,32312=>1000,32313=>1000,32314=>1000,32315=>1000,32316=>1000,32317=>1000,32318=>1000,32319=>1000,32320=>1000,32321=>1000,32322=>1000,32323=>1000,32324=>1000, - 32325=>1000,32326=>1000,32327=>1000,32328=>1000,32329=>1000,32330=>1000,32331=>1000,32332=>1000,32333=>1000,32334=>1000,32335=>1000,32336=>1000,32337=>1000,32338=>1000,32339=>1000,32340=>1000, - 32341=>1000,32342=>1000,32343=>1000,32344=>1000,32345=>1000,32346=>1000,32347=>1000,32348=>1000,32349=>1000,32350=>1000,32351=>1000,32352=>1000,32353=>1000,32354=>1000,32355=>1000,32356=>1000, - 32357=>1000,32358=>1000,32359=>1000,32360=>1000,32361=>1000,32362=>1000,32363=>1000,32364=>1000,32365=>1000,32366=>1000,32367=>1000,32368=>1000,32369=>1000,32370=>1000,32371=>1000,32372=>1000, - 32373=>1000,32374=>1000,32375=>1000,32376=>1000,32377=>1000,32378=>1000,32379=>1000,32380=>1000,32381=>1000,32382=>1000,32383=>1000,32384=>1000,32385=>1000,32386=>1000,32387=>1000,32388=>1000, - 32389=>1000,32390=>1000,32391=>1000,32392=>1000,32393=>1000,32394=>1000,32395=>1000,32396=>1000,32397=>1000,32398=>1000,32399=>1000,32400=>1000,32401=>1000,32402=>1000,32403=>1000,32404=>1000, - 32405=>1000,32406=>1000,32407=>1000,32408=>1000,32409=>1000,32410=>1000,32411=>1000,32412=>1000,32413=>1000,32414=>1000,32415=>1000,32416=>1000,32417=>1000,32418=>1000,32419=>1000,32420=>1000, - 32421=>1000,32422=>1000,32423=>1000,32424=>1000,32425=>1000,32426=>1000,32427=>1000,32428=>1000,32429=>1000,32430=>1000,32431=>1000,32432=>1000,32433=>1000,32434=>1000,32435=>1000,32436=>1000, - 32437=>1000,32438=>1000,32439=>1000,32440=>1000,32441=>1000,32442=>1000,32443=>1000,32444=>1000,32445=>1000,32446=>1000,32447=>1000,32448=>1000,32449=>1000,32450=>1000,32451=>1000,32452=>1000, - 32453=>1000,32454=>1000,32455=>1000,32456=>1000,32457=>1000,32458=>1000,32459=>1000,32460=>1000,32461=>1000,32462=>1000,32463=>1000,32464=>1000,32465=>1000,32466=>1000,32467=>1000,32468=>1000, - 32469=>1000,32470=>1000,32471=>1000,32472=>1000,32473=>1000,32474=>1000,32475=>1000,32476=>1000,32477=>1000,32478=>1000,32479=>1000,32480=>1000,32481=>1000,32482=>1000,32483=>1000,32484=>1000, - 32485=>1000,32486=>1000,32487=>1000,32488=>1000,32489=>1000,32490=>1000,32491=>1000,32492=>1000,32493=>1000,32494=>1000,32495=>1000,32496=>1000,32497=>1000,32498=>1000,32499=>1000,32500=>1000, - 32501=>1000,32502=>1000,32503=>1000,32504=>1000,32505=>1000,32506=>1000,32507=>1000,32508=>1000,32509=>1000,32510=>1000,32511=>1000,32512=>1000,32513=>1000,32514=>1000,32515=>1000,32516=>1000, - 32517=>1000,32518=>1000,32519=>1000,32520=>1000,32521=>1000,32522=>1000,32523=>1000,32524=>1000,32525=>1000,32526=>1000,32527=>1000,32528=>1000,32529=>1000,32530=>1000,32531=>1000,32532=>1000, - 32533=>1000,32534=>1000,32535=>1000,32536=>1000,32537=>1000,32538=>1000,32539=>1000,32540=>1000,32541=>1000,32542=>1000,32543=>1000,32544=>1000,32545=>1000,32546=>1000,32547=>1000,32548=>1000, - 32549=>1000,32550=>1000,32551=>1000,32552=>1000,32553=>1000,32554=>1000,32555=>1000,32556=>1000,32557=>1000,32558=>1000,32559=>1000,32560=>1000,32561=>1000,32562=>1000,32563=>1000,32564=>1000, - 32565=>1000,32566=>1000,32567=>1000,32568=>1000,32569=>1000,32570=>1000,32571=>1000,32572=>1000,32573=>1000,32574=>1000,32575=>1000,32576=>1000,32577=>1000,32578=>1000,32579=>1000,32580=>1000, - 32581=>1000,32582=>1000,32583=>1000,32584=>1000,32585=>1000,32586=>1000,32587=>1000,32588=>1000,32589=>1000,32590=>1000,32591=>1000,32592=>1000,32593=>1000,32594=>1000,32595=>1000,32596=>1000, - 32597=>1000,32598=>1000,32599=>1000,32600=>1000,32601=>1000,32602=>1000,32603=>1000,32604=>1000,32605=>1000,32606=>1000,32607=>1000,32608=>1000,32609=>1000,32610=>1000,32611=>1000,32612=>1000, - 32613=>1000,32614=>1000,32615=>1000,32616=>1000,32617=>1000,32618=>1000,32619=>1000,32620=>1000,32621=>1000,32622=>1000,32623=>1000,32624=>1000,32625=>1000,32626=>1000,32627=>1000,32628=>1000, - 32629=>1000,32630=>1000,32631=>1000,32632=>1000,32633=>1000,32634=>1000,32635=>1000,32636=>1000,32637=>1000,32638=>1000,32639=>1000,32640=>1000,32641=>1000,32642=>1000,32643=>1000,32644=>1000, - 32645=>1000,32646=>1000,32647=>1000,32648=>1000,32649=>1000,32650=>1000,32651=>1000,32652=>1000,32653=>1000,32654=>1000,32655=>1000,32656=>1000,32657=>1000,32658=>1000,32659=>1000,32660=>1000, - 32661=>1000,32662=>1000,32663=>1000,32664=>1000,32665=>1000,32666=>1000,32667=>1000,32668=>1000,32669=>1000,32670=>1000,32671=>1000,32672=>1000,32673=>1000,32674=>1000,32675=>1000,32676=>1000, - 32677=>1000,32678=>1000,32679=>1000,32680=>1000,32681=>1000,32682=>1000,32683=>1000,32684=>1000,32685=>1000,32686=>1000,32687=>1000,32688=>1000,32689=>1000,32690=>1000,32691=>1000,32692=>1000, - 32693=>1000,32694=>1000,32695=>1000,32696=>1000,32697=>1000,32698=>1000,32699=>1000,32700=>1000,32701=>1000,32702=>1000,32703=>1000,32704=>1000,32705=>1000,32706=>1000,32707=>1000,32708=>1000, - 32709=>1000,32710=>1000,32711=>1000,32712=>1000,32713=>1000,32714=>1000,32715=>1000,32716=>1000,32717=>1000,32718=>1000,32719=>1000,32720=>1000,32721=>1000,32722=>1000,32723=>1000,32724=>1000, - 32725=>1000,32726=>1000,32727=>1000,32728=>1000,32729=>1000,32730=>1000,32731=>1000,32732=>1000,32733=>1000,32734=>1000,32735=>1000,32736=>1000,32737=>1000,32738=>1000,32739=>1000,32740=>1000, - 32741=>1000,32742=>1000,32743=>1000,32744=>1000,32745=>1000,32746=>1000,32747=>1000,32748=>1000,32749=>1000,32750=>1000,32751=>1000,32752=>1000,32753=>1000,32754=>1000,32755=>1000,32756=>1000, - 32757=>1000,32758=>1000,32759=>1000,32760=>1000,32761=>1000,32762=>1000,32763=>1000,32764=>1000,32765=>1000,32766=>1000,32767=>1000,32768=>1000,32769=>1000,32770=>1000,32771=>1000,32772=>1000, - 32773=>1000,32774=>1000,32775=>1000,32776=>1000,32777=>1000,32778=>1000,32779=>1000,32780=>1000,32781=>1000,32782=>1000,32783=>1000,32784=>1000,32785=>1000,32786=>1000,32787=>1000,32788=>1000, - 32789=>1000,32790=>1000,32791=>1000,32792=>1000,32793=>1000,32794=>1000,32795=>1000,32796=>1000,32797=>1000,32798=>1000,32799=>1000,32800=>1000,32801=>1000,32802=>1000,32803=>1000,32804=>1000, - 32805=>1000,32806=>1000,32807=>1000,32808=>1000,32809=>1000,32810=>1000,32811=>1000,32812=>1000,32813=>1000,32814=>1000,32815=>1000,32816=>1000,32817=>1000,32818=>1000,32819=>1000,32820=>1000, - 32821=>1000,32822=>1000,32823=>1000,32824=>1000,32825=>1000,32826=>1000,32827=>1000,32828=>1000,32829=>1000,32830=>1000,32831=>1000,32832=>1000,32833=>1000,32834=>1000,32835=>1000,32836=>1000, - 32837=>1000,32838=>1000,32839=>1000,32840=>1000,32841=>1000,32842=>1000,32843=>1000,32844=>1000,32845=>1000,32846=>1000,32847=>1000,32848=>1000,32849=>1000,32850=>1000,32851=>1000,32852=>1000, - 32853=>1000,32854=>1000,32855=>1000,32856=>1000,32857=>1000,32858=>1000,32859=>1000,32860=>1000,32861=>1000,32862=>1000,32863=>1000,32864=>1000,32865=>1000,32866=>1000,32867=>1000,32868=>1000, - 32869=>1000,32870=>1000,32871=>1000,32872=>1000,32873=>1000,32874=>1000,32875=>1000,32876=>1000,32877=>1000,32878=>1000,32879=>1000,32880=>1000,32881=>1000,32882=>1000,32883=>1000,32884=>1000, - 32885=>1000,32886=>1000,32887=>1000,32888=>1000,32889=>1000,32890=>1000,32891=>1000,32892=>1000,32893=>1000,32894=>1000,32895=>1000,32896=>1000,32897=>1000,32898=>1000,32899=>1000,32900=>1000, - 32901=>1000,32902=>1000,32903=>1000,32904=>1000,32905=>1000,32906=>1000,32907=>1000,32908=>1000,32909=>1000,32910=>1000,32911=>1000,32912=>1000,32913=>1000,32914=>1000,32915=>1000,32916=>1000, - 32917=>1000,32918=>1000,32919=>1000,32920=>1000,32921=>1000,32922=>1000,32923=>1000,32924=>1000,32925=>1000,32926=>1000,32927=>1000,32928=>1000,32929=>1000,32930=>1000,32931=>1000,32932=>1000, - 32933=>1000,32934=>1000,32935=>1000,32936=>1000,32937=>1000,32938=>1000,32939=>1000,32940=>1000,32941=>1000,32942=>1000,32943=>1000,32944=>1000,32945=>1000,32946=>1000,32947=>1000,32948=>1000, - 32949=>1000,32950=>1000,32951=>1000,32952=>1000,32953=>1000,32954=>1000,32955=>1000,32956=>1000,32957=>1000,32958=>1000,32959=>1000,32960=>1000,32961=>1000,32962=>1000,32963=>1000,32964=>1000, - 32965=>1000,32966=>1000,32967=>1000,32968=>1000,32969=>1000,32970=>1000,32971=>1000,32972=>1000,32973=>1000,32974=>1000,32975=>1000,32976=>1000,32977=>1000,32978=>1000,32979=>1000,32980=>1000, - 32981=>1000,32982=>1000,32983=>1000,32984=>1000,32985=>1000,32986=>1000,32987=>1000,32988=>1000,32989=>1000,32990=>1000,32991=>1000,32992=>1000,32993=>1000,32994=>1000,32995=>1000,32996=>1000, - 32997=>1000,32998=>1000,32999=>1000,33000=>1000,33001=>1000,33002=>1000,33003=>1000,33004=>1000,33005=>1000,33006=>1000,33007=>1000,33008=>1000,33009=>1000,33010=>1000,33011=>1000,33012=>1000, - 33013=>1000,33014=>1000,33015=>1000,33016=>1000,33017=>1000,33018=>1000,33019=>1000,33020=>1000,33021=>1000,33022=>1000,33023=>1000,33024=>1000,33025=>1000,33026=>1000,33027=>1000,33028=>1000, - 33029=>1000,33030=>1000,33031=>1000,33032=>1000,33033=>1000,33034=>1000,33035=>1000,33036=>1000,33037=>1000,33038=>1000,33039=>1000,33040=>1000,33041=>1000,33042=>1000,33043=>1000,33044=>1000, - 33045=>1000,33046=>1000,33047=>1000,33048=>1000,33049=>1000,33050=>1000,33051=>1000,33052=>1000,33053=>1000,33054=>1000,33055=>1000,33056=>1000,33057=>1000,33058=>1000,33059=>1000,33060=>1000, - 33061=>1000,33062=>1000,33063=>1000,33064=>1000,33065=>1000,33066=>1000,33067=>1000,33068=>1000,33069=>1000,33070=>1000,33071=>1000,33072=>1000,33073=>1000,33074=>1000,33075=>1000,33076=>1000, - 33077=>1000,33078=>1000,33079=>1000,33080=>1000,33081=>1000,33082=>1000,33083=>1000,33084=>1000,33085=>1000,33086=>1000,33087=>1000,33088=>1000,33089=>1000,33090=>1000,33091=>1000,33092=>1000, - 33093=>1000,33094=>1000,33095=>1000,33096=>1000,33097=>1000,33098=>1000,33099=>1000,33100=>1000,33101=>1000,33102=>1000,33103=>1000,33104=>1000,33105=>1000,33106=>1000,33107=>1000,33108=>1000, - 33109=>1000,33110=>1000,33111=>1000,33112=>1000,33113=>1000,33114=>1000,33115=>1000,33116=>1000,33117=>1000,33118=>1000,33119=>1000,33120=>1000,33121=>1000,33122=>1000,33123=>1000,33124=>1000, - 33125=>1000,33126=>1000,33127=>1000,33128=>1000,33129=>1000,33130=>1000,33131=>1000,33132=>1000,33133=>1000,33134=>1000,33135=>1000,33136=>1000,33137=>1000,33138=>1000,33139=>1000,33140=>1000, - 33141=>1000,33142=>1000,33143=>1000,33144=>1000,33145=>1000,33146=>1000,33147=>1000,33148=>1000,33149=>1000,33150=>1000,33151=>1000,33152=>1000,33153=>1000,33154=>1000,33155=>1000,33156=>1000, - 33157=>1000,33158=>1000,33159=>1000,33160=>1000,33161=>1000,33162=>1000,33163=>1000,33164=>1000,33165=>1000,33166=>1000,33167=>1000,33168=>1000,33169=>1000,33170=>1000,33171=>1000,33172=>1000, - 33173=>1000,33174=>1000,33175=>1000,33176=>1000,33177=>1000,33178=>1000,33179=>1000,33180=>1000,33181=>1000,33182=>1000,33183=>1000,33184=>1000,33185=>1000,33186=>1000,33187=>1000,33188=>1000, - 33189=>1000,33190=>1000,33191=>1000,33192=>1000,33193=>1000,33194=>1000,33195=>1000,33196=>1000,33197=>1000,33198=>1000,33199=>1000,33200=>1000,33201=>1000,33202=>1000,33203=>1000,33204=>1000, - 33205=>1000,33206=>1000,33207=>1000,33208=>1000,33209=>1000,33210=>1000,33211=>1000,33212=>1000,33213=>1000,33214=>1000,33215=>1000,33216=>1000,33217=>1000,33218=>1000,33219=>1000,33220=>1000, - 33221=>1000,33222=>1000,33223=>1000,33224=>1000,33225=>1000,33226=>1000,33227=>1000,33228=>1000,33229=>1000,33230=>1000,33231=>1000,33232=>1000,33233=>1000,33234=>1000,33235=>1000,33236=>1000, - 33237=>1000,33238=>1000,33239=>1000,33240=>1000,33241=>1000,33242=>1000,33243=>1000,33244=>1000,33245=>1000,33246=>1000,33247=>1000,33248=>1000,33249=>1000,33250=>1000,33251=>1000,33252=>1000, - 33253=>1000,33254=>1000,33255=>1000,33256=>1000,33257=>1000,33258=>1000,33259=>1000,33260=>1000,33261=>1000,33262=>1000,33263=>1000,33264=>1000,33265=>1000,33266=>1000,33267=>1000,33268=>1000, - 33269=>1000,33270=>1000,33271=>1000,33272=>1000,33273=>1000,33274=>1000,33275=>1000,33276=>1000,33277=>1000,33278=>1000,33279=>1000,33280=>1000,33281=>1000,33282=>1000,33283=>1000,33284=>1000, - 33285=>1000,33286=>1000,33287=>1000,33288=>1000,33289=>1000,33290=>1000,33291=>1000,33292=>1000,33293=>1000,33294=>1000,33295=>1000,33296=>1000,33297=>1000,33298=>1000,33299=>1000,33300=>1000, - 33301=>1000,33302=>1000,33303=>1000,33304=>1000,33305=>1000,33306=>1000,33307=>1000,33308=>1000,33309=>1000,33310=>1000,33311=>1000,33312=>1000,33313=>1000,33314=>1000,33315=>1000,33316=>1000, - 33317=>1000,33318=>1000,33319=>1000,33320=>1000,33321=>1000,33322=>1000,33323=>1000,33324=>1000,33325=>1000,33326=>1000,33327=>1000,33328=>1000,33329=>1000,33330=>1000,33331=>1000,33332=>1000, - 33333=>1000,33334=>1000,33335=>1000,33336=>1000,33337=>1000,33338=>1000,33339=>1000,33340=>1000,33341=>1000,33342=>1000,33343=>1000,33344=>1000,33345=>1000,33346=>1000,33347=>1000,33348=>1000, - 33349=>1000,33350=>1000,33351=>1000,33352=>1000,33353=>1000,33354=>1000,33355=>1000,33356=>1000,33357=>1000,33358=>1000,33359=>1000,33360=>1000,33361=>1000,33362=>1000,33363=>1000,33364=>1000, - 33365=>1000,33366=>1000,33367=>1000,33368=>1000,33369=>1000,33370=>1000,33371=>1000,33372=>1000,33373=>1000,33374=>1000,33375=>1000,33376=>1000,33377=>1000,33378=>1000,33379=>1000,33380=>1000, - 33381=>1000,33382=>1000,33383=>1000,33384=>1000,33385=>1000,33386=>1000,33387=>1000,33388=>1000,33389=>1000,33390=>1000,33391=>1000,33392=>1000,33393=>1000,33394=>1000,33395=>1000,33396=>1000, - 33397=>1000,33398=>1000,33399=>1000,33400=>1000,33401=>1000,33402=>1000,33403=>1000,33404=>1000,33405=>1000,33406=>1000,33407=>1000,33408=>1000,33409=>1000,33410=>1000,33411=>1000,33412=>1000, - 33413=>1000,33414=>1000,33415=>1000,33416=>1000,33417=>1000,33418=>1000,33419=>1000,33420=>1000,33421=>1000,33422=>1000,33423=>1000,33424=>1000,33425=>1000,33426=>1000,33427=>1000,33428=>1000, - 33429=>1000,33430=>1000,33431=>1000,33432=>1000,33433=>1000,33434=>1000,33435=>1000,33436=>1000,33437=>1000,33438=>1000,33439=>1000,33440=>1000,33441=>1000,33442=>1000,33443=>1000,33444=>1000, - 33445=>1000,33446=>1000,33447=>1000,33448=>1000,33449=>1000,33450=>1000,33451=>1000,33452=>1000,33453=>1000,33454=>1000,33455=>1000,33456=>1000,33457=>1000,33458=>1000,33459=>1000,33460=>1000, - 33461=>1000,33462=>1000,33463=>1000,33464=>1000,33465=>1000,33466=>1000,33467=>1000,33468=>1000,33469=>1000,33470=>1000,33471=>1000,33472=>1000,33473=>1000,33474=>1000,33475=>1000,33476=>1000, - 33477=>1000,33478=>1000,33479=>1000,33480=>1000,33481=>1000,33482=>1000,33483=>1000,33484=>1000,33485=>1000,33486=>1000,33487=>1000,33488=>1000,33489=>1000,33490=>1000,33491=>1000,33492=>1000, - 33493=>1000,33494=>1000,33495=>1000,33496=>1000,33497=>1000,33498=>1000,33499=>1000,33500=>1000,33501=>1000,33502=>1000,33503=>1000,33504=>1000,33505=>1000,33506=>1000,33507=>1000,33508=>1000, - 33509=>1000,33510=>1000,33511=>1000,33512=>1000,33513=>1000,33514=>1000,33515=>1000,33516=>1000,33517=>1000,33518=>1000,33519=>1000,33520=>1000,33521=>1000,33522=>1000,33523=>1000,33524=>1000, - 33525=>1000,33526=>1000,33527=>1000,33528=>1000,33529=>1000,33530=>1000,33531=>1000,33532=>1000,33533=>1000,33534=>1000,33535=>1000,33536=>1000,33537=>1000,33538=>1000,33539=>1000,33540=>1000, - 33541=>1000,33542=>1000,33543=>1000,33544=>1000,33545=>1000,33546=>1000,33547=>1000,33548=>1000,33549=>1000,33550=>1000,33551=>1000,33552=>1000,33553=>1000,33554=>1000,33555=>1000,33556=>1000, - 33557=>1000,33558=>1000,33559=>1000,33560=>1000,33561=>1000,33562=>1000,33563=>1000,33564=>1000,33565=>1000,33566=>1000,33567=>1000,33568=>1000,33569=>1000,33570=>1000,33571=>1000,33572=>1000, - 33573=>1000,33574=>1000,33575=>1000,33576=>1000,33577=>1000,33578=>1000,33579=>1000,33580=>1000,33581=>1000,33582=>1000,33583=>1000,33584=>1000,33585=>1000,33586=>1000,33587=>1000,33588=>1000, - 33589=>1000,33590=>1000,33591=>1000,33592=>1000,33593=>1000,33594=>1000,33595=>1000,33596=>1000,33597=>1000,33598=>1000,33599=>1000,33600=>1000,33601=>1000,33602=>1000,33603=>1000,33604=>1000, - 33605=>1000,33606=>1000,33607=>1000,33608=>1000,33609=>1000,33610=>1000,33611=>1000,33612=>1000,33613=>1000,33614=>1000,33615=>1000,33616=>1000,33617=>1000,33618=>1000,33619=>1000,33620=>1000, - 33621=>1000,33622=>1000,33623=>1000,33624=>1000,33625=>1000,33626=>1000,33627=>1000,33628=>1000,33629=>1000,33630=>1000,33631=>1000,33632=>1000,33633=>1000,33634=>1000,33635=>1000,33636=>1000, - 33637=>1000,33638=>1000,33639=>1000,33640=>1000,33641=>1000,33642=>1000,33643=>1000,33644=>1000,33645=>1000,33646=>1000,33647=>1000,33648=>1000,33649=>1000,33650=>1000,33651=>1000,33652=>1000, - 33653=>1000,33654=>1000,33655=>1000,33656=>1000,33657=>1000,33658=>1000,33659=>1000,33660=>1000,33661=>1000,33662=>1000,33663=>1000,33664=>1000,33665=>1000,33666=>1000,33667=>1000,33668=>1000, - 33669=>1000,33670=>1000,33671=>1000,33672=>1000,33673=>1000,33674=>1000,33675=>1000,33676=>1000,33677=>1000,33678=>1000,33679=>1000,33680=>1000,33681=>1000,33682=>1000,33683=>1000,33684=>1000, - 33685=>1000,33686=>1000,33687=>1000,33688=>1000,33689=>1000,33690=>1000,33691=>1000,33692=>1000,33693=>1000,33694=>1000,33695=>1000,33696=>1000,33697=>1000,33698=>1000,33699=>1000,33700=>1000, - 33701=>1000,33702=>1000,33703=>1000,33704=>1000,33705=>1000,33706=>1000,33707=>1000,33708=>1000,33709=>1000,33710=>1000,33711=>1000,33712=>1000,33713=>1000,33714=>1000,33715=>1000,33716=>1000, - 33717=>1000,33718=>1000,33719=>1000,33720=>1000,33721=>1000,33722=>1000,33723=>1000,33724=>1000,33725=>1000,33726=>1000,33727=>1000,33728=>1000,33729=>1000,33730=>1000,33731=>1000,33732=>1000, - 33733=>1000,33734=>1000,33735=>1000,33736=>1000,33737=>1000,33738=>1000,33739=>1000,33740=>1000,33741=>1000,33742=>1000,33743=>1000,33744=>1000,33745=>1000,33746=>1000,33747=>1000,33748=>1000, - 33749=>1000,33750=>1000,33751=>1000,33752=>1000,33753=>1000,33754=>1000,33755=>1000,33756=>1000,33757=>1000,33758=>1000,33759=>1000,33760=>1000,33761=>1000,33762=>1000,33763=>1000,33764=>1000, - 33765=>1000,33766=>1000,33767=>1000,33768=>1000,33769=>1000,33770=>1000,33771=>1000,33772=>1000,33773=>1000,33774=>1000,33775=>1000,33776=>1000,33777=>1000,33778=>1000,33779=>1000,33780=>1000, - 33781=>1000,33782=>1000,33783=>1000,33784=>1000,33785=>1000,33786=>1000,33787=>1000,33788=>1000,33789=>1000,33790=>1000,33791=>1000,33792=>1000,33793=>1000,33794=>1000,33795=>1000,33796=>1000, - 33797=>1000,33798=>1000,33799=>1000,33800=>1000,33801=>1000,33802=>1000,33803=>1000,33804=>1000,33805=>1000,33806=>1000,33807=>1000,33808=>1000,33809=>1000,33810=>1000,33811=>1000,33812=>1000, - 33813=>1000,33814=>1000,33815=>1000,33816=>1000,33817=>1000,33818=>1000,33819=>1000,33820=>1000,33821=>1000,33822=>1000,33823=>1000,33824=>1000,33825=>1000,33826=>1000,33827=>1000,33828=>1000, - 33829=>1000,33830=>1000,33831=>1000,33832=>1000,33833=>1000,33834=>1000,33835=>1000,33836=>1000,33837=>1000,33838=>1000,33839=>1000,33840=>1000,33841=>1000,33842=>1000,33843=>1000,33844=>1000, - 33845=>1000,33846=>1000,33847=>1000,33848=>1000,33849=>1000,33850=>1000,33851=>1000,33852=>1000,33853=>1000,33854=>1000,33855=>1000,33856=>1000,33857=>1000,33858=>1000,33859=>1000,33860=>1000, - 33861=>1000,33862=>1000,33863=>1000,33864=>1000,33865=>1000,33866=>1000,33867=>1000,33868=>1000,33869=>1000,33870=>1000,33871=>1000,33872=>1000,33873=>1000,33874=>1000,33875=>1000,33876=>1000, - 33877=>1000,33878=>1000,33879=>1000,33880=>1000,33881=>1000,33882=>1000,33883=>1000,33884=>1000,33885=>1000,33886=>1000,33887=>1000,33888=>1000,33889=>1000,33890=>1000,33891=>1000,33892=>1000, - 33893=>1000,33894=>1000,33895=>1000,33896=>1000,33897=>1000,33898=>1000,33899=>1000,33900=>1000,33901=>1000,33902=>1000,33903=>1000,33904=>1000,33905=>1000,33906=>1000,33907=>1000,33908=>1000, - 33909=>1000,33910=>1000,33911=>1000,33912=>1000,33913=>1000,33914=>1000,33915=>1000,33916=>1000,33917=>1000,33918=>1000,33919=>1000,33920=>1000,33921=>1000,33922=>1000,33923=>1000,33924=>1000, - 33925=>1000,33926=>1000,33927=>1000,33928=>1000,33929=>1000,33930=>1000,33931=>1000,33932=>1000,33933=>1000,33934=>1000,33935=>1000,33936=>1000,33937=>1000,33938=>1000,33939=>1000,33940=>1000, - 33941=>1000,33942=>1000,33943=>1000,33944=>1000,33945=>1000,33946=>1000,33947=>1000,33948=>1000,33949=>1000,33950=>1000,33951=>1000,33952=>1000,33953=>1000,33954=>1000,33955=>1000,33956=>1000, - 33957=>1000,33958=>1000,33959=>1000,33960=>1000,33961=>1000,33962=>1000,33963=>1000,33964=>1000,33965=>1000,33966=>1000,33967=>1000,33968=>1000,33969=>1000,33970=>1000,33971=>1000,33972=>1000, - 33973=>1000,33974=>1000,33975=>1000,33976=>1000,33977=>1000,33978=>1000,33979=>1000,33980=>1000,33981=>1000,33982=>1000,33983=>1000,33984=>1000,33985=>1000,33986=>1000,33987=>1000,33988=>1000, - 33989=>1000,33990=>1000,33991=>1000,33992=>1000,33993=>1000,33994=>1000,33995=>1000,33996=>1000,33997=>1000,33998=>1000,33999=>1000,34000=>1000,34001=>1000,34002=>1000,34003=>1000,34004=>1000, - 34005=>1000,34006=>1000,34007=>1000,34008=>1000,34009=>1000,34010=>1000,34011=>1000,34012=>1000,34013=>1000,34014=>1000,34015=>1000,34016=>1000,34017=>1000,34018=>1000,34019=>1000,34020=>1000, - 34021=>1000,34022=>1000,34023=>1000,34024=>1000,34025=>1000,34026=>1000,34027=>1000,34028=>1000,34029=>1000,34030=>1000,34031=>1000,34032=>1000,34033=>1000,34034=>1000,34035=>1000,34036=>1000, - 34037=>1000,34038=>1000,34039=>1000,34040=>1000,34041=>1000,34042=>1000,34043=>1000,34044=>1000,34045=>1000,34046=>1000,34047=>1000,34048=>1000,34049=>1000,34050=>1000,34051=>1000,34052=>1000, - 34053=>1000,34054=>1000,34055=>1000,34056=>1000,34057=>1000,34058=>1000,34059=>1000,34060=>1000,34061=>1000,34062=>1000,34063=>1000,34064=>1000,34065=>1000,34066=>1000,34067=>1000,34068=>1000, - 34069=>1000,34070=>1000,34071=>1000,34072=>1000,34073=>1000,34074=>1000,34075=>1000,34076=>1000,34077=>1000,34078=>1000,34079=>1000,34080=>1000,34081=>1000,34082=>1000,34083=>1000,34084=>1000, - 34085=>1000,34086=>1000,34087=>1000,34088=>1000,34089=>1000,34090=>1000,34091=>1000,34092=>1000,34093=>1000,34094=>1000,34095=>1000,34096=>1000,34097=>1000,34098=>1000,34099=>1000,34100=>1000, - 34101=>1000,34102=>1000,34103=>1000,34104=>1000,34105=>1000,34106=>1000,34107=>1000,34108=>1000,34109=>1000,34110=>1000,34111=>1000,34112=>1000,34113=>1000,34114=>1000,34115=>1000,34116=>1000, - 34117=>1000,34118=>1000,34119=>1000,34120=>1000,34121=>1000,34122=>1000,34123=>1000,34124=>1000,34125=>1000,34126=>1000,34127=>1000,34128=>1000,34129=>1000,34130=>1000,34131=>1000,34132=>1000, - 34133=>1000,34134=>1000,34135=>1000,34136=>1000,34137=>1000,34138=>1000,34139=>1000,34140=>1000,34141=>1000,34142=>1000,34143=>1000,34144=>1000,34145=>1000,34146=>1000,34147=>1000,34148=>1000, - 34149=>1000,34150=>1000,34151=>1000,34152=>1000,34153=>1000,34154=>1000,34155=>1000,34156=>1000,34157=>1000,34158=>1000,34159=>1000,34160=>1000,34161=>1000,34162=>1000,34163=>1000,34164=>1000, - 34165=>1000,34166=>1000,34167=>1000,34168=>1000,34169=>1000,34170=>1000,34171=>1000,34172=>1000,34173=>1000,34174=>1000,34175=>1000,34176=>1000,34177=>1000,34178=>1000,34179=>1000,34180=>1000, - 34181=>1000,34182=>1000,34183=>1000,34184=>1000,34185=>1000,34186=>1000,34187=>1000,34188=>1000,34189=>1000,34190=>1000,34191=>1000,34192=>1000,34193=>1000,34194=>1000,34195=>1000,34196=>1000, - 34197=>1000,34198=>1000,34199=>1000,34200=>1000,34201=>1000,34202=>1000,34203=>1000,34204=>1000,34205=>1000,34206=>1000,34207=>1000,34208=>1000,34209=>1000,34210=>1000,34211=>1000,34212=>1000, - 34213=>1000,34214=>1000,34215=>1000,34216=>1000,34217=>1000,34218=>1000,34219=>1000,34220=>1000,34221=>1000,34222=>1000,34223=>1000,34224=>1000,34225=>1000,34226=>1000,34227=>1000,34228=>1000, - 34229=>1000,34230=>1000,34231=>1000,34232=>1000,34233=>1000,34234=>1000,34235=>1000,34236=>1000,34237=>1000,34238=>1000,34239=>1000,34240=>1000,34241=>1000,34242=>1000,34243=>1000,34244=>1000, - 34245=>1000,34246=>1000,34247=>1000,34248=>1000,34249=>1000,34250=>1000,34251=>1000,34252=>1000,34253=>1000,34254=>1000,34255=>1000,34256=>1000,34257=>1000,34258=>1000,34259=>1000,34260=>1000, - 34261=>1000,34262=>1000,34263=>1000,34264=>1000,34265=>1000,34266=>1000,34267=>1000,34268=>1000,34269=>1000,34270=>1000,34271=>1000,34272=>1000,34273=>1000,34274=>1000,34275=>1000,34276=>1000, - 34277=>1000,34278=>1000,34279=>1000,34280=>1000,34281=>1000,34282=>1000,34283=>1000,34284=>1000,34285=>1000,34286=>1000,34287=>1000,34288=>1000,34289=>1000,34290=>1000,34291=>1000,34292=>1000, - 34293=>1000,34294=>1000,34295=>1000,34296=>1000,34297=>1000,34298=>1000,34299=>1000,34300=>1000,34301=>1000,34302=>1000,34303=>1000,34304=>1000,34305=>1000,34306=>1000,34307=>1000,34308=>1000, - 34309=>1000,34310=>1000,34311=>1000,34312=>1000,34313=>1000,34314=>1000,34315=>1000,34316=>1000,34317=>1000,34318=>1000,34319=>1000,34320=>1000,34321=>1000,34322=>1000,34323=>1000,34324=>1000, - 34325=>1000,34326=>1000,34327=>1000,34328=>1000,34329=>1000,34330=>1000,34331=>1000,34332=>1000,34333=>1000,34334=>1000,34335=>1000,34336=>1000,34337=>1000,34338=>1000,34339=>1000,34340=>1000, - 34341=>1000,34342=>1000,34343=>1000,34344=>1000,34345=>1000,34346=>1000,34347=>1000,34348=>1000,34349=>1000,34350=>1000,34351=>1000,34352=>1000,34353=>1000,34354=>1000,34355=>1000,34356=>1000, - 34357=>1000,34358=>1000,34359=>1000,34360=>1000,34361=>1000,34362=>1000,34363=>1000,34364=>1000,34365=>1000,34366=>1000,34367=>1000,34368=>1000,34369=>1000,34370=>1000,34371=>1000,34372=>1000, - 34373=>1000,34374=>1000,34375=>1000,34376=>1000,34377=>1000,34378=>1000,34379=>1000,34380=>1000,34381=>1000,34382=>1000,34383=>1000,34384=>1000,34385=>1000,34386=>1000,34387=>1000,34388=>1000, - 34389=>1000,34390=>1000,34391=>1000,34392=>1000,34393=>1000,34394=>1000,34395=>1000,34396=>1000,34397=>1000,34398=>1000,34399=>1000,34400=>1000,34401=>1000,34402=>1000,34403=>1000,34404=>1000, - 34405=>1000,34406=>1000,34407=>1000,34408=>1000,34409=>1000,34410=>1000,34411=>1000,34412=>1000,34413=>1000,34414=>1000,34415=>1000,34416=>1000,34417=>1000,34418=>1000,34419=>1000,34420=>1000, - 34421=>1000,34422=>1000,34423=>1000,34424=>1000,34425=>1000,34426=>1000,34427=>1000,34428=>1000,34429=>1000,34430=>1000,34431=>1000,34432=>1000,34433=>1000,34434=>1000,34435=>1000,34436=>1000, - 34437=>1000,34438=>1000,34439=>1000,34440=>1000,34441=>1000,34442=>1000,34443=>1000,34444=>1000,34445=>1000,34446=>1000,34447=>1000,34448=>1000,34449=>1000,34450=>1000,34451=>1000,34452=>1000, - 34453=>1000,34454=>1000,34455=>1000,34456=>1000,34457=>1000,34458=>1000,34459=>1000,34460=>1000,34461=>1000,34462=>1000,34463=>1000,34464=>1000,34465=>1000,34466=>1000,34467=>1000,34468=>1000, - 34469=>1000,34470=>1000,34471=>1000,34472=>1000,34473=>1000,34474=>1000,34475=>1000,34476=>1000,34477=>1000,34478=>1000,34479=>1000,34480=>1000,34481=>1000,34482=>1000,34483=>1000,34484=>1000, - 34485=>1000,34486=>1000,34487=>1000,34488=>1000,34489=>1000,34490=>1000,34491=>1000,34492=>1000,34493=>1000,34494=>1000,34495=>1000,34496=>1000,34497=>1000,34498=>1000,34499=>1000,34500=>1000, - 34501=>1000,34502=>1000,34503=>1000,34504=>1000,34505=>1000,34506=>1000,34507=>1000,34508=>1000,34509=>1000,34510=>1000,34511=>1000,34512=>1000,34513=>1000,34514=>1000,34515=>1000,34516=>1000, - 34517=>1000,34518=>1000,34519=>1000,34520=>1000,34521=>1000,34522=>1000,34523=>1000,34524=>1000,34525=>1000,34526=>1000,34527=>1000,34528=>1000,34529=>1000,34530=>1000,34531=>1000,34532=>1000, - 34533=>1000,34534=>1000,34535=>1000,34536=>1000,34537=>1000,34538=>1000,34539=>1000,34540=>1000,34541=>1000,34542=>1000,34543=>1000,34544=>1000,34545=>1000,34546=>1000,34547=>1000,34548=>1000, - 34549=>1000,34550=>1000,34551=>1000,34552=>1000,34553=>1000,34554=>1000,34555=>1000,34556=>1000,34557=>1000,34558=>1000,34559=>1000,34560=>1000,34561=>1000,34562=>1000,34563=>1000,34564=>1000, - 34565=>1000,34566=>1000,34567=>1000,34568=>1000,34569=>1000,34570=>1000,34571=>1000,34572=>1000,34573=>1000,34574=>1000,34575=>1000,34576=>1000,34577=>1000,34578=>1000,34579=>1000,34580=>1000, - 34581=>1000,34582=>1000,34583=>1000,34584=>1000,34585=>1000,34586=>1000,34587=>1000,34588=>1000,34589=>1000,34590=>1000,34591=>1000,34592=>1000,34593=>1000,34594=>1000,34595=>1000,34596=>1000, - 34597=>1000,34598=>1000,34599=>1000,34600=>1000,34601=>1000,34602=>1000,34603=>1000,34604=>1000,34605=>1000,34606=>1000,34607=>1000,34608=>1000,34609=>1000,34610=>1000,34611=>1000,34612=>1000, - 34613=>1000,34614=>1000,34615=>1000,34616=>1000,34617=>1000,34618=>1000,34619=>1000,34620=>1000,34621=>1000,34622=>1000,34623=>1000,34624=>1000,34625=>1000,34626=>1000,34627=>1000,34628=>1000, - 34629=>1000,34630=>1000,34631=>1000,34632=>1000,34633=>1000,34634=>1000,34635=>1000,34636=>1000,34637=>1000,34638=>1000,34639=>1000,34640=>1000,34641=>1000,34642=>1000,34643=>1000,34644=>1000, - 34645=>1000,34646=>1000,34647=>1000,34648=>1000,34649=>1000,34650=>1000,34651=>1000,34652=>1000,34653=>1000,34654=>1000,34655=>1000,34656=>1000,34657=>1000,34658=>1000,34659=>1000,34660=>1000, - 34661=>1000,34662=>1000,34663=>1000,34664=>1000,34665=>1000,34666=>1000,34667=>1000,34668=>1000,34669=>1000,34670=>1000,34671=>1000,34672=>1000,34673=>1000,34674=>1000,34675=>1000,34676=>1000, - 34677=>1000,34678=>1000,34679=>1000,34680=>1000,34681=>1000,34682=>1000,34683=>1000,34684=>1000,34685=>1000,34686=>1000,34687=>1000,34688=>1000,34689=>1000,34690=>1000,34691=>1000,34692=>1000, - 34693=>1000,34694=>1000,34695=>1000,34696=>1000,34697=>1000,34698=>1000,34699=>1000,34700=>1000,34701=>1000,34702=>1000,34703=>1000,34704=>1000,34705=>1000,34706=>1000,34707=>1000,34708=>1000, - 34709=>1000,34710=>1000,34711=>1000,34712=>1000,34713=>1000,34714=>1000,34715=>1000,34716=>1000,34717=>1000,34718=>1000,34719=>1000,34720=>1000,34721=>1000,34722=>1000,34723=>1000,34724=>1000, - 34725=>1000,34726=>1000,34727=>1000,34728=>1000,34729=>1000,34730=>1000,34731=>1000,34732=>1000,34733=>1000,34734=>1000,34735=>1000,34736=>1000,34737=>1000,34738=>1000,34739=>1000,34740=>1000, - 34741=>1000,34742=>1000,34743=>1000,34744=>1000,34745=>1000,34746=>1000,34747=>1000,34748=>1000,34749=>1000,34750=>1000,34751=>1000,34752=>1000,34753=>1000,34754=>1000,34755=>1000,34756=>1000, - 34757=>1000,34758=>1000,34759=>1000,34760=>1000,34761=>1000,34762=>1000,34763=>1000,34764=>1000,34765=>1000,34766=>1000,34767=>1000,34768=>1000,34769=>1000,34770=>1000,34771=>1000,34772=>1000, - 34773=>1000,34774=>1000,34775=>1000,34776=>1000,34777=>1000,34778=>1000,34779=>1000,34780=>1000,34781=>1000,34782=>1000,34783=>1000,34784=>1000,34785=>1000,34786=>1000,34787=>1000,34788=>1000, - 34789=>1000,34790=>1000,34791=>1000,34792=>1000,34793=>1000,34794=>1000,34795=>1000,34796=>1000,34797=>1000,34798=>1000,34799=>1000,34800=>1000,34801=>1000,34802=>1000,34803=>1000,34804=>1000, - 34805=>1000,34806=>1000,34807=>1000,34808=>1000,34809=>1000,34810=>1000,34811=>1000,34812=>1000,34813=>1000,34814=>1000,34815=>1000,34816=>1000,34817=>1000,34818=>1000,34819=>1000,34820=>1000, - 34821=>1000,34822=>1000,34823=>1000,34824=>1000,34825=>1000,34826=>1000,34827=>1000,34828=>1000,34829=>1000,34830=>1000,34831=>1000,34832=>1000,34833=>1000,34834=>1000,34835=>1000,34836=>1000, - 34837=>1000,34838=>1000,34839=>1000,34840=>1000,34841=>1000,34842=>1000,34843=>1000,34844=>1000,34845=>1000,34846=>1000,34847=>1000,34848=>1000,34849=>1000,34850=>1000,34851=>1000,34852=>1000, - 34853=>1000,34854=>1000,34855=>1000,34856=>1000,34857=>1000,34858=>1000,34859=>1000,34860=>1000,34861=>1000,34862=>1000,34863=>1000,34864=>1000,34865=>1000,34866=>1000,34867=>1000,34868=>1000, - 34869=>1000,34870=>1000,34871=>1000,34872=>1000,34873=>1000,34874=>1000,34875=>1000,34876=>1000,34877=>1000,34878=>1000,34879=>1000,34880=>1000,34881=>1000,34882=>1000,34883=>1000,34884=>1000, - 34885=>1000,34886=>1000,34887=>1000,34888=>1000,34889=>1000,34890=>1000,34891=>1000,34892=>1000,34893=>1000,34894=>1000,34895=>1000,34896=>1000,34897=>1000,34898=>1000,34899=>1000,34900=>1000, - 34901=>1000,34902=>1000,34903=>1000,34904=>1000,34905=>1000,34906=>1000,34907=>1000,34908=>1000,34909=>1000,34910=>1000,34911=>1000,34912=>1000,34913=>1000,34914=>1000,34915=>1000,34916=>1000, - 34917=>1000,34918=>1000,34919=>1000,34920=>1000,34921=>1000,34922=>1000,34923=>1000,34924=>1000,34925=>1000,34926=>1000,34927=>1000,34928=>1000,34929=>1000,34930=>1000,34931=>1000,34932=>1000, - 34933=>1000,34934=>1000,34935=>1000,34936=>1000,34937=>1000,34938=>1000,34939=>1000,34940=>1000,34941=>1000,34942=>1000,34943=>1000,34944=>1000,34945=>1000,34946=>1000,34947=>1000,34948=>1000, - 34949=>1000,34950=>1000,34951=>1000,34952=>1000,34953=>1000,34954=>1000,34955=>1000,34956=>1000,34957=>1000,34958=>1000,34959=>1000,34960=>1000,34961=>1000,34962=>1000,34963=>1000,34964=>1000, - 34965=>1000,34966=>1000,34967=>1000,34968=>1000,34969=>1000,34970=>1000,34971=>1000,34972=>1000,34973=>1000,34974=>1000,34975=>1000,34976=>1000,34977=>1000,34978=>1000,34979=>1000,34980=>1000, - 34981=>1000,34982=>1000,34983=>1000,34984=>1000,34985=>1000,34986=>1000,34987=>1000,34988=>1000,34989=>1000,34990=>1000,34991=>1000,34992=>1000,34993=>1000,34994=>1000,34995=>1000,34996=>1000, - 34997=>1000,34998=>1000,34999=>1000,35000=>1000,35001=>1000,35002=>1000,35003=>1000,35004=>1000,35005=>1000,35006=>1000,35007=>1000,35008=>1000,35009=>1000,35010=>1000,35011=>1000,35012=>1000, - 35013=>1000,35014=>1000,35015=>1000,35016=>1000,35017=>1000,35018=>1000,35019=>1000,35020=>1000,35021=>1000,35022=>1000,35023=>1000,35024=>1000,35025=>1000,35026=>1000,35027=>1000,35028=>1000, - 35029=>1000,35030=>1000,35031=>1000,35032=>1000,35033=>1000,35034=>1000,35035=>1000,35036=>1000,35037=>1000,35038=>1000,35039=>1000,35040=>1000,35041=>1000,35042=>1000,35043=>1000,35044=>1000, - 35045=>1000,35046=>1000,35047=>1000,35048=>1000,35049=>1000,35050=>1000,35051=>1000,35052=>1000,35053=>1000,35054=>1000,35055=>1000,35056=>1000,35057=>1000,35058=>1000,35059=>1000,35060=>1000, - 35061=>1000,35062=>1000,35063=>1000,35064=>1000,35065=>1000,35066=>1000,35067=>1000,35068=>1000,35069=>1000,35070=>1000,35071=>1000,35072=>1000,35073=>1000,35074=>1000,35075=>1000,35076=>1000, - 35077=>1000,35078=>1000,35079=>1000,35080=>1000,35081=>1000,35082=>1000,35083=>1000,35084=>1000,35085=>1000,35086=>1000,35087=>1000,35088=>1000,35089=>1000,35090=>1000,35091=>1000,35092=>1000, - 35093=>1000,35094=>1000,35095=>1000,35096=>1000,35097=>1000,35098=>1000,35099=>1000,35100=>1000,35101=>1000,35102=>1000,35103=>1000,35104=>1000,35105=>1000,35106=>1000,35107=>1000,35108=>1000, - 35109=>1000,35110=>1000,35111=>1000,35112=>1000,35113=>1000,35114=>1000,35115=>1000,35116=>1000,35117=>1000,35118=>1000,35119=>1000,35120=>1000,35121=>1000,35122=>1000,35123=>1000,35124=>1000, - 35125=>1000,35126=>1000,35127=>1000,35128=>1000,35129=>1000,35130=>1000,35131=>1000,35132=>1000,35133=>1000,35134=>1000,35135=>1000,35136=>1000,35137=>1000,35138=>1000,35139=>1000,35140=>1000, - 35141=>1000,35142=>1000,35143=>1000,35144=>1000,35145=>1000,35146=>1000,35147=>1000,35148=>1000,35149=>1000,35150=>1000,35151=>1000,35152=>1000,35153=>1000,35154=>1000,35155=>1000,35156=>1000, - 35157=>1000,35158=>1000,35159=>1000,35160=>1000,35161=>1000,35162=>1000,35163=>1000,35164=>1000,35165=>1000,35166=>1000,35167=>1000,35168=>1000,35169=>1000,35170=>1000,35171=>1000,35172=>1000, - 35173=>1000,35174=>1000,35175=>1000,35176=>1000,35177=>1000,35178=>1000,35179=>1000,35180=>1000,35181=>1000,35182=>1000,35183=>1000,35184=>1000,35185=>1000,35186=>1000,35187=>1000,35188=>1000, - 35189=>1000,35190=>1000,35191=>1000,35192=>1000,35193=>1000,35194=>1000,35195=>1000,35196=>1000,35197=>1000,35198=>1000,35199=>1000,35200=>1000,35201=>1000,35202=>1000,35203=>1000,35204=>1000, - 35205=>1000,35206=>1000,35207=>1000,35208=>1000,35209=>1000,35210=>1000,35211=>1000,35212=>1000,35213=>1000,35214=>1000,35215=>1000,35216=>1000,35217=>1000,35218=>1000,35219=>1000,35220=>1000, - 35221=>1000,35222=>1000,35223=>1000,35224=>1000,35225=>1000,35226=>1000,35227=>1000,35228=>1000,35229=>1000,35230=>1000,35231=>1000,35232=>1000,35233=>1000,35234=>1000,35235=>1000,35236=>1000, - 35237=>1000,35238=>1000,35239=>1000,35240=>1000,35241=>1000,35242=>1000,35243=>1000,35244=>1000,35245=>1000,35246=>1000,35247=>1000,35248=>1000,35249=>1000,35250=>1000,35251=>1000,35252=>1000, - 35253=>1000,35254=>1000,35255=>1000,35256=>1000,35257=>1000,35258=>1000,35259=>1000,35260=>1000,35261=>1000,35262=>1000,35263=>1000,35264=>1000,35265=>1000,35266=>1000,35267=>1000,35268=>1000, - 35269=>1000,35270=>1000,35271=>1000,35272=>1000,35273=>1000,35274=>1000,35275=>1000,35276=>1000,35277=>1000,35278=>1000,35279=>1000,35280=>1000,35281=>1000,35282=>1000,35283=>1000,35284=>1000, - 35285=>1000,35286=>1000,35287=>1000,35288=>1000,35289=>1000,35290=>1000,35291=>1000,35292=>1000,35293=>1000,35294=>1000,35295=>1000,35296=>1000,35297=>1000,35298=>1000,35299=>1000,35300=>1000, - 35301=>1000,35302=>1000,35303=>1000,35304=>1000,35305=>1000,35306=>1000,35307=>1000,35308=>1000,35309=>1000,35310=>1000,35311=>1000,35312=>1000,35313=>1000,35314=>1000,35315=>1000,35316=>1000, - 35317=>1000,35318=>1000,35319=>1000,35320=>1000,35321=>1000,35322=>1000,35323=>1000,35324=>1000,35325=>1000,35326=>1000,35327=>1000,35328=>1000,35329=>1000,35330=>1000,35331=>1000,35332=>1000, - 35333=>1000,35334=>1000,35335=>1000,35336=>1000,35337=>1000,35338=>1000,35339=>1000,35340=>1000,35341=>1000,35342=>1000,35343=>1000,35344=>1000,35345=>1000,35346=>1000,35347=>1000,35348=>1000, - 35349=>1000,35350=>1000,35351=>1000,35352=>1000,35353=>1000,35354=>1000,35355=>1000,35356=>1000,35357=>1000,35358=>1000,35359=>1000,35360=>1000,35361=>1000,35362=>1000,35363=>1000,35364=>1000, - 35365=>1000,35366=>1000,35367=>1000,35368=>1000,35369=>1000,35370=>1000,35371=>1000,35372=>1000,35373=>1000,35374=>1000,35375=>1000,35376=>1000,35377=>1000,35378=>1000,35379=>1000,35380=>1000, - 35381=>1000,35382=>1000,35383=>1000,35384=>1000,35385=>1000,35386=>1000,35387=>1000,35388=>1000,35389=>1000,35390=>1000,35391=>1000,35392=>1000,35393=>1000,35394=>1000,35395=>1000,35396=>1000, - 35397=>1000,35398=>1000,35399=>1000,35400=>1000,35401=>1000,35402=>1000,35403=>1000,35404=>1000,35405=>1000,35406=>1000,35407=>1000,35408=>1000,35409=>1000,35410=>1000,35411=>1000,35412=>1000, - 35413=>1000,35414=>1000,35415=>1000,35416=>1000,35417=>1000,35418=>1000,35419=>1000,35420=>1000,35421=>1000,35422=>1000,35423=>1000,35424=>1000,35425=>1000,35426=>1000,35427=>1000,35428=>1000, - 35429=>1000,35430=>1000,35431=>1000,35432=>1000,35433=>1000,35434=>1000,35435=>1000,35436=>1000,35437=>1000,35438=>1000,35439=>1000,35440=>1000,35441=>1000,35442=>1000,35443=>1000,35444=>1000, - 35445=>1000,35446=>1000,35447=>1000,35448=>1000,35449=>1000,35450=>1000,35451=>1000,35452=>1000,35453=>1000,35454=>1000,35455=>1000,35456=>1000,35457=>1000,35458=>1000,35459=>1000,35460=>1000, - 35461=>1000,35462=>1000,35463=>1000,35464=>1000,35465=>1000,35466=>1000,35467=>1000,35468=>1000,35469=>1000,35470=>1000,35471=>1000,35472=>1000,35473=>1000,35474=>1000,35475=>1000,35476=>1000, - 35477=>1000,35478=>1000,35479=>1000,35480=>1000,35481=>1000,35482=>1000,35483=>1000,35484=>1000,35485=>1000,35486=>1000,35487=>1000,35488=>1000,35489=>1000,35490=>1000,35491=>1000,35492=>1000, - 35493=>1000,35494=>1000,35495=>1000,35496=>1000,35497=>1000,35498=>1000,35499=>1000,35500=>1000,35501=>1000,35502=>1000,35503=>1000,35504=>1000,35505=>1000,35506=>1000,35507=>1000,35508=>1000, - 35509=>1000,35510=>1000,35511=>1000,35512=>1000,35513=>1000,35514=>1000,35515=>1000,35516=>1000,35517=>1000,35518=>1000,35519=>1000,35520=>1000,35521=>1000,35522=>1000,35523=>1000,35524=>1000, - 35525=>1000,35526=>1000,35527=>1000,35528=>1000,35529=>1000,35530=>1000,35531=>1000,35532=>1000,35533=>1000,35534=>1000,35535=>1000,35536=>1000,35537=>1000,35538=>1000,35539=>1000,35540=>1000, - 35541=>1000,35542=>1000,35543=>1000,35544=>1000,35545=>1000,35546=>1000,35547=>1000,35548=>1000,35549=>1000,35550=>1000,35551=>1000,35552=>1000,35553=>1000,35554=>1000,35555=>1000,35556=>1000, - 35557=>1000,35558=>1000,35559=>1000,35560=>1000,35561=>1000,35562=>1000,35563=>1000,35564=>1000,35565=>1000,35566=>1000,35567=>1000,35568=>1000,35569=>1000,35570=>1000,35571=>1000,35572=>1000, - 35573=>1000,35574=>1000,35575=>1000,35576=>1000,35577=>1000,35578=>1000,35579=>1000,35580=>1000,35581=>1000,35582=>1000,35583=>1000,35584=>1000,35585=>1000,35586=>1000,35587=>1000,35588=>1000, - 35589=>1000,35590=>1000,35591=>1000,35592=>1000,35593=>1000,35594=>1000,35595=>1000,35596=>1000,35597=>1000,35598=>1000,35599=>1000,35600=>1000,35601=>1000,35602=>1000,35603=>1000,35604=>1000, - 35605=>1000,35606=>1000,35607=>1000,35608=>1000,35609=>1000,35610=>1000,35611=>1000,35612=>1000,35613=>1000,35614=>1000,35615=>1000,35616=>1000,35617=>1000,35618=>1000,35619=>1000,35620=>1000, - 35621=>1000,35622=>1000,35623=>1000,35624=>1000,35625=>1000,35626=>1000,35627=>1000,35628=>1000,35629=>1000,35630=>1000,35631=>1000,35632=>1000,35633=>1000,35634=>1000,35635=>1000,35636=>1000, - 35637=>1000,35638=>1000,35639=>1000,35640=>1000,35641=>1000,35642=>1000,35643=>1000,35644=>1000,35645=>1000,35646=>1000,35647=>1000,35648=>1000,35649=>1000,35650=>1000,35651=>1000,35652=>1000, - 35653=>1000,35654=>1000,35655=>1000,35656=>1000,35657=>1000,35658=>1000,35659=>1000,35660=>1000,35661=>1000,35662=>1000,35663=>1000,35664=>1000,35665=>1000,35666=>1000,35667=>1000,35668=>1000, - 35669=>1000,35670=>1000,35671=>1000,35672=>1000,35673=>1000,35674=>1000,35675=>1000,35676=>1000,35677=>1000,35678=>1000,35679=>1000,35680=>1000,35681=>1000,35682=>1000,35683=>1000,35684=>1000, - 35685=>1000,35686=>1000,35687=>1000,35688=>1000,35689=>1000,35690=>1000,35691=>1000,35692=>1000,35693=>1000,35694=>1000,35695=>1000,35696=>1000,35697=>1000,35698=>1000,35699=>1000,35700=>1000, - 35701=>1000,35702=>1000,35703=>1000,35704=>1000,35705=>1000,35706=>1000,35707=>1000,35708=>1000,35709=>1000,35710=>1000,35711=>1000,35712=>1000,35713=>1000,35714=>1000,35715=>1000,35716=>1000, - 35717=>1000,35718=>1000,35719=>1000,35720=>1000,35721=>1000,35722=>1000,35723=>1000,35724=>1000,35725=>1000,35726=>1000,35727=>1000,35728=>1000,35729=>1000,35730=>1000,35731=>1000,35732=>1000, - 35733=>1000,35734=>1000,35735=>1000,35736=>1000,35737=>1000,35738=>1000,35739=>1000,35740=>1000,35741=>1000,35742=>1000,35743=>1000,35744=>1000,35745=>1000,35746=>1000,35747=>1000,35748=>1000, - 35749=>1000,35750=>1000,35751=>1000,35752=>1000,35753=>1000,35754=>1000,35755=>1000,35756=>1000,35757=>1000,35758=>1000,35759=>1000,35760=>1000,35761=>1000,35762=>1000,35763=>1000,35764=>1000, - 35765=>1000,35766=>1000,35767=>1000,35768=>1000,35769=>1000,35770=>1000,35771=>1000,35772=>1000,35773=>1000,35774=>1000,35775=>1000,35776=>1000,35777=>1000,35778=>1000,35779=>1000,35780=>1000, - 35781=>1000,35782=>1000,35783=>1000,35784=>1000,35785=>1000,35786=>1000,35787=>1000,35788=>1000,35789=>1000,35790=>1000,35791=>1000,35792=>1000,35793=>1000,35794=>1000,35795=>1000,35796=>1000, - 35797=>1000,35798=>1000,35799=>1000,35800=>1000,35801=>1000,35802=>1000,35803=>1000,35804=>1000,35805=>1000,35806=>1000,35807=>1000,35808=>1000,35809=>1000,35810=>1000,35811=>1000,35812=>1000, - 35813=>1000,35814=>1000,35815=>1000,35816=>1000,35817=>1000,35818=>1000,35819=>1000,35820=>1000,35821=>1000,35822=>1000,35823=>1000,35824=>1000,35825=>1000,35826=>1000,35827=>1000,35828=>1000, - 35829=>1000,35830=>1000,35831=>1000,35832=>1000,35833=>1000,35834=>1000,35835=>1000,35836=>1000,35837=>1000,35838=>1000,35839=>1000,35840=>1000,35841=>1000,35842=>1000,35843=>1000,35844=>1000, - 35845=>1000,35846=>1000,35847=>1000,35848=>1000,35849=>1000,35850=>1000,35851=>1000,35852=>1000,35853=>1000,35854=>1000,35855=>1000,35856=>1000,35857=>1000,35858=>1000,35859=>1000,35860=>1000, - 35861=>1000,35862=>1000,35863=>1000,35864=>1000,35865=>1000,35866=>1000,35867=>1000,35868=>1000,35869=>1000,35870=>1000,35871=>1000,35872=>1000,35873=>1000,35874=>1000,35875=>1000,35876=>1000, - 35877=>1000,35878=>1000,35879=>1000,35880=>1000,35881=>1000,35882=>1000,35883=>1000,35884=>1000,35885=>1000,35886=>1000,35887=>1000,35888=>1000,35889=>1000,35890=>1000,35891=>1000,35892=>1000, - 35893=>1000,35894=>1000,35895=>1000,35896=>1000,35897=>1000,35898=>1000,35899=>1000,35900=>1000,35901=>1000,35902=>1000,35903=>1000,35904=>1000,35905=>1000,35906=>1000,35907=>1000,35908=>1000, - 35909=>1000,35910=>1000,35911=>1000,35912=>1000,35913=>1000,35914=>1000,35915=>1000,35916=>1000,35917=>1000,35918=>1000,35919=>1000,35920=>1000,35921=>1000,35922=>1000,35923=>1000,35924=>1000, - 35925=>1000,35926=>1000,35927=>1000,35928=>1000,35929=>1000,35930=>1000,35931=>1000,35932=>1000,35933=>1000,35934=>1000,35935=>1000,35936=>1000,35937=>1000,35938=>1000,35939=>1000,35940=>1000, - 35941=>1000,35942=>1000,35943=>1000,35944=>1000,35945=>1000,35946=>1000,35947=>1000,35948=>1000,35949=>1000,35950=>1000,35951=>1000,35952=>1000,35953=>1000,35954=>1000,35955=>1000,35956=>1000, - 35957=>1000,35958=>1000,35959=>1000,35960=>1000,35961=>1000,35962=>1000,35963=>1000,35964=>1000,35965=>1000,35966=>1000,35967=>1000,35968=>1000,35969=>1000,35970=>1000,35971=>1000,35972=>1000, - 35973=>1000,35974=>1000,35975=>1000,35976=>1000,35977=>1000,35978=>1000,35979=>1000,35980=>1000,35981=>1000,35982=>1000,35983=>1000,35984=>1000,35985=>1000,35986=>1000,35987=>1000,35988=>1000, - 35989=>1000,35990=>1000,35991=>1000,35992=>1000,35993=>1000,35994=>1000,35995=>1000,35996=>1000,35997=>1000,35998=>1000,35999=>1000,36000=>1000,36001=>1000,36002=>1000,36003=>1000,36004=>1000, - 36005=>1000,36006=>1000,36007=>1000,36008=>1000,36009=>1000,36010=>1000,36011=>1000,36012=>1000,36013=>1000,36014=>1000,36015=>1000,36016=>1000,36017=>1000,36018=>1000,36019=>1000,36020=>1000, - 36021=>1000,36022=>1000,36023=>1000,36024=>1000,36025=>1000,36026=>1000,36027=>1000,36028=>1000,36029=>1000,36030=>1000,36031=>1000,36032=>1000,36033=>1000,36034=>1000,36035=>1000,36036=>1000, - 36037=>1000,36038=>1000,36039=>1000,36040=>1000,36041=>1000,36042=>1000,36043=>1000,36044=>1000,36045=>1000,36046=>1000,36047=>1000,36048=>1000,36049=>1000,36050=>1000,36051=>1000,36052=>1000, - 36053=>1000,36054=>1000,36055=>1000,36056=>1000,36057=>1000,36058=>1000,36059=>1000,36060=>1000,36061=>1000,36062=>1000,36063=>1000,36064=>1000,36065=>1000,36066=>1000,36067=>1000,36068=>1000, - 36069=>1000,36070=>1000,36071=>1000,36072=>1000,36073=>1000,36074=>1000,36075=>1000,36076=>1000,36077=>1000,36078=>1000,36079=>1000,36080=>1000,36081=>1000,36082=>1000,36083=>1000,36084=>1000, - 36085=>1000,36086=>1000,36087=>1000,36088=>1000,36089=>1000,36090=>1000,36091=>1000,36092=>1000,36093=>1000,36094=>1000,36095=>1000,36096=>1000,36097=>1000,36098=>1000,36099=>1000,36100=>1000, - 36101=>1000,36102=>1000,36103=>1000,36104=>1000,36105=>1000,36106=>1000,36107=>1000,36108=>1000,36109=>1000,36110=>1000,36111=>1000,36112=>1000,36113=>1000,36114=>1000,36115=>1000,36116=>1000, - 36117=>1000,36118=>1000,36119=>1000,36120=>1000,36121=>1000,36122=>1000,36123=>1000,36124=>1000,36125=>1000,36126=>1000,36127=>1000,36128=>1000,36129=>1000,36130=>1000,36131=>1000,36132=>1000, - 36133=>1000,36134=>1000,36135=>1000,36136=>1000,36137=>1000,36138=>1000,36139=>1000,36140=>1000,36141=>1000,36142=>1000,36143=>1000,36144=>1000,36145=>1000,36146=>1000,36147=>1000,36148=>1000, - 36149=>1000,36150=>1000,36151=>1000,36152=>1000,36153=>1000,36154=>1000,36155=>1000,36156=>1000,36157=>1000,36158=>1000,36159=>1000,36160=>1000,36161=>1000,36162=>1000,36163=>1000,36164=>1000, - 36165=>1000,36166=>1000,36167=>1000,36168=>1000,36169=>1000,36170=>1000,36171=>1000,36172=>1000,36173=>1000,36174=>1000,36175=>1000,36176=>1000,36177=>1000,36178=>1000,36179=>1000,36180=>1000, - 36181=>1000,36182=>1000,36183=>1000,36184=>1000,36185=>1000,36186=>1000,36187=>1000,36188=>1000,36189=>1000,36190=>1000,36191=>1000,36192=>1000,36193=>1000,36194=>1000,36195=>1000,36196=>1000, - 36197=>1000,36198=>1000,36199=>1000,36200=>1000,36201=>1000,36202=>1000,36203=>1000,36204=>1000,36205=>1000,36206=>1000,36207=>1000,36208=>1000,36209=>1000,36210=>1000,36211=>1000,36212=>1000, - 36213=>1000,36214=>1000,36215=>1000,36216=>1000,36217=>1000,36218=>1000,36219=>1000,36220=>1000,36221=>1000,36222=>1000,36223=>1000,36224=>1000,36225=>1000,36226=>1000,36227=>1000,36228=>1000, - 36229=>1000,36230=>1000,36231=>1000,36232=>1000,36233=>1000,36234=>1000,36235=>1000,36236=>1000,36237=>1000,36238=>1000,36239=>1000,36240=>1000,36241=>1000,36242=>1000,36243=>1000,36244=>1000, - 36245=>1000,36246=>1000,36247=>1000,36248=>1000,36249=>1000,36250=>1000,36251=>1000,36252=>1000,36253=>1000,36254=>1000,36255=>1000,36256=>1000,36257=>1000,36258=>1000,36259=>1000,36260=>1000, - 36261=>1000,36262=>1000,36263=>1000,36264=>1000,36265=>1000,36266=>1000,36267=>1000,36268=>1000,36269=>1000,36270=>1000,36271=>1000,36272=>1000,36273=>1000,36274=>1000,36275=>1000,36276=>1000, - 36277=>1000,36278=>1000,36279=>1000,36280=>1000,36281=>1000,36282=>1000,36283=>1000,36284=>1000,36285=>1000,36286=>1000,36287=>1000,36288=>1000,36289=>1000,36290=>1000,36291=>1000,36292=>1000, - 36293=>1000,36294=>1000,36295=>1000,36296=>1000,36297=>1000,36298=>1000,36299=>1000,36300=>1000,36301=>1000,36302=>1000,36303=>1000,36304=>1000,36305=>1000,36306=>1000,36307=>1000,36308=>1000, - 36309=>1000,36310=>1000,36311=>1000,36312=>1000,36313=>1000,36314=>1000,36315=>1000,36316=>1000,36317=>1000,36318=>1000,36319=>1000,36320=>1000,36321=>1000,36322=>1000,36323=>1000,36324=>1000, - 36325=>1000,36326=>1000,36327=>1000,36328=>1000,36329=>1000,36330=>1000,36331=>1000,36332=>1000,36333=>1000,36334=>1000,36335=>1000,36336=>1000,36337=>1000,36338=>1000,36339=>1000,36340=>1000, - 36341=>1000,36342=>1000,36343=>1000,36344=>1000,36345=>1000,36346=>1000,36347=>1000,36348=>1000,36349=>1000,36350=>1000,36351=>1000,36352=>1000,36353=>1000,36354=>1000,36355=>1000,36356=>1000, - 36357=>1000,36358=>1000,36359=>1000,36360=>1000,36361=>1000,36362=>1000,36363=>1000,36364=>1000,36365=>1000,36366=>1000,36367=>1000,36368=>1000,36369=>1000,36370=>1000,36371=>1000,36372=>1000, - 36373=>1000,36374=>1000,36375=>1000,36376=>1000,36377=>1000,36378=>1000,36379=>1000,36380=>1000,36381=>1000,36382=>1000,36383=>1000,36384=>1000,36385=>1000,36386=>1000,36387=>1000,36388=>1000, - 36389=>1000,36390=>1000,36391=>1000,36392=>1000,36393=>1000,36394=>1000,36395=>1000,36396=>1000,36397=>1000,36398=>1000,36399=>1000,36400=>1000,36401=>1000,36402=>1000,36403=>1000,36404=>1000, - 36405=>1000,36406=>1000,36407=>1000,36408=>1000,36409=>1000,36410=>1000,36411=>1000,36412=>1000,36413=>1000,36414=>1000,36415=>1000,36416=>1000,36417=>1000,36418=>1000,36419=>1000,36420=>1000, - 36421=>1000,36422=>1000,36423=>1000,36424=>1000,36425=>1000,36426=>1000,36427=>1000,36428=>1000,36429=>1000,36430=>1000,36431=>1000,36432=>1000,36433=>1000,36434=>1000,36435=>1000,36436=>1000, - 36437=>1000,36438=>1000,36439=>1000,36440=>1000,36441=>1000,36442=>1000,36443=>1000,36444=>1000,36445=>1000,36446=>1000,36447=>1000,36448=>1000,36449=>1000,36450=>1000,36451=>1000,36452=>1000, - 36453=>1000,36454=>1000,36455=>1000,36456=>1000,36457=>1000,36458=>1000,36459=>1000,36460=>1000,36461=>1000,36462=>1000,36463=>1000,36464=>1000,36465=>1000,36466=>1000,36467=>1000,36468=>1000, - 36469=>1000,36470=>1000,36471=>1000,36472=>1000,36473=>1000,36474=>1000,36475=>1000,36476=>1000,36477=>1000,36478=>1000,36479=>1000,36480=>1000,36481=>1000,36482=>1000,36483=>1000,36484=>1000, - 36485=>1000,36486=>1000,36487=>1000,36488=>1000,36489=>1000,36490=>1000,36491=>1000,36492=>1000,36493=>1000,36494=>1000,36495=>1000,36496=>1000,36497=>1000,36498=>1000,36499=>1000,36500=>1000, - 36501=>1000,36502=>1000,36503=>1000,36504=>1000,36505=>1000,36506=>1000,36507=>1000,36508=>1000,36509=>1000,36510=>1000,36511=>1000,36512=>1000,36513=>1000,36514=>1000,36515=>1000,36516=>1000, - 36517=>1000,36518=>1000,36519=>1000,36520=>1000,36521=>1000,36522=>1000,36523=>1000,36524=>1000,36525=>1000,36526=>1000,36527=>1000,36528=>1000,36529=>1000,36530=>1000,36531=>1000,36532=>1000, - 36533=>1000,36534=>1000,36535=>1000,36536=>1000,36537=>1000,36538=>1000,36539=>1000,36540=>1000,36541=>1000,36542=>1000,36543=>1000,36544=>1000,36545=>1000,36546=>1000,36547=>1000,36548=>1000, - 36549=>1000,36550=>1000,36551=>1000,36552=>1000,36553=>1000,36554=>1000,36555=>1000,36556=>1000,36557=>1000,36558=>1000,36559=>1000,36560=>1000,36561=>1000,36562=>1000,36563=>1000,36564=>1000, - 36565=>1000,36566=>1000,36567=>1000,36568=>1000,36569=>1000,36570=>1000,36571=>1000,36572=>1000,36573=>1000,36574=>1000,36575=>1000,36576=>1000,36577=>1000,36578=>1000,36579=>1000,36580=>1000, - 36581=>1000,36582=>1000,36583=>1000,36584=>1000,36585=>1000,36586=>1000,36587=>1000,36588=>1000,36589=>1000,36590=>1000,36591=>1000,36592=>1000,36593=>1000,36594=>1000,36595=>1000,36596=>1000, - 36597=>1000,36598=>1000,36599=>1000,36600=>1000,36601=>1000,36602=>1000,36603=>1000,36604=>1000,36605=>1000,36606=>1000,36607=>1000,36608=>1000,36609=>1000,36610=>1000,36611=>1000,36612=>1000, - 36613=>1000,36614=>1000,36615=>1000,36616=>1000,36617=>1000,36618=>1000,36619=>1000,36620=>1000,36621=>1000,36622=>1000,36623=>1000,36624=>1000,36625=>1000,36626=>1000,36627=>1000,36628=>1000, - 36629=>1000,36630=>1000,36631=>1000,36632=>1000,36633=>1000,36634=>1000,36635=>1000,36636=>1000,36637=>1000,36638=>1000,36639=>1000,36640=>1000,36641=>1000,36642=>1000,36643=>1000,36644=>1000, - 36645=>1000,36646=>1000,36647=>1000,36648=>1000,36649=>1000,36650=>1000,36651=>1000,36652=>1000,36653=>1000,36654=>1000,36655=>1000,36656=>1000,36657=>1000,36658=>1000,36659=>1000,36660=>1000, - 36661=>1000,36662=>1000,36663=>1000,36664=>1000,36665=>1000,36666=>1000,36667=>1000,36668=>1000,36669=>1000,36670=>1000,36671=>1000,36672=>1000,36673=>1000,36674=>1000,36675=>1000,36676=>1000, - 36677=>1000,36678=>1000,36679=>1000,36680=>1000,36681=>1000,36682=>1000,36683=>1000,36684=>1000,36685=>1000,36686=>1000,36687=>1000,36688=>1000,36689=>1000,36690=>1000,36691=>1000,36692=>1000, - 36693=>1000,36694=>1000,36695=>1000,36696=>1000,36697=>1000,36698=>1000,36699=>1000,36700=>1000,36701=>1000,36702=>1000,36703=>1000,36704=>1000,36705=>1000,36706=>1000,36707=>1000,36708=>1000, - 36709=>1000,36710=>1000,36711=>1000,36712=>1000,36713=>1000,36714=>1000,36715=>1000,36716=>1000,36717=>1000,36718=>1000,36719=>1000,36720=>1000,36721=>1000,36722=>1000,36723=>1000,36724=>1000, - 36725=>1000,36726=>1000,36727=>1000,36728=>1000,36729=>1000,36730=>1000,36731=>1000,36732=>1000,36733=>1000,36734=>1000,36735=>1000,36736=>1000,36737=>1000,36738=>1000,36739=>1000,36740=>1000, - 36741=>1000,36742=>1000,36743=>1000,36744=>1000,36745=>1000,36746=>1000,36747=>1000,36748=>1000,36749=>1000,36750=>1000,36751=>1000,36752=>1000,36753=>1000,36754=>1000,36755=>1000,36756=>1000, - 36757=>1000,36758=>1000,36759=>1000,36760=>1000,36761=>1000,36762=>1000,36763=>1000,36764=>1000,36765=>1000,36766=>1000,36767=>1000,36768=>1000,36769=>1000,36770=>1000,36771=>1000,36772=>1000, - 36773=>1000,36774=>1000,36775=>1000,36776=>1000,36777=>1000,36778=>1000,36779=>1000,36780=>1000,36781=>1000,36782=>1000,36783=>1000,36784=>1000,36785=>1000,36786=>1000,36787=>1000,36788=>1000, - 36789=>1000,36790=>1000,36791=>1000,36792=>1000,36793=>1000,36794=>1000,36795=>1000,36796=>1000,36797=>1000,36798=>1000,36799=>1000,36800=>1000,36801=>1000,36802=>1000,36803=>1000,36804=>1000, - 36805=>1000,36806=>1000,36807=>1000,36808=>1000,36809=>1000,36810=>1000,36811=>1000,36812=>1000,36813=>1000,36814=>1000,36815=>1000,36816=>1000,36817=>1000,36818=>1000,36819=>1000,36820=>1000, - 36821=>1000,36822=>1000,36823=>1000,36824=>1000,36825=>1000,36826=>1000,36827=>1000,36828=>1000,36829=>1000,36830=>1000,36831=>1000,36832=>1000,36833=>1000,36834=>1000,36835=>1000,36836=>1000, - 36837=>1000,36838=>1000,36839=>1000,36840=>1000,36841=>1000,36842=>1000,36843=>1000,36844=>1000,36845=>1000,36846=>1000,36847=>1000,36848=>1000,36849=>1000,36850=>1000,36851=>1000,36852=>1000, - 36853=>1000,36854=>1000,36855=>1000,36856=>1000,36857=>1000,36858=>1000,36859=>1000,36860=>1000,36861=>1000,36862=>1000,36863=>1000,36864=>1000,36865=>1000,36866=>1000,36867=>1000,36868=>1000, - 36869=>1000,36870=>1000,36871=>1000,36872=>1000,36873=>1000,36874=>1000,36875=>1000,36876=>1000,36877=>1000,36878=>1000,36879=>1000,36880=>1000,36881=>1000,36882=>1000,36883=>1000,36884=>1000, - 36885=>1000,36886=>1000,36887=>1000,36888=>1000,36889=>1000,36890=>1000,36891=>1000,36892=>1000,36893=>1000,36894=>1000,36895=>1000,36896=>1000,36897=>1000,36898=>1000,36899=>1000,36900=>1000, - 36901=>1000,36902=>1000,36903=>1000,36904=>1000,36905=>1000,36906=>1000,36907=>1000,36908=>1000,36909=>1000,36910=>1000,36911=>1000,36912=>1000,36913=>1000,36914=>1000,36915=>1000,36916=>1000, - 36917=>1000,36918=>1000,36919=>1000,36920=>1000,36921=>1000,36922=>1000,36923=>1000,36924=>1000,36925=>1000,36926=>1000,36927=>1000,36928=>1000,36929=>1000,36930=>1000,36931=>1000,36932=>1000, - 36933=>1000,36934=>1000,36935=>1000,36936=>1000,36937=>1000,36938=>1000,36939=>1000,36940=>1000,36941=>1000,36942=>1000,36943=>1000,36944=>1000,36945=>1000,36946=>1000,36947=>1000,36948=>1000, - 36949=>1000,36950=>1000,36951=>1000,36952=>1000,36953=>1000,36954=>1000,36955=>1000,36956=>1000,36957=>1000,36958=>1000,36959=>1000,36960=>1000,36961=>1000,36962=>1000,36963=>1000,36964=>1000, - 36965=>1000,36966=>1000,36967=>1000,36968=>1000,36969=>1000,36970=>1000,36971=>1000,36972=>1000,36973=>1000,36974=>1000,36975=>1000,36976=>1000,36977=>1000,36978=>1000,36979=>1000,36980=>1000, - 36981=>1000,36982=>1000,36983=>1000,36984=>1000,36985=>1000,36986=>1000,36987=>1000,36988=>1000,36989=>1000,36990=>1000,36991=>1000,36992=>1000,36993=>1000,36994=>1000,36995=>1000,36996=>1000, - 36997=>1000,36998=>1000,36999=>1000,37000=>1000,37001=>1000,37002=>1000,37003=>1000,37004=>1000,37005=>1000,37006=>1000,37007=>1000,37008=>1000,37009=>1000,37010=>1000,37011=>1000,37012=>1000, - 37013=>1000,37014=>1000,37015=>1000,37016=>1000,37017=>1000,37018=>1000,37019=>1000,37020=>1000,37021=>1000,37022=>1000,37023=>1000,37024=>1000,37025=>1000,37026=>1000,37027=>1000,37028=>1000, - 37029=>1000,37030=>1000,37031=>1000,37032=>1000,37033=>1000,37034=>1000,37035=>1000,37036=>1000,37037=>1000,37038=>1000,37039=>1000,37040=>1000,37041=>1000,37042=>1000,37043=>1000,37044=>1000, - 37045=>1000,37046=>1000,37047=>1000,37048=>1000,37049=>1000,37050=>1000,37051=>1000,37052=>1000,37053=>1000,37054=>1000,37055=>1000,37056=>1000,37057=>1000,37058=>1000,37059=>1000,37060=>1000, - 37061=>1000,37062=>1000,37063=>1000,37064=>1000,37065=>1000,37066=>1000,37067=>1000,37068=>1000,37069=>1000,37070=>1000,37071=>1000,37072=>1000,37073=>1000,37074=>1000,37075=>1000,37076=>1000, - 37077=>1000,37078=>1000,37079=>1000,37080=>1000,37081=>1000,37082=>1000,37083=>1000,37084=>1000,37085=>1000,37086=>1000,37087=>1000,37088=>1000,37089=>1000,37090=>1000,37091=>1000,37092=>1000, - 37093=>1000,37094=>1000,37095=>1000,37096=>1000,37097=>1000,37098=>1000,37099=>1000,37100=>1000,37101=>1000,37102=>1000,37103=>1000,37104=>1000,37105=>1000,37106=>1000,37107=>1000,37108=>1000, - 37109=>1000,37110=>1000,37111=>1000,37112=>1000,37113=>1000,37114=>1000,37115=>1000,37116=>1000,37117=>1000,37118=>1000,37119=>1000,37120=>1000,37121=>1000,37122=>1000,37123=>1000,37124=>1000, - 37125=>1000,37126=>1000,37127=>1000,37128=>1000,37129=>1000,37130=>1000,37131=>1000,37132=>1000,37133=>1000,37134=>1000,37135=>1000,37136=>1000,37137=>1000,37138=>1000,37139=>1000,37140=>1000, - 37141=>1000,37142=>1000,37143=>1000,37144=>1000,37145=>1000,37146=>1000,37147=>1000,37148=>1000,37149=>1000,37150=>1000,37151=>1000,37152=>1000,37153=>1000,37154=>1000,37155=>1000,37156=>1000, - 37157=>1000,37158=>1000,37159=>1000,37160=>1000,37161=>1000,37162=>1000,37163=>1000,37164=>1000,37165=>1000,37166=>1000,37167=>1000,37168=>1000,37169=>1000,37170=>1000,37171=>1000,37172=>1000, - 37173=>1000,37174=>1000,37175=>1000,37176=>1000,37177=>1000,37178=>1000,37179=>1000,37180=>1000,37181=>1000,37182=>1000,37183=>1000,37184=>1000,37185=>1000,37186=>1000,37187=>1000,37188=>1000, - 37189=>1000,37190=>1000,37191=>1000,37192=>1000,37193=>1000,37194=>1000,37195=>1000,37196=>1000,37197=>1000,37198=>1000,37199=>1000,37200=>1000,37201=>1000,37202=>1000,37203=>1000,37204=>1000, - 37205=>1000,37206=>1000,37207=>1000,37208=>1000,37209=>1000,37210=>1000,37211=>1000,37212=>1000,37213=>1000,37214=>1000,37215=>1000,37216=>1000,37217=>1000,37218=>1000,37219=>1000,37220=>1000, - 37221=>1000,37222=>1000,37223=>1000,37224=>1000,37225=>1000,37226=>1000,37227=>1000,37228=>1000,37229=>1000,37230=>1000,37231=>1000,37232=>1000,37233=>1000,37234=>1000,37235=>1000,37236=>1000, - 37237=>1000,37238=>1000,37239=>1000,37240=>1000,37241=>1000,37242=>1000,37243=>1000,37244=>1000,37245=>1000,37246=>1000,37247=>1000,37248=>1000,37249=>1000,37250=>1000,37251=>1000,37252=>1000, - 37253=>1000,37254=>1000,37255=>1000,37256=>1000,37257=>1000,37258=>1000,37259=>1000,37260=>1000,37261=>1000,37262=>1000,37263=>1000,37264=>1000,37265=>1000,37266=>1000,37267=>1000,37268=>1000, - 37269=>1000,37270=>1000,37271=>1000,37272=>1000,37273=>1000,37274=>1000,37275=>1000,37276=>1000,37277=>1000,37278=>1000,37279=>1000,37280=>1000,37281=>1000,37282=>1000,37283=>1000,37284=>1000, - 37285=>1000,37286=>1000,37287=>1000,37288=>1000,37289=>1000,37290=>1000,37291=>1000,37292=>1000,37293=>1000,37294=>1000,37295=>1000,37296=>1000,37297=>1000,37298=>1000,37299=>1000,37300=>1000, - 37301=>1000,37302=>1000,37303=>1000,37304=>1000,37305=>1000,37306=>1000,37307=>1000,37308=>1000,37309=>1000,37310=>1000,37311=>1000,37312=>1000,37313=>1000,37314=>1000,37315=>1000,37316=>1000, - 37317=>1000,37318=>1000,37319=>1000,37320=>1000,37321=>1000,37322=>1000,37323=>1000,37324=>1000,37325=>1000,37326=>1000,37327=>1000,37328=>1000,37329=>1000,37330=>1000,37331=>1000,37332=>1000, - 37333=>1000,37334=>1000,37335=>1000,37336=>1000,37337=>1000,37338=>1000,37339=>1000,37340=>1000,37341=>1000,37342=>1000,37343=>1000,37344=>1000,37345=>1000,37346=>1000,37347=>1000,37348=>1000, - 37349=>1000,37350=>1000,37351=>1000,37352=>1000,37353=>1000,37354=>1000,37355=>1000,37356=>1000,37357=>1000,37358=>1000,37359=>1000,37360=>1000,37361=>1000,37362=>1000,37363=>1000,37364=>1000, - 37365=>1000,37366=>1000,37367=>1000,37368=>1000,37369=>1000,37370=>1000,37371=>1000,37372=>1000,37373=>1000,37374=>1000,37375=>1000,37376=>1000,37377=>1000,37378=>1000,37379=>1000,37380=>1000, - 37381=>1000,37382=>1000,37383=>1000,37384=>1000,37385=>1000,37386=>1000,37387=>1000,37388=>1000,37389=>1000,37390=>1000,37391=>1000,37392=>1000,37393=>1000,37394=>1000,37395=>1000,37396=>1000, - 37397=>1000,37398=>1000,37399=>1000,37400=>1000,37401=>1000,37402=>1000,37403=>1000,37404=>1000,37405=>1000,37406=>1000,37407=>1000,37408=>1000,37409=>1000,37410=>1000,37411=>1000,37412=>1000, - 37413=>1000,37414=>1000,37415=>1000,37416=>1000,37417=>1000,37418=>1000,37419=>1000,37420=>1000,37421=>1000,37422=>1000,37423=>1000,37424=>1000,37425=>1000,37426=>1000,37427=>1000,37428=>1000, - 37429=>1000,37430=>1000,37431=>1000,37432=>1000,37433=>1000,37434=>1000,37435=>1000,37436=>1000,37437=>1000,37438=>1000,37439=>1000,37440=>1000,37441=>1000,37442=>1000,37443=>1000,37444=>1000, - 37445=>1000,37446=>1000,37447=>1000,37448=>1000,37449=>1000,37450=>1000,37451=>1000,37452=>1000,37453=>1000,37454=>1000,37455=>1000,37456=>1000,37457=>1000,37458=>1000,37459=>1000,37460=>1000, - 37461=>1000,37462=>1000,37463=>1000,37464=>1000,37465=>1000,37466=>1000,37467=>1000,37468=>1000,37469=>1000,37470=>1000,37471=>1000,37472=>1000,37473=>1000,37474=>1000,37475=>1000,37476=>1000, - 37477=>1000,37478=>1000,37479=>1000,37480=>1000,37481=>1000,37482=>1000,37483=>1000,37484=>1000,37485=>1000,37486=>1000,37487=>1000,37488=>1000,37489=>1000,37490=>1000,37491=>1000,37492=>1000, - 37493=>1000,37494=>1000,37495=>1000,37496=>1000,37497=>1000,37498=>1000,37499=>1000,37500=>1000,37501=>1000,37502=>1000,37503=>1000,37504=>1000,37505=>1000,37506=>1000,37507=>1000,37508=>1000, - 37509=>1000,37510=>1000,37511=>1000,37512=>1000,37513=>1000,37514=>1000,37515=>1000,37516=>1000,37517=>1000,37518=>1000,37519=>1000,37520=>1000,37521=>1000,37522=>1000,37523=>1000,37524=>1000, - 37525=>1000,37526=>1000,37527=>1000,37528=>1000,37529=>1000,37530=>1000,37531=>1000,37532=>1000,37533=>1000,37534=>1000,37535=>1000,37536=>1000,37537=>1000,37538=>1000,37539=>1000,37540=>1000, - 37541=>1000,37542=>1000,37543=>1000,37544=>1000,37545=>1000,37546=>1000,37547=>1000,37548=>1000,37549=>1000,37550=>1000,37551=>1000,37552=>1000,37553=>1000,37554=>1000,37555=>1000,37556=>1000, - 37557=>1000,37558=>1000,37559=>1000,37560=>1000,37561=>1000,37562=>1000,37563=>1000,37564=>1000,37565=>1000,37566=>1000,37567=>1000,37568=>1000,37569=>1000,37570=>1000,37571=>1000,37572=>1000, - 37573=>1000,37574=>1000,37575=>1000,37576=>1000,37577=>1000,37578=>1000,37579=>1000,37580=>1000,37581=>1000,37582=>1000,37583=>1000,37584=>1000,37585=>1000,37586=>1000,37587=>1000,37588=>1000, - 37589=>1000,37590=>1000,37591=>1000,37592=>1000,37593=>1000,37594=>1000,37595=>1000,37596=>1000,37597=>1000,37598=>1000,37599=>1000,37600=>1000,37601=>1000,37602=>1000,37603=>1000,37604=>1000, - 37605=>1000,37606=>1000,37607=>1000,37608=>1000,37609=>1000,37610=>1000,37611=>1000,37612=>1000,37613=>1000,37614=>1000,37615=>1000,37616=>1000,37617=>1000,37618=>1000,37619=>1000,37620=>1000, - 37621=>1000,37622=>1000,37623=>1000,37624=>1000,37625=>1000,37626=>1000,37627=>1000,37628=>1000,37629=>1000,37630=>1000,37631=>1000,37632=>1000,37633=>1000,37634=>1000,37635=>1000,37636=>1000, - 37637=>1000,37638=>1000,37639=>1000,37640=>1000,37641=>1000,37642=>1000,37643=>1000,37644=>1000,37645=>1000,37646=>1000,37647=>1000,37648=>1000,37649=>1000,37650=>1000,37651=>1000,37652=>1000, - 37653=>1000,37654=>1000,37655=>1000,37656=>1000,37657=>1000,37658=>1000,37659=>1000,37660=>1000,37661=>1000,37662=>1000,37663=>1000,37664=>1000,37665=>1000,37666=>1000,37667=>1000,37668=>1000, - 37669=>1000,37670=>1000,37671=>1000,37672=>1000,37673=>1000,37674=>1000,37675=>1000,37676=>1000,37677=>1000,37678=>1000,37679=>1000,37680=>1000,37681=>1000,37682=>1000,37683=>1000,37684=>1000, - 37685=>1000,37686=>1000,37687=>1000,37688=>1000,37689=>1000,37690=>1000,37691=>1000,37692=>1000,37693=>1000,37694=>1000,37695=>1000,37696=>1000,37697=>1000,37698=>1000,37699=>1000,37700=>1000, - 37701=>1000,37702=>1000,37703=>1000,37704=>1000,37705=>1000,37706=>1000,37707=>1000,37708=>1000,37709=>1000,37710=>1000,37711=>1000,37712=>1000,37713=>1000,37714=>1000,37715=>1000,37716=>1000, - 37717=>1000,37718=>1000,37719=>1000,37720=>1000,37721=>1000,37722=>1000,37723=>1000,37724=>1000,37725=>1000,37726=>1000,37727=>1000,37728=>1000,37729=>1000,37730=>1000,37731=>1000,37732=>1000, - 37733=>1000,37734=>1000,37735=>1000,37736=>1000,37737=>1000,37738=>1000,37739=>1000,37740=>1000,37741=>1000,37742=>1000,37743=>1000,37744=>1000,37745=>1000,37746=>1000,37747=>1000,37748=>1000, - 37749=>1000,37750=>1000,37751=>1000,37752=>1000,37753=>1000,37754=>1000,37755=>1000,37756=>1000,37757=>1000,37758=>1000,37759=>1000,37760=>1000,37761=>1000,37762=>1000,37763=>1000,37764=>1000, - 37765=>1000,37766=>1000,37767=>1000,37768=>1000,37769=>1000,37770=>1000,37771=>1000,37772=>1000,37773=>1000,37774=>1000,37775=>1000,37776=>1000,37777=>1000,37778=>1000,37779=>1000,37780=>1000, - 37781=>1000,37782=>1000,37783=>1000,37784=>1000,37785=>1000,37786=>1000,37787=>1000,37788=>1000,37789=>1000,37790=>1000,37791=>1000,37792=>1000,37793=>1000,37794=>1000,37795=>1000,37796=>1000, - 37797=>1000,37798=>1000,37799=>1000,37800=>1000,37801=>1000,37802=>1000,37803=>1000,37804=>1000,37805=>1000,37806=>1000,37807=>1000,37808=>1000,37809=>1000,37810=>1000,37811=>1000,37812=>1000, - 37813=>1000,37814=>1000,37815=>1000,37816=>1000,37817=>1000,37818=>1000,37819=>1000,37820=>1000,37821=>1000,37822=>1000,37823=>1000,37824=>1000,37825=>1000,37826=>1000,37827=>1000,37828=>1000, - 37829=>1000,37830=>1000,37831=>1000,37832=>1000,37833=>1000,37834=>1000,37835=>1000,37836=>1000,37837=>1000,37838=>1000,37839=>1000,37840=>1000,37841=>1000,37842=>1000,37843=>1000,37844=>1000, - 37845=>1000,37846=>1000,37847=>1000,37848=>1000,37849=>1000,37850=>1000,37851=>1000,37852=>1000,37853=>1000,37854=>1000,37855=>1000,37856=>1000,37857=>1000,37858=>1000,37859=>1000,37860=>1000, - 37861=>1000,37862=>1000,37863=>1000,37864=>1000,37865=>1000,37866=>1000,37867=>1000,37868=>1000,37869=>1000,37870=>1000,37871=>1000,37872=>1000,37873=>1000,37874=>1000,37875=>1000,37876=>1000, - 37877=>1000,37878=>1000,37879=>1000,37880=>1000,37881=>1000,37882=>1000,37883=>1000,37884=>1000,37885=>1000,37886=>1000,37887=>1000,37888=>1000,37889=>1000,37890=>1000,37891=>1000,37892=>1000, - 37893=>1000,37894=>1000,37895=>1000,37896=>1000,37897=>1000,37898=>1000,37899=>1000,37900=>1000,37901=>1000,37902=>1000,37903=>1000,37904=>1000,37905=>1000,37906=>1000,37907=>1000,37908=>1000, - 37909=>1000,37910=>1000,37911=>1000,37912=>1000,37913=>1000,37914=>1000,37915=>1000,37916=>1000,37917=>1000,37918=>1000,37919=>1000,37920=>1000,37921=>1000,37922=>1000,37923=>1000,37924=>1000, - 37925=>1000,37926=>1000,37927=>998,37928=>1000,37929=>1000,37930=>1000,37931=>1000,37932=>1000,37933=>1000,37934=>1000,37935=>1000,37936=>1000,37937=>1000,37938=>1000,37939=>1000,37940=>1000, - 37941=>1000,37942=>1000,37943=>1000,37944=>1000,37945=>1000,37946=>1000,37947=>1000,37948=>1000,37949=>1000,37950=>1000,37951=>1000,37952=>1000,37953=>1000,37954=>1000,37955=>1000,37956=>1000, - 37957=>1000,37958=>1000,37959=>1000,37960=>1000,37961=>1000,37962=>1000,37963=>1000,37964=>1000,37965=>1000,37966=>1000,37967=>1000,37968=>1000,37969=>1000,37970=>1000,37971=>1000,37972=>1000, - 37973=>1000,37974=>1000,37975=>1000,37976=>1000,37977=>1000,37978=>1000,37979=>1000,37980=>1000,37981=>1000,37982=>1000,37983=>1000,37984=>1000,37985=>1000,37986=>1000,37987=>1000,37988=>1000, - 37989=>1000,37990=>1000,37991=>1000,37992=>1000,37993=>1000,37994=>1000,37995=>1000,37996=>1000,37997=>1000,37998=>1000,37999=>1000,38000=>1000,38001=>1000,38002=>1000,38003=>1000,38004=>1000, - 38005=>1000,38006=>1000,38007=>1000,38008=>1000,38009=>1000,38010=>1000,38011=>1000,38012=>1000,38013=>1000,38014=>1000,38015=>1000,38016=>1000,38017=>1000,38018=>1000,38019=>1000,38020=>1000, - 38021=>1000,38022=>1000,38023=>1000,38024=>1000,38025=>1000,38026=>1000,38027=>1000,38028=>1000,38029=>1000,38030=>1000,38031=>1000,38032=>1000,38033=>1000,38034=>1000,38035=>1000,38036=>1000, - 38037=>1000,38038=>1000,38039=>1000,38040=>1000,38041=>1000,38042=>1000,38043=>1000,38044=>1000,38045=>1000,38046=>1000,38047=>1000,38048=>1000,38049=>1000,38050=>1000,38051=>1000,38052=>1000, - 38053=>1000,38054=>1000,38055=>1000,38056=>1000,38057=>1000,38058=>1000,38059=>1000,38060=>1000,38061=>1000,38062=>1000,38063=>1000,38064=>1000,38065=>1000,38066=>1000,38067=>1000,38068=>1000, - 38069=>1000,38070=>1000,38071=>1000,38072=>1000,38073=>1000,38074=>1000,38075=>1000,38076=>1000,38077=>1000,38078=>1000,38079=>1000,38080=>1000,38081=>1000,38082=>1000,38083=>1000,38084=>1000, - 38085=>1000,38086=>1000,38087=>1000,38088=>1000,38089=>1000,38090=>1000,38091=>1000,38092=>1000,38093=>1000,38094=>1000,38095=>1000,38096=>1000,38097=>1000,38098=>1000,38099=>1000,38100=>1000, - 38101=>1000,38102=>1000,38103=>1000,38104=>1000,38105=>1000,38106=>1000,38107=>1000,38108=>1000,38109=>1000,38110=>1000,38111=>1000,38112=>1000,38113=>1000,38114=>1000,38115=>1000,38116=>1000, - 38117=>1000,38118=>1000,38119=>1000,38120=>1000,38121=>1000,38122=>1000,38123=>1000,38124=>1000,38125=>1000,38126=>1000,38127=>1000,38128=>1000,38129=>1000,38130=>1000,38131=>1000,38132=>1000, - 38133=>1000,38134=>1000,38135=>1000,38136=>1000,38137=>1000,38138=>1000,38139=>1000,38140=>1000,38141=>1000,38142=>1000,38143=>1000,38144=>1000,38145=>1000,38146=>1000,38147=>1000,38148=>1000, - 38149=>1000,38150=>1000,38151=>1000,38152=>1000,38153=>1000,38154=>1000,38155=>1000,38156=>1000,38157=>1000,38158=>1000,38159=>1000,38160=>1000,38161=>1000,38162=>1000,38163=>1000,38164=>1000, - 38165=>1000,38166=>1000,38167=>1000,38168=>1000,38169=>1000,38170=>1000,38171=>1000,38172=>1000,38173=>1000,38174=>1000,38175=>1000,38176=>1000,38177=>1000,38178=>1000,38179=>1000,38180=>1000, - 38181=>1000,38182=>1000,38183=>1000,38184=>1000,38185=>1000,38186=>1000,38187=>1000,38188=>1000,38189=>1000,38190=>1000,38191=>1000,38192=>1000,38193=>1000,38194=>1000,38195=>1000,38196=>1000, - 38197=>1000,38198=>1000,38199=>1000,38200=>1000,38201=>1000,38202=>1000,38203=>1000,38204=>1000,38205=>1000,38206=>1000,38207=>1000,38208=>1000,38209=>1000,38210=>1000,38211=>1000,38212=>1000, - 38213=>1000,38214=>1000,38215=>1000,38216=>1000,38217=>1000,38218=>1000,38219=>1000,38220=>1000,38221=>1000,38222=>1000,38223=>1000,38224=>1000,38225=>1000,38226=>1000,38227=>1000,38228=>1000, - 38229=>1000,38230=>1000,38231=>1000,38232=>1000,38233=>1000,38234=>1000,38235=>1000,38236=>1000,38237=>1000,38238=>1000,38239=>1000,38240=>1000,38241=>1000,38242=>1000,38243=>1000,38244=>1000, - 38245=>1000,38246=>1000,38247=>1000,38248=>1000,38249=>1000,38250=>1000,38251=>1000,38252=>1000,38253=>1000,38254=>1000,38255=>1000,38256=>1000,38257=>1000,38258=>1000,38259=>1000,38260=>1000, - 38261=>1000,38262=>1000,38263=>1000,38264=>1000,38265=>1000,38266=>1000,38267=>1000,38268=>1000,38269=>1000,38270=>1000,38271=>1000,38272=>1000,38273=>1000,38274=>1000,38275=>1000,38276=>1000, - 38277=>1000,38278=>1000,38279=>1000,38280=>1000,38281=>1000,38282=>1000,38283=>1000,38284=>1000,38285=>1000,38286=>1000,38287=>1000,38288=>1000,38289=>1000,38290=>1000,38291=>1000,38292=>1000, - 38293=>1000,38294=>1000,38295=>1000,38296=>1000,38297=>1000,38298=>1000,38299=>1000,38300=>1000,38301=>1000,38302=>1000,38303=>1000,38304=>1000,38305=>1000,38306=>1000,38307=>1000,38308=>1000, - 38309=>1000,38310=>1000,38311=>1000,38312=>1000,38313=>1000,38314=>1000,38315=>1000,38316=>1000,38317=>1000,38318=>1000,38319=>1000,38320=>1000,38321=>1000,38322=>1000,38323=>1000,38324=>1000, - 38325=>1000,38326=>1000,38327=>1000,38328=>1000,38329=>1000,38330=>1000,38331=>1000,38332=>1000,38333=>1000,38334=>1000,38335=>1000,38336=>1000,38337=>1000,38338=>1000,38339=>1000,38340=>1000, - 38341=>1000,38342=>1000,38343=>1000,38344=>1000,38345=>1000,38346=>1000,38347=>1000,38348=>1000,38349=>1000,38350=>1000,38351=>1000,38352=>1000,38353=>1000,38354=>1000,38355=>1000,38356=>1000, - 38357=>1000,38358=>1000,38359=>1000,38360=>1000,38361=>1000,38362=>1000,38363=>1000,38364=>1000,38365=>1000,38366=>1000,38367=>1000,38368=>1000,38369=>1000,38370=>1000,38371=>1000,38372=>1000, - 38373=>1000,38374=>1000,38375=>1000,38376=>1000,38377=>1000,38378=>1000,38379=>1000,38380=>1000,38381=>1000,38382=>1000,38383=>1000,38384=>1000,38385=>1000,38386=>1000,38387=>1000,38388=>1000, - 38389=>1000,38390=>1000,38391=>1000,38392=>1000,38393=>1000,38394=>1000,38395=>1000,38396=>1000,38397=>1000,38398=>1000,38399=>1000,38400=>1000,38401=>1000,38402=>1000,38403=>1000,38404=>1000, - 38405=>1000,38406=>1000,38407=>1000,38408=>1000,38409=>1000,38410=>1000,38411=>1000,38412=>1000,38413=>1000,38414=>1000,38415=>1000,38416=>1000,38417=>1000,38418=>1000,38419=>1000,38420=>1000, - 38421=>1000,38422=>1000,38423=>1000,38424=>1000,38425=>1000,38426=>1000,38427=>1000,38428=>1000,38429=>1000,38430=>1000,38431=>1000,38432=>1000,38433=>1000,38434=>1000,38435=>1000,38436=>1000, - 38437=>1000,38438=>1000,38439=>1000,38440=>1000,38441=>1000,38442=>1000,38443=>1000,38444=>1000,38445=>1000,38446=>1000,38447=>1000,38448=>1000,38449=>1000,38450=>1000,38451=>1000,38452=>1000, - 38453=>1000,38454=>1000,38455=>1000,38456=>1000,38457=>1000,38458=>1000,38459=>1000,38460=>1000,38461=>1000,38462=>1000,38463=>1000,38464=>1000,38465=>1000,38466=>1000,38467=>1000,38468=>1000, - 38469=>1000,38470=>1000,38471=>1000,38472=>1000,38473=>1000,38474=>1000,38475=>1000,38476=>1000,38477=>1000,38478=>1000,38479=>1000,38480=>1000,38481=>1000,38482=>1000,38483=>1000,38484=>1000, - 38485=>1000,38486=>1000,38487=>1000,38488=>1000,38489=>1000,38490=>1000,38491=>1000,38492=>1000,38493=>1000,38494=>1000,38495=>1000,38496=>1000,38497=>1000,38498=>1000,38499=>1000,38500=>1000, - 38501=>1000,38502=>1000,38503=>1000,38504=>1000,38505=>1000,38506=>1000,38507=>1000,38508=>1000,38509=>1000,38510=>1000,38511=>1000,38512=>1000,38513=>1000,38514=>1000,38515=>1000,38516=>1000, - 38517=>1000,38518=>1000,38519=>1000,38520=>1000,38521=>1000,38522=>1000,38523=>1000,38524=>1000,38525=>1000,38526=>1000,38527=>1000,38528=>1000,38529=>1000,38530=>1000,38531=>1000,38532=>1000, - 38533=>1000,38534=>1000,38535=>1000,38536=>1000,38537=>1000,38538=>1000,38539=>1000,38540=>1000,38541=>1000,38542=>1000,38543=>1000,38544=>1000,38545=>1000,38546=>1000,38547=>1000,38548=>1000, - 38549=>1000,38550=>1000,38551=>1000,38552=>1000,38553=>1000,38554=>1000,38555=>1000,38556=>1000,38557=>1000,38558=>1000,38559=>1000,38560=>1000,38561=>1000,38562=>1000,38563=>1000,38564=>1000, - 38565=>1000,38566=>1000,38567=>1000,38568=>1000,38569=>1000,38570=>1000,38571=>1000,38572=>1000,38573=>1000,38574=>1000,38575=>1000,38576=>1000,38577=>1000,38578=>1000,38579=>1000,38580=>1000, - 38581=>1000,38582=>1000,38583=>1000,38584=>1000,38585=>1000,38586=>1000,38587=>1000,38588=>1000,38589=>1000,38590=>1000,38591=>1000,38592=>1000,38593=>1000,38594=>1000,38595=>1000,38596=>1000, - 38597=>1000,38598=>1000,38599=>1000,38600=>1000,38601=>1000,38602=>1000,38603=>1000,38604=>1000,38605=>1000,38606=>1000,38607=>1000,38608=>1000,38609=>1000,38610=>1000,38611=>1000,38612=>1000, - 38613=>1000,38614=>1000,38615=>1000,38616=>1000,38617=>1000,38618=>1000,38619=>1000,38620=>1000,38621=>1000,38622=>1000,38623=>1000,38624=>1000,38625=>1000,38626=>1000,38627=>1000,38628=>1000, - 38629=>1000,38630=>1000,38631=>1000,38632=>1000,38633=>1000,38634=>1000,38635=>1000,38636=>1000,38637=>1000,38638=>1000,38639=>1000,38640=>1000,38641=>1000,38642=>1000,38643=>1000,38644=>1000, - 38645=>1000,38646=>1000,38647=>1000,38648=>1000,38649=>1000,38650=>1000,38651=>1000,38652=>1000,38653=>1000,38654=>1000,38655=>1000,38656=>1000,38657=>1000,38658=>1000,38659=>1000,38660=>1000, - 38661=>1000,38662=>1000,38663=>1000,38664=>1000,38665=>1000,38666=>1000,38667=>1000,38668=>1000,38669=>1000,38670=>1000,38671=>1000,38672=>1000,38673=>1000,38674=>1000,38675=>1000,38676=>1000, - 38677=>1000,38678=>1000,38679=>1000,38680=>1000,38681=>1000,38682=>1000,38683=>1000,38684=>1000,38685=>1000,38686=>1000,38687=>1000,38688=>1000,38689=>1000,38690=>1000,38691=>1000,38692=>1000, - 38693=>1000,38694=>1000,38695=>1000,38696=>1000,38697=>1000,38698=>1000,38699=>1000,38700=>1000,38701=>1000,38702=>1000,38703=>1000,38704=>1000,38705=>1000,38706=>1000,38707=>1000,38708=>1000, - 38709=>1000,38710=>1000,38711=>1000,38712=>1000,38713=>1000,38714=>1000,38715=>1000,38716=>1000,38717=>1000,38718=>1000,38719=>1000,38720=>1000,38721=>1000,38722=>1000,38723=>1000,38724=>1000, - 38725=>1000,38726=>1000,38727=>1000,38728=>1000,38729=>1000,38730=>1000,38731=>1000,38732=>1000,38733=>1000,38734=>1000,38735=>1000,38736=>1000,38737=>1000,38738=>1000,38739=>1000,38740=>1000, - 38741=>1000,38742=>1000,38743=>1000,38744=>1000,38745=>1000,38746=>1000,38747=>1000,38748=>1000,38749=>1000,38750=>1000,38751=>1000,38752=>1000,38753=>1000,38754=>1000,38755=>1000,38756=>1000, - 38757=>1000,38758=>1000,38759=>1000,38760=>1000,38761=>1000,38762=>1000,38763=>1000,38764=>1000,38765=>1000,38766=>1000,38767=>1000,38768=>1000,38769=>1000,38770=>1000,38771=>1000,38772=>1000, - 38773=>1000,38774=>1000,38775=>1000,38776=>1000,38777=>1000,38778=>1000,38779=>1000,38780=>1000,38781=>1000,38782=>1000,38783=>1000,38784=>1000,38785=>1000,38786=>1000,38787=>1000,38788=>1000, - 38789=>1000,38790=>1000,38791=>1000,38792=>1000,38793=>1000,38794=>1000,38795=>1000,38796=>1000,38797=>1000,38798=>1000,38799=>1000,38800=>1000,38801=>1000,38802=>1000,38803=>1000,38804=>1000, - 38805=>1000,38806=>1000,38807=>1000,38808=>1000,38809=>1000,38810=>1000,38811=>1000,38812=>1000,38813=>1000,38814=>1000,38815=>1000,38816=>1000,38817=>1000,38818=>1000,38819=>1000,38820=>1000, - 38821=>1000,38822=>1000,38823=>1000,38824=>1000,38825=>1000,38826=>1000,38827=>1000,38828=>1000,38829=>1000,38830=>1000,38831=>1000,38832=>1000,38833=>1000,38834=>1000,38835=>1000,38836=>1000, - 38837=>1000,38838=>1000,38839=>1000,38840=>1000,38841=>1000,38842=>1000,38843=>1000,38844=>1000,38845=>1000,38846=>1000,38847=>1000,38848=>1000,38849=>1000,38850=>1000,38851=>1000,38852=>1000, - 38853=>1000,38854=>1000,38855=>1000,38856=>1000,38857=>1000,38858=>1000,38859=>1000,38860=>1000,38861=>1000,38862=>1000,38863=>1000,38864=>1000,38865=>1000,38866=>1000,38867=>1000,38868=>1000, - 38869=>1000,38870=>1000,38871=>1000,38872=>1000,38873=>1000,38874=>1000,38875=>1000,38876=>1000,38877=>1000,38878=>1000,38879=>1000,38880=>1000,38881=>1000,38882=>1000,38883=>1000,38884=>1000, - 38885=>1000,38886=>1000,38887=>1000,38888=>1000,38889=>1000,38890=>1000,38891=>1000,38892=>1000,38893=>1000,38894=>1000,38895=>1000,38896=>1000,38897=>1000,38898=>1000,38899=>1000,38900=>1000, - 38901=>1000,38902=>1000,38903=>1000,38904=>1000,38905=>1000,38906=>1000,38907=>1000,38908=>1000,38909=>1000,38910=>1000,38911=>1000,38912=>1000,38913=>1000,38914=>1000,38915=>1000,38916=>1000, - 38917=>1000,38918=>1000,38919=>1000,38920=>1000,38921=>1000,38922=>1000,38923=>1000,38924=>1000,38925=>1000,38926=>1000,38927=>1000,38928=>1000,38929=>1000,38930=>1000,38931=>1000,38932=>1000, - 38933=>1000,38934=>1000,38935=>1000,38936=>1000,38937=>1000,38938=>1000,38939=>1000,38940=>1000,38941=>1000,38942=>1000,38943=>1000,38944=>1000,38945=>1000,38946=>1000,38947=>1000,38948=>1000, - 38949=>1000,38950=>1000,38951=>1000,38952=>1000,38953=>1000,38954=>1000,38955=>1000,38956=>1000,38957=>1000,38958=>1000,38959=>1000,38960=>1000,38961=>1000,38962=>1000,38963=>1000,38964=>1000, - 38965=>1000,38966=>1000,38967=>1000,38968=>1000,38969=>1000,38970=>1000,38971=>1000,38972=>1000,38973=>1000,38974=>1000,38975=>1000,38976=>1000,38977=>1000,38978=>1000,38979=>1000,38980=>1000, - 38981=>1000,38982=>1000,38983=>1000,38984=>1000,38985=>1000,38986=>1000,38987=>1000,38988=>1000,38989=>1000,38990=>1000,38991=>1000,38992=>1000,38993=>1000,38994=>1000,38995=>1000,38996=>1000, - 38997=>1000,38998=>1000,38999=>1000,39000=>1000,39001=>1000,39002=>1000,39003=>1000,39004=>1000,39005=>1000,39006=>1000,39007=>1000,39008=>1000,39009=>1000,39010=>1000,39011=>1000,39012=>1000, - 39013=>1000,39014=>1000,39015=>1000,39016=>1000,39017=>1000,39018=>1000,39019=>1000,39020=>1000,39021=>1000,39022=>1000,39023=>1000,39024=>1000,39025=>1000,39026=>1000,39027=>1000,39028=>1000, - 39029=>1000,39030=>1000,39031=>1000,39032=>1000,39033=>1000,39034=>1000,39035=>1000,39036=>1000,39037=>1000,39038=>1000,39039=>1000,39040=>1000,39041=>1000,39042=>1000,39043=>1000,39044=>1000, - 39045=>1000,39046=>1000,39047=>1000,39048=>1000,39049=>1000,39050=>1000,39051=>1000,39052=>1000,39053=>1000,39054=>1000,39055=>1000,39056=>1000,39057=>1000,39058=>1000,39059=>1000,39060=>1000, - 39061=>1000,39062=>1000,39063=>1000,39064=>1000,39065=>1000,39066=>1000,39067=>1000,39068=>1000,39069=>1000,39070=>1000,39071=>1000,39072=>1000,39073=>1000,39074=>1000,39075=>1000,39076=>1000, - 39077=>1000,39078=>1000,39079=>1000,39080=>1000,39081=>1000,39082=>1000,39083=>1000,39084=>1000,39085=>1000,39086=>1000,39087=>1000,39088=>1000,39089=>1000,39090=>1000,39091=>1000,39092=>1000, - 39093=>1000,39094=>1000,39095=>1000,39096=>1000,39097=>1000,39098=>1000,39099=>1000,39100=>1000,39101=>1000,39102=>1000,39103=>1000,39104=>1000,39105=>1000,39106=>1000,39107=>1000,39108=>1000, - 39109=>1000,39110=>1000,39111=>1000,39112=>1000,39113=>1000,39114=>1000,39115=>1000,39116=>1000,39117=>1000,39118=>1000,39119=>1000,39120=>1000,39121=>1000,39122=>1000,39123=>1000,39124=>1000, - 39125=>1000,39126=>1000,39127=>1000,39128=>1000,39129=>1000,39130=>1000,39131=>1000,39132=>1000,39133=>1000,39134=>1000,39135=>1000,39136=>1000,39137=>1000,39138=>1000,39139=>1000,39140=>1000, - 39141=>1000,39142=>1000,39143=>1000,39144=>1000,39145=>1000,39146=>1000,39147=>1000,39148=>1000,39149=>1000,39150=>1000,39151=>1000,39152=>1000,39153=>1000,39154=>1000,39155=>1000,39156=>1000, - 39157=>1000,39158=>1000,39159=>1000,39160=>1000,39161=>1000,39162=>1000,39163=>1000,39164=>1000,39165=>1000,39166=>1000,39167=>1000,39168=>1000,39169=>1000,39170=>1000,39171=>1000,39172=>1000, - 39173=>1000,39174=>1000,39175=>1000,39176=>1000,39177=>1000,39178=>1000,39179=>1000,39180=>1000,39181=>1000,39182=>1000,39183=>1000,39184=>1000,39185=>1000,39186=>1000,39187=>1000,39188=>1000, - 39189=>1000,39190=>1000,39191=>1000,39192=>1000,39193=>1000,39194=>1000,39195=>1000,39196=>1000,39197=>1000,39198=>1000,39199=>1000,39200=>1000,39201=>1000,39202=>1000,39203=>1000,39204=>1000, - 39205=>1000,39206=>1000,39207=>1000,39208=>1000,39209=>1000,39210=>1000,39211=>1000,39212=>1000,39213=>1000,39214=>1000,39215=>1000,39216=>1000,39217=>1000,39218=>1000,39219=>1000,39220=>1000, - 39221=>1000,39222=>1000,39223=>1000,39224=>1000,39225=>1000,39226=>1000,39227=>1000,39228=>1000,39229=>1000,39230=>1000,39231=>1000,39232=>1000,39233=>1000,39234=>1000,39235=>1000,39236=>1000, - 39237=>1000,39238=>1000,39239=>1000,39240=>1000,39241=>1000,39242=>1000,39243=>1000,39244=>1000,39245=>1000,39246=>1000,39247=>1000,39248=>1000,39249=>1000,39250=>1000,39251=>1000,39252=>1000, - 39253=>1000,39254=>1000,39255=>1000,39256=>1000,39257=>1000,39258=>1000,39259=>1000,39260=>1000,39261=>1000,39262=>1000,39263=>1000,39264=>1000,39265=>1000,39266=>1000,39267=>1000,39268=>1000, - 39269=>1000,39270=>1000,39271=>1000,39272=>1000,39273=>1000,39274=>1000,39275=>1000,39276=>1000,39277=>1000,39278=>1000,39279=>1000,39280=>1000,39281=>1000,39282=>1000,39283=>1000,39284=>1000, - 39285=>1000,39286=>1000,39287=>1000,39288=>1000,39289=>1000,39290=>1000,39291=>1000,39292=>1000,39293=>1000,39294=>1000,39295=>1000,39296=>1000,39297=>1000,39298=>1000,39299=>1000,39300=>1000, - 39301=>1000,39302=>1000,39303=>1000,39304=>1000,39305=>1000,39306=>1000,39307=>1000,39308=>1000,39309=>1000,39310=>1000,39311=>1000,39312=>1000,39313=>1000,39314=>1000,39315=>1000,39316=>1000, - 39317=>1000,39318=>1000,39319=>1000,39320=>1000,39321=>1000,39322=>1000,39323=>1000,39324=>1000,39325=>1000,39326=>1000,39327=>1000,39328=>1000,39329=>1000,39330=>1000,39331=>1000,39332=>1000, - 39333=>1000,39334=>1000,39335=>1000,39336=>1000,39337=>1000,39338=>1000,39339=>1000,39340=>1000,39341=>1000,39342=>1000,39343=>1000,39344=>1000,39345=>1000,39346=>1000,39347=>1000,39348=>1000, - 39349=>1000,39350=>1000,39351=>1000,39352=>1000,39353=>1000,39354=>1000,39355=>1000,39356=>1000,39357=>1000,39358=>1000,39359=>1000,39360=>1000,39361=>1000,39362=>1000,39363=>1000,39364=>1000, - 39365=>1000,39366=>1000,39367=>1000,39368=>1000,39369=>1000,39370=>1000,39371=>1000,39372=>1000,39373=>1000,39374=>1000,39375=>1000,39376=>1000,39377=>1000,39378=>1000,39379=>1000,39380=>1000, - 39381=>1000,39382=>1000,39383=>1000,39384=>1000,39385=>1000,39386=>1000,39387=>1000,39388=>1000,39389=>1000,39390=>1000,39391=>1000,39392=>1000,39393=>1000,39394=>1000,39395=>1000,39396=>1000, - 39397=>1000,39398=>1000,39399=>1000,39400=>1000,39401=>1000,39402=>1000,39403=>1000,39404=>1000,39405=>1000,39406=>1000,39407=>1000,39408=>1000,39409=>1000,39410=>1000,39411=>1000,39412=>1000, - 39413=>1000,39414=>1000,39415=>1000,39416=>1000,39417=>1000,39418=>1000,39419=>1000,39420=>1000,39421=>1000,39422=>1000,39423=>1000,39424=>1000,39425=>1000,39426=>1000,39427=>1000,39428=>1000, - 39429=>1000,39430=>1000,39431=>1000,39432=>1000,39433=>1000,39434=>1000,39435=>1000,39436=>1000,39437=>1000,39438=>1000,39439=>1000,39440=>1000,39441=>1000,39442=>1000,39443=>1000,39444=>1000, - 39445=>1000,39446=>1000,39447=>1000,39448=>1000,39449=>1000,39450=>1000,39451=>1000,39452=>1000,39453=>1000,39454=>1000,39455=>1000,39456=>1000,39457=>1000,39458=>1000,39459=>1000,39460=>1000, - 39461=>1000,39462=>1000,39463=>1000,39464=>1000,39465=>1000,39466=>1000,39467=>1000,39468=>1000,39469=>1000,39470=>1000,39471=>1000,39472=>1000,39473=>1000,39474=>1000,39475=>1000,39476=>1000, - 39477=>1000,39478=>1000,39479=>1000,39480=>1000,39481=>1000,39482=>1000,39483=>1000,39484=>1000,39485=>1000,39486=>1000,39487=>1000,39488=>1000,39489=>1000,39490=>1000,39491=>1000,39492=>1000, - 39493=>1000,39494=>1000,39495=>1000,39496=>1000,39497=>1000,39498=>1000,39499=>1000,39500=>1000,39501=>1000,39502=>1000,39503=>1000,39504=>1000,39505=>1000,39506=>1000,39507=>1000,39508=>1000, - 39509=>1000,39510=>1000,39511=>1000,39512=>1000,39513=>1000,39514=>1000,39515=>1000,39516=>1000,39517=>1000,39518=>1000,39519=>1000,39520=>1000,39521=>1000,39522=>1000,39523=>1000,39524=>1000, - 39525=>1000,39526=>1000,39527=>1000,39528=>1000,39529=>1000,39530=>1000,39531=>1000,39532=>1000,39533=>1000,39534=>1000,39535=>1000,39536=>1000,39537=>1000,39538=>1000,39539=>1000,39540=>1000, - 39541=>1000,39542=>1000,39543=>1000,39544=>1000,39545=>1000,39546=>1000,39547=>1000,39548=>1000,39549=>1000,39550=>1000,39551=>1000,39552=>1000,39553=>1000,39554=>1000,39555=>1000,39556=>1000, - 39557=>1000,39558=>1000,39559=>1000,39560=>1000,39561=>1000,39562=>1000,39563=>1000,39564=>1000,39565=>1000,39566=>1000,39567=>1000,39568=>1000,39569=>1000,39570=>1000,39571=>1000,39572=>1000, - 39573=>1000,39574=>1000,39575=>1000,39576=>1000,39577=>1000,39578=>1000,39579=>1000,39580=>1000,39581=>1000,39582=>1000,39583=>1000,39584=>1000,39585=>1000,39586=>1000,39587=>1000,39588=>1000, - 39589=>1000,39590=>1000,39591=>1000,39592=>1000,39593=>1000,39594=>1000,39595=>1000,39596=>1000,39597=>1000,39598=>1000,39599=>1000,39600=>1000,39601=>1000,39602=>1000,39603=>1000,39604=>1000, - 39605=>1000,39606=>1000,39607=>1000,39608=>1000,39609=>1000,39610=>1000,39611=>1000,39612=>1000,39613=>1000,39614=>1000,39615=>1000,39616=>1000,39617=>1000,39618=>1000,39619=>1000,39620=>1000, - 39621=>1000,39622=>1000,39623=>1000,39624=>1000,39625=>1000,39626=>1000,39627=>1000,39628=>1000,39629=>1000,39630=>1000,39631=>1000,39632=>1000,39633=>1000,39634=>1000,39635=>1000,39636=>1000, - 39637=>1000,39638=>1000,39639=>1000,39640=>1000,39641=>1000,39642=>1000,39643=>1000,39644=>1000,39645=>1000,39646=>1000,39647=>1000,39648=>1000,39649=>1000,39650=>1000,39651=>1000,39652=>1000, - 39653=>1000,39654=>1000,39655=>1000,39656=>1000,39657=>1000,39658=>1000,39659=>1000,39660=>1000,39661=>1000,39662=>1000,39663=>1000,39664=>1000,39665=>1000,39666=>1000,39667=>1000,39668=>1000, - 39669=>1000,39670=>1000,39671=>1000,39672=>1000,39673=>1000,39674=>1000,39675=>1000,39676=>1000,39677=>1000,39678=>1000,39679=>1000,39680=>1000,39681=>1000,39682=>1000,39683=>1000,39684=>1000, - 39685=>1000,39686=>1000,39687=>1000,39688=>1000,39689=>1000,39690=>1000,39691=>1000,39692=>1000,39693=>1000,39694=>1000,39695=>1000,39696=>1000,39697=>1000,39698=>1000,39699=>1000,39700=>1000, - 39701=>1000,39702=>1000,39703=>1000,39704=>1000,39705=>1000,39706=>1000,39707=>1000,39708=>1000,39709=>1000,39710=>1000,39711=>1000,39712=>1000,39713=>1000,39714=>1000,39715=>1000,39716=>1000, - 39717=>1000,39718=>1000,39719=>1000,39720=>1000,39721=>1000,39722=>1000,39723=>1000,39724=>1000,39725=>1000,39726=>1000,39727=>1000,39728=>1000,39729=>1000,39730=>1000,39731=>1000,39732=>1000, - 39733=>1000,39734=>1000,39735=>1000,39736=>1000,39737=>1000,39738=>1000,39739=>1000,39740=>1000,39741=>1000,39742=>1000,39743=>1000,39744=>1000,39745=>1000,39746=>1000,39747=>1000,39748=>1000, - 39749=>1000,39750=>1000,39751=>1000,39752=>1000,39753=>1000,39754=>1000,39755=>1000,39756=>1000,39757=>1000,39758=>1000,39759=>1000,39760=>1000,39761=>1000,39762=>1000,39763=>1000,39764=>1000, - 39765=>1000,39766=>1000,39767=>1000,39768=>1000,39769=>1000,39770=>1000,39771=>1000,39772=>1000,39773=>1000,39774=>1000,39775=>1000,39776=>1000,39777=>1000,39778=>1000,39779=>1000,39780=>1000, - 39781=>1000,39782=>1000,39783=>1000,39784=>1000,39785=>1000,39786=>1000,39787=>1000,39788=>1000,39789=>1000,39790=>1000,39791=>1000,39792=>1000,39793=>1000,39794=>1000,39795=>1000,39796=>1000, - 39797=>1000,39798=>1000,39799=>1000,39800=>1000,39801=>1000,39802=>1000,39803=>1000,39804=>1000,39805=>1000,39806=>1000,39807=>1000,39808=>1000,39809=>1000,39810=>1000,39811=>1000,39812=>1000, - 39813=>1000,39814=>1000,39815=>1000,39816=>1000,39817=>1000,39818=>1000,39819=>1000,39820=>1000,39821=>1000,39822=>1000,39823=>1000,39824=>1000,39825=>1000,39826=>1000,39827=>1000,39828=>1000, - 39829=>1000,39830=>1000,39831=>1000,39832=>1000,39833=>1000,39834=>1000,39835=>1000,39836=>1000,39837=>1000,39838=>1000,39839=>1000,39840=>1000,39841=>1000,39842=>1000,39843=>1000,39844=>1000, - 39845=>1000,39846=>1000,39847=>1000,39848=>1000,39849=>1000,39850=>1000,39851=>1000,39852=>1000,39853=>1000,39854=>1000,39855=>1000,39856=>1000,39857=>1000,39858=>1000,39859=>1000,39860=>1000, - 39861=>1000,39862=>1000,39863=>1000,39864=>1000,39865=>1000,39866=>1000,39867=>1000,39868=>1000,39869=>1000,39870=>1000,39871=>1000,39872=>1000,39873=>1000,39874=>1000,39875=>1000,39876=>1000, - 39877=>1000,39878=>1000,39879=>1000,39880=>1000,39881=>1000,39882=>1000,39883=>1000,39884=>1000,39885=>1000,39886=>1000,39887=>1000,39888=>1000,39889=>1000,39890=>1000,39891=>1000,39892=>1000, - 39893=>1000,39894=>1000,39895=>1000,39896=>1000,39897=>1000,39898=>1000,39899=>1000,39900=>1000,39901=>1000,39902=>1000,39903=>1000,39904=>1000,39905=>1000,39906=>1000,39907=>1000,39908=>1000, - 39909=>1000,39910=>1000,39911=>1000,39912=>1000,39913=>1000,39914=>1000,39915=>1000,39916=>1000,39917=>1000,39918=>1000,39919=>1000,39920=>1000,39921=>1000,39922=>1000,39923=>1000,39924=>1000, - 39925=>1000,39926=>1000,39927=>1000,39928=>1000,39929=>1000,39930=>1000,39931=>1000,39932=>1000,39933=>1000,39934=>1000,39935=>1000,39936=>1000,39937=>1000,39938=>1000,39939=>1000,39940=>1000, - 39941=>1000,39942=>1000,39943=>1000,39944=>1000,39945=>1000,39946=>1000,39947=>1000,39948=>1000,39949=>1000,39950=>1000,39951=>1000,39952=>1000,39953=>1000,39954=>1000,39955=>1000,39956=>1000, - 39957=>1000,39958=>1000,39959=>1000,39960=>1000,39961=>1000,39962=>1000,39963=>1000,39964=>1000,39965=>1000,39966=>1000,39967=>1000,39968=>1000,39969=>1000,39970=>1000,39971=>1000,39972=>1000, - 39973=>1000,39974=>1000,39975=>1000,39976=>1000,39977=>1000,39978=>1000,39979=>1000,39980=>1000,39981=>1000,39982=>1000,39983=>1000,39984=>1000,39985=>1000,39986=>1000,39987=>1000,39988=>1000, - 39989=>1000,39990=>1000,39991=>1000,39992=>1000,39993=>1000,39994=>1000,39995=>1000,39996=>1000,39997=>1000,39998=>1000,39999=>1000,40000=>1000,40001=>1000,40002=>1000,40003=>1000,40004=>1000, - 40005=>1000,40006=>1000,40007=>1000,40008=>1000,40009=>1000,40010=>1000,40011=>1000,40012=>1000,40013=>1000,40014=>1000,40015=>1000,40016=>1000,40017=>1000,40018=>1000,40019=>1000,40020=>1000, - 40021=>1000,40022=>1000,40023=>1000,40024=>1000,40025=>1000,40026=>1000,40027=>1000,40028=>1000,40029=>1000,40030=>1000,40031=>1000,40032=>1000,40033=>1000,40034=>1000,40035=>1000,40036=>1000, - 40037=>1000,40038=>1000,40039=>1000,40040=>1000,40041=>1000,40042=>1000,40043=>1000,40044=>1000,40045=>1000,40046=>1000,40047=>1000,40048=>1000,40049=>1000,40050=>1000,40051=>1000,40052=>1000, - 40053=>1000,40054=>1000,40055=>1000,40056=>1000,40057=>1000,40058=>1000,40059=>1000,40060=>1000,40061=>1000,40062=>1000,40063=>1000,40064=>1000,40065=>1000,40066=>1000,40067=>1000,40068=>1000, - 40069=>1000,40070=>1000,40071=>1000,40072=>1000,40073=>1000,40074=>1000,40075=>1000,40076=>1000,40077=>1000,40078=>1000,40079=>1000,40080=>1000,40081=>1000,40082=>1000,40083=>1000,40084=>1000, - 40085=>1000,40086=>1000,40087=>1000,40088=>1000,40089=>1000,40090=>1000,40091=>1000,40092=>1000,40093=>1000,40094=>1000,40095=>1000,40096=>1000,40097=>1000,40098=>1000,40099=>1000,40100=>1000, - 40101=>1000,40102=>1000,40103=>1000,40104=>1000,40105=>1000,40106=>1000,40107=>1000,40108=>1000,40109=>1000,40110=>1000,40111=>1000,40112=>1000,40113=>1000,40114=>1000,40115=>1000,40116=>1000, - 40117=>1000,40118=>1000,40119=>1000,40120=>1000,40121=>1000,40122=>1000,40123=>1000,40124=>1000,40125=>1000,40126=>1000,40127=>1000,40128=>1000,40129=>1000,40130=>1000,40131=>1000,40132=>1000, - 40133=>1000,40134=>1000,40135=>1000,40136=>1000,40137=>1000,40138=>1000,40139=>1000,40140=>1000,40141=>1000,40142=>1000,40143=>1000,40144=>1000,40145=>1000,40146=>1000,40147=>1000,40148=>1000, - 40149=>1000,40150=>1000,40151=>1000,40152=>1000,40153=>1000,40154=>1000,40155=>1000,40156=>1000,40157=>1000,40158=>1000,40159=>1000,40160=>1000,40161=>1000,40162=>1000,40163=>1000,40164=>1000, - 40165=>1000,40166=>1000,40167=>1000,40168=>1000,40169=>1000,40170=>1000,40171=>1000,40172=>1000,40173=>1000,40174=>1000,40175=>1000,40176=>1000,40177=>1000,40178=>1000,40179=>1000,40180=>1000, - 40181=>1000,40182=>1000,40183=>1000,40184=>1000,40185=>1000,40186=>1000,40187=>1000,40188=>1000,40189=>1000,40190=>1000,40191=>1000,40192=>1000,40193=>1000,40194=>1000,40195=>1000,40196=>1000, - 40197=>1000,40198=>1000,40199=>1000,40200=>1000,40201=>1000,40202=>1000,40203=>1000,40204=>1000,40205=>1000,40206=>1000,40207=>1000,40208=>1000,40209=>1000,40210=>1000,40211=>1000,40212=>1000, - 40213=>1000,40214=>1000,40215=>1000,40216=>1000,40217=>1000,40218=>1000,40219=>1000,40220=>1000,40221=>1000,40222=>1000,40223=>1000,40224=>1000,40225=>1000,40226=>1000,40227=>1000,40228=>1000, - 40229=>1000,40230=>1000,40231=>1000,40232=>1000,40233=>1000,40234=>1000,40235=>1000,40236=>1000,40237=>1000,40238=>1000,40239=>1000,40240=>1000,40241=>1000,40242=>1000,40243=>1000,40244=>1000, - 40245=>1000,40246=>1000,40247=>1000,40248=>1000,40249=>1000,40250=>1000,40251=>1000,40252=>1000,40253=>1000,40254=>1000,40255=>1000,40256=>1000,40257=>1000,40258=>1000,40259=>1000,40260=>1000, - 40261=>1000,40262=>1000,40263=>1000,40264=>1000,40265=>1000,40266=>1000,40267=>1000,40268=>1000,40269=>1000,40270=>1000,40271=>1000,40272=>1000,40273=>1000,40274=>1000,40275=>1000,40276=>1000, - 40277=>1000,40278=>1000,40279=>1000,40280=>1000,40281=>1000,40282=>1000,40283=>1000,40284=>1000,40285=>1000,40286=>1000,40287=>1000,40288=>1000,40289=>1000,40290=>1000,40291=>1000,40292=>1000, - 40293=>1000,40294=>1000,40295=>1000,40296=>1000,40297=>1000,40298=>1000,40299=>1000,40300=>1000,40301=>1000,40302=>1000,40303=>1000,40304=>1000,40305=>1000,40306=>1000,40307=>1000,40308=>1000, - 40309=>1000,40310=>1000,40311=>1000,40312=>1000,40313=>1000,40314=>1000,40315=>1000,40316=>1000,40317=>1000,40318=>1000,40319=>1000,40320=>1000,40321=>1000,40322=>1000,40323=>1000,40324=>1000, - 40325=>1000,40326=>1000,40327=>1000,40328=>1000,40329=>1000,40330=>1000,40331=>1000,40332=>1000,40333=>1000,40334=>1000,40335=>1000,40336=>1000,40337=>1000,40338=>1000,40339=>1000,40340=>1000, - 40341=>1000,40342=>1000,40343=>1000,40344=>1000,40345=>1000,40346=>1000,40347=>1000,40348=>1000,40349=>1000,40350=>1000,40351=>1000,40352=>1000,40353=>1000,40354=>1000,40355=>1000,40356=>1000, - 40357=>1000,40358=>1000,40359=>1000,40360=>1000,40361=>1000,40362=>1000,40363=>1000,40364=>1000,40365=>1000,40366=>1000,40367=>1000,40368=>1000,40369=>1000,40370=>1000,40371=>1000,40372=>1000, - 40373=>1000,40374=>1000,40375=>1000,40376=>1000,40377=>1000,40378=>1000,40379=>1000,40380=>1000,40381=>1000,40382=>1000,40383=>1000,40384=>1000,40385=>1000,40386=>1000,40387=>1000,40388=>1000, - 40389=>1000,40390=>1000,40391=>1000,40392=>1000,40393=>1000,40394=>1000,40395=>1000,40396=>1000,40397=>1000,40398=>1000,40399=>1000,40400=>1000,40401=>1000,40402=>1000,40403=>1000,40404=>1000, - 40405=>1000,40406=>1000,40407=>1000,40408=>1000,40409=>1000,40410=>1000,40411=>1000,40412=>1000,40413=>1000,40414=>1000,40415=>1000,40416=>1000,40417=>1000,40418=>1000,40419=>1000,40420=>1000, - 40421=>1000,40422=>1000,40423=>1000,40424=>1000,40425=>1000,40426=>1000,40427=>1000,40428=>1000,40429=>1000,40430=>1000,40431=>1000,40432=>1000,40433=>1000,40434=>1000,40435=>1000,40436=>1000, - 40437=>1000,40438=>1000,40439=>1000,40440=>1000,40441=>1000,40442=>1000,40443=>1000,40444=>1000,40445=>1000,40446=>1000,40447=>1000,40448=>1000,40449=>1000,40450=>1000,40451=>1000,40452=>1000, - 40453=>1000,40454=>1000,40455=>1000,40456=>1000,40457=>1000,40458=>1000,40459=>1000,40460=>1000,40461=>1000,40462=>1000,40463=>1000,40464=>1000,40465=>1000,40466=>1000,40467=>1000,40468=>1000, - 40469=>1000,40470=>1000,40471=>1000,40472=>1000,40473=>1000,40474=>1000,40475=>1000,40476=>1000,40477=>1000,40478=>1000,40479=>1000,40480=>1000,40481=>1000,40482=>1000,40483=>1000,40484=>1000, - 40485=>1000,40486=>1000,40487=>1000,40488=>1000,40489=>1000,40490=>1000,40491=>1000,40492=>1000,40493=>1000,40494=>1000,40495=>1000,40496=>1000,40497=>1000,40498=>1000,40499=>1000,40500=>1000, - 40501=>1000,40502=>1000,40503=>1000,40504=>1000,40505=>1000,40506=>1000,40507=>1000,40508=>1000,40509=>1000,40510=>1000,40511=>1000,40512=>1000,40513=>1000,40514=>1000,40515=>1000,40516=>1000, - 40517=>1000,40518=>1000,40519=>1000,40520=>1000,40521=>1000,40522=>1000,40523=>1000,40524=>1000,40525=>1000,40526=>1000,40527=>1000,40528=>1000,40529=>1000,40530=>1000,40531=>1000,40532=>1000, - 40533=>1000,40534=>1000,40535=>1000,40536=>1000,40537=>1000,40538=>1000,40539=>1000,40540=>1000,40541=>1000,40542=>1000,40543=>1000,40544=>1000,40545=>1000,40546=>1000,40547=>1000,40548=>1000, - 40549=>1000,40550=>1000,40551=>1000,40552=>1000,40553=>1000,40554=>1000,40555=>1000,40556=>1000,40557=>1000,40558=>1000,40559=>1000,40560=>1000,40561=>1000,40562=>1000,40563=>1000,40564=>1000, - 40565=>1000,40566=>1000,40567=>1000,40568=>1000,40569=>1000,40570=>1000,40571=>1000,40572=>1000,40573=>1000,40574=>1000,40575=>1000,40576=>1000,40577=>1000,40578=>1000,40579=>1000,40580=>1000, - 40581=>1000,40582=>1000,40583=>1000,40584=>1000,40585=>1000,40586=>1000,40587=>1000,40588=>1000,40589=>1000,40590=>1000,40591=>1000,40592=>1000,40593=>1000,40594=>1000,40595=>1000,40596=>1000, - 40597=>1000,40598=>1000,40599=>1000,40600=>1000,40601=>1000,40602=>1000,40603=>1000,40604=>1000,40605=>1000,40606=>1000,40607=>1000,40608=>1000,40609=>1000,40610=>1000,40611=>1000,40612=>1000, - 40613=>1000,40614=>1000,40615=>1000,40616=>1000,40617=>1000,40618=>1000,40619=>1000,40620=>1000,40621=>1000,40622=>1000,40623=>1000,40624=>1000,40625=>1000,40626=>1000,40627=>1000,40628=>1000, - 40629=>1000,40630=>1000,40631=>1000,40632=>1000,40633=>1000,40634=>1000,40635=>1000,40636=>1000,40637=>1000,40638=>1000,40639=>1000,40640=>1000,40641=>1000,40642=>1000,40643=>1000,40644=>1000, - 40645=>1000,40646=>1000,40647=>1000,40648=>1000,40649=>1000,40650=>1000,40651=>1000,40652=>1000,40653=>1000,40654=>1000,40655=>1000,40656=>1000,40657=>1000,40658=>1000,40659=>1000,40660=>1000, - 40661=>1000,40662=>1000,40663=>1000,40664=>1000,40665=>1000,40666=>1000,40667=>1000,40668=>1000,40669=>1000,40670=>1000,40671=>1000,40672=>1000,40673=>1000,40674=>1000,40675=>1000,40676=>1000, - 40677=>1000,40678=>1000,40679=>1000,40680=>1000,40681=>1000,40682=>1000,40683=>1000,40684=>1000,40685=>1000,40686=>1000,40687=>1000,40688=>1000,40689=>1000,40690=>1000,40691=>1000,40692=>1000, - 40693=>1000,40694=>1000,40695=>1000,40696=>1000,40697=>1000,40698=>1000,40699=>1000,40700=>1000,40701=>1000,40702=>1000,40703=>1000,40704=>1000,40705=>1000,40706=>1000,40707=>1000,40708=>1000, - 40709=>1000,40710=>1000,40711=>1000,40712=>1000,40713=>1000,40714=>1000,40715=>1000,40716=>1000,40717=>1000,40718=>1000,40719=>1000,40720=>1000,40721=>1000,40722=>1000,40723=>1000,40724=>1000, - 40725=>1000,40726=>1000,40727=>1000,40728=>1000,40729=>1000,40730=>1000,40731=>1000,40732=>1000,40733=>1000,40734=>1000,40735=>1000,40736=>1000,40737=>1000,40738=>1000,40739=>1000,40740=>1000, - 40741=>1000,40742=>1000,40743=>1000,40744=>1000,40745=>1000,40746=>1000,40747=>1000,40748=>1000,40749=>1000,40750=>1000,40751=>1000,40752=>1000,40753=>1000,40754=>1000,40755=>1000,40756=>1000, - 40757=>1000,40758=>1000,40759=>1000,40760=>1000,40761=>1000,40762=>1000,40763=>1000,40764=>1000,40765=>1000,40766=>1000,40767=>1000,40768=>1000,40769=>1000,40770=>1000,40771=>1000,40772=>1000, - 40773=>1000,40774=>1000,40775=>1000,40776=>1000,40777=>1000,40778=>1000,40779=>1000,40780=>1000,40781=>1000,40782=>1000,40783=>1000,40784=>1000,40785=>1000,40786=>1000,40787=>1000,40788=>1000, - 40789=>1000,40790=>1000,40791=>1000,40792=>1000,40793=>1000,40794=>1000,40795=>1000,40796=>1000,40797=>1000,40798=>1000,40799=>1000,40800=>1000,40801=>1000,40802=>1000,40803=>1000,40804=>1000, - 40805=>1000,40806=>1000,40807=>1000,40808=>1000,40809=>1000,40810=>1000,40811=>1000,40812=>1000,40813=>1000,40814=>1000,40815=>1000,40816=>1000,40817=>1000,40818=>1000,40819=>1000,40820=>1000, - 40821=>1000,40822=>1000,40823=>1000,40824=>1000,40825=>1000,40826=>1000,40827=>1000,40828=>1000,40829=>1000,40830=>1000,40831=>1000,40832=>1000,40833=>1000,40834=>1000,40835=>1000,40836=>1000, - 40837=>1000,40838=>1000,40839=>1000,40840=>1000,40841=>1000,40842=>1000,40843=>1000,40844=>1000,40845=>1000,40846=>1000,40847=>1000,40848=>1000,40849=>1000,40850=>1000,40851=>1000,40852=>1000, - 40853=>1000,40854=>1000,40855=>1000,40856=>1000,40857=>1000,40858=>1000,40859=>1000,40860=>1000,40861=>1000,40862=>1000,40863=>1000,40864=>1000,40865=>1000,40866=>1000,40867=>1000,40868=>1000, - 40869=>1000); -$diff=''; -$originalsize=23275812; - -// CID Information -// Select your language -// unicode to cid conversion table is from -// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ -// cid2code.txt in ac16.tar.Z,ag15.tar.Z,ak12.tar.Z and aj16.tar.Z. - -//$enc='UniCNS-UTF16-H'; -//$cidinfo=array('Registry'=>'Adobe','Ordering'=>'CNS1','Supplement'=>0); -//include(dirname(__FILE__).'/uni2cid_ac15.php'); - -//$enc='UniGB-UTF16-H'; -//$cidinfo=array('Registry'=>'Adobe','Ordering'=>'GB1','Supplement'=>2); -//include(dirname(__FILE__).'/uni2cid_ag15.php'); - -//$enc='UniKS-UTF16-H'; -//$cidinfo=array('Registry'=>'Adobe','Ordering'=>'Korea1','Supplement'=>0); -//include(dirname(__FILE__).'/uni2cid_ak12.php'); - -$enc='UniJIS-UTF16-H'; -$cidinfo=array('Registry'=>'Adobe','Ordering'=>'Japan1','Supplement'=>5); -include(dirname(__FILE__).'/uni2cid_aj16.php'); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/chinese.php b/include/limesurvey/admin/classes/tcpdf/fonts/chinese.php deleted file mode 100644 index d63e5585..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/chinese.php +++ /dev/null @@ -1,15 +0,0 @@ -801,'Descent'=>-199,'CapHeight'=>27,'Flags'=>33,'FontBBox'=>'[0 -199 949 801]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); -$up=-107; -$ut=49; -$cw=array(1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>500,33=>500,34=>500,35=>500,36=>500,37=>500,38=>500,39=>500,40=>500,41=>500,42=>500,43=>500,44=>500,45=>500,46=>500,47=>500,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>500,59=>500,60=>500,61=>500,62=>500,63=>500,64=>500,65=>500,66=>500,67=>500,68=>500,69=>500,70=>500,71=>500,72=>500,73=>500,74=>500,75=>500,76=>500,77=>500,78=>500,79=>500,80=>500,81=>500,82=>500,83=>500,84=>500,85=>500,86=>500,87=>500,88=>500,89=>500,90=>500,91=>500,92=>500,93=>500,94=>500,95=>500,96=>500,97=>500,98=>500,99=>500,100=>500,101=>500,102=>500,103=>500,104=>500,105=>500,106=>500,107=>500,108=>500,109=>500,110=>500,111=>500,112=>500,113=>500,114=>500,115=>500,116=>500,117=>500,118=>500,119=>500,120=>500,121=>500,122=>500,123=>500,124=>500,125=>500,126=>500,127=>500,8364=>1000,129=>500,130=>500,131=>500,132=>500,8230=>1000,134=>500,135=>500,136=>500,137=>500,138=>500,139=>500,140=>500,141=>500,142=>500,143=>500,144=>500,8216=>1000,8217=>1000,8220=>1000,8221=>1000,8226=>1000,8211=>1000,8212=>1000,152=>500,153=>500,154=>500,155=>500,156=>500,157=>500,158=>500,159=>500,160=>500,161=>500,162=>500,163=>500,164=>500,165=>500,166=>500,167=>500,168=>500,169=>500,170=>500,171=>500,172=>500,173=>500,174=>500,175=>500,176=>500,177=>500,178=>500,179=>500,180=>500,181=>500,182=>500,183=>500,184=>500,185=>500,186=>500,187=>500,188=>500,189=>500,190=>500,191=>500,192=>500,193=>500,194=>500,195=>500,196=>500,197=>500,198=>500,199=>500,200=>500,201=>500,202=>500,203=>500,204=>500,205=>500,206=>500,207=>500,208=>500,209=>500,210=>500,211=>500,212=>500,213=>500,214=>500,215=>500,216=>500,217=>500,218=>500,219=>500,220=>500,221=>500,222=>500,223=>500,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500,230=>500,231=>500,232=>500,233=>500,234=>500,235=>500,236=>500,237=>500,238=>500,239=>500,240=>500,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>500,248=>500,249=>500,250=>500,251=>500,252=>500,253=>500,254=>500,255=>500); -$diff=''; -$originalsize=5172084; -$enc='UniGB-UTF16-H'; -$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'GB1','Supplement'=>2); -include(dirname(__FILE__).'/uni2cid_ag15.php'); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/courier.php b/include/limesurvey/admin/classes/tcpdf/fonts/courier.php deleted file mode 100644 index d6ab661c..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/courier.php +++ /dev/null @@ -1,33 +0,0 @@ -600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600, -10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600, -20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600, -30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600, -40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600, -50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600, -60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600, -70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600, -80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600, -90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600, -100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600, -109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600, -118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600, -127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600, -136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600, -145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600, -154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600, -163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600, -172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600, -181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600, -190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600, -199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, -208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600, -217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600, -226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600, -235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600, -244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600, -253=>600,254=>600,255=>600); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/AUTHORS b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/AUTHORS deleted file mode 100644 index 66b7e445..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/AUTHORS +++ /dev/null @@ -1,44 +0,0 @@ -Adrian Schroeter -Andrey Valentinovich Panov -Ben Laenen -Besarion Gugushvili -Bhikkhu Pesala -Clayborne Arevalo -Dafydd Harries -Danilo Segan -Davide Viti -David Jez -David Lawrence Ramsey -Denis Jacquerye -Dwayne Bailey -Eugeniy Meshcheryakov -Gee Fung Sit -Heikki Lindroos -James Cloos -James Crippen -John Karp -Keenan Pepper -Lars Naesbye Christensen -Mashrab Kuvatov -Max Berger -Mederic Boquien -Michael Everson -Misu Moldovan -Nguyen Thai Ngoc Duy -Nicolas Mailhot -Ognyan Kulev -Ondrej Koala Vacha -Peter Cernak -Remy Oudompheng -Roozbeh Pournader -Sahak Petrosyan -Sander Vesik -Stepan Roh -Stephen Hartke -Tavmjong Bah -Tim May -Valentin Stoykov -Vasek Stodulka -Wesley Transue - -$Id: AUTHORS 2162 2007-12-27 12:39:07Z ben_laenen $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/BUGS b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/BUGS deleted file mode 100644 index 49b36de5..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/BUGS +++ /dev/null @@ -1,3 +0,0 @@ -See http://dejavu.sourceforge.net/wiki/index.php/Bugs - -$Id: BUGS 80 2004-11-13 13:12:02Z src $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/LICENSE b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/LICENSE deleted file mode 100644 index 254e2cc4..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/LICENSE +++ /dev/null @@ -1,99 +0,0 @@ -Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. -Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) - -Bitstream Vera Fonts Copyright ------------------------------- - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is -a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute the -Font Software, including without limitation the rights to use, copy, merge, -publish, distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to the -following conditions: - -The above copyright and trademark notices and this permission notice shall -be included in all copies of one or more of the Font Software typefaces. - -The Font Software may be modified, altered, or added to, and in particular -the designs of glyphs or characters in the Fonts may be modified and -additional glyphs or characters may be added to the Fonts, only if the fonts -are renamed to names not containing either the words "Bitstream" or the word -"Vera". - -This License becomes null and void to the extent applicable to Fonts or Font -Software that has been modified and is distributed under the "Bitstream -Vera" names. - -The Font Software may be sold as part of a larger software package but no -copy of one or more of the Font Software typefaces may be sold by itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME -FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING -ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE -FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font Software -without prior written authorization from the Gnome Foundation or Bitstream -Inc., respectively. For further information, contact: fonts at gnome dot -org. - -Arev Fonts Copyright ------------------------------- - -Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the fonts accompanying this license ("Fonts") and -associated documentation files (the "Font Software"), to reproduce -and distribute the modifications to the Bitstream Vera Font Software, -including without limitation the rights to use, copy, merge, publish, -distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to -the following conditions: - -The above copyright and trademark notices and this permission notice -shall be included in all copies of one or more of the Font Software -typefaces. - -The Font Software may be modified, altered, or added to, and in -particular the designs of glyphs or characters in the Fonts may be -modified and additional glyphs or characters may be added to the -Fonts, only if the fonts are renamed to names not containing either -the words "Tavmjong Bah" or the word "Arev". - -This License becomes null and void to the extent applicable to Fonts -or Font Software that has been modified and is distributed under the -"Tavmjong Bah Arev" names. - -The Font Software may be sold as part of a larger software package but -no copy of one or more of the Font Software typefaces may be sold by -itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL -TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the name of Tavmjong Bah shall not -be used in advertising or otherwise to promote the sale, use or other -dealings in this Font Software without prior written authorization -from Tavmjong Bah. For further information, contact: tavmjong @ free -. fr. - -$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/NEWS b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/NEWS deleted file mode 100644 index 07e2c336..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/NEWS +++ /dev/null @@ -1,1147 +0,0 @@ -Changes from 2.26 to 2.27 - -* added some of Michael Everson's new Cyrillic glyphs to Sans (by Wesley - Transue) -* removed blank glyph at U+05EF from Sans Bold Oblique (by Gee Fung Sit) -* small adjustments to existing tone bars in Sans and Mono (by Gee Fung Sit) -* added U+0372-U+0373, U+0376-U+0377, U+03CF, U+A668-U+A66E, U+A708-U+A711, - U+A71B-U+A71F to Sans (by Gee Fung Sit) -* copied U+02E5-U+02E9 over from Sans to fix inconsistencies in Serif (by Gee - Fung Sit) -* added U+021C-U+021D, U+0370-U+0371, U+037B-U+037D, U+0470-U+0471, - U+0510-U+0515, U+051A-U+051D, U+1E9F, U+2C64, U+2C6E-U+2C6F, U+2C79, - U+2C7C-U+2C7D, U+A644-U+A647, U+A650-U+A651, U+A654-U+A657, U+A708-U+A716, - U+A71B-U+A71F to Serif (by Gee Fung Sit) -* added U+A708-U+A716, U+A71B-U+A71F to Mono (by Gee Fung Sit) -* added anchors to U+017F (ſ) and fixed U+1E9B (ẛ) in Serif (by Gee Fung Sit) -* made U+0325 smaller in Sans Bold and Serif to match Sans Book (by Gee Fung - Sit) -* fixes to U+02F3 (moved up), U+228F-U+2294 (more square-like) and - U+22CE-U+22CF (stroke width) in Sans (by Gee Fung Sit) -* replaced U+2202 ∂ (Sans and Mono) and U+221D ∝, U+221E ∞ (Sans) with glyphs - from Arev (with small changes) (by Gee Fung Sit) -* added U+22B0-U+22B1, U+22C7, U+22D0-U+22D5 from Arev to Sans to complete the - block (by Gee Fung Sit) -* added U+0514-U+0515 to Sans ExtraLight (by Gee Fung Sit) -* skewed U+A78C in all Oblique/Italic fonts (by Gee Fung Sit) -* moved U+2215 to U+2044 in Sans and Serif and replaced U+2215 with reference - to U+002F in all fonts (by Gee Fung Sit) -* added U+2C6E to Mono (by Denis Jacquerye) -* added U+A782 and U+A783 in Sans (by Wesley Transue) -* added U+0244, U+024C-024D, U+2C64 in Sans Mono (by Denis Jacquerye) -* modified U+01AE in Sans Mono (by Denis Jacquerye) -* added U+2C7A to all fonts (by Gee Fung Sit) -* italicized/small changes to U+2C76 in Serif (Bold) Italic (by Gee Fung Sit) -* improved outlines of U+2C68, U+2C6A, U+2C6C in Serif (Bold) Italic (by Gee - Fung Sit) -* rounded U+2C77 at the bottom in Serif (by Gee Fung Sit) -* added joining behavior for tone letters (U+02E5-U+02E9) in Sans (bug #15669) - (by Gee Fung Sit) -* fixed outline of y.alt in Sans Regular (by Denis Jacquerye) -* changed references of U+1D5A8, U+1D5C5, U+1D5DC, U+1D5F9, U+1D610, U+1D62D, - U+1D644 and U+1D661 to stylistic alternates to have a better distinction (by - Gee Fung Sit) -* hinted I.alt in Sans Regular (by Gee Fung Sit) -* added U+0487, completing Cyrillic block (by Gee Fung Sit) -* extended the bar of U+0463 to the right and moved the anchor (by Gee Fung - Sit) -* added anchors to glyphs in Cyrillic block (by Gee Fung Sit) -* added (preliminary) hints to tone letter forms (U+02E5.5, U+02E9.1, stem) in - Sans Book (by Gee Fung Sit) - -Changes from 2.25 to 2.26 - -- added glyphs for Cyrillic-B to Sans (by Wesley Transue) -- added U+0370-U+0371 to Sans (by Wesley Transue) -- added U+019C, U+01A2-U+01A3, U+01A6, U+01E4-U+01E5, U+024C-U+024D, U+0285, - U+0290, U+02A0, U+0370-U+0371, U+03F1, U+03FC to Sans ExtraLight (by Wesley - Transue) -- added U+20A0-U+20A5, U+20A7-U+20B3, U+2105, U+210D, U+210F, U+2115, U+2117, - U+2119-U+211A, U+211D, U+2124, U+212E, U+2200-U+2204 to Mono (by Heikki - Lindroos) -- added U+01BA and U+01BF to Mono (by Heikki Lindroos) -- merged OpenType "aalt" feature in Latin in Sans (by Denis Jacquerye) -- added alternative shape for y in Sans (by Denis Jacquerye) -- added saltillo (U+A78B-U+A78C) to all faces (by James Cloos) -- changed U+047C-U+047D to references instead of outlines in Sans (by Wesley - Transue) -- added Latin letter tresillo U+A72A-U+A72B to Sans (by Wesley Transue) -- added U+A734-U+A737 to Sans (by Wesley Transue) -- added U+2053 to Serif and fixed it bug:9425 in Sans (by Gee Fung Sit) -- removed problematic hints for U+0423 bug:10025 (by Gee Fung Sit) -- added U+27C5-U+27C6 bug:10255 to all faces (by Gee Fung Sit) -- fixed width of U+2016 in Sans Oblique (by Gee Fung Sit) -- added U+2016, U+2032-U+2038, U+2042, U+2045-U+2046, U+204B-U+204F, - U+2051-U+2052, U+2057 to Serif (by Gee Fung Sit) -- made U+2140 bigger to match other n-ary operators (by Gee Fung Sit) -- added U+0606-U+0607, U+0609-U+060A to Sans (by Gee Fung Sit) -- added U+221B-U+221C to Mono (by Gee Fung Sit) -- small adjustments to U+221B-U+221C in Sans and Serif (by Gee Fung Sit) -- update U+04B4-U+04B5 in Serif (by Andrey V. Panov) -- increased max-storage value from maxp table to 153 (by Andrey V. Panov) -- added U+0472-U+0473, U+0510-U+0511, U+051A-U+051D, U+0606-U+0607, - U+0609-U+060A, U+1E26-U+1E27, U+1E54-U+1E55, U+1E7C-U+1E7D, U+1E8C-U+1E8D, - U+1E90-U+1E91, U+1E97-U+1E99, U+1E9F, U+1EAC-U+1EAD, U+1EB6-U+1EB7, - U+1EC6-U+1EC7, U+1ED8-U+1EDD, U+1EE0-U+1EE3, U+1EE8-U+1EEB, U+1EEE-U+1EF1 to - Mono (by Gee Fung Sit) -- added locl rules for S/T cedilla for Romanian and Moldavian so they get - rendered as S/T with comma accent (see Redhat bug #455981) (by Ben Laenen) -- removed ligature rule from Armenian U+0587 bug:16113 (by Gee Fung Sit) - -Changes from 2.24 to 2.25 - -- moved/added U+2E18 (by Gee Fung Sit) -- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit) -- added U+22CE-U+22CF to Sans (by Gee Fung Sit) -- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye) -- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit) -- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen) -- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov) -- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit) -- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen) -- added U+2E2E to Sans (by Gee Fung Sit) -- replaced U+2699 with simpler version in Sans (by Gee Fung Sit) -- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue) -- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit) -- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye) -- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue) -- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit) -- added several glyphs to Sans ExtraLight (by Gee Fung Sit) -- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue) -- corrected width of U+027E in Sans Book (by Gee Fung Sit) -- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit) -- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit) -- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov) -- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov) -- further improvements in extended Cyrillic (by Andrey V. Panov) - -Changes from 2.23 to 2.24 - -- instructions for U+05C0 ׀, U+05C3 ׃, U+05F3 ׳, and U+05F4 ״ in DejaVu - Sans. (by Wesley Transue) -- instructions for U+2116 in Sans (by Andrey V. Panov) -- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added - U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by - Denis Jacquerye) -- updated and instructed U+0401 in Sans (by Andrey V. Panov) -- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction. - Also, added a few more glyph instructions. (by Wesley Transue) -- removed OS2Sub and OS2Strike that weren't intentional in Sans - ExtraLight. (by Denis Jacquerye) -- updated instructions for U+401, U+44F in Serif Book. (by Andrey V. - Panov) -- instructions for U+02C4 ˄, U+02C5 ˅, U+03D8 Ϙ, U+03D9 ϙ, U+0494 Ҕ, and - U+0495 ҕ in Sans Book. (by Wesley Transue) -- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆ - in Sans Book. (by Wesley Transue) -- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and - U+451 using code generated with xgridfit (by Andrey V. Panov) -- instructions for a few glyphs in the Latin Extended-B Block, Greek - Block, Cyrillic Block, and N'Ko block. (by Wesley Transue) -- updated sfdnormalize.pl, and SFD files to new SFD format with empty - lines. (by Denis Jacquerye) - -Changes from 2.22 to 2.23 - -- fixed bug which made Condensed fonts appear instead of normal width ones -- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader) -- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF, - U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF, - U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by - Wesley Transue) -- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue) -- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by - Wesley Transue) -- added mathematical alphanumeric symbols to all styles (by Max Berger) -- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh - Pournader) -- dereferenced all glyphs with mixed references and outlines (by Denis - Jacquerye) -- removed non-zero width from U+0344 in Sans (by Denis Jacquerye) - -Changes from 2.21 to 2.22 - -- directory structure has changed, we now use the Makefile -- modified Armenian U+0565 in Sans (by Սահակ Պետրոսյան) -- added double struck letters and numbers U+2102, U+210D, U+2115, - U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539, - U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B, - U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke) -- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to - Serif (by Ben Laenen) -- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen) -- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1; - supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975, - U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen) -- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09, - U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye) -- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye) -- added Ogham in Sans (by Wesley Transue) -- added Yijing Hexagram Symbols in Sans (by Wesley Transue) -- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD, - U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by - Wesley Transue) -- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462, - U+048C-U+048D in Serif (by Andrey V. Panov) -- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue) -- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben - Laenen) -- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen) -- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214, - U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben - Laenen) -- modified bullet symbol U+2219 in Serif (by Ben Laenen) - -Changes from 2.20 to 2.21 - -- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye) -- added anchor "half" to position right half of double marks, U+FE21 or U+FE23 - to Sans (by Denis Jacquerye) -- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis - Jacquerye) -- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by - Denis Jacquerye) -- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy - Meshcheryakov) -- added instructions to some N'Ko glyphs (by Wesley Transue) -- added instructions to some Lao glyphs (by Wesley Transue) -- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by - Denis Jacquerye) -- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov) -- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen) -- added Makefile to improve font and packages generating (by Nicolas Mailhot) - -Changes from 2.19 to 2.20 - -- removed TeX and TeXData tags from all sfd files (by Eugeniy Meshcheryakov) -- removed all 'frac' lookups (by Eugeniy Meshcheryakov) -- fixed duplicate glyph names (by Eugeniy Meshcheryakov) -- removed standard ligatures with U+00B7 in Mono (by Eugeniy Meshcheryakov) -- use reference to U+002D in U+00AD in Sans Oblique, and adjust instructions - (by Eugeniy Meshcheryakov) -- updated Cyrillic in Sans Extra Light (by Andrey V. Panov) -- added instructions to N'Ko U+07C1-U+07C6, U+07CA, U+07CE-U+07CF, U+07D1, - U+07D3-U+07D4, U+07D8, U+07DB and U+07EB in Sans (by Wesley Transue) -- added instructions to Lao U+0E8A, U+0E95, U+0E97, U+EA5, U+0EB4 and U+0EB5 - (by Wesley Transue) -- adjusted instructions for Hebrew glyphs (by Denis Jacquerye) -- added instructions for U+0265 in Sans Bold (by Denis Jacquerye) -- fix U+1D68 in Sans: it had the shape of delta, where it should be a rho (by - Ben Laenen) -- remove U+1D5C glyph in Sans Oblique (it was empty) (by Ben Laenen) -- fix instructions of U+01AD in Sans Bold (by Ben Laenen) -- fix instructions of U+042D in Serif (by Ben Laenen) -- remove buggy instructions of U+2328 in Serif (by Ben Laenen) -- corrected width of U+2C75-U+2C76 in Sans Bold and Serif Bold (by Gee Fung Sit) -- added U+2C75-U+2C77 to Mono (by Gee Fung Sit) - -Changes from 2.18 to 2.19 - -- fixed misplaced symbols (U+2325,2326) in Sans Oblique (by John Karp) -- added Mark to Base anchors: 'cedilla' for combining cedilla and - 'above-legacy' for stacking above precomposed glyphs (just a,e,i,o,u with - macron for now) in Sans (by Denis Jacquerye). -- added contextual substitution for Case and Dotless forms in all Sans variants - (by Denis Jacquerye). -- renamed 'ccmp' lookups for RTL and Basic (LGC, etc.) (by Denis Jacquerye) -- added anchor 'cedilla' for vowels in Sans. (by Denis Jacquerye) -- extended contextual dotless and case substitutions to handle both below and - above diacritics (by Denis Jacquerye) -- renamed Dotless and Case Form GSUB lookups in Sans with meaningful names (by - Denis Jacquerye) - -Changes from 2.17 to 2.18 - -- Re-encoded the source files for Full Unicode (by Ben Laenen) -- Re-enabled the "ff", "fl", "fi", "ffl", "ffi" ligatures by default in Serif - (by Ben Laenen) -- Disabled the "fi", "ffi" ligatures for languages with dotless i in Serif (by - Ben Laenen) -- added Tifinagh to Sans Book and Bold, U+2D30-U+2D65, U+2D6F, partially hinted - in Sans Book. (by Denis Jacquerye) -- added Tai Xuan Jing Symbols (U+1D300-1D356) to Sans (by Remy Oudompheng) -- added double-struck letters (U+1D538-U+1D56B minus reserved code points) to - Sans (by Gee Fung Sit) -- added U+22EE-U+22F1 to Sans (by Gee Fung Sit) -- added U+2C67-U+2C6C, U+2C75-U+2C77 to Serif (by Gee Fung Sit) -- italicized various glyphs in Latin Extended-B, IPA Extensions, Spacing - Modifier Letters, Phonetic Extension (Supplement) and Super- and Subscripts - in Serif Oblique fonts (by Gee Fung Sit) -- modified outlines, bearings of Hebrew U+05D6, U+05D8, U+05DB, U+05DE, U+05E0, - U+05E1, U+05E2, U+05EA in Sans Book and Oblique, adjusted hinting in Book - based on Yotam Benshalom's comments. (by Denis Jacquerye) -- added Braille Patterns (U+2800-U+28FF) to Serif fonts (by Gee Fung Sit) -- added N'Ko to Sans Book and Bold: U+07C0-U+07E7, U+07EB-U+07F5, U+07F8-U+07FA - (by Eugeniy Meshcheryakov) -- added U+0ED8 (Lao digit 8) to Sans (by Remy Oudompheng) -- added Lao diacritics U+0EB0-0EB9, U+0EBB-0EBC, U+0EC8-0ECD to Mono (by Remy - Oudompheng) -- renamed Serif [Bold] Oblique, make it Italic (by Eugeniy Meshcheryakov) -- added U+29FA-U+29FB to Sans and Sans Mono (by Gee Fung Sit) -- swapped glyphs for Eng U+014A from Sami Eng to African Eng, the latter being - more common (by Denis Jacquerye) -- swapped ae U+00E6 and ae.alt in Serif Italics fonts, thus fixing #8213 (by - Denis Jacquerye) -- minor improvements to Misc. Symbols in Sans (by Gee Fung Sit) -- minor improvements and additions to Sans ExtraLight (by Gee Fung Sit) -- improved instructions for various Cyrillic letters (by Eugeniy Meshcheryakov) -- fixed hinting of theta and chi in Sans Book (by Ben Laenen) -- added Georgian Mkhedruli to Sans, Serif and Mono, ASumtavruli to Sans and - Serif (by Besarion Gugushvili) - -Changes from 2.16 to 2.17 - -- Sans fonts: fix position for certain combinations of Arabic fatha, kasra, - shadda, damma, kasratan, dammatan, fathatan and hamza (by Ben Laenen) -- added 'ae.alt' to Serif Oblique fonts, with design matching shape of italic - 'a' instead of slanted 'a', see bug #8213 (by Denis Jacquerye) -- added super- and subscripts to Serif and Mono: U+1D2C-U+1D2E, U+1D30-U+1D3C, - U+1D3E-U+1D42, U+1D62-U+1D65, U+1D78, U+2071, U+207A-U+207E, U+208A-U+208E, - U+2090-U+2094 (by Gee Fung Sit) - -Changes from 2.15 to 2.16 - -- fixed hinting instructions for digits in DejaVu Sans Oblique, Bold Oblique, - and Serif Book to not change glyph width (by Eugeniy Meshcheryakov) -- added instructions for U+0404, U+0411, U+0413, U+0414, U+0417-U+041B, U+041F, - U+0423, U+0424, U+0426-U+0429, U+042C, U+042E, U+042F, U+0490 in Serif Bold - (by Eugeniy Meshcheryakov) -- added U+0220 and Eng.alt to Serif fonts (by Denis Jacquerye) -- added U+232C, U+2394, U+23E3 to Sans fonts (by John Karp) -- added U+230C-U+230F, U+231C-U+231F to Sans fonts, fixing bug:9547 - (by John Karp) -- adjusted dot below, dot above, dieresis above, dieresis below in Sans fonts - (by Denis Jacquerye) -- added U+2300, U+2301, U+2303, U+2304, U+2305, U+2307, U+2326, U+2327, U+232B, - arrow.base to Sans fonts (by John Karp) -- adjusted dot and dieresis below and above in Serif fonts (by Denis Jacquerye) -- added U+1E1C-U+1E1D to Serif fonts (by Denis Jacquerye) -- added U+22BE, U+22BF (by Wesley Transue) -- added U+2324; modified U+2325: more standard proportions, and matches U+2324 - and U+2387; added U+2387 : flipped U+2325 with standard arrowhead - (by John Karp) -- added Lao digits U+0ED0-0ED7, U+0ED9 (by Remy Oudompheng) -- added to Mono in Arabic block : U+060C, U+0615, U+061B, U+061F, - U+0621-U+063A, U+0640-0655, U+065A, U+0660-066F, U+0674, U+0679-0687, U+0691, - U+0692, U+0698, U+06A1, U+06A4, U+06A9, U+06AF, U+06B5, U+06BA, U+06BE, - U+06C6, U+06CC, U+06CE, U+06D5, U+06F0-06F9 (by Remy Oudompheng) -- added to Mono in Arabic Presentations Forms-A : U+FB52-FB81, U+FB8A-FB95, - U+FB9E, U+FB9F, U+FBAA-FBAD, U+FBE8, U+FBE9, U+FBFC-FBFF (by Remy Oudompheng) -- added to Mono in Arabic Presentations Forms-B : U+FE70-FE74, U+FE76-FEFC, - U+FEFF (by Remy Oudompheng) -- added U+05BA, U+05BE, U+05F3, U+05F4, U+FB1E, U+FB21-U+FB28, U+FB4F to Sans - (by Eugeniy Meshcheryakov) -- added U+2102 to Mono (by Eugeniy Meshcheryakov) -- added U+2983-U+2984 to Sans (by Gee Fung Sit) -- added U+2A2F to Sans, Serif and Mono (by Gee Fung Sit) -- added U+2373-2375, U+237A to Sans (by John Karp) -- converted kern pairs to kern classes with Tavmjong Bah's scripts - (by Denis Jacquerye) -- set ScriptLang of kerning classes to just latn because of Pango bug - (by Denis Jacquerye) -- added DNK to ScriptLang latn otherwise it is excluded, and SRB and MDK to - cyrl (by Denis Jacquerye) -- removed flag 0x80 in generate.pe, otherwise it generates kerning tables some - systems don't like; thus loosing Apple tables (by Denis Jacquerye) -- removed ligature for precomposed legacy characters of Sans Oblique fonts - (by Denis Jacquerye) -- added bearings to en dash U+2013, em dash U+2014 and figure dash U+2012 - by making dashes shorter, preserving character width (by Denis Jacquerye) -- reduced U+031C, U+0325 (ring below), U+0339 to be entirely visible; - added instructions in Sans Book; changed U+1e00-U+1e01 to use new ring below - (by Denis Jacquerye) -- adjusted circumflex below on U+1E12-U+1E13, U+1E18-U+1E19, U+1E3C-U+1E3D, - U+1E4A-U+1E4B, U+1E70-U+1E71, U+1E76-U+1E77 in Sans fonts (by Denis Jacquerye) -- Added U+0ED4, U+0ED5 to DejaVu Sans (by Remy Oudompheng) -- Lao-specific anchors (by Remy Oudompheng) -- added alternate I to match the small capital in Sans (by Gee Fung Sit) - -Changes from 2.14 to 2.15 - -- improved hinting in Sans Oblique to deal with some spacing and inconsistency - issues (by Ben Laenen) -- added anchors to Mono Book, and added GPOS rules for combining diacritics to - show up as zero width glyphs (by Ben Laenen) -- removed U+F21C (PUA), it was copy of U+2C64 from Latin Extended C (by Eugeniy - Meshcheryakov) -- added U+27E6-U+27E7 to Sans (by Gee Fung Sit) -- added U+1407, U+1409, U+140C-U+141B, U+141D-U+1425, U+1427-U+142E, - U+1435-U+1438, U+143A-U+1449, U+1452, U+1454, U+1457-U+1465, U+1467-U+146A, - U+1471, U+1474-U+1482, U+1484-U+1488, U+148F, U+1492, U+14A0, U+14A2, U+14A9, - U+14AC-U+14BA, U+14BC, U+14BD, U+14C6, U+14C9-U+14CF, U+14D1, U+14D2, U+14D9, - U+14DC-U+14E9, U+14EC, U+14F3, U+14F6-U+1504, U+1506, U+1507, U+1510-U+1525, - U+152C, U+152F-U+153D, U+1540, U+1541, U+154E, U+154F, U+1552, U+155B, U+155C, - U+1568, U+1569, U+1574-U+157B, U+157D, U+15A7-U+15AE, U+1646, U+1647 (by - Eugeniy Meshcheryakov) -- fixed several contours to not intersect, use horizontal or vertical tangents, - use integer coordinates, etc in Sans Book (by Denis Jacquerye) -- added U+0496-U+0497 in Serif (by Andrey V. Panov) - -Changes from 2.13 to 2.14 - -- added Philippine peso glyph U+20B1 (by Clayborne Arevalo) -- made U+2012 have the same width as digits, according to Unicode 5.0, - page 206 (by Roozbeh Pournader) -- made all of the "above" combining characters remove the dot of "i", - "j", etc (Soft_Dotted characters), according to Unicode 5.0, - page 228 (by Roozbeh Pournader) -- made U+012F, U+03F3, U+0456, U+0458, U+1E2D, and U+1ECB (all fonts - except Mono), U+0249, U+2148, and U+2149 (Sans and Sans Condensed), - U+0268 (Sans ExtraLight, Serif and Serif Condensed), and U+029D (Serif - and Serif Condensed) respect the Soft_Dotted property (by Roozbeh - Pournader) -- added U+223E, U+223F, U+2240, U+22C2, U+22C3 to Sans (by Remy Oudompheng) -- added U+203D to Serif (by Gee Fung Sit) -- added zero-width glyphs for U+2061-U+2063 to Sans and Serif (by Gee - Fung Sit) -- changed isolated forms of Arabic waw (U+0648, U+0624 and U+06C6) (bug #9432) - (by Ben Laenen) -- added Lao consonants U+0E81, U+0E82, U+0E84, U+0E87, U+0E88, U+0E8A, - U+0E8D, U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA, - U+0EAB, U+0EAD-0EAF to Sans Mono (by Remy Oudompheng) -- added U+0200-U+0217, U+0226-U+0229, U+02F3, U+1E00-U+1E07, - U+1E0A-U+1E0B, U+1E18-U+1E1F, U+1E22-U+1E23, U+1E28-U+1E2D, - U+1E3A-U+1E3B, U+1E40, U+1E48-U+1E49, U+1E56, U+1E58-U+1E59, - U+1E5E-U+1E5F, U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, U+1E72-U+1E77, - U+1E86-U+1E8B, U+1E92-U+1E96, U+1EA0-U+1EA1, U+1EF4-U+1EF5 to Mono - (by Ben Laenen) -- renamed uppercase variants of diacritics (macron, breve, double grave, - double acute, inverted breve, dot above) to "uni03XX.case" in Mono - (by Ben Laenen) -- moved uppercase variants of diacritics up in Mono so they properly - vertically align on capitals (by Ben Laenen) -- precomposed glyphs with macron, breve, double grave, double acute, - inverted breve, dot above, macron below, breve below, inverted breve - below, dot below, cedilla, caron below, circumflex below, diaeresis - below, tilde below now reference to combining diacritics instead of - space modifiers in Mono (by Ben Laenen) -- made ring below (U+0325), and half rings below (U+031C and U+0339) - smaller in Mono (by Ben Laenen) -- added U+205F to all fonts (by Roozbeh Pournader) -- added U+035E-U+035F to Sans (by Roozbeh Pournader) -- added empty glyphs for U+034F, U+202A-U+202E, U+2060, U+206A-206F, - U+FE00-U+FE0F to non-Mono fonts (by Roozbeh Pournader) -- added U+2101, U+2107-U+2108, U+210B, U+210C, U+2110, U+2112, U+211B, - U+211F, U+2123, U+2125, U+2128-U+2129, U+212C-U+212D, U+212F, - U+2130-U+2131, U+2133, U+2136-U+213A, U+2141-U+2144, U+2B00-U+2B11, - U+2B20-U+2B23 to Sans (by John Karp) -- reshaped omega (U+03C9) in Mono (by Ben Laenen) -- added U+2205, U+22C6, U+2300-U+2301, U+2303-U+2306, U+230C-U+230F, - U+2312-U+2315, U+231C-U+231F, U+2335, U+2337-U+233E, U+2341-U+2344, - U+2347-U+2348, U+234B-U+234D, U+2349-U+2350, U+2352-U+2354, - U+2357-U+2359, U+235A-U+235C, U+235E-U+2360, U+2363-U+2365, - U+2368-U+2369, U+236B-U+2370, U+2373-U+237A, U+2380-U+2383, - U+2388-U+238B, U+2395 in Mono (by Ben Laenen) - -Changes from 2.12 to 2.13 - -- adjusted U+0198B, U+01B3-U+01B4 in Sans, hinted U+01B4 in Sans Book - (by Denis Jacquerye) -- added U+27F0-U+27FF, U+2906-U+2907, U+290A-U+290B, U+2940-U+2941 to Sans - (by Denis Jacquerye) -- added U+01E6-U+01E9, U+01EE-U+01EF, U+01F4-U+01F5, U+01FC-U+01FF, - U+021E-U+021F, U+0245, U+02BD, U+02C9, U+1E9B, U+2045-U+2046, U+2213, U+22C5, - U+22EF to Sans Mono (by Roozbeh Pournader) -- added U+04FA-U+04FD to Sans (by Michael Everson) -- removed U+2329 and U+232A because of their CJK properties, added U+27E8 - and U+27E9 in their stead, fixing part of bug #9038 (by Roozbeh Pournader) -- corrected and improvised U+0466-U+0469, U+046E-U+0471, U+047C-U+047D, U+0482, - U+0484-U+0486, U+0492-U+0493, U+04B0-U+04B1, U+050C-U+050D, and U+204A - in Sans (by Michael Everson) -- added instructions for U+0402, U+0409, U+040A, U+040B, U+044D, U+040F, - U+0452, U+0459-U+045B, U+045F to Sans Book (by Eugeniy Meshcheryakov) -- made italic shape for U+431, U+432, U+437, U+43B, U+43C, U+43D, U+444, U+447, - U+44D, U+44F, U+459, U+45A in SerifOblique and SerifBoldOblique - (by Andrey V. Panov) -- modified U+024C to match glyph in Unicode chart, fixing bug #9039 - (by Denis Jacquerye) -- made some canonically equivalent characters share the same glyph: - U+02B9 = U+0374, U+0343 = U+0313, and U+0387 = U+00B7 also adjusting U+02BA - to look like double U+02B9, fixing parts of bug #9038 (by Roozbeh Pournader) -- changed shapes for U+0478 and U+0479 in Sans to those in the Unicode charts, - based on a recent decision by Unicode Technical Committee to only use - the digraph form (by Michael Everson) -- adjusted width of NBSP U+00A0 and NNBSP U+202F, fixing bug #8401 - (by Denis Jacquerye) -- fixed several contours to not intersect, use horizontal or vertical tangents, - use integer coordinates, etc (by Roozbeh Pournader and Denis Jacquerye) -- added U+1402, U+1430, U+144D, U+146C, U+148A, U+14A4, U+14C1, U+14D4, U+14EE, - U+1527, U+1545, U+157E, U+158E, U+15AF to Sans (by Eugeniy Meshcheryakov) -- enlarged width of U+459 and U+45A in Serif (by Andrey V. Panov) -- made traditional shape for U+452, U+45B (by Andrey V. Panov) -- added euro sign U+20AC to Sans ExtraLight, making fontconfig recognize - the font as supporting English (by Denis Jacquerye) - -Changes from 2.11 to 2.12 - -- added U+0180 to Serif (by Denis Jacquerye) -- improved and/or hinted Armenian letters U+0542, U+0546, U+0562, - U+0563, U+0564, U+0577, U+0582 in Sans (by Ben Laenen) -- added U+4FE-U+4FF, U+512-U+513, U+2114, U+214E, U+26B2 to Sans - (by Gee Fung Sit) -- adjusted U+0496-U+0497, U+049A-U+04A1 in Sans to match U+0416, - U+041A, U+0436 and U+043A (by Gee Fung Sit) -- Mathematical Operators in Sans: changed U+22C0-U+22C1 to match - other n-ary operators, adjusted U+2203-U+2204, changed U+2220 in - Sans to match the style of U+2221 (by Gee Fung Sit) -- added U+1401, U+1403-U+1406, U+140A, U+140B, U+1426, U+142F, - U+1431-U+1434, U+1438, U+1439, U+1449, U+144A, U+144C, - U+144E-U+1451, U+1455, U+1456, U+1466, U+146B, U+146D-U+1470, - U+1472, U+1473, U+1483, U+1489, U+148B-U+148E, U+1490, U+1491, - U+14A1, U+14A3, U+14A5-U+14A8, U+14AA, U+14AB, U+14BB, U+14C0, - U+14C2-U+14C5, U+14C7, U+14C8, U+14D0, U+14D3, U+14D5-U+14D8, - U+14DA, U+14DB, U+14EA, U+14ED, U+14EF-U+14F2, U+14F4, U+14F5, - U+1405, U+1526, U+1528-U+152B, U+152D, U+152E, U+153E, - U+1542-U+1544, U+1546-U+154D, U+1550, U+1553, U+1555-U+155A, - U+1567, U+156A, U+157C, U+157F-U+1585, U+158A-U+158D, - U+158F-U+1596, U+15A0-U+15A6, U+15DE, U+15E1, U+166E-U+1676 to - Sans (by Eugeniy Meshcheryakov) -- re-enabled Latin ligatures fi, ffi, fl, ffl and ff in Sans - (by Ben Laenen) -- made italic shape for U+436, U+44A, U+44B, U+44C, U+44E, U+45F, - U+463 in SerifOblique and SerifBoldOblique (by Andrey V. Panov) -- fixed sub- and superscript metrics in Condensed Sans (bug #8848) - (by Ben Laenen) -- added U+474, U+475 in Serif (by Andrey V. Panov) -- hinted Greek glyphs U+03B7, U+30B8, U+03B9, U+03C1, U+03C3, - U+03C6 in Mono Book (by Ben Laenen) - -Changes from 2.10 to 2.11 - -- added instructions for Hebrew glyphs (Sans Book, by Eugeniy - Meshcheryakov) -- changed U+01A6 (Latin Yr) after bug #8212, in Sans, Serif and - Sans Mono fonts (by Denis Jacquerye). -- removed instruction for U+2600-U+26A1 (by Mederic Boquien) -- added U+202F and set width of U+00A0 (nobreakingspace) to the - same as U+0020, space (by Denis Jacquerye). -- added and improved instructions for various Cyrillic letters - (by Eugeniy Meshcheryakov) -- Changed U+416, U+42F, U+427 (non-Bold), U+436, U+447 (non-Bold), - U+44F, U+437 (Bold), corrected U+40F, U+414, U+424, U+426, U+429, - U+434, U+438 (Bold), U+446, U+449, U+44D (non-Bold), U+45F in - Sans Mono (by Andrey V. Panov) -- made small corrections to Cyrillic, most appreciable to U+409, - U+413, U+41B, U+427 and U+433, U+434, U+43B, U+447, U+459 - (upright fonts) to Serif (by Andrey V. Panov) -- adjusted bearings of U+410, U+416, U+41A, U+42F, U+436, U+43A, - U+443, U+44F in Serif (by Andrey V. Panov) -- enlarged width of U+44A, U+44B, U+44C, U+463 in Serif - (by Andrey V. Panov) -- added ligature "iacute" as "afii10103" (U+456) "acutecomb" in - Serif (by Andrey V. Panov) -- made italic shape to U+446, U+448, U+449 in Serif (by Andrey V. - Panov) -- added "afii10831" (U+F6C7), "afii10832" (U+F6C8) in Serif (by - Andrey V. Panov) -- new minimum version of fontforge is 20061014 (by Ben Laenen) - -Changes from 2.9 to 2.10: - -- added U+0242, U+024A-U+024B, U+024E-U+024F, U+037C-U+037D, U+0E3F, - U+1D2C-U+1D2E, U+1D30-U+1D42, U+1D5D-U+1D6A, U+1D78, U+1DB8, - U+2090-U+2094, U+20D0-U+20D1, U+2C60-U+2C66, U+2C6B-U+2C6C, U+2C74 and - U+FB29 to Sans (by Gee Fung Sit) -- added Lao glyphs : U+0E81-0E82, U+E084, U+0E87-0E88, U+0E8A, U+0E8D, - U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA-0EAB, - U+0EAD-0EB9, U+0EBB-0EBD, U+0EC0-0EC4, U+0EC6, U+0EC8-0ECD, U+0EDC-0EDD - (by Remy Oudompheng) -- fixed U+0193 not showing in Windows (bug #7897) (by Ben Laenen) -- changes to U+222B-222D in Sans Mono (by Remy Oudompheng) -- ported the three remaining currency symbols from Arev (U+20B0, - U+20B2-U+20B3), and replaced one (U+20AF) in Sans (by Lars Naesbye - Christensen) -- corrected U+20A5 in Sans (by Gee Fung Sit) -- merged Double-Struck Letters from Arev: U+2102, U+210D, U+2115, - U+2119-U+211A, U+2124, U+213C-U+2140 (by Gee Fung Sit) -- added U+2308-U+230B and U+2329-U+232A to Sans Mono and Serif faces, - fixed incorrect direction of U+2329 in Sans faces, and improved - U+2308-U+230B in Sans faces per Ben Laenen's suggestions (by David - Lawrence Ramsey) -- added U+06D5 and final form of it (needed for Kurdish) (by Ben Laenen) -- added two special glyphs U+F000 and U+F001 in Sans Book that show the - current ppem size (horizontal and vertical) (by Ben Laenen) -- added U+2318 and U+2325 to Sans Mono faces, based on the Sans versions - (by David Lawrence Ramsey) -- added U+2B14-U+2B1A to all faces except Sans ExtraLight (by David - Lawrence Ramsey) -- respaced all Geometric Shapes characters in Serif faces to match those - in Sans faces again, respaced U+23CF in Sans, Sans ExtraLight, and - Serif faces to match U+25A0 (or Sans in Sans ExtraLight's case) again, - and respaced U+2B12-U+2B13 in Sans and Serif faces to match U+25A1 - again (by David Lawrence Ramsey) -- corrected width of Modifier Small Letters U+1D43-1D5B in Sans Oblique - and U+1D9B-U+1DBF in Sans Oblique and Sans Bold Oblique (by Gee Fung Sit) -- added a bunch of glyphs to Sans ExtraLight (see SVN for details) (by - Gee Fung Sit) -- adjusted Cyrillic descenders in Sans ExtraLight to sync with Sans (by - Gee Fung Sit) -- added U+0242, U+0245 to Serif (by Gee Fung Sit) -- replaced the SHPIX routines which gave them bad spacing at certain - sizes in FreeType for A, V, Z, v and z in Sans Bold (by Ben Laenen) - -Changes from 2.8 to 2.9: - -- DejaVuSansExtraLight.sfd: changed family name from "DejaVu Sans" to - "DejaVu Sans Light" (in case we add a Light weight variant), so legacy - apps that understand only 4 styles are happy. (by Denis Jacquerye) -- added Name ID 16, aka preferred family name, and Name ID 17, aka - preferred style name, so contemporary apps that understand more that 4 - styles can use big fonts families "DejaVu Sans" and "DejaVu Serif". For - those, Extralight and Condensed are just styles not different families. - (by Denis Jacquerye) -- added U+22B6-22BD, U+22C0-22C1, U+22D6-22D7 to Sans. (by Remy Oudompheng) -- added U+037B, U+2184, U+2C67-U+2C6A and U+2C75-U+2C77 to Sans (by Gee - Fung Sit) -- adjusted asteriskmath (U+2217) for consistency with other mathematical - operators in Sans (by Ben Laenen) -- hinted some Armenian capitals in Sans Book (by Ben Laenen) -- added U+0246 - U+0249 (by Ben Laenen) -- BUGFIX : swapped U+224E and U+224F, in Sans, Sans Condensed and Sans Mono - (by Remy Oudompheng) -- adjusted U+20B5 (by Mederic Boquien) -- swapped U+21DA and U+21DB which were in wrong order (by Heikki Lindroos) -- added U+222E-2233, U+239B-23AD, U+2A00-2A02, U+2A0F-2A1C to Sans (by Remy - Oudompheng) -- added U+239B-23AD to Mono (by Remy Oudompheng) -- added U+2024-2025 to Serif (by Mederic Boquien) -- added U+222C-222D, U+2A0C-2A0E to Serif (by Remy Oudompheng) -- added U+2190-21FF to Mono (by Heikki Lindroos) -- added Hebrew glyphs - U+05B0-U+05BD, U+05BF-U+05C3, U+05C6, U+05C7, - U+05D0-U+05EA, U+05F0-U+05F2, U+FB1F, U+FB20, U+FB2A-U+FB36, - U+FB38-U+FB3C, U+FB3E, U+FB40, U+FB41, U+FB43, U+FB44, U+FB46-U+FB4E (by - Gee Fung Sit and Eugeniy Meshcheryakov) -- adjustments for Cyrillic in Sans (by Andrey V. Panov) -- made italic shape for U+0434, U+0456, U+0457 in SerifOblique and Serif - Bold Oblique (by Andrey V. Panov) - -Changes from 2.7 to 2.8: - -- fixed instructions for U+0423, U+0427, U+0447, U+0448 in Serif, so they - look good at large sizes too (by Eugeniy Meshcheryakov) -- added U+FB00 and U+FB03 to U+FB06 to Serif typefaces (by Heikki Lindroos) -- added U+26B0-U+26B1, U+2701-U+2704, U+2706-U+2709, U+270C-U+2727, U+2729 - to U+274B, U+274D, U+274F to U+2752, U+2756, U+2758-U+275E, U+2761 to - U+2775 (by Heikki Lindroos) -- added and improved instructions for Cyrillic letters in Mono and Serif - (Book, by Eugeniy Meshcheryakov) -- rotated U+26B0 (was too small in mono) (by Gee Fung Sit) -- adjusted U+1EDA-U+1EDD, U+1EE8-U+1EEB, capitals using capital specific - accent and moved diacritics to match position on U+00F2 (ograve), etc. - (by Denis Jacquerye) -- added U+20D6, U+20D7 to Sans (by Gee Fung Sit) -- made Armenian ligatures discretionary since the Firefox ligature problem - still isn't fixed (by Ben Laenen) -- moved Armenian hyphen U+058A to a higher position (bug #7436) (by Ben - Laenen) -- hinted Greek glyphs in Sans Bold (by Ben Laenen) -- enabled Arabic lam-alif ligatures when diacritics are used (by Ben Laenen) - -Changes from 2.6 to 2.7: - -- added glyphs needed for Kurdish: U+0695, U+06B5, U+06C6, U+06CE and their - init/medi/fina forms in Sans (by Ben Laenen) -- added U+02CD, U+01F8 - U+01F9, U+1E3E - U+1E3F, U+1E30 - U+1E35, U+1EBC - - U+1EBD, U+1EF8 - U+1EF9 (includes glyphs needed for Yoruba, Maori, Guarani - and Twi) (by Ben Laenen) -- added U+22C8-22CC, U+29CE-29D5, U+2A7D-2AA0, U+2AAE-2ABA, U+2AF9-2AFA to - Sans (by Remy Oudompheng) -- adjusted diacritics on Vietnamese, Pinyin and other characters: - U+01A0-U+01A1, U+01AF-U+01B0, U+01D5-U+01DC, U+01DE-01E1, U+01FA-U+01FB - U+022A-U+022D, U+0230-U+0231, U+1E14-U+1E17, U+1E4C-U+1E53, U+1E78-U+1E7B, - U+1EA4-U+1EF1 in Sans (Book, Bold and Oblique) (by Denis Jacquerye) -- added basic arrows U+2190-U+2193 in Serif, which completes MES-1 compliance - for Serif (by Ben Laenen) -- added U+01E4, U+01E5, U+01FA, U+01FB, U+02BD, U+02C9 and U+02EE to Serif - (by Ben Laenen) -- fixed U+0209 in Serif Bold Oblique (by Ben Laenen) -- adjusted Box Drawing block characters U+2500-257F in Mono to fit character - cell, shifting them up by 416 (Denis Jacquerye) -- redid U+0194 in Sans (by Ben Laenen) -- added U+2217-2218, U+2295-22A1 to Mono (by Remy Oudompheng) -- added U+0462 to Serif (by Andrey V. Panov) -- added U+226C, U+228C-228E, U+2293-2294, U+22F2-22FF to Sans (by Remy - Oudompheng) -- adjusted U+2208-220D in Sans (by Remy Oudompheng) -- improved some Cyrillic glyphs in Mono (by Andrey V. Panov), rewritten - instructions for changed glyphs (by Eugeniy Meshcheryakov) -- added U+1E0E-1E0F, U+1E8E-1E8F to Mono fonts (by Denis Jacquerye). (bug - #7166) -- renamed 'Dotabove' to 'Dotaccent' in Mono Sans Oblique to match other fonts - (by Denis Jacquerye). -- added U+200B-U+200F in Sans faces and Serif faces, U+200B and U+200C were - in Sans already (by Lars Naesbye Christensen) -- added U+2601-U+262F, U+263D, U+263E, U+2648-U+265F, U+2668, U+2670-U+268B, - U+2690-U+269C, U+26A0, U+26A1, U+2794, U+2798-U+27AF, U+27B1-U+27BE to Mono - (by Heikki Lindroos) -- replaced the references with unshifted ones for both κ U+03BA and к U+043A - in Mono Book (by Denis Jacquerye) -- fixing glyph for U+04ED in Mono Book, consisted only of dieresis (by Andrey - V. Panov). - -Changes from 2.5 to 2.6: - -- redid U+2032 - U+2037, U+2057 based on Arev in Sans (by Gee Fung Sit) -- added U+0195, corrected U+039E, U+204B in Sans ExtraLight (by Gee Fung Sit) -- added instructions for some Cyrillic letters in Sans Bold (by Eugeniy - Meshcheryakov) -- added vulgar fractions U+2153-U+215F for Serif, made with references (by - Lars Naesbye Christensen) -- added U+228F-2292, U+2299-22AF, U+22B2-22B5, U+22CD, U+22D8-22ED to Sans - (by Remy Oudompheng) -- added U+2208-220D, U+2238-223D, U+2278-2281, U+228A-228B, U+228F-2292, - U+22CD, U+22DA-22E9 to Mono (by Remy Oudompheng) -- fixed misplaced dot in U+2250 in Mono (by Remy Oudompheng) -- added instructions for some Cyrillic letters in Mono Book and Bold(by - Eugeniy Meshcheryakov) -- minor changes to U+2241, U+2261-2263, U+22A4, U+22A5 in Sans (by Remy - Oudompheng) -- added hinting instructions to lowercase Armenian glyphs in Sans Book (by - Ben Laenen) -- changed U+2208, U+220B to match U+2209 and U+220C in Sans Bold (by Remy - Oudompheng) -- added Braille patterns U+2800-U+28FF to Sans (by Mederic Boquien) -- added instructions for some Cyrillic letters in Serif Book (by Eugeniy - Meshcheryakov) -- renamed BoldOblique fonts to Bold Oblique in TTF Name as originally in - Bitstream Vera fonts (by Denis Jacquerye) -- added hinting instructions to some Latin-B Extended and IPA characters in - Sans Book (by Denis Jacquerye and Ben Laenen) -- adjusted bearings, replaced diacritics, hinted hook and horn for - Vietnamese in Sans Book (by Denis Jacquerye) -- made FAX, TM, TEL, etc. discritionary ligatures in Sans and Serif fonts - (by Denis Jacquerye) -- removed ligatures of precomposed characters in Sans and Serif fonts (by - Denis Jacquerye) -- added U+F208, U+F20A, U+F215-F217, U+F21A-F21B, U+F25F in PUA (from SIL's - PUA, probably in Unicode 5.0): U+0243, U+0244, U+0245, U+024C, U+024D, - U+2C64, (U+2C6D), (U+2C71) -- modified some glyphs in Serif Oblique to make them more italic (by Denis - Jacquerye) - -Changes from 2.4 to 2.5: - -- fixed excessive kerning bug that occurs with Pango (by Denis Jacquerye) -- added U+20AF to Sans and Serif (by Lars Naesbye Christensen) -- regenerated Condensed faces (by Ben Laenen) -- added U+035C-U+035D to Sans, fixed U+0361 (by Denis Jacquerye) -- integrated 255 characters from Arev fonts: Latin Extended-B, Spacing - Modifiers, Combining Diacritical Marks, Cyrillic, Cyrillic supplement, - General Punctuation, Letterlike Symbols, Arrows, Mathematical Operators, - Miscellaneous Technical, Dingbats, Alphabetic Presentation Forms (by Denis - Jacquerye) -- added basic Cyrillic and basic Greek to Sans ExtraLight (by Denis Jacquerye) -- added U+0498, U+049A, U+04AA, U+04AB, U+04AF to Serif (by Eugeniy - Meshcheryakov) -- added U+0494, U+0495, U+0498, U+0499, U+04AA, U+04AB, U+04C3, U+04C4, - U+04C7, U+04C8 to Mono (by Eugeniy Meshcheryakov) -- adjusted weight of U+0256, U+0257, U+0260, U+0272, U+0273, U+0277, U+029B, - U+02A0 and modifed U+028B and U+027A in Mono (by Denis Jacquerye) -- added U+2000-200A to Mono (by Denis Jacquerye) -- added vulgar fractions U+2153 - U+215F to Mono (by Gee Fung Sit) -- adapted metrics of Arabic glyphs so they stay above cut-off height in Sans - (by Ben Laenen) -- fixed mkmk anchors for Arabic diacritics so they stack properly in Sans (by - Ben Laenen) -- fixed weight of lowercase upsilon in Sans Bold, make small adjustment to - lowercase omega in Sans (by Ben Laenen) -- added U+210E (by Mederic Boquien) -- unslanted U+2201, U+221B and U+221C in Sans Oblique (by Mederic Boquien) -- added several mathematical relation symbols to Sans and Mono (U+2241-224C, - U+2250-2255, U+2260-2269, U+226E-2277, U+2282-2287) modified U+223C to match - other tildes, and U+2282-2284 to have the same shape. (by Remy Oudompheng) -- made U+2234-U+2237 refer to U+2219 instead of U+00B7 in Sans (by Mederic - Boquien) -- added U+2238-223B, U+226A-226B, U+2278-2281, U+2288-228B to Sans (by Remy - Oudompheng) -- unslanted and changed reference of U+22C5 from U+00B7 to U+2219 in Sans (by - Mederic Boquien) -- added U+224D-225F, U+226D, U+22C6 to Sans and unslanted U+2219 in Sans - Oblique. (by Remy Oudompheng) -- added U+224D-225F, U+226D to Mono, shifted U+2266-2269 higher upwards and - unslanted U+2219 in Oblique. (by Remy Oudompheng) -- merged Coptic glyphs from Arev 0.2 (by Lars Naesbye Christensen) -- fixed and adjusted various Cyrillic glyphs in Serif (by Andrey V. Panov) -- made fi, fl... ligatures discretionary ligatures (by Ben Laenen) - -Changes from 2.3 to 2.4: - -- added U+04A2, U+04A3, U+04AC - U+04AF, U+04BA, U+04BB, U+04C0 - - U+04C2, U+04CB, U+04CD, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04E8 - U+04F5, - U+04F6 - U+04F9 to Mono (by Eugeniy Meshcheryakov) -- added U+048C, U+048D, U+0494, U+0495, U+049E - U+04A7, U+04AC - - U+04AE, U+04B4- U+04B7, U+04BA, U+04BB, U+04C0 - U+04C4, U+04C7, U+04C8, - U+04CB, U+04CC, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04EC - U+04F9 to Serif - (by Eugeniy Meshcheryakov) -- added U+2134 to Sans (by Gee Fung Sit) -- added U+2080 - U+2089 to all faces (by Gee Fung Sit) -- several minor corrections to Sans (by Gee Fung Sit) -- major corrections to Sans Condensed (by Gee Fung Sit) -- corrected Superscripts and Subscripts in Sans (by Gee Fung Sit) -- corrected anchors of U+0316-U+0319 (by Denis Jacquerye) -- Verajja integrated (by Stepan Roh) -- copied U+2328, U+2600, U+2639-U+263C, U+263F-U+2647, U+2660-U+2667, - and U+2669-U+266F from Sans to Serif, and copied scaled-down versions of - them to Sans Mono (by David Lawrence Ramsey) -- added U+20B4 to all faces (by Eugeniy Meshcheryakov) -- added more minor positional adjustments to U+2638 in all faces to - match the other miscellaneous symbols in Verajja, and rescale it in Sans - Mono so that it looks better (by David Lawrence Ramsey) -- added U+2242, U+2243 and U+22A4 (by Mederic Boquien) -- corrected U+2245 in Sans (by Mederic Boquien) -- added U+0221, U+0234-0236 (by Denis Jacquerye) -- added in Arabic block to Sans: U+060C, U+0615, U+061B, U+061F, U+0621 -- U+063A, U+0640 - U+0655, U+0660 - U+066F, U+0679 - U+0687, U+0698, U+06A1, - U+06A9, U+06AF, U+06BA, U+06BF, U+06CC, U+06F0 - U+06F9 (by Ben Laenen) -- added in Arabic Presentation Forms A to Sans: U+FB52 - U+FB81, U+FB8A -- U+FB95, U+FB9E - U+FB9F, U+FBE8 - U+FBE9, U+FBFC - U+FBFF (by Ben Laenen) -- added complete Arabic Presentation Forms B to Sans: U+FE70 - U+FE74, - U+FE76 - U+FEFC, U+FEFF (by Ben Laenen) -- added complete Greek Extended block to Mono (by Ben Laenen) -- modified Greek capitals with tonos in Mono (by Ben Laenen) -- added U+01C4-01CC, U+01D5, U+01DE, U+01E0-U+01E1, U+01E6-U+01E9, - U+01EE-U+01F5, U+01F8-U+0217, U+021E-U+021F, U+0226-U+022A, U+022C to Serif - (by Denis Jacquerye) -- adjusted U+043B and U+044F in Serif (by Denis Jacquerye) -- added U+2000-U+200A (by Denis Jacquerye) -- added U+1E00-U+1E0B, U+1E0E-U+1E11, U+1E14-U+1E1C, U+1E1E-U+1E23, - U+1E26-U+1E2D, U+1E30-U+1E35, U+1E3A-U+1E3B, U+1E3E-U+1E40, U+1E48-U+1E49, - U+1E50-U+1E56, U+1E58-U+1E59, U+1E5E-U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, - U+1E72-U+1E7D, U+1E86-U+1E9B, U+1EA0-U+1EA3, U+1EAC-U+1EB7, U+1EBA-U+1EBD, - U+1EC6-U+1ECF, U+1ED8-U+1ED9, U+1EE6-U+1EE7, U+1EF4-U+1EF9 to Serif (by - Denis Jacquerye) -- added U+048E, U+048F, U+049C-U+049F, U+04B8, U+04B9, U+04BC-U+04BF, - U+04C3, U+04C4 to Sans (by Eugeniy Meshcheryakov) -- added DejaVu Sans Extra Light (by Denis Jacquerye) -- Adjusted underline position for (hopefully) improved legibility in - Sans, Serif, Mono (Tim May) -- added auto-generated DejaVu LGC (by Stepan Roh) - -Changes from 2.2 to 2.3: - -- fixed bug U+042B and U+044B behave badly in Sans Bold or Oblique (by - Keenan Pepper) -- added and improved TrueType instructions and related settings (by - Keenan Pepper) -- added U+04D0-U+04D7, U+04E6, U+04E7 to Mono (by Eugeniy Meshcheryakov) -- added U+048A - U+048D, U+0498, U+0499, U+04AA, U+04AB, U+04B0, U+04B1, - U+04C0, U+04C9, U+04CA, U+04CE, U+04CD, U+04DA, U+04DB, U+04DE, U+04DF, - U+04E2 - U+04E5, U+04EC - U+04F8, U+04F9 to Sans (by Eugeniy Meshcheryakov) -- added U+04E0, U+04E1 to all faces (by Eugeniy Meshcheryakov) -- added Greek Extended to Sans and Serif: U+1F00-U+1F15, U+1F18-U+1F1D, - U+1F20-U+1F45, U+1F48-U+1F4D, U+1F50-U+1F57, U+1F59, U+1F5B, U+1F5D, - U+1F5F-U+1F7D, U+1F80-U+1FB4, U+1FB6-U+1FC4, U+1FC6-U+1FD3, U+1FD6-U+1FDB, - U+1FDD-U+1FEF, U+1FF2-U+1FF4, U+1FF6-U+1FFE (by Ben Laenen) -- added Greek variant letterforms, archaic letters and symbols to Mono: - U+03D0-U+03E1, U+03F0-U+03FF (by Ben Laenen) -- added Armenian block and Armenian ligatures to Sans (U+0531 - U+0556, - U+0559 - U+055F, U+0561 - U+0587, U+0589 - U+058A, U+FB13 - U+FB17) (by Ben - Laenen) -- redid some Greek characters in Sans and Mono to make them look better - and to correct some errors (by Ben Laenen) -- added U+27E0 to all faces (by David Lawrence Ramsey) -- added underscore (U+005F) consistency fixes: extended the Sans Mono - and Sans Mono Oblique underscores to touch both horizontal edges, and - reduced the height of the Sans Bold Oblique underscore to match the Sans - Bold underscore (by David Lawrence Ramsey) -- added underscore (U+005F) derivatives and consistency fixes for them: - made U+0332 a reference to underscore at Denis Jacquerye's suggestion; made - U+0333 two references to underscore; made U+033F two references to U+203E; - added U+2017 as two references to underscore, and made U+0333 a reference to - it; and added U+203E as a reference to underscore, and made U+0305 a - reference to it (by David Lawrence Ramsey) -- added U+201B, U+2220, U+2320-U+2321, U+23AE, U+23CF, all remaining - Geometric Shapes glyphs (U+25A0-U+25C9, U+25CB-U+25D7, U+25D9-U+25E5, - U+25E7-U+25FF), and U+2B12-U+2B13 to all faces (by David Lawrence Ramsey) -- added minor positional adjustments to U+2638 in all faces (by David - Lawrence Ramsey) -- added U+201F to Sans Mono and Serif faces (by David Lawrence Ramsey) -- added U+01B7, U+01F6, U+0464 - U+0465, U+2160 - U+2180, U+2183, - U+220A, U+220D, U+2329, U+232A, U+2422, U+27E8 - U+27EB, U+2680 - U+2685 to - Sans (by Gee Fung Sit ???) -- added U+2116 to Sans and Serif (by Gee Fung Sit) -- changed florin sign U+0192 in Sans (by Gee Fung Sit) -- added anchor points to some glyphs (by Denis Jacquerye) -- adjusted height of IPA superscripts U+02B0-02B8, U+02C0-02C1, - U+02E0-02E4, U+207F to match with height of U+00B2 (by Denis Jacquerye) -- added U+0184-U+0185, U+019C, U+019F, U+01A0-U+01A3, U+01A6, U+01AA, - U+01AF-U+01B0, U+01B2-U+01B4, U+01B7-U+01B8, U+01BC-U+01BC, U+0224-U+0225, - U+023A-U+0240, U+1D16-U+1D17, U+1D1D-U+1D1E, U+1D43-U+1D5B, U+1D7B, - U+1D85,U+1D9B-1DB7, U+1DB9-U+1DBF, U+20A6 to all fonts (by Denis Jacquerye) -- added added U+0182, U+018B, U+018E, U+01A0-U+01A1, U+01B1, U+01B9, - U+01C0-U+01C3, U+0238-U+0239, U+1D02, U+1D08-U+1D09, U+1D14, U+1D1F, U+1D77 - to Serif and Mono (by Denis Jacquerye) -- added U+0181, U+0183, U+0187-U+0188, U+018A-U+018F, U+0191, U+0193, - U+0195-U+019B, U+019D-U+019E, U+01A4-U+01A5, U+01AC-U+01AE, U+01B5-U+01B6, - U+01B9, U+01BB, U+01F6 to Serif (by Denis Jacquerye) -- added U+0181, U+0187-U+0188, U+018A, U+018D, U+018F, U+0191, U+0193, - U+0195-U+019F, U+01A4-01A5, U+01AC-01AD, U+01B5-U+01B6, U+1BB, U+01F6, - U+01D7-U+01DC, U+0238-U+0239, U+0241 to Mono (by Denis Jacquerye) -- added to Mono and Serif (by Denis Jacquerye) - -Changes from 2.1 to 2.2: - -- reworked the vertical orientation of the Blocks Elements characters - in all faces to remove their overly large descenders, in order to fix - problems with e.g. terminal emulators (by David Lawrence Ramsey) -- copied bullet in Sans faces to Serif faces for consistency (by David - Lawrence Ramsey) -- added U+2023, U+25D8, U+25E6, and U+29EB to all faces (by David - Lawrence Ramsey) -- added U+1EB8, U+1EB9, U+1ECA - U+1ECD, U+1EE4, U+1EE5 (by Tim May) -- added U+01DD, U+02BE, U+02BF, U+02D3 to all, changed U+02D2 in - non-Condensed and U+1EE5 in Serif (by Tim May) -- fixed U+01CE, replacing wrong circumflex by caron (by Denis Jacquerye) -- added anchor points to some glyphs (by Denis Jacquerye) -- added U+20B5 (by Denis Jacquerye) -- added U+0181 - U+0183, U+0187, U+0188, U+018A - U+018D, U+0191, - U+0193, U+0195 - U+019B, U+019D, U+019E, U+01A4, U+01A7 - U+01A9, U+01AB - - U+01AE, U+01B1, U+01B5, U+01B6, U+01BB, U+01C0 - U+01C3, U+01F1 - U+01F3, - U+0238, U+0239, U+1D02, U+1D08, U+1D09, U+1D14, U+1D1F, U+1D77, U+2103, - U+2126, U+2127, U+212A, U+212B, U+2132, U+214B, U+2210, U+2217, U+2218, - U+2A0C - U+2A0E, U+FB00, U+FB03 and U+FB04 to Sans (by Gee Fung Sit) -- added U+01A9, U+01C3 and U+2126 to Mono and Serif (by Gee Fung Sit) -- adjusted bearings of U+028B in Sans (by Gee Fung Sit) -- added U+018F, U+0494-U+0497, U+04A0-U+04A7, U+04AC-U+04AF, - U+04B4-U+04B7, U+04BA-U+04BB, U+04C1-U+04C2, U+04C5-U+04C8, U+04CB-U+04CC, - U+04D0-U+04D9, U+04DC-U+04DD, U+04E6-U+04EB to Sans (by Eugeniy - Meshcheryakov) -- replaced with references U+0391-U+0393, U+0395-U+0397, U+0399, U+039A, - U+039C, U+039D, U+039F-U+03A1, U+03A4, U+03A5, U+03A7, U+03BF, U+03DC, - U+0405, U+0406, U+0408, U+0410, U+0412, U+0415, U+0417, U+041A, - U+041C-U+041E, U+0420-U+0422, U+0425, U+0430, U+0435, U+043E, U+0440, - U+0441, U+0443, U+0445, U+0455-U+0458 in Serif and Mono (by Eugeniy - Meshcheryakov) -- added U+04D0-U+04D7, U+04E6-U+04EB to Serif (by Eugeniy Meshcheryakov) -- added U+212A and U+212B to the rest of the faces (by Lars Naesbye - Christensen) -- added U+2318 and U+2325 to Sans and Serif (by Lars Naesbye Christensen) -- added and improved TrueType instructions and related settings (by - Keenan Pepper) -- completed basic Greek alphabet: added U+0374-U+0375, U+037A, U+037E, - U+0384-U+038A, U+038C, U+038E-U+0390, U+03AC-U+03BF, U+03C1-U+03CE (by Ben - Laenen) -- added U+2070 and U+2074-U+2079 (by Mederic Boquien) - -Changes from 2.0 to 2.1: - -*** Be aware that names of some TTF files changed since version 2.0. *** - -- added U+0323, U+1E0C, U+1E0D, U+1E24, U+1E25, U+1E36 - U+1E39, U+1E42, - U+1E43, U+1E46, U+1E47, U+1E5A - U+1E5D, U+1E62, U+1E63, U+1E6C, U+1E6D, - U+1E7E, U+1E7F (by Tim May) -- fixed bug where GNOME applications used Mono Bold Oblique instead of - Mono Oblique (by Keenan Pepper) -- added and improved TrueType instructions and related settings (by - Keenan Pepper) -- added U+1E41, U+1E57, U+1E61 (by Sander Vesik) -- added U+0189, U+0309, U+0313, U+0314, U+031A, U+031B, U+0327, U+0328, - U+032B, U+0333, U+033C (by Denis Jacquerye) -- adjusted and fixed U+0186, U+0254, U+0291, U+0316 - U+0319, U+031C - - U+0320, U+0323 - U+0326, U+0329 - U+032A, U+032C - U+0332, U+0339 - U+033B, - U+033E, U+033F (by Denis Jacquerye) -- fixed U+1E12, U+1E3C, U+1E4A, U+1E70 to have normal below diacritics - (by Denis Jacquerye) -- fixed U+1E82, U+1E84 and U+1EF2 to have uppercase above diacritics (by - Denis Jacquerye) -- added anchor points to some glyphs (by Denis Jacquerye) -- dropped "-Roman" from font names - affects both internal TTF names and - names of generated files (by Stepan Roh) -- attempt to fix bug Vertical spacing too big for Mono by exchanging - LineGap and OS2TypoLinegap values (proofed by Stefan Rank) -- added Greek capitals U+0391 - U+03A1, U+03A3 - U+03A9, U+03AA, U+03AB - in Mono (by Ben Laenen) -- added the per ten thousand sign U+2031 (by Mederic Boquien) -- added U+2207, U+221D, U+221F, U+2227 - U+222A, and U+2261 (by David - Lawrence Ramsey) -- new logo (by Gee Fung Sit) -- added U+0180, U+018E, U+201F, U+2024, U+2025, U+203D, U+2200, U+2203, - U+2213, U+222C, U+222D, U+2263 to Sans (by Gee Fung Sit) - -Changes from 1.15 to 2.0: - -- "Italized" basic glyphs in all Serif Oblique and their Condensed faces - (by David Jez) -- added and improved TrueType instructions and related settings (by Keenan - Pepper) -- added anchor points to some glyphs (by Denis Jacquerye) -- many new spacing and combining accents (by Denis Jacquerye) -- smart substitutions for transforming i and j to dottless form and for - using uppercase diacritics (by Denis Jacquerye) -- fixed remaining erroneously slanted characters in Serif Oblique faces (by - David Lawrence Ramsey) -- copied bullet in Sans faces to Sans Oblique faces for consistency (by - David Lawrence Ramsey) -- added U+203C and U+2047-U+2049 (by David Lawrence Ramsey) -- added Greek glyphs to Serif (by Ben Laenen, Condensed merge by David Jez) -- fixed bug LTR glyphs behaving like RTL (by Ben Laenen) -- fixed wrong glyph directions (by David Jez) -- fixed repositioned accents in Condensed faces (by David Jez) - -Changes from 1.14 to 1.15: - -- added and improved TrueType instructions and related settings (by Keenan - Pepper) -- fixed U+2302, U+2319 (by David Lawrence Ramsey) -- fixed yet another monospace bug (by Stepan Roh) -- fixed potential "too big ascender/descender" bug (by Stepan Roh) -- fixed U+026E and U+028E (by Denis Jacquerye) -- added U+0186, U+0190, U+0300 - U+0304, U+0306 - U+0308, U+030A - U+030C, - U+0321, U+0322 (by Denis Jacquerye) -- added rest of Block Elements: U+2591 - U+2593 (by David Lawrence Ramsey) -- added U+2311, U+237D and U+2638 (by David Lawrence Ramsey) -- added U+01CD - U+01D4 (by Denis Jacquerye) -- fixed accents of U+00F2 - U+00F6 by replacing them with references in Mono - Bold (by David Jez) -- added U+0490, U+0491 (by Eugeniy Meshcheryakov) -- added hints to U+0404 and U+0454 in Sans (by Eugeniy Meshcheryakov) -- completed Greek glyphs from U+0370 to U+03CF in Serif (by Ben Laenen) -- fixed shape of U+0255 in Sans Bold and Sans Bold Oblique (by Denis - Jacquerye) - -Changes from 1.13 to 1.14: - -- fixed bug where Mono faces were not recognized as fixed pitch in Windows - by correcting Venda glyphs (by David Jez) -- added and improved TrueType instructions (by Keenan Pepper) -- added 6 Uzbekian glyphs (by Mashrab Kuvatov) -- added Greek glyphs to Sans and Serif, changed pi and omega to fit in (by - Ben Laenen) -- added IPA and related superscript glyphs (by Denis Jacquerye) -- fixed buggy Venda glyphs (by David Lawrence Ramsey and Stepan Roh) -- added U+2302, U+2310, U+2319 (by David Lawrence Ramsey) -- fixed slanted U+00AC in Serif Oblique faces (by David Lawrence Ramsey) -- added 29 glyphs from Block Elements (by David Lawrence Ramsey) - -Changes from 1.12 to 1.13: - -- removed all stems (PS hints) (requested by David Jez) -- added U+01D6, U+01DF, U+022B, U+022D and U+0231 (by Sander Vesik) -- added 10 Venda glyphs (by Dwayne Bailey) -- fixed bug when fonts had no name on Microsoft Windows (by Stepan Roh) -- updated 'missing' glyph U+FFFD (by David Jez) -- set TTF flag fsType to 'Installable Embedding' (= unrestricted usage) - (idea by C. Tiffany) - -Changes from 1.11 to 1.12: - -- added long s (by James Cloos) -- prettier comma accent in gcommaaccent (by David Jez) -- added Hbar, hbar, kgreenlandic, napostrophe, Eng, eng, Tbar, tbar, - afii57929 (by David Jez) -- changed Iogonek, iogonek, IJ, ij to look better (by David Jez) -- glyph uni0237 renamed to dotlessj (requested by David Jez) -- fixed accents for dcaron, lcaron, tcaron, Uogonek, uogonek in Serif (by - David Jez) -- added U+2500 - U+257F box drawing glyphs to Sans Mono (by David Jez) -- fixed accents in Wcircumflex, Ycircumflex and Zdotaccent (by David Jez) -- extra kerning for F (by Sander Vesik) -- added 'missing' glyph U+FFFD (by David Jez) - -Changes from 1.10 to 1.11: - -- kerning updates (by Sander Vesik) -- added Iogonek, iogonek, IJ, ij, Uogonek, uogonek (from SuSE standard fonts - by Adrian Schroeter, SuSE AG) -- added Gcommaaccent, gcommaaccent, Kcommaaccent, kcommaaccent, - Lcommaaccent, lcommaaccent, Ncommaaccent, ncommaaccent, Rcommaaccent, - rcommaaccent (by Stepan Roh) - -Changes from 1.9 to 1.10: - -- added U+022E, U+022F (by Sander Vesik) -- kerning updates for DejaVu Sans (by Sander Vesik) -- fixed too wide cyrillic glyphs in DejaVu Sans Mono (by Valentin Stoykov) -- fixed ligatures bug in Mono (by Stepan Roh) - -Changes from 1.8 to 1.9: - -- integrated Arev Cyrillics (by Danilo Segan) -- added U+01EA, U+01EB, U+01EC, U+01ED (by Sander Vesik) - -Changes from 1.7 to 1.8: - -- fixed accents in Serif Oblique and Serif Bold Oblique (by Stepan Roh) - -Changes from 1.6 to 1.7: - -- added automatically generated Condensed typefaces (by Stepan Roh) - -Changes from 1.5 to 1.6: - -- monospace bug fixed (by Stepan Roh) -- incorrect Bitstream foundry assigned by fontconfig and KDE Font Installer -fixed (by Stepan Roh) -- added automatically generated Oblique version of Serif typefaces (by -Stepan Roh) -- corrected cyrillic D and d (by Danilo Segan and David Jez) -- fixed accents position in Oblique version of Serif typefaces (by Danilo -Segan and Sander Vesik) -- fixed incorrect computation of OS2Win* fields (by Stepan Roh) -- added visiblespace U+2423 (by David Jez) -- fixed 'line height' bug by fixing ascender and descender values (by David -Jez and Stepan Roh) -- fixed part of 'worse than Vera' bug (by Peter Cernak) -- smaller comma accent U+0326 (by David Jez) - -Changes from 1.4 to 1.5: - -- added Cyrillics (96 characters) and Dcroat to the rest of typefaces (by -Danilo Segan) -- fixed bugs in some Cyrillic characters, some of them reported by Sander -Vesik (by Danilo Segan) -- added U+0100, U+0101, U+0112, U+0113, U+012A, U+012B, U+014C, U+014D, -U+016A, U+016B, U+01E2, U+01E3, U+0232 and U+0233 (by Sander Vesik) -- added Romanian characters (by Misu Moldovan) -- added U+0108, U+0109, U+010A, U+010B, U+0114, U+0115, U+0116, U+0117, -U+011C, U+011D, U+0120, U+0121, U+0124, U+0125, U+0128, U+0129, U+012C, -U+012D, U+0134, U+0135, U+014E, U+014F, U+0150, U+0151, U+015C, U+015D, -U+0168, U+0169, U+016C, U+016D, U+0170, U+0171 and U+0237 (by James -Crippen) -- added U+02BB, U+2010, U+2011, U+2012 and U+2015 (by Stepan Roh) - -Changes from 1.3 to 1.4: - -- added Polish characters (Aogonek, aogonek, Eogonek, eogonek, Nacute, -nacute, Sacute, sacute, Zacute, zacute, Zdotaccent, zdotaccent) (by Stepan -Roh) - -Changes from 1.2 to 1.3: - -- added Cyrillics (96 characters) and Dcroat to Sans typefaces (by Danilo -Segan from his BePa fonts) - -Changes from 1.1 to 1.2: - -- added Ldot, ldot, Wcircumflex, wcircumflex, Ycircumflex, ycircumflex, - Wgrave, wgrave, Wacute, wacute, Wdieresis, wdieresis, Ygrave and ygrave - (from The Olwen Font Family 0.2 by Dafydd Harries) - -Changes from 1.0 to 1.1: - -- added Lacute, lacute, Lcaron, lcaron, Racute and racute (by Peter Cernak) - -Changes from 0.9.4 to 1.0: - -- none, just changed version and updated README - -Changes from 0.9.3 to 0.9.4: - -- fixed TTF generation (kerning tables were missing) - -Changes from 0.9.2 to 0.9.3: - -- kerning of added characters -- proper caron shape for dcaron in Mono (by Ondrej Koala Vacha) -- minor visual changes - -Changes from 0.9.1 to 0.9.2: - -- internal bugged version - -Changes from 0.9 to 0.9.1: - -- proper caron shape for dcaron and tcaron -- minor visual changes - -$Id: NEWS 2296 2008-09-27 17:30:03Z ben_laenen $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/README b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/README deleted file mode 100644 index 2886ccd5..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/README +++ /dev/null @@ -1,59 +0,0 @@ -DejaVu fonts 2.27 (c)2004-2008 DejaVu fonts team ------------------------------------------------- - -The DejaVu fonts are a font family based on the Bitstream Vera Fonts -(http://gnome.org/fonts/). Its purpose is to provide a wider range of -characters (see status.txt for more information) while maintaining the -original look and feel. - -DejaVu fonts are based on Bitstream Vera fonts version 1.10. - -Available fonts (Sans = sans serif, Mono = monospaced): - -DejaVu Sans Mono -DejaVu Sans Mono Bold -DejaVu Sans Mono Bold Oblique -DejaVu Sans Mono Oblique -DejaVu Sans -DejaVu Sans Bold -DejaVu Sans Bold Oblique -DejaVu Sans Oblique -DejaVu Sans ExtraLight (experimental) -DejaVu Serif -DejaVu Serif Bold -DejaVu Serif Bold Italic (experimental) -DejaVu Serif Italic (experimental) -DejaVu Sans Condensed (experimental) -DejaVu Sans Condensed Bold (experimental) -DejaVu Sans Condensed Bold Oblique (experimental) -DejaVu Sans Condensed Oblique (experimental) -DejaVu Serif Condensed (experimental) -DejaVu Serif Condensed Bold (experimental) -DejaVu Serif Condensed Bold Italic (experimental) -DejaVu Serif Condensed Italic (experimental) - -All fonts are also available as derivative called DejaVu LGC with support -only for Latin, Greek and Cyrillic scripts. - -For license information see LICENSE. What's new is described in NEWS. Known -bugs are in BUGS. All authors are mentioned in AUTHORS. - -Fonts are published in source form as SFD files (Spline Font Database from -FontForge - http://fontforge.sf.net/) and in compiled form as TTF files -(TrueType fonts). - -For more information go to http://dejavu.sourceforge.net/. - -Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah: ---------------------------- -U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223, -U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5, -U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362, -U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9, -U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F, -U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135, -U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704, -U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794, -U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06 - -$Id: README 2296 2008-09-27 17:30:03Z ben_laenen $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/langcover.txt b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/langcover.txt deleted file mode 100644 index 463f8cdb..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/langcover.txt +++ /dev/null @@ -1,187 +0,0 @@ -This is the language coverage file for DejaVu fonts -($Id$) - - Sans Serif Sans Mono -aa Afar 100% (62/62) 100% (62/62) 100% (62/62) -ab Abkhazia 100% (90/90) 93% (84/90) 84% (76/90) -af Afrikaans 100% (69/69) 100% (69/69) 100% (69/69) -am Amharic (0/264) (0/264) (0/264) -ar Arabic 100% (125/125) (0/125) 100% (125/125) -ast Asturian 100% (72/72) 100% (72/72) 100% (72/72) -ava Avaric 100% (67/67) 100% (67/67) 100% (67/67) -ay Aymara 100% (60/60) 100% (60/60) 100% (60/60) -az Azerbaijani 100% (148/148) 97% (144/148) 97% (144/148) -az-ir Azerbaijani in Iran 100% (130/130) (0/130) 100% (130/130) -ba Bashkir 100% (82/82) 100% (82/82) 97% (80/82) -bam Bambara 100% (60/60) 100% (60/60) 100% (60/60) -be Byelorussian 100% (68/68) 100% (68/68) 100% (68/68) -bg Bulgarian 100% (60/60) 100% (60/60) 100% (60/60) -bh Bihari (Devanagari script) (0/68) (0/68) (0/68) -bho Bhojpuri (Devanagari script) (0/68) (0/68) (0/68) -bi Bislama 100% (58/58) 100% (58/58) 100% (58/58) -bin Edo or Bini 100% (78/78) 100% (78/78) 100% (78/78) -bn Bengali (0/89) (0/89) (0/89) -bo Tibetan (0/95) (0/95) (0/95) -br Breton 100% (64/64) 100% (64/64) 100% (64/64) -bs Bosnian 100% (62/62) 100% (62/62) 100% (62/62) -bua Buriat (Buryat) 100% (70/70) 100% (70/70) 100% (70/70) -ca Catalan 100% (74/74) 100% (74/74) 100% (74/74) -ce Chechen 100% (67/67) 100% (67/67) 100% (67/67) -ch Chamorro 100% (58/58) 100% (58/58) 100% (58/58) -chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 97% (74/76) -chr Cherokee (0/85) (0/85) (0/85) -co Corsican 100% (84/84) 100% (84/84) 100% (84/84) -cs Czech 100% (82/82) 100% (82/82) 100% (82/82) -cu Old Church Slavonic 100% (103/103) 86% (89/103) 76% (79/103) -cv Chuvash 100% (74/74) 100% (74/74) 100% (74/74) -cy Welsh 100% (78/78) 100% (78/78) 100% (78/78) -da Danish 100% (70/70) 100% (70/70) 100% (70/70) -de German 100% (59/59) 100% (59/59) 100% (59/59) -dz Dzongkha (0/95) (0/95) (0/95) -el Greek 100% (69/69) 100% (69/69) 100% (69/69) -en English 100% (72/72) 100% (72/72) 100% (72/72) -eo Esperanto 100% (64/64) 100% (64/64) 100% (64/64) -es Spanish 100% (66/66) 100% (66/66) 100% (66/66) -et Estonian 100% (64/64) 100% (64/64) 100% (64/64) -eu Basque 100% (56/56) 100% (56/56) 100% (56/56) -fa Persian 100% (129/129) (0/129) 100% (129/129) -fi Finnish 100% (62/62) 100% (62/62) 100% (62/62) -fj Fijian 100% (52/52) 100% (52/52) 100% (52/52) -fo Faroese 100% (68/68) 100% (68/68) 100% (68/68) -fr French 100% (84/84) 100% (84/84) 100% (84/84) -ful Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62) -fur Friulian 100% (66/66) 100% (66/66) 100% (66/66) -fy Frisian 100% (75/75) 100% (75/75) 100% (75/75) -ga Irish 100% (80/80) 100% (80/80) 100% (80/80) -gd Scots Gaelic 100% (70/70) 100% (70/70) 100% (70/70) -gez Ethiopic (Geez) (0/218) (0/218) (0/218) -gl Galician 100% (66/66) 100% (66/66) 100% (66/66) -gn Guarani 100% (70/70) 100% (70/70) 100% (70/70) -gu Gujarati (0/78) (0/78) (0/78) -gv Manx Gaelic 100% (54/54) 100% (54/54) 100% (54/54) -ha Hausa 100% (60/60) 100% (60/60) 100% (60/60) -haw Hawaiian 100% (63/63) 100% (63/63) 100% (63/63) -he Hebrew 100% (27/27) (0/27) (0/27) -hi Hindi (Devanagari script) (0/68) (0/68) (0/68) -ho Hiri Motu 100% (52/52) 100% (52/52) 100% (52/52) -hr Croatian 100% (62/62) 100% (62/62) 100% (62/62) -hu Hungarian 100% (70/70) 100% (70/70) 100% (70/70) -hy Armenian 100% (77/77) (0/77) (0/77) -ia Interlingua 100% (52/52) 100% (52/52) 100% (52/52) -ibo Igbo 100% (58/58) 100% (58/58) 100% (58/58) -id Indonesian 100% (54/54) 100% (54/54) 100% (54/54) -ie Interlingue 100% (52/52) 100% (52/52) 100% (52/52) -ik Inupiaq (Inupiak, Eskimo) 100% (68/68) 100% (68/68) 100% (68/68) -io Ido 100% (52/52) 100% (52/52) 100% (52/52) -is Icelandic 100% (70/70) 100% (70/70) 100% (70/70) -it Italian 100% (72/72) 100% (72/72) 100% (72/72) -iu Inuktitut 100% (161/161) (0/161) (0/161) -ja Japanese (0/6538) (0/6538) (0/6538) -ka Georgian 100% (34/34) 100% (34/34) 100% (34/34) -kaa Kara-Kalpak (Karakalpak) 100% (78/78) 100% (78/78) 100% (78/78) -ki Kikuyu 100% (56/56) 100% (56/56) 100% (56/56) -kk Kazakh 100% (77/77) 100% (77/77) 100% (77/77) -kl Greenlandic 100% (81/81) 100% (81/81) 100% (81/81) -km Khmer (0/70) (0/70) (0/70) -kn Kannada (0/80) (0/80) (0/80) -ko Korean (0/2443) (0/2443) (0/2443) -kok Kokani (Devanagari script) (0/68) (0/68) (0/68) -ks Kashmiri (Devanagari script) (0/68) (0/68) (0/68) -ku Kurdish 100% (64/64) 100% (64/64) 100% (64/64) -ku-ir Kurdish in Iran 100% (32/32) (0/32) 100% (32/32) -kum Kumyk 100% (66/66) 100% (66/66) 100% (66/66) -kv Komi (Komi-Permyak/Komi-Siryan) 100% (70/70) 100% (70/70) 100% (70/70) -kw Cornish 100% (64/64) 100% (64/64) 100% (64/64) -ky Kirgiz 100% (70/70) 100% (70/70) 100% (70/70) -la Latin 100% (68/68) 100% (68/68) 100% (68/68) -lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75) -lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67) -lo Lao 100% (65/65) (0/65) 70% (46/65) -lt Lithuanian 100% (70/70) 100% (70/70) 100% (70/70) -lv Latvian 100% (78/78) 100% (78/78) 100% (78/78) -mg Malagasy 100% (56/56) 100% (56/56) 100% (56/56) -mh Marshallese 100% (62/62) 100% (62/62) 100% (62/62) -mi Maori 100% (64/64) 100% (64/64) 100% (64/64) -mk Macedonian 100% (42/42) 100% (42/42) 100% (42/42) -ml Malayalam (0/78) (0/78) (0/78) -mn Mongolian (0/130) (0/130) (0/130) -mo Moldavian 100% (128/128) 100% (128/128) 100% (128/128) -mr Marathi (Devanagari script) (0/68) (0/68) (0/68) -mt Maltese 100% (72/72) 100% (72/72) 100% (72/72) -my Burmese (Myanmar) (0/48) (0/48) (0/48) -nb Norwegian Bokmal 100% (70/70) 100% (70/70) 100% (70/70) -nds Low Saxon 100% (59/59) 100% (59/59) 100% (59/59) -ne Nepali (Devanagari script) (0/68) (0/68) (0/68) -nl Dutch 100% (82/82) 100% (82/82) 100% (82/82) -nn Norwegian Nynorsk 100% (76/76) 100% (76/76) 100% (76/76) -no Norwegian (Bokmal) 100% (70/70) 100% (70/70) 100% (70/70) -ny Chichewa 100% (54/54) 100% (54/54) 100% (54/54) -oc Occitan 100% (70/70) 100% (70/70) 100% (70/70) -om Oromo or Galla 100% (52/52) 100% (52/52) 100% (52/52) -or Oriya (0/79) (0/79) (0/79) -os Ossetic 100% (66/66) 100% (66/66) 100% (66/66) -pa Punjabi (Gurumukhi script) (0/63) (0/63) (0/63) -pl Polish 100% (70/70) 100% (70/70) 100% (70/70) -ps-af Pashto in Afghanistan 83% (41/49) (0/49) 83% (41/49) -ps-pk Pashto in Pakistan 81% (40/49) (0/49) 81% (40/49) -pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82) -rm Rhaeto-Romance (Romansch) 100% (66/66) 100% (66/66) 100% (66/66) -ro Romanian 100% (62/62) 100% (62/62) 100% (62/62) -ru Russian 100% (66/66) 100% (66/66) 100% (66/66) -sa Sanskrit (Devanagari script) (0/68) (0/68) (0/68) -sah Yakut 100% (76/76) 100% (76/76) 97% (74/76) -sco Scots 100% (56/56) 100% (56/56) 96% (54/56) -se North Sami 100% (66/66) 100% (66/66) 100% (66/66) -sel Selkup (Ostyak-Samoyed) 100% (66/66) 100% (66/66) 100% (66/66) -sh Serbo-Croatian 100% (76/76) 100% (76/76) 100% (76/76) -si Sinhala (Sinhalese) (0/77) (0/77) (0/77) -sk Slovak 100% (86/86) 100% (86/86) 100% (86/86) -sl Slovenian 100% (62/62) 100% (62/62) 100% (62/62) -sm Samoan 100% (53/53) 100% (53/53) 100% (53/53) -sma South Sami 100% (60/60) 100% (60/60) 100% (60/60) -smj Lule Sami 100% (60/60) 100% (60/60) 100% (60/60) -smn Inari Sami 100% (68/68) 100% (68/68) 100% (68/68) -sms Skolt Sami 100% (80/80) 100% (80/80) 97% (78/80) -so Somali 100% (52/52) 100% (52/52) 100% (52/52) -sq Albanian 100% (56/56) 100% (56/56) 100% (56/56) -sr Serbian 100% (76/76) 100% (76/76) 100% (76/76) -sv Swedish 100% (68/68) 100% (68/68) 100% (68/68) -sw Swahili 100% (52/52) 100% (52/52) 100% (52/52) -syr Syriac (0/45) (0/45) (0/45) -ta Tamil (0/48) (0/48) (0/48) -te Telugu (0/80) (0/80) (0/80) -tg Tajik 100% (78/78) 100% (78/78) 97% (76/78) -th Thai 1% (1/87) (0/87) (0/87) -ti-er Eritrean Tigrinya (0/256) (0/256) (0/256) -ti-et Ethiopian Tigrinya (0/282) (0/282) (0/282) -tig Tigre (0/221) (0/221) (0/221) -tk Turkmen 100% (74/74) 100% (74/74) 100% (74/74) -tl Tagalog (0/19) (0/19) (0/19) -tn Tswana 100% (56/56) 100% (56/56) 100% (56/56) -to Tonga 100% (53/53) 100% (53/53) 100% (53/53) -tr Turkish 100% (70/70) 100% (70/70) 100% (70/70) -ts Tsonga 100% (52/52) 100% (52/52) 100% (52/52) -tt Tatar 100% (76/76) 100% (76/76) 100% (76/76) -tw Twi 100% (73/73) 100% (73/73) 100% (73/73) -tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70) -ug Uighur 100% (125/125) (0/125) 100% (125/125) -uk Ukrainian 100% (72/72) 100% (72/72) 100% (72/72) -ur Urdu 94% (137/145) (0/145) 97% (141/145) -uz Uzbek 100% (68/68) 100% (68/68) 100% (68/68) -ven Venda 100% (62/62) 100% (62/62) 100% (62/62) -vi Vietnamese 100% (194/194) 77% (150/194) 76% (148/194) -vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54) -vot Votic 100% (62/62) 100% (62/62) 100% (62/62) -wa Walloon 100% (70/70) 100% (70/70) 100% (70/70) -wen Sorbian languages (lower and upper) 100% (76/76) 100% (76/76) 100% (76/76) -wo Wolof 100% (66/66) 100% (66/66) 100% (66/66) -xh Xhosa 100% (52/52) 100% (52/52) 100% (52/52) -yap Yapese 100% (58/58) 100% (58/58) 100% (58/58) -yi Yiddish 100% (27/27) (0/27) (0/27) -yo Yoruba 100% (119/119) 100% (119/119) 100% (119/119) -zh-cn Chinese (simplified) 0% (2/6765) 0% (2/6765) 0% (2/6765) -zh-hk Chinese Hong Kong Supplementary Character Set (0/2213) (0/2213) (0/2213) -zh-mo Chinese in Macau (0/13063) (0/13063) (0/13063) -zh-sg Chinese in Singapore 0% (2/6765) 0% (2/6765) 0% (2/6765) -zh-tw Chinese (traditional) (0/13063) (0/13063) (0/13063) -zu Zulu 100% (52/52) 100% (52/52) 100% (52/52) diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/status.txt b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/status.txt deleted file mode 100644 index abde0f0b..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/status.txt +++ /dev/null @@ -1,6139 +0,0 @@ -This is the status file for DejaVu fonts -($Id: status.txt 2274 2008-07-27 15:37:33Z noct_dreamer $) - -original = present in original Bitstream Vera 1.10 - = added in DejaVu fonts - -U+0020 space original -U+0021 exclam original -U+0022 quotedbl original -U+0023 numbersign original -U+0024 dollar original -U+0025 percent original -U+0026 ampersand original -U+0027 quotesingle original -U+0028 parenleft original -U+0029 parenright original -U+002a asterisk original -U+002b plus original -U+002c comma original -U+002d hyphen original -U+002e period original -U+002f slash original -U+0030 zero original -U+0031 one original -U+0032 two original -U+0033 three original -U+0034 four original -U+0035 five original -U+0036 six original -U+0037 seven original -U+0038 eight original -U+0039 nine original -U+003a colon original -U+003b semicolon original -U+003c less original -U+003d equal original -U+003e greater original -U+003f question original -U+0040 at original -U+0041 A original -U+0042 B original -U+0043 C original -U+0044 D original -U+0045 E original -U+0046 F original -U+0047 G original -U+0048 H original -U+0049 I original -U+004a J original -U+004b K original -U+004c L original -U+004d M original -U+004e N original -U+004f O original -U+0050 P original -U+0051 Q original -U+0052 R original -U+0053 S original -U+0054 T original -U+0055 U original -U+0056 V original -U+0057 W original -U+0058 X original -U+0059 Y original -U+005a Z original -U+005b bracketleft original -U+005c backslash original -U+005d bracketright original -U+005e asciicircum original -U+005f underscore original -U+0060 grave original -U+0061 a original -U+0062 b original -U+0063 c original -U+0064 d original -U+0065 e original -U+0066 f original -U+0067 g original -U+0068 h original -U+0069 i original -U+006a j original -U+006b k original -U+006c l original -U+006d m original -U+006e n original -U+006f o original -U+0070 p original -U+0071 q original -U+0072 r original -U+0073 s original -U+0074 t original -U+0075 u original -U+0076 v original -U+0077 w original -U+0078 x original -U+0079 y original -U+007a z original -U+007b braceleft original -U+007c bar original -U+007d braceright original -U+007e asciitilde original -U+00a0 nonbreakingspace original -U+00a1 exclamdown original -U+00a2 cent original -U+00a3 sterling original -U+00a4 currency original -U+00a5 yen original -U+00a6 brokenbar original -U+00a7 section original -U+00a8 dieresis original -U+00a9 copyright original -U+00aa ordfeminine original -U+00ab guillemotleft original -U+00ac logicalnot original -U+00ad sfthyphen original -U+00ae registered original -U+00af macron original -U+00b0 degree original -U+00b1 plusminus original -U+00b2 twosuperior original -U+00b3 threesuperior original -U+00b4 acute original -U+00b5 mu original -U+00b6 paragraph original -U+00b7 periodcentered original -U+00b8 cedilla original -U+00b9 onesuperior original -U+00ba ordmasculine original -U+00bb guillemotright original -U+00bc onequarter original -U+00bd onehalf original -U+00be threequarters original -U+00bf questiondown original -U+00c0 Agrave original -U+00c1 Aacute original -U+00c2 Acircumflex original -U+00c3 Atilde original -U+00c4 Adieresis original -U+00c5 Aring original -U+00c6 AE original -U+00c7 Ccedilla original -U+00c8 Egrave original -U+00c9 Eacute original -U+00ca Ecircumflex original -U+00cb Edieresis original -U+00cc Igrave original -U+00cd Iacute original -U+00ce Icircumflex original -U+00cf Idieresis original -U+00d0 Eth original -U+00d1 Ntilde original -U+00d2 Ograve original -U+00d3 Oacute original -U+00d4 Ocircumflex original -U+00d5 Otilde original -U+00d6 Odieresis original -U+00d7 multiply original -U+00d8 Oslash original -U+00d9 Ugrave original -U+00da Uacute original -U+00db Ucircumflex original -U+00dc Udieresis original -U+00dd Yacute original -U+00de Thorn original -U+00df germandbls original -U+00e0 agrave original -U+00e1 aacute original -U+00e2 acircumflex original -U+00e3 atilde original -U+00e4 adieresis original -U+00e5 aring original -U+00e6 ae original -U+00e7 ccedilla original -U+00e8 egrave original -U+00e9 eacute original -U+00ea ecircumflex original -U+00eb edieresis original -U+00ec igrave original -U+00ed iacute original -U+00ee icircumflex original -U+00ef idieresis original -U+00f0 eth original -U+00f1 ntilde original -U+00f2 ograve original -U+00f3 oacute original -U+00f4 ocircumflex original -U+00f5 otilde original -U+00f6 odieresis original -U+00f7 divide original -U+00f8 oslash original -U+00f9 ugrave original -U+00fa uacute original -U+00fb ucircumflex original -U+00fc udieresis original -U+00fd yacute original -U+00fe thorn original -U+00ff ydieresis original -U+0100 Amacron 1.5 -U+0101 amacron 1.5 -U+0102 Abreve 1.5 -U+0103 abreve 1.5 -U+0104 Aogonek 1.4 -U+0105 aogonek 1.4 -U+0106 Cacute original -U+0107 cacute original -U+0108 Ccircumflex 1.5 -U+0109 ccircumflex 1.5 -U+010a Cdotaccent 1.5 -U+010b cdotaccent 1.5 -U+010c Ccaron original -U+010d ccaron original -U+010e Dcaron 1.0 -U+010f dcaron 1.0 -U+0110 Dcroat 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0111 dcroat original -U+0112 Emacron 1.5 -U+0113 emacron 1.5 -U+0114 Ebreve 1.5 -U+0115 ebreve 1.5 -U+0116 Edotaccent 1.5 -U+0117 edotaccent 1.5 -U+0118 Eogonek 1.4 -U+0119 eogonek 1.4 -U+011a Ecaron 1.0 -U+011b ecaron 1.0 -U+011c Gcircumflex 1.5 -U+011d gcircumflex 1.5 -U+011e Gbreve original -U+011f gbreve original -U+0120 Gdotaccent 1.5 -U+0121 gdotaccent 1.5 -U+0122 Gcommaaccent 1.11 -U+0123 gcommaaccent 1.11 -U+0124 Hcircumflex 1.5 -U+0125 hcircumflex 1.5 -U+0126 Hbar 1.12 -U+0127 hbar 1.12 -U+0128 Itilde 1.5 -U+0129 itilde 1.5 -U+012a Imacron 1.5 -U+012b imacron 1.5 -U+012c Ibreve 1.5 -U+012d ibreve 1.5 -U+012e Iogonek 1.11 -U+012f iogonek 1.11 -U+0130 Idotaccent original -U+0131 dotlessi original -U+0132 IJ 1.11 -U+0133 ij 1.11 -U+0134 Jcircumflex 1.5 -U+0135 jcircumflex 1.5 -U+0136 Kcommaaccent 1.11 -U+0137 kcommaaccent 1.11 -U+0138 kgreenlandic 1.12 -U+0139 Lacute 1.1 -U+013a lacute 1.1 -U+013b Lcommaaccent 1.11 -U+013c lcommaaccent 1.11 -U+013d Lcaron 1.1 -U+013e lcaron 1.1 -U+013f Ldot 1.2 -U+0140 ldot 1.2 -U+0141 Lslash original -U+0142 lslash original -U+0143 Nacute 1.4 -U+0144 nacute 1.4 -U+0145 Ncommaaccent 1.11 -U+0146 ncommaaccent 1.11 -U+0147 Ncaron 1.0 -U+0148 ncaron 1.0 -U+0149 napostrophe 1.12 -U+014a Eng 1.12 -U+014b eng 1.12 -U+014c Omacron 1.5 -U+014d omacron 1.5 -U+014e Obreve 1.5 -U+014f obreve 1.5 -U+0150 Ohungarumlaut 1.5 -U+0151 ohungarumlaut 1.5 -U+0152 OE original -U+0153 oe original -U+0154 Racute 1.1 -U+0155 racute 1.1 -U+0156 Rcommaaccent 1.11 -U+0157 rcommaaccent 1.11 -U+0158 Rcaron 1.0 -U+0159 rcaron 1.0 -U+015a Sacute 1.4 -U+015b sacute 1.4 -U+015c Scircumflex 1.5 -U+015d scircumflex 1.5 -U+015e Scedilla original -U+015f scedilla original -U+0160 Scaron original -U+0161 scaron original -U+0162 Tcommaaccent 1.5 -U+0163 tcommaaccent 1.5 -U+0164 Tcaron 1.0 -U+0165 tcaron 1.0 -U+0166 Tbar 1.12 -U+0167 tbar 1.12 -U+0168 Utilde 1.5 -U+0169 utilde 1.5 -U+016a Umacron 1.5 -U+016b umacron 1.5 -U+016c Ubreve 1.5 -U+016d ubreve 1.5 -U+016e Uring 1.0 -U+016f uring 1.0 -U+0170 Uhungarumlaut 1.5 -U+0171 uhungarumlaut 1.5 -U+0172 Uogonek 1.11 -U+0173 uogonek 1.11 -U+0174 Wcircumflex 1.2 -U+0175 wcircumflex 1.2 -U+0176 Ycircumflex 1.2 -U+0177 ycircumflex 1.2 -U+0178 Ydieresis original -U+0179 Zacute 1.4 -U+017a zacute 1.4 -U+017b Zdotaccent 1.4 -U+017c zdotaccent 1.4 -U+017d Zcaron original -U+017e zcaron original -U+017f longs 1.12 -U+0180 uni0180 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0181 uni0181 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0182 uni0182 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0183 uni0183 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0184 uni0184 2.3 -U+0185 uni0185 2.3 -U+0186 uni0186 1.15 -U+0187 uni0187 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0188 uni0188 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0189 uni0189 2.1 -U+018a uni018A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018b uni018B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018c uni018C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018d uni018D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018e uni018E 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018f uni018F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0190 uni0190 1.15 -U+0191 uni0191 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0192 florin original -U+0193 uni0193 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0194 uni0194 1.14 -U+0195 uni0195 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0196 uni0196 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0197 uni0197 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0198 uni0198 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0199 uni0199 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+019a uni019A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+019b uni019B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+019c uni019C 2.3 -U+019d uni019D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+019e uni019E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+019f uni019F 2.3 -U+01a0 Ohorn 2.3 -U+01a1 ohorn 2.3 -U+01a2 uni01A2 2.3 -U+01a3 uni01A3 2.3 -U+01a4 uni01A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01a5 uni01A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01a6 uni01A6 2.3 -U+01a7 uni01A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01a8 uni01A8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01a9 uni01A9 2.2 -U+01aa uni01AA 2.3 -U+01ab uni01AB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01ac uni01AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01ad uni01AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01ae uni01AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01af Uhorn 2.3 -U+01b0 uhorn 2.3 -U+01b1 uni01B1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01b2 uni01B2 2.3 -U+01b3 uni01B3 2.3 -U+01b4 uni01B4 2.3 -U+01b5 uni01B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01b6 uni01B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01b7 uni01B7 2.3 -U+01b8 uni01B8 2.3 -U+01b9 uni01B9 2.3 -U+01ba uni01BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01bb uni01BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01bc uni01BC 2.3 -U+01bd uni01BD 2.3 -U+01be uni01BE 2.3 -U+01bf uni01BF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01c0 uni01C0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01c1 uni01C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01c2 uni01C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01c3 uni01C3 2.2 -U+01c4 uni01C4 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c5 uni01C5 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c6 uni01C6 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c7 uni01C7 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c8 uni01C8 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c9 uni01C9 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01ca uni01CA 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01cb uni01CB 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01cc uni01CC 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01cd uni01CD 1.15 -U+01ce uni01CE 1.15 -U+01cf uni01CF 1.15 -U+01d0 uni01D0 1.15 -U+01d1 uni01D1 1.15 -U+01d2 uni01D2 1.15 -U+01d3 uni01D3 1.15 -U+01d4 uni01D4 1.15 -U+01d5 uni01D5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01d6 uni01D6 1.13 -U+01d7 uni01D7 2.3 -U+01d8 uni01D8 2.3 -U+01d9 uni01D9 2.3 -U+01da uni01DA 2.3 -U+01db uni01DB 2.3 -U+01dc uni01DC 2.3 -U+01dd uni01DD 2.2 -U+01de uni01DE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique) 2.23 (Serif Italic Condensed) -U+01df uni01DF 1.13 -U+01e0 uni01E0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e1 uni01E1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e2 uni01E2 1.5 -U+01e3 uni01E3 1.5 -U+01e4 uni01E4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+01e5 uni01E5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+01e6 Gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e7 gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e8 uni01E8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e9 uni01E9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01ea uni01EA 1.9 -U+01eb uni01EB 1.9 -U+01ec uni01EC 1.9 -U+01ed uni01ED 1.9 -U+01ee uni01EE 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01ef uni01EF 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01f0 uni01F0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono) 2.22 (Sans Mono Bold) 2.23 (Serif Italic Condensed) -U+01f1 uni01F1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01f2 uni01F2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01f3 uni01F3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01f4 uni01F4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01f5 uni01F5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01f6 uni01F6 2.3 -U+01f7 uni01F7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+01f8 uni01F8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01f9 uni01F9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01fa Aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01fb aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01fc AEacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01fd aeacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01fe Oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01ff oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0200 uni0200 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0201 uni0201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0202 uni0202 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0203 uni0203 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0204 uni0204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0205 uni0205 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0206 uni0206 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0207 uni0207 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0208 uni0208 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0209 uni0209 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020a uni020A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020b uni020B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020c uni020C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020d uni020D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020e uni020E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020f uni020F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0210 uni0210 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0211 uni0211 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0212 uni0212 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0213 uni0213 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0214 uni0214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0215 uni0215 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0216 uni0216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0217 uni0217 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0218 Scommaaccent 1.5 -U+0219 scommaaccent 1.5 -U+021a uni021A 1.5 -U+021b uni021B 1.5 -U+021c uni021C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+021d uni021D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+021e uni021E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+021f uni021F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0220 uni0220 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) 2.23 (Serif Italic Condensed) -U+0221 uni0221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0222 uni0222 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0223 uni0223 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0224 uni0224 2.3 -U+0225 uni0225 2.3 -U+0226 uni0226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0227 uni0227 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0228 uni0228 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0229 uni0229 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+022a uni022A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+022b uni022B 1.13 -U+022c uni022C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+022d uni022D 1.13 -U+022e uni022E 1.10 -U+022f uni022F 1.10 -U+0230 uni0230 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0231 uni0231 1.13 -U+0232 uni0232 1.5 -U+0233 uni0233 1.5 -U+0234 uni0234 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0235 uni0235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0236 uni0236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0237 dotlessj 1.5 -U+0238 uni0238 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0239 uni0239 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+023a uni023A 2.3 -U+023b uni023B 2.3 -U+023c uni023C 2.3 -U+023d uni023D 2.3 -U+023e uni023E 2.3 -U+023f uni023F 2.3 -U+0240 uni0240 2.3 -U+0241 uni0241 2.3 -U+0242 uni0242 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+0243 uni0243 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0244 uni0244 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0245 uni0245 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0246 uni0246 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0247 uni0247 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0248 uni0248 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0249 uni0249 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+024a uni024A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+024b uni024B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight) -U+024c uni024C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+024d uni024D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+024e uni024E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+024f uni024F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0250 uni0250 1.14 -U+0251 uni0251 1.14 -U+0252 uni0252 1.14 -U+0253 uni0253 1.14 -U+0254 uni0254 1.14 -U+0255 uni0255 1.14 -U+0256 uni0256 1.14 -U+0257 uni0257 1.14 -U+0258 uni0258 1.14 -U+0259 uni0259 1.14 -U+025a uni025A 1.14 -U+025b uni025B 1.14 -U+025c uni025C 1.14 -U+025d uni025D 1.14 -U+025e uni025E 1.14 -U+025f uni025F 1.14 -U+0260 uni0260 1.14 -U+0261 uni0261 1.14 -U+0262 uni0262 1.14 -U+0263 uni0263 1.14 -U+0264 uni0264 1.14 -U+0265 uni0265 1.14 -U+0266 uni0266 1.14 -U+0267 uni0267 1.14 -U+0268 uni0268 1.14 -U+0269 uni0269 1.14 -U+026a uni026A 1.14 -U+026b uni026B 1.14 -U+026c uni026C 1.14 -U+026d uni026D 1.14 -U+026e uni026E 1.14 -U+026f uni026F 1.14 -U+0270 uni0270 1.14 -U+0271 uni0271 1.14 -U+0272 uni0272 1.14 -U+0273 uni0273 1.14 -U+0274 uni0274 1.14 -U+0275 uni0275 1.14 -U+0276 uni0276 1.14 -U+0277 uni0277 1.14 -U+0278 uni0278 1.14 -U+0279 uni0279 1.14 -U+027a uni027A 1.14 -U+027b uni027B 1.14 -U+027c uni027C 1.14 -U+027d uni027D 1.14 -U+027e uni027E 1.14 -U+027f uni027F 1.14 -U+0280 uni0280 1.14 -U+0281 uni0281 1.14 -U+0282 uni0282 1.14 -U+0283 uni0283 1.14 -U+0284 uni0284 1.14 -U+0285 uni0285 1.14 -U+0286 uni0286 1.14 -U+0287 uni0287 1.14 -U+0288 uni0288 1.14 -U+0289 uni0289 1.14 -U+028a uni028A 1.14 -U+028b uni028B 1.14 -U+028c uni028C 1.14 -U+028d uni028D 1.14 -U+028e uni028E 1.14 -U+028f uni028F 1.14 -U+0290 uni0290 1.14 -U+0291 uni0291 1.14 -U+0292 uni0292 1.14 -U+0293 uni0293 1.14 -U+0294 uni0294 1.14 -U+0295 uni0295 1.14 -U+0296 uni0296 1.14 -U+0297 uni0297 1.14 -U+0298 uni0298 1.14 -U+0299 uni0299 1.14 -U+029a uni029A 1.14 -U+029b uni029B 1.14 -U+029c uni029C 1.14 -U+029d uni029D 1.14 -U+029e uni029E 1.14 -U+029f uni029F 1.14 -U+02a0 uni02A0 1.14 -U+02a1 uni02A1 1.14 -U+02a2 uni02A2 1.14 -U+02a3 uni02A3 1.14 -U+02a4 uni02A4 1.14 -U+02a5 uni02A5 1.14 -U+02a6 uni02A6 1.14 -U+02a7 uni02A7 1.14 -U+02a8 uni02A8 1.14 -U+02a9 uni02A9 1.14 -U+02aa uni02AA 1.14 -U+02ab uni02AB 1.14 -U+02ac uni02AC 1.14 -U+02ad uni02AD 1.14 -U+02ae uni02AE 1.14 -U+02af uni02AF 1.14 -U+02b0 uni02B0 1.14 -U+02b1 uni02B1 1.14 -U+02b2 uni02B2 1.14 -U+02b3 uni02B3 1.14 -U+02b4 uni02B4 1.14 -U+02b5 uni02B5 1.14 -U+02b6 uni02B6 1.14 -U+02b7 uni02B7 1.14 -U+02b8 uni02B8 1.14 -U+02b9 uni02B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+02ba uni02BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02bb uni02BB 1.5 -U+02bc uni02BC 1.12 -U+02bd uni02BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+02be uni02BE 2.2 -U+02bf uni02BF 2.2 -U+02c0 uni02C0 1.14 -U+02c1 uni02C1 1.14 -U+02c2 uni02C2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02c3 uni02C3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02c4 uni02C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02c5 uni02C5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02c6 circumflex original -U+02c7 caron original -U+02c8 uni02C8 2.0 -U+02c9 uni02C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+02ca uni02CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+02cb uni02CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+02cc uni02CC 2.0 -U+02cd uni02CD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+02ce uni02CE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+02cf uni02CF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+02d0 uni02D0 1.14 -U+02d1 uni02D1 1.14 -U+02d2 uni02D2 2.0 -U+02d3 uni02D3 2.2 -U+02d4 uni02D4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02d5 uni02D5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02d6 uni02D6 2.0 -U+02d7 uni02D7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02d8 breve original -U+02d9 dotaccent original -U+02da ring original -U+02db ogonek original -U+02dc tilde original -U+02dd hungarumlaut original -U+02de uni02DE 2.0 -U+02df uni02DF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02e0 uni02E0 1.14 -U+02e1 uni02E1 1.14 -U+02e2 uni02E2 1.14 -U+02e3 uni02E3 1.14 -U+02e4 uni02E4 1.14 -U+02e5 uni02E5 2.0 -U+02e6 uni02E6 2.0 -U+02e7 uni02E7 2.0 -U+02e8 uni02E8 2.0 -U+02e9 uni02E9 2.0 -U+02ec uni02EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02ed uni02ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02ee uni02EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+02f3 uni02F3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+02f7 uni02F7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0300 gravecomb 1.15 -U+0301 acutecomb 1.15 -U+0302 uni0302 1.15 -U+0303 tildecomb 1.15 -U+0304 uni0304 1.15 -U+0305 uni0305 2.0 -U+0306 uni0306 1.15 -U+0307 uni0307 1.15 -U+0308 uni0308 1.15 -U+0309 hookabovecomb 2.1 -U+030a uni030A 1.15 -U+030b uni030B 1.15 -U+030c uni030C 1.15 -U+030d uni030D 2.0 -U+030e uni030E 2.0 -U+030f uni030F 2.0 -U+0310 uni0310 2.0 -U+0311 uni0311 2.0 -U+0312 uni0312 1.11 -U+0313 uni0313 2.1 -U+0314 uni0314 2.1 -U+0315 uni0315 2.0 -U+0316 uni0316 2.0 -U+0317 uni0317 2.0 -U+0318 uni0318 2.0 -U+0319 uni0319 2.0 -U+031a uni031A 2.1 -U+031b uni031B 2.1 -U+031c uni031C 2.0 -U+031d uni031D 2.0 -U+031e uni031E 2.0 -U+031f uni031F 2.0 -U+0320 uni0320 2.0 -U+0321 uni0321 1.15 -U+0322 uni0322 1.15 -U+0323 dotbelowcomb 2.1 -U+0324 uni0324 2.0 -U+0325 uni0325 2.0 -U+0326 uni0326 1.5 -U+0327 uni0327 2.1 -U+0328 uni0328 2.1 -U+0329 uni0329 2.0 -U+032a uni032A 2.0 -U+032b uni032B 2.1 -U+032c uni032C 2.0 -U+032d uni032D 2.0 -U+032e uni032E 2.0 -U+032f uni032F 2.0 -U+0330 uni0330 2.0 -U+0331 uni0331 2.0 -U+0332 uni0332 2.0 -U+0333 uni0333 2.1 -U+0334 uni0334 2.3 -U+0335 uni0335 2.3 -U+0336 uni0336 2.3 -U+0337 uni0337 2.3 -U+0338 uni0338 2.3 -U+0339 uni0339 2.0 -U+033a uni033A 2.0 -U+033b uni033B 2.0 -U+033c uni033C 2.1 -U+033d uni033D 2.0 -U+033e uni033E 2.1 -U+033f uni033F 2.1 -U+0340 uni0340 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0341 uni0341 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0342 uni0342 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0343 uni0343 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0344 uni0344 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0345 uni0345 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0346 uni0346 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0347 uni0347 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0348 uni0348 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0349 uni0349 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034a uni034A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034b uni034B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034c uni034C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034d uni034D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034e uni034E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034f uni034F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0351 uni0351 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0352 uni0352 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) -U+0353 uni0353 2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+0357 uni0357 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0358 uni0358 2.3 -U+035c uni035C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+035d uni035D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+035e uni035E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+035f uni035F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0360 uni0360 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0361 uni0361 2.0 -U+0362 uni0362 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0370 uni0370 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0371 uni0371 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0372 uni0372 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0373 uni0373 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0374 uni0374 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0375 uni0375 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0376 uni0376 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0377 uni0377 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+037a uni037A 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+037b uni037B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+037c uni037C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+037d uni037D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+037e uni037E 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0384 tonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0385 dieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0386 Alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0387 anoteleia 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0388 Epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0389 Etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+038a Iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+038c Omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+038e Upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+038f Omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0390 iotadieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0391 Alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0392 Beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0393 Gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0394 uni0394 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0395 Epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0396 Zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0397 Eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0398 Theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0399 Iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039a Kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039b Lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039c Mu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039d Nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039e Xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039f Omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a0 Pi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a1 Rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a3 Sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a4 Tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a5 Upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a6 Phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a7 Chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a8 Psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a9 Omega original -U+03aa Iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ab Upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ac alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ad epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ae etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03af iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b1 alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b2 beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b3 gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b4 delta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b5 epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b6 zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b7 eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b8 theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b9 iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ba kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03bb lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03bc uni03BC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03bd nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03be xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03bf omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c0 pi original -U+03c1 rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c2 sigma1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c3 sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c4 tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c5 upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c6 phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c7 chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c8 psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c9 omega 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ca iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cb upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cc omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cd upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ce omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cf uni03CF 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+03d0 uni03D0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d1 theta1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d2 Upsilon1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d3 uni03D3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d4 uni03D4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d5 phi1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03d6 omega1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03d7 uni03D7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d8 uni03D8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03d9 uni03D9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03da uni03DA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03db uni03DB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03dc uni03DC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03dd uni03DD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03de uni03DE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03df uni03DF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03e0 uni03E0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03e1 uni03E1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03e2 uni03E2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e3 uni03E3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e4 uni03E4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e5 uni03E5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e6 uni03E6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e7 uni03E7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e8 uni03E8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e9 uni03E9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ea uni03EA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03eb uni03EB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ec uni03EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ed uni03ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ee uni03EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ef uni03EF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03f0 uni03F0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03f1 uni03F1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03f2 uni03F2 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f3 uni03F3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f4 uni03F4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f5 uni03F5 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f6 uni03F6 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f7 uni03F7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f8 uni03F8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f9 uni03F9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03fa uni03FA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03fb uni03FB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03fc uni03FC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03fd uni03FD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03fe uni03FE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ff uni03FF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0400 uni0400 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0401 uni0401 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0402 uni0402 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0403 uni0403 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0404 uni0404 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0405 uni0405 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0406 uni0406 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0407 uni0407 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0408 uni0408 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0409 uni0409 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040a uni040A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040b uni040B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040c uni040C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040d uni040D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040e uni040E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040f uni040F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0410 uni0410 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0411 uni0411 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0412 uni0412 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0413 uni0413 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0414 uni0414 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0415 uni0415 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0416 uni0416 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0417 uni0417 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0418 uni0418 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0419 uni0419 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041a uni041A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041b uni041B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041c uni041C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041d uni041D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041e uni041E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041f uni041F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0420 uni0420 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0421 uni0421 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0422 uni0422 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0423 uni0423 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0424 uni0424 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0425 uni0425 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0426 uni0426 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0427 uni0427 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0428 uni0428 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0429 uni0429 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042a uni042A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042b uni042B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042c uni042C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042d uni042D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042e uni042E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042f uni042F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0430 uni0430 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0431 uni0431 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0432 uni0432 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0433 uni0433 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0434 uni0434 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0435 uni0435 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0436 uni0436 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0437 uni0437 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0438 uni0438 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0439 uni0439 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043a uni043A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043b uni043B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043c uni043C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043d uni043D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043e uni043E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043f uni043F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0440 uni0440 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0441 uni0441 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0442 uni0442 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0443 uni0443 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0444 uni0444 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0445 uni0445 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0446 uni0446 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0447 uni0447 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0448 uni0448 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0449 uni0449 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044a uni044A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044b uni044B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044c uni044C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044d uni044D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044e uni044E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044f uni044F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0450 uni0450 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0451 uni0451 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0452 uni0452 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0453 uni0453 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0454 uni0454 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0455 uni0455 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0456 uni0456 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0457 uni0457 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0458 uni0458 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0459 uni0459 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045a uni045A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045b uni045B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045c uni045C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045d uni045D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045e uni045E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045f uni045F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0460 uni0460 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0461 uni0461 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0462 uni0462 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0463 uni0463 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0464 uni0464 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0465 uni0465 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0466 uni0466 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0467 uni0467 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0468 uni0468 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0469 uni0469 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046a uni046A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+046b uni046B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+046c uni046C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046d uni046D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046e uni046E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046f uni046F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0470 uni0470 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0471 uni0471 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0472 uni0472 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0473 uni0473 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0474 uni0474 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0475 uni0475 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0476 uni0476 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0477 uni0477 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0478 uni0478 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0479 uni0479 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047a uni047A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047b uni047B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047c uni047C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047d uni047D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047e uni047E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047f uni047F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0480 uni0480 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0481 uni0481 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0482 uni0482 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0483 uni0483 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0484 uni0484 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0485 uni0485 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0486 uni0486 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0487 uni0487 2.9 (Sans, Sans Condensed) 2.27 (Sans Bold, Sans Bold Oblique, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0488 uni0488 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0489 uni0489 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048a uni048A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048b uni048B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048c uni048C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+048d uni048D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+048e uni048E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048f uni048F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0490 uni0490 1.15 -U+0491 uni0491 1.15 -U+0492 uni0492 1.14 -U+0493 uni0493 1.14 -U+0494 uni0494 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0495 uni0495 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0496 uni0496 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0497 uni0497 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0498 uni0498 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0499 uni0499 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+049a uni049A 1.14 -U+049b uni049B 1.14 -U+049c uni049C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+049d uni049D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+049e uni049E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+049f uni049F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a0 uni04A0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+04a1 uni04A1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+04a2 uni04A2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a3 uni04A3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a4 uni04A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04a5 uni04A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04a6 uni04A6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a7 uni04A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a8 uni04A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04a9 uni04A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04aa uni04AA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04ab uni04AB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04ac uni04AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04ad uni04AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04ae uni04AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04af uni04AF 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04b0 uni04B0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+04b1 uni04B1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+04b2 uni04B2 1.14 -U+04b3 uni04B3 1.14 -U+04b4 uni04B4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04b5 uni04B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04b6 uni04B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04b7 uni04B7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04b8 uni04B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04b9 uni04B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04ba uni04BA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04bb uni04BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04bc uni04BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04bd uni04BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04be uni04BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04bf uni04BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04c0 uni04C0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04c1 uni04C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04c2 uni04C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04c3 uni04C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04c4 uni04C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04c5 uni04C5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04c6 uni04C6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04c7 uni04C7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+04c8 uni04C8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+04c9 uni04C9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04ca uni04CA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04cb uni04CB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04cc uni04CC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04cd uni04CD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04ce uni04CE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04cf uni04CF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04d0 uni04D0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d1 uni04D1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d2 uni04D2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d3 uni04D3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d4 uni04D4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d5 uni04D5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d6 uni04D6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d7 uni04D7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d8 uni04D8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04d9 uni04D9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04da uni04DA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04db uni04DB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04dc uni04DC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04dd uni04DD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04de uni04DE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04df uni04DF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e0 uni04E0 2.3 -U+04e1 uni04E1 2.3 -U+04e2 uni04E2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e3 uni04E3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e4 uni04E4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e5 uni04E5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e6 uni04E6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04e7 uni04E7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04e8 uni04E8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04e9 uni04E9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04ea uni04EA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04eb uni04EB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04ec uni04EC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04ed uni04ED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04ee uni04EE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04ef uni04EF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f0 uni04F0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04f1 uni04F1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f2 uni04F2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04f3 uni04F3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f4 uni04F4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04f5 uni04F5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04f6 uni04F6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f7 uni04F7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f8 uni04F8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f9 uni04F9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04fa uni04FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fb uni04FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fc uni04FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fd uni04FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fe uni04FE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+04ff uni04FF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0500 uni0500 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0501 uni0501 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0502 uni0502 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0503 uni0503 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0504 uni0504 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0505 uni0505 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0506 uni0506 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0507 uni0507 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0508 uni0508 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0509 uni0509 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050a uni050A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050b uni050B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050c uni050C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050d uni050D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050e uni050E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050f uni050F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0510 uni0510 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0511 uni0511 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0512 uni0512 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0513 uni0513 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0514 uni0514 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0515 uni0515 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0516 uni0516 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0517 uni0517 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0518 uni0518 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0519 uni0519 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+051a uni051A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+051b uni051B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+051c uni051C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+051d uni051D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0520 uni0520 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0521 uni0521 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0522 uni0522 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0523 uni0523 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0531 uni0531 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0532 uni0532 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0533 uni0533 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0534 uni0534 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0535 uni0535 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0536 uni0536 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0537 uni0537 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0538 uni0538 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0539 uni0539 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053a uni053A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053b uni053B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053c uni053C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053d uni053D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053e uni053E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053f uni053F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0540 uni0540 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0541 uni0541 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0542 uni0542 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0543 uni0543 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0544 uni0544 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0545 uni0545 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0546 uni0546 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0547 uni0547 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0548 uni0548 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0549 uni0549 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054a uni054A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054b uni054B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054c uni054C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054d uni054D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+054e uni054E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054f uni054F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0550 uni0550 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0551 uni0551 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0552 uni0552 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0553 uni0553 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0554 uni0554 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0555 uni0555 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0556 uni0556 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0559 uni0559 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055a uni055A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+055b uni055B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055c uni055C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055d uni055D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+055e uni055E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055f uni055F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0561 uni0561 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0562 uni0562 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0563 uni0563 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0564 uni0564 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0565 uni0565 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0566 uni0566 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0567 uni0567 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0568 uni0568 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0569 uni0569 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056a uni056A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056b uni056B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+056c uni056C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+056d uni056D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+056e uni056E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056f uni056F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0570 uni0570 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0571 uni0571 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0572 uni0572 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0573 uni0573 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0574 uni0574 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0575 uni0575 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0576 uni0576 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0577 uni0577 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0578 uni0578 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0579 uni0579 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+057a uni057A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+057b uni057B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+057c uni057C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+057d uni057D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+057e uni057E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+057f uni057F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0580 uni0580 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0581 uni0581 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0582 uni0582 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0583 uni0583 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0584 uni0584 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0585 uni0585 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0586 uni0586 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0587 uni0587 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0589 uni0589 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+058a uni058A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b0 uni05B0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b1 uni05B1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b2 uni05B2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b3 uni05B3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b4 uni05B4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b5 uni05B5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b6 uni05B6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b7 uni05B7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b8 uni05B8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b9 uni05B9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05ba uni05BA 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+05bb uni05BB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05bc uni05BC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05bd uni05BD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05be uni05BE 2.9 (Sans Condensed Oblique, Sans Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) -U+05bf uni05BF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c0 uni05C0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c1 uni05C1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c2 uni05C2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c3 uni05C3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c6 uni05C6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c7 uni05C7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d0 uni05D0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d1 uni05D1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d2 uni05D2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d3 uni05D3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d4 uni05D4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d5 uni05D5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d6 uni05D6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d7 uni05D7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d8 uni05D8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d9 uni05D9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05da uni05DA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05db uni05DB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05dc uni05DC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05dd uni05DD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05de uni05DE 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05df uni05DF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e0 uni05E0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e1 uni05E1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e2 uni05E2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e3 uni05E3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e4 uni05E4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e5 uni05E5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e6 uni05E6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e7 uni05E7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e8 uni05E8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e9 uni05E9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05ea uni05EA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05f0 uni05F0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05f1 uni05F1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05f2 uni05F2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05f3 uni05F3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+05f4 uni05F4 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0606 uni0606 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) -U+0607 uni0607 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) -U+0609 uni0609 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) -U+060a uni060A 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) -U+060c uni060C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0615 uni0615 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+061b uni061B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+061f uni061F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0621 uni0621 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0622 uni0622 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0623 uni0623 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0624 uni0624 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0625 uni0625 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0626 uni0626 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0627 uni0627 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0628 uni0628 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0629 uni0629 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062a uni062A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062b uni062B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062c uni062C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062d uni062D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062e uni062E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062f uni062F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0630 uni0630 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0631 uni0631 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0632 uni0632 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0633 uni0633 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0634 uni0634 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0635 uni0635 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0636 uni0636 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0637 uni0637 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0638 uni0638 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0639 uni0639 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+063a uni063A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0640 uni0640 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0641 uni0641 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0642 uni0642 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0643 uni0643 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0644 uni0644 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0645 uni0645 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0646 uni0646 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0647 uni0647 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0648 uni0648 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0649 uni0649 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064a uni064A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064b uni064B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064c uni064C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064d uni064D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064e uni064E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064f uni064F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0650 uni0650 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0651 uni0651 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0652 uni0652 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0653 uni0653 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0654 uni0654 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0655 uni0655 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+065a uni065A 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0660 uni0660 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0661 uni0661 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0662 uni0662 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0663 uni0663 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0664 uni0664 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0665 uni0665 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0666 uni0666 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0667 uni0667 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0668 uni0668 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0669 uni0669 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066a uni066A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066b uni066B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066c uni066C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066d uni066D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066e uni066E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066f uni066F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0674 uni0674 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight) 2.16 (Sans Mono, Sans Mono Bold) -U+0679 uni0679 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067a uni067A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067b uni067B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067c uni067C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067d uni067D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067e uni067E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067f uni067F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0680 uni0680 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0681 uni0681 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0682 uni0682 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0683 uni0683 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0684 uni0684 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0685 uni0685 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0686 uni0686 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0687 uni0687 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0691 uni0691 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0692 uni0692 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0695 uni0695 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+0698 uni0698 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06a1 uni06A1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06a4 uni06A4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06a6 uni06A6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+06a9 uni06A9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06af uni06AF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06b5 uni06B5 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06ba uni06BA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06be uni06BE 2.16 (Sans Mono, Sans Mono Bold) -U+06bf uni06BF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+06c6 uni06C6 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06cc uni06CC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06ce uni06CE 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06d5 uni06D5 2.10 (Sans, Sans Bold) 2.11 (Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f0 uni06F0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f1 uni06F1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f2 uni06F2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f3 uni06F3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f4 uni06F4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f5 uni06F5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f6 uni06F6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f7 uni06F7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f8 uni06F8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f9 uni06F9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+07c0 uni07C0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c1 uni07C1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c2 uni07C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c3 uni07C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c4 uni07C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c5 uni07C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c6 uni07C6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c7 uni07C7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c8 uni07C8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c9 uni07C9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ca uni07CA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07cb uni07CB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07cc uni07CC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07cd uni07CD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ce uni07CE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07cf uni07CF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d0 uni07D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d1 uni07D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d2 uni07D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d3 uni07D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d4 uni07D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d5 uni07D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d6 uni07D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d7 uni07D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d8 uni07D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d9 uni07D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07da uni07DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07db uni07DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07dc uni07DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07dd uni07DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07de uni07DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07df uni07DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e0 uni07E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e1 uni07E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e2 uni07E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e3 uni07E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e4 uni07E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e5 uni07E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e6 uni07E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e7 uni07E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07eb uni07EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ec uni07EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ed uni07ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ee uni07EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ef uni07EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f0 uni07F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f1 uni07F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f2 uni07F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f3 uni07F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f4 uni07F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f5 uni07F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f8 uni07F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f9 uni07F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07fa uni07FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+0e3f uni0E3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0e81 uni0E81 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e82 uni0E82 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e84 uni0E84 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e87 uni0E87 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e88 uni0E88 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e8a uni0E8A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e8d uni0E8D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e94 uni0E94 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e95 uni0E95 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e96 uni0E96 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e97 uni0E97 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e99 uni0E99 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9a uni0E9A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9b uni0E9B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9c uni0E9C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9d uni0E9D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9e uni0E9E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9f uni0E9F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea1 uni0EA1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea2 uni0EA2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea3 uni0EA3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea5 uni0EA5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea7 uni0EA7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eaa uni0EAA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eab uni0EAB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ead uni0EAD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eae uni0EAE 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eaf uni0EAF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb0 uni0EB0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb1 uni0EB1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb2 uni0EB2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb3 uni0EB3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb4 uni0EB4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb5 uni0EB5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb6 uni0EB6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb7 uni0EB7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb8 uni0EB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb9 uni0EB9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ebb uni0EBB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ebc uni0EBC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ebd uni0EBD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec0 uni0EC0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec1 uni0EC1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec2 uni0EC2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec3 uni0EC3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec4 uni0EC4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec6 uni0EC6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec8 uni0EC8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ec9 uni0EC9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eca uni0ECA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ecb uni0ECB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ecc uni0ECC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ecd uni0ECD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ed0 uni0ED0 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed1 uni0ED1 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed2 uni0ED2 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed3 uni0ED3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed4 uni0ED4 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed5 uni0ED5 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed6 uni0ED6 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed7 uni0ED7 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed8 uni0ED8 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0ed9 uni0ED9 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0edc uni0EDC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0edd uni0EDD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+10a0 uni10A0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a1 uni10A1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a2 uni10A2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a3 uni10A3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a4 uni10A4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a5 uni10A5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a6 uni10A6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a7 uni10A7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a8 uni10A8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a9 uni10A9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10aa uni10AA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ab uni10AB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ac uni10AC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ad uni10AD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ae uni10AE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10af uni10AF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b0 uni10B0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b1 uni10B1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b2 uni10B2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b3 uni10B3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b4 uni10B4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b5 uni10B5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b6 uni10B6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b7 uni10B7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b8 uni10B8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b9 uni10B9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ba uni10BA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10bb uni10BB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10bc uni10BC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10bd uni10BD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10be uni10BE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10bf uni10BF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c0 uni10C0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c1 uni10C1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c2 uni10C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c3 uni10C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c4 uni10C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c5 uni10C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d0 uni10D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d1 uni10D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d2 uni10D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d3 uni10D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d4 uni10D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d5 uni10D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d6 uni10D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d7 uni10D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d8 uni10D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d9 uni10D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10da uni10DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10db uni10DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10dc uni10DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10dd uni10DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10de uni10DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10df uni10DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e0 uni10E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e1 uni10E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e2 uni10E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e3 uni10E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e4 uni10E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e5 uni10E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e6 uni10E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e7 uni10E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e8 uni10E8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e9 uni10E9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ea uni10EA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10eb uni10EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ec uni10EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ed uni10ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ee uni10EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ef uni10EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f0 uni10F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f1 uni10F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f2 uni10F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f3 uni10F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f4 uni10F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f5 uni10F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f6 uni10F6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f7 uni10F7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f8 uni10F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f9 uni10F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fa uni10FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fb uni10FB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fc uni10FC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+1401 uni1401 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1402 uni1402 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1403 uni1403 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1404 uni1404 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1405 uni1405 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1406 uni1406 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1407 uni1407 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1409 uni1409 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140a uni140A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140b uni140B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140c uni140C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140d uni140D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140e uni140E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140f uni140F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1410 uni1410 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1411 uni1411 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1412 uni1412 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1413 uni1413 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1414 uni1414 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1415 uni1415 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1416 uni1416 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1417 uni1417 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1418 uni1418 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1419 uni1419 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141a uni141A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141b uni141B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141d uni141D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141e uni141E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141f uni141F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1420 uni1420 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1421 uni1421 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1422 uni1422 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1423 uni1423 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1424 uni1424 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1425 uni1425 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1426 uni1426 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1427 uni1427 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1428 uni1428 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1429 uni1429 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142a uni142A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142b uni142B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142c uni142C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142d uni142D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142e uni142E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142f uni142F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1430 uni1430 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1431 uni1431 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1432 uni1432 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1433 uni1433 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1434 uni1434 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1435 uni1435 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1437 uni1437 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1438 uni1438 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1439 uni1439 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143a uni143A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143b uni143B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143c uni143C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143d uni143D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143e uni143E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143f uni143F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1440 uni1440 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1441 uni1441 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1442 uni1442 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1443 uni1443 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1444 uni1444 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1445 uni1445 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1446 uni1446 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1447 uni1447 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1448 uni1448 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1449 uni1449 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144a uni144A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144c uni144C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144d uni144D 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144e uni144E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144f uni144F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1450 uni1450 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1451 uni1451 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1452 uni1452 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1454 uni1454 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1455 uni1455 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1456 uni1456 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1457 uni1457 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1458 uni1458 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1459 uni1459 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145a uni145A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145b uni145B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145c uni145C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145d uni145D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145e uni145E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145f uni145F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1460 uni1460 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1461 uni1461 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1462 uni1462 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1463 uni1463 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1464 uni1464 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1465 uni1465 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1466 uni1466 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1467 uni1467 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1468 uni1468 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1469 uni1469 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146a uni146A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146b uni146B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146c uni146C 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146d uni146D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146e uni146E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146f uni146F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1470 uni1470 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1471 uni1471 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1472 uni1472 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1473 uni1473 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1474 uni1474 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1475 uni1475 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1476 uni1476 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1477 uni1477 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1478 uni1478 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1479 uni1479 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147a uni147A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147b uni147B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147c uni147C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147d uni147D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147e uni147E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147f uni147F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1480 uni1480 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1481 uni1481 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1482 uni1482 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1483 uni1483 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1484 uni1484 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1485 uni1485 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1486 uni1486 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1487 uni1487 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1488 uni1488 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1489 uni1489 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148a uni148A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148b uni148B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148c uni148C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148d uni148D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148e uni148E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148f uni148F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1490 uni1490 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1491 uni1491 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1492 uni1492 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1493 uni1493 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1494 uni1494 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1495 uni1495 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1496 uni1496 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1497 uni1497 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1498 uni1498 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1499 uni1499 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149a uni149A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149b uni149B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149c uni149C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149d uni149D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149e uni149E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149f uni149F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a0 uni14A0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a1 uni14A1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a2 uni14A2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a3 uni14A3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a4 uni14A4 2.13 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.15 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+14a5 uni14A5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a6 uni14A6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a7 uni14A7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a8 uni14A8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a9 uni14A9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14aa uni14AA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ab uni14AB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ac uni14AC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ad uni14AD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ae uni14AE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14af uni14AF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b0 uni14B0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b1 uni14B1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b2 uni14B2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b3 uni14B3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b4 uni14B4 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b5 uni14B5 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b6 uni14B6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b7 uni14B7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b8 uni14B8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b9 uni14B9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ba uni14BA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14bb uni14BB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14bc uni14BC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14bd uni14BD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c0 uni14C0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c1 uni14C1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c2 uni14C2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c3 uni14C3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c4 uni14C4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c5 uni14C5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c6 uni14C6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c7 uni14C7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c8 uni14C8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c9 uni14C9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ca uni14CA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14cb uni14CB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14cc uni14CC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14cd uni14CD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ce uni14CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14cf uni14CF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d0 uni14D0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d1 uni14D1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d2 uni14D2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d3 uni14D3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d4 uni14D4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d5 uni14D5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d6 uni14D6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d7 uni14D7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d8 uni14D8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d9 uni14D9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14da uni14DA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14db uni14DB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14dc uni14DC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14dd uni14DD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14de uni14DE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14df uni14DF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e0 uni14E0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e1 uni14E1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e2 uni14E2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e3 uni14E3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e4 uni14E4 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e5 uni14E5 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e6 uni14E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e7 uni14E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e8 uni14E8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e9 uni14E9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ea uni14EA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ec uni14EC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ed uni14ED 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ee uni14EE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ef uni14EF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f0 uni14F0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f1 uni14F1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f2 uni14F2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f3 uni14F3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f4 uni14F4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f5 uni14F5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f6 uni14F6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f7 uni14F7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f8 uni14F8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f9 uni14F9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fa uni14FA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fb uni14FB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fc uni14FC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fd uni14FD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fe uni14FE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ff uni14FF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1500 uni1500 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1501 uni1501 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1502 uni1502 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1503 uni1503 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1504 uni1504 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1505 uni1505 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1506 uni1506 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1507 uni1507 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1510 uni1510 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1511 uni1511 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1512 uni1512 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1513 uni1513 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1514 uni1514 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1515 uni1515 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1516 uni1516 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1517 uni1517 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1518 uni1518 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1519 uni1519 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151a uni151A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151b uni151B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151c uni151C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151d uni151D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151e uni151E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151f uni151F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1520 uni1520 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1521 uni1521 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1522 uni1522 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1523 uni1523 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1524 uni1524 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1525 uni1525 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1526 uni1526 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1527 uni1527 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1528 uni1528 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1529 uni1529 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152a uni152A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152b uni152B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152c uni152C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152d uni152D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152e uni152E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152f uni152F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1530 uni1530 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1531 uni1531 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1532 uni1532 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1533 uni1533 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1534 uni1534 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1535 uni1535 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1536 uni1536 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1537 uni1537 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1538 uni1538 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1539 uni1539 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153a uni153A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153b uni153B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153c uni153C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153d uni153D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153e uni153E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1540 uni1540 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1541 uni1541 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1542 uni1542 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1543 uni1543 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1544 uni1544 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1545 uni1545 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1546 uni1546 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1547 uni1547 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1548 uni1548 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1549 uni1549 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154a uni154A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154b uni154B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154c uni154C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154d uni154D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154e uni154E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154f uni154F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1550 uni1550 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1552 uni1552 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1553 uni1553 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1554 uni1554 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1555 uni1555 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1556 uni1556 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1557 uni1557 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1558 uni1558 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1559 uni1559 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155a uni155A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155b uni155B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155c uni155C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155d uni155D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155e uni155E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155f uni155F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1560 uni1560 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1561 uni1561 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1562 uni1562 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1563 uni1563 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1564 uni1564 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1565 uni1565 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1566 uni1566 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1567 uni1567 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1568 uni1568 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1569 uni1569 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+156a uni156A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1574 uni1574 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1575 uni1575 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1576 uni1576 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1577 uni1577 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1578 uni1578 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1579 uni1579 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157a uni157A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157b uni157B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157c uni157C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157d uni157D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157e uni157E 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157f uni157F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1580 uni1580 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1581 uni1581 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1582 uni1582 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1583 uni1583 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1584 uni1584 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1585 uni1585 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158a uni158A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158b uni158B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158c uni158C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158d uni158D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158e uni158E 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158f uni158F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1590 uni1590 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1591 uni1591 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1592 uni1592 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1593 uni1593 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1594 uni1594 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1595 uni1595 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1596 uni1596 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a0 uni15A0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a1 uni15A1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a2 uni15A2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a3 uni15A3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a4 uni15A4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a5 uni15A5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a6 uni15A6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a7 uni15A7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a8 uni15A8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a9 uni15A9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15aa uni15AA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15ab uni15AB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15ac uni15AC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15ad uni15AD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15ae uni15AE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15af uni15AF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15de uni15DE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15e1 uni15E1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1646 uni1646 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1647 uni1647 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+166e uni166E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+166f uni166F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1670 uni1670 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1671 uni1671 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1672 uni1672 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1673 uni1673 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1674 uni1674 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1675 uni1675 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1676 uni1676 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1680 uni1680 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1681 uni1681 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1682 uni1682 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1683 uni1683 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1684 uni1684 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1685 uni1685 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1686 uni1686 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1687 uni1687 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1688 uni1688 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1689 uni1689 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+168a uni168A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+168b uni168B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+168c uni168C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+168d uni168D 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+168e uni168E 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+168f uni168F 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1690 uni1690 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1691 uni1691 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1692 uni1692 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1693 uni1693 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1694 uni1694 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1695 uni1695 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1696 uni1696 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1697 uni1697 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1698 uni1698 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1699 uni1699 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+169a uni169A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+169b uni169B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+169c uni169C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+1d00 uni1D00 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d01 uni1D01 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d02 uni1D02 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d03 uni1D03 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d04 uni1D04 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d05 uni1D05 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d06 uni1D06 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d07 uni1D07 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d08 uni1D08 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+1d09 uni1D09 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d0a uni1D0A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d0b uni1D0B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0c uni1D0C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d0d uni1D0D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0e uni1D0E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0f uni1D0F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d10 uni1D10 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d11 uni1D11 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d12 uni1D12 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d13 uni1D13 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d14 uni1D14 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d16 uni1D16 2.3 -U+1d17 uni1D17 2.3 -U+1d18 uni1D18 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d19 uni1D19 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+1d1a uni1D1A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+1d1b uni1D1B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d1c uni1D1C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d1d uni1D1D 2.3 -U+1d1e uni1D1E 2.3 -U+1d1f uni1D1F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+1d20 uni1D20 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d21 uni1D21 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d22 uni1D22 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d23 uni1D23 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d26 uni1D26 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d27 uni1D27 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d28 uni1D28 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d29 uni1D29 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d2a uni1D2A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d2b uni1D2B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+1d2c uni1D2C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d2d uni1D2D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d2e uni1D2E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d30 uni1D30 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d31 uni1D31 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d32 uni1D32 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d33 uni1D33 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d34 uni1D34 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d35 uni1D35 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d36 uni1D36 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d37 uni1D37 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d38 uni1D38 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d39 uni1D39 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3a uni1D3A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3b uni1D3B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3c uni1D3C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3d uni1D3D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique) -U+1d3e uni1D3E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3f uni1D3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d40 uni1D40 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d41 uni1D41 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d42 uni1D42 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d43 uni1D43 2.3 -U+1d44 uni1D44 2.3 -U+1d45 uni1D45 2.3 -U+1d46 uni1D46 2.3 -U+1d47 uni1D47 2.3 -U+1d48 uni1D48 2.3 -U+1d49 uni1D49 2.3 -U+1d4a uni1D4A 2.3 -U+1d4b uni1D4B 2.3 -U+1d4c uni1D4C 2.3 -U+1d4d uni1D4D 2.3 -U+1d4e uni1D4E 2.3 -U+1d4f uni1D4F 2.3 -U+1d50 uni1D50 2.3 -U+1d51 uni1D51 2.3 -U+1d52 uni1D52 2.3 -U+1d53 uni1D53 2.3 -U+1d54 uni1D54 2.3 -U+1d55 uni1D55 2.3 -U+1d56 uni1D56 2.3 -U+1d57 uni1D57 2.3 -U+1d58 uni1D58 2.3 -U+1d59 uni1D59 2.3 -U+1d5a uni1D5A 2.3 -U+1d5b uni1D5B 2.3 -U+1d5d uni1D5D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d5e uni1D5E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d5f uni1D5F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d60 uni1D60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d61 uni1D61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d62 uni1D62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d63 uni1D63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d64 uni1D64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d65 uni1D65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d66 uni1D66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d67 uni1D67 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d68 uni1D68 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d69 uni1D69 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d6a uni1D6A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d77 uni1D77 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d78 uni1D78 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d7b uni1D7B 2.3 -U+1d85 uni1D85 2.3 -U+1d9b uni1D9B 2.3 -U+1d9c uni1D9C 2.3 -U+1d9d uni1D9D 2.3 -U+1d9e uni1D9E 2.3 -U+1d9f uni1D9F 2.3 -U+1da0 uni1DA0 2.3 -U+1da1 uni1DA1 2.3 -U+1da2 uni1DA2 2.3 -U+1da3 uni1DA3 2.3 -U+1da4 uni1DA4 2.3 -U+1da5 uni1DA5 2.3 -U+1da6 uni1DA6 2.3 -U+1da7 uni1DA7 2.3 -U+1da8 uni1DA8 2.3 -U+1da9 uni1DA9 2.3 -U+1daa uni1DAA 2.3 -U+1dab uni1DAB 2.3 -U+1dac uni1DAC 2.3 -U+1dad uni1DAD 2.3 -U+1dae uni1DAE 2.3 -U+1daf uni1DAF 2.3 -U+1db0 uni1DB0 2.3 -U+1db1 uni1DB1 2.3 -U+1db2 uni1DB2 2.3 -U+1db3 uni1DB3 2.3 -U+1db4 uni1DB4 2.3 -U+1db5 uni1DB5 2.3 -U+1db6 uni1DB6 2.3 -U+1db7 uni1DB7 2.3 -U+1db8 uni1DB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1db9 uni1DB9 2.3 -U+1dba uni1DBA 2.3 -U+1dbb uni1DBB 2.3 -U+1dbc uni1DBC 2.3 -U+1dbd uni1DBD 2.3 -U+1dbe uni1DBE 2.3 -U+1dbf uni1DBF 2.3 -U+1dc4 uni1DC4 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc5 uni1DC5 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc6 uni1DC6 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc7 uni1DC7 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc8 uni1DC8 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc9 uni1DC9 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1e00 uni1E00 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e01 uni1E01 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e02 uni1E02 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e03 uni1E03 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e04 uni1E04 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e05 uni1E05 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e06 uni1E06 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e07 uni1E07 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e08 uni1E08 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e09 uni1E09 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e0a uni1E0A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e0b uni1E0B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e0c uni1E0C 2.1 -U+1e0d uni1E0D 2.1 -U+1e0e uni1E0E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e0f uni1E0F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e10 uni1E10 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e11 uni1E11 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e12 uni1E12 1.13 -U+1e13 uni1E13 1.13 -U+1e14 uni1E14 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e15 uni1E15 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e16 uni1E16 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e17 uni1E17 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e18 uni1E18 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e19 uni1E19 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e1a uni1E1A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e1b uni1E1B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e1c uni1E1C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1e1d uni1E1D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1e1e uni1E1E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e1f uni1E1F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e20 uni1E20 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e21 uni1E21 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e22 uni1E22 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e23 uni1E23 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e24 uni1E24 2.1 -U+1e25 uni1E25 2.1 -U+1e26 uni1E26 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e27 uni1E27 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e28 uni1E28 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e29 uni1E29 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2a uni1E2A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2b uni1E2B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2c uni1E2C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2d uni1E2D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2e uni1E2E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e2f uni1E2F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e30 uni1E30 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e31 uni1E31 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e32 uni1E32 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e33 uni1E33 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e34 uni1E34 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e35 uni1E35 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e36 uni1E36 2.1 -U+1e37 uni1E37 2.1 -U+1e38 uni1E38 2.1 -U+1e39 uni1E39 2.1 -U+1e3a uni1E3A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e3b uni1E3B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e3c uni1E3C 1.13 -U+1e3d uni1E3D 1.13 -U+1e3e uni1E3E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e3f uni1E3F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e40 uni1E40 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e41 uni1E41 2.1 -U+1e42 uni1E42 2.1 -U+1e43 uni1E43 2.1 -U+1e44 uni1E44 1.13 -U+1e45 uni1E45 1.13 -U+1e46 uni1E46 2.1 -U+1e47 uni1E47 2.1 -U+1e48 uni1E48 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e49 uni1E49 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e4a uni1E4A 1.13 -U+1e4b uni1E4B 1.13 -U+1e4c uni1E4C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e4d uni1E4D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e4e uni1E4E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e4f uni1E4F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e50 uni1E50 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e51 uni1E51 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e52 uni1E52 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e53 uni1E53 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e54 uni1E54 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e55 uni1E55 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e56 uni1E56 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e57 uni1E57 2.1 -U+1e58 uni1E58 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e59 uni1E59 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e5a uni1E5A 2.1 -U+1e5b uni1E5B 2.1 -U+1e5c uni1E5C 2.1 -U+1e5d uni1E5D 2.1 -U+1e5e uni1E5E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e5f uni1E5F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e60 uni1E60 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e61 uni1E61 2.1 -U+1e62 uni1E62 2.1 -U+1e63 uni1E63 2.1 -U+1e64 uni1E64 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1e65 uni1E65 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1e66 uni1E66 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e67 uni1E67 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e68 uni1E68 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e69 uni1E69 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e6a uni1E6A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e6b uni1E6B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e6c uni1E6C 2.1 -U+1e6d uni1E6D 2.1 -U+1e6e uni1E6E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e6f uni1E6F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e70 uni1E70 1.13 -U+1e71 uni1E71 1.13 -U+1e72 uni1E72 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e73 uni1E73 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e74 uni1E74 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e75 uni1E75 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e76 uni1E76 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e77 uni1E77 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e78 uni1E78 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e79 uni1E79 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e7a uni1E7A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e7b uni1E7B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e7c uni1E7C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e7d uni1E7D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e7e uni1E7E 2.1 -U+1e7f uni1E7F 2.1 -U+1e80 Wgrave 1.2 -U+1e81 wgrave 1.2 -U+1e82 Wacute 1.2 -U+1e83 wacute 1.2 -U+1e84 Wdieresis 1.2 -U+1e85 wdieresis 1.2 -U+1e86 uni1E86 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e87 uni1E87 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e88 uni1E88 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e89 uni1E89 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e8a uni1E8A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e8b uni1E8B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e8c uni1E8C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e8d uni1E8D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e8e uni1E8E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e8f uni1E8F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e90 uni1E90 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e91 uni1E91 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e92 uni1E92 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e93 uni1E93 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e94 uni1E94 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e95 uni1E95 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e96 uni1E96 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e97 uni1E97 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e98 uni1E98 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e99 uni1E99 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e9a uni1E9A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e9b uni1E9B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e9f uni1E9F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1ea0 uni1EA0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ea1 uni1EA1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ea2 uni1EA2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ea3 uni1EA3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ea4 uni1EA4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea5 uni1EA5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea6 uni1EA6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea7 uni1EA7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea8 uni1EA8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea9 uni1EA9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eaa uni1EAA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eab uni1EAB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eac uni1EAC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ead uni1EAD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eae uni1EAE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eaf uni1EAF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb0 uni1EB0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1eb1 uni1EB1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1eb2 uni1EB2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb3 uni1EB3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb4 uni1EB4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb5 uni1EB5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb6 uni1EB6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eb7 uni1EB7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eb8 uni1EB8 2.2 -U+1eb9 uni1EB9 2.2 -U+1eba uni1EBA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ebb uni1EBB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ebc uni1EBC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ebd uni1EBD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ebe uni1EBE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ebf uni1EBF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec0 uni1EC0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec1 uni1EC1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec2 uni1EC2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec3 uni1EC3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec4 uni1EC4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec5 uni1EC5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec6 uni1EC6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ec7 uni1EC7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ec8 uni1EC8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ec9 uni1EC9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eca uni1ECA 2.2 -U+1ecb uni1ECB 2.2 -U+1ecc uni1ECC 2.2 -U+1ecd uni1ECD 2.2 -U+1ece uni1ECE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ecf uni1ECF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ed0 uni1ED0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed1 uni1ED1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed2 uni1ED2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed3 uni1ED3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed4 uni1ED4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed5 uni1ED5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed6 uni1ED6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed7 uni1ED7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed8 uni1ED8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ed9 uni1ED9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eda uni1EDA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edb uni1EDB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edc uni1EDC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edd uni1EDD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ede uni1EDE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1edf uni1EDF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ee0 uni1EE0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee1 uni1EE1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee2 uni1EE2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee3 uni1EE3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee4 uni1EE4 2.2 -U+1ee5 uni1EE5 2.2 -U+1ee6 uni1EE6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ee7 uni1EE7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ee8 uni1EE8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee9 uni1EE9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eea uni1EEA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eeb uni1EEB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eec uni1EEC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eed uni1EED 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eee uni1EEE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eef uni1EEF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef0 uni1EF0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef1 uni1EF1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef2 Ygrave 1.2 -U+1ef3 ygrave 1.2 -U+1ef4 uni1EF4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ef5 uni1EF5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ef6 uni1EF6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ef7 uni1EF7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ef8 uni1EF8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ef9 uni1EF9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f00 uni1F00 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f01 uni1F01 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f02 uni1F02 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f03 uni1F03 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f04 uni1F04 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f05 uni1F05 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f06 uni1F06 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f07 uni1F07 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f08 uni1F08 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f09 uni1F09 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0a uni1F0A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0b uni1F0B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0c uni1F0C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0d uni1F0D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0e uni1F0E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0f uni1F0F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f10 uni1F10 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f11 uni1F11 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f12 uni1F12 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f13 uni1F13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f14 uni1F14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f15 uni1F15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f18 uni1F18 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f19 uni1F19 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f1a uni1F1A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f1b uni1F1B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f1c uni1F1C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f1d uni1F1D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f20 uni1F20 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f21 uni1F21 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f22 uni1F22 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f23 uni1F23 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f24 uni1F24 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f25 uni1F25 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f26 uni1F26 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f27 uni1F27 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f28 uni1F28 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f29 uni1F29 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2a uni1F2A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2b uni1F2B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2c uni1F2C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2d uni1F2D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2e uni1F2E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2f uni1F2F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f30 uni1F30 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f31 uni1F31 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f32 uni1F32 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f33 uni1F33 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f34 uni1F34 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f35 uni1F35 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f36 uni1F36 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f37 uni1F37 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f38 uni1F38 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f39 uni1F39 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3a uni1F3A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3b uni1F3B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3c uni1F3C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3d uni1F3D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3e uni1F3E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3f uni1F3F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f40 uni1F40 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f41 uni1F41 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f42 uni1F42 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f43 uni1F43 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f44 uni1F44 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f45 uni1F45 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f48 uni1F48 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f49 uni1F49 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f4a uni1F4A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f4b uni1F4B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f4c uni1F4C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f4d uni1F4D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f50 uni1F50 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f51 uni1F51 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f52 uni1F52 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f53 uni1F53 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f54 uni1F54 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f55 uni1F55 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f56 uni1F56 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f57 uni1F57 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f59 uni1F59 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f5b uni1F5B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f5d uni1F5D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f5f uni1F5F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f60 uni1F60 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f61 uni1F61 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f62 uni1F62 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f63 uni1F63 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f64 uni1F64 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f65 uni1F65 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f66 uni1F66 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f67 uni1F67 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f68 uni1F68 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f69 uni1F69 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6a uni1F6A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6b uni1F6B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6c uni1F6C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6d uni1F6D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6e uni1F6E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6f uni1F6F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f70 uni1F70 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f71 uni1F71 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f72 uni1F72 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f73 uni1F73 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f74 uni1F74 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f75 uni1F75 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f76 uni1F76 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f77 uni1F77 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f78 uni1F78 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f79 uni1F79 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f7a uni1F7A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f7b uni1F7B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f7c uni1F7C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f7d uni1F7D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f80 uni1F80 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f81 uni1F81 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f82 uni1F82 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f83 uni1F83 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f84 uni1F84 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f85 uni1F85 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f86 uni1F86 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f87 uni1F87 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f88 uni1F88 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f89 uni1F89 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8a uni1F8A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8b uni1F8B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8c uni1F8C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8d uni1F8D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8e uni1F8E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8f uni1F8F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f90 uni1F90 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f91 uni1F91 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f92 uni1F92 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f93 uni1F93 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f94 uni1F94 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f95 uni1F95 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f96 uni1F96 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f97 uni1F97 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f98 uni1F98 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f99 uni1F99 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9a uni1F9A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9b uni1F9B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9c uni1F9C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9d uni1F9D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9e uni1F9E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9f uni1F9F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa0 uni1FA0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa1 uni1FA1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa2 uni1FA2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa3 uni1FA3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa4 uni1FA4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa5 uni1FA5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa6 uni1FA6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa7 uni1FA7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa8 uni1FA8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa9 uni1FA9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1faa uni1FAA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fab uni1FAB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fac uni1FAC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fad uni1FAD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fae uni1FAE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1faf uni1FAF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb0 uni1FB0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb1 uni1FB1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb2 uni1FB2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb3 uni1FB3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb4 uni1FB4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb6 uni1FB6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb7 uni1FB7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb8 uni1FB8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fb9 uni1FB9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fba uni1FBA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fbb uni1FBB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fbc uni1FBC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fbd uni1FBD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fbe uni1FBE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fbf uni1FBF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc0 uni1FC0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fc1 uni1FC1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fc2 uni1FC2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc3 uni1FC3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc4 uni1FC4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc6 uni1FC6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fc7 uni1FC7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc8 uni1FC8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fc9 uni1FC9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fca uni1FCA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fcb uni1FCB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fcc uni1FCC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fcd uni1FCD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fce uni1FCE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fcf uni1FCF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd0 uni1FD0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd1 uni1FD1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd2 uni1FD2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd3 uni1FD3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd6 uni1FD6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd7 uni1FD7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd8 uni1FD8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fd9 uni1FD9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fda uni1FDA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fdb uni1FDB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fdd uni1FDD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fde uni1FDE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fdf uni1FDF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe0 uni1FE0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe1 uni1FE1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe2 uni1FE2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe3 uni1FE3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe4 uni1FE4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe5 uni1FE5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe6 uni1FE6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe7 uni1FE7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe8 uni1FE8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fe9 uni1FE9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fea uni1FEA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1feb uni1FEB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fec uni1FEC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fed uni1FED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fee uni1FEE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fef uni1FEF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ff2 uni1FF2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff3 uni1FF3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff4 uni1FF4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff6 uni1FF6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff7 uni1FF7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff8 uni1FF8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ff9 uni1FF9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ffa uni1FFA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ffb uni1FFB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ffc uni1FFC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ffd uni1FFD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ffe uni1FFE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+2000 uni2000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2001 uni2001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2002 uni2002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2003 uni2003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2004 uni2004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2005 uni2005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2006 uni2006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2007 uni2007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2008 uni2008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2009 uni2009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+200a uni200A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+200b uni200B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+200c uni200C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+200d uni200D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+200e uni200E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+200f uni200F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2010 uni2010 1.5 -U+2011 uni2011 1.5 -U+2012 figuredash 1.5 -U+2013 endash original -U+2014 emdash original -U+2015 uni2015 1.5 -U+2016 uni2016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2017 underscoredbl 2.3 -U+2018 quoteleft original -U+2019 quoteright original -U+201a quotesinglbase original -U+201b quotereversed 2.3 -U+201c quotedblleft original -U+201d quotedblright original -U+201e quotedblbase original -U+201f uni201F 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+2020 dagger original -U+2021 daggerdbl original -U+2022 bullet original -U+2023 uni2023 2.2 -U+2024 onedotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2025 twodotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2026 ellipsis original -U+2027 uni2027 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+202a uni202A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202b uni202B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202c uni202C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202d uni202D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202e uni202E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202f uni202F 2.11 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) -U+2030 perthousand original -U+2031 uni2031 2.1 -U+2032 minute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2033 second 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2034 uni2034 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2035 uni2035 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2036 uni2036 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2037 uni2037 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2038 uni2038 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2039 guilsinglleft original -U+203a guilsinglright original -U+203b uni203B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+203c exclamdbl 2.0 -U+203d uni203D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+203e uni203E 2.3 -U+203f uni203F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2040 uni2040 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2041 uni2041 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2042 uni2042 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2043 uni2043 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2044 fraction 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2045 uni2045 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2046 uni2046 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2047 uni2047 2.0 -U+2048 uni2048 2.0 -U+2049 uni2049 2.0 -U+204a uni204A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+204b uni204B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+204c uni204C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+204d uni204D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+204e uni204E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+204f uni204F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2050 uni2050 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2051 uni2051 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2052 uni2052 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2053 uni2053 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2054 uni2054 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2055 uni2055 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2056 uni2056 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2057 uni2057 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2058 uni2058 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2059 uni2059 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205a uni205A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205b uni205B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205c uni205C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205d uni205D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205e uni205E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205f uni205F 2.14 -U+2060 uni2060 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2061 uni2061 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2062 uni2062 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2063 uni2063 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2064 uni2064 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+206a uni206A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206b uni206B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206c uni206C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206d uni206D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206e uni206E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206f uni206F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2070 uni2070 2.2 -U+2071 uni2071 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2074 uni2074 2.2 -U+2075 uni2075 2.2 -U+2076 uni2076 2.2 -U+2077 uni2077 2.2 -U+2078 uni2078 2.2 -U+2079 uni2079 2.2 -U+207a uni207A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207b uni207B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207c uni207C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207d uni207D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207e uni207E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207f uni207F 1.14 -U+2080 uni2080 2.4 -U+2081 uni2081 2.4 -U+2082 uni2082 2.4 -U+2083 uni2083 2.4 -U+2084 uni2084 2.4 -U+2085 uni2085 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2086 uni2086 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2087 uni2087 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2088 uni2088 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2089 uni2089 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+208a uni208A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+208b uni208B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+208c uni208C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+208d uni208D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+208e uni208E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2090 uni2090 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2091 uni2091 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2092 uni2092 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2093 uni2093 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2094 uni2094 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+20a0 uni20A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a1 colonmonetary 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a2 uni20A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a3 franc 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a4 lira 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a5 uni20A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a6 uni20A6 2.3 -U+20a7 peseta 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a8 uni20A8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a9 uni20A9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20aa uni20AA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20ab dong 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20ac Euro original -U+20ad uni20AD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20ae uni20AE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20af uni20AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20b0 uni20B0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20b1 uni20B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+20b2 uni20B2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20b3 uni20B3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20b4 uni20B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+20b5 uni20B5 2.2 -U+20d0 uni20D0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+20d1 uni20D1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+20d6 uni20D6 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20d7 uni20D7 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20db uni20DB 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20dc uni20DC 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20e1 uni20E1 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2100 uni2100 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2101 uni2101 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2102 uni2102 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.16 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Condensed) -U+2103 uni2103 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2104 uni2104 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2105 uni2105 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2106 uni2106 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2107 uni2107 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2108 uni2108 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2109 uni2109 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+210b uni210B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+210c uni210C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+210d uni210D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+210e uni210E 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+210f uni210F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2110 uni2110 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2111 Ifraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2112 uni2112 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2113 uni2113 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2114 uni2114 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2115 uni2115 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2116 uni2116 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2117 uni2117 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2118 weierstrass 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2119 uni2119 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+211a uni211A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+211b uni211B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+211c Rfraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+211d uni211D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+211e prescription 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+211f uni211F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2120 uni2120 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2121 uni2121 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2122 trademark original -U+2123 uni2123 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2124 uni2124 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2125 uni2125 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2126 uni2126 2.2 -U+2127 uni2127 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2128 uni2128 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2129 uni2129 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+212a uni212A 2.2 -U+212b uni212B 2.2 -U+212c uni212C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+212d uni212D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+212e estimated 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+212f uni212F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2130 uni2130 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2131 uni2131 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2132 uni2132 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+2133 uni2133 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2134 uni2134 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2135 aleph 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2136 uni2136 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2137 uni2137 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2138 uni2138 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2139 uni2139 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+213a uni213A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+213b uni213B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+213c uni213C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+213d uni213D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+213e uni213E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+213f uni213F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2140 uni2140 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2141 uni2141 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2142 uni2142 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2143 uni2143 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2144 uni2144 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2145 uni2145 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2146 uni2146 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2147 uni2147 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2148 uni2148 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2149 uni2149 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+214b uni214B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+214e uni214E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2153 onethird 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2154 twothirds 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2155 uni2155 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2156 uni2156 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2157 uni2157 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2158 uni2158 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2159 uni2159 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215a uni215A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215b oneeighth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215c threeeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215d fiveeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215e seveneighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215f uni215F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2160 uni2160 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2161 uni2161 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2162 uni2162 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2163 uni2163 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2164 uni2164 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2165 uni2165 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2166 uni2166 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2167 uni2167 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2168 uni2168 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2169 uni2169 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216a uni216A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216b uni216B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216c uni216C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216d uni216D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216e uni216E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216f uni216F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2170 uni2170 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2171 uni2171 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2172 uni2172 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2173 uni2173 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2174 uni2174 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2175 uni2175 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2176 uni2176 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2177 uni2177 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2178 uni2178 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2179 uni2179 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217a uni217A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217b uni217B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217c uni217C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217d uni217D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217e uni217E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217f uni217F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2180 uni2180 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2181 uni2181 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2182 uni2182 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2183 uni2183 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2184 uni2184 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2190 arrowleft 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2191 arrowup 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2192 arrowright 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2193 arrowdown 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2194 arrowboth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2195 arrowupdn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2196 uni2196 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2197 uni2197 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2198 uni2198 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2199 uni2199 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219a uni219A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219b uni219B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219c uni219C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219d uni219D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219e uni219E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219f uni219F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a0 uni21A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a1 uni21A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a2 uni21A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a3 uni21A3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a4 uni21A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a5 uni21A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a6 uni21A6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a7 uni21A7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a8 arrowupdnbse 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a9 uni21A9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21aa uni21AA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ab uni21AB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ac uni21AC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ad uni21AD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ae uni21AE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21af uni21AF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b0 uni21B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b1 uni21B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b2 uni21B2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b3 uni21B3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b4 uni21B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b5 carriagereturn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b6 uni21B6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b7 uni21B7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b8 uni21B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b9 uni21B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ba uni21BA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21bb uni21BB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21bc uni21BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21bd uni21BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21be uni21BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21bf uni21BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c0 uni21C0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c1 uni21C1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c2 uni21C2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c3 uni21C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c4 uni21C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c5 uni21C5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c6 uni21C6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c7 uni21C7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c8 uni21C8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c9 uni21C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ca uni21CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21cb uni21CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21cc uni21CC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21cd uni21CD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ce uni21CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21cf uni21CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d0 arrowdblleft 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d1 arrowdblup 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d2 arrowdblright 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d3 arrowdbldown 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d4 arrowdblboth 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d5 uni21D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d6 uni21D6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d7 uni21D7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d8 uni21D8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d9 uni21D9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21da uni21DA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21db uni21DB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21dc uni21DC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21dd uni21DD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21de uni21DE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21df uni21DF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e0 uni21E0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e1 uni21E1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e2 uni21E2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e3 uni21E3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e4 uni21E4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e5 uni21E5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e6 uni21E6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e7 uni21E7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e8 uni21E8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e9 uni21E9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ea uni21EA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21eb uni21EB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ec uni21EC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ed uni21ED 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ee uni21EE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ef uni21EF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f0 uni21F0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f1 uni21F1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f2 uni21F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f3 uni21F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f4 uni21F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f5 uni21F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f6 uni21F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f7 uni21F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f8 uni21F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f9 uni21F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fa uni21FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fb uni21FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fc uni21FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fd uni21FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fe uni21FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ff uni21FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2200 universal 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2201 uni2201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2202 partialdiff original -U+2203 existential 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2204 uni2204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2205 emptyset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2206 Delta original -U+2207 gradient 2.1 -U+2208 element 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2209 notelement 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+220a uni220A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+220b suchthat 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+220c uni220C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+220d uni220D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+220e uni220E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+220f product original -U+2210 uni2210 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2211 summation original -U+2212 minus original -U+2213 uni2213 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2214 uni2214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2215 uni2215 original -U+2216 uni2216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2217 asteriskmath 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2218 uni2218 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2219 uni2219 original -U+221a radical original -U+221b uni221B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+221c uni221C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+221d proportional 2.1 -U+221e infinity original -U+221f orthogonal 2.1 -U+2220 angle 2.3 -U+2221 uni2221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2222 uni2222 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2223 uni2223 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2224 uni2224 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2225 uni2225 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2226 uni2226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2227 logicaland 2.1 -U+2228 logicalor 2.1 -U+2229 intersection 2.1 -U+222a union 2.1 -U+222b integral original -U+222c uni222C 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+222d uni222D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+222e uni222E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+222f uni222F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2230 uni2230 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2231 uni2231 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2232 uni2232 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2233 uni2233 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2234 therefore 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2235 uni2235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2236 uni2236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2237 uni2237 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2238 uni2238 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2239 uni2239 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223a uni223A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223b uni223B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223c similar 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223d uni223D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223e uni223E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+223f uni223F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2240 uni2240 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2241 uni2241 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2242 uni2242 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2243 uni2243 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2244 uni2244 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2245 congruent 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2246 uni2246 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2247 uni2247 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2248 approxequal original -U+2249 uni2249 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224a uni224A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224b uni224B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224c uni224C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224d uni224D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224e uni224E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224f uni224F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2250 uni2250 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2251 uni2251 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2252 uni2252 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2253 uni2253 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2254 uni2254 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2255 uni2255 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2256 uni2256 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2257 uni2257 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2258 uni2258 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2259 uni2259 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225a uni225A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225b uni225B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225c uni225C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225d uni225D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225e uni225E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225f uni225F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2260 notequal original -U+2261 equivalence 2.1 -U+2262 uni2262 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2263 uni2263 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2264 lessequal original -U+2265 greaterequal original -U+2266 uni2266 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2267 uni2267 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2268 uni2268 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2269 uni2269 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+226a uni226A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+226b uni226B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+226c uni226C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+226d uni226D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+226e uni226E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+226f uni226F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2270 uni2270 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2271 uni2271 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2272 uni2272 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2273 uni2273 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2274 uni2274 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2275 uni2275 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2276 uni2276 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2277 uni2277 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2278 uni2278 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2279 uni2279 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227a uni227A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227b uni227B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227c uni227C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227d uni227D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227e uni227E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227f uni227F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2280 uni2280 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2281 uni2281 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2282 propersubset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2283 propersuperset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2284 notsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2285 uni2285 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2286 reflexsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2287 reflexsuperset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2288 uni2288 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2289 uni2289 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+228a uni228A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+228b uni228B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+228c uni228C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+228d uni228D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+228e uni228E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+228f uni228F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2290 uni2290 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2291 uni2291 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2292 uni2292 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2293 uni2293 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2294 uni2294 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2295 circleplus 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2296 uni2296 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2297 circlemultiply 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2298 uni2298 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2299 uni2299 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229a uni229A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229b uni229B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229c uni229C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229d uni229D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229e uni229E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229f uni229F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a0 uni22A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a1 uni22A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a2 uni22A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a3 uni22A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a4 uni22A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a5 perpendicular 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a6 uni22A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a7 uni22A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a8 uni22A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a9 uni22A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22aa uni22AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22ab uni22AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22ac uni22AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22ad uni22AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22ae uni22AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22af uni22AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22b0 uni22B0 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b1 uni22B1 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b2 uni22B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b3 uni22B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b4 uni22B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b5 uni22B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b6 uni22B6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b7 uni22B7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b8 uni22B8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b9 uni22B9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ba uni22BA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22bb uni22BB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22bc uni22BC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22bd uni22BD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22be uni22BE 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+22bf uni22BF 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+22c0 uni22C0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c1 uni22C1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c2 uni22C2 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c3 uni22C3 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c4 uni22C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c5 dotmath 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22c6 uni22C6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+22c7 uni22C7 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c8 uni22C8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c9 uni22C9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ca uni22CA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22cb uni22CB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22cc uni22CC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22cd uni22CD 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22ce uni22CE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22cf uni22CF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d0 uni22D0 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d1 uni22D1 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d2 uni22D2 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d3 uni22D3 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d4 uni22D4 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d5 uni22D5 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d6 uni22D6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d7 uni22D7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d8 uni22D8 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22d9 uni22D9 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22da uni22DA 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22db uni22DB 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22dc uni22DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22dd uni22DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22de uni22DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22df uni22DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e0 uni22E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e1 uni22E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e2 uni22E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e3 uni22E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e4 uni22E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e5 uni22E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e6 uni22E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e7 uni22E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e8 uni22E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e9 uni22E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22ea uni22EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22eb uni22EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ec uni22EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ed uni22ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ee uni22EE 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ef uni22EF 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f0 uni22F0 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f1 uni22F1 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f2 uni22F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f3 uni22F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f4 uni22F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f5 uni22F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f6 uni22F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f7 uni22F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f8 uni22F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f9 uni22F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fa uni22FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fb uni22FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fc uni22FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fd uni22FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fe uni22FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ff uni22FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2300 uni2300 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2301 uni2301 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2302 house 1.14 -U+2303 uni2303 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2304 uni2304 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2305 uni2305 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2306 uni2306 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2307 uni2307 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2308 uni2308 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2309 uni2309 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+230a uni230A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+230b uni230B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+230c uni230C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+230d uni230D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+230e uni230E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+230f uni230F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2310 revlogicalnot 1.14 -U+2311 uni2311 1.15 -U+2312 uni2312 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2313 uni2313 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2314 uni2314 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2315 uni2315 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2318 uni2318 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2319 uni2319 1.14 -U+231c uni231C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+231d uni231D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+231e uni231E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+231f uni231F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2320 integraltp 2.3 -U+2321 integralbt 2.3 -U+2324 uni2324 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.19 (Sans Condensed Oblique, Sans Oblique) -U+2325 uni2325 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2326 uni2326 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2327 uni2327 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2328 uni2328 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2329 angleleft 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+232a angleright 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+232b uni232B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+232c uni232C 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2335 uni2335 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2337 uni2337 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2338 uni2338 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2339 uni2339 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233a uni233A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233b uni233B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233c uni233C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233d uni233D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233e uni233E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2341 uni2341 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2342 uni2342 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2343 uni2343 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2344 uni2344 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2347 uni2347 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2348 uni2348 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2349 uni2349 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+234b uni234B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+234c uni234C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+234d uni234D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2350 uni2350 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2352 uni2352 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2353 uni2353 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2354 uni2354 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2357 uni2357 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2358 uni2358 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2359 uni2359 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235a uni235A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235b uni235B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235c uni235C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235e uni235E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235f uni235F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2360 uni2360 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2363 uni2363 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2364 uni2364 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2365 uni2365 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2368 uni2368 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2369 uni2369 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236b uni236B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236c uni236C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236d uni236D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236e uni236E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236f uni236F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2370 uni2370 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2373 uni2373 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2374 uni2374 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2375 uni2375 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2376 uni2376 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2377 uni2377 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2378 uni2378 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2379 uni2379 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+237a uni237A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+237d uni237D 1.15 -U+2380 uni2380 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2381 uni2381 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2382 uni2382 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2383 uni2383 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2387 uni2387 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2388 uni2388 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2389 uni2389 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+238a uni238A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+238b uni238B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2394 uni2394 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2395 uni2395 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+239b uni239B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239c uni239C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239d uni239D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239e uni239E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239f uni239F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a0 uni23A0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a1 uni23A1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a2 uni23A2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a3 uni23A3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a4 uni23A4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a5 uni23A5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a6 uni23A6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a7 uni23A7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a8 uni23A8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a9 uni23A9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23aa uni23AA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ab uni23AB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ac uni23AC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ad uni23AD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ae uni23AE 2.3 -U+23ce uni23CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23cf uni23CF 2.3 -U+23e3 uni23E3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+23e5 uni23E5 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2422 uni2422 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2423 uni2423 1.6 -U+2460 uni2460 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2461 uni2461 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2462 uni2462 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2463 uni2463 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2464 uni2464 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2465 uni2465 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2466 uni2466 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2467 uni2467 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2468 uni2468 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2469 uni2469 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2500 SF100000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2501 uni2501 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2502 SF110000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2503 uni2503 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2504 uni2504 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2505 uni2505 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2506 uni2506 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2507 uni2507 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2508 uni2508 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2509 uni2509 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250a uni250A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250b uni250B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250c SF010000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250d uni250D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250e uni250E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250f uni250F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2510 SF030000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2511 uni2511 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2512 uni2512 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2513 uni2513 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2514 SF020000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2515 uni2515 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2516 uni2516 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2517 uni2517 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2518 SF040000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2519 uni2519 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251a uni251A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251b uni251B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251c SF080000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251d uni251D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251e uni251E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251f uni251F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2520 uni2520 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2521 uni2521 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2522 uni2522 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2523 uni2523 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2524 SF090000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2525 uni2525 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2526 uni2526 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2527 uni2527 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2528 uni2528 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2529 uni2529 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252a uni252A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252b uni252B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252c SF060000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252d uni252D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252e uni252E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252f uni252F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2530 uni2530 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2531 uni2531 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2532 uni2532 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2533 uni2533 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2534 SF070000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2535 uni2535 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2536 uni2536 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2537 uni2537 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2538 uni2538 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2539 uni2539 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253a uni253A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253b uni253B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253c SF050000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253d uni253D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253e uni253E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253f uni253F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2540 uni2540 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2541 uni2541 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2542 uni2542 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2543 uni2543 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2544 uni2544 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2545 uni2545 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2546 uni2546 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2547 uni2547 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2548 uni2548 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2549 uni2549 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254a uni254A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254b uni254B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254c uni254C 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254d uni254D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254e uni254E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254f uni254F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2550 SF430000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2551 SF240000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2552 SF510000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2553 SF520000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2554 SF390000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2555 SF220000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2556 SF210000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2557 SF250000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2558 SF500000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2559 SF490000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255a SF380000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255b SF280000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255c SF270000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255d SF260000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255e SF360000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255f SF370000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2560 SF420000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2561 SF190000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2562 SF200000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2563 SF230000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2564 SF470000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2565 SF480000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2566 SF410000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2567 SF450000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2568 SF460000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2569 SF400000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256a SF540000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256b SF530000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256c SF440000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256d uni256D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256e uni256E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256f uni256F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2570 uni2570 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2571 uni2571 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2572 uni2572 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2573 uni2573 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2574 uni2574 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2575 uni2575 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2576 uni2576 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2577 uni2577 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2578 uni2578 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2579 uni2579 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257a uni257A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257b uni257B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257c uni257C 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257d uni257D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257e uni257E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257f uni257F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2580 upblock 1.14 -U+2581 uni2581 1.14 -U+2582 uni2582 1.14 -U+2583 uni2583 1.14 -U+2584 dnblock 1.14 -U+2585 uni2585 1.14 -U+2586 uni2586 1.14 -U+2587 uni2587 1.14 -U+2588 block 1.14 -U+2589 uni2589 1.14 -U+258a uni258A 1.14 -U+258b uni258B 1.14 -U+258c lfblock 1.14 -U+258d uni258D 1.14 -U+258e uni258E 1.14 -U+258f uni258F 1.14 -U+2590 rtblock 1.14 -U+2591 ltshade 1.15 -U+2592 shade 1.15 -U+2593 dkshade 1.15 -U+2594 uni2594 1.14 -U+2595 uni2595 1.14 -U+2596 uni2596 1.14 -U+2597 uni2597 1.14 -U+2598 uni2598 1.14 -U+2599 uni2599 1.14 -U+259a uni259A 1.14 -U+259b uni259B 1.14 -U+259c uni259C 1.14 -U+259d uni259D 1.14 -U+259e uni259E 1.14 -U+259f uni259F 1.14 -U+25a0 filledbox 2.3 -U+25a1 H22073 2.3 -U+25a2 uni25A2 2.3 -U+25a3 uni25A3 2.3 -U+25a4 uni25A4 2.3 -U+25a5 uni25A5 2.3 -U+25a6 uni25A6 2.3 -U+25a7 uni25A7 2.3 -U+25a8 uni25A8 2.3 -U+25a9 uni25A9 2.3 -U+25aa H18543 2.3 -U+25ab H18551 2.3 -U+25ac filledrect 2.3 -U+25ad uni25AD 2.3 -U+25ae uni25AE 2.3 -U+25af uni25AF 2.3 -U+25b0 uni25B0 2.3 -U+25b1 uni25B1 2.3 -U+25b2 triagup 2.3 -U+25b3 uni25B3 2.3 -U+25b4 uni25B4 2.3 -U+25b5 uni25B5 2.3 -U+25b6 uni25B6 2.3 -U+25b7 uni25B7 2.3 -U+25b8 uni25B8 2.3 -U+25b9 uni25B9 2.3 -U+25ba triagrt 2.3 -U+25bb uni25BB 2.3 -U+25bc triagdn 2.3 -U+25bd uni25BD 2.3 -U+25be uni25BE 2.3 -U+25bf uni25BF 2.3 -U+25c0 uni25C0 2.3 -U+25c1 uni25C1 2.3 -U+25c2 uni25C2 2.3 -U+25c3 uni25C3 2.3 -U+25c4 triaglf 2.3 -U+25c5 uni25C5 2.3 -U+25c6 uni25C6 2.3 -U+25c7 uni25C7 2.3 -U+25c8 uni25C8 2.3 -U+25c9 uni25C9 2.3 -U+25ca lozenge original -U+25cb circle 2.3 -U+25cc uni25CC 2.3 -U+25cd uni25CD 2.3 -U+25ce uni25CE 2.3 -U+25cf H18533 2.3 -U+25d0 uni25D0 2.3 -U+25d1 uni25D1 2.3 -U+25d2 uni25D2 2.3 -U+25d3 uni25D3 2.3 -U+25d4 uni25D4 2.3 -U+25d5 uni25D5 2.3 -U+25d6 uni25D6 2.3 -U+25d7 uni25D7 2.3 -U+25d8 invbullet 2.2 -U+25d9 invcircle 2.3 -U+25da uni25DA 2.3 -U+25db uni25DB 2.3 -U+25dc uni25DC 2.3 -U+25dd uni25DD 2.3 -U+25de uni25DE 2.3 -U+25df uni25DF 2.3 -U+25e0 uni25E0 2.3 -U+25e1 uni25E1 2.3 -U+25e2 uni25E2 2.3 -U+25e3 uni25E3 2.3 -U+25e4 uni25E4 2.3 -U+25e5 uni25E5 2.3 -U+25e6 openbullet 2.2 -U+25e7 uni25E7 2.3 -U+25e8 uni25E8 2.3 -U+25e9 uni25E9 2.3 -U+25ea uni25EA 2.3 -U+25eb uni25EB 2.3 -U+25ec uni25EC 2.3 -U+25ed uni25ED 2.3 -U+25ee uni25EE 2.3 -U+25ef uni25EF 2.3 -U+25f0 uni25F0 2.3 -U+25f1 uni25F1 2.3 -U+25f2 uni25F2 2.3 -U+25f3 uni25F3 2.3 -U+25f4 uni25F4 2.3 -U+25f5 uni25F5 2.3 -U+25f6 uni25F6 2.3 -U+25f7 uni25F7 2.3 -U+25f8 uni25F8 2.3 -U+25f9 uni25F9 2.3 -U+25fa uni25FA 2.3 -U+25fb uni25FB 2.3 -U+25fc uni25FC 2.3 -U+25fd uni25FD 2.3 -U+25fe uni25FE 2.3 -U+25ff uni25FF 2.3 -U+2600 uni2600 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2601 uni2601 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2602 uni2602 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2603 uni2603 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2604 uni2604 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2605 uni2605 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2606 uni2606 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2607 uni2607 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2608 uni2608 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2609 uni2609 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260a uni260A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260b uni260B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260c uni260C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260d uni260D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260e uni260E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260f uni260F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2610 uni2610 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2611 uni2611 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2612 uni2612 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2613 uni2613 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2614 uni2614 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2615 uni2615 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2616 uni2616 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2617 uni2617 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2618 uni2618 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2619 uni2619 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261a uni261A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261b uni261B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261c uni261C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261d uni261D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261e uni261E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261f uni261F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2620 uni2620 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2621 uni2621 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2622 uni2622 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2623 uni2623 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2624 uni2624 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2625 uni2625 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2626 uni2626 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2627 uni2627 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2628 uni2628 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2629 uni2629 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262a uni262A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262b uni262B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262c uni262C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262d uni262D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262e uni262E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262f uni262F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2630 uni2630 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2631 uni2631 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2632 uni2632 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2633 uni2633 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2634 uni2634 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2635 uni2635 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2636 uni2636 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2637 uni2637 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2638 uni2638 1.15 -U+2639 uni2639 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+263a smileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+263b invsmileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+263c sun 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+263d uni263D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+263e uni263E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+263f uni263F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2640 female 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2641 uni2641 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2642 male 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2643 uni2643 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2644 uni2644 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2645 uni2645 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2646 uni2646 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2647 uni2647 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2648 uni2648 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2649 uni2649 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264a uni264A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264b uni264B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264c uni264C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264d uni264D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264e uni264E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264f uni264F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2650 uni2650 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2651 uni2651 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2652 uni2652 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2653 uni2653 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2654 uni2654 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2655 uni2655 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2656 uni2656 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2657 uni2657 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2658 uni2658 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2659 uni2659 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265a uni265A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265b uni265B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265c uni265C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265d uni265D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265e uni265E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265f uni265F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2660 spade 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2661 uni2661 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2662 uni2662 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2663 club 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2664 uni2664 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2665 heart 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2666 diamond 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2667 uni2667 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2668 uni2668 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2669 uni2669 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266a musicalnote 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266b musicalnotedbl 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266c uni266C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266d uni266D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266e uni266E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266f uni266F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2670 uni2670 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2671 uni2671 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2672 uni2672 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2673 uni2673 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2674 uni2674 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2675 uni2675 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2676 uni2676 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2677 uni2677 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2678 uni2678 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2679 uni2679 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267a uni267A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267b uni267B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267c uni267C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267d uni267D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267e uni267E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267f uni267F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2680 uni2680 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2681 uni2681 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2682 uni2682 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2683 uni2683 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2684 uni2684 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2685 uni2685 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2686 uni2686 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2687 uni2687 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2688 uni2688 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2689 uni2689 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+268a uni268A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+268b uni268B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+268c uni268C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+268d uni268D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+268e uni268E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+268f uni268F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2690 uni2690 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2691 uni2691 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2692 uni2692 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2693 uni2693 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2694 uni2694 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2695 uni2695 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2696 uni2696 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2697 uni2697 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2698 uni2698 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2699 uni2699 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+269a uni269A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+269b uni269B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+269c uni269C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+26a0 uni26A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+26a1 uni26A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+26a2 uni26A2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a3 uni26A3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a4 uni26A4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a5 uni26A5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a6 uni26A6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a7 uni26A7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a8 uni26A8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a9 uni26A9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26aa uni26AA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26ab uni26AB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26ac uni26AC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26ad uni26AD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26ae uni26AE 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26af uni26AF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26b0 uni26B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+26b1 uni26B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+26b2 uni26B2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2701 uni2701 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2702 uni2702 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2703 uni2703 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2704 uni2704 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2706 uni2706 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2707 uni2707 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2708 uni2708 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2709 uni2709 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+270c uni270C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+270d uni270D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+270e uni270E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+270f uni270F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2710 uni2710 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2711 uni2711 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2712 uni2712 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2713 uni2713 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2714 uni2714 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2715 uni2715 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2716 uni2716 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2717 uni2717 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2718 uni2718 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2719 uni2719 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271a uni271A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271b uni271B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271c uni271C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271d uni271D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271e uni271E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271f uni271F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2720 uni2720 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2721 uni2721 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2722 uni2722 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2723 uni2723 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2724 uni2724 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2725 uni2725 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2726 uni2726 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2727 uni2727 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2729 uni2729 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272a uni272A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272b uni272B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272c uni272C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272d uni272D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272e uni272E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272f uni272F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2730 uni2730 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2731 uni2731 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2732 uni2732 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2733 uni2733 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2734 uni2734 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2735 uni2735 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2736 uni2736 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2737 uni2737 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2738 uni2738 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2739 uni2739 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273a uni273A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273b uni273B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273c uni273C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273d uni273D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273e uni273E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273f uni273F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2740 uni2740 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2741 uni2741 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2742 uni2742 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2743 uni2743 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2744 uni2744 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2745 uni2745 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2746 uni2746 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2747 uni2747 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2748 uni2748 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2749 uni2749 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+274a uni274A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+274b uni274B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+274d uni274D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+274f uni274F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2750 uni2750 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2751 uni2751 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2752 uni2752 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2756 uni2756 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2758 uni2758 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2759 uni2759 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275a uni275A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275b uni275B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275c uni275C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275d uni275D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275e uni275E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2761 uni2761 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2762 uni2762 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2763 uni2763 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2764 uni2764 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2765 uni2765 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2766 uni2766 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2767 uni2767 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2768 uni2768 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2769 uni2769 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276a uni276A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276b uni276B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276c uni276C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276d uni276D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276e uni276E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276f uni276F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2770 uni2770 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2771 uni2771 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2772 uni2772 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2773 uni2773 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2774 uni2774 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2775 uni2775 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2776 uni2776 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2777 uni2777 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2778 uni2778 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2779 uni2779 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277a uni277A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277b uni277B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277c uni277C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277d uni277D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277e uni277E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277f uni277F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2780 uni2780 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2781 uni2781 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2782 uni2782 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2783 uni2783 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2784 uni2784 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2785 uni2785 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2786 uni2786 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2787 uni2787 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2788 uni2788 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2789 uni2789 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278a uni278A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278b uni278B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278c uni278C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278d uni278D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278e uni278E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278f uni278F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2790 uni2790 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2791 uni2791 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2792 uni2792 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2793 uni2793 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2794 uni2794 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2798 uni2798 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2799 uni2799 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279a uni279A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279b uni279B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279c uni279C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279d uni279D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279e uni279E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279f uni279F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a0 uni27A0 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a1 uni27A1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27a2 uni27A2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a3 uni27A3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a4 uni27A4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a5 uni27A5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a6 uni27A6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a7 uni27A7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a8 uni27A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a9 uni27A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27aa uni27AA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ab uni27AB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ac uni27AC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ad uni27AD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ae uni27AE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27af uni27AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b1 uni27B1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b2 uni27B2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b3 uni27B3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b4 uni27B4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b5 uni27B5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b6 uni27B6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b7 uni27B7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b8 uni27B8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b9 uni27B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ba uni27BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27bb uni27BB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27bc uni27BC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27bd uni27BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27be uni27BE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27bf uni27BF 2.7 (Sans Mono Bold) -U+27c5 uni27C5 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+27c6 uni27C6 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+27e0 uni27E0 2.3 -U+27e6 uni27E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27e7 uni27E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27e8 uni27E8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27e9 uni27E9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27ea uni27EA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27eb uni27EB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f0 uni27F0 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f1 uni27F1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f2 uni27F2 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f3 uni27F3 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f4 uni27F4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f5 uni27F5 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f6 uni27F6 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f7 uni27F7 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f8 uni27F8 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f9 uni27F9 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fa uni27FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fb uni27FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fc uni27FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fd uni27FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fe uni27FE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27ff uni27FF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2800 uni2800 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2801 uni2801 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2802 uni2802 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2803 uni2803 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2804 uni2804 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2805 uni2805 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2806 uni2806 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2807 uni2807 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2808 uni2808 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2809 uni2809 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280a uni280A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280b uni280B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280c uni280C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280d uni280D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280e uni280E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280f uni280F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2810 uni2810 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2811 uni2811 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2812 uni2812 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2813 uni2813 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2814 uni2814 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2815 uni2815 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2816 uni2816 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2817 uni2817 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2818 uni2818 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2819 uni2819 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281a uni281A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281b uni281B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281c uni281C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281d uni281D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281e uni281E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281f uni281F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2820 uni2820 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2821 uni2821 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2822 uni2822 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2823 uni2823 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2824 uni2824 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2825 uni2825 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2826 uni2826 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2827 uni2827 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2828 uni2828 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2829 uni2829 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282a uni282A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282b uni282B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282c uni282C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282d uni282D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282e uni282E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282f uni282F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2830 uni2830 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2831 uni2831 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2832 uni2832 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2833 uni2833 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2834 uni2834 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2835 uni2835 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2836 uni2836 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2837 uni2837 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2838 uni2838 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2839 uni2839 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283a uni283A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283b uni283B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283c uni283C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283d uni283D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283e uni283E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283f uni283F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2840 uni2840 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2841 uni2841 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2842 uni2842 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2843 uni2843 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2844 uni2844 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2845 uni2845 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2846 uni2846 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2847 uni2847 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2848 uni2848 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2849 uni2849 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284a uni284A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284b uni284B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284c uni284C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284d uni284D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284e uni284E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284f uni284F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2850 uni2850 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2851 uni2851 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2852 uni2852 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2853 uni2853 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2854 uni2854 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2855 uni2855 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2856 uni2856 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2857 uni2857 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2858 uni2858 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2859 uni2859 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285a uni285A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285b uni285B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285c uni285C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285d uni285D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285e uni285E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285f uni285F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2860 uni2860 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2861 uni2861 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2862 uni2862 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2863 uni2863 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2864 uni2864 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2865 uni2865 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2866 uni2866 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2867 uni2867 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2868 uni2868 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2869 uni2869 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286a uni286A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286b uni286B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286c uni286C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286d uni286D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286e uni286E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286f uni286F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2870 uni2870 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2871 uni2871 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2872 uni2872 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2873 uni2873 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2874 uni2874 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2875 uni2875 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2876 uni2876 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2877 uni2877 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2878 uni2878 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2879 uni2879 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287a uni287A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287b uni287B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287c uni287C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287d uni287D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287e uni287E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287f uni287F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2880 uni2880 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2881 uni2881 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2882 uni2882 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2883 uni2883 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2884 uni2884 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2885 uni2885 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2886 uni2886 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2887 uni2887 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2888 uni2888 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2889 uni2889 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288a uni288A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288b uni288B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288c uni288C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288d uni288D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288e uni288E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288f uni288F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2890 uni2890 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2891 uni2891 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2892 uni2892 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2893 uni2893 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2894 uni2894 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2895 uni2895 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2896 uni2896 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2897 uni2897 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2898 uni2898 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2899 uni2899 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289a uni289A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289b uni289B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289c uni289C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289d uni289D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289e uni289E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289f uni289F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a0 uni28A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a1 uni28A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a2 uni28A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a3 uni28A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a4 uni28A4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a5 uni28A5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a6 uni28A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a7 uni28A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a8 uni28A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a9 uni28A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28aa uni28AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ab uni28AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ac uni28AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ad uni28AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ae uni28AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28af uni28AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b0 uni28B0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b1 uni28B1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b2 uni28B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b3 uni28B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b4 uni28B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b5 uni28B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b6 uni28B6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b7 uni28B7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b8 uni28B8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b9 uni28B9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ba uni28BA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28bb uni28BB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28bc uni28BC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28bd uni28BD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28be uni28BE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28bf uni28BF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c0 uni28C0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c1 uni28C1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c2 uni28C2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c3 uni28C3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c4 uni28C4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c5 uni28C5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c6 uni28C6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c7 uni28C7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c8 uni28C8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c9 uni28C9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ca uni28CA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28cb uni28CB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28cc uni28CC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28cd uni28CD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ce uni28CE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28cf uni28CF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d0 uni28D0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d1 uni28D1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d2 uni28D2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d3 uni28D3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d4 uni28D4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d5 uni28D5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d6 uni28D6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d7 uni28D7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d8 uni28D8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d9 uni28D9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28da uni28DA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28db uni28DB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28dc uni28DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28dd uni28DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28de uni28DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28df uni28DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e0 uni28E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e1 uni28E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e2 uni28E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e3 uni28E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e4 uni28E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e5 uni28E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e6 uni28E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e7 uni28E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e8 uni28E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e9 uni28E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ea uni28EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28eb uni28EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ec uni28EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ed uni28ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ee uni28EE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ef uni28EF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f0 uni28F0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f1 uni28F1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f2 uni28F2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f3 uni28F3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f4 uni28F4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f5 uni28F5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f6 uni28F6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f7 uni28F7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f8 uni28F8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f9 uni28F9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fa uni28FA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fb uni28FB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fc uni28FC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fd uni28FD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fe uni28FE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ff uni28FF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2900 uni2900 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2901 uni2901 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2902 uni2902 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2903 uni2903 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2904 uni2904 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2905 uni2905 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2906 uni2906 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2907 uni2907 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2908 uni2908 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2909 uni2909 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290a uni290A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290b uni290B 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290c uni290C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290d uni290D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290e uni290E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290f uni290F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2910 uni2910 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2911 uni2911 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2912 uni2912 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2913 uni2913 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2914 uni2914 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2915 uni2915 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2916 uni2916 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2917 uni2917 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2918 uni2918 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2919 uni2919 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291a uni291A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291b uni291B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291c uni291C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291d uni291D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291e uni291E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291f uni291F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2920 uni2920 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2921 uni2921 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2922 uni2922 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2923 uni2923 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2924 uni2924 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2925 uni2925 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2926 uni2926 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2927 uni2927 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2928 uni2928 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2929 uni2929 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292a uni292A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292b uni292B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292c uni292C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292d uni292D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292e uni292E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292f uni292F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2930 uni2930 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2931 uni2931 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2932 uni2932 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2933 uni2933 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2934 uni2934 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2935 uni2935 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2936 uni2936 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2937 uni2937 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2938 uni2938 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2939 uni2939 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293a uni293A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293b uni293B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293c uni293C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293d uni293D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293e uni293E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293f uni293F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2940 uni2940 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2941 uni2941 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2942 uni2942 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2943 uni2943 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2944 uni2944 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2945 uni2945 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2946 uni2946 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2947 uni2947 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2948 uni2948 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2949 uni2949 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294a uni294A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294b uni294B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294c uni294C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294d uni294D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294e uni294E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294f uni294F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2950 uni2950 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2951 uni2951 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2952 uni2952 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2953 uni2953 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2954 uni2954 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2955 uni2955 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2956 uni2956 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2957 uni2957 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2958 uni2958 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2959 uni2959 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295a uni295A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295b uni295B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295c uni295C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295d uni295D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295e uni295E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295f uni295F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2960 uni2960 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2961 uni2961 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2962 uni2962 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2963 uni2963 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2964 uni2964 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2965 uni2965 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2966 uni2966 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2967 uni2967 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2968 uni2968 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2969 uni2969 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296a uni296A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296b uni296B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296c uni296C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296d uni296D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296e uni296E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296f uni296F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2970 uni2970 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2971 uni2971 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2972 uni2972 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2973 uni2973 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2974 uni2974 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2975 uni2975 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2976 uni2976 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2977 uni2977 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2978 uni2978 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2979 uni2979 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297a uni297A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297b uni297B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297c uni297C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297d uni297D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297e uni297E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297f uni297F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2983 uni2983 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2984 uni2984 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+29ce uni29CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29cf uni29CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d0 uni29D0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d1 uni29D1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d2 uni29D2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d3 uni29D3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d4 uni29D4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d5 uni29D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29eb uni29EB 2.2 -U+29fa uni29FA 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+29fb uni29FB 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2a00 uni2A00 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a01 uni2A01 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a02 uni2A02 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a0c uni2A0C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2a0d uni2A0D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2a0e uni2A0E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2a0f uni2A0F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a10 uni2A10 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a11 uni2A11 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a12 uni2A12 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a13 uni2A13 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a14 uni2A14 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a15 uni2A15 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a16 uni2A16 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a17 uni2A17 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a18 uni2A18 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a19 uni2A19 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a1a uni2A1A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a1b uni2A1B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a1c uni2A1C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a2f uni2A2F 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2a7d uni2A7D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a7e uni2A7E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a7f uni2A7F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a80 uni2A80 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a81 uni2A81 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a82 uni2A82 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a83 uni2A83 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a84 uni2A84 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a85 uni2A85 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a86 uni2A86 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a87 uni2A87 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a88 uni2A88 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a89 uni2A89 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8a uni2A8A 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8b uni2A8B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8c uni2A8C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8d uni2A8D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8e uni2A8E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8f uni2A8F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a90 uni2A90 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a91 uni2A91 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a92 uni2A92 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a93 uni2A93 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a94 uni2A94 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a95 uni2A95 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a96 uni2A96 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a97 uni2A97 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a98 uni2A98 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a99 uni2A99 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9a uni2A9A 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9b uni2A9B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9c uni2A9C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9d uni2A9D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9e uni2A9E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9f uni2A9F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2aa0 uni2AA0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2aae uni2AAE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2aaf uni2AAF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab0 uni2AB0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab1 uni2AB1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab2 uni2AB2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab3 uni2AB3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab4 uni2AB4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab5 uni2AB5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab6 uni2AB6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab7 uni2AB7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab8 uni2AB8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab9 uni2AB9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2aba uni2ABA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2af9 uni2AF9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2afa uni2AFA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b00 uni2B00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b01 uni2B01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b02 uni2B02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b03 uni2B03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b04 uni2B04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b05 uni2B05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b06 uni2B06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b07 uni2B07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b08 uni2B08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b09 uni2B09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0a uni2B0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0b uni2B0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0c uni2B0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0d uni2B0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0e uni2B0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0f uni2B0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b10 uni2B10 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b11 uni2B11 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b12 uni2B12 2.3 -U+2b13 uni2B13 2.3 -U+2b14 uni2B14 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b15 uni2B15 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b16 uni2B16 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b17 uni2B17 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b18 uni2B18 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b19 uni2B19 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b1a uni2B1A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b20 uni2B20 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b21 uni2B21 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b22 uni2B22 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b23 uni2B23 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c60 uni2C60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c61 uni2C61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c62 uni2C62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c63 uni2C63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c64 uni2C64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2c65 uni2C65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c66 uni2C66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c67 uni2C67 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c68 uni2C68 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c69 uni2C69 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c6a uni2C6A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c6b uni2C6B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c6c uni2C6C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c6d uni2C6D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c6e uni2C6E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2c6f uni2C6F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2c71 uni2C71 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c72 uni2C72 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c73 uni2C73 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c74 uni2C74 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c75 uni2C75 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2c76 uni2C76 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2c77 uni2C77 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2c79 uni2C79 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2c7a uni2C7A 2.27 -U+2c7b uni2C7B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c7c uni2C7C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2c7d uni2C7D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d30 uni2D30 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d31 uni2D31 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d32 uni2D32 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d33 uni2D33 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d34 uni2D34 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d35 uni2D35 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d36 uni2D36 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d37 uni2D37 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d38 uni2D38 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d39 uni2D39 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3a uni2D3A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3b uni2D3B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3c uni2D3C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3d uni2D3D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3e uni2D3E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3f uni2D3F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d40 uni2D40 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d41 uni2D41 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d42 uni2D42 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d43 uni2D43 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d44 uni2D44 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d45 uni2D45 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d46 uni2D46 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d47 uni2D47 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d48 uni2D48 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d49 uni2D49 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4a uni2D4A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4b uni2D4B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4c uni2D4C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4d uni2D4D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4e uni2D4E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4f uni2D4F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d50 uni2D50 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d51 uni2D51 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d52 uni2D52 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d53 uni2D53 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d54 uni2D54 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d55 uni2D55 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d56 uni2D56 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d57 uni2D57 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d58 uni2D58 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d59 uni2D59 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5a uni2D5A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5b uni2D5B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5c uni2D5C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5d uni2D5D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5e uni2D5E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5f uni2D5F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d60 uni2D60 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d61 uni2D61 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d62 uni2D62 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d63 uni2D63 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d64 uni2D64 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d65 uni2D65 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d6f uni2D6F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2e18 uni2E18 2.26 -U+2e2e uni2E2E 2.26 -U+4dc0 uni4DC0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc1 uni4DC1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc2 uni4DC2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc3 uni4DC3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc4 uni4DC4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc5 uni4DC5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc6 uni4DC6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc7 uni4DC7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc8 uni4DC8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc9 uni4DC9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dca uni4DCA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dcb uni4DCB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dcc uni4DCC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dcd uni4DCD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dce uni4DCE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dcf uni4DCF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd0 uni4DD0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd1 uni4DD1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd2 uni4DD2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd3 uni4DD3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd4 uni4DD4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd5 uni4DD5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd6 uni4DD6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd7 uni4DD7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd8 uni4DD8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd9 uni4DD9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dda uni4DDA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ddb uni4DDB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ddc uni4DDC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ddd uni4DDD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dde uni4DDE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ddf uni4DDF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de0 uni4DE0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de1 uni4DE1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de2 uni4DE2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de3 uni4DE3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de4 uni4DE4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de5 uni4DE5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de6 uni4DE6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de7 uni4DE7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de8 uni4DE8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de9 uni4DE9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dea uni4DEA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4deb uni4DEB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dec uni4DEC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ded uni4DED 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dee uni4DEE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4def uni4DEF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df0 uni4DF0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df1 uni4DF1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df2 uni4DF2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df3 uni4DF3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df4 uni4DF4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df5 uni4DF5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df6 uni4DF6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df7 uni4DF7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df8 uni4DF8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df9 uni4DF9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfa uni4DFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfb uni4DFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfc uni4DFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfd uni4DFD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfe uni4DFE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dff uni4DFF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a644 uniA644 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a645 uniA645 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a646 uniA646 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a647 uniA647 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a64c uniA64C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a64d uniA64D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a650 uniA650 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a651 uniA651 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a654 uniA654 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a655 uniA655 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a656 uniA656 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a657 uniA657 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a662 uniA662 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a663 uniA663 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a664 uniA664 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a665 uniA665 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a666 uniA666 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a667 uniA667 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a668 uniA668 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a669 uniA669 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66a uniA66A 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66b uniA66B 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66c uniA66C 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66d uniA66D 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66e uniA66E 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a68a uniA68A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a68b uniA68B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a68c uniA68C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a68d uniA68D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a694 uniA694 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a695 uniA695 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a708 uniA708 2.27 -U+a709 uniA709 2.27 -U+a70a uniA70A 2.27 -U+a70b uniA70B 2.27 -U+a70c uniA70C 2.27 -U+a70d uniA70D 2.27 -U+a70e uniA70E 2.27 -U+a70f uniA70F 2.27 -U+a710 uniA710 2.27 -U+a711 uniA711 2.27 -U+a712 uniA712 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a713 uniA713 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a714 uniA714 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a715 uniA715 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a716 uniA716 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a71b uniA71B 2.27 -U+a71c uniA71C 2.27 -U+a71d uniA71D 2.27 -U+a71e uniA71E 2.27 -U+a71f uniA71F 2.27 -U+a726 uniA726 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a727 uniA727 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a728 uniA728 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a729 uniA729 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a72a uniA72A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a72b uniA72B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a730 uniA730 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a731 uniA731 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a732 uniA732 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a733 uniA733 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a734 uniA734 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a735 uniA735 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a736 uniA736 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a737 uniA737 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a738 uniA738 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a739 uniA739 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73a uniA73A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73b uniA73B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73c uniA73C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73d uniA73D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73e uniA73E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a73f uniA73F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a746 uniA746 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a747 uniA747 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a748 uniA748 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a749 uniA749 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74a uniA74A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74b uniA74B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74e uniA74E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a74f uniA74F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a780 uniA780 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a781 uniA781 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a782 uniA782 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a783 uniA783 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a78b uniA78B 2.26 -U+a78c uniA78C 2.26 -U+a7fb uniA7FB 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fc uniA7FC 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fd uniA7FD 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fe uniA7FE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7ff uniA7FF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e000 uniE000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e001 uniE001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e002 uniE002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e003 uniE003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e004 uniE004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e005 uniE005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e006 uniE006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e007 uniE007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e008 uniE008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e009 uniE009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00a uniE00A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00b uniE00B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00c uniE00C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00d uniE00D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00e uniE00E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00f uniE00F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e010 uniE010 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e011 uniE011 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e012 uniE012 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e013 uniE013 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e014 uniE014 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e015 uniE015 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e016 uniE016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e017 uniE017 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e018 uniE018 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e019 uniE019 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e01a uniE01A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e01b uniE01B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e01c uniE01C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e01d uniE01D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f000 uniF000 2.10 (Sans) 2.11 (Sans Condensed) -U+f001 uniF001 2.10 (Sans) 2.11 (Sans Condensed) -U+f208 uniF208 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f20a uniF20A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f215 uniF215 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f216 uniF216 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f217 uniF217 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f21a uniF21A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f21b uniF21B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f25f uniF25F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f5c5 uniF5C5 2.9 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+f6c4 uniF6C4 2.10 (Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+f6c5 uniF6C5 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+f6c6 uniF6C6 2.5 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+f6c7 uniF6C7 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+f6c8 uniF6C8 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+f6d1 cyrBreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+f6d4 cyrbreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb00 uniFB00 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb01 fi original -U+fb02 fl original -U+fb03 uniFB03 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb04 uniFB04 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb05 uniFB05 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb06 uniFB06 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb13 uniFB13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb14 uniFB14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb15 uniFB15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb16 uniFB16 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb17 uniFB17 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb1d uniFB1D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb1e uniFB1E 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb1f uniFB1F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb20 uniFB20 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb21 uniFB21 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb22 uniFB22 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb23 uniFB23 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb24 uniFB24 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb25 uniFB25 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb26 uniFB26 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb27 uniFB27 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb28 uniFB28 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb29 uniFB29 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb2a uniFB2A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2b uniFB2B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2c uniFB2C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2d uniFB2D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2e uniFB2E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2f uniFB2F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb30 uniFB30 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb31 uniFB31 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb32 uniFB32 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb33 uniFB33 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb34 uniFB34 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb35 uniFB35 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb36 uniFB36 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb37 uniFB37 2.11 (Sans Condensed Oblique, Sans Oblique) -U+fb38 uniFB38 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb39 uniFB39 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb3a uniFB3A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb3b uniFB3B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb3c uniFB3C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb3e uniFB3E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb40 uniFB40 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb41 uniFB41 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb43 uniFB43 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb44 uniFB44 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb46 uniFB46 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb47 uniFB47 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb48 uniFB48 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb49 uniFB49 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4a uniFB4A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4b uniFB4B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4c uniFB4C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4d uniFB4D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4e uniFB4E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4f uniFB4F 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb52 uniFB52 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb53 uniFB53 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb54 uniFB54 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb55 uniFB55 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb56 uniFB56 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb57 uniFB57 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb58 uniFB58 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb59 uniFB59 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5a uniFB5A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5b uniFB5B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5c uniFB5C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5d uniFB5D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5e uniFB5E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5f uniFB5F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb60 uniFB60 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb61 uniFB61 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb62 uniFB62 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb63 uniFB63 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb64 uniFB64 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb65 uniFB65 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb66 uniFB66 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb67 uniFB67 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb68 uniFB68 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb69 uniFB69 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6a uniFB6A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6b uniFB6B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6c uniFB6C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6d uniFB6D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6e uniFB6E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6f uniFB6F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb70 uniFB70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb71 uniFB71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb72 uniFB72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb73 uniFB73 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb74 uniFB74 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb75 uniFB75 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb76 uniFB76 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb77 uniFB77 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb78 uniFB78 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb79 uniFB79 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7a uniFB7A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7b uniFB7B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7c uniFB7C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7d uniFB7D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7e uniFB7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7f uniFB7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb80 uniFB80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb81 uniFB81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8a uniFB8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8b uniFB8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8c uniFB8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8d uniFB8D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8e uniFB8E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8f uniFB8F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb90 uniFB90 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb91 uniFB91 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb92 uniFB92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb93 uniFB93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb94 uniFB94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb95 uniFB95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb9e uniFB9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb9f uniFB9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbaa uniFBAA 2.16 (Sans Mono, Sans Mono Bold) -U+fbab uniFBAB 2.16 (Sans Mono, Sans Mono Bold) -U+fbac uniFBAC 2.16 (Sans Mono, Sans Mono Bold) -U+fbad uniFBAD 2.16 (Sans Mono, Sans Mono Bold) -U+fbd9 uniFBD9 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+fbda uniFBDA 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+fbe8 uniFBE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbe9 uniFBE9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbfc uniFBFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbfd uniFBFD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbfe uniFBFE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbff uniFBFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe00 uniFE00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe01 uniFE01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe02 uniFE02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe03 uniFE03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe04 uniFE04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe05 uniFE05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe06 uniFE06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe07 uniFE07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe08 uniFE08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe09 uniFE09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0a uniFE0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0b uniFE0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0c uniFE0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0d uniFE0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0e uniFE0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0f uniFE0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe20 uniFE20 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fe21 uniFE21 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fe22 uniFE22 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fe23 uniFE23 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fe70 uniFE70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe71 uniFE71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe72 uniFE72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe73 uniFE73 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe74 uniFE74 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe76 uniFE76 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe77 uniFE77 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe78 uniFE78 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe79 uniFE79 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7a uniFE7A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7b uniFE7B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7c uniFE7C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7d uniFE7D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7e uniFE7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7f uniFE7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe80 uniFE80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe81 uniFE81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe82 uniFE82 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe83 uniFE83 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe84 uniFE84 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe85 uniFE85 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe86 uniFE86 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe87 uniFE87 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe88 uniFE88 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe89 uniFE89 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8a uniFE8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8b uniFE8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8c uniFE8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8d uniFE8D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8e uniFE8E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8f uniFE8F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe90 uniFE90 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe91 uniFE91 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe92 uniFE92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe93 uniFE93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe94 uniFE94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe95 uniFE95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe96 uniFE96 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe97 uniFE97 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe98 uniFE98 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe99 uniFE99 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9a uniFE9A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9b uniFE9B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9c uniFE9C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9d uniFE9D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9e uniFE9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9f uniFE9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea0 uniFEA0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea1 uniFEA1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea2 uniFEA2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea3 uniFEA3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea4 uniFEA4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea5 uniFEA5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea6 uniFEA6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea7 uniFEA7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea8 uniFEA8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea9 uniFEA9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feaa uniFEAA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feab uniFEAB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feac uniFEAC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fead uniFEAD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feae uniFEAE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feaf uniFEAF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb0 uniFEB0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb1 uniFEB1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb2 uniFEB2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb3 uniFEB3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb4 uniFEB4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb5 uniFEB5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb6 uniFEB6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb7 uniFEB7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb8 uniFEB8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb9 uniFEB9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feba uniFEBA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febb uniFEBB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febc uniFEBC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febd uniFEBD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febe uniFEBE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febf uniFEBF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec0 uniFEC0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec1 uniFEC1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec2 uniFEC2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec3 uniFEC3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec4 uniFEC4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec5 uniFEC5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec6 uniFEC6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec7 uniFEC7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec8 uniFEC8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec9 uniFEC9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feca uniFECA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fecb uniFECB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fecc uniFECC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fecd uniFECD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fece uniFECE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fecf uniFECF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed0 uniFED0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed1 uniFED1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed2 uniFED2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed3 uniFED3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed4 uniFED4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed5 uniFED5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed6 uniFED6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed7 uniFED7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed8 uniFED8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed9 uniFED9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feda uniFEDA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fedb uniFEDB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fedc uniFEDC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fedd uniFEDD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fede uniFEDE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fedf uniFEDF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee0 uniFEE0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee1 uniFEE1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee2 uniFEE2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee3 uniFEE3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee4 uniFEE4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee5 uniFEE5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee6 uniFEE6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee7 uniFEE7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee8 uniFEE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee9 uniFEE9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feea uniFEEA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feeb uniFEEB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feec uniFEEC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feed uniFEED 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feee uniFEEE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feef uniFEEF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef0 uniFEF0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef1 uniFEF1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef2 uniFEF2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef3 uniFEF3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef4 uniFEF4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef5 uniFEF5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef6 uniFEF6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef7 uniFEF7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef8 uniFEF8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef9 uniFEF9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fefa uniFEFA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fefb uniFEFB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fefc uniFEFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feff uniFEFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fff9 uniFFF9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fffa uniFFFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fffb uniFFFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fffc uniFFFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fffd uniFFFD 1.12 -U+1d300 u1D300 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d301 u1D301 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d302 u1D302 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d303 u1D303 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d304 u1D304 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d305 u1D305 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d306 u1D306 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d307 u1D307 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d308 u1D308 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d309 u1D309 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30a u1D30A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30b u1D30B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30c u1D30C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30d u1D30D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30e u1D30E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30f u1D30F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d310 u1D310 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d311 u1D311 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d312 u1D312 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d313 u1D313 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d314 u1D314 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d315 u1D315 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d316 u1D316 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d317 u1D317 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d318 u1D318 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d319 u1D319 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31a u1D31A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31b u1D31B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31c u1D31C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31d u1D31D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31e u1D31E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31f u1D31F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d320 u1D320 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d321 u1D321 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d322 u1D322 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d323 u1D323 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d324 u1D324 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d325 u1D325 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d326 u1D326 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d327 u1D327 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d328 u1D328 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d329 u1D329 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32a u1D32A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32b u1D32B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32c u1D32C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32d u1D32D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32e u1D32E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32f u1D32F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d330 u1D330 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d331 u1D331 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d332 u1D332 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d333 u1D333 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d334 u1D334 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d335 u1D335 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d336 u1D336 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d337 u1D337 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d338 u1D338 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d339 u1D339 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33a u1D33A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33b u1D33B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33c u1D33C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33d u1D33D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33e u1D33E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33f u1D33F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d340 u1D340 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d341 u1D341 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d342 u1D342 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d343 u1D343 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d344 u1D344 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d345 u1D345 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d346 u1D346 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d347 u1D347 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d348 u1D348 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d349 u1D349 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34a u1D34A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34b u1D34B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34c u1D34C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34d u1D34D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34e u1D34E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34f u1D34F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d350 u1D350 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d351 u1D351 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d352 u1D352 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d353 u1D353 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d354 u1D354 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d355 u1D355 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d356 u1D356 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d400 u1D400 2.23 (Serif Bold, Serif Condensed Bold) -U+1d401 u1D401 2.23 (Serif Bold, Serif Condensed Bold) -U+1d402 u1D402 2.23 (Serif Bold, Serif Condensed Bold) -U+1d403 u1D403 2.23 (Serif Bold, Serif Condensed Bold) -U+1d404 u1D404 2.23 (Serif Bold, Serif Condensed Bold) -U+1d405 u1D405 2.23 (Serif Bold, Serif Condensed Bold) -U+1d406 u1D406 2.23 (Serif Bold, Serif Condensed Bold) -U+1d407 u1D407 2.23 (Serif Bold, Serif Condensed Bold) -U+1d408 u1D408 2.23 (Serif Bold, Serif Condensed Bold) -U+1d409 u1D409 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40a u1D40A 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40b u1D40B 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40c u1D40C 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40d u1D40D 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40e u1D40E 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40f u1D40F 2.23 (Serif Bold, Serif Condensed Bold) -U+1d410 u1D410 2.23 (Serif Bold, Serif Condensed Bold) -U+1d411 u1D411 2.23 (Serif Bold, Serif Condensed Bold) -U+1d412 u1D412 2.23 (Serif Bold, Serif Condensed Bold) -U+1d413 u1D413 2.23 (Serif Bold, Serif Condensed Bold) -U+1d414 u1D414 2.23 (Serif Bold, Serif Condensed Bold) -U+1d415 u1D415 2.23 (Serif Bold, Serif Condensed Bold) -U+1d416 u1D416 2.23 (Serif Bold, Serif Condensed Bold) -U+1d417 u1D417 2.23 (Serif Bold, Serif Condensed Bold) -U+1d418 u1D418 2.23 (Serif Bold, Serif Condensed Bold) -U+1d419 u1D419 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41a u1D41A 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41b u1D41B 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41c u1D41C 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41d u1D41D 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41e u1D41E 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41f u1D41F 2.23 (Serif Bold, Serif Condensed Bold) -U+1d420 u1D420 2.23 (Serif Bold, Serif Condensed Bold) -U+1d421 u1D421 2.23 (Serif Bold, Serif Condensed Bold) -U+1d422 u1D422 2.23 (Serif Bold, Serif Condensed Bold) -U+1d423 u1D423 2.23 (Serif Bold, Serif Condensed Bold) -U+1d424 u1D424 2.23 (Serif Bold, Serif Condensed Bold) -U+1d425 u1D425 2.23 (Serif Bold, Serif Condensed Bold) -U+1d426 u1D426 2.23 (Serif Bold, Serif Condensed Bold) -U+1d427 u1D427 2.23 (Serif Bold, Serif Condensed Bold) -U+1d428 u1D428 2.23 (Serif Bold, Serif Condensed Bold) -U+1d429 u1D429 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42a u1D42A 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42b u1D42B 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42c u1D42C 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42d u1D42D 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42e u1D42E 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42f u1D42F 2.23 (Serif Bold, Serif Condensed Bold) -U+1d430 u1D430 2.23 (Serif Bold, Serif Condensed Bold) -U+1d431 u1D431 2.23 (Serif Bold, Serif Condensed Bold) -U+1d432 u1D432 2.23 (Serif Bold, Serif Condensed Bold) -U+1d433 u1D433 2.23 (Serif Bold, Serif Condensed Bold) -U+1d434 u1D434 2.23 (Serif Italic, Serif Italic Condensed) -U+1d435 u1D435 2.23 (Serif Italic, Serif Italic Condensed) -U+1d436 u1D436 2.23 (Serif Italic, Serif Italic Condensed) -U+1d437 u1D437 2.23 (Serif Italic, Serif Italic Condensed) -U+1d438 u1D438 2.23 (Serif Italic, Serif Italic Condensed) -U+1d439 u1D439 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43a u1D43A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43b u1D43B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43c u1D43C 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43d u1D43D 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43e u1D43E 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43f u1D43F 2.23 (Serif Italic, Serif Italic Condensed) -U+1d440 u1D440 2.23 (Serif Italic, Serif Italic Condensed) -U+1d441 u1D441 2.23 (Serif Italic, Serif Italic Condensed) -U+1d442 u1D442 2.23 (Serif Italic, Serif Italic Condensed) -U+1d443 u1D443 2.23 (Serif Italic, Serif Italic Condensed) -U+1d444 u1D444 2.23 (Serif Italic, Serif Italic Condensed) -U+1d445 u1D445 2.23 (Serif Italic, Serif Italic Condensed) -U+1d446 u1D446 2.23 (Serif Italic, Serif Italic Condensed) -U+1d447 u1D447 2.23 (Serif Italic, Serif Italic Condensed) -U+1d448 u1D448 2.23 (Serif Italic, Serif Italic Condensed) -U+1d449 u1D449 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44a u1D44A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44b u1D44B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44c u1D44C 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44d u1D44D 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44e u1D44E 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44f u1D44F 2.23 (Serif Italic, Serif Italic Condensed) -U+1d450 u1D450 2.23 (Serif Italic, Serif Italic Condensed) -U+1d451 u1D451 2.23 (Serif Italic, Serif Italic Condensed) -U+1d452 u1D452 2.23 (Serif Italic, Serif Italic Condensed) -U+1d453 u1D453 2.23 (Serif Italic, Serif Italic Condensed) -U+1d454 u1D454 2.23 (Serif Italic, Serif Italic Condensed) -U+1d456 u1D456 2.23 (Serif Italic, Serif Italic Condensed) -U+1d457 u1D457 2.23 (Serif Italic, Serif Italic Condensed) -U+1d458 u1D458 2.23 (Serif Italic, Serif Italic Condensed) -U+1d459 u1D459 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45a u1D45A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45b u1D45B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45c u1D45C 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45d u1D45D 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45e u1D45E 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45f u1D45F 2.23 (Serif Italic, Serif Italic Condensed) -U+1d460 u1D460 2.23 (Serif Italic, Serif Italic Condensed) -U+1d461 u1D461 2.23 (Serif Italic, Serif Italic Condensed) -U+1d462 u1D462 2.23 (Serif Italic, Serif Italic Condensed) -U+1d463 u1D463 2.23 (Serif Italic, Serif Italic Condensed) -U+1d464 u1D464 2.23 (Serif Italic, Serif Italic Condensed) -U+1d465 u1D465 2.23 (Serif Italic, Serif Italic Condensed) -U+1d466 u1D466 2.23 (Serif Italic, Serif Italic Condensed) -U+1d467 u1D467 2.23 (Serif Italic, Serif Italic Condensed) -U+1d468 u1D468 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d469 u1D469 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46a u1D46A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46b u1D46B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46c u1D46C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46d u1D46D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46e u1D46E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46f u1D46F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d470 u1D470 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d471 u1D471 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d472 u1D472 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d473 u1D473 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d474 u1D474 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d475 u1D475 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d476 u1D476 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d477 u1D477 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d478 u1D478 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d479 u1D479 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47a u1D47A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47b u1D47B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47c u1D47C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47d u1D47D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47e u1D47E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47f u1D47F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d480 u1D480 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d481 u1D481 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d482 u1D482 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d483 u1D483 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d484 u1D484 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d485 u1D485 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d486 u1D486 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d487 u1D487 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d488 u1D488 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d489 u1D489 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48a u1D48A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48b u1D48B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48c u1D48C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48d u1D48D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48e u1D48E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48f u1D48F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d490 u1D490 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d491 u1D491 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d492 u1D492 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d493 u1D493 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d494 u1D494 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d495 u1D495 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d496 u1D496 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d497 u1D497 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d498 u1D498 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d499 u1D499 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d49a u1D49A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d49b u1D49B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d538 u1D538 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d539 u1D539 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d53b u1D53B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d53c u1D53C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d53d u1D53D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d53e u1D53E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d540 u1D540 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d541 u1D541 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d542 u1D542 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d543 u1D543 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d544 u1D544 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d546 u1D546 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54a u1D54A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54b u1D54B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54c u1D54C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54d u1D54D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54e u1D54E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54f u1D54F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d550 u1D550 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d552 u1D552 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d553 u1D553 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d554 u1D554 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d555 u1D555 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d556 u1D556 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d557 u1D557 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d558 u1D558 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d559 u1D559 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55a u1D55A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55b u1D55B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55c u1D55C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55d u1D55D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55e u1D55E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55f u1D55F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d560 u1D560 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d561 u1D561 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d562 u1D562 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d563 u1D563 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d564 u1D564 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d565 u1D565 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d566 u1D566 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d567 u1D567 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d568 u1D568 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d569 u1D569 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d56a u1D56A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d56b u1D56B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d5a0 u1D5A0 2.23 (Sans, Sans Condensed) -U+1d5a1 u1D5A1 2.23 (Sans, Sans Condensed) -U+1d5a2 u1D5A2 2.23 (Sans, Sans Condensed) -U+1d5a3 u1D5A3 2.23 (Sans, Sans Condensed) -U+1d5a4 u1D5A4 2.23 (Sans, Sans Condensed) -U+1d5a5 u1D5A5 2.23 (Sans, Sans Condensed) -U+1d5a6 u1D5A6 2.23 (Sans, Sans Condensed) -U+1d5a7 u1D5A7 2.23 (Sans, Sans Condensed) -U+1d5a8 u1D5A8 2.23 (Sans, Sans Condensed) -U+1d5a9 u1D5A9 2.23 (Sans, Sans Condensed) -U+1d5aa u1D5AA 2.23 (Sans, Sans Condensed) -U+1d5ab u1D5AB 2.23 (Sans, Sans Condensed) -U+1d5ac u1D5AC 2.23 (Sans, Sans Condensed) -U+1d5ad u1D5AD 2.23 (Sans, Sans Condensed) -U+1d5ae u1D5AE 2.23 (Sans, Sans Condensed) -U+1d5af u1D5AF 2.23 (Sans, Sans Condensed) -U+1d5b0 u1D5B0 2.23 (Sans, Sans Condensed) -U+1d5b1 u1D5B1 2.23 (Sans, Sans Condensed) -U+1d5b2 u1D5B2 2.23 (Sans, Sans Condensed) -U+1d5b3 u1D5B3 2.23 (Sans, Sans Condensed) -U+1d5b4 u1D5B4 2.23 (Sans, Sans Condensed) -U+1d5b5 u1D5B5 2.23 (Sans, Sans Condensed) -U+1d5b6 u1D5B6 2.23 (Sans, Sans Condensed) -U+1d5b7 u1D5B7 2.23 (Sans, Sans Condensed) -U+1d5b8 u1D5B8 2.23 (Sans, Sans Condensed) -U+1d5b9 u1D5B9 2.23 (Sans, Sans Condensed) -U+1d5ba u1D5BA 2.23 (Sans, Sans Condensed) -U+1d5bb u1D5BB 2.23 (Sans, Sans Condensed) -U+1d5bc u1D5BC 2.23 (Sans, Sans Condensed) -U+1d5bd u1D5BD 2.23 (Sans, Sans Condensed) -U+1d5be u1D5BE 2.23 (Sans, Sans Condensed) -U+1d5bf u1D5BF 2.23 (Sans, Sans Condensed) -U+1d5c0 u1D5C0 2.23 (Sans, Sans Condensed) -U+1d5c1 u1D5C1 2.23 (Sans, Sans Condensed) -U+1d5c2 u1D5C2 2.23 (Sans, Sans Condensed) -U+1d5c3 u1D5C3 2.23 (Sans, Sans Condensed) -U+1d5c4 u1D5C4 2.23 (Sans, Sans Condensed) -U+1d5c5 u1D5C5 2.23 (Sans, Sans Condensed) -U+1d5c6 u1D5C6 2.23 (Sans, Sans Condensed) -U+1d5c7 u1D5C7 2.23 (Sans, Sans Condensed) -U+1d5c8 u1D5C8 2.23 (Sans, Sans Condensed) -U+1d5c9 u1D5C9 2.23 (Sans, Sans Condensed) -U+1d5ca u1D5CA 2.23 (Sans, Sans Condensed) -U+1d5cb u1D5CB 2.23 (Sans, Sans Condensed) -U+1d5cc u1D5CC 2.23 (Sans, Sans Condensed) -U+1d5cd u1D5CD 2.23 (Sans, Sans Condensed) -U+1d5ce u1D5CE 2.23 (Sans, Sans Condensed) -U+1d5cf u1D5CF 2.23 (Sans, Sans Condensed) -U+1d5d0 u1D5D0 2.23 (Sans, Sans Condensed) -U+1d5d1 u1D5D1 2.23 (Sans, Sans Condensed) -U+1d5d2 u1D5D2 2.23 (Sans, Sans Condensed) -U+1d5d3 u1D5D3 2.23 (Sans, Sans Condensed) -U+1d5d4 u1D5D4 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d5 u1D5D5 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d6 u1D5D6 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d7 u1D5D7 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d8 u1D5D8 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d9 u1D5D9 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5da u1D5DA 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5db u1D5DB 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5dc u1D5DC 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5dd u1D5DD 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5de u1D5DE 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5df u1D5DF 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e0 u1D5E0 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e1 u1D5E1 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e2 u1D5E2 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e3 u1D5E3 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e4 u1D5E4 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e5 u1D5E5 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e6 u1D5E6 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e7 u1D5E7 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e8 u1D5E8 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e9 u1D5E9 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ea u1D5EA 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5eb u1D5EB 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ec u1D5EC 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ed u1D5ED 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ee u1D5EE 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ef u1D5EF 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f0 u1D5F0 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f1 u1D5F1 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f2 u1D5F2 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f3 u1D5F3 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f4 u1D5F4 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f5 u1D5F5 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f6 u1D5F6 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f7 u1D5F7 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f8 u1D5F8 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f9 u1D5F9 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fa u1D5FA 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fb u1D5FB 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fc u1D5FC 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fd u1D5FD 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fe u1D5FE 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ff u1D5FF 2.23 (Sans Bold, Sans Condensed Bold) -U+1d600 u1D600 2.23 (Sans Bold, Sans Condensed Bold) -U+1d601 u1D601 2.23 (Sans Bold, Sans Condensed Bold) -U+1d602 u1D602 2.23 (Sans Bold, Sans Condensed Bold) -U+1d603 u1D603 2.23 (Sans Bold, Sans Condensed Bold) -U+1d604 u1D604 2.23 (Sans Bold, Sans Condensed Bold) -U+1d605 u1D605 2.23 (Sans Bold, Sans Condensed Bold) -U+1d606 u1D606 2.23 (Sans Bold, Sans Condensed Bold) -U+1d607 u1D607 2.23 (Sans Bold, Sans Condensed Bold) -U+1d608 u1D608 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d609 u1D609 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60a u1D60A 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60b u1D60B 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60c u1D60C 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60d u1D60D 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60e u1D60E 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60f u1D60F 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d610 u1D610 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d611 u1D611 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d612 u1D612 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d613 u1D613 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d614 u1D614 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d615 u1D615 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d616 u1D616 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d617 u1D617 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d618 u1D618 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d619 u1D619 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61a u1D61A 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61b u1D61B 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61c u1D61C 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61d u1D61D 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61e u1D61E 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61f u1D61F 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d620 u1D620 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d621 u1D621 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d622 u1D622 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d623 u1D623 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d624 u1D624 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d625 u1D625 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d626 u1D626 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d627 u1D627 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d628 u1D628 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d629 u1D629 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62a u1D62A 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62b u1D62B 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62c u1D62C 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62d u1D62D 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62e u1D62E 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62f u1D62F 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d630 u1D630 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d631 u1D631 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d632 u1D632 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d633 u1D633 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d634 u1D634 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d635 u1D635 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d636 u1D636 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d637 u1D637 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d638 u1D638 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d639 u1D639 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d63a u1D63A 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d63b u1D63B 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d63c u1D63C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d63d u1D63D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d63e u1D63E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d63f u1D63F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d640 u1D640 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d641 u1D641 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d642 u1D642 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d643 u1D643 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d644 u1D644 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d645 u1D645 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d646 u1D646 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d647 u1D647 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d648 u1D648 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d649 u1D649 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64a u1D64A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64b u1D64B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64c u1D64C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64d u1D64D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64e u1D64E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64f u1D64F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d650 u1D650 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d651 u1D651 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d652 u1D652 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d653 u1D653 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d654 u1D654 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d655 u1D655 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d656 u1D656 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d657 u1D657 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d658 u1D658 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d659 u1D659 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65a u1D65A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65b u1D65B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65c u1D65C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65d u1D65D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65e u1D65E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65f u1D65F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d660 u1D660 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d661 u1D661 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d662 u1D662 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d663 u1D663 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d664 u1D664 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d665 u1D665 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d666 u1D666 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d667 u1D667 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d668 u1D668 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d669 u1D669 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66a u1D66A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66b u1D66B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66c u1D66C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66d u1D66D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66e u1D66E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66f u1D66F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d670 u1D670 2.23 (Sans Mono) -U+1d671 u1D671 2.23 (Sans Mono) -U+1d672 u1D672 2.23 (Sans Mono) -U+1d673 u1D673 2.23 (Sans Mono) -U+1d674 u1D674 2.23 (Sans Mono) -U+1d675 u1D675 2.23 (Sans Mono) -U+1d676 u1D676 2.23 (Sans Mono) -U+1d677 u1D677 2.23 (Sans Mono) -U+1d678 u1D678 2.23 (Sans Mono) -U+1d679 u1D679 2.23 (Sans Mono) -U+1d67a u1D67A 2.23 (Sans Mono) -U+1d67b u1D67B 2.23 (Sans Mono) -U+1d67c u1D67C 2.23 (Sans Mono) -U+1d67d u1D67D 2.23 (Sans Mono) -U+1d67e u1D67E 2.23 (Sans Mono) -U+1d67f u1D67F 2.23 (Sans Mono) -U+1d680 u1D680 2.23 (Sans Mono) -U+1d681 u1D681 2.23 (Sans Mono) -U+1d682 u1D682 2.23 (Sans Mono) -U+1d683 u1D683 2.23 (Sans Mono) -U+1d684 u1D684 2.23 (Sans Mono) -U+1d685 u1D685 2.23 (Sans Mono) -U+1d686 u1D686 2.23 (Sans Mono) -U+1d687 u1D687 2.23 (Sans Mono) -U+1d688 u1D688 2.23 (Sans Mono) -U+1d689 u1D689 2.23 (Sans Mono) -U+1d68a u1D68A 2.23 (Sans Mono) -U+1d68b u1D68B 2.23 (Sans Mono) -U+1d68c u1D68C 2.23 (Sans Mono) -U+1d68d u1D68D 2.23 (Sans Mono) -U+1d68e u1D68E 2.23 (Sans Mono) -U+1d68f u1D68F 2.23 (Sans Mono) -U+1d690 u1D690 2.23 (Sans Mono) -U+1d691 u1D691 2.23 (Sans Mono) -U+1d692 u1D692 2.23 (Sans Mono) -U+1d693 u1D693 2.23 (Sans Mono) -U+1d694 u1D694 2.23 (Sans Mono) -U+1d695 u1D695 2.23 (Sans Mono) -U+1d696 u1D696 2.23 (Sans Mono) -U+1d697 u1D697 2.23 (Sans Mono) -U+1d698 u1D698 2.23 (Sans Mono) -U+1d699 u1D699 2.23 (Sans Mono) -U+1d69a u1D69A 2.23 (Sans Mono) -U+1d69b u1D69B 2.23 (Sans Mono) -U+1d69c u1D69C 2.23 (Sans Mono) -U+1d69d u1D69D 2.23 (Sans Mono) -U+1d69e u1D69E 2.23 (Sans Mono) -U+1d69f u1D69F 2.23 (Sans Mono) -U+1d6a0 u1D6A0 2.23 (Sans Mono) -U+1d6a1 u1D6A1 2.23 (Sans Mono) -U+1d6a2 u1D6A2 2.23 (Sans Mono) -U+1d6a3 u1D6A3 2.23 (Sans Mono) -U+1d6a4 u1D6A4 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6a5 u1D6A5 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6a8 u1D6A8 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6a9 u1D6A9 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6aa u1D6AA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ab u1D6AB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ac u1D6AC 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ad u1D6AD 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ae u1D6AE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6af u1D6AF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b0 u1D6B0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b1 u1D6B1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b2 u1D6B2 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b3 u1D6B3 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b4 u1D6B4 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b5 u1D6B5 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b6 u1D6B6 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b7 u1D6B7 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b8 u1D6B8 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b9 u1D6B9 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ba u1D6BA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6bb u1D6BB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6bc u1D6BC 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6bd u1D6BD 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6be u1D6BE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6bf u1D6BF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c0 u1D6C0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c1 u1D6C1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c2 u1D6C2 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c3 u1D6C3 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c4 u1D6C4 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c5 u1D6C5 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c6 u1D6C6 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c7 u1D6C7 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c8 u1D6C8 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c9 u1D6C9 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ca u1D6CA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6cb u1D6CB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6cc u1D6CC 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6cd u1D6CD 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ce u1D6CE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6cf u1D6CF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d0 u1D6D0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d1 u1D6D1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d2 u1D6D2 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d3 u1D6D3 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d4 u1D6D4 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d5 u1D6D5 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d6 u1D6D6 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d7 u1D6D7 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d8 u1D6D8 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d9 u1D6D9 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6da u1D6DA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6db u1D6DB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6dc u1D6DC 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6dd u1D6DD 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6de u1D6DE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6df u1D6DF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6e0 u1D6E0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6e1 u1D6E1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6e2 u1D6E2 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e3 u1D6E3 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e4 u1D6E4 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e5 u1D6E5 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e6 u1D6E6 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e7 u1D6E7 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e8 u1D6E8 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e9 u1D6E9 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ea u1D6EA 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6eb u1D6EB 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ec u1D6EC 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ed u1D6ED 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ee u1D6EE 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ef u1D6EF 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f0 u1D6F0 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f1 u1D6F1 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f2 u1D6F2 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f3 u1D6F3 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f4 u1D6F4 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f5 u1D6F5 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f6 u1D6F6 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f7 u1D6F7 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f8 u1D6F8 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f9 u1D6F9 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fa u1D6FA 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fb u1D6FB 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fc u1D6FC 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fd u1D6FD 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fe u1D6FE 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ff u1D6FF 2.23 (Serif Italic, Serif Italic Condensed) -U+1d700 u1D700 2.23 (Serif Italic, Serif Italic Condensed) -U+1d701 u1D701 2.23 (Serif Italic, Serif Italic Condensed) -U+1d702 u1D702 2.23 (Serif Italic, Serif Italic Condensed) -U+1d703 u1D703 2.23 (Serif Italic, Serif Italic Condensed) -U+1d704 u1D704 2.23 (Serif Italic, Serif Italic Condensed) -U+1d705 u1D705 2.23 (Serif Italic, Serif Italic Condensed) -U+1d706 u1D706 2.23 (Serif Italic, Serif Italic Condensed) -U+1d707 u1D707 2.23 (Serif Italic, Serif Italic Condensed) -U+1d708 u1D708 2.23 (Serif Italic, Serif Italic Condensed) -U+1d709 u1D709 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70a u1D70A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70b u1D70B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70c u1D70C 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70d u1D70D 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70e u1D70E 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70f u1D70F 2.23 (Serif Italic, Serif Italic Condensed) -U+1d710 u1D710 2.23 (Serif Italic, Serif Italic Condensed) -U+1d711 u1D711 2.23 (Serif Italic, Serif Italic Condensed) -U+1d712 u1D712 2.23 (Serif Italic, Serif Italic Condensed) -U+1d713 u1D713 2.23 (Serif Italic, Serif Italic Condensed) -U+1d714 u1D714 2.23 (Serif Italic, Serif Italic Condensed) -U+1d715 u1D715 2.23 (Serif Italic, Serif Italic Condensed) -U+1d716 u1D716 2.23 (Serif Italic, Serif Italic Condensed) -U+1d717 u1D717 2.23 (Serif Italic, Serif Italic Condensed) -U+1d718 u1D718 2.23 (Serif Italic, Serif Italic Condensed) -U+1d719 u1D719 2.23 (Serif Italic, Serif Italic Condensed) -U+1d71a u1D71A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d71b u1D71B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d71c u1D71C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d71d u1D71D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d71e u1D71E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d71f u1D71F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d720 u1D720 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d721 u1D721 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d722 u1D722 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d723 u1D723 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d724 u1D724 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d725 u1D725 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d726 u1D726 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d727 u1D727 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d728 u1D728 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d729 u1D729 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72a u1D72A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72b u1D72B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72c u1D72C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72d u1D72D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72e u1D72E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72f u1D72F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d730 u1D730 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d731 u1D731 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d732 u1D732 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d733 u1D733 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d734 u1D734 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d735 u1D735 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d736 u1D736 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d737 u1D737 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d738 u1D738 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d739 u1D739 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73a u1D73A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73b u1D73B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73c u1D73C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73d u1D73D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73e u1D73E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73f u1D73F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d740 u1D740 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d741 u1D741 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d742 u1D742 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d743 u1D743 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d744 u1D744 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d745 u1D745 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d746 u1D746 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d747 u1D747 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d748 u1D748 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d749 u1D749 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74a u1D74A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74b u1D74B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74c u1D74C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74d u1D74D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74e u1D74E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74f u1D74F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d750 u1D750 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d751 u1D751 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d752 u1D752 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d753 u1D753 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d754 u1D754 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d755 u1D755 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d756 u1D756 2.23 (Sans Bold, Sans Condensed Bold) -U+1d757 u1D757 2.23 (Sans Bold, Sans Condensed Bold) -U+1d758 u1D758 2.23 (Sans Bold, Sans Condensed Bold) -U+1d759 u1D759 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75a u1D75A 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75b u1D75B 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75c u1D75C 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75d u1D75D 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75e u1D75E 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75f u1D75F 2.23 (Sans Bold, Sans Condensed Bold) -U+1d760 u1D760 2.23 (Sans Bold, Sans Condensed Bold) -U+1d761 u1D761 2.23 (Sans Bold, Sans Condensed Bold) -U+1d762 u1D762 2.23 (Sans Bold, Sans Condensed Bold) -U+1d763 u1D763 2.23 (Sans Bold, Sans Condensed Bold) -U+1d764 u1D764 2.23 (Sans Bold, Sans Condensed Bold) -U+1d765 u1D765 2.23 (Sans Bold, Sans Condensed Bold) -U+1d766 u1D766 2.23 (Sans Bold, Sans Condensed Bold) -U+1d767 u1D767 2.23 (Sans Bold, Sans Condensed Bold) -U+1d768 u1D768 2.23 (Sans Bold, Sans Condensed Bold) -U+1d769 u1D769 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76a u1D76A 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76b u1D76B 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76c u1D76C 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76d u1D76D 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76e u1D76E 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76f u1D76F 2.23 (Sans Bold, Sans Condensed Bold) -U+1d770 u1D770 2.23 (Sans Bold, Sans Condensed Bold) -U+1d771 u1D771 2.23 (Sans Bold, Sans Condensed Bold) -U+1d772 u1D772 2.23 (Sans Bold, Sans Condensed Bold) -U+1d773 u1D773 2.23 (Sans Bold, Sans Condensed Bold) -U+1d774 u1D774 2.23 (Sans Bold, Sans Condensed Bold) -U+1d775 u1D775 2.23 (Sans Bold, Sans Condensed Bold) -U+1d776 u1D776 2.23 (Sans Bold, Sans Condensed Bold) -U+1d777 u1D777 2.23 (Sans Bold, Sans Condensed Bold) -U+1d778 u1D778 2.23 (Sans Bold, Sans Condensed Bold) -U+1d779 u1D779 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77a u1D77A 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77b u1D77B 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77c u1D77C 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77d u1D77D 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77e u1D77E 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77f u1D77F 2.23 (Sans Bold, Sans Condensed Bold) -U+1d780 u1D780 2.23 (Sans Bold, Sans Condensed Bold) -U+1d781 u1D781 2.23 (Sans Bold, Sans Condensed Bold) -U+1d782 u1D782 2.23 (Sans Bold, Sans Condensed Bold) -U+1d783 u1D783 2.23 (Sans Bold, Sans Condensed Bold) -U+1d784 u1D784 2.23 (Sans Bold, Sans Condensed Bold) -U+1d785 u1D785 2.23 (Sans Bold, Sans Condensed Bold) -U+1d786 u1D786 2.23 (Sans Bold, Sans Condensed Bold) -U+1d787 u1D787 2.23 (Sans Bold, Sans Condensed Bold) -U+1d788 u1D788 2.23 (Sans Bold, Sans Condensed Bold) -U+1d789 u1D789 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78a u1D78A 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78b u1D78B 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78c u1D78C 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78d u1D78D 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78e u1D78E 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78f u1D78F 2.23 (Sans Bold, Sans Condensed Bold) -U+1d790 u1D790 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d791 u1D791 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d792 u1D792 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d793 u1D793 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d794 u1D794 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d795 u1D795 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d796 u1D796 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d797 u1D797 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d798 u1D798 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d799 u1D799 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79a u1D79A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79b u1D79B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79c u1D79C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79d u1D79D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79e u1D79E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79f u1D79F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a0 u1D7A0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a1 u1D7A1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a2 u1D7A2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a3 u1D7A3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a4 u1D7A4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a5 u1D7A5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a6 u1D7A6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a7 u1D7A7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a8 u1D7A8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a9 u1D7A9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7aa u1D7AA 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ab u1D7AB 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ac u1D7AC 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ad u1D7AD 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ae u1D7AE 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7af u1D7AF 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b0 u1D7B0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b1 u1D7B1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b2 u1D7B2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b3 u1D7B3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b4 u1D7B4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b5 u1D7B5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b6 u1D7B6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b7 u1D7B7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b8 u1D7B8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b9 u1D7B9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ba u1D7BA 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7bb u1D7BB 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7bc u1D7BC 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7bd u1D7BD 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7be u1D7BE 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7bf u1D7BF 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c0 u1D7C0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c1 u1D7C1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c2 u1D7C2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c3 u1D7C3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c4 u1D7C4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c5 u1D7C5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c6 u1D7C6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c7 u1D7C7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c8 u1D7C8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c9 u1D7C9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ca u1D7CA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7cb u1D7CB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7ce u1D7CE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7cf u1D7CF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d0 u1D7D0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d1 u1D7D1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d2 u1D7D2 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d3 u1D7D3 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d4 u1D7D4 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d5 u1D7D5 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d6 u1D7D6 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d7 u1D7D7 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d8 u1D7D8 2.22 (Serif, Serif Condensed) -U+1d7d9 u1D7D9 2.22 (Serif, Serif Condensed) -U+1d7da u1D7DA 2.22 (Serif, Serif Condensed) -U+1d7db u1D7DB 2.22 (Serif, Serif Condensed) -U+1d7dc u1D7DC 2.22 (Serif, Serif Condensed) -U+1d7dd u1D7DD 2.22 (Serif, Serif Condensed) -U+1d7de u1D7DE 2.22 (Serif, Serif Condensed) -U+1d7df u1D7DF 2.22 (Serif, Serif Condensed) -U+1d7e0 u1D7E0 2.22 (Serif, Serif Condensed) -U+1d7e1 u1D7E1 2.22 (Serif, Serif Condensed) -U+1d7e2 u1D7E2 2.23 (Sans, Sans Condensed) -U+1d7e3 u1D7E3 2.23 (Sans, Sans Condensed) -U+1d7e4 u1D7E4 2.23 (Sans, Sans Condensed) -U+1d7e5 u1D7E5 2.23 (Sans, Sans Condensed) -U+1d7e6 u1D7E6 2.23 (Sans, Sans Condensed) -U+1d7e7 u1D7E7 2.23 (Sans, Sans Condensed) -U+1d7e8 u1D7E8 2.23 (Sans, Sans Condensed) -U+1d7e9 u1D7E9 2.23 (Sans, Sans Condensed) -U+1d7ea u1D7EA 2.23 (Sans, Sans Condensed) -U+1d7eb u1D7EB 2.23 (Sans, Sans Condensed) -U+1d7ec u1D7EC 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7ed u1D7ED 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7ee u1D7EE 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7ef u1D7EF 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f0 u1D7F0 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f1 u1D7F1 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f2 u1D7F2 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f3 u1D7F3 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f4 u1D7F4 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f5 u1D7F5 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f6 u1D7F6 2.23 (Sans Mono) -U+1d7f7 u1D7F7 2.23 (Sans Mono) -U+1d7f8 u1D7F8 2.23 (Sans Mono) -U+1d7f9 u1D7F9 2.23 (Sans Mono) -U+1d7fa u1D7FA 2.23 (Sans Mono) -U+1d7fb u1D7FB 2.23 (Sans Mono) -U+1d7fc u1D7FC 2.23 (Sans Mono) -U+1d7fd u1D7FD 2.23 (Sans Mono) -U+1d7fe u1D7FE 2.23 (Sans Mono) -U+1d7ff u1D7FF 2.23 (Sans Mono) diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/unicover.txt b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/unicover.txt deleted file mode 100644 index 17103ae4..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.27/unicover.txt +++ /dev/null @@ -1,177 +0,0 @@ -This is the Unicode coverage file for DejaVu fonts -($Id$) - -Control and similar characters are discounted from totals. - - Sans Serif Sans Mono -U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95) -U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96) -U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128) -U+0180 Latin Extended-B 100% (208/208) 91% (191/208) 85% (177/208) -U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96) -U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 57% (46/80) -U+0300 Combining Diacritical Marks 82% (92/112) 60% (68/112) 59% (67/112) -U+0370 Greek and Coptic 100% (134/134) 85% (115/134) 82% (110/134) -U+0400 Cyrillic 100% (256/256) 78% (200/256) 68% (176/256) -U+0500 Cyrillic Supplement 94% (34/36) 27% (10/36) 16% (6/36) -U+0530 Armenian 100% (86/86) (0/86) (0/86) -U+0590 Hebrew 62% (54/87) (0/87) (0/87) -U+0600 Arabic 46% (115/250) (0/250) 45% (113/250) -U+0700 Syriac (0/77) (0/77) (0/77) -U+0750 Arabic Supplement (0/48) (0/48) (0/48) -U+0780 Thaana (0/50) (0/50) (0/50) -U+07c0 NKo 91% (54/59) (0/59) (0/59) -U+0900 Devanagari (0/113) (0/113) (0/113) -U+0980 Bengali (0/91) (0/91) (0/91) -U+0a00 Gurmukhi (0/79) (0/79) (0/79) -U+0a80 Gujarati (0/83) (0/83) (0/83) -U+0b00 Oriya (0/84) (0/84) (0/84) -U+0b80 Tamil (0/72) (0/72) (0/72) -U+0c00 Telugu (0/93) (0/93) (0/93) -U+0c80 Kannada (0/86) (0/86) (0/86) -U+0d00 Malayalam (0/95) (0/95) (0/95) -U+0d80 Sinhala (0/80) (0/80) (0/80) -U+0e00 Thai 1% (1/87) (0/87) (0/87) -U+0e80 Lao 100% (65/65) (0/65) 70% (46/65) -U+0f00 Tibetan (0/201) (0/201) (0/201) -U+1000 Myanmar (0/156) (0/156) (0/156) -U+10a0 Georgian 100% (83/83) 100% (83/83) 54% (45/83) -U+1100 Hangul Jamo (0/240) (0/240) (0/240) -U+1200 Ethiopic (0/356) (0/356) (0/356) -U+1380 Ethiopic Supplement (0/26) (0/26) (0/26) -U+13a0 Cherokee (0/85) (0/85) (0/85) -U+1400 Unified Canadian Aboriginal Syllabics 64% (404/630) (0/630) (0/630) -U+1680 Ogham 100% (29/29) (0/29) (0/29) -U+16a0 Runic (0/81) (0/81) (0/81) -U+1700 Tagalog (0/20) (0/20) (0/20) -U+1720 Hanunoo (0/23) (0/23) (0/23) -U+1740 Buhid (0/20) (0/20) (0/20) -U+1760 Tagbanwa (0/18) (0/18) (0/18) -U+1780 Khmer (0/114) (0/114) (0/114) -U+1800 Mongolian (0/156) (0/156) (0/156) -U+1900 Limbu (0/66) (0/66) (0/66) -U+1950 Tai Le (0/35) (0/35) (0/35) -U+1980 New Tai Lue (0/80) (0/80) (0/80) -U+19e0 Khmer Symbols (0/32) (0/32) (0/32) -U+1a00 Buginese (0/30) (0/30) (0/30) -U+1b00 Balinese (0/121) (0/121) (0/121) -U+1b80 Sundanese (0/55) (0/55) (0/55) -U+1c00 Lepcha (0/74) (0/74) (0/74) -U+1c50 Ol Chiki (0/48) (0/48) (0/48) -U+1d00 Phonetic Extensions 82% (105/128) 48% (62/128) 48% (62/128) -U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64) -U+1dc0 Combining Diacritical Marks Supplement 14% (6/41) (0/41) (0/41) -U+1e00 Latin Extended Additional 96% (247/256) 75% (193/256) 69% (178/256) -U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233) -U+2000 General Punctuation 98% (105/107) 81% (87/107) 42% (45/107) -U+2070 Superscripts and Subscripts 100% (34/34) 100% (34/34) 100% (34/34) -U+20a0 Currency Symbols 100% (22/22) 27% (6/22) 100% (22/22) -U+20d0 Combining Diacritical Marks for Symbols 21% (7/33) (0/33) (0/33) -U+2100 Letterlike Symbols 93% (75/80) 38% (31/80) 21% (17/80) -U+2150 Number Forms 92% (50/54) 92% (50/54) 24% (13/54) -U+2190 Arrows 100% (112/112) 100% (112/112) 100% (112/112) -U+2200 Mathematical Operators 100% (256/256) 39% (100/256) 58% (151/256) -U+2300 Miscellaneous Technical 27% (64/232) 6% (16/232) 50% (117/232) -U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39) -U+2440 Optical Character Recognition (0/11) (0/11) (0/11) -U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160) -U+2500 Box Drawing 100% (128/128) 100% (128/128) 100% (128/128) -U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32) -U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96) -U+2600 Miscellaneous Symbols 92% (176/191) 15% (30/191) 78% (149/191) -U+2700 Dingbats 100% (174/174) 0% (1/174) 82% (144/174) -U+27c0 Miscellaneous Mathematical Symbols-A 20% (9/44) 11% (5/44) 11% (5/44) -U+27f0 Supplemental Arrows-A 100% (16/16) 100% (16/16) (0/16) -U+2800 Braille Patterns 100% (256/256) 100% (256/256) (0/256) -U+2900 Supplemental Arrows-B 4% (6/128) 100% (128/128) (0/128) -U+2980 Miscellaneous Mathematical Symbols-B 10% (13/128) 0% (1/128) 2% (3/128) -U+2a00 Supplemental Mathematical Operators 28% (72/256) 1% (4/256) 0% (1/256) -U+2b00 Miscellaneous Symbols and Arrows 37% (31/82) 32% (27/82) 10% (9/82) -U+2c00 Glagolitic (0/94) (0/94) (0/94) -U+2c60 Latin Extended-C 96% (28/29) 55% (16/29) 20% (6/29) -U+2c80 Coptic (0/114) (0/114) (0/114) -U+2d00 Georgian Supplement (0/38) (0/38) (0/38) -U+2d30 Tifinagh 100% (55/55) (0/55) (0/55) -U+2d80 Ethiopic Extended (0/79) (0/79) (0/79) -U+2de0 Cyrillic Extended-A (0/32) (0/32) (0/32) -U+2e00 Supplemental Punctuation 4% (2/49) 4% (2/49) 4% (2/49) -U+2e80 CJK Radicals Supplement (0/115) (0/115) (0/115) -U+2f00 Kangxi Radicals (0/214) (0/214) (0/214) -U+2ff0 Ideographic Description Characters (0/12) (0/12) (0/12) -U+3000 CJK Symbols and Punctuation (0/64) (0/64) (0/64) -U+3040 Hiragana (0/93) (0/93) (0/93) -U+30a0 Katakana (0/96) (0/96) (0/96) -U+3100 Bopomofo (0/41) (0/41) (0/41) -U+3130 Hangul Compatibility Jamo (0/94) (0/94) (0/94) -U+3190 Kanbun (0/16) (0/16) (0/16) -U+31a0 Bopomofo Extended (0/24) (0/24) (0/24) -U+31c0 CJK Strokes (0/36) (0/36) (0/36) -U+31f0 Katakana Phonetic Extensions (0/16) (0/16) (0/16) -U+3200 Enclosed CJK Letters and Months (0/242) (0/242) (0/242) -U+3300 CJK Compatibility (0/256) (0/256) (0/256) -U+3400 CJK Unified Ideographs Extension A (0/0) (0/0) (0/0) -U+4dc0 Yijing Hexagram Symbols 100% (64/64) (0/64) (0/64) -U+4e00 CJK Unified Ideographs (0/0) (0/0) (0/0) -U+a000 Yi Syllables (0/1165) (0/1165) (0/1165) -U+a490 Yi Radicals (0/55) (0/55) (0/55) -U+a500 Vai (0/300) (0/300) (0/300) -U+a640 Cyrillic Extended-B 39% (31/78) 12% (10/78) (0/78) -U+a700 Modifier Tone Letters 62% (20/32) 62% (20/32) 62% (20/32) -U+a720 Latin Extended-D 35% (41/114) 1% (2/114) 1% (2/114) -U+a800 Syloti Nagri (0/44) (0/44) (0/44) -U+a840 Phags-pa (0/56) (0/56) (0/56) -U+a880 Saurashtra (0/81) (0/81) (0/81) -U+a900 Kayah Li (0/48) (0/48) (0/48) -U+a930 Rejang (0/37) (0/37) (0/37) -U+aa00 Cham (0/83) (0/83) (0/83) -U+ac00 Hangul Syllables (0/0) (0/0) (0/0) -U+d800 High Surrogates (0/0) (0/0) (0/0) -U+db80 High Private Use Surrogates (0/0) (0/0) (0/0) -U+dc00 Low Surrogates (0/0) (0/0) (0/0) -U+e000 Private Use Area (0/0) (0/0) (0/0) -U+f900 CJK Compatibility Ideographs (0/467) (0/467) (0/467) -U+fb00 Alphabetic Presentation Forms 100% (58/58) 12% (7/58) 3% (2/58) -U+fb50 Arabic Presentation Forms-A 11% (70/595) (0/595) 12% (72/595) -U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16) -U+fe10 Vertical Forms (0/10) (0/10) (0/10) -U+fe20 Combining Half Marks 57% (4/7) (0/7) (0/7) -U+fe30 CJK Compatibility Forms (0/32) (0/32) (0/32) -U+fe50 Small Form Variants (0/26) (0/26) (0/26) -U+fe70 Arabic Presentation Forms-B 100% (141/141) (0/141) 100% (141/141) -U+ff00 Halfwidth and Fullwidth Forms (0/225) (0/225) (0/225) -U+fff0 Specials 100% (5/5) 100% (5/5) 100% (5/5) -U+10000 Linear B Syllabary (0/88) (0/88) (0/88) -U+10080 Linear B Ideograms (0/123) (0/123) (0/123) -U+10100 Aegean Numbers (0/57) (0/57) (0/57) -U+10140 Ancient Greek Numbers (0/75) (0/75) (0/75) -U+10190 Ancient Symbols (0/12) (0/12) (0/12) -U+101d0 Phaistos Disc (0/46) (0/46) (0/46) -U+10280 Lycian (0/29) (0/29) (0/29) -U+102a0 Carian (0/49) (0/49) (0/49) -U+10300 Old Italic (0/35) (0/35) (0/35) -U+10330 Gothic (0/27) (0/27) (0/27) -U+10380 Ugaritic (0/31) (0/31) (0/31) -U+103a0 Old Persian (0/50) (0/50) (0/50) -U+10400 Deseret (0/80) (0/80) (0/80) -U+10450 Shavian (0/48) (0/48) (0/48) -U+10480 Osmanya (0/40) (0/40) (0/40) -U+10800 Cypriot Syllabary (0/55) (0/55) (0/55) -U+10900 Phoenician (0/27) (0/27) (0/27) -U+10920 Lydian (0/27) (0/27) (0/27) -U+10a00 Kharoshthi (0/65) (0/65) (0/65) -U+12000 Cuneiform (0/879) (0/879) (0/879) -U+12400 Cuneiform Numbers and Punctuation (0/103) (0/103) (0/103) -U+1d000 Byzantine Musical Symbols (0/246) (0/246) (0/246) -U+1d100 Musical Symbols (0/220) (0/220) (0/220) -U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70) -U+1d300 Tai Xuan Jing Symbols 100% (87/87) (0/87) (0/87) -U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18) -U+1d400 Mathematical Alphanumeric Symbols 10% (107/996) 5% (55/996) 6% (62/996) -U+1f000 Mahjong Tiles (0/44) (0/44) (0/44) -U+1f030 Domino Tiles (0/100) (0/100) (0/100) -U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0) -U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542) -U+e0000 Tags (0/98) (0/98) (0/98) -U+e0100 Variation Selectors Supplement (0/240) (0/240) (0/240) -U+f0000 Supplementary Private Use Area-A (0/0) (0/0) (0/0) -U+100000 Supplementary Private Use Area-B (0/0) (0/0) (0/0) diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/AUTHORS b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/AUTHORS deleted file mode 100644 index 94d37c27..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/AUTHORS +++ /dev/null @@ -1,46 +0,0 @@ -abysta at yandex.ru -Adrian Schroeter -Andrey Valentinovich Panov -Ben Laenen -Besarion Gugushvili -Bhikkhu Pesala -Clayborne Arevalo -Dafydd Harries -Danilo Segan -Davide Viti -David Jez -David Lawrence Ramsey -Denis Jacquerye -Dwayne Bailey -Eugeniy Meshcheryakov -Gee Fung Sit -Heikki Lindroos -James Cloos -James Crippen -John Karp -Keenan Pepper -Lars Naesbye Christensen -Mashrab Kuvatov -Max Berger -Mederic Boquien -Michael Everson -Misu Moldovan -Nguyen Thai Ngoc Duy -Nicolas Mailhot -Ognyan Kulev -Ondrej Koala Vacha -Peter Cernak -Remy Oudompheng -Roozbeh Pournader -Sahak Petrosyan -Sander Vesik -Stepan Roh -Stephen Hartke -Steve Tinney -Tavmjong Bah -Tim May -Valentin Stoykov -Vasek Stodulka -Wesley Transue - -$Id: AUTHORS 2344 2009-03-08 13:02:37Z moyogo $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/BUGS b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/BUGS deleted file mode 100644 index 49b36de5..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/BUGS +++ /dev/null @@ -1,3 +0,0 @@ -See http://dejavu.sourceforge.net/wiki/index.php/Bugs - -$Id: BUGS 80 2004-11-13 13:12:02Z src $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/LICENSE b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/LICENSE deleted file mode 100644 index 254e2cc4..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/LICENSE +++ /dev/null @@ -1,99 +0,0 @@ -Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. -Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) - -Bitstream Vera Fonts Copyright ------------------------------- - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is -a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute the -Font Software, including without limitation the rights to use, copy, merge, -publish, distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to the -following conditions: - -The above copyright and trademark notices and this permission notice shall -be included in all copies of one or more of the Font Software typefaces. - -The Font Software may be modified, altered, or added to, and in particular -the designs of glyphs or characters in the Fonts may be modified and -additional glyphs or characters may be added to the Fonts, only if the fonts -are renamed to names not containing either the words "Bitstream" or the word -"Vera". - -This License becomes null and void to the extent applicable to Fonts or Font -Software that has been modified and is distributed under the "Bitstream -Vera" names. - -The Font Software may be sold as part of a larger software package but no -copy of one or more of the Font Software typefaces may be sold by itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME -FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING -ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE -FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font Software -without prior written authorization from the Gnome Foundation or Bitstream -Inc., respectively. For further information, contact: fonts at gnome dot -org. - -Arev Fonts Copyright ------------------------------- - -Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the fonts accompanying this license ("Fonts") and -associated documentation files (the "Font Software"), to reproduce -and distribute the modifications to the Bitstream Vera Font Software, -including without limitation the rights to use, copy, merge, publish, -distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to -the following conditions: - -The above copyright and trademark notices and this permission notice -shall be included in all copies of one or more of the Font Software -typefaces. - -The Font Software may be modified, altered, or added to, and in -particular the designs of glyphs or characters in the Fonts may be -modified and additional glyphs or characters may be added to the -Fonts, only if the fonts are renamed to names not containing either -the words "Tavmjong Bah" or the word "Arev". - -This License becomes null and void to the extent applicable to Fonts -or Font Software that has been modified and is distributed under the -"Tavmjong Bah Arev" names. - -The Font Software may be sold as part of a larger software package but -no copy of one or more of the Font Software typefaces may be sold by -itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL -TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the name of Tavmjong Bah shall not -be used in advertising or otherwise to promote the sale, use or other -dealings in this Font Software without prior written authorization -from Tavmjong Bah. For further information, contact: tavmjong @ free -. fr. - -$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/NEWS b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/NEWS deleted file mode 100644 index a05a30c2..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/NEWS +++ /dev/null @@ -1,1215 +0,0 @@ -Changes from 2.29 to 2.30 - -* added U+0462-U+0463 to Mono (by Denis Jacquerye) -* corrected U+1E53 in Serif (by Gee Fung Sit) -* added U+1E4C-U+1E4D to Mono and Serif (by Gee Fung Sit) -* added U+1E78-U+1E79 to Mono (by Gee Fung Sit) -* fixed missing diacritics in Latin Extended Additional in Sans ExtraLight - (moved stacked diacritics out of PUA in the process) (by Gee Fung Sit) -* fixed anchors on U+1E78 in Serif (by Gee Fung Sit) -* added U+1DC4-U+1DC9 to Serif (by Denis Jacquerye) -* renamed above-mark to above-mark in Serif-Italic (by Denis Jacquerye) -* added U+1DC4-U+1DC9 to context class for dotless substitution (by Denis - Jacquerye) -* changed Doubleacute to Doublegrave in Sans ExtraLight (by Gee Fung Sit) -* removed redundant reference in U+01FB in Sans Oblique (by Gee Fung Sit) -* added U+A726-U+A727 to Mono (Denis Jacquerye) -* changed U+04BE and U+04BF according to recommedations of Sasha Ankwab in Sans - (by Andrey V. Panov) -* remove "Symbol Charset" from set of codepages in Sans (by Eugeniy - Meshcheryakov) - -Changes from 2.28 to 2.29 - -* modified U+10FB in Sans to be a mirror image of U+2056, since U+10FB is not - Georgian-specific (by Roozbeh Pournader) -* added U+2B1F, U+2B24, U+2B53, U+2B54 in Sans (by Roozbeh Pournader) -* fixed TUR opentype language tag to TRK in Serif (bug 19825) (by Ben Laenen) -* early implementation of Abkhaz letter U+0524-U+0525 in Sans - (by Michael Everson and abysta) -* flipped U+1D538 in Sans (by Gee Fung Sit) -* added U+26B3-U+26B8, U+1D7D8-U+1D7E1 in Sans (by Gee Fung Sit) -* corrected U+1D7A9 in Sans Bold Oblique (by Gee Fung Sit) -* Fixed U+0649 to be dual-joining in Sans Mono (by Roozbeh Pournader) -* Remove unnecessary 'isol' feature from Sans Mono (by Roozbeh Pournader) -* Remove 'cmap' mappings for U+066E, U+066F, U+067C, U+067D, U+0681, U+0682, - U+0685, U+0692, U+06A1, U+06B5, U+06BA, U+06C6, U+06CE, and U+06D5 - in Sans Mono (bug 20323) (by Roozbeh Pournader) -* add half brackets (U+2E22 - U+2E25, by Steve Tinney) - -Changes from 2.27 to 2.28 - -* added U+A789, U+A78A in Sans and Sans Mono (by Denis Jacquerye) -* modified U+02D6, U+02D7, U+02EE in Sans and Sans Mono (by Denis Jacquerye) -* added U+1E9E (German capital ß) to Sans and Serif (by Denis Jacquerye) -* adjusted width of U+01B7-U+01B9 in Serif Italic (by Denis Jacquerye) -* modified U+021C, U+021D in Sans (by Denis Jacquerye) -* added U+021C, U+021D in Mono (by Denis Jacquerye) -* added U+F428 (Georgian Nuskhuri "f") in private use area (by Besarion - Gugushvili) -* updated Georgian mkhedruli (U+10D0-U+10FA) with new version (by Besarion - Gugushvili) -* updated Georgian asomtavruli (U+10A0-U+10C5) with new version (by Besarion - Gugushvili) -* added Georgian nuskhuri (U+2D00-U+2D25) (by Besarion Gugushvili) -* added Georgian mtavruli in private use area (U+F400-U+F426) (by Besarion - Gugushvili) -* added mark anchors above to Cyrillic U+0430-U+0438, U+043A-U+044F, - U+0454-U+0455 in Mono (by Ben Laenen) -* modified/moved up U+0318-U+0319, U+031C-U+031F, U+0329-U+032A, U+032C-U+032D, - U+0339-U+033B, U+0348 and U+0353 in Sans to prevent cut-off (by Gee Fung Sit) -* added U+035A to Sans (by Gee Fung Sit) -* updated fontconfig files (by Nicolas Mailhot) -* added U+2032-2037 to Mono (by Denis Jacquerye) -* added Ogham to Sans ExtraLight (by Gee Fung Sit) -* added U+2C6F, U+2C79, U+2C7C-2C7D to Mono (by Gee Fung Sit) -* added U+210F to Serif and Sans ExtraLight (by Gee Fung Sit) -* changed U+210F to a more common glyph in Sans and Mono (by Gee Fung Sit) - -Changes from 2.26 to 2.27 - -* added some of Michael Everson's new Cyrillic glyphs to Sans (by Wesley - Transue) -* removed blank glyph at U+05EF from Sans Bold Oblique (by Gee Fung Sit) -* small adjustments to existing tone bars in Sans and Mono (by Gee Fung Sit) -* added U+0372-U+0373, U+0376-U+0377, U+03CF, U+A668-U+A66E, U+A708-U+A711, - U+A71B-U+A71F to Sans (by Gee Fung Sit) -* copied U+02E5-U+02E9 over from Sans to fix inconsistencies in Serif (by Gee - Fung Sit) -* added U+021C-U+021D, U+0370-U+0371, U+037B-U+037D, U+0470-U+0471, - U+0510-U+0515, U+051A-U+051D, U+1E9F, U+2C64, U+2C6E-U+2C6F, U+2C79, - U+2C7C-U+2C7D, U+A644-U+A647, U+A650-U+A651, U+A654-U+A657, U+A708-U+A716, - U+A71B-U+A71F to Serif (by Gee Fung Sit) -* added U+A708-U+A716, U+A71B-U+A71F to Mono (by Gee Fung Sit) -* added anchors to U+017F (ſ) and fixed U+1E9B (ẛ) in Serif (by Gee Fung Sit) -* made U+0325 smaller in Sans Bold and Serif to match Sans Book (by Gee Fung - Sit) -* fixes to U+02F3 (moved up), U+228F-U+2294 (more square-like) and - U+22CE-U+22CF (stroke width) in Sans (by Gee Fung Sit) -* replaced U+2202 ∂ (Sans and Mono) and U+221D ∝, U+221E ∞ (Sans) with glyphs - from Arev (with small changes) (by Gee Fung Sit) -* added U+22B0-U+22B1, U+22C7, U+22D0-U+22D5 from Arev to Sans to complete the - block (by Gee Fung Sit) -* added U+0514-U+0515 to Sans ExtraLight (by Gee Fung Sit) -* skewed U+A78C in all Oblique/Italic fonts (by Gee Fung Sit) -* moved U+2215 to U+2044 in Sans and Serif and replaced U+2215 with reference - to U+002F in all fonts (by Gee Fung Sit) -* added U+2C6E to Mono (by Denis Jacquerye) -* added U+A782 and U+A783 in Sans (by Wesley Transue) -* added U+0244, U+024C-024D, U+2C64 in Sans Mono (by Denis Jacquerye) -* modified U+01AE in Sans Mono (by Denis Jacquerye) -* added U+2C7A to all fonts (by Gee Fung Sit) -* italicized/small changes to U+2C76 in Serif (Bold) Italic (by Gee Fung Sit) -* improved outlines of U+2C68, U+2C6A, U+2C6C in Serif (Bold) Italic (by Gee - Fung Sit) -* rounded U+2C77 at the bottom in Serif (by Gee Fung Sit) -* added joining behavior for tone letters (U+02E5-U+02E9) in Sans (bug #15669) - (by Gee Fung Sit) -* fixed outline of y.alt in Sans Regular (by Denis Jacquerye) -* changed references of U+1D5A8, U+1D5C5, U+1D5DC, U+1D5F9, U+1D610, U+1D62D, - U+1D644 and U+1D661 to stylistic alternates to have a better distinction (by - Gee Fung Sit) -* hinted I.alt in Sans Regular (by Gee Fung Sit) -* added U+0487, completing Cyrillic block (by Gee Fung Sit) -* extended the bar of U+0463 to the right and moved the anchor (by Gee Fung - Sit) -* added anchors to glyphs in Cyrillic block (by Gee Fung Sit) -* added (preliminary) hints to tone letter forms (U+02E5.5, U+02E9.1, stem) in - Sans Book (by Gee Fung Sit) - -Changes from 2.25 to 2.26 - -- added glyphs for Cyrillic-B to Sans (by Wesley Transue) -- added U+0370-U+0371 to Sans (by Wesley Transue) -- added U+019C, U+01A2-U+01A3, U+01A6, U+01E4-U+01E5, U+024C-U+024D, U+0285, - U+0290, U+02A0, U+0370-U+0371, U+03F1, U+03FC to Sans ExtraLight (by Wesley - Transue) -- added U+20A0-U+20A5, U+20A7-U+20B3, U+2105, U+210D, U+210F, U+2115, U+2117, - U+2119-U+211A, U+211D, U+2124, U+212E, U+2200-U+2204 to Mono (by Heikki - Lindroos) -- added U+01BA and U+01BF to Mono (by Heikki Lindroos) -- merged OpenType "aalt" feature in Latin in Sans (by Denis Jacquerye) -- added alternative shape for y in Sans (by Denis Jacquerye) -- added saltillo (U+A78B-U+A78C) to all faces (by James Cloos) -- changed U+047C-U+047D to references instead of outlines in Sans (by Wesley - Transue) -- added Latin letter tresillo U+A72A-U+A72B to Sans (by Wesley Transue) -- added U+A734-U+A737 to Sans (by Wesley Transue) -- added U+2053 to Serif and fixed it bug:9425 in Sans (by Gee Fung Sit) -- removed problematic hints for U+0423 bug:10025 (by Gee Fung Sit) -- added U+27C5-U+27C6 bug:10255 to all faces (by Gee Fung Sit) -- fixed width of U+2016 in Sans Oblique (by Gee Fung Sit) -- added U+2016, U+2032-U+2038, U+2042, U+2045-U+2046, U+204B-U+204F, - U+2051-U+2052, U+2057 to Serif (by Gee Fung Sit) -- made U+2140 bigger to match other n-ary operators (by Gee Fung Sit) -- added U+0606-U+0607, U+0609-U+060A to Sans (by Gee Fung Sit) -- added U+221B-U+221C to Mono (by Gee Fung Sit) -- small adjustments to U+221B-U+221C in Sans and Serif (by Gee Fung Sit) -- update U+04B4-U+04B5 in Serif (by Andrey V. Panov) -- increased max-storage value from maxp table to 153 (by Andrey V. Panov) -- added U+0472-U+0473, U+0510-U+0511, U+051A-U+051D, U+0606-U+0607, - U+0609-U+060A, U+1E26-U+1E27, U+1E54-U+1E55, U+1E7C-U+1E7D, U+1E8C-U+1E8D, - U+1E90-U+1E91, U+1E97-U+1E99, U+1E9F, U+1EAC-U+1EAD, U+1EB6-U+1EB7, - U+1EC6-U+1EC7, U+1ED8-U+1EDD, U+1EE0-U+1EE3, U+1EE8-U+1EEB, U+1EEE-U+1EF1 to - Mono (by Gee Fung Sit) -- added locl rules for S/T cedilla for Romanian and Moldavian so they get - rendered as S/T with comma accent (see Redhat bug #455981) (by Ben Laenen) -- removed ligature rule from Armenian U+0587 bug:16113 (by Gee Fung Sit) - -Changes from 2.24 to 2.25 - -- moved/added U+2E18 (by Gee Fung Sit) -- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit) -- added U+22CE-U+22CF to Sans (by Gee Fung Sit) -- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye) -- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit) -- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen) -- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov) -- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit) -- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen) -- added U+2E2E to Sans (by Gee Fung Sit) -- replaced U+2699 with simpler version in Sans (by Gee Fung Sit) -- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue) -- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit) -- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye) -- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue) -- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit) -- added several glyphs to Sans ExtraLight (by Gee Fung Sit) -- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue) -- corrected width of U+027E in Sans Book (by Gee Fung Sit) -- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit) -- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit) -- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov) -- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov) -- further improvements in extended Cyrillic (by Andrey V. Panov) - -Changes from 2.23 to 2.24 - -- instructions for U+05C0 ׀, U+05C3 ׃, U+05F3 ׳, and U+05F4 ״ in DejaVu - Sans. (by Wesley Transue) -- instructions for U+2116 in Sans (by Andrey V. Panov) -- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added - U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by - Denis Jacquerye) -- updated and instructed U+0401 in Sans (by Andrey V. Panov) -- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction. - Also, added a few more glyph instructions. (by Wesley Transue) -- removed OS2Sub and OS2Strike that weren't intentional in Sans - ExtraLight. (by Denis Jacquerye) -- updated instructions for U+401, U+44F in Serif Book. (by Andrey V. - Panov) -- instructions for U+02C4 ˄, U+02C5 ˅, U+03D8 Ϙ, U+03D9 ϙ, U+0494 Ҕ, and - U+0495 ҕ in Sans Book. (by Wesley Transue) -- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆ - in Sans Book. (by Wesley Transue) -- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and - U+451 using code generated with xgridfit (by Andrey V. Panov) -- instructions for a few glyphs in the Latin Extended-B Block, Greek - Block, Cyrillic Block, and N'Ko block. (by Wesley Transue) -- updated sfdnormalize.pl, and SFD files to new SFD format with empty - lines. (by Denis Jacquerye) - -Changes from 2.22 to 2.23 - -- fixed bug which made Condensed fonts appear instead of normal width ones -- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader) -- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF, - U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF, - U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by - Wesley Transue) -- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue) -- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by - Wesley Transue) -- added mathematical alphanumeric symbols to all styles (by Max Berger) -- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh - Pournader) -- dereferenced all glyphs with mixed references and outlines (by Denis - Jacquerye) -- removed non-zero width from U+0344 in Sans (by Denis Jacquerye) - -Changes from 2.21 to 2.22 - -- directory structure has changed, we now use the Makefile -- modified Armenian U+0565 in Sans (by Սահակ Պետրոսյան) -- added double struck letters and numbers U+2102, U+210D, U+2115, - U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539, - U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B, - U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke) -- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to - Serif (by Ben Laenen) -- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen) -- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1; - supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975, - U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen) -- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09, - U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye) -- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye) -- added Ogham in Sans (by Wesley Transue) -- added Yijing Hexagram Symbols in Sans (by Wesley Transue) -- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD, - U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by - Wesley Transue) -- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462, - U+048C-U+048D in Serif (by Andrey V. Panov) -- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue) -- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben - Laenen) -- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen) -- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214, - U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben - Laenen) -- modified bullet symbol U+2219 in Serif (by Ben Laenen) - -Changes from 2.20 to 2.21 - -- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye) -- added anchor "half" to position right half of double marks, U+FE21 or U+FE23 - to Sans (by Denis Jacquerye) -- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis - Jacquerye) -- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by - Denis Jacquerye) -- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy - Meshcheryakov) -- added instructions to some N'Ko glyphs (by Wesley Transue) -- added instructions to some Lao glyphs (by Wesley Transue) -- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by - Denis Jacquerye) -- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov) -- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen) -- added Makefile to improve font and packages generating (by Nicolas Mailhot) - -Changes from 2.19 to 2.20 - -- removed TeX and TeXData tags from all sfd files (by Eugeniy Meshcheryakov) -- removed all 'frac' lookups (by Eugeniy Meshcheryakov) -- fixed duplicate glyph names (by Eugeniy Meshcheryakov) -- removed standard ligatures with U+00B7 in Mono (by Eugeniy Meshcheryakov) -- use reference to U+002D in U+00AD in Sans Oblique, and adjust instructions - (by Eugeniy Meshcheryakov) -- updated Cyrillic in Sans Extra Light (by Andrey V. Panov) -- added instructions to N'Ko U+07C1-U+07C6, U+07CA, U+07CE-U+07CF, U+07D1, - U+07D3-U+07D4, U+07D8, U+07DB and U+07EB in Sans (by Wesley Transue) -- added instructions to Lao U+0E8A, U+0E95, U+0E97, U+EA5, U+0EB4 and U+0EB5 - (by Wesley Transue) -- adjusted instructions for Hebrew glyphs (by Denis Jacquerye) -- added instructions for U+0265 in Sans Bold (by Denis Jacquerye) -- fix U+1D68 in Sans: it had the shape of delta, where it should be a rho (by - Ben Laenen) -- remove U+1D5C glyph in Sans Oblique (it was empty) (by Ben Laenen) -- fix instructions of U+01AD in Sans Bold (by Ben Laenen) -- fix instructions of U+042D in Serif (by Ben Laenen) -- remove buggy instructions of U+2328 in Serif (by Ben Laenen) -- corrected width of U+2C75-U+2C76 in Sans Bold and Serif Bold (by Gee Fung Sit) -- added U+2C75-U+2C77 to Mono (by Gee Fung Sit) - -Changes from 2.18 to 2.19 - -- fixed misplaced symbols (U+2325,2326) in Sans Oblique (by John Karp) -- added Mark to Base anchors: 'cedilla' for combining cedilla and - 'above-legacy' for stacking above precomposed glyphs (just a,e,i,o,u with - macron for now) in Sans (by Denis Jacquerye). -- added contextual substitution for Case and Dotless forms in all Sans variants - (by Denis Jacquerye). -- renamed 'ccmp' lookups for RTL and Basic (LGC, etc.) (by Denis Jacquerye) -- added anchor 'cedilla' for vowels in Sans. (by Denis Jacquerye) -- extended contextual dotless and case substitutions to handle both below and - above diacritics (by Denis Jacquerye) -- renamed Dotless and Case Form GSUB lookups in Sans with meaningful names (by - Denis Jacquerye) - -Changes from 2.17 to 2.18 - -- Re-encoded the source files for Full Unicode (by Ben Laenen) -- Re-enabled the "ff", "fl", "fi", "ffl", "ffi" ligatures by default in Serif - (by Ben Laenen) -- Disabled the "fi", "ffi" ligatures for languages with dotless i in Serif (by - Ben Laenen) -- added Tifinagh to Sans Book and Bold, U+2D30-U+2D65, U+2D6F, partially hinted - in Sans Book. (by Denis Jacquerye) -- added Tai Xuan Jing Symbols (U+1D300-1D356) to Sans (by Remy Oudompheng) -- added double-struck letters (U+1D538-U+1D56B minus reserved code points) to - Sans (by Gee Fung Sit) -- added U+22EE-U+22F1 to Sans (by Gee Fung Sit) -- added U+2C67-U+2C6C, U+2C75-U+2C77 to Serif (by Gee Fung Sit) -- italicized various glyphs in Latin Extended-B, IPA Extensions, Spacing - Modifier Letters, Phonetic Extension (Supplement) and Super- and Subscripts - in Serif Oblique fonts (by Gee Fung Sit) -- modified outlines, bearings of Hebrew U+05D6, U+05D8, U+05DB, U+05DE, U+05E0, - U+05E1, U+05E2, U+05EA in Sans Book and Oblique, adjusted hinting in Book - based on Yotam Benshalom's comments. (by Denis Jacquerye) -- added Braille Patterns (U+2800-U+28FF) to Serif fonts (by Gee Fung Sit) -- added N'Ko to Sans Book and Bold: U+07C0-U+07E7, U+07EB-U+07F5, U+07F8-U+07FA - (by Eugeniy Meshcheryakov) -- added U+0ED8 (Lao digit 8) to Sans (by Remy Oudompheng) -- added Lao diacritics U+0EB0-0EB9, U+0EBB-0EBC, U+0EC8-0ECD to Mono (by Remy - Oudompheng) -- renamed Serif [Bold] Oblique, make it Italic (by Eugeniy Meshcheryakov) -- added U+29FA-U+29FB to Sans and Sans Mono (by Gee Fung Sit) -- swapped glyphs for Eng U+014A from Sami Eng to African Eng, the latter being - more common (by Denis Jacquerye) -- swapped ae U+00E6 and ae.alt in Serif Italics fonts, thus fixing #8213 (by - Denis Jacquerye) -- minor improvements to Misc. Symbols in Sans (by Gee Fung Sit) -- minor improvements and additions to Sans ExtraLight (by Gee Fung Sit) -- improved instructions for various Cyrillic letters (by Eugeniy Meshcheryakov) -- fixed hinting of theta and chi in Sans Book (by Ben Laenen) -- added Georgian Mkhedruli to Sans, Serif and Mono, ASumtavruli to Sans and - Serif (by Besarion Gugushvili) - -Changes from 2.16 to 2.17 - -- Sans fonts: fix position for certain combinations of Arabic fatha, kasra, - shadda, damma, kasratan, dammatan, fathatan and hamza (by Ben Laenen) -- added 'ae.alt' to Serif Oblique fonts, with design matching shape of italic - 'a' instead of slanted 'a', see bug #8213 (by Denis Jacquerye) -- added super- and subscripts to Serif and Mono: U+1D2C-U+1D2E, U+1D30-U+1D3C, - U+1D3E-U+1D42, U+1D62-U+1D65, U+1D78, U+2071, U+207A-U+207E, U+208A-U+208E, - U+2090-U+2094 (by Gee Fung Sit) - -Changes from 2.15 to 2.16 - -- fixed hinting instructions for digits in DejaVu Sans Oblique, Bold Oblique, - and Serif Book to not change glyph width (by Eugeniy Meshcheryakov) -- added instructions for U+0404, U+0411, U+0413, U+0414, U+0417-U+041B, U+041F, - U+0423, U+0424, U+0426-U+0429, U+042C, U+042E, U+042F, U+0490 in Serif Bold - (by Eugeniy Meshcheryakov) -- added U+0220 and Eng.alt to Serif fonts (by Denis Jacquerye) -- added U+232C, U+2394, U+23E3 to Sans fonts (by John Karp) -- added U+230C-U+230F, U+231C-U+231F to Sans fonts, fixing bug:9547 - (by John Karp) -- adjusted dot below, dot above, dieresis above, dieresis below in Sans fonts - (by Denis Jacquerye) -- added U+2300, U+2301, U+2303, U+2304, U+2305, U+2307, U+2326, U+2327, U+232B, - arrow.base to Sans fonts (by John Karp) -- adjusted dot and dieresis below and above in Serif fonts (by Denis Jacquerye) -- added U+1E1C-U+1E1D to Serif fonts (by Denis Jacquerye) -- added U+22BE, U+22BF (by Wesley Transue) -- added U+2324; modified U+2325: more standard proportions, and matches U+2324 - and U+2387; added U+2387 : flipped U+2325 with standard arrowhead - (by John Karp) -- added Lao digits U+0ED0-0ED7, U+0ED9 (by Remy Oudompheng) -- added to Mono in Arabic block : U+060C, U+0615, U+061B, U+061F, - U+0621-U+063A, U+0640-0655, U+065A, U+0660-066F, U+0674, U+0679-0687, U+0691, - U+0692, U+0698, U+06A1, U+06A4, U+06A9, U+06AF, U+06B5, U+06BA, U+06BE, - U+06C6, U+06CC, U+06CE, U+06D5, U+06F0-06F9 (by Remy Oudompheng) -- added to Mono in Arabic Presentations Forms-A : U+FB52-FB81, U+FB8A-FB95, - U+FB9E, U+FB9F, U+FBAA-FBAD, U+FBE8, U+FBE9, U+FBFC-FBFF (by Remy Oudompheng) -- added to Mono in Arabic Presentations Forms-B : U+FE70-FE74, U+FE76-FEFC, - U+FEFF (by Remy Oudompheng) -- added U+05BA, U+05BE, U+05F3, U+05F4, U+FB1E, U+FB21-U+FB28, U+FB4F to Sans - (by Eugeniy Meshcheryakov) -- added U+2102 to Mono (by Eugeniy Meshcheryakov) -- added U+2983-U+2984 to Sans (by Gee Fung Sit) -- added U+2A2F to Sans, Serif and Mono (by Gee Fung Sit) -- added U+2373-2375, U+237A to Sans (by John Karp) -- converted kern pairs to kern classes with Tavmjong Bah's scripts - (by Denis Jacquerye) -- set ScriptLang of kerning classes to just latn because of Pango bug - (by Denis Jacquerye) -- added DNK to ScriptLang latn otherwise it is excluded, and SRB and MDK to - cyrl (by Denis Jacquerye) -- removed flag 0x80 in generate.pe, otherwise it generates kerning tables some - systems don't like; thus loosing Apple tables (by Denis Jacquerye) -- removed ligature for precomposed legacy characters of Sans Oblique fonts - (by Denis Jacquerye) -- added bearings to en dash U+2013, em dash U+2014 and figure dash U+2012 - by making dashes shorter, preserving character width (by Denis Jacquerye) -- reduced U+031C, U+0325 (ring below), U+0339 to be entirely visible; - added instructions in Sans Book; changed U+1e00-U+1e01 to use new ring below - (by Denis Jacquerye) -- adjusted circumflex below on U+1E12-U+1E13, U+1E18-U+1E19, U+1E3C-U+1E3D, - U+1E4A-U+1E4B, U+1E70-U+1E71, U+1E76-U+1E77 in Sans fonts (by Denis Jacquerye) -- Added U+0ED4, U+0ED5 to DejaVu Sans (by Remy Oudompheng) -- Lao-specific anchors (by Remy Oudompheng) -- added alternate I to match the small capital in Sans (by Gee Fung Sit) - -Changes from 2.14 to 2.15 - -- improved hinting in Sans Oblique to deal with some spacing and inconsistency - issues (by Ben Laenen) -- added anchors to Mono Book, and added GPOS rules for combining diacritics to - show up as zero width glyphs (by Ben Laenen) -- removed U+F21C (PUA), it was copy of U+2C64 from Latin Extended C (by Eugeniy - Meshcheryakov) -- added U+27E6-U+27E7 to Sans (by Gee Fung Sit) -- added U+1407, U+1409, U+140C-U+141B, U+141D-U+1425, U+1427-U+142E, - U+1435-U+1438, U+143A-U+1449, U+1452, U+1454, U+1457-U+1465, U+1467-U+146A, - U+1471, U+1474-U+1482, U+1484-U+1488, U+148F, U+1492, U+14A0, U+14A2, U+14A9, - U+14AC-U+14BA, U+14BC, U+14BD, U+14C6, U+14C9-U+14CF, U+14D1, U+14D2, U+14D9, - U+14DC-U+14E9, U+14EC, U+14F3, U+14F6-U+1504, U+1506, U+1507, U+1510-U+1525, - U+152C, U+152F-U+153D, U+1540, U+1541, U+154E, U+154F, U+1552, U+155B, U+155C, - U+1568, U+1569, U+1574-U+157B, U+157D, U+15A7-U+15AE, U+1646, U+1647 (by - Eugeniy Meshcheryakov) -- fixed several contours to not intersect, use horizontal or vertical tangents, - use integer coordinates, etc in Sans Book (by Denis Jacquerye) -- added U+0496-U+0497 in Serif (by Andrey V. Panov) - -Changes from 2.13 to 2.14 - -- added Philippine peso glyph U+20B1 (by Clayborne Arevalo) -- made U+2012 have the same width as digits, according to Unicode 5.0, - page 206 (by Roozbeh Pournader) -- made all of the "above" combining characters remove the dot of "i", - "j", etc (Soft_Dotted characters), according to Unicode 5.0, - page 228 (by Roozbeh Pournader) -- made U+012F, U+03F3, U+0456, U+0458, U+1E2D, and U+1ECB (all fonts - except Mono), U+0249, U+2148, and U+2149 (Sans and Sans Condensed), - U+0268 (Sans ExtraLight, Serif and Serif Condensed), and U+029D (Serif - and Serif Condensed) respect the Soft_Dotted property (by Roozbeh - Pournader) -- added U+223E, U+223F, U+2240, U+22C2, U+22C3 to Sans (by Remy Oudompheng) -- added U+203D to Serif (by Gee Fung Sit) -- added zero-width glyphs for U+2061-U+2063 to Sans and Serif (by Gee - Fung Sit) -- changed isolated forms of Arabic waw (U+0648, U+0624 and U+06C6) (bug #9432) - (by Ben Laenen) -- added Lao consonants U+0E81, U+0E82, U+0E84, U+0E87, U+0E88, U+0E8A, - U+0E8D, U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA, - U+0EAB, U+0EAD-0EAF to Sans Mono (by Remy Oudompheng) -- added U+0200-U+0217, U+0226-U+0229, U+02F3, U+1E00-U+1E07, - U+1E0A-U+1E0B, U+1E18-U+1E1F, U+1E22-U+1E23, U+1E28-U+1E2D, - U+1E3A-U+1E3B, U+1E40, U+1E48-U+1E49, U+1E56, U+1E58-U+1E59, - U+1E5E-U+1E5F, U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, U+1E72-U+1E77, - U+1E86-U+1E8B, U+1E92-U+1E96, U+1EA0-U+1EA1, U+1EF4-U+1EF5 to Mono - (by Ben Laenen) -- renamed uppercase variants of diacritics (macron, breve, double grave, - double acute, inverted breve, dot above) to "uni03XX.case" in Mono - (by Ben Laenen) -- moved uppercase variants of diacritics up in Mono so they properly - vertically align on capitals (by Ben Laenen) -- precomposed glyphs with macron, breve, double grave, double acute, - inverted breve, dot above, macron below, breve below, inverted breve - below, dot below, cedilla, caron below, circumflex below, diaeresis - below, tilde below now reference to combining diacritics instead of - space modifiers in Mono (by Ben Laenen) -- made ring below (U+0325), and half rings below (U+031C and U+0339) - smaller in Mono (by Ben Laenen) -- added U+205F to all fonts (by Roozbeh Pournader) -- added U+035E-U+035F to Sans (by Roozbeh Pournader) -- added empty glyphs for U+034F, U+202A-U+202E, U+2060, U+206A-206F, - U+FE00-U+FE0F to non-Mono fonts (by Roozbeh Pournader) -- added U+2101, U+2107-U+2108, U+210B, U+210C, U+2110, U+2112, U+211B, - U+211F, U+2123, U+2125, U+2128-U+2129, U+212C-U+212D, U+212F, - U+2130-U+2131, U+2133, U+2136-U+213A, U+2141-U+2144, U+2B00-U+2B11, - U+2B20-U+2B23 to Sans (by John Karp) -- reshaped omega (U+03C9) in Mono (by Ben Laenen) -- added U+2205, U+22C6, U+2300-U+2301, U+2303-U+2306, U+230C-U+230F, - U+2312-U+2315, U+231C-U+231F, U+2335, U+2337-U+233E, U+2341-U+2344, - U+2347-U+2348, U+234B-U+234D, U+2349-U+2350, U+2352-U+2354, - U+2357-U+2359, U+235A-U+235C, U+235E-U+2360, U+2363-U+2365, - U+2368-U+2369, U+236B-U+2370, U+2373-U+237A, U+2380-U+2383, - U+2388-U+238B, U+2395 in Mono (by Ben Laenen) - -Changes from 2.12 to 2.13 - -- adjusted U+0198B, U+01B3-U+01B4 in Sans, hinted U+01B4 in Sans Book - (by Denis Jacquerye) -- added U+27F0-U+27FF, U+2906-U+2907, U+290A-U+290B, U+2940-U+2941 to Sans - (by Denis Jacquerye) -- added U+01E6-U+01E9, U+01EE-U+01EF, U+01F4-U+01F5, U+01FC-U+01FF, - U+021E-U+021F, U+0245, U+02BD, U+02C9, U+1E9B, U+2045-U+2046, U+2213, U+22C5, - U+22EF to Sans Mono (by Roozbeh Pournader) -- added U+04FA-U+04FD to Sans (by Michael Everson) -- removed U+2329 and U+232A because of their CJK properties, added U+27E8 - and U+27E9 in their stead, fixing part of bug #9038 (by Roozbeh Pournader) -- corrected and improvised U+0466-U+0469, U+046E-U+0471, U+047C-U+047D, U+0482, - U+0484-U+0486, U+0492-U+0493, U+04B0-U+04B1, U+050C-U+050D, and U+204A - in Sans (by Michael Everson) -- added instructions for U+0402, U+0409, U+040A, U+040B, U+044D, U+040F, - U+0452, U+0459-U+045B, U+045F to Sans Book (by Eugeniy Meshcheryakov) -- made italic shape for U+431, U+432, U+437, U+43B, U+43C, U+43D, U+444, U+447, - U+44D, U+44F, U+459, U+45A in SerifOblique and SerifBoldOblique - (by Andrey V. Panov) -- modified U+024C to match glyph in Unicode chart, fixing bug #9039 - (by Denis Jacquerye) -- made some canonically equivalent characters share the same glyph: - U+02B9 = U+0374, U+0343 = U+0313, and U+0387 = U+00B7 also adjusting U+02BA - to look like double U+02B9, fixing parts of bug #9038 (by Roozbeh Pournader) -- changed shapes for U+0478 and U+0479 in Sans to those in the Unicode charts, - based on a recent decision by Unicode Technical Committee to only use - the digraph form (by Michael Everson) -- adjusted width of NBSP U+00A0 and NNBSP U+202F, fixing bug #8401 - (by Denis Jacquerye) -- fixed several contours to not intersect, use horizontal or vertical tangents, - use integer coordinates, etc (by Roozbeh Pournader and Denis Jacquerye) -- added U+1402, U+1430, U+144D, U+146C, U+148A, U+14A4, U+14C1, U+14D4, U+14EE, - U+1527, U+1545, U+157E, U+158E, U+15AF to Sans (by Eugeniy Meshcheryakov) -- enlarged width of U+459 and U+45A in Serif (by Andrey V. Panov) -- made traditional shape for U+452, U+45B (by Andrey V. Panov) -- added euro sign U+20AC to Sans ExtraLight, making fontconfig recognize - the font as supporting English (by Denis Jacquerye) - -Changes from 2.11 to 2.12 - -- added U+0180 to Serif (by Denis Jacquerye) -- improved and/or hinted Armenian letters U+0542, U+0546, U+0562, - U+0563, U+0564, U+0577, U+0582 in Sans (by Ben Laenen) -- added U+4FE-U+4FF, U+512-U+513, U+2114, U+214E, U+26B2 to Sans - (by Gee Fung Sit) -- adjusted U+0496-U+0497, U+049A-U+04A1 in Sans to match U+0416, - U+041A, U+0436 and U+043A (by Gee Fung Sit) -- Mathematical Operators in Sans: changed U+22C0-U+22C1 to match - other n-ary operators, adjusted U+2203-U+2204, changed U+2220 in - Sans to match the style of U+2221 (by Gee Fung Sit) -- added U+1401, U+1403-U+1406, U+140A, U+140B, U+1426, U+142F, - U+1431-U+1434, U+1438, U+1439, U+1449, U+144A, U+144C, - U+144E-U+1451, U+1455, U+1456, U+1466, U+146B, U+146D-U+1470, - U+1472, U+1473, U+1483, U+1489, U+148B-U+148E, U+1490, U+1491, - U+14A1, U+14A3, U+14A5-U+14A8, U+14AA, U+14AB, U+14BB, U+14C0, - U+14C2-U+14C5, U+14C7, U+14C8, U+14D0, U+14D3, U+14D5-U+14D8, - U+14DA, U+14DB, U+14EA, U+14ED, U+14EF-U+14F2, U+14F4, U+14F5, - U+1405, U+1526, U+1528-U+152B, U+152D, U+152E, U+153E, - U+1542-U+1544, U+1546-U+154D, U+1550, U+1553, U+1555-U+155A, - U+1567, U+156A, U+157C, U+157F-U+1585, U+158A-U+158D, - U+158F-U+1596, U+15A0-U+15A6, U+15DE, U+15E1, U+166E-U+1676 to - Sans (by Eugeniy Meshcheryakov) -- re-enabled Latin ligatures fi, ffi, fl, ffl and ff in Sans - (by Ben Laenen) -- made italic shape for U+436, U+44A, U+44B, U+44C, U+44E, U+45F, - U+463 in SerifOblique and SerifBoldOblique (by Andrey V. Panov) -- fixed sub- and superscript metrics in Condensed Sans (bug #8848) - (by Ben Laenen) -- added U+474, U+475 in Serif (by Andrey V. Panov) -- hinted Greek glyphs U+03B7, U+30B8, U+03B9, U+03C1, U+03C3, - U+03C6 in Mono Book (by Ben Laenen) - -Changes from 2.10 to 2.11 - -- added instructions for Hebrew glyphs (Sans Book, by Eugeniy - Meshcheryakov) -- changed U+01A6 (Latin Yr) after bug #8212, in Sans, Serif and - Sans Mono fonts (by Denis Jacquerye). -- removed instruction for U+2600-U+26A1 (by Mederic Boquien) -- added U+202F and set width of U+00A0 (nobreakingspace) to the - same as U+0020, space (by Denis Jacquerye). -- added and improved instructions for various Cyrillic letters - (by Eugeniy Meshcheryakov) -- Changed U+416, U+42F, U+427 (non-Bold), U+436, U+447 (non-Bold), - U+44F, U+437 (Bold), corrected U+40F, U+414, U+424, U+426, U+429, - U+434, U+438 (Bold), U+446, U+449, U+44D (non-Bold), U+45F in - Sans Mono (by Andrey V. Panov) -- made small corrections to Cyrillic, most appreciable to U+409, - U+413, U+41B, U+427 and U+433, U+434, U+43B, U+447, U+459 - (upright fonts) to Serif (by Andrey V. Panov) -- adjusted bearings of U+410, U+416, U+41A, U+42F, U+436, U+43A, - U+443, U+44F in Serif (by Andrey V. Panov) -- enlarged width of U+44A, U+44B, U+44C, U+463 in Serif - (by Andrey V. Panov) -- added ligature "iacute" as "afii10103" (U+456) "acutecomb" in - Serif (by Andrey V. Panov) -- made italic shape to U+446, U+448, U+449 in Serif (by Andrey V. - Panov) -- added "afii10831" (U+F6C7), "afii10832" (U+F6C8) in Serif (by - Andrey V. Panov) -- new minimum version of fontforge is 20061014 (by Ben Laenen) - -Changes from 2.9 to 2.10: - -- added U+0242, U+024A-U+024B, U+024E-U+024F, U+037C-U+037D, U+0E3F, - U+1D2C-U+1D2E, U+1D30-U+1D42, U+1D5D-U+1D6A, U+1D78, U+1DB8, - U+2090-U+2094, U+20D0-U+20D1, U+2C60-U+2C66, U+2C6B-U+2C6C, U+2C74 and - U+FB29 to Sans (by Gee Fung Sit) -- added Lao glyphs : U+0E81-0E82, U+E084, U+0E87-0E88, U+0E8A, U+0E8D, - U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA-0EAB, - U+0EAD-0EB9, U+0EBB-0EBD, U+0EC0-0EC4, U+0EC6, U+0EC8-0ECD, U+0EDC-0EDD - (by Remy Oudompheng) -- fixed U+0193 not showing in Windows (bug #7897) (by Ben Laenen) -- changes to U+222B-222D in Sans Mono (by Remy Oudompheng) -- ported the three remaining currency symbols from Arev (U+20B0, - U+20B2-U+20B3), and replaced one (U+20AF) in Sans (by Lars Naesbye - Christensen) -- corrected U+20A5 in Sans (by Gee Fung Sit) -- merged Double-Struck Letters from Arev: U+2102, U+210D, U+2115, - U+2119-U+211A, U+2124, U+213C-U+2140 (by Gee Fung Sit) -- added U+2308-U+230B and U+2329-U+232A to Sans Mono and Serif faces, - fixed incorrect direction of U+2329 in Sans faces, and improved - U+2308-U+230B in Sans faces per Ben Laenen's suggestions (by David - Lawrence Ramsey) -- added U+06D5 and final form of it (needed for Kurdish) (by Ben Laenen) -- added two special glyphs U+F000 and U+F001 in Sans Book that show the - current ppem size (horizontal and vertical) (by Ben Laenen) -- added U+2318 and U+2325 to Sans Mono faces, based on the Sans versions - (by David Lawrence Ramsey) -- added U+2B14-U+2B1A to all faces except Sans ExtraLight (by David - Lawrence Ramsey) -- respaced all Geometric Shapes characters in Serif faces to match those - in Sans faces again, respaced U+23CF in Sans, Sans ExtraLight, and - Serif faces to match U+25A0 (or Sans in Sans ExtraLight's case) again, - and respaced U+2B12-U+2B13 in Sans and Serif faces to match U+25A1 - again (by David Lawrence Ramsey) -- corrected width of Modifier Small Letters U+1D43-1D5B in Sans Oblique - and U+1D9B-U+1DBF in Sans Oblique and Sans Bold Oblique (by Gee Fung Sit) -- added a bunch of glyphs to Sans ExtraLight (see SVN for details) (by - Gee Fung Sit) -- adjusted Cyrillic descenders in Sans ExtraLight to sync with Sans (by - Gee Fung Sit) -- added U+0242, U+0245 to Serif (by Gee Fung Sit) -- replaced the SHPIX routines which gave them bad spacing at certain - sizes in FreeType for A, V, Z, v and z in Sans Bold (by Ben Laenen) - -Changes from 2.8 to 2.9: - -- DejaVuSansExtraLight.sfd: changed family name from "DejaVu Sans" to - "DejaVu Sans Light" (in case we add a Light weight variant), so legacy - apps that understand only 4 styles are happy. (by Denis Jacquerye) -- added Name ID 16, aka preferred family name, and Name ID 17, aka - preferred style name, so contemporary apps that understand more that 4 - styles can use big fonts families "DejaVu Sans" and "DejaVu Serif". For - those, Extralight and Condensed are just styles not different families. - (by Denis Jacquerye) -- added U+22B6-22BD, U+22C0-22C1, U+22D6-22D7 to Sans. (by Remy Oudompheng) -- added U+037B, U+2184, U+2C67-U+2C6A and U+2C75-U+2C77 to Sans (by Gee - Fung Sit) -- adjusted asteriskmath (U+2217) for consistency with other mathematical - operators in Sans (by Ben Laenen) -- hinted some Armenian capitals in Sans Book (by Ben Laenen) -- added U+0246 - U+0249 (by Ben Laenen) -- BUGFIX : swapped U+224E and U+224F, in Sans, Sans Condensed and Sans Mono - (by Remy Oudompheng) -- adjusted U+20B5 (by Mederic Boquien) -- swapped U+21DA and U+21DB which were in wrong order (by Heikki Lindroos) -- added U+222E-2233, U+239B-23AD, U+2A00-2A02, U+2A0F-2A1C to Sans (by Remy - Oudompheng) -- added U+239B-23AD to Mono (by Remy Oudompheng) -- added U+2024-2025 to Serif (by Mederic Boquien) -- added U+222C-222D, U+2A0C-2A0E to Serif (by Remy Oudompheng) -- added U+2190-21FF to Mono (by Heikki Lindroos) -- added Hebrew glyphs - U+05B0-U+05BD, U+05BF-U+05C3, U+05C6, U+05C7, - U+05D0-U+05EA, U+05F0-U+05F2, U+FB1F, U+FB20, U+FB2A-U+FB36, - U+FB38-U+FB3C, U+FB3E, U+FB40, U+FB41, U+FB43, U+FB44, U+FB46-U+FB4E (by - Gee Fung Sit and Eugeniy Meshcheryakov) -- adjustments for Cyrillic in Sans (by Andrey V. Panov) -- made italic shape for U+0434, U+0456, U+0457 in SerifOblique and Serif - Bold Oblique (by Andrey V. Panov) - -Changes from 2.7 to 2.8: - -- fixed instructions for U+0423, U+0427, U+0447, U+0448 in Serif, so they - look good at large sizes too (by Eugeniy Meshcheryakov) -- added U+FB00 and U+FB03 to U+FB06 to Serif typefaces (by Heikki Lindroos) -- added U+26B0-U+26B1, U+2701-U+2704, U+2706-U+2709, U+270C-U+2727, U+2729 - to U+274B, U+274D, U+274F to U+2752, U+2756, U+2758-U+275E, U+2761 to - U+2775 (by Heikki Lindroos) -- added and improved instructions for Cyrillic letters in Mono and Serif - (Book, by Eugeniy Meshcheryakov) -- rotated U+26B0 (was too small in mono) (by Gee Fung Sit) -- adjusted U+1EDA-U+1EDD, U+1EE8-U+1EEB, capitals using capital specific - accent and moved diacritics to match position on U+00F2 (ograve), etc. - (by Denis Jacquerye) -- added U+20D6, U+20D7 to Sans (by Gee Fung Sit) -- made Armenian ligatures discretionary since the Firefox ligature problem - still isn't fixed (by Ben Laenen) -- moved Armenian hyphen U+058A to a higher position (bug #7436) (by Ben - Laenen) -- hinted Greek glyphs in Sans Bold (by Ben Laenen) -- enabled Arabic lam-alif ligatures when diacritics are used (by Ben Laenen) - -Changes from 2.6 to 2.7: - -- added glyphs needed for Kurdish: U+0695, U+06B5, U+06C6, U+06CE and their - init/medi/fina forms in Sans (by Ben Laenen) -- added U+02CD, U+01F8 - U+01F9, U+1E3E - U+1E3F, U+1E30 - U+1E35, U+1EBC - - U+1EBD, U+1EF8 - U+1EF9 (includes glyphs needed for Yoruba, Maori, Guarani - and Twi) (by Ben Laenen) -- added U+22C8-22CC, U+29CE-29D5, U+2A7D-2AA0, U+2AAE-2ABA, U+2AF9-2AFA to - Sans (by Remy Oudompheng) -- adjusted diacritics on Vietnamese, Pinyin and other characters: - U+01A0-U+01A1, U+01AF-U+01B0, U+01D5-U+01DC, U+01DE-01E1, U+01FA-U+01FB - U+022A-U+022D, U+0230-U+0231, U+1E14-U+1E17, U+1E4C-U+1E53, U+1E78-U+1E7B, - U+1EA4-U+1EF1 in Sans (Book, Bold and Oblique) (by Denis Jacquerye) -- added basic arrows U+2190-U+2193 in Serif, which completes MES-1 compliance - for Serif (by Ben Laenen) -- added U+01E4, U+01E5, U+01FA, U+01FB, U+02BD, U+02C9 and U+02EE to Serif - (by Ben Laenen) -- fixed U+0209 in Serif Bold Oblique (by Ben Laenen) -- adjusted Box Drawing block characters U+2500-257F in Mono to fit character - cell, shifting them up by 416 (Denis Jacquerye) -- redid U+0194 in Sans (by Ben Laenen) -- added U+2217-2218, U+2295-22A1 to Mono (by Remy Oudompheng) -- added U+0462 to Serif (by Andrey V. Panov) -- added U+226C, U+228C-228E, U+2293-2294, U+22F2-22FF to Sans (by Remy - Oudompheng) -- adjusted U+2208-220D in Sans (by Remy Oudompheng) -- improved some Cyrillic glyphs in Mono (by Andrey V. Panov), rewritten - instructions for changed glyphs (by Eugeniy Meshcheryakov) -- added U+1E0E-1E0F, U+1E8E-1E8F to Mono fonts (by Denis Jacquerye). (bug - #7166) -- renamed 'Dotabove' to 'Dotaccent' in Mono Sans Oblique to match other fonts - (by Denis Jacquerye). -- added U+200B-U+200F in Sans faces and Serif faces, U+200B and U+200C were - in Sans already (by Lars Naesbye Christensen) -- added U+2601-U+262F, U+263D, U+263E, U+2648-U+265F, U+2668, U+2670-U+268B, - U+2690-U+269C, U+26A0, U+26A1, U+2794, U+2798-U+27AF, U+27B1-U+27BE to Mono - (by Heikki Lindroos) -- replaced the references with unshifted ones for both κ U+03BA and к U+043A - in Mono Book (by Denis Jacquerye) -- fixing glyph for U+04ED in Mono Book, consisted only of dieresis (by Andrey - V. Panov). - -Changes from 2.5 to 2.6: - -- redid U+2032 - U+2037, U+2057 based on Arev in Sans (by Gee Fung Sit) -- added U+0195, corrected U+039E, U+204B in Sans ExtraLight (by Gee Fung Sit) -- added instructions for some Cyrillic letters in Sans Bold (by Eugeniy - Meshcheryakov) -- added vulgar fractions U+2153-U+215F for Serif, made with references (by - Lars Naesbye Christensen) -- added U+228F-2292, U+2299-22AF, U+22B2-22B5, U+22CD, U+22D8-22ED to Sans - (by Remy Oudompheng) -- added U+2208-220D, U+2238-223D, U+2278-2281, U+228A-228B, U+228F-2292, - U+22CD, U+22DA-22E9 to Mono (by Remy Oudompheng) -- fixed misplaced dot in U+2250 in Mono (by Remy Oudompheng) -- added instructions for some Cyrillic letters in Mono Book and Bold(by - Eugeniy Meshcheryakov) -- minor changes to U+2241, U+2261-2263, U+22A4, U+22A5 in Sans (by Remy - Oudompheng) -- added hinting instructions to lowercase Armenian glyphs in Sans Book (by - Ben Laenen) -- changed U+2208, U+220B to match U+2209 and U+220C in Sans Bold (by Remy - Oudompheng) -- added Braille patterns U+2800-U+28FF to Sans (by Mederic Boquien) -- added instructions for some Cyrillic letters in Serif Book (by Eugeniy - Meshcheryakov) -- renamed BoldOblique fonts to Bold Oblique in TTF Name as originally in - Bitstream Vera fonts (by Denis Jacquerye) -- added hinting instructions to some Latin-B Extended and IPA characters in - Sans Book (by Denis Jacquerye and Ben Laenen) -- adjusted bearings, replaced diacritics, hinted hook and horn for - Vietnamese in Sans Book (by Denis Jacquerye) -- made FAX, TM, TEL, etc. discritionary ligatures in Sans and Serif fonts - (by Denis Jacquerye) -- removed ligatures of precomposed characters in Sans and Serif fonts (by - Denis Jacquerye) -- added U+F208, U+F20A, U+F215-F217, U+F21A-F21B, U+F25F in PUA (from SIL's - PUA, probably in Unicode 5.0): U+0243, U+0244, U+0245, U+024C, U+024D, - U+2C64, (U+2C6D), (U+2C71) -- modified some glyphs in Serif Oblique to make them more italic (by Denis - Jacquerye) - -Changes from 2.4 to 2.5: - -- fixed excessive kerning bug that occurs with Pango (by Denis Jacquerye) -- added U+20AF to Sans and Serif (by Lars Naesbye Christensen) -- regenerated Condensed faces (by Ben Laenen) -- added U+035C-U+035D to Sans, fixed U+0361 (by Denis Jacquerye) -- integrated 255 characters from Arev fonts: Latin Extended-B, Spacing - Modifiers, Combining Diacritical Marks, Cyrillic, Cyrillic supplement, - General Punctuation, Letterlike Symbols, Arrows, Mathematical Operators, - Miscellaneous Technical, Dingbats, Alphabetic Presentation Forms (by Denis - Jacquerye) -- added basic Cyrillic and basic Greek to Sans ExtraLight (by Denis Jacquerye) -- added U+0498, U+049A, U+04AA, U+04AB, U+04AF to Serif (by Eugeniy - Meshcheryakov) -- added U+0494, U+0495, U+0498, U+0499, U+04AA, U+04AB, U+04C3, U+04C4, - U+04C7, U+04C8 to Mono (by Eugeniy Meshcheryakov) -- adjusted weight of U+0256, U+0257, U+0260, U+0272, U+0273, U+0277, U+029B, - U+02A0 and modifed U+028B and U+027A in Mono (by Denis Jacquerye) -- added U+2000-200A to Mono (by Denis Jacquerye) -- added vulgar fractions U+2153 - U+215F to Mono (by Gee Fung Sit) -- adapted metrics of Arabic glyphs so they stay above cut-off height in Sans - (by Ben Laenen) -- fixed mkmk anchors for Arabic diacritics so they stack properly in Sans (by - Ben Laenen) -- fixed weight of lowercase upsilon in Sans Bold, make small adjustment to - lowercase omega in Sans (by Ben Laenen) -- added U+210E (by Mederic Boquien) -- unslanted U+2201, U+221B and U+221C in Sans Oblique (by Mederic Boquien) -- added several mathematical relation symbols to Sans and Mono (U+2241-224C, - U+2250-2255, U+2260-2269, U+226E-2277, U+2282-2287) modified U+223C to match - other tildes, and U+2282-2284 to have the same shape. (by Remy Oudompheng) -- made U+2234-U+2237 refer to U+2219 instead of U+00B7 in Sans (by Mederic - Boquien) -- added U+2238-223B, U+226A-226B, U+2278-2281, U+2288-228B to Sans (by Remy - Oudompheng) -- unslanted and changed reference of U+22C5 from U+00B7 to U+2219 in Sans (by - Mederic Boquien) -- added U+224D-225F, U+226D, U+22C6 to Sans and unslanted U+2219 in Sans - Oblique. (by Remy Oudompheng) -- added U+224D-225F, U+226D to Mono, shifted U+2266-2269 higher upwards and - unslanted U+2219 in Oblique. (by Remy Oudompheng) -- merged Coptic glyphs from Arev 0.2 (by Lars Naesbye Christensen) -- fixed and adjusted various Cyrillic glyphs in Serif (by Andrey V. Panov) -- made fi, fl... ligatures discretionary ligatures (by Ben Laenen) - -Changes from 2.3 to 2.4: - -- added U+04A2, U+04A3, U+04AC - U+04AF, U+04BA, U+04BB, U+04C0 - - U+04C2, U+04CB, U+04CD, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04E8 - U+04F5, - U+04F6 - U+04F9 to Mono (by Eugeniy Meshcheryakov) -- added U+048C, U+048D, U+0494, U+0495, U+049E - U+04A7, U+04AC - - U+04AE, U+04B4- U+04B7, U+04BA, U+04BB, U+04C0 - U+04C4, U+04C7, U+04C8, - U+04CB, U+04CC, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04EC - U+04F9 to Serif - (by Eugeniy Meshcheryakov) -- added U+2134 to Sans (by Gee Fung Sit) -- added U+2080 - U+2089 to all faces (by Gee Fung Sit) -- several minor corrections to Sans (by Gee Fung Sit) -- major corrections to Sans Condensed (by Gee Fung Sit) -- corrected Superscripts and Subscripts in Sans (by Gee Fung Sit) -- corrected anchors of U+0316-U+0319 (by Denis Jacquerye) -- Verajja integrated (by Stepan Roh) -- copied U+2328, U+2600, U+2639-U+263C, U+263F-U+2647, U+2660-U+2667, - and U+2669-U+266F from Sans to Serif, and copied scaled-down versions of - them to Sans Mono (by David Lawrence Ramsey) -- added U+20B4 to all faces (by Eugeniy Meshcheryakov) -- added more minor positional adjustments to U+2638 in all faces to - match the other miscellaneous symbols in Verajja, and rescale it in Sans - Mono so that it looks better (by David Lawrence Ramsey) -- added U+2242, U+2243 and U+22A4 (by Mederic Boquien) -- corrected U+2245 in Sans (by Mederic Boquien) -- added U+0221, U+0234-0236 (by Denis Jacquerye) -- added in Arabic block to Sans: U+060C, U+0615, U+061B, U+061F, U+0621 -- U+063A, U+0640 - U+0655, U+0660 - U+066F, U+0679 - U+0687, U+0698, U+06A1, - U+06A9, U+06AF, U+06BA, U+06BF, U+06CC, U+06F0 - U+06F9 (by Ben Laenen) -- added in Arabic Presentation Forms A to Sans: U+FB52 - U+FB81, U+FB8A -- U+FB95, U+FB9E - U+FB9F, U+FBE8 - U+FBE9, U+FBFC - U+FBFF (by Ben Laenen) -- added complete Arabic Presentation Forms B to Sans: U+FE70 - U+FE74, - U+FE76 - U+FEFC, U+FEFF (by Ben Laenen) -- added complete Greek Extended block to Mono (by Ben Laenen) -- modified Greek capitals with tonos in Mono (by Ben Laenen) -- added U+01C4-01CC, U+01D5, U+01DE, U+01E0-U+01E1, U+01E6-U+01E9, - U+01EE-U+01F5, U+01F8-U+0217, U+021E-U+021F, U+0226-U+022A, U+022C to Serif - (by Denis Jacquerye) -- adjusted U+043B and U+044F in Serif (by Denis Jacquerye) -- added U+2000-U+200A (by Denis Jacquerye) -- added U+1E00-U+1E0B, U+1E0E-U+1E11, U+1E14-U+1E1C, U+1E1E-U+1E23, - U+1E26-U+1E2D, U+1E30-U+1E35, U+1E3A-U+1E3B, U+1E3E-U+1E40, U+1E48-U+1E49, - U+1E50-U+1E56, U+1E58-U+1E59, U+1E5E-U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, - U+1E72-U+1E7D, U+1E86-U+1E9B, U+1EA0-U+1EA3, U+1EAC-U+1EB7, U+1EBA-U+1EBD, - U+1EC6-U+1ECF, U+1ED8-U+1ED9, U+1EE6-U+1EE7, U+1EF4-U+1EF9 to Serif (by - Denis Jacquerye) -- added U+048E, U+048F, U+049C-U+049F, U+04B8, U+04B9, U+04BC-U+04BF, - U+04C3, U+04C4 to Sans (by Eugeniy Meshcheryakov) -- added DejaVu Sans Extra Light (by Denis Jacquerye) -- Adjusted underline position for (hopefully) improved legibility in - Sans, Serif, Mono (Tim May) -- added auto-generated DejaVu LGC (by Stepan Roh) - -Changes from 2.2 to 2.3: - -- fixed bug U+042B and U+044B behave badly in Sans Bold or Oblique (by - Keenan Pepper) -- added and improved TrueType instructions and related settings (by - Keenan Pepper) -- added U+04D0-U+04D7, U+04E6, U+04E7 to Mono (by Eugeniy Meshcheryakov) -- added U+048A - U+048D, U+0498, U+0499, U+04AA, U+04AB, U+04B0, U+04B1, - U+04C0, U+04C9, U+04CA, U+04CE, U+04CD, U+04DA, U+04DB, U+04DE, U+04DF, - U+04E2 - U+04E5, U+04EC - U+04F8, U+04F9 to Sans (by Eugeniy Meshcheryakov) -- added U+04E0, U+04E1 to all faces (by Eugeniy Meshcheryakov) -- added Greek Extended to Sans and Serif: U+1F00-U+1F15, U+1F18-U+1F1D, - U+1F20-U+1F45, U+1F48-U+1F4D, U+1F50-U+1F57, U+1F59, U+1F5B, U+1F5D, - U+1F5F-U+1F7D, U+1F80-U+1FB4, U+1FB6-U+1FC4, U+1FC6-U+1FD3, U+1FD6-U+1FDB, - U+1FDD-U+1FEF, U+1FF2-U+1FF4, U+1FF6-U+1FFE (by Ben Laenen) -- added Greek variant letterforms, archaic letters and symbols to Mono: - U+03D0-U+03E1, U+03F0-U+03FF (by Ben Laenen) -- added Armenian block and Armenian ligatures to Sans (U+0531 - U+0556, - U+0559 - U+055F, U+0561 - U+0587, U+0589 - U+058A, U+FB13 - U+FB17) (by Ben - Laenen) -- redid some Greek characters in Sans and Mono to make them look better - and to correct some errors (by Ben Laenen) -- added U+27E0 to all faces (by David Lawrence Ramsey) -- added underscore (U+005F) consistency fixes: extended the Sans Mono - and Sans Mono Oblique underscores to touch both horizontal edges, and - reduced the height of the Sans Bold Oblique underscore to match the Sans - Bold underscore (by David Lawrence Ramsey) -- added underscore (U+005F) derivatives and consistency fixes for them: - made U+0332 a reference to underscore at Denis Jacquerye's suggestion; made - U+0333 two references to underscore; made U+033F two references to U+203E; - added U+2017 as two references to underscore, and made U+0333 a reference to - it; and added U+203E as a reference to underscore, and made U+0305 a - reference to it (by David Lawrence Ramsey) -- added U+201B, U+2220, U+2320-U+2321, U+23AE, U+23CF, all remaining - Geometric Shapes glyphs (U+25A0-U+25C9, U+25CB-U+25D7, U+25D9-U+25E5, - U+25E7-U+25FF), and U+2B12-U+2B13 to all faces (by David Lawrence Ramsey) -- added minor positional adjustments to U+2638 in all faces (by David - Lawrence Ramsey) -- added U+201F to Sans Mono and Serif faces (by David Lawrence Ramsey) -- added U+01B7, U+01F6, U+0464 - U+0465, U+2160 - U+2180, U+2183, - U+220A, U+220D, U+2329, U+232A, U+2422, U+27E8 - U+27EB, U+2680 - U+2685 to - Sans (by Gee Fung Sit ???) -- added U+2116 to Sans and Serif (by Gee Fung Sit) -- changed florin sign U+0192 in Sans (by Gee Fung Sit) -- added anchor points to some glyphs (by Denis Jacquerye) -- adjusted height of IPA superscripts U+02B0-02B8, U+02C0-02C1, - U+02E0-02E4, U+207F to match with height of U+00B2 (by Denis Jacquerye) -- added U+0184-U+0185, U+019C, U+019F, U+01A0-U+01A3, U+01A6, U+01AA, - U+01AF-U+01B0, U+01B2-U+01B4, U+01B7-U+01B8, U+01BC-U+01BC, U+0224-U+0225, - U+023A-U+0240, U+1D16-U+1D17, U+1D1D-U+1D1E, U+1D43-U+1D5B, U+1D7B, - U+1D85,U+1D9B-1DB7, U+1DB9-U+1DBF, U+20A6 to all fonts (by Denis Jacquerye) -- added added U+0182, U+018B, U+018E, U+01A0-U+01A1, U+01B1, U+01B9, - U+01C0-U+01C3, U+0238-U+0239, U+1D02, U+1D08-U+1D09, U+1D14, U+1D1F, U+1D77 - to Serif and Mono (by Denis Jacquerye) -- added U+0181, U+0183, U+0187-U+0188, U+018A-U+018F, U+0191, U+0193, - U+0195-U+019B, U+019D-U+019E, U+01A4-U+01A5, U+01AC-U+01AE, U+01B5-U+01B6, - U+01B9, U+01BB, U+01F6 to Serif (by Denis Jacquerye) -- added U+0181, U+0187-U+0188, U+018A, U+018D, U+018F, U+0191, U+0193, - U+0195-U+019F, U+01A4-01A5, U+01AC-01AD, U+01B5-U+01B6, U+1BB, U+01F6, - U+01D7-U+01DC, U+0238-U+0239, U+0241 to Mono (by Denis Jacquerye) -- added to Mono and Serif (by Denis Jacquerye) - -Changes from 2.1 to 2.2: - -- reworked the vertical orientation of the Blocks Elements characters - in all faces to remove their overly large descenders, in order to fix - problems with e.g. terminal emulators (by David Lawrence Ramsey) -- copied bullet in Sans faces to Serif faces for consistency (by David - Lawrence Ramsey) -- added U+2023, U+25D8, U+25E6, and U+29EB to all faces (by David - Lawrence Ramsey) -- added U+1EB8, U+1EB9, U+1ECA - U+1ECD, U+1EE4, U+1EE5 (by Tim May) -- added U+01DD, U+02BE, U+02BF, U+02D3 to all, changed U+02D2 in - non-Condensed and U+1EE5 in Serif (by Tim May) -- fixed U+01CE, replacing wrong circumflex by caron (by Denis Jacquerye) -- added anchor points to some glyphs (by Denis Jacquerye) -- added U+20B5 (by Denis Jacquerye) -- added U+0181 - U+0183, U+0187, U+0188, U+018A - U+018D, U+0191, - U+0193, U+0195 - U+019B, U+019D, U+019E, U+01A4, U+01A7 - U+01A9, U+01AB - - U+01AE, U+01B1, U+01B5, U+01B6, U+01BB, U+01C0 - U+01C3, U+01F1 - U+01F3, - U+0238, U+0239, U+1D02, U+1D08, U+1D09, U+1D14, U+1D1F, U+1D77, U+2103, - U+2126, U+2127, U+212A, U+212B, U+2132, U+214B, U+2210, U+2217, U+2218, - U+2A0C - U+2A0E, U+FB00, U+FB03 and U+FB04 to Sans (by Gee Fung Sit) -- added U+01A9, U+01C3 and U+2126 to Mono and Serif (by Gee Fung Sit) -- adjusted bearings of U+028B in Sans (by Gee Fung Sit) -- added U+018F, U+0494-U+0497, U+04A0-U+04A7, U+04AC-U+04AF, - U+04B4-U+04B7, U+04BA-U+04BB, U+04C1-U+04C2, U+04C5-U+04C8, U+04CB-U+04CC, - U+04D0-U+04D9, U+04DC-U+04DD, U+04E6-U+04EB to Sans (by Eugeniy - Meshcheryakov) -- replaced with references U+0391-U+0393, U+0395-U+0397, U+0399, U+039A, - U+039C, U+039D, U+039F-U+03A1, U+03A4, U+03A5, U+03A7, U+03BF, U+03DC, - U+0405, U+0406, U+0408, U+0410, U+0412, U+0415, U+0417, U+041A, - U+041C-U+041E, U+0420-U+0422, U+0425, U+0430, U+0435, U+043E, U+0440, - U+0441, U+0443, U+0445, U+0455-U+0458 in Serif and Mono (by Eugeniy - Meshcheryakov) -- added U+04D0-U+04D7, U+04E6-U+04EB to Serif (by Eugeniy Meshcheryakov) -- added U+212A and U+212B to the rest of the faces (by Lars Naesbye - Christensen) -- added U+2318 and U+2325 to Sans and Serif (by Lars Naesbye Christensen) -- added and improved TrueType instructions and related settings (by - Keenan Pepper) -- completed basic Greek alphabet: added U+0374-U+0375, U+037A, U+037E, - U+0384-U+038A, U+038C, U+038E-U+0390, U+03AC-U+03BF, U+03C1-U+03CE (by Ben - Laenen) -- added U+2070 and U+2074-U+2079 (by Mederic Boquien) - -Changes from 2.0 to 2.1: - -*** Be aware that names of some TTF files changed since version 2.0. *** - -- added U+0323, U+1E0C, U+1E0D, U+1E24, U+1E25, U+1E36 - U+1E39, U+1E42, - U+1E43, U+1E46, U+1E47, U+1E5A - U+1E5D, U+1E62, U+1E63, U+1E6C, U+1E6D, - U+1E7E, U+1E7F (by Tim May) -- fixed bug where GNOME applications used Mono Bold Oblique instead of - Mono Oblique (by Keenan Pepper) -- added and improved TrueType instructions and related settings (by - Keenan Pepper) -- added U+1E41, U+1E57, U+1E61 (by Sander Vesik) -- added U+0189, U+0309, U+0313, U+0314, U+031A, U+031B, U+0327, U+0328, - U+032B, U+0333, U+033C (by Denis Jacquerye) -- adjusted and fixed U+0186, U+0254, U+0291, U+0316 - U+0319, U+031C - - U+0320, U+0323 - U+0326, U+0329 - U+032A, U+032C - U+0332, U+0339 - U+033B, - U+033E, U+033F (by Denis Jacquerye) -- fixed U+1E12, U+1E3C, U+1E4A, U+1E70 to have normal below diacritics - (by Denis Jacquerye) -- fixed U+1E82, U+1E84 and U+1EF2 to have uppercase above diacritics (by - Denis Jacquerye) -- added anchor points to some glyphs (by Denis Jacquerye) -- dropped "-Roman" from font names - affects both internal TTF names and - names of generated files (by Stepan Roh) -- attempt to fix bug Vertical spacing too big for Mono by exchanging - LineGap and OS2TypoLinegap values (proofed by Stefan Rank) -- added Greek capitals U+0391 - U+03A1, U+03A3 - U+03A9, U+03AA, U+03AB - in Mono (by Ben Laenen) -- added the per ten thousand sign U+2031 (by Mederic Boquien) -- added U+2207, U+221D, U+221F, U+2227 - U+222A, and U+2261 (by David - Lawrence Ramsey) -- new logo (by Gee Fung Sit) -- added U+0180, U+018E, U+201F, U+2024, U+2025, U+203D, U+2200, U+2203, - U+2213, U+222C, U+222D, U+2263 to Sans (by Gee Fung Sit) - -Changes from 1.15 to 2.0: - -- "Italized" basic glyphs in all Serif Oblique and their Condensed faces - (by David Jez) -- added and improved TrueType instructions and related settings (by Keenan - Pepper) -- added anchor points to some glyphs (by Denis Jacquerye) -- many new spacing and combining accents (by Denis Jacquerye) -- smart substitutions for transforming i and j to dottless form and for - using uppercase diacritics (by Denis Jacquerye) -- fixed remaining erroneously slanted characters in Serif Oblique faces (by - David Lawrence Ramsey) -- copied bullet in Sans faces to Sans Oblique faces for consistency (by - David Lawrence Ramsey) -- added U+203C and U+2047-U+2049 (by David Lawrence Ramsey) -- added Greek glyphs to Serif (by Ben Laenen, Condensed merge by David Jez) -- fixed bug LTR glyphs behaving like RTL (by Ben Laenen) -- fixed wrong glyph directions (by David Jez) -- fixed repositioned accents in Condensed faces (by David Jez) - -Changes from 1.14 to 1.15: - -- added and improved TrueType instructions and related settings (by Keenan - Pepper) -- fixed U+2302, U+2319 (by David Lawrence Ramsey) -- fixed yet another monospace bug (by Stepan Roh) -- fixed potential "too big ascender/descender" bug (by Stepan Roh) -- fixed U+026E and U+028E (by Denis Jacquerye) -- added U+0186, U+0190, U+0300 - U+0304, U+0306 - U+0308, U+030A - U+030C, - U+0321, U+0322 (by Denis Jacquerye) -- added rest of Block Elements: U+2591 - U+2593 (by David Lawrence Ramsey) -- added U+2311, U+237D and U+2638 (by David Lawrence Ramsey) -- added U+01CD - U+01D4 (by Denis Jacquerye) -- fixed accents of U+00F2 - U+00F6 by replacing them with references in Mono - Bold (by David Jez) -- added U+0490, U+0491 (by Eugeniy Meshcheryakov) -- added hints to U+0404 and U+0454 in Sans (by Eugeniy Meshcheryakov) -- completed Greek glyphs from U+0370 to U+03CF in Serif (by Ben Laenen) -- fixed shape of U+0255 in Sans Bold and Sans Bold Oblique (by Denis - Jacquerye) - -Changes from 1.13 to 1.14: - -- fixed bug where Mono faces were not recognized as fixed pitch in Windows - by correcting Venda glyphs (by David Jez) -- added and improved TrueType instructions (by Keenan Pepper) -- added 6 Uzbekian glyphs (by Mashrab Kuvatov) -- added Greek glyphs to Sans and Serif, changed pi and omega to fit in (by - Ben Laenen) -- added IPA and related superscript glyphs (by Denis Jacquerye) -- fixed buggy Venda glyphs (by David Lawrence Ramsey and Stepan Roh) -- added U+2302, U+2310, U+2319 (by David Lawrence Ramsey) -- fixed slanted U+00AC in Serif Oblique faces (by David Lawrence Ramsey) -- added 29 glyphs from Block Elements (by David Lawrence Ramsey) - -Changes from 1.12 to 1.13: - -- removed all stems (PS hints) (requested by David Jez) -- added U+01D6, U+01DF, U+022B, U+022D and U+0231 (by Sander Vesik) -- added 10 Venda glyphs (by Dwayne Bailey) -- fixed bug when fonts had no name on Microsoft Windows (by Stepan Roh) -- updated 'missing' glyph U+FFFD (by David Jez) -- set TTF flag fsType to 'Installable Embedding' (= unrestricted usage) - (idea by C. Tiffany) - -Changes from 1.11 to 1.12: - -- added long s (by James Cloos) -- prettier comma accent in gcommaaccent (by David Jez) -- added Hbar, hbar, kgreenlandic, napostrophe, Eng, eng, Tbar, tbar, - afii57929 (by David Jez) -- changed Iogonek, iogonek, IJ, ij to look better (by David Jez) -- glyph uni0237 renamed to dotlessj (requested by David Jez) -- fixed accents for dcaron, lcaron, tcaron, Uogonek, uogonek in Serif (by - David Jez) -- added U+2500 - U+257F box drawing glyphs to Sans Mono (by David Jez) -- fixed accents in Wcircumflex, Ycircumflex and Zdotaccent (by David Jez) -- extra kerning for F (by Sander Vesik) -- added 'missing' glyph U+FFFD (by David Jez) - -Changes from 1.10 to 1.11: - -- kerning updates (by Sander Vesik) -- added Iogonek, iogonek, IJ, ij, Uogonek, uogonek (from SuSE standard fonts - by Adrian Schroeter, SuSE AG) -- added Gcommaaccent, gcommaaccent, Kcommaaccent, kcommaaccent, - Lcommaaccent, lcommaaccent, Ncommaaccent, ncommaaccent, Rcommaaccent, - rcommaaccent (by Stepan Roh) - -Changes from 1.9 to 1.10: - -- added U+022E, U+022F (by Sander Vesik) -- kerning updates for DejaVu Sans (by Sander Vesik) -- fixed too wide cyrillic glyphs in DejaVu Sans Mono (by Valentin Stoykov) -- fixed ligatures bug in Mono (by Stepan Roh) - -Changes from 1.8 to 1.9: - -- integrated Arev Cyrillics (by Danilo Segan) -- added U+01EA, U+01EB, U+01EC, U+01ED (by Sander Vesik) - -Changes from 1.7 to 1.8: - -- fixed accents in Serif Oblique and Serif Bold Oblique (by Stepan Roh) - -Changes from 1.6 to 1.7: - -- added automatically generated Condensed typefaces (by Stepan Roh) - -Changes from 1.5 to 1.6: - -- monospace bug fixed (by Stepan Roh) -- incorrect Bitstream foundry assigned by fontconfig and KDE Font Installer -fixed (by Stepan Roh) -- added automatically generated Oblique version of Serif typefaces (by -Stepan Roh) -- corrected cyrillic D and d (by Danilo Segan and David Jez) -- fixed accents position in Oblique version of Serif typefaces (by Danilo -Segan and Sander Vesik) -- fixed incorrect computation of OS2Win* fields (by Stepan Roh) -- added visiblespace U+2423 (by David Jez) -- fixed 'line height' bug by fixing ascender and descender values (by David -Jez and Stepan Roh) -- fixed part of 'worse than Vera' bug (by Peter Cernak) -- smaller comma accent U+0326 (by David Jez) - -Changes from 1.4 to 1.5: - -- added Cyrillics (96 characters) and Dcroat to the rest of typefaces (by -Danilo Segan) -- fixed bugs in some Cyrillic characters, some of them reported by Sander -Vesik (by Danilo Segan) -- added U+0100, U+0101, U+0112, U+0113, U+012A, U+012B, U+014C, U+014D, -U+016A, U+016B, U+01E2, U+01E3, U+0232 and U+0233 (by Sander Vesik) -- added Romanian characters (by Misu Moldovan) -- added U+0108, U+0109, U+010A, U+010B, U+0114, U+0115, U+0116, U+0117, -U+011C, U+011D, U+0120, U+0121, U+0124, U+0125, U+0128, U+0129, U+012C, -U+012D, U+0134, U+0135, U+014E, U+014F, U+0150, U+0151, U+015C, U+015D, -U+0168, U+0169, U+016C, U+016D, U+0170, U+0171 and U+0237 (by James -Crippen) -- added U+02BB, U+2010, U+2011, U+2012 and U+2015 (by Stepan Roh) - -Changes from 1.3 to 1.4: - -- added Polish characters (Aogonek, aogonek, Eogonek, eogonek, Nacute, -nacute, Sacute, sacute, Zacute, zacute, Zdotaccent, zdotaccent) (by Stepan -Roh) - -Changes from 1.2 to 1.3: - -- added Cyrillics (96 characters) and Dcroat to Sans typefaces (by Danilo -Segan from his BePa fonts) - -Changes from 1.1 to 1.2: - -- added Ldot, ldot, Wcircumflex, wcircumflex, Ycircumflex, ycircumflex, - Wgrave, wgrave, Wacute, wacute, Wdieresis, wdieresis, Ygrave and ygrave - (from The Olwen Font Family 0.2 by Dafydd Harries) - -Changes from 1.0 to 1.1: - -- added Lacute, lacute, Lcaron, lcaron, Racute and racute (by Peter Cernak) - -Changes from 0.9.4 to 1.0: - -- none, just changed version and updated README - -Changes from 0.9.3 to 0.9.4: - -- fixed TTF generation (kerning tables were missing) - -Changes from 0.9.2 to 0.9.3: - -- kerning of added characters -- proper caron shape for dcaron in Mono (by Ondrej Koala Vacha) -- minor visual changes - -Changes from 0.9.1 to 0.9.2: - -- internal bugged version - -Changes from 0.9 to 0.9.1: - -- proper caron shape for dcaron and tcaron -- minor visual changes - -$Id: NEWS 2359 2009-08-27 14:13:16Z ben_laenen $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/README b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/README deleted file mode 100644 index 0bcc3aa3..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/README +++ /dev/null @@ -1,59 +0,0 @@ -DejaVu fonts 2.30 (c)2004-2009 DejaVu fonts team ------------------------------------------------- - -The DejaVu fonts are a font family based on the Bitstream Vera Fonts -(http://gnome.org/fonts/). Its purpose is to provide a wider range of -characters (see status.txt for more information) while maintaining the -original look and feel. - -DejaVu fonts are based on Bitstream Vera fonts version 1.10. - -Available fonts (Sans = sans serif, Mono = monospaced): - -DejaVu Sans Mono -DejaVu Sans Mono Bold -DejaVu Sans Mono Bold Oblique -DejaVu Sans Mono Oblique -DejaVu Sans -DejaVu Sans Bold -DejaVu Sans Bold Oblique -DejaVu Sans Oblique -DejaVu Sans ExtraLight (experimental) -DejaVu Serif -DejaVu Serif Bold -DejaVu Serif Bold Italic (experimental) -DejaVu Serif Italic (experimental) -DejaVu Sans Condensed (experimental) -DejaVu Sans Condensed Bold (experimental) -DejaVu Sans Condensed Bold Oblique (experimental) -DejaVu Sans Condensed Oblique (experimental) -DejaVu Serif Condensed (experimental) -DejaVu Serif Condensed Bold (experimental) -DejaVu Serif Condensed Bold Italic (experimental) -DejaVu Serif Condensed Italic (experimental) - -All fonts are also available as derivative called DejaVu LGC with support -only for Latin, Greek and Cyrillic scripts. - -For license information see LICENSE. What's new is described in NEWS. Known -bugs are in BUGS. All authors are mentioned in AUTHORS. - -Fonts are published in source form as SFD files (Spline Font Database from -FontForge - http://fontforge.sf.net/) and in compiled form as TTF files -(TrueType fonts). - -For more information go to http://dejavu.sourceforge.net/. - -Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah: ---------------------------- -U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223, -U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5, -U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362, -U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9, -U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F, -U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135, -U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704, -U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794, -U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06 - -$Id: README 2359 2009-08-27 14:13:16Z ben_laenen $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/langcover.txt b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/langcover.txt deleted file mode 100644 index 8289ef48..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/langcover.txt +++ /dev/null @@ -1,242 +0,0 @@ -This is the language coverage file for DejaVu fonts -($Id$) - - Sans Serif Sans Mono -aa Afar 100% (62/62) 100% (62/62) 100% (62/62) -ab Abkhazia 100% (90/90) 93% (84/90) 84% (76/90) -af Afrikaans 100% (69/69) 100% (69/69) 100% (69/69) -ak Akan 100% (73/73) 100% (73/73) 100% (73/73) -am Amharic (0/264) (0/264) (0/264) -an Aragonese 100% (66/66) 100% (66/66) 100% (66/66) -ar Arabic 100% (125/125) (0/125) 100% (125/125) -as Assamese (0/64) (0/64) (0/64) -ast Asturian/Bable/Leonese/Asturleonese 100% (66/66) 100% (66/66) 100% (66/66) -av Avaric 100% (67/67) 100% (67/67) 100% (67/67) -ay Aymara 100% (60/60) 100% (60/60) 100% (60/60) -az-az Azerbaijani in Azerbaijan 100% (66/66) 100% (66/66) 100% (66/66) -az-ir Azerbaijani in Iran 100% (130/130) (0/130) 100% (130/130) -ba Bashkir 100% (82/82) 100% (82/82) 97% (80/82) -be Byelorussian 100% (68/68) 100% (68/68) 100% (68/68) -ber-dz Berber in Algeria 100% (70/70) 100% (70/70) 100% (70/70) -ber-ma Berber in Morocco 100% (32/32) (0/32) (0/32) -bg Bulgarian 100% (60/60) 100% (60/60) 100% (60/60) -bh Bihari (Devanagari script) (0/68) (0/68) (0/68) -bho Bhojpuri (Devanagari script) (0/68) (0/68) (0/68) -bi Bislama 100% (58/58) 100% (58/58) 100% (58/58) -bin Edo or Bini 100% (78/78) 100% (78/78) 100% (78/78) -bm Bambara 100% (60/60) 100% (60/60) 100% (60/60) -bn Bengali (0/63) (0/63) (0/63) -bo Tibetan (0/95) (0/95) (0/95) -br Breton 100% (64/64) 100% (64/64) 100% (64/64) -bs Bosnian 100% (62/62) 100% (62/62) 100% (62/62) -bua Buriat (Buryat) 100% (70/70) 100% (70/70) 100% (70/70) -byn Blin/Bilin (0/255) (0/255) (0/255) -ca Catalan 100% (74/74) 100% (74/74) 100% (74/74) -ce Chechen 100% (67/67) 100% (67/67) 100% (67/67) -ch Chamorro 100% (58/58) 100% (58/58) 100% (58/58) -chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 97% (74/76) -chr Cherokee (0/85) (0/85) (0/85) -co Corsican 100% (84/84) 100% (84/84) 100% (84/84) -crh Crimean Tatar/Crimean Turkish 100% (68/68) 100% (68/68) 100% (68/68) -cs Czech 100% (82/82) 100% (82/82) 100% (82/82) -csb Kashubian 100% (74/74) 100% (74/74) 100% (74/74) -cu Old Church Slavonic 100% (103/103) 86% (89/103) 78% (81/103) -cv Chuvash 100% (74/74) 100% (74/74) 100% (74/74) -cy Welsh 100% (78/78) 100% (78/78) 100% (78/78) -da Danish 100% (70/70) 100% (70/70) 100% (70/70) -de German 100% (59/59) 100% (59/59) 100% (59/59) -dv Divehi/Dhivehi/Maldivian (0/49) (0/49) (0/49) -dz Dzongkha (0/95) (0/95) (0/95) -ee Ewe 100% (99/99) 100% (99/99) 100% (99/99) -el Greek 100% (69/69) 100% (69/69) 100% (69/69) -en English 100% (72/72) 100% (72/72) 100% (72/72) -eo Esperanto 100% (64/64) 100% (64/64) 100% (64/64) -es Spanish 100% (66/66) 100% (66/66) 100% (66/66) -et Estonian 100% (64/64) 100% (64/64) 100% (64/64) -eu Basque 100% (56/56) 100% (56/56) 100% (56/56) -fa Persian 100% (129/129) (0/129) 100% (129/129) -fat Fanti 100% (73/73) 100% (73/73) 100% (73/73) -ff Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62) -fi Finnish 100% (62/62) 100% (62/62) 100% (62/62) -fil Filipino 100% (84/84) 100% (84/84) 100% (84/84) -fj Fijian 100% (52/52) 100% (52/52) 100% (52/52) -fo Faroese 100% (68/68) 100% (68/68) 100% (68/68) -fr French 100% (84/84) 100% (84/84) 100% (84/84) -fur Friulian 100% (66/66) 100% (66/66) 100% (66/66) -fy Frisian 100% (75/75) 100% (75/75) 100% (75/75) -ga Irish 100% (80/80) 100% (80/80) 100% (80/80) -gd Scots Gaelic 100% (70/70) 100% (70/70) 100% (70/70) -gez Ethiopic (Geez) (0/218) (0/218) (0/218) -gl Galician 100% (66/66) 100% (66/66) 100% (66/66) -gn Guarani 100% (70/70) 100% (70/70) 100% (70/70) -gu Gujarati (0/68) (0/68) (0/68) -gv Manx Gaelic 100% (54/54) 100% (54/54) 100% (54/54) -ha Hausa 100% (60/60) 100% (60/60) 100% (60/60) -haw Hawaiian 100% (63/63) 100% (63/63) 100% (63/63) -he Hebrew 100% (27/27) (0/27) (0/27) -hi Hindi (Devanagari script) (0/68) (0/68) (0/68) -hne Chhattisgarhi (0/68) (0/68) (0/68) -ho Hiri Motu 100% (52/52) 100% (52/52) 100% (52/52) -hr Croatian 100% (62/62) 100% (62/62) 100% (62/62) -hsb Upper Sorbian 100% (72/72) 100% (72/72) 100% (72/72) -ht Haitian/Haitian Creole 100% (56/56) 100% (56/56) 100% (56/56) -hu Hungarian 100% (70/70) 100% (70/70) 100% (70/70) -hy Armenian 100% (77/77) (0/77) (0/77) -hz Herero 100% (57/57) 100% (57/57) 100% (57/57) -ia Interlingua 100% (52/52) 100% (52/52) 100% (52/52) -id Indonesian 100% (54/54) 100% (54/54) 100% (54/54) -ie Interlingue 100% (52/52) 100% (52/52) 100% (52/52) -ig Igbo 100% (58/58) 100% (58/58) 100% (58/58) -ii Sichuan Yi/Nuosu (0/1165) (0/1165) (0/1165) -ik Inupiaq (Inupiak, Eskimo) 100% (68/68) 100% (68/68) 100% (68/68) -io Ido 100% (52/52) 100% (52/52) 100% (52/52) -is Icelandic 100% (70/70) 100% (70/70) 100% (70/70) -it Italian 100% (72/72) 100% (72/72) 100% (72/72) -iu Inuktitut 100% (161/161) (0/161) (0/161) -ja Japanese (0/6537) (0/6537) (0/6537) -jv Javanese 100% (56/56) 100% (56/56) 100% (56/56) -ka Georgian 100% (33/33) 100% (33/33) 100% (33/33) -kaa Kara-Kalpak (Karakalpak) 100% (78/78) 100% (78/78) 100% (78/78) -kab Kabyle 100% (70/70) 100% (70/70) 100% (70/70) -ki Kikuyu 100% (56/56) 100% (56/56) 100% (56/56) -kj Kuanyama/Kwanyama 100% (52/52) 100% (52/52) 100% (52/52) -kk Kazakh 100% (77/77) 100% (77/77) 100% (77/77) -kl Greenlandic 100% (81/81) 100% (81/81) 100% (81/81) -km Central Khmer (0/63) (0/63) (0/63) -kn Kannada (0/70) (0/70) (0/70) -ko Korean (0/2443) (0/2443) (0/2443) -kok Kokani (Devanagari script) (0/68) (0/68) (0/68) -kr Kanuri 100% (56/56) 96% (54/56) 100% (56/56) -ks Kashmiri 94% (137/145) (0/145) 97% (141/145) -ku-am Kurdish in Armenia 100% (64/64) 100% (64/64) 100% (64/64) -ku-iq Kurdish in Iraq 100% (32/32) (0/32) 87% (28/32) -ku-ir Kurdish in Iran 100% (32/32) (0/32) 87% (28/32) -ku-tr Kurdish in Turkey 100% (62/62) 100% (62/62) 100% (62/62) -kum Kumyk 100% (66/66) 100% (66/66) 100% (66/66) -kv Komi (Komi-Permyak/Komi-Siryan) 100% (70/70) 100% (70/70) 100% (70/70) -kw Cornish 100% (64/64) 100% (64/64) 100% (64/64) -kwm Kwambi 100% (52/52) 100% (52/52) 100% (52/52) -ky Kirgiz 100% (70/70) 100% (70/70) 100% (70/70) -la Latin 100% (68/68) 100% (68/68) 100% (68/68) -lah Lahnda 94% (137/145) (0/145) 97% (141/145) -lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75) -lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67) -lg Ganda 100% (54/54) 100% (54/54) 100% (54/54) -li Limburgan/Limburger/Limburgish 100% (62/62) 100% (62/62) 100% (62/62) -ln Lingala 100% (81/81) 100% (81/81) 100% (81/81) -lo Lao 100% (55/55) (0/55) 83% (46/55) -lt Lithuanian 100% (70/70) 100% (70/70) 100% (70/70) -lv Latvian 100% (78/78) 100% (78/78) 100% (78/78) -mai Maithili (Devanagari script) (0/68) (0/68) (0/68) -mg Malagasy 100% (56/56) 100% (56/56) 100% (56/56) -mh Marshallese 100% (62/62) 100% (62/62) 100% (62/62) -mi Maori 100% (64/64) 100% (64/64) 100% (64/64) -mk Macedonian 100% (42/42) 100% (42/42) 100% (42/42) -ml Malayalam (0/68) (0/68) (0/68) -mn-cn Mongolian in China (0/130) (0/130) (0/130) -mn-mn Mongolian in Mongolia 100% (70/70) 100% (70/70) 100% (70/70) -mo Moldavian 100% (128/128) 100% (128/128) 100% (128/128) -mr Marathi (Devanagari script) (0/68) (0/68) (0/68) -ms Malay 100% (52/52) 100% (52/52) 100% (52/52) -mt Maltese 100% (72/72) 100% (72/72) 100% (72/72) -my Burmese (Myanmar) (0/48) (0/48) (0/48) -na Nauru 100% (60/60) 100% (60/60) 100% (60/60) -nb Norwegian Bokmal 100% (70/70) 100% (70/70) 100% (70/70) -nds Low Saxon 100% (59/59) 100% (59/59) 100% (59/59) -ne Nepali (Devanagari script) (0/68) (0/68) (0/68) -ng Ndonga 100% (52/52) 100% (52/52) 100% (52/52) -nl Dutch 100% (82/82) 100% (82/82) 100% (82/82) -nn Norwegian Nynorsk 100% (76/76) 100% (76/76) 100% (76/76) -no Norwegian (Bokmal) 100% (70/70) 100% (70/70) 100% (70/70) -nr Ndebele, South 100% (52/52) 100% (52/52) 100% (52/52) -nso Northern Sotho 100% (58/58) 100% (58/58) 100% (58/58) -nv Navajo/Navaho 100% (72/72) 100% (72/72) 100% (72/72) -ny Chichewa 100% (54/54) 100% (54/54) 100% (54/54) -oc Occitan 100% (70/70) 100% (70/70) 100% (70/70) -om Oromo or Galla 100% (52/52) 100% (52/52) 100% (52/52) -or Oriya (0/68) (0/68) (0/68) -os Ossetic 100% (66/66) 100% (66/66) 100% (66/66) -ota Ottoman Turkish 97% (36/37) (0/37) 97% (36/37) -pa Panjabi/Punjabi (0/63) (0/63) (0/63) -pa-pk Panjabi/Punjabi in Pakistan 94% (137/145) (0/145) 97% (141/145) -pap-an Papiamento in Netherlands Antilles 100% (72/72) 100% (72/72) 100% (72/72) -pap-aw Papiamento in Aruba 100% (54/54) 100% (54/54) 100% (54/54) -pl Polish 100% (70/70) 100% (70/70) 100% (70/70) -ps-af Pashto in Afghanistan 83% (41/49) (0/49) 77% (38/49) -ps-pk Pashto in Pakistan 81% (40/49) (0/49) 75% (37/49) -pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82) -qu Quechua 100% (55/55) 100% (55/55) 100% (55/55) -rm Rhaeto-Romance (Romansch) 100% (66/66) 100% (66/66) 100% (66/66) -rn Rundi 100% (52/52) 100% (52/52) 100% (52/52) -ro Romanian 100% (62/62) 100% (62/62) 100% (62/62) -ru Russian 100% (66/66) 100% (66/66) 100% (66/66) -rw Kinyarwanda 100% (52/52) 100% (52/52) 100% (52/52) -sa Sanskrit (Devanagari script) (0/68) (0/68) (0/68) -sah Yakut 100% (76/76) 100% (76/76) 97% (74/76) -sc Sardinian 100% (62/62) 100% (62/62) 100% (62/62) -sco Scots 100% (56/56) 100% (56/56) 100% (56/56) -sd Sindhi 81% (44/54) (0/54) 79% (43/54) -se North Sami 100% (66/66) 100% (66/66) 100% (66/66) -sel Selkup (Ostyak-Samoyed) 100% (66/66) 100% (66/66) 100% (66/66) -sg Sango 100% (72/72) 100% (72/72) 100% (72/72) -sh Serbo-Croatian 100% (156/156) 100% (156/156) 98% (154/156) -shs Secwepemctsin 100% (48/48) 100% (48/48) 100% (48/48) -si Sinhala/Sinhalese (0/73) (0/73) (0/73) -sid Sidamo (0/281) (0/281) (0/281) -sk Slovak 100% (86/86) 100% (86/86) 100% (86/86) -sl Slovenian 100% (62/62) 100% (62/62) 100% (62/62) -sm Samoan 100% (53/53) 100% (53/53) 100% (53/53) -sma South Sami 100% (60/60) 100% (60/60) 100% (60/60) -smj Lule Sami 100% (60/60) 100% (60/60) 100% (60/60) -smn Inari Sami 100% (68/68) 100% (68/68) 100% (68/68) -sms Skolt Sami 100% (80/80) 100% (80/80) 97% (78/80) -sn Shona 100% (52/52) 100% (52/52) 100% (52/52) -so Somali 100% (52/52) 100% (52/52) 100% (52/52) -sq Albanian 100% (56/56) 100% (56/56) 100% (56/56) -sr Serbian 100% (60/60) 100% (60/60) 100% (60/60) -ss Swati 100% (52/52) 100% (52/52) 100% (52/52) -st Sotho, Southern 100% (52/52) 100% (52/52) 100% (52/52) -su Sundanese 100% (54/54) 100% (54/54) 100% (54/54) -sv Swedish 100% (68/68) 100% (68/68) 100% (68/68) -sw Swahili 100% (52/52) 100% (52/52) 100% (52/52) -syr Syriac (0/45) (0/45) (0/45) -ta Tamil (0/48) (0/48) (0/48) -te Telugu (0/70) (0/70) (0/70) -tg Tajik 100% (78/78) 100% (78/78) 97% (76/78) -th Thai 1% (1/74) (0/74) (0/74) -ti-er Eritrean Tigrinya (0/255) (0/255) (0/255) -ti-et Ethiopian Tigrinya (0/281) (0/281) (0/281) -tig Tigre (0/221) (0/221) (0/221) -tk Turkmen 100% (68/68) 100% (68/68) 100% (68/68) -tl Tagalog 100% (84/84) 100% (84/84) 100% (84/84) -tn Tswana 100% (58/58) 100% (58/58) 100% (58/58) -to Tonga 100% (53/53) 100% (53/53) 100% (53/53) -tr Turkish 100% (70/70) 100% (70/70) 100% (70/70) -ts Tsonga 100% (52/52) 100% (52/52) 100% (52/52) -tt Tatar 100% (76/76) 100% (76/76) 100% (76/76) -tw Twi 100% (73/73) 100% (73/73) 100% (73/73) -ty Tahitian 100% (65/65) 100% (65/65) 100% (65/65) -tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70) -ug Uighur 100% (125/125) (0/125) 100% (125/125) -uk Ukrainian 100% (72/72) 100% (72/72) 100% (72/72) -ur Urdu 94% (137/145) (0/145) 97% (141/145) -uz Uzbek 100% (52/52) 100% (52/52) 100% (52/52) -ve Venda 100% (62/62) 100% (62/62) 100% (62/62) -vi Vietnamese 100% (194/194) 77% (150/194) 76% (148/194) -vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54) -vot Votic 100% (62/62) 100% (62/62) 100% (62/62) -wa Walloon 100% (70/70) 100% (70/70) 100% (70/70) -wal Wolaitta/Wolaytta (0/281) (0/281) (0/281) -wen Sorbian languages (lower and upper) 100% (76/76) 100% (76/76) 100% (76/76) -wo Wolof 100% (66/66) 100% (66/66) 100% (66/66) -xh Xhosa 100% (52/52) 100% (52/52) 100% (52/52) -yap Yapese 100% (58/58) 100% (58/58) 100% (58/58) -yi Yiddish 100% (27/27) (0/27) (0/27) -yo Yoruba 100% (119/119) 100% (119/119) 100% (119/119) -za Zhuang/Chuang 100% (52/52) 100% (52/52) 100% (52/52) -zh-cn Chinese (simplified) 0% (2/6765) 0% (2/6765) 0% (2/6765) -zh-hk Chinese Hong Kong Supplementary Character Set (0/2213) (0/2213) (0/2213) -zh-mo Chinese in Macau (0/2213) (0/2213) (0/2213) -zh-sg Chinese in Singapore 0% (2/6765) 0% (2/6765) 0% (2/6765) -zh-tw Chinese (traditional) (0/13063) (0/13063) (0/13063) -zu Zulu 100% (52/52) 100% (52/52) 100% (52/52) diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/status.txt b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/status.txt deleted file mode 100644 index ecc3055d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/status.txt +++ /dev/null @@ -1,6237 +0,0 @@ -This is the status file for DejaVu fonts -($Id: status.txt 2362 2009-08-27 14:43:39Z ben_laenen $) - -original = present in original Bitstream Vera 1.10 - = added in DejaVu fonts - -U+0020 space original -U+0021 exclam original -U+0022 quotedbl original -U+0023 numbersign original -U+0024 dollar original -U+0025 percent original -U+0026 ampersand original -U+0027 quotesingle original -U+0028 parenleft original -U+0029 parenright original -U+002a asterisk original -U+002b plus original -U+002c comma original -U+002d hyphen original -U+002e period original -U+002f slash original -U+0030 zero original -U+0031 one original -U+0032 two original -U+0033 three original -U+0034 four original -U+0035 five original -U+0036 six original -U+0037 seven original -U+0038 eight original -U+0039 nine original -U+003a colon original -U+003b semicolon original -U+003c less original -U+003d equal original -U+003e greater original -U+003f question original -U+0040 at original -U+0041 A original -U+0042 B original -U+0043 C original -U+0044 D original -U+0045 E original -U+0046 F original -U+0047 G original -U+0048 H original -U+0049 I original -U+004a J original -U+004b K original -U+004c L original -U+004d M original -U+004e N original -U+004f O original -U+0050 P original -U+0051 Q original -U+0052 R original -U+0053 S original -U+0054 T original -U+0055 U original -U+0056 V original -U+0057 W original -U+0058 X original -U+0059 Y original -U+005a Z original -U+005b bracketleft original -U+005c backslash original -U+005d bracketright original -U+005e asciicircum original -U+005f underscore original -U+0060 grave original -U+0061 a original -U+0062 b original -U+0063 c original -U+0064 d original -U+0065 e original -U+0066 f original -U+0067 g original -U+0068 h original -U+0069 i original -U+006a j original -U+006b k original -U+006c l original -U+006d m original -U+006e n original -U+006f o original -U+0070 p original -U+0071 q original -U+0072 r original -U+0073 s original -U+0074 t original -U+0075 u original -U+0076 v original -U+0077 w original -U+0078 x original -U+0079 y original -U+007a z original -U+007b braceleft original -U+007c bar original -U+007d braceright original -U+007e asciitilde original -U+00a0 nonbreakingspace original -U+00a1 exclamdown original -U+00a2 cent original -U+00a3 sterling original -U+00a4 currency original -U+00a5 yen original -U+00a6 brokenbar original -U+00a7 section original -U+00a8 dieresis original -U+00a9 copyright original -U+00aa ordfeminine original -U+00ab guillemotleft original -U+00ac logicalnot original -U+00ad sfthyphen original -U+00ae registered original -U+00af macron original -U+00b0 degree original -U+00b1 plusminus original -U+00b2 twosuperior original -U+00b3 threesuperior original -U+00b4 acute original -U+00b5 mu original -U+00b6 paragraph original -U+00b7 periodcentered original -U+00b8 cedilla original -U+00b9 onesuperior original -U+00ba ordmasculine original -U+00bb guillemotright original -U+00bc onequarter original -U+00bd onehalf original -U+00be threequarters original -U+00bf questiondown original -U+00c0 Agrave original -U+00c1 Aacute original -U+00c2 Acircumflex original -U+00c3 Atilde original -U+00c4 Adieresis original -U+00c5 Aring original -U+00c6 AE original -U+00c7 Ccedilla original -U+00c8 Egrave original -U+00c9 Eacute original -U+00ca Ecircumflex original -U+00cb Edieresis original -U+00cc Igrave original -U+00cd Iacute original -U+00ce Icircumflex original -U+00cf Idieresis original -U+00d0 Eth original -U+00d1 Ntilde original -U+00d2 Ograve original -U+00d3 Oacute original -U+00d4 Ocircumflex original -U+00d5 Otilde original -U+00d6 Odieresis original -U+00d7 multiply original -U+00d8 Oslash original -U+00d9 Ugrave original -U+00da Uacute original -U+00db Ucircumflex original -U+00dc Udieresis original -U+00dd Yacute original -U+00de Thorn original -U+00df germandbls original -U+00e0 agrave original -U+00e1 aacute original -U+00e2 acircumflex original -U+00e3 atilde original -U+00e4 adieresis original -U+00e5 aring original -U+00e6 ae original -U+00e7 ccedilla original -U+00e8 egrave original -U+00e9 eacute original -U+00ea ecircumflex original -U+00eb edieresis original -U+00ec igrave original -U+00ed iacute original -U+00ee icircumflex original -U+00ef idieresis original -U+00f0 eth original -U+00f1 ntilde original -U+00f2 ograve original -U+00f3 oacute original -U+00f4 ocircumflex original -U+00f5 otilde original -U+00f6 odieresis original -U+00f7 divide original -U+00f8 oslash original -U+00f9 ugrave original -U+00fa uacute original -U+00fb ucircumflex original -U+00fc udieresis original -U+00fd yacute original -U+00fe thorn original -U+00ff ydieresis original -U+0100 Amacron 1.5 -U+0101 amacron 1.5 -U+0102 Abreve 1.5 -U+0103 abreve 1.5 -U+0104 Aogonek 1.4 -U+0105 aogonek 1.4 -U+0106 Cacute original -U+0107 cacute original -U+0108 Ccircumflex 1.5 -U+0109 ccircumflex 1.5 -U+010a Cdotaccent 1.5 -U+010b cdotaccent 1.5 -U+010c Ccaron original -U+010d ccaron original -U+010e Dcaron 1.0 -U+010f dcaron 1.0 -U+0110 Dcroat 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0111 dcroat original -U+0112 Emacron 1.5 -U+0113 emacron 1.5 -U+0114 Ebreve 1.5 -U+0115 ebreve 1.5 -U+0116 Edotaccent 1.5 -U+0117 edotaccent 1.5 -U+0118 Eogonek 1.4 -U+0119 eogonek 1.4 -U+011a Ecaron 1.0 -U+011b ecaron 1.0 -U+011c Gcircumflex 1.5 -U+011d gcircumflex 1.5 -U+011e Gbreve original -U+011f gbreve original -U+0120 Gdotaccent 1.5 -U+0121 gdotaccent 1.5 -U+0122 Gcommaaccent 1.11 -U+0123 gcommaaccent 1.11 -U+0124 Hcircumflex 1.5 -U+0125 hcircumflex 1.5 -U+0126 Hbar 1.12 -U+0127 hbar 1.12 -U+0128 Itilde 1.5 -U+0129 itilde 1.5 -U+012a Imacron 1.5 -U+012b imacron 1.5 -U+012c Ibreve 1.5 -U+012d ibreve 1.5 -U+012e Iogonek 1.11 -U+012f iogonek 1.11 -U+0130 Idotaccent original -U+0131 dotlessi original -U+0132 IJ 1.11 -U+0133 ij 1.11 -U+0134 Jcircumflex 1.5 -U+0135 jcircumflex 1.5 -U+0136 Kcommaaccent 1.11 -U+0137 kcommaaccent 1.11 -U+0138 kgreenlandic 1.12 -U+0139 Lacute 1.1 -U+013a lacute 1.1 -U+013b Lcommaaccent 1.11 -U+013c lcommaaccent 1.11 -U+013d Lcaron 1.1 -U+013e lcaron 1.1 -U+013f Ldot 1.2 -U+0140 ldot 1.2 -U+0141 Lslash original -U+0142 lslash original -U+0143 Nacute 1.4 -U+0144 nacute 1.4 -U+0145 Ncommaaccent 1.11 -U+0146 ncommaaccent 1.11 -U+0147 Ncaron 1.0 -U+0148 ncaron 1.0 -U+0149 napostrophe 1.12 -U+014a Eng 1.12 -U+014b eng 1.12 -U+014c Omacron 1.5 -U+014d omacron 1.5 -U+014e Obreve 1.5 -U+014f obreve 1.5 -U+0150 Ohungarumlaut 1.5 -U+0151 ohungarumlaut 1.5 -U+0152 OE original -U+0153 oe original -U+0154 Racute 1.1 -U+0155 racute 1.1 -U+0156 Rcommaaccent 1.11 -U+0157 rcommaaccent 1.11 -U+0158 Rcaron 1.0 -U+0159 rcaron 1.0 -U+015a Sacute 1.4 -U+015b sacute 1.4 -U+015c Scircumflex 1.5 -U+015d scircumflex 1.5 -U+015e Scedilla original -U+015f scedilla original -U+0160 Scaron original -U+0161 scaron original -U+0162 Tcommaaccent 1.5 -U+0163 tcommaaccent 1.5 -U+0164 Tcaron 1.0 -U+0165 tcaron 1.0 -U+0166 Tbar 1.12 -U+0167 tbar 1.12 -U+0168 Utilde 1.5 -U+0169 utilde 1.5 -U+016a Umacron 1.5 -U+016b umacron 1.5 -U+016c Ubreve 1.5 -U+016d ubreve 1.5 -U+016e Uring 1.0 -U+016f uring 1.0 -U+0170 Uhungarumlaut 1.5 -U+0171 uhungarumlaut 1.5 -U+0172 Uogonek 1.11 -U+0173 uogonek 1.11 -U+0174 Wcircumflex 1.2 -U+0175 wcircumflex 1.2 -U+0176 Ycircumflex 1.2 -U+0177 ycircumflex 1.2 -U+0178 Ydieresis original -U+0179 Zacute 1.4 -U+017a zacute 1.4 -U+017b Zdotaccent 1.4 -U+017c zdotaccent 1.4 -U+017d Zcaron original -U+017e zcaron original -U+017f longs 1.12 -U+0180 uni0180 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0181 uni0181 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0182 uni0182 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0183 uni0183 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0184 uni0184 2.3 -U+0185 uni0185 2.3 -U+0186 uni0186 1.15 -U+0187 uni0187 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0188 uni0188 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0189 uni0189 2.1 -U+018a uni018A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018b uni018B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018c uni018C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018d uni018D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018e uni018E 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+018f uni018F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0190 uni0190 1.15 -U+0191 uni0191 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0192 florin original -U+0193 uni0193 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0194 uni0194 1.14 -U+0195 uni0195 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0196 uni0196 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0197 uni0197 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0198 uni0198 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0199 uni0199 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+019a uni019A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+019b uni019B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+019c uni019C 2.3 -U+019d uni019D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+019e uni019E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+019f uni019F 2.3 -U+01a0 Ohorn 2.3 -U+01a1 ohorn 2.3 -U+01a2 uni01A2 2.3 -U+01a3 uni01A3 2.3 -U+01a4 uni01A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01a5 uni01A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01a6 uni01A6 2.3 -U+01a7 uni01A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01a8 uni01A8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01a9 uni01A9 2.2 -U+01aa uni01AA 2.3 -U+01ab uni01AB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01ac uni01AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01ad uni01AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01ae uni01AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01af Uhorn 2.3 -U+01b0 uhorn 2.3 -U+01b1 uni01B1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01b2 uni01B2 2.3 -U+01b3 uni01B3 2.3 -U+01b4 uni01B4 2.3 -U+01b5 uni01B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01b6 uni01B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01b7 uni01B7 2.3 -U+01b8 uni01B8 2.3 -U+01b9 uni01B9 2.3 -U+01ba uni01BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01bb uni01BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01bc uni01BC 2.3 -U+01bd uni01BD 2.3 -U+01be uni01BE 2.3 -U+01bf uni01BF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01c0 uni01C0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01c1 uni01C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01c2 uni01C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+01c3 uni01C3 2.2 -U+01c4 uni01C4 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c5 uni01C5 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c6 uni01C6 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c7 uni01C7 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c8 uni01C8 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01c9 uni01C9 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01ca uni01CA 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01cb uni01CB 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01cc uni01CC 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01cd uni01CD 1.15 -U+01ce uni01CE 1.15 -U+01cf uni01CF 1.15 -U+01d0 uni01D0 1.15 -U+01d1 uni01D1 1.15 -U+01d2 uni01D2 1.15 -U+01d3 uni01D3 1.15 -U+01d4 uni01D4 1.15 -U+01d5 uni01D5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01d6 uni01D6 1.13 -U+01d7 uni01D7 2.3 -U+01d8 uni01D8 2.3 -U+01d9 uni01D9 2.3 -U+01da uni01DA 2.3 -U+01db uni01DB 2.3 -U+01dc uni01DC 2.3 -U+01dd uni01DD 2.2 -U+01de uni01DE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique) 2.23 (Serif Italic Condensed) -U+01df uni01DF 1.13 -U+01e0 uni01E0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e1 uni01E1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e2 uni01E2 1.5 -U+01e3 uni01E3 1.5 -U+01e4 uni01E4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+01e5 uni01E5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+01e6 Gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e7 gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e8 uni01E8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01e9 uni01E9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01ea uni01EA 1.9 -U+01eb uni01EB 1.9 -U+01ec uni01EC 1.9 -U+01ed uni01ED 1.9 -U+01ee uni01EE 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01ef uni01EF 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01f0 uni01F0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono) 2.22 (Sans Mono Bold) 2.23 (Serif Italic Condensed) -U+01f1 uni01F1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01f2 uni01F2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01f3 uni01F3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01f4 uni01F4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01f5 uni01F5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01f6 uni01F6 2.3 -U+01f7 uni01F7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+01f8 uni01F8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01f9 uni01F9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01fa Aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01fb aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+01fc AEacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01fd aeacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01fe Oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+01ff oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0200 uni0200 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0201 uni0201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0202 uni0202 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0203 uni0203 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0204 uni0204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0205 uni0205 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0206 uni0206 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0207 uni0207 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0208 uni0208 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0209 uni0209 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020a uni020A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020b uni020B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020c uni020C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020d uni020D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020e uni020E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+020f uni020F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0210 uni0210 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0211 uni0211 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0212 uni0212 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0213 uni0213 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0214 uni0214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0215 uni0215 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0216 uni0216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0217 uni0217 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0218 Scommaaccent 1.5 -U+0219 scommaaccent 1.5 -U+021a uni021A 1.5 -U+021b uni021B 1.5 -U+021c uni021C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+021d uni021D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+021e uni021E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+021f uni021F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0220 uni0220 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) 2.23 (Serif Italic Condensed) -U+0221 uni0221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0222 uni0222 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0223 uni0223 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0224 uni0224 2.3 -U+0225 uni0225 2.3 -U+0226 uni0226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0227 uni0227 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0228 uni0228 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0229 uni0229 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+022a uni022A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+022b uni022B 1.13 -U+022c uni022C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+022d uni022D 1.13 -U+022e uni022E 1.10 -U+022f uni022F 1.10 -U+0230 uni0230 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0231 uni0231 1.13 -U+0232 uni0232 1.5 -U+0233 uni0233 1.5 -U+0234 uni0234 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0235 uni0235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0236 uni0236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0237 dotlessj 1.5 -U+0238 uni0238 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0239 uni0239 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+023a uni023A 2.3 -U+023b uni023B 2.3 -U+023c uni023C 2.3 -U+023d uni023D 2.3 -U+023e uni023E 2.3 -U+023f uni023F 2.3 -U+0240 uni0240 2.3 -U+0241 uni0241 2.3 -U+0242 uni0242 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+0243 uni0243 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0244 uni0244 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0245 uni0245 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0246 uni0246 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0247 uni0247 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0248 uni0248 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0249 uni0249 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+024a uni024A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+024b uni024B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight) -U+024c uni024C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+024d uni024D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+024e uni024E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+024f uni024F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0250 uni0250 1.14 -U+0251 uni0251 1.14 -U+0252 uni0252 1.14 -U+0253 uni0253 1.14 -U+0254 uni0254 1.14 -U+0255 uni0255 1.14 -U+0256 uni0256 1.14 -U+0257 uni0257 1.14 -U+0258 uni0258 1.14 -U+0259 uni0259 1.14 -U+025a uni025A 1.14 -U+025b uni025B 1.14 -U+025c uni025C 1.14 -U+025d uni025D 1.14 -U+025e uni025E 1.14 -U+025f uni025F 1.14 -U+0260 uni0260 1.14 -U+0261 uni0261 1.14 -U+0262 uni0262 1.14 -U+0263 uni0263 1.14 -U+0264 uni0264 1.14 -U+0265 uni0265 1.14 -U+0266 uni0266 1.14 -U+0267 uni0267 1.14 -U+0268 uni0268 1.14 -U+0269 uni0269 1.14 -U+026a uni026A 1.14 -U+026b uni026B 1.14 -U+026c uni026C 1.14 -U+026d uni026D 1.14 -U+026e uni026E 1.14 -U+026f uni026F 1.14 -U+0270 uni0270 1.14 -U+0271 uni0271 1.14 -U+0272 uni0272 1.14 -U+0273 uni0273 1.14 -U+0274 uni0274 1.14 -U+0275 uni0275 1.14 -U+0276 uni0276 1.14 -U+0277 uni0277 1.14 -U+0278 uni0278 1.14 -U+0279 uni0279 1.14 -U+027a uni027A 1.14 -U+027b uni027B 1.14 -U+027c uni027C 1.14 -U+027d uni027D 1.14 -U+027e uni027E 1.14 -U+027f uni027F 1.14 -U+0280 uni0280 1.14 -U+0281 uni0281 1.14 -U+0282 uni0282 1.14 -U+0283 uni0283 1.14 -U+0284 uni0284 1.14 -U+0285 uni0285 1.14 -U+0286 uni0286 1.14 -U+0287 uni0287 1.14 -U+0288 uni0288 1.14 -U+0289 uni0289 1.14 -U+028a uni028A 1.14 -U+028b uni028B 1.14 -U+028c uni028C 1.14 -U+028d uni028D 1.14 -U+028e uni028E 1.14 -U+028f uni028F 1.14 -U+0290 uni0290 1.14 -U+0291 uni0291 1.14 -U+0292 uni0292 1.14 -U+0293 uni0293 1.14 -U+0294 uni0294 1.14 -U+0295 uni0295 1.14 -U+0296 uni0296 1.14 -U+0297 uni0297 1.14 -U+0298 uni0298 1.14 -U+0299 uni0299 1.14 -U+029a uni029A 1.14 -U+029b uni029B 1.14 -U+029c uni029C 1.14 -U+029d uni029D 1.14 -U+029e uni029E 1.14 -U+029f uni029F 1.14 -U+02a0 uni02A0 1.14 -U+02a1 uni02A1 1.14 -U+02a2 uni02A2 1.14 -U+02a3 uni02A3 1.14 -U+02a4 uni02A4 1.14 -U+02a5 uni02A5 1.14 -U+02a6 uni02A6 1.14 -U+02a7 uni02A7 1.14 -U+02a8 uni02A8 1.14 -U+02a9 uni02A9 1.14 -U+02aa uni02AA 1.14 -U+02ab uni02AB 1.14 -U+02ac uni02AC 1.14 -U+02ad uni02AD 1.14 -U+02ae uni02AE 1.14 -U+02af uni02AF 1.14 -U+02b0 uni02B0 1.14 -U+02b1 uni02B1 1.14 -U+02b2 uni02B2 1.14 -U+02b3 uni02B3 1.14 -U+02b4 uni02B4 1.14 -U+02b5 uni02B5 1.14 -U+02b6 uni02B6 1.14 -U+02b7 uni02B7 1.14 -U+02b8 uni02B8 1.14 -U+02b9 uni02B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+02ba uni02BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02bb uni02BB 1.5 -U+02bc uni02BC 1.12 -U+02bd uni02BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+02be uni02BE 2.2 -U+02bf uni02BF 2.2 -U+02c0 uni02C0 1.14 -U+02c1 uni02C1 1.14 -U+02c2 uni02C2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02c3 uni02C3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02c4 uni02C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02c5 uni02C5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02c6 circumflex original -U+02c7 caron original -U+02c8 uni02C8 2.0 -U+02c9 uni02C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+02ca uni02CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+02cb uni02CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+02cc uni02CC 2.0 -U+02cd uni02CD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+02ce uni02CE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+02cf uni02CF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+02d0 uni02D0 1.14 -U+02d1 uni02D1 1.14 -U+02d2 uni02D2 2.0 -U+02d3 uni02D3 2.2 -U+02d4 uni02D4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02d5 uni02D5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02d6 uni02D6 2.0 -U+02d7 uni02D7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+02d8 breve original -U+02d9 dotaccent original -U+02da ring original -U+02db ogonek original -U+02dc tilde original -U+02dd hungarumlaut original -U+02de uni02DE 2.0 -U+02df uni02DF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02e0 uni02E0 1.14 -U+02e1 uni02E1 1.14 -U+02e2 uni02E2 1.14 -U+02e3 uni02E3 1.14 -U+02e4 uni02E4 1.14 -U+02e5 uni02E5 2.0 -U+02e6 uni02E6 2.0 -U+02e7 uni02E7 2.0 -U+02e8 uni02E8 2.0 -U+02e9 uni02E9 2.0 -U+02ec uni02EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02ed uni02ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02ee uni02EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+02f3 uni02F3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+02f7 uni02F7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0300 gravecomb 1.15 -U+0301 acutecomb 1.15 -U+0302 uni0302 1.15 -U+0303 tildecomb 1.15 -U+0304 uni0304 1.15 -U+0305 uni0305 2.0 -U+0306 uni0306 1.15 -U+0307 uni0307 1.15 -U+0308 uni0308 1.15 -U+0309 hookabovecomb 2.1 -U+030a uni030A 1.15 -U+030b uni030B 1.15 -U+030c uni030C 1.15 -U+030d uni030D 2.0 -U+030e uni030E 2.0 -U+030f uni030F 2.0 -U+0310 uni0310 2.0 -U+0311 uni0311 2.0 -U+0312 uni0312 1.11 -U+0313 uni0313 2.1 -U+0314 uni0314 2.1 -U+0315 uni0315 2.0 -U+0316 uni0316 2.0 -U+0317 uni0317 2.0 -U+0318 uni0318 2.0 -U+0319 uni0319 2.0 -U+031a uni031A 2.1 -U+031b uni031B 2.1 -U+031c uni031C 2.0 -U+031d uni031D 2.0 -U+031e uni031E 2.0 -U+031f uni031F 2.0 -U+0320 uni0320 2.0 -U+0321 uni0321 1.15 -U+0322 uni0322 1.15 -U+0323 dotbelowcomb 2.1 -U+0324 uni0324 2.0 -U+0325 uni0325 2.0 -U+0326 uni0326 1.5 -U+0327 uni0327 2.1 -U+0328 uni0328 2.1 -U+0329 uni0329 2.0 -U+032a uni032A 2.0 -U+032b uni032B 2.1 -U+032c uni032C 2.0 -U+032d uni032D 2.0 -U+032e uni032E 2.0 -U+032f uni032F 2.0 -U+0330 uni0330 2.0 -U+0331 uni0331 2.0 -U+0332 uni0332 2.0 -U+0333 uni0333 2.1 -U+0334 uni0334 2.3 -U+0335 uni0335 2.3 -U+0336 uni0336 2.3 -U+0337 uni0337 2.3 -U+0338 uni0338 2.3 -U+0339 uni0339 2.0 -U+033a uni033A 2.0 -U+033b uni033B 2.0 -U+033c uni033C 2.1 -U+033d uni033D 2.0 -U+033e uni033E 2.1 -U+033f uni033F 2.1 -U+0340 uni0340 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0341 uni0341 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0342 uni0342 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0343 uni0343 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0344 uni0344 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0345 uni0345 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0346 uni0346 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0347 uni0347 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0348 uni0348 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0349 uni0349 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034a uni034A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034b uni034B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034c uni034C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034d uni034D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034e uni034E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034f uni034F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0351 uni0351 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0352 uni0352 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.28 (Sans Condensed Oblique, Sans Oblique) -U+0353 uni0353 2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0357 uni0357 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0358 uni0358 2.3 -U+035a uni035A 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+035c uni035C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+035d uni035D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+035e uni035E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+035f uni035F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0360 uni0360 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0361 uni0361 2.0 -U+0362 uni0362 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0370 uni0370 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0371 uni0371 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0372 uni0372 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0373 uni0373 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0374 uni0374 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0375 uni0375 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0376 uni0376 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+0377 uni0377 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+037a uni037A 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+037b uni037B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+037c uni037C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+037d uni037D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+037e uni037E 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0384 tonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0385 dieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0386 Alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0387 anoteleia 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0388 Epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0389 Etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+038a Iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+038c Omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+038e Upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+038f Omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0390 iotadieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0391 Alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0392 Beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0393 Gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0394 uni0394 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0395 Epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0396 Zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0397 Eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0398 Theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0399 Iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039a Kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039b Lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039c Mu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039d Nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039e Xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+039f Omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a0 Pi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a1 Rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a3 Sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a4 Tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a5 Upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a6 Phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a7 Chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a8 Psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03a9 Omega original -U+03aa Iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ab Upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ac alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ad epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ae etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03af iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b1 alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b2 beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b3 gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b4 delta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b5 epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b6 zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b7 eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b8 theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03b9 iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ba kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03bb lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03bc uni03BC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03bd nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03be xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03bf omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c0 pi original -U+03c1 rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c2 sigma1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c3 sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c4 tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c5 upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c6 phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c7 chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c8 psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03c9 omega 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ca iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cb upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cc omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cd upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ce omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03cf uni03CF 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+03d0 uni03D0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d1 theta1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d2 Upsilon1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d3 uni03D3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d4 uni03D4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d5 phi1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03d6 omega1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03d7 uni03D7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03d8 uni03D8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03d9 uni03D9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03da uni03DA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03db uni03DB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03dc uni03DC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03dd uni03DD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03de uni03DE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03df uni03DF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03e0 uni03E0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03e1 uni03E1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03e2 uni03E2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e3 uni03E3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e4 uni03E4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e5 uni03E5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e6 uni03E6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e7 uni03E7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e8 uni03E8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03e9 uni03E9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ea uni03EA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03eb uni03EB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ec uni03EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ed uni03ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ee uni03EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03ef uni03EF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03f0 uni03F0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03f1 uni03F1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03f2 uni03F2 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f3 uni03F3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f4 uni03F4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f5 uni03F5 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f6 uni03F6 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f7 uni03F7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f8 uni03F8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03f9 uni03F9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03fa uni03FA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03fb uni03FB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+03fc uni03FC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+03fd uni03FD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03fe uni03FE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+03ff uni03FF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0400 uni0400 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0401 uni0401 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0402 uni0402 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0403 uni0403 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0404 uni0404 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0405 uni0405 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0406 uni0406 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0407 uni0407 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0408 uni0408 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0409 uni0409 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040a uni040A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040b uni040B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040c uni040C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040d uni040D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040e uni040E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+040f uni040F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0410 uni0410 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0411 uni0411 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0412 uni0412 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0413 uni0413 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0414 uni0414 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0415 uni0415 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0416 uni0416 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0417 uni0417 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0418 uni0418 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0419 uni0419 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041a uni041A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041b uni041B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041c uni041C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041d uni041D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041e uni041E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+041f uni041F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0420 uni0420 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0421 uni0421 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0422 uni0422 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0423 uni0423 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0424 uni0424 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0425 uni0425 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0426 uni0426 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0427 uni0427 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0428 uni0428 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0429 uni0429 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042a uni042A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042b uni042B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042c uni042C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042d uni042D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042e uni042E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+042f uni042F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0430 uni0430 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0431 uni0431 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0432 uni0432 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0433 uni0433 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0434 uni0434 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0435 uni0435 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0436 uni0436 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0437 uni0437 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0438 uni0438 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0439 uni0439 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043a uni043A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043b uni043B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043c uni043C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043d uni043D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043e uni043E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+043f uni043F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0440 uni0440 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0441 uni0441 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0442 uni0442 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0443 uni0443 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0444 uni0444 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0445 uni0445 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0446 uni0446 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0447 uni0447 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0448 uni0448 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0449 uni0449 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044a uni044A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044b uni044B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044c uni044C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044d uni044D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044e uni044E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+044f uni044F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0450 uni0450 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0451 uni0451 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0452 uni0452 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0453 uni0453 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0454 uni0454 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0455 uni0455 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0456 uni0456 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0457 uni0457 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0458 uni0458 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0459 uni0459 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045a uni045A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045b uni045B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045c uni045C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045d uni045D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045e uni045E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+045f uni045F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+0460 uni0460 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0461 uni0461 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0462 uni0462 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0463 uni0463 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0464 uni0464 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0465 uni0465 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0466 uni0466 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0467 uni0467 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0468 uni0468 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0469 uni0469 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046a uni046A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+046b uni046B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+046c uni046C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046d uni046D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046e uni046E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046f uni046F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0470 uni0470 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0471 uni0471 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0472 uni0472 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0473 uni0473 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0474 uni0474 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0475 uni0475 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0476 uni0476 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0477 uni0477 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0478 uni0478 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0479 uni0479 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047a uni047A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047b uni047B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047c uni047C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047d uni047D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047e uni047E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+047f uni047F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0480 uni0480 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0481 uni0481 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0482 uni0482 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0483 uni0483 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0484 uni0484 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0485 uni0485 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0486 uni0486 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0487 uni0487 2.9 (Sans, Sans Condensed) 2.27 (Sans Bold, Sans Bold Oblique, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0488 uni0488 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0489 uni0489 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048a uni048A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048b uni048B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048c uni048C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+048d uni048D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+048e uni048E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048f uni048F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0490 uni0490 1.15 -U+0491 uni0491 1.15 -U+0492 uni0492 1.14 -U+0493 uni0493 1.14 -U+0494 uni0494 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0495 uni0495 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+0496 uni0496 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0497 uni0497 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0498 uni0498 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+0499 uni0499 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+049a uni049A 1.14 -U+049b uni049B 1.14 -U+049c uni049C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+049d uni049D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+049e uni049E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+049f uni049F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a0 uni04A0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+04a1 uni04A1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+04a2 uni04A2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a3 uni04A3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a4 uni04A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04a5 uni04A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04a6 uni04A6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a7 uni04A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04a8 uni04A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04a9 uni04A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04aa uni04AA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04ab uni04AB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04ac uni04AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04ad uni04AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04ae uni04AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04af uni04AF 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04b0 uni04B0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+04b1 uni04B1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+04b2 uni04B2 1.14 -U+04b3 uni04B3 1.14 -U+04b4 uni04B4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04b5 uni04B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04b6 uni04B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04b7 uni04B7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04b8 uni04B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04b9 uni04B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04ba uni04BA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04bb uni04BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04bc uni04BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04bd uni04BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04be uni04BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04bf uni04BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04c0 uni04C0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04c1 uni04C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04c2 uni04C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04c3 uni04C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04c4 uni04C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04c5 uni04C5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04c6 uni04C6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04c7 uni04C7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+04c8 uni04C8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+04c9 uni04C9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04ca uni04CA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04cb uni04CB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04cc uni04CC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04cd uni04CD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04ce uni04CE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04cf uni04CF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04d0 uni04D0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d1 uni04D1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d2 uni04D2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d3 uni04D3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d4 uni04D4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d5 uni04D5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d6 uni04D6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d7 uni04D7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04d8 uni04D8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04d9 uni04D9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04da uni04DA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04db uni04DB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04dc uni04DC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04dd uni04DD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04de uni04DE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04df uni04DF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e0 uni04E0 2.3 -U+04e1 uni04E1 2.3 -U+04e2 uni04E2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e3 uni04E3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e4 uni04E4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e5 uni04E5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04e6 uni04E6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04e7 uni04E7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04e8 uni04E8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04e9 uni04E9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04ea uni04EA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04eb uni04EB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+04ec uni04EC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04ed uni04ED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04ee uni04EE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04ef uni04EF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f0 uni04F0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04f1 uni04F1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f2 uni04F2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04f3 uni04F3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f4 uni04F4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04f5 uni04F5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04f6 uni04F6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f7 uni04F7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f8 uni04F8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+04f9 uni04F9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+04fa uni04FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fb uni04FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fc uni04FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fd uni04FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fe uni04FE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+04ff uni04FF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0500 uni0500 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0501 uni0501 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0502 uni0502 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0503 uni0503 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0504 uni0504 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0505 uni0505 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0506 uni0506 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0507 uni0507 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0508 uni0508 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0509 uni0509 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050a uni050A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050b uni050B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050c uni050C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050d uni050D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050e uni050E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+050f uni050F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0510 uni0510 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0511 uni0511 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0512 uni0512 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0513 uni0513 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0514 uni0514 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0515 uni0515 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0516 uni0516 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0517 uni0517 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0518 uni0518 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0519 uni0519 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+051a uni051A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+051b uni051B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+051c uni051C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+051d uni051D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+0520 uni0520 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0521 uni0521 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0522 uni0522 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0523 uni0523 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0524 uni0524 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0525 uni0525 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0531 uni0531 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0532 uni0532 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0533 uni0533 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0534 uni0534 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0535 uni0535 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0536 uni0536 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0537 uni0537 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0538 uni0538 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0539 uni0539 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053a uni053A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053b uni053B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053c uni053C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053d uni053D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053e uni053E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+053f uni053F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0540 uni0540 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0541 uni0541 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0542 uni0542 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0543 uni0543 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0544 uni0544 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0545 uni0545 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0546 uni0546 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0547 uni0547 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0548 uni0548 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0549 uni0549 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054a uni054A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054b uni054B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054c uni054C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054d uni054D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+054e uni054E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+054f uni054F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0550 uni0550 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0551 uni0551 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0552 uni0552 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0553 uni0553 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0554 uni0554 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0555 uni0555 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0556 uni0556 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0559 uni0559 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055a uni055A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+055b uni055B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055c uni055C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055d uni055D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+055e uni055E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+055f uni055F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0561 uni0561 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0562 uni0562 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0563 uni0563 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0564 uni0564 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0565 uni0565 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0566 uni0566 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0567 uni0567 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0568 uni0568 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0569 uni0569 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056a uni056A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056b uni056B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+056c uni056C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+056d uni056D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+056e uni056E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+056f uni056F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0570 uni0570 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0571 uni0571 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0572 uni0572 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0573 uni0573 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0574 uni0574 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0575 uni0575 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0576 uni0576 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0577 uni0577 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0578 uni0578 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0579 uni0579 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+057a uni057A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+057b uni057B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+057c uni057C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+057d uni057D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+057e uni057E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+057f uni057F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0580 uni0580 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0581 uni0581 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0582 uni0582 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0583 uni0583 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0584 uni0584 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0585 uni0585 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0586 uni0586 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0587 uni0587 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+0589 uni0589 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+058a uni058A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b0 uni05B0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b1 uni05B1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b2 uni05B2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b3 uni05B3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b4 uni05B4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b5 uni05B5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b6 uni05B6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b7 uni05B7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b8 uni05B8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05b9 uni05B9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05ba uni05BA 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+05bb uni05BB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05bc uni05BC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05bd uni05BD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05be uni05BE 2.9 (Sans Condensed Oblique, Sans Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) -U+05bf uni05BF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c0 uni05C0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c1 uni05C1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c2 uni05C2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c3 uni05C3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c6 uni05C6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05c7 uni05C7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d0 uni05D0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d1 uni05D1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d2 uni05D2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d3 uni05D3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d4 uni05D4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d5 uni05D5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d6 uni05D6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d7 uni05D7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d8 uni05D8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05d9 uni05D9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05da uni05DA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05db uni05DB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05dc uni05DC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05dd uni05DD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05de uni05DE 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05df uni05DF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e0 uni05E0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e1 uni05E1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e2 uni05E2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e3 uni05E3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e4 uni05E4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e5 uni05E5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e6 uni05E6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e7 uni05E7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e8 uni05E8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05e9 uni05E9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05ea uni05EA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05f0 uni05F0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05f1 uni05F1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05f2 uni05F2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+05f3 uni05F3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+05f4 uni05F4 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0606 uni0606 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) -U+0607 uni0607 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) -U+0609 uni0609 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) -U+060a uni060A 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) -U+060c uni060C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0615 uni0615 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+061b uni061B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+061f uni061F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0621 uni0621 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0622 uni0622 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0623 uni0623 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0624 uni0624 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0625 uni0625 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0626 uni0626 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0627 uni0627 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0628 uni0628 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0629 uni0629 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062a uni062A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062b uni062B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062c uni062C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062d uni062D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062e uni062E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+062f uni062F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0630 uni0630 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0631 uni0631 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0632 uni0632 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0633 uni0633 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0634 uni0634 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0635 uni0635 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0636 uni0636 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0637 uni0637 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0638 uni0638 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0639 uni0639 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+063a uni063A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0640 uni0640 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0641 uni0641 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0642 uni0642 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0643 uni0643 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0644 uni0644 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0645 uni0645 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0646 uni0646 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0647 uni0647 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0648 uni0648 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0649 uni0649 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064a uni064A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064b uni064B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064c uni064C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064d uni064D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064e uni064E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+064f uni064F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0650 uni0650 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0651 uni0651 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0652 uni0652 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0653 uni0653 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0654 uni0654 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0655 uni0655 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+065a uni065A 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0660 uni0660 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0661 uni0661 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0662 uni0662 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0663 uni0663 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0664 uni0664 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0665 uni0665 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0666 uni0666 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0667 uni0667 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0668 uni0668 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0669 uni0669 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066a uni066A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066b uni066B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066c uni066C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066d uni066D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066e uni066E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+066f uni066F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0674 uni0674 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight) 2.16 (Sans Mono, Sans Mono Bold) -U+0679 uni0679 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067a uni067A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067b uni067B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067c uni067C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067d uni067D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067e uni067E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+067f uni067F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0680 uni0680 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0681 uni0681 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0682 uni0682 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0683 uni0683 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0684 uni0684 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0685 uni0685 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0686 uni0686 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0687 uni0687 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0691 uni0691 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0692 uni0692 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+0695 uni0695 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+0698 uni0698 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06a1 uni06A1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06a4 uni06A4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06a6 uni06A6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+06a9 uni06A9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06af uni06AF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06b5 uni06B5 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06ba uni06BA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06be uni06BE 2.16 (Sans Mono, Sans Mono Bold) -U+06bf uni06BF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+06c6 uni06C6 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06cc uni06CC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06ce uni06CE 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06d5 uni06D5 2.10 (Sans, Sans Bold) 2.11 (Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f0 uni06F0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f1 uni06F1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f2 uni06F2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f3 uni06F3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f4 uni06F4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f5 uni06F5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f6 uni06F6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f7 uni06F7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f8 uni06F8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06f9 uni06F9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+07c0 uni07C0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c1 uni07C1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c2 uni07C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c3 uni07C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c4 uni07C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c5 uni07C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c6 uni07C6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c7 uni07C7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c8 uni07C8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07c9 uni07C9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ca uni07CA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07cb uni07CB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07cc uni07CC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07cd uni07CD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ce uni07CE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07cf uni07CF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d0 uni07D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d1 uni07D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d2 uni07D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d3 uni07D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d4 uni07D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d5 uni07D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d6 uni07D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d7 uni07D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d8 uni07D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07d9 uni07D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07da uni07DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07db uni07DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07dc uni07DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07dd uni07DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07de uni07DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07df uni07DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e0 uni07E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e1 uni07E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e2 uni07E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e3 uni07E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e4 uni07E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e5 uni07E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e6 uni07E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07e7 uni07E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07eb uni07EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ec uni07EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ed uni07ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ee uni07EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07ef uni07EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f0 uni07F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f1 uni07F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f2 uni07F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f3 uni07F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f4 uni07F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f5 uni07F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f8 uni07F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07f9 uni07F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+07fa uni07FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+0e3f uni0E3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0e81 uni0E81 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e82 uni0E82 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e84 uni0E84 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e87 uni0E87 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e88 uni0E88 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e8a uni0E8A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e8d uni0E8D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e94 uni0E94 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e95 uni0E95 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e96 uni0E96 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e97 uni0E97 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e99 uni0E99 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9a uni0E9A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9b uni0E9B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9c uni0E9C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9d uni0E9D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9e uni0E9E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0e9f uni0E9F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea1 uni0EA1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea2 uni0EA2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea3 uni0EA3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea5 uni0EA5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ea7 uni0EA7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eaa uni0EAA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eab uni0EAB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ead uni0EAD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eae uni0EAE 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eaf uni0EAF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb0 uni0EB0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb1 uni0EB1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb2 uni0EB2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb3 uni0EB3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb4 uni0EB4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb5 uni0EB5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb6 uni0EB6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb7 uni0EB7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb8 uni0EB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eb9 uni0EB9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ebb uni0EBB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ebc uni0EBC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ebd uni0EBD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec0 uni0EC0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec1 uni0EC1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec2 uni0EC2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec3 uni0EC3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec4 uni0EC4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec6 uni0EC6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ec8 uni0EC8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ec9 uni0EC9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0eca uni0ECA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ecb uni0ECB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ecc uni0ECC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ecd uni0ECD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0ed0 uni0ED0 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed1 uni0ED1 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed2 uni0ED2 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed3 uni0ED3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed4 uni0ED4 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed5 uni0ED5 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed6 uni0ED6 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed7 uni0ED7 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0ed8 uni0ED8 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0ed9 uni0ED9 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0edc uni0EDC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+0edd uni0EDD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+10a0 uni10A0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a1 uni10A1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a2 uni10A2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a3 uni10A3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a4 uni10A4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a5 uni10A5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a6 uni10A6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a7 uni10A7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a8 uni10A8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10a9 uni10A9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10aa uni10AA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ab uni10AB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ac uni10AC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ad uni10AD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ae uni10AE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10af uni10AF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b0 uni10B0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b1 uni10B1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b2 uni10B2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b3 uni10B3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b4 uni10B4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b5 uni10B5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b6 uni10B6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b7 uni10B7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b8 uni10B8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10b9 uni10B9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ba uni10BA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10bb uni10BB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10bc uni10BC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10bd uni10BD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10be uni10BE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10bf uni10BF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c0 uni10C0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c1 uni10C1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c2 uni10C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c3 uni10C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c4 uni10C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10c5 uni10C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d0 uni10D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d1 uni10D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d2 uni10D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d3 uni10D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d4 uni10D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d5 uni10D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d6 uni10D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d7 uni10D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d8 uni10D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10d9 uni10D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10da uni10DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10db uni10DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10dc uni10DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10dd uni10DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10de uni10DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10df uni10DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e0 uni10E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e1 uni10E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e2 uni10E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e3 uni10E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e4 uni10E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e5 uni10E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e6 uni10E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e7 uni10E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e8 uni10E8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10e9 uni10E9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ea uni10EA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10eb uni10EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ec uni10EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ed uni10ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ee uni10EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10ef uni10EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f0 uni10F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f1 uni10F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f2 uni10F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f3 uni10F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f4 uni10F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f5 uni10F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f6 uni10F6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f7 uni10F7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f8 uni10F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10f9 uni10F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fa uni10FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fb uni10FB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+10fc uni10FC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+1401 uni1401 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1402 uni1402 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1403 uni1403 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1404 uni1404 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1405 uni1405 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1406 uni1406 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1407 uni1407 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1409 uni1409 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140a uni140A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140b uni140B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140c uni140C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140d uni140D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140e uni140E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+140f uni140F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1410 uni1410 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1411 uni1411 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1412 uni1412 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1413 uni1413 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1414 uni1414 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1415 uni1415 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1416 uni1416 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1417 uni1417 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1418 uni1418 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1419 uni1419 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141a uni141A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141b uni141B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141d uni141D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141e uni141E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+141f uni141F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1420 uni1420 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1421 uni1421 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1422 uni1422 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1423 uni1423 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1424 uni1424 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1425 uni1425 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1426 uni1426 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1427 uni1427 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1428 uni1428 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1429 uni1429 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142a uni142A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142b uni142B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142c uni142C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142d uni142D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142e uni142E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+142f uni142F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1430 uni1430 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1431 uni1431 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1432 uni1432 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1433 uni1433 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1434 uni1434 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1435 uni1435 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1437 uni1437 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1438 uni1438 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1439 uni1439 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143a uni143A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143b uni143B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143c uni143C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143d uni143D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143e uni143E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+143f uni143F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1440 uni1440 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1441 uni1441 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1442 uni1442 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1443 uni1443 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1444 uni1444 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1445 uni1445 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1446 uni1446 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1447 uni1447 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1448 uni1448 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1449 uni1449 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144a uni144A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144c uni144C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144d uni144D 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144e uni144E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+144f uni144F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1450 uni1450 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1451 uni1451 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1452 uni1452 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1454 uni1454 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1455 uni1455 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1456 uni1456 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1457 uni1457 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1458 uni1458 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1459 uni1459 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145a uni145A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145b uni145B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145c uni145C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145d uni145D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145e uni145E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+145f uni145F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1460 uni1460 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1461 uni1461 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1462 uni1462 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1463 uni1463 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1464 uni1464 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1465 uni1465 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1466 uni1466 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1467 uni1467 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1468 uni1468 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1469 uni1469 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146a uni146A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146b uni146B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146c uni146C 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146d uni146D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146e uni146E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+146f uni146F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1470 uni1470 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1471 uni1471 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1472 uni1472 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1473 uni1473 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1474 uni1474 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1475 uni1475 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1476 uni1476 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1477 uni1477 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1478 uni1478 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1479 uni1479 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147a uni147A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147b uni147B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147c uni147C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147d uni147D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147e uni147E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+147f uni147F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1480 uni1480 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1481 uni1481 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1482 uni1482 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1483 uni1483 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1484 uni1484 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1485 uni1485 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1486 uni1486 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1487 uni1487 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1488 uni1488 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1489 uni1489 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148a uni148A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148b uni148B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148c uni148C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148d uni148D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148e uni148E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+148f uni148F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1490 uni1490 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1491 uni1491 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1492 uni1492 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1493 uni1493 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1494 uni1494 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1495 uni1495 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1496 uni1496 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1497 uni1497 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1498 uni1498 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1499 uni1499 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149a uni149A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149b uni149B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149c uni149C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149d uni149D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149e uni149E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+149f uni149F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a0 uni14A0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a1 uni14A1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a2 uni14A2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a3 uni14A3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a4 uni14A4 2.13 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.15 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+14a5 uni14A5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a6 uni14A6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a7 uni14A7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a8 uni14A8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14a9 uni14A9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14aa uni14AA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ab uni14AB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ac uni14AC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ad uni14AD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ae uni14AE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14af uni14AF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b0 uni14B0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b1 uni14B1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b2 uni14B2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b3 uni14B3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b4 uni14B4 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b5 uni14B5 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b6 uni14B6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b7 uni14B7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b8 uni14B8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14b9 uni14B9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ba uni14BA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14bb uni14BB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14bc uni14BC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14bd uni14BD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c0 uni14C0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c1 uni14C1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c2 uni14C2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c3 uni14C3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c4 uni14C4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c5 uni14C5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c6 uni14C6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c7 uni14C7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c8 uni14C8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14c9 uni14C9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ca uni14CA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14cb uni14CB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14cc uni14CC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14cd uni14CD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ce uni14CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14cf uni14CF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d0 uni14D0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d1 uni14D1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d2 uni14D2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d3 uni14D3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d4 uni14D4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d5 uni14D5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d6 uni14D6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d7 uni14D7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d8 uni14D8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14d9 uni14D9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14da uni14DA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14db uni14DB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14dc uni14DC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14dd uni14DD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14de uni14DE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14df uni14DF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e0 uni14E0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e1 uni14E1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e2 uni14E2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e3 uni14E3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e4 uni14E4 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e5 uni14E5 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e6 uni14E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e7 uni14E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e8 uni14E8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14e9 uni14E9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ea uni14EA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ec uni14EC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ed uni14ED 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ee uni14EE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ef uni14EF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f0 uni14F0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f1 uni14F1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f2 uni14F2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f3 uni14F3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f4 uni14F4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f5 uni14F5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f6 uni14F6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f7 uni14F7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f8 uni14F8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14f9 uni14F9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fa uni14FA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fb uni14FB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fc uni14FC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fd uni14FD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14fe uni14FE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+14ff uni14FF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1500 uni1500 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1501 uni1501 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1502 uni1502 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1503 uni1503 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1504 uni1504 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1505 uni1505 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1506 uni1506 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1507 uni1507 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1510 uni1510 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1511 uni1511 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1512 uni1512 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1513 uni1513 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1514 uni1514 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1515 uni1515 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1516 uni1516 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1517 uni1517 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1518 uni1518 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1519 uni1519 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151a uni151A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151b uni151B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151c uni151C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151d uni151D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151e uni151E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+151f uni151F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1520 uni1520 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1521 uni1521 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1522 uni1522 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1523 uni1523 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1524 uni1524 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1525 uni1525 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1526 uni1526 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1527 uni1527 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1528 uni1528 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1529 uni1529 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152a uni152A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152b uni152B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152c uni152C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152d uni152D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152e uni152E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+152f uni152F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1530 uni1530 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1531 uni1531 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1532 uni1532 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1533 uni1533 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1534 uni1534 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1535 uni1535 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1536 uni1536 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1537 uni1537 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1538 uni1538 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1539 uni1539 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153a uni153A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153b uni153B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153c uni153C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153d uni153D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+153e uni153E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1540 uni1540 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1541 uni1541 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1542 uni1542 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1543 uni1543 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1544 uni1544 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1545 uni1545 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1546 uni1546 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1547 uni1547 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1548 uni1548 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1549 uni1549 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154a uni154A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154b uni154B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154c uni154C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154d uni154D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154e uni154E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+154f uni154F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1550 uni1550 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1552 uni1552 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1553 uni1553 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1554 uni1554 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1555 uni1555 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1556 uni1556 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1557 uni1557 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1558 uni1558 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1559 uni1559 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155a uni155A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155b uni155B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155c uni155C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155d uni155D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155e uni155E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+155f uni155F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1560 uni1560 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1561 uni1561 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1562 uni1562 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1563 uni1563 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1564 uni1564 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1565 uni1565 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1566 uni1566 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1567 uni1567 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1568 uni1568 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1569 uni1569 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+156a uni156A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1574 uni1574 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1575 uni1575 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1576 uni1576 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1577 uni1577 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1578 uni1578 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1579 uni1579 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157a uni157A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157b uni157B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157c uni157C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157d uni157D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157e uni157E 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+157f uni157F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1580 uni1580 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1581 uni1581 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1582 uni1582 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1583 uni1583 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1584 uni1584 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1585 uni1585 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158a uni158A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158b uni158B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158c uni158C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158d uni158D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158e uni158E 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+158f uni158F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1590 uni1590 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1591 uni1591 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1592 uni1592 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1593 uni1593 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1594 uni1594 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1595 uni1595 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1596 uni1596 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a0 uni15A0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a1 uni15A1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a2 uni15A2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a3 uni15A3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a4 uni15A4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a5 uni15A5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a6 uni15A6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a7 uni15A7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a8 uni15A8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15a9 uni15A9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15aa uni15AA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15ab uni15AB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15ac uni15AC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15ad uni15AD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15ae uni15AE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15af uni15AF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15de uni15DE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+15e1 uni15E1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1646 uni1646 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1647 uni1647 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+166e uni166E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+166f uni166F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1670 uni1670 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1671 uni1671 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1672 uni1672 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1673 uni1673 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1674 uni1674 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1675 uni1675 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1676 uni1676 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1680 uni1680 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1681 uni1681 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1682 uni1682 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1683 uni1683 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1684 uni1684 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1685 uni1685 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1686 uni1686 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1687 uni1687 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1688 uni1688 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1689 uni1689 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+168a uni168A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+168b uni168B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+168c uni168C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+168d uni168D 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+168e uni168E 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+168f uni168F 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1690 uni1690 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1691 uni1691 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1692 uni1692 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1693 uni1693 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1694 uni1694 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1695 uni1695 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1696 uni1696 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1697 uni1697 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1698 uni1698 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1699 uni1699 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+169a uni169A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+169b uni169B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+169c uni169C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) -U+1d00 uni1D00 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d01 uni1D01 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d02 uni1D02 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d03 uni1D03 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d04 uni1D04 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d05 uni1D05 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d06 uni1D06 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d07 uni1D07 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d08 uni1D08 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+1d09 uni1D09 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d0a uni1D0A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d0b uni1D0B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0c uni1D0C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d0d uni1D0D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0e uni1D0E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d0f uni1D0F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d10 uni1D10 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d11 uni1D11 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d12 uni1D12 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d13 uni1D13 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d14 uni1D14 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d16 uni1D16 2.3 -U+1d17 uni1D17 2.3 -U+1d18 uni1D18 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d19 uni1D19 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+1d1a uni1D1A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+1d1b uni1D1B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d1c uni1D1C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d1d uni1D1D 2.3 -U+1d1e uni1D1E 2.3 -U+1d1f uni1D1F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+1d20 uni1D20 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d21 uni1D21 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d22 uni1D22 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d23 uni1D23 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d26 uni1D26 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d27 uni1D27 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d28 uni1D28 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d29 uni1D29 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d2a uni1D2A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d2b uni1D2B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) -U+1d2c uni1D2C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d2d uni1D2D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d2e uni1D2E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d30 uni1D30 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d31 uni1D31 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d32 uni1D32 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d33 uni1D33 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d34 uni1D34 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d35 uni1D35 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d36 uni1D36 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d37 uni1D37 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d38 uni1D38 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d39 uni1D39 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3a uni1D3A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3b uni1D3B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3c uni1D3C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3d uni1D3D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique) -U+1d3e uni1D3E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d3f uni1D3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d40 uni1D40 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d41 uni1D41 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d42 uni1D42 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d43 uni1D43 2.3 -U+1d44 uni1D44 2.3 -U+1d45 uni1D45 2.3 -U+1d46 uni1D46 2.3 -U+1d47 uni1D47 2.3 -U+1d48 uni1D48 2.3 -U+1d49 uni1D49 2.3 -U+1d4a uni1D4A 2.3 -U+1d4b uni1D4B 2.3 -U+1d4c uni1D4C 2.3 -U+1d4d uni1D4D 2.3 -U+1d4e uni1D4E 2.3 -U+1d4f uni1D4F 2.3 -U+1d50 uni1D50 2.3 -U+1d51 uni1D51 2.3 -U+1d52 uni1D52 2.3 -U+1d53 uni1D53 2.3 -U+1d54 uni1D54 2.3 -U+1d55 uni1D55 2.3 -U+1d56 uni1D56 2.3 -U+1d57 uni1D57 2.3 -U+1d58 uni1D58 2.3 -U+1d59 uni1D59 2.3 -U+1d5a uni1D5A 2.3 -U+1d5b uni1D5B 2.3 -U+1d5d uni1D5D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d5e uni1D5E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d5f uni1D5F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d60 uni1D60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d61 uni1D61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d62 uni1D62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d63 uni1D63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d64 uni1D64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d65 uni1D65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d66 uni1D66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d67 uni1D67 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d68 uni1D68 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d69 uni1D69 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d6a uni1D6A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d77 uni1D77 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1d78 uni1D78 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1d7b uni1D7B 2.3 -U+1d85 uni1D85 2.3 -U+1d9b uni1D9B 2.3 -U+1d9c uni1D9C 2.3 -U+1d9d uni1D9D 2.3 -U+1d9e uni1D9E 2.3 -U+1d9f uni1D9F 2.3 -U+1da0 uni1DA0 2.3 -U+1da1 uni1DA1 2.3 -U+1da2 uni1DA2 2.3 -U+1da3 uni1DA3 2.3 -U+1da4 uni1DA4 2.3 -U+1da5 uni1DA5 2.3 -U+1da6 uni1DA6 2.3 -U+1da7 uni1DA7 2.3 -U+1da8 uni1DA8 2.3 -U+1da9 uni1DA9 2.3 -U+1daa uni1DAA 2.3 -U+1dab uni1DAB 2.3 -U+1dac uni1DAC 2.3 -U+1dad uni1DAD 2.3 -U+1dae uni1DAE 2.3 -U+1daf uni1DAF 2.3 -U+1db0 uni1DB0 2.3 -U+1db1 uni1DB1 2.3 -U+1db2 uni1DB2 2.3 -U+1db3 uni1DB3 2.3 -U+1db4 uni1DB4 2.3 -U+1db5 uni1DB5 2.3 -U+1db6 uni1DB6 2.3 -U+1db7 uni1DB7 2.3 -U+1db8 uni1DB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1db9 uni1DB9 2.3 -U+1dba uni1DBA 2.3 -U+1dbb uni1DBB 2.3 -U+1dbc uni1DBC 2.3 -U+1dbd uni1DBD 2.3 -U+1dbe uni1DBE 2.3 -U+1dbf uni1DBF 2.3 -U+1dc4 uni1DC4 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1dc5 uni1DC5 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1dc6 uni1DC6 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1dc7 uni1DC7 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1dc8 uni1DC8 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1dc9 uni1DC9 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1e00 uni1E00 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e01 uni1E01 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e02 uni1E02 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e03 uni1E03 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e04 uni1E04 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e05 uni1E05 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e06 uni1E06 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e07 uni1E07 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e08 uni1E08 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e09 uni1E09 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e0a uni1E0A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e0b uni1E0B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e0c uni1E0C 2.1 -U+1e0d uni1E0D 2.1 -U+1e0e uni1E0E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e0f uni1E0F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e10 uni1E10 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e11 uni1E11 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e12 uni1E12 1.13 -U+1e13 uni1E13 1.13 -U+1e14 uni1E14 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e15 uni1E15 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e16 uni1E16 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e17 uni1E17 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e18 uni1E18 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e19 uni1E19 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e1a uni1E1A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e1b uni1E1B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e1c uni1E1C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1e1d uni1E1D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+1e1e uni1E1E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e1f uni1E1F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e20 uni1E20 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e21 uni1E21 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e22 uni1E22 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e23 uni1E23 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e24 uni1E24 2.1 -U+1e25 uni1E25 2.1 -U+1e26 uni1E26 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e27 uni1E27 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e28 uni1E28 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e29 uni1E29 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2a uni1E2A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2b uni1E2B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2c uni1E2C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2d uni1E2D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e2e uni1E2E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e2f uni1E2F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e30 uni1E30 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e31 uni1E31 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e32 uni1E32 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e33 uni1E33 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e34 uni1E34 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e35 uni1E35 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e36 uni1E36 2.1 -U+1e37 uni1E37 2.1 -U+1e38 uni1E38 2.1 -U+1e39 uni1E39 2.1 -U+1e3a uni1E3A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e3b uni1E3B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e3c uni1E3C 1.13 -U+1e3d uni1E3D 1.13 -U+1e3e uni1E3E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e3f uni1E3F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e40 uni1E40 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e41 uni1E41 2.1 -U+1e42 uni1E42 2.1 -U+1e43 uni1E43 2.1 -U+1e44 uni1E44 1.13 -U+1e45 uni1E45 1.13 -U+1e46 uni1E46 2.1 -U+1e47 uni1E47 2.1 -U+1e48 uni1E48 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e49 uni1E49 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e4a uni1E4A 1.13 -U+1e4b uni1E4B 1.13 -U+1e4c uni1E4C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1e4d uni1E4D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1e4e uni1E4E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e4f uni1E4F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e50 uni1E50 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e51 uni1E51 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e52 uni1E52 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e53 uni1E53 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e54 uni1E54 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e55 uni1E55 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e56 uni1E56 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e57 uni1E57 2.1 -U+1e58 uni1E58 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e59 uni1E59 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e5a uni1E5A 2.1 -U+1e5b uni1E5B 2.1 -U+1e5c uni1E5C 2.1 -U+1e5d uni1E5D 2.1 -U+1e5e uni1E5E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e5f uni1E5F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e60 uni1E60 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e61 uni1E61 2.1 -U+1e62 uni1E62 2.1 -U+1e63 uni1E63 2.1 -U+1e64 uni1E64 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1e65 uni1E65 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1e66 uni1E66 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e67 uni1E67 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e68 uni1E68 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e69 uni1E69 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e6a uni1E6A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e6b uni1E6B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e6c uni1E6C 2.1 -U+1e6d uni1E6D 2.1 -U+1e6e uni1E6E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e6f uni1E6F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e70 uni1E70 1.13 -U+1e71 uni1E71 1.13 -U+1e72 uni1E72 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e73 uni1E73 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e74 uni1E74 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e75 uni1E75 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e76 uni1E76 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e77 uni1E77 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e78 uni1E78 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e79 uni1E79 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e7a uni1E7A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e7b uni1E7B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e7c uni1E7C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e7d uni1E7D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e7e uni1E7E 2.1 -U+1e7f uni1E7F 2.1 -U+1e80 Wgrave 1.2 -U+1e81 wgrave 1.2 -U+1e82 Wacute 1.2 -U+1e83 wacute 1.2 -U+1e84 Wdieresis 1.2 -U+1e85 wdieresis 1.2 -U+1e86 uni1E86 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e87 uni1E87 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e88 uni1E88 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e89 uni1E89 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e8a uni1E8A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e8b uni1E8B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e8c uni1E8C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e8d uni1E8D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e8e uni1E8E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e8f uni1E8F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e90 uni1E90 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e91 uni1E91 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e92 uni1E92 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e93 uni1E93 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e94 uni1E94 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e95 uni1E95 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e96 uni1E96 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e97 uni1E97 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e98 uni1E98 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e99 uni1E99 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e9a uni1E9A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1e9b uni1E9B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1e9e uni1E9E 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1e9f uni1E9F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+1ea0 uni1EA0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ea1 uni1EA1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ea2 uni1EA2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ea3 uni1EA3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ea4 uni1EA4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea5 uni1EA5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea6 uni1EA6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea7 uni1EA7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea8 uni1EA8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ea9 uni1EA9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eaa uni1EAA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eab uni1EAB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eac uni1EAC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ead uni1EAD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eae uni1EAE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eaf uni1EAF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb0 uni1EB0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1eb1 uni1EB1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1eb2 uni1EB2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb3 uni1EB3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb4 uni1EB4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb5 uni1EB5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eb6 uni1EB6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eb7 uni1EB7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eb8 uni1EB8 2.2 -U+1eb9 uni1EB9 2.2 -U+1eba uni1EBA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ebb uni1EBB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ebc uni1EBC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ebd uni1EBD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ebe uni1EBE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ebf uni1EBF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec0 uni1EC0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec1 uni1EC1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec2 uni1EC2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec3 uni1EC3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec4 uni1EC4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec5 uni1EC5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec6 uni1EC6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ec7 uni1EC7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ec8 uni1EC8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ec9 uni1EC9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1eca uni1ECA 2.2 -U+1ecb uni1ECB 2.2 -U+1ecc uni1ECC 2.2 -U+1ecd uni1ECD 2.2 -U+1ece uni1ECE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ecf uni1ECF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ed0 uni1ED0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed1 uni1ED1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed2 uni1ED2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed3 uni1ED3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed4 uni1ED4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed5 uni1ED5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed6 uni1ED6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed7 uni1ED7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed8 uni1ED8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ed9 uni1ED9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eda uni1EDA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edb uni1EDB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edc uni1EDC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1edd uni1EDD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ede uni1EDE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1edf uni1EDF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ee0 uni1EE0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee1 uni1EE1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee2 uni1EE2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee3 uni1EE3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee4 uni1EE4 2.2 -U+1ee5 uni1EE5 2.2 -U+1ee6 uni1EE6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ee7 uni1EE7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ee8 uni1EE8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ee9 uni1EE9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eea uni1EEA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eeb uni1EEB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eec uni1EEC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eed uni1EED 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eee uni1EEE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1eef uni1EEF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef0 uni1EF0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef1 uni1EF1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef2 Ygrave 1.2 -U+1ef3 ygrave 1.2 -U+1ef4 uni1EF4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ef5 uni1EF5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ef6 uni1EF6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ef7 uni1EF7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ef8 uni1EF8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ef9 uni1EF9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f00 uni1F00 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f01 uni1F01 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f02 uni1F02 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f03 uni1F03 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f04 uni1F04 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f05 uni1F05 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f06 uni1F06 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f07 uni1F07 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f08 uni1F08 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f09 uni1F09 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0a uni1F0A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0b uni1F0B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0c uni1F0C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0d uni1F0D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0e uni1F0E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f0f uni1F0F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f10 uni1F10 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f11 uni1F11 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f12 uni1F12 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f13 uni1F13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f14 uni1F14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f15 uni1F15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f18 uni1F18 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f19 uni1F19 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f1a uni1F1A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f1b uni1F1B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f1c uni1F1C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f1d uni1F1D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f20 uni1F20 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f21 uni1F21 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f22 uni1F22 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f23 uni1F23 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f24 uni1F24 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f25 uni1F25 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f26 uni1F26 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f27 uni1F27 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f28 uni1F28 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f29 uni1F29 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2a uni1F2A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2b uni1F2B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2c uni1F2C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2d uni1F2D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2e uni1F2E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f2f uni1F2F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f30 uni1F30 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f31 uni1F31 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f32 uni1F32 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f33 uni1F33 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f34 uni1F34 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f35 uni1F35 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f36 uni1F36 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f37 uni1F37 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f38 uni1F38 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f39 uni1F39 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3a uni1F3A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3b uni1F3B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3c uni1F3C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3d uni1F3D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3e uni1F3E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f3f uni1F3F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f40 uni1F40 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f41 uni1F41 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f42 uni1F42 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f43 uni1F43 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f44 uni1F44 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f45 uni1F45 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f48 uni1F48 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f49 uni1F49 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f4a uni1F4A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f4b uni1F4B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f4c uni1F4C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f4d uni1F4D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f50 uni1F50 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f51 uni1F51 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f52 uni1F52 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f53 uni1F53 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f54 uni1F54 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f55 uni1F55 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f56 uni1F56 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f57 uni1F57 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f59 uni1F59 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f5b uni1F5B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f5d uni1F5D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f5f uni1F5F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f60 uni1F60 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f61 uni1F61 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f62 uni1F62 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f63 uni1F63 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f64 uni1F64 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f65 uni1F65 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f66 uni1F66 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f67 uni1F67 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f68 uni1F68 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f69 uni1F69 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6a uni1F6A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6b uni1F6B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6c uni1F6C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6d uni1F6D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6e uni1F6E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f6f uni1F6F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f70 uni1F70 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f71 uni1F71 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f72 uni1F72 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f73 uni1F73 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f74 uni1F74 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f75 uni1F75 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f76 uni1F76 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f77 uni1F77 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f78 uni1F78 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f79 uni1F79 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1f7a uni1F7A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f7b uni1F7B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f7c uni1F7C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f7d uni1F7D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f80 uni1F80 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f81 uni1F81 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f82 uni1F82 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f83 uni1F83 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f84 uni1F84 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f85 uni1F85 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f86 uni1F86 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f87 uni1F87 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f88 uni1F88 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f89 uni1F89 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8a uni1F8A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8b uni1F8B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8c uni1F8C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8d uni1F8D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8e uni1F8E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f8f uni1F8F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f90 uni1F90 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f91 uni1F91 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f92 uni1F92 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f93 uni1F93 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f94 uni1F94 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f95 uni1F95 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f96 uni1F96 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f97 uni1F97 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f98 uni1F98 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f99 uni1F99 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9a uni1F9A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9b uni1F9B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9c uni1F9C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9d uni1F9D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9e uni1F9E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1f9f uni1F9F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa0 uni1FA0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa1 uni1FA1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa2 uni1FA2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa3 uni1FA3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa4 uni1FA4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa5 uni1FA5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa6 uni1FA6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa7 uni1FA7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa8 uni1FA8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fa9 uni1FA9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1faa uni1FAA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fab uni1FAB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fac uni1FAC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fad uni1FAD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fae uni1FAE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1faf uni1FAF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb0 uni1FB0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb1 uni1FB1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb2 uni1FB2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb3 uni1FB3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb4 uni1FB4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb6 uni1FB6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb7 uni1FB7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fb8 uni1FB8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fb9 uni1FB9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fba uni1FBA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fbb uni1FBB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fbc uni1FBC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fbd uni1FBD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fbe uni1FBE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fbf uni1FBF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc0 uni1FC0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fc1 uni1FC1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fc2 uni1FC2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc3 uni1FC3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc4 uni1FC4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc6 uni1FC6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fc7 uni1FC7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fc8 uni1FC8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fc9 uni1FC9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fca uni1FCA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fcb uni1FCB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fcc uni1FCC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fcd uni1FCD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fce uni1FCE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fcf uni1FCF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd0 uni1FD0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd1 uni1FD1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd2 uni1FD2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd3 uni1FD3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd6 uni1FD6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd7 uni1FD7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fd8 uni1FD8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fd9 uni1FD9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fda uni1FDA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fdb uni1FDB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fdd uni1FDD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fde uni1FDE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fdf uni1FDF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe0 uni1FE0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe1 uni1FE1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe2 uni1FE2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe3 uni1FE3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe4 uni1FE4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe5 uni1FE5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe6 uni1FE6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe7 uni1FE7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fe8 uni1FE8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fe9 uni1FE9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fea uni1FEA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1feb uni1FEB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fec uni1FEC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1fed uni1FED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fee uni1FEE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1fef uni1FEF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ff2 uni1FF2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff3 uni1FF3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff4 uni1FF4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff6 uni1FF6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff7 uni1FF7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ff8 uni1FF8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ff9 uni1FF9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ffa uni1FFA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ffb uni1FFB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ffc uni1FFC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+1ffd uni1FFD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+1ffe uni1FFE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+2000 uni2000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2001 uni2001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2002 uni2002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2003 uni2003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2004 uni2004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2005 uni2005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2006 uni2006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2007 uni2007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2008 uni2008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2009 uni2009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+200a uni200A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+200b uni200B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+200c uni200C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+200d uni200D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+200e uni200E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+200f uni200F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2010 uni2010 1.5 -U+2011 uni2011 1.5 -U+2012 figuredash 1.5 -U+2013 endash original -U+2014 emdash original -U+2015 uni2015 1.5 -U+2016 uni2016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2017 underscoredbl 2.3 -U+2018 quoteleft original -U+2019 quoteright original -U+201a quotesinglbase original -U+201b quotereversed 2.3 -U+201c quotedblleft original -U+201d quotedblright original -U+201e quotedblbase original -U+201f uni201F 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+2020 dagger original -U+2021 daggerdbl original -U+2022 bullet original -U+2023 uni2023 2.2 -U+2024 onedotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2025 twodotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2026 ellipsis original -U+2027 uni2027 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+202a uni202A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202b uni202B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202c uni202C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202d uni202D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202e uni202E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+202f uni202F 2.11 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) -U+2030 perthousand original -U+2031 uni2031 2.1 -U+2032 minute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2033 second 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2034 uni2034 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2035 uni2035 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2036 uni2036 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2037 uni2037 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2038 uni2038 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2039 guilsinglleft original -U+203a guilsinglright original -U+203b uni203B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+203c exclamdbl 2.0 -U+203d uni203D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+203e uni203E 2.3 -U+203f uni203F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2040 uni2040 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2041 uni2041 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2042 uni2042 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2043 uni2043 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2044 fraction 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2045 uni2045 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2046 uni2046 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2047 uni2047 2.0 -U+2048 uni2048 2.0 -U+2049 uni2049 2.0 -U+204a uni204A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+204b uni204B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+204c uni204C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+204d uni204D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+204e uni204E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+204f uni204F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2050 uni2050 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2051 uni2051 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2052 uni2052 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2053 uni2053 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2054 uni2054 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2055 uni2055 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2056 uni2056 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2057 uni2057 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2058 uni2058 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2059 uni2059 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205a uni205A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205b uni205B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205c uni205C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205d uni205D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205e uni205E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+205f uni205F 2.14 -U+2060 uni2060 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2061 uni2061 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2062 uni2062 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2063 uni2063 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2064 uni2064 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+206a uni206A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206b uni206B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206c uni206C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206d uni206D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206e uni206E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+206f uni206F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2070 uni2070 2.2 -U+2071 uni2071 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2074 uni2074 2.2 -U+2075 uni2075 2.2 -U+2076 uni2076 2.2 -U+2077 uni2077 2.2 -U+2078 uni2078 2.2 -U+2079 uni2079 2.2 -U+207a uni207A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207b uni207B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207c uni207C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207d uni207D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207e uni207E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+207f uni207F 1.14 -U+2080 uni2080 2.4 -U+2081 uni2081 2.4 -U+2082 uni2082 2.4 -U+2083 uni2083 2.4 -U+2084 uni2084 2.4 -U+2085 uni2085 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2086 uni2086 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2087 uni2087 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2088 uni2088 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2089 uni2089 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+208a uni208A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+208b uni208B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+208c uni208C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+208d uni208D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+208e uni208E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2090 uni2090 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2091 uni2091 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2092 uni2092 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2093 uni2093 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2094 uni2094 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+20a0 uni20A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a1 colonmonetary 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a2 uni20A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a3 franc 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a4 lira 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a5 uni20A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a6 uni20A6 2.3 -U+20a7 peseta 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a8 uni20A8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20a9 uni20A9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20aa uni20AA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20ab dong 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20ac Euro original -U+20ad uni20AD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20ae uni20AE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20af uni20AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20b0 uni20B0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20b1 uni20B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+20b2 uni20B2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20b3 uni20B3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+20b4 uni20B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+20b5 uni20B5 2.2 -U+20d0 uni20D0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+20d1 uni20D1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+20d6 uni20D6 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20d7 uni20D7 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20db uni20DB 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20dc uni20DC 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20e1 uni20E1 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2100 uni2100 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2101 uni2101 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2102 uni2102 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.16 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Condensed) -U+2103 uni2103 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2104 uni2104 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2105 uni2105 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2106 uni2106 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2107 uni2107 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2108 uni2108 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2109 uni2109 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+210b uni210B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+210c uni210C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+210d uni210D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+210e uni210E 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) -U+210f uni210F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.28 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2110 uni2110 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2111 Ifraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2112 uni2112 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2113 uni2113 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2114 uni2114 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2115 uni2115 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2116 uni2116 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2117 uni2117 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2118 weierstrass 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2119 uni2119 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+211a uni211A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+211b uni211B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+211c Rfraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+211d uni211D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+211e prescription 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+211f uni211F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2120 uni2120 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2121 uni2121 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2122 trademark original -U+2123 uni2123 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2124 uni2124 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2125 uni2125 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2126 uni2126 2.2 -U+2127 uni2127 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2128 uni2128 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2129 uni2129 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+212a uni212A 2.2 -U+212b uni212B 2.2 -U+212c uni212C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+212d uni212D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+212e estimated 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+212f uni212F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2130 uni2130 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2131 uni2131 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2132 uni2132 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+2133 uni2133 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2134 uni2134 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2135 aleph 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2136 uni2136 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2137 uni2137 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2138 uni2138 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2139 uni2139 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+213a uni213A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+213b uni213B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+213c uni213C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+213d uni213D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+213e uni213E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+213f uni213F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2140 uni2140 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2141 uni2141 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2142 uni2142 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2143 uni2143 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2144 uni2144 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2145 uni2145 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2146 uni2146 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2147 uni2147 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2148 uni2148 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+2149 uni2149 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) -U+214b uni214B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+214e uni214E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2153 onethird 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2154 twothirds 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2155 uni2155 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2156 uni2156 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2157 uni2157 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2158 uni2158 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2159 uni2159 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215a uni215A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215b oneeighth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215c threeeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215d fiveeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215e seveneighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+215f uni215F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2160 uni2160 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2161 uni2161 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2162 uni2162 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2163 uni2163 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2164 uni2164 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2165 uni2165 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2166 uni2166 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2167 uni2167 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2168 uni2168 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2169 uni2169 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216a uni216A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216b uni216B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216c uni216C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216d uni216D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216e uni216E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+216f uni216F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2170 uni2170 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2171 uni2171 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2172 uni2172 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2173 uni2173 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2174 uni2174 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2175 uni2175 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2176 uni2176 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2177 uni2177 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2178 uni2178 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2179 uni2179 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217a uni217A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217b uni217B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217c uni217C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217d uni217D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217e uni217E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+217f uni217F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2180 uni2180 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2181 uni2181 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2182 uni2182 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2183 uni2183 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2184 uni2184 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2190 arrowleft 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2191 arrowup 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2192 arrowright 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2193 arrowdown 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2194 arrowboth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2195 arrowupdn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2196 uni2196 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2197 uni2197 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2198 uni2198 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2199 uni2199 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219a uni219A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219b uni219B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219c uni219C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219d uni219D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219e uni219E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+219f uni219F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a0 uni21A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a1 uni21A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a2 uni21A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a3 uni21A3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a4 uni21A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a5 uni21A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a6 uni21A6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a7 uni21A7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a8 arrowupdnbse 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21a9 uni21A9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21aa uni21AA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ab uni21AB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ac uni21AC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ad uni21AD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ae uni21AE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21af uni21AF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b0 uni21B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b1 uni21B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b2 uni21B2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b3 uni21B3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b4 uni21B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b5 carriagereturn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b6 uni21B6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b7 uni21B7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b8 uni21B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21b9 uni21B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ba uni21BA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21bb uni21BB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21bc uni21BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21bd uni21BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21be uni21BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21bf uni21BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c0 uni21C0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c1 uni21C1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c2 uni21C2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c3 uni21C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c4 uni21C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c5 uni21C5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c6 uni21C6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c7 uni21C7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c8 uni21C8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21c9 uni21C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ca uni21CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21cb uni21CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21cc uni21CC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21cd uni21CD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ce uni21CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21cf uni21CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d0 arrowdblleft 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d1 arrowdblup 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d2 arrowdblright 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d3 arrowdbldown 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d4 arrowdblboth 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d5 uni21D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d6 uni21D6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d7 uni21D7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d8 uni21D8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21d9 uni21D9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21da uni21DA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21db uni21DB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21dc uni21DC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21dd uni21DD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21de uni21DE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21df uni21DF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e0 uni21E0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e1 uni21E1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e2 uni21E2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e3 uni21E3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e4 uni21E4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e5 uni21E5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e6 uni21E6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e7 uni21E7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e8 uni21E8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21e9 uni21E9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ea uni21EA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21eb uni21EB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ec uni21EC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ed uni21ED 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ee uni21EE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ef uni21EF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f0 uni21F0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f1 uni21F1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f2 uni21F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f3 uni21F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f4 uni21F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f5 uni21F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f6 uni21F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f7 uni21F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f8 uni21F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21f9 uni21F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fa uni21FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fb uni21FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fc uni21FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fd uni21FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21fe uni21FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+21ff uni21FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2200 universal 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2201 uni2201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2202 partialdiff original -U+2203 existential 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2204 uni2204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2205 emptyset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2206 Delta original -U+2207 gradient 2.1 -U+2208 element 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2209 notelement 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+220a uni220A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+220b suchthat 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+220c uni220C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+220d uni220D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+220e uni220E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+220f product original -U+2210 uni2210 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2211 summation original -U+2212 minus original -U+2213 uni2213 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2214 uni2214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2215 uni2215 original -U+2216 uni2216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2217 asteriskmath 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2218 uni2218 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2219 uni2219 original -U+221a radical original -U+221b uni221B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+221c uni221C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+221d proportional 2.1 -U+221e infinity original -U+221f orthogonal 2.1 -U+2220 angle 2.3 -U+2221 uni2221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2222 uni2222 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2223 uni2223 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2224 uni2224 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2225 uni2225 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2226 uni2226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2227 logicaland 2.1 -U+2228 logicalor 2.1 -U+2229 intersection 2.1 -U+222a union 2.1 -U+222b integral original -U+222c uni222C 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+222d uni222D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+222e uni222E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+222f uni222F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2230 uni2230 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2231 uni2231 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2232 uni2232 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2233 uni2233 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2234 therefore 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2235 uni2235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2236 uni2236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2237 uni2237 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2238 uni2238 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2239 uni2239 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223a uni223A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223b uni223B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223c similar 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223d uni223D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+223e uni223E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+223f uni223F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2240 uni2240 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2241 uni2241 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2242 uni2242 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2243 uni2243 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2244 uni2244 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2245 congruent 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2246 uni2246 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2247 uni2247 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2248 approxequal original -U+2249 uni2249 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224a uni224A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224b uni224B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224c uni224C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224d uni224D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224e uni224E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+224f uni224F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2250 uni2250 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2251 uni2251 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2252 uni2252 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2253 uni2253 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2254 uni2254 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2255 uni2255 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2256 uni2256 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2257 uni2257 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2258 uni2258 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2259 uni2259 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225a uni225A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225b uni225B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225c uni225C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225d uni225D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225e uni225E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+225f uni225F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2260 notequal original -U+2261 equivalence 2.1 -U+2262 uni2262 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2263 uni2263 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2264 lessequal original -U+2265 greaterequal original -U+2266 uni2266 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2267 uni2267 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2268 uni2268 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2269 uni2269 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+226a uni226A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+226b uni226B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+226c uni226C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+226d uni226D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+226e uni226E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+226f uni226F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2270 uni2270 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2271 uni2271 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2272 uni2272 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2273 uni2273 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2274 uni2274 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2275 uni2275 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2276 uni2276 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2277 uni2277 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2278 uni2278 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2279 uni2279 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227a uni227A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227b uni227B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227c uni227C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227d uni227D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227e uni227E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+227f uni227F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2280 uni2280 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2281 uni2281 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2282 propersubset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2283 propersuperset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2284 notsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2285 uni2285 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2286 reflexsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2287 reflexsuperset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2288 uni2288 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2289 uni2289 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+228a uni228A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+228b uni228B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+228c uni228C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+228d uni228D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+228e uni228E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+228f uni228F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2290 uni2290 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2291 uni2291 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2292 uni2292 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2293 uni2293 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2294 uni2294 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2295 circleplus 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2296 uni2296 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2297 circlemultiply 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2298 uni2298 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2299 uni2299 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229a uni229A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229b uni229B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229c uni229C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229d uni229D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229e uni229E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+229f uni229F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a0 uni22A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a1 uni22A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a2 uni22A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a3 uni22A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a4 uni22A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a5 perpendicular 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a6 uni22A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a7 uni22A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a8 uni22A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22a9 uni22A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22aa uni22AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22ab uni22AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22ac uni22AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22ad uni22AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22ae uni22AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22af uni22AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22b0 uni22B0 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b1 uni22B1 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b2 uni22B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b3 uni22B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b4 uni22B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b5 uni22B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b6 uni22B6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b7 uni22B7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b8 uni22B8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22b9 uni22B9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ba uni22BA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22bb uni22BB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22bc uni22BC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22bd uni22BD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22be uni22BE 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+22bf uni22BF 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+22c0 uni22C0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c1 uni22C1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c2 uni22C2 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c3 uni22C3 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c4 uni22C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c5 dotmath 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+22c6 uni22C6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+22c7 uni22C7 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c8 uni22C8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c9 uni22C9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ca uni22CA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22cb uni22CB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22cc uni22CC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22cd uni22CD 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22ce uni22CE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22cf uni22CF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d0 uni22D0 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d1 uni22D1 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d2 uni22D2 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d3 uni22D3 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d4 uni22D4 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d5 uni22D5 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d6 uni22D6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d7 uni22D7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22d8 uni22D8 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22d9 uni22D9 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22da uni22DA 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22db uni22DB 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+22dc uni22DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22dd uni22DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22de uni22DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22df uni22DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e0 uni22E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e1 uni22E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e2 uni22E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e3 uni22E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e4 uni22E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e5 uni22E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e6 uni22E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e7 uni22E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e8 uni22E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22e9 uni22E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+22ea uni22EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22eb uni22EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ec uni22EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ed uni22ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ee uni22EE 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ef uni22EF 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f0 uni22F0 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f1 uni22F1 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f2 uni22F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f3 uni22F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f4 uni22F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f5 uni22F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f6 uni22F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f7 uni22F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f8 uni22F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22f9 uni22F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fa uni22FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fb uni22FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fc uni22FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fd uni22FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22fe uni22FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ff uni22FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2300 uni2300 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2301 uni2301 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2302 house 1.14 -U+2303 uni2303 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2304 uni2304 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2305 uni2305 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2306 uni2306 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2307 uni2307 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2308 uni2308 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2309 uni2309 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+230a uni230A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+230b uni230B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+230c uni230C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+230d uni230D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+230e uni230E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+230f uni230F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2310 revlogicalnot 1.14 -U+2311 uni2311 1.15 -U+2312 uni2312 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2313 uni2313 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2314 uni2314 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2315 uni2315 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2318 uni2318 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2319 uni2319 1.14 -U+231c uni231C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+231d uni231D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+231e uni231E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+231f uni231F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2320 integraltp 2.3 -U+2321 integralbt 2.3 -U+2324 uni2324 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.19 (Sans Condensed Oblique, Sans Oblique) -U+2325 uni2325 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2326 uni2326 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2327 uni2327 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2328 uni2328 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2329 angleleft 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+232a angleright 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+232b uni232B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+232c uni232C 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2335 uni2335 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2337 uni2337 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2338 uni2338 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2339 uni2339 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233a uni233A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233b uni233B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233c uni233C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233d uni233D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+233e uni233E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2341 uni2341 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2342 uni2342 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2343 uni2343 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2344 uni2344 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2347 uni2347 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2348 uni2348 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2349 uni2349 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+234b uni234B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+234c uni234C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+234d uni234D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2350 uni2350 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2352 uni2352 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2353 uni2353 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2354 uni2354 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2357 uni2357 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2358 uni2358 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2359 uni2359 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235a uni235A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235b uni235B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235c uni235C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235e uni235E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+235f uni235F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2360 uni2360 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2363 uni2363 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2364 uni2364 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2365 uni2365 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2368 uni2368 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2369 uni2369 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236b uni236B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236c uni236C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236d uni236D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236e uni236E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+236f uni236F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2370 uni2370 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2373 uni2373 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2374 uni2374 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2375 uni2375 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2376 uni2376 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2377 uni2377 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2378 uni2378 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2379 uni2379 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+237a uni237A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+237d uni237D 1.15 -U+2380 uni2380 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2381 uni2381 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2382 uni2382 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2383 uni2383 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2387 uni2387 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2388 uni2388 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2389 uni2389 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+238a uni238A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+238b uni238B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2394 uni2394 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2395 uni2395 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+239b uni239B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239c uni239C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239d uni239D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239e uni239E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+239f uni239F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a0 uni23A0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a1 uni23A1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a2 uni23A2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a3 uni23A3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a4 uni23A4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a5 uni23A5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a6 uni23A6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a7 uni23A7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a8 uni23A8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23a9 uni23A9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23aa uni23AA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ab uni23AB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ac uni23AC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ad uni23AD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23ae uni23AE 2.3 -U+23ce uni23CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+23cf uni23CF 2.3 -U+23e3 uni23E3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+23e5 uni23E5 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2422 uni2422 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2423 uni2423 1.6 -U+2460 uni2460 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2461 uni2461 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2462 uni2462 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2463 uni2463 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2464 uni2464 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2465 uni2465 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2466 uni2466 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2467 uni2467 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2468 uni2468 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2469 uni2469 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2500 SF100000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2501 uni2501 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2502 SF110000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2503 uni2503 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2504 uni2504 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2505 uni2505 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2506 uni2506 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2507 uni2507 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2508 uni2508 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2509 uni2509 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250a uni250A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250b uni250B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250c SF010000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250d uni250D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250e uni250E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+250f uni250F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2510 SF030000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2511 uni2511 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2512 uni2512 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2513 uni2513 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2514 SF020000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2515 uni2515 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2516 uni2516 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2517 uni2517 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2518 SF040000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2519 uni2519 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251a uni251A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251b uni251B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251c SF080000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251d uni251D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251e uni251E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+251f uni251F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2520 uni2520 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2521 uni2521 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2522 uni2522 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2523 uni2523 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2524 SF090000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2525 uni2525 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2526 uni2526 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2527 uni2527 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2528 uni2528 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2529 uni2529 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252a uni252A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252b uni252B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252c SF060000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252d uni252D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252e uni252E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+252f uni252F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2530 uni2530 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2531 uni2531 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2532 uni2532 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2533 uni2533 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2534 SF070000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2535 uni2535 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2536 uni2536 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2537 uni2537 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2538 uni2538 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2539 uni2539 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253a uni253A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253b uni253B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253c SF050000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253d uni253D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253e uni253E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+253f uni253F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2540 uni2540 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2541 uni2541 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2542 uni2542 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2543 uni2543 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2544 uni2544 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2545 uni2545 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2546 uni2546 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2547 uni2547 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2548 uni2548 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2549 uni2549 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254a uni254A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254b uni254B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254c uni254C 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254d uni254D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254e uni254E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+254f uni254F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2550 SF430000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2551 SF240000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2552 SF510000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2553 SF520000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2554 SF390000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2555 SF220000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2556 SF210000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2557 SF250000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2558 SF500000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2559 SF490000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255a SF380000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255b SF280000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255c SF270000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255d SF260000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255e SF360000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+255f SF370000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2560 SF420000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2561 SF190000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2562 SF200000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2563 SF230000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2564 SF470000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2565 SF480000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2566 SF410000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2567 SF450000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2568 SF460000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2569 SF400000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256a SF540000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256b SF530000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256c SF440000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256d uni256D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256e uni256E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+256f uni256F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2570 uni2570 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2571 uni2571 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2572 uni2572 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2573 uni2573 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2574 uni2574 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2575 uni2575 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2576 uni2576 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2577 uni2577 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2578 uni2578 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2579 uni2579 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257a uni257A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257b uni257B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257c uni257C 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257d uni257D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257e uni257E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+257f uni257F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2580 upblock 1.14 -U+2581 uni2581 1.14 -U+2582 uni2582 1.14 -U+2583 uni2583 1.14 -U+2584 dnblock 1.14 -U+2585 uni2585 1.14 -U+2586 uni2586 1.14 -U+2587 uni2587 1.14 -U+2588 block 1.14 -U+2589 uni2589 1.14 -U+258a uni258A 1.14 -U+258b uni258B 1.14 -U+258c lfblock 1.14 -U+258d uni258D 1.14 -U+258e uni258E 1.14 -U+258f uni258F 1.14 -U+2590 rtblock 1.14 -U+2591 ltshade 1.15 -U+2592 shade 1.15 -U+2593 dkshade 1.15 -U+2594 uni2594 1.14 -U+2595 uni2595 1.14 -U+2596 uni2596 1.14 -U+2597 uni2597 1.14 -U+2598 uni2598 1.14 -U+2599 uni2599 1.14 -U+259a uni259A 1.14 -U+259b uni259B 1.14 -U+259c uni259C 1.14 -U+259d uni259D 1.14 -U+259e uni259E 1.14 -U+259f uni259F 1.14 -U+25a0 filledbox 2.3 -U+25a1 H22073 2.3 -U+25a2 uni25A2 2.3 -U+25a3 uni25A3 2.3 -U+25a4 uni25A4 2.3 -U+25a5 uni25A5 2.3 -U+25a6 uni25A6 2.3 -U+25a7 uni25A7 2.3 -U+25a8 uni25A8 2.3 -U+25a9 uni25A9 2.3 -U+25aa H18543 2.3 -U+25ab H18551 2.3 -U+25ac filledrect 2.3 -U+25ad uni25AD 2.3 -U+25ae uni25AE 2.3 -U+25af uni25AF 2.3 -U+25b0 uni25B0 2.3 -U+25b1 uni25B1 2.3 -U+25b2 triagup 2.3 -U+25b3 uni25B3 2.3 -U+25b4 uni25B4 2.3 -U+25b5 uni25B5 2.3 -U+25b6 uni25B6 2.3 -U+25b7 uni25B7 2.3 -U+25b8 uni25B8 2.3 -U+25b9 uni25B9 2.3 -U+25ba triagrt 2.3 -U+25bb uni25BB 2.3 -U+25bc triagdn 2.3 -U+25bd uni25BD 2.3 -U+25be uni25BE 2.3 -U+25bf uni25BF 2.3 -U+25c0 uni25C0 2.3 -U+25c1 uni25C1 2.3 -U+25c2 uni25C2 2.3 -U+25c3 uni25C3 2.3 -U+25c4 triaglf 2.3 -U+25c5 uni25C5 2.3 -U+25c6 uni25C6 2.3 -U+25c7 uni25C7 2.3 -U+25c8 uni25C8 2.3 -U+25c9 uni25C9 2.3 -U+25ca lozenge original -U+25cb circle 2.3 -U+25cc uni25CC 2.3 -U+25cd uni25CD 2.3 -U+25ce uni25CE 2.3 -U+25cf H18533 2.3 -U+25d0 uni25D0 2.3 -U+25d1 uni25D1 2.3 -U+25d2 uni25D2 2.3 -U+25d3 uni25D3 2.3 -U+25d4 uni25D4 2.3 -U+25d5 uni25D5 2.3 -U+25d6 uni25D6 2.3 -U+25d7 uni25D7 2.3 -U+25d8 invbullet 2.2 -U+25d9 invcircle 2.3 -U+25da uni25DA 2.3 -U+25db uni25DB 2.3 -U+25dc uni25DC 2.3 -U+25dd uni25DD 2.3 -U+25de uni25DE 2.3 -U+25df uni25DF 2.3 -U+25e0 uni25E0 2.3 -U+25e1 uni25E1 2.3 -U+25e2 uni25E2 2.3 -U+25e3 uni25E3 2.3 -U+25e4 uni25E4 2.3 -U+25e5 uni25E5 2.3 -U+25e6 openbullet 2.2 -U+25e7 uni25E7 2.3 -U+25e8 uni25E8 2.3 -U+25e9 uni25E9 2.3 -U+25ea uni25EA 2.3 -U+25eb uni25EB 2.3 -U+25ec uni25EC 2.3 -U+25ed uni25ED 2.3 -U+25ee uni25EE 2.3 -U+25ef uni25EF 2.3 -U+25f0 uni25F0 2.3 -U+25f1 uni25F1 2.3 -U+25f2 uni25F2 2.3 -U+25f3 uni25F3 2.3 -U+25f4 uni25F4 2.3 -U+25f5 uni25F5 2.3 -U+25f6 uni25F6 2.3 -U+25f7 uni25F7 2.3 -U+25f8 uni25F8 2.3 -U+25f9 uni25F9 2.3 -U+25fa uni25FA 2.3 -U+25fb uni25FB 2.3 -U+25fc uni25FC 2.3 -U+25fd uni25FD 2.3 -U+25fe uni25FE 2.3 -U+25ff uni25FF 2.3 -U+2600 uni2600 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2601 uni2601 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2602 uni2602 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2603 uni2603 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2604 uni2604 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2605 uni2605 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2606 uni2606 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2607 uni2607 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2608 uni2608 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2609 uni2609 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260a uni260A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260b uni260B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260c uni260C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260d uni260D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260e uni260E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+260f uni260F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2610 uni2610 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2611 uni2611 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2612 uni2612 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2613 uni2613 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2614 uni2614 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2615 uni2615 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2616 uni2616 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2617 uni2617 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2618 uni2618 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2619 uni2619 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261a uni261A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261b uni261B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261c uni261C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261d uni261D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261e uni261E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+261f uni261F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2620 uni2620 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2621 uni2621 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2622 uni2622 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2623 uni2623 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2624 uni2624 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2625 uni2625 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2626 uni2626 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2627 uni2627 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2628 uni2628 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2629 uni2629 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262a uni262A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262b uni262B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262c uni262C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262d uni262D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262e uni262E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+262f uni262F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2630 uni2630 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2631 uni2631 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2632 uni2632 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2633 uni2633 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2634 uni2634 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2635 uni2635 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2636 uni2636 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2637 uni2637 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2638 uni2638 1.15 -U+2639 uni2639 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+263a smileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+263b invsmileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+263c sun 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+263d uni263D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+263e uni263E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+263f uni263F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2640 female 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2641 uni2641 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2642 male 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2643 uni2643 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2644 uni2644 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2645 uni2645 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2646 uni2646 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2647 uni2647 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2648 uni2648 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2649 uni2649 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264a uni264A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264b uni264B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264c uni264C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264d uni264D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264e uni264E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+264f uni264F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2650 uni2650 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2651 uni2651 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2652 uni2652 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2653 uni2653 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2654 uni2654 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2655 uni2655 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2656 uni2656 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2657 uni2657 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2658 uni2658 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2659 uni2659 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265a uni265A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265b uni265B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265c uni265C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265d uni265D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265e uni265E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+265f uni265F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2660 spade 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2661 uni2661 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2662 uni2662 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2663 club 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2664 uni2664 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2665 heart 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2666 diamond 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2667 uni2667 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2668 uni2668 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2669 uni2669 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266a musicalnote 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266b musicalnotedbl 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266c uni266C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266d uni266D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266e uni266E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+266f uni266F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2670 uni2670 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2671 uni2671 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2672 uni2672 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2673 uni2673 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2674 uni2674 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2675 uni2675 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2676 uni2676 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2677 uni2677 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2678 uni2678 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2679 uni2679 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267a uni267A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267b uni267B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267c uni267C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267d uni267D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267e uni267E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+267f uni267F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2680 uni2680 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2681 uni2681 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2682 uni2682 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2683 uni2683 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2684 uni2684 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2685 uni2685 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) -U+2686 uni2686 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2687 uni2687 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2688 uni2688 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2689 uni2689 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+268a uni268A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+268b uni268B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+268c uni268C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+268d uni268D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+268e uni268E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+268f uni268F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2690 uni2690 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2691 uni2691 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2692 uni2692 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2693 uni2693 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2694 uni2694 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2695 uni2695 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2696 uni2696 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2697 uni2697 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2698 uni2698 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2699 uni2699 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+269a uni269A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+269b uni269B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+269c uni269C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+26a0 uni26A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+26a1 uni26A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+26a2 uni26A2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a3 uni26A3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a4 uni26A4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a5 uni26A5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a6 uni26A6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a7 uni26A7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a8 uni26A8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26a9 uni26A9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26aa uni26AA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26ab uni26AB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26ac uni26AC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26ad uni26AD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26ae uni26AE 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26af uni26AF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+26b0 uni26B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+26b1 uni26B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+26b2 uni26B2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+26b3 uni26B3 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+26b4 uni26B4 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+26b5 uni26B5 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+26b6 uni26B6 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+26b7 uni26B7 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+26b8 uni26B8 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2701 uni2701 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2702 uni2702 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2703 uni2703 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2704 uni2704 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2706 uni2706 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2707 uni2707 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2708 uni2708 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2709 uni2709 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+270c uni270C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+270d uni270D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+270e uni270E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+270f uni270F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2710 uni2710 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2711 uni2711 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2712 uni2712 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2713 uni2713 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2714 uni2714 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2715 uni2715 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2716 uni2716 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2717 uni2717 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2718 uni2718 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2719 uni2719 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271a uni271A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271b uni271B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271c uni271C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271d uni271D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271e uni271E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+271f uni271F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2720 uni2720 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2721 uni2721 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2722 uni2722 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2723 uni2723 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2724 uni2724 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2725 uni2725 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2726 uni2726 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2727 uni2727 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2729 uni2729 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272a uni272A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272b uni272B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272c uni272C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272d uni272D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272e uni272E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+272f uni272F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2730 uni2730 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2731 uni2731 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2732 uni2732 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2733 uni2733 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2734 uni2734 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2735 uni2735 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2736 uni2736 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2737 uni2737 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2738 uni2738 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2739 uni2739 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273a uni273A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273b uni273B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273c uni273C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273d uni273D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273e uni273E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+273f uni273F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2740 uni2740 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2741 uni2741 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2742 uni2742 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2743 uni2743 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2744 uni2744 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2745 uni2745 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2746 uni2746 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2747 uni2747 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2748 uni2748 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2749 uni2749 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+274a uni274A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+274b uni274B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+274d uni274D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+274f uni274F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2750 uni2750 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2751 uni2751 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2752 uni2752 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2756 uni2756 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2758 uni2758 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2759 uni2759 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275a uni275A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275b uni275B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275c uni275C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275d uni275D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+275e uni275E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2761 uni2761 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2762 uni2762 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2763 uni2763 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2764 uni2764 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2765 uni2765 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2766 uni2766 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2767 uni2767 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2768 uni2768 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2769 uni2769 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276a uni276A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276b uni276B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276c uni276C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276d uni276D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276e uni276E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+276f uni276F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2770 uni2770 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2771 uni2771 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2772 uni2772 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2773 uni2773 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2774 uni2774 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2775 uni2775 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) -U+2776 uni2776 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2777 uni2777 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2778 uni2778 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2779 uni2779 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277a uni277A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277b uni277B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277c uni277C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277d uni277D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277e uni277E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+277f uni277F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2780 uni2780 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2781 uni2781 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2782 uni2782 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2783 uni2783 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2784 uni2784 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2785 uni2785 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2786 uni2786 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2787 uni2787 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2788 uni2788 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2789 uni2789 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278a uni278A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278b uni278B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278c uni278C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278d uni278D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278e uni278E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+278f uni278F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2790 uni2790 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2791 uni2791 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2792 uni2792 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2793 uni2793 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2794 uni2794 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2798 uni2798 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2799 uni2799 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279a uni279A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279b uni279B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279c uni279C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279d uni279D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279e uni279E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+279f uni279F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a0 uni27A0 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a1 uni27A1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27a2 uni27A2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a3 uni27A3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a4 uni27A4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a5 uni27A5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a6 uni27A6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a7 uni27A7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a8 uni27A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a9 uni27A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27aa uni27AA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ab uni27AB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ac uni27AC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ad uni27AD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ae uni27AE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27af uni27AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b1 uni27B1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b2 uni27B2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b3 uni27B3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b4 uni27B4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b5 uni27B5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b6 uni27B6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b7 uni27B7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b8 uni27B8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27b9 uni27B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27ba uni27BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27bb uni27BB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27bc uni27BC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27bd uni27BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27be uni27BE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27bf uni27BF 2.7 (Sans Mono Bold) -U+27c5 uni27C5 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+27c6 uni27C6 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+27e0 uni27E0 2.3 -U+27e6 uni27E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27e7 uni27E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27e8 uni27E8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27e9 uni27E9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27ea uni27EA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27eb uni27EB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f0 uni27F0 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f1 uni27F1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f2 uni27F2 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f3 uni27F3 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f4 uni27F4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f5 uni27F5 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f6 uni27F6 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f7 uni27F7 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f8 uni27F8 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27f9 uni27F9 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fa uni27FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fb uni27FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fc uni27FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fd uni27FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27fe uni27FE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+27ff uni27FF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2800 uni2800 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2801 uni2801 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2802 uni2802 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2803 uni2803 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2804 uni2804 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2805 uni2805 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2806 uni2806 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2807 uni2807 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2808 uni2808 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2809 uni2809 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280a uni280A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280b uni280B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280c uni280C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280d uni280D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280e uni280E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+280f uni280F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2810 uni2810 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2811 uni2811 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2812 uni2812 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2813 uni2813 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2814 uni2814 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2815 uni2815 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2816 uni2816 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2817 uni2817 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2818 uni2818 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2819 uni2819 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281a uni281A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281b uni281B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281c uni281C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281d uni281D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281e uni281E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+281f uni281F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2820 uni2820 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2821 uni2821 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2822 uni2822 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2823 uni2823 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2824 uni2824 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2825 uni2825 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2826 uni2826 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2827 uni2827 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2828 uni2828 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2829 uni2829 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282a uni282A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282b uni282B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282c uni282C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282d uni282D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282e uni282E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+282f uni282F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2830 uni2830 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2831 uni2831 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2832 uni2832 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2833 uni2833 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2834 uni2834 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2835 uni2835 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2836 uni2836 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2837 uni2837 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2838 uni2838 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2839 uni2839 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283a uni283A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283b uni283B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283c uni283C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283d uni283D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283e uni283E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+283f uni283F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2840 uni2840 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2841 uni2841 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2842 uni2842 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2843 uni2843 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2844 uni2844 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2845 uni2845 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2846 uni2846 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2847 uni2847 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2848 uni2848 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2849 uni2849 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284a uni284A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284b uni284B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284c uni284C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284d uni284D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284e uni284E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+284f uni284F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2850 uni2850 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2851 uni2851 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2852 uni2852 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2853 uni2853 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2854 uni2854 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2855 uni2855 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2856 uni2856 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2857 uni2857 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2858 uni2858 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2859 uni2859 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285a uni285A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285b uni285B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285c uni285C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285d uni285D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285e uni285E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+285f uni285F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2860 uni2860 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2861 uni2861 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2862 uni2862 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2863 uni2863 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2864 uni2864 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2865 uni2865 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2866 uni2866 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2867 uni2867 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2868 uni2868 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2869 uni2869 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286a uni286A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286b uni286B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286c uni286C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286d uni286D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286e uni286E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+286f uni286F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2870 uni2870 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2871 uni2871 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2872 uni2872 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2873 uni2873 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2874 uni2874 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2875 uni2875 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2876 uni2876 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2877 uni2877 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2878 uni2878 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2879 uni2879 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287a uni287A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287b uni287B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287c uni287C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287d uni287D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287e uni287E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+287f uni287F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2880 uni2880 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2881 uni2881 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2882 uni2882 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2883 uni2883 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2884 uni2884 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2885 uni2885 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2886 uni2886 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2887 uni2887 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2888 uni2888 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2889 uni2889 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288a uni288A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288b uni288B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288c uni288C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288d uni288D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288e uni288E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+288f uni288F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2890 uni2890 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2891 uni2891 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2892 uni2892 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2893 uni2893 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2894 uni2894 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2895 uni2895 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2896 uni2896 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2897 uni2897 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2898 uni2898 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2899 uni2899 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289a uni289A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289b uni289B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289c uni289C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289d uni289D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289e uni289E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+289f uni289F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a0 uni28A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a1 uni28A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a2 uni28A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a3 uni28A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a4 uni28A4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a5 uni28A5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a6 uni28A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a7 uni28A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a8 uni28A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28a9 uni28A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28aa uni28AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ab uni28AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ac uni28AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ad uni28AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ae uni28AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28af uni28AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b0 uni28B0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b1 uni28B1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b2 uni28B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b3 uni28B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b4 uni28B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b5 uni28B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b6 uni28B6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b7 uni28B7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b8 uni28B8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28b9 uni28B9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ba uni28BA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28bb uni28BB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28bc uni28BC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28bd uni28BD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28be uni28BE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28bf uni28BF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c0 uni28C0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c1 uni28C1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c2 uni28C2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c3 uni28C3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c4 uni28C4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c5 uni28C5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c6 uni28C6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c7 uni28C7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c8 uni28C8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28c9 uni28C9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ca uni28CA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28cb uni28CB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28cc uni28CC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28cd uni28CD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ce uni28CE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28cf uni28CF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d0 uni28D0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d1 uni28D1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d2 uni28D2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d3 uni28D3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d4 uni28D4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d5 uni28D5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d6 uni28D6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d7 uni28D7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d8 uni28D8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28d9 uni28D9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28da uni28DA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28db uni28DB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28dc uni28DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28dd uni28DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28de uni28DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28df uni28DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e0 uni28E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e1 uni28E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e2 uni28E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e3 uni28E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e4 uni28E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e5 uni28E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e6 uni28E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e7 uni28E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e8 uni28E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28e9 uni28E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ea uni28EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28eb uni28EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ec uni28EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ed uni28ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ee uni28EE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ef uni28EF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f0 uni28F0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f1 uni28F1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f2 uni28F2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f3 uni28F3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f4 uni28F4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f5 uni28F5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f6 uni28F6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f7 uni28F7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f8 uni28F8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28f9 uni28F9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fa uni28FA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fb uni28FB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fc uni28FC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fd uni28FD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28fe uni28FE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+28ff uni28FF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2900 uni2900 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2901 uni2901 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2902 uni2902 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2903 uni2903 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2904 uni2904 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2905 uni2905 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2906 uni2906 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2907 uni2907 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2908 uni2908 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2909 uni2909 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290a uni290A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290b uni290B 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290c uni290C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290d uni290D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290e uni290E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+290f uni290F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2910 uni2910 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2911 uni2911 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2912 uni2912 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2913 uni2913 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2914 uni2914 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2915 uni2915 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2916 uni2916 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2917 uni2917 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2918 uni2918 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2919 uni2919 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291a uni291A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291b uni291B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291c uni291C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291d uni291D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291e uni291E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+291f uni291F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2920 uni2920 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2921 uni2921 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2922 uni2922 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2923 uni2923 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2924 uni2924 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2925 uni2925 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2926 uni2926 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2927 uni2927 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2928 uni2928 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2929 uni2929 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292a uni292A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292b uni292B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292c uni292C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292d uni292D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292e uni292E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+292f uni292F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2930 uni2930 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2931 uni2931 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2932 uni2932 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2933 uni2933 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2934 uni2934 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2935 uni2935 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2936 uni2936 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2937 uni2937 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2938 uni2938 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2939 uni2939 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293a uni293A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293b uni293B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293c uni293C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293d uni293D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293e uni293E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+293f uni293F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2940 uni2940 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2941 uni2941 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2942 uni2942 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2943 uni2943 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2944 uni2944 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2945 uni2945 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2946 uni2946 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2947 uni2947 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2948 uni2948 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2949 uni2949 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294a uni294A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294b uni294B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294c uni294C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294d uni294D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294e uni294E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+294f uni294F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2950 uni2950 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2951 uni2951 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2952 uni2952 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2953 uni2953 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2954 uni2954 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2955 uni2955 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2956 uni2956 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2957 uni2957 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2958 uni2958 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2959 uni2959 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295a uni295A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295b uni295B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295c uni295C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295d uni295D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295e uni295E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+295f uni295F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2960 uni2960 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2961 uni2961 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2962 uni2962 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2963 uni2963 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2964 uni2964 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2965 uni2965 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2966 uni2966 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2967 uni2967 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2968 uni2968 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2969 uni2969 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296a uni296A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296b uni296B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296c uni296C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296d uni296D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296e uni296E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+296f uni296F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2970 uni2970 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2971 uni2971 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2972 uni2972 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2973 uni2973 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2974 uni2974 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2975 uni2975 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2976 uni2976 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2977 uni2977 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2978 uni2978 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2979 uni2979 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297a uni297A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297b uni297B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297c uni297C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297d uni297D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297e uni297E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+297f uni297F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2983 uni2983 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2984 uni2984 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+29ce uni29CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29cf uni29CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d0 uni29D0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d1 uni29D1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d2 uni29D2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d3 uni29D3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d4 uni29D4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29d5 uni29D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+29eb uni29EB 2.2 -U+29fa uni29FA 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+29fb uni29FB 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2a00 uni2A00 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a01 uni2A01 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a02 uni2A02 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a0c uni2A0C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2a0d uni2A0D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2a0e uni2A0E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2a0f uni2A0F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a10 uni2A10 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a11 uni2A11 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a12 uni2A12 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a13 uni2A13 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a14 uni2A14 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a15 uni2A15 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a16 uni2A16 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a17 uni2A17 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a18 uni2A18 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a19 uni2A19 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a1a uni2A1A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a1b uni2A1B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a1c uni2A1C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a2f uni2A2F 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2a7d uni2A7D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a7e uni2A7E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a7f uni2A7F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a80 uni2A80 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a81 uni2A81 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a82 uni2A82 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a83 uni2A83 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a84 uni2A84 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a85 uni2A85 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a86 uni2A86 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a87 uni2A87 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a88 uni2A88 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a89 uni2A89 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8a uni2A8A 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8b uni2A8B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8c uni2A8C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8d uni2A8D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8e uni2A8E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a8f uni2A8F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a90 uni2A90 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a91 uni2A91 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a92 uni2A92 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a93 uni2A93 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a94 uni2A94 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a95 uni2A95 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a96 uni2A96 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a97 uni2A97 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a98 uni2A98 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a99 uni2A99 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9a uni2A9A 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9b uni2A9B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9c uni2A9C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9d uni2A9D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9e uni2A9E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a9f uni2A9F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2aa0 uni2AA0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2aae uni2AAE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2aaf uni2AAF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab0 uni2AB0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab1 uni2AB1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab2 uni2AB2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab3 uni2AB3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab4 uni2AB4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab5 uni2AB5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab6 uni2AB6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab7 uni2AB7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab8 uni2AB8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2ab9 uni2AB9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2aba uni2ABA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2af9 uni2AF9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2afa uni2AFA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b00 uni2B00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b01 uni2B01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b02 uni2B02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b03 uni2B03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b04 uni2B04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b05 uni2B05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b06 uni2B06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b07 uni2B07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b08 uni2B08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b09 uni2B09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0a uni2B0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0b uni2B0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0c uni2B0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0d uni2B0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0e uni2B0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b0f uni2B0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b10 uni2B10 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b11 uni2B11 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2b12 uni2B12 2.3 -U+2b13 uni2B13 2.3 -U+2b14 uni2B14 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b15 uni2B15 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b16 uni2B16 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b17 uni2B17 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b18 uni2B18 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b19 uni2B19 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b1a uni2B1A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+2b1f uni2B1F 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+2b20 uni2B20 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b21 uni2B21 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b22 uni2B22 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b23 uni2B23 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b24 uni2B24 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+2b53 uni2B53 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+2b54 uni2B54 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+2c60 uni2C60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c61 uni2C61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c62 uni2C62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c63 uni2C63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c64 uni2C64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2c65 uni2C65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c66 uni2C66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c67 uni2C67 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c68 uni2C68 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c69 uni2C69 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c6a uni2C6A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c6b uni2C6B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c6c uni2C6C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+2c6d uni2C6D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c6e uni2C6E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2c6f uni2C6F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2c71 uni2C71 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c72 uni2C72 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c73 uni2C73 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c74 uni2C74 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c75 uni2C75 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2c76 uni2C76 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2c77 uni2C77 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) -U+2c79 uni2C79 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2c7a uni2C7A 2.27 -U+2c7b uni2C7B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2c7c uni2C7C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2c7d uni2C7D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2d00 uni2D00 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d01 uni2D01 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d02 uni2D02 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d03 uni2D03 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d04 uni2D04 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d05 uni2D05 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d06 uni2D06 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d07 uni2D07 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d08 uni2D08 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d09 uni2D09 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d0a uni2D0A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d0b uni2D0B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d0c uni2D0C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d0d uni2D0D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d0e uni2D0E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d0f uni2D0F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d10 uni2D10 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d11 uni2D11 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d12 uni2D12 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d13 uni2D13 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d14 uni2D14 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d15 uni2D15 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d16 uni2D16 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d17 uni2D17 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d18 uni2D18 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d19 uni2D19 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d1a uni2D1A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d1b uni2D1B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d1c uni2D1C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d1d uni2D1D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d1e uni2D1E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d1f uni2D1F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d20 uni2D20 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d21 uni2D21 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d22 uni2D22 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d23 uni2D23 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d24 uni2D24 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d25 uni2D25 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+2d30 uni2D30 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d31 uni2D31 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d32 uni2D32 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d33 uni2D33 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d34 uni2D34 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d35 uni2D35 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d36 uni2D36 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d37 uni2D37 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d38 uni2D38 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d39 uni2D39 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3a uni2D3A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3b uni2D3B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3c uni2D3C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3d uni2D3D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3e uni2D3E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d3f uni2D3F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d40 uni2D40 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d41 uni2D41 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d42 uni2D42 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d43 uni2D43 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d44 uni2D44 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d45 uni2D45 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d46 uni2D46 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d47 uni2D47 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d48 uni2D48 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d49 uni2D49 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4a uni2D4A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4b uni2D4B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4c uni2D4C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4d uni2D4D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4e uni2D4E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d4f uni2D4F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d50 uni2D50 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d51 uni2D51 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d52 uni2D52 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d53 uni2D53 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d54 uni2D54 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d55 uni2D55 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d56 uni2D56 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d57 uni2D57 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d58 uni2D58 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d59 uni2D59 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5a uni2D5A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5b uni2D5B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5c uni2D5C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5d uni2D5D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5e uni2D5E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d5f uni2D5F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d60 uni2D60 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d61 uni2D61 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d62 uni2D62 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d63 uni2D63 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d64 uni2D64 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d65 uni2D65 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2d6f uni2D6F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+2e18 uni2E18 2.26 -U+2e22 uni2E22 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) -U+2e23 uni2E23 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) -U+2e24 uni2E24 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) -U+2e25 uni2E25 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) -U+2e2e uni2E2E 2.26 -U+4dc0 uni4DC0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc1 uni4DC1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc2 uni4DC2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc3 uni4DC3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc4 uni4DC4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc5 uni4DC5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc6 uni4DC6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc7 uni4DC7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc8 uni4DC8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dc9 uni4DC9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dca uni4DCA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dcb uni4DCB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dcc uni4DCC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dcd uni4DCD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dce uni4DCE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dcf uni4DCF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd0 uni4DD0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd1 uni4DD1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd2 uni4DD2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd3 uni4DD3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd4 uni4DD4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd5 uni4DD5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd6 uni4DD6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd7 uni4DD7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd8 uni4DD8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dd9 uni4DD9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dda uni4DDA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ddb uni4DDB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ddc uni4DDC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ddd uni4DDD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dde uni4DDE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ddf uni4DDF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de0 uni4DE0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de1 uni4DE1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de2 uni4DE2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de3 uni4DE3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de4 uni4DE4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de5 uni4DE5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de6 uni4DE6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de7 uni4DE7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de8 uni4DE8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4de9 uni4DE9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dea uni4DEA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4deb uni4DEB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dec uni4DEC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4ded uni4DED 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dee uni4DEE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4def uni4DEF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df0 uni4DF0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df1 uni4DF1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df2 uni4DF2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df3 uni4DF3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df4 uni4DF4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df5 uni4DF5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df6 uni4DF6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df7 uni4DF7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df8 uni4DF8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4df9 uni4DF9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfa uni4DFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfb uni4DFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfc uni4DFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfd uni4DFD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dfe uni4DFE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+4dff uni4DFF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a644 uniA644 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a645 uniA645 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a646 uniA646 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a647 uniA647 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a64c uniA64C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a64d uniA64D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a650 uniA650 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a651 uniA651 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a654 uniA654 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a655 uniA655 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a656 uniA656 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a657 uniA657 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a662 uniA662 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a663 uniA663 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a664 uniA664 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a665 uniA665 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a666 uniA666 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a667 uniA667 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a668 uniA668 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a669 uniA669 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66a uniA66A 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66b uniA66B 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66c uniA66C 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66d uniA66D 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a66e uniA66E 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a68a uniA68A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a68b uniA68B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a68c uniA68C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a68d uniA68D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a694 uniA694 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a695 uniA695 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a708 uniA708 2.27 -U+a709 uniA709 2.27 -U+a70a uniA70A 2.27 -U+a70b uniA70B 2.27 -U+a70c uniA70C 2.27 -U+a70d uniA70D 2.27 -U+a70e uniA70E 2.27 -U+a70f uniA70F 2.27 -U+a710 uniA710 2.27 -U+a711 uniA711 2.27 -U+a712 uniA712 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a713 uniA713 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a714 uniA714 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a715 uniA715 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a716 uniA716 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+a71b uniA71B 2.27 -U+a71c uniA71C 2.27 -U+a71d uniA71D 2.27 -U+a71e uniA71E 2.27 -U+a71f uniA71F 2.27 -U+a726 uniA726 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+a727 uniA727 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+a728 uniA728 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a729 uniA729 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a72a uniA72A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a72b uniA72B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a730 uniA730 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a731 uniA731 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a732 uniA732 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a733 uniA733 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a734 uniA734 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a735 uniA735 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a736 uniA736 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a737 uniA737 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a738 uniA738 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a739 uniA739 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73a uniA73A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73b uniA73B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73c uniA73C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73d uniA73D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a73e uniA73E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a73f uniA73F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a746 uniA746 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a747 uniA747 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a748 uniA748 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a749 uniA749 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74a uniA74A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74b uniA74B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a74e uniA74E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a74f uniA74F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a780 uniA780 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a781 uniA781 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a782 uniA782 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a783 uniA783 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+a789 uniA789 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+a78a uniA78A 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+a78b uniA78B 2.26 -U+a78c uniA78C 2.26 -U+a7fb uniA7FB 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fc uniA7FC 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fd uniA7FD 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7fe uniA7FE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+a7ff uniA7FF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e000 uniE000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e001 uniE001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e002 uniE002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e003 uniE003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e004 uniE004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e005 uniE005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e006 uniE006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e007 uniE007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e008 uniE008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+e009 uniE009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00a uniE00A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00b uniE00B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00c uniE00C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00d uniE00D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00e uniE00E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e00f uniE00F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e010 uniE010 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e011 uniE011 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e012 uniE012 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e013 uniE013 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e014 uniE014 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+e015 uniE015 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e016 uniE016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e017 uniE017 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e018 uniE018 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e019 uniE019 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e01a uniE01A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e01b uniE01B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e01c uniE01C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+e01d uniE01D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f000 uniF000 2.10 (Sans) 2.11 (Sans Condensed) -U+f001 uniF001 2.10 (Sans) 2.11 (Sans Condensed) -U+f208 uniF208 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f20a uniF20A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f215 uniF215 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f216 uniF216 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f217 uniF217 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f21a uniF21A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f21b uniF21B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f25f uniF25F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+f400 uniF400 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f401 uniF401 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f402 uniF402 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f403 uniF403 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f404 uniF404 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f405 uniF405 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f406 uniF406 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f407 uniF407 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f408 uniF408 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f409 uniF409 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f40a uniF40A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f40b uniF40B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f40c uniF40C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f40d uniF40D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f40e uniF40E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f40f uniF40F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f410 uniF410 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f411 uniF411 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f412 uniF412 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f413 uniF413 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f414 uniF414 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f415 uniF415 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f416 uniF416 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f417 uniF417 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f418 uniF418 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f419 uniF419 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f41a uniF41A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f41b uniF41B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f41c uniF41C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f41d uniF41D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f41e uniF41E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f41f uniF41F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f420 uniF420 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f421 uniF421 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f422 uniF422 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f423 uniF423 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f424 uniF424 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f425 uniF425 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f426 uniF426 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f428 uniF428 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) -U+f5c5 uniF5C5 2.9 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+f6c4 uniF6C4 2.10 (Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) -U+f6c5 uniF6C5 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed) -U+f6c6 uniF6C6 2.5 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+f6c7 uniF6C7 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+f6c8 uniF6C8 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+f6d1 cyrBreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+f6d4 cyrbreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb00 uniFB00 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb01 fi original -U+fb02 fl original -U+fb03 uniFB03 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb04 uniFB04 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb05 uniFB05 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb06 uniFB06 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fb13 uniFB13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb14 uniFB14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb15 uniFB15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb16 uniFB16 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb17 uniFB17 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb1d uniFB1D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb1e uniFB1E 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb1f uniFB1F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb20 uniFB20 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb21 uniFB21 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb22 uniFB22 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb23 uniFB23 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb24 uniFB24 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb25 uniFB25 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb26 uniFB26 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb27 uniFB27 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb28 uniFB28 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb29 uniFB29 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb2a uniFB2A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2b uniFB2B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2c uniFB2C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2d uniFB2D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2e uniFB2E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb2f uniFB2F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb30 uniFB30 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb31 uniFB31 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb32 uniFB32 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb33 uniFB33 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb34 uniFB34 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb35 uniFB35 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb36 uniFB36 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb37 uniFB37 2.11 (Sans Condensed Oblique, Sans Oblique) -U+fb38 uniFB38 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb39 uniFB39 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb3a uniFB3A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb3b uniFB3B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb3c uniFB3C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb3e uniFB3E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb40 uniFB40 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb41 uniFB41 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb43 uniFB43 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb44 uniFB44 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb46 uniFB46 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb47 uniFB47 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb48 uniFB48 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb49 uniFB49 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4a uniFB4A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4b uniFB4B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4c uniFB4C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4d uniFB4D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4e uniFB4E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fb4f uniFB4F 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+fb52 uniFB52 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb53 uniFB53 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb54 uniFB54 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb55 uniFB55 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb56 uniFB56 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb57 uniFB57 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb58 uniFB58 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb59 uniFB59 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5a uniFB5A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5b uniFB5B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5c uniFB5C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5d uniFB5D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5e uniFB5E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb5f uniFB5F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb60 uniFB60 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb61 uniFB61 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb62 uniFB62 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb63 uniFB63 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb64 uniFB64 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb65 uniFB65 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb66 uniFB66 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb67 uniFB67 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb68 uniFB68 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb69 uniFB69 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6a uniFB6A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6b uniFB6B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6c uniFB6C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6d uniFB6D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6e uniFB6E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb6f uniFB6F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb70 uniFB70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb71 uniFB71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb72 uniFB72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb73 uniFB73 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb74 uniFB74 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb75 uniFB75 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb76 uniFB76 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb77 uniFB77 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb78 uniFB78 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb79 uniFB79 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7a uniFB7A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7b uniFB7B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7c uniFB7C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7d uniFB7D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7e uniFB7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb7f uniFB7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb80 uniFB80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb81 uniFB81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8a uniFB8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8b uniFB8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8c uniFB8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8d uniFB8D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8e uniFB8E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb8f uniFB8F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb90 uniFB90 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb91 uniFB91 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb92 uniFB92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb93 uniFB93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb94 uniFB94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb95 uniFB95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb9e uniFB9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fb9f uniFB9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbaa uniFBAA 2.16 (Sans Mono, Sans Mono Bold) -U+fbab uniFBAB 2.16 (Sans Mono, Sans Mono Bold) -U+fbac uniFBAC 2.16 (Sans Mono, Sans Mono Bold) -U+fbad uniFBAD 2.16 (Sans Mono, Sans Mono Bold) -U+fbd9 uniFBD9 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+fbda uniFBDA 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) -U+fbe8 uniFBE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbe9 uniFBE9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbfc uniFBFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbfd uniFBFD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbfe uniFBFE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbff uniFBFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe00 uniFE00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe01 uniFE01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe02 uniFE02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe03 uniFE03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe04 uniFE04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe05 uniFE05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe06 uniFE06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe07 uniFE07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe08 uniFE08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe09 uniFE09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0a uniFE0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0b uniFE0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0c uniFE0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0d uniFE0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0e uniFE0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe0f uniFE0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fe20 uniFE20 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fe21 uniFE21 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fe22 uniFE22 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fe23 uniFE23 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+fe70 uniFE70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe71 uniFE71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe72 uniFE72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe73 uniFE73 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe74 uniFE74 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe76 uniFE76 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe77 uniFE77 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe78 uniFE78 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe79 uniFE79 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7a uniFE7A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7b uniFE7B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7c uniFE7C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7d uniFE7D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7e uniFE7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe7f uniFE7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe80 uniFE80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe81 uniFE81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe82 uniFE82 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe83 uniFE83 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe84 uniFE84 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe85 uniFE85 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe86 uniFE86 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe87 uniFE87 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe88 uniFE88 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe89 uniFE89 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8a uniFE8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8b uniFE8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8c uniFE8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8d uniFE8D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8e uniFE8E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe8f uniFE8F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe90 uniFE90 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe91 uniFE91 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe92 uniFE92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe93 uniFE93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe94 uniFE94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe95 uniFE95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe96 uniFE96 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe97 uniFE97 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe98 uniFE98 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe99 uniFE99 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9a uniFE9A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9b uniFE9B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9c uniFE9C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9d uniFE9D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9e uniFE9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe9f uniFE9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea0 uniFEA0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea1 uniFEA1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea2 uniFEA2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea3 uniFEA3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea4 uniFEA4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea5 uniFEA5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea6 uniFEA6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea7 uniFEA7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea8 uniFEA8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fea9 uniFEA9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feaa uniFEAA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feab uniFEAB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feac uniFEAC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fead uniFEAD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feae uniFEAE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feaf uniFEAF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb0 uniFEB0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb1 uniFEB1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb2 uniFEB2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb3 uniFEB3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb4 uniFEB4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb5 uniFEB5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb6 uniFEB6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb7 uniFEB7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb8 uniFEB8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feb9 uniFEB9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feba uniFEBA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febb uniFEBB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febc uniFEBC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febd uniFEBD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febe uniFEBE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+febf uniFEBF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec0 uniFEC0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec1 uniFEC1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec2 uniFEC2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec3 uniFEC3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec4 uniFEC4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec5 uniFEC5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec6 uniFEC6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec7 uniFEC7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec8 uniFEC8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fec9 uniFEC9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feca uniFECA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fecb uniFECB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fecc uniFECC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fecd uniFECD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fece uniFECE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fecf uniFECF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed0 uniFED0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed1 uniFED1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed2 uniFED2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed3 uniFED3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed4 uniFED4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed5 uniFED5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed6 uniFED6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed7 uniFED7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed8 uniFED8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fed9 uniFED9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feda uniFEDA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fedb uniFEDB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fedc uniFEDC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fedd uniFEDD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fede uniFEDE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fedf uniFEDF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee0 uniFEE0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee1 uniFEE1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee2 uniFEE2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee3 uniFEE3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee4 uniFEE4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee5 uniFEE5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee6 uniFEE6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee7 uniFEE7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee8 uniFEE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fee9 uniFEE9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feea uniFEEA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feeb uniFEEB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feec uniFEEC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feed uniFEED 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feee uniFEEE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feef uniFEEF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef0 uniFEF0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef1 uniFEF1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef2 uniFEF2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef3 uniFEF3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef4 uniFEF4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef5 uniFEF5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef6 uniFEF6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef7 uniFEF7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef8 uniFEF8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fef9 uniFEF9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fefa uniFEFA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fefb uniFEFB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fefc uniFEFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+feff uniFEFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fff9 uniFFF9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fffa uniFFFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fffb uniFFFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fffc uniFFFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) -U+fffd uniFFFD 1.12 -U+1d300 u1D300 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d301 u1D301 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d302 u1D302 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d303 u1D303 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d304 u1D304 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d305 u1D305 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d306 u1D306 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d307 u1D307 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d308 u1D308 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d309 u1D309 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30a u1D30A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30b u1D30B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30c u1D30C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30d u1D30D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30e u1D30E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d30f u1D30F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d310 u1D310 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d311 u1D311 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d312 u1D312 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d313 u1D313 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d314 u1D314 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d315 u1D315 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d316 u1D316 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d317 u1D317 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d318 u1D318 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d319 u1D319 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31a u1D31A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31b u1D31B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31c u1D31C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31d u1D31D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31e u1D31E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d31f u1D31F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d320 u1D320 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d321 u1D321 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d322 u1D322 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d323 u1D323 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d324 u1D324 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d325 u1D325 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d326 u1D326 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d327 u1D327 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d328 u1D328 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d329 u1D329 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32a u1D32A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32b u1D32B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32c u1D32C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32d u1D32D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32e u1D32E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d32f u1D32F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d330 u1D330 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d331 u1D331 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d332 u1D332 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d333 u1D333 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d334 u1D334 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d335 u1D335 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d336 u1D336 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d337 u1D337 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d338 u1D338 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d339 u1D339 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33a u1D33A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33b u1D33B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33c u1D33C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33d u1D33D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33e u1D33E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d33f u1D33F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d340 u1D340 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d341 u1D341 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d342 u1D342 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d343 u1D343 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d344 u1D344 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d345 u1D345 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d346 u1D346 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d347 u1D347 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d348 u1D348 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d349 u1D349 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34a u1D34A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34b u1D34B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34c u1D34C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34d u1D34D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34e u1D34E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d34f u1D34F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d350 u1D350 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d351 u1D351 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d352 u1D352 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d353 u1D353 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d354 u1D354 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d355 u1D355 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d356 u1D356 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d400 u1D400 2.23 (Serif Bold, Serif Condensed Bold) -U+1d401 u1D401 2.23 (Serif Bold, Serif Condensed Bold) -U+1d402 u1D402 2.23 (Serif Bold, Serif Condensed Bold) -U+1d403 u1D403 2.23 (Serif Bold, Serif Condensed Bold) -U+1d404 u1D404 2.23 (Serif Bold, Serif Condensed Bold) -U+1d405 u1D405 2.23 (Serif Bold, Serif Condensed Bold) -U+1d406 u1D406 2.23 (Serif Bold, Serif Condensed Bold) -U+1d407 u1D407 2.23 (Serif Bold, Serif Condensed Bold) -U+1d408 u1D408 2.23 (Serif Bold, Serif Condensed Bold) -U+1d409 u1D409 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40a u1D40A 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40b u1D40B 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40c u1D40C 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40d u1D40D 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40e u1D40E 2.23 (Serif Bold, Serif Condensed Bold) -U+1d40f u1D40F 2.23 (Serif Bold, Serif Condensed Bold) -U+1d410 u1D410 2.23 (Serif Bold, Serif Condensed Bold) -U+1d411 u1D411 2.23 (Serif Bold, Serif Condensed Bold) -U+1d412 u1D412 2.23 (Serif Bold, Serif Condensed Bold) -U+1d413 u1D413 2.23 (Serif Bold, Serif Condensed Bold) -U+1d414 u1D414 2.23 (Serif Bold, Serif Condensed Bold) -U+1d415 u1D415 2.23 (Serif Bold, Serif Condensed Bold) -U+1d416 u1D416 2.23 (Serif Bold, Serif Condensed Bold) -U+1d417 u1D417 2.23 (Serif Bold, Serif Condensed Bold) -U+1d418 u1D418 2.23 (Serif Bold, Serif Condensed Bold) -U+1d419 u1D419 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41a u1D41A 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41b u1D41B 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41c u1D41C 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41d u1D41D 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41e u1D41E 2.23 (Serif Bold, Serif Condensed Bold) -U+1d41f u1D41F 2.23 (Serif Bold, Serif Condensed Bold) -U+1d420 u1D420 2.23 (Serif Bold, Serif Condensed Bold) -U+1d421 u1D421 2.23 (Serif Bold, Serif Condensed Bold) -U+1d422 u1D422 2.23 (Serif Bold, Serif Condensed Bold) -U+1d423 u1D423 2.23 (Serif Bold, Serif Condensed Bold) -U+1d424 u1D424 2.23 (Serif Bold, Serif Condensed Bold) -U+1d425 u1D425 2.23 (Serif Bold, Serif Condensed Bold) -U+1d426 u1D426 2.23 (Serif Bold, Serif Condensed Bold) -U+1d427 u1D427 2.23 (Serif Bold, Serif Condensed Bold) -U+1d428 u1D428 2.23 (Serif Bold, Serif Condensed Bold) -U+1d429 u1D429 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42a u1D42A 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42b u1D42B 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42c u1D42C 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42d u1D42D 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42e u1D42E 2.23 (Serif Bold, Serif Condensed Bold) -U+1d42f u1D42F 2.23 (Serif Bold, Serif Condensed Bold) -U+1d430 u1D430 2.23 (Serif Bold, Serif Condensed Bold) -U+1d431 u1D431 2.23 (Serif Bold, Serif Condensed Bold) -U+1d432 u1D432 2.23 (Serif Bold, Serif Condensed Bold) -U+1d433 u1D433 2.23 (Serif Bold, Serif Condensed Bold) -U+1d434 u1D434 2.23 (Serif Italic, Serif Italic Condensed) -U+1d435 u1D435 2.23 (Serif Italic, Serif Italic Condensed) -U+1d436 u1D436 2.23 (Serif Italic, Serif Italic Condensed) -U+1d437 u1D437 2.23 (Serif Italic, Serif Italic Condensed) -U+1d438 u1D438 2.23 (Serif Italic, Serif Italic Condensed) -U+1d439 u1D439 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43a u1D43A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43b u1D43B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43c u1D43C 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43d u1D43D 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43e u1D43E 2.23 (Serif Italic, Serif Italic Condensed) -U+1d43f u1D43F 2.23 (Serif Italic, Serif Italic Condensed) -U+1d440 u1D440 2.23 (Serif Italic, Serif Italic Condensed) -U+1d441 u1D441 2.23 (Serif Italic, Serif Italic Condensed) -U+1d442 u1D442 2.23 (Serif Italic, Serif Italic Condensed) -U+1d443 u1D443 2.23 (Serif Italic, Serif Italic Condensed) -U+1d444 u1D444 2.23 (Serif Italic, Serif Italic Condensed) -U+1d445 u1D445 2.23 (Serif Italic, Serif Italic Condensed) -U+1d446 u1D446 2.23 (Serif Italic, Serif Italic Condensed) -U+1d447 u1D447 2.23 (Serif Italic, Serif Italic Condensed) -U+1d448 u1D448 2.23 (Serif Italic, Serif Italic Condensed) -U+1d449 u1D449 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44a u1D44A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44b u1D44B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44c u1D44C 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44d u1D44D 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44e u1D44E 2.23 (Serif Italic, Serif Italic Condensed) -U+1d44f u1D44F 2.23 (Serif Italic, Serif Italic Condensed) -U+1d450 u1D450 2.23 (Serif Italic, Serif Italic Condensed) -U+1d451 u1D451 2.23 (Serif Italic, Serif Italic Condensed) -U+1d452 u1D452 2.23 (Serif Italic, Serif Italic Condensed) -U+1d453 u1D453 2.23 (Serif Italic, Serif Italic Condensed) -U+1d454 u1D454 2.23 (Serif Italic, Serif Italic Condensed) -U+1d456 u1D456 2.23 (Serif Italic, Serif Italic Condensed) -U+1d457 u1D457 2.23 (Serif Italic, Serif Italic Condensed) -U+1d458 u1D458 2.23 (Serif Italic, Serif Italic Condensed) -U+1d459 u1D459 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45a u1D45A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45b u1D45B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45c u1D45C 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45d u1D45D 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45e u1D45E 2.23 (Serif Italic, Serif Italic Condensed) -U+1d45f u1D45F 2.23 (Serif Italic, Serif Italic Condensed) -U+1d460 u1D460 2.23 (Serif Italic, Serif Italic Condensed) -U+1d461 u1D461 2.23 (Serif Italic, Serif Italic Condensed) -U+1d462 u1D462 2.23 (Serif Italic, Serif Italic Condensed) -U+1d463 u1D463 2.23 (Serif Italic, Serif Italic Condensed) -U+1d464 u1D464 2.23 (Serif Italic, Serif Italic Condensed) -U+1d465 u1D465 2.23 (Serif Italic, Serif Italic Condensed) -U+1d466 u1D466 2.23 (Serif Italic, Serif Italic Condensed) -U+1d467 u1D467 2.23 (Serif Italic, Serif Italic Condensed) -U+1d468 u1D468 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d469 u1D469 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46a u1D46A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46b u1D46B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46c u1D46C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46d u1D46D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46e u1D46E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d46f u1D46F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d470 u1D470 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d471 u1D471 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d472 u1D472 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d473 u1D473 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d474 u1D474 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d475 u1D475 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d476 u1D476 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d477 u1D477 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d478 u1D478 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d479 u1D479 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47a u1D47A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47b u1D47B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47c u1D47C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47d u1D47D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47e u1D47E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d47f u1D47F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d480 u1D480 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d481 u1D481 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d482 u1D482 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d483 u1D483 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d484 u1D484 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d485 u1D485 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d486 u1D486 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d487 u1D487 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d488 u1D488 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d489 u1D489 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48a u1D48A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48b u1D48B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48c u1D48C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48d u1D48D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48e u1D48E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d48f u1D48F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d490 u1D490 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d491 u1D491 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d492 u1D492 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d493 u1D493 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d494 u1D494 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d495 u1D495 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d496 u1D496 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d497 u1D497 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d498 u1D498 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d499 u1D499 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d49a u1D49A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d49b u1D49B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d538 u1D538 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d539 u1D539 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d53b u1D53B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d53c u1D53C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d53d u1D53D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d53e u1D53E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d540 u1D540 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d541 u1D541 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d542 u1D542 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d543 u1D543 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d544 u1D544 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d546 u1D546 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54a u1D54A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54b u1D54B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54c u1D54C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54d u1D54D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54e u1D54E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d54f u1D54F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d550 u1D550 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d552 u1D552 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d553 u1D553 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d554 u1D554 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d555 u1D555 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d556 u1D556 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d557 u1D557 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d558 u1D558 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d559 u1D559 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55a u1D55A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55b u1D55B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55c u1D55C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55d u1D55D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55e u1D55E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d55f u1D55F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d560 u1D560 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d561 u1D561 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d562 u1D562 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d563 u1D563 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d564 u1D564 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d565 u1D565 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d566 u1D566 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d567 u1D567 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d568 u1D568 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d569 u1D569 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d56a u1D56A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d56b u1D56B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) -U+1d5a0 u1D5A0 2.23 (Sans, Sans Condensed) -U+1d5a1 u1D5A1 2.23 (Sans, Sans Condensed) -U+1d5a2 u1D5A2 2.23 (Sans, Sans Condensed) -U+1d5a3 u1D5A3 2.23 (Sans, Sans Condensed) -U+1d5a4 u1D5A4 2.23 (Sans, Sans Condensed) -U+1d5a5 u1D5A5 2.23 (Sans, Sans Condensed) -U+1d5a6 u1D5A6 2.23 (Sans, Sans Condensed) -U+1d5a7 u1D5A7 2.23 (Sans, Sans Condensed) -U+1d5a8 u1D5A8 2.23 (Sans, Sans Condensed) -U+1d5a9 u1D5A9 2.23 (Sans, Sans Condensed) -U+1d5aa u1D5AA 2.23 (Sans, Sans Condensed) -U+1d5ab u1D5AB 2.23 (Sans, Sans Condensed) -U+1d5ac u1D5AC 2.23 (Sans, Sans Condensed) -U+1d5ad u1D5AD 2.23 (Sans, Sans Condensed) -U+1d5ae u1D5AE 2.23 (Sans, Sans Condensed) -U+1d5af u1D5AF 2.23 (Sans, Sans Condensed) -U+1d5b0 u1D5B0 2.23 (Sans, Sans Condensed) -U+1d5b1 u1D5B1 2.23 (Sans, Sans Condensed) -U+1d5b2 u1D5B2 2.23 (Sans, Sans Condensed) -U+1d5b3 u1D5B3 2.23 (Sans, Sans Condensed) -U+1d5b4 u1D5B4 2.23 (Sans, Sans Condensed) -U+1d5b5 u1D5B5 2.23 (Sans, Sans Condensed) -U+1d5b6 u1D5B6 2.23 (Sans, Sans Condensed) -U+1d5b7 u1D5B7 2.23 (Sans, Sans Condensed) -U+1d5b8 u1D5B8 2.23 (Sans, Sans Condensed) -U+1d5b9 u1D5B9 2.23 (Sans, Sans Condensed) -U+1d5ba u1D5BA 2.23 (Sans, Sans Condensed) -U+1d5bb u1D5BB 2.23 (Sans, Sans Condensed) -U+1d5bc u1D5BC 2.23 (Sans, Sans Condensed) -U+1d5bd u1D5BD 2.23 (Sans, Sans Condensed) -U+1d5be u1D5BE 2.23 (Sans, Sans Condensed) -U+1d5bf u1D5BF 2.23 (Sans, Sans Condensed) -U+1d5c0 u1D5C0 2.23 (Sans, Sans Condensed) -U+1d5c1 u1D5C1 2.23 (Sans, Sans Condensed) -U+1d5c2 u1D5C2 2.23 (Sans, Sans Condensed) -U+1d5c3 u1D5C3 2.23 (Sans, Sans Condensed) -U+1d5c4 u1D5C4 2.23 (Sans, Sans Condensed) -U+1d5c5 u1D5C5 2.23 (Sans, Sans Condensed) -U+1d5c6 u1D5C6 2.23 (Sans, Sans Condensed) -U+1d5c7 u1D5C7 2.23 (Sans, Sans Condensed) -U+1d5c8 u1D5C8 2.23 (Sans, Sans Condensed) -U+1d5c9 u1D5C9 2.23 (Sans, Sans Condensed) -U+1d5ca u1D5CA 2.23 (Sans, Sans Condensed) -U+1d5cb u1D5CB 2.23 (Sans, Sans Condensed) -U+1d5cc u1D5CC 2.23 (Sans, Sans Condensed) -U+1d5cd u1D5CD 2.23 (Sans, Sans Condensed) -U+1d5ce u1D5CE 2.23 (Sans, Sans Condensed) -U+1d5cf u1D5CF 2.23 (Sans, Sans Condensed) -U+1d5d0 u1D5D0 2.23 (Sans, Sans Condensed) -U+1d5d1 u1D5D1 2.23 (Sans, Sans Condensed) -U+1d5d2 u1D5D2 2.23 (Sans, Sans Condensed) -U+1d5d3 u1D5D3 2.23 (Sans, Sans Condensed) -U+1d5d4 u1D5D4 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d5 u1D5D5 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d6 u1D5D6 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d7 u1D5D7 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d8 u1D5D8 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5d9 u1D5D9 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5da u1D5DA 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5db u1D5DB 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5dc u1D5DC 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5dd u1D5DD 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5de u1D5DE 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5df u1D5DF 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e0 u1D5E0 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e1 u1D5E1 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e2 u1D5E2 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e3 u1D5E3 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e4 u1D5E4 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e5 u1D5E5 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e6 u1D5E6 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e7 u1D5E7 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e8 u1D5E8 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5e9 u1D5E9 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ea u1D5EA 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5eb u1D5EB 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ec u1D5EC 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ed u1D5ED 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ee u1D5EE 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ef u1D5EF 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f0 u1D5F0 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f1 u1D5F1 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f2 u1D5F2 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f3 u1D5F3 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f4 u1D5F4 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f5 u1D5F5 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f6 u1D5F6 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f7 u1D5F7 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f8 u1D5F8 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5f9 u1D5F9 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fa u1D5FA 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fb u1D5FB 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fc u1D5FC 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fd u1D5FD 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5fe u1D5FE 2.23 (Sans Bold, Sans Condensed Bold) -U+1d5ff u1D5FF 2.23 (Sans Bold, Sans Condensed Bold) -U+1d600 u1D600 2.23 (Sans Bold, Sans Condensed Bold) -U+1d601 u1D601 2.23 (Sans Bold, Sans Condensed Bold) -U+1d602 u1D602 2.23 (Sans Bold, Sans Condensed Bold) -U+1d603 u1D603 2.23 (Sans Bold, Sans Condensed Bold) -U+1d604 u1D604 2.23 (Sans Bold, Sans Condensed Bold) -U+1d605 u1D605 2.23 (Sans Bold, Sans Condensed Bold) -U+1d606 u1D606 2.23 (Sans Bold, Sans Condensed Bold) -U+1d607 u1D607 2.23 (Sans Bold, Sans Condensed Bold) -U+1d608 u1D608 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d609 u1D609 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60a u1D60A 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60b u1D60B 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60c u1D60C 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60d u1D60D 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60e u1D60E 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d60f u1D60F 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d610 u1D610 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d611 u1D611 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d612 u1D612 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d613 u1D613 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d614 u1D614 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d615 u1D615 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d616 u1D616 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d617 u1D617 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d618 u1D618 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d619 u1D619 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61a u1D61A 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61b u1D61B 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61c u1D61C 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61d u1D61D 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61e u1D61E 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d61f u1D61F 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d620 u1D620 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d621 u1D621 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d622 u1D622 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d623 u1D623 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d624 u1D624 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d625 u1D625 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d626 u1D626 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d627 u1D627 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d628 u1D628 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d629 u1D629 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62a u1D62A 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62b u1D62B 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62c u1D62C 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62d u1D62D 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62e u1D62E 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d62f u1D62F 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d630 u1D630 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d631 u1D631 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d632 u1D632 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d633 u1D633 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d634 u1D634 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d635 u1D635 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d636 u1D636 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d637 u1D637 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d638 u1D638 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d639 u1D639 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d63a u1D63A 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d63b u1D63B 2.23 (Sans Condensed Oblique, Sans Oblique) -U+1d63c u1D63C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d63d u1D63D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d63e u1D63E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d63f u1D63F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d640 u1D640 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d641 u1D641 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d642 u1D642 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d643 u1D643 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d644 u1D644 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d645 u1D645 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d646 u1D646 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d647 u1D647 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d648 u1D648 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d649 u1D649 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64a u1D64A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64b u1D64B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64c u1D64C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64d u1D64D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64e u1D64E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d64f u1D64F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d650 u1D650 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d651 u1D651 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d652 u1D652 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d653 u1D653 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d654 u1D654 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d655 u1D655 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d656 u1D656 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d657 u1D657 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d658 u1D658 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d659 u1D659 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65a u1D65A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65b u1D65B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65c u1D65C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65d u1D65D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65e u1D65E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d65f u1D65F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d660 u1D660 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d661 u1D661 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d662 u1D662 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d663 u1D663 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d664 u1D664 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d665 u1D665 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d666 u1D666 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d667 u1D667 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d668 u1D668 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d669 u1D669 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66a u1D66A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66b u1D66B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66c u1D66C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66d u1D66D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66e u1D66E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d66f u1D66F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d670 u1D670 2.23 (Sans Mono) -U+1d671 u1D671 2.23 (Sans Mono) -U+1d672 u1D672 2.23 (Sans Mono) -U+1d673 u1D673 2.23 (Sans Mono) -U+1d674 u1D674 2.23 (Sans Mono) -U+1d675 u1D675 2.23 (Sans Mono) -U+1d676 u1D676 2.23 (Sans Mono) -U+1d677 u1D677 2.23 (Sans Mono) -U+1d678 u1D678 2.23 (Sans Mono) -U+1d679 u1D679 2.23 (Sans Mono) -U+1d67a u1D67A 2.23 (Sans Mono) -U+1d67b u1D67B 2.23 (Sans Mono) -U+1d67c u1D67C 2.23 (Sans Mono) -U+1d67d u1D67D 2.23 (Sans Mono) -U+1d67e u1D67E 2.23 (Sans Mono) -U+1d67f u1D67F 2.23 (Sans Mono) -U+1d680 u1D680 2.23 (Sans Mono) -U+1d681 u1D681 2.23 (Sans Mono) -U+1d682 u1D682 2.23 (Sans Mono) -U+1d683 u1D683 2.23 (Sans Mono) -U+1d684 u1D684 2.23 (Sans Mono) -U+1d685 u1D685 2.23 (Sans Mono) -U+1d686 u1D686 2.23 (Sans Mono) -U+1d687 u1D687 2.23 (Sans Mono) -U+1d688 u1D688 2.23 (Sans Mono) -U+1d689 u1D689 2.23 (Sans Mono) -U+1d68a u1D68A 2.23 (Sans Mono) -U+1d68b u1D68B 2.23 (Sans Mono) -U+1d68c u1D68C 2.23 (Sans Mono) -U+1d68d u1D68D 2.23 (Sans Mono) -U+1d68e u1D68E 2.23 (Sans Mono) -U+1d68f u1D68F 2.23 (Sans Mono) -U+1d690 u1D690 2.23 (Sans Mono) -U+1d691 u1D691 2.23 (Sans Mono) -U+1d692 u1D692 2.23 (Sans Mono) -U+1d693 u1D693 2.23 (Sans Mono) -U+1d694 u1D694 2.23 (Sans Mono) -U+1d695 u1D695 2.23 (Sans Mono) -U+1d696 u1D696 2.23 (Sans Mono) -U+1d697 u1D697 2.23 (Sans Mono) -U+1d698 u1D698 2.23 (Sans Mono) -U+1d699 u1D699 2.23 (Sans Mono) -U+1d69a u1D69A 2.23 (Sans Mono) -U+1d69b u1D69B 2.23 (Sans Mono) -U+1d69c u1D69C 2.23 (Sans Mono) -U+1d69d u1D69D 2.23 (Sans Mono) -U+1d69e u1D69E 2.23 (Sans Mono) -U+1d69f u1D69F 2.23 (Sans Mono) -U+1d6a0 u1D6A0 2.23 (Sans Mono) -U+1d6a1 u1D6A1 2.23 (Sans Mono) -U+1d6a2 u1D6A2 2.23 (Sans Mono) -U+1d6a3 u1D6A3 2.23 (Sans Mono) -U+1d6a4 u1D6A4 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6a5 u1D6A5 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6a8 u1D6A8 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6a9 u1D6A9 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6aa u1D6AA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ab u1D6AB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ac u1D6AC 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ad u1D6AD 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ae u1D6AE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6af u1D6AF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b0 u1D6B0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b1 u1D6B1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b2 u1D6B2 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b3 u1D6B3 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b4 u1D6B4 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b5 u1D6B5 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b6 u1D6B6 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b7 u1D6B7 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b8 u1D6B8 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6b9 u1D6B9 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ba u1D6BA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6bb u1D6BB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6bc u1D6BC 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6bd u1D6BD 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6be u1D6BE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6bf u1D6BF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c0 u1D6C0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c1 u1D6C1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c2 u1D6C2 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c3 u1D6C3 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c4 u1D6C4 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c5 u1D6C5 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c6 u1D6C6 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c7 u1D6C7 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c8 u1D6C8 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6c9 u1D6C9 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ca u1D6CA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6cb u1D6CB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6cc u1D6CC 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6cd u1D6CD 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6ce u1D6CE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6cf u1D6CF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d0 u1D6D0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d1 u1D6D1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d2 u1D6D2 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d3 u1D6D3 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d4 u1D6D4 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d5 u1D6D5 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d6 u1D6D6 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d7 u1D6D7 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d8 u1D6D8 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6d9 u1D6D9 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6da u1D6DA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6db u1D6DB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6dc u1D6DC 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6dd u1D6DD 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6de u1D6DE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6df u1D6DF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6e0 u1D6E0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6e1 u1D6E1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d6e2 u1D6E2 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e3 u1D6E3 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e4 u1D6E4 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e5 u1D6E5 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e6 u1D6E6 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e7 u1D6E7 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e8 u1D6E8 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6e9 u1D6E9 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ea u1D6EA 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6eb u1D6EB 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ec u1D6EC 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ed u1D6ED 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ee u1D6EE 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ef u1D6EF 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f0 u1D6F0 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f1 u1D6F1 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f2 u1D6F2 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f3 u1D6F3 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f4 u1D6F4 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f5 u1D6F5 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f6 u1D6F6 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f7 u1D6F7 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f8 u1D6F8 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6f9 u1D6F9 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fa u1D6FA 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fb u1D6FB 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fc u1D6FC 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fd u1D6FD 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6fe u1D6FE 2.23 (Serif Italic, Serif Italic Condensed) -U+1d6ff u1D6FF 2.23 (Serif Italic, Serif Italic Condensed) -U+1d700 u1D700 2.23 (Serif Italic, Serif Italic Condensed) -U+1d701 u1D701 2.23 (Serif Italic, Serif Italic Condensed) -U+1d702 u1D702 2.23 (Serif Italic, Serif Italic Condensed) -U+1d703 u1D703 2.23 (Serif Italic, Serif Italic Condensed) -U+1d704 u1D704 2.23 (Serif Italic, Serif Italic Condensed) -U+1d705 u1D705 2.23 (Serif Italic, Serif Italic Condensed) -U+1d706 u1D706 2.23 (Serif Italic, Serif Italic Condensed) -U+1d707 u1D707 2.23 (Serif Italic, Serif Italic Condensed) -U+1d708 u1D708 2.23 (Serif Italic, Serif Italic Condensed) -U+1d709 u1D709 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70a u1D70A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70b u1D70B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70c u1D70C 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70d u1D70D 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70e u1D70E 2.23 (Serif Italic, Serif Italic Condensed) -U+1d70f u1D70F 2.23 (Serif Italic, Serif Italic Condensed) -U+1d710 u1D710 2.23 (Serif Italic, Serif Italic Condensed) -U+1d711 u1D711 2.23 (Serif Italic, Serif Italic Condensed) -U+1d712 u1D712 2.23 (Serif Italic, Serif Italic Condensed) -U+1d713 u1D713 2.23 (Serif Italic, Serif Italic Condensed) -U+1d714 u1D714 2.23 (Serif Italic, Serif Italic Condensed) -U+1d715 u1D715 2.23 (Serif Italic, Serif Italic Condensed) -U+1d716 u1D716 2.23 (Serif Italic, Serif Italic Condensed) -U+1d717 u1D717 2.23 (Serif Italic, Serif Italic Condensed) -U+1d718 u1D718 2.23 (Serif Italic, Serif Italic Condensed) -U+1d719 u1D719 2.23 (Serif Italic, Serif Italic Condensed) -U+1d71a u1D71A 2.23 (Serif Italic, Serif Italic Condensed) -U+1d71b u1D71B 2.23 (Serif Italic, Serif Italic Condensed) -U+1d71c u1D71C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d71d u1D71D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d71e u1D71E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d71f u1D71F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d720 u1D720 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d721 u1D721 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d722 u1D722 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d723 u1D723 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d724 u1D724 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d725 u1D725 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d726 u1D726 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d727 u1D727 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d728 u1D728 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d729 u1D729 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72a u1D72A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72b u1D72B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72c u1D72C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72d u1D72D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72e u1D72E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d72f u1D72F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d730 u1D730 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d731 u1D731 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d732 u1D732 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d733 u1D733 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d734 u1D734 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d735 u1D735 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d736 u1D736 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d737 u1D737 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d738 u1D738 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d739 u1D739 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73a u1D73A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73b u1D73B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73c u1D73C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73d u1D73D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73e u1D73E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d73f u1D73F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d740 u1D740 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d741 u1D741 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d742 u1D742 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d743 u1D743 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d744 u1D744 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d745 u1D745 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d746 u1D746 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d747 u1D747 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d748 u1D748 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d749 u1D749 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74a u1D74A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74b u1D74B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74c u1D74C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74d u1D74D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74e u1D74E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d74f u1D74F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d750 u1D750 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d751 u1D751 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d752 u1D752 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d753 u1D753 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d754 u1D754 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d755 u1D755 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) -U+1d756 u1D756 2.23 (Sans Bold, Sans Condensed Bold) -U+1d757 u1D757 2.23 (Sans Bold, Sans Condensed Bold) -U+1d758 u1D758 2.23 (Sans Bold, Sans Condensed Bold) -U+1d759 u1D759 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75a u1D75A 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75b u1D75B 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75c u1D75C 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75d u1D75D 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75e u1D75E 2.23 (Sans Bold, Sans Condensed Bold) -U+1d75f u1D75F 2.23 (Sans Bold, Sans Condensed Bold) -U+1d760 u1D760 2.23 (Sans Bold, Sans Condensed Bold) -U+1d761 u1D761 2.23 (Sans Bold, Sans Condensed Bold) -U+1d762 u1D762 2.23 (Sans Bold, Sans Condensed Bold) -U+1d763 u1D763 2.23 (Sans Bold, Sans Condensed Bold) -U+1d764 u1D764 2.23 (Sans Bold, Sans Condensed Bold) -U+1d765 u1D765 2.23 (Sans Bold, Sans Condensed Bold) -U+1d766 u1D766 2.23 (Sans Bold, Sans Condensed Bold) -U+1d767 u1D767 2.23 (Sans Bold, Sans Condensed Bold) -U+1d768 u1D768 2.23 (Sans Bold, Sans Condensed Bold) -U+1d769 u1D769 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76a u1D76A 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76b u1D76B 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76c u1D76C 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76d u1D76D 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76e u1D76E 2.23 (Sans Bold, Sans Condensed Bold) -U+1d76f u1D76F 2.23 (Sans Bold, Sans Condensed Bold) -U+1d770 u1D770 2.23 (Sans Bold, Sans Condensed Bold) -U+1d771 u1D771 2.23 (Sans Bold, Sans Condensed Bold) -U+1d772 u1D772 2.23 (Sans Bold, Sans Condensed Bold) -U+1d773 u1D773 2.23 (Sans Bold, Sans Condensed Bold) -U+1d774 u1D774 2.23 (Sans Bold, Sans Condensed Bold) -U+1d775 u1D775 2.23 (Sans Bold, Sans Condensed Bold) -U+1d776 u1D776 2.23 (Sans Bold, Sans Condensed Bold) -U+1d777 u1D777 2.23 (Sans Bold, Sans Condensed Bold) -U+1d778 u1D778 2.23 (Sans Bold, Sans Condensed Bold) -U+1d779 u1D779 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77a u1D77A 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77b u1D77B 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77c u1D77C 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77d u1D77D 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77e u1D77E 2.23 (Sans Bold, Sans Condensed Bold) -U+1d77f u1D77F 2.23 (Sans Bold, Sans Condensed Bold) -U+1d780 u1D780 2.23 (Sans Bold, Sans Condensed Bold) -U+1d781 u1D781 2.23 (Sans Bold, Sans Condensed Bold) -U+1d782 u1D782 2.23 (Sans Bold, Sans Condensed Bold) -U+1d783 u1D783 2.23 (Sans Bold, Sans Condensed Bold) -U+1d784 u1D784 2.23 (Sans Bold, Sans Condensed Bold) -U+1d785 u1D785 2.23 (Sans Bold, Sans Condensed Bold) -U+1d786 u1D786 2.23 (Sans Bold, Sans Condensed Bold) -U+1d787 u1D787 2.23 (Sans Bold, Sans Condensed Bold) -U+1d788 u1D788 2.23 (Sans Bold, Sans Condensed Bold) -U+1d789 u1D789 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78a u1D78A 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78b u1D78B 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78c u1D78C 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78d u1D78D 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78e u1D78E 2.23 (Sans Bold, Sans Condensed Bold) -U+1d78f u1D78F 2.23 (Sans Bold, Sans Condensed Bold) -U+1d790 u1D790 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d791 u1D791 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d792 u1D792 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d793 u1D793 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d794 u1D794 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d795 u1D795 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d796 u1D796 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d797 u1D797 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d798 u1D798 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d799 u1D799 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79a u1D79A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79b u1D79B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79c u1D79C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79d u1D79D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79e u1D79E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d79f u1D79F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a0 u1D7A0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a1 u1D7A1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a2 u1D7A2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a3 u1D7A3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a4 u1D7A4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a5 u1D7A5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a6 u1D7A6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a7 u1D7A7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a8 u1D7A8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7a9 u1D7A9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7aa u1D7AA 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ab u1D7AB 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ac u1D7AC 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ad u1D7AD 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ae u1D7AE 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7af u1D7AF 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b0 u1D7B0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b1 u1D7B1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b2 u1D7B2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b3 u1D7B3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b4 u1D7B4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b5 u1D7B5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b6 u1D7B6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b7 u1D7B7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b8 u1D7B8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7b9 u1D7B9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ba u1D7BA 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7bb u1D7BB 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7bc u1D7BC 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7bd u1D7BD 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7be u1D7BE 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7bf u1D7BF 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c0 u1D7C0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c1 u1D7C1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c2 u1D7C2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c3 u1D7C3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c4 u1D7C4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c5 u1D7C5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c6 u1D7C6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c7 u1D7C7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c8 u1D7C8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7c9 u1D7C9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+1d7ca u1D7CA 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7cb u1D7CB 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7ce u1D7CE 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7cf u1D7CF 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d0 u1D7D0 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d1 u1D7D1 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d2 u1D7D2 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d3 u1D7D3 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d4 u1D7D4 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d5 u1D7D5 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d6 u1D7D6 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d7 u1D7D7 2.23 (Serif Bold, Serif Condensed Bold) -U+1d7d8 u1D7D8 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7d9 u1D7D9 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7da u1D7DA 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7db u1D7DB 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7dc u1D7DC 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7dd u1D7DD 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7de u1D7DE 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7df u1D7DF 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7e0 u1D7E0 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7e1 u1D7E1 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) -U+1d7e2 u1D7E2 2.23 (Sans, Sans Condensed) -U+1d7e3 u1D7E3 2.23 (Sans, Sans Condensed) -U+1d7e4 u1D7E4 2.23 (Sans, Sans Condensed) -U+1d7e5 u1D7E5 2.23 (Sans, Sans Condensed) -U+1d7e6 u1D7E6 2.23 (Sans, Sans Condensed) -U+1d7e7 u1D7E7 2.23 (Sans, Sans Condensed) -U+1d7e8 u1D7E8 2.23 (Sans, Sans Condensed) -U+1d7e9 u1D7E9 2.23 (Sans, Sans Condensed) -U+1d7ea u1D7EA 2.23 (Sans, Sans Condensed) -U+1d7eb u1D7EB 2.23 (Sans, Sans Condensed) -U+1d7ec u1D7EC 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7ed u1D7ED 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7ee u1D7EE 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7ef u1D7EF 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f0 u1D7F0 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f1 u1D7F1 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f2 u1D7F2 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f3 u1D7F3 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f4 u1D7F4 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f5 u1D7F5 2.23 (Sans Bold, Sans Condensed Bold) -U+1d7f6 u1D7F6 2.23 (Sans Mono) -U+1d7f7 u1D7F7 2.23 (Sans Mono) -U+1d7f8 u1D7F8 2.23 (Sans Mono) -U+1d7f9 u1D7F9 2.23 (Sans Mono) -U+1d7fa u1D7FA 2.23 (Sans Mono) -U+1d7fb u1D7FB 2.23 (Sans Mono) -U+1d7fc u1D7FC 2.23 (Sans Mono) -U+1d7fd u1D7FD 2.23 (Sans Mono) -U+1d7fe u1D7FE 2.23 (Sans Mono) -U+1d7ff u1D7FF 2.23 (Sans Mono) diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/unicover.txt b/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/unicover.txt deleted file mode 100644 index bd467ab2..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavu-fonts-ttf-2.30/unicover.txt +++ /dev/null @@ -1,177 +0,0 @@ -This is the Unicode coverage file for DejaVu fonts -($Id$) - -Control and similar characters are discounted from totals. - - Sans Serif Sans Mono -U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95) -U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96) -U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128) -U+0180 Latin Extended-B 100% (208/208) 91% (191/208) 86% (179/208) -U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96) -U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 60% (48/80) -U+0300 Combining Diacritical Marks 83% (93/112) 60% (68/112) 59% (67/112) -U+0370 Greek and Coptic 100% (134/134) 85% (115/134) 82% (110/134) -U+0400 Cyrillic 100% (256/256) 78% (200/256) 69% (178/256) -U+0500 Cyrillic Supplement 94% (34/36) 27% (10/36) 16% (6/36) -U+0530 Armenian 100% (86/86) (0/86) (0/86) -U+0590 Hebrew 62% (54/87) (0/87) (0/87) -U+0600 Arabic 46% (115/250) (0/250) 39% (99/250) -U+0700 Syriac (0/77) (0/77) (0/77) -U+0750 Arabic Supplement (0/48) (0/48) (0/48) -U+0780 Thaana (0/50) (0/50) (0/50) -U+07c0 NKo 91% (54/59) (0/59) (0/59) -U+0900 Devanagari (0/113) (0/113) (0/113) -U+0980 Bengali (0/91) (0/91) (0/91) -U+0a00 Gurmukhi (0/79) (0/79) (0/79) -U+0a80 Gujarati (0/83) (0/83) (0/83) -U+0b00 Oriya (0/84) (0/84) (0/84) -U+0b80 Tamil (0/72) (0/72) (0/72) -U+0c00 Telugu (0/93) (0/93) (0/93) -U+0c80 Kannada (0/86) (0/86) (0/86) -U+0d00 Malayalam (0/95) (0/95) (0/95) -U+0d80 Sinhala (0/80) (0/80) (0/80) -U+0e00 Thai 1% (1/87) (0/87) (0/87) -U+0e80 Lao 100% (65/65) (0/65) 70% (46/65) -U+0f00 Tibetan (0/201) (0/201) (0/201) -U+1000 Myanmar (0/156) (0/156) (0/156) -U+10a0 Georgian 100% (83/83) 100% (83/83) 54% (45/83) -U+1100 Hangul Jamo (0/240) (0/240) (0/240) -U+1200 Ethiopic (0/356) (0/356) (0/356) -U+1380 Ethiopic Supplement (0/26) (0/26) (0/26) -U+13a0 Cherokee (0/85) (0/85) (0/85) -U+1400 Unified Canadian Aboriginal Syllabics 64% (404/630) (0/630) (0/630) -U+1680 Ogham 100% (29/29) (0/29) (0/29) -U+16a0 Runic (0/81) (0/81) (0/81) -U+1700 Tagalog (0/20) (0/20) (0/20) -U+1720 Hanunoo (0/23) (0/23) (0/23) -U+1740 Buhid (0/20) (0/20) (0/20) -U+1760 Tagbanwa (0/18) (0/18) (0/18) -U+1780 Khmer (0/114) (0/114) (0/114) -U+1800 Mongolian (0/156) (0/156) (0/156) -U+1900 Limbu (0/66) (0/66) (0/66) -U+1950 Tai Le (0/35) (0/35) (0/35) -U+1980 New Tai Lue (0/80) (0/80) (0/80) -U+19e0 Khmer Symbols (0/32) (0/32) (0/32) -U+1a00 Buginese (0/30) (0/30) (0/30) -U+1b00 Balinese (0/121) (0/121) (0/121) -U+1b80 Sundanese (0/55) (0/55) (0/55) -U+1c00 Lepcha (0/74) (0/74) (0/74) -U+1c50 Ol Chiki (0/48) (0/48) (0/48) -U+1d00 Phonetic Extensions 82% (105/128) 48% (62/128) 48% (62/128) -U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64) -U+1dc0 Combining Diacritical Marks Supplement 14% (6/41) 14% (6/41) (0/41) -U+1e00 Latin Extended Additional 96% (248/256) 76% (196/256) 71% (182/256) -U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233) -U+2000 General Punctuation 98% (105/107) 81% (87/107) 47% (51/107) -U+2070 Superscripts and Subscripts 100% (34/34) 100% (34/34) 100% (34/34) -U+20a0 Currency Symbols 100% (22/22) 27% (6/22) 100% (22/22) -U+20d0 Combining Diacritical Marks for Symbols 21% (7/33) (0/33) (0/33) -U+2100 Letterlike Symbols 93% (75/80) 40% (32/80) 21% (17/80) -U+2150 Number Forms 92% (50/54) 92% (50/54) 24% (13/54) -U+2190 Arrows 100% (112/112) 100% (112/112) 100% (112/112) -U+2200 Mathematical Operators 100% (256/256) 39% (100/256) 58% (151/256) -U+2300 Miscellaneous Technical 27% (64/232) 6% (16/232) 50% (117/232) -U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39) -U+2440 Optical Character Recognition (0/11) (0/11) (0/11) -U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160) -U+2500 Box Drawing 100% (128/128) 100% (128/128) 100% (128/128) -U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32) -U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96) -U+2600 Miscellaneous Symbols 95% (182/191) 15% (30/191) 78% (149/191) -U+2700 Dingbats 100% (174/174) 0% (1/174) 82% (144/174) -U+27c0 Miscellaneous Mathematical Symbols-A 20% (9/44) 11% (5/44) 11% (5/44) -U+27f0 Supplemental Arrows-A 100% (16/16) 100% (16/16) (0/16) -U+2800 Braille Patterns 100% (256/256) 100% (256/256) (0/256) -U+2900 Supplemental Arrows-B 4% (6/128) 100% (128/128) (0/128) -U+2980 Miscellaneous Mathematical Symbols-B 10% (13/128) 0% (1/128) 2% (3/128) -U+2a00 Supplemental Mathematical Operators 28% (72/256) 1% (4/256) 0% (1/256) -U+2b00 Miscellaneous Symbols and Arrows 42% (35/82) 32% (27/82) 10% (9/82) -U+2c00 Glagolitic (0/94) (0/94) (0/94) -U+2c60 Latin Extended-C 96% (28/29) 55% (16/29) 34% (10/29) -U+2c80 Coptic (0/114) (0/114) (0/114) -U+2d00 Georgian Supplement (0/38) 100% (38/38) (0/38) -U+2d30 Tifinagh 100% (55/55) (0/55) (0/55) -U+2d80 Ethiopic Extended (0/79) (0/79) (0/79) -U+2de0 Cyrillic Extended-A (0/32) (0/32) (0/32) -U+2e00 Supplemental Punctuation 12% (6/49) 12% (6/49) 12% (6/49) -U+2e80 CJK Radicals Supplement (0/115) (0/115) (0/115) -U+2f00 Kangxi Radicals (0/214) (0/214) (0/214) -U+2ff0 Ideographic Description Characters (0/12) (0/12) (0/12) -U+3000 CJK Symbols and Punctuation (0/64) (0/64) (0/64) -U+3040 Hiragana (0/93) (0/93) (0/93) -U+30a0 Katakana (0/96) (0/96) (0/96) -U+3100 Bopomofo (0/41) (0/41) (0/41) -U+3130 Hangul Compatibility Jamo (0/94) (0/94) (0/94) -U+3190 Kanbun (0/16) (0/16) (0/16) -U+31a0 Bopomofo Extended (0/24) (0/24) (0/24) -U+31c0 CJK Strokes (0/36) (0/36) (0/36) -U+31f0 Katakana Phonetic Extensions (0/16) (0/16) (0/16) -U+3200 Enclosed CJK Letters and Months (0/242) (0/242) (0/242) -U+3300 CJK Compatibility (0/256) (0/256) (0/256) -U+3400 CJK Unified Ideographs Extension A (0/0) (0/0) (0/0) -U+4dc0 Yijing Hexagram Symbols 100% (64/64) (0/64) (0/64) -U+4e00 CJK Unified Ideographs (0/0) (0/0) (0/0) -U+a000 Yi Syllables (0/1165) (0/1165) (0/1165) -U+a490 Yi Radicals (0/55) (0/55) (0/55) -U+a500 Vai (0/300) (0/300) (0/300) -U+a640 Cyrillic Extended-B 39% (31/78) 12% (10/78) (0/78) -U+a700 Modifier Tone Letters 62% (20/32) 62% (20/32) 62% (20/32) -U+a720 Latin Extended-D 37% (43/114) 1% (2/114) 5% (6/114) -U+a800 Syloti Nagri (0/44) (0/44) (0/44) -U+a840 Phags-pa (0/56) (0/56) (0/56) -U+a880 Saurashtra (0/81) (0/81) (0/81) -U+a900 Kayah Li (0/48) (0/48) (0/48) -U+a930 Rejang (0/37) (0/37) (0/37) -U+aa00 Cham (0/83) (0/83) (0/83) -U+ac00 Hangul Syllables (0/0) (0/0) (0/0) -U+d800 High Surrogates (0/0) (0/0) (0/0) -U+db80 High Private Use Surrogates (0/0) (0/0) (0/0) -U+dc00 Low Surrogates (0/0) (0/0) (0/0) -U+e000 Private Use Area (0/0) (0/0) (0/0) -U+f900 CJK Compatibility Ideographs (0/467) (0/467) (0/467) -U+fb00 Alphabetic Presentation Forms 100% (58/58) 12% (7/58) 3% (2/58) -U+fb50 Arabic Presentation Forms-A 11% (70/595) (0/595) 12% (72/595) -U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16) -U+fe10 Vertical Forms (0/10) (0/10) (0/10) -U+fe20 Combining Half Marks 57% (4/7) (0/7) (0/7) -U+fe30 CJK Compatibility Forms (0/32) (0/32) (0/32) -U+fe50 Small Form Variants (0/26) (0/26) (0/26) -U+fe70 Arabic Presentation Forms-B 100% (141/141) (0/141) 100% (141/141) -U+ff00 Halfwidth and Fullwidth Forms (0/225) (0/225) (0/225) -U+fff0 Specials 100% (5/5) 100% (5/5) 100% (5/5) -U+10000 Linear B Syllabary (0/88) (0/88) (0/88) -U+10080 Linear B Ideograms (0/123) (0/123) (0/123) -U+10100 Aegean Numbers (0/57) (0/57) (0/57) -U+10140 Ancient Greek Numbers (0/75) (0/75) (0/75) -U+10190 Ancient Symbols (0/12) (0/12) (0/12) -U+101d0 Phaistos Disc (0/46) (0/46) (0/46) -U+10280 Lycian (0/29) (0/29) (0/29) -U+102a0 Carian (0/49) (0/49) (0/49) -U+10300 Old Italic (0/35) (0/35) (0/35) -U+10330 Gothic (0/27) (0/27) (0/27) -U+10380 Ugaritic (0/31) (0/31) (0/31) -U+103a0 Old Persian (0/50) (0/50) (0/50) -U+10400 Deseret (0/80) (0/80) (0/80) -U+10450 Shavian (0/48) (0/48) (0/48) -U+10480 Osmanya (0/40) (0/40) (0/40) -U+10800 Cypriot Syllabary (0/55) (0/55) (0/55) -U+10900 Phoenician (0/27) (0/27) (0/27) -U+10920 Lydian (0/27) (0/27) (0/27) -U+10a00 Kharoshthi (0/65) (0/65) (0/65) -U+12000 Cuneiform (0/879) (0/879) (0/879) -U+12400 Cuneiform Numbers and Punctuation (0/103) (0/103) (0/103) -U+1d000 Byzantine Musical Symbols (0/246) (0/246) (0/246) -U+1d100 Musical Symbols (0/220) (0/220) (0/220) -U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70) -U+1d300 Tai Xuan Jing Symbols 100% (87/87) (0/87) (0/87) -U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18) -U+1d400 Mathematical Alphanumeric Symbols 11% (117/996) 5% (55/996) 6% (62/996) -U+1f000 Mahjong Tiles (0/44) (0/44) (0/44) -U+1f030 Domino Tiles (0/100) (0/100) (0/100) -U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0) -U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542) -U+e0000 Tags (0/98) (0/98) (0/98) -U+e0100 Variation Selectors Supplement (0/240) (0/240) (0/240) -U+f0000 Supplementary Private Use Area-A (0/0) (0/0) (0/0) -U+100000 Supplementary Private Use Area-B (0/0) (0/0) (0/0) diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.ctg.z deleted file mode 100644 index 3170ea6f..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.php deleted file mode 100644 index 872dd942..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.php +++ /dev/null @@ -1,517 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>30,'Flags'=>96,'FontBBox'=>'[-1021 -350 1681 1167]','ItalicAngle'=>20.8,'StemV'=>70,'MissingWidth'=>600); -$up=-63; -$ut=44; -$dw=600; -$cw=array( -0=>600,32=>318,33=>401,34=>460,35=>838,36=>636,37=>950,38=>780,39=>275,40=>390, -41=>390,42=>500,43=>838,44=>318,45=>361,46=>318,47=>337,48=>636,49=>636,50=>636, -51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838, -61=>838,62=>838,63=>531,64=>1000,65=>684,66=>686,67=>698,68=>770,69=>632,70=>575, -71=>775,72=>752,73=>295,74=>295,75=>656,76=>557,77=>863,78=>748,79=>787,80=>603, -81=>787,82=>695,83=>635,84=>611,85=>732,86=>684,87=>989,88=>685,89=>611,90=>685, -91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>613,98=>635,99=>550,100=>635, -101=>615,102=>352,103=>635,104=>634,105=>278,106=>278,107=>579,108=>278,109=>974,110=>634, -111=>612,112=>635,113=>635,114=>411,115=>521,116=>392,117=>634,118=>592,119=>818,120=>592, -121=>592,122=>525,123=>636,124=>337,125=>636,126=>838,8364=>636,8218=>318,402=>352,8222=>518, -8230=>1000,8224=>500,8225=>500,710=>500,8240=>1342,352=>635,8249=>400,338=>1070,381=>685,8216=>318, -8217=>318,8220=>518,8221=>518,8226=>590,8211=>500,8212=>1000,732=>500,8482=>1000,353=>521,8250=>400, -339=>1023,382=>525,376=>611,160=>318,161=>401,162=>636,163=>636,164=>636,165=>636,166=>337, -167=>500,168=>500,169=>1000,170=>471,171=>612,172=>838,173=>361,174=>1000,175=>500,176=>500, -177=>838,178=>401,179=>401,180=>500,181=>636,182=>636,183=>318,184=>500,185=>401,186=>471, -187=>612,188=>969,189=>969,190=>969,191=>531,192=>684,193=>684,194=>684,195=>684,196=>684, -197=>684,198=>974,199=>698,200=>632,201=>632,202=>632,203=>632,204=>295,205=>295,206=>295, -207=>295,208=>775,209=>748,210=>787,211=>787,212=>787,213=>787,214=>787,215=>838,216=>787, -217=>732,218=>732,219=>732,220=>732,221=>611,222=>605,223=>630,224=>613,225=>613,226=>613, -227=>613,228=>613,229=>613,230=>982,231=>550,232=>615,233=>615,234=>615,235=>615,236=>278, -237=>278,238=>278,239=>278,240=>612,241=>634,242=>612,243=>612,244=>612,245=>612,246=>612, -247=>838,248=>612,249=>634,250=>634,251=>634,252=>634,253=>592,254=>635,255=>592,256=>684, -257=>613,258=>684,259=>613,260=>684,261=>613,262=>698,263=>550,264=>698,265=>550,266=>698, -267=>550,268=>698,269=>550,270=>770,271=>635,272=>775,273=>635,274=>632,275=>615,276=>632, -277=>615,278=>632,279=>615,280=>632,281=>615,282=>632,283=>615,284=>775,285=>635,286=>775, -287=>635,288=>775,289=>635,290=>775,291=>635,292=>752,293=>634,294=>916,295=>695,296=>295, -297=>278,298=>295,299=>278,300=>295,301=>278,302=>295,303=>278,304=>295,305=>278,306=>590, -307=>556,308=>295,309=>278,310=>656,311=>579,312=>579,313=>557,314=>278,315=>557,316=>278, -317=>557,318=>375,319=>557,320=>342,321=>562,322=>284,323=>748,324=>634,325=>748,326=>634, -327=>748,328=>634,329=>813,330=>748,331=>634,332=>787,333=>612,334=>787,335=>612,336=>787, -337=>612,340=>695,341=>411,342=>695,343=>411,344=>695,345=>411,346=>635,347=>521,348=>635, -349=>521,350=>635,351=>521,354=>611,355=>392,356=>611,357=>392,358=>611,359=>392,360=>732, -361=>634,362=>732,363=>634,364=>732,365=>634,366=>732,367=>634,368=>732,369=>634,370=>732, -371=>634,372=>989,373=>818,374=>611,375=>592,377=>685,378=>525,379=>685,380=>525,383=>352, -384=>635,385=>735,386=>686,387=>635,388=>686,389=>635,390=>703,391=>698,392=>550,393=>775, -394=>819,395=>686,396=>635,397=>612,398=>632,399=>787,400=>614,401=>575,403=>775,404=>687, -405=>984,406=>354,407=>295,408=>746,409=>579,410=>278,411=>592,412=>974,413=>748,414=>634, -415=>787,416=>913,417=>612,418=>949,419=>759,420=>652,421=>635,422=>695,423=>635,424=>521, -425=>632,426=>336,427=>392,428=>611,429=>392,430=>611,431=>858,432=>634,433=>764,434=>721, -435=>744,436=>730,437=>685,438=>525,439=>666,440=>666,441=>578,442=>525,443=>636,444=>666, -445=>578,446=>510,447=>635,448=>295,449=>492,450=>459,451=>295,452=>1422,453=>1299,454=>1154, -455=>835,456=>787,457=>457,458=>931,459=>924,460=>797,461=>684,462=>613,463=>295,464=>278, -465=>787,466=>612,467=>732,468=>634,469=>732,470=>634,471=>732,472=>634,473=>732,474=>634, -475=>732,476=>634,477=>615,478=>684,479=>613,480=>684,481=>613,482=>974,483=>982,484=>775, -485=>635,486=>775,487=>635,488=>656,489=>579,490=>787,491=>612,492=>787,493=>612,494=>666, -495=>578,496=>278,497=>1422,498=>1299,499=>1154,500=>775,501=>635,502=>1113,503=>682,504=>748, -505=>634,506=>684,507=>613,508=>974,509=>982,510=>787,511=>612,512=>684,513=>613,514=>684, -515=>613,516=>632,517=>615,518=>632,519=>615,520=>295,521=>278,522=>295,523=>278,524=>787, -525=>612,526=>787,527=>612,528=>695,529=>411,530=>695,531=>411,532=>732,533=>634,534=>732, -535=>634,536=>635,537=>521,538=>611,539=>392,540=>627,541=>521,542=>752,543=>634,544=>735, -545=>838,546=>698,547=>610,548=>685,549=>525,550=>684,551=>613,552=>632,553=>615,554=>787, -555=>612,556=>787,557=>612,558=>787,559=>612,560=>787,561=>612,562=>611,563=>592,564=>475, -565=>843,566=>477,567=>278,568=>998,569=>998,570=>684,571=>698,572=>550,573=>557,574=>611, -575=>521,576=>525,577=>603,578=>479,579=>686,580=>732,581=>684,582=>632,583=>615,584=>295, -585=>278,586=>781,587=>635,588=>695,589=>411,590=>611,591=>592,592=>600,593=>635,594=>635, -595=>635,596=>549,597=>550,598=>635,599=>696,600=>615,601=>615,602=>819,603=>541,604=>532, -605=>775,606=>664,607=>278,608=>696,609=>635,610=>629,611=>596,612=>596,613=>634,614=>634, -615=>634,616=>278,617=>338,618=>372,619=>396,620=>487,621=>278,622=>706,623=>974,624=>974, -625=>974,626=>646,627=>642,628=>634,629=>612,630=>858,631=>728,632=>660,633=>414,634=>414, -635=>414,636=>411,637=>411,638=>530,639=>530,640=>604,641=>604,642=>521,643=>336,644=>336, -645=>461,646=>336,647=>392,648=>392,649=>634,650=>618,651=>598,652=>592,653=>818,654=>592, -655=>611,656=>525,657=>525,658=>578,659=>578,660=>510,661=>510,662=>510,663=>510,664=>787, -665=>580,666=>664,667=>708,668=>654,669=>292,670=>667,671=>507,672=>727,673=>510,674=>510, -675=>1014,676=>1058,677=>1013,678=>824,679=>610,680=>778,681=>848,682=>641,683=>654,684=>515, -685=>515,686=>661,687=>664,688=>404,689=>399,690=>175,691=>259,692=>295,693=>296,694=>379, -695=>515,696=>373,697=>278,698=>460,699=>318,700=>318,701=>318,702=>307,703=>307,704=>370, -705=>370,706=>500,707=>500,708=>500,709=>500,711=>500,712=>275,713=>500,714=>500,715=>500, -716=>275,717=>500,718=>500,719=>500,720=>337,721=>337,722=>307,723=>307,724=>500,725=>500, -726=>390,727=>317,728=>500,729=>500,730=>500,731=>500,733=>500,734=>315,735=>500,736=>426, -737=>166,738=>373,739=>444,740=>370,741=>493,742=>493,743=>493,744=>493,745=>493,748=>500, -749=>500,750=>518,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, -774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, -784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, -794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, -844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, -860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>654,881=>568,882=>862, -883=>647,884=>278,885=>278,886=>748,887=>650,890=>500,891=>549,892=>550,893=>549,894=>337, -900=>500,901=>500,902=>692,903=>318,904=>746,905=>871,906=>408,908=>813,910=>825,911=>826, -912=>338,913=>684,914=>686,915=>557,916=>684,917=>632,918=>685,919=>752,920=>787,921=>295, -922=>656,923=>684,924=>863,925=>748,926=>632,927=>787,928=>752,929=>603,931=>632,932=>611, -933=>611,934=>787,935=>685,936=>787,937=>764,938=>295,939=>611,940=>659,941=>541,942=>634, -943=>338,944=>579,945=>659,946=>638,947=>592,948=>612,949=>541,950=>544,951=>634,952=>612, -953=>338,954=>589,955=>592,956=>636,957=>559,958=>558,959=>612,960=>602,961=>635,962=>587, -963=>634,964=>602,965=>579,966=>660,967=>578,968=>660,969=>837,970=>338,971=>579,972=>612, -973=>579,974=>837,975=>656,976=>614,977=>619,978=>699,979=>842,980=>699,981=>660,982=>837, -983=>664,984=>787,985=>612,986=>648,987=>587,988=>575,989=>458,990=>660,991=>660,992=>865, -993=>627,994=>934,995=>837,996=>758,997=>659,998=>792,999=>615,1000=>687,1001=>607,1002=>768, -1003=>625,1004=>699,1005=>612,1006=>611,1007=>536,1008=>664,1009=>635,1010=>550,1011=>278,1012=>787, -1013=>615,1014=>615,1015=>605,1016=>635,1017=>698,1018=>863,1019=>651,1020=>635,1021=>703,1022=>698, -1023=>703,1024=>632,1025=>632,1026=>786,1027=>610,1028=>698,1029=>635,1030=>295,1031=>295,1032=>295, -1033=>1094,1034=>1045,1035=>786,1036=>710,1037=>748,1038=>609,1039=>752,1040=>684,1041=>686,1042=>686, -1043=>610,1044=>781,1045=>632,1046=>1077,1047=>641,1048=>748,1049=>748,1050=>710,1051=>752,1052=>863, -1053=>752,1054=>787,1055=>752,1056=>603,1057=>698,1058=>611,1059=>609,1060=>861,1061=>685,1062=>776, -1063=>686,1064=>1069,1065=>1094,1066=>833,1067=>882,1068=>686,1069=>698,1070=>1080,1071=>695,1072=>613, -1073=>617,1074=>589,1075=>525,1076=>691,1077=>615,1078=>901,1079=>532,1080=>650,1081=>650,1082=>604, -1083=>639,1084=>754,1085=>654,1086=>612,1087=>654,1088=>635,1089=>550,1090=>583,1091=>592,1092=>855, -1093=>592,1094=>681,1095=>591,1096=>915,1097=>942,1098=>707,1099=>790,1100=>589,1101=>549,1102=>842, -1103=>602,1104=>615,1105=>615,1106=>625,1107=>525,1108=>549,1109=>521,1110=>278,1111=>278,1112=>278, -1113=>902,1114=>898,1115=>652,1116=>604,1117=>650,1118=>592,1119=>654,1120=>934,1121=>837,1122=>771, -1123=>672,1124=>942,1125=>749,1126=>879,1127=>783,1128=>1160,1129=>1001,1130=>787,1131=>612,1132=>1027, -1133=>824,1134=>636,1135=>541,1136=>856,1137=>876,1138=>787,1139=>612,1140=>781,1141=>665,1142=>781, -1143=>665,1144=>992,1145=>904,1146=>953,1147=>758,1148=>1180,1149=>1028,1150=>934,1151=>837,1152=>698, -1153=>550,1154=>502,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>772, -1163=>677,1164=>686,1165=>589,1166=>603,1167=>635,1168=>610,1169=>525,1170=>675,1171=>590,1172=>624, -1173=>530,1174=>1077,1175=>901,1176=>641,1177=>532,1178=>710,1179=>604,1180=>710,1181=>604,1182=>710, -1183=>604,1184=>856,1185=>832,1186=>752,1187=>661,1188=>1014,1189=>877,1190=>1081,1191=>916,1192=>878, -1193=>693,1194=>698,1195=>550,1196=>611,1197=>583,1198=>611,1199=>592,1200=>611,1201=>592,1202=>685, -1203=>592,1204=>934,1205=>807,1206=>686,1207=>591,1208=>686,1209=>591,1210=>686,1211=>634,1212=>941, -1213=>728,1214=>941,1215=>728,1216=>295,1217=>1077,1218=>901,1219=>656,1220=>604,1221=>776,1222=>670, -1223=>752,1224=>661,1225=>776,1226=>681,1227=>686,1228=>591,1229=>888,1230=>774,1231=>278,1232=>684, -1233=>613,1234=>684,1235=>613,1236=>974,1237=>982,1238=>632,1239=>615,1240=>787,1241=>615,1242=>787, -1243=>615,1244=>1077,1245=>901,1246=>641,1247=>532,1248=>666,1249=>578,1250=>748,1251=>650,1252=>748, -1253=>650,1254=>787,1255=>612,1256=>787,1257=>612,1258=>787,1259=>612,1260=>698,1261=>549,1262=>609, -1263=>592,1264=>609,1265=>592,1266=>609,1267=>592,1268=>686,1269=>591,1270=>610,1271=>525,1272=>882, -1273=>790,1274=>675,1275=>590,1276=>685,1277=>592,1278=>685,1279=>592,1280=>686,1281=>589,1282=>1006, -1283=>897,1284=>975,1285=>869,1286=>679,1287=>588,1288=>1072,1289=>957,1290=>1113,1291=>967,1292=>775, -1293=>660,1294=>773,1295=>711,1296=>614,1297=>541,1298=>752,1299=>639,1300=>1169,1301=>994,1302=>894, -1303=>864,1304=>1032,1305=>986,1306=>787,1307=>635,1308=>989,1309=>818,1312=>1081,1313=>905,1314=>1081, -1315=>912,1316=>793,1317=>683,1329=>867,1330=>732,1331=>882,1332=>882,1333=>732,1334=>644,1335=>682, -1336=>732,1337=>851,1338=>882,1339=>732,1340=>557,1341=>824,1342=>986,1343=>732,1344=>707,1345=>644, -1346=>882,1347=>777,1348=>882,1349=>732,1350=>840,1351=>732,1352=>732,1353=>732,1354=>791,1355=>644, -1356=>882,1357=>732,1358=>882,1359=>635,1360=>732,1361=>732,1362=>799,1363=>787,1364=>790,1365=>787, -1366=>635,1369=>307,1370=>318,1371=>500,1372=>500,1373=>392,1374=>526,1375=>500,1377=>974,1378=>634, -1379=>762,1380=>767,1381=>634,1382=>697,1383=>533,1384=>634,1385=>700,1386=>697,1387=>634,1388=>404, -1389=>894,1390=>641,1391=>634,1392=>634,1393=>635,1394=>702,1395=>634,1396=>659,1397=>278,1398=>760, -1399=>516,1400=>634,1401=>453,1402=>974,1403=>516,1404=>769,1405=>634,1406=>696,1407=>974,1408=>634, -1409=>635,1410=>501,1411=>974,1412=>648,1413=>612,1414=>629,1415=>763,1417=>337,1418=>433,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>361,1471=>0,1472=>295,1473=>0,1474=>0,1475=>295,1478=>441, -1479=>0,1488=>629,1489=>608,1490=>448,1491=>594,1492=>640,1493=>272,1494=>374,1495=>640,1496=>648, -1497=>272,1498=>592,1499=>556,1500=>599,1501=>640,1502=>659,1503=>272,1504=>441,1505=>700,1506=>563, -1507=>640,1508=>604,1509=>521,1510=>581,1511=>663,1512=>592,1513=>808,1514=>657,1520=>471,1521=>454, -1522=>471,1523=>416,1524=>645,1542=>637,1543=>637,1545=>757,1546=>977,1548=>323,1557=>0,1563=>318, -1567=>531,1569=>470,1570=>278,1571=>278,1572=>483,1573=>278,1574=>783,1575=>278,1576=>941,1577=>524, -1578=>941,1579=>941,1580=>646,1581=>646,1582=>646,1583=>445,1584=>445,1585=>483,1586=>483,1587=>1221, -1588=>1221,1589=>1209,1590=>1209,1591=>925,1592=>925,1593=>597,1594=>597,1600=>293,1601=>1037,1602=>776, -1603=>824,1604=>727,1605=>619,1606=>734,1607=>524,1608=>483,1609=>783,1610=>783,1611=>0,1612=>0, -1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1626=>500, -1632=>537,1633=>537,1634=>537,1635=>537,1636=>537,1637=>537,1638=>537,1639=>537,1640=>537,1641=>537, -1642=>537,1643=>325,1644=>318,1645=>545,1646=>941,1647=>776,1652=>292,1657=>941,1658=>941,1659=>941, -1660=>941,1661=>941,1662=>941,1663=>941,1664=>941,1665=>646,1666=>646,1667=>646,1668=>646,1669=>646, -1670=>646,1671=>646,1681=>483,1682=>483,1685=>610,1688=>483,1697=>1037,1700=>1037,1702=>1037,1705=>895, -1711=>895,1717=>727,1722=>734,1727=>646,1734=>483,1740=>783,1742=>783,1749=>524,1776=>537,1777=>537, -1778=>537,1779=>537,1780=>537,1781=>537,1782=>537,1783=>537,1784=>537,1785=>537,1984=>636,1985=>636, -1986=>636,1987=>636,1988=>636,1989=>636,1990=>636,1991=>636,1992=>636,1993=>636,1994=>278,1995=>571, -1996=>424,1997=>592,1998=>654,1999=>654,2000=>594,2001=>654,2002=>829,2003=>438,2004=>438,2005=>559, -2006=>612,2007=>350,2008=>959,2009=>473,2010=>783,2011=>654,2012=>625,2013=>734,2014=>530,2015=>724, -2016=>473,2017=>625,2018=>594,2019=>530,2020=>530,2021=>522,2022=>594,2023=>594,2027=>0,2028=>0, -2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>313,2037=>313,2040=>560, -2041=>560,2042=>361,3647=>652,3713=>670,3714=>684,3716=>688,3719=>482,3720=>628,3722=>684,3725=>688, -3732=>669,3733=>642,3734=>645,3735=>655,3737=>659,3738=>625,3739=>625,3740=>745,3741=>767,3742=>687, -3743=>687,3745=>702,3746=>688,3747=>684,3749=>649,3751=>632,3754=>703,3755=>819,3757=>633,3758=>684, -3759=>788,3760=>632,3761=>0,3762=>539,3763=>539,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0, -3769=>0,3771=>0,3772=>0,3773=>663,3776=>375,3777=>657,3778=>460,3779=>547,3780=>491,3782=>674, -3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>636,3793=>641,3794=>641,3795=>670, -3796=>625,3797=>625,3798=>703,3799=>670,3800=>674,3801=>677,3804=>1028,3805=>1028,4256=>840,4257=>690, -4258=>642,4259=>759,4260=>591,4261=>686,4262=>789,4263=>811,4264=>467,4265=>565,4266=>789,4267=>793, -4268=>584,4269=>837,4270=>750,4271=>688,4272=>811,4273=>584,4274=>584,4275=>837,4276=>837,4277=>646, -4278=>604,4279=>584,4280=>596,4281=>584,4282=>721,4283=>795,4284=>584,4285=>566,4286=>584,4287=>669, -4288=>799,4289=>542,4290=>664,4291=>542,4292=>565,4293=>674,4304=>508,4305=>508,4306=>533,4307=>785, -4308=>522,4309=>517,4310=>508,4311=>797,4312=>507,4313=>518,4314=>1058,4315=>522,4316=>523,4317=>783, -4318=>518,4319=>523,4320=>792,4321=>523,4322=>656,4323=>524,4324=>788,4325=>523,4326=>782,4327=>523, -4328=>522,4329=>522,4330=>566,4331=>523,4332=>523,4333=>489,4334=>522,4335=>498,4336=>517,4337=>560, -4338=>508,4339=>508,4340=>508,4341=>563,4342=>824,4343=>595,4344=>522,4345=>554,4346=>553,4347=>586, -4348=>304,5121=>684,5122=>684,5123=>684,5124=>684,5125=>769,5126=>769,5127=>769,5129=>769,5130=>769, -5131=>769,5132=>835,5133=>834,5134=>835,5135=>834,5136=>835,5137=>834,5138=>967,5139=>1007,5140=>967, -5141=>1007,5142=>769,5143=>967,5144=>1007,5145=>967,5146=>1007,5147=>769,5149=>256,5150=>543,5151=>423, -5152=>423,5153=>389,5154=>389,5155=>393,5156=>389,5157=>466,5158=>385,5159=>256,5160=>389,5161=>389, -5162=>389,5163=>1090,5164=>909,5165=>953,5166=>1117,5167=>684,5168=>684,5169=>684,5170=>684,5171=>729, -5172=>729,5173=>729,5175=>729,5176=>729,5177=>729,5178=>835,5179=>684,5180=>835,5181=>834,5182=>835, -5183=>834,5184=>967,5185=>1007,5186=>967,5187=>1007,5188=>967,5189=>1007,5190=>967,5191=>1007,5192=>729, -5193=>508,5194=>192,5196=>732,5197=>732,5198=>732,5199=>732,5200=>730,5201=>730,5202=>730,5204=>730, -5205=>730,5206=>730,5207=>921,5208=>889,5209=>921,5210=>889,5211=>921,5212=>889,5213=>928,5214=>900, -5215=>928,5216=>900,5217=>947,5218=>900,5219=>947,5220=>900,5221=>947,5222=>434,5223=>877,5224=>877, -5225=>866,5226=>890,5227=>628,5228=>628,5229=>628,5230=>628,5231=>628,5232=>628,5233=>628,5234=>628, -5235=>628,5236=>860,5237=>771,5238=>815,5239=>816,5240=>815,5241=>816,5242=>860,5243=>771,5244=>860, -5245=>771,5246=>815,5247=>816,5248=>815,5249=>816,5250=>815,5251=>407,5252=>407,5253=>750,5254=>775, -5255=>750,5256=>775,5257=>628,5258=>628,5259=>628,5260=>628,5261=>628,5262=>628,5263=>628,5264=>628, -5265=>628,5266=>860,5267=>771,5268=>815,5269=>816,5270=>815,5271=>816,5272=>860,5273=>771,5274=>860, -5275=>771,5276=>815,5277=>816,5278=>815,5279=>816,5280=>815,5281=>435,5282=>435,5283=>610,5284=>557, -5285=>557,5286=>557,5287=>610,5288=>610,5289=>610,5290=>557,5291=>557,5292=>749,5293=>769,5294=>746, -5295=>764,5296=>746,5297=>764,5298=>749,5299=>769,5300=>749,5301=>769,5302=>746,5303=>764,5304=>746, -5305=>764,5306=>746,5307=>386,5308=>508,5309=>386,5312=>852,5313=>852,5314=>852,5315=>852,5316=>852, -5317=>852,5318=>852,5319=>852,5320=>852,5321=>1069,5322=>1035,5323=>1059,5324=>852,5325=>1059,5326=>852, -5327=>852,5328=>600,5329=>453,5330=>600,5331=>852,5332=>852,5333=>852,5334=>852,5335=>852,5336=>852, -5337=>852,5338=>852,5339=>852,5340=>1069,5341=>1035,5342=>1059,5343=>1030,5344=>1059,5345=>1030,5346=>1069, -5347=>1035,5348=>1069,5349=>1035,5350=>1083,5351=>1030,5352=>1083,5353=>1030,5354=>600,5356=>729,5357=>603, -5358=>603,5359=>603,5360=>603,5361=>603,5362=>603,5363=>603,5364=>603,5365=>603,5366=>834,5367=>754, -5368=>792,5369=>771,5370=>792,5371=>771,5372=>834,5373=>754,5374=>834,5375=>754,5376=>792,5377=>771, -5378=>792,5379=>771,5380=>792,5381=>418,5382=>420,5383=>418,5392=>712,5393=>712,5394=>712,5395=>892, -5396=>892,5397=>892,5398=>892,5399=>910,5400=>872,5401=>910,5402=>872,5403=>910,5404=>872,5405=>1140, -5406=>1100,5407=>1140,5408=>1100,5409=>1140,5410=>1100,5411=>1140,5412=>1100,5413=>641,5414=>627,5415=>627, -5416=>627,5417=>627,5418=>627,5419=>627,5420=>627,5421=>627,5422=>627,5423=>844,5424=>781,5425=>816, -5426=>818,5427=>816,5428=>818,5429=>844,5430=>781,5431=>844,5432=>781,5433=>816,5434=>818,5435=>816, -5436=>818,5437=>816,5438=>418,5440=>389,5441=>484,5442=>916,5443=>916,5444=>916,5445=>916,5446=>916, -5447=>916,5448=>603,5449=>603,5450=>603,5451=>603,5452=>603,5453=>603,5454=>834,5455=>754,5456=>418, -5458=>729,5459=>684,5460=>684,5461=>684,5462=>684,5463=>726,5464=>726,5465=>726,5466=>726,5467=>924, -5468=>1007,5469=>508,5470=>732,5471=>732,5472=>732,5473=>732,5474=>732,5475=>732,5476=>730,5477=>730, -5478=>730,5479=>730,5480=>947,5481=>900,5482=>508,5492=>831,5493=>831,5494=>831,5495=>831,5496=>831, -5497=>831,5498=>831,5499=>563,5500=>752,5501=>484,5502=>1047,5503=>1047,5504=>1047,5505=>1047,5506=>1047, -5507=>1047,5508=>1047,5509=>825,5514=>831,5515=>831,5516=>831,5517=>831,5518=>1259,5519=>1259,5520=>1259, -5521=>1002,5522=>1002,5523=>1259,5524=>1259,5525=>700,5526=>1073,5536=>852,5537=>852,5538=>852,5539=>852, -5540=>852,5541=>852,5542=>600,5543=>643,5544=>643,5545=>643,5546=>643,5547=>643,5548=>643,5549=>643, -5550=>418,5551=>628,5598=>770,5601=>767,5702=>468,5703=>468,5742=>444,5743=>1047,5744=>1310,5745=>1632, -5746=>1632,5747=>1375,5748=>1375,5749=>1632,5750=>1632,5760=>477,5761=>493,5762=>712,5763=>931,5764=>1150, -5765=>1370,5766=>493,5767=>712,5768=>931,5769=>1150,5770=>1370,5771=>498,5772=>718,5773=>938,5774=>1159, -5775=>1379,5776=>493,5777=>712,5778=>930,5779=>1149,5780=>1370,5781=>498,5782=>752,5783=>789,5784=>1205, -5785=>1150,5786=>683,5787=>507,5788=>507,7424=>592,7425=>717,7426=>982,7427=>586,7428=>550,7429=>605, -7430=>605,7431=>491,7432=>541,7433=>278,7434=>395,7435=>579,7436=>583,7437=>754,7438=>650,7439=>612, -7440=>550,7441=>684,7442=>684,7443=>684,7444=>1023,7446=>612,7447=>612,7448=>524,7449=>602,7450=>602, -7451=>583,7452=>574,7453=>737,7454=>948,7455=>638,7456=>592,7457=>818,7458=>525,7459=>526,7462=>583, -7463=>592,7464=>564,7465=>524,7466=>590,7467=>639,7468=>431,7469=>613,7470=>432,7472=>485,7473=>398, -7474=>398,7475=>488,7476=>474,7477=>186,7478=>186,7479=>413,7480=>351,7481=>543,7482=>471,7483=>471, -7484=>496,7485=>439,7486=>380,7487=>438,7488=>385,7489=>461,7490=>623,7491=>392,7492=>392,7493=>405, -7494=>648,7495=>428,7496=>405,7497=>417,7498=>417,7499=>360,7500=>359,7501=>405,7502=>179,7503=>426, -7504=>623,7505=>409,7506=>414,7507=>370,7508=>414,7509=>414,7510=>428,7511=>295,7512=>405,7513=>470, -7514=>623,7515=>417,7517=>402,7518=>373,7519=>385,7520=>416,7521=>364,7522=>179,7523=>259,7524=>405, -7525=>417,7526=>402,7527=>373,7528=>412,7529=>416,7530=>364,7543=>635,7544=>474,7547=>372,7557=>278, -7579=>405,7580=>370,7581=>370,7582=>414,7583=>360,7584=>296,7585=>233,7586=>405,7587=>405,7588=>261, -7589=>250,7590=>261,7591=>261,7592=>234,7593=>250,7594=>235,7595=>376,7596=>623,7597=>623,7598=>411, -7599=>479,7600=>409,7601=>414,7602=>414,7603=>360,7604=>287,7605=>295,7606=>508,7607=>418,7608=>361, -7609=>406,7610=>417,7611=>366,7612=>437,7613=>366,7614=>392,7615=>414,7620=>0,7621=>0,7622=>0, -7623=>0,7624=>0,7625=>0,7680=>684,7681=>613,7682=>686,7683=>635,7684=>686,7685=>635,7686=>686, -7687=>635,7688=>698,7689=>550,7690=>770,7691=>635,7692=>770,7693=>635,7694=>770,7695=>635,7696=>770, -7697=>635,7698=>770,7699=>635,7700=>632,7701=>615,7702=>632,7703=>615,7704=>632,7705=>615,7706=>632, -7707=>615,7708=>632,7709=>615,7710=>575,7711=>352,7712=>775,7713=>635,7714=>752,7715=>634,7716=>752, -7717=>634,7718=>752,7719=>634,7720=>752,7721=>634,7722=>752,7723=>634,7724=>295,7725=>278,7726=>295, -7727=>278,7728=>656,7729=>579,7730=>656,7731=>579,7732=>656,7733=>579,7734=>557,7735=>288,7736=>557, -7737=>288,7738=>557,7739=>278,7740=>557,7741=>278,7742=>863,7743=>974,7744=>863,7745=>974,7746=>863, -7747=>974,7748=>748,7749=>634,7750=>748,7751=>634,7752=>748,7753=>634,7754=>748,7755=>634,7756=>787, -7757=>612,7758=>787,7759=>612,7760=>787,7761=>612,7762=>787,7763=>612,7764=>603,7765=>635,7766=>603, -7767=>635,7768=>695,7769=>411,7770=>695,7771=>411,7772=>695,7773=>411,7774=>695,7775=>411,7776=>635, -7777=>521,7778=>635,7779=>521,7780=>635,7781=>521,7782=>635,7783=>521,7784=>635,7785=>521,7786=>611, -7787=>392,7788=>611,7789=>392,7790=>611,7791=>392,7792=>611,7793=>392,7794=>732,7795=>634,7796=>732, -7797=>634,7798=>732,7799=>634,7800=>732,7801=>634,7802=>732,7803=>634,7804=>684,7805=>592,7806=>684, -7807=>592,7808=>989,7809=>818,7810=>989,7811=>818,7812=>989,7813=>818,7814=>989,7815=>818,7816=>989, -7817=>818,7818=>685,7819=>592,7820=>685,7821=>592,7822=>611,7823=>592,7824=>685,7825=>525,7826=>685, -7827=>525,7828=>685,7829=>525,7830=>634,7831=>392,7832=>818,7833=>592,7834=>613,7835=>352,7838=>769, -7839=>612,7840=>684,7841=>613,7842=>684,7843=>613,7844=>684,7845=>613,7846=>684,7847=>613,7848=>684, -7849=>613,7850=>684,7851=>613,7852=>684,7853=>613,7854=>684,7855=>613,7856=>684,7857=>613,7858=>684, -7859=>613,7860=>684,7861=>613,7862=>684,7863=>613,7864=>632,7865=>615,7866=>632,7867=>615,7868=>632, -7869=>615,7870=>632,7871=>615,7872=>632,7873=>615,7874=>632,7875=>615,7876=>632,7877=>615,7878=>632, -7879=>615,7880=>295,7881=>278,7882=>295,7883=>278,7884=>787,7885=>612,7886=>787,7887=>612,7888=>787, -7889=>612,7890=>787,7891=>612,7892=>787,7893=>612,7894=>787,7895=>612,7896=>787,7897=>612,7898=>913, -7899=>612,7900=>913,7901=>612,7902=>913,7903=>612,7904=>913,7905=>612,7906=>913,7907=>612,7908=>732, -7909=>634,7910=>732,7911=>634,7912=>858,7913=>634,7914=>858,7915=>634,7916=>858,7917=>634,7918=>858, -7919=>634,7920=>858,7921=>634,7922=>611,7923=>592,7924=>611,7925=>592,7926=>611,7927=>592,7928=>611, -7929=>592,7936=>659,7937=>659,7938=>659,7939=>659,7940=>659,7941=>659,7942=>659,7943=>659,7944=>684, -7945=>684,7946=>877,7947=>877,7948=>769,7949=>801,7950=>708,7951=>743,7952=>541,7953=>541,7954=>541, -7955=>541,7956=>541,7957=>541,7960=>711,7961=>711,7962=>966,7963=>975,7964=>898,7965=>928,7968=>634, -7969=>634,7970=>634,7971=>634,7972=>634,7973=>634,7974=>634,7975=>634,7976=>837,7977=>835,7978=>1086, -7979=>1089,7980=>1027,7981=>1051,7982=>934,7983=>947,7984=>338,7985=>338,7986=>338,7987=>338,7988=>338, -7989=>338,7990=>338,7991=>338,7992=>380,7993=>374,7994=>635,7995=>635,7996=>570,7997=>600,7998=>489, -7999=>493,8000=>612,8001=>612,8002=>612,8003=>612,8004=>612,8005=>612,8008=>804,8009=>848,8010=>1095, -8011=>1100,8012=>938,8013=>970,8016=>579,8017=>579,8018=>579,8019=>579,8020=>579,8021=>579,8022=>579, -8023=>579,8025=>784,8027=>998,8029=>1012,8031=>897,8032=>837,8033=>837,8034=>837,8035=>837,8036=>837, -8037=>837,8038=>837,8039=>837,8040=>802,8041=>843,8042=>1089,8043=>1095,8044=>946,8045=>972,8046=>921, -8047=>952,8048=>659,8049=>659,8050=>541,8051=>548,8052=>634,8053=>654,8054=>338,8055=>338,8056=>612, -8057=>612,8058=>579,8059=>579,8060=>837,8061=>837,8064=>659,8065=>659,8066=>659,8067=>659,8068=>659, -8069=>659,8070=>659,8071=>659,8072=>684,8073=>684,8074=>877,8075=>877,8076=>769,8077=>801,8078=>708, -8079=>743,8080=>634,8081=>634,8082=>634,8083=>634,8084=>634,8085=>634,8086=>634,8087=>634,8088=>837, -8089=>835,8090=>1086,8091=>1089,8092=>1027,8093=>1051,8094=>934,8095=>947,8096=>837,8097=>837,8098=>837, -8099=>837,8100=>837,8101=>837,8102=>837,8103=>837,8104=>802,8105=>843,8106=>1089,8107=>1095,8108=>946, -8109=>972,8110=>921,8111=>952,8112=>659,8113=>659,8114=>659,8115=>659,8116=>659,8118=>659,8119=>659, -8120=>684,8121=>684,8122=>716,8123=>692,8124=>684,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500, -8130=>634,8131=>634,8132=>654,8134=>634,8135=>634,8136=>805,8137=>746,8138=>931,8139=>871,8140=>752, -8141=>500,8142=>500,8143=>500,8144=>338,8145=>338,8146=>338,8147=>338,8150=>338,8151=>338,8152=>295, -8153=>295,8154=>475,8155=>408,8157=>500,8158=>500,8159=>500,8160=>579,8161=>579,8162=>579,8163=>579, -8164=>635,8165=>635,8166=>579,8167=>579,8168=>611,8169=>611,8170=>845,8171=>825,8172=>685,8173=>500, -8174=>500,8175=>500,8178=>837,8179=>837,8180=>837,8182=>837,8183=>837,8184=>941,8185=>813,8186=>922, -8187=>826,8188=>764,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250, -8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, -8208=>361,8209=>361,8210=>636,8213=>1000,8214=>500,8215=>500,8219=>318,8223=>518,8227=>590,8228=>334, -8229=>667,8231=>318,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8241=>1735,8242=>227, -8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339,8251=>838,8252=>485,8253=>531,8254=>500, -8255=>804,8256=>804,8257=>250,8258=>1000,8259=>500,8260=>167,8261=>390,8262=>390,8263=>922,8264=>733, -8265=>733,8266=>497,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8272=>804,8273=>500,8274=>450, -8275=>1000,8276=>804,8277=>838,8278=>586,8279=>663,8280=>838,8281=>838,8282=>318,8283=>797,8284=>838, -8285=>318,8286=>318,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0, -8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>179,8308=>401,8309=>401,8310=>401,8311=>401, -8312=>401,8313=>401,8314=>528,8315=>528,8316=>528,8317=>246,8318=>246,8319=>398,8320=>401,8321=>401, -8322=>401,8323=>401,8324=>401,8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528, -8332=>528,8333=>246,8334=>246,8336=>392,8337=>417,8338=>414,8339=>444,8340=>417,8352=>877,8353=>636, -8354=>636,8355=>636,8356=>636,8357=>974,8358=>748,8359=>1272,8360=>1074,8361=>989,8362=>784,8363=>635, -8365=>636,8366=>636,8367=>1272,8368=>636,8369=>636,8370=>636,8371=>636,8372=>774,8373=>641,8400=>0, -8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1019,8449=>1019,8450=>698,8451=>1123, -8452=>642,8453=>1019,8454=>1067,8455=>614,8456=>698,8457=>952,8459=>988,8460=>754,8461=>850,8462=>634, -8463=>634,8464=>470,8465=>697,8466=>720,8467=>413,8468=>818,8469=>801,8470=>1040,8471=>1000,8472=>697, -8473=>701,8474=>787,8475=>798,8476=>814,8477=>792,8478=>896,8479=>684,8480=>1020,8481=>1074,8483=>684, -8484=>745,8485=>578,8486=>764,8487=>764,8488=>616,8489=>338,8490=>656,8491=>684,8492=>786,8493=>703, -8494=>854,8495=>592,8496=>605,8497=>786,8498=>575,8499=>1069,8500=>462,8501=>745,8502=>674,8503=>466, -8504=>645,8505=>380,8506=>926,8507=>1194,8508=>702,8509=>728,8510=>654,8511=>849,8512=>811,8513=>775, -8514=>557,8515=>557,8516=>611,8517=>819,8518=>708,8519=>615,8520=>351,8521=>351,8523=>780,8526=>526, -8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969,8539=>969,8540=>969, -8541=>969,8542=>969,8543=>568,8544=>295,8545=>492,8546=>689,8547=>923,8548=>684,8549=>922,8550=>1120, -8551=>1317,8552=>917,8553=>685,8554=>933,8555=>1131,8556=>557,8557=>698,8558=>770,8559=>863,8560=>278, -8561=>458,8562=>637,8563=>812,8564=>592,8565=>811,8566=>991,8567=>1170,8568=>819,8569=>592,8570=>822, -8571=>1002,8572=>278,8573=>550,8574=>635,8575=>974,8576=>1245,8577=>770,8578=>1245,8579=>703,8580=>549, -8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838, -8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838, -8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838, -8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838, -8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838, -8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838, -8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838, -8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838, -8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838, -8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838, -8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838, -8702=>838,8703=>838,8704=>684,8705=>636,8706=>517,8707=>632,8708=>632,8709=>871,8710=>669,8711=>669, -8712=>871,8713=>871,8714=>718,8715=>871,8716=>871,8717=>718,8718=>636,8719=>757,8720=>757,8721=>674, -8722=>838,8723=>838,8724=>838,8725=>337,8726=>637,8727=>838,8728=>626,8729=>626,8730=>637,8731=>637, -8732=>637,8733=>714,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500,8740=>500,8741=>500, -8742=>500,8743=>732,8744=>732,8745=>732,8746=>732,8747=>521,8748=>789,8749=>1057,8750=>521,8751=>789, -8752=>1057,8753=>521,8754=>521,8755=>521,8756=>636,8757=>636,8758=>260,8759=>636,8760=>838,8761=>838, -8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838,8770=>838,8771=>838, -8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838,8780=>838,8781=>838, -8782=>838,8783=>838,8784=>838,8785=>838,8786=>839,8787=>839,8788=>1000,8789=>1000,8790=>838,8791=>838, -8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838,8800=>838,8801=>838, -8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>838,8809=>838,8810=>1047,8811=>1047, -8812=>464,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838,8820=>838,8821=>838, -8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838,8830=>838,8831=>838, -8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8840=>838,8841=>838, -8842=>838,8843=>838,8844=>732,8845=>732,8846=>732,8847=>838,8848=>838,8849=>838,8850=>838,8851=>780, -8852=>780,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838, -8862=>838,8863=>838,8864=>838,8865=>838,8866=>871,8867=>871,8868=>871,8869=>871,8870=>521,8871=>521, -8872=>871,8873=>871,8874=>871,8875=>871,8876=>871,8877=>871,8878=>871,8879=>871,8880=>838,8881=>838, -8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838,8890=>521,8891=>732, -8892=>732,8893=>732,8894=>838,8895=>838,8896=>820,8897=>820,8898=>820,8899=>820,8900=>494,8901=>318, -8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838,8910=>732,8911=>732, -8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838,8920=>1422,8921=>1422, -8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838,8930=>838,8931=>838, -8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838,8940=>838,8941=>838, -8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1000,8947=>871,8948=>718,8949=>871,8950=>871,8951=>718, -8952=>871,8953=>871,8954=>1000,8955=>871,8956=>718,8957=>871,8958=>718,8959=>871,8960=>602,8961=>602, -8962=>635,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>390,8969=>390,8970=>390,8971=>390, -8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>513,8984=>1000,8985=>838,8988=>469,8989=>469, -8990=>469,8991=>469,8992=>521,8993=>521,8996=>1152,8997=>1152,8998=>1414,8999=>1152,9000=>1443,9003=>1414, -9004=>873,9075=>338,9076=>635,9077=>837,9082=>659,9085=>757,9095=>1152,9108=>873,9115=>500,9116=>500, -9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500, -9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>521,9166=>838,9167=>945, -9187=>873,9189=>769,9250=>635,9251=>635,9312=>896,9313=>896,9314=>896,9315=>896,9316=>896,9317=>896, -9318=>896,9319=>896,9320=>896,9321=>896,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602, -9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602, -9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602, -9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602, -9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602, -9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602, -9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602, -9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602, -9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602, -9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602, -9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602, -9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602, -9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602, -9598=>602,9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769, -9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769, -9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769, -9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945, -9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550, -9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502, -9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502, -9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873, -9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527, -9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873, -9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945, -9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873, -9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769, -9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573,9736=>896,9737=>896, -9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896,9746=>896,9747=>532, -9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896,9756=>896,9757=>609, -9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746,9766=>649,9767=>784, -9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896,9776=>896,9777=>896, -9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896,9784=>896,9785=>896,9786=>896,9787=>896, -9788=>896,9789=>896,9790=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896,9796=>896,9797=>896, -9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896,9806=>896,9807=>896, -9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896,9816=>896,9817=>896, -9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896,9826=>896,9827=>896, -9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472, -9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896,9846=>896,9847=>896, -9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896,9856=>869,9857=>869, -9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896,9864=>896,9865=>896,9866=>896,9867=>896, -9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896,9874=>896,9875=>896,9876=>896,9877=>541, -9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896,9884=>896,9888=>896,9889=>702,9890=>1003, -9891=>1085,9892=>1143,9893=>901,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838,9899=>838,9900=>838, -9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>731,9907=>732,9908=>732,9909=>732,9910=>850, -9911=>732,9912=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838,9992=>838,9993=>838, -9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838,10004=>838,10005=>838, -10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838,10014=>838,10015=>838, -10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838,10025=>838,10026=>838, -10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838,10035=>838,10036=>838, -10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838,10045=>838,10046=>838, -10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838,10055=>838,10056=>838, -10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896,10070=>896,10072=>838, -10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538,10081=>838,10082=>838,10083=>838,10084=>838, -10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838,10093=>838,10094=>838, -10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>896,10103=>896,10104=>896, -10105=>896,10106=>896,10107=>896,10108=>896,10109=>896,10110=>896,10111=>896,10112=>838,10113=>838,10114=>838, -10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838,10123=>838,10124=>838, -10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838,10136=>838,10137=>838, -10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838,10146=>838,10147=>838, -10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838,10156=>838,10157=>838, -10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838,10167=>838,10168=>838, -10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>390,10182=>390,10208=>494,10214=>495, -10215=>495,10216=>390,10217=>390,10218=>556,10219=>556,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1157, -10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434, -10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732, -10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732, -10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732, -10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732, -10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732, -10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732, -10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732, -10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732, -10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732, -10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732, -10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732, -10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732, -10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732, -10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732, -10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732, -10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732, -10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732, -10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732, -10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732, -10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732, -10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732, -10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732, -10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732, -10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732, -10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732, -10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10502=>838,10503=>838,10506=>838, -10507=>838,10560=>683,10561=>683,10627=>734,10628=>734,10702=>838,10703=>1000,10704=>1000,10705=>1000,10706=>1000, -10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000,10754=>1000,10764=>1325, -10765=>521,10766=>521,10767=>521,10768=>521,10769=>521,10770=>521,10771=>521,10772=>521,10773=>521,10774=>521, -10775=>521,10776=>521,10777=>521,10778=>521,10779=>521,10780=>521,10799=>838,10877=>838,10878=>838,10879=>838, -10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838,10888=>838,10889=>838, -10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838,10898=>838,10899=>838, -10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838,10908=>838,10909=>838, -10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838,10931=>838,10932=>838, -10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838,11008=>838,11009=>838, -11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838, -11020=>838,11021=>838,11022=>836,11023=>836,11024=>836,11025=>836,11026=>945,11027=>945,11028=>945,11029=>945, -11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873,11042=>873,11043=>873, -11044=>1119,11091=>869,11092=>869,11360=>557,11361=>278,11362=>557,11363=>603,11364=>695,11365=>613,11366=>392, -11367=>752,11368=>634,11369=>656,11370=>579,11371=>685,11372=>525,11373=>781,11374=>863,11375=>684,11377=>734, -11378=>1128,11379=>961,11380=>592,11381=>654,11382=>568,11383=>660,11385=>414,11386=>612,11387=>491,11388=>175, -11389=>431,11568=>646,11569=>888,11570=>888,11571=>682,11572=>684,11573=>635,11574=>562,11575=>684,11576=>684, -11577=>632,11578=>632,11579=>683,11580=>875,11581=>685,11582=>491,11583=>685,11584=>888,11585=>888,11586=>300, -11587=>627,11588=>752,11589=>656,11590=>527,11591=>685,11592=>645,11593=>632,11594=>502,11595=>953,11596=>778, -11597=>748,11598=>621,11599=>295,11600=>778,11601=>295,11602=>752,11603=>633,11604=>888,11605=>888,11606=>752, -11607=>320,11608=>749,11609=>888,11610=>888,11611=>698,11612=>768,11613=>685,11614=>698,11615=>622,11616=>684, -11617=>752,11618=>632,11619=>788,11620=>567,11621=>788,11631=>515,11800=>531,11810=>390,11811=>390,11812=>390, -11813=>390,11822=>531,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896, -19912=>896,19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896, -19922=>896,19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896, -19932=>896,19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896, -19942=>896,19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896, -19952=>896,19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896, -19962=>896,19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>635,42565=>521,42566=>354,42567=>338, -42572=>1180,42573=>1028,42576=>1029,42577=>906,42580=>1080,42581=>842,42582=>977,42583=>843,42594=>1062,42595=>912, -42596=>1066,42597=>901,42598=>1178,42599=>1008,42600=>787,42601=>612,42602=>855,42603=>712,42604=>1358,42605=>1019, -42606=>879,42634=>782,42635=>685,42636=>611,42637=>583,42644=>686,42645=>634,42760=>493,42761=>493,42762=>493, -42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493, -42773=>493,42774=>493,42779=>369,42780=>369,42781=>252,42782=>252,42783=>252,42790=>752,42791=>634,42792=>878, -42793=>709,42794=>614,42795=>541,42800=>491,42801=>521,42802=>1250,42803=>985,42804=>1203,42805=>990,42806=>1142, -42807=>981,42808=>971,42809=>818,42810=>971,42811=>818,42812=>959,42813=>818,42814=>703,42815=>549,42822=>680, -42823=>392,42824=>582,42825=>427,42826=>807,42827=>704,42830=>1358,42831=>1019,42880=>557,42881=>278,42882=>735, -42883=>634,42889=>337,42890=>376,42891=>401,42892=>275,43003=>575,43004=>603,43005=>863,43006=>295,43007=>1199, -61440=>977,61441=>977,63173=>612,64256=>689,64257=>630,64258=>630,64259=>967,64260=>967,64261=>686,64262=>861, -64275=>1202,64276=>1202,64277=>1196,64278=>1186,64279=>1529,64285=>272,64286=>0,64287=>471,64288=>636,64289=>856, -64290=>774,64291=>906,64292=>771,64293=>843,64294=>855,64295=>807,64296=>875,64297=>838,64298=>808,64299=>808, -64300=>808,64301=>808,64302=>629,64303=>629,64304=>629,64305=>608,64306=>448,64307=>594,64308=>640,64309=>272, -64310=>374,64312=>648,64313=>336,64314=>592,64315=>556,64316=>599,64318=>659,64320=>441,64321=>700,64323=>640, -64324=>604,64326=>581,64327=>663,64328=>592,64329=>808,64330=>657,64331=>272,64332=>608,64333=>556,64334=>604, -64335=>629,64338=>941,64339=>982,64340=>278,64341=>302,64342=>941,64343=>982,64344=>278,64345=>302,64346=>941, -64347=>982,64348=>278,64349=>302,64350=>941,64351=>982,64352=>278,64353=>302,64354=>941,64355=>982,64356=>278, -64357=>302,64358=>941,64359=>982,64360=>278,64361=>302,64362=>1037,64363=>1035,64364=>478,64365=>506,64366=>1037, -64367=>1035,64368=>478,64369=>506,64370=>646,64371=>646,64372=>618,64373=>646,64374=>646,64375=>646,64376=>618, -64377=>646,64378=>646,64379=>646,64380=>618,64381=>646,64382=>646,64383=>646,64384=>618,64385=>646,64394=>483, -64395=>552,64396=>483,64397=>552,64398=>895,64399=>895,64400=>476,64401=>552,64402=>895,64403=>895,64404=>476, -64405=>552,64414=>734,64415=>761,64473=>483,64474=>517,64488=>278,64489=>302,64508=>783,64509=>833,64510=>278, -64511=>302,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, -65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0, -65059=>0,65136=>293,65137=>293,65138=>293,65139=>262,65140=>293,65142=>293,65143=>293,65144=>293,65145=>293, -65146=>293,65147=>293,65148=>293,65149=>293,65150=>293,65151=>293,65152=>470,65153=>278,65154=>305,65155=>278, -65156=>305,65157=>483,65158=>517,65159=>278,65160=>305,65161=>783,65162=>833,65163=>278,65164=>302,65165=>278, -65166=>305,65167=>941,65168=>982,65169=>278,65170=>302,65171=>524,65172=>536,65173=>941,65174=>982,65175=>278, -65176=>302,65177=>941,65178=>982,65179=>278,65180=>302,65181=>646,65182=>646,65183=>618,65184=>646,65185=>646, -65186=>646,65187=>618,65188=>646,65189=>646,65190=>646,65191=>618,65192=>646,65193=>445,65194=>525,65195=>445, -65196=>525,65197=>483,65198=>552,65199=>483,65200=>552,65201=>1221,65202=>1275,65203=>838,65204=>892,65205=>1221, -65206=>1275,65207=>838,65208=>892,65209=>1209,65210=>1225,65211=>849,65212=>867,65213=>1209,65214=>1225,65215=>849, -65216=>867,65217=>925,65218=>949,65219=>796,65220=>820,65221=>925,65222=>949,65223=>796,65224=>820,65225=>597, -65226=>532,65227=>597,65228=>482,65229=>597,65230=>532,65231=>523,65232=>482,65233=>1037,65234=>1035,65235=>478, -65236=>506,65237=>776,65238=>834,65239=>478,65240=>506,65241=>824,65242=>843,65243=>476,65244=>552,65245=>727, -65246=>757,65247=>305,65248=>331,65249=>619,65250=>666,65251=>536,65252=>578,65253=>734,65254=>761,65255=>278, -65256=>302,65257=>524,65258=>536,65259=>527,65260=>461,65261=>483,65262=>517,65263=>783,65264=>833,65265=>783, -65266=>833,65267=>278,65268=>302,65269=>570,65270=>597,65271=>570,65272=>597,65273=>570,65274=>597,65275=>570, -65276=>597,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1025); -$enc=''; -$diff=''; -$file='dejavusans.z'; -$ctg='dejavusans.ctg.z'; -$originalsize=622280; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.z deleted file mode 100644 index e7a78d24..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusans.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.ctg.z deleted file mode 100644 index 514062cc..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.php deleted file mode 100644 index 188881c1..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.php +++ /dev/null @@ -1,504 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>19,'Flags'=>32,'FontBBox'=>'[-1069 -385 1975 1174]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); -$up=-63; -$ut=44; -$dw=600; -$cw=array( -0=>600,32=>348,33=>456,34=>521,35=>838,36=>696,37=>1002,38=>872,39=>306,40=>457, -41=>457,42=>523,43=>838,44=>380,45=>415,46=>380,47=>365,48=>696,49=>696,50=>696, -51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>400,59=>400,60=>838, -61=>838,62=>838,63=>580,64=>1000,65=>774,66=>762,67=>734,68=>830,69=>683,70=>683, -71=>821,72=>837,73=>372,74=>372,75=>775,76=>637,77=>995,78=>837,79=>850,80=>733, -81=>850,82=>770,83=>720,84=>682,85=>812,86=>774,87=>1103,88=>771,89=>724,90=>725, -91=>457,92=>365,93=>457,94=>838,95=>500,96=>500,97=>675,98=>716,99=>593,100=>716, -101=>678,102=>435,103=>716,104=>712,105=>343,106=>343,107=>665,108=>343,109=>1042,110=>712, -111=>687,112=>716,113=>716,114=>493,115=>595,116=>478,117=>712,118=>652,119=>924,120=>645, -121=>652,122=>582,123=>712,124=>365,125=>712,126=>838,8364=>696,8218=>380,402=>435,8222=>657, -8230=>1000,8224=>500,8225=>500,710=>500,8240=>1440,352=>720,8249=>412,338=>1167,381=>725,8216=>380, -8217=>380,8220=>657,8221=>657,8226=>639,8211=>500,8212=>1000,732=>500,8482=>1000,353=>595,8250=>412, -339=>1094,382=>582,376=>724,160=>348,161=>456,162=>696,163=>696,164=>636,165=>696,166=>365, -167=>500,168=>500,169=>1000,170=>564,171=>646,172=>838,173=>415,174=>1000,175=>500,176=>500, -177=>838,178=>438,179=>438,180=>500,181=>736,182=>636,183=>380,184=>500,185=>438,186=>564, -187=>646,188=>1035,189=>1035,190=>1035,191=>580,192=>774,193=>774,194=>774,195=>774,196=>774, -197=>774,198=>1085,199=>734,200=>683,201=>683,202=>683,203=>683,204=>372,205=>372,206=>372, -207=>372,208=>838,209=>837,210=>850,211=>850,212=>850,213=>850,214=>850,215=>838,216=>850, -217=>812,218=>812,219=>812,220=>812,221=>724,222=>738,223=>719,224=>675,225=>675,226=>675, -227=>675,228=>675,229=>675,230=>1048,231=>593,232=>678,233=>678,234=>678,235=>678,236=>343, -237=>343,238=>343,239=>343,240=>687,241=>712,242=>687,243=>687,244=>687,245=>687,246=>687, -247=>838,248=>687,249=>712,250=>712,251=>712,252=>712,253=>652,254=>716,255=>652,256=>774, -257=>675,258=>774,259=>675,260=>774,261=>675,262=>734,263=>593,264=>734,265=>593,266=>734, -267=>593,268=>734,269=>593,270=>830,271=>716,272=>838,273=>716,274=>683,275=>678,276=>683, -277=>678,278=>683,279=>678,280=>683,281=>678,282=>683,283=>678,284=>821,285=>716,286=>821, -287=>716,288=>821,289=>716,290=>821,291=>716,292=>837,293=>712,294=>974,295=>790,296=>372, -297=>343,298=>372,299=>343,300=>372,301=>343,302=>372,303=>343,304=>372,305=>343,306=>744, -307=>686,308=>372,309=>343,310=>775,311=>665,312=>665,313=>637,314=>343,315=>637,316=>343, -317=>637,318=>479,319=>637,320=>557,321=>642,322=>371,323=>837,324=>712,325=>837,326=>712, -327=>837,328=>712,329=>983,330=>837,331=>712,332=>850,333=>687,334=>850,335=>687,336=>850, -337=>687,340=>770,341=>493,342=>770,343=>493,344=>770,345=>493,346=>720,347=>595,348=>720, -349=>595,350=>720,351=>595,354=>682,355=>478,356=>682,357=>478,358=>682,359=>478,360=>812, -361=>712,362=>812,363=>712,364=>812,365=>712,366=>812,367=>712,368=>812,369=>712,370=>812, -371=>712,372=>1103,373=>924,374=>724,375=>652,377=>725,378=>582,379=>725,380=>582,383=>435, -384=>716,385=>811,386=>762,387=>716,388=>762,389=>716,390=>734,391=>734,392=>593,393=>838, -394=>879,395=>757,396=>716,397=>688,398=>683,399=>849,400=>696,401=>683,403=>821,404=>793, -405=>1045,406=>436,407=>389,408=>775,409=>665,410=>360,411=>592,412=>1042,413=>837,414=>712, -415=>850,416=>874,417=>687,418=>1083,419=>912,420=>782,421=>716,422=>770,423=>720,424=>595, -425=>683,426=>552,427=>478,428=>707,429=>478,430=>682,431=>835,432=>712,433=>850,434=>813, -435=>797,436=>778,437=>725,438=>582,439=>772,440=>772,441=>641,442=>582,443=>696,444=>772, -445=>641,446=>573,447=>716,448=>372,449=>659,450=>544,451=>372,452=>1555,453=>1412,454=>1298, -455=>1009,456=>980,457=>686,458=>1209,459=>1180,460=>1055,461=>774,462=>675,463=>372,464=>343, -465=>850,466=>687,467=>812,468=>712,469=>812,470=>712,471=>812,472=>712,473=>812,474=>712, -475=>812,476=>712,477=>678,478=>774,479=>675,480=>774,481=>675,482=>1085,483=>1048,484=>821, -485=>716,486=>821,487=>716,488=>775,489=>665,490=>850,491=>687,492=>850,493=>687,494=>772, -495=>582,496=>343,497=>1555,498=>1412,499=>1298,500=>821,501=>716,502=>1289,503=>787,504=>837, -505=>712,506=>774,507=>675,508=>1085,509=>1048,510=>850,511=>687,512=>774,513=>675,514=>774, -515=>675,516=>683,517=>678,518=>683,519=>678,520=>372,521=>343,522=>372,523=>343,524=>850, -525=>687,526=>850,527=>687,528=>770,529=>493,530=>770,531=>493,532=>812,533=>712,534=>812, -535=>712,536=>720,537=>595,538=>682,539=>478,540=>690,541=>607,542=>837,543=>712,544=>837, -545=>865,546=>809,547=>659,548=>725,549=>582,550=>774,551=>675,552=>683,553=>678,554=>850, -555=>687,556=>850,557=>687,558=>850,559=>687,560=>850,561=>687,562=>724,563=>652,564=>492, -565=>867,566=>512,567=>343,568=>1088,569=>1088,570=>774,571=>734,572=>593,573=>637,574=>682, -575=>595,576=>582,577=>782,578=>614,579=>762,580=>812,581=>774,582=>683,583=>678,584=>372, -585=>343,586=>860,587=>791,588=>770,589=>493,590=>724,591=>652,592=>675,593=>716,594=>716, -595=>716,596=>593,597=>593,598=>717,599=>792,600=>678,601=>678,602=>876,603=>557,604=>545, -605=>815,606=>731,607=>343,608=>792,609=>716,610=>627,611=>644,612=>635,613=>712,614=>712, -615=>712,616=>545,617=>440,618=>545,619=>559,620=>693,621=>343,622=>841,623=>1042,624=>1042, -625=>1042,626=>712,627=>793,628=>707,629=>687,630=>909,631=>681,632=>796,633=>538,634=>538, -635=>650,636=>493,637=>493,638=>596,639=>596,640=>642,641=>642,642=>595,643=>415,644=>435, -645=>605,646=>552,647=>478,648=>478,649=>920,650=>772,651=>670,652=>652,653=>924,654=>652, -655=>724,656=>694,657=>684,658=>641,659=>641,660=>573,661=>573,662=>573,663=>573,664=>850, -665=>633,666=>731,667=>685,668=>691,669=>343,670=>732,671=>539,672=>792,673=>573,674=>573, -675=>1156,676=>1214,677=>1155,678=>974,679=>769,680=>929,681=>1026,682=>792,683=>780,684=>591, -685=>415,686=>677,687=>789,688=>456,689=>456,690=>219,691=>315,692=>315,693=>315,694=>411, -695=>591,696=>417,697=>302,698=>521,699=>380,700=>380,701=>380,702=>366,703=>366,704=>326, -705=>326,706=>500,707=>500,708=>500,709=>500,711=>500,712=>306,713=>500,714=>500,715=>500, -716=>306,717=>500,718=>500,719=>500,720=>337,721=>337,722=>366,723=>366,724=>500,725=>500, -726=>416,727=>328,728=>500,729=>500,730=>500,731=>500,733=>500,734=>351,735=>500,736=>412, -737=>219,738=>381,739=>413,740=>326,741=>500,742=>500,743=>500,744=>500,745=>500,748=>500, -749=>500,750=>657,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, -774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, -784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, -794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, -844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, -860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>698,881=>565,882=>1022, -883=>836,884=>302,885=>302,886=>837,887=>701,890=>500,891=>593,892=>550,893=>549,894=>400, -900=>441,901=>500,902=>797,903=>380,904=>846,905=>1009,906=>563,908=>891,910=>980,911=>894, -912=>390,913=>774,914=>762,915=>637,916=>774,917=>683,918=>725,919=>837,920=>850,921=>372, -922=>775,923=>774,924=>995,925=>837,926=>632,927=>850,928=>837,929=>733,931=>683,932=>682, -933=>724,934=>850,935=>771,936=>850,937=>850,938=>372,939=>724,940=>687,941=>557,942=>712, -943=>390,944=>675,945=>687,946=>716,947=>681,948=>687,949=>557,950=>591,951=>712,952=>687, -953=>390,954=>710,955=>633,956=>736,957=>681,958=>591,959=>687,960=>791,961=>716,962=>593, -963=>779,964=>638,965=>675,966=>782,967=>645,968=>794,969=>869,970=>390,971=>675,972=>687, -973=>675,974=>869,975=>775,976=>651,977=>661,978=>746,979=>981,980=>746,981=>796,982=>869, -983=>744,984=>850,985=>687,986=>734,987=>593,988=>683,989=>494,990=>702,991=>660,992=>919, -993=>627,994=>1093,995=>837,996=>832,997=>716,998=>928,999=>744,1000=>733,1001=>650,1002=>789, -1003=>671,1004=>752,1005=>716,1006=>682,1007=>590,1008=>744,1009=>716,1010=>593,1011=>343,1012=>850, -1013=>645,1014=>644,1015=>738,1016=>716,1017=>734,1018=>995,1019=>732,1020=>716,1021=>698,1022=>734, -1023=>698,1024=>683,1025=>683,1026=>878,1027=>637,1028=>734,1029=>720,1030=>372,1031=>372,1032=>372, -1033=>1154,1034=>1130,1035=>878,1036=>817,1037=>837,1038=>771,1039=>837,1040=>774,1041=>762,1042=>762, -1043=>637,1044=>891,1045=>683,1046=>1224,1047=>710,1048=>837,1049=>837,1050=>817,1051=>831,1052=>995, -1053=>837,1054=>850,1055=>837,1056=>733,1057=>734,1058=>682,1059=>771,1060=>992,1061=>771,1062=>928, -1063=>808,1064=>1235,1065=>1326,1066=>939,1067=>1036,1068=>762,1069=>734,1070=>1174,1071=>770,1072=>675, -1073=>698,1074=>633,1075=>522,1076=>808,1077=>678,1078=>995,1079=>581,1080=>701,1081=>701,1082=>679, -1083=>732,1084=>817,1085=>691,1086=>687,1087=>691,1088=>716,1089=>593,1090=>580,1091=>652,1092=>992, -1093=>645,1094=>741,1095=>687,1096=>1062,1097=>1105,1098=>751,1099=>904,1100=>632,1101=>593,1102=>972, -1103=>642,1104=>678,1105=>678,1106=>714,1107=>522,1108=>593,1109=>595,1110=>343,1111=>343,1112=>343, -1113=>991,1114=>956,1115=>734,1116=>679,1117=>701,1118=>652,1119=>691,1120=>1093,1121=>869,1122=>840, -1123=>736,1124=>1012,1125=>839,1126=>992,1127=>832,1128=>1358,1129=>1121,1130=>850,1131=>687,1132=>1236, -1133=>1007,1134=>696,1135=>557,1136=>1075,1137=>1061,1138=>850,1139=>687,1140=>850,1141=>695,1142=>850, -1143=>695,1144=>1148,1145=>1043,1146=>1074,1147=>863,1148=>1405,1149=>1173,1150=>1093,1151=>869,1152=>734, -1153=>593,1154=>652,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>957, -1163=>807,1164=>762,1165=>611,1166=>733,1167=>716,1168=>637,1169=>522,1170=>666,1171=>543,1172=>808, -1173=>669,1174=>1224,1175=>995,1176=>710,1177=>581,1178=>775,1179=>679,1180=>817,1181=>679,1182=>817, -1183=>679,1184=>1015,1185=>826,1186=>956,1187=>808,1188=>1103,1189=>874,1190=>1273,1191=>1017,1192=>952, -1193=>858,1194=>734,1195=>593,1196=>682,1197=>580,1198=>724,1199=>652,1200=>724,1201=>652,1202=>771, -1203=>645,1204=>1112,1205=>1000,1206=>808,1207=>687,1208=>808,1209=>687,1210=>808,1211=>712,1212=>1026, -1213=>810,1214=>1026,1215=>810,1216=>372,1217=>1224,1218=>995,1219=>775,1220=>630,1221=>951,1222=>805, -1223=>837,1224=>691,1225=>957,1226=>807,1227=>808,1228=>687,1229=>1115,1230=>933,1231=>343,1232=>774, -1233=>675,1234=>774,1235=>675,1236=>1085,1237=>1048,1238=>683,1239=>678,1240=>849,1241=>678,1242=>849, -1243=>678,1244=>1224,1245=>995,1246=>710,1247=>581,1248=>772,1249=>641,1250=>837,1251=>701,1252=>837, -1253=>701,1254=>850,1255=>687,1256=>850,1257=>687,1258=>850,1259=>687,1260=>734,1261=>593,1262=>771, -1263=>652,1264=>771,1265=>652,1266=>771,1267=>652,1268=>808,1269=>687,1270=>637,1271=>522,1272=>1036, -1273=>904,1274=>666,1275=>543,1276=>771,1277=>645,1278=>771,1279=>645,1280=>762,1281=>608,1282=>1159, -1283=>893,1284=>1119,1285=>920,1286=>828,1287=>693,1288=>1242,1289=>1017,1290=>1289,1291=>1013,1292=>839, -1293=>638,1294=>938,1295=>803,1296=>696,1297=>557,1298=>831,1299=>732,1300=>1286,1301=>1068,1302=>1065, -1303=>979,1304=>1082,1305=>1013,1306=>850,1307=>716,1308=>1103,1309=>924,1312=>1267,1313=>1059,1314=>1273, -1315=>1017,1316=>957,1317=>807,1329=>984,1330=>812,1331=>984,1332=>984,1333=>812,1334=>777,1335=>812, -1336=>812,1337=>975,1338=>984,1339=>812,1340=>710,1341=>1078,1342=>1136,1343=>812,1344=>710,1345=>757, -1346=>984,1347=>876,1348=>984,1349=>793,1350=>984,1351=>812,1352=>812,1353=>812,1354=>958,1355=>777, -1356=>984,1357=>812,1358=>984,1359=>720,1360=>812,1361=>793,1362=>895,1363=>850,1364=>936,1365=>850, -1366=>720,1369=>366,1370=>380,1371=>550,1372=>550,1373=>380,1374=>546,1375=>521,1377=>1042,1378=>712, -1379=>866,1380=>868,1381=>712,1382=>817,1383=>653,1384=>712,1385=>811,1386=>817,1387=>712,1388=>498, -1389=>1018,1390=>716,1391=>712,1392=>712,1393=>716,1394=>819,1395=>712,1396=>751,1397=>343,1398=>882, -1399=>559,1400=>712,1401=>559,1402=>1042,1403=>559,1404=>863,1405=>712,1406=>813,1407=>1042,1408=>712, -1409=>716,1410=>571,1411=>1042,1412=>778,1413=>687,1414=>720,1415=>862,1417=>400,1418=>487,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>415,1471=>0,1472=>372,1473=>0,1474=>0,1475=>372,1478=>497, -1479=>0,1488=>751,1489=>673,1490=>537,1491=>654,1492=>712,1493=>343,1494=>491,1495=>712,1496=>724, -1497=>343,1498=>649,1499=>650,1500=>679,1501=>712,1502=>775,1503=>343,1504=>497,1505=>773,1506=>678, -1507=>718,1508=>687,1509=>628,1510=>751,1511=>729,1512=>649,1513=>949,1514=>751,1520=>664,1521=>664, -1522=>663,1523=>444,1524=>710,1542=>667,1543=>667,1545=>884,1546=>1157,1548=>380,1557=>0,1563=>400, -1567=>580,1569=>511,1570=>343,1571=>343,1572=>622,1573=>343,1574=>917,1575=>343,1576=>1005,1577=>590, -1578=>1005,1579=>1005,1580=>721,1581=>721,1582=>721,1583=>513,1584=>513,1585=>576,1586=>576,1587=>1380, -1588=>1380,1589=>1345,1590=>1345,1591=>1039,1592=>1039,1593=>683,1594=>683,1600=>342,1601=>1162,1602=>894, -1603=>917,1604=>868,1605=>733,1606=>854,1607=>590,1608=>622,1609=>917,1610=>917,1611=>0,1612=>0, -1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1626=>500, -1632=>610,1633=>610,1634=>610,1635=>610,1636=>610,1637=>610,1638=>610,1639=>610,1640=>610,1641=>610, -1642=>610,1643=>374,1644=>380,1645=>545,1646=>1005,1647=>894,1652=>292,1657=>1005,1658=>1005,1659=>1005, -1660=>1005,1661=>1005,1662=>1005,1663=>1005,1664=>1005,1665=>721,1666=>721,1667=>721,1668=>721,1669=>721, -1670=>721,1671=>721,1681=>576,1682=>576,1685=>681,1688=>576,1697=>1162,1700=>1162,1702=>1162,1705=>1024, -1711=>1024,1717=>868,1722=>854,1727=>721,1734=>622,1740=>917,1742=>917,1749=>590,1776=>610,1777=>610, -1778=>610,1779=>610,1780=>610,1781=>610,1782=>610,1783=>610,1784=>610,1785=>610,1984=>696,1985=>696, -1986=>696,1987=>696,1988=>696,1989=>696,1990=>696,1991=>696,1992=>696,1993=>696,1994=>343,1995=>547, -1996=>543,1997=>652,1998=>691,1999=>691,2000=>594,2001=>691,2002=>904,2003=>551,2004=>551,2005=>627, -2006=>688,2007=>444,2008=>1022,2009=>506,2010=>826,2011=>691,2012=>652,2013=>912,2014=>627,2015=>707, -2016=>506,2017=>652,2018=>574,2019=>627,2020=>627,2021=>627,2022=>574,2023=>574,2027=>0,2028=>0, -2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>380,2037=>380,2040=>691, -2041=>691,2042=>415,3647=>743,3713=>790,3714=>748,3716=>749,3719=>569,3720=>742,3722=>744,3725=>761, -3732=>706,3733=>704,3734=>747,3735=>819,3737=>730,3738=>727,3739=>727,3740=>922,3741=>827,3742=>866, -3743=>866,3745=>836,3746=>761,3747=>770,3749=>769,3751=>713,3754=>827,3755=>1031,3757=>724,3758=>784, -3759=>934,3760=>688,3761=>0,3762=>610,3763=>610,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0, -3769=>0,3771=>0,3772=>0,3773=>670,3776=>516,3777=>860,3778=>516,3779=>650,3780=>632,3782=>759, -3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>771,3793=>771,3794=>693,3795=>836, -3796=>729,3797=>729,3798=>849,3799=>790,3800=>759,3801=>910,3804=>1363,3805=>1363,4256=>918,4257=>744, -4258=>739,4259=>837,4260=>649,4261=>773,4262=>857,4263=>889,4264=>530,4265=>633,4266=>857,4267=>900, -4268=>643,4269=>903,4270=>814,4271=>752,4272=>869,4273=>643,4274=>643,4275=>886,4276=>886,4277=>733, -4278=>653,4279=>643,4280=>646,4281=>643,4282=>790,4283=>902,4284=>633,4285=>619,4286=>643,4287=>778, -4288=>892,4289=>601,4290=>742,4291=>616,4292=>633,4293=>742,4304=>553,4305=>552,4306=>596,4307=>815, -4308=>562,4309=>563,4310=>553,4311=>827,4312=>553,4313=>543,4314=>1074,4315=>563,4316=>563,4317=>812, -4318=>552,4319=>591,4320=>822,4321=>563,4322=>690,4323=>583,4324=>813,4325=>562,4326=>813,4327=>563, -4328=>563,4329=>563,4330=>632,4331=>563,4332=>563,4333=>552,4334=>563,4335=>563,4336=>558,4337=>604, -4338=>552,4339=>552,4340=>553,4341=>605,4342=>852,4343=>635,4344=>563,4345=>596,4346=>542,4347=>684, -4348=>368,5121=>774,5122=>774,5123=>774,5124=>774,5125=>905,5126=>905,5127=>905,5129=>905,5130=>905, -5131=>905,5132=>1018,5133=>1009,5134=>1018,5135=>1009,5136=>1018,5137=>1009,5138=>1149,5139=>1140,5140=>1149, -5141=>1140,5142=>905,5143=>1149,5144=>1142,5145=>1149,5146=>1142,5147=>905,5149=>310,5150=>529,5151=>425, -5152=>425,5153=>395,5154=>395,5155=>395,5156=>395,5157=>564,5158=>470,5159=>310,5160=>395,5161=>395, -5162=>395,5163=>1213,5164=>986,5165=>1216,5166=>1297,5167=>774,5168=>774,5169=>774,5170=>774,5171=>886, -5172=>886,5173=>886,5175=>886,5176=>886,5177=>886,5178=>1018,5179=>1009,5180=>1018,5181=>1009,5182=>1018, -5183=>1009,5184=>1149,5185=>1140,5186=>1149,5187=>1140,5188=>1149,5189=>1142,5190=>1149,5191=>1142,5192=>886, -5193=>576,5194=>229,5196=>812,5197=>812,5198=>812,5199=>812,5200=>815,5201=>815,5202=>815,5204=>815, -5205=>815,5206=>815,5207=>1056,5208=>1048,5209=>1056,5210=>1048,5211=>1056,5212=>1048,5213=>1060,5214=>1054, -5215=>1060,5216=>1054,5217=>1060,5218=>1052,5219=>1060,5220=>1052,5221=>1060,5222=>483,5223=>1005,5224=>1005, -5225=>1023,5226=>1017,5227=>743,5228=>743,5229=>743,5230=>743,5231=>743,5232=>743,5233=>743,5234=>743, -5235=>743,5236=>1029,5237=>975,5238=>980,5239=>975,5240=>980,5241=>975,5242=>1029,5243=>975,5244=>1029, -5245=>975,5246=>980,5247=>975,5248=>980,5249=>975,5250=>980,5251=>501,5252=>501,5253=>938,5254=>938, -5255=>938,5256=>938,5257=>743,5258=>743,5259=>743,5260=>743,5261=>743,5262=>743,5263=>743,5264=>743, -5265=>743,5266=>1029,5267=>975,5268=>1029,5269=>975,5270=>1029,5271=>975,5272=>1029,5273=>975,5274=>1029, -5275=>975,5276=>1029,5277=>975,5278=>1029,5279=>975,5280=>1029,5281=>501,5282=>501,5283=>626,5284=>626, -5285=>626,5286=>626,5287=>626,5288=>626,5289=>626,5290=>626,5291=>626,5292=>881,5293=>854,5294=>863, -5295=>874,5296=>863,5297=>874,5298=>881,5299=>874,5300=>881,5301=>874,5302=>863,5303=>874,5304=>863, -5305=>874,5306=>863,5307=>436,5308=>548,5309=>436,5312=>988,5313=>988,5314=>988,5315=>988,5316=>931, -5317=>931,5318=>931,5319=>931,5320=>931,5321=>1238,5322=>1247,5323=>1200,5324=>1228,5325=>1200,5326=>1228, -5327=>931,5328=>660,5329=>497,5330=>660,5331=>988,5332=>988,5333=>988,5334=>988,5335=>931,5336=>931, -5337=>931,5338=>931,5339=>931,5340=>1231,5341=>1247,5342=>1283,5343=>1228,5344=>1283,5345=>1228,5346=>1228, -5347=>1214,5348=>1228,5349=>1214,5350=>1283,5351=>1228,5352=>1283,5353=>1228,5354=>660,5356=>886,5357=>730, -5358=>730,5359=>730,5360=>730,5361=>730,5362=>730,5363=>730,5364=>730,5365=>730,5366=>998,5367=>958, -5368=>967,5369=>989,5370=>967,5371=>989,5372=>998,5373=>958,5374=>998,5375=>958,5376=>967,5377=>989, -5378=>967,5379=>989,5380=>967,5381=>493,5382=>460,5383=>493,5392=>923,5393=>923,5394=>923,5395=>1136, -5396=>1136,5397=>1136,5398=>1136,5399=>1209,5400=>1202,5401=>1209,5402=>1202,5403=>1209,5404=>1202,5405=>1431, -5406=>1420,5407=>1431,5408=>1420,5409=>1431,5410=>1420,5411=>1431,5412=>1420,5413=>746,5414=>776,5415=>776, -5416=>776,5417=>776,5418=>776,5419=>776,5420=>776,5421=>776,5422=>776,5423=>1003,5424=>1003,5425=>1013, -5426=>996,5427=>1013,5428=>996,5429=>1003,5430=>1003,5431=>1003,5432=>1003,5433=>1013,5434=>996,5435=>1013, -5436=>996,5437=>1013,5438=>495,5440=>395,5441=>510,5442=>1033,5443=>1033,5444=>976,5445=>976,5446=>976, -5447=>976,5448=>733,5449=>733,5450=>733,5451=>733,5452=>733,5453=>733,5454=>1003,5455=>959,5456=>495, -5458=>886,5459=>774,5460=>774,5461=>774,5462=>774,5463=>928,5464=>928,5465=>928,5466=>928,5467=>1172, -5468=>1142,5469=>602,5470=>812,5471=>812,5472=>812,5473=>812,5474=>812,5475=>812,5476=>815,5477=>815, -5478=>815,5479=>815,5480=>1060,5481=>1052,5482=>548,5492=>977,5493=>977,5494=>977,5495=>977,5496=>977, -5497=>977,5498=>977,5499=>618,5500=>837,5501=>510,5502=>1238,5503=>1238,5504=>1238,5505=>1238,5506=>1238, -5507=>1238,5508=>1238,5509=>989,5514=>977,5515=>977,5516=>977,5517=>977,5518=>1591,5519=>1591,5520=>1591, -5521=>1295,5522=>1295,5523=>1591,5524=>1591,5525=>848,5526=>1273,5536=>988,5537=>988,5538=>931,5539=>931, -5540=>931,5541=>931,5542=>660,5543=>776,5544=>776,5545=>776,5546=>776,5547=>776,5548=>776,5549=>776, -5550=>495,5551=>743,5598=>830,5601=>830,5702=>496,5703=>496,5742=>413,5743=>1238,5744=>1591,5745=>2016, -5746=>2016,5747=>1720,5748=>1678,5749=>2016,5750=>2016,5760=>543,5761=>637,5762=>945,5763=>1254,5764=>1563, -5765=>1871,5766=>627,5767=>936,5768=>1254,5769=>1559,5770=>1871,5771=>569,5772=>877,5773=>1187,5774=>1497, -5775=>1807,5776=>637,5777=>945,5778=>1240,5779=>1555,5780=>1871,5781=>569,5782=>569,5783=>789,5784=>1234, -5785=>1559,5786=>740,5787=>638,5788=>638,7424=>652,7425=>833,7426=>1048,7427=>608,7428=>593,7429=>676, -7430=>676,7431=>559,7432=>557,7433=>343,7434=>494,7435=>665,7436=>539,7437=>817,7438=>701,7439=>687, -7440=>593,7441=>660,7442=>660,7443=>660,7444=>1094,7446=>687,7447=>687,7448=>556,7449=>642,7450=>642, -7451=>580,7452=>634,7453=>737,7454=>948,7455=>695,7456=>652,7457=>924,7458=>582,7459=>646,7462=>539, -7463=>652,7464=>691,7465=>556,7466=>781,7467=>732,7468=>487,7469=>683,7470=>480,7472=>523,7473=>430, -7474=>430,7475=>517,7476=>527,7477=>234,7478=>234,7479=>488,7480=>401,7481=>626,7482=>527,7483=>527, -7484=>535,7485=>509,7486=>461,7487=>485,7488=>430,7489=>511,7490=>695,7491=>458,7492=>458,7493=>479, -7494=>712,7495=>479,7496=>479,7497=>479,7498=>479,7499=>386,7500=>386,7501=>479,7502=>219,7503=>487, -7504=>664,7505=>456,7506=>488,7507=>414,7508=>488,7509=>488,7510=>479,7511=>388,7512=>456,7513=>462, -7514=>664,7515=>501,7517=>451,7518=>429,7519=>433,7520=>493,7521=>406,7522=>219,7523=>315,7524=>456, -7525=>501,7526=>451,7527=>429,7528=>451,7529=>493,7530=>406,7543=>716,7544=>527,7547=>545,7557=>514, -7579=>479,7580=>414,7581=>414,7582=>488,7583=>386,7584=>377,7585=>348,7586=>479,7587=>456,7588=>347, -7589=>281,7590=>347,7591=>347,7592=>431,7593=>326,7594=>330,7595=>370,7596=>664,7597=>664,7598=>562, -7599=>562,7600=>448,7601=>488,7602=>542,7603=>422,7604=>396,7605=>388,7606=>583,7607=>494,7608=>399, -7609=>451,7610=>501,7611=>417,7612=>523,7613=>470,7614=>455,7615=>425,7620=>0,7621=>0,7622=>0, -7623=>0,7624=>0,7625=>0,7680=>774,7681=>675,7682=>762,7683=>716,7684=>762,7685=>716,7686=>762, -7687=>716,7688=>734,7689=>593,7690=>830,7691=>716,7692=>830,7693=>716,7694=>830,7695=>716,7696=>830, -7697=>716,7698=>830,7699=>716,7700=>683,7701=>678,7702=>683,7703=>678,7704=>683,7705=>678,7706=>683, -7707=>678,7708=>683,7709=>678,7710=>683,7711=>435,7712=>821,7713=>716,7714=>837,7715=>712,7716=>837, -7717=>712,7718=>837,7719=>712,7720=>837,7721=>712,7722=>837,7723=>712,7724=>372,7725=>343,7726=>372, -7727=>343,7728=>775,7729=>665,7730=>775,7731=>665,7732=>775,7733=>665,7734=>637,7735=>343,7736=>637, -7737=>343,7738=>637,7739=>343,7740=>637,7741=>343,7742=>995,7743=>1042,7744=>995,7745=>1042,7746=>995, -7747=>1042,7748=>837,7749=>712,7750=>837,7751=>712,7752=>837,7753=>712,7754=>837,7755=>712,7756=>850, -7757=>687,7758=>850,7759=>687,7760=>850,7761=>687,7762=>850,7763=>687,7764=>733,7765=>716,7766=>733, -7767=>716,7768=>770,7769=>493,7770=>770,7771=>493,7772=>770,7773=>493,7774=>770,7775=>493,7776=>720, -7777=>595,7778=>720,7779=>595,7780=>720,7781=>595,7782=>720,7783=>595,7784=>720,7785=>595,7786=>682, -7787=>478,7788=>682,7789=>478,7790=>682,7791=>478,7792=>682,7793=>478,7794=>812,7795=>712,7796=>812, -7797=>712,7798=>812,7799=>712,7800=>812,7801=>712,7802=>812,7803=>712,7804=>774,7805=>652,7806=>774, -7807=>652,7808=>1103,7809=>924,7810=>1103,7811=>924,7812=>1103,7813=>924,7814=>1103,7815=>924,7816=>1103, -7817=>924,7818=>771,7819=>645,7820=>771,7821=>645,7822=>724,7823=>652,7824=>725,7825=>582,7826=>725, -7827=>582,7828=>725,7829=>582,7830=>712,7831=>478,7832=>924,7833=>652,7834=>675,7835=>435,7838=>896, -7839=>687,7840=>774,7841=>675,7842=>774,7843=>675,7844=>774,7845=>675,7846=>774,7847=>675,7848=>774, -7849=>675,7850=>774,7851=>675,7852=>774,7853=>675,7854=>774,7855=>675,7856=>774,7857=>675,7858=>774, -7859=>675,7860=>774,7861=>675,7862=>774,7863=>675,7864=>683,7865=>678,7866=>683,7867=>678,7868=>683, -7869=>678,7870=>683,7871=>678,7872=>683,7873=>678,7874=>683,7875=>678,7876=>683,7877=>678,7878=>683, -7879=>678,7880=>372,7881=>343,7882=>372,7883=>343,7884=>850,7885=>687,7886=>850,7887=>687,7888=>850, -7889=>687,7890=>850,7891=>687,7892=>850,7893=>687,7894=>850,7895=>687,7896=>850,7897=>687,7898=>874, -7899=>687,7900=>874,7901=>687,7902=>874,7903=>687,7904=>874,7905=>687,7906=>874,7907=>687,7908=>812, -7909=>712,7910=>812,7911=>712,7912=>835,7913=>712,7914=>835,7915=>712,7916=>835,7917=>712,7918=>835, -7919=>712,7920=>835,7921=>712,7922=>724,7923=>652,7924=>724,7925=>652,7926=>724,7927=>652,7928=>724, -7929=>652,7936=>687,7937=>687,7938=>687,7939=>687,7940=>687,7941=>687,7942=>687,7943=>687,7944=>774, -7945=>774,7946=>1041,7947=>1043,7948=>935,7949=>963,7950=>835,7951=>859,7952=>557,7953=>557,7954=>557, -7955=>557,7956=>557,7957=>557,7960=>792,7961=>794,7962=>1100,7963=>1096,7964=>1023,7965=>1052,7968=>712, -7969=>712,7970=>712,7971=>712,7972=>712,7973=>712,7974=>712,7975=>712,7976=>945,7977=>951,7978=>1250, -7979=>1250,7980=>1180,7981=>1206,7982=>1054,7983=>1063,7984=>390,7985=>390,7986=>390,7987=>390,7988=>390, -7989=>390,7990=>390,7991=>390,7992=>483,7993=>489,7994=>777,7995=>785,7996=>712,7997=>738,7998=>604, -7999=>604,8000=>687,8001=>687,8002=>687,8003=>687,8004=>687,8005=>687,8008=>892,8009=>933,8010=>1221, -8011=>1224,8012=>1053,8013=>1082,8016=>675,8017=>675,8018=>675,8019=>675,8020=>675,8021=>675,8022=>675, -8023=>675,8025=>930,8027=>1184,8029=>1199,8031=>1049,8032=>869,8033=>869,8034=>869,8035=>869,8036=>869, -8037=>869,8038=>869,8039=>869,8040=>909,8041=>958,8042=>1246,8043=>1251,8044=>1076,8045=>1105,8046=>1028, -8047=>1076,8048=>687,8049=>687,8050=>557,8051=>557,8052=>712,8053=>712,8054=>390,8055=>390,8056=>687, -8057=>687,8058=>675,8059=>675,8060=>869,8061=>869,8064=>687,8065=>687,8066=>687,8067=>687,8068=>687, -8069=>687,8070=>687,8071=>687,8072=>774,8073=>774,8074=>1041,8075=>1043,8076=>935,8077=>963,8078=>835, -8079=>859,8080=>712,8081=>712,8082=>712,8083=>712,8084=>712,8085=>712,8086=>712,8087=>712,8088=>945, -8089=>951,8090=>1250,8091=>1250,8092=>1180,8093=>1206,8094=>1054,8095=>1063,8096=>869,8097=>869,8098=>869, -8099=>869,8100=>869,8101=>869,8102=>869,8103=>869,8104=>909,8105=>958,8106=>1246,8107=>1251,8108=>1076, -8109=>1105,8110=>1028,8111=>1076,8112=>687,8113=>687,8114=>687,8115=>687,8116=>687,8118=>687,8119=>687, -8120=>774,8121=>774,8122=>876,8123=>797,8124=>774,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500, -8130=>712,8131=>712,8132=>712,8134=>712,8135=>712,8136=>929,8137=>846,8138=>1080,8139=>1009,8140=>837, -8141=>500,8142=>500,8143=>500,8144=>390,8145=>390,8146=>390,8147=>390,8150=>390,8151=>390,8152=>372, -8153=>372,8154=>621,8155=>563,8157=>500,8158=>500,8159=>500,8160=>675,8161=>675,8162=>675,8163=>675, -8164=>716,8165=>716,8166=>675,8167=>675,8168=>724,8169=>724,8170=>1020,8171=>980,8172=>838,8173=>500, -8174=>500,8175=>500,8178=>869,8179=>869,8180=>869,8182=>869,8183=>869,8184=>1065,8185=>891,8186=>1084, -8187=>894,8188=>850,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250, -8198=>167,8199=>696,8200=>380,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, -8208=>415,8209=>415,8210=>696,8213=>1000,8214=>500,8215=>500,8219=>380,8223=>657,8227=>639,8228=>333, -8229=>667,8231=>348,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8241=>1887,8242=>264, -8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733,8251=>972,8252=>627,8253=>580,8254=>500, -8255=>828,8256=>828,8257=>329,8258=>1023,8259=>500,8260=>167,8261=>457,8262=>457,8263=>1030,8264=>829, -8265=>829,8266=>513,8267=>636,8268=>500,8269=>500,8270=>523,8271=>400,8272=>828,8273=>523,8274=>556, -8275=>1000,8276=>828,8277=>838,8278=>684,8279=>813,8280=>838,8281=>838,8282=>380,8283=>872,8284=>838, -8285=>380,8286=>380,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0, -8300=>0,8301=>0,8302=>0,8303=>0,8304=>438,8305=>219,8308=>438,8309=>438,8310=>438,8311=>438, -8312=>438,8313=>438,8314=>528,8315=>528,8316=>528,8317=>288,8318=>288,8319=>456,8320=>438,8321=>438, -8322=>438,8323=>438,8324=>438,8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528, -8332=>528,8333=>288,8334=>288,8336=>458,8337=>479,8338=>488,8339=>413,8340=>479,8352=>929,8353=>696, -8354=>696,8355=>696,8356=>696,8357=>1042,8358=>837,8359=>1518,8360=>1205,8361=>1103,8362=>904,8363=>696, -8365=>696,8366=>682,8367=>1392,8368=>696,8369=>696,8370=>696,8371=>696,8372=>859,8373=>696,8400=>0, -8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1120,8449=>1170,8450=>734,8451=>1211, -8452=>896,8453=>1091,8454=>1144,8455=>614,8456=>698,8457=>1086,8459=>1073,8460=>913,8461=>888,8462=>712, -8463=>712,8464=>597,8465=>697,8466=>856,8467=>472,8468=>974,8469=>837,8470=>1203,8471=>1000,8472=>697, -8473=>750,8474=>850,8475=>938,8476=>814,8477=>801,8478=>896,8479=>710,8480=>1020,8481=>1281,8483=>755, -8484=>754,8485=>578,8486=>850,8487=>850,8488=>763,8489=>338,8490=>775,8491=>774,8492=>928,8493=>818, -8494=>854,8495=>636,8496=>729,8497=>808,8498=>683,8499=>1184,8500=>465,8501=>794,8502=>731,8503=>494, -8504=>684,8505=>380,8506=>945,8507=>1348,8508=>790,8509=>737,8510=>654,8511=>863,8512=>840,8513=>775, -8514=>557,8515=>637,8516=>760,8517=>830,8518=>716,8519=>678,8520=>343,8521=>343,8523=>872,8526=>547, -8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035,8537=>1035,8538=>1035,8539=>1035,8540=>1035, -8541=>1035,8542=>1035,8543=>615,8544=>372,8545=>659,8546=>945,8547=>1099,8548=>774,8549=>1099,8550=>1386, -8551=>1672,8552=>1121,8553=>771,8554=>1120,8555=>1407,8556=>637,8557=>734,8558=>830,8559=>995,8560=>343, -8561=>607,8562=>872,8563=>984,8564=>652,8565=>962,8566=>1227,8567=>1491,8568=>969,8569=>645,8570=>969, -8571=>1233,8572=>343,8573=>593,8574=>716,8575=>1042,8576=>1289,8577=>830,8578=>1289,8579=>734,8580=>593, -8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838, -8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838, -8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838, -8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838, -8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838, -8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838, -8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838, -8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838, -8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838, -8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838, -8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838, -8702=>838,8703=>838,8704=>774,8705=>696,8706=>544,8707=>683,8708=>683,8709=>856,8710=>697,8711=>697, -8712=>896,8713=>896,8714=>750,8715=>896,8716=>896,8717=>750,8718=>636,8719=>787,8720=>787,8721=>718, -8722=>838,8723=>838,8724=>696,8725=>365,8726=>696,8727=>838,8728=>626,8729=>380,8730=>667,8731=>667, -8732=>667,8733=>712,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500,8740=>500,8741=>500, -8742=>500,8743=>812,8744=>812,8745=>812,8746=>812,8747=>610,8748=>929,8749=>1295,8750=>563,8751=>977, -8752=>1313,8753=>563,8754=>563,8755=>563,8756=>696,8757=>696,8758=>294,8759=>696,8760=>838,8761=>838, -8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838,8770=>838,8771=>838, -8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838,8780=>838,8781=>838, -8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1063,8789=>1063,8790=>838,8791=>838, -8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838,8800=>838,8801=>838, -8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>841,8809=>841,8810=>1047,8811=>1047, -8812=>500,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838,8820=>838,8821=>838, -8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838,8830=>838,8831=>838, -8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8840=>838,8841=>838, -8842=>838,8843=>838,8844=>812,8845=>812,8846=>812,8847=>838,8848=>838,8849=>838,8850=>838,8851=>796, -8852=>796,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838, -8862=>838,8863=>838,8864=>838,8865=>838,8866=>914,8867=>914,8868=>914,8869=>914,8870=>542,8871=>542, -8872=>914,8873=>914,8874=>914,8875=>914,8876=>914,8877=>914,8878=>914,8879=>914,8880=>838,8881=>838, -8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838,8890=>542,8891=>812, -8892=>812,8893=>812,8894=>838,8895=>838,8896=>843,8897=>843,8898=>843,8899=>843,8900=>494,8901=>380, -8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838,8910=>812,8911=>812, -8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838,8920=>1422,8921=>1422, -8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838,8930=>838,8931=>838, -8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838,8940=>838,8941=>838, -8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1158,8947=>896,8948=>750,8949=>896,8950=>896,8951=>750, -8952=>896,8953=>896,8954=>1158,8955=>896,8956=>750,8957=>896,8958=>750,8959=>896,8960=>602,8961=>602, -8962=>716,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>457,8969=>457,8970=>457,8971=>457, -8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>539,8984=>928,8985=>838,8988=>469,8989=>469, -8990=>469,8991=>469,8992=>610,8993=>610,8996=>1152,8997=>1152,8998=>1414,8999=>1152,9000=>1443,9003=>1414, -9004=>873,9075=>390,9076=>716,9077=>869,9082=>687,9085=>863,9095=>1152,9108=>873,9115=>500,9116=>500, -9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500, -9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>610,9166=>838,9167=>945, -9187=>873,9189=>769,9250=>716,9251=>716,9312=>847,9313=>847,9314=>847,9315=>847,9316=>847,9317=>847, -9318=>847,9319=>847,9320=>847,9321=>847,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769, -9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769, -9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769, -9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945, -9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945, -9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769, -9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769, -9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873, -9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873, -9686=>527,9687=>527,9688=>840,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387, -9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>639,9703=>945,9704=>945,9705=>945, -9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945, -9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732, -9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573, -9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896, -9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896, -9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746, -9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896, -9776=>896,9777=>896,9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896,9784=>896,9785=>896, -9786=>896,9787=>896,9788=>896,9789=>896,9790=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896, -9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896, -9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896, -9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896, -9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896, -9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896, -9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896, -9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896,9864=>896,9865=>896, -9866=>896,9867=>896,9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896,9874=>896,9875=>896, -9876=>896,9877=>541,9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896,9884=>896,9888=>896, -9889=>702,9890=>1003,9891=>1085,9892=>1143,9893=>901,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838, -9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>731,9907=>732,9908=>732, -9909=>732,9910=>850,9911=>732,9912=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838, -9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838, -10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838, -10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838, -10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838, -10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838, -10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838, -10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896, -10070=>896,10072=>838,10073=>838,10074=>838,10075=>347,10076=>347,10077=>587,10078=>587,10081=>838,10082=>838, -10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838, -10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>847, -10103=>847,10104=>847,10105=>847,10106=>847,10107=>847,10108=>847,10109=>847,10110=>847,10111=>847,10112=>838, -10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838, -10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838, -10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838, -10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838, -10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838, -10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>457,10182=>457, -10208=>494,10214=>487,10215=>487,10216=>457,10217=>457,10218=>721,10219=>721,10224=>838,10225=>838,10226=>838, -10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434, -10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781, -10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781, -10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781, -10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781, -10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781, -10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781, -10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781, -10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781, -10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781, -10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781, -10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781, -10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781, -10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781, -10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781, -10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781, -10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781, -10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781, -10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781, -10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781, -10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781, -10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781, -10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781, -10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781, -10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781, -10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781, -10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10502=>838, -10503=>838,10506=>838,10507=>838,10560=>838,10561=>838,10627=>753,10628=>753,10702=>838,10703=>1046,10704=>1046, -10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000, -10754=>1000,10764=>1661,10765=>563,10766=>563,10767=>563,10768=>563,10769=>563,10770=>563,10771=>563,10772=>563, -10773=>563,10774=>563,10775=>563,10776=>563,10777=>563,10778=>563,10779=>563,10780=>563,10799=>838,10877=>838, -10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838, -10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838, -10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838, -10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838, -10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838, -11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838, -11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945, -11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873, -11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>637,11361=>360,11362=>637,11363=>733,11364=>770, -11365=>675,11366=>478,11367=>956,11368=>712,11369=>775,11370=>665,11371=>725,11372=>582,11373=>860,11374=>995, -11375=>774,11377=>778,11378=>1221,11379=>1056,11380=>652,11381=>698,11382=>565,11383=>782,11385=>538,11386=>687, -11387=>559,11388=>219,11389=>487,11568=>691,11569=>941,11570=>941,11571=>725,11572=>725,11573=>725,11574=>676, -11575=>774,11576=>774,11577=>683,11578=>683,11579=>802,11580=>989,11581=>761,11582=>623,11583=>761,11584=>941, -11585=>941,11586=>373,11587=>740,11588=>837,11589=>914,11590=>672,11591=>737,11592=>680,11593=>683,11594=>602, -11595=>1039,11596=>778,11597=>837,11598=>683,11599=>372,11600=>778,11601=>373,11602=>725,11603=>691,11604=>941, -11605=>941,11606=>837,11607=>373,11608=>836,11609=>941,11610=>941,11611=>734,11612=>876,11613=>771,11614=>734, -11615=>683,11616=>774,11617=>837,11618=>683,11619=>850,11620=>697,11621=>850,11631=>716,11800=>580,11810=>457, -11811=>457,11812=>457,11813=>457,11822=>580,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896, -19910=>896,19911=>896,19912=>896,19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896, -19920=>896,19921=>896,19922=>896,19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896, -19930=>896,19931=>896,19932=>896,19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896, -19940=>896,19941=>896,19942=>896,19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896, -19950=>896,19951=>896,19952=>896,19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896, -19960=>896,19961=>896,19962=>896,19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>720,42565=>595, -42566=>436,42567=>440,42572=>1405,42573=>1173,42576=>1234,42577=>1027,42580=>1174,42581=>972,42582=>1093,42583=>958, -42594=>1085,42595=>924,42596=>1096,42597=>912,42598=>1260,42599=>997,42600=>850,42601=>687,42602=>1037,42603=>868, -42604=>1406,42605=>1106,42606=>961,42634=>963,42635=>787,42636=>682,42637=>580,42644=>808,42645=>712,42760=>500, -42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500, -42771=>500,42772=>500,42773=>500,42774=>500,42779=>400,42780=>400,42781=>287,42782=>287,42783=>287,42790=>837, -42791=>712,42792=>1031,42793=>857,42794=>696,42795=>557,42800=>559,42801=>595,42802=>1349,42803=>1052,42804=>1284, -42805=>1064,42806=>1216,42807=>1054,42808=>1079,42809=>922,42810=>1079,42811=>922,42812=>1035,42813=>922,42814=>698, -42815=>549,42822=>850,42823=>542,42824=>683,42825=>531,42826=>918,42827=>814,42830=>1406,42831=>1106,42880=>637, -42881=>343,42882=>837,42883=>712,42889=>400,42890=>386,42891=>456,42892=>306,43003=>683,43004=>733,43005=>995, -43006=>372,43007=>1325,63173=>687,64256=>810,64257=>741,64258=>741,64259=>1115,64260=>1116,64261=>808,64262=>1020, -64275=>1388,64276=>1384,64277=>1378,64278=>1384,64279=>1713,64285=>343,64286=>0,64287=>663,64288=>720,64289=>963, -64290=>890,64291=>988,64292=>963,64293=>938,64294=>988,64295=>988,64296=>976,64297=>838,64298=>949,64299=>949, -64300=>949,64301=>949,64302=>751,64303=>751,64304=>751,64305=>673,64306=>537,64307=>654,64308=>712,64309=>438, -64310=>491,64312=>724,64313=>438,64314=>649,64315=>650,64316=>679,64318=>775,64320=>497,64321=>773,64323=>718, -64324=>687,64326=>751,64327=>729,64328=>649,64329=>949,64330=>751,64331=>343,64332=>673,64333=>650,64334=>687, -64335=>751,64338=>1005,64339=>1059,64340=>375,64341=>408,64342=>1005,64343=>1059,64344=>375,64345=>408,64346=>1005, -64347=>1059,64348=>375,64349=>408,64350=>1005,64351=>1059,64352=>375,64353=>408,64354=>1005,64355=>1059,64356=>375, -64357=>408,64358=>1005,64359=>1059,64360=>375,64361=>408,64362=>1162,64363=>1191,64364=>655,64365=>720,64366=>1162, -64367=>1191,64368=>655,64369=>720,64370=>721,64371=>721,64372=>721,64373=>721,64374=>721,64375=>721,64376=>721, -64377=>721,64378=>721,64379=>721,64380=>721,64381=>721,64382=>721,64383=>721,64384=>721,64385=>721,64394=>576, -64395=>622,64396=>576,64397=>622,64398=>1024,64399=>1024,64400=>582,64401=>582,64402=>1024,64403=>1024,64404=>582, -64405=>582,64414=>854,64415=>900,64473=>622,64474=>627,64488=>375,64489=>408,64508=>917,64509=>1012,64510=>375, -64511=>408,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, -65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0, -65059=>0,65136=>342,65137=>342,65138=>342,65139=>346,65140=>342,65142=>342,65143=>342,65144=>342,65145=>342, -65146=>342,65147=>342,65148=>342,65149=>342,65150=>342,65151=>342,65152=>511,65153=>343,65154=>375,65155=>343, -65156=>375,65157=>622,65158=>627,65159=>343,65160=>375,65161=>917,65162=>917,65163=>375,65164=>408,65165=>343, -65166=>375,65167=>1005,65168=>1059,65169=>375,65170=>408,65171=>590,65172=>606,65173=>1005,65174=>1059,65175=>375, -65176=>408,65177=>1005,65178=>1059,65179=>375,65180=>408,65181=>721,65182=>721,65183=>721,65184=>721,65185=>721, -65186=>721,65187=>721,65188=>721,65189=>721,65190=>721,65191=>721,65192=>721,65193=>513,65194=>578,65195=>513, -65196=>578,65197=>576,65198=>622,65199=>576,65200=>622,65201=>1380,65202=>1414,65203=>983,65204=>1018,65205=>1380, -65206=>1414,65207=>983,65208=>1018,65209=>1345,65210=>1364,65211=>966,65212=>985,65213=>1345,65214=>1364,65215=>966, -65216=>985,65217=>1039,65218=>1071,65219=>942,65220=>974,65221=>1039,65222=>1071,65223=>942,65224=>974,65225=>683, -65226=>683,65227=>683,65228=>564,65229=>683,65230=>683,65231=>683,65232=>564,65233=>1162,65234=>1191,65235=>655, -65236=>720,65237=>894,65238=>901,65239=>655,65240=>720,65241=>917,65242=>931,65243=>582,65244=>582,65245=>868, -65246=>893,65247=>375,65248=>408,65249=>733,65250=>784,65251=>619,65252=>670,65253=>854,65254=>900,65255=>375, -65256=>408,65257=>590,65258=>606,65259=>693,65260=>660,65261=>622,65262=>627,65263=>917,65264=>1012,65265=>917, -65266=>1012,65267=>375,65268=>408,65269=>745,65270=>759,65271=>745,65272=>759,65273=>745,65274=>759,65275=>745, -65276=>759,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1113); -$enc=''; -$diff=''; -$file='dejavusansb.z'; -$ctg='dejavusansb.ctg.z'; -$originalsize=573136; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.z deleted file mode 100644 index 9d465a6e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansb.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.ctg.z deleted file mode 100644 index 9d1fcd61..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.php deleted file mode 100644 index 0c68378d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.php +++ /dev/null @@ -1,458 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>-51,'Flags'=>96,'FontBBox'=>'[-1067 -385 2005 1121]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>600); -$up=-63; -$ut=44; -$dw=600; -$cw=array( -0=>600,32=>348,33=>456,34=>521,35=>696,36=>696,37=>1002,38=>872,39=>306,40=>457, -41=>457,42=>523,43=>838,44=>380,45=>415,46=>380,47=>365,48=>696,49=>696,50=>696, -51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>400,59=>400,60=>838, -61=>838,62=>838,63=>580,64=>1000,65=>774,66=>762,67=>734,68=>830,69=>683,70=>683, -71=>821,72=>837,73=>372,74=>372,75=>775,76=>637,77=>995,78=>837,79=>850,80=>733, -81=>850,82=>770,83=>720,84=>682,85=>812,86=>774,87=>1103,88=>771,89=>724,90=>725, -91=>457,92=>365,93=>457,94=>838,95=>500,96=>500,97=>675,98=>716,99=>593,100=>716, -101=>678,102=>435,103=>716,104=>712,105=>343,106=>343,107=>665,108=>343,109=>1042,110=>712, -111=>687,112=>716,113=>716,114=>493,115=>595,116=>478,117=>712,118=>652,119=>924,120=>645, -121=>652,122=>582,123=>712,124=>365,125=>712,126=>838,8364=>696,8218=>380,402=>435,8222=>644, -8230=>1000,8224=>500,8225=>500,710=>500,8240=>1454,352=>720,8249=>412,338=>1167,381=>725,8216=>380, -8217=>380,8220=>644,8221=>644,8226=>639,8211=>500,8212=>1000,732=>500,8482=>1000,353=>595,8250=>412, -339=>1094,382=>582,376=>724,160=>348,161=>456,162=>696,163=>696,164=>636,165=>696,166=>365, -167=>500,168=>500,169=>1000,170=>564,171=>650,172=>838,173=>415,174=>1000,175=>500,176=>500, -177=>838,178=>438,179=>438,180=>500,181=>736,182=>636,183=>380,184=>500,185=>438,186=>564, -187=>650,188=>1035,189=>1035,190=>1035,191=>580,192=>774,193=>774,194=>774,195=>774,196=>774, -197=>774,198=>1085,199=>734,200=>683,201=>683,202=>683,203=>683,204=>372,205=>372,206=>372, -207=>372,208=>845,209=>837,210=>850,211=>850,212=>850,213=>850,214=>850,215=>838,216=>850, -217=>812,218=>812,219=>812,220=>812,221=>724,222=>742,223=>719,224=>675,225=>675,226=>675, -227=>675,228=>675,229=>675,230=>1048,231=>593,232=>678,233=>678,234=>678,235=>678,236=>343, -237=>343,238=>343,239=>343,240=>687,241=>712,242=>687,243=>687,244=>687,245=>687,246=>687, -247=>838,248=>687,249=>712,250=>712,251=>712,252=>712,253=>652,254=>716,255=>652,256=>774, -257=>675,258=>774,259=>675,260=>774,261=>675,262=>734,263=>593,264=>734,265=>593,266=>734, -267=>593,268=>734,269=>593,270=>830,271=>716,272=>845,273=>716,274=>683,275=>678,276=>683, -277=>678,278=>683,279=>678,280=>683,281=>678,282=>683,283=>678,284=>821,285=>716,286=>821, -287=>716,288=>821,289=>716,290=>821,291=>716,292=>837,293=>712,294=>974,295=>790,296=>372, -297=>343,298=>372,299=>343,300=>372,301=>343,302=>372,303=>343,304=>372,305=>343,306=>744, -307=>686,308=>372,309=>343,310=>775,311=>665,312=>665,313=>637,314=>343,315=>637,316=>343, -317=>637,318=>343,319=>637,320=>343,321=>660,322=>375,323=>837,324=>712,325=>837,326=>712, -327=>837,328=>712,329=>983,330=>837,331=>712,332=>850,333=>687,334=>850,335=>687,336=>850, -337=>687,340=>770,341=>493,342=>770,343=>493,344=>770,345=>493,346=>720,347=>595,348=>720, -349=>595,350=>720,351=>595,354=>682,355=>478,356=>682,357=>478,358=>682,359=>478,360=>812, -361=>712,362=>812,363=>712,364=>812,365=>712,366=>812,367=>712,368=>812,369=>712,370=>812, -371=>712,372=>1103,373=>924,374=>724,375=>652,377=>725,378=>582,379=>725,380=>582,383=>435, -384=>716,385=>811,386=>762,387=>716,388=>762,389=>716,390=>734,391=>734,392=>593,393=>845, -394=>879,395=>762,396=>716,397=>687,398=>683,399=>850,400=>696,401=>683,403=>821,404=>793, -405=>1045,406=>436,407=>389,408=>775,409=>665,410=>360,411=>592,412=>1042,413=>837,414=>712, -415=>850,416=>850,417=>687,418=>1114,419=>962,420=>782,421=>716,422=>770,423=>720,424=>595, -425=>683,426=>552,427=>478,428=>707,429=>478,430=>682,431=>812,432=>712,433=>769,434=>813, -435=>797,436=>778,437=>725,438=>582,439=>772,440=>772,441=>641,442=>582,443=>696,444=>772, -445=>641,446=>573,447=>716,448=>372,449=>659,450=>544,451=>372,452=>1548,453=>1450,454=>1307, -455=>977,456=>979,457=>670,458=>1193,459=>1213,460=>1063,461=>774,462=>675,463=>372,464=>343, -465=>850,466=>687,467=>812,468=>712,469=>812,470=>712,471=>812,472=>712,473=>812,474=>712, -475=>812,476=>712,477=>678,478=>774,479=>675,480=>774,481=>675,482=>1085,483=>1048,484=>821, -485=>716,486=>821,487=>716,488=>775,489=>665,490=>850,491=>687,492=>850,493=>687,494=>772, -495=>582,496=>343,497=>1548,498=>1450,499=>1307,500=>821,501=>716,502=>1289,503=>787,504=>837, -505=>712,506=>774,507=>675,508=>1085,509=>1048,510=>850,511=>687,512=>774,513=>675,514=>774, -515=>675,516=>683,517=>678,518=>683,519=>678,520=>372,521=>343,522=>372,523=>343,524=>850, -525=>687,526=>850,527=>687,528=>770,529=>493,530=>770,531=>493,532=>812,533=>712,534=>812, -535=>712,536=>720,537=>595,538=>682,539=>478,540=>690,541=>607,542=>837,543=>712,544=>837, -545=>865,546=>809,547=>659,548=>725,549=>582,550=>774,551=>675,552=>683,553=>678,554=>850, -555=>687,556=>850,557=>687,558=>850,559=>687,560=>850,561=>687,562=>724,563=>652,564=>492, -565=>867,566=>512,567=>343,568=>1088,569=>1088,570=>774,571=>734,572=>593,573=>637,574=>682, -575=>595,576=>582,577=>782,578=>614,579=>762,580=>812,581=>774,582=>683,583=>678,584=>372, -585=>343,586=>860,587=>791,588=>770,589=>493,590=>724,591=>652,592=>675,593=>716,594=>716, -595=>716,596=>593,597=>593,598=>791,599=>792,600=>678,601=>678,602=>876,603=>557,604=>545, -605=>774,606=>731,607=>343,608=>792,609=>716,610=>627,611=>735,612=>635,613=>712,614=>712, -615=>712,616=>545,617=>440,618=>545,619=>559,620=>693,621=>343,622=>841,623=>1042,624=>1042, -625=>1042,626=>712,627=>793,628=>642,629=>687,630=>909,631=>682,632=>796,633=>538,634=>538, -635=>650,636=>493,637=>493,638=>596,639=>596,640=>642,641=>642,642=>595,643=>415,644=>435, -645=>605,646=>552,647=>478,648=>478,649=>920,650=>769,651=>670,652=>652,653=>924,654=>652, -655=>724,656=>694,657=>684,658=>641,659=>641,660=>573,661=>573,662=>573,663=>573,664=>850, -665=>633,666=>731,667=>685,668=>691,669=>343,670=>732,671=>539,672=>792,673=>573,674=>573, -675=>1156,676=>1214,677=>1155,678=>974,679=>769,680=>929,681=>1026,682=>792,683=>780,684=>591, -685=>415,686=>677,687=>789,688=>456,689=>456,690=>219,691=>315,692=>315,693=>315,694=>411, -695=>591,696=>417,697=>302,698=>521,699=>380,700=>380,701=>380,702=>366,703=>366,704=>326, -705=>326,706=>500,707=>500,708=>500,709=>500,711=>500,712=>306,713=>500,714=>500,715=>500, -716=>306,717=>500,718=>500,719=>500,720=>337,721=>337,722=>366,723=>366,724=>500,725=>500, -726=>416,727=>328,728=>500,729=>500,730=>500,731=>500,733=>500,734=>351,735=>500,736=>412, -737=>219,738=>381,739=>413,740=>326,741=>500,742=>500,743=>500,744=>500,745=>500,748=>500, -749=>500,750=>644,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, -774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, -784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, -794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, -844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, -860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>698,881=>565,882=>1022, -883=>836,884=>302,885=>302,886=>837,887=>701,890=>500,891=>593,892=>550,893=>549,894=>400, -900=>441,901=>500,902=>797,903=>380,904=>846,905=>1009,906=>563,908=>891,910=>980,911=>894, -912=>390,913=>774,914=>762,915=>637,916=>774,917=>683,918=>725,919=>837,920=>850,921=>372, -922=>775,923=>774,924=>995,925=>837,926=>632,927=>850,928=>837,929=>733,931=>683,932=>682, -933=>724,934=>850,935=>771,936=>850,937=>850,938=>372,939=>724,940=>687,941=>557,942=>712, -943=>390,944=>675,945=>687,946=>716,947=>681,948=>687,949=>557,950=>591,951=>712,952=>687, -953=>390,954=>710,955=>633,956=>736,957=>681,958=>591,959=>687,960=>791,961=>716,962=>593, -963=>779,964=>638,965=>675,966=>782,967=>645,968=>794,969=>869,970=>390,971=>675,972=>687, -973=>675,974=>869,975=>775,976=>651,977=>661,978=>746,979=>981,980=>746,981=>796,982=>869, -983=>744,984=>850,985=>687,986=>734,987=>593,988=>683,989=>494,990=>702,991=>660,992=>919, -993=>627,994=>1093,995=>837,996=>832,997=>716,998=>928,999=>744,1000=>733,1001=>650,1002=>789, -1003=>671,1004=>752,1005=>716,1006=>682,1007=>590,1008=>744,1009=>716,1010=>593,1011=>343,1012=>850, -1013=>645,1014=>645,1015=>742,1016=>716,1017=>734,1018=>995,1019=>732,1020=>716,1021=>734,1022=>734, -1023=>698,1024=>683,1025=>683,1026=>878,1027=>637,1028=>734,1029=>720,1030=>372,1031=>372,1032=>372, -1033=>1154,1034=>1130,1035=>878,1036=>817,1037=>837,1038=>771,1039=>837,1040=>774,1041=>762,1042=>762, -1043=>637,1044=>891,1045=>683,1046=>1224,1047=>710,1048=>837,1049=>837,1050=>817,1051=>831,1052=>995, -1053=>837,1054=>850,1055=>837,1056=>733,1057=>734,1058=>682,1059=>771,1060=>992,1061=>771,1062=>928, -1063=>808,1064=>1235,1065=>1326,1066=>939,1067=>1036,1068=>762,1069=>734,1070=>1174,1071=>770,1072=>675, -1073=>698,1074=>633,1075=>522,1076=>808,1077=>678,1078=>995,1079=>581,1080=>701,1081=>701,1082=>679, -1083=>732,1084=>817,1085=>691,1086=>687,1087=>691,1088=>716,1089=>593,1090=>580,1091=>652,1092=>992, -1093=>645,1094=>741,1095=>687,1096=>1062,1097=>1105,1098=>751,1099=>904,1100=>632,1101=>593,1102=>972, -1103=>642,1104=>678,1105=>678,1106=>714,1107=>522,1108=>593,1109=>595,1110=>343,1111=>343,1112=>343, -1113=>991,1114=>956,1115=>734,1116=>679,1117=>701,1118=>652,1119=>691,1120=>1093,1121=>869,1122=>840, -1123=>736,1124=>1012,1125=>839,1126=>992,1127=>832,1128=>1358,1129=>1121,1130=>850,1131=>687,1132=>1236, -1133=>1007,1134=>696,1135=>557,1136=>1075,1137=>1061,1138=>850,1139=>687,1140=>850,1141=>695,1142=>850, -1143=>695,1144=>1148,1145=>1043,1146=>1074,1147=>863,1148=>1405,1149=>1173,1150=>1093,1151=>869,1152=>734, -1153=>593,1154=>652,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>938, -1163=>806,1164=>762,1165=>611,1166=>736,1167=>718,1168=>637,1169=>522,1170=>666,1171=>543,1172=>789, -1173=>522,1174=>1224,1175=>995,1176=>710,1177=>581,1178=>775,1179=>679,1180=>817,1181=>679,1182=>817, -1183=>679,1184=>1015,1185=>826,1186=>837,1187=>691,1188=>1103,1189=>871,1190=>1254,1191=>979,1192=>946, -1193=>859,1194=>734,1195=>593,1196=>682,1197=>580,1198=>724,1199=>652,1200=>724,1201=>652,1202=>771, -1203=>645,1204=>1104,1205=>1001,1206=>808,1207=>687,1208=>808,1209=>687,1210=>808,1211=>712,1212=>1026, -1213=>810,1214=>1026,1215=>810,1216=>372,1217=>1224,1218=>995,1219=>778,1220=>629,1221=>933,1222=>804, -1223=>837,1224=>691,1225=>938,1226=>806,1227=>808,1228=>687,1229=>1096,1230=>932,1231=>343,1232=>774, -1233=>675,1234=>774,1235=>675,1236=>1085,1237=>1048,1238=>683,1239=>678,1240=>850,1241=>678,1242=>850, -1243=>678,1244=>1224,1245=>995,1246=>710,1247=>581,1248=>772,1249=>641,1250=>837,1251=>701,1252=>837, -1253=>701,1254=>850,1255=>687,1256=>850,1257=>687,1258=>850,1259=>687,1260=>734,1261=>593,1262=>771, -1263=>652,1264=>771,1265=>652,1266=>771,1267=>652,1268=>808,1269=>687,1270=>637,1271=>522,1272=>1036, -1273=>904,1274=>666,1275=>543,1276=>771,1277=>645,1278=>771,1279=>645,1280=>762,1281=>608,1282=>1159, -1283=>893,1284=>1119,1285=>920,1286=>828,1287=>693,1288=>1242,1289=>1017,1290=>1289,1291=>1013,1292=>839, -1293=>638,1294=>938,1295=>803,1296=>696,1297=>557,1298=>831,1299=>732,1300=>1286,1301=>1070,1302=>1065, -1303=>982,1304=>1082,1305=>960,1306=>850,1307=>716,1308=>1103,1309=>924,1312=>1248,1313=>1022,1314=>1254, -1315=>979,1316=>957,1317=>807,1329=>984,1330=>812,1331=>984,1332=>984,1333=>812,1334=>777,1335=>812, -1336=>812,1337=>975,1338=>984,1339=>812,1340=>710,1341=>1078,1342=>1136,1343=>812,1344=>710,1345=>757, -1346=>984,1347=>876,1348=>984,1349=>793,1350=>984,1351=>812,1352=>812,1353=>812,1354=>958,1355=>777, -1356=>984,1357=>812,1358=>984,1359=>720,1360=>812,1361=>793,1362=>895,1363=>850,1364=>936,1365=>850, -1366=>720,1369=>366,1370=>380,1371=>550,1372=>550,1373=>380,1374=>546,1375=>521,1377=>1042,1378=>712, -1379=>866,1380=>868,1381=>712,1382=>817,1383=>653,1384=>712,1385=>811,1386=>817,1387=>712,1388=>498, -1389=>1018,1390=>716,1391=>712,1392=>712,1393=>716,1394=>819,1395=>712,1396=>751,1397=>343,1398=>882, -1399=>559,1400=>712,1401=>559,1402=>1042,1403=>559,1404=>863,1405=>712,1406=>813,1407=>1042,1408=>712, -1409=>716,1410=>571,1411=>1042,1412=>778,1413=>687,1414=>720,1415=>862,1417=>400,1418=>487,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>415,1471=>0,1472=>372,1473=>0,1474=>0,1475=>372,1478=>497, -1479=>0,1488=>751,1489=>673,1490=>537,1491=>654,1492=>712,1493=>343,1494=>491,1495=>712,1496=>724, -1497=>343,1498=>649,1499=>650,1500=>679,1501=>712,1502=>775,1503=>343,1504=>497,1505=>773,1506=>678, -1507=>718,1508=>687,1509=>628,1510=>751,1511=>729,1512=>649,1513=>949,1514=>751,1520=>664,1521=>664, -1522=>663,1523=>444,1524=>710,3647=>743,3713=>815,3714=>748,3716=>749,3719=>569,3720=>742,3722=>744, -3725=>761,3732=>706,3733=>704,3734=>747,3735=>819,3737=>730,3738=>727,3739=>727,3740=>922,3741=>827, -3742=>866,3743=>866,3745=>836,3746=>761,3747=>770,3749=>769,3751=>713,3754=>827,3755=>1031,3757=>724, -3758=>784,3759=>934,3760=>688,3761=>0,3762=>610,3763=>610,3764=>0,3765=>0,3766=>0,3767=>0, -3768=>0,3769=>0,3771=>0,3772=>0,3773=>670,3776=>516,3777=>860,3778=>516,3779=>650,3780=>632, -3782=>759,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>771,3793=>771,3794=>693, -3795=>836,3796=>729,3797=>729,3798=>849,3799=>790,3800=>759,3801=>910,3804=>1363,3805=>1363,4256=>918, -4257=>744,4258=>739,4259=>837,4260=>649,4261=>773,4262=>857,4263=>889,4264=>530,4265=>633,4266=>857, -4267=>900,4268=>643,4269=>903,4270=>814,4271=>752,4272=>869,4273=>643,4274=>643,4275=>886,4276=>886, -4277=>733,4278=>653,4279=>643,4280=>646,4281=>643,4282=>790,4283=>902,4284=>633,4285=>619,4286=>643, -4287=>778,4288=>892,4289=>601,4290=>742,4291=>616,4292=>633,4293=>742,4304=>553,4305=>552,4306=>596, -4307=>815,4308=>562,4309=>563,4310=>553,4311=>827,4312=>553,4313=>543,4314=>1074,4315=>563,4316=>563, -4317=>812,4318=>552,4319=>591,4320=>822,4321=>563,4322=>690,4323=>583,4324=>813,4325=>562,4326=>813, -4327=>563,4328=>563,4329=>563,4330=>632,4331=>563,4332=>563,4333=>552,4334=>563,4335=>563,4336=>558, -4337=>604,4338=>552,4339=>552,4340=>553,4341=>605,4342=>852,4343=>635,4344=>563,4345=>596,4346=>542, -4347=>684,4348=>368,5121=>774,5122=>774,5123=>774,5124=>774,5125=>905,5126=>905,5127=>905,5129=>905, -5130=>905,5131=>905,5132=>1018,5133=>1009,5134=>1018,5135=>1009,5136=>1018,5137=>1009,5138=>1149,5139=>1140, -5140=>1149,5141=>1140,5142=>905,5143=>1149,5144=>1142,5145=>1149,5146=>1142,5147=>905,5149=>310,5150=>529, -5151=>425,5152=>425,5153=>395,5154=>395,5155=>395,5156=>395,5157=>564,5158=>470,5159=>310,5160=>395, -5161=>395,5162=>395,5163=>1213,5164=>986,5165=>1216,5166=>1297,5167=>774,5168=>774,5169=>774,5170=>774, -5171=>886,5172=>886,5173=>886,5175=>886,5176=>886,5177=>886,5178=>1018,5179=>1009,5180=>1018,5181=>1009, -5182=>1018,5183=>1009,5184=>1149,5185=>1140,5186=>1149,5187=>1140,5188=>1149,5189=>1142,5190=>1149,5191=>1142, -5192=>886,5193=>576,5194=>229,5196=>812,5197=>812,5198=>812,5199=>812,5200=>815,5201=>815,5202=>815, -5204=>815,5205=>815,5206=>815,5207=>1056,5208=>1048,5209=>1056,5210=>1048,5211=>1056,5212=>1048,5213=>1060, -5214=>1054,5215=>1060,5216=>1054,5217=>1060,5218=>1052,5219=>1060,5220=>1052,5221=>1060,5222=>483,5223=>1005, -5224=>1005,5225=>1023,5226=>1017,5227=>743,5228=>743,5229=>743,5230=>743,5231=>743,5232=>743,5233=>743, -5234=>743,5235=>743,5236=>1029,5237=>975,5238=>980,5239=>975,5240=>980,5241=>975,5242=>1029,5243=>975, -5244=>1029,5245=>975,5246=>980,5247=>975,5248=>980,5249=>975,5250=>980,5251=>501,5252=>501,5253=>938, -5254=>938,5255=>938,5256=>938,5257=>743,5258=>743,5259=>743,5260=>743,5261=>743,5262=>743,5263=>743, -5264=>743,5265=>743,5266=>1029,5267=>975,5268=>1029,5269=>975,5270=>1029,5271=>975,5272=>1029,5273=>975, -5274=>1029,5275=>975,5276=>1029,5277=>975,5278=>1029,5279=>975,5280=>1029,5281=>501,5282=>501,5283=>626, -5284=>626,5285=>626,5286=>626,5287=>626,5288=>626,5289=>626,5290=>626,5291=>626,5292=>881,5293=>854, -5294=>863,5295=>874,5296=>863,5297=>874,5298=>881,5299=>874,5300=>881,5301=>874,5302=>863,5303=>874, -5304=>863,5305=>874,5306=>863,5307=>436,5308=>548,5309=>436,5312=>988,5313=>988,5314=>988,5315=>988, -5316=>931,5317=>931,5318=>931,5319=>931,5320=>931,5321=>1238,5322=>1247,5323=>1200,5324=>1228,5325=>1200, -5326=>1228,5327=>931,5328=>660,5329=>497,5330=>660,5331=>988,5332=>988,5333=>988,5334=>988,5335=>931, -5336=>931,5337=>931,5338=>931,5339=>931,5340=>1231,5341=>1247,5342=>1283,5343=>1228,5344=>1283,5345=>1228, -5346=>1228,5347=>1214,5348=>1228,5349=>1214,5350=>1283,5351=>1228,5352=>1283,5353=>1228,5354=>660,5356=>886, -5357=>730,5358=>730,5359=>730,5360=>730,5361=>730,5362=>730,5363=>730,5364=>730,5365=>730,5366=>998, -5367=>958,5368=>967,5369=>989,5370=>967,5371=>989,5372=>998,5373=>958,5374=>998,5375=>958,5376=>967, -5377=>989,5378=>967,5379=>989,5380=>967,5381=>493,5382=>460,5383=>493,5392=>923,5393=>923,5394=>923, -5395=>1136,5396=>1136,5397=>1136,5398=>1136,5399=>1209,5400=>1202,5401=>1209,5402=>1202,5403=>1209,5404=>1202, -5405=>1431,5406=>1420,5407=>1431,5408=>1420,5409=>1431,5410=>1420,5411=>1431,5412=>1420,5413=>746,5414=>776, -5415=>776,5416=>776,5417=>776,5418=>776,5419=>776,5420=>776,5421=>776,5422=>776,5423=>1003,5424=>1003, -5425=>1013,5426=>996,5427=>1013,5428=>996,5429=>1003,5430=>1003,5431=>1003,5432=>1003,5433=>1013,5434=>996, -5435=>1013,5436=>996,5437=>1013,5438=>495,5440=>395,5441=>510,5442=>1033,5443=>1033,5444=>976,5445=>976, -5446=>976,5447=>976,5448=>733,5449=>733,5450=>733,5451=>733,5452=>733,5453=>733,5454=>1003,5455=>959, -5456=>495,5458=>886,5459=>774,5460=>774,5461=>774,5462=>774,5463=>928,5464=>928,5465=>928,5466=>928, -5467=>1172,5468=>1142,5469=>602,5470=>812,5471=>812,5472=>812,5473=>812,5474=>812,5475=>812,5476=>815, -5477=>815,5478=>815,5479=>815,5480=>1060,5481=>1052,5482=>548,5492=>977,5493=>977,5494=>977,5495=>977, -5496=>977,5497=>977,5498=>977,5499=>618,5500=>837,5501=>510,5502=>1238,5503=>1238,5504=>1238,5505=>1238, -5506=>1238,5507=>1238,5508=>1238,5509=>989,5514=>977,5515=>977,5516=>977,5517=>977,5518=>1591,5519=>1591, -5520=>1591,5521=>1295,5522=>1295,5523=>1591,5524=>1591,5525=>848,5526=>1273,5536=>988,5537=>988,5538=>931, -5539=>931,5540=>931,5541=>931,5542=>660,5543=>776,5544=>776,5545=>776,5546=>776,5547=>776,5548=>776, -5549=>776,5550=>495,5551=>743,5598=>830,5601=>830,5702=>496,5703=>496,5742=>413,5743=>1238,5744=>1591, -5745=>2016,5746=>2016,5747=>1720,5748=>1678,5749=>2016,5750=>2016,7424=>652,7425=>833,7426=>1048,7427=>608, -7428=>593,7429=>676,7430=>676,7431=>559,7432=>557,7433=>343,7434=>494,7435=>665,7436=>539,7437=>817, -7438=>701,7439=>687,7440=>593,7441=>660,7442=>660,7443=>660,7444=>1094,7446=>687,7447=>687,7448=>556, -7449=>642,7450=>642,7451=>580,7452=>634,7453=>737,7454=>948,7455=>695,7456=>652,7457=>924,7458=>582, -7459=>646,7462=>539,7463=>652,7464=>691,7465=>556,7466=>781,7467=>732,7468=>487,7469=>683,7470=>480, -7472=>523,7473=>430,7474=>430,7475=>517,7476=>527,7477=>234,7478=>234,7479=>488,7480=>401,7481=>626, -7482=>527,7483=>527,7484=>535,7485=>509,7486=>461,7487=>485,7488=>430,7489=>511,7490=>695,7491=>458, -7492=>458,7493=>479,7494=>712,7495=>479,7496=>479,7497=>479,7498=>479,7499=>386,7500=>386,7501=>479, -7502=>219,7503=>487,7504=>664,7505=>456,7506=>488,7507=>414,7508=>488,7509=>488,7510=>479,7511=>388, -7512=>456,7513=>462,7514=>664,7515=>501,7517=>451,7518=>429,7519=>433,7520=>493,7521=>406,7522=>219, -7523=>315,7524=>456,7525=>501,7526=>451,7527=>429,7528=>451,7529=>493,7530=>406,7543=>716,7544=>527, -7547=>545,7557=>514,7579=>479,7580=>414,7581=>414,7582=>488,7583=>386,7584=>377,7585=>348,7586=>479, -7587=>456,7588=>347,7589=>281,7590=>347,7591=>347,7592=>431,7593=>326,7594=>330,7595=>370,7596=>664, -7597=>664,7598=>562,7599=>562,7600=>448,7601=>488,7602=>542,7603=>422,7604=>396,7605=>388,7606=>583, -7607=>494,7608=>399,7609=>451,7610=>501,7611=>417,7612=>523,7613=>470,7614=>455,7615=>425,7620=>0, -7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>774,7681=>675,7682=>762,7683=>716,7684=>762, -7685=>716,7686=>762,7687=>716,7688=>734,7689=>593,7690=>830,7691=>716,7692=>830,7693=>716,7694=>830, -7695=>716,7696=>830,7697=>716,7698=>830,7699=>716,7700=>683,7701=>678,7702=>683,7703=>678,7704=>683, -7705=>678,7706=>683,7707=>678,7708=>683,7709=>678,7710=>683,7711=>435,7712=>821,7713=>716,7714=>837, -7715=>712,7716=>837,7717=>712,7718=>837,7719=>712,7720=>837,7721=>712,7722=>837,7723=>712,7724=>372, -7725=>343,7726=>372,7727=>343,7728=>775,7729=>665,7730=>775,7731=>665,7732=>775,7733=>665,7734=>637, -7735=>343,7736=>637,7737=>343,7738=>637,7739=>343,7740=>637,7741=>343,7742=>995,7743=>1042,7744=>995, -7745=>1042,7746=>995,7747=>1042,7748=>837,7749=>712,7750=>837,7751=>712,7752=>837,7753=>712,7754=>837, -7755=>712,7756=>850,7757=>687,7758=>850,7759=>687,7760=>850,7761=>687,7762=>850,7763=>687,7764=>733, -7765=>716,7766=>733,7767=>716,7768=>770,7769=>493,7770=>770,7771=>493,7772=>770,7773=>493,7774=>770, -7775=>493,7776=>720,7777=>595,7778=>720,7779=>595,7780=>720,7781=>595,7782=>720,7783=>595,7784=>720, -7785=>595,7786=>682,7787=>478,7788=>682,7789=>478,7790=>682,7791=>478,7792=>682,7793=>478,7794=>812, -7795=>712,7796=>812,7797=>712,7798=>812,7799=>712,7800=>812,7801=>712,7802=>812,7803=>712,7804=>774, -7805=>652,7806=>774,7807=>652,7808=>1103,7809=>924,7810=>1103,7811=>924,7812=>1103,7813=>924,7814=>1103, -7815=>924,7816=>1103,7817=>924,7818=>771,7819=>645,7820=>771,7821=>645,7822=>724,7823=>652,7824=>725, -7825=>582,7826=>725,7827=>582,7828=>725,7829=>582,7830=>712,7831=>478,7832=>924,7833=>652,7834=>675, -7835=>435,7838=>896,7839=>687,7840=>774,7841=>675,7842=>774,7843=>675,7844=>774,7845=>675,7846=>774, -7847=>675,7848=>774,7849=>675,7850=>774,7851=>675,7852=>774,7853=>675,7854=>774,7855=>675,7856=>774, -7857=>675,7858=>774,7859=>675,7860=>774,7861=>675,7862=>774,7863=>675,7864=>683,7865=>678,7866=>683, -7867=>678,7868=>683,7869=>678,7870=>683,7871=>678,7872=>683,7873=>678,7874=>683,7875=>678,7876=>683, -7877=>678,7878=>683,7879=>678,7880=>372,7881=>343,7882=>372,7883=>343,7884=>850,7885=>687,7886=>850, -7887=>687,7888=>850,7889=>687,7890=>850,7891=>687,7892=>850,7893=>687,7894=>850,7895=>687,7896=>850, -7897=>687,7898=>850,7899=>687,7900=>850,7901=>687,7902=>850,7903=>687,7904=>850,7905=>687,7906=>850, -7907=>687,7908=>812,7909=>712,7910=>812,7911=>712,7912=>812,7913=>712,7914=>812,7915=>712,7916=>812, -7917=>712,7918=>812,7919=>712,7920=>812,7921=>712,7922=>724,7923=>652,7924=>724,7925=>652,7926=>724, -7927=>652,7928=>724,7929=>652,7936=>687,7937=>687,7938=>687,7939=>687,7940=>687,7941=>687,7942=>687, -7943=>687,7944=>774,7945=>774,7946=>1041,7947=>1043,7948=>935,7949=>963,7950=>835,7951=>859,7952=>557, -7953=>557,7954=>557,7955=>557,7956=>557,7957=>557,7960=>792,7961=>794,7962=>1100,7963=>1096,7964=>1023, -7965=>1052,7968=>712,7969=>712,7970=>712,7971=>712,7972=>712,7973=>712,7974=>712,7975=>712,7976=>945, -7977=>951,7978=>1250,7979=>1250,7980=>1180,7981=>1206,7982=>1054,7983=>1063,7984=>390,7985=>390,7986=>390, -7987=>390,7988=>390,7989=>390,7990=>390,7991=>390,7992=>483,7993=>489,7994=>777,7995=>785,7996=>712, -7997=>738,7998=>604,7999=>604,8000=>687,8001=>687,8002=>687,8003=>687,8004=>687,8005=>687,8008=>892, -8009=>933,8010=>1221,8011=>1224,8012=>1053,8013=>1082,8016=>675,8017=>675,8018=>675,8019=>675,8020=>675, -8021=>675,8022=>675,8023=>675,8025=>930,8027=>1184,8029=>1199,8031=>1049,8032=>869,8033=>869,8034=>869, -8035=>869,8036=>869,8037=>869,8038=>869,8039=>869,8040=>909,8041=>958,8042=>1246,8043=>1251,8044=>1076, -8045=>1105,8046=>1028,8047=>1076,8048=>687,8049=>687,8050=>557,8051=>557,8052=>712,8053=>712,8054=>390, -8055=>390,8056=>687,8057=>687,8058=>675,8059=>675,8060=>869,8061=>869,8064=>687,8065=>687,8066=>687, -8067=>687,8068=>687,8069=>687,8070=>687,8071=>687,8072=>774,8073=>774,8074=>1041,8075=>1043,8076=>935, -8077=>963,8078=>835,8079=>859,8080=>712,8081=>712,8082=>712,8083=>712,8084=>712,8085=>712,8086=>712, -8087=>712,8088=>945,8089=>951,8090=>1250,8091=>1250,8092=>1180,8093=>1206,8094=>1054,8095=>1063,8096=>869, -8097=>869,8098=>869,8099=>869,8100=>869,8101=>869,8102=>869,8103=>869,8104=>909,8105=>958,8106=>1246, -8107=>1251,8108=>1076,8109=>1105,8110=>1028,8111=>1076,8112=>687,8113=>687,8114=>687,8115=>687,8116=>687, -8118=>687,8119=>687,8120=>774,8121=>774,8122=>876,8123=>797,8124=>774,8125=>500,8126=>500,8127=>500, -8128=>500,8129=>500,8130=>712,8131=>712,8132=>712,8134=>712,8135=>712,8136=>929,8137=>846,8138=>1080, -8139=>1009,8140=>837,8141=>500,8142=>500,8143=>500,8144=>390,8145=>390,8146=>390,8147=>390,8150=>390, -8151=>390,8152=>372,8153=>372,8154=>621,8155=>563,8157=>500,8158=>500,8159=>500,8160=>675,8161=>675, -8162=>675,8163=>675,8164=>716,8165=>716,8166=>675,8167=>675,8168=>724,8169=>724,8170=>1020,8171=>980, -8172=>838,8173=>500,8174=>500,8175=>500,8178=>869,8179=>869,8180=>869,8182=>869,8183=>869,8184=>1065, -8185=>891,8186=>1084,8187=>894,8188=>850,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000, -8196=>330,8197=>250,8198=>167,8199=>696,8200=>380,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0, -8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8213=>1000,8214=>500,8215=>500,8219=>380,8223=>657, -8227=>639,8228=>380,8229=>685,8231=>348,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200, -8241=>1908,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733,8251=>972,8252=>627, -8253=>580,8254=>500,8255=>828,8256=>828,8257=>329,8258=>1023,8259=>500,8260=>167,8261=>457,8262=>457, -8263=>1030,8264=>829,8265=>829,8266=>513,8267=>687,8268=>500,8269=>500,8270=>523,8271=>400,8272=>828, -8273=>523,8274=>556,8275=>838,8276=>828,8277=>838,8278=>684,8279=>813,8280=>838,8281=>838,8282=>380, -8283=>872,8284=>838,8285=>380,8286=>380,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, -8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>438,8305=>219,8308=>438,8309=>438, -8310=>438,8311=>438,8312=>438,8313=>438,8314=>528,8315=>528,8316=>528,8317=>288,8318=>288,8319=>456, -8320=>438,8321=>438,8322=>438,8323=>438,8324=>438,8325=>438,8326=>438,8327=>438,8328=>438,8329=>438, -8330=>528,8331=>528,8332=>528,8333=>288,8334=>288,8336=>458,8337=>479,8338=>488,8339=>413,8340=>479, -8352=>929,8353=>696,8354=>696,8355=>696,8356=>696,8357=>1042,8358=>837,8359=>1488,8360=>1205,8361=>1103, -8362=>854,8363=>714,8365=>696,8366=>682,8367=>1392,8368=>696,8369=>696,8370=>696,8371=>696,8372=>859, -8373=>696,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1106,8449=>1106, -8450=>734,8451=>1211,8452=>896,8453=>1114,8454=>1148,8455=>696,8456=>698,8457=>952,8459=>1073,8460=>913, -8461=>888,8462=>712,8463=>712,8464=>597,8465=>697,8466=>856,8467=>472,8468=>974,8469=>837,8470=>1203, -8471=>1000,8472=>697,8473=>750,8474=>850,8475=>938,8476=>814,8477=>801,8478=>896,8479=>710,8480=>1020, -8481=>1239,8483=>834,8484=>754,8485=>622,8486=>850,8487=>769,8488=>763,8489=>303,8490=>775,8491=>774, -8492=>928,8493=>818,8494=>854,8495=>636,8496=>729,8497=>808,8498=>683,8499=>1184,8500=>465,8501=>794, -8502=>731,8503=>494,8504=>684,8505=>380,8506=>945,8507=>1370,8508=>790,8509=>737,8510=>654,8511=>863, -8512=>840,8513=>786,8514=>576,8515=>637,8516=>760,8517=>830,8518=>716,8519=>678,8520=>343,8521=>343, -8523=>872,8526=>547,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035,8537=>1035,8538=>1035, -8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>372,8545=>659,8546=>945,8547=>1099,8548=>774, -8549=>1099,8550=>1386,8551=>1672,8552=>1121,8553=>771,8554=>1120,8555=>1407,8556=>637,8557=>734,8558=>830, -8559=>995,8560=>343,8561=>607,8562=>872,8563=>984,8564=>652,8565=>962,8566=>1227,8567=>1491,8568=>969, -8569=>645,8570=>969,8571=>1233,8572=>343,8573=>593,8574=>716,8575=>1042,8576=>1289,8577=>830,8578=>1289, -8579=>734,8580=>593,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838, -8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838, -8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838, -8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838, -8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838, -8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838, -8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838, -8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838, -8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838, -8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838, -8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838, -8700=>838,8701=>838,8702=>838,8703=>838,8704=>774,8705=>696,8706=>544,8707=>683,8708=>683,8709=>856, -8710=>697,8711=>697,8712=>896,8713=>896,8714=>750,8715=>896,8716=>896,8717=>750,8718=>636,8719=>787, -8720=>787,8721=>718,8722=>838,8723=>838,8724=>696,8725=>365,8726=>696,8727=>838,8728=>626,8729=>380, -8730=>667,8731=>667,8732=>667,8733=>712,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500, -8740=>500,8741=>500,8742=>500,8743=>812,8744=>812,8745=>812,8746=>812,8747=>610,8748=>929,8749=>1295, -8750=>563,8751=>977,8752=>1313,8753=>563,8754=>563,8755=>563,8756=>696,8757=>696,8758=>294,8759=>696, -8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838, -8770=>838,8771=>838,8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838, -8780=>838,8781=>838,8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1063,8789=>1063, -8790=>838,8791=>838,8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838, -8800=>838,8801=>838,8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>841,8809=>841, -8810=>1047,8811=>1047,8812=>500,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838, -8820=>838,8821=>838,8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838, -8830=>838,8831=>838,8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838, -8840=>838,8841=>838,8842=>838,8843=>838,8844=>812,8845=>812,8846=>812,8847=>838,8848=>838,8849=>838, -8850=>838,8851=>796,8852=>796,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838, -8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>914,8867=>914,8868=>914,8869=>914, -8870=>542,8871=>542,8872=>914,8873=>914,8874=>914,8875=>914,8876=>914,8877=>914,8878=>914,8879=>914, -8880=>838,8881=>838,8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838, -8890=>542,8891=>812,8892=>812,8893=>812,8894=>838,8895=>838,8896=>843,8897=>843,8898=>843,8899=>843, -8900=>494,8901=>380,8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838, -8910=>812,8911=>812,8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838, -8920=>1422,8921=>1422,8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838, -8930=>838,8931=>838,8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838, -8940=>838,8941=>838,8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1158,8947=>896,8948=>750,8949=>896, -8950=>896,8951=>750,8952=>896,8953=>896,8954=>1158,8955=>896,8956=>750,8957=>896,8958=>750,8959=>896, -8960=>602,8961=>602,8962=>716,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>457,8969=>457, -8970=>457,8971=>457,8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>539,8984=>928,8985=>838, -8988=>469,8989=>469,8990=>469,8991=>469,8992=>610,8993=>610,8996=>1152,8997=>1152,8998=>1414,8999=>1152, -9000=>1443,9003=>1414,9004=>873,9075=>390,9076=>716,9077=>869,9082=>687,9085=>863,9095=>1152,9108=>873, -9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500, -9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>610, -9166=>838,9167=>945,9187=>873,9189=>769,9250=>716,9251=>716,9312=>847,9313=>847,9314=>847,9315=>847, -9316=>847,9317=>847,9318=>847,9319=>847,9320=>847,9321=>847,9600=>769,9601=>769,9602=>769,9603=>769, -9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769, -9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769, -9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945, -9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678, -9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502, -9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502, -9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873, -9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873, -9684=>873,9685=>873,9686=>527,9687=>527,9688=>840,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387, -9694=>387,9695=>387,9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>639,9703=>945, -9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945, -9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830, -9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896, -9734=>896,9735=>573,9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250, -9744=>896,9745=>896,9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896, -9754=>896,9755=>896,9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896, -9764=>669,9765=>746,9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896, -9774=>896,9775=>896,9776=>896,9777=>896,9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896, -9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9789=>896,9790=>896,9791=>614,9792=>731,9793=>731, -9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896, -9804=>896,9805=>896,9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896, -9814=>896,9815=>896,9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896, -9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472, -9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896, -9844=>896,9845=>896,9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896, -9854=>896,9855=>896,9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896, -9864=>896,9865=>896,9866=>896,9867=>896,9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896, -9874=>896,9875=>896,9876=>896,9877=>541,9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896, -9884=>896,9888=>896,9889=>702,9890=>1003,9891=>1085,9892=>1143,9893=>901,9894=>838,9895=>838,9896=>838, -9897=>838,9898=>838,9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>731, -9907=>732,9908=>732,9909=>732,9910=>850,9911=>732,9912=>732,9985=>838,9986=>838,9987=>838,9988=>838, -9990=>838,9991=>838,9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838, -10002=>838,10003=>838,10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838, -10012=>838,10013=>838,10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838, -10022=>838,10023=>838,10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838, -10033=>838,10034=>838,10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838, -10043=>838,10044=>838,10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838, -10053=>838,10054=>838,10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896, -10065=>896,10066=>896,10070=>896,10072=>838,10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538, -10081=>838,10082=>838,10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838, -10091=>838,10092=>838,10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838, -10101=>838,10102=>847,10103=>847,10104=>847,10105=>847,10106=>847,10107=>847,10108=>847,10109=>847,10110=>847, -10111=>847,10112=>838,10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838, -10121=>838,10122=>838,10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838, -10131=>838,10132=>838,10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838, -10144=>838,10145=>838,10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838, -10154=>838,10155=>838,10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838, -10165=>838,10166=>838,10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838, -10181=>457,10182=>457,10208=>494,10214=>487,10215=>487,10216=>457,10217=>457,10218=>721,10219=>721,10224=>838, -10225=>838,10226=>838,10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434, -10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781, -10245=>781,10246=>781,10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781, -10255=>781,10256=>781,10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781, -10265=>781,10266=>781,10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781, -10275=>781,10276=>781,10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781, -10285=>781,10286=>781,10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781, -10295=>781,10296=>781,10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781, -10305=>781,10306=>781,10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781, -10315=>781,10316=>781,10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781, -10325=>781,10326=>781,10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781, -10335=>781,10336=>781,10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781, -10345=>781,10346=>781,10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781, -10355=>781,10356=>781,10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781, -10365=>781,10366=>781,10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781, -10375=>781,10376=>781,10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781, -10385=>781,10386=>781,10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781, -10395=>781,10396=>781,10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781, -10405=>781,10406=>781,10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781, -10415=>781,10416=>781,10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781, -10425=>781,10426=>781,10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781, -10435=>781,10436=>781,10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781, -10445=>781,10446=>781,10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781, -10455=>781,10456=>781,10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781, -10465=>781,10466=>781,10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781, -10475=>781,10476=>781,10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781, -10485=>781,10486=>781,10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781, -10495=>781,10502=>838,10503=>838,10506=>838,10507=>838,10560=>838,10561=>838,10627=>753,10628=>753,10702=>838, -10703=>1046,10704=>1046,10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838, -10752=>1000,10753=>1000,10754=>1000,10764=>1661,10765=>563,10766=>563,10767=>563,10768=>563,10769=>563,10770=>563, -10771=>563,10772=>563,10773=>563,10774=>563,10775=>563,10776=>563,10777=>563,10778=>563,10779=>563,10780=>563, -10799=>838,10877=>838,10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838, -10886=>838,10887=>838,10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838, -10896=>838,10897=>838,10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838, -10906=>838,10907=>838,10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838, -10929=>838,10930=>838,10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838, -11001=>838,11002=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838, -11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838, -11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869, -11040=>869,11041=>873,11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>637,11361=>360,11362=>637, -11363=>733,11364=>770,11365=>675,11366=>478,11367=>956,11368=>712,11369=>775,11370=>665,11371=>725,11372=>582, -11373=>860,11374=>995,11375=>774,11377=>778,11378=>1221,11379=>1056,11380=>652,11381=>698,11382=>565,11383=>782, -11385=>538,11386=>687,11387=>559,11388=>219,11389=>487,11800=>586,11810=>457,11811=>457,11812=>457,11813=>457, -11822=>580,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896,19912=>896, -19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896,19922=>896, -19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896,19932=>896, -19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896,19942=>896, -19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896,19952=>896, -19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896,19962=>896, -19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>720,42565=>595,42566=>436,42567=>440,42572=>1405, -42573=>1173,42576=>1234,42577=>1027,42580=>1174,42581=>972,42582=>1100,42583=>969,42594=>1100,42595=>940,42596=>1096, -42597=>915,42598=>1260,42599=>997,42600=>850,42601=>687,42602=>1037,42603=>868,42604=>1406,42605=>1106,42606=>961, -42634=>944,42635=>749,42636=>682,42637=>580,42644=>808,42645=>712,42760=>500,42761=>500,42762=>500,42763=>500, -42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500,42771=>500,42772=>500,42773=>500, -42774=>500,42779=>400,42780=>400,42781=>287,42782=>287,42783=>287,42790=>837,42791=>712,42792=>1031,42793=>857, -42794=>696,42795=>557,42800=>559,42801=>595,42802=>1349,42803=>1052,42804=>1285,42805=>1065,42806=>1245,42807=>1052, -42808=>1079,42809=>922,42810=>1079,42811=>922,42812=>1035,42813=>922,42814=>698,42815=>549,42822=>850,42823=>542, -42824=>683,42825=>531,42826=>918,42827=>814,42830=>1406,42831=>1106,42880=>637,42881=>343,42882=>837,42883=>712, -42889=>400,42890=>396,42891=>456,42892=>306,43003=>683,43004=>733,43005=>995,43006=>372,43007=>1325,62917=>687, -64256=>833,64257=>787,64258=>787,64259=>1138,64260=>1139,64261=>808,64262=>1020,64275=>1388,64276=>1384,64277=>1378, -64278=>1384,64279=>1713,64285=>343,64286=>0,64287=>663,64288=>720,64289=>963,64290=>890,64291=>988,64292=>963, -64293=>938,64294=>988,64295=>988,64296=>976,64297=>838,64298=>949,64299=>949,64300=>949,64301=>949,64302=>751, -64303=>751,64304=>751,64305=>673,64306=>537,64307=>654,64308=>712,64309=>343,64310=>491,64312=>724,64313=>467, -64314=>649,64315=>650,64316=>679,64318=>775,64320=>497,64321=>773,64323=>718,64324=>687,64326=>751,64327=>729, -64328=>649,64329=>949,64330=>751,64331=>343,64332=>673,64333=>650,64334=>687,64335=>751,65024=>0,65025=>0, -65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0, -65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0, -65531=>0,65532=>0,65533=>1113); -$enc=''; -$diff=''; -$file='dejavusansbi.z'; -$ctg='dejavusansbi.ctg.z'; -$originalsize=524056; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.z deleted file mode 100644 index 03c4078e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansbi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.ctg.z deleted file mode 100644 index 3170ea6f..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.php deleted file mode 100644 index 2dd9c238..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.php +++ /dev/null @@ -1,517 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>26,'Flags'=>96,'FontBBox'=>'[-918 -350 1513 1167]','ItalicAngle'=>-18.9,'StemV'=>70,'MissingWidth'=>540); -$up=-63; -$ut=44; -$dw=540; -$cw=array( -0=>540,32=>286,33=>360,34=>414,35=>754,36=>572,37=>855,38=>702,39=>247,40=>351, -41=>351,42=>450,43=>754,44=>286,45=>325,46=>286,47=>303,48=>572,49=>572,50=>572, -51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754, -61=>754,62=>754,63=>478,64=>900,65=>615,66=>617,67=>628,68=>693,69=>568,70=>518, -71=>697,72=>677,73=>265,74=>265,75=>590,76=>501,77=>776,78=>673,79=>708,80=>542, -81=>708,82=>625,83=>571,84=>549,85=>659,86=>615,87=>890,88=>616,89=>549,90=>616, -91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>551,98=>571,99=>495,100=>571, -101=>554,102=>316,103=>571,104=>570,105=>250,106=>250,107=>521,108=>250,109=>876,110=>570, -111=>550,112=>571,113=>571,114=>370,115=>469,116=>353,117=>570,118=>532,119=>736,120=>532, -121=>532,122=>472,123=>572,124=>303,125=>572,126=>754,8364=>572,8218=>286,402=>316,8222=>466, -8230=>900,8224=>450,8225=>450,710=>450,8240=>1208,352=>571,8249=>360,338=>962,381=>616,8216=>286, -8217=>286,8220=>466,8221=>466,8226=>531,8211=>450,8212=>900,732=>450,8482=>900,353=>469,8250=>360, -339=>920,382=>472,376=>549,160=>286,161=>360,162=>572,163=>572,164=>572,165=>572,166=>303, -167=>450,168=>450,169=>900,170=>424,171=>550,172=>754,173=>325,174=>900,175=>450,176=>450, -177=>754,178=>360,179=>360,180=>450,181=>572,182=>572,183=>286,184=>450,185=>360,186=>424, -187=>550,188=>872,189=>872,190=>872,191=>478,192=>615,193=>615,194=>615,195=>615,196=>615, -197=>615,198=>876,199=>628,200=>568,201=>568,202=>568,203=>568,204=>265,205=>265,206=>265, -207=>265,208=>697,209=>673,210=>708,211=>708,212=>708,213=>708,214=>708,215=>754,216=>708, -217=>659,218=>659,219=>659,220=>659,221=>549,222=>544,223=>567,224=>551,225=>551,226=>551, -227=>551,228=>551,229=>551,230=>883,231=>495,232=>554,233=>554,234=>554,235=>554,236=>250, -237=>250,238=>250,239=>250,240=>550,241=>570,242=>550,243=>550,244=>550,245=>550,246=>550, -247=>754,248=>550,249=>570,250=>570,251=>570,252=>570,253=>532,254=>571,255=>532,256=>615, -257=>551,258=>615,259=>551,260=>615,261=>551,262=>628,263=>495,264=>628,265=>495,266=>628, -267=>495,268=>628,269=>495,270=>693,271=>571,272=>697,273=>571,274=>568,275=>554,276=>568, -277=>554,278=>568,279=>554,280=>568,281=>554,282=>568,283=>554,284=>697,285=>571,286=>697, -287=>571,288=>697,289=>571,290=>697,291=>571,292=>677,293=>570,294=>824,295=>625,296=>265, -297=>250,298=>265,299=>250,300=>265,301=>250,302=>265,303=>250,304=>265,305=>250,306=>531, -307=>500,308=>265,309=>250,310=>590,311=>521,312=>521,313=>501,314=>250,315=>501,316=>250, -317=>501,318=>337,319=>501,320=>308,321=>505,322=>255,323=>673,324=>570,325=>673,326=>570, -327=>673,328=>570,329=>732,330=>673,331=>570,332=>708,333=>550,334=>708,335=>550,336=>708, -337=>550,340=>625,341=>370,342=>625,343=>370,344=>625,345=>370,346=>571,347=>469,348=>571, -349=>469,350=>571,351=>469,354=>549,355=>353,356=>549,357=>353,358=>549,359=>353,360=>659, -361=>570,362=>659,363=>570,364=>659,365=>570,366=>659,367=>570,368=>659,369=>570,370=>659, -371=>570,372=>890,373=>736,374=>549,375=>532,377=>616,378=>472,379=>616,380=>472,383=>316, -384=>571,385=>661,386=>617,387=>571,388=>617,389=>571,390=>633,391=>628,392=>495,393=>697, -394=>737,395=>617,396=>571,397=>550,398=>568,399=>708,400=>553,401=>518,403=>697,404=>618, -405=>885,406=>318,407=>265,408=>671,409=>521,410=>250,411=>532,412=>876,413=>673,414=>570, -415=>708,416=>822,417=>550,418=>854,419=>683,420=>586,421=>571,422=>625,423=>571,424=>469, -425=>568,426=>302,427=>353,428=>549,429=>353,430=>549,431=>772,432=>570,433=>688,434=>648, -435=>669,436=>657,437=>616,438=>472,439=>599,440=>599,441=>520,442=>472,443=>572,444=>599, -445=>520,446=>459,447=>571,448=>265,449=>443,450=>413,451=>266,452=>1279,453=>1169,454=>1039, -455=>751,456=>708,457=>411,458=>838,459=>831,460=>717,461=>615,462=>551,463=>265,464=>250, -465=>708,466=>550,467=>659,468=>570,469=>659,470=>570,471=>659,472=>570,473=>659,474=>570, -475=>659,476=>570,477=>554,478=>615,479=>551,480=>615,481=>551,482=>876,483=>883,484=>697, -485=>571,486=>697,487=>571,488=>590,489=>521,490=>708,491=>550,492=>708,493=>550,494=>599, -495=>520,496=>250,497=>1279,498=>1169,499=>1039,500=>697,501=>571,502=>1001,503=>614,504=>673, -505=>570,506=>615,507=>551,508=>876,509=>883,510=>708,511=>550,512=>615,513=>551,514=>615, -515=>551,516=>568,517=>554,518=>568,519=>554,520=>265,521=>250,522=>265,523=>250,524=>708, -525=>550,526=>708,527=>550,528=>625,529=>370,530=>625,531=>370,532=>659,533=>570,534=>659, -535=>570,536=>571,537=>469,538=>549,539=>353,540=>564,541=>469,542=>677,543=>570,544=>662, -545=>754,546=>628,547=>549,548=>616,549=>472,550=>615,551=>551,552=>568,553=>554,554=>708, -555=>550,556=>708,557=>550,558=>708,559=>550,560=>708,561=>550,562=>549,563=>532,564=>427, -565=>758,566=>429,567=>250,568=>898,569=>898,570=>615,571=>628,572=>495,573=>501,574=>549, -575=>469,576=>472,577=>542,578=>431,579=>617,580=>659,581=>615,582=>568,583=>554,584=>265, -585=>250,586=>703,587=>571,588=>625,589=>370,590=>549,591=>532,592=>540,593=>571,594=>571, -595=>571,596=>494,597=>495,598=>571,599=>626,600=>554,601=>554,602=>737,603=>486,604=>479, -605=>698,606=>598,607=>250,608=>626,609=>571,610=>566,611=>536,612=>536,613=>570,614=>570, -615=>570,616=>250,617=>304,618=>334,619=>356,620=>438,621=>250,622=>635,623=>876,624=>876, -625=>876,626=>581,627=>578,628=>570,629=>550,630=>772,631=>655,632=>593,633=>373,634=>373, -635=>372,636=>370,637=>369,638=>477,639=>477,640=>543,641=>543,642=>469,643=>302,644=>302, -645=>415,646=>302,647=>353,648=>353,649=>570,650=>556,651=>538,652=>532,653=>736,654=>532, -655=>549,656=>472,657=>472,658=>520,659=>520,660=>459,661=>459,662=>459,663=>459,664=>708, -665=>521,666=>598,667=>637,668=>588,669=>263,670=>600,671=>456,672=>654,673=>459,674=>459, -675=>913,676=>952,677=>911,678=>742,679=>549,680=>700,681=>763,682=>576,683=>589,684=>463, -685=>463,686=>595,687=>597,688=>364,689=>359,690=>157,691=>233,692=>266,693=>266,694=>341, -695=>463,696=>335,697=>250,698=>414,699=>286,700=>286,701=>286,702=>276,703=>276,704=>333, -705=>333,706=>450,707=>450,708=>450,709=>450,711=>450,712=>247,713=>450,714=>450,715=>450, -716=>247,717=>450,718=>450,719=>450,720=>303,721=>303,722=>276,723=>276,724=>450,725=>450, -726=>351,727=>286,728=>450,729=>450,730=>450,731=>450,733=>450,734=>284,735=>450,736=>383, -737=>149,738=>335,739=>399,740=>333,741=>444,742=>444,743=>444,744=>444,745=>444,748=>450, -749=>450,750=>466,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, -774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, -784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, -794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, -844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, -860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>589,881=>511,882=>775, -883=>583,884=>250,885=>250,886=>673,887=>584,890=>450,891=>494,892=>495,893=>494,894=>303, -900=>450,901=>450,902=>623,903=>286,904=>671,905=>784,906=>367,908=>731,910=>742,911=>743, -912=>304,913=>615,914=>617,915=>501,916=>615,917=>568,918=>616,919=>677,920=>708,921=>265, -922=>590,923=>615,924=>776,925=>673,926=>568,927=>708,928=>677,929=>542,931=>568,932=>549, -933=>549,934=>708,935=>616,936=>708,937=>688,938=>265,939=>549,940=>593,941=>486,942=>570, -943=>304,944=>521,945=>593,946=>574,947=>532,948=>550,949=>486,950=>489,951=>570,952=>550, -953=>304,954=>530,955=>532,956=>572,957=>502,958=>501,959=>550,960=>542,961=>571,962=>528, -963=>570,964=>542,965=>521,966=>593,967=>520,968=>593,969=>753,970=>304,971=>521,972=>550, -973=>521,974=>753,975=>590,976=>553,977=>557,978=>628,979=>758,980=>628,981=>593,982=>753, -983=>597,984=>708,985=>550,986=>583,987=>528,988=>518,989=>413,990=>593,991=>593,992=>778, -993=>564,994=>840,995=>753,996=>682,997=>593,998=>712,999=>553,1000=>618,1001=>546,1002=>690, -1003=>563,1004=>629,1005=>550,1006=>549,1007=>482,1008=>597,1009=>571,1010=>495,1011=>250,1012=>708, -1013=>554,1014=>554,1015=>544,1016=>571,1017=>628,1018=>776,1019=>585,1020=>571,1021=>633,1022=>628, -1023=>633,1024=>568,1025=>568,1026=>708,1027=>549,1028=>628,1029=>571,1030=>265,1031=>265,1032=>265, -1033=>984,1034=>940,1035=>708,1036=>639,1037=>673,1038=>548,1039=>677,1040=>615,1041=>617,1042=>617, -1043=>549,1044=>703,1045=>568,1046=>969,1047=>577,1048=>673,1049=>673,1050=>639,1051=>677,1052=>776, -1053=>677,1054=>708,1055=>677,1056=>542,1057=>628,1058=>549,1059=>548,1060=>774,1061=>616,1062=>699, -1063=>617,1064=>962,1065=>984,1066=>749,1067=>794,1068=>617,1069=>628,1070=>971,1071=>625,1072=>551, -1073=>555,1074=>530,1075=>473,1076=>622,1077=>554,1078=>811,1079=>479,1080=>584,1081=>584,1082=>543, -1083=>575,1084=>679,1085=>588,1086=>550,1087=>588,1088=>571,1089=>495,1090=>524,1091=>532,1092=>769, -1093=>532,1094=>612,1095=>532,1096=>823,1097=>848,1098=>636,1099=>710,1100=>530,1101=>494,1102=>757, -1103=>541,1104=>554,1105=>554,1106=>563,1107=>473,1108=>494,1109=>469,1110=>250,1111=>250,1112=>250, -1113=>812,1114=>809,1115=>586,1116=>543,1117=>584,1118=>532,1119=>588,1120=>840,1121=>753,1122=>693, -1123=>604,1124=>848,1125=>674,1126=>791,1127=>705,1128=>1043,1129=>901,1130=>708,1131=>550,1132=>924, -1133=>742,1134=>572,1135=>486,1136=>771,1137=>789,1138=>708,1139=>550,1140=>703,1141=>598,1142=>703, -1143=>598,1144=>893,1145=>813,1146=>857,1147=>682,1148=>1062,1149=>925,1150=>840,1151=>753,1152=>628, -1153=>495,1154=>452,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>695, -1163=>609,1164=>617,1165=>530,1166=>542,1167=>571,1168=>549,1169=>473,1170=>607,1171=>531,1172=>562, -1173=>477,1174=>969,1175=>811,1176=>577,1177=>479,1178=>639,1179=>543,1180=>639,1181=>543,1182=>639, -1183=>543,1184=>771,1185=>748,1186=>677,1187=>594,1188=>913,1189=>789,1190=>973,1191=>824,1192=>790, -1193=>624,1194=>628,1195=>495,1196=>549,1197=>524,1198=>549,1199=>532,1200=>549,1201=>532,1202=>616, -1203=>532,1204=>840,1205=>726,1206=>617,1207=>532,1208=>617,1209=>532,1210=>617,1211=>570,1212=>847, -1213=>655,1214=>847,1215=>655,1216=>265,1217=>969,1218=>811,1219=>590,1220=>543,1221=>698,1222=>603, -1223=>677,1224=>594,1225=>699,1226=>612,1227=>617,1228=>532,1229=>799,1230=>697,1231=>250,1232=>615, -1233=>551,1234=>615,1235=>551,1236=>876,1237=>883,1238=>568,1239=>554,1240=>708,1241=>554,1242=>708, -1243=>554,1244=>969,1245=>811,1246=>577,1247=>479,1248=>599,1249=>520,1250=>673,1251=>584,1252=>673, -1253=>584,1254=>708,1255=>550,1256=>708,1257=>550,1258=>708,1259=>550,1260=>628,1261=>494,1262=>548, -1263=>532,1264=>548,1265=>532,1266=>548,1267=>532,1268=>617,1269=>532,1270=>549,1271=>473,1272=>794, -1273=>710,1274=>607,1275=>531,1276=>616,1277=>532,1278=>616,1279=>532,1280=>617,1281=>530,1282=>905, -1283=>807,1284=>877,1285=>782,1286=>611,1287=>529,1288=>964,1289=>861,1290=>1001,1291=>870,1292=>697, -1293=>593,1294=>695,1295=>640,1296=>553,1297=>486,1298=>677,1299=>575,1300=>1052,1301=>894,1302=>804, -1303=>778,1304=>928,1305=>887,1306=>708,1307=>571,1308=>890,1309=>736,1312=>972,1313=>814,1314=>973, -1315=>821,1316=>713,1317=>614,1329=>780,1330=>659,1331=>794,1332=>794,1333=>659,1334=>579,1335=>613, -1336=>659,1337=>765,1338=>794,1339=>659,1340=>501,1341=>741,1342=>888,1343=>659,1344=>636,1345=>579, -1346=>794,1347=>699,1348=>794,1349=>659,1350=>756,1351=>659,1352=>659,1353=>659,1354=>711,1355=>579, -1356=>794,1357=>659,1358=>794,1359=>571,1360=>659,1361=>659,1362=>719,1363=>708,1364=>711,1365=>708, -1366=>571,1369=>276,1370=>286,1371=>450,1372=>450,1373=>352,1374=>474,1375=>450,1377=>876,1378=>570, -1379=>686,1380=>690,1381=>570,1382=>627,1383=>479,1384=>570,1385=>630,1386=>627,1387=>570,1388=>363, -1389=>804,1390=>576,1391=>570,1392=>570,1393=>571,1394=>631,1395=>570,1396=>593,1397=>250,1398=>684, -1399=>464,1400=>570,1401=>407,1402=>876,1403=>464,1404=>691,1405=>570,1406=>626,1407=>876,1408=>570, -1409=>571,1410=>451,1411=>876,1412=>583,1413=>550,1414=>566,1415=>686,1417=>303,1418=>390,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>325,1471=>0,1472=>265,1473=>0,1474=>0,1475=>265,1478=>397, -1479=>0,1488=>566,1489=>547,1490=>403,1491=>534,1492=>576,1493=>245,1494=>336,1495=>576,1496=>583, -1497=>245,1498=>532,1499=>500,1500=>539,1501=>576,1502=>593,1503=>245,1504=>397,1505=>629,1506=>506, -1507=>576,1508=>543,1509=>468,1510=>523,1511=>596,1512=>532,1513=>727,1514=>591,1520=>423,1521=>409, -1522=>423,1523=>374,1524=>580,1542=>573,1543=>573,1545=>681,1546=>879,1548=>290,1557=>0,1563=>286, -1567=>478,1569=>423,1570=>250,1571=>250,1572=>435,1573=>250,1574=>704,1575=>250,1576=>847,1577=>471, -1578=>847,1579=>847,1580=>581,1581=>581,1582=>581,1583=>400,1584=>400,1585=>435,1586=>435,1587=>1099, -1588=>1099,1589=>1088,1590=>1088,1591=>832,1592=>832,1593=>537,1594=>537,1600=>264,1601=>933,1602=>698, -1603=>742,1604=>654,1605=>557,1606=>661,1607=>471,1608=>435,1609=>704,1610=>704,1611=>0,1612=>0, -1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1626=>450, -1632=>483,1633=>483,1634=>483,1635=>483,1636=>483,1637=>483,1638=>483,1639=>483,1640=>483,1641=>483, -1642=>483,1643=>292,1644=>286,1645=>490,1646=>847,1647=>698,1652=>263,1657=>847,1658=>847,1659=>847, -1660=>847,1661=>847,1662=>847,1663=>847,1664=>847,1665=>581,1666=>581,1667=>581,1668=>581,1669=>581, -1670=>581,1671=>581,1681=>435,1682=>435,1685=>549,1688=>435,1697=>933,1700=>933,1702=>933,1705=>805, -1711=>805,1717=>654,1722=>661,1727=>581,1734=>435,1740=>704,1742=>704,1749=>471,1776=>483,1777=>483, -1778=>483,1779=>483,1780=>483,1781=>483,1782=>483,1783=>483,1784=>483,1785=>483,1984=>572,1985=>572, -1986=>572,1987=>572,1988=>572,1989=>572,1990=>572,1991=>572,1992=>572,1993=>572,1994=>250,1995=>514, -1996=>381,1997=>532,1998=>588,1999=>588,2000=>534,2001=>588,2002=>746,2003=>394,2004=>394,2005=>502, -2006=>550,2007=>315,2008=>863,2009=>425,2010=>705,2011=>588,2012=>563,2013=>660,2014=>477,2015=>651, -2016=>425,2017=>563,2018=>534,2019=>477,2020=>477,2021=>470,2022=>534,2023=>534,2027=>0,2028=>0, -2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>282,2037=>282,2040=>504, -2041=>504,2042=>325,3647=>586,3713=>603,3714=>615,3716=>619,3719=>434,3720=>565,3722=>615,3725=>619, -3732=>602,3733=>577,3734=>580,3735=>589,3737=>593,3738=>563,3739=>563,3740=>670,3741=>690,3742=>618, -3743=>618,3745=>631,3746=>619,3747=>615,3749=>584,3751=>569,3754=>633,3755=>737,3757=>569,3758=>615, -3759=>708,3760=>569,3761=>0,3762=>485,3763=>485,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0, -3769=>0,3771=>0,3772=>0,3773=>597,3776=>337,3777=>591,3778=>414,3779=>492,3780=>442,3782=>606, -3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>572,3793=>576,3794=>576,3795=>603, -3796=>563,3797=>563,3798=>633,3799=>603,3800=>606,3801=>609,3804=>925,3805=>925,4256=>756,4257=>621, -4258=>577,4259=>683,4260=>532,4261=>617,4262=>710,4263=>729,4264=>420,4265=>508,4266=>710,4267=>713, -4268=>526,4269=>753,4270=>675,4271=>620,4272=>729,4273=>526,4274=>526,4275=>753,4276=>753,4277=>581, -4278=>543,4279=>526,4280=>536,4281=>526,4282=>649,4283=>715,4284=>526,4285=>510,4286=>526,4287=>602, -4288=>719,4289=>488,4290=>598,4291=>488,4292=>508,4293=>606,4304=>457,4305=>457,4306=>479,4307=>706, -4308=>470,4309=>465,4310=>457,4311=>717,4312=>457,4313=>466,4314=>952,4315=>470,4316=>470,4317=>704, -4318=>466,4319=>470,4320=>713,4321=>470,4322=>590,4323=>471,4324=>709,4325=>470,4326=>704,4327=>470, -4328=>470,4329=>470,4330=>510,4331=>470,4332=>470,4333=>439,4334=>470,4335=>448,4336=>465,4337=>504, -4338=>457,4339=>457,4340=>457,4341=>507,4342=>741,4343=>536,4344=>470,4345=>498,4346=>498,4347=>527, -4348=>273,5121=>615,5122=>615,5123=>615,5124=>615,5125=>692,5126=>692,5127=>692,5129=>692,5130=>692, -5131=>692,5132=>751,5133=>751,5134=>751,5135=>751,5136=>751,5137=>751,5138=>870,5139=>906,5140=>870, -5141=>906,5142=>692,5143=>870,5144=>906,5145=>870,5146=>906,5147=>692,5149=>230,5150=>488,5151=>381, -5152=>381,5153=>350,5154=>350,5155=>354,5156=>350,5157=>419,5158=>347,5159=>230,5160=>350,5161=>350, -5162=>350,5163=>980,5164=>817,5165=>857,5166=>1005,5167=>615,5168=>615,5169=>615,5170=>615,5171=>656, -5172=>656,5173=>656,5175=>656,5176=>656,5177=>656,5178=>751,5179=>615,5180=>751,5181=>751,5182=>751, -5183=>751,5184=>870,5185=>906,5186=>870,5187=>906,5188=>870,5189=>906,5190=>870,5191=>906,5192=>656, -5193=>457,5194=>172,5196=>659,5197=>659,5198=>659,5199=>659,5200=>657,5201=>657,5202=>657,5204=>657, -5205=>657,5206=>657,5207=>829,5208=>800,5209=>829,5210=>800,5211=>829,5212=>800,5213=>835,5214=>810, -5215=>835,5216=>810,5217=>853,5218=>810,5219=>853,5220=>810,5221=>853,5222=>391,5223=>790,5224=>790, -5225=>779,5226=>801,5227=>565,5228=>565,5229=>565,5230=>565,5231=>565,5232=>565,5233=>565,5234=>565, -5235=>565,5236=>773,5237=>693,5238=>733,5239=>734,5240=>733,5241=>734,5242=>773,5243=>693,5244=>773, -5245=>693,5246=>733,5247=>734,5248=>733,5249=>734,5250=>733,5251=>366,5252=>366,5253=>675,5254=>697, -5255=>675,5256=>697,5257=>565,5258=>565,5259=>565,5260=>565,5261=>565,5262=>565,5263=>565,5264=>565, -5265=>565,5266=>773,5267=>693,5268=>733,5269=>734,5270=>733,5271=>734,5272=>773,5273=>693,5274=>773, -5275=>693,5276=>733,5277=>734,5278=>733,5279=>734,5280=>733,5281=>391,5282=>391,5283=>549,5284=>501, -5285=>501,5286=>501,5287=>549,5288=>549,5289=>549,5290=>501,5291=>501,5292=>674,5293=>691,5294=>671, -5295=>687,5296=>671,5297=>687,5298=>674,5299=>691,5300=>674,5301=>691,5302=>671,5303=>687,5304=>671, -5305=>687,5306=>671,5307=>347,5308=>457,5309=>347,5312=>766,5313=>766,5314=>766,5315=>766,5316=>766, -5317=>766,5318=>766,5319=>766,5320=>766,5321=>962,5322=>931,5323=>953,5324=>766,5325=>953,5326=>766, -5327=>766,5328=>540,5329=>407,5330=>540,5331=>766,5332=>766,5333=>766,5334=>766,5335=>766,5336=>766, -5337=>766,5338=>766,5339=>766,5340=>962,5341=>931,5342=>953,5343=>927,5344=>953,5345=>927,5346=>962, -5347=>931,5348=>962,5349=>931,5350=>975,5351=>927,5352=>975,5353=>927,5354=>540,5356=>656,5357=>542, -5358=>542,5359=>542,5360=>542,5361=>542,5362=>542,5363=>542,5364=>542,5365=>542,5366=>751,5367=>678, -5368=>712,5369=>694,5370=>712,5371=>694,5372=>751,5373=>678,5374=>751,5375=>678,5376=>712,5377=>694, -5378=>712,5379=>694,5380=>712,5381=>376,5382=>378,5383=>376,5392=>641,5393=>641,5394=>641,5395=>802, -5396=>802,5397=>802,5398=>802,5399=>818,5400=>785,5401=>818,5402=>785,5403=>818,5404=>785,5405=>1026, -5406=>989,5407=>1026,5408=>989,5409=>1026,5410=>989,5411=>1026,5412=>989,5413=>576,5414=>564,5415=>564, -5416=>564,5417=>564,5418=>564,5419=>564,5420=>564,5421=>564,5422=>564,5423=>760,5424=>703,5425=>734, -5426=>736,5427=>734,5428=>736,5429=>760,5430=>703,5431=>760,5432=>703,5433=>734,5434=>736,5435=>734, -5436=>736,5437=>734,5438=>376,5440=>350,5441=>436,5442=>824,5443=>824,5444=>824,5445=>824,5446=>824, -5447=>824,5448=>542,5449=>542,5450=>542,5451=>542,5452=>542,5453=>542,5454=>751,5455=>678,5456=>376, -5458=>656,5459=>615,5460=>615,5461=>615,5462=>615,5463=>653,5464=>653,5465=>653,5466=>653,5467=>831, -5468=>906,5469=>457,5470=>659,5471=>659,5472=>659,5473=>659,5474=>659,5475=>659,5476=>657,5477=>657, -5478=>657,5479=>657,5480=>853,5481=>810,5482=>457,5492=>747,5493=>747,5494=>747,5495=>747,5496=>747, -5497=>747,5498=>747,5499=>507,5500=>677,5501=>436,5502=>942,5503=>942,5504=>942,5505=>942,5506=>942, -5507=>942,5508=>942,5509=>743,5514=>747,5515=>747,5516=>747,5517=>747,5518=>1133,5519=>1133,5520=>1133, -5521=>901,5522=>901,5523=>1133,5524=>1133,5525=>629,5526=>965,5536=>766,5537=>766,5538=>766,5539=>766, -5540=>766,5541=>766,5542=>540,5543=>579,5544=>579,5545=>579,5546=>579,5547=>579,5548=>579,5549=>579, -5550=>376,5551=>565,5598=>693,5601=>690,5702=>421,5703=>421,5742=>399,5743=>942,5744=>1178,5745=>1469, -5746=>1469,5747=>1237,5748=>1237,5749=>1469,5750=>1469,5760=>429,5761=>443,5762=>641,5763=>838,5764=>1035, -5765=>1232,5766=>443,5767=>641,5768=>838,5769=>1035,5770=>1232,5771=>448,5772=>646,5773=>844,5774=>1042, -5775=>1241,5776=>443,5777=>641,5778=>836,5779=>1034,5780=>1232,5781=>448,5782=>677,5783=>709,5784=>1084, -5785=>1035,5786=>615,5787=>457,5788=>456,7424=>532,7425=>646,7426=>883,7427=>527,7428=>495,7429=>544, -7430=>544,7431=>441,7432=>486,7433=>250,7434=>355,7435=>521,7436=>524,7437=>679,7438=>584,7439=>550, -7440=>495,7441=>615,7442=>615,7443=>615,7444=>920,7446=>550,7447=>550,7448=>472,7449=>541,7450=>541, -7451=>524,7452=>517,7453=>663,7454=>853,7455=>574,7456=>532,7457=>736,7458=>472,7459=>473,7462=>524, -7463=>532,7464=>507,7465=>472,7466=>531,7467=>575,7468=>387,7469=>552,7470=>389,7472=>436,7473=>358, -7474=>358,7475=>439,7476=>426,7477=>167,7478=>167,7479=>372,7480=>315,7481=>489,7482=>424,7483=>424, -7484=>446,7485=>396,7486=>342,7487=>394,7488=>346,7489=>415,7490=>560,7491=>352,7492=>352,7493=>365, -7494=>583,7495=>385,7496=>365,7497=>375,7498=>375,7499=>324,7500=>323,7501=>365,7502=>161,7503=>383, -7504=>561,7505=>368,7506=>372,7507=>333,7508=>372,7509=>372,7510=>385,7511=>265,7512=>364,7513=>422, -7514=>561,7515=>375,7517=>361,7518=>335,7519=>347,7520=>374,7521=>327,7522=>161,7523=>233,7524=>364, -7525=>375,7526=>361,7527=>335,7528=>370,7529=>374,7530=>327,7543=>571,7544=>426,7547=>334,7557=>250, -7579=>365,7580=>333,7581=>333,7582=>372,7583=>324,7584=>267,7585=>209,7586=>365,7587=>364,7588=>235, -7589=>224,7590=>234,7591=>235,7592=>211,7593=>224,7594=>211,7595=>338,7596=>561,7597=>561,7598=>369, -7599=>431,7600=>368,7601=>372,7602=>372,7603=>324,7604=>258,7605=>265,7606=>457,7607=>376,7608=>325, -7609=>365,7610=>375,7611=>330,7612=>393,7613=>330,7614=>353,7615=>372,7620=>0,7621=>0,7622=>0, -7623=>0,7624=>0,7625=>0,7680=>615,7681=>551,7682=>617,7683=>571,7684=>617,7685=>571,7686=>617, -7687=>571,7688=>628,7689=>495,7690=>693,7691=>571,7692=>693,7693=>571,7694=>693,7695=>571,7696=>693, -7697=>571,7698=>693,7699=>571,7700=>568,7701=>554,7702=>568,7703=>554,7704=>568,7705=>554,7706=>568, -7707=>554,7708=>568,7709=>554,7710=>518,7711=>316,7712=>697,7713=>571,7714=>677,7715=>570,7716=>677, -7717=>570,7718=>677,7719=>570,7720=>677,7721=>570,7722=>677,7723=>570,7724=>265,7725=>250,7726=>265, -7727=>250,7728=>590,7729=>521,7730=>590,7731=>521,7732=>590,7733=>521,7734=>501,7735=>259,7736=>501, -7737=>259,7738=>501,7739=>250,7740=>501,7741=>250,7742=>776,7743=>876,7744=>776,7745=>876,7746=>776, -7747=>876,7748=>673,7749=>570,7750=>673,7751=>570,7752=>673,7753=>570,7754=>673,7755=>570,7756=>708, -7757=>550,7758=>708,7759=>550,7760=>708,7761=>550,7762=>708,7763=>550,7764=>542,7765=>571,7766=>542, -7767=>571,7768=>625,7769=>370,7770=>625,7771=>370,7772=>625,7773=>370,7774=>625,7775=>370,7776=>571, -7777=>469,7778=>571,7779=>469,7780=>571,7781=>469,7782=>571,7783=>469,7784=>571,7785=>469,7786=>549, -7787=>353,7788=>549,7789=>353,7790=>549,7791=>353,7792=>549,7793=>353,7794=>659,7795=>570,7796=>659, -7797=>570,7798=>659,7799=>570,7800=>659,7801=>570,7802=>659,7803=>570,7804=>615,7805=>532,7806=>615, -7807=>532,7808=>890,7809=>736,7810=>890,7811=>736,7812=>890,7813=>736,7814=>890,7815=>736,7816=>890, -7817=>736,7818=>616,7819=>532,7820=>616,7821=>532,7822=>549,7823=>532,7824=>616,7825=>472,7826=>616, -7827=>472,7828=>616,7829=>472,7830=>570,7831=>353,7832=>736,7833=>532,7834=>551,7835=>316,7838=>691, -7839=>550,7840=>615,7841=>551,7842=>615,7843=>551,7844=>615,7845=>551,7846=>615,7847=>551,7848=>615, -7849=>551,7850=>615,7851=>551,7852=>615,7853=>551,7854=>615,7855=>551,7856=>615,7857=>551,7858=>615, -7859=>551,7860=>615,7861=>551,7862=>615,7863=>551,7864=>568,7865=>554,7866=>568,7867=>554,7868=>568, -7869=>554,7870=>568,7871=>554,7872=>568,7873=>554,7874=>568,7875=>554,7876=>568,7877=>554,7878=>568, -7879=>554,7880=>265,7881=>250,7882=>265,7883=>250,7884=>708,7885=>550,7886=>708,7887=>550,7888=>708, -7889=>550,7890=>708,7891=>550,7892=>708,7893=>550,7894=>708,7895=>550,7896=>708,7897=>550,7898=>822, -7899=>550,7900=>822,7901=>550,7902=>822,7903=>550,7904=>822,7905=>550,7906=>822,7907=>550,7908=>659, -7909=>570,7910=>659,7911=>570,7912=>772,7913=>570,7914=>772,7915=>570,7916=>772,7917=>570,7918=>772, -7919=>570,7920=>772,7921=>570,7922=>549,7923=>532,7924=>549,7925=>532,7926=>549,7927=>532,7928=>549, -7929=>532,7936=>593,7937=>593,7938=>593,7939=>593,7940=>593,7941=>593,7942=>593,7943=>593,7944=>615, -7945=>615,7946=>790,7947=>790,7948=>692,7949=>721,7950=>637,7951=>668,7952=>486,7953=>486,7954=>486, -7955=>486,7956=>486,7957=>486,7960=>640,7961=>640,7962=>869,7963=>877,7964=>809,7965=>835,7968=>570, -7969=>570,7970=>570,7971=>570,7972=>570,7973=>570,7974=>570,7975=>570,7976=>753,7977=>751,7978=>977, -7979=>980,7980=>924,7981=>945,7982=>840,7983=>852,7984=>304,7985=>304,7986=>304,7987=>304,7988=>304, -7989=>304,7990=>304,7991=>304,7992=>342,7993=>336,7994=>571,7995=>571,7996=>513,7997=>540,7998=>440, -7999=>443,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>724,8009=>763,8010=>985, -8011=>989,8012=>844,8013=>873,8016=>521,8017=>521,8018=>521,8019=>521,8020=>521,8021=>521,8022=>521, -8023=>521,8025=>705,8027=>897,8029=>911,8031=>808,8032=>753,8033=>753,8034=>753,8035=>753,8036=>753, -8037=>753,8038=>753,8039=>753,8040=>722,8041=>759,8042=>980,8043=>985,8044=>851,8045=>875,8046=>829, -8047=>857,8048=>593,8049=>593,8050=>486,8051=>493,8052=>570,8053=>589,8054=>304,8055=>304,8056=>550, -8057=>550,8058=>521,8059=>521,8060=>753,8061=>753,8064=>593,8065=>593,8066=>593,8067=>593,8068=>593, -8069=>593,8070=>593,8071=>593,8072=>615,8073=>615,8074=>790,8075=>790,8076=>692,8077=>721,8078=>637, -8079=>668,8080=>570,8081=>570,8082=>570,8083=>570,8084=>570,8085=>570,8086=>570,8087=>570,8088=>753, -8089=>751,8090=>977,8091=>980,8092=>924,8093=>945,8094=>840,8095=>852,8096=>753,8097=>753,8098=>753, -8099=>753,8100=>753,8101=>753,8102=>753,8103=>753,8104=>722,8105=>759,8106=>980,8107=>985,8108=>851, -8109=>875,8110=>829,8111=>857,8112=>593,8113=>593,8114=>593,8115=>593,8116=>593,8118=>593,8119=>593, -8120=>615,8121=>615,8122=>645,8123=>623,8124=>615,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450, -8130=>570,8131=>570,8132=>589,8134=>570,8135=>570,8136=>724,8137=>671,8138=>837,8139=>784,8140=>677, -8141=>450,8142=>450,8143=>450,8144=>304,8145=>304,8146=>304,8147=>304,8150=>304,8151=>304,8152=>265, -8153=>265,8154=>427,8155=>367,8157=>450,8158=>450,8159=>450,8160=>521,8161=>521,8162=>521,8163=>521, -8164=>571,8165=>571,8166=>521,8167=>521,8168=>549,8169=>549,8170=>760,8171=>742,8172=>616,8173=>450, -8174=>450,8175=>450,8178=>753,8179=>753,8180=>753,8182=>753,8183=>753,8184=>847,8185=>731,8186=>830, -8187=>743,8188=>688,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225, -8198=>150,8199=>572,8200=>286,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, -8208=>325,8209=>325,8210=>572,8213=>900,8214=>450,8215=>450,8219=>286,8223=>466,8227=>531,8228=>301, -8229=>601,8231=>286,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8241=>1562,8242=>204, -8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305,8251=>754,8252=>437,8253=>478,8254=>450, -8255=>723,8256=>723,8257=>225,8258=>900,8259=>450,8260=>150,8261=>351,8262=>351,8263=>830,8264=>659, -8265=>659,8266=>447,8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8272=>723,8273=>450,8274=>404, -8275=>900,8276=>723,8277=>754,8278=>527,8279=>597,8280=>754,8281=>754,8282=>286,8283=>717,8284=>754, -8285=>286,8286=>286,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0, -8300=>0,8301=>0,8302=>0,8303=>0,8304=>360,8305=>161,8308=>360,8309=>360,8310=>360,8311=>360, -8312=>360,8313=>360,8314=>475,8315=>475,8316=>475,8317=>221,8318=>221,8319=>358,8320=>360,8321=>360, -8322=>360,8323=>360,8324=>360,8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475, -8332=>475,8333=>221,8334=>221,8336=>352,8337=>375,8338=>372,8339=>399,8340=>375,8352=>789,8353=>572, -8354=>572,8355=>572,8356=>572,8357=>876,8358=>673,8359=>1145,8360=>966,8361=>890,8362=>706,8363=>571, -8365=>572,8366=>572,8367=>1145,8368=>572,8369=>572,8370=>572,8371=>572,8372=>696,8373=>577,8400=>0, -8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>917,8449=>917,8450=>628,8451=>1011, -8452=>578,8453=>917,8454=>960,8455=>553,8456=>628,8457=>856,8459=>889,8460=>679,8461=>765,8462=>570, -8463=>570,8464=>422,8465=>627,8466=>648,8467=>372,8468=>736,8469=>721,8470=>936,8471=>900,8472=>627, -8473=>631,8474=>708,8475=>718,8476=>732,8477=>712,8478=>807,8479=>615,8480=>917,8481=>967,8483=>615, -8484=>670,8485=>520,8486=>688,8487=>688,8488=>554,8489=>304,8490=>590,8491=>615,8492=>708,8493=>633, -8494=>769,8495=>532,8496=>545,8497=>708,8498=>518,8499=>962,8500=>416,8501=>670,8502=>606,8503=>419, -8504=>580,8505=>342,8506=>833,8507=>1074,8508=>632,8509=>655,8510=>589,8511=>764,8512=>729,8513=>697, -8514=>501,8515=>501,8516=>549,8517=>737,8518=>637,8519=>554,8520=>316,8521=>316,8523=>702,8526=>474, -8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872,8539=>872,8540=>872, -8541=>872,8542=>872,8543=>511,8544=>265,8545=>443,8546=>620,8547=>831,8548=>615,8549=>830,8550=>1007, -8551=>1185,8552=>826,8553=>616,8554=>839,8555=>1018,8556=>501,8557=>628,8558=>693,8559=>776,8560=>250, -8561=>412,8562=>573,8563=>730,8564=>532,8565=>729,8566=>892,8567=>1053,8568=>737,8569=>532,8570=>740, -8571=>901,8572=>250,8573=>495,8574=>571,8575=>876,8576=>1121,8577=>693,8578=>1121,8579=>633,8580=>494, -8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754, -8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754, -8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754, -8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754, -8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754, -8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754, -8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754, -8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754, -8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754, -8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754, -8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754, -8702=>754,8703=>754,8704=>615,8705=>572,8706=>465,8707=>568,8708=>568,8709=>784,8710=>602,8711=>602, -8712=>784,8713=>784,8714=>646,8715=>784,8716=>784,8717=>646,8718=>572,8719=>681,8720=>681,8721=>606, -8722=>754,8723=>754,8724=>754,8725=>303,8726=>573,8727=>754,8728=>563,8729=>563,8730=>573,8731=>573, -8732=>573,8733=>643,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450,8740=>450,8741=>450, -8742=>450,8743=>659,8744=>659,8745=>659,8746=>659,8747=>469,8748=>710,8749=>951,8750=>469,8751=>710, -8752=>951,8753=>469,8754=>469,8755=>469,8756=>572,8757=>572,8758=>234,8759=>572,8760=>754,8761=>754, -8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754,8770=>754,8771=>754, -8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754,8780=>754,8781=>754, -8782=>754,8783=>754,8784=>754,8785=>754,8786=>755,8787=>755,8788=>900,8789=>900,8790=>754,8791=>754, -8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754,8800=>754,8801=>754, -8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>754,8809=>754,8810=>942,8811=>942, -8812=>417,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754,8820=>754,8821=>754, -8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754,8830=>754,8831=>754, -8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8840=>754,8841=>754, -8842=>754,8843=>754,8844=>659,8845=>659,8846=>659,8847=>754,8848=>754,8849=>754,8850=>754,8851=>702, -8852=>702,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754, -8862=>754,8863=>754,8864=>754,8865=>754,8866=>784,8867=>784,8868=>784,8869=>784,8870=>468,8871=>468, -8872=>784,8873=>784,8874=>784,8875=>784,8876=>784,8877=>784,8878=>784,8879=>784,8880=>754,8881=>754, -8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754,8890=>468,8891=>659, -8892=>659,8893=>659,8894=>754,8895=>754,8896=>738,8897=>738,8898=>738,8899=>738,8900=>444,8901=>286, -8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754,8910=>659,8911=>659, -8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754,8920=>1280,8921=>1280, -8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754,8930=>754,8931=>754, -8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754,8940=>754,8941=>754, -8942=>900,8943=>900,8944=>900,8945=>900,8946=>900,8947=>784,8948=>646,8949=>784,8950=>784,8951=>646, -8952=>784,8953=>784,8954=>900,8955=>784,8956=>646,8957=>784,8958=>646,8959=>784,8960=>542,8961=>542, -8962=>571,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>351,8969=>351,8970=>351,8971=>351, -8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>461,8984=>900,8985=>754,8988=>422,8989=>422, -8990=>422,8991=>422,8992=>469,8993=>469,8996=>1037,8997=>1037,8998=>1272,8999=>1037,9000=>1299,9003=>1272, -9004=>786,9075=>304,9076=>571,9077=>753,9082=>593,9085=>681,9095=>1037,9108=>786,9115=>450,9116=>450, -9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450, -9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>469,9166=>754,9167=>850, -9187=>786,9189=>692,9250=>571,9251=>571,9312=>807,9313=>807,9314=>807,9315=>807,9316=>807,9317=>807, -9318=>807,9319=>807,9320=>807,9321=>807,9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542, -9478=>542,9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542, -9488=>542,9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542, -9498=>542,9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542, -9508=>542,9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542, -9518=>542,9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542, -9528=>542,9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542, -9538=>542,9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542, -9548=>542,9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542, -9558=>542,9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542, -9568=>542,9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542, -9578=>542,9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542, -9588=>542,9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542, -9598=>542,9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692, -9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692, -9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692, -9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850, -9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495, -9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452, -9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452, -9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785, -9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474, -9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785, -9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850, -9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785, -9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692, -9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515,9736=>806,9737=>807, -9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807,9746=>807,9747=>479, -9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807,9756=>807,9757=>548, -9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671,9766=>584,9767=>705, -9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807,9776=>807,9777=>807, -9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807,9784=>807,9785=>807,9786=>807,9787=>807, -9788=>807,9789=>807,9790=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807,9796=>807,9797=>807, -9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807,9806=>807,9807=>807, -9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807,9816=>807,9817=>807, -9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807,9826=>807,9827=>807, -9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424, -9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807,9846=>807,9847=>807, -9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807,9856=>782,9857=>782, -9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807,9864=>807,9865=>807,9866=>807,9867=>807, -9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807,9874=>807,9875=>807,9876=>807,9877=>487, -9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807,9884=>807,9888=>807,9889=>632,9890=>903, -9891=>977,9892=>1028,9893=>811,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754,9899=>754,9900=>754, -9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>658,9907=>659,9908=>659,9909=>659,9910=>765, -9911=>659,9912=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754,9992=>754,9993=>754, -9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754,10004=>754,10005=>754, -10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754,10014=>754,10015=>754, -10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754,10025=>754,10026=>754, -10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754,10035=>754,10036=>754, -10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754,10045=>754,10046=>754, -10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754,10055=>754,10056=>754, -10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807,10070=>807,10072=>754, -10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484,10081=>754,10082=>754,10083=>754,10084=>754, -10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754,10093=>754,10094=>754, -10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>807,10103=>807,10104=>807, -10105=>807,10106=>807,10107=>807,10108=>807,10109=>807,10110=>807,10111=>807,10112=>754,10113=>754,10114=>754, -10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754,10123=>754,10124=>754, -10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754,10136=>754,10137=>754, -10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754,10146=>754,10147=>754, -10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754,10156=>754,10157=>754, -10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754,10167=>754,10168=>754, -10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>351,10182=>351,10208=>444,10214=>445, -10215=>445,10216=>351,10217=>351,10218=>500,10219=>500,10224=>754,10225=>754,10226=>754,10227=>754,10228=>1042, -10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290, -10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659, -10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659, -10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659, -10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659, -10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659, -10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659, -10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659, -10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659, -10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659, -10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659, -10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659, -10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659, -10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659, -10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659, -10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659, -10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659, -10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659, -10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659, -10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659, -10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659, -10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659, -10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659, -10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659, -10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659, -10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659, -10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10502=>754,10503=>754,10506=>754, -10507=>754,10560=>615,10561=>615,10627=>660,10628=>660,10702=>754,10703=>900,10704=>900,10705=>900,10706=>900, -10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900,10754=>900,10764=>1192, -10765=>469,10766=>469,10767=>469,10768=>469,10769=>469,10770=>469,10771=>469,10772=>469,10773=>469,10774=>469, -10775=>469,10776=>469,10777=>469,10778=>469,10779=>469,10780=>469,10799=>754,10877=>754,10878=>754,10879=>754, -10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754,10888=>754,10889=>754, -10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754,10898=>754,10899=>754, -10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754,10908=>754,10909=>754, -10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754,10931=>754,10932=>754, -10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754,11008=>754,11009=>754, -11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754, -11020=>754,11021=>754,11022=>752,11023=>752,11024=>752,11025=>752,11026=>850,11027=>850,11028=>850,11029=>850, -11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786,11042=>786,11043=>786, -11044=>1007,11091=>782,11092=>782,11360=>501,11361=>250,11362=>501,11363=>542,11364=>625,11365=>551,11366=>353, -11367=>677,11368=>570,11369=>590,11370=>521,11371=>616,11372=>472,11373=>703,11374=>776,11375=>615,11377=>661, -11378=>1015,11379=>865,11380=>532,11381=>589,11382=>511,11383=>593,11385=>373,11386=>550,11387=>441,11388=>157, -11389=>387,11568=>582,11569=>799,11570=>799,11571=>614,11572=>615,11573=>571,11574=>505,11575=>615,11576=>615, -11577=>568,11578=>568,11579=>614,11580=>787,11581=>616,11582=>441,11583=>616,11584=>799,11585=>799,11586=>270, -11587=>564,11588=>677,11589=>590,11590=>475,11591=>616,11592=>580,11593=>568,11594=>452,11595=>857,11596=>700, -11597=>673,11598=>558,11599=>265,11600=>700,11601=>265,11602=>677,11603=>569,11604=>799,11605=>799,11606=>677, -11607=>288,11608=>674,11609=>799,11610=>799,11611=>628,11612=>690,11613=>616,11614=>628,11615=>560,11616=>615, -11617=>677,11618=>568,11619=>709,11620=>510,11621=>709,11631=>463,11800=>478,11810=>351,11811=>351,11812=>351, -11813=>351,11822=>478,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807, -19912=>807,19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807, -19922=>807,19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807, -19932=>807,19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807, -19942=>807,19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807, -19952=>807,19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807, -19962=>807,19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>571,42565=>469,42566=>318,42567=>304, -42572=>1062,42573=>925,42576=>926,42577=>815,42580=>971,42581=>757,42582=>879,42583=>758,42594=>956,42595=>820, -42596=>959,42597=>811,42598=>1060,42599=>907,42600=>708,42601=>550,42602=>770,42603=>641,42604=>1222,42605=>917, -42606=>791,42634=>704,42635=>616,42636=>549,42637=>524,42644=>617,42645=>570,42760=>444,42761=>444,42762=>444, -42763=>444,42764=>444,42765=>444,42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444, -42773=>444,42774=>444,42779=>332,42780=>332,42781=>227,42782=>227,42783=>227,42790=>677,42791=>570,42792=>790, -42793=>638,42794=>553,42795=>486,42800=>441,42801=>469,42802=>1125,42803=>886,42804=>1083,42805=>891,42806=>1028, -42807=>883,42808=>874,42809=>736,42810=>874,42811=>736,42812=>863,42813=>736,42814=>633,42815=>494,42822=>612, -42823=>353,42824=>523,42825=>384,42826=>726,42827=>633,42830=>1222,42831=>917,42880=>501,42881=>250,42882=>662, -42883=>570,42889=>303,42890=>338,42891=>360,42892=>247,43003=>518,43004=>542,43005=>776,43006=>265,43007=>1079, -61440=>879,61441=>879,63173=>550,64256=>620,64257=>567,64258=>567,64259=>870,64260=>870,64261=>617,64262=>774, -64275=>1081,64276=>1081,64277=>1076,64278=>1067,64279=>1376,64285=>245,64286=>0,64287=>423,64288=>572,64289=>770, -64290=>696,64291=>815,64292=>694,64293=>759,64294=>769,64295=>726,64296=>788,64297=>754,64298=>727,64299=>727, -64300=>727,64301=>727,64302=>566,64303=>566,64304=>566,64305=>547,64306=>403,64307=>534,64308=>576,64309=>245, -64310=>336,64312=>583,64313=>302,64314=>532,64315=>500,64316=>539,64318=>593,64320=>397,64321=>629,64323=>576, -64324=>543,64326=>523,64327=>596,64328=>532,64329=>727,64330=>591,64331=>245,64332=>547,64333=>500,64334=>543, -64335=>566,64338=>847,64339=>883,64340=>250,64341=>271,64342=>847,64343=>883,64344=>250,64345=>271,64346=>847, -64347=>883,64348=>250,64349=>271,64350=>847,64351=>883,64352=>250,64353=>271,64354=>847,64355=>883,64356=>250, -64357=>271,64358=>847,64359=>883,64360=>250,64361=>271,64362=>933,64363=>932,64364=>430,64365=>455,64366=>933, -64367=>932,64368=>430,64369=>455,64370=>581,64371=>581,64372=>556,64373=>581,64374=>581,64375=>581,64376=>556, -64377=>581,64378=>581,64379=>581,64380=>556,64381=>581,64382=>581,64383=>581,64384=>556,64385=>581,64394=>435, -64395=>497,64396=>435,64397=>497,64398=>805,64399=>805,64400=>428,64401=>497,64402=>805,64403=>805,64404=>428, -64405=>497,64414=>661,64415=>685,64473=>435,64474=>465,64488=>250,64489=>271,64508=>704,64509=>750,64510=>250, -64511=>271,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, -65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0, -65059=>0,65136=>264,65137=>264,65138=>264,65139=>235,65140=>264,65142=>264,65143=>264,65144=>264,65145=>264, -65146=>264,65147=>264,65148=>264,65149=>264,65150=>264,65151=>264,65152=>423,65153=>250,65154=>274,65155=>250, -65156=>274,65157=>435,65158=>465,65159=>250,65160=>274,65161=>704,65162=>750,65163=>250,65164=>271,65165=>250, -65166=>274,65167=>847,65168=>883,65169=>250,65170=>271,65171=>471,65172=>482,65173=>847,65174=>883,65175=>250, -65176=>271,65177=>847,65178=>883,65179=>250,65180=>271,65181=>581,65182=>581,65183=>556,65184=>581,65185=>581, -65186=>581,65187=>556,65188=>581,65189=>581,65190=>581,65191=>556,65192=>581,65193=>400,65194=>472,65195=>400, -65196=>472,65197=>435,65198=>497,65199=>435,65200=>497,65201=>1099,65202=>1147,65203=>754,65204=>803,65205=>1099, -65206=>1147,65207=>754,65208=>803,65209=>1088,65210=>1103,65211=>764,65212=>780,65213=>1088,65214=>1103,65215=>764, -65216=>780,65217=>832,65218=>854,65219=>716,65220=>738,65221=>832,65222=>854,65223=>716,65224=>738,65225=>537, -65226=>479,65227=>537,65228=>434,65229=>537,65230=>479,65231=>470,65232=>434,65233=>933,65234=>932,65235=>430, -65236=>455,65237=>698,65238=>750,65239=>430,65240=>455,65241=>742,65242=>758,65243=>428,65244=>497,65245=>654, -65246=>681,65247=>274,65248=>298,65249=>557,65250=>599,65251=>482,65252=>520,65253=>661,65254=>685,65255=>250, -65256=>271,65257=>471,65258=>482,65259=>475,65260=>415,65261=>435,65262=>465,65263=>704,65264=>750,65265=>704, -65266=>750,65267=>250,65268=>271,65269=>513,65270=>537,65271=>513,65272=>537,65273=>513,65274=>537,65275=>513, -65276=>537,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>923); -$enc=''; -$diff=''; -$file='dejavusanscondensed.z'; -$ctg='dejavusanscondensed.ctg.z'; -$originalsize=544636; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.z deleted file mode 100644 index 8198081c..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensed.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.ctg.z deleted file mode 100644 index 514062cc..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.php deleted file mode 100644 index f53d0a6b..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.php +++ /dev/null @@ -1,504 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>17,'Flags'=>32,'FontBBox'=>'[-962 -385 1777 1174]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>540); -$up=-63; -$ut=44; -$dw=540; -$cw=array( -0=>540,32=>313,33=>410,34=>469,35=>754,36=>626,37=>901,38=>785,39=>275,40=>411, -41=>411,42=>470,43=>754,44=>342,45=>374,46=>342,47=>329,48=>626,49=>626,50=>626, -51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>360,59=>360,60=>754, -61=>754,62=>754,63=>522,64=>900,65=>696,66=>686,67=>660,68=>747,69=>615,70=>615, -71=>738,72=>753,73=>334,74=>334,75=>697,76=>573,77=>896,78=>753,79=>765,80=>659, -81=>765,82=>693,83=>648,84=>614,85=>730,86=>696,87=>993,88=>694,89=>651,90=>652, -91=>411,92=>329,93=>411,94=>754,95=>450,96=>450,97=>607,98=>644,99=>533,100=>644, -101=>610,102=>391,103=>644,104=>641,105=>308,106=>308,107=>598,108=>308,109=>938,110=>641, -111=>618,112=>644,113=>644,114=>444,115=>536,116=>430,117=>641,118=>586,119=>831,120=>580, -121=>586,122=>523,123=>641,124=>329,125=>641,126=>754,8364=>626,8218=>342,402=>391,8222=>591, -8230=>900,8224=>450,8225=>450,710=>450,8240=>1296,352=>648,8249=>371,338=>1050,381=>652,8216=>342, -8217=>342,8220=>591,8221=>591,8226=>575,8211=>450,8212=>900,732=>450,8482=>900,353=>536,8250=>371, -339=>984,382=>523,376=>651,160=>313,161=>410,162=>626,163=>626,164=>572,165=>626,166=>329, -167=>450,168=>450,169=>900,170=>507,171=>581,172=>754,173=>374,174=>900,175=>450,176=>450, -177=>754,178=>394,179=>394,180=>450,181=>662,182=>572,183=>342,184=>450,185=>394,186=>507, -187=>581,188=>932,189=>932,190=>932,191=>522,192=>696,193=>696,194=>696,195=>696,196=>696, -197=>696,198=>976,199=>660,200=>615,201=>615,202=>615,203=>615,204=>334,205=>334,206=>334, -207=>334,208=>754,209=>753,210=>765,211=>765,212=>765,213=>765,214=>765,215=>754,216=>765, -217=>730,218=>730,219=>730,220=>730,221=>651,222=>664,223=>647,224=>607,225=>607,226=>607, -227=>607,228=>607,229=>607,230=>943,231=>533,232=>610,233=>610,234=>610,235=>610,236=>308, -237=>308,238=>308,239=>308,240=>618,241=>641,242=>618,243=>618,244=>618,245=>618,246=>618, -247=>754,248=>618,249=>641,250=>641,251=>641,252=>641,253=>586,254=>644,255=>586,256=>696, -257=>607,258=>696,259=>607,260=>696,261=>607,262=>660,263=>533,264=>660,265=>533,266=>660, -267=>533,268=>660,269=>533,270=>747,271=>644,272=>754,273=>644,274=>615,275=>610,276=>615, -277=>610,278=>615,279=>610,280=>615,281=>610,282=>615,283=>610,284=>738,285=>644,286=>738, -287=>644,288=>738,289=>644,290=>738,291=>644,292=>753,293=>641,294=>876,295=>711,296=>334, -297=>308,298=>334,299=>308,300=>334,301=>308,302=>334,303=>308,304=>334,305=>308,306=>669, -307=>617,308=>334,309=>308,310=>697,311=>598,312=>598,313=>573,314=>308,315=>573,316=>308, -317=>573,318=>431,319=>573,320=>501,321=>578,322=>334,323=>753,324=>641,325=>753,326=>641, -327=>753,328=>641,329=>884,330=>753,331=>641,332=>765,333=>618,334=>765,335=>618,336=>765, -337=>618,340=>693,341=>444,342=>693,343=>444,344=>693,345=>444,346=>648,347=>536,348=>648, -349=>536,350=>648,351=>536,354=>614,355=>430,356=>614,357=>430,358=>614,359=>430,360=>730, -361=>641,362=>730,363=>641,364=>730,365=>641,366=>730,367=>641,368=>730,369=>641,370=>730, -371=>641,372=>993,373=>831,374=>651,375=>586,377=>652,378=>523,379=>652,380=>523,383=>391, -384=>644,385=>729,386=>686,387=>644,388=>686,389=>644,390=>660,391=>660,392=>533,393=>754, -394=>791,395=>681,396=>644,397=>619,398=>615,399=>764,400=>626,401=>615,403=>738,404=>713, -405=>940,406=>392,407=>350,408=>697,409=>598,410=>324,411=>532,412=>938,413=>753,414=>641, -415=>765,416=>786,417=>618,418=>974,419=>821,420=>703,421=>644,422=>693,423=>648,424=>536, -425=>615,426=>497,427=>430,428=>636,429=>430,430=>614,431=>751,432=>641,433=>765,434=>732, -435=>717,436=>700,437=>652,438=>523,439=>695,440=>695,441=>576,442=>523,443=>626,444=>695, -445=>576,446=>515,447=>644,448=>334,449=>593,450=>489,451=>334,452=>1399,453=>1271,454=>1168, -455=>908,456=>882,457=>617,458=>1088,459=>1062,460=>949,461=>696,462=>607,463=>334,464=>308, -465=>765,466=>618,467=>730,468=>641,469=>730,470=>641,471=>730,472=>641,473=>730,474=>641, -475=>730,476=>641,477=>610,478=>696,479=>607,480=>696,481=>607,482=>976,483=>943,484=>738, -485=>644,486=>738,487=>644,488=>697,489=>598,490=>765,491=>618,492=>765,493=>618,494=>695, -495=>523,496=>308,497=>1399,498=>1271,499=>1168,500=>738,501=>644,502=>1160,503=>708,504=>753, -505=>641,506=>696,507=>607,508=>976,509=>943,510=>765,511=>618,512=>696,513=>607,514=>696, -515=>607,516=>615,517=>610,518=>615,519=>610,520=>334,521=>308,522=>334,523=>308,524=>765, -525=>618,526=>765,527=>618,528=>693,529=>444,530=>693,531=>444,532=>730,533=>641,534=>730, -535=>641,536=>648,537=>536,538=>614,539=>430,540=>621,541=>546,542=>753,543=>641,544=>753, -545=>778,546=>728,547=>593,548=>652,549=>523,550=>696,551=>607,552=>615,553=>610,554=>765, -555=>618,556=>765,557=>618,558=>765,559=>618,560=>765,561=>618,562=>651,563=>586,564=>442, -565=>780,566=>460,567=>308,568=>979,569=>979,570=>696,571=>660,572=>533,573=>573,574=>614, -575=>536,576=>523,577=>703,578=>553,579=>686,580=>730,581=>696,582=>615,583=>610,584=>334, -585=>308,586=>774,587=>712,588=>693,589=>444,590=>651,591=>586,592=>607,593=>644,594=>644, -595=>644,596=>533,597=>533,598=>645,599=>712,600=>610,601=>610,602=>788,603=>501,604=>490, -605=>733,606=>658,607=>308,608=>712,609=>644,610=>564,611=>579,612=>571,613=>641,614=>641, -615=>641,616=>491,617=>396,618=>491,619=>502,620=>624,621=>308,622=>757,623=>938,624=>938, -625=>938,626=>641,627=>713,628=>636,629=>618,630=>817,631=>613,632=>716,633=>484,634=>484, -635=>584,636=>444,637=>444,638=>536,639=>536,640=>578,641=>578,642=>536,643=>374,644=>391, -645=>544,646=>497,647=>430,648=>430,649=>828,650=>695,651=>603,652=>586,653=>831,654=>586, -655=>651,656=>624,657=>615,658=>576,659=>576,660=>515,661=>515,662=>515,663=>515,664=>765, -665=>569,666=>658,667=>616,668=>622,669=>308,670=>659,671=>485,672=>712,673=>515,674=>515, -675=>1040,676=>1093,677=>1039,678=>876,679=>691,680=>836,681=>923,682=>712,683=>702,684=>532, -685=>374,686=>609,687=>710,688=>410,689=>410,690=>197,691=>284,692=>284,693=>284,694=>369, -695=>532,696=>375,697=>271,698=>469,699=>342,700=>342,701=>342,702=>330,703=>330,704=>293, -705=>293,706=>450,707=>450,708=>450,709=>450,711=>450,712=>275,713=>450,714=>450,715=>450, -716=>275,717=>450,718=>450,719=>450,720=>303,721=>303,722=>330,723=>330,724=>450,725=>450, -726=>374,727=>295,728=>450,729=>450,730=>450,731=>450,733=>450,734=>315,735=>450,736=>370, -737=>197,738=>343,739=>371,740=>293,741=>450,742=>450,743=>450,744=>450,745=>450,748=>450, -749=>450,750=>591,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, -774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, -784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, -794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, -844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, -860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>628,881=>508,882=>919, -883=>752,884=>271,885=>271,886=>753,887=>630,890=>450,891=>533,892=>495,893=>494,894=>360, -900=>397,901=>450,902=>717,903=>342,904=>761,905=>908,906=>507,908=>801,910=>882,911=>804, -912=>351,913=>696,914=>686,915=>573,916=>696,917=>615,918=>652,919=>753,920=>765,921=>334, -922=>697,923=>696,924=>896,925=>753,926=>568,927=>765,928=>753,929=>659,931=>615,932=>614, -933=>651,934=>765,935=>694,936=>765,937=>765,938=>334,939=>651,940=>618,941=>501,942=>641, -943=>351,944=>607,945=>618,946=>644,947=>613,948=>618,949=>501,950=>532,951=>641,952=>618, -953=>351,954=>639,955=>569,956=>662,957=>613,958=>532,959=>618,960=>712,961=>644,962=>533, -963=>701,964=>574,965=>607,966=>704,967=>580,968=>714,969=>782,970=>351,971=>607,972=>618, -973=>607,974=>782,975=>697,976=>585,977=>594,978=>671,979=>883,980=>671,981=>716,982=>782, -983=>669,984=>765,985=>618,986=>660,987=>533,988=>615,989=>444,990=>632,991=>593,992=>827, -993=>564,994=>983,995=>753,996=>749,997=>644,998=>835,999=>669,1000=>660,1001=>585,1002=>709, -1003=>604,1004=>677,1005=>644,1006=>614,1007=>531,1008=>669,1009=>644,1010=>533,1011=>308,1012=>765, -1013=>580,1014=>580,1015=>664,1016=>644,1017=>660,1018=>896,1019=>659,1020=>644,1021=>628,1022=>660, -1023=>628,1024=>615,1025=>615,1026=>791,1027=>573,1028=>660,1029=>648,1030=>334,1031=>334,1032=>334, -1033=>1039,1034=>1017,1035=>791,1036=>735,1037=>753,1038=>694,1039=>753,1040=>696,1041=>686,1042=>686, -1043=>573,1044=>801,1045=>615,1046=>1102,1047=>639,1048=>753,1049=>753,1050=>735,1051=>747,1052=>896, -1053=>753,1054=>765,1055=>753,1056=>659,1057=>660,1058=>614,1059=>694,1060=>892,1061=>694,1062=>835, -1063=>727,1064=>1112,1065=>1193,1066=>845,1067=>932,1068=>686,1069=>660,1070=>1056,1071=>693,1072=>607, -1073=>628,1074=>569,1075=>470,1076=>727,1077=>610,1078=>896,1079=>523,1080=>630,1081=>630,1082=>611, -1083=>659,1084=>735,1085=>622,1086=>618,1087=>622,1088=>644,1089=>533,1090=>521,1091=>586,1092=>893, -1093=>580,1094=>667,1095=>618,1096=>956,1097=>995,1098=>676,1099=>813,1100=>569,1101=>533,1102=>875, -1103=>578,1104=>610,1105=>610,1106=>642,1107=>470,1108=>533,1109=>536,1110=>308,1111=>308,1112=>308, -1113=>892,1114=>860,1115=>661,1116=>611,1117=>630,1118=>586,1119=>622,1120=>983,1121=>782,1122=>756, -1123=>662,1124=>911,1125=>755,1126=>893,1127=>749,1128=>1222,1129=>1009,1130=>765,1131=>618,1132=>1112, -1133=>906,1134=>626,1135=>501,1136=>967,1137=>955,1138=>765,1139=>618,1140=>765,1141=>625,1142=>765, -1143=>625,1144=>1033,1145=>939,1146=>967,1147=>776,1148=>1265,1149=>1055,1150=>983,1151=>782,1152=>660, -1153=>533,1154=>587,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>861, -1163=>726,1164=>686,1165=>550,1166=>659,1167=>644,1168=>573,1169=>470,1170=>599,1171=>488,1172=>727, -1173=>602,1174=>1102,1175=>896,1176=>639,1177=>523,1178=>697,1179=>611,1180=>735,1181=>611,1182=>735, -1183=>611,1184=>914,1185=>743,1186=>860,1187=>727,1188=>992,1189=>787,1190=>1146,1191=>915,1192=>856, -1193=>772,1194=>660,1195=>533,1196=>614,1197=>521,1198=>651,1199=>586,1200=>651,1201=>586,1202=>694, -1203=>580,1204=>1001,1205=>900,1206=>727,1207=>618,1208=>727,1209=>618,1210=>727,1211=>641,1212=>923, -1213=>729,1214=>923,1215=>729,1216=>334,1217=>1102,1218=>896,1219=>697,1220=>567,1221=>855,1222=>725, -1223=>753,1224=>622,1225=>861,1226=>726,1227=>727,1228=>618,1229=>1003,1230=>839,1231=>308,1232=>696, -1233=>607,1234=>696,1235=>607,1236=>976,1237=>943,1238=>615,1239=>610,1240=>764,1241=>610,1242=>764, -1243=>610,1244=>1102,1245=>896,1246=>639,1247=>523,1248=>695,1249=>576,1250=>753,1251=>630,1252=>753, -1253=>630,1254=>765,1255=>618,1256=>765,1257=>618,1258=>765,1259=>618,1260=>660,1261=>533,1262=>694, -1263=>586,1264=>694,1265=>586,1266=>694,1267=>586,1268=>727,1269=>618,1270=>573,1271=>470,1272=>932, -1273=>813,1274=>599,1275=>488,1276=>694,1277=>580,1278=>694,1279=>580,1280=>686,1281=>547,1282=>1043, -1283=>804,1284=>1007,1285=>828,1286=>745,1287=>624,1288=>1117,1289=>915,1290=>1160,1291=>912,1292=>755, -1293=>574,1294=>844,1295=>722,1296=>626,1297=>501,1298=>747,1299=>659,1300=>1157,1301=>961,1302=>958, -1303=>881,1304=>973,1305=>912,1306=>765,1307=>644,1308=>993,1309=>831,1312=>1140,1313=>953,1314=>1146, -1315=>915,1316=>861,1317=>726,1329=>886,1330=>730,1331=>886,1332=>886,1333=>730,1334=>699,1335=>730, -1336=>730,1337=>877,1338=>886,1339=>730,1340=>639,1341=>970,1342=>1022,1343=>730,1344=>639,1345=>681, -1346=>886,1347=>789,1348=>886,1349=>714,1350=>886,1351=>730,1352=>730,1353=>730,1354=>862,1355=>699, -1356=>886,1357=>730,1358=>886,1359=>648,1360=>730,1361=>714,1362=>805,1363=>765,1364=>842,1365=>765, -1366=>648,1369=>330,1370=>342,1371=>495,1372=>495,1373=>342,1374=>491,1375=>468,1377=>938,1378=>641, -1379=>779,1380=>781,1381=>641,1382=>735,1383=>588,1384=>641,1385=>729,1386=>735,1387=>641,1388=>448, -1389=>916,1390=>644,1391=>641,1392=>641,1393=>644,1394=>737,1395=>641,1396=>676,1397=>308,1398=>794, -1399=>502,1400=>641,1401=>502,1402=>938,1403=>502,1404=>777,1405=>641,1406=>732,1407=>938,1408=>641, -1409=>644,1410=>514,1411=>938,1412=>700,1413=>618,1414=>648,1415=>776,1417=>360,1418=>438,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>374,1471=>0,1472=>334,1473=>0,1474=>0,1475=>334,1478=>447, -1479=>0,1488=>676,1489=>605,1490=>483,1491=>589,1492=>641,1493=>308,1494=>442,1495=>641,1496=>651, -1497=>308,1498=>584,1499=>584,1500=>611,1501=>641,1502=>698,1503=>308,1504=>447,1505=>696,1506=>610, -1507=>646,1508=>618,1509=>565,1510=>676,1511=>656,1512=>584,1513=>854,1514=>676,1520=>598,1521=>598, -1522=>597,1523=>399,1524=>639,1542=>600,1543=>600,1545=>795,1546=>1042,1548=>342,1557=>0,1563=>360, -1567=>522,1569=>460,1570=>308,1571=>308,1572=>559,1573=>308,1574=>825,1575=>308,1576=>904,1577=>531, -1578=>904,1579=>904,1580=>648,1581=>648,1582=>648,1583=>461,1584=>461,1585=>518,1586=>518,1587=>1242, -1588=>1242,1589=>1210,1590=>1210,1591=>935,1592=>935,1593=>615,1594=>615,1600=>308,1601=>1045,1602=>804, -1603=>825,1604=>781,1605=>659,1606=>768,1607=>531,1608=>559,1609=>825,1610=>825,1611=>0,1612=>0, -1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1626=>450, -1632=>549,1633=>549,1634=>549,1635=>549,1636=>549,1637=>549,1638=>549,1639=>549,1640=>549,1641=>549, -1642=>549,1643=>336,1644=>342,1645=>490,1646=>904,1647=>804,1652=>263,1657=>904,1658=>904,1659=>904, -1660=>904,1661=>904,1662=>904,1663=>904,1664=>904,1665=>648,1666=>648,1667=>648,1668=>648,1669=>648, -1670=>648,1671=>648,1681=>518,1682=>518,1685=>613,1688=>518,1697=>1045,1700=>1045,1702=>1045,1705=>921, -1711=>921,1717=>781,1722=>768,1727=>648,1734=>559,1740=>825,1742=>825,1749=>531,1776=>549,1777=>549, -1778=>549,1779=>549,1780=>549,1781=>549,1782=>549,1783=>549,1784=>549,1785=>549,1984=>626,1985=>626, -1986=>626,1987=>626,1988=>626,1989=>626,1990=>626,1991=>626,1992=>626,1993=>626,1994=>308,1995=>492, -1996=>489,1997=>586,1998=>622,1999=>622,2000=>534,2001=>622,2002=>813,2003=>496,2004=>496,2005=>564, -2006=>619,2007=>399,2008=>920,2009=>456,2010=>743,2011=>622,2012=>586,2013=>821,2014=>564,2015=>636, -2016=>456,2017=>586,2018=>517,2019=>564,2020=>564,2021=>564,2022=>517,2023=>517,2027=>0,2028=>0, -2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>342,2037=>342,2040=>622, -2041=>622,2042=>374,3647=>668,3713=>710,3714=>673,3716=>674,3719=>512,3720=>668,3722=>669,3725=>685, -3732=>635,3733=>633,3734=>672,3735=>737,3737=>657,3738=>654,3739=>654,3740=>830,3741=>744,3742=>779, -3743=>779,3745=>752,3746=>685,3747=>692,3749=>691,3751=>642,3754=>744,3755=>928,3757=>651,3758=>705, -3759=>840,3760=>620,3761=>0,3762=>549,3763=>549,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0, -3769=>0,3771=>0,3772=>0,3773=>603,3776=>464,3777=>774,3778=>464,3779=>584,3780=>569,3782=>683, -3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>694,3793=>694,3794=>624,3795=>752, -3796=>655,3797=>655,3798=>764,3799=>710,3800=>683,3801=>818,3804=>1227,3805=>1227,4256=>826,4257=>669, -4258=>665,4259=>753,4260=>584,4261=>696,4262=>771,4263=>800,4264=>477,4265=>570,4266=>771,4267=>810, -4268=>579,4269=>813,4270=>732,4271=>677,4272=>782,4273=>579,4274=>579,4275=>797,4276=>797,4277=>660, -4278=>587,4279=>579,4280=>582,4281=>579,4282=>710,4283=>812,4284=>570,4285=>557,4286=>579,4287=>700, -4288=>802,4289=>541,4290=>668,4291=>554,4292=>570,4293=>668,4304=>497,4305=>497,4306=>536,4307=>734, -4308=>505,4309=>506,4310=>497,4311=>744,4312=>497,4313=>488,4314=>967,4315=>506,4316=>507,4317=>730, -4318=>497,4319=>532,4320=>740,4321=>506,4322=>621,4323=>525,4324=>732,4325=>505,4326=>731,4327=>506, -4328=>506,4329=>507,4330=>568,4331=>506,4332=>506,4333=>497,4334=>506,4335=>506,4336=>501,4337=>543, -4338=>497,4339=>497,4340=>497,4341=>544,4342=>767,4343=>571,4344=>506,4345=>536,4346=>487,4347=>615, -4348=>331,5121=>696,5122=>696,5123=>696,5124=>696,5125=>814,5126=>814,5127=>814,5129=>814,5130=>814, -5131=>814,5132=>916,5133=>908,5134=>916,5135=>908,5136=>916,5137=>908,5138=>1034,5139=>1025,5140=>1034, -5141=>1025,5142=>814,5143=>1034,5144=>1028,5145=>1034,5146=>1028,5147=>814,5149=>278,5150=>476,5151=>382, -5152=>382,5153=>355,5154=>355,5155=>355,5156=>355,5157=>507,5158=>423,5159=>278,5160=>355,5161=>355, -5162=>355,5163=>1092,5164=>888,5165=>1094,5166=>1167,5167=>696,5168=>696,5169=>696,5170=>696,5171=>797, -5172=>797,5173=>797,5175=>797,5176=>797,5177=>797,5178=>916,5179=>908,5180=>916,5181=>908,5182=>916, -5183=>908,5184=>1034,5185=>1025,5186=>1034,5187=>1025,5188=>1034,5189=>1028,5190=>1034,5191=>1028,5192=>797, -5193=>518,5194=>206,5196=>730,5197=>730,5198=>730,5199=>730,5200=>734,5201=>734,5202=>734,5204=>734, -5205=>734,5206=>734,5207=>950,5208=>943,5209=>950,5210=>943,5211=>950,5212=>943,5213=>954,5214=>949, -5215=>954,5216=>949,5217=>954,5218=>946,5219=>954,5220=>946,5221=>954,5222=>435,5223=>904,5224=>904, -5225=>921,5226=>915,5227=>668,5228=>668,5229=>668,5230=>668,5231=>668,5232=>668,5233=>668,5234=>668, -5235=>668,5236=>926,5237=>877,5238=>882,5239=>877,5240=>882,5241=>877,5242=>926,5243=>877,5244=>926, -5245=>877,5246=>882,5247=>877,5248=>882,5249=>877,5250=>882,5251=>451,5252=>451,5253=>844,5254=>844, -5255=>844,5256=>844,5257=>668,5258=>668,5259=>668,5260=>668,5261=>668,5262=>668,5263=>668,5264=>668, -5265=>668,5266=>926,5267=>877,5268=>926,5269=>877,5270=>926,5271=>877,5272=>926,5273=>877,5274=>926, -5275=>877,5276=>926,5277=>877,5278=>926,5279=>877,5280=>926,5281=>451,5282=>451,5283=>563,5284=>563, -5285=>563,5286=>563,5287=>563,5288=>563,5289=>563,5290=>563,5291=>563,5292=>793,5293=>769,5294=>777, -5295=>786,5296=>777,5297=>786,5298=>793,5299=>786,5300=>793,5301=>786,5302=>777,5303=>786,5304=>777, -5305=>786,5306=>777,5307=>392,5308=>493,5309=>392,5312=>889,5313=>889,5314=>889,5315=>889,5316=>838, -5317=>838,5318=>838,5319=>838,5320=>838,5321=>1114,5322=>1122,5323=>1080,5324=>1105,5325=>1080,5326=>1105, -5327=>838,5328=>593,5329=>447,5330=>593,5331=>889,5332=>889,5333=>889,5334=>889,5335=>838,5336=>838, -5337=>838,5338=>838,5339=>838,5340=>1107,5341=>1122,5342=>1155,5343=>1105,5344=>1155,5345=>1105,5346=>1105, -5347=>1093,5348=>1105,5349=>1093,5350=>1155,5351=>1105,5352=>1155,5353=>1105,5354=>593,5356=>797,5357=>657, -5358=>657,5359=>657,5360=>657,5361=>657,5362=>657,5363=>657,5364=>657,5365=>657,5366=>897,5367=>862, -5368=>870,5369=>890,5370=>870,5371=>890,5372=>897,5373=>862,5374=>897,5375=>862,5376=>870,5377=>890, -5378=>870,5379=>890,5380=>870,5381=>443,5382=>414,5383=>443,5392=>831,5393=>831,5394=>831,5395=>1022, -5396=>1022,5397=>1022,5398=>1022,5399=>1088,5400=>1081,5401=>1088,5402=>1081,5403=>1088,5404=>1081,5405=>1288, -5406=>1278,5407=>1288,5408=>1278,5409=>1288,5410=>1278,5411=>1288,5412=>1278,5413=>671,5414=>698,5415=>698, -5416=>698,5417=>698,5418=>698,5419=>698,5420=>698,5421=>698,5422=>698,5423=>902,5424=>903,5425=>911, -5426=>896,5427=>911,5428=>896,5429=>902,5430=>903,5431=>902,5432=>903,5433=>911,5434=>896,5435=>911, -5436=>896,5437=>911,5438=>445,5440=>355,5441=>458,5442=>929,5443=>929,5444=>878,5445=>878,5446=>878, -5447=>878,5448=>659,5449=>659,5450=>659,5451=>659,5452=>659,5453=>659,5454=>902,5455=>863,5456=>445, -5458=>797,5459=>696,5460=>696,5461=>696,5462=>696,5463=>835,5464=>835,5465=>835,5466=>835,5467=>1055, -5468=>1028,5469=>542,5470=>730,5471=>730,5472=>730,5473=>730,5474=>730,5475=>730,5476=>734,5477=>734, -5478=>734,5479=>734,5480=>954,5481=>946,5482=>493,5492=>879,5493=>879,5494=>879,5495=>879,5496=>879, -5497=>879,5498=>879,5499=>556,5500=>753,5501=>458,5502=>1114,5503=>1114,5504=>1114,5505=>1114,5506=>1114, -5507=>1114,5508=>1114,5509=>890,5514=>879,5515=>879,5516=>879,5517=>879,5518=>1432,5519=>1432,5520=>1432, -5521=>1165,5522=>1165,5523=>1432,5524=>1432,5525=>763,5526=>1146,5536=>889,5537=>889,5538=>838,5539=>838, -5540=>838,5541=>838,5542=>593,5543=>698,5544=>698,5545=>698,5546=>698,5547=>698,5548=>698,5549=>698, -5550=>445,5551=>668,5598=>747,5601=>747,5702=>446,5703=>446,5742=>371,5743=>1114,5744=>1432,5745=>1814, -5746=>1814,5747=>1548,5748=>1510,5749=>1814,5750=>1814,5760=>489,5761=>573,5762=>851,5763=>1128,5764=>1406, -5765=>1684,5766=>564,5767=>842,5768=>1128,5769=>1403,5770=>1684,5771=>512,5772=>789,5773=>1068,5774=>1347, -5775=>1626,5776=>573,5777=>851,5778=>1116,5779=>1399,5780=>1684,5781=>512,5782=>512,5783=>709,5784=>1110, -5785=>1403,5786=>666,5787=>574,5788=>574,7424=>586,7425=>750,7426=>943,7427=>547,7428=>533,7429=>608, -7430=>608,7431=>502,7432=>501,7433=>308,7434=>444,7435=>598,7436=>485,7437=>735,7438=>630,7439=>618, -7440=>533,7441=>594,7442=>594,7443=>594,7444=>984,7446=>618,7447=>618,7448=>500,7449=>578,7450=>578, -7451=>521,7452=>571,7453=>663,7454=>853,7455=>625,7456=>586,7457=>831,7458=>523,7459=>581,7462=>485, -7463=>586,7464=>622,7465=>500,7466=>703,7467=>659,7468=>438,7469=>615,7470=>432,7472=>470,7473=>387, -7474=>387,7475=>465,7476=>474,7477=>211,7478=>211,7479=>439,7480=>361,7481=>563,7482=>474,7483=>474, -7484=>481,7485=>458,7486=>415,7487=>436,7488=>387,7489=>460,7490=>625,7491=>412,7492=>412,7493=>431, -7494=>641,7495=>431,7496=>431,7497=>431,7498=>431,7499=>347,7500=>347,7501=>431,7502=>197,7503=>438, -7504=>597,7505=>410,7506=>439,7507=>372,7508=>439,7509=>439,7510=>431,7511=>349,7512=>410,7513=>416, -7514=>597,7515=>451,7517=>405,7518=>386,7519=>389,7520=>443,7521=>365,7522=>197,7523=>284,7524=>410, -7525=>451,7526=>405,7527=>386,7528=>405,7529=>443,7530=>365,7543=>644,7544=>474,7547=>491,7557=>462, -7579=>431,7580=>372,7581=>372,7582=>439,7583=>347,7584=>339,7585=>313,7586=>431,7587=>410,7588=>312, -7589=>253,7590=>312,7591=>312,7592=>388,7593=>293,7594=>296,7595=>333,7596=>598,7597=>597,7598=>505, -7599=>505,7600=>403,7601=>439,7602=>488,7603=>379,7604=>356,7605=>349,7606=>524,7607=>444,7608=>359, -7609=>405,7610=>451,7611=>375,7612=>471,7613=>422,7614=>409,7615=>382,7620=>0,7621=>0,7622=>0, -7623=>0,7624=>0,7625=>0,7680=>696,7681=>607,7682=>686,7683=>644,7684=>686,7685=>644,7686=>686, -7687=>644,7688=>660,7689=>533,7690=>747,7691=>644,7692=>747,7693=>644,7694=>747,7695=>644,7696=>747, -7697=>644,7698=>747,7699=>644,7700=>615,7701=>610,7702=>615,7703=>610,7704=>615,7705=>610,7706=>615, -7707=>610,7708=>615,7709=>610,7710=>615,7711=>391,7712=>738,7713=>644,7714=>753,7715=>641,7716=>753, -7717=>641,7718=>753,7719=>641,7720=>753,7721=>641,7722=>753,7723=>641,7724=>334,7725=>308,7726=>334, -7727=>308,7728=>697,7729=>598,7730=>697,7731=>598,7732=>697,7733=>598,7734=>573,7735=>308,7736=>573, -7737=>308,7738=>573,7739=>308,7740=>573,7741=>308,7742=>896,7743=>938,7744=>896,7745=>938,7746=>896, -7747=>938,7748=>753,7749=>641,7750=>753,7751=>641,7752=>753,7753=>641,7754=>753,7755=>641,7756=>765, -7757=>618,7758=>765,7759=>618,7760=>765,7761=>618,7762=>765,7763=>618,7764=>659,7765=>644,7766=>659, -7767=>644,7768=>693,7769=>444,7770=>693,7771=>444,7772=>693,7773=>444,7774=>693,7775=>444,7776=>648, -7777=>536,7778=>648,7779=>536,7780=>648,7781=>536,7782=>648,7783=>536,7784=>648,7785=>536,7786=>614, -7787=>430,7788=>614,7789=>430,7790=>614,7791=>430,7792=>614,7793=>430,7794=>730,7795=>641,7796=>730, -7797=>641,7798=>730,7799=>641,7800=>730,7801=>641,7802=>730,7803=>641,7804=>696,7805=>586,7806=>696, -7807=>586,7808=>993,7809=>831,7810=>993,7811=>831,7812=>993,7813=>831,7814=>993,7815=>831,7816=>993, -7817=>831,7818=>694,7819=>580,7820=>694,7821=>580,7822=>651,7823=>586,7824=>652,7825=>523,7826=>652, -7827=>523,7828=>652,7829=>523,7830=>641,7831=>430,7832=>831,7833=>586,7834=>607,7835=>391,7838=>806, -7839=>618,7840=>696,7841=>607,7842=>696,7843=>607,7844=>696,7845=>607,7846=>696,7847=>607,7848=>696, -7849=>607,7850=>696,7851=>607,7852=>696,7853=>607,7854=>696,7855=>607,7856=>696,7857=>607,7858=>696, -7859=>607,7860=>696,7861=>607,7862=>696,7863=>607,7864=>615,7865=>610,7866=>615,7867=>610,7868=>615, -7869=>610,7870=>615,7871=>610,7872=>615,7873=>610,7874=>615,7875=>610,7876=>615,7877=>610,7878=>615, -7879=>610,7880=>334,7881=>308,7882=>334,7883=>308,7884=>765,7885=>618,7886=>765,7887=>618,7888=>765, -7889=>618,7890=>765,7891=>618,7892=>765,7893=>618,7894=>765,7895=>618,7896=>765,7897=>618,7898=>786, -7899=>618,7900=>786,7901=>618,7902=>786,7903=>618,7904=>786,7905=>618,7906=>786,7907=>618,7908=>730, -7909=>641,7910=>730,7911=>641,7912=>751,7913=>641,7914=>751,7915=>641,7916=>751,7917=>641,7918=>751, -7919=>641,7920=>751,7921=>641,7922=>651,7923=>586,7924=>651,7925=>586,7926=>651,7927=>586,7928=>651, -7929=>586,7936=>618,7937=>618,7938=>618,7939=>618,7940=>618,7941=>618,7942=>618,7943=>618,7944=>696, -7945=>696,7946=>937,7947=>939,7948=>841,7949=>866,7950=>751,7951=>773,7952=>501,7953=>501,7954=>501, -7955=>501,7956=>501,7957=>501,7960=>712,7961=>715,7962=>989,7963=>986,7964=>920,7965=>947,7968=>641, -7969=>641,7970=>641,7971=>641,7972=>641,7973=>641,7974=>641,7975=>641,7976=>851,7977=>856,7978=>1125, -7979=>1125,7980=>1062,7981=>1085,7982=>948,7983=>956,7984=>351,7985=>351,7986=>351,7987=>351,7988=>351, -7989=>351,7990=>351,7991=>351,7992=>435,7993=>440,7994=>699,7995=>707,7996=>641,7997=>664,7998=>544, -7999=>544,8000=>618,8001=>618,8002=>618,8003=>618,8004=>618,8005=>618,8008=>802,8009=>839,8010=>1099, -8011=>1101,8012=>947,8013=>974,8016=>607,8017=>607,8018=>607,8019=>607,8020=>607,8021=>607,8022=>607, -8023=>607,8025=>837,8027=>1065,8029=>1079,8031=>944,8032=>782,8033=>782,8034=>782,8035=>782,8036=>782, -8037=>782,8038=>782,8039=>782,8040=>817,8041=>862,8042=>1121,8043=>1126,8044=>968,8045=>994,8046=>925, -8047=>968,8048=>618,8049=>618,8050=>501,8051=>501,8052=>641,8053=>641,8054=>351,8055=>351,8056=>618, -8057=>618,8058=>607,8059=>607,8060=>782,8061=>782,8064=>618,8065=>618,8066=>618,8067=>618,8068=>618, -8069=>618,8070=>618,8071=>618,8072=>696,8073=>696,8074=>937,8075=>939,8076=>841,8077=>866,8078=>751, -8079=>773,8080=>641,8081=>641,8082=>641,8083=>641,8084=>641,8085=>641,8086=>641,8087=>641,8088=>851, -8089=>856,8090=>1125,8091=>1125,8092=>1062,8093=>1085,8094=>948,8095=>956,8096=>782,8097=>782,8098=>782, -8099=>782,8100=>782,8101=>782,8102=>782,8103=>782,8104=>817,8105=>862,8106=>1121,8107=>1126,8108=>968, -8109=>994,8110=>925,8111=>968,8112=>618,8113=>618,8114=>618,8115=>618,8116=>618,8118=>618,8119=>618, -8120=>696,8121=>696,8122=>789,8123=>717,8124=>696,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450, -8130=>641,8131=>641,8132=>641,8134=>641,8135=>641,8136=>836,8137=>761,8138=>972,8139=>908,8140=>753, -8141=>450,8142=>450,8143=>450,8144=>351,8145=>351,8146=>351,8147=>351,8150=>351,8151=>351,8152=>334, -8153=>334,8154=>559,8155=>507,8157=>450,8158=>450,8159=>450,8160=>607,8161=>607,8162=>607,8163=>607, -8164=>644,8165=>644,8166=>607,8167=>607,8168=>651,8169=>651,8170=>918,8171=>882,8172=>754,8173=>450, -8174=>450,8175=>450,8178=>782,8179=>782,8180=>782,8182=>782,8183=>782,8184=>958,8185=>801,8186=>976, -8187=>804,8188=>765,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225, -8198=>150,8199=>626,8200=>342,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, -8208=>374,8209=>374,8210=>626,8213=>900,8214=>450,8215=>450,8219=>342,8223=>591,8227=>575,8228=>299, -8229=>600,8231=>313,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8241=>1698,8242=>237, -8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659,8251=>875,8252=>564,8253=>522,8254=>450, -8255=>745,8256=>745,8257=>296,8258=>920,8259=>450,8260=>150,8261=>411,8262=>411,8263=>927,8264=>746, -8265=>746,8266=>461,8267=>572,8268=>450,8269=>450,8270=>470,8271=>360,8272=>745,8273=>470,8274=>500, -8275=>900,8276=>745,8277=>754,8278=>615,8279=>731,8280=>754,8281=>754,8282=>342,8283=>784,8284=>754, -8285=>342,8286=>342,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0, -8300=>0,8301=>0,8302=>0,8303=>0,8304=>394,8305=>197,8308=>394,8309=>394,8310=>394,8311=>394, -8312=>394,8313=>394,8314=>475,8315=>475,8316=>475,8317=>259,8318=>259,8319=>410,8320=>394,8321=>394, -8322=>394,8323=>394,8324=>394,8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475, -8332=>475,8333=>259,8334=>259,8336=>412,8337=>431,8338=>439,8339=>371,8340=>431,8352=>836,8353=>626, -8354=>626,8355=>626,8356=>626,8357=>938,8358=>753,8359=>1366,8360=>1084,8361=>993,8362=>813,8363=>626, -8365=>626,8366=>614,8367=>1252,8368=>626,8369=>626,8370=>626,8371=>626,8372=>773,8373=>626,8400=>0, -8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1007,8449=>1053,8450=>660,8451=>1090, -8452=>806,8453=>982,8454=>1029,8455=>553,8456=>628,8457=>978,8459=>965,8460=>822,8461=>799,8462=>641, -8463=>641,8464=>537,8465=>627,8466=>771,8467=>424,8468=>876,8469=>753,8470=>1083,8471=>900,8472=>627, -8473=>675,8474=>765,8475=>844,8476=>732,8477=>721,8478=>807,8479=>639,8480=>917,8481=>1152,8483=>679, -8484=>679,8485=>520,8486=>765,8487=>765,8488=>686,8489=>304,8490=>697,8491=>696,8492=>835,8493=>736, -8494=>769,8495=>572,8496=>656,8497=>727,8498=>615,8499=>1065,8500=>418,8501=>714,8502=>658,8503=>444, -8504=>615,8505=>342,8506=>851,8507=>1213,8508=>710,8509=>663,8510=>589,8511=>776,8512=>756,8513=>697, -8514=>501,8515=>573,8516=>684,8517=>747,8518=>644,8519=>610,8520=>308,8521=>308,8523=>785,8526=>492, -8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932,8537=>932,8538=>932,8539=>932,8540=>932, -8541=>932,8542=>932,8543=>554,8544=>334,8545=>593,8546=>851,8547=>989,8548=>696,8549=>989,8550=>1247, -8551=>1505,8552=>1008,8553=>694,8554=>1008,8555=>1266,8556=>573,8557=>660,8558=>747,8559=>896,8560=>308, -8561=>546,8562=>785,8563=>885,8564=>586,8565=>866,8566=>1104,8567=>1342,8568=>872,8569=>580,8570=>872, -8571=>1110,8572=>308,8573=>533,8574=>644,8575=>938,8576=>1160,8577=>747,8578=>1160,8579=>660,8580=>533, -8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754, -8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754, -8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754, -8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754, -8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754, -8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754, -8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754, -8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754, -8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754, -8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754, -8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754, -8702=>754,8703=>754,8704=>696,8705=>626,8706=>489,8707=>615,8708=>615,8709=>771,8710=>627,8711=>627, -8712=>807,8713=>807,8714=>675,8715=>807,8716=>807,8717=>675,8718=>572,8719=>708,8720=>708,8721=>646, -8722=>754,8723=>754,8724=>626,8725=>329,8726=>626,8727=>754,8728=>563,8729=>342,8730=>600,8731=>600, -8732=>600,8733=>641,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450,8740=>450,8741=>450, -8742=>450,8743=>730,8744=>730,8745=>730,8746=>730,8747=>549,8748=>835,8749=>1165,8750=>506,8751=>879, -8752=>1181,8753=>506,8754=>506,8755=>506,8756=>626,8757=>626,8758=>264,8759=>626,8760=>754,8761=>754, -8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754,8770=>754,8771=>754, -8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754,8780=>754,8781=>754, -8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>956,8789=>956,8790=>754,8791=>754, -8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754,8800=>754,8801=>754, -8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>756,8809=>756,8810=>942,8811=>942, -8812=>450,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754,8820=>754,8821=>754, -8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754,8830=>754,8831=>754, -8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8840=>754,8841=>754, -8842=>754,8843=>754,8844=>730,8845=>730,8846=>730,8847=>754,8848=>754,8849=>754,8850=>754,8851=>716, -8852=>716,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754, -8862=>754,8863=>754,8864=>754,8865=>754,8866=>822,8867=>822,8868=>822,8869=>822,8870=>488,8871=>488, -8872=>822,8873=>822,8874=>822,8875=>822,8876=>822,8877=>822,8878=>822,8879=>822,8880=>754,8881=>754, -8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754,8890=>488,8891=>730, -8892=>730,8893=>730,8894=>754,8895=>754,8896=>758,8897=>758,8898=>758,8899=>758,8900=>444,8901=>342, -8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754,8910=>730,8911=>730, -8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754,8920=>1280,8921=>1280, -8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754,8930=>754,8931=>754, -8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754,8940=>754,8941=>754, -8942=>900,8943=>900,8944=>900,8945=>900,8946=>1042,8947=>807,8948=>675,8949=>807,8950=>807,8951=>675, -8952=>807,8953=>807,8954=>1042,8955=>807,8956=>675,8957=>807,8958=>675,8959=>807,8960=>542,8961=>542, -8962=>644,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>411,8969=>411,8970=>411,8971=>411, -8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>484,8984=>835,8985=>754,8988=>422,8989=>422, -8990=>422,8991=>422,8992=>549,8993=>549,8996=>1037,8997=>1037,8998=>1272,8999=>1037,9000=>1299,9003=>1272, -9004=>786,9075=>351,9076=>644,9077=>782,9082=>618,9085=>776,9095=>1037,9108=>786,9115=>450,9116=>450, -9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450, -9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>549,9166=>754,9167=>850, -9187=>786,9189=>692,9250=>644,9251=>644,9312=>762,9313=>762,9314=>762,9315=>762,9316=>762,9317=>762, -9318=>762,9319=>762,9320=>762,9321=>762,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692, -9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692, -9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692, -9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850, -9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850, -9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692, -9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692, -9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785, -9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785, -9686=>474,9687=>474,9688=>756,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348, -9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>575,9703=>850,9704=>850,9705=>850, -9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850, -9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659, -9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515, -9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807, -9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807, -9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671, -9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807, -9776=>807,9777=>807,9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807,9784=>807,9785=>807, -9786=>807,9787=>807,9788=>807,9789=>807,9790=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807, -9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807, -9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807, -9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807, -9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807, -9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807, -9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807, -9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807,9864=>807,9865=>807, -9866=>807,9867=>807,9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807,9874=>807,9875=>807, -9876=>807,9877=>487,9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807,9884=>807,9888=>807, -9889=>632,9890=>903,9891=>977,9892=>1028,9893=>811,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754, -9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>658,9907=>659,9908=>659, -9909=>659,9910=>765,9911=>659,9912=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754, -9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754, -10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754, -10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754, -10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754, -10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754, -10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754, -10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807, -10070=>807,10072=>754,10073=>754,10074=>754,10075=>312,10076=>312,10077=>528,10078=>528,10081=>754,10082=>754, -10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754, -10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>762, -10103=>762,10104=>762,10105=>762,10106=>762,10107=>762,10108=>762,10109=>762,10110=>762,10111=>762,10112=>754, -10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754, -10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754, -10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754, -10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754, -10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754, -10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>411,10182=>411, -10208=>444,10214=>438,10215=>438,10216=>411,10217=>411,10218=>648,10219=>648,10224=>754,10225=>754,10226=>754, -10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290, -10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703, -10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703, -10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703, -10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703, -10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703, -10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703, -10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703, -10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703, -10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703, -10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703, -10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703, -10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703, -10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703, -10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703, -10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703, -10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703, -10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703, -10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703, -10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703, -10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703, -10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703, -10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703, -10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703, -10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703, -10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703, -10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10502=>754, -10503=>754,10506=>754,10507=>754,10560=>754,10561=>754,10627=>678,10628=>678,10702=>754,10703=>941,10704=>941, -10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900, -10754=>900,10764=>1495,10765=>506,10766=>506,10767=>506,10768=>506,10769=>506,10770=>506,10771=>506,10772=>506, -10773=>506,10774=>506,10775=>506,10776=>506,10777=>506,10778=>506,10779=>506,10780=>506,10799=>754,10877=>754, -10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754, -10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754, -10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754, -10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754, -10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754, -11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754, -11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850, -11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786, -11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>573,11361=>324,11362=>573,11363=>659,11364=>693, -11365=>607,11366=>430,11367=>860,11368=>641,11369=>697,11370=>598,11371=>652,11372=>523,11373=>774,11374=>896, -11375=>696,11377=>700,11378=>1099,11379=>950,11380=>586,11381=>628,11382=>508,11383=>704,11385=>484,11386=>618, -11387=>502,11388=>197,11389=>438,11568=>622,11569=>847,11570=>847,11571=>652,11572=>652,11573=>652,11574=>608, -11575=>696,11576=>696,11577=>615,11578=>615,11579=>721,11580=>890,11581=>685,11582=>561,11583=>685,11584=>847, -11585=>847,11586=>335,11587=>666,11588=>753,11589=>822,11590=>604,11591=>663,11592=>612,11593=>615,11594=>542, -11595=>935,11596=>700,11597=>753,11598=>615,11599=>334,11600=>700,11601=>335,11602=>652,11603=>622,11604=>847, -11605=>847,11606=>753,11607=>335,11608=>752,11609=>847,11610=>847,11611=>660,11612=>789,11613=>694,11614=>660, -11615=>615,11616=>696,11617=>753,11618=>615,11619=>765,11620=>627,11621=>765,11631=>644,11800=>522,11810=>411, -11811=>411,11812=>411,11813=>411,11822=>522,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807, -19910=>807,19911=>807,19912=>807,19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807, -19920=>807,19921=>807,19922=>807,19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807, -19930=>807,19931=>807,19932=>807,19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807, -19940=>807,19941=>807,19942=>807,19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807, -19950=>807,19951=>807,19952=>807,19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807, -19960=>807,19961=>807,19962=>807,19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>648,42565=>536, -42566=>392,42567=>396,42572=>1265,42573=>1055,42576=>1110,42577=>924,42580=>1056,42581=>875,42582=>983,42583=>862, -42594=>976,42595=>832,42596=>986,42597=>821,42598=>1134,42599=>897,42600=>765,42601=>618,42602=>933,42603=>781, -42604=>1266,42605=>995,42606=>865,42634=>867,42635=>708,42636=>614,42637=>521,42644=>727,42645=>641,42760=>450, -42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450, -42771=>450,42772=>450,42773=>450,42774=>450,42779=>360,42780=>360,42781=>258,42782=>258,42783=>258,42790=>753, -42791=>641,42792=>928,42793=>771,42794=>626,42795=>501,42800=>502,42801=>536,42802=>1214,42803=>946,42804=>1156, -42805=>958,42806=>1094,42807=>949,42808=>971,42809=>830,42810=>971,42811=>830,42812=>932,42813=>830,42814=>628, -42815=>494,42822=>765,42823=>488,42824=>614,42825=>478,42826=>826,42827=>732,42830=>1266,42831=>995,42880=>573, -42881=>308,42882=>753,42883=>641,42889=>360,42890=>347,42891=>410,42892=>275,43003=>615,43004=>659,43005=>896, -43006=>334,43007=>1192,63173=>618,64256=>729,64257=>667,64258=>667,64259=>1003,64260=>1004,64261=>727,64262=>917, -64275=>1249,64276=>1245,64277=>1240,64278=>1245,64279=>1542,64285=>308,64286=>0,64287=>597,64288=>647,64289=>867, -64290=>801,64291=>889,64292=>867,64293=>844,64294=>889,64295=>889,64296=>878,64297=>754,64298=>854,64299=>854, -64300=>854,64301=>854,64302=>676,64303=>676,64304=>676,64305=>605,64306=>483,64307=>589,64308=>641,64309=>394, -64310=>442,64312=>651,64313=>394,64314=>584,64315=>584,64316=>611,64318=>698,64320=>447,64321=>696,64323=>646, -64324=>618,64326=>676,64327=>656,64328=>584,64329=>854,64330=>676,64331=>308,64332=>605,64333=>584,64334=>618, -64335=>676,64338=>904,64339=>953,64340=>338,64341=>367,64342=>904,64343=>953,64344=>338,64345=>367,64346=>904, -64347=>953,64348=>338,64349=>367,64350=>904,64351=>953,64352=>338,64353=>367,64354=>904,64355=>953,64356=>338, -64357=>367,64358=>904,64359=>953,64360=>338,64361=>367,64362=>1045,64363=>1072,64364=>589,64365=>647,64366=>1045, -64367=>1072,64368=>589,64369=>647,64370=>648,64371=>648,64372=>648,64373=>648,64374=>648,64375=>648,64376=>648, -64377=>648,64378=>648,64379=>648,64380=>648,64381=>648,64382=>648,64383=>648,64384=>648,64385=>648,64394=>518, -64395=>560,64396=>518,64397=>560,64398=>921,64399=>921,64400=>523,64401=>523,64402=>921,64403=>921,64404=>523, -64405=>523,64414=>768,64415=>810,64473=>559,64474=>564,64488=>338,64489=>367,64508=>825,64509=>910,64510=>338, -64511=>367,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, -65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0, -65059=>0,65136=>308,65137=>308,65138=>308,65139=>311,65140=>308,65142=>308,65143=>308,65144=>308,65145=>308, -65146=>308,65147=>308,65148=>308,65149=>308,65150=>308,65151=>308,65152=>460,65153=>308,65154=>338,65155=>308, -65156=>338,65157=>559,65158=>564,65159=>308,65160=>338,65161=>825,65162=>825,65163=>338,65164=>367,65165=>308, -65166=>338,65167=>904,65168=>953,65169=>338,65170=>367,65171=>531,65172=>545,65173=>904,65174=>953,65175=>338, -65176=>367,65177=>904,65178=>953,65179=>338,65180=>367,65181=>648,65182=>648,65183=>648,65184=>648,65185=>648, -65186=>648,65187=>648,65188=>648,65189=>648,65190=>648,65191=>648,65192=>648,65193=>461,65194=>520,65195=>461, -65196=>520,65197=>518,65198=>560,65199=>518,65200=>560,65201=>1242,65202=>1272,65203=>885,65204=>916,65205=>1242, -65206=>1272,65207=>885,65208=>916,65209=>1210,65210=>1228,65211=>870,65212=>887,65213=>1210,65214=>1228,65215=>870, -65216=>887,65217=>935,65218=>963,65219=>848,65220=>876,65221=>935,65222=>963,65223=>848,65224=>876,65225=>615, -65226=>615,65227=>615,65228=>508,65229=>615,65230=>615,65231=>615,65232=>508,65233=>1045,65234=>1072,65235=>589, -65236=>647,65237=>804,65238=>811,65239=>589,65240=>647,65241=>825,65242=>838,65243=>523,65244=>523,65245=>781, -65246=>803,65247=>338,65248=>367,65249=>659,65250=>706,65251=>557,65252=>603,65253=>768,65254=>810,65255=>338, -65256=>367,65257=>531,65258=>545,65259=>624,65260=>594,65261=>559,65262=>564,65263=>825,65264=>910,65265=>825, -65266=>910,65267=>338,65268=>367,65269=>670,65270=>683,65271=>670,65272=>683,65273=>670,65274=>683,65275=>670, -65276=>683,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1002); -$enc=''; -$diff=''; -$file='dejavusanscondensedb.z'; -$ctg='dejavusanscondensedb.ctg.z'; -$originalsize=534464; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.z deleted file mode 100644 index 5d59661c..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedb.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.ctg.z deleted file mode 100644 index 9d1fcd61..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.php deleted file mode 100644 index 6a86288e..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.php +++ /dev/null @@ -1,458 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>-46,'Flags'=>96,'FontBBox'=>'[-960 -385 1804 1121]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>540); -$up=-63; -$ut=44; -$dw=540; -$cw=array( -0=>540,32=>313,33=>410,34=>469,35=>626,36=>626,37=>901,38=>785,39=>275,40=>411, -41=>411,42=>470,43=>754,44=>342,45=>374,46=>342,47=>329,48=>626,49=>626,50=>626, -51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>360,59=>360,60=>754, -61=>754,62=>754,63=>522,64=>900,65=>696,66=>686,67=>660,68=>747,69=>615,70=>615, -71=>738,72=>753,73=>334,74=>334,75=>697,76=>573,77=>896,78=>753,79=>765,80=>659, -81=>765,82=>693,83=>648,84=>614,85=>730,86=>696,87=>993,88=>694,89=>651,90=>652, -91=>411,92=>329,93=>411,94=>754,95=>450,96=>450,97=>607,98=>644,99=>533,100=>644, -101=>610,102=>391,103=>644,104=>641,105=>308,106=>308,107=>598,108=>308,109=>938,110=>641, -111=>618,112=>644,113=>644,114=>444,115=>536,116=>430,117=>641,118=>586,119=>831,120=>580, -121=>586,122=>523,123=>641,124=>329,125=>641,126=>754,8364=>626,8218=>342,402=>391,8222=>580, -8230=>900,8224=>450,8225=>450,710=>450,8240=>1309,352=>648,8249=>371,338=>1050,381=>652,8216=>342, -8217=>342,8220=>580,8221=>580,8226=>575,8211=>450,8212=>900,732=>450,8482=>900,353=>536,8250=>371, -339=>984,382=>523,376=>651,160=>313,161=>410,162=>626,163=>626,164=>572,165=>626,166=>329, -167=>450,168=>450,169=>900,170=>507,171=>584,172=>754,173=>374,174=>900,175=>450,176=>450, -177=>754,178=>394,179=>394,180=>450,181=>662,182=>572,183=>342,184=>450,185=>394,186=>507, -187=>584,188=>932,189=>932,190=>932,191=>522,192=>696,193=>696,194=>696,195=>696,196=>696, -197=>696,198=>976,199=>660,200=>615,201=>615,202=>615,203=>615,204=>334,205=>334,206=>334, -207=>334,208=>760,209=>753,210=>765,211=>765,212=>765,213=>765,214=>765,215=>754,216=>765, -217=>730,218=>730,219=>730,220=>730,221=>651,222=>668,223=>647,224=>607,225=>607,226=>607, -227=>607,228=>607,229=>607,230=>943,231=>533,232=>610,233=>610,234=>610,235=>610,236=>308, -237=>308,238=>308,239=>308,240=>618,241=>641,242=>618,243=>618,244=>618,245=>618,246=>618, -247=>754,248=>618,249=>641,250=>641,251=>641,252=>641,253=>586,254=>644,255=>586,256=>696, -257=>607,258=>696,259=>607,260=>696,261=>607,262=>660,263=>533,264=>660,265=>533,266=>660, -267=>533,268=>660,269=>533,270=>747,271=>644,272=>760,273=>644,274=>615,275=>610,276=>615, -277=>610,278=>615,279=>610,280=>615,281=>610,282=>615,283=>610,284=>738,285=>644,286=>738, -287=>644,288=>738,289=>644,290=>738,291=>644,292=>753,293=>641,294=>876,295=>711,296=>334, -297=>308,298=>334,299=>308,300=>334,301=>308,302=>334,303=>308,304=>334,305=>308,306=>669, -307=>617,308=>334,309=>308,310=>697,311=>598,312=>598,313=>573,314=>308,315=>573,316=>308, -317=>573,318=>308,319=>573,320=>308,321=>594,322=>337,323=>753,324=>641,325=>753,326=>641, -327=>753,328=>641,329=>884,330=>753,331=>641,332=>765,333=>618,334=>765,335=>618,336=>765, -337=>618,340=>693,341=>444,342=>693,343=>444,344=>693,345=>444,346=>648,347=>536,348=>648, -349=>536,350=>648,351=>536,354=>614,355=>430,356=>614,357=>430,358=>614,359=>430,360=>730, -361=>641,362=>730,363=>641,364=>730,365=>641,366=>730,367=>641,368=>730,369=>641,370=>730, -371=>641,372=>993,373=>831,374=>651,375=>586,377=>652,378=>523,379=>652,380=>523,383=>391, -384=>644,385=>729,386=>686,387=>644,388=>686,389=>644,390=>660,391=>660,392=>533,393=>760, -394=>791,395=>686,396=>644,397=>618,398=>615,399=>765,400=>626,401=>615,403=>738,404=>713, -405=>940,406=>392,407=>350,408=>697,409=>598,410=>324,411=>532,412=>938,413=>753,414=>641, -415=>765,416=>765,417=>618,418=>1002,419=>866,420=>703,421=>644,422=>693,423=>648,424=>536, -425=>615,426=>497,427=>430,428=>636,429=>430,430=>614,431=>730,432=>641,433=>692,434=>732, -435=>717,436=>700,437=>652,438=>523,439=>695,440=>695,441=>576,442=>523,443=>626,444=>695, -445=>576,446=>515,447=>644,448=>334,449=>593,450=>489,451=>334,452=>1393,453=>1305,454=>1176, -455=>879,456=>881,457=>603,458=>1074,459=>1091,460=>957,461=>696,462=>607,463=>334,464=>308, -465=>765,466=>618,467=>730,468=>641,469=>730,470=>641,471=>730,472=>641,473=>730,474=>641, -475=>730,476=>641,477=>610,478=>696,479=>607,480=>696,481=>607,482=>976,483=>943,484=>738, -485=>644,486=>738,487=>644,488=>697,489=>598,490=>765,491=>618,492=>765,493=>618,494=>695, -495=>523,496=>308,497=>1393,498=>1305,499=>1176,500=>738,501=>644,502=>1160,503=>708,504=>753, -505=>641,506=>696,507=>607,508=>976,509=>943,510=>765,511=>618,512=>696,513=>607,514=>696, -515=>607,516=>615,517=>610,518=>615,519=>610,520=>334,521=>308,522=>334,523=>308,524=>765, -525=>618,526=>765,527=>618,528=>693,529=>444,530=>693,531=>444,532=>730,533=>641,534=>730, -535=>641,536=>648,537=>536,538=>614,539=>430,540=>621,541=>546,542=>753,543=>641,544=>753, -545=>778,546=>728,547=>593,548=>652,549=>523,550=>696,551=>607,552=>615,553=>610,554=>765, -555=>618,556=>765,557=>618,558=>765,559=>618,560=>765,561=>618,562=>651,563=>586,564=>442, -565=>780,566=>460,567=>308,568=>979,569=>979,570=>696,571=>660,572=>533,573=>573,574=>614, -575=>536,576=>523,577=>703,578=>553,579=>686,580=>730,581=>696,582=>615,583=>610,584=>334, -585=>308,586=>774,587=>712,588=>693,589=>444,590=>651,591=>586,592=>607,593=>644,594=>644, -595=>644,596=>533,597=>533,598=>712,599=>712,600=>610,601=>610,602=>788,603=>501,604=>490, -605=>696,606=>658,607=>308,608=>712,609=>644,610=>564,611=>661,612=>571,613=>641,614=>641, -615=>641,616=>491,617=>396,618=>491,619=>502,620=>624,621=>308,622=>757,623=>938,624=>938, -625=>938,626=>641,627=>713,628=>578,629=>618,630=>817,631=>613,632=>716,633=>484,634=>484, -635=>584,636=>444,637=>444,638=>536,639=>536,640=>578,641=>578,642=>536,643=>374,644=>391, -645=>544,646=>497,647=>430,648=>430,649=>828,650=>692,651=>603,652=>586,653=>831,654=>586, -655=>651,656=>624,657=>615,658=>576,659=>576,660=>515,661=>515,662=>515,663=>515,664=>765, -665=>569,666=>658,667=>616,668=>622,669=>308,670=>659,671=>485,672=>712,673=>515,674=>515, -675=>1040,676=>1093,677=>1039,678=>876,679=>691,680=>836,681=>923,682=>712,683=>702,684=>532, -685=>374,686=>609,687=>710,688=>410,689=>410,690=>197,691=>284,692=>284,693=>284,694=>369, -695=>532,696=>375,697=>271,698=>469,699=>342,700=>342,701=>342,702=>330,703=>330,704=>293, -705=>293,706=>450,707=>450,708=>450,709=>450,711=>450,712=>275,713=>450,714=>450,715=>450, -716=>275,717=>450,718=>450,719=>450,720=>303,721=>303,722=>330,723=>330,724=>450,725=>450, -726=>374,727=>295,728=>450,729=>450,730=>450,731=>450,733=>450,734=>315,735=>450,736=>370, -737=>197,738=>343,739=>371,740=>293,741=>450,742=>450,743=>450,744=>450,745=>450,748=>450, -749=>450,750=>580,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, -774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, -784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, -794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, -844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, -860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>628,881=>508,882=>919, -883=>752,884=>271,885=>271,886=>753,887=>630,890=>450,891=>533,892=>495,893=>494,894=>360, -900=>397,901=>450,902=>717,903=>342,904=>761,905=>908,906=>507,908=>801,910=>882,911=>804, -912=>351,913=>696,914=>686,915=>573,916=>696,917=>615,918=>652,919=>753,920=>765,921=>334, -922=>697,923=>696,924=>896,925=>753,926=>568,927=>765,928=>753,929=>659,931=>615,932=>614, -933=>651,934=>765,935=>694,936=>765,937=>765,938=>334,939=>651,940=>618,941=>501,942=>641, -943=>351,944=>607,945=>618,946=>644,947=>613,948=>618,949=>501,950=>532,951=>641,952=>618, -953=>351,954=>639,955=>569,956=>662,957=>613,958=>532,959=>618,960=>712,961=>644,962=>533, -963=>701,964=>574,965=>607,966=>704,967=>580,968=>714,969=>782,970=>351,971=>607,972=>618, -973=>607,974=>782,975=>697,976=>585,977=>594,978=>671,979=>883,980=>671,981=>716,982=>782, -983=>669,984=>765,985=>618,986=>660,987=>533,988=>615,989=>444,990=>632,991=>593,992=>827, -993=>564,994=>983,995=>753,996=>749,997=>644,998=>835,999=>669,1000=>660,1001=>585,1002=>709, -1003=>604,1004=>677,1005=>644,1006=>614,1007=>531,1008=>669,1009=>644,1010=>533,1011=>308,1012=>765, -1013=>580,1014=>580,1015=>668,1016=>644,1017=>660,1018=>896,1019=>659,1020=>644,1021=>660,1022=>660, -1023=>628,1024=>615,1025=>615,1026=>791,1027=>573,1028=>660,1029=>648,1030=>334,1031=>334,1032=>334, -1033=>1039,1034=>1017,1035=>791,1036=>735,1037=>753,1038=>694,1039=>753,1040=>696,1041=>686,1042=>686, -1043=>573,1044=>801,1045=>615,1046=>1102,1047=>639,1048=>753,1049=>753,1050=>735,1051=>747,1052=>896, -1053=>753,1054=>765,1055=>753,1056=>659,1057=>660,1058=>614,1059=>694,1060=>892,1061=>694,1062=>835, -1063=>727,1064=>1112,1065=>1193,1066=>845,1067=>932,1068=>686,1069=>660,1070=>1056,1071=>693,1072=>607, -1073=>628,1074=>569,1075=>470,1076=>727,1077=>610,1078=>896,1079=>523,1080=>630,1081=>630,1082=>611, -1083=>659,1084=>735,1085=>622,1086=>618,1087=>622,1088=>644,1089=>533,1090=>521,1091=>586,1092=>893, -1093=>580,1094=>667,1095=>618,1096=>956,1097=>995,1098=>676,1099=>813,1100=>569,1101=>533,1102=>875, -1103=>578,1104=>610,1105=>610,1106=>642,1107=>470,1108=>533,1109=>536,1110=>308,1111=>308,1112=>308, -1113=>892,1114=>860,1115=>661,1116=>611,1117=>630,1118=>586,1119=>622,1120=>983,1121=>782,1122=>756, -1123=>662,1124=>911,1125=>755,1126=>893,1127=>749,1128=>1222,1129=>1009,1130=>765,1131=>618,1132=>1112, -1133=>906,1134=>626,1135=>501,1136=>967,1137=>955,1138=>765,1139=>618,1140=>765,1141=>625,1142=>765, -1143=>625,1144=>1033,1145=>939,1146=>967,1147=>776,1148=>1265,1149=>1055,1150=>983,1151=>782,1152=>660, -1153=>533,1154=>587,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>844, -1163=>725,1164=>686,1165=>550,1166=>662,1167=>646,1168=>573,1169=>470,1170=>599,1171=>488,1172=>709, -1173=>470,1174=>1102,1175=>896,1176=>639,1177=>523,1178=>697,1179=>611,1180=>735,1181=>611,1182=>735, -1183=>611,1184=>914,1185=>743,1186=>753,1187=>622,1188=>992,1189=>783,1190=>1129,1191=>880,1192=>851, -1193=>773,1194=>660,1195=>533,1196=>614,1197=>521,1198=>651,1199=>586,1200=>651,1201=>586,1202=>694, -1203=>580,1204=>993,1205=>901,1206=>727,1207=>618,1208=>727,1209=>618,1210=>727,1211=>641,1212=>923, -1213=>729,1214=>923,1215=>729,1216=>334,1217=>1102,1218=>896,1219=>700,1220=>566,1221=>839,1222=>724, -1223=>753,1224=>622,1225=>844,1226=>725,1227=>727,1228=>618,1229=>986,1230=>838,1231=>308,1232=>696, -1233=>607,1234=>696,1235=>607,1236=>976,1237=>943,1238=>615,1239=>610,1240=>765,1241=>610,1242=>765, -1243=>610,1244=>1102,1245=>896,1246=>639,1247=>523,1248=>695,1249=>576,1250=>753,1251=>630,1252=>753, -1253=>630,1254=>765,1255=>618,1256=>765,1257=>618,1258=>765,1259=>618,1260=>660,1261=>533,1262=>694, -1263=>586,1264=>694,1265=>586,1266=>694,1267=>586,1268=>727,1269=>618,1270=>573,1271=>470,1272=>932, -1273=>813,1274=>599,1275=>488,1276=>694,1277=>580,1278=>694,1279=>580,1280=>686,1281=>547,1282=>1043, -1283=>804,1284=>1007,1285=>828,1286=>745,1287=>624,1288=>1117,1289=>915,1290=>1160,1291=>912,1292=>755, -1293=>574,1294=>844,1295=>722,1296=>626,1297=>501,1298=>747,1299=>659,1300=>1157,1301=>963,1302=>958, -1303=>883,1304=>973,1305=>864,1306=>765,1307=>644,1308=>993,1309=>831,1312=>1123,1313=>920,1314=>1128, -1315=>880,1316=>861,1317=>726,1329=>886,1330=>730,1331=>886,1332=>886,1333=>730,1334=>699,1335=>730, -1336=>730,1337=>877,1338=>886,1339=>730,1340=>639,1341=>970,1342=>1022,1343=>730,1344=>639,1345=>681, -1346=>886,1347=>789,1348=>886,1349=>714,1350=>886,1351=>730,1352=>730,1353=>730,1354=>862,1355=>699, -1356=>886,1357=>730,1358=>886,1359=>648,1360=>730,1361=>714,1362=>805,1363=>765,1364=>842,1365=>765, -1366=>648,1369=>330,1370=>342,1371=>495,1372=>495,1373=>342,1374=>491,1375=>468,1377=>938,1378=>641, -1379=>779,1380=>781,1381=>641,1382=>735,1383=>588,1384=>641,1385=>729,1386=>735,1387=>641,1388=>448, -1389=>916,1390=>644,1391=>641,1392=>641,1393=>644,1394=>737,1395=>641,1396=>676,1397=>308,1398=>794, -1399=>502,1400=>641,1401=>502,1402=>938,1403=>502,1404=>777,1405=>641,1406=>732,1407=>938,1408=>641, -1409=>644,1410=>514,1411=>938,1412=>700,1413=>618,1414=>648,1415=>776,1417=>360,1418=>438,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>374,1471=>0,1472=>334,1473=>0,1474=>0,1475=>334,1478=>447, -1479=>0,1488=>676,1489=>605,1490=>483,1491=>589,1492=>641,1493=>308,1494=>442,1495=>641,1496=>651, -1497=>308,1498=>584,1499=>584,1500=>611,1501=>641,1502=>698,1503=>308,1504=>447,1505=>696,1506=>610, -1507=>646,1508=>618,1509=>565,1510=>676,1511=>656,1512=>584,1513=>854,1514=>676,1520=>598,1521=>598, -1522=>597,1523=>399,1524=>639,3647=>668,3713=>734,3714=>673,3716=>674,3719=>512,3720=>668,3722=>669, -3725=>685,3732=>635,3733=>633,3734=>672,3735=>737,3737=>657,3738=>654,3739=>654,3740=>830,3741=>744, -3742=>779,3743=>779,3745=>752,3746=>685,3747=>692,3749=>691,3751=>642,3754=>744,3755=>928,3757=>651, -3758=>705,3759=>840,3760=>620,3761=>0,3762=>549,3763=>549,3764=>0,3765=>0,3766=>0,3767=>0, -3768=>0,3769=>0,3771=>0,3772=>0,3773=>603,3776=>464,3777=>774,3778=>464,3779=>584,3780=>569, -3782=>683,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>694,3793=>694,3794=>624, -3795=>752,3796=>655,3797=>655,3798=>764,3799=>710,3800=>683,3801=>818,3804=>1227,3805=>1227,4256=>826, -4257=>669,4258=>665,4259=>753,4260=>584,4261=>696,4262=>771,4263=>800,4264=>477,4265=>570,4266=>771, -4267=>810,4268=>579,4269=>813,4270=>732,4271=>677,4272=>782,4273=>579,4274=>579,4275=>797,4276=>797, -4277=>660,4278=>587,4279=>579,4280=>582,4281=>579,4282=>710,4283=>812,4284=>570,4285=>557,4286=>579, -4287=>700,4288=>802,4289=>541,4290=>668,4291=>554,4292=>570,4293=>668,4304=>497,4305=>497,4306=>536, -4307=>734,4308=>505,4309=>506,4310=>497,4311=>744,4312=>497,4313=>488,4314=>967,4315=>506,4316=>507, -4317=>730,4318=>497,4319=>532,4320=>740,4321=>506,4322=>621,4323=>525,4324=>732,4325=>505,4326=>731, -4327=>506,4328=>506,4329=>507,4330=>568,4331=>506,4332=>506,4333=>497,4334=>506,4335=>506,4336=>501, -4337=>543,4338=>497,4339=>497,4340=>497,4341=>544,4342=>767,4343=>571,4344=>506,4345=>536,4346=>487, -4347=>615,4348=>331,5121=>696,5122=>696,5123=>696,5124=>696,5125=>814,5126=>814,5127=>814,5129=>814, -5130=>814,5131=>814,5132=>916,5133=>908,5134=>916,5135=>908,5136=>916,5137=>908,5138=>1034,5139=>1025, -5140=>1034,5141=>1025,5142=>814,5143=>1034,5144=>1028,5145=>1034,5146=>1028,5147=>814,5149=>278,5150=>476, -5151=>382,5152=>382,5153=>355,5154=>355,5155=>355,5156=>355,5157=>507,5158=>423,5159=>278,5160=>355, -5161=>355,5162=>355,5163=>1092,5164=>888,5165=>1094,5166=>1167,5167=>696,5168=>696,5169=>696,5170=>696, -5171=>797,5172=>797,5173=>797,5175=>797,5176=>797,5177=>797,5178=>916,5179=>908,5180=>916,5181=>908, -5182=>916,5183=>908,5184=>1034,5185=>1025,5186=>1034,5187=>1025,5188=>1034,5189=>1028,5190=>1034,5191=>1028, -5192=>797,5193=>518,5194=>206,5196=>730,5197=>730,5198=>730,5199=>730,5200=>734,5201=>734,5202=>734, -5204=>734,5205=>734,5206=>734,5207=>950,5208=>943,5209=>950,5210=>943,5211=>950,5212=>943,5213=>954, -5214=>949,5215=>954,5216=>949,5217=>954,5218=>946,5219=>954,5220=>946,5221=>954,5222=>435,5223=>904, -5224=>904,5225=>921,5226=>915,5227=>668,5228=>668,5229=>668,5230=>668,5231=>668,5232=>668,5233=>668, -5234=>668,5235=>668,5236=>926,5237=>877,5238=>882,5239=>877,5240=>882,5241=>877,5242=>926,5243=>877, -5244=>926,5245=>877,5246=>882,5247=>877,5248=>882,5249=>877,5250=>882,5251=>451,5252=>451,5253=>844, -5254=>844,5255=>844,5256=>844,5257=>668,5258=>668,5259=>668,5260=>668,5261=>668,5262=>668,5263=>668, -5264=>668,5265=>668,5266=>926,5267=>877,5268=>926,5269=>877,5270=>926,5271=>877,5272=>926,5273=>877, -5274=>926,5275=>877,5276=>926,5277=>877,5278=>926,5279=>877,5280=>926,5281=>451,5282=>451,5283=>563, -5284=>563,5285=>563,5286=>563,5287=>563,5288=>563,5289=>563,5290=>563,5291=>563,5292=>793,5293=>769, -5294=>777,5295=>786,5296=>777,5297=>786,5298=>793,5299=>786,5300=>793,5301=>786,5302=>777,5303=>786, -5304=>777,5305=>786,5306=>777,5307=>392,5308=>493,5309=>392,5312=>889,5313=>889,5314=>889,5315=>889, -5316=>838,5317=>838,5318=>838,5319=>838,5320=>838,5321=>1114,5322=>1122,5323=>1080,5324=>1105,5325=>1080, -5326=>1105,5327=>838,5328=>593,5329=>447,5330=>593,5331=>889,5332=>889,5333=>889,5334=>889,5335=>838, -5336=>838,5337=>838,5338=>838,5339=>838,5340=>1107,5341=>1122,5342=>1155,5343=>1105,5344=>1155,5345=>1105, -5346=>1105,5347=>1093,5348=>1105,5349=>1093,5350=>1155,5351=>1105,5352=>1155,5353=>1105,5354=>593,5356=>797, -5357=>657,5358=>657,5359=>657,5360=>657,5361=>657,5362=>657,5363=>657,5364=>657,5365=>657,5366=>897, -5367=>862,5368=>870,5369=>890,5370=>870,5371=>890,5372=>897,5373=>862,5374=>897,5375=>862,5376=>870, -5377=>890,5378=>870,5379=>890,5380=>870,5381=>443,5382=>414,5383=>443,5392=>831,5393=>831,5394=>831, -5395=>1022,5396=>1022,5397=>1022,5398=>1022,5399=>1088,5400=>1081,5401=>1088,5402=>1081,5403=>1088,5404=>1081, -5405=>1288,5406=>1278,5407=>1288,5408=>1278,5409=>1288,5410=>1278,5411=>1288,5412=>1278,5413=>671,5414=>698, -5415=>698,5416=>698,5417=>698,5418=>698,5419=>698,5420=>698,5421=>698,5422=>698,5423=>902,5424=>903, -5425=>911,5426=>896,5427=>911,5428=>896,5429=>902,5430=>903,5431=>902,5432=>903,5433=>911,5434=>896, -5435=>911,5436=>896,5437=>911,5438=>445,5440=>355,5441=>458,5442=>929,5443=>929,5444=>878,5445=>878, -5446=>878,5447=>878,5448=>659,5449=>659,5450=>659,5451=>659,5452=>659,5453=>659,5454=>902,5455=>863, -5456=>445,5458=>797,5459=>696,5460=>696,5461=>696,5462=>696,5463=>835,5464=>835,5465=>835,5466=>835, -5467=>1055,5468=>1028,5469=>542,5470=>730,5471=>730,5472=>730,5473=>730,5474=>730,5475=>730,5476=>734, -5477=>734,5478=>734,5479=>734,5480=>954,5481=>946,5482=>493,5492=>879,5493=>879,5494=>879,5495=>879, -5496=>879,5497=>879,5498=>879,5499=>556,5500=>753,5501=>458,5502=>1114,5503=>1114,5504=>1114,5505=>1114, -5506=>1114,5507=>1114,5508=>1114,5509=>890,5514=>879,5515=>879,5516=>879,5517=>879,5518=>1432,5519=>1432, -5520=>1432,5521=>1165,5522=>1165,5523=>1432,5524=>1432,5525=>763,5526=>1146,5536=>889,5537=>889,5538=>838, -5539=>838,5540=>838,5541=>838,5542=>593,5543=>698,5544=>698,5545=>698,5546=>698,5547=>698,5548=>698, -5549=>698,5550=>445,5551=>668,5598=>747,5601=>747,5702=>446,5703=>446,5742=>371,5743=>1114,5744=>1432, -5745=>1814,5746=>1814,5747=>1548,5748=>1510,5749=>1814,5750=>1814,7424=>586,7425=>750,7426=>943,7427=>547, -7428=>533,7429=>608,7430=>608,7431=>502,7432=>501,7433=>308,7434=>444,7435=>598,7436=>485,7437=>735, -7438=>630,7439=>618,7440=>533,7441=>594,7442=>594,7443=>594,7444=>984,7446=>618,7447=>618,7448=>500, -7449=>578,7450=>578,7451=>521,7452=>571,7453=>663,7454=>853,7455=>625,7456=>586,7457=>831,7458=>523, -7459=>581,7462=>485,7463=>586,7464=>622,7465=>500,7466=>703,7467=>659,7468=>438,7469=>615,7470=>432, -7472=>470,7473=>387,7474=>387,7475=>465,7476=>474,7477=>211,7478=>211,7479=>439,7480=>361,7481=>563, -7482=>474,7483=>474,7484=>481,7485=>458,7486=>415,7487=>436,7488=>387,7489=>460,7490=>625,7491=>412, -7492=>412,7493=>431,7494=>641,7495=>431,7496=>431,7497=>431,7498=>431,7499=>347,7500=>347,7501=>431, -7502=>197,7503=>438,7504=>597,7505=>410,7506=>439,7507=>372,7508=>439,7509=>439,7510=>431,7511=>349, -7512=>410,7513=>416,7514=>597,7515=>451,7517=>405,7518=>386,7519=>389,7520=>443,7521=>365,7522=>197, -7523=>284,7524=>410,7525=>451,7526=>405,7527=>386,7528=>405,7529=>443,7530=>365,7543=>644,7544=>474, -7547=>491,7557=>462,7579=>431,7580=>372,7581=>372,7582=>439,7583=>347,7584=>339,7585=>313,7586=>431, -7587=>410,7588=>312,7589=>253,7590=>312,7591=>312,7592=>388,7593=>293,7594=>296,7595=>333,7596=>598, -7597=>597,7598=>505,7599=>505,7600=>403,7601=>439,7602=>488,7603=>379,7604=>356,7605=>349,7606=>524, -7607=>444,7608=>359,7609=>405,7610=>451,7611=>375,7612=>471,7613=>422,7614=>409,7615=>382,7620=>0, -7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>696,7681=>607,7682=>686,7683=>644,7684=>686, -7685=>644,7686=>686,7687=>644,7688=>660,7689=>533,7690=>747,7691=>644,7692=>747,7693=>644,7694=>747, -7695=>644,7696=>747,7697=>644,7698=>747,7699=>644,7700=>615,7701=>610,7702=>615,7703=>610,7704=>615, -7705=>610,7706=>615,7707=>610,7708=>615,7709=>610,7710=>615,7711=>391,7712=>738,7713=>644,7714=>753, -7715=>641,7716=>753,7717=>641,7718=>753,7719=>641,7720=>753,7721=>641,7722=>753,7723=>641,7724=>334, -7725=>308,7726=>334,7727=>308,7728=>697,7729=>598,7730=>697,7731=>598,7732=>697,7733=>598,7734=>573, -7735=>308,7736=>573,7737=>308,7738=>573,7739=>308,7740=>573,7741=>308,7742=>896,7743=>938,7744=>896, -7745=>938,7746=>896,7747=>938,7748=>753,7749=>641,7750=>753,7751=>641,7752=>753,7753=>641,7754=>753, -7755=>641,7756=>765,7757=>618,7758=>765,7759=>618,7760=>765,7761=>618,7762=>765,7763=>618,7764=>659, -7765=>644,7766=>659,7767=>644,7768=>693,7769=>444,7770=>693,7771=>444,7772=>693,7773=>444,7774=>693, -7775=>444,7776=>648,7777=>536,7778=>648,7779=>536,7780=>648,7781=>536,7782=>648,7783=>536,7784=>648, -7785=>536,7786=>614,7787=>430,7788=>614,7789=>430,7790=>614,7791=>430,7792=>614,7793=>430,7794=>730, -7795=>641,7796=>730,7797=>641,7798=>730,7799=>641,7800=>730,7801=>641,7802=>730,7803=>641,7804=>696, -7805=>586,7806=>696,7807=>586,7808=>993,7809=>831,7810=>993,7811=>831,7812=>993,7813=>831,7814=>993, -7815=>831,7816=>993,7817=>831,7818=>694,7819=>580,7820=>694,7821=>580,7822=>651,7823=>586,7824=>652, -7825=>523,7826=>652,7827=>523,7828=>652,7829=>523,7830=>641,7831=>430,7832=>831,7833=>586,7834=>607, -7835=>391,7838=>806,7839=>618,7840=>696,7841=>607,7842=>696,7843=>607,7844=>696,7845=>607,7846=>696, -7847=>607,7848=>696,7849=>607,7850=>696,7851=>607,7852=>696,7853=>607,7854=>696,7855=>607,7856=>696, -7857=>607,7858=>696,7859=>607,7860=>696,7861=>607,7862=>696,7863=>607,7864=>615,7865=>610,7866=>615, -7867=>610,7868=>615,7869=>610,7870=>615,7871=>610,7872=>615,7873=>610,7874=>615,7875=>610,7876=>615, -7877=>610,7878=>615,7879=>610,7880=>334,7881=>308,7882=>334,7883=>308,7884=>765,7885=>618,7886=>765, -7887=>618,7888=>765,7889=>618,7890=>765,7891=>618,7892=>765,7893=>618,7894=>765,7895=>618,7896=>765, -7897=>618,7898=>765,7899=>618,7900=>765,7901=>618,7902=>765,7903=>618,7904=>765,7905=>618,7906=>765, -7907=>618,7908=>730,7909=>641,7910=>730,7911=>641,7912=>730,7913=>641,7914=>730,7915=>641,7916=>730, -7917=>641,7918=>730,7919=>641,7920=>730,7921=>641,7922=>651,7923=>586,7924=>651,7925=>586,7926=>651, -7927=>586,7928=>651,7929=>586,7936=>618,7937=>618,7938=>618,7939=>618,7940=>618,7941=>618,7942=>618, -7943=>618,7944=>696,7945=>696,7946=>937,7947=>939,7948=>841,7949=>866,7950=>751,7951=>773,7952=>501, -7953=>501,7954=>501,7955=>501,7956=>501,7957=>501,7960=>712,7961=>715,7962=>989,7963=>986,7964=>920, -7965=>947,7968=>641,7969=>641,7970=>641,7971=>641,7972=>641,7973=>641,7974=>641,7975=>641,7976=>851, -7977=>856,7978=>1125,7979=>1125,7980=>1062,7981=>1085,7982=>948,7983=>956,7984=>351,7985=>351,7986=>351, -7987=>351,7988=>351,7989=>351,7990=>351,7991=>351,7992=>435,7993=>440,7994=>699,7995=>707,7996=>641, -7997=>664,7998=>544,7999=>544,8000=>618,8001=>618,8002=>618,8003=>618,8004=>618,8005=>618,8008=>802, -8009=>839,8010=>1099,8011=>1101,8012=>947,8013=>974,8016=>607,8017=>607,8018=>607,8019=>607,8020=>607, -8021=>607,8022=>607,8023=>607,8025=>837,8027=>1065,8029=>1079,8031=>944,8032=>782,8033=>782,8034=>782, -8035=>782,8036=>782,8037=>782,8038=>782,8039=>782,8040=>817,8041=>862,8042=>1121,8043=>1126,8044=>968, -8045=>994,8046=>925,8047=>968,8048=>618,8049=>618,8050=>501,8051=>501,8052=>641,8053=>641,8054=>351, -8055=>351,8056=>618,8057=>618,8058=>607,8059=>607,8060=>782,8061=>782,8064=>618,8065=>618,8066=>618, -8067=>618,8068=>618,8069=>618,8070=>618,8071=>618,8072=>696,8073=>696,8074=>937,8075=>939,8076=>841, -8077=>866,8078=>751,8079=>773,8080=>641,8081=>641,8082=>641,8083=>641,8084=>641,8085=>641,8086=>641, -8087=>641,8088=>851,8089=>856,8090=>1125,8091=>1125,8092=>1062,8093=>1085,8094=>948,8095=>956,8096=>782, -8097=>782,8098=>782,8099=>782,8100=>782,8101=>782,8102=>782,8103=>782,8104=>817,8105=>862,8106=>1121, -8107=>1126,8108=>968,8109=>994,8110=>925,8111=>968,8112=>618,8113=>618,8114=>618,8115=>618,8116=>618, -8118=>618,8119=>618,8120=>696,8121=>696,8122=>789,8123=>717,8124=>696,8125=>450,8126=>450,8127=>450, -8128=>450,8129=>450,8130=>641,8131=>641,8132=>641,8134=>641,8135=>641,8136=>836,8137=>761,8138=>972, -8139=>908,8140=>753,8141=>450,8142=>450,8143=>450,8144=>351,8145=>351,8146=>351,8147=>351,8150=>351, -8151=>351,8152=>334,8153=>334,8154=>559,8155=>507,8157=>450,8158=>450,8159=>450,8160=>607,8161=>607, -8162=>607,8163=>607,8164=>644,8165=>644,8166=>607,8167=>607,8168=>651,8169=>651,8170=>918,8171=>882, -8172=>754,8173=>450,8174=>450,8175=>450,8178=>782,8179=>782,8180=>782,8182=>782,8183=>782,8184=>958, -8185=>801,8186=>976,8187=>804,8188=>765,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900, -8196=>296,8197=>225,8198=>150,8199=>626,8200=>342,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0, -8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8213=>900,8214=>450,8215=>450,8219=>342,8223=>591, -8227=>575,8228=>342,8229=>616,8231=>313,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180, -8241=>1717,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659,8251=>875,8252=>564, -8253=>522,8254=>450,8255=>745,8256=>745,8257=>296,8258=>920,8259=>450,8260=>150,8261=>411,8262=>411, -8263=>927,8264=>746,8265=>746,8266=>461,8267=>618,8268=>450,8269=>450,8270=>470,8271=>360,8272=>745, -8273=>470,8274=>500,8275=>754,8276=>745,8277=>754,8278=>615,8279=>731,8280=>754,8281=>754,8282=>342, -8283=>784,8284=>754,8285=>342,8286=>342,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, -8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>394,8305=>197,8308=>394,8309=>394, -8310=>394,8311=>394,8312=>394,8313=>394,8314=>475,8315=>475,8316=>475,8317=>259,8318=>259,8319=>410, -8320=>394,8321=>394,8322=>394,8323=>394,8324=>394,8325=>394,8326=>394,8327=>394,8328=>394,8329=>394, -8330=>475,8331=>475,8332=>475,8333=>259,8334=>259,8336=>412,8337=>431,8338=>439,8339=>371,8340=>431, -8352=>836,8353=>626,8354=>626,8355=>626,8356=>626,8357=>938,8358=>753,8359=>1339,8360=>1084,8361=>993, -8362=>768,8363=>642,8365=>626,8366=>614,8367=>1252,8368=>626,8369=>626,8370=>626,8371=>626,8372=>773, -8373=>626,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>995,8449=>995, -8450=>660,8451=>1090,8452=>807,8453=>1002,8454=>1033,8455=>626,8456=>628,8457=>856,8459=>965,8460=>822, -8461=>799,8462=>641,8463=>641,8464=>537,8465=>627,8466=>771,8467=>424,8468=>876,8469=>753,8470=>1083, -8471=>900,8472=>627,8473=>675,8474=>765,8475=>844,8476=>732,8477=>721,8478=>807,8479=>639,8480=>917, -8481=>1115,8483=>751,8484=>679,8485=>560,8486=>765,8487=>692,8488=>686,8489=>272,8490=>697,8491=>696, -8492=>835,8493=>736,8494=>769,8495=>572,8496=>656,8497=>727,8498=>615,8499=>1065,8500=>418,8501=>714, -8502=>658,8503=>444,8504=>615,8505=>342,8506=>851,8507=>1232,8508=>710,8509=>663,8510=>589,8511=>776, -8512=>756,8513=>707,8514=>518,8515=>573,8516=>684,8517=>747,8518=>644,8519=>610,8520=>308,8521=>308, -8523=>785,8526=>492,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932,8537=>932,8538=>932, -8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>334,8545=>593,8546=>851,8547=>989,8548=>696, -8549=>989,8550=>1247,8551=>1505,8552=>1008,8553=>694,8554=>1008,8555=>1266,8556=>573,8557=>660,8558=>747, -8559=>896,8560=>308,8561=>546,8562=>785,8563=>885,8564=>586,8565=>866,8566=>1104,8567=>1342,8568=>872, -8569=>580,8570=>872,8571=>1110,8572=>308,8573=>533,8574=>644,8575=>938,8576=>1160,8577=>747,8578=>1160, -8579=>660,8580=>533,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754, -8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754, -8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754, -8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754, -8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754, -8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754, -8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754, -8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754, -8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754, -8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754, -8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754, -8700=>754,8701=>754,8702=>754,8703=>754,8704=>696,8705=>626,8706=>489,8707=>615,8708=>615,8709=>771, -8710=>627,8711=>627,8712=>807,8713=>807,8714=>675,8715=>807,8716=>807,8717=>675,8718=>572,8719=>708, -8720=>708,8721=>646,8722=>754,8723=>754,8724=>626,8725=>329,8726=>626,8727=>754,8728=>563,8729=>342, -8730=>600,8731=>600,8732=>600,8733=>641,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450, -8740=>450,8741=>450,8742=>450,8743=>730,8744=>730,8745=>730,8746=>730,8747=>549,8748=>835,8749=>1165, -8750=>506,8751=>879,8752=>1181,8753=>506,8754=>506,8755=>506,8756=>626,8757=>626,8758=>264,8759=>626, -8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754, -8770=>754,8771=>754,8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754, -8780=>754,8781=>754,8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>956,8789=>956, -8790=>754,8791=>754,8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754, -8800=>754,8801=>754,8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>756,8809=>756, -8810=>942,8811=>942,8812=>450,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754, -8820=>754,8821=>754,8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754, -8830=>754,8831=>754,8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754, -8840=>754,8841=>754,8842=>754,8843=>754,8844=>730,8845=>730,8846=>730,8847=>754,8848=>754,8849=>754, -8850=>754,8851=>716,8852=>716,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754, -8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>822,8867=>822,8868=>822,8869=>822, -8870=>488,8871=>488,8872=>822,8873=>822,8874=>822,8875=>822,8876=>822,8877=>822,8878=>822,8879=>822, -8880=>754,8881=>754,8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754, -8890=>488,8891=>730,8892=>730,8893=>730,8894=>754,8895=>754,8896=>758,8897=>758,8898=>758,8899=>758, -8900=>444,8901=>342,8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754, -8910=>730,8911=>730,8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754, -8920=>1280,8921=>1280,8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754, -8930=>754,8931=>754,8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754, -8940=>754,8941=>754,8942=>900,8943=>900,8944=>900,8945=>900,8946=>1042,8947=>807,8948=>675,8949=>807, -8950=>807,8951=>675,8952=>807,8953=>807,8954=>1042,8955=>807,8956=>675,8957=>807,8958=>675,8959=>807, -8960=>542,8961=>542,8962=>644,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>411,8969=>411, -8970=>411,8971=>411,8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>484,8984=>835,8985=>754, -8988=>422,8989=>422,8990=>422,8991=>422,8992=>549,8993=>549,8996=>1037,8997=>1037,8998=>1272,8999=>1037, -9000=>1299,9003=>1272,9004=>786,9075=>351,9076=>644,9077=>782,9082=>618,9085=>776,9095=>1037,9108=>786, -9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450, -9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>549, -9166=>754,9167=>850,9187=>786,9189=>692,9250=>644,9251=>644,9312=>762,9313=>762,9314=>762,9315=>762, -9316=>762,9317=>762,9318=>762,9319=>762,9320=>762,9321=>762,9600=>692,9601=>692,9602=>692,9603=>692, -9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692, -9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692, -9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850, -9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610, -9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452, -9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452, -9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785, -9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785, -9684=>785,9685=>785,9686=>474,9687=>474,9688=>756,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348, -9694=>348,9695=>348,9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>575,9703=>850, -9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850, -9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747, -9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807, -9734=>807,9735=>515,9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125, -9744=>807,9745=>807,9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807, -9754=>807,9755=>807,9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807, -9764=>602,9765=>671,9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807, -9774=>807,9775=>807,9776=>807,9777=>807,9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807, -9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9789=>807,9790=>807,9791=>552,9792=>658,9793=>658, -9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807, -9804=>807,9805=>807,9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807, -9814=>807,9815=>807,9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807, -9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424, -9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807, -9844=>807,9845=>807,9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807, -9854=>807,9855=>807,9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807, -9864=>807,9865=>807,9866=>807,9867=>807,9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807, -9874=>807,9875=>807,9876=>807,9877=>487,9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807, -9884=>807,9888=>807,9889=>632,9890=>903,9891=>977,9892=>1028,9893=>811,9894=>754,9895=>754,9896=>754, -9897=>754,9898=>754,9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>658, -9907=>659,9908=>659,9909=>659,9910=>765,9911=>659,9912=>659,9985=>754,9986=>754,9987=>754,9988=>754, -9990=>754,9991=>754,9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754, -10002=>754,10003=>754,10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754, -10012=>754,10013=>754,10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754, -10022=>754,10023=>754,10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754, -10033=>754,10034=>754,10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754, -10043=>754,10044=>754,10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754, -10053=>754,10054=>754,10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807, -10065=>807,10066=>807,10070=>807,10072=>754,10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484, -10081=>754,10082=>754,10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754, -10091=>754,10092=>754,10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754, -10101=>754,10102=>762,10103=>762,10104=>762,10105=>762,10106=>762,10107=>762,10108=>762,10109=>762,10110=>762, -10111=>762,10112=>754,10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754, -10121=>754,10122=>754,10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754, -10131=>754,10132=>754,10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754, -10144=>754,10145=>754,10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754, -10154=>754,10155=>754,10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754, -10165=>754,10166=>754,10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754, -10181=>411,10182=>411,10208=>444,10214=>438,10215=>438,10216=>411,10217=>411,10218=>648,10219=>648,10224=>754, -10225=>754,10226=>754,10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290, -10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703, -10245=>703,10246=>703,10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703, -10255=>703,10256=>703,10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703, -10265=>703,10266=>703,10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703, -10275=>703,10276=>703,10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703, -10285=>703,10286=>703,10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703, -10295=>703,10296=>703,10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703, -10305=>703,10306=>703,10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703, -10315=>703,10316=>703,10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703, -10325=>703,10326=>703,10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703, -10335=>703,10336=>703,10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703, -10345=>703,10346=>703,10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703, -10355=>703,10356=>703,10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703, -10365=>703,10366=>703,10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703, -10375=>703,10376=>703,10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703, -10385=>703,10386=>703,10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703, -10395=>703,10396=>703,10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703, -10405=>703,10406=>703,10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703, -10415=>703,10416=>703,10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703, -10425=>703,10426=>703,10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703, -10435=>703,10436=>703,10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703, -10445=>703,10446=>703,10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703, -10455=>703,10456=>703,10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703, -10465=>703,10466=>703,10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703, -10475=>703,10476=>703,10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703, -10485=>703,10486=>703,10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703, -10495=>703,10502=>754,10503=>754,10506=>754,10507=>754,10560=>754,10561=>754,10627=>678,10628=>678,10702=>754, -10703=>941,10704=>941,10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754, -10752=>900,10753=>900,10754=>900,10764=>1495,10765=>506,10766=>506,10767=>506,10768=>506,10769=>506,10770=>506, -10771=>506,10772=>506,10773=>506,10774=>506,10775=>506,10776=>506,10777=>506,10778=>506,10779=>506,10780=>506, -10799=>754,10877=>754,10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754, -10886=>754,10887=>754,10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754, -10896=>754,10897=>754,10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754, -10906=>754,10907=>754,10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754, -10929=>754,10930=>754,10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754, -11001=>754,11002=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754, -11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754, -11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782, -11040=>782,11041=>786,11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>573,11361=>324,11362=>573, -11363=>659,11364=>693,11365=>607,11366=>430,11367=>860,11368=>641,11369=>697,11370=>598,11371=>652,11372=>523, -11373=>774,11374=>896,11375=>696,11377=>700,11378=>1099,11379=>950,11380=>586,11381=>628,11382=>508,11383=>704, -11385=>484,11386=>618,11387=>502,11388=>197,11389=>438,11800=>527,11810=>411,11811=>411,11812=>411,11813=>411, -11822=>522,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807,19912=>807, -19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807,19922=>807, -19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807,19932=>807, -19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807,19942=>807, -19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807,19952=>807, -19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807,19962=>807, -19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>648,42565=>536,42566=>392,42567=>396,42572=>1265, -42573=>1055,42576=>1110,42577=>924,42580=>1056,42581=>875,42582=>990,42583=>872,42594=>990,42595=>846,42596=>986, -42597=>823,42598=>1134,42599=>896,42600=>765,42601=>618,42602=>933,42603=>781,42604=>1266,42605=>995,42606=>865, -42634=>849,42635=>673,42636=>614,42637=>521,42644=>727,42645=>641,42760=>450,42761=>450,42762=>450,42763=>450, -42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450,42771=>450,42772=>450,42773=>450, -42774=>450,42779=>360,42780=>360,42781=>258,42782=>258,42783=>258,42790=>753,42791=>641,42792=>928,42793=>771, -42794=>626,42795=>501,42800=>502,42801=>536,42802=>1214,42803=>946,42804=>1156,42805=>958,42806=>1120,42807=>947, -42808=>971,42809=>830,42810=>971,42811=>830,42812=>932,42813=>830,42814=>628,42815=>494,42822=>765,42823=>488, -42824=>614,42825=>478,42826=>826,42827=>732,42830=>1266,42831=>995,42880=>573,42881=>308,42882=>753,42883=>641, -42889=>360,42890=>356,42891=>410,42892=>275,43003=>615,43004=>659,43005=>896,43006=>334,43007=>1192,62917=>618, -64256=>749,64257=>708,64258=>708,64259=>1024,64260=>1024,64261=>727,64262=>917,64275=>1249,64276=>1245,64277=>1240, -64278=>1245,64279=>1542,64285=>308,64286=>0,64287=>597,64288=>647,64289=>867,64290=>801,64291=>889,64292=>867, -64293=>844,64294=>889,64295=>889,64296=>878,64297=>754,64298=>854,64299=>854,64300=>854,64301=>854,64302=>676, -64303=>676,64304=>676,64305=>605,64306=>483,64307=>589,64308=>641,64309=>308,64310=>442,64312=>651,64313=>420, -64314=>584,64315=>584,64316=>611,64318=>698,64320=>447,64321=>696,64323=>646,64324=>618,64326=>676,64327=>656, -64328=>584,64329=>854,64330=>676,64331=>308,64332=>605,64333=>584,64334=>618,64335=>676,65024=>0,65025=>0, -65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0, -65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0, -65531=>0,65532=>0,65533=>1002); -$enc=''; -$diff=''; -$file='dejavusanscondensedbi.z'; -$ctg='dejavusanscondensedbi.ctg.z'; -$originalsize=493196; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.z deleted file mode 100644 index 7d570707..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedbi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.ctg.z deleted file mode 100644 index ac628b3e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.php deleted file mode 100644 index b2a62c04..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.php +++ /dev/null @@ -1,471 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>-39,'Flags'=>96,'FontBBox'=>'[-914 -350 1493 1068]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>540); -$up=-63; -$ut=44; -$dw=540; -$cw=array( -0=>540,32=>286,33=>360,34=>414,35=>754,36=>572,37=>855,38=>702,39=>247,40=>351, -41=>351,42=>450,43=>754,44=>286,45=>325,46=>286,47=>303,48=>572,49=>572,50=>572, -51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754, -61=>754,62=>754,63=>478,64=>900,65=>615,66=>617,67=>628,68=>693,69=>568,70=>518, -71=>697,72=>677,73=>265,74=>265,75=>590,76=>501,77=>776,78=>673,79=>708,80=>542, -81=>708,82=>625,83=>571,84=>549,85=>659,86=>615,87=>890,88=>616,89=>549,90=>616, -91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>551,98=>571,99=>495,100=>571, -101=>554,102=>316,103=>571,104=>570,105=>250,106=>250,107=>521,108=>250,109=>876,110=>570, -111=>550,112=>571,113=>571,114=>370,115=>469,116=>353,117=>570,118=>532,119=>736,120=>532, -121=>532,122=>472,123=>572,124=>303,125=>572,126=>754,8364=>572,8218=>286,402=>316,8222=>466, -8230=>900,8224=>450,8225=>450,710=>450,8240=>1215,352=>571,8249=>360,338=>962,381=>616,8216=>286, -8217=>286,8220=>466,8221=>466,8226=>531,8211=>450,8212=>900,732=>450,8482=>900,353=>469,8250=>360, -339=>925,382=>472,376=>549,160=>286,161=>360,162=>572,163=>572,164=>572,165=>572,166=>303, -167=>450,168=>450,169=>900,170=>424,171=>555,172=>754,173=>325,174=>900,175=>450,176=>450, -177=>754,178=>360,179=>360,180=>450,181=>572,182=>572,183=>286,184=>450,185=>360,186=>424, -187=>555,188=>872,189=>872,190=>872,191=>478,192=>615,193=>615,194=>615,195=>615,196=>615, -197=>615,198=>876,199=>628,200=>568,201=>568,202=>568,203=>568,204=>265,205=>265,206=>265, -207=>265,208=>697,209=>673,210=>708,211=>708,212=>708,213=>708,214=>708,215=>754,216=>708, -217=>659,218=>659,219=>659,220=>659,221=>549,222=>547,223=>567,224=>551,225=>551,226=>551, -227=>551,228=>551,229=>551,230=>896,231=>495,232=>554,233=>554,234=>554,235=>554,236=>250, -237=>250,238=>250,239=>250,240=>550,241=>570,242=>550,243=>550,244=>550,245=>550,246=>550, -247=>754,248=>550,249=>570,250=>570,251=>570,252=>570,253=>532,254=>571,255=>532,256=>615, -257=>551,258=>615,259=>551,260=>615,261=>551,262=>628,263=>495,264=>628,265=>495,266=>628, -267=>495,268=>628,269=>495,270=>693,271=>571,272=>697,273=>571,274=>568,275=>554,276=>568, -277=>554,278=>568,279=>554,280=>568,281=>554,282=>568,283=>554,284=>697,285=>571,286=>697, -287=>571,288=>697,289=>571,290=>697,291=>571,292=>677,293=>570,294=>824,295=>625,296=>265, -297=>250,298=>265,299=>250,300=>265,301=>250,302=>265,303=>250,304=>265,305=>250,306=>531, -307=>500,308=>265,309=>250,310=>590,311=>521,312=>521,313=>501,314=>250,315=>501,316=>250, -317=>501,318=>250,319=>501,320=>250,321=>505,322=>258,323=>673,324=>570,325=>673,326=>570, -327=>673,328=>570,329=>732,330=>673,331=>570,332=>708,333=>550,334=>708,335=>550,336=>708, -337=>550,340=>625,341=>370,342=>625,343=>370,344=>625,345=>370,346=>571,347=>469,348=>571, -349=>469,350=>571,351=>469,354=>549,355=>353,356=>549,357=>353,358=>549,359=>353,360=>659, -361=>570,362=>659,363=>570,364=>659,365=>570,366=>659,367=>570,368=>659,369=>570,370=>659, -371=>570,372=>890,373=>736,374=>549,375=>532,377=>616,378=>472,379=>616,380=>472,383=>316, -384=>571,385=>661,386=>617,387=>571,388=>617,389=>571,390=>633,391=>628,392=>495,393=>697, -394=>737,395=>617,396=>571,397=>550,398=>568,399=>708,400=>553,401=>518,403=>697,404=>618, -405=>885,406=>318,407=>265,408=>671,409=>521,410=>250,411=>532,412=>876,413=>673,414=>570, -415=>708,416=>822,417=>550,418=>844,419=>663,420=>586,421=>571,422=>625,423=>571,424=>469, -425=>568,426=>302,427=>353,428=>549,429=>353,430=>549,431=>754,432=>570,433=>688,434=>648, -435=>669,436=>657,437=>616,438=>472,439=>599,440=>599,441=>520,442=>472,443=>572,444=>599, -445=>520,446=>459,447=>571,448=>265,449=>443,450=>413,451=>266,452=>1310,453=>1165,454=>1043, -455=>767,456=>751,457=>500,458=>938,459=>923,460=>820,461=>615,462=>551,463=>265,464=>250, -465=>708,466=>550,467=>659,468=>570,469=>659,470=>570,471=>659,472=>570,473=>659,474=>570, -475=>659,476=>570,477=>554,478=>615,479=>551,480=>615,481=>551,482=>876,483=>896,484=>697, -485=>571,486=>697,487=>571,488=>590,489=>521,490=>708,491=>550,492=>708,493=>550,494=>599, -495=>472,496=>250,497=>1310,498=>1165,499=>1043,500=>697,501=>571,502=>1001,503=>614,504=>673, -505=>570,506=>615,507=>551,508=>876,509=>896,510=>708,511=>550,512=>615,513=>551,514=>615, -515=>551,516=>568,517=>554,518=>568,519=>554,520=>265,521=>250,522=>265,523=>250,524=>708, -525=>550,526=>708,527=>550,528=>625,529=>370,530=>625,531=>370,532=>659,533=>570,534=>659, -535=>570,536=>571,537=>469,538=>549,539=>353,540=>564,541=>469,542=>677,543=>570,544=>662, -545=>754,546=>628,547=>549,548=>616,549=>472,550=>615,551=>551,552=>568,553=>554,554=>708, -555=>550,556=>708,557=>550,558=>708,559=>550,560=>708,561=>550,562=>549,563=>532,564=>427, -565=>758,566=>429,567=>250,568=>898,569=>898,570=>615,571=>628,572=>495,573=>501,574=>549, -575=>469,576=>472,577=>542,578=>431,579=>617,580=>659,581=>615,582=>568,583=>554,584=>265, -585=>250,586=>703,587=>571,588=>625,589=>370,590=>549,591=>532,592=>551,593=>571,594=>571, -595=>571,596=>495,597=>495,598=>571,599=>654,600=>554,601=>554,602=>759,603=>490,604=>490, -605=>698,606=>598,607=>293,608=>626,609=>571,610=>566,611=>536,612=>536,613=>570,614=>570, -615=>570,616=>334,617=>348,618=>334,619=>356,620=>438,621=>250,622=>635,623=>876,624=>876, -625=>876,626=>581,627=>578,628=>570,629=>550,630=>772,631=>655,632=>593,633=>422,634=>422, -635=>422,636=>422,637=>422,638=>477,639=>477,640=>541,641=>541,642=>469,643=>302,644=>302, -645=>415,646=>302,647=>353,648=>353,649=>570,650=>556,651=>538,652=>532,653=>736,654=>532, -655=>549,656=>472,657=>472,658=>520,659=>520,660=>459,661=>459,662=>459,663=>459,664=>708, -665=>521,666=>598,667=>637,668=>588,669=>263,670=>600,671=>456,672=>654,673=>459,674=>459, -675=>913,676=>952,677=>911,678=>742,679=>549,680=>700,681=>763,682=>576,683=>589,684=>463, -685=>463,686=>513,687=>597,688=>359,689=>359,690=>157,691=>233,692=>266,693=>266,694=>341, -695=>463,696=>335,697=>250,698=>414,699=>286,700=>286,701=>286,702=>276,703=>276,704=>333, -705=>333,706=>450,707=>450,708=>450,709=>450,711=>450,712=>247,713=>450,714=>450,715=>450, -716=>247,717=>450,718=>450,719=>450,720=>303,721=>303,722=>276,723=>276,724=>450,725=>450, -726=>351,727=>286,728=>450,729=>450,730=>450,731=>450,733=>450,734=>284,735=>450,736=>383, -737=>149,738=>335,739=>399,740=>333,741=>444,742=>444,743=>444,744=>444,745=>444,748=>450, -749=>450,750=>466,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, -774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, -784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, -794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, -844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, -860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>589,881=>511,882=>775, -883=>583,884=>250,885=>250,886=>673,887=>584,890=>450,891=>494,892=>495,893=>494,894=>303, -900=>450,901=>450,902=>615,903=>286,904=>690,905=>813,906=>391,908=>755,910=>773,911=>814, -912=>304,913=>615,914=>617,915=>501,916=>615,917=>568,918=>616,919=>677,920=>708,921=>265, -922=>590,923=>615,924=>776,925=>673,926=>568,927=>708,928=>677,929=>542,931=>568,932=>549, -933=>549,934=>708,935=>616,936=>708,937=>688,938=>265,939=>549,940=>593,941=>486,942=>570, -943=>304,944=>521,945=>593,946=>574,947=>532,948=>550,949=>486,950=>489,951=>570,952=>550, -953=>304,954=>530,955=>532,956=>572,957=>502,958=>501,959=>550,960=>542,961=>571,962=>528, -963=>570,964=>542,965=>521,966=>593,967=>532,968=>593,969=>753,970=>304,971=>521,972=>550, -973=>521,974=>753,975=>590,976=>553,977=>557,978=>628,979=>758,980=>628,981=>593,982=>753, -983=>597,984=>708,985=>550,986=>583,987=>528,988=>518,989=>413,990=>593,991=>593,992=>778, -993=>564,994=>840,995=>753,996=>682,997=>593,998=>712,999=>553,1000=>618,1001=>546,1002=>690, -1003=>563,1004=>629,1005=>550,1006=>549,1007=>482,1008=>597,1009=>571,1010=>495,1011=>250,1012=>708, -1013=>554,1014=>554,1015=>547,1016=>571,1017=>628,1018=>776,1019=>585,1020=>571,1021=>633,1022=>628, -1023=>633,1024=>568,1025=>568,1026=>708,1027=>501,1028=>628,1029=>571,1030=>265,1031=>265,1032=>265, -1033=>984,1034=>940,1035=>708,1036=>639,1037=>673,1038=>548,1039=>677,1040=>615,1041=>617,1042=>617, -1043=>501,1044=>703,1045=>568,1046=>969,1047=>577,1048=>673,1049=>673,1050=>639,1051=>677,1052=>776, -1053=>677,1054=>708,1055=>677,1056=>542,1057=>628,1058=>549,1059=>548,1060=>774,1061=>616,1062=>699, -1063=>617,1064=>962,1065=>984,1066=>749,1067=>736,1068=>617,1069=>628,1070=>971,1071=>625,1072=>551, -1073=>555,1074=>530,1075=>473,1076=>622,1077=>554,1078=>811,1079=>479,1080=>584,1081=>584,1082=>543, -1083=>575,1084=>679,1085=>588,1086=>550,1087=>588,1088=>571,1089=>495,1090=>524,1091=>532,1092=>769, -1093=>532,1094=>612,1095=>532,1096=>823,1097=>848,1098=>636,1099=>710,1100=>530,1101=>494,1102=>757, -1103=>541,1104=>554,1105=>554,1106=>563,1107=>473,1108=>494,1109=>469,1110=>250,1111=>250,1112=>250, -1113=>812,1114=>809,1115=>586,1116=>543,1117=>584,1118=>532,1119=>588,1120=>840,1121=>753,1122=>693, -1123=>604,1124=>848,1125=>674,1126=>791,1127=>705,1128=>1043,1129=>901,1130=>708,1131=>550,1132=>924, -1133=>742,1134=>572,1135=>486,1136=>771,1137=>789,1138=>708,1139=>550,1140=>703,1141=>598,1142=>703, -1143=>598,1144=>893,1145=>813,1146=>857,1147=>682,1148=>1062,1149=>925,1150=>840,1151=>753,1152=>628, -1153=>495,1154=>452,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>673, -1163=>591,1164=>617,1165=>530,1166=>542,1167=>571,1168=>549,1169=>473,1170=>607,1171=>500,1172=>501, -1173=>441,1174=>969,1175=>811,1176=>577,1177=>479,1178=>639,1179=>543,1180=>639,1181=>543,1182=>639, -1183=>543,1184=>771,1185=>748,1186=>677,1187=>594,1188=>913,1189=>789,1190=>1002,1191=>855,1192=>801, -1193=>636,1194=>628,1195=>495,1196=>549,1197=>476,1198=>549,1199=>532,1200=>549,1201=>532,1202=>616, -1203=>532,1204=>840,1205=>726,1206=>617,1207=>532,1208=>617,1209=>532,1210=>617,1211=>570,1212=>836, -1213=>658,1214=>836,1215=>658,1216=>265,1217=>969,1218=>811,1219=>589,1220=>543,1221=>677,1222=>575, -1223=>677,1224=>594,1225=>677,1226=>594,1227=>617,1228=>532,1229=>776,1230=>679,1231=>250,1232=>615, -1233=>551,1234=>615,1235=>551,1236=>876,1237=>896,1238=>568,1239=>554,1240=>708,1241=>554,1242=>708, -1243=>554,1244=>969,1245=>811,1246=>577,1247=>479,1248=>599,1249=>520,1250=>673,1251=>584,1252=>673, -1253=>584,1254=>708,1255=>550,1256=>708,1257=>550,1258=>708,1259=>550,1260=>628,1261=>494,1262=>548, -1263=>532,1264=>548,1265=>532,1266=>548,1267=>532,1268=>617,1269=>532,1270=>501,1271=>442,1272=>736, -1273=>710,1274=>607,1275=>500,1276=>616,1277=>532,1278=>616,1279=>532,1280=>617,1281=>530,1282=>905, -1283=>807,1284=>877,1285=>782,1286=>611,1287=>529,1288=>964,1289=>861,1290=>1001,1291=>870,1292=>697, -1293=>593,1294=>695,1295=>640,1296=>553,1297=>486,1298=>677,1299=>575,1300=>1076,1301=>896,1302=>810, -1303=>780,1304=>927,1305=>890,1306=>708,1307=>571,1308=>890,1309=>736,1312=>1002,1313=>848,1314=>1002, -1315=>854,1316=>713,1317=>614,1329=>780,1330=>659,1331=>794,1332=>794,1333=>659,1334=>579,1335=>613, -1336=>659,1337=>765,1338=>794,1339=>659,1340=>501,1341=>741,1342=>888,1343=>659,1344=>636,1345=>579, -1346=>794,1347=>699,1348=>794,1349=>659,1350=>756,1351=>659,1352=>659,1353=>659,1354=>711,1355=>579, -1356=>794,1357=>659,1358=>794,1359=>571,1360=>659,1361=>659,1362=>719,1363=>774,1364=>711,1365=>708, -1366=>571,1369=>276,1370=>286,1371=>450,1372=>450,1373=>352,1374=>474,1375=>450,1377=>876,1378=>570, -1379=>686,1380=>690,1381=>570,1382=>627,1383=>479,1384=>570,1385=>630,1386=>627,1387=>570,1388=>363, -1389=>804,1390=>576,1391=>570,1392=>570,1393=>571,1394=>631,1395=>570,1396=>593,1397=>250,1398=>684, -1399=>464,1400=>570,1401=>407,1402=>876,1403=>464,1404=>691,1405=>570,1406=>626,1407=>876,1408=>570, -1409=>571,1410=>451,1411=>876,1412=>583,1413=>550,1414=>566,1415=>686,1417=>303,1418=>390,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>325,1471=>0,1472=>265,1473=>0,1474=>0,1475=>265,1478=>410, -1479=>0,1488=>566,1489=>547,1490=>403,1491=>534,1492=>576,1493=>245,1494=>336,1495=>576,1496=>583, -1497=>245,1498=>532,1499=>500,1500=>539,1501=>576,1502=>593,1503=>245,1504=>397,1505=>629,1506=>506, -1507=>576,1508=>543,1509=>468,1510=>523,1511=>596,1512=>532,1513=>727,1514=>591,1520=>423,1521=>409, -1522=>423,1523=>374,1524=>580,3647=>586,3713=>603,3714=>615,3716=>619,3719=>434,3720=>565,3722=>615, -3725=>619,3732=>577,3733=>577,3734=>605,3735=>589,3737=>576,3738=>533,3739=>533,3740=>670,3741=>690, -3742=>618,3743=>618,3745=>631,3746=>619,3747=>615,3749=>584,3751=>569,3754=>633,3755=>737,3757=>569, -3758=>615,3759=>708,3760=>569,3761=>0,3762=>485,3763=>485,3764=>0,3765=>0,3766=>0,3767=>0, -3768=>0,3769=>0,3771=>0,3772=>0,3773=>597,3776=>324,3777=>611,3778=>414,3779=>492,3780=>442, -3782=>606,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>572,3793=>576,3794=>576, -3795=>603,3796=>563,3797=>563,3798=>633,3799=>603,3800=>606,3801=>609,3804=>925,3805=>925,4256=>756, -4257=>621,4258=>577,4259=>683,4260=>532,4261=>617,4262=>710,4263=>729,4264=>420,4265=>508,4266=>710, -4267=>713,4268=>526,4269=>753,4270=>675,4271=>620,4272=>729,4273=>526,4274=>526,4275=>753,4276=>753, -4277=>581,4278=>543,4279=>526,4280=>536,4281=>526,4282=>649,4283=>715,4284=>526,4285=>510,4286=>526, -4287=>602,4288=>719,4289=>488,4290=>598,4291=>488,4292=>508,4293=>606,4304=>457,4305=>457,4306=>479, -4307=>706,4308=>470,4309=>465,4310=>457,4311=>717,4312=>457,4313=>466,4314=>952,4315=>470,4316=>470, -4317=>704,4318=>466,4319=>470,4320=>713,4321=>470,4322=>590,4323=>471,4324=>709,4325=>470,4326=>704, -4327=>470,4328=>470,4329=>470,4330=>510,4331=>470,4332=>470,4333=>439,4334=>470,4335=>448,4336=>465, -4337=>504,4338=>457,4339=>457,4340=>457,4341=>507,4342=>741,4343=>536,4344=>470,4345=>498,4346=>498, -4347=>527,4348=>273,5121=>615,5122=>615,5123=>615,5124=>615,5125=>692,5126=>692,5127=>692,5129=>692, -5130=>692,5131=>692,5132=>751,5133=>751,5134=>751,5135=>751,5136=>751,5137=>751,5138=>870,5139=>906, -5140=>870,5141=>906,5142=>692,5143=>870,5144=>906,5145=>870,5146=>906,5147=>692,5149=>230,5150=>488, -5151=>381,5152=>381,5153=>350,5154=>350,5155=>354,5156=>350,5157=>419,5158=>347,5159=>230,5160=>350, -5161=>350,5162=>350,5163=>980,5164=>817,5165=>857,5166=>1005,5167=>615,5168=>615,5169=>615,5170=>615, -5171=>656,5172=>656,5173=>656,5175=>656,5176=>656,5177=>656,5178=>751,5179=>615,5180=>751,5181=>751, -5182=>751,5183=>751,5184=>870,5185=>906,5186=>870,5187=>906,5188=>870,5189=>906,5190=>870,5191=>906, -5192=>656,5193=>457,5194=>172,5196=>659,5197=>659,5198=>659,5199=>659,5200=>657,5201=>657,5202=>657, -5204=>657,5205=>657,5206=>657,5207=>829,5208=>800,5209=>829,5210=>800,5211=>829,5212=>800,5213=>835, -5214=>810,5215=>835,5216=>810,5217=>853,5218=>810,5219=>853,5220=>810,5221=>853,5222=>391,5223=>790, -5224=>790,5225=>779,5226=>801,5227=>565,5228=>565,5229=>565,5230=>565,5231=>565,5232=>565,5233=>565, -5234=>565,5235=>565,5236=>773,5237=>693,5238=>733,5239=>734,5240=>733,5241=>734,5242=>773,5243=>693, -5244=>773,5245=>693,5246=>733,5247=>734,5248=>733,5249=>734,5250=>733,5251=>366,5252=>366,5253=>675, -5254=>697,5255=>675,5256=>697,5257=>565,5258=>565,5259=>565,5260=>565,5261=>565,5262=>565,5263=>565, -5264=>565,5265=>565,5266=>773,5267=>693,5268=>733,5269=>734,5270=>733,5271=>734,5272=>773,5273=>693, -5274=>773,5275=>693,5276=>733,5277=>734,5278=>733,5279=>734,5280=>733,5281=>391,5282=>391,5283=>549, -5284=>501,5285=>501,5286=>501,5287=>549,5288=>549,5289=>549,5290=>501,5291=>501,5292=>674,5293=>691, -5294=>671,5295=>687,5296=>671,5297=>687,5298=>674,5299=>691,5300=>674,5301=>691,5302=>671,5303=>687, -5304=>671,5305=>687,5306=>671,5307=>347,5308=>457,5309=>347,5312=>766,5313=>766,5314=>766,5315=>766, -5316=>766,5317=>766,5318=>766,5319=>766,5320=>766,5321=>962,5322=>931,5323=>953,5324=>766,5325=>953, -5326=>766,5327=>766,5328=>540,5329=>407,5330=>540,5331=>766,5332=>766,5333=>766,5334=>766,5335=>766, -5336=>766,5337=>766,5338=>766,5339=>766,5340=>962,5341=>931,5342=>953,5343=>927,5344=>953,5345=>927, -5346=>962,5347=>931,5348=>962,5349=>931,5350=>975,5351=>927,5352=>975,5353=>927,5354=>540,5356=>656, -5357=>542,5358=>542,5359=>542,5360=>542,5361=>542,5362=>542,5363=>542,5364=>542,5365=>542,5366=>751, -5367=>678,5368=>712,5369=>694,5370=>712,5371=>694,5372=>751,5373=>678,5374=>751,5375=>678,5376=>712, -5377=>694,5378=>712,5379=>694,5380=>712,5381=>376,5382=>378,5383=>376,5392=>641,5393=>641,5394=>641, -5395=>802,5396=>802,5397=>802,5398=>802,5399=>818,5400=>785,5401=>818,5402=>785,5403=>818,5404=>785, -5405=>1026,5406=>989,5407=>1026,5408=>989,5409=>1026,5410=>989,5411=>1026,5412=>989,5413=>576,5414=>564, -5415=>564,5416=>564,5417=>564,5418=>564,5419=>564,5420=>564,5421=>564,5422=>564,5423=>760,5424=>703, -5425=>734,5426=>736,5427=>734,5428=>736,5429=>760,5430=>703,5431=>760,5432=>703,5433=>734,5434=>736, -5435=>734,5436=>736,5437=>734,5438=>376,5440=>350,5441=>436,5442=>824,5443=>824,5444=>776,5445=>824, -5446=>776,5447=>776,5448=>542,5449=>542,5450=>542,5451=>542,5452=>542,5453=>542,5454=>751,5455=>678, -5456=>376,5458=>656,5459=>615,5460=>615,5461=>615,5462=>615,5463=>653,5464=>653,5465=>653,5466=>653, -5467=>831,5468=>906,5469=>457,5470=>659,5471=>659,5472=>659,5473=>659,5474=>659,5475=>659,5476=>657, -5477=>657,5478=>657,5479=>657,5480=>853,5481=>810,5482=>457,5492=>747,5493=>747,5494=>747,5495=>747, -5496=>747,5497=>747,5498=>747,5499=>507,5500=>677,5501=>436,5502=>942,5503=>942,5504=>942,5505=>942, -5506=>942,5507=>942,5508=>942,5509=>743,5514=>747,5515=>747,5516=>747,5517=>747,5518=>1133,5519=>1133, -5520=>1133,5521=>901,5522=>901,5523=>1133,5524=>1133,5525=>629,5526=>965,5536=>766,5537=>766,5538=>719, -5539=>719,5540=>719,5541=>719,5542=>540,5543=>579,5544=>579,5545=>579,5546=>579,5547=>579,5548=>579, -5549=>579,5550=>376,5551=>565,5598=>693,5601=>693,5702=>421,5703=>421,5742=>399,5743=>942,5744=>1178, -5745=>1469,5746=>1469,5747=>1237,5748=>1237,5749=>1469,5750=>1469,7424=>532,7425=>646,7426=>883,7427=>527, -7428=>495,7429=>544,7430=>544,7431=>441,7432=>486,7433=>250,7434=>355,7435=>521,7436=>524,7437=>679, -7438=>584,7439=>550,7440=>495,7441=>615,7442=>615,7443=>615,7444=>920,7446=>550,7447=>550,7448=>472, -7449=>541,7450=>541,7451=>524,7452=>517,7453=>663,7454=>853,7455=>574,7456=>532,7457=>736,7458=>472, -7459=>473,7462=>524,7463=>532,7464=>507,7465=>472,7466=>531,7467=>575,7468=>387,7469=>552,7470=>389, -7472=>436,7473=>358,7474=>358,7475=>439,7476=>426,7477=>167,7478=>167,7479=>372,7480=>315,7481=>489, -7482=>424,7483=>424,7484=>446,7485=>396,7486=>342,7487=>394,7488=>346,7489=>415,7490=>560,7491=>352, -7492=>352,7493=>365,7494=>583,7495=>385,7496=>365,7497=>375,7498=>375,7499=>324,7500=>323,7501=>365, -7502=>161,7503=>383,7504=>561,7505=>368,7506=>372,7507=>333,7508=>372,7509=>372,7510=>385,7511=>265, -7512=>364,7513=>422,7514=>561,7515=>375,7517=>361,7518=>335,7519=>347,7520=>374,7521=>327,7522=>161, -7523=>233,7524=>364,7525=>375,7526=>361,7527=>335,7528=>370,7529=>374,7530=>327,7543=>571,7544=>426, -7547=>334,7557=>250,7579=>365,7580=>333,7581=>333,7582=>372,7583=>324,7584=>267,7585=>209,7586=>365, -7587=>364,7588=>235,7589=>224,7590=>234,7591=>235,7592=>211,7593=>224,7594=>211,7595=>338,7596=>561, -7597=>561,7598=>369,7599=>431,7600=>368,7601=>372,7602=>372,7603=>324,7604=>258,7605=>265,7606=>457, -7607=>376,7608=>325,7609=>365,7610=>375,7611=>330,7612=>393,7613=>330,7614=>353,7615=>372,7620=>0, -7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>615,7681=>551,7682=>617,7683=>571,7684=>617, -7685=>571,7686=>617,7687=>571,7688=>628,7689=>495,7690=>693,7691=>571,7692=>693,7693=>571,7694=>693, -7695=>571,7696=>693,7697=>571,7698=>693,7699=>571,7700=>568,7701=>554,7702=>568,7703=>554,7704=>568, -7705=>554,7706=>568,7707=>554,7708=>568,7709=>554,7710=>518,7711=>316,7712=>697,7713=>571,7714=>677, -7715=>570,7716=>677,7717=>570,7718=>677,7719=>570,7720=>677,7721=>570,7722=>677,7723=>570,7724=>265, -7725=>250,7726=>265,7727=>250,7728=>590,7729=>521,7730=>590,7731=>521,7732=>590,7733=>521,7734=>501, -7735=>250,7736=>501,7737=>250,7738=>501,7739=>250,7740=>501,7741=>250,7742=>776,7743=>876,7744=>776, -7745=>876,7746=>776,7747=>876,7748=>673,7749=>570,7750=>673,7751=>570,7752=>673,7753=>570,7754=>673, -7755=>570,7756=>708,7757=>550,7758=>708,7759=>550,7760=>708,7761=>550,7762=>708,7763=>550,7764=>542, -7765=>571,7766=>542,7767=>571,7768=>625,7769=>370,7770=>625,7771=>370,7772=>625,7773=>370,7774=>625, -7775=>370,7776=>571,7777=>469,7778=>571,7779=>469,7780=>571,7781=>469,7782=>571,7783=>469,7784=>571, -7785=>469,7786=>549,7787=>353,7788=>549,7789=>353,7790=>549,7791=>353,7792=>549,7793=>353,7794=>659, -7795=>570,7796=>659,7797=>570,7798=>659,7799=>570,7800=>659,7801=>570,7802=>659,7803=>570,7804=>615, -7805=>532,7806=>615,7807=>532,7808=>890,7809=>736,7810=>890,7811=>736,7812=>890,7813=>736,7814=>890, -7815=>736,7816=>890,7817=>736,7818=>616,7819=>532,7820=>616,7821=>532,7822=>549,7823=>532,7824=>616, -7825=>472,7826=>616,7827=>472,7828=>616,7829=>472,7830=>570,7831=>353,7832=>736,7833=>532,7834=>551, -7835=>316,7838=>691,7839=>550,7840=>615,7841=>551,7842=>615,7843=>551,7844=>615,7845=>551,7846=>615, -7847=>551,7848=>615,7849=>551,7850=>615,7851=>551,7852=>615,7853=>551,7854=>615,7855=>551,7856=>615, -7857=>551,7858=>615,7859=>551,7860=>615,7861=>551,7862=>615,7863=>551,7864=>568,7865=>554,7866=>568, -7867=>554,7868=>568,7869=>554,7870=>568,7871=>554,7872=>568,7873=>554,7874=>568,7875=>554,7876=>568, -7877=>554,7878=>568,7879=>554,7880=>265,7881=>250,7882=>265,7883=>250,7884=>708,7885=>550,7886=>708, -7887=>550,7888=>708,7889=>550,7890=>708,7891=>550,7892=>708,7893=>550,7894=>708,7895=>550,7896=>708, -7897=>550,7898=>822,7899=>550,7900=>822,7901=>550,7902=>822,7903=>550,7904=>822,7905=>550,7906=>822, -7907=>550,7908=>659,7909=>570,7910=>659,7911=>570,7912=>754,7913=>570,7914=>754,7915=>570,7916=>754, -7917=>570,7918=>754,7919=>570,7920=>754,7921=>570,7922=>549,7923=>532,7924=>549,7925=>532,7926=>549, -7927=>532,7928=>549,7929=>532,7936=>593,7937=>593,7938=>593,7939=>593,7940=>593,7941=>593,7942=>593, -7943=>593,7944=>615,7945=>615,7946=>790,7947=>790,7948=>692,7949=>721,7950=>637,7951=>668,7952=>486, -7953=>486,7954=>486,7955=>486,7956=>486,7957=>486,7960=>640,7961=>640,7962=>869,7963=>877,7964=>809, -7965=>835,7968=>570,7969=>570,7970=>570,7971=>570,7972=>570,7973=>570,7974=>570,7975=>570,7976=>753, -7977=>751,7978=>977,7979=>980,7980=>924,7981=>945,7982=>840,7983=>852,7984=>304,7985=>304,7986=>304, -7987=>304,7988=>304,7989=>304,7990=>304,7991=>304,7992=>342,7993=>336,7994=>571,7995=>571,7996=>513, -7997=>540,7998=>440,7999=>443,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>724, -8009=>763,8010=>985,8011=>989,8012=>844,8013=>873,8016=>521,8017=>521,8018=>521,8019=>521,8020=>521, -8021=>521,8022=>521,8023=>521,8025=>705,8027=>897,8029=>911,8031=>808,8032=>753,8033=>753,8034=>753, -8035=>753,8036=>753,8037=>753,8038=>753,8039=>753,8040=>722,8041=>759,8042=>980,8043=>985,8044=>851, -8045=>875,8046=>829,8047=>857,8048=>593,8049=>593,8050=>486,8051=>493,8052=>570,8053=>589,8054=>304, -8055=>304,8056=>550,8057=>550,8058=>521,8059=>521,8060=>753,8061=>753,8064=>593,8065=>593,8066=>593, -8067=>593,8068=>593,8069=>593,8070=>593,8071=>593,8072=>615,8073=>615,8074=>790,8075=>790,8076=>692, -8077=>721,8078=>637,8079=>668,8080=>570,8081=>570,8082=>570,8083=>570,8084=>570,8085=>570,8086=>570, -8087=>570,8088=>753,8089=>751,8090=>977,8091=>980,8092=>924,8093=>945,8094=>840,8095=>852,8096=>753, -8097=>753,8098=>753,8099=>753,8100=>753,8101=>753,8102=>753,8103=>753,8104=>722,8105=>759,8106=>980, -8107=>985,8108=>851,8109=>875,8110=>829,8111=>857,8112=>593,8113=>593,8114=>593,8115=>593,8116=>593, -8118=>593,8119=>593,8120=>615,8121=>615,8122=>645,8123=>623,8124=>615,8125=>450,8126=>450,8127=>450, -8128=>450,8129=>450,8130=>570,8131=>570,8132=>589,8134=>570,8135=>570,8136=>724,8137=>671,8138=>837, -8139=>784,8140=>677,8141=>450,8142=>450,8143=>450,8144=>304,8145=>304,8146=>304,8147=>304,8150=>304, -8151=>304,8152=>265,8153=>265,8154=>427,8155=>367,8157=>450,8158=>450,8159=>450,8160=>521,8161=>521, -8162=>521,8163=>521,8164=>571,8165=>571,8166=>521,8167=>521,8168=>549,8169=>549,8170=>760,8171=>742, -8172=>616,8173=>450,8174=>450,8175=>450,8178=>753,8179=>753,8180=>753,8182=>753,8183=>753,8184=>847, -8185=>731,8186=>830,8187=>743,8188=>688,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900, -8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0, -8206=>0,8207=>0,8208=>325,8209=>325,8210=>572,8213=>900,8214=>450,8215=>450,8219=>286,8223=>466, -8227=>531,8228=>299,8229=>600,8231=>286,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180, -8241=>1521,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305,8251=>754,8252=>437, -8253=>478,8254=>450,8255=>723,8256=>723,8257=>225,8258=>900,8259=>450,8260=>150,8261=>351,8262=>351, -8263=>830,8264=>659,8265=>659,8266=>447,8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8272=>723, -8273=>450,8274=>404,8275=>900,8276=>723,8277=>754,8278=>527,8279=>597,8280=>754,8281=>754,8282=>286, -8283=>717,8284=>754,8285=>286,8286=>286,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, -8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>360,8305=>161,8308=>360,8309=>360, -8310=>360,8311=>360,8312=>360,8313=>360,8314=>475,8315=>475,8316=>475,8317=>221,8318=>221,8319=>359, -8320=>360,8321=>360,8322=>360,8323=>360,8324=>360,8325=>360,8326=>360,8327=>360,8328=>360,8329=>360, -8330=>475,8331=>475,8332=>475,8333=>221,8334=>221,8336=>352,8337=>375,8338=>372,8339=>399,8340=>375, -8352=>789,8353=>572,8354=>572,8355=>572,8356=>572,8357=>876,8358=>673,8359=>1143,8360=>966,8361=>890, -8362=>754,8363=>572,8365=>590,8366=>549,8367=>1145,8368=>572,8369=>572,8370=>572,8371=>572,8372=>696, -8373=>577,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>873,8449=>873, -8450=>628,8451=>1011,8452=>807,8453=>872,8454=>929,8455=>553,8456=>628,8457=>856,8459=>889,8460=>679, -8461=>765,8462=>570,8463=>570,8464=>422,8465=>627,8466=>648,8467=>372,8468=>736,8469=>721,8470=>936, -8471=>900,8472=>627,8473=>631,8474=>708,8475=>718,8476=>732,8477=>712,8478=>807,8479=>615,8480=>917, -8481=>912,8483=>615,8484=>670,8485=>520,8486=>688,8487=>688,8488=>554,8489=>304,8490=>590,8491=>615, -8492=>708,8493=>633,8494=>769,8495=>532,8496=>545,8497=>708,8498=>518,8499=>962,8500=>416,8501=>670, -8502=>606,8503=>419,8504=>580,8505=>342,8506=>833,8507=>1041,8508=>632,8509=>655,8510=>589,8511=>764, -8512=>729,8513=>697,8514=>501,8515=>501,8516=>549,8517=>737,8518=>637,8519=>554,8520=>316,8521=>316, -8523=>702,8526=>474,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872, -8539=>872,8540=>872,8541=>872,8542=>872,8543=>511,8544=>265,8545=>443,8546=>620,8547=>831,8548=>615, -8549=>830,8550=>1007,8551=>1185,8552=>826,8553=>616,8554=>839,8555=>1018,8556=>501,8557=>628,8558=>693, -8559=>776,8560=>250,8561=>412,8562=>573,8563=>730,8564=>532,8565=>729,8566=>892,8567=>1053,8568=>737, -8569=>532,8570=>740,8571=>901,8572=>250,8573=>495,8574=>571,8575=>876,8576=>1121,8577=>693,8578=>1121, -8579=>633,8580=>494,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754, -8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754, -8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754, -8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754, -8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754, -8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754, -8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754, -8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754, -8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754, -8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754, -8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754, -8700=>754,8701=>754,8702=>754,8703=>754,8704=>615,8705=>572,8706=>465,8707=>568,8708=>568,8709=>784, -8710=>602,8711=>602,8712=>784,8713=>784,8714=>646,8715=>784,8716=>784,8717=>646,8718=>572,8719=>681, -8720=>681,8721=>606,8722=>754,8723=>754,8724=>754,8725=>303,8726=>573,8727=>754,8728=>563,8729=>563, -8730=>573,8731=>573,8732=>573,8733=>643,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450, -8740=>450,8741=>450,8742=>450,8743=>659,8744=>659,8745=>659,8746=>659,8747=>469,8748=>710,8749=>951, -8750=>469,8751=>710,8752=>951,8753=>469,8754=>469,8755=>469,8756=>572,8757=>572,8758=>234,8759=>572, -8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754, -8770=>754,8771=>754,8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754, -8780=>754,8781=>754,8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>900,8789=>900, -8790=>754,8791=>754,8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754, -8800=>754,8801=>754,8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>754,8809=>754, -8810=>942,8811=>942,8812=>417,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754, -8820=>754,8821=>754,8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754, -8830=>754,8831=>754,8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754, -8840=>754,8841=>754,8842=>754,8843=>754,8844=>659,8845=>659,8846=>659,8847=>754,8848=>754,8849=>754, -8850=>754,8851=>702,8852=>702,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754, -8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>784,8867=>784,8868=>784,8869=>784, -8870=>468,8871=>468,8872=>784,8873=>784,8874=>784,8875=>784,8876=>784,8877=>784,8878=>784,8879=>784, -8880=>754,8881=>754,8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754, -8890=>468,8891=>659,8892=>659,8893=>659,8894=>754,8895=>754,8896=>738,8897=>738,8898=>738,8899=>738, -8900=>444,8901=>286,8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754, -8910=>659,8911=>659,8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754, -8920=>1280,8921=>1280,8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754, -8930=>754,8931=>754,8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754, -8940=>754,8941=>754,8942=>900,8943=>900,8944=>900,8945=>900,8946=>900,8947=>784,8948=>646,8949=>784, -8950=>784,8951=>646,8952=>784,8953=>784,8954=>900,8955=>784,8956=>646,8957=>784,8958=>646,8959=>784, -8960=>542,8961=>542,8962=>571,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>351,8969=>351, -8970=>351,8971=>351,8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>461,8984=>900,8985=>754, -8988=>422,8989=>422,8990=>422,8991=>422,8992=>469,8993=>469,8996=>1037,8997=>1037,8998=>1272,8999=>1037, -9000=>1299,9003=>1272,9004=>786,9075=>304,9076=>571,9077=>753,9082=>593,9085=>681,9095=>1037,9108=>786, -9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450, -9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>469, -9166=>754,9167=>850,9187=>786,9189=>692,9250=>571,9251=>571,9312=>807,9313=>807,9314=>807,9315=>807, -9316=>807,9317=>807,9318=>807,9319=>807,9320=>807,9321=>807,9472=>542,9473=>542,9474=>542,9475=>542, -9476=>542,9477=>542,9478=>542,9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542, -9486=>542,9487=>542,9488=>542,9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542, -9496=>542,9497=>542,9498=>542,9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542, -9506=>542,9507=>542,9508=>542,9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542, -9516=>542,9517=>542,9518=>542,9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542, -9526=>542,9527=>542,9528=>542,9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542, -9536=>542,9537=>542,9538=>542,9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542, -9546=>542,9547=>542,9548=>542,9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542, -9556=>542,9557=>542,9558=>542,9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542, -9566=>542,9567=>542,9568=>542,9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542, -9576=>542,9577=>542,9578=>542,9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542, -9586=>542,9587=>542,9588=>542,9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542, -9596=>542,9597=>542,9598=>542,9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692, -9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692, -9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692, -9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850, -9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850, -9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692, -9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692, -9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785, -9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785, -9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348, -9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850, -9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850, -9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659, -9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515, -9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807, -9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807, -9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671, -9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807, -9776=>800,9777=>800,9778=>800,9779=>800,9780=>800,9781=>800,9782=>800,9783=>800,9784=>807,9785=>807, -9786=>807,9787=>807,9788=>807,9789=>807,9790=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807, -9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807, -9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807, -9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807, -9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807, -9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807, -9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807, -9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>800,9863=>800,9864=>800,9865=>800, -9866=>800,9867=>800,9868=>800,9869=>800,9870=>800,9871=>800,9872=>675,9873=>675,9874=>800,9875=>734, -9876=>644,9877=>483,9878=>766,9879=>800,9880=>615,9881=>800,9882=>637,9883=>800,9884=>800,9888=>800, -9889=>632,9890=>903,9891=>977,9892=>1028,9893=>811,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754, -9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>658,9907=>659,9908=>659, -9909=>659,9910=>765,9911=>659,9912=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754, -9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754, -10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754, -10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754, -10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754, -10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754, -10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754, -10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807, -10070=>807,10072=>754,10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484,10081=>754,10082=>754, -10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754, -10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>807, -10103=>807,10104=>807,10105=>807,10106=>807,10107=>807,10108=>807,10109=>807,10110=>807,10111=>807,10112=>754, -10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754, -10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754, -10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754, -10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754, -10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754, -10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>351,10182=>351, -10208=>444,10214=>445,10215=>445,10216=>351,10217=>351,10218=>500,10219=>500,10224=>754,10225=>754,10226=>754, -10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290, -10237=>1290,10238=>1290,10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659, -10247=>659,10248=>659,10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659, -10257=>659,10258=>659,10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659, -10267=>659,10268=>659,10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659, -10277=>659,10278=>659,10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659, -10287=>659,10288=>659,10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659, -10297=>659,10298=>659,10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659, -10307=>659,10308=>659,10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659, -10317=>659,10318=>659,10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659, -10327=>659,10328=>659,10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659, -10337=>659,10338=>659,10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659, -10347=>659,10348=>659,10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659, -10357=>659,10358=>659,10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659, -10367=>659,10368=>659,10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659, -10377=>659,10378=>659,10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659, -10387=>659,10388=>659,10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659, -10397=>659,10398=>659,10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659, -10407=>659,10408=>659,10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659, -10417=>659,10418=>659,10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659, -10427=>659,10428=>659,10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659, -10437=>659,10438=>659,10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659, -10447=>659,10448=>659,10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659, -10457=>659,10458=>659,10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659, -10467=>659,10468=>659,10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659, -10477=>659,10478=>659,10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659, -10487=>659,10488=>659,10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10502=>754, -10503=>754,10506=>754,10507=>754,10560=>615,10561=>615,10627=>660,10628=>660,10702=>754,10703=>900,10704=>900, -10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900, -10754=>900,10764=>1192,10765=>469,10766=>469,10767=>469,10768=>469,10769=>469,10770=>469,10771=>469,10772=>469, -10773=>469,10774=>469,10775=>469,10776=>469,10777=>469,10778=>469,10779=>469,10780=>469,10799=>754,10877=>754, -10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754, -10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754, -10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754, -10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754, -10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754, -11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754, -11018=>754,11019=>754,11020=>754,11021=>754,11022=>752,11023=>752,11024=>752,11025=>752,11026=>850,11027=>850, -11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786, -11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>501,11361=>250,11362=>501,11363=>542,11364=>625, -11365=>551,11366=>353,11367=>677,11368=>570,11369=>590,11370=>521,11371=>616,11372=>472,11373=>703,11374=>776, -11375=>615,11377=>661,11378=>1015,11379=>865,11380=>532,11381=>589,11382=>511,11383=>593,11385=>373,11386=>550, -11387=>441,11388=>157,11389=>387,11800=>478,11810=>351,11811=>351,11812=>351,11813=>351,11822=>478,19904=>807, -19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807,19912=>807,19913=>807,19914=>807, -19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807,19922=>807,19923=>807,19924=>807, -19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807,19932=>807,19933=>807,19934=>807, -19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807,19942=>807,19943=>807,19944=>807, -19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807,19952=>807,19953=>807,19954=>807, -19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807,19962=>807,19963=>807,19964=>807, -19965=>807,19966=>807,19967=>807,42564=>571,42565=>469,42566=>318,42567=>304,42572=>1062,42573=>925,42576=>926, -42577=>815,42580=>971,42581=>757,42582=>886,42583=>762,42594=>922,42595=>833,42596=>912,42597=>810,42598=>776, -42599=>907,42600=>708,42601=>550,42602=>770,42603=>641,42604=>1222,42605=>917,42606=>791,42634=>725,42635=>649, -42636=>549,42637=>524,42644=>617,42645=>570,42760=>444,42761=>444,42762=>444,42763=>444,42764=>444,42765=>444, -42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444,42773=>444,42774=>444,42779=>332, -42780=>332,42781=>227,42782=>227,42783=>227,42790=>677,42791=>570,42792=>790,42793=>638,42794=>553,42795=>486, -42800=>441,42801=>469,42802=>1125,42803=>886,42804=>1097,42805=>900,42806=>1039,42807=>896,42808=>874,42809=>736, -42810=>874,42811=>736,42812=>863,42813=>736,42814=>628,42815=>494,42822=>612,42823=>353,42824=>523,42825=>384, -42826=>726,42827=>633,42830=>1222,42831=>917,42880=>501,42881=>250,42882=>662,42883=>570,42889=>303,42890=>338, -42891=>360,42892=>247,43003=>518,43004=>542,43005=>776,43006=>265,43007=>1079,63173=>550,64256=>649,64257=>581, -64258=>581,64259=>899,64260=>899,64261=>617,64262=>774,64275=>1081,64276=>1081,64277=>1076,64278=>1067,64279=>1376, -64285=>245,64286=>0,64287=>423,64288=>572,64289=>770,64290=>696,64291=>815,64292=>694,64293=>759,64294=>769, -64295=>726,64296=>788,64297=>754,64298=>727,64299=>727,64300=>727,64301=>727,64302=>566,64303=>566,64304=>566, -64305=>547,64306=>403,64307=>534,64308=>576,64309=>245,64310=>336,64311=>900,64312=>583,64313=>302,64314=>532, -64315=>500,64316=>539,64318=>593,64320=>397,64321=>629,64323=>576,64324=>543,64326=>523,64327=>596,64328=>532, -64329=>727,64330=>591,64331=>245,64332=>547,64333=>500,64334=>543,64335=>566,65024=>0,65025=>0,65026=>0, -65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0, -65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0,65531=>0, -65532=>0,65533=>923); -$enc=''; -$diff=''; -$file='dejavusanscondensedi.z'; -$ctg='dejavusanscondensedi.ctg.z'; -$originalsize=488440; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.z deleted file mode 100644 index cf9052bf..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusanscondensedi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.ctg.z deleted file mode 100644 index ac628b3e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.php deleted file mode 100644 index 721eab7b..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.php +++ /dev/null @@ -1,471 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>-43,'Flags'=>96,'FontBBox'=>'[-1016 -350 1659 1068]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>600); -$up=-63; -$ut=44; -$dw=600; -$cw=array( -0=>600,32=>318,33=>401,34=>460,35=>838,36=>636,37=>950,38=>780,39=>275,40=>390, -41=>390,42=>500,43=>838,44=>318,45=>361,46=>318,47=>337,48=>636,49=>636,50=>636, -51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838, -61=>838,62=>838,63=>531,64=>1000,65=>684,66=>686,67=>698,68=>770,69=>632,70=>575, -71=>775,72=>752,73=>295,74=>295,75=>656,76=>557,77=>863,78=>748,79=>787,80=>603, -81=>787,82=>695,83=>635,84=>611,85=>732,86=>684,87=>989,88=>685,89=>611,90=>685, -91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>613,98=>635,99=>550,100=>635, -101=>615,102=>352,103=>635,104=>634,105=>278,106=>278,107=>579,108=>278,109=>974,110=>634, -111=>612,112=>635,113=>635,114=>411,115=>521,116=>392,117=>634,118=>592,119=>818,120=>592, -121=>592,122=>525,123=>636,124=>337,125=>636,126=>838,8364=>636,8218=>318,402=>352,8222=>518, -8230=>1000,8224=>500,8225=>500,710=>500,8240=>1350,352=>635,8249=>400,338=>1070,381=>685,8216=>318, -8217=>318,8220=>518,8221=>518,8226=>590,8211=>500,8212=>1000,732=>500,8482=>1000,353=>521,8250=>400, -339=>1028,382=>525,376=>611,160=>318,161=>401,162=>636,163=>636,164=>636,165=>636,166=>337, -167=>500,168=>500,169=>1000,170=>471,171=>617,172=>838,173=>361,174=>1000,175=>500,176=>500, -177=>838,178=>401,179=>401,180=>500,181=>636,182=>636,183=>318,184=>500,185=>401,186=>471, -187=>617,188=>969,189=>969,190=>969,191=>531,192=>684,193=>684,194=>684,195=>684,196=>684, -197=>684,198=>974,199=>698,200=>632,201=>632,202=>632,203=>632,204=>295,205=>295,206=>295, -207=>295,208=>775,209=>748,210=>787,211=>787,212=>787,213=>787,214=>787,215=>838,216=>787, -217=>732,218=>732,219=>732,220=>732,221=>611,222=>608,223=>630,224=>613,225=>613,226=>613, -227=>613,228=>613,229=>613,230=>995,231=>550,232=>615,233=>615,234=>615,235=>615,236=>278, -237=>278,238=>278,239=>278,240=>612,241=>634,242=>612,243=>612,244=>612,245=>612,246=>612, -247=>838,248=>612,249=>634,250=>634,251=>634,252=>634,253=>592,254=>635,255=>592,256=>684, -257=>613,258=>684,259=>613,260=>684,261=>613,262=>698,263=>550,264=>698,265=>550,266=>698, -267=>550,268=>698,269=>550,270=>770,271=>635,272=>775,273=>635,274=>632,275=>615,276=>632, -277=>615,278=>632,279=>615,280=>632,281=>615,282=>632,283=>615,284=>775,285=>635,286=>775, -287=>635,288=>775,289=>635,290=>775,291=>635,292=>752,293=>634,294=>916,295=>695,296=>295, -297=>278,298=>295,299=>278,300=>295,301=>278,302=>295,303=>278,304=>295,305=>278,306=>590, -307=>556,308=>295,309=>278,310=>656,311=>579,312=>579,313=>557,314=>278,315=>557,316=>278, -317=>557,318=>278,319=>557,320=>278,321=>562,322=>287,323=>748,324=>634,325=>748,326=>634, -327=>748,328=>634,329=>813,330=>748,331=>634,332=>787,333=>612,334=>787,335=>612,336=>787, -337=>612,340=>695,341=>411,342=>695,343=>411,344=>695,345=>411,346=>635,347=>521,348=>635, -349=>521,350=>635,351=>521,354=>611,355=>392,356=>611,357=>392,358=>611,359=>392,360=>732, -361=>634,362=>732,363=>634,364=>732,365=>634,366=>732,367=>634,368=>732,369=>634,370=>732, -371=>634,372=>989,373=>818,374=>611,375=>592,377=>685,378=>525,379=>685,380=>525,383=>352, -384=>635,385=>735,386=>686,387=>635,388=>686,389=>635,390=>703,391=>698,392=>550,393=>775, -394=>819,395=>686,396=>635,397=>612,398=>632,399=>787,400=>614,401=>575,403=>775,404=>687, -405=>984,406=>354,407=>295,408=>746,409=>579,410=>278,411=>592,412=>974,413=>748,414=>634, -415=>787,416=>913,417=>612,418=>938,419=>737,420=>652,421=>635,422=>695,423=>635,424=>521, -425=>632,426=>336,427=>392,428=>611,429=>392,430=>611,431=>838,432=>634,433=>764,434=>721, -435=>744,436=>730,437=>685,438=>525,439=>666,440=>666,441=>578,442=>525,443=>636,444=>666, -445=>578,446=>510,447=>635,448=>295,449=>492,450=>459,451=>295,452=>1455,453=>1295,454=>1160, -455=>852,456=>835,457=>556,458=>1043,459=>1026,460=>912,461=>684,462=>613,463=>295,464=>278, -465=>787,466=>612,467=>732,468=>634,469=>732,470=>634,471=>732,472=>634,473=>732,474=>634, -475=>732,476=>634,477=>615,478=>684,479=>613,480=>684,481=>613,482=>974,483=>995,484=>775, -485=>635,486=>775,487=>635,488=>656,489=>579,490=>787,491=>612,492=>787,493=>612,494=>666, -495=>525,496=>278,497=>1455,498=>1295,499=>1160,500=>775,501=>635,502=>1113,503=>682,504=>748, -505=>634,506=>684,507=>613,508=>974,509=>995,510=>787,511=>612,512=>684,513=>613,514=>684, -515=>613,516=>632,517=>615,518=>632,519=>615,520=>295,521=>278,522=>295,523=>278,524=>787, -525=>612,526=>787,527=>612,528=>695,529=>411,530=>695,531=>411,532=>732,533=>634,534=>732, -535=>634,536=>635,537=>521,538=>611,539=>392,540=>627,541=>521,542=>752,543=>634,544=>735, -545=>838,546=>698,547=>610,548=>685,549=>525,550=>684,551=>613,552=>632,553=>615,554=>787, -555=>612,556=>787,557=>612,558=>787,559=>612,560=>787,561=>612,562=>611,563=>592,564=>475, -565=>843,566=>477,567=>278,568=>998,569=>998,570=>684,571=>698,572=>550,573=>557,574=>611, -575=>521,576=>525,577=>603,578=>479,579=>686,580=>732,581=>684,582=>632,583=>615,584=>295, -585=>278,586=>781,587=>635,588=>695,589=>411,590=>611,591=>592,592=>613,593=>635,594=>635, -595=>635,596=>550,597=>550,598=>635,599=>727,600=>615,601=>615,602=>844,603=>545,604=>545, -605=>775,606=>664,607=>326,608=>696,609=>635,610=>629,611=>596,612=>596,613=>634,614=>634, -615=>634,616=>372,617=>387,618=>372,619=>396,620=>487,621=>278,622=>706,623=>974,624=>974, -625=>974,626=>646,627=>642,628=>634,629=>612,630=>858,631=>728,632=>660,633=>469,634=>469, -635=>469,636=>469,637=>469,638=>530,639=>530,640=>602,641=>602,642=>521,643=>336,644=>336, -645=>461,646=>336,647=>392,648=>392,649=>634,650=>618,651=>598,652=>592,653=>818,654=>592, -655=>611,656=>525,657=>525,658=>578,659=>578,660=>510,661=>510,662=>510,663=>510,664=>787, -665=>580,666=>664,667=>708,668=>654,669=>292,670=>667,671=>507,672=>727,673=>510,674=>510, -675=>1014,676=>1058,677=>1013,678=>824,679=>610,680=>778,681=>848,682=>641,683=>654,684=>515, -685=>515,686=>570,687=>664,688=>399,689=>399,690=>175,691=>259,692=>295,693=>296,694=>379, -695=>515,696=>373,697=>278,698=>460,699=>318,700=>318,701=>318,702=>307,703=>307,704=>370, -705=>370,706=>500,707=>500,708=>500,709=>500,711=>500,712=>275,713=>500,714=>500,715=>500, -716=>275,717=>500,718=>500,719=>500,720=>337,721=>337,722=>307,723=>307,724=>500,725=>500, -726=>390,727=>317,728=>500,729=>500,730=>500,731=>500,733=>500,734=>315,735=>500,736=>426, -737=>166,738=>373,739=>444,740=>370,741=>493,742=>493,743=>493,744=>493,745=>493,748=>500, -749=>500,750=>518,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, -774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, -784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, -794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, -844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, -860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>654,881=>568,882=>862, -883=>647,884=>278,885=>278,886=>748,887=>650,890=>500,891=>549,892=>550,893=>549,894=>337, -900=>500,901=>500,902=>684,903=>318,904=>767,905=>903,906=>435,908=>839,910=>860,911=>905, -912=>338,913=>684,914=>686,915=>557,916=>684,917=>632,918=>685,919=>752,920=>787,921=>295, -922=>656,923=>684,924=>863,925=>748,926=>632,927=>787,928=>752,929=>603,931=>632,932=>611, -933=>611,934=>787,935=>685,936=>787,937=>764,938=>295,939=>611,940=>659,941=>541,942=>634, -943=>338,944=>579,945=>659,946=>638,947=>592,948=>612,949=>541,950=>544,951=>634,952=>612, -953=>338,954=>589,955=>592,956=>636,957=>559,958=>558,959=>612,960=>602,961=>635,962=>587, -963=>634,964=>602,965=>579,966=>660,967=>592,968=>660,969=>837,970=>338,971=>579,972=>612, -973=>579,974=>837,975=>656,976=>614,977=>619,978=>699,979=>842,980=>699,981=>660,982=>837, -983=>664,984=>787,985=>612,986=>648,987=>587,988=>575,989=>458,990=>660,991=>660,992=>865, -993=>627,994=>934,995=>837,996=>758,997=>659,998=>792,999=>615,1000=>687,1001=>607,1002=>768, -1003=>625,1004=>699,1005=>612,1006=>611,1007=>536,1008=>664,1009=>635,1010=>550,1011=>278,1012=>787, -1013=>615,1014=>615,1015=>608,1016=>635,1017=>698,1018=>863,1019=>651,1020=>635,1021=>703,1022=>698, -1023=>703,1024=>632,1025=>632,1026=>786,1027=>557,1028=>698,1029=>635,1030=>295,1031=>295,1032=>295, -1033=>1094,1034=>1045,1035=>786,1036=>710,1037=>748,1038=>609,1039=>752,1040=>684,1041=>686,1042=>686, -1043=>557,1044=>781,1045=>632,1046=>1077,1047=>641,1048=>748,1049=>748,1050=>710,1051=>752,1052=>863, -1053=>752,1054=>787,1055=>752,1056=>603,1057=>698,1058=>611,1059=>609,1060=>861,1061=>685,1062=>776, -1063=>686,1064=>1069,1065=>1094,1066=>833,1067=>818,1068=>686,1069=>698,1070=>1080,1071=>695,1072=>613, -1073=>617,1074=>589,1075=>525,1076=>691,1077=>615,1078=>901,1079=>532,1080=>650,1081=>650,1082=>604, -1083=>639,1084=>754,1085=>654,1086=>612,1087=>654,1088=>635,1089=>550,1090=>583,1091=>592,1092=>855, -1093=>592,1094=>681,1095=>591,1096=>915,1097=>942,1098=>707,1099=>790,1100=>589,1101=>549,1102=>842, -1103=>602,1104=>615,1105=>615,1106=>625,1107=>525,1108=>549,1109=>521,1110=>278,1111=>278,1112=>278, -1113=>902,1114=>898,1115=>652,1116=>604,1117=>650,1118=>592,1119=>654,1120=>934,1121=>837,1122=>771, -1123=>672,1124=>942,1125=>749,1126=>879,1127=>783,1128=>1160,1129=>1001,1130=>787,1131=>612,1132=>1027, -1133=>824,1134=>636,1135=>541,1136=>856,1137=>876,1138=>787,1139=>612,1140=>781,1141=>665,1142=>781, -1143=>665,1144=>992,1145=>904,1146=>953,1147=>758,1148=>1180,1149=>1028,1150=>934,1151=>837,1152=>698, -1153=>550,1154=>502,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>748, -1163=>657,1164=>686,1165=>589,1166=>603,1167=>635,1168=>610,1169=>525,1170=>675,1171=>556,1172=>557, -1173=>491,1174=>1077,1175=>901,1176=>641,1177=>532,1178=>710,1179=>604,1180=>710,1181=>604,1182=>710, -1183=>604,1184=>856,1185=>832,1186=>752,1187=>661,1188=>1014,1189=>877,1190=>1113,1191=>950,1192=>890, -1193=>707,1194=>698,1195=>550,1196=>611,1197=>529,1198=>611,1199=>592,1200=>611,1201=>592,1202=>685, -1203=>592,1204=>934,1205=>807,1206=>686,1207=>591,1208=>686,1209=>591,1210=>686,1211=>634,1212=>929, -1213=>731,1214=>929,1215=>731,1216=>295,1217=>1077,1218=>901,1219=>655,1220=>604,1221=>752,1222=>639, -1223=>752,1224=>661,1225=>752,1226=>661,1227=>686,1228=>591,1229=>863,1230=>754,1231=>278,1232=>684, -1233=>613,1234=>684,1235=>613,1236=>974,1237=>995,1238=>632,1239=>615,1240=>787,1241=>615,1242=>787, -1243=>615,1244=>1077,1245=>901,1246=>641,1247=>532,1248=>666,1249=>578,1250=>748,1251=>650,1252=>748, -1253=>650,1254=>787,1255=>612,1256=>787,1257=>612,1258=>787,1259=>612,1260=>698,1261=>549,1262=>609, -1263=>592,1264=>609,1265=>592,1266=>609,1267=>592,1268=>686,1269=>591,1270=>557,1271=>491,1272=>818, -1273=>790,1274=>675,1275=>556,1276=>685,1277=>592,1278=>685,1279=>592,1280=>686,1281=>589,1282=>1006, -1283=>897,1284=>975,1285=>869,1286=>679,1287=>588,1288=>1072,1289=>957,1290=>1113,1291=>967,1292=>775, -1293=>660,1294=>773,1295=>711,1296=>614,1297=>541,1298=>752,1299=>639,1300=>1195,1301=>997,1302=>900, -1303=>867,1304=>1031,1305=>989,1306=>787,1307=>635,1308=>989,1309=>818,1312=>1113,1313=>942,1314=>1113, -1315=>949,1316=>793,1317=>683,1329=>867,1330=>732,1331=>882,1332=>882,1333=>732,1334=>644,1335=>682, -1336=>732,1337=>851,1338=>882,1339=>732,1340=>557,1341=>824,1342=>986,1343=>732,1344=>707,1345=>644, -1346=>882,1347=>777,1348=>882,1349=>732,1350=>840,1351=>732,1352=>732,1353=>732,1354=>791,1355=>644, -1356=>882,1357=>732,1358=>882,1359=>635,1360=>732,1361=>732,1362=>799,1363=>861,1364=>790,1365=>787, -1366=>635,1369=>307,1370=>318,1371=>500,1372=>500,1373=>392,1374=>526,1375=>500,1377=>974,1378=>634, -1379=>762,1380=>767,1381=>634,1382=>697,1383=>533,1384=>634,1385=>700,1386=>697,1387=>634,1388=>404, -1389=>894,1390=>641,1391=>634,1392=>634,1393=>635,1394=>702,1395=>634,1396=>659,1397=>278,1398=>760, -1399=>516,1400=>634,1401=>453,1402=>974,1403=>516,1404=>769,1405=>634,1406=>696,1407=>974,1408=>634, -1409=>635,1410=>501,1411=>974,1412=>648,1413=>612,1414=>629,1415=>763,1417=>337,1418=>433,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>361,1471=>0,1472=>295,1473=>0,1474=>0,1475=>295,1478=>456, -1479=>0,1488=>629,1489=>608,1490=>448,1491=>594,1492=>640,1493=>272,1494=>374,1495=>640,1496=>648, -1497=>272,1498=>592,1499=>556,1500=>599,1501=>640,1502=>659,1503=>272,1504=>441,1505=>700,1506=>563, -1507=>640,1508=>604,1509=>521,1510=>581,1511=>663,1512=>592,1513=>808,1514=>657,1520=>471,1521=>454, -1522=>471,1523=>416,1524=>645,3647=>652,3713=>670,3714=>684,3716=>688,3719=>482,3720=>628,3722=>684, -3725=>688,3732=>642,3733=>642,3734=>672,3735=>655,3737=>641,3738=>592,3739=>592,3740=>745,3741=>767, -3742=>687,3743=>687,3745=>702,3746=>688,3747=>684,3749=>649,3751=>632,3754=>703,3755=>819,3757=>633, -3758=>684,3759=>788,3760=>632,3761=>0,3762=>539,3763=>539,3764=>0,3765=>0,3766=>0,3767=>0, -3768=>0,3769=>0,3771=>0,3772=>0,3773=>663,3776=>360,3777=>679,3778=>460,3779=>547,3780=>491, -3782=>674,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>636,3793=>641,3794=>641, -3795=>670,3796=>625,3797=>625,3798=>703,3799=>670,3800=>674,3801=>677,3804=>1028,3805=>1028,4256=>840, -4257=>690,4258=>642,4259=>759,4260=>591,4261=>686,4262=>789,4263=>811,4264=>467,4265=>565,4266=>789, -4267=>793,4268=>584,4269=>837,4270=>750,4271=>688,4272=>811,4273=>584,4274=>584,4275=>837,4276=>837, -4277=>646,4278=>604,4279=>584,4280=>596,4281=>584,4282=>721,4283=>795,4284=>584,4285=>566,4286=>584, -4287=>669,4288=>799,4289=>542,4290=>664,4291=>542,4292=>565,4293=>674,4304=>508,4305=>508,4306=>533, -4307=>785,4308=>522,4309=>517,4310=>508,4311=>797,4312=>507,4313=>518,4314=>1058,4315=>522,4316=>523, -4317=>783,4318=>518,4319=>523,4320=>792,4321=>523,4322=>656,4323=>524,4324=>788,4325=>523,4326=>782, -4327=>523,4328=>522,4329=>522,4330=>566,4331=>523,4332=>523,4333=>489,4334=>522,4335=>498,4336=>517, -4337=>560,4338=>508,4339=>508,4340=>508,4341=>563,4342=>824,4343=>595,4344=>522,4345=>554,4346=>553, -4347=>586,4348=>304,5121=>684,5122=>684,5123=>684,5124=>684,5125=>769,5126=>769,5127=>769,5129=>769, -5130=>769,5131=>769,5132=>835,5133=>834,5134=>835,5135=>834,5136=>835,5137=>834,5138=>967,5139=>1007, -5140=>967,5141=>1007,5142=>769,5143=>967,5144=>1007,5145=>967,5146=>1007,5147=>769,5149=>256,5150=>543, -5151=>423,5152=>423,5153=>389,5154=>389,5155=>393,5156=>389,5157=>466,5158=>385,5159=>256,5160=>389, -5161=>389,5162=>389,5163=>1090,5164=>909,5165=>953,5166=>1117,5167=>684,5168=>684,5169=>684,5170=>684, -5171=>729,5172=>729,5173=>729,5175=>729,5176=>729,5177=>729,5178=>835,5179=>684,5180=>835,5181=>834, -5182=>835,5183=>834,5184=>967,5185=>1007,5186=>967,5187=>1007,5188=>967,5189=>1007,5190=>967,5191=>1007, -5192=>729,5193=>508,5194=>192,5196=>732,5197=>732,5198=>732,5199=>732,5200=>730,5201=>730,5202=>730, -5204=>730,5205=>730,5206=>730,5207=>921,5208=>889,5209=>921,5210=>889,5211=>921,5212=>889,5213=>928, -5214=>900,5215=>928,5216=>900,5217=>947,5218=>900,5219=>947,5220=>900,5221=>947,5222=>434,5223=>877, -5224=>877,5225=>866,5226=>890,5227=>628,5228=>628,5229=>628,5230=>628,5231=>628,5232=>628,5233=>628, -5234=>628,5235=>628,5236=>860,5237=>771,5238=>815,5239=>816,5240=>815,5241=>816,5242=>860,5243=>771, -5244=>860,5245=>771,5246=>815,5247=>816,5248=>815,5249=>816,5250=>815,5251=>407,5252=>407,5253=>750, -5254=>775,5255=>750,5256=>775,5257=>628,5258=>628,5259=>628,5260=>628,5261=>628,5262=>628,5263=>628, -5264=>628,5265=>628,5266=>860,5267=>771,5268=>815,5269=>816,5270=>815,5271=>816,5272=>860,5273=>771, -5274=>860,5275=>771,5276=>815,5277=>816,5278=>815,5279=>816,5280=>815,5281=>435,5282=>435,5283=>610, -5284=>557,5285=>557,5286=>557,5287=>610,5288=>610,5289=>610,5290=>557,5291=>557,5292=>749,5293=>769, -5294=>746,5295=>764,5296=>746,5297=>764,5298=>749,5299=>769,5300=>749,5301=>769,5302=>746,5303=>764, -5304=>746,5305=>764,5306=>746,5307=>386,5308=>508,5309=>386,5312=>852,5313=>852,5314=>852,5315=>852, -5316=>852,5317=>852,5318=>852,5319=>852,5320=>852,5321=>1069,5322=>1035,5323=>1059,5324=>852,5325=>1059, -5326=>852,5327=>852,5328=>600,5329=>453,5330=>600,5331=>852,5332=>852,5333=>852,5334=>852,5335=>852, -5336=>852,5337=>852,5338=>852,5339=>852,5340=>1069,5341=>1035,5342=>1059,5343=>1030,5344=>1059,5345=>1030, -5346=>1069,5347=>1035,5348=>1069,5349=>1035,5350=>1083,5351=>1030,5352=>1083,5353=>1030,5354=>600,5356=>729, -5357=>603,5358=>603,5359=>603,5360=>603,5361=>603,5362=>603,5363=>603,5364=>603,5365=>603,5366=>834, -5367=>754,5368=>792,5369=>771,5370=>792,5371=>771,5372=>834,5373=>754,5374=>834,5375=>754,5376=>792, -5377=>771,5378=>792,5379=>771,5380=>792,5381=>418,5382=>420,5383=>418,5392=>712,5393=>712,5394=>712, -5395=>892,5396=>892,5397=>892,5398=>892,5399=>910,5400=>872,5401=>910,5402=>872,5403=>910,5404=>872, -5405=>1140,5406=>1100,5407=>1140,5408=>1100,5409=>1140,5410=>1100,5411=>1140,5412=>1100,5413=>641,5414=>627, -5415=>627,5416=>627,5417=>627,5418=>627,5419=>627,5420=>627,5421=>627,5422=>627,5423=>844,5424=>781, -5425=>816,5426=>818,5427=>816,5428=>818,5429=>844,5430=>781,5431=>844,5432=>781,5433=>816,5434=>818, -5435=>816,5436=>818,5437=>816,5438=>418,5440=>389,5441=>484,5442=>916,5443=>916,5444=>863,5445=>916, -5446=>863,5447=>863,5448=>603,5449=>603,5450=>603,5451=>603,5452=>603,5453=>603,5454=>834,5455=>754, -5456=>418,5458=>729,5459=>684,5460=>684,5461=>684,5462=>684,5463=>726,5464=>726,5465=>726,5466=>726, -5467=>924,5468=>1007,5469=>508,5470=>732,5471=>732,5472=>732,5473=>732,5474=>732,5475=>732,5476=>730, -5477=>730,5478=>730,5479=>730,5480=>947,5481=>900,5482=>508,5492=>831,5493=>831,5494=>831,5495=>831, -5496=>831,5497=>831,5498=>831,5499=>563,5500=>752,5501=>484,5502=>1047,5503=>1047,5504=>1047,5505=>1047, -5506=>1047,5507=>1047,5508=>1047,5509=>825,5514=>831,5515=>831,5516=>831,5517=>831,5518=>1259,5519=>1259, -5520=>1259,5521=>1002,5522=>1002,5523=>1259,5524=>1259,5525=>700,5526=>1073,5536=>852,5537=>852,5538=>799, -5539=>799,5540=>799,5541=>799,5542=>600,5543=>643,5544=>643,5545=>643,5546=>643,5547=>643,5548=>643, -5549=>643,5550=>418,5551=>628,5598=>770,5601=>770,5702=>468,5703=>468,5742=>444,5743=>1047,5744=>1310, -5745=>1632,5746=>1632,5747=>1375,5748=>1375,5749=>1632,5750=>1632,7424=>592,7425=>717,7426=>982,7427=>586, -7428=>550,7429=>605,7430=>605,7431=>491,7432=>541,7433=>278,7434=>395,7435=>579,7436=>583,7437=>754, -7438=>650,7439=>612,7440=>550,7441=>684,7442=>684,7443=>684,7444=>1023,7446=>612,7447=>612,7448=>524, -7449=>602,7450=>602,7451=>583,7452=>574,7453=>737,7454=>948,7455=>638,7456=>592,7457=>818,7458=>525, -7459=>526,7462=>583,7463=>592,7464=>564,7465=>524,7466=>590,7467=>639,7468=>431,7469=>613,7470=>432, -7472=>485,7473=>398,7474=>398,7475=>488,7476=>474,7477=>186,7478=>186,7479=>413,7480=>351,7481=>543, -7482=>471,7483=>471,7484=>496,7485=>439,7486=>380,7487=>438,7488=>385,7489=>461,7490=>623,7491=>392, -7492=>392,7493=>405,7494=>648,7495=>428,7496=>405,7497=>417,7498=>417,7499=>360,7500=>359,7501=>405, -7502=>179,7503=>426,7504=>623,7505=>409,7506=>414,7507=>370,7508=>414,7509=>414,7510=>428,7511=>295, -7512=>405,7513=>470,7514=>623,7515=>417,7517=>402,7518=>373,7519=>385,7520=>416,7521=>364,7522=>179, -7523=>259,7524=>405,7525=>417,7526=>402,7527=>373,7528=>412,7529=>416,7530=>364,7543=>635,7544=>474, -7547=>372,7557=>278,7579=>405,7580=>370,7581=>370,7582=>414,7583=>360,7584=>296,7585=>233,7586=>405, -7587=>405,7588=>261,7589=>250,7590=>261,7591=>261,7592=>234,7593=>250,7594=>235,7595=>376,7596=>623, -7597=>623,7598=>411,7599=>479,7600=>409,7601=>414,7602=>414,7603=>360,7604=>287,7605=>295,7606=>508, -7607=>418,7608=>361,7609=>406,7610=>417,7611=>366,7612=>437,7613=>366,7614=>392,7615=>414,7620=>0, -7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>684,7681=>613,7682=>686,7683=>635,7684=>686, -7685=>635,7686=>686,7687=>635,7688=>698,7689=>550,7690=>770,7691=>635,7692=>770,7693=>635,7694=>770, -7695=>635,7696=>770,7697=>635,7698=>770,7699=>635,7700=>632,7701=>615,7702=>632,7703=>615,7704=>632, -7705=>615,7706=>632,7707=>615,7708=>632,7709=>615,7710=>575,7711=>352,7712=>775,7713=>635,7714=>752, -7715=>634,7716=>752,7717=>634,7718=>752,7719=>634,7720=>752,7721=>634,7722=>752,7723=>634,7724=>295, -7725=>278,7726=>295,7727=>278,7728=>656,7729=>579,7730=>656,7731=>579,7732=>656,7733=>579,7734=>557, -7735=>278,7736=>557,7737=>278,7738=>557,7739=>278,7740=>557,7741=>278,7742=>863,7743=>974,7744=>863, -7745=>974,7746=>863,7747=>974,7748=>748,7749=>634,7750=>748,7751=>634,7752=>748,7753=>634,7754=>748, -7755=>634,7756=>787,7757=>612,7758=>787,7759=>612,7760=>787,7761=>612,7762=>787,7763=>612,7764=>603, -7765=>635,7766=>603,7767=>635,7768=>695,7769=>411,7770=>695,7771=>411,7772=>695,7773=>411,7774=>695, -7775=>411,7776=>635,7777=>521,7778=>635,7779=>521,7780=>635,7781=>521,7782=>635,7783=>521,7784=>635, -7785=>521,7786=>611,7787=>392,7788=>611,7789=>392,7790=>611,7791=>392,7792=>611,7793=>392,7794=>732, -7795=>634,7796=>732,7797=>634,7798=>732,7799=>634,7800=>732,7801=>634,7802=>732,7803=>634,7804=>684, -7805=>592,7806=>684,7807=>592,7808=>989,7809=>818,7810=>989,7811=>818,7812=>989,7813=>818,7814=>989, -7815=>818,7816=>989,7817=>818,7818=>685,7819=>592,7820=>685,7821=>592,7822=>611,7823=>592,7824=>685, -7825=>525,7826=>685,7827=>525,7828=>685,7829=>525,7830=>634,7831=>392,7832=>818,7833=>592,7834=>613, -7835=>352,7838=>769,7839=>612,7840=>684,7841=>613,7842=>684,7843=>613,7844=>684,7845=>613,7846=>684, -7847=>613,7848=>684,7849=>613,7850=>684,7851=>613,7852=>684,7853=>613,7854=>684,7855=>613,7856=>684, -7857=>613,7858=>684,7859=>613,7860=>684,7861=>613,7862=>684,7863=>613,7864=>632,7865=>615,7866=>632, -7867=>615,7868=>632,7869=>615,7870=>632,7871=>615,7872=>632,7873=>615,7874=>632,7875=>615,7876=>632, -7877=>615,7878=>632,7879=>615,7880=>295,7881=>278,7882=>295,7883=>278,7884=>787,7885=>612,7886=>787, -7887=>612,7888=>787,7889=>612,7890=>787,7891=>612,7892=>787,7893=>612,7894=>787,7895=>612,7896=>787, -7897=>612,7898=>913,7899=>612,7900=>913,7901=>612,7902=>913,7903=>612,7904=>913,7905=>612,7906=>913, -7907=>612,7908=>732,7909=>634,7910=>732,7911=>634,7912=>838,7913=>634,7914=>838,7915=>634,7916=>838, -7917=>634,7918=>838,7919=>634,7920=>838,7921=>634,7922=>611,7923=>592,7924=>611,7925=>592,7926=>611, -7927=>592,7928=>611,7929=>592,7936=>659,7937=>659,7938=>659,7939=>659,7940=>659,7941=>659,7942=>659, -7943=>659,7944=>684,7945=>684,7946=>877,7947=>877,7948=>769,7949=>801,7950=>708,7951=>743,7952=>541, -7953=>541,7954=>541,7955=>541,7956=>541,7957=>541,7960=>711,7961=>711,7962=>966,7963=>975,7964=>898, -7965=>928,7968=>634,7969=>634,7970=>634,7971=>634,7972=>634,7973=>634,7974=>634,7975=>634,7976=>837, -7977=>835,7978=>1086,7979=>1089,7980=>1027,7981=>1051,7982=>934,7983=>947,7984=>338,7985=>338,7986=>338, -7987=>338,7988=>338,7989=>338,7990=>338,7991=>338,7992=>380,7993=>374,7994=>635,7995=>635,7996=>570, -7997=>600,7998=>489,7999=>493,8000=>612,8001=>612,8002=>612,8003=>612,8004=>612,8005=>612,8008=>804, -8009=>848,8010=>1095,8011=>1100,8012=>938,8013=>970,8016=>579,8017=>579,8018=>579,8019=>579,8020=>579, -8021=>579,8022=>579,8023=>579,8025=>784,8027=>998,8029=>1012,8031=>897,8032=>837,8033=>837,8034=>837, -8035=>837,8036=>837,8037=>837,8038=>837,8039=>837,8040=>802,8041=>843,8042=>1089,8043=>1095,8044=>946, -8045=>972,8046=>921,8047=>952,8048=>659,8049=>659,8050=>541,8051=>548,8052=>634,8053=>654,8054=>338, -8055=>338,8056=>612,8057=>612,8058=>579,8059=>579,8060=>837,8061=>837,8064=>659,8065=>659,8066=>659, -8067=>659,8068=>659,8069=>659,8070=>659,8071=>659,8072=>684,8073=>684,8074=>877,8075=>877,8076=>769, -8077=>801,8078=>708,8079=>743,8080=>634,8081=>634,8082=>634,8083=>634,8084=>634,8085=>634,8086=>634, -8087=>634,8088=>837,8089=>835,8090=>1086,8091=>1089,8092=>1027,8093=>1051,8094=>934,8095=>947,8096=>837, -8097=>837,8098=>837,8099=>837,8100=>837,8101=>837,8102=>837,8103=>837,8104=>802,8105=>843,8106=>1089, -8107=>1095,8108=>946,8109=>972,8110=>921,8111=>952,8112=>659,8113=>659,8114=>659,8115=>659,8116=>659, -8118=>659,8119=>659,8120=>684,8121=>684,8122=>716,8123=>692,8124=>684,8125=>500,8126=>500,8127=>500, -8128=>500,8129=>500,8130=>634,8131=>634,8132=>654,8134=>634,8135=>634,8136=>805,8137=>746,8138=>931, -8139=>871,8140=>752,8141=>500,8142=>500,8143=>500,8144=>338,8145=>338,8146=>338,8147=>338,8150=>338, -8151=>338,8152=>295,8153=>295,8154=>475,8155=>408,8157=>500,8158=>500,8159=>500,8160=>579,8161=>579, -8162=>579,8163=>579,8164=>635,8165=>635,8166=>579,8167=>579,8168=>611,8169=>611,8170=>845,8171=>825, -8172=>685,8173=>500,8174=>500,8175=>500,8178=>837,8179=>837,8180=>837,8182=>837,8183=>837,8184=>941, -8185=>813,8186=>922,8187=>826,8188=>764,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000, -8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0, -8206=>0,8207=>0,8208=>361,8209=>361,8210=>636,8213=>1000,8214=>500,8215=>500,8219=>318,8223=>518, -8227=>590,8228=>333,8229=>667,8231=>318,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200, -8241=>1690,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339,8251=>838,8252=>485, -8253=>531,8254=>500,8255=>804,8256=>804,8257=>250,8258=>1000,8259=>500,8260=>167,8261=>390,8262=>390, -8263=>922,8264=>733,8265=>733,8266=>497,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8272=>804, -8273=>500,8274=>450,8275=>1000,8276=>804,8277=>838,8278=>586,8279=>663,8280=>838,8281=>838,8282=>318, -8283=>797,8284=>838,8285=>318,8286=>318,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, -8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>179,8308=>401,8309=>401, -8310=>401,8311=>401,8312=>401,8313=>401,8314=>528,8315=>528,8316=>528,8317=>246,8318=>246,8319=>399, -8320=>401,8321=>401,8322=>401,8323=>401,8324=>401,8325=>401,8326=>401,8327=>401,8328=>401,8329=>401, -8330=>528,8331=>528,8332=>528,8333=>246,8334=>246,8336=>392,8337=>417,8338=>414,8339=>444,8340=>417, -8352=>877,8353=>636,8354=>636,8355=>636,8356=>636,8357=>974,8358=>748,8359=>1271,8360=>1074,8361=>989, -8362=>838,8363=>636,8365=>656,8366=>611,8367=>1272,8368=>636,8369=>636,8370=>636,8371=>636,8372=>774, -8373=>641,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>970,8449=>970, -8450=>698,8451=>1123,8452=>896,8453=>969,8454=>1032,8455=>614,8456=>698,8457=>952,8459=>988,8460=>754, -8461=>850,8462=>634,8463=>634,8464=>470,8465=>697,8466=>720,8467=>413,8468=>818,8469=>801,8470=>1040, -8471=>1000,8472=>697,8473=>701,8474=>787,8475=>798,8476=>814,8477=>792,8478=>896,8479=>684,8480=>1020, -8481=>1014,8483=>684,8484=>745,8485=>578,8486=>764,8487=>764,8488=>616,8489=>338,8490=>656,8491=>684, -8492=>786,8493=>703,8494=>854,8495=>592,8496=>605,8497=>786,8498=>575,8499=>1069,8500=>462,8501=>745, -8502=>674,8503=>466,8504=>645,8505=>380,8506=>926,8507=>1157,8508=>702,8509=>728,8510=>654,8511=>849, -8512=>811,8513=>775,8514=>557,8515=>557,8516=>611,8517=>819,8518=>708,8519=>615,8520=>351,8521=>351, -8523=>780,8526=>526,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969, -8539=>969,8540=>969,8541=>969,8542=>969,8543=>568,8544=>295,8545=>492,8546=>689,8547=>923,8548=>684, -8549=>922,8550=>1120,8551=>1317,8552=>917,8553=>685,8554=>933,8555=>1131,8556=>557,8557=>698,8558=>770, -8559=>863,8560=>278,8561=>458,8562=>637,8563=>812,8564=>592,8565=>811,8566=>991,8567=>1170,8568=>819, -8569=>592,8570=>822,8571=>1002,8572=>278,8573=>550,8574=>635,8575=>974,8576=>1245,8577=>770,8578=>1245, -8579=>703,8580=>549,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838, -8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838, -8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838, -8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838, -8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838, -8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838, -8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838, -8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838, -8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838, -8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838, -8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838, -8700=>838,8701=>838,8702=>838,8703=>838,8704=>684,8705=>636,8706=>517,8707=>632,8708=>632,8709=>871, -8710=>669,8711=>669,8712=>871,8713=>871,8714=>718,8715=>871,8716=>871,8717=>718,8718=>636,8719=>757, -8720=>757,8721=>674,8722=>838,8723=>838,8724=>838,8725=>337,8726=>637,8727=>838,8728=>626,8729=>626, -8730=>637,8731=>637,8732=>637,8733=>714,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500, -8740=>500,8741=>500,8742=>500,8743=>732,8744=>732,8745=>732,8746=>732,8747=>521,8748=>789,8749=>1057, -8750=>521,8751=>789,8752=>1057,8753=>521,8754=>521,8755=>521,8756=>636,8757=>636,8758=>260,8759=>636, -8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838, -8770=>838,8771=>838,8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838, -8780=>838,8781=>838,8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1000,8789=>1000, -8790=>838,8791=>838,8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838, -8800=>838,8801=>838,8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>838,8809=>838, -8810=>1047,8811=>1047,8812=>464,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838, -8820=>838,8821=>838,8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838, -8830=>838,8831=>838,8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838, -8840=>838,8841=>838,8842=>838,8843=>838,8844=>732,8845=>732,8846=>732,8847=>838,8848=>838,8849=>838, -8850=>838,8851=>780,8852=>780,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838, -8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>871,8867=>871,8868=>871,8869=>871, -8870=>521,8871=>521,8872=>871,8873=>871,8874=>871,8875=>871,8876=>871,8877=>871,8878=>871,8879=>871, -8880=>838,8881=>838,8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838, -8890=>521,8891=>732,8892=>732,8893=>732,8894=>838,8895=>838,8896=>820,8897=>820,8898=>820,8899=>820, -8900=>494,8901=>318,8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838, -8910=>732,8911=>732,8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838, -8920=>1422,8921=>1422,8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838, -8930=>838,8931=>838,8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838, -8940=>838,8941=>838,8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1000,8947=>871,8948=>718,8949=>871, -8950=>871,8951=>718,8952=>871,8953=>871,8954=>1000,8955=>871,8956=>718,8957=>871,8958=>718,8959=>871, -8960=>602,8961=>602,8962=>635,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>390,8969=>390, -8970=>390,8971=>390,8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>513,8984=>1000,8985=>838, -8988=>469,8989=>469,8990=>469,8991=>469,8992=>521,8993=>521,8996=>1152,8997=>1152,8998=>1414,8999=>1152, -9000=>1443,9003=>1414,9004=>873,9075=>338,9076=>635,9077=>837,9082=>659,9085=>757,9095=>1152,9108=>873, -9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500, -9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>521, -9166=>838,9167=>945,9187=>873,9189=>769,9250=>635,9251=>635,9312=>896,9313=>896,9314=>896,9315=>896, -9316=>896,9317=>896,9318=>896,9319=>896,9320=>896,9321=>896,9472=>602,9473=>602,9474=>602,9475=>602, -9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602, -9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602, -9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602, -9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602, -9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602, -9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602, -9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602, -9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602, -9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602, -9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602, -9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602, -9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602, -9596=>602,9597=>602,9598=>602,9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769, -9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769, -9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769, -9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945, -9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945, -9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769, -9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769, -9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873, -9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873, -9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387, -9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945, -9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945, -9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732, -9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573, -9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896, -9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896, -9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746, -9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896, -9776=>890,9777=>890,9778=>890,9779=>890,9780=>890,9781=>890,9782=>890,9783=>890,9784=>896,9785=>896, -9786=>896,9787=>896,9788=>896,9789=>896,9790=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896, -9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896, -9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896, -9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896, -9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896, -9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896, -9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896, -9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>890,9863=>890,9864=>890,9865=>890, -9866=>890,9867=>890,9868=>890,9869=>890,9870=>890,9871=>890,9872=>750,9873=>750,9874=>890,9875=>816, -9876=>716,9877=>537,9878=>852,9879=>890,9880=>684,9881=>890,9882=>708,9883=>890,9884=>890,9888=>890, -9889=>702,9890=>1003,9891=>1085,9892=>1143,9893=>901,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838, -9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>731,9907=>732,9908=>732, -9909=>732,9910=>850,9911=>732,9912=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838, -9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838, -10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838, -10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838, -10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838, -10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838, -10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838, -10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896, -10070=>896,10072=>838,10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538,10081=>838,10082=>838, -10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838, -10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>896, -10103=>896,10104=>896,10105=>896,10106=>896,10107=>896,10108=>896,10109=>896,10110=>896,10111=>896,10112=>838, -10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838, -10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838, -10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838, -10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838, -10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838, -10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>390,10182=>390, -10208=>494,10214=>495,10215=>495,10216=>390,10217=>390,10218=>556,10219=>556,10224=>838,10225=>838,10226=>838, -10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434, -10237=>1434,10238=>1434,10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732, -10247=>732,10248=>732,10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732, -10257=>732,10258=>732,10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732, -10267=>732,10268=>732,10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732, -10277=>732,10278=>732,10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732, -10287=>732,10288=>732,10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732, -10297=>732,10298=>732,10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732, -10307=>732,10308=>732,10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732, -10317=>732,10318=>732,10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732, -10327=>732,10328=>732,10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732, -10337=>732,10338=>732,10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732, -10347=>732,10348=>732,10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732, -10357=>732,10358=>732,10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732, -10367=>732,10368=>732,10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732, -10377=>732,10378=>732,10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732, -10387=>732,10388=>732,10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732, -10397=>732,10398=>732,10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732, -10407=>732,10408=>732,10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732, -10417=>732,10418=>732,10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732, -10427=>732,10428=>732,10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732, -10437=>732,10438=>732,10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732, -10447=>732,10448=>732,10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732, -10457=>732,10458=>732,10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732, -10467=>732,10468=>732,10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732, -10477=>732,10478=>732,10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732, -10487=>732,10488=>732,10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10502=>838, -10503=>838,10506=>838,10507=>838,10560=>683,10561=>683,10627=>734,10628=>734,10702=>838,10703=>1000,10704=>1000, -10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000, -10754=>1000,10764=>1325,10765=>521,10766=>521,10767=>521,10768=>521,10769=>521,10770=>521,10771=>521,10772=>521, -10773=>521,10774=>521,10775=>521,10776=>521,10777=>521,10778=>521,10779=>521,10780=>521,10799=>838,10877=>838, -10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838, -10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838, -10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838, -10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838, -10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838, -11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838, -11018=>838,11019=>838,11020=>838,11021=>838,11022=>836,11023=>836,11024=>836,11025=>836,11026=>945,11027=>945, -11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873, -11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>557,11361=>278,11362=>557,11363=>603,11364=>695, -11365=>613,11366=>392,11367=>752,11368=>634,11369=>656,11370=>579,11371=>685,11372=>525,11373=>781,11374=>863, -11375=>684,11377=>734,11378=>1128,11379=>961,11380=>592,11381=>654,11382=>568,11383=>660,11385=>414,11386=>612, -11387=>491,11388=>175,11389=>431,11800=>531,11810=>390,11811=>390,11812=>390,11813=>390,11822=>531,19904=>896, -19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896,19912=>896,19913=>896,19914=>896, -19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896,19922=>896,19923=>896,19924=>896, -19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896,19932=>896,19933=>896,19934=>896, -19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896,19942=>896,19943=>896,19944=>896, -19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896,19952=>896,19953=>896,19954=>896, -19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896,19962=>896,19963=>896,19964=>896, -19965=>896,19966=>896,19967=>896,42564=>635,42565=>521,42566=>354,42567=>338,42572=>1180,42573=>1028,42576=>1029, -42577=>906,42580=>1080,42581=>842,42582=>985,42583=>847,42594=>1024,42595=>925,42596=>1014,42597=>900,42598=>863, -42599=>1008,42600=>787,42601=>612,42602=>855,42603=>712,42604=>1358,42605=>1019,42606=>879,42634=>805,42635=>722, -42636=>611,42637=>583,42644=>686,42645=>634,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493, -42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369, -42780=>369,42781=>252,42782=>252,42783=>252,42790=>752,42791=>634,42792=>878,42793=>709,42794=>614,42795=>541, -42800=>491,42801=>521,42802=>1250,42803=>985,42804=>1219,42805=>1000,42806=>1155,42807=>996,42808=>971,42809=>818, -42810=>971,42811=>818,42812=>959,42813=>818,42814=>698,42815=>549,42822=>680,42823=>392,42824=>582,42825=>427, -42826=>807,42827=>704,42830=>1358,42831=>1019,42880=>557,42881=>278,42882=>735,42883=>634,42889=>337,42890=>376, -42891=>401,42892=>275,43003=>575,43004=>603,43005=>863,43006=>295,43007=>1199,63173=>612,64256=>722,64257=>646, -64258=>646,64259=>1000,64260=>1000,64261=>686,64262=>861,64275=>1202,64276=>1202,64277=>1196,64278=>1186,64279=>1529, -64285=>272,64286=>0,64287=>471,64288=>636,64289=>856,64290=>774,64291=>906,64292=>771,64293=>843,64294=>855, -64295=>807,64296=>875,64297=>838,64298=>808,64299=>808,64300=>808,64301=>808,64302=>629,64303=>629,64304=>629, -64305=>608,64306=>448,64307=>594,64308=>640,64309=>272,64310=>374,64311=>1000,64312=>648,64313=>336,64314=>592, -64315=>556,64316=>599,64318=>659,64320=>441,64321=>700,64323=>640,64324=>604,64326=>581,64327=>663,64328=>592, -64329=>808,64330=>657,64331=>272,64332=>608,64333=>556,64334=>604,64335=>629,65024=>0,65025=>0,65026=>0, -65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0, -65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0,65531=>0, -65532=>0,65533=>1025); -$enc=''; -$diff=''; -$file='dejavusansi.z'; -$ctg='dejavusansi.ctg.z'; -$originalsize=523804; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.z deleted file mode 100644 index bb3d034b..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.ctg.z deleted file mode 100644 index bc940329..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.php deleted file mode 100644 index ce70b1e6..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.php +++ /dev/null @@ -1,320 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>9,'Flags'=>33,'FontBBox'=>'[-558 -375 718 1042]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>602); -$up=-63; -$ut=44; -$dw=602; -$cw=array( -0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602, -41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602, -51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602, -61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602, -71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602, -81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602, -91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602, -101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602, -111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602, -121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,8364=>602,8218=>602,402=>602,8222=>602, -8230=>602,8224=>602,8225=>602,710=>602,8240=>602,352=>602,8249=>602,338=>602,381=>602,8216=>602, -8217=>602,8220=>602,8221=>602,8226=>602,8211=>602,8212=>602,732=>602,8482=>602,353=>602,8250=>602, -339=>602,382=>602,376=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602, -167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602, -177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602, -187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602, -197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602, -207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602, -217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602, -227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602, -237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602, -247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602, -257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602, -267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602, -277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602, -287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602, -297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602, -307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602, -317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602, -327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602, -337=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602, -349=>602,350=>602,351=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602, -361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602, -371=>602,372=>602,373=>602,374=>602,375=>602,377=>602,378=>602,379=>602,380=>602,383=>602, -384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602, -394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,403=>602,404=>602, -405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602, -415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602, -425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602, -435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602, -445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602, -464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602, -474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602, -486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602, -496=>602,500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602, -512=>602,513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602, -522=>602,523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602, -532=>602,533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602, -542=>602,543=>602,544=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602, -554=>602,555=>602,556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602, -564=>602,565=>602,566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602, -574=>602,575=>602,576=>602,577=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602, -594=>602,595=>602,596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602, -604=>602,605=>602,606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602, -614=>602,615=>602,616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602, -624=>602,625=>602,626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602, -634=>602,635=>602,636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602, -644=>602,645=>602,646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602, -654=>602,655=>602,656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602, -664=>602,665=>602,666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602, -674=>602,675=>602,676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602, -684=>602,685=>602,686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602, -694=>602,695=>602,696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602, -705=>602,711=>602,712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602, -726=>602,727=>602,728=>602,729=>602,730=>602,731=>602,733=>602,734=>602,736=>602,737=>602, -738=>602,739=>602,740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602, -768=>602,769=>602,770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602, -778=>602,779=>602,780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602, -788=>602,789=>602,790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602, -798=>602,799=>602,800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602, -808=>602,809=>602,810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602, -818=>602,819=>602,820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602, -828=>602,829=>602,830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602, -894=>602,900=>602,901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602, -911=>602,912=>602,913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602, -921=>602,922=>602,923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602, -932=>602,933=>602,934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602, -942=>602,943=>602,944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602, -952=>602,953=>602,954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602, -962=>602,963=>602,964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602, -972=>602,973=>602,974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602, -983=>602,984=>602,985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602, -993=>602,1008=>602,1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602, -1017=>602,1018=>602,1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602, -1027=>602,1028=>602,1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602, -1037=>602,1038=>602,1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602, -1047=>602,1048=>602,1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602, -1057=>602,1058=>602,1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602, -1067=>602,1068=>602,1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602, -1077=>602,1078=>602,1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602, -1087=>602,1088=>602,1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602, -1097=>602,1098=>602,1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602, -1107=>602,1108=>602,1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602, -1117=>602,1118=>602,1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602, -1171=>602,1172=>602,1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602, -1187=>602,1194=>602,1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602, -1203=>602,1210=>602,1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602, -1227=>602,1228=>602,1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602, -1239=>602,1240=>602,1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602, -1249=>602,1250=>602,1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602, -1259=>602,1260=>602,1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602, -1269=>602,1270=>602,1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602, -1309=>602,1542=>602,1543=>602,1545=>602,1546=>602,1548=>602,1557=>602,1563=>602,1567=>602,1569=>602, -1570=>602,1571=>602,1572=>602,1573=>602,1574=>602,1575=>602,1576=>602,1577=>602,1578=>602,1579=>602, -1580=>602,1581=>602,1582=>602,1583=>602,1584=>602,1585=>602,1586=>602,1587=>602,1588=>602,1589=>602, -1590=>602,1591=>602,1592=>602,1593=>602,1594=>602,1600=>602,1601=>602,1602=>602,1603=>602,1604=>602, -1605=>602,1606=>602,1607=>602,1608=>602,1609=>602,1610=>602,1611=>602,1612=>602,1613=>602,1614=>602, -1615=>602,1616=>602,1617=>602,1618=>602,1619=>602,1620=>602,1621=>602,1626=>602,1632=>602,1633=>602, -1634=>602,1635=>602,1636=>602,1637=>602,1638=>602,1639=>602,1640=>602,1641=>602,1642=>602,1643=>602, -1644=>602,1645=>602,1652=>602,1657=>602,1658=>602,1659=>602,1662=>602,1663=>602,1664=>602,1667=>602, -1668=>602,1670=>602,1671=>602,1681=>602,1688=>602,1700=>602,1705=>602,1711=>602,1726=>602,1740=>602, -1776=>602,1777=>602,1778=>602,1779=>602,1780=>602,1781=>602,1782=>602,1783=>602,1784=>602,1785=>602, -3713=>602,3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602, -3735=>602,3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602, -3747=>602,3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602, -3762=>602,3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602, -3784=>602,3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602, -4308=>602,4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602, -4318=>602,4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602, -4328=>602,4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602, -4338=>602,4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602, -4348=>602,7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602, -7468=>602,7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602, -7479=>602,7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602, -7490=>602,7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602, -7500=>602,7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602, -7510=>602,7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602, -7543=>602,7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602, -7585=>602,7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602, -7595=>602,7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602, -7605=>602,7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602, -7680=>602,7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602, -7690=>602,7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602, -7704=>602,7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602, -7714=>602,7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602, -7724=>602,7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602, -7736=>602,7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602, -7746=>602,7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602, -7756=>602,7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602, -7772=>602,7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602, -7786=>602,7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602, -7796=>602,7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602, -7808=>602,7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602, -7818=>602,7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602, -7828=>602,7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602, -7852=>602,7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602, -7878=>602,7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602, -7900=>602,7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602, -7914=>602,7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602, -7928=>602,7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602, -7944=>602,7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602, -7954=>602,7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602, -7968=>602,7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602, -7978=>602,7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602, -7988=>602,7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602, -7998=>602,7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602, -8010=>602,8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602, -8022=>602,8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602, -8036=>602,8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602, -8046=>602,8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602, -8056=>602,8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602, -8068=>602,8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602, -8078=>602,8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602, -8088=>602,8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602, -8098=>602,8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602, -8108=>602,8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602, -8119=>602,8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602, -8129=>602,8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602, -8140=>602,8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602, -8152=>602,8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602, -8163=>602,8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602, -8173=>602,8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602, -8186=>602,8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602, -8197=>602,8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8213=>602, -8215=>602,8219=>602,8223=>602,8227=>602,8239=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602, -8246=>602,8247=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602, -8287=>602,8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602, -8315=>602,8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602, -8325=>602,8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602, -8336=>602,8337=>602,8338=>602,8339=>602,8340=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602, -8357=>602,8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8365=>602,8366=>602,8367=>602, -8368=>602,8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8450=>602,8453=>602,8461=>602,8462=>602, -8463=>602,8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8484=>602,8486=>602,8490=>602, -8491=>602,8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602, -8539=>602,8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602, -8597=>602,8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602, -8607=>602,8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602, -8617=>602,8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602, -8627=>602,8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602, -8637=>602,8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602, -8647=>602,8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602, -8657=>602,8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602, -8667=>602,8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602, -8677=>602,8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602, -8687=>602,8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602, -8697=>602,8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602, -8707=>602,8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602, -8717=>602,8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602, -8731=>602,8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602, -8747=>602,8748=>602,8749=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602, -8770=>602,8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602, -8780=>602,8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602, -8790=>602,8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602, -8800=>602,8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602, -8813=>602,8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602, -8823=>602,8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602, -8833=>602,8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602, -8843=>602,8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602, -8858=>602,8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8901=>602,8902=>602, -8909=>602,8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602, -8931=>602,8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602, -8962=>602,8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602, -8973=>602,8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602, -8985=>602,8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602, -9000=>602,9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602, -9022=>602,9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602, -9037=>602,9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602, -9052=>602,9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602, -9068=>602,9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602, -9080=>602,9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602, -9098=>602,9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602, -9122=>602,9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602, -9132=>602,9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9472=>602,9473=>602,9474=>602,9475=>602, -9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602, -9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602, -9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602, -9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602, -9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602, -9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602, -9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602, -9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602, -9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602, -9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602, -9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602, -9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602, -9596=>602,9597=>602,9598=>602,9599=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602,9605=>602, -9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602,9615=>602, -9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602,9625=>602, -9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602,9635=>602, -9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602,9645=>602, -9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602,9655=>602, -9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602,9665=>602, -9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602,9675=>602, -9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602,9685=>602, -9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602,9695=>602, -9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602,9705=>602, -9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602,9715=>602, -9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602,9725=>602, -9726=>602,9727=>602,9728=>602,9729=>602,9730=>602,9731=>602,9732=>602,9733=>602,9734=>602,9735=>602, -9736=>602,9737=>602,9738=>602,9739=>602,9740=>602,9741=>602,9742=>602,9743=>602,9744=>602,9745=>602, -9746=>602,9747=>602,9748=>602,9749=>602,9750=>602,9751=>602,9752=>602,9753=>602,9754=>602,9755=>602, -9756=>602,9757=>602,9758=>602,9759=>602,9760=>602,9761=>602,9762=>602,9763=>602,9764=>602,9765=>602, -9766=>602,9767=>602,9768=>602,9769=>602,9770=>602,9771=>602,9772=>602,9773=>602,9774=>602,9775=>602, -9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9789=>602,9790=>602,9791=>602,9792=>602,9793=>602, -9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9800=>602,9801=>602,9802=>602,9803=>602, -9804=>602,9805=>602,9806=>602,9807=>602,9808=>602,9809=>602,9810=>602,9811=>602,9812=>602,9813=>602, -9814=>602,9815=>602,9816=>602,9817=>602,9818=>602,9819=>602,9820=>602,9821=>602,9822=>602,9823=>602, -9824=>602,9825=>602,9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602,9832=>602,9833=>602, -9834=>602,9835=>602,9836=>602,9837=>602,9838=>602,9839=>602,9840=>602,9841=>602,9842=>602,9843=>602, -9844=>602,9845=>602,9846=>602,9847=>602,9848=>602,9849=>602,9850=>602,9851=>602,9852=>602,9853=>602, -9854=>602,9855=>602,9856=>602,9857=>602,9858=>602,9859=>602,9860=>602,9861=>602,9862=>602,9863=>602, -9864=>602,9865=>602,9866=>602,9867=>602,9872=>602,9873=>602,9874=>602,9875=>602,9876=>602,9877=>602, -9878=>602,9879=>602,9880=>602,9881=>602,9882=>602,9883=>602,9884=>602,9888=>602,9889=>602,9904=>602, -9905=>602,9985=>602,9986=>602,9987=>602,9988=>602,9990=>602,9991=>602,9992=>602,9993=>602,9996=>602, -9997=>602,9998=>602,9999=>602,10000=>602,10001=>602,10002=>602,10003=>602,10004=>602,10005=>602,10006=>602, -10007=>602,10008=>602,10009=>602,10010=>602,10011=>602,10012=>602,10013=>602,10014=>602,10015=>602,10016=>602, -10017=>602,10018=>602,10019=>602,10020=>602,10021=>602,10022=>602,10023=>602,10025=>602,10026=>602,10027=>602, -10028=>602,10029=>602,10030=>602,10031=>602,10032=>602,10033=>602,10034=>602,10035=>602,10036=>602,10037=>602, -10038=>602,10039=>602,10040=>602,10041=>602,10042=>602,10043=>602,10044=>602,10045=>602,10046=>602,10047=>602, -10048=>602,10049=>602,10050=>602,10051=>602,10052=>602,10053=>602,10054=>602,10055=>602,10056=>602,10057=>602, -10058=>602,10059=>602,10061=>602,10063=>602,10064=>602,10065=>602,10066=>602,10070=>602,10072=>602,10073=>602, -10074=>602,10075=>602,10076=>602,10077=>602,10078=>602,10081=>602,10082=>602,10083=>602,10084=>602,10085=>602, -10086=>602,10087=>602,10088=>602,10089=>602,10090=>602,10091=>602,10092=>602,10093=>602,10094=>602,10095=>602, -10096=>602,10097=>602,10098=>602,10099=>602,10100=>602,10101=>602,10132=>602,10136=>602,10137=>602,10138=>602, -10139=>602,10140=>602,10141=>602,10142=>602,10143=>602,10144=>602,10145=>602,10146=>602,10147=>602,10148=>602, -10149=>602,10150=>602,10151=>602,10152=>602,10153=>602,10154=>602,10155=>602,10156=>602,10157=>602,10158=>602, -10159=>602,10161=>602,10162=>602,10163=>602,10164=>602,10165=>602,10166=>602,10167=>602,10168=>602,10169=>602, -10170=>602,10171=>602,10172=>602,10173=>602,10174=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602, -10731=>602,10746=>602,10747=>602,10799=>602,11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602, -11032=>602,11033=>602,11034=>602,11364=>602,11374=>602,11375=>602,11381=>602,11382=>602,11383=>602,11385=>602, -11386=>602,11388=>602,11389=>602,11800=>602,11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602, -42761=>602,42762=>602,42763=>602,42764=>602,42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602, -42771=>602,42772=>602,42773=>602,42774=>602,42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42790=>602, -42791=>602,42889=>602,42890=>602,42891=>602,42892=>602,63173=>602,64257=>602,64258=>602,64338=>602,64339=>602, -64340=>602,64341=>602,64342=>602,64343=>602,64344=>602,64345=>602,64346=>602,64347=>602,64348=>602,64349=>602, -64350=>602,64351=>602,64352=>602,64353=>602,64354=>602,64355=>602,64356=>602,64357=>602,64358=>602,64359=>602, -64360=>602,64361=>602,64362=>602,64363=>602,64364=>602,64365=>602,64366=>602,64367=>602,64368=>602,64369=>602, -64370=>602,64371=>602,64372=>602,64373=>602,64374=>602,64375=>602,64376=>602,64377=>602,64378=>602,64379=>602, -64380=>602,64381=>602,64382=>602,64383=>602,64384=>602,64385=>602,64394=>602,64395=>602,64396=>602,64397=>602, -64398=>602,64399=>602,64400=>602,64401=>602,64402=>602,64403=>602,64404=>602,64405=>602,64414=>602,64415=>602, -64426=>602,64427=>602,64428=>602,64429=>602,64488=>602,64489=>602,64508=>602,64509=>602,64510=>602,64511=>602, -65136=>602,65137=>602,65138=>602,65139=>602,65140=>602,65142=>602,65143=>602,65144=>602,65145=>602,65146=>602, -65147=>602,65148=>602,65149=>602,65150=>602,65151=>602,65152=>602,65153=>602,65154=>602,65155=>602,65156=>602, -65157=>602,65158=>602,65159=>602,65160=>602,65161=>602,65162=>602,65163=>602,65164=>602,65165=>602,65166=>602, -65167=>602,65168=>602,65169=>602,65170=>602,65171=>602,65172=>602,65173=>602,65174=>602,65175=>602,65176=>602, -65177=>602,65178=>602,65179=>602,65180=>602,65181=>602,65182=>602,65183=>602,65184=>602,65185=>602,65186=>602, -65187=>602,65188=>602,65189=>602,65190=>602,65191=>602,65192=>602,65193=>602,65194=>602,65195=>602,65196=>602, -65197=>602,65198=>602,65199=>602,65200=>602,65201=>602,65202=>602,65203=>602,65204=>602,65205=>602,65206=>602, -65207=>602,65208=>602,65209=>602,65210=>602,65211=>602,65212=>602,65213=>602,65214=>602,65215=>602,65216=>602, -65217=>602,65218=>602,65219=>602,65220=>602,65221=>602,65222=>602,65223=>602,65224=>602,65225=>602,65226=>602, -65227=>602,65228=>602,65229=>602,65230=>602,65231=>602,65232=>602,65233=>602,65234=>602,65235=>602,65236=>602, -65237=>602,65238=>602,65239=>602,65240=>602,65241=>602,65242=>602,65243=>602,65244=>602,65245=>602,65246=>602, -65247=>602,65248=>602,65249=>602,65250=>602,65251=>602,65252=>602,65253=>602,65254=>602,65255=>602,65256=>602, -65257=>602,65258=>602,65259=>602,65260=>602,65261=>602,65262=>602,65263=>602,65264=>602,65265=>602,65266=>602, -65267=>602,65268=>602,65269=>602,65270=>602,65271=>602,65272=>602,65273=>602,65274=>602,65275=>602,65276=>602, -65279=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602); -$enc=''; -$diff=''; -$file='dejavusansmono.z'; -$ctg='dejavusansmono.ctg.z'; -$originalsize=321524; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.z deleted file mode 100644 index 3b9ede1f..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmono.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.ctg.z deleted file mode 100644 index 0ce0dba4..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.php deleted file mode 100644 index a13bc838..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.php +++ /dev/null @@ -1,307 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>13,'Flags'=>33,'FontBBox'=>'[-446 -394 731 1052]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>602); -$up=-63; -$ut=44; -$dw=602; -$cw=array( -0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602, -41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602, -51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602, -61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602, -71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602, -81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602, -91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602, -101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602, -111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602, -121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,8364=>602,8218=>602,402=>602,8222=>602, -8230=>602,8224=>602,8225=>602,710=>602,8240=>602,352=>602,8249=>602,338=>602,381=>602,8216=>602, -8217=>602,8220=>602,8221=>602,8226=>602,8211=>602,8212=>602,732=>602,8482=>602,353=>602,8250=>602, -339=>602,382=>602,376=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602, -167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602, -177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602, -187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602, -197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602, -207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602, -217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602, -227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602, -237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602, -247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602, -257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602, -267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602, -277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602, -287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602, -297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602, -307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602, -317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602, -327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602, -337=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602, -349=>602,350=>602,351=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602, -361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602, -371=>602,372=>602,373=>602,374=>602,375=>602,377=>602,378=>602,379=>602,380=>602,383=>602, -384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602, -394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,403=>602,404=>602, -405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602, -415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602, -425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602, -435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602, -445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602, -464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602, -474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602, -486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602, -496=>602,500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602, -512=>602,513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602, -522=>602,523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602, -532=>602,533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602, -542=>602,543=>602,544=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602, -554=>602,555=>602,556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602, -564=>602,565=>602,566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602, -574=>602,575=>602,576=>602,577=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602, -594=>602,595=>602,596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602, -604=>602,605=>602,606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602, -614=>602,615=>602,616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602, -624=>602,625=>602,626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602, -634=>602,635=>602,636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602, -644=>602,645=>602,646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602, -654=>602,655=>602,656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602, -664=>602,665=>602,666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602, -674=>602,675=>602,676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602, -684=>602,685=>602,686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602, -694=>602,695=>602,696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602, -705=>602,711=>602,712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602, -726=>602,727=>602,728=>602,729=>602,730=>602,731=>602,733=>602,734=>602,736=>602,737=>602, -738=>602,739=>602,740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602, -768=>602,769=>602,770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602, -778=>602,779=>602,780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602, -788=>602,789=>602,790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602, -798=>602,799=>602,800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602, -808=>602,809=>602,810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602, -818=>602,819=>602,820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602, -828=>602,829=>602,830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602, -894=>602,900=>602,901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602, -911=>602,912=>602,913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602, -921=>602,922=>602,923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602, -932=>602,933=>602,934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602, -942=>602,943=>602,944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602, -952=>602,953=>602,954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602, -962=>602,963=>602,964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602, -972=>602,973=>602,974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602, -983=>602,984=>602,985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602, -993=>602,1008=>602,1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602, -1017=>602,1018=>602,1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602, -1027=>602,1028=>602,1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602, -1037=>602,1038=>602,1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602, -1047=>602,1048=>602,1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602, -1057=>602,1058=>602,1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602, -1067=>602,1068=>602,1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602, -1077=>602,1078=>602,1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602, -1087=>602,1088=>602,1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602, -1097=>602,1098=>602,1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602, -1107=>602,1108=>602,1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602, -1117=>602,1118=>602,1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602, -1171=>602,1172=>602,1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602, -1187=>602,1194=>602,1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602, -1203=>602,1210=>602,1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602, -1227=>602,1228=>602,1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602, -1239=>602,1240=>602,1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602, -1249=>602,1250=>602,1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602, -1259=>602,1260=>602,1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602, -1269=>602,1270=>602,1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602, -1309=>602,1542=>602,1543=>602,1545=>602,1546=>602,1548=>602,1557=>602,1563=>602,1567=>602,1569=>602, -1570=>602,1571=>602,1572=>602,1573=>602,1574=>602,1575=>602,1576=>602,1577=>602,1578=>602,1579=>602, -1580=>602,1581=>602,1582=>602,1583=>602,1584=>602,1585=>602,1586=>602,1587=>602,1588=>602,1589=>602, -1590=>602,1591=>602,1592=>602,1593=>602,1594=>602,1600=>602,1601=>602,1602=>602,1603=>602,1604=>602, -1605=>602,1606=>602,1607=>602,1608=>602,1609=>602,1610=>602,1611=>602,1612=>602,1613=>602,1614=>602, -1615=>602,1616=>602,1617=>602,1618=>602,1619=>602,1620=>602,1621=>602,1626=>602,1632=>602,1633=>602, -1634=>602,1635=>602,1636=>602,1637=>602,1638=>602,1639=>602,1640=>602,1641=>602,1642=>602,1643=>602, -1644=>602,1645=>602,1652=>602,1657=>602,1658=>602,1659=>602,1662=>602,1663=>602,1664=>602,1667=>602, -1668=>602,1670=>602,1671=>602,1681=>602,1688=>602,1700=>602,1705=>602,1711=>602,1726=>602,1740=>602, -1776=>602,1777=>602,1778=>602,1779=>602,1780=>602,1781=>602,1782=>602,1783=>602,1784=>602,1785=>602, -3713=>602,3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602, -3735=>602,3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602, -3747=>602,3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602, -3762=>602,3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602, -3784=>602,3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602, -4308=>602,4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602, -4318=>602,4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602, -4328=>602,4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602, -4338=>602,4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602, -4348=>602,7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602, -7468=>602,7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602, -7479=>602,7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602, -7490=>602,7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602, -7500=>602,7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602, -7510=>602,7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602, -7543=>602,7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602, -7585=>602,7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602, -7595=>602,7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602, -7605=>602,7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602, -7680=>602,7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602, -7690=>602,7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602, -7704=>602,7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602, -7714=>602,7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602, -7724=>602,7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602, -7736=>602,7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602, -7746=>602,7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602, -7756=>602,7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602, -7772=>602,7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602, -7786=>602,7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602, -7796=>602,7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602, -7808=>602,7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602, -7818=>602,7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602, -7828=>602,7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602, -7852=>602,7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602, -7878=>602,7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602, -7900=>602,7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602, -7914=>602,7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602, -7928=>602,7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602, -7944=>602,7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602, -7954=>602,7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602, -7968=>602,7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602, -7978=>602,7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602, -7988=>602,7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602, -7998=>602,7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602, -8010=>602,8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602, -8022=>602,8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602, -8036=>602,8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602, -8046=>602,8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602, -8056=>602,8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602, -8068=>602,8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602, -8078=>602,8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602, -8088=>602,8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602, -8098=>602,8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602, -8108=>602,8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602, -8119=>602,8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602, -8129=>602,8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602, -8140=>602,8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602, -8152=>602,8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602, -8163=>602,8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602, -8173=>602,8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602, -8186=>602,8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602, -8197=>602,8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8213=>602, -8215=>602,8219=>602,8223=>602,8227=>602,8239=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602, -8246=>602,8247=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602, -8287=>602,8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602, -8315=>602,8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602, -8325=>602,8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602, -8336=>602,8337=>602,8338=>602,8339=>602,8340=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602, -8357=>602,8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8365=>602,8366=>602,8367=>602, -8368=>602,8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8450=>602,8453=>602,8461=>602,8462=>602, -8463=>602,8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8484=>602,8486=>602,8490=>602, -8491=>602,8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602, -8539=>602,8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602, -8597=>602,8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602, -8607=>602,8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602, -8617=>602,8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602, -8627=>602,8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602, -8637=>602,8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602, -8647=>602,8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602, -8657=>602,8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602, -8667=>602,8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602, -8677=>602,8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602, -8687=>602,8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602, -8697=>602,8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602, -8707=>602,8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602, -8717=>602,8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602, -8731=>602,8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602, -8747=>602,8748=>602,8749=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602, -8770=>602,8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602, -8780=>602,8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602, -8790=>602,8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602, -8800=>602,8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602, -8813=>602,8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602, -8823=>602,8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602, -8833=>602,8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602, -8843=>602,8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602, -8858=>602,8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8901=>602,8902=>602, -8909=>602,8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602, -8931=>602,8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602, -8962=>602,8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602, -8973=>602,8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602, -8985=>602,8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602, -9000=>602,9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602, -9022=>602,9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602, -9037=>602,9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602, -9052=>602,9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602, -9068=>602,9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602, -9080=>602,9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602, -9098=>602,9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602, -9122=>602,9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602, -9132=>602,9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9600=>602,9601=>602,9602=>602,9603=>602, -9604=>602,9605=>602,9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602, -9614=>602,9615=>602,9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602, -9624=>602,9625=>602,9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602, -9634=>602,9635=>602,9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602, -9644=>602,9645=>602,9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602, -9654=>602,9655=>602,9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602, -9664=>602,9665=>602,9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602, -9674=>602,9675=>602,9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602, -9684=>602,9685=>602,9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602, -9694=>602,9695=>602,9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602, -9704=>602,9705=>602,9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602, -9714=>602,9715=>602,9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602, -9724=>602,9725=>602,9726=>602,9727=>602,9728=>602,9729=>602,9730=>602,9731=>602,9732=>602,9733=>602, -9734=>602,9735=>602,9736=>602,9737=>602,9738=>602,9739=>602,9740=>602,9741=>602,9742=>602,9743=>602, -9744=>602,9745=>602,9746=>602,9747=>602,9748=>602,9749=>602,9750=>602,9751=>602,9752=>602,9753=>602, -9754=>602,9755=>602,9756=>602,9757=>602,9758=>602,9759=>602,9760=>602,9761=>602,9762=>602,9763=>602, -9764=>602,9765=>602,9766=>602,9767=>602,9768=>602,9769=>602,9770=>602,9771=>602,9772=>602,9773=>602, -9774=>602,9775=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9789=>602,9790=>602,9791=>602, -9792=>602,9793=>602,9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9800=>602,9801=>602, -9802=>602,9803=>602,9804=>602,9805=>602,9806=>602,9807=>602,9808=>602,9809=>602,9810=>602,9811=>602, -9812=>602,9813=>602,9814=>602,9815=>602,9816=>602,9817=>602,9818=>602,9819=>602,9820=>602,9821=>602, -9822=>602,9823=>602,9824=>602,9825=>602,9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602, -9832=>602,9833=>602,9834=>602,9835=>602,9836=>602,9837=>602,9838=>602,9839=>602,9840=>602,9841=>602, -9842=>602,9843=>602,9844=>602,9845=>602,9846=>602,9847=>602,9848=>602,9849=>602,9850=>602,9851=>602, -9852=>602,9853=>602,9854=>602,9855=>602,9856=>602,9857=>602,9858=>602,9859=>602,9860=>602,9861=>602, -9862=>602,9863=>602,9864=>602,9865=>602,9866=>602,9867=>602,9872=>602,9873=>602,9874=>602,9875=>602, -9876=>602,9877=>602,9878=>602,9879=>602,9880=>602,9881=>602,9882=>602,9883=>602,9884=>602,9888=>602, -9889=>602,9904=>602,9905=>602,9985=>602,9986=>602,9987=>602,9988=>602,9990=>602,9991=>602,9992=>602, -9993=>602,9996=>602,9997=>602,9998=>602,9999=>602,10000=>602,10001=>602,10002=>602,10003=>602,10004=>602, -10005=>602,10006=>602,10007=>602,10008=>602,10009=>602,10010=>602,10011=>602,10012=>602,10013=>602,10014=>602, -10015=>602,10016=>602,10017=>602,10018=>602,10019=>602,10020=>602,10021=>602,10022=>602,10023=>602,10025=>602, -10026=>602,10027=>602,10028=>602,10029=>602,10030=>602,10031=>602,10032=>602,10033=>602,10034=>602,10035=>602, -10036=>602,10037=>602,10038=>602,10039=>602,10040=>602,10041=>602,10042=>602,10043=>602,10044=>602,10045=>602, -10046=>602,10047=>602,10048=>602,10049=>602,10050=>602,10051=>602,10052=>602,10053=>602,10054=>602,10055=>602, -10056=>602,10057=>602,10058=>602,10059=>602,10061=>602,10063=>602,10064=>602,10065=>602,10066=>602,10070=>602, -10072=>602,10073=>602,10074=>602,10075=>602,10076=>602,10077=>602,10078=>602,10081=>602,10082=>602,10083=>602, -10084=>602,10085=>602,10086=>602,10087=>602,10088=>602,10089=>602,10090=>602,10091=>602,10092=>602,10093=>602, -10094=>602,10095=>602,10096=>602,10097=>602,10098=>602,10099=>602,10100=>602,10101=>602,10132=>602,10136=>602, -10137=>602,10138=>602,10139=>602,10140=>602,10141=>602,10142=>602,10143=>602,10144=>602,10145=>602,10146=>602, -10147=>602,10148=>602,10149=>602,10150=>602,10151=>602,10152=>602,10153=>602,10154=>602,10155=>602,10156=>602, -10157=>602,10158=>602,10159=>602,10161=>602,10162=>602,10163=>602,10164=>602,10165=>602,10166=>602,10167=>602, -10168=>602,10169=>602,10170=>602,10171=>602,10172=>602,10173=>602,10174=>602,10175=>602,10181=>602,10182=>602, -10208=>602,10216=>602,10217=>602,10731=>602,10746=>602,10747=>602,10799=>602,11026=>602,11027=>602,11028=>602, -11029=>602,11030=>602,11031=>602,11032=>602,11033=>602,11034=>602,11364=>602,11374=>602,11375=>602,11381=>602, -11382=>602,11383=>602,11385=>602,11386=>602,11388=>602,11389=>602,11800=>602,11810=>602,11811=>602,11812=>602, -11813=>602,11822=>602,42760=>602,42761=>602,42762=>602,42763=>602,42764=>602,42765=>602,42766=>602,42767=>602, -42768=>602,42769=>602,42770=>602,42771=>602,42772=>602,42773=>602,42774=>602,42779=>602,42780=>602,42781=>602, -42782=>602,42783=>602,42790=>602,42791=>602,42889=>602,42890=>602,42891=>602,42892=>602,63173=>602,64257=>602, -64258=>602,64338=>602,64339=>602,64340=>602,64341=>602,64342=>602,64343=>602,64344=>602,64345=>602,64346=>602, -64347=>602,64348=>602,64349=>602,64350=>602,64351=>602,64352=>602,64353=>602,64354=>602,64355=>602,64356=>602, -64357=>602,64358=>602,64359=>602,64360=>602,64361=>602,64362=>602,64363=>602,64364=>602,64365=>602,64366=>602, -64367=>602,64368=>602,64369=>602,64370=>602,64371=>602,64372=>602,64373=>602,64374=>602,64375=>602,64376=>602, -64377=>602,64378=>602,64379=>602,64380=>602,64381=>602,64382=>602,64383=>602,64384=>602,64385=>602,64394=>602, -64395=>602,64396=>602,64397=>602,64398=>602,64399=>602,64400=>602,64401=>602,64402=>602,64403=>602,64404=>602, -64405=>602,64414=>602,64415=>602,64426=>602,64427=>602,64428=>602,64429=>602,64488=>602,64489=>602,64508=>602, -64509=>602,64510=>602,64511=>602,65136=>602,65137=>602,65138=>602,65139=>602,65140=>602,65142=>602,65143=>602, -65144=>602,65145=>602,65146=>602,65147=>602,65148=>602,65149=>602,65150=>602,65151=>602,65152=>602,65153=>602, -65154=>602,65155=>602,65156=>602,65157=>602,65158=>602,65159=>602,65160=>602,65161=>602,65162=>602,65163=>602, -65164=>602,65165=>602,65166=>602,65167=>602,65168=>602,65169=>602,65170=>602,65171=>602,65172=>602,65173=>602, -65174=>602,65175=>602,65176=>602,65177=>602,65178=>602,65179=>602,65180=>602,65181=>602,65182=>602,65183=>602, -65184=>602,65185=>602,65186=>602,65187=>602,65188=>602,65189=>602,65190=>602,65191=>602,65192=>602,65193=>602, -65194=>602,65195=>602,65196=>602,65197=>602,65198=>602,65199=>602,65200=>602,65201=>602,65202=>602,65203=>602, -65204=>602,65205=>602,65206=>602,65207=>602,65208=>602,65209=>602,65210=>602,65211=>602,65212=>602,65213=>602, -65214=>602,65215=>602,65216=>602,65217=>602,65218=>602,65219=>602,65220=>602,65221=>602,65222=>602,65223=>602, -65224=>602,65225=>602,65226=>602,65227=>602,65228=>602,65229=>602,65230=>602,65231=>602,65232=>602,65233=>602, -65234=>602,65235=>602,65236=>602,65237=>602,65238=>602,65239=>602,65240=>602,65241=>602,65242=>602,65243=>602, -65244=>602,65245=>602,65246=>602,65247=>602,65248=>602,65249=>602,65250=>602,65251=>602,65252=>602,65253=>602, -65254=>602,65255=>602,65256=>602,65257=>602,65258=>602,65259=>602,65260=>602,65261=>602,65262=>602,65263=>602, -65264=>602,65265=>602,65266=>602,65267=>602,65268=>602,65269=>602,65270=>602,65271=>602,65272=>602,65273=>602, -65274=>602,65275=>602,65276=>602,65279=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602); -$enc=''; -$diff=''; -$file='dejavusansmonob.z'; -$ctg='dejavusansmonob.ctg.z'; -$originalsize=301928; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.z deleted file mode 100644 index e98cacb2..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonob.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.ctg.z deleted file mode 100644 index 42e7503e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.php deleted file mode 100644 index b1b57b37..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.php +++ /dev/null @@ -1,250 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>-70,'Flags'=>97,'FontBBox'=>'[-428 -394 808 1053]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>602); -$up=-63; -$ut=44; -$dw=602; -$cw=array( -0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602, -41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602, -51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602, -61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602, -71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602, -81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602, -91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602, -101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602, -111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602, -121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,8364=>602,8218=>602,402=>602,8222=>602, -8230=>602,8224=>602,8225=>602,710=>602,8240=>602,352=>602,8249=>602,338=>602,381=>602,8216=>602, -8217=>602,8220=>602,8221=>602,8226=>602,8211=>602,8212=>602,732=>602,8482=>602,353=>602,8250=>602, -339=>602,382=>602,376=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602, -167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602, -177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602, -187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602, -197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602, -207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602, -217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602, -227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602, -237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602, -247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602, -257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602, -267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602, -277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602, -287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602, -297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602, -307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602, -317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602, -327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602, -337=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602, -349=>602,350=>602,351=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602, -361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602, -371=>602,372=>602,373=>602,374=>602,375=>602,377=>602,378=>602,379=>602,380=>602,383=>602, -384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602, -394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,403=>602,404=>602, -405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602, -415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602, -425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602, -435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602, -445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602, -464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602, -474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602, -486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602, -500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602,512=>602, -513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602,522=>602, -523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602,532=>602, -533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602,542=>602, -543=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602,554=>602,555=>602, -556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602,564=>602,565=>602, -566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602,574=>602,575=>602, -576=>602,577=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602,594=>602,595=>602, -596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602,604=>602,605=>602, -606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602,614=>602,615=>602, -616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602,624=>602,625=>602, -626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602,634=>602,635=>602, -636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602,644=>602,645=>602, -646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602,654=>602,655=>602, -656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602,664=>602,665=>602, -666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602,674=>602,675=>602, -676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602,684=>602,685=>602, -686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602,694=>602,695=>602, -696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602,705=>602,711=>602, -712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602,726=>602,727=>602, -728=>602,729=>602,730=>602,731=>602,733=>602,734=>602,736=>602,737=>602,738=>602,739=>602, -740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602,768=>602,769=>602, -770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602,778=>602,779=>602, -780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602,788=>602,789=>602, -790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602,798=>602,799=>602, -800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602,808=>602,809=>602, -810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602,818=>602,819=>602, -820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602,828=>602,829=>602, -830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602,894=>602,900=>602, -901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602,911=>602,912=>602, -913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602,921=>602,922=>602, -923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602,932=>602,933=>602, -934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602,942=>602,943=>602, -944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602,952=>602,953=>602, -954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602,962=>602,963=>602, -964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602,972=>602,973=>602, -974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602,983=>602,984=>602, -985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602,993=>602,1008=>602, -1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602,1017=>602,1018=>602, -1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602,1027=>602,1028=>602, -1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602,1037=>602,1038=>602, -1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602,1047=>602,1048=>602, -1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602,1057=>602,1058=>602, -1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602,1067=>602,1068=>602, -1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602,1077=>602,1078=>602, -1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602,1087=>602,1088=>602, -1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602,1097=>602,1098=>602, -1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602,1107=>602,1108=>602, -1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602,1117=>602,1118=>602, -1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602,1171=>602,1172=>602, -1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602,1187=>602,1194=>602, -1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602,1203=>602,1210=>602, -1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602,1227=>602,1228=>602, -1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602,1239=>602,1240=>602, -1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602,1249=>602,1250=>602, -1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602,1259=>602,1260=>602, -1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602,1269=>602,1270=>602, -1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602,1309=>602,3713=>602, -3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602,3735=>602, -3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602,3747=>602, -3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602,3762=>602, -3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602,3784=>602, -3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602,4308=>602, -4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602,4318=>602, -4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602,4328=>602, -4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602,4338=>602, -4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602,4348=>602, -7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602,7468=>602, -7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602,7479=>602, -7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602,7490=>602, -7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602,7500=>602, -7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602,7510=>602, -7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602,7543=>602, -7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602,7585=>602, -7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602,7595=>602, -7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602,7605=>602, -7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602,7680=>602, -7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602,7690=>602, -7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602,7704=>602, -7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602,7714=>602, -7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602,7724=>602, -7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602,7736=>602, -7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602,7746=>602, -7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602,7756=>602, -7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602,7772=>602, -7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602,7786=>602, -7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602,7796=>602, -7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602,7808=>602, -7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602,7818=>602, -7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602,7828=>602, -7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602,7852=>602, -7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602,7878=>602, -7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602,7900=>602, -7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602,7914=>602, -7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602,7928=>602, -7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602,7944=>602, -7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602,7954=>602, -7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602,7968=>602, -7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602,7978=>602, -7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602,7988=>602, -7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602,7998=>602, -7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602,8010=>602, -8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602,8022=>602, -8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602,8036=>602, -8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602,8046=>602, -8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602,8056=>602, -8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602,8068=>602, -8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602,8078=>602, -8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602,8088=>602, -8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602,8098=>602, -8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602,8108=>602, -8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602,8119=>602, -8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602,8129=>602, -8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602,8140=>602, -8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602,8152=>602, -8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602,8163=>602, -8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602,8173=>602, -8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602,8186=>602, -8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602,8197=>602, -8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8213=>602,8215=>602, -8219=>602,8223=>602,8227=>602,8239=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602,8246=>602, -8247=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602,8287=>602, -8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602,8315=>602, -8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602,8325=>602, -8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602,8336=>602, -8337=>602,8338=>602,8339=>602,8340=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602,8357=>602, -8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8365=>602,8366=>602,8367=>602,8368=>602, -8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8450=>602,8453=>602,8461=>602,8462=>602,8463=>602, -8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8484=>602,8486=>602,8490=>602,8491=>602, -8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602,8539=>602, -8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602,8597=>602, -8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602,8607=>602, -8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602,8617=>602, -8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602,8627=>602, -8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602,8637=>602, -8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602,8647=>602, -8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602,8657=>602, -8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602,8667=>602, -8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602,8677=>602, -8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602,8687=>602, -8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602,8697=>602, -8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602,8707=>602, -8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602,8717=>602, -8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602,8731=>602, -8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602,8747=>602, -8748=>602,8749=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602,8770=>602, -8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602,8780=>602, -8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602,8790=>602, -8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602,8800=>602, -8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602,8813=>602, -8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602,8823=>602, -8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602,8833=>602, -8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602,8843=>602, -8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602,8858=>602, -8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8901=>602,8902=>602,8909=>602, -8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602,8931=>602, -8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602,8962=>602, -8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602,8973=>602, -8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602,8985=>602, -8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602,9000=>602, -9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602,9022=>602, -9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602,9037=>602, -9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602,9052=>602, -9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602,9068=>602, -9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602,9080=>602, -9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602,9098=>602, -9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602,9122=>602, -9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602,9132=>602, -9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602, -9605=>602,9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602, -9615=>602,9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602, -9625=>602,9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602, -9635=>602,9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602, -9645=>602,9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602, -9655=>602,9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602, -9665=>602,9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602, -9675=>602,9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602, -9685=>602,9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602, -9695=>602,9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602, -9705=>602,9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602, -9715=>602,9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602, -9725=>602,9726=>602,9727=>602,9728=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9791=>602, -9792=>602,9793=>602,9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9824=>602,9825=>602, -9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602,9833=>602,9834=>602,9835=>602,9836=>602, -9837=>602,9838=>602,9839=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602,10731=>602,10746=>602, -10747=>602,10799=>602,11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602,11032=>602,11033=>602, -11034=>602,11364=>602,11374=>602,11375=>602,11381=>602,11382=>602,11383=>602,11385=>602,11386=>602,11388=>602, -11389=>602,11800=>602,11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602,42761=>602,42762=>602, -42763=>602,42764=>602,42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602,42771=>602,42772=>602, -42773=>602,42774=>602,42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42790=>602,42791=>602,42889=>602, -42890=>602,42891=>602,42892=>602,63173=>602,64257=>602,64258=>602,65529=>602,65530=>602,65531=>602,65532=>602, -65533=>602); -$enc=''; -$diff=''; -$file='dejavusansmonobi.z'; -$ctg='dejavusansmonobi.ctg.z'; -$originalsize=223408; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.z deleted file mode 100644 index 08c6170b..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonobi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.ctg.z deleted file mode 100644 index 7b8bc17d..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.php deleted file mode 100644 index 68cf9234..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.php +++ /dev/null @@ -1,262 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>-62,'Flags'=>97,'FontBBox'=>'[-406 -375 746 1028]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>602); -$up=-63; -$ut=44; -$dw=602; -$cw=array( -0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602, -41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602, -51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602, -61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602, -71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602, -81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602, -91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602, -101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602, -111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602, -121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,8364=>602,8218=>602,402=>602,8222=>602, -8230=>602,8224=>602,8225=>602,710=>602,8240=>602,352=>602,8249=>602,338=>602,381=>602,8216=>602, -8217=>602,8220=>602,8221=>602,8226=>602,8211=>602,8212=>602,732=>602,8482=>602,353=>602,8250=>602, -339=>602,382=>602,376=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602, -167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602, -177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602, -187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602, -197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602, -207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602, -217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602, -227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602, -237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602, -247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602, -257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602, -267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602, -277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602, -287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602, -297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602, -307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602, -317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602, -327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602, -337=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602, -349=>602,350=>602,351=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602, -361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602, -371=>602,372=>602,373=>602,374=>602,375=>602,377=>602,378=>602,379=>602,380=>602,383=>602, -384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602, -394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,403=>602,404=>602, -405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602, -415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602, -425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602, -435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602, -445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602, -464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602, -474=>602,475=>602,476=>602,477=>602,479=>602,480=>602,481=>602,482=>602,483=>602,486=>602, -487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602,500=>602, -501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602,512=>602,513=>602, -514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602,522=>602,523=>602, -524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602,532=>602,533=>602, -534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602,542=>602,543=>602, -545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602,554=>602,555=>602,556=>602, -557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602,564=>602,565=>602,566=>602, -567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602,574=>602,575=>602,576=>602, -577=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602,594=>602,595=>602,596=>602, -597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602,604=>602,605=>602,606=>602, -607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602,614=>602,615=>602,616=>602, -617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602,624=>602,625=>602,626=>602, -627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602,634=>602,635=>602,636=>602, -637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602,644=>602,645=>602,646=>602, -647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602,654=>602,655=>602,656=>602, -657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602,664=>602,665=>602,666=>602, -667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602,674=>602,675=>602,676=>602, -677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602,684=>602,685=>602,686=>602, -687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602,694=>602,695=>602,696=>602, -697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602,705=>602,711=>602,712=>602, -713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602,726=>602,727=>602,728=>602, -729=>602,730=>602,731=>602,733=>602,734=>602,736=>602,737=>602,738=>602,739=>602,740=>602, -741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602,768=>602,769=>602,770=>602, -771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602,778=>602,779=>602,780=>602, -781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602,788=>602,789=>602,790=>602, -791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602,798=>602,799=>602,800=>602, -801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602,808=>602,809=>602,810=>602, -811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602,818=>602,819=>602,820=>602, -821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602,828=>602,829=>602,830=>602, -831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602,894=>602,900=>602,901=>602, -902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602,911=>602,912=>602,913=>602, -914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602,921=>602,922=>602,923=>602, -924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602,932=>602,933=>602,934=>602, -935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602,942=>602,943=>602,944=>602, -945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602,952=>602,953=>602,954=>602, -955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602,962=>602,963=>602,964=>602, -965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602,972=>602,973=>602,974=>602, -976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602,983=>602,984=>602,985=>602, -986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602,993=>602,1008=>602,1009=>602, -1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602,1017=>602,1018=>602,1019=>602, -1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602,1027=>602,1028=>602,1029=>602, -1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602,1037=>602,1038=>602,1039=>602, -1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602,1047=>602,1048=>602,1049=>602, -1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602,1057=>602,1058=>602,1059=>602, -1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602,1067=>602,1068=>602,1069=>602, -1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602,1077=>602,1078=>602,1079=>602, -1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602,1087=>602,1088=>602,1089=>602, -1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602,1097=>602,1098=>602,1099=>602, -1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602,1107=>602,1108=>602,1109=>602, -1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602,1117=>602,1118=>602,1119=>602, -1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602,1171=>602,1172=>602,1173=>602, -1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602,1187=>602,1194=>602,1195=>602, -1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602,1203=>602,1210=>602,1211=>602, -1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602,1227=>602,1228=>602,1231=>602, -1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602,1239=>602,1240=>602,1241=>602, -1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602,1249=>602,1250=>602,1251=>602, -1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602,1259=>602,1260=>602,1261=>602, -1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602,1269=>602,1270=>602,1271=>602, -1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602,1309=>602,3713=>602,3714=>602, -3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602,3735=>602,3737=>602, -3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602,3747=>602,3749=>602, -3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602,3762=>602,3763=>602, -3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602,3784=>602,3785=>602, -3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602,4308=>602,4309=>602, -4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602,4318=>602,4319=>602, -4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602,4328=>602,4329=>602, -4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602,4338=>602,4339=>602, -4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602,4348=>602,7426=>602, -7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602,7468=>602,7469=>602, -7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602,7479=>602,7480=>602, -7481=>602,7482=>602,7483=>602,7484=>602,7485=>602,7486=>602,7487=>602,7488=>602,7489=>602,7490=>602, -7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602,7500=>602, -7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602,7510=>602, -7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602,7543=>602, -7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602,7585=>602, -7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602,7595=>602, -7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602,7605=>602, -7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602,7680=>602, -7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602,7690=>602, -7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602,7704=>602, -7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602,7714=>602, -7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602,7724=>602, -7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602,7736=>602, -7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602,7746=>602, -7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602,7756=>602, -7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602,7772=>602, -7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602,7786=>602, -7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602,7796=>602, -7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602,7808=>602, -7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602,7818=>602, -7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602,7828=>602, -7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602,7852=>602, -7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602,7878=>602, -7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602,7900=>602, -7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602,7914=>602, -7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602,7928=>602, -7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602,7944=>602, -7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602,7954=>602, -7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602,7968=>602, -7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602,7978=>602, -7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602,7988=>602, -7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602,7998=>602, -7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602,8010=>602, -8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602,8022=>602, -8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602,8036=>602, -8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602,8046=>602, -8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602,8056=>602, -8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602,8068=>602, -8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602,8078=>602, -8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602,8088=>602, -8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602,8098=>602, -8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602,8108=>602, -8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602,8119=>602, -8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602,8129=>602, -8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602,8140=>602, -8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602,8152=>602, -8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602,8163=>602, -8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602,8173=>602, -8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602,8186=>602, -8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602,8197=>602, -8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8213=>602,8215=>602, -8219=>602,8223=>602,8227=>602,8239=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602,8246=>602, -8247=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602,8287=>602, -8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602,8315=>602, -8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602,8325=>602, -8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602,8336=>602, -8337=>602,8338=>602,8339=>602,8340=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602,8357=>602, -8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8365=>602,8366=>602,8367=>602,8368=>602, -8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8450=>602,8453=>602,8461=>602,8462=>602,8463=>602, -8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8484=>602,8486=>602,8490=>602,8491=>602, -8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602,8539=>602, -8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602,8597=>602, -8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602,8607=>602, -8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602,8617=>602, -8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602,8627=>602, -8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602,8637=>602, -8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602,8647=>602, -8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602,8657=>602, -8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602,8667=>602, -8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602,8677=>602, -8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602,8687=>602, -8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602,8697=>602, -8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602,8707=>602, -8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602,8717=>602, -8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602,8731=>602, -8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602,8747=>602, -8748=>602,8749=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602,8770=>602, -8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602,8780=>602, -8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602,8790=>602, -8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602,8800=>602, -8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602,8813=>602, -8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602,8823=>602, -8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602,8833=>602, -8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602,8843=>602, -8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602,8858=>602, -8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8901=>602,8902=>602,8909=>602, -8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602,8931=>602, -8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602,8962=>602, -8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602,8973=>602, -8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602,8985=>602, -8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602,9000=>602, -9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602,9022=>602, -9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602,9037=>602, -9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602,9052=>602, -9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602,9068=>602, -9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602,9080=>602, -9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602,9098=>602, -9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602,9122=>602, -9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602,9132=>602, -9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602, -9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602, -9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602, -9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602, -9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602, -9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602, -9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602, -9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602, -9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602, -9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602, -9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602, -9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602, -9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602, -9597=>602,9598=>602,9599=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602,9605=>602,9606=>602, -9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602,9615=>602,9616=>602, -9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602,9625=>602,9626=>602, -9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602,9635=>602,9636=>602, -9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602,9645=>602,9646=>602, -9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602,9655=>602,9656=>602, -9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602,9665=>602,9666=>602, -9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602,9675=>602,9676=>602, -9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602,9685=>602,9686=>602, -9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602,9695=>602,9696=>602, -9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602,9705=>602,9706=>602, -9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602,9715=>602,9716=>602, -9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602,9725=>602,9726=>602, -9727=>602,9728=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9791=>602,9792=>602,9793=>602, -9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9824=>602,9825=>602,9826=>602,9827=>602, -9828=>602,9829=>602,9830=>602,9831=>602,9833=>602,9834=>602,9835=>602,9836=>602,9837=>602,9838=>602, -9839=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602,10731=>602,10746=>602,10747=>602,10799=>602, -11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602,11032=>602,11033=>602,11034=>602,11364=>602, -11374=>602,11375=>602,11381=>602,11382=>602,11383=>602,11385=>602,11386=>602,11388=>602,11389=>602,11800=>602, -11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602,42761=>602,42762=>602,42763=>602,42764=>602, -42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602,42771=>602,42772=>602,42773=>602,42774=>602, -42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42790=>602,42791=>602,42889=>602,42890=>602,42891=>602, -42892=>602,63173=>602,64257=>602,64258=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602); -$enc=''; -$diff=''; -$file='dejavusansmonoi.z'; -$ctg='dejavusansmonoi.ctg.z'; -$originalsize=229284; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.z deleted file mode 100644 index fab337c9..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavusansmonoi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.ctg.z deleted file mode 100644 index 6e01b837..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.php deleted file mode 100644 index 058684d0..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.php +++ /dev/null @@ -1,313 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>6,'Flags'=>32,'FontBBox'=>'[-770 -347 1679 1242]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); -$up=-63; -$ut=44; -$dw=600; -$cw=array( -0=>600,32=>318,33=>402,34=>460,35=>838,36=>636,37=>950,38=>890,39=>275,40=>390, -41=>390,42=>500,43=>838,44=>318,45=>338,46=>318,47=>337,48=>636,49=>636,50=>636, -51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838, -61=>838,62=>838,63=>536,64=>1000,65=>722,66=>735,67=>765,68=>802,69=>730,70=>694, -71=>799,72=>872,73=>395,74=>401,75=>747,76=>664,77=>1024,78=>875,79=>820,80=>673, -81=>820,82=>753,83=>685,84=>667,85=>843,86=>722,87=>1028,88=>712,89=>660,90=>695, -91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>596,98=>640,99=>560,100=>640, -101=>592,102=>370,103=>640,104=>644,105=>320,106=>310,107=>606,108=>320,109=>948,110=>644, -111=>602,112=>640,113=>640,114=>478,115=>513,116=>402,117=>644,118=>565,119=>856,120=>564, -121=>565,122=>527,123=>636,124=>337,125=>636,126=>838,8364=>636,8218=>318,402=>370,8222=>518, -8230=>1000,8224=>500,8225=>500,710=>500,8240=>1342,352=>685,8249=>400,338=>1137,381=>695,8216=>318, -8217=>318,8220=>511,8221=>511,8226=>590,8211=>500,8212=>1000,732=>500,8482=>1000,353=>513,8250=>400, -339=>989,382=>527,376=>660,160=>318,161=>402,162=>636,163=>636,164=>636,165=>636,166=>337, -167=>500,168=>500,169=>1000,170=>475,171=>612,172=>838,173=>338,174=>1000,175=>500,176=>500, -177=>838,178=>401,179=>401,180=>500,181=>650,182=>636,183=>318,184=>500,185=>401,186=>470, -187=>612,188=>969,189=>969,190=>969,191=>536,192=>722,193=>722,194=>722,195=>722,196=>722, -197=>722,198=>1001,199=>765,200=>730,201=>730,202=>730,203=>730,204=>395,205=>395,206=>395, -207=>395,208=>807,209=>875,210=>820,211=>820,212=>820,213=>820,214=>820,215=>838,216=>820, -217=>843,218=>843,219=>843,220=>843,221=>660,222=>676,223=>668,224=>596,225=>596,226=>596, -227=>596,228=>596,229=>596,230=>940,231=>560,232=>592,233=>592,234=>592,235=>592,236=>320, -237=>320,238=>320,239=>320,240=>602,241=>644,242=>602,243=>602,244=>602,245=>602,246=>602, -247=>838,248=>602,249=>644,250=>644,251=>644,252=>644,253=>565,254=>640,255=>565,256=>722, -257=>596,258=>722,259=>596,260=>722,261=>596,262=>765,263=>560,264=>765,265=>560,266=>765, -267=>560,268=>765,269=>560,270=>802,271=>640,272=>807,273=>640,274=>730,275=>592,276=>730, -277=>592,278=>730,279=>592,280=>730,281=>592,282=>730,283=>592,284=>799,285=>640,286=>799, -287=>640,288=>799,289=>640,290=>799,291=>640,292=>872,293=>644,294=>872,295=>644,296=>395, -297=>320,298=>395,299=>320,300=>395,301=>320,302=>395,303=>320,304=>395,305=>320,306=>801, -307=>533,308=>401,309=>310,310=>747,311=>606,312=>606,313=>664,314=>320,315=>664,316=>320, -317=>664,318=>320,319=>664,320=>320,321=>669,322=>324,323=>875,324=>644,325=>875,326=>644, -327=>875,328=>644,329=>866,330=>843,331=>644,332=>820,333=>602,334=>820,335=>602,336=>820, -337=>602,340=>753,341=>478,342=>753,343=>478,344=>753,345=>478,346=>685,347=>513,348=>685, -349=>513,350=>685,351=>513,354=>667,355=>402,356=>667,357=>402,358=>667,359=>402,360=>843, -361=>644,362=>843,363=>644,364=>843,365=>644,366=>843,367=>644,368=>843,369=>644,370=>843, -371=>644,372=>1028,373=>856,374=>660,375=>565,377=>695,378=>527,379=>695,380=>527,383=>370, -384=>640,385=>735,386=>735,387=>640,388=>735,389=>640,390=>765,391=>765,392=>560,393=>807, -394=>802,395=>735,396=>640,397=>602,398=>730,399=>820,400=>623,401=>694,403=>799,404=>712, -405=>932,406=>395,407=>395,408=>747,409=>606,410=>320,411=>634,412=>948,413=>875,414=>644, -415=>820,416=>820,417=>602,418=>1040,419=>807,420=>673,421=>640,422=>753,423=>685,424=>513, -425=>707,426=>324,427=>402,428=>667,429=>402,430=>667,431=>843,432=>644,433=>829,434=>760, -435=>738,436=>663,437=>695,438=>527,439=>564,440=>564,441=>564,443=>636,444=>687,445=>564, -446=>536,448=>295,449=>492,450=>459,451=>295,452=>1497,453=>1329,454=>1167,455=>1065,456=>974, -457=>630,458=>1276,459=>1185,460=>954,461=>722,462=>596,463=>395,464=>320,465=>820,466=>602, -467=>843,468=>644,469=>843,470=>644,471=>843,472=>644,473=>843,474=>644,475=>843,476=>644, -477=>592,478=>722,479=>596,480=>722,481=>596,482=>1001,483=>940,484=>848,485=>640,486=>799, -487=>640,488=>747,489=>606,490=>820,491=>602,492=>820,493=>602,494=>564,495=>564,496=>320, -497=>1497,498=>1329,499=>1167,500=>799,501=>640,502=>1154,504=>875,505=>644,506=>722,507=>596, -508=>1001,509=>940,510=>820,511=>602,512=>722,513=>596,514=>722,515=>596,516=>730,517=>592, -518=>730,519=>592,520=>395,521=>320,522=>395,523=>320,524=>820,525=>602,526=>820,527=>602, -528=>753,529=>478,530=>753,531=>478,532=>843,533=>644,534=>843,535=>644,536=>685,537=>513, -538=>667,539=>402,540=>627,541=>521,542=>872,543=>644,544=>843,545=>814,548=>695,549=>527, -550=>722,551=>596,552=>730,553=>592,554=>820,555=>602,556=>820,557=>602,558=>820,559=>602, -560=>820,561=>602,562=>660,563=>565,564=>500,565=>832,566=>494,567=>310,568=>960,569=>960, -570=>722,571=>765,572=>560,573=>664,574=>667,575=>513,576=>527,577=>583,578=>464,581=>722, -592=>596,593=>640,594=>640,595=>640,596=>560,597=>560,598=>647,599=>683,600=>592,601=>592, -602=>843,603=>518,604=>509,605=>773,606=>613,607=>315,608=>683,609=>640,610=>544,611=>712, -612=>564,613=>644,614=>644,615=>644,616=>320,617=>392,618=>320,619=>380,620=>454,621=>363, -622=>704,623=>948,624=>948,625=>948,626=>644,627=>694,628=>646,629=>602,630=>790,631=>647, -632=>602,633=>501,634=>501,635=>551,636=>478,637=>478,638=>453,639=>453,640=>594,641=>594, -642=>513,643=>271,644=>370,645=>487,646=>324,647=>402,648=>402,649=>644,650=>620,651=>608, -652=>565,653=>856,654=>565,655=>655,656=>597,657=>560,658=>564,659=>560,660=>536,661=>536, -662=>536,663=>513,664=>820,665=>563,666=>613,667=>654,668=>667,669=>366,670=>606,671=>646, -672=>683,673=>536,674=>536,675=>996,676=>1033,677=>998,678=>809,679=>598,680=>782,681=>894, -682=>646,683=>676,684=>598,685=>443,686=>781,687=>767,688=>433,689=>430,690=>264,691=>347, -692=>347,693=>430,694=>392,695=>585,696=>423,697=>278,699=>318,700=>318,701=>318,702=>307, -703=>307,704=>280,705=>281,711=>500,712=>275,713=>500,716=>275,720=>337,721=>337,722=>307, -723=>307,726=>329,728=>500,729=>500,730=>500,731=>500,733=>500,734=>417,736=>447,737=>243, -738=>337,739=>424,740=>281,741=>493,742=>493,743=>493,744=>493,745=>493,750=>484,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>740,881=>531,884=>278, -885=>278,890=>500,891=>560,892=>560,893=>560,894=>337,900=>500,901=>500,902=>722,903=>318, -904=>900,905=>1039,906=>562,908=>835,910=>897,911=>853,912=>392,913=>722,914=>735,915=>694, -916=>722,917=>730,918=>695,919=>872,920=>820,921=>395,922=>747,923=>722,924=>1024,925=>875, -926=>704,927=>820,928=>872,929=>673,931=>707,932=>667,933=>660,934=>820,935=>712,936=>877, -937=>829,938=>395,939=>660,940=>675,941=>518,942=>599,943=>392,944=>608,945=>675,946=>578, -947=>598,948=>602,949=>518,950=>542,951=>599,952=>602,953=>392,954=>625,955=>634,956=>650, -957=>608,958=>551,959=>602,960=>657,961=>588,962=>560,963=>683,964=>553,965=>608,966=>700, -967=>606,968=>784,969=>815,970=>392,971=>608,972=>602,973=>608,974=>815,976=>583,977=>715, -978=>687,979=>874,980=>687,981=>682,982=>815,983=>624,984=>820,985=>602,986=>765,987=>560, -988=>694,989=>463,990=>590,991=>660,992=>782,993=>577,1008=>624,1009=>588,1010=>560,1011=>310, -1012=>820,1013=>560,1014=>560,1015=>676,1016=>640,1017=>765,1018=>1024,1019=>708,1020=>588,1021=>765, -1022=>765,1023=>765,1024=>730,1025=>730,1026=>799,1027=>662,1028=>765,1029=>685,1030=>395,1031=>395, -1032=>401,1033=>1084,1034=>1118,1035=>872,1036=>774,1037=>872,1038=>723,1039=>872,1040=>757,1041=>735, -1042=>735,1043=>662,1044=>813,1045=>730,1046=>1124,1047=>623,1048=>872,1049=>872,1050=>774,1051=>834, -1052=>1024,1053=>872,1054=>820,1055=>872,1056=>673,1057=>765,1058=>667,1059=>723,1060=>830,1061=>712, -1062=>872,1063=>773,1064=>1141,1065=>1141,1066=>794,1067=>984,1068=>674,1069=>765,1070=>1193,1071=>808, -1072=>596,1073=>602,1074=>563,1075=>524,1076=>616,1077=>592,1078=>920,1079=>545,1080=>667,1081=>667, -1082=>625,1083=>635,1084=>778,1085=>667,1086=>602,1087=>667,1088=>640,1089=>560,1090=>553,1091=>588, -1092=>783,1093=>564,1094=>643,1095=>661,1096=>930,1097=>930,1098=>636,1099=>796,1100=>544,1101=>560, -1102=>871,1103=>631,1104=>592,1105=>592,1106=>624,1107=>524,1108=>560,1109=>513,1110=>320,1111=>320, -1112=>310,1113=>843,1114=>860,1115=>644,1116=>625,1117=>667,1118=>588,1119=>656,1122=>762,1123=>603, -1124=>1129,1125=>834,1130=>1124,1131=>920,1136=>944,1137=>902,1138=>820,1139=>552,1140=>859,1141=>678, -1164=>707,1165=>544,1168=>672,1169=>529,1170=>662,1171=>523,1172=>728,1173=>614,1174=>1124,1175=>920, -1176=>636,1177=>537,1178=>774,1179=>606,1182=>774,1183=>625,1184=>891,1185=>717,1186=>872,1187=>641, -1188=>1139,1189=>852,1190=>1205,1191=>941,1194=>765,1195=>560,1196=>667,1197=>553,1198=>660,1199=>565, -1200=>660,1201=>565,1202=>712,1203=>564,1204=>952,1205=>732,1206=>749,1207=>690,1210=>749,1211=>644, -1216=>395,1217=>1124,1218=>920,1219=>747,1220=>606,1223=>872,1224=>667,1227=>749,1228=>667,1231=>320, -1232=>757,1233=>596,1234=>757,1235=>596,1236=>1001,1237=>940,1238=>730,1239=>592,1240=>820,1241=>592, -1242=>820,1243=>592,1244=>1124,1245=>920,1246=>623,1247=>545,1248=>564,1249=>564,1250=>872,1251=>667, -1252=>872,1253=>667,1254=>820,1255=>602,1256=>820,1257=>602,1258=>820,1259=>602,1260=>765,1261=>560, -1262=>723,1263=>588,1264=>723,1265=>588,1266=>723,1267=>588,1268=>773,1269=>661,1270=>662,1271=>524, -1272=>984,1273=>796,1296=>623,1297=>545,1298=>834,1299=>635,1300=>1198,1301=>919,1306=>820,1307=>640, -1308=>1028,1309=>856,4256=>723,4257=>850,4258=>828,4259=>859,4260=>733,4261=>981,4262=>916,4263=>1101, -4264=>566,4265=>750,4266=>962,4267=>941,4268=>743,4269=>1075,4270=>896,4271=>829,4272=>1040,4273=>733, -4274=>669,4275=>1015,4276=>937,4277=>1020,4278=>731,4279=>733,4280=>732,4281=>733,4282=>879,4283=>937, -4284=>714,4285=>755,4286=>733,4287=>958,4288=>1000,4289=>702,4290=>864,4291=>734,4292=>837,4293=>951, -4304=>541,4305=>571,4306=>589,4307=>833,4308=>561,4309=>557,4310=>618,4311=>861,4312=>560,4313=>546, -4314=>1066,4315=>586,4316=>586,4317=>825,4318=>570,4319=>581,4320=>824,4321=>607,4322=>748,4323=>698, -4324=>815,4325=>585,4326=>858,4327=>568,4328=>594,4329=>586,4330=>675,4331=>587,4332=>582,4333=>576, -4334=>612,4335=>683,4336=>572,4337=>603,4338=>571,4339=>572,4340=>570,4341=>649,4342=>886,4343=>626, -4344=>582,4345=>619,4346=>571,4347=>437,4348=>354,7426=>940,7432=>509,7433=>320,7444=>989,7446=>602, -7447=>602,7453=>737,7454=>948,7455=>948,7468=>455,7469=>630,7470=>463,7472=>505,7473=>459,7474=>459, -7475=>503,7476=>549,7477=>249,7478=>252,7479=>470,7480=>418,7481=>645,7482=>551,7483=>551,7484=>516, -7486=>424,7487=>474,7488=>420,7489=>531,7490=>647,7491=>386,7492=>386,7493=>400,7494=>618,7495=>400, -7496=>400,7497=>387,7498=>387,7499=>340,7500=>340,7501=>400,7502=>175,7503=>365,7504=>613,7505=>399, -7506=>385,7507=>346,7508=>385,7509=>385,7510=>400,7511=>247,7512=>399,7513=>464,7514=>613,7515=>373, -7522=>201,7523=>347,7524=>399,7525=>373,7543=>640,7544=>549,7547=>372,7557=>320,7579=>400,7580=>346, -7581=>346,7582=>385,7583=>340,7584=>222,7585=>229,7586=>400,7587=>399,7588=>234,7589=>244,7590=>234, -7591=>234,7592=>230,7593=>175,7594=>175,7595=>367,7596=>613,7597=>613,7598=>407,7599=>404,7600=>399, -7601=>385,7602=>385,7603=>328,7604=>211,7605=>247,7606=>399,7607=>389,7609=>376,7610=>373,7611=>331, -7612=>331,7613=>331,7614=>364,7615=>385,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, -7680=>722,7681=>596,7682=>735,7683=>640,7684=>735,7685=>640,7686=>735,7687=>640,7688=>765,7689=>560, -7690=>802,7691=>640,7692=>802,7693=>640,7694=>802,7695=>640,7696=>802,7697=>640,7698=>802,7699=>640, -7700=>730,7701=>592,7702=>730,7703=>592,7704=>730,7705=>592,7706=>730,7707=>592,7708=>730,7709=>592, -7710=>694,7711=>370,7712=>799,7713=>640,7714=>872,7715=>644,7716=>872,7717=>644,7718=>872,7719=>644, -7720=>872,7721=>644,7722=>872,7723=>644,7724=>395,7725=>320,7728=>747,7729=>606,7730=>747,7731=>606, -7732=>747,7733=>606,7734=>664,7735=>320,7736=>664,7737=>320,7738=>664,7739=>320,7740=>664,7741=>320, -7742=>1024,7743=>948,7744=>1024,7745=>948,7746=>1024,7747=>948,7748=>875,7749=>644,7750=>875,7751=>644, -7752=>875,7753=>644,7754=>875,7755=>644,7756=>820,7757=>602,7760=>820,7761=>602,7762=>820,7763=>602, -7764=>673,7765=>640,7766=>673,7767=>640,7768=>753,7769=>478,7770=>753,7771=>478,7772=>753,7773=>478, -7774=>753,7775=>478,7776=>685,7777=>513,7778=>685,7779=>513,7784=>685,7785=>513,7786=>667,7787=>402, -7788=>667,7789=>402,7790=>667,7791=>402,7792=>667,7793=>402,7794=>843,7795=>644,7796=>843,7797=>644, -7798=>843,7799=>644,7800=>843,7801=>644,7802=>843,7803=>644,7804=>722,7805=>565,7806=>722,7807=>565, -7808=>1028,7809=>856,7810=>1028,7811=>856,7812=>1028,7813=>856,7814=>1028,7815=>856,7816=>1028,7817=>856, -7818=>712,7819=>564,7820=>712,7821=>564,7822=>660,7823=>565,7824=>695,7825=>527,7826=>695,7827=>527, -7828=>695,7829=>527,7830=>644,7831=>402,7832=>856,7833=>565,7834=>903,7835=>370,7838=>829,7839=>602, -7840=>722,7841=>596,7842=>722,7843=>596,7852=>722,7853=>596,7854=>722,7855=>596,7856=>722,7857=>596, -7858=>722,7859=>596,7860=>722,7861=>596,7862=>722,7863=>596,7864=>730,7865=>592,7866=>730,7867=>592, -7868=>730,7869=>592,7878=>730,7879=>592,7880=>395,7881=>320,7882=>395,7883=>320,7884=>820,7885=>602, -7886=>820,7887=>602,7896=>820,7897=>602,7908=>843,7909=>644,7910=>843,7911=>644,7922=>660,7923=>565, -7924=>660,7925=>565,7926=>660,7927=>565,7928=>660,7929=>565,7936=>675,7937=>675,7938=>675,7939=>675, -7940=>675,7941=>675,7942=>675,7943=>675,7944=>722,7945=>722,7946=>869,7947=>869,7948=>734,7949=>763, -7950=>722,7951=>722,7952=>537,7953=>537,7954=>537,7955=>537,7956=>537,7957=>537,7960=>853,7961=>841, -7962=>1067,7963=>1077,7964=>1008,7965=>1035,7968=>599,7969=>599,7970=>599,7971=>599,7972=>599,7973=>599, -7974=>599,7975=>599,7976=>998,7977=>992,7978=>1212,7979=>1224,7980=>1159,7981=>1183,7982=>1098,7983=>1095, -7984=>392,7985=>392,7986=>392,7987=>392,7988=>392,7989=>392,7990=>392,7991=>392,7992=>521,7993=>512, -7994=>735,7995=>738,7996=>679,7997=>706,7998=>624,7999=>615,8000=>602,8001=>602,8002=>602,8003=>602, -8004=>602,8005=>602,8008=>820,8009=>859,8010=>1120,8011=>1127,8012=>937,8013=>964,8016=>608,8017=>608, -8018=>608,8019=>608,8020=>608,8021=>608,8022=>608,8023=>608,8025=>851,8027=>1079,8029=>1044,8031=>953, -8032=>815,8033=>815,8034=>815,8035=>815,8036=>815,8037=>815,8038=>815,8039=>815,8040=>829,8041=>870, -8042=>1131,8043=>1137,8044=>946,8045=>976,8046=>938,8047=>970,8048=>675,8049=>675,8050=>537,8051=>537, -8052=>599,8053=>599,8054=>392,8055=>392,8056=>602,8057=>602,8058=>608,8059=>608,8060=>815,8061=>815, -8064=>675,8065=>675,8066=>675,8067=>675,8068=>675,8069=>675,8070=>675,8071=>675,8072=>722,8073=>722, -8074=>869,8075=>869,8076=>734,8077=>763,8078=>722,8079=>722,8080=>599,8081=>599,8082=>599,8083=>599, -8084=>599,8085=>599,8086=>599,8087=>599,8088=>998,8089=>992,8090=>1212,8091=>1224,8092=>1159,8093=>1183, -8094=>1098,8095=>1095,8096=>815,8097=>815,8098=>815,8099=>815,8100=>815,8101=>815,8102=>815,8103=>815, -8104=>829,8105=>870,8106=>1131,8107=>1137,8108=>946,8109=>976,8110=>938,8111=>970,8112=>675,8113=>675, -8114=>675,8115=>675,8116=>675,8118=>675,8119=>675,8120=>722,8121=>722,8122=>722,8123=>722,8124=>722, -8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>599,8131=>599,8132=>599,8134=>599,8135=>599, -8136=>912,8137=>900,8138=>1063,8139=>1039,8140=>872,8141=>500,8142=>500,8143=>500,8144=>392,8145=>392, -8146=>392,8147=>392,8150=>392,8151=>392,8152=>395,8153=>395,8154=>588,8155=>562,8157=>500,8158=>500, -8159=>500,8160=>608,8161=>608,8162=>608,8163=>608,8164=>588,8165=>588,8166=>608,8167=>608,8168=>660, -8169=>660,8170=>921,8171=>897,8172=>790,8173=>500,8174=>500,8175=>500,8178=>815,8179=>815,8180=>815, -8182=>815,8183=>815,8184=>961,8185=>835,8186=>984,8187=>853,8188=>829,8189=>500,8190=>500,8192=>500, -8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>338,8209=>338,8210=>636,8213=>1000,8214=>500, -8215=>500,8219=>318,8223=>511,8227=>590,8228=>334,8229=>667,8234=>0,8235=>0,8236=>0,8237=>0, -8238=>0,8239=>200,8241=>1734,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339, -8252=>527,8253=>536,8254=>500,8258=>1000,8260=>167,8261=>390,8262=>390,8263=>976,8264=>753,8265=>753, -8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8273=>500,8274=>450,8275=>1000,8279=>663,8287=>222, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, -8303=>0,8304=>401,8305=>201,8308=>401,8309=>401,8310=>401,8311=>401,8312=>401,8313=>401,8314=>528, -8315=>528,8316=>528,8317=>246,8318=>246,8319=>433,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401, -8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528,8332=>528,8333=>246,8334=>246, -8336=>386,8337=>387,8338=>385,8339=>424,8340=>387,8358=>660,8367=>1057,8369=>706,8372=>780,8373=>636, -8450=>796,8451=>1119,8457=>1047,8461=>945,8462=>644,8463=>644,8469=>914,8470=>946,8473=>752,8474=>871, -8477=>831,8484=>730,8486=>829,8487=>829,8490=>747,8491=>722,8508=>732,8509=>660,8510=>710,8511=>944, -8512=>714,8513=>775,8514=>557,8515=>557,8516=>611,8517=>867,8518=>699,8519=>636,8520=>380,8521=>362, -8523=>890,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969,8539=>969, -8540=>969,8541=>969,8542=>969,8543=>568,8544=>395,8545=>590,8546=>786,8547=>966,8548=>722,8549=>981, -8550=>1176,8551=>1372,8552=>932,8553=>712,8554=>932,8555=>1127,8556=>664,8557=>765,8558=>802,8559=>1024, -8560=>320,8561=>640,8562=>959,8563=>885,8564=>565,8565=>885,8566=>1205,8567=>1524,8568=>884,8569=>564, -8570=>884,8571=>1204,8572=>320,8573=>560,8574=>640,8575=>948,8576=>1206,8577=>802,8578=>1206,8579=>765, -8580=>560,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838, -8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838, -8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838, -8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838, -8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838, -8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838, -8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838, -8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838, -8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838, -8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838, -8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838, -8701=>838,8702=>838,8703=>838,8704=>604,8706=>517,8707=>542,8708=>542,8710=>698,8711=>698,8712=>740, -8713=>740,8715=>740,8716=>740,8719=>796,8720=>796,8721=>714,8722=>838,8723=>838,8724=>838,8725=>337, -8727=>680,8728=>490,8729=>490,8730=>637,8731=>637,8732=>637,8733=>677,8734=>833,8735=>838,8736=>838, -8739=>291,8740=>479,8741=>462,8742=>634,8743=>732,8744=>732,8745=>838,8746=>838,8747=>521,8748=>852, -8749=>1182,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8770=>838,8771=>838,8776=>838, -8784=>838,8785=>838,8786=>838,8787=>838,8788=>1033,8789=>1033,8800=>838,8801=>838,8804=>838,8805=>838, -8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838,8845=>838,8846=>838,8847=>846, -8848=>846,8849=>846,8850=>846,8851=>838,8852=>838,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838, -8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>860,8867=>860, -8868=>940,8869=>940,8870=>567,8871=>567,8872=>860,8873=>860,8874=>860,8875=>1031,8876=>860,8877=>860, -8878=>860,8879=>1031,8901=>342,8962=>764,8968=>390,8969=>390,8970=>390,8971=>390,8976=>838,8977=>513, -8984=>1000,8985=>838,8992=>521,8993=>521,8997=>1000,9000=>1443,9085=>919,9134=>521,9167=>945,9251=>764, -9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602, -9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602, -9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602, -9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602, -9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602, -9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602, -9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602, -9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602, -9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602, -9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602, -9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602, -9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602, -9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602,9599=>602,9600=>769,9601=>769, -9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769, -9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769, -9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769, -9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945, -9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769, -9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769, -9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769, -9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873, -9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970, -9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769,9699=>769,9700=>769,9701=>769, -9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119, -9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769, -9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9784=>896,9785=>896,9786=>896, -9787=>896,9788=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896, -9799=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9833=>472, -9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,10145=>838,10181=>390,10182=>390,10208=>494, -10216=>390,10217=>390,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434, -10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>732,10241=>732, -10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732,10249=>732,10250=>732,10251=>732, -10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732,10259=>732,10260=>732,10261=>732, -10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732,10269=>732,10270=>732,10271=>732, -10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732,10279=>732,10280=>732,10281=>732, -10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732,10289=>732,10290=>732,10291=>732, -10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732,10299=>732,10300=>732,10301=>732, -10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732,10309=>732,10310=>732,10311=>732, -10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732,10319=>732,10320=>732,10321=>732, -10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732,10329=>732,10330=>732,10331=>732, -10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732,10339=>732,10340=>732,10341=>732, -10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732,10349=>732,10350=>732,10351=>732, -10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732,10359=>732,10360=>732,10361=>732, -10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732,10369=>732,10370=>732,10371=>732, -10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732,10379=>732,10380=>732,10381=>732, -10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732,10389=>732,10390=>732,10391=>732, -10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732,10399=>732,10400=>732,10401=>732, -10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732,10409=>732,10410=>732,10411=>732, -10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732,10419=>732,10420=>732,10421=>732, -10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732,10429=>732,10430=>732,10431=>732, -10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732,10439=>732,10440=>732,10441=>732, -10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732,10449=>732,10450=>732,10451=>732, -10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732,10459=>732,10460=>732,10461=>732, -10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732,10469=>732,10470=>732,10471=>732, -10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732,10479=>732,10480=>732,10481=>732, -10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732,10489=>732,10490=>732,10491=>732, -10492=>732,10493=>732,10494=>732,10495=>732,10496=>838,10497=>838,10498=>838,10499=>838,10500=>838,10501=>838, -10502=>838,10503=>838,10504=>838,10505=>838,10506=>838,10507=>838,10508=>838,10509=>838,10510=>838,10511=>838, -10512=>838,10513=>838,10514=>838,10515=>838,10516=>838,10517=>838,10518=>838,10519=>838,10520=>838,10521=>838, -10522=>838,10523=>838,10524=>838,10525=>838,10526=>838,10527=>838,10528=>838,10529=>838,10530=>838,10531=>838, -10532=>838,10533=>838,10534=>838,10535=>838,10536=>838,10537=>838,10538=>838,10539=>838,10540=>838,10541=>838, -10542=>838,10543=>838,10544=>838,10545=>838,10546=>838,10547=>838,10548=>838,10549=>838,10550=>838,10551=>838, -10552=>838,10553=>838,10554=>838,10555=>838,10556=>838,10557=>838,10558=>838,10559=>838,10560=>838,10561=>838, -10562=>838,10563=>838,10564=>838,10565=>838,10566=>838,10567=>838,10568=>838,10569=>838,10570=>838,10571=>838, -10572=>838,10573=>838,10574=>838,10575=>838,10576=>838,10577=>838,10578=>838,10579=>838,10580=>838,10581=>838, -10582=>838,10583=>838,10584=>838,10585=>838,10586=>838,10587=>838,10588=>838,10589=>838,10590=>838,10591=>838, -10592=>838,10593=>838,10594=>838,10595=>838,10596=>838,10597=>838,10598=>838,10599=>838,10600=>838,10601=>838, -10602=>838,10603=>838,10604=>838,10605=>838,10606=>838,10607=>838,10608=>838,10609=>838,10610=>838,10611=>838, -10612=>838,10613=>838,10614=>838,10615=>981,10616=>838,10617=>838,10618=>984,10619=>838,10620=>838,10621=>838, -10622=>838,10623=>838,10731=>494,10764=>1513,10765=>521,10766=>521,10799=>838,11008=>838,11009=>838,11010=>838, -11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838, -11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769, -11031=>769,11032=>769,11033=>769,11034=>945,11364=>753,11367=>872,11368=>644,11369=>747,11370=>606,11371=>695, -11372=>527,11374=>1024,11375=>722,11381=>740,11382=>556,11383=>700,11385=>501,11386=>602,11388=>264,11389=>455, -11520=>773,11521=>635,11522=>633,11523=>658,11524=>631,11525=>962,11526=>756,11527=>960,11528=>617,11529=>646, -11530=>962,11531=>632,11532=>646,11533=>962,11534=>645,11535=>866,11536=>961,11537=>645,11538=>645,11539=>959, -11540=>945,11541=>863,11542=>644,11543=>646,11544=>645,11545=>649,11546=>688,11547=>634,11548=>982,11549=>681, -11550=>676,11551=>852,11552=>957,11553=>632,11554=>645,11555=>646,11556=>749,11557=>914,11800=>536,11810=>390, -11811=>390,11812=>390,11813=>390,11822=>536,42564=>685,42565=>513,42566=>395,42567=>392,42576=>1104,42577=>888, -42580=>1193,42581=>871,42582=>1140,42583=>899,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493, -42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369, -42780=>369,42781=>253,42782=>253,42783=>253,42891=>402,42892=>275,62464=>654,62465=>665,62466=>714,62467=>947, -62468=>665,62469=>659,62470=>725,62471=>986,62472=>665,62473=>665,62474=>1257,62475=>683,62476=>682,62477=>953, -62478=>665,62479=>682,62480=>999,62481=>746,62482=>798,62483=>748,62484=>944,62485=>681,62486=>936,62487=>680, -62488=>688,62489=>682,62490=>729,62491=>682,62492=>688,62493=>666,62494=>729,62495=>884,62496=>665,62497=>706, -62498=>666,62499=>665,62500=>665,62501=>722,62502=>961,62504=>904,63173=>602,63185=>500,63188=>500,64256=>710, -64257=>667,64258=>667,64259=>1028,64260=>1030,64261=>771,64262=>933,65024=>0,65025=>0,65026=>0,65027=>0, -65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0, -65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1025); -$enc=''; -$diff=''; -$file='dejavuserif.z'; -$ctg='dejavuserif.ctg.z'; -$originalsize=328908; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.z deleted file mode 100644 index 00235fa6..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserif.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.ctg.z deleted file mode 100644 index c1a3ccbf..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.php deleted file mode 100644 index c91ee28c..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.php +++ /dev/null @@ -1,299 +0,0 @@ -939,'Descent'=>-236,'CapHeight'=>5,'Flags'=>32,'FontBBox'=>'[-836 -389 1796 1235]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); -$up=-63; -$ut=44; -$dw=600; -$cw=array( -0=>600,32=>348,33=>439,34=>521,35=>838,36=>696,37=>950,38=>903,39=>306,40=>473, -41=>473,42=>523,43=>838,44=>348,45=>415,46=>348,47=>365,48=>696,49=>696,50=>696, -51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>369,59=>369,60=>838, -61=>838,62=>838,63=>586,64=>1000,65=>776,66=>845,67=>796,68=>867,69=>762,70=>710, -71=>854,72=>945,73=>468,74=>473,75=>869,76=>703,77=>1107,78=>914,79=>871,80=>752, -81=>871,82=>831,83=>722,84=>744,85=>872,86=>776,87=>1123,88=>776,89=>714,90=>730, -91=>473,92=>365,93=>473,94=>838,95=>500,96=>500,97=>648,98=>699,99=>609,100=>699, -101=>636,102=>430,103=>699,104=>727,105=>380,106=>362,107=>693,108=>380,109=>1058,110=>727, -111=>667,112=>699,113=>699,114=>527,115=>563,116=>462,117=>727,118=>581,119=>861,120=>596, -121=>581,122=>568,123=>643,124=>364,125=>643,126=>838,8364=>696,8218=>348,402=>430,8222=>575, -8230=>1000,8224=>523,8225=>523,710=>500,8240=>1385,352=>722,8249=>400,338=>1180,381=>730,8216=>348, -8217=>348,8220=>575,8221=>575,8226=>639,8211=>500,8212=>1000,732=>500,8482=>1000,353=>563,8250=>400, -339=>1028,382=>568,376=>714,160=>348,161=>439,162=>696,163=>696,164=>636,165=>696,166=>364, -167=>523,168=>500,169=>1000,170=>487,171=>625,172=>838,173=>415,174=>1000,175=>500,176=>500, -177=>838,178=>438,179=>438,180=>500,181=>732,182=>636,183=>348,184=>500,185=>438,186=>500, -187=>625,188=>1043,189=>1043,190=>1043,191=>586,192=>776,193=>776,194=>776,195=>776,196=>776, -197=>776,198=>1034,199=>796,200=>762,201=>762,202=>762,203=>762,204=>468,205=>468,206=>468, -207=>468,208=>874,209=>914,210=>871,211=>871,212=>871,213=>871,214=>871,215=>838,216=>871, -217=>872,218=>872,219=>872,220=>872,221=>714,222=>757,223=>760,224=>648,225=>648,226=>648, -227=>648,228=>648,229=>648,230=>975,231=>609,232=>636,233=>636,234=>636,235=>636,236=>380, -237=>380,238=>380,239=>380,240=>667,241=>727,242=>667,243=>667,244=>667,245=>667,246=>667, -247=>838,248=>667,249=>727,250=>727,251=>727,252=>727,253=>581,254=>699,255=>581,256=>776, -257=>648,258=>776,259=>648,260=>776,261=>648,262=>796,263=>609,264=>796,265=>609,266=>796, -267=>609,268=>796,269=>609,270=>867,271=>699,272=>874,273=>699,274=>762,275=>636,276=>762, -277=>636,278=>762,279=>636,280=>762,281=>636,282=>762,283=>636,284=>854,285=>699,286=>854, -287=>699,288=>854,289=>699,290=>854,291=>699,292=>945,293=>727,294=>945,295=>727,296=>468, -297=>380,298=>468,299=>380,300=>468,301=>380,302=>468,303=>380,304=>468,305=>380,306=>942, -307=>751,308=>473,309=>362,310=>869,311=>693,312=>693,313=>703,314=>380,315=>703,316=>380, -317=>703,318=>380,319=>703,320=>380,321=>710,322=>385,323=>914,324=>727,325=>914,326=>727, -327=>914,328=>727,329=>1008,330=>872,331=>727,332=>871,333=>667,334=>871,335=>667,336=>871, -337=>667,340=>831,341=>527,342=>831,343=>527,344=>831,345=>527,346=>722,347=>563,348=>722, -349=>563,350=>722,351=>563,354=>744,355=>462,356=>744,357=>462,358=>744,359=>462,360=>872, -361=>727,362=>872,363=>727,364=>872,365=>727,366=>872,367=>727,368=>872,369=>727,370=>872, -371=>727,372=>1123,373=>861,374=>714,375=>581,377=>730,378=>568,379=>730,380=>568,383=>430, -384=>699,385=>845,386=>854,387=>699,388=>854,389=>699,390=>796,391=>796,392=>609,393=>874, -394=>867,395=>854,396=>699,397=>667,398=>762,399=>871,400=>721,401=>710,403=>854,404=>771, -405=>1043,406=>468,407=>468,408=>869,409=>693,410=>380,411=>701,412=>1058,413=>914,414=>727, -415=>871,416=>871,417=>667,418=>1200,419=>943,420=>752,421=>699,422=>831,423=>722,424=>563, -425=>707,426=>331,427=>462,428=>744,429=>462,430=>744,431=>872,432=>727,433=>890,434=>890, -435=>714,436=>708,437=>730,438=>568,439=>657,440=>657,441=>657,443=>696,444=>754,445=>568, -446=>536,448=>295,449=>492,450=>459,451=>295,452=>1597,453=>1435,454=>1267,455=>1176,456=>1065, -457=>742,458=>1387,459=>1276,460=>1089,461=>776,462=>648,463=>468,464=>380,465=>871,466=>667, -467=>872,468=>727,469=>872,470=>727,471=>872,472=>727,473=>872,474=>727,475=>872,476=>727, -477=>636,478=>776,479=>648,480=>776,481=>648,482=>1034,483=>975,484=>896,485=>699,486=>854, -487=>699,488=>869,489=>693,490=>871,491=>667,492=>871,493=>667,494=>657,495=>568,496=>380, -497=>1597,498=>1435,499=>1267,500=>854,501=>699,502=>1221,504=>914,505=>727,506=>776,507=>648, -508=>1034,509=>975,510=>871,511=>667,512=>776,513=>648,514=>776,515=>648,516=>762,517=>636, -518=>762,519=>636,520=>468,521=>380,522=>468,523=>380,524=>871,525=>667,526=>871,527=>667, -528=>831,529=>527,530=>831,531=>527,532=>872,533=>727,534=>872,535=>727,536=>722,537=>563, -538=>744,539=>462,540=>690,541=>607,542=>945,543=>727,544=>872,545=>791,548=>730,549=>568, -550=>776,551=>648,552=>762,553=>636,554=>871,555=>667,556=>871,557=>667,558=>871,559=>667, -560=>871,561=>667,562=>714,563=>581,564=>573,565=>922,566=>564,567=>362,568=>1031,569=>1031, -570=>776,571=>796,572=>609,573=>703,574=>744,575=>563,576=>568,577=>660,578=>547,581=>776, -592=>648,593=>699,594=>699,595=>699,596=>609,597=>609,598=>699,599=>730,600=>636,601=>636, -602=>907,603=>608,604=>562,605=>907,606=>720,607=>387,608=>699,609=>699,610=>626,611=>712, -612=>627,613=>727,614=>727,615=>727,616=>380,617=>380,618=>380,619=>409,620=>514,621=>380, -622=>795,623=>1058,624=>1058,625=>1058,626=>727,627=>727,628=>712,629=>667,630=>1061,631=>749, -632=>667,633=>571,634=>571,635=>571,636=>527,637=>527,638=>452,639=>487,640=>801,641=>801, -642=>563,643=>331,644=>430,645=>540,646=>331,647=>492,648=>462,649=>727,650=>679,651=>694, -652=>641,653=>907,654=>635,655=>727,656=>568,657=>568,658=>568,659=>568,660=>536,661=>536, -662=>536,663=>545,664=>871,665=>695,666=>720,667=>626,668=>732,669=>384,670=>740,671=>646, -672=>699,673=>536,674=>536,675=>1117,676=>1179,677=>1117,678=>911,679=>715,680=>909,681=>1039, -682=>790,683=>795,684=>662,685=>443,686=>613,687=>717,688=>521,689=>519,690=>313,691=>414, -692=>414,693=>480,694=>527,695=>662,696=>485,697=>302,699=>348,700=>348,701=>348,702=>366, -703=>366,704=>313,705=>313,711=>500,712=>282,713=>500,716=>282,720=>369,721=>369,722=>366, -723=>366,726=>392,728=>500,729=>500,730=>500,731=>500,733=>500,734=>417,736=>458,737=>292, -738=>395,739=>475,740=>313,741=>500,742=>500,743=>500,744=>500,745=>500,750=>553,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>779,881=>576,884=>302, -885=>302,890=>500,891=>609,892=>609,893=>609,894=>369,900=>500,901=>500,902=>776,903=>348, -904=>947,905=>1118,906=>662,908=>887,910=>953,911=>911,912=>484,913=>776,914=>845,915=>710, -916=>776,917=>762,918=>730,919=>945,920=>871,921=>468,922=>869,923=>776,924=>1107,925=>914, -926=>704,927=>871,928=>944,929=>752,931=>707,932=>744,933=>714,934=>871,935=>776,936=>913, -937=>890,938=>468,939=>714,940=>770,941=>608,942=>727,943=>484,944=>694,945=>770,946=>664, -947=>660,948=>667,949=>608,950=>592,951=>727,952=>667,953=>484,954=>750,955=>701,956=>732, -957=>694,958=>592,959=>667,960=>732,961=>665,962=>609,963=>737,964=>673,965=>694,966=>905, -967=>658,968=>941,969=>952,970=>484,971=>694,972=>667,973=>694,974=>952,976=>667,977=>849, -978=>764,979=>969,980=>764,981=>941,982=>952,983=>655,984=>871,985=>667,986=>796,987=>609, -988=>710,989=>527,990=>590,991=>660,992=>796,993=>667,1008=>655,1009=>665,1010=>609,1011=>362, -1012=>871,1013=>609,1014=>609,1015=>757,1016=>699,1017=>796,1018=>1107,1019=>860,1020=>692,1021=>796, -1022=>796,1023=>796,1024=>762,1025=>762,1026=>901,1027=>690,1028=>795,1029=>722,1030=>468,1031=>468, -1032=>473,1033=>1202,1034=>1262,1035=>963,1036=>910,1037=>945,1038=>812,1039=>945,1040=>814,1041=>854, -1042=>845,1043=>690,1044=>889,1045=>762,1046=>1312,1047=>721,1048=>945,1049=>945,1050=>910,1051=>884, -1052=>1107,1053=>945,1054=>871,1055=>944,1056=>752,1057=>796,1058=>744,1059=>812,1060=>949,1061=>776, -1062=>966,1063=>913,1064=>1268,1065=>1293,1066=>957,1067=>1202,1068=>825,1069=>795,1070=>1287,1071=>882, -1072=>648,1073=>667,1074=>695,1075=>613,1076=>667,1077=>636,1078=>1010,1079=>638,1080=>742,1081=>742, -1082=>722,1083=>705,1084=>869,1085=>732,1086=>667,1087=>732,1088=>699,1089=>609,1090=>620,1091=>640, -1092=>902,1093=>596,1094=>739,1095=>732,1096=>1075,1097=>1082,1098=>767,1099=>1002,1100=>679,1101=>609, -1102=>1025,1103=>739,1104=>636,1105=>636,1106=>719,1107=>613,1108=>609,1109=>563,1110=>380,1111=>380, -1112=>362,1113=>988,1114=>1015,1115=>727,1116=>722,1117=>742,1118=>640,1119=>732,1122=>880,1123=>703, -1124=>1195,1125=>963,1130=>1312,1131=>1010,1136=>1096,1137=>1105,1138=>871,1139=>652,1140=>916,1141=>749, -1164=>846,1165=>673,1168=>700,1169=>618,1170=>690,1171=>613,1172=>868,1173=>716,1174=>1312,1175=>1010, -1176=>721,1177=>638,1178=>947,1179=>744,1182=>910,1183=>722,1184=>1041,1185=>827,1186=>966,1187=>739, -1188=>1167,1189=>956,1190=>1345,1191=>1059,1194=>796,1195=>609,1196=>744,1197=>620,1198=>714,1199=>581, -1200=>714,1201=>581,1202=>866,1203=>649,1204=>1022,1205=>807,1206=>928,1207=>739,1210=>910,1211=>727, -1216=>468,1217=>1312,1218=>1010,1219=>869,1220=>693,1223=>945,1224=>732,1227=>913,1228=>732,1231=>380, -1232=>814,1233=>648,1234=>814,1235=>648,1236=>1034,1237=>975,1238=>762,1239=>636,1240=>871,1241=>636, -1242=>871,1243=>636,1244=>1312,1245=>1010,1246=>721,1247=>638,1248=>657,1249=>568,1250=>945,1251=>742, -1252=>945,1253=>742,1254=>871,1255=>667,1256=>871,1257=>667,1258=>871,1259=>667,1260=>795,1261=>609, -1262=>812,1263=>640,1264=>812,1265=>640,1266=>812,1267=>640,1268=>913,1269=>732,1270=>690,1271=>613, -1272=>1202,1273=>1002,1296=>721,1297=>638,1298=>884,1299=>705,1300=>1248,1301=>945,1306=>820,1307=>640, -1308=>1028,1309=>856,4256=>755,4257=>936,4258=>866,4259=>874,4260=>781,4261=>1078,4262=>1014,4263=>1213, -4264=>643,4265=>818,4266=>1051,4267=>1051,4268=>796,4269=>1135,4270=>969,4271=>902,4272=>1109,4273=>792, -4274=>756,4275=>1076,4276=>976,4277=>1066,4278=>811,4279=>833,4280=>821,4281=>833,4282=>908,4283=>1077, -4284=>769,4285=>822,4286=>813,4287=>1111,4288=>1123,4289=>802,4290=>892,4291=>802,4292=>880,4293=>1063, -4304=>594,4305=>625,4306=>643,4307=>887,4308=>615,4309=>611,4310=>667,4311=>915,4312=>613,4313=>600, -4314=>1120,4315=>640,4316=>640,4317=>879,4318=>624,4319=>634,4320=>877,4321=>666,4322=>780,4323=>751, -4324=>869,4325=>639,4326=>912,4327=>622,4328=>647,4329=>640,4330=>729,4331=>641,4332=>630,4333=>629, -4334=>670,4335=>753,4336=>625,4337=>657,4338=>625,4339=>625,4340=>624,4341=>670,4342=>940,4343=>680, -4344=>636,4345=>672,4346=>625,4347=>588,4348=>354,7426=>940,7432=>509,7433=>320,7444=>989,7446=>667, -7447=>667,7453=>737,7454=>948,7455=>948,7468=>489,7469=>651,7470=>532,7472=>546,7473=>480,7474=>480, -7475=>538,7476=>595,7477=>294,7478=>298,7479=>547,7480=>443,7481=>697,7482=>576,7483=>576,7484=>548, -7486=>474,7487=>523,7488=>455,7489=>469,7490=>549,7491=>466,7492=>466,7493=>498,7494=>657,7495=>499, -7496=>498,7497=>444,7498=>444,7499=>412,7500=>412,7501=>498,7502=>300,7503=>523,7504=>729,7505=>473, -7506=>467,7507=>427,7508=>467,7509=>467,7510=>499,7511=>371,7512=>520,7513=>434,7514=>729,7515=>491, -7522=>239,7523=>414,7524=>520,7525=>491,7543=>640,7544=>595,7547=>380,7557=>380,7579=>498,7580=>427, -7581=>427,7582=>467,7583=>412,7584=>383,7585=>373,7586=>498,7587=>522,7588=>300,7589=>307,7590=>300, -7591=>300,7592=>370,7593=>368,7594=>321,7595=>430,7596=>682,7597=>729,7598=>588,7599=>587,7600=>472, -7601=>467,7602=>522,7603=>400,7604=>387,7605=>371,7606=>520,7607=>475,7609=>489,7610=>491,7611=>412, -7612=>527,7613=>412,7614=>452,7615=>467,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, -7680=>776,7681=>648,7682=>845,7683=>699,7684=>845,7685=>699,7686=>845,7687=>699,7688=>796,7689=>609, -7690=>867,7691=>699,7692=>867,7693=>699,7694=>867,7695=>699,7696=>867,7697=>699,7698=>867,7699=>699, -7700=>762,7701=>636,7702=>762,7703=>636,7704=>762,7705=>636,7706=>762,7707=>636,7708=>762,7709=>636, -7710=>710,7711=>430,7712=>854,7713=>699,7714=>945,7715=>727,7716=>945,7717=>727,7718=>945,7719=>727, -7720=>945,7721=>727,7722=>945,7723=>727,7724=>468,7725=>380,7728=>869,7729=>693,7730=>869,7731=>693, -7732=>869,7733=>693,7734=>703,7735=>380,7736=>703,7737=>380,7738=>703,7739=>380,7740=>703,7741=>380, -7742=>1107,7743=>1058,7744=>1107,7745=>1058,7746=>1107,7747=>1058,7748=>914,7749=>727,7750=>914,7751=>727, -7752=>914,7753=>727,7754=>914,7755=>727,7756=>871,7757=>667,7760=>871,7761=>667,7762=>871,7763=>667, -7764=>752,7765=>699,7766=>752,7767=>699,7768=>831,7769=>527,7770=>831,7771=>527,7772=>831,7773=>527, -7774=>831,7775=>527,7776=>722,7777=>563,7778=>722,7779=>563,7784=>722,7785=>563,7786=>744,7787=>462, -7788=>744,7789=>462,7790=>744,7791=>462,7792=>744,7793=>462,7794=>872,7795=>727,7796=>872,7797=>727, -7798=>872,7799=>727,7800=>872,7801=>727,7802=>872,7803=>727,7804=>776,7805=>581,7806=>776,7807=>581, -7808=>1123,7809=>861,7810=>1123,7811=>861,7812=>1123,7813=>861,7814=>1123,7815=>861,7816=>1123,7817=>861, -7818=>776,7819=>596,7820=>776,7821=>596,7822=>714,7823=>581,7824=>730,7825=>568,7826=>730,7827=>568, -7828=>730,7829=>568,7830=>727,7831=>462,7832=>861,7833=>581,7834=>1014,7835=>430,7838=>947,7839=>667, -7840=>776,7841=>648,7842=>776,7843=>648,7852=>776,7853=>648,7854=>776,7855=>648,7856=>776,7857=>648, -7858=>776,7859=>648,7860=>776,7861=>648,7862=>776,7863=>648,7864=>762,7865=>636,7866=>762,7867=>636, -7868=>762,7869=>636,7878=>762,7879=>636,7880=>468,7881=>380,7882=>468,7883=>380,7884=>871,7885=>667, -7886=>871,7887=>667,7896=>871,7897=>667,7908=>872,7909=>727,7910=>872,7911=>727,7922=>714,7923=>581, -7924=>714,7925=>581,7926=>714,7927=>581,7928=>714,7929=>581,7936=>770,7937=>770,7938=>770,7939=>770, -7940=>770,7941=>770,7942=>770,7943=>770,7944=>776,7945=>776,7946=>978,7947=>978,7948=>832,7949=>849, -7950=>776,7951=>776,7952=>608,7953=>608,7954=>608,7955=>608,7956=>608,7957=>608,7960=>917,7961=>909, -7962=>1169,7963=>1169,7964=>1093,7965=>1120,7968=>727,7969=>727,7970=>727,7971=>727,7972=>727,7973=>727, -7974=>727,7975=>727,7976=>1100,7977=>1094,7978=>1358,7979=>1361,7980=>1279,7981=>1308,7982=>1197,7983=>1194, -7984=>484,7985=>484,7986=>484,7987=>484,7988=>484,7989=>484,7990=>484,7991=>484,7992=>629,7993=>617, -7994=>878,7995=>881,7996=>799,7997=>831,7998=>723,7999=>714,8000=>667,8001=>667,8002=>667,8003=>667, -8004=>667,8005=>667,8008=>900,8009=>935,8010=>1240,8011=>1237,8012=>1035,8013=>1066,8016=>694,8017=>694, -8018=>694,8019=>694,8020=>694,8021=>694,8022=>694,8023=>694,8025=>922,8027=>1186,8029=>1133,8031=>1019, -8032=>952,8033=>952,8034=>952,8035=>952,8036=>952,8037=>952,8038=>952,8039=>952,8040=>931,8041=>963, -8042=>1268,8043=>1274,8044=>1054,8045=>1088,8046=>1023,8047=>1060,8048=>770,8049=>770,8050=>608,8051=>608, -8052=>727,8053=>727,8054=>484,8055=>484,8056=>667,8057=>667,8058=>694,8059=>694,8060=>952,8061=>952, -8064=>770,8065=>770,8066=>770,8067=>770,8068=>770,8069=>770,8070=>770,8071=>770,8072=>776,8073=>776, -8074=>978,8075=>978,8076=>832,8077=>849,8078=>776,8079=>776,8080=>727,8081=>727,8082=>727,8083=>727, -8084=>727,8085=>727,8086=>727,8087=>727,8088=>1100,8089=>1094,8090=>1358,8091=>1361,8092=>1279,8093=>1308, -8094=>1197,8095=>1194,8096=>952,8097=>952,8098=>952,8099=>952,8100=>952,8101=>952,8102=>952,8103=>952, -8104=>931,8105=>963,8106=>1268,8107=>1274,8108=>1054,8109=>1088,8110=>1023,8111=>1060,8112=>770,8113=>770, -8114=>770,8115=>770,8116=>770,8118=>770,8119=>770,8120=>776,8121=>776,8122=>811,8123=>776,8124=>776, -8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>727,8131=>727,8132=>727,8134=>727,8135=>727, -8136=>1000,8137=>947,8138=>1191,8139=>1118,8140=>945,8141=>500,8142=>500,8143=>500,8144=>484,8145=>484, -8146=>484,8147=>484,8150=>484,8151=>484,8152=>468,8153=>468,8154=>714,8155=>662,8157=>500,8158=>500, -8159=>500,8160=>694,8161=>694,8162=>694,8163=>694,8164=>665,8165=>665,8166=>694,8167=>694,8168=>714, -8169=>714,8170=>1019,8171=>953,8172=>910,8173=>500,8174=>500,8175=>500,8178=>952,8179=>952,8180=>952, -8182=>952,8183=>952,8184=>1069,8185=>887,8186=>1101,8187=>911,8188=>890,8189=>500,8190=>500,8192=>500, -8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>696,8200=>348,8201=>200,8202=>100, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8213=>1000,8214=>500, -8215=>500,8219=>348,8223=>575,8227=>639,8228=>348,8229=>674,8234=>0,8235=>0,8236=>0,8237=>0, -8238=>0,8239=>200,8241=>1820,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733, -8252=>629,8253=>586,8254=>500,8258=>1023,8260=>167,8261=>473,8262=>473,8263=>1082,8264=>856,8265=>856, -8267=>636,8268=>500,8269=>500,8270=>523,8271=>369,8273=>523,8274=>556,8275=>1000,8279=>813,8287=>222, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, -8303=>0,8304=>438,8305=>239,8308=>438,8309=>438,8310=>438,8311=>438,8312=>438,8313=>438,8314=>528, -8315=>528,8316=>528,8317=>298,8318=>298,8319=>519,8320=>438,8321=>438,8322=>438,8323=>438,8324=>438, -8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528,8332=>528,8333=>298,8334=>298, -8336=>466,8337=>444,8338=>467,8339=>475,8340=>444,8358=>696,8367=>1155,8369=>790,8372=>876,8373=>696, -8451=>1198,8457=>1112,8462=>727,8463=>727,8470=>1087,8486=>890,8487=>890,8490=>869,8491=>776,8513=>775, -8514=>557,8515=>637,8516=>760,8523=>903,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035, -8537=>1035,8538=>1035,8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>468,8545=>736,8546=>1005, -8547=>1093,8548=>776,8549=>1127,8550=>1396,8551=>1664,8552=>1069,8553=>776,8554=>1078,8555=>1347,8556=>703, -8557=>796,8558=>867,8559=>1107,8560=>380,8561=>760,8562=>1140,8563=>961,8564=>581,8565=>961,8566=>1341, -8567=>1721,8568=>976,8569=>596,8570=>976,8571=>1356,8572=>380,8573=>609,8574=>699,8575=>1058,8576=>1255, -8577=>867,8578=>1268,8579=>796,8580=>609,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838, -8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838, -8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838, -8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>850,8624=>838,8625=>838,8626=>838,8627=>838, -8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838, -8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838, -8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838, -8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838, -8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838, -8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838, -8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838, -8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>641,8706=>534,8707=>620,8708=>620, -8710=>753,8711=>753,8712=>740,8713=>740,8715=>740,8716=>740,8719=>842,8720=>842,8721=>753,8722=>838, -8723=>838,8724=>838,8725=>365,8727=>691,8728=>519,8729=>519,8730=>657,8731=>657,8732=>657,8733=>672, -8734=>833,8735=>838,8736=>838,8739=>324,8740=>607,8741=>529,8742=>773,8743=>812,8744=>812,8745=>838, -8746=>838,8747=>579,8748=>1000,8749=>1391,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838, -8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1082,8789=>1082,8800=>838, -8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838, -8845=>838,8846=>838,8847=>838,8848=>838,8849=>838,8850=>838,8851=>838,8852=>838,8853=>838,8854=>838, -8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838, -8865=>838,8866=>884,8867=>884,8868=>960,8869=>960,8870=>616,8871=>616,8872=>884,8873=>884,8874=>884, -8875=>1080,8876=>884,8877=>884,8878=>884,8879=>1080,8901=>398,8962=>834,8968=>473,8969=>473,8970=>473, -8971=>473,8976=>838,8977=>539,8984=>928,8985=>838,8992=>579,8993=>579,8997=>1000,9000=>1443,9085=>1008, -9134=>579,9167=>945,9251=>834,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769, -9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769, -9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769, -9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945, -9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550, -9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502, -9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502, -9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873, -9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527, -9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873, -9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945, -9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873, -9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732, -9727=>769,9728=>896,9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731, -9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896, -9828=>896,9829=>896,9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357, -9839=>484,10145=>838,10181=>457,10182=>457,10208=>494,10216=>457,10217=>457,10224=>838,10225=>838,10226=>838, -10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434, -10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781, -10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781, -10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781, -10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781, -10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781, -10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781, -10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781, -10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781, -10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781, -10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781, -10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781, -10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781, -10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781, -10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781, -10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781, -10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781, -10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781, -10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781, -10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781, -10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781, -10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781, -10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781, -10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781, -10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781, -10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781, -10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10496=>838, -10497=>838,10498=>838,10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838, -10507=>838,10508=>838,10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838, -10517=>838,10518=>838,10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838, -10527=>838,10528=>838,10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838, -10537=>838,10538=>838,10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838, -10547=>838,10548=>838,10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838, -10557=>838,10558=>838,10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838, -10567=>838,10568=>838,10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838, -10577=>838,10578=>838,10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838, -10587=>838,10588=>838,10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838, -10597=>838,10598=>838,10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838, -10607=>838,10608=>838,10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>1032,10616=>838, -10617=>838,10618=>960,10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1782,10765=>610, -10766=>610,10799=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838, -11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838, -11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11364=>831, -11367=>945,11368=>727,11369=>869,11370=>693,11371=>730,11372=>568,11374=>1107,11375=>776,11381=>779,11382=>601, -11383=>905,11385=>571,11386=>667,11388=>313,11389=>489,11520=>773,11521=>635,11522=>804,11523=>658,11524=>788, -11525=>962,11526=>756,11527=>960,11528=>617,11529=>646,11530=>962,11531=>631,11532=>646,11533=>962,11534=>846, -11535=>866,11536=>961,11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645, -11545=>649,11546=>688,11547=>936,11548=>982,11549=>681,11550=>676,11551=>852,11552=>1113,11553=>632,11554=>645, -11555=>646,11556=>749,11557=>914,11800=>586,11810=>473,11811=>473,11812=>473,11813=>473,11822=>586,42564=>722, -42565=>563,42566=>468,42567=>380,42576=>1333,42577=>1092,42580=>1287,42581=>1025,42582=>1287,42583=>1039,42760=>500, -42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500, -42771=>500,42772=>500,42773=>500,42774=>500,42779=>384,42780=>384,42781=>276,42782=>276,42783=>276,42891=>439, -42892=>306,62464=>705,62465=>716,62466=>765,62467=>999,62468=>716,62469=>710,62470=>776,62471=>1038,62472=>716, -62473=>716,62474=>1309,62475=>734,62476=>733,62477=>1004,62478=>716,62479=>733,62480=>1050,62481=>797,62482=>850, -62483=>799,62484=>996,62485=>732,62486=>987,62487=>731,62488=>739,62489=>733,62490=>780,62491=>733,62492=>739, -62493=>717,62494=>780,62495=>936,62496=>716,62497=>826,62498=>717,62499=>716,62500=>716,62501=>773,62502=>1013, -62504=>904,63173=>667,63185=>500,63188=>500,64256=>821,64257=>727,64258=>727,64259=>1120,64260=>1117,64261=>871, -64262=>971,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, -65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0, -65532=>0,65533=>1113); -$enc=''; -$diff=''; -$file='dejavuserifb.z'; -$ctg='dejavuserifb.ctg.z'; -$originalsize=306532; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.z deleted file mode 100644 index f73e4f3e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifb.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.ctg.z deleted file mode 100644 index d237ae7e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.php deleted file mode 100644 index 89c46f4e..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.php +++ /dev/null @@ -1,299 +0,0 @@ -939,'Descent'=>-236,'CapHeight'=>-53,'Flags'=>96,'FontBBox'=>'[-906 -389 1760 1235]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>600); -$up=-63; -$ut=44; -$dw=600; -$cw=array( -0=>600,32=>348,33=>439,34=>521,35=>838,36=>696,37=>950,38=>903,39=>306,40=>473, -41=>473,42=>523,43=>838,44=>348,45=>415,46=>348,47=>365,48=>696,49=>696,50=>696, -51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>369,59=>369,60=>838, -61=>838,62=>838,63=>586,64=>1000,65=>776,66=>845,67=>796,68=>867,69=>762,70=>710, -71=>854,72=>945,73=>468,74=>473,75=>869,76=>703,77=>1107,78=>914,79=>871,80=>752, -81=>871,82=>831,83=>722,84=>744,85=>872,86=>776,87=>1123,88=>776,89=>714,90=>730, -91=>473,92=>365,93=>473,94=>838,95=>500,96=>500,97=>648,98=>699,99=>609,100=>699, -101=>636,102=>430,103=>699,104=>727,105=>380,106=>362,107=>693,108=>380,109=>1058,110=>727, -111=>667,112=>699,113=>699,114=>527,115=>563,116=>462,117=>727,118=>581,119=>861,120=>596, -121=>581,122=>568,123=>643,124=>364,125=>643,126=>838,8364=>696,8218=>348,402=>430,8222=>575, -8230=>1000,8224=>523,8225=>523,710=>500,8240=>1385,352=>722,8249=>400,338=>1180,381=>730,8216=>348, -8217=>348,8220=>575,8221=>575,8226=>639,8211=>500,8212=>1000,732=>500,8482=>1000,353=>563,8250=>400, -339=>1028,382=>568,376=>714,160=>348,161=>439,162=>696,163=>696,164=>636,165=>696,166=>364, -167=>523,168=>500,169=>1000,170=>487,171=>625,172=>838,173=>415,174=>1000,175=>500,176=>500, -177=>838,178=>438,179=>438,180=>500,181=>732,182=>636,183=>348,184=>500,185=>438,186=>500, -187=>625,188=>1043,189=>1043,190=>1043,191=>586,192=>776,193=>776,194=>776,195=>776,196=>776, -197=>776,198=>1034,199=>796,200=>762,201=>762,202=>762,203=>762,204=>468,205=>468,206=>468, -207=>468,208=>874,209=>914,210=>871,211=>871,212=>871,213=>871,214=>871,215=>838,216=>871, -217=>872,218=>872,219=>872,220=>872,221=>714,222=>757,223=>760,224=>648,225=>648,226=>648, -227=>648,228=>648,229=>648,230=>932,231=>609,232=>636,233=>636,234=>636,235=>636,236=>380, -237=>380,238=>380,239=>380,240=>667,241=>727,242=>667,243=>667,244=>667,245=>667,246=>667, -247=>838,248=>667,249=>727,250=>727,251=>727,252=>727,253=>581,254=>699,255=>581,256=>776, -257=>648,258=>776,259=>648,260=>776,261=>648,262=>796,263=>609,264=>796,265=>609,266=>796, -267=>609,268=>796,269=>609,270=>867,271=>699,272=>874,273=>699,274=>762,275=>636,276=>762, -277=>636,278=>762,279=>636,280=>762,281=>636,282=>762,283=>636,284=>854,285=>699,286=>854, -287=>699,288=>854,289=>699,290=>854,291=>699,292=>945,293=>727,294=>945,295=>727,296=>468, -297=>380,298=>468,299=>380,300=>468,301=>380,302=>468,303=>380,304=>468,305=>380,306=>942, -307=>751,308=>473,309=>362,310=>869,311=>693,312=>693,313=>703,314=>380,315=>703,316=>380, -317=>703,318=>508,319=>703,320=>557,321=>710,322=>385,323=>914,324=>727,325=>914,326=>727, -327=>914,328=>727,329=>1008,330=>872,331=>727,332=>871,333=>667,334=>871,335=>667,336=>871, -337=>667,340=>831,341=>527,342=>831,343=>527,344=>831,345=>527,346=>722,347=>563,348=>722, -349=>563,350=>722,351=>563,354=>744,355=>462,356=>744,357=>462,358=>744,359=>462,360=>872, -361=>727,362=>872,363=>727,364=>872,365=>727,366=>872,367=>727,368=>872,369=>727,370=>872, -371=>727,372=>1123,373=>861,374=>714,375=>581,377=>730,378=>568,379=>730,380=>568,383=>430, -384=>699,385=>845,386=>854,387=>699,388=>854,389=>699,390=>796,391=>796,392=>609,393=>874, -394=>867,395=>854,396=>699,397=>667,398=>762,399=>871,400=>721,401=>710,403=>854,404=>771, -405=>1043,406=>468,407=>468,408=>869,409=>693,410=>380,411=>701,412=>1058,413=>914,414=>727, -415=>871,416=>871,417=>667,418=>1200,419=>943,420=>752,421=>699,422=>831,423=>722,424=>563, -425=>707,426=>331,427=>462,428=>744,429=>462,430=>744,431=>872,432=>727,433=>890,434=>890, -435=>714,436=>699,437=>730,438=>568,439=>657,440=>657,441=>657,443=>696,444=>754,445=>568, -446=>536,448=>295,449=>492,450=>459,451=>295,452=>1597,453=>1435,454=>1267,455=>1176,456=>1065, -457=>742,458=>1387,459=>1276,460=>1089,461=>776,462=>648,463=>468,464=>380,465=>871,466=>667, -467=>872,468=>727,469=>872,470=>727,471=>872,472=>727,473=>872,474=>727,475=>872,476=>727, -477=>636,478=>776,479=>648,480=>776,481=>648,482=>1034,483=>975,484=>896,485=>699,486=>854, -487=>699,488=>869,489=>693,490=>871,491=>667,492=>871,493=>667,494=>657,495=>568,496=>362, -497=>1597,498=>1435,499=>1267,500=>854,501=>699,502=>1221,504=>914,505=>727,506=>776,507=>648, -508=>1034,509=>932,510=>871,511=>667,512=>776,513=>648,514=>776,515=>648,516=>762,517=>636, -518=>762,519=>636,520=>468,521=>380,522=>468,523=>380,524=>871,525=>667,526=>871,527=>667, -528=>831,529=>527,530=>831,531=>527,532=>872,533=>727,534=>872,535=>727,536=>722,537=>563, -538=>744,539=>462,540=>690,541=>607,542=>945,543=>727,544=>872,545=>791,548=>730,549=>568, -550=>776,551=>648,552=>762,553=>636,554=>871,555=>667,556=>871,557=>667,558=>871,559=>667, -560=>871,561=>667,562=>714,563=>581,564=>573,565=>922,566=>564,567=>362,568=>1031,569=>1031, -570=>776,571=>796,572=>609,573=>703,574=>744,575=>563,576=>568,577=>660,578=>547,581=>776, -592=>648,593=>699,594=>699,595=>699,596=>609,597=>609,598=>699,599=>730,600=>636,601=>636, -602=>907,603=>608,604=>562,605=>907,606=>720,607=>387,608=>699,609=>699,610=>626,611=>712, -612=>627,613=>727,614=>727,615=>727,616=>380,617=>380,618=>380,619=>409,620=>514,621=>380, -622=>795,623=>1058,624=>1058,625=>1058,626=>727,627=>727,628=>712,629=>667,630=>1061,631=>749, -632=>667,633=>571,634=>571,635=>571,636=>527,637=>527,638=>452,639=>487,640=>801,641=>801, -642=>563,643=>331,644=>430,645=>540,646=>331,647=>492,648=>462,649=>727,650=>679,651=>694, -652=>581,653=>861,654=>635,655=>727,656=>568,657=>568,658=>568,659=>568,660=>536,661=>536, -662=>536,663=>545,664=>871,665=>695,666=>720,667=>626,668=>732,669=>384,670=>740,671=>646, -672=>699,673=>536,674=>536,675=>1117,676=>1179,677=>1117,678=>911,679=>715,680=>909,681=>1039, -682=>790,683=>795,684=>662,685=>443,686=>613,687=>717,688=>521,689=>519,690=>313,691=>414, -692=>414,693=>480,694=>527,695=>542,696=>366,697=>302,699=>348,700=>348,701=>348,702=>366, -703=>366,704=>313,705=>313,711=>500,712=>282,713=>500,716=>282,720=>369,721=>369,722=>366, -723=>366,726=>392,728=>500,729=>500,730=>500,731=>500,733=>500,734=>417,736=>448,737=>292, -738=>395,739=>375,740=>313,741=>500,742=>500,743=>500,744=>500,745=>500,750=>553,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>779,881=>576,884=>302, -885=>302,890=>500,891=>609,892=>609,893=>609,894=>369,900=>500,901=>500,902=>776,903=>348, -904=>947,905=>1136,906=>662,908=>887,910=>953,911=>911,912=>484,913=>776,914=>845,915=>710, -916=>776,917=>762,918=>730,919=>945,920=>871,921=>468,922=>869,923=>776,924=>1107,925=>914, -926=>704,927=>871,928=>945,929=>752,931=>707,932=>744,933=>714,934=>871,935=>776,936=>913, -937=>890,938=>468,939=>714,940=>770,941=>608,942=>727,943=>484,944=>694,945=>770,946=>664, -947=>660,948=>667,949=>608,950=>592,951=>727,952=>667,953=>484,954=>750,955=>701,956=>732, -957=>694,958=>592,959=>667,960=>732,961=>665,962=>609,963=>737,964=>673,965=>694,966=>905, -967=>658,968=>941,969=>952,970=>484,971=>694,972=>667,973=>694,974=>952,976=>667,977=>849, -978=>764,979=>969,980=>764,981=>941,982=>952,983=>655,984=>871,985=>667,986=>796,987=>609, -988=>710,989=>527,990=>590,991=>660,992=>796,993=>667,1008=>655,1009=>665,1010=>609,1011=>362, -1012=>871,1013=>609,1014=>609,1015=>757,1016=>699,1017=>796,1018=>1107,1019=>860,1020=>692,1021=>796, -1022=>796,1023=>796,1024=>762,1025=>762,1026=>901,1027=>690,1028=>795,1029=>722,1030=>468,1031=>468, -1032=>473,1033=>1202,1034=>1262,1035=>963,1036=>910,1037=>945,1038=>812,1039=>945,1040=>814,1041=>854, -1042=>845,1043=>690,1044=>889,1045=>762,1046=>1312,1047=>721,1048=>945,1049=>945,1050=>910,1051=>884, -1052=>1107,1053=>945,1054=>871,1055=>945,1056=>752,1057=>796,1058=>744,1059=>812,1060=>949,1061=>776, -1062=>966,1063=>913,1064=>1268,1065=>1293,1066=>957,1067=>1202,1068=>825,1069=>795,1070=>1287,1071=>882, -1072=>648,1073=>722,1074=>657,1075=>563,1076=>695,1077=>636,1078=>1306,1079=>638,1080=>727,1081=>727, -1082=>677,1083=>732,1084=>951,1085=>729,1086=>667,1087=>727,1088=>699,1089=>609,1090=>1058,1091=>598, -1092=>902,1093=>596,1094=>803,1095=>715,1096=>1058,1097=>1134,1098=>727,1099=>1018,1100=>660,1101=>645, -1102=>1001,1103=>796,1104=>636,1105=>636,1106=>719,1107=>563,1108=>609,1109=>563,1110=>380,1111=>380, -1112=>362,1113=>1014,1114=>1011,1115=>727,1116=>677,1117=>727,1118=>598,1119=>727,1122=>880,1123=>1050, -1124=>1195,1125=>963,1130=>1312,1131=>1010,1136=>1096,1137=>1105,1138=>871,1139=>652,1140=>916,1141=>749, -1164=>846,1165=>673,1168=>700,1169=>618,1170=>690,1171=>563,1172=>854,1173=>705,1174=>1312,1175=>1306, -1176=>721,1177=>638,1178=>902,1179=>703,1182=>910,1183=>677,1184=>1041,1185=>760,1186=>952,1187=>805, -1188=>1167,1189=>955,1190=>1324,1191=>1013,1194=>796,1195=>609,1196=>744,1197=>1142,1198=>714,1199=>572, -1200=>713,1201=>572,1202=>789,1203=>596,1204=>1010,1205=>833,1206=>913,1207=>792,1210=>910,1211=>727, -1216=>468,1217=>1312,1218=>1306,1219=>869,1220=>693,1223=>945,1224=>732,1227=>984,1228=>732,1231=>380, -1232=>814,1233=>648,1234=>814,1235=>648,1236=>1034,1237=>975,1238=>762,1239=>636,1240=>871,1241=>636, -1242=>871,1243=>636,1244=>1312,1245=>1306,1246=>721,1247=>638,1248=>657,1249=>568,1250=>945,1251=>727, -1252=>945,1253=>727,1254=>871,1255=>667,1256=>871,1257=>667,1258=>871,1259=>667,1260=>795,1261=>645, -1262=>812,1263=>598,1264=>812,1265=>598,1266=>812,1267=>598,1268=>913,1269=>715,1270=>690,1271=>563, -1272=>1202,1273=>1018,1296=>721,1297=>638,1298=>884,1299=>732,1300=>1248,1301=>1005,1306=>820,1307=>640, -1308=>1028,1309=>856,4256=>765,4257=>945,4258=>876,4259=>884,4260=>791,4261=>1087,4262=>1024,4263=>1223, -4264=>653,4265=>828,4266=>1061,4267=>1061,4268=>806,4269=>1145,4270=>979,4271=>912,4272=>1119,4273=>802, -4274=>766,4275=>1085,4276=>986,4277=>1076,4278=>820,4279=>843,4280=>831,4281=>843,4282=>918,4283=>1086, -4284=>779,4285=>832,4286=>822,4287=>1121,4288=>1132,4289=>812,4290=>902,4291=>812,4292=>890,4293=>1073, -4304=>594,4305=>625,4306=>643,4307=>887,4308=>615,4309=>611,4310=>666,4311=>915,4312=>613,4313=>600, -4314=>1120,4315=>654,4316=>640,4317=>879,4318=>624,4319=>634,4320=>877,4321=>657,4322=>802,4323=>751, -4324=>869,4325=>639,4326=>912,4327=>622,4328=>647,4329=>640,4330=>729,4331=>641,4332=>639,4333=>629, -4334=>674,4335=>737,4336=>625,4337=>657,4338=>625,4339=>625,4340=>624,4341=>670,4342=>940,4343=>680, -4344=>636,4345=>672,4346=>625,4347=>446,4348=>363,7426=>940,7432=>509,7433=>320,7444=>989,7446=>667, -7447=>667,7453=>737,7454=>948,7455=>948,7468=>489,7469=>651,7470=>532,7472=>546,7473=>480,7474=>480, -7475=>538,7476=>595,7477=>294,7478=>298,7479=>547,7480=>443,7481=>697,7482=>576,7483=>576,7484=>548, -7486=>474,7487=>523,7488=>469,7489=>549,7490=>708,7491=>466,7492=>466,7493=>498,7494=>657,7495=>499, -7496=>498,7497=>444,7498=>444,7499=>412,7500=>412,7501=>498,7502=>300,7503=>523,7504=>729,7505=>473, -7506=>467,7507=>427,7508=>467,7509=>467,7510=>499,7511=>371,7512=>520,7513=>434,7514=>729,7515=>491, -7522=>239,7523=>414,7524=>520,7525=>491,7543=>640,7544=>595,7547=>380,7557=>380,7579=>498,7580=>427, -7581=>427,7582=>467,7583=>412,7584=>271,7585=>373,7586=>498,7587=>522,7588=>300,7589=>307,7590=>300, -7591=>300,7592=>370,7593=>368,7594=>321,7595=>430,7596=>682,7597=>729,7598=>588,7599=>587,7600=>472, -7601=>467,7602=>522,7603=>400,7604=>387,7605=>371,7606=>520,7607=>475,7609=>489,7610=>366,7611=>357, -7612=>527,7613=>412,7614=>452,7615=>467,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, -7680=>776,7681=>648,7682=>845,7683=>699,7684=>845,7685=>699,7686=>845,7687=>699,7688=>796,7689=>609, -7690=>867,7691=>699,7692=>867,7693=>699,7694=>867,7695=>699,7696=>867,7697=>699,7698=>867,7699=>699, -7700=>762,7701=>636,7702=>762,7703=>636,7704=>762,7705=>636,7706=>762,7707=>636,7708=>762,7709=>636, -7710=>710,7711=>430,7712=>854,7713=>699,7714=>945,7715=>727,7716=>945,7717=>727,7718=>945,7719=>727, -7720=>945,7721=>727,7722=>945,7723=>727,7724=>468,7725=>380,7728=>869,7729=>693,7730=>869,7731=>693, -7732=>869,7733=>693,7734=>703,7735=>380,7736=>703,7737=>380,7738=>703,7739=>380,7740=>703,7741=>380, -7742=>1107,7743=>1058,7744=>1107,7745=>1058,7746=>1107,7747=>1058,7748=>914,7749=>727,7750=>914,7751=>727, -7752=>914,7753=>727,7754=>914,7755=>727,7756=>871,7757=>667,7760=>871,7761=>667,7762=>871,7763=>667, -7764=>752,7765=>699,7766=>752,7767=>699,7768=>831,7769=>527,7770=>831,7771=>527,7772=>831,7773=>527, -7774=>831,7775=>527,7776=>722,7777=>563,7778=>722,7779=>563,7784=>722,7785=>563,7786=>744,7787=>462, -7788=>744,7789=>462,7790=>744,7791=>462,7792=>744,7793=>462,7794=>872,7795=>727,7796=>872,7797=>727, -7798=>872,7799=>727,7800=>872,7801=>727,7802=>872,7803=>727,7804=>776,7805=>581,7806=>776,7807=>581, -7808=>1123,7809=>861,7810=>1123,7811=>861,7812=>1123,7813=>861,7814=>1123,7815=>861,7816=>1123,7817=>861, -7818=>776,7819=>596,7820=>776,7821=>596,7822=>714,7823=>581,7824=>730,7825=>568,7826=>730,7827=>568, -7828=>730,7829=>568,7830=>727,7831=>462,7832=>861,7833=>581,7834=>1014,7835=>430,7838=>947,7839=>667, -7840=>776,7841=>648,7842=>776,7843=>648,7852=>776,7853=>648,7854=>776,7855=>648,7856=>776,7857=>648, -7858=>776,7859=>648,7860=>776,7861=>648,7862=>776,7863=>648,7864=>762,7865=>636,7866=>762,7867=>636, -7868=>762,7869=>636,7878=>762,7879=>636,7880=>468,7881=>380,7882=>468,7883=>380,7884=>871,7885=>667, -7886=>871,7887=>667,7896=>871,7897=>667,7908=>872,7909=>727,7910=>872,7911=>727,7922=>714,7923=>581, -7924=>714,7925=>581,7926=>714,7927=>581,7928=>714,7929=>581,7936=>770,7937=>770,7938=>770,7939=>770, -7940=>770,7941=>770,7942=>770,7943=>770,7944=>776,7945=>776,7946=>978,7947=>978,7948=>832,7949=>849, -7950=>776,7951=>776,7952=>608,7953=>608,7954=>608,7955=>608,7956=>608,7957=>608,7960=>917,7961=>909, -7962=>1169,7963=>1169,7964=>1093,7965=>1120,7968=>727,7969=>727,7970=>727,7971=>727,7972=>727,7973=>727, -7974=>727,7975=>727,7976=>1100,7977=>1094,7978=>1358,7979=>1361,7980=>1279,7981=>1308,7982=>1197,7983=>1194, -7984=>484,7985=>484,7986=>484,7987=>484,7988=>484,7989=>484,7990=>484,7991=>484,7992=>629,7993=>617, -7994=>878,7995=>881,7996=>799,7997=>831,7998=>723,7999=>714,8000=>667,8001=>667,8002=>667,8003=>667, -8004=>667,8005=>667,8008=>900,8009=>935,8010=>1240,8011=>1237,8012=>1035,8013=>1066,8016=>694,8017=>694, -8018=>694,8019=>694,8020=>694,8021=>694,8022=>694,8023=>694,8025=>922,8027=>1186,8029=>1133,8031=>1019, -8032=>952,8033=>952,8034=>952,8035=>952,8036=>952,8037=>952,8038=>952,8039=>952,8040=>931,8041=>963, -8042=>1268,8043=>1274,8044=>1054,8045=>1088,8046=>1023,8047=>1060,8048=>770,8049=>770,8050=>608,8051=>608, -8052=>727,8053=>727,8054=>484,8055=>484,8056=>667,8057=>667,8058=>694,8059=>694,8060=>952,8061=>952, -8064=>770,8065=>770,8066=>770,8067=>770,8068=>770,8069=>770,8070=>770,8071=>770,8072=>776,8073=>776, -8074=>978,8075=>978,8076=>832,8077=>849,8078=>776,8079=>776,8080=>727,8081=>727,8082=>727,8083=>727, -8084=>727,8085=>727,8086=>727,8087=>727,8088=>1100,8089=>1094,8090=>1358,8091=>1361,8092=>1279,8093=>1308, -8094=>1197,8095=>1194,8096=>952,8097=>952,8098=>952,8099=>952,8100=>952,8101=>952,8102=>952,8103=>952, -8104=>931,8105=>963,8106=>1268,8107=>1274,8108=>1054,8109=>1088,8110=>1023,8111=>1060,8112=>770,8113=>770, -8114=>770,8115=>770,8116=>770,8118=>770,8119=>770,8120=>776,8121=>776,8122=>811,8123=>776,8124=>776, -8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>727,8131=>727,8132=>727,8134=>727,8135=>727, -8136=>1000,8137=>947,8138=>1191,8139=>1118,8140=>945,8141=>500,8142=>500,8143=>500,8144=>484,8145=>484, -8146=>484,8147=>484,8150=>484,8151=>484,8152=>468,8153=>468,8154=>714,8155=>662,8157=>500,8158=>500, -8159=>500,8160=>694,8161=>694,8162=>694,8163=>694,8164=>665,8165=>665,8166=>694,8167=>694,8168=>714, -8169=>714,8170=>1019,8171=>953,8172=>910,8173=>500,8174=>500,8175=>500,8178=>952,8179=>952,8180=>952, -8182=>952,8183=>952,8184=>1069,8185=>887,8186=>1101,8187=>911,8188=>890,8189=>500,8190=>500,8192=>500, -8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>696,8200=>348,8201=>200,8202=>100, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8213=>1000,8214=>500, -8215=>500,8219=>348,8223=>575,8227=>639,8228=>348,8229=>674,8234=>0,8235=>0,8236=>0,8237=>0, -8238=>0,8239=>200,8241=>1813,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733, -8252=>629,8253=>586,8254=>500,8258=>1023,8260=>167,8261=>473,8262=>473,8263=>1082,8264=>856,8265=>856, -8267=>636,8268=>500,8269=>500,8270=>523,8271=>369,8273=>523,8274=>556,8275=>1000,8279=>813,8287=>222, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, -8303=>0,8304=>438,8305=>239,8308=>438,8309=>438,8310=>438,8311=>438,8312=>438,8313=>438,8314=>528, -8315=>528,8316=>528,8317=>298,8318=>298,8319=>458,8320=>438,8321=>438,8322=>438,8323=>438,8324=>438, -8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528,8332=>528,8333=>298,8334=>298, -8336=>466,8337=>444,8338=>467,8339=>375,8340=>444,8358=>696,8367=>1155,8369=>790,8372=>876,8373=>696, -8451=>1198,8457=>1112,8462=>727,8463=>727,8470=>1087,8486=>890,8487=>890,8490=>869,8491=>776,8513=>786, -8514=>576,8515=>637,8516=>760,8523=>903,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035, -8537=>1035,8538=>1035,8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>468,8545=>736,8546=>1005, -8547=>1093,8548=>776,8549=>1127,8550=>1396,8551=>1664,8552=>1069,8553=>776,8554=>1078,8555=>1347,8556=>703, -8557=>796,8558=>867,8559=>1107,8560=>380,8561=>760,8562=>1140,8563=>961,8564=>581,8565=>961,8566=>1341, -8567=>1721,8568=>976,8569=>596,8570=>976,8571=>1356,8572=>380,8573=>609,8574=>699,8575=>1058,8576=>1255, -8577=>867,8578=>1268,8579=>796,8580=>609,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838, -8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838, -8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838, -8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>850,8624=>838,8625=>838,8626=>838,8627=>838, -8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838, -8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838, -8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838, -8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838, -8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838, -8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838, -8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838, -8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>641,8706=>534,8707=>620,8708=>620, -8710=>753,8711=>753,8712=>740,8713=>740,8715=>740,8716=>740,8719=>842,8720=>842,8721=>753,8722=>838, -8723=>838,8724=>838,8725=>365,8727=>691,8728=>519,8729=>519,8730=>657,8731=>657,8732=>657,8733=>672, -8734=>833,8735=>838,8736=>838,8739=>324,8740=>607,8741=>529,8742=>773,8743=>812,8744=>812,8745=>838, -8746=>838,8747=>579,8748=>1000,8749=>1391,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838, -8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1082,8789=>1082,8800=>838, -8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838, -8845=>838,8846=>838,8847=>838,8848=>838,8849=>838,8850=>838,8851=>838,8852=>838,8853=>838,8854=>838, -8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838, -8865=>838,8866=>884,8867=>884,8868=>960,8869=>960,8870=>616,8871=>616,8872=>884,8873=>884,8874=>884, -8875=>1080,8876=>884,8877=>884,8878=>884,8879=>1080,8901=>398,8962=>834,8968=>473,8969=>473,8970=>473, -8971=>473,8976=>838,8977=>539,8984=>928,8985=>838,8992=>579,8993=>579,8997=>1000,9000=>1443,9085=>1008, -9134=>579,9167=>945,9251=>834,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769, -9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769, -9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769, -9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945, -9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550, -9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502, -9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502, -9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873, -9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527, -9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873, -9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945, -9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873, -9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732, -9727=>769,9728=>896,9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731, -9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896, -9828=>896,9829=>896,9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357, -9839=>484,10145=>838,10181=>457,10182=>457,10208=>494,10216=>457,10217=>457,10224=>838,10225=>838,10226=>838, -10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434, -10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781, -10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781, -10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781, -10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781, -10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781, -10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781, -10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781, -10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781, -10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781, -10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781, -10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781, -10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781, -10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781, -10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781, -10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781, -10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781, -10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781, -10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781, -10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781, -10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781, -10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781, -10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781, -10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781, -10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781, -10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781, -10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10496=>838, -10497=>838,10498=>838,10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838, -10507=>838,10508=>838,10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838, -10517=>838,10518=>838,10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838, -10527=>838,10528=>838,10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838, -10537=>838,10538=>838,10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838, -10547=>838,10548=>838,10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838, -10557=>838,10558=>838,10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838, -10567=>838,10568=>838,10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838, -10577=>838,10578=>838,10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838, -10587=>838,10588=>838,10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838, -10597=>838,10598=>838,10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838, -10607=>838,10608=>838,10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>1032,10616=>838, -10617=>838,10618=>960,10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1782,10765=>610, -10766=>610,10799=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838, -11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838, -11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11364=>831, -11367=>945,11368=>727,11369=>869,11370=>693,11371=>730,11372=>568,11374=>1107,11375=>776,11381=>779,11382=>576, -11383=>905,11385=>571,11386=>667,11388=>313,11389=>489,11520=>773,11521=>635,11522=>804,11523=>658,11524=>788, -11525=>962,11526=>756,11527=>960,11528=>617,11529=>646,11530=>962,11531=>631,11532=>646,11533=>962,11534=>846, -11535=>866,11536=>961,11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645, -11545=>649,11546=>688,11547=>936,11548=>982,11549=>681,11550=>676,11551=>852,11552=>1113,11553=>632,11554=>645, -11555=>646,11556=>749,11557=>914,11800=>586,11810=>473,11811=>473,11812=>473,11813=>473,11822=>586,42564=>722, -42565=>563,42566=>468,42567=>380,42576=>1333,42577=>1085,42580=>1287,42581=>1025,42582=>1287,42583=>1029,42760=>500, -42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500, -42771=>500,42772=>500,42773=>500,42774=>500,42779=>384,42780=>384,42781=>276,42782=>276,42783=>276,42891=>439, -42892=>306,62464=>726,62465=>737,62466=>786,62467=>1019,62468=>737,62469=>731,62470=>796,62471=>1058,62472=>737, -62473=>737,62474=>1329,62475=>754,62476=>753,62477=>1024,62478=>737,62479=>753,62480=>1070,62481=>818,62482=>870, -62483=>819,62484=>1016,62485=>753,62486=>1008,62487=>752,62488=>760,62489=>753,62490=>800,62491=>753,62492=>760, -62493=>738,62494=>801,62495=>956,62496=>736,62497=>847,62498=>737,62499=>737,62500=>737,62501=>793,62502=>1033, -62504=>904,63172=>563,63173=>667,63174=>699,63175=>727,63176=>1058,63185=>500,63188=>500,64256=>827,64257=>727, -64258=>727,64259=>1108,64260=>1146,64261=>879,64262=>971,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0, -65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0, -65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1113); -$enc=''; -$diff=''; -$file='dejavuserifbi.z'; -$ctg='dejavuserifbi.ctg.z'; -$originalsize=294244; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.z deleted file mode 100644 index ab7e8b2f..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifbi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.ctg.z deleted file mode 100644 index 6e01b837..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.php deleted file mode 100644 index 669b0bd3..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.php +++ /dev/null @@ -1,313 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>5,'Flags'=>32,'FontBBox'=>'[-692 -347 1511 1242]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>540); -$up=-63; -$ut=44; -$dw=540; -$cw=array( -0=>540,32=>286,33=>361,34=>414,35=>754,36=>572,37=>855,38=>801,39=>247,40=>351, -41=>351,42=>450,43=>754,44=>286,45=>304,46=>286,47=>303,48=>572,49=>572,50=>572, -51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754, -61=>754,62=>754,63=>482,64=>900,65=>650,66=>661,67=>688,68=>721,69=>657,70=>624, -71=>719,72=>785,73=>355,74=>360,75=>672,76=>598,77=>921,78=>787,79=>738,80=>605, -81=>738,82=>677,83=>616,84=>600,85=>758,86=>650,87=>925,88=>641,89=>594,90=>625, -91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>536,98=>576,99=>504,100=>576, -101=>532,102=>333,103=>576,104=>580,105=>288,106=>279,107=>545,108=>288,109=>853,110=>580, -111=>542,112=>576,113=>576,114=>430,115=>461,116=>361,117=>580,118=>508,119=>770,120=>507, -121=>508,122=>474,123=>572,124=>303,125=>572,126=>754,8364=>572,8218=>286,402=>333,8222=>466, -8230=>900,8224=>450,8225=>450,710=>450,8240=>1208,352=>616,8249=>360,338=>1023,381=>625,8216=>286, -8217=>286,8220=>460,8221=>460,8226=>531,8211=>450,8212=>900,732=>450,8482=>900,353=>461,8250=>360, -339=>890,382=>474,376=>594,160=>286,161=>361,162=>572,163=>572,164=>572,165=>572,166=>303, -167=>450,168=>450,169=>900,170=>427,171=>550,172=>754,173=>304,174=>900,175=>450,176=>450, -177=>754,178=>360,179=>360,180=>450,181=>584,182=>572,183=>286,184=>450,185=>360,186=>423, -187=>550,188=>872,189=>872,190=>872,191=>482,192=>650,193=>650,194=>650,195=>650,196=>650, -197=>650,198=>901,199=>688,200=>657,201=>657,202=>657,203=>657,204=>355,205=>355,206=>355, -207=>355,208=>726,209=>787,210=>738,211=>738,212=>738,213=>738,214=>738,215=>754,216=>738, -217=>758,218=>758,219=>758,220=>758,221=>594,222=>608,223=>601,224=>536,225=>536,226=>536, -227=>536,228=>536,229=>536,230=>846,231=>504,232=>532,233=>532,234=>532,235=>532,236=>288, -237=>288,238=>288,239=>288,240=>542,241=>580,242=>542,243=>542,244=>542,245=>542,246=>542, -247=>754,248=>542,249=>580,250=>580,251=>580,252=>580,253=>508,254=>576,255=>508,256=>650, -257=>536,258=>650,259=>536,260=>650,261=>536,262=>688,263=>504,264=>688,265=>504,266=>688, -267=>504,268=>688,269=>504,270=>721,271=>576,272=>726,273=>576,274=>657,275=>532,276=>657, -277=>532,278=>657,279=>532,280=>657,281=>532,282=>657,283=>532,284=>719,285=>576,286=>719, -287=>576,288=>719,289=>576,290=>719,291=>576,292=>785,293=>580,294=>785,295=>580,296=>355, -297=>288,298=>355,299=>288,300=>355,301=>288,302=>355,303=>288,304=>355,305=>288,306=>721, -307=>479,308=>360,309=>279,310=>672,311=>545,312=>545,313=>598,314=>288,315=>598,316=>288, -317=>598,318=>288,319=>598,320=>288,321=>602,322=>292,323=>787,324=>580,325=>787,326=>580, -327=>787,328=>580,329=>779,330=>758,331=>580,332=>738,333=>542,334=>738,335=>542,336=>738, -337=>542,340=>677,341=>430,342=>677,343=>430,344=>677,345=>430,346=>616,347=>461,348=>616, -349=>461,350=>616,351=>461,354=>600,355=>361,356=>600,357=>361,358=>600,359=>361,360=>758, -361=>580,362=>758,363=>580,364=>758,365=>580,366=>758,367=>580,368=>758,369=>580,370=>758, -371=>580,372=>925,373=>770,374=>594,375=>508,377=>625,378=>474,379=>625,380=>474,383=>333, -384=>576,385=>661,386=>661,387=>576,388=>661,389=>576,390=>688,391=>688,392=>504,393=>726, -394=>721,395=>661,396=>576,397=>542,398=>657,399=>738,400=>561,401=>624,403=>719,404=>641, -405=>839,406=>355,407=>355,408=>672,409=>545,410=>288,411=>570,412=>853,413=>787,414=>580, -415=>738,416=>738,417=>542,418=>936,419=>726,420=>605,421=>576,422=>677,423=>616,424=>461, -425=>636,426=>292,427=>361,428=>600,429=>361,430=>600,431=>758,432=>580,433=>746,434=>684, -435=>664,436=>596,437=>625,438=>474,439=>508,440=>508,441=>508,443=>572,444=>618,445=>508, -446=>482,448=>265,449=>443,450=>413,451=>265,452=>1347,453=>1195,454=>1050,455=>958,456=>876, -457=>567,458=>1148,459=>1066,460=>858,461=>650,462=>536,463=>355,464=>288,465=>738,466=>542, -467=>758,468=>580,469=>758,470=>580,471=>758,472=>580,473=>758,474=>580,475=>758,476=>580, -477=>532,478=>650,479=>536,480=>650,481=>536,482=>901,483=>846,484=>763,485=>576,486=>719, -487=>576,488=>672,489=>545,490=>738,491=>542,492=>738,493=>542,494=>508,495=>508,496=>288, -497=>1347,498=>1195,499=>1050,500=>719,501=>576,502=>1038,504=>787,505=>580,506=>650,507=>536, -508=>901,509=>846,510=>738,511=>542,512=>650,513=>536,514=>650,515=>536,516=>657,517=>532, -518=>657,519=>532,520=>355,521=>288,522=>355,523=>288,524=>738,525=>542,526=>738,527=>542, -528=>677,529=>430,530=>677,531=>430,532=>758,533=>580,534=>758,535=>580,536=>616,537=>461, -538=>600,539=>361,540=>564,541=>469,542=>785,543=>580,544=>758,545=>732,548=>625,549=>474, -550=>650,551=>536,552=>657,553=>532,554=>738,555=>542,556=>738,557=>542,558=>738,559=>542, -560=>738,561=>542,562=>594,563=>508,564=>450,565=>748,566=>444,567=>279,568=>864,569=>864, -570=>650,571=>688,572=>504,573=>598,574=>600,575=>461,576=>474,577=>525,578=>417,581=>650, -592=>536,593=>576,594=>576,595=>576,596=>504,597=>504,598=>582,599=>614,600=>532,601=>532, -602=>759,603=>466,604=>458,605=>695,606=>552,607=>283,608=>615,609=>576,610=>489,611=>641, -612=>507,613=>580,614=>580,615=>580,616=>288,617=>353,618=>288,619=>342,620=>409,621=>326, -622=>633,623=>853,624=>853,625=>853,626=>579,627=>624,628=>581,629=>542,630=>711,631=>583, -632=>542,633=>451,634=>451,635=>496,636=>430,637=>430,638=>407,639=>407,640=>534,641=>534, -642=>461,643=>244,644=>333,645=>438,646=>292,647=>361,648=>361,649=>580,650=>558,651=>547, -652=>508,653=>770,654=>508,655=>589,656=>537,657=>504,658=>508,659=>504,660=>482,661=>482, -662=>482,663=>461,664=>738,665=>506,666=>552,667=>588,668=>600,669=>329,670=>545,671=>581, -672=>615,673=>482,674=>482,675=>896,676=>930,677=>898,678=>728,679=>538,680=>704,681=>804, -682=>582,683=>608,684=>538,685=>398,686=>703,687=>690,688=>389,689=>387,690=>237,691=>312, -692=>312,693=>387,694=>352,695=>527,696=>381,697=>250,699=>286,700=>286,701=>286,702=>276, -703=>276,704=>252,705=>252,711=>450,712=>247,713=>450,716=>247,720=>303,721=>303,722=>276, -723=>276,726=>295,728=>450,729=>450,730=>450,731=>450,733=>450,734=>375,736=>402,737=>218, -738=>303,739=>381,740=>252,741=>444,742=>444,743=>444,744=>444,745=>444,750=>435,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>666,881=>478,884=>250, -885=>250,890=>450,891=>504,892=>504,893=>504,894=>303,900=>450,901=>450,902=>650,903=>286, -904=>810,905=>935,906=>505,908=>751,910=>808,911=>767,912=>353,913=>650,914=>661,915=>624, -916=>650,917=>657,918=>625,919=>785,920=>738,921=>355,922=>672,923=>650,924=>921,925=>787, -926=>633,927=>738,928=>785,929=>605,931=>636,932=>600,933=>594,934=>738,935=>641,936=>789, -937=>746,938=>355,939=>594,940=>607,941=>466,942=>539,943=>353,944=>547,945=>607,946=>520, -947=>538,948=>542,949=>466,950=>488,951=>539,952=>542,953=>353,954=>563,955=>570,956=>584, -957=>547,958=>496,959=>542,960=>591,961=>529,962=>504,963=>614,964=>498,965=>547,966=>630, -967=>545,968=>706,969=>734,970=>353,971=>547,972=>542,973=>547,974=>734,976=>524,977=>643, -978=>618,979=>787,980=>618,981=>613,982=>734,983=>561,984=>738,985=>542,986=>688,987=>504, -988=>624,989=>417,990=>531,991=>593,992=>704,993=>519,1008=>561,1009=>529,1010=>504,1011=>279, -1012=>738,1013=>504,1014=>504,1015=>608,1016=>576,1017=>688,1018=>921,1019=>637,1020=>529,1021=>688, -1022=>688,1023=>688,1024=>657,1025=>657,1026=>719,1027=>596,1028=>688,1029=>616,1030=>355,1031=>355, -1032=>360,1033=>976,1034=>1006,1035=>785,1036=>696,1037=>785,1038=>650,1039=>785,1040=>681,1041=>661, -1042=>661,1043=>596,1044=>731,1045=>657,1046=>1011,1047=>561,1048=>785,1049=>785,1050=>696,1051=>751, -1052=>921,1053=>785,1054=>738,1055=>785,1056=>605,1057=>688,1058=>600,1059=>650,1060=>747,1061=>641, -1062=>785,1063=>695,1064=>1027,1065=>1027,1066=>715,1067=>885,1068=>606,1069=>688,1070=>1074,1071=>727, -1072=>536,1073=>542,1074=>506,1075=>471,1076=>554,1077=>532,1078=>828,1079=>491,1080=>600,1081=>600, -1082=>563,1083=>571,1084=>700,1085=>600,1086=>542,1087=>600,1088=>576,1089=>504,1090=>498,1091=>529, -1092=>704,1093=>507,1094=>579,1095=>595,1096=>836,1097=>836,1098=>572,1099=>716,1100=>490,1101=>504, -1102=>783,1103=>567,1104=>532,1105=>532,1106=>561,1107=>471,1108=>504,1109=>461,1110=>288,1111=>288, -1112=>279,1113=>759,1114=>774,1115=>580,1116=>563,1117=>600,1118=>529,1119=>590,1122=>686,1123=>542, -1124=>1016,1125=>750,1130=>1011,1131=>828,1136=>849,1137=>812,1138=>738,1139=>497,1140=>773,1141=>610, -1164=>636,1165=>490,1168=>604,1169=>476,1170=>596,1171=>471,1172=>655,1173=>552,1174=>1011,1175=>828, -1176=>572,1177=>483,1178=>696,1179=>545,1182=>696,1183=>563,1184=>801,1185=>645,1186=>785,1187=>577, -1188=>1025,1189=>767,1190=>1084,1191=>847,1194=>688,1195=>504,1196=>600,1197=>498,1198=>594,1199=>508, -1200=>594,1201=>508,1202=>641,1203=>507,1204=>856,1205=>659,1206=>674,1207=>621,1210=>674,1211=>580, -1216=>355,1217=>1011,1218=>828,1219=>672,1220=>545,1223=>785,1224=>600,1227=>674,1228=>600,1231=>288, -1232=>681,1233=>536,1234=>681,1235=>536,1236=>901,1237=>846,1238=>657,1239=>532,1240=>738,1241=>532, -1242=>738,1243=>532,1244=>1011,1245=>828,1246=>561,1247=>491,1248=>508,1249=>508,1250=>785,1251=>600, -1252=>785,1253=>600,1254=>738,1255=>542,1256=>738,1257=>542,1258=>738,1259=>542,1260=>688,1261=>504, -1262=>650,1263=>529,1264=>650,1265=>529,1266=>650,1267=>529,1268=>695,1269=>595,1270=>596,1271=>471, -1272=>885,1273=>716,1296=>561,1297=>491,1298=>751,1299=>571,1300=>1078,1301=>827,1306=>738,1307=>576, -1308=>925,1309=>770,4256=>650,4257=>765,4258=>745,4259=>773,4260=>659,4261=>883,4262=>824,4263=>991, -4264=>510,4265=>675,4266=>866,4267=>847,4268=>668,4269=>967,4270=>807,4271=>746,4272=>936,4273=>660, -4274=>602,4275=>914,4276=>843,4277=>917,4278=>658,4279=>659,4280=>659,4281=>660,4282=>791,4283=>843, -4284=>642,4285=>679,4286=>660,4287=>862,4288=>900,4289=>632,4290=>777,4291=>660,4292=>753,4293=>855, -4304=>486,4305=>514,4306=>530,4307=>750,4308=>505,4309=>501,4310=>556,4311=>774,4312=>503,4313=>491, -4314=>959,4315=>527,4316=>527,4317=>743,4318=>513,4319=>522,4320=>741,4321=>546,4322=>673,4323=>628, -4324=>733,4325=>526,4326=>772,4327=>511,4328=>534,4329=>527,4330=>607,4331=>528,4332=>523,4333=>518, -4334=>550,4335=>615,4336=>514,4337=>542,4338=>514,4339=>514,4340=>513,4341=>584,4342=>797,4343=>563, -4344=>523,4345=>557,4346=>514,4347=>393,4348=>318,7426=>846,7432=>458,7433=>288,7444=>890,7446=>542, -7447=>542,7453=>663,7454=>853,7455=>853,7468=>409,7469=>567,7470=>417,7472=>454,7473=>413,7474=>413, -7475=>453,7476=>494,7477=>224,7478=>227,7479=>423,7480=>376,7481=>580,7482=>496,7483=>496,7484=>464, -7486=>381,7487=>426,7488=>378,7489=>478,7490=>583,7491=>347,7492=>347,7493=>360,7494=>556,7495=>360, -7496=>360,7497=>348,7498=>348,7499=>306,7500=>306,7501=>360,7502=>157,7503=>328,7504=>552,7505=>359, -7506=>347,7507=>312,7508=>347,7509=>347,7510=>360,7511=>222,7512=>359,7513=>417,7514=>552,7515=>335, -7522=>181,7523=>312,7524=>359,7525=>335,7543=>576,7544=>494,7547=>334,7557=>288,7579=>360,7580=>312, -7581=>312,7582=>347,7583=>306,7584=>199,7585=>206,7586=>360,7587=>359,7588=>210,7589=>219,7590=>210, -7591=>210,7592=>207,7593=>158,7594=>157,7595=>330,7596=>552,7597=>552,7598=>366,7599=>364,7600=>359, -7601=>347,7602=>347,7603=>295,7604=>190,7605=>222,7606=>359,7607=>350,7609=>338,7610=>335,7611=>297, -7612=>297,7613=>297,7614=>327,7615=>347,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, -7680=>650,7681=>536,7682=>661,7683=>576,7684=>661,7685=>576,7686=>661,7687=>576,7688=>688,7689=>504, -7690=>721,7691=>576,7692=>721,7693=>576,7694=>721,7695=>576,7696=>721,7697=>576,7698=>721,7699=>576, -7700=>657,7701=>532,7702=>657,7703=>532,7704=>657,7705=>532,7706=>657,7707=>532,7708=>657,7709=>532, -7710=>624,7711=>333,7712=>719,7713=>576,7714=>785,7715=>580,7716=>785,7717=>580,7718=>785,7719=>580, -7720=>785,7721=>580,7722=>785,7723=>580,7724=>355,7725=>288,7728=>672,7729=>545,7730=>672,7731=>545, -7732=>672,7733=>545,7734=>598,7735=>288,7736=>598,7737=>288,7738=>598,7739=>288,7740=>598,7741=>288, -7742=>921,7743=>853,7744=>921,7745=>853,7746=>921,7747=>853,7748=>787,7749=>580,7750=>787,7751=>580, -7752=>787,7753=>580,7754=>787,7755=>580,7756=>738,7757=>542,7760=>738,7761=>542,7762=>738,7763=>542, -7764=>605,7765=>576,7766=>605,7767=>576,7768=>677,7769=>430,7770=>677,7771=>430,7772=>677,7773=>430, -7774=>677,7775=>430,7776=>616,7777=>461,7778=>616,7779=>461,7784=>616,7785=>461,7786=>600,7787=>361, -7788=>600,7789=>361,7790=>600,7791=>361,7792=>600,7793=>361,7794=>758,7795=>580,7796=>758,7797=>580, -7798=>758,7799=>580,7800=>758,7801=>580,7802=>758,7803=>580,7804=>650,7805=>508,7806=>650,7807=>508, -7808=>925,7809=>770,7810=>925,7811=>770,7812=>925,7813=>770,7814=>925,7815=>770,7816=>925,7817=>770, -7818=>641,7819=>507,7820=>641,7821=>507,7822=>594,7823=>508,7824=>625,7825=>474,7826=>625,7827=>474, -7828=>625,7829=>474,7830=>580,7831=>361,7832=>770,7833=>508,7834=>813,7835=>333,7838=>746,7839=>542, -7840=>650,7841=>536,7842=>650,7843=>536,7852=>650,7853=>536,7854=>650,7855=>536,7856=>650,7857=>536, -7858=>650,7859=>536,7860=>650,7861=>536,7862=>650,7863=>536,7864=>657,7865=>532,7866=>657,7867=>532, -7868=>657,7869=>532,7878=>657,7879=>532,7880=>355,7881=>288,7882=>355,7883=>288,7884=>738,7885=>542, -7886=>738,7887=>542,7896=>738,7897=>542,7908=>758,7909=>580,7910=>758,7911=>580,7922=>594,7923=>508, -7924=>594,7925=>508,7926=>594,7927=>508,7928=>594,7929=>508,7936=>607,7937=>607,7938=>607,7939=>607, -7940=>607,7941=>607,7942=>607,7943=>607,7944=>650,7945=>650,7946=>782,7947=>782,7948=>660,7949=>687, -7950=>650,7951=>650,7952=>483,7953=>483,7954=>483,7955=>483,7956=>483,7957=>483,7960=>768,7961=>757, -7962=>960,7963=>969,7964=>907,7965=>931,7968=>539,7969=>539,7970=>539,7971=>539,7972=>539,7973=>539, -7974=>539,7975=>539,7976=>898,7977=>893,7978=>1090,7979=>1101,7980=>1043,7981=>1064,7982=>988,7983=>985, -7984=>353,7985=>353,7986=>353,7987=>353,7988=>353,7989=>353,7990=>353,7991=>353,7992=>469,7993=>461, -7994=>661,7995=>664,7996=>611,7997=>635,7998=>561,7999=>553,8000=>542,8001=>542,8002=>542,8003=>542, -8004=>542,8005=>542,8008=>738,8009=>773,8010=>1008,8011=>1015,8012=>843,8013=>867,8016=>547,8017=>547, -8018=>547,8019=>547,8020=>547,8021=>547,8022=>547,8023=>547,8025=>765,8027=>971,8029=>939,8031=>857, -8032=>734,8033=>734,8034=>734,8035=>734,8036=>734,8037=>734,8038=>734,8039=>734,8040=>746,8041=>783, -8042=>1018,8043=>1023,8044=>852,8045=>878,8046=>844,8047=>873,8048=>607,8049=>607,8050=>483,8051=>483, -8052=>539,8053=>539,8054=>353,8055=>353,8056=>542,8057=>542,8058=>547,8059=>547,8060=>734,8061=>734, -8064=>607,8065=>607,8066=>607,8067=>607,8068=>607,8069=>607,8070=>607,8071=>607,8072=>650,8073=>650, -8074=>782,8075=>782,8076=>660,8077=>687,8078=>650,8079=>650,8080=>539,8081=>539,8082=>539,8083=>539, -8084=>539,8085=>539,8086=>539,8087=>539,8088=>898,8089=>893,8090=>1090,8091=>1101,8092=>1043,8093=>1064, -8094=>988,8095=>985,8096=>734,8097=>734,8098=>734,8099=>734,8100=>734,8101=>734,8102=>734,8103=>734, -8104=>746,8105=>783,8106=>1018,8107=>1023,8108=>852,8109=>878,8110=>844,8111=>873,8112=>607,8113=>607, -8114=>607,8115=>607,8116=>607,8118=>607,8119=>607,8120=>650,8121=>650,8122=>650,8123=>650,8124=>650, -8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>539,8131=>539,8132=>539,8134=>539,8135=>539, -8136=>820,8137=>810,8138=>956,8139=>935,8140=>785,8141=>450,8142=>450,8143=>450,8144=>353,8145=>353, -8146=>353,8147=>353,8150=>353,8151=>353,8152=>355,8153=>355,8154=>529,8155=>505,8157=>450,8158=>450, -8159=>450,8160=>547,8161=>547,8162=>547,8163=>547,8164=>529,8165=>529,8166=>547,8167=>547,8168=>594, -8169=>594,8170=>829,8171=>808,8172=>711,8173=>450,8174=>450,8175=>450,8178=>734,8179=>734,8180=>734, -8182=>734,8183=>734,8184=>865,8185=>751,8186=>886,8187=>767,8188=>746,8189=>450,8190=>450,8192=>450, -8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>304,8209=>304,8210=>572,8213=>900,8214=>450, -8215=>450,8219=>286,8223=>460,8227=>531,8228=>300,8229=>600,8234=>0,8235=>0,8236=>0,8237=>0, -8238=>0,8239=>180,8241=>1560,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305, -8252=>475,8253=>482,8254=>450,8258=>900,8260=>150,8261=>351,8262=>351,8263=>878,8264=>678,8265=>678, -8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8273=>450,8274=>404,8275=>900,8279=>597,8287=>200, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, -8303=>0,8304=>360,8305=>181,8308=>360,8309=>360,8310=>360,8311=>360,8312=>360,8313=>360,8314=>475, -8315=>475,8316=>475,8317=>221,8318=>221,8319=>389,8320=>360,8321=>360,8322=>360,8323=>360,8324=>360, -8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475,8332=>475,8333=>221,8334=>221, -8336=>347,8337=>348,8338=>347,8339=>381,8340=>348,8358=>594,8367=>951,8369=>635,8372=>702,8373=>572, -8450=>716,8451=>1006,8457=>942,8461=>850,8462=>580,8463=>580,8469=>822,8470=>852,8473=>677,8474=>784, -8477=>748,8484=>657,8486=>746,8487=>746,8490=>672,8491=>650,8508=>659,8509=>594,8510=>639,8511=>850, -8512=>642,8513=>697,8514=>501,8515=>501,8516=>549,8517=>780,8518=>629,8519=>572,8520=>342,8521=>325, -8523=>801,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872,8539=>872, -8540=>872,8541=>872,8542=>872,8543=>511,8544=>355,8545=>531,8546=>707,8547=>870,8548=>650,8549=>883, -8550=>1059,8551=>1234,8552=>838,8553=>641,8554=>839,8555=>1015,8556=>598,8557=>688,8558=>721,8559=>921, -8560=>288,8561=>576,8562=>863,8563=>796,8564=>508,8565=>796,8566=>1084,8567=>1372,8568=>795,8569=>507, -8570=>795,8571=>1083,8572=>288,8573=>504,8574=>576,8575=>853,8576=>1085,8577=>721,8578=>1085,8579=>688, -8580=>504,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754, -8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754, -8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754, -8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754, -8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754, -8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754, -8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754, -8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754, -8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754, -8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754, -8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754, -8701=>754,8702=>754,8703=>754,8704=>543,8706=>465,8707=>488,8708=>488,8710=>628,8711=>628,8712=>666, -8713=>666,8715=>666,8716=>666,8719=>716,8720=>716,8721=>642,8722=>754,8723=>754,8724=>754,8725=>303, -8727=>611,8728=>441,8729=>441,8730=>573,8731=>573,8732=>573,8733=>609,8734=>750,8735=>754,8736=>754, -8739=>262,8740=>431,8741=>416,8742=>570,8743=>659,8744=>659,8745=>754,8746=>754,8747=>469,8748=>766, -8749=>1063,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8770=>754,8771=>754,8776=>754, -8784=>754,8785=>754,8786=>754,8787=>754,8788=>930,8789=>930,8800=>754,8801=>754,8804=>754,8805=>754, -8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754,8845=>754,8846=>754,8847=>761, -8848=>761,8849=>761,8850=>761,8851=>754,8852=>754,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754, -8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>773,8867=>773, -8868=>846,8869=>846,8870=>510,8871=>510,8872=>773,8873=>773,8874=>773,8875=>927,8876=>773,8877=>773, -8878=>773,8879=>927,8901=>308,8962=>687,8968=>351,8969=>351,8970=>351,8971=>351,8976=>754,8977=>461, -8984=>900,8985=>754,8992=>469,8993=>469,8997=>900,9000=>1299,9085=>827,9134=>469,9167=>850,9251=>687, -9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542,9478=>542,9479=>542,9480=>542,9481=>542, -9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542,9488=>542,9489=>542,9490=>542,9491=>542, -9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542,9498=>542,9499=>542,9500=>542,9501=>542, -9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542,9508=>542,9509=>542,9510=>542,9511=>542, -9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542,9518=>542,9519=>542,9520=>542,9521=>542, -9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542,9528=>542,9529=>542,9530=>542,9531=>542, -9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542,9538=>542,9539=>542,9540=>542,9541=>542, -9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542,9548=>542,9549=>542,9550=>542,9551=>542, -9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542,9558=>542,9559=>542,9560=>542,9561=>542, -9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542,9568=>542,9569=>542,9570=>542,9571=>542, -9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542,9578=>542,9579=>542,9580=>542,9581=>542, -9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542,9588=>542,9589=>542,9590=>542,9591=>542, -9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542,9598=>542,9599=>542,9600=>692,9601=>692, -9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692, -9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692, -9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692, -9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850, -9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692, -9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692, -9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692, -9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785, -9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873, -9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692,9699=>692,9700=>692,9701=>692, -9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007, -9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692, -9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9784=>807,9785=>807,9786=>807, -9787=>807,9788=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807, -9799=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9833=>424, -9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,10145=>754,10181=>351,10182=>351,10208=>444, -10216=>351,10217=>351,10224=>754,10225=>754,10226=>754,10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290, -10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>659,10241=>659, -10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659,10249=>659,10250=>659,10251=>659, -10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659,10259=>659,10260=>659,10261=>659, -10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659,10269=>659,10270=>659,10271=>659, -10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659,10279=>659,10280=>659,10281=>659, -10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659,10289=>659,10290=>659,10291=>659, -10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659,10299=>659,10300=>659,10301=>659, -10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659,10309=>659,10310=>659,10311=>659, -10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659,10319=>659,10320=>659,10321=>659, -10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659,10329=>659,10330=>659,10331=>659, -10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659,10339=>659,10340=>659,10341=>659, -10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659,10349=>659,10350=>659,10351=>659, -10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659,10359=>659,10360=>659,10361=>659, -10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659,10369=>659,10370=>659,10371=>659, -10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659,10379=>659,10380=>659,10381=>659, -10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659,10389=>659,10390=>659,10391=>659, -10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659,10399=>659,10400=>659,10401=>659, -10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659,10409=>659,10410=>659,10411=>659, -10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659,10419=>659,10420=>659,10421=>659, -10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659,10429=>659,10430=>659,10431=>659, -10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659,10439=>659,10440=>659,10441=>659, -10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659,10449=>659,10450=>659,10451=>659, -10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659,10459=>659,10460=>659,10461=>659, -10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659,10469=>659,10470=>659,10471=>659, -10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659,10479=>659,10480=>659,10481=>659, -10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659,10489=>659,10490=>659,10491=>659, -10492=>659,10493=>659,10494=>659,10495=>659,10496=>754,10497=>754,10498=>754,10499=>754,10500=>754,10501=>754, -10502=>754,10503=>754,10504=>754,10505=>754,10506=>754,10507=>754,10508=>754,10509=>754,10510=>754,10511=>754, -10512=>754,10513=>754,10514=>754,10515=>754,10516=>754,10517=>754,10518=>754,10519=>754,10520=>754,10521=>754, -10522=>754,10523=>754,10524=>754,10525=>754,10526=>754,10527=>754,10528=>754,10529=>754,10530=>754,10531=>754, -10532=>754,10533=>754,10534=>754,10535=>754,10536=>754,10537=>754,10538=>754,10539=>754,10540=>754,10541=>754, -10542=>754,10543=>754,10544=>754,10545=>754,10546=>754,10547=>754,10548=>754,10549=>754,10550=>754,10551=>754, -10552=>754,10553=>754,10554=>754,10555=>754,10556=>754,10557=>754,10558=>754,10559=>754,10560=>754,10561=>754, -10562=>754,10563=>754,10564=>754,10565=>754,10566=>754,10567=>754,10568=>754,10569=>754,10570=>754,10571=>754, -10572=>754,10573=>754,10574=>754,10575=>754,10576=>754,10577=>754,10578=>754,10579=>754,10580=>754,10581=>754, -10582=>754,10583=>754,10584=>754,10585=>754,10586=>754,10587=>754,10588=>754,10589=>754,10590=>754,10591=>754, -10592=>754,10593=>754,10594=>754,10595=>754,10596=>754,10597=>754,10598=>754,10599=>754,10600=>754,10601=>754, -10602=>754,10603=>754,10604=>754,10605=>754,10606=>754,10607=>754,10608=>754,10609=>754,10610=>754,10611=>754, -10612=>754,10613=>754,10614=>754,10615=>883,10616=>754,10617=>754,10618=>886,10619=>754,10620=>754,10621=>754, -10622=>754,10623=>754,10731=>444,10764=>1361,10765=>469,10766=>469,10799=>754,11008=>754,11009=>754,11010=>754, -11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754, -11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692, -11031=>692,11032=>692,11033=>692,11034=>850,11364=>677,11367=>785,11368=>580,11369=>672,11370=>545,11371=>625, -11372=>474,11374=>921,11375=>650,11381=>666,11382=>500,11383=>630,11385=>451,11386=>542,11388=>237,11389=>409, -11520=>695,11521=>571,11522=>569,11523=>592,11524=>568,11525=>866,11526=>680,11527=>864,11528=>555,11529=>581, -11530=>866,11531=>568,11532=>581,11533=>866,11534=>580,11535=>779,11536=>865,11537=>580,11538=>580,11539=>863, -11540=>851,11541=>777,11542=>580,11543=>581,11544=>580,11545=>584,11546=>619,11547=>571,11548=>883,11549=>613, -11550=>608,11551=>766,11552=>861,11553=>569,11554=>580,11555=>582,11556=>674,11557=>822,11800=>482,11810=>351, -11811=>351,11812=>351,11813=>351,11822=>482,42564=>616,42565=>461,42566=>355,42567=>353,42576=>994,42577=>799, -42580=>1074,42581=>783,42582=>1025,42583=>809,42760=>444,42761=>444,42762=>444,42763=>444,42764=>444,42765=>444, -42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444,42773=>444,42774=>444,42779=>332, -42780=>332,42781=>228,42782=>228,42783=>228,42891=>361,42892=>247,62464=>588,62465=>598,62466=>642,62467=>853, -62468=>598,62469=>593,62470=>652,62471=>888,62472=>598,62473=>598,62474=>1131,62475=>614,62476=>613,62477=>857, -62478=>598,62479=>613,62480=>898,62481=>671,62482=>718,62483=>672,62484=>850,62485=>613,62486=>842,62487=>612, -62488=>619,62489=>613,62490=>655,62491=>613,62492=>619,62493=>599,62494=>656,62495=>795,62496=>598,62497=>635, -62498=>599,62499=>598,62500=>598,62501=>649,62502=>865,62504=>813,63173=>542,63185=>450,63188=>450,64256=>639, -64257=>600,64258=>600,64259=>925,64260=>927,64261=>694,64262=>839,65024=>0,65025=>0,65026=>0,65027=>0, -65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0, -65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>923); -$enc=''; -$diff=''; -$file='dejavuserifcondensed.z'; -$ctg='dejavuserifcondensed.ctg.z'; -$originalsize=295840; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.z deleted file mode 100644 index 8af77724..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensed.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.ctg.z deleted file mode 100644 index c1a3ccbf..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.php deleted file mode 100644 index a7db677a..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.php +++ /dev/null @@ -1,299 +0,0 @@ -939,'Descent'=>-236,'CapHeight'=>4,'Flags'=>32,'FontBBox'=>'[-752 -389 1616 1235]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>540); -$up=-63; -$ut=44; -$dw=540; -$cw=array( -0=>540,32=>313,33=>395,34=>469,35=>754,36=>626,37=>855,38=>813,39=>275,40=>426, -41=>426,42=>470,43=>754,44=>313,45=>374,46=>313,47=>329,48=>626,49=>626,50=>626, -51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>332,59=>332,60=>754, -61=>754,62=>754,63=>527,64=>900,65=>698,66=>760,67=>716,68=>780,69=>686,70=>639, -71=>769,72=>850,73=>421,74=>426,75=>782,76=>633,77=>996,78=>822,79=>784,80=>677, -81=>784,82=>748,83=>650,84=>669,85=>785,86=>698,87=>1011,88=>698,89=>642,90=>657, -91=>426,92=>329,93=>426,94=>754,95=>450,96=>450,97=>583,98=>629,99=>548,100=>629, -101=>572,102=>387,103=>629,104=>654,105=>342,106=>325,107=>624,108=>342,109=>952,110=>654, -111=>600,112=>629,113=>629,114=>474,115=>506,116=>416,117=>654,118=>523,119=>774,120=>536, -121=>523,122=>511,123=>579,124=>327,125=>579,126=>754,8364=>626,8218=>313,402=>387,8222=>518, -8230=>900,8224=>470,8225=>470,710=>450,8240=>1246,352=>650,8249=>360,338=>1062,381=>657,8216=>313, -8217=>313,8220=>518,8221=>518,8226=>575,8211=>450,8212=>900,732=>450,8482=>900,353=>506,8250=>360, -339=>925,382=>511,376=>642,160=>313,161=>395,162=>626,163=>626,164=>572,165=>626,166=>327, -167=>470,168=>450,169=>900,170=>438,171=>563,172=>754,173=>374,174=>900,175=>450,176=>450, -177=>754,178=>394,179=>394,180=>450,181=>659,182=>572,183=>313,184=>450,185=>394,186=>450, -187=>563,188=>938,189=>938,190=>938,191=>527,192=>698,193=>698,194=>698,195=>698,196=>698, -197=>698,198=>931,199=>716,200=>686,201=>686,202=>686,203=>686,204=>421,205=>421,206=>421, -207=>421,208=>787,209=>822,210=>784,211=>784,212=>784,213=>784,214=>784,215=>754,216=>784, -217=>785,218=>785,219=>785,220=>785,221=>642,222=>681,223=>684,224=>583,225=>583,226=>583, -227=>583,228=>583,229=>583,230=>877,231=>548,232=>572,233=>572,234=>572,235=>572,236=>342, -237=>342,238=>342,239=>342,240=>600,241=>654,242=>600,243=>600,244=>600,245=>600,246=>600, -247=>754,248=>600,249=>654,250=>654,251=>654,252=>654,253=>523,254=>629,255=>523,256=>698, -257=>583,258=>698,259=>583,260=>698,261=>583,262=>716,263=>548,264=>716,265=>548,266=>716, -267=>548,268=>716,269=>548,270=>780,271=>629,272=>787,273=>629,274=>686,275=>572,276=>686, -277=>572,278=>686,279=>572,280=>686,281=>572,282=>686,283=>572,284=>769,285=>629,286=>769, -287=>629,288=>769,289=>629,290=>769,291=>629,292=>850,293=>654,294=>850,295=>654,296=>421, -297=>342,298=>421,299=>342,300=>421,301=>342,302=>421,303=>342,304=>421,305=>342,306=>848, -307=>676,308=>426,309=>325,310=>782,311=>624,312=>624,313=>633,314=>342,315=>633,316=>342, -317=>633,318=>342,319=>633,320=>342,321=>639,322=>346,323=>822,324=>654,325=>822,326=>654, -327=>822,328=>654,329=>907,330=>785,331=>654,332=>784,333=>600,334=>784,335=>600,336=>784, -337=>600,340=>748,341=>474,342=>748,343=>474,344=>748,345=>474,346=>650,347=>506,348=>650, -349=>506,350=>650,351=>506,354=>669,355=>416,356=>669,357=>416,358=>669,359=>416,360=>785, -361=>654,362=>785,363=>654,364=>785,365=>654,366=>785,367=>654,368=>785,369=>654,370=>785, -371=>654,372=>1011,373=>774,374=>642,375=>523,377=>657,378=>511,379=>657,380=>511,383=>387, -384=>629,385=>760,386=>769,387=>629,388=>769,389=>629,390=>716,391=>716,392=>548,393=>787, -394=>780,395=>769,396=>629,397=>600,398=>686,399=>784,400=>649,401=>639,403=>769,404=>693, -405=>938,406=>421,407=>421,408=>782,409=>624,410=>342,411=>631,412=>952,413=>822,414=>654, -415=>784,416=>784,417=>600,418=>1080,419=>849,420=>677,421=>629,422=>748,423=>650,424=>506, -425=>636,426=>298,427=>416,428=>669,429=>416,430=>669,431=>785,432=>654,433=>801,434=>801, -435=>642,436=>637,437=>657,438=>511,439=>591,440=>591,441=>591,443=>626,444=>678,445=>511, -446=>482,448=>265,449=>443,450=>413,451=>265,452=>1437,453=>1292,454=>1140,455=>1059,456=>958, -457=>667,458=>1248,459=>1148,460=>980,461=>698,462=>583,463=>421,464=>342,465=>784,466=>600, -467=>785,468=>654,469=>785,470=>654,471=>785,472=>654,473=>785,474=>654,475=>785,476=>654, -477=>572,478=>698,479=>583,480=>698,481=>583,482=>931,483=>877,484=>806,485=>629,486=>769, -487=>629,488=>782,489=>624,490=>784,491=>600,492=>784,493=>600,494=>591,495=>511,496=>342, -497=>1437,498=>1292,499=>1140,500=>769,501=>629,502=>1099,504=>822,505=>654,506=>698,507=>583, -508=>931,509=>877,510=>784,511=>600,512=>698,513=>583,514=>698,515=>583,516=>686,517=>572, -518=>686,519=>572,520=>421,521=>342,522=>421,523=>342,524=>784,525=>600,526=>784,527=>600, -528=>748,529=>474,530=>748,531=>474,532=>785,533=>654,534=>785,535=>654,536=>650,537=>506, -538=>669,539=>416,540=>621,541=>546,542=>850,543=>654,544=>785,545=>711,548=>657,549=>511, -550=>698,551=>583,552=>686,553=>572,554=>784,555=>600,556=>784,557=>600,558=>784,559=>600, -560=>784,561=>600,562=>642,563=>523,564=>516,565=>830,566=>508,567=>325,568=>928,569=>928, -570=>698,571=>716,572=>548,573=>633,574=>669,575=>506,576=>511,577=>594,578=>492,581=>698, -592=>583,593=>629,594=>629,595=>629,596=>548,597=>548,598=>629,599=>657,600=>572,601=>572, -602=>816,603=>547,604=>505,605=>816,606=>647,607=>348,608=>629,609=>629,610=>563,611=>641, -612=>564,613=>654,614=>654,615=>654,616=>342,617=>342,618=>342,619=>368,620=>462,621=>342, -622=>716,623=>952,624=>952,625=>952,626=>654,627=>654,628=>641,629=>600,630=>955,631=>674, -632=>600,633=>514,634=>514,635=>514,636=>474,637=>474,638=>406,639=>438,640=>721,641=>721, -642=>506,643=>298,644=>387,645=>486,646=>298,647=>443,648=>416,649=>654,650=>611,651=>624, -652=>577,653=>816,654=>571,655=>654,656=>511,657=>511,658=>511,659=>511,660=>482,661=>482, -662=>482,663=>490,664=>784,665=>625,666=>647,667=>563,668=>659,669=>345,670=>666,671=>581, -672=>629,673=>482,674=>482,675=>1005,676=>1061,677=>1005,678=>819,679=>643,680=>817,681=>935, -682=>711,683=>716,684=>596,685=>398,686=>552,687=>646,688=>469,689=>466,690=>282,691=>372, -692=>372,693=>432,694=>474,695=>595,696=>436,697=>271,699=>313,700=>313,701=>313,702=>330, -703=>330,704=>282,705=>282,711=>450,712=>254,713=>450,716=>254,720=>332,721=>332,722=>330, -723=>330,726=>353,728=>450,729=>450,730=>450,731=>450,733=>450,734=>375,736=>412,737=>263, -738=>355,739=>427,740=>282,741=>450,742=>450,743=>450,744=>450,745=>450,750=>498,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>701,881=>519,884=>271, -885=>271,890=>450,891=>548,892=>548,893=>548,894=>332,900=>450,901=>450,902=>698,903=>313, -904=>852,905=>1006,906=>595,908=>798,910=>857,911=>820,912=>435,913=>698,914=>760,915=>639, -916=>698,917=>686,918=>657,919=>850,920=>784,921=>421,922=>782,923=>698,924=>996,925=>822, -926=>633,927=>784,928=>850,929=>677,931=>636,932=>669,933=>642,934=>784,935=>698,936=>822, -937=>801,938=>421,939=>642,940=>692,941=>547,942=>654,943=>435,944=>624,945=>692,946=>598, -947=>594,948=>600,949=>547,950=>533,951=>654,952=>600,953=>435,954=>674,955=>631,956=>659, -957=>624,958=>533,959=>600,960=>659,961=>598,962=>548,963=>664,964=>605,965=>624,966=>814, -967=>592,968=>847,969=>857,970=>435,971=>624,972=>600,973=>624,974=>857,976=>600,977=>764, -978=>687,979=>872,980=>687,981=>847,982=>857,983=>589,984=>784,985=>600,986=>716,987=>548, -988=>639,989=>475,990=>531,991=>593,992=>716,993=>600,1008=>589,1009=>598,1010=>548,1011=>325, -1012=>784,1013=>548,1014=>548,1015=>681,1016=>629,1017=>716,1018=>996,1019=>774,1020=>623,1021=>716, -1022=>716,1023=>716,1024=>686,1025=>686,1026=>811,1027=>621,1028=>716,1029=>650,1030=>421,1031=>421, -1032=>426,1033=>1081,1034=>1135,1035=>866,1036=>818,1037=>850,1038=>730,1039=>850,1040=>733,1041=>769, -1042=>760,1043=>621,1044=>800,1045=>686,1046=>1181,1047=>649,1048=>850,1049=>850,1050=>818,1051=>795, -1052=>996,1053=>850,1054=>784,1055=>850,1056=>677,1057=>716,1058=>669,1059=>730,1060=>854,1061=>698, -1062=>870,1063=>822,1064=>1141,1065=>1164,1066=>861,1067=>1081,1068=>743,1069=>716,1070=>1158,1071=>793, -1072=>583,1073=>600,1074=>625,1075=>551,1076=>600,1077=>572,1078=>909,1079=>574,1080=>667,1081=>667, -1082=>650,1083=>634,1084=>782,1085=>659,1086=>600,1087=>659,1088=>629,1089=>548,1090=>558,1091=>576, -1092=>812,1093=>536,1094=>665,1095=>659,1096=>967,1097=>974,1098=>690,1099=>902,1100=>611,1101=>548, -1102=>923,1103=>665,1104=>572,1105=>572,1106=>646,1107=>551,1108=>548,1109=>506,1110=>342,1111=>342, -1112=>325,1113=>889,1114=>913,1115=>654,1116=>650,1117=>667,1118=>576,1119=>659,1122=>792,1123=>633, -1124=>1076,1125=>867,1130=>1181,1131=>909,1136=>986,1137=>995,1138=>784,1139=>587,1140=>824,1141=>673, -1164=>761,1165=>606,1168=>630,1169=>556,1170=>621,1171=>551,1172=>781,1173=>645,1174=>1181,1175=>909, -1176=>649,1177=>574,1178=>852,1179=>669,1182=>818,1183=>650,1184=>937,1185=>744,1186=>870,1187=>665, -1188=>1050,1189=>860,1190=>1210,1191=>953,1194=>716,1195=>548,1196=>669,1197=>558,1198=>642,1199=>523, -1200=>642,1201=>523,1202=>779,1203=>584,1204=>919,1205=>726,1206=>835,1207=>665,1210=>819,1211=>654, -1216=>421,1217=>1181,1218=>909,1219=>782,1220=>624,1223=>850,1224=>659,1227=>822,1228=>659,1231=>342, -1232=>733,1233=>583,1234=>733,1235=>583,1236=>931,1237=>877,1238=>686,1239=>572,1240=>784,1241=>572, -1242=>784,1243=>572,1244=>1181,1245=>909,1246=>649,1247=>574,1248=>591,1249=>511,1250=>850,1251=>667, -1252=>850,1253=>667,1254=>784,1255=>600,1256=>784,1257=>600,1258=>784,1259=>600,1260=>716,1261=>548, -1262=>730,1263=>576,1264=>730,1265=>576,1266=>730,1267=>576,1268=>822,1269=>659,1270=>621,1271=>551, -1272=>1081,1273=>902,1296=>649,1297=>574,1298=>795,1299=>634,1300=>1123,1301=>851,1306=>738,1307=>576, -1308=>925,1309=>770,4256=>680,4257=>842,4258=>779,4259=>787,4260=>703,4261=>970,4262=>913,4263=>1091, -4264=>579,4265=>736,4266=>946,4267=>945,4268=>716,4269=>1021,4270=>872,4271=>812,4272=>998,4273=>712, -4274=>680,4275=>968,4276=>878,4277=>959,4278=>729,4279=>750,4280=>739,4281=>750,4282=>817,4283=>969, -4284=>692,4285=>739,4286=>731,4287=>1000,4288=>1010,4289=>721,4290=>803,4291=>722,4292=>792,4293=>957, -4304=>535,4305=>563,4306=>579,4307=>798,4308=>553,4309=>549,4310=>600,4311=>823,4312=>552,4313=>540, -4314=>1008,4315=>576,4316=>576,4317=>791,4318=>561,4319=>571,4320=>790,4321=>599,4322=>702,4323=>676, -4324=>782,4325=>575,4326=>820,4327=>559,4328=>583,4329=>576,4330=>656,4331=>577,4332=>567,4333=>566, -4334=>603,4335=>678,4336=>563,4337=>591,4338=>563,4339=>563,4340=>562,4341=>603,4342=>846,4343=>612, -4344=>572,4345=>605,4346=>562,4347=>529,4348=>318,7426=>846,7432=>458,7433=>288,7444=>890,7446=>600, -7447=>600,7453=>663,7454=>853,7455=>853,7468=>439,7469=>586,7470=>479,7472=>491,7473=>432,7474=>432, -7475=>483,7476=>536,7477=>265,7478=>268,7479=>492,7480=>398,7481=>627,7482=>518,7483=>518,7484=>493, -7486=>426,7487=>471,7488=>409,7489=>422,7490=>494,7491=>419,7492=>419,7493=>448,7494=>591,7495=>448, -7496=>448,7497=>400,7498=>400,7499=>370,7500=>370,7501=>448,7502=>270,7503=>471,7504=>655,7505=>426, -7506=>420,7507=>384,7508=>420,7509=>420,7510=>448,7511=>333,7512=>468,7513=>390,7514=>655,7515=>442, -7522=>215,7523=>372,7524=>468,7525=>442,7543=>576,7544=>536,7547=>342,7557=>342,7579=>448,7580=>384, -7581=>384,7582=>420,7583=>370,7584=>345,7585=>335,7586=>448,7587=>470,7588=>270,7589=>276,7590=>270, -7591=>270,7592=>333,7593=>331,7594=>289,7595=>387,7596=>613,7597=>655,7598=>529,7599=>528,7600=>425, -7601=>420,7602=>470,7603=>360,7604=>348,7605=>333,7606=>468,7607=>427,7609=>439,7610=>442,7611=>371, -7612=>474,7613=>371,7614=>407,7615=>420,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, -7680=>698,7681=>583,7682=>760,7683=>629,7684=>760,7685=>629,7686=>760,7687=>629,7688=>716,7689=>548, -7690=>780,7691=>629,7692=>780,7693=>629,7694=>780,7695=>629,7696=>780,7697=>629,7698=>780,7699=>629, -7700=>686,7701=>572,7702=>686,7703=>572,7704=>686,7705=>572,7706=>686,7707=>572,7708=>686,7709=>572, -7710=>639,7711=>387,7712=>769,7713=>629,7714=>850,7715=>654,7716=>850,7717=>654,7718=>850,7719=>654, -7720=>850,7721=>654,7722=>850,7723=>654,7724=>421,7725=>342,7728=>782,7729=>624,7730=>782,7731=>624, -7732=>782,7733=>624,7734=>633,7735=>342,7736=>633,7737=>342,7738=>633,7739=>342,7740=>633,7741=>342, -7742=>996,7743=>952,7744=>996,7745=>952,7746=>996,7747=>952,7748=>822,7749=>654,7750=>822,7751=>654, -7752=>822,7753=>654,7754=>822,7755=>654,7756=>784,7757=>600,7760=>784,7761=>600,7762=>784,7763=>600, -7764=>677,7765=>629,7766=>677,7767=>629,7768=>748,7769=>474,7770=>748,7771=>474,7772=>748,7773=>474, -7774=>748,7775=>474,7776=>650,7777=>506,7778=>650,7779=>506,7784=>650,7785=>506,7786=>669,7787=>416, -7788=>669,7789=>416,7790=>669,7791=>416,7792=>669,7793=>416,7794=>785,7795=>654,7796=>785,7797=>654, -7798=>785,7799=>654,7800=>785,7801=>654,7802=>785,7803=>654,7804=>698,7805=>523,7806=>698,7807=>523, -7808=>1011,7809=>774,7810=>1011,7811=>774,7812=>1011,7813=>774,7814=>1011,7815=>774,7816=>1011,7817=>774, -7818=>698,7819=>536,7820=>698,7821=>536,7822=>642,7823=>523,7824=>657,7825=>511,7826=>657,7827=>511, -7828=>657,7829=>511,7830=>654,7831=>416,7832=>774,7833=>523,7834=>913,7835=>387,7838=>852,7839=>600, -7840=>698,7841=>583,7842=>698,7843=>583,7852=>698,7853=>583,7854=>698,7855=>583,7856=>698,7857=>583, -7858=>698,7859=>583,7860=>698,7861=>583,7862=>698,7863=>583,7864=>686,7865=>572,7866=>686,7867=>572, -7868=>686,7869=>572,7878=>686,7879=>572,7880=>421,7881=>342,7882=>421,7883=>342,7884=>784,7885=>600, -7886=>784,7887=>600,7896=>784,7897=>600,7908=>785,7909=>654,7910=>785,7911=>654,7922=>642,7923=>523, -7924=>642,7925=>523,7926=>642,7927=>523,7928=>642,7929=>523,7936=>692,7937=>692,7938=>692,7939=>692, -7940=>692,7941=>692,7942=>692,7943=>692,7944=>698,7945=>698,7946=>880,7947=>880,7948=>748,7949=>764, -7950=>698,7951=>698,7952=>547,7953=>547,7954=>547,7955=>547,7956=>547,7957=>547,7960=>826,7961=>817, -7962=>1052,7963=>1052,7964=>984,7965=>1007,7968=>654,7969=>654,7970=>654,7971=>654,7972=>654,7973=>654, -7974=>654,7975=>654,7976=>990,7977=>984,7978=>1222,7979=>1225,7980=>1151,7981=>1177,7982=>1077,7983=>1074, -7984=>435,7985=>435,7986=>435,7987=>435,7988=>435,7989=>435,7990=>435,7991=>435,7992=>566,7993=>555, -7994=>790,7995=>792,7996=>719,7997=>748,7998=>650,7999=>642,8000=>600,8001=>600,8002=>600,8003=>600, -8004=>600,8005=>600,8008=>810,8009=>841,8010=>1116,8011=>1113,8012=>931,8013=>959,8016=>624,8017=>624, -8018=>624,8019=>624,8020=>624,8021=>624,8022=>624,8023=>624,8025=>830,8027=>1067,8029=>1020,8031=>917, -8032=>857,8033=>857,8034=>857,8035=>857,8036=>857,8037=>857,8038=>857,8039=>857,8040=>838,8041=>867, -8042=>1141,8043=>1146,8044=>949,8045=>979,8046=>920,8047=>954,8048=>692,8049=>692,8050=>547,8051=>547, -8052=>654,8053=>654,8054=>435,8055=>435,8056=>600,8057=>600,8058=>624,8059=>624,8060=>857,8061=>857, -8064=>692,8065=>692,8066=>692,8067=>692,8068=>692,8069=>692,8070=>692,8071=>692,8072=>698,8073=>698, -8074=>880,8075=>880,8076=>748,8077=>764,8078=>698,8079=>698,8080=>654,8081=>654,8082=>654,8083=>654, -8084=>654,8085=>654,8086=>654,8087=>654,8088=>990,8089=>984,8090=>1222,8091=>1225,8092=>1151,8093=>1177, -8094=>1077,8095=>1074,8096=>857,8097=>857,8098=>857,8099=>857,8100=>857,8101=>857,8102=>857,8103=>857, -8104=>838,8105=>867,8106=>1141,8107=>1146,8108=>949,8109=>979,8110=>920,8111=>954,8112=>692,8113=>692, -8114=>692,8115=>692,8116=>692,8118=>692,8119=>692,8120=>698,8121=>698,8122=>729,8123=>698,8124=>698, -8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>654,8131=>654,8132=>654,8134=>654,8135=>654, -8136=>899,8137=>852,8138=>1072,8139=>1006,8140=>850,8141=>450,8142=>450,8143=>450,8144=>435,8145=>435, -8146=>435,8147=>435,8150=>435,8151=>435,8152=>421,8153=>421,8154=>642,8155=>595,8157=>450,8158=>450, -8159=>450,8160=>624,8161=>624,8162=>624,8163=>624,8164=>598,8165=>598,8166=>624,8167=>624,8168=>642, -8169=>642,8170=>917,8171=>857,8172=>819,8173=>450,8174=>450,8175=>450,8178=>857,8179=>857,8180=>857, -8182=>857,8183=>857,8184=>962,8185=>798,8186=>991,8187=>820,8188=>801,8189=>450,8190=>450,8192=>450, -8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>626,8200=>313,8201=>180,8202=>89, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8213=>900,8214=>450, -8215=>450,8219=>313,8223=>518,8227=>575,8228=>313,8229=>606,8234=>0,8235=>0,8236=>0,8237=>0, -8238=>0,8239=>180,8241=>1638,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659, -8252=>566,8253=>527,8254=>450,8258=>920,8260=>150,8261=>426,8262=>426,8263=>974,8264=>770,8265=>770, -8267=>572,8268=>450,8269=>450,8270=>470,8271=>332,8273=>470,8274=>500,8275=>900,8279=>731,8287=>200, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, -8303=>0,8304=>394,8305=>215,8308=>394,8309=>394,8310=>394,8311=>394,8312=>394,8313=>394,8314=>475, -8315=>475,8316=>475,8317=>268,8318=>268,8319=>467,8320=>394,8321=>394,8322=>394,8323=>394,8324=>394, -8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475,8332=>475,8333=>268,8334=>268, -8336=>419,8337=>400,8338=>420,8339=>427,8340=>400,8358=>626,8367=>1039,8369=>710,8372=>788,8373=>626, -8451=>1078,8457=>1001,8462=>654,8463=>654,8470=>978,8486=>801,8487=>801,8490=>782,8491=>698,8513=>697, -8514=>501,8515=>573,8516=>684,8523=>813,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932, -8537=>932,8538=>932,8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>421,8545=>663,8546=>904, -8547=>984,8548=>698,8549=>1014,8550=>1256,8551=>1498,8552=>962,8553=>698,8554=>970,8555=>1212,8556=>633, -8557=>716,8558=>780,8559=>996,8560=>342,8561=>684,8562=>1025,8563=>865,8564=>523,8565=>865,8566=>1207, -8567=>1548,8568=>878,8569=>536,8570=>878,8571=>1220,8572=>342,8573=>548,8574=>629,8575=>952,8576=>1129, -8577=>780,8578=>1141,8579=>716,8580=>548,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754, -8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754, -8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754, -8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>765,8624=>754,8625=>754,8626=>754,8627=>754, -8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754, -8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754, -8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754, -8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754, -8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754, -8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754, -8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754, -8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>577,8706=>480,8707=>558,8708=>558, -8710=>677,8711=>677,8712=>666,8713=>666,8715=>666,8716=>666,8719=>757,8720=>757,8721=>677,8722=>754, -8723=>754,8724=>754,8725=>329,8727=>622,8728=>466,8729=>466,8730=>591,8731=>591,8732=>591,8733=>604, -8734=>750,8735=>754,8736=>754,8739=>292,8740=>546,8741=>476,8742=>696,8743=>730,8744=>730,8745=>754, -8746=>754,8747=>521,8748=>900,8749=>1252,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754, -8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>974,8789=>974,8800=>754, -8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754, -8845=>754,8846=>754,8847=>754,8848=>754,8849=>754,8850=>754,8851=>754,8852=>754,8853=>754,8854=>754, -8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754, -8865=>754,8866=>795,8867=>795,8868=>864,8869=>864,8870=>554,8871=>554,8872=>795,8873=>795,8874=>795, -8875=>971,8876=>795,8877=>795,8878=>795,8879=>971,8901=>358,8962=>751,8968=>426,8969=>426,8970=>426, -8971=>426,8976=>754,8977=>484,8984=>835,8985=>754,8992=>521,8993=>521,8997=>900,9000=>1299,9085=>907, -9134=>521,9167=>850,9251=>751,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692, -9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692, -9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692, -9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850, -9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495, -9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452, -9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452, -9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785, -9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474, -9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785, -9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850, -9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785, -9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659, -9727=>692,9728=>807,9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658, -9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807, -9828=>807,9829=>807,9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321, -9839=>435,10145=>754,10181=>411,10182=>411,10208=>444,10216=>411,10217=>411,10224=>754,10225=>754,10226=>754, -10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290, -10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703, -10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703, -10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703, -10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703, -10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703, -10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703, -10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703, -10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703, -10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703, -10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703, -10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703, -10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703, -10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703, -10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703, -10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703, -10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703, -10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703, -10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703, -10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703, -10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703, -10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703, -10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703, -10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703, -10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703, -10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703, -10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10496=>754, -10497=>754,10498=>754,10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754, -10507=>754,10508=>754,10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754, -10517=>754,10518=>754,10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754, -10527=>754,10528=>754,10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754, -10537=>754,10538=>754,10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754, -10547=>754,10548=>754,10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754, -10557=>754,10558=>754,10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754, -10567=>754,10568=>754,10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754, -10577=>754,10578=>754,10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754, -10587=>754,10588=>754,10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754, -10597=>754,10598=>754,10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754, -10607=>754,10608=>754,10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>929,10616=>754, -10617=>754,10618=>864,10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1604,10765=>549, -10766=>549,10799=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754, -11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754, -11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11364=>748, -11367=>850,11368=>654,11369=>782,11370=>624,11371=>657,11372=>511,11374=>996,11375=>698,11381=>701,11382=>541, -11383=>814,11385=>514,11386=>600,11388=>282,11389=>439,11520=>695,11521=>571,11522=>723,11523=>592,11524=>708, -11525=>866,11526=>680,11527=>864,11528=>555,11529=>581,11530=>866,11531=>567,11532=>581,11533=>866,11534=>761, -11535=>779,11536=>865,11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580, -11545=>584,11546=>619,11547=>842,11548=>883,11549=>613,11550=>608,11551=>766,11552=>1002,11553=>569,11554=>580, -11555=>582,11556=>674,11557=>822,11800=>527,11810=>426,11811=>426,11812=>426,11813=>426,11822=>527,42564=>650, -42565=>506,42566=>421,42567=>342,42576=>1200,42577=>982,42580=>1158,42581=>923,42582=>1158,42583=>935,42760=>450, -42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450, -42771=>450,42772=>450,42773=>450,42774=>450,42779=>346,42780=>346,42781=>249,42782=>249,42783=>249,42891=>395, -42892=>275,62464=>634,62465=>645,62466=>688,62467=>898,62468=>645,62469=>639,62470=>698,62471=>934,62472=>645, -62473=>645,62474=>1178,62475=>660,62476=>659,62477=>903,62478=>645,62479=>659,62480=>945,62481=>717,62482=>765, -62483=>719,62484=>896,62485=>659,62486=>888,62487=>658,62488=>665,62489=>659,62490=>702,62491=>659,62492=>665, -62493=>646,62494=>702,62495=>842,62496=>644,62497=>743,62498=>645,62499=>645,62500=>645,62501=>695,62502=>911, -62504=>813,63173=>600,63185=>450,63188=>450,64256=>738,64257=>654,64258=>654,64259=>1007,64260=>1005,64261=>784, -64262=>874,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, -65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0, -65532=>0,65533=>1002); -$enc=''; -$diff=''; -$file='dejavuserifcondensedb.z'; -$ctg='dejavuserifcondensedb.ctg.z'; -$originalsize=282092; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.z deleted file mode 100644 index b84198dc..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedb.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.ctg.z deleted file mode 100644 index d237ae7e..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.php deleted file mode 100644 index 88cb607b..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.php +++ /dev/null @@ -1,299 +0,0 @@ -939,'Descent'=>-236,'CapHeight'=>-48,'Flags'=>96,'FontBBox'=>'[-815 -389 1584 1235]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>540); -$up=-63; -$ut=44; -$dw=540; -$cw=array( -0=>540,32=>313,33=>395,34=>469,35=>754,36=>626,37=>855,38=>813,39=>275,40=>426, -41=>426,42=>470,43=>754,44=>313,45=>374,46=>313,47=>329,48=>626,49=>626,50=>626, -51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>332,59=>332,60=>754, -61=>754,62=>754,63=>527,64=>900,65=>698,66=>760,67=>716,68=>780,69=>686,70=>639, -71=>769,72=>850,73=>421,74=>426,75=>782,76=>633,77=>996,78=>822,79=>784,80=>677, -81=>784,82=>748,83=>650,84=>669,85=>785,86=>698,87=>1011,88=>698,89=>642,90=>657, -91=>426,92=>329,93=>426,94=>754,95=>450,96=>450,97=>583,98=>629,99=>548,100=>629, -101=>572,102=>387,103=>629,104=>654,105=>342,106=>325,107=>624,108=>342,109=>952,110=>654, -111=>600,112=>629,113=>629,114=>474,115=>506,116=>416,117=>654,118=>523,119=>774,120=>536, -121=>523,122=>511,123=>579,124=>327,125=>579,126=>754,8364=>626,8218=>313,402=>387,8222=>518, -8230=>900,8224=>470,8225=>470,710=>450,8240=>1246,352=>650,8249=>360,338=>1062,381=>657,8216=>313, -8217=>313,8220=>518,8221=>518,8226=>575,8211=>450,8212=>900,732=>450,8482=>900,353=>506,8250=>360, -339=>925,382=>511,376=>642,160=>313,161=>395,162=>626,163=>626,164=>572,165=>626,166=>327, -167=>470,168=>450,169=>900,170=>438,171=>563,172=>754,173=>374,174=>900,175=>450,176=>450, -177=>754,178=>394,179=>394,180=>450,181=>659,182=>572,183=>313,184=>450,185=>394,186=>450, -187=>563,188=>938,189=>938,190=>938,191=>527,192=>698,193=>698,194=>698,195=>698,196=>698, -197=>698,198=>931,199=>716,200=>686,201=>686,202=>686,203=>686,204=>421,205=>421,206=>421, -207=>421,208=>787,209=>822,210=>784,211=>784,212=>784,213=>784,214=>784,215=>754,216=>784, -217=>785,218=>785,219=>785,220=>785,221=>642,222=>681,223=>684,224=>583,225=>583,226=>583, -227=>583,228=>583,229=>583,230=>838,231=>548,232=>572,233=>572,234=>572,235=>572,236=>342, -237=>342,238=>342,239=>342,240=>600,241=>654,242=>600,243=>600,244=>600,245=>600,246=>600, -247=>754,248=>600,249=>654,250=>654,251=>654,252=>654,253=>523,254=>629,255=>523,256=>698, -257=>583,258=>698,259=>583,260=>698,261=>583,262=>716,263=>548,264=>716,265=>548,266=>716, -267=>548,268=>716,269=>548,270=>780,271=>629,272=>787,273=>629,274=>686,275=>572,276=>686, -277=>572,278=>686,279=>572,280=>686,281=>572,282=>686,283=>572,284=>769,285=>629,286=>769, -287=>629,288=>769,289=>629,290=>769,291=>629,292=>850,293=>654,294=>850,295=>654,296=>421, -297=>342,298=>421,299=>342,300=>421,301=>342,302=>421,303=>342,304=>421,305=>342,306=>848, -307=>676,308=>426,309=>325,310=>782,311=>624,312=>624,313=>633,314=>342,315=>633,316=>342, -317=>633,318=>457,319=>633,320=>501,321=>639,322=>346,323=>822,324=>654,325=>822,326=>654, -327=>822,328=>654,329=>907,330=>785,331=>654,332=>784,333=>600,334=>784,335=>600,336=>784, -337=>600,340=>748,341=>474,342=>748,343=>474,344=>748,345=>474,346=>650,347=>506,348=>650, -349=>506,350=>650,351=>506,354=>669,355=>416,356=>669,357=>416,358=>669,359=>416,360=>785, -361=>654,362=>785,363=>654,364=>785,365=>654,366=>785,367=>654,368=>785,369=>654,370=>785, -371=>654,372=>1011,373=>774,374=>642,375=>523,377=>657,378=>511,379=>657,380=>511,383=>387, -384=>629,385=>760,386=>769,387=>629,388=>769,389=>629,390=>716,391=>716,392=>548,393=>787, -394=>780,395=>769,396=>629,397=>600,398=>686,399=>784,400=>649,401=>639,403=>769,404=>693, -405=>938,406=>421,407=>421,408=>782,409=>624,410=>342,411=>631,412=>952,413=>822,414=>654, -415=>784,416=>784,417=>600,418=>1080,419=>849,420=>677,421=>629,422=>748,423=>650,424=>506, -425=>636,426=>298,427=>416,428=>669,429=>416,430=>669,431=>785,432=>654,433=>801,434=>801, -435=>642,436=>628,437=>657,438=>511,439=>591,440=>591,441=>591,443=>626,444=>678,445=>511, -446=>482,448=>265,449=>443,450=>413,451=>265,452=>1437,453=>1292,454=>1140,455=>1059,456=>958, -457=>667,458=>1248,459=>1148,460=>980,461=>698,462=>583,463=>421,464=>342,465=>784,466=>600, -467=>785,468=>654,469=>785,470=>654,471=>785,472=>654,473=>785,474=>654,475=>785,476=>654, -477=>572,478=>698,479=>583,480=>698,481=>583,482=>931,483=>877,484=>806,485=>629,486=>769, -487=>629,488=>782,489=>624,490=>784,491=>600,492=>784,493=>600,494=>591,495=>511,496=>325, -497=>1437,498=>1292,499=>1140,500=>769,501=>629,502=>1099,504=>822,505=>654,506=>698,507=>583, -508=>931,509=>838,510=>784,511=>600,512=>698,513=>583,514=>698,515=>583,516=>686,517=>572, -518=>686,519=>572,520=>421,521=>342,522=>421,523=>342,524=>784,525=>600,526=>784,527=>600, -528=>748,529=>474,530=>748,531=>474,532=>785,533=>654,534=>785,535=>654,536=>650,537=>506, -538=>669,539=>416,540=>621,541=>546,542=>850,543=>654,544=>785,545=>711,548=>657,549=>511, -550=>698,551=>583,552=>686,553=>572,554=>784,555=>600,556=>784,557=>600,558=>784,559=>600, -560=>784,561=>600,562=>642,563=>523,564=>516,565=>830,566=>508,567=>325,568=>928,569=>928, -570=>698,571=>716,572=>548,573=>633,574=>669,575=>506,576=>511,577=>594,578=>492,581=>698, -592=>583,593=>629,594=>629,595=>629,596=>548,597=>548,598=>629,599=>657,600=>572,601=>572, -602=>816,603=>547,604=>505,605=>816,606=>647,607=>348,608=>629,609=>629,610=>563,611=>641, -612=>564,613=>654,614=>654,615=>654,616=>342,617=>342,618=>342,619=>368,620=>462,621=>342, -622=>716,623=>952,624=>952,625=>952,626=>654,627=>654,628=>641,629=>600,630=>955,631=>674, -632=>600,633=>514,634=>514,635=>514,636=>474,637=>474,638=>406,639=>438,640=>721,641=>721, -642=>506,643=>298,644=>387,645=>486,646=>298,647=>443,648=>416,649=>654,650=>611,651=>624, -652=>523,653=>774,654=>571,655=>654,656=>511,657=>511,658=>511,659=>511,660=>482,661=>482, -662=>482,663=>490,664=>784,665=>625,666=>647,667=>563,668=>659,669=>345,670=>666,671=>581, -672=>629,673=>482,674=>482,675=>1005,676=>1061,677=>1005,678=>819,679=>643,680=>817,681=>935, -682=>711,683=>716,684=>596,685=>398,686=>552,687=>646,688=>469,689=>466,690=>282,691=>372, -692=>372,693=>432,694=>474,695=>488,696=>329,697=>271,699=>313,700=>313,701=>313,702=>330, -703=>330,704=>282,705=>282,711=>450,712=>254,713=>450,716=>254,720=>332,721=>332,722=>330, -723=>330,726=>353,728=>450,729=>450,730=>450,731=>450,733=>450,734=>375,736=>403,737=>263, -738=>355,739=>338,740=>282,741=>450,742=>450,743=>450,744=>450,745=>450,750=>498,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>701,881=>519,884=>271, -885=>271,890=>450,891=>548,892=>548,893=>548,894=>332,900=>450,901=>450,902=>698,903=>313, -904=>852,905=>1022,906=>595,908=>798,910=>857,911=>820,912=>435,913=>698,914=>760,915=>639, -916=>698,917=>686,918=>657,919=>850,920=>784,921=>421,922=>782,923=>698,924=>996,925=>822, -926=>633,927=>784,928=>850,929=>677,931=>636,932=>669,933=>642,934=>784,935=>698,936=>822, -937=>801,938=>421,939=>642,940=>692,941=>547,942=>654,943=>435,944=>624,945=>692,946=>598, -947=>594,948=>600,949=>547,950=>533,951=>654,952=>600,953=>435,954=>674,955=>631,956=>659, -957=>624,958=>533,959=>600,960=>659,961=>598,962=>548,963=>664,964=>605,965=>624,966=>814, -967=>592,968=>847,969=>857,970=>435,971=>624,972=>600,973=>624,974=>857,976=>600,977=>764, -978=>687,979=>872,980=>687,981=>847,982=>857,983=>589,984=>784,985=>600,986=>716,987=>548, -988=>639,989=>475,990=>531,991=>593,992=>716,993=>600,1008=>589,1009=>598,1010=>548,1011=>325, -1012=>784,1013=>548,1014=>548,1015=>681,1016=>629,1017=>716,1018=>996,1019=>774,1020=>623,1021=>716, -1022=>716,1023=>716,1024=>686,1025=>686,1026=>811,1027=>621,1028=>716,1029=>650,1030=>421,1031=>421, -1032=>426,1033=>1081,1034=>1135,1035=>866,1036=>818,1037=>850,1038=>730,1039=>850,1040=>733,1041=>769, -1042=>760,1043=>621,1044=>800,1045=>686,1046=>1181,1047=>649,1048=>850,1049=>850,1050=>818,1051=>795, -1052=>996,1053=>850,1054=>784,1055=>850,1056=>677,1057=>716,1058=>669,1059=>730,1060=>854,1061=>698, -1062=>870,1063=>822,1064=>1141,1065=>1164,1066=>861,1067=>1081,1068=>743,1069=>716,1070=>1158,1071=>793, -1072=>583,1073=>650,1074=>591,1075=>506,1076=>625,1077=>572,1078=>1175,1079=>574,1080=>654,1081=>654, -1082=>609,1083=>659,1084=>855,1085=>656,1086=>600,1087=>654,1088=>629,1089=>548,1090=>952,1091=>538, -1092=>812,1093=>536,1094=>723,1095=>643,1096=>952,1097=>1021,1098=>654,1099=>916,1100=>593,1101=>580, -1102=>901,1103=>716,1104=>572,1105=>572,1106=>646,1107=>506,1108=>548,1109=>506,1110=>342,1111=>342, -1112=>325,1113=>913,1114=>910,1115=>654,1116=>609,1117=>654,1118=>538,1119=>654,1122=>792,1123=>945, -1124=>1076,1125=>867,1130=>1181,1131=>909,1136=>986,1137=>995,1138=>784,1139=>587,1140=>824,1141=>673, -1164=>761,1165=>606,1168=>630,1169=>556,1170=>621,1171=>506,1172=>768,1173=>634,1174=>1181,1175=>1175, -1176=>649,1177=>574,1178=>812,1179=>633,1182=>818,1183=>609,1184=>937,1185=>684,1186=>856,1187=>725, -1188=>1050,1189=>859,1190=>1191,1191=>911,1194=>716,1195=>548,1196=>669,1197=>1028,1198=>642,1199=>515, -1200=>642,1201=>515,1202=>709,1203=>536,1204=>909,1205=>749,1206=>822,1207=>712,1210=>819,1211=>654, -1216=>421,1217=>1181,1218=>1175,1219=>782,1220=>624,1223=>850,1224=>659,1227=>885,1228=>659,1231=>342, -1232=>733,1233=>583,1234=>733,1235=>583,1236=>931,1237=>877,1238=>686,1239=>572,1240=>784,1241=>572, -1242=>784,1243=>572,1244=>1181,1245=>1175,1246=>649,1247=>574,1248=>591,1249=>511,1250=>850,1251=>654, -1252=>850,1253=>654,1254=>784,1255=>600,1256=>784,1257=>600,1258=>784,1259=>600,1260=>716,1261=>580, -1262=>730,1263=>538,1264=>730,1265=>538,1266=>730,1267=>538,1268=>822,1269=>643,1270=>621,1271=>506, -1272=>1081,1273=>916,1296=>649,1297=>574,1298=>795,1299=>659,1300=>1123,1301=>904,1306=>738,1307=>576, -1308=>925,1309=>770,4256=>688,4257=>851,4258=>788,4259=>795,4260=>712,4261=>979,4262=>921,4263=>1100, -4264=>587,4265=>745,4266=>955,4267=>954,4268=>725,4269=>1030,4270=>880,4271=>820,4272=>1007,4273=>721, -4274=>689,4275=>977,4276=>887,4277=>968,4278=>738,4279=>758,4280=>748,4281=>759,4282=>826,4283=>978, -4284=>701,4285=>748,4286=>740,4287=>1008,4288=>1019,4289=>730,4290=>812,4291=>730,4292=>801,4293=>965, -4304=>535,4305=>563,4306=>579,4307=>798,4308=>553,4309=>549,4310=>599,4311=>823,4312=>552,4313=>540, -4314=>1008,4315=>589,4316=>576,4317=>791,4318=>561,4319=>571,4320=>790,4321=>591,4322=>721,4323=>676, -4324=>782,4325=>575,4326=>820,4327=>559,4328=>583,4329=>576,4330=>656,4331=>577,4332=>575,4333=>566, -4334=>606,4335=>663,4336=>563,4337=>591,4338=>563,4339=>563,4340=>562,4341=>603,4342=>846,4343=>612, -4344=>572,4345=>605,4346=>562,4347=>401,4348=>327,7426=>846,7432=>458,7433=>288,7444=>890,7446=>600, -7447=>600,7453=>663,7454=>853,7455=>853,7468=>439,7469=>586,7470=>479,7472=>491,7473=>432,7474=>432, -7475=>483,7476=>536,7477=>265,7478=>268,7479=>492,7480=>398,7481=>627,7482=>518,7483=>518,7484=>493, -7486=>426,7487=>471,7488=>422,7489=>494,7490=>637,7491=>419,7492=>419,7493=>448,7494=>591,7495=>448, -7496=>448,7497=>400,7498=>400,7499=>370,7500=>370,7501=>448,7502=>270,7503=>471,7504=>655,7505=>426, -7506=>420,7507=>384,7508=>420,7509=>420,7510=>448,7511=>333,7512=>468,7513=>390,7514=>655,7515=>442, -7522=>215,7523=>372,7524=>468,7525=>442,7543=>576,7544=>536,7547=>342,7557=>342,7579=>448,7580=>384, -7581=>384,7582=>420,7583=>370,7584=>244,7585=>335,7586=>448,7587=>470,7588=>270,7589=>276,7590=>270, -7591=>270,7592=>333,7593=>331,7594=>289,7595=>387,7596=>613,7597=>655,7598=>529,7599=>528,7600=>425, -7601=>420,7602=>470,7603=>360,7604=>348,7605=>333,7606=>468,7607=>427,7609=>439,7610=>329,7611=>321, -7612=>474,7613=>371,7614=>407,7615=>420,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, -7680=>698,7681=>583,7682=>760,7683=>629,7684=>760,7685=>629,7686=>760,7687=>629,7688=>716,7689=>548, -7690=>780,7691=>629,7692=>780,7693=>629,7694=>780,7695=>629,7696=>780,7697=>629,7698=>780,7699=>629, -7700=>686,7701=>572,7702=>686,7703=>572,7704=>686,7705=>572,7706=>686,7707=>572,7708=>686,7709=>572, -7710=>639,7711=>387,7712=>769,7713=>629,7714=>850,7715=>654,7716=>850,7717=>654,7718=>850,7719=>654, -7720=>850,7721=>654,7722=>850,7723=>654,7724=>421,7725=>342,7728=>782,7729=>624,7730=>782,7731=>624, -7732=>782,7733=>624,7734=>633,7735=>342,7736=>633,7737=>342,7738=>633,7739=>342,7740=>633,7741=>342, -7742=>996,7743=>952,7744=>996,7745=>952,7746=>996,7747=>952,7748=>822,7749=>654,7750=>822,7751=>654, -7752=>822,7753=>654,7754=>822,7755=>654,7756=>784,7757=>600,7760=>784,7761=>600,7762=>784,7763=>600, -7764=>677,7765=>629,7766=>677,7767=>629,7768=>748,7769=>474,7770=>748,7771=>474,7772=>748,7773=>474, -7774=>748,7775=>474,7776=>650,7777=>506,7778=>650,7779=>506,7784=>650,7785=>506,7786=>669,7787=>416, -7788=>669,7789=>416,7790=>669,7791=>416,7792=>669,7793=>416,7794=>785,7795=>654,7796=>785,7797=>654, -7798=>785,7799=>654,7800=>785,7801=>654,7802=>785,7803=>654,7804=>698,7805=>523,7806=>698,7807=>523, -7808=>1011,7809=>774,7810=>1011,7811=>774,7812=>1011,7813=>774,7814=>1011,7815=>774,7816=>1011,7817=>774, -7818=>698,7819=>536,7820=>698,7821=>536,7822=>642,7823=>523,7824=>657,7825=>511,7826=>657,7827=>511, -7828=>657,7829=>511,7830=>654,7831=>416,7832=>774,7833=>523,7834=>913,7835=>387,7838=>852,7839=>600, -7840=>698,7841=>583,7842=>698,7843=>583,7852=>698,7853=>583,7854=>698,7855=>583,7856=>698,7857=>583, -7858=>698,7859=>583,7860=>698,7861=>583,7862=>698,7863=>583,7864=>686,7865=>572,7866=>686,7867=>572, -7868=>686,7869=>572,7878=>686,7879=>572,7880=>421,7881=>342,7882=>421,7883=>342,7884=>784,7885=>600, -7886=>784,7887=>600,7896=>784,7897=>600,7908=>785,7909=>654,7910=>785,7911=>654,7922=>642,7923=>523, -7924=>642,7925=>523,7926=>642,7927=>523,7928=>642,7929=>523,7936=>692,7937=>692,7938=>692,7939=>692, -7940=>692,7941=>692,7942=>692,7943=>692,7944=>698,7945=>698,7946=>880,7947=>880,7948=>748,7949=>764, -7950=>698,7951=>698,7952=>547,7953=>547,7954=>547,7955=>547,7956=>547,7957=>547,7960=>826,7961=>817, -7962=>1052,7963=>1052,7964=>984,7965=>1007,7968=>654,7969=>654,7970=>654,7971=>654,7972=>654,7973=>654, -7974=>654,7975=>654,7976=>990,7977=>984,7978=>1222,7979=>1225,7980=>1151,7981=>1177,7982=>1077,7983=>1074, -7984=>435,7985=>435,7986=>435,7987=>435,7988=>435,7989=>435,7990=>435,7991=>435,7992=>566,7993=>555, -7994=>790,7995=>792,7996=>719,7997=>748,7998=>650,7999=>642,8000=>600,8001=>600,8002=>600,8003=>600, -8004=>600,8005=>600,8008=>810,8009=>841,8010=>1116,8011=>1113,8012=>931,8013=>959,8016=>624,8017=>624, -8018=>624,8019=>624,8020=>624,8021=>624,8022=>624,8023=>624,8025=>830,8027=>1067,8029=>1020,8031=>917, -8032=>857,8033=>857,8034=>857,8035=>857,8036=>857,8037=>857,8038=>857,8039=>857,8040=>838,8041=>867, -8042=>1141,8043=>1146,8044=>949,8045=>979,8046=>920,8047=>954,8048=>692,8049=>692,8050=>547,8051=>547, -8052=>654,8053=>654,8054=>435,8055=>435,8056=>600,8057=>600,8058=>624,8059=>624,8060=>857,8061=>857, -8064=>692,8065=>692,8066=>692,8067=>692,8068=>692,8069=>692,8070=>692,8071=>692,8072=>698,8073=>698, -8074=>880,8075=>880,8076=>748,8077=>764,8078=>698,8079=>698,8080=>654,8081=>654,8082=>654,8083=>654, -8084=>654,8085=>654,8086=>654,8087=>654,8088=>990,8089=>984,8090=>1222,8091=>1225,8092=>1151,8093=>1177, -8094=>1077,8095=>1074,8096=>857,8097=>857,8098=>857,8099=>857,8100=>857,8101=>857,8102=>857,8103=>857, -8104=>838,8105=>867,8106=>1141,8107=>1146,8108=>949,8109=>979,8110=>920,8111=>954,8112=>692,8113=>692, -8114=>692,8115=>692,8116=>692,8118=>692,8119=>692,8120=>698,8121=>698,8122=>729,8123=>698,8124=>698, -8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>654,8131=>654,8132=>654,8134=>654,8135=>654, -8136=>899,8137=>852,8138=>1072,8139=>1006,8140=>850,8141=>450,8142=>450,8143=>450,8144=>435,8145=>435, -8146=>435,8147=>435,8150=>435,8151=>435,8152=>421,8153=>421,8154=>642,8155=>595,8157=>450,8158=>450, -8159=>450,8160=>624,8161=>624,8162=>624,8163=>624,8164=>598,8165=>598,8166=>624,8167=>624,8168=>642, -8169=>642,8170=>917,8171=>857,8172=>819,8173=>450,8174=>450,8175=>450,8178=>857,8179=>857,8180=>857, -8182=>857,8183=>857,8184=>962,8185=>798,8186=>991,8187=>820,8188=>801,8189=>450,8190=>450,8192=>450, -8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>626,8200=>313,8201=>180,8202=>89, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8213=>900,8214=>450, -8215=>450,8219=>313,8223=>518,8227=>575,8228=>313,8229=>606,8234=>0,8235=>0,8236=>0,8237=>0, -8238=>0,8239=>180,8241=>1631,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659, -8252=>566,8253=>527,8254=>450,8258=>920,8260=>150,8261=>426,8262=>426,8263=>974,8264=>770,8265=>770, -8267=>572,8268=>450,8269=>450,8270=>470,8271=>332,8273=>470,8274=>500,8275=>900,8279=>731,8287=>200, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, -8303=>0,8304=>394,8305=>215,8308=>394,8309=>394,8310=>394,8311=>394,8312=>394,8313=>394,8314=>475, -8315=>475,8316=>475,8317=>268,8318=>268,8319=>412,8320=>394,8321=>394,8322=>394,8323=>394,8324=>394, -8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475,8332=>475,8333=>268,8334=>268, -8336=>419,8337=>400,8338=>420,8339=>338,8340=>400,8358=>626,8367=>1039,8369=>710,8372=>788,8373=>626, -8451=>1078,8457=>1001,8462=>654,8463=>654,8470=>978,8486=>801,8487=>801,8490=>782,8491=>698,8513=>707, -8514=>518,8515=>573,8516=>684,8523=>813,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932, -8537=>932,8538=>932,8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>421,8545=>663,8546=>904, -8547=>984,8548=>698,8549=>1014,8550=>1256,8551=>1498,8552=>962,8553=>698,8554=>970,8555=>1212,8556=>633, -8557=>716,8558=>780,8559=>996,8560=>342,8561=>684,8562=>1025,8563=>865,8564=>523,8565=>865,8566=>1207, -8567=>1548,8568=>878,8569=>536,8570=>878,8571=>1220,8572=>342,8573=>548,8574=>629,8575=>952,8576=>1129, -8577=>780,8578=>1141,8579=>716,8580=>548,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754, -8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754, -8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754, -8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>765,8624=>754,8625=>754,8626=>754,8627=>754, -8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754, -8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754, -8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754, -8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754, -8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754, -8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754, -8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754, -8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>577,8706=>480,8707=>558,8708=>558, -8710=>677,8711=>677,8712=>666,8713=>666,8715=>666,8716=>666,8719=>757,8720=>757,8721=>677,8722=>754, -8723=>754,8724=>754,8725=>329,8727=>622,8728=>466,8729=>466,8730=>591,8731=>591,8732=>591,8733=>604, -8734=>750,8735=>754,8736=>754,8739=>292,8740=>546,8741=>476,8742=>696,8743=>730,8744=>730,8745=>754, -8746=>754,8747=>521,8748=>900,8749=>1252,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754, -8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>974,8789=>974,8800=>754, -8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754, -8845=>754,8846=>754,8847=>754,8848=>754,8849=>754,8850=>754,8851=>754,8852=>754,8853=>754,8854=>754, -8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754, -8865=>754,8866=>795,8867=>795,8868=>864,8869=>864,8870=>554,8871=>554,8872=>795,8873=>795,8874=>795, -8875=>971,8876=>795,8877=>795,8878=>795,8879=>971,8901=>358,8962=>751,8968=>426,8969=>426,8970=>426, -8971=>426,8976=>754,8977=>484,8984=>835,8985=>754,8992=>521,8993=>521,8997=>900,9000=>1299,9085=>907, -9134=>521,9167=>850,9251=>751,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692, -9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692, -9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692, -9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850, -9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495, -9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452, -9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452, -9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785, -9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474, -9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785, -9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850, -9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785, -9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659, -9727=>692,9728=>807,9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658, -9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807, -9828=>807,9829=>807,9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321, -9839=>435,10145=>754,10181=>411,10182=>411,10208=>444,10216=>411,10217=>411,10224=>754,10225=>754,10226=>754, -10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290, -10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703, -10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703, -10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703, -10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703, -10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703, -10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703, -10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703, -10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703, -10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703, -10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703, -10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703, -10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703, -10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703, -10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703, -10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703, -10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703, -10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703, -10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703, -10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703, -10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703, -10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703, -10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703, -10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703, -10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703, -10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703, -10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10496=>754, -10497=>754,10498=>754,10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754, -10507=>754,10508=>754,10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754, -10517=>754,10518=>754,10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754, -10527=>754,10528=>754,10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754, -10537=>754,10538=>754,10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754, -10547=>754,10548=>754,10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754, -10557=>754,10558=>754,10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754, -10567=>754,10568=>754,10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754, -10577=>754,10578=>754,10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754, -10587=>754,10588=>754,10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754, -10597=>754,10598=>754,10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754, -10607=>754,10608=>754,10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>929,10616=>754, -10617=>754,10618=>864,10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1604,10765=>549, -10766=>549,10799=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754, -11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754, -11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11364=>748, -11367=>850,11368=>654,11369=>782,11370=>624,11371=>657,11372=>511,11374=>996,11375=>698,11381=>701,11382=>519, -11383=>814,11385=>514,11386=>600,11388=>282,11389=>439,11520=>695,11521=>571,11522=>723,11523=>592,11524=>708, -11525=>866,11526=>680,11527=>864,11528=>555,11529=>581,11530=>866,11531=>567,11532=>581,11533=>866,11534=>761, -11535=>779,11536=>865,11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580, -11545=>584,11546=>619,11547=>842,11548=>883,11549=>613,11550=>608,11551=>766,11552=>1002,11553=>569,11554=>580, -11555=>582,11556=>674,11557=>822,11800=>527,11810=>426,11811=>426,11812=>426,11813=>426,11822=>527,42564=>650, -42565=>506,42566=>421,42567=>342,42576=>1200,42577=>976,42580=>1158,42581=>923,42582=>1158,42583=>926,42760=>450, -42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450, -42771=>450,42772=>450,42773=>450,42774=>450,42779=>346,42780=>346,42781=>249,42782=>249,42783=>249,42891=>395, -42892=>275,62464=>653,62465=>663,62466=>707,62467=>917,62468=>663,62469=>658,62470=>716,62471=>952,62472=>663, -62473=>663,62474=>1196,62475=>679,62476=>678,62477=>922,62478=>663,62479=>678,62480=>963,62481=>736,62482=>783, -62483=>737,62484=>914,62485=>677,62486=>907,62487=>677,62488=>684,62489=>678,62490=>720,62491=>678,62492=>684, -62493=>664,62494=>721,62495=>860,62496=>663,62497=>762,62498=>664,62499=>663,62500=>663,62501=>714,62502=>930, -62504=>813,63172=>506,63173=>600,63174=>629,63175=>654,63176=>952,63185=>450,63188=>450,64256=>744,64257=>654, -64258=>654,64259=>998,64260=>1031,64261=>791,64262=>874,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0, -65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0, -65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1002); -$enc=''; -$diff=''; -$file='dejavuserifcondensedbi.z'; -$ctg='dejavuserifcondensedbi.ctg.z'; -$originalsize=293472; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.z deleted file mode 100644 index 9b6be85d..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedbi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.ctg.z deleted file mode 100644 index aa732f80..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.php deleted file mode 100644 index 024d59d1..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.php +++ /dev/null @@ -1,312 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>-59,'Flags'=>96,'FontBBox'=>'[-755 -347 1485 1227]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>540); -$up=-63; -$ut=44; -$dw=540; -$cw=array( -0=>540,32=>286,33=>361,34=>414,35=>754,36=>572,37=>855,38=>801,39=>247,40=>351, -41=>351,42=>450,43=>754,44=>286,45=>304,46=>286,47=>303,48=>572,49=>572,50=>572, -51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754, -61=>754,62=>754,63=>482,64=>900,65=>650,66=>661,67=>688,68=>721,69=>657,70=>624, -71=>719,72=>785,73=>355,74=>360,75=>672,76=>598,77=>921,78=>787,79=>738,80=>605, -81=>738,82=>677,83=>616,84=>600,85=>758,86=>650,87=>925,88=>641,89=>594,90=>625, -91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>536,98=>576,99=>504,100=>576, -101=>532,102=>333,103=>576,104=>580,105=>288,106=>279,107=>545,108=>288,109=>853,110=>580, -111=>542,112=>576,113=>576,114=>430,115=>461,116=>361,117=>580,118=>508,119=>770,120=>507, -121=>508,122=>474,123=>572,124=>303,125=>572,126=>754,8364=>572,8218=>286,402=>333,8222=>466, -8230=>900,8224=>450,8225=>450,710=>450,8240=>1208,352=>616,8249=>360,338=>1023,381=>625,8216=>286, -8217=>286,8220=>460,8221=>460,8226=>531,8211=>450,8212=>900,732=>450,8482=>900,353=>461,8250=>360, -339=>890,382=>474,376=>594,160=>286,161=>361,162=>572,163=>572,164=>572,165=>572,166=>303, -167=>450,168=>450,169=>900,170=>427,171=>550,172=>754,173=>304,174=>900,175=>450,176=>450, -177=>754,178=>360,179=>360,180=>450,181=>584,182=>572,183=>286,184=>450,185=>360,186=>423, -187=>550,188=>872,189=>872,190=>872,191=>482,192=>650,193=>650,194=>650,195=>650,196=>650, -197=>650,198=>901,199=>688,200=>657,201=>657,202=>657,203=>657,204=>355,205=>355,206=>355, -207=>355,208=>726,209=>787,210=>738,211=>738,212=>738,213=>738,214=>738,215=>754,216=>738, -217=>758,218=>758,219=>758,220=>758,221=>594,222=>608,223=>601,224=>536,225=>536,226=>536, -227=>536,228=>536,229=>536,230=>846,231=>504,232=>532,233=>532,234=>532,235=>532,236=>288, -237=>288,238=>288,239=>288,240=>542,241=>580,242=>542,243=>542,244=>542,245=>542,246=>542, -247=>754,248=>542,249=>580,250=>580,251=>580,252=>580,253=>508,254=>576,255=>508,256=>650, -257=>536,258=>650,259=>536,260=>650,261=>536,262=>688,263=>504,264=>688,265=>504,266=>688, -267=>504,268=>688,269=>504,270=>721,271=>576,272=>726,273=>576,274=>657,275=>532,276=>657, -277=>532,278=>657,279=>532,280=>657,281=>532,282=>657,283=>532,284=>719,285=>576,286=>719, -287=>576,288=>719,289=>576,290=>719,291=>576,292=>785,293=>580,294=>785,295=>580,296=>355, -297=>288,298=>355,299=>288,300=>355,301=>288,302=>355,303=>288,304=>355,305=>288,306=>721, -307=>479,308=>360,309=>279,310=>672,311=>545,312=>545,313=>598,314=>288,315=>598,316=>288, -317=>598,318=>360,319=>604,320=>418,321=>602,322=>292,323=>787,324=>580,325=>787,326=>580, -327=>787,328=>580,329=>779,330=>758,331=>580,332=>738,333=>542,334=>738,335=>542,336=>738, -337=>542,340=>677,341=>430,342=>677,343=>430,344=>677,345=>430,346=>616,347=>461,348=>616, -349=>461,350=>616,351=>461,354=>600,355=>361,356=>600,357=>361,358=>600,359=>361,360=>758, -361=>580,362=>758,363=>580,364=>758,365=>580,366=>758,367=>580,368=>758,369=>580,370=>758, -371=>580,372=>925,373=>770,374=>594,375=>508,377=>625,378=>474,379=>625,380=>474,383=>333, -384=>576,385=>661,386=>661,387=>576,388=>661,389=>576,390=>688,391=>688,392=>504,393=>726, -394=>721,395=>661,396=>576,397=>542,398=>657,399=>738,400=>561,401=>624,403=>719,404=>641, -405=>839,406=>355,407=>355,408=>672,409=>545,410=>288,411=>570,412=>853,413=>787,414=>580, -415=>738,416=>738,417=>542,418=>936,419=>726,420=>605,421=>576,422=>677,423=>616,424=>461, -425=>636,426=>292,427=>361,428=>600,429=>361,430=>600,431=>758,432=>580,433=>746,434=>684, -435=>664,436=>670,437=>625,438=>474,439=>508,440=>508,441=>508,443=>572,444=>618,445=>508, -446=>482,448=>265,449=>443,450=>413,451=>265,452=>1347,453=>1195,454=>1050,455=>958,456=>876, -457=>567,458=>1148,459=>1066,460=>858,461=>650,462=>536,463=>355,464=>288,465=>738,466=>542, -467=>758,468=>580,469=>758,470=>580,471=>758,472=>580,473=>758,474=>580,475=>758,476=>580, -477=>532,478=>650,479=>536,480=>650,481=>536,482=>901,483=>846,484=>763,485=>576,486=>719, -487=>576,488=>672,489=>545,490=>738,491=>542,492=>738,493=>542,494=>508,495=>508,496=>288, -497=>1347,498=>1195,499=>1050,500=>719,501=>576,502=>1038,504=>787,505=>580,506=>650,507=>536, -508=>901,509=>846,510=>738,511=>542,512=>650,513=>536,514=>650,515=>536,516=>657,517=>532, -518=>657,519=>532,520=>355,521=>288,522=>355,523=>288,524=>738,525=>542,526=>738,527=>542, -528=>677,529=>430,530=>677,531=>430,532=>758,533=>580,534=>758,535=>580,536=>616,537=>461, -538=>600,539=>361,540=>564,541=>469,542=>785,543=>580,544=>758,545=>732,548=>625,549=>474, -550=>650,551=>536,552=>657,553=>532,554=>738,555=>542,556=>738,557=>542,558=>738,559=>542, -560=>738,561=>542,562=>594,563=>508,564=>450,565=>748,566=>444,567=>279,568=>864,569=>864, -570=>650,571=>688,572=>504,573=>598,574=>600,575=>461,576=>474,577=>525,578=>417,581=>650, -592=>536,593=>576,594=>607,595=>576,596=>504,597=>504,598=>582,599=>614,600=>532,601=>532, -602=>759,603=>483,604=>458,605=>695,606=>552,607=>283,608=>615,609=>576,610=>489,611=>641, -612=>507,613=>580,614=>580,615=>580,616=>288,617=>353,618=>288,619=>342,620=>409,621=>326, -622=>633,623=>853,624=>853,625=>853,626=>579,627=>624,628=>581,629=>542,630=>711,631=>583, -632=>542,633=>451,634=>451,635=>496,636=>430,637=>430,638=>407,639=>407,640=>534,641=>534, -642=>461,643=>244,644=>333,645=>438,646=>292,647=>361,648=>361,649=>580,650=>558,651=>547, -652=>508,653=>770,654=>508,655=>589,656=>537,657=>504,658=>508,659=>504,660=>482,661=>482, -662=>482,663=>461,664=>738,665=>506,666=>552,667=>588,668=>600,669=>329,670=>545,671=>581, -672=>615,673=>482,674=>482,675=>896,676=>930,677=>898,678=>728,679=>538,680=>704,681=>804, -682=>582,683=>608,684=>538,685=>398,686=>703,687=>690,688=>389,689=>387,690=>237,691=>312, -692=>312,693=>387,694=>352,695=>485,696=>320,697=>250,699=>286,700=>286,701=>286,702=>276, -703=>276,704=>252,705=>252,711=>450,712=>254,713=>450,716=>254,720=>303,721=>303,722=>276, -723=>276,726=>353,728=>450,729=>450,730=>450,731=>450,733=>450,734=>375,736=>403,737=>218, -738=>303,739=>319,740=>252,741=>444,742=>444,743=>444,744=>444,745=>444,750=>435,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>666,881=>478,884=>250, -885=>250,890=>450,891=>504,892=>504,893=>504,894=>303,900=>450,901=>450,902=>650,903=>286, -904=>810,905=>935,906=>505,908=>751,910=>808,911=>767,912=>353,913=>650,914=>661,915=>624, -916=>650,917=>657,918=>625,919=>785,920=>738,921=>355,922=>672,923=>650,924=>921,925=>787, -926=>633,927=>738,928=>785,929=>605,931=>636,932=>600,933=>594,934=>738,935=>641,936=>789, -937=>746,938=>355,939=>594,940=>607,941=>483,942=>539,943=>353,944=>547,945=>607,946=>520, -947=>538,948=>542,949=>483,950=>488,951=>539,952=>542,953=>353,954=>590,955=>570,956=>584, -957=>547,958=>496,959=>542,960=>591,961=>529,962=>504,963=>614,964=>498,965=>547,966=>630, -967=>545,968=>706,969=>734,970=>353,971=>547,972=>542,973=>547,974=>734,976=>524,977=>643, -978=>618,979=>787,980=>618,981=>613,982=>734,983=>561,984=>738,985=>542,986=>688,987=>504, -988=>624,989=>417,990=>531,991=>593,992=>704,993=>519,1008=>561,1009=>529,1010=>504,1011=>279, -1012=>738,1013=>504,1014=>504,1015=>608,1016=>576,1017=>688,1018=>921,1019=>637,1020=>529,1021=>688, -1022=>688,1023=>688,1024=>657,1025=>657,1026=>719,1027=>596,1028=>688,1029=>616,1030=>355,1031=>355, -1032=>360,1033=>976,1034=>1006,1035=>785,1036=>696,1037=>785,1038=>650,1039=>785,1040=>681,1041=>661, -1042=>661,1043=>596,1044=>731,1045=>657,1046=>1011,1047=>561,1048=>785,1049=>785,1050=>696,1051=>751, -1052=>921,1053=>785,1054=>738,1055=>785,1056=>605,1057=>688,1058=>600,1059=>650,1060=>747,1061=>641, -1062=>785,1063=>695,1064=>1027,1065=>1027,1066=>715,1067=>885,1068=>606,1069=>688,1070=>1074,1071=>727, -1072=>536,1073=>549,1074=>523,1075=>455,1076=>570,1077=>532,1078=>1023,1079=>491,1080=>580,1081=>580, -1082=>537,1083=>573,1084=>746,1085=>593,1086=>542,1087=>580,1088=>576,1089=>504,1090=>853,1091=>522, -1092=>704,1093=>507,1094=>628,1095=>560,1096=>853,1097=>901,1098=>600,1099=>733,1100=>490,1101=>504, -1102=>792,1103=>596,1104=>532,1105=>532,1106=>561,1107=>455,1108=>504,1109=>461,1110=>288,1111=>288, -1112=>279,1113=>773,1114=>790,1115=>580,1116=>537,1117=>580,1118=>522,1119=>580,1122=>686,1123=>794, -1124=>1016,1125=>750,1130=>1011,1131=>828,1136=>849,1137=>812,1138=>738,1139=>497,1140=>773,1141=>610, -1164=>636,1165=>490,1168=>604,1169=>476,1170=>596,1171=>455,1172=>657,1173=>552,1174=>1011,1175=>1023, -1176=>561,1177=>491,1178=>696,1179=>544,1182=>696,1183=>537,1184=>803,1185=>602,1186=>785,1187=>641, -1188=>1025,1189=>771,1190=>1085,1191=>848,1194=>688,1195=>504,1196=>600,1197=>911,1198=>594,1199=>514, -1200=>594,1201=>514,1202=>641,1203=>566,1204=>842,1205=>659,1206=>674,1207=>609,1210=>674,1211=>580, -1216=>355,1217=>1011,1218=>1023,1219=>672,1220=>545,1223=>785,1224=>600,1227=>674,1228=>600,1231=>288, -1232=>681,1233=>536,1234=>681,1235=>536,1236=>901,1237=>846,1238=>657,1239=>532,1240=>738,1241=>532, -1242=>738,1243=>532,1244=>1011,1245=>1023,1246=>561,1247=>491,1248=>508,1249=>508,1250=>785,1251=>580, -1252=>785,1253=>580,1254=>738,1255=>542,1256=>738,1257=>542,1258=>738,1259=>542,1260=>688,1261=>504, -1262=>650,1263=>522,1264=>650,1265=>522,1266=>650,1267=>522,1268=>695,1269=>560,1270=>596,1271=>455, -1272=>885,1273=>733,1296=>561,1297=>491,1298=>751,1299=>573,1300=>1079,1301=>845,1306=>738,1307=>576, -1308=>925,1309=>770,4256=>659,4257=>773,4258=>753,4259=>782,4260=>668,4261=>892,4262=>833,4263=>1000, -4264=>519,4265=>684,4266=>875,4267=>856,4268=>677,4269=>976,4270=>815,4271=>754,4272=>944,4273=>668, -4274=>611,4275=>922,4276=>852,4277=>926,4278=>667,4279=>668,4280=>668,4281=>668,4282=>800,4283=>852, -4284=>651,4285=>688,4286=>668,4287=>871,4288=>909,4289=>641,4290=>786,4291=>669,4292=>762,4293=>864, -4304=>495,4305=>523,4306=>539,4307=>759,4308=>514,4309=>510,4310=>558,4311=>783,4312=>512,4313=>500, -4314=>968,4315=>536,4316=>536,4317=>751,4318=>521,4319=>531,4320=>750,4321=>546,4322=>682,4323=>631, -4324=>742,4325=>535,4326=>781,4327=>520,4328=>543,4329=>536,4330=>616,4331=>537,4332=>501,4333=>527, -4334=>562,4335=>624,4336=>523,4337=>551,4338=>523,4339=>523,4340=>522,4341=>593,4342=>806,4343=>572, -4344=>532,4345=>565,4346=>522,4347=>410,4348=>335,7426=>846,7432=>458,7433=>288,7444=>890,7446=>542, -7447=>542,7453=>663,7454=>853,7455=>853,7468=>409,7469=>567,7470=>417,7472=>454,7473=>413,7474=>413, -7475=>453,7476=>494,7477=>224,7478=>227,7479=>423,7480=>376,7481=>580,7482=>496,7483=>496,7484=>464, -7486=>381,7487=>426,7488=>378,7489=>478,7490=>583,7491=>347,7492=>347,7493=>360,7494=>556,7495=>360, -7496=>360,7497=>348,7498=>348,7499=>385,7500=>306,7501=>360,7502=>157,7503=>328,7504=>552,7505=>359, -7506=>347,7507=>312,7508=>347,7509=>347,7510=>360,7511=>222,7512=>359,7513=>417,7514=>552,7515=>335, -7522=>181,7523=>312,7524=>359,7525=>335,7543=>576,7544=>494,7547=>334,7557=>288,7579=>439,7580=>317, -7581=>317,7582=>426,7583=>385,7584=>209,7585=>285,7586=>439,7587=>359,7588=>181,7589=>181,7590=>181, -7591=>181,7592=>286,7593=>237,7594=>236,7595=>409,7596=>552,7597=>552,7598=>445,7599=>443,7600=>438, -7601=>347,7602=>426,7603=>374,7604=>269,7605=>301,7606=>359,7607=>429,7609=>417,7610=>320,7611=>298, -7612=>376,7613=>376,7614=>406,7615=>426,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, -7680=>650,7681=>536,7682=>661,7683=>576,7684=>661,7685=>576,7686=>661,7687=>576,7688=>688,7689=>504, -7690=>721,7691=>576,7692=>721,7693=>576,7694=>721,7695=>576,7696=>721,7697=>576,7698=>721,7699=>576, -7700=>657,7701=>532,7702=>657,7703=>532,7704=>657,7705=>532,7706=>657,7707=>532,7708=>657,7709=>532, -7710=>624,7711=>333,7712=>719,7713=>576,7714=>785,7715=>580,7716=>785,7717=>580,7718=>785,7719=>580, -7720=>785,7721=>580,7722=>785,7723=>580,7724=>355,7725=>288,7728=>672,7729=>545,7730=>672,7731=>545, -7732=>672,7733=>545,7734=>598,7735=>288,7736=>598,7737=>288,7738=>598,7739=>288,7740=>598,7741=>288, -7742=>921,7743=>853,7744=>921,7745=>853,7746=>921,7747=>857,7748=>787,7749=>580,7750=>787,7751=>580, -7752=>787,7753=>580,7754=>787,7755=>580,7756=>738,7757=>542,7760=>738,7761=>542,7762=>738,7763=>542, -7764=>605,7765=>576,7766=>605,7767=>576,7768=>677,7769=>430,7770=>677,7771=>430,7772=>677,7773=>430, -7774=>677,7775=>430,7776=>616,7777=>461,7778=>616,7779=>461,7784=>616,7785=>461,7786=>600,7787=>361, -7788=>600,7789=>361,7790=>600,7791=>361,7792=>600,7793=>361,7794=>758,7795=>580,7796=>758,7797=>580, -7798=>758,7799=>580,7800=>758,7801=>580,7802=>758,7803=>580,7804=>650,7805=>508,7806=>650,7807=>508, -7808=>925,7809=>770,7810=>925,7811=>770,7812=>925,7813=>770,7814=>925,7815=>770,7816=>925,7817=>770, -7818=>641,7819=>507,7820=>641,7821=>507,7822=>594,7823=>508,7824=>625,7825=>474,7826=>625,7827=>474, -7828=>625,7829=>474,7830=>580,7831=>361,7832=>770,7833=>508,7834=>813,7835=>333,7838=>746,7839=>542, -7840=>650,7841=>536,7842=>650,7843=>536,7852=>650,7853=>536,7854=>650,7855=>536,7856=>650,7857=>536, -7858=>650,7859=>536,7860=>650,7861=>536,7862=>650,7863=>536,7864=>657,7865=>532,7866=>657,7867=>532, -7868=>657,7869=>532,7878=>657,7879=>532,7880=>355,7881=>288,7882=>355,7883=>288,7884=>738,7885=>542, -7886=>738,7887=>542,7896=>738,7897=>542,7908=>758,7909=>580,7910=>758,7911=>580,7922=>594,7923=>508, -7924=>594,7925=>508,7926=>594,7927=>508,7928=>594,7929=>508,7936=>607,7937=>607,7938=>607,7939=>607, -7940=>607,7941=>607,7942=>607,7943=>607,7944=>650,7945=>650,7946=>782,7947=>782,7948=>660,7949=>687, -7950=>650,7951=>650,7952=>483,7953=>483,7954=>483,7955=>483,7956=>483,7957=>483,7960=>768,7961=>757, -7962=>960,7963=>969,7964=>907,7965=>931,7968=>539,7969=>539,7970=>539,7971=>539,7972=>539,7973=>539, -7974=>539,7975=>539,7976=>898,7977=>893,7978=>1090,7979=>1101,7980=>1043,7981=>1064,7982=>988,7983=>985, -7984=>353,7985=>353,7986=>353,7987=>353,7988=>353,7989=>353,7990=>353,7991=>353,7992=>469,7993=>461, -7994=>661,7995=>664,7996=>611,7997=>635,7998=>561,7999=>553,8000=>542,8001=>542,8002=>542,8003=>542, -8004=>542,8005=>542,8008=>738,8009=>773,8010=>1008,8011=>1015,8012=>843,8013=>867,8016=>547,8017=>547, -8018=>547,8019=>547,8020=>547,8021=>547,8022=>547,8023=>547,8025=>765,8027=>971,8029=>939,8031=>857, -8032=>734,8033=>734,8034=>734,8035=>734,8036=>734,8037=>734,8038=>734,8039=>734,8040=>746,8041=>783, -8042=>1018,8043=>1023,8044=>852,8045=>878,8046=>844,8047=>873,8048=>607,8049=>607,8050=>483,8051=>483, -8052=>539,8053=>539,8054=>353,8055=>353,8056=>542,8057=>542,8058=>547,8059=>547,8060=>734,8061=>734, -8064=>607,8065=>607,8066=>607,8067=>607,8068=>607,8069=>607,8070=>607,8071=>607,8072=>650,8073=>650, -8074=>782,8075=>782,8076=>660,8077=>687,8078=>650,8079=>650,8080=>539,8081=>539,8082=>539,8083=>539, -8084=>539,8085=>539,8086=>539,8087=>539,8088=>898,8089=>893,8090=>1090,8091=>1101,8092=>1043,8093=>1064, -8094=>988,8095=>985,8096=>734,8097=>734,8098=>734,8099=>734,8100=>734,8101=>734,8102=>734,8103=>734, -8104=>746,8105=>783,8106=>1018,8107=>1023,8108=>852,8109=>878,8110=>844,8111=>873,8112=>607,8113=>607, -8114=>607,8115=>607,8116=>607,8118=>607,8119=>607,8120=>650,8121=>650,8122=>650,8123=>650,8124=>650, -8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>539,8131=>539,8132=>539,8134=>539,8135=>539, -8136=>820,8137=>810,8138=>956,8139=>935,8140=>785,8141=>450,8142=>450,8143=>450,8144=>353,8145=>353, -8146=>353,8147=>353,8150=>353,8151=>353,8152=>355,8153=>355,8154=>529,8155=>505,8157=>450,8158=>450, -8159=>450,8160=>547,8161=>547,8162=>547,8163=>547,8164=>529,8165=>529,8166=>547,8167=>547,8168=>594, -8169=>594,8170=>829,8171=>808,8172=>711,8173=>450,8174=>450,8175=>450,8178=>734,8179=>734,8180=>734, -8182=>734,8183=>734,8184=>865,8185=>751,8186=>886,8187=>767,8188=>746,8189=>450,8190=>450,8192=>450, -8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>304,8209=>304,8210=>572,8213=>900,8214=>450, -8215=>450,8219=>286,8223=>460,8227=>531,8228=>301,8229=>600,8234=>0,8235=>0,8236=>0,8237=>0, -8238=>0,8239=>180,8241=>1560,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305, -8252=>475,8253=>482,8254=>450,8258=>900,8260=>150,8261=>351,8262=>351,8263=>878,8264=>678,8265=>678, -8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8273=>450,8274=>404,8275=>900,8279=>597,8287=>200, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, -8303=>0,8304=>360,8305=>181,8308=>360,8309=>360,8310=>360,8311=>360,8312=>360,8313=>360,8314=>475, -8315=>475,8316=>475,8317=>221,8318=>221,8319=>365,8320=>360,8321=>360,8322=>360,8323=>360,8324=>360, -8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475,8332=>475,8333=>221,8334=>221, -8336=>347,8337=>348,8338=>347,8339=>319,8340=>348,8358=>594,8367=>951,8369=>635,8372=>702,8373=>572, -8451=>1006,8457=>942,8462=>580,8463=>580,8470=>852,8486=>746,8487=>746,8490=>672,8491=>650,8513=>697, -8514=>501,8515=>501,8516=>549,8523=>801,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872, -8537=>872,8538=>872,8539=>872,8540=>872,8541=>872,8542=>872,8543=>511,8544=>355,8545=>531,8546=>707, -8547=>870,8548=>650,8549=>883,8550=>1059,8551=>1234,8552=>838,8553=>641,8554=>839,8555=>1015,8556=>598, -8557=>688,8558=>721,8559=>921,8560=>288,8561=>576,8562=>863,8563=>796,8564=>508,8565=>796,8566=>1084, -8567=>1372,8568=>795,8569=>507,8570=>795,8571=>1083,8572=>288,8573=>504,8574=>576,8575=>853,8576=>1085, -8577=>721,8578=>1085,8579=>688,8580=>504,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754, -8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754, -8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754, -8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754, -8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754, -8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754, -8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754, -8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754, -8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754, -8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754, -8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754, -8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>543,8706=>465,8707=>488,8708=>488, -8710=>628,8711=>628,8712=>666,8713=>666,8715=>666,8716=>666,8719=>716,8720=>716,8721=>642,8722=>754, -8723=>754,8724=>754,8725=>303,8727=>611,8728=>441,8729=>441,8730=>573,8731=>573,8732=>573,8733=>609, -8734=>750,8735=>754,8736=>754,8739=>262,8740=>431,8741=>416,8742=>570,8743=>659,8744=>659,8745=>754, -8746=>754,8747=>469,8748=>766,8749=>1063,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754, -8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>930,8789=>930,8800=>754, -8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754, -8845=>754,8846=>754,8847=>761,8848=>761,8849=>761,8850=>761,8851=>754,8852=>754,8853=>754,8854=>754, -8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754, -8865=>754,8866=>773,8867=>773,8868=>846,8869=>846,8870=>510,8871=>510,8872=>773,8873=>773,8874=>773, -8875=>927,8876=>773,8877=>773,8878=>773,8879=>927,8901=>308,8962=>687,8968=>351,8969=>351,8970=>351, -8971=>351,8976=>754,8977=>461,8984=>900,8985=>754,8992=>469,8993=>469,8997=>900,9000=>1299,9085=>827, -9134=>469,9167=>850,9251=>687,9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542,9478=>542, -9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542,9488=>542, -9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542,9498=>542, -9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542,9508=>542, -9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542,9518=>542, -9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542,9528=>542, -9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542,9538=>542, -9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542,9548=>542, -9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542,9558=>542, -9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542,9568=>542, -9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542,9578=>542, -9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542,9588=>542, -9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542,9598=>542, -9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692, -9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692, -9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692, -9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850, -9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692, -9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692, -9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692, -9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785, -9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712, -9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692, -9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692, -9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785, -9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807, -9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807, -9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807, -9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,10145=>754, -10181=>351,10182=>351,10208=>444,10216=>351,10217=>351,10224=>754,10225=>754,10226=>754,10227=>754,10228=>930, -10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290, -10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659, -10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659, -10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659, -10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659, -10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659, -10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659, -10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659, -10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659, -10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659, -10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659, -10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659, -10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659, -10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659, -10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659, -10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659, -10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659, -10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659, -10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659, -10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659, -10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659, -10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659, -10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659, -10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659, -10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659, -10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659, -10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10496=>754,10497=>754,10498=>754, -10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754,10507=>754,10508=>754, -10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754,10517=>754,10518=>754, -10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754,10527=>754,10528=>754, -10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754,10537=>754,10538=>754, -10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754,10547=>754,10548=>754, -10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754,10557=>754,10558=>754, -10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754,10567=>754,10568=>754, -10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754,10577=>754,10578=>754, -10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754,10587=>754,10588=>754, -10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754,10597=>754,10598=>754, -10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754,10607=>754,10608=>754, -10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>883,10616=>754,10617=>754,10618=>886, -10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1361,10765=>469,10766=>469,10799=>754, -11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754, -11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850, -11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11364=>677,11367=>785,11368=>580, -11369=>672,11370=>545,11371=>625,11372=>474,11374=>921,11375=>650,11381=>666,11382=>478,11383=>630,11385=>451, -11386=>542,11388=>237,11389=>409,11520=>695,11521=>571,11522=>569,11523=>592,11524=>568,11525=>866,11526=>680, -11527=>864,11528=>555,11529=>581,11530=>866,11531=>568,11532=>581,11533=>866,11534=>580,11535=>779,11536=>865, -11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580,11545=>584,11546=>619, -11547=>571,11548=>883,11549=>613,11550=>608,11551=>766,11552=>861,11553=>569,11554=>580,11555=>582,11556=>674, -11557=>822,11800=>482,11810=>351,11811=>351,11812=>351,11813=>351,11822=>482,42564=>616,42565=>461,42566=>355, -42567=>353,42576=>994,42577=>845,42580=>1074,42581=>783,42582=>1025,42583=>787,42760=>444,42761=>444,42762=>444, -42763=>444,42764=>444,42765=>444,42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444, -42773=>444,42774=>444,42779=>332,42780=>332,42781=>228,42782=>228,42783=>228,42891=>361,42892=>247,62464=>598, -62465=>607,62466=>651,62467=>861,62468=>607,62469=>602,62470=>661,62471=>896,62472=>607,62473=>607,62474=>1141, -62475=>624,62476=>623,62477=>866,62478=>607,62479=>623,62480=>908,62481=>681,62482=>728,62483=>682,62484=>859, -62485=>622,62486=>852,62487=>621,62488=>628,62489=>623,62490=>665,62491=>623,62492=>628,62493=>608,62494=>665, -62495=>805,62496=>607,62497=>707,62498=>608,62499=>607,62500=>607,62501=>659,62502=>875,62504=>813,63172=>455, -63173=>542,63174=>576,63175=>580,63176=>853,63185=>450,63188=>450,64256=>637,64257=>600,64258=>600,64259=>847, -64260=>887,64261=>669,64262=>824,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0, -65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0, -65530=>0,65531=>0,65532=>0,65533=>923); -$enc=''; -$diff=''; -$file='dejavuserifcondensedi.z'; -$ctg='dejavuserifcondensedi.ctg.z'; -$originalsize=301244; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.z deleted file mode 100644 index eec24c66..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifcondensedi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.ctg.z deleted file mode 100644 index aa732f80..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.php b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.php deleted file mode 100644 index c1d452c1..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.php +++ /dev/null @@ -1,312 +0,0 @@ -928,'Descent'=>-236,'CapHeight'=>-65,'Flags'=>96,'FontBBox'=>'[-839 -347 1650 1227]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>600); -$up=-63; -$ut=44; -$dw=600; -$cw=array( -0=>600,32=>318,33=>402,34=>460,35=>838,36=>636,37=>950,38=>890,39=>275,40=>390, -41=>390,42=>500,43=>838,44=>318,45=>338,46=>318,47=>337,48=>636,49=>636,50=>636, -51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838, -61=>838,62=>838,63=>536,64=>1000,65=>722,66=>735,67=>765,68=>802,69=>730,70=>694, -71=>799,72=>872,73=>395,74=>401,75=>747,76=>664,77=>1024,78=>875,79=>820,80=>673, -81=>820,82=>753,83=>685,84=>667,85=>843,86=>722,87=>1028,88=>712,89=>660,90=>695, -91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>596,98=>640,99=>560,100=>640, -101=>592,102=>370,103=>640,104=>644,105=>320,106=>310,107=>606,108=>320,109=>948,110=>644, -111=>602,112=>640,113=>640,114=>478,115=>513,116=>402,117=>644,118=>565,119=>856,120=>564, -121=>565,122=>527,123=>636,124=>337,125=>636,126=>838,8364=>636,8218=>318,402=>370,8222=>518, -8230=>1000,8224=>500,8225=>500,710=>500,8240=>1342,352=>685,8249=>400,338=>1137,381=>695,8216=>318, -8217=>318,8220=>511,8221=>511,8226=>590,8211=>500,8212=>1000,732=>500,8482=>1000,353=>513,8250=>400, -339=>989,382=>527,376=>660,160=>318,161=>402,162=>636,163=>636,164=>636,165=>636,166=>337, -167=>500,168=>500,169=>1000,170=>475,171=>612,172=>838,173=>338,174=>1000,175=>500,176=>500, -177=>838,178=>401,179=>401,180=>500,181=>650,182=>636,183=>318,184=>500,185=>401,186=>470, -187=>612,188=>969,189=>969,190=>969,191=>536,192=>722,193=>722,194=>722,195=>722,196=>722, -197=>722,198=>1001,199=>765,200=>730,201=>730,202=>730,203=>730,204=>395,205=>395,206=>395, -207=>395,208=>807,209=>875,210=>820,211=>820,212=>820,213=>820,214=>820,215=>838,216=>820, -217=>843,218=>843,219=>843,220=>843,221=>660,222=>676,223=>668,224=>596,225=>596,226=>596, -227=>596,228=>596,229=>596,230=>940,231=>560,232=>592,233=>592,234=>592,235=>592,236=>320, -237=>320,238=>320,239=>320,240=>602,241=>644,242=>602,243=>602,244=>602,245=>602,246=>602, -247=>838,248=>602,249=>644,250=>644,251=>644,252=>644,253=>565,254=>640,255=>565,256=>722, -257=>596,258=>722,259=>596,260=>722,261=>596,262=>765,263=>560,264=>765,265=>560,266=>765, -267=>560,268=>765,269=>560,270=>802,271=>640,272=>807,273=>640,274=>730,275=>592,276=>730, -277=>592,278=>730,279=>592,280=>730,281=>592,282=>730,283=>592,284=>799,285=>640,286=>799, -287=>640,288=>799,289=>640,290=>799,291=>640,292=>872,293=>644,294=>872,295=>644,296=>395, -297=>320,298=>395,299=>320,300=>395,301=>320,302=>395,303=>320,304=>395,305=>320,306=>801, -307=>533,308=>401,309=>310,310=>747,311=>606,312=>606,313=>664,314=>320,315=>664,316=>320, -317=>664,318=>400,319=>671,320=>465,321=>669,322=>324,323=>875,324=>644,325=>875,326=>644, -327=>875,328=>644,329=>866,330=>843,331=>644,332=>820,333=>602,334=>820,335=>602,336=>820, -337=>602,340=>753,341=>478,342=>753,343=>478,344=>753,345=>478,346=>685,347=>513,348=>685, -349=>513,350=>685,351=>513,354=>667,355=>402,356=>667,357=>402,358=>667,359=>402,360=>843, -361=>644,362=>843,363=>644,364=>843,365=>644,366=>843,367=>644,368=>843,369=>644,370=>843, -371=>644,372=>1028,373=>856,374=>660,375=>565,377=>695,378=>527,379=>695,380=>527,383=>370, -384=>640,385=>735,386=>735,387=>640,388=>735,389=>640,390=>765,391=>765,392=>560,393=>807, -394=>802,395=>735,396=>640,397=>602,398=>730,399=>820,400=>623,401=>694,403=>799,404=>712, -405=>932,406=>395,407=>395,408=>747,409=>606,410=>320,411=>634,412=>948,413=>875,414=>644, -415=>820,416=>820,417=>602,418=>1040,419=>807,420=>673,421=>640,422=>753,423=>685,424=>513, -425=>707,426=>324,427=>402,428=>667,429=>402,430=>667,431=>843,432=>644,433=>829,434=>760, -435=>738,436=>745,437=>695,438=>527,439=>564,440=>564,441=>564,443=>636,444=>687,445=>564, -446=>536,448=>295,449=>492,450=>459,451=>295,452=>1497,453=>1329,454=>1167,455=>1065,456=>974, -457=>630,458=>1276,459=>1185,460=>954,461=>722,462=>596,463=>395,464=>320,465=>820,466=>602, -467=>843,468=>644,469=>843,470=>644,471=>843,472=>644,473=>843,474=>644,475=>843,476=>644, -477=>592,478=>722,479=>596,480=>722,481=>596,482=>1001,483=>940,484=>848,485=>640,486=>799, -487=>640,488=>747,489=>606,490=>820,491=>602,492=>820,493=>602,494=>564,495=>564,496=>320, -497=>1497,498=>1329,499=>1167,500=>799,501=>640,502=>1154,504=>875,505=>644,506=>722,507=>596, -508=>1001,509=>940,510=>820,511=>602,512=>722,513=>596,514=>722,515=>596,516=>730,517=>592, -518=>730,519=>592,520=>395,521=>320,522=>395,523=>320,524=>820,525=>602,526=>820,527=>602, -528=>753,529=>478,530=>753,531=>478,532=>843,533=>644,534=>843,535=>644,536=>685,537=>513, -538=>667,539=>402,540=>627,541=>521,542=>872,543=>644,544=>843,545=>814,548=>695,549=>527, -550=>722,551=>596,552=>730,553=>592,554=>820,555=>602,556=>820,557=>602,558=>820,559=>602, -560=>820,561=>602,562=>660,563=>565,564=>500,565=>832,566=>494,567=>310,568=>960,569=>960, -570=>722,571=>765,572=>560,573=>664,574=>667,575=>513,576=>527,577=>583,578=>464,581=>722, -592=>596,593=>640,594=>675,595=>640,596=>560,597=>560,598=>647,599=>683,600=>592,601=>592, -602=>843,603=>537,604=>509,605=>773,606=>613,607=>315,608=>683,609=>640,610=>544,611=>712, -612=>564,613=>644,614=>644,615=>644,616=>320,617=>392,618=>320,619=>380,620=>454,621=>363, -622=>704,623=>948,624=>948,625=>948,626=>644,627=>694,628=>646,629=>602,630=>790,631=>647, -632=>602,633=>501,634=>501,635=>551,636=>478,637=>478,638=>453,639=>453,640=>594,641=>594, -642=>513,643=>271,644=>370,645=>487,646=>324,647=>402,648=>402,649=>644,650=>620,651=>608, -652=>565,653=>856,654=>565,655=>655,656=>597,657=>560,658=>564,659=>560,660=>536,661=>536, -662=>536,663=>513,664=>820,665=>563,666=>613,667=>654,668=>667,669=>366,670=>606,671=>646, -672=>683,673=>536,674=>536,675=>996,676=>1033,677=>998,678=>809,679=>598,680=>782,681=>894, -682=>646,683=>676,684=>598,685=>443,686=>781,687=>767,688=>433,689=>430,690=>264,691=>347, -692=>347,693=>430,694=>392,695=>539,696=>355,697=>278,699=>318,700=>318,701=>318,702=>307, -703=>307,704=>280,705=>281,711=>500,712=>282,713=>500,716=>282,720=>337,721=>337,722=>307, -723=>307,726=>392,728=>500,729=>500,730=>500,731=>500,733=>500,734=>417,736=>448,737=>243, -738=>337,739=>355,740=>281,741=>493,742=>493,743=>493,744=>493,745=>493,750=>484,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>740,881=>531,884=>278, -885=>278,890=>500,891=>560,892=>560,893=>560,894=>337,900=>500,901=>500,902=>722,903=>318, -904=>900,905=>1039,906=>562,908=>835,910=>897,911=>853,912=>392,913=>722,914=>735,915=>694, -916=>722,917=>730,918=>695,919=>872,920=>820,921=>395,922=>747,923=>722,924=>1024,925=>875, -926=>704,927=>820,928=>872,929=>673,931=>707,932=>667,933=>660,934=>820,935=>712,936=>877, -937=>829,938=>395,939=>660,940=>675,941=>537,942=>599,943=>392,944=>608,945=>675,946=>578, -947=>598,948=>602,949=>537,950=>542,951=>599,952=>602,953=>392,954=>656,955=>634,956=>650, -957=>608,958=>551,959=>602,960=>657,961=>588,962=>560,963=>683,964=>553,965=>608,966=>700, -967=>606,968=>784,969=>815,970=>392,971=>608,972=>602,973=>608,974=>815,976=>583,977=>715, -978=>687,979=>874,980=>687,981=>682,982=>815,983=>624,984=>820,985=>602,986=>765,987=>560, -988=>694,989=>463,990=>590,991=>660,992=>782,993=>577,1008=>624,1009=>588,1010=>560,1011=>310, -1012=>820,1013=>560,1014=>560,1015=>676,1016=>640,1017=>765,1018=>1024,1019=>708,1020=>588,1021=>765, -1022=>765,1023=>765,1024=>730,1025=>730,1026=>799,1027=>662,1028=>765,1029=>685,1030=>395,1031=>395, -1032=>401,1033=>1084,1034=>1118,1035=>872,1036=>774,1037=>872,1038=>723,1039=>872,1040=>757,1041=>735, -1042=>735,1043=>662,1044=>813,1045=>730,1046=>1124,1047=>623,1048=>872,1049=>872,1050=>774,1051=>834, -1052=>1024,1053=>872,1054=>820,1055=>872,1056=>673,1057=>765,1058=>667,1059=>723,1060=>830,1061=>712, -1062=>872,1063=>773,1064=>1141,1065=>1141,1066=>794,1067=>984,1068=>674,1069=>765,1070=>1193,1071=>808, -1072=>596,1073=>610,1074=>582,1075=>505,1076=>634,1077=>592,1078=>1137,1079=>545,1080=>644,1081=>644, -1082=>597,1083=>637,1084=>829,1085=>659,1086=>602,1087=>644,1088=>640,1089=>560,1090=>948,1091=>580, -1092=>783,1093=>564,1094=>698,1095=>622,1096=>947,1097=>1001,1098=>667,1099=>814,1100=>544,1101=>560, -1102=>880,1103=>662,1104=>592,1105=>592,1106=>624,1107=>505,1108=>560,1109=>513,1110=>320,1111=>320, -1112=>310,1113=>859,1114=>878,1115=>644,1116=>597,1117=>644,1118=>580,1119=>644,1122=>762,1123=>882, -1124=>1129,1125=>834,1130=>1124,1131=>920,1136=>944,1137=>902,1138=>820,1139=>552,1140=>859,1141=>678, -1164=>707,1165=>544,1168=>672,1169=>529,1170=>662,1171=>505,1172=>730,1173=>614,1174=>1124,1175=>1137, -1176=>623,1177=>545,1178=>774,1179=>604,1182=>774,1183=>597,1184=>892,1185=>669,1186=>872,1187=>712, -1188=>1139,1189=>857,1190=>1206,1191=>943,1194=>765,1195=>560,1196=>667,1197=>1013,1198=>660,1199=>571, -1200=>660,1201=>571,1202=>712,1203=>629,1204=>936,1205=>732,1206=>749,1207=>677,1210=>749,1211=>644, -1216=>395,1217=>1124,1218=>1137,1219=>747,1220=>606,1223=>872,1224=>667,1227=>749,1228=>667,1231=>320, -1232=>757,1233=>596,1234=>757,1235=>596,1236=>1001,1237=>940,1238=>730,1239=>592,1240=>820,1241=>592, -1242=>820,1243=>592,1244=>1124,1245=>1137,1246=>623,1247=>545,1248=>564,1249=>564,1250=>872,1251=>644, -1252=>872,1253=>644,1254=>820,1255=>602,1256=>820,1257=>602,1258=>820,1259=>602,1260=>765,1261=>560, -1262=>723,1263=>580,1264=>723,1265=>580,1266=>723,1267=>580,1268=>773,1269=>622,1270=>662,1271=>505, -1272=>984,1273=>814,1296=>623,1297=>545,1298=>834,1299=>637,1300=>1199,1301=>939,1306=>820,1307=>640, -1308=>1028,1309=>856,4256=>732,4257=>860,4258=>837,4259=>869,4260=>743,4261=>991,4262=>925,4263=>1111, -4264=>576,4265=>760,4266=>972,4267=>951,4268=>753,4269=>1084,4270=>906,4271=>838,4272=>1049,4273=>743, -4274=>679,4275=>1025,4276=>946,4277=>1029,4278=>741,4279=>743,4280=>742,4281=>743,4282=>889,4283=>946, -4284=>724,4285=>765,4286=>743,4287=>968,4288=>1010,4289=>712,4290=>874,4291=>744,4292=>847,4293=>960, -4304=>550,4305=>581,4306=>599,4307=>843,4308=>571,4309=>567,4310=>620,4311=>871,4312=>569,4313=>556, -4314=>1076,4315=>596,4316=>596,4317=>835,4318=>580,4319=>590,4320=>833,4321=>607,4322=>758,4323=>701, -4324=>825,4325=>595,4326=>868,4327=>578,4328=>604,4329=>596,4330=>685,4331=>597,4332=>557,4333=>585, -4334=>625,4335=>693,4336=>582,4337=>613,4338=>581,4339=>582,4340=>580,4341=>659,4342=>896,4343=>636, -4344=>592,4345=>628,4346=>581,4347=>456,4348=>373,7426=>940,7432=>509,7433=>320,7444=>989,7446=>602, -7447=>602,7453=>737,7454=>948,7455=>948,7468=>455,7469=>630,7470=>463,7472=>505,7473=>459,7474=>459, -7475=>503,7476=>549,7477=>249,7478=>252,7479=>470,7480=>418,7481=>645,7482=>551,7483=>551,7484=>516, -7486=>424,7487=>474,7488=>420,7489=>531,7490=>647,7491=>386,7492=>386,7493=>400,7494=>618,7495=>400, -7496=>400,7497=>387,7498=>387,7499=>428,7500=>340,7501=>400,7502=>175,7503=>365,7504=>613,7505=>399, -7506=>385,7507=>346,7508=>385,7509=>385,7510=>400,7511=>247,7512=>399,7513=>464,7514=>613,7515=>373, -7522=>201,7523=>347,7524=>399,7525=>373,7543=>640,7544=>549,7547=>372,7557=>320,7579=>488,7580=>353, -7581=>353,7582=>473,7583=>428,7584=>233,7585=>316,7586=>488,7587=>399,7588=>201,7589=>201,7590=>201, -7591=>201,7592=>318,7593=>263,7594=>263,7595=>455,7596=>613,7597=>613,7598=>495,7599=>492,7600=>487, -7601=>385,7602=>473,7603=>416,7604=>299,7605=>334,7606=>399,7607=>477,7609=>464,7610=>355,7611=>332, -7612=>418,7613=>418,7614=>452,7615=>473,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, -7680=>722,7681=>596,7682=>735,7683=>640,7684=>735,7685=>640,7686=>735,7687=>640,7688=>765,7689=>560, -7690=>802,7691=>640,7692=>802,7693=>640,7694=>802,7695=>640,7696=>802,7697=>640,7698=>802,7699=>640, -7700=>730,7701=>592,7702=>730,7703=>592,7704=>730,7705=>592,7706=>730,7707=>592,7708=>730,7709=>592, -7710=>694,7711=>370,7712=>799,7713=>640,7714=>872,7715=>644,7716=>872,7717=>644,7718=>872,7719=>644, -7720=>872,7721=>644,7722=>872,7723=>644,7724=>395,7725=>320,7728=>747,7729=>606,7730=>747,7731=>606, -7732=>747,7733=>606,7734=>664,7735=>320,7736=>664,7737=>320,7738=>664,7739=>320,7740=>664,7741=>320, -7742=>1024,7743=>948,7744=>1024,7745=>948,7746=>1024,7747=>953,7748=>875,7749=>644,7750=>875,7751=>644, -7752=>875,7753=>644,7754=>875,7755=>644,7756=>820,7757=>602,7760=>820,7761=>602,7762=>820,7763=>602, -7764=>673,7765=>640,7766=>673,7767=>640,7768=>753,7769=>478,7770=>753,7771=>478,7772=>753,7773=>478, -7774=>753,7775=>478,7776=>685,7777=>513,7778=>685,7779=>513,7784=>685,7785=>513,7786=>667,7787=>402, -7788=>667,7789=>402,7790=>667,7791=>402,7792=>667,7793=>402,7794=>843,7795=>644,7796=>843,7797=>644, -7798=>843,7799=>644,7800=>843,7801=>644,7802=>843,7803=>644,7804=>722,7805=>565,7806=>722,7807=>565, -7808=>1028,7809=>856,7810=>1028,7811=>856,7812=>1028,7813=>856,7814=>1028,7815=>856,7816=>1028,7817=>856, -7818=>712,7819=>564,7820=>712,7821=>564,7822=>660,7823=>565,7824=>695,7825=>527,7826=>695,7827=>527, -7828=>695,7829=>527,7830=>644,7831=>402,7832=>856,7833=>565,7834=>903,7835=>370,7838=>829,7839=>602, -7840=>722,7841=>596,7842=>722,7843=>596,7852=>722,7853=>596,7854=>722,7855=>596,7856=>722,7857=>596, -7858=>722,7859=>596,7860=>722,7861=>596,7862=>722,7863=>596,7864=>730,7865=>592,7866=>730,7867=>592, -7868=>730,7869=>592,7878=>730,7879=>592,7880=>395,7881=>320,7882=>395,7883=>320,7884=>820,7885=>602, -7886=>820,7887=>602,7896=>820,7897=>602,7908=>843,7909=>644,7910=>843,7911=>644,7922=>660,7923=>565, -7924=>660,7925=>565,7926=>660,7927=>565,7928=>660,7929=>565,7936=>675,7937=>675,7938=>675,7939=>675, -7940=>675,7941=>675,7942=>675,7943=>675,7944=>722,7945=>722,7946=>869,7947=>869,7948=>734,7949=>763, -7950=>722,7951=>722,7952=>537,7953=>537,7954=>537,7955=>537,7956=>537,7957=>537,7960=>853,7961=>841, -7962=>1067,7963=>1077,7964=>1008,7965=>1035,7968=>599,7969=>599,7970=>599,7971=>599,7972=>599,7973=>599, -7974=>599,7975=>599,7976=>998,7977=>992,7978=>1212,7979=>1224,7980=>1159,7981=>1183,7982=>1098,7983=>1095, -7984=>392,7985=>392,7986=>392,7987=>392,7988=>392,7989=>392,7990=>392,7991=>392,7992=>521,7993=>512, -7994=>735,7995=>738,7996=>679,7997=>706,7998=>624,7999=>615,8000=>602,8001=>602,8002=>602,8003=>602, -8004=>602,8005=>602,8008=>820,8009=>859,8010=>1120,8011=>1127,8012=>937,8013=>964,8016=>608,8017=>608, -8018=>608,8019=>608,8020=>608,8021=>608,8022=>608,8023=>608,8025=>851,8027=>1079,8029=>1044,8031=>953, -8032=>815,8033=>815,8034=>815,8035=>815,8036=>815,8037=>815,8038=>815,8039=>815,8040=>829,8041=>870, -8042=>1131,8043=>1137,8044=>946,8045=>976,8046=>938,8047=>970,8048=>675,8049=>675,8050=>537,8051=>537, -8052=>599,8053=>599,8054=>392,8055=>392,8056=>602,8057=>602,8058=>608,8059=>608,8060=>815,8061=>815, -8064=>675,8065=>675,8066=>675,8067=>675,8068=>675,8069=>675,8070=>675,8071=>675,8072=>722,8073=>722, -8074=>869,8075=>869,8076=>734,8077=>763,8078=>722,8079=>722,8080=>599,8081=>599,8082=>599,8083=>599, -8084=>599,8085=>599,8086=>599,8087=>599,8088=>998,8089=>992,8090=>1212,8091=>1224,8092=>1159,8093=>1183, -8094=>1098,8095=>1095,8096=>815,8097=>815,8098=>815,8099=>815,8100=>815,8101=>815,8102=>815,8103=>815, -8104=>829,8105=>870,8106=>1131,8107=>1137,8108=>946,8109=>976,8110=>938,8111=>970,8112=>675,8113=>675, -8114=>675,8115=>675,8116=>675,8118=>675,8119=>675,8120=>722,8121=>722,8122=>722,8123=>722,8124=>722, -8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>599,8131=>599,8132=>599,8134=>599,8135=>599, -8136=>912,8137=>900,8138=>1063,8139=>1039,8140=>872,8141=>500,8142=>500,8143=>500,8144=>392,8145=>392, -8146=>392,8147=>392,8150=>392,8151=>392,8152=>395,8153=>395,8154=>588,8155=>562,8157=>500,8158=>500, -8159=>500,8160=>608,8161=>608,8162=>608,8163=>608,8164=>588,8165=>588,8166=>608,8167=>608,8168=>660, -8169=>660,8170=>921,8171=>897,8172=>790,8173=>500,8174=>500,8175=>500,8178=>815,8179=>815,8180=>815, -8182=>815,8183=>815,8184=>961,8185=>835,8186=>984,8187=>853,8188=>829,8189=>500,8190=>500,8192=>500, -8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>338,8209=>338,8210=>636,8213=>1000,8214=>500, -8215=>500,8219=>318,8223=>511,8227=>590,8228=>334,8229=>667,8234=>0,8235=>0,8236=>0,8237=>0, -8238=>0,8239=>200,8241=>1734,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339, -8252=>527,8253=>536,8254=>500,8258=>1000,8260=>167,8261=>390,8262=>390,8263=>976,8264=>753,8265=>753, -8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8273=>500,8274=>450,8275=>1000,8279=>663,8287=>222, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, -8303=>0,8304=>401,8305=>201,8308=>401,8309=>401,8310=>401,8311=>401,8312=>401,8313=>401,8314=>528, -8315=>528,8316=>528,8317=>246,8318=>246,8319=>405,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401, -8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528,8332=>528,8333=>246,8334=>246, -8336=>386,8337=>387,8338=>385,8339=>355,8340=>387,8358=>660,8367=>1057,8369=>706,8372=>780,8373=>636, -8451=>1119,8457=>1047,8462=>644,8463=>644,8470=>946,8486=>829,8487=>829,8490=>747,8491=>722,8513=>775, -8514=>557,8515=>557,8516=>611,8523=>890,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969, -8537=>969,8538=>969,8539=>969,8540=>969,8541=>969,8542=>969,8543=>568,8544=>395,8545=>590,8546=>786, -8547=>966,8548=>722,8549=>981,8550=>1176,8551=>1372,8552=>932,8553=>712,8554=>932,8555=>1127,8556=>664, -8557=>765,8558=>802,8559=>1024,8560=>320,8561=>640,8562=>959,8563=>885,8564=>565,8565=>885,8566=>1205, -8567=>1524,8568=>884,8569=>564,8570=>884,8571=>1204,8572=>320,8573=>560,8574=>640,8575=>948,8576=>1206, -8577=>802,8578=>1206,8579=>765,8580=>560,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838, -8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838, -8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838, -8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838, -8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838, -8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838, -8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838, -8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838, -8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838, -8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838, -8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838, -8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>604,8706=>517,8707=>542,8708=>542, -8710=>698,8711=>698,8712=>740,8713=>740,8715=>740,8716=>740,8719=>796,8720=>796,8721=>714,8722=>838, -8723=>838,8724=>838,8725=>337,8727=>680,8728=>490,8729=>490,8730=>637,8731=>637,8732=>637,8733=>677, -8734=>833,8735=>838,8736=>838,8739=>291,8740=>479,8741=>462,8742=>634,8743=>732,8744=>732,8745=>838, -8746=>838,8747=>521,8748=>852,8749=>1182,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838, -8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1033,8789=>1033,8800=>838, -8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838, -8845=>838,8846=>838,8847=>846,8848=>846,8849=>846,8850=>846,8851=>838,8852=>838,8853=>838,8854=>838, -8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838, -8865=>838,8866=>860,8867=>860,8868=>940,8869=>940,8870=>567,8871=>567,8872=>860,8873=>860,8874=>860, -8875=>1031,8876=>860,8877=>860,8878=>860,8879=>1031,8901=>342,8962=>764,8968=>390,8969=>390,8970=>390, -8971=>390,8976=>838,8977=>513,8984=>1000,8985=>838,8992=>521,8993=>521,8997=>1000,9000=>1443,9085=>919, -9134=>521,9167=>945,9251=>764,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602, -9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602, -9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602, -9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602, -9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602, -9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602, -9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602, -9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602, -9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602, -9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602, -9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602, -9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602, -9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602, -9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769, -9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769, -9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769, -9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945, -9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769, -9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769, -9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769, -9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873, -9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791, -9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769, -9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769, -9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873, -9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896, -9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896, -9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896, -9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,10145=>838, -10181=>390,10182=>390,10208=>494,10216=>390,10217=>390,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1033, -10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434, -10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732, -10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732, -10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732, -10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732, -10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732, -10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732, -10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732, -10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732, -10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732, -10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732, -10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732, -10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732, -10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732, -10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732, -10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732, -10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732, -10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732, -10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732, -10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732, -10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732, -10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732, -10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732, -10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732, -10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732, -10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732, -10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10496=>838,10497=>838,10498=>838, -10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838,10507=>838,10508=>838, -10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838,10517=>838,10518=>838, -10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838,10527=>838,10528=>838, -10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838,10537=>838,10538=>838, -10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838,10547=>838,10548=>838, -10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838,10557=>838,10558=>838, -10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838,10567=>838,10568=>838, -10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838,10577=>838,10578=>838, -10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838,10587=>838,10588=>838, -10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838,10597=>838,10598=>838, -10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838,10607=>838,10608=>838, -10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>981,10616=>838,10617=>838,10618=>984, -10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1513,10765=>521,10766=>521,10799=>838, -11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838, -11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945, -11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11364=>753,11367=>872,11368=>644, -11369=>747,11370=>606,11371=>695,11372=>527,11374=>1024,11375=>722,11381=>740,11382=>531,11383=>700,11385=>501, -11386=>602,11388=>264,11389=>455,11520=>773,11521=>635,11522=>633,11523=>658,11524=>631,11525=>962,11526=>756, -11527=>960,11528=>617,11529=>646,11530=>962,11531=>632,11532=>646,11533=>962,11534=>645,11535=>866,11536=>961, -11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645,11545=>649,11546=>688, -11547=>634,11548=>982,11549=>681,11550=>676,11551=>852,11552=>957,11553=>632,11554=>645,11555=>646,11556=>749, -11557=>914,11800=>536,11810=>390,11811=>390,11812=>390,11813=>390,11822=>536,42564=>685,42565=>513,42566=>395, -42567=>392,42576=>1104,42577=>939,42580=>1193,42581=>871,42582=>1140,42583=>875,42760=>493,42761=>493,42762=>493, -42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493, -42773=>493,42774=>493,42779=>369,42780=>369,42781=>253,42782=>253,42783=>253,42891=>402,42892=>275,62464=>664, -62465=>675,62466=>724,62467=>958,62468=>675,62469=>669,62470=>735,62471=>997,62472=>675,62473=>675,62474=>1268, -62475=>693,62476=>692,62477=>963,62478=>675,62479=>692,62480=>1009,62481=>756,62482=>809,62483=>758,62484=>955, -62485=>691,62486=>946,62487=>690,62488=>698,62489=>692,62490=>739,62491=>692,62492=>698,62493=>676,62494=>739, -62495=>895,62496=>675,62497=>785,62498=>676,62499=>675,62500=>675,62501=>732,62502=>972,62504=>904,63172=>505, -63173=>602,63174=>640,63175=>644,63176=>947,63185=>500,63188=>500,64256=>708,64257=>667,64258=>667,64259=>941, -64260=>986,64261=>744,64262=>916,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0, -65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0, -65530=>0,65531=>0,65532=>0,65533=>1025); -$enc=''; -$diff=''; -$file='dejavuserifi.z'; -$ctg='dejavuserifi.ctg.z'; -$originalsize=301828; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.z b/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.z deleted file mode 100644 index 3b751b08..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/dejavuserifi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/AUTHORS b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/AUTHORS deleted file mode 100644 index 23543fde..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/AUTHORS +++ /dev/null @@ -1,188 +0,0 @@ --*- mode:text; coding:utf-8; -*- -$Id: AUTHORS,v 1.14 2008/03/16 20:18:53 Stevan_White Exp $ - -The free UCS scalable font collection is being maintained by - Steve White -The folowing list cites the other contributors that contributed to -particular ISO 10646 blocks. - -* URW++ Design & Development GmbH - - Basic Latin (U+0041-U+007A) - Latin-1 Supplement (U+00C0-U+00FF) (most) - Latin Extended-A (U+0100-U+017F) - Spacing Modifier Letters (U+02B0-U+02FF) - Mathematical Operators (U+2200-U+22FF) (parts) - Block Elements (U+2580-U+259F) - Dingbats (U+2700-U+27BF) - -* Yannis Haralambous and John - Plaice - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - Greek (U+0370-U+03FF) - Armenian (U+0530-U+058F) - Hebrew (U+0590-U+05FF) - Arabic (U+0600-U+06FF) - Currency Symbols (U+20A0-U+20CF) - Arabic Presentation Forms-A (U+FB50-U+FDFF) - Arabic Presentation Forms-B (U+FE70-U+FEFF) - -* Young U. Ryu - - Arrows (U+2190-U+21FF) - Mathematical Symbols (U+2200-U+22FF) - -* Valek Filippov - - Cyrillic (U+0400-U+04FF) - -* Wadalab Kanji Comittee - - Hiragana (U+3040-U+309F) - Katakana (U+30A0-U+30FF) - -* Angelo Haritsis - - Greek (U+0370-U+03FF) - -* Yannis Haralambous and Virach Sornlertlamvanich - - Thai (U+0E00-U+0E7F) - -* Shaheed R. Haque - - Bengali (U+0980-U+09FF) - -* Sam Stepanyan - - Armenian (U+0530-U+058F) - -* Mohamed Ishan - - Thaana (U+0780-U+07BF) - -* Sushant Kumar Dash - - Oriya (U+0B00-U+0B7F) - -* Harsh Kumar - - Devanagari (U+0900-U+097F) - Bengali (U+0980-U+09FF) - Gurmukhi (U+0A00-U+0A7F) - Gujarati (U+0A80-U+0AFF) - -* Prasad A. Chodavarapu - - Telugu (U+0C00-U+0C7F) - -* Frans Velthuis and Anshuman Pandey - - - Devanagari (U+0900-U+097F) - -* Hardip Singh Pannu - - Gurmukhi (U+0A00-U+0A7F) - -* Jeroen Hellingman - - Oriya (U+0B00-U+0B7F) - Malayalam (U+0D00-U+0D7F) - -* Thomas Ridgeway - - Tamil (U+0B80-U+0BFF) - -* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, - Prof. Dr. Manfred Kudlek , Olaf - Kummer , and Jochen Metzinger - - Ethiopic (U+1200-U+137F) - -* Maxim Iorsh - - Hebrew (U+0590-U+05FF) - -* Vyacheslav Dikonov - - Syriac (U+0700-U+074A) - Braille (U+2800-U+28FF) - -* Panayotis Katsaloulis - - Greek Extended (U+1F00-U+1FFF) - -* M.S. Sridhar - - Devanagari (U+0900-U+097F) - Bengali (U+0980-U+09FF) - Gurmukhi (U+0A00-U+0A7F) - Gujarati (U+0A80-U+0AFF) - Oriya (U+0B00-U+0B7F) - Tamil (U+0B80-U+0BFF) - Telugu (U+0C00-U+0C7F) - Kannada (U+0C80-U+0CFF) - Malayalam (U+0D00-U+0D7F) - -* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt - - - Sinhala (U+0D80-U+0DFF) - -* Dan Shurovich Chirkov - - Cyrillic (U+0400-U+04FF) - -* Abbas Izad - - Arabic (U+0600-U+06FF) - Arabic Presentation Forms-A (U+FB50-U+FDFF) - Arabic Presentation Forms-B (U+FE70-U+FEFF) - -* Denis Jacquerye - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - -* K.H. Hussain and R. Chitrajan - - Malayalam (U+0D00-U+0D7F) - -* Solaiman Karim and Omi Azad - - Bengali (U+0980-U+09FF) - -* Sonali Sonania and Monika Shah - - - Devanagari (U+0900-U+097F) - Gujarati (U+0A80-U+0AFF) - -* Pravin Satpute , Bageshri Salvi - , Rahul Bhalerao and Sandeep Shedmake - - Devanagari (U+0900-U+097F) - Gujarati (U+0A80-U+0AFF) - Oriya (U+0B00-U+0B7F) - Malayalam (U+0D00-U+0D7F) - Tamil (U+0B80-U+0BFF) - - -* Kulbir Singh Thind - - Gurmukhi (U+0A00-U+0A7F) - -* Gia Shervashidze - - Georgian (U+10A0-U+10FF) - -* Primož Peterlin - maintained FreeFont for several years, and is to be thanked for - all the work he did. - -Please see the CREDITS file for details on who contributed particular -subsets of the glyphs in font files. diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/COPYING b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/COPYING deleted file mode 100644 index 7f1c9b60..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/COPYING +++ /dev/null @@ -1,341 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, - Boston, MA 02110-13017, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/CREDITS b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/CREDITS deleted file mode 100644 index 7249d829..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/CREDITS +++ /dev/null @@ -1,489 +0,0 @@ --*- mode:text; coding:utf-8; -*- -$Id: CREDITS,v 1.14 2008/03/16 20:32:20 Stevan_White Exp $ - -This file lists the contributors and contributions to the free UCS -scalable font project. - - -* URW++ Design & Development GmbH - -URW++ donated a set of 35 core PostScript Type 1 fonts to the -Ghostscript project , to be available -under the terms of GNU General Public License (GPL). - - Basic Latin (U+0041-U+007A) - Latin-1 Supplement (U+00C0-U+00FF) - Latin Extended-A (U+0100-U+017F) - Spacing Modifier Letters (U+02B0-U+02FF) - Mathematical Operators (U+2200-U+22FF) - Block Elements (U+2580-U+259F) - Dingbats (U+2700-U+27BF) - - -* Yannis Haralambous and John - Plaice - -Yannis Haralambous and John Plaice are the authors of Omega -typesetting system, . Omega is an -extension of TeX. Its first release, aims primarily at improving TeX's -multilingual abilities. In Omega all characters and pointers into -data-structures are 16-bit wide, instead of 8-bit, thereby eliminating -many of the trivial limitations of TeX. Omega also allows multiple -input and output character sets, and uses programmable filters to -translate from one encoding to another, to perform contextual -analysis, etc. Internally, Omega uses the universal 16-bit Unicode -standard character set, based on ISO-10646. These improvements not -only make it a lot easier for TeX users to cope with multiple or -complex languages, like Arabic, Indic, Khmer, Chinese, Japanese or -Korean, in one document, but will also form the basis for future -developments in other areas, such as native color support and -hypertext features. ... Fonts for UT1 (omlgc family) and UT2 (omah -family) are under development: these fonts are in PostScript format -and visually close to Times and Helvetica font families. (from the -Omega WWW site). Omega fonts are available subject to GPL -. - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - Greek (U+0370-U+03FF) - Armenian (U+0530-U+058F) - Hebrew (U+0590-U+05FF) - Arabic (U+0600-U+06FF) - Currency Symbols (U+20A0-U+20CF) - Arabic Presentation Forms-A (U+FB50-U+FDFF) - Arabic Presentation Forms-B (U+FE70-U+FEFF) - - -* Valek Filippov - -Valek Filippov added Cyrillic glyphs and composite Latin Extended A to -the whole set of the abovementioned URW set of 35 PostScript core -fonts, . The fonts are available under -GPL. - - Latin Extended-A (U+0100-U+017F) - Cyrillic (U+0400-U+04FF) - - -* Wadalab Kanji Comittee - -Between April 1990 and March 1992, Wadalab Kanji Comittee put together -a series of scalable font files with Japanese scripts, in four forms: -Sai Micho, Chu Mincho, Cho Kaku and Saimaru. The font files are -written in custom file format, while tools for conversion into -Metafont and PostScript Type 1 are also supplied. The Wadalab Kanji -Comittee has later been dismissed, and the resulting files can be now -found on the FTP server of the Depertment of Mathematical Engineering -and Information Physics, Faculty of Engineering, University of Tokyo -. - - Hiragana (U+3040-U+309F) - Katakana (U+30A0-U+30FF) - - -* Young U. Ryu - -Young Ryu is the author of Txfonts, a set of mathematical symbols -designed to accompany text typeset in Times or its variants. In the -documentation, Young adresses the design of mathematical symbols: "The -Adobe Times fonts are thicker than the CM fonts. Designing math fonts -for Times based on the rule thickness of Times = , , + , / , < , -etc. would result in too thick math symbols, in my opinion. In the TX -fonts, these glyphs are thinner than those of original Times -fonts. That is, the rule thickness of these glyphs is around 85% of -that of the Times fonts, but still thicker than that of the CM fonts." -TX fonts are are distributed under the GNU public license -(GPL). Pointers to their location are available on -. - - Arrows (U+2190-U+21FF) - Mathematical Symbols (U+2200-U+22FF) - - -* Angelo Haritsis - -Angelo Haritsis has compiled a set of Greek Type 1 fonts, available on -. -The glyphs from this source has been used to compose Greek glyphs in -FreeSans and FreeMono. - -Angelo's licence says: "You can enjoy free use of these fonts for -educational or commercial purposes. All derived works should include -this paragraph. If you want to change something please let me have -your changes (via email) so that they can go into the next -version. You can also send comments etc to the above address." - - Greek (U+0370-U+03FF) - - -* Yannis Haralambous and Virach Sornlertlamvanich - -In 1999, Yannis Haralambous and Virach Sornlertlamvanich made a set of -glyphs covering the Thai national standard NF3, in both upright and -slanted shape. The collection of glyphs have been made part of GNU -intlfonts 1.2 package and is available on - under GPL. - - Thai (U+0E00-U+0E7F) - - -* Shaheed R. Haque - -Shaheed Haque has developed a basic set of basic Bengali glyphs -(without ligatures), using ISO10646 encoding. They are available under -the XFree86 license at . - -Copyright (C) 2001 S.R.Haque . All Rights Reserved. - -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 S.R.HAQUE 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. - -Except as contained in this notice, the name of S.R.Haque shall not be -used in advertising or otherwise to promote the sale, use or other -dealings in this Software without prior written authorization from -S.R.Haque. - - Bengali (U+0980-U+09FF) - - -* Sam Stepanyan - -Sam Stepanyan created a set of Armenian sans serif glyphs visually -compatible with Helvetica or Arial. Available on -. On -2002-01-24, Sam writes: "Arial Armenian font is free for -non-commercial use, so it is OK to use under GPL license." - - Armenian (U+0530-U+058F) - - -* Mohamed Ishan - -Mohamed Ishan has started a Thaana Unicode Project - and among other things created a -couple of Thaana fonts, available under FDL or BDF license. - - Thaana (U+0780-U+07BF) - - -* Sushant Kumar Dash (*) - -Sushant Dash has created a font in his mother tongue, Oriya. As he -states on his web page : -"Please feel free to foreword this mail to your Oriya friends. No -copyright law is applied for this font. It is totally free!!! Feel -free to modify this using any font editing tools. This is designed for -people like me, who are away from Orissa and want to write letters -home using Computers, but suffer due to unavailability of Oriya -fonts.(Or the cost of the available packages are too much)." - - Oriya (U+0B00-U+0B7F) - - -* Harsh Kumar - -Harsh Kumar has started BharatBhasha - -an effort to provide "FREE software, Tutorial, Source Codes -etc. available for working in Hindi, Marathi, Gujarati, Gurmukhi and -Bangla. You can type text, write Web pages or develop Indian Languages -Applications on Windows and on Linux. We also offer FREE help to -users, enthusiasts and software developers for their work in Indian -languages." - - Devanagari (U+0900-U+097F) - Bengali (U+0980-U+09FF) - Gurmukhi (U+0A00-U+0A7F) - Gujarati (U+0A80-U+0AFF) - - -* Prasad A. Chodavarapu - -Prasad A. Chodavarapu created Tikkana, a Telugu font available in Type -1 and TrueType format on . -Tikkana exceeds the Unicode Telugu range with some composite glyphs. -Available under the GNU General Public License. - - Telugu (U+0C00-U+0C7F) - - -* Frans Velthuis and Anshuman Pandey - - -In 1991, Frans Velthuis from the Groningen University, The -Netherlands, released a Devanagari font as Metafont source, available -under the terms of GNU GPL. Later, Anshuman Pandey from the Washington -University, Seattle, USA, took over the maintenance of font. Fonts can -be found on CTAN, . I -converted the font to Type 1 format using Péter Szabó's TeXtrace -program and removed some -redundant control points with PfaEdit. - - Devanagari (U+0900-U+097F) - - -* Hardip Singh Pannu - -In 1991, Hardip Singh Pannu has created a free Gurmukhi TrueType font, -available as regular, bold, oblique and bold oblique form. Its license -says "Please remember that these fonts are copyrighted (by me) and are -for non-profit use only." - - Gurmukhi (U+0A00-U+0A7F) - - -* Jeroen Hellingman - -Jeroen Hellingman created a set of Malayalam metafonts in 1994, and a -set of Oriya metafonts in 1996. Malayalam fonts were created as -uniform stroke only, while Oriya metafonts exist in both uniform and -modulated stroke. From private communication: "It is my intention to -release the fonts under GPL, but not all copies around have this -notice on them." Metafonts can be found on CTAN, - and -. - - Oriya (U+0B00-U+0B7F) - Malayalam (U+0D00-U+0D7F) - - -* Thomas Ridgeway <> (*) - -Thomas Ridgeway, then at the Humanities And Arts Computing Center, -Washington University, Seattle, USA, (now defunct), created a Tamil -metafont in 1990. Anshuman Pandey from the same university took over -the maintenance of font. Fonts can be found at CTAN, -. - - Tamil (U+0B80-U+0BFF) - - -* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, - Prof. Dr. Manfred Kudlek , Olaf - Kummer , and Jochen Metzinger - -Beyene, Kudlek, Kummer and Metzinger from the Theoretical Foundations -of Computer Science, University of Hamburg, prepared a set of Ethiopic -metafonts, found on -. They also -maintain home page on the Ethiopic font project, -, -and can be reached at . The current -version of fonts is 0.7 (1998), and they are released under GNU GPL. I -converted the fonts to Type 1 format using Péter Szabó's TeXtrace-A -program and removed some -redundant control points with PfaEdit. - - Ethiopic (U+1200-U+137F) - - -* Maxim Iorsh - -In 2002, Maxim Iorsh started the Culmus project, aiming at providing -Hebrew-speaking Linux and Unix community with a basic collection of -Hebrew fonts for X Windows. The fonts are visually compatible with -URW++ Century Schoolbook L, URW++ Nimbus Sans L and URW++ Nimbus Mono -L families, respectively, and are released under GNU GPL license. See -also . - - Hebrew (U+0590-U+05FF) - - -* Panayotis Katsaloulis - -Panayotis Katsaloulis helped fixing Greek accents in the Greek -Extended area. - - Greek Extended (U+1F00-U+1FFF) - - -* Vyacheslav Dikonov - -Vyacheslav Dikonov made a Braille unicode font that could be merged -with the UCS fonts to fill the 2800-28FF range completely. (uniform -scaling is possible to adapt it to any cell size). He also contributed -a free syriac font, whose glyphs (about half of them) are borrowed -from the "Carlo Ator" font freely downloadable from -. Vyacheslav also filled in a few missing -spots in the U+2000-U+27FF area, e.g. the box drawing section, sets of -subscript and superscript digits and capital Roman numbers. - - Syriac (U+0700-U+074A) - Box Drawing (U+2500-U+257F) - Braille (U+2800-U+28FF) - - -* M.S. Sridhar - -M/S Cyberscape Multimedia Limited, Mumbai, developers of Akruti -Software for Indian Languages (http://www.akruti.com/), have released -a set of TTF fonts for nine Indian scripts (Devanagari, Gujarati, -Telugu, Tamil, Malayalam, Kannada, Bengali, Oriya, and Gurumukhi) -under the GNU General Public License (GPL). You can download the fonts -from the Free Software Foundation of India WWW site -(http://www.gnu.org.in/software/software.html#akruti) or from the -Akruti website. - -For any further information or assistance regarding these fonts, -please contact mssridhar AT vsnl.com. - - Devanagari (U+0900-U+097F) - Bengali (U+0980-U+09FF) - Gurmukhi (U+0A00-U+0A7F) - Gujarati (U+0A80-U+0AFF) - Oriya (U+0B00-U+0B7F) - Tamil (U+0B80-U+0BFF) - Telugu (U+0C00-U+0C7F) - Kannada (U+0C80-U+0CFF) - Malayalam (U+0D00-U+0D7F) - - -* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt - - -Noah Levitt found out that the Sinhalese fonts available on the site - are released under GNU GPL, or, -precisely, "Public Domain under GNU Licence Produced by DMS -Electronics for The Sri Lanka Tipitaka Project" (taken from the font -comment), and took the effort of recoding the font to Unicode. - - Sinhala (U+0D80-U+0DFF) - - -* Daniel Shurovich Chirkov - -Dan Chirkov updated the FreeSerif font with the missing Cyrillic -glyphs needed for conformance to Unicode 3.2. The effort is part of -the Slavjanskij package for Mac OS X, -. - - Cyrillic (U+0400-U+04FF) - - -* Denis Jacquerye - -Denis Jacquerye added new glyphs and corrected existing ones in the -Latin Extended-B and IPA Extensions ranges. - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - - -* K.H. Hussain and R. Chitrajan - -`Rachana' in Malayalam means `to write', `to create'. Rachana Akshara -Vedi, a team of socially committed information technology -professionals and philologists, has applied developments in computer -technology and desktop publishing to resurrect the Malayalam language -from the disorder, fragmentation and degeneration it had suffered -since the attempt to adapt the Malayalam script for using with a -regular mechanical typewriter, which took place in -1967-69. K.H. Hussein at the Kerala Forest Research Institute has -released "Rachana Normal" fonts with approximately 900 glyphs required -to typeset traditional Malayalam. R. Chitrajan apparently encoded the -glyphs in the OpenType table. - - Malayalam (U+0D00-U+0D7F) - - -* Solaiman Karim - - Bengali (U+0980-U+09FF) - -Solaiman Karim has developed several OpenType Bangla fonts and -released them under GNU GPL on www.ekushey.org. - - -* Sonali Sonania and Monika Shah - - - Devanagari (U+0900-U+097F) - Gujarati (U+0A80-U+0AFF) - -Glyphs were drawn by Cyberscape Multimedia Ltd., #101,Mahalakshmi -Mansion 21st Main 22nd "A" Cross Banashankari 2nd stage Banglore -560070, India. Converted to OTF by IndicTrans Team, Powai, Mumbai, -lead by Prof. Jitendra Shah. Maintained by Monika Shah and Sonali -Sonania of janabhaaratii Team, C-DAC, Mumbai. This font is released -under GPL by Dr. Alka Irani and Prof Jitendra Shah, janabhaaratii -Team, C-DAC, Mumabi. janabhaaratii is localisation project at C-DAC -Mumbai (formerly National Centre for Software Technology); funded by -TDIL, Govt. of India. Contact:monika_shah AT lycos.com, -sonalisonania AT yahoo.com, jitendras AT vsnl.com, alka AT ncst.ernet.in. -website: www.janabhaaratii.org.in. - - -* Pravin Satpute , Bageshri Salvi - , Rahul Bhalerao and Sandeep Shedmake - - Devanagari (U+0900-U+097F) - Gujarati (U+0A80-U+0AFF) - Oriya (U+0B00-U+0B7F) - Malayalam (U+0D00-U+0D7F) - Tamil (U+0B80-U+0BFF) - -In December 2005 the team at www.gnowledge.org released a set of two -Unicode pan-Indic fonts: "Samyak" and "Samyak Sans". "Samyak" font -belongs to serif style and is an original work of the team; "Samyak -Sans" font belongs to sans serif style and is actually a compilation -of already released Indic fonts (Gargi, Padma, Mukti, Utkal, Akruti -and ThendralUni). Both fonts are based on Unicode standard. You can -download the font files (released under GNU/GPL License) from -http://www.gnowledge.org/Gnoware/localization/font.htm - - -* Kulbir Singh Thind - - Gurmukhi (U+0A00-U+0A7F) - -Dr. Kulbir Singh Thind designed a set of Gurmukhi Unicode fonts, -AnmolUni and AnmolUni-Bold, which are available under the terms of GNU -Generel Public Licens from the Punjabu Computing Resource Center, -http://guca.sourceforge.net/typography/fonts/anmoluni/. - - -* Gia Shervashidze - - Georgian (U+10A0-U+10FF) - -Starting in mid-1990s, Gia Shervashidze designed many -Unicode-compliant Georgian fonts: Times New Roman Georgian, Arial -Georgian, Courier New Georgian. His work on Georgian localization can -be reached at http://www.gia.ge/. - - -* Primož Peterlin - -Primož Peterlin filled in missing glyphs here and there (e.g. Latin -Extended-B and IPA Extensions ranges in the FreeMono familiy), and -created the following UCS blocks: - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - Arrows (U+2190-U+21FF) - Box Drawing (U+2500-U+257F) - Block Elements (U+2580-U+259F) - Geometrical Shapes (U+25A0-U+25FF) - - -Notes: - -*: The glyph collection looks license-compatible, but its author has - not yet replied and agreed on his/her work being used in part of - this glyph collection. diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/ChangeLog b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/ChangeLog deleted file mode 100644 index 6091ff93..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/ChangeLog +++ /dev/null @@ -1,1823 +0,0 @@ -$Id: ChangeLog,v 1.248 2008/03/23 18:04:28 Stevan_White Exp $ - -2008-03-23 Steve White - * sfd/FreeSerif.sfd: - Last of Find Problems -> ATT - 'mark' Latin lookup: afii10026 is in 'cyrl', also afii10074 - Upper and lower Cyrillic i. Just removed mark from both letters. - - 'half' Bengali lookup Khanda_Ta is in 'bng2'. Added bng2 to lookup - Added TtTable etc - - Clean-up of Points too Close through to end of font. - This episode completes the paths/points clean-up of Serif. - But note: many ranges, esp. Ethiopic, Japanese, and Indic, have way - too many points, resulting in lumpiness. - - At this point, FontForge can convert splines to quadratic, auto-hint, - and auto-instrument without segfault. - - * Makefile, sfd/Makefile, tools/GenerateTrueType: - Alterations to build process: added a Makefile, and made to work - on my system. Now auto-hints before generating TrueType. - -2008-03-22 Steve White - * sfd/FreeSans.sfd: - Lots of additions of math characters. Should complete for - LaTeX 2e, except for extensible brackets. - -2008-03-21 Steve White - * sfd/*.sfd: - Regularized stacking of accents in Latin Extended Additional - Changed name of 00B5 from 'mu' to 'micro', - 2206 from 'Delta' to 'Delta.math', - 0308 from 'diaerisis' to 'diaerisiscomb' - - * sfd/FreeMono.sfd: - additions to IPA - - * sfd/FreeMonoBoldOblique.sfd: - Moved dotlessj from Corporate Use, - Deleted commaaccent there - Fixed mis-named glyphs tcommaaccent, Tcommaaccent - Changed name of 030A from 'dieresis' to 'ringcomb' - - * sfd/FreeSans.sfd: - Added some arrows, and a couple of blackboard bold characters - - Several characters in U+F600 Corporate Use range - dotlessj, onefitted, commaaccent - - dotlessj referred to by: jcircumflex, uni01F0: - renamed it to uFFFF, re-linked others by hand - - commaaccent - http://diacritics.typo.cz/index.php?id=9 - should be u+0326 but wasn't linked to anything - - * sfd/FreeSansBold.sfd: - U+0617 etc: read glyphs "4GWglm". It should be Arabic. Deleted - - * sfd/FreeSansBold.sfd, FreeSansOblique.sfd,FreeSansBoldOblique.sfd: - removed bogus glyphs for 200C 200D, ZWJ and ZWNJ - - * sfd/FreeSerif.sfd: - Split lookup for ligatures in latin into two classes; - ff, ffl, fl which are appropriate for all languages, - and fi, ffi, which are not appropriate in Turkish (due to distinction - between short and long i) - Needs to be done for other faces. - - Filled set of extensible brackets in Miscellaneous Technical - - Think IPA is now complete. - -2008-03-18 Steve White - * sfd/FreeSans.sfd: - clean-up of all path issues and points too close - -2008-03-18 Steve White - * sfd/FreeSans.sfd: - Something was causing crashing effects in Windows. Cleanup of - problems eventually made it go away. Now works well. - - Cleaned up many "points too close" - - Cleaned up all ATT problems, of which there were many and various. - - # Incorrectly labelled zero-width joiner used in a ligature - - # Incorrect substitution of dotlessi and dotlessj with i and j was - somehow connected with FontForge crash. Attemts to remove the - substitution would damage a 'ccmp' table; subsequent changes would - result in FontForge crashing on save, and truncating the sfd file. - Surgically removed with vi. - - # A couple of Indic lookups had incorrect script DFLT; one had 'latn'. - - # Don't understand why there are scripts named - dev2 bng2 grj2 gur2 when there are already deva beng gurj guru - But anyway, lots of 'vatu' 'pres' 'haln' and 'liga' lookups contained - characters in the '2' scripts but were lablled only for the 'non-2' - ones. Added the '2' scripts to all these lookups. Suspect a mistake. - - Note: several of these problems are repeated in other Sans faces. - -2008-03-16 Steve White - * sfd/FreeMono.sfd: - cleanup of many path problems "points too close" - - strove to make accents Latin Extended range legible at small sizes - - named some unnamed characters; removed a duplicate - - At this point, all fonts are passing FontForge Validate. - -2008-03-15 Steve White - * sfd/FreeSerif.sfd: CJK punctuation: made some of the very high - glyphs smaller (under 900EM) - The brackets in Sans were very ugly, and not even Sans-serif. - Serif: added extensible square brackets, diddled with integral - corrected direction of some added glyphs - - Several bugs having to do with missing glyphs in Tamil range. - Also a buggy ligature in Devangari. - - Shortened names of many lookup tables - - Futzt with some combining diacriticals - - Added extensible square brackets. - - * sfd/FreeSans.sfd: Changed names of a bunch of glyphs with invalid - TrueType names, in range 0x1025f+ (not real Unicode). - Took pains to retain information contained in the names. - Wonder if these glyphs have ever been of any use. - - CJK Punctuation: brackets were hand-drawn and very ugly. Improved. - - * sfd/*.sfd: - Set OS/2 Metrics back to absolute 900/300. Offsets are not - interpreted uniformly. - - cleanup of many path problems up to extrema and self-intersecting - - Ordered PS Blue values. - -2008-03-14 Steve White - * sfd/FreeSerif.sfd: - got rid of mixed references and contours - cleanup of many path problems "points too close" - - Started clean-up to satisfy FontForge Validate - - Changed names of three glyphs in the - Tamil ligatures range...all clearly bugs. - * sfd/FreeSans.sfd: - added slanted-hyphen - - * sfd/*.sfd: - unified OS/2 Metrics - added Grid Fit - -2008-03-13 Steve White - * sfd/FreeSans.sfd: Rearranged PS BluesValues so they were in - increasing order, Made all 20 in width. - -2008-03-12 Steve White - * sfd/FreeSans.sfd, FreeMono.sfd: added TrueType hinting tables. - Fixed glyphs that didn't convert well to quadratics - Got rid of mixed contours and refs - - * sfd/FreeSerifBold.sfd: cleanup of path problems - -2008-03-11 Steve White - * sfd/FreeMonoOblique.sfd: cleanup of path problems - -2008-03-09 Steve White - * sfd/FreeSerif.sfd: corrected L-dot - further cleanup of path/ref problems - - Found several ligatures that referred to a missing glyph "ZWJ". - Took this to mean the "zero width joiner" u+200D - - * sfd/*.sfd: - changed OS/2 metrics to be absolute 900/300 - - * sfd/FreeSerifItalic.sfd: Added Greek lunate epsilon - - * sfd/FreeMono.sfd: many additions in math range - reduced size of binary union, intersection, vee, wedge - corrected empty set - corrected logical 'assert' relations, etc. 22a2-22af - efforts to make Math glyphs legible at small point sizes - - * sfd/FreeSans.sfd: added Greek lunate epsilon and rho symbol - unstacked more stacked diacriticals - - further cleanup of path/reference problems - -2008-03-08 Steve White - * sfd/FreeSans.sfd, FreeSerif.sfd: - Added some "n-ary" Math operators - - * sfd/FreeSerif.sfd: Further clean-up of path problems...up to - Ethiopic - - Started adding and correcting Math operators for LaTeX 2e - - Corrected n-ary union, intersection, and spikes to be larger - than the binary operators - - Made (many of) the operators based on + - = to use those - symbols directly (by reference or copying). - - Added lunate epsilon - Corrected empty set - - tightened up spacing of some other technical characters - worked on some more math operators involving = - - triangle - several arrows - Supplemental Arrows-A - - * sfd/FreeSans.sfd: Clean-up of font paths - open self-intersecting outermost-clockwise missing-extrema - also flipped references (unlinked) - - Added Greek lunate epsilon and rho symbol - -2008-03-06 Steve White - * sfd/FreeSerif.sfd: Shortened and thickened the combining hook mark, - U+0309, to make more like Unicode samples. - Also see (bug #22499) un-stacked incorrectly stacked accents - -2008-03-05 Steve White - * sfd/FreeSerif.sfd: vertical lines: combining diacritical marks - corrected 0300 030D 0329 0348 (were rendered as straight apostrophes) - Spacing Modifier letters added 02C8 02CC - 02B9 02Ba prime and double-prime - Fixed positioning U+1EC8, 9, I with hook above - -2008-03-03 Steve White - * sfd/FreeSerif.sfd: TT strings updates. - updated Copyright to 2008 - Added Vendor URL as the Savannah freefont site - * sfd/FreeMono.sfd: A standard pangram as the Sample Text for Russian - It reads: In the thickets of the South once there was a citrus - ...--yes, but a fake specimen! - * sfd/*.sfd: Set the OS/2 Sup/Sub settings, which by default looked - like random trash. - -2008-03-02 Steve White - * sfd/FreeSerif.sfd: began cleanup of problems given by FontForge - "Find Problems" feature. (bug #22454) - -2008-03-01 Steve White - * sfd/FreeSerif.sfd: made Arabic work for text display (bug #22329) - Added required contextual replacement tables, - Made a few missing characters, - * sfd/*.sfd: Removde all back layers from glyphs that had them. - -2008-02-27 Steve White - * sfd/FreeSans.sfd: filled in Combining Diacriticals - * sfd/FreeSerif.sfd: shifted whole Arabic range down by 200EM. - -2008-02-26 Steve White - * sfd/FreeSerif.sfd: enabled DPOS table. - -2008-02-24 Steve White - * sfd/*.sfd: Much fiddling with the "combining diacriticals" - range 0300-036F. Made to align with medium-size lowercase - preceding character if not using DPOS table. - -2008-02-23 Steve White - * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #21784) Filled - in set of HTML 4 Character Entities. - - * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #18413) - undertie too low -- went on to tidy other similar characters in - Combining Diacriticals range. - -2008-02-21 Steve White - * sfd/*.sfd: Moved capital Greek letters with tonos so tonos doesn't - cover preceding letter (bug #12798) - - * sfd/FreeSerif.sfd, FreeSans.sfd: (bug #13370) made extended - integrals to line up. - -2008-02-20 Steve White - * sfd/*.sfd: started removing glyphs with back layers (printing bug) - * sfd/*.sfd: adjusted vulgar fractions (bug #17756) - * sfd/*.sfd: adjusted numerical superscripts (bug #20278) - -2008-02-18 Steve White - * sfd/FreeSerif.sfd: Offset Hiragana and Katakana ranges (bug #22326) - * sfd/FreeSerif.sfd: U+30FB, KATAKANA MIDDLE DOT to be full width - (bug #18326) - - * sfd/FreeSerif.sfd: Re-promoted - ff ffi ffl fi fl - as standard ligatures in Latin. - -2008-02-17 Steve White - * sfd/*.sfd: committed to FontForge Spline Font Database (SFD) 2 - format. - -2008-02-10 Steve White - * sfd/*.sfd: brought into line with Debian ttf-freefont - Deleted a couple of patches, and applied those applied to Debian. - -2006-09-20 Primoz Peterlin - - * INSTALL: added installation procedure for MacOS X, courtesy - Philipp Kempgen. - -2006-05-04 Primoz Peterlin - - * sfd/FreeMono.sfd: deleted Russian sample text, which did not - conform to UTF-7. - -2006-04-15 Primoz Peterlin - - * sfd/FreeSerif.sfd: corrected U+10D3. - - * sfd/FreeSans.sfd: ligature U+FB06 (LATIN SMALL LIGATURE S T) - changed from mandatory ("liga") to discretionary ("dlig") (bug - #16253). - - * sfd/FreeMono.sfd: deleted incomplete glyph U+FB06 (LATIN SMALL - LIGATURE S T); deleted U+FB00, U+FB01, U+FB02, U+FB05 as - ligatures (bug #16253). - - * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBoldOblique.sfd: added - U+FB00; deleted U+FB01, U+FB02 as ligatures (bug #16253). - - * sfd/FreeMonoBold.sfd: deleted U+FB00, U+FB01, U+FB02 as - ligatures (bug #16253). - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd: added Georgian letters, donated by - Gia Shervashidze - -2006-02-22 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd: ligature U+FB4F - changed from mandatory ("liga") to discretionary ("dlig"). This is - respons to Bug#349657: [bug #15792] Freefont Alef and Lamed - combine - -2006-02-21 Primoz Peterlin - - * sfd/FreeSerifBold.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd, - sfd/FreeSansBold.sfd: ligature U+FB4F changed from mandatory - ("liga") to discretionary ("dlig"). This is respons to Bug#349657: - [bug #15792] Freefont Alef and Lamed combine - - * sfd/FreeSerif.sfd: corrected bug#275759: [bug #15790] FreeSerif - glyphs for U+2198/U+2199 were reversed. - -2006-02-15 Denis Jacquerye - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: removed ij - and IJ ligatures. - -2006-02-10 Primoz Peterlin - - * sfd/FreeSerif.sfd: added small Georgian letters (mkhedruli), - donated by Gia Shervashidze - - * AUTHORS: Added Gia Shervashidze - - * CREDITS: Added Gia Shervashidze - -2006-01-26 Primoz Peterlin - - * notes/maintenance.txt: Added information on the Makefile now - used; username for FTP login is anonymous. - - * sfd/FreeSansBold.sfd: added U+0569, U+0571, U+0579, U+057B, - U+0586. Armenian small letters completed. - - * sfd/FreeSerif.sfd: added U+0297, U+02AD-02AF. IPA Extensions - section is now complete. Copied a dozen of glyphs from Omega IPA - to Phonetic Extension section. - -2006-01-25 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+01A, U+01A3, U+01A6, U+01B2, U+01BA, - U+01BB, U+01BE, U+01BF. - - * sfd/FreeSans.sfd: aligned small Armenian letters to x-height in - response to bug #15480. Armenian in Free Sans needs a major - cleanup. - -2006-01-24 Primoz Peterlin - - * sfd/FreeSerif.sfd: changed U+0452, U+045B. Cleanup: U+0460, - U+0461, U+04Bc, U+04BD, U+0508. - - * sfd/FreeSansOblique.sfd: replaced accented chars in Latin-1 and - Latin Extended-B sections with references, where possible. - - * sfd/FreeSerif.sfd: changed U+0285. - -2006-01-23 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0195, U+01AA, U+0297, U+03D7, - U+03F0. Several flipped references replaced by outlines. - - * sfd/FreeSansOblique.sfd: Latin Extended-B section more or less - brought in sync with FreeSans. - - * sfd/FreeMonoBoldOblique.sfd: added glyphs from FreeMonoBold in - the Latin Extended-B and IPA Extensions sections. - - * sfd/FreeSerifBold.sfd: Added U+0224, U+0225. Changed U+01B7, - U+01B8, U+04E0, U+0452, U+045B. Replaced accented characters in - the Cyrillic region with references. - -2006-01-21 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0255, U+0264, U+0277, U+0286, - U+029D. Changed U+0261. Deleted spurious glyphs in the control - code area. - -2006-01-19 Primoz Peterlin - - * sfd/FreeSans.sfd: replaced Hardip Pannu Singh's Gurmukhi with - AnmolUni by Kulbir Singh Thind. - -2006-01-17 Primoz Peterlin - - * sfd/FreeSansBold.sfd: Added U+018D, U+0194, U+01B5, U+01B6, - U+01BE, U+0262, U+02A2. - - * sfd/FreeSansBold.sfd: Changed U+0261 in order to distinguish it - from U+0067. Changed U+0251, U+0252. - - * sfd/FreeSerifBold.sfd: Small changes in the Cyrillic - section. Added U+0183, U+018C. - - * sfd/FreeSans.sfd: Added U+2045, U+2046. - - * sfd/FreeSansBold.sfd: Filled in the Gurkmukhi part with the - AnmolUni-Bold by Kulbir Singh Thind. Also some minor corrections - in the Cyrillic part. - - * CREDITS: Added Kulbir Singh Thind. - - * AUTHORS: Added Kulbir Singh Thind. - -2006-01-14 Primoz Peterlin - - * sfd/FreeSerif.sfd: Thomas Ridgeway's Tamil characters replaced - by the ones released by the Samyak font project. - - * CREDITS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao - and Sandeep Shedmake - - * AUTHORS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao - and Sandeep Shedmake - -2006-01-08 Primoz Peterlin - - * sfd/FreeSansBold.sfd, sfd/FreeMonoBoldOblique.sfd: minor changes. - -2006-01-05 Denis Jacquerye - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd: added cedi sign U+20B5, Ghanaian - currency - -2005-12-29 Primoz Peterlin - - * sfd/FreeSans.sfd: minor cleanup in the Gujarati part. - -2005-12-22 Primoz Peterlin - - * sfd/FreeSans.sfd: Devanagari and Gujarati parts cleared; once - again merged with Gargi 1.9 and Padmaa 0.6, this time correctly so - that the anchor points survived the merger. - -2005-12-16 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0577. - -2005-12-15 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0559, U+055F, U+2024. - - * sfd/FreeSansBold.sfd: added U+056E, U+0573. - -2005-12-14 Primoz Peterlin - - * sfd/FreeSans.sfd: Merged with Gargi 1.9 and Padmaa 0.6, - courtesy Monika Shah and Sonali Sonania from C-DAC, Mumbai. - - * CREDITS: Added Monika Shah and Sonali Sonania. - - * AUTHORS: Added Monika Shah and Sonali Sonania. - -2005-12-13 Primoz Peterlin - - * sfd/FreeSans.sfd - Removed Sinhala glyphs. - - * sfd/FreeSerif.sfd - Added Sinhala glyphs, formerly in FreeSans. - -2005-12-09 Primoz Peterlin - - * sfd/FreeSerif.sfd: added U+20AF, U+211E. Changed U+20AC (EURO - SIGN). - - * tools/freefont-ttf.spec: Added specification file for building - RPM package, courtesy Rok Papez. - - * sfd/FreeSerifBold.sfd: added more glyphs from Txfonts to the - Arrows and Mathematical Symbols ranges. - - * sfd/FreeSerifBoldItalic.sfd: added U+03F5 from Txfonts. - -2005-12-08 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0567, U+056A, U+056C, U+0582. - - * sfd/FreeSerifBold.sfd: copied Box Drawing range from FreeSans. - - * sfd/FreeSerifBold.sfd: added glyphs from Txfonts to the Arrows - and Mathematical Symbols ranges. - - * sfd/FreeSerif.sfd: added U+2259-225A, U+22BA, U+2308-230B, - U+2322-2323. Cyrillic composite characters replaced with - references. - -2005-12-07 Primoz Peterlin - - * sfd/FreeSerifBold.sfd: added U+025A, U+025D, U+026B, U+029B, - U+02AE, U+02AF, U+02DE. - - * sfd/FreeSerifBold.sfd: updated Hebrew part with Drugulin font - from the Culmus project. - - * sfd/FreeSerif.sfd: added U+207A-207C, U+208A-208C, U+2215-2216. - - * sfd/FreeSans.sfd: added U+2320 TOP HALF INTEGRAL, U+23AE - INTEGRAL EXTENSION, U+2321 BOTTOM HALF INTEGRAL (bug #13370). - -2005-12-07 Primoz Peterlin - - * sfd/FreeSerifBold.sfd: added U+0294-0296, U+02A1-02A2. Started - adding "below" anchors. Performed hinting on characters that were - not hinted "en masse". - -2005-12-06 Primoz Peterlin - - * sfd/FreeSans.sfd: fixed some more metrics problems in the - Extended Greek area; performed hinting on characters that were not - hinted "en masse". - - * Makefile: clean also signature files. - - * sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: cosmetic - changes; cleaning background of referenced composed characters. - -2005-12-05 Panayotis Katsaloulis - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd: Some changes to the greek glyphs, - mostly having to do with "tonos" (accent) - -2005-12-05 Primoz Peterlin - - * sfd/FreeSans.sfd: minor cosmetic changes. - - * sfd/FreeSans.sfd: adjusted widths of characters in the Extended - Greek range; accents are not any more considerably overhanging on - the left side. Added U+1EDA-1EE3, U+1EE8-1EF1. - - * sfd/FreeSans.sfd: continued working on Extended Greek range; - metrics still not finished. - -2005-12-03 Primoz Peterlin - - * sfd/FreeSans.sfd: fixed combined Greek accents (bug - #12800). Width of characters still need to be adjusted as in - FreeSerif. - - * sfd/FreeSerif.sfd: fixed positions of Greek accents (bug #12798). - - * CREDITS: Added Panayotis Katsaloulis. - - * AUTHORS: Added Panayotis Katsaloulis. - - * Makefile: minor changes; now creating also a tarfile with sfds. - -2005-12-01 Primoz Peterlin - - * sfd/FreeSerifItalic.sfd: added U+0183, U+018C, U+01C0, U+01C1, - U+01C3, U+01E0, U+01E1, U+01F8, U+01F9. - - * Makefile: created a Makefile to assist building. - - * README: an update. - - * COPYING: added GNU General Public License, version 2. - - * tools/GenerateTrueType: wrote a FontForge script for conversion - to TrueType. - - * sfd/FreeSerif.sfd: merged with SolaimanLipi Bangla OpenType font - from www.ekushey.org, courtesy Solaiman Karim. - - * sfd/FreeSerifItalic.sfd: merged with SolaimanLipi Bangla - OpenType font from www.ekushey.org, slanted by 15.5 degrees. - - * sfd/FreeSans.sfd: merged with Rupali Bangla OpenType font from - www.ekushey.org - - * sfd/FreeSansOblique.sfd: merged with Rupali Bangla OpenType font from - www.ekushey.org, slanted by 12 degrees. - - * CREDITS: added Solaiman Karim - - * AUTHORS: added Solaiman Karim - -2005-11-30 Primoz Peterlin - - * sfd/FreeSerif.sfd: merged with the Rachana Normal. - - * AUTHORS: added K.H. Hussain and R. Chitrajan - - * CREDITS: added K.H. Hussain and R. Chitrajan - -2005-11-23 Primoz Peterlin - - * sfd/FreeSans.sfd - cleaned some background images. - - * sfd/FreeSans.sfd - added U+01A0-01A1, U+01AF-01B0, U+026E, - U+028F, U+0291, U+02A3-02A5, U+031B. Modified U+0198. - -2005-11-22 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+2504-250B. - - * sfd/FreeSans.sfd - added U+2591-25A1, U+25A3-25A5, U+25AA, U+25AC. - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - added U+0263. - -2005-11-21 Primoz Peterlin - - * sfd/FreeMono.sfd - corrected positions of some Greek diacritics - on page 0x1F. - - * sfd/FreeMonoOblique.sfd - working on bringing it in sync with - FreeMono.sfd. - - * sfd/FreeSerifBoldItalic.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. Added a couple of - glyphs in the IPA Extensions region. - - * sfd/FreeSansBold.sfd - added U+0574, U+0576. Removed overlaps. - -2005-11-20 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+02AA-02AC, U+02B0-02B2. - -2005-11-19 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+01B7-01B9, U+0196, U+019A, U+01C3, - U+0224-0225, U+025E, U+029A, U+2422. Changed U+0184-0185, U+0192, - U+01B4, U+0282, U+0284. - -2005-11-18 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+02EE, U+207F. - - * sfd/FreeSans.sfd - started Box Drawing area. - -2005-11-17 Primoz Peterlin - - * sfd/FreeSerifBold.sfd - added glyphs from the Omega project to - Latin Extended-B, IPA Extensions and Greek ranges. - - * sfd/FreeSerifBoldItalic.sfd - added glyphs from the Omega - project to Latin Extended-B, IPA Extensions and Greek ranges. - - * sfd/FreeSerifItalic.sfd - added glyphs from the Omega - project to Latin Extended-B, IPA Extensions and Greek ranges. - - * sfd/FreeSerifItalic.sfd - added U+018B, U+025C, U+0265, U+026F, - U+0279, U+0287, U+028C-028E, U+029E. - - * sfd/FreeSerifBoldItalic.sfd - added U+1EDA-1EE3, U+1EE8-1EF1, - U+2190-219B, U+219E-21A8, U+21B9-21BA, U+21C4-21CA, U+21E4-21E5, - U+2669-266F. MES-1 compliant. - - * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSansOblique.sfd, - sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - added U+FFFD. - - * sfd/FreeSerif.sfd - removed overlaps in Latin Extended-B and IPA - Extensions ranges. - -2005-11-16 Primoz Peterlin - - * sfd/FreeSerifItalic.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. - - * sfd/papers/eurotex2003/freefont.tex, - sfd/papers/eurotex2003/freefont.bib - Revised version, sent back - by Karl Berry on 20050110, that should match the one published in - TUGboat. - - * sfd/FreeSerifItalic.sfd - started added accent anchors. Added a - handful of Greek letters from Omega font collection. - - * sfd/FreeSerif.sfd - added a handful of letters in the Latin - Extended-B and IPA Extension ranges from the Omega font collection. - -2005-11-16 Denis Jacquerye - - * sfd/FreeSerif.sfd - moved U+0263 to U+0264; added U+0263 - - * sfd/FreeSerifItalic.sfd - fixe U+01EE; added U+01B7-U+01B9 - -2005-11-16 Primoz Peterlin - - * sfd/FreeSans.sfd - Made small Greek letters the same height as - Latin and Cyrillic ones and replaced them with references, where - applicable. - - * sfd/FreeSerif.sfd - replaced Greek letters with references, - where applicable. Added U+03D7, U+03F0-03F2. - - * sfd/FreeSerif.sfd - added U+0255, U+025A, U+025D, U+025F, - U+0262-0263, U+026B-026C, U+0274, U+0276-0277, U+028F, U+0291, - U+029D. - - * sfd/FreeMonoOblique.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. Added U+F6BE. - - * sfd/FreeSansOblique.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. - - * sfd/FreeSans.sfd - changed U+01A5. - -2005-11-16 Primoz Peterlin - - * sfd/FreeSans.sfd - applied the sequence suggested by Werner - Lemberg for reducing redundant points. Replaced accented glyphs in - the Latin-1 and Latin Extended-A areas with references. Made - capital Greek letters the same height as Latin and Cyrillic ones - and replaced them with references, where applicable. - -2005-11-15 Denis Jacquerye - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSansOblique.sfd - fixed - U+026A, it was a dotlessi and therefore like U+0069 when - accented. - -2005-11-15 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - corrected Greek tonos (slanted instead of - a vertical line). - - * sfd/FreeMonoBoldOblique.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. Replaced accented - glyphs in the Latin-1 and Latin Extended-A areas with references. - -2005-11-14 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Added 2005 in copyright info. - - * sfd/FreeSansBoldOblique.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. Replaced accented - glyphs in the Latin-1 area with references. - - * sfd/FreeSansBoldOblique.sfd - added U+0180, U+0184, U+0185, - U+0195, U+01A0-01A2, U+01AF-01B0, U+025E, U+026E, U+0292, - U+0294-0296, U+029A, U+02A1, U+2126-2127, U+2190-219B, - U+219E-21A8, U+21C4-21CA, U+2669-266F. MES-1 compliant. - - * sfd/FreeMono.sfd - Replaced accented glyphs in the Greek and - Cyrillic areas with references. - - * sfd/FreeMonoBold.sfd - applied the sequence suggested by Werner - Lemberg for reducing redundant points. Replaced accented glyphs in - the Latin-1 and Latin Extended-A areas with references. - -2005-11-14 Primoz Peterlin - - * sfd/FreeSerif.sfd - applied the sequence suggested by Werner - Lemberg for reducing redundant points. - - * sfd/FreeSansBold.sfd - added U+219A, U+219B, U+2669-266F. - - * sfd/FreeSerifBold.sfd - added U+2669-266F. - -2005-11-12 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+0180, U+0181, U+0183, U+0187, - U+0188, U+018A, U+018C, U+018D, U+0193, U+019C, U+01A0, U+01A1, - U+01AC, U+01AF, U+01B0, U+025C, U+0260, U+026E, U+0277, U+0281, - U+0284. - -2005-11-11 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+195, U+1A6, U+025E, U+026E, - U+029A, U+0313, U+0314, U+0342, U+0344, U+0345. Started adding - accent anchors. - - * sfd/FreeMono.sfd - applied the sequence for reducing redundant - points, suggested by Werner Lemberg. - - * sfd/FreeMono.sfd - corrected Greek letters (using tonos instead - of a vertical line). Added U+026E, U+F6BE. Accented characters in - Latin 1, Latin Extended A and partly Latin Extended B replaced by - references. - - * sfd/FreeSerifBold.sfd - applied the sequence for reducing - redundant points, suggested by Werner Lemberg. Added U+01A5, - U+02A0, U+2190-219B, U+219E-21A8, U+21B8, U+21B9, U+21C4-21CA, - U+21E4, U+21E5. - -2005-11-10 Primoz Peterlin - - * sfd/FreeSansOblique - changed U+0192, U+01A5; added U+01C0-01C3. - - * sfd/FreeSansBold.sfd - replaced glyphs with references in the - Cyrillic area. Removed U+04A8, U+04A9. Added U+04C5, U+04C6, - U+04C9, U+04CA, U+04CD, U+04CE, U+0535, U+053F, U+0546, U+0565, - U+0584, U+0587, U+0589. - -2005-11-10 Denis Jacquerye - - * sfd/FreeSans.sfd - added U+028A-U+028B - - * sfd/FreeSansOblique - added U+028A-U+028B, U+0276, - U+0292, U+0294-U+0296, U+0298-U+0299 and U+029B; fixed some - other glyphs - -2005-11-10 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+01A6. Simplified outlines in the - ASCII range. - - * sfd/FreeSansBold.sfd - added U+00A0, U+00AD, U+0531, U+2126, - U+2190-2199, U+219E-21A8, U+21C4-21CA. - - * sfd/FreeSansBold.sfd - applied the sequence for reducing - redundant points, suggested by Werner Lemberg. Added automatically - constructed accented characters in page 0x1E. - -2005-11-09 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+0183, U+018C. - - * sfd/FreeSans.sfd - added U+1EA2, U+1EA3, U+1EA8, U+1EA9, U+1EB2, - U+1EB3, U+1EBA, U+1EBB, U+1EC2, U+1EC3, U+1EC8, U+1EC9, U+1ECE, - U+1ECF, U+1ED4, U+1ED5, U+1EE6, U+1EE7, U+1EF6, U+1EF7, U+220A, - U+220B, U+220D, U+2272, U+2273, U+2282, U+2283. - - * sfd/FreeSerifItalic.sfd - changed U+03D5. - - * sfd/FreeSerifBoldItalic.sfd - changed U+03C6; added U+2070, - U+2075-2079, U+207F, U+2080, U+2085-2089, U+2155-217F. - - * sfd/FreeSerif.sfd - added U+0184, U+0185, U+018D, U+0195, - U+0197, U+019A, U+019B, U+01A0, U+01A1, U+01AC, U+01B5, U+01B6, - U+01C0, U+01C1, U+01C3, U+01F6, U+0294-0296, U+1E9A, U+1EDA-1EE3, - U+1EE8-1EF1. - -2005-11-07 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+0562, U+056D. U+0575. - - * sfd/FreeMono.sfd - added U+0589. - -2005-11-06 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+0278, U+03D5, U+2248. Corrected - U+2071, U+222E, U+2242, U+2243 in response to bug reports - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276118 - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276120 - - * sfd/FreeMono.sfd - added U+2227, U+2228, U+2262. Corrected - U+2299-229D in response to bug report - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276121 - - * sfd/FreeMonoBold.sfd - added U+2010, U+2012 in response to bug - report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=289032 - Swapped U+03C6 (Greek small letter phi) and U+03D5 (Greek phi - symbol) in order to conform to Unicode standard. Simplified glyph - shapes in ASCII range. Started adding "above" and "below" anchors. - -2005-11-05 Primoz Peterlin - - * sfd/FreeSerif.sfd - accented letters in Latin Extended-A - replaced by references wherever possible. - - * sfd/FreeSerif.sfd - added U+0180, U+0181, U+0187, U+0188, - U+018A, U+0193, U+019C, U+01A4, U+01A5, U+01A7, U+01A8, U+01AF, - U+01B0, U+026E, U+0270, U+0278, U+0280, U+0281, U+028B, U+0299, - U+029C, U+029F. - -2005-11-03 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+0180, U+0184, U+0185, U+0192, - U+019B, U+01A0-01A2, U+01AF, U+01B0, U+01EE, U+01EF, U+0292, - U+0294-0296, U+02A1, U+0532, U+054C, U+057C, U+222B. Changed - U+014B, U+01A5, U+01B4, U+03BB. - - * sfd/FreeSans.sfd - added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, - U+04CE. - - * sfd/FreeSansBold.sfd - cleaner Arabic outlines. Added U+01E4, - U+01E5. - -2005-11-02 Primoz Peterlin - - * sfd/FreeSansBold.sfd - started Armenian; added U+0538, U+0542, - U+0544, U+0548, U+054D, U+054F, U+0550, U+0553, U+0555, U+0561, - U+0563, U+0564, U+0566, U+0568 U+056B, U+056F, U+0570, U+0572, - U+0578, U+057A, U+057D-057F, U+0580, U+0581, U+0583, U+0585. - - * sfd/FreeMono.sfd - swapped U+03C6 (Greek small letter phi) and - U+03D5 (Greek phi symbol) in order to conform to Unicode standard. - Added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, U+04CE. - -2005-11-01 Primoz Peterlin - - * sfd/FreeSansBold.sfd - modified U+019C. - - * sfd/FreeSansBoldOblique.sfd - added U+00A0, U+00AD, U+019C, - U+01B7, U+01B8, U+0275, U+0278, U+0298, U+2012, U+2015, - U+2070-207F, U+2080-208E, U+2153-217F, U+2213, U+2215. - -2005-10-31 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+0199, U+01AB, U+0265, U+0282, - U+0288, U+028C-028E, U+0290, U+029E, U+02A0. - -2005-10-28 Primoz Peterlin - - * sfd/FreeSerifBold.sfd - added U+019E, U+01AB, U+01AD, U+01B1, - U+0256, U+025F, U+0265, U+0269, U+026F, U+0270, U+0279-027F, - U+0282, U+0287, U+0288, U+028C-028E, U+0290. - - * sfd/FreeSerifBold.sfd - added U+2070, U+2075-2079, U+2080, - U+2085-2089, U+2153-215E, U+2113-2115, U+2119. - - * sfd/FreeSerifBold.sfd - added U+0199, U+019B, U+01B8, U+01B9, - U+01BE, U+01C0, U+0262, U+0274, U+0278, U+0280, U+028F, U+0298, - U+0299, U+029C, U+029E, U+029F, U+2012, U+2015, U+2016, U+2129, - U+2217. - -2005-10-27 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+018D, U+0194, U+019B, U+019C, U+01B5, - U+01B6, U+0295, U+0296, U+029B, U+02A2, U+0472, U+0473, U+2114, - U+2119. - - * sfd/FreeSerifItalic.sfd - minor cleanup in the superscript range - (U+2070-2079). - - * sfd/FreeSansBold.sfd - added subscripts and superscripts - (U+2070-208F), completed fractions (U+2152-215F) and Roman - numerals (U+2160-217F). - - * sfd/FreeSerifBold.sfd - added U+018B, U+018E, U+018F, U+0191, - U+019D, U+01A7, U+01A8, U+01AE, U+0253, U+0266, U+0267, U+026A, - U+0271-0273, U+0283, U+0285. - -2005-10-26 Primoz Peterlin - - * sfd/FreeSans.sfd - added "above" anchors to selected Cyrillic - characters. Added U+0294, U+02A1. - - * sfd/FreeMono.sfd - added U+2011, U+2012, U+203B, U+204A, U+2071, - U+2129, U+2232, U+2233. Changed and/or corrected U+2106, U+211E, - U+2126, U+2127, U+2153-215F, U+2202. - - * sfd/FreeMono.sfd - a try to imitate Denis' work on adding - anchors by adding "above" anchor to a couple of basic Latin - characters. - - * sfd/FreeSansBold.sfd - added U+0278, U+0298. Cleaned up outlines - of most Greek letters. - - * sfd/FreeSansBold.sfd - Added U+2010-2012, U+2015, U+2032, - U+203C, U+2047-2049. - - * sfd/FreeSans.sfd - Added U+01C0-01C2, U+0276, U+0292, - U+0298. Changed U+0251, U+0294, U+02A1. - -2005-10-25 Primoz Peterlin - - * sfd/FreeSerifItalic.sfd - added U+00A0, U+00AD, U+2010-2012, - U+2015, U+2126, U+2127, U+2153-215E, U+2160-217F, U+2190-2193, - U+2669-266F. FreeSerifItalic is now MES-1 compliant. - - * sfd/FreeSerif.sfd - added U+0191, U+019D, U+01AE, U+027E, - U+027F, U+0283, U+0285. - - * sfd/FreeSerif.sfd - added U+019E, U+01AD, U+01B8, U+01B9, - U+0253, U+0256, U+0257, U+025C, U+0260, U+0266, U+0267, U+0269, - U+026D, U+0271-0273, U+0279-027D. - - * sfd/FreeSerifBoldItalic.sfd - added U+00A0, U+00AD, U+2010-2012, - U+2015, U+2032-2034, U+203C, U+2047-204A, U+2074, U+2081-2084, - U+2126, U+2153, U+2154, U+215F, U+2215. Corrected positions of - diacritics on U+0200-0217. - - * sfd/FreeSansOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBoldOblique.sfd, - sfd/FreeMonoBold.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd sfd/FreeSerifBoldItalic.sfd - brought in - sync with Valek Filipov's urw-fonts-1.0.7pre41. - - * sfd/FreeSansOblique.sfd - added U+00A0, U+2011-2012, U+2015, - U+2070, U+2071, U+2074-2079, U+2080-2089, U+2126, U+2153-215F, - U+2190-2195, U+2215, U+266A. FreeSansOblique is now MES-1 - compliant. - -2005-10-24 Denis Jacquerye - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - added - ccmp for i and j to be substituted with dotless i or j when - followed by above diacritic - -2005-10-24 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+2011, U+2012, U+2015. FreeSans is now - MES-1 conformant. - -2005-10-23 Denis Jacquerye - - * sfd/FreeSans.sfd - added above, below, abovemk and belowmk - anchors for diacritics placement to many Basic Latin characters, - some Latin Extented A and B, and some IPA characters; fixed a - couple of precomposed characters to have diacritics at the same - height as similar characters. - -2005-10-21 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+02B9, U+02BA, U+02CD, U+2017, - U+2036, U+2037, U+203C, U+203E, U+2047-204A. - -2005-10-20 Primoz Peterlin - - * sfd/FreeSerifBold.sfd - added U+0182, U+0189, U+0192, U+019F, - U+01A9, U+01B7, U+01C4-01CC, U+01E0-1E2, U+01F0-01F3, U+F6BE. - Corrected position of diacritics on U+0200-0217. - - * sfd/FreeSerif.sfd - added U+00A0, U+00AD, U+0182, U+0189, - U+018B, U+018E, U+018F, U+0192, U+019F, U+01A9, U+01B1, U+01B7, - U+01DD, U+2010-2013, U+2015. FreeSerif is now MES-1 conformant. - -2005-10-19 Denis Jacquerye - - * sfd/FreeSerif.sfd - added U+0268, U+026A, U+0289, U+0292; and - anchor "above" to more base glyphs. - - * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBoldItalic.sfd - added U+0250-0252, U+0258-0259, - U+0261, U+0268, U+026A, U+0279, U+0289 - - * sfd/FreeSerifBold.sfd - added anchor "above" to marks - U+0300-0314, and to base glyphs (vowels). - -2005-10-18 Denis Jacquerye - - * sfd/FreeSerif.sfd - added anchor "above" to marks U+0300-0314, - and bases vowel of the U+0041-007A range, U+00E6, U+0186, U+0190, - U+0254 and U+025B; fixed Latin-1 Supplement block accented glyphs - to use references. - -2005-10-17 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+01B7, U+01B8, U+0275. - -2005-10-16 Denis Jacquerye - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added some Latin - Extended-B African letters: U+0181, U+018A, U+0197-0198, U+01A4, - U+01AC, U+01B1, U+01B3-01B4; - - * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added Latin - Extended-B U+0187, 018E-018F, U+0191, U+0193, U+0197-0199, - U+019D-019F, U+01AB-01AE; correcting width of non-space - Combining Diacrtical Marks; added more glyphs to IPA Extensions - to match non Bold - - * sfd/FreeSansBoldOblique.sfd - added many accented glyphs to - Latin Extended-B - -2005-10-15 Denis Jacquerye - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added IPA Extensions - U+0262,U+0274,U+0280-0281, U+0299, U+029F, and Spacing Modifier - Letters U+02C9-02CB; fixed U+0287,029E height to baseline; added - stroke to U+0268 - - * sfd/FreeSansOblique.sfd - fixed skew on U+027F - - * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added to Latin - Extended-B U+01A7-01A8, IPA Extensions U+0251-0253, U+0256-0257, - U+0261, U+0265-026A, U+026F-0273, U+0289, U+028C-028E - - * sfd/FreeSansBoldOblique.sfd - added to Latin extended-B U+0189, - U+01A8, U+01B1, U+0283, U+02C9 and Spacing Modifiers U+02C9-02CB - -2005-10-14 Primoz Peterlin - - * sfd/FreeSansBold.sfd - Added a couple of composite glyphs, - mostly in the IPA and Latin Extended B ranges. - -2005-10-13 Denis Jacquerye - - * FreeSans.sfd - removed overlap and simplified U+0187, 0191, - 0193, 01A5, 01AE, 0260, 0271, 0272, 0273, 027B; fixed diacritics - placement on U+0200-0217; fixed glyph for U+0283 to correct esh - without stroke; added U+025F and fixed U+025F from it; fixed - height of glyph at U+0285; arranged U+027E,027F to make more - distinguishable from U+0072. - - * FreeSansOblique.sfd - added the corrected or new glyphs from - FreeSans; diacritics on U+200-0217 will need height readjustements. - - * FreeSansBold.sfd, FreeSansBoldOblique.sfd - added U+0186, 0190, - 0250, 0254, 0258, 0259, 025B, 025C - -2005-10-13 Primoz Peterlin - - * sfd/FreeSerif.sfd - Minor changes: U+22A2, U+22A3, U+22A6, U+23AE. - Added U+0250, U+0251, U+0258, U+0259, U+0275. - - * sfd/FreeSerifItalic.sfd - Added glyphs U+222B-U+222F, U+2320, - U+2321. Fixed diacritics on U+0200-U+0217. - -2005-10-12 Denis Jacquerye - - * sfd/FreeSerif.sfd - Corrected diacritics position on - U+01D5-01D9,01DB,01EA-01ED,0200-0217 and U+022A. - - * sfd/FreeSerif.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBoldItalic.sfd - added U+0186,0190,0254 and U+025B. - -2005-10-11 Primoz Peterlin - - * sfd/FreeSerif.sfd - Fixed bug #13399 (glyphs for U+0360 and - U+0361 were swapped). - - * sfd/FreeSerif.sfd - Attempt to correct bug #13370: INTEGRAL - EXTENSION does not align with TOP/BOTTOM HALF INTEGRAL; added - glyph U+23AE. - -2005-05-16 Primoz Peterlin - - * sfd/FreeMono.sfd - Corrected shapes for Cross of Lorraine and - Cross of Jerusalem. - -2005-04-07 Primoz Peterlin - - * sfd/FreeSansBold.sfd - Added some combining accents, just to - test the a version of FontForge. - -2003-12-05 Primoz Peterlin - - * sfd/FreeMono.sfd - Some composite Latin characters rebuilt, as - they had accents 600 points to the left due to changes on October - 2. Some other minor changes in the mathematics area. - -2003-10-08 Primoz Peterlin - - * sfd/FreeMonoOblique.sfd, sfd/FreeSerifBoldItalic.sfd, - FreeSerifItalic.sfd - applied Josef Segur's corrections from - Oct. 5. - -2003-10-02 Primoz Peterlin - - * sfd/FreeSerif.sfd - Abbas Izad's contributed Arabic/Farsi - characters added. - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Combining characters (U+0300 - - U+036F) moved left, so that they have negative horizontal values - and zero advance width. - -2003-09-15 Primoz Peterlin - - * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd - Started working - on super- and subscripts. - -2003-09-12 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSerif.sfd - Added some missing - Hiragana and Katakana characters. - - * sfd/FreeSansBold.sfd - Cleared background characters in Latin - Extended-A. Added some automatically constructed characters in - Latin Extended-B. Started with superscripts and subscripts. - - * sfd/FreeSans.sfd - Subscript numerals (U+2080-U+2089) completed. - -2003-05-19 Primoz Peterlin - - * sfd/FreeSerif.sfd - Thai characters po pla and bo baimai - swapped; Thai character fongman corrected; all courtesy Theppitak - Karoonboonyanan. - -2003-05-17 Panayotis Katsaloulis - - * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Full support - of all ancient greek glyphs - -2003-05-15 Primoz Peterlin - - * tools/KerningNumerals.pl - A Perl script for moving kerning - information from ASCII numerals (U+0030...) to characters in the - Adobe corporate use area (U+F6xx). - - * sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, - sfd/FreeSansBoldOblique.sfd - Created kerned numerals in the Adobe - corporate use area (U+F6xx) and moved kerning information from - ASCII numerals to the kerned numerals. - -2003-05-14 Primoz Peterlin - - * sfd/FreeSans.sfd - First approximation of super- and subscript - numerals and vulgar fractions. - - * sfd/FreeSerif.sfd - Super- and subscript numerals complete, - vulgar fractions completed and redone as references rather than - outlines. - -2003-05-12 Primoz Peterlin - - * sfd/FreeSerif.sfd - Clean-up of the Cyrillic letters added on - March 27; super- and subscripts, vulgar fractions. - -2003-05-09 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - Added a couple of characters to - the Latin Extended-B area and the IPA extensions area. - -2003-05-08 Primoz Peterlin - - * sfd/FreeSerifBoldItalic.sfd - Added a couple of characters to - the Latin Extended-B area. - - * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - ASCII - numerals now monospaced; kerned numerals moved to Adobe corporate - use area - (U+F6xx). - -2003-05-07 Primoz Peterlin - - * sfd/FreeSerif.sfd - Roman numerals now more complete. - - * sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - Accented - characters added in the Latin Extended-B area. - - * sfd/FreeSans.sfd - Greek accents added in the Greek Extended - area, characters added in the Latin Extended-B area, Roman - numerals added. - - * sfd/FreeMonoOblique.sfd - Kerning pairs removed (what were they - doing in a monospaced font, anyway?). - - * sfd/FreeMonoBoldOblique.sfd - Additions in Latin Extended-B and - Basic Greek. - - * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, - sfd/FreeSansBoldOblique.sfd - Major cleanup (fixed widths, open - paths, path directions (clockwise/counter-clockwise), points - rounded to integer values; outlines simplified etc.) - -2003-05-06 Primoz Peterlin - - * tools/OS2UnicodeRange - A simple script to display OS/2 Unicode - range table in TrueType fonts. - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - ASCII numerals now - monospaced; kerned numerals moved to Adobe corporate use area - (U+F6xx). FreeSans is done, FreeSansBold half-way. - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Added 2003 in copyright info. - -2003-03-27 Primoz Peterlin - - * sfd/FreeSerif.sfd - Cyrillic and Cyrillic Supplement blocks - brought to conformance with Unicode 3.2, courtesy Daniel Shurovich - Chirkov. - -2003-03-19 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - somewhat wider - germandbls (U+00DF), due to complaints by Walter Schmidt. - -2003-03-18 Primoz Peterlin - - * sfd/FreeSans.sfd - Added Sinhala glyphs from the Tipitaka - project , recoded to Unicode by Noah Levitt. - -2003-02-19 Primoz Peterlin - - * sfd/FreeSans.sfd - Minor changes on mathematical operators. - -2003-02-18 Primoz Peterlin - - * sfd/FreeMono.sfd - minor cleanup of glyph backgrounds; changed - integral signs (U+222B - U+2230) - -2003-02-05 Primoz Peterlin - - * sfd/FreeSans.sfd - added a couple of glyphs in the IPA and - African Latin ranges. - -2003-01-30 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd - Corrected Maltese Hbar (U+0126) - and/or hbar (U+0127). - -2003-01-28 Primoz Peterlin - - * sfd/FreeSerifItalic.sfd - Corrected Maltese hbar (U+0127). - -2002-12-18 Primoz Peterlin - - * tools/ConvertFont - PfaEdit script for converting SFD files to - TrueType fonts. - - * sfd/FreeSans.sfd - Added Tamil and Kannada glyphs from the - Akruti Indic fonts. - -2002-12-17 Primoz Peterlin - - * sfd/FreeSans.sfd - Added Devanagari and Gujarati glyphs from the - Akruti Indic fonts. - - * www/index.html - Added information on Rogier van Dalen's tools. - - * AUTHORS - Added M.S. Sridhar. - - * CREDITS - Correct spelling of Culmus project. Added M.S. Sridhar. - -2002-12-06 Primoz Peterlin - - * sfd/FreeMono.sfd - Added Braille glyphs, courtesy Vyacheslav - Dikonov. - - * sfd/FreeSans.sfd - Added Unicode Syriac glyphs, courtesy - Vyacheslav Dikonov. - -2002-10-11 Primoz Peterlin - - * www/index.html - Added information on the availability of the - Debian GNU/Linux package. - - * sfd/FreeSerif.sfd, sfd/FreeSans.sfd - added some kern pairs - beyond Latin-1 area. - - * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - re-introduced - all the emtpy glyph slots (changes from Sep 23 made PfaEdit - crash). - -2002-09-23 Primoz Peterlin - - * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - imported - kerning information from the URW++ AFM files - -2002-09-11 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoOblique.sfd - updated Hebrew parts to comply with - Culmus v0.6. - - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansOblique.sfd - Added Danilo Segan's Serbian Cyrillic - glyphs; updated Hebrew parts to comply with Culmus v0.6. - -2002-09-09 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansOblique.sfd - Updated Cyrillic part to match - Filippov's 1.0.7pre14 - - * sfd/FreeSansOblique.sfd - added Sam Stepanyan's Armenian glyphs - from FreeSans (skewed for 12 degrees). - -2002-09-06 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, - sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd - Added Maxim - Iorsh's Hebrew characters. - -2002-08-29 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, - sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd - Added Maxim - Iorsh's Hebrew characters. - - * AUTHORS, CREDITS - Added Maxim Iorsh as author. - -2002-08-28 Primoz Peterlin - - * www/index.html - Added information of Microsoft's withdrawal of - freely available Unicode TrueType fonts - - * www/resources.html - Added link to Maxim Iorsh's Culmus project. - -2002-07-26 Primoz Peterlin - - * sfd/FreeMono.sfd - Added a couple of characters (Arrows area). - -2002-06-11 Primoz Peterlin - - * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning - perispomeni in Greek politoniko. - -2002-05-23 Primoz Peterlin - - * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning - psili in Greek politoniko. Also added two working variants of - chars in the IPA range. - -2002-05-15 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifBold.sfd - Deleted explicit ".notdef" character with - no contours. - -2002-05-14 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - The new version of PfaEdit saves - correctly formed Panose and LineGap lines. - - * sfd/FreeSansBoldOblique.sfd - Filled-in the missing TTFWidth and - TTFWeight values. - -2002-05-09 Primoz Peterlin - - * sfd/FreeSans.sfd - Added diacritics to the Spacing Modifier - Letters and Combining Diacritical Marks areas. Added composed - glyphs to the Latin Extended-B area. - -2002-05-07 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Updated Panose information with data - provided by Josef W. Segur. Updated TTF headers with English and - Slovenian text. - -2002-04-30 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - Working on Greek small letters. Several - minor changes (lower carons etc.) - -2002-04-29 Primoz Peterlin - - * FreeMonoBoldOblique.sfd - Started adding Greek. - - * sfd/FreeMonoBold.sfd - Added glyphs in the Geometrical Shapes - and Miscellaneous Symbols area. Harmonizing Greek with Latin. Done - with capitals. - - * sfd/FreeMono.sfd - Deleted the explicit .notdef character. Added - one glyph to the Geometrical Shapes area, which is now completed; - added three glyphs to the Miscellaneous Symbols area. Harmonizing - Greek with Latin. Done with the capitals. - -2002-04-26 Primoz Peterlin - - * sfd/FreeSans.sfd - Adjusted accent positions on several glyphs - in the Latin Extended-A area. - -2002-04-25 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - Box Drawing area completed. Added a - couple of glyphs in the Geometrical Shapes area. - - * sfd/FreeMono.sfd - Small corrections in the Box Drawing area. - -2002-04-24 Primoz Peterlin - - * sfd/FreeMono.sfd - Box Drawing area completed. - -2002-04-23 Primoz Peterlin - - * tools/WGL4.lst - corrected. - - * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Box Drawing - area. - -2002-04-22 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Latin - Extended-B and Greek. - -2002-04-19 Primoz Peterlin - - * sfd/FreeSerif.sfd - Somewhat cleaner chess figures. - - * tools/MES-2.txt, tools/MES-2.lst - Corrected list (it is not - 203C-203E, it is 203C and 203E). - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Changed "Family Name" from Free to - FreeSerif, FreeSans and FreeMono, as appropriate. Changed Font - Modifiers from MonoBold etc. to Bold, Italic, Oblique, BoldOblique - and BoldItalic. - -2002-04-18 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd - Corrected metrics; now all character - widths are set to 600. - -2002-04-17 Primoz Peterlin - - * sfd/FreeSerif.sfd - Corrected glyphs in the Box Drawing area and - Block Elements area, which should extend through the ascender *and - descender* height. - - * sfd/FreeMonoBold.sfd - Continued working on harmonizing Greek - letters with Latin and Cyrillic. - - * sfd/FreeMonoBold.sfd - Added some box drawing characters. - -2002-04-16 Primoz Peterlin - - * www/design-notes.html - Updated notes on stroke width for - symbols in Free Mono Bold. - - * sfd/FreeMono.sfd - Added a handful of characters in the - Miscellaneous Symbols area. - - * sfd/FreeMonoBoldOblique.sfd - Added subscripts, superscripts and - vulgar fractions. - - * sfd/FreeMonoBold.sfd - Started harmonizing Greek letters with - Latin and Cyrillic. - - * sfd/FreeMonoBold.sfd - Added subscripts, superscripts and vulgar - fractions. - -2002-04-15 Primoz Peterlin - - * www/design-notes.html - Updated notes on super-/subscripts in - Free Mono Bold. Separate subsections for Free Mono regular and - Free Mono Bold. - -2002-04-12 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added Ethiopian glyphs, converted from the - Metafont sources from TGI, Universität Hamburg (authors Berhanu - Beyene, Prof. Dr. Manfred Kudlek, Olaf Kummer, and Jochen - Metzinger) using Szabo's TeXtrace and retouched using - PfaEdit. Ethiopian metafonts are released under GNU GPL, - . - - * sfd/FreeMonoBold.sfd - Added 40 characters, mostly in the Latin - Extended-B and IPA Extensions areas. - -2002-04-11 Primoz Peterlin - - * sfd/FreeMono.sfd - Added a handful of characters in the Latin - Extended-B, IPA Extensions, Currency Symbols and Miscellaneous - Symbols areas. - -2002-04-09 Primoz Peterlin - - * sfd/FreeMono.sfd - Correcting accent positioning in the Extended - Greek area; adding a couple of characters here and there. Still 20 - characters short of MES-2 conformance. - -2002-04-08 Primoz Peterlin - - * sfd/FreeMono.sfd - Added some characters in the Arrows area; - more or less completed Extended Greek area (accents still need to - be fine-tuned). - -2002-04-05 Primoz Peterlin - - * sfd/FreeMono.sfd - Modern non-Russian Cyrilic mostly completed. - - * sfd/FreeMonoOblique.sfd - Synchronized with FreeMono. - - * sfd/FreeSerif.sfd - Added Thomas Ridgeway's Tamil characters - (converted from Metafont and edited somehwat). - -2002-04-04 Primoz Peterlin - - * sfd/FreeMonoOblique.sfd - Armenian letters added. - - * sfd/FreeMonoBold.sfd - Serbian Cyrillic letters dje, tshe, lje - and nje corrected. - - * sfd/FreeMono.sfd - Serbian Cyrillic letters dje and tshe - corrected. Some other non-Russian Cyrillic letters modified and - "welded together". - -2002-04-03 Primoz Peterlin - - * sfd/FreeMono.sfd - Added more or less complete Armenian - area. The glyphs are a tidied-up version based on the Armenian - Courier on the . Now we have - 1673 characters. - -2002-03-28 Primoz Peterlin - - * sfd/FreeMono.sfd - Added some mathematical symbols. - -2002-03-26 Primoz Peterlin - - * sfd/FreeSans.sfd - took H.S. Pannu's Gurmukhi from FreeSerif. It - actually fits to FreeSans much better. It seems I'll have to look - for another Gurmukhi font with modulated stroke for FreeSerif. - - * sfd/FreeSerifItalic.sfd - replaced existing Hebrew glyphs by - those from FreeSerif (slanted for 15.5 degrees). - - * sfd/FreeSerif.sfd - Added dotted Hebrew letters. Changed barred H. - - * sfd/FreeMono.sfd - Completed vulgar fractions; minor changes in - Greek; added some mathematical operators. - - * sfd/FreeMonoBold.sfd - added 12 characters to Latin Extended-B - and IPA Extensions areas (total 984). - -2002-03-25 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - started adding Latin Extended-B and IPA - Extensions. - - * sfd/FreeMono.sfd - Minor cosmetic changes; cleaning up Greek - (removing redundant control points), added some non-European - Cyrillic glyphs as a test. - -2002-03-22 Primoz Peterlin - - * sfd/FreeMono.sfd - Some minor modifications; letters in Latin - Extended-B area "welded" together. - -2002-03-20 Primoz Peterlin - - * www/index.html - finally linked the resources and design notes - pages. - - * www/design-notes.html - added scaling information for super- and - subscript numerals in FreeMono. - -2002-03-19 Primoz Peterlin - - * sfd/FreeMono.sfd - the Latin Extended-B and IPA Extension area - characters moved from FreeMono and skewed for 12 degrees. - -2002-03-18 Primoz Peterlin - - * sfd/FreeMono.sfd - added a dozen or two of new characters, in - particular in the Latin Extended-B and IPA Extension area. - -2002-03-15 Primoz Peterlin - - * sfd/FreeMono.sfd - added a dozen of two of new characters, in - particular in the IPA Extension area. - - * www/design-notes.html - Corrected data for x-height in FreeMono; - information on constructing small caps. - -2002-03-14 Primoz Peterlin - - * sfd/FreeMono.sfd - added three smiley characters to the - Miscallaneous Symbols area. - -2002-03-10 Primoz Peterlin - - * sfd/FreeSerif.sfd - Anshuman Pandey has only converted Gurmukhi - from TrueType to Metafont; the original author of Gurkmukhi font - is Hardip Singh Pannu . - Got the permission from him to include the Gurmukhi glyph set. - -2002-03-08 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added some more glyphs in the Mathematical - Symbols area to a total number of 3374. - -2002-03-06 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added a basic Gurmukhi set. - - * www/design-notes.html - started a page on design notes - - * sfd/FreeMono.sfd - realized that glyphs in the Box Drawing area - and Block Elements area should extend through the ascender *and - descender* height, and corrected it. - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd - added some musical - glyphs, linking "no-break space" to space, "soft hyphen" to - hyphen-minus etc. - -2002-03-05 Primoz Peterlin - - * tools/WGL4.lst - Added Windows Glyph List 4.0 - - * tools/LigatureList.pl - Wrote a Perl script, which lists the - GSUB list (ligature list) of a OpenType font. - - * sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd, - sfd/FreeSerifItalic.sfd - auxilliary Hebrew glyphs added. They are - too light compared with Latin and will be substituted with better - ones. - -2002-03-04 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added some more glyphs to the Mathematical - Operators area (page 0x22). - - * sfd/FreeSerif.sfd - Incomplete and fragmentary support for - Devanagari, originating from Harsh Kumar's Shusha fonts was - replaced by Frans Velthuis' Devanagari metafont, now maintained by - Anshuman Pandey and available under - GPL. Until I figure out how to provide glyph substitution table in - OpenType, only the Unicode part is there. - -2002-02-28 Primoz Peterlin - - * ChangeLog file created - - * sfd/FreeSerif.sfd - Added some Telugu glyphs to page 0x0C, - courtesy Prasad A. Chodavarapu - - * sfd/FreeSerif.sfd - Added some glyphs to the Miscellaneous - Symbols page (0x26). - -2002-02-26 Primoz Peterlin - - * mailing lists freefont-announce and freefont-bugs created - -2002-02-25 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added a couple of glyphs in Mathematics - Operators area. - - * sfd/FreeMono.sfd - - Added some more glyphs, in particular in the Mathematical - Operators section. - - Changed FamilyName to Free, FontName to FreeMono, and Full name - to "Free Monospaced". - -2002-02-20 Primoz Peterlin - - * sfd/ directory added containing FreeSerif, FreeSans and FreeMono - families. - - * tools/ directory added containing lists with characters required - for MES (Multilinguag European Subset) compliance. - - * tools/mes-list-expand.pl created - a Perl script for expanding MES - ranges into simple one-char-per-line format - - * tools/CheckConformance.pl created - a Perl script for checking - conformance of a font file with a given coded character set - - * homepage created - -2002-02-19 Primoz Peterlin - - * freefont (Free UCS Scalable Fonts) project approved on - savannah.gnu.org: diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/INSTALL b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/INSTALL deleted file mode 100644 index ceeac265..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/INSTALL +++ /dev/null @@ -1,64 +0,0 @@ - - Installing the Free UCS outline fonts - ===================================== - -1. UNIX/GNU/Linux/BSD Systems - -The rather awkward "UNIX/GNU/Linux/BSD" agglomeration is used to -denote any system capable of running XFree86 server with FreeType -, a high-quality free font rasterizer. - -1.1 KDE local installation - -Users of KDE can install .ttf files on a per-user basis using the KDE -Control Center module "kcmfontinst", which may appear in the menu as - - Settings -> System Administration -> Font Installer - -This is especially helpful for developers and testers. - -1.2 Debian GNU/Linux - -Users of Debian GNU/Linux system will probably want to use the -pre-packed Debian package, as available from the Debian site, -, or -any of its mirrors. You can install them by issuing the command - -apt-get install ttf-freefont - - -1.3 The rough way - -1) Fetch the freefont-ttf.tar.gz package with Free UCS outline fonts - in the TrueType format. - -2) Unpack TrueType fonts into a suitable directory, - e.g. /usr/local/share/fonts/default/TrueType/ - -3) If you have chosen any other directory, make sure the directory you - used to install the fonts is listed in the path searched by the X - Font Server. Append the directory to the "catalogue=" in the - /etc/X11/fs/config. - -4) Run ttmkfdir in the directory where you unpacked the fonts. - - -2. Microsoft Windows 95/98/NT/2000/XP - - Probably something like Windows Vista: - - Microsoft Windows Vista - * From Start menu, open Control Panels - * drag-n-drop font files onto Fonts control panel - may get dialog saying - "Windows needs your permission to continue" - * click Continue - - -3. MacOS X - -Installing on Mac OS X requires moving the .ttf files to either -/Library/Fonts/ or ~/Library/Fonts/ depending on whether they should be -available to all users on your system or just to yourself. - -$Id: INSTALL,v 1.3 2008/02/14 23:36:28 Stevan_White Exp $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/README b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/README deleted file mode 100644 index 11cf2e24..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20080323/README +++ /dev/null @@ -1,149 +0,0 @@ --*-text-*- - -Summary: This project aims to provide a set of free scalable (i.e., OpenType) -fonts covering the ISO 10646/Unicode UCS (Universal Character Set). - - -WHY DO WE NEED FREE SCALABLE UCS FONTS? - -A large number of free software users switched from free X11 bitmapped -fonts to proprietary Microsoft TrueType fonts, as -a) they used to be freely downloaded from Microsoft Typography page -, -b) they contain a decent subset of the ISO 10646 UCS (Universal Character Set), -c) they are high-quality, well hinted scalable TrueType fonts, and -d) Freetype , a free, high quality TrueType font -renderer been integrated into the latest release of XFree86, -the free X11 server. - -Building a dependence on non-free software, even a niche one like fonts, -is dangerous. Microsoft TrueType core fonts are not free, they are just -costless. For now, at least. Citing the TrueType core fonts for the Web -FAQ : -"You may only redistribute the fonts in their original form (.exe or -.sit.hqx) and with their original file name from your Web site or -intranet site. You must not supply the fonts, or any derivative fonts -based on them, in any form that adds value to commercial products, -such as CD-ROM or disk based multimedia programs, application software -or utilities." As of August 2002, however, the fonts are not anymore -available from the Microsoft Web site, which makes the situation clearer. - -Aren't there any free high-quality scalable fonts? Yes, there are. -The Bitstream Vera fonts were made public, and are now maintained as -the DejaVu fonts family. -URW++, a German digital type foundry, released their own version of the -35 PostScript Type 1 core fonts under GPL as their donation to the -Ghostscript project . -The Wadalab Kanji committee has produced Type 1 font files with thousands of -filigree Japanese glyphs . -Yannis Haralambous has drawn beautiful glyphs for the Omega typesetting -system . -And so on. Scattered around the Internet there are numerous other free -resources for other national scripts, many of them aiming to be a suitable -match for Latin fonts like Times or Helvetica. - - -WHAT DO WE PLAN TO ACHIEVE, AND HOW? - -Our aim is to collect available resources, fill in the missing pieces, -and provide a set of free high-quality scalable (OpenType) UCS fonts, -released under GNU General Public License. - -Free UCS scalable fonts will cover the following character sets - -* ISO 8859 parts 1-15 -* CEN MES-3 European Unicode Subset - http://www.evertype.com/standards/iso10646/pdf/cwa13873.pdf -* IBM/Microsoft code pages 437, 850, 852, 1250, 1252 and more -* Microsoft/Adobe Windows Glyph List 4 (WGL4) - http://www.microsoft.com/typography/otspec/WGL4.htm -* KOI8-R and KOI8-RU -* DEC VT100 graphics symbols -* International Phonetic Alphabet -* Arabic, Hebrew, Armenian, Georgian, Ethiopian, Thai and Lao alphabets, - including Arabic presentation forms A/B -* Japanese Katakana and Hiragana -* mathematical symbols, including the whole TeX repertoire of symbols -* APL symbols - etc. - -A free outline font editor, George Williams's FontForge - will be used for creating new glyphs. -Rogier van Dalen's TrueType/OpenType utilities -http://home.kabelfoon.nl/~slam/fonts/ -will be used for instructing TrueType fonts and compiling OpenType tables. - -DESIGN ISSUES - -Which font shapes should be made? As historical style terms like -Renaissance or Baroque letterforms cannot be applied beyond -Latin/Cyrillic/Greek scripts to any greater extent than Kufi or Nashki -can be applied beyond Arabic script, a smaller subset of styles will -be made: one monospaced - FreeMono - and two proportional (one with -uniform stroke - FreeSans - and one with modulated - FreeSerif) -will be made at the start. - -These minimal style requirements allow the typefaces to preserve -the same characteristic spirit regardless of the scripts, so that the -font will be a harmonic unity. Some design notes on individual typefaces -are available. - -In the beginning, however, we don't believe that TrueType hinting will -be good enough to compete with either the hand-crafted bitmapped fonts at -small sizes, or with commercial TrueType fonts. - - -LICENSING - -Free UCS scalable fonts is free software; you can redistribute it -and/or modify it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The fonts are distributed in the hope that they will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. - -As a special exception, if you create a document which uses this font, -and embed this font or unaltered portions of this font into the -document, this font does not by itself cause the resulting document to -be covered by the GNU General Public License. This exception does not -however invalidate any other reasons why the document might be covered -by the GNU General Public License. If you modify this font, you may -extend this exception to your version of the font, but you are not -obligated to do so. If you do not wish to do so, delete this exception -statement from your version. - - -WHAT DO THE FILE SUFFIXES MEAN? - -The files with .sfd (Spline Font Database) are in FontForge's native -format. Please use these if you plan to modify the font files. -FontForge can export these to mostly any existing font file format. - -TrueType fonts for immediate consumption are the files with the .ttf -(TrueType Font) suffix. You can use them directly, e.g. with the X -font server. - -The files with .ps (PostScript) suffix are not font files at all - -they are merely PostScript files with glyph tables, which can be used -for overview, which glyphs are contained in which font file. - -You may have noticed the lack of PostScript Type 1 (.pfa/.pfb) font files. -Type 1 format does not support large (> 256) encoding vectors, so they -can not be used with ISO 10646 encoding. If your printer supports it, -you can use Type 0 format, though. Please use FontForge for conversion -to Type 0. - - -Primoz Peterlin, -update by Steve White - -Free UCS scalable fonts: http://savannah.gnu.org/projects/freefont/ -$Id: README,v 1.4 2008/02/11 20:06:16 Stevan_White Exp $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/AUTHORS b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/AUTHORS deleted file mode 100644 index 4148c935..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/AUTHORS +++ /dev/null @@ -1,208 +0,0 @@ --*- mode:text; coding:utf-8; -*- - GNU FreeFont Authors - ==================== - -The FreeFont collection is being maintained by - Steve White -The folowing list cites the other contributors that contributed to -particular ISO 10646 blocks. - -* URW++ Design & Development GmbH - - Basic Latin (U+0041-U+007A) - Latin-1 Supplement (U+00C0-U+00FF) (most) - Latin Extended-A (U+0100-U+017F) - Spacing Modifier Letters (U+02B0-U+02FF) - Mathematical Operators (U+2200-U+22FF) (parts) - Block Elements (U+2580-U+259F) - Dingbats (U+2700-U+27BF) - -* Yannis Haralambous and John - Plaice - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - Greek (U+0370-U+03FF) - Armenian (U+0530-U+058F) - Hebrew (U+0590-U+05FF) - Arabic (U+0600-U+06FF) - Currency Symbols (U+20A0-U+20CF) - Arabic Presentation Forms-A (U+FB50-U+FDFF) - Arabic Presentation Forms-B (U+FE70-U+FEFF) - -* Young U. Ryu - - Arrows (U+2190-U+21FF) - Mathematical Symbols (U+2200-U+22FF) - Mathematical Alphanumeric Symbols (U+1D400-U+1D7FF) - -* Valek Filippov - - Cyrillic (U+0400-U+04FF) - -* Wadalab Kanji Comittee - - Hiragana (U+3040-U+309F) - Katakana (U+30A0-U+30FF) - -* Angelo Haritsis - - Greek (U+0370-U+03FF) - -* Yannis Haralambous and Virach Sornlertlamvanich - - Thai (U+0E00-U+0E7F) - -* Shaheed R. Haque - - Bengali (U+0980-U+09FF) - -* Sam Stepanyan - - Armenian (U+0530-U+058F) - -* Mohamed Ishan - - Thaana (U+0780-U+07BF) - -* Sushant Kumar Dash - - Oriya (U+0B00-U+0B7F) - -* Harsh Kumar - - Devanagari (U+0900-U+097F) - Bengali (U+0980-U+09FF) - Gurmukhi (U+0A00-U+0A7F) - Gujarati (U+0A80-U+0AFF) - -* Prasad A. Chodavarapu - - Telugu (U+0C00-U+0C7F) - -* Frans Velthuis and Anshuman Pandey - - - Devanagari (U+0900-U+097F) - -* Hardip Singh Pannu - - Gurmukhi (U+0A00-U+0A7F) - -* Jeroen Hellingman - - Oriya (U+0B00-U+0B7F) - Malayalam (U+0D00-U+0D7F) - -* Thomas Ridgeway - - Tamil (U+0B80-U+0BFF) - -* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, - Prof. Dr. Manfred Kudlek , Olaf - Kummer , and Jochen Metzinger - - Ethiopic (U+1200-U+137F) - -* Maxim Iorsh - - Hebrew (U+0590-U+05FF) - -* Vyacheslav Dikonov - - Syriac (U+0700-U+074A) - Braille (U+2800-U+28FF) - -* Panayotis Katsaloulis - - Greek Extended (U+1F00-U+1FFF) - -* M.S. Sridhar - - Devanagari (U+0900-U+097F) - Bengali (U+0980-U+09FF) - Gurmukhi (U+0A00-U+0A7F) - Gujarati (U+0A80-U+0AFF) - Oriya (U+0B00-U+0B7F) - Tamil (U+0B80-U+0BFF) - Telugu (U+0C00-U+0C7F) - Kannada (U+0C80-U+0CFF) - Malayalam (U+0D00-U+0D7F) - -* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt - - - Sinhala (U+0D80-U+0DFF) - -* Dan Shurovich Chirkov - - Cyrillic (U+0400-U+04FF) - -* Abbas Izad - - Arabic (U+0600-U+06FF) - Arabic Presentation Forms-A (U+FB50-U+FDFF) - Arabic Presentation Forms-B (U+FE70-U+FEFF) - -* Denis Jacquerye - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - -* K.H. Hussain and R. Chitrajan - - Malayalam (U+0D00-U+0D7F) - -* Solaiman Karim and Omi Azad - - Bengali (U+0980-U+09FF) - -* Sonali Sonania and Monika Shah - - - Devanagari (U+0900-U+097F) - Gujarati (U+0A80-U+0AFF) - -* Pravin Satpute , Bageshri Salvi - , Rahul Bhalerao and Sandeep Shedmake - - Devanagari (U+0900-U+097F) - Gujarati (U+0A80-U+0AFF) - Oriya (U+0B00-U+0B7F) - Malayalam (U+0D00-U+0D7F) - Tamil (U+0B80-U+0BFF) - -* Kulbir Singh Thind - - Gurmukhi (U+0A00-U+0A7F) - -* Gia Shervashidze - - Georgian (U+10A0-U+10FF) - -* Daniel Johnson - - Cherokee (U+13A0-U+13FF) - -* George Douros - - Gothic (U+10330-U+1034F) - Phoenecian (U+10900-U+1091F) - Byzantine Musical Symbols (U+1D000-U+1D0FF) - Western Musical Symbols (U+1D100-U+1D1DF) - Mathematical Alphanumeric Symbols (U+1D400-U+1D7FF) - Mah Jong Tiles (U+1F000-U+1F02B) - Dominoes (U+1F030-U+1F093) - -* Steve White - Coptic (U+2C80-U+2CFF) - -* Primož Peterlin - maintained FreeFont for several years, and is thanked for all his work. - -Please see the CREDITS file for details on who contributed particular -subsets of the glyphs in font files. - --------------------------------------------------------------------------- -$Id: AUTHORS,v 1.18 2009/01/04 15:57:54 Stevan_White Exp $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/COPYING b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/COPYING deleted file mode 100644 index 94a9ed02..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/CREDITS b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/CREDITS deleted file mode 100644 index 0f47440d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/CREDITS +++ /dev/null @@ -1,528 +0,0 @@ --*- mode:text; coding:utf-8; -*- - GNU FreeFont Credits - ==================== - -This file lists contributors and contributions to the GNU FreeFont project. - - -* URW++ Design & Development GmbH - -URW++ donated a set of 35 core PostScript Type 1 fonts to the -Ghostscript project , to be available -under the terms of GNU General Public License (GPL). - - Basic Latin (U+0041-U+007A) - Latin-1 Supplement (U+00C0-U+00FF) - Latin Extended-A (U+0100-U+017F) - Spacing Modifier Letters (U+02B0-U+02FF) - Mathematical Operators (U+2200-U+22FF) - Block Elements (U+2580-U+259F) - Dingbats (U+2700-U+27BF) - - -* Yannis Haralambous and John - Plaice - -Yannis Haralambous and John Plaice are the authors of Omega typesetting -system, . Omega is an extension of TeX. -Its first release, aims primarily at improving TeX's multilingual abilities. -In Omega all characters and pointers into data-structures are 16-bit wide, -instead of 8-bit, thereby eliminating many of the trivial limitations of TeX. -Omega also allows multiple input and output character sets, and uses -programmable filters to translate from one encoding to another, to perform -contextual analysis, etc. Internally, Omega uses the universal 16-bit Unicode -standard character set, based on ISO-10646. These improvements not only make -it a lot easier for TeX users to cope with multiple or complex languages, -like Arabic, Indic, Khmer, Chinese, Japanese or Korean, in one document, but -will also form the basis for future developments in other areas, such as -native color support and hypertext features. ... Fonts for UT1 (omlgc family) -and UT2 (omah family) are under development: these fonts are in PostScript -format and visually close to Times and Helvetica font families. -Omega fonts are available subject to GPL - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - Greek (U+0370-U+03FF) - Armenian (U+0530-U+058F) - Hebrew (U+0590-U+05FF) - Arabic (U+0600-U+06FF) - Currency Symbols (U+20A0-U+20CF) - Arabic Presentation Forms-A (U+FB50-U+FDFF) - Arabic Presentation Forms-B (U+FE70-U+FEFF) - -Current info: - -* Valek Filippov - -Valek Filippov added Cyrillic glyphs and composite Latin Extended A to -the whole set of the abovementioned URW set of 35 PostScript core fonts, -. The fonts are available under GPL. - - Latin Extended-A (U+0100-U+017F) - Cyrillic (U+0400-U+04FF) - - -* Wadalab Kanji Comittee - -Between April 1990 and March 1992, Wadalab Kanji Comittee put together -a series of scalable font files with Japanese scripts, in four forms: -Sai Micho, Chu Mincho, Cho Kaku and Saimaru. The font files are -written in custom file format, while tools for conversion into -Metafont and PostScript Type 1 are also supplied. The Wadalab Kanji -Comittee has later been dismissed, and the resulting files can be now -found on the FTP server of the Depertment of Mathematical Engineering -and Information Physics, Faculty of Engineering, University of Tokyo -. - - Hiragana (U+3040-U+309F) - Katakana (U+30A0-U+30FF) - - -* Young U. Ryu - -Young Ryu is the author of Txfonts, a set of mathematical symbols -designed to accompany text typeset in Times or its variants. In the -documentation, Young adresses the design of mathematical symbols: "The -Adobe Times fonts are thicker than the CM fonts. Designing math fonts -for Times based on the rule thickness of Times = , , + , / , < , -etc. would result in too thick math symbols, in my opinion. In the TX -fonts, these glyphs are thinner than those of original Times -fonts. That is, the rule thickness of these glyphs is around 85% of -that of the Times fonts, but still thicker than that of the CM fonts." -TX fonts are are distributed under the GNU public license (GPL). -. - - Arrows (U+2190-U+21FF) - Mathematical Symbols (U+2200-U+22FF) - - -* Angelo Haritsis - -Angelo Haritsis has compiled a set of Greek Type 1 fonts, available on -. -The glyphs from this source has been used to compose Greek glyphs in -FreeSans and FreeMono. - -Angelo's licence says: "You can enjoy free use of these fonts for -educational or commercial purposes. All derived works should include -this paragraph. If you want to change something please let me have -your changes (via email) so that they can go into the next -version. You can also send comments etc to the above address." - - Greek (U+0370-U+03FF) - - -* Yannis Haralambous and Virach Sornlertlamvanich - -In 1999, Yannis Haralambous and Virach Sornlertlamvanich made a set of -glyphs covering the Thai national standard Nf3, in both upright and -slanted shape. The collection of glyphs have been made part of GNU -intlfonts 1.2 package and is available under the GPL at -. - - Thai (U+0E00-U+0E7F) - - -* Shaheed R. Haque - -Shaheed Haque has developed a basic set of basic Bengali glyphs -(without ligatures), using ISO10646 encoding. They are available under -the XFree86 license at . - -Copyright (C) 2001 S.R.Haque . All Rights Reserved. - -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 S.R.HAQUE 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. - -Except as contained in this notice, the name of S.R.Haque shall not be -used in advertising or otherwise to promote the sale, use or other -dealings in this Software without prior written authorization from -S.R.Haque. - - Bengali (U+0980-U+09FF) - - -* Sam Stepanyan - -Sam Stepanyan created a set of Armenian sans serif glyphs visually -compatible with Helvetica or Arial. Available on -. On -2002-01-24, Sam writes: "Arial Armenian font is free for -non-commercial use, so it is OK to use under GPL license." - - Armenian (U+0530-U+058F) - - -* Mohamed Ishan - -Mohamed Ishan has started a Thaana Unicode Project - and among other things created a -couple of Thaana fonts, available under FDL or BDF license. - - Thaana (U+0780-U+07BF) - - -* Sushant Kumar Dash (*) - -Sushant Dash has created a font in his mother tongue, Oriya. As he -states on his web page : -"Please feel free to foreword this mail to your Oriya friends. No -copyright law is applied for this font. It is totally free!!! Feel -free to modify this using any font editing tools. This is designed for -people like me, who are away from Orissa and want to write letters -home using Computers, but suffer due to unavailability of Oriya -fonts.(Or the cost of the available packages are too much)." - - Oriya (U+0B00-U+0B7F) - - -* Harsh Kumar - -Harsh Kumar has started BharatBhasha - -an effort to provide "FREE software, Tutorial, Source Codes -etc. available for working in Hindi, Marathi, Gujarati, Gurmukhi and -Bangla. You can type text, write Web pages or develop Indian Languages -Applications on Windows and on Linux. We also offer FREE help to -users, enthusiasts and software developers for their work in Indian -languages." - - Devanagari (U+0900-U+097F) - Bengali (U+0980-U+09FF) - Gurmukhi (U+0A00-U+0A7F) - Gujarati (U+0A80-U+0AFF) - - -* Prasad A. Chodavarapu - -Prasad A. Chodavarapu created Tikkana, a Telugu font available in Type -1 and TrueType format on . -Tikkana exceeds the Unicode Telugu range with some composite glyphs. -Available under the GNU General Public License. - - Telugu (U+0C00-U+0C7F) - - -* Frans Velthuis and Anshuman Pandey - - -In 1991, Frans Velthuis from the Groningen University, The -Netherlands, released a Devanagari font as Metafont source, available -under the terms of GNU GPL. Later, Anshuman Pandey from the Washington -University, Seattle, USA, took over the maintenance of font. Fonts can -be found on CTAN, . I -converted the font to Type 1 format using Péter Szabó's TeXtrace -program and removed some -redundant control points with PfaEdit. - - Devanagari (U+0900-U+097F) - - -* Hardip Singh Pannu - -In 1991, Hardip Singh Pannu has created a free Gurmukhi TrueType font, -available as regular, bold, oblique and bold oblique form. Its license -says "Please remember that these fonts are copyrighted (by me) and are -for non-profit use only." - - Gurmukhi (U+0A00-U+0A7F) - - -* Jeroen Hellingman - -Jeroen Hellingman created a set of Malayalam metafonts in 1994, and a -set of Oriya metafonts in 1996. Malayalam fonts were created as -uniform stroke only, while Oriya metafonts exist in both uniform and -modulated stroke. From private communication: "It is my intention to -release the fonts under GPL, but not all copies around have this -notice on them." Metafonts can be found on CTAN, - and -. - - Oriya (U+0B00-U+0B7F) - Malayalam (U+0D00-U+0D7F) - - -* Thomas Ridgeway <> (*) - -Thomas Ridgeway, then at the Humanities And Arts Computing Center, -Washington University, Seattle, USA, (now defunct), created a Tamil -metafont in 1990. Anshuman Pandey from the same university took over -the maintenance of font. Fonts can be found at CTAN, -. - - Tamil (U+0B80-U+0BFF) - - -* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, - Prof. Dr. Manfred Kudlek , Olaf - Kummer , and Jochen Metzinger - -Beyene, Kudlek, Kummer and Metzinger from the Theoretical Foundations -of Computer Science, University of Hamburg, prepared a set of Ethiopic -metafonts, found on -. They also -maintain home page on the Ethiopic font project, -, -and can be reached at . The current -version of fonts is 0.7 (1998), and they are released under GNU GPL. I -converted the fonts to Type 1 format using Péter Szabó's TeXtrace-A -program and removed some -redundant control points with PfaEdit. - - Ethiopic (U+1200-U+137F) - - -* Maxim Iorsh - -In 2002, Maxim Iorsh started the Culmus project, aiming at providing -Hebrew-speaking Linux and Unix community with a basic collection of -Hebrew fonts for X Windows. The fonts are visually compatible with -URW++ Century Schoolbook L, URW++ Nimbus Sans L and URW++ Nimbus Mono -L families, respectively, and are released under GNU GPL license. See -also . - - Hebrew (U+0590-U+05FF) - - -* Panayotis Katsaloulis - -Panayotis Katsaloulis helped fixing Greek accents in the Greek -Extended area. - - Greek Extended (U+1F00-U+1FFF) - - -* Vyacheslav Dikonov - -Vyacheslav Dikonov made a Braille unicode font that could be merged -with the UCS fonts to fill the 2800-28FF range completely. (uniform -scaling is possible to adapt it to any cell size). He also contributed -a free syriac font, whose glyphs (about half of them) are borrowed -from the "Carlo Ator" font freely downloadable from -. Vyacheslav also filled in a few missing -spots in the U+2000-U+27FF area, e.g. the box drawing section, sets of -subscript and superscript digits and capital Roman numbers. - - Syriac (U+0700-U+074A) - Box Drawing (U+2500-U+257F) - Braille (U+2800-U+28FF) - - -* M.S. Sridhar - -M/S Cyberscape Multimedia Limited, Mumbai, developers of Akruti -Software for Indian Languages (http://www.akruti.com/), have released -a set of TTF fonts for nine Indian scripts (Devanagari, Gujarati, -Telugu, Tamil, Malayalam, Kannada, Bengali, Oriya, and Gurumukhi) -under the GNU General Public License (GPL). You can download the fonts -from the Free Software Foundation of India WWW site -(http://www.gnu.org.in/akruti-fonts/) or from the Akruti website. - -For any further information or assistance regarding these fonts, -please contact mssridhar AT vsnl.com. - - Devanagari (U+0900-U+097F) - Bengali (U+0980-U+09FF) - Gurmukhi (U+0A00-U+0A7F) - Gujarati (U+0A80-U+0AFF) - Oriya (U+0B00-U+0B7F) - Tamil (U+0B80-U+0BFF) - Telugu (U+0C00-U+0C7F) - Kannada (U+0C80-U+0CFF) - Malayalam (U+0D00-U+0D7F) - - -* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt - - -Noah Levitt found out that the Sinhalese fonts available on the site - are released under GNU GPL, or, -precisely, "Public Domain under GNU Licence Produced by DMS -Electronics for The Sri Lanka Tipitaka Project" (taken from the font -comment), and took the effort of recoding the font to Unicode. - - Sinhala (U+0D80-U+0DFF) - - -* Daniel Shurovich Chirkov - -Dan Chirkov updated the FreeSerif font with the missing Cyrillic -glyphs needed for conformance to Unicode 3.2. The effort is part of -the Slavjanskij package for Mac OS X, -. - - Cyrillic (U+0400-U+04FF) - - -* Denis Jacquerye - -Denis Jacquerye added new glyphs and corrected existing ones in the -Latin Extended-B and IPA Extensions ranges. - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - - -* K.H. Hussain and R. Chitrajan - -`Rachana' in Malayalam means `to write', `to create'. Rachana Akshara Vedi, -a team of socially committed information technology professionals and -philologists, has applied developments in computer technology and desktop -publishing to resurrect the Malayalam language from the disorder, -fragmentation and degeneration it had suffered since the attempt to adapt -the Malayalam script for using with a regular mechanical typewriter, which -took place in 1967-69. K.H. Hussein at the Kerala Forest Research Institute -has released "Rachana Normal" fonts with approximately 900 glyphs required -to typeset traditional Malayalam. R. Chitrajan apparently encoded the -glyphs in the OpenType table. - -In 2008, the Malayalam ranges in FreeSerif were updated under the advise -and supervision of Hiran Venugopalan of Swathanthra Malayalam Computing, -to reflect the revised edition Rachana_04. - - Malayalam (U+0D00-U+0D7F) - - -* Solaiman Karim - - Bengali (U+0980-U+09FF) - -Solaiman Karim has developed several OpenType Bangla fonts and -released them under GNU GPL on . - - -* Sonali Sonania and Monika Shah - - - Devanagari (U+0900-U+097F) - Gujarati (U+0A80-U+0AFF) - -Glyphs were drawn by Cyberscape Multimedia Ltd., #101,Mahalakshmi -Mansion 21st Main 22nd "A" Cross Banashankari 2nd stage Banglore -560070, India. Converted to OTF by IndicTrans Team, Powai, Mumbai, -lead by Prof. Jitendra Shah. Maintained by Monika Shah and Sonali -Sonania of janabhaaratii Team, C-DAC, Mumbai. This font is released -under GPL by Dr. Alka Irani and Prof Jitendra Shah, janabhaaratii -Team, C-DAC, Mumabi. janabhaaratii is localisation project at C-DAC -Mumbai (formerly National Centre for Software Technology); funded by -TDIL, Govt. of India. Contact:monika_shah AT lycos.com, -sonalisonania AT yahoo.com, jitendras AT vsnl.com, alka AT ncst.ernet.in. -website: www.janabhaaratii.org.in. - - -* Pravin Satpute , Bageshri Salvi - , Rahul Bhalerao and Sandeep Shedmake - - Devanagari (U+0900-U+097F) - Gujarati (U+0A80-U+0AFF) - Oriya (U+0B00-U+0B7F) - Malayalam (U+0D00-U+0D7F) - Tamil (U+0B80-U+0BFF) - -In December 2005 the team at www.gnowledge.org released a set of two -Unicode pan-Indic fonts: "Samyak" and "Samyak Sans". "Samyak" font -belongs to serif style and is an original work of the team; "Samyak -Sans" font belongs to sans serif style and is actually a compilation -of already released Indic fonts (Gargi, Padma, Mukti, Utkal, Akruti -and ThendralUni). Both fonts are based on Unicode standard. You can -download the font files (released under GNU/GPL License) from -http://www.gnowledge.org/Gnoware/localization/font.htm - - -* Kulbir Singh Thind - - Gurmukhi (U+0A00-U+0A7F) - -Dr. Kulbir Singh Thind designed a set of Gurmukhi Unicode fonts, -AnmolUni and AnmolUni-Bold, which are available under the terms of GNU -Generel Public Licens from the Punjabu Computing Resource Center, -http://guca.sourceforge.net/typography/fonts/anmoluni/. - - -* Gia Shervashidze - - Georgian (U+10A0-U+10FF) - -Starting in mid-1990s, Gia Shervashidze designed many -Unicode-compliant Georgian fonts: Times New Roman Georgian, Arial -Georgian, Courier New Georgian. His work on Georgian localization can -be reached at http://www.gia.ge/. - - -* Primož Peterlin - -Primož Peterlin filled in missing glyphs here and there (e.g. Latin -Extended-B and IPA Extensions ranges in the FreeMono familiy), and -created the following UCS blocks: - - Latin Extended-B (U+0180-U+024F) - IPA Extensions (U+0250-U+02AF) - Arrows (U+2190-U+21FF) - Box Drawing (U+2500-U+257F) - Block Elements (U+2580-U+259F) - Geometrical Shapes (U+25A0-U+25FF) - -* Mark Williamson - -Made the MPH 2 Damase font, from which - Hanunóo (U+1720-U+173F) - Buginese (U+1A00-U+1A1F) - Tai Le (U+1950-U+197F) - Ugaritic (U+10380-U+1039F) - Old Persian (U+103A0-U+103DF) - -* Jacob Poon - -Submitted a very thorough survey of glyph problems and other suggestions. - -* Alexey Kryukov - -Made the TemporaLCGUni fonts, based on the URW++ fonts, from which at one -point FreeSerif Cyrillic, and some of the Greek, was drawn. He also provided -valuable direction about Cyrillic and Greek typesetting. - -* George Douros - -The creator of several fonts focusing on ancient scripts and symbols. -Many of the glyphs are created by making outlines from scanned images -of ancient sources. - - Aegean: Phoenecian - Analecta: Gothic (U+10330-U+1034F) - Musical: Byzantine & Western - Unicode: many Miscellaneous Symbols, Miscellaneous Technical, - supplemental Symbols, and Mathematical Alphanumeric symbols, - Mah Jong, and the outline of the Domino. - -* Daniel Johnson - -Created by hand a Cherokee range specially for FreeFont to be "in line with -the classic Cherokee typefaces used in 19th century printing", but also to -fit well with ranges previously in FreeFont. - Cherokee (U+13A0-U+13FF) - -Notes: - -*: The glyph collection looks license-compatible, but its author has - not yet replied and agreed on their work being used in part of - this glyph collection. - --------------------------------------------------------------------------- -$Id: CREDITS,v 1.23 2009/01/04 15:57:54 Stevan_White Exp $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/ChangeLog b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/ChangeLog deleted file mode 100644 index d5345d02..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/ChangeLog +++ /dev/null @@ -1,4525 +0,0 @@ -$Id: ChangeLog,v 1.254 2009/01/04 16:12:59 Stevan_White Exp $ -2009-01-04 Stevan_White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added 2009 to copyright dates - - * AUTHORS, CREDITS: - - Removed Glagolitic range author - - * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added some TrueType names - -2009-01-01 Stevan_White - * FreeSerif.sfd: - - Removde Glagolitic range, since have not (yet) received OK from author. - - Added some TrueType Names - -2008-12-31 Stevan_White - * COPYING: - - Updated license to GPL v3 - -2008-12-30 Stevan_White - * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Oblique versions of Daniel Johnson's Cherokee. - - * FreeSerifBold.sfd: - - Cherokee Bold range from Daniel Johnson. - -2008-12-27 Stevan_White - * isMonoMono.py: - - 900 EM -> 800 - - * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: - - Made glyphs to lie between -200 and 800 EM - - * isMonoMono.py: - - check that glyphs lie in vertical bounding boxes - - * FreeMono.sfd, FreeSerif.sfd: - - Extensible bracket characters didn't exactly line up. Fixed. - Mono: a couple of glyphs had gotten out of their bounding boxes again. - -2008-12-26 Stevan_White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Final pre-release cleanup - - * FreeSerif.sfd: - - Buginese vowel u was misnamed - - * FreeMono.sfd: - - Yatcyrillic somehow was a mark character ... fixed - - * FreeSans.sfd, FreeSansOblique.sfd: - - Had to un-link references in - Sans: uni02B2, uni02B5 - SansOblique: uni0363 - because validation of the TTF file said the glyph - "is drawn in wrong direction" - I would have preferred to have understand this... - - * Makefile: - - Added quick test for FontForge version. - - * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: - - Removed kerning tables (?? what were they doing here anyway??) - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Kerning tables for Thai. - Handles one common case: short letter followed by a tall one with - an overhang to the left. - -2008-12-25 Stevan_White - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: - - More putzing with kerning tables - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Copied kerning classes - Serif -> SerifBold - SerifItalic -> SerifBoldItalic - Sans -> SansOblique SansBold SansBoldOblique - Some associated naming of characters, etc - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Additions and correction in Spacing Modifier letters and IPA Extensions - -2008-12-23 Stevan_White - * FreeSerif.sfd: - - Applied patch to Cherokee range - -2008-12-20 Stevan_White - * FreeSerif.sfd, FreeSerifItalic.sfd: - - Fixed kern classes that end in space (crashes FontForge) - - * FreeSerifItalic.sfd, FreeSerif.sfd: - - kerning - -2008-12-19 Stevan_White - * FreeSerifItalic.sfd: - - kerning - - * FreeSerif.sfd: - - kerning - Some adjustments to Glagolitc spacing, mark positioning - -2008-12-18 Stevan_White - * FreeSerif.sfd, FreeSerifItalic.sfd: - - kerning - -2008-12-17 Stevan_White - * FreeSerif.sfd, FreeSerifItalic.sfd: - - kerning - -2008-12-11 Stevan_White - * FreeSans.sfd, FreeSerif.sfd: - - kerning - -2008-12-10 Stevan_White - * FreeSans.sfd, FreeSansBold.sfd: - - kerning - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd: - - kerning - -2008-12-09 Stevan_White - * FreeSerif.sfd, FreeSerifItalic.sfd: - - kerning - -2008-12-08 Stevan_White - * FreeSansOblique.sfd: - - Slanted small final sigma. Remedies - bug #24993: U+03C2 "Greek small letter final sigma" not slanted in - Free Sans Oblique - https://savannah.gnu.org/bugs/index.php?24993 - -2008-12-07 Stevan_White - * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - kerning, etc - -2008-12-06 Stevan_White - * FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: - - kerning - Tweek in Sans having to do with addition of Latin Extended - -2008-12-05 Stevan_White - * FreeSansBold.sfd, FreeSansBoldOblique.sfd: - - Tweeks to Latin Extended Additional - - * FreeSansBoldOblique.sfd: - - Added Latin Extended Additional range - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Extra space at end of kern class names has bad effect on FornForge - script that try to run through kern classes. Some FontForge call - corrupts memory. - Got rid of extra space. - -2008-12-02 Stevan_White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Replaced U+0387 GREEK ANO TELEIA with top dot of colon. - See bug #24987: U+0387 GREEK ANO TELEIA too low - https://savannah.gnu.org/bugs/index.php?24987 - - * FreeSerif.sfd: - - more kerning in Cyrillic (broke into two tables of classes) - -2008-12-01 Stevan_White - * FreeSerif.sfd: - - tweeks to kernin - - * FreeSerifBoldItalic.sfd: - - kerning - -2008-11-30 Stevan_White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Kerning for Latin and Cyrillic fairly complete in Serif faces. - Complete in sense that it looks pretty good under Pango for - English French German Spanish Polish Czech Latvian - But have not done Vietnamese (will require many more entries). - I adjust roman and italic, then copy tables by hand to bold and - bolditalic. - Misgiving: bolditalic is much too crammed - Overall, I may have over-kerned. (A difficult temptation to master.) - - * FreeSerif.sfd, FreeSerifItalic.sfd: - - kerning - - * FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: - - kerning - In Serif, modified widths of some extended latin glyphs - -2008-11-29 Stevan_White - * FreeSerif.sfd: - - Broke Latin kerning subtable into four, hoping it will be easier to - understand and maintain. - - * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, - FreeSerifItalic.sfd, FreeSerifBold.sfd, FreeSansOblique.sfd, - FreeSans.sfd: - - kerninig - -2008-11-28 Stevan_White - * FreeSans.sfd, FreeSerif.sfd: - - more kerning; - made guillemot narrower - - * FreeSansOblique.sfd, FreeSerif.sfd: - - previous commit was incomplete - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Adjusted width of single quotes (and apostrophe) to be "punctuation width" - More fiddling with kerning. - -2008-11-27 Stevan_White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: - - much fiddling with kerning - -2008-11-26 Stevan_White - * FreeSerifBold.sfd: - - Basic kerning, named main Cyrillic letters - - * FreeSerifItalic.sfd: - - Basic Cyrillic kerning - - * FreeSerif.sfd: - - Tweeks to Cyrillic kerning - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd, Makefile: - - Much fiddling with kerning, tables, and generating fonts whose kerning - tables work with OpenOffice. - -2008-11-24 Stevan_White - * FreeSerif.sfd: - - regularized padding in Miscellaneous symbols. - At least within related ranges tried to make similar. - Made to validate - -2008-11-23 Stevan_White - * FreeSerif.sfd: - - Filled out Miscellaneous Symbols. Used George Douros' Unicode font. - Completed Miscellaneous Symbols, with some drawings from George Douros' - Unicode Symbols, and some of mine. - - * FreeMono.sfd, FreeMonoOblique.sfd: - - Replaced Greek Exteded psili and dasia with scaled versions of the - "bent quote" mark. I think it's distinctive enough, but not so silly. - - Remedies bug #22997: Mono: Greek Extended psili is ugly - https://savannah.gnu.org/bugs/?22997 - - * FreeSerif.sfd: - - Made some recycling symbols - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Finished with Hebrew Pointed letters in all faces. - -2008-11-22 Stevan_White - * FreeSans.sfd: - - Fiddled with Hebrew Pointed letters - - * FreeSerifItalic.sfd: - - Marks for Vietnamese - - * FreeSerif.sfd, FreeSerifItalic.sfd: - - Letter pe had strange thick middle ear that looked awful. lamed had ben - bumped at some point. Fixed. Adjusted some of the points. - -2008-11-21 Stevan_White - * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - repairs to Pointed Hebrew - - * FreeSerif.sfd: - - Numeral line positioning marks for Gothic - - * FreeSerifItalic.sfd: - - Added Combining Marks for Symbols (some question about obliqueness of - some symbols) - Cleaned up some empty glyphs in Pointed Hebrew. - -2008-11-20 Stevan_White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Provided Hebrew pointed letters, with lookups, for all Serif faces. - -2008-11-19 Stevan_White - * FreeSerifBoldItalic.sfd: - - renamed Hebrew lookups - - * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Completed Hebrew in Bold faces. - - * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: - - More tweeks to Hebrew points - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: - - Adjustments corrections and additions to Hebrew points - -2008-11-18 Stevan_White - * FreeSansBold.sfd: - - Cleaned out a lot of ridiculous kernings - -2008-11-17 Stevan_White - * FreeSansBoldOblique.sfd: - - fiddled with Armenian ligatures - - * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Added Armenian (with ligatures) to BoldOblique - Fiddled with character spacing - -2008-11-16 Stevan_White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added U+01f9 and paragraph end marker to Georgian - Fiddled with Armenian ligatures - -2008-11-15 Stevan_White - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Another pass at letter spacing in Cyrillic. - Also went through ancient letters. - - Added Georgian paragraph separator 10FB - Added Georgian turned gan 10F9 (because it was easy) - - Re-worked letter spacing through modern Cyrillic range. - - * FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd: - - Letter spacing - -2008-11-14 Stevan_White - * FreeSerif.sfd: - - Added several characters to Cyrillic Extended-B - - * FreeSansBold.sfd, FreeSansBoldOblique.sfd: - - Made Cyrillic hooked e U+04BC-F to look less goofy. - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Based on assertion on Pechatnyj Dvor's web site, Cyrillic Fita - U+0472-3 and "Barred O" U+04E8-9 are different styles the same letter, - and the fact that the tilde in the O never looked good in Sans, I - made them all barred O's. - - * FreeSerif.sfd: - - Added Cyrillic Yn, yn (U+a65e-f) - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Synced up Cyrillic and Combining Diacritics ranges, - Couple of tweeks in Gujarati to make TT validate - - * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Changes to older Cyrillic letters, in response to further information. - Made omegas, omegas with titlo, and OT to all be of the same size and - shape in Serif. - Un-linked Cyrillic Psi and psi from Greek, made squarer versions. - - Some more Cyrillic diacritical marks in Sans. Re-worked U+04bc-f . - Experimenting with mark positioning for Cyrillic - -2008-11-12 Stevan_White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Strove to make Euro look more like the EC logo design, while making - glyph fit better with the design of its face. Bug #3576: Euro design - https://savannah.gnu.org/bugs/?23576 - - * FreeSans.sfd, FreeSerif.sfd: - - Adjustments mostly to GPOS tables having to do with Vietnamese marks. - The WAZU Vietnamese test page looks pretty good in Sans now. - Still not thrilled with below-dot when it appears with a mark over - e.g. U+0102. Pango positions one or the other but not both. - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Extensive modification of GPOS lookup tables for mark positioning. - I think they're now all functional (except styled Mono faces have none). - Also added lots of marks to faces that didn't have them, and also - fiddled with Combining Diacritical Marks. - -2008-11-10 Stevan_White - * FreeSerif.sfd: - - Made one combining mark really combining - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Made a few combining characters to be zero-width in Mono, - Added them to other styles. - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Figured out why below marks in Thai weren't working in the lowest - letters. I think Pango and other font renderers ignore 'blwm'. - However, 'mark' works. - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Tweeks to Thai marks - -2008-11-09 Stevan_White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Several bugfixes in Thai, mostly having to do with mark placement and - ligatures. Implemented ru-saraaa and lu-saraaa with ligatures. - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - added and named dottedcircle (used by Pango to render - combining mark base) - - * FreeSerif.sfd: - - Tweeks to Coptic, after viewing more papyrus samples and web pages. - - * FreeSerif.sfd: - - Weight of Coptic small letters made to match that of Latin and Greek ones. - -2008-11-08 Stevan_White - * FreeSerif.sfd: - - Made Coptic to comply better with - http://www.wazu.jp/gallery/Test_Coptic.html - Made a flourish at foot of letters with long diagonal. - - More tweeks to Coptic; put in a mark lookup table. - - Note: for small letters I made scaled references to captials. - Results in those letters looking quite light next to the capitals and - next to small Latin letters. Also, there are a few variant forms for - capitals (Unicode samples don't show this). It would be good to - re-work - - Added Coptic alphabet in u+2C80-2CB1 and u+03E2-u+03EF, drawn/built by - me, based on Unicode samples, TeX font copte, and scans at WikiPedia. - -2008-11-07 Stevan_White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Further tweeks to dieresis in Greek and Cyrillic - - * FreeSerif.sfd: - - replaced Greek I dieresis with references, tweeked height of dieresis. - -2008-11-04 Stevan_White - * FreeSerif.sfd: - - Added a few Cyrillic Extended-B letters seen in web pages while looking - for Glagolitic text. - - * FreeMono.sfd, FreeMonoOblique.sfd: - - Added a few old Cyrillic characters. - - * FreeSerif.sfd: - - Several corrections and tweeks to Glagolitic. - Still missing six slots from Unicode, but don't see them in the TeX - fonts. - On the other hand, several on-line Glagolitic pages (bibles etc) don't - seem to use these. Maybe it's OK as-is. - -2008-11-03 Stevan_White - * FreeSerif.sfd: - - Added lowercase range to Glagolitic, as a facile scaling of the - uppercase. - - Added letter to Glagolitic, scaled range. - -2008-11-02 Stevan_White - * FreeSerif.sfd: - - Replaced fraktur bold from Mathematical Alphanumeric Symbols with that - from TX Fonts by Young Ryu. - One concern: letter k is damaged (in both medium and bold). I just - hacked something up. - - Added Glagolitic "round type" font (Croation capitols only) from the - collection of Croatian fonts for LaTeX by Darko Zubrinić - ftp://ftp.dante.de/tex-archive/languages/croatian/ - http://www.tug.org/TUGboat/Articles/tb17-1/tb50zubr.pdf - - Several letters are missing besides the small letters. - - * FreeSerifBoldItalic.sfd: - - A couple of Thai references got obliqued twice. - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - By popular demand, removed 'ears' from Greek Upsilon and Psi. - Copied resulting glyphs to Serif Mathematical Alphanumeric Symbols. - - * FreeSerif.sfd: - - Some pointwise cleanup of main Tamil range - - Tried some things with lookups. Didn't make much headway. - -2008-11-01 Stevan_White - * FreeMono.sfd: - - somehow made a letter with wrong width - - * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added similar lookups and ligatures to Thai ranges. - - * FreeSerif.sfd: - - Lookups now work no worse than those for other Thai fonts, at least - in Pango. Still perplexed by behaviour of "Required" lookups. - - For Thai, made ligatures and lookups for yoying and thothan combined - with a lower vowel. These work well. - Attempted looksups for saraaa with ru and lu, and for saraam. - Not working. - - Cleaned up a few of the Bengali ligatures - - * FreeSerifBold.sfd: - - Tweek Thai - -2008-10-31 Stevan_White - * FreeSerif.sfd: - - Fixed ligatures and mark positioning for Hanunóo. - Problem with ligatures: Gnome pango doesn't do 'rlig', only 'liga' - - * FreeSerifItalic.sfd: - - Changed lookup table scripts for Devanagari and Bengali. - Find Problems -> ATT found several problems showing lookups acting on - glyphs that weren't listed in the script ranges, including dev2, bng2 - (why not deva and beng, I don't know). - - danda and doubledanda of Devanagari I understand are to be shared among - Indic scripts. So included bng2 and dev2 in the 'aalt' table for those. - - The 'init' and 'half' tables for Bengali made active for bng2. - - The 'locl' table for Bengali didn't do anything I could see: It mapped - the Devanagari danda to itself, and the doubledanda to itself. Deleted. - - Cleaned up some kern tables. - adjustments of under 5 EM are invisible. Some others I just didn't like. - Some were putting a letter beneath another, with is wrong. - - * FreeSerifBoldItalic.sfd: - - Added Thai - - * FreeSerifBold.sfd, FreeSerifItalic.sfd: - - Changes to mark positioning lookups, esp. in Italic. - Widened numerals in Bold - -2008-10-27 Stevan_White - * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Tweeks regarding Armenian and lookups - - * FreeSansBold.sfd: - - Added Armenian ligatures FB13-FB17 with lookups - Also made a historical ligature ('hlig') table for u+0587. - - Toward bug #15183: missing characters from Armenian range - https://savannah.gnu.org/bugs/index.php?15183 - - * FreeSansOblique.sfd: - - Added Armenian ligatures, lookups. Cleaned up contours. - - * FreeSans.sfd: - - Added 5 Armenian ligatures to U+FB13 – FB17, and made corresponding - 'liga' lookup. Found there one ligature u+0587 that according to - http://en.wikipedia.org/wiki/Armenian_alphabet - - "in new orthography the և character is not a typographical ligature anymore, and must never be treated as such. It is a distinct letter and has its place in the new alphabetic sequence." - So moved this out of the 'liga' lookup and into a new 'hlig' lookup. - -2008-10-26 Stevan_White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: - - Lots of improvements to Thai. - Completely revised letter spacing in Italic, and fiddled with combining - marks in all. - Still aren't working quite right, especially in Italic. - Still need to work over digits (in Bold they aren't even bold yet) - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: - - Bold Thai : added (painstakingly) constructed glyphs, lookups - roman Thai: tweeks - Italic Thai: tweeks (Note this still has multiple problems) - -2008-10-25 Stevan_White - * FreeSerif.sfd: - - WAZU says - http://www.wazu.jp/gallery/Fonts_Hanunoo.html - - MPH 2B Damase doesn't support the consonant-vowel ligatures necessary - to render Buhid writing. - - OK, so I made 'mark' lookups for combining marks and a bunch of - ligatures in an 'rlig' lookup. The latter still not working: - don't know why. - - Made page to match the example of the combining forms at - http://www.omniglot.com/writing/hanunoo.htm - -2008-10-24 Stevan_White - * FreeSerif.sfd: - - Removed some marks from Mathematical Alphanumeric Symbols - - * FreeSerif.sfd: - - Tweeked combining marks for Vietnamese. Made to satisfy - WAZU JAPAN Comprehensive Unicode Test Page for Vietnamese - http://www.wazu.jp/gallery/Test_Vietnamese.html - Could still use some tweeking... - - * FreeSerif.sfd: - - Added marks for composition of Vietnamese - - * FreeMono.sfd, FreeSerif.sfd: - - Put "below" combining mark on lots of vowels and derivatives, - for Vietnamese. - Named a bunch of composit Latin, expecting to make substitutions. - -2008-10-23 Stevan_White - * FreeSerif.sfd: - - Thai spacing alterations based on advice of a native speaker. - -2008-10-22 Stevan_White - * FreeSerif.sfd: - - re-named Thai lookups according to order - -2008-10-21 Stevan_White - * FreeSans.sfd: - - Cleanup of glyphs in Gujarati, Devanagari. - - Note: Serious problem with Sans GPOS abvm in Devanagari - "'abvm' Above Base Mark in Devanagari subtable" "gujr-0" - But all the characters that list gujr-0 are in Gujarati. - Not sure how this got broken or how to fix it. - - * FreeSerif.sfd: - - Fiddled with Thai mark positioning: passes my tests now OK. - Made a few more references in Math Symbols; more regularization of - stroke. - - * FreeSerif.sfd: - - Added mark class for Vietnamese "horn" - Several references made in General Punctuation, Arrows - - * FreeMono.sfd: - - added some Combining Diacritical Marks - -2008-10-20 Stevan_White - * FreeSerif.sfd: - - Made some references from serifed Latin capitals to Greek counterparts. - - * FreeSerif.sfd: - - Made a few repeated glyphs into references in Musical Symbols - -2008-10-19 Stevan_White - * FreeSerif.sfd: - - Moved several glypns from Mathematical Alphanumeric Symbols to - Letterlike Symbols. - Couple tweeks in Mathematical Symbols. - - * FreeMono.sfd, FreeSerif.sfd: - - Fiddling with Mathematical Symbols. - In Serif, trying to make stroke width more consistent. - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd: - - Added some Greek symbols in Mono and Sans to make a little more regular - and correspond better with TeX. - Tweek of serif. - - * FreeSansBold.sfd: - - a few more improvements. - - One problem with the Mathematical Alphanumeric area is, one must - remember to change it any time another face is altered... - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerifBold.sfd: - - Several improvements and additions to Sans faces (mostly in Greek) from - experience of pasting into FreeSerif Mathematical Alphanumeric Symbols. - - * FreeSerif.sfd: - - Replaced most of Mathematical Alphanumeric Symbols - roman italic bold (latin and greek) - gothic italic bold (latin and greek) - typewriter - and numerals - with glyphs from FreeFont. These were scaled to uniform height. - - Remains: Blackboard Bold, Fraktur, Calligraphic, Script - - * FreeSerif.sfd: - - Tidied lookup table names for Malayalam - - * FreeSerif.sfd: - - Applied Malayalam patch from Hiran Venugopalan - - * FreeMono.sfd: - - Added/corrected many Mathematical Symbols - - * FreeSansOblique.sfd: - - more IPA - -2008-10-18 Stevan_White - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Made lots more IPA and Phonetic Extensions - Note: fontforge is reporting an error in a few glyphs made by scaling - another, that the glyphs are drawn in the wrong direction--only in - TrueType though. Suspect a FontForge bug. - - Added several Combining Diacritical Marks - -2008-10-17 Stevan_White - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Made several Spacing Modifier Letters, Combining Diacritical Marks, - and IPA and Phonetic Extensions - -2008-10-16 Stevan_White - * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added some Superscripts and Subscripts - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Finished off Superscripts and subscripts - - Completed General Punctuation for Mono faces - - Added some General Punctuation - -2008-10-15 Stevan_White - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - more Letterlike Symbols, Currency Symbols - - * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Made some Combining Diacritical Marks for Symbols, Letterlike Symbols - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Added some General Punctuation - -2008-10-14 Stevan_White - * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Added double slanted hyphen, made General Punctuaton Supplement like - Serif's - - * FreeSansBoldOblique.sfd: - - Filled out Greek Extended - - * FreeMono.sfd, FreeSerifItalic.sfd: - - fixes to last 2 commits - - * FreeSerifItalic.sfd: - - Last character to General Punctuation - - * FreeMono.sfd: - - Built some Enclosed Alphanumerics (1-10) - - * FreeSerif.sfd: - - Copied in Daniel Johnson's changes to Cherokee. - -2008-10-12 Stevan_White - * FreeSerif.sfd: - - Included Daniel Johnson's Cherokee glyphs. - -2008-10-05 Stevan_White - * FreeMono.sfd: - - Further corrections to diaresis in Cyrillic -- legibility in small sizes - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSerif.sfd: - - Regularized placement of diaresis in Cyrillic - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added same set of glyphs to Cyrillic Supplement - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Added some of the easier letters from Cyrillic Supplement - -2008-10-04 Stevan_White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSerifItalic.sfd: - - Finished high Cyrillic range for MonoBold and MonoBoldOblique. - (Remaining: historic ranges, Cyrillic extensions) - Tweeked others. - - * FreeMonoBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Serif*Italic: Added last Abkhazian letters to Cyrillic - MonoBold: tweek - -2008-10-03 Stevan_White - * FreeMono.sfd, FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifBoldItalic.sfd: - - Mono: Some additions to historic letters - - * FreeSerif.sfd: - - Added some punctuation and combining numeric marks from - Cyrillic Extended B - - * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Various technical tweeks, mostly concerning recent additions. - Also did a bit more "Points too close" and "irrelevant control points". - Cyrillic millions redesign meant could not maintain use of refrences - for it. - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - More high Cyrillic - Included old Cyrillic millions combining mark in Sans, changed design - in Serif - -2008-10-02 Stevan_White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - More high Cyrillic - - * FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd: - - More high Cyrillic glyphs - - * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - More glyphs in high Cyrillic. Remains only some whose form I'm unsure - of in italic. - - * FreeSerifBoldItalic.sfd: - - More glyphs in higher Cyrillic range - - * FreeSerifItalic.sfd: - - Same process of tightening el, em, ge (but a P.S. to previous commit: - also did ya, ze for SerifBold.) - - * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - BoldItalic: Tightened up spacing on left of el, em, ge (could go - farther, but it is partly a problem with glyph design... - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - More additions to Cyrillic. Finished SerifBold except for Nivkh - additions. - Used references on number combining forms. - -2008-09-30 Stevan_White - * FreeSerif.sfd: - - Added four (obsolete) Chuvash letters to Cyrillic Supplement - - completing it. - -2008-09-29 Stevan_White - * FreeSerif.sfd: - - Greek adjustments - Adjusted spacing of kappa slightly - Got rid of ears on Psi, following similar request for Upsilon. - -2008-09-28 Stevan_White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Adding and fiddling with Spacing Modifiers and Combining Diacriticals - - * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Revisions of several Combining Diacritical marks - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - A few Combining Diacriticals and Spacing Modifiers - - MonoBoldOblique: Primarily filling out Spacing Modifier Letters - others: little fixes found along the way - -2008-09-27 Stevan_White - * FreeSerif.sfd: - - Replaced Malayalam range with that from Rachana_04 found on - Swathanthra Malayalam Computing project page - http://savannah.nongnu.org/projects/smc/ - Besides scaling and converting to cubic, performed much clean-up of - glyphs, added an r2 character, and re-named a bunch of characters. - -2008-09-22 Stevan_White - * FreeSerif.sfd: - - Filled in as much of Phonetic Extensions as I could without artistic - abilities. - Note 1D48-9 are not references due to apparent FontForge bug, that says - scaled references go in wrong direction. - - * FreeSerif.sfd: - - Cleaup of some Bengali glyphs. - Note many of the ligatures remain very very messy. - - * Makefile: - - added more validations - made to work with GenerateOpenType - - * FreeSerif.sfd: - - Built two more easy Phonetic Extensions - - * FreeSerif.sfd: - - Built some Phonetic Extensions letters, those with middle tilde - -2008-09-21 Stevan_White - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Added lots of Spacing Modifier Letters and Combining Diacritical Marks. - - * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSerif.sfd: - - Wrote script to check if glyph encodings were in stated ranges, fixed - most discrepancies. - - There were a bunch of incompletely deleted characters in several faces. - - Sans: found several other problems in the process - # Tamil - Four slots labelled 0BDA-D have glyphs, not in Unicode. also 0BE1 - I think they are misplaced; added 0010 to each of them - - # Devanagari - Slot labelled U+093B is not in Unicode--can't find glyph: deleted - likewise 094F (may have been meant to be 0954) - 0955, 0973-0976 - - 0954 should be a combining mark, but it appears on the wrong side of 0. - 0971 was just wrong--made into simple dot. - 0972 is also wrong--made my own Candra A. - - # Gujarati - Slots labelled 0AE4-5 are not in Unicode; seem not to belong at all. - Deleted. 2800 is a dup of 2790. Deleted - - Serif: phillipine_double u1736 was misplaced - - A bunch of the Math Alphanumeric symbols are empty in the standard, - because they're represented elsewhere. These should be deleted - First need to make style consistent with existing symbols. - - * FreeSerif.sfd: - - Applied patch from Daniel J - Remedies bug - FreeSerif: Missing glyphs with palatal hook - https://savannah.gnu.org/bugs/index.php?24298 - Adding several letters to Phoenetic Extensions range U+1D80-BF - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Made four characters U+200C-F to be zero-width - Remedy to bug #23593: Mono 0-width chars: zero-width or space? - https://savannah.gnu.org/bugs/index.php?23593 - - * FreeSerif.sfd: - - Made Mahjong tiles to take up less space using references - Cleaned up several validation problems - -2008-09-19 Stevan_White - * FreeSerif.sfd: - - Added several Hebrew Alphabetic Presentation Forms (some easy ones), to - make its coverage the same as Serif Bold. - - * FreeSerifBold.sfd: - - Re-encoded. - Deleted several glyphs in Hebrew Alphabetic Presentation Forms that - didn't correspond valid Unicode - - * FreeMonoBold.sfd, FreeSans.sfd, FreeSerifItalic.sfd: - - Ran script to find mis-numbered glyphs. Several were simply typos, - some offset by one. - - * FreeSansOblique.sfd: - - Numerous cases of glyphs in Private Use area incorrectly assigned - Unicode numbers and names. Gave all -1 for Unicode and named like - "slot.XXXX". - - * FreeSerif.sfd: - - Adapted Mahjong Tiles from George Douros' Unicode Symbols font. - - * FreeSerif.sfd: - - Added Domino Tiles. Domino outline is copied from George Douros' - Unicode Symbols, but the rest I preferred to do with references. - -2008-09-18 Stevan_White - * FreeSerif.sfd: - - Adapted Mathematical Alphanumeric Symbols from George Douros' Unicode - Symbols font. - - * FreeMonoBoldOblique.sfd: - - This one got away from me--I don't know what I did. - Looks like some small contour edits. - - * FreeSansBoldOblique.sfd: - - Fixed one mis-numberd character in Latin Extended-B - - * FreeSerifBold.sfd, FreeSerifItalic.sfd: - - Fixed several mis-numbered characters. - - * FreeSansBold.sfd: - - SansBold: one Georgian letter with no name, one Zapf Dingbat was - unnumbered - ATT test shows a bunch of problems with Gurmukhi and 'blwf' table - indeed shows those letters at 0x10000+ - Sans names them like uni0A30_uni0A4D.blwf: they are in range - ECC6 to ED06 - - I meant to move this range into Private Use in last release, and - missed it. So now it is moved, into same range as Sans. - - Both Sans and SansBold in nukt table for Gurmukhi have duplicate - entries for uni0A15 uni0A3C. Deleted dups. - - * FreeMonoOblique.sfd: - - fixed a number of Unassigned Code Points in Greek Extended - - * FreeSansOblique.sfd: - - mis-numbered Combining Diacritics - - * FreeSansOblique.sfd: - - Several chars in Latin Extended hadn't been named. - One spurious letter in Letterlike Symbols - -2008-09-16 Stevan_White - * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: - - Lots of additions: unless otherwise noted, they are from George Duros' - fonts Analecta, Music, and Unicode (haven't got final confirmation of - the eligibility of these glyphs, so this is just for testing.) - - Added some combining marks, fiddled a bit. In both Serif & Mono, tried - to get a key symbol characters to fit inside the key combining mark - - Serif - Got rid of ears on Upsilon - Added: - # Gothic - # Western & Byzantine Musical Symbols - - # Misc Symbols, Misc Technical Symbols (drew many myself) - # Supplemental Symbols and Arrows - - Mono - Added: - # lotsa Misc Technical Symbols - # OCR Symbols - # drew many Supplemental Symbols and Arrows, Misc Technical - - Sans - Added # Phoenecian - Made a few Letterlike Symbols; Made Re and Im to be sans-serif. - -2008-09-11 Stevan_White - * FreeSerif.sfd: - - Removed pointless entries from Latin kern table - - Tidied points in Sinhala - -2008-09-07 Stevan_White - * FreeSerif.sfd: - - Tidied up Tamil ligatures EEA8-EEAB to fix TT build warning - "MonotonicFindAlong: Never found our spline." - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, Makefile: - - - Added APL characters to FreeMono (why?...) - - Fixed several last-minute problems, including - - Serif: Tweeked GPOS mark table for Cyrillic - Sans: Added a GPOS table for Cyrillic (but several diacritics missing) - - Serif, Mono: tweeked some bugs in extensible brackets & integrals - - Serif: Vietnamese o circumflex: accent was a bit high. fixed. - - MonoBoldOblique OTF build - uni213b intersects self - - Generation of TT fonts complains about several things to stderr, - including: - - SerifBold: "There exists a 'fpgm' code that seems incompatible with FontForge's. Instructions generated will be of lower quality. If legacy hinting is to be scrapped, it is suggested to clear the `fpgm` and repeat autoinstructing. It will be then possible to append user's code to FontForge's 'fpgm', but due to possible future updates, it is extremely advised to use high numbers for user's functions." - Probably has been there since I first copied the TT instructions in. - Just repeated the copying process carefully, and the warning went away. - - Serif: "FindMatchingHVEdge fell into an impossible position" - fixed a bunch of point too close - - REMAINING PROBLEM in Serif TT build - "MonotonicFindAlong: Never found our spline." - fixed several bad TT matrices-- there are several more - fixed many "control points too close" no luck - -2008-09-03 Stevan_White - * FreeSans.sfd, FreeSansOblique.sfd: - - Added/corrected some Misc. Symbols by copying from Serif. - Note this is only a stopgap solution. Want real sans-serif symbols. - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added minimal Miscellaneous Symbols: card suites and some musical notes. - Note not happy with shapes...some I just drew. Sans isn't really sans. - - Fixed one APL symbol in Mono so it verified in OTF version - -2008-08-31 Stevan_White - * FreeMono.sfd: - - Built set of APL symbols. - -2008-08-30 Stevan_White - * FreeSans.sfd: - - Un-linked references in uni02B2 and uni02B5, because when validating the - TrueType version, FontForge gave an error "is drawn in wrong direction". - I suspect a bug in FontForge. Other similar glyphs make no errors. - - Fixed missing extrema in TrueType. - These were the last cases being reported by validate in all the faces. - - * FreeSerifItalic.sfd: - - fixed last missing extrema in TrueType - - * Makefile: - - restructured validation to look in a directory - - * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd: - - Fixed missing extrema in TrueType versions - -2008-08-15 Stevan_White - * FreeSans.sfd: - - Same problem with uni0A83 as with bn_llikaar. Just made zero-width. - -2008-08-14 Stevan_White - * FreeSans.sfd, FreeSansOblique.sfd: - - Glyph bn_llikaar, U+09E3 BENGALI VOWEL SIGN VOCALIC LL, - has right bound positioned far into the negative. Causes a warning in - FontForge when opening OTF version. - Comparing with other fonts supporting Bengali, found no others that - do this. - Serif makes glyph width 0 (which sounds right according to Unicode) - and puts glyph wholly to left of 0. But, I haven't found this letter - in text anywhere. I wonder if it is really used in writing. - - * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: - - Further TrueType validation fixes. - Sans still has two glyps in wrong direction. - - * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Fixed more TrueType problems...all missing extrema in TTF validation - -2008-08-13 Stevan_White - * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - fixed all the TrueType validation problems of type "intersects itself" - and all but two of the "wrong directions", as well as a lot of - "missing extrema". But there remain hundreds of missing extrema in the - TrueType version. - Also, bn_llikaar in Sans and Oblique still has a problem in OTF version. - - * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd: - - Made .ttf files to validate. Other faces have many more problems still. - -2008-08-12 Stevan_White - * FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: - - Continuing to make OTF versions validate. - - * FreeMonoOblique.sfd: - lots of missing points at extrema - * FreeSerif.sfd: - 12 wrong directions, 1 missing extrema - * FreeSerifItalic.sfd: - many missing points at extrema, 1 self-intersecting - - What was wrong: in several oblique cases, an already-italic glyph was - made more italic, thereby fouling up extrema (although why it passed - validation in the SFD I don't know). Some glyphs were - overly-complicated with many near points. Cleaned up, rounded to int. - - Remaining problem: OTF FreeSansOblique FreeSans. one Bengali glyph in - each whose advance width and htmx don't match. - - Moral of story: validate the OTF and TTF versions too before a release. - - * FreeSansOblique.sfd: - - Reverse a mistake from last commit: somehow this file was converted to - quadratic, or something. - -2008-08-11 Stevan_White - * FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Found that SFD files that validated produced OpenType files that don't. - These represent the easy fixes. Some were result of conversion to - quadratic; some shouldn't have validated in the SFD... - - * MonoBoldOblique: uni0250 missing pts at extrema [reference glyph rotated...] - * Sans: uni0AC4 wrong direction [simplified, rounded to int] - * SansOblique: uni01EA wrong direction [rounded to int] - * SerifBold: uni023f wrong direction [round to int] - * SerifBoldItalic: uni0245 missing pts at extrema [ungrouped ref, added extrema] - -2008-08-06 Stevan_White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd: - - Re-set font metrics, which were somehow making uneven vertical spacing. - -2008-06-22 Steve White - * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Made to validate - - * ranges.py: - - Brought more into line with OpenType - Added some ranges - Fixed bug with ranges outside of font - - * CREDITS: - - 3 new ranges - - * FreeSerif.sfd, FreeSerifItalic.sfd: - - Cyrillic: tweeked accents for consistency, and for readability in small - sizes. - - * FreeSerif.sfd: - - Thanna range: tweeking - - Thaana range: Scaled up by about 15%, raised by 100EM, tightened - some of the diacritics to get inside 900 to -300 EM limits. - - * FreeSans.sfd: - - Added Old Persian and Ugaritic from MPH2BDamase font. - -2008-06-21 Steve White - * FreeSerif.sfd: - - Added Tai Le range adapted from MPH2BDamase font. - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Added some ancient Greek numerals from Tempora to high Unicode area, - (partly just to show it can now be done.) - - * FreeSerifItalic.sfd: - - Couple of tweeks putting glyphs above -300EM. - - * FreeSerif.sfd, FreeSerifItalic.sfd: - - Surgery to Thai letter 'tho than', u+0e10, to push it above -300 EM. - This makes Thai range completely between 900 and -300 EM. - - * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: - - Many auxilary characters (esp. for Malayalam, Bengla, and Tamil) - representing ligatures and alternative forms without their own Unicode, - were moved from - ranges above 0xFFFF (which ought to have been slots for other defined - Unicode ranges) into the Private Use area. - - In Serif, I segregated the scripts, in Sans it was hard to see where one - began and another ended, so I moved them en masse. - - Note several problems with wrongly-named characters: - I already re-named glyph570 and glyph582. - But there are others with names starting with A... - - * FreeSansBold.sfd, FreeSansOblique.sfd: - - Fixed (I hope the last) problem with scripts in lookups - Find Problems -> ATT (all selected) finds multiple issues, - - * FreeSansBold.sfd: - In addition to script 'guru', added 'gur2' to the scripts for these - lookups - 'nukt' Nukta forms in Gurmukhi - 'blwf' Below Base Forms in Gurmukhi - 'pstf' Post Base Forms in Gurmukhi - 'blws' Below Base Substitutions in Gurmukhi - 'abvs' Above Base Substitutions in Gurmukhi - 'psts' Post Base Substitutions in Gurmukhi - - * FreeSansOblique.sfd: - In addition to script 'beng', added 'bng2' to the scripts for the lookup - 'half' Half Forms in Bengali - - Moreover, the lookup - 'aalt' Access All Alternates in Latin - contains only Bengali letters. - Re-named as Bengali, made to work on beng, bng2 scripts - -2008-06-20 Steve White - * FreeSerif.sfd: - - Scaled Sinhala range. - Remedies bug #23656: Sinhala letters over-sized - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Mostly messing with Greek Extended accents again. - re-positioned ypogegrammani on advice of Alexey Kryukov - Put prosgegrammani beneath main letters in Mono, to make narrower glyphs - Implemented more distinction between tonos and acute. - -2008-06-19 Steve White - * FreeMonoBoldOblique.sfd: - - Completed fit of Mono to 800 to -200 EM. - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd: - - Set Metrics to recommended values - - * FreeMonoOblique.sfd: - - Now Mono Oblique, as well as roman and Bold, are within 800 to -200 EM. - Just BoldOblique to go. - - * FreeMono.sfd, FreeMonoBold.sfd: - - More toward fitting to 800 to -200 EM. - Basically, reduced Georgian by 92%. - Also made an over-all offset, so Georgian is somehow centered (Bold...I - guess I already did this in roman). - Want to also do an emboldening to make stroke like rest of font, but - current FontForge has a nasty crash that loses data on this function. - - * FreeMono.sfd: - - In effort to make fit in 800 to -200 EM, - Scaled Georgian by 92%, centered on 600 wide box. - Next: Embolden a bit. - -2008-06-18 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Toward making all glyphs lie between -200 and 800 EM. - Numerous small changes, especially raising descenders of some Hebrew - letters. - Georgian remains a problem - -2008-06-13 Steve White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Moved prosgegrammeni up to baseline, - (and then moved all references down to baseline) - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added Control Picture "blank" to all faces. - Switched U+0222-3 from TemporaLGCUni - -2008-06-11 Steve White - * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - More fiddling with Greek Extended accents - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Tweeks to accents etc in Greek Extended and Cyrillic - -2008-06-10 Steve White - * FreeSerifBold.sfd, FreeSerifItalic.sfd: - - Fixed a few big horizontal spacing problems - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Implemented TemporaLCGUni glyphs in Cyrillic ranges. - Added a breve_cyrillic for the moustache breve mark. - -2008-06-08 Steve White - * FreeSerif.sfd: - - Replaced most of Cyrillic range with TemporaLGCUni. - Remodelled many of the derived Cyrillic characters after these. - Fiddled globally with spacing of small letters. - Unclear on diacritics 485-6, unhappy with breve. - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Started implementing TemporaLCGUni in Greek ranges. - - Replaced 3DC-3E1 from Tempora, because I thought they looked nicer and - more like the other existing FreeFont glyphs. - Replaced 3DA-B from Tempora, because they look more like Unicode - samples, and nicer. - Added 03f3-4, 03F7-F. - Prefer my own lunate epsilon. - Replaced Phi and Omega from Tempora. - These plainly fit the other FreeFont glyphs better than the origninals. - (How did this happen?) - - In bold, replaced U+03D7 - - Copied lbbar u+2114 - - Small italic greek--replaced most except phi, psi, omega - - Based on new information, broke the identification of oxia with Latin - acute. - -2008-06-07 Steve White - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Efforts to control heights of characters - -2008-06-06 Steve White - * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Made to validate - -2008-06-05 Steve White - * FreeSans.sfd: - - Fixed undefined character in kerning classes - -2008-06-04 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - tweeks and additions to General Punctuation - -2008-06-03 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansOblique.sfd: - - Completed/tweeked Number Forms - - * FreeMono.sfd, FreeSerif.sfd: - - Added some Miscellaneous Technical symbols - -2008-06-02 Steve White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Tweeks...mostly Letterlike - -2008-06-01 Steve White - * FreeMono.sfd, FreeSerif.sfd: - - Added Box Drawing characters to Serif. - Tweeked a glyph in Mono - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Added several glyphs to Letterlike Characters - -2008-05-31 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Validation pass - - SansOblique and SansBoldOblique had validation problem with BlueValues - Private Dictionary - Elements in BlueValues/OtherBlues array are disordered - Elements in BlueValues/OtherBlues array are too close - (Change BlueFuzz) - StemSnapV does not contain StdVW value. - So I ordered the array, and based on other slanted fonts, - removed StemSnapV. - - Note however, I still think the two top Blues lines are too close - But I don't even know what the second-to-top line is meant to do. - - * FreeSerif.sfd: - - Added to Block Elements, Geometric Shapes - Made to validate - -2008-05-29 Steve White - * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Looking at special symbols. - Drew several Miscellaneous Symbols in Mono and Serif - > Completed/corrected planetary symbols, added Dice, - some other easy ones - > Completed Dingbats in Serif (using URW Dingbats) - Added some Block Elements to Serif - -2008-05-26 Steve White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - More changes stemming from J. Poon's report. - -2008-05-25 Steve White - * FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Height surgery on SerifBoldItalic. - More fiddling with accents in others. - - * FreeSerifItalic.sfd: - - More height surgery. Only a few left in Benglai and Thai - - * FreeSerifBold.sfd: - - Re-applied surgery to make glyphs between 900 and -300EM - - *** Regression - Inadvertently un-linked all references in SerifBold in r1.83. - This reverses that error (but also un-does the surgery mentioned there) - - * FreeSerifBold.sfd, FreeSerifItalic.sfd: - - Applied surgery to make Latin letters go under 900EM. - One exception yet... - -2008-05-24 Steve White - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Serif: much fiddling with accents in Latin ranges. - Re-thought some glyphs (there are still a few messy ones, especially - in bold) - Checked horizontal spacing...fixed a number of problems. - -2008-05-23 Steve White - * FreeSansBold.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Made Latin Extended-B coverage consistent across Serif; cleaned up some - glyphs - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Filled more of General Punctuation in Sans and Serif - Made all agree on coverage of Latin Extended Additional - -2008-05-22 Steve White - * FreeSans.sfd, FreeSansBold.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Added Latin Extended Additional to SansOblique. - Made Latin Extended Additional coverage consistent across Sans, B, I - Made Latin Extended-B coverage same in SerifBold. - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSansBold.sfd: - - Mono* made Latin-B coverage consistent across faces - - * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Made set of Latin Extended-B consistent across Sans faces - - * FreeSans.sfd, FreeSansBold.sfd: - - More filling in General Punctuation - - * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Another bunch of J. Poon's reports - also, filling in some Combining Diacriticals, Spacing Modifiers, and - General Punctuation in bold faces - -2008-05-21 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Mucking about with mark tables in Thai (Serif) - Other faces: Making changes from J. Poon's report - -2008-05-20 Steve White - * CREDITS: - - Mark Williamson - Jacob Poon - - * Makefile: - - added tests target - -2008-05-18 Steve White - * ranges.py: - - Put table explanation back in - - Improved behaviour for high Unicode - - * FreeSans.sfd: - - Revision of kerning - - * FreeSerif.sfd: - - Made Latin kerning a little more reasonable: - reduced many excessive kerns (some had letters apparently - overlapping, which shouldn't happen) - made kerns increment by 5EM for ease of reading - got rid of kerns too small to be seen - - * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerifBold.sfd: - - Made to verify - -2008-05-13 Steve White - * FreeSerif.sfd: - - Made to validate - - * FreeSerif.sfd: - - Gurmukhi: filled range in Serif, taking glyphs from the original - Punjabi font by Hardip Singh Pannu - http://members.aol.com/hspannu/punjabi.html (file pb_win95.exe) - -2008-05-12 Steve White - * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Hebrew, basic. Some faces missing punctuation marks, added. - - * FreeMono.sfd, FreeSans.sfd: - - Armenian: Sans tried to make verticals and horizontals of more uniform - width both, finddled with punctuation - - * FreeMonoOblique.sfd: - - made to validate - - * FreeMonoBold.sfd: - - made to validate - - * FreeSans.sfd, FreeSansBold.sfd: - - Armenian in Sans: regularized letter spacing - - * FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd: - - Armenian: fill out ranges and clean up - SansBold especially had a lot of incorrect references. - Now all the ranges with Armenian at least share the same set of - characters. - - * FreeMono.sfd: - - Fixed glyph with wrong width. - -2008-05-11 Steve White - * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifItalic.sfd: - - 1) made to validate - 2) Mono: copied in Spacing Modifier Letters (glyphs not yet named) - 3) SerifItalic: Filled in General Punctuation - - * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Made to validate, and pass all other FontForge tests. - Expedient: rounded everything to int - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Made to have the same Greek Symbols, - Made to validate - - * FreeSans.sfd, FreeSansBold.sfd: - - Made Greek Symbols as full as rest of Sans. Changed a name in Sans. - - * FreeMonoOblique.sfd: - - Made Greek as full as other faces - Made to validate - - * FreeSansBold.sfd: - - Deleted seven orphaned Arabic characters; looks like somebody started, - didn't get very far, putting Arabic in bold. - - Deleted orphaned Arabic glyph from Arabic Presentation forms-B - - * FreeSerifBold.sfd: - - Deleted the single Arabic character: it was clearly there by mistake. - - * FreeSansOblique.sfd: - - Made Greek Symbols as full as rest of Sans - - Tweeks to Armenian - - Comment from previous commit of FreeSans was meant for FreeSansOblique. - In FreeSans, only tweeked a few letters during putting more characters - in this face. - - Filled in Spacing Modifier Letters, increased General Punctuation. - - * FreeSans.sfd: - - Filled in Spacing Modifier Letters, increased General Punctuation - - * FreeMono.sfd: - - Made Armenian as full as other roman faces. - - Completed Spacing Modifier Letters - Added a couple of Greek Punctuation - - added more Spacing Modifier Letters - -2008-05-10 Steve White - * FreeSerif.sfd, FreeSerifItalic.sfd: - - Did same process of scaling and sizing for Thai in Sans as in Serif. - Added mark tables to Sans. Improvement, but there are questions... - - * FreeSans.sfd: - - Tidied some Gurmukhi glyphs, validated. - - Deleted ranges for Oriya, Kannada, on account of - 1) they only contained a subset of the consonant glyphs of the scripts, - few if any vowels, and had no ligature lookups as required - 2) Kannada was based on the Akurti fonts, which have copyright issues. - - See - bug #23225: Oriya range only partial - bug #23224: Kannada range only partial - - * FreeMonoBoldOblique.sfd: - - Made metrics like rest of Mono - -2008-05-09 Steve White - * ranges.py: - - More info on range intervals - - * FreeSerif.sfd: - - Deleted Telugu range. - It didn't represent a complete writing system for the language. - - See notes at https://savannah.gnu.org/bugs/index.php?23202 - Serif: Telugu range missing many characters; many wrong - - Got a copy of the original Tikkana font, - Copied in remaining consonants and vowels that I could find there. - I think one vowel 0C55 is missing according to unicode). - Strangely, the Telugu digits are alo missing. - In Tikkana, the default "checkmark" structural mark is missing from many - consonants, according to Unicode, but is a separate glyph. I put - the checkmark on. - This, and scaled up by 150% and cleaned up intersecting glyphs and - many unnecessary points. - -2008-05-08 Steve White - * FreeSerif.sfd: - - Filled out Telugu consonants. - Vowels still need to be done - -2008-05-07 Steve White - * FreeSerif.sfd: - - Operated on Latin glyphs with stacked accents to make them fit under - 900EM. - Scaled Telugu bu 150%. - -2008-05-06 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeSansBold.sfd, FreeSerif.sfd: - - Corrected further fontforge "find problems" - Added some math characters to FreeSerif - -2008-05-05 Steve White - * FreeSansBold.sfd: - - Made to validate, and fixed bad TT transformations - -2008-05-04 Steve White - * FreeMono.sfd, FreeSerif.sfd: - - Mainly TeX additions trying to satisfy Markus Kuhn's TeX-as-Unicode page - - * FreeMono.sfd: - - Adjusted heights of extensible brackets - - Fixed problems with extensible brackets, thanks to Markus Kuhn's page - http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt - - * ranges.py: - - fiddled with ranges, doc - - made some ranges more correct? - - fixed some bugs in ranges - better error reporting - - Got rid of Unicode 1.1 references - - made to use OpenType table - - * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: - - made to validate - -2008-05-03 Steve White - * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Removed digits from Private Use Area. - See bug 23050. - - * FreeMono.sfd, FreeSans.sfd: - - Completed General Punctuation - - * FreeSans.sfd: - - Completed IPA Extensions - - * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: - - More work on Superscripts and Subscripts, Spacing Modifiers. - Sans is now complete in both. - Added Pfennig to Sans and Mono. - - * ranges.py: - - Restructure text output - Rearrangement and cosmetic ...except I had broken it. now fixed - Seems to be in a useful form at this point. - More docs, date - - * FreeSerif.sfd: - - Added a hand-drawn old German Pfennig to Currency Symbols - - * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: - - Further additions to General Punctuation, Super and Sub Scripts, - Spacing Modifiers, etc. - -2008-05-02 Steve White - * FreeSans.sfd: - - additions to Spacing Modifiers, IPA - - * FreeSerifItalic.sfd: - - Shortening stacked accents to maintain readability when clipped - -2008-05-01 Steve White - * FreeSans.sfd: - - Additions to Spacing Modifiers and changes to Combining Diacritics - - * FreeSerif.sfd: - - Made sure all the half rings in Combining Diacriticals and Spacing - Modifiers were really half rings (J. Poon had complained about this) - - Filled out General Punctuation - Some work on Spacing Modifiers - - Filled out Mathematical Operators - still needs lots of work - Made to validate - - Filled out Latin Extended B - Added some letters with curls to Latin Extended B - More fiddling with Latin Extended B accents - -2008-04-30 Steve White - * FreeSerif.sfd: - - Added Hanunóo script, with characters based on those in - font MPH2BDamase, on request from the maintainer of that font, - http://packages.debian.org/sid/ttf-mph-2b-damase - - Glyphs are simple vector strokes. Could be a little more uniform. - - Added Buginese script "Lontara", with characters based on those in - font MPH2BDamase, on request from the maintainer of that font, - http://packages.debian.org/sid/ttf-mph-2b-damase - - Note the glyphs are pretty rough, clearly a digitization of handwriting. - I just cleaned them up, and corrected discrepancies with Unicode, - and compared with some pictorial samples of the script I could find. - -2008-04-29 Steve White - * ranges.py: - - Improved look a lot--still unhappy with some ranges - OS/2 seems sometimes bang-on, sometimes unrelated to anything (including - fontforge's OS/2 listing) - - * FreeSerif.sfd: - - Much fiddling with Tamil range. - First scaled to 78% (avoiding the references) - This gets it in the ballpark height-wise. [A bit taller than the Latin - letters, but the stroke is narrower, but then the glyphs are busier.] - Then had to re-align combined references, the trickiest being the - halants. - Checked with other fonts with Tamil text. - -2008-04-28 Steve White - * FreeSans.sfd, FreeSerif.sfd: - - Cleanup of control points in Arabic and Thaana - - * FreeSerif.sfd: - - Cleanup of missing extrema in Arabic and Thaana - - Many changes to Thai, trying to make the script fit between some lines, - so accents won't get clipped, etc. - Also, stroke weight was heavier than that of Latin. - - Scaled whole thing by 93%. - Shrank the tallest letters 0E42-4 to get them under 900EM. - Shaved off top of maiek. - Fiddled with positioning of all accents. - Made positioning tables for accents. - Note: unclear these are working correctly - - Fixed a bug having to do with character replacements for characters - named 'ng' and 'nj'; these names had been taken on by other characters. - - Made to validate - - Unicode positions of two Cyrillic Extended characters were switched. - Fiddled with a couple of Cyrillic combining diacritics - -2008-04-27 Steve White - * FreeSans.sfd: - - bugfix: a left harpoon mysteriously appeared to the left of letter p! - -2008-04-26 Steve White - * FreeMono.sfd: - - Made to validate - - * FreeSans.sfd: - - Made to validate - - Toward J. Poons report - Made 032B more like proper double-arches (and distinct fro 033C seagull) - Made 032b more like a seagull - - * FreeSans.sfd, FreeSansBold.sfd: - - Sans: fiddling with widths and terminators of math symbols, - toward J. Poon's report - R & B: removed u+2741 because it didn't match the Unicode description - - * FreeMono.sfd: - - Extensible parenthesis symbols weight/terminators - Toward bug # 23064: https://savannah.gnu.org/bugs/index.php?23064 - Rounded a bunch of terminators - -2008-04-22 Steve White - * FreeSerif.sfd: - - Small alignment problem in Greek Extended - - One more tweek to spacing in Cyrillic Extended - - Corrected spacing in Cyrillic Supplement - - Added Cyrillic Supplement letters for - Enets, Khanty, Chukchi, Itelmen, Mordvin, Kurdish, Aleut - - Added Cyrillic letters for Nivkh (completing Cyrillic range) - More tightening of accents in Latin Extended. - - * FreeSans.sfd: - - Fiddled with math--consequences of changing the "similar" operator - - More tightening of accents - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Adjustments to h and k with caron and cedilla in Latin A and B - - * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd: - - FreeSerifBold: deleted 3 dotted Hebrew letters in Private/Corporate use - (E801-3). They weren't ligatures or in any other lookup, and they - weren't present in FreeSerif. - - * FreeSansBold: - Unlinked and deleted F6C3, which called itself commaaccent. - Made some new spacing and non-spacing accents to make up for it. - - * FreeSansBoldOblique: - Made references of many Latin Extended. - Also corrected several wrong ones. - - * Freeserif: - Re-named commaaccent - -2008-04-21 Steve White - * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd: - - Deleted Hiragana and Katakana ranges, as discussed on bugs list. - Cleaned up some encoding issues, unnamed glyphs - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Roman: added 'sine' -- not beautiful, but I liked drawing it - All: Made special lookup for Dutch ligatures 'IJ' and 'ij' - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Roman: ffi etc Latin ligatures from 'liga' to 'dlig' (these weren't - really ligatures anyway, and only looked very bad when used. - Retain for condensed type. - Others: deleted Latin 'liga' table altogether - BoldOblique : added j to ij ligature - - Toward J. Poon's Report: - Except for issues of terminators not always vertical or horizontal, - and a few things that were too hard or I was unsure of. - -2008-04-20 Steve White - * FreeSerif.sfd: - - Futzing with accents in Latin Extended Additional and Latin Extended-B - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Added primemod character, referenced by Greek number sign - - * FreeMono.sfd, FreeMonoOblique.sfd: - - Following J. Poon's report, disconnected NJ (01CA) - -2008-04-19 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - First pass throught J. Poon's bug list. - See bug reports for details. - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Made underscore slanted in Oblique faces, made all to be width of - space character. - Towards J. Poon's report. - Disturbed that xterm and some other apps put small space between - characters when none was called for. - - * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSansOblique.sfd: - - Corrections on Currency Symbols - - * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - More corrections, additions to Currency Symbols - - * FreeSans.sfd, FreeSerif.sfd: - - Filled out and corrected Currency Symbols - -2008-04-18 Steve White - * FreeSans.sfd, FreeSerif.sfd: - - Adjustments to Combining Marks for Symbols - Additions to range in Sans, and re-structured its marks table so that - "middle" can apply to any range - - * FreeSerif.sfd, FreeSerifItalic.sfd: - - Made reference between combining koronis and lenis of Greek Extended. - In Serif, re-worked combining marks lookup tables, added anchors in - Latin, moved so without marks they work in kedit (but now I'm doubting - kedit does a reasonable thing...what is a better application for - testing this?) - -2008-04-16 Steve White - * FreeSerifItalic.sfd: - - Adjusting of spacing and accents in Greek - - * FreeMono.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd: - - Much futzing with Greek letter spacing and accents. - Added lenis to FreeMono. - - * FreeMono.sfd, FreeSerif.sfd: - - Adjusted spacing of dots of Greek dieresistonons in Serif - Whipped up something for Greek kappascript in Mono (could use revision) - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Raised dots on double-dotted Cyrillic i, to match that of i and j. - -2008-04-14 Steve White - * FreeMono.sfd: - - Corrected 27e6-7 "white bracket" - Note it is probably a FontForge bug these symbols aren't showing up. - FontForge thinks they are in Supplemental Arrows, but they should be - in Supplemental Math-A - - Named some Greek characters - - * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: - - Spacing of some Cyrillic characters - -2008-04-13 Steve White - * FreeSerif.sfd: - - Some fiddling with accents - 'yogh' was too wide - - * FreeSansBold.sfd, FreeSansOblique.sfd: - - Character spacing was chaos--tried to improve. BoldOblique also needs - it. - - * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: - - Completed the fix of bug #12798, Greek glyphs with accents to side - Much mucking with accents here, and fixed a few things that were just - wrong. - -2008-04-12 Steve White - * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Made Mono curly quotes "bent" - - * FreeMono.sfd: - - More fiddling with Greek accents - Made quotes "bent" - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Adjustments on Greek diaresistonos etc. - Adjustments in Serif on combining marks for symbols - - * FreeSerif.sfd: - - More additions to Combining marks for Symbols - - Additions to Combining marks for Symbols -- now mostly full. - Lots of adjustments to middle anchor point in Latin to make big circle - (nearly) encircle preceding latter - -2008-04-11 Steve White - * FreeMono.sfd: - - Bugfix: - Had indroduce a glyph of width other than 600, making kterminal not - recognize it as a monospace font. - -2008-04-10 Steve White - * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - More messing with accents. - Further to bug #12798, Greek glyphs with accents to side - Much messing with glyphs in Greek Extended range - -2008-04-09 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerif.sfd: - - Revisited Latin-1 and Latin-A accents. - Glyph B7 was called "periodcentered", but Unicode callse it Mid Dot, - and the description doesn't refer to the period. I made it like the - dot accent. throughout, and referred L-dot to it. - - Also double-checked "commaaccent" characters (some in Unicode called - cedilla, but the Unicode example shows a comma...mystery) - - Also the funny IPA upside-down f often had two bars, incorrectly. - - To do: go through rest of Serif, and Sans - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Completed re-structuring of stacked Latin accents in Mono. - Also: lots of associated adjustments of Greek Extended accents. - (Trying to at least center extremely wide characters on their box) - Repaired some victems of "find overlaps" sweeps - Worked on glyphs with apostrope/comma parts - Corrected a few wrong glyphs. - - Trying out a "bent quotes" solution to making primes distinct from - quotes. - -2008-04-08 Steve White - * FreeMonoOblique.sfd: - - Toward reducing overall height - Did similar process as for Mono, fixing a few errors along the way. - Also the Greek Extended range was very messed up vertical and - horizontally. - Horizonal spacing of the heavily accented Greek is a real problem in - Mono... - To do: - revisit "commaaccent" characters in all faces: do some have - edillas? - some Hebrew glyphs are a little low - Georgian generally is way out of bounds - -2008-04-07 Steve White - * INSTALL: - - Various updates and corrections, tweeked formatting - - * FreeMonoBold.sfd: - - Tweeking of accents - -2008-04-06 Steve White - * FreeMono.sfd, FreeMonoBold.sfd: - - Re-worked accents in FreeMonoBold.sfd to make Latin ranges lie between - 800 and -200 EM, as with FreeMono. - - * FreeMono.sfd: - - Latin Extended ranges: Implemented new policy of shortening the letters - of the characters with the highest-stacked accents. - - At this point all the Latin glyphs lie betweeen 800 and -200 EM. - - Also checked for readability of all the Latin extended letters in xterm. - (Issue: it chops letters outside their bounding boxes; many accents had - been a bit outside. Made sure that if they were chopped, they were at - least still recognizable.) - -2008-04-05 Steve White - * FreeMono.sfd: - - Following exchange about Mono on freefont-bugs with Joe Wells, who - > doesn't like the curly quote marks - > wants combining diacritics to work - > wants tight line spacing - - Trying to reduce font height: - > exclamdown was below -200 - > Throughout Extended Greek, ypogegrammeni were too low. Shortened - glyph, and raised all references. - > Lots of messing with Latin Extended ranges to make glyphs mostly - fit into 800 height. Mostly succeeded. A couple will get chopped. - > Messed with "commaaccent" glyphs, which were very low - > Cyrillic 04B1 had a tail that was incorrectly low - > Much mucking with Georgian range. Moved up by 95 (read that Georgian - is written as though centered between two horizontal lines, rather than - as sitting on a baseline) There are still a few very high glyphs. - - FontForge U+0122 called Gcommaaccent, glyph looks like that, but - Unicode says it's Gcedilla. Made the ones called cedilla by Unicode - to be cedillas - - Note bug in Unicode: standard for 0122, 0123, 0136, 0137, 013B, 013C, - 0145, 0146, 0156, 0157 all talk about cedilla, say to make it with - cedilla, but example shows comma. - - By the way: - > Got rid of commaaccent and dotlessj in Corporate Use - > Replaced shadedark, with little squares now not overlapping. - > Corrected IPA symbol 'ts' 02A6, added 02a8, 02a9, 02aa, 02ab, 02ac, - 02ad, 02ae, 02af - - (so many changes...the CVS server was down...) - - * FreeSerif.sfd: - - Re-named arabic and hebrew characters - Big adjustment to comma-accents. Mostly effects Greek Extended. - Made such accents to be like comma, rather than like Russian apostrophe - (and de-referenced that symbol) - -2008-04-04 Steve White - * FreeMono.sfd, FreeSerif.sfd: - - Raised dot on superscript i (2071) -- more distinct at small sizes - - * FreeMono.sfd: - - added two IPA symbols - -2008-04-02 Steve White - * FreeSerif.sfd: - - fixed a few more control points too close - - Fixed names of languages in ligature table for latn "w/i". - This fixes a crash when FontForge opened the ttf table - - Motivated by bug crashing FontForge when opening ttf file, - started cleanup of useless control points. Not finished. - Got partway through Sinhala - -2008-03-31 Steve White - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Fixed various "Find Problems", including glyphs with mixed-up names, - and bad TT matrices. (lots more bad TT matrices remain) - - * FreeSerif.sfd: - - Re-named a bunch of Cyrillic letters - - * FreeSerif.sfd: - - Put above mark on Cyrillic i and double-dot i for Slavonic number forms - -2008-03-30 Steve White - * FreeSans.sfd: - - Tightened spacing on glyphs of last commit - - * FreeSans.sfd, FreeSerif.sfd: - - Concerning bug #16120, Include upper case Wynn and upper case Yogh - Adapted Herman Miller's Thyromanes letters 01F7 021C 021D for Serif - Drew my own versions for Sans. - - * FreeSerif.sfd: - - Added 04F6,7 - - * FreeSerif.sfd, FreeSerifItalic.sfd: - - Made more Cyrillic diacritics really combine. - Made a mark lookup just for Cyrillic diacritics, - Marked most of the unadorned Cyrillic alphabet. - - Still not clear on correct shapes for some of the marks. - - * FreeMono.sfd, FreeMonoOblique.sfd: - - Tweeks to accents - -2008-03-29 Steve White - * FreeSans.sfd, FreeSerifItalic.sfd: - - Small adjustments in Cyrillic - - * FreeSerif.sfd: - - Corrected small palochka - Made Cyrillic combining hundred-thousands and millions really combine - Named some combining diacriticals - - * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: - - Mostly adjusted horizontal spacing of mono oblique faces - - * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - More cleanup of Cyrillic ranges - - Completely re-did horizontal spacing of SerifItalic and SerifBoldItalic. - See bug #17912, poor kerning in Cyrillic oblique... - https://savannah.gnu.org/bugs/index.php?17912 - It looked like chaos to me. - Only so much can be done: the font is flawed. - But I think the changes make text readable in these faces. - - There were dozens of incorrect glyphs in higher-numbered characters. - I deleted all those I found. No glyph is better than a wrong glyph. - - Futzt with accents, shooting for consistency and readability. - - A maintenance thing: making correct references (acyrillic vs a, - although they may be the same glyph) I made a lot of headway, but - it isn't finished. - - Likewise, a large fraction of these are compound characters, which can - be made with references, resulting in easier maintenance, reduced - likelihood of errors, and smaller files. I replaced many. - - * FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Cyrillic italic - Added italic, bolditalic - 0493, 04a7, 04AD - because their form clearly varies in italic. But was just guessing... - - * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Cyrillic italic - - Added italic, bolditalic - 0493, 04AD - because their form clearly varies in italic. - But was just guessing as to exact form. - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Overhaul of Cyrillic - - Italic, BoldItalic - added small yat for bug #22588 (note Times New Roman doesn't use - alternate form in Italic) - - All forms of Serif have big problems in Cyrillic. - - The ugliest is in roman. The letters, even of the Russian alphabet, are - of inconsistent height (awfully, small 0438 (ii) 0446 (tse)) - and they vary from the height of Latin - and they vary from the height of italic and bold. - They are a mish-mash of letters from several fonts, of similar (but not - quite identical) weight, and similar, (but not quite identical) size. - - I think the best solution would be to identify the face that best - matches Latin, and fill the range with that. I think this is possible - because the rarer letters seem to be better: the common letters are the - ones that are wrong. - - For now, I just increased the sized of 0438 and 0446, and 048a, 048b, - also 0459 (lje) 045A (nje) 0464 (dje) - - Other issues - -2008-03-27 Steve White - * FreeSerifBoldItalic.sfd: - - Moving all Greek capitals with accent so they don't cover previous - letter. Remedies bug #12798 - - * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: - - Various tweeks to accented Latin letters. - Connected O-ogonek correctly - - * FreeSerifItalic.sfd: - - Accents of numerous accented Latin letters got shifted in a previous - commit. This fixes it. - - * FreeSerif.sfd: - - Adjusted combining tack left and right (0318-0319) to be above -300 EM. - - * FreeSans.sfd, FreeSerif.sfd: - - Added some "middle" marks for positioning of diacritics - - * FreeSans.sfd: - - Copied 4 enclosing combining diacriticals from Serif 20DD - 20E0 - - * FreeSerif.sfd: - - Adjusted and added some enclosing diacritics 20DD - 20E0 - In response to Debian bug #472566 - ttf-freefont: U+20DD COMBINING ENCOLSING CIRCLE doesn't combine - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=472566 - -2008-03-26 Steve White - * FreeSerif.sfd: - - Lowered a few over-high Latin accents - - * FreeSansBold: - - Devangari--only digits 1 and 2, and nothing else. Deleted - - * FreeMonoBold, FreeMonoOblique, - FreeSerifBold, FreeSeriftalic, FreeSerifBoldItalic, - FreeSansOblique, FreeSansBold, FreeSansBoldOblique: - - Got rid of dotlessj, comma in Corporate Use - Single Substitution lookup, ccmp table - Made proper dotlessj, re-linked j-circumflex - - Note: - FreeSansBold has a commaaccent in Corporate Use, used by several other - characers. Haven't done anything about this. - -2008-03-25 Steve White - * FreeSerif.sfd: - - Added/corrected glyphs for yeh hamza in Arabic, - Added init and medi lookups for yeh hamza. - -2008-03-24 Steve White - * FreeSerif.sfd: - - Added isolated and final forms for - 0629 teh marbuta - 0624 waw hamza - 0626 yeh hamza - 0649 alef maksura - A previous commit had added lookups that referred to these, - - More fiddling with super/subscripts - - * Makefile, Makefile, GenerateTrueType: - - Scripts and Make targets to generate OpenType fonts and zip file - - * maintenance.txt: - - Added gnupload and info about tagging - -2008-03-23 Steve White - * FreeSerif.sfd: - - Last of Find Problems -> ATT - 'mark' Latin lookup: afii10026 is in 'cyrl', also afii10074 - Upper and lower Cyrillic i. Just removed mark from both letters. - - 'half' Bengali lookup Khanda_Ta is in 'bng2'. Added bng2 to lookup - Added TtTable etc - - Clean-up of Points too Close through to end of font. - This episode completes the paths/points clean-up of Serif. - But note: many ranges, esp. Ethiopic, Japanese, and Indic, have way - too many points, resulting in lumpiness. - - At this point, FontForge can convert splines to quadratic, auto-hint, - and auto-instrument without segfault. - - * Makefile, sfd/Makefile, tools/GenerateTrueType: - - Alterations to build process: added a Makefile, and made to work - on my system. Now auto-hints before generating TrueType. - -2008-03-22 Steve White - * sfd/FreeSans.sfd: - Lots of additions of math characters. Should complete for - LaTeX 2e, except for extensible brackets. - -2008-03-21 Steve White - * *.sfd: - - Regularized stacking of accents in Latin Extended Additional - Changed name of 00B5 from 'mu' to 'micro', - 2206 from 'Delta' to 'Delta.math', - 0308 from 'diaerisis' to 'diaerisiscomb' - - * FreeMono.sfd: - - additions to IPA - - * FreeMonoBoldOblique.sfd: - - Moved dotlessj from Corporate Use, - Deleted commaaccent there - Fixed mis-named glyphs tcommaaccent, Tcommaaccent - Changed name of 030A from 'dieresis' to 'ringcomb' - - * FreeSans.sfd: - - Added some arrows, and a couple of blackboard bold characters - - Several characters in U+F600 Corporate Use range - dotlessj, onefitted, commaaccent - - dotlessj referred to by: jcircumflex, uni01F0: - renamed it to uFFFF, re-linked others by hand - - commaaccent - http://diacritics.typo.cz/index.php?id=9 - should be u+0326 but wasn't linked to anything - - * FreeSansBold.sfd: - - U+0617 etc: read glyphs "4GWglm". It should be Arabic. Deleted - - * FreeSansBold.sfd, FreeSansOblique.sfd, FreeSansBoldOblique.sfd: - - Removed bogus glyphs for 200C 200D, ZWJ and ZWNJ - - * FreeSerif.sfd: - - Split lookup for ligatures in latin into two classes; - ff, ffl, fl which are appropriate for all languages, - and fi, ffi, which are not appropriate in Turkish (due to distinction - between short and long i) - Needs to be done for other faces. - - Filled set of extensible brackets in Miscellaneous Technical - - Think IPA is now complete. - -2008-03-18 Steve White - * FreeSans.sfd: - - clean-up of all path issues and points too close - -2008-03-18 Steve White - * FreeSans.sfd: - - Something was causing crashing effects in Windows. Cleanup of - problems eventually made it go away. Now works well. - - Cleaned up many "points too close" - - Cleaned up all ATT problems, of which there were many and various. - - # Incorrectly labelled zero-width joiner used in a ligature - - # Incorrect substitution of dotlessi and dotlessj with i and j was - somehow connected with FontForge crash. Attemts to remove the - substitution would damage a 'ccmp' table; subsequent changes would - result in FontForge crashing on save, and truncating the sfd file. - Surgically removed with vi. - - # A couple of Indic lookups had incorrect script DFLT; one had 'latn'. - - # Don't understand why there are scripts named - dev2 bng2 grj2 gur2 when there are already deva beng gurj guru - But anyway, lots of 'vatu' 'pres' 'haln' and 'liga' lookups contained - characters in the '2' scripts but were lablled only for the 'non-2' - ones. Added the '2' scripts to all these lookups. Suspect a mistake. - - Note: several of these problems are repeated in other Sans faces. - -2008-03-16 Steve White - * FreeMono.sfd: - - Cleanup of many path problems "points too close" - - Strove to make accents Latin Extended range legible at small sizes - - Named some unnamed characters; removed a duplicate - - At this point, all fonts are passing FontForge Validate. - -2008-03-15 Steve White - * FreeSerif.sfd: - - CJK punctuation: made some of the very high glyphs smaller (under 900EM) - The brackets in Sans were very ugly, and not even Sans-serif. - Serif: added extensible square brackets, diddled with integral - corrected direction of some added glyphs - - Several bugs having to do with missing glyphs in Tamil range. - Also a buggy ligature in Devangari. - - Shortened names of many lookup tables - - Futzt with some combining diacriticals - - Added extensible square brackets. - - * FreeSans.sfd: - - Changed names of a bunch of glyphs with invalid - TrueType names, in range 0x1025f+ (not real Unicode). - Took pains to retain information contained in the names. - Wonder if these glyphs have ever been of any use. - - CJK Punctuation: brackets were hand-drawn and very ugly. Improved. - - * *.sfd: - - Set OS/2 Metrics back to absolute 900/300. Offsets are not - interpreted uniformly. - - Cleanup of many path problems up to extrema and self-intersecting - - Ordered PS Blue values. - -2008-03-14 Steve White - * FreeSerif.sfd: - - Got rid of mixed references and contours - Cleanup of many path problems "points too close" - - Started clean-up to satisfy FontForge Validate - - Changed names of three glyphs in the - Tamil ligatures range...all clearly bugs. - - * FreeSans.sfd: - - Added slanted-hyphen - - * *.sfd: - - Unified OS/2 Metrics - Added Grid Fit - -2008-03-13 Steve White - * FreeSans.sfd: - - Rearranged PS BluesValues so they were in increasing order, - Made all 20 in width. - -2008-03-12 Steve White - * FreeSans.sfd, FreeMono.sfd: - - Added TrueType hinting tables. - Fixed glyphs that didn't convert well to quadratics - Got rid of mixed contours and refs - - * FreeSerifBold.sfd: - - Cleanup of path problems - -2008-03-11 Steve White - * FreeMonoOblique.sfd: - - Cleanup of path problems - -2008-03-09 Steve White - * FreeSerif.sfd: - - Corrected L-dot - Further cleanup of path/ref problems - - Found several ligatures that referred to a missing glyph "ZWJ". - Took this to mean the "zero width joiner" u+200D - - * *.sfd: - - Changed OS/2 metrics to be absolute 900/300 - - * FreeSerifItalic.sfd: - - Added Greek lunate epsilon - - * FreeMono.sfd: - - Many additions in math range - Reduced size of binary union, intersection, vee, wedge - Corrected empty set - Corrected logical 'assert' relations, etc. 22a2-22af - Efforts to make Math glyphs legible at small point sizes - - * FreeSans.sfd: - - Added Greek lunate epsilon and rho symbol - Unstacked more stacked diacriticals - - Further cleanup of path/reference problems - -2008-03-08 Steve White - * FreeSans.sfd, FreeSerif.sfd: - - Added some "n-ary" Math operators - - * FreeSerif.sfd: - - Further clean-up of path problems...up to Ethiopic - > Started adding and correcting Math operators for LaTeX 2e - > Corrected n-ary union, intersection, and spikes to be larger - than the binary operators - > Made (many of) the operators based on + - = to use those - symbols directly (by reference or copying). - > Added lunate epsilon - > Corrected empty set - > Tightened up spacing of some other technical characters - > Worked on some more math operators involving = - > triangle - > Several arrows - > Supplemental Arrows-A - - * FreeSans.sfd: - - Clean-up of font paths - Open self-intersecting outermost-clockwise missing-extrema - also flipped references (unlinked) - - Added Greek lunate epsilon and rho symbol - -2008-03-06 Steve White - * sfd/FreeSerif.sfd: Shortened and thickened the combining hook mark, - U+0309, to make more like Unicode samples. - Also see (bug #22499) un-stacked incorrectly stacked accents - -2008-03-05 Steve White - * sfd/FreeSerif.sfd: vertical lines: combining diacritical marks - corrected 0300 030D 0329 0348 (were rendered as straight apostrophes) - Spacing Modifier letters added 02C8 02CC - 02B9 02Ba prime and double-prime - Fixed positioning U+1EC8, 9, I with hook above - -2008-03-03 Steve White - * sfd/FreeSerif.sfd: TT strings updates. - updated Copyright to 2008 - Added Vendor URL as the Savannah freefont site - * sfd/FreeMono.sfd: A standard pangram as the Sample Text for Russian - It reads: In the thickets of the South once there was a citrus - ...--yes, but a fake specimen! - * sfd/*.sfd: Set the OS/2 Sup/Sub settings, which by default looked - like random trash. - -2008-03-02 Steve White - * sfd/FreeSerif.sfd: began cleanup of problems given by FontForge - "Find Problems" feature. (bug #22454) - -2008-03-01 Steve White - * sfd/FreeSerif.sfd: made Arabic work for text display (bug #22329) - Added required contextual replacement tables, - Made a few missing characters, - * sfd/*.sfd: Removde all back layers from glyphs that had them. - -2008-02-27 Steve White - * sfd/FreeSans.sfd: filled in Combining Diacriticals - * sfd/FreeSerif.sfd: shifted whole Arabic range down by 200EM. - -2008-02-26 Steve White - * sfd/FreeSerif.sfd: enabled DPOS table. - -2008-02-24 Steve White - * sfd/*.sfd: Much fiddling with the "combining diacriticals" - range 0300-036F. Made to align with medium-size lowercase - preceding character if not using DPOS table. - -2008-02-23 Steve White - * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #21784) Filled - in set of HTML 4 Character Entities. - - * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #18413) - undertie too low -- went on to tidy other similar characters in - Combining Diacriticals range. - -2008-02-21 Steve White - * sfd/*.sfd: Moved capital Greek letters with tonos so tonos doesn't - cover preceding letter (bug #12798) - - * sfd/FreeSerif.sfd, FreeSans.sfd: (bug #13370) made extended - integrals to line up. - -2008-02-20 Steve White - * sfd/*.sfd: started removing glyphs with back layers (printing bug) - * sfd/*.sfd: adjusted vulgar fractions (bug #17756) - * sfd/*.sfd: adjusted numerical superscripts (bug #20278) - -2008-02-18 Steve White - * sfd/FreeSerif.sfd: Offset Hiragana and Katakana ranges (bug #22326) - * sfd/FreeSerif.sfd: U+30FB, KATAKANA MIDDLE DOT to be full width - (bug #18326) - - * sfd/FreeSerif.sfd: Re-promoted - ff ffi ffl fi fl - as standard ligatures in Latin. - -2008-02-17 Steve White - * sfd/*.sfd: committed to FontForge Spline Font Database (SFD) 2 - format. - -2008-02-10 Steve White - * sfd/*.sfd: brought into line with Debian ttf-freefont - Deleted a couple of patches, and applied those applied to Debian. - -2006-09-20 Primoz Peterlin - - * INSTALL: added installation procedure for MacOS X, courtesy - Philipp Kempgen. - -2006-05-04 Primoz Peterlin - - * sfd/FreeMono.sfd: deleted Russian sample text, which did not - conform to UTF-7. - -2006-04-15 Primoz Peterlin - - * sfd/FreeSerif.sfd: corrected U+10D3. - - * sfd/FreeSans.sfd: ligature U+FB06 (LATIN SMALL LIGATURE S T) - changed from mandatory ("liga") to discretionary ("dlig") (bug - #16253). - - * sfd/FreeMono.sfd: deleted incomplete glyph U+FB06 (LATIN SMALL - LIGATURE S T); deleted U+FB00, U+FB01, U+FB02, U+FB05 as - ligatures (bug #16253). - - * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBoldOblique.sfd: added - U+FB00; deleted U+FB01, U+FB02 as ligatures (bug #16253). - - * sfd/FreeMonoBold.sfd: deleted U+FB00, U+FB01, U+FB02 as - ligatures (bug #16253). - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd: added Georgian letters, donated by - Gia Shervashidze - -2006-02-22 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd: ligature U+FB4F - changed from mandatory ("liga") to discretionary ("dlig"). This is - respons to Bug#349657: [bug #15792] Freefont Alef and Lamed - combine - -2006-02-21 Primoz Peterlin - - * sfd/FreeSerifBold.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd, - sfd/FreeSansBold.sfd: ligature U+FB4F changed from mandatory - ("liga") to discretionary ("dlig"). This is respons to Bug#349657: - [bug #15792] Freefont Alef and Lamed combine - - * sfd/FreeSerif.sfd: corrected bug#275759: [bug #15790] FreeSerif - glyphs for U+2198/U+2199 were reversed. - -2006-02-15 Denis Jacquerye - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: removed ij - and IJ ligatures. - -2006-02-10 Primoz Peterlin - - * sfd/FreeSerif.sfd: added small Georgian letters (mkhedruli), - donated by Gia Shervashidze - - * AUTHORS: Added Gia Shervashidze - - * CREDITS: Added Gia Shervashidze - -2006-01-26 Primoz Peterlin - - * notes/maintenance.txt: Added information on the Makefile now - used; username for FTP login is anonymous. - - * sfd/FreeSansBold.sfd: added U+0569, U+0571, U+0579, U+057B, - U+0586. Armenian small letters completed. - - * sfd/FreeSerif.sfd: added U+0297, U+02AD-02AF. IPA Extensions - section is now complete. Copied a dozen of glyphs from Omega IPA - to Phonetic Extension section. - -2006-01-25 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+01A, U+01A3, U+01A6, U+01B2, U+01BA, - U+01BB, U+01BE, U+01BF. - - * sfd/FreeSans.sfd: aligned small Armenian letters to x-height in - response to bug #15480. Armenian in Free Sans needs a major - cleanup. - -2006-01-24 Primoz Peterlin - - * sfd/FreeSerif.sfd: changed U+0452, U+045B. Cleanup: U+0460, - U+0461, U+04Bc, U+04BD, U+0508. - - * sfd/FreeSansOblique.sfd: replaced accented chars in Latin-1 and - Latin Extended-B sections with references, where possible. - - * sfd/FreeSerif.sfd: changed U+0285. - -2006-01-23 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0195, U+01AA, U+0297, U+03D7, - U+03F0. Several flipped references replaced by outlines. - - * sfd/FreeSansOblique.sfd: Latin Extended-B section more or less - brought in sync with FreeSans. - - * sfd/FreeMonoBoldOblique.sfd: added glyphs from FreeMonoBold in - the Latin Extended-B and IPA Extensions sections. - - * sfd/FreeSerifBold.sfd: Added U+0224, U+0225. Changed U+01B7, - U+01B8, U+04E0, U+0452, U+045B. Replaced accented characters in - the Cyrillic region with references. - -2006-01-21 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0255, U+0264, U+0277, U+0286, - U+029D. Changed U+0261. Deleted spurious glyphs in the control - code area. - -2006-01-19 Primoz Peterlin - - * sfd/FreeSans.sfd: replaced Hardip Pannu Singh's Gurmukhi with - AnmolUni by Kulbir Singh Thind. - -2006-01-17 Primoz Peterlin - - * sfd/FreeSansBold.sfd: Added U+018D, U+0194, U+01B5, U+01B6, - U+01BE, U+0262, U+02A2. - - * sfd/FreeSansBold.sfd: Changed U+0261 in order to distinguish it - from U+0067. Changed U+0251, U+0252. - - * sfd/FreeSerifBold.sfd: Small changes in the Cyrillic - section. Added U+0183, U+018C. - - * sfd/FreeSans.sfd: Added U+2045, U+2046. - - * sfd/FreeSansBold.sfd: Filled in the Gurkmukhi part with the - AnmolUni-Bold by Kulbir Singh Thind. Also some minor corrections - in the Cyrillic part. - - * CREDITS: Added Kulbir Singh Thind. - - * AUTHORS: Added Kulbir Singh Thind. - -2006-01-14 Primoz Peterlin - - * sfd/FreeSerif.sfd: Thomas Ridgeway's Tamil characters replaced - by the ones released by the Samyak font project. - - * CREDITS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao - and Sandeep Shedmake - - * AUTHORS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao - and Sandeep Shedmake - -2006-01-08 Primoz Peterlin - - * sfd/FreeSansBold.sfd, sfd/FreeMonoBoldOblique.sfd: minor changes. - -2006-01-05 Denis Jacquerye - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd: added cedi sign U+20B5, Ghanaian - currency - -2005-12-29 Primoz Peterlin - - * sfd/FreeSans.sfd: minor cleanup in the Gujarati part. - -2005-12-22 Primoz Peterlin - - * sfd/FreeSans.sfd: Devanagari and Gujarati parts cleared; once - again merged with Gargi 1.9 and Padmaa 0.6, this time correctly so - that the anchor points survived the merger. - -2005-12-16 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0577. - -2005-12-15 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0559, U+055F, U+2024. - - * sfd/FreeSansBold.sfd: added U+056E, U+0573. - -2005-12-14 Primoz Peterlin - - * sfd/FreeSans.sfd: Merged with Gargi 1.9 and Padmaa 0.6, - courtesy Monika Shah and Sonali Sonania from C-DAC, Mumbai. - - * CREDITS: Added Monika Shah and Sonali Sonania. - - * AUTHORS: Added Monika Shah and Sonali Sonania. - -2005-12-13 Primoz Peterlin - - * sfd/FreeSans.sfd - Removed Sinhala glyphs. - - * sfd/FreeSerif.sfd - Added Sinhala glyphs, formerly in FreeSans. - -2005-12-09 Primoz Peterlin - - * sfd/FreeSerif.sfd: added U+20AF, U+211E. Changed U+20AC (EURO - SIGN). - - * tools/freefont-ttf.spec: Added specification file for building - RPM package, courtesy Rok Papez. - - * sfd/FreeSerifBold.sfd: added more glyphs from Txfonts to the - Arrows and Mathematical Symbols ranges. - - * sfd/FreeSerifBoldItalic.sfd: added U+03F5 from Txfonts. - -2005-12-08 Primoz Peterlin - - * sfd/FreeSans.sfd: added U+0567, U+056A, U+056C, U+0582. - - * sfd/FreeSerifBold.sfd: copied Box Drawing range from FreeSans. - - * sfd/FreeSerifBold.sfd: added glyphs from Txfonts to the Arrows - and Mathematical Symbols ranges. - - * sfd/FreeSerif.sfd: added U+2259-225A, U+22BA, U+2308-230B, - U+2322-2323. Cyrillic composite characters replaced with - references. - -2005-12-07 Primoz Peterlin - - * sfd/FreeSerifBold.sfd: added U+025A, U+025D, U+026B, U+029B, - U+02AE, U+02AF, U+02DE. - - * sfd/FreeSerifBold.sfd: updated Hebrew part with Drugulin font - from the Culmus project. - - * sfd/FreeSerif.sfd: added U+207A-207C, U+208A-208C, U+2215-2216. - - * sfd/FreeSans.sfd: added U+2320 TOP HALF INTEGRAL, U+23AE - INTEGRAL EXTENSION, U+2321 BOTTOM HALF INTEGRAL (bug #13370). - -2005-12-07 Primoz Peterlin - - * sfd/FreeSerifBold.sfd: added U+0294-0296, U+02A1-02A2. Started - adding "below" anchors. Performed hinting on characters that were - not hinted "en masse". - -2005-12-06 Primoz Peterlin - - * sfd/FreeSans.sfd: fixed some more metrics problems in the - Extended Greek area; performed hinting on characters that were not - hinted "en masse". - - * Makefile: clean also signature files. - - * sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: cosmetic - changes; cleaning background of referenced composed characters. - -2005-12-05 Panayotis Katsaloulis - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd: Some changes to the greek glyphs, - mostly having to do with "tonos" (accent) - -2005-12-05 Primoz Peterlin - - * sfd/FreeSans.sfd: minor cosmetic changes. - - * sfd/FreeSans.sfd: adjusted widths of characters in the Extended - Greek range; accents are not any more considerably overhanging on - the left side. Added U+1EDA-1EE3, U+1EE8-1EF1. - - * sfd/FreeSans.sfd: continued working on Extended Greek range; - metrics still not finished. - -2005-12-03 Primoz Peterlin - - * sfd/FreeSans.sfd: fixed combined Greek accents (bug - #12800). Width of characters still need to be adjusted as in - FreeSerif. - - * sfd/FreeSerif.sfd: fixed positions of Greek accents (bug #12798). - - * CREDITS: Added Panayotis Katsaloulis. - - * AUTHORS: Added Panayotis Katsaloulis. - - * Makefile: minor changes; now creating also a tarfile with sfds. - -2005-12-01 Primoz Peterlin - - * sfd/FreeSerifItalic.sfd: added U+0183, U+018C, U+01C0, U+01C1, - U+01C3, U+01E0, U+01E1, U+01F8, U+01F9. - - * Makefile: created a Makefile to assist building. - - * README: an update. - - * COPYING: added GNU General Public License, version 2. - - * tools/GenerateTrueType: wrote a FontForge script for conversion - to TrueType. - - * sfd/FreeSerif.sfd: merged with SolaimanLipi Bangla OpenType font - from www.ekushey.org, courtesy Solaiman Karim. - - * sfd/FreeSerifItalic.sfd: merged with SolaimanLipi Bangla - OpenType font from www.ekushey.org, slanted by 15.5 degrees. - - * sfd/FreeSans.sfd: merged with Rupali Bangla OpenType font from - www.ekushey.org - - * sfd/FreeSansOblique.sfd: merged with Rupali Bangla OpenType font from - www.ekushey.org, slanted by 12 degrees. - - * CREDITS: added Solaiman Karim - - * AUTHORS: added Solaiman Karim - -2005-11-30 Primoz Peterlin - - * sfd/FreeSerif.sfd: merged with the Rachana Normal. - - * AUTHORS: added K.H. Hussain and R. Chitrajan - - * CREDITS: added K.H. Hussain and R. Chitrajan - -2005-11-23 Primoz Peterlin - - * sfd/FreeSans.sfd - cleaned some background images. - - * sfd/FreeSans.sfd - added U+01A0-01A1, U+01AF-01B0, U+026E, - U+028F, U+0291, U+02A3-02A5, U+031B. Modified U+0198. - -2005-11-22 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+2504-250B. - - * sfd/FreeSans.sfd - added U+2591-25A1, U+25A3-25A5, U+25AA, U+25AC. - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - added U+0263. - -2005-11-21 Primoz Peterlin - - * sfd/FreeMono.sfd - corrected positions of some Greek diacritics - on page 0x1F. - - * sfd/FreeMonoOblique.sfd - working on bringing it in sync with - FreeMono.sfd. - - * sfd/FreeSerifBoldItalic.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. Added a couple of - glyphs in the IPA Extensions region. - - * sfd/FreeSansBold.sfd - added U+0574, U+0576. Removed overlaps. - -2005-11-20 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+02AA-02AC, U+02B0-02B2. - -2005-11-19 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+01B7-01B9, U+0196, U+019A, U+01C3, - U+0224-0225, U+025E, U+029A, U+2422. Changed U+0184-0185, U+0192, - U+01B4, U+0282, U+0284. - -2005-11-18 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+02EE, U+207F. - - * sfd/FreeSans.sfd - started Box Drawing area. - -2005-11-17 Primoz Peterlin - - * sfd/FreeSerifBold.sfd - added glyphs from the Omega project to - Latin Extended-B, IPA Extensions and Greek ranges. - - * sfd/FreeSerifBoldItalic.sfd - added glyphs from the Omega - project to Latin Extended-B, IPA Extensions and Greek ranges. - - * sfd/FreeSerifItalic.sfd - added glyphs from the Omega - project to Latin Extended-B, IPA Extensions and Greek ranges. - - * sfd/FreeSerifItalic.sfd - added U+018B, U+025C, U+0265, U+026F, - U+0279, U+0287, U+028C-028E, U+029E. - - * sfd/FreeSerifBoldItalic.sfd - added U+1EDA-1EE3, U+1EE8-1EF1, - U+2190-219B, U+219E-21A8, U+21B9-21BA, U+21C4-21CA, U+21E4-21E5, - U+2669-266F. MES-1 compliant. - - * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSansOblique.sfd, - sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - added U+FFFD. - - * sfd/FreeSerif.sfd - removed overlaps in Latin Extended-B and IPA - Extensions ranges. - -2005-11-16 Primoz Peterlin - - * sfd/FreeSerifItalic.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. - - * sfd/papers/eurotex2003/freefont.tex, - sfd/papers/eurotex2003/freefont.bib - Revised version, sent back - by Karl Berry on 20050110, that should match the one published in - TUGboat. - - * sfd/FreeSerifItalic.sfd - started added accent anchors. Added a - handful of Greek letters from Omega font collection. - - * sfd/FreeSerif.sfd - added a handful of letters in the Latin - Extended-B and IPA Extension ranges from the Omega font collection. - -2005-11-16 Denis Jacquerye - - * sfd/FreeSerif.sfd - moved U+0263 to U+0264; added U+0263 - - * sfd/FreeSerifItalic.sfd - fixe U+01EE; added U+01B7-U+01B9 - -2005-11-16 Primoz Peterlin - - * sfd/FreeSans.sfd - Made small Greek letters the same height as - Latin and Cyrillic ones and replaced them with references, where - applicable. - - * sfd/FreeSerif.sfd - replaced Greek letters with references, - where applicable. Added U+03D7, U+03F0-03F2. - - * sfd/FreeSerif.sfd - added U+0255, U+025A, U+025D, U+025F, - U+0262-0263, U+026B-026C, U+0274, U+0276-0277, U+028F, U+0291, - U+029D. - - * sfd/FreeMonoOblique.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. Added U+F6BE. - - * sfd/FreeSansOblique.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. - - * sfd/FreeSans.sfd - changed U+01A5. - -2005-11-16 Primoz Peterlin - - * sfd/FreeSans.sfd - applied the sequence suggested by Werner - Lemberg for reducing redundant points. Replaced accented glyphs in - the Latin-1 and Latin Extended-A areas with references. Made - capital Greek letters the same height as Latin and Cyrillic ones - and replaced them with references, where applicable. - -2005-11-15 Denis Jacquerye - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSansOblique.sfd - fixed - U+026A, it was a dotlessi and therefore like U+0069 when - accented. - -2005-11-15 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - corrected Greek tonos (slanted instead of - a vertical line). - - * sfd/FreeMonoBoldOblique.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. Replaced accented - glyphs in the Latin-1 and Latin Extended-A areas with references. - -2005-11-14 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Added 2005 in copyright info. - - * sfd/FreeSansBoldOblique.sfd - applied the sequence suggested by - Werner Lemberg for reducing redundant points. Replaced accented - glyphs in the Latin-1 area with references. - - * sfd/FreeSansBoldOblique.sfd - added U+0180, U+0184, U+0185, - U+0195, U+01A0-01A2, U+01AF-01B0, U+025E, U+026E, U+0292, - U+0294-0296, U+029A, U+02A1, U+2126-2127, U+2190-219B, - U+219E-21A8, U+21C4-21CA, U+2669-266F. MES-1 compliant. - - * sfd/FreeMono.sfd - Replaced accented glyphs in the Greek and - Cyrillic areas with references. - - * sfd/FreeMonoBold.sfd - applied the sequence suggested by Werner - Lemberg for reducing redundant points. Replaced accented glyphs in - the Latin-1 and Latin Extended-A areas with references. - -2005-11-14 Primoz Peterlin - - * sfd/FreeSerif.sfd - applied the sequence suggested by Werner - Lemberg for reducing redundant points. - - * sfd/FreeSansBold.sfd - added U+219A, U+219B, U+2669-266F. - - * sfd/FreeSerifBold.sfd - added U+2669-266F. - -2005-11-12 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+0180, U+0181, U+0183, U+0187, - U+0188, U+018A, U+018C, U+018D, U+0193, U+019C, U+01A0, U+01A1, - U+01AC, U+01AF, U+01B0, U+025C, U+0260, U+026E, U+0277, U+0281, - U+0284. - -2005-11-11 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+195, U+1A6, U+025E, U+026E, - U+029A, U+0313, U+0314, U+0342, U+0344, U+0345. Started adding - accent anchors. - - * sfd/FreeMono.sfd - applied the sequence for reducing redundant - points, suggested by Werner Lemberg. - - * sfd/FreeMono.sfd - corrected Greek letters (using tonos instead - of a vertical line). Added U+026E, U+F6BE. Accented characters in - Latin 1, Latin Extended A and partly Latin Extended B replaced by - references. - - * sfd/FreeSerifBold.sfd - applied the sequence for reducing - redundant points, suggested by Werner Lemberg. Added U+01A5, - U+02A0, U+2190-219B, U+219E-21A8, U+21B8, U+21B9, U+21C4-21CA, - U+21E4, U+21E5. - -2005-11-10 Primoz Peterlin - - * sfd/FreeSansOblique - changed U+0192, U+01A5; added U+01C0-01C3. - - * sfd/FreeSansBold.sfd - replaced glyphs with references in the - Cyrillic area. Removed U+04A8, U+04A9. Added U+04C5, U+04C6, - U+04C9, U+04CA, U+04CD, U+04CE, U+0535, U+053F, U+0546, U+0565, - U+0584, U+0587, U+0589. - -2005-11-10 Denis Jacquerye - - * sfd/FreeSans.sfd - added U+028A-U+028B - - * sfd/FreeSansOblique - added U+028A-U+028B, U+0276, - U+0292, U+0294-U+0296, U+0298-U+0299 and U+029B; fixed some - other glyphs - -2005-11-10 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+01A6. Simplified outlines in the - ASCII range. - - * sfd/FreeSansBold.sfd - added U+00A0, U+00AD, U+0531, U+2126, - U+2190-2199, U+219E-21A8, U+21C4-21CA. - - * sfd/FreeSansBold.sfd - applied the sequence for reducing - redundant points, suggested by Werner Lemberg. Added automatically - constructed accented characters in page 0x1E. - -2005-11-09 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+0183, U+018C. - - * sfd/FreeSans.sfd - added U+1EA2, U+1EA3, U+1EA8, U+1EA9, U+1EB2, - U+1EB3, U+1EBA, U+1EBB, U+1EC2, U+1EC3, U+1EC8, U+1EC9, U+1ECE, - U+1ECF, U+1ED4, U+1ED5, U+1EE6, U+1EE7, U+1EF6, U+1EF7, U+220A, - U+220B, U+220D, U+2272, U+2273, U+2282, U+2283. - - * sfd/FreeSerifItalic.sfd - changed U+03D5. - - * sfd/FreeSerifBoldItalic.sfd - changed U+03C6; added U+2070, - U+2075-2079, U+207F, U+2080, U+2085-2089, U+2155-217F. - - * sfd/FreeSerif.sfd - added U+0184, U+0185, U+018D, U+0195, - U+0197, U+019A, U+019B, U+01A0, U+01A1, U+01AC, U+01B5, U+01B6, - U+01C0, U+01C1, U+01C3, U+01F6, U+0294-0296, U+1E9A, U+1EDA-1EE3, - U+1EE8-1EF1. - -2005-11-07 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+0562, U+056D. U+0575. - - * sfd/FreeMono.sfd - added U+0589. - -2005-11-06 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+0278, U+03D5, U+2248. Corrected - U+2071, U+222E, U+2242, U+2243 in response to bug reports - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276118 - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276120 - - * sfd/FreeMono.sfd - added U+2227, U+2228, U+2262. Corrected - U+2299-229D in response to bug report - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276121 - - * sfd/FreeMonoBold.sfd - added U+2010, U+2012 in response to bug - report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=289032 - Swapped U+03C6 (Greek small letter phi) and U+03D5 (Greek phi - symbol) in order to conform to Unicode standard. Simplified glyph - shapes in ASCII range. Started adding "above" and "below" anchors. - -2005-11-05 Primoz Peterlin - - * sfd/FreeSerif.sfd - accented letters in Latin Extended-A - replaced by references wherever possible. - - * sfd/FreeSerif.sfd - added U+0180, U+0181, U+0187, U+0188, - U+018A, U+0193, U+019C, U+01A4, U+01A5, U+01A7, U+01A8, U+01AF, - U+01B0, U+026E, U+0270, U+0278, U+0280, U+0281, U+028B, U+0299, - U+029C, U+029F. - -2005-11-03 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+0180, U+0184, U+0185, U+0192, - U+019B, U+01A0-01A2, U+01AF, U+01B0, U+01EE, U+01EF, U+0292, - U+0294-0296, U+02A1, U+0532, U+054C, U+057C, U+222B. Changed - U+014B, U+01A5, U+01B4, U+03BB. - - * sfd/FreeSans.sfd - added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, - U+04CE. - - * sfd/FreeSansBold.sfd - cleaner Arabic outlines. Added U+01E4, - U+01E5. - -2005-11-02 Primoz Peterlin - - * sfd/FreeSansBold.sfd - started Armenian; added U+0538, U+0542, - U+0544, U+0548, U+054D, U+054F, U+0550, U+0553, U+0555, U+0561, - U+0563, U+0564, U+0566, U+0568 U+056B, U+056F, U+0570, U+0572, - U+0578, U+057A, U+057D-057F, U+0580, U+0581, U+0583, U+0585. - - * sfd/FreeMono.sfd - swapped U+03C6 (Greek small letter phi) and - U+03D5 (Greek phi symbol) in order to conform to Unicode standard. - Added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, U+04CE. - -2005-11-01 Primoz Peterlin - - * sfd/FreeSansBold.sfd - modified U+019C. - - * sfd/FreeSansBoldOblique.sfd - added U+00A0, U+00AD, U+019C, - U+01B7, U+01B8, U+0275, U+0278, U+0298, U+2012, U+2015, - U+2070-207F, U+2080-208E, U+2153-217F, U+2213, U+2215. - -2005-10-31 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+0199, U+01AB, U+0265, U+0282, - U+0288, U+028C-028E, U+0290, U+029E, U+02A0. - -2005-10-28 Primoz Peterlin - - * sfd/FreeSerifBold.sfd - added U+019E, U+01AB, U+01AD, U+01B1, - U+0256, U+025F, U+0265, U+0269, U+026F, U+0270, U+0279-027F, - U+0282, U+0287, U+0288, U+028C-028E, U+0290. - - * sfd/FreeSerifBold.sfd - added U+2070, U+2075-2079, U+2080, - U+2085-2089, U+2153-215E, U+2113-2115, U+2119. - - * sfd/FreeSerifBold.sfd - added U+0199, U+019B, U+01B8, U+01B9, - U+01BE, U+01C0, U+0262, U+0274, U+0278, U+0280, U+028F, U+0298, - U+0299, U+029C, U+029E, U+029F, U+2012, U+2015, U+2016, U+2129, - U+2217. - -2005-10-27 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+018D, U+0194, U+019B, U+019C, U+01B5, - U+01B6, U+0295, U+0296, U+029B, U+02A2, U+0472, U+0473, U+2114, - U+2119. - - * sfd/FreeSerifItalic.sfd - minor cleanup in the superscript range - (U+2070-2079). - - * sfd/FreeSansBold.sfd - added subscripts and superscripts - (U+2070-208F), completed fractions (U+2152-215F) and Roman - numerals (U+2160-217F). - - * sfd/FreeSerifBold.sfd - added U+018B, U+018E, U+018F, U+0191, - U+019D, U+01A7, U+01A8, U+01AE, U+0253, U+0266, U+0267, U+026A, - U+0271-0273, U+0283, U+0285. - -2005-10-26 Primoz Peterlin - - * sfd/FreeSans.sfd - added "above" anchors to selected Cyrillic - characters. Added U+0294, U+02A1. - - * sfd/FreeMono.sfd - added U+2011, U+2012, U+203B, U+204A, U+2071, - U+2129, U+2232, U+2233. Changed and/or corrected U+2106, U+211E, - U+2126, U+2127, U+2153-215F, U+2202. - - * sfd/FreeMono.sfd - a try to imitate Denis' work on adding - anchors by adding "above" anchor to a couple of basic Latin - characters. - - * sfd/FreeSansBold.sfd - added U+0278, U+0298. Cleaned up outlines - of most Greek letters. - - * sfd/FreeSansBold.sfd - Added U+2010-2012, U+2015, U+2032, - U+203C, U+2047-2049. - - * sfd/FreeSans.sfd - Added U+01C0-01C2, U+0276, U+0292, - U+0298. Changed U+0251, U+0294, U+02A1. - -2005-10-25 Primoz Peterlin - - * sfd/FreeSerifItalic.sfd - added U+00A0, U+00AD, U+2010-2012, - U+2015, U+2126, U+2127, U+2153-215E, U+2160-217F, U+2190-2193, - U+2669-266F. FreeSerifItalic is now MES-1 compliant. - - * sfd/FreeSerif.sfd - added U+0191, U+019D, U+01AE, U+027E, - U+027F, U+0283, U+0285. - - * sfd/FreeSerif.sfd - added U+019E, U+01AD, U+01B8, U+01B9, - U+0253, U+0256, U+0257, U+025C, U+0260, U+0266, U+0267, U+0269, - U+026D, U+0271-0273, U+0279-027D. - - * sfd/FreeSerifBoldItalic.sfd - added U+00A0, U+00AD, U+2010-2012, - U+2015, U+2032-2034, U+203C, U+2047-204A, U+2074, U+2081-2084, - U+2126, U+2153, U+2154, U+215F, U+2215. Corrected positions of - diacritics on U+0200-0217. - - * sfd/FreeSansOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBoldOblique.sfd, - sfd/FreeMonoBold.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd sfd/FreeSerifBoldItalic.sfd - brought in - sync with Valek Filipov's urw-fonts-1.0.7pre41. - - * sfd/FreeSansOblique.sfd - added U+00A0, U+2011-2012, U+2015, - U+2070, U+2071, U+2074-2079, U+2080-2089, U+2126, U+2153-215F, - U+2190-2195, U+2215, U+266A. FreeSansOblique is now MES-1 - compliant. - -2005-10-24 Denis Jacquerye - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - added - ccmp for i and j to be substituted with dotless i or j when - followed by above diacritic - -2005-10-24 Primoz Peterlin - - * sfd/FreeSans.sfd - added U+2011, U+2012, U+2015. FreeSans is now - MES-1 conformant. - -2005-10-23 Denis Jacquerye - - * sfd/FreeSans.sfd - added above, below, abovemk and belowmk - anchors for diacritics placement to many Basic Latin characters, - some Latin Extented A and B, and some IPA characters; fixed a - couple of precomposed characters to have diacritics at the same - height as similar characters. - -2005-10-21 Primoz Peterlin - - * sfd/FreeSerif.sfd - added U+02B9, U+02BA, U+02CD, U+2017, - U+2036, U+2037, U+203C, U+203E, U+2047-204A. - -2005-10-20 Primoz Peterlin - - * sfd/FreeSerifBold.sfd - added U+0182, U+0189, U+0192, U+019F, - U+01A9, U+01B7, U+01C4-01CC, U+01E0-1E2, U+01F0-01F3, U+F6BE. - Corrected position of diacritics on U+0200-0217. - - * sfd/FreeSerif.sfd - added U+00A0, U+00AD, U+0182, U+0189, - U+018B, U+018E, U+018F, U+0192, U+019F, U+01A9, U+01B1, U+01B7, - U+01DD, U+2010-2013, U+2015. FreeSerif is now MES-1 conformant. - -2005-10-19 Denis Jacquerye - - * sfd/FreeSerif.sfd - added U+0268, U+026A, U+0289, U+0292; and - anchor "above" to more base glyphs. - - * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBoldItalic.sfd - added U+0250-0252, U+0258-0259, - U+0261, U+0268, U+026A, U+0279, U+0289 - - * sfd/FreeSerifBold.sfd - added anchor "above" to marks - U+0300-0314, and to base glyphs (vowels). - -2005-10-18 Denis Jacquerye - - * sfd/FreeSerif.sfd - added anchor "above" to marks U+0300-0314, - and bases vowel of the U+0041-007A range, U+00E6, U+0186, U+0190, - U+0254 and U+025B; fixed Latin-1 Supplement block accented glyphs - to use references. - -2005-10-17 Primoz Peterlin - - * sfd/FreeSansBold.sfd - added U+01B7, U+01B8, U+0275. - -2005-10-16 Denis Jacquerye - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added some Latin - Extended-B African letters: U+0181, U+018A, U+0197-0198, U+01A4, - U+01AC, U+01B1, U+01B3-01B4; - - * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added Latin - Extended-B U+0187, 018E-018F, U+0191, U+0193, U+0197-0199, - U+019D-019F, U+01AB-01AE; correcting width of non-space - Combining Diacrtical Marks; added more glyphs to IPA Extensions - to match non Bold - - * sfd/FreeSansBoldOblique.sfd - added many accented glyphs to - Latin Extended-B - -2005-10-15 Denis Jacquerye - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added IPA Extensions - U+0262,U+0274,U+0280-0281, U+0299, U+029F, and Spacing Modifier - Letters U+02C9-02CB; fixed U+0287,029E height to baseline; added - stroke to U+0268 - - * sfd/FreeSansOblique.sfd - fixed skew on U+027F - - * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added to Latin - Extended-B U+01A7-01A8, IPA Extensions U+0251-0253, U+0256-0257, - U+0261, U+0265-026A, U+026F-0273, U+0289, U+028C-028E - - * sfd/FreeSansBoldOblique.sfd - added to Latin extended-B U+0189, - U+01A8, U+01B1, U+0283, U+02C9 and Spacing Modifiers U+02C9-02CB - -2005-10-14 Primoz Peterlin - - * sfd/FreeSansBold.sfd - Added a couple of composite glyphs, - mostly in the IPA and Latin Extended B ranges. - -2005-10-13 Denis Jacquerye - - * FreeSans.sfd - removed overlap and simplified U+0187, 0191, - 0193, 01A5, 01AE, 0260, 0271, 0272, 0273, 027B; fixed diacritics - placement on U+0200-0217; fixed glyph for U+0283 to correct esh - without stroke; added U+025F and fixed U+025F from it; fixed - height of glyph at U+0285; arranged U+027E,027F to make more - distinguishable from U+0072. - - * FreeSansOblique.sfd - added the corrected or new glyphs from - FreeSans; diacritics on U+200-0217 will need height readjustements. - - * FreeSansBold.sfd, FreeSansBoldOblique.sfd - added U+0186, 0190, - 0250, 0254, 0258, 0259, 025B, 025C - -2005-10-13 Primoz Peterlin - - * sfd/FreeSerif.sfd - Minor changes: U+22A2, U+22A3, U+22A6, U+23AE. - Added U+0250, U+0251, U+0258, U+0259, U+0275. - - * sfd/FreeSerifItalic.sfd - Added glyphs U+222B-U+222F, U+2320, - U+2321. Fixed diacritics on U+0200-U+0217. - -2005-10-12 Denis Jacquerye - - * sfd/FreeSerif.sfd - Corrected diacritics position on - U+01D5-01D9,01DB,01EA-01ED,0200-0217 and U+022A. - - * sfd/FreeSerif.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBoldItalic.sfd - added U+0186,0190,0254 and U+025B. - -2005-10-11 Primoz Peterlin - - * sfd/FreeSerif.sfd - Fixed bug #13399 (glyphs for U+0360 and - U+0361 were swapped). - - * sfd/FreeSerif.sfd - Attempt to correct bug #13370: INTEGRAL - EXTENSION does not align with TOP/BOTTOM HALF INTEGRAL; added - glyph U+23AE. - -2005-05-16 Primoz Peterlin - - * sfd/FreeMono.sfd - Corrected shapes for Cross of Lorraine and - Cross of Jerusalem. - -2005-04-07 Primoz Peterlin - - * sfd/FreeSansBold.sfd - Added some combining accents, just to - test the a version of FontForge. - -2003-12-05 Primoz Peterlin - - * sfd/FreeMono.sfd - Some composite Latin characters rebuilt, as - they had accents 600 points to the left due to changes on October - 2. Some other minor changes in the mathematics area. - -2003-10-08 Primoz Peterlin - - * sfd/FreeMonoOblique.sfd, sfd/FreeSerifBoldItalic.sfd, - FreeSerifItalic.sfd - applied Josef Segur's corrections from - Oct. 5. - -2003-10-02 Primoz Peterlin - - * sfd/FreeSerif.sfd - Abbas Izad's contributed Arabic/Farsi - characters added. - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Combining characters (U+0300 - - U+036F) moved left, so that they have negative horizontal values - and zero advance width. - -2003-09-15 Primoz Peterlin - - * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd - Started working - on super- and subscripts. - -2003-09-12 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSerif.sfd - Added some missing - Hiragana and Katakana characters. - - * sfd/FreeSansBold.sfd - Cleared background characters in Latin - Extended-A. Added some automatically constructed characters in - Latin Extended-B. Started with superscripts and subscripts. - - * sfd/FreeSans.sfd - Subscript numerals (U+2080-U+2089) completed. - -2003-05-19 Primoz Peterlin - - * sfd/FreeSerif.sfd - Thai characters po pla and bo baimai - swapped; Thai character fongman corrected; all courtesy Theppitak - Karoonboonyanan. - -2003-05-17 Panayotis Katsaloulis - - * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Full support - of all ancient greek glyphs - -2003-05-15 Primoz Peterlin - - * tools/KerningNumerals.pl - A Perl script for moving kerning - information from ASCII numerals (U+0030...) to characters in the - Adobe corporate use area (U+F6xx). - - * sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, - sfd/FreeSansBoldOblique.sfd - Created kerned numerals in the Adobe - corporate use area (U+F6xx) and moved kerning information from - ASCII numerals to the kerned numerals. - -2003-05-14 Primoz Peterlin - - * sfd/FreeSans.sfd - First approximation of super- and subscript - numerals and vulgar fractions. - - * sfd/FreeSerif.sfd - Super- and subscript numerals complete, - vulgar fractions completed and redone as references rather than - outlines. - -2003-05-12 Primoz Peterlin - - * sfd/FreeSerif.sfd - Clean-up of the Cyrillic letters added on - March 27; super- and subscripts, vulgar fractions. - -2003-05-09 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - Added a couple of characters to - the Latin Extended-B area and the IPA extensions area. - -2003-05-08 Primoz Peterlin - - * sfd/FreeSerifBoldItalic.sfd - Added a couple of characters to - the Latin Extended-B area. - - * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - ASCII - numerals now monospaced; kerned numerals moved to Adobe corporate - use area - (U+F6xx). - -2003-05-07 Primoz Peterlin - - * sfd/FreeSerif.sfd - Roman numerals now more complete. - - * sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - Accented - characters added in the Latin Extended-B area. - - * sfd/FreeSans.sfd - Greek accents added in the Greek Extended - area, characters added in the Latin Extended-B area, Roman - numerals added. - - * sfd/FreeMonoOblique.sfd - Kerning pairs removed (what were they - doing in a monospaced font, anyway?). - - * sfd/FreeMonoBoldOblique.sfd - Additions in Latin Extended-B and - Basic Greek. - - * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, - sfd/FreeSansBoldOblique.sfd - Major cleanup (fixed widths, open - paths, path directions (clockwise/counter-clockwise), points - rounded to integer values; outlines simplified etc.) - -2003-05-06 Primoz Peterlin - - * tools/OS2UnicodeRange - A simple script to display OS/2 Unicode - range table in TrueType fonts. - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - ASCII numerals now - monospaced; kerned numerals moved to Adobe corporate use area - (U+F6xx). FreeSans is done, FreeSansBold half-way. - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Added 2003 in copyright info. - -2003-03-27 Primoz Peterlin - - * sfd/FreeSerif.sfd - Cyrillic and Cyrillic Supplement blocks - brought to conformance with Unicode 3.2, courtesy Daniel Shurovich - Chirkov. - -2003-03-19 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - somewhat wider - germandbls (U+00DF), due to complaints by Walter Schmidt. - -2003-03-18 Primoz Peterlin - - * sfd/FreeSans.sfd - Added Sinhala glyphs from the Tipitaka - project , recoded to Unicode by Noah Levitt. - -2003-02-19 Primoz Peterlin - - * sfd/FreeSans.sfd - Minor changes on mathematical operators. - -2003-02-18 Primoz Peterlin - - * sfd/FreeMono.sfd - minor cleanup of glyph backgrounds; changed - integral signs (U+222B - U+2230) - -2003-02-05 Primoz Peterlin - - * sfd/FreeSans.sfd - added a couple of glyphs in the IPA and - African Latin ranges. - -2003-01-30 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd - Corrected Maltese Hbar (U+0126) - and/or hbar (U+0127). - -2003-01-28 Primoz Peterlin - - * sfd/FreeSerifItalic.sfd - Corrected Maltese hbar (U+0127). - -2002-12-18 Primoz Peterlin - - * tools/ConvertFont - PfaEdit script for converting SFD files to - TrueType fonts. - - * sfd/FreeSans.sfd - Added Tamil and Kannada glyphs from the - Akruti Indic fonts. - -2002-12-17 Primoz Peterlin - - * sfd/FreeSans.sfd - Added Devanagari and Gujarati glyphs from the - Akruti Indic fonts. - - * www/index.html - Added information on Rogier van Dalen's tools. - - * AUTHORS - Added M.S. Sridhar. - - * CREDITS - Correct spelling of Culmus project. Added M.S. Sridhar. - -2002-12-06 Primoz Peterlin - - * sfd/FreeMono.sfd - Added Braille glyphs, courtesy Vyacheslav - Dikonov. - - * sfd/FreeSans.sfd - Added Unicode Syriac glyphs, courtesy - Vyacheslav Dikonov. - -2002-10-11 Primoz Peterlin - - * www/index.html - Added information on the availability of the - Debian GNU/Linux package. - - * sfd/FreeSerif.sfd, sfd/FreeSans.sfd - added some kern pairs - beyond Latin-1 area. - - * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - re-introduced - all the emtpy glyph slots (changes from Sep 23 made PfaEdit - crash). - -2002-09-23 Primoz Peterlin - - * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, - sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - imported - kerning information from the URW++ AFM files - -2002-09-11 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoOblique.sfd - updated Hebrew parts to comply with - Culmus v0.6. - - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansOblique.sfd - Added Danilo Segan's Serbian Cyrillic - glyphs; updated Hebrew parts to comply with Culmus v0.6. - -2002-09-09 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansOblique.sfd - Updated Cyrillic part to match - Filippov's 1.0.7pre14 - - * sfd/FreeSansOblique.sfd - added Sam Stepanyan's Armenian glyphs - from FreeSans (skewed for 12 degrees). - -2002-09-06 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, - sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd - Added Maxim - Iorsh's Hebrew characters. - -2002-08-29 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, - sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd - Added Maxim - Iorsh's Hebrew characters. - - * AUTHORS, CREDITS - Added Maxim Iorsh as author. - -2002-08-28 Primoz Peterlin - - * www/index.html - Added information of Microsoft's withdrawal of - freely available Unicode TrueType fonts - - * www/resources.html - Added link to Maxim Iorsh's Culmus project. - -2002-07-26 Primoz Peterlin - - * sfd/FreeMono.sfd - Added a couple of characters (Arrows area). - -2002-06-11 Primoz Peterlin - - * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning - perispomeni in Greek politoniko. - -2002-05-23 Primoz Peterlin - - * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning - psili in Greek politoniko. Also added two working variants of - chars in the IPA range. - -2002-05-15 Primoz Peterlin - - * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifBold.sfd - Deleted explicit ".notdef" character with - no contours. - -2002-05-14 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - The new version of PfaEdit saves - correctly formed Panose and LineGap lines. - - * sfd/FreeSansBoldOblique.sfd - Filled-in the missing TTFWidth and - TTFWeight values. - -2002-05-09 Primoz Peterlin - - * sfd/FreeSans.sfd - Added diacritics to the Spacing Modifier - Letters and Combining Diacritical Marks areas. Added composed - glyphs to the Latin Extended-B area. - -2002-05-07 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Updated Panose information with data - provided by Josef W. Segur. Updated TTF headers with English and - Slovenian text. - -2002-04-30 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - Working on Greek small letters. Several - minor changes (lower carons etc.) - -2002-04-29 Primoz Peterlin - - * FreeMonoBoldOblique.sfd - Started adding Greek. - - * sfd/FreeMonoBold.sfd - Added glyphs in the Geometrical Shapes - and Miscellaneous Symbols area. Harmonizing Greek with Latin. Done - with capitals. - - * sfd/FreeMono.sfd - Deleted the explicit .notdef character. Added - one glyph to the Geometrical Shapes area, which is now completed; - added three glyphs to the Miscellaneous Symbols area. Harmonizing - Greek with Latin. Done with the capitals. - -2002-04-26 Primoz Peterlin - - * sfd/FreeSans.sfd - Adjusted accent positions on several glyphs - in the Latin Extended-A area. - -2002-04-25 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - Box Drawing area completed. Added a - couple of glyphs in the Geometrical Shapes area. - - * sfd/FreeMono.sfd - Small corrections in the Box Drawing area. - -2002-04-24 Primoz Peterlin - - * sfd/FreeMono.sfd - Box Drawing area completed. - -2002-04-23 Primoz Peterlin - - * tools/WGL4.lst - corrected. - - * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Box Drawing - area. - -2002-04-22 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Latin - Extended-B and Greek. - -2002-04-19 Primoz Peterlin - - * sfd/FreeSerif.sfd - Somewhat cleaner chess figures. - - * tools/MES-2.txt, tools/MES-2.lst - Corrected list (it is not - 203C-203E, it is 203C and 203E). - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, - sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, - sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, - sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, - sfd/FreeSerifBoldItalic.sfd - Changed "Family Name" from Free to - FreeSerif, FreeSans and FreeMono, as appropriate. Changed Font - Modifiers from MonoBold etc. to Bold, Italic, Oblique, BoldOblique - and BoldItalic. - -2002-04-18 Primoz Peterlin - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, - sfd/FreeMonoBoldOblique.sfd - Corrected metrics; now all character - widths are set to 600. - -2002-04-17 Primoz Peterlin - - * sfd/FreeSerif.sfd - Corrected glyphs in the Box Drawing area and - Block Elements area, which should extend through the ascender *and - descender* height. - - * sfd/FreeMonoBold.sfd - Continued working on harmonizing Greek - letters with Latin and Cyrillic. - - * sfd/FreeMonoBold.sfd - Added some box drawing characters. - -2002-04-16 Primoz Peterlin - - * www/design-notes.html - Updated notes on stroke width for - symbols in Free Mono Bold. - - * sfd/FreeMono.sfd - Added a handful of characters in the - Miscellaneous Symbols area. - - * sfd/FreeMonoBoldOblique.sfd - Added subscripts, superscripts and - vulgar fractions. - - * sfd/FreeMonoBold.sfd - Started harmonizing Greek letters with - Latin and Cyrillic. - - * sfd/FreeMonoBold.sfd - Added subscripts, superscripts and vulgar - fractions. - -2002-04-15 Primoz Peterlin - - * www/design-notes.html - Updated notes on super-/subscripts in - Free Mono Bold. Separate subsections for Free Mono regular and - Free Mono Bold. - -2002-04-12 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added Ethiopian glyphs, converted from the - Metafont sources from TGI, Universität Hamburg (authors Berhanu - Beyene, Prof. Dr. Manfred Kudlek, Olaf Kummer, and Jochen - Metzinger) using Szabo's TeXtrace and retouched using - PfaEdit. Ethiopian metafonts are released under GNU GPL, - . - - * sfd/FreeMonoBold.sfd - Added 40 characters, mostly in the Latin - Extended-B and IPA Extensions areas. - -2002-04-11 Primoz Peterlin - - * sfd/FreeMono.sfd - Added a handful of characters in the Latin - Extended-B, IPA Extensions, Currency Symbols and Miscellaneous - Symbols areas. - -2002-04-09 Primoz Peterlin - - * sfd/FreeMono.sfd - Correcting accent positioning in the Extended - Greek area; adding a couple of characters here and there. Still 20 - characters short of MES-2 conformance. - -2002-04-08 Primoz Peterlin - - * sfd/FreeMono.sfd - Added some characters in the Arrows area; - more or less completed Extended Greek area (accents still need to - be fine-tuned). - -2002-04-05 Primoz Peterlin - - * sfd/FreeMono.sfd - Modern non-Russian Cyrilic mostly completed. - - * sfd/FreeMonoOblique.sfd - Synchronized with FreeMono. - - * sfd/FreeSerif.sfd - Added Thomas Ridgeway's Tamil characters - (converted from Metafont and edited somehwat). - -2002-04-04 Primoz Peterlin - - * sfd/FreeMonoOblique.sfd - Armenian letters added. - - * sfd/FreeMonoBold.sfd - Serbian Cyrillic letters dje, tshe, lje - and nje corrected. - - * sfd/FreeMono.sfd - Serbian Cyrillic letters dje and tshe - corrected. Some other non-Russian Cyrillic letters modified and - "welded together". - -2002-04-03 Primoz Peterlin - - * sfd/FreeMono.sfd - Added more or less complete Armenian - area. The glyphs are a tidied-up version based on the Armenian - Courier on the . Now we have - 1673 characters. - -2002-03-28 Primoz Peterlin - - * sfd/FreeMono.sfd - Added some mathematical symbols. - -2002-03-26 Primoz Peterlin - - * sfd/FreeSans.sfd - took H.S. Pannu's Gurmukhi from FreeSerif. It - actually fits to FreeSans much better. It seems I'll have to look - for another Gurmukhi font with modulated stroke for FreeSerif. - - * sfd/FreeSerifItalic.sfd - replaced existing Hebrew glyphs by - those from FreeSerif (slanted for 15.5 degrees). - - * sfd/FreeSerif.sfd - Added dotted Hebrew letters. Changed barred H. - - * sfd/FreeMono.sfd - Completed vulgar fractions; minor changes in - Greek; added some mathematical operators. - - * sfd/FreeMonoBold.sfd - added 12 characters to Latin Extended-B - and IPA Extensions areas (total 984). - -2002-03-25 Primoz Peterlin - - * sfd/FreeMonoBold.sfd - started adding Latin Extended-B and IPA - Extensions. - - * sfd/FreeMono.sfd - Minor cosmetic changes; cleaning up Greek - (removing redundant control points), added some non-European - Cyrillic glyphs as a test. - -2002-03-22 Primoz Peterlin - - * sfd/FreeMono.sfd - Some minor modifications; letters in Latin - Extended-B area "welded" together. - -2002-03-20 Primoz Peterlin - - * www/index.html - finally linked the resources and design notes - pages. - - * www/design-notes.html - added scaling information for super- and - subscript numerals in FreeMono. - -2002-03-19 Primoz Peterlin - - * sfd/FreeMono.sfd - the Latin Extended-B and IPA Extension area - characters moved from FreeMono and skewed for 12 degrees. - -2002-03-18 Primoz Peterlin - - * sfd/FreeMono.sfd - added a dozen or two of new characters, in - particular in the Latin Extended-B and IPA Extension area. - -2002-03-15 Primoz Peterlin - - * sfd/FreeMono.sfd - added a dozen of two of new characters, in - particular in the IPA Extension area. - - * www/design-notes.html - Corrected data for x-height in FreeMono; - information on constructing small caps. - -2002-03-14 Primoz Peterlin - - * sfd/FreeMono.sfd - added three smiley characters to the - Miscallaneous Symbols area. - -2002-03-10 Primoz Peterlin - - * sfd/FreeSerif.sfd - Anshuman Pandey has only converted Gurmukhi - from TrueType to Metafont; the original author of Gurkmukhi font - is Hardip Singh Pannu . - Got the permission from him to include the Gurmukhi glyph set. - -2002-03-08 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added some more glyphs in the Mathematical - Symbols area to a total number of 3374. - -2002-03-06 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added a basic Gurmukhi set. - - * www/design-notes.html - started a page on design notes - - * sfd/FreeMono.sfd - realized that glyphs in the Box Drawing area - and Block Elements area should extend through the ascender *and - descender* height, and corrected it. - - * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd - added some musical - glyphs, linking "no-break space" to space, "soft hyphen" to - hyphen-minus etc. - -2002-03-05 Primoz Peterlin - - * tools/WGL4.lst - Added Windows Glyph List 4.0 - - * tools/LigatureList.pl - Wrote a Perl script, which lists the - GSUB list (ligature list) of a OpenType font. - - * sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd, - sfd/FreeSerifItalic.sfd - auxilliary Hebrew glyphs added. They are - too light compared with Latin and will be substituted with better - ones. - -2002-03-04 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added some more glyphs to the Mathematical - Operators area (page 0x22). - - * sfd/FreeSerif.sfd - Incomplete and fragmentary support for - Devanagari, originating from Harsh Kumar's Shusha fonts was - replaced by Frans Velthuis' Devanagari metafont, now maintained by - Anshuman Pandey and available under - GPL. Until I figure out how to provide glyph substitution table in - OpenType, only the Unicode part is there. - -2002-02-28 Primoz Peterlin - - * ChangeLog file created - - * sfd/FreeSerif.sfd - Added some Telugu glyphs to page 0x0C, - courtesy Prasad A. Chodavarapu - - * sfd/FreeSerif.sfd - Added some glyphs to the Miscellaneous - Symbols page (0x26). - -2002-02-26 Primoz Peterlin - - * mailing lists freefont-announce and freefont-bugs created - -2002-02-25 Primoz Peterlin - - * sfd/FreeSerif.sfd - Added a couple of glyphs in Mathematics - Operators area. - - * sfd/FreeMono.sfd - - Added some more glyphs, in particular in the Mathematical - Operators section. - - Changed FamilyName to Free, FontName to FreeMono, and Full name - to "Free Monospaced". - -2002-02-20 Primoz Peterlin - - * sfd/ directory added containing FreeSerif, FreeSans and FreeMono - families. - - * tools/ directory added containing lists with characters required - for MES (Multilinguag European Subset) compliance. - - * tools/mes-list-expand.pl created - a Perl script for expanding MES - ranges into simple one-char-per-line format - - * tools/CheckConformance.pl created - a Perl script for checking - conformance of a font file with a given coded character set - - * homepage created - -2002-02-19 Primoz Peterlin - - * freefont (Free UCS Scalable Fonts) project approved on - savannah.gnu.org: diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/INSTALL b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/INSTALL deleted file mode 100644 index fbbbe804..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/INSTALL +++ /dev/null @@ -1,86 +0,0 @@ - Installing GNU FreeFont - ======================= - -GNU FreeFont can be used in any modern operating system. - -This document explains how to install FreeFont on some common systems. - -UNIX/GNU/Linux/BSD Systems --------------------------- - -FreeFont works with any system using the free font rasterizer FreeType -. - -* Debian GNU/Linux - -Users of Debian GNU/Linux system will probably want to use the Debian package, -available from the Debian site, - - , - -or any of its mirrors. - -Install them by issuing the command - apt-get install ttf-freefont - - -* KDE local installation - -Users of KDE can install .ttf files on a per-user basis using the KDE -Control Center module "kcmfontinst", which may appear in the menu as - - Settings -> System Administration -> Font Installer - -This is especially helpful for developers and testers. - - -* Generic X-windows - - 1) Fetch the freefont-ttf.tar.gz package with Free UCS outline fonts - in the TrueType format. - - 2) Unpack TrueType fonts into a suitable directory, - e.g. /usr/local/share/fonts/default/TrueType/ - - 3) If you have chosen any other directory, make sure the directory you - used to install the fonts is listed in the path searched by the X - Font Server by editing the config file in /etc/X11/. - - In some systems, you list the directory in the item "catalogue=" - in the file /etc/X11/fs/config. - - 4) Run ttmkfdir in the directory where you unpacked the fonts. - - -Windows 95/98/NT/2000/XP; Vista -------------------------------- - -Note that in at least Vista, XP and 2000, the OpenType versions perform much -better than, and are recommended over, the TrueType ones. - -* Vista: - 1) From the Start menu, open Control Panels - 2) Drag-n-drop font files onto Fonts control panel - You may get a dialog saying - "Windows needs your permission to continue" - a) Click Continue - -* 95/98/NT: - The font installation is similar to Vista. - - In order to use OpenType, users of Windows 95, 98 and NT 4.0 can - install Adobe's 'Type Manager Light'. It is available for download - without cost from Adobe's web site. - - Otherwise, use the TrueType versions. - -Mac OS X --------- - -Installing on Mac OS X consists of moving the .ttf files to either - /Library/Fonts/ or ~/Library/Fonts/ -depending on whether they should be available to all users on your system -or just to yourself. - --------------------------------------------------------------------------- -$Id: INSTALL,v 1.7 2008/12/26 12:33:31 Stevan_White Exp $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/README b/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/README deleted file mode 100644 index 60e67f20..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freefont-20090104/README +++ /dev/null @@ -1,108 +0,0 @@ --*-text-*- - GNU FreeFont - -The GNU FreeFont project aims to provide a useful set of free scalable -(i.e., OpenType) fonts covering as much as possible of the ISO 10646/Unicode -UCS (Universal Character Set). - -Statement of Purpose --------------------- - -The practical reason for putting glyphs together in a single font face is -to conveniently mix symbols and characters from different writing systems, -without having to switch fonts. - -Coverage --------- - -FreeFont covers the following character sets - -* ISO 8859 parts 1-15 -* CEN MES-3 European Unicode Subset - http://www.evertype.com/standards/iso10646/pdf/cwa13873.pdf -* IBM/Microsoft code pages 437, 850, 852, 1250, 1252 and more -* Microsoft/Adobe Windows Glyph List 4 (WGL4) - http://www.microsoft.com/typography/otspec/WGL4.htm -* KOI8-R and KOI8-RU -* DEC VT100 graphics symbols -* International Phonetic Alphabet -* Arabic, Hebrew, Armenian, Georgian, Ethiopian and Thai alphabets, - including Arabic presentation forms A/B -* mathematical symbols, including the whole TeX repertoire of symbols -* APL symbols - etc. - -Editing -------- - -The free outline font editor, George Williams's FontForge - is used for editing the fonts. - -Design Issues -------------- - -Which font shapes should be made? Historical style terms like Renaissance -or Baroque letterforms cannot be applied beyond Latin/Cyrillic/Greek -scripts to any greater extent than Kufi or Nashki can be applied beyond -Arabic script; "italic" is really only meaningful for Latin letters. - -However, most modern writing systems have typographic formulations for -contrasting uniform and modulated character stroke widths, and have some -history with "oblique", faces. Since the advent of the typewriter, most -have developed a typographic style with uniform-width characters. - -Accordingly, the FreeFont family has one monospaced - FreeMono - and two -proportional faces (one with uniform stroke - FreeSans - and one with -modulated stroke - FreeSerif). - -To make text from different writing systems look good side-by-side, each -FreeFont face is meant to contain characters of similar style and weight. - -Licensing ---------- - -Free UCS scalable fonts is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License as published -by the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -The fonts are distributed in the hope that they will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -As a special exception, if you create a document which uses this font, and -embed this font or unaltered portions of this font into the document, this -font does not by itself cause the resulting document to be covered by the -GNU General Public License. This exception does not however invalidate any -other reasons why the document might be covered by the GNU General Public -License. If you modify this font, you may extend this exception to your -version of the font, but you are not obligated to do so. If you do not -wish to do so, delete this exception statement from your version. - - -Files and their suffixes ------------------------- - -The files with .sfd (Spline Font Database) are in FontForge's native format. -Please use these if you plan to modify the font files. - -TrueType fonts for immediate consumption are the files with the .ttf -(TrueType Font) suffix. These are ready to use in Xwindows based -systems using FreeType, on Mac OS, and on older Windows systems. - -OpenType fonts (with suffix .otf) are for use in Windows Vista. -Note that although they can be installed on Linux, but many applications -in Linux still don't support them. - - --------------------------------------------------------------------------- -Primoz Peterlin, -Steve White - -Free UCS scalable fonts: http://savannah.gnu.org/projects/freefont/ -$Id: README,v 1.6 2008/12/25 12:51:41 Stevan_White Exp $ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemono.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freemono.ctg.z deleted file mode 100644 index 93b7b3cf..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freemono.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemono.php b/include/limesurvey/admin/classes/tcpdf/fonts/freemono.php deleted file mode 100644 index 5d45caeb..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freemono.php +++ /dev/null @@ -1,348 +0,0 @@ -800,'Descent'=>-200,'CapHeight'=>40,'Flags'=>32,'FontBBox'=>'[-793 -200 699 800]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); -$up=-125; -$ut=50; -$dw=600; -$cw=array( -32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600, -42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600, -52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600, -62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600, -72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600, -82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600, -92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600, -102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600, -112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600, -122=>600,123=>600,124=>600,125=>600,126=>600,8364=>600,8218=>600,402=>600,8222=>600,8230=>600, -8224=>600,8225=>600,710=>600,8240=>600,352=>600,8249=>600,338=>600,381=>600,8216=>600,8217=>600, -8220=>600,8221=>600,8226=>600,8211=>600,8212=>600,732=>600,8482=>600,353=>600,8250=>600,339=>600, -382=>600,376=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600, -168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600, -178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600, -188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600, -198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, -208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600, -218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600, -228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600, -238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600, -248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600, -258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600, -268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600, -278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600, -288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600, -298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600, -308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600, -318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600, -328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600, -340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600, -350=>600,351=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600, -362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600, -372=>600,373=>600,374=>600,375=>600,377=>600,378=>600,379=>600,380=>600,383=>600,384=>600, -385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600, -395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,403=>600,404=>600,405=>600, -406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600, -416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600, -426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600, -436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600, -446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600, -456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600, -466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600, -476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600, -486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600, -496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600, -506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600, -516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600, -526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600, -536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,548=>600,549=>600, -550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600, -560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600, -597=>600,598=>600,599=>600,600=>600,601=>600,602=>600,603=>600,604=>600,605=>600,606=>600, -607=>600,608=>600,609=>600,610=>600,611=>600,612=>600,613=>600,614=>600,615=>600,616=>600, -617=>600,618=>600,619=>600,620=>600,621=>600,622=>600,623=>600,624=>600,625=>600,626=>600, -627=>600,628=>600,629=>600,630=>600,631=>600,632=>600,633=>600,634=>600,635=>600,636=>600, -637=>600,638=>600,639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,646=>600, -647=>600,648=>600,649=>600,650=>600,651=>600,652=>600,653=>600,654=>600,655=>600,656=>600, -657=>600,658=>600,659=>600,660=>600,661=>600,662=>600,663=>600,664=>600,665=>600,666=>600, -667=>600,668=>600,669=>600,670=>600,671=>600,672=>600,673=>600,674=>600,675=>600,676=>600, -677=>600,678=>600,679=>600,680=>600,681=>600,682=>600,683=>600,684=>600,685=>600,686=>600, -687=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600,695=>600,696=>600, -697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600,705=>600,706=>600, -707=>600,708=>600,709=>600,711=>600,712=>600,713=>600,714=>600,715=>600,716=>600,717=>600, -718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600,726=>600,727=>600, -728=>600,729=>600,730=>600,731=>600,733=>600,734=>600,735=>600,736=>600,737=>600,738=>600, -739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600,747=>600,748=>600, -749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600,757=>600,758=>600, -759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600,767=>600,768=>0, -769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, -779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, -789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, -799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, -809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, -829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0, -839=>0,840=>0,841=>0,843=>0,844=>0,845=>0,848=>0,849=>0,850=>0,851=>0, -852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,884=>600,885=>600,890=>600, -894=>600,900=>600,901=>600,902=>600,903=>600,904=>600,905=>600,906=>600,908=>600,910=>600, -911=>600,912=>600,913=>600,914=>600,915=>600,916=>600,917=>600,918=>600,919=>600,920=>600, -921=>600,922=>600,923=>600,924=>600,925=>600,926=>600,927=>600,928=>600,929=>600,931=>600, -932=>600,933=>600,934=>600,935=>600,936=>600,937=>600,938=>600,939=>600,940=>600,941=>600, -942=>600,943=>600,944=>600,945=>600,946=>600,947=>600,948=>600,949=>600,950=>600,951=>600, -952=>600,953=>600,954=>600,955=>600,956=>600,957=>600,958=>600,959=>600,960=>600,961=>600, -962=>600,963=>600,964=>600,965=>600,966=>600,967=>600,968=>600,969=>600,970=>600,971=>600, -972=>600,973=>600,974=>600,976=>600,977=>600,978=>600,979=>600,980=>600,981=>600,982=>600, -986=>600,987=>600,988=>600,1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600,1026=>600, -1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600,1036=>600, -1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600,1046=>600, -1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600,1056=>600, -1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600,1066=>600, -1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600,1076=>600, -1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600,1086=>600, -1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600,1096=>600, -1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600,1106=>600, -1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600,1116=>600, -1117=>600,1118=>600,1119=>600,1120=>600,1121=>600,1122=>600,1123=>600,1124=>600,1126=>600,1127=>600, -1128=>600,1130=>600,1131=>600,1132=>600,1133=>600,1136=>600,1137=>600,1138=>600,1140=>600,1141=>600, -1142=>600,1143=>600,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1162=>600,1163=>600,1164=>600, -1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600,1172=>600,1173=>600,1174=>600, -1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600,1182=>600,1183=>600,1184=>600, -1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600,1192=>600,1193=>600,1194=>600, -1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600,1202=>600,1203=>600,1204=>600, -1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600,1212=>600,1213=>600,1214=>600, -1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600,1222=>600,1223=>600,1224=>600, -1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600,1232=>600,1233=>600,1234=>600, -1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600,1242=>600,1243=>600,1244=>600, -1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600,1252=>600,1253=>600,1254=>600, -1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600,1262=>600,1263=>600,1264=>600, -1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600,1272=>600,1273=>600,1296=>600, -1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600,1310=>600,1311=>600,1329=>600, -1330=>600,1331=>600,1332=>600,1333=>600,1334=>600,1335=>600,1336=>600,1337=>600,1338=>600,1339=>600, -1340=>600,1341=>600,1342=>600,1343=>600,1344=>600,1345=>600,1346=>600,1347=>600,1348=>600,1349=>600, -1350=>600,1351=>600,1352=>600,1353=>600,1354=>600,1355=>600,1356=>600,1357=>600,1358=>600,1359=>600, -1360=>600,1361=>600,1362=>600,1363=>600,1364=>600,1365=>600,1366=>600,1369=>600,1370=>600,1371=>600, -1372=>600,1373=>600,1374=>600,1375=>600,1377=>600,1378=>600,1379=>600,1380=>600,1381=>600,1382=>600, -1383=>600,1384=>600,1385=>600,1386=>600,1387=>600,1388=>600,1389=>600,1390=>600,1391=>600,1392=>600, -1393=>600,1394=>600,1395=>600,1396=>600,1397=>600,1398=>600,1399=>600,1400=>600,1401=>600,1402=>600, -1403=>600,1404=>600,1405=>600,1406=>600,1407=>600,1408=>600,1409=>600,1410=>600,1411=>600,1412=>600, -1413=>600,1414=>600,1415=>600,1417=>600,1418=>600,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0, -1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>600,1471=>0, -1472=>600,1473=>0,1474=>0,1475=>600,1476=>0,1488=>600,1489=>600,1490=>600,1491=>600,1492=>600, -1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600,1499=>600,1500=>600,1501=>600,1502=>600, -1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600,1509=>600,1510=>600,1511=>600,1512=>600, -1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600,1524=>600,4304=>600,4305=>600,4306=>600, -4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600,4313=>600,4314=>600,4315=>600,4316=>600, -4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600,4323=>600,4324=>600,4325=>600,4326=>600, -4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600,4333=>600,4334=>600,4335=>600,4336=>600, -4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600,4347=>600,5792=>600,5793=>600,5794=>600, -5795=>600,5796=>600,5797=>600,5798=>600,5799=>600,5800=>600,5801=>600,5802=>600,5803=>600,5804=>600, -5805=>600,5806=>600,5807=>600,5808=>600,5809=>600,5810=>600,5811=>600,5812=>600,5813=>600,5814=>600, -5815=>600,5816=>600,5817=>600,5818=>600,5819=>600,5820=>600,5821=>600,5822=>600,5823=>600,5824=>600, -5825=>600,5826=>600,5827=>600,5828=>600,5829=>600,5830=>600,5831=>600,5832=>600,5833=>600,5834=>600, -5835=>600,5836=>600,5837=>600,5838=>600,5839=>600,5840=>600,5841=>600,5842=>600,5843=>600,5844=>600, -5845=>600,5846=>600,5847=>600,5848=>600,5849=>600,5850=>600,5851=>600,5852=>600,5853=>600,5854=>600, -5855=>600,5856=>600,5857=>600,5858=>600,5859=>600,5860=>600,5861=>600,5862=>600,5863=>600,5864=>600, -5865=>600,5866=>600,5867=>600,5868=>600,5869=>600,5870=>600,5871=>600,5872=>600,7680=>600,7681=>600, -7682=>600,7683=>600,7684=>600,7685=>600,7686=>600,7687=>600,7688=>600,7689=>600,7690=>600,7691=>600, -7692=>600,7693=>600,7694=>600,7695=>600,7696=>600,7697=>600,7698=>600,7699=>600,7700=>600,7701=>600, -7702=>600,7703=>600,7704=>600,7705=>600,7706=>600,7707=>600,7708=>600,7709=>600,7710=>600,7711=>600, -7712=>600,7713=>600,7714=>600,7715=>600,7716=>600,7717=>600,7718=>600,7719=>600,7720=>600,7721=>600, -7722=>600,7723=>600,7724=>600,7725=>600,7726=>600,7727=>600,7728=>600,7729=>600,7730=>600,7731=>600, -7732=>600,7733=>600,7734=>600,7735=>600,7736=>600,7737=>600,7738=>600,7739=>600,7740=>600,7741=>600, -7742=>600,7743=>600,7744=>600,7745=>600,7746=>600,7747=>600,7748=>600,7749=>600,7750=>600,7751=>600, -7752=>600,7753=>600,7754=>600,7755=>600,7756=>600,7757=>600,7758=>600,7759=>600,7760=>600,7761=>600, -7762=>600,7763=>600,7764=>600,7765=>600,7766=>600,7767=>600,7768=>600,7769=>600,7770=>600,7771=>600, -7772=>600,7773=>600,7774=>600,7775=>600,7776=>600,7777=>600,7778=>600,7779=>600,7780=>600,7781=>600, -7782=>600,7783=>600,7784=>600,7785=>600,7786=>600,7787=>600,7788=>600,7789=>600,7790=>600,7791=>600, -7792=>600,7793=>600,7794=>600,7795=>600,7796=>600,7797=>600,7798=>600,7799=>600,7800=>600,7801=>600, -7802=>600,7803=>600,7804=>600,7805=>600,7806=>600,7807=>600,7808=>600,7809=>600,7810=>600,7811=>600, -7812=>600,7813=>600,7814=>600,7815=>600,7816=>600,7817=>600,7818=>600,7819=>600,7820=>600,7821=>600, -7822=>600,7823=>600,7824=>600,7825=>600,7826=>600,7827=>600,7828=>600,7829=>600,7830=>600,7831=>600, -7832=>600,7833=>600,7834=>600,7835=>600,7840=>600,7841=>600,7842=>600,7843=>600,7844=>600,7845=>600, -7846=>600,7847=>600,7848=>600,7849=>600,7850=>600,7851=>600,7852=>600,7853=>600,7854=>600,7855=>600, -7856=>600,7857=>600,7858=>600,7859=>600,7860=>600,7861=>600,7862=>600,7863=>600,7864=>600,7865=>600, -7866=>600,7867=>600,7868=>600,7869=>600,7870=>600,7871=>600,7872=>600,7873=>600,7874=>600,7875=>600, -7876=>600,7877=>600,7878=>600,7879=>600,7880=>600,7881=>600,7882=>600,7883=>600,7884=>600,7885=>600, -7886=>600,7887=>600,7888=>600,7889=>600,7890=>600,7891=>600,7892=>600,7893=>600,7894=>600,7895=>600, -7896=>600,7897=>600,7898=>600,7899=>600,7900=>600,7901=>600,7902=>600,7903=>600,7904=>600,7905=>600, -7906=>600,7907=>600,7908=>600,7909=>600,7910=>600,7911=>600,7912=>600,7913=>600,7914=>600,7915=>600, -7916=>600,7917=>600,7918=>600,7919=>600,7920=>600,7921=>600,7922=>600,7923=>600,7924=>600,7925=>600, -7926=>600,7927=>600,7928=>600,7929=>600,7936=>600,7937=>600,7938=>600,7939=>600,7940=>600,7941=>600, -7942=>600,7943=>600,7944=>600,7945=>600,7946=>600,7947=>600,7948=>600,7949=>600,7950=>600,7951=>600, -7952=>600,7953=>600,7954=>600,7955=>600,7956=>600,7957=>600,7960=>600,7961=>600,7962=>600,7963=>600, -7964=>600,7965=>600,7968=>600,7969=>600,7970=>600,7971=>600,7972=>600,7973=>600,7974=>600,7975=>600, -7976=>600,7977=>600,7978=>600,7979=>600,7980=>600,7981=>600,7982=>600,7983=>600,7984=>600,7985=>600, -7986=>600,7987=>600,7988=>600,7989=>600,7990=>600,7991=>600,7992=>600,7993=>600,7994=>600,7995=>600, -7996=>600,7997=>600,7998=>600,7999=>600,8000=>600,8001=>600,8002=>600,8003=>600,8004=>600,8005=>600, -8008=>600,8009=>600,8010=>600,8011=>600,8012=>600,8013=>600,8016=>600,8017=>600,8018=>600,8019=>600, -8020=>600,8021=>600,8022=>600,8023=>600,8025=>600,8027=>600,8029=>600,8031=>600,8032=>600,8033=>600, -8034=>600,8035=>600,8036=>600,8037=>600,8038=>600,8039=>600,8040=>600,8041=>600,8042=>600,8043=>600, -8044=>600,8045=>600,8046=>600,8047=>600,8048=>600,8049=>600,8050=>600,8051=>600,8052=>600,8053=>600, -8054=>600,8055=>600,8056=>600,8057=>600,8058=>600,8059=>600,8060=>600,8061=>600,8064=>600,8065=>600, -8066=>600,8067=>600,8068=>600,8069=>600,8070=>600,8071=>600,8072=>600,8073=>600,8074=>600,8075=>600, -8076=>600,8077=>600,8078=>600,8079=>600,8080=>600,8081=>600,8082=>600,8083=>600,8084=>600,8085=>600, -8086=>600,8087=>600,8088=>600,8089=>600,8090=>600,8091=>600,8092=>600,8093=>600,8094=>600,8095=>600, -8096=>600,8097=>600,8098=>600,8099=>600,8100=>600,8101=>600,8102=>600,8103=>600,8104=>600,8105=>600, -8106=>600,8107=>600,8108=>600,8109=>600,8110=>600,8111=>600,8112=>600,8113=>600,8114=>600,8115=>600, -8116=>600,8118=>600,8119=>600,8120=>600,8121=>600,8122=>600,8123=>600,8124=>600,8125=>600,8126=>600, -8127=>600,8128=>600,8129=>600,8130=>600,8131=>600,8132=>600,8134=>600,8135=>600,8136=>600,8137=>600, -8138=>600,8139=>600,8140=>600,8141=>600,8142=>600,8143=>600,8144=>600,8145=>600,8146=>600,8147=>600, -8150=>600,8151=>600,8152=>600,8153=>600,8154=>600,8155=>600,8157=>600,8158=>600,8159=>600,8160=>600, -8161=>600,8162=>600,8163=>600,8164=>600,8165=>600,8166=>600,8167=>600,8168=>600,8169=>600,8170=>600, -8171=>600,8172=>600,8173=>600,8174=>600,8175=>600,8178=>600,8179=>600,8180=>600,8182=>600,8183=>600, -8184=>600,8185=>600,8186=>600,8187=>600,8188=>600,8189=>600,8190=>600,8192=>600,8193=>600,8194=>600, -8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600,8202=>600,8203=>600,8204=>0, -8205=>0,8206=>0,8207=>0,8208=>600,8209=>600,8210=>600,8213=>600,8214=>600,8215=>600,8219=>600, -8223=>600,8227=>600,8228=>600,8229=>600,8231=>600,8232=>600,8233=>600,8234=>600,8235=>600,8236=>600, -8237=>600,8238=>600,8239=>600,8241=>600,8242=>600,8243=>600,8244=>600,8245=>600,8246=>600,8247=>600, -8248=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600,8257=>600,8258=>600,8259=>600, -8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600,8267=>600,8268=>600,8269=>600, -8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600,8277=>600,8278=>600,8279=>600, -8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600,8287=>600,8288=>600,8289=>600, -8290=>600,8291=>600,8292=>600,8298=>600,8299=>600,8300=>600,8301=>600,8302=>600,8303=>600,8304=>600, -8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600,8314=>600,8315=>600,8316=>600, -8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600,8324=>600,8325=>600,8326=>600, -8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600,8334=>600,8336=>600,8337=>600, -8338=>600,8339=>600,8340=>600,8353=>600,8354=>600,8355=>600,8356=>600,8357=>600,8358=>600,8359=>600, -8360=>600,8361=>600,8362=>600,8363=>600,8365=>600,8366=>600,8368=>600,8369=>600,8370=>600,8371=>600, -8372=>600,8373=>600,8400=>0,8401=>0,8402=>0,8406=>0,8407=>0,8411=>0,8412=>0,8413=>0, -8414=>0,8415=>0,8416=>0,8417=>0,8418=>0,8419=>0,8428=>0,8429=>0,8430=>0,8431=>0, -8448=>600,8449=>600,8450=>600,8451=>600,8453=>600,8454=>600,8455=>600,8457=>600,8461=>600,8463=>600, -8464=>600,8465=>600,8466=>600,8467=>600,8468=>600,8469=>600,8470=>600,8471=>600,8472=>600,8473=>600, -8474=>600,8476=>600,8477=>600,8478=>600,8481=>600,8484=>600,8486=>600,8487=>600,8489=>600,8490=>600, -8491=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600,8505=>600,8506=>600,8507=>600,8523=>600, -8526=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600,8538=>600,8539=>600, -8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600,8546=>600,8547=>600,8548=>600,8549=>600, -8550=>600,8551=>600,8552=>600,8553=>600,8554=>600,8555=>600,8556=>600,8557=>600,8558=>600,8559=>600, -8560=>600,8561=>600,8562=>600,8563=>600,8564=>600,8565=>600,8566=>600,8567=>600,8568=>600,8569=>600, -8570=>600,8571=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600,8595=>600, -8596=>600,8597=>600,8598=>600,8599=>600,8600=>600,8601=>600,8602=>600,8603=>600,8604=>600,8605=>600, -8606=>600,8607=>600,8608=>600,8609=>600,8610=>600,8611=>600,8612=>600,8613=>600,8614=>600,8615=>600, -8616=>600,8617=>600,8618=>600,8619=>600,8620=>600,8621=>600,8622=>600,8623=>600,8624=>600,8625=>600, -8626=>600,8627=>600,8628=>600,8629=>600,8630=>600,8631=>600,8632=>600,8633=>600,8634=>600,8635=>600, -8636=>600,8637=>600,8638=>600,8639=>600,8640=>600,8641=>600,8642=>600,8643=>600,8644=>600,8645=>600, -8646=>600,8647=>600,8648=>600,8649=>600,8650=>600,8651=>600,8652=>600,8653=>600,8654=>600,8655=>600, -8656=>600,8657=>600,8658=>600,8659=>600,8660=>600,8661=>600,8669=>600,8678=>600,8679=>600,8680=>600, -8681=>600,8691=>600,8704=>600,8705=>600,8706=>600,8707=>600,8708=>600,8709=>600,8710=>600,8711=>600, -8712=>600,8713=>600,8714=>600,8715=>600,8716=>600,8717=>600,8718=>600,8719=>600,8720=>600,8721=>600, -8722=>600,8723=>600,8724=>600,8725=>600,8726=>600,8727=>600,8728=>600,8729=>600,8730=>600,8731=>600, -8732=>600,8733=>600,8734=>600,8735=>600,8736=>600,8737=>600,8738=>600,8739=>600,8740=>600,8741=>600, -8742=>600,8743=>600,8744=>600,8745=>600,8746=>600,8747=>600,8748=>600,8749=>600,8750=>600,8751=>600, -8752=>600,8754=>600,8755=>600,8756=>600,8757=>600,8758=>600,8759=>600,8760=>600,8761=>600,8762=>600, -8763=>600,8764=>600,8765=>600,8768=>600,8769=>600,8770=>600,8771=>600,8772=>600,8773=>600,8774=>600, -8775=>600,8776=>600,8777=>600,8778=>600,8779=>600,8780=>600,8781=>600,8784=>600,8785=>600,8786=>600, -8787=>600,8788=>600,8789=>600,8790=>600,8791=>600,8792=>600,8793=>600,8794=>600,8795=>600,8796=>600, -8797=>600,8798=>600,8799=>600,8800=>600,8801=>600,8802=>600,8803=>600,8804=>600,8805=>600,8806=>600, -8807=>600,8808=>600,8809=>600,8810=>600,8811=>600,8812=>600,8813=>600,8814=>600,8815=>600,8816=>600, -8817=>600,8818=>600,8819=>600,8820=>600,8821=>600,8822=>600,8823=>600,8824=>600,8825=>600,8826=>600, -8827=>600,8828=>600,8829=>600,8830=>600,8831=>600,8832=>600,8833=>600,8834=>600,8835=>600,8836=>600, -8837=>600,8838=>600,8839=>600,8840=>600,8841=>600,8842=>600,8843=>600,8844=>600,8845=>600,8846=>600, -8847=>600,8848=>600,8849=>600,8850=>600,8851=>600,8852=>600,8853=>600,8854=>600,8855=>600,8856=>600, -8857=>600,8858=>600,8859=>600,8860=>600,8861=>600,8862=>600,8863=>600,8866=>600,8867=>600,8868=>600, -8869=>600,8870=>600,8871=>600,8872=>600,8873=>600,8874=>600,8875=>600,8876=>600,8877=>600,8878=>600, -8879=>600,8882=>600,8883=>600,8884=>600,8885=>600,8891=>600,8892=>600,8893=>600,8894=>600,8896=>600, -8897=>600,8898=>600,8899=>600,8900=>600,8901=>600,8902=>600,8903=>600,8904=>600,8909=>600,8910=>600, -8911=>600,8912=>600,8913=>600,8914=>600,8915=>600,8924=>600,8925=>600,8926=>600,8927=>600,8928=>600, -8929=>600,8930=>600,8931=>600,8938=>600,8939=>600,8940=>600,8941=>600,8942=>600,8943=>600,8944=>600, -8945=>600,8960=>600,8962=>600,8963=>600,8964=>600,8965=>600,8966=>600,8968=>600,8969=>600,8970=>600, -8971=>600,8972=>600,8973=>600,8974=>600,8975=>600,8976=>600,8978=>600,8980=>600,8981=>600,8984=>600, -8985=>600,8988=>600,8989=>600,8990=>600,8991=>600,8992=>600,8993=>600,8994=>600,8995=>600,8996=>600, -8997=>600,8998=>600,8999=>600,9001=>600,9002=>600,9003=>600,9004=>600,9014=>600,9015=>600,9016=>600, -9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600,9023=>600,9024=>600,9025=>600,9026=>600, -9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600, -9037=>600,9038=>600,9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600, -9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600,9055=>600,9056=>600, -9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600, -9067=>600,9068=>600,9069=>600,9070=>600,9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600, -9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9084=>600,9085=>600,9086=>600,9087=>600, -9088=>600,9089=>600,9090=>600,9091=>600,9092=>600,9093=>600,9094=>600,9095=>600,9096=>600,9097=>600, -9098=>600,9099=>600,9100=>600,9101=>600,9102=>600,9103=>600,9104=>600,9105=>600,9106=>600,9107=>600, -9108=>600,9109=>600,9110=>600,9111=>600,9112=>600,9113=>600,9114=>600,9115=>600,9116=>600,9117=>600, -9118=>600,9119=>600,9120=>600,9121=>600,9122=>600,9123=>600,9124=>600,9125=>600,9126=>600,9127=>600, -9128=>600,9129=>600,9130=>600,9131=>600,9132=>600,9133=>600,9134=>600,9135=>600,9136=>600,9137=>600, -9138=>600,9139=>600,9140=>600,9141=>600,9142=>600,9143=>600,9146=>600,9147=>600,9148=>600,9149=>600, -9150=>600,9151=>600,9152=>600,9153=>600,9154=>600,9155=>600,9156=>600,9157=>600,9158=>600,9159=>600, -9160=>600,9161=>600,9162=>600,9163=>600,9164=>600,9165=>600,9166=>600,9167=>600,9178=>600,9179=>600, -9182=>600,9183=>600,9186=>600,9187=>600,9188=>600,9189=>600,9190=>600,9251=>600,9280=>600,9281=>600, -9282=>600,9283=>600,9284=>600,9285=>600,9286=>600,9287=>600,9288=>600,9289=>600,9290=>600,9312=>600, -9313=>600,9314=>600,9315=>600,9316=>600,9317=>600,9318=>600,9319=>600,9320=>600,9321=>600,9472=>600, -9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600, -9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600, -9493=>600,9494=>600,9495=>600,9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600, -9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600, -9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600, -9523=>600,9524=>600,9525=>600,9526=>600,9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600, -9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600, -9543=>600,9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600, -9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600, -9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600, -9573=>600,9574=>600,9575=>600,9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600, -9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600, -9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600, -9603=>600,9604=>600,9605=>600,9606=>600,9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600, -9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9622=>600, -9623=>600,9624=>600,9625=>600,9626=>600,9627=>600,9628=>600,9629=>600,9630=>600,9631=>600,9632=>600, -9633=>600,9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600, -9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600,9650=>600,9651=>600,9652=>600, -9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600, -9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600, -9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600,9682=>600, -9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600, -9693=>600,9694=>600,9695=>600,9696=>600,9697=>600,9698=>600,9699=>600,9700=>600,9701=>600,9702=>600, -9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9712=>600, -9713=>600,9714=>600,9715=>600,9716=>600,9717=>600,9718=>600,9719=>600,9720=>600,9721=>600,9722=>600, -9723=>600,9724=>600,9725=>600,9726=>600,9727=>600,9728=>600,9729=>600,9730=>600,9731=>600,9733=>600, -9734=>600,9735=>600,9736=>600,9737=>600,9744=>600,9745=>600,9746=>600,9754=>600,9755=>600,9756=>600, -9757=>600,9758=>600,9759=>600,9766=>600,9768=>600,9769=>600,9774=>600,9775=>600,9776=>600,9777=>600, -9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600,9785=>600,9786=>600,9787=>600,9788=>600, -9789=>600,9790=>600,9791=>600,9792=>600,9793=>600,9794=>600,9795=>600,9796=>600,9797=>600,9798=>600, -9799=>600,9800=>600,9801=>600,9802=>600,9803=>600,9804=>600,9805=>600,9806=>600,9807=>600,9808=>600, -9809=>600,9810=>600,9811=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600, -9831=>600,9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,9856=>600,9857=>600, -9858=>600,9859=>600,9860=>600,9861=>600,10176=>600,10177=>600,10178=>600,10179=>600,10180=>600,10181=>600, -10182=>600,10183=>600,10184=>600,10185=>600,10186=>600,10188=>600,10192=>600,10193=>600,10194=>600,10195=>600, -10196=>600,10197=>600,10198=>600,10199=>600,10212=>600,10213=>600,10214=>600,10215=>600,10216=>600,10217=>600, -10218=>600,10219=>600,10226=>600,10227=>600,10229=>600,10230=>600,10231=>600,10232=>600,10233=>600,10234=>600, -10235=>600,10236=>600,10240=>600,10241=>600,10242=>600,10243=>600,10244=>600,10245=>600,10246=>600,10247=>600, -10248=>600,10249=>600,10250=>600,10251=>600,10252=>600,10253=>600,10254=>600,10255=>600,10256=>600,10257=>600, -10258=>600,10259=>600,10260=>600,10261=>600,10262=>600,10263=>600,10264=>600,10265=>600,10266=>600,10267=>600, -10268=>600,10269=>600,10270=>600,10271=>600,10272=>600,10273=>600,10274=>600,10275=>600,10276=>600,10277=>600, -10278=>600,10279=>600,10280=>600,10281=>600,10282=>600,10283=>600,10284=>600,10285=>600,10286=>600,10287=>600, -10288=>600,10289=>600,10290=>600,10291=>600,10292=>600,10293=>600,10294=>600,10295=>600,10296=>600,10297=>600, -10298=>600,10299=>600,10300=>600,10301=>600,10302=>600,10303=>600,10304=>600,10305=>600,10306=>600,10307=>600, -10308=>600,10309=>600,10310=>600,10311=>600,10312=>600,10313=>600,10314=>600,10315=>600,10316=>600,10317=>600, -10318=>600,10319=>600,10320=>600,10321=>600,10322=>600,10323=>600,10324=>600,10325=>600,10326=>600,10327=>600, -10328=>600,10329=>600,10330=>600,10331=>600,10332=>600,10333=>600,10334=>600,10335=>600,10336=>600,10337=>600, -10338=>600,10339=>600,10340=>600,10341=>600,10342=>600,10343=>600,10344=>600,10345=>600,10346=>600,10347=>600, -10348=>600,10349=>600,10350=>600,10351=>600,10352=>600,10353=>600,10354=>600,10355=>600,10356=>600,10357=>600, -10358=>600,10359=>600,10360=>600,10361=>600,10362=>600,10363=>600,10364=>600,10365=>600,10366=>600,10367=>600, -10368=>600,10369=>600,10370=>600,10371=>600,10372=>600,10373=>600,10374=>600,10375=>600,10376=>600,10377=>600, -10378=>600,10379=>600,10380=>600,10381=>600,10382=>600,10383=>600,10384=>600,10385=>600,10386=>600,10387=>600, -10388=>600,10389=>600,10390=>600,10391=>600,10392=>600,10393=>600,10394=>600,10395=>600,10396=>600,10397=>600, -10398=>600,10399=>600,10400=>600,10401=>600,10402=>600,10403=>600,10404=>600,10405=>600,10406=>600,10407=>600, -10408=>600,10409=>600,10410=>600,10411=>600,10412=>600,10413=>600,10414=>600,10415=>600,10416=>600,10417=>600, -10418=>600,10419=>600,10420=>600,10421=>600,10422=>600,10423=>600,10424=>600,10425=>600,10426=>600,10427=>600, -10428=>600,10429=>600,10430=>600,10431=>600,10432=>600,10433=>600,10434=>600,10435=>600,10436=>600,10437=>600, -10438=>600,10439=>600,10440=>600,10441=>600,10442=>600,10443=>600,10444=>600,10445=>600,10446=>600,10447=>600, -10448=>600,10449=>600,10450=>600,10451=>600,10452=>600,10453=>600,10454=>600,10455=>600,10456=>600,10457=>600, -10458=>600,10459=>600,10460=>600,10461=>600,10462=>600,10463=>600,10464=>600,10465=>600,10466=>600,10467=>600, -10468=>600,10469=>600,10470=>600,10471=>600,10472=>600,10473=>600,10474=>600,10475=>600,10476=>600,10477=>600, -10478=>600,10479=>600,10480=>600,10481=>600,10482=>600,10483=>600,10484=>600,10485=>600,10486=>600,10487=>600, -10488=>600,10489=>600,10490=>600,10491=>600,10492=>600,10493=>600,10494=>600,10495=>600,10752=>600,10753=>600, -10754=>600,10755=>600,10756=>600,10757=>600,10758=>600,10781=>600,10815=>600,11008=>600,11009=>600,11010=>600, -11011=>600,11012=>600,11013=>600,11014=>600,11015=>600,11016=>600,11017=>600,11018=>600,11019=>600,11020=>600, -11021=>600,11026=>600,11027=>600,11028=>600,11029=>600,11030=>600,11031=>600,11032=>600,11033=>600,11035=>600, -11036=>600,11037=>600,11038=>600,11039=>600,11040=>600,11041=>600,11042=>600,11043=>600,11044=>600,11045=>600, -11046=>600,11047=>600,11048=>600,11049=>600,11050=>600,11051=>600,11091=>600,11092=>600,64256=>600,64257=>600, -64258=>600,64259=>600,64260=>600,64261=>600,64285=>600,64286=>600,64287=>600,64288=>600,64289=>600,64290=>600, -64291=>600,64292=>600,64293=>600,64294=>600,64295=>600,64296=>600,64297=>600,64298=>600,64299=>600,64300=>600, -64301=>600,64302=>600,64303=>600,64304=>600,64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600, -64312=>600,64313=>600,64314=>600,64315=>600,64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600, -64326=>600,64327=>600,64328=>600,64329=>600,64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600, -65533=>600); -$enc=''; -$diff=''; -$file='freemono.z'; -$ctg='freemono.ctg.z'; -$originalsize=314348; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemono.z b/include/limesurvey/admin/classes/tcpdf/fonts/freemono.z deleted file mode 100644 index 0353139d..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freemono.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.ctg.z deleted file mode 100644 index 40443bbe..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.php b/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.php deleted file mode 100644 index 83f454ec..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.php +++ /dev/null @@ -1,204 +0,0 @@ -800,'Descent'=>-200,'CapHeight'=>10,'Flags'=>32,'FontBBox'=>'[-604 -200 754 800]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); -$up=-125; -$ut=50; -$dw=600; -$cw=array( -32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600, -42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600, -52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600, -62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600, -72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600, -82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600, -92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600, -102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600, -112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600, -122=>600,123=>600,124=>600,125=>600,126=>600,8364=>600,8218=>600,402=>600,8222=>600,8230=>600, -8224=>600,8225=>600,710=>600,8240=>600,352=>600,8249=>600,338=>600,381=>600,8216=>600,8217=>600, -8220=>600,8221=>600,8226=>600,8211=>600,8212=>600,732=>600,8482=>600,353=>600,8250=>600,339=>600, -382=>600,376=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600, -168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600, -178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600, -188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600, -198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, -208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600, -218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600, -228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600, -238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600, -248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600, -258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600, -268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600, -278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600, -288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600, -298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600, -308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600, -318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600, -328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600, -340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600, -350=>600,351=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600, -362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600, -372=>600,373=>600,374=>600,375=>600,377=>600,378=>600,379=>600,380=>600,383=>600,384=>600, -385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600, -395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,403=>600,404=>600,405=>600, -406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600, -416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600, -426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600, -436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600, -446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600, -456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600, -466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600, -476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600, -486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600, -496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600, -506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600, -516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600, -526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600, -536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,548=>600,549=>600, -550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600, -560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600, -598=>600,599=>600,600=>600,601=>600,603=>600,604=>600,607=>600,608=>600,609=>600,613=>600, -614=>600,615=>600,616=>600,617=>600,618=>600,619=>600,621=>600,623=>600,624=>600,625=>600, -626=>600,627=>600,628=>600,629=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600, -639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,647=>600,648=>600,649=>600, -652=>600,653=>600,654=>600,656=>600,657=>600,658=>600,659=>600,660=>600,661=>600,662=>600, -663=>600,664=>600,665=>600,666=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600, -673=>600,674=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600,695=>600, -696=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600,705=>600, -706=>600,707=>600,708=>600,709=>600,711=>600,712=>600,713=>600,714=>600,715=>600,716=>600, -717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600,726=>600, -727=>600,728=>600,729=>600,730=>600,731=>600,733=>600,734=>600,735=>600,736=>600,737=>600, -738=>600,739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600,747=>600, -748=>600,749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600,757=>600, -758=>600,759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600,767=>600, -768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0, -778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0, -788=>0,789=>0,790=>0,791=>0,795=>0,796=>0,800=>0,801=>0,802=>0,803=>0, -804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,812=>0,813=>0,814=>0, -815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,826=>0, -827=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,838=>0,839=>0,840=>0, -844=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,884=>600,885=>600, -890=>600,894=>600,900=>600,901=>600,902=>600,903=>600,904=>600,905=>600,906=>600,908=>600, -910=>600,911=>600,912=>600,913=>600,914=>600,915=>600,916=>600,917=>600,918=>600,919=>600, -920=>600,921=>600,922=>600,923=>600,924=>600,925=>600,926=>600,927=>600,928=>600,929=>600, -931=>600,932=>600,933=>600,934=>600,935=>600,936=>600,937=>600,938=>600,939=>600,940=>600, -941=>600,942=>600,943=>600,944=>600,945=>600,946=>600,947=>600,948=>600,949=>600,950=>600, -951=>600,952=>600,953=>600,954=>600,955=>600,956=>600,957=>600,958=>600,959=>600,960=>600, -961=>600,962=>600,963=>600,964=>600,965=>600,966=>600,967=>600,968=>600,969=>600,970=>600, -971=>600,972=>600,973=>600,974=>600,976=>600,977=>600,978=>600,979=>600,980=>600,981=>600, -982=>600,986=>600,987=>600,988=>600,1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600, -1026=>600,1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600, -1036=>600,1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600, -1046=>600,1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600, -1056=>600,1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600, -1066=>600,1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600, -1076=>600,1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600, -1086=>600,1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600, -1096=>600,1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600, -1106=>600,1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600, -1116=>600,1117=>600,1118=>600,1119=>600,1136=>600,1137=>600,1138=>600,1156=>0,1157=>0,1158=>0, -1162=>600,1163=>600,1164=>600,1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600, -1172=>600,1173=>600,1174=>600,1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600, -1182=>600,1183=>600,1184=>600,1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600, -1192=>600,1193=>600,1194=>600,1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600, -1202=>600,1203=>600,1204=>600,1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600, -1212=>600,1213=>600,1214=>600,1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600, -1222=>600,1223=>600,1224=>600,1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600, -1232=>600,1233=>600,1234=>600,1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600, -1242=>600,1243=>600,1244=>600,1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600, -1252=>600,1253=>600,1254=>600,1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600, -1262=>600,1263=>600,1264=>600,1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600, -1272=>600,1273=>600,1296=>600,1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600, -1310=>600,1311=>600,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0, -1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>600,1471=>0,1472=>600,1473=>0,1474=>0, -1475=>600,1476=>0,1488=>600,1489=>600,1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600, -1496=>600,1497=>600,1498=>600,1499=>600,1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600, -1506=>600,1507=>600,1508=>600,1509=>600,1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600, -1521=>600,1522=>600,1523=>600,1524=>600,4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600, -4310=>600,4311=>600,4312=>600,4313=>600,4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600, -4320=>600,4321=>600,4322=>600,4323=>600,4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600, -4330=>600,4331=>600,4332=>600,4333=>600,4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600, -4340=>600,4341=>600,4345=>600,4347=>600,7680=>600,7681=>600,7682=>600,7683=>600,7684=>600,7685=>600, -7686=>600,7687=>600,7688=>600,7689=>600,7690=>600,7691=>600,7692=>600,7693=>600,7694=>600,7695=>600, -7696=>600,7697=>600,7698=>600,7699=>600,7700=>600,7701=>600,7702=>600,7703=>600,7704=>600,7705=>600, -7706=>600,7707=>600,7708=>600,7709=>600,7710=>600,7711=>600,7712=>600,7713=>600,7714=>600,7715=>600, -7716=>600,7717=>600,7718=>600,7719=>600,7720=>600,7721=>600,7722=>600,7723=>600,7724=>600,7725=>600, -7726=>600,7727=>600,7728=>600,7729=>600,7730=>600,7731=>600,7732=>600,7733=>600,7734=>600,7735=>600, -7736=>600,7737=>600,7738=>600,7739=>600,7740=>600,7741=>600,7742=>600,7743=>600,7744=>600,7745=>600, -7746=>600,7747=>600,7748=>600,7749=>600,7750=>600,7751=>600,7752=>600,7753=>600,7754=>600,7755=>600, -7756=>600,7757=>600,7758=>600,7759=>600,7760=>600,7761=>600,7762=>600,7763=>600,7764=>600,7765=>600, -7766=>600,7767=>600,7768=>600,7769=>600,7770=>600,7771=>600,7772=>600,7773=>600,7774=>600,7775=>600, -7776=>600,7777=>600,7778=>600,7779=>600,7780=>600,7781=>600,7782=>600,7783=>600,7784=>600,7785=>600, -7786=>600,7787=>600,7788=>600,7789=>600,7790=>600,7791=>600,7792=>600,7793=>600,7794=>600,7795=>600, -7796=>600,7797=>600,7798=>600,7799=>600,7800=>600,7801=>600,7802=>600,7803=>600,7804=>600,7805=>600, -7806=>600,7807=>600,7808=>600,7809=>600,7810=>600,7811=>600,7812=>600,7813=>600,7814=>600,7815=>600, -7816=>600,7817=>600,7818=>600,7819=>600,7820=>600,7821=>600,7822=>600,7823=>600,7824=>600,7825=>600, -7826=>600,7827=>600,7828=>600,7829=>600,7830=>600,7831=>600,7832=>600,7833=>600,7834=>600,7835=>600, -7840=>600,7841=>600,7842=>600,7843=>600,7844=>600,7845=>600,7846=>600,7847=>600,7848=>600,7849=>600, -7850=>600,7851=>600,7852=>600,7853=>600,7854=>600,7855=>600,7856=>600,7857=>600,7858=>600,7859=>600, -7860=>600,7861=>600,7862=>600,7863=>600,7864=>600,7865=>600,7866=>600,7867=>600,7868=>600,7869=>600, -7870=>600,7871=>600,7872=>600,7873=>600,7874=>600,7875=>600,7876=>600,7877=>600,7878=>600,7879=>600, -7880=>600,7881=>600,7882=>600,7883=>600,7884=>600,7885=>600,7886=>600,7887=>600,7888=>600,7889=>600, -7890=>600,7891=>600,7892=>600,7893=>600,7894=>600,7895=>600,7896=>600,7897=>600,7898=>600,7899=>600, -7900=>600,7901=>600,7902=>600,7903=>600,7904=>600,7905=>600,7906=>600,7907=>600,7908=>600,7909=>600, -7910=>600,7911=>600,7912=>600,7913=>600,7914=>600,7915=>600,7916=>600,7917=>600,7918=>600,7919=>600, -7920=>600,7921=>600,7922=>600,7923=>600,7924=>600,7925=>600,7926=>600,7927=>600,7928=>600,7929=>600, -8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600, -8202=>600,8203=>600,8204=>0,8205=>0,8206=>0,8207=>0,8208=>600,8209=>600,8210=>600,8213=>600, -8214=>600,8215=>600,8219=>600,8223=>600,8227=>600,8228=>600,8229=>600,8231=>600,8232=>600,8233=>600, -8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8241=>600,8242=>600,8243=>600,8244=>600, -8245=>600,8246=>600,8247=>600,8248=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600, -8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600, -8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600, -8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600, -8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8298=>600,8299=>600,8300=>600,8301=>600, -8302=>600,8303=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600, -8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600, -8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600, -8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8355=>600,8356=>600,8362=>600,8373=>600, -8448=>600,8449=>600,8451=>600,8453=>600,8454=>600,8457=>600,8465=>600,8466=>600,8470=>600,8472=>600, -8476=>600,8481=>600,8486=>600,8487=>600,8489=>600,8490=>600,8491=>600,8498=>600,8501=>600,8502=>600, -8503=>600,8504=>600,8506=>600,8507=>600,8523=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600, -8536=>600,8537=>600,8538=>600,8539=>600,8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600, -8546=>600,8547=>600,8548=>600,8549=>600,8550=>600,8553=>600,8556=>600,8557=>600,8558=>600,8559=>600, -8560=>600,8564=>600,8569=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600, -8595=>600,8704=>600,8706=>600,8707=>600,8709=>600,8710=>600,8711=>600,8712=>600,8713=>600,8715=>600, -8716=>600,8721=>600,8722=>600,8723=>600,8725=>600,8730=>600,8733=>600,8734=>600,8735=>600,8756=>600, -8800=>600,8801=>600,8804=>600,8805=>600,8834=>600,8835=>600,8836=>600,8837=>600,8838=>600,8839=>600, -8869=>600,8976=>600,9001=>600,9002=>600,9251=>600,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600, -9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600, -9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600,9496=>600, -9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600, -9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600,9513=>600,9514=>600,9515=>600,9516=>600, -9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600, -9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600, -9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600,9544=>600,9545=>600,9546=>600, -9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600, -9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600, -9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600,9576=>600, -9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600, -9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600,9593=>600,9594=>600,9595=>600,9596=>600, -9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600, -9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600, -9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600,9635=>600,9636=>600,9637=>600, -9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600, -9648=>600,9649=>600,9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600, -9658=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600, -9669=>600,9670=>600,9671=>600,9673=>600,9674=>600,9675=>600,9677=>600,9679=>600,9680=>600,9681=>600, -9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9698=>600,9699=>600, -9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600, -9710=>600,9712=>600,9713=>600,9714=>600,9715=>600,9716=>600,9717=>600,9718=>600,9719=>600,9735=>600, -9736=>600,9737=>600,9776=>600,9777=>600,9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600, -9785=>600,9786=>600,9787=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600, -9831=>600,9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,64256=>600,64257=>600, -64258=>600,64285=>600,64287=>600,64288=>600,64298=>600,64299=>600,64300=>600,64301=>600,64302=>600,64303=>600, -64304=>600,64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600,64312=>600,64313=>600,64314=>600, -64315=>600,64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600,64326=>600,64327=>600,64328=>600, -64329=>600,64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600,65533=>600); -$enc=''; -$diff=''; -$file='freemonob.z'; -$ctg='freemonob.ctg.z'; -$originalsize=164212; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.z b/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.z deleted file mode 100644 index 84b1dec7..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freemonob.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.ctg.z deleted file mode 100644 index efaebb08..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.php b/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.php deleted file mode 100644 index d24713f4..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.php +++ /dev/null @@ -1,153 +0,0 @@ -800,'Descent'=>-200,'CapHeight'=>19,'Flags'=>96,'FontBBox'=>'[-644 -200 833 800]','ItalicAngle'=>-12,'StemV'=>120,'MissingWidth'=>600); -$up=-125; -$ut=50; -$dw=600; -$cw=array( -32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600, -42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600, -52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600, -62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600, -72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600, -82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600, -92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600, -102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600, -112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600, -122=>600,123=>600,124=>600,125=>600,126=>600,8364=>600,8218=>600,402=>600,8222=>600,8230=>600, -8224=>600,8225=>600,710=>600,8240=>600,352=>600,8249=>600,338=>600,381=>600,8216=>600,8217=>600, -8220=>600,8221=>600,8226=>600,8211=>600,8212=>600,732=>600,8482=>600,353=>600,8250=>600,339=>600, -382=>600,376=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600, -168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600, -178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600, -188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600, -198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, -208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600, -218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600, -228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600, -238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600, -248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600, -258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600, -268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600, -278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600, -288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600, -298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600, -308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600, -318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600, -328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600, -340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600, -350=>600,351=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600, -362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600, -372=>600,373=>600,374=>600,375=>600,377=>600,378=>600,379=>600,380=>600,383=>600,384=>600, -385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600, -395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,403=>600,404=>600,405=>600, -406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600, -416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600, -426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600, -436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600, -446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600, -456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600, -466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600, -476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600, -486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600, -496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600, -506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600, -516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600, -526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600, -536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,548=>600,549=>600, -550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600, -560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600, -598=>600,599=>600,600=>600,601=>600,603=>600,604=>600,607=>600,608=>600,609=>600,613=>600, -614=>600,615=>600,616=>600,617=>600,618=>600,619=>600,621=>600,623=>600,624=>600,625=>600, -626=>600,627=>600,628=>600,629=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600, -639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,647=>600,648=>600,649=>600, -652=>600,653=>600,654=>600,656=>600,657=>600,658=>600,659=>600,660=>600,661=>600,662=>600, -663=>600,664=>600,665=>600,666=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600, -673=>600,674=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600, -705=>600,706=>600,707=>600,708=>600,709=>600,711=>600,712=>600,713=>600,714=>600,715=>600, -716=>600,717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600, -726=>600,727=>600,728=>600,729=>600,730=>600,731=>600,733=>600,734=>600,735=>600,741=>600, -742=>600,743=>600,744=>600,745=>600,746=>600,747=>600,748=>600,749=>600,750=>600,751=>600, -752=>600,753=>600,754=>600,755=>600,756=>600,757=>600,758=>600,759=>600,760=>600,761=>600, -762=>600,763=>600,764=>600,765=>600,766=>600,767=>600,768=>0,769=>0,770=>0,771=>0, -772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0, -782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0, -795=>0,796=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0, -808=>0,809=>0,810=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, -819=>0,820=>0,821=>0,822=>0,825=>0,826=>0,827=>0,831=>0,832=>0,833=>0, -834=>0,835=>0,836=>0,838=>0,839=>0,840=>0,844=>0,849=>0,850=>0,851=>0, -852=>0,853=>0,854=>0,855=>0,884=>600,885=>600,890=>600,894=>600,900=>600,901=>600, -902=>600,903=>600,904=>600,905=>600,906=>600,908=>600,910=>600,911=>600,912=>600,913=>600, -914=>600,915=>600,916=>600,917=>600,918=>600,919=>600,920=>600,921=>600,922=>600,923=>600, -924=>600,925=>600,926=>600,927=>600,928=>600,929=>600,931=>600,932=>600,933=>600,934=>600, -935=>600,936=>600,937=>600,938=>600,939=>600,940=>600,941=>600,942=>600,943=>600,944=>600, -945=>600,946=>600,947=>600,948=>600,949=>600,950=>600,951=>600,952=>600,953=>600,954=>600, -955=>600,956=>600,957=>600,958=>600,959=>600,960=>600,961=>600,962=>600,963=>600,964=>600, -965=>600,966=>600,967=>600,968=>600,969=>600,970=>600,971=>600,972=>600,973=>600,974=>600, -976=>600,977=>600,978=>600,979=>600,980=>600,981=>600,982=>600,986=>600,987=>600,988=>600, -1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600,1026=>600,1027=>600,1028=>600,1029=>600, -1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600,1036=>600,1037=>600,1038=>600,1039=>600, -1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600,1046=>600,1047=>600,1048=>600,1049=>600, -1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600,1056=>600,1057=>600,1058=>600,1059=>600, -1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600,1066=>600,1067=>600,1068=>600,1069=>600, -1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600,1076=>600,1077=>600,1078=>600,1079=>600, -1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600,1086=>600,1087=>600,1088=>600,1089=>600, -1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600,1096=>600,1097=>600,1098=>600,1099=>600, -1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600,1106=>600,1107=>600,1108=>600,1109=>600, -1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600,1116=>600,1117=>600,1118=>600,1119=>600, -1136=>600,1137=>600,1138=>600,1156=>0,1157=>0,1158=>0,1162=>600,1163=>600,1164=>600,1165=>600, -1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600,1172=>600,1173=>600,1174=>600,1175=>600, -1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600,1182=>600,1183=>600,1184=>600,1185=>600, -1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600,1192=>600,1193=>600,1194=>600,1195=>600, -1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600,1202=>600,1203=>600,1204=>600,1205=>600, -1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600,1212=>600,1213=>600,1214=>600,1215=>600, -1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600,1222=>600,1223=>600,1224=>600,1225=>600, -1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600,1232=>600,1233=>600,1234=>600,1235=>600, -1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600,1242=>600,1243=>600,1244=>600,1245=>600, -1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600,1252=>600,1253=>600,1254=>600,1255=>600, -1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600,1262=>600,1263=>600,1264=>600,1265=>600, -1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600,1272=>600,1273=>600,1296=>600,1297=>600, -1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600,1310=>600,1311=>600,1456=>0,1457=>0, -1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0, -1469=>0,1470=>0,1471=>0,1472=>600,1473=>0,1474=>0,1475=>600,1476=>0,1488=>600,1489=>600, -1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600,1499=>600, -1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600,1509=>600, -1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600,1524=>600, -4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600,4313=>600, -4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600,4323=>600, -4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600,4333=>600, -4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600,4347=>600, -8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600, -8202=>600,8203=>600,8204=>0,8205=>0,8206=>0,8207=>0,8208=>600,8209=>600,8210=>600,8213=>600, -8214=>600,8215=>600,8219=>600,8223=>600,8227=>600,8228=>600,8229=>600,8231=>600,8232=>600,8233=>600, -8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8241=>600,8242=>600,8243=>600,8244=>600, -8245=>600,8246=>600,8247=>600,8248=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600, -8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600, -8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600, -8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600, -8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8298=>600,8299=>600,8300=>600,8301=>600, -8302=>600,8303=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600, -8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600, -8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600, -8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8362=>600,8373=>600,8448=>600,8449=>600, -8451=>600,8453=>600,8454=>600,8457=>600,8465=>600,8466=>600,8470=>600,8472=>600,8476=>600,8481=>600, -8486=>600,8487=>600,8489=>600,8490=>600,8491=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600, -8506=>600,8507=>600,8523=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600, -8538=>600,8539=>600,8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600,8546=>600,8547=>600, -8548=>600,8549=>600,8550=>600,8553=>600,8556=>600,8557=>600,8558=>600,8559=>600,8560=>600,8564=>600, -8569=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600,8595=>600,8704=>600, -8706=>600,8707=>600,8710=>600,8711=>600,8712=>600,8713=>600,8715=>600,8716=>600,8721=>600,8722=>600, -8723=>600,8725=>600,8730=>600,8733=>600,8734=>600,8756=>600,8800=>600,8801=>600,8804=>600,8805=>600, -9251=>600,9674=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600,9831=>600, -9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,64256=>600,64257=>600,64258=>600, -64285=>600,64287=>600,64288=>600,64298=>600,64299=>600,64300=>600,64301=>600,64302=>600,64303=>600,64304=>600, -64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600,64312=>600,64313=>600,64314=>600,64315=>600, -64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600,64326=>600,64327=>600,64328=>600,64329=>600, -64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600,65533=>600); -$enc=''; -$diff=''; -$file='freemonobi.z'; -$ctg='freemonobi.ctg.z'; -$originalsize=145080; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.z b/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.z deleted file mode 100644 index b31acfb1..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freemonobi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.ctg.z deleted file mode 100644 index 36e92ec0..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.php b/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.php deleted file mode 100644 index 5d71754c..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.php +++ /dev/null @@ -1,221 +0,0 @@ -800,'Descent'=>-200,'CapHeight'=>44,'Flags'=>96,'FontBBox'=>'[-644 -200 816 800]','ItalicAngle'=>-12,'StemV'=>70,'MissingWidth'=>600); -$up=-125; -$ut=50; -$dw=600; -$cw=array( -32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600, -42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600, -52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600, -62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600, -72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600, -82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600, -92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600, -102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600, -112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600, -122=>600,123=>600,124=>600,125=>600,126=>600,8364=>600,8218=>600,402=>600,8222=>600,8230=>600, -8224=>600,8225=>600,710=>600,8240=>600,352=>600,8249=>600,338=>600,381=>600,8216=>600,8217=>600, -8220=>600,8221=>600,8226=>600,8211=>600,8212=>600,732=>600,8482=>600,353=>600,8250=>600,339=>600, -382=>600,376=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600, -168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600, -178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600, -188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600, -198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, -208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600, -218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600, -228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600, -238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600, -248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600, -258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600, -268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600, -278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600, -288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600, -298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600, -308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600, -318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600, -328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600, -340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600, -350=>600,351=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600, -362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600, -372=>600,373=>600,374=>600,375=>600,377=>600,378=>600,379=>600,380=>600,383=>600,384=>600, -385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600, -395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,403=>600,404=>600,405=>600, -406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600, -416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600, -426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600, -436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600, -446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600, -456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600, -466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600, -476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600, -486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600, -496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600, -506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600, -516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600, -526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600, -536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,548=>600,549=>600, -550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600, -560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600, -597=>600,598=>600,599=>600,600=>600,601=>600,602=>600,603=>600,604=>600,607=>600,608=>600, -609=>600,610=>600,611=>600,612=>600,613=>600,614=>600,615=>600,616=>600,617=>600,618=>600, -619=>600,620=>600,621=>600,622=>600,623=>600,624=>600,625=>600,626=>600,627=>600,628=>600, -629=>600,630=>600,632=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600,639=>600, -640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,646=>600,647=>600,648=>600,649=>600, -651=>600,652=>600,653=>600,654=>600,655=>600,656=>600,657=>600,658=>600,660=>600,661=>600, -662=>600,663=>600,664=>600,665=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600, -673=>600,674=>600,679=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600, -695=>600,696=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600, -705=>600,706=>600,707=>600,708=>600,709=>600,711=>600,712=>600,713=>600,714=>600,715=>600, -716=>600,717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600, -726=>600,727=>600,728=>600,729=>600,730=>600,731=>600,733=>600,734=>600,735=>600,736=>600, -737=>600,738=>600,739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600, -747=>600,748=>600,749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600, -757=>600,758=>600,759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600, -767=>600,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0, -777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0, -787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,795=>0,796=>0,800=>0, -803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,812=>0,813=>0, -814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, -824=>0,825=>0,826=>0,827=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0, -838=>0,839=>0,840=>0,844=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0, -855=>0,884=>600,885=>600,890=>600,894=>600,900=>600,901=>600,902=>600,903=>600,904=>600, -905=>600,906=>600,908=>600,910=>600,911=>600,912=>600,913=>600,914=>600,915=>600,916=>600, -917=>600,918=>600,919=>600,920=>600,921=>600,922=>600,923=>600,924=>600,925=>600,926=>600, -927=>600,928=>600,929=>600,931=>600,932=>600,933=>600,934=>600,935=>600,936=>600,937=>600, -938=>600,939=>600,940=>600,941=>600,942=>600,943=>600,944=>600,945=>600,946=>600,947=>600, -948=>600,949=>600,950=>600,951=>600,952=>600,953=>600,954=>600,955=>600,956=>600,957=>600, -958=>600,959=>600,960=>600,961=>600,962=>600,963=>600,964=>600,965=>600,966=>600,967=>600, -968=>600,969=>600,970=>600,971=>600,972=>600,973=>600,974=>600,976=>600,977=>600,978=>600, -979=>600,980=>600,981=>600,982=>600,986=>600,987=>600,988=>600,1008=>600,1009=>600,1012=>600, -1013=>600,1024=>600,1025=>600,1026=>600,1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600, -1033=>600,1034=>600,1035=>600,1036=>600,1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600, -1043=>600,1044=>600,1045=>600,1046=>600,1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600, -1053=>600,1054=>600,1055=>600,1056=>600,1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600, -1063=>600,1064=>600,1065=>600,1066=>600,1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600, -1073=>600,1074=>600,1075=>600,1076=>600,1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600, -1083=>600,1084=>600,1085=>600,1086=>600,1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600, -1093=>600,1094=>600,1095=>600,1096=>600,1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600, -1103=>600,1104=>600,1105=>600,1106=>600,1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600, -1113=>600,1114=>600,1115=>600,1116=>600,1117=>600,1118=>600,1119=>600,1120=>600,1121=>600,1122=>600, -1123=>600,1124=>600,1126=>600,1127=>600,1128=>600,1130=>600,1131=>600,1132=>600,1133=>600,1136=>600, -1137=>600,1138=>600,1140=>600,1141=>600,1142=>600,1143=>600,1155=>0,1156=>0,1157=>0,1158=>0, -1159=>0,1162=>600,1163=>600,1164=>600,1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600, -1171=>600,1172=>600,1173=>600,1174=>600,1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600, -1181=>600,1182=>600,1183=>600,1184=>600,1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600, -1191=>600,1192=>600,1193=>600,1194=>600,1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600, -1201=>600,1202=>600,1203=>600,1204=>600,1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600, -1211=>600,1212=>600,1213=>600,1214=>600,1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600, -1221=>600,1222=>600,1223=>600,1224=>600,1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600, -1231=>600,1232=>600,1233=>600,1234=>600,1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600, -1241=>600,1242=>600,1243=>600,1244=>600,1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600, -1251=>600,1252=>600,1253=>600,1254=>600,1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600, -1261=>600,1262=>600,1263=>600,1264=>600,1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600, -1271=>600,1272=>600,1273=>600,1296=>600,1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600, -1309=>600,1310=>600,1311=>600,1329=>600,1330=>600,1331=>600,1332=>600,1333=>600,1334=>600,1335=>600, -1336=>600,1337=>600,1338=>600,1339=>600,1340=>600,1341=>600,1342=>600,1343=>600,1344=>600,1345=>600, -1346=>600,1347=>600,1348=>600,1349=>600,1350=>600,1351=>600,1352=>600,1353=>600,1354=>600,1355=>600, -1356=>600,1357=>600,1358=>600,1359=>600,1360=>600,1361=>600,1362=>600,1363=>600,1364=>600,1365=>600, -1366=>600,1369=>600,1370=>600,1371=>600,1372=>600,1373=>600,1374=>600,1375=>600,1377=>600,1378=>600, -1379=>600,1380=>600,1381=>600,1382=>600,1383=>600,1384=>600,1385=>600,1386=>600,1387=>600,1388=>600, -1389=>600,1390=>600,1391=>600,1392=>600,1393=>600,1394=>600,1395=>600,1396=>600,1397=>600,1398=>600, -1399=>600,1400=>600,1401=>600,1402=>600,1403=>600,1404=>600,1405=>600,1406=>600,1407=>600,1408=>600, -1409=>600,1410=>600,1411=>600,1412=>600,1413=>600,1414=>600,1415=>600,1417=>600,1418=>600,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0, -1468=>0,1469=>0,1470=>600,1471=>0,1472=>600,1473=>0,1474=>0,1475=>600,1476=>0,1488=>600, -1489=>600,1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600, -1499=>600,1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600, -1509=>600,1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600, -1524=>600,4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600, -4313=>600,4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600, -4323=>600,4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600, -4333=>600,4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600, -4347=>600,7680=>600,7681=>600,7682=>600,7683=>600,7684=>600,7685=>600,7686=>600,7687=>600,7688=>600, -7689=>600,7690=>600,7691=>600,7692=>600,7693=>600,7694=>600,7695=>600,7696=>600,7697=>600,7698=>600, -7699=>600,7700=>600,7701=>600,7702=>600,7703=>600,7704=>600,7705=>600,7706=>600,7707=>600,7708=>600, -7709=>600,7710=>600,7711=>600,7712=>600,7713=>600,7714=>600,7715=>600,7716=>600,7717=>600,7718=>600, -7719=>600,7720=>600,7721=>600,7722=>600,7723=>600,7724=>600,7725=>600,7726=>600,7727=>600,7728=>600, -7729=>600,7730=>600,7731=>600,7732=>600,7733=>600,7734=>600,7735=>600,7736=>600,7737=>600,7738=>600, -7739=>600,7740=>600,7741=>600,7742=>600,7743=>600,7744=>600,7745=>600,7746=>600,7747=>600,7748=>600, -7749=>600,7750=>600,7751=>600,7752=>600,7753=>600,7754=>600,7755=>600,7756=>600,7757=>600,7758=>600, -7759=>600,7760=>600,7761=>600,7762=>600,7763=>600,7764=>600,7765=>600,7766=>600,7767=>600,7768=>600, -7769=>600,7770=>600,7771=>600,7772=>600,7773=>600,7774=>600,7775=>600,7776=>600,7777=>600,7778=>600, -7779=>600,7780=>600,7781=>600,7782=>600,7783=>600,7784=>600,7785=>600,7786=>600,7787=>600,7788=>600, -7789=>600,7790=>600,7791=>600,7792=>600,7793=>600,7794=>600,7795=>600,7796=>600,7797=>600,7798=>600, -7799=>600,7800=>600,7801=>600,7802=>600,7803=>600,7804=>600,7805=>600,7806=>600,7807=>600,7808=>600, -7809=>600,7810=>600,7811=>600,7812=>600,7813=>600,7814=>600,7815=>600,7816=>600,7817=>600,7818=>600, -7819=>600,7820=>600,7821=>600,7822=>600,7823=>600,7824=>600,7825=>600,7826=>600,7827=>600,7828=>600, -7829=>600,7830=>600,7831=>600,7832=>600,7833=>600,7834=>600,7835=>600,7840=>600,7841=>600,7842=>600, -7843=>600,7844=>600,7845=>600,7846=>600,7847=>600,7848=>600,7849=>600,7850=>600,7851=>600,7852=>600, -7853=>600,7854=>600,7855=>600,7856=>600,7857=>600,7858=>600,7859=>600,7860=>600,7861=>600,7862=>600, -7863=>600,7864=>600,7865=>600,7866=>600,7867=>600,7868=>600,7869=>600,7870=>600,7871=>600,7872=>600, -7873=>600,7874=>600,7875=>600,7876=>600,7877=>600,7878=>600,7879=>600,7880=>600,7881=>600,7882=>600, -7883=>600,7884=>600,7885=>600,7886=>600,7887=>600,7888=>600,7889=>600,7890=>600,7891=>600,7892=>600, -7893=>600,7894=>600,7895=>600,7896=>600,7897=>600,7898=>600,7899=>600,7900=>600,7901=>600,7902=>600, -7903=>600,7904=>600,7905=>600,7906=>600,7907=>600,7908=>600,7909=>600,7910=>600,7911=>600,7912=>600, -7913=>600,7914=>600,7915=>600,7916=>600,7917=>600,7918=>600,7919=>600,7920=>600,7921=>600,7922=>600, -7923=>600,7924=>600,7925=>600,7926=>600,7927=>600,7928=>600,7929=>600,7936=>600,7937=>600,7938=>600, -7939=>600,7940=>600,7941=>600,7942=>600,7943=>600,7944=>600,7945=>600,7946=>600,7947=>600,7948=>600, -7949=>600,7950=>600,7951=>600,7952=>600,7953=>600,7954=>600,7955=>600,7956=>600,7957=>600,7960=>600, -7961=>600,7962=>600,7963=>600,7964=>600,7965=>600,7968=>600,7969=>600,7970=>600,7971=>600,7972=>600, -7973=>600,7974=>600,7975=>600,7976=>600,7977=>600,7978=>600,7979=>600,7980=>600,7981=>600,7982=>600, -7983=>600,7984=>600,7985=>600,7986=>600,7987=>600,7988=>600,7989=>600,7990=>600,7991=>600,7992=>600, -7993=>600,7994=>600,7995=>600,7996=>600,7997=>600,7998=>600,7999=>600,8000=>600,8001=>600,8002=>600, -8003=>600,8004=>600,8005=>600,8008=>600,8009=>600,8010=>600,8011=>600,8012=>600,8013=>600,8016=>600, -8017=>600,8018=>600,8019=>600,8020=>600,8021=>600,8022=>600,8023=>600,8025=>600,8027=>600,8029=>600, -8031=>600,8032=>600,8033=>600,8034=>600,8035=>600,8036=>600,8037=>600,8038=>600,8039=>600,8040=>600, -8041=>600,8042=>600,8043=>600,8044=>600,8045=>600,8046=>600,8047=>600,8048=>600,8049=>600,8050=>600, -8051=>600,8052=>600,8053=>600,8054=>600,8055=>600,8056=>600,8057=>600,8058=>600,8059=>600,8060=>600, -8061=>600,8064=>600,8065=>600,8066=>600,8067=>600,8068=>600,8069=>600,8070=>600,8071=>600,8072=>600, -8073=>600,8074=>600,8075=>600,8076=>600,8077=>600,8078=>600,8079=>600,8080=>600,8081=>600,8082=>600, -8083=>600,8084=>600,8085=>600,8086=>600,8087=>600,8088=>600,8089=>600,8090=>600,8091=>600,8092=>600, -8093=>600,8094=>600,8095=>600,8096=>600,8097=>600,8098=>600,8099=>600,8100=>600,8101=>600,8102=>600, -8103=>600,8104=>600,8105=>600,8106=>600,8107=>600,8108=>600,8109=>600,8110=>600,8111=>600,8112=>600, -8113=>600,8114=>600,8115=>600,8116=>600,8118=>600,8119=>600,8120=>600,8121=>600,8122=>600,8123=>600, -8124=>600,8125=>600,8126=>600,8127=>600,8128=>600,8129=>600,8130=>600,8131=>600,8132=>600,8134=>600, -8135=>600,8136=>600,8137=>600,8138=>600,8139=>600,8140=>600,8141=>600,8142=>600,8143=>600,8144=>600, -8145=>600,8146=>600,8147=>600,8150=>600,8151=>600,8152=>600,8153=>600,8154=>600,8155=>600,8157=>600, -8158=>600,8159=>600,8160=>600,8161=>600,8162=>600,8163=>600,8164=>600,8165=>600,8166=>600,8167=>600, -8168=>600,8169=>600,8170=>600,8171=>600,8172=>600,8173=>600,8174=>600,8175=>600,8178=>600,8179=>600, -8180=>600,8182=>600,8183=>600,8184=>600,8185=>600,8186=>600,8187=>600,8188=>600,8189=>600,8190=>600, -8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600, -8202=>600,8203=>600,8204=>0,8205=>0,8206=>0,8207=>0,8208=>600,8209=>600,8210=>600,8213=>600, -8214=>600,8215=>600,8219=>600,8223=>600,8227=>600,8228=>600,8229=>600,8231=>600,8232=>600,8233=>600, -8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8241=>600,8242=>600,8243=>600,8244=>600, -8245=>600,8246=>600,8247=>600,8248=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600, -8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600, -8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600, -8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600, -8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8298=>600,8299=>600,8300=>600,8301=>600, -8302=>600,8303=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600, -8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600, -8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600, -8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8355=>600,8356=>600,8359=>600,8362=>600, -8373=>600,8448=>600,8449=>600,8450=>600,8451=>600,8453=>600,8454=>600,8455=>600,8457=>600,8461=>600, -8464=>600,8465=>600,8466=>600,8467=>600,8468=>600,8469=>600,8470=>600,8471=>600,8472=>600,8473=>600, -8474=>600,8476=>600,8477=>600,8478=>600,8481=>600,8484=>600,8486=>600,8487=>600,8489=>600,8490=>600, -8491=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600,8506=>600,8507=>600,8523=>600,8525=>600, -8526=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600,8538=>600,8539=>600, -8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600,8546=>600,8547=>600,8548=>600,8549=>600, -8550=>600,8551=>600,8552=>600,8553=>600,8554=>600,8555=>600,8556=>600,8557=>600,8558=>600,8559=>600, -8560=>600,8561=>600,8562=>600,8563=>600,8564=>600,8565=>600,8566=>600,8567=>600,8568=>600,8569=>600, -8570=>600,8571=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600,8595=>600, -8596=>600,8597=>600,8598=>600,8599=>600,8600=>600,8601=>600,8616=>600,8704=>600,8706=>600,8707=>600, -8709=>600,8710=>600,8711=>600,8712=>600,8713=>600,8715=>600,8716=>600,8721=>600,8722=>600,8723=>600, -8725=>600,8729=>600,8730=>600,8733=>600,8734=>600,8745=>600,8746=>600,8747=>600,8756=>600,8764=>600, -8769=>600,8770=>600,8773=>600,8776=>600,8800=>600,8801=>600,8804=>600,8805=>600,8834=>600,8835=>600, -8836=>600,8837=>600,8838=>600,8839=>600,9001=>600,9002=>600,9251=>600,9674=>600,9824=>600,9825=>600, -9826=>600,9827=>600,9828=>600,9829=>600,9830=>600,9831=>600,9833=>600,9834=>600,9835=>600,9836=>600, -9837=>600,9838=>600,9839=>600,64256=>600,64257=>600,64258=>600,64285=>600,64286=>600,64287=>600,64288=>600, -64289=>600,64290=>600,64291=>600,64292=>600,64293=>600,64294=>600,64295=>600,64296=>600,64297=>600,64298=>600, -64299=>600,64300=>600,64301=>600,64302=>600,64303=>600,64304=>600,64305=>600,64306=>600,64307=>600,64308=>600, -64309=>600,64310=>600,64312=>600,64313=>600,64314=>600,64315=>600,64316=>600,64318=>600,64320=>600,64321=>600, -64323=>600,64324=>600,64326=>600,64327=>600,64328=>600,64329=>600,64330=>600,64331=>600,64332=>600,64333=>600, -64334=>600,64335=>600,65533=>600); -$enc=''; -$diff=''; -$file='freemonoi.z'; -$ctg='freemonoi.ctg.z'; -$originalsize=196732; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.z b/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.z deleted file mode 100644 index 93bf7d35..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freemonoi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesans.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freesans.ctg.z deleted file mode 100644 index b3bf68c3..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freesans.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesans.php b/include/limesurvey/admin/classes/tcpdf/fonts/freesans.php deleted file mode 100644 index 7d258b86..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freesans.php +++ /dev/null @@ -1,311 +0,0 @@ -1000,'Descent'=>-300,'CapHeight'=>22,'Flags'=>32,'FontBBox'=>'[-958 -550 1632 1050]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); -$up=-176; -$ut=50; -$dw=600; -$cw=array( -32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333, -42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556, -52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584, -62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778, -72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778, -82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278, -92=>278,93=>277,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556, -102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556, -112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500, -122=>500,123=>334,124=>260,125=>334,126=>584,8364=>655,8218=>222,402=>278,8222=>333,8230=>1000, -8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>250,338=>1000,381=>611,8216=>222,8217=>221, -8220=>333,8221=>333,8226=>350,8211=>556,8212=>1000,732=>333,8482=>1000,353=>500,8250=>250,339=>944, -382=>500,376=>667,160=>278,161=>278,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556, -168=>333,169=>737,170=>370,171=>448,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584, -178=>350,179=>350,180=>333,181=>556,182=>537,183=>278,184=>333,185=>350,186=>365,187=>448, -188=>869,189=>869,190=>869,191=>556,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667, -198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722, -218=>722,219=>722,220=>722,221=>667,222=>666,223=>611,224=>556,225=>556,226=>556,227=>556, -228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278, -238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584, -248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>555,255=>500,256=>667,257=>556, -258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500, -268=>722,269=>500,270=>722,271=>722,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556, -278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556, -288=>778,289=>556,290=>778,291=>556,292=>722,293=>556,294=>722,295=>556,296=>278,297=>278, -298=>278,299=>278,300=>278,301=>278,302=>278,303=>222,304=>278,305=>278,306=>700,307=>374, -308=>500,309=>222,310=>667,311=>500,312=>500,313=>556,314=>222,315=>556,316=>222,317=>556, -318=>387,319=>556,320=>500,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722, -328=>556,329=>722,330=>722,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556, -340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500, -350=>667,351=>500,354=>611,355=>278,356=>611,357=>443,358=>611,359=>278,360=>722,361=>556, -362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556, -372=>944,373=>722,374=>667,375=>500,377=>611,378=>500,379=>611,380=>500,383=>278,384=>556, -385=>854,386=>668,387=>556,388=>667,389=>556,390=>722,391=>722,392=>500,393=>722,394=>899, -395=>667,396=>556,397=>564,398=>667,399=>722,400=>667,401=>611,403=>778,404=>667,405=>889, -406=>278,407=>333,408=>667,409=>500,410=>333,411=>560,412=>833,413=>722,414=>556,415=>778, -416=>788,417=>565,418=>944,419=>722,420=>842,421=>556,422=>666,423=>667,424=>500,425=>611, -426=>333,427=>278,428=>611,429=>278,430=>611,431=>776,432=>624,433=>778,434=>722,435=>722, -436=>556,437=>611,438=>500,439=>611,440=>611,441=>500,442=>500,443=>556,446=>556,447=>556, -448=>260,449=>370,450=>584,451=>278,452=>1311,453=>1208,454=>1056,455=>1056,456=>778,457=>444, -458=>1158,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722, -468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556, -478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556, -488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>611,495=>500,496=>222,497=>1333, -498=>1222,499=>1056,500=>778,501=>556,503=>630,504=>722,505=>556,506=>667,507=>556,508=>1000, -509=>889,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667, -519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722, -529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,536=>667,537=>500,538=>611, -539=>278,540=>521,541=>393,542=>722,543=>556,548=>611,549=>500,550=>667,551=>556,552=>667, -553=>556,554=>778,555=>556,556=>778,557=>556,558=>778,559=>556,560=>778,561=>556,562=>667, -563=>500,567=>222,592=>556,593=>556,594=>556,595=>556,596=>500,597=>500,598=>556,599=>556, -600=>556,601=>556,602=>804,603=>500,604=>499,605=>742,606=>500,607=>222,608=>556,609=>556, -610=>546,611=>500,612=>556,613=>556,614=>556,615=>556,616=>222,617=>222,618=>278,619=>473, -620=>427,621=>222,622=>611,623=>833,624=>833,625=>833,626=>556,627=>556,628=>567,629=>556, -630=>778,631=>722,632=>741,633=>333,634=>333,635=>333,636=>333,637=>333,638=>384,639=>369, -640=>546,641=>546,642=>500,643=>278,644=>278,645=>278,646=>444,647=>278,648=>278,649=>556, -650=>626,651=>539,652=>500,653=>722,654=>500,655=>556,656=>500,657=>500,658=>500,659=>552, -660=>556,661=>556,662=>556,663=>722,664=>778,665=>506,666=>500,667=>546,668=>558,669=>444, -670=>500,671=>430,672=>556,673=>556,674=>556,675=>944,676=>944,677=>944,678=>689,679=>506, -680=>764,681=>766,682=>660,683=>577,684=>530,685=>486,686=>565,687=>621,688=>333,689=>333, -690=>167,691=>236,692=>236,693=>276,694=>359,695=>500,696=>330,697=>278,698=>454,699=>278, -700=>278,701=>278,702=>333,703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333, -711=>333,712=>333,713=>333,714=>333,715=>333,716=>272,717=>333,718=>333,719=>333,720=>333, -721=>333,722=>333,723=>333,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333, -731=>333,733=>333,734=>333,735=>510,736=>333,737=>186,738=>333,739=>333,740=>334,741=>526, -742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333, -752=>333,753=>333,754=>333,755=>327,756=>261,757=>437,758=>437,759=>333,760=>278,761=>200, -762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0, -772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0, -782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0, -792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0, -802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0, -812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0, -822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0, -832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0, -842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0, -852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0, -862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0, -872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>278,885=>199, -890=>332,894=>278,900=>333,901=>333,902=>667,903=>275,904=>786,905=>828,906=>369,908=>833, -910=>845,911=>778,912=>286,913=>667,914=>667,915=>582,916=>778,917=>667,918=>628,919=>722, -920=>778,921=>278,922=>667,923=>667,924=>833,925=>722,926=>630,927=>778,928=>722,929=>667, -931=>628,932=>611,933=>667,934=>717,935=>667,936=>745,937=>778,938=>278,939=>667,940=>608, -941=>528,942=>548,943=>307,944=>538,945=>596,946=>542,947=>531,948=>564,949=>512,950=>455, -951=>548,952=>525,953=>286,954=>510,955=>551,956=>540,957=>500,958=>470,959=>546,960=>619, -961=>569,962=>547,963=>620,964=>492,965=>538,966=>741,967=>571,968=>662,969=>740,970=>286, -971=>538,972=>546,973=>538,974=>740,977=>580,978=>742,979=>845,980=>620,981=>741,982=>740, -983=>556,1008=>556,1009=>566,1012=>778,1013=>328,1024=>667,1025=>657,1026=>766,1027=>582,1028=>722, -1029=>667,1030=>278,1031=>278,1032=>500,1033=>1080,1034=>1014,1035=>766,1036=>628,1037=>730,1038=>613, -1039=>722,1040=>666,1041=>668,1042=>668,1043=>582,1044=>812,1045=>657,1046=>905,1047=>667,1048=>730, -1049=>730,1050=>632,1051=>674,1052=>846,1053=>721,1054=>796,1055=>721,1056=>654,1057=>722,1058=>611, -1059=>613,1060=>861,1061=>657,1062=>742,1063=>626,1064=>830,1065=>851,1066=>841,1067=>874,1068=>670, -1069=>717,1070=>1001,1071=>686,1072=>552,1073=>550,1074=>506,1075=>404,1076=>602,1077=>547,1078=>755, -1079=>499,1080=>567,1081=>567,1082=>489,1083=>517,1084=>618,1085=>558,1086=>550,1087=>557,1088=>577, -1089=>520,1090=>444,1091=>468,1092=>865,1093=>466,1094=>578,1095=>498,1096=>692,1097=>712,1098=>664, -1099=>690,1100=>521,1101=>520,1102=>759,1103=>543,1104=>549,1105=>549,1106=>577,1107=>404,1108=>519, -1109=>502,1110=>224,1111=>278,1112=>223,1113=>813,1114=>853,1115=>577,1116=>489,1117=>567,1118=>468, -1119=>558,1120=>942,1121=>693,1136=>762,1137=>662,1138=>800,1139=>550,1148=>942,1149=>693,1150=>942, -1151=>693,1154=>468,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>763, -1163=>583,1164=>689,1165=>526,1166=>652,1167=>572,1168=>601,1169=>397,1170=>589,1171=>392,1172=>591, -1173=>475,1174=>927,1175=>830,1176=>661,1177=>493,1178=>658,1179=>510,1180=>675,1181=>519,1182=>684, -1183=>514,1184=>839,1185=>653,1186=>740,1187=>570,1188=>987,1189=>714,1190=>1058,1191=>808,1192=>722, -1193=>510,1194=>722,1195=>516,1196=>611,1197=>402,1198=>668,1199=>578,1200=>668,1201=>588,1202=>664, -1203=>488,1204=>936,1205=>679,1206=>638,1207=>521,1208=>630,1209=>498,1210=>630,1211=>498,1212=>927, -1213=>699,1214=>919,1215=>703,1216=>254,1217=>905,1218=>755,1219=>668,1220=>512,1221=>696,1222=>524, -1223=>721,1224=>558,1225=>744,1226=>571,1227=>630,1228=>498,1229=>869,1230=>631,1231=>254,1232=>666, -1233=>552,1234=>666,1235=>552,1236=>1000,1237=>879,1238=>657,1239=>547,1240=>722,1241=>543,1242=>722, -1243=>543,1244=>905,1245=>755,1246=>667,1247=>499,1248=>611,1249=>540,1250=>730,1251=>567,1252=>730, -1253=>567,1254=>796,1255=>550,1256=>800,1257=>550,1258=>800,1259=>550,1260=>717,1261=>520,1262=>613, -1263=>468,1264=>613,1265=>468,1266=>613,1267=>468,1268=>626,1269=>498,1270=>582,1271=>395,1272=>874, -1273=>690,1296=>667,1297=>491,1298=>665,1299=>509,1306=>778,1307=>575,1308=>934,1309=>712,1310=>627, -1311=>489,1329=>720,1330=>696,1331=>750,1332=>725,1333=>699,1334=>751,1335=>446,1336=>703,1337=>790, -1338=>656,1339=>697,1340=>390,1341=>852,1342=>791,1343=>698,1344=>585,1345=>656,1346=>651,1347=>658, -1348=>759,1349=>595,1350=>772,1351=>603,1352=>703,1353=>648,1354=>698,1355=>744,1356=>738,1357=>703, -1358=>739,1359=>660,1360=>693,1361=>623,1362=>385,1363=>788,1364=>632,1365=>775,1366=>714,1369=>333, -1370=>222,1371=>200,1372=>333,1373=>333,1374=>333,1375=>333,1377=>833,1378=>551,1379=>572,1380=>569, -1381=>546,1382=>581,1383=>353,1384=>551,1385=>568,1386=>569,1387=>552,1388=>276,1389=>795,1390=>535, -1391=>553,1392=>537,1393=>512,1394=>568,1395=>552,1396=>531,1397=>249,1398=>527,1399=>405,1400=>551, -1401=>390,1402=>833,1403=>509,1404=>523,1405=>545,1406=>584,1407=>879,1408=>552,1409=>552,1410=>301, -1411=>884,1412=>578,1413=>556,1414=>668,1415=>544,1417=>278,1418=>333,1456=>0,1457=>0,1458=>0, -1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0, -1470=>488,1471=>0,1472=>212,1473=>0,1474=>0,1475=>278,1476=>0,1488=>640,1489=>591,1490=>466, -1491=>598,1492=>622,1493=>212,1494=>351,1495=>623,1496=>608,1497=>200,1498=>526,1499=>550,1500=>600, -1501=>623,1502=>621,1503=>212,1504=>378,1505=>607,1506=>587,1507=>575,1508=>568,1509=>540,1510=>590, -1511=>606,1512=>547,1513=>776,1514=>687,1520=>424,1521=>412,1522=>400,1523=>184,1524=>344,1792=>600, -1793=>201,1794=>201,1795=>201,1796=>201,1797=>500,1798=>500,1799=>500,1800=>370,1801=>370,1802=>574, -1803=>574,1804=>645,1805=>574,1807=>0,1808=>452,1809=>452,1810=>574,1811=>645,1812=>645,1813=>509, -1814=>509,1815=>682,1816=>585,1817=>404,1818=>627,1819=>718,1820=>718,1821=>484,1822=>682,1823=>600, -1824=>660,1825=>682,1826=>538,1827=>718,1828=>718,1829=>718,1830=>574,1831=>574,1832=>638,1833=>585, -1834=>509,1835=>682,1836=>682,1840=>0,1841=>0,1842=>0,1843=>0,1844=>0,1845=>0,1846=>0, -1847=>0,1848=>0,1849=>0,1850=>0,1851=>0,1852=>0,1853=>0,1854=>0,1855=>0,1856=>0, -1857=>0,1858=>0,1859=>0,1860=>0,1861=>0,1862=>0,1863=>0,1864=>0,1865=>0,1866=>0, -2305=>6,2306=>0,2307=>305,2308=>717,2309=>717,2310=>829,2311=>463,2312=>463,2313=>581,2314=>803, -2315=>920,2316=>639,2317=>430,2318=>430,2319=>430,2320=>430,2321=>856,2322=>828,2323=>837,2324=>856, -2325=>749,2326=>779,2327=>522,2328=>587,2329=>650,2330=>619,2331=>641,2332=>703,2333=>691,2334=>677, -2335=>568,2336=>529,2337=>611,2338=>536,2339=>607,2340=>564,2341=>659,2342=>500,2343=>591,2344=>521, -2345=>568,2346=>477,2347=>728,2348=>490,2349=>577,2350=>517,2351=>554,2352=>433,2353=>433,2354=>656, -2355=>660,2356=>660,2357=>490,2358=>645,2359=>477,2360=>666,2361=>484,2364=>6,2365=>442,2366=>211, -2367=>211,2368=>211,2369=>6,2370=>3,2371=>6,2372=>0,2373=>6,2374=>84,2375=>6,2376=>6, -2377=>224,2378=>234,2379=>211,2380=>211,2381=>6,2384=>839,2385=>15,2386=>0,2387=>9,2388=>9, -2392=>750,2393=>779,2394=>522,2395=>703,2396=>613,2397=>536,2398=>728,2399=>554,2400=>899,2401=>625, -2402=>625,2403=>625,2404=>674,2405=>674,2406=>575,2407=>575,2408=>575,2409=>575,2410=>575,2411=>575, -2412=>575,2413=>575,2414=>575,2415=>575,2416=>365,2417=>387,2418=>717,2433=>0,2434=>300,2435=>264, -2437=>594,2438=>790,2439=>469,2440=>513,2441=>520,2442=>549,2443=>594,2444=>481,2447=>580,2448=>627, -2451=>540,2452=>613,2453=>570,2454=>467,2455=>471,2456=>428,2457=>483,2458=>408,2459=>509,2460=>591, -2461=>563,2462=>771,2463=>381,2464=>404,2465=>522,2466=>408,2467=>450,2468=>543,2469=>477,2470=>418, -2471=>433,2472=>445,2474=>499,2475=>584,2476=>377,2477=>555,2478=>448,2479=>423,2480=>390,2482=>498, -2486=>498,2487=>425,2488=>495,2489=>440,2492=>22,2493=>440,2494=>193,2495=>189,2496=>180,2497=>0, -2498=>0,2499=>0,2500=>0,2503=>252,2504=>243,2507=>889,2508=>865,2509=>0,2510=>356,2519=>219, -2524=>523,2525=>408,2527=>428,2528=>594,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479, -2537=>530,2538=>497,2539=>500,2540=>482,2541=>503,2542=>517,2543=>481,2544=>377,2545=>377,2546=>429, -2547=>383,2548=>429,2549=>478,2550=>545,2551=>158,2552=>365,2553=>280,2554=>357,2561=>0,2562=>0, -2563=>351,2565=>860,2566=>1088,2567=>869,2568=>928,2569=>723,2570=>723,2575=>665,2576=>857,2579=>716, -2580=>858,2581=>682,2582=>634,2583=>696,2584=>744,2585=>649,2586=>674,2587=>656,2588=>653,2589=>629, -2590=>639,2591=>641,2592=>657,2593=>650,2594=>653,2595=>651,2596=>640,2597=>634,2598=>662,2599=>630, -2600=>625,2602=>645,2603=>653,2604=>624,2605=>613,2606=>658,2607=>734,2608=>620,2610=>676,2611=>719, -2613=>626,2614=>666,2616=>666,2617=>614,2620=>0,2622=>286,2623=>322,2624=>301,2625=>0,2626=>0, -2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2649=>636,2650=>762,2651=>652,2652=>653,2654=>656, -2662=>672,2663=>543,2664=>622,2665=>622,2666=>576,2667=>589,2668=>509,2669=>645,2670=>661,2671=>655, -2672=>0,2673=>0,2674=>666,2675=>726,2676=>1217,2689=>22,2690=>23,2691=>0,2693=>775,2694=>979, -2695=>588,2696=>563,2697=>525,2698=>724,2699=>942,2701=>775,2703=>775,2704=>775,2705=>979,2707=>979, -2708=>979,2709=>610,2710=>706,2711=>623,2712=>610,2713=>601,2714=>614,2715=>642,2716=>684,2717=>634, -2718=>644,2719=>509,2720=>541,2721=>539,2722=>524,2723=>657,2724=>547,2725=>616,2726=>494,2727=>601, -2728=>627,2730=>524,2731=>620,2732=>691,2733=>687,2734=>468,2735=>590,2736=>509,2738=>571,2739=>687, -2741=>526,2742=>620,2743=>575,2744=>620,2745=>549,2748=>53,2749=>415,2750=>241,2751=>186,2752=>217, -2753=>32,2754=>21,2755=>38,2756=>27,2757=>45,2759=>41,2760=>46,2761=>207,2763=>190,2764=>182, -2765=>16,2768=>962,2784=>949,2790=>479,2791=>502,2792=>484,2793=>471,2794=>501,2795=>527,2796=>462, -2797=>524,2798=>454,2799=>495,2801=>752,2946=>479,2947=>893,2949=>1018,2950=>1170,2951=>916,2952=>676, -2953=>836,2954=>1225,2958=>744,2959=>744,2960=>848,2962=>813,2963=>813,2964=>813,2965=>688,2969=>744, -2970=>676,2972=>848,2974=>984,2975=>777,2979=>1338,2980=>664,2984=>561,2985=>1029,2986=>607,2990=>697, -2991=>697,2992=>434,2993=>617,2994=>869,2995=>859,2996=>697,2997=>869,2999=>1145,3000=>1064,3001=>1316, -3006=>424,3007=>125,3008=>596,3009=>539,3014=>596,3015=>650,3016=>973,3018=>1286,3019=>1286,3020=>1706, -3021=>333,3031=>859,3050=>778,3051=>881,3052=>876,3053=>648,3057=>744,4256=>587,4257=>620,4258=>642, -4259=>815,4260=>600,4261=>595,4262=>799,4263=>893,4264=>622,4265=>597,4266=>939,4267=>602,4268=>603, -4269=>790,4270=>587,4271=>623,4272=>799,4273=>601,4274=>792,4275=>724,4276=>847,4277=>599,4278=>812, -4279=>603,4280=>653,4281=>590,4282=>754,4283=>596,4284=>653,4285=>651,4286=>596,4287=>888,4288=>593, -4304=>436,4305=>491,4306=>528,4307=>692,4308=>447,4309=>447,4310=>628,4311=>734,4312=>449,4313=>445, -4314=>843,4315=>449,4316=>449,4317=>682,4318=>449,4319=>480,4320=>682,4321=>468,4322=>710,4323=>623, -4324=>697,4325=>447,4326=>702,4327=>447,4328=>470,4329=>440,4330=>632,4331=>449,4332=>470,4333=>536, -4334=>449,4335=>656,4336=>474,4337=>630,4338=>394,4339=>419,4340=>422,4341=>436,4345=>528,4347=>515, -7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500, -7690=>722,7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556, -7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556, -7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556, -7720=>722,7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500, -7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222, -7740=>556,7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556, -7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556, -7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333, -7770=>722,7771=>333,7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500, -7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278, -7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556, -7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722, -7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500, -7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500, -7830=>556,7831=>278,7832=>722,7833=>500,7834=>555,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556, -7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556, -7854=>667,7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556, -7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556, -7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222, -7884=>778,7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556, -7894=>778,7895=>556,7896=>778,7897=>556,7898=>788,7899=>565,7900=>788,7901=>565,7902=>788,7903=>565, -7904=>788,7905=>565,7906=>788,7907=>565,7908=>722,7909=>556,7910=>722,7911=>556,7912=>776,7913=>624, -7914=>776,7915=>624,7916=>776,7917=>624,7918=>776,7919=>624,7920=>776,7921=>624,7922=>667,7923=>500, -7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>596,7937=>596,7938=>596,7939=>596, -7940=>596,7941=>596,7942=>596,7943=>596,7944=>667,7945=>667,7946=>742,7947=>756,7948=>692,7949=>699, -7950=>673,7951=>667,7952=>512,7953=>512,7954=>512,7955=>512,7956=>512,7957=>512,7960=>730,7961=>714, -7962=>900,7963=>882,7964=>867,7965=>879,7968=>548,7969=>548,7970=>548,7971=>548,7972=>548,7973=>548, -7974=>548,7975=>548,7976=>772,7977=>778,7978=>945,7979=>947,7980=>943,7981=>946,7982=>853,7983=>853, -7984=>286,7985=>286,7986=>286,7987=>286,7988=>286,7989=>286,7990=>286,7991=>286,7992=>322,7993=>321, -7994=>482,7995=>485,7996=>477,7997=>484,7998=>394,7999=>390,8000=>546,8001=>546,8002=>546,8003=>546, -8004=>546,8005=>546,8008=>775,8009=>784,8010=>990,8011=>987,8012=>887,8013=>897,8016=>538,8017=>538, -8018=>538,8019=>538,8020=>538,8021=>538,8022=>538,8023=>538,8025=>747,8027=>915,8029=>971,8031=>863, -8032=>740,8033=>740,8034=>740,8035=>740,8036=>740,8037=>740,8038=>740,8039=>740,8040=>769,8041=>774, -8042=>972,8043=>970,8044=>879,8045=>918,8046=>901,8047=>901,8048=>596,8049=>596,8050=>512,8051=>512, -8052=>548,8053=>548,8054=>286,8055=>286,8056=>546,8057=>546,8058=>538,8059=>538,8060=>740,8061=>740, -8064=>596,8065=>596,8066=>596,8067=>596,8068=>596,8069=>596,8070=>596,8071=>596,8072=>830,8073=>828, -8074=>916,8075=>916,8076=>853,8077=>860,8078=>835,8079=>827,8080=>548,8081=>548,8082=>548,8083=>548, -8084=>548,8085=>548,8086=>548,8087=>548,8088=>928,8089=>931,8090=>1104,8091=>1109,8092=>1099,8093=>1102, -8094=>1009,8095=>1012,8096=>740,8097=>740,8098=>740,8099=>740,8100=>740,8101=>740,8102=>740,8103=>740, -8104=>934,8105=>934,8106=>1130,8107=>1128,8108=>1045,8109=>1077,8110=>1062,8111=>1065,8112=>596,8113=>596, -8114=>596,8115=>596,8116=>596,8118=>596,8119=>596,8120=>667,8121=>667,8122=>667,8123=>667,8124=>832, -8125=>333,8126=>200,8127=>333,8128=>333,8129=>333,8130=>548,8131=>548,8132=>548,8134=>548,8135=>548, -8136=>833,8137=>776,8138=>944,8139=>896,8140=>875,8141=>400,8142=>400,8143=>333,8144=>286,8145=>286, -8146=>286,8147=>286,8150=>286,8151=>286,8152=>278,8153=>278,8154=>385,8155=>376,8157=>400,8158=>400, -8159=>333,8160=>538,8161=>538,8162=>538,8163=>538,8164=>569,8165=>569,8166=>538,8167=>514,8168=>667, -8169=>667,8170=>817,8171=>827,8172=>741,8173=>393,8174=>393,8175=>333,8178=>740,8179=>740,8180=>740, -8182=>740,8183=>740,8184=>833,8185=>833,8186=>848,8187=>814,8188=>939,8189=>333,8190=>333,8192=>500, -8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>200,8202=>100, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8213=>1000,8214=>312, -8215=>566,8219=>221,8223=>333,8227=>350,8228=>278,8229=>666,8231=>278,8232=>0,8233=>0,8234=>0, -8235=>0,8236=>0,8237=>0,8238=>0,8239=>500,8241=>1360,8242=>278,8243=>469,8244=>680,8245=>278, -8246=>469,8247=>680,8248=>376,8251=>622,8252=>556,8253=>556,8254=>556,8255=>658,8256=>658,8257=>438, -8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1112,8264=>834,8265=>834,8266=>556,8267=>537, -8268=>537,8269=>537,8270=>389,8271=>278,8272=>658,8273=>389,8274=>634,8275=>500,8276=>658,8277=>787, -8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>350,8305=>350,8308=>350,8309=>350,8310=>350, -8311=>350,8312=>350,8313=>350,8314=>350,8315=>350,8316=>350,8317=>350,8318=>350,8319=>350,8320=>350, -8321=>350,8322=>350,8323=>350,8324=>350,8325=>350,8326=>350,8327=>350,8328=>350,8329=>350,8330=>350, -8331=>350,8332=>350,8333=>350,8334=>350,8336=>350,8337=>349,8338=>350,8339=>350,8340=>350,8353=>615, -8354=>601,8355=>611,8356=>556,8357=>833,8358=>682,8359=>1317,8360=>1202,8361=>879,8362=>869,8363=>538, -8365=>667,8366=>611,8368=>570,8369=>684,8370=>717,8371=>667,8372=>667,8373=>640,8400=>0,8401=>0, -8402=>0,8403=>0,8406=>0,8407=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0, -8417=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0, -8430=>0,8431=>0,8432=>0,8448=>970,8449=>979,8451=>1017,8452=>556,8453=>876,8454=>922,8455=>667, -8457=>919,8459=>969,8460=>615,8462=>556,8463=>572,8464=>809,8465=>606,8466=>874,8467=>417,8468=>747, -8470=>934,8471=>737,8472=>600,8475=>850,8476=>699,8480=>1000,8481=>1230,8486=>778,8487=>778,8488=>512, -8489=>286,8490=>667,8491=>667,8492=>908,8493=>623,8494=>556,8495=>444,8496=>562,8497=>895,8498=>588, -8499=>1080,8501=>640,8502=>592,8503=>466,8504=>598,8505=>278,8506=>871,8507=>1230,8513=>778,8514=>556, -8515=>556,8516=>667,8522=>516,8523=>655,8525=>936,8526=>482,8531=>869,8532=>869,8533=>869,8534=>869, -8535=>869,8536=>869,8537=>869,8538=>869,8539=>869,8540=>869,8541=>869,8542=>869,8543=>869,8544=>278, -8545=>556,8546=>834,8547=>945,8548=>667,8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>667,8554=>945, -8555=>1223,8556=>556,8557=>722,8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>722,8564=>500, -8565=>722,8566=>944,8567=>1166,8568=>722,8569=>500,8570=>722,8571=>944,8572=>222,8573=>500,8574=>556, -8575=>833,8592=>987,8593=>603,8594=>987,8595=>603,8596=>1042,8597=>1042,8598=>800,8599=>800,8600=>800, -8601=>800,8614=>987,8617=>987,8618=>987,8629=>658,8636=>987,8637=>987,8638=>380,8639=>393,8640=>987, -8641=>987,8642=>380,8643=>379,8652=>987,8656=>987,8657=>603,8658=>987,8659=>603,8660=>1042,8661=>603, -8669=>1092,8704=>667,8706=>556,8707=>667,8709=>823,8710=>711,8711=>711,8712=>584,8713=>584,8714=>584, -8715=>584,8716=>584,8717=>713,8719=>823,8720=>823,8721=>804,8722=>584,8723=>584,8724=>584,8725=>510, -8726=>392,8727=>584,8729=>584,8730=>542,8733=>713,8734=>713,8736=>768,8739=>200,8740=>288,8741=>312, -8742=>340,8743=>603,8744=>603,8745=>768,8746=>768,8747=>556,8748=>796,8749=>956,8750=>556,8756=>863, -8764=>584,8765=>584,8766=>573,8768=>244,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584, -8775=>584,8776=>584,8777=>584,8781=>554,8784=>584,8800=>584,8801=>584,8802=>584,8804=>584,8805=>584, -8810=>955,8811=>955,8813=>554,8814=>584,8815=>584,8816=>584,8817=>584,8818=>584,8819=>584,8826=>584, -8827=>584,8828=>584,8829=>584,8832=>584,8833=>584,8834=>584,8835=>584,8836=>584,8837=>584,8838=>584, -8839=>584,8840=>584,8841=>584,8844=>768,8847=>636,8848=>636,8849=>636,8850=>636,8851=>636,8852=>636, -8853=>768,8854=>768,8855=>768,8856=>768,8857=>768,8866=>658,8867=>658,8868=>658,8869=>658,8870=>600, -8871=>608,8882=>636,8883=>636,8884=>636,8885=>636,8896=>744,8897=>744,8898=>764,8899=>764,8901=>278, -8902=>471,8904=>710,8928=>584,8929=>584,8930=>636,8931=>636,8960=>823,8968=>456,8969=>455,8970=>455, -8971=>456,8992=>556,8993=>556,8994=>658,8995=>658,9001=>329,9002=>329,9115=>384,9116=>384,9117=>384, -9118=>384,9119=>384,9120=>384,9121=>388,9122=>388,9123=>388,9124=>388,9125=>388,9126=>388,9134=>556, -9250=>556,9251=>500,9312=>788,9313=>788,9314=>788,9315=>788,9316=>788,9317=>788,9318=>788,9319=>788, -9320=>788,9321=>788,9472=>1000,9473=>1000,9474=>1000,9475=>1000,9476=>1000,9477=>1000,9478=>1000,9479=>1000, -9480=>1000,9481=>1000,9482=>1000,9483=>1000,9484=>1000,9485=>1000,9486=>1000,9487=>1000,9488=>1000,9489=>1000, -9490=>1000,9491=>1000,9492=>1000,9493=>1000,9494=>1000,9495=>1000,9496=>1000,9497=>1000,9498=>1000,9499=>1000, -9500=>1000,9501=>1000,9502=>1000,9503=>1000,9504=>1000,9505=>1000,9506=>1000,9507=>1000,9508=>1000,9509=>1000, -9510=>1000,9511=>1000,9512=>1000,9513=>1000,9514=>1000,9515=>1000,9516=>1000,9517=>1000,9518=>1000,9519=>1000, -9520=>1000,9521=>1000,9522=>1000,9523=>1000,9524=>1000,9525=>1000,9526=>1000,9527=>1000,9528=>1000,9529=>1000, -9530=>1000,9531=>1000,9532=>1000,9533=>1000,9534=>1000,9535=>1000,9536=>1000,9537=>1000,9538=>1000,9539=>1000, -9540=>1000,9541=>1000,9542=>1000,9543=>1000,9544=>1000,9545=>1000,9546=>1000,9547=>1000,9552=>1000,9553=>1000, -9554=>1000,9555=>1000,9556=>1000,9557=>1000,9558=>1000,9559=>1000,9560=>1000,9561=>1000,9562=>1000,9563=>1000, -9564=>1000,9565=>1000,9566=>1000,9567=>1000,9568=>1000,9569=>1000,9570=>1000,9571=>1000,9572=>1000,9573=>1000, -9574=>1000,9575=>1000,9576=>1000,9577=>1000,9578=>1000,9579=>1000,9580=>1000,9600=>1000,9601=>1000,9602=>1000, -9603=>1000,9604=>1000,9605=>1000,9606=>1000,9607=>1000,9608=>1000,9609=>1000,9610=>1000,9611=>1000,9612=>1000, -9613=>1000,9614=>1000,9615=>1000,9616=>1000,9617=>1000,9618=>1000,9619=>1000,9620=>1000,9621=>1000,9622=>1000, -9623=>1000,9624=>1000,9625=>1000,9626=>1000,9627=>1000,9628=>1000,9629=>1000,9630=>1000,9631=>1000,9632=>1000, -9633=>1000,9635=>1000,9636=>1000,9637=>1000,9642=>1000,9644=>1000,9651=>892,9661=>892,9671=>788,9674=>489, -9675=>791,9711=>882,9772=>929,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595, -9831=>776,9833=>333,9834=>555,9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,10048=>1161,10752=>791, -10753=>791,10754=>791,10755=>764,10756=>764,10761=>584,11799=>333,64256=>495,64257=>460,64258=>465,64259=>652, -64260=>645,64261=>520,64275=>1004,64276=>1044,64277=>1042,64278=>1037,64279=>1256,64285=>200,64286=>305,64287=>400, -64288=>587,64289=>890,64290=>848,64291=>872,64292=>800,64293=>850,64294=>873,64295=>797,64296=>937,64297=>584, -64298=>776,64299=>776,64300=>776,64301=>776,64302=>640,64303=>640,64304=>640,64305=>591,64306=>466,64307=>598, -64308=>622,64309=>262,64310=>351,64312=>608,64313=>270,64314=>526,64315=>550,64316=>600,64318=>621,64320=>378, -64321=>607,64323=>575,64324=>568,64326=>590,64327=>606,64328=>547,64329=>776,64330=>687,64331=>212,64332=>591, -64333=>550,64334=>568,64335=>640,65533=>788); -$enc=''; -$diff=''; -$file='freesans.z'; -$ctg='freesans.ctg.z'; -$originalsize=568896; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesans.z b/include/limesurvey/admin/classes/tcpdf/fonts/freesans.z deleted file mode 100644 index 2bcdd56f..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freesans.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.ctg.z deleted file mode 100644 index 8c0510dc..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.php b/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.php deleted file mode 100644 index 0f129605..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.php +++ /dev/null @@ -1,236 +0,0 @@ -1000,'Descent'=>-300,'CapHeight'=>22,'Flags'=>32,'FontBBox'=>'[-967 -1175 1556 1639]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); -$up=-189; -$ut=69; -$dw=600; -$cw=array( -32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333, -42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556, -52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584, -62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778, -72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778, -82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333, -92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556, -102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611, -112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556, -122=>500,123=>389,124=>280,125=>389,126=>584,8364=>640,8218=>278,402=>333,8222=>500,8230=>1000, -8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>333,338=>1000,381=>611,8216=>278,8217=>278, -8220=>500,8221=>500,8226=>350,8211=>556,8212=>1000,732=>333,8482=>1000,353=>556,8250=>333,339=>944, -382=>500,376=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556, -168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584, -178=>351,179=>351,180=>333,181=>611,182=>556,183=>278,184=>333,185=>300,186=>365,187=>556, -188=>869,189=>869,190=>869,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722, -198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722, -218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556, -228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278, -238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584, -248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556,256=>722,257=>556, -258=>722,259=>556,260=>722,261=>556,262=>722,263=>556,264=>722,265=>556,266=>722,267=>556, -268=>722,269=>556,270=>722,271=>723,272=>722,273=>611,274=>667,275=>556,276=>667,277=>556, -278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>611,286=>778,287=>611, -288=>778,289=>611,290=>778,291=>611,292=>722,293=>611,294=>722,295=>611,296=>278,297=>278, -298=>278,299=>278,300=>278,301=>278,302=>278,303=>278,304=>278,305=>278,306=>808,307=>492, -308=>556,309=>278,310=>722,311=>556,312=>559,313=>611,314=>278,315=>611,316=>278,317=>611, -318=>362,319=>611,320=>556,321=>611,322=>278,323=>722,324=>611,325=>722,326=>611,327=>722, -328=>611,329=>611,330=>722,331=>611,332=>778,333=>611,334=>778,335=>611,336=>778,337=>611, -340=>722,341=>389,342=>722,343=>389,344=>722,345=>389,346=>667,347=>556,348=>667,349=>556, -350=>667,351=>556,354=>611,355=>333,356=>611,357=>414,358=>611,359=>333,360=>722,361=>611, -362=>722,363=>611,364=>722,365=>611,366=>722,367=>611,368=>722,369=>611,370=>722,371=>611, -372=>944,373=>778,374=>667,375=>556,377=>611,378=>500,379=>611,380=>500,383=>333,384=>611, -385=>963,386=>704,387=>611,388=>687,389=>611,390=>722,391=>752,392=>562,393=>722,394=>968, -395=>722,396=>611,397=>609,398=>667,399=>778,400=>672,401=>611,403=>778,404=>667,405=>889, -406=>278,407=>395,408=>778,409=>556,410=>333,411=>620,412=>944,413=>722,414=>611,415=>778, -416=>791,417=>653,418=>1111,419=>722,420=>914,421=>611,422=>647,423=>667,424=>556,425=>673, -426=>441,427=>333,428=>742,429=>333,430=>611,431=>769,432=>656,433=>766,434=>722,435=>667, -436=>620,437=>611,438=>500,439=>556,440=>556,441=>645,442=>569,443=>579,446=>611,447=>608, -448=>260,449=>370,450=>584,451=>278,452=>1333,453=>1222,454=>1111,455=>1167,456=>889,457=>556, -458=>1278,459=>1000,460=>889,461=>722,462=>556,463=>278,464=>278,465=>778,466=>611,467=>722, -468=>611,469=>722,470=>611,471=>722,472=>611,473=>722,474=>611,475=>722,476=>611,477=>556, -478=>722,479=>556,480=>722,481=>556,482=>1000,483=>889,484=>778,485=>611,486=>778,487=>611, -488=>722,489=>556,490=>778,491=>611,492=>778,493=>611,494=>556,495=>556,496=>278,497=>1333, -498=>1222,499=>1111,500=>778,501=>611,503=>630,504=>722,505=>611,506=>722,507=>556,508=>1000, -509=>889,510=>778,511=>611,512=>722,513=>556,514=>722,515=>556,516=>667,517=>556,518=>667, -519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>611,526=>778,527=>611,528=>722, -529=>389,530=>722,531=>389,532=>722,533=>611,534=>722,535=>611,536=>667,537=>556,538=>611, -539=>333,540=>569,541=>486,542=>722,543=>611,548=>645,549=>500,550=>722,551=>556,552=>667, -553=>556,554=>778,555=>611,556=>778,557=>611,558=>778,559=>611,560=>778,561=>611,562=>667, -563=>556,567=>278,592=>556,593=>667,594=>667,595=>611,596=>556,597=>600,598=>611,599=>611, -600=>556,601=>556,602=>834,603=>541,604=>557,605=>820,606=>570,607=>278,608=>611,609=>611, -610=>556,611=>556,612=>656,613=>619,614=>611,615=>611,616=>278,617=>344,618=>278,619=>473, -620=>527,621=>298,622=>778,623=>889,624=>889,625=>889,626=>611,627=>611,628=>615,629=>606, -630=>878,631=>822,632=>778,633=>389,634=>389,635=>389,636=>389,637=>389,638=>455,639=>455, -640=>620,641=>620,642=>556,643=>333,644=>278,645=>333,646=>544,647=>328,648=>333,649=>623, -650=>726,651=>639,652=>556,653=>778,654=>556,655=>556,656=>500,657=>571,658=>556,659=>642, -660=>611,661=>611,662=>611,664=>611,665=>554,666=>570,667=>616,668=>603,669=>552,670=>556, -671=>454,672=>611,673=>611,674=>611,684=>522,688=>377,689=>377,690=>202,691=>272,692=>272, -693=>299,694=>395,695=>534,696=>364,697=>278,698=>454,699=>278,700=>278,701=>278,702=>333, -703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,711=>333,712=>333,713=>333, -714=>333,715=>333,716=>272,717=>333,718=>333,719=>333,720=>333,721=>333,722=>333,723=>333, -724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,733=>333,734=>333, -735=>510,736=>372,737=>210,738=>363,739=>373,740=>334,741=>526,742=>526,743=>526,744=>526, -745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333,752=>333,753=>333,754=>333, -755=>333,756=>333,757=>437,758=>437,759=>400,760=>333,761=>200,762=>200,763=>200,764=>200, -765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0, -775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0, -785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0, -795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0, -805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0, -815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0, -825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0, -835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0, -845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0, -855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0, -865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0, -875=>0,876=>0,877=>0,878=>0,879=>0,884=>379,885=>379,890=>333,894=>333,900=>363, -901=>333,902=>761,903=>333,904=>864,905=>903,906=>454,908=>796,910=>991,911=>867,912=>315, -913=>696,914=>640,915=>585,916=>726,917=>589,918=>581,919=>654,920=>783,921=>215,922=>648, -923=>710,924=>829,925=>683,926=>645,927=>738,928=>726,929=>645,931=>673,932=>674,933=>771, -934=>773,935=>780,936=>778,937=>766,938=>263,939=>771,940=>660,941=>541,942=>560,943=>356, -944=>568,945=>632,946=>560,947=>591,948=>609,949=>541,950=>488,951=>608,952=>562,953=>315, -954=>533,955=>603,956=>582,957=>586,958=>513,959=>611,960=>658,961=>595,962=>590,963=>657, -964=>557,965=>568,966=>768,967=>632,968=>708,969=>778,970=>315,971=>568,972=>599,973=>568, -974=>778,977=>580,978=>742,979=>857,980=>620,981=>706,982=>740,983=>556,1008=>556,1009=>566, -1012=>778,1013=>328,1024=>670,1025=>670,1026=>800,1027=>611,1028=>714,1029=>667,1030=>314,1031=>300, -1032=>576,1033=>1100,1034=>1114,1035=>806,1036=>740,1037=>757,1038=>711,1039=>754,1040=>707,1041=>704, -1042=>704,1043=>611,1044=>900,1045=>670,1046=>1076,1047=>667,1048=>757,1049=>757,1050=>740,1051=>729, -1052=>874,1053=>753,1054=>774,1055=>753,1056=>675,1057=>711,1058=>611,1059=>711,1060=>904,1061=>666, -1062=>816,1063=>698,1064=>1057,1065=>1157,1066=>837,1067=>980,1068=>675,1069=>711,1070=>1093,1071=>708, -1072=>552,1073=>593,1074=>554,1075=>423,1076=>685,1077=>573,1078=>782,1079=>557,1080=>615,1081=>615, -1082=>559,1083=>568,1084=>666,1085=>603,1086=>606,1087=>603,1088=>612,1089=>556,1090=>440,1091=>549, -1092=>964,1093=>539,1094=>652,1095=>554,1096=>886,1097=>968,1098=>699,1099=>778,1100=>568,1101=>556, -1102=>848,1103=>586,1104=>573,1105=>573,1106=>606,1107=>423,1108=>556,1109=>555,1110=>260,1111=>278, -1112=>270,1113=>898,1114=>898,1115=>626,1116=>559,1117=>615,1118=>549,1119=>604,1136=>832,1137=>748, -1138=>774,1139=>606,1154=>449,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0, -1162=>832,1163=>675,1164=>678,1165=>611,1166=>675,1167=>612,1168=>636,1169=>440,1170=>622,1171=>449, -1172=>647,1173=>574,1174=>1096,1175=>803,1176=>683,1177=>555,1178=>759,1179=>573,1180=>730,1181=>554, -1182=>737,1183=>555,1184=>892,1185=>680,1186=>825,1187=>653,1188=>999,1189=>763,1190=>1105,1191=>925, -1192=>714,1193=>558,1194=>722,1195=>558,1196=>614,1197=>438,1198=>643,1199=>573,1200=>643,1201=>603, -1202=>670,1203=>548,1204=>952,1205=>738,1206=>781,1207=>615,1208=>698,1209=>588,1210=>687,1211=>588, -1212=>993,1213=>761,1214=>965,1215=>759,1216=>314,1217=>1076,1218=>809,1219=>700,1220=>543,1221=>793, -1222=>634,1223=>753,1224=>603,1225=>819,1226=>663,1227=>706,1228=>588,1229=>935,1230=>720,1231=>314, -1232=>707,1233=>564,1234=>707,1235=>566,1236=>1004,1237=>898,1238=>670,1239=>573,1240=>722,1241=>573, -1242=>722,1243=>573,1244=>1076,1245=>782,1246=>667,1247=>557,1248=>556,1249=>552,1250=>757,1251=>615, -1252=>757,1253=>615,1254=>778,1255=>611,1256=>774,1257=>606,1258=>774,1259=>606,1260=>711,1261=>556, -1262=>700,1263=>544,1264=>701,1265=>539,1266=>700,1267=>537,1268=>698,1269=>554,1270=>611,1271=>432, -1272=>980,1273=>778,1296=>672,1297=>546,1298=>729,1299=>577,1306=>778,1307=>612,1308=>944,1309=>776, -1310=>730,1311=>554,1329=>730,1330=>713,1331=>765,1332=>752,1333=>708,1334=>801,1335=>496,1336=>713, -1337=>855,1338=>686,1339=>727,1340=>420,1341=>897,1342=>841,1343=>708,1344=>660,1345=>666,1346=>747, -1347=>698,1348=>757,1349=>630,1350=>747,1351=>651,1352=>743,1353=>657,1354=>728,1355=>799,1356=>752, -1357=>743,1358=>768,1359=>691,1360=>713,1361=>640,1362=>425,1363=>818,1364=>672,1365=>805,1366=>754, -1369=>333,1370=>222,1371=>250,1372=>333,1373=>333,1374=>352,1375=>362,1377=>873,1378=>613,1379=>634, -1380=>636,1381=>593,1382=>639,1383=>417,1384=>613,1385=>658,1386=>711,1387=>609,1388=>318,1389=>836, -1390=>670,1391=>613,1392=>607,1393=>611,1394=>626,1395=>619,1396=>618,1397=>324,1398=>613,1399=>540, -1400=>591,1401=>392,1402=>873,1403=>577,1404=>603,1405=>600,1406=>626,1407=>951,1408=>613,1409=>612, -1410=>348,1411=>951,1412=>616,1413=>606,1414=>763,1415=>626,1417=>333,1418=>398,1456=>0,1457=>0, -1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0, -1469=>0,1470=>516,1471=>0,1472=>297,1473=>0,1474=>0,1475=>333,1476=>0,1488=>714,1489=>651, -1490=>557,1491=>638,1492=>682,1493=>297,1494=>443,1495=>682,1496=>670,1497=>284,1498=>590,1499=>595, -1500=>667,1501=>683,1502=>704,1503=>297,1504=>429,1505=>670,1506=>653,1507=>661,1508=>660,1509=>616, -1510=>671,1511=>672,1512=>600,1513=>840,1514=>756,1520=>554,1521=>550,1522=>542,1523=>238,1524=>474, -2561=>0,2562=>122,2563=>313,2565=>897,2566=>1157,2567=>930,2568=>966,2569=>762,2570=>762,2575=>729, -2576=>904,2579=>773,2580=>903,2581=>726,2582=>672,2583=>741,2584=>790,2585=>702,2586=>723,2587=>693, -2588=>688,2589=>673,2590=>683,2591=>686,2592=>711,2593=>680,2594=>693,2595=>729,2596=>691,2597=>694, -2598=>699,2599=>666,2600=>669,2602=>683,2603=>690,2604=>660,2605=>659,2606=>692,2607=>772,2608=>673, -2610=>731,2611=>814,2613=>663,2614=>704,2616=>702,2617=>650,2620=>0,2622=>307,2623=>304,2624=>306, -2625=>7,2626=>7,2631=>7,2632=>8,2635=>6,2636=>5,2637=>8,2649=>684,2650=>813,2651=>715, -2652=>695,2654=>709,2662=>697,2663=>630,2664=>696,2665=>690,2666=>646,2667=>636,2668=>571,2669=>682, -2670=>718,2671=>730,2672=>9,2673=>162,2674=>722,2675=>760,2676=>1110,4256=>616,4257=>645,4258=>664, -4259=>839,4260=>627,4261=>630,4262=>827,4263=>928,4264=>639,4265=>630,4266=>951,4267=>606,4268=>608, -4269=>835,4270=>630,4271=>610,4272=>804,4273=>615,4274=>823,4275=>747,4276=>870,4277=>627,4278=>840, -4279=>627,4280=>665,4281=>610,4282=>799,4283=>598,4284=>665,4285=>664,4286=>608,4287=>886,4288=>629, -4304=>463,4305=>516,4306=>564,4307=>706,4308=>459,4309=>476,4310=>623,4311=>711,4312=>494,4313=>476, -4314=>894,4315=>500,4316=>500,4317=>712,4318=>493,4319=>503,4320=>712,4321=>503,4322=>710,4323=>670, -4324=>707,4325=>459,4326=>691,4327=>465,4328=>492,4329=>480,4330=>656,4331=>500,4332=>492,4333=>524, -4334=>500,4335=>688,4336=>510,4337=>739,4338=>450,4339=>479,4340=>502,4341=>501,4345=>564,4347=>515, -7680=>722,7681=>556,7682=>722,7683=>611,7684=>722,7685=>611,7686=>722,7687=>611,7688=>722,7689=>556, -7690=>722,7691=>611,7692=>722,7693=>611,7694=>722,7695=>611,7696=>722,7697=>611,7698=>722,7699=>611, -7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556, -7710=>611,7711=>333,7712=>778,7713=>611,7714=>722,7715=>611,7716=>722,7717=>611,7718=>722,7719=>611, -7720=>722,7721=>611,7722=>722,7723=>611,7724=>278,7725=>278,7726=>278,7727=>278,7728=>722,7729=>556, -7730=>722,7731=>556,7732=>722,7733=>556,7734=>611,7735=>278,7736=>611,7737=>278,7738=>611,7739=>278, -7740=>611,7741=>278,7742=>833,7743=>889,7744=>833,7745=>889,7746=>833,7747=>889,7748=>722,7749=>611, -7750=>722,7751=>611,7752=>722,7753=>611,7754=>722,7755=>611,7756=>778,7757=>611,7758=>778,7759=>611, -7760=>778,7761=>611,7762=>778,7763=>611,7764=>667,7765=>611,7766=>667,7767=>611,7768=>722,7769=>389, -7770=>722,7771=>389,7772=>722,7773=>389,7774=>722,7775=>389,7776=>667,7777=>556,7778=>667,7779=>556, -7780=>667,7781=>556,7782=>667,7783=>556,7784=>667,7785=>556,7786=>611,7787=>333,7788=>611,7789=>333, -7790=>611,7791=>333,7792=>611,7793=>333,7794=>722,7795=>611,7796=>722,7797=>611,7798=>722,7799=>611, -7800=>722,7801=>611,7802=>722,7803=>611,7804=>667,7805=>556,7806=>667,7807=>556,7808=>944,7809=>778, -7810=>944,7811=>778,7812=>944,7813=>778,7814=>944,7815=>778,7816=>944,7817=>778,7818=>667,7819=>556, -7820=>667,7821=>556,7822=>667,7823=>556,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500, -7830=>611,7831=>333,7832=>778,7833=>556,7834=>555,7835=>333,7840=>722,7841=>556,7842=>722,7843=>556, -7844=>722,7845=>556,7846=>722,7847=>556,7848=>667,7849=>556,7850=>722,7851=>556,7852=>722,7853=>556, -7854=>722,7855=>556,7856=>722,7857=>556,7858=>722,7859=>556,7860=>722,7861=>556,7862=>722,7863=>556, -7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556, -7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>278, -7884=>778,7885=>611,7886=>778,7887=>611,7888=>778,7889=>611,7890=>778,7891=>611,7892=>778,7893=>611, -7894=>778,7895=>611,7896=>778,7897=>611,7898=>791,7899=>653,7900=>791,7901=>653,7902=>791,7903=>653, -7904=>791,7905=>653,7906=>791,7907=>653,7908=>722,7909=>611,7910=>722,7911=>611,7912=>769,7913=>656, -7914=>769,7915=>656,7916=>769,7917=>656,7918=>769,7919=>656,7920=>769,7921=>656,7922=>667,7923=>556, -7924=>667,7925=>556,7926=>667,7927=>556,7928=>667,7929=>556,7936=>632,7937=>632,7938=>632,7939=>632, -7940=>632,7941=>632,7942=>632,7943=>632,7944=>696,7945=>696,7946=>865,7947=>849,7948=>796,7949=>807, -7950=>730,7951=>750,7952=>541,7953=>541,7954=>541,7955=>541,7956=>541,7957=>541,7960=>758,7961=>760, -7962=>957,7963=>943,7964=>939,7965=>945,7968=>608,7969=>608,7970=>608,7971=>608,7972=>608,7973=>608, -7974=>608,7975=>608,7976=>823,7977=>831,7978=>1026,7979=>1017,7980=>1002,7981=>1024,7982=>908,7983=>909, -7984=>315,7985=>315,7986=>373,7987=>375,7988=>378,7989=>374,7990=>370,7991=>384,7992=>378,7993=>383, -7994=>596,7995=>579,7996=>572,7997=>576,7998=>474,7999=>459,8000=>610,8001=>610,8002=>610,8003=>610, -8004=>610,8005=>610,8008=>800,8009=>871,8010=>1084,8011=>1079,8012=>975,8013=>973,8016=>568,8017=>568, -8018=>568,8019=>568,8020=>568,8021=>568,8022=>568,8023=>568,8025=>906,8027=>1080,8029=>1115,8031=>977, -8032=>778,8033=>778,8034=>778,8035=>778,8036=>778,8037=>778,8038=>778,8039=>778,8040=>837,8041=>860, -8042=>1062,8043=>1072,8044=>962,8045=>985,8046=>922,8047=>959,8048=>632,8049=>632,8050=>541,8051=>541, -8052=>608,8053=>608,8054=>315,8055=>315,8056=>610,8057=>610,8058=>568,8059=>568,8060=>778,8061=>778, -8064=>632,8065=>632,8066=>632,8067=>632,8068=>632,8069=>632,8070=>632,8071=>632,8072=>909,8073=>906, -8074=>1061,8075=>1035,8076=>984,8077=>994,8078=>910,8079=>916,8080=>608,8081=>608,8082=>608,8083=>608, -8084=>608,8085=>608,8086=>608,8087=>608,8088=>1006,8089=>1015,8090=>1204,8091=>1207,8092=>1188,8093=>1209, -8094=>1096,8095=>1105,8096=>778,8097=>778,8098=>778,8099=>778,8100=>778,8101=>778,8102=>778,8103=>778, -8104=>1026,8105=>1048,8106=>1251,8107=>1260,8108=>1150,8109=>1177,8110=>1106,8111=>1142,8112=>632,8113=>632, -8114=>632,8115=>632,8116=>660,8118=>632,8119=>632,8120=>696,8121=>696,8122=>696,8123=>696,8124=>907, -8125=>278,8126=>346,8127=>278,8128=>278,8129=>333,8130=>608,8131=>608,8132=>560,8134=>608,8135=>608, -8136=>776,8137=>793,8138=>847,8139=>854,8140=>848,8141=>492,8142=>489,8143=>394,8144=>335,8145=>354, -8146=>367,8147=>368,8150=>353,8151=>366,8152=>240,8153=>259,8154=>418,8155=>416,8157=>481,8158=>589, -8159=>333,8160=>568,8161=>568,8162=>568,8163=>568,8164=>595,8165=>595,8166=>568,8167=>568,8168=>771, -8169=>771,8170=>951,8171=>982,8172=>806,8173=>333,8174=>333,8175=>333,8178=>778,8179=>778,8180=>778, -8182=>778,8183=>778,8184=>909,8185=>809,8186=>897,8187=>825,8188=>978,8189=>333,8190=>278,8192=>500, -8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>200,8202=>100, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8213=>1000,8214=>437, -8215=>556,8219=>278,8223=>500,8227=>350,8228=>278,8229=>666,8231=>278,8232=>0,8233=>0,8234=>0, -8235=>0,8236=>0,8237=>0,8238=>0,8239=>500,8241=>1367,8242=>238,8243=>426,8244=>614,8245=>238, -8246=>379,8247=>571,8248=>450,8251=>622,8252=>666,8253=>614,8254=>556,8255=>658,8256=>658,8257=>438, -8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1222,8264=>944,8265=>944,8266=>556,8267=>537, -8268=>537,8269=>537,8270=>389,8271=>333,8272=>658,8273=>389,8274=>634,8275=>568,8276=>658,8277=>793, -8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>351,8308=>351,8309=>351,8310=>351, -8311=>351,8312=>351,8313=>351,8314=>351,8315=>351,8316=>351,8317=>351,8318=>351,8319=>351,8320=>351, -8321=>301,8322=>351,8323=>351,8324=>351,8325=>351,8326=>351,8327=>351,8328=>351,8329=>351,8330=>350, -8331=>350,8332=>350,8333=>350,8334=>350,8355=>611,8356=>591,8357=>889,8358=>727,8360=>1265,8362=>1049, -8363=>580,8368=>605,8373=>591,8400=>0,8401=>0,8402=>0,8403=>0,8406=>0,8407=>0,8411=>0, -8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8421=>0,8422=>0,8423=>0,8424=>0, -8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>985,8449=>1007, -8451=>1034,8453=>981,8454=>1042,8455=>667,8457=>919,8465=>606,8468=>881,8470=>979,8471=>784,8476=>699, -8480=>1000,8481=>1230,8486=>766,8487=>778,8489=>315,8490=>741,8491=>729,8494=>556,8498=>588,8501=>714, -8502=>651,8503=>557,8504=>638,8506=>871,8507=>1230,8513=>778,8514=>611,8515=>611,8516=>667,8523=>669, -8525=>1072,8526=>482,8531=>869,8532=>869,8533=>869,8534=>869,8535=>869,8536=>869,8537=>869,8538=>869, -8539=>869,8540=>869,8541=>869,8542=>869,8543=>869,8544=>278,8545=>556,8546=>834,8547=>945,8548=>667, -8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>667,8554=>945,8555=>1223,8556=>611,8557=>722,8558=>722, -8559=>833,8560=>278,8561=>556,8562=>834,8563=>834,8564=>556,8565=>834,8566=>1112,8567=>1390,8568=>834, -8569=>556,8570=>834,8571=>1112,8572=>278,8573=>556,8574=>611,8575=>889,8592=>964,8593=>964,8594=>964, -8595=>964,8596=>964,8597=>964,8598=>964,8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8606=>964, -8607=>964,8608=>964,8609=>964,8610=>964,8611=>964,8612=>964,8613=>964,8614=>964,8615=>964,8616=>964, -8644=>964,8645=>964,8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8704=>722,8706=>556,8707=>667, -8710=>729,8711=>729,8721=>856,8722=>584,8725=>869,8730=>594,8747=>608,8800=>548,8804=>584,8805=>584, -9251=>500,9674=>541,9772=>923,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595, -9831=>776,9833=>333,9834=>556,9835=>778,9836=>778,9837=>556,9838=>556,9839=>556,10048=>1453,11799=>333, -64256=>607,64257=>576,64258=>603,64259=>849,64260=>849,64275=>1243,64276=>1226,64277=>1233,64278=>1238,64279=>1448, -64285=>284,64286=>305,64287=>542,64288=>653,64289=>964,64290=>888,64291=>932,64292=>845,64293=>917,64294=>933, -64295=>850,64296=>1006,64297=>584,64298=>840,64299=>840,64300=>840,64301=>840,64302=>714,64303=>714,64304=>714, -64305=>651,64306=>557,64307=>638,64308=>682,64309=>348,64310=>443,64312=>670,64313=>354,64314=>590,64315=>595, -64316=>667,64318=>704,64320=>429,64321=>670,64323=>661,64324=>660,64326=>671,64327=>672,64328=>600,64329=>840, -64330=>756,64331=>212,64332=>591,64333=>550,64334=>568,64335=>714,65533=>788); -$enc=''; -$diff=''; -$file='freesansb.z'; -$ctg='freesansb.ctg.z'; -$originalsize=283180; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.z b/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.z deleted file mode 100644 index 800fed29..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freesansb.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.ctg.z deleted file mode 100644 index 9e8a3c72..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.php deleted file mode 100644 index dab2c975..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.php +++ /dev/null @@ -1,225 +0,0 @@ -1000,'Descent'=>-300,'CapHeight'=>22,'Flags'=>96,'FontBBox'=>'[-769 -1175 1591 1639]','ItalicAngle'=>-12,'StemV'=>120,'MissingWidth'=>600); -$up=-145; -$ut=69; -$dw=600; -$cw=array( -32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333, -42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556, -52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584, -62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778, -72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778, -82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333, -92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556, -102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611, -112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556, -122=>500,123=>389,124=>280,125=>389,126=>584,8364=>640,8218=>278,402=>556,8222=>500,8230=>1000, -8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>333,338=>1000,381=>611,8216=>278,8217=>278, -8220=>500,8221=>500,8226=>350,8211=>556,8212=>1000,732=>333,8482=>1000,353=>556,8250=>333,339=>944, -382=>500,376=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556, -168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584, -178=>350,179=>350,180=>333,181=>667,182=>556,183=>278,184=>333,185=>248,186=>365,187=>556, -188=>869,189=>869,190=>869,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722, -198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722, -218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556, -228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278, -238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584, -248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556,256=>722,257=>556, -258=>722,259=>556,260=>722,261=>556,262=>722,263=>556,264=>722,265=>556,266=>722,267=>556, -268=>722,269=>556,270=>722,271=>722,272=>722,273=>611,274=>667,275=>556,276=>667,277=>556, -278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>611,286=>778,287=>611, -288=>778,289=>611,290=>778,291=>611,292=>722,293=>611,294=>722,295=>611,296=>278,297=>278, -298=>278,299=>278,300=>278,301=>278,302=>278,303=>268,304=>278,305=>278,306=>796,307=>487, -308=>556,309=>278,310=>722,311=>556,312=>529,313=>611,314=>278,315=>611,316=>278,317=>611, -318=>384,319=>611,320=>556,321=>611,322=>278,323=>722,324=>611,325=>722,326=>611,327=>722, -328=>611,329=>611,330=>722,331=>611,332=>778,333=>611,334=>778,335=>611,336=>778,337=>611, -340=>722,341=>389,342=>722,343=>389,344=>722,345=>389,346=>667,347=>556,348=>667,349=>556, -350=>667,351=>556,354=>611,355=>333,356=>611,357=>404,358=>611,359=>404,360=>722,361=>611, -362=>722,363=>611,364=>722,365=>611,366=>722,367=>611,368=>722,369=>611,370=>722,371=>611, -372=>944,373=>778,374=>667,375=>556,377=>611,378=>500,379=>611,380=>500,383=>333,384=>611, -385=>963,386=>722,387=>611,388=>687,389=>611,390=>722,391=>752,392=>562,393=>722,394=>968, -395=>722,396=>611,397=>609,398=>667,399=>778,400=>672,401=>611,403=>778,404=>667,405=>889, -406=>278,407=>395,408=>778,409=>556,410=>333,411=>620,412=>889,413=>722,414=>611,415=>778, -416=>778,417=>611,418=>1111,419=>722,420=>914,421=>611,422=>647,423=>667,424=>556,425=>688, -426=>441,427=>333,428=>742,429=>333,430=>611,431=>722,432=>611,433=>780,434=>722,435=>667, -436=>706,437=>611,438=>500,439=>556,440=>556,441=>645,442=>569,443=>579,446=>611,447=>608, -448=>260,449=>370,450=>584,451=>278,452=>1333,453=>1222,454=>1111,455=>1167,456=>889,457=>556, -458=>1278,459=>1000,460=>889,461=>722,462=>556,463=>278,464=>278,465=>778,466=>611,467=>722, -468=>611,469=>722,470=>611,471=>722,472=>611,473=>722,474=>611,475=>722,476=>611,477=>556, -478=>722,479=>556,480=>722,481=>556,482=>1000,483=>889,484=>811,485=>641,486=>778,487=>611, -488=>722,489=>556,490=>778,491=>611,492=>778,493=>611,494=>556,495=>556,496=>278,497=>1333, -498=>1222,499=>1111,500=>778,501=>611,503=>630,504=>722,505=>611,506=>722,507=>556,508=>1000, -509=>889,510=>778,511=>611,512=>722,513=>556,514=>722,515=>556,516=>667,517=>556,518=>667, -519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>611,526=>778,527=>611,528=>722, -529=>389,530=>722,531=>389,532=>722,533=>611,534=>722,535=>611,536=>667,537=>556,538=>611, -539=>333,540=>569,541=>486,542=>722,543=>611,548=>645,549=>500,550=>722,551=>556,552=>667, -553=>556,554=>778,555=>611,556=>778,557=>611,558=>778,559=>611,560=>778,561=>611,562=>667, -563=>556,567=>278,592=>556,593=>611,594=>611,595=>611,596=>556,597=>600,598=>611,599=>611, -600=>556,601=>556,602=>834,603=>570,604=>546,605=>820,606=>570,607=>278,608=>611,609=>611, -610=>556,611=>556,612=>656,613=>619,614=>611,615=>611,616=>278,617=>344,618=>278,619=>473, -620=>527,621=>298,622=>778,623=>889,624=>889,625=>889,626=>611,627=>611,628=>615,629=>590, -630=>878,631=>822,632=>778,633=>389,634=>389,635=>389,636=>389,637=>389,638=>455,639=>455, -640=>620,641=>586,642=>556,643=>333,644=>278,645=>333,646=>544,647=>328,648=>333,649=>623, -650=>726,651=>639,652=>556,653=>778,654=>556,655=>556,656=>500,657=>571,658=>556,659=>642, -660=>611,661=>611,662=>611,664=>611,665=>572,666=>570,667=>616,668=>603,669=>552,670=>556, -671=>454,672=>611,673=>611,674=>611,684=>520,688=>500,689=>500,690=>167,691=>333,692=>333, -693=>333,694=>348,695=>500,696=>345,697=>278,698=>454,699=>278,700=>333,701=>278,702=>333, -703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,711=>333,712=>333,713=>333, -714=>333,715=>333,716=>272,717=>333,718=>333,719=>333,720=>333,721=>333,722=>333,723=>333, -724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,733=>333,734=>333, -735=>510,736=>333,737=>333,738=>333,739=>357,740=>334,741=>526,742=>526,743=>526,744=>526, -745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333,752=>333,753=>333,754=>333, -755=>333,756=>333,757=>437,758=>437,759=>400,760=>333,761=>200,762=>200,763=>200,764=>200, -765=>332,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0, -775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0, -785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0, -795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0, -805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0, -815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0, -825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0, -835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0, -845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0, -855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0, -865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0, -875=>0,876=>0,877=>0,878=>0,879=>0,884=>208,885=>247,890=>364,894=>333,900=>239, -901=>446,902=>688,903=>333,904=>903,905=>962,906=>448,908=>904,910=>991,911=>932,912=>346, -913=>764,914=>688,915=>642,916=>744,917=>710,918=>688,919=>743,920=>810,921=>296,922=>744, -923=>744,924=>860,925=>714,926=>690,927=>822,928=>781,929=>698,931=>688,932=>688,933=>744, -934=>777,935=>783,936=>805,937=>780,938=>296,939=>744,940=>640,941=>530,942=>597,943=>339, -944=>575,945=>656,946=>576,947=>591,948=>620,949=>570,950=>522,951=>586,952=>586,953=>346, -954=>576,955=>620,956=>667,957=>564,958=>530,959=>610,960=>721,961=>626,962=>595,963=>676, -964=>592,965=>575,966=>801,967=>632,968=>722,969=>800,970=>346,971=>575,972=>609,973=>604, -974=>769,977=>580,978=>742,979=>857,980=>620,981=>778,982=>740,983=>601,1008=>556,1009=>566, -1012=>778,1013=>328,1024=>667,1025=>667,1026=>790,1027=>617,1028=>731,1029=>667,1030=>278,1031=>278, -1032=>556,1033=>1110,1034=>1088,1035=>790,1036=>722,1037=>757,1038=>698,1039=>722,1040=>722,1041=>722, -1042=>722,1043=>617,1044=>876,1045=>667,1046=>1100,1047=>670,1048=>757,1049=>757,1050=>722,1051=>715, -1052=>874,1053=>753,1054=>778,1055=>753,1056=>680,1057=>722,1058=>611,1059=>698,1060=>909,1061=>657, -1062=>845,1063=>688,1064=>1132,1065=>1217,1066=>835,1067=>980,1068=>678,1069=>735,1070=>1142,1071=>708, -1072=>553,1073=>591,1074=>574,1075=>429,1076=>745,1077=>572,1078=>792,1079=>554,1080=>603,1081=>603, -1082=>559,1083=>583,1084=>664,1085=>603,1086=>588,1087=>603,1088=>605,1089=>549,1090=>440,1091=>541, -1092=>948,1093=>539,1094=>690,1095=>564,1096=>901,1097=>987,1098=>692,1099=>806,1100=>572,1101=>546, -1102=>893,1103=>586,1104=>572,1105=>572,1106=>616,1107=>429,1108=>549,1109=>562,1110=>281,1111=>281, -1112=>282,1113=>888,1114=>897,1115=>606,1116=>559,1117=>603,1118=>541,1119=>603,1136=>830,1137=>761, -1138=>778,1139=>590,1154=>456,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0, -1162=>791,1163=>662,1164=>639,1165=>581,1166=>670,1167=>649,1168=>623,1169=>450,1170=>623,1171=>472, -1172=>674,1173=>528,1174=>1091,1175=>803,1176=>659,1177=>548,1178=>739,1179=>569,1180=>742,1181=>560, -1182=>737,1183=>559,1184=>900,1185=>679,1186=>808,1187=>673,1188=>1004,1189=>761,1190=>1114,1191=>876, -1192=>721,1193=>548,1194=>724,1195=>554,1196=>611,1197=>454,1198=>667,1199=>584,1200=>652,1201=>632, -1202=>667,1203=>550,1204=>951,1205=>748,1206=>759,1207=>630,1208=>669,1209=>580,1210=>672,1211=>576, -1212=>977,1213=>752,1214=>957,1215=>752,1216=>318,1217=>1087,1218=>792,1219=>726,1220=>530,1221=>782, -1222=>674,1223=>749,1224=>603,1225=>823,1226=>682,1227=>675,1228=>573,1229=>941,1230=>754,1231=>310, -1232=>704,1233=>553,1234=>711,1235=>553,1236=>1000,1237=>889,1238=>667,1239=>569,1240=>738,1241=>561, -1242=>738,1243=>561,1244=>1086,1245=>792,1246=>670,1247=>554,1248=>558,1249=>546,1250=>753,1251=>603, -1252=>753,1253=>603,1254=>778,1255=>588,1256=>778,1257=>590,1258=>778,1259=>590,1260=>735,1261=>546, -1262=>698,1263=>541,1264=>698,1265=>541,1266=>698,1267=>541,1268=>686,1269=>564,1270=>617,1271=>475, -1272=>976,1273=>806,1296=>672,1297=>546,1298=>729,1299=>577,1306=>778,1307=>611,1308=>944,1309=>776, -1310=>750,1311=>573,1329=>730,1330=>713,1331=>765,1332=>752,1333=>708,1334=>801,1335=>496,1336=>713, -1337=>855,1338=>686,1339=>727,1340=>420,1341=>897,1342=>841,1343=>708,1344=>660,1345=>666,1346=>747, -1347=>698,1348=>757,1349=>630,1350=>747,1351=>651,1352=>743,1353=>657,1354=>728,1355=>799,1356=>752, -1357=>743,1358=>768,1359=>691,1360=>713,1361=>640,1362=>425,1363=>818,1364=>672,1365=>805,1366=>754, -1369=>333,1370=>222,1371=>250,1372=>333,1373=>333,1374=>352,1375=>362,1377=>873,1378=>613,1379=>634, -1380=>636,1381=>593,1382=>639,1383=>417,1384=>613,1385=>658,1386=>711,1387=>609,1388=>318,1389=>836, -1390=>670,1391=>613,1392=>607,1393=>611,1394=>626,1395=>619,1396=>618,1397=>324,1398=>613,1399=>540, -1400=>591,1401=>392,1402=>873,1403=>577,1404=>603,1405=>600,1406=>626,1407=>951,1408=>613,1409=>612, -1410=>348,1411=>951,1412=>616,1413=>606,1414=>763,1415=>626,1417=>333,1418=>398,1456=>0,1457=>0, -1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0, -1469=>0,1470=>516,1471=>0,1472=>297,1473=>0,1474=>0,1475=>333,1476=>0,1488=>714,1489=>651, -1490=>557,1491=>638,1492=>682,1493=>297,1494=>443,1495=>682,1496=>670,1497=>284,1498=>590,1499=>595, -1500=>667,1501=>683,1502=>704,1503=>297,1504=>429,1505=>670,1506=>653,1507=>661,1508=>660,1509=>616, -1510=>671,1511=>672,1512=>600,1513=>840,1514=>756,1520=>554,1521=>550,1522=>542,1523=>238,1524=>474, -4256=>616,4257=>645,4258=>664,4259=>839,4260=>627,4261=>630,4262=>827,4263=>928,4264=>639,4265=>630, -4266=>951,4267=>606,4268=>608,4269=>835,4270=>630,4271=>610,4272=>804,4273=>615,4274=>823,4275=>747, -4276=>870,4277=>627,4278=>840,4279=>627,4280=>665,4281=>610,4282=>799,4283=>598,4284=>665,4285=>664, -4286=>608,4287=>886,4288=>629,4304=>463,4305=>516,4306=>564,4307=>706,4308=>459,4309=>476,4310=>623, -4311=>711,4312=>494,4313=>476,4314=>894,4315=>500,4316=>500,4317=>712,4318=>493,4319=>503,4320=>712, -4321=>503,4322=>710,4323=>670,4324=>707,4325=>459,4326=>691,4327=>465,4328=>492,4329=>480,4330=>656, -4331=>500,4332=>492,4333=>524,4334=>500,4335=>688,4336=>510,4337=>739,4338=>450,4339=>479,4340=>502, -4341=>501,4345=>564,4347=>515,7680=>722,7681=>556,7682=>722,7683=>611,7684=>722,7685=>611,7686=>722, -7687=>611,7688=>722,7689=>556,7690=>722,7691=>611,7692=>722,7693=>611,7694=>722,7695=>611,7696=>722, -7697=>611,7698=>722,7699=>611,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667, -7707=>556,7708=>667,7709=>556,7710=>611,7711=>333,7712=>778,7713=>611,7714=>722,7715=>611,7716=>722, -7717=>611,7718=>722,7719=>611,7720=>722,7721=>611,7722=>722,7723=>611,7724=>278,7725=>278,7726=>278, -7727=>278,7728=>722,7729=>556,7730=>722,7731=>556,7732=>722,7733=>556,7734=>611,7735=>278,7736=>611, -7737=>278,7738=>611,7739=>278,7740=>611,7741=>278,7742=>833,7743=>889,7744=>833,7745=>889,7746=>833, -7747=>889,7748=>722,7749=>611,7750=>722,7751=>611,7752=>722,7753=>611,7754=>722,7755=>611,7756=>778, -7757=>611,7758=>778,7759=>611,7760=>778,7761=>611,7762=>778,7763=>611,7764=>667,7765=>611,7766=>667, -7767=>611,7768=>722,7769=>389,7770=>722,7771=>389,7772=>722,7773=>389,7774=>722,7775=>389,7776=>667, -7777=>556,7778=>667,7779=>556,7780=>667,7781=>556,7782=>667,7783=>556,7784=>667,7785=>556,7786=>611, -7787=>333,7788=>611,7789=>333,7790=>611,7791=>333,7792=>611,7793=>333,7794=>722,7795=>611,7796=>722, -7797=>611,7798=>722,7799=>611,7800=>722,7801=>611,7802=>722,7803=>611,7804=>667,7805=>556,7806=>667, -7807=>556,7808=>944,7809=>778,7810=>944,7811=>778,7812=>944,7813=>778,7814=>944,7815=>778,7816=>944, -7817=>778,7818=>667,7819=>556,7820=>667,7821=>556,7822=>667,7823=>556,7824=>611,7825=>500,7826=>611, -7827=>500,7828=>611,7829=>500,7830=>611,7831=>333,7832=>778,7833=>556,7834=>555,7835=>333,7840=>722, -7841=>556,7842=>722,7843=>556,7844=>722,7845=>556,7846=>722,7847=>556,7848=>722,7849=>556,7850=>722, -7851=>556,7852=>722,7853=>556,7854=>722,7855=>556,7856=>722,7857=>556,7858=>722,7859=>556,7860=>722, -7861=>556,7862=>722,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667, -7871=>556,7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278, -7881=>278,7882=>278,7883=>278,7884=>778,7885=>611,7886=>778,7887=>611,7888=>778,7889=>611,7890=>778, -7891=>611,7892=>778,7893=>611,7894=>778,7895=>611,7896=>778,7897=>611,7898=>778,7899=>611,7900=>778, -7901=>611,7902=>778,7903=>611,7904=>778,7905=>611,7906=>778,7907=>611,7908=>722,7909=>611,7910=>722, -7911=>611,7912=>722,7913=>611,7914=>722,7915=>611,7916=>722,7917=>611,7918=>722,7919=>611,7920=>722, -7921=>611,7922=>667,7923=>556,7924=>667,7925=>556,7926=>667,7927=>556,7928=>667,7929=>556,7936=>656, -7937=>656,7938=>656,7939=>656,7940=>656,7941=>656,7942=>656,7943=>656,7944=>764,7945=>764,7946=>916, -7947=>940,7948=>908,7949=>891,7950=>844,7951=>869,7952=>570,7953=>570,7954=>570,7955=>570,7956=>570, -7957=>570,7960=>842,7961=>836,7962=>1025,7963=>1051,7964=>1035,7965=>1049,7968=>586,7969=>586,7970=>586, -7971=>586,7972=>586,7973=>586,7974=>586,7975=>586,7976=>891,7977=>886,7978=>1081,7979=>1108,7980=>1085, -7981=>1096,7982=>1009,7983=>1023,7984=>346,7985=>346,7986=>346,7987=>346,7988=>346,7989=>346,7990=>346, -7991=>346,7992=>467,7993=>476,7994=>631,7995=>661,7996=>631,7997=>633,7998=>568,7999=>571,8000=>610, -8001=>610,8002=>610,8003=>610,8004=>610,8005=>610,8008=>945,8009=>905,8010=>1118,8011=>1121,8012=>1064, -8013=>1062,8016=>575,8017=>575,8018=>575,8019=>575,8020=>575,8021=>575,8022=>575,8023=>575,8025=>964, -8027=>1148,8029=>1162,8031=>1081,8032=>800,8033=>800,8034=>800,8035=>800,8036=>800,8037=>800,8038=>800, -8039=>800,8040=>904,8041=>875,8042=>1092,8043=>1087,8044=>1003,8045=>1002,8046=>1001,8047=>1025,8048=>656, -8049=>656,8050=>570,8051=>570,8052=>586,8053=>586,8054=>346,8055=>346,8056=>610,8057=>610,8058=>575, -8059=>575,8060=>800,8061=>800,8064=>656,8065=>656,8066=>656,8067=>656,8068=>656,8069=>656,8070=>656, -8071=>656,8072=>854,8073=>855,8074=>1006,8075=>1030,8076=>996,8077=>977,8078=>938,8079=>959,8080=>586, -8081=>586,8082=>586,8083=>586,8084=>586,8085=>586,8086=>586,8087=>586,8088=>960,8089=>960,8090=>1155, -8091=>1186,8092=>1161,8093=>1171,8094=>1087,8095=>1102,8096=>800,8097=>800,8098=>800,8099=>800,8100=>800, -8101=>800,8102=>800,8103=>800,8104=>1005,8105=>980,8106=>1201,8107=>1192,8108=>1109,8109=>1108,8110=>1106, -8111=>1130,8112=>656,8113=>656,8114=>656,8115=>656,8116=>640,8118=>656,8119=>656,8120=>764,8121=>764, -8122=>764,8123=>764,8124=>854,8125=>278,8126=>201,8127=>147,8128=>278,8129=>333,8130=>586,8131=>586, -8132=>597,8134=>586,8135=>586,8136=>911,8137=>925,8138=>941,8139=>948,8140=>826,8141=>402,8142=>403, -8143=>147,8144=>346,8145=>346,8146=>346,8147=>346,8150=>346,8151=>346,8152=>296,8153=>296,8154=>511, -8155=>521,8157=>434,8158=>433,8159=>333,8160=>575,8161=>575,8162=>575,8163=>575,8164=>626,8165=>626, -8166=>575,8167=>575,8168=>744,8169=>744,8170=>901,8171=>975,8172=>837,8173=>353,8174=>351,8175=>303, -8178=>800,8179=>800,8180=>800,8182=>800,8183=>800,8184=>979,8185=>918,8186=>936,8187=>877,8188=>895, -8189=>333,8190=>159,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556, -8200=>278,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333, -8210=>556,8213=>1000,8214=>437,8215=>556,8219=>278,8223=>503,8227=>350,8228=>278,8229=>666,8231=>278, -8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>500,8241=>1372,8242=>238, -8243=>426,8244=>614,8245=>238,8246=>379,8247=>571,8248=>450,8251=>622,8252=>666,8253=>617,8254=>556, -8255=>658,8256=>658,8257=>438,8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1222,8264=>944, -8265=>944,8266=>556,8267=>556,8268=>537,8269=>537,8270=>389,8271=>333,8272=>658,8273=>389,8274=>634, -8275=>568,8276=>658,8277=>793,8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604, -8285=>224,8286=>224,8287=>0,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>351, -8308=>351,8309=>351,8310=>351,8311=>351,8312=>351,8313=>351,8314=>351,8315=>351,8316=>351,8317=>351, -8318=>351,8319=>351,8320=>351,8321=>251,8322=>351,8323=>351,8324=>351,8325=>351,8326=>351,8327=>351, -8328=>351,8329=>351,8330=>350,8331=>350,8332=>350,8333=>350,8334=>350,8355=>611,8356=>576,8357=>833, -8358=>724,8360=>1286,8362=>1049,8363=>571,8368=>594,8373=>591,8448=>985,8449=>1007,8451=>1020,8453=>981, -8454=>1042,8455=>667,8457=>930,8465=>606,8468=>883,8470=>1006,8471=>784,8476=>699,8480=>1000,8481=>1230, -8486=>780,8487=>780,8489=>286,8490=>722,8491=>722,8494=>556,8498=>626,8501=>714,8502=>651,8503=>557, -8504=>638,8506=>906,8507=>1155,8513=>778,8514=>611,8515=>611,8516=>667,8523=>710,8525=>1072,8526=>500, -8531=>869,8532=>869,8533=>869,8534=>869,8535=>869,8536=>869,8537=>869,8538=>869,8539=>869,8540=>869, -8541=>869,8542=>869,8543=>869,8544=>278,8545=>556,8546=>834,8547=>945,8548=>667,8549=>945,8550=>1223, -8551=>1501,8552=>945,8553=>667,8554=>945,8555=>1223,8556=>611,8557=>722,8558=>722,8559=>833,8560=>278, -8561=>556,8562=>834,8563=>834,8564=>556,8565=>834,8566=>1112,8567=>1390,8568=>834,8569=>556,8570=>834, -8571=>1112,8572=>278,8573=>556,8574=>611,8575=>889,8592=>964,8593=>964,8594=>964,8595=>964,8596=>964, -8597=>964,8598=>964,8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8606=>964,8607=>964,8608=>964, -8609=>964,8610=>964,8611=>964,8612=>964,8613=>964,8614=>964,8615=>964,8616=>964,8644=>964,8645=>964, -8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8706=>608,8710=>729,8721=>856,8722=>584,8723=>584, -8725=>1107,8730=>597,8800=>584,8804=>584,8805=>584,9251=>500,9674=>489,9824=>626,9825=>694,9826=>595, -9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>556,9835=>778,9836=>778,9837=>556, -9838=>556,9839=>556,11799=>333,64256=>607,64257=>576,64258=>603,64259=>849,64260=>849,64275=>1243,64276=>1226, -64277=>1233,64278=>1238,64279=>1448,64285=>284,64286=>305,64287=>542,64288=>653,64289=>964,64290=>888,64291=>932, -64292=>845,64293=>917,64294=>933,64295=>850,64296=>1006,64297=>584,64298=>840,64299=>840,64300=>840,64301=>840, -64302=>714,64303=>714,64304=>714,64305=>651,64306=>557,64307=>638,64308=>682,64309=>348,64310=>443,64312=>670, -64313=>354,64314=>590,64315=>595,64316=>667,64318=>704,64320=>429,64321=>670,64323=>661,64324=>660,64326=>671, -64327=>672,64328=>600,64329=>840,64330=>756,64331=>212,64332=>591,64333=>550,64334=>568,64335=>714,65533=>788); -$enc=''; -$diff=''; -$file='freesansbi.z'; -$ctg='freesansbi.ctg.z'; -$originalsize=269952; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.z b/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.z deleted file mode 100644 index 62a33225..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freesansbi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.ctg.z deleted file mode 100644 index fe5d4717..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.php b/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.php deleted file mode 100644 index 898bb41b..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.php +++ /dev/null @@ -1,239 +0,0 @@ -1000,'Descent'=>-300,'CapHeight'=>22,'Flags'=>96,'FontBBox'=>'[-898 -431 1572 1072]','ItalicAngle'=>-12,'StemV'=>70,'MissingWidth'=>600); -$up=-176; -$ut=50; -$dw=600; -$cw=array( -32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333, -42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556, -52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584, -62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778, -72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778, -82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278, -92=>278,93=>278,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556, -102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556, -112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500, -122=>500,123=>334,124=>260,125=>334,126=>584,8364=>655,8218=>222,402=>278,8222=>333,8230=>1000, -8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>250,338=>1000,381=>611,8216=>222,8217=>222, -8220=>333,8221=>333,8226=>350,8211=>556,8212=>1000,732=>333,8482=>1000,353=>500,8250=>250,339=>944, -382=>500,376=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556, -168=>333,169=>737,170=>370,171=>444,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584, -178=>352,179=>352,180=>333,181=>556,182=>537,183=>278,184=>333,185=>250,186=>365,187=>444, -188=>947,189=>947,190=>947,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667, -198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722, -218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556, -228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278, -238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584, -248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>667,257=>556, -258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500, -268=>722,269=>500,270=>722,271=>722,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556, -278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556, -288=>778,289=>556,290=>778,291=>527,292=>722,293=>556,294=>722,295=>556,296=>278,297=>278, -298=>278,299=>278,300=>278,301=>278,302=>278,303=>222,304=>278,305=>278,306=>742,307=>362, -308=>500,309=>222,310=>667,311=>500,312=>510,313=>556,314=>222,315=>556,316=>222,317=>556, -318=>387,319=>556,320=>409,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722, -328=>556,329=>722,330=>722,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556, -340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500, -350=>667,351=>500,354=>611,355=>278,356=>611,357=>443,358=>611,359=>278,360=>722,361=>556, -362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556, -372=>944,373=>722,374=>667,375=>500,377=>611,378=>500,379=>611,380=>500,383=>278,384=>556, -385=>854,386=>667,387=>556,388=>667,389=>556,390=>722,391=>722,392=>500,393=>722,394=>899, -395=>667,396=>556,397=>566,398=>667,399=>778,400=>667,401=>611,403=>778,404=>667,405=>889, -406=>278,407=>333,408=>741,409=>500,410=>333,411=>560,412=>833,413=>722,414=>556,415=>778, -416=>778,417=>556,418=>944,419=>722,420=>842,421=>556,422=>666,423=>667,424=>500,425=>611, -426=>333,427=>278,428=>611,429=>278,430=>611,431=>722,432=>556,433=>768,434=>722,435=>788, -436=>616,437=>611,438=>500,439=>611,440=>611,441=>500,442=>500,443=>556,446=>556,447=>556, -448=>260,449=>520,450=>584,451=>278,452=>1311,453=>1208,454=>1056,455=>1056,456=>778,457=>444, -458=>1158,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722, -468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556, -478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556, -488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>611,495=>500,496=>222,497=>1333, -498=>1222,499=>1056,500=>778,501=>556,503=>630,504=>722,505=>556,506=>667,507=>556,508=>1000, -509=>889,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667, -519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722, -529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,536=>667,537=>500,538=>611, -539=>278,540=>521,541=>393,542=>722,543=>556,548=>611,549=>500,550=>667,551=>556,552=>667, -553=>556,554=>778,555=>556,556=>778,557=>556,558=>778,559=>556,560=>778,561=>556,562=>667, -563=>500,567=>222,592=>556,593=>556,594=>659,595=>556,596=>500,597=>500,598=>556,599=>556, -600=>556,601=>556,602=>804,603=>500,604=>500,605=>742,606=>500,607=>222,608=>556,609=>556, -610=>546,611=>621,612=>556,613=>556,614=>556,615=>556,616=>222,617=>222,618=>278,619=>473, -620=>427,621=>222,622=>611,623=>833,624=>833,625=>833,626=>556,627=>556,628=>560,629=>556, -630=>778,631=>722,632=>728,633=>333,634=>333,635=>393,636=>333,637=>333,638=>384,639=>369, -640=>546,641=>546,642=>500,643=>278,644=>278,645=>278,646=>444,647=>278,648=>278,649=>556, -650=>626,651=>539,652=>500,653=>722,654=>500,655=>556,656=>500,657=>500,658=>500,659=>552, -660=>556,661=>556,662=>556,663=>1000,664=>556,665=>521,666=>500,667=>546,668=>500,669=>444, -670=>500,671=>430,672=>556,673=>556,674=>556,675=>944,676=>944,677=>944,678=>689,679=>506, -680=>764,681=>766,682=>660,683=>577,684=>476,685=>486,686=>565,687=>621,688=>500,689=>500, -690=>167,691=>333,692=>333,693=>393,694=>500,695=>500,696=>330,697=>278,698=>454,699=>278, -700=>278,701=>278,702=>333,703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333, -711=>333,712=>333,713=>333,714=>333,715=>333,716=>333,717=>333,718=>333,719=>333,720=>333, -721=>333,722=>333,723=>333,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333, -731=>333,733=>333,734=>333,735=>510,736=>333,737=>333,738=>333,739=>333,740=>334,741=>526, -742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333, -752=>383,753=>294,754=>294,755=>327,756=>261,757=>437,758=>437,759=>333,760=>278,761=>200, -762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0, -772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0, -782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0, -792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0, -802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0, -812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0, -822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0, -832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0, -842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0, -852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0, -862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0, -872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>199,885=>199, -890=>332,894=>278,900=>291,901=>624,902=>659,903=>278,904=>870,905=>870,906=>315,908=>876, -910=>903,911=>882,912=>333,913=>765,914=>643,915=>589,916=>760,917=>659,918=>682,919=>707, -920=>769,921=>256,922=>689,923=>765,924=>825,925=>687,926=>649,927=>766,928=>730,929=>649, -931=>678,932=>655,933=>733,934=>753,935=>783,936=>773,937=>768,938=>285,939=>733,940=>593, -941=>523,942=>595,943=>271,944=>549,945=>596,946=>534,947=>531,948=>566,949=>523,950=>470, -951=>557,952=>547,953=>293,954=>516,955=>579,956=>571,957=>518,958=>499,959=>561,960=>636, -961=>551,962=>564,963=>627,964=>505,965=>549,966=>715,967=>579,968=>662,969=>746,970=>335, -971=>549,972=>535,973=>503,974=>725,977=>580,978=>742,979=>809,980=>620,981=>728,982=>740, -983=>556,1008=>556,1009=>566,1012=>778,1013=>328,1024=>657,1025=>657,1026=>781,1027=>590,1028=>709, -1029=>655,1030=>254,1031=>254,1032=>532,1033=>1002,1034=>1166,1035=>772,1036=>674,1037=>730,1038=>605, -1039=>721,1040=>667,1041=>665,1042=>665,1043=>590,1044=>807,1045=>657,1046=>914,1047=>653,1048=>730, -1049=>730,1050=>674,1051=>656,1052=>846,1053=>721,1054=>778,1055=>720,1056=>649,1057=>709,1058=>606, -1059=>605,1060=>875,1061=>660,1062=>754,1063=>612,1064=>830,1065=>872,1066=>839,1067=>885,1068=>668, -1069=>708,1070=>1099,1071=>676,1072=>556,1073=>545,1074=>521,1075=>375,1076=>572,1077=>538,1078=>815, -1079=>488,1080=>557,1081=>557,1082=>519,1083=>508,1084=>618,1085=>558,1086=>533,1087=>557,1088=>569, -1089=>511,1090=>392,1091=>469,1092=>922,1093=>475,1094=>588,1095=>482,1096=>693,1097=>722,1098=>644, -1099=>731,1100=>521,1101=>509,1102=>790,1103=>550,1104=>538,1105=>538,1106=>566,1107=>375,1108=>506, -1109=>488,1110=>224,1111=>272,1112=>226,1113=>793,1114=>849,1115=>576,1116=>519,1117=>557,1118=>469, -1119=>557,1120=>942,1121=>693,1136=>749,1137=>666,1138=>785,1139=>528,1154=>456,1155=>0,1156=>0, -1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>751,1163=>588,1164=>685,1165=>554,1166=>656, -1167=>606,1168=>598,1169=>396,1170=>611,1171=>409,1172=>592,1173=>448,1174=>921,1175=>826,1176=>657, -1177=>493,1178=>680,1179=>529,1180=>678,1181=>524,1182=>695,1183=>528,1184=>846,1185=>650,1186=>741, -1187=>578,1188=>992,1189=>700,1190=>1047,1191=>778,1192=>687,1193=>507,1194=>709,1195=>509,1196=>611, -1197=>393,1198=>664,1199=>580,1200=>668,1201=>617,1202=>664,1203=>489,1204=>905,1205=>662,1206=>631, -1207=>498,1208=>597,1209=>472,1210=>597,1211=>471,1212=>927,1213=>716,1214=>927,1215=>716,1216=>254, -1217=>915,1218=>815,1219=>665,1220=>510,1221=>678,1222=>533,1223=>721,1224=>558,1225=>751,1226=>589, -1227=>599,1228=>472,1229=>876,1230=>649,1231=>254,1232=>667,1233=>552,1234=>667,1235=>552,1236=>1000, -1237=>889,1238=>657,1239=>538,1240=>722,1241=>511,1242=>722,1243=>511,1244=>914,1245=>815,1246=>653, -1247=>488,1248=>611,1249=>546,1250=>730,1251=>557,1252=>730,1253=>557,1254=>774,1255=>529,1256=>785, -1257=>528,1258=>785,1259=>528,1260=>708,1261=>509,1262=>605,1263=>469,1264=>605,1265=>469,1266=>605, -1267=>469,1268=>612,1269=>482,1270=>601,1271=>430,1272=>885,1273=>731,1296=>667,1297=>500,1298=>673, -1299=>557,1306=>778,1307=>556,1308=>944,1309=>722,1310=>667,1311=>510,1329=>722,1330=>705,1331=>774, -1332=>754,1333=>722,1334=>751,1335=>485,1336=>722,1337=>782,1338=>655,1339=>699,1340=>417,1341=>853, -1342=>791,1343=>711,1344=>588,1345=>663,1346=>665,1347=>665,1348=>756,1349=>623,1350=>773,1351=>603, -1352=>722,1353=>648,1354=>722,1355=>751,1356=>750,1357=>722,1358=>748,1359=>667,1360=>699,1361=>623, -1362=>417,1363=>785,1364=>638,1365=>778,1366=>716,1369=>333,1370=>222,1371=>133,1372=>325,1373=>333, -1374=>333,1375=>333,1377=>833,1378=>556,1379=>572,1380=>581,1381=>546,1382=>588,1383=>448,1384=>556, -1385=>568,1386=>582,1387=>552,1388=>301,1389=>799,1390=>556,1391=>554,1392=>533,1393=>548,1394=>552, -1395=>552,1396=>544,1397=>222,1398=>544,1399=>456,1400=>556,1401=>390,1402=>833,1403=>509,1404=>547, -1405=>533,1406=>610,1407=>887,1408=>556,1409=>545,1410=>301,1411=>853,1412=>632,1413=>579,1414=>690, -1415=>545,1417=>278,1418=>367,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0, -1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>488,1471=>0,1472=>212,1473=>0, -1474=>0,1475=>278,1476=>0,1488=>640,1489=>591,1490=>466,1491=>598,1492=>622,1493=>212,1494=>351, -1495=>623,1496=>608,1497=>200,1498=>526,1499=>550,1500=>600,1501=>623,1502=>621,1503=>212,1504=>378, -1505=>607,1506=>587,1507=>575,1508=>568,1509=>540,1510=>590,1511=>606,1512=>547,1513=>776,1514=>687, -1520=>424,1521=>412,1522=>400,1523=>184,1524=>344,2433=>0,2434=>300,2435=>264,2437=>594,2438=>790, -2439=>469,2440=>513,2441=>520,2442=>549,2443=>594,2444=>481,2447=>580,2448=>627,2451=>540,2452=>613, -2453=>570,2454=>467,2455=>471,2456=>428,2457=>483,2458=>408,2459=>509,2460=>591,2461=>563,2462=>771, -2463=>381,2464=>404,2465=>522,2466=>408,2467=>450,2468=>543,2469=>477,2470=>418,2471=>433,2472=>445, -2474=>499,2475=>584,2476=>377,2477=>555,2478=>448,2479=>423,2480=>390,2482=>498,2486=>498,2487=>425, -2488=>495,2489=>440,2492=>22,2493=>440,2494=>193,2495=>189,2496=>180,2497=>0,2498=>0,2499=>0, -2500=>0,2503=>252,2504=>243,2507=>889,2508=>865,2509=>0,2510=>356,2519=>219,2524=>523,2525=>408, -2527=>428,2528=>594,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479,2537=>530,2538=>497, -2539=>500,2540=>482,2541=>503,2542=>517,2543=>481,2544=>377,2545=>377,2546=>429,2547=>383,2548=>429, -2549=>478,2550=>545,2551=>158,2552=>365,2553=>280,2554=>357,4256=>587,4257=>620,4258=>642,4259=>815, -4260=>600,4261=>595,4262=>799,4263=>893,4264=>622,4265=>597,4266=>939,4267=>602,4268=>603,4269=>790, -4270=>587,4271=>623,4272=>799,4273=>601,4274=>792,4275=>724,4276=>847,4277=>599,4278=>812,4279=>603, -4280=>653,4281=>590,4282=>754,4283=>596,4284=>653,4285=>651,4286=>596,4287=>888,4288=>593,4304=>436, -4305=>491,4306=>528,4307=>692,4308=>447,4309=>447,4310=>628,4311=>734,4312=>449,4313=>445,4314=>843, -4315=>449,4316=>449,4317=>682,4318=>449,4319=>480,4320=>682,4321=>468,4322=>710,4323=>623,4324=>697, -4325=>447,4326=>702,4327=>447,4328=>470,4329=>440,4330=>632,4331=>449,4332=>470,4333=>536,4334=>449, -4335=>656,4336=>474,4337=>630,4338=>394,4339=>419,4340=>422,4341=>436,4345=>528,4347=>515,7680=>667, -7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722, -7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667, -7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556,7710=>611, -7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722, -7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667, -7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222,7740=>556, -7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556,7750=>722, -7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556,7760=>778, -7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333,7770=>722, -7771=>333,7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667, -7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611, -7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722, -7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944, -7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500,7820=>667, -7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556, -7831=>278,7832=>722,7833=>500,7834=>555,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556,7844=>667, -7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667, -7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667, -7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556,7874=>667, -7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778, -7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778, -7895=>556,7896=>778,7897=>556,7898=>778,7899=>556,7900=>778,7901=>556,7902=>778,7903=>556,7904=>778, -7905=>556,7906=>778,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>722,7913=>556,7914=>722, -7915=>556,7916=>722,7917=>556,7918=>722,7919=>556,7920=>722,7921=>556,7922=>667,7923=>500,7924=>667, -7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>596,7937=>596,7938=>596,7939=>596,7940=>596, -7941=>596,7942=>596,7943=>596,7944=>718,7945=>718,7946=>796,7947=>780,7948=>746,7949=>744,7950=>718, -7951=>718,7952=>523,7953=>523,7954=>523,7955=>523,7956=>523,7957=>523,7960=>759,7961=>751,7962=>962, -7963=>957,7964=>958,7965=>947,7968=>557,7969=>557,7970=>557,7971=>557,7972=>557,7973=>557,7974=>557, -7975=>557,7976=>807,7977=>796,7978=>1013,7979=>1002,7980=>1009,7981=>1000,7982=>882,7983=>919,7984=>293, -7985=>293,7986=>361,7987=>382,7988=>347,7989=>329,7990=>352,7991=>347,7992=>353,7993=>348,7994=>555, -7995=>557,7996=>557,7997=>545,7998=>435,7999=>448,8000=>561,8001=>561,8002=>561,8003=>561,8004=>561, -8005=>561,8008=>792,8009=>801,8010=>1031,8011=>1029,8012=>931,8013=>931,8016=>549,8017=>549,8018=>549, -8019=>549,8020=>549,8021=>549,8022=>549,8023=>549,8025=>838,8027=>1004,8029=>1036,8031=>936,8032=>746, -8033=>746,8034=>746,8035=>746,8036=>746,8037=>746,8038=>746,8039=>746,8040=>768,8041=>794,8042=>1003, -8043=>1002,8044=>922,8045=>918,8046=>871,8047=>893,8048=>596,8049=>596,8050=>523,8051=>523,8052=>557, -8053=>557,8054=>293,8055=>293,8056=>561,8057=>561,8058=>549,8059=>549,8060=>746,8061=>746,8064=>596, -8065=>596,8066=>596,8067=>596,8068=>596,8069=>596,8070=>596,8071=>596,8072=>859,8073=>861,8074=>948, -8075=>928,8076=>886,8077=>895,8078=>865,8079=>864,8080=>557,8081=>557,8082=>557,8083=>557,8084=>557, -8085=>557,8086=>557,8087=>557,8088=>890,8089=>894,8090=>1092,8091=>1084,8092=>1095,8093=>1080,8094=>953, -8095=>986,8096=>746,8097=>746,8098=>746,8099=>746,8100=>746,8101=>746,8102=>746,8103=>746,8104=>892, -8105=>907,8106=>1113,8107=>1095,8108=>1034,8109=>1030,8110=>983,8111=>1002,8112=>596,8113=>596,8114=>596, -8115=>596,8116=>593,8118=>596,8119=>596,8120=>765,8121=>765,8122=>765,8123=>765,8124=>861,8125=>147, -8126=>201,8127=>147,8128=>278,8129=>333,8130=>557,8131=>557,8132=>595,8134=>557,8135=>557,8136=>835, -8137=>849,8138=>895,8139=>861,8140=>786,8141=>602,8142=>601,8143=>333,8144=>335,8145=>322,8146=>357, -8147=>336,8150=>340,8151=>320,8152=>300,8153=>298,8154=>439,8155=>408,8157=>434,8158=>433,8159=>333, -8160=>549,8161=>549,8162=>549,8163=>549,8164=>551,8165=>551,8166=>549,8167=>549,8168=>733,8169=>733, -8170=>794,8171=>832,8172=>739,8173=>333,8174=>624,8175=>303,8178=>746,8179=>746,8180=>725,8182=>746, -8183=>746,8184=>889,8185=>828,8186=>836,8187=>811,8188=>867,8189=>333,8190=>159,8192=>500,8193=>1000, -8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>200,8202=>100,8203=>0, -8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8213=>1000,8214=>312,8215=>567, -8219=>221,8223=>333,8227=>350,8228=>278,8229=>666,8231=>278,8232=>0,8233=>0,8234=>0,8235=>0, -8236=>0,8237=>0,8238=>0,8239=>500,8241=>1360,8242=>278,8243=>469,8244=>680,8245=>278,8246=>469, -8247=>680,8248=>376,8251=>622,8252=>556,8253=>556,8254=>556,8255=>658,8256=>658,8257=>438,8258=>840, -8259=>400,8260=>167,8261=>334,8262=>334,8263=>1112,8264=>834,8265=>834,8266=>556,8267=>537,8268=>537, -8269=>537,8270=>389,8271=>278,8272=>658,8273=>389,8274=>634,8275=>500,8276=>658,8277=>1000,8278=>515, -8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0,8288=>0, -8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>350,8308=>351,8309=>351,8310=>351,8311=>351, -8312=>351,8313=>351,8314=>350,8315=>350,8316=>350,8317=>350,8318=>350,8319=>350,8320=>351,8321=>251, -8322=>351,8323=>351,8324=>351,8325=>353,8326=>351,8327=>351,8328=>351,8329=>351,8330=>350,8331=>350, -8332=>350,8333=>350,8334=>350,8353=>615,8354=>601,8355=>611,8356=>556,8357=>833,8358=>682,8359=>1205, -8360=>1222,8361=>879,8362=>869,8363=>538,8365=>667,8366=>611,8368=>570,8369=>684,8370=>717,8371=>667, -8372=>667,8373=>640,8400=>0,8401=>0,8402=>0,8403=>0,8406=>0,8407=>0,8411=>0,8412=>0, -8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0, -8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>970,8449=>979,8451=>1019, -8452=>556,8453=>876,8454=>922,8455=>667,8457=>867,8459=>969,8460=>615,8462=>556,8463=>572,8464=>809, -8465=>606,8466=>874,8468=>747,8470=>934,8471=>737,8472=>600,8475=>850,8476=>699,8480=>1000,8481=>1220, -8486=>768,8487=>744,8488=>512,8489=>286,8490=>722,8491=>722,8492=>908,8493=>623,8494=>556,8496=>562, -8498=>556,8499=>1080,8501=>520,8502=>591,8503=>456,8504=>598,8506=>843,8507=>1220,8513=>778,8514=>556, -8515=>556,8516=>667,8522=>516,8523=>640,8525=>936,8526=>477,8531=>869,8532=>869,8533=>869,8534=>869, -8535=>869,8536=>869,8537=>869,8538=>869,8539=>869,8540=>869,8541=>869,8542=>869,8543=>869,8544=>278, -8545=>556,8546=>834,8547=>945,8548=>667,8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>667,8554=>945, -8555=>1223,8556=>556,8557=>722,8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>722,8564=>500, -8565=>722,8566=>944,8567=>1166,8568=>722,8569=>500,8570=>722,8571=>944,8572=>222,8573=>500,8574=>556, -8575=>833,8592=>987,8593=>603,8594=>987,8595=>603,8596=>1042,8597=>1042,8706=>556,8710=>712,8721=>804, -8722=>584,8725=>947,8730=>542,8739=>200,8741=>312,8800=>584,8804=>584,8805=>584,9251=>500,9674=>489, -9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>556, -9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,11799=>333,64256=>494,64257=>471,64258=>474,64259=>659, -64260=>654,64261=>530,64275=>1027,64276=>1056,64277=>1058,64278=>1073,64279=>1301,64285=>200,64286=>305,64287=>400, -64288=>587,64289=>890,64290=>848,64291=>872,64292=>800,64293=>850,64294=>873,64295=>797,64296=>937,64297=>584, -64298=>776,64299=>776,64300=>776,64301=>776,64302=>640,64303=>640,64304=>640,64305=>591,64306=>466,64307=>598, -64308=>622,64309=>262,64310=>351,64312=>608,64313=>270,64314=>526,64315=>550,64316=>600,64318=>621,64320=>378, -64321=>607,64323=>575,64324=>568,64326=>590,64327=>606,64328=>547,64329=>776,64330=>687,64331=>212,64332=>591, -64333=>550,64334=>568,64335=>640,65533=>788); -$enc=''; -$diff=''; -$file='freesansi.z'; -$ctg='freesansi.ctg.z'; -$originalsize=410728; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.z b/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.z deleted file mode 100644 index d675eb26..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freesansi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.ctg.z deleted file mode 100644 index 06f25fc8..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.php b/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.php deleted file mode 100644 index 0fbefe78..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.php +++ /dev/null @@ -1,504 +0,0 @@ -900,'Descent'=>-300,'CapHeight'=>10,'Flags'=>96,'FontBBox'=>'[-879 -1201 1767 2606]','ItalicAngle'=>-33.2,'StemV'=>70,'MissingWidth'=>600); -$up=-125; -$ut=50; -$dw=600; -$cw=array( -32=>250,33=>333,34=>408,35=>500,36=>500,37=>833,38=>778,39=>180,40=>333,41=>333, -42=>500,43=>564,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500, -52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278,60=>564,61=>564, -62=>564,63=>444,64=>921,65=>722,66=>667,67=>667,68=>722,69=>611,70=>556,71=>722, -72=>722,73=>333,74=>389,75=>722,76=>611,77=>889,78=>722,79=>722,80=>556,81=>722, -82=>667,83=>556,84=>611,85=>722,86=>722,87=>944,88=>722,89=>722,90=>611,91=>333, -92=>278,93=>333,94=>469,95=>500,96=>333,97=>444,98=>500,99=>444,100=>500,101=>444, -102=>333,103=>500,104=>500,105=>278,106=>278,107=>500,108=>278,109=>778,110=>500,111=>500, -112=>500,113=>500,114=>333,115=>389,116=>278,117=>500,118=>500,119=>722,120=>500,121=>500, -122=>444,123=>480,124=>200,125=>480,126=>541,8364=>741,8218=>250,402=>333,8222=>444,8230=>1000, -8224=>500,8225=>500,710=>333,8240=>1000,352=>556,8249=>250,338=>889,381=>611,8216=>250,8217=>250, -8220=>444,8221=>444,8226=>350,8211=>500,8212=>1000,732=>333,8482=>980,353=>389,8250=>250,339=>722, -382=>444,376=>722,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>200,167=>500, -168=>333,169=>760,170=>276,171=>444,172=>564,173=>333,174=>760,175=>333,176=>400,177=>564, -178=>320,179=>320,180=>333,181=>500,182=>453,183=>250,184=>333,185=>320,186=>310,187=>441, -188=>750,189=>750,190=>750,191=>444,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722, -198=>889,199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333, -208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>564,216=>722,217=>722, -218=>722,219=>722,220=>722,221=>722,222=>576,223=>500,224=>444,225=>444,226=>444,227=>444, -228=>444,229=>444,230=>667,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278, -238=>278,239=>278,240=>501,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>564, -248=>500,249=>500,250=>500,251=>500,252=>500,253=>500,254=>496,255=>500,256=>722,257=>444, -258=>722,259=>444,260=>722,261=>444,262=>667,263=>444,264=>667,265=>444,266=>667,267=>444, -268=>667,269=>444,270=>722,271=>600,272=>722,273=>500,274=>611,275=>444,276=>611,277=>444, -278=>611,279=>444,280=>611,281=>444,282=>611,283=>444,284=>722,285=>500,286=>722,287=>500, -288=>722,289=>500,290=>722,291=>500,292=>722,293=>500,294=>722,295=>548,296=>333,297=>278, -298=>333,299=>278,300=>333,301=>278,302=>333,303=>278,304=>333,305=>278,306=>703,307=>529, -308=>389,309=>278,310=>722,311=>500,312=>500,313=>611,314=>278,315=>611,316=>278,317=>611, -318=>348,319=>611,320=>444,321=>611,322=>278,323=>722,324=>500,325=>722,326=>500,327=>722, -328=>500,329=>556,330=>722,331=>500,332=>722,333=>500,334=>722,335=>500,336=>722,337=>500, -340=>667,341=>333,342=>667,343=>333,344=>667,345=>333,346=>556,347=>389,348=>556,349=>389, -350=>556,351=>389,354=>611,355=>278,356=>611,357=>278,358=>611,359=>278,360=>722,361=>500, -362=>722,363=>500,364=>722,365=>500,366=>722,367=>500,368=>722,369=>500,370=>722,371=>500, -372=>944,373=>722,374=>722,375=>500,377=>611,378=>444,379=>611,380=>444,383=>333,384=>500, -385=>667,386=>576,387=>500,388=>646,389=>500,390=>667,391=>667,392=>444,393=>722,394=>722, -395=>646,396=>500,397=>534,398=>611,399=>722,400=>518,401=>556,403=>722,404=>665,405=>729, -406=>333,407=>333,408=>810,409=>500,410=>278,411=>480,412=>944,413=>722,414=>500,415=>726, -416=>722,417=>516,418=>1043,419=>778,420=>556,421=>500,422=>667,423=>556,424=>389,425=>627, -426=>592,427=>278,428=>611,429=>278,430=>611,431=>800,432=>518,433=>743,434=>722,435=>822, -436=>667,437=>611,438=>444,439=>530,440=>556,441=>389,442=>394,443=>500,444=>615,445=>439, -446=>421,447=>500,448=>200,449=>400,450=>600,451=>333,452=>1333,453=>1166,454=>944,455=>1000, -456=>889,457=>556,458=>1111,459=>1000,460=>778,461=>722,462=>444,463=>333,464=>278,465=>722, -466=>500,467=>722,468=>500,469=>722,470=>500,471=>722,472=>500,473=>722,474=>500,475=>722, -476=>500,477=>444,478=>722,479=>444,480=>722,481=>444,482=>889,483=>667,484=>722,485=>500, -486=>722,487=>500,488=>722,489=>500,490=>722,491=>500,492=>722,493=>500,494=>530,495=>389, -496=>278,497=>1333,498=>1166,499=>944,500=>722,501=>500,502=>944,503=>522,504=>722,505=>500, -506=>722,507=>444,508=>889,509=>667,510=>722,511=>500,512=>722,513=>444,514=>722,515=>444, -516=>611,517=>444,518=>611,519=>444,520=>333,521=>278,522=>333,523=>278,524=>722,525=>500, -526=>722,527=>500,528=>667,529=>333,530=>667,531=>333,532=>500,533=>500,534=>722,535=>500, -536=>556,537=>389,538=>611,539=>278,540=>424,541=>455,542=>722,543=>500,544=>715,545=>588, -546=>565,547=>468,548=>611,549=>444,550=>722,551=>444,552=>611,553=>444,554=>722,555=>500, -556=>722,557=>500,558=>722,559=>500,560=>722,561=>500,562=>722,563=>500,564=>407,565=>597, -566=>379,567=>278,568=>771,569=>760,570=>722,571=>667,572=>444,573=>611,574=>611,575=>389, -576=>444,577=>444,578=>444,579=>667,580=>722,581=>722,582=>611,583=>444,584=>389,585=>278, -586=>796,587=>590,588=>667,589=>333,590=>722,591=>500,592=>444,593=>500,594=>507,595=>500, -596=>444,597=>444,598=>500,599=>500,600=>444,601=>444,602=>722,603=>426,604=>426,605=>674, -606=>454,607=>278,608=>500,609=>500,610=>484,611=>500,612=>582,613=>500,614=>500,615=>500, -616=>278,617=>278,618=>278,619=>278,620=>278,621=>278,622=>556,623=>778,624=>778,625=>778, -626=>500,627=>500,628=>500,629=>491,630=>668,631=>693,632=>640,633=>333,634=>333,635=>333, -636=>333,637=>333,638=>333,639=>333,640=>446,641=>446,642=>389,643=>333,644=>500,645=>333, -646=>500,647=>278,648=>278,649=>500,650=>517,651=>514,652=>500,653=>722,654=>500,655=>510, -656=>524,657=>444,658=>389,659=>456,660=>444,661=>444,662=>444,663=>444,664=>722,665=>468, -666=>454,667=>665,668=>524,669=>347,670=>500,671=>443,672=>500,673=>444,674=>444,675=>798, -676=>795,677=>805,678=>554,679=>561,680=>678,681=>722,682=>554,683=>554,684=>500,685=>500, -686=>611,687=>611,688=>300,689=>300,690=>278,691=>278,692=>278,693=>309,694=>306,695=>432, -696=>310,697=>250,698=>408,699=>333,700=>333,701=>333,702=>333,703=>333,704=>258,705=>258, -706=>374,707=>374,708=>383,709=>383,711=>333,712=>250,713=>333,714=>333,715=>333,716=>250, -717=>333,718=>333,719=>333,720=>278,721=>278,722=>333,723=>333,724=>333,725=>333,726=>333, -727=>333,728=>333,729=>333,730=>333,731=>333,733=>382,734=>336,735=>352,736=>311,737=>200, -738=>243,739=>328,740=>300,741=>460,742=>460,743=>460,744=>460,745=>460,746=>477,747=>475, -748=>339,749=>333,750=>444,751=>383,752=>383,753=>294,754=>294,755=>327,756=>261,757=>437, -758=>437,759=>333,760=>278,761=>175,762=>175,763=>175,764=>175,765=>337,766=>337,767=>326, -768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0, -778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0, -788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0, -798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0, -808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0, -818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0, -828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0, -838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0, -848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0, -858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0, -868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0, -878=>0,879=>0,884=>199,885=>199,890=>332,894=>278,900=>267,901=>333,902=>722,903=>250, -904=>800,905=>902,906=>507,908=>818,910=>861,911=>871,912=>286,913=>722,914=>667,915=>586, -916=>660,917=>611,918=>611,919=>722,920=>726,921=>333,922=>722,923=>722,924=>889,925=>722, -926=>628,927=>722,928=>722,929=>556,931=>627,932=>611,933=>696,934=>742,935=>722,936=>808, -937=>743,938=>333,939=>718,940=>583,941=>426,942=>536,943=>286,944=>514,945=>583,946=>527, -947=>480,948=>534,949=>426,950=>466,951=>536,952=>534,953=>286,954=>544,955=>476,956=>536, -957=>480,958=>514,959=>500,960=>587,961=>528,962=>452,963=>537,964=>420,965=>514,966=>643, -967=>480,968=>693,969=>693,970=>286,971=>514,972=>500,973=>514,974=>693,976=>534,977=>587, -978=>620,979=>809,980=>620,981=>640,982=>684,983=>534,984=>556,985=>500,986=>594,987=>426, -988=>556,989=>445,990=>656,991=>400,992=>722,993=>570,994=>960,995=>673,996=>581,997=>429, -998=>560,999=>407,1000=>450,1001=>321,1002=>842,1003=>593,1004=>564,1005=>413,1006=>618,1007=>438, -1008=>534,1009=>534,1010=>485,1011=>278,1012=>726,1013=>361,1014=>361,1015=>576,1016=>542,1017=>667, -1018=>889,1019=>709,1020=>534,1021=>667,1022=>1000,1023=>1000,1024=>615,1025=>613,1026=>748,1027=>570, -1028=>659,1029=>487,1030=>329,1031=>329,1032=>381,1033=>943,1034=>985,1035=>827,1036=>669,1037=>723, -1038=>709,1039=>723,1040=>711,1041=>576,1042=>626,1043=>570,1044=>639,1045=>613,1046=>937,1047=>580, -1048=>723,1049=>723,1050=>669,1051=>684,1052=>891,1053=>723,1054=>722,1055=>723,1056=>576,1057=>659, -1058=>608,1059=>709,1060=>750,1061=>714,1062=>728,1063=>682,1064=>984,1065=>988,1066=>725,1067=>863, -1068=>576,1069=>659,1070=>966,1071=>648,1072=>434,1073=>495,1074=>468,1075=>386,1076=>488,1077=>436, -1078=>662,1079=>404,1080=>524,1081=>524,1082=>498,1083=>490,1084=>632,1085=>524,1086=>491,1087=>524, -1088=>500,1089=>422,1090=>422,1091=>471,1092=>694,1093=>482,1094=>522,1095=>506,1096=>756,1097=>754, -1098=>503,1099=>626,1100=>431,1101=>430,1102=>664,1103=>492,1104=>434,1105=>434,1106=>479,1107=>386, -1108=>430,1109=>347,1110=>269,1111=>278,1112=>278,1113=>677,1114=>711,1115=>514,1116=>498,1117=>524, -1118=>471,1119=>524,1120=>978,1121=>664,1122=>718,1123=>506,1124=>939,1125=>647,1126=>912,1127=>643, -1128=>1248,1129=>894,1130=>948,1131=>662,1132=>1299,1133=>911,1134=>516,1135=>391,1136=>870,1137=>694, -1138=>726,1139=>491,1140=>780,1141=>550,1142=>780,1143=>550,1144=>1207,1145=>946,1146=>877,1147=>611, -1148=>978,1149=>664,1150=>978,1151=>664,1152=>594,1153=>428,1154=>232,1155=>0,1156=>0,1157=>0, -1158=>0,1159=>0,1160=>0,1161=>0,1162=>715,1163=>522,1164=>562,1165=>430,1166=>556,1167=>511, -1168=>564,1169=>398,1170=>586,1171=>402,1172=>573,1173=>463,1174=>1001,1175=>688,1176=>580,1177=>414, -1178=>698,1179=>517,1180=>734,1181=>537,1182=>671,1183=>498,1184=>842,1185=>573,1186=>732,1187=>524, -1188=>926,1189=>652,1190=>1014,1191=>721,1192=>671,1193=>531,1194=>667,1195=>437,1196=>611,1197=>454, -1198=>722,1199=>563,1200=>722,1201=>562,1202=>783,1203=>517,1204=>967,1205=>693,1206=>691,1207=>510, -1208=>718,1209=>538,1210=>674,1211=>508,1212=>866,1213=>566,1214=>866,1215=>566,1216=>333,1217=>937, -1218=>662,1219=>626,1220=>446,1221=>702,1222=>489,1223=>722,1224=>497,1225=>823,1226=>545,1227=>674, -1228=>504,1229=>889,1230=>630,1231=>333,1232=>711,1233=>434,1234=>711,1235=>434,1236=>889,1237=>644, -1238=>613,1239=>449,1240=>722,1241=>449,1242=>722,1243=>449,1244=>937,1245=>662,1246=>580,1247=>404, -1248=>530,1249=>366,1250=>723,1251=>524,1252=>723,1253=>524,1254=>722,1255=>491,1256=>722,1257=>491, -1258=>722,1259=>491,1260=>659,1261=>430,1262=>709,1263=>471,1264=>709,1265=>471,1266=>709,1267=>471, -1268=>682,1269=>506,1270=>564,1271=>388,1272=>863,1273=>626,1274=>556,1275=>388,1276=>720,1277=>445, -1278=>722,1279=>495,1280=>556,1281=>504,1282=>900,1283=>634,1284=>553,1285=>471,1286=>803,1287=>518, -1288=>964,1289=>637,1290=>968,1291=>682,1292=>722,1293=>433,1294=>710,1295=>504,1296=>532,1297=>409, -1298=>702,1299=>489,1300=>960,1301=>644,1302=>823,1303=>702,1304=>961,1305=>766,1306=>722,1307=>504, -1308=>944,1309=>693,1310=>690,1311=>502,1312=>994,1313=>695,1314=>1011,1315=>727,1425=>0,1426=>0, -1427=>0,1428=>0,1429=>0,1430=>0,1431=>418,1432=>0,1433=>0,1434=>0,1435=>0,1436=>0, -1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0,1443=>0,1444=>0,1445=>0,1446=>0, -1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0,1453=>0,1454=>0,1455=>0,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>440,1471=>0,1472=>126,1473=>0,1474=>0,1475=>418,1476=>0, -1477=>0,1478=>350,1479=>0,1488=>537,1489=>537,1490=>350,1491=>537,1492=>537,1493=>350,1494=>350, -1495=>537,1496=>537,1497=>350,1498=>537,1499=>537,1500=>537,1501=>537,1502=>537,1503=>350,1504=>350, -1505=>537,1506=>537,1507=>537,1508=>537,1509=>537,1510=>537,1511=>537,1512=>537,1513=>537,1514=>537, -1520=>537,1521=>537,1522=>537,1523=>396,1524=>396,1548=>226,1563=>250,1567=>473,1569=>350,1570=>321, -1571=>249,1572=>399,1573=>249,1574=>776,1575=>249,1576=>950,1577=>424,1578=>925,1579=>924,1580=>738, -1581=>748,1582=>701,1583=>397,1584=>399,1585=>328,1586=>331,1587=>951,1588=>949,1589=>949,1590=>949, -1591=>557,1592=>550,1593=>625,1594=>602,1601=>801,1602=>696,1603=>757,1604=>655,1605=>549,1606=>651, -1607=>424,1608=>399,1609=>776,1610=>776,1611=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0, -1618=>0,1619=>0,1620=>0,1621=>0,1632=>297,1633=>254,1634=>427,1635=>497,1636=>440,1637=>465, -1638=>466,1639=>421,1640=>459,1641=>424,1643=>212,1652=>300,1662=>926,1670=>750,1688=>338,1711=>874, -1740=>776,1748=>176,1920=>450,1921=>501,1922=>582,1923=>544,1924=>482,1925=>433,1926=>448,1927=>462, -1928=>474,1929=>471,1930=>469,1931=>537,1932=>499,1933=>514,1934=>471,1935=>572,1936=>880,1937=>440, -1938=>476,1939=>594,1940=>469,1941=>448,1942=>441,1943=>519,1944=>573,1945=>459,1946=>447,1947=>496, -1948=>541,1949=>887,1950=>883,1951=>964,1952=>558,1953=>505,1954=>471,1955=>554,1956=>459,1957=>486, -1958=>36,1959=>36,1960=>43,1961=>45,1962=>43,1963=>45,1964=>45,1965=>45,1966=>45,1967=>45, -1968=>0,2305=>415,2306=>398,2307=>398,2309=>862,2310=>1042,2311=>553,2312=>553,2313=>597,2314=>848, -2315=>967,2316=>828,2317=>654,2319=>654,2321=>1042,2323=>1042,2324=>1042,2325=>743,2326=>798,2327=>694, -2328=>694,2329=>730,2330=>734,2331=>888,2332=>814,2333=>834,2334=>734,2335=>629,2336=>629,2337=>653, -2338=>609,2339=>694,2340=>654,2341=>694,2342=>588,2343=>694,2344=>654,2345=>654,2346=>615,2347=>788, -2348=>621,2349=>694,2350=>694,2351=>694,2352=>575,2353=>575,2354=>787,2355=>848,2356=>848,2357=>621, -2359=>615,2360=>734,2361=>609,2364=>398,2365=>569,2366=>341,2367=>341,2368=>341,2369=>0,2370=>0, -2371=>0,2372=>0,2373=>415,2375=>615,2376=>615,2377=>341,2379=>341,2380=>341,2381=>0,2384=>1047, -2392=>743,2393=>798,2394=>694,2395=>814,2396=>653,2397=>609,2398=>788,2400=>967,2401=>828,2402=>0, -2403=>0,2404=>398,2405=>478,2406=>455,2407=>420,2408=>569,2409=>509,2410=>702,2411=>629,2412=>569, -2413=>702,2414=>609,2415=>609,2416=>626,2433=>0,2434=>300,2435=>312,2437=>594,2438=>776,2439=>469, -2440=>513,2441=>535,2442=>561,2443=>604,2444=>481,2447=>580,2448=>604,2451=>540,2452=>620,2453=>570, -2454=>485,2455=>484,2456=>471,2457=>457,2458=>408,2459=>452,2460=>591,2461=>551,2462=>771,2463=>414, -2464=>404,2465=>522,2466=>415,2467=>450,2468=>551,2469=>477,2470=>478,2471=>449,2472=>448,2474=>535, -2475=>611,2476=>443,2477=>534,2478=>492,2479=>474,2480=>442,2482=>542,2486=>507,2487=>467,2488=>523, -2489=>419,2492=>0,2493=>419,2494=>202,2495=>189,2496=>202,2497=>0,2498=>0,2499=>0,2500=>0, -2503=>294,2504=>289,2507=>774,2508=>825,2509=>0,2510=>356,2519=>219,2524=>523,2525=>420,2527=>469, -2528=>604,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479,2537=>507,2538=>497,2539=>500, -2540=>482,2541=>503,2542=>517,2543=>481,2544=>443,2545=>443,2546=>429,2547=>383,2548=>432,2549=>478, -2550=>539,2551=>158,2552=>365,2553=>280,2554=>357,2561=>0,2562=>0,2563=>385,2565=>728,2566=>884, -2567=>656,2568=>656,2569=>580,2570=>580,2575=>482,2576=>728,2579=>580,2580=>728,2581=>534,2582=>518, -2583=>602,2584=>674,2585=>530,2586=>502,2587=>576,2588=>476,2589=>558,2590=>501,2591=>510,2592=>540, -2593=>508,2594=>512,2595=>558,2596=>468,2597=>518,2598=>488,2599=>518,2600=>522,2602=>518,2603=>490, -2604=>546,2605=>500,2606=>530,2607=>654,2608=>522,2610=>710,2611=>710,2613=>498,2614=>530,2616=>530, -2617=>501,2620=>286,2622=>156,2623=>174,2624=>174,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0, -2636=>0,2637=>0,2641=>0,2649=>534,2650=>618,2651=>492,2652=>484,2654=>506,2662=>616,2663=>480, -2664=>560,2665=>480,2666=>468,2667=>492,2668=>514,2669=>538,2670=>572,2671=>560,2672=>0,2673=>0, -2674=>498,2675=>596,2676=>900,2677=>0,2946=>345,2947=>616,2949=>910,2950=>1072,2951=>848,2952=>591, -2953=>492,2954=>1123,2958=>602,2959=>602,2960=>691,2962=>753,2963=>753,2964=>1597,2965=>677,2969=>697, -2970=>607,2972=>691,2974=>871,2975=>589,2979=>1230,2980=>688,2984=>560,2985=>911,2986=>477,2990=>625, -2991=>672,2992=>452,2993=>553,2994=>651,2995=>804,2996=>645,2997=>740,2999=>865,3000=>870,3001=>1067, -3006=>452,3007=>176,3008=>293,3009=>404,3010=>601,3014=>690,3015=>503,3016=>839,3018=>1188,3019=>982, -3020=>1519,3021=>234,3031=>804,3330=>417,3331=>221,3333=>1055,3334=>1195,3335=>792,3336=>1467,3337=>569, -3338=>1243,3339=>676,3340=>897,3342=>1008,3343=>1004,3344=>1538,3346=>585,3347=>981,3348=>1254,3349=>775, -3350=>798,3351=>691,3352=>1095,3353=>809,3354=>726,3355=>963,3356=>703,3357=>1244,3358=>1103,3359=>462, -3360=>531,3361=>983,3362=>1027,3363=>1102,3364=>779,3365=>731,3366=>485,3367=>737,3368=>747,3370=>779, -3371=>961,3372=>1023,3373=>500,3374=>510,3375=>792,3376=>527,3377=>511,3378=>713,3379=>553,3380=>516, -3381=>715,3382=>785,3383=>920,3384=>977,3385=>977,3389=>375,3390=>403,3391=>283,3392=>323,3393=>275, -3394=>258,3395=>378,3396=>378,3398=>542,3399=>478,3400=>1069,3402=>1127,3403=>1038,3404=>676,3405=>89, -3415=>676,3424=>676,3425=>1006,3430=>559,3431=>659,3432=>674,3433=>933,3434=>671,3435=>699,3436=>703, -3437=>688,3438=>677,3439=>684,3440=>375,3458=>355,3459=>241,3461=>501,3465=>591,3466=>613,3467=>630, -3473=>636,3476=>653,3481=>760,3482=>739,3483=>653,3484=>757,3486=>562,3488=>636,3489=>673,3490=>673, -3492=>984,3493=>984,3495=>636,3496=>653,3497=>653,3498=>653,3499=>1066,3501=>739,3502=>636,3503=>501, -3504=>653,3505=>739,3507=>501,3508=>673,3509=>636,3510=>653,3511=>739,3512=>636,3513=>653,3514=>673, -3515=>613,3517=>630,3520=>636,3521=>739,3522=>673,3523=>673,3524=>739,3525=>630,3526=>739,3530=>0, -3535=>328,3536=>288,3537=>319,3538=>0,3539=>0,3540=>0,3542=>0,3544=>380,3545=>495,3551=>492, -3585=>532,3586=>472,3587=>534,3588=>532,3589=>544,3590=>583,3591=>417,3592=>488,3593=>604,3594=>472, -3595=>534,3596=>716,3597=>717,3598=>568,3599=>568,3600=>457,3601=>637,3602=>731,3603=>790,3604=>531, -3605=>542,3606=>522,3607=>577,3608=>468,3609=>603,3610=>554,3611=>554,3612=>556,3613=>556,3614=>604, -3615=>604,3616=>568,3617=>542,3618=>496,3619=>442,3620=>530,3621=>512,3622=>568,3623=>478,3624=>543, -3625=>614,3626=>525,3627=>578,3628=>659,3629=>514,3630=>514,3631=>450,3632=>402,3633=>0,3634=>378, -3635=>415,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>620,3648=>286, -3649=>521,3650=>447,3651=>426,3652=>424,3653=>333,3654=>453,3655=>0,3656=>0,3657=>0,3658=>0, -3659=>0,3660=>0,3661=>0,3662=>0,3663=>657,3664=>528,3665=>528,3666=>571,3667=>594,3668=>631, -3669=>632,3670=>478,3671=>713,3672=>597,3673=>565,3674=>615,3675=>1381,4256=>453,4257=>448,4258=>546, -4259=>619,4260=>478,4261=>481,4262=>459,4263=>707,4264=>467,4265=>471,4266=>842,4267=>464,4268=>443, -4269=>707,4270=>460,4271=>465,4272=>686,4273=>440,4274=>550,4275=>561,4276=>580,4277=>467,4278=>630, -4279=>466,4280=>517,4281=>456,4282=>502,4283=>464,4284=>534,4285=>440,4286=>443,4287=>522,4288=>460, -4289=>463,4290=>536,4291=>455,4292=>468,4293=>449,4304=>454,4305=>452,4306=>544,4307=>629,4308=>451, -4309=>452,4310=>452,4311=>702,4312=>451,4313=>452,4314=>820,4315=>451,4316=>453,4317=>695,4318=>449, -4319=>448,4320=>694,4321=>501,4322=>544,4323=>517,4324=>560,4325=>450,4326=>627,4327=>452,4328=>491, -4329=>452,4330=>485,4331=>452,4332=>485,4333=>443,4334=>500,4335=>582,4336=>455,4337=>451,4338=>480, -4339=>414,4340=>453,4341=>418,4345=>528,4347=>410,4608=>583,4609=>770,4610=>560,4611=>525,4612=>525, -4613=>583,4614=>758,4616=>598,4617=>787,4618=>817,4619=>583,4620=>758,4621=>612,4622=>875,4623=>817, -4624=>817,4625=>1050,4626=>1050,4627=>817,4628=>1050,4629=>817,4630=>787,4631=>1021,4632=>933,4633=>1137, -4634=>1067,4635=>980,4636=>1065,4637=>962,4638=>962,4639=>1097,4640=>831,4641=>1021,4642=>851,4643=>735, -4644=>875,4645=>968,4646=>817,4647=>881,4648=>583,4649=>642,4650=>583,4651=>758,4652=>700,4653=>583, -4654=>700,4655=>758,4656=>583,4657=>787,4658=>787,4659=>583,4660=>729,4661=>583,4662=>583,4663=>817, -4664=>642,4665=>817,4666=>846,4667=>642,4668=>758,4669=>744,4670=>642,4671=>817,4672=>700,4673=>700, -4674=>700,4675=>758,4676=>700,4677=>700,4678=>729,4680=>846,4682=>1079,4683=>700,4684=>700,4685=>1021, -4688=>700,4689=>700,4690=>700,4691=>758,4692=>700,4693=>758,4694=>729,4696=>846,4698=>1079,4699=>700, -4700=>700,4701=>1021,4704=>525,4705=>758,4706=>758,4707=>525,4708=>700,4709=>773,4710=>525,4711=>787, -4712=>525,4713=>758,4714=>758,4715=>525,4716=>700,4717=>773,4718=>525,4719=>525,4720=>729,4721=>729, -4722=>729,4723=>802,4724=>729,4725=>729,4726=>758,4727=>729,4728=>758,4729=>758,4730=>758,4731=>817, -4732=>758,4733=>817,4734=>758,4735=>758,4736=>612,4737=>817,4738=>817,4739=>612,4740=>787,4741=>583, -4742=>875,4744=>962,4746=>992,4747=>700,4748=>758,4749=>904,4752=>408,4753=>583,4754=>525,4755=>554, -4756=>481,4757=>554,4758=>642,4759=>671,4760=>700,4761=>758,4762=>729,4763=>700,4764=>671,4765=>700, -4766=>758,4767=>700,4768=>583,4769=>735,4770=>822,4771=>583,4772=>793,4773=>583,4774=>583,4775=>694, -4776=>554,4777=>729,4778=>773,4779=>554,4780=>700,4781=>554,4782=>554,4784=>992,4786=>1021,4787=>671, -4788=>787,4789=>904,4792=>729,4793=>904,4794=>948,4795=>729,4796=>875,4797=>729,4798=>729,4800=>1137, -4802=>1167,4803=>758,4804=>875,4805=>1108,4808=>758,4809=>875,4810=>700,4811=>700,4812=>700,4813=>992, -4814=>758,4816=>554,4817=>787,4818=>758,4819=>583,4820=>758,4821=>496,4822=>612,4824=>525,4825=>700, -4826=>700,4827=>525,4828=>685,4829=>729,4830=>510,4831=>729,4832=>962,4833=>962,4834=>962,4835=>962, -4836=>962,4837=>1021,4838=>962,4839=>962,4840=>467,4841=>525,4842=>671,4843=>612,4844=>612,4845=>671, -4846=>671,4848=>612,4849=>875,4850=>817,4851=>642,4852=>729,4853=>729,4854=>758,4855=>817,4856=>700, -4857=>758,4858=>715,4859=>700,4860=>700,4861=>787,4862=>758,4863=>700,4864=>700,4865=>758,4866=>715, -4867=>700,4868=>700,4869=>787,4870=>758,4871=>700,4872=>467,4873=>671,4874=>671,4875=>612,4876=>612, -4877=>583,4878=>525,4880=>846,4882=>904,4883=>554,4884=>700,4885=>817,4888=>525,4889=>729,4890=>729, -4891=>612,4892=>671,4893=>583,4894=>525,4896=>817,4897=>1021,4898=>1021,4899=>817,4900=>992,4901=>758, -4902=>817,4903=>1021,4904=>1079,4905=>1137,4906=>1137,4907=>1050,4908=>1312,4909=>1050,4910=>1050,4911=>1123, -4912=>647,4913=>793,4914=>822,4915=>647,4916=>793,4917=>764,4918=>583,4919=>647,4920=>583,4921=>793, -4922=>822,4923=>583,4924=>793,4925=>764,4926=>583,4927=>793,4928=>540,4929=>758,4930=>583,4931=>467, -4932=>583,4933=>481,4934=>612,4936=>758,4937=>700,4938=>758,4939=>700,4940=>831,4941=>671,4942=>758, -4943=>700,4944=>758,4945=>758,4946=>758,4947=>817,4948=>758,4949=>758,4950=>817,4951=>758,4952=>642, -4953=>980,4954=>758,4961=>233,4962=>583,4963=>408,4964=>408,4965=>525,4966=>525,4967=>233,4968=>700, -4969=>671,4970=>612,4971=>642,4972=>642,4973=>642,4974=>583,4975=>700,4976=>758,4977=>642,4978=>583, -4979=>700,4980=>729,4981=>720,4982=>583,4983=>758,4984=>700,4985=>904,4986=>612,4987=>583,4988=>875, -5024=>711,5025=>678,5026=>604,5027=>667,5028=>796,5029=>301,5030=>516,5031=>544,5032=>457,5033=>716, -5034=>703,5035=>383,5036=>628,5037=>709,5038=>455,5039=>601,5040=>472,5041=>574,5042=>730,5043=>939, -5044=>498,5045=>528,5046=>667,5047=>891,5048=>505,5049=>792,5050=>957,5051=>725,5052=>595,5053=>733, -5054=>698,5055=>638,5056=>720,5057=>732,5058=>624,5059=>638,5060=>565,5061=>903,5062=>655,5063=>681, -5064=>675,5065=>949,5066=>683,5067=>547,5068=>693,5069=>732,5070=>529,5071=>569,5072=>536,5073=>677, -5074=>631,5075=>382,5076=>973,5077=>543,5078=>607,5079=>652,5080=>652,5081=>693,5082=>514,5083=>803, -5084=>658,5085=>597,5086=>627,5087=>659,5088=>679,5089=>706,5090=>563,5091=>618,5092=>767,5093=>776, -5094=>731,5095=>492,5096=>808,5097=>823,5098=>796,5099=>689,5100=>716,5101=>518,5102=>521,5103=>719, -5104=>563,5105=>776,5106=>634,5107=>822,5108=>621,5920=>502,5921=>502,5922=>500,5923=>498,5924=>500, -5925=>502,5926=>502,5927=>502,5928=>500,5929=>503,5930=>502,5931=>502,5932=>500,5933=>500,5934=>500, -5935=>796,5936=>500,5937=>502,5938=>0,5939=>0,5940=>0,5941=>230,5942=>397,6480=>537,6481=>537, -6482=>531,6483=>678,6484=>682,6485=>628,6486=>732,6487=>721,6488=>598,6489=>583,6490=>702,6491=>554, -6492=>683,6493=>554,6494=>710,6495=>695,6496=>523,6497=>678,6498=>589,6499=>272,6500=>506,6501=>515, -6502=>515,6503=>210,6504=>210,6505=>515,6506=>515,6507=>515,6508=>229,6509=>705,6512=>649,6513=>538, -6514=>568,6515=>520,6516=>544,6656=>820,6657=>958,6658=>758,6659=>859,6660=>958,6661=>727,6662=>904, -6663=>940,6664=>850,6665=>905,6666=>838,6667=>961,6668=>1000,6669=>880,6670=>1189,6671=>1246,6672=>1177, -6673=>757,6674=>1246,6675=>1192,6676=>709,6677=>1192,6678=>1075,6679=>0,6680=>0,6681=>534,6682=>690, -6683=>0,6686=>697,6687=>500,7424=>484,7425=>595,7426=>667,7427=>446,7428=>446,7429=>483,7430=>483, -7431=>409,7432=>426,7433=>278,7434=>260,7435=>483,7436=>409,7437=>595,7438=>483,7439=>483,7440=>426, -7441=>500,7442=>489,7443=>668,7444=>722,7445=>378,7448=>372,7449=>446,7450=>446,7451=>409,7452=>483, -7453=>488,7454=>660,7455=>500,7456=>483,7457=>632,7458=>409,7459=>355,7462=>392,7463=>483,7464=>483, -7465=>372,7466=>541,7467=>470,7468=>484,7469=>595,7470=>446,7471=>446,7472=>483,7473=>409,7474=>409, -7475=>483,7476=>483,7477=>223,7478=>260,7479=>483,7480=>409,7481=>595,7482=>483,7483=>483,7484=>483, -7485=>378,7486=>372,7487=>446,7488=>409,7489=>483,7490=>632,7491=>297,7492=>297,7493=>335,7494=>446, -7495=>335,7496=>335,7497=>297,7498=>297,7499=>285,7500=>285,7501=>335,7502=>186,7503=>335,7504=>521, -7505=>335,7506=>335,7507=>297,7510=>335,7511=>186,7512=>335,7513=>326,7514=>521,7515=>335,7517=>353, -7518=>321,7519=>357,7520=>430,7521=>321,7522=>186,7523=>223,7524=>335,7525=>335,7526=>353,7527=>321, -7528=>353,7529=>430,7530=>321,7531=>754,7532=>500,7533=>500,7534=>333,7535=>778,7536=>500,7537=>500, -7538=>333,7539=>333,7540=>389,7541=>278,7542=>444,7543=>500,7544=>483,7546=>774,7547=>217,7548=>278, -7549=>500,7550=>483,7551=>514,7552=>500,7553=>500,7554=>333,7555=>676,7556=>525,7557=>278,7558=>802, -7559=>507,7560=>500,7561=>333,7562=>389,7563=>384,7564=>500,7565=>500,7566=>444,7680=>722,7681=>444, -7682=>667,7683=>500,7684=>667,7685=>500,7686=>667,7687=>500,7688=>667,7689=>444,7690=>722,7691=>500, -7692=>722,7693=>500,7694=>722,7695=>500,7696=>720,7697=>500,7698=>722,7699=>500,7700=>611,7701=>444, -7702=>611,7703=>444,7704=>611,7705=>444,7706=>611,7707=>444,7708=>611,7709=>444,7710=>556,7711=>333, -7712=>722,7713=>500,7714=>722,7715=>500,7716=>722,7717=>500,7718=>722,7719=>500,7720=>722,7721=>500, -7722=>722,7723=>500,7724=>333,7725=>278,7726=>333,7727=>278,7728=>722,7729=>500,7730=>722,7731=>500, -7732=>722,7733=>500,7734=>611,7735=>278,7736=>611,7737=>278,7738=>611,7739=>278,7740=>611,7741=>278, -7742=>889,7743=>778,7744=>889,7745=>778,7746=>889,7747=>778,7748=>722,7749=>500,7750=>722,7751=>500, -7752=>722,7753=>500,7754=>722,7755=>500,7756=>722,7757=>500,7758=>722,7759=>500,7760=>722,7761=>500, -7762=>722,7763=>500,7764=>556,7765=>500,7766=>556,7767=>500,7768=>667,7769=>333,7770=>667,7771=>333, -7772=>667,7773=>333,7774=>667,7775=>333,7776=>556,7777=>389,7778=>556,7779=>389,7780=>556,7781=>389, -7782=>556,7783=>389,7784=>556,7785=>389,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611,7791=>278, -7792=>611,7793=>278,7794=>722,7795=>500,7796=>722,7797=>500,7798=>722,7799=>500,7800=>722,7801=>500, -7802=>722,7803=>500,7804=>722,7805=>500,7806=>722,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722, -7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>722,7819=>500,7820=>722,7821=>500, -7822=>722,7823=>500,7824=>611,7825=>444,7826=>611,7827=>444,7828=>611,7829=>444,7830=>500,7831=>278, -7832=>722,7833=>500,7834=>444,7835=>333,7840=>722,7841=>444,7842=>807,7843=>529,7844=>722,7845=>444, -7846=>722,7847=>444,7848=>722,7849=>454,7850=>722,7851=>444,7852=>722,7853=>444,7854=>722,7855=>444, -7856=>722,7857=>444,7858=>722,7859=>454,7860=>722,7861=>444,7862=>722,7863=>444,7864=>611,7865=>444, -7866=>611,7867=>444,7868=>611,7869=>444,7870=>611,7871=>444,7872=>611,7873=>444,7874=>613,7875=>444, -7876=>611,7877=>444,7878=>611,7879=>444,7880=>333,7881=>278,7882=>333,7883=>278,7884=>722,7885=>500, -7886=>722,7887=>500,7888=>722,7889=>500,7890=>722,7891=>500,7892=>722,7893=>500,7894=>722,7895=>500, -7896=>722,7897=>500,7898=>722,7899=>516,7900=>722,7901=>516,7902=>720,7903=>516,7904=>722,7905=>516, -7906=>722,7907=>516,7908=>722,7909=>500,7910=>717,7911=>500,7912=>800,7913=>518,7914=>800,7915=>518, -7916=>800,7917=>518,7918=>800,7919=>518,7920=>800,7921=>518,7922=>722,7923=>500,7924=>722,7925=>500, -7926=>722,7927=>501,7928=>722,7929=>500,7936=>583,7937=>583,7938=>583,7939=>583,7940=>583,7941=>583, -7942=>583,7943=>583,7944=>722,7945=>722,7946=>813,7947=>817,7948=>763,7949=>765,7950=>720,7951=>722, -7952=>426,7953=>426,7954=>426,7955=>426,7956=>426,7957=>426,7960=>770,7961=>770,7962=>902,7963=>919, -7964=>940,7965=>936,7968=>536,7969=>536,7970=>536,7971=>536,7972=>536,7973=>536,7974=>536,7975=>536, -7976=>847,7977=>859,7978=>986,7979=>1010,7980=>1026,7981=>1029,7982=>918,7983=>921,7984=>286,7985=>286, -7986=>302,7987=>320,7988=>300,7989=>306,7990=>312,7991=>303,7992=>475,7993=>507,7994=>617,7995=>654, -7996=>655,7997=>660,7998=>551,7999=>566,8000=>500,8001=>500,8002=>500,8003=>500,8004=>500,8005=>500, -8008=>816,8009=>825,8010=>969,8011=>995,8012=>938,8013=>955,8016=>514,8017=>514,8018=>514,8019=>514, -8020=>514,8021=>514,8022=>514,8023=>514,8025=>818,8027=>988,8029=>989,8031=>893,8032=>693,8033=>693, -8034=>693,8035=>693,8036=>693,8037=>693,8038=>693,8039=>693,8040=>836,8041=>843,8042=>1006,8043=>1024, -8044=>974,8045=>986,8046=>905,8047=>896,8048=>583,8049=>583,8050=>426,8051=>426,8052=>536,8053=>536, -8054=>286,8055=>286,8056=>500,8057=>500,8058=>514,8059=>514,8060=>693,8061=>693,8064=>583,8065=>583, -8066=>583,8067=>583,8068=>583,8069=>583,8070=>583,8071=>583,8072=>888,8073=>889,8074=>984,8075=>991, -8076=>943,8077=>948,8078=>884,8079=>886,8080=>536,8081=>536,8082=>536,8083=>536,8084=>536,8085=>536, -8086=>536,8087=>536,8088=>1017,8089=>1026,8090=>1153,8091=>1179,8092=>1195,8093=>1199,8094=>1088,8095=>1088, -8096=>693,8097=>693,8098=>693,8099=>693,8100=>693,8101=>693,8102=>693,8103=>693,8104=>1034,8105=>1040, -8106=>1210,8107=>1229,8108=>1176,8109=>1186,8110=>1098,8111=>1090,8112=>583,8113=>583,8114=>583,8115=>583, -8116=>583,8118=>583,8119=>583,8120=>722,8121=>722,8122=>722,8123=>722,8124=>889,8125=>250,8126=>332, -8127=>500,8128=>500,8129=>534,8130=>536,8131=>536,8132=>536,8134=>536,8135=>536,8136=>761,8137=>800, -8138=>829,8139=>893,8140=>883,8141=>500,8142=>500,8143=>500,8144=>286,8145=>286,8146=>286,8147=>286, -8150=>286,8151=>286,8152=>333,8153=>333,8154=>447,8155=>537,8157=>500,8158=>500,8159=>500,8160=>514, -8161=>514,8162=>514,8163=>514,8164=>528,8165=>528,8166=>514,8167=>514,8168=>696,8169=>696,8170=>816, -8171=>828,8172=>721,8173=>333,8174=>333,8175=>500,8178=>693,8179=>693,8180=>693,8182=>693,8183=>693, -8184=>832,8185=>899,8186=>847,8187=>852,8188=>928,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500, -8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250,8201=>200,8202=>100,8203=>0,8204=>0, -8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500,8213=>1000,8214=>293,8215=>478,8219=>250, -8223=>444,8227=>350,8228=>620,8229=>620,8231=>250,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0, -8237=>0,8238=>0,8239=>250,8241=>1363,8242=>247,8243=>411,8244=>611,8245=>220,8246=>440,8247=>660, -8248=>469,8251=>629,8252=>666,8253=>444,8254=>500,8255=>953,8256=>953,8257=>314,8258=>931,8259=>333, -8260=>167,8261=>383,8262=>383,8263=>888,8264=>777,8265=>777,8266=>500,8267=>453,8268=>453,8269=>450, -8270=>500,8271=>278,8272=>882,8273=>500,8274=>497,8275=>500,8276=>953,8277=>512,8278=>410,8279=>855, -8280=>620,8281=>620,8282=>179,8283=>621,8284=>564,8285=>179,8286=>179,8287=>111,8288=>0,8289=>0, -8290=>0,8291=>0,8292=>0,8304=>320,8305=>300,8308=>320,8309=>320,8310=>320,8311=>320,8312=>320, -8313=>320,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216,8319=>300,8320=>320,8321=>320,8322=>320, -8323=>320,8324=>320,8325=>320,8326=>320,8327=>320,8328=>320,8329=>320,8330=>300,8331=>300,8332=>300, -8333=>216,8334=>216,8336=>320,8337=>320,8338=>320,8339=>320,8340=>320,8352=>698,8353=>667,8354=>667, -8355=>556,8356=>500,8357=>778,8358=>722,8359=>940,8360=>1026,8361=>813,8362=>869,8363=>512,8365=>722, -8366=>611,8367=>1340,8368=>489,8369=>601,8370=>619,8371=>722,8372=>556,8373=>611,8400=>0,8401=>0, -8402=>0,8403=>0,8404=>0,8405=>0,8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0, -8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8418=>0,8419=>0,8420=>0,8421=>0, -8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0, -8432=>0,8448=>751,8449=>723,8450=>674,8451=>954,8452=>556,8453=>781,8454=>806,8455=>518,8456=>667, -8457=>822,8458=>490,8459=>824,8460=>663,8461=>818,8462=>500,8463=>500,8464=>578,8465=>613,8466=>715, -8467=>417,8468=>778,8469=>751,8470=>880,8471=>760,8472=>832,8473=>589,8474=>729,8475=>892,8476=>711, -8477=>755,8478=>667,8479=>667,8480=>879,8481=>1156,8483=>722,8484=>659,8485=>389,8486=>743,8487=>757, -8488=>663,8489=>286,8490=>722,8491=>722,8492=>846,8493=>613,8494=>533,8495=>363,8496=>587,8497=>690, -8498=>556,8499=>1021,8500=>387,8501=>537,8502=>537,8503=>350,8504=>537,8505=>417,8506=>906,8507=>1155, -8513=>663,8514=>485,8515=>485,8516=>637,8522=>516,8523=>778,8525=>899,8526=>500,8531=>750,8532=>750, -8533=>750,8534=>750,8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750,8541=>750,8542=>750, -8543=>750,8544=>333,8545=>630,8546=>927,8547=>1019,8548=>722,8549=>1019,8550=>1316,8551=>1629,8552=>1019, -8553=>722,8554=>1019,8555=>1316,8556=>611,8557=>667,8558=>722,8559=>889,8560=>278,8561=>556,8562=>834, -8563=>778,8564=>500,8565=>778,8566=>1056,8567=>1334,8568=>778,8569=>500,8570=>778,8571=>1056,8572=>278, -8573=>444,8574=>500,8575=>778,8592=>964,8593=>472,8594=>964,8595=>500,8596=>964,8597=>499,8598=>964, -8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8604=>1009,8605=>1009,8606=>964,8607=>500,8608=>964, -8609=>499,8610=>1093,8611=>1093,8612=>1093,8613=>500,8614=>1093,8615=>500,8616=>500,8617=>964,8618=>964, -8619=>964,8620=>964,8621=>1151,8622=>964,8624=>482,8625=>482,8626=>482,8627=>482,8628=>658,8629=>658, -8630=>1069,8631=>1069,8634=>939,8635=>939,8636=>964,8637=>964,8638=>499,8639=>499,8640=>964,8641=>964, -8642=>499,8643=>499,8644=>964,8645=>840,8646=>964,8647=>964,8648=>840,8649=>964,8650=>840,8651=>964, -8652=>964,8653=>964,8654=>964,8655=>964,8656=>964,8657=>550,8658=>964,8659=>550,8660=>964,8661=>550, -8662=>1047,8663=>1047,8664=>1047,8665=>1047,8666=>964,8667=>964,8668=>1092,8669=>1092,8672=>964,8674=>964, -8704=>587,8705=>716,8706=>494,8707=>587,8708=>587,8709=>746,8710=>612,8711=>612,8712=>536,8713=>536, -8714=>439,8715=>536,8716=>536,8717=>439,8718=>506,8719=>823,8720=>823,8721=>713,8722=>564,8723=>564, -8724=>564,8725=>636,8726=>636,8727=>471,8728=>497,8729=>497,8730=>549,8731=>549,8732=>549,8733=>636, -8734=>853,8735=>509,8736=>575,8737=>559,8738=>509,8739=>200,8740=>250,8741=>320,8742=>320,8743=>564, -8744=>564,8745=>654,8746=>654,8747=>416,8748=>750,8749=>1083,8750=>722,8751=>750,8752=>1083,8753=>697, -8754=>722,8755=>722,8756=>565,8757=>568,8758=>250,8759=>629,8760=>564,8761=>758,8762=>564,8763=>636, -8764=>636,8765=>636,8766=>503,8767=>614,8768=>636,8769=>636,8770=>636,8771=>636,8772=>636,8773=>636, -8774=>636,8775=>636,8776=>636,8777=>636,8778=>636,8779=>636,8780=>636,8781=>636,8782=>636,8783=>636, -8784=>564,8785=>564,8786=>564,8787=>564,8788=>735,8789=>755,8790=>564,8791=>564,8792=>564,8793=>564, -8794=>564,8795=>564,8796=>600,8797=>564,8798=>564,8799=>564,8800=>564,8801=>636,8802=>636,8803=>636, -8804=>636,8805=>636,8806=>636,8807=>636,8808=>636,8809=>636,8810=>900,8811=>899,8812=>410,8813=>636, -8814=>636,8815=>636,8816=>636,8817=>636,8818=>636,8819=>636,8820=>636,8821=>636,8822=>636,8823=>636, -8824=>636,8825=>636,8826=>636,8827=>636,8828=>636,8829=>636,8830=>636,8831=>636,8832=>636,8833=>636, -8834=>636,8835=>636,8836=>636,8837=>636,8838=>636,8839=>636,8840=>636,8841=>636,8842=>636,8843=>636, -8844=>654,8845=>654,8846=>654,8847=>636,8848=>636,8849=>636,8850=>636,8851=>636,8852=>636,8853=>636, -8854=>636,8855=>636,8856=>636,8857=>636,8858=>636,8859=>636,8860=>636,8861=>636,8862=>636,8863=>636, -8864=>636,8865=>636,8866=>600,8867=>600,8868=>712,8869=>712,8870=>466,8871=>466,8872=>595,8873=>588, -8874=>710,8875=>706,8876=>595,8877=>596,8878=>588,8879=>706,8880=>636,8881=>636,8882=>636,8883=>636, -8884=>636,8885=>636,8886=>1296,8887=>1296,8888=>966,8889=>564,8890=>626,8891=>564,8892=>564,8893=>566, -8894=>570,8895=>582,8896=>744,8897=>744,8898=>764,8899=>764,8900=>512,8901=>250,8902=>471,8903=>629, -8904=>636,8905=>636,8906=>636,8907=>816,8908=>816,8909=>636,8910=>636,8911=>636,8912=>636,8913=>636, -8914=>654,8915=>654,8916=>654,8917=>636,8918=>564,8919=>564,8920=>1215,8921=>1215,8922=>636,8923=>636, -8924=>636,8925=>636,8926=>636,8927=>636,8928=>636,8929=>636,8930=>636,8931=>636,8932=>636,8933=>636, -8934=>636,8935=>636,8936=>636,8937=>636,8938=>636,8939=>636,8940=>636,8941=>636,8942=>250,8943=>1000, -8944=>1000,8945=>1000,8946=>601,8947=>536,8948=>464,8949=>536,8950=>536,8951=>464,8952=>536,8953=>536, -8954=>601,8955=>536,8956=>464,8957=>536,8958=>464,8959=>600,8960=>780,8961=>442,8962=>794,8968=>474, -8969=>474,8970=>474,8971=>474,8976=>564,8977=>503,8978=>791,8979=>791,8980=>593,8981=>560,8982=>563, -8983=>563,8984=>800,8985=>564,8986=>805,8988=>474,8989=>474,8990=>474,8991=>474,8992=>686,8993=>686, -8994=>658,8995=>658,8996=>800,9000=>800,9001=>329,9002=>329,9031=>777,9032=>777,9040=>777,9047=>777, -9054=>777,9088=>800,9089=>800,9090=>800,9091=>800,9094=>800,9095=>800,9096=>800,9097=>800,9098=>800, -9100=>800,9103=>788,9104=>788,9105=>788,9106=>788,9108=>800,9109=>800,9110=>800,9111=>800,9112=>800, -9113=>800,9114=>800,9115=>384,9116=>384,9117=>384,9118=>384,9119=>384,9120=>384,9121=>388,9122=>388, -9123=>388,9124=>388,9125=>388,9126=>388,9127=>494,9128=>494,9129=>494,9130=>494,9131=>494,9132=>494, -9133=>494,9134=>686,9138=>1287,9139=>1287,9140=>860,9141=>861,9166=>800,9167=>800,9180=>896,9181=>896, -9182=>903,9183=>904,9184=>910,9185=>910,9186=>761,9187=>910,9189=>942,9190=>817,9251=>500,9312=>788, -9313=>788,9314=>788,9315=>788,9316=>788,9317=>788,9318=>788,9319=>788,9320=>788,9321=>788,9472=>889, -9473=>889,9474=>889,9475=>889,9484=>889,9485=>889,9486=>889,9487=>889,9488=>889,9489=>889,9490=>889, -9491=>889,9492=>889,9493=>889,9494=>889,9495=>889,9496=>889,9497=>889,9498=>889,9499=>889,9500=>889, -9501=>889,9502=>889,9503=>889,9504=>889,9505=>889,9506=>889,9507=>889,9508=>889,9509=>889,9510=>889, -9511=>889,9512=>889,9513=>889,9514=>889,9515=>889,9516=>889,9517=>889,9518=>889,9519=>889,9520=>889, -9521=>889,9522=>889,9523=>889,9524=>889,9525=>889,9526=>889,9527=>889,9528=>889,9529=>889,9530=>889, -9531=>889,9532=>889,9533=>889,9534=>889,9535=>889,9536=>889,9537=>889,9538=>889,9539=>889,9540=>889, -9541=>889,9542=>889,9543=>889,9544=>889,9545=>889,9546=>889,9547=>889,9552=>889,9553=>889,9554=>889, -9555=>889,9556=>889,9557=>889,9558=>889,9559=>889,9560=>889,9561=>889,9562=>889,9563=>889,9564=>889, -9565=>889,9566=>889,9567=>889,9568=>889,9569=>889,9570=>889,9571=>889,9572=>889,9573=>889,9574=>889, -9575=>889,9576=>889,9577=>889,9578=>889,9579=>889,9580=>889,9581=>889,9582=>889,9583=>889,9584=>889, -9585=>889,9586=>889,9587=>889,9588=>889,9589=>889,9590=>889,9591=>889,9592=>889,9593=>889,9594=>889, -9595=>889,9596=>600,9597=>889,9598=>600,9599=>889,9600=>761,9601=>761,9602=>761,9603=>761,9604=>761, -9605=>761,9606=>761,9607=>761,9608=>761,9609=>761,9610=>761,9611=>761,9612=>761,9613=>761,9614=>761, -9615=>761,9616=>761,9617=>1000,9619=>1000,9620=>761,9621=>761,9622=>761,9623=>761,9624=>761,9625=>761, -9626=>761,9627=>761,9628=>761,9629=>761,9630=>761,9631=>761,9632=>761,9633=>761,9634=>761,9635=>761, -9636=>761,9637=>761,9638=>761,9639=>761,9640=>761,9641=>761,9642=>532,9643=>532,9644=>761,9645=>761, -9646=>761,9647=>761,9648=>761,9649=>761,9650=>892,9651=>892,9652=>446,9653=>446,9654=>892,9655=>892, -9656=>446,9657=>446,9658=>892,9659=>892,9660=>892,9661=>892,9662=>446,9663=>446,9664=>892,9665=>892, -9666=>446,9667=>446,9668=>892,9669=>892,9670=>788,9671=>788,9672=>788,9673=>791,9674=>494,9675=>791, -9676=>791,9677=>785,9678=>791,9679=>791,9680=>791,9681=>791,9682=>791,9683=>791,9684=>791,9685=>791, -9686=>791,9687=>791,9688=>761,9689=>761,9690=>761,9691=>761,9692=>791,9693=>791,9694=>791,9695=>791, -9696=>791,9697=>791,9698=>761,9699=>761,9700=>761,9701=>761,9702=>791,9703=>761,9704=>761,9705=>761, -9706=>761,9707=>761,9708=>892,9709=>892,9710=>892,9711=>851,9712=>761,9713=>761,9714=>761,9715=>761, -9716=>791,9717=>791,9718=>791,9719=>791,9720=>761,9721=>761,9722=>761,9723=>761,9724=>761,9725=>570, -9726=>570,9727=>761,9728=>800,9729=>800,9730=>748,9731=>800,9732=>800,9733=>811,9734=>816,9735=>468, -9736=>677,9737=>724,9738=>944,9739=>944,9740=>686,9741=>944,9742=>715,9743=>715,9744=>757,9745=>755, -9746=>755,9747=>756,9748=>800,9749=>837,9750=>719,9751=>719,9752=>782,9753=>822,9754=>954,9755=>954, -9756=>933,9757=>489,9758=>933,9759=>489,9760=>517,9761=>660,9762=>724,9763=>732,9764=>886,9765=>577, -9766=>489,9767=>563,9768=>490,9769=>770,9770=>725,9771=>860,9772=>668,9773=>753,9774=>724,9775=>730, -9776=>600,9777=>600,9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600,9784=>730,9785=>724, -9786=>724,9787=>724,9788=>799,9789=>659,9790=>659,9791=>495,9792=>495,9793=>495,9794=>686,9795=>661, -9796=>544,9797=>608,9798=>605,9799=>545,9800=>804,9801=>583,9802=>796,9803=>1006,9804=>825,9805=>1189, -9806=>1144,9807=>1189,9808=>683,9809=>808,9810=>1146,9811=>797,9812=>758,9813=>757,9814=>758,9815=>758, -9816=>758,9817=>758,9818=>758,9819=>758,9820=>758,9821=>758,9822=>758,9823=>758,9824=>770,9825=>770, -9826=>770,9827=>770,9828=>770,9829=>770,9830=>770,9831=>770,9832=>895,9833=>333,9834=>555,9835=>722, -9836=>722,9837=>415,9838=>377,9839=>402,9840=>642,9841=>655,9842=>869,9843=>905,9844=>905,9845=>905, -9846=>905,9847=>905,9848=>905,9849=>905,9850=>905,9851=>1016,9852=>1064,9853=>1064,9854=>954,9855=>606, -9856=>522,9857=>522,9858=>522,9859=>522,9860=>522,9861=>522,9862=>845,9863=>844,9864=>844,9865=>844, -9866=>748,9867=>748,9868=>748,9869=>748,9870=>748,9871=>748,9872=>726,9873=>726,9874=>963,9875=>770, -9876=>1038,9877=>388,9878=>997,9879=>787,9880=>508,9881=>809,9882=>1014,9883=>859,9884=>818,9885=>972, -9888=>1000,9889=>546,9890=>784,9891=>786,9892=>738,9893=>542,9894=>601,9895=>700,9896=>511,9897=>861, -9898=>611,9899=>611,9900=>544,9901=>782,9902=>1025,9903=>1141,9904=>1000,9905=>513,9906=>510,9907=>642, -9908=>722,9909=>719,9910=>777,9911=>495,9912=>602,9913=>836,9914=>666,9915=>666,9916=>691,9920=>689, -9921=>689,9922=>689,9923=>689,9985=>974,9986=>961,9987=>974,9988=>980,9990=>789,9991=>790,9992=>791, -9993=>690,9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846, -10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759,10012=>754,10013=>494,10014=>552, -10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10025=>823, -10026=>789,10027=>841,10028=>823,10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749, -10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708,10045=>682, -10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786, -10056=>787,10057=>713,10058=>791,10059=>785,10061=>873,10063=>762,10064=>762,10065=>759,10066=>759,10070=>784, -10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10081=>732,10082=>544,10083=>544, -10084=>910,10085=>667,10086=>760,10087=>760,10088=>390,10089=>390,10090=>317,10091=>317,10092=>276,10093=>276, -10094=>509,10095=>509,10096=>410,10097=>410,10098=>234,10099=>234,10100=>334,10101=>334,10102=>788,10103=>788, -10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788, -10114=>788,10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788, -10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788,10131=>788,10132=>894,10136=>748, -10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924, -10147=>924,10148=>917,10149=>930,10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867, -10157=>696,10158=>696,10159=>874,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771,10167=>888, -10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,10214=>545,10215=>545,10216=>329, -10217=>329,10218=>496,10219=>496,10229=>1000,10230=>1000,10231=>1000,10232=>1000,10233=>1000,10234=>1000,10235=>1000, -10236=>1000,10752=>860,10753=>860,10754=>860,10755=>766,10756=>766,10757=>756,10758=>756,10761=>745,10781=>702, -10815=>722,11008=>1000,11009=>1000,11010=>1000,11011=>1000,11012=>1222,11013=>1000,11014=>1000,11015=>1000,11016=>1000, -11017=>1000,11018=>1000,11019=>1000,11020=>1244,11021=>1000,11026=>770,11027=>770,11028=>770,11029=>770,11030=>770, -11031=>770,11032=>770,11033=>770,11034=>770,11035=>1000,11036=>1000,11037=>283,11038=>283,11039=>846,11040=>846, -11041=>799,11042=>799,11043=>807,11044=>1000,11045=>461,11046=>461,11047=>461,11048=>461,11049=>360,11050=>360, -11051=>283,11052=>854,11053=>854,11054=>628,11055=>628,11088=>589,11089=>443,11090=>443,11091=>802,11092=>803, -11392=>677,11393=>463,11394=>532,11395=>381,11396=>615,11397=>438,11398=>969,11399=>660,11400=>647,11401=>440, -11402=>593,11403=>402,11404=>573,11405=>407,11406=>698,11407=>512,11408=>726,11409=>493,11410=>267,11411=>201, -11412=>610,11413=>433,11414=>654,11415=>468,11416=>735,11417=>536,11418=>698,11419=>511,11420=>555,11421=>378, -11422=>722,11423=>489,11424=>724,11425=>528,11426=>517,11427=>388,11428=>647,11429=>438,11430=>615,11431=>436, -11432=>651,11433=>462,11434=>762,11435=>538,11436=>654,11437=>461,11438=>635,11439=>461,11440=>964,11441=>677, -11456=>689,11457=>464,11493=>499,11494=>496,11495=>986,11496=>466,11497=>444,11498=>934,11517=>256,11518=>617, -11519=>287,11799=>333,42560=>611,42561=>444,42562=>611,42563=>444,42564=>556,42565=>389,42566=>368,42567=>286, -42572=>1145,42573=>775,42576=>1016,42577=>736,42578=>915,42579=>684,42580=>966,42581=>664,42582=>1042,42583=>648, -42584=>722,42585=>491,42588=>1042,42589=>648,42590=>780,42591=>550,42594=>911,42595=>633,42596=>957,42597=>635, -42598=>1139,42599=>777,42607=>0,42608=>0,42609=>0,42610=>0,42611=>519,42620=>0,42622=>510,64256=>589, -64257=>534,64258=>530,64259=>805,64260=>799,64262=>677,64285=>350,64286=>0,64287=>537,64288=>537,64297=>564, -64298=>537,64299=>537,64300=>537,64301=>537,64302=>537,64303=>537,64304=>537,64305=>537,64306=>350,64307=>537, -64308=>537,64309=>350,64310=>350,64312=>537,64313=>350,64314=>537,64315=>537,64316=>537,64318=>537,64320=>350, -64321=>537,64323=>537,64324=>537,64326=>537,64327=>537,64328=>537,64329=>537,64330=>537,64331=>350,64332=>537, -64333=>537,64334=>537,64335=>537,64342=>926,64343=>926,64344=>308,64345=>308,64378=>750,64379=>750,64380=>580, -64381=>580,64394=>338,64395=>338,64402=>874,64403=>874,64404=>329,64405=>329,64508=>776,64509=>700,64510=>304, -64511=>304,65010=>640,65020=>837,65136=>300,65140=>300,65142=>300,65144=>300,65146=>300,65148=>300,65152=>724, -65153=>321,65154=>275,65155=>249,65156=>275,65157=>399,65158=>399,65159=>249,65160=>275,65161=>776,65162=>776, -65163=>301,65164=>264,65165=>249,65166=>275,65167=>950,65168=>950,65169=>293,65170=>293,65171=>424,65172=>622, -65173=>925,65174=>925,65175=>308,65176=>308,65177=>924,65178=>924,65179=>298,65180=>298,65181=>738,65182=>738, -65183=>574,65184=>574,65185=>748,65186=>750,65187=>600,65188=>600,65189=>701,65190=>775,65191=>596,65192=>596, -65193=>397,65194=>397,65195=>399,65196=>399,65197=>328,65198=>328,65199=>331,65200=>331,65201=>951,65202=>951, -65203=>600,65204=>600,65205=>949,65206=>949,65207=>649,65208=>649,65209=>949,65210=>949,65211=>823,65212=>823, -65213=>949,65214=>949,65215=>805,65216=>805,65217=>557,65218=>557,65219=>460,65220=>460,65221=>550,65222=>550, -65223=>455,65224=>550,65225=>625,65226=>575,65227=>674,65228=>550,65229=>602,65230=>577,65231=>578,65232=>577, -65233=>801,65234=>801,65235=>300,65236=>300,65237=>696,65238=>696,65239=>650,65240=>650,65241=>757,65242=>757, -65243=>318,65244=>318,65245=>655,65246=>655,65247=>206,65248=>206,65249=>549,65250=>549,65251=>403,65252=>403, -65253=>651,65254=>651,65255=>323,65256=>323,65257=>424,65258=>622,65259=>525,65260=>476,65261=>399,65262=>399, -65263=>776,65264=>776,65265=>776,65266=>776,65267=>296,65268=>264,65269=>676,65270=>724,65271=>676,65272=>724, -65273=>676,65274=>724,65275=>676,65276=>724,65279=>0,65533=>788); -$enc=''; -$diff=''; -$file='freeserif.z'; -$ctg='freeserif.ctg.z'; -$originalsize=1483772; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.z b/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.z deleted file mode 100644 index 67f60970..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freeserif.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.ctg.z deleted file mode 100644 index 77bfed16..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.php b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.php deleted file mode 100644 index 37006e9d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.php +++ /dev/null @@ -1,282 +0,0 @@ -900,'Descent'=>-300,'CapHeight'=>16,'Flags'=>32,'FontBBox'=>'[-796 -306 1860 932]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); -$up=-125; -$ut=50; -$dw=600; -$cw=array( -32=>250,33=>333,34=>555,35=>500,36=>500,37=>1000,38=>833,39=>278,40=>333,41=>333, -42=>507,43=>676,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500, -52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>676,61=>676, -62=>676,63=>500,64=>930,65=>722,66=>667,67=>722,68=>724,69=>667,70=>611,71=>778, -72=>774,73=>386,74=>500,75=>764,76=>664,77=>943,78=>722,79=>778,80=>611,81=>778, -82=>712,83=>556,84=>667,85=>722,86=>722,87=>1000,88=>722,89=>722,90=>667,91=>333, -92=>278,93=>333,94=>581,95=>500,96=>333,97=>500,98=>556,99=>444,100=>556,101=>444, -102=>333,103=>500,104=>556,105=>278,106=>333,107=>556,108=>278,109=>833,110=>556,111=>500, -112=>556,113=>556,114=>444,115=>389,116=>333,117=>556,118=>500,119=>722,120=>500,121=>500, -122=>444,123=>394,124=>220,125=>394,126=>520,8364=>761,8218=>250,402=>333,8222=>500,8230=>1000, -8224=>500,8225=>500,710=>333,8240=>1000,352=>556,8249=>333,338=>1000,381=>667,8216=>250,8217=>250, -8220=>500,8221=>500,8226=>524,8211=>500,8212=>1000,732=>333,8482=>1000,353=>389,8250=>333,339=>722, -382=>444,376=>722,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500, -168=>333,169=>747,170=>300,171=>500,172=>680,173=>333,174=>747,175=>333,176=>400,177=>676, -178=>300,179=>300,180=>333,181=>556,182=>540,183=>250,184=>333,185=>270,186=>330,187=>500, -188=>750,189=>750,190=>750,191=>500,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722, -198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>676,216=>778,217=>722, -218=>722,219=>722,220=>722,221=>722,222=>632,223=>556,224=>500,225=>500,226=>500,227=>500, -228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278, -238=>278,239=>278,240=>500,241=>556,242=>500,243=>500,244=>500,245=>500,246=>500,247=>676, -248=>500,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>722,257=>500, -258=>722,259=>500,260=>722,261=>500,262=>722,263=>444,264=>722,265=>444,266=>722,267=>444, -268=>722,269=>444,270=>722,271=>616,272=>722,273=>556,274=>667,275=>444,276=>667,277=>444, -278=>667,279=>444,280=>667,281=>444,282=>667,283=>444,284=>778,285=>500,286=>778,287=>500, -288=>778,289=>500,290=>778,291=>500,292=>778,293=>556,294=>778,295=>556,296=>389,297=>278, -298=>389,299=>278,300=>389,301=>278,302=>389,303=>278,304=>389,305=>278,306=>882,307=>486, -308=>500,309=>338,310=>778,311=>556,312=>534,313=>667,314=>278,315=>667,316=>278,317=>667, -318=>398,319=>667,320=>528,321=>667,322=>278,323=>722,324=>556,325=>722,326=>556,327=>722, -328=>556,329=>556,330=>722,331=>556,332=>778,333=>500,334=>778,335=>500,336=>778,337=>500, -340=>722,341=>444,342=>722,343=>444,344=>722,345=>444,346=>556,347=>389,348=>556,349=>389, -350=>556,351=>389,354=>667,355=>333,356=>667,357=>449,358=>667,359=>333,360=>722,361=>556, -362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556, -372=>1000,373=>722,374=>722,375=>500,377=>667,378=>444,379=>667,380=>444,383=>333,384=>556, -385=>805,386=>648,387=>556,388=>667,389=>556,390=>722,391=>915,392=>605,393=>722,394=>862, -395=>667,396=>556,397=>550,398=>667,399=>778,400=>631,401=>611,403=>903,404=>776,405=>807, -406=>327,407=>389,408=>887,409=>556,410=>278,411=>495,412=>1000,413=>864,414=>556,415=>778, -416=>778,417=>550,418=>1192,419=>795,420=>749,421=>556,422=>748,423=>556,424=>389,425=>650, -426=>465,427=>333,428=>667,429=>333,430=>667,431=>839,432=>629,433=>811,434=>685,435=>853, -436=>705,437=>667,438=>444,439=>593,440=>654,441=>508,442=>500,443=>500,444=>654,445=>520, -446=>444,447=>611,448=>220,449=>418,450=>570,451=>333,452=>1391,453=>1168,454=>1000,455=>1164, -456=>997,457=>611,458=>1222,459=>1055,460=>889,461=>722,462=>500,463=>386,464=>278,465=>778, -466=>500,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722, -476=>556,477=>444,478=>722,479=>500,480=>722,481=>500,482=>1000,483=>722,484=>778,485=>500, -486=>778,487=>500,488=>764,489=>556,490=>778,491=>500,492=>778,493=>500,494=>593,495=>502, -496=>338,497=>1391,498=>1168,499=>1000,500=>778,501=>500,502=>995,503=>603,504=>722,505=>556, -506=>722,507=>500,508=>1000,509=>722,510=>778,511=>500,512=>722,513=>500,514=>722,515=>500, -516=>667,517=>444,518=>667,519=>444,520=>386,521=>278,522=>386,523=>278,524=>778,525=>500, -526=>778,527=>500,528=>712,529=>444,530=>712,531=>444,532=>722,533=>556,534=>722,535=>556, -536=>556,537=>389,538=>667,539=>333,540=>464,541=>455,542=>774,543=>556,544=>731,545=>649, -546=>568,547=>494,548=>667,549=>444,550=>722,551=>500,552=>667,553=>444,554=>778,555=>500, -556=>778,557=>500,558=>778,559=>500,560=>778,561=>500,562=>722,563=>500,564=>437,565=>636, -566=>415,567=>338,568=>776,569=>760,570=>722,571=>722,572=>444,573=>664,574=>667,575=>389, -576=>451,577=>505,578=>479,579=>686,580=>750,581=>722,582=>667,583=>478,584=>500,585=>333, -586=>808,587=>608,588=>712,589=>444,590=>757,591=>500,592=>500,593=>523,594=>523,595=>556, -596=>444,598=>556,599=>556,600=>444,601=>444,602=>611,603=>440,604=>440,605=>611,607=>333, -608=>500,609=>500,610=>556,613=>556,614=>556,615=>556,616=>278,617=>333,618=>278,619=>278, -621=>278,622=>667,623=>833,624=>833,625=>833,626=>556,627=>556,628=>556,629=>500,631=>715, -632=>667,633=>444,634=>444,635=>444,636=>444,637=>444,638=>394,639=>394,640=>556,641=>556, -642=>389,643=>333,644=>333,645=>433,647=>333,648=>333,649=>500,650=>557,651=>529,652=>500, -653=>722,654=>500,655=>500,656=>444,658=>502,660=>500,661=>500,662=>500,664=>778,665=>510, -667=>722,668=>556,670=>556,671=>444,672=>556,673=>500,674=>500,686=>611,687=>722,697=>250, -698=>408,699=>250,700=>250,701=>250,702=>300,703=>300,706=>333,707=>333,708=>333,709=>333, -711=>333,712=>333,713=>333,714=>333,715=>333,716=>300,717=>333,718=>333,719=>333,720=>278, -721=>278,722=>300,723=>300,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333, -731=>333,733=>400,734=>333,735=>352,741=>526,742=>526,743=>526,744=>526,745=>526,746=>519, -747=>519,748=>333,749=>333,750=>480,751=>333,752=>333,753=>333,754=>333,755=>327,756=>261, -757=>437,758=>437,759=>400,760=>278,761=>175,762=>175,763=>175,764=>175,765=>333,766=>337, -767=>432,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0, -777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0, -787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0, -797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0, -807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0, -817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0, -827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0, -837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0, -847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0, -857=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,884=>199,885=>199, -890=>0,894=>333,900=>330,901=>415,902=>722,903=>250,904=>811,905=>938,906=>556,908=>840, -910=>886,911=>879,912=>330,913=>722,914=>667,915=>611,916=>759,917=>667,918=>667,919=>774, -920=>778,921=>386,922=>777,923=>722,924=>943,925=>722,926=>650,927=>778,928=>812,929=>611, -931=>650,932=>667,933=>738,934=>868,935=>722,936=>924,937=>811,938=>386,939=>738,940=>605, -941=>440,942=>605,943=>330,944=>550,945=>605,946=>550,947=>550,948=>550,949=>440,950=>495, -951=>605,952=>550,953=>330,954=>608,955=>495,956=>605,957=>495,958=>495,959=>550,960=>605, -961=>550,962=>440,963=>550,964=>440,965=>550,966=>660,967=>495,968=>715,969=>715,970=>330, -971=>550,972=>550,973=>550,974=>715,976=>550,977=>605,978=>722,979=>871,980=>722,981=>660, -982=>715,983=>550,984=>611,985=>550,986=>650,987=>514,988=>611,989=>513,990=>715,991=>439, -992=>722,993=>605,1008=>550,1009=>550,1010=>477,1011=>333,1012=>778,1013=>424,1014=>424,1015=>632, -1016=>575,1017=>722,1018=>943,1019=>809,1020=>550,1021=>722,1022=>722,1023=>722,1024=>667,1025=>667, -1026=>848,1027=>611,1028=>722,1029=>556,1030=>386,1031=>386,1032=>500,1033=>1042,1034=>1032,1035=>912, -1036=>770,1037=>774,1038=>738,1039=>778,1040=>722,1041=>648,1042=>667,1043=>599,1044=>708,1045=>667, -1046=>1106,1047=>652,1048=>774,1049=>774,1050=>770,1051=>788,1052=>943,1053=>774,1054=>778,1055=>812, -1056=>611,1057=>722,1058=>667,1059=>738,1060=>868,1061=>722,1062=>774,1063=>754,1064=>1115,1065=>1115, -1066=>782,1067=>970,1068=>630,1069=>722,1070=>1114,1071=>729,1072=>500,1073=>500,1074=>510,1075=>430, -1076=>545,1077=>438,1078=>781,1079=>445,1080=>556,1081=>556,1082=>556,1083=>542,1084=>668,1085=>558, -1086=>500,1087=>558,1088=>549,1089=>444,1090=>494,1091=>486,1092=>809,1093=>500,1094=>560,1095=>556, -1096=>818,1097=>820,1098=>612,1099=>756,1100=>512,1101=>496,1102=>770,1103=>546,1104=>438,1105=>444, -1106=>549,1107=>430,1108=>488,1109=>386,1110=>272,1111=>278,1112=>333,1113=>784,1114=>786,1115=>552, -1116=>556,1117=>556,1118=>484,1119=>556,1120=>1018,1121=>699,1122=>781,1123=>612,1124=>1033,1125=>778, -1126=>993,1127=>692,1128=>1371,1129=>975,1130=>1106,1131=>781,1132=>1474,1133=>1066,1134=>650,1135=>424, -1136=>970,1137=>769,1138=>770,1139=>590,1140=>808,1141=>578,1142=>808,1143=>650,1144=>1284,1145=>973, -1146=>928,1147=>672,1148=>1018,1149=>693,1150=>1018,1151=>699,1152=>650,1153=>444,1154=>258,1155=>0, -1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>774,1163=>558,1164=>630,1165=>512, -1166=>611,1167=>556,1168=>614,1169=>458,1170=>614,1171=>443,1172=>631,1173=>562,1174=>1155,1175=>828, -1176=>652,1177=>452,1178=>819,1179=>600,1180=>816,1181=>590,1182=>920,1183=>664,1184=>967,1185=>633, -1186=>774,1187=>562,1188=>984,1189=>698,1190=>1069,1191=>841,1192=>722,1193=>524,1194=>722,1195=>444, -1196=>667,1197=>494,1198=>722,1199=>606,1200=>722,1201=>606,1202=>722,1203=>560,1204=>1046,1205=>778, -1206=>754,1207=>560,1208=>810,1209=>590,1210=>754,1211=>556,1212=>945,1213=>606,1214=>945,1215=>606, -1216=>386,1217=>1106,1218=>781,1219=>770,1220=>534,1221=>788,1222=>550,1223=>774,1224=>556,1225=>774, -1226=>558,1227=>778,1228=>556,1229=>943,1230=>677,1231=>386,1232=>722,1233=>500,1234=>722,1235=>500, -1236=>1000,1237=>722,1238=>667,1239=>444,1240=>778,1241=>444,1242=>778,1243=>444,1244=>1106,1245=>781, -1246=>652,1247=>445,1248=>654,1249=>389,1250=>774,1251=>556,1252=>774,1253=>556,1254=>778,1255=>500, -1256=>778,1257=>500,1258=>778,1259=>500,1260=>722,1261=>496,1262=>738,1263=>500,1264=>738,1265=>500, -1266=>738,1267=>500,1268=>754,1269=>556,1270=>599,1271=>443,1272=>970,1273=>756,1296=>652,1297=>452, -1298=>788,1299=>550,1306=>778,1307=>556,1308=>1000,1309=>722,1310=>770,1311=>558,1425=>0,1426=>0, -1427=>0,1428=>0,1429=>0,1430=>0,1431=>0,1432=>0,1433=>0,1434=>0,1435=>0,1436=>0, -1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0,1443=>0,1444=>0,1445=>0,1446=>0, -1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0,1453=>0,1454=>0,1455=>0,1456=>0, -1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, -1467=>0,1468=>0,1469=>0,1470=>433,1471=>0,1472=>155,1473=>0,1474=>0,1475=>400,1476=>0, -1477=>0,1478=>347,1479=>0,1488=>593,1489=>498,1490=>339,1491=>523,1492=>561,1493=>266,1494=>291, -1495=>559,1496=>576,1497=>266,1498=>496,1499=>501,1500=>510,1501=>542,1502=>581,1503=>273,1504=>347, -1505=>512,1506=>552,1507=>493,1508=>491,1509=>537,1510=>561,1511=>544,1512=>502,1513=>716,1514=>571, -1520=>532,1521=>532,1522=>532,1523=>396,1524=>432,3585=>590,3586=>578,3587=>661,3588=>592,3589=>592, -3590=>699,3591=>447,3592=>534,3593=>692,3594=>578,3595=>659,3596=>899,3597=>804,3598=>633,3599=>637, -3600=>484,3601=>730,3602=>876,3603=>915,3604=>592,3605=>592,3606=>578,3607=>670,3608=>542,3609=>671, -3610=>621,3611=>618,3612=>621,3613=>617,3614=>708,3615=>708,3616=>637,3617=>589,3618=>552,3619=>484, -3620=>590,3621=>569,3622=>637,3623=>526,3624=>599,3625=>802,3626=>579,3627=>668,3628=>778,3629=>560, -3630=>514,3631=>510,3632=>412,3633=>0,3634=>423,3635=>452,3636=>0,3637=>0,3638=>0,3639=>0, -3640=>0,3641=>0,3642=>0,3647=>665,3648=>357,3649=>624,3650=>529,3651=>486,3652=>475,3653=>423, -3654=>500,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>657, -3664=>548,3665=>548,3666=>592,3667=>614,3668=>631,3669=>643,3670=>508,3671=>744,3672=>622,3673=>585, -3674=>721,3675=>1381,4256=>475,4257=>469,4258=>573,4259=>650,4260=>502,4261=>506,4262=>481,4263=>746, -4264=>491,4265=>495,4266=>888,4267=>488,4268=>464,4269=>745,4270=>483,4271=>489,4272=>721,4273=>464, -4274=>578,4275=>590,4276=>611,4277=>491,4278=>663,4279=>489,4280=>544,4281=>479,4282=>527,4283=>488, -4284=>560,4285=>461,4286=>467,4287=>546,4288=>483,4289=>487,4290=>562,4291=>477,4292=>491,4293=>471, -4304=>522,4305=>518,4306=>621,4307=>716,4308=>517,4309=>519,4310=>518,4311=>796,4312=>518,4313=>518, -4314=>934,4315=>517,4316=>519,4317=>787,4318=>515,4319=>514,4320=>788,4321=>573,4322=>620,4323=>593, -4324=>639,4325=>516,4326=>714,4327=>518,4328=>572,4329=>518,4330=>555,4331=>518,4332=>562,4333=>509, -4334=>572,4335=>677,4336=>523,4337=>517,4338=>595,4339=>480,4340=>519,4341=>484,4345=>621,4347=>450, -5024=>718,5025=>768,5026=>633,5027=>878,5028=>1001,5029=>371,5030=>576,5031=>754,5032=>531,5033=>774, -5034=>692,5035=>499,5036=>668,5037=>829,5038=>575,5039=>681,5040=>485,5041=>607,5042=>885,5043=>974, -5044=>588,5045=>583,5046=>726,5047=>947,5048=>558,5049=>832,5050=>1096,5051=>780,5052=>595,5053=>869, -5054=>752,5055=>710,5056=>761,5057=>802,5058=>760,5059=>656,5060=>655,5061=>982,5062=>684,5063=>801, -5064=>805,5065=>1042,5066=>755,5067=>612,5068=>707,5069=>889,5070=>584,5071=>623,5072=>536,5073=>763, -5074=>763,5075=>498,5076=>1052,5077=>600,5078=>730,5079=>714,5080=>714,5081=>697,5082=>543,5083=>943, -5084=>718,5085=>630,5086=>660,5087=>692,5088=>841,5089=>861,5090=>617,5091=>733,5092=>898,5093=>896, -5094=>781,5095=>612,5096=>830,5097=>948,5098=>886,5099=>757,5100=>796,5101=>578,5102=>601,5103=>797, -5104=>623,5105=>886,5106=>730,5107=>827,5108=>648,7680=>722,7681=>500,7682=>667,7683=>556,7684=>667, -7685=>556,7686=>667,7687=>556,7688=>722,7689=>444,7690=>724,7691=>556,7692=>724,7693=>556,7694=>724, -7695=>556,7696=>724,7697=>556,7698=>724,7699=>556,7700=>667,7701=>444,7702=>667,7703=>444,7704=>667, -7705=>444,7706=>667,7707=>444,7708=>667,7709=>444,7710=>611,7711=>333,7712=>778,7713=>500,7714=>774, -7715=>556,7716=>774,7717=>556,7718=>774,7719=>556,7720=>774,7721=>556,7722=>774,7723=>556,7724=>386, -7725=>278,7726=>389,7727=>278,7728=>764,7729=>556,7730=>764,7731=>556,7732=>764,7733=>556,7734=>664, -7735=>278,7736=>664,7737=>278,7738=>664,7739=>278,7740=>664,7741=>278,7742=>943,7743=>833,7744=>943, -7745=>833,7746=>943,7747=>833,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722, -7755=>556,7756=>778,7757=>500,7758=>778,7759=>500,7760=>778,7761=>500,7762=>778,7763=>500,7764=>611, -7765=>556,7766=>611,7767=>556,7768=>712,7769=>444,7770=>712,7771=>444,7772=>712,7773=>444,7774=>712, -7775=>444,7776=>556,7777=>389,7778=>556,7779=>389,7780=>556,7781=>389,7782=>556,7783=>389,7784=>556, -7785=>389,7786=>667,7787=>333,7788=>667,7789=>333,7790=>667,7791=>333,7792=>667,7793=>333,7794=>722, -7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556,7804=>722, -7805=>500,7806=>722,7807=>500,7808=>1000,7809=>722,7810=>1000,7811=>722,7812=>1000,7813=>722,7814=>1000, -7815=>722,7816=>1000,7817=>722,7818=>722,7819=>500,7820=>722,7821=>500,7822=>722,7823=>500,7824=>667, -7825=>444,7826=>667,7827=>444,7828=>667,7829=>444,7830=>556,7831=>333,7832=>722,7833=>500,7834=>507, -7835=>333,7840=>722,7841=>500,7842=>722,7843=>500,7844=>722,7845=>500,7846=>722,7847=>500,7848=>722, -7849=>500,7850=>722,7851=>500,7852=>722,7853=>500,7854=>722,7855=>500,7856=>722,7857=>500,7858=>825, -7859=>603,7860=>722,7861=>500,7862=>722,7863=>500,7864=>667,7865=>444,7866=>667,7867=>444,7868=>667, -7869=>444,7870=>667,7871=>444,7872=>667,7873=>444,7874=>667,7875=>444,7876=>667,7877=>444,7878=>667, -7879=>444,7880=>386,7881=>278,7882=>386,7883=>278,7884=>778,7885=>500,7886=>778,7887=>500,7888=>778, -7889=>500,7890=>778,7891=>500,7892=>778,7893=>500,7894=>778,7895=>500,7896=>778,7897=>500,7898=>774, -7899=>550,7900=>774,7901=>550,7902=>774,7903=>549,7904=>778,7905=>550,7906=>778,7907=>550,7908=>722, -7909=>556,7910=>722,7911=>556,7912=>838,7913=>672,7914=>838,7915=>672,7916=>825,7917=>659,7918=>839, -7919=>629,7920=>839,7921=>629,7922=>722,7923=>500,7924=>722,7925=>500,7926=>722,7927=>500,7928=>722, -7929=>500,7936=>605,7937=>605,7938=>605,7939=>605,7940=>605,7941=>605,7942=>605,7943=>605,7944=>722, -7945=>722,7946=>830,7947=>833,7948=>761,7949=>798,7950=>721,7951=>722,7952=>440,7953=>440,7954=>440, -7955=>440,7956=>440,7957=>440,7960=>817,7961=>826,7962=>944,7963=>970,7964=>964,7965=>1009,7968=>605, -7969=>605,7970=>605,7971=>605,7972=>605,7973=>605,7974=>605,7975=>605,7976=>926,7977=>921,7978=>1038, -7979=>1064,7980=>1092,7981=>1102,7982=>1005,7983=>991,7984=>330,7985=>330,7986=>330,7987=>330,7988=>330, -7989=>330,7990=>330,7991=>330,7992=>534,7993=>541,7994=>653,7995=>659,7996=>705,7997=>714,7998=>612, -7999=>614,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>885,8009=>886,8010=>1038, -8011=>1052,8012=>997,8013=>1021,8016=>550,8017=>550,8018=>550,8019=>550,8020=>550,8021=>550,8022=>550, -8023=>550,8025=>870,8027=>1014,8029=>1043,8031=>944,8032=>715,8033=>715,8034=>715,8035=>715,8036=>715, -8037=>715,8038=>715,8039=>715,8040=>905,8041=>913,8042=>1066,8043=>1085,8044=>1034,8045=>1044,8046=>980, -8047=>961,8048=>605,8049=>605,8050=>440,8051=>440,8052=>605,8053=>605,8054=>330,8055=>330,8056=>550, -8057=>550,8058=>550,8059=>550,8060=>715,8061=>715,8064=>605,8065=>605,8066=>605,8067=>605,8068=>605, -8069=>605,8070=>605,8071=>605,8072=>886,8073=>887,8074=>985,8075=>993,8076=>937,8077=>956,8078=>874, -8079=>878,8080=>605,8081=>605,8082=>605,8083=>605,8084=>605,8085=>605,8086=>605,8087=>605,8088=>1096, -8089=>1092,8090=>1223,8091=>1250,8092=>1270,8093=>1283,8094=>1174,8095=>1162,8096=>715,8097=>715,8098=>715, -8099=>715,8100=>715,8101=>715,8102=>715,8103=>715,8104=>1057,8105=>1073,8106=>1228,8107=>1251,8108=>1202, -8109=>1210,8110=>1151,8111=>1131,8112=>605,8113=>605,8114=>605,8115=>605,8116=>605,8118=>605,8119=>605, -8120=>722,8121=>722,8122=>722,8123=>722,8124=>883,8125=>500,8126=>0,8127=>500,8128=>500,8129=>550, -8130=>605,8131=>605,8132=>605,8134=>605,8135=>605,8136=>790,8137=>830,8138=>909,8139=>931,8140=>950, -8141=>500,8142=>500,8143=>500,8144=>330,8145=>330,8146=>330,8147=>330,8150=>330,8151=>330,8152=>386, -8153=>386,8154=>506,8155=>550,8157=>500,8158=>500,8159=>500,8160=>550,8161=>550,8162=>550,8163=>550, -8164=>550,8165=>550,8166=>550,8167=>550,8168=>738,8169=>738,8170=>858,8171=>880,8172=>764,8173=>550, -8174=>550,8175=>500,8178=>715,8179=>715,8180=>715,8182=>715,8183=>715,8184=>884,8185=>857,8186=>927, -8187=>892,8188=>988,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250, -8198=>167,8199=>500,8200=>250,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, -8208=>333,8209=>333,8210=>500,8213=>1000,8214=>333,8215=>478,8219=>250,8223=>500,8227=>560,8228=>250, -8229=>500,8231=>250,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>250, -8241=>1588,8242=>270,8243=>492,8244=>714,8245=>270,8246=>484,8247=>693,8248=>469,8251=>727,8252=>666, -8253=>695,8254=>500,8255=>953,8256=>953,8257=>338,8258=>931,8259=>333,8260=>167,8261=>332,8262=>332, -8263=>1000,8264=>833,8265=>833,8266=>500,8267=>540,8268=>528,8269=>523,8270=>500,8271=>333,8272=>953, -8273=>500,8274=>497,8275=>576,8276=>953,8277=>785,8278=>450,8279=>881,8280=>620,8281=>620,8282=>179, -8283=>621,8284=>569,8285=>179,8286=>179,8287=>111,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, -8304=>300,8305=>278,8308=>300,8309=>300,8310=>300,8311=>300,8312=>300,8313=>300,8314=>300,8315=>300, -8316=>300,8317=>216,8318=>216,8319=>318,8320=>300,8321=>274,8322=>300,8323=>300,8324=>300,8325=>300, -8326=>300,8327=>300,8328=>300,8329=>300,8330=>300,8331=>300,8332=>300,8333=>216,8334=>216,8352=>710, -8353=>722,8354=>783,8355=>611,8356=>500,8357=>833,8358=>722,8359=>960,8360=>1101,8361=>1000,8362=>889, -8363=>532,8365=>742,8366=>631,8369=>609,8370=>639,8371=>660,8372=>556,8373=>500,8448=>752,8449=>746, -8451=>1009,8457=>923,8458=>500,8459=>1035,8462=>556,8463=>556,8464=>792,8465=>737,8466=>800,8467=>427, -8468=>835,8470=>879,8471=>1048,8472=>666,8475=>747,8476=>955,8478=>722,8479=>722,8480=>891,8481=>1156, -8483=>722,8486=>811,8487=>811,8489=>333,8490=>764,8491=>722,8492=>806,8494=>551,8497=>723,8498=>611, -8499=>1203,8501=>593,8502=>498,8503=>339,8504=>523,8506=>906,8507=>1156,8523=>778,8525=>866,8526=>500, -8531=>750,8532=>750,8533=>750,8534=>750,8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750, -8541=>750,8542=>750,8543=>750,8544=>386,8545=>772,8546=>1158,8547=>1108,8548=>722,8549=>1108,8550=>1494, -8551=>1880,8552=>1108,8553=>722,8554=>1108,8555=>1494,8556=>664,8557=>722,8558=>724,8559=>943,8560=>278, -8561=>556,8562=>834,8563=>778,8564=>500,8565=>778,8566=>1056,8567=>1334,8568=>778,8569=>500,8570=>778, -8571=>1056,8572=>278,8573=>444,8574=>556,8575=>833,8592=>964,8593=>523,8594=>964,8595=>523,8596=>964, -8597=>964,8598=>964,8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8604=>1152,8605=>1152,8606=>964, -8607=>964,8608=>964,8609=>964,8610=>1078,8611=>1078,8612=>964,8613=>964,8614=>964,8615=>964,8616=>964, -8617=>964,8618=>964,8619=>964,8620=>964,8621=>1168,8622=>964,8624=>622,8625=>622,8630=>1069,8631=>1069, -8632=>964,8633=>964,8634=>980,8635=>980,8636=>964,8637=>964,8638=>557,8639=>556,8640=>964,8641=>964, -8642=>557,8643=>556,8644=>964,8645=>964,8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8651=>964, -8652=>964,8653=>964,8654=>964,8655=>964,8656=>964,8657=>630,8658=>964,8659=>630,8660=>964,8661=>630, -8662=>1063,8663=>1063,8664=>1063,8665=>1063,8666=>964,8667=>964,8668=>1100,8669=>1100,8672=>964,8674=>964, -8676=>964,8677=>964,8704=>627,8705=>716,8706=>558,8707=>627,8708=>627,8709=>500,8710=>612,8711=>719, -8713=>576,8714=>576,8716=>576,8717=>576,8720=>733,8721=>713,8722=>676,8723=>676,8724=>676,8725=>750, -8727=>570,8729=>570,8730=>549,8733=>676,8734=>752,8736=>555,8737=>555,8738=>555,8739=>240,8740=>531, -8741=>478,8742=>705,8743=>694,8744=>694,8745=>694,8746=>694,8747=>323,8756=>629,8757=>629,8761=>947, -8764=>676,8765=>676,8766=>763,8768=>305,8769=>676,8770=>676,8771=>676,8773=>676,8776=>676,8777=>676, -8778=>676,8781=>676,8782=>676,8783=>676,8784=>676,8785=>676,8786=>676,8787=>676,8788=>947,8789=>947, -8790=>676,8791=>676,8796=>676,8800=>570,8801=>676,8802=>676,8804=>570,8805=>570,8806=>676,8807=>676, -8808=>676,8809=>676,8810=>1047,8811=>1047,8812=>450,8813=>676,8814=>676,8815=>676,8816=>676,8817=>676, -8818=>676,8819=>676,8820=>676,8821=>676,8822=>676,8823=>676,8824=>676,8825=>676,8826=>676,8827=>676, -8828=>676,8829=>676,8830=>676,8831=>676,8832=>676,8833=>676,8834=>676,8835=>676,8836=>676,8837=>676, -8838=>676,8839=>676,8840=>676,8841=>676,8842=>676,8843=>676,8846=>694,8847=>676,8848=>676,8849=>676, -8850=>676,8851=>694,8852=>694,8853=>738,8854=>738,8855=>738,8856=>738,8857=>738,8858=>738,8859=>738, -8861=>738,8862=>678,8863=>678,8864=>678,8865=>678,8866=>487,8867=>487,8868=>752,8869=>752,8871=>487, -8873=>659,8874=>831,8876=>487,8877=>487,8878=>659,8879=>659,8882=>676,8883=>676,8884=>676,8885=>676, -8886=>1380,8887=>1380,8888=>1027,8890=>626,8891=>694,8892=>694,8893=>694,8900=>512,8903=>676,8904=>759, -8905=>632,8906=>632,8907=>1000,8908=>1000,8909=>676,8910=>694,8911=>694,8912=>676,8913=>676,8914=>694, -8915=>694,8916=>694,8918=>676,8919=>676,8920=>1441,8921=>1441,8922=>676,8923=>676,8924=>676,8925=>676, -8926=>676,8927=>676,8928=>676,8929=>676,8930=>676,8931=>676,8934=>676,8935=>676,8936=>676,8937=>676, -8938=>676,8939=>676,8940=>676,8941=>676,8960=>737,8968=>411,8969=>411,8970=>411,8971=>411,8976=>680, -8994=>951,8995=>951,9001=>398,9002=>398,9251=>500,9472=>1000,9473=>1000,9474=>1000,9475=>1000,9476=>1000, -9477=>1000,9478=>1000,9479=>1000,9480=>1000,9481=>1000,9482=>1000,9483=>1000,9484=>1000,9485=>1000,9486=>1000, -9487=>1000,9488=>1000,9489=>1000,9490=>1000,9491=>1000,9492=>1000,9493=>1000,9494=>1000,9495=>1000,9496=>1000, -9497=>1000,9498=>1000,9499=>1000,9500=>1000,9501=>1000,9502=>1000,9503=>1000,9504=>1000,9505=>1000,9506=>1000, -9507=>1000,9508=>1000,9509=>1000,9510=>1000,9511=>1000,9512=>1000,9513=>1000,9514=>1000,9515=>1000,9516=>1000, -9517=>1000,9518=>1000,9519=>1000,9520=>1000,9521=>1000,9522=>1000,9523=>1000,9524=>1000,9525=>1000,9526=>1000, -9527=>1000,9528=>1000,9529=>1000,9530=>1000,9531=>1000,9532=>1000,9533=>1000,9534=>1000,9535=>1000,9536=>1000, -9537=>1000,9538=>1000,9539=>1000,9540=>1000,9541=>1000,9542=>1000,9543=>1000,9544=>1000,9545=>1000,9546=>1000, -9547=>1000,9552=>1000,9553=>1000,9554=>1000,9555=>1000,9556=>1000,9557=>1000,9558=>1000,9559=>1000,9560=>1000, -9561=>1000,9562=>1000,9563=>1000,9564=>1000,9565=>1000,9566=>1000,9567=>1000,9568=>1000,9569=>1000,9570=>1000, -9571=>1000,9572=>1000,9573=>1000,9574=>1000,9575=>1000,9576=>1000,9577=>1000,9578=>1000,9579=>1000,9580=>1000, -9600=>1000,9601=>1000,9602=>1000,9603=>1000,9604=>1000,9605=>1000,9606=>1000,9607=>1000,9608=>1000,9609=>1000, -9610=>1000,9611=>1000,9612=>1000,9613=>1000,9614=>1000,9615=>1000,9616=>1000,9617=>1000,9618=>1000,9620=>1000, -9621=>1000,9622=>1000,9623=>1000,9624=>1000,9625=>1000,9626=>1000,9627=>1000,9628=>1000,9629=>1000,9630=>1000, -9631=>1000,9632=>678,9633=>678,9642=>309,9650=>681,9651=>681,9654=>681,9655=>681,9660=>681,9661=>681, -9664=>681,9665=>681,9670=>580,9671=>580,9674=>494,9675=>738,9676=>732,9679=>738,9702=>524,9711=>851, -9733=>1003,9734=>1003,9824=>618,9825=>645,9826=>587,9827=>582,9828=>582,9829=>645,9830=>587,9831=>618, -9833=>333,9834=>556,9835=>778,9836=>778,9837=>556,9838=>556,9839=>556,10214=>561,10215=>561,11799=>333, -64256=>613,64257=>559,64258=>559,64259=>846,64260=>836,64262=>723,64285=>266,64286=>0,64287=>532,64288=>552, -64297=>570,64298=>716,64299=>716,64300=>716,64301=>716,64302=>593,64303=>593,64304=>593,64305=>498,64306=>339, -64307=>523,64308=>561,64309=>266,64310=>291,64312=>576,64313=>266,64314=>496,64315=>501,64316=>510,64318=>581, -64320=>347,64321=>512,64323=>493,64324=>491,64326=>561,64327=>544,64328=>502,64329=>716,64330=>571,64331=>266, -64332=>498,64333=>501,64334=>491,64335=>593,65533=>788); -$enc=''; -$diff=''; -$file='freeserifb.z'; -$ctg='freeserifb.ctg.z'; -$originalsize=467208; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.z b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.z deleted file mode 100644 index 95e31362..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifb.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.ctg.z deleted file mode 100644 index 86d46ef3..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.php deleted file mode 100644 index d45a4f5f..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.php +++ /dev/null @@ -1,238 +0,0 @@ -900,'Descent'=>-300,'CapHeight'=>-24,'Flags'=>96,'FontBBox'=>'[-787 -1120 1867 1571]','ItalicAngle'=>-16.3,'StemV'=>120,'MissingWidth'=>600); -$up=-125; -$ut=50; -$dw=600; -$cw=array( -32=>250,33=>389,34=>555,35=>500,36=>500,37=>833,38=>778,39=>278,40=>333,41=>333, -42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500, -52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>570,61=>570, -62=>570,63=>500,64=>832,65=>667,66=>667,67=>667,68=>744,69=>670,70=>656,71=>722, -72=>778,73=>393,74=>500,75=>664,76=>609,77=>896,78=>722,79=>722,80=>614,81=>722, -82=>672,83=>556,84=>611,85=>722,86=>667,87=>889,88=>667,89=>611,90=>611,91=>333, -92=>278,93=>333,94=>570,95=>500,96=>333,97=>500,98=>500,99=>444,100=>500,101=>444, -102=>333,103=>500,104=>556,105=>278,106=>278,107=>500,108=>278,109=>778,110=>556,111=>500, -112=>500,113=>500,114=>389,115=>389,116=>278,117=>556,118=>444,119=>667,120=>500,121=>444, -122=>389,123=>348,124=>220,125=>348,126=>570,8364=>761,8218=>250,402=>333,8222=>500,8230=>1000, -8224=>500,8225=>500,710=>333,8240=>1000,352=>556,8249=>333,338=>944,381=>611,8216=>250,8217=>250, -8220=>500,8221=>500,8226=>350,8211=>500,8212=>1000,732=>333,8482=>1000,353=>389,8250=>333,339=>722, -382=>389,376=>611,160=>250,161=>389,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500, -168=>333,169=>747,170=>266,171=>500,172=>606,173=>333,174=>747,175=>333,176=>400,177=>570, -178=>300,179=>300,180=>333,181=>576,182=>500,183=>250,184=>333,185=>272,186=>300,187=>500, -188=>750,189=>750,190=>750,191=>500,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667, -198=>944,199=>667,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389, -208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>570,216=>722,217=>722, -218=>722,219=>722,220=>722,221=>611,222=>609,223=>500,224=>500,225=>500,226=>500,227=>500, -228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278, -238=>278,239=>278,240=>500,241=>556,242=>500,243=>500,244=>500,245=>500,246=>500,247=>570, -248=>500,249=>556,250=>556,251=>556,252=>556,253=>444,254=>500,255=>444,256=>667,257=>500, -258=>667,259=>500,260=>667,261=>500,262=>667,263=>444,264=>667,265=>444,266=>667,267=>444, -268=>667,269=>444,270=>722,271=>616,272=>722,273=>500,274=>667,275=>444,276=>667,277=>444, -278=>667,279=>444,280=>667,281=>444,282=>667,283=>444,284=>722,285=>500,286=>722,287=>500, -288=>722,289=>500,290=>722,291=>500,292=>778,293=>556,294=>778,295=>556,296=>389,297=>278, -298=>389,299=>278,300=>389,301=>278,302=>389,303=>278,304=>389,305=>278,306=>826,307=>547, -308=>500,309=>278,310=>667,311=>500,312=>534,313=>611,314=>278,315=>611,316=>278,317=>638, -318=>424,319=>611,320=>424,321=>611,322=>278,323=>722,324=>556,325=>722,326=>556,327=>722, -328=>556,329=>556,330=>722,331=>547,332=>722,333=>500,334=>722,335=>500,336=>722,337=>500, -340=>667,341=>389,342=>667,343=>389,344=>667,345=>389,346=>556,347=>389,348=>556,349=>389, -350=>556,351=>389,354=>611,355=>278,356=>611,357=>308,358=>611,359=>278,360=>722,361=>556, -362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556, -372=>889,373=>667,374=>611,375=>444,377=>611,378=>389,379=>611,380=>389,383=>333,384=>500, -385=>850,386=>667,387=>575,388=>630,389=>500,390=>722,391=>929,392=>654,393=>722,394=>864, -395=>684,396=>500,397=>546,398=>670,399=>722,400=>631,401=>769,403=>929,404=>716,405=>745, -406=>278,407=>389,408=>829,409=>500,410=>278,411=>495,412=>853,413=>919,414=>556,415=>722, -416=>908,417=>640,418=>1014,419=>778,420=>757,421=>500,422=>611,423=>556,424=>389,425=>730, -426=>455,427=>349,428=>611,429=>298,430=>611,431=>902,432=>714,433=>811,434=>678,435=>611, -436=>581,437=>611,438=>389,439=>619,440=>614,441=>461,442=>445,443=>500,444=>614,445=>500, -446=>389,447=>504,448=>220,449=>418,450=>570,451=>333,452=>1355,453=>1133,454=>889,455=>1109, -456=>887,457=>556,458=>1222,459=>1000,460=>834,461=>667,462=>500,463=>393,464=>278,465=>722, -466=>500,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722, -476=>556,477=>444,478=>667,479=>500,480=>667,481=>500,482=>944,483=>722,484=>722,485=>500, -486=>722,487=>500,488=>664,489=>500,490=>722,491=>500,492=>722,493=>500,494=>619,495=>513, -496=>278,497=>1355,498=>1133,499=>889,500=>722,501=>500,502=>944,503=>660,504=>722,505=>556, -506=>667,507=>500,508=>944,509=>722,510=>722,511=>500,512=>667,513=>500,514=>667,515=>500, -516=>670,517=>444,518=>670,519=>444,520=>393,521=>278,522=>393,523=>278,524=>722,525=>500, -526=>722,527=>500,528=>672,529=>389,530=>672,531=>389,532=>722,533=>556,534=>722,535=>556, -536=>556,537=>389,538=>611,539=>278,540=>424,541=>455,542=>778,543=>556,544=>731,545=>618, -546=>568,547=>500,548=>667,549=>444,550=>667,551=>500,552=>670,553=>444,554=>722,555=>500, -556=>722,557=>500,558=>722,559=>500,560=>722,561=>500,562=>611,563=>444,564=>422,565=>621, -566=>413,567=>278,568=>800,569=>784,570=>644,571=>667,572=>444,573=>664,574=>611,575=>389, -576=>451,577=>444,578=>444,579=>667,580=>722,581=>722,582=>670,583=>444,584=>500,585=>278, -586=>808,587=>608,588=>672,589=>389,590=>611,591=>444,592=>500,593=>590,594=>590,595=>500, -596=>444,599=>668,600=>444,601=>444,603=>430,608=>569,609=>500,613=>556,616=>278,617=>320, -618=>278,623=>778,629=>500,633=>389,643=>333,648=>278,649=>500,650=>557,651=>492,652=>444, -653=>667,654=>444,658=>513,670=>500,697=>250,698=>408,699=>250,700=>250,701=>250,702=>300, -703=>300,706=>333,707=>333,708=>333,709=>333,711=>333,712=>333,713=>333,714=>333,715=>333, -716=>300,717=>333,718=>333,719=>333,720=>278,721=>278,722=>300,723=>300,724=>333,725=>333, -726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,733=>333,734=>333,735=>352,741=>526, -742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>480,751=>333, -752=>333,753=>333,754=>333,755=>327,756=>261,757=>437,758=>437,759=>400,760=>278,761=>175, -762=>175,763=>175,764=>175,765=>0,766=>337,767=>432,768=>0,769=>0,770=>0,771=>0, -772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0, -782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0, -792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0, -802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0, -812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0, -822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0, -832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0, -842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0, -852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,860=>0,861=>0,862=>0, -863=>0,864=>0,865=>0,884=>199,885=>199,890=>0,894=>333,900=>330,901=>333,902=>667, -903=>250,904=>819,905=>955,906=>539,908=>835,910=>961,911=>889,912=>320,913=>667,914=>667, -915=>637,916=>740,917=>667,918=>611,919=>778,920=>722,921=>389,922=>677,923=>667,924=>889, -925=>722,926=>650,927=>722,928=>778,929=>611,931=>730,932=>621,933=>722,934=>748,935=>667, -936=>858,937=>741,938=>389,939=>722,940=>590,941=>430,942=>548,943=>320,944=>536,945=>590, -946=>536,947=>548,948=>550,949=>430,950=>482,951=>548,952=>525,953=>320,954=>564,955=>510, -956=>589,957=>522,958=>482,959=>536,960=>629,961=>536,962=>470,963=>536,964=>464,965=>536, -966=>643,967=>482,968=>715,969=>715,970=>320,971=>536,972=>536,973=>536,974=>715,976=>508, -977=>589,978=>722,979=>931,980=>722,981=>660,982=>715,983=>536,984=>611,985=>536,986=>620, -987=>524,988=>667,989=>535,990=>708,991=>428,992=>671,993=>633,1008=>550,1009=>550,1010=>477, -1011=>278,1012=>722,1013=>411,1014=>411,1015=>609,1016=>500,1017=>667,1018=>896,1019=>769,1020=>536, -1021=>667,1022=>667,1023=>667,1024=>670,1025=>670,1026=>762,1027=>637,1028=>667,1029=>556,1030=>393, -1031=>393,1032=>500,1033=>1085,1034=>1049,1035=>747,1036=>736,1037=>778,1038=>746,1039=>778,1040=>667, -1041=>667,1042=>667,1043=>637,1044=>778,1045=>670,1046=>1044,1047=>650,1048=>778,1049=>778,1050=>736, -1051=>814,1052=>896,1053=>778,1054=>722,1055=>778,1056=>614,1057=>667,1058=>611,1059=>746,1060=>748, -1061=>667,1062=>778,1063=>742,1064=>1136,1065=>1135,1066=>779,1067=>984,1068=>664,1069=>732,1070=>1069, -1071=>779,1072=>500,1073=>508,1074=>486,1075=>414,1076=>486,1077=>444,1078=>982,1079=>476,1080=>556, -1081=>556,1082=>564,1083=>585,1084=>757,1085=>552,1086=>500,1087=>556,1088=>500,1089=>444,1090=>778, -1091=>532,1092=>764,1093=>500,1094=>556,1095=>556,1096=>806,1097=>806,1098=>644,1099=>744,1100=>470, -1101=>488,1102=>757,1103=>586,1104=>444,1105=>444,1106=>524,1107=>414,1108=>488,1109=>389,1110=>278, -1111=>278,1112=>278,1113=>772,1114=>745,1115=>556,1116=>564,1117=>556,1118=>532,1119=>556,1120=>990, -1121=>690,1122=>804,1123=>751,1124=>1017,1125=>752,1126=>900,1127=>728,1128=>1236,1129=>927,1130=>1044, -1131=>826,1132=>1401,1133=>1016,1134=>620,1135=>476,1136=>858,1137=>769,1138=>722,1139=>544,1140=>796, -1141=>584,1142=>796,1143=>584,1144=>1268,1145=>1023,1146=>895,1147=>612,1148=>990,1149=>690,1150=>990, -1151=>635,1152=>620,1153=>444,1154=>372,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0, -1161=>0,1162=>778,1163=>556,1164=>664,1165=>470,1166=>614,1167=>473,1168=>624,1169=>448,1170=>624, -1171=>448,1172=>733,1173=>485,1174=>1080,1175=>982,1176=>650,1177=>476,1178=>772,1179=>564,1180=>772, -1181=>590,1182=>738,1183=>499,1184=>862,1185=>718,1186=>778,1187=>552,1188=>976,1189=>682,1190=>1085, -1191=>787,1192=>667,1193=>480,1194=>667,1195=>444,1196=>534,1197=>778,1198=>611,1199=>640,1200=>611, -1201=>640,1202=>694,1203=>500,1204=>1004,1205=>518,1206=>742,1207=>556,1208=>742,1209=>556,1210=>716, -1211=>556,1212=>844,1213=>530,1214=>844,1215=>530,1216=>393,1217=>1044,1218=>982,1219=>736,1220=>534, -1221=>814,1222=>585,1223=>778,1224=>552,1225=>778,1226=>552,1227=>742,1228=>556,1229=>896,1230=>757, -1231=>393,1232=>667,1233=>500,1234=>667,1235=>500,1236=>891,1237=>646,1238=>670,1239=>444,1240=>659, -1241=>372,1242=>619,1243=>372,1244=>1044,1245=>994,1246=>650,1247=>476,1248=>604,1249=>459,1250=>778, -1251=>539,1252=>778,1253=>539,1254=>722,1255=>500,1256=>722,1257=>500,1258=>722,1259=>500,1260=>732, -1261=>488,1262=>746,1263=>532,1264=>746,1265=>532,1266=>746,1267=>532,1268=>742,1269=>556,1270=>637, -1271=>448,1272=>984,1273=>744,1296=>652,1297=>452,1298=>814,1299=>585,1306=>722,1307=>500,1308=>889, -1309=>656,1310=>736,1311=>564,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>0, -1432=>0,1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0, -1442=>0,1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0, -1452=>0,1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0, -1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>433,1471=>0, -1472=>155,1473=>0,1474=>0,1475=>400,1476=>0,1477=>0,1478=>347,1479=>0,1488=>593,1489=>498, -1490=>339,1491=>523,1492=>561,1493=>266,1494=>291,1495=>559,1496=>576,1497=>266,1498=>496,1499=>501, -1500=>510,1501=>542,1502=>581,1503=>273,1504=>347,1505=>512,1506=>552,1507=>493,1508=>491,1509=>537, -1510=>561,1511=>544,1512=>502,1513=>716,1514=>571,1520=>532,1521=>532,1522=>532,1523=>396,1524=>432, -3585=>590,3586=>578,3587=>661,3588=>592,3589=>592,3590=>699,3591=>447,3592=>534,3593=>692,3594=>578, -3595=>659,3596=>899,3597=>804,3598=>633,3599=>637,3600=>484,3601=>730,3602=>876,3603=>915,3604=>592, -3605=>592,3606=>578,3607=>670,3608=>542,3609=>671,3610=>621,3611=>618,3612=>621,3613=>617,3614=>708, -3615=>708,3616=>637,3617=>589,3618=>552,3619=>484,3620=>590,3621=>569,3622=>637,3623=>526,3624=>599, -3625=>802,3626=>579,3627=>668,3628=>778,3629=>560,3630=>514,3631=>510,3632=>442,3633=>0,3634=>423, -3635=>452,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>665,3648=>357, -3649=>624,3650=>529,3651=>486,3652=>475,3653=>423,3654=>500,3655=>0,3656=>0,3657=>0,3658=>0, -3659=>0,3660=>0,3661=>0,3662=>0,3663=>657,3664=>548,3665=>548,3666=>592,3667=>614,3668=>631, -3669=>643,3670=>508,3671=>744,3672=>622,3673=>585,3674=>721,3675=>1381,4256=>475,4257=>469,4258=>573, -4259=>650,4260=>502,4261=>506,4262=>481,4263=>746,4264=>491,4265=>495,4266=>888,4267=>488,4268=>464, -4269=>745,4270=>483,4271=>489,4272=>721,4273=>464,4274=>578,4275=>590,4276=>611,4277=>491,4278=>663, -4279=>489,4280=>544,4281=>479,4282=>527,4283=>488,4284=>560,4285=>461,4286=>467,4287=>546,4288=>483, -4289=>487,4290=>562,4291=>477,4292=>491,4293=>471,4304=>522,4305=>518,4306=>621,4307=>716,4308=>517, -4309=>519,4310=>518,4311=>796,4312=>518,4313=>518,4314=>934,4315=>517,4316=>519,4317=>787,4318=>515, -4319=>514,4320=>788,4321=>573,4322=>620,4323=>593,4324=>639,4325=>516,4326=>714,4327=>518,4328=>572, -4329=>518,4330=>555,4331=>518,4332=>562,4333=>509,4334=>572,4335=>677,4336=>523,4337=>517,4338=>595, -4339=>480,4340=>519,4341=>484,4345=>621,4347=>410,5024=>718,5025=>768,5026=>633,5027=>878,5028=>1001, -5029=>371,5030=>576,5031=>754,5032=>531,5033=>774,5034=>692,5035=>499,5036=>668,5037=>829,5038=>575, -5039=>681,5040=>485,5041=>607,5042=>885,5043=>974,5044=>588,5045=>583,5046=>726,5047=>947,5048=>558, -5049=>832,5050=>1096,5051=>780,5052=>595,5053=>869,5054=>752,5055=>710,5056=>761,5057=>802,5058=>760, -5059=>656,5060=>655,5061=>982,5062=>684,5063=>801,5064=>805,5065=>1042,5066=>755,5067=>612,5068=>707, -5069=>889,5070=>584,5071=>623,5072=>536,5073=>763,5074=>763,5075=>498,5076=>1052,5077=>600,5078=>730, -5079=>714,5080=>714,5081=>697,5082=>543,5083=>943,5084=>718,5085=>630,5086=>660,5087=>692,5088=>841, -5089=>861,5090=>617,5091=>733,5092=>898,5093=>896,5094=>781,5095=>612,5096=>830,5097=>948,5098=>886, -5099=>757,5100=>796,5101=>578,5102=>601,5103=>797,5104=>623,5105=>886,5106=>730,5107=>827,5108=>648, -7680=>667,7681=>500,7682=>667,7683=>500,7684=>667,7685=>500,7686=>667,7687=>500,7688=>667,7689=>444, -7690=>744,7691=>500,7692=>744,7693=>500,7694=>744,7695=>500,7696=>744,7697=>500,7698=>744,7699=>500, -7700=>667,7701=>444,7702=>667,7703=>444,7704=>670,7705=>444,7706=>670,7707=>444,7708=>670,7709=>444, -7710=>656,7711=>333,7712=>722,7713=>500,7714=>778,7715=>556,7716=>778,7717=>556,7718=>778,7719=>556, -7720=>778,7721=>556,7722=>778,7723=>556,7724=>393,7725=>278,7726=>389,7727=>278,7728=>664,7729=>500, -7730=>664,7731=>500,7732=>664,7733=>500,7734=>609,7735=>278,7736=>609,7737=>278,7738=>609,7739=>278, -7740=>609,7741=>278,7742=>896,7743=>778,7744=>896,7745=>778,7746=>896,7747=>778,7748=>722,7749=>556, -7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>722,7757=>500,7758=>722,7759=>500, -7760=>722,7761=>500,7762=>722,7763=>500,7764=>614,7765=>500,7766=>614,7767=>500,7768=>672,7769=>389, -7770=>672,7771=>389,7772=>672,7773=>389,7774=>672,7775=>389,7776=>556,7777=>389,7778=>556,7779=>389, -7780=>556,7781=>389,7782=>556,7783=>389,7784=>556,7785=>389,7786=>611,7787=>278,7788=>611,7789=>278, -7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556, -7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>444,7806=>667,7807=>444,7808=>889,7809=>667, -7810=>889,7811=>667,7812=>889,7813=>667,7814=>889,7815=>667,7816=>889,7817=>667,7818=>667,7819=>500, -7820=>667,7821=>500,7822=>611,7823=>444,7824=>611,7825=>389,7826=>611,7827=>389,7828=>611,7829=>389, -7830=>556,7831=>278,7832=>667,7833=>444,7834=>507,7835=>333,7840=>667,7841=>500,7842=>667,7843=>500, -7844=>667,7845=>500,7846=>667,7847=>500,7848=>667,7849=>500,7850=>667,7851=>500,7852=>667,7853=>500, -7854=>667,7855=>500,7856=>667,7857=>500,7858=>667,7859=>500,7860=>667,7861=>500,7862=>667,7863=>500, -7864=>670,7865=>444,7866=>670,7867=>444,7868=>670,7869=>444,7870=>667,7871=>444,7872=>667,7873=>444, -7874=>667,7875=>444,7876=>667,7877=>444,7878=>670,7879=>444,7880=>393,7881=>278,7882=>393,7883=>278, -7884=>722,7885=>500,7886=>722,7887=>500,7888=>722,7889=>500,7890=>722,7891=>500,7892=>722,7893=>500, -7894=>722,7895=>500,7896=>722,7897=>500,7898=>908,7899=>640,7900=>908,7901=>640,7902=>908,7903=>640, -7904=>908,7905=>640,7906=>908,7907=>640,7908=>722,7909=>556,7910=>722,7911=>556,7912=>902,7913=>714, -7914=>902,7915=>714,7916=>902,7917=>714,7918=>902,7919=>714,7920=>902,7921=>714,7922=>611,7923=>444, -7924=>611,7925=>444,7926=>611,7927=>444,7928=>611,7929=>444,7936=>590,7937=>590,7938=>590,7939=>590, -7940=>590,7941=>590,7942=>590,7943=>590,7944=>724,7945=>753,7946=>891,7947=>912,7948=>822,7949=>853, -7950=>796,7951=>787,7952=>430,7953=>430,7954=>430,7955=>430,7956=>430,7957=>430,7960=>864,7961=>905, -7962=>1034,7963=>1038,7964=>1031,7965=>1045,7968=>548,7969=>548,7970=>548,7971=>548,7972=>548,7973=>548, -7974=>548,7975=>548,7976=>976,7977=>1009,7978=>1132,7979=>1141,7980=>1138,7981=>1154,7982=>1079,7983=>1071, -7984=>320,7985=>320,7986=>320,7987=>320,7988=>320,7989=>320,7990=>320,7991=>320,7992=>593,7993=>620, -7994=>746,7995=>762,7996=>742,7997=>773,7998=>691,7999=>683,8000=>536,8001=>536,8002=>536,8003=>536, -8004=>536,8005=>536,8008=>899,8009=>928,8010=>1086,8011=>1118,8012=>1020,8013=>1028,8016=>536,8017=>536, -8018=>536,8019=>536,8020=>536,8021=>536,8022=>536,8023=>536,8025=>959,8027=>1085,8029=>1108,8031=>1027, -8032=>715,8033=>715,8034=>715,8035=>715,8036=>715,8037=>715,8038=>715,8039=>715,8040=>946,8041=>960, -8042=>1133,8043=>1148,8044=>1059,8045=>1081,8046=>1020,8047=>1016,8048=>590,8049=>590,8050=>430,8051=>430, -8052=>548,8053=>548,8054=>320,8055=>320,8056=>536,8057=>536,8058=>536,8059=>536,8060=>715,8061=>715, -8064=>590,8065=>590,8066=>590,8067=>590,8068=>590,8069=>590,8070=>590,8071=>590,8072=>842,8073=>877, -8074=>1011,8075=>1031,8076=>947,8077=>975,8078=>907,8079=>893,8080=>548,8081=>548,8082=>548,8083=>548, -8084=>548,8085=>548,8086=>548,8087=>548,8088=>1030,8089=>1066,8090=>1188,8091=>1199,8092=>1196,8093=>1211, -8094=>1134,8095=>1129,8096=>715,8097=>715,8098=>715,8099=>715,8100=>715,8101=>715,8102=>715,8103=>715, -8104=>1060,8105=>1076,8106=>1264,8107=>1287,8108=>1179,8109=>1204,8110=>1137,8111=>1135,8112=>590,8113=>590, -8114=>590,8115=>590,8116=>590,8118=>590,8119=>590,8120=>667,8121=>667,8122=>752,8123=>728,8124=>775, -8125=>250,8126=>0,8127=>500,8128=>500,8129=>550,8130=>548,8131=>548,8132=>548,8134=>548,8135=>548, -8136=>884,8137=>859,8138=>982,8139=>968,8140=>839,8141=>500,8142=>500,8143=>500,8144=>320,8145=>320, -8146=>320,8147=>320,8150=>320,8151=>320,8152=>389,8153=>389,8154=>599,8155=>592,8157=>500,8158=>500, -8159=>500,8160=>536,8161=>536,8162=>536,8163=>536,8164=>536,8165=>536,8166=>536,8167=>536,8168=>722, -8169=>722,8170=>1007,8171=>932,8172=>842,8173=>550,8174=>550,8175=>500,8178=>715,8179=>715,8180=>715, -8182=>715,8183=>715,8184=>971,8185=>853,8186=>1004,8187=>875,8188=>862,8189=>500,8190=>500,8192=>500, -8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250,8201=>200,8202=>100, -8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500,8213=>1000,8214=>333, -8215=>478,8219=>250,8223=>500,8227=>560,8228=>250,8229=>478,8231=>0,8232=>0,8233=>0,8234=>0, -8235=>0,8236=>0,8237=>0,8238=>250,8239=>0,8241=>1618,8242=>278,8243=>556,8244=>834,8245=>270, -8246=>468,8247=>630,8248=>469,8251=>727,8252=>778,8253=>733,8254=>500,8255=>953,8256=>953,8257=>338, -8258=>931,8259=>333,8260=>167,8261=>332,8262=>332,8263=>1000,8264=>889,8265=>889,8266=>500,8267=>453, -8268=>479,8269=>492,8270=>500,8271=>333,8272=>953,8273=>500,8274=>521,8275=>576,8276=>953,8277=>785, -8278=>410,8279=>881,8280=>620,8281=>620,8282=>179,8283=>621,8284=>569,8285=>179,8286=>179,8287=>111, -8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>300,8305=>219,8308=>300,8309=>300,8310=>300, -8311=>300,8312=>300,8313=>300,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216,8319=>300,8320=>300, -8321=>274,8322=>300,8323=>300,8324=>300,8325=>300,8326=>300,8327=>300,8328=>300,8329=>300,8330=>300, -8331=>300,8332=>300,8333=>216,8334=>216,8352=>667,8353=>667,8354=>667,8355=>667,8356=>500,8357=>742, -8358=>722,8359=>1008,8360=>953,8361=>889,8362=>889,8363=>532,8365=>742,8366=>631,8369=>609,8370=>639, -8371=>742,8372=>576,8373=>500,8448=>664,8449=>665,8451=>925,8453=>693,8454=>787,8455=>631,8457=>867, -8462=>556,8463=>556,8468=>778,8470=>806,8471=>747,8480=>879,8481=>1050,8483=>667,8486=>741,8487=>741, -8489=>320,8490=>664,8491=>667,8494=>551,8495=>444,8498=>667,8500=>500,8501=>537,8502=>537,8503=>350, -8504=>537,8506=>942,8507=>1050,8523=>698,8525=>856,8526=>462,8531=>750,8532=>750,8533=>750,8534=>750, -8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750,8541=>750,8542=>750,8543=>750,8544=>393, -8545=>786,8546=>1179,8547=>1060,8548=>667,8549=>1060,8550=>1453,8551=>1846,8552=>1060,8553=>667,8554=>1060, -8555=>1453,8556=>609,8557=>667,8558=>744,8559=>896,8560=>278,8561=>556,8562=>834,8563=>722,8564=>444, -8565=>722,8566=>1000,8567=>1278,8568=>778,8569=>500,8570=>778,8571=>1056,8572=>278,8573=>444,8574=>500, -8575=>778,8592=>964,8593=>964,8594=>964,8595=>964,8596=>964,8597=>964,8598=>964,8599=>964,8600=>964, -8601=>964,8602=>964,8603=>964,8606=>964,8607=>964,8608=>964,8609=>964,8610=>964,8611=>964,8612=>964, -8613=>964,8614=>964,8615=>964,8616=>964,8633=>964,8634=>964,8644=>964,8645=>964,8646=>964,8647=>964, -8648=>964,8649=>964,8650=>964,8676=>964,8677=>964,8706=>494,8710=>612,8721=>713,8722=>606,8725=>750, -8730=>549,8734=>752,8800=>570,8804=>570,8805=>570,9251=>500,9674=>494,9676=>732,9824=>618,9825=>645, -9826=>587,9827=>582,9828=>582,9829=>645,9830=>587,9831=>618,9833=>333,9834=>556,9835=>778,9836=>778, -9837=>556,9838=>556,9839=>556,11799=>333,64256=>583,64257=>558,64258=>551,64259=>822,64260=>818,64262=>662, -64285=>266,64286=>0,64287=>532,64288=>552,64297=>570,64298=>716,64299=>716,64300=>716,64301=>716,64302=>593, -64303=>593,64304=>593,64305=>498,64306=>339,64307=>523,64308=>561,64309=>266,64310=>291,64312=>576,64313=>266, -64314=>496,64315=>501,64316=>510,64318=>581,64320=>347,64321=>512,64323=>493,64324=>491,64326=>561,64327=>544, -64328=>502,64329=>716,64330=>571,64331=>266,64332=>498,64333=>501,64334=>491,64335=>593,65533=>788); -$enc=''; -$diff=''; -$file='freeserifbi.z'; -$ctg='freeserifbi.ctg.z'; -$originalsize=452752; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.z b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.z deleted file mode 100644 index 63125cf5..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifbi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.ctg.z deleted file mode 100644 index 1a99cb55..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.php b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.php deleted file mode 100644 index 93853603..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.php +++ /dev/null @@ -1,259 +0,0 @@ -900,'Descent'=>-300,'CapHeight'=>-29,'Flags'=>96,'FontBBox'=>'[-879 -434 1673 900]','ItalicAngle'=>-16.5,'StemV'=>70,'MissingWidth'=>600); -$up=-125; -$ut=50; -$dw=600; -$cw=array( -32=>250,33=>333,34=>420,35=>500,36=>500,37=>833,38=>778,39=>214,40=>333,41=>333, -42=>500,43=>675,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500, -52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>675,61=>675, -62=>675,63=>500,64=>920,65=>611,66=>611,67=>667,68=>722,69=>604,70=>611,71=>722, -72=>722,73=>339,74=>444,75=>652,76=>556,77=>828,78=>657,79=>722,80=>603,81=>722, -82=>616,83=>500,84=>556,85=>722,86=>611,87=>833,88=>611,89=>556,90=>556,91=>389, -92=>278,93=>389,94=>422,95=>500,96=>333,97=>500,98=>500,99=>444,100=>500,101=>444, -102=>278,103=>500,104=>500,105=>278,106=>278,107=>444,108=>278,109=>722,110=>500,111=>500, -112=>500,113=>500,114=>389,115=>389,116=>278,117=>500,118=>444,119=>667,120=>444,121=>444, -122=>389,123=>400,124=>275,125=>400,126=>541,8364=>741,8218=>250,402=>278,8222=>444,8230=>889, -8224=>500,8225=>500,710=>333,8240=>1000,352=>500,8249=>250,338=>944,381=>556,8216=>250,8217=>250, -8220=>444,8221=>444,8226=>350,8211=>500,8212=>1000,732=>333,8482=>980,353=>389,8250=>250,339=>667, -382=>389,376=>556,160=>250,161=>389,162=>500,163=>500,164=>500,165=>500,166=>275,167=>500, -168=>333,169=>760,170=>276,171=>444,172=>675,173=>333,174=>760,175=>333,176=>400,177=>675, -178=>300,179=>300,180=>333,181=>500,182=>523,183=>250,184=>333,185=>250,186=>310,187=>444, -188=>750,189=>750,190=>750,191=>500,192=>611,193=>611,194=>611,195=>611,196=>611,197=>611, -198=>889,199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333, -208=>722,209=>667,210=>722,211=>722,212=>722,213=>722,214=>722,215=>675,216=>722,217=>722, -218=>722,219=>722,220=>722,221=>556,222=>611,223=>500,224=>500,225=>500,226=>500,227=>500, -228=>500,229=>500,230=>667,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278, -238=>278,239=>278,240=>500,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>675, -248=>500,249=>500,250=>500,251=>500,252=>500,253=>444,254=>500,255=>444,256=>611,257=>500, -258=>611,259=>500,260=>611,261=>500,262=>667,263=>444,264=>667,265=>444,266=>667,267=>444, -268=>667,269=>444,270=>722,271=>500,272=>722,273=>500,274=>611,275=>444,276=>611,277=>444, -278=>611,279=>444,280=>611,281=>444,282=>611,283=>444,284=>722,285=>500,286=>722,287=>500, -288=>722,289=>500,290=>722,291=>500,292=>722,293=>500,294=>722,295=>500,296=>333,297=>278, -298=>333,299=>278,300=>333,301=>278,302=>333,303=>278,304=>333,305=>278,306=>707,307=>553, -308=>444,309=>278,310=>667,311=>444,312=>444,313=>556,314=>278,315=>556,316=>278,317=>556, -318=>278,319=>556,320=>278,321=>556,322=>278,323=>667,324=>500,325=>667,326=>500,327=>667, -328=>500,329=>500,330=>667,331=>500,332=>722,333=>500,334=>722,335=>500,336=>722,337=>500, -340=>611,341=>389,342=>611,343=>389,344=>611,345=>389,346=>500,347=>389,348=>500,349=>389, -350=>500,351=>389,354=>556,355=>278,356=>556,357=>278,358=>556,359=>278,360=>722,361=>500, -362=>722,363=>500,364=>722,365=>500,366=>722,367=>500,368=>722,369=>500,370=>722,371=>500, -372=>833,373=>667,374=>556,375=>444,377=>556,378=>389,379=>556,380=>389,383=>278,384=>500, -385=>781,386=>610,387=>551,388=>611,389=>549,390=>667,391=>866,392=>703,393=>722,394=>892, -395=>682,396=>500,397=>520,398=>611,399=>722,400=>518,401=>611,403=>863,404=>611,405=>728, -406=>278,407=>333,408=>792,409=>444,410=>278,411=>480,412=>900,413=>779,414=>500,415=>722, -416=>932,417=>608,418=>908,419=>722,420=>772,421=>500,422=>611,423=>500,424=>389,425=>657, -426=>461,427=>313,428=>556,429=>335,430=>556,431=>948,432=>721,433=>747,434=>755,435=>636, -436=>549,437=>556,438=>389,439=>525,440=>556,441=>424,442=>416,443=>500,444=>615,445=>439, -446=>389,447=>500,448=>275,449=>500,450=>600,451=>333,452=>1278,453=>1111,454=>889,455=>1000, -456=>834,457=>556,458=>1101,459=>935,460=>778,461=>611,462=>500,463=>339,464=>278,465=>722, -466=>500,467=>722,468=>500,469=>722,470=>500,471=>722,472=>500,473=>722,474=>500,475=>722, -476=>500,477=>444,478=>611,479=>500,480=>611,481=>500,482=>889,483=>667,484=>722,485=>500, -486=>722,487=>500,488=>652,489=>444,490=>730,491=>500,492=>730,493=>500,494=>525,495=>446, -496=>278,497=>1278,498=>1111,499=>889,500=>817,501=>595,502=>944,503=>607,504=>657,505=>500, -506=>611,507=>500,508=>889,509=>667,510=>722,511=>500,512=>611,513=>500,514=>611,515=>500, -516=>604,517=>444,518=>604,519=>444,520=>339,521=>278,522=>339,523=>278,524=>722,525=>500, -526=>722,527=>500,528=>616,529=>389,530=>616,531=>389,532=>722,533=>500,534=>722,535=>500, -536=>500,537=>389,538=>556,539=>278,540=>424,541=>455,542=>722,543=>500,544=>781,545=>588, -546=>568,547=>468,548=>611,549=>444,550=>611,551=>500,552=>604,553=>444,554=>722,555=>500, -556=>722,557=>500,558=>722,559=>500,560=>722,561=>500,562=>556,563=>444,564=>405,565=>597, -566=>377,567=>278,568=>775,569=>767,570=>722,571=>667,572=>444,573=>611,574=>611,575=>389, -576=>444,577=>444,578=>444,579=>667,580=>750,581=>697,582=>611,583=>444,584=>389,585=>278, -586=>796,587=>590,588=>667,589=>333,590=>722,591=>500,592=>500,593=>564,594=>564,595=>500, -596=>444,597=>444,598=>500,599=>697,600=>444,601=>444,602=>722,603=>416,604=>426,605=>674, -606=>454,607=>278,608=>640,609=>500,610=>484,611=>500,612=>582,613=>500,614=>500,615=>500, -616=>278,617=>278,618=>278,619=>278,620=>278,621=>278,622=>556,623=>722,624=>722,625=>716, -626=>500,627=>500,628=>500,629=>500,630=>668,631=>693,632=>640,633=>389,634=>389,635=>333, -636=>389,637=>333,638=>333,639=>333,640=>487,641=>487,642=>389,643=>278,644=>500,645=>333, -646=>500,647=>278,648=>278,649=>500,650=>517,651=>500,652=>444,653=>667,654=>444,655=>510, -656=>524,657=>444,658=>446,659=>456,660=>444,661=>444,662=>444,663=>444,664=>722,665=>442, -666=>454,667=>665,668=>585,669=>347,670=>444,671=>443,672=>500,673=>444,674=>444,675=>798, -676=>795,677=>805,678=>554,679=>561,680=>678,681=>614,682=>554,683=>554,684=>500,685=>500, -686=>611,687=>611,688=>300,689=>300,690=>278,691=>278,692=>278,693=>309,694=>306,695=>432, -696=>310,697=>250,698=>408,699=>333,700=>500,701=>500,702=>333,703=>333,704=>258,705=>258, -706=>374,707=>374,708=>383,709=>383,711=>333,712=>250,713=>333,714=>333,715=>333,716=>250, -717=>333,718=>333,719=>333,720=>278,721=>278,722=>333,723=>333,724=>333,725=>333,726=>333, -727=>333,728=>333,729=>333,730=>333,731=>333,733=>333,734=>336,735=>352,736=>311,737=>200, -738=>243,739=>328,740=>300,741=>460,742=>460,743=>460,744=>460,745=>460,746=>477,747=>475, -748=>339,749=>330,750=>444,751=>383,752=>383,753=>294,754=>294,755=>327,756=>261,757=>437, -758=>437,759=>333,760=>278,761=>175,762=>175,763=>175,764=>175,765=>337,766=>337,767=>326, -768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0, -778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0, -788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0, -798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0, -808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0, -818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0, -828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0, -838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0, -848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0, -858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0, -868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0, -878=>0,879=>0,884=>199,885=>199,890=>332,894=>333,900=>257,901=>333,902=>661,903=>250, -904=>841,905=>950,906=>559,908=>815,910=>877,911=>899,912=>270,913=>661,914=>581,915=>611, -916=>660,917=>611,918=>606,919=>742,920=>672,921=>333,922=>667,923=>641,924=>833,925=>657, -926=>678,927=>682,928=>749,929=>611,931=>657,932=>596,933=>676,934=>722,935=>611,936=>812, -937=>743,938=>333,939=>696,940=>564,941=>416,942=>506,943=>270,944=>504,945=>564,946=>509, -947=>496,948=>520,949=>416,950=>398,951=>506,952=>533,953=>270,954=>491,955=>488,956=>501, -957=>486,958=>430,959=>510,960=>608,961=>506,962=>423,963=>524,964=>425,965=>504,966=>618, -967=>459,968=>693,969=>693,970=>270,971=>504,972=>510,973=>504,974=>693,976=>534,977=>587, -978=>620,979=>820,980=>620,981=>640,982=>684,983=>504,984=>555,985=>534,986=>548,987=>496, -988=>610,989=>470,990=>633,991=>410,992=>687,993=>544,1008=>534,1009=>534,1010=>485,1011=>278, -1012=>722,1013=>280,1014=>280,1015=>610,1016=>500,1017=>704,1018=>832,1019=>703,1020=>533,1021=>704, -1022=>704,1023=>704,1024=>604,1025=>604,1026=>668,1027=>611,1028=>666,1029=>500,1030=>339,1031=>339, -1032=>444,1033=>972,1034=>977,1035=>703,1036=>664,1037=>720,1038=>728,1039=>728,1040=>611,1041=>610, -1042=>611,1043=>611,1044=>682,1045=>604,1046=>976,1047=>592,1048=>720,1049=>720,1050=>664,1051=>719, -1052=>828,1053=>722,1054=>722,1055=>749,1056=>603,1057=>667,1058=>556,1059=>728,1060=>722,1061=>611, -1062=>728,1063=>666,1064=>997,1065=>1005,1066=>710,1067=>891,1068=>594,1069=>632,1070=>1024,1071=>696, -1072=>500,1073=>500,1074=>442,1075=>344,1076=>503,1077=>440,1078=>932,1079=>402,1080=>500,1081=>500, -1082=>491,1083=>487,1084=>624,1085=>500,1086=>500,1087=>500,1088=>500,1089=>441,1090=>722,1091=>500, -1092=>741,1093=>444,1094=>500,1095=>500,1096=>750,1097=>750,1098=>545,1099=>683,1100=>433,1101=>432, -1102=>700,1103=>503,1104=>440,1105=>440,1106=>500,1107=>344,1108=>442,1109=>389,1110=>278,1111=>278, -1112=>278,1113=>686,1114=>696,1115=>500,1116=>491,1117=>500,1118=>500,1119=>500,1120=>964,1121=>684, -1122=>708,1123=>690,1124=>975,1125=>646,1126=>800,1127=>628,1128=>1096,1129=>795,1130=>952,1131=>730, -1132=>1260,1133=>892,1134=>574,1135=>400,1136=>812,1137=>694,1138=>721,1139=>500,1140=>745,1141=>533, -1142=>745,1143=>533,1144=>1193,1145=>967,1146=>868,1147=>602,1148=>964,1149=>684,1150=>964,1151=>684, -1152=>548,1153=>443,1154=>320,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0, -1162=>720,1163=>500,1164=>602,1165=>433,1166=>611,1167=>500,1168=>552,1169=>424,1170=>593,1171=>424, -1172=>611,1173=>432,1174=>992,1175=>932,1176=>592,1177=>396,1178=>681,1179=>491,1180=>700,1181=>532, -1182=>664,1183=>491,1184=>776,1185=>690,1186=>729,1187=>500,1188=>908,1189=>660,1190=>1034,1191=>694, -1192=>667,1193=>531,1194=>666,1195=>443,1196=>556,1197=>775,1198=>556,1199=>574,1200=>555,1201=>574, -1202=>660,1203=>443,1204=>798,1205=>581,1206=>674,1207=>500,1208=>690,1209=>516,1210=>640,1211=>500, -1212=>785,1213=>558,1214=>787,1215=>559,1216=>339,1217=>976,1218=>932,1219=>664,1220=>491,1221=>719, -1222=>487,1223=>722,1224=>500,1225=>722,1226=>500,1227=>666,1228=>500,1229=>828,1230=>624,1231=>339, -1232=>611,1233=>500,1234=>611,1235=>500,1236=>889,1237=>667,1238=>604,1239=>444,1240=>722,1241=>444, -1242=>722,1243=>444,1244=>976,1245=>932,1246=>592,1247=>402,1248=>525,1249=>446,1250=>720,1251=>500, -1252=>720,1253=>500,1254=>722,1255=>500,1256=>722,1257=>500,1258=>722,1259=>500,1260=>632,1261=>432, -1262=>728,1263=>500,1264=>728,1265=>500,1266=>728,1267=>500,1268=>666,1269=>500,1270=>611,1271=>424, -1272=>891,1273=>683,1296=>532,1297=>409,1298=>719,1299=>487,1306=>722,1307=>500,1308=>833,1309=>656, -1310=>664,1311=>491,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>418,1432=>0, -1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0, -1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0, -1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0, -1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>440,1471=>0,1472=>126, -1473=>0,1474=>0,1475=>418,1476=>0,1477=>0,1478=>350,1479=>0,1488=>537,1489=>537,1490=>350, -1491=>537,1492=>537,1493=>350,1494=>350,1495=>537,1496=>537,1497=>350,1498=>537,1499=>537,1500=>537, -1501=>537,1502=>537,1503=>350,1504=>350,1505=>537,1506=>537,1507=>537,1508=>537,1509=>537,1510=>537, -1511=>537,1512=>537,1513=>537,1514=>537,1520=>537,1521=>537,1522=>537,1523=>396,1524=>396,2404=>318, -2405=>446,2433=>0,2434=>300,2435=>312,2437=>594,2438=>776,2439=>469,2440=>513,2441=>535,2442=>561, -2443=>604,2444=>481,2447=>580,2448=>604,2451=>540,2452=>620,2453=>570,2454=>485,2455=>484,2456=>471, -2457=>457,2458=>408,2459=>452,2460=>591,2461=>551,2462=>771,2463=>414,2464=>404,2465=>522,2466=>415, -2467=>450,2468=>551,2469=>477,2470=>478,2471=>449,2472=>448,2474=>535,2475=>611,2476=>443,2477=>534, -2478=>492,2479=>474,2480=>442,2482=>542,2486=>507,2487=>467,2488=>523,2489=>419,2492=>0,2493=>419, -2494=>202,2495=>189,2496=>202,2497=>0,2498=>0,2499=>0,2500=>0,2503=>294,2504=>289,2507=>774, -2508=>825,2509=>0,2510=>356,2519=>219,2524=>523,2525=>420,2527=>469,2528=>604,2529=>481,2530=>0, -2531=>0,2534=>500,2535=>437,2536=>479,2537=>507,2538=>497,2539=>500,2540=>482,2541=>503,2542=>517, -2543=>481,2544=>443,2545=>443,2546=>429,2547=>383,2548=>432,2549=>478,2550=>539,2551=>158,2552=>365, -2553=>280,2554=>357,3585=>512,3586=>453,3587=>512,3588=>519,3589=>529,3590=>561,3591=>411,3592=>437, -3593=>552,3594=>452,3595=>509,3596=>707,3597=>707,3598=>574,3599=>570,3600=>406,3601=>607,3602=>686, -3603=>749,3604=>494,3605=>497,3606=>509,3607=>552,3608=>461,3609=>565,3610=>527,3611=>523,3612=>556, -3613=>551,3614=>570,3615=>570,3616=>571,3617=>531,3618=>493,3619=>433,3620=>513,3621=>491,3622=>571, -3623=>439,3624=>510,3625=>594,3626=>484,3627=>554,3628=>616,3629=>493,3630=>496,3631=>417,3632=>392, -3633=>0,3634=>366,3635=>366,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0, -3647=>662,3648=>297,3649=>544,3650=>298,3651=>329,3652=>328,3653=>326,3654=>488,3655=>0,3656=>0, -3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>725,3664=>624,3665=>624,3666=>624, -3667=>624,3668=>624,3669=>624,3670=>624,3671=>624,3672=>624,3673=>624,3674=>645,3675=>872,4256=>453, -4257=>448,4258=>546,4259=>619,4260=>478,4261=>481,4262=>459,4263=>707,4264=>467,4265=>471,4266=>842, -4267=>464,4268=>443,4269=>707,4270=>460,4271=>465,4272=>686,4273=>440,4274=>550,4275=>561,4276=>580, -4277=>467,4278=>630,4279=>466,4280=>517,4281=>456,4282=>502,4283=>464,4284=>534,4285=>440,4286=>443, -4287=>522,4288=>460,4289=>463,4290=>536,4291=>455,4292=>468,4293=>449,4304=>454,4305=>452,4306=>544, -4307=>629,4308=>451,4309=>452,4310=>452,4311=>702,4312=>451,4313=>452,4314=>820,4315=>451,4316=>453, -4317=>695,4318=>449,4319=>448,4320=>694,4321=>501,4322=>544,4323=>517,4324=>560,4325=>450,4326=>627, -4327=>452,4328=>491,4329=>452,4330=>485,4331=>452,4332=>485,4333=>443,4334=>500,4335=>582,4336=>455, -4337=>451,4338=>480,4339=>414,4340=>453,4341=>418,4345=>544,4347=>410,5024=>711,5025=>678,5026=>604, -5027=>667,5028=>796,5029=>301,5030=>516,5031=>544,5032=>457,5033=>716,5034=>703,5035=>383,5036=>628, -5037=>709,5038=>455,5039=>601,5040=>472,5041=>574,5042=>730,5043=>939,5044=>498,5045=>528,5046=>667, -5047=>891,5048=>505,5049=>792,5050=>957,5051=>725,5052=>595,5053=>733,5054=>698,5055=>638,5056=>720, -5057=>732,5058=>624,5059=>638,5060=>565,5061=>903,5062=>655,5063=>681,5064=>675,5065=>949,5066=>683, -5067=>547,5068=>693,5069=>732,5070=>529,5071=>569,5072=>536,5073=>677,5074=>631,5075=>382,5076=>973, -5077=>543,5078=>607,5079=>652,5080=>652,5081=>693,5082=>514,5083=>803,5084=>658,5085=>597,5086=>627, -5087=>659,5088=>679,5089=>706,5090=>563,5091=>618,5092=>767,5093=>776,5094=>731,5095=>492,5096=>808, -5097=>823,5098=>796,5099=>689,5100=>716,5101=>518,5102=>521,5103=>719,5104=>563,5105=>776,5106=>634, -5107=>822,5108=>621,7680=>611,7681=>500,7682=>611,7683=>500,7684=>611,7685=>500,7686=>611,7687=>500, -7688=>667,7689=>444,7690=>722,7691=>500,7692=>722,7693=>500,7694=>722,7695=>500,7696=>722,7697=>500, -7698=>722,7699=>500,7700=>611,7701=>444,7702=>611,7703=>444,7704=>604,7705=>444,7706=>604,7707=>444, -7708=>604,7709=>444,7710=>611,7711=>278,7712=>722,7713=>500,7714=>722,7715=>500,7716=>722,7717=>500, -7718=>722,7719=>500,7720=>722,7721=>500,7722=>722,7723=>500,7724=>339,7725=>278,7726=>333,7727=>278, -7728=>652,7729=>444,7730=>652,7731=>444,7732=>652,7733=>444,7734=>556,7735=>278,7736=>556,7737=>278, -7738=>556,7739=>278,7740=>556,7741=>278,7742=>828,7743=>722,7744=>828,7745=>722,7746=>828,7747=>722, -7748=>657,7749=>500,7750=>657,7751=>500,7752=>657,7753=>500,7754=>657,7755=>500,7756=>722,7757=>500, -7758=>722,7759=>500,7760=>722,7761=>500,7762=>722,7763=>500,7764=>603,7765=>500,7766=>603,7767=>500, -7768=>616,7769=>389,7770=>616,7771=>389,7772=>616,7773=>389,7774=>616,7775=>389,7776=>500,7777=>389, -7778=>500,7779=>389,7780=>500,7781=>389,7782=>500,7783=>389,7784=>500,7785=>389,7786=>556,7787=>278, -7788=>556,7789=>278,7790=>556,7791=>278,7792=>556,7793=>278,7794=>722,7795=>500,7796=>722,7797=>500, -7798=>722,7799=>500,7800=>722,7801=>500,7802=>722,7803=>500,7804=>611,7805=>444,7806=>611,7807=>444, -7808=>833,7809=>667,7810=>833,7811=>667,7812=>833,7813=>667,7814=>833,7815=>667,7816=>833,7817=>667, -7818=>611,7819=>444,7820=>611,7821=>444,7822=>556,7823=>444,7824=>556,7825=>389,7826=>556,7827=>389, -7828=>556,7829=>389,7830=>500,7831=>278,7832=>667,7833=>444,7834=>444,7835=>278,7840=>611,7841=>500, -7842=>611,7843=>500,7844=>611,7845=>500,7846=>611,7847=>500,7848=>611,7849=>500,7850=>611,7851=>500, -7852=>611,7853=>500,7854=>611,7855=>500,7856=>611,7857=>500,7858=>611,7859=>500,7860=>611,7861=>500, -7862=>611,7863=>500,7864=>604,7865=>444,7866=>604,7867=>444,7868=>604,7869=>444,7870=>611,7871=>444, -7872=>611,7873=>444,7874=>611,7875=>444,7876=>611,7877=>444,7878=>604,7879=>444,7880=>339,7881=>278, -7882=>339,7883=>278,7884=>722,7885=>500,7886=>722,7887=>500,7888=>722,7889=>500,7890=>722,7891=>500, -7892=>722,7893=>500,7894=>722,7895=>500,7896=>722,7897=>500,7898=>932,7899=>608,7900=>932,7901=>608, -7902=>807,7903=>585,7904=>932,7905=>608,7906=>932,7907=>608,7908=>722,7909=>500,7910=>722,7911=>500, -7912=>948,7913=>721,7914=>948,7915=>721,7916=>807,7917=>585,7918=>948,7919=>721,7920=>948,7921=>721, -7922=>556,7923=>444,7924=>556,7925=>444,7926=>556,7927=>444,7928=>556,7929=>444,7936=>564,7937=>564, -7938=>564,7939=>564,7940=>564,7941=>564,7942=>564,7943=>564,7944=>661,7945=>661,7946=>794,7947=>811, -7948=>792,7949=>803,7950=>661,7951=>648,7952=>416,7953=>416,7954=>416,7955=>416,7956=>416,7957=>416, -7960=>740,7961=>795,7962=>923,7963=>940,7964=>996,7965=>986,7968=>506,7969=>506,7970=>506,7971=>506, -7972=>506,7973=>506,7974=>506,7975=>506,7976=>879,7977=>901,7978=>1036,7979=>1035,7980=>1099,7981=>1100, -7982=>954,7983=>959,7984=>270,7985=>270,7986=>267,7987=>267,7988=>267,7989=>267,7990=>267,7991=>267, -7992=>490,7993=>529,7994=>655,7995=>654,7996=>705,7997=>713,7998=>570,7999=>573,8000=>558,8001=>510, -8002=>510,8003=>510,8004=>510,8005=>510,8008=>797,8009=>867,8010=>1026,8011=>1022,8012=>993,8013=>1017, -8016=>504,8017=>504,8018=>504,8019=>504,8020=>504,8021=>504,8022=>504,8023=>504,8025=>916,8027=>1062, -8029=>1100,8031=>933,8032=>693,8033=>693,8034=>693,8035=>693,8036=>693,8037=>693,8038=>693,8039=>693, -8040=>852,8041=>909,8042=>1072,8043=>1072,8044=>1032,8045=>1047,8046=>930,8047=>946,8048=>564,8049=>564, -8050=>416,8051=>416,8052=>506,8053=>506,8054=>270,8055=>270,8056=>510,8057=>510,8058=>504,8059=>504, -8060=>693,8061=>693,8064=>564,8065=>564,8066=>564,8067=>564,8068=>564,8069=>564,8070=>564,8071=>564, -8072=>821,8073=>854,8074=>998,8075=>1011,8076=>992,8077=>1001,8078=>866,8079=>858,8080=>506,8081=>506, -8082=>506,8083=>506,8084=>506,8085=>506,8086=>506,8087=>506,8088=>999,8089=>1044,8090=>1179,8091=>1165, -8092=>1227,8093=>1229,8094=>1080,8095=>1085,8096=>693,8097=>693,8098=>693,8099=>693,8100=>693,8101=>693, -8102=>693,8103=>693,8104=>1037,8105=>1113,8106=>1264,8107=>1264,8108=>1219,8109=>1241,8110=>1120,8111=>1132, -8112=>564,8113=>564,8114=>564,8115=>564,8116=>564,8118=>564,8119=>564,8120=>661,8121=>661,8122=>661, -8123=>661,8124=>831,8125=>192,8126=>332,8127=>500,8128=>500,8129=>534,8130=>506,8131=>506,8132=>506, -8134=>506,8135=>506,8136=>611,8137=>816,8138=>889,8139=>908,8140=>881,8141=>500,8142=>500,8143=>500, -8144=>270,8145=>270,8146=>270,8147=>270,8150=>270,8151=>270,8152=>333,8153=>333,8154=>497,8155=>521, -8157=>500,8158=>500,8159=>500,8160=>504,8161=>504,8162=>504,8163=>504,8164=>506,8165=>506,8166=>504, -8167=>504,8168=>676,8169=>676,8170=>905,8171=>901,8172=>783,8173=>333,8174=>333,8175=>500,8178=>693, -8179=>693,8180=>693,8182=>693,8183=>693,8184=>907,8185=>833,8186=>963,8187=>875,8188=>952,8189=>500, -8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250, -8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500, -8213=>1000,8214=>293,8215=>465,8219=>250,8223=>444,8227=>350,8228=>250,8229=>500,8231=>250,8232=>0, -8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>250,8241=>1601,8242=>247,8243=>411, -8244=>611,8245=>220,8246=>440,8247=>660,8248=>469,8251=>629,8252=>666,8253=>500,8254=>500,8255=>953, -8256=>1000,8257=>314,8258=>931,8259=>333,8260=>167,8261=>480,8262=>480,8263=>1000,8264=>833,8265=>833, -8266=>500,8267=>453,8268=>453,8269=>450,8270=>500,8271=>278,8272=>882,8273=>500,8274=>497,8275=>500, -8276=>953,8277=>512,8278=>410,8279=>855,8280=>620,8281=>620,8282=>179,8283=>621,8284=>564,8285=>179, -8286=>179,8287=>111,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>300,8305=>235,8308=>300, -8309=>300,8310=>300,8311=>300,8312=>300,8313=>300,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216, -8319=>318,8320=>300,8321=>250,8322=>300,8323=>300,8324=>300,8325=>300,8326=>300,8327=>300,8328=>300, -8329=>300,8330=>300,8331=>300,8332=>300,8333=>216,8334=>216,8352=>698,8353=>667,8354=>667,8355=>611, -8356=>500,8357=>722,8358=>667,8359=>988,8360=>953,8361=>833,8362=>869,8363=>512,8365=>722,8366=>611, -8369=>589,8370=>619,8371=>722,8372=>556,8373=>611,8400=>0,8401=>0,8402=>0,8403=>0,8404=>0, -8405=>0,8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0,8412=>0,8413=>0,8414=>0, -8415=>0,8416=>0,8417=>0,8418=>0,8419=>0,8420=>0,8421=>0,8422=>0,8423=>0,8424=>0, -8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>664,8449=>665, -8451=>954,8453=>693,8454=>787,8457=>822,8462=>500,8463=>500,8468=>777,8470=>823,8471=>760,8478=>616, -8479=>610,8480=>879,8481=>1156,8483=>611,8486=>743,8487=>743,8489=>286,8490=>722,8491=>722,8494=>533, -8498=>556,8501=>537,8502=>537,8503=>350,8504=>537,8506=>906,8507=>1155,8523=>778,8525=>856,8526=>500, -8531=>750,8532=>750,8533=>750,8534=>750,8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750, -8541=>750,8542=>750,8543=>750,8544=>339,8545=>678,8546=>1017,8547=>950,8548=>611,8549=>950,8550=>1289, -8551=>1628,8552=>950,8553=>611,8554=>950,8555=>1289,8556=>556,8557=>667,8558=>722,8559=>828,8560=>278, -8561=>556,8562=>834,8563=>722,8564=>444,8565=>722,8566=>1000,8567=>1278,8568=>722,8569=>444,8570=>722, -8571=>1000,8572=>278,8573=>444,8574=>500,8575=>722,8592=>964,8593=>499,8594=>964,8595=>499,8706=>494, -8710=>612,8721=>713,8722=>675,8723=>675,8725=>750,8730=>549,8734=>677,8747=>416,8748=>750,8749=>1083, -8750=>722,8751=>750,8800=>564,8804=>675,8805=>675,8992=>686,8993=>686,9251=>500,9674=>494,9676=>791, -9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>555, -9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,11799=>333,64256=>526,64257=>500,64258=>500,64259=>747, -64260=>748,64262=>665,64285=>350,64286=>0,64287=>537,64288=>537,64297=>564,64298=>537,64299=>537,64300=>537, -64301=>537,64302=>537,64303=>537,64304=>537,64305=>537,64306=>350,64307=>537,64308=>537,64309=>350,64310=>350, -64312=>537,64313=>350,64314=>537,64315=>537,64316=>537,64318=>537,64320=>350,64321=>537,64323=>537,64324=>537, -64326=>537,64327=>537,64328=>537,64329=>537,64330=>537,64331=>350,64332=>537,64333=>537,64334=>537,64335=>537, -65533=>788); -$enc=''; -$diff=''; -$file='freeserifi.z'; -$ctg='freeserifi.ctg.z'; -$originalsize=629968; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.z b/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.z deleted file mode 100644 index c191bde4..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/freeserifi.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/helvetica.php b/include/limesurvey/admin/classes/tcpdf/fonts/helvetica.php deleted file mode 100644 index c5eba6d6..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/helvetica.php +++ /dev/null @@ -1,33 +0,0 @@ -278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278, -10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278, -20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278, -30=>278,31=>278,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191, -40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556, -50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278, -60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667, -70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778, -80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667, -90=>611,91=>278,92=>278,93=>278,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500, -100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222, -109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556, -118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584, -127=>350,128=>556,129=>350,130=>222,131=>556,132=>333,133=>1000,134=>556,135=>556, -136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350, -145=>222,146=>222,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000, -154=>500,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556, -163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556, -172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333, -181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834, -190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000, -199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778, -217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, -226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556, -235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556, -244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556, -253=>500,254=>556,255=>500); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/helveticab.php b/include/limesurvey/admin/classes/tcpdf/fonts/helveticab.php deleted file mode 100644 index 8635a727..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/helveticab.php +++ /dev/null @@ -1,33 +0,0 @@ -278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278, -10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278, -20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278, -30=>278,31=>278,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238, -40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556, -50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333, -60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667, -70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778, -80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667, -90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556, -100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278, -109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611, -118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584, -127=>350,128=>556,129=>350,130=>278,131=>556,132=>500,133=>1000,134=>556,135=>556, -136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350, -145=>278,146=>278,147=>500,148=>500,149=>350,150=>556,151=>1000,152=>333,153=>1000, -154=>556,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556, -163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556, -172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333, -181=>611,182=>556,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834, -190=>834,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000, -199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778, -217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, -226=>556,227=>556,228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556, -235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611, -244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611, -253=>556,254=>611,255=>556); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/helveticabi.php b/include/limesurvey/admin/classes/tcpdf/fonts/helveticabi.php deleted file mode 100644 index 8635a727..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/helveticabi.php +++ /dev/null @@ -1,33 +0,0 @@ -278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278, -10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278, -20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278, -30=>278,31=>278,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238, -40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556, -50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333, -60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667, -70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778, -80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667, -90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556, -100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278, -109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611, -118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584, -127=>350,128=>556,129=>350,130=>278,131=>556,132=>500,133=>1000,134=>556,135=>556, -136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350, -145=>278,146=>278,147=>500,148=>500,149=>350,150=>556,151=>1000,152=>333,153=>1000, -154=>556,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556, -163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556, -172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333, -181=>611,182=>556,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834, -190=>834,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000, -199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778, -217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, -226=>556,227=>556,228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556, -235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611, -244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611, -253=>556,254=>611,255=>556); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/helveticai.php b/include/limesurvey/admin/classes/tcpdf/fonts/helveticai.php deleted file mode 100644 index c5eba6d6..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/helveticai.php +++ /dev/null @@ -1,33 +0,0 @@ -278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278, -10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278, -20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278, -30=>278,31=>278,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191, -40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556, -50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278, -60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667, -70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778, -80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667, -90=>611,91=>278,92=>278,93=>278,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500, -100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222, -109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556, -118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584, -127=>350,128=>556,129=>350,130=>222,131=>556,132=>333,133=>1000,134=>556,135=>556, -136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350, -145=>222,146=>222,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000, -154=>500,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556, -163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556, -172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333, -181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834, -190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000, -199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778, -217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, -226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556, -235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556, -244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556, -253=>500,254=>556,255=>500); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/hysmyeongjostdmedium.php b/include/limesurvey/admin/classes/tcpdf/fonts/hysmyeongjostdmedium.php deleted file mode 100644 index 9e8b23b4..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/hysmyeongjostdmedium.php +++ /dev/null @@ -1,48 +0,0 @@ - 880, - 'Descent' => -120, - 'CapHeight' => 720, - 'Flags' => 6, - 'FontBBox' => '[-28 -148 1001 880]', - 'ItalicAngle' => 0, - 'StemV' => 60, - 'Style' => '<< /Panose <000000000600000000000000> >>', -); -$cidinfo = array( - 'Registry' => 'Adobe', - 'Ordering' => 'Korea1', - 'Supplement' => '1', -); -$enc = 'UniKS-UCS2-H'; - -// underline position, needs checking: -$up = -130; -$ut = 40; - -$dw = 1000; -$cw = array( - 32 => 333, 33 => 416, 34 => 416, 35 => 833, 36 => 625, 37 => 916, 38 => 833, 39 => 250, 40 => 500, 41 => 500, - 42 => 500, 43 => 833, 44 => 291, 45 => 450, 46 => 291, 47 => 375, 48 => 625, 49 => 625, 50 => 625, 51 => 625, - 52 => 625, 53 => 625, 54 => 625, 55 => 625, 56 => 625, 57 => 625, 58 => 333, 59 => 333, 60 => 833, 61 => 833, - 62 => 916, 63 => 500, 64 => 1000, 65 => 791, 66 => 708, 67 => 708, 68 => 750, 69 => 708, 70 => 666, 71 => 750, - 72 => 791, 73 => 375, 74 => 500, 75 => 791, 76 => 666, 77 => 916, 78 => 791, 79 => 750, 80 => 666, 81 => 750, - 82 => 708, 83 => 666, 84 => 791, 85 => 791, 86 => 750, 87 => 1000, 88 => 708, 89 => 708, 90 => 666, 91 => 500, - 92 => 375, 93 => 500, 94 => 500, 95 => 500, 96 => 333, 97 => 541, 98 => 583, 99 => 541, 100 => 583, 101 => 583, - 102 => 375, 103 => 583, 104 => 583, 105 => 291, 106 => 333, 107 => 583, 108 => 291, 109 => 875, 110 => 583, 111 => 583, - 112 => 583, 113 => 583, 114 => 458, 115 => 541, 116 => 375, 117 => 583, 118 => 583, 119 => 833, 120 => 625, 121 => 625, - 122 => 500, 123 => 583, 124 => 583, 125 => 583, 126 => 750, -); -$_cr = array( - //array(97, 97, 500), - array(8094, 8190, 500) -); -foreach($_cr as $_r) { - for($i = $_r[0]; $i <= $_r[1]; $i++) { - $cw[$i+31] = $_r[2]; - } -} -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/kozgopromedium.php b/include/limesurvey/admin/classes/tcpdf/fonts/kozgopromedium.php deleted file mode 100644 index 72783b76..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/kozgopromedium.php +++ /dev/null @@ -1,65 +0,0 @@ - 880, - 'Descent' => -120, - 'CapHeight' => 763, - 'Flags' => 4, - 'FontBBox' => '[-149 -374 1254 1008]', - 'ItalicAngle' => 0, - 'StemV' => 99, - 'Style' => '<< /Panose <0000020b0700000000000000> >>', - 'XHeight' => 549, -); -$cidinfo = array( - 'Registry' => 'Adobe', - 'Ordering' => 'Japan1', - 'Supplement' => '4', -); -$enc = 'UniJIS-UCS2-H'; - -// underline position, needs checking: -$up = -75; -$ut = 50; - -$dw = 1000; -$cw = array( - 32 => 224, 33 => 266, 34 => 392, 35 => 551, 36 => 562, 37 => 883, 38 => 677, 39 => 213, 40 => 322, 41 => 322, - 42 => 470, 43 => 677, 44 => 247, 45 => 343, 46 => 245, 47 => 370, 48 => 562, 49 => 562, 50 => 562, 51 => 562, - 52 => 562, 53 => 562, 54 => 562, 55 => 562, 56 => 562, 57 => 562, 58 => 245, 59 => 247, 60 => 677, 61 => 677, - 62 => 677, 63 => 447, 64 => 808, 65 => 661, 66 => 602, 67 => 610, 68 => 708, 69 => 535, 70 => 528, 71 => 689, - 72 => 703, 73 => 275, 74 => 404, 75 => 602, 76 => 514, 77 => 871, 78 => 708, 79 => 727, 80 => 585, 81 => 727, - 82 => 595, 83 => 539, 84 => 541, 85 => 696, 86 => 619, 87 => 922, 88 => 612, 89 => 591, 90 => 584, 91 => 322, - 92 => 562, 93 => 322, 94 => 677, 95 => 568, 96 => 340, 97 => 532, 98 => 612, 99 => 475, 100 => 608, 101 => 543, - 102 => 332, 103 => 603, 104 => 601, 105 => 265, 106 => 276, 107 => 524, 108 => 264, 109 => 901, 110 => 601, 111 => 590, - 112 => 612, 113 => 607, 114 => 367, 115 => 433, 116 => 369, 117 => 597, 118 => 527, 119 => 800, 120 => 511, 121 => 518, - 122 => 468, 123 => 321, 124 => 273, 125 => 321, 126 => 341, 127 => 241, 128 => 362, 129 => 241, 130 => 273, 131 => 677, - 132 => 266, 133 => 562, 134 => 562, 135 => 456, 136 => 562, 137 => 571, 138 => 562, 139 => 416, 140 => 472, 141 => 283, - 142 => 283, 143 => 587, 144 => 588, 145 => 568, 146 => 545, 147 => 545, 148 => 247, 149 => 561, 150 => 330, 151 => 239, - 152 => 418, 153 => 416, 154 => 472, 155 => 1136, 156 => 1288, 157 => 447, 158 => 340, 159 => 340, 160 => 340, 161 => 340, - 162 => 340, 163 => 340, 164 => 455, 165 => 340, 166 => 340, 167 => 340, 168 => 340, 169 => 1136, 170 => 857, 171 => 384, - 172 => 519, 173 => 727, 174 => 952, 175 => 398, 176 => 834, 177 => 264, 178 => 275, 179 => 590, 180 => 918, 181 => 605, - 182 => 677, 183 => 769, 184 => 677, 185 => 473, 186 => 361, 187 => 677, 188 => 347, 189 => 340, 190 => 599, 191 => 284, - 192 => 845, 193 => 845, 194 => 845, 195 => 661, 196 => 661, 197 => 661, 198 => 661, 199 => 661, 200 => 661, 201 => 610, - 202 => 535, 203 => 535, 204 => 535, 205 => 535, 206 => 275, 207 => 275, 208 => 275, 209 => 275, 210 => 715, 211 => 708, - 212 => 727, 213 => 727, 214 => 727, 215 => 727, 216 => 727, 217 => 677, 218 => 696, 219 => 696, 220 => 696, 221 => 696, - 222 => 591, 223 => 584, 224 => 532, 225 => 532, 226 => 532, 227 => 532, 228 => 532, 229 => 532, 230 => 475, 231 => 543, - 232 => 543, 233 => 543, 234 => 543, 235 => 264, 236 => 264, 237 => 264, 238 => 264, 239 => 584, 240 => 601, 241 => 590, - 242 => 590, 243 => 590, 244 => 590, 245 => 590, 246 => 677, 247 => 597, 248 => 597, 249 => 597, 250 => 597, 251 => 518, - 252 => 612, 253 => 518, 254 => 539, 255 => 591, 256 => 584, 257 => 446, 258 => 433, 259 => 683, 260 => 468, 261 => 562, -); -$_cr = array( - array(231, 632, 500), // half-width - array(8718, 8718, 500), - array(9738, 9757, 250), // quarter-width - array(9758, 9778, 333), // third-width - array(12063, 12087, 500) -); -foreach($_cr as $_r) { - for($i = $_r[0]; $i <= $_r[1]; $i++) { - $cw[$i+31] = $_r[2]; - } -} -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/kozminproregular.php b/include/limesurvey/admin/classes/tcpdf/fonts/kozminproregular.php deleted file mode 100644 index c308d41d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/kozminproregular.php +++ /dev/null @@ -1,63 +0,0 @@ - 880, - 'Descent' => -120, - 'CapHeight' => 740, - 'Flags' => 6, - 'FontBBox' => '[-195 -272 1110 1075]', - 'ItalicAngle' => 0, - 'StemV' => 86, - 'XHeight' => 502, -); -$cidinfo = array( - 'Registry' => 'Adobe', - 'Ordering' => 'Japan1', - 'Supplement' => '4', -); -$enc = 'UniJIS-UCS2-H'; - -$up = -75; -$ut = 50; - -$dw = 1000; -$cw = array( - 32 => 278, 33 => 299, 34 => 353, 35 => 614, 36 => 614, 37 => 721, 38 => 735, 39 => 216, 40 => 323, 41 => 323, - 42 => 449, 43 => 529, 44 => 219, 45 => 306, 46 => 219, 47 => 453, 48 => 614, 49 => 614, 50 => 614, 51 => 614, - 52 => 614, 53 => 614, 54 => 614, 55 => 614, 56 => 614, 57 => 614, 58 => 219, 59 => 219, 60 => 529, 61 => 529, - 62 => 529, 63 => 486, 64 => 744, 65 => 646, 66 => 604, 67 => 617, 68 => 681, 69 => 567, 70 => 537, 71 => 647, - 72 => 738, 73 => 320, 74 => 433, 75 => 637, 76 => 566, 77 => 904, 78 => 710, 79 => 716, 80 => 605, 81 => 716, - 82 => 623, 83 => 517, 84 => 601, 85 => 690, 86 => 668, 87 => 990, 88 => 681, 89 => 634, 90 => 578, 91 => 316, - 92 => 614, 93 => 316, 94 => 529, 95 => 500, 96 => 387, 97 => 509, 98 => 566, 99 => 478, 100 => 565, 101 => 503, - 102 => 337, 103 => 549, 104 => 580, 105 => 275, 106 => 266, 107 => 544, 108 => 276, 109 => 854, 110 => 579, 111 => 550, - 112 => 578, 113 => 566, 114 => 410, 115 => 444, 116 => 340, 117 => 575, 118 => 512, 119 => 760, 120 => 503, 121 => 529, - 122 => 453, 123 => 326, 124 => 380, 125 => 326, 126 => 387, 127 => 216, 128 => 453, 129 => 216, 130 => 380, 131 => 529, - 132 => 299, 133 => 614, 134 => 614, 135 => 265, 136 => 614, 137 => 475, 138 => 614, 139 => 353, 140 => 451, 141 => 291, - 142 => 291, 143 => 588, 144 => 589, 145 => 500, 146 => 476, 147 => 476, 148 => 219, 149 => 494, 150 => 452, 151 => 216, - 152 => 353, 153 => 353, 154 => 451, 156 => 1075, 157 => 486, 158 => 387, 159 => 387, 160 => 387, 161 => 387, - 162 => 387, 163 => 387, 164 => 387, 165 => 387, 166 => 387, 167 => 387, 168 => 387, 170 => 880, 171 => 448, - 172 => 566, 173 => 716, 174 => 903, 175 => 460, 176 => 805, 177 => 275, 178 => 276, 179 => 550, 180 => 886, 181 => 582, - 182 => 529, 183 => 738, 184 => 529, 185 => 738, 186 => 357, 187 => 529, 188 => 406, 189 => 406, 190 => 575, 191 => 406, - 192 => 934, 193 => 934, 194 => 934, 195 => 646, 196 => 646, 197 => 646, 198 => 646, 199 => 646, 200 => 646, 201 => 617, - 202 => 567, 203 => 567, 204 => 567, 205 => 567, 206 => 320, 207 => 320, 208 => 320, 209 => 320, 210 => 681, 211 => 710, - 212 => 716, 213 => 716, 214 => 716, 215 => 716, 216 => 716, 217 => 529, 218 => 690, 219 => 690, 220 => 690, 221 => 690, - 222 => 634, 223 => 605, 224 => 509, 225 => 509, 226 => 509, 227 => 509, 228 => 509, 229 => 509, 230 => 478, 231 => 503, - 232 => 503, 233 => 503, 234 => 503, 235 => 275, 236 => 275, 237 => 275, 238 => 275, 239 => 550, 240 => 579, 241 => 550, - 242 => 550, 243 => 550, 244 => 550, 245 => 550, 246 => 529, 247 => 575, 248 => 575, 249 => 575, 250 => 575, 251 => 529, - 252 => 578, 253 => 529, 254 => 517, 255 => 634, 256 => 578, 257 => 445, 258 => 444, 259 => 842, 260 => 453, 261 => 614, -); -$_cr = array( - array(231, 632, 500), // half-width - array(8718, 8718, 500), - array(9738, 9757, 250), // quarter-width - array(9758, 9778, 333), // third-width - array(12063, 12087, 500), -); -foreach($_cr as $_r) { - for($i = $_r[0]; $i <= $_r[1]; $i++) { - $cw[$i+31] = $_r[2]; - } -} -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/msungstdlight.php b/include/limesurvey/admin/classes/tcpdf/fonts/msungstdlight.php deleted file mode 100644 index a71ea295..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/msungstdlight.php +++ /dev/null @@ -1,38 +0,0 @@ - 880, - 'Descent' => -120, - 'CapHeight' => 880, - 'Flags' => 6, - 'FontBBox' => '[-160 -249 1015 1071]', - 'ItalicAngle' => 0, - 'StemV' => 93, -); -$cidinfo = array( - 'Registry' => 'Adobe', - 'Ordering' => 'CNS1', - 'Supplement' => '3', -); -$enc = 'UniCNS-UCS2-H'; - -$up = -130; -$ut = 40; - -$dw = 1000; -$cw = array( - 32 => 250, 33 => 250, 34 => 408, 35 => 668, 36 => 490, 37 => 875, 38 => 698, 39 => 250, 40 => 240, 41 => 240, - 42 => 417, 43 => 667, 44 => 250, 45 => 313, 46 => 250, 47 => 520, 48 => 500, 49 => 500, 50 => 500, 51 => 500, - 52 => 500, 53 => 500, 54 => 500, 55 => 500, 56 => 500, 57 => 500, 58 => 250, 59 => 250, 60 => 667, 61 => 667, - 62 => 667, 63 => 396, 64 => 921, 65 => 677, 66 => 615, 67 => 719, 68 => 760, 69 => 625, 70 => 552, 71 => 771, - 72 => 802, 73 => 354, 74 => 354, 75 => 781, 76 => 604, 77 => 927, 78 => 750, 79 => 823, 80 => 563, 81 => 823, - 82 => 729, 83 => 542, 84 => 698, 85 => 771, 86 => 729, 87 => 948, 88 => 771, 89 => 677, 90 => 635, 91 => 344, - 92 => 520, 93 => 344, 94 => 469, 95 => 500, 96 => 250, 97 => 469, 98 => 521, 99 => 427, 100 => 521, 101 => 438, - 102 => 271, 103 => 469, 104 => 531, 105 => 250, 106 => 250, 107 => 458, 108 => 240, 109 => 802, 110 => 531, 111 => 500, - 112 => 521, 113 => 521, 114 => 365, 115 => 333, 116 => 292, 117 => 521, 118 => 458, 119 => 677, 120 => 479, 121 => 458, - 122 => 427, 123 => 480, 124 => 496, 125 => 480, 126 => 667, - 17601 => 500, -); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/stsongstdlight.php b/include/limesurvey/admin/classes/tcpdf/fonts/stsongstdlight.php deleted file mode 100644 index 1c74c62d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/stsongstdlight.php +++ /dev/null @@ -1,39 +0,0 @@ - 752, - 'Descent' => -271, - 'CapHeight' => 737, - 'Flags' => 6, - 'FontBBox' => '[-25 -254 1000 880]', - 'ItalicAngle' => 0, - 'StemV' => 58, - 'Style' => '<< /Panose <000000000400000000000000> >>', -); -$cidinfo = array( - 'Registry' => 'Adobe', - 'Ordering' => 'GB1', - 'Supplement' => '2', -); -$enc = 'UniGB-UCS2-H'; - -// underline position, needs checking: -$up = -130; -$ut = 40; - -$dw = 1000; -$cw = array( - 32 => 207, 33 => 270, 34 => 342, 35 => 467, 36 => 462, 37 => 797, 38 => 710, 39 => 239, 40 => 374, 41 => 374, - 42 => 423, 43 => 605, 44 => 238, 45 => 375, 46 => 238, 47 => 334, 48 => 462, 49 => 462, 50 => 462, 51 => 462, - 52 => 462, 53 => 462, 54 => 462, 55 => 462, 56 => 462, 57 => 462, 58 => 238, 59 => 238, 60 => 605, 61 => 605, - 62 => 605, 63 => 344, 64 => 748, 65 => 684, 66 => 560, 67 => 695, 68 => 739, 69 => 563, 70 => 511, 71 => 729, - 72 => 793, 73 => 318, 74 => 312, 75 => 666, 76 => 526, 77 => 896, 78 => 758, 79 => 772, 80 => 544, 81 => 772, - 82 => 628, 83 => 465, 84 => 607, 85 => 753, 86 => 711, 87 => 972, 88 => 647, 89 => 620, 90 => 607, 91 => 374, - 92 => 333, 93 => 374, 94 => 606, 95 => 500, 96 => 239, 97 => 417, 98 => 503, 99 => 427, 100 => 529, 101 => 415, - 102 => 264, 103 => 444, 104 => 518, 105 => 241, 106 => 230, 107 => 495, 108 => 228, 109 => 793, 110 => 527, 111 => 524, - 112 => 524, 113 => 504, 114 => 338, 115 => 336, 116 => 277, 117 => 517, 118 => 450, 119 => 652, 120 => 466, 121 => 452, - 122 => 407, 123 => 370, 124 => 258, 125 => 370, 126 => 605 -); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/symbol.php b/include/limesurvey/admin/classes/tcpdf/fonts/symbol.php deleted file mode 100644 index e315f536..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/symbol.php +++ /dev/null @@ -1,32 +0,0 @@ -250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, -10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, -20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, -30=>250,31=>250,32=>250,33=>333,34=>713,35=>500,36=>549,37=>833,38=>778,39=>439, -40=>333,41=>333,42=>500,43=>549,44=>250,45=>549,46=>250,47=>278,48=>500,49=>500, -50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278, -60=>549,61=>549,62=>549,63=>444,64=>549,65=>722,66=>667,67=>722,68=>612,69=>611, -70=>763,71=>603,72=>722,73=>333,74=>631,75=>722,76=>686,77=>889,78=>722,79=>722, -80=>768,81=>741,82=>556,83=>592,84=>611,85=>690,86=>439,87=>768,88=>645,89=>795, -90=>611,91=>333,92=>863,93=>333,94=>658,95=>500,96=>500,97=>631,98=>549,99=>549, -100=>494,101=>439,102=>521,103=>411,104=>603,105=>329,106=>603,107=>549,108=>549, -109=>576,110=>521,111=>549,112=>549,113=>521,114=>549,115=>603,116=>439,117=>576, -118=>713,119=>686,120=>493,121=>686,122=>494,123=>480,124=>200,125=>480,126=>549, -127=>0,128=>0,129=>0,130=>0,131=>0,132=>0,133=>0,134=>0,135=>0,136=>0,137=>0, -138=>0,139=>0,140=>0,141=>0,142=>0,143=>0,144=>0,145=>0,146=>0,147=>0,148=>0, -149=>0,150=>0,151=>0,152=>0,153=>0,154=>0,155=>0,156=>0,157=>0,158=>0,159=>0, -160=>750,161=>620,162=>247,163=>549,164=>167,165=>713,166=>500,167=>753,168=>753, -169=>753,170=>753,171=>1042,172=>987,173=>603,174=>987,175=>603,176=>400,177=>549, -178=>411,179=>549,180=>549,181=>713,182=>494,183=>460,184=>549,185=>549,186=>549, -187=>549,188=>1000,189=>603,190=>1000,191=>658,192=>823,193=>686,194=>795,195=>987, -196=>768,197=>768,198=>823,199=>768,200=>768,201=>713,202=>713,203=>713,204=>713, -205=>713,206=>713,207=>713,208=>768,209=>713,210=>790,211=>790,212=>890,213=>823, -214=>549,215=>250,216=>713,217=>603,218=>603,219=>1042,220=>987,221=>603,222=>987, -223=>603,224=>494,225=>329,226=>790,227=>790,228=>786,229=>713,230=>384,231=>384, -232=>384,233=>384,234=>384,235=>384,236=>494,237=>494,238=>494,239=>494,240=>0, -241=>329,242=>274,243=>686,244=>686,245=>686,246=>384,247=>384,248=>384,249=>384, -250=>384,251=>384,252=>494,253=>494,254=>494,255=>0); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/times.php b/include/limesurvey/admin/classes/tcpdf/fonts/times.php deleted file mode 100644 index 99143861..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/times.php +++ /dev/null @@ -1,33 +0,0 @@ -250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, -10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, -20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, -30=>250,31=>250,32=>250,33=>333,34=>408,35=>500,36=>500,37=>833,38=>778,39=>180, -40=>333,41=>333,42=>500,43=>564,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500, -50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278, -60=>564,61=>564,62=>564,63=>444,64=>921,65=>722,66=>667,67=>667,68=>722,69=>611, -70=>556,71=>722,72=>722,73=>333,74=>389,75=>722,76=>611,77=>889,78=>722,79=>722, -80=>556,81=>722,82=>667,83=>556,84=>611,85=>722,86=>722,87=>944,88=>722,89=>722, -90=>611,91=>333,92=>278,93=>333,94=>469,95=>500,96=>333,97=>444,98=>500,99=>444, -100=>500,101=>444,102=>333,103=>500,104=>500,105=>278,106=>278,107=>500,108=>278, -109=>778,110=>500,111=>500,112=>500,113=>500,114=>333,115=>389,116=>278,117=>500, -118=>500,119=>722,120=>500,121=>500,122=>444,123=>480,124=>200,125=>480,126=>541, -127=>350,128=>500,129=>350,130=>333,131=>500,132=>444,133=>1000,134=>500,135=>500, -136=>333,137=>1000,138=>556,139=>333,140=>889,141=>350,142=>611,143=>350,144=>350, -145=>333,146=>333,147=>444,148=>444,149=>350,150=>500,151=>1000,152=>333,153=>980, -154=>389,155=>333,156=>722,157=>350,158=>444,159=>722,160=>250,161=>333,162=>500, -163=>500,164=>500,165=>500,166=>200,167=>500,168=>333,169=>760,170=>276,171=>500, -172=>564,173=>333,174=>760,175=>333,176=>400,177=>564,178=>300,179=>300,180=>333, -181=>500,182=>453,183=>250,184=>333,185=>300,186=>310,187=>500,188=>750,189=>750, -190=>750,191=>444,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>889, -199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333, -208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>564,216=>722, -217=>722,218=>722,219=>722,220=>722,221=>722,222=>556,223=>500,224=>444,225=>444, -226=>444,227=>444,228=>444,229=>444,230=>667,231=>444,232=>444,233=>444,234=>444, -235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>500,242=>500,243=>500, -244=>500,245=>500,246=>500,247=>564,248=>500,249=>500,250=>500,251=>500,252=>500, -253=>500,254=>500,255=>500); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/timesb.php b/include/limesurvey/admin/classes/tcpdf/fonts/timesb.php deleted file mode 100644 index b6625be5..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/timesb.php +++ /dev/null @@ -1,33 +0,0 @@ -250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, -10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, -20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, -30=>250,31=>250,32=>250,33=>333,34=>555,35=>500,36=>500,37=>1000,38=>833,39=>278, -40=>333,41=>333,42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500, -50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333, -60=>570,61=>570,62=>570,63=>500,64=>930,65=>722,66=>667,67=>722,68=>722,69=>667, -70=>611,71=>778,72=>778,73=>389,74=>500,75=>778,76=>667,77=>944,78=>722,79=>778, -80=>611,81=>778,82=>722,83=>556,84=>667,85=>722,86=>722,87=>1000,88=>722,89=>722, -90=>667,91=>333,92=>278,93=>333,94=>581,95=>500,96=>333,97=>500,98=>556,99=>444, -100=>556,101=>444,102=>333,103=>500,104=>556,105=>278,106=>333,107=>556,108=>278, -109=>833,110=>556,111=>500,112=>556,113=>556,114=>444,115=>389,116=>333,117=>556, -118=>500,119=>722,120=>500,121=>500,122=>444,123=>394,124=>220,125=>394,126=>520, -127=>350,128=>500,129=>350,130=>333,131=>500,132=>500,133=>1000,134=>500,135=>500, -136=>333,137=>1000,138=>556,139=>333,140=>1000,141=>350,142=>667,143=>350,144=>350, -145=>333,146=>333,147=>500,148=>500,149=>350,150=>500,151=>1000,152=>333,153=>1000, -154=>389,155=>333,156=>722,157=>350,158=>444,159=>722,160=>250,161=>333,162=>500, -163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>300,171=>500, -172=>570,173=>333,174=>747,175=>333,176=>400,177=>570,178=>300,179=>300,180=>333, -181=>556,182=>540,183=>250,184=>333,185=>300,186=>330,187=>500,188=>750,189=>750, -190=>750,191=>500,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000, -199=>722,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389, -208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>570,216=>778, -217=>722,218=>722,219=>722,220=>722,221=>722,222=>611,223=>556,224=>500,225=>500, -226=>500,227=>500,228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444, -235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>556,242=>500,243=>500, -244=>500,245=>500,246=>500,247=>570,248=>500,249=>556,250=>556,251=>556,252=>556, -253=>500,254=>556,255=>500); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/timesbi.php b/include/limesurvey/admin/classes/tcpdf/fonts/timesbi.php deleted file mode 100644 index ff18a4b8..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/timesbi.php +++ /dev/null @@ -1,33 +0,0 @@ -250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, -10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, -20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, -30=>250,31=>250,32=>250,33=>389,34=>555,35=>500,36=>500,37=>833,38=>778,39=>278, -40=>333,41=>333,42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500, -50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333, -60=>570,61=>570,62=>570,63=>500,64=>832,65=>667,66=>667,67=>667,68=>722,69=>667, -70=>667,71=>722,72=>778,73=>389,74=>500,75=>667,76=>611,77=>889,78=>722,79=>722, -80=>611,81=>722,82=>667,83=>556,84=>611,85=>722,86=>667,87=>889,88=>667,89=>611, -90=>611,91=>333,92=>278,93=>333,94=>570,95=>500,96=>333,97=>500,98=>500,99=>444, -100=>500,101=>444,102=>333,103=>500,104=>556,105=>278,106=>278,107=>500,108=>278, -109=>778,110=>556,111=>500,112=>500,113=>500,114=>389,115=>389,116=>278,117=>556, -118=>444,119=>667,120=>500,121=>444,122=>389,123=>348,124=>220,125=>348,126=>570, -127=>350,128=>500,129=>350,130=>333,131=>500,132=>500,133=>1000,134=>500,135=>500, -136=>333,137=>1000,138=>556,139=>333,140=>944,141=>350,142=>611,143=>350,144=>350, -145=>333,146=>333,147=>500,148=>500,149=>350,150=>500,151=>1000,152=>333,153=>1000, -154=>389,155=>333,156=>722,157=>350,158=>389,159=>611,160=>250,161=>389,162=>500, -163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>266,171=>500, -172=>606,173=>333,174=>747,175=>333,176=>400,177=>570,178=>300,179=>300,180=>333, -181=>576,182=>500,183=>250,184=>333,185=>300,186=>300,187=>500,188=>750,189=>750, -190=>750,191=>500,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>944, -199=>667,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389, -208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>570,216=>722, -217=>722,218=>722,219=>722,220=>722,221=>611,222=>611,223=>500,224=>500,225=>500, -226=>500,227=>500,228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444, -235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>556,242=>500,243=>500, -244=>500,245=>500,246=>500,247=>570,248=>500,249=>556,250=>556,251=>556,252=>556, -253=>444,254=>500,255=>444); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/timesi.php b/include/limesurvey/admin/classes/tcpdf/fonts/timesi.php deleted file mode 100644 index c86d3ab6..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/timesi.php +++ /dev/null @@ -1,33 +0,0 @@ -250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, -10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, -20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, -30=>250,31=>250,32=>250,33=>333,34=>420,35=>500,36=>500,37=>833,38=>778,39=>214, -40=>333,41=>333,42=>500,43=>675,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500, -50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333, -60=>675,61=>675,62=>675,63=>500,64=>920,65=>611,66=>611,67=>667,68=>722,69=>611, -70=>611,71=>722,72=>722,73=>333,74=>444,75=>667,76=>556,77=>833,78=>667,79=>722, -80=>611,81=>722,82=>611,83=>500,84=>556,85=>722,86=>611,87=>833,88=>611,89=>556, -90=>556,91=>389,92=>278,93=>389,94=>422,95=>500,96=>333,97=>500,98=>500,99=>444, -100=>500,101=>444,102=>278,103=>500,104=>500,105=>278,106=>278,107=>444,108=>278, -109=>722,110=>500,111=>500,112=>500,113=>500,114=>389,115=>389,116=>278,117=>500, -118=>444,119=>667,120=>444,121=>444,122=>389,123=>400,124=>275,125=>400,126=>541, -127=>350,128=>500,129=>350,130=>333,131=>500,132=>556,133=>889,134=>500,135=>500, -136=>333,137=>1000,138=>500,139=>333,140=>944,141=>350,142=>556,143=>350,144=>350, -145=>333,146=>333,147=>556,148=>556,149=>350,150=>500,151=>889,152=>333,153=>980, -154=>389,155=>333,156=>667,157=>350,158=>389,159=>556,160=>250,161=>389,162=>500, -163=>500,164=>500,165=>500,166=>275,167=>500,168=>333,169=>760,170=>276,171=>500, -172=>675,173=>333,174=>760,175=>333,176=>400,177=>675,178=>300,179=>300,180=>333, -181=>500,182=>523,183=>250,184=>333,185=>300,186=>310,187=>500,188=>750,189=>750, -190=>750,191=>500,192=>611,193=>611,194=>611,195=>611,196=>611,197=>611,198=>889, -199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333, -208=>722,209=>667,210=>722,211=>722,212=>722,213=>722,214=>722,215=>675,216=>722, -217=>722,218=>722,219=>722,220=>722,221=>556,222=>611,223=>500,224=>500,225=>500, -226=>500,227=>500,228=>500,229=>500,230=>667,231=>444,232=>444,233=>444,234=>444, -235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>500,242=>500,243=>500, -244=>500,245=>500,246=>500,247=>675,248=>500,249=>500,250=>500,251=>500,252=>500, -253=>444,254=>500,255=>444); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ac15.php b/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ac15.php deleted file mode 100644 index 503a071f..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ac15.php +++ /dev/null @@ -1,23613 +0,0 @@ -1, -33=>2, -34=>3, -35=>4, -36=>5, -37=>6, -38=>7, -39=>8, -40=>9, -41=>10, -42=>11, -43=>12, -44=>13, -45=>14, -46=>15, -47=>16, -48=>17, -49=>18, -50=>19, -51=>20, -52=>21, -53=>22, -54=>23, -55=>24, -56=>25, -57=>26, -58=>27, -59=>28, -60=>29, -61=>30, -62=>31, -63=>32, -64=>33, -65=>34, -66=>35, -67=>36, -68=>37, -69=>38, -70=>39, -71=>40, -72=>41, -73=>42, -74=>43, -75=>44, -76=>45, -77=>46, -78=>47, -79=>48, -80=>49, -81=>50, -82=>51, -83=>52, -84=>53, -85=>54, -86=>55, -87=>56, -88=>57, -89=>58, -90=>59, -91=>60, -92=>61, -93=>62, -94=>63, -95=>64, -96=>65, -97=>66, -98=>67, -99=>68, -100=>69, -101=>70, -102=>71, -103=>72, -104=>73, -105=>74, -106=>75, -107=>76, -108=>77, -109=>78, -110=>79, -111=>80, -112=>81, -113=>82, -114=>83, -115=>84, -116=>85, -117=>86, -118=>87, -119=>88, -120=>89, -121=>90, -122=>91, -123=>92, -124=>93, -125=>94, -126=>95, -12288=>99, -65292=>100, -12289=>101, -12290=>102, -65294=>103, -8226=>104, -8231=>104, -65307=>105, -65306=>106, -65311=>107, -65281=>108, -65072=>109, -8230=>110, -8943=>110, -8229=>111, -65104=>112, -65380=>113, -65105=>113, -65106=>114, -183=>115, -65108=>116, -65109=>117, -65110=>118, -65111=>119, -65372=>120, -8211=>121, -65073=>122, -8212=>123, -65288=>128, -65289=>129, -65077=>130, -65078=>131, -65371=>132, -65373=>133, -65079=>134, -65080=>135, -12308=>136, -12309=>137, -65081=>138, -65082=>139, -12304=>140, -12305=>141, -65083=>142, -65084=>143, -12298=>144, -12299=>145, -65085=>146, -65086=>147, -12296=>148, -12297=>149, -65087=>150, -65088=>151, -12300=>152, -12301=>153, -65089=>154, -65090=>155, -12302=>156, -12303=>157, -65091=>158, -65092=>159, -65113=>160, -65114=>161, -65115=>162, -65116=>163, -65117=>164, -65118=>165, -8216=>166, -8217=>167, -8220=>168, -8221=>169, -12317=>170, -12318=>171, -8245=>172, -8242=>173, -65283=>174, -65286=>175, -65290=>176, -8251=>177, -167=>178, -12291=>179, -9675=>180, -9679=>181, -9651=>182, -9650=>183, -9678=>184, -9734=>185, -9733=>186, -9671=>187, -9670=>188, -9633=>189, -9632=>190, -9661=>191, -9660=>192, -12963=>193, -8453=>194, -175=>195, -772=>195, -8254=>195, -65507=>196, -65343=>197, -717=>198, -65097=>199, -65098=>200, -65101=>201, -65102=>202, -65099=>203, -65100=>204, -65119=>205, -65120=>206, -65121=>207, -65291=>208, -65293=>209, -215=>210, -247=>211, -177=>212, -8730=>213, -65308=>214, -65310=>215, -65309=>216, -8806=>217, -8807=>218, -8800=>219, -8734=>220, -8786=>221, -8801=>222, -65122=>223, -65123=>224, -65124=>225, -65125=>226, -65126=>227, -8764=>228, -65374=>228, -8745=>229, -8746=>230, -8869=>231, -8736=>232, -8735=>233, -8895=>234, -13266=>235, -13265=>236, -8747=>237, -8750=>238, -8757=>239, -8756=>240, -9792=>241, -9794=>242, -8853=>243, -9793=>243, -8857=>244, -9737=>244, -8593=>245, -8595=>246, -8594=>247, -8592=>248, -8598=>249, -8599=>250, -8601=>251, -8600=>252, -8741=>253, -8739=>254, -8725=>257, -65295=>257, -65128=>258, -65340=>258, -65284=>259, -165=>260, -65509=>260, -12306=>261, -162=>262, -65504=>262, -163=>263, -65505=>263, -65285=>264, -65312=>265, -8451=>266, -8457=>267, -65129=>268, -65130=>269, -65131=>270, -13269=>271, -13212=>272, -13213=>273, -13214=>274, -13262=>275, -13217=>276, -13198=>277, -13199=>278, -13252=>279, -176=>280, -20825=>281, -58834=>281, -20827=>282, -58835=>282, -20830=>283, -58837=>283, -20829=>284, -58836=>284, -20833=>285, -20835=>286, -21991=>287, -29929=>288, -58044=>288, -31950=>289, -58191=>289, -9601=>290, -9602=>291, -9603=>292, -9604=>293, -9605=>294, -9606=>295, -9607=>296, -9608=>297, -9615=>298, -9614=>299, -9613=>300, -9612=>301, -9611=>302, -9610=>303, -9609=>304, -9532=>305, -9524=>306, -9516=>307, -9508=>308, -9500=>309, -9620=>310, -9472=>311, -9474=>312, -9621=>313, -9484=>314, -9488=>315, -9492=>316, -9496=>317, -9581=>318, -9582=>319, -9584=>320, -9583=>321, -9552=>322, -9566=>323, -9578=>324, -9569=>325, -9698=>326, -9699=>327, -9701=>328, -9700=>329, -9585=>330, -9586=>331, -9587=>332, -65296=>333, -65297=>334, -65298=>335, -65299=>336, -65300=>337, -65301=>338, -65302=>339, -65303=>340, -65304=>341, -65305=>342, -8544=>343, -8545=>344, -8546=>345, -8547=>346, -8548=>347, -8549=>348, -8550=>349, -8551=>350, -8552=>351, -8553=>352, -12321=>353, -12322=>354, -12323=>355, -12324=>356, -12325=>357, -12326=>358, -12327=>359, -12328=>360, -12329=>361, -12344=>362, -21316=>363, -57443=>363, -12345=>363, -12346=>364, -65313=>365, -65314=>366, -65315=>367, -65316=>368, -65317=>369, -65318=>370, -65319=>371, -65320=>372, -65321=>373, -65322=>374, -65323=>375, -65324=>376, -65325=>377, -65326=>378, -65327=>379, -65328=>380, -65329=>381, -65330=>382, -65331=>383, -65332=>384, -65333=>385, -65334=>386, -65335=>387, -65336=>388, -65337=>389, -65338=>390, -65345=>391, -65346=>392, -65347=>393, -65348=>394, -65349=>395, -65350=>396, -65351=>397, -65352=>398, -65353=>399, -65354=>400, -65355=>401, -65356=>402, -65357=>403, -65358=>404, -65359=>405, -65360=>406, -65361=>407, -65362=>408, -65363=>409, -65364=>410, -65365=>411, -65366=>412, -65367=>413, -65368=>414, -65369=>415, -65370=>416, -913=>417, -914=>418, -915=>419, -916=>420, -917=>421, -918=>422, -919=>423, -920=>424, -921=>425, -922=>426, -923=>427, -924=>428, -925=>429, -926=>430, -927=>431, -928=>432, -929=>433, -931=>434, -932=>435, -933=>436, -934=>437, -935=>438, -936=>439, -937=>440, -945=>441, -946=>442, -947=>443, -948=>444, -949=>445, -950=>446, -951=>447, -952=>448, -953=>449, -954=>450, -955=>451, -956=>452, -957=>453, -958=>454, -959=>455, -960=>456, -961=>457, -963=>458, -964=>459, -965=>460, -966=>461, -967=>462, -968=>463, -969=>464, -12549=>465, -12550=>466, -12551=>467, -12552=>468, -12553=>469, -12554=>470, -12555=>471, -12556=>472, -12557=>473, -12558=>474, -12559=>475, -12560=>476, -12561=>477, -12562=>478, -12563=>479, -12564=>480, -12565=>481, -12566=>482, -12567=>483, -12568=>484, -12569=>485, -12570=>486, -12571=>487, -12572=>488, -12573=>489, -12574=>490, -12575=>491, -12576=>492, -12577=>493, -12578=>494, -12579=>495, -12580=>496, -12581=>497, -12582=>498, -12583=>499, -12584=>500, -12585=>501, -729=>502, -714=>503, -711=>504, -780=>504, -715=>505, -9312=>506, -63153=>506, -9313=>507, -63154=>507, -9314=>508, -63155=>508, -9315=>509, -63156=>509, -9316=>510, -63157=>510, -9317=>511, -63158=>511, -9318=>512, -63159=>512, -9319=>513, -63160=>513, -9320=>514, -63161=>514, -9321=>515, -63162=>515, -9332=>516, -63163=>516, -9333=>517, -63164=>517, -9334=>518, -63165=>518, -9335=>519, -63166=>519, -9336=>520, -63167=>520, -9337=>521, -63168=>521, -9338=>522, -63169=>522, -9339=>523, -63170=>523, -9340=>524, -63171=>524, -9341=>525, -63172=>525, -8560=>526, -63173=>526, -8561=>527, -63174=>527, -8562=>528, -63175=>528, -8563=>529, -63176=>529, -8564=>530, -63177=>530, -8565=>531, -63178=>531, -8566=>532, -63179=>532, -8567=>533, -63180=>533, -8568=>534, -63181=>534, -8569=>535, -63182=>535, -20008=>536, -12033=>536, -20022=>537, -12034=>537, -63183=>537, -20031=>538, -12035=>538, -63184=>538, -12037=>539, -20101=>539, -63185=>539, -12039=>540, -20128=>540, -63186=>540, -20866=>541, -12044=>541, -63187=>541, -20886=>542, -12045=>542, -63188=>542, -20907=>543, -12046=>543, -63189=>543, -12051=>544, -21241=>544, -63190=>544, -12054=>545, -21304=>545, -63191=>545, -12057=>546, -21353=>546, -63192=>546, -12059=>547, -21430=>547, -63193=>547, -12065=>548, -12066=>548, -22786=>548, -22794=>548, -63194=>548, -12071=>549, -23424=>549, -63195=>549, -12078=>550, -24027=>550, -63196=>550, -24186=>551, -12083=>551, -63197=>551, -24191=>552, -12084=>552, -63198=>552, -24308=>553, -12085=>553, -24400=>554, -12089=>554, -63200=>554, -24417=>555, -12090=>555, -63201=>555, -12097=>556, -25908=>556, -63202=>556, -12102=>557, -26080=>557, -30098=>558, -63204=>558, -12135=>558, -30326=>559, -12136=>559, -12193=>560, -36789=>560, -63206=>560, -12202=>561, -38582=>561, -9216=>562, -9217=>563, -9218=>564, -9219=>565, -9220=>566, -9221=>567, -9222=>568, -9223=>569, -9224=>570, -9225=>571, -9226=>572, -9227=>573, -9228=>574, -9229=>575, -9230=>576, -9231=>577, -9232=>578, -9233=>579, -9234=>580, -9235=>581, -9236=>582, -9237=>583, -9238=>584, -9239=>585, -9240=>586, -9241=>587, -9242=>588, -9243=>589, -9244=>590, -9245=>591, -9246=>592, -9247=>593, -9249=>594, -12032=>595, -19968=>595, -12036=>596, -20057=>596, -19969=>597, -19971=>598, -20035=>599, -20061=>600, -20102=>601, -12038=>602, -20108=>602, -20154=>603, -12040=>603, -20799=>604, -12041=>604, -20837=>605, -12042=>605, -20843=>606, -12043=>606, -12047=>607, -20960=>607, -12049=>608, -20992=>608, -20993=>609, -12050=>610, -21147=>610, -12052=>611, -21269=>611, -21313=>612, -12055=>612, -21340=>613, -12056=>613, -12060=>614, -21448=>614, -19977=>615, -19979=>616, -19976=>617, -19978=>618, -20011=>619, -20024=>620, -20961=>621, -20037=>622, -20040=>623, -20063=>624, -20062=>625, -20110=>626, -20129=>627, -20800=>628, -64012=>628, -20995=>629, -21242=>630, -21315=>631, -21449=>632, -12061=>633, -21475=>633, -22303=>634, -12063=>634, -22763=>635, -12064=>635, -22805=>636, -12067=>636, -22823=>637, -12068=>637, -22899=>638, -12069=>638, -12070=>639, -23376=>639, -23377=>640, -23379=>641, -23544=>642, -12072=>642, -23567=>643, -12073=>643, -23586=>644, -12074=>644, -23608=>645, -12075=>645, -12077=>646, -23665=>646, -24029=>647, -24037=>648, -12079=>648, -12080=>649, -24049=>649, -24050=>650, -24051=>651, -24062=>652, -12081=>652, -24178=>653, -12082=>653, -24318=>654, -12086=>654, -24331=>655, -12087=>655, -24339=>656, -12088=>656, -25165=>657, -19985=>658, -19984=>659, -19981=>660, -20013=>661, -20016=>662, -20025=>663, -20043=>664, -23609=>665, -20104=>666, -20113=>667, -20117=>668, -20114=>669, -20116=>670, -20130=>671, -20161=>672, -20160=>673, -20163=>674, -20166=>675, -20167=>676, -20173=>677, -20170=>678, -20171=>679, -20164=>680, -20803=>681, -20801=>682, -20839=>683, -20845=>684, -20846=>685, -20844=>686, -20887=>687, -20982=>688, -20998=>689, -20999=>690, -21000=>691, -21243=>692, -21246=>693, -21247=>694, -21270=>695, -21305=>696, -21320=>697, -21319=>698, -21317=>699, -21342=>700, -21380=>701, -21451=>702, -21450=>703, -21453=>704, -22764=>705, -22825=>706, -22827=>707, -22826=>708, -22829=>709, -23380=>710, -23569=>711, -23588=>712, -23610=>713, -23663=>714, -24052=>715, -24187=>716, -24319=>717, -24340=>718, -24341=>719, -24515=>720, -12092=>720, -25096=>721, -12093=>721, -25142=>722, -12094=>722, -25163=>723, -12095=>723, -25166=>724, -12096=>725, -25903=>725, -25991=>726, -12098=>726, -26007=>727, -12099=>727, -26020=>728, -12100=>728, -26041=>729, -12101=>729, -26085=>730, -12103=>730, -26352=>731, -12104=>731, -26376=>732, -12105=>732, -26408=>733, -12106=>733, -27424=>734, -12107=>734, -27490=>735, -12108=>735, -27513=>736, -12109=>736, -27595=>737, -12111=>737, -27604=>738, -12112=>738, -27611=>739, -12113=>739, -27663=>740, -12114=>740, -27700=>741, -12116=>741, -28779=>742, -12117=>742, -29226=>743, -12118=>743, -29238=>744, -12119=>744, -29243=>745, -12120=>745, -29255=>746, -12122=>746, -29273=>747, -12123=>747, -29275=>748, -12124=>748, -29356=>749, -12125=>749, -29579=>750, -19993=>751, -19990=>752, -19989=>753, -19988=>754, -19992=>755, -20027=>756, -20045=>757, -20047=>758, -20046=>759, -20197=>760, -20184=>761, -20180=>762, -20181=>763, -20182=>764, -20183=>765, -20195=>766, -20196=>767, -20185=>768, -20190=>769, -20805=>770, -20804=>771, -20873=>772, -20874=>773, -20908=>774, -20985=>775, -20986=>776, -20984=>777, -21002=>778, -21152=>779, -21151=>780, -57435=>781, -21253=>781, -21254=>782, -21271=>783, -21277=>784, -20191=>785, -21322=>786, -21321=>787, -21345=>788, -21344=>789, -21359=>790, -21358=>791, -21435=>792, -21487=>793, -21476=>794, -21491=>795, -21484=>796, -21486=>797, -21481=>798, -21480=>799, -21500=>800, -21496=>801, -21493=>802, -21483=>803, -21478=>804, -21482=>805, -21490=>806, -21489=>807, -21488=>808, -21477=>809, -21485=>810, -21499=>811, -22235=>812, -22234=>813, -22806=>814, -22830=>815, -22833=>816, -22900=>817, -22902=>818, -23381=>819, -23427=>820, -23612=>821, -24040=>822, -24039=>823, -24038=>824, -24066=>825, -24067=>826, -24179=>827, -24188=>828, -24321=>829, -24344=>830, -24343=>831, -24517=>832, -25098=>833, -25171=>834, -25172=>835, -25170=>836, -25169=>837, -26021=>838, -26086=>839, -26414=>840, -26412=>841, -26410=>842, -26411=>843, -26413=>844, -27491=>845, -27597=>846, -27665=>847, -27664=>848, -27704=>849, -27713=>850, -27712=>851, -27710=>852, -29359=>853, -29572=>854, -12126=>854, -29577=>855, -12127=>855, -29916=>856, -12128=>856, -29926=>857, -12129=>857, -29976=>858, -12130=>858, -29983=>859, -12131=>859, -12132=>860, -29992=>860, -29993=>861, -12133=>862, -30000=>862, -30001=>863, -30002=>864, -30003=>865, -12134=>866, -30091=>866, -30333=>867, -12137=>867, -30382=>868, -12138=>868, -30399=>869, -12139=>869, -30446=>870, -12140=>870, -30683=>871, -12141=>871, -30690=>872, -12142=>872, -30707=>873, -12143=>873, -31034=>874, -12144=>874, -31166=>875, -12146=>875, -31348=>876, -12147=>876, -31435=>877, -12148=>877, -19998=>878, -19999=>879, -20050=>880, -20051=>881, -20073=>882, -20121=>883, -20132=>884, -20134=>885, -20133=>886, -20223=>887, -20233=>888, -20249=>889, -20234=>890, -20245=>891, -20237=>892, -20240=>893, -20241=>894, -20239=>895, -20210=>896, -20214=>897, -20219=>898, -20208=>899, -20211=>900, -20221=>901, -20225=>902, -20235=>903, -20809=>904, -20807=>905, -20806=>906, -20808=>907, -20840=>908, -20849=>909, -20877=>910, -20912=>911, -21015=>912, -21009=>913, -21010=>914, -21006=>915, -21014=>916, -21155=>917, -21256=>918, -21281=>919, -21280=>920, -21360=>921, -21361=>922, -21513=>923, -21519=>924, -21516=>925, -21514=>926, -21520=>927, -21505=>928, -21515=>929, -21508=>930, -21521=>931, -21517=>932, -21512=>933, -21507=>934, -21518=>935, -21510=>936, -21522=>937, -22240=>938, -22238=>939, -22237=>940, -22323=>941, -22320=>942, -22312=>943, -22317=>944, -22316=>945, -22319=>946, -22313=>947, -22809=>948, -22810=>949, -22839=>950, -22840=>951, -22916=>952, -22904=>953, -22915=>954, -22909=>955, -22905=>956, -22914=>957, -22913=>958, -23383=>959, -23384=>960, -23431=>961, -23432=>962, -23429=>963, -23433=>964, -23546=>965, -23574=>966, -23673=>967, -24030=>968, -24070=>969, -24182=>970, -24180=>971, -24335=>972, -24347=>973, -24537=>974, -24534=>975, -25102=>976, -25100=>977, -25101=>978, -25104=>979, -25187=>980, -25179=>981, -25176=>982, -25910=>983, -26089=>984, -26088=>985, -26092=>986, -26093=>987, -26354=>988, -26355=>989, -26377=>990, -26429=>991, -26420=>992, -26417=>993, -26421=>994, -27425=>995, -27492=>996, -27515=>997, -27670=>998, -27741=>999, -27735=>1000, -27737=>1001, -27743=>1002, -27744=>1003, -27728=>1004, -27733=>1005, -27745=>1006, -27739=>1007, -27725=>1008, -27726=>1009, -28784=>1010, -29279=>1011, -29277=>1012, -30334=>1013, -31481=>1014, -12149=>1014, -31859=>1015, -12150=>1015, -31992=>1016, -12151=>1016, -32566=>1017, -12152=>1017, -32650=>1018, -12154=>1018, -32701=>1019, -12155=>1019, -32769=>1020, -12156=>1020, -32771=>1021, -32780=>1022, -12157=>1022, -32786=>1023, -12158=>1023, -32819=>1024, -12159=>1024, -32895=>1025, -12160=>1025, -32905=>1026, -12161=>1026, -32907=>1027, -32908=>1028, -33251=>1029, -12162=>1029, -33258=>1030, -12163=>1030, -33267=>1031, -12164=>1031, -33276=>1032, -12165=>1032, -33292=>1033, -12166=>1033, -33307=>1034, -12167=>1034, -33311=>1035, -12168=>1035, -33390=>1036, -12169=>1036, -33394=>1037, -12170=>1037, -33406=>1038, -34411=>1039, -12173=>1039, -34880=>1040, -12174=>1040, -34892=>1041, -12175=>1041, -34915=>1042, -12176=>1042, -35199=>1043, -38433=>1044, -20018=>1045, -20136=>1046, -20301=>1047, -20303=>1048, -20295=>1049, -20311=>1050, -20318=>1051, -20276=>1052, -20315=>1053, -20309=>1054, -20272=>1055, -20304=>1056, -20305=>1057, -20285=>1058, -20282=>1059, -20280=>1060, -20291=>1061, -20308=>1062, -20284=>1063, -20294=>1064, -20323=>1065, -20316=>1066, -20320=>1067, -20271=>1068, -20302=>1069, -20278=>1070, -20313=>1071, -20317=>1072, -20296=>1073, -20314=>1074, -20812=>1075, -20811=>1076, -20813=>1077, -20853=>1078, -20918=>1079, -20919=>1080, -21029=>1081, -21028=>1082, -21033=>1083, -21034=>1084, -21032=>1085, -21163=>1086, -21161=>1087, -21162=>1088, -21164=>1089, -21283=>1090, -21363=>1091, -21365=>1092, -21533=>1093, -21549=>1094, -21534=>1095, -21566=>1096, -21542=>1097, -21582=>1098, -21543=>1099, -21574=>1100, -21571=>1101, -21555=>1102, -21576=>1103, -21570=>1104, -21531=>1105, -21545=>1106, -21578=>1107, -21561=>1108, -21563=>1109, -21560=>1110, -21550=>1111, -21557=>1112, -21558=>1113, -21536=>1114, -21564=>1115, -21568=>1116, -21553=>1117, -21547=>1118, -21535=>1119, -21548=>1120, -22250=>1121, -22256=>1122, -22244=>1123, -22251=>1124, -22346=>1125, -22353=>1126, -22336=>1127, -22349=>1128, -22343=>1129, -22350=>1130, -22334=>1131, -22352=>1132, -22351=>1133, -22331=>1134, -22767=>1135, -22846=>1136, -22941=>1137, -22930=>1138, -22952=>1139, -22942=>1140, -22947=>1141, -22937=>1142, -22934=>1143, -22925=>1144, -22948=>1145, -22931=>1146, -22922=>1147, -22949=>1148, -23389=>1149, -23388=>1150, -23386=>1151, -23387=>1152, -23436=>1153, -23435=>1154, -23439=>1155, -23596=>1156, -23616=>1157, -23617=>1158, -23615=>1159, -23614=>1160, -23696=>1161, -23697=>1162, -23700=>1163, -23692=>1164, -24043=>1165, -24076=>1166, -24207=>1167, -24199=>1168, -24202=>1169, -24311=>1170, -24324=>1171, -24351=>1172, -24420=>1173, -24418=>1174, -24439=>1175, -24441=>1176, -24536=>1177, -24524=>1178, -24535=>1179, -24525=>1180, -24561=>1181, -24555=>1182, -24568=>1183, -24554=>1184, -25106=>1185, -25105=>1186, -25220=>1187, -25239=>1188, -25238=>1189, -25216=>1190, -25206=>1191, -25225=>1192, -25197=>1193, -25226=>1194, -25212=>1195, -25214=>1196, -25209=>1197, -25203=>1198, -25234=>1199, -25199=>1200, -25240=>1201, -25198=>1202, -25237=>1203, -25235=>1204, -25233=>1205, -25222=>1206, -25913=>1207, -25915=>1208, -25912=>1209, -26097=>1210, -26356=>1211, -26463=>1212, -26446=>1213, -26447=>1214, -26448=>1215, -26449=>1216, -26460=>1217, -26454=>1218, -26462=>1219, -57801=>1219, -26441=>1220, -26438=>1221, -26464=>1222, -26451=>1223, -26455=>1224, -27493=>1225, -27599=>1226, -27714=>1227, -27742=>1228, -27801=>1229, -27777=>1230, -27784=>1231, -27785=>1232, -27781=>1233, -27803=>1234, -27754=>1235, -27770=>1236, -27792=>1237, -27760=>1238, -27788=>1239, -27752=>1240, -27798=>1241, -27794=>1242, -27773=>1243, -27779=>1244, -27762=>1245, -27774=>1246, -27764=>1247, -27782=>1248, -27766=>1249, -27789=>1250, -27796=>1251, -27800=>1252, -27778=>1253, -28790=>1254, -28796=>1255, -28797=>1256, -28792=>1257, -29282=>1258, -29281=>1259, -29280=>1260, -29380=>1261, -29378=>1262, -29590=>1263, -29996=>1264, -29995=>1265, -30007=>1266, -30008=>1267, -30338=>1268, -30447=>1269, -30691=>1270, -31169=>1271, -31168=>1272, -31167=>1273, -31350=>1274, -31995=>1275, -32597=>1276, -32918=>1277, -32915=>1278, -32925=>1279, -32920=>1280, -32923=>1281, -32922=>1282, -32946=>1283, -33391=>1284, -33426=>1285, -33419=>1286, -33421=>1287, -35211=>1288, -12178=>1288, -35282=>1289, -12179=>1289, -35328=>1290, -12180=>1290, -35895=>1291, -12181=>1291, -35910=>1292, -12182=>1292, -35925=>1293, -12183=>1293, -35997=>1294, -12185=>1294, -36196=>1295, -12186=>1295, -36208=>1296, -12187=>1296, -36275=>1297, -12188=>1297, -36523=>1298, -12189=>1298, -36554=>1299, -12190=>1299, -36763=>1300, -12191=>1300, -36784=>1301, -12192=>1301, -36802=>1302, -36806=>1303, -36805=>1304, -36804=>1305, -24033=>1306, -12194=>1307, -37009=>1307, -37026=>1308, -37034=>1309, -37030=>1310, -37027=>1311, -37193=>1312, -12195=>1312, -37318=>1313, -12196=>1313, -37324=>1314, -12197=>1314, -38450=>1315, -38446=>1316, -38449=>1317, -38442=>1318, -38444=>1319, -20006=>1320, -20054=>1321, -20083=>1322, -20107=>1323, -20123=>1324, -20126=>1325, -20139=>1326, -20140=>1327, -20335=>1328, -20381=>1329, -20365=>1330, -20339=>1331, -20351=>1332, -20332=>1333, -20379=>1334, -20363=>1335, -20358=>1336, -20355=>1337, -20336=>1338, -20341=>1339, -20360=>1340, -20329=>1341, -20347=>1342, -20374=>1343, -20350=>1344, -20367=>1345, -20369=>1346, -20346=>1347, -20820=>1348, -20818=>1349, -20821=>1350, -20841=>1351, -20855=>1352, -20854=>1353, -20856=>1354, -20925=>1355, -20989=>1356, -21051=>1357, -21048=>1358, -21047=>1359, -21050=>1360, -21040=>1361, -21038=>1362, -21046=>1363, -21057=>1364, -21182=>1365, -21179=>1366, -21330=>1367, -21332=>1368, -21331=>1369, -21329=>1370, -21350=>1371, -21367=>1372, -21368=>1373, -21369=>1374, -21462=>1375, -21460=>1376, -21463=>1377, -21619=>1378, -21621=>1379, -21654=>1380, -21624=>1381, -21653=>1382, -21632=>1383, -21627=>1384, -21623=>1385, -21636=>1386, -21650=>1387, -21638=>1388, -21628=>1389, -21648=>1390, -21617=>1391, -21622=>1392, -21644=>1393, -21658=>1394, -21602=>1395, -21608=>1396, -21643=>1397, -21629=>1398, -21646=>1399, -22266=>1400, -22403=>1401, -22391=>1402, -22378=>1403, -22377=>1404, -22369=>1405, -22374=>1406, -22372=>1407, -22396=>1408, -22812=>1409, -22857=>1410, -22855=>1411, -22856=>1412, -22852=>1413, -22868=>1414, -22974=>1415, -22971=>1416, -22996=>1417, -22969=>1418, -22958=>1419, -22993=>1420, -22982=>1421, -22992=>1422, -22989=>1423, -22987=>1424, -22995=>1425, -22986=>1426, -22959=>1427, -22963=>1428, -22994=>1429, -22981=>1430, -23391=>1431, -23396=>1432, -23395=>1433, -23447=>1434, -23450=>1435, -23448=>1436, -23452=>1437, -23449=>1438, -23451=>1439, -23578=>1440, -23624=>1441, -23621=>1442, -23622=>1443, -23735=>1444, -23713=>1445, -23736=>1446, -23721=>1447, -23723=>1448, -23729=>1449, -23731=>1450, -24088=>1451, -24090=>1452, -24086=>1453, -24085=>1454, -24091=>1455, -24081=>1456, -24184=>1457, -24218=>1458, -24215=>1459, -24220=>1460, -24213=>1461, -24214=>1462, -24310=>1463, -24358=>1464, -24359=>1465, -24361=>1466, -24448=>1467, -24449=>1468, -24447=>1469, -24444=>1470, -24541=>1471, -24544=>1472, -24573=>1473, -24565=>1474, -24575=>1475, -24591=>1476, -24596=>1477, -24623=>1478, -24629=>1479, -24598=>1480, -24618=>1481, -24597=>1482, -24609=>1483, -24615=>1484, -24617=>1485, -24619=>1486, -24603=>1487, -25110=>1488, -25109=>1489, -25151=>1490, -25150=>1491, -25152=>1492, -25215=>1493, -25289=>1494, -25292=>1495, -25284=>1496, -25279=>1497, -25282=>1498, -25273=>1499, -25298=>1500, -25307=>1501, -25259=>1502, -25299=>1503, -25300=>1504, -25291=>1505, -25288=>1506, -25256=>1507, -25277=>1508, -25276=>1509, -25296=>1510, -60582=>1510, -25305=>1511, -25287=>1512, -25293=>1513, -25269=>1514, -25306=>1515, -25265=>1516, -25304=>1517, -25302=>1518, -25303=>1519, -25286=>1520, -25260=>1521, -25294=>1522, -61010=>1522, -25918=>1523, -26023=>1524, -26044=>1525, -26106=>1526, -26132=>1527, -26131=>1528, -26124=>1529, -26118=>1530, -26114=>1531, -26126=>1532, -26112=>1533, -26127=>1534, -26133=>1535, -26122=>1536, -26119=>1537, -26381=>1538, -26379=>1539, -26477=>1540, -26507=>1541, -26517=>1542, -26481=>1543, -26524=>1544, -26483=>1545, -26487=>1546, -26503=>1547, -26525=>1548, -26519=>1549, -26479=>1550, -26480=>1551, -26495=>1552, -26505=>1553, -26494=>1554, -26512=>1555, -26485=>1556, -26522=>1557, -26515=>1558, -26492=>1559, -26474=>1560, -26482=>1561, -27427=>1562, -27494=>1563, -27495=>1564, -27519=>1565, -27667=>1566, -27675=>1567, -27875=>1568, -27880=>1569, -27891=>1570, -27825=>1571, -27852=>1572, -27877=>1573, -27827=>1574, -27837=>1575, -27838=>1576, -27836=>1577, -27874=>1578, -27819=>1579, -27861=>1580, -27859=>1581, -27832=>1582, -27844=>1583, -27833=>1584, -27841=>1585, -27822=>1586, -27863=>1587, -27845=>1588, -27889=>1589, -27839=>1590, -27835=>1591, -27873=>1592, -27867=>1593, -27850=>1594, -27820=>1595, -27887=>1596, -27868=>1597, -27862=>1598, -27872=>1599, -28821=>1600, -28814=>1601, -28818=>1602, -28810=>1603, -28825=>1604, -29228=>1605, -29229=>1606, -29240=>1607, -29256=>1608, -29287=>1609, -29289=>1610, -29376=>1611, -29390=>1612, -29401=>1613, -29399=>1614, -29392=>1615, -29609=>1616, -29608=>1617, -29599=>1618, -29611=>1619, -29605=>1620, -30013=>1621, -30109=>1622, -30105=>1623, -30106=>1624, -30340=>1625, -30402=>1626, -30450=>1627, -30452=>1628, -30693=>1629, -30717=>1630, -31038=>1631, -31040=>1632, -31041=>1633, -31177=>1634, -31176=>1635, -31354=>1636, -31353=>1637, -31482=>1638, -31998=>1639, -32596=>1640, -32652=>1641, -32651=>1642, -32773=>1643, -58236=>1643, -32954=>1644, -32933=>1645, -32930=>1646, -32945=>1647, -32929=>1648, -32939=>1649, -32937=>1650, -32948=>1651, -32938=>1652, -32943=>1653, -33253=>1654, -33278=>1655, -33293=>1656, -33459=>1657, -33437=>1658, -33433=>1659, -33453=>1660, -33469=>1661, -33439=>1662, -33465=>1663, -33457=>1664, -33452=>1665, -33445=>1666, -33455=>1667, -33464=>1668, -33443=>1669, -33456=>1670, -33470=>1671, -33463=>1672, -34382=>1673, -34417=>1674, -21021=>1675, -34920=>1676, -36555=>1677, -36814=>1678, -36820=>1679, -36817=>1680, -37045=>1681, -37048=>1682, -37041=>1683, -37046=>1684, -37319=>1685, -37329=>1686, -12198=>1686, -38263=>1687, -12199=>1687, -38272=>1688, -12200=>1688, -38428=>1689, -12201=>1689, -38464=>1690, -38463=>1691, -38459=>1692, -38468=>1693, -38466=>1694, -38585=>1695, -12203=>1695, -38632=>1696, -12204=>1696, -38738=>1697, -12206=>1698, -38750=>1698, -20127=>1699, -20141=>1700, -20142=>1701, -20449=>1702, -20405=>1703, -20399=>1704, -20415=>1705, -20448=>1706, -20433=>1707, -20431=>1708, -20445=>1709, -20419=>1710, -20406=>1711, -20440=>1712, -20447=>1713, -20426=>1714, -20439=>1715, -20398=>1716, -20432=>1717, -20420=>1718, -20418=>1719, -20442=>1720, -20430=>1721, -20446=>1722, -20407=>1723, -20823=>1724, -20882=>1725, -20881=>1726, -20896=>1727, -21070=>1728, -21059=>1729, -21066=>1730, -21069=>1731, -21068=>1732, -21067=>1733, -21063=>1734, -21191=>1735, -21193=>1736, -21187=>1737, -21185=>1738, -21261=>1739, -21335=>1740, -21371=>1741, -21402=>1742, -21467=>1743, -21676=>1744, -21696=>1745, -21672=>1746, -21710=>1747, -21705=>1748, -21688=>1749, -21670=>1750, -21683=>1751, -21703=>1752, -21698=>1753, -21693=>1754, -21674=>1755, -21697=>1756, -21700=>1757, -21704=>1758, -21679=>1759, -21675=>1760, -21681=>1761, -21691=>1762, -21673=>1763, -21671=>1764, -21695=>1765, -22271=>1766, -22402=>1767, -22411=>1768, -22432=>1769, -22435=>1770, -22434=>1771, -22478=>1772, -22446=>1773, -22419=>1774, -22869=>1775, -22865=>1776, -22863=>1777, -22862=>1778, -22864=>1779, -23004=>1780, -23000=>1781, -23039=>1782, -23011=>1783, -23016=>1784, -23043=>1785, -23013=>1786, -23018=>1787, -23002=>1788, -23014=>1789, -23041=>1790, -23035=>1791, -23401=>1792, -23459=>1793, -23462=>1794, -23460=>1795, -23458=>1796, -23461=>1797, -23553=>1798, -23630=>1799, -23631=>1800, -23629=>1801, -23627=>1802, -23769=>1803, -23762=>1804, -24055=>1805, -24093=>1806, -24101=>1807, -24095=>1808, -24189=>1809, -24224=>1810, -24230=>1811, -24314=>1812, -24328=>1813, -24365=>1814, -24421=>1815, -24456=>1816, -24453=>1817, -24458=>1818, -24459=>1819, -24455=>1820, -24460=>1821, -24457=>1822, -24594=>1823, -24605=>1824, -24608=>1825, -24613=>1826, -24590=>1827, -24616=>1828, -24653=>1829, -24688=>1830, -24680=>1831, -24674=>1832, -60712=>1832, -24646=>1833, -24643=>1834, -24684=>1835, -24683=>1836, -24682=>1837, -24676=>1838, -25153=>1839, -25308=>1840, -25366=>1841, -25353=>1842, -25340=>1843, -25325=>1844, -25345=>1845, -25326=>1846, -25341=>1847, -25351=>1848, -25329=>1849, -25335=>1850, -25327=>1851, -25324=>1852, -25342=>1853, -25332=>1854, -25361=>1855, -25346=>1856, -25919=>1857, -25925=>1858, -26027=>1859, -26045=>1860, -26082=>1861, -26149=>1862, -26157=>1863, -26144=>1864, -26151=>1865, -26159=>1866, -26143=>1867, -26152=>1868, -26161=>1869, -26148=>1870, -26359=>1871, -26623=>1872, -26579=>1873, -26609=>1874, -26580=>1875, -26576=>1876, -26604=>1877, -26550=>1878, -26543=>1879, -26613=>1880, -26601=>1881, -26607=>1882, -26564=>1883, -26577=>1884, -26548=>1885, -26586=>1886, -26597=>1887, -26552=>1888, -26575=>1889, -26590=>1890, -26611=>1891, -26544=>1892, -26585=>1893, -26594=>1894, -26589=>1895, -26578=>1896, -27498=>1897, -27523=>1898, -27526=>1899, -27573=>1900, -27602=>1901, -27607=>1902, -27679=>1903, -27849=>1904, -27915=>1905, -27954=>1906, -27946=>1907, -27969=>1908, -27941=>1909, -27916=>1910, -27953=>1911, -27934=>1912, -27927=>1913, -27963=>1914, -27965=>1915, -27966=>1916, -27958=>1917, -27931=>1918, -27893=>1919, -27961=>1920, -27943=>1921, -27960=>1922, -27945=>1923, -27950=>1924, -27957=>1925, -27918=>1926, -27947=>1927, -28843=>1928, -28858=>1929, -28851=>1930, -28844=>1931, -28847=>1932, -28845=>1933, -28856=>1934, -28846=>1935, -28836=>1936, -29232=>1937, -29298=>1938, -29295=>1939, -29300=>1940, -29417=>1941, -29408=>1942, -29409=>1943, -29623=>1944, -29642=>1945, -29627=>1946, -29618=>1947, -29645=>1948, -29632=>1949, -29619=>1950, -29978=>1951, -29997=>1952, -30031=>1953, -30028=>1954, -30030=>1955, -30027=>1956, -30123=>1957, -30116=>1958, -30117=>1959, -30114=>1960, -30115=>1961, -30328=>1962, -30342=>1963, -30343=>1964, -30344=>1965, -30408=>1966, -30406=>1967, -30403=>1968, -30405=>1969, -30465=>1970, -30457=>1971, -30456=>1972, -30473=>1973, -30475=>1974, -30462=>1975, -30460=>1976, -30471=>1977, -30684=>1978, -30722=>1979, -30740=>1980, -30732=>1981, -30733=>1982, -31046=>1983, -31049=>1984, -31048=>1985, -31047=>1986, -31161=>1987, -31162=>1988, -31185=>1989, -31186=>1990, -31179=>1991, -31359=>1992, -31361=>1993, -31487=>1994, -31485=>1995, -31869=>1996, -32002=>1997, -32005=>1998, -32000=>1999, -32009=>2000, -32007=>2001, -32004=>2002, -32006=>2003, -32568=>2004, -32654=>2005, -32703=>2006, -32784=>2007, -32781=>2008, -32785=>2009, -32822=>2010, -32982=>2011, -32997=>2012, -32986=>2013, -32963=>2014, -32964=>2015, -32972=>2016, -32993=>2017, -32987=>2018, -32974=>2019, -32990=>2020, -32996=>2021, -32989=>2022, -33268=>2023, -33314=>2024, -33511=>2025, -33539=>2026, -33541=>2027, -33507=>2028, -33499=>2029, -33510=>2030, -33540=>2031, -33509=>2032, -33538=>2033, -33545=>2034, -33490=>2035, -33495=>2036, -33521=>2037, -33537=>2038, -33500=>2039, -33492=>2040, -33489=>2041, -33502=>2042, -33491=>2043, -33503=>2044, -33519=>2045, -33542=>2046, -34384=>2047, -34425=>2048, -34427=>2049, -34426=>2050, -34893=>2051, -34923=>2052, -35201=>2053, -35284=>2054, -35336=>2055, -35330=>2056, -35331=>2057, -35998=>2058, -36000=>2059, -36212=>2060, -36211=>2061, -36276=>2062, -36557=>2063, -36556=>2064, -36848=>2065, -36838=>2066, -36834=>2067, -36842=>2068, -36837=>2069, -36845=>2070, -36843=>2071, -36836=>2072, -36840=>2073, -37066=>2074, -37070=>2075, -37057=>2076, -37059=>2077, -37195=>2078, -37194=>2079, -37325=>2080, -38274=>2081, -38480=>2082, -38475=>2083, -38476=>2084, -38477=>2085, -38754=>2086, -12207=>2086, -38761=>2087, -12208=>2087, -38859=>2088, -12209=>2088, -38893=>2089, -12210=>2089, -38899=>2090, -12211=>2090, -38913=>2091, -12212=>2091, -39080=>2092, -12213=>2092, -39131=>2093, -12214=>2093, -39135=>2094, -12215=>2094, -39318=>2095, -12216=>2095, -39321=>2096, -12217=>2096, -20056=>2097, -20147=>2098, -20492=>2099, -20493=>2100, -20515=>2101, -20463=>2102, -20518=>2103, -20517=>2104, -20472=>2105, -20521=>2106, -57375=>2106, -20502=>2107, -20486=>2108, -20540=>2109, -20511=>2110, -20506=>2111, -20498=>2112, -20497=>2113, -20474=>2114, -20480=>2115, -20500=>2116, -20520=>2117, -20465=>2118, -20513=>2119, -20491=>2120, -20505=>2121, -20504=>2122, -20467=>2123, -20462=>2124, -20525=>2125, -20522=>2126, -20478=>2127, -20523=>2128, -20489=>2129, -20860=>2130, -20900=>2131, -20901=>2132, -20898=>2133, -20941=>2134, -20940=>2135, -20934=>2136, -20939=>2137, -21078=>2138, -21084=>2139, -21076=>2140, -21083=>2141, -21085=>2142, -21290=>2143, -21375=>2144, -57459=>2144, -21407=>2145, -21405=>2146, -21471=>2147, -21736=>2148, -21776=>2149, -21761=>2150, -21815=>2151, -21756=>2152, -21733=>2153, -21746=>2154, -21766=>2155, -21754=>2156, -21780=>2157, -21737=>2158, -21741=>2159, -21729=>2160, -21769=>2161, -21742=>2162, -21738=>2163, -21734=>2164, -21799=>2165, -21767=>2166, -21757=>2167, -21775=>2168, -22275=>2169, -22276=>2170, -22466=>2171, -22484=>2172, -22475=>2173, -22467=>2174, -22537=>2175, -22799=>2176, -22871=>2177, -22872=>2178, -22874=>2179, -23057=>2180, -23064=>2181, -23068=>2182, -23071=>2183, -23067=>2184, -23059=>2185, -23020=>2186, -23072=>2187, -23075=>2188, -23081=>2189, -23077=>2190, -23052=>2191, -23049=>2192, -23403=>2193, -23640=>2194, -23472=>2195, -23475=>2196, -23478=>2197, -23476=>2198, -23470=>2199, -23477=>2200, -23481=>2201, -23480=>2202, -23556=>2203, -23633=>2204, -23637=>2205, -23632=>2206, -23789=>2207, -23805=>2208, -23803=>2209, -23786=>2210, -23784=>2211, -23792=>2212, -23798=>2213, -23809=>2214, -23796=>2215, -24046=>2216, -24109=>2217, -24107=>2218, -24235=>2219, -24237=>2220, -24231=>2221, -24369=>2222, -24466=>2223, -24465=>2224, -24464=>2225, -24665=>2226, -24675=>2227, -24677=>2228, -24656=>2229, -24661=>2230, -24685=>2231, -24681=>2232, -24687=>2233, -24708=>2234, -24735=>2235, -24730=>2236, -24717=>2237, -24724=>2238, -24716=>2239, -24709=>2240, -24726=>2241, -25159=>2242, -25331=>2243, -25352=>2244, -25343=>2245, -25422=>2246, -25406=>2247, -25391=>2248, -25429=>2249, -25410=>2250, -25414=>2251, -25423=>2252, -25417=>2253, -25402=>2254, -25424=>2255, -25405=>2256, -25386=>2257, -25387=>2258, -25384=>2259, -25421=>2260, -25420=>2261, -25928=>2262, -25929=>2263, -26009=>2264, -26049=>2265, -26053=>2266, -26178=>2267, -26185=>2268, -26191=>2269, -26179=>2270, -26194=>2271, -26188=>2272, -26181=>2273, -26177=>2274, -26360=>2275, -26388=>2276, -26389=>2277, -26391=>2278, -26657=>2279, -26680=>2280, -26696=>2281, -26694=>2282, -26707=>2283, -26681=>2284, -26690=>2285, -26708=>2286, -26665=>2287, -26803=>2288, -26647=>2289, -26700=>2290, -26705=>2291, -26685=>2292, -26612=>2293, -26704=>2294, -26688=>2295, -26684=>2296, -26691=>2297, -26666=>2298, -26693=>2299, -26643=>2300, -26648=>2301, -26689=>2302, -27530=>2303, -27529=>2304, -27575=>2305, -27683=>2306, -27687=>2307, -27688=>2308, -27686=>2309, -27684=>2310, -27888=>2311, -28010=>2312, -28053=>2313, -28040=>2314, -28039=>2315, -28006=>2316, -28024=>2317, -28023=>2318, -27993=>2319, -28051=>2320, -28012=>2321, -28041=>2322, -28014=>2323, -27994=>2324, -28020=>2325, -28009=>2326, -28044=>2327, -28042=>2328, -28025=>2329, -28037=>2330, -28005=>2331, -28052=>2332, -28874=>2333, -28888=>2334, -28900=>2335, -28889=>2336, -28872=>2337, -28879=>2338, -29241=>2339, -29305=>2340, -29436=>2341, -29433=>2342, -29437=>2343, -29432=>2344, -29431=>2345, -29574=>2346, -29677=>2347, -29705=>2348, -29678=>2349, -29664=>2350, -29674=>2351, -29662=>2352, -30036=>2353, -30045=>2354, -30044=>2355, -30042=>2356, -30041=>2357, -30142=>2358, -30149=>2359, -30151=>2360, -30130=>2361, -30131=>2362, -30141=>2363, -30140=>2364, -30137=>2365, -30146=>2366, -30136=>2367, -30347=>2368, -30384=>2369, -30410=>2370, -30413=>2371, -30414=>2372, -30505=>2373, -30495=>2374, -30496=>2375, -30504=>2376, -30697=>2377, -30768=>2378, -30759=>2379, -30776=>2380, -30749=>2381, -30772=>2382, -30775=>2383, -30757=>2384, -30765=>2385, -30752=>2386, -30751=>2387, -30770=>2388, -31061=>2389, -31056=>2390, -31072=>2391, -31071=>2392, -31062=>2393, -31070=>2394, -31069=>2395, -31063=>2396, -31066=>2397, -31204=>2398, -31203=>2399, -60418=>2399, -31207=>2400, -31199=>2401, -31206=>2402, -31209=>2403, -31192=>2404, -31364=>2405, -31368=>2406, -31449=>2407, -31494=>2408, -31505=>2409, -31881=>2410, -32033=>2411, -32023=>2412, -32011=>2413, -32010=>2414, -32032=>2415, -32034=>2416, -32020=>2417, -32016=>2418, -32021=>2419, -32026=>2420, -32028=>2421, -32013=>2422, -32025=>2423, -32027=>2424, -32570=>2425, -32607=>2426, -32660=>2427, -32709=>2428, -32705=>2429, -32774=>2430, -32772=>2431, -32792=>2432, -32789=>2433, -32793=>2434, -32791=>2435, -32829=>2436, -32831=>2437, -33009=>2438, -33026=>2439, -33008=>2440, -33029=>2441, -33005=>2442, -33012=>2443, -33030=>2444, -33016=>2445, -33011=>2446, -33032=>2447, -33021=>2448, -33034=>2449, -33020=>2450, -33007=>2451, -33261=>2452, -33260=>2453, -33280=>2454, -33296=>2455, -33322=>2456, -33323=>2457, -33320=>2458, -33324=>2459, -33467=>2460, -33579=>2461, -33618=>2462, -33620=>2463, -33610=>2464, -33592=>2465, -33616=>2466, -33609=>2467, -33589=>2468, -33588=>2469, -33615=>2470, -33586=>2471, -33593=>2472, -33590=>2473, -33559=>2474, -33600=>2475, -33585=>2476, -33576=>2477, -33603=>2478, -34388=>2479, -34442=>2480, -34474=>2481, -34451=>2482, -34468=>2483, -34473=>2484, -34444=>2485, -34467=>2486, -34460=>2487, -34928=>2488, -34935=>2489, -34945=>2490, -34946=>2491, -34941=>2492, -34937=>2493, -35352=>2494, -35344=>2495, -35342=>2496, -35340=>2497, -35349=>2498, -35338=>2499, -35351=>2500, -35347=>2501, -35350=>2502, -35343=>2503, -35345=>2504, -35912=>2505, -35962=>2506, -35961=>2507, -36001=>2508, -36002=>2509, -36215=>2510, -58442=>2510, -36524=>2511, -36562=>2512, -36564=>2513, -36559=>2514, -36785=>2515, -36865=>2516, -36870=>2517, -36855=>2518, -36864=>2519, -36858=>2520, -36852=>2521, -36867=>2522, -36861=>2523, -36869=>2524, -36856=>2525, -37013=>2526, -37089=>2527, -37085=>2528, -37090=>2529, -37202=>2530, -37197=>2531, -37196=>2532, -37336=>2533, -37341=>2534, -37335=>2535, -37340=>2536, -37337=>2537, -38275=>2538, -38498=>2539, -38499=>2540, -38497=>2541, -38491=>2542, -38493=>2543, -38500=>2544, -38488=>2545, -38494=>2546, -38587=>2547, -39138=>2548, -39340=>2549, -12218=>2549, -39592=>2550, -12219=>2550, -39640=>2551, -12220=>2551, -12222=>2552, -39717=>2552, -39730=>2553, -12224=>2553, -39740=>2554, -12225=>2554, -20094=>2555, -20602=>2556, -20605=>2557, -57382=>2557, -20572=>2558, -20551=>2559, -20547=>2560, -20556=>2561, -20570=>2562, -20553=>2563, -20581=>2564, -20598=>2565, -20558=>2566, -20565=>2567, -20597=>2568, -20596=>2569, -20599=>2570, -20559=>2571, -20495=>2572, -20591=>2573, -20589=>2574, -20828=>2575, -20885=>2576, -20976=>2577, -21098=>2578, -21103=>2579, -21202=>2580, -21209=>2581, -21208=>2582, -21205=>2583, -21264=>2584, -21263=>2585, -21273=>2586, -21311=>2587, -21312=>2588, -21310=>2589, -21443=>2590, -26364=>2591, -21830=>2592, -21866=>2593, -21862=>2594, -21828=>2595, -21854=>2596, -21857=>2597, -21827=>2598, -21834=>2599, -21809=>2600, -21846=>2601, -21839=>2602, -21845=>2603, -21807=>2604, -21860=>2605, -21816=>2606, -21806=>2607, -21852=>2608, -21804=>2609, -21859=>2610, -21811=>2611, -21825=>2612, -21847=>2613, -22280=>2614, -22283=>2615, -22281=>2616, -22495=>2617, -22533=>2618, -22538=>2619, -22534=>2620, -22496=>2621, -22500=>2622, -22522=>2623, -22530=>2624, -22581=>2625, -22519=>2626, -22521=>2627, -22816=>2628, -22882=>2629, -23094=>2630, -23105=>2631, -23113=>2632, -23142=>2633, -23146=>2634, -23104=>2635, -23100=>2636, -23138=>2637, -23130=>2638, -23110=>2639, -23114=>2640, -23408=>2641, -23495=>2642, -23493=>2643, -23492=>2644, -23490=>2645, -23487=>2646, -23494=>2647, -23561=>2648, -23560=>2649, -23559=>2650, -23648=>2651, -23644=>2652, -23645=>2653, -23815=>2654, -23814=>2655, -23822=>2656, -23835=>2657, -23830=>2658, -23842=>2659, -23825=>2660, -23849=>2661, -23828=>2662, -23833=>2663, -23844=>2664, -23847=>2665, -23831=>2666, -24034=>2667, -24120=>2668, -24118=>2669, -24115=>2670, -24119=>2671, -24247=>2672, -24248=>2673, -24246=>2674, -24245=>2675, -24254=>2676, -24373=>2677, -24375=>2678, -24407=>2679, -24428=>2680, -24425=>2681, -24427=>2682, -24471=>2683, -24473=>2684, -24478=>2685, -24472=>2686, -24481=>2687, -24480=>2688, -24476=>2689, -24703=>2690, -24739=>2691, -24713=>2692, -24736=>2693, -24744=>2694, -24779=>2695, -24756=>2696, -24806=>2697, -24765=>2698, -24773=>2699, -24763=>2700, -24757=>2701, -24796=>2702, -24764=>2703, -24792=>2704, -24789=>2705, -24774=>2706, -24799=>2707, -24760=>2708, -24794=>2709, -24775=>2710, -25114=>2711, -25115=>2712, -25160=>2713, -25504=>2714, -25511=>2715, -25458=>2716, -25494=>2717, -25506=>2718, -25509=>2719, -25463=>2720, -25447=>2721, -25496=>2722, -25514=>2723, -25457=>2724, -25513=>2725, -25481=>2726, -25475=>2727, -25499=>2728, -25451=>2729, -25512=>2730, -25476=>2731, -25480=>2732, -25497=>2733, -25505=>2734, -25516=>2735, -25490=>2736, -25487=>2737, -25472=>2738, -25467=>2739, -25449=>2740, -25448=>2741, -25466=>2742, -25949=>2743, -25942=>2744, -25937=>2745, -25945=>2746, -25943=>2747, -21855=>2748, -25935=>2749, -25944=>2750, -25941=>2751, -25940=>2752, -26012=>2753, -26011=>2754, -26028=>2755, -26063=>2756, -26059=>2757, -26060=>2758, -26062=>2759, -26205=>2760, -26202=>2761, -26212=>2762, -26216=>2763, -26214=>2764, -26206=>2765, -26361=>2766, -21207=>2767, -26395=>2768, -26753=>2769, -26799=>2770, -26786=>2771, -26771=>2772, -26805=>2773, -26751=>2774, -26742=>2775, -26801=>2776, -26791=>2777, -26775=>2778, -26800=>2779, -26755=>2780, -26820=>2781, -26797=>2782, -26758=>2783, -26757=>2784, -26772=>2785, -26781=>2786, -26792=>2787, -26783=>2788, -26785=>2789, -26754=>2790, -27442=>2791, -27578=>2792, -27627=>2793, -27628=>2794, -27691=>2795, -28046=>2796, -28092=>2797, -28147=>2798, -28121=>2799, -28082=>2800, -28129=>2801, -28108=>2802, -28132=>2803, -28155=>2804, -28154=>2805, -28165=>2806, -28103=>2807, -28107=>2808, -28079=>2809, -28113=>2810, -28078=>2811, -28126=>2812, -28153=>2813, -28088=>2814, -28151=>2815, -28149=>2816, -28101=>2817, -28114=>2818, -28186=>2819, -28085=>2820, -28122=>2821, -28139=>2822, -28120=>2823, -28138=>2824, -28145=>2825, -28142=>2826, -28136=>2827, -28102=>2828, -28100=>2829, -28074=>2830, -28140=>2831, -28095=>2832, -28134=>2833, -28921=>2834, -28937=>2835, -28938=>2836, -28925=>2837, -28911=>2838, -29245=>2839, -29309=>2840, -29313=>2841, -29468=>2842, -29467=>2843, -29462=>2844, -29459=>2845, -29465=>2846, -29575=>2847, -29701=>2848, -29706=>2849, -29699=>2850, -29702=>2851, -29694=>2852, -29709=>2853, -29920=>2854, -29942=>2855, -29943=>2856, -29980=>2857, -29986=>2858, -30053=>2859, -30054=>2860, -30050=>2861, -30064=>2862, -30095=>2863, -30164=>2864, -30165=>2865, -30133=>2866, -30154=>2867, -30157=>2868, -30350=>2869, -30420=>2870, -30418=>2871, -30427=>2872, -30519=>2873, -30526=>2874, -30524=>2875, -30518=>2876, -30520=>2877, -30522=>2878, -30827=>2879, -30787=>2880, -30798=>2881, -31077=>2882, -31080=>2883, -31085=>2884, -31227=>2885, -31378=>2886, -31381=>2887, -31520=>2888, -31528=>2889, -31515=>2890, -31532=>2891, -31526=>2892, -31513=>2893, -31518=>2894, -31534=>2895, -31890=>2896, -31895=>2897, -31893=>2898, -32070=>2899, -32067=>2900, -32113=>2901, -32046=>2902, -32057=>2903, -32060=>2904, -32064=>2905, -32048=>2906, -32051=>2907, -32068=>2908, -32047=>2909, -32066=>2910, -32050=>2911, -32049=>2912, -32573=>2913, -32670=>2914, -32666=>2915, -32716=>2916, -32718=>2917, -32722=>2918, -32796=>2919, -32842=>2920, -32838=>2921, -33071=>2922, -33046=>2923, -33059=>2924, -33067=>2925, -33065=>2926, -33072=>2927, -33060=>2928, -33282=>2929, -33333=>2930, -33335=>2931, -33334=>2932, -33337=>2933, -33678=>2934, -33694=>2935, -33688=>2936, -33656=>2937, -33698=>2938, -33686=>2939, -33725=>2940, -33707=>2941, -33682=>2942, -33674=>2943, -33683=>2944, -33673=>2945, -33696=>2946, -33655=>2947, -33659=>2948, -33660=>2949, -33670=>2950, -33703=>2951, -34389=>2952, -24426=>2953, -34503=>2954, -34496=>2955, -34486=>2956, -34500=>2957, -34485=>2958, -34502=>2959, -34507=>2960, -34481=>2961, -34479=>2962, -34505=>2963, -34899=>2964, -34974=>2965, -34952=>2966, -34987=>2967, -34962=>2968, -34966=>2969, -34957=>2970, -34955=>2971, -35219=>2972, -35215=>2973, -35370=>2974, -35357=>2975, -35363=>2976, -35365=>2977, -35377=>2978, -35373=>2979, -35359=>2980, -35355=>2981, -35362=>2982, -35913=>2983, -35930=>2984, -36009=>2985, -36012=>2986, -36011=>2987, -36008=>2988, -36010=>2989, -36007=>2990, -36199=>2991, -36198=>2992, -36286=>2993, -36282=>2994, -36571=>2995, -36575=>2996, -36889=>2997, -36877=>2998, -36890=>2999, -36887=>3000, -36899=>3001, -36895=>3002, -36893=>3003, -36880=>3004, -36885=>3005, -36894=>3006, -36896=>3007, -36879=>3008, -36898=>3009, -36886=>3010, -36891=>3011, -36884=>3012, -37096=>3013, -37101=>3014, -37117=>3015, -58488=>3015, -37207=>3016, -37326=>3017, -37365=>3018, -37350=>3019, -37347=>3020, -37351=>3021, -37357=>3022, -37353=>3023, -38281=>3024, -38506=>3025, -38517=>3026, -38515=>3027, -38520=>3028, -38512=>3029, -38516=>3030, -38518=>3031, -38519=>3032, -38508=>3033, -38592=>3034, -38634=>3035, -38633=>3036, -31456=>3037, -31455=>3038, -38914=>3039, -38915=>3040, -39770=>3041, -12226=>3041, -40165=>3042, -12227=>3042, -40565=>3043, -12228=>3043, -40575=>3044, -12229=>3044, -40613=>3045, -12230=>3045, -40635=>3046, -12231=>3046, -20642=>3047, -20621=>3048, -20613=>3049, -20633=>3050, -20625=>3051, -20608=>3052, -20630=>3053, -20632=>3054, -20634=>3055, -26368=>3056, -20977=>3057, -21106=>3058, -21108=>3059, -21109=>3060, -21097=>3061, -21214=>3062, -21213=>3063, -21211=>3064, -21338=>3065, -21413=>3066, -21883=>3067, -21888=>3068, -21927=>3069, -21884=>3070, -21898=>3071, -21917=>3072, -21912=>3073, -21890=>3074, -21916=>3075, -21930=>3076, -21908=>3077, -21895=>3078, -21899=>3079, -21891=>3080, -21939=>3081, -21934=>3082, -21919=>3083, -21822=>3084, -21938=>3085, -21914=>3086, -21947=>3087, -21932=>3088, -21937=>3089, -21886=>3090, -21897=>3091, -21931=>3092, -21913=>3093, -22285=>3094, -22575=>3095, -22570=>3096, -22580=>3097, -22564=>3098, -22576=>3099, -22577=>3100, -22561=>3101, -22557=>3102, -22560=>3103, -22777=>3104, -22778=>3105, -22880=>3106, -23159=>3107, -57587=>3107, -23194=>3108, -23167=>3109, -23186=>3110, -23195=>3111, -23207=>3112, -23411=>3113, -23409=>3114, -23506=>3115, -23500=>3116, -23507=>3117, -23504=>3118, -23562=>3119, -23563=>3120, -23601=>3121, -23884=>3122, -23888=>3123, -23860=>3124, -23879=>3125, -24061=>3126, -24133=>3127, -24125=>3128, -24128=>3129, -24131=>3130, -24190=>3131, -24266=>3132, -24257=>3133, -24258=>3134, -24260=>3135, -24380=>3136, -24429=>3137, -24489=>3138, -24490=>3139, -24488=>3140, -24785=>3141, -24801=>3142, -24754=>3143, -24758=>3144, -24800=>3145, -24860=>3146, -24867=>3147, -24826=>3148, -24853=>3149, -24816=>3150, -24827=>3151, -24820=>3152, -24936=>3153, -24817=>3154, -24846=>3155, -24822=>3156, -24841=>3157, -24832=>3158, -24850=>3159, -25119=>3160, -25161=>3161, -25507=>3162, -25484=>3163, -25551=>3164, -25536=>3165, -25577=>3166, -25545=>3167, -25542=>3168, -25549=>3169, -25554=>3170, -25571=>3171, -25552=>3172, -25569=>3173, -25558=>3174, -25581=>3175, -25582=>3176, -25462=>3177, -25588=>3178, -25578=>3179, -25563=>3180, -25682=>3181, -25562=>3182, -25593=>3183, -25950=>3184, -25958=>3185, -25954=>3186, -25955=>3187, -26001=>3188, -26000=>3189, -26031=>3190, -26222=>3191, -26224=>3192, -26228=>3193, -57786=>3193, -26230=>3194, -26223=>3195, -26257=>3196, -26234=>3197, -26238=>3198, -26231=>3199, -26366=>3200, -26367=>3201, -26399=>3202, -26397=>3203, -26874=>3204, -26837=>3205, -26848=>3206, -26840=>3207, -26839=>3208, -26885=>3209, -26847=>3210, -26869=>3211, -26862=>3212, -26855=>3213, -26873=>3214, -26834=>3215, -26866=>3216, -26851=>3217, -26827=>3218, -26829=>3219, -26893=>3220, -26898=>3221, -26894=>3222, -26825=>3223, -26842=>3224, -26990=>3225, -26875=>3226, -27454=>3227, -27450=>3228, -27453=>3229, -27544=>3230, -27542=>3231, -27580=>3232, -27631=>3233, -27694=>3234, -27695=>3235, -27692=>3236, -28207=>3237, -57904=>3237, -28216=>3238, -28244=>3239, -28193=>3240, -28210=>3241, -28263=>3242, -28234=>3243, -28192=>3244, -28197=>3245, -28195=>3246, -28187=>3247, -28251=>3248, -28248=>3249, -28196=>3250, -28246=>3251, -28270=>3252, -28205=>3253, -28198=>3254, -28271=>3255, -28212=>3256, -28237=>3257, -28218=>3258, -28204=>3259, -28227=>3260, -28189=>3261, -57901=>3261, -28222=>3262, -28363=>3263, -28297=>3264, -28185=>3265, -28238=>3266, -28259=>3267, -28228=>3268, -28274=>3269, -28265=>3270, -28255=>3271, -28953=>3272, -28954=>3273, -28966=>3274, -28976=>3275, -28961=>3276, -28982=>3277, -29038=>3278, -57958=>3278, -28956=>3279, -29260=>3280, -29316=>3281, -29312=>3282, -29494=>3283, -29477=>3284, -29492=>3285, -29481=>3286, -29754=>3287, -29738=>3288, -29747=>3289, -29730=>3290, -29733=>3291, -29749=>3292, -29750=>3293, -29748=>3294, -29743=>3295, -29723=>3296, -29734=>3297, -29736=>3298, -29989=>3299, -29990=>3300, -30059=>3301, -30058=>3302, -30178=>3303, -30171=>3304, -30179=>3305, -30169=>3306, -30168=>3307, -30174=>3308, -30176=>3309, -30331=>3310, -30332=>3311, -30358=>3312, -30355=>3313, -30388=>3314, -30428=>3315, -30543=>3316, -30701=>3317, -30813=>3318, -30828=>3319, -30831=>3320, -31245=>3321, -31240=>3322, -31243=>3323, -31237=>3324, -31232=>3325, -31384=>3326, -31383=>3327, -31382=>3328, -31461=>3329, -31459=>3330, -31561=>3331, -31574=>3332, -31558=>3333, -31568=>3334, -31570=>3335, -31572=>3336, -31565=>3337, -31563=>3338, -31567=>3339, -31569=>3340, -60510=>3340, -31903=>3341, -31909=>3342, -32094=>3343, -32080=>3344, -32104=>3345, -32085=>3346, -32043=>3347, -32110=>3348, -32114=>3349, -32097=>3350, -32102=>3351, -32098=>3352, -32112=>3353, -32115=>3354, -21892=>3355, -32724=>3356, -32725=>3357, -32779=>3358, -32850=>3359, -32901=>3360, -33109=>3361, -33108=>3362, -33099=>3363, -33105=>3364, -33102=>3365, -33081=>3366, -33094=>3367, -33086=>3368, -33100=>3369, -33107=>3370, -33140=>3371, -33298=>3372, -33308=>3373, -33769=>3374, -33795=>3375, -33784=>3376, -33805=>3377, -33760=>3378, -33733=>3379, -33803=>3380, -33729=>3381, -58309=>3381, -33775=>3382, -33777=>3383, -33780=>3384, -33879=>3385, -33802=>3386, -33776=>3387, -33804=>3388, -33740=>3389, -33789=>3390, -33778=>3391, -33738=>3392, -33848=>3393, -33806=>3394, -33796=>3395, -33756=>3396, -33799=>3397, -33748=>3398, -33759=>3399, -34395=>3400, -34527=>3401, -34521=>3402, -34541=>3403, -34516=>3404, -34523=>3405, -34532=>3406, -34512=>3407, -34526=>3408, -34903=>3409, -35009=>3410, -35010=>3411, -34993=>3412, -35203=>3413, -35222=>3414, -35387=>3415, -35424=>3416, -35413=>3417, -35422=>3418, -35388=>3419, -35393=>3420, -35412=>3421, -35419=>3422, -35408=>3423, -35398=>3424, -35380=>3425, -35386=>3426, -35382=>3427, -35414=>3428, -35937=>3429, -35970=>3430, -36015=>3431, -36028=>3432, -36019=>3433, -36029=>3434, -36033=>3435, -36027=>3436, -36032=>3437, -36020=>3438, -36023=>3439, -36022=>3440, -36031=>3441, -36024=>3442, -36234=>3443, -36229=>3444, -36225=>3445, -36302=>3446, -36317=>3447, -36299=>3448, -36314=>3449, -36305=>3450, -36300=>3451, -36315=>3452, -36294=>3453, -36603=>3454, -36600=>3455, -36604=>3456, -36764=>3457, -36910=>3458, -36917=>3459, -36913=>3460, -36920=>3461, -36914=>3462, -36918=>3463, -37122=>3464, -37109=>3465, -37129=>3466, -37118=>3467, -37219=>3468, -37221=>3469, -37327=>3470, -37396=>3471, -37397=>3472, -37411=>3473, -37385=>3474, -37406=>3475, -37389=>3476, -37392=>3477, -37383=>3478, -37393=>3479, -38292=>3480, -38287=>3481, -38283=>3482, -38289=>3483, -38291=>3484, -38290=>3485, -38286=>3486, -38538=>3487, -38542=>3488, -38539=>3489, -38525=>3490, -38533=>3491, -38534=>3492, -38541=>3493, -38514=>3494, -38532=>3495, -38593=>3496, -38597=>3497, -38596=>3498, -38598=>3499, -38599=>3500, -38639=>3501, -38642=>3502, -38860=>3503, -38917=>3504, -38918=>3505, -38920=>3506, -39143=>3507, -39146=>3508, -39151=>3509, -39145=>3510, -39154=>3511, -39149=>3512, -39342=>3513, -39341=>3514, -40643=>3515, -12232=>3515, -40653=>3516, -12233=>3516, -40657=>3517, -12234=>3517, -20098=>3518, -20653=>3519, -20661=>3520, -20658=>3521, -20659=>3522, -20677=>3523, -20670=>3524, -20652=>3525, -20663=>3526, -20667=>3527, -20655=>3528, -20679=>3529, -21119=>3530, -21111=>3531, -21117=>3532, -21215=>3533, -21222=>3534, -21220=>3535, -21218=>3536, -21219=>3537, -21295=>3538, -21983=>3539, -21992=>3540, -21971=>3541, -21990=>3542, -21966=>3543, -21980=>3544, -21959=>3545, -21969=>3546, -21987=>3547, -21988=>3548, -21999=>3549, -21978=>3550, -21985=>3551, -21957=>3552, -21958=>3553, -21989=>3554, -21961=>3555, -22290=>3556, -22291=>3557, -22622=>3558, -22609=>3559, -22616=>3560, -22615=>3561, -22618=>3562, -22612=>3563, -22635=>3564, -22604=>3565, -22637=>3566, -22602=>3567, -22626=>3568, -22610=>3569, -22603=>3570, -22887=>3571, -23233=>3572, -23241=>3573, -23244=>3574, -23230=>3575, -23229=>3576, -23228=>3577, -23219=>3578, -23234=>3579, -23218=>3580, -23913=>3581, -23919=>3582, -24140=>3583, -24185=>3584, -24265=>3585, -24264=>3586, -24338=>3587, -24409=>3588, -24492=>3589, -24494=>3590, -24858=>3591, -24847=>3592, -24904=>3593, -24863=>3594, -24819=>3595, -24859=>3596, -24825=>3597, -24833=>3598, -24840=>3599, -24910=>3600, -24908=>3601, -24900=>3602, -24909=>3603, -24894=>3604, -24884=>3605, -24871=>3606, -24845=>3607, -24838=>3608, -24887=>3609, -25121=>3610, -25122=>3611, -25619=>3612, -25662=>3613, -25630=>3614, -25642=>3615, -25645=>3616, -25661=>3617, -25644=>3618, -25615=>3619, -25628=>3620, -25620=>3621, -25613=>3622, -25654=>3623, -25622=>3624, -25623=>3625, -25606=>3626, -25964=>3627, -26015=>3628, -26032=>3629, -26263=>3630, -26249=>3631, -26247=>3632, -26248=>3633, -26262=>3634, -26244=>3635, -26264=>3636, -26253=>3637, -26371=>3638, -27028=>3639, -26989=>3640, -26970=>3641, -26999=>3642, -26976=>3643, -26964=>3644, -26997=>3645, -26928=>3646, -27010=>3647, -26954=>3648, -26984=>3649, -26987=>3650, -26974=>3651, -26963=>3652, -27001=>3653, -27014=>3654, -26973=>3655, -26979=>3656, -26971=>3657, -27463=>3658, -27506=>3659, -27584=>3660, -27583=>3661, -27603=>3662, -27645=>3663, -28322=>3664, -28335=>3665, -28371=>3666, -28342=>3667, -28354=>3668, -28304=>3669, -28317=>3670, -28359=>3671, -28357=>3672, -28325=>3673, -28312=>3674, -28348=>3675, -28346=>3676, -28331=>3677, -28369=>3678, -28310=>3679, -28316=>3680, -28356=>3681, -28372=>3682, -28330=>3683, -28327=>3684, -28340=>3685, -29006=>3686, -29017=>3687, -29033=>3688, -29028=>3689, -29001=>3690, -29031=>3691, -29020=>3692, -29036=>3693, -29030=>3694, -29004=>3695, -29029=>3696, -29022=>3697, -28998=>3698, -29032=>3699, -29014=>3700, -29242=>3701, -29266=>3702, -29495=>3703, -29509=>3704, -29503=>3705, -29502=>3706, -29807=>3707, -29786=>3708, -29781=>3709, -29791=>3710, -29790=>3711, -29761=>3712, -29759=>3713, -29785=>3714, -29787=>3715, -58019=>3716, -29788=>3716, -30070=>3717, -30072=>3718, -30208=>3719, -30192=>3720, -30209=>3721, -30194=>3722, -30193=>3723, -30202=>3724, -30207=>3725, -30196=>3726, -30195=>3727, -30430=>3728, -30431=>3729, -30555=>3730, -30571=>3731, -30566=>3732, -30558=>3733, -30563=>3734, -30585=>3735, -30570=>3736, -30572=>3737, -30556=>3738, -30565=>3739, -30568=>3740, -30562=>3741, -30702=>3742, -30862=>3743, -30896=>3744, -30871=>3745, -30872=>3746, -30860=>3747, -30857=>3748, -30844=>3749, -30865=>3750, -30867=>3751, -30847=>3752, -31098=>3753, -31103=>3754, -31105=>3755, -33836=>3756, -31165=>3757, -31260=>3758, -31258=>3759, -31264=>3760, -31252=>3761, -31263=>3762, -31262=>3763, -31391=>3764, -31392=>3765, -31607=>3766, -31680=>3767, -31584=>3768, -31598=>3769, -31591=>3770, -31921=>3771, -31923=>3772, -31925=>3773, -32147=>3774, -32121=>3775, -32145=>3776, -32129=>3777, -32143=>3778, -32091=>3779, -32622=>3780, -32617=>3781, -32618=>3782, -32626=>3783, -32681=>3784, -32680=>3785, -32676=>3786, -32854=>3787, -32856=>3788, -32902=>3789, -32900=>3790, -33137=>3791, -33136=>3792, -33144=>3793, -33125=>3794, -33134=>3795, -33139=>3796, -33131=>3797, -33145=>3798, -33146=>3799, -33126=>3800, -33285=>3801, -33351=>3802, -33922=>3803, -33911=>3804, -33853=>3805, -33841=>3806, -33909=>3807, -33894=>3808, -33899=>3809, -33865=>3810, -33900=>3811, -33883=>3812, -33852=>3813, -33845=>3814, -33889=>3815, -33891=>3816, -33897=>3817, -33901=>3818, -33862=>3819, -34398=>3820, -34396=>3821, -34399=>3822, -34553=>3823, -34579=>3824, -34568=>3825, -34567=>3826, -34560=>3827, -34558=>3828, -34555=>3829, -34562=>3830, -34563=>3831, -34566=>3832, -34570=>3833, -34905=>3834, -35039=>3835, -35028=>3836, -35033=>3837, -35036=>3838, -35032=>3839, -35037=>3840, -35041=>3841, -35018=>3842, -35029=>3843, -35026=>3844, -35228=>3845, -35299=>3846, -35435=>3847, -35442=>3848, -35443=>3849, -35430=>3850, -35433=>3851, -35440=>3852, -35463=>3853, -35452=>3854, -35427=>3855, -35488=>3856, -35441=>3857, -35461=>3858, -35437=>3859, -35426=>3860, -35438=>3861, -35436=>3862, -35449=>3863, -35451=>3864, -35390=>3865, -35432=>3866, -35938=>3867, -35978=>3868, -35977=>3869, -36042=>3870, -36039=>3871, -36040=>3872, -36036=>3873, -36018=>3874, -36035=>3875, -36034=>3876, -36037=>3877, -36321=>3878, -36319=>3879, -36328=>3880, -36335=>3881, -36339=>3882, -36346=>3883, -36330=>3884, -36324=>3885, -36326=>3886, -36530=>3887, -36611=>3888, -36617=>3889, -36606=>3890, -36618=>3891, -36767=>3892, -36786=>3893, -36939=>3894, -36938=>3895, -36947=>3896, -36930=>3897, -36948=>3898, -36924=>3899, -36949=>3900, -36944=>3901, -36935=>3902, -36943=>3903, -36942=>3904, -36941=>3905, -36945=>3906, -36926=>3907, -36929=>3908, -37138=>3909, -37143=>3910, -37228=>3911, -37226=>3912, -37225=>3913, -37321=>3914, -37431=>3915, -37463=>3916, -37432=>3917, -37437=>3918, -37440=>3919, -37438=>3920, -37467=>3921, -37451=>3922, -37476=>3923, -37457=>3924, -37428=>3925, -37449=>3926, -37453=>3927, -37445=>3928, -37433=>3929, -37439=>3930, -37466=>3931, -38296=>3932, -38552=>3933, -38548=>3934, -38549=>3935, -38605=>3936, -38603=>3937, -38601=>3938, -38602=>3939, -38647=>3940, -38651=>3941, -38649=>3942, -38646=>3943, -38742=>3944, -38772=>3945, -38774=>3946, -38928=>3947, -38929=>3948, -38931=>3949, -38922=>3950, -38930=>3951, -38924=>3952, -39164=>3953, -39156=>3954, -39165=>3955, -39166=>3956, -39347=>3957, -39345=>3958, -39348=>3959, -39649=>3960, -40169=>3961, -40578=>3962, -40718=>3963, -12237=>3963, -40723=>3964, -12238=>3964, -40736=>3965, -12239=>3965, -20711=>3966, -20718=>3967, -20709=>3968, -20694=>3969, -20717=>3970, -60903=>3970, -20698=>3971, -20693=>3972, -20687=>3973, -20689=>3974, -20721=>3975, -20686=>3976, -20713=>3977, -20834=>3978, -20979=>3979, -21123=>3980, -21122=>3981, -21297=>3982, -21421=>3983, -22014=>3984, -22016=>3985, -22043=>3986, -22039=>3987, -22013=>3988, -22036=>3989, -22022=>3990, -22025=>3991, -22029=>3992, -22030=>3993, -22007=>3994, -22038=>3995, -22047=>3996, -22024=>3997, -22032=>3998, -22006=>3999, -22296=>4000, -22294=>4001, -22645=>4002, -22654=>4003, -22659=>4004, -22675=>4005, -22666=>4006, -22649=>4007, -22661=>4008, -22653=>4009, -22781=>4010, -22821=>4011, -22818=>4012, -22820=>4013, -22890=>4014, -22889=>4015, -23265=>4016, -23270=>4017, -23273=>4018, -23255=>4019, -23254=>4020, -23256=>4021, -23267=>4022, -23413=>4023, -23518=>4024, -23527=>4025, -23521=>4026, -23525=>4027, -23526=>4028, -23528=>4029, -23522=>4030, -23524=>4031, -23519=>4032, -23565=>4033, -23650=>4034, -23940=>4035, -23943=>4036, -24155=>4037, -24163=>4038, -24149=>4039, -24151=>4040, -24148=>4041, -24275=>4042, -24278=>4043, -24330=>4044, -24390=>4045, -24432=>4046, -24505=>4047, -24903=>4048, -24895=>4049, -24907=>4050, -24951=>4051, -24930=>4052, -24931=>4053, -24927=>4054, -24922=>4055, -24920=>4056, -24949=>4057, -25130=>4058, -25735=>4059, -25688=>4060, -25684=>4061, -25764=>4062, -25720=>4063, -25695=>4064, -25722=>4065, -25681=>4066, -25703=>4067, -25652=>4068, -25709=>4069, -25723=>4070, -25970=>4071, -26017=>4072, -26071=>4073, -26070=>4074, -26274=>4075, -26280=>4076, -26269=>4077, -27036=>4078, -27048=>4079, -27029=>4080, -27073=>4081, -27054=>4082, -27091=>4083, -27083=>4084, -27035=>4085, -27063=>4086, -27067=>4087, -27051=>4088, -27060=>4089, -27088=>4090, -27085=>4091, -27053=>4092, -27084=>4093, -27046=>4094, -27075=>4095, -27043=>4096, -27465=>4097, -27468=>4098, -27699=>4099, -28467=>4100, -28436=>4101, -28414=>4102, -28435=>4103, -28404=>4104, -28457=>4105, -28478=>4106, -28448=>4107, -28460=>4108, -28431=>4109, -28418=>4110, -28450=>4111, -28415=>4112, -28399=>4113, -28422=>4114, -28465=>4115, -28472=>4116, -28466=>4117, -28451=>4118, -28437=>4119, -28459=>4120, -28463=>4121, -28552=>4122, -28458=>4123, -28396=>4124, -28417=>4125, -28402=>4126, -28364=>4127, -28407=>4128, -29076=>4129, -29081=>4130, -29053=>4131, -29066=>4132, -29060=>4133, -29074=>4134, -29246=>4135, -29330=>4136, -29334=>4137, -29508=>4138, -29520=>4139, -29796=>4140, -29795=>4141, -29802=>4142, -29808=>4143, -29805=>4144, -29956=>4145, -30097=>4146, -30247=>4147, -30221=>4148, -30219=>4149, -30217=>4150, -30227=>4151, -30433=>4152, -30435=>4153, -30596=>4154, -30589=>4155, -30591=>4156, -30561=>4157, -30913=>4158, -30879=>4159, -30887=>4160, -30899=>4161, -30889=>4162, -30883=>4163, -31118=>4164, -31119=>4165, -31117=>4166, -31278=>4167, -31281=>4168, -31402=>4169, -31401=>4170, -31469=>4171, -31471=>4172, -31649=>4173, -31637=>4174, -31627=>4175, -31605=>4176, -31639=>4177, -31645=>4178, -31636=>4179, -31631=>4180, -31672=>4181, -58170=>4181, -31623=>4182, -31620=>4183, -31929=>4184, -31933=>4185, -31934=>4186, -32187=>4187, -32176=>4188, -32156=>4189, -32189=>4190, -32190=>4191, -32160=>4192, -32202=>4193, -32180=>4194, -32178=>4195, -32177=>4196, -32186=>4197, -32162=>4198, -32191=>4199, -32181=>4200, -32184=>4201, -32173=>4202, -32210=>4203, -58202=>4203, -32199=>4204, -32172=>4205, -32624=>4206, -32736=>4207, -32737=>4208, -32735=>4209, -32862=>4210, -32858=>4211, -32903=>4212, -33104=>4213, -33152=>4214, -33167=>4215, -33160=>4216, -33162=>4217, -33151=>4218, -33154=>4219, -33255=>4220, -33274=>4221, -33287=>4222, -33300=>4223, -33310=>4224, -33355=>4225, -33993=>4226, -33983=>4227, -33990=>4228, -33988=>4229, -33945=>4230, -33950=>4231, -33970=>4232, -33948=>4233, -33995=>4234, -33976=>4235, -33984=>4236, -34003=>4237, -33936=>4238, -33980=>4239, -34001=>4240, -33994=>4241, -34623=>4242, -34588=>4243, -34619=>4244, -34594=>4245, -34597=>4246, -34612=>4247, -34584=>4248, -34645=>4249, -34615=>4250, -34601=>4251, -35059=>4252, -35074=>4253, -35060=>4254, -35065=>4255, -35064=>4256, -35069=>4257, -35048=>4258, -35098=>4259, -35055=>4260, -35494=>4261, -35468=>4262, -35486=>4263, -35491=>4264, -35469=>4265, -35489=>4266, -35475=>4267, -35492=>4268, -35498=>4269, -35493=>4270, -35496=>4271, -35480=>4272, -35473=>4273, -35482=>4274, -35495=>4275, -35946=>4276, -35981=>4277, -35980=>4278, -36051=>4279, -36049=>4280, -36050=>4281, -36203=>4282, -36249=>4283, -36245=>4284, -36348=>4285, -36628=>4286, -36626=>4287, -36629=>4288, -36627=>4289, -36771=>4290, -36960=>4291, -36952=>4292, -36956=>4293, -36963=>4294, -36953=>4295, -36958=>4296, -36962=>4297, -36957=>4298, -36955=>4299, -37145=>4300, -37144=>4301, -37150=>4302, -37237=>4303, -37240=>4304, -37239=>4305, -37236=>4306, -37496=>4307, -37548=>4308, -37504=>4309, -37509=>4310, -37528=>4311, -37526=>4312, -37499=>4313, -37523=>4314, -37532=>4315, -37544=>4316, -37500=>4317, -37521=>4318, -38305=>4319, -38312=>4320, -38313=>4321, -38307=>4322, -38309=>4323, -38308=>4324, -38553=>4325, -38556=>4326, -38555=>4327, -38604=>4328, -38610=>4329, -38656=>4330, -38780=>4331, -38789=>4332, -38902=>4333, -38935=>4334, -38936=>4335, -39087=>4336, -39089=>4337, -39171=>4338, -39173=>4339, -39180=>4340, -39177=>4341, -39361=>4342, -39599=>4343, -39600=>4344, -39654=>4345, -39745=>4346, -39746=>4347, -40180=>4348, -40182=>4349, -40179=>4350, -40636=>4351, -40763=>4352, -12240=>4352, -40778=>4353, -12241=>4353, -20740=>4354, -20736=>4355, -20731=>4356, -20725=>4357, -20729=>4358, -20738=>4359, -20744=>4360, -20745=>4361, -20741=>4362, -20956=>4363, -21127=>4364, -21128=>4365, -21129=>4366, -21133=>4367, -21130=>4368, -21232=>4369, -21426=>4370, -22062=>4371, -22075=>4372, -22073=>4373, -22066=>4374, -22079=>4375, -22068=>4376, -22057=>4377, -22099=>4378, -22094=>4379, -22103=>4380, -22132=>4381, -22070=>4382, -22063=>4383, -22064=>4384, -22656=>4385, -22687=>4386, -22686=>4387, -22707=>4388, -22684=>4389, -22702=>4390, -22697=>4391, -22694=>4392, -22893=>4393, -23305=>4394, -23291=>4395, -23307=>4396, -23285=>4397, -23308=>4398, -23304=>4399, -23534=>4400, -23532=>4401, -23529=>4402, -23531=>4403, -23652=>4404, -23653=>4405, -23965=>4406, -23956=>4407, -24162=>4408, -24159=>4409, -24161=>4410, -24290=>4411, -24282=>4412, -24287=>4413, -24285=>4414, -24291=>4415, -24288=>4416, -24392=>4417, -24433=>4418, -24503=>4419, -24501=>4420, -24950=>4421, -24935=>4422, -24942=>4423, -24925=>4424, -24917=>4425, -24962=>4426, -24956=>4427, -24944=>4428, -24939=>4429, -24958=>4430, -24999=>4431, -24976=>4432, -25003=>4433, -24974=>4434, -25004=>4435, -24986=>4436, -24996=>4437, -24980=>4438, -25006=>4439, -25134=>4440, -25705=>4441, -25711=>4442, -25721=>4443, -25758=>4444, -25778=>4445, -25736=>4446, -25744=>4447, -57745=>4447, -25776=>4448, -25765=>4449, -25747=>4450, -25749=>4451, -25769=>4452, -25746=>4453, -25774=>4454, -25773=>4455, -25771=>4456, -25754=>4457, -25772=>4458, -25753=>4459, -25762=>4460, -25779=>4461, -25973=>4462, -25975=>4463, -25976=>4464, -26286=>4465, -26283=>4466, -26292=>4467, -26289=>4468, -27171=>4469, -27167=>4470, -27112=>4471, -27137=>4472, -27166=>4473, -27161=>4474, -27133=>4475, -27169=>4476, -27155=>4477, -27146=>4478, -27123=>4479, -27138=>4480, -27141=>4481, -27117=>4482, -27153=>4483, -27472=>4484, -27470=>4485, -27556=>4486, -27589=>4487, -27590=>4488, -28479=>4489, -28540=>4490, -28548=>4491, -28497=>4492, -28518=>4493, -28500=>4494, -28550=>4495, -28525=>4496, -28507=>4497, -28536=>4498, -28526=>4499, -28558=>4500, -28538=>4501, -28528=>4502, -28516=>4503, -28567=>4504, -28504=>4505, -28373=>4506, -28527=>4507, -28512=>4508, -28511=>4509, -29087=>4510, -29100=>4511, -29105=>4512, -29096=>4513, -29270=>4514, -29339=>4515, -29518=>4516, -29527=>4517, -29801=>4518, -29835=>4519, -29827=>4520, -29822=>4521, -29824=>4522, -30079=>4523, -30240=>4524, -30249=>4525, -30239=>4526, -30244=>4527, -30246=>4528, -30241=>4529, -30242=>4530, -30362=>4531, -30394=>4532, -30436=>4533, -30606=>4534, -30599=>4535, -30604=>4536, -30609=>4537, -30603=>4538, -30923=>4539, -30917=>4540, -30906=>4541, -30922=>4542, -30910=>4543, -30933=>4544, -30908=>4545, -30928=>4546, -31295=>4547, -31292=>4548, -31296=>4549, -31293=>4550, -31287=>4551, -31291=>4552, -31407=>4553, -31406=>4554, -31661=>4555, -31665=>4556, -31684=>4557, -31668=>4558, -31686=>4559, -31687=>4560, -31681=>4561, -31648=>4562, -31692=>4563, -31946=>4564, -32224=>4565, -32244=>4566, -32239=>4567, -32251=>4568, -32216=>4569, -32236=>4570, -32221=>4571, -32232=>4572, -32227=>4573, -32218=>4574, -32222=>4575, -32233=>4576, -32158=>4577, -32217=>4578, -32242=>4579, -32249=>4580, -32629=>4581, -32631=>4582, -32687=>4583, -32745=>4584, -32806=>4585, -33179=>4586, -33180=>4587, -33181=>4588, -33184=>4589, -33178=>4590, -33176=>4591, -34071=>4592, -34109=>4593, -34074=>4594, -34030=>4595, -34092=>4596, -34093=>4597, -34067=>4598, -34065=>4599, -34083=>4600, -34081=>4601, -34068=>4602, -34028=>4603, -34085=>4604, -34047=>4605, -34054=>4606, -34690=>4607, -34676=>4608, -34678=>4609, -34656=>4610, -34662=>4611, -34680=>4612, -34664=>4613, -34649=>4614, -34647=>4615, -34636=>4616, -34643=>4617, -34907=>4618, -34909=>4619, -35088=>4620, -35079=>4621, -35090=>4622, -35091=>4623, -35093=>4624, -35082=>4625, -35516=>4626, -35538=>4627, -35527=>4628, -35524=>4629, -35477=>4630, -35531=>4631, -35576=>4632, -35506=>4633, -35529=>4634, -35522=>4635, -35519=>4636, -35504=>4637, -35542=>4638, -35533=>4639, -35510=>4640, -35513=>4641, -35547=>4642, -35916=>4643, -35918=>4644, -35948=>4645, -36064=>4646, -36062=>4647, -36070=>4648, -36068=>4649, -36076=>4650, -36077=>4651, -36066=>4652, -36067=>4653, -36060=>4654, -36074=>4655, -36065=>4656, -36205=>4657, -36255=>4658, -36259=>4659, -36395=>4660, -36368=>4661, -36381=>4662, -36386=>4663, -36367=>4664, -36393=>4665, -36383=>4666, -36385=>4667, -36382=>4668, -36538=>4669, -36637=>4670, -36635=>4671, -36639=>4672, -36649=>4673, -36646=>4674, -36650=>4675, -36636=>4676, -36638=>4677, -36645=>4678, -36969=>4679, -36974=>4680, -36968=>4681, -36973=>4682, -36983=>4683, -37168=>4684, -37165=>4685, -37159=>4686, -37169=>4687, -37255=>4688, -37257=>4689, -37259=>4690, -37251=>4691, -37573=>4692, -37563=>4693, -37559=>4694, -37610=>4695, -37604=>4696, -37569=>4697, -37555=>4698, -37564=>4699, -37586=>4700, -37575=>4701, -37616=>4702, -37554=>4703, -38317=>4704, -38321=>4705, -38660=>4706, -38662=>4707, -38663=>4708, -38665=>4709, -38752=>4710, -38797=>4711, -38795=>4712, -38799=>4713, -38945=>4714, -38955=>4715, -38940=>4716, -39091=>4717, -39178=>4718, -39187=>4719, -39186=>4720, -39192=>4721, -39389=>4722, -39376=>4723, -39391=>4724, -39387=>4725, -39377=>4726, -39381=>4727, -39378=>4728, -39385=>4729, -39607=>4730, -39662=>4731, -39663=>4732, -39719=>4733, -39749=>4734, -39748=>4735, -39799=>4736, -39791=>4737, -40198=>4738, -40201=>4739, -40195=>4740, -40617=>4741, -40638=>4742, -40654=>4743, -22696=>4744, -12242=>4745, -40786=>4745, -20754=>4746, -20760=>4747, -20756=>4748, -20752=>4749, -20757=>4750, -20864=>4751, -20906=>4752, -20957=>4753, -21137=>4754, -21139=>4755, -21235=>4756, -22105=>4757, -22123=>4758, -22137=>4759, -22121=>4760, -22116=>4761, -22136=>4762, -22122=>4763, -22120=>4764, -22117=>4765, -22129=>4766, -22127=>4767, -22124=>4768, -22114=>4769, -22134=>4770, -22721=>4771, -22718=>4772, -22727=>4773, -22725=>4774, -22894=>4775, -23325=>4776, -23348=>4777, -23416=>4778, -23536=>4779, -23566=>4780, -24394=>4781, -25010=>4782, -24977=>4783, -25001=>4784, -24970=>4785, -25037=>4786, -25014=>4787, -25022=>4788, -25034=>4789, -25032=>4790, -25136=>4791, -25797=>4792, -25793=>4793, -25803=>4794, -25787=>4795, -25788=>4796, -25818=>4797, -25796=>4798, -25799=>4799, -25794=>4800, -25805=>4801, -25791=>4802, -25810=>4803, -25812=>4804, -25790=>4805, -25972=>4806, -26310=>4807, -26313=>4808, -26297=>4809, -26308=>4810, -26311=>4811, -26296=>4812, -27197=>4813, -27192=>4814, -27194=>4815, -27225=>4816, -27243=>4817, -27224=>4818, -27193=>4819, -27204=>4820, -27234=>4821, -27233=>4822, -27211=>4823, -27207=>4824, -27189=>4825, -27231=>4826, -27208=>4827, -27481=>4828, -27511=>4829, -27653=>4830, -28610=>4831, -28593=>4832, -28577=>4833, -28611=>4834, -28580=>4835, -28609=>4836, -28583=>4837, -28595=>4838, -28608=>4839, -28601=>4840, -28598=>4841, -60318=>4841, -28582=>4842, -28576=>4843, -28596=>4844, -29118=>4845, -29129=>4846, -29136=>4847, -29138=>4848, -29128=>4849, -29141=>4850, -29113=>4851, -29134=>4852, -29145=>4853, -29148=>4854, -29123=>4855, -29124=>4856, -29544=>4857, -29852=>4858, -29859=>4859, -29848=>4860, -29855=>4861, -29854=>4862, -29922=>4863, -29964=>4864, -29965=>4865, -30260=>4866, -30264=>4867, -30266=>4868, -30439=>4869, -30437=>4870, -30624=>4871, -30622=>4872, -30623=>4873, -30629=>4874, -30952=>4875, -30938=>4876, -30956=>4877, -30951=>4878, -31142=>4879, -31309=>4880, -31310=>4881, -31302=>4882, -31308=>4883, -31307=>4884, -31418=>4885, -31705=>4886, -31761=>4887, -31689=>4888, -31716=>4889, -31707=>4890, -31713=>4891, -31721=>4892, -31718=>4893, -31957=>4894, -31958=>4895, -32266=>4896, -32273=>4897, -32264=>4898, -32283=>4899, -32291=>4900, -32286=>4901, -32285=>4902, -58211=>4902, -32265=>4903, -32272=>4904, -32633=>4905, -32690=>4906, -32752=>4907, -32753=>4908, -32750=>4909, -32808=>4910, -58239=>4910, -33203=>4911, -33193=>4912, -33192=>4913, -33275=>4914, -33288=>4915, -33368=>4916, -33369=>4917, -34122=>4918, -34137=>4919, -34120=>4920, -34152=>4921, -34153=>4922, -34115=>4923, -34121=>4924, -34157=>4925, -34154=>4926, -34142=>4927, -34691=>4928, -34719=>4929, -34718=>4930, -34722=>4931, -34701=>4932, -34913=>4933, -35114=>4934, -35122=>4935, -35109=>4936, -35115=>4937, -35105=>4938, -35242=>4939, -35238=>4940, -58391=>4940, -35558=>4941, -35578=>4942, -35563=>4943, -35569=>4944, -35584=>4945, -35548=>4946, -35559=>4947, -35566=>4948, -35582=>4949, -35585=>4950, -35586=>4951, -35575=>4952, -35565=>4953, -35571=>4954, -35574=>4955, -35580=>4956, -35947=>4957, -35949=>4958, -35987=>4959, -36084=>4960, -36420=>4961, -36401=>4962, -36404=>4963, -36418=>4964, -36409=>4965, -36405=>4966, -36667=>4967, -36655=>4968, -36664=>4969, -36659=>4970, -36776=>4971, -36774=>4972, -36981=>4973, -36980=>4974, -36984=>4975, -36978=>4976, -36988=>4977, -36986=>4978, -37172=>4979, -37266=>4980, -37664=>4981, -37686=>4982, -37624=>4983, -37683=>4984, -37679=>4985, -37666=>4986, -37628=>4987, -37675=>4988, -37636=>4989, -37658=>4990, -37648=>4991, -37670=>4992, -37665=>4993, -37653=>4994, -37678=>4995, -37657=>4996, -38331=>4997, -38567=>4998, -38568=>4999, -38570=>5000, -38613=>5001, -38670=>5002, -38673=>5003, -38678=>5004, -38669=>5005, -38675=>5006, -38671=>5007, -38747=>5008, -58565=>5009, -38748=>5009, -38758=>5010, -38808=>5011, -38960=>5012, -38968=>5013, -38971=>5014, -38967=>5015, -38957=>5016, -38969=>5017, -38948=>5018, -39184=>5019, -39208=>5020, -39198=>5021, -39195=>5022, -39201=>5023, -39194=>5024, -39405=>5025, -39394=>5026, -39409=>5027, -39608=>5028, -39612=>5029, -39675=>5030, -39661=>5031, -39720=>5032, -39825=>5033, -40213=>5034, -40227=>5035, -40230=>5036, -40232=>5037, -40210=>5038, -40219=>5039, -40664=>5040, -40660=>5041, -40845=>5042, -12243=>5042, -40860=>5043, -12244=>5043, -20778=>5044, -20767=>5045, -20769=>5046, -20786=>5047, -21237=>5048, -22158=>5049, -22144=>5050, -22160=>5051, -22149=>5052, -22151=>5053, -22159=>5054, -22741=>5055, -22739=>5056, -22737=>5057, -22734=>5058, -23344=>5059, -23338=>5060, -23332=>5061, -23418=>5062, -23607=>5063, -23656=>5064, -23996=>5065, -23994=>5066, -23997=>5067, -23992=>5068, -24171=>5069, -24396=>5070, -24509=>5071, -25033=>5072, -25026=>5073, -25031=>5074, -25062=>5075, -25035=>5076, -25138=>5077, -25140=>5078, -25806=>5079, -25802=>5080, -25816=>5081, -25824=>5082, -25840=>5083, -25830=>5084, -25836=>5085, -25841=>5086, -25826=>5087, -25837=>5088, -25986=>5089, -25987=>5090, -26329=>5091, -26326=>5092, -27264=>5093, -27284=>5094, -27268=>5095, -27298=>5096, -27292=>5097, -27355=>5098, -27299=>5099, -27262=>5100, -27287=>5101, -27280=>5102, -27296=>5103, -27484=>5104, -27566=>5105, -27610=>5106, -27656=>5107, -28632=>5108, -28657=>5109, -28639=>5110, -28640=>5111, -28635=>5112, -28644=>5113, -28651=>5114, -28655=>5115, -28544=>5116, -28652=>5117, -28641=>5118, -28649=>5119, -28629=>5120, -28654=>5121, -28656=>5122, -29159=>5123, -29151=>5124, -60361=>5124, -29166=>5125, -29158=>5126, -29157=>5127, -29165=>5128, -29164=>5129, -29172=>5130, -29152=>5131, -29237=>5132, -29254=>5133, -29552=>5134, -29554=>5135, -29865=>5136, -29872=>5137, -29862=>5138, -29864=>5139, -30278=>5140, -30274=>5141, -30284=>5142, -30442=>5143, -30643=>5144, -30634=>5145, -30640=>5146, -30636=>5147, -30631=>5148, -30637=>5149, -30703=>5150, -30967=>5151, -30970=>5152, -30964=>5153, -30959=>5154, -30977=>5155, -31143=>5156, -31146=>5157, -31319=>5158, -31423=>5159, -31751=>5160, -31757=>5161, -31742=>5162, -31735=>5163, -31756=>5164, -31712=>5165, -31968=>5166, -31964=>5167, -31966=>5168, -31970=>5169, -31967=>5170, -31961=>5171, -31965=>5172, -32302=>5173, -32318=>5174, -32326=>5175, -32311=>5176, -32306=>5177, -32323=>5178, -32299=>5179, -32317=>5180, -32305=>5181, -32325=>5182, -32321=>5183, -32308=>5184, -32313=>5185, -32328=>5186, -32309=>5187, -32319=>5188, -32303=>5189, -32580=>5190, -32755=>5191, -32764=>5192, -32881=>5193, -32882=>5194, -32880=>5195, -32879=>5196, -32883=>5197, -33222=>5198, -33219=>5199, -33210=>5200, -33218=>5201, -33216=>5202, -33215=>5203, -33213=>5204, -33225=>5205, -33214=>5206, -33256=>5207, -33289=>5208, -33393=>5209, -34218=>5210, -34180=>5211, -34174=>5212, -34204=>5213, -34193=>5214, -34196=>5215, -34223=>5216, -34203=>5217, -34183=>5218, -34216=>5219, -34186=>5220, -34214=>5221, -34407=>5222, -34752=>5223, -34769=>5224, -34739=>5225, -34770=>5226, -34758=>5227, -34731=>5228, -34747=>5229, -34746=>5230, -34760=>5231, -34763=>5232, -35131=>5233, -35126=>5234, -35140=>5235, -35128=>5236, -35133=>5237, -35244=>5238, -35598=>5239, -35607=>5240, -35609=>5241, -35611=>5242, -35594=>5243, -35616=>5244, -35613=>5245, -35588=>5246, -35600=>5247, -35905=>5248, -35903=>5249, -35955=>5250, -36090=>5251, -36093=>5252, -36092=>5253, -36088=>5254, -36091=>5255, -36264=>5256, -36425=>5257, -36427=>5258, -36424=>5259, -36426=>5260, -36676=>5261, -36670=>5262, -36674=>5263, -36677=>5264, -36671=>5265, -36991=>5266, -36989=>5267, -36996=>5268, -36993=>5269, -36994=>5270, -36992=>5271, -37177=>5272, -37283=>5273, -37278=>5274, -37276=>5275, -37709=>5276, -37762=>5277, -37672=>5278, -37749=>5279, -37706=>5280, -37733=>5281, -37707=>5282, -37656=>5283, -37758=>5284, -37740=>5285, -37723=>5286, -37744=>5287, -37722=>5288, -37716=>5289, -38346=>5290, -38347=>5291, -38348=>5292, -38344=>5293, -38342=>5294, -38577=>5295, -38584=>5296, -38614=>5297, -38684=>5298, -38686=>5299, -38816=>5300, -38867=>5301, -38982=>5302, -39094=>5303, -39221=>5304, -39425=>5305, -39423=>5306, -39854=>5307, -39851=>5308, -39850=>5309, -39853=>5310, -40251=>5311, -40255=>5312, -40587=>5313, -40655=>5314, -40670=>5315, -40668=>5316, -40669=>5317, -40667=>5318, -40766=>5319, -40779=>5320, -21474=>5321, -22165=>5322, -22190=>5323, -22745=>5324, -22744=>5325, -23352=>5326, -24413=>5327, -25059=>5328, -25139=>5329, -25844=>5330, -25842=>5331, -25854=>5332, -25862=>5333, -25850=>5334, -25851=>5335, -25847=>5336, -26039=>5337, -26332=>5338, -26406=>5339, -27315=>5340, -27308=>5341, -27331=>5342, -27323=>5343, -27320=>5344, -27330=>5345, -27310=>5346, -27311=>5347, -27487=>5348, -27512=>5349, -27567=>5350, -28681=>5351, -28683=>5352, -28670=>5353, -28678=>5354, -28666=>5355, -28689=>5356, -28687=>5357, -29179=>5358, -29180=>5359, -29182=>5360, -29176=>5361, -29559=>5362, -29557=>5363, -29863=>5364, -29887=>5365, -29973=>5366, -30294=>5367, -30296=>5368, -30290=>5369, -30653=>5370, -30655=>5371, -30651=>5372, -30652=>5373, -30990=>5374, -31150=>5375, -31329=>5376, -31330=>5377, -31328=>5378, -31428=>5379, -31429=>5380, -31787=>5381, -31783=>5382, -31786=>5383, -31774=>5384, -31779=>5385, -31777=>5386, -31975=>5387, -32340=>5388, -32341=>5389, -32350=>5390, -32346=>5391, -32353=>5392, -32338=>5393, -32345=>5394, -32584=>5395, -32761=>5396, -32763=>5397, -32887=>5398, -32886=>5399, -33229=>5400, -33231=>5401, -33290=>5402, -34255=>5403, -34217=>5404, -34253=>5405, -34256=>5406, -34249=>5407, -34224=>5408, -34234=>5409, -34233=>5410, -34799=>5411, -34796=>5412, -34802=>5413, -34784=>5414, -35206=>5415, -35250=>5416, -35316=>5417, -35624=>5418, -35641=>5419, -35628=>5420, -35627=>5421, -35920=>5422, -36101=>5423, -36441=>5424, -36451=>5425, -36454=>5426, -36452=>5427, -36447=>5428, -36437=>5429, -36544=>5430, -36681=>5431, -36685=>5432, -36999=>5433, -36995=>5434, -37000=>5435, -37291=>5436, -37292=>5437, -37328=>5438, -37780=>5439, -37770=>5440, -37782=>5441, -37794=>5442, -37811=>5443, -37806=>5444, -37804=>5445, -37808=>5446, -37784=>5447, -37786=>5448, -37783=>5449, -38356=>5450, -38358=>5451, -38352=>5452, -38357=>5453, -38626=>5454, -38620=>5455, -38617=>5456, -38619=>5457, -38622=>5458, -38692=>5459, -38819=>5460, -38822=>5461, -38829=>5462, -38905=>5463, -38989=>5464, -38991=>5465, -38988=>5466, -38990=>5467, -38995=>5468, -39098=>5469, -39230=>5470, -39231=>5471, -39229=>5472, -39214=>5473, -39333=>5474, -39438=>5475, -39617=>5476, -39683=>5477, -39686=>5478, -39759=>5479, -39758=>5480, -39757=>5481, -39882=>5482, -39881=>5483, -39933=>5484, -39880=>5485, -39872=>5486, -40273=>5487, -40285=>5488, -40288=>5489, -40672=>5490, -40725=>5491, -40748=>5492, -20787=>5493, -22181=>5494, -22184=>5495, -22750=>5496, -22751=>5497, -22754=>5498, -23541=>5499, -40848=>5500, -24300=>5501, -25074=>5502, -25079=>5503, -25078=>5504, -25077=>5505, -25856=>5506, -25871=>5507, -26336=>5508, -26333=>5509, -27365=>5510, -27357=>5511, -27354=>5512, -27347=>5513, -28699=>5514, -28703=>5515, -28712=>5516, -28698=>5517, -28701=>5518, -28693=>5519, -28696=>5520, -29190=>5521, -29197=>5522, -29272=>5523, -29346=>5524, -29560=>5525, -29562=>5526, -29885=>5527, -29898=>5528, -29923=>5529, -30087=>5530, -30086=>5531, -30303=>5532, -30305=>5533, -30663=>5534, -31001=>5535, -31153=>5536, -31339=>5537, -31337=>5538, -31806=>5539, -31807=>5540, -31800=>5541, -31805=>5542, -31799=>5543, -31808=>5544, -32363=>5545, -32365=>5546, -32377=>5547, -32361=>5548, -32362=>5549, -32371=>5550, -32645=>5551, -32694=>5552, -32697=>5553, -32696=>5554, -33240=>5555, -34281=>5556, -34269=>5557, -34282=>5558, -34261=>5559, -34276=>5560, -34277=>5561, -34295=>5562, -34811=>5563, -34821=>5564, -34829=>5565, -34809=>5566, -34814=>5567, -35168=>5568, -35167=>5569, -35158=>5570, -35166=>5571, -35649=>5572, -35676=>5573, -35672=>5574, -35657=>5575, -35674=>5576, -35662=>5577, -35663=>5578, -35654=>5579, -35673=>5580, -36104=>5581, -36106=>5582, -36476=>5583, -36466=>5584, -36487=>5585, -36470=>5586, -36460=>5587, -36474=>5588, -36468=>5589, -36692=>5590, -36686=>5591, -36781=>5592, -37002=>5593, -37003=>5594, -37297=>5595, -37294=>5596, -37857=>5597, -37841=>5598, -37855=>5599, -37827=>5600, -37832=>5601, -37852=>5602, -37853=>5603, -37846=>5604, -37858=>5605, -37837=>5606, -37848=>5607, -37860=>5608, -37847=>5609, -37864=>5610, -38364=>5611, -38580=>5612, -38627=>5613, -38698=>5614, -38695=>5615, -38753=>5616, -38876=>5617, -38907=>5618, -39006=>5619, -39000=>5620, -39003=>5621, -39100=>5622, -39237=>5623, -39241=>5624, -39446=>5625, -39449=>5626, -39693=>5627, -39912=>5628, -39911=>5629, -39894=>5630, -39899=>5631, -40329=>5632, -40289=>5633, -40306=>5634, -40298=>5635, -40300=>5636, -40594=>5637, -40599=>5638, -40595=>5639, -40628=>5640, -21240=>5641, -22199=>5642, -22198=>5643, -22196=>5644, -22204=>5645, -22756=>5646, -23360=>5647, -23363=>5648, -23421=>5649, -23542=>5650, -24009=>5651, -25080=>5652, -25082=>5653, -25880=>5654, -25876=>5655, -25881=>5656, -26342=>5657, -26407=>5658, -27372=>5659, -28734=>5660, -28720=>5661, -28722=>5662, -29200=>5663, -29563=>5664, -29903=>5665, -30306=>5666, -30309=>5667, -31014=>5668, -31018=>5669, -31020=>5670, -31019=>5671, -31431=>5672, -31478=>5673, -31820=>5674, -31811=>5675, -31821=>5676, -31983=>5677, -31984=>5678, -36782=>5679, -32381=>5680, -32380=>5681, -32386=>5682, -32588=>5683, -32768=>5684, -33242=>5685, -33382=>5686, -34299=>5687, -34297=>5688, -34321=>5689, -34298=>5690, -34310=>5691, -34315=>5692, -34311=>5693, -34314=>5694, -34836=>5695, -34837=>5696, -35172=>5697, -35258=>5698, -35320=>5699, -35696=>5700, -35692=>5701, -35686=>5702, -35695=>5703, -35679=>5704, -35691=>5705, -36111=>5706, -36109=>5707, -36489=>5708, -36481=>5709, -36485=>5710, -36482=>5711, -37300=>5712, -37323=>5713, -37912=>5714, -37891=>5715, -37885=>5716, -38369=>5717, -38704=>5718, -39108=>5719, -39250=>5720, -39249=>5721, -39336=>5722, -39467=>5723, -39472=>5724, -39479=>5725, -39477=>5726, -39955=>5727, -39949=>5728, -40569=>5729, -40629=>5730, -40680=>5731, -40751=>5732, -40799=>5733, -40803=>5734, -40801=>5735, -20791=>5736, -20792=>5737, -22209=>5738, -22208=>5739, -22210=>5740, -22804=>5741, -23660=>5742, -24013=>5743, -25084=>5744, -25086=>5745, -25885=>5746, -25884=>5747, -26005=>5748, -26345=>5749, -27387=>5750, -27396=>5751, -27386=>5752, -27570=>5753, -28748=>5754, -29211=>5755, -29351=>5756, -29910=>5757, -29908=>5758, -30313=>5759, -30675=>5760, -31824=>5761, -32399=>5762, -32396=>5763, -32700=>5764, -34327=>5765, -34349=>5766, -34330=>5767, -34851=>5768, -34850=>5769, -34849=>5770, -34847=>5771, -35178=>5772, -35180=>5773, -35261=>5774, -35700=>5775, -35703=>5776, -35709=>5777, -36115=>5778, -36490=>5779, -36493=>5780, -36491=>5781, -36703=>5782, -36783=>5783, -37306=>5784, -37934=>5785, -37939=>5786, -37941=>5787, -37946=>5788, -37944=>5789, -37938=>5790, -37931=>5791, -38370=>5792, -38712=>5793, -38713=>5794, -38706=>5795, -38911=>5796, -58586=>5796, -39015=>5797, -39013=>5798, -39255=>5799, -39493=>5800, -39491=>5801, -39488=>5802, -39486=>5803, -39631=>5804, -39764=>5805, -39761=>5806, -39981=>5807, -39973=>5808, -40367=>5809, -40372=>5810, -40386=>5811, -40376=>5812, -40605=>5813, -40687=>5814, -40729=>5815, -40796=>5816, -40806=>5817, -40807=>5818, -20796=>5819, -20795=>5820, -22216=>5821, -22218=>5822, -22217=>5823, -23423=>5824, -24020=>5825, -24018=>5826, -24398=>5827, -25087=>5828, -25892=>5829, -27402=>5830, -27489=>5831, -28753=>5832, -28760=>5833, -29568=>5834, -29924=>5835, -30090=>5836, -30318=>5837, -30316=>5838, -31155=>5839, -31840=>5840, -31839=>5841, -32894=>5842, -32893=>5843, -33247=>5844, -35186=>5845, -35183=>5846, -35324=>5847, -35712=>5848, -36118=>5849, -36119=>5850, -36497=>5851, -36499=>5852, -36705=>5853, -37192=>5854, -37956=>5855, -37969=>5856, -37970=>5857, -38717=>5858, -38718=>5859, -38851=>5860, -38849=>5861, -39019=>5862, -39253=>5863, -39509=>5864, -39501=>5865, -39634=>5866, -39706=>5867, -40009=>5868, -39985=>5869, -39998=>5870, -39995=>5871, -40403=>5872, -40407=>5873, -40756=>5874, -40812=>5875, -40810=>5876, -40852=>5877, -22220=>5878, -24022=>5879, -25088=>5880, -25891=>5881, -25899=>5882, -25898=>5883, -26348=>5884, -27408=>5885, -29914=>5886, -31434=>5887, -31844=>5888, -31843=>5889, -31845=>5890, -32403=>5891, -32406=>5892, -32404=>5893, -33250=>5894, -34360=>5895, -34367=>5896, -34865=>5897, -35722=>5898, -37008=>5899, -37007=>5900, -37987=>5901, -37984=>5902, -37988=>5903, -38760=>5904, -39023=>5905, -39260=>5906, -39514=>5907, -39515=>5908, -39511=>5909, -39635=>5910, -39636=>5911, -39633=>5912, -40020=>5913, -40023=>5914, -40022=>5915, -40421=>5916, -40607=>5917, -40692=>5918, -22225=>5919, -22761=>5920, -25900=>5921, -28766=>5922, -30321=>5923, -30322=>5924, -30679=>5925, -60226=>5925, -32592=>5926, -32648=>5927, -34870=>5928, -34873=>5929, -34914=>5930, -35731=>5931, -35730=>5932, -35734=>5933, -33399=>5934, -36123=>5935, -37312=>5936, -37994=>5937, -38722=>5938, -38728=>5939, -38724=>5940, -38854=>5941, -39024=>5942, -39519=>5943, -39714=>5944, -39768=>5945, -40031=>5946, -40441=>5947, -40442=>5948, -40572=>5949, -40573=>5950, -40711=>5951, -40823=>5952, -40818=>5953, -24307=>5954, -27414=>5955, -28771=>5956, -31852=>5957, -31854=>5958, -34875=>5959, -35264=>5960, -36513=>5961, -37313=>5962, -38002=>5963, -38000=>5964, -39025=>5965, -39262=>5966, -39638=>5967, -39715=>5968, -40652=>5969, -28772=>5970, -30682=>5971, -35738=>5972, -38007=>5973, -38857=>5974, -39522=>5975, -39525=>5976, -32412=>5977, -35740=>5978, -36522=>5979, -37317=>5980, -38013=>5981, -38014=>5982, -38012=>5983, -40055=>5984, -40056=>5985, -40695=>5986, -35924=>5987, -38015=>5988, -40474=>5989, -29224=>5990, -39530=>5991, -39729=>5992, -40475=>5993, -40478=>5994, -31858=>5995, -20034=>5996, -20060=>5997, -12048=>5998, -20981=>5998, -12053=>5999, -21274=>5999, -12058=>6000, -21378=>6000, -19975=>6001, -19980=>6002, -20039=>6003, -20109=>6004, -12062=>6005, -22231=>6005, -12076=>6006, -23662=>6006, -12091=>6007, -24435=>6007, -19983=>6008, -20871=>6009, -19982=>6010, -20014=>6011, -20115=>6012, -20162=>6013, -20169=>6014, -20168=>6015, -20888=>6016, -21244=>6017, -21356=>6018, -21433=>6019, -22304=>6020, -22787=>6021, -22828=>6022, -23568=>6023, -60417=>6023, -24063=>6024, -26081=>6025, -12110=>6026, -27571=>6026, -27596=>6027, -12115=>6028, -27668=>6028, -12121=>6029, -29247=>6029, -20017=>6030, -20028=>6031, -20200=>6032, -20188=>6033, -20201=>6034, -20193=>6035, -20189=>6036, -20186=>6037, -21004=>6038, -21001=>6039, -21276=>6040, -21324=>6041, -22306=>6042, -22307=>6043, -22807=>6044, -22831=>6045, -23425=>6046, -23428=>6047, -23570=>6048, -23611=>6049, -23668=>6050, -23667=>6051, -24068=>6052, -24192=>6053, -24194=>6054, -24521=>6055, -25097=>6056, -25168=>6057, -27669=>6058, -27702=>6059, -27715=>6060, -27711=>6061, -27707=>6062, -29358=>6063, -29360=>6064, -29578=>6065, -12145=>6066, -31160=>6066, -32906=>6067, -38430=>6068, -20238=>6069, -20248=>6070, -20268=>6071, -20213=>6072, -20244=>6073, -20209=>6074, -20224=>6075, -20215=>6076, -20232=>6077, -20253=>6078, -20226=>6079, -20229=>6080, -20258=>6081, -20243=>6082, -20228=>6083, -20212=>6084, -20242=>6085, -20913=>6086, -21011=>6087, -21008=>6088, -21158=>6089, -21282=>6090, -21279=>6091, -21325=>6092, -21386=>6093, -21511=>6094, -22241=>6095, -22239=>6096, -22318=>6097, -22314=>6098, -22324=>6099, -22844=>6100, -22912=>6101, -22908=>6102, -22917=>6103, -22907=>6104, -22910=>6105, -22903=>6106, -22911=>6107, -23382=>6108, -23573=>6109, -23589=>6110, -23676=>6111, -23674=>6112, -23675=>6113, -23678=>6114, -24031=>6115, -24181=>6116, -57646=>6116, -24196=>6117, -24322=>6118, -24346=>6119, -24436=>6120, -24533=>6121, -24532=>6122, -24527=>6123, -25180=>6124, -25182=>6125, -25188=>6126, -25185=>6127, -25190=>6128, -25186=>6129, -25177=>6130, -25184=>6131, -25178=>6132, -25189=>6133, -25911=>6134, -26095=>6135, -26094=>6136, -26430=>6137, -26425=>6138, -26424=>6139, -26427=>6140, -26426=>6141, -26431=>6142, -26428=>6143, -26419=>6144, -27672=>6145, -27718=>6146, -27730=>6147, -27740=>6148, -27727=>6149, -27722=>6150, -60796=>6150, -27732=>6151, -27723=>6152, -27724=>6153, -28785=>6154, -29278=>6155, -29364=>6156, -29365=>6157, -29582=>6158, -29994=>6159, -30335=>6160, -31349=>6161, -12153=>6162, -32593=>6162, -12171=>6163, -33400=>6163, -33404=>6164, -33408=>6165, -33405=>6166, -33407=>6167, -12172=>6168, -34381=>6168, -12177=>6169, -35198=>6169, -37017=>6170, -59347=>6171, -37015=>6171, -37016=>6172, -37019=>6173, -37012=>6174, -38434=>6175, -38436=>6176, -38432=>6177, -38435=>6178, -20310=>6179, -20283=>6180, -20322=>6181, -20297=>6182, -20307=>6183, -20324=>6184, -20286=>6185, -20327=>6186, -20306=>6187, -20319=>6188, -20289=>6189, -20312=>6190, -20269=>6191, -20275=>6192, -20287=>6193, -20321=>6194, -20879=>6195, -20921=>6196, -21020=>6197, -21022=>6198, -21025=>6199, -21165=>6200, -21166=>6201, -21257=>6202, -21347=>6203, -21362=>6204, -21390=>6205, -21391=>6206, -21552=>6207, -21559=>6208, -21546=>6209, -21588=>6210, -21573=>6211, -21529=>6212, -21532=>6213, -21541=>6214, -21528=>6215, -21565=>6216, -21583=>6217, -21569=>6218, -21544=>6219, -21540=>6220, -21575=>6221, -22254=>6222, -22247=>6223, -22245=>6224, -22337=>6225, -22341=>6226, -22348=>6227, -22345=>6228, -22347=>6229, -22354=>6230, -22790=>6231, -22848=>6232, -22950=>6233, -22936=>6234, -22944=>6235, -22935=>6236, -22926=>6237, -22946=>6238, -22928=>6239, -22927=>6240, -22951=>6241, -22945=>6242, -23438=>6243, -23442=>6244, -23592=>6245, -23594=>6246, -23693=>6247, -23695=>6248, -23688=>6249, -23691=>6250, -23689=>6251, -23698=>6252, -23690=>6253, -23686=>6254, -23699=>6255, -23701=>6256, -24032=>6257, -24074=>6258, -24078=>6259, -24203=>6260, -24201=>6261, -24204=>6262, -24200=>6263, -24205=>6264, -24325=>6265, -24349=>6266, -24440=>6267, -24438=>6268, -24530=>6269, -24529=>6270, -24528=>6271, -24557=>6272, -24552=>6273, -24558=>6274, -24563=>6275, -24545=>6276, -24548=>6277, -24547=>6278, -24570=>6279, -24559=>6280, -24567=>6281, -24571=>6282, -24576=>6283, -24564=>6284, -25146=>6285, -25219=>6286, -25228=>6287, -25230=>6288, -25231=>6289, -25236=>6290, -25223=>6291, -25201=>6292, -25211=>6293, -25210=>6294, -25200=>6295, -25217=>6296, -25224=>6297, -25207=>6298, -25213=>6299, -25202=>6300, -25204=>6301, -26096=>6302, -26100=>6303, -26099=>6304, -26098=>6305, -26101=>6306, -26437=>6307, -26439=>6308, -26457=>6309, -26453=>6310, -26444=>6311, -26440=>6312, -26461=>6313, -26445=>6314, -26458=>6315, -26443=>6316, -27600=>6317, -27673=>6318, -27674=>6319, -27768=>6320, -27751=>6321, -27755=>6322, -27780=>6323, -27787=>6324, -27791=>6325, -27761=>6326, -27759=>6327, -27753=>6328, -27802=>6329, -27757=>6330, -27783=>6331, -27797=>6332, -27804=>6333, -57900=>6333, -27750=>6334, -27763=>6335, -27749=>6336, -27771=>6337, -27790=>6338, -28788=>6339, -28794=>6340, -29283=>6341, -29375=>6342, -29373=>6343, -29379=>6344, -29382=>6345, -29377=>6346, -29370=>6347, -29381=>6348, -29589=>6349, -29591=>6350, -29587=>6351, -29588=>6352, -29586=>6353, -30010=>6354, -30009=>6355, -30100=>6356, -30101=>6357, -30337=>6358, -31037=>6359, -32820=>6360, -32917=>6361, -32921=>6362, -32912=>6363, -32914=>6364, -32924=>6365, -33424=>6366, -33423=>6367, -33413=>6368, -33422=>6369, -33425=>6370, -33427=>6371, -33418=>6372, -33411=>6373, -33412=>6374, -12184=>6375, -35960=>6375, -36809=>6376, -36799=>6377, -37023=>6378, -37025=>6379, -37029=>6380, -37022=>6381, -37031=>6382, -37024=>6383, -38448=>6384, -38440=>6385, -38447=>6386, -38445=>6387, -20019=>6388, -20376=>6389, -20348=>6390, -20357=>6391, -20349=>6392, -20352=>6393, -20359=>6394, -20342=>6395, -20340=>6396, -20361=>6397, -20356=>6398, -20343=>6399, -20300=>6400, -20375=>6401, -20330=>6402, -20378=>6403, -20345=>6404, -20353=>6405, -20344=>6406, -20368=>6407, -20380=>6408, -20372=>6409, -20382=>6410, -20370=>6411, -20354=>6412, -20373=>6413, -20331=>6414, -20334=>6415, -20894=>6416, -20924=>6417, -20926=>6418, -21045=>6419, -21042=>6420, -21043=>6421, -21062=>6422, -21041=>6423, -21180=>6424, -21258=>6425, -21259=>6426, -21308=>6427, -21394=>6428, -21396=>6429, -21639=>6430, -21631=>6431, -21633=>6432, -21649=>6433, -21634=>6434, -21640=>6435, -21611=>6436, -21626=>6437, -21630=>6438, -21605=>6439, -21612=>6440, -21620=>6441, -21606=>6442, -21645=>6443, -21615=>6444, -21601=>6445, -21600=>6446, -21656=>6447, -21603=>6448, -21607=>6449, -21604=>6450, -22263=>6451, -22265=>6452, -22383=>6453, -22386=>6454, -22381=>6455, -22379=>6456, -22385=>6457, -22384=>6458, -22390=>6459, -22400=>6460, -22389=>6461, -22395=>6462, -22387=>6463, -22388=>6464, -22370=>6465, -22376=>6466, -22397=>6467, -22796=>6468, -22853=>6469, -22965=>6470, -22970=>6471, -22991=>6472, -22990=>6473, -22962=>6474, -22988=>6475, -22977=>6476, -22966=>6477, -22972=>6478, -22979=>6479, -22998=>6480, -22961=>6481, -22973=>6482, -22976=>6483, -22984=>6484, -22964=>6485, -22983=>6486, -23394=>6487, -23397=>6488, -23443=>6489, -23445=>6490, -23620=>6491, -23623=>6492, -23726=>6493, -23716=>6494, -23712=>6495, -23733=>6496, -23727=>6497, -23720=>6498, -23724=>6499, -23711=>6500, -23715=>6501, -23725=>6502, -23714=>6503, -23722=>6504, -23719=>6505, -23709=>6506, -23717=>6507, -23734=>6508, -23728=>6509, -23718=>6510, -24087=>6511, -24084=>6512, -24089=>6513, -24360=>6514, -24354=>6515, -24355=>6516, -24356=>6517, -24404=>6518, -24450=>6519, -24446=>6520, -24445=>6521, -24542=>6522, -24549=>6523, -24621=>6524, -24614=>6525, -24601=>6526, -24626=>6527, -24587=>6528, -24628=>6529, -24586=>6530, -24599=>6531, -24627=>6532, -24602=>6533, -24606=>6534, -24620=>6535, -24610=>6536, -24589=>6537, -24592=>6538, -24622=>6539, -24595=>6540, -24593=>6541, -24588=>6542, -24585=>6543, -24604=>6544, -25108=>6545, -25149=>6546, -25261=>6547, -25268=>6548, -25297=>6549, -25278=>6550, -25258=>6551, -25270=>6552, -25290=>6553, -25262=>6554, -25267=>6555, -25263=>6556, -25275=>6557, -25257=>6558, -25264=>6559, -25272=>6560, -25917=>6561, -26024=>6562, -26043=>6563, -26121=>6564, -26108=>6565, -26116=>6566, -26130=>6567, -26120=>6568, -26107=>6569, -26115=>6570, -26123=>6571, -26125=>6572, -26117=>6573, -26109=>6574, -26129=>6575, -26128=>6576, -26358=>6577, -26378=>6578, -26501=>6579, -26476=>6580, -26510=>6581, -26514=>6582, -26486=>6583, -26491=>6584, -26520=>6585, -26502=>6586, -26500=>6587, -26484=>6588, -26509=>6589, -26508=>6590, -26490=>6591, -26527=>6592, -26513=>6593, -26521=>6594, -26499=>6595, -26493=>6596, -26497=>6597, -26488=>6598, -26489=>6599, -26516=>6600, -27429=>6601, -27520=>6602, -27518=>6603, -27614=>6604, -27677=>6605, -27795=>6606, -27884=>6607, -27883=>6608, -27886=>6609, -27865=>6610, -27830=>6611, -27860=>6612, -27821=>6613, -27879=>6614, -27831=>6615, -27856=>6616, -27842=>6617, -27834=>6618, -27843=>6619, -27846=>6620, -27885=>6621, -27890=>6622, -27858=>6623, -27869=>6624, -27828=>6625, -27786=>6626, -27805=>6627, -27776=>6628, -27870=>6629, -27840=>6630, -27952=>6631, -27853=>6632, -27847=>6633, -27824=>6634, -27897=>6635, -27855=>6636, -27881=>6637, -27857=>6638, -28820=>6639, -28824=>6640, -28805=>6641, -28819=>6642, -28806=>6643, -28804=>6644, -28817=>6645, -28822=>6646, -28802=>6647, -28826=>6648, -28803=>6649, -29290=>6650, -29398=>6651, -29387=>6652, -29400=>6653, -29385=>6654, -29404=>6655, -29394=>6656, -29396=>6657, -29402=>6658, -29388=>6659, -29393=>6660, -29604=>6661, -29601=>6662, -29613=>6663, -29606=>6664, -29602=>6665, -29600=>6666, -29612=>6667, -29597=>6668, -29917=>6669, -29928=>6670, -30015=>6671, -30016=>6672, -30014=>6673, -30092=>6674, -30104=>6675, -30383=>6676, -30451=>6677, -30449=>6678, -30448=>6679, -30453=>6680, -30712=>6681, -30716=>6682, -30713=>6683, -30715=>6684, -30714=>6685, -30711=>6686, -31042=>6687, -31039=>6688, -31173=>6689, -31352=>6690, -31355=>6691, -31483=>6692, -31861=>6693, -31997=>6694, -32821=>6695, -32911=>6696, -32942=>6697, -32931=>6698, -32952=>6699, -32949=>6700, -32941=>6701, -33312=>6702, -33440=>6703, -33472=>6704, -33451=>6705, -33434=>6706, -33432=>6707, -33435=>6708, -33461=>6709, -33447=>6710, -33454=>6711, -33468=>6712, -33438=>6713, -33466=>6714, -33460=>6715, -33448=>6716, -33441=>6717, -33449=>6718, -33474=>6719, -33444=>6720, -33475=>6721, -33462=>6722, -33442=>6723, -34416=>6724, -34415=>6725, -34413=>6726, -34414=>6727, -35926=>6728, -36818=>6729, -36811=>6730, -36819=>6731, -36813=>6732, -36822=>6733, -36821=>6734, -36823=>6735, -37042=>6736, -37044=>6737, -37039=>6738, -37043=>6739, -37040=>6740, -38457=>6741, -38461=>6742, -38460=>6743, -38458=>6744, -38467=>6745, -20429=>6746, -20421=>6747, -20435=>6748, -20402=>6749, -20425=>6750, -20427=>6751, -20417=>6752, -20436=>6753, -20444=>6754, -20441=>6755, -20411=>6756, -60346=>6756, -20403=>6757, -20443=>6758, -20423=>6759, -20438=>6760, -20410=>6761, -20416=>6762, -20409=>6763, -20460=>6764, -21060=>6765, -21065=>6766, -21184=>6767, -21186=>6768, -21309=>6769, -21372=>6770, -21399=>6771, -21398=>6772, -21401=>6773, -21400=>6774, -21690=>6775, -21665=>6776, -21677=>6777, -21669=>6778, -21711=>6779, -21699=>6780, -33549=>6781, -21687=>6782, -21678=>6783, -21718=>6784, -21686=>6785, -21701=>6786, -21702=>6787, -21664=>6788, -21616=>6789, -21692=>6790, -21666=>6791, -21694=>6792, -21618=>6793, -21726=>6794, -21680=>6795, -22453=>6796, -22430=>6797, -22431=>6798, -22436=>6799, -22412=>6800, -22423=>6801, -22429=>6802, -22427=>6803, -22420=>6804, -22424=>6805, -22415=>6806, -22425=>6807, -22437=>6808, -22426=>6809, -22421=>6810, -22772=>6811, -22797=>6812, -22867=>6813, -23009=>6814, -23006=>6815, -23022=>6816, -23040=>6817, -23025=>6818, -23005=>6819, -23034=>6820, -23037=>6821, -23036=>6822, -23030=>6823, -23012=>6824, -23026=>6825, -23031=>6826, -23003=>6827, -23017=>6828, -23027=>6829, -23029=>6830, -23008=>6831, -23038=>6832, -23028=>6833, -23021=>6834, -23464=>6835, -23628=>6836, -23760=>6837, -23768=>6838, -23756=>6839, -23767=>6840, -23755=>6841, -23771=>6842, -23774=>6843, -23770=>6844, -23753=>6845, -23751=>6846, -23754=>6847, -23766=>6848, -23763=>6849, -23764=>6850, -23759=>6851, -23752=>6852, -23750=>6853, -23758=>6854, -23775=>6855, -23800=>6856, -24057=>6857, -24097=>6858, -24098=>6859, -24099=>6860, -24096=>6861, -24100=>6862, -24240=>6863, -24228=>6864, -24226=>6865, -24219=>6866, -24227=>6867, -24229=>6868, -24327=>6869, -24366=>6870, -24406=>6871, -24454=>6872, -24631=>6873, -24633=>6874, -24660=>6875, -24690=>6876, -24670=>6877, -24645=>6878, -24659=>6879, -24647=>6880, -24649=>6881, -24667=>6882, -24652=>6883, -24640=>6884, -24642=>6885, -24671=>6886, -24612=>6887, -24644=>6888, -24664=>6889, -24678=>6890, -24686=>6891, -25154=>6892, -25155=>6893, -25295=>6894, -25357=>6895, -25355=>6896, -25333=>6897, -25358=>6898, -25347=>6899, -25323=>6900, -25337=>6901, -25359=>6902, -25356=>6903, -25336=>6904, -25334=>6905, -25344=>6906, -25363=>6907, -25364=>6908, -25338=>6909, -25365=>6910, -25339=>6911, -25328=>6912, -25921=>6913, -25923=>6914, -26026=>6915, -26047=>6916, -26166=>6917, -26145=>6918, -26162=>6919, -26165=>6920, -26140=>6921, -26150=>6922, -26146=>6923, -26163=>6924, -26155=>6925, -26170=>6926, -26141=>6927, -26164=>6928, -26169=>6929, -26158=>6930, -26383=>6931, -26384=>6932, -26561=>6933, -26610=>6934, -26568=>6935, -26554=>6936, -26588=>6937, -26555=>6938, -26616=>6939, -26584=>6940, -26560=>6941, -26551=>6942, -26565=>6943, -26603=>6944, -26596=>6945, -26591=>6946, -26549=>6947, -26573=>6948, -26547=>6949, -26615=>6950, -26614=>6951, -26606=>6952, -26595=>6953, -26562=>6954, -26553=>6955, -26574=>6956, -26599=>6957, -26608=>6958, -26546=>6959, -26620=>6960, -26566=>6961, -26605=>6962, -26572=>6963, -26542=>6964, -26598=>6965, -26587=>6966, -26618=>6967, -26569=>6968, -26570=>6969, -26563=>6970, -26602=>6971, -26571=>6972, -27432=>6973, -27522=>6974, -27524=>6975, -27574=>6976, -27606=>6977, -27608=>6978, -27616=>6979, -27680=>6980, -27681=>6981, -27944=>6982, -27956=>6983, -27949=>6984, -27935=>6985, -27964=>6986, -27967=>6987, -27922=>6988, -27914=>6989, -27866=>6990, -27955=>6991, -27908=>6992, -27929=>6993, -27962=>6994, -27930=>6995, -27921=>6996, -27904=>6997, -27933=>6998, -27970=>6999, -27905=>7000, -27928=>7001, -27959=>7002, -27907=>7003, -27919=>7004, -27968=>7005, -27911=>7006, -27936=>7007, -27948=>7008, -27912=>7009, -27938=>7010, -27913=>7011, -27920=>7012, -28855=>7013, -28831=>7014, -28862=>7015, -28849=>7016, -28848=>7017, -28833=>7018, -28852=>7019, -28853=>7020, -28841=>7021, -29249=>7022, -29257=>7023, -29258=>7024, -29292=>7025, -29296=>7026, -29299=>7027, -29294=>7028, -29386=>7029, -29412=>7030, -29416=>7031, -29419=>7032, -29407=>7033, -29418=>7034, -29414=>7035, -29411=>7036, -29573=>7037, -29644=>7038, -29634=>7039, -29640=>7040, -29637=>7041, -29625=>7042, -29622=>7043, -29621=>7044, -29620=>7045, -29675=>7046, -29631=>7047, -29639=>7048, -29630=>7049, -29635=>7050, -29638=>7051, -29624=>7052, -29643=>7053, -29932=>7054, -29934=>7055, -29998=>7056, -30023=>7057, -30024=>7058, -30119=>7059, -30122=>7060, -30329=>7061, -30404=>7062, -30472=>7063, -30467=>7064, -30468=>7065, -30469=>7066, -30474=>7067, -30455=>7068, -30459=>7069, -30458=>7070, -30695=>7071, -30696=>7072, -30726=>7073, -30737=>7074, -30738=>7075, -30725=>7076, -30736=>7077, -30735=>7078, -30734=>7079, -30729=>7080, -58095=>7080, -30723=>7081, -30739=>7082, -31050=>7083, -31052=>7084, -31051=>7085, -31045=>7086, -31044=>7087, -31189=>7088, -31181=>7089, -31183=>7090, -31190=>7091, -31182=>7092, -31360=>7093, -31358=>7094, -31441=>7095, -31488=>7096, -31489=>7097, -31866=>7098, -31864=>7099, -31865=>7100, -31871=>7101, -31872=>7102, -31873=>7103, -32003=>7104, -32008=>7105, -32001=>7106, -32600=>7107, -32657=>7108, -32653=>7109, -32702=>7110, -32775=>7111, -32782=>7112, -32783=>7113, -32788=>7114, -32823=>7115, -32984=>7116, -32967=>7117, -32992=>7118, -32977=>7119, -32968=>7120, -32962=>7121, -32976=>7122, -32965=>7123, -32995=>7124, -32985=>7125, -32988=>7126, -32970=>7127, -32981=>7128, -32969=>7129, -32975=>7130, -32983=>7131, -32998=>7132, -32973=>7133, -33279=>7134, -33313=>7135, -33428=>7136, -33497=>7137, -33534=>7138, -33529=>7139, -33543=>7140, -33512=>7141, -33536=>7142, -33493=>7143, -33594=>7144, -33515=>7145, -33494=>7146, -33524=>7147, -33516=>7148, -33505=>7149, -33522=>7150, -33525=>7151, -33548=>7152, -33531=>7153, -33526=>7154, -33520=>7155, -33514=>7156, -33508=>7157, -33504=>7158, -33530=>7159, -33523=>7160, -33517=>7161, -34423=>7162, -34420=>7163, -34428=>7164, -34419=>7165, -34881=>7166, -34894=>7167, -34919=>7168, -34922=>7169, -34921=>7170, -35283=>7171, -35332=>7172, -35335=>7173, -36210=>7174, -36835=>7175, -36833=>7176, -36846=>7177, -36832=>7178, -37105=>7179, -37053=>7180, -37055=>7181, -37077=>7182, -37061=>7183, -37054=>7184, -37063=>7185, -37067=>7186, -37064=>7187, -37332=>7188, -60294=>7188, -37331=>7189, -38484=>7190, -38479=>7191, -38481=>7192, -38483=>7193, -38474=>7194, -38478=>7195, -20510=>7196, -20485=>7197, -20487=>7198, -20499=>7199, -20514=>7200, -20528=>7201, -20507=>7202, -20469=>7203, -20468=>7204, -20531=>7205, -20535=>7206, -20524=>7207, -20470=>7208, -20471=>7209, -20503=>7210, -20508=>7211, -20512=>7212, -20519=>7213, -20533=>7214, -20527=>7215, -20529=>7216, -20494=>7217, -20826=>7218, -20884=>7219, -20883=>7220, -20938=>7221, -20932=>7222, -20933=>7223, -20936=>7224, -20942=>7225, -21089=>7226, -21082=>7227, -21074=>7228, -21086=>7229, -21087=>7230, -21077=>7231, -21090=>7232, -21197=>7233, -21262=>7234, -21406=>7235, -21798=>7236, -21730=>7237, -21783=>7238, -21778=>7239, -21735=>7240, -21747=>7241, -21732=>7242, -21786=>7243, -21759=>7244, -21764=>7245, -21768=>7246, -21739=>7247, -21777=>7248, -21765=>7249, -21745=>7250, -21770=>7251, -21755=>7252, -21751=>7253, -21752=>7254, -21728=>7255, -21774=>7256, -21763=>7257, -21771=>7258, -22273=>7259, -22274=>7260, -22476=>7261, -22578=>7262, -22485=>7263, -22482=>7264, -22458=>7265, -22470=>7266, -22461=>7267, -22460=>7268, -22456=>7269, -22454=>7270, -22463=>7271, -22471=>7272, -22480=>7273, -22457=>7274, -22465=>7275, -22798=>7276, -22858=>7277, -23065=>7278, -23062=>7279, -23085=>7280, -23086=>7281, -23061=>7282, -23055=>7283, -23063=>7284, -23050=>7285, -23070=>7286, -23091=>7287, -23404=>7288, -23463=>7289, -23469=>7290, -23468=>7291, -23555=>7292, -23638=>7293, -23636=>7294, -23788=>7295, -23807=>7296, -23790=>7297, -23793=>7298, -23799=>7299, -23808=>7300, -23801=>7301, -24105=>7302, -24104=>7303, -24232=>7304, -24238=>7305, -24234=>7306, -24236=>7307, -24371=>7308, -24368=>7309, -24423=>7310, -24669=>7311, -24666=>7312, -24679=>7313, -24641=>7314, -24738=>7315, -24712=>7316, -24704=>7317, -24722=>7318, -24705=>7319, -24733=>7320, -24707=>7321, -24725=>7322, -24731=>7323, -24727=>7324, -24711=>7325, -24732=>7326, -24718=>7327, -25113=>7328, -25158=>7329, -25330=>7330, -25360=>7331, -25430=>7332, -25388=>7333, -25412=>7334, -25413=>7335, -25398=>7336, -25411=>7337, -25572=>7338, -25401=>7339, -25419=>7340, -25418=>7341, -25404=>7342, -25385=>7343, -25409=>7344, -25396=>7345, -25432=>7346, -25428=>7347, -25433=>7348, -25389=>7349, -25415=>7350, -25395=>7351, -25434=>7352, -25425=>7353, -25400=>7354, -25431=>7355, -25408=>7356, -25416=>7357, -25930=>7358, -25926=>7359, -26054=>7360, -26051=>7361, -26052=>7362, -26050=>7363, -26186=>7364, -26207=>7365, -26183=>7366, -26193=>7367, -26386=>7368, -26387=>7369, -26655=>7370, -26650=>7371, -26697=>7372, -26674=>7373, -26675=>7374, -26683=>7375, -26699=>7376, -26703=>7377, -26646=>7378, -26673=>7379, -26652=>7380, -26677=>7381, -26667=>7382, -26669=>7383, -26671=>7384, -26702=>7385, -26692=>7386, -26676=>7387, -26653=>7388, -26642=>7389, -26644=>7390, -26662=>7391, -26664=>7392, -26670=>7393, -26701=>7394, -26682=>7395, -26661=>7396, -26656=>7397, -27436=>7398, -27439=>7399, -27437=>7400, -27441=>7401, -27444=>7402, -27501=>7403, -32898=>7404, -27528=>7405, -27622=>7406, -27620=>7407, -27624=>7408, -27619=>7409, -27618=>7410, -27623=>7411, -27685=>7412, -28026=>7413, -28003=>7414, -28004=>7415, -28022=>7416, -27917=>7417, -28001=>7418, -28050=>7419, -27992=>7420, -28002=>7421, -28013=>7422, -28015=>7423, -28049=>7424, -28045=>7425, -28143=>7426, -28031=>7427, -28038=>7428, -27998=>7429, -28007=>7430, -59078=>7430, -28000=>7431, -28055=>7432, -28016=>7433, -28028=>7434, -27999=>7435, -28034=>7436, -28056=>7437, -27951=>7438, -28008=>7439, -28043=>7440, -28030=>7441, -28032=>7442, -28036=>7443, -27926=>7444, -28035=>7445, -28027=>7446, -28029=>7447, -28021=>7448, -28048=>7449, -28892=>7450, -28883=>7451, -28881=>7452, -28893=>7453, -28875=>7454, -32569=>7455, -28898=>7456, -28887=>7457, -28882=>7458, -28894=>7459, -28896=>7460, -28884=>7461, -28877=>7462, -28869=>7463, -28870=>7464, -28871=>7465, -28890=>7466, -28878=>7467, -28897=>7468, -29250=>7469, -29304=>7470, -29303=>7471, -29302=>7472, -29440=>7473, -29434=>7474, -29428=>7475, -29438=>7476, -29430=>7477, -29427=>7478, -29435=>7479, -29441=>7480, -29651=>7481, -29657=>7482, -29669=>7483, -29654=>7484, -29628=>7485, -29671=>7486, -29667=>7487, -29673=>7488, -29660=>7489, -29650=>7490, -29659=>7491, -29652=>7492, -29661=>7493, -29658=>7494, -29655=>7495, -29656=>7496, -29672=>7497, -29918=>7498, -29919=>7499, -29940=>7500, -29941=>7501, -29985=>7502, -30043=>7503, -30047=>7504, -30128=>7505, -30145=>7506, -30139=>7507, -30148=>7508, -30144=>7509, -30143=>7510, -30134=>7511, -30138=>7512, -30346=>7513, -30409=>7514, -30493=>7515, -30491=>7516, -30480=>7517, -30483=>7518, -30482=>7519, -30499=>7520, -30481=>7521, -30485=>7522, -30489=>7523, -30490=>7524, -30498=>7525, -30503=>7526, -30755=>7527, -30764=>7528, -30754=>7529, -30773=>7530, -30767=>7531, -30760=>7532, -30766=>7533, -30763=>7534, -30753=>7535, -30761=>7536, -30771=>7537, -30762=>7538, -30769=>7539, -31060=>7540, -31067=>7541, -31055=>7542, -31068=>7543, -31059=>7544, -31058=>7545, -31057=>7546, -31211=>7547, -31212=>7548, -31200=>7549, -31214=>7550, -31213=>7551, -31210=>7552, -31196=>7553, -31198=>7554, -31197=>7555, -31366=>7556, -31369=>7557, -31365=>7558, -31371=>7559, -31372=>7560, -31370=>7561, -31367=>7562, -31448=>7563, -31504=>7564, -31492=>7565, -31507=>7566, -31493=>7567, -31503=>7568, -31496=>7569, -31498=>7570, -31502=>7571, -31497=>7572, -31506=>7573, -31876=>7574, -31889=>7575, -31882=>7576, -31884=>7577, -31880=>7578, -31885=>7579, -31877=>7580, -32030=>7581, -32029=>7582, -32017=>7583, -32014=>7584, -32024=>7585, -32022=>7586, -32019=>7587, -32031=>7588, -32018=>7589, -32015=>7590, -32012=>7591, -32604=>7592, -32609=>7593, -32606=>7594, -32608=>7595, -32605=>7596, -32603=>7597, -32662=>7598, -32658=>7599, -32707=>7600, -32706=>7601, -32704=>7602, -32790=>7603, -32830=>7604, -32825=>7605, -33018=>7606, -33010=>7607, -33017=>7608, -33013=>7609, -33025=>7610, -33019=>7611, -33024=>7612, -33281=>7613, -33327=>7614, -33317=>7615, -33587=>7616, -33581=>7617, -33604=>7618, -33561=>7619, -33617=>7620, -33573=>7621, -33622=>7622, -33599=>7623, -33601=>7624, -33574=>7625, -33564=>7626, -33570=>7627, -33602=>7628, -33614=>7629, -33563=>7630, -33578=>7631, -33544=>7632, -33596=>7633, -33613=>7634, -33558=>7635, -33572=>7636, -33568=>7637, -33591=>7638, -33583=>7639, -33577=>7640, -33607=>7641, -33605=>7642, -33612=>7643, -33619=>7644, -33566=>7645, -33580=>7646, -33611=>7647, -33575=>7648, -33608=>7649, -34387=>7650, -34386=>7651, -34466=>7652, -34472=>7653, -34454=>7654, -34445=>7655, -34449=>7656, -34462=>7657, -34439=>7658, -34455=>7659, -34438=>7660, -34443=>7661, -34458=>7662, -34437=>7663, -34469=>7664, -34457=>7665, -34465=>7666, -34471=>7667, -34453=>7668, -34456=>7669, -34446=>7670, -34461=>7671, -34448=>7672, -34452=>7673, -34883=>7674, -34884=>7675, -34925=>7676, -34933=>7677, -34934=>7678, -34930=>7679, -34944=>7680, -34929=>7681, -34943=>7682, -34927=>7683, -34947=>7684, -34942=>7685, -34932=>7686, -34940=>7687, -35346=>7688, -35911=>7689, -35927=>7690, -35963=>7691, -36004=>7692, -36003=>7693, -36214=>7694, -36216=>7695, -36277=>7696, -36279=>7697, -36278=>7698, -36561=>7699, -36563=>7700, -36862=>7701, -36853=>7702, -36866=>7703, -36863=>7704, -36859=>7705, -36868=>7706, -36860=>7707, -36854=>7708, -37078=>7709, -37088=>7710, -37081=>7711, -37082=>7712, -37091=>7713, -37087=>7714, -37093=>7715, -37080=>7716, -37083=>7717, -37079=>7718, -37084=>7719, -37092=>7720, -37200=>7721, -37198=>7722, -37199=>7723, -37333=>7724, -37346=>7725, -37338=>7726, -38492=>7727, -38495=>7728, -38588=>7729, -39139=>7730, -12221=>7731, -39647=>7731, -12223=>7732, -39727=>7732, -20095=>7733, -20592=>7734, -20586=>7735, -20577=>7736, -20574=>7737, -20576=>7738, -20563=>7739, -20555=>7740, -20573=>7741, -20594=>7742, -20552=>7743, -20557=>7744, -20545=>7745, -20571=>7746, -20554=>7747, -20578=>7748, -20501=>7749, -20549=>7750, -20575=>7751, -20585=>7752, -20587=>7753, -20579=>7754, -20580=>7755, -20550=>7756, -20544=>7757, -20590=>7758, -20595=>7759, -20567=>7760, -20561=>7761, -20944=>7762, -21099=>7763, -21101=>7764, -21100=>7765, -21102=>7766, -21206=>7767, -21203=>7768, -21293=>7769, -21404=>7770, -21877=>7771, -21878=>7772, -21820=>7773, -21837=>7774, -21840=>7775, -21812=>7776, -21802=>7777, -21841=>7778, -21858=>7779, -21814=>7780, -21813=>7781, -21808=>7782, -21842=>7783, -21829=>7784, -21772=>7785, -21810=>7786, -21861=>7787, -21838=>7788, -21817=>7789, -21832=>7790, -21805=>7791, -21819=>7792, -21824=>7793, -21835=>7794, -22282=>7795, -22279=>7796, -22523=>7797, -22548=>7798, -22498=>7799, -22518=>7800, -22492=>7801, -22516=>7802, -22528=>7803, -22509=>7804, -22525=>7805, -22536=>7806, -22520=>7807, -22539=>7808, -22515=>7809, -22479=>7810, -22535=>7811, -22510=>7812, -22499=>7813, -22514=>7814, -22501=>7815, -22508=>7816, -22497=>7817, -22542=>7818, -22524=>7819, -22544=>7820, -22503=>7821, -22529=>7822, -22540=>7823, -22513=>7824, -22505=>7825, -22512=>7826, -22541=>7827, -22532=>7828, -22876=>7829, -23136=>7830, -23128=>7831, -23125=>7832, -23143=>7833, -60437=>7833, -23134=>7834, -23096=>7835, -23093=>7836, -23149=>7837, -23120=>7838, -23135=>7839, -23141=>7840, -23148=>7841, -23123=>7842, -23140=>7843, -23127=>7844, -23107=>7845, -23133=>7846, -23122=>7847, -23108=>7848, -23131=>7849, -23112=>7850, -23182=>7851, -23102=>7852, -23117=>7853, -23097=>7854, -23116=>7855, -23152=>7856, -23145=>7857, -23111=>7858, -23121=>7859, -23126=>7860, -23106=>7861, -23132=>7862, -23410=>7863, -23406=>7864, -23489=>7865, -23488=>7866, -23641=>7867, -23838=>7868, -23819=>7869, -23837=>7870, -23834=>7871, -23840=>7872, -23820=>7873, -23848=>7874, -23821=>7875, -23846=>7876, -23845=>7877, -23823=>7878, -23856=>7879, -23826=>7880, -23843=>7881, -23839=>7882, -23854=>7883, -24126=>7884, -24116=>7885, -24241=>7886, -24244=>7887, -24249=>7888, -24242=>7889, -24243=>7890, -24374=>7891, -24376=>7892, -24475=>7893, -24470=>7894, -24479=>7895, -24714=>7896, -24720=>7897, -24710=>7898, -24766=>7899, -24752=>7900, -24762=>7901, -24787=>7902, -24788=>7903, -24783=>7904, -24804=>7905, -24793=>7906, -24797=>7907, -24776=>7908, -24753=>7909, -24795=>7910, -24759=>7911, -24778=>7912, -24767=>7913, -24771=>7914, -24781=>7915, -24768=>7916, -25394=>7917, -25445=>7918, -25482=>7919, -25474=>7920, -25469=>7921, -25533=>7922, -25502=>7923, -25517=>7924, -25501=>7925, -25495=>7926, -25515=>7927, -25486=>7928, -25455=>7929, -25479=>7930, -25488=>7931, -25454=>7932, -25519=>7933, -25461=>7934, -25500=>7935, -25453=>7936, -25518=>7937, -25468=>7938, -25508=>7939, -25403=>7940, -25503=>7941, -25464=>7942, -25477=>7943, -25473=>7944, -25489=>7945, -25485=>7946, -25456=>7947, -25939=>7948, -26061=>7949, -26213=>7950, -26209=>7951, -26203=>7952, -26201=>7953, -26204=>7954, -26210=>7955, -26392=>7956, -26745=>7957, -26759=>7958, -26768=>7959, -26780=>7960, -26733=>7961, -26734=>7962, -26798=>7963, -26795=>7964, -26966=>7965, -26735=>7966, -26787=>7967, -26796=>7968, -26793=>7969, -26741=>7970, -26740=>7971, -26802=>7972, -26767=>7973, -26743=>7974, -26770=>7975, -26748=>7976, -26731=>7977, -26738=>7978, -26794=>7979, -26752=>7980, -26737=>7981, -26750=>7982, -26779=>7983, -26774=>7984, -26763=>7985, -26784=>7986, -26761=>7987, -26788=>7988, -26744=>7989, -26747=>7990, -26769=>7991, -26764=>7992, -26762=>7993, -26749=>7994, -27446=>7995, -27443=>7996, -27447=>7997, -27448=>7998, -27537=>7999, -27535=>8000, -27533=>8001, -27534=>8002, -27532=>8003, -27690=>8004, -28096=>8005, -28075=>8006, -28084=>8007, -28083=>8008, -28276=>8009, -28076=>8010, -28137=>8011, -28130=>8012, -28087=>8013, -28150=>8014, -28116=>8015, -28160=>8016, -28104=>8017, -28128=>8018, -28127=>8019, -28118=>8020, -28094=>8021, -28133=>8022, -28124=>8023, -28125=>8024, -28123=>8025, -28148=>8026, -28106=>8027, -28093=>8028, -28141=>8029, -28144=>8030, -28090=>8031, -28117=>8032, -28098=>8033, -28111=>8034, -28105=>8035, -28112=>8036, -28146=>8037, -28115=>8038, -28157=>8039, -28119=>8040, -28109=>8041, -28131=>8042, -28091=>8043, -28922=>8044, -28941=>8045, -28919=>8046, -28951=>8047, -28916=>8048, -28940=>8049, -28912=>8050, -28932=>8051, -28915=>8052, -28944=>8053, -28924=>8054, -28927=>8055, -28934=>8056, -28947=>8057, -28928=>8058, -28920=>8059, -28918=>8060, -28939=>8061, -28930=>8062, -28942=>8063, -29310=>8064, -29307=>8065, -29308=>8066, -29311=>8067, -29469=>8068, -29463=>8069, -29447=>8070, -29457=>8071, -29464=>8072, -29450=>8073, -29448=>8074, -29439=>8075, -29455=>8076, -29470=>8077, -29576=>8078, -29686=>8079, -29688=>8080, -29685=>8081, -29700=>8082, -29697=>8083, -29693=>8084, -29703=>8085, -29696=>8086, -29690=>8087, -29692=>8088, -29695=>8089, -29708=>8090, -29707=>8091, -29684=>8092, -29704=>8093, -30052=>8094, -30051=>8095, -30158=>8096, -30162=>8097, -30159=>8098, -30155=>8099, -30156=>8100, -30161=>8101, -30160=>8102, -30351=>8103, -30345=>8104, -30419=>8105, -30521=>8106, -30511=>8107, -30509=>8108, -30513=>8109, -30514=>8110, -30516=>8111, -30515=>8112, -30525=>8113, -30501=>8114, -30523=>8115, -30517=>8116, -30792=>8117, -30802=>8118, -30793=>8119, -30797=>8120, -30794=>8121, -30796=>8122, -30758=>8123, -30789=>8124, -30800=>8125, -31076=>8126, -31079=>8127, -31081=>8128, -31082=>8129, -31075=>8130, -31083=>8131, -31073=>8132, -31163=>8133, -31226=>8134, -31224=>8135, -31222=>8136, -31223=>8137, -31375=>8138, -31380=>8139, -31376=>8140, -31541=>8141, -31547=>8142, -31540=>8143, -31525=>8144, -31536=>8145, -31522=>8146, -31524=>8147, -31539=>8148, -31512=>8149, -31530=>8150, -31517=>8151, -31537=>8152, -31531=>8153, -31533=>8154, -31535=>8155, -31538=>8156, -31544=>8157, -31514=>8158, -31523=>8159, -31892=>8160, -31896=>8161, -31894=>8162, -31907=>8163, -32053=>8164, -32061=>8165, -32056=>8166, -32054=>8167, -32058=>8168, -32069=>8169, -32044=>8170, -32041=>8171, -32065=>8172, -32071=>8173, -32062=>8174, -32063=>8175, -32074=>8176, -32059=>8177, -32040=>8178, -32611=>8179, -32661=>8180, -32668=>8181, -32669=>8182, -32667=>8183, -32714=>8184, -32715=>8185, -32717=>8186, -32720=>8187, -32721=>8188, -32711=>8189, -32719=>8190, -32713=>8191, -32799=>8192, -32798=>8193, -32795=>8194, -32839=>8195, -32835=>8196, -32840=>8197, -33048=>8198, -33061=>8199, -33049=>8200, -33051=>8201, -33069=>8202, -33055=>8203, -33068=>8204, -33054=>8205, -33057=>8206, -33045=>8207, -33063=>8208, -33053=>8209, -33058=>8210, -33297=>8211, -33336=>8212, -33331=>8213, -33338=>8214, -33332=>8215, -33330=>8216, -33396=>8217, -33680=>8218, -33699=>8219, -33704=>8220, -33677=>8221, -33658=>8222, -33651=>8223, -33700=>8224, -33652=>8225, -33679=>8226, -33665=>8227, -33685=>8228, -33689=>8229, -33653=>8230, -33684=>8231, -33705=>8232, -33661=>8233, -33667=>8234, -33676=>8235, -33693=>8236, -33691=>8237, -33706=>8238, -33675=>8239, -33662=>8240, -33701=>8241, -33711=>8242, -33672=>8243, -33687=>8244, -33712=>8245, -33663=>8246, -33702=>8247, -33671=>8248, -33710=>8249, -33654=>8250, -34393=>8251, -34390=>8252, -34495=>8253, -34487=>8254, -34498=>8255, -34497=>8256, -34501=>8257, -34490=>8258, -34480=>8259, -34504=>8260, -34489=>8261, -34483=>8262, -34488=>8263, -34508=>8264, -34484=>8265, -34491=>8266, -34492=>8267, -34499=>8268, -34493=>8269, -34494=>8270, -34898=>8271, -34953=>8272, -34965=>8273, -34984=>8274, -34978=>8275, -34986=>8276, -34970=>8277, -34961=>8278, -34977=>8279, -34975=>8280, -34968=>8281, -34983=>8282, -34969=>8283, -34971=>8284, -34967=>8285, -34980=>8286, -34988=>8287, -34956=>8288, -34963=>8289, -34958=>8290, -35202=>8291, -35286=>8292, -35289=>8293, -35285=>8294, -35376=>8295, -35367=>8296, -35372=>8297, -35358=>8298, -35897=>8299, -35899=>8300, -35932=>8301, -35933=>8302, -35965=>8303, -36005=>8304, -36221=>8305, -36219=>8306, -36217=>8307, -36284=>8308, -36290=>8309, -36281=>8310, -36287=>8311, -36289=>8312, -36568=>8313, -36574=>8314, -36573=>8315, -36572=>8316, -36567=>8317, -36576=>8318, -36577=>8319, -36900=>8320, -36875=>8321, -36881=>8322, -36892=>8323, -36876=>8324, -36897=>8325, -37103=>8326, -37098=>8327, -37104=>8328, -37108=>8329, -37106=>8330, -37107=>8331, -37076=>8332, -37099=>8333, -37100=>8334, -37097=>8335, -37206=>8336, -37208=>8337, -37210=>8338, -37203=>8339, -37205=>8340, -37356=>8341, -37364=>8342, -37361=>8343, -37363=>8344, -37368=>8345, -37348=>8346, -37369=>8347, -37354=>8348, -37355=>8349, -37367=>8350, -37352=>8351, -37358=>8352, -38266=>8353, -38278=>8354, -38280=>8355, -38524=>8356, -38509=>8357, -38507=>8358, -38513=>8359, -38511=>8360, -38591=>8361, -38762=>8362, -38916=>8363, -39141=>8364, -39319=>8365, -20635=>8366, -20629=>8367, -20628=>8368, -20638=>8369, -20619=>8370, -20643=>8371, -20611=>8372, -20620=>8373, -20622=>8374, -20637=>8375, -20584=>8376, -20636=>8377, -20626=>8378, -20610=>8379, -20615=>8380, -20831=>8381, -20948=>8382, -21266=>8383, -21265=>8384, -21412=>8385, -21415=>8386, -21905=>8387, -21928=>8388, -21925=>8389, -21933=>8390, -21879=>8391, -22085=>8392, -21922=>8393, -21907=>8394, -21896=>8395, -21903=>8396, -21941=>8397, -21889=>8398, -21923=>8399, -21906=>8400, -21924=>8401, -21885=>8402, -21900=>8403, -21926=>8404, -21887=>8405, -21909=>8406, -21921=>8407, -21902=>8408, -22284=>8409, -22569=>8410, -22583=>8411, -22553=>8412, -22558=>8413, -22567=>8414, -22563=>8415, -22568=>8416, -22517=>8417, -22600=>8418, -22565=>8419, -22556=>8420, -22555=>8421, -22579=>8422, -22591=>8423, -22582=>8424, -22574=>8425, -22585=>8426, -22584=>8427, -22573=>8428, -22572=>8429, -22587=>8430, -22881=>8431, -23215=>8432, -23188=>8433, -23199=>8434, -23162=>8435, -23202=>8436, -23198=>8437, -23160=>8438, -23206=>8439, -23164=>8440, -23205=>8441, -23212=>8442, -23189=>8443, -23214=>8444, -23095=>8445, -23172=>8446, -23178=>8447, -23191=>8448, -23171=>8449, -23179=>8450, -23209=>8451, -23163=>8452, -23165=>8453, -23180=>8454, -23196=>8455, -23183=>8456, -23187=>8457, -23197=>8458, -23530=>8459, -23501=>8460, -23499=>8461, -23508=>8462, -23505=>8463, -23498=>8464, -23502=>8465, -23564=>8466, -23600=>8467, -23863=>8468, -23875=>8469, -23915=>8470, -23873=>8471, -23883=>8472, -23871=>8473, -23861=>8474, -23889=>8475, -23886=>8476, -23893=>8477, -23859=>8478, -23866=>8479, -23890=>8480, -23869=>8481, -23857=>8482, -23897=>8483, -23874=>8484, -23865=>8485, -23881=>8486, -23864=>8487, -23868=>8488, -23858=>8489, -23862=>8490, -23872=>8491, -23877=>8492, -24132=>8493, -24129=>8494, -24408=>8495, -57673=>8495, -24486=>8496, -24485=>8497, -24491=>8498, -24777=>8499, -24761=>8500, -24780=>8501, -24802=>8502, -24782=>8503, -24772=>8504, -24852=>8505, -24818=>8506, -24842=>8507, -24854=>8508, -24837=>8509, -24821=>8510, -24851=>8511, -24824=>8512, -24828=>8513, -24830=>8514, -24769=>8515, -24835=>8516, -24856=>8517, -24861=>8518, -24848=>8519, -24831=>8520, -24836=>8521, -24843=>8522, -25162=>8523, -25492=>8524, -25521=>8525, -25520=>8526, -25550=>8527, -25573=>8528, -25576=>8529, -25583=>8530, -25539=>8531, -25757=>8532, -25587=>8533, -25546=>8534, -25568=>8535, -25590=>8536, -25557=>8537, -25586=>8538, -25589=>8539, -25697=>8540, -25567=>8541, -25534=>8542, -25565=>8543, -25564=>8544, -25540=>8545, -25560=>8546, -25555=>8547, -25538=>8548, -25543=>8549, -25548=>8550, -25547=>8551, -25544=>8552, -25584=>8553, -25559=>8554, -25561=>8555, -25906=>8556, -25959=>8557, -25962=>8558, -25956=>8559, -25948=>8560, -25960=>8561, -25957=>8562, -25996=>8563, -26013=>8564, -26014=>8565, -26030=>8566, -26064=>8567, -26066=>8568, -26236=>8569, -26220=>8570, -26235=>8571, -26240=>8572, -26225=>8573, -26233=>8574, -26218=>8575, -26226=>8576, -26369=>8577, -26892=>8578, -26835=>8579, -26884=>8580, -26844=>8581, -26922=>8582, -26860=>8583, -26858=>8584, -26865=>8585, -26895=>8586, -26838=>8587, -26871=>8588, -26859=>8589, -26852=>8590, -26870=>8591, -26899=>8592, -26896=>8593, -26867=>8594, -26849=>8595, -26887=>8596, -26828=>8597, -26888=>8598, -26992=>8599, -26804=>8600, -26897=>8601, -26863=>8602, -26822=>8603, -26900=>8604, -26872=>8605, -26832=>8606, -26877=>8607, -26876=>8608, -26856=>8609, -26891=>8610, -26890=>8611, -26903=>8612, -26830=>8613, -26824=>8614, -26845=>8615, -26846=>8616, -26854=>8617, -26868=>8618, -26833=>8619, -26886=>8620, -26836=>8621, -26857=>8622, -26901=>8623, -26917=>8624, -26823=>8625, -27449=>8626, -27451=>8627, -27455=>8628, -27452=>8629, -27540=>8630, -27543=>8631, -27545=>8632, -27541=>8633, -27581=>8634, -27632=>8635, -27634=>8636, -27635=>8637, -27696=>8638, -28156=>8639, -28230=>8640, -28231=>8641, -28191=>8642, -28233=>8643, -28296=>8644, -28220=>8645, -28221=>8646, -28229=>8647, -28258=>8648, -28203=>8649, -28223=>8650, -28225=>8651, -28253=>8652, -28275=>8653, -28188=>8654, -28211=>8655, -28235=>8656, -28224=>8657, -28241=>8658, -28219=>8659, -28163=>8660, -28206=>8661, -28254=>8662, -28264=>8663, -28252=>8664, -28257=>8665, -28209=>8666, -28200=>8667, -28256=>8668, -28273=>8669, -28267=>8670, -28217=>8671, -28194=>8672, -28208=>8673, -28243=>8674, -28261=>8675, -28199=>8676, -28280=>8677, -28260=>8678, -28279=>8679, -28245=>8680, -28281=>8681, -28242=>8682, -28262=>8683, -28213=>8684, -28214=>8685, -28250=>8686, -28960=>8687, -28958=>8688, -28975=>8689, -28923=>8690, -28974=>8691, -28977=>8692, -28963=>8693, -28965=>8694, -28962=>8695, -28978=>8696, -28959=>8697, -28968=>8698, -28986=>8699, -28955=>8700, -29259=>8701, -29274=>8702, -29320=>8703, -29321=>8704, -29318=>8705, -29317=>8706, -29323=>8707, -29458=>8708, -29451=>8709, -29488=>8710, -29474=>8711, -29489=>8712, -29491=>8713, -29479=>8714, -29490=>8715, -29485=>8716, -29478=>8717, -29475=>8718, -29493=>8719, -29452=>8720, -29742=>8721, -29740=>8722, -29744=>8723, -29739=>8724, -29718=>8725, -29722=>8726, -29729=>8727, -29741=>8728, -29745=>8729, -29732=>8730, -29731=>8731, -29725=>8732, -29737=>8733, -29728=>8734, -29746=>8735, -29947=>8736, -29999=>8737, -30063=>8738, -30060=>8739, -30183=>8740, -30170=>8741, -30177=>8742, -30182=>8743, -30173=>8744, -30175=>8745, -30180=>8746, -30167=>8747, -30357=>8748, -30354=>8749, -30426=>8750, -30534=>8751, -30535=>8752, -30532=>8753, -30541=>8754, -30533=>8755, -30538=>8756, -30542=>8757, -30539=>8758, -30540=>8759, -30686=>8760, -30700=>8761, -30816=>8762, -30820=>8763, -30821=>8764, -30812=>8765, -30829=>8766, -30833=>8767, -30826=>8768, -30830=>8769, -30832=>8770, -30825=>8771, -30824=>8772, -30814=>8773, -30818=>8774, -31092=>8775, -31091=>8776, -31090=>8777, -31088=>8778, -31234=>8779, -31242=>8780, -31235=>8781, -31244=>8782, -31236=>8783, -31385=>8784, -31462=>8785, -31460=>8786, -31562=>8787, -31559=>8788, -31556=>8789, -31560=>8790, -31564=>8791, -31566=>8792, -31552=>8793, -31576=>8794, -31557=>8795, -31906=>8796, -31902=>8797, -31912=>8798, -31905=>8799, -32088=>8800, -32111=>8801, -32099=>8802, -32083=>8803, -32086=>8804, -32103=>8805, -32106=>8806, -32079=>8807, -32109=>8808, -32092=>8809, -32107=>8810, -32082=>8811, -32084=>8812, -32105=>8813, -32081=>8814, -32095=>8815, -32078=>8816, -32574=>8817, -32575=>8818, -32613=>8819, -32614=>8820, -32674=>8821, -32672=>8822, -32673=>8823, -32727=>8824, -32849=>8825, -32847=>8826, -32848=>8827, -33022=>8828, -32980=>8829, -33091=>8830, -33098=>8831, -33106=>8832, -33103=>8833, -33095=>8834, -33085=>8835, -33101=>8836, -33082=>8837, -33254=>8838, -33262=>8839, -33271=>8840, -33272=>8841, -33273=>8842, -33284=>8843, -33340=>8844, -33341=>8845, -33343=>8846, -33397=>8847, -33595=>8848, -33743=>8849, -60382=>8849, -33785=>8850, -33827=>8851, -33728=>8852, -33768=>8853, -33810=>8854, -33767=>8855, -33764=>8856, -33788=>8857, -33782=>8858, -33808=>8859, -33734=>8860, -33736=>8861, -33771=>8862, -33763=>8863, -33727=>8864, -33793=>8865, -33757=>8866, -33765=>8867, -33752=>8868, -33791=>8869, -33761=>8870, -33739=>8871, -33742=>8872, -33750=>8873, -33781=>8874, -33737=>8875, -33801=>8876, -33807=>8877, -58332=>8877, -33758=>8878, -33809=>8879, -33798=>8880, -33730=>8881, -33779=>8882, -33749=>8883, -33786=>8884, -33735=>8885, -33745=>8886, -33770=>8887, -33811=>8888, -33690=>8889, -33731=>8890, -33772=>8891, -33774=>8892, -33732=>8893, -33787=>8894, -33751=>8895, -33762=>8896, -33819=>8897, -33755=>8898, -33790=>8899, -34520=>8900, -34530=>8901, -34534=>8902, -34515=>8903, -34531=>8904, -34522=>8905, -34538=>8906, -34525=>8907, -34539=>8908, -34524=>8909, -34540=>8910, -34537=>8911, -34519=>8912, -34536=>8913, -34513=>8914, -34888=>8915, -34902=>8916, -34901=>8917, -35002=>8918, -35031=>8919, -35001=>8920, -35000=>8921, -35008=>8922, -35006=>8923, -34998=>8924, -35004=>8925, -34999=>8926, -35005=>8927, -34994=>8928, -35073=>8929, -35017=>8930, -35221=>8931, -35224=>8932, -35223=>8933, -35293=>8934, -35290=>8935, -35291=>8936, -35406=>8937, -35405=>8938, -35385=>8939, -35417=>8940, -35392=>8941, -35415=>8942, -35416=>8943, -35396=>8944, -35397=>8945, -35410=>8946, -35400=>8947, -35409=>8948, -35402=>8949, -35404=>8950, -35407=>8951, -35935=>8952, -35969=>8953, -35968=>8954, -36026=>8955, -36030=>8956, -36016=>8957, -36025=>8958, -36021=>8959, -36228=>8960, -36224=>8961, -36233=>8962, -36312=>8963, -36307=>8964, -36301=>8965, -36295=>8966, -36310=>8967, -36316=>8968, -36303=>8969, -36309=>8970, -36313=>8971, -36296=>8972, -36311=>8973, -36293=>8974, -36591=>8975, -36599=>8976, -36602=>8977, -36601=>8978, -36582=>8979, -36590=>8980, -36581=>8981, -36597=>8982, -36583=>8983, -36584=>8984, -36598=>8985, -36587=>8986, -36593=>8987, -36588=>8988, -36596=>8989, -36585=>8990, -36909=>8991, -36916=>8992, -36911=>8993, -37126=>8994, -37164=>8995, -37124=>8996, -60367=>8996, -37119=>8997, -37116=>8998, -37128=>8999, -37113=>9000, -37115=>9001, -37121=>9002, -37120=>9003, -37127=>9004, -37125=>9005, -37123=>9006, -37217=>9007, -37220=>9008, -37215=>9009, -37218=>9010, -37216=>9011, -37377=>9012, -37386=>9013, -37413=>9014, -37379=>9015, -37402=>9016, -37414=>9017, -37391=>9018, -37388=>9019, -37376=>9020, -37394=>9021, -37375=>9022, -37373=>9023, -37382=>9024, -37380=>9025, -37415=>9026, -37378=>9027, -37404=>9028, -37412=>9029, -37401=>9030, -37399=>9031, -37381=>9032, -37398=>9033, -38267=>9034, -38285=>9035, -38284=>9036, -38288=>9037, -38535=>9038, -38526=>9039, -38536=>9040, -38537=>9041, -38531=>9042, -38528=>9043, -38594=>9044, -38600=>9045, -38595=>9046, -38641=>9047, -38640=>9048, -38764=>9049, -38768=>9050, -38766=>9051, -38919=>9052, -39081=>9053, -39147=>9054, -40166=>9055, -12235=>9056, -40697=>9056, -20099=>9057, -20100=>9058, -20150=>9059, -20669=>9060, -20671=>9061, -20678=>9062, -20654=>9063, -20676=>9064, -20682=>9065, -20660=>9066, -20680=>9067, -20674=>9068, -20656=>9069, -20673=>9070, -20666=>9071, -20657=>9072, -20683=>9073, -20681=>9074, -20662=>9075, -20664=>9076, -20951=>9077, -21114=>9078, -21112=>9079, -21115=>9080, -21116=>9081, -21955=>9082, -21979=>9083, -21964=>9084, -21968=>9085, -21963=>9086, -21962=>9087, -21981=>9088, -21952=>9089, -64013=>9089, -21972=>9090, -21956=>9091, -21993=>9092, -21951=>9093, -21970=>9094, -21901=>9095, -21967=>9096, -21973=>9097, -21986=>9098, -21974=>9099, -21960=>9100, -22002=>9101, -21965=>9102, -21977=>9103, -21954=>9104, -22292=>9105, -22611=>9106, -22632=>9107, -22628=>9108, -22607=>9109, -22605=>9110, -22601=>9111, -22639=>9112, -22613=>9113, -22606=>9114, -22621=>9115, -22617=>9116, -22629=>9117, -22619=>9118, -22589=>9119, -22627=>9120, -22641=>9121, -22780=>9122, -23239=>9123, -23236=>9124, -23243=>9125, -23226=>9126, -23224=>9127, -23217=>9128, -23221=>9129, -23216=>9130, -23231=>9131, -23240=>9132, -23227=>9133, -23238=>9134, -23223=>9135, -23232=>9136, -23242=>9137, -23220=>9138, -23222=>9139, -23245=>9140, -23225=>9141, -23184=>9142, -23510=>9143, -23512=>9144, -23513=>9145, -23583=>9146, -23603=>9147, -23921=>9148, -23907=>9149, -23882=>9150, -23909=>9151, -23922=>9152, -23916=>9153, -23902=>9154, -23912=>9155, -23911=>9156, -23906=>9157, -24048=>9158, -24143=>9159, -24142=>9160, -24138=>9161, -24141=>9162, -24139=>9163, -24261=>9164, -24268=>9165, -24262=>9166, -24267=>9167, -24263=>9168, -24384=>9169, -24495=>9170, -24493=>9171, -24823=>9172, -24905=>9173, -24906=>9174, -24875=>9175, -24901=>9176, -24886=>9177, -24882=>9178, -24878=>9179, -24902=>9180, -24879=>9181, -24911=>9182, -24873=>9183, -24896=>9184, -25120=>9185, -37224=>9186, -25123=>9187, -25125=>9188, -25124=>9189, -25541=>9190, -25585=>9191, -25579=>9192, -25616=>9193, -25618=>9194, -25609=>9195, -25632=>9196, -25636=>9197, -25651=>9198, -25667=>9199, -25631=>9200, -25621=>9201, -25624=>9202, -25657=>9203, -25655=>9204, -25634=>9205, -25635=>9206, -25612=>9207, -25638=>9208, -25648=>9209, -25640=>9210, -25665=>9211, -25653=>9212, -25647=>9213, -25610=>9214, -25626=>9215, -25664=>9216, -25637=>9217, -25639=>9218, -25611=>9219, -25575=>9220, -25627=>9221, -25646=>9222, -25633=>9223, -25614=>9224, -25967=>9225, -26002=>9226, -26067=>9227, -26246=>9228, -26252=>9229, -26261=>9230, -26256=>9231, -26251=>9232, -26250=>9233, -26265=>9234, -26260=>9235, -26232=>9236, -26400=>9237, -26982=>9238, -26975=>9239, -26936=>9240, -26958=>9241, -26978=>9242, -26993=>9243, -26943=>9244, -26949=>9245, -26986=>9246, -26937=>9247, -26946=>9248, -26967=>9249, -26969=>9250, -27002=>9251, -26952=>9252, -26953=>9253, -26933=>9254, -26988=>9255, -26931=>9256, -26941=>9257, -26981=>9258, -26864=>9259, -27000=>9260, -26932=>9261, -26985=>9262, -26944=>9263, -26991=>9264, -26948=>9265, -26998=>9266, -26968=>9267, -26945=>9268, -26996=>9269, -26956=>9270, -26939=>9271, -26955=>9272, -26935=>9273, -26972=>9274, -26959=>9275, -26961=>9276, -26930=>9277, -26962=>9278, -26927=>9279, -27003=>9280, -26940=>9281, -27462=>9282, -27461=>9283, -27459=>9284, -27458=>9285, -27464=>9286, -27457=>9287, -27547=>9288, -27643=>9289, -27644=>9290, -27641=>9291, -27639=>9292, -27640=>9293, -28315=>9294, -28374=>9295, -28360=>9296, -28303=>9297, -28352=>9298, -28319=>9299, -28307=>9300, -28308=>9301, -28320=>9302, -28337=>9303, -28345=>9304, -28358=>9305, -28370=>9306, -28349=>9307, -28353=>9308, -28318=>9309, -28361=>9310, -28343=>9311, -28336=>9312, -28365=>9313, -28326=>9314, -28367=>9315, -28338=>9316, -28350=>9317, -28355=>9318, -28380=>9319, -28376=>9320, -28313=>9321, -28306=>9322, -28302=>9323, -28301=>9324, -28324=>9325, -28321=>9326, -28351=>9327, -28339=>9328, -28368=>9329, -28362=>9330, -28311=>9331, -28334=>9332, -28323=>9333, -28999=>9334, -29012=>9335, -29010=>9336, -29027=>9337, -29024=>9338, -28993=>9339, -29021=>9340, -29026=>9341, -61080=>9341, -29042=>9342, -29048=>9343, -29034=>9344, -29025=>9345, -28994=>9346, -29016=>9347, -28995=>9348, -29003=>9349, -29040=>9350, -29023=>9351, -29008=>9352, -29011=>9353, -28996=>9354, -29005=>9355, -29018=>9356, -29263=>9357, -29325=>9358, -29324=>9359, -29329=>9360, -29328=>9361, -29326=>9362, -29500=>9363, -29506=>9364, -29499=>9365, -29498=>9366, -29504=>9367, -29514=>9368, -29513=>9369, -29764=>9370, -29770=>9371, -29771=>9372, -29778=>9373, -29777=>9374, -29783=>9375, -29760=>9376, -29775=>9377, -29776=>9378, -29774=>9379, -29762=>9380, -29766=>9381, -29773=>9382, -29780=>9383, -29921=>9384, -29951=>9385, -29950=>9386, -29949=>9387, -29981=>9388, -30073=>9389, -30071=>9390, -27011=>9391, -30191=>9392, -30223=>9393, -30211=>9394, -30199=>9395, -30206=>9396, -30204=>9397, -30201=>9398, -60782=>9398, -30200=>9399, -30224=>9400, -30203=>9401, -30198=>9402, -30189=>9403, -30197=>9404, -30205=>9405, -30361=>9406, -30389=>9407, -30429=>9408, -30549=>9409, -30559=>9410, -30560=>9411, -30546=>9412, -30550=>9413, -30554=>9414, -30569=>9415, -30567=>9416, -30548=>9417, -30553=>9418, -30573=>9419, -30688=>9420, -30855=>9421, -30874=>9422, -30868=>9423, -30863=>9424, -30852=>9425, -30869=>9426, -30853=>9427, -30854=>9428, -30881=>9429, -30851=>9430, -30841=>9431, -30873=>9432, -30848=>9433, -30870=>9434, -30843=>9435, -31100=>9436, -31106=>9437, -31101=>9438, -31097=>9439, -31249=>9440, -31256=>9441, -31257=>9442, -31250=>9443, -31255=>9444, -31253=>9445, -31266=>9446, -31251=>9447, -31259=>9448, -31248=>9449, -31395=>9450, -31394=>9451, -31390=>9452, -31467=>9453, -31590=>9454, -31588=>9455, -31597=>9456, -31604=>9457, -31593=>9458, -31602=>9459, -31589=>9460, -31603=>9461, -31601=>9462, -31600=>9463, -31585=>9464, -31608=>9465, -31606=>9466, -31587=>9467, -31922=>9468, -31924=>9469, -31919=>9470, -32136=>9471, -32134=>9472, -32128=>9473, -32141=>9474, -32127=>9475, -32133=>9476, -32122=>9477, -32142=>9478, -32123=>9479, -32131=>9480, -32124=>9481, -32140=>9482, -32148=>9483, -32132=>9484, -32125=>9485, -32146=>9486, -32621=>9487, -32619=>9488, -32615=>9489, -32616=>9490, -32620=>9491, -32678=>9492, -32677=>9493, -32679=>9494, -32731=>9495, -32732=>9496, -32801=>9497, -33124=>9498, -33120=>9499, -33143=>9500, -33116=>9501, -33129=>9502, -33115=>9503, -33122=>9504, -33138=>9505, -26401=>9506, -33118=>9507, -33142=>9508, -33127=>9509, -33135=>9510, -33092=>9511, -33121=>9512, -33309=>9513, -33353=>9514, -33348=>9515, -33344=>9516, -33346=>9517, -33349=>9518, -34033=>9519, -33855=>9520, -33878=>9521, -33910=>9522, -33913=>9523, -33935=>9524, -33933=>9525, -33893=>9526, -33873=>9527, -33856=>9528, -33926=>9529, -33895=>9530, -33840=>9531, -33869=>9532, -33917=>9533, -33882=>9534, -33881=>9535, -33908=>9536, -33907=>9537, -33885=>9538, -34055=>9539, -33886=>9540, -33847=>9541, -33850=>9542, -33844=>9543, -33914=>9544, -33859=>9545, -33912=>9546, -33842=>9547, -33861=>9548, -33833=>9549, -33753=>9550, -33867=>9551, -33839=>9552, -33858=>9553, -33837=>9554, -33887=>9555, -33904=>9556, -33849=>9557, -33870=>9558, -33868=>9559, -33874=>9560, -33903=>9561, -33989=>9562, -33934=>9563, -33851=>9564, -33863=>9565, -33846=>9566, -33843=>9567, -33896=>9568, -33918=>9569, -33860=>9570, -33835=>9571, -33888=>9572, -33876=>9573, -33902=>9574, -33872=>9575, -34571=>9576, -34564=>9577, -34551=>9578, -34572=>9579, -34554=>9580, -34518=>9581, -34549=>9582, -34637=>9583, -34552=>9584, -34574=>9585, -34569=>9586, -34561=>9587, -34550=>9588, -34573=>9589, -34565=>9590, -35030=>9591, -35019=>9592, -35021=>9593, -35022=>9594, -35038=>9595, -35035=>9596, -35034=>9597, -35020=>9598, -35024=>9599, -35205=>9600, -35227=>9601, -35295=>9602, -35301=>9603, -35300=>9604, -35297=>9605, -35296=>9606, -35298=>9607, -35292=>9608, -35302=>9609, -35446=>9610, -35462=>9611, -35455=>9612, -35425=>9613, -35391=>9614, -35447=>9615, -35458=>9616, -35460=>9617, -35445=>9618, -35459=>9619, -35457=>9620, -35444=>9621, -35450=>9622, -35900=>9623, -35915=>9624, -35914=>9625, -35941=>9626, -35940=>9627, -35942=>9628, -35974=>9629, -35972=>9630, -35973=>9631, -36044=>9632, -36200=>9633, -36201=>9634, -36241=>9635, -36236=>9636, -36238=>9637, -36239=>9638, -36237=>9639, -36243=>9640, -36244=>9641, -36240=>9642, -36242=>9643, -36336=>9644, -36320=>9645, -36332=>9646, -36337=>9647, -36334=>9648, -36304=>9649, -36329=>9650, -36323=>9651, -36322=>9652, -36327=>9653, -36338=>9654, -36331=>9655, -36340=>9656, -36614=>9657, -36607=>9658, -36609=>9659, -36608=>9660, -36613=>9661, -36615=>9662, -36616=>9663, -36610=>9664, -36619=>9665, -60507=>9665, -36946=>9666, -36927=>9667, -36932=>9668, -36937=>9669, -36925=>9670, -37136=>9671, -37133=>9672, -37135=>9673, -37137=>9674, -37142=>9675, -37140=>9676, -37131=>9677, -37134=>9678, -37230=>9679, -37231=>9680, -37448=>9681, -37458=>9682, -37424=>9683, -37434=>9684, -37478=>9685, -37427=>9686, -37477=>9687, -37470=>9688, -37507=>9689, -37422=>9690, -37450=>9691, -37446=>9692, -37485=>9693, -37484=>9694, -37455=>9695, -37472=>9696, -37479=>9697, -37487=>9698, -37430=>9699, -37473=>9700, -37488=>9701, -37425=>9702, -37460=>9703, -37475=>9704, -37456=>9705, -37490=>9706, -37454=>9707, -37459=>9708, -37452=>9709, -37462=>9710, -37426=>9711, -38303=>9712, -38300=>9713, -38302=>9714, -38299=>9715, -38546=>9716, -38547=>9717, -38545=>9718, -38551=>9719, -38606=>9720, -38650=>9721, -38653=>9722, -38648=>9723, -38645=>9724, -38771=>9725, -38775=>9726, -38776=>9727, -38770=>9728, -38927=>9729, -38925=>9730, -38926=>9731, -39084=>9732, -39158=>9733, -39161=>9734, -39343=>9735, -39346=>9736, -39344=>9737, -39349=>9738, -39597=>9739, -39595=>9740, -39771=>9741, -40170=>9742, -40173=>9743, -40167=>9744, -40576=>9745, -12236=>9746, -40701=>9746, -20710=>9747, -20692=>9748, -20695=>9749, -20712=>9750, -20723=>9751, -20699=>9752, -20714=>9753, -20701=>9754, -20708=>9755, -20691=>9756, -20716=>9757, -20720=>9758, -20719=>9759, -20707=>9760, -20704=>9761, -20952=>9762, -21120=>9763, -21121=>9764, -21225=>9765, -21227=>9766, -21296=>9767, -21420=>9768, -22055=>9769, -22037=>9770, -22028=>9771, -22034=>9772, -22012=>9773, -22031=>9774, -22044=>9775, -22017=>9776, -22035=>9777, -22018=>9778, -22010=>9779, -22045=>9780, -22020=>9781, -22015=>9782, -22009=>9783, -22665=>9784, -22652=>9785, -22672=>9786, -22680=>9787, -22662=>9788, -22657=>9789, -22655=>9790, -22644=>9791, -22667=>9792, -22650=>9793, -22663=>9794, -22673=>9795, -22670=>9796, -22646=>9797, -22658=>9798, -22664=>9799, -22651=>9800, -22676=>9801, -22671=>9802, -22782=>9803, -22891=>9804, -23260=>9805, -23278=>9806, -23269=>9807, -23253=>9808, -23274=>9809, -23258=>9810, -23277=>9811, -23275=>9812, -23283=>9813, -23266=>9814, -23264=>9815, -23259=>9816, -23276=>9817, -23262=>9818, -23261=>9819, -23257=>9820, -23272=>9821, -23263=>9822, -23415=>9823, -23520=>9824, -23523=>9825, -23651=>9826, -23938=>9827, -23936=>9828, -23933=>9829, -23942=>9830, -23930=>9831, -23937=>9832, -23927=>9833, -23946=>9834, -23945=>9835, -23944=>9836, -23934=>9837, -23932=>9838, -23949=>9839, -23929=>9840, -23935=>9841, -24152=>9842, -24153=>9843, -24147=>9844, -24280=>9845, -24273=>9846, -24279=>9847, -24270=>9848, -24284=>9849, -24277=>9850, -24281=>9851, -24274=>9852, -24276=>9853, -24388=>9854, -24387=>9855, -24431=>9856, -24502=>9857, -24876=>9858, -24872=>9859, -24897=>9860, -24926=>9861, -24945=>9862, -24947=>9863, -24914=>9864, -24915=>9865, -24946=>9866, -24940=>9867, -24960=>9868, -24948=>9869, -24916=>9870, -24954=>9871, -24923=>9872, -24933=>9873, -24891=>9874, -24938=>9875, -24929=>9876, -24918=>9877, -25129=>9878, -25127=>9879, -25131=>9880, -25643=>9881, -25677=>9882, -25691=>9883, -25693=>9884, -25716=>9885, -25718=>9886, -25714=>9887, -25715=>9888, -25725=>9889, -25717=>9890, -25702=>9891, -25766=>9892, -25678=>9893, -25730=>9894, -25694=>9895, -25692=>9896, -25675=>9897, -25683=>9898, -25696=>9899, -25680=>9900, -25727=>9901, -25663=>9902, -25708=>9903, -25707=>9904, -25689=>9905, -25701=>9906, -25719=>9907, -25971=>9908, -26016=>9909, -26273=>9910, -26272=>9911, -26271=>9912, -26373=>9913, -26372=>9914, -26402=>9915, -27057=>9916, -27062=>9917, -27081=>9918, -27040=>9919, -27086=>9920, -27030=>9921, -27056=>9922, -27052=>9923, -27068=>9924, -27025=>9925, -27033=>9926, -27022=>9927, -27047=>9928, -27021=>9929, -27049=>9930, -27070=>9931, -27055=>9932, -27071=>9933, -27076=>9934, -27069=>9935, -27044=>9936, -27092=>9937, -27065=>9938, -27082=>9939, -27034=>9940, -27087=>9941, -27059=>9942, -27027=>9943, -27050=>9944, -27041=>9945, -27038=>9946, -27097=>9947, -27031=>9948, -27024=>9949, -27074=>9950, -27061=>9951, -27045=>9952, -27078=>9953, -27466=>9954, -27469=>9955, -27467=>9956, -27550=>9957, -27551=>9958, -27552=>9959, -27587=>9960, -27588=>9961, -27646=>9962, -28366=>9963, -28405=>9964, -28401=>9965, -28419=>9966, -28453=>9967, -28408=>9968, -28471=>9969, -28411=>9970, -28462=>9971, -28425=>9972, -28494=>9973, -28441=>9974, -28442=>9975, -28455=>9976, -28440=>9977, -28475=>9978, -28434=>9979, -28397=>9980, -28426=>9981, -28470=>9982, -28531=>9983, -28409=>9984, -28398=>9985, -28461=>9986, -28480=>9987, -28464=>9988, -28476=>9989, -28469=>9990, -28395=>9991, -28423=>9992, -28430=>9993, -28483=>9994, -28421=>9995, -28413=>9996, -28406=>9997, -28473=>9998, -28444=>9999, -28412=>10000, -28474=>10001, -28447=>10002, -28429=>10003, -28446=>10004, -28424=>10005, -28449=>10006, -29063=>10007, -29072=>10008, -29065=>10009, -29056=>10010, -29061=>10011, -29058=>10012, -29071=>10013, -29051=>10014, -29062=>10015, -29057=>10016, -29079=>10017, -29252=>10018, -29267=>10019, -29335=>10020, -29333=>10021, -29331=>10022, -29507=>10023, -29517=>10024, -29521=>10025, -29516=>10026, -29794=>10027, -29811=>10028, -29809=>10029, -29813=>10030, -29810=>10031, -29799=>10032, -29806=>10033, -29952=>10034, -29954=>10035, -29955=>10036, -30077=>10037, -30096=>10038, -30230=>10039, -30216=>10040, -30220=>10041, -30229=>10042, -30225=>10043, -30218=>10044, -30228=>10045, -30392=>10046, -30593=>10047, -30588=>10048, -30597=>10049, -30594=>10050, -30574=>10051, -30592=>10052, -30575=>10053, -30590=>10054, -30595=>10055, -30898=>10056, -30890=>10057, -30900=>10058, -30893=>10059, -30888=>10060, -30846=>10061, -30891=>10062, -30878=>10063, -30885=>10064, -30880=>10065, -30892=>10066, -30882=>10067, -30884=>10068, -31128=>10069, -31114=>10070, -31115=>10071, -31126=>10072, -31125=>10073, -31124=>10074, -31123=>10075, -31127=>10076, -31112=>10077, -31122=>10078, -31120=>10079, -31275=>10080, -31306=>10081, -31280=>10082, -31279=>10083, -31272=>10084, -31270=>10085, -31400=>10086, -31403=>10087, -31404=>10088, -31470=>10089, -31624=>10090, -31644=>10091, -31626=>10092, -31633=>10093, -31632=>10094, -31638=>10095, -31629=>10096, -31628=>10097, -31643=>10098, -31630=>10099, -31621=>10100, -31640=>10101, -21124=>10102, -31641=>10103, -31652=>10104, -31618=>10105, -31931=>10106, -31935=>10107, -31932=>10108, -31930=>10109, -32167=>10110, -32183=>10111, -32194=>10112, -32163=>10113, -32170=>10114, -32193=>10115, -32192=>10116, -32197=>10117, -32157=>10118, -32206=>10119, -32196=>10120, -32198=>10121, -32203=>10122, -32204=>10123, -32175=>10124, -32185=>10125, -32150=>10126, -32188=>10127, -32159=>10128, -32166=>10129, -32174=>10130, -32169=>10131, -32161=>10132, -32201=>10133, -32627=>10134, -32738=>10135, -32739=>10136, -32741=>10137, -32734=>10138, -32804=>10139, -32861=>10140, -32860=>10141, -33161=>10142, -33158=>10143, -33155=>10144, -33159=>10145, -33165=>10146, -33164=>10147, -33163=>10148, -33301=>10149, -33943=>10150, -33956=>10151, -33953=>10152, -33951=>10153, -33978=>10154, -33998=>10155, -33986=>10156, -33964=>10157, -33966=>10158, -33963=>10159, -33977=>10160, -33972=>10161, -33985=>10162, -33997=>10163, -33962=>10164, -33946=>10165, -33969=>10166, -34000=>10167, -33949=>10168, -33959=>10169, -33979=>10170, -33954=>10171, -33940=>10172, -33991=>10173, -33996=>10174, -33947=>10175, -33961=>10176, -33967=>10177, -33960=>10178, -58327=>10178, -34006=>10179, -33944=>10180, -33974=>10181, -33999=>10182, -33952=>10183, -34007=>10184, -34004=>10185, -34002=>10186, -34011=>10187, -33968=>10188, -33937=>10189, -34401=>10190, -34611=>10191, -34595=>10192, -34600=>10193, -34667=>10194, -34624=>10195, -34606=>10196, -34590=>10197, -34593=>10198, -34585=>10199, -34587=>10200, -34627=>10201, -34604=>10202, -34625=>10203, -34622=>10204, -34630=>10205, -34592=>10206, -34610=>10207, -34602=>10208, -34605=>10209, -34620=>10210, -34578=>10211, -34618=>10212, -34609=>10213, -34613=>10214, -34626=>10215, -34598=>10216, -34599=>10217, -34616=>10218, -34596=>10219, -34586=>10220, -34608=>10221, -34577=>10222, -35063=>10223, -35047=>10224, -35057=>10225, -35058=>10226, -35066=>10227, -35070=>10228, -35054=>10229, -35068=>10230, -35062=>10231, -35067=>10232, -35056=>10233, -35052=>10234, -35051=>10235, -35229=>10236, -35233=>10237, -35231=>10238, -35230=>10239, -35305=>10240, -35307=>10241, -35304=>10242, -35499=>10243, -35481=>10244, -35467=>10245, -35474=>10246, -35471=>10247, -35478=>10248, -35901=>10249, -35944=>10250, -35945=>10251, -36053=>10252, -36047=>10253, -36055=>10254, -36246=>10255, -36361=>10256, -36354=>10257, -36351=>10258, -36365=>10259, -36349=>10260, -36362=>10261, -36355=>10262, -36359=>10263, -36358=>10264, -36357=>10265, -36350=>10266, -36352=>10267, -36356=>10268, -36624=>10269, -36625=>10270, -36622=>10271, -36621=>10272, -37155=>10273, -37148=>10274, -37152=>10275, -37154=>10276, -37151=>10277, -37149=>10278, -37146=>10279, -37156=>10280, -37153=>10281, -37147=>10282, -37242=>10283, -37234=>10284, -37241=>10285, -37235=>10286, -37541=>10287, -37540=>10288, -37494=>10289, -37531=>10290, -37498=>10291, -37536=>10292, -37524=>10293, -37546=>10294, -37517=>10295, -37542=>10296, -37530=>10297, -37547=>10298, -37497=>10299, -37527=>10300, -37503=>10301, -37539=>10302, -37614=>10303, -37518=>10304, -37506=>10305, -37525=>10306, -37538=>10307, -37501=>10308, -37512=>10309, -37537=>10310, -37514=>10311, -37510=>10312, -37516=>10313, -37529=>10314, -37543=>10315, -37502=>10316, -37511=>10317, -37545=>10318, -37533=>10319, -37515=>10320, -37421=>10321, -38558=>10322, -38561=>10323, -38655=>10324, -38744=>10325, -38781=>10326, -38778=>10327, -38782=>10328, -38787=>10329, -38784=>10330, -38786=>10331, -38779=>10332, -38788=>10333, -38785=>10334, -38783=>10335, -38862=>10336, -38861=>10337, -38934=>10338, -39085=>10339, -39086=>10340, -39170=>10341, -39168=>10342, -39175=>10343, -39325=>10344, -39324=>10345, -39363=>10346, -39353=>10347, -39355=>10348, -39354=>10349, -39362=>10350, -39357=>10351, -39367=>10352, -39601=>10353, -39651=>10354, -39655=>10355, -39742=>10356, -39743=>10357, -39776=>10358, -39777=>10359, -39775=>10360, -40177=>10361, -40178=>10362, -40181=>10363, -40615=>10364, -20735=>10365, -20739=>10366, -20784=>10367, -20728=>10368, -20742=>10369, -20743=>10370, -20726=>10371, -20734=>10372, -20747=>10373, -20748=>10374, -20733=>10375, -20746=>10376, -21131=>10377, -21132=>10378, -21233=>10379, -21231=>10380, -22088=>10381, -22082=>10382, -22092=>10383, -22069=>10384, -22081=>10385, -22090=>10386, -22089=>10387, -22086=>10388, -22104=>10389, -22106=>10390, -22080=>10391, -22067=>10392, -22077=>10393, -22060=>10394, -22078=>10395, -22072=>10396, -22058=>10397, -22074=>10398, -22298=>10399, -22699=>10400, -22685=>10401, -22705=>10402, -22688=>10403, -22691=>10404, -22703=>10405, -22700=>10406, -22693=>10407, -22689=>10408, -22783=>10409, -23295=>10410, -23284=>10411, -23293=>10412, -23287=>10413, -23286=>10414, -23299=>10415, -23288=>10416, -23298=>10417, -23289=>10418, -23297=>10419, -23303=>10420, -23301=>10421, -23311=>10422, -23655=>10423, -23961=>10424, -23959=>10425, -23967=>10426, -23954=>10427, -23970=>10428, -23955=>10429, -23957=>10430, -23968=>10431, -23964=>10432, -23969=>10433, -23962=>10434, -23966=>10435, -24169=>10436, -24157=>10437, -24160=>10438, -24156=>10439, -32243=>10440, -24283=>10441, -24286=>10442, -24289=>10443, -24393=>10444, -24498=>10445, -24971=>10446, -24963=>10447, -24953=>10448, -25009=>10449, -25008=>10450, -24994=>10451, -24969=>10452, -24987=>10453, -24979=>10454, -25007=>10455, -25005=>10456, -24991=>10457, -24978=>10458, -25002=>10459, -24993=>10460, -24973=>10461, -24934=>10462, -25011=>10463, -25133=>10464, -25710=>10465, -25712=>10466, -25750=>10467, -25760=>10468, -25733=>10469, -25751=>10470, -25756=>10471, -25743=>10472, -25739=>10473, -25738=>10474, -25740=>10475, -25763=>10476, -25759=>10477, -25704=>10478, -25777=>10479, -25752=>10480, -25974=>10481, -25978=>10482, -25977=>10483, -25979=>10484, -26034=>10485, -26035=>10486, -26293=>10487, -26288=>10488, -26281=>10489, -26290=>10490, -26295=>10491, -26282=>10492, -26287=>10493, -27136=>10494, -27142=>10495, -27159=>10496, -27109=>10497, -27128=>10498, -27157=>10499, -27121=>10500, -27108=>10501, -27168=>10502, -27135=>10503, -27116=>10504, -27106=>10505, -27163=>10506, -27165=>10507, -27134=>10508, -27175=>10509, -27122=>10510, -27118=>10511, -27156=>10512, -27127=>10513, -27111=>10514, -27200=>10515, -27144=>10516, -27110=>10517, -27131=>10518, -27149=>10519, -27132=>10520, -27115=>10521, -27145=>10522, -27140=>10523, -27160=>10524, -27173=>10525, -27151=>10526, -27126=>10527, -27174=>10528, -27143=>10529, -27124=>10530, -27158=>10531, -27473=>10532, -27557=>10533, -27555=>10534, -27554=>10535, -27558=>10536, -27649=>10537, -27648=>10538, -27647=>10539, -27650=>10540, -28481=>10541, -28454=>10542, -28542=>10543, -28551=>10544, -28614=>10545, -28562=>10546, -28557=>10547, -28553=>10548, -28556=>10549, -28514=>10550, -28495=>10551, -28549=>10552, -28506=>10553, -28566=>10554, -28534=>10555, -28524=>10556, -28546=>10557, -28501=>10558, -28530=>10559, -28498=>10560, -28496=>10561, -28503=>10562, -28564=>10563, -28563=>10564, -28509=>10565, -28416=>10566, -28513=>10567, -28523=>10568, -28541=>10569, -28519=>10570, -28560=>10571, -28499=>10572, -28555=>10573, -28521=>10574, -28543=>10575, -28565=>10576, -28515=>10577, -28535=>10578, -28522=>10579, -28539=>10580, -29106=>10581, -29103=>10582, -29083=>10583, -29104=>10584, -29088=>10585, -29082=>10586, -29097=>10587, -29109=>10588, -29085=>10589, -29093=>10590, -29086=>10591, -29092=>10592, -29089=>10593, -29098=>10594, -29084=>10595, -29095=>10596, -29107=>10597, -29336=>10598, -29338=>10599, -29528=>10600, -29522=>10601, -29534=>10602, -29535=>10603, -29536=>10604, -29533=>10605, -29531=>10606, -29537=>10607, -29530=>10608, -29529=>10609, -29538=>10610, -29831=>10611, -29833=>10612, -29834=>10613, -29830=>10614, -29825=>10615, -29821=>10616, -29829=>10617, -29832=>10618, -29820=>10619, -29817=>10620, -58868=>10620, -29960=>10621, -29959=>10622, -30078=>10623, -30245=>10624, -30238=>10625, -30233=>10626, -30237=>10627, -30236=>10628, -30243=>10629, -30234=>10630, -30248=>10631, -30235=>10632, -30364=>10633, -30365=>10634, -30366=>10635, -30363=>10636, -30605=>10637, -30607=>10638, -30601=>10639, -30600=>10640, -30925=>10641, -30907=>10642, -30927=>10643, -30924=>10644, -30929=>10645, -30926=>10646, -30932=>10647, -30920=>10648, -30915=>10649, -30916=>10650, -30921=>10651, -31130=>10652, -31137=>10653, -31136=>10654, -31132=>10655, -31138=>10656, -31131=>10657, -59175=>10657, -27510=>10658, -31289=>10659, -31410=>10660, -31412=>10661, -31411=>10662, -31671=>10663, -31691=>10664, -31678=>10665, -31660=>10666, -31694=>10667, -31663=>10668, -31673=>10669, -31690=>10670, -31669=>10671, -31941=>10672, -31944=>10673, -31948=>10674, -31947=>10675, -32247=>10676, -32219=>10677, -32234=>10678, -32231=>10679, -32215=>10680, -32225=>10681, -32259=>10682, -32250=>10683, -32230=>10684, -32246=>10685, -32241=>10686, -32240=>10687, -32238=>10688, -32223=>10689, -32630=>10690, -32684=>10691, -32688=>10692, -32685=>10693, -32749=>10694, -32747=>10695, -32746=>10696, -32748=>10697, -32742=>10698, -32744=>10699, -32868=>10700, -32871=>10701, -33187=>10702, -33183=>10703, -33182=>10704, -33173=>10705, -33186=>10706, -33177=>10707, -33175=>10708, -33302=>10709, -33359=>10710, -33363=>10711, -33362=>10712, -33360=>10713, -33358=>10714, -33361=>10715, -34084=>10716, -34107=>10717, -34063=>10718, -34048=>10719, -34089=>10720, -34062=>10721, -34057=>10722, -34061=>10723, -34079=>10724, -34058=>10725, -34087=>10726, -34076=>10727, -34043=>10728, -34091=>10729, -34042=>10730, -34056=>10731, -34060=>10732, -34036=>10733, -34090=>10734, -34034=>10735, -34069=>10736, -34039=>10737, -34027=>10738, -34035=>10739, -34044=>10740, -34066=>10741, -34026=>10742, -34025=>10743, -34070=>10744, -34046=>10745, -34088=>10746, -34077=>10747, -34094=>10748, -34050=>10749, -34045=>10750, -34078=>10751, -34038=>10752, -34097=>10753, -34086=>10754, -34023=>10755, -34024=>10756, -34032=>10757, -34031=>10758, -34041=>10759, -34072=>10760, -34080=>10761, -34096=>10762, -34059=>10763, -34073=>10764, -34095=>10765, -34402=>10766, -34646=>10767, -34659=>10768, -34660=>10769, -34679=>10770, -34785=>10771, -34675=>10772, -34648=>10773, -34644=>10774, -34651=>10775, -34642=>10776, -34657=>10777, -34650=>10778, -34641=>10779, -34654=>10780, -34669=>10781, -34666=>10782, -34640=>10783, -34638=>10784, -34655=>10785, -34653=>10786, -34671=>10787, -34668=>10788, -34682=>10789, -34670=>10790, -34652=>10791, -34661=>10792, -34639=>10793, -34683=>10794, -34677=>10795, -34658=>10796, -34663=>10797, -34665=>10798, -34906=>10799, -35077=>10800, -35084=>10801, -35092=>10802, -35083=>10803, -35095=>10804, -35096=>10805, -35097=>10806, -35078=>10807, -35094=>10808, -35089=>10809, -35086=>10810, -35081=>10811, -35234=>10812, -35236=>10813, -35235=>10814, -35309=>10815, -35312=>10816, -35308=>10817, -35535=>10818, -35526=>10819, -35512=>10820, -35539=>10821, -35537=>10822, -35540=>10823, -35541=>10824, -35515=>10825, -35543=>10826, -35518=>10827, -35520=>10828, -35525=>10829, -35544=>10830, -35523=>10831, -35514=>10832, -35517=>10833, -35545=>10834, -35902=>10835, -35917=>10836, -35983=>10837, -36069=>10838, -36063=>10839, -36057=>10840, -36072=>10841, -36058=>10842, -36061=>10843, -36071=>10844, -36256=>10845, -36252=>10846, -36257=>10847, -36251=>10848, -36384=>10849, -36387=>10850, -36389=>10851, -36388=>10852, -36398=>10853, -36373=>10854, -36379=>10855, -36374=>10856, -36369=>10857, -36377=>10858, -36390=>10859, -36391=>10860, -36372=>10861, -36370=>10862, -36376=>10863, -36371=>10864, -36380=>10865, -36375=>10866, -36378=>10867, -36652=>10868, -36644=>10869, -36632=>10870, -36634=>10871, -36640=>10872, -36643=>10873, -36630=>10874, -36631=>10875, -36979=>10876, -36976=>10877, -36975=>10878, -36967=>10879, -36971=>10880, -37167=>10881, -37163=>10882, -37161=>10883, -37162=>10884, -37170=>10885, -37158=>10886, -37166=>10887, -37253=>10888, -37254=>10889, -37258=>10890, -37249=>10891, -37250=>10892, -37252=>10893, -37248=>10894, -37584=>10895, -37571=>10896, -37572=>10897, -37568=>10898, -37593=>10899, -37558=>10900, -37583=>10901, -37617=>10902, -37599=>10903, -37592=>10904, -37609=>10905, -37591=>10906, -37597=>10907, -37580=>10908, -37615=>10909, -37570=>10910, -37608=>10911, -37578=>10912, -37576=>10913, -37582=>10914, -37606=>10915, -37581=>10916, -37589=>10917, -37577=>10918, -37600=>10919, -37598=>10920, -37607=>10921, -37585=>10922, -37587=>10923, -37557=>10924, -37601=>10925, -37669=>10926, -37574=>10927, -37556=>10928, -38268=>10929, -38316=>10930, -38315=>10931, -38318=>10932, -38320=>10933, -38564=>10934, -38562=>10935, -38611=>10936, -38661=>10937, -38664=>10938, -38658=>10939, -38746=>10940, -38794=>10941, -38798=>10942, -38792=>10943, -38864=>10944, -38863=>10945, -38942=>10946, -38941=>10947, -38950=>10948, -38953=>10949, -38952=>10950, -38944=>10951, -38939=>10952, -38951=>10953, -39090=>10954, -39176=>10955, -39162=>10956, -39185=>10957, -39188=>10958, -39190=>10959, -39191=>10960, -39189=>10961, -39388=>10962, -39373=>10963, -39375=>10964, -39379=>10965, -39380=>10966, -39374=>10967, -39369=>10968, -39382=>10969, -60270=>10969, -39384=>10970, -39371=>10971, -39383=>10972, -39372=>10973, -39603=>10974, -39660=>10975, -39659=>10976, -39667=>10977, -39666=>10978, -39665=>10979, -39750=>10980, -39747=>10981, -39783=>10982, -39796=>10983, -39793=>10984, -39782=>10985, -39798=>10986, -39797=>10987, -39792=>10988, -39784=>10989, -39780=>10990, -39788=>10991, -40188=>10992, -40186=>10993, -40189=>10994, -40191=>10995, -40183=>10996, -40199=>10997, -40192=>10998, -40185=>10999, -40187=>11000, -40200=>11001, -40197=>11002, -40196=>11003, -40579=>11004, -40659=>11005, -40719=>11006, -40720=>11007, -20764=>11008, -20755=>11009, -20759=>11010, -20762=>11011, -20753=>11012, -20958=>11013, -21300=>11014, -21473=>11015, -22128=>11016, -22112=>11017, -22126=>11018, -22131=>11019, -22118=>11020, -22115=>11021, -22125=>11022, -22130=>11023, -22110=>11024, -22135=>11025, -22300=>11026, -22299=>11027, -22728=>11028, -22717=>11029, -22729=>11030, -22719=>11031, -22714=>11032, -22722=>11033, -22716=>11034, -22726=>11035, -23319=>11036, -23321=>11037, -23323=>11038, -23329=>11039, -23316=>11040, -23315=>11041, -23312=>11042, -23318=>11043, -23336=>11044, -59539=>11044, -23322=>11045, -23328=>11046, -23326=>11047, -23535=>11048, -23980=>11049, -23985=>11050, -23977=>11051, -23975=>11052, -23989=>11053, -23984=>11054, -23982=>11055, -23978=>11056, -23976=>11057, -23986=>11058, -23981=>11059, -23983=>11060, -23988=>11061, -24167=>11062, -24168=>11063, -24166=>11064, -24175=>11065, -24297=>11066, -24295=>11067, -24294=>11068, -24296=>11069, -24293=>11070, -24395=>11071, -24508=>11072, -24507=>11073, -24989=>11074, -25000=>11075, -24982=>11076, -25029=>11077, -25012=>11078, -25030=>11079, -25025=>11080, -25036=>11081, -25018=>11082, -25023=>11083, -25016=>11084, -24972=>11085, -25815=>11086, -25814=>11087, -25808=>11088, -25807=>11089, -25801=>11090, -25789=>11091, -25737=>11092, -25795=>11093, -25819=>11094, -25843=>11095, -25817=>11096, -25907=>11097, -25983=>11098, -25980=>11099, -26018=>11100, -26312=>11101, -26302=>11102, -26304=>11103, -26314=>11104, -26315=>11105, -26319=>11106, -26301=>11107, -26299=>11108, -26298=>11109, -26316=>11110, -26403=>11111, -27188=>11112, -27238=>11113, -27209=>11114, -27239=>11115, -27186=>11116, -27240=>11117, -27198=>11118, -27229=>11119, -27245=>11120, -27254=>11121, -27227=>11122, -27217=>11123, -27176=>11124, -27226=>11125, -27195=>11126, -27199=>11127, -27201=>11128, -27242=>11129, -27236=>11130, -27216=>11131, -27215=>11132, -27220=>11133, -27247=>11134, -27241=>11135, -27232=>11136, -27196=>11137, -27230=>11138, -27222=>11139, -27221=>11140, -27213=>11141, -27214=>11142, -27206=>11143, -27477=>11144, -27476=>11145, -27478=>11146, -27559=>11147, -27562=>11148, -27563=>11149, -27592=>11150, -27591=>11151, -27652=>11152, -27651=>11153, -27654=>11154, -28589=>11155, -28619=>11156, -28579=>11157, -28615=>11158, -28604=>11159, -28622=>11160, -28616=>11161, -28510=>11162, -28612=>11163, -28605=>11164, -28574=>11165, -28618=>11166, -28584=>11167, -28676=>11168, -28581=>11169, -28590=>11170, -28602=>11171, -28588=>11172, -28586=>11173, -28623=>11174, -28607=>11175, -28600=>11176, -28578=>11177, -28617=>11178, -28587=>11179, -28621=>11180, -28591=>11181, -28594=>11182, -28592=>11183, -29125=>11184, -29122=>11185, -29119=>11186, -29112=>11187, -29142=>11188, -29120=>11189, -29121=>11190, -29131=>11191, -29140=>11192, -29130=>11193, -29127=>11194, -29135=>11195, -29117=>11196, -29144=>11197, -29116=>11198, -29126=>11199, -29146=>11200, -29147=>11201, -29341=>11202, -29342=>11203, -29545=>11204, -29542=>11205, -29543=>11206, -29548=>11207, -29541=>11208, -29547=>11209, -29546=>11210, -29823=>11211, -29850=>11212, -29856=>11213, -29844=>11214, -29842=>11215, -29845=>11216, -29857=>11217, -29963=>11218, -30080=>11219, -30255=>11220, -30253=>11221, -30257=>11222, -30269=>11223, -30259=>11224, -30268=>11225, -30261=>11226, -30258=>11227, -30256=>11228, -30395=>11229, -30438=>11230, -30618=>11231, -30621=>11232, -30625=>11233, -30620=>11234, -30619=>11235, -30626=>11236, -30627=>11237, -30613=>11238, -30617=>11239, -30615=>11240, -30941=>11241, -30953=>11242, -30949=>11243, -30954=>11244, -30942=>11245, -30947=>11246, -30939=>11247, -30945=>11248, -30946=>11249, -30957=>11250, -30943=>11251, -30944=>11252, -31140=>11253, -31300=>11254, -31304=>11255, -31303=>11256, -31414=>11257, -31416=>11258, -31413=>11259, -31409=>11260, -31415=>11261, -31710=>11262, -31715=>11263, -31719=>11264, -31709=>11265, -31701=>11266, -31717=>11267, -31706=>11268, -31720=>11269, -31737=>11270, -31700=>11271, -31722=>11272, -31714=>11273, -31708=>11274, -31723=>11275, -31704=>11276, -31711=>11277, -31954=>11278, -31956=>11279, -31959=>11280, -31952=>11281, -31953=>11282, -32274=>11283, -32289=>11284, -32279=>11285, -32268=>11286, -32287=>11287, -32288=>11288, -32275=>11289, -32270=>11290, -32284=>11291, -32277=>11292, -32282=>11293, -32290=>11294, -32267=>11295, -32271=>11296, -32278=>11297, -32269=>11298, -32276=>11299, -32293=>11300, -32292=>11301, -32579=>11302, -32635=>11303, -32636=>11304, -32634=>11305, -32689=>11306, -32751=>11307, -32810=>11308, -32809=>11309, -32876=>11310, -33201=>11311, -33190=>11312, -33198=>11313, -33209=>11314, -33205=>11315, -33195=>11316, -33200=>11317, -33196=>11318, -33204=>11319, -33202=>11320, -33207=>11321, -33191=>11322, -33266=>11323, -33365=>11324, -33366=>11325, -33367=>11326, -34134=>11327, -34117=>11328, -34155=>11329, -34125=>11330, -34131=>11331, -34145=>11332, -34136=>11333, -34112=>11334, -34118=>11335, -34148=>11336, -34113=>11337, -34146=>11338, -34116=>11339, -34129=>11340, -34119=>11341, -34147=>11342, -34110=>11343, -34139=>11344, -34161=>11345, -34126=>11346, -34158=>11347, -34165=>11348, -34133=>11349, -34151=>11350, -34144=>11351, -34188=>11352, -34150=>11353, -34141=>11354, -34132=>11355, -34149=>11356, -34156=>11357, -34403=>11358, -34405=>11359, -34404=>11360, -34724=>11361, -34715=>11362, -34703=>11363, -34711=>11364, -34707=>11365, -34706=>11366, -34696=>11367, -34689=>11368, -34710=>11369, -34712=>11370, -34681=>11371, -34695=>11372, -34723=>11373, -34693=>11374, -34704=>11375, -34705=>11376, -34717=>11377, -34692=>11378, -34708=>11379, -34716=>11380, -34714=>11381, -34697=>11382, -35102=>11383, -35110=>11384, -35120=>11385, -35117=>11386, -35118=>11387, -35111=>11388, -35121=>11389, -35106=>11390, -35113=>11391, -35107=>11392, -35119=>11393, -35116=>11394, -35103=>11395, -35313=>11396, -35552=>11397, -35554=>11398, -35570=>11399, -35572=>11400, -35573=>11401, -35549=>11402, -35604=>11403, -35556=>11404, -35551=>11405, -35568=>11406, -35528=>11407, -35550=>11408, -35553=>11409, -35560=>11410, -35583=>11411, -35567=>11412, -35579=>11413, -35985=>11414, -35986=>11415, -35984=>11416, -36085=>11417, -36078=>11418, -36081=>11419, -36080=>11420, -36083=>11421, -36204=>11422, -36206=>11423, -36261=>11424, -36263=>11425, -36403=>11426, -36414=>11427, -36408=>11428, -36416=>11429, -36421=>11430, -36406=>11431, -36412=>11432, -36413=>11433, -36417=>11434, -36400=>11435, -36415=>11436, -36541=>11437, -36662=>11438, -60329=>11438, -36654=>11439, -36661=>11440, -36658=>11441, -36665=>11442, -36663=>11443, -36660=>11444, -36982=>11445, -36985=>11446, -36987=>11447, -36998=>11448, -37114=>11449, -37171=>11450, -37173=>11451, -37174=>11452, -37267=>11453, -37264=>11454, -37265=>11455, -37261=>11456, -37263=>11457, -37671=>11458, -37662=>11459, -37640=>11460, -37663=>11461, -37638=>11462, -37647=>11463, -37754=>11464, -37688=>11465, -37692=>11466, -37659=>11467, -37667=>11468, -37650=>11469, -37633=>11470, -37702=>11471, -37677=>11472, -37646=>11473, -37645=>11474, -37579=>11475, -37661=>11476, -37626=>11477, -37651=>11478, -37625=>11479, -37623=>11480, -37684=>11481, -37634=>11482, -37668=>11483, -37631=>11484, -37673=>11485, -37689=>11486, -37685=>11487, -37674=>11488, -37652=>11489, -37644=>11490, -37643=>11491, -37630=>11492, -37641=>11493, -37632=>11494, -37627=>11495, -37654=>11496, -38332=>11497, -38349=>11498, -38334=>11499, -38329=>11500, -38330=>11501, -38326=>11502, -38335=>11503, -38325=>11504, -38333=>11505, -38569=>11506, -38612=>11507, -38667=>11508, -38674=>11509, -38672=>11510, -38809=>11511, -38807=>11512, -38804=>11513, -38896=>11514, -38904=>11515, -38965=>11516, -38959=>11517, -38962=>11518, -39204=>11519, -39199=>11520, -39207=>11521, -39209=>11522, -39326=>11523, -39406=>11524, -39404=>11525, -39397=>11526, -39396=>11527, -39408=>11528, -39395=>11529, -39402=>11530, -39401=>11531, -39399=>11532, -39609=>11533, -39615=>11534, -39604=>11535, -39611=>11536, -39670=>11537, -39674=>11538, -39673=>11539, -39671=>11540, -39731=>11541, -39808=>11542, -39813=>11543, -39815=>11544, -39804=>11545, -39806=>11546, -39803=>11547, -39810=>11548, -39827=>11549, -39826=>11550, -39824=>11551, -39802=>11552, -39829=>11553, -39805=>11554, -39816=>11555, -40229=>11556, -40215=>11557, -40224=>11558, -40222=>11559, -40212=>11560, -40233=>11561, -40221=>11562, -40216=>11563, -40226=>11564, -40208=>11565, -40217=>11566, -40223=>11567, -40584=>11568, -40582=>11569, -40583=>11570, -40622=>11571, -40621=>11572, -40661=>11573, -40662=>11574, -40698=>11575, -40722=>11576, -40765=>11577, -20774=>11578, -20773=>11579, -20770=>11580, -20772=>11581, -20768=>11582, -20777=>11583, -21236=>11584, -22163=>11585, -22156=>11586, -22157=>11587, -22150=>11588, -22148=>11589, -22147=>11590, -22142=>11591, -22146=>11592, -22143=>11593, -22145=>11594, -22742=>11595, -22740=>11596, -22735=>11597, -22738=>11598, -23341=>11599, -23333=>11600, -23346=>11601, -23331=>11602, -23340=>11603, -23335=>11604, -23334=>11605, -23343=>11606, -23342=>11607, -23419=>11608, -23537=>11609, -23538=>11610, -23991=>11611, -24172=>11612, -24170=>11613, -24510=>11614, -25027=>11615, -25013=>11616, -25020=>11617, -25063=>11618, -25056=>11619, -25061=>11620, -25060=>11621, -25064=>11622, -25054=>11623, -25839=>11624, -25833=>11625, -25827=>11626, -25835=>11627, -25828=>11628, -25832=>11629, -25985=>11630, -25984=>11631, -26038=>11632, -26074=>11633, -26322=>11634, -27277=>11635, -27286=>11636, -27265=>11637, -27301=>11638, -27273=>11639, -27295=>11640, -27291=>11641, -27297=>11642, -27294=>11643, -27271=>11644, -27283=>11645, -27278=>11646, -27285=>11647, -27267=>11648, -27304=>11649, -27300=>11650, -27281=>11651, -27263=>11652, -27302=>11653, -27290=>11654, -27269=>11655, -27276=>11656, -27282=>11657, -27483=>11658, -27565=>11659, -27657=>11660, -28620=>11661, -28585=>11662, -28660=>11663, -28628=>11664, -28643=>11665, -28636=>11666, -28653=>11667, -28647=>11668, -28646=>11669, -28638=>11670, -28658=>11671, -28637=>11672, -28642=>11673, -28648=>11674, -29153=>11675, -29169=>11676, -29160=>11677, -29170=>11678, -29156=>11679, -29168=>11680, -29154=>11681, -29555=>11682, -29550=>11683, -29551=>11684, -29847=>11685, -29874=>11686, -29867=>11687, -29840=>11688, -29866=>11689, -29869=>11690, -29873=>11691, -29861=>11692, -29871=>11693, -29968=>11694, -29969=>11695, -29970=>11696, -29967=>11697, -30084=>11698, -30275=>11699, -30280=>11700, -30281=>11701, -30279=>11702, -30372=>11703, -30441=>11704, -30645=>11705, -30635=>11706, -30642=>11707, -30647=>11708, -30646=>11709, -30644=>11710, -30641=>11711, -30632=>11712, -30704=>11713, -30963=>11714, -30973=>11715, -30978=>11716, -30971=>11717, -30972=>11718, -30975=>11719, -30962=>11720, -30981=>11721, -30969=>11722, -30974=>11723, -30980=>11724, -31147=>11725, -31144=>11726, -31324=>11727, -31323=>11728, -31318=>11729, -31320=>11730, -31316=>11731, -31322=>11732, -31422=>11733, -31424=>11734, -31425=>11735, -31749=>11736, -31759=>11737, -31730=>11738, -31744=>11739, -31743=>11740, -31739=>11741, -31758=>11742, -31732=>11743, -31755=>11744, -31731=>11745, -31746=>11746, -31753=>11747, -31747=>11748, -31745=>11749, -31736=>11750, -31741=>11751, -31750=>11752, -58176=>11752, -31728=>11753, -31729=>11754, -31760=>11755, -31754=>11756, -31976=>11757, -32301=>11758, -32316=>11759, -32322=>11760, -32307=>11761, -38984=>11762, -32312=>11763, -32298=>11764, -32329=>11765, -32320=>11766, -32327=>11767, -32297=>11768, -32332=>11769, -32304=>11770, -32315=>11771, -32310=>11772, -32324=>11773, -32314=>11774, -32581=>11775, -32639=>11776, -32638=>11777, -32637=>11778, -32756=>11779, -32754=>11780, -32812=>11781, -33211=>11782, -33220=>11783, -33228=>11784, -33226=>11785, -33221=>11786, -33223=>11787, -33212=>11788, -33257=>11789, -33371=>11790, -33370=>11791, -33372=>11792, -34179=>11793, -34176=>11794, -34191=>11795, -34215=>11796, -34197=>11797, -34208=>11798, -34187=>11799, -34211=>11800, -34171=>11801, -34212=>11802, -34202=>11803, -34206=>11804, -34167=>11805, -34172=>11806, -34185=>11807, -34209=>11808, -34170=>11809, -34168=>11810, -34135=>11811, -34190=>11812, -34198=>11813, -34182=>11814, -34189=>11815, -34201=>11816, -34205=>11817, -34177=>11818, -34210=>11819, -34178=>11820, -34184=>11821, -34181=>11822, -34169=>11823, -34166=>11824, -34200=>11825, -34192=>11826, -34207=>11827, -34408=>11828, -34750=>11829, -34730=>11830, -34733=>11831, -34757=>11832, -34736=>11833, -34732=>11834, -34745=>11835, -34741=>11836, -34748=>11837, -34734=>11838, -34761=>11839, -34755=>11840, -34754=>11841, -34764=>11842, -34743=>11843, -34735=>11844, -34756=>11845, -34762=>11846, -34740=>11847, -34742=>11848, -34751=>11849, -34744=>11850, -34749=>11851, -34782=>11852, -34738=>11853, -35125=>11854, -35123=>11855, -35132=>11856, -35134=>11857, -35137=>11858, -35154=>11859, -35127=>11860, -35138=>11861, -35245=>11862, -35247=>11863, -35246=>11864, -35314=>11865, -35315=>11866, -35614=>11867, -35608=>11868, -35606=>11869, -35601=>11870, -35589=>11871, -35595=>11872, -35618=>11873, -35599=>11874, -35602=>11875, -35605=>11876, -35591=>11877, -35597=>11878, -35592=>11879, -35590=>11880, -35612=>11881, -35603=>11882, -35610=>11883, -35919=>11884, -35952=>11885, -35954=>11886, -35953=>11887, -35951=>11888, -35989=>11889, -35988=>11890, -36089=>11891, -36207=>11892, -36430=>11893, -36429=>11894, -36435=>11895, -36432=>11896, -36428=>11897, -36423=>11898, -36675=>11899, -36672=>11900, -36997=>11901, -36990=>11902, -37176=>11903, -37274=>11904, -37282=>11905, -37275=>11906, -37273=>11907, -37279=>11908, -37281=>11909, -37277=>11910, -37280=>11911, -37793=>11912, -37763=>11913, -37807=>11914, -37732=>11915, -37718=>11916, -37703=>11917, -37756=>11918, -37720=>11919, -37724=>11920, -37750=>11921, -37705=>11922, -37712=>11923, -37713=>11924, -37728=>11925, -37741=>11926, -37775=>11927, -37708=>11928, -37738=>11929, -37753=>11930, -37719=>11931, -37717=>11932, -37714=>11933, -37711=>11934, -37745=>11935, -37751=>11936, -37755=>11937, -37729=>11938, -37726=>11939, -37731=>11940, -37735=>11941, -37710=>11942, -37721=>11943, -38343=>11944, -38336=>11945, -38345=>11946, -38339=>11947, -38341=>11948, -38327=>11949, -38574=>11950, -38576=>11951, -38572=>11952, -38688=>11953, -38687=>11954, -38680=>11955, -38685=>11956, -38681=>11957, -38810=>11958, -38817=>11959, -38812=>11960, -38814=>11961, -38813=>11962, -38869=>11963, -38868=>11964, -38897=>11965, -38977=>11966, -38980=>11967, -38986=>11968, -38985=>11969, -38981=>11970, -38979=>11971, -39205=>11972, -39211=>11973, -39212=>11974, -39210=>11975, -39219=>11976, -39218=>11977, -39215=>11978, -39213=>11979, -39217=>11980, -39216=>11981, -39320=>11982, -39331=>11983, -39329=>11984, -39426=>11985, -39418=>11986, -39412=>11987, -39415=>11988, -39417=>11989, -39416=>11990, -39414=>11991, -39419=>11992, -39421=>11993, -39422=>11994, -39420=>11995, -39427=>11996, -39614=>11997, -39678=>11998, -39677=>11999, -39681=>12000, -39676=>12001, -39752=>12002, -39834=>12003, -39848=>12004, -39838=>12005, -39835=>12006, -39846=>12007, -39841=>12008, -39845=>12009, -39844=>12010, -39814=>12011, -39842=>12012, -39840=>12013, -39855=>12014, -40243=>12015, -40257=>12016, -40295=>12017, -40246=>12018, -40238=>12019, -40239=>12020, -40241=>12021, -40248=>12022, -40240=>12023, -40261=>12024, -40258=>12025, -40259=>12026, -40254=>12027, -40247=>12028, -40256=>12029, -40253=>12030, -32757=>12031, -40237=>12032, -40586=>12033, -40585=>12034, -40589=>12035, -40624=>12036, -40648=>12037, -40666=>12038, -40699=>12039, -40703=>12040, -40740=>12041, -40739=>12042, -40738=>12043, -40788=>12044, -12245=>12045, -40864=>12045, -20785=>12046, -20781=>12047, -20782=>12048, -22168=>12049, -22172=>12050, -22167=>12051, -22170=>12052, -22173=>12053, -22169=>12054, -22896=>12055, -23356=>12056, -23657=>12057, -23658=>12058, -24000=>12059, -24173=>12060, -24174=>12061, -25048=>12062, -25055=>12063, -25069=>12064, -25070=>12065, -25073=>12066, -25066=>12067, -25072=>12068, -25067=>12069, -25046=>12070, -25065=>12071, -25855=>12072, -25860=>12073, -25853=>12074, -25848=>12075, -25857=>12076, -25859=>12077, -25852=>12078, -26004=>12079, -26075=>12080, -26330=>12081, -26331=>12082, -26328=>12083, -27333=>12084, -27321=>12085, -27325=>12086, -27361=>12087, -27334=>12088, -27322=>12089, -27318=>12090, -27319=>12091, -27335=>12092, -27316=>12093, -27309=>12094, -27486=>12095, -27593=>12096, -27659=>12097, -28679=>12098, -28684=>12099, -28685=>12100, -28673=>12101, -28677=>12102, -28692=>12103, -28686=>12104, -28671=>12105, -28672=>12106, -28667=>12107, -28710=>12108, -28668=>12109, -28663=>12110, -28682=>12111, -29185=>12112, -60224=>12112, -29183=>12113, -29177=>12114, -29187=>12115, -29181=>12116, -29558=>12117, -29880=>12118, -29888=>12119, -29877=>12120, -29889=>12121, -29886=>12122, -29878=>12123, -29883=>12124, -29890=>12125, -29972=>12126, -29971=>12127, -30300=>12128, -30308=>12129, -30297=>12130, -30288=>12131, -30291=>12132, -30295=>12133, -30298=>12134, -30374=>12135, -30397=>12136, -30444=>12137, -30658=>12138, -30650=>12139, -30988=>12140, -30995=>12141, -30996=>12142, -30985=>12143, -30992=>12144, -30994=>12145, -30993=>12146, -31149=>12147, -31148=>12148, -31327=>12149, -31772=>12150, -31785=>12151, -31769=>12152, -31776=>12153, -31775=>12154, -31789=>12155, -31773=>12156, -31782=>12157, -31784=>12158, -31778=>12159, -31781=>12160, -31792=>12161, -32348=>12162, -32336=>12163, -32342=>12164, -32355=>12165, -32344=>12166, -32354=>12167, -32351=>12168, -32337=>12169, -32352=>12170, -32343=>12171, -32339=>12172, -32693=>12173, -32691=>12174, -32759=>12175, -32760=>12176, -32885=>12177, -33233=>12178, -33234=>12179, -33232=>12180, -33375=>12181, -33374=>12182, -34228=>12183, -34246=>12184, -34240=>12185, -34243=>12186, -34242=>12187, -34227=>12188, -34229=>12189, -34237=>12190, -34247=>12191, -34244=>12192, -34239=>12193, -34251=>12194, -34254=>12195, -34248=>12196, -34245=>12197, -34225=>12198, -34230=>12199, -34258=>12200, -34340=>12201, -34232=>12202, -34231=>12203, -34238=>12204, -34409=>12205, -34791=>12206, -34790=>12207, -34786=>12208, -34779=>12209, -34795=>12210, -34794=>12211, -34789=>12212, -34783=>12213, -34803=>12214, -34788=>12215, -34772=>12216, -34780=>12217, -34771=>12218, -34797=>12219, -34776=>12220, -34787=>12221, -34775=>12222, -34777=>12223, -34817=>12224, -34804=>12225, -34792=>12226, -34781=>12227, -35155=>12228, -35147=>12229, -35151=>12230, -35148=>12231, -35142=>12232, -35152=>12233, -35153=>12234, -35145=>12235, -35626=>12236, -35623=>12237, -35619=>12238, -35635=>12239, -35632=>12240, -35637=>12241, -35655=>12242, -35631=>12243, -35644=>12244, -35646=>12245, -35633=>12246, -35621=>12247, -35639=>12248, -35622=>12249, -35638=>12250, -35630=>12251, -35620=>12252, -35643=>12253, -35645=>12254, -35642=>12255, -35906=>12256, -35957=>12257, -35993=>12258, -35992=>12259, -35991=>12260, -36094=>12261, -36100=>12262, -36098=>12263, -36096=>12264, -36444=>12265, -36450=>12266, -36448=>12267, -36439=>12268, -36438=>12269, -36446=>12270, -36453=>12271, -36455=>12272, -36443=>12273, -36442=>12274, -36449=>12275, -36445=>12276, -36457=>12277, -36436=>12278, -36678=>12279, -36679=>12280, -36680=>12281, -36683=>12282, -37160=>12283, -37178=>12284, -37179=>12285, -37182=>12286, -37288=>12287, -37285=>12288, -37287=>12289, -37295=>12290, -37290=>12291, -37813=>12292, -37772=>12293, -37778=>12294, -37815=>12295, -37787=>12296, -37789=>12297, -37769=>12298, -37799=>12299, -37774=>12300, -37802=>12301, -37790=>12302, -37798=>12303, -37781=>12304, -37768=>12305, -37785=>12306, -37791=>12307, -37760=>12308, -37773=>12309, -37809=>12310, -37777=>12311, -37810=>12312, -37796=>12313, -37800=>12314, -37812=>12315, -37795=>12316, -38354=>12317, -38355=>12318, -38353=>12319, -38579=>12320, -38615=>12321, -38618=>12322, -24002=>12323, -38623=>12324, -38616=>12325, -38621=>12326, -38691=>12327, -38690=>12328, -38693=>12329, -38828=>12330, -38830=>12331, -38824=>12332, -38827=>12333, -38820=>12334, -38826=>12335, -38818=>12336, -38821=>12337, -38871=>12338, -38873=>12339, -38870=>12340, -38872=>12341, -38906=>12342, -38992=>12343, -38993=>12344, -38994=>12345, -39096=>12346, -39233=>12347, -39228=>12348, -39226=>12349, -39439=>12350, -39435=>12351, -39433=>12352, -39437=>12353, -39428=>12354, -39441=>12355, -39434=>12356, -39429=>12357, -39431=>12358, -39430=>12359, -39616=>12360, -39644=>12361, -39688=>12362, -39684=>12363, -39685=>12364, -39721=>12365, -39733=>12366, -39754=>12367, -39756=>12368, -39755=>12369, -39879=>12370, -39878=>12371, -39875=>12372, -39871=>12373, -39873=>12374, -39861=>12375, -39864=>12376, -39891=>12377, -39862=>12378, -39876=>12379, -39865=>12380, -39869=>12381, -40284=>12382, -40275=>12383, -40271=>12384, -40266=>12385, -40283=>12386, -40267=>12387, -40281=>12388, -40278=>12389, -40268=>12390, -40279=>12391, -40274=>12392, -40276=>12393, -40287=>12394, -40280=>12395, -40282=>12396, -40590=>12397, -40588=>12398, -40671=>12399, -40705=>12400, -40704=>12401, -40726=>12402, -58693=>12402, -40741=>12403, -40747=>12404, -40746=>12405, -40745=>12406, -40744=>12407, -40780=>12408, -40789=>12409, -20788=>12410, -20789=>12411, -21142=>12412, -21239=>12413, -21428=>12414, -22187=>12415, -22189=>12416, -22182=>12417, -22183=>12418, -22186=>12419, -22188=>12420, -22746=>12421, -22749=>12422, -22747=>12423, -22802=>12424, -23357=>12425, -23358=>12426, -23359=>12427, -24003=>12428, -24176=>12429, -24511=>12430, -25083=>12431, -25863=>12432, -25872=>12433, -25869=>12434, -25865=>12435, -25868=>12436, -25870=>12437, -25988=>12438, -26078=>12439, -26077=>12440, -26334=>12441, -27367=>12442, -27360=>12443, -27340=>12444, -27345=>12445, -27353=>12446, -27339=>12447, -27359=>12448, -27356=>12449, -27344=>12450, -27371=>12451, -27343=>12452, -27341=>12453, -27358=>12454, -27488=>12455, -27568=>12456, -27660=>12457, -28697=>12458, -28711=>12459, -28704=>12460, -28694=>12461, -28715=>12462, -28705=>12463, -28706=>12464, -28707=>12465, -28713=>12466, -28695=>12467, -28708=>12468, -28700=>12469, -29196=>12470, -29194=>12471, -29191=>12472, -29186=>12473, -29189=>12474, -29349=>12475, -29350=>12476, -29348=>12477, -29347=>12478, -29345=>12479, -29899=>12480, -29893=>12481, -29879=>12482, -29891=>12483, -29974=>12484, -30304=>12485, -30665=>12486, -30666=>12487, -30660=>12488, -30705=>12489, -31005=>12490, -31003=>12491, -31009=>12492, -31004=>12493, -30999=>12494, -31006=>12495, -31152=>12496, -31335=>12497, -31336=>12498, -31795=>12499, -31804=>12500, -31801=>12501, -31788=>12502, -31803=>12503, -31980=>12504, -31978=>12505, -32374=>12506, -32373=>12507, -32376=>12508, -32368=>12509, -32375=>12510, -32367=>12511, -32378=>12512, -32370=>12513, -32372=>12514, -32360=>12515, -32587=>12516, -32586=>12517, -32643=>12518, -32646=>12519, -32695=>12520, -32765=>12521, -32766=>12522, -32888=>12523, -33239=>12524, -33237=>12525, -33291=>12526, -33380=>12527, -33377=>12528, -33379=>12529, -34283=>12530, -34289=>12531, -34285=>12532, -34265=>12533, -34273=>12534, -34280=>12535, -34266=>12536, -34263=>12537, -34284=>12538, -34290=>12539, -34296=>12540, -34264=>12541, -34271=>12542, -34275=>12543, -34268=>12544, -34257=>12545, -34288=>12546, -34278=>12547, -34287=>12548, -34270=>12549, -34274=>12550, -34816=>12551, -34810=>12552, -34819=>12553, -34806=>12554, -34807=>12555, -34825=>12556, -34828=>12557, -34827=>12558, -34822=>12559, -34812=>12560, -34824=>12561, -34815=>12562, -34826=>12563, -34818=>12564, -35170=>12565, -35162=>12566, -35163=>12567, -35159=>12568, -35169=>12569, -35164=>12570, -35160=>12571, -35165=>12572, -35161=>12573, -35208=>12574, -35255=>12575, -35254=>12576, -35318=>12577, -35664=>12578, -35656=>12579, -35658=>12580, -35648=>12581, -35667=>12582, -35670=>12583, -35668=>12584, -35659=>12585, -35669=>12586, -35665=>12587, -35650=>12588, -35666=>12589, -35671=>12590, -35907=>12591, -35959=>12592, -35958=>12593, -35994=>12594, -36102=>12595, -36103=>12596, -36105=>12597, -36268=>12598, -36266=>12599, -36269=>12600, -36267=>12601, -36461=>12602, -36472=>12603, -36467=>12604, -36458=>12605, -36463=>12606, -36475=>12607, -36546=>12608, -36690=>12609, -36689=>12610, -36687=>12611, -36688=>12612, -36691=>12613, -36788=>12614, -37184=>12615, -37183=>12616, -37296=>12617, -37293=>12618, -37854=>12619, -37831=>12620, -37839=>12621, -37826=>12622, -37850=>12623, -37840=>12624, -37881=>12625, -37868=>12626, -37836=>12627, -37849=>12628, -37801=>12629, -37862=>12630, -37834=>12631, -37844=>12632, -37870=>12633, -37859=>12634, -37845=>12635, -37828=>12636, -37838=>12637, -37824=>12638, -37842=>12639, -37797=>12640, -37863=>12641, -38269=>12642, -38362=>12643, -38363=>12644, -38625=>12645, -38697=>12646, -38699=>12647, -38700=>12648, -38696=>12649, -38694=>12650, -38835=>12651, -38839=>12652, -38838=>12653, -38877=>12654, -38878=>12655, -38879=>12656, -39004=>12657, -39001=>12658, -39005=>12659, -38999=>12660, -39103=>12661, -39101=>12662, -39099=>12663, -39102=>12664, -39240=>12665, -39239=>12666, -39235=>12667, -39334=>12668, -39335=>12669, -39450=>12670, -39445=>12671, -39461=>12672, -39453=>12673, -39460=>12674, -39451=>12675, -39458=>12676, -39456=>12677, -39463=>12678, -39459=>12679, -39454=>12680, -39452=>12681, -39444=>12682, -39618=>12683, -39691=>12684, -39690=>12685, -39694=>12686, -39692=>12687, -39735=>12688, -39914=>12689, -39915=>12690, -39904=>12691, -39902=>12692, -39908=>12693, -39910=>12694, -39906=>12695, -39920=>12696, -39892=>12697, -39895=>12698, -39916=>12699, -39900=>12700, -39897=>12701, -39909=>12702, -39893=>12703, -39905=>12704, -39898=>12705, -40311=>12706, -40321=>12707, -40330=>12708, -40324=>12709, -40328=>12710, -40305=>12711, -40320=>12712, -40312=>12713, -40326=>12714, -40331=>12715, -40332=>12716, -40317=>12717, -40299=>12718, -40308=>12719, -40309=>12720, -40304=>12721, -40297=>12722, -40325=>12723, -40307=>12724, -40315=>12725, -40322=>12726, -40303=>12727, -40313=>12728, -40319=>12729, -40327=>12730, -40296=>12731, -40596=>12732, -40593=>12733, -40640=>12734, -40700=>12735, -40749=>12736, -40768=>12737, -40769=>12738, -40781=>12739, -40790=>12740, -40791=>12741, -40792=>12742, -21303=>12743, -22194=>12744, -22197=>12745, -22195=>12746, -22755=>12747, -23365=>12748, -24006=>12749, -24007=>12750, -24302=>12751, -24303=>12752, -24512=>12753, -24513=>12754, -25081=>12755, -25879=>12756, -25878=>12757, -25877=>12758, -25875=>12759, -26079=>12760, -26344=>12761, -26339=>12762, -26340=>12763, -27379=>12764, -27376=>12765, -27370=>12766, -27368=>12767, -27385=>12768, -27377=>12769, -27374=>12770, -27375=>12771, -28732=>12772, -28725=>12773, -28719=>12774, -28727=>12775, -28724=>12776, -28721=>12777, -28738=>12778, -28728=>12779, -28735=>12780, -28730=>12781, -28729=>12782, -28714=>12783, -28736=>12784, -28731=>12785, -28723=>12786, -28737=>12787, -29203=>12788, -29204=>12789, -29352=>12790, -29565=>12791, -29564=>12792, -29882=>12793, -30379=>12794, -30378=>12795, -30398=>12796, -30445=>12797, -30668=>12798, -30670=>12799, -30671=>12800, -30669=>12801, -30706=>12802, -31013=>12803, -31011=>12804, -31015=>12805, -31016=>12806, -31012=>12807, -31017=>12808, -31154=>12809, -31342=>12810, -31340=>12811, -31341=>12812, -31479=>12813, -31817=>12814, -31816=>12815, -31818=>12816, -31815=>12817, -31813=>12818, -31982=>12819, -32379=>12820, -32382=>12821, -32385=>12822, -32384=>12823, -32698=>12824, -32767=>12825, -32889=>12826, -33243=>12827, -33241=>12828, -33384=>12829, -33385=>12830, -34338=>12831, -34303=>12832, -34305=>12833, -34302=>12834, -34331=>12835, -34304=>12836, -34294=>12837, -34308=>12838, -34313=>12839, -34309=>12840, -34316=>12841, -34301=>12842, -34841=>12843, -34832=>12844, -34833=>12845, -34839=>12846, -34835=>12847, -34838=>12848, -35171=>12849, -35174=>12850, -35257=>12851, -35319=>12852, -35680=>12853, -35690=>12854, -35677=>12855, -35688=>12856, -35683=>12857, -35685=>12858, -35687=>12859, -35693=>12860, -36270=>12861, -36486=>12862, -36488=>12863, -36484=>12864, -36697=>12865, -36694=>12866, -36695=>12867, -36693=>12868, -36696=>12869, -36698=>12870, -37005=>12871, -37187=>12872, -37185=>12873, -37303=>12874, -37301=>12875, -37298=>12876, -37299=>12877, -37899=>12878, -37907=>12879, -37883=>12880, -37920=>12881, -37903=>12882, -37908=>12883, -37886=>12884, -37909=>12885, -37904=>12886, -37928=>12887, -37913=>12888, -37901=>12889, -37877=>12890, -37888=>12891, -37879=>12892, -37895=>12893, -37902=>12894, -37910=>12895, -37906=>12896, -37882=>12897, -37897=>12898, -37880=>12899, -37948=>12900, -37898=>12901, -37887=>12902, -37884=>12903, -37900=>12904, -37878=>12905, -37905=>12906, -37894=>12907, -38366=>12908, -38368=>12909, -38367=>12910, -38702=>12911, -38703=>12912, -38841=>12913, -38843=>12914, -38909=>12915, -38910=>12916, -39008=>12917, -39010=>12918, -39011=>12919, -39007=>12920, -39105=>12921, -39106=>12922, -39248=>12923, -39246=>12924, -39257=>12925, -39244=>12926, -39243=>12927, -39251=>12928, -39474=>12929, -39476=>12930, -39473=>12931, -39468=>12932, -39466=>12933, -39478=>12934, -39465=>12935, -39470=>12936, -39480=>12937, -39469=>12938, -39623=>12939, -39626=>12940, -39622=>12941, -39696=>12942, -39698=>12943, -39697=>12944, -39947=>12945, -39944=>12946, -39927=>12947, -39941=>12948, -39954=>12949, -39928=>12950, -40000=>12951, -39943=>12952, -39950=>12953, -39942=>12954, -39959=>12955, -39956=>12956, -39945=>12957, -40351=>12958, -40345=>12959, -40356=>12960, -40349=>12961, -40338=>12962, -40344=>12963, -40336=>12964, -40347=>12965, -40352=>12966, -40340=>12967, -40348=>12968, -40362=>12969, -40343=>12970, -40353=>12971, -40346=>12972, -40354=>12973, -40360=>12974, -40350=>12975, -40355=>12976, -40383=>12977, -40361=>12978, -40342=>12979, -40358=>12980, -40359=>12981, -40601=>12982, -40603=>12983, -40602=>12984, -40677=>12985, -40676=>12986, -40679=>12987, -40678=>12988, -40752=>12989, -40750=>12990, -40795=>12991, -40800=>12992, -40798=>12993, -40797=>12994, -40793=>12995, -40849=>12996, -20794=>12997, -20793=>12998, -21144=>12999, -21143=>13000, -22211=>13001, -22205=>13002, -22206=>13003, -23368=>13004, -23367=>13005, -24011=>13006, -24015=>13007, -24305=>13008, -25085=>13009, -25883=>13010, -27394=>13011, -27388=>13012, -27395=>13013, -27384=>13014, -27392=>13015, -28739=>13016, -28740=>13017, -28746=>13018, -28744=>13019, -28745=>13020, -28741=>13021, -28742=>13022, -29213=>13023, -29210=>13024, -29209=>13025, -29566=>13026, -29975=>13027, -30314=>13028, -30672=>13029, -31021=>13030, -31025=>13031, -31023=>13032, -31828=>13033, -31827=>13034, -31986=>13035, -32394=>13036, -60229=>13037, -32391=>13037, -32392=>13038, -32395=>13039, -32390=>13040, -32397=>13041, -32589=>13042, -32699=>13043, -32816=>13044, -33245=>13045, -34328=>13046, -34346=>13047, -34342=>13048, -34335=>13049, -34339=>13050, -34332=>13051, -34329=>13052, -34343=>13053, -34350=>13054, -34337=>13055, -34336=>13056, -34345=>13057, -34334=>13058, -34341=>13059, -34857=>13060, -34845=>13061, -34843=>13062, -34848=>13063, -34852=>13064, -34844=>13065, -34859=>13066, -34890=>13067, -35181=>13068, -35177=>13069, -35182=>13070, -35179=>13071, -35322=>13072, -35705=>13073, -35704=>13074, -35653=>13075, -35706=>13076, -35707=>13077, -36112=>13078, -36116=>13079, -36271=>13080, -36494=>13081, -36492=>13082, -36702=>13083, -36699=>13084, -36701=>13085, -37190=>13086, -37188=>13087, -37189=>13088, -37305=>13089, -37951=>13090, -37947=>13091, -37942=>13092, -37929=>13093, -37949=>13094, -37936=>13095, -37945=>13096, -37930=>13097, -37943=>13098, -37932=>13099, -37952=>13100, -37937=>13101, -38373=>13102, -38372=>13103, -38371=>13104, -38709=>13105, -38714=>13106, -38847=>13107, -38881=>13108, -39012=>13109, -39113=>13110, -39110=>13111, -39104=>13112, -39256=>13113, -39254=>13114, -39481=>13115, -39485=>13116, -39494=>13117, -39492=>13118, -39490=>13119, -39489=>13120, -39482=>13121, -39487=>13122, -39629=>13123, -39701=>13124, -39703=>13125, -39704=>13126, -39702=>13127, -39738=>13128, -39762=>13129, -39979=>13130, -39965=>13131, -39964=>13132, -39980=>13133, -39971=>13134, -39976=>13135, -39977=>13136, -39972=>13137, -39969=>13138, -40375=>13139, -40374=>13140, -40380=>13141, -40385=>13142, -40391=>13143, -40394=>13144, -40399=>13145, -40382=>13146, -40389=>13147, -40387=>13148, -40379=>13149, -40373=>13150, -40398=>13151, -40377=>13152, -40378=>13153, -40364=>13154, -40392=>13155, -40369=>13156, -40365=>13157, -40396=>13158, -40371=>13159, -40397=>13160, -40370=>13161, -40570=>13162, -40604=>13163, -40683=>13164, -40686=>13165, -40685=>13166, -40731=>13167, -40728=>13168, -40730=>13169, -40753=>13170, -40782=>13171, -40805=>13172, -40804=>13173, -40850=>13174, -20153=>13175, -22214=>13176, -22213=>13177, -22219=>13178, -22897=>13179, -23371=>13180, -23372=>13181, -24021=>13182, -24017=>13183, -24306=>13184, -25889=>13185, -25888=>13186, -25894=>13187, -25890=>13188, -27403=>13189, -27400=>13190, -27401=>13191, -27661=>13192, -28757=>13193, -28758=>13194, -28759=>13195, -28754=>13196, -29214=>13197, -29215=>13198, -29353=>13199, -29567=>13200, -29912=>13201, -29909=>13202, -29913=>13203, -29911=>13204, -30317=>13205, -30381=>13206, -31029=>13207, -31156=>13208, -31344=>13209, -31345=>13210, -31831=>13211, -31836=>13212, -31833=>13213, -31835=>13214, -31834=>13215, -31988=>13216, -31985=>13217, -32401=>13218, -32591=>13219, -32647=>13220, -33246=>13221, -33387=>13222, -34356=>13223, -34357=>13224, -34355=>13225, -34348=>13226, -34354=>13227, -34358=>13228, -34860=>13229, -34856=>13230, -34854=>13231, -34858=>13232, -34853=>13233, -35185=>13234, -35263=>13235, -35262=>13236, -35323=>13237, -35710=>13238, -35716=>13239, -35714=>13240, -35718=>13241, -35717=>13242, -35711=>13243, -36117=>13244, -36501=>13245, -36500=>13246, -36506=>13247, -36498=>13248, -36496=>13249, -36502=>13250, -36503=>13251, -36704=>13252, -36706=>13253, -37191=>13254, -37964=>13255, -37968=>13256, -37962=>13257, -37963=>13258, -37967=>13259, -37959=>13260, -37957=>13261, -37960=>13262, -37961=>13263, -37958=>13264, -38719=>13265, -38883=>13266, -39018=>13267, -39017=>13268, -39115=>13269, -39252=>13270, -39259=>13271, -39502=>13272, -39507=>13273, -39508=>13274, -39500=>13275, -39503=>13276, -39496=>13277, -39498=>13278, -39497=>13279, -39506=>13280, -39504=>13281, -39632=>13282, -39705=>13283, -39723=>13284, -39739=>13285, -39766=>13286, -39765=>13287, -40006=>13288, -40008=>13289, -39999=>13290, -40004=>13291, -39993=>13292, -39987=>13293, -40001=>13294, -39996=>13295, -39991=>13296, -39988=>13297, -39986=>13298, -39997=>13299, -39990=>13300, -40411=>13301, -40402=>13302, -40414=>13303, -40410=>13304, -40395=>13305, -40400=>13306, -40412=>13307, -40401=>13308, -40415=>13309, -40425=>13310, -40409=>13311, -40408=>13312, -40406=>13313, -40437=>13314, -40405=>13315, -40413=>13316, -40630=>13317, -40688=>13318, -40757=>13319, -40755=>13320, -40754=>13321, -40770=>13322, -40811=>13323, -40853=>13324, -40866=>13325, -20797=>13326, -21145=>13327, -22760=>13328, -22759=>13329, -22898=>13330, -23373=>13331, -24024=>13332, -34863=>13333, -24399=>13334, -25089=>13335, -25091=>13336, -25092=>13337, -25897=>13338, -25893=>13339, -26006=>13340, -26347=>13341, -27409=>13342, -27410=>13343, -27407=>13344, -27594=>13345, -28763=>13346, -28762=>13347, -29218=>13348, -29570=>13349, -29569=>13350, -29571=>13351, -30320=>13352, -30676=>13353, -31847=>13354, -31846=>13355, -32405=>13356, -33388=>13357, -34362=>13358, -34368=>13359, -34361=>13360, -34364=>13361, -34353=>13362, -34363=>13363, -34366=>13364, -34864=>13365, -34866=>13366, -34862=>13367, -34867=>13368, -35190=>13369, -35188=>13370, -35187=>13371, -35326=>13372, -35724=>13373, -35726=>13374, -35723=>13375, -35720=>13376, -35909=>13377, -36121=>13378, -36504=>13379, -36708=>13380, -36707=>13381, -37308=>13382, -37986=>13383, -37973=>13384, -37981=>13385, -37975=>13386, -37982=>13387, -38852=>13388, -38853=>13389, -38912=>13390, -39510=>13391, -39513=>13392, -39710=>13393, -39711=>13394, -39712=>13395, -40018=>13396, -40024=>13397, -40016=>13398, -40010=>13399, -40013=>13400, -40011=>13401, -40021=>13402, -40025=>13403, -40012=>13404, -40014=>13405, -40443=>13406, -40439=>13407, -40431=>13408, -40419=>13409, -40427=>13410, -40440=>13411, -40420=>13412, -40438=>13413, -40417=>13414, -40430=>13415, -40422=>13416, -40434=>13417, -40432=>13418, -60370=>13418, -40418=>13419, -40428=>13420, -40436=>13421, -40435=>13422, -40424=>13423, -40429=>13424, -40642=>13425, -40656=>13426, -40690=>13427, -40691=>13428, -40710=>13429, -40732=>13430, -40760=>13431, -40759=>13432, -40758=>13433, -40771=>13434, -40783=>13435, -40817=>13436, -40816=>13437, -40814=>13438, -40815=>13439, -22227=>13440, -22221=>13441, -23374=>13442, -23661=>13443, -25901=>13444, -26349=>13445, -26350=>13446, -27411=>13447, -28767=>13448, -28769=>13449, -28765=>13450, -28768=>13451, -29219=>13452, -29915=>13453, -29925=>13454, -30677=>13455, -31032=>13456, -31159=>13457, -31158=>13458, -31850=>13459, -32407=>13460, -32649=>13461, -33389=>13462, -34371=>13463, -34872=>13464, -34871=>13465, -34869=>13466, -34891=>13467, -35732=>13468, -35733=>13469, -36510=>13470, -36511=>13471, -36512=>13472, -36509=>13473, -37310=>13474, -37309=>13475, -37314=>13476, -37995=>13477, -37992=>13478, -37993=>13479, -38629=>13480, -38726=>13481, -38723=>13482, -38727=>13483, -38855=>13484, -38885=>13485, -39518=>13486, -39637=>13487, -39769=>13488, -40035=>13489, -40039=>13490, -40038=>13491, -40034=>13492, -40030=>13493, -40032=>13494, -40450=>13495, -40446=>13496, -40455=>13497, -40451=>13498, -40454=>13499, -40453=>13500, -40448=>13501, -40449=>13502, -40457=>13503, -40447=>13504, -40445=>13505, -40452=>13506, -40608=>13507, -40734=>13508, -40774=>13509, -40820=>13510, -40821=>13511, -40822=>13512, -22228=>13513, -25902=>13514, -26040=>13515, -27416=>13516, -27417=>13517, -27415=>13518, -27418=>13519, -28770=>13520, -29222=>13521, -29354=>13522, -30680=>13523, -30681=>13524, -31033=>13525, -31849=>13526, -31851=>13527, -31990=>13528, -32410=>13529, -32408=>13530, -32411=>13531, -32409=>13532, -33248=>13533, -33249=>13534, -34374=>13535, -34375=>13536, -34376=>13537, -35193=>13538, -35194=>13539, -35196=>13540, -35195=>13541, -35327=>13542, -35736=>13543, -35737=>13544, -36517=>13545, -36516=>13546, -36515=>13547, -37998=>13548, -37997=>13549, -37999=>13550, -38001=>13551, -38003=>13552, -38729=>13553, -39026=>13554, -39263=>13555, -40040=>13556, -40046=>13557, -40045=>13558, -40459=>13559, -40461=>13560, -40464=>13561, -40463=>13562, -40466=>13563, -40465=>13564, -40609=>13565, -40693=>13566, -40713=>13567, -40775=>13568, -40824=>13569, -40827=>13570, -40826=>13571, -40825=>13572, -22302=>13573, -28774=>13574, -31855=>13575, -34876=>13576, -36274=>13577, -36518=>13578, -37315=>13579, -38004=>13580, -38008=>13581, -38006=>13582, -38005=>13583, -39520=>13584, -39726=>13585, -60830=>13585, -40052=>13586, -40051=>13587, -40049=>13588, -40053=>13589, -40468=>13590, -40467=>13591, -40694=>13592, -40714=>13593, -40868=>13594, -28776=>13595, -28773=>13596, -31991=>13597, -34410=>13598, -34878=>13599, -34877=>13600, -34879=>13601, -35742=>13602, -35996=>13603, -36521=>13604, -36553=>13605, -38731=>13606, -39027=>13607, -39028=>13608, -39116=>13609, -39265=>13610, -39339=>13611, -39524=>13612, -39526=>13613, -39527=>13614, -39716=>13615, -40469=>13616, -40471=>13617, -40776=>13618, -25095=>13619, -27422=>13620, -29223=>13621, -34380=>13622, -36520=>13623, -38018=>13624, -38016=>13625, -38017=>13626, -39529=>13627, -39528=>13628, -40473=>13629, -34379=>13630, -35743=>13631, -38019=>13632, -40057=>13633, -40631=>13634, -30325=>13635, -39531=>13636, -40058=>13637, -40477=>13638, -28777=>13639, -28778=>13640, -29225=>13641, -40612=>13642, -40830=>13643, -40777=>13644, -40856=>13645, -65049=>13646, -65075=>13743, -9588=>13744, -65076=>13745, -65103=>13746, -168=>13747, -776=>13747, -63208=>13747, -710=>13748, -65342=>13748, -63209=>13748, -12541=>13749, -63210=>13749, -12542=>13750, -63211=>13750, -12445=>13751, -63212=>13751, -12446=>13752, -63213=>13752, -12293=>13754, -63216=>13754, -12294=>13755, -63217=>13755, -12295=>13756, -63218=>13756, -12540=>13757, -63219=>13757, -65339=>13758, -63220=>13758, -65341=>13759, -63221=>13759, -10045=>13760, -63222=>13760, -12353=>13761, -63223=>13761, -12354=>13762, -63224=>13762, -12355=>13763, -63225=>13763, -12356=>13764, -63226=>13764, -12357=>13765, -63227=>13765, -12358=>13766, -63228=>13766, -12359=>13767, -63229=>13767, -12360=>13768, -63230=>13768, -12361=>13769, -63231=>13769, -12362=>13770, -63232=>13770, -12363=>13771, -63233=>13771, -12364=>13772, -63234=>13772, -12365=>13773, -63235=>13773, -12366=>13774, -63236=>13774, -12367=>13775, -63237=>13775, -12368=>13776, -63238=>13776, -12369=>13777, -63239=>13777, -12370=>13778, -63240=>13778, -12371=>13779, -63241=>13779, -12372=>13780, -63242=>13780, -12373=>13781, -63243=>13781, -12374=>13782, -63244=>13782, -12375=>13783, -63245=>13783, -12376=>13784, -63246=>13784, -12377=>13785, -63247=>13785, -12378=>13786, -63248=>13786, -12379=>13787, -63249=>13787, -12380=>13788, -63250=>13788, -12381=>13789, -63251=>13789, -12382=>13790, -63252=>13790, -12383=>13791, -63253=>13791, -12384=>13792, -63254=>13792, -12385=>13793, -63255=>13793, -12386=>13794, -63256=>13794, -12387=>13795, -63257=>13795, -12388=>13796, -63258=>13796, -12389=>13797, -63259=>13797, -12390=>13798, -63260=>13798, -12391=>13799, -63261=>13799, -12392=>13800, -63262=>13800, -12393=>13801, -63263=>13801, -12394=>13802, -63264=>13802, -12395=>13803, -63265=>13803, -12396=>13804, -63266=>13804, -12397=>13805, -63267=>13805, -12398=>13806, -63268=>13806, -12399=>13807, -63269=>13807, -12400=>13808, -63270=>13808, -12401=>13809, -63271=>13809, -12402=>13810, -63272=>13810, -12403=>13811, -63273=>13811, -12404=>13812, -63274=>13812, -12405=>13813, -63275=>13813, -12406=>13814, -63276=>13814, -12407=>13815, -63277=>13815, -12408=>13816, -63278=>13816, -12409=>13817, -63279=>13817, -12410=>13818, -63280=>13818, -12411=>13819, -63281=>13819, -12412=>13820, -63282=>13820, -12413=>13821, -63283=>13821, -12414=>13822, -63284=>13822, -12415=>13823, -63285=>13823, -12416=>13824, -63286=>13824, -12417=>13825, -63287=>13825, -12418=>13826, -63288=>13826, -12419=>13827, -63289=>13827, -12420=>13828, -63290=>13828, -12421=>13829, -63291=>13829, -12422=>13830, -63292=>13830, -12423=>13831, -63293=>13831, -12424=>13832, -63294=>13832, -12425=>13833, -63295=>13833, -12426=>13834, -63296=>13834, -12427=>13835, -63297=>13835, -12428=>13836, -63298=>13836, -12429=>13837, -63299=>13837, -12430=>13838, -63300=>13838, -12431=>13839, -63301=>13839, -12432=>13840, -63302=>13840, -12433=>13841, -63303=>13841, -12434=>13842, -63304=>13842, -12435=>13843, -63305=>13843, -12449=>13844, -63306=>13844, -12450=>13845, -63307=>13845, -12451=>13846, -63308=>13846, -12452=>13847, -63309=>13847, -12453=>13848, -63310=>13848, -12454=>13849, -63311=>13849, -12455=>13850, -63312=>13850, -12456=>13851, -63313=>13851, -12457=>13852, -63314=>13852, -12458=>13853, -63315=>13853, -12459=>13854, -63316=>13854, -12460=>13855, -63317=>13855, -12461=>13856, -63318=>13856, -12462=>13857, -63319=>13857, -12463=>13858, -63320=>13858, -12464=>13859, -63321=>13859, -12465=>13860, -63322=>13860, -12466=>13861, -63323=>13861, -12467=>13862, -63324=>13862, -12468=>13863, -63325=>13863, -12469=>13864, -63326=>13864, -12470=>13865, -63327=>13865, -12471=>13866, -63328=>13866, -12472=>13867, -63329=>13867, -12473=>13868, -63330=>13868, -12474=>13869, -63331=>13869, -12475=>13870, -63332=>13870, -12476=>13871, -63333=>13871, -12477=>13872, -63334=>13872, -12478=>13873, -63335=>13873, -12479=>13874, -63336=>13874, -12480=>13875, -63337=>13875, -12481=>13876, -63338=>13876, -12482=>13877, -63339=>13877, -12483=>13878, -63340=>13878, -12484=>13879, -63341=>13879, -12485=>13880, -63342=>13880, -12486=>13881, -63343=>13881, -12487=>13882, -63344=>13882, -12488=>13883, -63345=>13883, -12489=>13884, -63346=>13884, -12490=>13885, -63347=>13885, -12491=>13886, -63348=>13886, -12492=>13887, -63349=>13887, -12493=>13888, -63350=>13888, -12494=>13889, -63351=>13889, -12495=>13890, -63352=>13890, -12496=>13891, -63353=>13891, -12497=>13892, -63354=>13892, -12498=>13893, -63355=>13893, -12499=>13894, -63356=>13894, -12500=>13895, -63357=>13895, -12501=>13896, -63358=>13896, -12502=>13897, -63359=>13897, -12503=>13898, -63360=>13898, -12504=>13899, -63361=>13899, -12505=>13900, -63362=>13900, -12506=>13901, -63363=>13901, -12507=>13902, -63364=>13902, -12508=>13903, -63365=>13903, -12509=>13904, -63366=>13904, -12510=>13905, -63367=>13905, -12511=>13906, -63368=>13906, -12512=>13907, -63369=>13907, -12513=>13908, -63370=>13908, -12514=>13909, -63371=>13909, -12515=>13910, -63372=>13910, -12516=>13911, -63373=>13911, -12517=>13912, -63374=>13912, -12518=>13913, -63375=>13913, -12519=>13914, -63376=>13914, -12520=>13915, -63377=>13915, -12521=>13916, -63378=>13916, -12522=>13917, -63379=>13917, -12523=>13918, -63380=>13918, -12524=>13919, -63381=>13919, -12525=>13920, -63382=>13920, -12526=>13921, -63383=>13921, -12527=>13922, -63384=>13922, -12528=>13923, -63385=>13923, -12529=>13924, -63386=>13924, -12530=>13925, -63387=>13925, -12531=>13926, -63388=>13926, -12532=>13927, -63389=>13927, -12533=>13928, -63390=>13928, -12534=>13929, -63391=>13929, -1040=>13930, -63392=>13930, -1041=>13931, -63393=>13931, -1042=>13932, -63394=>13932, -1043=>13933, -63395=>13933, -1044=>13934, -63396=>13934, -1045=>13935, -63397=>13935, -1025=>13936, -63398=>13936, -1046=>13937, -63399=>13937, -1047=>13938, -63400=>13938, -1048=>13939, -63401=>13939, -1049=>13940, -63402=>13940, -1050=>13941, -63403=>13941, -1051=>13942, -63404=>13942, -1052=>13943, -63405=>13943, -1053=>13944, -63406=>13944, -1054=>13945, -63407=>13945, -1055=>13946, -63408=>13946, -1056=>13947, -63409=>13947, -1057=>13948, -63410=>13948, -1058=>13949, -63411=>13949, -1059=>13950, -63412=>13950, -1060=>13951, -63413=>13951, -1061=>13952, -63414=>13952, -1062=>13953, -63415=>13953, -1063=>13954, -63416=>13954, -1064=>13955, -63417=>13955, -1065=>13956, -63418=>13956, -1066=>13957, -63419=>13957, -1067=>13958, -63420=>13958, -1068=>13959, -63421=>13959, -1069=>13960, -63422=>13960, -1070=>13961, -63423=>13961, -1071=>13962, -63424=>13962, -1072=>13963, -63425=>13963, -1073=>13964, -63426=>13964, -1074=>13965, -63427=>13965, -1075=>13966, -63428=>13966, -1076=>13967, -63429=>13967, -1077=>13968, -63430=>13968, -1105=>13969, -63431=>13969, -1078=>13970, -63432=>13970, -1079=>13971, -63433=>13971, -1080=>13972, -63434=>13972, -1081=>13973, -63435=>13973, -1082=>13974, -63436=>13974, -1083=>13975, -63437=>13975, -1084=>13976, -63438=>13976, -1085=>13977, -63439=>13977, -1086=>13978, -63440=>13978, -1087=>13979, -63441=>13979, -1088=>13980, -63442=>13980, -1089=>13981, -63443=>13981, -1090=>13982, -63444=>13982, -1091=>13983, -63445=>13983, -1092=>13984, -63446=>13984, -1093=>13985, -63447=>13985, -1094=>13986, -63448=>13986, -1095=>13987, -63449=>13987, -1096=>13988, -63450=>13988, -1097=>13989, -63451=>13989, -1098=>13990, -63452=>13990, -1099=>13991, -63453=>13991, -1100=>13992, -63454=>13992, -1101=>13993, -63455=>13993, -1102=>13994, -63456=>13994, -1103=>13995, -63457=>13995, -8679=>13996, -63458=>13996, -8632=>13997, -63459=>13997, -8633=>13998, -63460=>13998, -12751=>13999, -20033=>13999, -63461=>13999, -131276=>14000, -63462=>14000, -20058=>14001, -63463=>14001, -131210=>14002, -63464=>14002, -20994=>14003, -63465=>14003, -17553=>14004, -63466=>14004, -40880=>14005, -63467=>14005, -20872=>14006, -63468=>14006, -13853=>14007, -40881=>14007, -63469=>14007, -161287=>14008, -63470=>14008, -172=>14049, -65506=>14049, -63511=>14049, -65508=>14050, -63512=>14050, -65287=>14051, -63513=>14051, -65282=>14052, -63514=>14052, -12849=>14053, -63515=>14053, -8470=>14054, -63516=>14054, -8481=>14055, -63517=>14055, -30849=>14056, -37561=>14057, -58501=>14057, -35023=>14058, -22715=>14059, -24658=>14060, -31911=>14061, -23290=>14062, -9556=>14063, -9574=>14064, -9559=>14065, -9568=>14066, -9580=>14067, -9571=>14068, -9562=>14069, -9577=>14070, -9565=>14071, -9554=>14072, -9572=>14073, -9557=>14074, -9560=>14078, -9575=>14079, -9563=>14080, -9555=>14081, -9573=>14082, -9558=>14083, -9567=>14084, -9579=>14085, -9570=>14086, -9561=>14087, -9576=>14088, -9564=>14089, -9553=>14090, -9619=>14096, -65517=>14096, -65040=>14099, -65041=>14100, -65042=>14101, -65044=>14103, -65043=>14104, -65046=>14105, -65045=>14106, -147159=>14123, -58129=>14123, -22462=>14124, -58130=>14124, -159443=>14125, -58131=>14125, -28990=>14126, -58132=>14126, -153568=>14127, -58133=>14127, -27042=>14128, -58135=>14128, -166889=>14129, -58136=>14129, -23412=>14130, -58137=>14130, -31305=>14131, -58138=>14131, -153825=>14132, -58139=>14132, -169177=>14133, -58140=>14133, -31333=>14134, -58141=>14134, -31357=>14135, -58142=>14135, -154028=>14136, -58143=>14136, -31419=>14137, -58144=>14137, -31408=>14138, -58145=>14138, -31426=>14139, -58146=>14139, -31427=>14140, -58147=>14140, -29137=>14141, -58148=>14141, -156813=>14142, -58149=>14142, -16842=>14143, -58150=>14143, -31450=>14144, -58151=>14144, -31453=>14145, -58152=>14145, -31466=>14146, -58153=>14146, -16879=>14147, -58154=>14147, -21682=>14148, -58155=>14148, -154625=>14149, -58156=>14149, -31499=>14150, -58157=>14150, -31573=>14151, -58158=>14151, -31529=>14152, -58159=>14152, -152334=>14153, -58160=>14153, -154878=>14154, -58161=>14154, -31650=>14155, -58162=>14155, -31599=>14156, -58163=>14156, -33692=>14157, -58164=>14157, -154548=>14158, -58165=>14158, -158847=>14159, -58166=>14159, -31696=>14160, -58167=>14160, -33825=>14161, -58168=>14161, -31634=>14162, -58169=>14162, -58171=>14164, -154912=>14164, -33938=>14166, -58174=>14166, -31738=>14167, -58175=>14167, -31797=>14169, -58177=>14169, -154817=>14170, -58178=>14170, -31812=>14171, -58179=>14171, -31875=>14172, -58180=>14172, -149634=>14173, -58181=>14173, -31910=>14174, -58182=>14174, -148856=>14175, -58184=>14175, -31945=>14176, -58185=>14176, -31943=>14177, -58186=>14177, -31974=>14178, -58187=>14178, -31987=>14180, -58189=>14180, -31989=>14181, -58190=>14181, -32359=>14182, -58192=>14182, -17693=>14183, -58193=>14183, -159300=>14184, -58194=>14184, -32093=>14185, -58195=>14185, -159446=>14186, -58196=>14186, -32137=>14187, -58198=>14187, -32171=>14188, -58199=>14188, -28981=>14189, -58200=>14189, -32179=>14190, -58201=>14190, -32214=>14191, -147543=>14192, -58203=>14192, -155689=>14193, -58204=>14193, -32228=>14194, -58205=>14194, -15635=>14195, -58206=>14195, -32245=>14196, -58207=>14196, -137209=>14197, -58208=>14197, -32229=>14198, -58209=>14198, -164717=>14199, -58210=>14199, -155937=>14201, -58212=>14201, -155994=>14202, -58213=>14202, -32366=>14203, -58214=>14203, -17195=>14205, -58216=>14205, -37996=>14206, -58217=>14206, -32295=>14207, -58218=>14207, -32576=>14208, -58219=>14208, -32577=>14209, -58220=>14209, -32583=>14210, -58221=>14210, -31030=>14211, -58222=>14211, -156368=>14212, -58223=>14212, -39393=>14213, -58224=>14213, -32663=>14214, -58225=>14214, -156497=>14215, -58226=>14215, -32675=>14216, -58227=>14216, -136801=>14217, -58228=>14217, -131176=>14218, -58229=>14218, -17756=>14219, -58230=>14219, -145254=>14220, -58231=>14220, -164666=>14221, -58233=>14221, -32762=>14222, -58234=>14222, -156809=>14223, -58235=>14223, -64091=>14224, -32776=>14225, -58237=>14225, -32797=>14226, -58238=>14226, -32815=>14228, -58240=>14228, -172167=>14229, -58241=>14229, -158915=>14230, -58242=>14230, -32827=>14231, -58243=>14231, -32828=>14232, -58244=>14232, -32865=>14233, -58245=>14233, -141076=>14234, -58246=>14234, -18825=>14235, -58247=>14235, -157222=>14236, -58248=>14236, -146915=>14237, -58249=>14237, -157416=>14238, -58250=>14238, -26405=>14239, -58251=>14239, -32935=>14240, -58252=>14240, -166472=>14241, -58253=>14241, -33031=>14242, -58254=>14242, -33050=>14243, -58255=>14243, -22704=>14244, -58256=>14244, -141046=>14245, -58257=>14245, -27775=>14246, -58258=>14246, -156824=>14247, -58259=>14247, -25831=>14248, -58261=>14248, -136330=>14249, -58262=>14249, -33304=>14250, -58263=>14250, -137310=>14251, -58264=>14251, -27219=>14252, -58265=>14252, -150117=>14253, -58266=>14253, -150165=>14254, -58267=>14254, -17530=>14255, -58268=>14255, -33321=>14256, -58269=>14256, -158290=>14257, -58271=>14257, -146814=>14258, -58272=>14258, -20473=>14259, -58273=>14259, -136445=>14260, -58274=>14260, -34018=>14261, -58275=>14261, -33634=>14262, -58276=>14262, -194959=>14263, -149927=>14264, -58278=>14264, -144688=>14265, -58279=>14265, -137075=>14266, -58280=>14266, -146936=>14267, -58281=>14267, -33450=>14268, -58282=>14268, -26907=>14269, -58283=>14269, -194964=>14270, -58284=>14270, -16859=>14271, -58285=>14271, -34123=>14272, -58286=>14272, -33488=>14273, -58287=>14273, -33562=>14274, -58288=>14274, -134678=>14275, -58289=>14275, -137140=>14276, -58290=>14276, -14017=>14277, -58291=>14277, -143741=>14278, -58292=>14278, -144730=>14279, -58293=>14279, -33403=>14280, -58294=>14280, -33506=>14281, -58295=>14281, -33560=>14282, -58296=>14282, -147083=>14283, -58297=>14283, -159139=>14284, -58298=>14284, -158469=>14285, -58299=>14285, -158615=>14286, -58300=>14286, -144846=>14287, -58301=>14287, -15807=>14288, -58302=>14288, -33565=>14289, -58303=>14289, -21996=>14290, -58304=>14290, -33669=>14291, -58305=>14291, -17675=>14292, -58306=>14292, -159141=>14293, -58307=>14293, -33708=>14294, -58308=>14294, -33747=>14296, -58310=>14296, -159444=>14297, -58312=>14297, -27223=>14298, -58313=>14298, -34138=>14299, -58314=>14299, -13462=>14300, -58315=>14300, -159298=>14301, -58316=>14301, -33880=>14302, -58318=>14302, -154596=>14303, -58319=>14303, -33905=>14304, -58320=>14304, -15827=>14305, -58321=>14305, -17636=>14306, -58322=>14306, -27303=>14307, -58323=>14307, -33866=>14308, -58324=>14308, -31064=>14309, -58326=>14309, -158614=>14311, -58328=>14311, -159351=>14312, -58329=>14312, -159299=>14313, -58330=>14313, -34014=>14314, -58331=>14314, -33681=>14316, -58333=>14316, -17568=>14317, -58334=>14317, -33939=>14318, -58335=>14318, -34020=>14319, -58336=>14319, -154769=>14320, -58337=>14320, -16960=>14321, -58338=>14321, -154816=>14322, -58339=>14322, -17731=>14323, -58340=>14323, -34100=>14324, -58341=>14324, -23282=>14325, -58342=>14325, -17699=>14326, -17703=>14327, -58344=>14327, -34163=>14328, -58345=>14328, -17686=>14329, -58346=>14329, -26559=>14330, -58347=>14330, -34326=>14331, -58348=>14331, -165413=>14332, -58349=>14332, -165435=>14333, -58350=>14333, -34241=>14334, -58351=>14334, -159880=>14335, -58352=>14335, -34306=>14336, -58353=>14336, -136578=>14337, -58354=>14337, -159949=>14338, -58355=>14338, -194994=>14339, -58356=>14339, -17770=>14340, -58357=>14340, -34344=>14341, -58358=>14341, -13896=>14342, -58359=>14342, -137378=>14343, -58360=>14343, -21495=>14344, -58361=>14344, -160666=>14345, -58362=>14345, -34430=>14346, -58363=>14346, -172280=>14348, -58365=>14348, -34798=>14349, -58366=>14349, -142375=>14350, -58367=>14350, -34737=>14351, -58368=>14351, -34778=>14352, -58369=>14352, -34831=>14353, -60990=>14353, -58370=>14353, -22113=>14354, -58371=>14354, -34412=>14355, -58372=>14355, -26710=>14356, -58373=>14356, -17935=>14357, -58374=>14357, -34885=>14358, -58375=>14358, -34886=>14359, -58376=>14359, -161248=>14360, -58377=>14360, -146873=>14361, -58378=>14361, -161252=>14362, -58379=>14362, -34910=>14363, -58380=>14363, -34972=>14364, -58381=>14364, -18011=>14365, -58382=>14365, -34996=>14366, -58383=>14366, -34997=>14367, -58384=>14367, -35013=>14368, -58386=>14368, -161551=>14369, -58388=>14369, -35207=>14370, -58389=>14370, -35239=>14374, -58393=>14374, -35260=>14375, -58394=>14375, -166437=>14376, -58395=>14376, -35303=>14377, -58396=>14377, -162084=>14378, -58397=>14378, -162493=>14379, -58398=>14379, -35484=>14380, -58399=>14380, -30611=>14381, -58400=>14381, -37374=>14382, -58401=>14382, -35472=>14383, -58402=>14383, -162393=>14384, -58403=>14384, -31465=>14385, -58404=>14385, -162618=>14386, -58405=>14386, -18195=>14387, -58407=>14387, -162616=>14388, -58408=>14388, -29052=>14389, -58409=>14389, -35596=>14390, -58410=>14390, -35615=>14391, -58411=>14391, -152624=>14392, -58412=>14392, -152933=>14393, -58413=>14393, -35647=>14394, -58414=>14394, -35661=>14396, -58416=>14396, -35497=>14397, -58417=>14397, -150138=>14398, -58418=>14398, -35728=>14399, -58419=>14399, -35739=>14400, -58420=>14400, -35503=>14401, -58421=>14401, -136927=>14402, -58422=>14402, -17941=>14403, -58423=>14403, -34895=>14404, -58424=>14404, -35995=>14405, -58425=>14405, -163156=>14406, -58426=>14406, -163215=>14407, -58427=>14407, -195028=>14408, -58428=>14408, -14117=>14409, -58429=>14409, -163155=>14410, -58430=>14410, -36054=>14411, -58431=>14411, -163224=>14412, -58432=>14412, -163261=>14413, -58433=>14413, -36114=>14414, -58434=>14414, -36099=>14415, -58435=>14415, -137488=>14416, -58436=>14416, -36059=>14417, -58437=>14417, -28764=>14418, -58438=>14418, -36113=>14419, -58439=>14419, -16080=>14420, -58441=>14420, -195031=>14421, -36265=>14422, -58443=>14422, -163842=>14423, -58444=>14423, -135188=>14424, -58445=>14424, -149898=>14425, -58446=>14425, -15228=>14426, -58447=>14426, -164284=>14427, -58448=>14427, -160012=>14428, -58449=>14428, -31463=>14429, -58450=>14429, -36525=>14430, -58451=>14430, -36534=>14431, -58452=>14431, -36547=>14432, -58453=>14432, -37588=>14433, -58454=>14433, -36633=>14434, -58455=>14434, -36653=>14435, -58456=>14435, -164709=>14436, -58457=>14436, -164882=>14437, -58458=>14437, -36773=>14438, -58459=>14438, -37635=>14439, -58460=>14439, -172703=>14440, -58461=>14440, -133712=>14441, -58462=>14441, -36787=>14442, -58463=>14442, -166366=>14444, -58465=>14444, -165181=>14445, -58466=>14445, -146875=>14446, -58467=>14446, -24312=>14447, -58468=>14447, -143970=>14448, -58469=>14448, -36857=>14449, -58470=>14449, -140069=>14451, -58474=>14451, -14720=>14452, -58475=>14452, -159447=>14453, -58476=>14453, -36919=>14454, -58477=>14454, -165180=>14455, -58478=>14455, -162494=>14456, -58479=>14456, -36961=>14457, -58480=>14457, -165228=>14458, -58481=>14458, -165387=>14459, -58482=>14459, -37032=>14460, -58483=>14460, -165651=>14461, -58484=>14461, -37060=>14462, -58485=>14462, -165606=>14463, -58486=>14463, -37038=>14464, -58487=>14464, -64038=>14465, -37223=>14466, -58489=>14466, -37289=>14467, -58491=>14467, -37316=>14468, -58492=>14468, -31916=>14469, -58493=>14469, -166195=>14470, -58494=>14470, -138889=>14471, -58495=>14471, -37390=>14472, -58496=>14472, -27807=>14473, -58497=>14473, -37441=>14474, -58498=>14474, -37474=>14475, -58499=>14475, -153017=>14476, -58500=>14476, -166598=>14477, -58502=>14477, -146587=>14478, -58503=>14478, -166668=>14479, -58504=>14479, -153051=>14480, -58505=>14480, -134449=>14481, -58506=>14481, -37676=>14482, -58507=>14482, -37739=>14483, -58508=>14483, -166625=>14484, -58509=>14484, -166891=>14485, -58510=>14485, -23235=>14486, -58512=>14486, -166626=>14487, -58513=>14487, -166629=>14488, -58514=>14488, -18789=>14489, -58515=>14489, -37444=>14490, -58516=>14490, -166892=>14491, -58517=>14491, -166969=>14492, -58518=>14492, -166911=>14493, -58519=>14493, -37747=>14494, -58520=>14494, -37979=>14495, -58521=>14495, -36540=>14496, -58522=>14496, -38277=>14497, -58523=>14497, -38310=>14498, -58524=>14498, -37926=>14499, -58525=>14499, -38304=>14500, -58526=>14500, -28662=>14501, -58527=>14501, -17081=>14502, -58528=>14502, -165592=>14503, -58530=>14503, -135804=>14504, -58531=>14504, -146990=>14505, -58532=>14505, -18911=>14506, -58533=>14506, -27676=>14507, -58534=>14507, -38523=>14508, -58535=>14508, -38550=>14509, -58536=>14509, -16748=>14510, -58537=>14510, -38563=>14511, -58538=>14511, -159445=>14512, -58539=>14512, -25050=>14513, -58540=>14513, -58541=>14514, -30965=>14515, -58542=>14515, -166624=>14516, -58543=>14516, -38589=>14517, -58544=>14517, -21452=>14518, -58545=>14518, -18849=>14519, -58546=>14519, -158904=>14520, -58547=>14520, -131700=>14521, -58548=>14521, -156688=>14522, -58549=>14522, -168111=>14523, -58550=>14523, -168165=>14524, -58551=>14524, -150225=>14525, -58552=>14525, -137493=>14526, -58553=>14526, -144138=>14527, -58554=>14527, -38705=>14528, -58555=>14528, -34370=>14529, -58556=>14529, -38710=>14530, -58557=>14530, -18959=>14531, -58558=>14531, -17725=>14532, -58559=>14532, -17797=>14533, -58560=>14533, -150249=>14534, -58561=>14534, -28789=>14535, -58562=>14535, -23361=>14536, -58563=>14536, -38683=>14537, -58564=>14537, -168405=>14539, -58566=>14539, -38743=>14540, -58567=>14540, -23370=>14541, -58568=>14541, -168427=>14542, -58569=>14542, -38751=>14543, -58570=>14543, -37925=>14544, -58571=>14544, -20688=>14545, -58572=>14545, -143543=>14546, -58573=>14546, -143548=>14547, -58574=>14547, -38793=>14548, -58575=>14548, -38815=>14549, -58576=>14549, -38833=>14550, -58577=>14550, -38846=>14551, -58578=>14551, -38848=>14552, -58579=>14552, -38866=>14553, -58580=>14553, -38880=>14554, -58581=>14554, -152684=>14555, -58582=>14555, -38894=>14556, -58583=>14556, -29724=>14557, -58584=>14557, -169011=>14558, -58585=>14558, -38901=>14560, -58587=>14560, -168989=>14561, -58588=>14561, -162170=>14562, -58589=>14562, -19153=>14563, -58590=>14563, -38964=>14564, -58591=>14564, -38963=>14565, -58592=>14565, -38987=>14566, -58593=>14566, -39014=>14567, -58594=>14567, -15118=>14568, -58595=>14568, -160117=>14569, -58596=>14569, -15697=>14570, -58597=>14570, -132656=>14571, -58598=>14571, -147804=>14572, -58599=>14572, -153350=>14573, -58600=>14573, -39114=>14574, -58601=>14574, -39095=>14575, -58602=>14575, -39112=>14576, -58603=>14576, -39111=>14577, -58604=>14577, -19199=>14578, -58605=>14578, -159015=>14579, -58606=>14579, -136915=>14580, -58607=>14580, -21936=>14581, -58608=>14581, -39137=>14582, -58609=>14582, -39142=>14583, -58610=>14583, -39148=>14584, -58611=>14584, -37752=>14585, -58612=>14585, -39225=>14586, -58613=>14586, -150057=>14587, -58614=>14587, -19314=>14588, -58615=>14588, -170071=>14589, -58616=>14589, -170245=>14590, -58617=>14590, -39413=>14591, -58618=>14591, -39436=>14592, -58619=>14592, -39483=>14593, -58620=>14593, -39440=>14594, -58621=>14594, -39512=>14595, -58622=>14595, -153381=>14596, -58623=>14596, -14020=>14597, -58624=>14597, -168113=>14598, -58625=>14598, -170965=>14599, -58626=>14599, -39648=>14600, -58627=>14600, -39650=>14601, -58628=>14601, -170757=>14602, -58629=>14602, -39668=>14603, -58630=>14603, -19470=>14604, -58631=>14604, -39700=>14605, -58632=>14605, -39725=>14606, -58633=>14606, -165376=>14607, -58634=>14607, -20532=>14608, -58635=>14608, -39732=>14609, -58636=>14609, -14531=>14610, -58638=>14610, -143485=>14611, -58639=>14611, -39760=>14612, -58640=>14612, -39744=>14613, -58641=>14613, -171326=>14614, -58642=>14614, -23109=>14615, -58643=>14615, -137315=>14616, -58644=>14616, -39822=>14617, -58645=>14617, -39938=>14618, -58647=>14618, -39935=>14619, -58648=>14619, -39948=>14620, -58649=>14620, -171624=>14621, -58650=>14621, -40404=>14622, -58651=>14622, -171959=>14623, -58652=>14623, -172434=>14624, -58653=>14624, -172459=>14625, -58654=>14625, -172257=>14626, -58655=>14626, -172323=>14627, -58656=>14627, -172511=>14628, -58657=>14628, -40318=>14629, -58658=>14629, -40323=>14630, -58659=>14630, -172340=>14631, -58660=>14631, -40462=>14632, -58661=>14632, -40388=>14633, -58663=>14633, -172435=>14634, -58665=>14634, -172576=>14635, -58666=>14635, -137531=>14636, -58667=>14636, -172595=>14637, -58668=>14637, -40249=>14638, -58669=>14638, -172217=>14639, -58670=>14639, -172724=>14640, -58671=>14640, -40592=>14641, -58672=>14641, -40597=>14642, -58673=>14642, -40606=>14643, -58674=>14643, -40610=>14644, -58675=>14644, -19764=>14645, -58676=>14645, -40618=>14646, -58677=>14646, -40623=>14647, -58678=>14647, -148324=>14648, -58679=>14648, -40641=>14649, -58680=>14649, -15200=>14650, -58681=>14650, -14821=>14651, -58682=>14651, -15645=>14652, -58683=>14652, -20274=>14653, -58684=>14653, -14270=>14654, -58685=>14654, -166955=>14655, -58686=>14655, -40706=>14656, -58687=>14656, -40712=>14657, -58688=>14657, -19350=>14658, -58689=>14658, -37924=>14659, -58690=>14659, -159138=>14660, -58691=>14660, -40727=>14661, -60836=>14661, -58692=>14661, -195099=>14662, -40761=>14663, -58694=>14663, -22175=>14664, -58695=>14664, -22154=>14665, -58696=>14665, -40773=>14666, -58697=>14666, -39352=>14667, -58698=>14667, -168075=>14668, -58699=>14668, -38898=>14669, -58700=>14669, -33919=>14670, -58701=>14670, -40809=>14672, -58703=>14672, -31452=>14673, -58704=>14673, -40846=>14674, -58705=>14674, -29206=>14675, -58706=>14675, -19390=>14676, -58707=>14676, -149877=>14677, -58708=>14677, -149947=>14678, -58709=>14678, -29047=>14679, -58710=>14679, -150008=>14680, -58711=>14680, -148296=>14681, -58712=>14681, -150097=>14682, -58713=>14682, -29598=>14683, -58714=>14683, -166874=>14684, -58715=>14684, -137466=>14685, -58716=>14685, -31135=>14686, -58717=>14686, -166270=>14687, -58718=>14687, -167478=>14688, -58719=>14688, -37737=>14689, -58720=>14689, -37875=>14690, -58721=>14690, -166468=>14691, -58722=>14691, -37612=>14692, -58723=>14692, -37761=>14693, -58724=>14693, -37835=>14694, -58725=>14694, -166252=>14695, -58726=>14695, -148665=>14696, -58727=>14696, -29207=>14697, -58728=>14697, -16107=>14698, -58729=>14698, -30578=>14699, -58730=>14699, -31299=>14700, -58731=>14700, -28880=>14701, -58732=>14701, -148595=>14702, -58733=>14702, -148472=>14703, -58734=>14703, -29054=>14704, -58735=>14704, -137199=>14705, -58736=>14705, -28835=>14706, -58737=>14706, -137406=>14707, -58738=>14707, -144793=>14708, -58739=>14708, -16071=>14709, -58740=>14709, -137349=>14710, -58741=>14710, -152623=>14711, -58742=>14711, -137208=>14712, -58743=>14712, -14114=>14713, -58744=>14713, -136955=>14714, -58745=>14714, -137273=>14715, -58746=>14715, -14049=>14716, -58747=>14716, -137076=>14717, -58748=>14717, -137425=>14718, -58749=>14718, -155467=>14719, -58750=>14719, -14115=>14720, -58751=>14720, -136896=>14721, -58752=>14721, -22363=>14722, -58753=>14722, -150053=>14723, -58754=>14723, -136190=>14724, -58755=>14724, -135848=>14725, -58756=>14725, -136134=>14726, -58757=>14726, -136374=>14727, -58758=>14727, -34051=>14728, -58761=>14728, -58759=>14728, -145062=>14729, -58760=>14729, -33877=>14731, -58762=>14731, -149908=>14732, -58763=>14732, -160101=>14733, -58764=>14733, -146993=>14734, -58765=>14734, -152924=>14735, -58766=>14735, -147195=>14736, -58767=>14736, -159826=>14737, -58768=>14737, -17652=>14738, -58769=>14738, -145134=>14739, -58770=>14739, -170397=>14740, -58771=>14740, -159526=>14741, -58772=>14741, -26617=>14742, -58773=>14742, -14131=>14743, -58774=>14743, -15381=>14744, -58775=>14744, -15847=>14745, -58776=>14745, -22636=>14746, -58777=>14746, -137506=>14747, -58778=>14747, -26640=>14748, -58779=>14748, -16471=>14749, -58780=>14749, -145215=>14750, -58781=>14750, -147681=>14751, -58782=>14751, -147595=>14752, -58783=>14752, -147727=>14753, -58784=>14753, -158753=>14754, -58785=>14754, -21707=>14755, -58786=>14755, -22174=>14756, -58787=>14756, -157361=>14757, -58788=>14757, -22162=>14758, -58789=>14758, -135135=>14759, -58790=>14759, -134056=>14760, -58791=>14760, -134669=>14761, -58792=>14761, -166675=>14763, -58794=>14763, -37788=>14764, -58795=>14764, -20216=>14765, -58796=>14765, -20779=>14766, -58797=>14766, -14361=>14767, -58798=>14767, -148534=>14768, -58799=>14768, -20156=>14769, -58800=>14769, -132197=>14770, -58801=>14770, -20299=>14772, -58803=>14772, -20362=>14773, -58804=>14773, -153169=>14774, -58805=>14774, -23144=>14775, -58806=>14775, -131499=>14776, -58807=>14776, -132043=>14777, -58808=>14777, -14745=>14778, -58809=>14778, -131850=>14779, -58810=>14779, -132116=>14780, -58811=>14780, -13365=>14781, -58812=>14781, -20265=>14782, -58813=>14782, -131776=>14783, -58814=>14783, -167603=>14784, -58815=>14784, -131701=>14785, -58816=>14785, -35546=>14786, -58817=>14786, -131596=>14787, -58818=>14787, -20120=>14788, -58819=>14788, -20685=>14789, -58820=>14789, -20749=>14790, -58821=>14790, -20386=>14791, -58822=>14791, -20227=>14792, -58823=>14792, -150030=>14793, -58824=>14793, -147082=>14794, -58825=>14794, -20290=>14795, -58826=>14795, -20526=>14796, -58827=>14796, -20588=>14797, -58828=>14797, -20609=>14798, -58829=>14798, -20428=>14799, -58830=>14799, -20453=>14800, -58831=>14800, -20568=>14801, -58832=>14801, -20732=>14802, -58833=>14802, -28278=>14803, -58838=>14803, -144789=>14804, -58839=>14804, -147001=>14805, -58840=>14805, -147135=>14806, -58841=>14806, -28018=>14807, -58842=>14807, -137348=>14808, -58843=>14808, -147081=>14809, -58844=>14809, -20904=>14810, -58845=>14810, -20931=>14811, -58846=>14811, -132576=>14812, -58847=>14812, -17629=>14813, -58848=>14813, -132259=>14814, -58849=>14814, -132242=>14815, -58850=>14815, -132241=>14816, -58851=>14816, -36218=>14817, -58852=>14817, -166556=>14818, -58853=>14818, -132878=>14819, -58854=>14819, -21081=>14820, -58855=>14820, -21156=>14821, -58856=>14821, -133235=>14822, -58857=>14822, -21217=>14823, -58858=>14823, -18042=>14825, -58860=>14825, -29068=>14826, -58861=>14826, -148364=>14827, -58862=>14827, -134176=>14828, -58863=>14828, -149932=>14829, -58864=>14829, -135396=>14830, -58865=>14830, -27089=>14831, -58866=>14831, -134685=>14832, -58867=>14832, -16094=>14834, -58869=>14834, -29849=>14835, -58870=>14835, -29716=>14836, -58871=>14836, -29782=>14837, -58872=>14837, -29592=>14838, -58873=>14838, -19342=>14839, -58874=>14839, -150204=>14840, -58875=>14840, -147597=>14841, -58876=>14841, -21456=>14842, -58877=>14842, -13700=>14843, -58878=>14843, -29199=>14844, -58879=>14844, -147657=>14845, -58880=>14845, -21940=>14846, -58881=>14846, -131909=>14847, -58882=>14847, -21709=>14848, -58883=>14848, -134086=>14849, -58884=>14849, -22301=>14850, -58885=>14850, -37469=>14851, -58886=>14851, -38644=>14852, -58887=>14852, -22493=>14853, -58889=>14853, -22413=>14854, -58890=>14854, -22399=>14855, -58891=>14855, -13886=>14856, -58892=>14856, -22731=>14857, -58893=>14857, -23193=>14858, -58894=>14858, -166470=>14859, -58895=>14859, -136954=>14860, -58896=>14860, -137071=>14861, -58897=>14861, -136976=>14862, -58898=>14862, -23084=>14863, -58899=>14863, -22968=>14864, -58900=>14864, -23166=>14865, -58902=>14865, -23247=>14866, -58903=>14866, -23058=>14867, -58904=>14867, -153926=>14868, -58905=>14868, -137715=>14869, -58906=>14869, -137313=>14870, -58907=>14870, -148117=>14871, -58908=>14871, -14069=>14872, -58909=>14872, -27909=>14873, -58910=>14873, -29763=>14874, -58911=>14874, -23073=>14875, -58912=>14875, -155267=>14876, -58913=>14876, -23169=>14877, -58914=>14877, -166871=>14878, -58915=>14878, -132115=>14879, -58916=>14879, -37856=>14880, -58917=>14880, -29836=>14881, -58918=>14881, -135939=>14882, -58919=>14882, -28933=>14883, -58920=>14883, -18802=>14884, -58921=>14884, -37896=>14885, -58922=>14885, -166395=>14886, -58923=>14886, -37821=>14887, -58924=>14887, -14240=>14888, -58925=>14888, -23582=>14889, -58926=>14889, -23710=>14890, -58927=>14890, -24158=>14891, -58928=>14891, -24136=>14892, -58929=>14892, -137622=>14893, -58930=>14893, -137596=>14894, -58931=>14894, -146158=>14895, -58932=>14895, -24269=>14896, -58933=>14896, -23375=>14897, -58934=>14897, -58935=>14898, -137475=>14898, -58936=>14899, -137476=>14899, -14081=>14900, -58937=>14900, -137376=>14901, -58938=>14901, -14045=>14902, -58939=>14902, -136958=>14903, -58940=>14903, -14035=>14904, -58941=>14904, -33066=>14905, -58942=>14905, -166471=>14906, -58943=>14906, -138682=>14907, -58944=>14907, -144498=>14908, -58945=>14908, -166312=>14909, -58946=>14909, -24332=>14910, -60916=>14910, -58947=>14910, -24334=>14911, -58948=>14911, -137511=>14912, -58949=>14912, -137131=>14913, -58950=>14913, -23147=>14914, -58951=>14914, -137019=>14915, -58952=>14915, -23364=>14916, -58953=>14916, -161277=>14917, -58955=>14917, -34912=>14918, -58956=>14918, -24702=>14919, -58957=>14919, -141408=>14920, -58958=>14920, -140843=>14921, -58959=>14921, -24539=>14922, -58960=>14922, -16056=>14923, -58961=>14923, -140719=>14924, -58962=>14924, -140734=>14925, -58963=>14925, -168072=>14926, -58964=>14926, -159603=>14927, -58965=>14927, -25024=>14928, -58966=>14928, -131134=>14929, -58967=>14929, -131142=>14930, -58968=>14930, -140827=>14931, -58969=>14931, -24985=>14932, -58970=>14932, -24984=>14933, -58971=>14933, -24693=>14934, -58972=>14934, -142491=>14935, -58973=>14935, -142599=>14936, -58974=>14936, -149204=>14937, -58975=>14937, -168269=>14938, -58976=>14938, -25713=>14939, -58977=>14939, -149093=>14940, -58978=>14940, -142186=>14941, -58979=>14941, -14889=>14942, -58980=>14942, -142114=>14943, -58981=>14943, -144464=>14944, -58982=>14944, -170218=>14945, -58983=>14945, -142968=>14946, -58984=>14946, -25399=>14947, -58985=>14947, -25782=>14948, -58987=>14948, -25393=>14949, -58988=>14949, -25553=>14950, -58989=>14950, -149987=>14951, -58990=>14951, -142695=>14952, -58991=>14952, -25252=>14953, -58992=>14953, -142497=>14954, -58993=>14954, -25659=>14955, -58994=>14955, -25963=>14956, -58995=>14956, -26994=>14957, -58996=>14957, -15348=>14958, -58997=>14958, -143502=>14959, -58998=>14959, -144045=>14960, -58999=>14960, -149897=>14961, -59000=>14961, -144043=>14962, -59001=>14962, -21773=>14963, -59002=>14963, -144096=>14964, -59003=>14964, -137433=>14965, -59004=>14965, -169023=>14966, -59005=>14966, -26318=>14967, -59006=>14967, -144009=>14968, -59007=>14968, -143795=>14969, -59008=>14969, -15072=>14970, -59009=>14970, -152964=>14971, -59011=>14971, -166690=>14972, -59012=>14972, -152975=>14973, -59013=>14973, -136956=>14974, -59014=>14974, -152923=>14975, -59015=>14975, -152613=>14976, -59016=>14976, -30958=>14977, -59017=>14977, -143619=>14978, -59018=>14978, -137258=>14979, -59019=>14979, -143924=>14980, -59020=>14980, -13412=>14981, -59021=>14981, -143887=>14982, -59022=>14982, -143746=>14983, -59023=>14983, -148169=>14984, -59024=>14984, -26254=>14985, -59025=>14985, -159012=>14986, -59026=>14986, -26219=>14987, -59027=>14987, -19347=>14988, -59028=>14988, -26160=>14989, -59029=>14989, -161904=>14990, -59030=>14990, -138731=>14991, -59031=>14991, -26211=>14992, -59032=>14992, -144082=>14993, -59033=>14993, -144097=>14994, -59034=>14994, -26142=>14995, -59035=>14995, -153714=>14996, -59036=>14996, -14545=>14997, -59037=>14997, -145466=>14998, -59038=>14998, -145340=>14999, -59039=>14999, -15257=>15000, -59040=>15000, -145314=>15001, -59041=>15001, -144382=>15002, -59042=>15002, -29904=>15003, -59043=>15003, -15254=>15004, -59044=>15004, -149034=>15005, -59046=>15005, -26806=>15006, -59047=>15006, -15300=>15008, -59049=>15008, -27326=>15009, -59050=>15009, -145365=>15010, -59052=>15010, -148615=>15011, -59053=>15011, -27187=>15012, -59054=>15012, -27218=>15013, -59055=>15013, -27337=>15014, -59056=>15014, -27397=>15015, -59057=>15015, -137490=>15016, -59058=>15016, -25873=>15017, -59059=>15017, -26776=>15018, -59060=>15018, -27212=>15019, -59061=>15019, -15319=>15020, -59062=>15020, -27258=>15021, -59063=>15021, -27479=>15022, -59064=>15022, -147392=>15023, -59065=>15023, -146586=>15024, -59066=>15024, -37792=>15025, -59067=>15025, -37618=>15026, -59068=>15026, -166890=>15027, -59069=>15027, -166603=>15028, -59070=>15028, -37513=>15029, -59071=>15029, -163870=>15030, -59072=>15030, -166364=>15031, -59073=>15031, -37991=>15032, -59074=>15032, -28069=>15033, -59075=>15033, -28427=>15034, -59076=>15034, -147327=>15036, -59079=>15036, -15759=>15037, -59080=>15037, -28164=>15038, -59081=>15038, -147516=>15039, -59082=>15039, -23101=>15040, -59083=>15040, -28170=>15041, -59084=>15041, -22599=>15042, -59085=>15042, -27940=>15043, -59086=>15043, -30786=>15044, -59087=>15044, -28987=>15045, -59088=>15045, -148250=>15046, -59089=>15046, -148086=>15047, -59090=>15047, -28913=>15048, -59091=>15048, -29264=>15049, -61085=>15049, -59092=>15049, -29319=>15050, -59093=>15050, -29332=>15051, -59094=>15051, -149391=>15052, -59095=>15052, -149285=>15053, -59096=>15053, -20857=>15054, -59097=>15054, -150180=>15055, -59098=>15055, -132587=>15056, -59099=>15056, -29818=>15057, -59100=>15057, -147192=>15058, -59101=>15058, -144991=>15059, -59102=>15059, -150090=>15060, -59103=>15060, -149783=>15061, -59104=>15061, -155617=>15062, -59105=>15062, -16134=>15063, -59106=>15063, -16049=>15064, -59107=>15064, -150239=>15065, -59108=>15065, -166947=>15066, -59109=>15066, -147253=>15067, -59110=>15067, -24743=>15068, -59111=>15068, -16115=>15069, -59112=>15069, -29900=>15070, -59113=>15070, -29756=>15071, -59114=>15071, -37767=>15072, -59115=>15072, -29751=>15073, -59116=>15073, -17567=>15074, -59117=>15074, -159210=>15075, -59118=>15075, -17745=>15076, -59119=>15076, -30083=>15077, -59120=>15077, -16227=>15078, -59121=>15078, -150745=>15079, -59122=>15079, -150790=>15080, -59123=>15080, -16216=>15081, -59124=>15081, -30037=>15082, -59125=>15082, -30323=>15083, -59126=>15083, -173510=>15084, -59127=>15084, -29800=>15086, -61070=>15086, -59129=>15086, -166604=>15087, -59130=>15087, -149931=>15088, -59131=>15088, -149902=>15089, -59132=>15089, -15099=>15090, -59133=>15090, -15821=>15091, -59134=>15091, -150094=>15092, -59135=>15092, -16127=>15093, -59136=>15093, -149957=>15094, -59137=>15094, -149747=>15095, -59138=>15095, -37370=>15096, -59139=>15096, -22322=>15097, -59140=>15097, -37698=>15098, -59141=>15098, -166627=>15099, -59142=>15099, -137316=>15100, -59143=>15100, -20703=>15101, -59144=>15101, -152097=>15102, -59145=>15102, -152039=>15103, -59146=>15103, -30584=>15104, -59147=>15104, -143922=>15105, -59148=>15105, -30478=>15106, -59149=>15106, -30479=>15107, -59150=>15107, -30587=>15108, -59151=>15108, -149143=>15109, -59152=>15109, -145281=>15110, -59153=>15110, -14942=>15111, -59154=>15111, -149744=>15112, -59155=>15112, -29752=>15113, -59156=>15113, -29851=>15114, -59157=>15114, -16063=>15115, -59158=>15115, -150202=>15116, -59159=>15116, -150215=>15117, -59160=>15117, -16584=>15118, -59161=>15118, -150166=>15119, -59162=>15119, -156078=>15120, -59163=>15120, -37639=>15121, -59164=>15121, -152961=>15122, -59165=>15122, -30750=>15123, -59166=>15123, -30861=>15124, -59167=>15124, -30856=>15125, -59168=>15125, -30930=>15126, -59169=>15126, -29648=>15127, -59170=>15127, -31065=>15128, -59171=>15128, -161601=>15129, -59172=>15129, -153315=>15130, -59173=>15130, -16654=>15131, -59174=>15131, -31141=>15134, -59177=>15134, -27181=>15135, -59178=>15135, -147194=>15136, -59179=>15136, -31290=>15137, -59180=>15137, -31220=>15138, -59181=>15138, -16750=>15139, -59182=>15139, -136934=>15140, -59183=>15140, -16690=>15141, -59184=>15141, -37429=>15142, -59185=>15142, -31217=>15143, -59186=>15143, -134476=>15144, -59187=>15144, -149900=>15145, -59188=>15145, -131737=>15146, -59189=>15146, -146874=>15147, -59190=>15147, -137070=>15148, -59191=>15148, -13719=>15149, -59192=>15149, -21867=>15150, -59193=>15150, -13680=>15151, -59194=>15151, -13994=>15152, -59195=>15152, -131540=>15153, -59196=>15153, -134157=>15154, -59197=>15154, -31458=>15155, -59198=>15155, -23129=>15156, -59199=>15156, -141045=>15157, -59200=>15157, -154287=>15158, -59201=>15158, -154268=>15159, -59202=>15159, -23053=>15160, -59203=>15160, -131675=>15161, -59204=>15161, -30960=>15162, -59205=>15162, -23082=>15163, -59206=>15163, -154566=>15164, -59207=>15164, -31486=>15165, -59208=>15165, -16889=>15166, -59209=>15166, -31837=>15167, -59210=>15167, -31853=>15168, -59211=>15168, -16913=>15169, -59212=>15169, -154547=>15170, -59213=>15170, -155324=>15171, -59214=>15171, -155302=>15172, -59215=>15172, -31949=>15173, -59216=>15173, -150009=>15174, -59217=>15174, -137136=>15175, -59218=>15175, -31886=>15176, -59219=>15176, -31868=>15177, -59220=>15177, -31918=>15178, -59221=>15178, -27314=>15179, -59222=>15179, -32220=>15180, -59223=>15180, -32263=>15181, -59224=>15181, -32211=>15182, -59225=>15182, -32590=>15183, -59226=>15183, -156257=>15184, -59227=>15184, -155996=>15185, -59228=>15185, -162632=>15186, -59229=>15186, -32151=>15187, -59230=>15187, -155266=>15188, -59231=>15188, -17002=>15189, -59232=>15189, -158581=>15190, -59233=>15190, -133398=>15191, -59234=>15191, -26582=>15192, -59235=>15192, -131150=>15193, -59236=>15193, -144847=>15194, -59237=>15194, -22468=>15195, -59238=>15195, -156690=>15196, -59239=>15196, -156664=>15197, -59240=>15197, -32733=>15198, -59242=>15198, -31527=>15199, -59243=>15199, -133164=>15200, -59244=>15200, -154345=>15201, -59245=>15201, -154947=>15202, -59246=>15202, -31500=>15203, -59247=>15203, -155150=>15204, -59248=>15204, -39398=>15205, -59249=>15205, -34373=>15206, -59250=>15206, -39523=>15207, -59251=>15207, -27164=>15208, -59252=>15208, -144447=>15209, -59253=>15209, -150007=>15210, -59255=>15210, -157101=>15211, -59256=>15211, -39455=>15212, -59257=>15212, -157088=>15213, -59258=>15213, -33941=>15214, -160039=>15215, -59260=>15215, -158929=>15216, -59261=>15216, -17642=>15217, -59262=>15217, -33079=>15218, -59263=>15218, -17410=>15219, -59264=>15219, -32966=>15220, -59265=>15220, -33033=>15221, -59266=>15221, -33090=>15222, -59267=>15222, -157620=>15223, -59268=>15223, -39107=>15224, -59269=>15224, -158274=>15225, -59270=>15225, -33378=>15226, -59271=>15226, -33381=>15227, -59272=>15227, -158289=>15228, -59273=>15228, -33875=>15229, -59274=>15229, -159143=>15230, -59275=>15230, -34320=>15231, -59276=>15231, -160283=>15232, -59277=>15232, -23174=>15233, -59278=>15233, -16767=>15234, -59279=>15234, -137280=>15235, -59280=>15235, -23339=>15236, -59281=>15236, -137377=>15237, -59282=>15237, -23268=>15238, -59283=>15238, -137432=>15239, -59284=>15239, -34464=>15240, -59285=>15240, -195004=>15241, -59286=>15241, -146831=>15242, -59287=>15242, -34861=>15243, -59288=>15243, -160802=>15244, -59289=>15244, -23042=>15245, -59290=>15245, -34926=>15246, -59291=>15246, -20293=>15247, -59292=>15247, -34951=>15248, -59293=>15248, -35007=>15249, -59294=>15249, -35046=>15250, -59295=>15250, -35173=>15251, -59296=>15251, -35149=>15252, -59297=>15252, -153219=>15253, -59298=>15253, -35156=>15254, -59299=>15254, -161669=>15255, -59300=>15255, -161668=>15256, -59301=>15256, -166901=>15257, -59302=>15257, -166873=>15258, -59303=>15258, -166812=>15259, -59304=>15259, -166393=>15260, -59305=>15260, -16045=>15261, -59306=>15261, -33955=>15262, -59307=>15262, -18165=>15263, -59308=>15263, -18127=>15264, -59309=>15264, -14322=>15265, -59310=>15265, -35389=>15266, -59311=>15266, -35356=>15267, -59312=>15267, -169032=>15268, -59313=>15268, -24397=>15269, -59314=>15269, -37419=>15270, -59315=>15270, -148100=>15271, -59316=>15271, -26068=>15272, -59317=>15272, -28969=>15273, -59318=>15273, -28868=>15274, -59319=>15274, -137285=>15275, -59320=>15275, -40301=>15276, -59321=>15276, -35999=>15277, -59322=>15277, -36073=>15278, -59323=>15278, -163292=>15279, -59324=>15279, -22938=>15280, -59325=>15280, -30659=>15281, -59326=>15281, -23024=>15282, -59327=>15282, -14036=>15283, -59329=>15283, -36394=>15284, -59330=>15284, -36519=>15285, -59331=>15285, -150537=>15286, -59332=>15286, -36656=>15287, -59333=>15287, -36682=>15288, -59334=>15288, -17140=>15289, -59335=>15289, -27736=>15290, -59336=>15290, -28603=>15291, -59337=>15291, -140065=>15292, -59338=>15292, -18587=>15293, -59339=>15293, -28537=>15294, -59340=>15294, -28299=>15295, -59341=>15295, -137178=>15296, -59342=>15296, -39913=>15297, -59343=>15297, -14005=>15298, -59344=>15298, -149807=>15299, -59345=>15299, -37051=>15300, -59346=>15300, -18612=>15301, -21873=>15302, -59348=>15302, -18694=>15303, -59349=>15303, -37307=>15304, -59350=>15304, -37892=>15305, -59351=>15305, -166475=>15306, -59352=>15306, -16482=>15307, -59353=>15307, -166652=>15308, -59354=>15308, -37927=>15309, -59355=>15309, -166941=>15310, -59356=>15310, -166971=>15311, -59357=>15311, -34021=>15312, -59358=>15312, -35371=>15313, -59359=>15313, -38297=>15314, -59360=>15314, -38311=>15315, -59361=>15315, -38295=>15316, -59362=>15316, -38294=>15317, -59363=>15317, -167220=>15318, -59364=>15318, -29765=>15319, -59365=>15319, -16066=>15320, -59366=>15320, -149759=>15321, -59367=>15321, -150082=>15322, -59368=>15322, -148458=>15323, -59369=>15323, -16103=>15324, -59370=>15324, -143909=>15325, -59371=>15325, -38543=>15326, -59372=>15326, -167655=>15327, -59373=>15327, -167526=>15328, -59374=>15328, -167525=>15329, -59375=>15329, -16076=>15330, -59376=>15330, -149997=>15331, -59377=>15331, -150136=>15332, -59378=>15332, -147438=>15333, -59379=>15333, -29714=>15334, -59380=>15334, -29803=>15335, -59381=>15335, -16124=>15336, -59382=>15336, -38721=>15337, -59383=>15337, -168112=>15338, -59384=>15338, -26695=>15339, -59385=>15339, -18973=>15340, -59386=>15340, -168083=>15341, -59387=>15341, -153567=>15342, -59388=>15342, -37736=>15344, -59390=>15344, -166281=>15345, -59391=>15345, -166950=>15346, -59392=>15346, -166703=>15347, -59393=>15347, -156606=>15348, -59394=>15348, -37562=>15349, -59395=>15349, -23313=>15350, -59396=>15350, -35689=>15351, -59397=>15351, -18748=>15352, -59398=>15352, -29689=>15353, -59399=>15353, -147995=>15354, -59400=>15354, -38811=>15355, -59401=>15355, -39224=>15357, -59403=>15357, -134950=>15358, -59404=>15358, -24001=>15359, -59405=>15359, -166853=>15360, -59406=>15360, -150194=>15361, -59407=>15361, -38943=>15362, -59408=>15362, -169178=>15363, -59409=>15363, -37622=>15364, -59410=>15364, -169431=>15365, -59411=>15365, -37349=>15366, -59412=>15366, -17600=>15367, -59413=>15367, -166736=>15368, -59414=>15368, -150119=>15369, -59415=>15369, -166756=>15370, -59416=>15370, -39132=>15371, -59417=>15371, -166469=>15372, -59418=>15372, -16128=>15373, -59419=>15373, -37418=>15374, -59420=>15374, -18725=>15375, -59421=>15375, -33812=>15376, -59422=>15376, -39227=>15377, -59423=>15377, -39245=>15378, -59424=>15378, -162566=>15379, -59425=>15379, -15869=>15380, -59426=>15380, -19311=>15382, -59428=>15382, -39338=>15383, -59429=>15383, -39516=>15384, -59430=>15384, -166757=>15385, -59431=>15385, -153800=>15386, -59432=>15386, -27279=>15387, -59433=>15387, -39457=>15388, -59434=>15388, -23294=>15389, -59435=>15389, -39471=>15390, -59436=>15390, -170225=>15391, -59437=>15391, -19344=>15392, -59438=>15392, -170312=>15393, -59439=>15393, -39356=>15394, -59440=>15394, -19389=>15395, -59441=>15395, -19351=>15396, -59442=>15396, -37757=>15397, -59443=>15397, -22642=>15398, -59444=>15398, -135938=>15399, -59445=>15399, -22562=>15400, -59446=>15400, -149944=>15401, -59447=>15401, -136424=>15402, -59448=>15402, -30788=>15403, -59449=>15403, -141087=>15404, -59450=>15404, -146872=>15405, -59451=>15405, -26821=>15406, -59452=>15406, -15741=>15407, -59453=>15407, -37976=>15408, -59454=>15408, -14631=>15409, -59455=>15409, -24912=>15410, -59456=>15410, -141185=>15411, -59457=>15411, -141675=>15412, -59458=>15412, -24839=>15413, -59459=>15413, -40015=>15414, -59460=>15414, -40019=>15415, -59461=>15415, -40059=>15416, -59462=>15416, -39989=>15417, -59463=>15417, -39952=>15418, -59464=>15418, -39807=>15419, -59465=>15419, -39887=>15420, -59466=>15420, -171565=>15421, -59467=>15421, -39839=>15422, -59468=>15422, -172533=>15423, -59469=>15423, -172286=>15424, -59470=>15424, -40225=>15425, -59471=>15425, -19630=>15426, -59472=>15426, -147716=>15427, -59473=>15427, -40472=>15428, -59474=>15428, -19632=>15429, -59475=>15429, -40204=>15430, -59476=>15430, -172468=>15431, -59477=>15431, -172269=>15432, -59478=>15432, -172275=>15433, -59479=>15433, -170287=>15434, -59480=>15434, -40357=>15435, -59481=>15435, -33981=>15436, -59482=>15436, -159250=>15437, -59483=>15437, -159711=>15438, -59484=>15438, -158594=>15439, -59485=>15439, -34300=>15440, -59486=>15440, -17715=>15441, -59487=>15441, -159140=>15442, -59488=>15442, -159364=>15443, -59489=>15443, -159216=>15444, -59490=>15444, -33824=>15445, -59491=>15445, -34286=>15446, -59492=>15446, -159232=>15447, -59493=>15447, -145367=>15448, -59494=>15448, -155748=>15449, -59495=>15449, -31202=>15450, -59496=>15450, -144796=>15451, -59497=>15451, -144960=>15452, -59498=>15452, -149982=>15453, -59500=>15453, -15714=>15454, -59501=>15454, -37851=>15455, -59502=>15455, -37566=>15456, -59503=>15456, -37704=>15457, -59504=>15457, -131775=>15458, -59505=>15458, -30905=>15459, -59506=>15459, -37495=>15460, -59507=>15460, -37965=>15461, -59508=>15461, -20452=>15462, -59509=>15462, -13376=>15463, -59510=>15463, -36964=>15464, -59511=>15464, -152925=>15465, -59512=>15465, -30781=>15466, -59513=>15466, -30804=>15467, -59514=>15467, -30902=>15468, -59515=>15468, -30795=>15469, -59516=>15469, -137047=>15470, -59517=>15470, -143817=>15471, -59518=>15471, -149825=>15472, -59519=>15472, -13978=>15473, -59520=>15473, -20338=>15474, -59521=>15474, -28634=>15475, -59522=>15475, -28633=>15476, -59523=>15476, -28702=>15478, -59524=>15478, -59525=>15478, -21524=>15479, -59526=>15479, -147893=>15480, -59527=>15480, -22459=>15481, -59528=>15481, -22771=>15482, -59529=>15482, -22410=>15483, -59530=>15483, -40214=>15484, -59531=>15484, -22487=>15485, -59532=>15485, -28980=>15486, -59533=>15486, -13487=>15487, -59534=>15487, -147884=>15488, -59535=>15488, -29163=>15489, -59536=>15489, -158784=>15490, -59537=>15490, -151447=>15491, -59538=>15491, -137141=>15493, -59540=>15493, -166473=>15494, -59541=>15494, -24844=>15495, -59542=>15495, -23246=>15496, -59543=>15496, -23051=>15497, -59544=>15497, -17084=>15498, -59545=>15498, -148616=>15499, -59546=>15499, -14124=>15500, -59547=>15500, -19323=>15501, -59548=>15501, -166396=>15502, -59549=>15502, -37819=>15503, -59550=>15503, -37816=>15504, -59551=>15504, -137430=>15505, -59552=>15505, -134941=>15506, -59553=>15506, -33906=>15507, -59554=>15507, -158912=>15508, -59555=>15508, -136211=>15509, -59556=>15509, -148218=>15510, -59557=>15510, -142374=>15511, -59558=>15511, -148417=>15512, -59559=>15512, -22932=>15513, -59560=>15513, -146871=>15514, -59561=>15514, -157505=>15515, -59562=>15515, -32168=>15516, -59563=>15516, -155995=>15517, -59564=>15517, -155812=>15518, -59565=>15518, -149945=>15519, -59566=>15519, -149899=>15520, -59567=>15520, -166394=>15521, -59568=>15521, -37605=>15522, -59569=>15522, -29666=>15523, -59570=>15523, -16105=>15524, -59571=>15524, -29876=>15525, -59572=>15525, -166755=>15526, -59573=>15526, -137375=>15527, -59574=>15527, -16097=>15528, -59575=>15528, -150195=>15529, -59576=>15529, -27352=>15530, -59577=>15530, -29683=>15531, -59578=>15531, -29691=>15532, -59579=>15532, -16086=>15533, -59580=>15533, -150078=>15534, -59581=>15534, -150164=>15535, -59582=>15535, -137177=>15536, -59583=>15536, -150118=>15537, -59584=>15537, -132007=>15538, -59585=>15538, -136228=>15539, -59586=>15539, -149989=>15540, -59587=>15540, -29768=>15541, -59588=>15541, -149782=>15542, -59589=>15542, -28837=>15543, -59590=>15543, -149878=>15544, -59591=>15544, -37508=>15545, -59592=>15545, -29670=>15546, -59593=>15546, -37727=>15547, -59594=>15547, -132350=>15548, -59595=>15548, -37681=>15549, -59596=>15549, -166606=>15550, -59597=>15550, -166422=>15551, -59598=>15551, -37766=>15552, -59599=>15552, -166887=>15553, -59600=>15553, -153045=>15554, -59601=>15554, -18741=>15555, -59602=>15555, -166530=>15556, -59603=>15556, -29035=>15557, -59604=>15557, -149827=>15558, -59605=>15558, -134399=>15559, -59606=>15559, -22180=>15560, -59607=>15560, -132634=>15561, -59608=>15561, -134123=>15562, -59609=>15562, -134328=>15563, -59610=>15563, -21762=>15564, -59611=>15564, -31172=>15565, -59612=>15565, -137210=>15566, -59613=>15566, -32254=>15567, -59614=>15567, -136898=>15568, -59615=>15568, -150096=>15569, -59616=>15569, -137298=>15570, -59617=>15570, -17710=>15571, -59618=>15571, -37889=>15572, -59619=>15572, -14090=>15573, -59620=>15573, -166592=>15574, -59621=>15574, -149933=>15575, -59622=>15575, -22960=>15576, -59623=>15576, -137407=>15577, -59624=>15577, -137347=>15578, -59625=>15578, -160900=>15579, -59626=>15579, -23201=>15580, -59627=>15580, -14050=>15581, -59628=>15581, -146779=>15582, -59629=>15582, -14000=>15583, -59630=>15583, -37471=>15584, -59631=>15584, -23161=>15585, -59632=>15585, -166529=>15586, -59633=>15586, -137314=>15587, -59634=>15587, -37748=>15588, -59635=>15588, -15565=>15589, -59636=>15589, -133812=>15590, -59637=>15590, -19094=>15591, -59638=>15591, -14730=>15592, -59639=>15592, -20724=>15593, -59640=>15593, -15721=>15594, -59641=>15594, -15692=>15595, -59642=>15595, -136092=>15596, -59643=>15596, -29045=>15597, -59644=>15597, -17147=>15598, -59645=>15598, -164376=>15599, -59646=>15599, -28175=>15600, -59647=>15600, -168164=>15601, -59648=>15601, -17643=>15602, -59649=>15602, -27991=>15603, -59650=>15603, -163407=>15604, -59651=>15604, -28775=>15605, -59652=>15605, -27823=>15606, -59653=>15606, -15574=>15607, -59654=>15607, -147437=>15608, -59655=>15608, -146989=>15609, -59656=>15609, -28162=>15610, -59657=>15610, -28428=>15611, -59658=>15611, -15727=>15612, -59659=>15612, -132085=>15613, -59660=>15613, -30033=>15614, -59661=>15614, -14012=>15615, -59662=>15615, -13512=>15616, -59663=>15616, -18048=>15617, -59664=>15617, -16090=>15618, -59665=>15618, -18545=>15619, -59666=>15619, -22980=>15620, -59667=>15620, -37486=>15621, -59668=>15621, -18750=>15622, -59669=>15622, -36673=>15623, -59670=>15623, -166940=>15624, -59671=>15624, -158656=>15625, -59672=>15625, -22546=>15626, -59673=>15626, -22472=>15627, -59674=>15627, -14038=>15628, -59675=>15628, -136274=>15629, -59676=>15629, -28926=>15630, -59677=>15630, -148322=>15631, -59678=>15631, -150129=>15632, -59679=>15632, -143331=>15633, -59680=>15633, -135856=>15634, -59681=>15634, -140221=>15635, -59682=>15635, -26809=>15636, -59683=>15636, -26983=>15637, -59684=>15637, -136088=>15638, -59685=>15638, -144613=>15639, -59686=>15639, -162804=>15640, -59687=>15640, -145119=>15641, -59688=>15641, -166531=>15642, -59689=>15642, -145366=>15643, -59690=>15643, -144378=>15644, -59691=>15644, -150687=>15645, -59692=>15645, -27162=>15646, -59693=>15646, -145069=>15647, -59694=>15647, -158903=>15648, -59695=>15648, -33854=>15649, -59696=>15649, -17631=>15650, -59697=>15650, -17614=>15651, -59698=>15651, -159014=>15652, -59699=>15652, -159057=>15653, -59700=>15653, -158850=>15654, -59701=>15654, -159710=>15655, -59702=>15655, -33597=>15658, -59705=>15658, -137018=>15659, -59706=>15659, -33773=>15660, -59707=>15660, -158848=>15661, -59708=>15661, -159827=>15662, -59709=>15662, -137179=>15663, -59710=>15663, -22921=>15664, -59711=>15664, -23170=>15665, -59712=>15665, -137139=>15666, -59713=>15666, -23137=>15667, -59714=>15667, -23153=>15668, -59715=>15668, -137477=>15669, -59716=>15669, -147964=>15670, -59717=>15670, -14125=>15671, -59718=>15671, -23023=>15672, -59719=>15672, -137020=>15673, -59720=>15673, -14023=>15674, -59721=>15674, -29070=>15675, -59722=>15675, -37776=>15676, -59723=>15676, -26266=>15677, -59724=>15677, -148133=>15678, -59725=>15678, -23150=>15679, -59726=>15679, -23083=>15680, -59727=>15680, -148115=>15681, -59728=>15681, -27179=>15682, -59729=>15682, -147193=>15683, -59730=>15683, -161590=>15684, -59731=>15684, -148571=>15685, -59732=>15685, -148170=>15686, -59733=>15686, -28957=>15687, -59734=>15687, -148057=>15688, -59735=>15688, -166369=>15689, -59736=>15689, -20400=>15690, -59737=>15690, -159016=>15691, -59738=>15691, -23746=>15692, -59739=>15692, -148686=>15693, -59740=>15693, -163405=>15694, -59741=>15694, -148413=>15695, -59742=>15695, -27148=>15696, -59743=>15696, -148054=>15697, -59744=>15697, -135940=>15698, -59745=>15698, -28979=>15700, -59747=>15700, -148457=>15701, -59748=>15701, -15781=>15702, -59749=>15702, -27871=>15703, -59750=>15703, -194597=>15704, -59751=>15704, -23019=>15705, -59754=>15705, -24412=>15706, -59757=>15706, -59764=>15707, -144128=>15707, -31955=>15708, -59776=>15708, -59783=>15709, -162548=>15709, -59786=>15710, -153334=>15710, -162584=>15711, -59790=>15711, -36972=>15712, -59791=>15712, -33270=>15713, -59795=>15713, -30476=>15714, -59797=>15714, -27810=>15715, -59799=>15715, -22269=>15716, -59800=>15716, -22633=>15717, -59828=>15717, -26465=>15718, -59832=>15718, -23646=>15719, -59838=>15719, -22770=>15720, -59841=>15720, -28857=>15721, -59843=>15721, -26627=>15722, -59853=>15722, -59859=>15723, -36795=>15723, -59861=>15724, -36796=>15724, -20001=>15725, -59871=>15725, -31545=>15726, -59898=>15726, -15820=>15727, -59902=>15727, -29482=>15728, -57990=>15728, -59909=>15728, -30048=>15729, -59912=>15729, -22586=>15730, -59920=>15730, -33446=>15731, -59932=>15731, -27018=>15732, -59940=>15732, -24803=>15733, -59944=>15733, -20206=>15734, -59984=>15734, -39364=>15735, -60002=>15735, -40639=>15736, -60023=>15736, -21249=>15737, -60025=>15737, -26528=>15738, -60038=>15738, -24808=>15739, -60046=>15739, -20916=>15740, -60053=>15740, -31363=>15741, -60064=>15741, -39994=>15742, -60075=>15742, -31432=>15743, -60093=>15743, -26906=>15744, -60098=>15744, -22956=>15745, -60100=>15745, -22592=>15746, -60102=>15746, -21610=>15747, -60114=>15747, -24807=>15748, -60123=>15748, -22138=>15749, -60125=>15749, -26965=>15750, -60132=>15750, -39983=>15751, -60133=>15751, -34725=>15752, -60134=>15752, -23584=>15753, -60141=>15753, -24075=>15754, -60143=>15754, -26398=>15755, -60147=>15755, -33965=>15756, -60157=>15756, -35713=>15757, -60161=>15757, -20088=>15758, -60166=>15758, -25283=>15759, -60176=>15759, -26709=>15760, -60180=>15760, -33533=>15762, -60190=>15762, -35237=>15763, -60194=>15763, -36768=>15764, -60196=>15764, -38840=>15765, -60198=>15765, -38983=>15766, -60200=>15766, -39613=>15767, -60201=>15767, -24497=>15768, -60218=>15768, -26184=>15769, -60219=>15769, -26303=>15770, -60220=>15770, -162425=>15771, -60221=>15771, -60225=>15773, -149946=>15773, -60230=>15776, -131910=>15776, -26382=>15777, -60232=>15777, -26904=>15778, -60233=>15778, -161367=>15779, -60235=>15779, -155618=>15780, -60236=>15780, -161278=>15781, -60239=>15781, -139418=>15782, -60240=>15782, -18640=>15783, -60241=>15783, -19128=>15784, -60242=>15784, -60244=>15785, -166554=>15785, -60247=>15786, -147515=>15786, -150085=>15787, -60250=>15787, -132554=>15788, -60251=>15788, -20946=>15789, -60252=>15789, -132625=>15790, -60253=>15790, -22943=>15791, -60254=>15791, -138920=>15792, -60255=>15792, -15294=>15793, -60256=>15793, -146687=>15794, -60257=>15794, -14747=>15795, -60262=>15795, -165352=>15796, -60264=>15796, -170441=>15797, -60265=>15797, -14178=>15798, -60266=>15798, -139715=>15799, -60267=>15799, -35678=>15800, -60268=>15800, -166734=>15801, -60269=>15801, -29193=>15803, -60274=>15803, -60276=>15804, -134264=>15804, -132985=>15805, -60280=>15805, -36570=>15806, -60281=>15806, -21135=>15807, -60283=>15807, -29041=>15808, -60285=>15808, -147274=>15809, -60288=>15809, -150183=>15810, -60289=>15810, -21948=>15811, -60290=>15811, -60293=>15812, -158546=>15812, -13427=>15813, -60295=>15813, -60297=>15814, -161330=>15814, -18200=>15815, -60299=>15815, -60303=>15816, -149823=>15816, -20582=>15817, -60305=>15817, -13563=>15818, -60306=>15818, -144332=>15819, -60307=>15819, -18300=>15821, -60310=>15821, -166216=>15822, -60311=>15822, -60315=>15823, -138640=>15823, -162834=>15825, -60320=>15825, -36950=>15826, -60321=>15826, -151450=>15827, -60323=>15827, -35682=>15828, -60324=>15828, -23899=>15829, -60327=>15829, -158711=>15830, -60328=>15830, -137500=>15832, -60331=>15832, -35562=>15833, -60332=>15833, -150006=>15834, -60333=>15834, -60335=>15835, -147439=>15835, -19392=>15836, -60337=>15836, -141083=>15837, -60340=>15837, -37989=>15838, -60341=>15838, -153569=>15839, -60342=>15839, -24981=>15840, -60343=>15840, -23079=>15841, -60344=>15841, -194765=>15842, -60345=>15842, -194566=>15843, -60348=>15844, -148769=>15844, -20074=>15845, -60350=>15845, -149812=>15846, -60351=>15846, -38486=>15847, -60352=>15847, -28047=>15848, -60353=>15848, -158909=>15849, -60354=>15849, -35191=>15850, -60356=>15850, -60359=>15851, -156689=>15851, -31554=>15853, -60363=>15853, -168128=>15854, -60364=>15854, -133649=>15855, -60365=>15855, -31301=>15857, -60369=>15857, -39462=>15858, -60372=>15858, -13919=>15859, -60374=>15859, -156777=>15860, -60375=>15860, -131105=>15861, -60376=>15861, -31107=>15862, -60377=>15862, -23852=>15863, -60380=>15863, -144665=>15864, -60381=>15864, -18128=>15866, -60384=>15866, -30011=>15867, -60386=>15867, -34917=>15868, -60387=>15868, -22710=>15869, -60389=>15869, -14108=>15870, -60390=>15870, -140685=>15871, -60391=>15871, -15444=>15872, -60394=>15872, -37505=>15873, -60397=>15873, -139642=>15874, -60398=>15874, -37680=>15875, -60400=>15875, -149968=>15876, -60402=>15876, -27705=>15877, -60403=>15877, -134904=>15878, -60406=>15878, -34855=>15879, -60407=>15879, -35061=>15880, -60408=>15880, -141606=>15881, -60409=>15881, -164979=>15882, -60410=>15882, -137137=>15883, -60411=>15883, -28344=>15884, -60412=>15884, -150058=>15885, -60413=>15885, -137248=>15886, -60414=>15886, -14756=>15887, -60415=>15887, -17727=>15890, -60419=>15890, -26294=>15891, -60420=>15891, -171181=>15892, -60421=>15892, -170148=>15893, -60422=>15893, -35139=>15894, -60423=>15894, -16607=>15895, -60427=>15895, -136714=>15896, -60428=>15896, -14753=>15897, -60429=>15897, -145199=>15898, -60430=>15898, -164072=>15899, -60431=>15899, -136133=>15900, -60432=>15900, -29101=>15901, -60433=>15901, -33638=>15902, -60434=>15902, -60436=>15903, -168360=>15903, -19639=>15905, -60438=>15905, -159919=>15906, -60439=>15906, -166315=>15907, -60440=>15907, -147834=>15908, -60445=>15908, -31555=>15909, -60446=>15909, -31102=>15910, -60447=>15910, -28597=>15911, -60449=>15911, -172767=>15912, -60450=>15912, -27139=>15913, -60451=>15913, -164632=>15914, -60452=>15914, -21410=>15915, -60453=>15915, -159239=>15916, -60454=>15916, -37823=>15917, -60455=>15917, -26678=>15918, -60456=>15918, -38749=>15919, -59389=>15919, -60457=>15919, -164207=>15920, -60458=>15920, -158133=>15921, -60460=>15921, -136173=>15922, -60461=>15922, -143919=>15923, -60462=>15923, -23941=>15924, -60464=>15924, -166960=>15925, -60465=>15925, -22293=>15926, -60467=>15926, -38947=>15927, -60468=>15927, -166217=>15928, -60469=>15928, -23979=>15929, -60470=>15929, -149896=>15930, -60471=>15930, -26046=>15931, -60472=>15931, -27093=>15932, -60473=>15932, -21458=>15933, -60474=>15933, -150181=>15934, -60475=>15934, -147329=>15935, -60476=>15935, -15377=>15936, -60477=>15936, -26422=>15937, -60478=>15937, -60482=>15938, -139169=>15938, -13770=>15939, -60490=>15939, -18682=>15940, -60493=>15940, -30728=>15942, -60496=>15942, -37461=>15943, -60497=>15943, -17394=>15944, -60499=>15944, -17375=>15945, -60501=>15945, -23032=>15946, -60505=>15946, -22155=>15948, -60518=>15948, -60520=>15949, -169449=>15949, -36882=>15950, -60541=>15950, -21953=>15951, -60546=>15951, -17673=>15952, -60551=>15952, -32383=>15953, -60552=>15953, -28502=>15954, -60553=>15954, -27313=>15955, -60554=>15955, -13540=>15956, -60556=>15956, -161949=>15957, -60558=>15957, -14138=>15958, -60559=>15958, -60562=>15960, -163876=>15960, -60565=>15961, -162366=>15961, -15851=>15962, -60567=>15962, -60569=>15963, -146615=>15963, -156248=>15964, -60574=>15964, -22207=>15965, -60575=>15965, -36366=>15966, -60577=>15966, -23405=>15967, -60578=>15967, -25566=>15968, -60581=>15968, -25904=>15970, -60585=>15970, -22061=>15971, -60586=>15971, -21530=>15972, -60588=>15972, -171416=>15973, -60591=>15973, -19581=>15974, -60592=>15974, -22050=>15975, -60593=>15975, -22046=>15976, -60594=>15976, -32585=>15977, -60595=>15977, -22901=>15978, -60597=>15978, -146752=>15979, -60598=>15979, -34672=>15980, -60599=>15980, -33047=>15981, -60604=>15981, -40286=>15982, -60605=>15982, -36120=>15983, -60606=>15983, -30267=>15984, -60607=>15984, -40005=>15985, -60608=>15985, -30286=>15986, -60609=>15986, -30649=>15987, -60610=>15987, -37701=>15988, -60611=>15988, -21554=>15989, -60612=>15989, -33096=>15990, -60613=>15990, -33527=>15991, -60614=>15991, -22053=>15992, -60615=>15992, -33074=>15993, -60616=>15993, -33816=>15994, -60617=>15994, -32957=>15995, -60618=>15995, -21994=>15996, -60619=>15996, -31074=>15997, -60620=>15997, -22083=>15998, -60621=>15998, -21526=>15999, -60622=>15999, -134813=>16000, -60623=>16000, -13774=>16001, -60624=>16001, -22021=>16002, -57509=>16002, -60625=>16002, -22001=>16003, -60626=>16003, -26353=>16004, -60627=>16004, -164578=>16005, -60628=>16005, -13869=>16006, -60629=>16006, -30004=>16007, -60630=>16007, -22000=>16008, -60631=>16008, -21946=>16009, -60632=>16009, -21655=>16010, -60633=>16010, -21874=>16011, -60634=>16011, -134209=>16012, -60635=>16012, -134294=>16013, -60636=>16013, -24272=>16014, -57652=>16014, -60637=>16014, -134774=>16015, -60639=>16015, -142434=>16016, -60640=>16016, -134818=>16017, -60641=>16017, -40619=>16018, -60642=>16018, -32090=>16019, -60643=>16019, -135285=>16021, -60645=>16021, -25245=>16022, -60646=>16022, -38765=>16023, -60647=>16023, -21652=>16024, -60648=>16024, -36045=>16025, -60649=>16025, -29174=>16026, -60650=>16026, -37238=>16027, -60651=>16027, -25596=>16028, -60652=>16028, -25529=>16029, -60653=>16029, -25598=>16030, -60654=>16030, -21865=>16031, -60655=>16031, -142147=>16032, -60656=>16032, -40050=>16033, -60657=>16033, -143027=>16034, -60658=>16034, -20890=>16035, -60659=>16035, -13535=>16036, -60660=>16036, -134567=>16037, -60661=>16037, -20903=>16038, -60662=>16038, -21581=>16039, -60663=>16039, -21790=>16040, -60664=>16040, -21779=>16041, -60665=>16041, -30310=>16042, -60666=>16042, -36397=>16043, -60667=>16043, -157834=>16044, -60668=>16044, -30129=>16045, -60669=>16045, -32950=>16046, -60670=>16046, -34820=>16047, -60671=>16047, -35015=>16049, -60673=>16049, -33206=>16050, -60674=>16050, -33820=>16051, -60675=>16051, -17644=>16052, -60677=>16052, -29444=>16053, -60678=>16053, -33547=>16054, -60681=>16054, -22139=>16055, -60683=>16055, -37232=>16056, -60690=>16056, -37384=>16057, -60692=>16057, -134905=>16058, -60696=>16058, -29286=>16059, -60697=>16059, -18254=>16060, -60699=>16060, -60701=>16061, -163833=>16061, -16634=>16062, -60703=>16062, -40029=>16063, -60704=>16063, -25887=>16064, -60705=>16064, -18675=>16065, -60707=>16065, -149472=>16066, -60708=>16066, -171388=>16067, -60709=>16067, -60713=>16069, -161187=>16069, -60715=>16070, -155720=>16071, -60716=>16071, -29091=>16072, -60718=>16072, -32398=>16073, -60719=>16073, -40272=>16074, -60720=>16074, -13687=>16075, -60723=>16075, -27826=>16076, -60725=>16076, -21351=>16077, -60726=>16077, -14812=>16078, -60728=>16078, -60731=>16079, -149016=>16079, -33325=>16080, -60734=>16080, -21579=>16081, -60735=>16081, -60739=>16082, -14930=>16083, -60740=>16083, -29556=>16084, -60742=>16084, -171692=>16085, -60743=>16085, -19721=>16086, -60744=>16086, -39917=>16087, -60745=>16087, -19547=>16089, -60748=>16089, -171998=>16090, -60751=>16090, -33884=>16091, -60752=>16091, -60754=>16092, -160434=>16092, -25390=>16093, -60757=>16093, -32037=>16094, -60758=>16094, -14890=>16095, -60761=>16095, -36872=>16096, -60762=>16096, -21196=>16097, -60763=>16097, -15988=>16098, -60764=>16098, -13946=>16099, -60765=>16099, -17897=>16100, -60766=>16100, -132238=>16101, -60767=>16101, -30272=>16102, -60768=>16102, -23280=>16103, -60769=>16103, -134838=>16104, -60770=>16104, -30842=>16105, -60771=>16105, -18358=>16106, -163630=>16106, -60772=>16106, -22695=>16107, -60773=>16107, -16575=>16108, -60774=>16108, -22140=>16109, -60775=>16109, -39819=>16110, -60776=>16110, -23924=>16111, -60777=>16111, -30292=>16112, -60778=>16112, -173108=>16113, -60779=>16113, -40581=>16114, -60780=>16114, -19681=>16115, -60781=>16115, -14331=>16117, -60783=>16117, -24857=>16118, -60784=>16118, -148466=>16119, -60786=>16119, -60787=>16120, -22109=>16121, -60788=>16121, -171526=>16122, -60792=>16122, -21044=>16123, -60793=>16123, -13741=>16124, -60795=>16124, -40316=>16126, -60797=>16126, -31830=>16127, -60798=>16127, -39737=>16128, -60799=>16128, -22494=>16129, -60800=>16129, -23635=>16130, -60802=>16130, -25811=>16131, -60803=>16131, -169168=>16132, -60804=>16132, -156469=>16133, -60805=>16133, -34477=>16134, -60807=>16134, -134440=>16135, -60808=>16135, -134513=>16136, -60811=>16136, -60812=>16137, -20990=>16138, -60813=>16138, -139023=>16139, -60814=>16139, -23950=>16140, -60815=>16140, -38659=>16141, -60816=>16141, -138705=>16142, -60817=>16142, -40577=>16143, -60818=>16143, -36940=>16144, -60819=>16144, -31519=>16145, -60820=>16145, -39682=>16146, -60821=>16146, -23761=>16147, -60822=>16147, -31651=>16148, -60823=>16148, -25192=>16149, -60824=>16149, -25397=>16150, -60825=>16150, -39679=>16151, -60826=>16151, -31695=>16152, -60827=>16152, -39722=>16153, -60828=>16153, -31870=>16154, -60829=>16154, -31810=>16156, -60831=>16156, -31878=>16157, -60832=>16157, -39957=>16158, -60833=>16158, -31740=>16159, -60834=>16159, -39689=>16160, -60835=>16160, -39982=>16162, -40794=>16163, -60839=>16163, -21875=>16164, -60840=>16164, -23491=>16165, -60841=>16165, -20477=>16166, -60842=>16166, -40600=>16167, -60843=>16167, -20466=>16168, -60844=>16168, -21088=>16169, -60845=>16169, -21201=>16170, -60847=>16170, -22375=>16171, -60848=>16171, -20566=>16172, -60849=>16172, -22967=>16173, -60850=>16173, -24082=>16174, -60851=>16174, -38856=>16175, -60852=>16175, -40363=>16176, -60853=>16176, -36700=>16177, -60854=>16177, -21609=>16178, -60855=>16178, -38836=>16179, -60856=>16179, -39232=>16180, -60857=>16180, -38842=>16181, -60858=>16181, -21292=>16182, -60859=>16182, -24880=>16183, -60860=>16183, -26924=>16184, -60861=>16184, -21466=>16185, -60862=>16185, -39946=>16186, -60863=>16186, -40194=>16187, -60864=>16187, -19515=>16188, -60865=>16188, -38465=>16189, -60866=>16189, -27008=>16190, -60867=>16190, -20646=>16191, -60868=>16191, -30022=>16192, -60869=>16192, -137069=>16193, -60870=>16193, -39386=>16194, -60871=>16194, -21107=>16195, -60872=>16195, -60873=>16196, -37209=>16197, -60874=>16197, -38529=>16198, -60875=>16198, -37212=>16199, -60876=>16199, -60877=>16200, -37201=>16201, -60878=>16201, -167575=>16202, -60879=>16202, -25471=>16203, -60880=>16203, -27338=>16204, -60882=>16204, -22033=>16205, -60883=>16205, -37262=>16206, -60884=>16206, -30074=>16207, -60885=>16207, -25221=>16208, -60886=>16208, -29519=>16209, -60888=>16209, -31856=>16210, -60889=>16210, -154657=>16211, -60890=>16211, -60892=>16212, -30422=>16213, -60894=>16213, -39837=>16214, -60895=>16214, -20010=>16215, -60896=>16215, -134356=>16216, -60897=>16216, -33726=>16217, -60898=>16217, -34882=>16218, -60899=>16218, -60900=>16219, -23626=>16220, -60901=>16220, -27072=>16221, -60902=>16221, -21023=>16224, -60905=>16224, -24053=>16225, -60906=>16225, -20174=>16226, -60907=>16226, -27697=>16227, -60908=>16227, -131570=>16228, -60909=>16228, -20281=>16229, -60910=>16229, -21660=>16230, -60911=>16230, -21146=>16232, -60913=>16232, -36226=>16233, -60914=>16233, -13822=>16234, -60915=>16234, -13811=>16236, -60917=>16236, -60918=>16237, -27474=>16238, -60919=>16238, -37244=>16239, -60920=>16239, -40869=>16240, -60921=>16240, -39831=>16241, -60922=>16241, -38958=>16242, -60923=>16242, -39092=>16243, -60924=>16243, -39610=>16244, -60925=>16244, -40616=>16245, -60926=>16245, -40580=>16246, -60927=>16246, -31508=>16247, -60929=>16247, -60930=>16248, -27642=>16249, -60931=>16249, -34840=>16250, -60932=>16250, -32632=>16251, -60933=>16251, -60934=>16252, -22048=>16253, -60935=>16253, -173642=>16254, -60936=>16254, -36471=>16255, -60937=>16255, -40787=>16256, -60938=>16256, -60939=>16257, -36308=>16258, -60940=>16258, -36431=>16259, -60941=>16259, -40476=>16260, -60942=>16260, -36353=>16261, -60943=>16261, -25218=>16262, -60944=>16262, -164733=>16263, -60945=>16263, -36392=>16264, -60946=>16264, -36469=>16265, -60947=>16265, -31443=>16266, -60948=>16266, -31294=>16267, -60950=>16267, -30936=>16268, -60951=>16268, -27882=>16269, -60952=>16269, -35431=>16270, -60953=>16270, -30215=>16271, -60954=>16271, -40742=>16272, -60956=>16272, -27854=>16273, -60957=>16273, -34774=>16274, -60958=>16274, -30147=>16275, -60959=>16275, -172722=>16276, -60960=>16276, -30803=>16277, -60961=>16277, -36108=>16278, -60963=>16278, -29410=>16279, -60964=>16279, -29553=>16280, -60965=>16280, -35629=>16281, -60966=>16281, -29442=>16282, -60967=>16282, -29937=>16283, -60968=>16283, -36075=>16284, -60969=>16284, -150203=>16285, -60970=>16285, -34351=>16286, -60971=>16286, -24506=>16287, -60972=>16287, -34976=>16288, -60973=>16288, -17591=>16289, -60974=>16289, -60975=>16290, -159237=>16291, -60977=>16291, -60978=>16292, -35454=>16293, -60979=>16293, -140571=>16294, -60980=>16294, -60981=>16295, -24829=>16296, -60982=>16296, -30311=>16297, -60983=>16297, -39639=>16298, -60984=>16298, -40260=>16299, -60985=>16299, -37742=>16300, -58859=>16300, -60986=>16300, -39823=>16301, -60987=>16301, -34805=>16302, -60988=>16302, -60989=>16303, -36087=>16305, -60991=>16305, -29484=>16306, -60992=>16306, -38689=>16307, -60993=>16307, -39856=>16308, -60994=>16308, -13782=>16309, -60995=>16309, -29362=>16310, -60996=>16310, -19463=>16311, -60997=>16311, -31825=>16312, -60998=>16312, -39242=>16313, -60999=>16313, -24921=>16314, -61001=>16314, -19460=>16315, -61002=>16315, -40598=>16316, -61003=>16316, -24957=>16317, -61004=>16317, -61005=>16318, -22367=>16319, -61006=>16319, -24943=>16320, -61007=>16320, -25254=>16321, -61008=>16321, -25145=>16322, -61009=>16322, -14940=>16324, -61011=>16324, -25058=>16325, -61012=>16325, -21418=>16326, -61013=>16326, -25444=>16327, -61015=>16327, -26626=>16328, -61016=>16328, -13778=>16329, -61017=>16329, -23895=>16330, -61018=>16330, -36826=>16331, -61020=>16331, -167481=>16332, -61021=>16332, -61022=>16333, -20697=>16334, -61023=>16334, -30982=>16335, -61025=>16335, -21298=>16336, -61026=>16336, -38456=>16337, -61027=>16337, -134971=>16338, -61028=>16338, -16485=>16339, -61029=>16339, -61030=>16340, -30718=>16341, -61031=>16341, -61032=>16342, -31938=>16343, -61033=>16343, -155418=>16344, -61034=>16344, -31962=>16345, -61035=>16345, -31277=>16346, -61036=>16346, -32870=>16347, -61037=>16347, -32867=>16348, -61038=>16348, -32077=>16349, -61039=>16349, -29957=>16350, -61040=>16350, -29938=>16351, -61041=>16351, -35220=>16352, -61042=>16352, -33306=>16353, -61043=>16353, -26380=>16354, -61044=>16354, -32866=>16355, -61045=>16355, -160902=>16356, -61046=>16356, -32859=>16357, -61047=>16357, -29936=>16358, -61048=>16358, -33027=>16359, -61049=>16359, -30500=>16360, -61050=>16360, -35209=>16361, -61051=>16361, -157644=>16362, -61052=>16362, -30035=>16363, -61053=>16363, -34729=>16364, -61055=>16364, -34766=>16365, -61056=>16365, -33224=>16366, -61057=>16366, -34700=>16367, -61058=>16367, -35401=>16368, -61059=>16368, -36013=>16369, -61060=>16369, -35651=>16370, -61061=>16370, -30507=>16371, -61062=>16371, -29944=>16372, -61063=>16372, -34010=>16373, -61064=>16373, -27058=>16374, -61066=>16374, -36262=>16375, -61067=>16375, -61068=>16376, -35241=>16377, -58392=>16377, -61069=>16377, -28089=>16379, -61071=>16379, -34753=>16380, -61072=>16380, -147473=>16381, -61073=>16381, -29927=>16382, -61074=>16382, -15835=>16383, -61075=>16383, -29046=>16384, -61076=>16384, -24740=>16385, -57702=>16385, -61077=>16385, -24988=>16386, -61078=>16386, -15569=>16387, -61079=>16387, -24695=>16389, -61081=>16389, -61082=>16390, -32625=>16391, -61083=>16391, -194850=>16392, -24809=>16393, -61086=>16393, -19326=>16394, -61087=>16394, -132423=>16395, -57344=>16395, -37595=>16396, -57345=>16396, -132575=>16397, -57346=>16397, -147397=>16398, -57347=>16398, -34124=>16399, -57348=>16399, -17077=>16400, -57349=>16400, -29679=>16401, -57350=>16401, -20917=>16402, -57351=>16402, -13897=>16403, -57352=>16403, -149826=>16404, -57353=>16404, -166372=>16405, -57354=>16405, -37700=>16406, -57355=>16406, -137691=>16407, -57356=>16407, -33518=>16408, -57357=>16408, -146632=>16409, -57358=>16409, -30780=>16410, -57359=>16410, -26436=>16411, -57360=>16411, -25311=>16412, -57361=>16412, -149811=>16413, -57362=>16413, -166314=>16414, -57363=>16414, -131744=>16415, -57364=>16415, -158643=>16416, -57365=>16416, -135941=>16417, -57366=>16417, -20395=>16418, -57367=>16418, -140525=>16419, -57368=>16419, -20488=>16420, -57369=>16420, -159017=>16421, -57370=>16421, -162436=>16422, -57371=>16422, -144896=>16423, -57372=>16423, -150193=>16424, -57373=>16424, -140563=>16425, -57374=>16425, -131966=>16427, -57376=>16427, -24484=>16428, -57377=>16428, -131968=>16429, -57378=>16429, -131911=>16430, -57379=>16430, -28379=>16431, -57380=>16431, -132127=>16432, -57381=>16432, -20702=>16433, -20737=>16434, -57383=>16434, -13434=>16435, -57384=>16435, -20750=>16436, -57385=>16436, -39020=>16437, -57386=>16437, -14147=>16438, -57387=>16438, -33814=>16439, -57388=>16439, -149924=>16440, -57389=>16440, -132231=>16441, -57390=>16441, -20832=>16442, -57391=>16442, -144308=>16443, -57392=>16443, -20842=>16444, -57393=>16444, -134143=>16445, -57394=>16445, -139516=>16446, -57395=>16446, -131813=>16447, -57396=>16447, -140592=>16448, -57397=>16448, -132494=>16449, -57398=>16449, -143923=>16450, -57399=>16450, -137603=>16451, -57400=>16451, -23426=>16452, -57401=>16452, -34685=>16453, -57402=>16453, -132531=>16454, -57403=>16454, -146585=>16455, -57404=>16455, -20914=>16456, -57405=>16456, -20920=>16457, -57406=>16457, -40244=>16458, -57407=>16458, -20937=>16459, -57408=>16459, -20943=>16460, -57409=>16460, -20945=>16461, -57410=>16461, -15580=>16462, -57411=>16462, -20947=>16463, -57412=>16463, -150182=>16464, -57413=>16464, -20915=>16465, -57414=>16465, -20973=>16468, -57417=>16468, -33741=>16469, -57418=>16469, -26942=>16470, -57419=>16470, -145197=>16471, -57420=>16471, -24443=>16472, -57421=>16472, -21003=>16473, -57422=>16473, -21030=>16474, -57423=>16474, -21052=>16475, -57424=>16475, -21173=>16476, -57425=>16476, -21079=>16477, -57426=>16477, -21140=>16478, -57427=>16478, -21177=>16479, -57428=>16479, -21189=>16480, -57429=>16480, -31765=>16481, -57430=>16481, -34114=>16482, -57431=>16482, -21216=>16483, -57432=>16483, -34317=>16484, -57433=>16484, -158483=>16485, -57434=>16485, -194601=>16486, -166622=>16487, -57436=>16487, -21833=>16488, -57437=>16488, -28377=>16489, -57438=>16489, -147328=>16490, -57439=>16490, -133460=>16491, -57440=>16491, -147436=>16492, -57441=>16492, -21299=>16493, -57442=>16493, -134114=>16495, -57444=>16495, -27851=>16496, -57445=>16496, -136998=>16497, -57446=>16497, -26651=>16498, -57447=>16498, -29653=>16499, -57448=>16499, -24650=>16500, -57449=>16500, -16042=>16501, -57450=>16501, -14540=>16502, -57451=>16502, -136936=>16503, -57452=>16503, -29149=>16504, -57453=>16504, -17570=>16505, -57454=>16505, -21357=>16506, -57455=>16506, -21364=>16507, -57456=>16507, -165547=>16508, -57457=>16508, -21374=>16509, -57458=>16509, -194610=>16510, -136598=>16511, -57460=>16511, -136723=>16512, -57461=>16512, -30694=>16513, -57462=>16513, -21395=>16514, -57463=>16514, -166555=>16515, -57464=>16515, -21408=>16516, -57465=>16516, -21419=>16517, -57466=>16517, -21422=>16518, -57467=>16518, -29607=>16519, -57468=>16519, -153458=>16520, -57469=>16520, -16217=>16521, -57470=>16521, -29596=>16522, -57471=>16522, -21441=>16523, -57472=>16523, -21445=>16524, -57473=>16524, -27721=>16525, -57474=>16525, -20041=>16526, -57475=>16526, -22526=>16527, -57476=>16527, -21465=>16528, -57477=>16528, -15019=>16529, -57478=>16529, -134031=>16530, -57479=>16530, -21472=>16531, -57480=>16531, -147435=>16532, -57481=>16532, -142755=>16533, -57482=>16533, -21494=>16534, -57483=>16534, -134263=>16535, -57484=>16535, -21523=>16536, -57485=>16536, -28793=>16537, -57486=>16537, -21803=>16538, -57487=>16538, -26199=>16539, -57488=>16539, -27995=>16540, -57489=>16540, -21613=>16541, -57490=>16541, -158547=>16542, -57491=>16542, -134516=>16543, -57492=>16543, -21853=>16544, -57493=>16544, -21647=>16545, -57494=>16545, -21668=>16546, -57495=>16546, -18342=>16547, -57496=>16547, -136973=>16548, -57497=>16548, -134877=>16549, -57498=>16549, -15796=>16550, -57499=>16550, -134477=>16551, -57500=>16551, -166332=>16552, -57501=>16552, -140952=>16553, -57502=>16553, -21831=>16554, -57503=>16554, -19693=>16555, -57504=>16555, -21551=>16556, -57505=>16556, -29719=>16557, -57506=>16557, -21894=>16558, -57507=>16558, -21929=>16559, -57508=>16559, -137431=>16561, -57510=>16561, -147514=>16562, -57511=>16562, -17746=>16563, -57512=>16563, -148533=>16564, -57513=>16564, -26291=>16565, -57514=>16565, -135348=>16566, -57515=>16566, -22071=>16567, -57516=>16567, -26317=>16568, -57517=>16568, -144010=>16569, -57518=>16569, -26276=>16570, -57519=>16570, -22093=>16572, -57521=>16572, -22095=>16573, -57522=>16573, -30961=>16574, -57523=>16574, -22257=>16575, -57524=>16575, -38791=>16576, -57525=>16576, -21502=>16577, -57526=>16577, -22272=>16578, -57527=>16578, -22255=>16579, -57528=>16579, -22253=>16580, -57529=>16580, -166758=>16581, -57530=>16581, -13859=>16582, -57531=>16582, -135759=>16583, -57532=>16583, -22342=>16584, -57533=>16584, -147877=>16585, -57534=>16585, -27758=>16586, -57535=>16586, -28811=>16587, -57536=>16587, -22338=>16588, -57537=>16588, -14001=>16589, -57538=>16589, -158846=>16590, -57539=>16590, -22502=>16591, -57540=>16591, -136214=>16592, -57541=>16592, -22531=>16593, -57542=>16593, -136276=>16594, -57543=>16594, -148323=>16595, -57544=>16595, -22566=>16596, -57545=>16596, -150517=>16597, -57546=>16597, -22559=>16598, -22698=>16599, -57548=>16599, -13665=>16600, -57549=>16600, -22752=>16601, -57550=>16601, -22748=>16602, -57551=>16602, -135740=>16603, -57552=>16603, -22779=>16604, -57553=>16604, -23551=>16605, -57554=>16605, -22339=>16606, -57555=>16606, -172368=>16607, -57556=>16607, -148088=>16608, -57557=>16608, -37843=>16609, -57558=>16609, -13729=>16610, -57559=>16610, -22815=>16611, -57560=>16611, -26790=>16612, -57561=>16612, -14019=>16613, -57562=>16613, -28249=>16614, -57563=>16614, -136766=>16615, -57564=>16615, -23076=>16616, -57565=>16616, -136850=>16618, -57567=>16618, -34053=>16619, -57568=>16619, -22985=>16620, -57569=>16620, -134478=>16621, -57570=>16621, -158849=>16622, -57571=>16622, -159018=>16623, -57572=>16623, -137180=>16624, -57573=>16624, -23001=>16625, -57574=>16625, -137211=>16626, -57575=>16626, -137138=>16627, -57576=>16627, -159142=>16628, -57577=>16628, -28017=>16629, -57578=>16629, -137256=>16630, -57579=>16630, -136917=>16631, -57580=>16631, -23033=>16632, -57581=>16632, -159301=>16633, -57582=>16633, -23211=>16634, -57583=>16634, -23139=>16635, -57584=>16635, -14054=>16636, -57585=>16636, -149929=>16637, -57586=>16637, -14088=>16639, -57588=>16639, -23190=>16640, -57589=>16640, -29797=>16641, -57590=>16641, -23251=>16642, -57591=>16642, -159649=>16643, -57592=>16643, -140628=>16644, -57593=>16644, -137489=>16645, -57595=>16645, -14130=>16646, -57596=>16646, -136888=>16647, -57597=>16647, -24195=>16648, -57598=>16648, -21200=>16649, -57599=>16649, -23414=>16650, -57600=>16650, -25992=>16651, -57601=>16651, -23420=>16652, -57602=>16652, -162318=>16653, -57603=>16653, -16388=>16654, -57604=>16654, -18525=>16655, -57605=>16655, -131588=>16656, -57606=>16656, -23509=>16657, -57607=>16657, -137780=>16658, -57609=>16658, -154060=>16659, -57610=>16659, -132517=>16660, -57611=>16660, -23539=>16661, -57612=>16661, -23453=>16662, -57613=>16662, -19728=>16663, -57614=>16663, -23557=>16664, -57615=>16664, -138052=>16665, -57616=>16665, -23571=>16666, -57617=>16666, -29646=>16667, -57618=>16667, -23572=>16668, -57619=>16668, -138405=>16669, -57620=>16669, -158504=>16670, -57621=>16670, -23625=>16671, -57622=>16671, -18653=>16672, -57623=>16672, -23685=>16673, -57624=>16673, -23785=>16674, -57625=>16674, -23791=>16675, -57626=>16675, -23947=>16676, -57627=>16676, -138745=>16677, -57628=>16677, -138807=>16678, -57629=>16678, -23824=>16679, -57630=>16679, -23832=>16680, -57631=>16680, -23878=>16681, -57632=>16681, -138916=>16682, -57633=>16682, -23738=>16683, -57634=>16683, -24023=>16684, -57635=>16684, -33532=>16685, -57636=>16685, -14381=>16686, -57637=>16686, -149761=>16687, -57638=>16687, -139337=>16688, -57639=>16688, -139635=>16689, -57640=>16689, -33415=>16690, -57641=>16690, -14390=>16691, -57642=>16691, -15298=>16692, -57643=>16692, -24110=>16693, -57644=>16693, -27274=>16694, -57645=>16694, -57647=>16696, -148668=>16697, -57648=>16697, -134355=>16698, -57649=>16698, -21414=>16699, -57650=>16699, -20151=>16700, -57651=>16700, -21416=>16702, -57653=>16702, -137073=>16703, -57654=>16703, -24073=>16704, -57655=>16704, -57656=>16705, -164994=>16706, -57657=>16706, -24313=>16707, -57658=>16707, -24315=>16708, -57659=>16708, -14496=>16709, -57660=>16709, -24316=>16710, -57661=>16710, -26686=>16711, -57662=>16711, -37915=>16712, -57663=>16712, -24333=>16713, -57664=>16713, -131521=>16714, -57665=>16714, -194708=>16715, -57666=>16715, -15070=>16716, -57667=>16716, -135994=>16717, -57669=>16717, -24378=>16718, -57670=>16718, -157832=>16719, -57671=>16719, -140240=>16720, -57672=>16720, -140401=>16721, -57674=>16721, -24419=>16722, -57675=>16722, -159342=>16723, -57677=>16723, -24434=>16724, -57678=>16724, -37696=>16725, -57679=>16725, -166454=>16726, -57680=>16726, -24487=>16727, -57681=>16727, -23990=>16728, -57682=>16728, -15711=>16729, -57683=>16729, -152144=>16730, -57684=>16730, -139114=>16731, -57685=>16731, -159992=>16732, -57686=>16732, -140904=>16733, -57687=>16733, -37334=>16734, -57688=>16734, -131742=>16735, -57689=>16735, -166441=>16736, -57690=>16736, -24625=>16737, -57691=>16737, -26245=>16738, -57692=>16738, -14691=>16739, -57694=>16739, -15815=>16740, -57695=>16740, -13881=>16741, -57696=>16741, -22416=>16742, -57697=>16742, -141236=>16743, -57698=>16743, -31089=>16744, -57699=>16744, -15936=>16745, -57700=>16745, -24734=>16746, -57701=>16746, -24810=>16748, -149890=>16749, -57704=>16749, -149903=>16750, -57705=>16750, -162387=>16751, -57706=>16751, -29860=>16752, -57707=>16752, -20705=>16753, -57708=>16753, -23200=>16754, -57709=>16754, -24932=>16755, -57710=>16755, -24898=>16756, -57712=>16756, -194726=>16757, -57713=>16757, -159442=>16758, -57714=>16758, -24961=>16759, -57715=>16759, -20980=>16760, -57716=>16760, -132694=>16761, -57717=>16761, -24967=>16762, -57718=>16762, -23466=>16763, -57719=>16763, -147383=>16764, -57720=>16764, -141407=>16765, -57721=>16765, -25043=>16766, -57722=>16766, -166813=>16767, -57723=>16767, -170333=>16768, -57724=>16768, -25040=>16769, -57725=>16769, -14642=>16770, -57726=>16770, -141696=>16771, -57727=>16771, -141505=>16772, -57728=>16772, -24611=>16773, -57729=>16773, -24924=>16774, -57730=>16774, -25886=>16775, -57731=>16775, -25483=>16776, -57732=>16776, -131352=>16777, -57733=>16777, -25285=>16778, -57734=>16778, -137072=>16779, -57735=>16779, -25301=>16780, -57736=>16780, -142861=>16781, -57737=>16781, -25452=>16782, -57738=>16782, -149983=>16783, -57739=>16783, -14871=>16784, -57740=>16784, -25656=>16785, -57741=>16785, -25592=>16786, -57742=>16786, -136078=>16787, -57743=>16787, -137212=>16788, -57744=>16788, -28554=>16789, -57746=>16789, -142902=>16790, -57747=>16790, -153373=>16792, -57750=>16792, -25825=>16793, -57751=>16793, -25829=>16794, -57752=>16794, -38011=>16795, -57753=>16795, -14950=>16796, -57754=>16796, -25658=>16797, -57755=>16797, -14935=>16798, -57756=>16798, -25933=>16799, -57757=>16799, -28438=>16800, -57758=>16800, -150056=>16801, -57759=>16801, -150051=>16802, -57760=>16802, -25989=>16803, -57761=>16803, -25965=>16804, -57762=>16804, -25951=>16805, -57763=>16805, -26037=>16807, -57765=>16807, -149824=>16808, -57766=>16808, -19255=>16809, -57767=>16809, -26065=>16810, -57768=>16810, -16600=>16811, -57769=>16811, -137257=>16812, -57770=>16812, -57771=>16813, -26083=>16814, -57772=>16814, -24543=>16815, -57773=>16815, -144384=>16816, -57774=>16816, -26136=>16817, -57775=>16817, -57776=>16818, -143863=>16818, -57777=>16819, -143864=>16819, -26180=>16820, -57778=>16820, -57779=>16821, -143780=>16821, -57780=>16822, -143781=>16822, -26187=>16823, -57781=>16823, -134773=>16824, -57782=>16824, -26215=>16825, -57783=>16825, -152038=>16826, -57784=>16826, -26227=>16827, -57785=>16827, -64018=>16828, -143921=>16829, -57788=>16829, -165364=>16830, -57789=>16830, -143816=>16831, -57790=>16831, -152339=>16832, -57791=>16832, -30661=>16833, -57792=>16833, -141559=>16834, -57793=>16834, -39332=>16835, -57794=>16835, -26370=>16836, -57795=>16836, -148380=>16837, -57796=>16837, -150049=>16838, -57797=>16838, -27130=>16839, -57799=>16839, -145346=>16840, -57800=>16840, -194779=>16841, -26471=>16842, -57802=>16842, -26466=>16843, -57803=>16843, -147917=>16844, -57804=>16844, -168173=>16845, -57805=>16845, -26583=>16846, -57806=>16846, -17641=>16847, -57807=>16847, -26658=>16848, -57808=>16848, -28240=>16849, -57809=>16849, -37436=>16850, -57810=>16850, -26625=>16851, -57811=>16851, -144358=>16852, -57812=>16852, -159136=>16853, -57813=>16853, -26717=>16854, -57814=>16854, -144495=>16855, -57815=>16855, -27105=>16856, -57816=>16856, -27147=>16857, -57817=>16857, -166623=>16858, -57818=>16858, -26995=>16859, -57819=>16859, -26819=>16860, -57820=>16860, -144845=>16861, -57821=>16861, -26881=>16862, -57822=>16862, -26880=>16863, -57823=>16863, -14849=>16864, -57825=>16864, -144956=>16865, -57826=>16865, -15232=>16866, -57827=>16866, -26540=>16867, -57828=>16867, -26977=>16868, -57829=>16868, -166474=>16869, -57830=>16869, -17148=>16870, -57831=>16870, -26934=>16871, -57832=>16871, -27032=>16872, -57833=>16872, -15265=>16873, -57834=>16873, -132041=>16874, -57835=>16874, -33635=>16875, -57836=>16875, -20624=>16876, -57837=>16876, -27129=>16877, -57838=>16877, -144985=>16878, -57839=>16878, -139562=>16879, -57840=>16879, -27205=>16880, -57841=>16880, -145155=>16881, -57842=>16881, -27293=>16882, -57843=>16882, -15347=>16883, -57844=>16883, -26545=>16884, -57845=>16884, -27336=>16885, -57846=>16885, -168348=>16886, -57847=>16886, -15373=>16887, -57848=>16887, -27421=>16888, -57849=>16888, -133411=>16889, -57850=>16889, -24798=>16890, -60308=>16890, -57851=>16890, -27445=>16891, -57852=>16891, -27508=>16892, -57853=>16892, -141261=>16893, -57854=>16893, -28341=>16894, -57855=>16894, -57856=>16895, -146139=>16895, -137560=>16897, -57858=>16897, -14144=>16898, -57859=>16898, -21537=>16899, -57860=>16899, -146266=>16900, -57861=>16900, -27617=>16901, -57862=>16901, -147196=>16902, -57863=>16902, -27612=>16903, -57864=>16903, -27703=>16904, -57865=>16904, -140427=>16905, -57866=>16905, -149745=>16906, -57867=>16906, -158545=>16907, -57868=>16907, -27738=>16908, -57869=>16908, -33318=>16909, -57870=>16909, -27769=>16910, -57871=>16910, -146876=>16911, -57872=>16911, -17605=>16912, -57873=>16912, -146877=>16913, -57874=>16913, -147876=>16914, -57875=>16914, -149772=>16915, -57876=>16915, -149760=>16916, -57877=>16916, -146633=>16917, -57878=>16917, -14053=>16918, -57879=>16918, -15595=>16919, -57880=>16919, -134450=>16920, -57881=>16920, -39811=>16921, -57882=>16921, -143865=>16922, -57883=>16922, -140433=>16923, -57884=>16923, -32655=>16924, -57885=>16924, -26679=>16925, -57886=>16925, -159013=>16926, -57887=>16926, -159137=>16927, -57888=>16927, -159211=>16928, -57889=>16928, -28054=>16929, -57890=>16929, -27996=>16930, -57891=>16930, -28284=>16931, -57892=>16931, -28420=>16932, -57893=>16932, -149887=>16933, -57894=>16933, -147589=>16934, -57895=>16934, -159346=>16935, -57896=>16935, -34099=>16936, -57897=>16936, -159604=>16937, -57898=>16937, -20935=>16938, -57899=>16938, -33838=>16941, -57902=>16941, -166689=>16942, -57903=>16942, -194824=>16943, -146991=>16944, -57905=>16944, -29779=>16945, -57906=>16945, -147330=>16946, -57907=>16946, -31180=>16947, -57908=>16947, -28239=>16948, -57909=>16948, -23185=>16949, -57910=>16949, -143435=>16950, -57911=>16950, -28664=>16951, -57912=>16951, -14093=>16952, -57913=>16952, -28573=>16953, -57914=>16953, -146992=>16954, -57915=>16954, -28410=>16955, -57916=>16955, -136343=>16956, -57917=>16956, -147517=>16957, -57918=>16957, -17749=>16958, -57919=>16958, -37872=>16959, -57920=>16959, -28484=>16960, -57921=>16960, -28508=>16961, -57922=>16961, -15694=>16962, -57923=>16962, -28532=>16963, -57924=>16963, -168304=>16964, -57925=>16964, -15675=>16965, -57926=>16965, -28575=>16966, -57927=>16966, -147780=>16967, -57928=>16967, -28627=>16968, -57929=>16968, -147601=>16969, -57930=>16969, -147797=>16970, -57931=>16970, -147513=>16971, -57932=>16971, -147440=>16972, -57933=>16972, -147380=>16973, -57934=>16973, -147775=>16974, -57935=>16974, -20959=>16975, -57936=>16975, -57937=>16976, -147798=>16976, -57938=>16977, -147799=>16977, -147776=>16978, -57939=>16978, -156125=>16979, -57940=>16979, -28747=>16980, -57941=>16980, -28798=>16981, -57942=>16981, -28839=>16982, -57943=>16982, -28876=>16984, -57945=>16984, -28885=>16985, -57946=>16985, -28886=>16986, -57947=>16986, -28895=>16987, -57948=>16987, -16644=>16988, -57949=>16988, -15848=>16989, -57950=>16989, -29108=>16990, -57951=>16990, -29078=>16991, -57952=>16991, -148087=>16992, -57953=>16992, -28971=>16993, -57954=>16993, -28997=>16994, -57955=>16994, -23176=>16995, -57956=>16995, -29002=>16996, -57957=>16996, -64072=>16997, -148325=>16998, -57960=>16998, -29007=>16999, -57961=>16999, -37730=>17000, -57962=>17000, -148161=>17001, -57963=>17001, -28972=>17002, -57964=>17002, -148570=>17003, -57965=>17003, -150055=>17004, -57966=>17004, -150050=>17005, -57967=>17005, -29114=>17006, -57968=>17006, -166888=>17007, -57969=>17007, -28861=>17008, -57970=>17008, -29198=>17009, -57971=>17009, -37954=>17010, -57972=>17010, -29205=>17011, -57973=>17011, -22801=>17012, -57974=>17012, -37955=>17013, -57975=>17013, -29220=>17014, -57976=>17014, -37697=>17015, -57977=>17015, -153093=>17016, -57978=>17016, -29230=>17017, -57979=>17017, -29248=>17018, -57980=>17018, -149876=>17019, -57981=>17019, -26813=>17020, -57982=>17020, -29269=>17021, -57983=>17021, -29271=>17022, -57984=>17022, -15957=>17023, -57985=>17023, -143428=>17024, -57986=>17024, -26637=>17025, -57987=>17025, -28477=>17026, -57988=>17026, -29314=>17027, -57989=>17027, -29483=>17029, -57991=>17029, -149539=>17030, -57992=>17030, -165931=>17031, -57993=>17031, -18669=>17032, -57994=>17032, -165892=>17033, -57995=>17033, -29480=>17034, -57996=>17034, -29486=>17035, -57997=>17035, -29647=>17036, -57998=>17036, -29610=>17037, -57999=>17037, -134202=>17038, -58000=>17038, -158254=>17039, -58001=>17039, -29641=>17040, -58002=>17040, -29769=>17041, -58003=>17041, -147938=>17042, -58004=>17042, -136935=>17043, -58005=>17043, -150052=>17044, -58006=>17044, -26147=>17045, -58007=>17045, -14021=>17046, -58008=>17046, -149943=>17047, -58009=>17047, -149901=>17048, -58010=>17048, -150011=>17049, -58011=>17049, -29687=>17050, -58012=>17050, -29717=>17051, -58013=>17051, -26883=>17052, -58014=>17052, -150054=>17053, -58015=>17053, -29753=>17054, -58016=>17054, -16087=>17055, -58018=>17055, -194863=>17056, -141485=>17057, -58020=>17057, -29792=>17058, -58021=>17058, -167602=>17059, -58022=>17059, -29767=>17060, -58023=>17060, -29668=>17061, -58024=>17061, -29814=>17062, -58025=>17062, -33721=>17063, -58026=>17063, -29804=>17064, -58027=>17064, -29812=>17065, -58029=>17065, -37873=>17066, -58030=>17066, -27180=>17067, -58031=>17067, -29826=>17068, -58032=>17068, -18771=>17069, -58033=>17069, -150156=>17070, -58034=>17070, -147807=>17071, -58035=>17071, -150137=>17072, -58036=>17072, -166799=>17073, -58037=>17073, -23366=>17074, -58038=>17074, -166915=>17075, -58039=>17075, -137374=>17076, -58040=>17076, -29896=>17077, -58041=>17077, -137608=>17078, -58042=>17078, -29966=>17079, -58043=>17079, -29982=>17080, -58045=>17080, -167641=>17081, -58046=>17081, -137803=>17082, -58047=>17082, -23511=>17083, -58048=>17083, -167596=>17084, -58049=>17084, -37765=>17085, -58050=>17085, -30029=>17086, -58051=>17086, -30026=>17087, -58052=>17087, -30055=>17088, -58053=>17088, -30062=>17089, -58054=>17089, -151426=>17090, -58055=>17090, -16132=>17091, -58056=>17091, -150803=>17092, -58057=>17092, -30094=>17093, -58058=>17093, -29789=>17094, -58059=>17094, -30110=>17095, -58060=>17095, -30132=>17096, -58061=>17096, -30210=>17097, -58062=>17097, -30252=>17098, -58063=>17098, -30289=>17099, -58064=>17099, -30287=>17100, -58065=>17100, -30319=>17101, -58066=>17101, -58067=>17102, -156661=>17103, -58068=>17103, -30352=>17104, -58069=>17104, -33263=>17105, -58070=>17105, -14328=>17106, -58071=>17106, -157969=>17107, -58072=>17107, -157966=>17108, -58073=>17108, -30369=>17109, -58074=>17109, -30373=>17110, -58075=>17110, -30391=>17111, -58076=>17111, -30412=>17112, -58077=>17112, -159647=>17113, -58078=>17113, -33890=>17114, -58079=>17114, -151709=>17115, -58080=>17115, -151933=>17116, -58081=>17116, -138780=>17117, -58082=>17117, -30494=>17118, -58083=>17118, -30502=>17119, -58084=>17119, -30528=>17120, -58085=>17120, -25775=>17121, -58086=>17121, -152096=>17122, -58087=>17122, -30552=>17123, -58088=>17123, -144044=>17124, -58089=>17124, -30639=>17125, -58090=>17125, -166244=>17126, -58091=>17126, -166248=>17127, -58092=>17127, -136897=>17128, -58093=>17128, -30708=>17129, -58094=>17129, -26826=>17131, -58098=>17131, -30895=>17132, -58099=>17132, -30919=>17133, -58100=>17133, -30931=>17134, -58101=>17134, -38565=>17135, -58102=>17135, -31022=>17136, -58103=>17136, -153056=>17137, -58104=>17137, -30935=>17138, -58105=>17138, -31028=>17139, -58106=>17139, -30897=>17140, -58107=>17140, -161292=>17141, -58108=>17141, -36792=>17142, -58109=>17142, -34948=>17143, -58110=>17143, -140828=>17144, -58113=>17144, -31110=>17145, -58114=>17145, -35072=>17146, -58115=>17146, -26882=>17147, -58116=>17147, -31104=>17148, -58117=>17148, -153687=>17149, -58118=>17149, -31133=>17150, -58119=>17150, -162617=>17151, -58120=>17151, -31036=>17152, -58121=>17152, -31145=>17153, -58122=>17153, -28202=>17154, -58123=>17154, -160038=>17155, -58124=>17155, -16040=>17156, -58125=>17156, -31174=>17157, -58126=>17157, -168205=>17158, -58127=>17158, -31188=>17159, -58128=>17159, -21797=>17161, -62526=>17161, -134210=>17163, -62528=>17163, -134421=>17164, -62529=>17164, -151851=>17165, -62530=>17165, -21904=>17166, -62531=>17166, -142534=>17167, -62532=>17167, -14828=>17168, -62533=>17168, -131905=>17169, -62534=>17169, -36422=>17170, -62535=>17170, -150968=>17171, -62536=>17171, -169189=>17172, -62537=>17172, -164030=>17174, -62539=>17174, -30586=>17175, -62540=>17175, -142392=>17176, -62541=>17176, -14900=>17177, -62542=>17177, -18389=>17178, -62543=>17178, -164189=>17179, -62544=>17179, -158194=>17180, -62545=>17180, -151018=>17181, -62546=>17181, -25821=>17182, -62547=>17182, -134524=>17183, -62548=>17183, -135092=>17184, -62549=>17184, -134357=>17185, -62550=>17185, -25741=>17187, -62552=>17187, -36478=>17188, -62553=>17188, -134806=>17189, -62554=>17189, -135012=>17191, -62556=>17191, -142505=>17192, -62557=>17192, -164438=>17193, -62558=>17193, -148691=>17194, -62559=>17194, -134470=>17196, -62561=>17196, -170573=>17197, -62562=>17197, -164073=>17198, -62563=>17198, -18420=>17199, -62564=>17199, -151207=>17200, -62565=>17200, -142530=>17201, -62566=>17201, -39602=>17202, -62567=>17202, -14951=>17203, -62568=>17203, -169460=>17204, -62569=>17204, -16365=>17205, -62570=>17205, -13574=>17206, -62571=>17206, -152263=>17207, -62572=>17207, -169940=>17208, -62573=>17208, -142660=>17210, -62575=>17210, -40302=>17211, -62576=>17211, -38933=>17212, -62577=>17212, -17369=>17214, -62579=>17214, -25780=>17216, -62581=>17216, -21731=>17217, -62582=>17217, -62584=>17219, -142282=>17219, -14843=>17221, -62586=>17221, -157402=>17223, -62588=>17223, -157462=>17224, -62589=>17224, -162208=>17225, -62590=>17225, -25834=>17226, -62591=>17226, -151634=>17227, -62592=>17227, -134211=>17228, -62593=>17228, -36456=>17229, -62594=>17229, -166732=>17231, -62596=>17231, -132913=>17232, -62597=>17232, -18443=>17234, -62599=>17234, -131497=>17235, -62600=>17235, -16378=>17236, -62601=>17236, -22643=>17237, -62602=>17237, -142733=>17238, -62603=>17238, -148936=>17240, -62605=>17240, -132348=>17241, -62606=>17241, -155799=>17242, -62607=>17242, -134988=>17243, -62608=>17243, -21881=>17245, -62610=>17245, -17338=>17247, -62612=>17247, -19124=>17249, -62614=>17249, -141926=>17250, -62615=>17250, -135325=>17251, -62616=>17251, -33194=>17252, -62617=>17252, -39157=>17253, -62618=>17253, -134556=>17254, -62619=>17254, -25465=>17255, -62620=>17255, -14846=>17256, -62621=>17256, -141173=>17257, -62622=>17257, -36288=>17258, -62623=>17258, -22177=>17259, -62624=>17259, -25724=>17260, -62625=>17260, -15939=>17261, -62626=>17261, -173569=>17263, -62628=>17263, -134665=>17264, -62629=>17264, -142031=>17265, -62630=>17265, -135368=>17268, -62633=>17268, -145858=>17269, -62634=>17269, -14738=>17270, -62635=>17270, -14854=>17271, -62636=>17271, -164507=>17272, -62637=>17272, -13688=>17273, -62638=>17273, -155209=>17274, -62639=>17274, -139463=>17275, -62640=>17275, -142514=>17278, -62643=>17278, -169760=>17279, -62644=>17279, -13500=>17280, -62645=>17280, -27709=>17281, -62646=>17281, -151099=>17282, -62647=>17282, -161140=>17285, -62650=>17285, -142987=>17286, -62651=>17286, -139784=>17287, -62652=>17287, -173659=>17288, -62653=>17288, -167117=>17289, -62654=>17289, -134778=>17290, -62655=>17290, -134196=>17291, -62656=>17291, -161337=>17292, -62683=>17292, -142286=>17293, -62684=>17293, -62687=>17294, -142417=>17294, -14872=>17295, -62689=>17295, -62691=>17296, -135367=>17296, -62693=>17297, -173618=>17297, -167122=>17298, -62695=>17298, -167321=>17299, -62696=>17299, -167114=>17300, -62697=>17300, -38314=>17301, -62698=>17301, -62706=>17303, -161630=>17303, -28992=>17304, -62708=>17304, -20822=>17306, -62385=>17306, -20222=>17307, -20616=>17308, -62487=>17308, -13459=>17310, -62489=>17310, -20870=>17311, -62491=>17311, -24130=>17312, -63037=>17312, -20997=>17313, -62495=>17313, -21031=>17314, -62436=>17314, -21113=>17315, -62497=>17315, -194600=>17316, -13651=>17317, -62504=>17317, -21442=>17318, -62505=>17318, -21343=>17319, -62715=>17319, -21823=>17321, -62520=>17321, -21976=>17323, -59986=>17323, -13789=>17324, -62722=>17324, -22049=>17325, -63067=>17325, -22100=>17327, -60044=>17327, -60148=>17328, -135291=>17328, -60153=>17330, -135379=>17330, -61095=>17332, -135934=>17332, -14265=>17335, -60104=>17335, -23745=>17336, -61099=>17336, -23829=>17337, -63066=>17337, -23894=>17338, -63030=>17338, -14392=>17339, -63036=>17339, -20097=>17340, -62477=>17340, -24253=>17341, -63038=>17341, -14612=>17342, -63042=>17342, -25017=>17343, -63050=>17343, -25232=>17344, -63054=>17344, -25368=>17345, -63056=>17345, -25690=>17346, -63063=>17346, -25745=>17347, -62381=>17347, -33133=>17348, -62709=>17348, -33156=>17349, -59922=>17349, -33171=>17350, -59924=>17350, -26624=>17351, -63080=>17351, -15292=>17352, -63093=>17352, -29327=>17353, -60517=>17353, -29389=>17354, -59781=>17354, -149487=>17355, -29497=>17356, -59785=>17356, -30018=>17357, -59811=>17357, -30172=>17358, -59817=>17358, -16320=>17359, -59818=>17359, -60278=>17360, -151205=>17360, -16343=>17361, -59820=>17361, -30336=>17363, -30348=>17364, -59824=>17364, -151388=>17364, -16552=>17365, -59845=>17365, -30777=>17366, -59846=>17366, -16643=>17367, -59855=>17367, -31377=>17368, -59863=>17368, -31771=>17369, -59876=>17369, -31981=>17370, -59884=>17370, -32659=>17371, -62658=>17371, -32686=>17372, -59892=>17372, -33535=>17374, -59936=>17374, -22623=>17375, -59981=>17375, -34482=>17376, -59960=>17376, -17836=>17377, -34699=>17378, -59963=>17378, -35143=>17379, -59969=>17379, -35369=>17381, -59972=>17381, -36465=>17383, -59988=>17383, -60484=>17384, -164233=>17384, -36528=>17385, -59990=>17385, -37214=>17387, -62443=>17387, -37260=>17388, -62441=>17388, -39182=>17389, -60051=>17389, -39196=>17390, -60054=>17390, -39809=>17393, -60066=>17393, -40384=>17394, -60080=>17394, -40339=>17395, -60078=>17395, -40620=>17396, -60085=>17396, -19857=>17397, -60540=>17397, -37818=>17399, -40571=>17400, -60084=>17400, -28809=>17401, -63148=>17401, -29512=>17402, -59788=>17402, -31129=>17404, -59858=>17404, -36791=>17405, -59997=>17405, -39234=>17407, -60056=>17407, -8364=>17601, -12443=>17606, -63518=>17606, -12444=>17607, -63519=>17607, -11904=>17608, -63520=>17608, -12736=>17609, -62211=>17609, -12737=>17610, -62212=>17610, -12738=>17611, -62213=>17611, -12739=>17612, -62214=>17612, -12740=>17613, -62215=>17613, -131340=>17614, -62216=>17614, -12741=>17615, -62217=>17615, -131281=>17616, -62218=>17616, -131277=>17617, -62219=>17617, -12742=>17618, -62220=>17618, -12743=>17619, -62221=>17619, -131275=>17620, -62222=>17620, -139240=>17621, -62223=>17621, -12744=>17622, -62224=>17622, -131274=>17623, -62225=>17623, -12745=>17624, -62226=>17624, -12746=>17625, -62227=>17625, -12747=>17626, -62228=>17626, -12748=>17627, -62229=>17627, -131342=>17628, -62230=>17628, -12749=>17629, -62231=>17629, -12750=>17630, -62232=>17630, -62776=>17631, -62777=>17632, -138177=>17633, -62778=>17633, -194680=>17634, -62779=>17634, -12205=>17635, -38737=>17635, -62780=>17635, -131206=>17636, -62781=>17636, -20059=>17637, -62782=>17637, -20155=>17638, -62783=>17638, -13630=>17639, -62784=>17639, -23587=>17640, -62785=>17640, -24401=>17641, -62786=>17641, -24516=>17642, -62787=>17642, -14586=>17643, -62788=>17643, -25164=>17644, -62789=>17644, -25909=>17645, -62790=>17645, -27514=>17646, -62791=>17646, -27701=>17647, -62792=>17647, -27706=>17648, -62793=>17648, -28780=>17649, -62794=>17649, -29227=>17650, -62795=>17650, -20012=>17651, -62796=>17651, -29357=>17652, -62797=>17652, -149737=>17653, -62798=>17653, -32594=>17654, -62799=>17654, -31035=>17655, -62800=>17655, -31993=>17656, -62801=>17656, -32595=>17657, -62802=>17657, -156266=>17658, -62803=>17658, -13505=>17659, -62804=>17659, -156491=>17660, -62806=>17660, -32770=>17661, -62807=>17661, -32896=>17662, -62808=>17662, -157202=>17663, -62809=>17663, -158033=>17664, -62810=>17664, -21341=>17665, -62811=>17665, -34916=>17666, -62812=>17666, -35265=>17667, -62813=>17667, -161970=>17668, -62814=>17668, -35744=>17669, -62815=>17669, -36125=>17670, -62816=>17670, -38021=>17671, -62817=>17671, -38264=>17672, -62818=>17672, -38271=>17673, -62819=>17673, -38376=>17674, -62820=>17674, -167439=>17675, -62821=>17675, -38886=>17676, -62822=>17676, -39029=>17677, -62823=>17677, -39118=>17678, -62824=>17678, -39134=>17679, -62825=>17679, -39267=>17680, -62826=>17680, -170000=>17681, -62827=>17681, -40060=>17682, -62828=>17682, -40479=>17683, -62829=>17683, -40644=>17684, -62830=>17684, -27503=>17685, -62831=>17685, -63751=>17686, -62832=>17686, -20023=>17687, -62833=>17687, -131207=>17688, -62834=>17688, -38429=>17689, -62835=>17689, -25143=>17690, -62836=>17690, -38050=>17691, -62837=>17691, -11908=>17692, -63521=>17692, -11910=>17693, -63522=>17693, -11911=>17694, -63523=>17694, -11912=>17695, -63524=>17695, -11914=>17696, -63525=>17696, -11916=>17697, -63526=>17697, -11917=>17698, -63527=>17698, -11925=>17699, -63528=>17699, -11932=>17700, -63529=>17700, -11941=>17701, -63531=>17701, -11943=>17702, -63532=>17702, -11946=>17703, -63533=>17703, -11948=>17704, -63534=>17704, -11950=>17705, -63535=>17705, -11958=>17706, -63536=>17706, -11964=>17707, -63537=>17707, -11966=>17708, -63538=>17708, -11978=>17709, -63540=>17709, -11980=>17710, -63541=>17710, -11981=>17711, -63542=>17711, -11983=>17712, -63543=>17712, -11990=>17713, -63544=>17713, -11991=>17714, -63545=>17714, -11998=>17715, -63546=>17715, -172969=>17716, -62368=>17716, -135493=>17717, -62369=>17717, -25866=>17718, -62371=>17718, -20029=>17719, -62374=>17719, -28381=>17720, -62375=>17720, -40270=>17721, -62376=>17721, -37343=>17722, -62377=>17722, -62380=>17723, -161589=>17723, -20250=>17724, -62382=>17724, -20264=>17725, -62383=>17725, -20392=>17726, -62384=>17726, -20852=>17727, -62386=>17727, -20892=>17728, -62387=>17728, -20964=>17729, -62388=>17729, -21153=>17730, -62389=>17730, -21160=>17731, -62390=>17731, -21307=>17732, -62391=>17732, -21326=>17733, -62392=>17733, -21457=>17734, -62393=>17734, -21464=>17735, -62394=>17735, -22242=>17736, -62395=>17736, -22768=>17737, -62396=>17737, -22788=>17738, -62397=>17738, -22791=>17739, -62398=>17739, -22834=>17740, -62399=>17740, -22836=>17741, -62400=>17741, -23398=>17742, -62401=>17742, -23454=>17743, -62402=>17743, -23455=>17744, -62403=>17744, -23706=>17745, -62404=>17745, -24198=>17746, -62405=>17746, -24635=>17747, -62406=>17747, -25993=>17748, -62407=>17748, -26622=>17749, -62408=>17749, -26628=>17750, -62409=>17750, -26725=>17751, -62410=>17751, -27982=>17752, -62411=>17752, -28860=>17753, -62412=>17753, -30005=>17754, -62413=>17754, -32420=>17755, -62414=>17755, -32428=>17756, -62415=>17756, -32442=>17757, -62416=>17757, -32455=>17758, -62417=>17758, -32463=>17759, -62418=>17759, -32479=>17760, -62419=>17760, -32518=>17761, -62420=>17761, -32567=>17762, -62421=>17762, -33402=>17763, -62422=>17763, -33487=>17764, -62423=>17764, -33647=>17765, -62424=>17765, -35270=>17766, -62425=>17766, -35774=>17767, -62426=>17767, -35810=>17768, -62427=>17768, -36710=>17769, -62428=>17769, -36711=>17770, -62429=>17770, -36718=>17771, -62430=>17771, -29713=>17772, -62431=>17772, -31996=>17773, -62432=>17773, -32205=>17774, -62433=>17774, -26950=>17775, -62434=>17775, -31433=>17776, -62435=>17776, -30904=>17777, -62442=>17777, -32956=>17778, -62444=>17778, -36107=>17779, -62446=>17779, -33014=>17780, -62447=>17780, -133607=>17781, -62448=>17781, -32927=>17782, -62451=>17782, -40647=>17783, -62452=>17783, -19661=>17784, -62453=>17784, -40393=>17785, -62454=>17785, -40460=>17786, -62455=>17786, -19518=>17787, -62456=>17787, -171510=>17788, -62457=>17788, -159758=>17789, -62458=>17789, -40458=>17790, -62459=>17790, -172339=>17791, -62460=>17791, -13761=>17792, -62461=>17792, -28314=>17793, -62463=>17793, -33342=>17794, -62464=>17794, -29977=>17795, -62465=>17795, -18705=>17796, -62467=>17796, -39532=>17797, -62468=>17797, -39567=>17798, -62469=>17798, -40857=>17799, -62470=>17799, -31111=>17800, -62471=>17800, -164972=>17801, -62472=>17801, -138698=>17802, -62473=>17802, -132560=>17803, -62474=>17803, -142054=>17804, -62475=>17804, -20004=>17805, -62476=>17805, -20096=>17806, -62478=>17806, -20103=>17807, -62479=>17807, -20159=>17808, -62480=>17808, -20203=>17809, -62481=>17809, -20279=>17810, -62482=>17810, -13388=>17811, -62483=>17811, -20413=>17812, -62484=>17812, -15944=>17813, -62485=>17813, -20483=>17814, -62486=>17814, -13437=>17815, -62488=>17815, -13477=>17816, -62490=>17816, -22789=>17817, -62492=>17817, -20955=>17818, -62493=>17818, -20988=>17819, -62494=>17819, -20105=>17820, -62496=>17820, -21136=>17821, -62498=>17821, -21287=>17822, -62499=>17822, -13767=>17823, -62500=>17823, -21417=>17824, -62501=>17824, -13649=>17825, -62502=>17825, -21424=>17826, -62503=>17826, -21539=>17827, -62506=>17827, -13677=>17828, -62507=>17828, -13682=>17829, -62508=>17829, -13953=>17830, -62509=>17830, -21651=>17831, -62510=>17831, -21667=>17832, -62511=>17832, -21684=>17833, -62512=>17833, -21689=>17834, -62513=>17834, -21712=>17835, -62514=>17835, -21743=>17836, -62515=>17836, -21784=>17837, -62516=>17837, -21795=>17838, -62517=>17838, -21800=>17839, -62518=>17839, -13720=>17840, -62519=>17840, -13733=>17841, -62521=>17841, -13759=>17842, -62522=>17842, -21975=>17843, -62523=>17843, -13765=>17844, -62524=>17844, -163204=>17845, -62525=>17845, -16467=>17846, -62538=>17846, -62551=>17847, -135412=>17847, -62555=>17848, -134155=>17848, -62574=>17849, -161992=>17849, -62580=>17850, -155813=>17850, -62583=>17851, -142668=>17851, -62585=>17852, -135287=>17852, -62587=>17853, -135279=>17853, -62595=>17854, -139681=>17854, -62609=>17855, -134550=>17855, -16571=>17856, -62611=>17856, -62631=>17857, -142537=>17857, -22098=>17858, -62641=>17858, -134961=>17859, -62642=>17859, -62657=>17860, -157724=>17860, -135375=>17861, -62659=>17861, -141315=>17862, -62660=>17862, -141625=>17863, -62661=>17863, -13819=>17864, -62662=>17864, -152035=>17865, -62663=>17865, -134796=>17866, -62664=>17866, -135053=>17867, -62665=>17867, -134826=>17868, -62666=>17868, -16275=>17869, -62667=>17869, -134960=>17870, -62668=>17870, -134471=>17871, -62669=>17871, -135503=>17872, -62670=>17872, -134732=>17873, -62671=>17873, -134827=>17874, -62673=>17874, -134057=>17875, -62674=>17875, -134472=>17876, -62675=>17876, -135360=>17877, -62676=>17877, -135485=>17878, -62677=>17878, -16377=>17879, -62678=>17879, -140950=>17880, -62679=>17880, -25650=>17881, -62680=>17881, -135085=>17882, -62681=>17882, -144372=>17883, -62682=>17883, -62685=>17884, -134526=>17884, -62686=>17885, -134527=>17885, -62688=>17886, -142421=>17886, -62690=>17887, -134808=>17887, -62692=>17888, -134958=>17888, -62694=>17889, -158544=>17889, -21708=>17890, -62699=>17890, -33476=>17891, -62700=>17891, -21945=>17892, -62701=>17892, -171715=>17893, -62703=>17893, -39974=>17894, -62704=>17894, -39606=>17895, -62705=>17895, -62707=>17896, -142830=>17896, -33004=>17897, -62710=>17897, -23580=>17898, -62711=>17898, -157042=>17899, -62712=>17899, -33076=>17900, -62713=>17900, -14231=>17901, -62714=>17901, -164029=>17902, -62716=>17902, -37302=>17903, -62717=>17903, -134906=>17904, -62718=>17904, -134671=>17905, -62719=>17905, -134775=>17906, -62720=>17906, -134907=>17907, -62721=>17907, -151019=>17908, -62723=>17908, -13833=>17909, -62724=>17909, -134358=>17910, -62725=>17910, -22191=>17911, -62726=>17911, -141237=>17912, -62727=>17912, -135369=>17913, -62728=>17913, -134672=>17914, -62729=>17914, -134776=>17915, -62730=>17915, -135288=>17916, -62731=>17916, -135496=>17917, -62732=>17917, -164359=>17918, -62733=>17918, -136277=>17919, -62734=>17919, -134777=>17920, -62735=>17920, -151120=>17921, -62736=>17921, -142756=>17922, -62737=>17922, -23124=>17923, -62738=>17923, -62739=>17924, -135197=>17924, -62740=>17925, -135198=>17925, -62741=>17926, -135413=>17926, -62742=>17927, -135414=>17927, -22428=>17928, -62743=>17928, -134673=>17929, -62744=>17929, -161428=>17930, -62745=>17930, -164557=>17931, -62746=>17931, -135093=>17932, -62747=>17932, -134779=>17933, -62748=>17933, -151934=>17934, -62749=>17934, -14083=>17935, -62750=>17935, -135094=>17936, -62751=>17936, -135552=>17937, -62752=>17937, -152280=>17938, -62753=>17938, -172733=>17939, -62754=>17939, -149978=>17940, -62755=>17940, -137274=>17941, -62756=>17941, -147831=>17942, -62757=>17942, -164476=>17943, -62758=>17943, -22681=>17944, -62759=>17944, -21096=>17945, -62760=>17945, -13850=>17946, -62761=>17946, -153405=>17947, -62762=>17947, -31666=>17948, -62763=>17948, -23400=>17949, -62764=>17949, -18432=>17950, -62765=>17950, -19244=>17951, -62766=>17951, -40743=>17952, -62767=>17952, -18919=>17953, -62768=>17953, -39967=>17954, -62769=>17954, -39821=>17955, -62770=>17955, -154484=>17956, -62771=>17956, -143677=>17957, -62772=>17957, -22011=>17958, -62773=>17958, -13810=>17959, -62774=>17959, -22153=>17960, -62775=>17960, -23870=>17961, -63028=>17961, -23880=>17962, -63029=>17962, -15868=>17963, -63031=>17963, -14351=>17964, -63032=>17964, -23972=>17965, -63033=>17965, -23993=>17966, -63034=>17966, -14368=>17967, -63035=>17967, -24357=>17968, -63039=>17968, -24451=>17969, -63040=>17969, -14600=>17970, -63041=>17970, -14655=>17971, -63043=>17971, -14669=>17972, -63044=>17972, -24791=>17973, -63045=>17973, -24893=>17974, -63046=>17974, -23781=>17975, -63047=>17975, -14729=>17976, -63048=>17976, -25015=>17977, -63049=>17977, -25039=>17978, -63051=>17978, -14776=>17979, -63052=>17979, -25132=>17980, -63053=>17980, -25317=>17981, -63055=>17981, -14840=>17982, -63057=>17982, -22193=>17983, -63058=>17983, -14851=>17984, -63059=>17984, -25570=>17985, -63060=>17985, -25595=>17986, -63061=>17986, -25607=>17987, -63062=>17987, -14923=>17988, -63064=>17988, -25792=>17989, -63065=>17989, -40863=>17990, -63068=>17990, -14999=>17991, -63069=>17991, -25990=>17992, -63070=>17992, -15037=>17993, -63071=>17993, -26111=>17994, -63072=>17994, -26195=>17995, -63073=>17995, -15090=>17996, -63074=>17996, -26258=>17997, -63075=>17997, -15138=>17998, -63076=>17998, -26390=>17999, -63077=>17999, -15170=>18000, -63078=>18000, -26532=>18001, -63079=>18001, -15192=>18002, -63081=>18002, -26698=>18003, -63082=>18003, -26756=>18004, -63083=>18004, -15218=>18005, -63084=>18005, -15217=>18006, -63085=>18006, -15227=>18007, -63086=>18007, -26889=>18008, -63087=>18008, -26947=>18009, -63088=>18009, -29276=>18010, -63089=>18010, -26980=>18011, -63090=>18011, -27039=>18012, -63091=>18012, -27013=>18013, -63092=>18013, -27094=>18014, -63094=>18014, -15325=>18015, -63095=>18015, -27237=>18016, -63096=>18016, -27252=>18017, -63097=>18017, -27249=>18018, -63098=>18018, -27266=>18019, -63099=>18019, -15340=>18020, -63100=>18020, -27289=>18021, -63101=>18021, -15346=>18022, -63102=>18022, -27307=>18023, -63103=>18023, -27317=>18024, -63104=>18024, -27348=>18025, -63105=>18025, -27382=>18026, -63106=>18026, -27521=>18027, -63107=>18027, -27585=>18028, -63108=>18028, -27626=>18029, -63109=>18029, -27765=>18030, -63110=>18030, -27818=>18031, -63111=>18031, -15563=>18032, -63112=>18032, -27906=>18033, -63113=>18033, -27910=>18034, -63114=>18034, -27942=>18035, -63115=>18035, -28033=>18036, -63116=>18036, -15599=>18037, -63117=>18037, -28068=>18038, -63118=>18038, -28081=>18039, -63119=>18039, -28181=>18040, -63120=>18040, -28184=>18041, -63121=>18041, -28201=>18042, -63122=>18042, -28294=>18043, -63123=>18043, -166336=>18044, -63124=>18044, -28347=>18045, -63125=>18045, -28386=>18046, -63126=>18046, -28378=>18047, -63127=>18047, -40831=>18048, -63128=>18048, -28392=>18049, -63129=>18049, -28393=>18050, -63130=>18050, -28452=>18051, -63131=>18051, -28468=>18052, -63132=>18052, -15686=>18053, -63133=>18053, -147265=>18054, -63134=>18054, -28545=>18055, -63135=>18055, -28606=>18056, -63136=>18056, -15722=>18057, -63137=>18057, -15733=>18058, -63138=>18058, -29111=>18059, -63139=>18059, -23705=>18060, -63140=>18060, -15754=>18061, -63141=>18061, -28716=>18062, -63142=>18062, -15761=>18063, -63143=>18063, -28752=>18064, -63144=>18064, -28756=>18065, -63145=>18065, -28783=>18066, -63146=>18066, -28799=>18067, -63147=>18067, -131877=>18068, -63149=>18068, -17345=>18069, -63150=>18069, -13809=>18070, -63151=>18070, -134872=>18071, -63152=>18071, -13902=>18072, -58134=>18072, -15789=>18073, -58172=>18073, -154725=>18074, -58173=>18074, -26237=>18075, -58183=>18075, -31860=>18076, -58188=>18076, -29837=>18077, -58197=>18077, -32402=>18078, -58215=>18078, -17667=>18079, -58232=>18079, -58260=>18080, -151480=>18080, -58270=>18081, -133901=>18081, -58277=>18082, -158474=>18082, -13438=>18083, -58311=>18083, -58317=>18084, -143087=>18084, -58325=>18085, -146613=>18085, -58343=>18086, -159385=>18086, -34673=>18087, -58364=>18087, -25537=>18088, -58385=>18088, -30583=>18089, -58387=>18089, -35210=>18090, -58390=>18090, -58406=>18091, -147343=>18091, -35660=>18092, -58415=>18092, -58440=>18093, -150729=>18093, -18730=>18094, -58464=>18094, -172052=>18095, -58471=>18095, -165564=>18096, -58472=>18096, -165121=>18097, -58473=>18097, -15088=>18098, -58490=>18098, -28815=>18099, -58511=>18099, -58529=>18100, -140922=>18100, -58637=>18101, -158120=>18101, -58646=>18102, -148043=>18102, -26760=>18103, -58662=>18103, -58664=>18104, -139611=>18104, -40802=>18105, -58702=>18105, -37830=>18106, -58793=>18106, -58802=>18107, -131967=>18107, -37734=>18108, -58888=>18108, -37519=>18109, -58901=>18109, -34324=>18110, -58954=>18110, -58986=>18111, -173147=>18111, -16784=>18112, -59010=>18112, -26511=>18113, -59045=>18113, -26654=>18114, -59048=>18114, -14435=>18115, -59051=>18115, -59077=>18116, -149996=>18116, -15129=>18117, -59128=>18117, -33942=>18118, -59176=>18118, -59241=>18119, -149858=>18119, -14818=>18120, -59254=>18120, -33920=>18121, -59259=>18121, -17262=>18122, -59328=>18122, -38769=>18123, -59402=>18123, -39323=>18124, -59427=>18124, -18733=>18125, -59499=>18125, -28439=>18126, -59703=>18126, -160009=>18127, -59704=>18127, -28838=>18128, -59746=>18128, -150095=>18129, -59752=>18129, -32357=>18130, -59753=>18130, -23855=>18131, -59755=>18131, -15859=>18132, -59756=>18132, -150109=>18133, -59758=>18133, -137183=>18134, -59759=>18134, -32164=>18135, -59760=>18135, -33830=>18136, -59761=>18136, -21637=>18137, -59762=>18137, -146170=>18138, -59763=>18138, -131604=>18139, -59765=>18139, -22398=>18140, -59766=>18140, -133333=>18141, -59767=>18141, -132633=>18142, -59768=>18142, -16357=>18143, -59769=>18143, -139166=>18144, -59770=>18144, -172726=>18145, -59771=>18145, -28675=>18146, -59772=>18146, -168283=>18147, -59773=>18147, -23920=>18148, -59774=>18148, -29583=>18149, -59775=>18149, -166489=>18150, -59777=>18150, -168992=>18151, -59778=>18151, -20424=>18152, -59779=>18152, -32743=>18153, -59780=>18153, -29456=>18154, -59782=>18154, -29496=>18155, -59784=>18155, -29505=>18156, -59787=>18156, -16041=>18157, -59789=>18157, -29173=>18158, -59792=>18158, -149746=>18159, -59793=>18159, -29665=>18160, -59794=>18160, -16074=>18161, -59796=>18161, -16081=>18162, -59798=>18162, -29721=>18163, -59801=>18163, -29726=>18164, -59802=>18164, -29727=>18165, -59803=>18165, -16098=>18166, -59804=>18166, -16112=>18167, -59805=>18167, -16116=>18168, -59806=>18168, -16122=>18169, -59807=>18169, -29907=>18170, -59808=>18170, -16142=>18171, -59809=>18171, -16211=>18172, -59810=>18172, -30061=>18173, -59812=>18173, -30066=>18174, -59813=>18174, -30093=>18175, -59814=>18175, -16252=>18176, -59815=>18176, -30152=>18177, -59816=>18177, -30285=>18178, -59819=>18178, -30324=>18179, -59821=>18179, -16348=>18180, -59822=>18180, -30330=>18181, -59823=>18181, -29064=>18182, -59825=>18182, -22051=>18183, -59826=>18183, -35200=>18184, -59827=>18184, -16413=>18185, -59829=>18185, -30531=>18186, -59830=>18186, -16441=>18187, -59831=>18187, -16453=>18188, -59833=>18188, -13787=>18189, -59834=>18189, -30616=>18190, -59835=>18190, -16490=>18191, -59836=>18191, -16495=>18192, -59837=>18192, -30654=>18193, -59839=>18193, -30667=>18194, -59840=>18194, -30744=>18195, -59842=>18195, -30748=>18196, -59844=>18196, -30791=>18197, -59847=>18197, -30801=>18198, -59848=>18198, -30822=>18199, -59849=>18199, -33864=>18200, -59850=>18200, -152885=>18201, -59851=>18201, -31027=>18202, -59852=>18202, -31026=>18203, -59854=>18203, -16649=>18204, -59856=>18204, -31121=>18205, -59857=>18205, -31238=>18206, -59860=>18206, -16743=>18207, -59862=>18207, -16818=>18208, -59864=>18208, -31420=>18209, -59865=>18209, -33401=>18210, -59866=>18210, -16836=>18211, -59867=>18211, -31439=>18212, -59868=>18212, -31451=>18213, -59869=>18213, -16847=>18214, -59870=>18214, -31586=>18215, -59872=>18215, -31596=>18216, -59873=>18216, -31611=>18217, -59874=>18217, -31762=>18218, -59875=>18218, -16992=>18219, -59877=>18219, -17018=>18220, -59878=>18220, -31867=>18221, -59879=>18221, -31900=>18222, -59880=>18222, -17036=>18223, -59881=>18223, -31928=>18224, -59882=>18224, -17044=>18225, -59883=>18225, -36755=>18226, -59885=>18226, -28864=>18227, -59886=>18227, -134351=>18228, -59887=>18228, -32207=>18229, -59888=>18229, -32212=>18230, -59889=>18230, -32208=>18231, -59890=>18231, -32253=>18232, -59891=>18232, -32692=>18233, -59893=>18233, -29343=>18234, -59894=>18234, -17303=>18235, -59895=>18235, -32800=>18236, -59896=>18236, -32805=>18237, -59897=>18237, -32814=>18238, -59899=>18238, -32817=>18239, -59900=>18239, -32852=>18240, -59901=>18240, -22452=>18241, -59903=>18241, -28832=>18242, -59904=>18242, -32951=>18243, -59905=>18243, -33001=>18244, -59906=>18244, -17389=>18245, -59907=>18245, -33036=>18246, -59908=>18246, -33038=>18247, -59910=>18247, -33042=>18248, -59911=>18248, -33044=>18249, -59913=>18249, -17409=>18250, -59914=>18250, -15161=>18251, -59915=>18251, -33110=>18252, -59916=>18252, -33113=>18253, -59917=>18253, -33114=>18254, -59918=>18254, -17427=>18255, -59919=>18255, -33148=>18256, -59921=>18256, -17445=>18257, -59923=>18257, -17453=>18258, -59925=>18258, -33189=>18259, -59926=>18259, -22511=>18260, -59927=>18260, -33217=>18261, -59928=>18261, -33252=>18262, -59929=>18262, -33364=>18263, -59930=>18263, -17551=>18264, -59931=>18264, -33398=>18265, -59933=>18265, -33482=>18266, -59934=>18266, -33496=>18267, -59935=>18267, -17584=>18268, -59937=>18268, -33623=>18269, -59938=>18269, -38505=>18270, -59939=>18270, -33797=>18271, -59941=>18271, -28917=>18272, -59942=>18272, -33892=>18273, -59943=>18273, -33928=>18274, -59945=>18274, -17668=>18275, -59946=>18275, -33982=>18276, -59947=>18276, -34017=>18277, -59948=>18277, -34040=>18278, -59949=>18278, -34064=>18279, -59950=>18279, -34104=>18280, -59951=>18280, -34130=>18281, -59952=>18281, -17723=>18282, -59953=>18282, -34159=>18283, -59954=>18283, -34160=>18284, -59955=>18284, -34272=>18285, -59956=>18285, -17783=>18286, -59957=>18286, -34418=>18287, -59958=>18287, -34450=>18288, -59959=>18288, -34543=>18289, -59961=>18289, -38469=>18290, -59962=>18290, -17926=>18291, -59964=>18291, -17943=>18292, -59965=>18292, -34990=>18293, -59966=>18293, -35071=>18294, -59967=>18294, -35108=>18295, -59968=>18295, -35217=>18296, -59970=>18296, -162151=>18297, -59971=>18297, -35384=>18298, -59973=>18298, -35476=>18299, -59974=>18299, -35508=>18300, -59975=>18300, -35921=>18301, -59976=>18301, -36052=>18302, -59977=>18302, -36082=>18303, -59978=>18303, -36124=>18304, -59979=>18304, -18328=>18305, -59980=>18305, -36291=>18306, -59982=>18306, -18413=>18307, -59983=>18307, -36410=>18308, -59985=>18308, -22356=>18309, -59987=>18309, -22005=>18310, -59989=>18310, -18487=>18311, -59991=>18311, -36558=>18312, -59992=>18312, -36578=>18313, -59993=>18313, -36580=>18314, -59994=>18314, -36589=>18315, -59995=>18315, -36594=>18316, -59996=>18316, -36801=>18317, -59998=>18317, -36810=>18318, -59999=>18318, -36812=>18319, -60000=>18319, -36915=>18320, -60001=>18320, -18605=>18321, -60003=>18321, -39136=>18322, -60004=>18322, -37395=>18323, -60005=>18323, -18718=>18324, -60006=>18324, -37416=>18325, -60007=>18325, -37464=>18326, -60008=>18326, -37483=>18327, -60009=>18327, -37553=>18328, -60010=>18328, -37550=>18329, -60011=>18329, -37567=>18330, -60012=>18330, -37603=>18331, -60013=>18331, -37611=>18332, -60014=>18332, -37619=>18333, -60015=>18333, -37620=>18334, -60016=>18334, -37629=>18335, -60017=>18335, -37699=>18336, -60018=>18336, -37764=>18337, -60019=>18337, -37805=>18338, -60020=>18338, -18757=>18339, -60021=>18339, -18769=>18340, -60022=>18340, -37911=>18341, -60024=>18341, -37917=>18342, -60026=>18342, -37933=>18343, -60027=>18343, -37950=>18344, -60028=>18344, -18794=>18345, -60029=>18345, -37972=>18346, -60030=>18346, -38009=>18347, -60031=>18347, -38189=>18348, -60032=>18348, -38306=>18349, -60033=>18349, -18855=>18350, -60034=>18350, -38388=>18351, -60035=>18351, -38451=>18352, -60036=>18352, -18917=>18353, -60037=>18353, -18980=>18354, -60039=>18354, -38720=>18355, -60040=>18355, -18997=>18356, -60041=>18356, -38834=>18357, -60042=>18357, -38850=>18358, -60043=>18358, -19172=>18359, -60045=>18359, -39097=>18360, -60047=>18360, -19225=>18361, -60048=>18361, -39153=>18362, -60049=>18362, -22596=>18363, -60050=>18363, -39193=>18364, -60052=>18364, -39223=>18365, -60055=>18365, -39261=>18366, -60057=>18366, -39266=>18367, -60058=>18367, -19312=>18368, -60059=>18368, -39365=>18369, -60060=>18369, -19357=>18370, -60061=>18370, -39484=>18371, -60062=>18371, -39695=>18372, -60063=>18372, -39785=>18373, -60065=>18373, -39901=>18374, -60067=>18374, -39921=>18375, -60068=>18375, -39924=>18376, -60069=>18376, -19565=>18377, -60070=>18377, -39968=>18378, -60071=>18378, -14191=>18379, -60072=>18379, -138178=>18380, -60073=>18380, -40265=>18381, -60074=>18381, -40702=>18382, -60076=>18382, -22096=>18383, -60077=>18383, -40381=>18384, -60079=>18384, -40444=>18385, -60081=>18385, -38134=>18386, -60082=>18386, -36790=>18387, -60083=>18387, -40625=>18388, -60086=>18388, -40637=>18389, -60087=>18389, -40646=>18390, -60088=>18390, -38108=>18391, -60089=>18391, -40674=>18392, -60090=>18392, -40689=>18393, -60091=>18393, -40696=>18394, -60092=>18394, -40772=>18395, -60094=>18395, -131220=>18396, -60095=>18396, -131767=>18397, -60096=>18397, -132000=>18398, -60097=>18398, -38083=>18399, -60099=>18399, -60101=>18400, -132311=>18400, -38081=>18401, -60103=>18401, -132565=>18402, -60105=>18402, -132629=>18403, -60106=>18403, -132726=>18404, -60107=>18404, -136890=>18405, -60108=>18405, -22359=>18406, -60109=>18406, -29043=>18407, -60110=>18407, -133826=>18408, -60111=>18408, -133837=>18409, -60112=>18409, -134079=>18410, -60113=>18410, -194619=>18411, -60115=>18411, -134091=>18412, -60116=>18412, -21662=>18413, -60117=>18413, -134139=>18414, -60118=>18414, -134203=>18415, -60119=>18415, -134227=>18416, -60120=>18416, -134245=>18417, -60121=>18417, -134268=>18418, -60122=>18418, -60124=>18419, -134285=>18419, -134325=>18420, -60126=>18420, -134365=>18421, -60127=>18421, -134381=>18422, -60128=>18422, -134511=>18423, -60129=>18423, -134578=>18424, -60130=>18424, -134600=>18425, -60131=>18425, -134660=>18426, -60135=>18426, -134670=>18427, -60136=>18427, -134871=>18428, -60137=>18428, -135056=>18429, -60138=>18429, -134957=>18430, -60139=>18430, -134771=>18431, -60140=>18431, -60142=>18432, -135100=>18432, -135260=>18433, -60144=>18433, -135247=>18434, -60145=>18434, -135286=>18435, -60146=>18435, -135304=>18436, -60149=>18436, -135318=>18437, -60150=>18437, -13895=>18438, -60151=>18438, -135359=>18439, -60152=>18439, -135471=>18440, -60154=>18440, -135483=>18441, -60155=>18441, -21348=>18442, -60156=>18442, -135907=>18443, -60158=>18443, -136053=>18444, -60159=>18444, -60160=>18445, -135990=>18445, -136567=>18446, -60162=>18446, -136729=>18447, -60163=>18447, -137155=>18448, -60164=>18448, -137159=>18449, -60165=>18449, -28859=>18450, -60167=>18450, -137261=>18451, -60168=>18451, -137578=>18452, -60169=>18452, -137773=>18453, -60170=>18453, -137797=>18454, -60171=>18454, -138282=>18455, -60172=>18455, -138352=>18456, -60173=>18456, -138412=>18457, -60174=>18457, -138952=>18458, -60175=>18458, -138965=>18459, -60177=>18459, -139029=>18460, -60178=>18460, -29080=>18461, -60179=>18461, -139333=>18462, -60181=>18462, -27113=>18463, -60182=>18463, -14024=>18464, -60183=>18464, -139900=>18465, -60184=>18465, -140247=>18466, -60185=>18466, -140282=>18467, -60186=>18467, -141098=>18468, -60187=>18468, -141425=>18469, -60188=>18469, -141647=>18470, -60189=>18470, -141671=>18471, -60191=>18471, -141715=>18472, -60192=>18472, -142037=>18473, -60193=>18473, -60195=>18474, -142056=>18474, -60197=>18475, -142094=>18475, -60199=>18476, -142143=>18476, -60202=>18477, -142412=>18477, -142472=>18478, -60204=>18478, -142519=>18479, -60205=>18479, -154600=>18480, -60206=>18480, -142600=>18481, -60207=>18481, -142610=>18482, -60208=>18482, -142775=>18483, -60209=>18483, -142741=>18484, -60210=>18484, -142914=>18485, -60211=>18485, -143220=>18486, -60212=>18486, -143308=>18487, -60213=>18487, -143411=>18488, -60214=>18488, -143462=>18489, -60215=>18489, -144159=>18490, -60216=>18490, -144350=>18491, -60217=>18491, -144743=>18492, -60222=>18492, -144883=>18493, -60223=>18493, -144922=>18494, -60227=>18494, -145174=>18495, -60228=>18495, -22709=>18496, -60231=>18496, -60234=>18497, -146087=>18497, -146961=>18498, -60237=>18498, -147129=>18499, -60238=>18499, -60243=>18500, -147737=>18500, -148206=>18501, -60245=>18501, -148237=>18502, -60246=>18502, -148276=>18503, -60248=>18503, -148374=>18504, -60249=>18504, -148484=>18505, -60258=>18505, -148694=>18506, -60259=>18506, -22408=>18507, -60260=>18507, -149108=>18508, -60261=>18508, -60263=>18509, -149295=>18509, -149522=>18510, -60271=>18510, -149755=>18511, -60272=>18511, -150037=>18512, -60273=>18512, -60275=>18513, -150208=>18513, -22885=>18514, -60277=>18514, -60279=>18515, -151430=>18515, -60282=>18516, -151596=>18516, -22335=>18517, -60284=>18517, -152217=>18518, -60286=>18518, -152601=>18519, -60287=>18519, -152646=>18520, -60291=>18520, -152686=>18521, -60292=>18521, -60296=>18522, -152895=>18522, -60298=>18523, -152926=>18523, -152930=>18524, -60300=>18524, -152934=>18525, -60301=>18525, -153543=>18526, -60302=>18526, -60304=>18527, -153693=>18527, -60309=>18528, -153859=>18528, -154286=>18529, -60312=>18529, -154505=>18530, -60313=>18530, -154630=>18531, -60314=>18531, -22433=>18532, -60316=>18532, -29009=>18533, -60317=>18533, -60319=>18534, -155906=>18534, -60322=>18535, -156082=>18535, -156674=>18536, -60325=>18536, -156746=>18537, -60326=>18537, -60330=>18538, -156804=>18538, -60334=>18539, -156808=>18539, -60336=>18540, -156946=>18540, -157119=>18541, -60338=>18541, -157365=>18542, -60339=>18542, -22201=>18543, -60347=>18543, -60349=>18544, -157436=>18544, -13848=>18545, -60355=>18545, -157593=>18546, -60357=>18546, -157806=>18547, -60358=>18547, -60360=>18548, -157790=>18548, -60362=>18549, -157895=>18549, -60366=>18550, -157990=>18550, -60368=>18551, -158009=>18551, -60371=>18552, -158202=>18552, -60373=>18553, -158253=>18553, -158260=>18554, -60378=>18554, -158555=>18555, -60379=>18555, -60383=>18556, -158621=>18556, -60385=>18557, -158884=>18557, -60388=>18558, -159150=>18558, -159819=>18559, -60392=>18559, -160205=>18560, -60393=>18560, -160384=>18561, -60395=>18561, -160389=>18562, -60396=>18562, -60399=>18563, -160395=>18563, -60401=>18564, -160486=>18564, -38047=>18565, -60404=>18565, -160848=>18566, -60405=>18566, -14009=>18567, -60416=>18567, -161740=>18568, -60424=>18568, -161880=>18569, -60425=>18569, -22230=>18570, -60426=>18570, -60435=>18571, -162269=>18571, -162301=>18572, -60441=>18572, -162314=>18573, -60442=>18573, -162571=>18574, -60443=>18574, -163174=>18575, -60444=>18575, -60448=>18576, -163849=>18576, -60459=>18577, -163875=>18577, -60463=>18578, -163912=>18578, -60466=>18579, -163971=>18579, -163984=>18580, -60479=>18580, -164084=>18581, -60480=>18581, -164142=>18582, -60481=>18582, -60483=>18583, -164175=>18583, -164271=>18584, -60485=>18584, -164378=>18585, -60486=>18585, -164614=>18586, -60487=>18586, -164655=>18587, -60488=>18587, -164746=>18588, -60489=>18588, -164968=>18589, -60491=>18589, -165546=>18590, -60492=>18590, -25574=>18591, -60494=>18591, -166230=>18592, -60495=>18592, -60498=>18593, -166328=>18593, -60500=>18594, -166375=>18594, -60502=>18595, -166376=>18595, -166726=>18596, -60503=>18596, -166868=>18597, -60504=>18597, -60506=>18598, -166921=>18598, -167877=>18599, -60508=>18599, -168172=>18600, -60509=>18600, -168208=>18601, -60511=>18601, -168252=>18602, -60512=>18602, -15863=>18603, -60513=>18603, -168286=>18604, -60514=>18604, -150218=>18605, -60515=>18605, -36816=>18606, -60516=>18606, -60519=>18607, -169191=>18607, -169392=>18608, -60521=>18608, -169400=>18609, -60522=>18609, -169778=>18610, -60523=>18610, -170193=>18611, -60524=>18611, -170313=>18612, -60525=>18612, -170346=>18613, -60526=>18613, -170435=>18614, -60527=>18614, -170536=>18615, -60528=>18615, -170766=>18616, -60529=>18616, -171354=>18617, -60530=>18617, -171419=>18618, -60531=>18618, -32415=>18619, -60532=>18619, -171768=>18620, -60533=>18620, -171811=>18621, -60534=>18621, -19620=>18622, -60535=>18622, -38215=>18623, -60536=>18623, -172691=>18624, -60537=>18624, -29090=>18625, -60538=>18625, -172799=>18626, -60539=>18626, -173515=>18627, -60542=>18627, -19868=>18628, -60543=>18628, -134300=>18629, -60544=>18629, -36798=>18630, -60545=>18630, -36794=>18631, -60547=>18631, -140464=>18632, -60548=>18632, -36793=>18633, -60549=>18633, -150163=>18634, -60550=>18634, -20202=>18635, -60555=>18635, -60557=>18636, -166700=>18636, -36480=>18637, -60560=>18637, -137205=>18638, -60561=>18638, -166764=>18639, -60563=>18639, -166809=>18640, -60564=>18640, -60566=>18641, -157359=>18641, -60568=>18642, -161365=>18642, -153141=>18643, -60570=>18643, -153942=>18644, -60571=>18644, -20122=>18645, -60572=>18645, -155265=>18646, -60573=>18646, -60576=>18647, -134765=>18647, -147080=>18648, -60579=>18648, -150686=>18649, -60580=>18649, -137206=>18650, -60583=>18650, -137339=>18651, -60584=>18651, -60587=>18652, -154698=>18652, -152337=>18653, -60589=>18653, -15814=>18654, -60590=>18654, -60596=>18655, -155352=>18655, -19996=>18656, -60600=>18656, -135146=>18657, -60601=>18657, -134473=>18658, -60602=>18658, -145082=>18659, -60603=>18659, -60638=>18660, -151880=>18660, -21982=>18661, -60644=>18661, -34694=>18662, -60672=>18662, -60676=>18663, -135361=>18663, -149254=>18664, -60679=>18664, -23440=>18665, -60680=>18665, -60682=>18666, -157843=>18666, -141044=>18667, -60684=>18667, -163119=>18668, -60685=>18668, -147875=>18669, -60686=>18669, -163187=>18670, -60687=>18670, -159440=>18671, -60688=>18671, -160438=>18672, -60689=>18672, -60691=>18673, -135641=>18673, -146684=>18674, -60693=>18674, -173737=>18675, -60694=>18675, -134828=>18676, -60695=>18676, -60698=>18677, -138402=>18677, -60700=>18678, -151490=>18678, -60702=>18679, -135147=>18679, -60706=>18680, -142752=>18680, -135148=>18681, -60710=>18681, -134666=>18682, -60711=>18682, -60714=>18683, -135149=>18683, -60717=>18684, -135559=>18684, -19994=>18685, -60721=>18685, -19972=>18686, -60722=>18686, -23309=>18687, -60724=>18687, -13996=>18688, -60727=>18688, -21373=>18689, -60729=>18689, -13989=>18690, -60730=>18690, -22682=>18691, -60732=>18691, -150382=>18692, -60733=>18692, -22442=>18693, -60736=>18693, -154261=>18694, -60737=>18694, -133497=>18695, -60738=>18695, -60741=>18696, -140389=>18696, -146686=>18697, -60746=>18697, -171824=>18698, -60747=>18698, -151465=>18699, -60749=>18699, -169374=>18700, -60750=>18700, -60753=>18701, -146870=>18701, -157619=>18702, -60755=>18702, -145184=>18703, -60756=>18703, -147191=>18704, -60759=>18704, -146988=>18705, -60760=>18705, -60785=>18706, -143578=>18706, -135849=>18707, -60789=>18707, -22439=>18708, -60790=>18708, -149859=>18709, -60791=>18709, -60794=>18710, -159918=>18710, -60801=>18711, -137068=>18711, -60806=>18712, -160100=>18712, -159010=>18713, -60809=>18713, -150242=>18714, -60810=>18714, -39963=>18715, -60837=>18715, -149822=>18716, -60838=>18716, -15878=>18717, -60846=>18717, -60881=>18718, -159011=>18718, -60887=>18719, -132092=>18719, -60891=>18720, -146685=>18720, -60893=>18721, -149785=>18721, -22394=>18722, -60904=>18722, -21722=>18723, -60912=>18723, -29050=>18724, -60928=>18724, -60949=>18725, -150135=>18725, -60955=>18726, -166490=>18726, -60962=>18727, -194624=>18727, -60976=>18728, -137275=>18728, -61000=>18729, -155993=>18729, -61014=>18730, -144373=>18730, -61019=>18731, -166850=>18731, -61024=>18732, -138566=>18732, -61054=>18733, -159441=>18733, -13877=>18734, -61065=>18734, -61084=>18735, -166701=>18735, -21024=>18736, -61088=>18736, -15384=>18737, -61089=>18737, -146631=>18738, -61090=>18738, -155351=>18739, -61091=>18739, -161366=>18740, -61092=>18740, -152881=>18741, -61093=>18741, -137540=>18742, -61094=>18742, -170243=>18743, -61096=>18743, -159196=>18744, -61097=>18744, -159917=>18745, -61098=>18745, -156077=>18746, -61100=>18746, -166415=>18747, -61101=>18747, -145015=>18748, -61102=>18748, -131310=>18749, -61103=>18749, -157766=>18750, -61104=>18750, -151310=>18751, -61105=>18751, -17762=>18752, -61106=>18752, -23327=>18753, -61107=>18753, -156492=>18754, -61108=>18754, -40784=>18755, -61109=>18755, -40614=>18756, -61110=>18756, -156267=>18757, -61111=>18757, -20962=>18758, -57415=>18758, -21314=>18759, -57416=>18759, -26285=>18760, -57520=>18760, -22620=>18761, -57547=>18761, -21843=>18762, -57566=>18762, -15749=>18763, -57594=>18763, -24928=>18764, -57608=>18764, -18606=>18765, -57668=>18765, -38845=>18766, -57676=>18766, -57693=>18767, -137335=>18767, -24755=>18768, -57703=>18768, -33828=>18769, -57711=>18769, -38932=>18770, -57748=>18770, -147596=>18771, -57749=>18771, -57764=>18772, -143486=>18772, -57787=>18773, -138813=>18773, -15147=>18774, -57798=>18774, -15666=>18775, -57824=>18775, -57857=>18776, -132021=>18776, -28801=>18777, -57944=>18777, -23708=>18778, -57959=>18778, -58017=>18779, -132547=>18779, -14128=>18780, -58028=>18780, -136054=>18781, -58096=>18781, -150034=>18782, -58097=>18782, -58111=>18783, -166699=>18783, -58112=>18784, -155779=>18784, -256=>18785, -62233=>18785, -193=>18786, -62234=>18786, -461=>18787, -62235=>18787, -192=>18788, -62236=>18788, -274=>18789, -62237=>18789, -201=>18790, -62238=>18790, -282=>18791, -62239=>18791, -200=>18792, -62240=>18792, -332=>18793, -62241=>18793, -211=>18794, -62242=>18794, -465=>18795, -62243=>18795, -210=>18796, -62244=>18796, -62245=>18797, -7870=>18798, -62246=>18798, -62247=>18799, -7872=>18800, -62248=>18800, -202=>18801, -62249=>18801, -257=>18802, -62250=>18802, -225=>18803, -62251=>18803, -462=>18804, -62252=>18804, -224=>18805, -62253=>18805, -593=>18806, -62254=>18806, -275=>18807, -62255=>18807, -233=>18808, -62256=>18808, -283=>18809, -62257=>18809, -232=>18810, -62258=>18810, -299=>18811, -62259=>18811, -237=>18812, -62260=>18812, -464=>18813, -62261=>18813, -236=>18814, -62262=>18814, -333=>18815, -62263=>18815, -243=>18816, -62264=>18816, -466=>18817, -62265=>18817, -242=>18818, -62266=>18818, -363=>18819, -62267=>18819, -250=>18820, -62268=>18820, -468=>18821, -62269=>18821, -249=>18822, -62270=>18822, -470=>18823, -62271=>18823, -472=>18824, -62272=>18824, -474=>18825, -62273=>18825, -476=>18826, -62274=>18826, -252=>18827, -62275=>18827, -62276=>18828, -7871=>18829, -62277=>18829, -62278=>18830, -7873=>18831, -62279=>18831, -234=>18832, -62280=>18832, -609=>18833, -62281=>18833, -643=>18834, -63551=>18834, -592=>18835, -63552=>18835, -603=>18836, -63553=>18836, -596=>18837, -63554=>18837, -629=>18838, -63555=>18838, -339=>18839, -63556=>18839, -248=>18840, -63557=>18840, -331=>18841, -63558=>18841, -650=>18842, -63559=>18842, -618=>18843, -63560=>18843, -9178=>18844, -62282=>18844, -9179=>18845, -62283=>18845, -11933=>18846, -63530=>18846, -11974=>18847, -63539=>18847, -12003=>18848, -63547=>18848, -20539=>18849, -28158=>18850, -171123=>18851, -62841=>18851, -40870=>18852, -62842=>18852, -15817=>18853, -62843=>18853, -34959=>18854, -62845=>18855, -147790=>18855, -28791=>18856, -23797=>18857, -19232=>18858, -62848=>18858, -152013=>18859, -62849=>18859, -13657=>18860, -62850=>18860, -154928=>18861, -62851=>18861, -24866=>18862, -62853=>18863, -166450=>18863, -36775=>18864, -37366=>18865, -29073=>18866, -26393=>18867, -29626=>18868, -144001=>18869, -62859=>18869, -172295=>18870, -62860=>18870, -15499=>18871, -62861=>18871, -137600=>18872, -62862=>18872, -19216=>18873, -62863=>18873, -30948=>18874, -29698=>18875, -20910=>18876, -165647=>18877, -62867=>18877, -16393=>18878, -62868=>18878, -27235=>18879, -172730=>18880, -62870=>18880, -16931=>18881, -62871=>18881, -34319=>18882, -31274=>18883, -170311=>18884, -62875=>18884, -166634=>18885, -62876=>18885, -38741=>18886, -28749=>18887, -21284=>18888, -62880=>18889, -139390=>18889, -37876=>18890, -30425=>18891, -166371=>18892, -62883=>18892, -40871=>18893, -62884=>18893, -30685=>18894, -20131=>18895, -20464=>18896, -20668=>18897, -20015=>18898, -20247=>18899, -40872=>18900, -62891=>18900, -21556=>18901, -32139=>18902, -22674=>18903, -22736=>18904, -62896=>18905, -138678=>18905, -24210=>18906, -24217=>18907, -24514=>18908, -62900=>18909, -141074=>18909, -25995=>18910, -62902=>18911, -144377=>18911, -26905=>18912, -27203=>18913, -62905=>18914, -146531=>18914, -27903=>18915, -29184=>18916, -62909=>18917, -148741=>18917, -29580=>18918, -16091=>18919, -62911=>18919, -150035=>18920, -62912=>18920, -23317=>18921, -29881=>18922, -35715=>18923, -154788=>18924, -62916=>18924, -153237=>18925, -62917=>18925, -31379=>18926, -31724=>18927, -31939=>18928, -32364=>18929, -33528=>18930, -34199=>18931, -40873=>18932, -62924=>18932, -34960=>18933, -40874=>18934, -62926=>18934, -36537=>18935, -40875=>18936, -62928=>18936, -36815=>18937, -34143=>18938, -39392=>18939, -37409=>18940, -40876=>18941, -62933=>18941, -167353=>18942, -62934=>18942, -136255=>18943, -62935=>18943, -16497=>18944, -62936=>18944, -17058=>18945, -62937=>18945, -23066=>18946, -39016=>18947, -26475=>18948, -17014=>18949, -62944=>18949, -22333=>18950, -34262=>18951, -62948=>18952, -149883=>18952, -33471=>18953, -160013=>18954, -62950=>18954, -19585=>18955, -62951=>18955, -159092=>18956, -62952=>18956, -23931=>18957, -158485=>18958, -62954=>18958, -159678=>18959, -62955=>18959, -40877=>18960, -62956=>18960, -40878=>18961, -62957=>18961, -23446=>18962, -40879=>18963, -62959=>18963, -32347=>18964, -17392=>18965, -19506=>18966, -17923=>18967, -17830=>18968, -17784=>18969, -160359=>18970, -19831=>18971, -17843=>18972, -162993=>18973, -19682=>18974, -163013=>18975, -15253=>18976, -18230=>18977, -18244=>18978, -19527=>18979, -19520=>18980, -148159=>18981, -144919=>18982, -160594=>18983, -159371=>18984, -159954=>18985, -19543=>18986, -172881=>18987, -18255=>18988, -17882=>18989, -19589=>18990, -162924=>18991, -19719=>18992, -19108=>18993, -18081=>18994, -158499=>18995, -29221=>18996, -154196=>18997, -137827=>18998, -146950=>18999, -147297=>19000, -26189=>19001, -22267=>19002, -32149=>19003, -22813=>19004, -166841=>19005, -15860=>19006, -38708=>19007, -162799=>19008, -23515=>19009, -138590=>19010, -23204=>19011, -13861=>19012, -171696=>19013, -23249=>19014, -23479=>19015, -23804=>19016, -26478=>19017, -34195=>19018, -170309=>19019, -29793=>19020, -29853=>19021, -133743=>19022, -26343=>19023, -28247=>19024, -31178=>19025, -15752=>19026, -17603=>19027, -143958=>19028, -141206=>19029, -17306=>19030, -17718=>19031, -23765=>19032, -146202=>19033, -35577=>19034, -23672=>19035, -15634=>19036, -144721=>19037, -23928=>19038, -40882=>19039, -29015=>19040, -17752=>19041, -147692=>19042, -138787=>19043, -19575=>19044, -14712=>19045, -13386=>19046, -131492=>19047, -158785=>19048, -35532=>19049, -20404=>19050, -131641=>19051, -22975=>19052, -33132=>19053, -38998=>19054, -170234=>19055, -24379=>19056, -134047=>19057, -139713=>19058, -166253=>19059, -16642=>19060, -18107=>19061, -168057=>19062, -16135=>19063, -40883=>19064, -172469=>19065, -16632=>19066, -14294=>19067, -18167=>19068, -158790=>19069, -16764=>19070, -165554=>19071, -160767=>19072, -17773=>19073, -14548=>19074, -152730=>19075, -17761=>19076, -17691=>19077, -19849=>19078, -19579=>19079, -19830=>19080, -17898=>19081, -16328=>19082, -150287=>19083, -13921=>19084, -17630=>19085, -17597=>19086, -16877=>19087, -); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ag15.php b/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ag15.php deleted file mode 100644 index ae649058..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ag15.php +++ /dev/null @@ -1,30222 +0,0 @@ -1, -33=>2, -34=>3, -35=>4, -36=>5, -37=>6, -38=>7, -39=>8, -40=>9, -41=>10, -42=>11, -43=>12, -44=>13, -45=>14, -46=>15, -47=>16, -48=>17, -49=>18, -50=>19, -51=>20, -52=>21, -53=>22, -54=>23, -55=>24, -56=>25, -57=>26, -58=>27, -59=>28, -60=>29, -61=>30, -62=>31, -63=>32, -64=>33, -65=>34, -66=>35, -67=>36, -68=>37, -69=>38, -70=>39, -71=>40, -72=>41, -73=>42, -74=>43, -75=>44, -76=>45, -77=>46, -78=>47, -79=>48, -80=>49, -81=>50, -82=>51, -83=>52, -84=>53, -85=>54, -86=>55, -87=>56, -88=>57, -89=>58, -90=>59, -91=>60, -92=>61, -93=>62, -94=>63, -95=>64, -96=>65, -97=>66, -98=>67, -99=>68, -100=>69, -101=>70, -102=>71, -103=>72, -104=>73, -105=>74, -106=>75, -107=>76, -108=>77, -109=>78, -110=>79, -111=>80, -112=>81, -113=>82, -114=>83, -115=>84, -116=>85, -117=>86, -118=>87, -119=>88, -120=>89, -121=>90, -122=>91, -123=>92, -124=>93, -125=>94, -126=>95, -12288=>96, -12289=>97, -12290=>98, -183=>99, -12539=>99, -713=>100, -711=>101, -168=>102, -12291=>103, -12293=>104, -8212=>105, -65374=>106, -8214=>107, -8230=>108, -8943=>108, -8216=>109, -8217=>110, -8220=>111, -8221=>112, -12308=>113, -12309=>114, -12296=>115, -12297=>116, -12298=>117, -12299=>118, -12300=>119, -12301=>120, -12302=>121, -12303=>122, -12310=>123, -12311=>124, -12304=>125, -12305=>126, -177=>127, -215=>128, -247=>129, -8758=>130, -8743=>131, -8744=>132, -8721=>133, -8719=>134, -8746=>135, -8745=>136, -8712=>137, -8759=>138, -8730=>139, -8869=>140, -8741=>141, -8736=>142, -8978=>143, -8857=>144, -8747=>145, -8750=>146, -8801=>147, -8780=>148, -8776=>149, -8765=>150, -8733=>151, -8800=>152, -8814=>153, -8815=>154, -8804=>155, -8805=>156, -8734=>157, -8757=>158, -8756=>159, -9794=>160, -9792=>161, -176=>162, -8242=>163, -8243=>164, -8451=>165, -65284=>166, -164=>167, -65504=>168, -65505=>169, -8240=>170, -167=>171, -8470=>172, -9734=>173, -9733=>174, -9675=>175, -9679=>176, -9678=>177, -9671=>178, -9670=>179, -9633=>180, -9632=>181, -9651=>182, -9650=>183, -8251=>184, -8594=>185, -8592=>186, -8593=>187, -8595=>188, -12307=>189, -9352=>190, -9353=>191, -9354=>192, -9355=>193, -9356=>194, -9357=>195, -9358=>196, -9359=>197, -9360=>198, -9361=>199, -9362=>200, -9363=>201, -9364=>202, -9365=>203, -9366=>204, -9367=>205, -9368=>206, -9369=>207, -9370=>208, -9371=>209, -9332=>210, -9333=>211, -9334=>212, -9335=>213, -9336=>214, -9337=>215, -9338=>216, -9339=>217, -9340=>218, -9341=>219, -9342=>220, -9343=>221, -9344=>222, -9345=>223, -9346=>224, -9347=>225, -9348=>226, -9349=>227, -9350=>228, -9351=>229, -9312=>230, -9313=>231, -9314=>232, -9315=>233, -9316=>234, -9317=>235, -9318=>236, -9319=>237, -9320=>238, -9321=>239, -12832=>240, -12833=>241, -12834=>242, -12835=>243, -12836=>244, -12837=>245, -12838=>246, -12839=>247, -12840=>248, -12841=>249, -8544=>250, -8545=>251, -8546=>252, -8547=>253, -8548=>254, -8549=>255, -8550=>256, -8551=>257, -8552=>258, -8553=>259, -8554=>260, -8555=>261, -65281=>262, -65282=>263, -65283=>264, -65509=>265, -65285=>266, -65286=>267, -65287=>268, -65288=>269, -65289=>270, -65290=>271, -65291=>272, -65292=>273, -65293=>274, -65294=>275, -65295=>276, -65296=>277, -65297=>278, -65298=>279, -65299=>280, -65300=>281, -65301=>282, -65302=>283, -65303=>284, -65304=>285, -65305=>286, -65306=>287, -65307=>288, -65308=>289, -65309=>290, -65310=>291, -65311=>292, -65312=>293, -65313=>294, -65314=>295, -65315=>296, -65316=>297, -65317=>298, -65318=>299, -65319=>300, -65320=>301, -65321=>302, -65322=>303, -65323=>304, -65324=>305, -65325=>306, -65326=>307, -65327=>308, -65328=>309, -65329=>310, -65330=>311, -65331=>312, -65332=>313, -65333=>314, -65334=>315, -65335=>316, -65336=>317, -65337=>318, -65338=>319, -65339=>320, -65340=>321, -65341=>322, -65342=>323, -65343=>324, -65344=>325, -65345=>326, -65346=>327, -65347=>328, -65348=>329, -65349=>330, -65350=>331, -65351=>332, -65352=>333, -65353=>334, -65354=>335, -65355=>336, -65356=>337, -65357=>338, -65358=>339, -65359=>340, -65360=>341, -65361=>342, -65362=>343, -65363=>344, -65364=>345, -65365=>346, -65366=>347, -65367=>348, -65368=>349, -65369=>350, -65370=>351, -65371=>352, -65372=>353, -65373=>354, -65507=>355, -12353=>356, -12354=>357, -12355=>358, -12356=>359, -12357=>360, -12358=>361, -12359=>362, -12360=>363, -12361=>364, -12362=>365, -12363=>366, -12364=>367, -12365=>368, -12366=>369, -12367=>370, -12368=>371, -12369=>372, -12370=>373, -12371=>374, -12372=>375, -12373=>376, -12374=>377, -12375=>378, -12376=>379, -12377=>380, -12378=>381, -12379=>382, -12380=>383, -12381=>384, -12382=>385, -12383=>386, -12384=>387, -12385=>388, -12386=>389, -12387=>390, -12388=>391, -12389=>392, -12390=>393, -12391=>394, -12392=>395, -12393=>396, -12394=>397, -12395=>398, -12396=>399, -12397=>400, -12398=>401, -12399=>402, -12400=>403, -12401=>404, -12402=>405, -12403=>406, -12404=>407, -12405=>408, -12406=>409, -12407=>410, -12408=>411, -12409=>412, -12410=>413, -12411=>414, -12412=>415, -12413=>416, -12414=>417, -12415=>418, -12416=>419, -12417=>420, -12418=>421, -12419=>422, -12420=>423, -12421=>424, -12422=>425, -12423=>426, -12424=>427, -12425=>428, -12426=>429, -12427=>430, -12428=>431, -12429=>432, -12430=>433, -12431=>434, -12432=>435, -12433=>436, -12434=>437, -12435=>438, -12449=>439, -12450=>440, -12451=>441, -12452=>442, -12453=>443, -12454=>444, -12455=>445, -12456=>446, -12457=>447, -12458=>448, -12459=>449, -12460=>450, -12461=>451, -12462=>452, -12463=>453, -12464=>454, -12465=>455, -12466=>456, -12467=>457, -12468=>458, -12469=>459, -12470=>460, -12471=>461, -12472=>462, -12473=>463, -12474=>464, -12475=>465, -12476=>466, -12477=>467, -12478=>468, -12479=>469, -12480=>470, -12481=>471, -12482=>472, -12483=>473, -12484=>474, -12485=>475, -12486=>476, -12487=>477, -12488=>478, -12489=>479, -12490=>480, -12491=>481, -12492=>482, -12493=>483, -12494=>484, -12495=>485, -12496=>486, -12497=>487, -12498=>488, -12499=>489, -12500=>490, -12501=>491, -12502=>492, -12503=>493, -12504=>494, -12505=>495, -12506=>496, -12507=>497, -12508=>498, -12509=>499, -12510=>500, -12511=>501, -12512=>502, -12513=>503, -12514=>504, -12515=>505, -12516=>506, -12517=>507, -12518=>508, -12519=>509, -12520=>510, -12521=>511, -12522=>512, -12523=>513, -12524=>514, -12525=>515, -12526=>516, -12527=>517, -12528=>518, -12529=>519, -12530=>520, -12531=>521, -12532=>522, -12533=>523, -12534=>524, -913=>525, -914=>526, -915=>527, -916=>528, -917=>529, -918=>530, -919=>531, -920=>532, -921=>533, -922=>534, -923=>535, -924=>536, -925=>537, -926=>538, -927=>539, -928=>540, -929=>541, -931=>542, -932=>543, -933=>544, -934=>545, -935=>546, -936=>547, -937=>548, -945=>549, -946=>550, -947=>551, -948=>552, -949=>553, -950=>554, -951=>555, -952=>556, -953=>557, -954=>558, -955=>559, -956=>560, -957=>561, -958=>562, -959=>563, -960=>564, -961=>565, -963=>566, -964=>567, -965=>568, -966=>569, -967=>570, -968=>571, -969=>572, -65040=>573, -59277=>573, -65042=>574, -59278=>574, -65041=>575, -59279=>575, -59280=>576, -65043=>576, -59281=>577, -65044=>577, -59282=>578, -65045=>578, -59283=>579, -65046=>579, -65077=>580, -65078=>581, -65081=>582, -65082=>583, -65087=>584, -65088=>585, -65085=>586, -65086=>587, -65089=>588, -65090=>589, -65091=>590, -65092=>591, -59284=>592, -65047=>592, -59285=>593, -65048=>593, -65083=>594, -65084=>595, -65079=>596, -65080=>597, -65073=>598, -8285=>599, -59286=>599, -65049=>599, -65075=>600, -65076=>601, -1040=>602, -1041=>603, -1042=>604, -1043=>605, -1044=>606, -1045=>607, -1025=>608, -1046=>609, -1047=>610, -1048=>611, -1049=>612, -1050=>613, -1051=>614, -1052=>615, -1053=>616, -1054=>617, -1055=>618, -1056=>619, -1057=>620, -1058=>621, -1059=>622, -1060=>623, -1061=>624, -1062=>625, -1063=>626, -1064=>627, -1065=>628, -1066=>629, -1067=>630, -1068=>631, -1069=>632, -1070=>633, -1071=>634, -1072=>635, -1073=>636, -1074=>637, -1075=>638, -1076=>639, -1077=>640, -1105=>641, -1078=>642, -1079=>643, -1080=>644, -1081=>645, -1082=>646, -1083=>647, -1084=>648, -1085=>649, -1086=>650, -1087=>651, -1088=>652, -1089=>653, -1090=>654, -1091=>655, -1092=>656, -1093=>657, -1094=>658, -1095=>659, -1096=>660, -1097=>661, -1098=>662, -1099=>663, -1100=>664, -1101=>665, -1102=>666, -1103=>667, -257=>668, -225=>669, -462=>670, -224=>671, -275=>672, -233=>673, -283=>674, -232=>675, -299=>676, -237=>677, -464=>678, -236=>679, -333=>680, -243=>681, -466=>682, -242=>683, -363=>684, -250=>685, -468=>686, -249=>687, -470=>688, -472=>689, -474=>690, -476=>691, -252=>692, -234=>693, -593=>694, -7743=>695, -59335=>695, -324=>696, -328=>697, -505=>698, -59336=>698, -609=>699, -12549=>700, -12550=>701, -12551=>702, -12552=>703, -12553=>704, -12554=>705, -12555=>706, -12556=>707, -12557=>708, -12558=>709, -12559=>710, -12560=>711, -12561=>712, -12562=>713, -12563=>714, -12564=>715, -12565=>716, -12566=>717, -12567=>718, -12568=>719, -12569=>720, -12570=>721, -12571=>722, -12572=>723, -12573=>724, -12574=>725, -12575=>726, -12576=>727, -12577=>728, -12578=>729, -12579=>730, -12580=>731, -12581=>732, -12582=>733, -12583=>734, -12584=>735, -12585=>736, -9472=>738, -9473=>739, -9474=>740, -9475=>741, -9476=>742, -9477=>743, -9478=>744, -9479=>745, -9480=>746, -9481=>747, -9482=>748, -9483=>749, -9484=>750, -9485=>751, -9486=>752, -9487=>753, -9488=>754, -9489=>755, -9490=>756, -9491=>757, -9492=>758, -9493=>759, -9494=>760, -9495=>761, -9496=>762, -9497=>763, -9498=>764, -9499=>765, -9500=>766, -9501=>767, -9502=>768, -9503=>769, -9504=>770, -9505=>771, -9506=>772, -9507=>773, -9508=>774, -9509=>775, -9510=>776, -9511=>777, -9512=>778, -9513=>779, -9514=>780, -9515=>781, -9516=>782, -9517=>783, -9518=>784, -9519=>785, -9520=>786, -9521=>787, -9522=>788, -9523=>789, -9524=>790, -9525=>791, -9526=>792, -9527=>793, -9528=>794, -9529=>795, -9530=>796, -9531=>797, -9532=>798, -9533=>799, -9534=>800, -9535=>801, -9536=>802, -9537=>803, -9538=>804, -9539=>805, -9540=>806, -9541=>807, -9542=>808, -9543=>809, -9544=>810, -9545=>811, -9546=>812, -9547=>813, -21834=>940, -38463=>941, -22467=>942, -25384=>943, -21710=>944, -21769=>945, -21696=>946, -30353=>947, -30284=>948, -34108=>949, -30702=>950, -33406=>951, -30861=>952, -29233=>953, -38552=>954, -38797=>955, -27688=>956, -23433=>957, -20474=>958, -25353=>959, -26263=>960, -23736=>961, -33018=>962, -26696=>963, -32942=>964, -26114=>965, -30414=>966, -20985=>967, -25942=>968, -29100=>969, -32753=>970, -34948=>971, -20658=>972, -22885=>973, -25034=>974, -28595=>975, -33453=>976, -25420=>977, -25170=>978, -21485=>979, -21543=>980, -31494=>981, -12043=>982, -20843=>982, -30116=>983, -24052=>984, -25300=>985, -36299=>986, -38774=>987, -25226=>988, -32793=>989, -22365=>990, -38712=>991, -32610=>992, -29240=>993, -12137=>994, -30333=>994, -26575=>995, -30334=>996, -25670=>997, -20336=>998, -36133=>999, -25308=>1000, -31255=>1001, -26001=>1002, -29677=>1003, -25644=>1004, -25203=>1005, -33324=>1006, -39041=>1007, -26495=>1008, -29256=>1009, -25198=>1010, -25292=>1011, -20276=>1012, -29923=>1013, -21322=>1014, -21150=>1015, -32458=>1016, -37030=>1017, -24110=>1018, -26758=>1019, -27036=>1020, -33152=>1021, -32465=>1022, -26834=>1023, -30917=>1024, -34444=>1025, -38225=>1026, -20621=>1027, -35876=>1028, -33502=>1029, -32990=>1030, -21253=>1031, -35090=>1032, -21093=>1033, -34180=>1034, -38649=>1035, -20445=>1036, -22561=>1037, -39281=>1038, -23453=>1039, -25265=>1040, -25253=>1041, -26292=>1042, -35961=>1043, -40077=>1044, -29190=>1045, -26479=>1046, -30865=>1047, -24754=>1048, -21329=>1049, -21271=>1050, -36744=>1051, -32972=>1052, -36125=>1053, -38049=>1054, -20493=>1055, -29384=>1056, -22791=>1057, -24811=>1058, -28953=>1059, -34987=>1060, -22868=>1061, -33519=>1062, -26412=>1063, -31528=>1064, -23849=>1065, -32503=>1066, -29997=>1067, -27893=>1068, -36454=>1069, -36856=>1070, -36924=>1071, -12240=>1072, -40763=>1072, -12112=>1073, -27604=>1073, -37145=>1074, -31508=>1075, -24444=>1076, -30887=>1077, -34006=>1078, -34109=>1079, -27605=>1080, -27609=>1081, -27606=>1082, -24065=>1083, -24199=>1084, -30201=>1085, -38381=>1086, -25949=>1087, -24330=>1088, -24517=>1089, -36767=>1090, -22721=>1091, -33218=>1092, -36991=>1093, -38491=>1094, -38829=>1095, -36793=>1096, -32534=>1097, -36140=>1098, -25153=>1099, -20415=>1100, -21464=>1101, -21342=>1102, -36776=>1103, -36777=>1104, -36779=>1105, -36941=>1106, -26631=>1107, -24426=>1108, -33176=>1109, -34920=>1110, -40150=>1111, -24971=>1112, -21035=>1113, -30250=>1114, -24428=>1115, -25996=>1116, -28626=>1117, -28392=>1118, -23486=>1119, -25672=>1120, -20853=>1121, -20912=>1122, -26564=>1123, -19993=>1124, -31177=>1125, -39292=>1126, -28851=>1127, -30149=>1128, -24182=>1129, -29627=>1130, -33760=>1131, -25773=>1132, -25320=>1133, -38069=>1134, -27874=>1135, -21338=>1136, -21187=>1137, -25615=>1138, -38082=>1139, -31636=>1140, -20271=>1141, -24091=>1142, -33334=>1143, -33046=>1144, -33162=>1145, -28196=>1146, -27850=>1147, -39539=>1148, -25429=>1149, -12056=>1150, -21340=>1150, -21754=>1151, -34917=>1152, -22496=>1153, -19981=>1154, -24067=>1155, -27493=>1156, -31807=>1157, -37096=>1158, -24598=>1159, -25830=>1160, -29468=>1161, -35009=>1162, -26448=>1163, -25165=>1164, -36130=>1165, -30572=>1166, -36393=>1167, -37319=>1168, -24425=>1169, -33756=>1170, -34081=>1171, -39184=>1172, -21442=>1173, -34453=>1174, -27531=>1175, -24813=>1176, -24808=>1177, -28799=>1178, -33485=>1179, -33329=>1180, -20179=>1181, -27815=>1182, -34255=>1183, -25805=>1184, -31961=>1185, -27133=>1186, -26361=>1187, -33609=>1188, -21397=>1189, -31574=>1190, -20391=>1191, -20876=>1192, -27979=>1193, -23618=>1194, -36461=>1195, -25554=>1196, -21449=>1197, -33580=>1198, -33590=>1199, -26597=>1200, -30900=>1201, -25661=>1202, -23519=>1203, -23700=>1204, -24046=>1205, -35815=>1206, -25286=>1207, -26612=>1208, -35962=>1209, -25600=>1210, -25530=>1211, -34633=>1212, -39307=>1213, -35863=>1214, -32544=>1215, -38130=>1216, -20135=>1217, -38416=>1218, -39076=>1219, -26124=>1220, -29462=>1221, -22330=>1222, -23581=>1223, -24120=>1224, -38271=>1225, -20607=>1226, -32928=>1227, -12058=>1228, -21378=>1228, -25950=>1229, -30021=>1230, -21809=>1231, -20513=>1232, -36229=>1233, -25220=>1234, -38046=>1235, -26397=>1236, -22066=>1237, -28526=>1238, -24034=>1239, -21557=>1240, -28818=>1241, -36710=>1242, -25199=>1243, -25764=>1244, -25507=>1245, -24443=>1246, -28552=>1247, -37108=>1248, -12162=>1249, -33251=>1249, -12192=>1250, -36784=>1250, -23576=>1251, -26216=>1252, -24561=>1253, -27785=>1254, -38472=>1255, -36225=>1256, -34924=>1257, -25745=>1258, -31216=>1259, -22478=>1260, -27225=>1261, -25104=>1262, -21576=>1263, -20056=>1264, -31243=>1265, -24809=>1266, -28548=>1267, -35802=>1268, -25215=>1269, -36894=>1270, -39563=>1271, -31204=>1272, -21507=>1273, -30196=>1274, -25345=>1275, -21273=>1276, -27744=>1277, -36831=>1278, -24347=>1279, -39536=>1280, -32827=>1281, -40831=>1282, -20360=>1283, -23610=>1284, -12186=>1285, -36196=>1285, -32709=>1286, -26021=>1287, -28861=>1288, -20805=>1289, -20914=>1290, -12173=>1291, -34411=>1291, -23815=>1292, -23456=>1293, -25277=>1294, -37228=>1295, -30068=>1296, -36364=>1297, -31264=>1298, -24833=>1299, -31609=>1300, -20167=>1301, -32504=>1302, -30597=>1303, -19985=>1304, -33261=>1305, -21021=>1306, -20986=>1307, -27249=>1308, -21416=>1309, -36487=>1310, -38148=>1311, -38607=>1312, -28353=>1313, -38500=>1314, -26970=>1315, -30784=>1316, -20648=>1317, -30679=>1318, -25616=>1319, -35302=>1320, -22788=>1321, -25571=>1322, -24029=>1323, -31359=>1324, -26941=>1325, -20256=>1326, -33337=>1327, -21912=>1328, -20018=>1329, -30126=>1330, -31383=>1331, -24162=>1332, -24202=>1333, -38383=>1334, -21019=>1335, -21561=>1336, -28810=>1337, -25462=>1338, -38180=>1339, -22402=>1340, -26149=>1341, -26943=>1342, -37255=>1343, -21767=>1344, -28147=>1345, -32431=>1346, -34850=>1347, -25139=>1348, -32496=>1349, -30133=>1350, -33576=>1351, -30913=>1352, -38604=>1353, -36766=>1354, -24904=>1355, -29943=>1356, -35789=>1357, -27492=>1358, -21050=>1359, -36176=>1360, -27425=>1361, -32874=>1362, -33905=>1363, -22257=>1364, -21254=>1365, -20174=>1366, -19995=>1367, -20945=>1368, -31895=>1369, -37259=>1370, -31751=>1371, -20419=>1372, -36479=>1373, -31713=>1374, -31388=>1375, -25703=>1376, -23828=>1377, -20652=>1378, -33030=>1379, -30209=>1380, -31929=>1381, -28140=>1382, -32736=>1383, -26449=>1384, -23384=>1385, -12072=>1386, -23544=>1386, -30923=>1387, -25774=>1388, -25619=>1389, -25514=>1390, -25387=>1391, -38169=>1392, -25645=>1393, -36798=>1394, -31572=>1395, -30249=>1396, -25171=>1397, -12068=>1398, -22823=>1398, -21574=>1399, -12109=>1400, -27513=>1400, -20643=>1401, -25140=>1402, -24102=>1403, -27526=>1404, -20195=>1405, -36151=>1406, -34955=>1407, -24453=>1408, -36910=>1409, -24608=>1410, -32829=>1411, -25285=>1412, -20025=>1413, -21333=>1414, -37112=>1415, -25528=>1416, -32966=>1417, -26086=>1418, -27694=>1419, -20294=>1420, -24814=>1421, -28129=>1422, -35806=>1423, -24377=>1424, -34507=>1425, -24403=>1426, -25377=>1427, -20826=>1428, -33633=>1429, -26723=>1430, -12049=>1431, -20992=>1431, -25443=>1432, -36424=>1433, -20498=>1434, -23707=>1435, -31095=>1436, -23548=>1437, -21040=>1438, -31291=>1439, -24764=>1440, -36947=>1441, -30423=>1442, -24503=>1443, -24471=>1444, -30340=>1445, -36460=>1446, -28783=>1447, -30331=>1448, -31561=>1449, -30634=>1450, -20979=>1451, -37011=>1452, -22564=>1453, -20302=>1454, -28404=>1455, -36842=>1456, -25932=>1457, -31515=>1458, -29380=>1459, -28068=>1460, -32735=>1461, -23265=>1462, -25269=>1463, -24213=>1464, -22320=>1465, -33922=>1466, -31532=>1467, -24093=>1468, -24351=>1469, -36882=>1470, -32532=>1471, -39072=>1472, -25474=>1473, -28359=>1474, -30872=>1475, -28857=>1476, -20856=>1477, -38747=>1478, -22443=>1479, -30005=>1480, -20291=>1481, -30008=>1482, -24215=>1483, -24806=>1484, -22880=>1485, -28096=>1486, -27583=>1487, -30857=>1488, -21500=>1489, -38613=>1490, -20939=>1491, -20993=>1492, -25481=>1493, -21514=>1494, -38035=>1495, -35843=>1496, -36300=>1497, -29241=>1498, -30879=>1499, -34678=>1500, -36845=>1501, -35853=>1502, -21472=>1503, -19969=>1504, -30447=>1505, -21486=>1506, -38025=>1507, -39030=>1508, -12237=>1509, -40718=>1509, -38189=>1510, -23450=>1511, -35746=>1512, -20002=>1513, -19996=>1514, -20908=>1515, -33891=>1516, -25026=>1517, -21160=>1518, -26635=>1519, -20375=>1520, -24683=>1521, -20923=>1522, -27934=>1523, -20828=>1524, -25238=>1525, -12099=>1526, -26007=>1526, -38497=>1527, -12182=>1528, -35910=>1528, -36887=>1529, -30168=>1530, -37117=>1531, -30563=>1532, -27602=>1533, -29322=>1534, -29420=>1535, -35835=>1536, -22581=>1537, -30585=>1538, -36172=>1539, -26460=>1540, -38208=>1541, -32922=>1542, -24230=>1543, -28193=>1544, -22930=>1545, -31471=>1546, -30701=>1547, -38203=>1548, -27573=>1549, -26029=>1550, -32526=>1551, -22534=>1552, -20817=>1553, -38431=>1554, -23545=>1555, -22697=>1556, -21544=>1557, -36466=>1558, -25958=>1559, -39039=>1560, -22244=>1561, -38045=>1562, -30462=>1563, -36929=>1564, -25479=>1565, -21702=>1566, -22810=>1567, -22842=>1568, -22427=>1569, -36530=>1570, -26421=>1571, -36346=>1572, -33333=>1573, -21057=>1574, -24816=>1575, -22549=>1576, -34558=>1577, -23784=>1578, -40517=>1579, -20420=>1580, -39069=>1581, -35769=>1582, -23077=>1583, -24694=>1584, -21380=>1585, -25212=>1586, -36943=>1587, -37122=>1588, -39295=>1589, -24681=>1590, -12157=>1591, -32780=>1591, -12041=>1592, -20799=>1592, -12159=>1593, -32819=>1593, -23572=>1594, -39285=>1595, -27953=>1596, -12038=>1597, -20108=>1597, -36144=>1598, -21457=>1599, -32602=>1600, -31567=>1601, -20240=>1602, -20047=>1603, -38400=>1604, -27861=>1605, -29648=>1606, -34281=>1607, -24070=>1608, -30058=>1609, -32763=>1610, -27146=>1611, -30718=>1612, -38034=>1613, -32321=>1614, -20961=>1615, -28902=>1616, -21453=>1617, -36820=>1618, -33539=>1619, -36137=>1620, -29359=>1621, -39277=>1622, -27867=>1623, -22346=>1624, -33459=>1625, -12101=>1626, -26041=>1626, -32938=>1627, -25151=>1628, -38450=>1629, -22952=>1630, -20223=>1631, -35775=>1632, -32442=>1633, -25918=>1634, -33778=>1635, -12206=>1636, -38750=>1636, -21857=>1637, -39134=>1638, -32933=>1639, -21290=>1640, -35837=>1641, -21536=>1642, -32954=>1643, -24223=>1644, -27832=>1645, -36153=>1646, -33452=>1647, -37210=>1648, -21545=>1649, -27675=>1650, -20998=>1651, -32439=>1652, -22367=>1653, -28954=>1654, -27774=>1655, -31881=>1656, -22859=>1657, -20221=>1658, -24575=>1659, -24868=>1660, -31914=>1661, -20016=>1662, -23553=>1663, -26539=>1664, -34562=>1665, -23792=>1666, -38155=>1667, -39118=>1668, -30127=>1669, -28925=>1670, -36898=>1671, -20911=>1672, -32541=>1673, -35773=>1674, -22857=>1675, -20964=>1676, -20315=>1677, -21542=>1678, -22827=>1679, -25975=>1680, -32932=>1681, -23413=>1682, -25206=>1683, -25282=>1684, -36752=>1685, -24133=>1686, -27679=>1687, -31526=>1688, -20239=>1689, -20440=>1690, -26381=>1691, -28014=>1692, -28074=>1693, -31119=>1694, -34993=>1695, -24343=>1696, -29995=>1697, -25242=>1698, -36741=>1699, -20463=>1700, -37340=>1701, -26023=>1702, -33071=>1703, -33105=>1704, -24220=>1705, -33104=>1706, -36212=>1707, -21103=>1708, -35206=>1709, -36171=>1710, -22797=>1711, -20613=>1712, -20184=>1713, -12201=>1714, -38428=>1714, -12119=>1715, -29238=>1715, -33145=>1716, -36127=>1717, -23500=>1718, -35747=>1719, -38468=>1720, -22919=>1721, -32538=>1722, -21648=>1723, -22134=>1724, -22030=>1725, -35813=>1726, -25913=>1727, -27010=>1728, -38041=>1729, -30422=>1730, -28297=>1731, -12082=>1732, -24178=>1732, -12130=>1733, -29976=>1733, -26438=>1734, -26577=>1735, -31487=>1736, -32925=>1737, -36214=>1738, -24863=>1739, -31174=>1740, -25954=>1741, -36195=>1742, -20872=>1743, -21018=>1744, -38050=>1745, -32568=>1746, -32923=>1747, -32434=>1748, -23703=>1749, -28207=>1750, -26464=>1751, -31705=>1752, -30347=>1753, -12220=>1754, -39640=>1754, -33167=>1755, -32660=>1756, -31957=>1757, -25630=>1758, -38224=>1759, -31295=>1760, -21578=>1761, -21733=>1762, -27468=>1763, -25601=>1764, -12093=>1765, -25096=>1765, -40509=>1766, -33011=>1767, -30105=>1768, -21106=>1769, -12208=>1770, -38761=>1770, -33883=>1771, -26684=>1772, -34532=>1773, -38401=>1774, -38548=>1775, -38124=>1776, -20010=>1777, -21508=>1778, -32473=>1779, -26681=>1780, -36319=>1781, -32789=>1782, -26356=>1783, -24218=>1784, -32697=>1785, -22466=>1786, -32831=>1787, -26775=>1788, -12079=>1789, -24037=>1789, -25915=>1790, -21151=>1791, -24685=>1792, -40858=>1793, -20379=>1794, -36524=>1795, -20844=>1796, -23467=>1797, -12088=>1798, -24339=>1798, -24041=>1799, -27742=>1800, -25329=>1801, -36129=>1802, -20849=>1803, -38057=>1804, -21246=>1805, -27807=>1806, -33503=>1807, -29399=>1808, -22434=>1809, -26500=>1810, -36141=>1811, -22815=>1812, -36764=>1813, -33735=>1814, -21653=>1815, -31629=>1816, -20272=>1817, -27837=>1818, -23396=>1819, -22993=>1820, -12238=>1821, -40723=>1821, -21476=>1822, -34506=>1823, -12219=>1824, -39592=>1824, -12181=>1825, -35895=>1825, -32929=>1826, -25925=>1827, -39038=>1828, -22266=>1829, -38599=>1830, -21038=>1831, -12128=>1832, -29916=>1832, -21072=>1833, -23521=>1834, -25346=>1835, -35074=>1836, -20054=>1837, -25296=>1838, -24618=>1839, -26874=>1840, -20851=>1841, -23448=>1842, -20896=>1843, -35266=>1844, -31649=>1845, -39302=>1846, -32592=>1847, -24815=>1848, -28748=>1849, -36143=>1850, -20809=>1851, -12084=>1852, -24191=>1852, -36891=>1853, -29808=>1854, -35268=>1855, -22317=>1856, -30789=>1857, -24402=>1858, -40863=>1859, -38394=>1860, -36712=>1861, -12225=>1862, -39740=>1862, -35809=>1863, -30328=>1864, -26690=>1865, -26588=>1866, -36330=>1867, -36149=>1868, -21053=>1869, -36746=>1870, -28378=>1871, -26829=>1872, -38149=>1873, -37101=>1874, -22269=>1875, -26524=>1876, -35065=>1877, -36807=>1878, -21704=>1879, -39608=>1880, -23401=>1881, -28023=>1882, -27686=>1883, -20133=>1884, -23475=>1885, -39559=>1886, -37219=>1887, -25000=>1888, -37039=>1889, -38889=>1890, -21547=>1891, -28085=>1892, -23506=>1893, -20989=>1894, -21898=>1895, -32597=>1896, -32752=>1897, -25788=>1898, -25421=>1899, -26097=>1900, -25022=>1901, -24717=>1902, -28938=>1903, -27735=>1904, -27721=>1905, -22831=>1906, -26477=>1907, -33322=>1908, -22741=>1909, -22158=>1910, -35946=>1911, -27627=>1912, -37085=>1913, -22909=>1914, -32791=>1915, -21495=>1916, -28009=>1917, -21621=>1918, -21917=>1919, -33655=>1920, -33743=>1921, -26680=>1922, -12146=>1923, -31166=>1923, -21644=>1924, -20309=>1925, -21512=>1926, -30418=>1927, -35977=>1928, -38402=>1929, -27827=>1930, -28088=>1931, -36203=>1932, -35088=>1933, -40548=>1934, -36154=>1935, -22079=>1936, -12234=>1937, -40657=>1937, -30165=>1938, -24456=>1939, -29408=>1940, -24680=>1941, -21756=>1942, -20136=>1943, -27178=>1944, -34913=>1945, -24658=>1946, -36720=>1947, -21700=>1948, -28888=>1949, -34425=>1950, -40511=>1951, -27946=>1952, -23439=>1953, -24344=>1954, -32418=>1955, -21897=>1956, -20399=>1957, -29492=>1958, -21564=>1959, -21402=>1960, -20505=>1961, -21518=>1962, -21628=>1963, -20046=>1964, -24573=>1965, -29786=>1966, -22774=>1967, -33899=>1968, -32993=>1969, -34676=>1970, -29392=>1971, -31946=>1972, -28246=>1973, -24359=>1974, -34382=>1975, -21804=>1976, -25252=>1977, -20114=>1978, -27818=>1979, -25143=>1980, -33457=>1981, -21719=>1982, -21326=>1983, -29502=>1984, -28369=>1985, -30011=>1986, -21010=>1987, -21270=>1988, -35805=>1989, -27088=>1990, -24458=>1991, -24576=>1992, -28142=>1993, -22351=>1994, -27426=>1995, -29615=>1996, -26707=>1997, -36824=>1998, -32531=>1999, -25442=>2000, -24739=>2001, -21796=>2002, -30186=>2003, -35938=>2004, -28949=>2005, -28067=>2006, -23462=>2007, -24187=>2008, -33618=>2009, -24908=>2010, -40644=>2011, -30970=>2012, -34647=>2013, -31783=>2014, -30343=>2015, -20976=>2016, -24822=>2017, -29004=>2018, -26179=>2019, -24140=>2020, -24653=>2021, -35854=>2022, -28784=>2023, -25381=>2024, -36745=>2025, -24509=>2026, -24674=>2027, -34516=>2028, -22238=>2029, -27585=>2030, -24724=>2031, -24935=>2032, -21321=>2033, -24800=>2034, -26214=>2035, -36159=>2036, -31229=>2037, -20250=>2038, -28905=>2039, -27719=>2040, -35763=>2041, -35826=>2042, -32472=>2043, -33636=>2044, -26127=>2045, -23130=>2046, -39746=>2047, -27985=>2048, -28151=>2049, -35905=>2050, -27963=>2051, -20249=>2052, -12117=>2053, -28779=>2053, -33719=>2054, -25110=>2055, -24785=>2056, -38669=>2057, -36135=>2058, -31096=>2059, -20987=>2060, -22334=>2061, -22522=>2062, -26426=>2063, -30072=>2064, -31293=>2065, -31215=>2066, -31637=>2067, -32908=>2068, -39269=>2069, -36857=>2070, -28608=>2071, -35749=>2072, -40481=>2073, -23020=>2074, -32489=>2075, -32521=>2076, -21513=>2077, -26497=>2078, -26840=>2079, -36753=>2080, -31821=>2081, -38598=>2082, -21450=>2083, -24613=>2084, -30142=>2085, -27762=>2086, -21363=>2087, -23241=>2088, -32423=>2089, -25380=>2090, -12047=>2091, -20960=>2091, -33034=>2092, -12080=>2093, -24049=>2093, -34015=>2094, -25216=>2095, -20864=>2096, -23395=>2097, -20238=>2098, -31085=>2099, -21058=>2100, -24760=>2101, -27982=>2102, -23492=>2103, -23490=>2104, -35745=>2105, -35760=>2106, -26082=>2107, -24524=>2108, -38469=>2109, -22931=>2110, -32487=>2111, -32426=>2112, -22025=>2113, -26551=>2114, -22841=>2115, -20339=>2116, -23478=>2117, -21152=>2118, -33626=>2119, -39050=>2120, -36158=>2121, -30002=>2122, -38078=>2123, -20551=>2124, -31292=>2125, -20215=>2126, -26550=>2127, -39550=>2128, -23233=>2129, -27516=>2130, -30417=>2131, -22362=>2132, -23574=>2133, -31546=>2134, -38388=>2135, -29006=>2136, -20860=>2137, -32937=>2138, -33392=>2139, -22904=>2140, -32516=>2141, -33575=>2142, -26816=>2143, -26604=>2144, -30897=>2145, -30839=>2146, -25315=>2147, -25441=>2148, -31616=>2149, -20461=>2150, -21098=>2151, -20943=>2152, -33616=>2153, -27099=>2154, -37492=>2155, -36341=>2156, -36145=>2157, -35265=>2158, -38190=>2159, -31661=>2160, -20214=>2161, -20581=>2162, -33328=>2163, -21073=>2164, -39279=>2165, -28176=>2166, -28293=>2167, -28071=>2168, -24314=>2169, -20725=>2170, -23004=>2171, -23558=>2172, -27974=>2173, -27743=>2174, -30086=>2175, -33931=>2176, -26728=>2177, -22870=>2178, -35762=>2179, -21280=>2180, -37233=>2181, -38477=>2182, -34121=>2183, -26898=>2184, -30977=>2185, -28966=>2186, -33014=>2187, -20132=>2188, -37066=>2189, -27975=>2190, -39556=>2191, -23047=>2192, -22204=>2193, -25605=>2194, -38128=>2195, -30699=>2196, -20389=>2197, -33050=>2198, -29409=>2199, -12179=>2200, -35282=>2200, -39290=>2201, -32564=>2202, -32478=>2203, -21119=>2204, -25945=>2205, -37237=>2206, -36735=>2207, -36739=>2208, -21483=>2209, -31382=>2210, -25581=>2211, -25509=>2212, -30342=>2213, -31224=>2214, -34903=>2215, -38454=>2216, -25130=>2217, -21163=>2218, -33410=>2219, -26708=>2220, -26480=>2221, -25463=>2222, -30571=>2223, -31469=>2224, -27905=>2225, -32467=>2226, -35299=>2227, -22992=>2228, -25106=>2229, -34249=>2230, -33445=>2231, -30028=>2232, -20511=>2233, -20171=>2234, -30117=>2235, -35819=>2236, -23626=>2237, -12081=>2238, -24062=>2238, -31563=>2239, -12100=>2240, -26020=>2240, -12198=>2241, -37329=>2241, -20170=>2242, -27941=>2243, -35167=>2244, -32039=>2245, -38182=>2246, -20165=>2247, -35880=>2248, -36827=>2249, -38771=>2250, -26187=>2251, -31105=>2252, -36817=>2253, -28908=>2254, -28024=>2255, -23613=>2256, -21170=>2257, -33606=>2258, -20834=>2259, -33550=>2260, -30555=>2261, -26230=>2262, -40120=>2263, -20140=>2264, -24778=>2265, -31934=>2266, -31923=>2267, -32463=>2268, -20117=>2269, -35686=>2270, -26223=>2271, -39048=>2272, -38745=>2273, -22659=>2274, -25964=>2275, -38236=>2276, -24452=>2277, -30153=>2278, -38742=>2279, -31455=>2280, -31454=>2281, -20928=>2282, -28847=>2283, -31384=>2284, -25578=>2285, -31350=>2286, -32416=>2287, -29590=>2288, -12210=>2289, -38893=>2289, -20037=>2290, -28792=>2291, -20061=>2292, -37202=>2293, -21417=>2294, -25937=>2295, -26087=>2296, -12165=>2297, -33276=>2297, -33285=>2298, -21646=>2299, -23601=>2300, -30106=>2301, -38816=>2302, -25304=>2303, -29401=>2304, -30141=>2305, -23621=>2306, -39545=>2307, -33738=>2308, -23616=>2309, -21632=>2310, -30697=>2311, -20030=>2312, -27822=>2313, -32858=>2314, -25298=>2315, -25454=>2316, -24040=>2317, -20855=>2318, -36317=>2319, -36382=>2320, -38191=>2321, -20465=>2322, -21477=>2323, -24807=>2324, -28844=>2325, -21095=>2326, -25424=>2327, -40515=>2328, -23071=>2329, -20518=>2330, -30519=>2331, -21367=>2332, -32482=>2333, -25733=>2334, -25899=>2335, -25225=>2336, -25496=>2337, -20500=>2338, -29237=>2339, -35273=>2340, -20915=>2341, -35776=>2342, -32477=>2343, -22343=>2344, -33740=>2345, -38055=>2346, -20891=>2347, -21531=>2348, -23803=>2349, -20426=>2350, -31459=>2351, -27994=>2352, -37089=>2353, -39567=>2354, -21888=>2355, -21654=>2356, -21345=>2357, -21679=>2358, -24320=>2359, -25577=>2360, -26999=>2361, -20975=>2362, -24936=>2363, -21002=>2364, -22570=>2365, -21208=>2366, -22350=>2367, -30733=>2368, -30475=>2369, -24247=>2370, -24951=>2371, -31968=>2372, -25179=>2373, -25239=>2374, -20130=>2375, -28821=>2376, -32771=>2377, -25335=>2378, -28900=>2379, -38752=>2380, -22391=>2381, -33499=>2382, -26607=>2383, -26869=>2384, -30933=>2385, -39063=>2386, -31185=>2387, -22771=>2388, -21683=>2389, -21487=>2390, -28212=>2391, -20811=>2392, -21051=>2393, -23458=>2394, -35838=>2395, -32943=>2396, -21827=>2397, -22438=>2398, -24691=>2399, -22353=>2400, -21549=>2401, -31354=>2402, -24656=>2403, -23380=>2404, -25511=>2405, -25248=>2406, -12061=>2407, -21475=>2407, -25187=>2408, -23495=>2409, -26543=>2410, -21741=>2411, -31391=>2412, -33510=>2413, -37239=>2414, -24211=>2415, -35044=>2416, -22840=>2417, -22446=>2418, -25358=>2419, -36328=>2420, -33007=>2421, -22359=>2422, -31607=>2423, -20393=>2424, -24555=>2425, -23485=>2426, -27454=>2427, -21281=>2428, -31568=>2429, -29378=>2430, -26694=>2431, -30719=>2432, -30518=>2433, -26103=>2434, -20917=>2435, -20111=>2436, -30420=>2437, -23743=>2438, -31397=>2439, -33909=>2440, -22862=>2441, -39745=>2442, -20608=>2443, -39304=>2444, -24871=>2445, -28291=>2446, -22372=>2447, -26118=>2448, -25414=>2449, -22256=>2450, -25324=>2451, -25193=>2452, -24275=>2453, -38420=>2454, -22403=>2455, -25289=>2456, -21895=>2457, -34593=>2458, -33098=>2459, -36771=>2460, -21862=>2461, -33713=>2462, -26469=>2463, -36182=>2464, -34013=>2465, -23146=>2466, -26639=>2467, -25318=>2468, -31726=>2469, -38417=>2470, -20848=>2471, -28572=>2472, -35888=>2473, -25597=>2474, -35272=>2475, -25042=>2476, -32518=>2477, -28866=>2478, -28389=>2479, -29701=>2480, -27028=>2481, -29436=>2482, -24266=>2483, -37070=>2484, -26391=>2485, -28010=>2486, -25438=>2487, -21171=>2488, -29282=>2489, -12156=>2490, -32769=>2490, -20332=>2491, -23013=>2492, -37226=>2493, -28889=>2494, -28061=>2495, -21202=>2496, -20048=>2497, -38647=>2498, -38253=>2499, -34174=>2500, -30922=>2501, -32047=>2502, -20769=>2503, -22418=>2504, -25794=>2505, -32907=>2506, -31867=>2507, -27882=>2508, -26865=>2509, -26974=>2510, -20919=>2511, -21400=>2512, -26792=>2513, -29313=>2514, -40654=>2515, -31729=>2516, -29432=>2517, -31163=>2518, -28435=>2519, -29702=>2520, -26446=>2521, -12197=>2522, -37324=>2522, -40100=>2523, -31036=>2524, -33673=>2525, -33620=>2526, -21519=>2527, -26647=>2528, -20029=>2529, -21385=>2530, -21169=>2531, -30782=>2532, -21382=>2533, -21033=>2534, -20616=>2535, -20363=>2536, -20432=>2537, -30178=>2538, -12148=>2539, -31435=>2539, -31890=>2540, -27813=>2541, -12202=>2542, -38582=>2542, -12050=>2543, -21147=>2543, -29827=>2544, -21737=>2545, -20457=>2546, -32852=>2547, -33714=>2548, -36830=>2549, -38256=>2550, -24265=>2551, -24604=>2552, -28063=>2553, -24088=>2554, -25947=>2555, -33080=>2556, -38142=>2557, -24651=>2558, -28860=>2559, -32451=>2560, -31918=>2561, -20937=>2562, -63865=>2562, -26753=>2563, -31921=>2564, -33391=>2565, -20004=>2566, -36742=>2567, -37327=>2568, -26238=>2569, -20142=>2570, -35845=>2571, -25769=>2572, -32842=>2573, -20698=>2574, -30103=>2575, -29134=>2576, -23525=>2577, -36797=>2578, -28518=>2579, -20102=>2580, -25730=>2581, -38243=>2582, -24278=>2583, -26009=>2584, -21015=>2585, -35010=>2586, -28872=>2587, -21155=>2588, -29454=>2589, -29747=>2590, -26519=>2591, -30967=>2592, -38678=>2593, -20020=>2594, -37051=>2595, -40158=>2596, -28107=>2597, -20955=>2598, -36161=>2599, -21533=>2600, -25294=>2601, -29618=>2602, -33777=>2603, -38646=>2604, -40836=>2605, -38083=>2606, -20278=>2607, -32666=>2608, -20940=>2609, -28789=>2610, -38517=>2611, -23725=>2612, -39046=>2613, -21478=>2614, -20196=>2615, -28316=>2616, -29705=>2617, -27060=>2618, -30827=>2619, -39311=>2620, -30041=>2621, -21016=>2622, -30244=>2623, -27969=>2624, -26611=>2625, -20845=>2626, -40857=>2627, -32843=>2628, -21657=>2629, -31548=>2630, -31423=>2631, -38534=>2632, -22404=>2633, -25314=>2634, -38471=>2635, -27004=>2636, -23044=>2637, -25602=>2638, -31699=>2639, -28431=>2640, -38475=>2641, -33446=>2642, -21346=>2643, -39045=>2644, -24208=>2645, -28809=>2646, -25523=>2647, -21348=>2648, -34383=>2649, -40065=>2650, -40595=>2651, -30860=>2652, -38706=>2653, -36335=>2654, -36162=>2655, -12229=>2656, -40575=>2656, -28510=>2657, -31108=>2658, -24405=>2659, -38470=>2660, -25134=>2661, -39540=>2662, -21525=>2663, -38109=>2664, -20387=>2665, -26053=>2666, -23653=>2667, -23649=>2668, -32533=>2669, -34385=>2670, -27695=>2671, -24459=>2672, -29575=>2673, -28388=>2674, -32511=>2675, -23782=>2676, -25371=>2677, -23402=>2678, -28390=>2679, -21365=>2680, -20081=>2681, -25504=>2682, -30053=>2683, -25249=>2684, -36718=>2685, -20262=>2686, -20177=>2687, -27814=>2688, -32438=>2689, -35770=>2690, -33821=>2691, -34746=>2692, -32599=>2693, -36923=>2694, -38179=>2695, -31657=>2696, -39585=>2697, -35064=>2698, -33853=>2699, -27931=>2700, -39558=>2701, -32476=>2702, -22920=>2703, -12231=>2704, -40635=>2704, -29595=>2705, -30721=>2706, -34434=>2707, -39532=>2708, -39554=>2709, -22043=>2710, -21527=>2711, -22475=>2712, -20080=>2713, -40614=>2714, -21334=>2715, -36808=>2716, -33033=>2717, -30610=>2718, -39314=>2719, -34542=>2720, -28385=>2721, -34067=>2722, -26364=>2723, -24930=>2724, -28459=>2725, -35881=>2726, -33426=>2727, -33579=>2728, -30450=>2729, -27667=>2730, -24537=>2731, -33725=>2732, -29483=>2733, -33541=>2734, -38170=>2735, -12113=>2736, -27611=>2736, -12141=>2737, -30683=>2737, -38086=>2738, -21359=>2739, -33538=>2740, -20882=>2741, -24125=>2742, -35980=>2743, -36152=>2744, -20040=>2745, -29611=>2746, -26522=>2747, -26757=>2748, -37238=>2749, -38665=>2750, -29028=>2751, -27809=>2752, -30473=>2753, -23186=>2754, -38209=>2755, -27599=>2756, -32654=>2757, -26151=>2758, -23504=>2759, -22969=>2760, -23194=>2761, -38376=>2762, -38391=>2763, -20204=>2764, -33804=>2765, -33945=>2766, -27308=>2767, -30431=>2768, -38192=>2769, -29467=>2770, -26790=>2771, -23391=>2772, -30511=>2773, -37274=>2774, -38753=>2775, -31964=>2776, -36855=>2777, -35868=>2778, -24357=>2779, -12150=>2780, -31859=>2780, -31192=>2781, -35269=>2782, -27852=>2783, -34588=>2784, -23494=>2785, -24130=>2786, -26825=>2787, -30496=>2788, -32501=>2789, -20885=>2790, -20813=>2791, -21193=>2792, -23081=>2793, -32517=>2794, -12207=>2795, -38754=>2795, -33495=>2796, -25551=>2797, -30596=>2798, -34256=>2799, -31186=>2800, -28218=>2801, -24217=>2802, -22937=>2803, -34065=>2804, -28781=>2805, -27665=>2806, -25279=>2807, -12139=>2808, -30399=>2808, -25935=>2809, -24751=>2810, -38397=>2811, -26126=>2812, -34719=>2813, -40483=>2814, -38125=>2815, -21517=>2816, -21629=>2817, -35884=>2818, -25720=>2819, -25721=>2820, -34321=>2821, -27169=>2822, -33180=>2823, -30952=>2824, -25705=>2825, -39764=>2826, -25273=>2827, -26411=>2828, -33707=>2829, -22696=>2830, -40664=>2831, -27819=>2832, -28448=>2833, -23518=>2834, -38476=>2835, -35851=>2836, -29279=>2837, -26576=>2838, -25287=>2839, -29281=>2840, -20137=>2841, -22982=>2842, -27597=>2843, -22675=>2844, -26286=>2845, -24149=>2846, -21215=>2847, -24917=>2848, -12106=>2849, -26408=>2849, -12140=>2850, -30446=>2850, -30566=>2851, -29287=>2852, -31302=>2853, -25343=>2854, -21738=>2855, -21584=>2856, -38048=>2857, -37027=>2858, -23068=>2859, -32435=>2860, -27670=>2861, -20035=>2862, -22902=>2863, -32784=>2864, -22856=>2865, -21335=>2866, -30007=>2867, -38590=>2868, -22218=>2869, -25376=>2870, -33041=>2871, -24700=>2872, -38393=>2873, -28118=>2874, -21602=>2875, -39297=>2876, -20869=>2877, -23273=>2878, -33021=>2879, -22958=>2880, -38675=>2881, -20522=>2882, -27877=>2883, -23612=>2884, -25311=>2885, -20320=>2886, -21311=>2887, -33147=>2888, -36870=>2889, -28346=>2890, -34091=>2891, -25288=>2892, -24180=>2893, -30910=>2894, -25781=>2895, -25467=>2896, -24565=>2897, -23064=>2898, -37247=>2899, -40479=>2900, -23615=>2901, -25423=>2902, -32834=>2903, -23421=>2904, -21870=>2905, -38218=>2906, -38221=>2907, -28037=>2908, -24744=>2909, -26592=>2910, -29406=>2911, -20957=>2912, -23425=>2913, -25319=>2914, -27870=>2915, -12124=>2916, -29275=>2916, -25197=>2917, -38062=>2918, -32445=>2919, -33043=>2920, -27987=>2921, -20892=>2922, -24324=>2923, -22900=>2924, -21162=>2925, -24594=>2926, -12069=>2927, -22899=>2927, -26262=>2928, -34384=>2929, -30111=>2930, -25386=>2931, -25062=>2932, -31983=>2933, -35834=>2934, -21734=>2935, -27431=>2936, -40485=>2937, -27572=>2938, -34261=>2939, -21589=>2940, -20598=>2941, -27812=>2942, -21866=>2943, -36276=>2944, -29228=>2945, -24085=>2946, -24597=>2947, -29750=>2948, -25293=>2949, -25490=>2950, -29260=>2951, -24472=>2952, -28227=>2953, -27966=>2954, -25856=>2955, -28504=>2956, -30424=>2957, -30928=>2958, -30460=>2959, -30036=>2960, -21028=>2961, -21467=>2962, -20051=>2963, -24222=>2964, -26049=>2965, -32810=>2966, -32982=>2967, -25243=>2968, -21638=>2969, -21032=>2970, -28846=>2971, -34957=>2972, -36305=>2973, -27873=>2974, -21624=>2975, -32986=>2976, -22521=>2977, -35060=>2978, -36180=>2979, -38506=>2980, -37197=>2981, -20329=>2982, -27803=>2983, -21943=>2984, -30406=>2985, -30768=>2986, -25256=>2987, -28921=>2988, -28558=>2989, -24429=>2990, -34028=>2991, -26842=>2992, -30844=>2993, -31735=>2994, -33192=>2995, -26379=>2996, -40527=>2997, -25447=>2998, -30896=>2999, -22383=>3000, -30738=>3001, -38713=>3002, -25209=>3003, -25259=>3004, -21128=>3005, -29749=>3006, -27607=>3007, -21860=>3008, -33086=>3009, -30130=>3010, -12138=>3011, -30382=>3011, -21305=>3012, -30174=>3013, -20731=>3014, -23617=>3015, -35692=>3016, -31687=>3017, -20559=>3018, -12122=>3019, -29255=>3019, -39575=>3020, -39128=>3021, -28418=>3022, -29922=>3023, -31080=>3024, -25735=>3025, -30629=>3026, -25340=>3027, -39057=>3028, -36139=>3029, -21697=>3030, -32856=>3031, -20050=>3032, -22378=>3033, -33529=>3034, -33805=>3035, -24179=>3036, -20973=>3037, -29942=>3038, -35780=>3039, -23631=>3040, -22369=>3041, -27900=>3042, -39047=>3043, -23110=>3044, -30772=>3045, -39748=>3046, -36843=>3047, -31893=>3048, -21078=>3049, -25169=>3050, -38138=>3051, -20166=>3052, -33670=>3053, -33889=>3054, -33769=>3055, -33970=>3056, -22484=>3057, -26420=>3058, -22275=>3059, -26222=>3060, -28006=>3061, -35889=>3062, -26333=>3063, -28689=>3064, -26399=>3065, -27450=>3066, -26646=>3067, -25114=>3068, -22971=>3069, -19971=>3070, -20932=>3071, -28422=>3072, -26578=>3073, -27791=>3074, -20854=>3075, -26827=>3076, -22855=>3077, -27495=>3078, -30054=>3079, -23822=>3080, -33040=>3081, -40784=>3082, -26071=>3083, -31048=>3084, -31041=>3085, -39569=>3086, -36215=>3087, -23682=>3088, -20062=>3089, -20225=>3090, -21551=>3091, -22865=>3092, -30732=>3093, -22120=>3094, -12115=>3095, -27668=>3095, -36804=>3096, -24323=>3097, -27773=>3098, -27875=>3099, -35755=>3100, -25488=>3101, -24688=>3102, -27965=>3103, -29301=>3104, -25190=>3105, -38030=>3106, -38085=>3107, -21315=>3108, -36801=>3109, -31614=>3110, -20191=>3111, -35878=>3112, -20094=>3113, -40660=>3114, -38065=>3115, -38067=>3116, -21069=>3117, -28508=>3118, -36963=>3119, -27973=>3120, -35892=>3121, -22545=>3122, -23884=>3123, -12107=>3124, -27424=>3124, -27465=>3125, -26538=>3126, -21595=>3127, -33108=>3128, -32652=>3129, -22681=>3130, -34103=>3131, -24378=>3132, -25250=>3133, -27207=>3134, -38201=>3135, -25970=>3136, -24708=>3137, -26725=>3138, -30631=>3139, -20052=>3140, -20392=>3141, -24039=>3142, -38808=>3143, -25772=>3144, -32728=>3145, -23789=>3146, -20431=>3147, -31373=>3148, -20999=>3149, -33540=>3150, -19988=>3151, -24623=>3152, -31363=>3153, -38054=>3154, -20405=>3155, -20146=>3156, -31206=>3157, -29748=>3158, -21220=>3159, -33465=>3160, -25810=>3161, -31165=>3162, -23517=>3163, -27777=>3164, -38738=>3165, -36731=>3166, -27682=>3167, -20542=>3168, -21375=>3169, -28165=>3170, -25806=>3171, -26228=>3172, -27696=>3173, -24773=>3174, -39031=>3175, -35831=>3176, -24198=>3177, -29756=>3178, -31351=>3179, -31179=>3180, -19992=>3181, -37041=>3182, -29699=>3183, -27714=>3184, -22234=>3185, -37195=>3186, -27845=>3187, -36235=>3188, -21306=>3189, -34502=>3190, -26354=>3191, -36527=>3192, -23624=>3193, -39537=>3194, -28192=>3195, -21462=>3196, -23094=>3197, -40843=>3198, -36259=>3199, -21435=>3200, -22280=>3201, -39079=>3202, -26435=>3203, -37275=>3204, -27849=>3205, -20840=>3206, -30154=>3207, -25331=>3208, -12125=>3209, -29356=>3209, -21048=>3210, -21149=>3211, -32570=>3212, -28820=>3213, -30264=>3214, -21364=>3215, -40522=>3216, -27063=>3217, -30830=>3218, -38592=>3219, -35033=>3220, -32676=>3221, -28982=>3222, -29123=>3223, -20873=>3224, -26579=>3225, -29924=>3226, -22756=>3227, -25880=>3228, -22199=>3229, -35753=>3230, -39286=>3231, -25200=>3232, -32469=>3233, -24825=>3234, -28909=>3235, -22764=>3236, -20161=>3237, -12040=>3238, -20154=>3238, -24525=>3239, -38887=>3240, -20219=>3241, -35748=>3242, -20995=>3243, -22922=>3244, -32427=>3245, -25172=>3246, -20173=>3247, -12103=>3248, -26085=>3248, -25102=>3249, -33592=>3250, -33993=>3251, -33635=>3252, -34701=>3253, -29076=>3254, -28342=>3255, -23481=>3256, -32466=>3257, -20887=>3258, -25545=>3259, -26580=>3260, -12161=>3261, -32905=>3261, -33593=>3262, -34837=>3263, -20754=>3264, -23418=>3265, -22914=>3266, -36785=>3267, -20083=>3268, -27741=>3269, -12042=>3270, -20837=>3270, -35109=>3271, -36719=>3272, -38446=>3273, -34122=>3274, -29790=>3275, -38160=>3276, -38384=>3277, -28070=>3278, -33509=>3279, -24369=>3280, -25746=>3281, -27922=>3282, -33832=>3283, -33134=>3284, -40131=>3285, -22622=>3286, -36187=>3287, -19977=>3288, -21441=>3289, -20254=>3290, -25955=>3291, -26705=>3292, -21971=>3293, -20007=>3294, -25620=>3295, -39578=>3296, -25195=>3297, -23234=>3298, -29791=>3299, -12170=>3300, -33394=>3300, -28073=>3301, -26862=>3302, -20711=>3303, -33678=>3304, -30722=>3305, -26432=>3306, -21049=>3307, -27801=>3308, -32433=>3309, -20667=>3310, -21861=>3311, -29022=>3312, -31579=>3313, -26194=>3314, -29642=>3315, -33515=>3316, -26441=>3317, -12077=>3318, -23665=>3318, -21024=>3319, -29053=>3320, -34923=>3321, -38378=>3322, -38485=>3323, -25797=>3324, -36193=>3325, -33203=>3326, -21892=>3327, -27733=>3328, -25159=>3329, -32558=>3330, -22674=>3331, -20260=>3332, -21830=>3333, -36175=>3334, -26188=>3335, -19978=>3336, -23578=>3337, -35059=>3338, -26786=>3339, -25422=>3340, -31245=>3341, -28903=>3342, -33421=>3343, -21242=>3344, -38902=>3345, -23569=>3346, -21736=>3347, -37045=>3348, -32461=>3349, -22882=>3350, -36170=>3351, -34503=>3352, -12166=>3353, -33292=>3353, -33293=>3354, -36198=>3355, -25668=>3356, -23556=>3357, -24913=>3358, -28041=>3359, -31038=>3360, -35774=>3361, -30775=>3362, -30003=>3363, -21627=>3364, -20280=>3365, -12189=>3366, -36523=>3366, -28145=>3367, -23072=>3368, -32453=>3369, -31070=>3370, -27784=>3371, -23457=>3372, -23158=>3373, -29978=>3374, -32958=>3375, -24910=>3376, -28183=>3377, -22768=>3378, -12131=>3379, -29983=>3379, -29989=>3380, -29298=>3381, -21319=>3382, -32499=>3383, -30465=>3384, -30427=>3385, -21097=>3386, -32988=>3387, -22307=>3388, -24072=>3389, -22833=>3390, -29422=>3391, -26045=>3392, -28287=>3393, -35799=>3394, -12075=>3395, -23608=>3395, -34417=>3396, -12055=>3397, -21313=>3397, -12143=>3398, -30707=>3398, -25342=>3399, -26102=>3400, -20160=>3401, -12215=>3402, -39135=>3402, -34432=>3403, -23454=>3404, -35782=>3405, -21490=>3406, -12142=>3407, -30690=>3407, -20351=>3408, -23630=>3409, -39542=>3410, -22987=>3411, -24335=>3412, -12144=>3413, -31034=>3413, -12064=>3414, -22763=>3414, -19990=>3415, -26623=>3416, -20107=>3417, -25325=>3418, -35475=>3419, -36893=>3420, -21183=>3421, -26159=>3422, -21980=>3423, -22124=>3424, -36866=>3425, -20181=>3426, -20365=>3427, -37322=>3428, -39280=>3429, -12114=>3430, -27663=>3430, -24066=>3431, -24643=>3432, -23460=>3433, -35270=>3434, -35797=>3435, -25910=>3436, -12095=>3437, -25163=>3437, -12216=>3438, -39318=>3438, -23432=>3439, -23551=>3440, -25480=>3441, -21806=>3442, -21463=>3443, -30246=>3444, -20861=>3445, -34092=>3446, -26530=>3447, -26803=>3448, -27530=>3449, -25234=>3450, -36755=>3451, -21460=>3452, -33298=>3453, -28113=>3454, -30095=>3455, -20070=>3456, -36174=>3457, -23408=>3458, -29087=>3459, -34223=>3460, -26257=>3461, -26329=>3462, -32626=>3463, -34560=>3464, -12233=>3465, -40653=>3465, -12239=>3466, -40736=>3466, -23646=>3467, -26415=>3468, -36848=>3469, -26641=>3470, -26463=>3471, -25101=>3472, -31446=>3473, -22661=>3474, -24246=>3475, -25968=>3476, -28465=>3477, -24661=>3478, -21047=>3479, -32781=>3480, -25684=>3481, -34928=>3482, -29993=>3483, -24069=>3484, -26643=>3485, -25332=>3486, -38684=>3487, -21452=>3488, -29245=>3489, -35841=>3490, -12116=>3491, -27700=>3491, -30561=>3492, -31246=>3493, -21550=>3494, -30636=>3495, -39034=>3496, -33308=>3497, -35828=>3498, -30805=>3499, -26388=>3500, -28865=>3501, -26031=>3502, -25749=>3503, -22070=>3504, -24605=>3505, -31169=>3506, -21496=>3507, -19997=>3508, -27515=>3509, -32902=>3510, -23546=>3511, -21987=>3512, -22235=>3513, -20282=>3514, -20284=>3515, -39282=>3516, -24051=>3517, -26494=>3518, -32824=>3519, -24578=>3520, -39042=>3521, -36865=>3522, -23435=>3523, -35772=>3524, -35829=>3525, -25628=>3526, -33368=>3527, -25822=>3528, -22013=>3529, -33487=>3530, -37221=>3531, -20439=>3532, -32032=>3533, -36895=>3534, -31903=>3535, -20723=>3536, -22609=>3537, -28335=>3538, -23487=>3539, -35785=>3540, -32899=>3541, -37240=>3542, -33948=>3543, -31639=>3544, -34429=>3545, -38539=>3546, -38543=>3547, -32485=>3548, -39635=>3549, -30862=>3550, -23681=>3551, -31319=>3552, -36930=>3553, -38567=>3554, -31071=>3555, -23385=>3556, -25439=>3557, -31499=>3558, -34001=>3559, -26797=>3560, -21766=>3561, -32553=>3562, -29712=>3563, -32034=>3564, -38145=>3565, -25152=>3566, -22604=>3567, -20182=>3568, -23427=>3569, -22905=>3570, -22612=>3571, -29549=>3572, -25374=>3573, -36427=>3574, -36367=>3575, -32974=>3576, -33492=>3577, -25260=>3578, -21488=>3579, -27888=>3580, -37214=>3581, -22826=>3582, -24577=>3583, -27760=>3584, -22349=>3585, -25674=>3586, -36138=>3587, -30251=>3588, -28393=>3589, -22363=>3590, -27264=>3591, -30192=>3592, -28525=>3593, -35885=>3594, -35848=>3595, -22374=>3596, -27631=>3597, -34962=>3598, -30899=>3599, -25506=>3600, -21497=>3601, -28845=>3602, -27748=>3603, -22616=>3604, -25642=>3605, -22530=>3606, -26848=>3607, -33179=>3608, -21776=>3609, -31958=>3610, -20504=>3611, -36538=>3612, -28108=>3613, -36255=>3614, -28907=>3615, -25487=>3616, -28059=>3617, -28372=>3618, -32486=>3619, -33796=>3620, -26691=>3621, -36867=>3622, -28120=>3623, -38518=>3624, -35752=>3625, -22871=>3626, -29305=>3627, -34276=>3628, -33150=>3629, -30140=>3630, -35466=>3631, -26799=>3632, -21076=>3633, -36386=>3634, -38161=>3635, -25552=>3636, -39064=>3637, -36420=>3638, -21884=>3639, -20307=>3640, -26367=>3641, -22159=>3642, -24789=>3643, -28053=>3644, -21059=>3645, -23625=>3646, -22825=>3647, -28155=>3648, -22635=>3649, -12133=>3650, -30000=>3650, -29980=>3651, -24684=>3652, -33300=>3653, -33094=>3654, -25361=>3655, -26465=>3656, -36834=>3657, -30522=>3658, -36339=>3659, -36148=>3660, -38081=>3661, -24086=>3662, -21381=>3663, -21548=>3664, -28867=>3665, -27712=>3666, -24311=>3667, -20572=>3668, -20141=>3669, -24237=>3670, -25402=>3671, -33351=>3672, -36890=>3673, -26704=>3674, -37230=>3675, -30643=>3676, -21516=>3677, -38108=>3678, -24420=>3679, -31461=>3680, -26742=>3681, -25413=>3682, -31570=>3683, -32479=>3684, -30171=>3685, -20599=>3686, -25237=>3687, -22836=>3688, -36879=>3689, -20984=>3690, -31171=>3691, -31361=>3692, -22270=>3693, -24466=>3694, -36884=>3695, -28034=>3696, -23648=>3697, -12063=>3698, -22303=>3698, -21520=>3699, -20820=>3700, -28237=>3701, -22242=>3702, -25512=>3703, -39059=>3704, -33151=>3705, -34581=>3706, -35114=>3707, -36864=>3708, -21534=>3709, -23663=>3710, -33216=>3711, -25302=>3712, -25176=>3713, -33073=>3714, -40501=>3715, -38464=>3716, -39534=>3717, -39548=>3718, -26925=>3719, -22949=>3720, -25299=>3721, -21822=>3722, -25366=>3723, -21703=>3724, -34521=>3725, -27964=>3726, -23043=>3727, -12129=>3728, -29926=>3728, -34972=>3729, -27498=>3730, -22806=>3731, -35916=>3732, -24367=>3733, -28286=>3734, -29609=>3735, -39037=>3736, -20024=>3737, -28919=>3738, -23436=>3739, -30871=>3740, -25405=>3741, -26202=>3742, -30358=>3743, -24779=>3744, -23451=>3745, -23113=>3746, -19975=>3747, -33109=>3748, -27754=>3749, -29579=>3750, -20129=>3751, -26505=>3752, -12153=>3753, -32593=>3753, -24448=>3754, -26106=>3755, -26395=>3756, -24536=>3757, -22916=>3758, -23041=>3759, -24013=>3760, -24494=>3761, -21361=>3762, -38886=>3763, -36829=>3764, -26693=>3765, -22260=>3766, -21807=>3767, -24799=>3768, -20026=>3769, -28493=>3770, -32500=>3771, -33479=>3772, -33806=>3773, -22996=>3774, -20255=>3775, -20266=>3776, -23614=>3777, -32428=>3778, -26410=>3779, -34074=>3780, -21619=>3781, -30031=>3782, -32963=>3783, -21890=>3784, -39759=>3785, -20301=>3786, -28205=>3787, -35859=>3788, -23561=>3789, -24944=>3790, -21355=>3791, -30239=>3792, -28201=>3793, -34442=>3794, -12098=>3795, -25991=>3795, -38395=>3796, -32441=>3797, -21563=>3798, -31283=>3799, -32010=>3800, -38382=>3801, -21985=>3802, -32705=>3803, -29934=>3804, -25373=>3805, -34583=>3806, -28065=>3807, -31389=>3808, -25105=>3809, -26017=>3810, -21351=>3811, -25569=>3812, -27779=>3813, -24043=>3814, -21596=>3815, -38056=>3816, -20044=>3817, -27745=>3818, -35820=>3819, -23627=>3820, -12102=>3821, -26080=>3821, -33436=>3822, -26791=>3823, -21566=>3824, -21556=>3825, -12111=>3826, -27595=>3826, -27494=>3827, -20116=>3828, -25410=>3829, -21320=>3830, -33310=>3831, -20237=>3832, -20398=>3833, -22366=>3834, -25098=>3835, -38654=>3836, -26212=>3837, -29289=>3838, -21247=>3839, -21153=>3840, -24735=>3841, -35823=>3842, -26132=>3843, -29081=>3844, -26512=>3845, -35199=>3846, -30802=>3847, -30717=>3848, -26224=>3849, -22075=>3850, -21560=>3851, -38177=>3852, -29306=>3853, -31232=>3854, -24687=>3855, -24076=>3856, -24713=>3857, -33181=>3858, -12067=>3859, -22805=>3859, -24796=>3860, -29060=>3861, -28911=>3862, -28330=>3863, -27728=>3864, -29312=>3865, -27268=>3866, -34989=>3867, -24109=>3868, -20064=>3869, -23219=>3870, -21916=>3871, -38115=>3872, -27927=>3873, -31995=>3874, -38553=>3875, -25103=>3876, -32454=>3877, -30606=>3878, -34430=>3879, -21283=>3880, -38686=>3881, -36758=>3882, -26247=>3883, -23777=>3884, -20384=>3885, -29421=>3886, -19979=>3887, -21414=>3888, -22799=>3889, -21523=>3890, -25472=>3891, -38184=>3892, -20808=>3893, -20185=>3894, -40092=>3895, -32420=>3896, -21688=>3897, -36132=>3898, -34900=>3899, -33335=>3900, -38386=>3901, -28046=>3902, -24358=>3903, -23244=>3904, -26174=>3905, -38505=>3906, -29616=>3907, -29486=>3908, -21439=>3909, -33146=>3910, -39301=>3911, -32673=>3912, -23466=>3913, -38519=>3914, -38480=>3915, -32447=>3916, -30456=>3917, -21410=>3918, -38262=>3919, -12217=>3920, -39321=>3920, -31665=>3921, -35140=>3922, -28248=>3923, -20065=>3924, -32724=>3925, -31077=>3926, -35814=>3927, -24819=>3928, -21709=>3929, -20139=>3930, -39033=>3931, -24055=>3932, -27233=>3933, -20687=>3934, -21521=>3935, -35937=>3936, -33831=>3937, -30813=>3938, -38660=>3939, -21066=>3940, -21742=>3941, -22179=>3942, -38144=>3943, -28040=>3944, -23477=>3945, -28102=>3946, -26195=>3947, -12073=>3948, -23567=>3948, -23389=>3949, -26657=>3950, -32918=>3951, -21880=>3952, -31505=>3953, -25928=>3954, -26964=>3955, -20123=>3956, -27463=>3957, -34638=>3958, -38795=>3959, -21327=>3960, -25375=>3961, -25658=>3962, -37034=>3963, -26012=>3964, -32961=>3965, -35856=>3966, -20889=>3967, -26800=>3968, -21368=>3969, -34809=>3970, -25032=>3971, -27844=>3972, -27899=>3973, -35874=>3974, -23633=>3975, -34218=>3976, -33455=>3977, -38156=>3978, -27427=>3979, -12191=>3980, -36763=>3980, -26032=>3981, -24571=>3982, -12092=>3983, -24515=>3983, -20449=>3984, -34885=>3985, -26143=>3986, -33125=>3987, -29481=>3988, -24826=>3989, -20852=>3990, -21009=>3991, -22411=>3992, -24418=>3993, -37026=>3994, -12175=>3995, -34892=>3995, -37266=>3996, -24184=>3997, -26447=>3998, -24615=>3999, -22995=>4000, -20804=>4001, -20982=>4002, -33016=>4003, -21256=>4004, -27769=>4005, -38596=>4006, -29066=>4007, -20241=>4008, -20462=>4009, -32670=>4010, -26429=>4011, -21957=>4012, -38152=>4013, -31168=>4014, -34966=>4015, -32483=>4016, -22687=>4017, -25100=>4018, -38656=>4019, -34394=>4020, -22040=>4021, -39035=>4022, -24464=>4023, -35768=>4024, -33988=>4025, -37207=>4026, -21465=>4027, -26093=>4028, -24207=>4029, -30044=>4030, -24676=>4031, -32110=>4032, -23167=>4033, -32490=>4034, -32493=>4035, -36713=>4036, -21927=>4037, -23459=>4038, -24748=>4039, -26059=>4040, -12126=>4041, -29572=>4041, -36873=>4042, -30307=>4043, -30505=>4044, -32474=>4045, -38772=>4046, -34203=>4047, -23398=>4048, -12147=>4049, -31348=>4049, -38634=>4050, -12174=>4051, -34880=>4051, -21195=>4052, -29071=>4053, -24490=>4054, -26092=>4055, -35810=>4056, -23547=>4057, -39535=>4058, -24033=>4059, -27529=>4060, -27739=>4061, -35757=>4062, -35759=>4063, -36874=>4064, -36805=>4065, -21387=>4066, -25276=>4067, -40486=>4068, -40493=>4069, -21568=>4070, -20011=>4071, -33469=>4072, -12123=>4073, -29273=>4073, -34460=>4074, -23830=>4075, -34905=>4076, -28079=>4077, -38597=>4078, -21713=>4079, -20122=>4080, -35766=>4081, -28937=>4082, -21693=>4083, -38409=>4084, -28895=>4085, -28153=>4086, -30416=>4087, -20005=>4088, -30740=>4089, -34578=>4090, -23721=>4091, -24310=>4092, -12180=>4093, -35328=>4093, -39068=>4094, -38414=>4095, -28814=>4096, -27839=>4097, -22852=>4098, -25513=>4099, -30524=>4100, -34893=>4101, -28436=>4102, -33395=>4103, -22576=>4104, -29141=>4105, -21388=>4106, -30746=>4107, -38593=>4108, -21761=>4109, -24422=>4110, -28976=>4111, -23476=>4112, -35866=>4113, -39564=>4114, -27523=>4115, -22830=>4116, -40495=>4117, -31207=>4118, -26472=>4119, -25196=>4120, -20335=>4121, -30113=>4122, -12154=>4123, -32650=>4123, -27915=>4124, -38451=>4125, -27687=>4126, -20208=>4127, -30162=>4128, -20859=>4129, -26679=>4130, -28478=>4131, -36992=>4132, -33136=>4133, -22934=>4134, -29814=>4135, -25671=>4136, -23591=>4137, -36965=>4138, -31377=>4139, -35875=>4140, -23002=>4141, -21676=>4142, -33280=>4143, -33647=>4144, -35201=>4145, -32768=>4146, -26928=>4147, -22094=>4148, -32822=>4149, -29239=>4150, -37326=>4151, -20918=>4152, -20063=>4153, -39029=>4154, -25494=>4155, -19994=>4156, -21494=>4157, -26355=>4158, -33099=>4159, -22812=>4160, -28082=>4161, -12032=>4162, -19968=>4162, -22777=>4163, -21307=>4164, -25558=>4165, -38129=>4166, -20381=>4167, -20234=>4168, -12176=>4169, -34915=>4169, -39056=>4170, -22839=>4171, -36951=>4172, -31227=>4173, -20202=>4174, -33008=>4175, -30097=>4176, -27778=>4177, -23452=>4178, -23016=>4179, -24413=>4180, -26885=>4181, -34433=>4182, -20506=>4183, -24050=>4184, -12036=>4185, -20057=>4185, -30691=>4186, -20197=>4187, -33402=>4188, -25233=>4189, -26131=>4190, -12194=>4191, -37009=>4191, -23673=>4192, -20159=>4193, -24441=>4194, -33222=>4195, -36920=>4196, -32900=>4197, -30123=>4198, -20134=>4199, -35028=>4200, -24847=>4201, -27589=>4202, -24518=>4203, -20041=>4204, -30410=>4205, -28322=>4206, -35811=>4207, -35758=>4208, -35850=>4209, -35793=>4210, -24322=>4211, -32764=>4212, -32716=>4213, -32462=>4214, -33589=>4215, -33643=>4216, -22240=>4217, -27575=>4218, -12211=>4219, -38899=>4219, -38452=>4220, -23035=>4221, -21535=>4222, -38134=>4223, -28139=>4224, -23493=>4225, -39278=>4226, -23609=>4227, -24341=>4228, -38544=>4229, -21360=>4230, -33521=>4231, -27185=>4232, -23156=>4233, -40560=>4234, -24212=>4235, -32552=>4236, -33721=>4237, -33828=>4238, -33829=>4239, -33639=>4240, -34631=>4241, -36814=>4242, -36194=>4243, -30408=>4244, -24433=>4245, -39062=>4246, -30828=>4247, -26144=>4248, -21727=>4249, -25317=>4250, -20323=>4251, -33219=>4252, -30152=>4253, -24248=>4254, -38605=>4255, -36362=>4256, -34553=>4257, -21647=>4258, -27891=>4259, -28044=>4260, -27704=>4261, -24703=>4262, -21191=>4263, -12132=>4264, -29992=>4264, -24189=>4265, -20248=>4266, -24736=>4267, -24551=>4268, -23588=>4269, -30001=>4270, -37038=>4271, -38080=>4272, -29369=>4273, -27833=>4274, -28216=>4275, -12195=>4276, -37193=>4276, -26377=>4277, -21451=>4278, -21491=>4279, -20305=>4280, -37321=>4281, -35825=>4282, -12060=>4283, -21448=>4283, -24188=>4284, -36802=>4285, -28132=>4286, -20110=>4287, -30402=>4288, -27014=>4289, -34398=>4290, -24858=>4291, -33286=>4292, -20313=>4293, -20446=>4294, -36926=>4295, -40060=>4296, -24841=>4297, -28189=>4298, -28180=>4299, -38533=>4300, -20104=>4301, -23089=>4302, -12204=>4303, -38632=>4303, -19982=>4304, -23679=>4305, -31161=>4306, -23431=>4307, -35821=>4308, -12155=>4309, -32701=>4309, -12127=>4310, -29577=>4310, -22495=>4311, -33419=>4312, -37057=>4313, -21505=>4314, -36935=>4315, -21947=>4316, -23786=>4317, -24481=>4318, -24840=>4319, -27442=>4320, -29425=>4321, -32946=>4322, -35465=>4323, -28020=>4324, -23507=>4325, -35029=>4326, -39044=>4327, -35947=>4328, -39533=>4329, -40499=>4330, -28170=>4331, -20900=>4332, -20803=>4333, -22435=>4334, -34945=>4335, -21407=>4336, -25588=>4337, -36757=>4338, -22253=>4339, -21592=>4340, -22278=>4341, -29503=>4342, -28304=>4343, -32536=>4344, -36828=>4345, -33489=>4346, -24895=>4347, -24616=>4348, -38498=>4349, -12104=>4350, -26352=>4350, -32422=>4351, -36234=>4352, -36291=>4353, -38053=>4354, -23731=>4355, -31908=>4356, -12105=>4357, -26376=>4357, -24742=>4358, -38405=>4359, -32792=>4360, -20113=>4361, -37095=>4362, -21248=>4363, -38504=>4364, -20801=>4365, -36816=>4366, -34164=>4367, -37213=>4368, -26197=>4369, -38901=>4370, -23381=>4371, -21277=>4372, -30776=>4373, -26434=>4374, -26685=>4375, -21705=>4376, -28798=>4377, -23472=>4378, -36733=>4379, -20877=>4380, -22312=>4381, -21681=>4382, -25874=>4383, -26242=>4384, -36190=>4385, -36163=>4386, -33039=>4387, -33900=>4388, -36973=>4389, -31967=>4390, -20991=>4391, -34299=>4392, -26531=>4393, -26089=>4394, -28577=>4395, -34468=>4396, -36481=>4397, -22122=>4398, -36896=>4399, -30338=>4400, -28790=>4401, -29157=>4402, -36131=>4403, -25321=>4404, -21017=>4405, -27901=>4406, -36156=>4407, -24590=>4408, -22686=>4409, -24974=>4410, -26366=>4411, -36192=>4412, -25166=>4413, -21939=>4414, -28195=>4415, -26413=>4416, -36711=>4417, -38113=>4418, -38392=>4419, -30504=>4420, -26629=>4421, -27048=>4422, -21643=>4423, -20045=>4424, -28856=>4425, -35784=>4426, -25688=>4427, -25995=>4428, -23429=>4429, -31364=>4430, -20538=>4431, -23528=>4432, -30651=>4433, -27617=>4434, -35449=>4435, -31896=>4436, -27838=>4437, -30415=>4438, -26025=>4439, -36759=>4440, -23853=>4441, -23637=>4442, -34360=>4443, -26632=>4444, -21344=>4445, -25112=>4446, -31449=>4447, -28251=>4448, -32509=>4449, -27167=>4450, -31456=>4451, -24432=>4452, -28467=>4453, -24352=>4454, -25484=>4455, -28072=>4456, -26454=>4457, -19976=>4458, -24080=>4459, -36134=>4460, -20183=>4461, -32960=>4462, -30260=>4463, -38556=>4464, -25307=>4465, -26157=>4466, -25214=>4467, -27836=>4468, -36213=>4469, -29031=>4470, -32617=>4471, -20806=>4472, -32903=>4473, -21484=>4474, -36974=>4475, -25240=>4476, -21746=>4477, -34544=>4478, -36761=>4479, -32773=>4480, -38167=>4481, -34071=>4482, -36825=>4483, -27993=>4484, -29645=>4485, -26015=>4486, -30495=>4487, -29956=>4488, -30759=>4489, -33275=>4490, -36126=>4491, -38024=>4492, -20390=>4493, -26517=>4494, -30137=>4495, -35786=>4496, -38663=>4497, -25391=>4498, -38215=>4499, -38453=>4500, -33976=>4501, -25379=>4502, -30529=>4503, -24449=>4504, -29424=>4505, -20105=>4506, -24596=>4507, -25972=>4508, -25327=>4509, -27491=>4510, -25919=>4511, -24103=>4512, -30151=>4513, -37073=>4514, -35777=>4515, -33437=>4516, -26525=>4517, -12096=>4518, -25903=>4518, -21553=>4519, -34584=>4520, -30693=>4521, -32930=>4522, -33026=>4523, -27713=>4524, -20043=>4525, -32455=>4526, -32844=>4527, -30452=>4528, -26893=>4529, -27542=>4530, -25191=>4531, -20540=>4532, -20356=>4533, -22336=>4534, -25351=>4535, -12108=>4536, -27490=>4536, -36286=>4537, -21482=>4538, -26088=>4539, -32440=>4540, -24535=>4541, -25370=>4542, -25527=>4543, -12164=>4544, -33267=>4544, -33268=>4545, -32622=>4546, -24092=>4547, -23769=>4548, -21046=>4549, -26234=>4550, -31209=>4551, -31258=>4552, -36136=>4553, -28825=>4554, -30164=>4555, -28382=>4556, -27835=>4557, -31378=>4558, -20013=>4559, -30405=>4560, -24544=>4561, -38047=>4562, -34935=>4563, -32456=>4564, -31181=>4565, -32959=>4566, -37325=>4567, -20210=>4568, -20247=>4569, -12168=>4570, -33311=>4570, -21608=>4571, -24030=>4572, -27954=>4573, -35788=>4574, -31909=>4575, -36724=>4576, -32920=>4577, -24090=>4578, -21650=>4579, -30385=>4580, -23449=>4581, -26172=>4582, -39588=>4583, -29664=>4584, -26666=>4585, -34523=>4586, -26417=>4587, -29482=>4588, -35832=>4589, -35803=>4590, -36880=>4591, -12149=>4592, -31481=>4592, -28891=>4593, -29038=>4594, -25284=>4595, -30633=>4596, -22065=>4597, -20027=>4598, -33879=>4599, -26609=>4600, -21161=>4601, -34496=>4602, -36142=>4603, -38136=>4604, -31569=>4605, -20303=>4606, -27880=>4607, -31069=>4608, -39547=>4609, -25235=>4610, -12118=>4611, -29226=>4611, -25341=>4612, -19987=>4613, -30742=>4614, -36716=>4615, -25776=>4616, -36186=>4617, -31686=>4618, -26729=>4619, -24196=>4620, -35013=>4621, -22918=>4622, -25758=>4623, -22766=>4624, -29366=>4625, -26894=>4626, -38181=>4627, -36861=>4628, -36184=>4629, -22368=>4630, -32512=>4631, -35846=>4632, -20934=>4633, -25417=>4634, -25305=>4635, -21331=>4636, -26700=>4637, -29730=>4638, -33537=>4639, -37196=>4640, -21828=>4641, -30528=>4642, -28796=>4643, -27978=>4644, -20857=>4645, -21672=>4646, -36164=>4647, -23039=>4648, -28363=>4649, -28100=>4650, -23388=>4651, -32043=>4652, -20180=>4653, -31869=>4654, -28371=>4655, -12070=>4656, -23376=>4656, -12163=>4657, -33258=>4657, -28173=>4658, -23383=>4659, -39683=>4660, -26837=>4661, -36394=>4662, -23447=>4663, -32508=>4664, -24635=>4665, -32437=>4666, -37049=>4667, -12187=>4668, -36208=>4668, -22863=>4669, -25549=>4670, -31199=>4671, -12188=>4672, -36275=>4672, -21330=>4673, -26063=>4674, -31062=>4675, -35781=>4676, -38459=>4677, -32452=>4678, -38075=>4679, -32386=>4680, -22068=>4681, -37257=>4682, -26368=>4683, -32618=>4684, -23562=>4685, -36981=>4686, -26152=>4687, -24038=>4688, -20304=>4689, -26590=>4690, -20570=>4691, -20316=>4692, -22352=>4693, -24231=>4694, -20109=>4695, -19980=>4696, -20800=>4697, -64012=>4697, -19984=>4698, -24319=>4699, -21317=>4700, -19989=>4701, -20120=>4702, -19998=>4703, -12224=>4704, -39730=>4704, -23404=>4705, -22121=>4706, -12033=>4707, -20008=>4707, -31162=>4708, -12035=>4709, -20031=>4709, -12052=>4710, -21269=>4710, -20039=>4711, -22829=>4712, -12120=>4713, -29243=>4713, -21358=>4714, -27664=>4715, -22239=>4716, -32996=>4717, -39319=>4718, -27603=>4719, -30590=>4720, -40727=>4721, -12034=>4722, -20022=>4722, -20127=>4723, -40720=>4724, -20060=>4725, -20073=>4726, -20115=>4727, -33416=>4728, -23387=>4729, -21868=>4730, -22031=>4731, -20164=>4732, -21389=>4733, -21405=>4734, -21411=>4735, -21413=>4736, -21422=>4737, -38757=>4738, -36189=>4739, -12053=>4740, -21274=>4740, -21493=>4741, -21286=>4742, -21294=>4743, -21310=>4744, -36188=>4745, -21350=>4746, -21347=>4747, -20994=>4748, -21000=>4749, -21006=>4750, -21037=>4751, -21043=>4752, -21055=>4753, -21056=>4754, -21068=>4755, -21086=>4756, -21089=>4757, -21084=>4758, -33967=>4759, -21117=>4760, -21122=>4761, -21121=>4762, -21136=>4763, -21139=>4764, -12044=>4765, -20866=>4765, -32596=>4766, -20155=>4767, -20163=>4768, -20169=>4769, -20162=>4770, -20200=>4771, -20193=>4772, -20203=>4773, -20190=>4774, -20251=>4775, -20211=>4776, -20258=>4777, -20324=>4778, -20213=>4779, -20261=>4780, -20263=>4781, -20233=>4782, -20267=>4783, -20318=>4784, -20327=>4785, -25912=>4786, -20314=>4787, -20317=>4788, -20319=>4789, -20311=>4790, -20274=>4791, -20285=>4792, -20342=>4793, -20340=>4794, -20369=>4795, -20361=>4796, -20355=>4797, -20367=>4798, -20350=>4799, -20347=>4800, -20394=>4801, -20348=>4802, -20396=>4803, -20372=>4804, -20454=>4805, -20456=>4806, -20458=>4807, -20421=>4808, -20442=>4809, -20451=>4810, -20444=>4811, -20433=>4812, -20447=>4813, -20472=>4814, -20521=>4815, -20556=>4816, -20467=>4817, -20524=>4818, -20495=>4819, -20526=>4820, -20525=>4821, -20478=>4822, -20508=>4823, -20492=>4824, -20517=>4825, -20520=>4826, -20606=>4827, -20547=>4828, -20565=>4829, -20552=>4830, -20558=>4831, -20588=>4832, -20603=>4833, -20645=>4834, -20647=>4835, -20649=>4836, -20666=>4837, -20694=>4838, -20742=>4839, -20717=>4840, -20716=>4841, -20710=>4842, -20718=>4843, -20743=>4844, -20747=>4845, -20189=>4846, -27709=>4847, -20312=>4848, -20325=>4849, -20430=>4850, -12245=>4851, -40864=>4851, -27718=>4852, -31860=>4853, -20846=>4854, -24061=>4855, -40649=>4856, -39320=>4857, -20865=>4858, -22804=>4859, -12051=>4860, -21241=>4860, -21261=>4861, -35335=>4862, -21264=>4863, -20971=>4864, -22809=>4865, -20821=>4866, -12039=>4867, -20128=>4867, -20822=>4868, -20147=>4869, -34926=>4870, -34980=>4871, -20149=>4872, -33044=>4873, -35026=>4874, -31104=>4875, -23348=>4876, -34819=>4877, -32696=>4878, -12046=>4879, -20907=>4879, -20913=>4880, -20925=>4881, -20924=>4882, -20935=>4883, -12045=>4884, -20886=>4884, -20898=>4885, -20901=>4886, -35744=>4887, -35750=>4888, -35751=>4889, -35754=>4890, -35764=>4891, -35765=>4892, -35767=>4893, -35778=>4894, -35779=>4895, -35787=>4896, -35791=>4897, -35790=>4898, -35794=>4899, -35795=>4900, -35796=>4901, -35798=>4902, -35800=>4903, -35801=>4904, -35804=>4905, -35807=>4906, -35808=>4907, -35812=>4908, -35816=>4909, -35817=>4910, -35822=>4911, -35824=>4912, -35827=>4913, -35830=>4914, -35833=>4915, -35836=>4916, -35839=>4917, -35840=>4918, -35842=>4919, -35844=>4920, -35847=>4921, -35852=>4922, -35855=>4923, -35857=>4924, -35858=>4925, -35860=>4926, -35861=>4927, -35862=>4928, -35865=>4929, -35867=>4930, -35864=>4931, -35869=>4932, -35871=>4933, -35872=>4934, -35873=>4935, -35877=>4936, -35879=>4937, -35882=>4938, -35883=>4939, -35886=>4940, -35887=>4941, -35890=>4942, -35891=>4943, -35893=>4944, -35894=>4945, -12057=>4946, -21353=>4946, -21370=>4947, -38429=>4948, -38434=>4949, -38433=>4950, -38449=>4951, -38442=>4952, -38461=>4953, -38460=>4954, -38466=>4955, -38473=>4956, -38484=>4957, -38495=>4958, -38503=>4959, -38508=>4960, -38514=>4961, -38516=>4962, -38536=>4963, -38541=>4964, -38551=>4965, -38576=>4966, -37015=>4967, -37019=>4968, -37021=>4969, -37017=>4970, -37036=>4971, -37025=>4972, -37044=>4973, -37043=>4974, -37046=>4975, -37050=>4976, -37048=>4977, -37040=>4978, -37071=>4979, -37061=>4980, -37054=>4981, -37072=>4982, -37060=>4983, -37063=>4984, -37075=>4985, -37094=>4986, -37090=>4987, -37084=>4988, -37079=>4989, -37083=>4990, -37099=>4991, -37103=>4992, -37118=>4993, -37124=>4994, -37154=>4995, -37150=>4996, -37155=>4997, -37169=>4998, -37167=>4999, -37177=>5000, -37187=>5001, -37190=>5002, -21005=>5003, -22850=>5004, -21154=>5005, -21164=>5006, -21165=>5007, -21182=>5008, -21759=>5009, -21200=>5010, -21206=>5011, -21232=>5012, -21471=>5013, -29166=>5014, -30669=>5015, -12085=>5016, -24308=>5016, -12048=>5017, -20981=>5017, -20988=>5018, -12223=>5019, -39727=>5019, -12059=>5020, -21430=>5020, -24321=>5021, -30042=>5022, -24047=>5023, -22348=>5024, -22441=>5025, -22433=>5026, -22654=>5027, -22716=>5028, -22725=>5029, -22737=>5030, -22313=>5031, -22316=>5032, -22314=>5033, -22323=>5034, -22329=>5035, -22318=>5036, -22319=>5037, -22364=>5038, -22331=>5039, -22338=>5040, -22377=>5041, -22405=>5042, -22379=>5043, -22406=>5044, -22396=>5045, -22395=>5046, -22376=>5047, -22381=>5048, -22390=>5049, -22387=>5050, -22445=>5051, -22436=>5052, -22412=>5053, -22450=>5054, -22479=>5055, -22439=>5056, -22452=>5057, -22419=>5058, -22432=>5059, -22485=>5060, -22488=>5061, -22490=>5062, -22489=>5063, -22482=>5064, -22456=>5065, -22516=>5066, -22511=>5067, -22520=>5068, -22500=>5069, -22493=>5070, -22539=>5071, -22541=>5072, -22525=>5073, -22509=>5074, -22528=>5075, -22558=>5076, -22553=>5077, -22596=>5078, -22560=>5079, -22629=>5080, -22636=>5081, -22657=>5082, -22665=>5083, -22682=>5084, -22656=>5085, -39336=>5086, -40729=>5087, -25087=>5088, -33401=>5089, -33405=>5090, -33407=>5091, -33423=>5092, -33418=>5093, -33448=>5094, -33412=>5095, -33422=>5096, -33425=>5097, -33431=>5098, -33433=>5099, -33451=>5100, -33464=>5101, -33470=>5102, -33456=>5103, -33480=>5104, -33482=>5105, -33507=>5106, -33432=>5107, -33463=>5108, -33454=>5109, -33483=>5110, -33484=>5111, -33473=>5112, -33449=>5113, -33460=>5114, -33441=>5115, -33450=>5116, -33439=>5117, -33476=>5118, -33486=>5119, -33444=>5120, -33505=>5121, -33545=>5122, -33527=>5123, -33508=>5124, -33551=>5125, -33543=>5126, -33500=>5127, -33524=>5128, -33490=>5129, -33496=>5130, -33548=>5131, -33531=>5132, -33491=>5133, -33553=>5134, -33562=>5135, -33542=>5136, -33556=>5137, -33557=>5138, -33504=>5139, -33493=>5140, -33564=>5141, -33617=>5142, -33627=>5143, -33628=>5144, -33544=>5145, -33682=>5146, -33596=>5147, -33588=>5148, -33585=>5149, -33691=>5150, -33630=>5151, -33583=>5152, -33615=>5153, -33607=>5154, -33603=>5155, -33631=>5156, -33600=>5157, -33559=>5158, -33632=>5159, -33581=>5160, -33594=>5161, -33587=>5162, -33638=>5163, -33637=>5164, -33640=>5165, -33563=>5166, -33641=>5167, -33644=>5168, -33642=>5169, -33645=>5170, -33646=>5171, -33712=>5172, -33656=>5173, -33715=>5174, -33716=>5175, -33696=>5176, -33706=>5177, -33683=>5178, -33692=>5179, -33669=>5180, -33660=>5181, -33718=>5182, -33705=>5183, -33661=>5184, -33720=>5185, -33659=>5186, -33688=>5187, -33694=>5188, -33704=>5189, -33722=>5190, -33724=>5191, -33729=>5192, -33793=>5193, -33765=>5194, -33752=>5195, -22535=>5196, -33816=>5197, -33803=>5198, -33757=>5199, -33789=>5200, -33750=>5201, -33820=>5202, -33848=>5203, -33809=>5204, -33798=>5205, -33748=>5206, -33759=>5207, -33807=>5208, -33795=>5209, -33784=>5210, -33785=>5211, -33770=>5212, -33733=>5213, -33728=>5214, -33830=>5215, -33776=>5216, -33761=>5217, -33884=>5218, -33873=>5219, -33882=>5220, -33881=>5221, -33907=>5222, -33927=>5223, -33928=>5224, -33914=>5225, -33929=>5226, -33912=>5227, -33852=>5228, -33862=>5229, -33897=>5230, -33910=>5231, -33932=>5232, -33934=>5233, -33841=>5234, -33901=>5235, -33985=>5236, -33997=>5237, -34000=>5238, -34022=>5239, -33981=>5240, -34003=>5241, -33994=>5242, -33983=>5243, -33978=>5244, -34016=>5245, -33953=>5246, -33977=>5247, -33972=>5248, -33943=>5249, -34021=>5250, -34019=>5251, -34060=>5252, -29965=>5253, -34104=>5254, -34032=>5255, -34105=>5256, -34079=>5257, -34106=>5258, -34134=>5259, -34107=>5260, -34047=>5261, -34044=>5262, -34137=>5263, -34120=>5264, -34152=>5265, -34148=>5266, -34142=>5267, -34170=>5268, -30626=>5269, -34115=>5270, -34162=>5271, -34171=>5272, -34212=>5273, -34216=>5274, -34183=>5275, -34191=>5276, -34169=>5277, -34222=>5278, -34204=>5279, -34181=>5280, -34233=>5281, -34231=>5282, -34224=>5283, -34259=>5284, -34241=>5285, -34268=>5286, -34303=>5287, -34343=>5288, -34309=>5289, -34345=>5290, -34326=>5291, -34364=>5292, -12086=>5293, -24318=>5293, -24328=>5294, -22844=>5295, -22849=>5296, -32823=>5297, -22869=>5298, -22874=>5299, -22872=>5300, -21263=>5301, -12074=>5302, -23586=>5302, -23589=>5303, -23596=>5304, -23604=>5305, -25164=>5306, -25194=>5307, -25247=>5308, -25275=>5309, -25290=>5310, -25306=>5311, -25303=>5312, -25326=>5313, -25378=>5314, -25334=>5315, -25401=>5316, -25419=>5317, -25411=>5318, -25517=>5319, -25590=>5320, -25457=>5321, -25466=>5322, -25486=>5323, -25524=>5324, -25453=>5325, -25516=>5326, -25482=>5327, -25449=>5328, -25518=>5329, -25532=>5330, -25586=>5331, -25592=>5332, -25568=>5333, -25599=>5334, -25540=>5335, -25566=>5336, -25550=>5337, -25682=>5338, -25542=>5339, -25534=>5340, -25669=>5341, -25665=>5342, -25611=>5343, -25627=>5344, -25632=>5345, -25612=>5346, -25638=>5347, -25633=>5348, -25694=>5349, -25732=>5350, -25709=>5351, -25750=>5352, -25722=>5353, -25783=>5354, -25784=>5355, -25753=>5356, -25786=>5357, -25792=>5358, -25808=>5359, -25815=>5360, -25828=>5361, -25826=>5362, -25865=>5363, -25893=>5364, -25902=>5365, -12087=>5366, -24331=>5366, -24530=>5367, -29977=>5368, -24337=>5369, -21343=>5370, -21489=>5371, -21501=>5372, -21481=>5373, -21480=>5374, -21499=>5375, -21522=>5376, -21526=>5377, -21510=>5378, -21579=>5379, -21586=>5380, -21587=>5381, -21588=>5382, -21590=>5383, -21571=>5384, -21537=>5385, -21591=>5386, -21593=>5387, -21539=>5388, -21554=>5389, -21634=>5390, -21652=>5391, -21623=>5392, -21617=>5393, -21604=>5394, -21658=>5395, -21659=>5396, -21636=>5397, -21622=>5398, -21606=>5399, -21661=>5400, -21712=>5401, -21677=>5402, -21698=>5403, -21684=>5404, -21714=>5405, -21671=>5406, -21670=>5407, -21715=>5408, -21716=>5409, -21618=>5410, -21667=>5411, -21717=>5412, -21691=>5413, -21695=>5414, -21708=>5415, -21721=>5416, -21722=>5417, -21724=>5418, -21673=>5419, -21674=>5420, -21668=>5421, -21725=>5422, -21711=>5423, -21726=>5424, -21787=>5425, -21735=>5426, -21792=>5427, -21757=>5428, -21780=>5429, -21747=>5430, -21794=>5431, -21795=>5432, -21775=>5433, -21777=>5434, -21799=>5435, -21802=>5436, -21863=>5437, -21903=>5438, -21941=>5439, -21833=>5440, -21869=>5441, -21825=>5442, -21845=>5443, -21823=>5444, -21840=>5445, -21820=>5446, -21815=>5447, -21846=>5448, -21877=>5449, -21878=>5450, -21879=>5451, -21811=>5452, -21808=>5453, -21852=>5454, -21899=>5455, -21970=>5456, -21891=>5457, -21937=>5458, -21945=>5459, -21896=>5460, -21889=>5461, -21919=>5462, -21886=>5463, -21974=>5464, -21905=>5465, -21883=>5466, -21983=>5467, -21949=>5468, -21950=>5469, -21908=>5470, -21913=>5471, -21994=>5472, -22007=>5473, -21961=>5474, -22047=>5475, -21969=>5476, -21995=>5477, -21996=>5478, -21972=>5479, -21990=>5480, -21981=>5481, -21956=>5482, -21999=>5483, -21989=>5484, -22002=>5485, -22003=>5486, -21964=>5487, -21965=>5488, -21992=>5489, -22005=>5490, -21988=>5491, -36756=>5492, -22046=>5493, -22024=>5494, -22028=>5495, -22017=>5496, -22052=>5497, -22051=>5498, -22014=>5499, -22016=>5500, -22055=>5501, -22061=>5502, -22104=>5503, -22073=>5504, -22103=>5505, -22060=>5506, -22093=>5507, -22114=>5508, -22105=>5509, -22108=>5510, -22092=>5511, -22100=>5512, -22150=>5513, -22116=>5514, -22129=>5515, -22123=>5516, -22139=>5517, -22140=>5518, -22149=>5519, -22163=>5520, -22191=>5521, -22228=>5522, -12062=>5523, -22231=>5523, -22237=>5524, -22241=>5525, -22261=>5526, -22251=>5527, -22265=>5528, -22271=>5529, -22276=>5530, -22282=>5531, -22281=>5532, -22300=>5533, -24079=>5534, -24089=>5535, -24084=>5536, -24081=>5537, -24113=>5538, -24123=>5539, -24124=>5540, -24119=>5541, -24132=>5542, -24148=>5543, -24155=>5544, -24158=>5545, -24161=>5546, -23692=>5547, -23674=>5548, -23693=>5549, -23696=>5550, -23702=>5551, -23688=>5552, -23704=>5553, -23705=>5554, -23697=>5555, -23706=>5556, -23708=>5557, -23733=>5558, -23714=>5559, -23741=>5560, -23724=>5561, -23723=>5562, -23729=>5563, -23715=>5564, -23745=>5565, -23735=>5566, -23748=>5567, -23762=>5568, -23780=>5569, -23755=>5570, -23781=>5571, -23810=>5572, -23811=>5573, -23847=>5574, -23846=>5575, -23854=>5576, -23844=>5577, -23838=>5578, -23814=>5579, -23835=>5580, -23896=>5581, -23870=>5582, -23860=>5583, -23869=>5584, -23916=>5585, -23899=>5586, -23919=>5587, -23901=>5588, -23915=>5589, -23883=>5590, -23882=>5591, -23913=>5592, -23924=>5593, -23938=>5594, -23961=>5595, -23965=>5596, -35955=>5597, -23991=>5598, -24005=>5599, -12091=>5600, -24435=>5600, -24439=>5601, -24450=>5602, -24455=>5603, -24457=>5604, -24460=>5605, -24469=>5606, -24473=>5607, -24476=>5608, -24488=>5609, -24493=>5610, -24501=>5611, -24508=>5612, -34914=>5613, -12090=>5614, -24417=>5614, -29357=>5615, -29360=>5616, -29364=>5617, -29367=>5618, -29368=>5619, -29379=>5620, -29377=>5621, -29390=>5622, -29389=>5623, -29394=>5624, -29416=>5625, -29423=>5626, -29417=>5627, -29426=>5628, -29428=>5629, -29431=>5630, -29441=>5631, -29427=>5632, -29443=>5633, -29434=>5634, -29435=>5635, -29463=>5636, -29459=>5637, -29473=>5638, -29450=>5639, -29470=>5640, -29469=>5641, -29461=>5642, -29474=>5643, -29497=>5644, -29477=>5645, -29484=>5646, -29496=>5647, -29489=>5648, -29520=>5649, -29517=>5650, -29527=>5651, -29536=>5652, -29548=>5653, -29551=>5654, -29566=>5655, -12167=>5656, -33307=>5656, -22821=>5657, -39143=>5658, -22820=>5659, -12065=>5660, -22786=>5660, -39267=>5661, -39271=>5662, -39272=>5663, -39273=>5664, -39274=>5665, -39275=>5666, -39276=>5667, -39284=>5668, -39287=>5669, -39293=>5670, -39296=>5671, -39300=>5672, -39303=>5673, -39306=>5674, -39309=>5675, -39312=>5676, -39313=>5677, -39315=>5678, -39316=>5679, -39317=>5680, -24192=>5681, -24209=>5682, -24203=>5683, -24214=>5684, -24229=>5685, -24224=>5686, -24249=>5687, -24245=>5688, -24254=>5689, -24243=>5690, -36179=>5691, -24274=>5692, -24273=>5693, -24283=>5694, -24296=>5695, -24298=>5696, -33210=>5697, -24516=>5698, -24521=>5699, -24534=>5700, -24527=>5701, -24579=>5702, -24558=>5703, -24580=>5704, -24545=>5705, -24548=>5706, -24574=>5707, -24581=>5708, -24582=>5709, -24554=>5710, -24557=>5711, -24568=>5712, -24601=>5713, -24629=>5714, -24614=>5715, -24603=>5716, -24591=>5717, -24589=>5718, -24617=>5719, -24619=>5720, -24586=>5721, -24639=>5722, -24609=>5723, -24696=>5724, -24697=>5725, -24699=>5726, -24698=>5727, -24642=>5728, -24682=>5729, -24701=>5730, -24726=>5731, -24730=>5732, -24749=>5733, -24733=>5734, -24707=>5735, -24722=>5736, -24716=>5737, -24731=>5738, -24812=>5739, -24763=>5740, -24753=>5741, -24797=>5742, -24792=>5743, -24774=>5744, -24794=>5745, -24756=>5746, -24864=>5747, -24870=>5748, -24853=>5749, -24867=>5750, -24820=>5751, -24832=>5752, -24846=>5753, -24875=>5754, -24906=>5755, -24949=>5756, -25004=>5757, -24980=>5758, -24999=>5759, -25015=>5760, -25044=>5761, -25077=>5762, -24541=>5763, -38579=>5764, -38377=>5765, -38379=>5766, -38385=>5767, -38387=>5768, -38389=>5769, -38390=>5770, -38396=>5771, -38398=>5772, -38403=>5773, -38404=>5774, -38406=>5775, -38408=>5776, -38410=>5777, -38411=>5778, -38412=>5779, -38413=>5780, -38415=>5781, -38418=>5782, -38421=>5783, -38422=>5784, -38423=>5785, -38425=>5786, -38426=>5787, -20012=>5788, -12121=>5789, -29247=>5789, -25109=>5790, -27701=>5791, -27732=>5792, -27740=>5793, -27722=>5794, -27811=>5795, -27781=>5796, -27792=>5797, -27796=>5798, -27788=>5799, -27752=>5800, -27753=>5801, -27764=>5802, -27766=>5803, -27782=>5804, -27817=>5805, -27856=>5806, -27860=>5807, -27821=>5808, -27895=>5809, -27896=>5810, -27889=>5811, -27863=>5812, -27826=>5813, -27872=>5814, -27862=>5815, -27898=>5816, -27883=>5817, -27886=>5818, -27825=>5819, -27859=>5820, -27887=>5821, -27902=>5822, -27961=>5823, -27943=>5824, -27916=>5825, -27971=>5826, -27976=>5827, -27911=>5828, -27908=>5829, -27929=>5830, -27918=>5831, -27947=>5832, -27981=>5833, -27950=>5834, -27957=>5835, -27930=>5836, -27983=>5837, -27986=>5838, -27988=>5839, -27955=>5840, -28049=>5841, -28015=>5842, -28062=>5843, -28064=>5844, -27998=>5845, -28051=>5846, -28052=>5847, -27996=>5848, -28000=>5849, -28028=>5850, -28003=>5851, -28186=>5852, -28103=>5853, -28101=>5854, -28126=>5855, -28174=>5856, -28095=>5857, -28128=>5858, -28177=>5859, -28134=>5860, -28125=>5861, -28121=>5862, -28182=>5863, -28075=>5864, -28172=>5865, -28078=>5866, -28203=>5867, -28270=>5868, -28238=>5869, -28267=>5870, -28338=>5871, -28255=>5872, -28294=>5873, -28243=>5874, -28244=>5875, -28210=>5876, -28197=>5877, -28228=>5878, -28383=>5879, -28337=>5880, -28312=>5881, -28384=>5882, -28461=>5883, -28386=>5884, -28325=>5885, -28327=>5886, -28349=>5887, -28347=>5888, -28343=>5889, -28375=>5890, -28340=>5891, -28367=>5892, -28303=>5893, -28354=>5894, -28319=>5895, -28514=>5896, -28486=>5897, -28487=>5898, -28452=>5899, -28437=>5900, -28409=>5901, -28463=>5902, -28470=>5903, -28491=>5904, -28532=>5905, -28458=>5906, -28425=>5907, -28457=>5908, -28553=>5909, -28557=>5910, -28556=>5911, -28536=>5912, -28530=>5913, -28540=>5914, -28538=>5915, -28625=>5916, -28617=>5917, -28583=>5918, -28601=>5919, -28598=>5920, -28610=>5921, -28641=>5922, -28654=>5923, -28638=>5924, -28640=>5925, -28655=>5926, -28698=>5927, -28707=>5928, -28699=>5929, -28729=>5930, -28725=>5931, -28751=>5932, -28766=>5933, -12071=>5934, -23424=>5934, -23428=>5935, -23445=>5936, -23443=>5937, -23461=>5938, -23480=>5939, -29999=>5940, -39582=>5941, -25652=>5942, -23524=>5943, -23534=>5944, -35120=>5945, -23536=>5946, -36423=>5947, -35591=>5948, -36790=>5949, -36819=>5950, -36821=>5951, -36837=>5952, -36846=>5953, -36836=>5954, -36841=>5955, -36838=>5956, -36851=>5957, -36840=>5958, -36869=>5959, -36868=>5960, -36875=>5961, -36902=>5962, -36881=>5963, -36877=>5964, -36886=>5965, -36897=>5966, -36917=>5967, -36918=>5968, -36909=>5969, -36911=>5970, -36932=>5971, -36945=>5972, -36946=>5973, -36944=>5974, -36968=>5975, -36952=>5976, -36962=>5977, -36955=>5978, -26297=>5979, -36980=>5980, -36989=>5981, -36994=>5982, -37000=>5983, -36995=>5984, -37003=>5985, -12089=>5986, -24400=>5986, -24407=>5987, -24406=>5988, -24408=>5989, -23611=>5990, -21675=>5991, -23632=>5992, -23641=>5993, -23409=>5994, -23651=>5995, -23654=>5996, -32700=>5997, -24362=>5998, -24361=>5999, -24365=>6000, -33396=>6001, -24380=>6002, -39739=>6003, -12076=>6004, -23662=>6004, -22913=>6005, -22915=>6006, -22925=>6007, -22953=>6008, -22954=>6009, -22947=>6010, -22935=>6011, -22986=>6012, -22955=>6013, -22942=>6014, -22948=>6015, -22994=>6016, -22962=>6017, -22959=>6018, -22999=>6019, -22974=>6020, -23045=>6021, -23046=>6022, -23005=>6023, -23048=>6024, -23011=>6025, -23000=>6026, -23033=>6027, -23052=>6028, -23049=>6029, -23090=>6030, -23092=>6031, -23057=>6032, -23075=>6033, -23059=>6034, -23104=>6035, -23143=>6036, -23114=>6037, -23125=>6038, -23100=>6039, -23138=>6040, -23157=>6041, -33004=>6042, -23210=>6043, -23195=>6044, -23159=>6045, -23162=>6046, -23230=>6047, -23275=>6048, -23218=>6049, -23250=>6050, -23252=>6051, -23224=>6052, -23264=>6053, -23267=>6054, -23281=>6055, -23254=>6056, -23270=>6057, -23256=>6058, -23260=>6059, -23305=>6060, -23319=>6061, -23318=>6062, -23346=>6063, -23351=>6064, -23360=>6065, -23573=>6066, -23580=>6067, -23386=>6068, -23397=>6069, -23411=>6070, -23377=>6071, -23379=>6072, -23394=>6073, -39541=>6074, -39543=>6075, -39544=>6076, -39546=>6077, -39551=>6078, -39549=>6079, -39552=>6080, -39553=>6081, -39557=>6082, -39560=>6083, -39562=>6084, -39568=>6085, -39570=>6086, -39571=>6087, -39574=>6088, -39576=>6089, -39579=>6090, -39580=>6091, -39581=>6092, -39583=>6093, -39584=>6094, -39586=>6095, -39587=>6096, -39589=>6097, -39591=>6098, -32415=>6099, -32417=>6100, -32419=>6101, -32421=>6102, -32424=>6103, -32425=>6104, -32429=>6105, -32432=>6106, -32446=>6107, -32448=>6108, -32449=>6109, -32450=>6110, -32457=>6111, -32459=>6112, -32460=>6113, -32464=>6114, -32468=>6115, -32471=>6116, -32475=>6117, -32480=>6118, -32481=>6119, -32488=>6120, -32491=>6121, -32494=>6122, -32495=>6123, -32497=>6124, -32498=>6125, -32525=>6126, -32502=>6127, -32506=>6128, -32507=>6129, -32510=>6130, -32513=>6131, -32514=>6132, -32515=>6133, -32519=>6134, -32520=>6135, -32523=>6136, -32524=>6137, -32527=>6138, -32529=>6139, -32530=>6140, -32535=>6141, -32537=>6142, -32540=>6143, -32539=>6144, -32543=>6145, -32545=>6146, -32546=>6147, -32547=>6148, -32548=>6149, -32549=>6150, -32550=>6151, -32551=>6152, -32554=>6153, -32555=>6154, -32556=>6155, -32557=>6156, -32559=>6157, -32560=>6158, -32561=>6159, -32562=>6160, -32563=>6161, -32565=>6162, -12083=>6163, -24186=>6163, -30079=>6164, -12078=>6165, -24027=>6165, -30014=>6166, -37013=>6167, -29582=>6168, -29585=>6169, -29614=>6170, -29602=>6171, -29599=>6172, -29647=>6173, -29634=>6174, -29649=>6175, -29623=>6176, -29619=>6177, -29632=>6178, -29641=>6179, -29640=>6180, -29669=>6181, -29657=>6182, -39036=>6183, -29706=>6184, -29673=>6185, -29671=>6186, -29662=>6187, -29626=>6188, -29682=>6189, -29711=>6190, -29738=>6191, -29787=>6192, -29734=>6193, -29733=>6194, -29736=>6195, -29744=>6196, -29742=>6197, -29740=>6198, -29723=>6199, -29722=>6200, -29761=>6201, -29788=>6202, -29783=>6203, -29781=>6204, -29785=>6205, -29815=>6206, -29805=>6207, -29822=>6208, -29852=>6209, -29838=>6210, -29824=>6211, -29825=>6212, -29831=>6213, -29835=>6214, -29854=>6215, -29864=>6216, -29865=>6217, -29840=>6218, -29863=>6219, -29906=>6220, -29882=>6221, -38890=>6222, -38891=>6223, -38892=>6224, -26444=>6225, -26451=>6226, -26462=>6227, -26440=>6228, -26473=>6229, -26533=>6230, -26503=>6231, -26474=>6232, -26483=>6233, -26520=>6234, -26535=>6235, -26485=>6236, -26536=>6237, -26526=>6238, -26541=>6239, -26507=>6240, -26487=>6241, -26492=>6242, -26608=>6243, -26633=>6244, -26584=>6245, -26634=>6246, -26601=>6247, -26544=>6248, -26636=>6249, -26585=>6250, -26549=>6251, -26586=>6252, -26547=>6253, -26589=>6254, -26624=>6255, -26563=>6256, -26552=>6257, -26594=>6258, -26638=>6259, -26561=>6260, -26621=>6261, -26674=>6262, -26675=>6263, -26720=>6264, -26721=>6265, -26702=>6266, -26722=>6267, -26692=>6268, -26724=>6269, -26755=>6270, -26653=>6271, -26709=>6272, -26726=>6273, -26689=>6274, -26727=>6275, -26688=>6276, -26686=>6277, -26698=>6278, -26697=>6279, -26665=>6280, -26805=>6281, -26767=>6282, -26740=>6283, -26743=>6284, -26771=>6285, -26731=>6286, -26818=>6287, -26990=>6288, -26876=>6289, -26911=>6290, -26912=>6291, -26873=>6292, -26916=>6293, -26864=>6294, -26891=>6295, -26881=>6296, -26967=>6297, -26851=>6298, -26896=>6299, -26993=>6300, -26937=>6301, -26976=>6302, -26946=>6303, -26973=>6304, -27012=>6305, -26987=>6306, -27008=>6307, -27032=>6308, -27000=>6309, -26932=>6310, -27084=>6311, -27015=>6312, -27016=>6313, -27086=>6314, -27017=>6315, -26982=>6316, -26979=>6317, -27001=>6318, -27035=>6319, -27047=>6320, -27067=>6321, -27051=>6322, -27053=>6323, -27092=>6324, -27057=>6325, -27073=>6326, -27082=>6327, -27103=>6328, -27029=>6329, -27104=>6330, -27021=>6331, -27135=>6332, -27183=>6333, -27117=>6334, -27159=>6335, -27160=>6336, -27237=>6337, -27122=>6338, -27204=>6339, -27198=>6340, -27296=>6341, -27216=>6342, -27227=>6343, -27189=>6344, -27278=>6345, -27257=>6346, -27197=>6347, -27176=>6348, -27224=>6349, -27260=>6350, -27281=>6351, -27280=>6352, -27305=>6353, -27287=>6354, -27307=>6355, -29495=>6356, -29522=>6357, -27521=>6358, -27522=>6359, -27527=>6360, -27524=>6361, -27538=>6362, -27539=>6363, -27533=>6364, -27546=>6365, -27547=>6366, -27553=>6367, -27562=>6368, -36715=>6369, -36717=>6370, -36721=>6371, -36722=>6372, -36723=>6373, -36725=>6374, -36726=>6375, -36728=>6376, -36727=>6377, -36729=>6378, -36730=>6379, -36732=>6380, -36734=>6381, -36737=>6382, -36738=>6383, -36740=>6384, -36743=>6385, -36747=>6386, -36749=>6387, -36750=>6388, -36751=>6389, -36760=>6390, -36762=>6391, -36558=>6392, -25099=>6393, -25111=>6394, -25115=>6395, -25119=>6396, -25122=>6397, -25121=>6398, -25125=>6399, -25124=>6400, -25132=>6401, -33255=>6402, -29935=>6403, -29940=>6404, -29951=>6405, -29967=>6406, -29969=>6407, -29971=>6408, -12097=>6409, -25908=>6409, -26094=>6410, -26095=>6411, -26096=>6412, -26122=>6413, -26137=>6414, -26482=>6415, -26115=>6416, -26133=>6417, -26112=>6418, -28805=>6419, -26359=>6420, -26141=>6421, -26164=>6422, -26161=>6423, -26166=>6424, -26165=>6425, -32774=>6426, -26207=>6427, -26196=>6428, -26177=>6429, -26191=>6430, -26198=>6431, -26209=>6432, -26199=>6433, -26231=>6434, -26244=>6435, -26252=>6436, -26279=>6437, -26269=>6438, -26302=>6439, -26331=>6440, -26332=>6441, -26342=>6442, -26345=>6443, -36146=>6444, -36147=>6445, -36150=>6446, -36155=>6447, -36157=>6448, -36160=>6449, -36165=>6450, -36166=>6451, -36168=>6452, -36169=>6453, -36167=>6454, -36173=>6455, -36181=>6456, -36185=>6457, -35271=>6458, -35274=>6459, -35275=>6460, -35276=>6461, -35278=>6462, -35279=>6463, -35280=>6464, -35281=>6465, -29294=>6466, -29343=>6467, -29277=>6468, -29286=>6469, -29295=>6470, -29310=>6471, -29311=>6472, -29316=>6473, -29323=>6474, -29325=>6475, -29327=>6476, -29330=>6477, -25352=>6478, -25394=>6479, -25520=>6480, -25663=>6481, -25816=>6482, -32772=>6483, -27626=>6484, -27635=>6485, -27645=>6486, -27637=>6487, -27641=>6488, -27653=>6489, -27655=>6490, -27654=>6491, -27661=>6492, -27669=>6493, -27672=>6494, -27673=>6495, -27674=>6496, -27681=>6497, -27689=>6498, -27684=>6499, -27690=>6500, -27698=>6501, -25909=>6502, -25941=>6503, -25963=>6504, -29261=>6505, -29266=>6506, -29270=>6507, -29232=>6508, -34402=>6509, -21014=>6510, -32927=>6511, -32924=>6512, -32915=>6513, -32956=>6514, -26378=>6515, -32957=>6516, -32945=>6517, -32939=>6518, -32941=>6519, -32948=>6520, -32951=>6521, -32999=>6522, -33000=>6523, -33001=>6524, -33002=>6525, -32987=>6526, -32962=>6527, -32964=>6528, -32985=>6529, -32973=>6530, -32983=>6531, -26384=>6532, -32989=>6533, -33003=>6534, -33009=>6535, -33012=>6536, -33005=>6537, -33037=>6538, -33038=>6539, -33010=>6540, -33020=>6541, -26389=>6542, -33042=>6543, -35930=>6544, -33078=>6545, -33054=>6546, -33068=>6547, -33048=>6548, -33074=>6549, -33096=>6550, -33100=>6551, -33107=>6552, -33140=>6553, -33113=>6554, -33114=>6555, -33137=>6556, -33120=>6557, -33129=>6558, -33148=>6559, -33149=>6560, -33133=>6561, -33127=>6562, -22605=>6563, -23221=>6564, -33160=>6565, -33154=>6566, -33169=>6567, -28373=>6568, -33187=>6569, -33194=>6570, -33228=>6571, -26406=>6572, -33226=>6573, -33211=>6574, -33217=>6575, -33190=>6576, -27428=>6577, -27447=>6578, -27449=>6579, -27459=>6580, -27462=>6581, -27481=>6582, -39121=>6583, -39122=>6584, -39123=>6585, -39125=>6586, -39129=>6587, -39130=>6588, -12110=>6589, -27571=>6589, -24384=>6590, -27586=>6591, -35315=>6592, -26000=>6593, -40785=>6594, -26003=>6595, -26044=>6596, -26054=>6597, -26052=>6598, -26051=>6599, -26060=>6600, -26062=>6601, -26066=>6602, -26070=>6603, -28800=>6604, -28828=>6605, -28822=>6606, -28829=>6607, -28859=>6608, -28864=>6609, -28855=>6610, -28843=>6611, -28849=>6612, -28904=>6613, -28874=>6614, -28944=>6615, -28947=>6616, -28950=>6617, -28975=>6618, -28977=>6619, -29043=>6620, -29020=>6621, -29032=>6622, -28997=>6623, -29042=>6624, -29002=>6625, -29048=>6626, -29050=>6627, -29080=>6628, -29107=>6629, -29109=>6630, -29096=>6631, -29088=>6632, -29152=>6633, -29140=>6634, -29159=>6635, -29177=>6636, -29213=>6637, -29224=>6638, -28780=>6639, -28952=>6640, -29030=>6641, -29113=>6642, -25150=>6643, -25149=>6644, -25155=>6645, -25160=>6646, -25161=>6647, -31035=>6648, -31040=>6649, -31046=>6650, -31049=>6651, -31067=>6652, -31068=>6653, -31059=>6654, -31066=>6655, -31074=>6656, -31063=>6657, -31072=>6658, -31087=>6659, -31079=>6660, -31098=>6661, -31109=>6662, -31114=>6663, -31130=>6664, -31143=>6665, -31155=>6666, -24529=>6667, -24528=>6668, -24636=>6669, -24669=>6670, -24666=>6671, -24679=>6672, -24641=>6673, -24665=>6674, -24675=>6675, -24747=>6676, -24838=>6677, -24845=>6678, -24925=>6679, -25001=>6680, -24989=>6681, -25035=>6682, -25041=>6683, -25094=>6684, -32896=>6685, -12160=>6686, -32895=>6686, -27795=>6687, -27894=>6688, -28156=>6689, -30710=>6690, -30712=>6691, -30720=>6692, -30729=>6693, -30743=>6694, -30744=>6695, -30737=>6696, -26027=>6697, -30765=>6698, -30748=>6699, -30749=>6700, -30777=>6701, -30778=>6702, -30779=>6703, -30751=>6704, -30780=>6705, -30757=>6706, -30764=>6707, -30755=>6708, -30761=>6709, -30798=>6710, -30829=>6711, -30806=>6712, -30807=>6713, -30758=>6714, -30800=>6715, -30791=>6716, -30796=>6717, -30826=>6718, -30875=>6719, -30867=>6720, -30874=>6721, -30855=>6722, -30876=>6723, -30881=>6724, -30883=>6725, -30898=>6726, -30905=>6727, -30885=>6728, -30932=>6729, -30937=>6730, -30921=>6731, -30956=>6732, -30962=>6733, -30981=>6734, -30964=>6735, -30995=>6736, -31012=>6737, -31006=>6738, -31028=>6739, -40859=>6740, -12235=>6741, -40697=>6741, -40699=>6742, -40700=>6743, -30449=>6744, -30468=>6745, -30477=>6746, -30457=>6747, -30471=>6748, -30472=>6749, -30490=>6750, -30498=>6751, -30489=>6752, -30509=>6753, -30502=>6754, -30517=>6755, -30520=>6756, -30544=>6757, -30545=>6758, -30535=>6759, -30531=>6760, -30554=>6761, -30568=>6762, -30562=>6763, -30565=>6764, -30591=>6765, -30605=>6766, -30589=>6767, -30592=>6768, -30604=>6769, -30609=>6770, -30623=>6771, -30624=>6772, -30640=>6773, -30645=>6774, -30653=>6775, -30010=>6776, -30016=>6777, -30030=>6778, -30027=>6779, -30024=>6780, -30043=>6781, -30066=>6782, -30073=>6783, -30083=>6784, -32600=>6785, -32609=>6786, -32607=>6787, -35400=>6788, -32616=>6789, -32628=>6790, -32625=>6791, -32633=>6792, -32641=>6793, -32638=>6794, -30413=>6795, -30437=>6796, -34866=>6797, -38021=>6798, -38022=>6799, -38023=>6800, -38027=>6801, -38026=>6802, -38028=>6803, -38029=>6804, -38031=>6805, -38032=>6806, -38036=>6807, -38039=>6808, -38037=>6809, -38042=>6810, -38043=>6811, -38044=>6812, -38051=>6813, -38052=>6814, -38059=>6815, -38058=>6816, -38061=>6817, -38060=>6818, -38063=>6819, -38064=>6820, -38066=>6821, -38068=>6822, -38070=>6823, -38071=>6824, -38072=>6825, -38073=>6826, -38074=>6827, -38076=>6828, -38077=>6829, -38079=>6830, -38084=>6831, -38088=>6832, -38089=>6833, -38090=>6834, -38091=>6835, -38092=>6836, -38093=>6837, -38094=>6838, -38096=>6839, -38097=>6840, -38098=>6841, -38101=>6842, -38102=>6843, -38103=>6844, -38105=>6845, -38104=>6846, -38107=>6847, -38110=>6848, -38111=>6849, -38112=>6850, -38114=>6851, -38116=>6852, -38117=>6853, -38119=>6854, -38120=>6855, -38122=>6856, -38121=>6857, -38123=>6858, -38126=>6859, -38127=>6860, -38131=>6861, -38132=>6862, -38133=>6863, -38135=>6864, -38137=>6865, -38140=>6866, -38141=>6867, -38143=>6868, -38147=>6869, -38146=>6870, -38150=>6871, -38151=>6872, -38153=>6873, -38154=>6874, -38157=>6875, -38158=>6876, -38159=>6877, -38162=>6878, -38163=>6879, -38164=>6880, -38165=>6881, -38166=>6882, -38168=>6883, -38171=>6884, -38173=>6885, -38174=>6886, -38175=>6887, -38178=>6888, -38186=>6889, -38187=>6890, -38185=>6891, -38188=>6892, -38193=>6893, -38194=>6894, -38196=>6895, -38198=>6896, -38199=>6897, -38200=>6898, -38204=>6899, -38206=>6900, -38207=>6901, -38210=>6902, -38197=>6903, -38212=>6904, -38213=>6905, -38214=>6906, -38217=>6907, -38220=>6908, -38222=>6909, -38223=>6910, -38226=>6911, -38227=>6912, -38228=>6913, -38230=>6914, -38231=>6915, -38232=>6916, -38233=>6917, -38235=>6918, -38238=>6919, -38239=>6920, -38237=>6921, -38241=>6922, -38242=>6923, -38244=>6924, -38245=>6925, -38246=>6926, -38247=>6927, -38248=>6928, -38249=>6929, -38250=>6930, -38251=>6931, -38252=>6932, -38255=>6933, -38257=>6934, -38258=>6935, -38259=>6936, -38202=>6937, -30695=>6938, -30700=>6939, -38601=>6940, -31189=>6941, -31213=>6942, -31203=>6943, -31211=>6944, -31238=>6945, -23879=>6946, -31235=>6947, -31234=>6948, -31262=>6949, -31252=>6950, -31289=>6951, -31287=>6952, -31313=>6953, -40655=>6954, -39333=>6955, -31344=>6956, -30344=>6957, -30350=>6958, -30355=>6959, -30361=>6960, -30372=>6961, -29918=>6962, -29920=>6963, -29996=>6964, -40480=>6965, -40482=>6966, -40488=>6967, -40489=>6968, -40490=>6969, -40491=>6970, -40492=>6971, -40498=>6972, -40497=>6973, -40502=>6974, -40504=>6975, -40503=>6976, -40505=>6977, -40506=>6978, -40510=>6979, -40513=>6980, -40514=>6981, -40516=>6982, -40518=>6983, -40519=>6984, -40520=>6985, -40521=>6986, -40523=>6987, -40524=>6988, -40526=>6989, -40529=>6990, -40533=>6991, -40535=>6992, -40538=>6993, -40539=>6994, -40540=>6995, -40542=>6996, -40547=>6997, -40550=>6998, -40551=>6999, -40552=>7000, -40553=>7001, -40554=>7002, -40555=>7003, -40556=>7004, -40561=>7005, -40557=>7006, -40563=>7007, -12135=>7008, -30098=>7008, -30100=>7009, -30102=>7010, -30112=>7011, -30109=>7012, -30124=>7013, -30115=>7014, -30131=>7015, -30132=>7016, -30136=>7017, -30148=>7018, -30129=>7019, -30128=>7020, -30147=>7021, -30146=>7022, -30166=>7023, -30157=>7024, -30179=>7025, -30184=>7026, -30182=>7027, -30180=>7028, -30187=>7029, -30183=>7030, -30211=>7031, -30193=>7032, -30204=>7033, -30207=>7034, -30224=>7035, -30208=>7036, -30213=>7037, -30220=>7038, -30231=>7039, -30218=>7040, -30245=>7041, -30232=>7042, -30229=>7043, -30233=>7044, -30235=>7045, -30268=>7046, -30242=>7047, -30240=>7048, -30272=>7049, -30253=>7050, -30256=>7051, -30271=>7052, -30261=>7053, -30275=>7054, -30270=>7055, -30259=>7056, -30285=>7057, -30302=>7058, -30292=>7059, -30300=>7060, -30294=>7061, -30315=>7062, -30319=>7063, -32714=>7064, -31462=>7065, -31352=>7066, -31353=>7067, -31360=>7068, -31366=>7069, -31368=>7070, -31381=>7071, -31398=>7072, -31392=>7073, -31404=>7074, -31400=>7075, -31405=>7076, -31411=>7077, -34916=>7078, -34921=>7079, -34930=>7080, -34941=>7081, -34943=>7082, -34946=>7083, -34978=>7084, -35014=>7085, -34999=>7086, -35004=>7087, -35017=>7088, -35042=>7089, -35022=>7090, -35043=>7091, -35045=>7092, -35057=>7093, -35098=>7094, -35068=>7095, -35048=>7096, -35070=>7097, -35056=>7098, -35105=>7099, -35097=>7100, -35091=>7101, -35099=>7102, -35082=>7103, -35124=>7104, -35115=>7105, -35126=>7106, -35137=>7107, -35174=>7108, -35195=>7109, -12134=>7110, -30091=>7110, -32997=>7111, -30386=>7112, -30388=>7113, -30684=>7114, -12158=>7115, -32786=>7115, -32788=>7116, -32790=>7117, -32796=>7118, -32800=>7119, -32802=>7120, -32805=>7121, -32806=>7122, -32807=>7123, -32809=>7124, -32808=>7125, -32817=>7126, -32779=>7127, -32821=>7128, -32835=>7129, -32838=>7130, -32845=>7131, -32850=>7132, -32873=>7133, -32881=>7134, -35203=>7135, -39032=>7136, -39040=>7137, -39043=>7138, -39049=>7139, -39052=>7140, -39053=>7141, -39055=>7142, -39060=>7143, -39066=>7144, -39067=>7145, -39070=>7146, -39071=>7147, -39073=>7148, -39074=>7149, -39077=>7150, -39078=>7151, -12172=>7152, -34381=>7152, -34388=>7153, -34412=>7154, -34414=>7155, -34431=>7156, -34426=>7157, -34428=>7158, -34427=>7159, -34472=>7160, -34445=>7161, -34443=>7162, -34476=>7163, -34461=>7164, -34471=>7165, -34467=>7166, -34474=>7167, -34451=>7168, -34473=>7169, -34486=>7170, -34500=>7171, -34485=>7172, -34510=>7173, -34480=>7174, -34490=>7175, -34481=>7176, -34479=>7177, -34505=>7178, -34511=>7179, -34484=>7180, -34537=>7181, -34545=>7182, -34546=>7183, -34541=>7184, -34547=>7185, -34512=>7186, -34579=>7187, -34526=>7188, -34548=>7189, -34527=>7190, -34520=>7191, -34513=>7192, -34563=>7193, -34567=>7194, -34552=>7195, -34568=>7196, -34570=>7197, -34573=>7198, -34569=>7199, -34595=>7200, -34619=>7201, -34590=>7202, -34597=>7203, -34606=>7204, -34586=>7205, -34622=>7206, -34632=>7207, -34612=>7208, -34609=>7209, -34601=>7210, -34615=>7211, -34623=>7212, -34690=>7213, -34594=>7214, -34685=>7215, -34686=>7216, -34683=>7217, -34656=>7218, -34672=>7219, -34636=>7220, -34670=>7221, -34699=>7222, -34643=>7223, -34659=>7224, -34684=>7225, -34660=>7226, -34649=>7227, -34661=>7228, -34707=>7229, -34735=>7230, -34728=>7231, -34770=>7232, -34758=>7233, -34696=>7234, -34693=>7235, -34733=>7236, -34711=>7237, -34691=>7238, -34731=>7239, -34789=>7240, -34732=>7241, -34741=>7242, -34739=>7243, -34763=>7244, -34771=>7245, -34749=>7246, -34769=>7247, -34752=>7248, -34762=>7249, -34779=>7250, -34794=>7251, -34784=>7252, -34798=>7253, -34838=>7254, -34835=>7255, -34814=>7256, -34826=>7257, -34843=>7258, -34849=>7259, -34873=>7260, -34876=>7261, -12152=>7262, -32566=>7262, -32578=>7263, -32580=>7264, -32581=>7265, -33296=>7266, -31482=>7267, -31485=>7268, -31496=>7269, -31491=>7270, -31492=>7271, -31509=>7272, -31498=>7273, -31531=>7274, -31503=>7275, -31559=>7276, -31544=>7277, -31530=>7278, -31513=>7279, -31534=>7280, -31537=>7281, -31520=>7282, -31525=>7283, -31524=>7284, -31539=>7285, -31550=>7286, -31518=>7287, -31576=>7288, -31578=>7289, -31557=>7290, -31605=>7291, -31564=>7292, -31581=>7293, -31584=>7294, -31598=>7295, -31611=>7296, -31586=>7297, -31602=>7298, -31601=>7299, -31632=>7300, -31654=>7301, -31655=>7302, -31672=>7303, -31660=>7304, -31645=>7305, -31656=>7306, -31621=>7307, -31658=>7308, -31644=>7309, -31650=>7310, -31659=>7311, -31668=>7312, -31697=>7313, -31681=>7314, -31692=>7315, -31709=>7316, -31706=>7317, -31717=>7318, -31718=>7319, -31722=>7320, -31756=>7321, -31742=>7322, -31740=>7323, -31759=>7324, -31766=>7325, -31755=>7326, -31775=>7327, -31786=>7328, -31782=>7329, -31800=>7330, -31809=>7331, -31808=>7332, -33278=>7333, -33281=>7334, -33282=>7335, -33284=>7336, -33260=>7337, -34884=>7338, -33313=>7339, -33314=>7340, -33315=>7341, -33325=>7342, -33327=>7343, -33320=>7344, -33323=>7345, -33336=>7346, -33339=>7347, -33331=>7348, -33332=>7349, -33342=>7350, -33348=>7351, -33353=>7352, -33355=>7353, -33359=>7354, -33370=>7355, -33375=>7356, -33384=>7357, -34942=>7358, -34949=>7359, -34952=>7360, -35032=>7361, -35039=>7362, -35166=>7363, -32669=>7364, -32671=>7365, -32679=>7366, -32687=>7367, -32688=>7368, -32690=>7369, -31868=>7370, -25929=>7371, -31889=>7372, -31901=>7373, -31900=>7374, -31902=>7375, -31906=>7376, -31922=>7377, -31932=>7378, -31933=>7379, -31937=>7380, -31943=>7381, -31948=>7382, -31949=>7383, -31944=>7384, -31941=>7385, -31959=>7386, -31976=>7387, -12169=>7388, -33390=>7388, -26280=>7389, -32703=>7390, -32718=>7391, -32725=>7392, -32741=>7393, -32737=>7394, -32742=>7395, -32745=>7396, -32750=>7397, -32755=>7398, -12151=>7399, -31992=>7399, -32119=>7400, -32166=>7401, -32174=>7402, -32327=>7403, -32411=>7404, -40632=>7405, -40628=>7406, -36211=>7407, -36228=>7408, -36244=>7409, -36241=>7410, -36273=>7411, -36199=>7412, -36205=>7413, -35911=>7414, -35913=>7415, -37194=>7416, -37200=>7417, -37198=>7418, -37199=>7419, -37220=>7420, -37218=>7421, -37217=>7422, -37232=>7423, -37225=>7424, -37231=>7425, -37245=>7426, -37246=>7427, -37234=>7428, -37236=>7429, -37241=>7430, -37260=>7431, -37253=>7432, -37264=>7433, -37261=>7434, -37265=>7435, -37282=>7436, -37283=>7437, -37290=>7438, -37293=>7439, -37294=>7440, -37295=>7441, -37301=>7442, -37300=>7443, -37306=>7444, -12183=>7445, -35925=>7445, -40574=>7446, -36280=>7447, -36331=>7448, -36357=>7449, -36441=>7450, -36457=>7451, -36277=>7452, -36287=>7453, -36284=>7454, -36282=>7455, -36292=>7456, -36310=>7457, -36311=>7458, -36314=>7459, -36318=>7460, -36302=>7461, -36303=>7462, -36315=>7463, -36294=>7464, -36332=>7465, -36343=>7466, -36344=>7467, -36323=>7468, -36345=>7469, -36347=>7470, -36324=>7471, -36361=>7472, -36349=>7473, -36372=>7474, -36381=>7475, -36383=>7476, -36396=>7477, -36398=>7478, -36387=>7479, -36399=>7480, -36410=>7481, -36416=>7482, -36409=>7483, -36405=>7484, -36413=>7485, -36401=>7486, -36425=>7487, -36417=>7488, -36418=>7489, -36433=>7490, -36434=>7491, -36426=>7492, -36464=>7493, -36470=>7494, -36476=>7495, -36463=>7496, -36468=>7497, -36485=>7498, -36495=>7499, -36500=>7500, -36496=>7501, -36508=>7502, -36510=>7503, -12184=>7504, -35960=>7504, -35970=>7505, -35978=>7506, -35973=>7507, -35992=>7508, -35988=>7509, -26011=>7510, -35286=>7511, -35294=>7512, -35290=>7513, -35292=>7514, -35301=>7515, -35307=>7516, -35311=>7517, -35390=>7518, -35622=>7519, -38739=>7520, -38633=>7521, -38643=>7522, -38639=>7523, -38662=>7524, -38657=>7525, -38664=>7526, -38671=>7527, -38670=>7528, -38698=>7529, -38701=>7530, -38704=>7531, -38718=>7532, -40832=>7533, -40835=>7534, -40837=>7535, -40838=>7536, -40839=>7537, -40840=>7538, -40841=>7539, -40842=>7540, -40844=>7541, -40702=>7542, -40715=>7543, -40717=>7544, -12203=>7545, -38585=>7545, -38588=>7546, -38589=>7547, -38606=>7548, -38610=>7549, -30655=>7550, -38624=>7551, -37518=>7552, -37550=>7553, -37576=>7554, -37694=>7555, -37738=>7556, -37834=>7557, -37775=>7558, -37950=>7559, -37995=>7560, -40063=>7561, -40066=>7562, -40069=>7563, -40070=>7564, -40071=>7565, -40072=>7566, -31267=>7567, -40075=>7568, -40078=>7569, -40080=>7570, -40081=>7571, -40082=>7572, -40084=>7573, -40085=>7574, -40090=>7575, -40091=>7576, -40094=>7577, -40095=>7578, -40096=>7579, -40097=>7580, -40098=>7581, -40099=>7582, -40101=>7583, -40102=>7584, -40103=>7585, -40104=>7586, -40105=>7587, -40107=>7588, -40109=>7589, -40110=>7590, -40112=>7591, -40113=>7592, -40114=>7593, -40115=>7594, -40116=>7595, -40117=>7596, -40118=>7597, -40119=>7598, -40122=>7599, -40123=>7600, -40124=>7601, -40125=>7602, -40132=>7603, -40133=>7604, -40134=>7605, -40135=>7606, -40138=>7607, -40139=>7608, -40140=>7609, -40141=>7610, -40142=>7611, -40143=>7612, -40144=>7613, -40147=>7614, -40148=>7615, -40149=>7616, -40151=>7617, -40152=>7618, -40153=>7619, -40156=>7620, -40157=>7621, -40159=>7622, -40162=>7623, -38780=>7624, -38789=>7625, -38801=>7626, -38802=>7627, -38804=>7628, -38831=>7629, -38827=>7630, -38819=>7631, -38834=>7632, -38836=>7633, -39601=>7634, -39600=>7635, -39607=>7636, -40536=>7637, -39606=>7638, -39610=>7639, -39612=>7640, -39617=>7641, -39616=>7642, -39621=>7643, -39618=>7644, -39627=>7645, -39628=>7646, -39633=>7647, -39749=>7648, -39747=>7649, -39751=>7650, -39753=>7651, -39752=>7652, -39757=>7653, -39761=>7654, -39144=>7655, -39181=>7656, -39214=>7657, -39253=>7658, -39252=>7659, -12221=>7660, -39647=>7660, -39649=>7661, -39654=>7662, -39663=>7663, -39659=>7664, -39675=>7665, -39661=>7666, -39673=>7667, -39688=>7668, -39695=>7669, -39699=>7670, -39711=>7671, -39715=>7672, -40637=>7673, -40638=>7674, -32315=>7675, -40578=>7676, -40583=>7677, -40584=>7678, -40587=>7679, -40594=>7680, -37846=>7681, -40605=>7682, -40607=>7683, -40667=>7684, -40668=>7685, -40669=>7686, -40672=>7687, -40671=>7688, -40674=>7689, -40681=>7690, -40679=>7691, -40677=>7692, -40682=>7693, -40687=>7694, -40738=>7695, -40748=>7696, -40751=>7697, -40761=>7698, -40759=>7699, -40765=>7700, -40766=>7701, -40772=>7702, -12295=>7703, - - - - - - - -30362=>7717, -34297=>7718, -31001=>7719, -24859=>7720, -39599=>7721, -35158=>7722, -22761=>7723, -32631=>7724, -25850=>7725, -25943=>7726, -38930=>7727, -36774=>7728, -32070=>7729, -24171=>7730, -32129=>7731, -37770=>7732, -35607=>7733, -39165=>7734, -23542=>7735, -22577=>7736, -39825=>7737, -36649=>7738, -12185=>7739, -35997=>7739, -37575=>7740, -29437=>7741, -20633=>7742, -24970=>7743, -32179=>7744, -31558=>7745, -30050=>7746, -25987=>7747, -24163=>7748, -38281=>7749, -37002=>7750, -32232=>7751, -36022=>7752, -35722=>7753, -36783=>7754, -36782=>7755, -27161=>7756, -40009=>7757, -30303=>7758, -28693=>7759, -28657=>7760, -36051=>7761, -25839=>7762, -39173=>7763, -25765=>7764, -37474=>7765, -37457=>7766, -39361=>7767, -35036=>7768, -36001=>7769, -21443=>7770, -34870=>7771, -27544=>7772, -24922=>7773, -24920=>7774, -29158=>7775, -33980=>7776, -33369=>7777, -20489=>7778, -28356=>7779, -21408=>7780, -20596=>7781, -28204=>7782, -23652=>7783, -35435=>7784, -25881=>7785, -25723=>7786, -34796=>7787, -39262=>7788, -35730=>7789, -32399=>7790, -37855=>7791, -29987=>7792, -38369=>7793, -39019=>7794, -22580=>7795, -22039=>7796, -12199=>7797, -38263=>7797, -20767=>7798, -33144=>7799, -24288=>7800, -26274=>7801, -37396=>7802, -12190=>7803, -36554=>7803, -24505=>7804, -22645=>7805, -38515=>7806, -35183=>7807, -31281=>7808, -25074=>7809, -35488=>7810, -39425=>7811, -36978=>7812, -39347=>7813, -12242=>7814, -40786=>7814, -29118=>7815, -34909=>7816, -34802=>7817, -23541=>7818, -30087=>7819, -36490=>7820, -31820=>7821, -32162=>7822, -37276=>7823, -37604=>7824, -38619=>7825, -30990=>7826, -20786=>7827, -35320=>7828, -34389=>7829, -20659=>7830, -30241=>7831, -38358=>7832, -21109=>7833, -37656=>7834, -32020=>7835, -32189=>7836, -36781=>7837, -35422=>7838, -36060=>7839, -32880=>7840, -24478=>7841, -21474=>7842, -36517=>7843, -31428=>7844, -37679=>7845, -36948=>7846, -24118=>7847, -36024=>7848, -25812=>7849, -21934=>7850, -37170=>7851, -25763=>7852, -33213=>7853, -24986=>7854, -35477=>7855, -24392=>7856, -30070=>7857, -25803=>7858, -40680=>7859, -34153=>7860, -27284=>7861, -25623=>7862, -23798=>7863, -31153=>7864, -23566=>7865, -29128=>7866, -37159=>7867, -25973=>7868, -28364=>7869, -36958=>7870, -32224=>7871, -39003=>7872, -40670=>7873, -22666=>7874, -38651=>7875, -28593=>7876, -37347=>7877, -35519=>7878, -35548=>7879, -37336=>7880, -38914=>7881, -37664=>7882, -35330=>7883, -26481=>7884, -21205=>7885, -26847=>7886, -20941=>7887, -12222=>7888, -39717=>7888, -29346=>7889, -29544=>7890, -35712=>7891, -36077=>7892, -37709=>7893, -37723=>7894, -26039=>7895, -32222=>7896, -38538=>7897, -23565=>7898, -22136=>7899, -38931=>7900, -37389=>7901, -22890=>7902, -22702=>7903, -40285=>7904, -38989=>7905, -35355=>7906, -24801=>7907, -39187=>7908, -20818=>7909, -29246=>7910, -39180=>7911, -36019=>7912, -30332=>7913, -32624=>7914, -38309=>7915, -31020=>7916, -37353=>7917, -29033=>7918, -31684=>7919, -36009=>7920, -39151=>7921, -35370=>7922, -32033=>7923, -12214=>7924, -39131=>7924, -35513=>7925, -24290=>7926, -36027=>7927, -32027=>7928, -22707=>7929, -22894=>7930, -24996=>7931, -31966=>7932, -35920=>7933, -26963=>7934, -37586=>7935, -12213=>7936, -39080=>7936, -30219=>7937, -39342=>7938, -32299=>7939, -35575=>7940, -40179=>7941, -33178=>7942, -36667=>7943, -25771=>7944, -36628=>7945, -36070=>7946, -24489=>7947, -36000=>7948, -35331=>7949, -23142=>7950, -32283=>7951, -35442=>7952, -37411=>7953, -33995=>7954, -24185=>7955, -36245=>7956, -36123=>7957, -23713=>7958, -21083=>7959, -37628=>7960, -32177=>7961, -23831=>7962, -37804=>7963, -25841=>7964, -40255=>7965, -38307=>7966, -37499=>7967, -20491=>7968, -32102=>7969, -40852=>7970, -38799=>7971, -36002=>7972, -37390=>7973, -28317=>7974, -27083=>7975, -36092=>7976, -34865=>7977, -39015=>7978, -21102=>7979, -38364=>7980, -35264=>7981, -39208=>7982, -24931=>7983, -36011=>7984, -24291=>7985, -35215=>7986, -27512=>7987, -12244=>7988, -40860=>7988, -38312=>7989, -36556=>7990, -35437=>7991, -27331=>7992, -36020=>7993, -21130=>7994, -36645=>7995, -37707=>7996, -22283=>7997, -36942=>7998, -39405=>7999, -38867=>8000, -28450=>8001, -34399=>8002, -38305=>8003, -40372=>8004, -36032=>8005, -36703=>8006, -40251=>8007, -32005=>8008, -22778=>8009, -35703=>8010, -28396=>8011, -22057=>8012, -33775=>8013, -30059=>8014, -21123=>8015, -35441=>8016, -25079=>8017, -22750=>8018, -27489=>8019, -29872=>8020, -36996=>8021, -32233=>8022, -35594=>8023, -25582=>8024, -36637=>8025, -36036=>8026, -31330=>8027, -26371=>8028, -29172=>8029, -21295=>8030, -35569=>8031, -35496=>8032, -32362=>8033, -33911=>8034, -28222=>8035, -29554=>8036, -36008=>8037, -31117=>8038, -25802=>8039, -27231=>8040, -31309=>8041, -39249=>8042, -35663=>8043, -40388=>8044, -32318=>8045, -32221=>8046, -26997=>8047, -36655=>8048, -32026=>8049, -25824=>8050, -24190=>8051, -34186=>8052, -21137=>8053, -28639=>8054, -35336=>8055, -35352=>8056, -38555=>8057, -32380=>8058, -32000=>8059, -22846=>8060, -33698=>8061, -38960=>8062, -36040=>8063, -37440=>8064, -20729=>8065, -39381=>8066, -27570=>8067, -30435=>8068, -22533=>8069, -31627=>8070, -38291=>8071, -33393=>8072, -32216=>8073, -32365=>8074, -27298=>8075, -40572=>8076, -25536=>8077, -25791=>8078, -31777=>8079, -20745=>8080, -34214=>8081, -27323=>8082, -37970=>8083, -36368=>8084, -36068=>8085, -12178=>8086, -35211=>8086, -37749=>8087, -33382=>8088, -21133=>8089, -39198=>8090, -28472=>8091, -28666=>8092, -28567=>8093, -23559=>8094, -28479=>8095, -34083=>8096, -27123=>8097, -22892=>8098, -35611=>8099, -37292=>8100, -33184=>8101, -28550=>8102, -39509=>8103, -23308=>8104, -25898=>8105, -37496=>8106, -30703=>8107, -20709=>8108, -39171=>8109, -32371=>8110, -32094=>8111, -36686=>8112, -36611=>8113, -38542=>8114, -31680=>8115, -28500=>8116, -32080=>8117, -35489=>8118, -32202=>8119, -37670=>8120, -20677=>8121, -35641=>8122, -36914=>8123, -29180=>8124, -30433=>8125, -21185=>8126, -33686=>8127, -39912=>8128, -39514=>8129, -32147=>8130, -38968=>8131, -37857=>8132, -24465=>8133, -30169=>8134, -31478=>8135, -31998=>8136, -33290=>8137, -39378=>8138, -33289=>8139, -25818=>8140, -37624=>8141, -25084=>8142, -21127=>8143, -40273=>8144, -32121=>8145, -35258=>8146, -35363=>8147, -32118=>8148, -37406=>8149, -36557=>8150, -39423=>8151, -38283=>8152, -20977=>8153, -38982=>8154, -27579=>8155, -35506=>8156, -22718=>8157, -25031=>8158, -25715=>8159, -24235=>8160, -35122=>8161, -35463=>8162, -22602=>8163, -20744=>8164, -23532=>8165, -31014=>8166, -26336=>8167, -34407=>8168, -24011=>8169, -31418=>8170, -39243=>8171, -28528=>8172, -25844=>8173, -38346=>8174, -34847=>8175, -33240=>8176, -33802=>8177, -20358=>8178, -36084=>8179, -34253=>8180, -27396=>8181, -25876=>8182, -31811=>8183, -38348=>8184, -34349=>8185, -28734=>8186, -35733=>8187, -25900=>8188, -35261=>8189, -25078=>8190, -32412=>8191, -29211=>8192, -28651=>8193, -25736=>8194, -21214=>8195, -28551=>8196, -27138=>8197, -37939=>8198, -22744=>8199, -39006=>8200, -31852=>8201, -38626=>8202, -28757=>8203, -35023=>8204, -63975=>8204, -39881=>8205, -31150=>8206, -40599=>8207, -21426=>8208, -21237=>8209, -31019=>8210, -27511=>8211, -28701=>8212, -38584=>8213, -20486=>8214, -32879=>8215, -34030=>8216, -36899=>8217, -37934=>8218, -24976=>8219, -28451=>8220, -31806=>8221, -25986=>8222, -33225=>8223, -37832=>8224, -25088=>8225, -29001=>8226, -32244=>8227, -31975=>8228, -20841=>8229, -36635=>8230, -35538=>8231, -30274=>8232, -36988=>8233, -37904=>8234, -29557=>8235, -33256=>8236, -37168=>8237, -40023=>8238, -36035=>8239, -40801=>8240, -37428=>8241, -38728=>8242, -23994=>8243, -38936=>8244, -39230=>8245, -21129=>8246, -12243=>8247, -40845=>8247, -32894=>8248, -22184=>8249, -31840=>8250, -22751=>8251, -25871=>8252, -38580=>8253, -27155=>8254, -23105=>8255, -25695=>8256, -31757=>8257, -34310=>8258, -30439=>8259, -39025=>8260, -24300=>8261, -29200=>8262, -25796=>8263, -28407=>8264, -34396=>8265, -39791=>8266, -36034=>8267, -37682=>8268, -38520=>8269, -39522=>8270, -37569=>8271, -23650=>8272, -32311=>8273, -24942=>8274, -28670=>8275, -32209=>8276, -24018=>8277, -25891=>8278, -23423=>8279, -28772=>8280, -20098=>8281, -25476=>8282, -36650=>8283, -20523=>8284, -20374=>8285, -28138=>8286, -32184=>8287, -35542=>8288, -34367=>8289, -32645=>8290, -37007=>8291, -38012=>8292, -31854=>8293, -39486=>8294, -39409=>8295, -32097=>8296, -23229=>8297, -29802=>8298, -30908=>8299, -34718=>8300, -12218=>8301, -39340=>8301, -39393=>8302, -21966=>8303, -36023=>8304, -12230=>8305, -40613=>8305, -36067=>8306, -36993=>8307, -30622=>8308, -39237=>8309, -34875=>8310, -28415=>8311, -35646=>8312, -37672=>8313, -37466=>8314, -36031=>8315, -37762=>8316, -12200=>8317, -38272=>8317, -24758=>8318, -20497=>8319, -37683=>8320, -22818=>8321, -35598=>8322, -24396=>8323, -35219=>8324, -32191=>8325, -32236=>8326, -24287=>8327, -28357=>8328, -25003=>8329, -38313=>8330, -40180=>8331, -37528=>8332, -35628=>8333, -35584=>8334, -30045=>8335, -37385=>8336, -32013=>8337, -38627=>8338, -25747=>8339, -33126=>8340, -24817=>8341, -39719=>8342, -39186=>8343, -25836=>8344, -33193=>8345, -25862=>8346, -37312=>8347, -12227=>8348, -40165=>8348, -32886=>8349, -22169=>8350, -38007=>8351, -37811=>8352, -27320=>8353, -29552=>8354, -23527=>8355, -25840=>8356, -28632=>8357, -37397=>8358, -32016=>8359, -33215=>8360, -28611=>8361, -36786=>8362, -30247=>8363, -35582=>8364, -27472=>8365, -40407=>8366, -27590=>8367, -22036=>8368, -28442=>8369, -30436=>8370, -40848=>8371, -36064=>8372, -22132=>8373, -40300=>8374, -39449=>8375, -39108=>8376, -38971=>8377, -36007=>8378, -34315=>8379, -24977=>8380, -35413=>8381, -28497=>8382, -38935=>8383, -25778=>8384, -37610=>8385, -20693=>8386, -27192=>8387, -35676=>8388, -33229=>8389, -12241=>8390, -40778=>8390, -39438=>8391, -35912=>8392, -21843=>8393, -27683=>8394, -35350=>8395, -29309=>8396, -37370=>8397, -37467=>8398, -36983=>8399, -31805=>8400, -35609=>8401, -37666=>8402, -37463=>8403, -28154=>8404, -35700=>8405, -22649=>8406, -27085=>8407, -21958=>8408, -22715=>8409, -34196=>8410, -25654=>8411, -37740=>8412, -27211=>8413, -21932=>8414, -20689=>8415, -32761=>8416, -31429=>8417, -31434=>8418, -27453=>8419, -35242=>8420, -23522=>8421, -36629=>8422, -27691=>8423, -20670=>8424, -38915=>8425, -35531=>8426, -24950=>8427, -29898=>8428, -31406=>8429, -36264=>8430, -21312=>8431, -36544=>8432, -39493=>8433, -40818=>8434, -39028=>8435, -27402=>8436, -21240=>8437, -40306=>8438, -30906=>8439, -35731=>8440, -39250=>8441, -25854=>8442, -32350=>8443, -29105=>8444, -38860=>8445, -35469=>8446, -32009=>8447, -27054=>8448, -32104=>8449, -36575=>8450, -37613=>8451, -38287=>8452, -28516=>8453, -28753=>8454, -34217=>8455, -39955=>8456, -36093=>8457, -20632=>8458, -21930=>8459, -39479=>8460, -25475=>8461, -28544=>8462, -27578=>8463, -32023=>8464, -31721=>8465, -26348=>8466, -38275=>8467, -38493=>8468, -36109=>8469, -32341=>8470, -20663=>8471, -36062=>8472, -29138=>8473, -32057=>8474, -36050=>8475, -25448=>8476, -25885=>8477, -25086=>8478, -35373=>8479, -32051=>8480, -23529=>8481, -23352=>8482, -33102=>8483, -28402=>8484, -32882=>8485, -32361=>8486, -21213=>8487, -32854=>8488, -24107=>8489, -29509=>8490, -28629=>8491, -35433=>8492, -26178=>8493, -34645=>8494, -23526=>8495, -35672=>8496, -39387=>8497, -21218=>8498, -36969=>8499, -37323=>8500, -39166=>8501, -35222=>8502, -35430=>8503, -22781=>8504, -29560=>8505, -27166=>8506, -36664=>8507, -26360=>8508, -36118=>8509, -23660=>8510, -34899=>8511, -27193=>8512, -31466=>8513, -25976=>8514, -24101=>8515, -38617=>8516, -35504=>8517, -38918=>8518, -35500=>8519, -30889=>8520, -29197=>8521, -32114=>8522, -39164=>8523, -39686=>8524, -32883=>8525, -24939=>8526, -38924=>8527, -35359=>8528, -35494=>8529, -25851=>8530, -34311=>8531, -35380=>8532, -32901=>8533, -38614=>8534, -38568=>8535, -32143=>8536, -27506=>8537, -23403=>8538, -25613=>8539, -32302=>8540, -29795=>8541, -37782=>8542, -29562=>8543, -25787=>8544, -33274=>8545, -24907=>8546, -25892=>8547, -36010=>8548, -30321=>8549, -28760=>8550, -22727=>8551, -35674=>8552, -35527=>8553, -22022=>8554, -28271=>8555, -29145=>8556, -28644=>8557, -32295=>8558, -35342=>8559, -39472=>8560, -35588=>8561, -37563=>8562, -38988=>8563, -39636=>8564, -26781=>8565, -36028=>8566, -37941=>8567, -24307=>8568, -32893=>8569, -28916=>8570, -37509=>8571, -32113=>8572, -38957=>8573, -22294=>8574, -22615=>8575, -22296=>8576, -38973=>8577, -40213=>8578, -39345=>8579, -39389=>8580, -27234=>8581, -31402=>8582, -35178=>8583, -24398=>8584, -28771=>8585, -38929=>8586, -33836=>8587, -32178=>8588, -12209=>8589, -38859=>8589, -36949=>8590, -22285=>8591, -29234=>8592, -28656=>8593, -32173=>8594, -33894=>8595, -20553=>8596, -20702=>8597, -32239=>8598, -35586=>8599, -34907=>8600, -32862=>8601, -32011=>8602, -31337=>8603, -21839=>8604, -25790=>8605, -34680=>8606, -28198=>8607, -31401=>8608, -21978=>8609, -37794=>8610, -28879=>8611, -35491=>8612, -28961=>8613, -34154=>8614, -22626=>8615, -38695=>8616, -21209=>8617, -35492=>8618, -37675=>8619, -29351=>8620, -35186=>8621, -32722=>8622, -37521=>8623, -25138=>8624, -32048=>8625, -34662=>8626, -36676=>8627, -23805=>8628, -20448=>8629, -29433=>8630, -22151=>8631, -37697=>8632, -39854=>8633, -32406=>8634, -36066=>8635, -37532=>8636, -38289=>8637, -39023=>8638, -38570=>8639, -29694=>8640, -29563=>8641, -32291=>8642, -39201=>8643, -25010=>8644, -32171=>8645, -38002=>8646, -37129=>8647, -35443=>8648, -38911=>8649, -38917=>8650, -34157=>8651, -22210=>8652, -37559=>8653, -26313=>8654, -22063=>8655, -21332=>8656, -25406=>8657, -33029=>8658, -35559=>8659, -23531=>8660, -28681=>8661, -35613=>8662, -37573=>8663, -37313=>8664, -33288=>8665, -37561=>8666, -32137=>8667, -38920=>8668, -35377=>8669, -32210=>8670, -32396=>8671, -36562=>8672, -25080=>8673, -36984=>8674, -30316=>8675, -32098=>8676, -23416=>8677, -21211=>8678, -35426=>8679, -23563=>8680, -39348=>8681, -35347=>8682, -35338=>8683, -36956=>8684, -22739=>8685, -40201=>8686, -40232=>8687, -21854=>8688, -20126=>8689, -35357=>8690, -38329=>8691, -40573=>8692, -22196=>8693, -38996=>8694, -38331=>8695, -33399=>8696, -21421=>8697, -30831=>8698, -35578=>8699, -39511=>8700, -40230=>8701, -26954=>8702, -25562=>8703, -30221=>8704, -38525=>8705, -30306=>8706, -39178=>8707, -27171=>8708, -22575=>8709, -35617=>8710, -34277=>8711, -29242=>8712, -12212=>8713, -38913=>8713, -26989=>8714, -33865=>8715, -37291=>8716, -37541=>8717, -38948=>8718, -36986=>8719, -20736=>8720, -34811=>8721, -34269=>8722, -20740=>8723, -25014=>8724, -32681=>8725, -35427=>8726, -35696=>8727, -35516=>8728, -35695=>8729, -32377=>8730, -34093=>8731, -38512=>8732, -37504=>8733, -39154=>8734, -38577=>8735, -27387=>8736, -23344=>8737, -40441=>8738, -25033=>8739, -32403=>8740, -29801=>8741, -34722=>8742, -29151=>8743, -29074=>8744, -34821=>8745, -36111=>8746, -31310=>8747, -21938=>8748, -25793=>8749, -20653=>8750, -30320=>8751, -36404=>8752, -20778=>8753, -24962=>8754, -37109=>8755, -37438=>8756, -29494=>8757, -35480=>8758, -36671=>8759, -39192=>8760, -12226=>8761, -39770=>8761, -28417=>8762, -33287=>8763, -23996=>8764, -35486=>8765, -39729=>8766, -29508=>8767, -35709=>8768, -38928=>8769, -39341=>8770, -40219=>8771, -28149=>8772, -36677=>8773, -22290=>8774, -21729=>8775, -22291=>8776, -32227=>8777, -36960=>8778, -39000=>8779, -32004=>8780, -36493=>8781, -38000=>8782, -38322=>8783, -38642=>8784, -37142=>8785, -38549=>8786, -36939=>8787, -34292=>8788, -37270=>8789, -26248=>8790, -38620=>8791, -36617=>8792, -25890=>8793, -26283=>8794, -36106=>8795, -36124=>8796, -33247=>8797, -38015=>8798, -26839=>8799, -31432=>8800, -36012=>8801, -25799=>8802, -21063=>8803, -28580=>8804, -36042=>8805, -36104=>8806, -36555=>8807, -37720=>8808, -38296=>8809, -35408=>8810, -40779=>8811, -20661=>8812, -27656=>8813, -30430=>8814, -26028=>8815, -36670=>8816, -23940=>8817, -26855=>8818, -25136=>8819, -32187=>8820, -24373=>8821, -28466=>8822, -24115=>8823, -36076=>8824, -33081=>8825, -36249=>8826, -34756=>8827, -36685=>8828, -37754=>8829, -36889=>8830, -35998=>8831, -37341=>8832, -20597=>8833, -35386=>8834, -37806=>8835, -38499=>8836, -24128=>8837, -30309=>8838, -37165=>8839, -35657=>8840, -32340=>8841, -32887=>8842, -22519=>8843, -34937=>8844, -32025=>8845, -25711=>8846, -25842=>8847, -24159=>8848, -36074=>8849, -28399=>8850, -37912=>8851, -32066=>8852, -31278=>8853, -33131=>8854, -34886=>8855, -35589=>8856, -36600=>8857, -30394=>8858, -26205=>8859, -39519=>8860, -35576=>8861, -35461=>8862, -29165=>8863, -30682=>8864, -22225=>8865, -36015=>8866, -37956=>8867, -31689=>8868, -39376=>8869, -23560=>8870, -30938=>8871, -36681=>8872, -36090=>8873, -27137=>8874, -33674=>8875, -35037=>8876, -22941=>8877, -22767=>8878, -29376=>8879, -37648=>8880, -36101=>8881, -22684=>8882, -32180=>8883, -35524=>8884, -28310=>8885, -28609=>8886, -36039=>8887, -28460=>8888, -32156=>8889, -32317=>8890, -32305=>8891, -37138=>8892, -35419=>8893, -32068=>8894, -38013=>8895, -21959=>8896, -21401=>8897, -21428=>8898, -38760=>8899, -36107=>8900, -21293=>8901, -21297=>8902, -36094=>8903, -21060=>8904, -21132=>8905, -21108=>8906, -20660=>8907, -20480=>8908, -20630=>8909, -20757=>8910, -20738=>8911, -20756=>8912, -20796=>8913, -20791=>8914, -20712=>8915, -20674=>8916, -20795=>8917, -20752=>8918, -20794=>8919, -20681=>8920, -31988=>8921, -40652=>8922, -22213=>8923, -40172=>8924, -35131=>8925, -33248=>8926, -35329=>8927, -35344=>8928, -35340=>8929, -35349=>8930, -35635=>8931, -35406=>8932, -35365=>8933, -35393=>8934, -35382=>8935, -35398=>8936, -35412=>8937, -35416=>8938, -35410=>8939, -35462=>8940, -35460=>8941, -35455=>8942, -35440=>8943, -35452=>8944, -35445=>8945, -35436=>8946, -35438=>8947, -35533=>8948, -35554=>8949, -35425=>8950, -35482=>8951, -35493=>8952, -35473=>8953, -35474=>8954, -35535=>8955, -35537=>8956, -35529=>8957, -35547=>8958, -35543=>8959, -35522=>8960, -35510=>8961, -35574=>8962, -35563=>8963, -35604=>8964, -35585=>8965, -35556=>8966, -35565=>8967, -35580=>8968, -35571=>8969, -35558=>8970, -35566=>8971, -35550=>8972, -35624=>8973, -35740=>8974, -35606=>8975, -35610=>8976, -35600=>8977, -35627=>8978, -35629=>8979, -35670=>8980, -35673=>8981, -35662=>8982, -35742=>8983, -35691=>8984, -35734=>8985, -38488=>8986, -37178=>8987, -37140=>8988, -37172=>8989, -37087=>8990, -37174=>8991, -37126=>8992, -37192=>8993, -33467=>8994, -21233=>8995, -24048=>8996, -22538=>8997, -22745=>8998, -22754=>8999, -22752=>9000, -22746=>9001, -22497=>9002, -22607=>9003, -22550=>9004, -22610=>9005, -22557=>9006, -22628=>9007, -34188=>9008, -34131=>9009, -34294=>9010, -33703=>9011, -33799=>9012, -34031=>9013, -33511=>9014, -34338=>9015, -34086=>9016, -22603=>9017, -29026=>9018, -34136=>9019, -34045=>9020, -34126=>9021, -34184=>9022, -34234=>9023, -29334=>9024, -28366=>9025, -34113=>9026, -34254=>9027, -34130=>9028, -33984=>9029, -33874=>9030, -33892=>9031, -33940=>9032, -33845=>9033, -34207=>9034, -34133=>9035, -40367=>9036, -33939=>9037, -32264=>9038, -34118=>9039, -34146=>9040, -34078=>9041, -39488=>9042, -34362=>9043, -37795=>9044, -34167=>9045, -34334=>9046, -34298=>9047, -34308=>9048, -34282=>9049, -34330=>9050, -22889=>9051, -23607=>9052, -25451=>9053, -25718=>9054, -25759=>9055, -25681=>9056, -25692=>9057, -25779=>9058, -25860=>9059, -25878=>9060, -25847=>9061, -25852=>9062, -25883=>9063, -22064=>9064, -22072=>9065, -22216=>9066, -22182=>9067, -21764=>9068, -21692=>9069, -22144=>9070, -22109=>9071, -22112=>9072, -22069=>9073, -22006=>9074, -22118=>9075, -22130=>9076, -22156=>9077, -22117=>9078, -22044=>9079, -22062=>9080, -21993=>9081, -22038=>9082, -22208=>9083, -22029=>9084, -22195=>9085, -22209=>9086, -22127=>9087, -36705=>9088, -22198=>9089, -22165=>9090, -22279=>9091, -24131=>9092, -24172=>9093, -24152=>9094, -24151=>9095, -23943=>9096, -23796=>9097, -23888=>9098, -23852=>9099, -23975=>9100, -23968=>9101, -23959=>9102, -23821=>9103, -23992=>9104, -23937=>9105, -24020=>9106, -24480=>9107, -29559=>9108, -29505=>9109, -29546=>9110, -29499=>9111, -29547=>9112, -29568=>9113, -29564=>9114, -39136=>9115, -39219=>9116, -39145=>9117, -39228=>9118, -39146=>9119, -39147=>9120, -39149=>9121, -39156=>9122, -39177=>9123, -39185=>9124, -39195=>9125, -39223=>9126, -39231=>9127, -39235=>9128, -39240=>9129, -39241=>9130, -39242=>9131, -39244=>9132, -39266=>9133, -24289=>9134, -36065=>9135, -25082=>9136, -25006=>9137, -24938=>9138, -24894=>9139, -24757=>9140, -24884=>9141, -25036=>9142, -24927=>9143, -25064=>9144, -24827=>9145, -24887=>9146, -24818=>9147, -24947=>9148, -24860=>9149, -24978=>9150, -38274=>9151, -38278=>9152, -38344=>9153, -38286=>9154, -38292=>9155, -38284=>9156, -38373=>9157, -38317=>9158, -38315=>9159, -39726=>9160, -38316=>9161, -38334=>9162, -38326=>9163, -39721=>9164, -38335=>9165, -38333=>9166, -38332=>9167, -38339=>9168, -38347=>9169, -38356=>9170, -38352=>9171, -38357=>9172, -38366=>9173, -28739=>9174, -28505=>9175, -28711=>9176, -28696=>9177, -28668=>9178, -28039=>9179, -28025=>9180, -28254=>9181, -28590=>9182, -28687=>9183, -28408=>9184, -28527=>9185, -28150=>9186, -28543=>9187, -28678=>9188, -28576=>9189, -28683=>9190, -28775=>9191, -28740=>9192, -28677=>9193, -28535=>9194, -28704=>9195, -28703=>9196, -28722=>9197, -28712=>9198, -28765=>9199, -39467=>9200, -36999=>9201, -36885=>9202, -37008=>9203, -23656=>9204, -24371=>9205, -23285=>9206, -23255=>9207, -23296=>9208, -23149=>9209, -23304=>9210, -23372=>9211, -23207=>9212, -23291=>9213, -23307=>9214, -23329=>9215, -23338=>9216, -23321=>9217, -39380=>9218, -39391=>9219, -39385=>9220, -39478=>9221, -39515=>9222, -39377=>9223, -39384=>9224, -39501=>9225, -39498=>9226, -39394=>9227, -39530=>9228, -39439=>9229, -39437=>9230, -39429=>9231, -39490=>9232, -39469=>9233, -39446=>9234, -39489=>9235, -39470=>9236, -39480=>9237, -39491=>9238, -39492=>9239, -39503=>9240, -39525=>9241, -39524=>9242, -31993=>9243, -32006=>9244, -32002=>9245, -32007=>9246, -32008=>9247, -32394=>9248, -32028=>9249, -32021=>9250, -32019=>9251, -32058=>9252, -32050=>9253, -32049=>9254, -32272=>9255, -32060=>9256, -32064=>9257, -32063=>9258, -32093=>9259, -32078=>9260, -32115=>9261, -32134=>9262, -32131=>9263, -32136=>9264, -32190=>9265, -32186=>9266, -32203=>9267, -32212=>9268, -32196=>9269, -32158=>9270, -32172=>9271, -32185=>9272, -32163=>9273, -32176=>9274, -32199=>9275, -32217=>9276, -32215=>9277, -32249=>9278, -32242=>9279, -32354=>9280, -32230=>9281, -32246=>9282, -32241=>9283, -32267=>9284, -32225=>9285, -32265=>9286, -32285=>9287, -32287=>9288, -32286=>9289, -32301=>9290, -32266=>9291, -32273=>9292, -32381=>9293, -32313=>9294, -32309=>9295, -32306=>9296, -32326=>9297, -32325=>9298, -32392=>9299, -32346=>9300, -32338=>9301, -32366=>9302, -32382=>9303, -32368=>9304, -32367=>9305, -32408=>9306, -29859=>9307, -29771=>9308, -29903=>9309, -38922=>9310, -29885=>9311, -29759=>9312, -29833=>9313, -29862=>9314, -29908=>9315, -29914=>9316, -38873=>9317, -38878=>9318, -38876=>9319, -27050=>9320, -27370=>9321, -26776=>9322, -26838=>9323, -27141=>9324, -26783=>9325, -27355=>9326, -27379=>9327, -27368=>9328, -27359=>9329, -27273=>9330, -26895=>9331, -27208=>9332, -26984=>9333, -27071=>9334, -27194=>9335, -27292=>9336, -27410=>9337, -27422=>9338, -27357=>9339, -27111=>9340, -27407=>9341, -27414=>9342, -27372=>9343, -27354=>9344, -27384=>9345, -27315=>9346, -27367=>9347, -27299=>9348, -27347=>9349, -27358=>9350, -27556=>9351, -27550=>9352, -27566=>9353, -27563=>9354, -27567=>9355, -36564=>9356, -36571=>9357, -36594=>9358, -36603=>9359, -36708=>9360, -36601=>9361, -36604=>9362, -36587=>9363, -36580=>9364, -36706=>9365, -36602=>9366, -36606=>9367, -36618=>9368, -36615=>9369, -36613=>9370, -36626=>9371, -36646=>9372, -36638=>9373, -36639=>9374, -36636=>9375, -36659=>9376, -36678=>9377, -36692=>9378, -25108=>9379, -25127=>9380, -29964=>9381, -26311=>9382, -26308=>9383, -26249=>9384, -26326=>9385, -36033=>9386, -36016=>9387, -36026=>9388, -36029=>9389, -36100=>9390, -36018=>9391, -36037=>9392, -36112=>9393, -36049=>9394, -36058=>9395, -36053=>9396, -36075=>9397, -36071=>9398, -36091=>9399, -35224=>9400, -35244=>9401, -35233=>9402, -35263=>9403, -35238=>9404, -35247=>9405, -35250=>9406, -35255=>9407, -27647=>9408, -27660=>9409, -27692=>9410, -29272=>9411, -26407=>9412, -33110=>9413, -33242=>9414, -33051=>9415, -33214=>9416, -33121=>9417, -33231=>9418, -27487=>9419, -39086=>9420, -39087=>9421, -39094=>9422, -39100=>9423, -39110=>9424, -39112=>9425, -36674=>9426, -40783=>9427, -26005=>9428, -29036=>9429, -29010=>9430, -29079=>9431, -29121=>9432, -29148=>9433, -29182=>9434, -31152=>9435, -31118=>9436, -31146=>9437, -25055=>9438, -24932=>9439, -25059=>9440, -25095=>9441, -28585=>9442, -30959=>9443, -30893=>9444, -30824=>9445, -30904=>9446, -31018=>9447, -31025=>9448, -30820=>9449, -30973=>9450, -30951=>9451, -30947=>9452, -40853=>9453, -30616=>9454, -30558=>9455, -30652=>9456, -32646=>9457, -32648=>9458, -37330=>9459, -37331=>9460, -37332=>9461, -37337=>9462, -37335=>9463, -37333=>9464, -37367=>9465, -37351=>9466, -37348=>9467, -37702=>9468, -37365=>9469, -37369=>9470, -37384=>9471, -37414=>9472, -37445=>9473, -37393=>9474, -37392=>9475, -37377=>9476, -37415=>9477, -37380=>9478, -37413=>9479, -37376=>9480, -37434=>9481, -37478=>9482, -37431=>9483, -37427=>9484, -37461=>9485, -37437=>9486, -37432=>9487, -37470=>9488, -37484=>9489, -37485=>9490, -37439=>9491, -37984=>9492, -37424=>9493, -37449=>9494, -37448=>9495, -37453=>9496, -37422=>9497, -37433=>9498, -37944=>9499, -37548=>9500, -37536=>9501, -37498=>9502, -37546=>9503, -37614=>9504, -37583=>9505, -37891=>9506, -37603=>9507, -37946=>9508, -37553=>9509, -37542=>9510, -37799=>9511, -37526=>9512, -37580=>9513, -37545=>9514, -37877=>9515, -37523=>9516, -37503=>9517, -37801=>9518, -37530=>9519, -37658=>9520, -37547=>9521, -37507=>9522, -37899=>9523, -37544=>9524, -37539=>9525, -37906=>9526, -37688=>9527, -37617=>9528, -37847=>9529, -37605=>9530, -37616=>9531, -37615=>9532, -37608=>9533, -37564=>9534, -37597=>9535, -37622=>9536, -37926=>9537, -37927=>9538, -37571=>9539, -37599=>9540, -37606=>9541, -37650=>9542, -37638=>9543, -37737=>9544, -37659=>9545, -37696=>9546, -37633=>9547, -37653=>9548, -37678=>9549, -37699=>9550, -37639=>9551, -37640=>9552, -37663=>9553, -37657=>9554, -37733=>9555, -37703=>9556, -37750=>9557, -37716=>9558, -37732=>9559, -37802=>9560, -37744=>9561, -37764=>9562, -37860=>9563, -37848=>9564, -37928=>9565, -37767=>9566, -37836=>9567, -37784=>9568, -37816=>9569, -37823=>9570, -37798=>9571, -37808=>9572, -37813=>9573, -37964=>9574, -37858=>9575, -37852=>9576, -37853=>9577, -37837=>9578, -37854=>9579, -37827=>9580, -37831=>9581, -37841=>9582, -37908=>9583, -37917=>9584, -37879=>9585, -37989=>9586, -37907=>9587, -37997=>9588, -37920=>9589, -38009=>9590, -37881=>9591, -37913=>9592, -37962=>9593, -37938=>9594, -37951=>9595, -37972=>9596, -37987=>9597, -37758=>9598, -31329=>9599, -40169=>9600, -40182=>9601, -40199=>9602, -40198=>9603, -40227=>9604, -40327=>9605, -40469=>9606, -40221=>9607, -40223=>9608, -40421=>9609, -40239=>9610, -40409=>9611, -40240=>9612, -40258=>9613, -40478=>9614, -40275=>9615, -40477=>9616, -40288=>9617, -40274=>9618, -40435=>9619, -40284=>9620, -40289=>9621, -40339=>9622, -40298=>9623, -40303=>9624, -40329=>9625, -40344=>9626, -40346=>9627, -40384=>9628, -40357=>9629, -40361=>9630, -40386=>9631, -40380=>9632, -40474=>9633, -40403=>9634, -40410=>9635, -40431=>9636, -40422=>9637, -40434=>9638, -40440=>9639, -40460=>9640, -40442=>9641, -40475=>9642, -30308=>9643, -30296=>9644, -30311=>9645, -30210=>9646, -30278=>9647, -30279=>9648, -30281=>9649, -30238=>9650, -30267=>9651, -30317=>9652, -30318=>9653, -30313=>9654, -30322=>9655, -31431=>9656, -31414=>9657, -35168=>9658, -35123=>9659, -35165=>9660, -35143=>9661, -35128=>9662, -35172=>9663, -30392=>9664, -32814=>9665, -32812=>9666, -32889=>9667, -32885=>9668, -38919=>9669, -38926=>9670, -38927=>9671, -38945=>9672, -38940=>9673, -28481=>9674, -38950=>9675, -38967=>9676, -38990=>9677, -38995=>9678, -39027=>9679, -39010=>9680, -39001=>9681, -39013=>9682, -39020=>9683, -39024=>9684, -34787=>9685, -34822=>9686, -34566=>9687, -34851=>9688, -34806=>9689, -34554=>9690, -34799=>9691, -34692=>9692, -34832=>9693, -34760=>9694, -34833=>9695, -34747=>9696, -34766=>9697, -32588=>9698, -31716=>9699, -31591=>9700, -31849=>9701, -31731=>9702, -31744=>9703, -31691=>9704, -31836=>9705, -31774=>9706, -31787=>9707, -31779=>9708, -31850=>9709, -31839=>9710, -33380=>9711, -33387=>9712, -35018=>9713, -32677=>9714, -31986=>9715, -31990=>9716, -31965=>9717, -32310=>9718, -40617=>9719, -36274=>9720, -37317=>9721, -37315=>9722, -40570=>9723, -36489=>9724, -36428=>9725, -36498=>9726, -36474=>9727, -36437=>9728, -36506=>9729, -36491=>9730, -36499=>9731, -36497=>9732, -36513=>9733, -36451=>9734, -36522=>9735, -36518=>9736, -35316=>9737, -35318=>9738, -38746=>9739, -38722=>9740, -38717=>9741, -38724=>9742, -40788=>9743, -40799=>9744, -40793=>9745, -40800=>9746, -40796=>9747, -40806=>9748, -40812=>9749, -40810=>9750, -40823=>9751, -12236=>9752, -40701=>9752, -40703=>9753, -40713=>9754, -35726=>9755, -38014=>9756, -37864=>9757, -39799=>9758, -39796=>9759, -39809=>9760, -39811=>9761, -39822=>9762, -40056=>9763, -31308=>9764, -39826=>9765, -40031=>9766, -39824=>9767, -39853=>9768, -39834=>9769, -39850=>9770, -39838=>9771, -40045=>9772, -39851=>9773, -39837=>9774, -40024=>9775, -39873=>9776, -40058=>9777, -39985=>9778, -39993=>9779, -39971=>9780, -39991=>9781, -39872=>9782, -39882=>9783, -39879=>9784, -39933=>9785, -39894=>9786, -39914=>9787, -39915=>9788, -39905=>9789, -39908=>9790, -39911=>9791, -39901=>9792, -39906=>9793, -39920=>9794, -39899=>9795, -39924=>9796, -39892=>9797, -40029=>9798, -39944=>9799, -39952=>9800, -39949=>9801, -39954=>9802, -39945=>9803, -39935=>9804, -39968=>9805, -39986=>9806, -39981=>9807, -39976=>9808, -39973=>9809, -39977=>9810, -39987=>9811, -39998=>9812, -40008=>9813, -39995=>9814, -39989=>9815, -40005=>9816, -40022=>9817, -40020=>9818, -40018=>9819, -40039=>9820, -38851=>9821, -38845=>9822, -38857=>9823, -40379=>9824, -39631=>9825, -39638=>9826, -39637=>9827, -39768=>9828, -39758=>9829, -39255=>9830, -39260=>9831, -39714=>9832, -40695=>9833, -40690=>9834, -35180=>9835, -38342=>9836, -37686=>9837, -24390=>9838, -34068=>9839, -32404=>9840, -40803=>9841, -22137=>9842, -40725=>9843, -22081=>9844, -39662=>9845, -35079=>9846, -31296=>9847, -39091=>9848, -38308=>9849, -39693=>9850, -36852=>9851, -24409=>9852, -31339=>9853, -39138=>9854, -20642=>9855, -34193=>9856, -20760=>9857, -25458=>9858, -21067=>9859, -30543=>9860, -32397=>9861, -26310=>9862, -30637=>9863, -12228=>9864, -40565=>9864, -22217=>9865, -40692=>9866, -28635=>9867, -25054=>9868, -30663=>9869, -28720=>9870, -40629=>9871, -34890=>9872, -38370=>9873, -38854=>9874, -31844=>9875, -32308=>9876, -38822=>9877, -40623=>9878, -22220=>9879, -39089=>9880, -27311=>9881, -32590=>9882, -31984=>9883, -20418=>9884, -32363=>9885, -40569=>9886, -22190=>9887, -39706=>9888, -33903=>9889, -31142=>9890, -31858=>9891, -39634=>9892, -38587=>9893, -32251=>9894, -35069=>9895, -30787=>9896, -8560=>9897, -8561=>9898, -8562=>9899, -8563=>9900, -8564=>9901, -8565=>9902, -8566=>9903, -8567=>9904, -8568=>9905, -8569=>9906, -714=>9907, -715=>9908, -729=>9909, -8211=>9910, -8213=>9911, -8229=>9912, -8245=>9913, -8453=>9914, -8457=>9915, -8598=>9916, -8599=>9917, -8600=>9918, -8601=>9919, -8725=>9920, -8735=>9921, -8739=>9922, -8786=>9923, -8806=>9924, -8807=>9925, -8895=>9926, -9552=>9927, -9553=>9928, -9554=>9929, -9555=>9930, -9556=>9931, -9557=>9932, -9558=>9933, -9559=>9934, -9560=>9935, -9561=>9936, -9562=>9937, -9563=>9938, -9564=>9939, -9565=>9940, -9566=>9941, -9567=>9942, -9568=>9943, -9569=>9944, -9570=>9945, -9571=>9946, -9572=>9947, -9573=>9948, -9574=>9949, -9575=>9950, -9576=>9951, -9577=>9952, -9578=>9953, -9579=>9954, -9580=>9955, -9581=>9956, -9582=>9957, -9583=>9958, -9584=>9959, -9585=>9960, -9586=>9961, -9587=>9962, -9601=>9963, -9602=>9964, -9603=>9965, -9604=>9966, -9605=>9967, -9606=>9968, -9607=>9969, -9608=>9970, -9609=>9971, -9610=>9972, -9611=>9973, -9612=>9974, -9613=>9975, -9614=>9976, -9615=>9977, -9619=>9978, -9620=>9979, -9621=>9980, -9660=>9981, -9661=>9982, -9698=>9983, -9699=>9984, -9700=>9985, -9701=>9986, -9737=>9987, -8853=>9988, -12306=>9989, -12317=>9990, -12318=>9991, -12321=>9992, -12322=>9993, -12323=>9994, -12324=>9995, -12325=>9996, -12326=>9997, -12327=>9998, -12328=>9999, -12329=>10000, -12963=>10001, -13198=>10002, -13199=>10003, -13212=>10004, -13213=>10005, -13214=>10006, -13217=>10007, -13252=>10008, -13262=>10009, -13265=>10010, -13266=>10011, -13269=>10012, -65072=>10013, -65506=>10014, -65508=>10015, -8481=>10016, -12849=>10017, -8208=>10018, -12540=>10019, -12443=>10020, -12444=>10021, -12541=>10022, -12542=>10023, -12294=>10024, -12445=>10025, -12446=>10026, -65097=>10027, -65098=>10028, -65099=>10029, -65100=>10030, -65101=>10031, -65102=>10032, -65103=>10033, -65104=>10034, -65105=>10035, -65106=>10036, -65108=>10037, -65109=>10038, -65110=>10039, -65111=>10040, -65113=>10041, -65114=>10042, -65115=>10043, -65116=>10044, -65117=>10045, -65118=>10046, -65119=>10047, -65120=>10048, -65121=>10049, -65122=>10050, -65123=>10051, -65124=>10052, -65125=>10053, -65126=>10054, -65128=>10055, -65129=>10056, -65130=>10057, -65131=>10058, -12350=>10059, -59367=>10059, -12272=>10060, -59368=>10060, -12273=>10061, -59369=>10061, -12274=>10062, -59370=>10062, -12275=>10063, -59371=>10063, -12276=>10064, -59372=>10064, -12277=>10065, -59373=>10065, -12278=>10066, -59374=>10066, -12279=>10067, -59375=>10067, -12280=>10068, -59376=>10068, -12281=>10069, -59377=>10069, -12282=>10070, -59378=>10070, -12283=>10071, -59379=>10071, -19970=>10072, -19972=>10073, -19973=>10074, -19974=>10075, -19983=>10076, -19986=>10077, -19991=>10078, -19999=>10079, -20000=>10080, -20001=>10081, -20003=>10082, -20006=>10083, -20009=>10084, -20014=>10085, -20015=>10086, -20017=>10087, -20019=>10088, -20021=>10089, -20023=>10090, -20028=>10091, -20032=>10092, -20033=>10093, -20034=>10094, -20036=>10095, -20038=>10096, -20042=>10097, -20049=>10098, -20053=>10099, -20055=>10100, -20058=>10101, -20059=>10102, -20066=>10103, -20067=>10104, -20068=>10105, -20069=>10106, -20071=>10107, -20072=>10108, -20074=>10109, -20075=>10110, -20076=>10111, -20077=>10112, -20078=>10113, -20079=>10114, -20082=>10115, -20084=>10116, -20085=>10117, -20086=>10118, -20087=>10119, -20088=>10120, -20089=>10121, -20090=>10122, -20091=>10123, -20092=>10124, -20093=>10125, -20095=>10126, -20096=>10127, -20097=>10128, -20099=>10129, -20100=>10130, -12037=>10131, -20101=>10131, -20103=>10132, -20106=>10133, -20112=>10134, -20118=>10135, -20119=>10136, -20121=>10137, -20124=>10138, -20125=>10139, -20131=>10140, -20138=>10141, -20143=>10142, -20144=>10143, -20145=>10144, -20148=>10145, -20150=>10146, -20151=>10147, -20152=>10148, -20153=>10149, -20156=>10150, -20157=>10151, -20158=>10152, -20168=>10153, -20172=>10154, -20175=>10155, -20176=>10156, -20178=>10157, -20186=>10158, -20187=>10159, -20188=>10160, -20192=>10161, -20194=>10162, -20198=>10163, -20199=>10164, -20201=>10165, -20205=>10166, -20206=>10167, -20207=>10168, -20209=>10169, -20212=>10170, -20216=>10171, -20217=>10172, -20218=>10173, -20220=>10174, -20222=>10175, -20224=>10176, -20226=>10177, -20227=>10178, -20228=>10179, -20229=>10180, -20230=>10181, -20231=>10182, -20232=>10183, -20235=>10184, -20236=>10185, -20242=>10186, -20243=>10187, -20244=>10188, -20245=>10189, -20246=>10190, -20252=>10191, -20253=>10192, -20257=>10193, -20259=>10194, -20264=>10195, -20265=>10196, -20268=>10197, -20269=>10198, -20270=>10199, -20273=>10200, -20275=>10201, -20277=>10202, -20279=>10203, -20281=>10204, -20283=>10205, -20286=>10206, -20287=>10207, -20288=>10208, -20289=>10209, -20290=>10210, -20292=>10211, -20293=>10212, -20295=>10213, -20296=>10214, -20297=>10215, -20298=>10216, -20299=>10217, -20300=>10218, -20306=>10219, -20308=>10220, -20310=>10221, -20321=>10222, -20322=>10223, -20326=>10224, -20328=>10225, -20330=>10226, -20331=>10227, -20333=>10228, -20334=>10229, -20337=>10230, -20338=>10231, -20341=>10232, -20343=>10233, -20344=>10234, -20345=>10235, -20346=>10236, -20349=>10237, -20352=>10238, -20353=>10239, -20354=>10240, -20357=>10241, -20359=>10242, -20362=>10243, -20364=>10244, -20366=>10245, -20368=>10246, -20370=>10247, -20371=>10248, -20373=>10249, -20376=>10250, -20377=>10251, -20378=>10252, -20380=>10253, -20382=>10254, -20383=>10255, -20385=>10256, -20386=>10257, -20388=>10258, -20395=>10259, -20397=>10260, -20400=>10261, -20401=>10262, -20402=>10263, -20403=>10264, -20404=>10265, -20406=>10266, -20407=>10267, -20408=>10268, -20409=>10269, -20410=>10270, -20411=>10271, -20412=>10272, -20413=>10273, -20414=>10274, -20416=>10275, -20417=>10276, -20422=>10277, -20423=>10278, -20424=>10279, -20425=>10280, -20427=>10281, -20428=>10282, -20429=>10283, -20434=>10284, -20435=>10285, -20436=>10286, -20437=>10287, -20438=>10288, -20441=>10289, -20443=>10290, -20450=>10291, -20452=>10292, -20453=>10293, -20455=>10294, -20459=>10295, -20460=>10296, -20464=>10297, -20466=>10298, -20468=>10299, -20469=>10300, -20470=>10301, -20471=>10302, -20473=>10303, -20475=>10304, -20476=>10305, -20477=>10306, -20479=>10307, -20481=>10308, -20482=>10309, -20483=>10310, -20484=>10311, -20485=>10312, -20487=>10313, -20488=>10314, -20490=>10315, -20494=>10316, -20496=>10317, -20499=>10318, -20501=>10319, -20502=>10320, -20503=>10321, -20507=>10322, -20509=>10323, -20510=>10324, -20512=>10325, -20514=>10326, -20515=>10327, -20516=>10328, -20519=>10329, -20527=>10330, -20528=>10331, -20529=>10332, -20530=>10333, -20531=>10334, -20532=>10335, -20533=>10336, -20534=>10337, -20535=>10338, -20536=>10339, -20537=>10340, -20539=>10341, -20541=>10342, -20543=>10343, -20544=>10344, -20545=>10345, -20546=>10346, -20548=>10347, -20549=>10348, -20550=>10349, -20554=>10350, -20555=>10351, -20557=>10352, -20560=>10353, -20561=>10354, -20562=>10355, -20563=>10356, -20564=>10357, -20566=>10358, -20567=>10359, -20568=>10360, -20569=>10361, -20571=>10362, -20573=>10363, -20574=>10364, -20575=>10365, -20576=>10366, -20577=>10367, -20578=>10368, -20579=>10369, -20580=>10370, -20582=>10371, -20583=>10372, -20584=>10373, -20585=>10374, -20586=>10375, -20587=>10376, -20589=>10377, -20590=>10378, -20591=>10379, -20592=>10380, -20593=>10381, -20594=>10382, -20595=>10383, -20600=>10384, -20601=>10385, -20602=>10386, -20604=>10387, -20605=>10388, -20609=>10389, -20610=>10390, -20611=>10391, -20612=>10392, -20614=>10393, -20615=>10394, -20617=>10395, -20618=>10396, -20619=>10397, -20620=>10398, -20622=>10399, -20623=>10400, -20624=>10401, -20625=>10402, -20626=>10403, -20627=>10404, -20628=>10405, -20629=>10406, -20631=>10407, -20634=>10408, -20635=>10409, -20636=>10410, -20637=>10411, -20638=>10412, -20639=>10413, -20640=>10414, -20641=>10415, -20644=>10416, -20646=>10417, -20650=>10418, -20651=>10419, -20654=>10420, -20655=>10421, -20656=>10422, -20657=>10423, -20662=>10424, -20664=>10425, -20665=>10426, -20668=>10427, -20669=>10428, -20671=>10429, -20672=>10430, -20673=>10431, -20675=>10432, -20676=>10433, -20678=>10434, -20679=>10435, -20680=>10436, -20682=>10437, -20683=>10438, -20684=>10439, -20685=>10440, -20686=>10441, -20688=>10442, -20690=>10443, -20691=>10444, -20692=>10445, -20695=>10446, -20696=>10447, -20697=>10448, -20699=>10449, -20700=>10450, -20701=>10451, -20703=>10452, -20704=>10453, -20705=>10454, -20706=>10455, -20707=>10456, -20708=>10457, -20713=>10458, -20714=>10459, -20715=>10460, -20719=>10461, -20720=>10462, -20721=>10463, -20722=>10464, -20724=>10465, -20726=>10466, -20727=>10467, -20728=>10468, -20730=>10469, -20732=>10470, -20733=>10471, -20734=>10472, -20735=>10473, -20737=>10474, -20739=>10475, -20741=>10476, -20746=>10477, -20748=>10478, -20749=>10479, -20750=>10480, -20751=>10481, -20753=>10482, -20755=>10483, -20758=>10484, -20759=>10485, -20761=>10486, -20762=>10487, -20763=>10488, -20764=>10489, -20765=>10490, -20766=>10491, -20768=>10492, -20770=>10493, -20771=>10494, -20772=>10495, -20773=>10496, -20774=>10497, -20775=>10498, -20776=>10499, -20777=>10500, -20779=>10501, -20780=>10502, -20781=>10503, -20782=>10504, -20783=>10505, -20784=>10506, -20785=>10507, -20787=>10508, -20788=>10509, -20789=>10510, -20790=>10511, -20792=>10512, -20793=>10513, -20797=>10514, -20798=>10515, -20802=>10516, -20807=>10517, -20810=>10518, -20812=>10519, -20814=>10520, -20815=>10521, -20816=>10522, -20819=>10523, -20823=>10524, -20824=>10525, -20825=>10526, -20827=>10527, -20829=>10528, -20830=>10529, -20831=>10530, -20832=>10531, -20833=>10532, -20835=>10533, -20836=>10534, -20838=>10535, -20839=>10536, -20842=>10537, -20847=>10538, -20850=>10539, -20858=>10540, -20862=>10541, -20863=>10542, -20867=>10543, -20868=>10544, -20870=>10545, -20871=>10546, -20874=>10547, -20875=>10548, -20878=>10549, -20879=>10550, -20880=>10551, -20881=>10552, -20883=>10553, -20884=>10554, -20888=>10555, -20890=>10556, -20893=>10557, -20894=>10558, -20895=>10559, -20897=>10560, -20899=>10561, -20902=>10562, -20903=>10563, -20904=>10564, -20905=>10565, -20906=>10566, -20909=>10567, -20910=>10568, -20916=>10569, -20920=>10570, -20921=>10571, -20922=>10572, -20926=>10573, -20927=>10574, -20929=>10575, -20930=>10576, -20931=>10577, -20933=>10578, -20936=>10579, -20938=>10580, -20942=>10581, -20944=>10582, -20946=>10583, -20947=>10584, -20948=>10585, -20949=>10586, -20950=>10587, -20951=>10588, -20952=>10589, -20953=>10590, -20954=>10591, -20956=>10592, -20958=>10593, -20959=>10594, -20962=>10595, -20963=>10596, -20965=>10597, -20966=>10598, -20967=>10599, -20968=>10600, -20969=>10601, -20970=>10602, -20972=>10603, -20974=>10604, -20978=>10605, -20980=>10606, -20983=>10607, -20990=>10608, -20996=>10609, -20997=>10610, -21001=>10611, -21003=>10612, -21004=>10613, -21007=>10614, -21008=>10615, -21011=>10616, -21012=>10617, -21013=>10618, -21020=>10619, -21022=>10620, -21023=>10621, -21025=>10622, -21026=>10623, -21027=>10624, -21029=>10625, -21030=>10626, -21031=>10627, -21034=>10628, -21036=>10629, -21039=>10630, -21041=>10631, -21042=>10632, -21044=>10633, -21045=>10634, -21052=>10635, -21054=>10636, -21061=>10637, -21062=>10638, -21064=>10639, -21065=>10640, -21070=>10641, -21071=>10642, -21074=>10643, -21075=>10644, -21077=>10645, -21079=>10646, -21080=>10647, -21081=>10648, -21082=>10649, -21085=>10650, -21087=>10651, -21088=>10652, -21090=>10653, -21091=>10654, -21092=>10655, -21094=>10656, -21096=>10657, -21099=>10658, -21100=>10659, -21101=>10660, -21104=>10661, -21105=>10662, -21107=>10663, -21110=>10664, -21111=>10665, -21112=>10666, -21113=>10667, -21114=>10668, -21115=>10669, -21116=>10670, -21118=>10671, -21120=>10672, -21124=>10673, -21125=>10674, -21126=>10675, -21131=>10676, -21134=>10677, -21135=>10678, -21138=>10679, -21140=>10680, -21141=>10681, -21142=>10682, -21143=>10683, -21144=>10684, -21145=>10685, -21146=>10686, -21148=>10687, -21156=>10688, -21157=>10689, -21158=>10690, -21159=>10691, -21166=>10692, -21167=>10693, -21168=>10694, -21172=>10695, -21173=>10696, -21174=>10697, -21175=>10698, -21176=>10699, -21177=>10700, -21178=>10701, -21179=>10702, -21180=>10703, -21181=>10704, -21184=>10705, -21186=>10706, -21188=>10707, -21189=>10708, -21190=>10709, -21192=>10710, -21194=>10711, -21196=>10712, -21197=>10713, -21198=>10714, -21199=>10715, -21201=>10716, -21203=>10717, -21204=>10718, -21207=>10719, -21210=>10720, -21212=>10721, -21216=>10722, -21217=>10723, -21219=>10724, -21221=>10725, -21222=>10726, -21223=>10727, -21224=>10728, -21225=>10729, -21226=>10730, -21227=>10731, -21228=>10732, -21229=>10733, -21230=>10734, -21231=>10735, -21234=>10736, -21235=>10737, -21236=>10738, -21238=>10739, -21239=>10740, -21243=>10741, -21244=>10742, -21245=>10743, -21249=>10744, -21250=>10745, -21251=>10746, -21252=>10747, -21255=>10748, -21257=>10749, -21258=>10750, -21259=>10751, -21260=>10752, -21262=>10753, -21265=>10754, -21266=>10755, -21267=>10756, -21268=>10757, -21272=>10758, -21275=>10759, -21276=>10760, -21278=>10761, -21279=>10762, -21282=>10763, -21284=>10764, -21285=>10765, -21287=>10766, -21288=>10767, -21289=>10768, -21291=>10769, -21292=>10770, -21296=>10771, -21298=>10772, -21299=>10773, -21300=>10774, -21301=>10775, -21302=>10776, -21303=>10777, -12054=>10778, -21304=>10778, -21308=>10779, -21309=>10780, -21314=>10781, -21316=>10782, -21318=>10783, -21323=>10784, -21324=>10785, -21325=>10786, -21328=>10787, -21336=>10788, -21337=>10789, -21339=>10790, -21341=>10791, -21349=>10792, -21352=>10793, -21354=>10794, -21356=>10795, -21357=>10796, -21362=>10797, -21366=>10798, -21369=>10799, -21371=>10800, -21372=>10801, -21373=>10802, -21374=>10803, -21376=>10804, -21377=>10805, -21379=>10806, -21383=>10807, -21384=>10808, -21386=>10809, -21390=>10810, -21391=>10811, -21392=>10812, -21393=>10813, -21394=>10814, -21395=>10815, -21396=>10816, -21398=>10817, -21399=>10818, -21403=>10819, -21404=>10820, -21406=>10821, -21409=>10822, -21412=>10823, -21415=>10824, -21418=>10825, -21419=>10826, -21420=>10827, -21423=>10828, -21424=>10829, -21425=>10830, -21427=>10831, -21429=>10832, -21431=>10833, -21432=>10834, -21433=>10835, -21434=>10836, -21436=>10837, -21437=>10838, -21438=>10839, -21440=>10840, -21444=>10841, -21445=>10842, -21446=>10843, -21447=>10844, -21454=>10845, -21455=>10846, -21456=>10847, -21458=>10848, -21459=>10849, -21461=>10850, -21466=>10851, -21468=>10852, -21469=>10853, -21470=>10854, -21473=>10855, -21479=>10856, -21492=>10857, -21498=>10858, -21502=>10859, -21503=>10860, -21504=>10861, -21506=>10862, -21509=>10863, -21511=>10864, -21515=>10865, -21524=>10866, -21528=>10867, -21529=>10868, -21530=>10869, -21532=>10870, -21538=>10871, -21540=>10872, -21541=>10873, -21546=>10874, -21552=>10875, -21555=>10876, -21558=>10877, -21559=>10878, -21562=>10879, -21565=>10880, -21567=>10881, -21569=>10882, -21570=>10883, -21572=>10884, -21573=>10885, -21575=>10886, -21577=>10887, -21580=>10888, -21581=>10889, -21582=>10890, -21583=>10891, -21585=>10892, -21594=>10893, -21597=>10894, -21598=>10895, -21599=>10896, -21600=>10897, -21601=>10898, -21603=>10899, -21605=>10900, -21607=>10901, -21609=>10902, -21610=>10903, -21611=>10904, -21612=>10905, -21613=>10906, -21614=>10907, -21615=>10908, -21616=>10909, -21620=>10910, -21625=>10911, -21626=>10912, -21630=>10913, -21631=>10914, -21633=>10915, -21635=>10916, -21637=>10917, -21639=>10918, -21640=>10919, -21641=>10920, -21642=>10921, -21645=>10922, -21649=>10923, -21651=>10924, -21655=>10925, -21656=>10926, -21660=>10927, -21662=>10928, -21663=>10929, -21664=>10930, -21665=>10931, -21666=>10932, -21669=>10933, -21678=>10934, -21680=>10935, -21682=>10936, -21685=>10937, -21686=>10938, -21687=>10939, -21689=>10940, -21690=>10941, -21694=>10942, -21699=>10943, -21701=>10944, -21706=>10945, -21707=>10946, -21718=>10947, -21720=>10948, -21723=>10949, -21728=>10950, -21730=>10951, -21731=>10952, -21732=>10953, -21739=>10954, -21740=>10955, -21743=>10956, -21744=>10957, -21745=>10958, -21748=>10959, -21749=>10960, -21750=>10961, -21751=>10962, -21752=>10963, -21753=>10964, -21755=>10965, -21758=>10966, -21760=>10967, -21762=>10968, -21763=>10969, -21765=>10970, -21768=>10971, -21770=>10972, -21771=>10973, -21772=>10974, -21773=>10975, -21774=>10976, -21778=>10977, -21779=>10978, -21781=>10979, -21782=>10980, -21783=>10981, -21784=>10982, -21785=>10983, -21786=>10984, -21788=>10985, -21789=>10986, -21790=>10987, -21791=>10988, -21793=>10989, -21797=>10990, -21798=>10991, -21800=>10992, -21801=>10993, -21803=>10994, -21805=>10995, -21810=>10996, -21812=>10997, -21813=>10998, -21814=>10999, -21816=>11000, -21817=>11001, -21818=>11002, -21819=>11003, -21821=>11004, -21824=>11005, -21826=>11006, -21829=>11007, -21831=>11008, -21832=>11009, -21835=>11010, -21836=>11011, -21837=>11012, -21838=>11013, -21841=>11014, -21842=>11015, -21844=>11016, -21847=>11017, -21848=>11018, -21849=>11019, -21850=>11020, -21851=>11021, -21853=>11022, -21855=>11023, -21856=>11024, -21858=>11025, -21859=>11026, -21864=>11027, -21865=>11028, -21867=>11029, -21871=>11030, -21872=>11031, -21873=>11032, -21874=>11033, -21875=>11034, -21876=>11035, -21881=>11036, -21882=>11037, -21885=>11038, -21887=>11039, -21893=>11040, -21894=>11041, -21900=>11042, -21901=>11043, -21902=>11044, -21904=>11045, -21906=>11046, -21907=>11047, -21909=>11048, -21910=>11049, -21911=>11050, -21914=>11051, -21915=>11052, -21918=>11053, -21920=>11054, -21921=>11055, -21922=>11056, -21923=>11057, -21924=>11058, -21925=>11059, -21926=>11060, -21928=>11061, -21929=>11062, -21931=>11063, -21933=>11064, -21935=>11065, -21936=>11066, -21940=>11067, -21942=>11068, -21944=>11069, -21946=>11070, -21948=>11071, -21951=>11072, -21952=>11073, -21953=>11074, -21954=>11075, -21955=>11076, -21960=>11077, -21962=>11078, -21963=>11079, -21967=>11080, -21968=>11081, -21973=>11082, -21975=>11083, -21976=>11084, -21977=>11085, -21979=>11086, -21982=>11087, -21984=>11088, -21986=>11089, -21991=>11090, -21997=>11091, -21998=>11092, -22000=>11093, -22001=>11094, -22004=>11095, -22008=>11096, -22009=>11097, -22010=>11098, -22011=>11099, -22012=>11100, -22015=>11101, -22018=>11102, -22019=>11103, -22020=>11104, -22021=>11105, -22023=>11106, -22026=>11107, -22027=>11108, -22032=>11109, -22033=>11110, -22034=>11111, -22035=>11112, -22037=>11113, -22041=>11114, -22042=>11115, -22045=>11116, -22048=>11117, -22049=>11118, -22050=>11119, -22053=>11120, -22054=>11121, -22056=>11122, -22058=>11123, -22059=>11124, -22067=>11125, -22071=>11126, -22074=>11127, -22076=>11128, -22077=>11129, -22078=>11130, -22080=>11131, -22082=>11132, -22083=>11133, -22084=>11134, -22085=>11135, -22086=>11136, -22087=>11137, -22088=>11138, -22089=>11139, -22090=>11140, -22091=>11141, -22095=>11142, -22096=>11143, -22097=>11144, -22098=>11145, -22099=>11146, -22101=>11147, -22102=>11148, -22106=>11149, -22107=>11150, -22110=>11151, -22111=>11152, -22113=>11153, -22115=>11154, -22119=>11155, -22125=>11156, -22126=>11157, -22128=>11158, -22131=>11159, -22133=>11160, -22135=>11161, -22138=>11162, -22141=>11163, -22142=>11164, -22143=>11165, -22145=>11166, -22146=>11167, -22147=>11168, -22148=>11169, -22152=>11170, -22153=>11171, -22154=>11172, -22155=>11173, -22157=>11174, -22160=>11175, -22161=>11176, -22162=>11177, -22164=>11178, -22166=>11179, -22167=>11180, -22168=>11181, -22170=>11182, -22171=>11183, -22172=>11184, -22173=>11185, -22174=>11186, -22175=>11187, -22176=>11188, -22177=>11189, -22178=>11190, -22180=>11191, -22181=>11192, -22183=>11193, -22185=>11194, -22186=>11195, -22187=>11196, -22188=>11197, -22189=>11198, -22192=>11199, -22193=>11200, -22194=>11201, -22197=>11202, -22200=>11203, -22201=>11204, -22202=>11205, -22203=>11206, -22205=>11207, -22206=>11208, -22207=>11209, -22211=>11210, -22212=>11211, -22214=>11212, -22215=>11213, -22219=>11214, -22221=>11215, -22222=>11216, -22223=>11217, -22224=>11218, -22226=>11219, -22227=>11220, -22229=>11221, -22230=>11222, -22232=>11223, -22233=>11224, -22236=>11225, -22243=>11226, -22245=>11227, -22246=>11228, -22247=>11229, -22248=>11230, -22249=>11231, -22250=>11232, -22252=>11233, -22254=>11234, -22255=>11235, -22258=>11236, -22259=>11237, -22262=>11238, -22263=>11239, -22264=>11240, -22267=>11241, -22268=>11242, -22272=>11243, -22273=>11244, -22274=>11245, -22277=>11246, -22284=>11247, -22286=>11248, -22287=>11249, -22288=>11250, -22289=>11251, -22292=>11252, -22293=>11253, -22295=>11254, -22297=>11255, -22298=>11256, -22299=>11257, -22301=>11258, -22302=>11259, -22304=>11260, -22305=>11261, -22306=>11262, -22308=>11263, -22309=>11264, -22310=>11265, -22311=>11266, -22315=>11267, -22321=>11268, -22322=>11269, -22324=>11270, -22325=>11271, -22326=>11272, -22327=>11273, -22328=>11274, -22332=>11275, -22333=>11276, -22335=>11277, -22337=>11278, -22339=>11279, -22340=>11280, -22341=>11281, -22342=>11282, -22344=>11283, -22345=>11284, -22347=>11285, -22354=>11286, -22355=>11287, -22356=>11288, -22357=>11289, -22358=>11290, -22360=>11291, -22361=>11292, -22370=>11293, -22371=>11294, -22373=>11295, -22375=>11296, -22380=>11297, -22382=>11298, -22384=>11299, -22385=>11300, -22386=>11301, -22388=>11302, -22389=>11303, -22392=>11304, -22393=>11305, -22394=>11306, -22397=>11307, -22398=>11308, -22399=>11309, -22400=>11310, -22401=>11311, -22407=>11312, -22408=>11313, -22409=>11314, -22410=>11315, -22413=>11316, -22414=>11317, -22415=>11318, -22416=>11319, -22417=>11320, -22420=>11321, -22421=>11322, -22422=>11323, -22423=>11324, -22424=>11325, -22425=>11326, -22426=>11327, -22428=>11328, -22429=>11329, -22430=>11330, -22431=>11331, -22437=>11332, -22440=>11333, -22442=>11334, -22444=>11335, -22447=>11336, -22448=>11337, -22449=>11338, -22451=>11339, -22453=>11340, -22454=>11341, -22455=>11342, -22457=>11343, -22458=>11344, -22459=>11345, -22460=>11346, -22461=>11347, -22462=>11348, -22463=>11349, -22464=>11350, -22465=>11351, -22468=>11352, -22469=>11353, -22470=>11354, -22471=>11355, -22472=>11356, -22473=>11357, -22474=>11358, -22476=>11359, -22477=>11360, -22480=>11361, -22481=>11362, -22483=>11363, -22486=>11364, -22487=>11365, -22491=>11366, -22492=>11367, -22494=>11368, -22498=>11369, -22499=>11370, -22501=>11371, -22502=>11372, -22503=>11373, -22504=>11374, -22505=>11375, -22506=>11376, -22507=>11377, -22508=>11378, -22510=>11379, -22512=>11380, -22513=>11381, -22514=>11382, -22515=>11383, -22517=>11384, -22518=>11385, -22523=>11386, -22524=>11387, -22526=>11388, -22527=>11389, -22529=>11390, -22531=>11391, -22532=>11392, -22536=>11393, -22537=>11394, -22540=>11395, -22542=>11396, -22543=>11397, -22544=>11398, -22546=>11399, -22547=>11400, -22548=>11401, -22551=>11402, -22552=>11403, -22554=>11404, -22555=>11405, -22556=>11406, -22559=>11407, -22562=>11408, -22563=>11409, -22565=>11410, -22566=>11411, -22567=>11412, -22568=>11413, -22569=>11414, -22571=>11415, -22572=>11416, -22573=>11417, -22574=>11418, -22578=>11419, -22579=>11420, -22582=>11421, -22583=>11422, -22584=>11423, -22585=>11424, -22586=>11425, -22587=>11426, -22588=>11427, -22589=>11428, -22590=>11429, -22591=>11430, -22592=>11431, -22593=>11432, -22594=>11433, -22595=>11434, -22597=>11435, -22598=>11436, -22599=>11437, -22600=>11438, -22601=>11439, -22606=>11440, -22608=>11441, -22611=>11442, -22613=>11443, -22614=>11444, -22617=>11445, -22618=>11446, -22619=>11447, -22620=>11448, -22621=>11449, -22623=>11450, -22624=>11451, -22625=>11452, -22627=>11453, -22630=>11454, -22631=>11455, -22632=>11456, -22633=>11457, -22634=>11458, -22637=>11459, -22638=>11460, -22639=>11461, -22640=>11462, -22641=>11463, -22642=>11464, -22643=>11465, -22644=>11466, -22646=>11467, -22647=>11468, -22648=>11469, -22650=>11470, -22651=>11471, -22652=>11472, -22653=>11473, -22655=>11474, -22658=>11475, -22660=>11476, -22662=>11477, -22663=>11478, -22664=>11479, -22667=>11480, -22668=>11481, -22669=>11482, -22670=>11483, -22671=>11484, -22672=>11485, -22673=>11486, -22676=>11487, -22677=>11488, -22678=>11489, -22679=>11490, -22680=>11491, -22683=>11492, -22685=>11493, -22688=>11494, -22689=>11495, -22690=>11496, -22691=>11497, -22692=>11498, -22693=>11499, -22694=>11500, -22695=>11501, -22698=>11502, -22699=>11503, -22700=>11504, -22701=>11505, -22703=>11506, -22704=>11507, -22705=>11508, -22706=>11509, -22708=>11510, -22709=>11511, -22710=>11512, -22711=>11513, -22712=>11514, -22713=>11515, -22714=>11516, -22717=>11517, -22719=>11518, -22720=>11519, -22722=>11520, -22723=>11521, -22724=>11522, -22726=>11523, -22728=>11524, -22729=>11525, -22730=>11526, -22731=>11527, -22732=>11528, -22733=>11529, -22734=>11530, -22735=>11531, -22736=>11532, -22738=>11533, -22740=>11534, -22742=>11535, -22743=>11536, -22747=>11537, -22748=>11538, -22749=>11539, -22753=>11540, -22755=>11541, -22757=>11542, -22758=>11543, -22759=>11544, -22760=>11545, -22762=>11546, -22765=>11547, -22769=>11548, -22770=>11549, -22772=>11550, -22773=>11551, -22775=>11552, -22776=>11553, -22779=>11554, -22780=>11555, -22782=>11556, -22783=>11557, -22784=>11558, -22785=>11559, -22787=>11560, -22789=>11561, -22790=>11562, -22792=>11563, -22793=>11564, -12066=>11565, -22794=>11565, -22795=>11566, -22796=>11567, -22798=>11568, -22800=>11569, -22801=>11570, -22802=>11571, -22803=>11572, -22807=>11573, -22808=>11574, -22811=>11575, -22813=>11576, -22814=>11577, -22816=>11578, -22817=>11579, -22819=>11580, -22822=>11581, -22824=>11582, -22828=>11583, -22832=>11584, -22834=>11585, -22835=>11586, -22837=>11587, -22838=>11588, -22843=>11589, -22845=>11590, -22847=>11591, -22848=>11592, -22851=>11593, -22853=>11594, -22854=>11595, -22858=>11596, -22860=>11597, -22861=>11598, -22864=>11599, -22866=>11600, -22867=>11601, -22873=>11602, -22875=>11603, -22876=>11604, -22877=>11605, -22878=>11606, -22879=>11607, -22881=>11608, -22883=>11609, -22884=>11610, -22886=>11611, -22887=>11612, -22888=>11613, -22891=>11614, -22893=>11615, -22895=>11616, -22896=>11617, -22897=>11618, -22898=>11619, -22901=>11620, -22903=>11621, -22906=>11622, -22907=>11623, -22908=>11624, -22910=>11625, -22911=>11626, -22912=>11627, -22917=>11628, -22921=>11629, -22923=>11630, -22924=>11631, -22926=>11632, -22927=>11633, -22928=>11634, -22929=>11635, -22932=>11636, -22933=>11637, -22936=>11638, -22938=>11639, -22939=>11640, -22940=>11641, -22943=>11642, -22944=>11643, -22945=>11644, -22946=>11645, -22950=>11646, -22951=>11647, -22956=>11648, -22957=>11649, -22960=>11650, -22961=>11651, -22963=>11652, -22964=>11653, -22965=>11654, -22966=>11655, -22967=>11656, -22968=>11657, -22970=>11658, -22972=>11659, -22973=>11660, -22975=>11661, -22976=>11662, -22977=>11663, -22978=>11664, -22979=>11665, -22980=>11666, -22981=>11667, -22983=>11668, -22984=>11669, -22985=>11670, -22988=>11671, -22989=>11672, -22990=>11673, -22991=>11674, -22997=>11675, -22998=>11676, -23001=>11677, -23003=>11678, -23006=>11679, -23007=>11680, -23008=>11681, -23009=>11682, -23010=>11683, -23012=>11684, -23014=>11685, -23015=>11686, -23017=>11687, -23018=>11688, -23019=>11689, -23021=>11690, -23022=>11691, -23023=>11692, -23024=>11693, -23025=>11694, -23026=>11695, -23027=>11696, -23028=>11697, -23029=>11698, -23030=>11699, -23031=>11700, -23032=>11701, -23034=>11702, -23036=>11703, -23037=>11704, -23038=>11705, -23040=>11706, -23042=>11707, -23050=>11708, -23051=>11709, -23053=>11710, -23054=>11711, -23055=>11712, -23056=>11713, -23058=>11714, -23060=>11715, -23061=>11716, -23062=>11717, -23063=>11718, -23065=>11719, -23066=>11720, -23067=>11721, -23069=>11722, -23070=>11723, -23073=>11724, -23074=>11725, -23076=>11726, -23078=>11727, -23079=>11728, -23080=>11729, -23082=>11730, -23083=>11731, -23084=>11732, -23085=>11733, -23086=>11734, -23087=>11735, -23088=>11736, -23091=>11737, -23093=>11738, -23095=>11739, -23096=>11740, -23097=>11741, -23098=>11742, -23099=>11743, -23101=>11744, -23102=>11745, -23103=>11746, -23106=>11747, -23107=>11748, -23108=>11749, -23109=>11750, -23111=>11751, -23112=>11752, -23115=>11753, -23116=>11754, -23117=>11755, -23118=>11756, -23119=>11757, -23120=>11758, -23121=>11759, -23122=>11760, -23123=>11761, -23124=>11762, -23126=>11763, -23127=>11764, -23128=>11765, -23129=>11766, -23131=>11767, -23132=>11768, -23133=>11769, -23134=>11770, -23135=>11771, -23136=>11772, -23137=>11773, -23139=>11774, -23140=>11775, -23141=>11776, -23144=>11777, -23145=>11778, -23147=>11779, -23148=>11780, -23150=>11781, -23151=>11782, -23152=>11783, -23153=>11784, -23154=>11785, -23155=>11786, -23160=>11787, -23161=>11788, -23163=>11789, -23164=>11790, -23165=>11791, -23166=>11792, -23168=>11793, -23169=>11794, -23170=>11795, -23171=>11796, -23172=>11797, -23173=>11798, -23174=>11799, -23175=>11800, -23176=>11801, -23177=>11802, -23178=>11803, -23179=>11804, -23180=>11805, -23181=>11806, -23182=>11807, -23183=>11808, -23184=>11809, -23185=>11810, -23187=>11811, -23188=>11812, -23189=>11813, -23190=>11814, -23191=>11815, -23192=>11816, -23193=>11817, -23196=>11818, -23197=>11819, -23198=>11820, -23199=>11821, -23200=>11822, -23201=>11823, -23202=>11824, -23203=>11825, -23204=>11826, -23205=>11827, -23206=>11828, -23208=>11829, -23209=>11830, -23211=>11831, -23212=>11832, -23213=>11833, -23214=>11834, -23215=>11835, -23216=>11836, -23217=>11837, -23220=>11838, -23222=>11839, -23223=>11840, -23225=>11841, -23226=>11842, -23227=>11843, -23228=>11844, -23231=>11845, -23232=>11846, -23235=>11847, -23236=>11848, -23237=>11849, -23238=>11850, -23239=>11851, -23240=>11852, -23242=>11853, -23243=>11854, -23245=>11855, -23246=>11856, -23247=>11857, -23248=>11858, -23249=>11859, -23251=>11860, -23253=>11861, -23257=>11862, -23258=>11863, -23259=>11864, -23261=>11865, -23262=>11866, -23263=>11867, -23266=>11868, -23268=>11869, -23269=>11870, -23271=>11871, -23272=>11872, -23274=>11873, -23276=>11874, -23277=>11875, -23278=>11876, -23279=>11877, -23280=>11878, -23282=>11879, -23283=>11880, -23284=>11881, -23286=>11882, -23287=>11883, -23288=>11884, -23289=>11885, -23290=>11886, -23292=>11887, -23293=>11888, -23294=>11889, -23295=>11890, -23297=>11891, -23298=>11892, -23299=>11893, -23300=>11894, -23301=>11895, -23302=>11896, -23303=>11897, -23306=>11898, -23309=>11899, -23310=>11900, -23311=>11901, -23312=>11902, -23313=>11903, -23314=>11904, -23315=>11905, -23316=>11906, -23317=>11907, -23320=>11908, -23322=>11909, -23323=>11910, -23324=>11911, -23325=>11912, -23326=>11913, -23327=>11914, -23328=>11915, -23330=>11916, -23331=>11917, -23332=>11918, -23333=>11919, -23334=>11920, -23335=>11921, -23336=>11922, -23337=>11923, -23339=>11924, -23340=>11925, -23341=>11926, -23342=>11927, -23343=>11928, -23345=>11929, -23347=>11930, -23349=>11931, -23350=>11932, -23353=>11933, -23354=>11934, -23355=>11935, -23356=>11936, -23357=>11937, -23358=>11938, -23359=>11939, -23361=>11940, -23362=>11941, -23363=>11942, -23364=>11943, -23365=>11944, -23366=>11945, -23367=>11946, -23368=>11947, -23369=>11948, -23370=>11949, -23371=>11950, -23373=>11951, -23374=>11952, -23375=>11953, -23378=>11954, -23382=>11955, -23390=>11956, -23392=>11957, -23393=>11958, -23399=>11959, -23400=>11960, -23405=>11961, -23406=>11962, -23407=>11963, -23410=>11964, -23412=>11965, -23414=>11966, -23415=>11967, -23417=>11968, -23419=>11969, -23420=>11970, -23422=>11971, -23426=>11972, -23430=>11973, -23434=>11974, -23437=>11975, -23438=>11976, -23440=>11977, -23441=>11978, -23442=>11979, -23444=>11980, -23446=>11981, -23455=>11982, -23463=>11983, -23464=>11984, -23465=>11985, -23468=>11986, -23469=>11987, -23470=>11988, -23471=>11989, -23473=>11990, -23474=>11991, -23479=>11992, -23482=>11993, -23483=>11994, -23484=>11995, -23488=>11996, -23489=>11997, -23491=>11998, -23496=>11999, -23497=>12000, -23498=>12001, -23499=>12002, -23501=>12003, -23502=>12004, -23503=>12005, -23505=>12006, -23508=>12007, -23509=>12008, -23510=>12009, -23511=>12010, -23512=>12011, -23513=>12012, -23514=>12013, -23515=>12014, -23516=>12015, -23520=>12016, -23523=>12017, -23530=>12018, -23533=>12019, -23535=>12020, -23537=>12021, -23538=>12022, -23539=>12023, -23540=>12024, -23543=>12025, -23549=>12026, -23550=>12027, -23552=>12028, -23554=>12029, -23555=>12030, -23557=>12031, -23564=>12032, -23568=>12033, -23570=>12034, -23571=>12035, -23575=>12036, -23577=>12037, -23579=>12038, -23582=>12039, -23583=>12040, -23584=>12041, -23585=>12042, -23587=>12043, -23590=>12044, -23592=>12045, -23593=>12046, -23594=>12047, -23595=>12048, -23597=>12049, -23598=>12050, -23599=>12051, -23600=>12052, -23602=>12053, -23603=>12054, -23605=>12055, -23606=>12056, -23619=>12057, -23620=>12058, -23622=>12059, -23623=>12060, -23628=>12061, -23629=>12062, -23634=>12063, -23635=>12064, -23636=>12065, -23638=>12066, -23639=>12067, -23640=>12068, -23642=>12069, -23643=>12070, -23644=>12071, -23645=>12072, -23647=>12073, -23655=>12074, -23657=>12075, -23658=>12076, -23659=>12077, -23661=>12078, -23664=>12079, -23666=>12080, -23667=>12081, -23668=>12082, -23669=>12083, -23670=>12084, -23671=>12085, -23672=>12086, -23675=>12087, -23676=>12088, -23677=>12089, -23678=>12090, -23680=>12091, -23683=>12092, -23684=>12093, -23685=>12094, -23686=>12095, -23687=>12096, -23689=>12097, -23690=>12098, -23691=>12099, -23694=>12100, -23695=>12101, -23698=>12102, -23699=>12103, -23701=>12104, -23709=>12105, -23710=>12106, -23711=>12107, -23712=>12108, -23716=>12109, -23717=>12110, -23718=>12111, -23719=>12112, -23720=>12113, -23722=>12114, -23726=>12115, -23727=>12116, -23728=>12117, -23730=>12118, -23732=>12119, -23734=>12120, -23737=>12121, -23738=>12122, -23739=>12123, -23740=>12124, -23742=>12125, -23744=>12126, -23746=>12127, -23747=>12128, -23749=>12129, -23750=>12130, -23751=>12131, -23752=>12132, -23753=>12133, -23754=>12134, -23756=>12135, -23757=>12136, -23758=>12137, -23759=>12138, -23760=>12139, -23761=>12140, -23763=>12141, -23764=>12142, -23765=>12143, -23766=>12144, -23767=>12145, -23768=>12146, -23770=>12147, -23771=>12148, -23772=>12149, -23773=>12150, -23774=>12151, -23775=>12152, -23776=>12153, -23778=>12154, -23779=>12155, -23783=>12156, -23785=>12157, -23787=>12158, -23788=>12159, -23790=>12160, -23791=>12161, -23793=>12162, -23794=>12163, -23795=>12164, -23797=>12165, -23799=>12166, -23800=>12167, -23801=>12168, -23802=>12169, -23804=>12170, -23806=>12171, -23807=>12172, -23808=>12173, -23809=>12174, -23812=>12175, -23813=>12176, -23816=>12177, -23817=>12178, -23818=>12179, -23819=>12180, -23820=>12181, -23823=>12182, -23824=>12183, -23825=>12184, -23826=>12185, -23827=>12186, -23829=>12187, -23832=>12188, -23833=>12189, -23834=>12190, -23836=>12191, -23837=>12192, -23839=>12193, -23840=>12194, -23841=>12195, -23842=>12196, -23843=>12197, -23845=>12198, -23848=>12199, -23850=>12200, -23851=>12201, -23855=>12202, -23856=>12203, -23857=>12204, -23858=>12205, -23859=>12206, -23861=>12207, -23862=>12208, -23863=>12209, -23864=>12210, -23865=>12211, -23866=>12212, -23867=>12213, -23868=>12214, -23871=>12215, -23872=>12216, -23873=>12217, -23874=>12218, -23875=>12219, -23876=>12220, -23877=>12221, -23878=>12222, -23880=>12223, -23881=>12224, -23885=>12225, -23886=>12226, -23887=>12227, -23889=>12228, -23890=>12229, -23891=>12230, -23892=>12231, -23893=>12232, -23894=>12233, -23895=>12234, -23897=>12235, -23898=>12236, -23900=>12237, -23902=>12238, -23903=>12239, -23904=>12240, -23905=>12241, -23906=>12242, -23907=>12243, -23908=>12244, -23909=>12245, -23910=>12246, -23911=>12247, -23912=>12248, -23914=>12249, -23917=>12250, -23918=>12251, -23920=>12252, -23921=>12253, -23922=>12254, -23923=>12255, -23925=>12256, -23926=>12257, -23927=>12258, -23928=>12259, -23929=>12260, -23930=>12261, -23931=>12262, -23932=>12263, -23933=>12264, -23934=>12265, -23935=>12266, -23936=>12267, -23939=>12268, -23941=>12269, -23942=>12270, -23944=>12271, -23945=>12272, -23946=>12273, -23947=>12274, -23948=>12275, -23949=>12276, -23950=>12277, -23951=>12278, -23952=>12279, -23953=>12280, -23954=>12281, -23955=>12282, -23956=>12283, -23957=>12284, -23958=>12285, -23960=>12286, -23962=>12287, -23963=>12288, -23964=>12289, -23966=>12290, -23967=>12291, -23969=>12292, -23970=>12293, -23971=>12294, -23972=>12295, -23973=>12296, -23974=>12297, -23976=>12298, -23977=>12299, -23978=>12300, -23979=>12301, -23980=>12302, -23981=>12303, -23982=>12304, -23983=>12305, -23984=>12306, -23985=>12307, -23986=>12308, -23987=>12309, -23988=>12310, -23989=>12311, -23990=>12312, -23993=>12313, -23995=>12314, -23997=>12315, -23998=>12316, -23999=>12317, -24000=>12318, -24001=>12319, -24002=>12320, -24003=>12321, -24004=>12322, -24006=>12323, -24007=>12324, -24008=>12325, -24009=>12326, -24010=>12327, -24012=>12328, -24014=>12329, -24015=>12330, -24016=>12331, -24017=>12332, -24019=>12333, -24021=>12334, -24022=>12335, -24023=>12336, -24024=>12337, -24025=>12338, -24026=>12339, -24028=>12340, -24031=>12341, -24032=>12342, -24035=>12343, -24036=>12344, -24042=>12345, -24044=>12346, -24045=>12347, -24053=>12348, -24054=>12349, -24056=>12350, -24057=>12351, -24058=>12352, -24059=>12353, -24060=>12354, -24063=>12355, -24064=>12356, -24068=>12357, -24071=>12358, -24073=>12359, -24074=>12360, -24075=>12361, -24077=>12362, -24078=>12363, -24082=>12364, -24083=>12365, -24087=>12366, -24094=>12367, -24095=>12368, -24096=>12369, -24097=>12370, -24098=>12371, -24099=>12372, -24100=>12373, -24104=>12374, -24105=>12375, -24106=>12376, -24108=>12377, -24111=>12378, -24112=>12379, -24114=>12380, -24116=>12381, -24117=>12382, -24121=>12383, -24122=>12384, -24126=>12385, -24127=>12386, -24129=>12387, -24134=>12388, -24135=>12389, -24136=>12390, -24137=>12391, -24138=>12392, -24139=>12393, -24141=>12394, -24142=>12395, -24143=>12396, -24144=>12397, -24145=>12398, -24146=>12399, -24147=>12400, -24150=>12401, -24153=>12402, -24154=>12403, -24156=>12404, -24157=>12405, -24160=>12406, -24164=>12407, -24165=>12408, -24166=>12409, -24167=>12410, -24168=>12411, -24169=>12412, -24170=>12413, -24173=>12414, -24174=>12415, -24175=>12416, -24176=>12417, -24177=>12418, -24181=>12419, -24183=>12420, -24193=>12421, -24194=>12422, -24195=>12423, -24197=>12424, -24200=>12425, -24201=>12426, -24204=>12427, -24205=>12428, -24206=>12429, -24210=>12430, -24216=>12431, -24219=>12432, -24221=>12433, -24225=>12434, -24226=>12435, -24227=>12436, -24228=>12437, -24232=>12438, -24233=>12439, -24234=>12440, -24236=>12441, -24238=>12442, -24239=>12443, -24240=>12444, -24241=>12445, -24242=>12446, -24244=>12447, -24250=>12448, -24251=>12449, -24252=>12450, -24253=>12451, -24255=>12452, -24256=>12453, -24257=>12454, -24258=>12455, -24259=>12456, -24260=>12457, -24261=>12458, -24262=>12459, -24263=>12460, -24264=>12461, -24267=>12462, -24268=>12463, -24269=>12464, -24270=>12465, -24271=>12466, -24272=>12467, -24276=>12468, -24277=>12469, -24279=>12470, -24280=>12471, -24281=>12472, -24282=>12473, -24284=>12474, -24285=>12475, -24286=>12476, -24292=>12477, -24293=>12478, -24294=>12479, -24295=>12480, -24297=>12481, -24299=>12482, -24301=>12483, -24302=>12484, -24303=>12485, -24304=>12486, -24305=>12487, -24306=>12488, -24309=>12489, -24312=>12490, -24313=>12491, -24315=>12492, -24316=>12493, -24317=>12494, -24325=>12495, -24326=>12496, -24327=>12497, -24329=>12498, -24332=>12499, -24333=>12500, -24334=>12501, -24336=>12502, -24338=>12503, -24340=>12504, -24342=>12505, -24345=>12506, -24346=>12507, -24348=>12508, -24349=>12509, -24350=>12510, -24353=>12511, -24354=>12512, -24355=>12513, -24356=>12514, -24360=>12515, -24363=>12516, -24364=>12517, -24366=>12518, -24368=>12519, -24370=>12520, -24372=>12521, -24374=>12522, -24375=>12523, -24376=>12524, -24379=>12525, -24381=>12526, -24382=>12527, -24383=>12528, -24385=>12529, -24386=>12530, -24387=>12531, -24388=>12532, -24389=>12533, -24391=>12534, -24393=>12535, -24394=>12536, -24395=>12537, -24397=>12538, -24399=>12539, -24401=>12540, -24404=>12541, -24410=>12542, -24411=>12543, -24412=>12544, -24414=>12545, -24415=>12546, -24416=>12547, -24419=>12548, -24421=>12549, -24423=>12550, -24424=>12551, -24427=>12552, -24430=>12553, -24431=>12554, -24434=>12555, -24436=>12556, -24437=>12557, -24438=>12558, -24440=>12559, -24442=>12560, -24445=>12561, -24446=>12562, -24447=>12563, -24451=>12564, -24454=>12565, -24461=>12566, -24462=>12567, -24463=>12568, -24467=>12569, -24468=>12570, -24470=>12571, -24474=>12572, -24475=>12573, -24477=>12574, -24479=>12575, -24482=>12576, -24483=>12577, -24484=>12578, -24485=>12579, -24486=>12580, -24487=>12581, -24491=>12582, -24492=>12583, -24495=>12584, -24496=>12585, -24497=>12586, -24498=>12587, -24499=>12588, -24500=>12589, -24502=>12590, -24504=>12591, -24506=>12592, -24507=>12593, -24510=>12594, -24511=>12595, -24512=>12596, -24513=>12597, -24514=>12598, -24519=>12599, -24520=>12600, -24522=>12601, -24523=>12602, -24526=>12603, -24531=>12604, -24532=>12605, -24533=>12606, -24538=>12607, -24539=>12608, -24540=>12609, -24542=>12610, -24543=>12611, -24546=>12612, -24547=>12613, -24549=>12614, -24550=>12615, -24552=>12616, -24553=>12617, -24556=>12618, -24559=>12619, -24560=>12620, -24562=>12621, -24563=>12622, -24564=>12623, -24566=>12624, -24567=>12625, -24569=>12626, -24570=>12627, -24572=>12628, -24583=>12629, -24584=>12630, -24585=>12631, -24587=>12632, -24588=>12633, -24592=>12634, -24593=>12635, -24595=>12636, -24599=>12637, -24600=>12638, -24602=>12639, -24606=>12640, -24607=>12641, -24610=>12642, -24611=>12643, -24612=>12644, -24620=>12645, -24621=>12646, -24622=>12647, -24624=>12648, -24625=>12649, -24626=>12650, -24627=>12651, -24628=>12652, -24630=>12653, -24631=>12654, -24632=>12655, -24633=>12656, -24634=>12657, -24637=>12658, -24638=>12659, -24640=>12660, -24644=>12661, -24645=>12662, -24646=>12663, -24647=>12664, -24648=>12665, -24649=>12666, -24650=>12667, -24652=>12668, -24654=>12669, -24655=>12670, -24657=>12671, -24659=>12672, -24660=>12673, -24662=>12674, -24663=>12675, -24664=>12676, -24667=>12677, -24668=>12678, -24670=>12679, -24671=>12680, -24672=>12681, -24673=>12682, -24677=>12683, -24678=>12684, -24686=>12685, -24689=>12686, -24690=>12687, -24692=>12688, -24693=>12689, -24695=>12690, -24702=>12691, -24704=>12692, -24705=>12693, -24706=>12694, -24709=>12695, -24710=>12696, -24711=>12697, -24712=>12698, -24714=>12699, -24715=>12700, -24718=>12701, -24719=>12702, -24720=>12703, -24721=>12704, -24723=>12705, -24725=>12706, -24727=>12707, -24728=>12708, -24729=>12709, -24732=>12710, -24734=>12711, -24737=>12712, -24738=>12713, -24740=>12714, -24741=>12715, -24743=>12716, -24745=>12717, -24746=>12718, -24750=>12719, -24752=>12720, -24755=>12721, -24759=>12722, -24761=>12723, -24762=>12724, -24765=>12725, -24766=>12726, -24767=>12727, -24768=>12728, -24769=>12729, -24770=>12730, -24771=>12731, -24772=>12732, -24775=>12733, -24776=>12734, -24777=>12735, -24780=>12736, -24781=>12737, -24782=>12738, -24783=>12739, -24784=>12740, -24786=>12741, -24787=>12742, -24788=>12743, -24790=>12744, -24791=>12745, -24793=>12746, -24795=>12747, -24798=>12748, -24802=>12749, -24803=>12750, -24804=>12751, -24805=>12752, -24810=>12753, -24821=>12754, -24823=>12755, -24824=>12756, -24828=>12757, -24829=>12758, -24830=>12759, -24831=>12760, -24834=>12761, -24835=>12762, -24836=>12763, -24837=>12764, -24839=>12765, -24842=>12766, -24843=>12767, -24844=>12768, -24848=>12769, -24849=>12770, -24850=>12771, -24851=>12772, -24852=>12773, -24854=>12774, -24855=>12775, -24856=>12776, -24857=>12777, -24861=>12778, -24862=>12779, -24865=>12780, -24866=>12781, -24869=>12782, -24872=>12783, -24873=>12784, -24874=>12785, -24876=>12786, -24877=>12787, -24878=>12788, -24879=>12789, -24880=>12790, -24881=>12791, -24882=>12792, -24883=>12793, -24885=>12794, -24886=>12795, -24888=>12796, -24889=>12797, -24890=>12798, -24891=>12799, -24892=>12800, -24893=>12801, -24896=>12802, -24897=>12803, -24898=>12804, -24899=>12805, -24900=>12806, -24901=>12807, -24902=>12808, -24903=>12809, -24905=>12810, -24909=>12811, -24911=>12812, -24912=>12813, -24914=>12814, -24915=>12815, -24916=>12816, -24918=>12817, -24919=>12818, -24921=>12819, -24923=>12820, -24924=>12821, -24926=>12822, -24928=>12823, -24929=>12824, -24933=>12825, -24934=>12826, -24937=>12827, -24940=>12828, -24941=>12829, -24943=>12830, -24945=>12831, -24946=>12832, -24948=>12833, -24952=>12834, -24953=>12835, -24954=>12836, -24955=>12837, -24956=>12838, -24957=>12839, -24958=>12840, -24959=>12841, -24960=>12842, -24961=>12843, -24963=>12844, -24964=>12845, -24965=>12846, -24966=>12847, -24967=>12848, -24968=>12849, -24969=>12850, -24972=>12851, -24973=>12852, -24975=>12853, -24979=>12854, -24981=>12855, -24982=>12856, -24983=>12857, -24984=>12858, -24985=>12859, -24987=>12860, -24988=>12861, -24990=>12862, -24991=>12863, -24992=>12864, -24993=>12865, -24994=>12866, -24995=>12867, -24997=>12868, -24998=>12869, -25002=>12870, -25005=>12871, -25007=>12872, -25008=>12873, -25009=>12874, -25011=>12875, -25012=>12876, -25013=>12877, -25016=>12878, -25017=>12879, -25018=>12880, -25019=>12881, -25020=>12882, -25021=>12883, -25023=>12884, -25024=>12885, -25025=>12886, -25027=>12887, -25028=>12888, -25029=>12889, -25030=>12890, -25037=>12891, -25038=>12892, -25039=>12893, -25040=>12894, -25043=>12895, -25045=>12896, -25046=>12897, -25047=>12898, -25048=>12899, -25049=>12900, -25050=>12901, -25051=>12902, -25052=>12903, -25053=>12904, -25056=>12905, -25057=>12906, -25058=>12907, -25060=>12908, -25061=>12909, -25063=>12910, -25065=>12911, -25066=>12912, -25067=>12913, -25068=>12914, -25069=>12915, -25070=>12916, -25071=>12917, -25072=>12918, -25073=>12919, -25075=>12920, -25076=>12921, -25081=>12922, -25083=>12923, -25085=>12924, -25089=>12925, -25090=>12926, -25091=>12927, -25092=>12928, -25093=>12929, -25097=>12930, -25107=>12931, -25113=>12932, -25116=>12933, -25117=>12934, -25118=>12935, -25120=>12936, -25123=>12937, -25126=>12938, -25128=>12939, -25129=>12940, -25131=>12941, -25133=>12942, -25135=>12943, -25137=>12944, -25141=>12945, -12094=>12946, -25142=>12946, -25144=>12947, -25145=>12948, -25146=>12949, -25147=>12950, -25148=>12951, -25154=>12952, -25156=>12953, -25157=>12954, -25158=>12955, -25162=>12956, -25167=>12957, -25168=>12958, -25173=>12959, -25174=>12960, -25175=>12961, -25177=>12962, -25178=>12963, -25180=>12964, -25181=>12965, -25182=>12966, -25183=>12967, -25184=>12968, -25185=>12969, -25186=>12970, -25188=>12971, -25189=>12972, -25192=>12973, -25201=>12974, -25202=>12975, -25204=>12976, -25205=>12977, -25207=>12978, -25208=>12979, -25210=>12980, -25211=>12981, -25213=>12982, -25217=>12983, -25218=>12984, -25219=>12985, -25221=>12986, -25222=>12987, -25223=>12988, -25224=>12989, -25227=>12990, -25228=>12991, -25229=>12992, -25230=>12993, -25231=>12994, -25232=>12995, -25236=>12996, -25241=>12997, -25244=>12998, -25245=>12999, -25246=>13000, -25251=>13001, -25254=>13002, -25255=>13003, -25257=>13004, -25258=>13005, -25261=>13006, -25262=>13007, -25263=>13008, -25264=>13009, -25266=>13010, -25267=>13011, -25268=>13012, -25270=>13013, -25271=>13014, -25272=>13015, -25274=>13016, -25278=>13017, -25280=>13018, -25281=>13019, -25283=>13020, -25291=>13021, -25295=>13022, -25297=>13023, -25301=>13024, -25309=>13025, -25310=>13026, -25312=>13027, -25313=>13028, -25316=>13029, -25322=>13030, -25323=>13031, -25328=>13032, -25330=>13033, -25333=>13034, -25336=>13035, -25337=>13036, -25338=>13037, -25339=>13038, -25344=>13039, -25347=>13040, -25348=>13041, -25349=>13042, -25350=>13043, -25354=>13044, -25355=>13045, -25356=>13046, -25357=>13047, -25359=>13048, -25360=>13049, -25362=>13050, -25363=>13051, -25364=>13052, -25365=>13053, -25367=>13054, -25368=>13055, -25369=>13056, -25372=>13057, -25382=>13058, -25383=>13059, -25385=>13060, -25388=>13061, -25389=>13062, -25390=>13063, -25392=>13064, -25393=>13065, -25395=>13066, -25396=>13067, -25397=>13068, -25398=>13069, -25399=>13070, -25400=>13071, -25403=>13072, -25404=>13073, -25407=>13074, -25408=>13075, -25409=>13076, -25412=>13077, -25415=>13078, -25416=>13079, -25418=>13080, -25425=>13081, -25426=>13082, -25427=>13083, -25428=>13084, -25430=>13085, -25431=>13086, -25432=>13087, -25433=>13088, -25434=>13089, -25435=>13090, -25436=>13091, -25437=>13092, -25440=>13093, -25444=>13094, -25445=>13095, -25446=>13096, -25450=>13097, -25452=>13098, -25455=>13099, -25456=>13100, -25459=>13101, -25460=>13102, -25461=>13103, -25464=>13104, -25465=>13105, -25468=>13106, -25469=>13107, -25470=>13108, -25471=>13109, -25473=>13110, -25477=>13111, -25478=>13112, -25483=>13113, -25485=>13114, -25489=>13115, -25491=>13116, -25492=>13117, -25493=>13118, -25495=>13119, -25497=>13120, -25498=>13121, -25499=>13122, -25500=>13123, -25501=>13124, -25502=>13125, -25503=>13126, -25505=>13127, -25508=>13128, -25510=>13129, -25515=>13130, -25519=>13131, -25521=>13132, -25522=>13133, -25525=>13134, -25526=>13135, -25529=>13136, -25531=>13137, -25533=>13138, -25535=>13139, -25537=>13140, -25538=>13141, -25539=>13142, -25541=>13143, -25543=>13144, -25544=>13145, -25546=>13146, -25547=>13147, -25548=>13148, -25553=>13149, -25555=>13150, -25556=>13151, -25557=>13152, -25559=>13153, -25560=>13154, -25561=>13155, -25563=>13156, -25564=>13157, -25565=>13158, -25567=>13159, -25570=>13160, -25572=>13161, -25573=>13162, -25574=>13163, -25575=>13164, -25576=>13165, -25579=>13166, -25580=>13167, -25583=>13168, -25584=>13169, -25585=>13170, -25587=>13171, -25589=>13172, -25591=>13173, -25593=>13174, -25594=>13175, -25595=>13176, -25596=>13177, -25598=>13178, -25603=>13179, -25604=>13180, -25606=>13181, -25607=>13182, -25608=>13183, -25609=>13184, -25610=>13185, -25614=>13186, -25617=>13187, -25618=>13188, -25621=>13189, -25622=>13190, -25624=>13191, -25625=>13192, -25626=>13193, -25629=>13194, -25631=>13195, -25634=>13196, -25635=>13197, -25636=>13198, -25637=>13199, -25639=>13200, -25640=>13201, -25641=>13202, -25643=>13203, -25646=>13204, -25647=>13205, -25648=>13206, -25649=>13207, -25650=>13208, -25651=>13209, -25653=>13210, -25655=>13211, -25656=>13212, -25657=>13213, -25659=>13214, -25660=>13215, -25662=>13216, -25664=>13217, -25666=>13218, -25667=>13219, -25673=>13220, -25675=>13221, -25676=>13222, -25677=>13223, -25678=>13224, -25679=>13225, -25680=>13226, -25683=>13227, -25685=>13228, -25686=>13229, -25687=>13230, -25689=>13231, -25690=>13232, -25691=>13233, -25693=>13234, -25696=>13235, -25697=>13236, -25698=>13237, -25699=>13238, -25700=>13239, -25701=>13240, -25702=>13241, -25704=>13242, -25706=>13243, -25707=>13244, -25708=>13245, -25710=>13246, -25712=>13247, -25713=>13248, -25714=>13249, -25716=>13250, -25717=>13251, -25719=>13252, -25724=>13253, -25725=>13254, -25726=>13255, -25727=>13256, -25728=>13257, -25729=>13258, -25731=>13259, -25734=>13260, -25737=>13261, -25738=>13262, -25739=>13263, -25740=>13264, -25741=>13265, -25742=>13266, -25743=>13267, -25744=>13268, -25748=>13269, -25751=>13270, -25752=>13271, -25754=>13272, -25755=>13273, -25756=>13274, -25757=>13275, -25760=>13276, -25761=>13277, -25762=>13278, -25766=>13279, -25767=>13280, -25768=>13281, -25770=>13282, -25775=>13283, -25777=>13284, -25780=>13285, -25782=>13286, -25785=>13287, -25789=>13288, -25795=>13289, -25798=>13290, -25800=>13291, -25801=>13292, -25804=>13293, -25807=>13294, -25809=>13295, -25811=>13296, -25813=>13297, -25814=>13298, -25817=>13299, -25819=>13300, -25820=>13301, -25821=>13302, -25823=>13303, -25825=>13304, -25827=>13305, -25829=>13306, -25831=>13307, -25832=>13308, -25833=>13309, -25834=>13310, -25835=>13311, -25837=>13312, -25838=>13313, -25843=>13314, -25845=>13315, -25846=>13316, -25848=>13317, -25849=>13318, -25853=>13319, -25855=>13320, -25857=>13321, -25858=>13322, -25859=>13323, -25861=>13324, -25863=>13325, -25864=>13326, -25866=>13327, -25867=>13328, -25868=>13329, -25869=>13330, -25870=>13331, -25872=>13332, -25873=>13333, -25875=>13334, -25877=>13335, -25879=>13336, -25882=>13337, -25884=>13338, -25886=>13339, -25887=>13340, -25888=>13341, -25889=>13342, -25894=>13343, -25895=>13344, -25896=>13345, -25897=>13346, -25901=>13347, -25904=>13348, -25905=>13349, -25906=>13350, -25907=>13351, -25911=>13352, -25914=>13353, -25916=>13354, -25917=>13355, -25920=>13356, -25921=>13357, -25922=>13358, -25923=>13359, -25924=>13360, -25926=>13361, -25927=>13362, -25930=>13363, -25931=>13364, -25933=>13365, -25934=>13366, -25936=>13367, -25938=>13368, -25939=>13369, -25940=>13370, -25944=>13371, -25946=>13372, -25948=>13373, -25951=>13374, -25952=>13375, -25953=>13376, -25956=>13377, -25957=>13378, -25959=>13379, -25960=>13380, -25961=>13381, -25962=>13382, -25965=>13383, -25966=>13384, -25967=>13385, -25969=>13386, -25971=>13387, -25974=>13388, -25977=>13389, -25978=>13390, -25979=>13391, -25980=>13392, -25981=>13393, -25982=>13394, -25983=>13395, -25984=>13396, -25985=>13397, -25988=>13398, -25989=>13399, -25990=>13400, -25992=>13401, -25993=>13402, -25994=>13403, -25997=>13404, -25998=>13405, -25999=>13406, -26002=>13407, -26004=>13408, -26006=>13409, -26008=>13410, -26010=>13411, -26013=>13412, -26014=>13413, -26016=>13414, -26018=>13415, -26019=>13416, -26022=>13417, -26024=>13418, -26026=>13419, -26030=>13420, -26033=>13421, -26034=>13422, -26035=>13423, -26036=>13424, -26037=>13425, -26038=>13426, -26040=>13427, -26042=>13428, -26043=>13429, -26046=>13430, -26047=>13431, -26048=>13432, -26050=>13433, -26055=>13434, -26056=>13435, -26057=>13436, -26058=>13437, -26061=>13438, -26064=>13439, -26065=>13440, -26067=>13441, -26068=>13442, -26069=>13443, -26072=>13444, -26073=>13445, -26074=>13446, -26075=>13447, -26076=>13448, -26077=>13449, -26078=>13450, -26079=>13451, -26081=>13452, -26083=>13453, -26084=>13454, -26090=>13455, -26091=>13456, -26098=>13457, -26099=>13458, -26100=>13459, -26101=>13460, -26104=>13461, -26105=>13462, -26107=>13463, -26108=>13464, -26109=>13465, -26110=>13466, -26111=>13467, -26113=>13468, -26116=>13469, -26117=>13470, -26119=>13471, -26120=>13472, -26121=>13473, -26123=>13474, -26125=>13475, -26128=>13476, -26129=>13477, -26130=>13478, -26134=>13479, -26135=>13480, -26136=>13481, -26138=>13482, -26139=>13483, -26140=>13484, -26142=>13485, -26145=>13486, -26146=>13487, -26147=>13488, -26148=>13489, -26150=>13490, -26153=>13491, -26154=>13492, -26155=>13493, -26156=>13494, -26158=>13495, -26160=>13496, -26162=>13497, -26163=>13498, -26167=>13499, -26168=>13500, -26169=>13501, -26170=>13502, -26171=>13503, -26173=>13504, -26175=>13505, -26176=>13506, -26180=>13507, -26181=>13508, -26182=>13509, -26183=>13510, -26184=>13511, -26185=>13512, -26186=>13513, -26189=>13514, -26190=>13515, -26192=>13516, -26193=>13517, -26200=>13518, -26201=>13519, -26203=>13520, -26204=>13521, -26206=>13522, -26208=>13523, -26210=>13524, -26211=>13525, -26213=>13526, -26215=>13527, -26217=>13528, -26218=>13529, -26219=>13530, -26220=>13531, -26221=>13532, -26225=>13533, -26226=>13534, -26227=>13535, -26229=>13536, -26232=>13537, -26233=>13538, -26235=>13539, -26236=>13540, -26237=>13541, -26239=>13542, -26240=>13543, -26241=>13544, -26243=>13545, -26245=>13546, -26246=>13547, -26250=>13548, -26251=>13549, -26253=>13550, -26254=>13551, -26255=>13552, -26256=>13553, -26258=>13554, -26259=>13555, -26260=>13556, -26261=>13557, -26264=>13558, -26265=>13559, -26266=>13560, -26267=>13561, -26268=>13562, -26270=>13563, -26271=>13564, -26272=>13565, -26273=>13566, -26275=>13567, -26276=>13568, -26277=>13569, -26278=>13570, -26281=>13571, -26282=>13572, -26284=>13573, -26285=>13574, -26287=>13575, -26288=>13576, -26289=>13577, -26290=>13578, -26291=>13579, -26293=>13580, -26294=>13581, -26295=>13582, -26296=>13583, -26298=>13584, -26299=>13585, -26300=>13586, -26301=>13587, -26303=>13588, -26304=>13589, -26305=>13590, -26306=>13591, -26307=>13592, -26309=>13593, -26312=>13594, -26314=>13595, -26315=>13596, -26316=>13597, -26317=>13598, -26318=>13599, -26319=>13600, -26320=>13601, -26321=>13602, -26322=>13603, -26323=>13604, -26324=>13605, -26325=>13606, -26327=>13607, -26328=>13608, -26330=>13609, -26334=>13610, -26335=>13611, -26337=>13612, -26338=>13613, -26339=>13614, -26340=>13615, -26341=>13616, -26343=>13617, -26344=>13618, -26346=>13619, -26347=>13620, -26349=>13621, -26350=>13622, -26351=>13623, -26353=>13624, -26357=>13625, -26358=>13626, -26362=>13627, -26363=>13628, -26365=>13629, -26369=>13630, -26370=>13631, -26372=>13632, -26373=>13633, -26374=>13634, -26375=>13635, -26380=>13636, -26382=>13637, -26383=>13638, -26385=>13639, -26386=>13640, -26387=>13641, -26390=>13642, -26392=>13643, -26393=>13644, -26394=>13645, -26396=>13646, -26398=>13647, -26400=>13648, -26401=>13649, -26402=>13650, -26403=>13651, -26404=>13652, -26405=>13653, -26409=>13654, -26414=>13655, -26416=>13656, -26418=>13657, -26419=>13658, -26422=>13659, -26423=>13660, -26424=>13661, -26425=>13662, -26427=>13663, -26428=>13664, -26430=>13665, -26431=>13666, -26433=>13667, -26436=>13668, -26437=>13669, -26439=>13670, -26442=>13671, -26443=>13672, -26445=>13673, -26450=>13674, -26452=>13675, -26453=>13676, -26455=>13677, -26456=>13678, -26457=>13679, -26458=>13680, -26459=>13681, -26461=>13682, -26466=>13683, -26467=>13684, -26468=>13685, -26470=>13686, -26471=>13687, -26475=>13688, -26476=>13689, -26478=>13690, -26484=>13691, -26486=>13692, -26488=>13693, -26489=>13694, -26490=>13695, -26491=>13696, -26493=>13697, -26496=>13698, -26498=>13699, -26499=>13700, -26501=>13701, -26502=>13702, -26504=>13703, -26506=>13704, -26508=>13705, -26509=>13706, -26510=>13707, -26511=>13708, -26513=>13709, -26514=>13710, -26515=>13711, -26516=>13712, -26518=>13713, -26521=>13714, -26523=>13715, -26527=>13716, -26528=>13717, -26529=>13718, -26532=>13719, -26534=>13720, -26537=>13721, -26540=>13722, -26542=>13723, -26545=>13724, -26546=>13725, -26548=>13726, -26553=>13727, -26554=>13728, -26555=>13729, -26556=>13730, -26557=>13731, -26558=>13732, -26559=>13733, -26560=>13734, -26562=>13735, -26565=>13736, -26566=>13737, -26567=>13738, -26568=>13739, -26569=>13740, -26570=>13741, -26571=>13742, -26572=>13743, -26573=>13744, -26574=>13745, -26581=>13746, -26582=>13747, -26583=>13748, -26587=>13749, -26591=>13750, -26593=>13751, -26595=>13752, -26596=>13753, -26598=>13754, -26599=>13755, -26600=>13756, -26602=>13757, -26603=>13758, -26605=>13759, -26606=>13760, -26610=>13761, -26613=>13762, -26614=>13763, -26615=>13764, -26616=>13765, -26617=>13766, -26618=>13767, -26619=>13768, -26620=>13769, -26622=>13770, -26625=>13771, -26626=>13772, -26627=>13773, -26628=>13774, -26630=>13775, -26637=>13776, -26640=>13777, -26642=>13778, -26644=>13779, -26645=>13780, -26648=>13781, -26649=>13782, -26650=>13783, -26651=>13784, -26652=>13785, -26654=>13786, -26655=>13787, -26656=>13788, -26658=>13789, -26659=>13790, -26660=>13791, -26661=>13792, -26662=>13793, -26663=>13794, -26664=>13795, -26667=>13796, -26668=>13797, -26669=>13798, -26670=>13799, -26671=>13800, -26672=>13801, -26673=>13802, -26676=>13803, -26677=>13804, -26678=>13805, -26682=>13806, -26683=>13807, -26687=>13808, -26695=>13809, -26699=>13810, -26701=>13811, -26703=>13812, -26706=>13813, -26710=>13814, -26711=>13815, -26712=>13816, -26713=>13817, -26714=>13818, -26715=>13819, -26716=>13820, -26717=>13821, -26718=>13822, -26719=>13823, -26730=>13824, -26732=>13825, -26733=>13826, -26734=>13827, -26735=>13828, -26736=>13829, -26737=>13830, -26738=>13831, -26739=>13832, -26741=>13833, -26744=>13834, -26745=>13835, -26746=>13836, -26747=>13837, -26748=>13838, -26749=>13839, -26750=>13840, -26751=>13841, -26752=>13842, -26754=>13843, -26756=>13844, -26759=>13845, -26760=>13846, -26761=>13847, -26762=>13848, -26763=>13849, -26764=>13850, -26765=>13851, -26766=>13852, -26768=>13853, -26769=>13854, -26770=>13855, -26772=>13856, -26773=>13857, -26774=>13858, -26777=>13859, -26778=>13860, -26779=>13861, -26780=>13862, -26782=>13863, -26784=>13864, -26785=>13865, -26787=>13866, -26788=>13867, -26789=>13868, -26793=>13869, -26794=>13870, -26795=>13871, -26796=>13872, -26798=>13873, -26801=>13874, -26802=>13875, -26804=>13876, -26806=>13877, -26807=>13878, -26808=>13879, -26809=>13880, -26810=>13881, -26811=>13882, -26812=>13883, -26813=>13884, -26814=>13885, -26815=>13886, -26817=>13887, -26819=>13888, -26820=>13889, -26821=>13890, -26822=>13891, -26823=>13892, -26824=>13893, -26826=>13894, -26828=>13895, -26830=>13896, -26831=>13897, -26832=>13898, -26833=>13899, -26835=>13900, -26836=>13901, -26841=>13902, -26843=>13903, -26844=>13904, -26845=>13905, -26846=>13906, -26849=>13907, -26850=>13908, -26852=>13909, -26853=>13910, -26854=>13911, -26856=>13912, -26857=>13913, -26858=>13914, -26859=>13915, -26860=>13916, -26861=>13917, -26863=>13918, -26866=>13919, -26867=>13920, -26868=>13921, -26870=>13922, -26871=>13923, -26872=>13924, -26875=>13925, -26877=>13926, -26878=>13927, -26879=>13928, -26880=>13929, -26882=>13930, -26883=>13931, -26884=>13932, -26886=>13933, -26887=>13934, -26888=>13935, -26889=>13936, -26890=>13937, -26892=>13938, -26897=>13939, -26899=>13940, -26900=>13941, -26901=>13942, -26902=>13943, -26903=>13944, -26904=>13945, -26905=>13946, -26906=>13947, -26907=>13948, -26908=>13949, -26909=>13950, -26910=>13951, -26913=>13952, -26914=>13953, -26915=>13954, -26917=>13955, -26918=>13956, -26919=>13957, -26920=>13958, -26921=>13959, -26922=>13960, -26923=>13961, -26924=>13962, -26926=>13963, -26927=>13964, -26929=>13965, -26930=>13966, -26931=>13967, -26933=>13968, -26934=>13969, -26935=>13970, -26936=>13971, -26938=>13972, -26939=>13973, -26940=>13974, -26942=>13975, -26944=>13976, -26945=>13977, -26947=>13978, -26948=>13979, -26949=>13980, -26950=>13981, -26951=>13982, -26952=>13983, -26953=>13984, -26955=>13985, -26956=>13986, -26957=>13987, -26958=>13988, -26959=>13989, -26960=>13990, -26961=>13991, -26962=>13992, -26965=>13993, -26966=>13994, -26968=>13995, -26969=>13996, -26971=>13997, -26972=>13998, -26975=>13999, -26977=>14000, -26978=>14001, -26980=>14002, -26981=>14003, -26983=>14004, -26985=>14005, -26986=>14006, -26988=>14007, -26991=>14008, -26992=>14009, -26994=>14010, -26995=>14011, -26996=>14012, -26998=>14013, -27002=>14014, -27003=>14015, -27005=>14016, -27006=>14017, -27007=>14018, -27009=>14019, -27011=>14020, -27013=>14021, -27018=>14022, -27019=>14023, -27020=>14024, -27022=>14025, -27023=>14026, -27024=>14027, -27025=>14028, -27026=>14029, -27027=>14030, -27030=>14031, -27031=>14032, -27033=>14033, -27034=>14034, -27037=>14035, -27038=>14036, -27039=>14037, -27040=>14038, -27041=>14039, -27042=>14040, -27043=>14041, -27044=>14042, -27045=>14043, -27046=>14044, -27049=>14045, -27052=>14046, -27055=>14047, -27056=>14048, -27058=>14049, -27059=>14050, -27061=>14051, -27062=>14052, -27064=>14053, -27065=>14054, -27066=>14055, -27068=>14056, -27069=>14057, -27070=>14058, -27072=>14059, -27074=>14060, -27075=>14061, -27076=>14062, -27077=>14063, -27078=>14064, -27079=>14065, -27080=>14066, -27081=>14067, -27087=>14068, -27089=>14069, -27090=>14070, -27091=>14071, -27093=>14072, -27094=>14073, -27095=>14074, -27096=>14075, -27097=>14076, -27098=>14077, -27100=>14078, -27101=>14079, -27102=>14080, -27105=>14081, -27106=>14082, -27107=>14083, -27108=>14084, -27109=>14085, -27110=>14086, -27112=>14087, -27113=>14088, -27114=>14089, -27115=>14090, -27116=>14091, -27118=>14092, -27119=>14093, -27120=>14094, -27121=>14095, -27124=>14096, -27125=>14097, -27126=>14098, -27127=>14099, -27128=>14100, -27129=>14101, -27130=>14102, -27131=>14103, -27132=>14104, -27134=>14105, -27136=>14106, -27139=>14107, -27140=>14108, -27142=>14109, -27143=>14110, -27144=>14111, -27145=>14112, -27147=>14113, -27148=>14114, -27149=>14115, -27150=>14116, -27151=>14117, -27152=>14118, -27153=>14119, -27154=>14120, -27156=>14121, -27157=>14122, -27158=>14123, -27162=>14124, -27163=>14125, -27164=>14126, -27165=>14127, -27168=>14128, -27170=>14129, -27172=>14130, -27173=>14131, -27174=>14132, -27175=>14133, -27177=>14134, -27179=>14135, -27180=>14136, -27181=>14137, -27182=>14138, -27184=>14139, -27186=>14140, -27187=>14141, -27188=>14142, -27190=>14143, -27191=>14144, -27195=>14145, -27196=>14146, -27199=>14147, -27200=>14148, -27201=>14149, -27202=>14150, -27203=>14151, -27205=>14152, -27206=>14153, -27209=>14154, -27210=>14155, -27212=>14156, -27213=>14157, -27214=>14158, -27215=>14159, -27217=>14160, -27218=>14161, -27219=>14162, -27220=>14163, -27221=>14164, -27222=>14165, -27223=>14166, -27226=>14167, -27228=>14168, -27229=>14169, -27230=>14170, -27232=>14171, -27235=>14172, -27236=>14173, -27238=>14174, -27239=>14175, -27240=>14176, -27241=>14177, -27242=>14178, -27243=>14179, -27244=>14180, -27245=>14181, -27246=>14182, -27247=>14183, -27248=>14184, -27250=>14185, -27251=>14186, -27252=>14187, -27253=>14188, -27254=>14189, -27255=>14190, -27256=>14191, -27258=>14192, -27259=>14193, -27261=>14194, -27262=>14195, -27263=>14196, -27265=>14197, -27266=>14198, -27267=>14199, -27269=>14200, -27270=>14201, -27271=>14202, -27272=>14203, -27274=>14204, -27275=>14205, -27276=>14206, -27277=>14207, -27279=>14208, -27282=>14209, -27283=>14210, -27285=>14211, -27286=>14212, -27288=>14213, -27289=>14214, -27290=>14215, -27291=>14216, -27293=>14217, -27294=>14218, -27295=>14219, -27297=>14220, -27300=>14221, -27301=>14222, -27302=>14223, -27303=>14224, -27304=>14225, -27306=>14226, -27309=>14227, -27310=>14228, -27312=>14229, -27313=>14230, -27314=>14231, -27316=>14232, -27317=>14233, -27318=>14234, -27319=>14235, -27321=>14236, -27322=>14237, -27324=>14238, -27325=>14239, -27326=>14240, -27327=>14241, -27328=>14242, -27329=>14243, -27330=>14244, -27332=>14245, -27333=>14246, -27334=>14247, -27335=>14248, -27336=>14249, -27337=>14250, -27338=>14251, -27339=>14252, -27340=>14253, -27341=>14254, -27342=>14255, -27343=>14256, -27344=>14257, -27345=>14258, -27346=>14259, -27348=>14260, -27349=>14261, -27350=>14262, -27351=>14263, -27352=>14264, -27353=>14265, -27356=>14266, -27360=>14267, -27361=>14268, -27362=>14269, -27363=>14270, -27364=>14271, -27365=>14272, -27366=>14273, -27369=>14274, -27371=>14275, -27373=>14276, -27374=>14277, -27375=>14278, -27376=>14279, -27377=>14280, -27378=>14281, -27380=>14282, -27381=>14283, -27382=>14284, -27383=>14285, -27385=>14286, -27386=>14287, -27388=>14288, -27389=>14289, -27390=>14290, -27391=>14291, -27392=>14292, -27393=>14293, -27394=>14294, -27395=>14295, -27397=>14296, -27398=>14297, -27399=>14298, -27400=>14299, -27401=>14300, -27403=>14301, -27404=>14302, -27405=>14303, -27406=>14304, -27408=>14305, -27409=>14306, -27411=>14307, -27412=>14308, -27413=>14309, -27415=>14310, -27416=>14311, -27417=>14312, -27418=>14313, -27419=>14314, -27420=>14315, -27421=>14316, -27423=>14317, -27429=>14318, -27430=>14319, -27432=>14320, -27433=>14321, -27434=>14322, -27435=>14323, -27436=>14324, -27437=>14325, -27438=>14326, -27439=>14327, -27440=>14328, -27441=>14329, -27443=>14330, -27444=>14331, -27445=>14332, -27446=>14333, -27448=>14334, -27451=>14335, -27452=>14336, -27455=>14337, -27456=>14338, -27457=>14339, -27458=>14340, -27460=>14341, -27461=>14342, -27464=>14343, -27466=>14344, -27467=>14345, -27469=>14346, -27470=>14347, -27471=>14348, -27473=>14349, -27474=>14350, -27475=>14351, -27476=>14352, -27477=>14353, -27478=>14354, -27479=>14355, -27480=>14356, -27482=>14357, -27483=>14358, -27484=>14359, -27485=>14360, -27486=>14361, -27488=>14362, -27496=>14363, -27497=>14364, -27499=>14365, -27500=>14366, -27501=>14367, -27502=>14368, -27503=>14369, -27504=>14370, -27505=>14371, -27507=>14372, -27508=>14373, -27509=>14374, -27510=>14375, -27514=>14376, -27517=>14377, -27518=>14378, -27519=>14379, -27520=>14380, -27525=>14381, -27528=>14382, -27532=>14383, -27534=>14384, -27535=>14385, -27536=>14386, -27537=>14387, -27540=>14388, -27541=>14389, -27543=>14390, -27545=>14391, -27548=>14392, -27549=>14393, -27551=>14394, -27552=>14395, -27554=>14396, -27555=>14397, -27557=>14398, -27558=>14399, -27559=>14400, -27560=>14401, -27561=>14402, -27564=>14403, -27565=>14404, -27568=>14405, -27569=>14406, -27574=>14407, -27576=>14408, -27577=>14409, -27580=>14410, -27581=>14411, -27582=>14412, -27584=>14413, -27587=>14414, -27588=>14415, -27591=>14416, -27592=>14417, -27593=>14418, -27594=>14419, -27596=>14420, -27598=>14421, -27600=>14422, -27601=>14423, -27608=>14424, -27610=>14425, -27612=>14426, -27613=>14427, -27614=>14428, -27615=>14429, -27616=>14430, -27618=>14431, -27619=>14432, -27620=>14433, -27621=>14434, -27622=>14435, -27623=>14436, -27624=>14437, -27625=>14438, -27628=>14439, -27629=>14440, -27630=>14441, -27632=>14442, -27633=>14443, -27634=>14444, -27636=>14445, -27638=>14446, -27639=>14447, -27640=>14448, -27642=>14449, -27643=>14450, -27644=>14451, -27646=>14452, -27648=>14453, -27649=>14454, -27650=>14455, -27651=>14456, -27652=>14457, -27657=>14458, -27658=>14459, -27659=>14460, -27662=>14461, -27666=>14462, -27671=>14463, -27676=>14464, -27677=>14465, -27678=>14466, -27680=>14467, -27685=>14468, -27693=>14469, -27697=>14470, -27699=>14471, -27702=>14472, -27703=>14473, -27705=>14474, -27706=>14475, -27707=>14476, -27708=>14477, -27710=>14478, -27711=>14479, -27715=>14480, -27716=>14481, -27717=>14482, -27720=>14483, -27723=>14484, -27724=>14485, -27725=>14486, -27726=>14487, -27727=>14488, -27729=>14489, -27730=>14490, -27731=>14491, -27734=>14492, -27736=>14493, -27737=>14494, -27738=>14495, -27746=>14496, -27747=>14497, -27749=>14498, -27750=>14499, -27751=>14500, -27755=>14501, -27756=>14502, -27757=>14503, -27758=>14504, -27759=>14505, -27761=>14506, -27763=>14507, -27765=>14508, -27767=>14509, -27768=>14510, -27770=>14511, -27771=>14512, -27772=>14513, -27775=>14514, -27776=>14515, -27780=>14516, -27783=>14517, -27786=>14518, -27787=>14519, -27789=>14520, -27790=>14521, -27793=>14522, -27794=>14523, -27797=>14524, -27798=>14525, -27799=>14526, -27800=>14527, -27802=>14528, -27804=>14529, -27805=>14530, -27806=>14531, -27808=>14532, -27810=>14533, -27816=>14534, -27820=>14535, -27823=>14536, -27824=>14537, -27828=>14538, -27829=>14539, -27830=>14540, -27831=>14541, -27834=>14542, -27840=>14543, -27841=>14544, -27842=>14545, -27843=>14546, -27846=>14547, -27847=>14548, -27848=>14549, -27851=>14550, -27853=>14551, -27854=>14552, -27855=>14553, -27857=>14554, -27858=>14555, -27864=>14556, -27865=>14557, -27866=>14558, -27868=>14559, -27869=>14560, -27871=>14561, -27876=>14562, -27878=>14563, -27879=>14564, -27881=>14565, -27884=>14566, -27885=>14567, -27890=>14568, -27892=>14569, -27897=>14570, -27903=>14571, -27904=>14572, -27906=>14573, -27907=>14574, -27909=>14575, -27910=>14576, -27912=>14577, -27913=>14578, -27914=>14579, -27917=>14580, -27919=>14581, -27920=>14582, -27921=>14583, -27923=>14584, -27924=>14585, -27925=>14586, -27926=>14587, -27928=>14588, -27932=>14589, -27933=>14590, -27935=>14591, -27936=>14592, -27937=>14593, -27938=>14594, -27939=>14595, -27940=>14596, -27942=>14597, -27944=>14598, -27945=>14599, -27948=>14600, -27949=>14601, -27951=>14602, -27952=>14603, -27956=>14604, -27958=>14605, -27959=>14606, -27960=>14607, -27962=>14608, -27967=>14609, -27968=>14610, -27970=>14611, -27972=>14612, -27977=>14613, -27980=>14614, -27984=>14615, -27989=>14616, -27990=>14617, -27991=>14618, -27992=>14619, -27995=>14620, -27997=>14621, -27999=>14622, -28001=>14623, -28002=>14624, -28004=>14625, -28005=>14626, -28007=>14627, -28008=>14628, -28011=>14629, -28012=>14630, -28013=>14631, -28016=>14632, -28017=>14633, -28018=>14634, -28019=>14635, -28021=>14636, -28022=>14637, -28026=>14638, -28027=>14639, -28029=>14640, -28030=>14641, -28031=>14642, -28032=>14643, -28033=>14644, -28035=>14645, -28036=>14646, -28038=>14647, -28042=>14648, -28043=>14649, -28045=>14650, -28047=>14651, -28048=>14652, -28050=>14653, -28054=>14654, -28055=>14655, -28056=>14656, -28057=>14657, -28058=>14658, -28060=>14659, -28066=>14660, -28069=>14661, -28076=>14662, -28077=>14663, -28080=>14664, -28081=>14665, -28083=>14666, -28084=>14667, -28086=>14668, -28087=>14669, -28089=>14670, -28090=>14671, -28091=>14672, -28092=>14673, -28093=>14674, -28094=>14675, -28097=>14676, -28098=>14677, -28099=>14678, -28104=>14679, -28105=>14680, -28106=>14681, -28109=>14682, -28110=>14683, -28111=>14684, -28112=>14685, -28114=>14686, -28115=>14687, -28116=>14688, -28117=>14689, -28119=>14690, -28122=>14691, -28123=>14692, -28124=>14693, -28127=>14694, -28130=>14695, -28131=>14696, -28133=>14697, -28135=>14698, -28136=>14699, -28137=>14700, -28141=>14701, -28143=>14702, -28144=>14703, -28146=>14704, -28148=>14705, -28152=>14706, -28157=>14707, -28158=>14708, -28159=>14709, -28160=>14710, -28161=>14711, -28162=>14712, -28163=>14713, -28164=>14714, -28166=>14715, -28167=>14716, -28168=>14717, -28169=>14718, -28171=>14719, -28175=>14720, -28178=>14721, -28179=>14722, -28181=>14723, -28184=>14724, -28185=>14725, -28187=>14726, -28188=>14727, -28190=>14728, -28191=>14729, -28194=>14730, -28199=>14731, -28200=>14732, -28202=>14733, -28206=>14734, -28208=>14735, -28209=>14736, -28211=>14737, -28213=>14738, -28214=>14739, -28215=>14740, -28217=>14741, -28219=>14742, -28220=>14743, -28221=>14744, -28223=>14745, -28224=>14746, -28225=>14747, -28226=>14748, -28229=>14749, -28230=>14750, -28231=>14751, -28232=>14752, -28233=>14753, -28234=>14754, -28235=>14755, -28236=>14756, -28239=>14757, -28240=>14758, -28241=>14759, -28242=>14760, -28245=>14761, -28247=>14762, -28249=>14763, -28250=>14764, -28252=>14765, -28253=>14766, -28256=>14767, -28257=>14768, -28258=>14769, -28259=>14770, -28260=>14771, -28261=>14772, -28262=>14773, -28263=>14774, -28264=>14775, -28265=>14776, -28266=>14777, -28268=>14778, -28269=>14779, -28272=>14780, -28273=>14781, -28274=>14782, -28275=>14783, -28276=>14784, -28277=>14785, -28278=>14786, -28279=>14787, -28280=>14788, -28281=>14789, -28282=>14790, -28283=>14791, -28284=>14792, -28285=>14793, -28288=>14794, -28289=>14795, -28290=>14796, -28292=>14797, -28295=>14798, -28296=>14799, -28298=>14800, -28299=>14801, -28300=>14802, -28301=>14803, -28302=>14804, -28305=>14805, -28306=>14806, -28307=>14807, -28308=>14808, -28309=>14809, -28311=>14810, -28313=>14811, -28314=>14812, -28315=>14813, -28318=>14814, -28320=>14815, -28321=>14816, -28323=>14817, -28324=>14818, -28326=>14819, -28328=>14820, -28329=>14821, -28331=>14822, -28332=>14823, -28333=>14824, -28334=>14825, -28336=>14826, -28339=>14827, -28341=>14828, -28344=>14829, -28345=>14830, -28348=>14831, -28350=>14832, -28351=>14833, -28352=>14834, -28355=>14835, -28358=>14836, -28360=>14837, -28361=>14838, -28362=>14839, -28365=>14840, -28368=>14841, -28370=>14842, -28374=>14843, -28376=>14844, -28377=>14845, -28379=>14846, -28380=>14847, -28381=>14848, -28387=>14849, -28391=>14850, -28394=>14851, -28395=>14852, -28397=>14853, -28398=>14854, -28400=>14855, -28401=>14856, -28403=>14857, -28405=>14858, -28406=>14859, -28410=>14860, -28411=>14861, -28412=>14862, -28413=>14863, -28414=>14864, -28416=>14865, -28419=>14866, -28420=>14867, -28421=>14868, -28423=>14869, -28424=>14870, -28426=>14871, -28427=>14872, -28428=>14873, -28429=>14874, -28430=>14875, -28432=>14876, -28433=>14877, -28434=>14878, -28438=>14879, -28439=>14880, -28440=>14881, -28441=>14882, -28443=>14883, -28444=>14884, -28445=>14885, -28446=>14886, -28447=>14887, -28449=>14888, -28453=>14889, -28454=>14890, -28455=>14891, -28456=>14892, -28462=>14893, -28464=>14894, -28468=>14895, -28469=>14896, -28471=>14897, -28473=>14898, -28474=>14899, -28475=>14900, -28476=>14901, -28477=>14902, -28480=>14903, -28482=>14904, -28483=>14905, -28484=>14906, -28485=>14907, -28488=>14908, -28489=>14909, -28490=>14910, -28492=>14911, -28494=>14912, -28495=>14913, -28496=>14914, -28498=>14915, -28499=>14916, -28501=>14917, -28502=>14918, -28503=>14919, -28506=>14920, -28507=>14921, -28509=>14922, -28511=>14923, -28512=>14924, -28513=>14925, -28515=>14926, -28517=>14927, -28519=>14928, -28520=>14929, -28521=>14930, -28522=>14931, -28523=>14932, -28524=>14933, -28529=>14934, -28531=>14935, -28533=>14936, -28534=>14937, -28537=>14938, -28539=>14939, -28541=>14940, -28542=>14941, -28545=>14942, -28546=>14943, -28547=>14944, -28549=>14945, -28554=>14946, -28555=>14947, -28559=>14948, -28560=>14949, -28561=>14950, -28562=>14951, -28563=>14952, -28564=>14953, -28565=>14954, -28566=>14955, -28568=>14956, -28569=>14957, -28570=>14958, -28571=>14959, -28573=>14960, -28574=>14961, -28575=>14962, -28578=>14963, -28579=>14964, -28581=>14965, -28582=>14966, -28584=>14967, -28586=>14968, -28587=>14969, -28588=>14970, -28589=>14971, -28591=>14972, -28592=>14973, -28594=>14974, -28596=>14975, -28597=>14976, -28599=>14977, -28600=>14978, -28602=>14979, -28603=>14980, -28604=>14981, -28605=>14982, -28606=>14983, -28607=>14984, -28612=>14985, -28613=>14986, -28614=>14987, -28615=>14988, -28616=>14989, -28618=>14990, -28619=>14991, -28620=>14992, -28621=>14993, -28622=>14994, -28623=>14995, -28624=>14996, -28627=>14997, -28628=>14998, -28630=>14999, -28631=>15000, -28633=>15001, -28634=>15002, -28636=>15003, -28637=>15004, -28642=>15005, -28643=>15006, -28645=>15007, -28646=>15008, -28647=>15009, -28648=>15010, -28649=>15011, -28650=>15012, -28652=>15013, -28653=>15014, -28658=>15015, -28659=>15016, -28660=>15017, -28661=>15018, -28662=>15019, -28663=>15020, -28664=>15021, -28665=>15022, -28667=>15023, -28669=>15024, -28671=>15025, -28672=>15026, -28673=>15027, -28674=>15028, -28675=>15029, -28676=>15030, -28679=>15031, -28680=>15032, -28682=>15033, -28684=>15034, -28685=>15035, -28686=>15036, -28688=>15037, -28690=>15038, -28691=>15039, -28692=>15040, -28694=>15041, -28695=>15042, -28697=>15043, -28700=>15044, -28702=>15045, -28705=>15046, -28706=>15047, -28708=>15048, -28709=>15049, -28710=>15050, -28713=>15051, -28714=>15052, -28715=>15053, -28716=>15054, -28717=>15055, -28718=>15056, -28719=>15057, -28721=>15058, -28723=>15059, -28724=>15060, -28726=>15061, -28727=>15062, -28728=>15063, -28730=>15064, -28731=>15065, -28732=>15066, -28733=>15067, -28735=>15068, -28736=>15069, -28737=>15070, -28738=>15071, -28741=>15072, -28742=>15073, -28743=>15074, -28744=>15075, -28745=>15076, -28746=>15077, -28747=>15078, -28749=>15079, -28750=>15080, -28752=>15081, -28754=>15082, -28755=>15083, -28756=>15084, -28758=>15085, -28759=>15086, -28761=>15087, -28762=>15088, -28763=>15089, -28764=>15090, -28767=>15091, -28768=>15092, -28769=>15093, -28770=>15094, -28773=>15095, -28774=>15096, -28776=>15097, -28777=>15098, -28778=>15099, -28782=>15100, -28785=>15101, -28786=>15102, -28787=>15103, -28788=>15104, -28791=>15105, -28793=>15106, -28794=>15107, -28795=>15108, -28797=>15109, -28801=>15110, -28802=>15111, -28803=>15112, -28804=>15113, -28806=>15114, -28807=>15115, -28808=>15116, -28811=>15117, -28812=>15118, -28813=>15119, -28815=>15120, -28816=>15121, -28817=>15122, -28819=>15123, -28823=>15124, -28824=>15125, -28826=>15126, -28827=>15127, -28830=>15128, -28831=>15129, -28832=>15130, -28833=>15131, -28834=>15132, -28835=>15133, -28836=>15134, -28837=>15135, -28838=>15136, -28839=>15137, -28840=>15138, -28841=>15139, -28842=>15140, -28848=>15141, -28850=>15142, -28852=>15143, -28853=>15144, -28854=>15145, -28858=>15146, -28862=>15147, -28863=>15148, -28868=>15149, -28869=>15150, -28870=>15151, -28871=>15152, -28873=>15153, -28875=>15154, -28876=>15155, -28877=>15156, -28878=>15157, -28880=>15158, -28881=>15159, -28882=>15160, -28883=>15161, -28884=>15162, -28885=>15163, -28886=>15164, -28887=>15165, -28890=>15166, -28892=>15167, -28893=>15168, -28894=>15169, -28896=>15170, -28897=>15171, -28898=>15172, -28899=>15173, -28901=>15174, -28906=>15175, -28910=>15176, -28912=>15177, -28913=>15178, -28914=>15179, -28915=>15180, -28917=>15181, -28918=>15182, -28920=>15183, -28922=>15184, -28923=>15185, -28924=>15186, -28926=>15187, -28927=>15188, -28928=>15189, -28929=>15190, -28930=>15191, -28931=>15192, -28932=>15193, -28933=>15194, -28934=>15195, -28935=>15196, -28936=>15197, -28939=>15198, -28940=>15199, -28941=>15200, -28942=>15201, -28943=>15202, -28945=>15203, -28946=>15204, -28948=>15205, -28951=>15206, -28955=>15207, -28956=>15208, -28957=>15209, -28958=>15210, -28959=>15211, -28960=>15212, -28962=>15213, -28963=>15214, -28964=>15215, -28965=>15216, -28967=>15217, -28968=>15218, -28969=>15219, -28970=>15220, -28971=>15221, -28972=>15222, -28973=>15223, -28974=>15224, -28978=>15225, -28979=>15226, -28980=>15227, -28981=>15228, -28983=>15229, -28984=>15230, -28985=>15231, -28986=>15232, -28987=>15233, -28988=>15234, -28989=>15235, -28990=>15236, -28991=>15237, -28992=>15238, -28993=>15239, -28994=>15240, -28995=>15241, -28996=>15242, -28998=>15243, -28999=>15244, -29000=>15245, -29003=>15246, -29005=>15247, -29007=>15248, -29008=>15249, -29009=>15250, -29011=>15251, -29012=>15252, -29013=>15253, -29014=>15254, -29015=>15255, -29016=>15256, -29017=>15257, -29018=>15258, -29019=>15259, -29021=>15260, -29023=>15261, -29024=>15262, -29025=>15263, -29027=>15264, -29029=>15265, -29034=>15266, -29035=>15267, -29037=>15268, -29039=>15269, -29040=>15270, -29041=>15271, -29044=>15272, -29045=>15273, -29046=>15274, -29047=>15275, -29049=>15276, -29051=>15277, -29052=>15278, -29054=>15279, -29055=>15280, -29056=>15281, -29057=>15282, -29058=>15283, -29059=>15284, -29061=>15285, -29062=>15286, -29063=>15287, -29064=>15288, -29065=>15289, -29067=>15290, -29068=>15291, -29069=>15292, -29070=>15293, -29072=>15294, -29073=>15295, -29075=>15296, -29077=>15297, -29078=>15298, -29082=>15299, -29083=>15300, -29084=>15301, -29085=>15302, -29086=>15303, -29089=>15304, -29090=>15305, -29091=>15306, -29092=>15307, -29093=>15308, -29094=>15309, -29095=>15310, -29097=>15311, -29098=>15312, -29099=>15313, -29101=>15314, -29102=>15315, -29103=>15316, -29104=>15317, -29106=>15318, -29108=>15319, -29110=>15320, -29111=>15321, -29112=>15322, -29114=>15323, -29115=>15324, -29116=>15325, -29117=>15326, -29119=>15327, -29120=>15328, -29122=>15329, -29124=>15330, -29125=>15331, -29126=>15332, -29127=>15333, -29129=>15334, -29130=>15335, -29131=>15336, -29132=>15337, -29133=>15338, -29135=>15339, -29136=>15340, -29137=>15341, -29139=>15342, -29142=>15343, -29143=>15344, -29144=>15345, -29146=>15346, -29147=>15347, -29149=>15348, -29150=>15349, -29153=>15350, -29154=>15351, -29155=>15352, -29156=>15353, -29160=>15354, -29161=>15355, -29162=>15356, -29163=>15357, -29164=>15358, -29167=>15359, -29168=>15360, -29169=>15361, -29170=>15362, -29171=>15363, -29173=>15364, -29174=>15365, -29175=>15366, -29176=>15367, -29178=>15368, -29179=>15369, -29181=>15370, -29183=>15371, -29184=>15372, -29185=>15373, -29186=>15374, -29187=>15375, -29188=>15376, -29189=>15377, -29191=>15378, -29192=>15379, -29193=>15380, -29194=>15381, -29195=>15382, -29196=>15383, -29198=>15384, -29199=>15385, -29201=>15386, -29202=>15387, -29203=>15388, -29204=>15389, -29205=>15390, -29206=>15391, -29207=>15392, -29208=>15393, -29209=>15394, -29210=>15395, -29212=>15396, -29214=>15397, -29215=>15398, -29216=>15399, -29217=>15400, -29218=>15401, -29219=>15402, -29220=>15403, -29221=>15404, -29222=>15405, -29223=>15406, -29225=>15407, -29227=>15408, -29229=>15409, -29230=>15410, -29231=>15411, -29235=>15412, -29236=>15413, -29244=>15414, -29248=>15415, -29249=>15416, -29250=>15417, -29251=>15418, -29252=>15419, -29253=>15420, -29254=>15421, -29257=>15422, -29258=>15423, -29259=>15424, -29262=>15425, -29263=>15426, -29264=>15427, -29265=>15428, -29267=>15429, -29268=>15430, -29269=>15431, -29271=>15432, -29274=>15433, -29276=>15434, -29278=>15435, -29280=>15436, -29283=>15437, -29284=>15438, -29285=>15439, -29288=>15440, -29290=>15441, -29291=>15442, -29292=>15443, -29293=>15444, -29296=>15445, -29297=>15446, -29299=>15447, -29300=>15448, -29302=>15449, -29303=>15450, -29304=>15451, -29307=>15452, -29308=>15453, -29314=>15454, -29315=>15455, -29317=>15456, -29318=>15457, -29319=>15458, -29320=>15459, -29321=>15460, -29324=>15461, -29326=>15462, -29328=>15463, -29329=>15464, -29331=>15465, -29332=>15466, -29333=>15467, -29335=>15468, -29336=>15469, -29337=>15470, -29338=>15471, -29339=>15472, -29340=>15473, -29341=>15474, -29342=>15475, -29344=>15476, -29345=>15477, -29347=>15478, -29348=>15479, -29349=>15480, -29350=>15481, -29352=>15482, -29353=>15483, -29354=>15484, -29355=>15485, -29358=>15486, -29361=>15487, -29362=>15488, -29363=>15489, -29365=>15490, -29370=>15491, -29371=>15492, -29372=>15493, -29373=>15494, -29374=>15495, -29375=>15496, -29381=>15497, -29382=>15498, -29383=>15499, -29385=>15500, -29386=>15501, -29387=>15502, -29388=>15503, -29391=>15504, -29393=>15505, -29395=>15506, -29396=>15507, -29397=>15508, -29398=>15509, -29400=>15510, -29402=>15511, -29403=>15512, -29404=>15513, -29405=>15514, -29407=>15515, -29410=>15516, -29411=>15517, -29412=>15518, -29413=>15519, -29414=>15520, -29415=>15521, -29418=>15522, -29419=>15523, -29429=>15524, -29430=>15525, -29438=>15526, -29439=>15527, -29440=>15528, -29442=>15529, -29444=>15530, -29445=>15531, -29446=>15532, -29447=>15533, -29448=>15534, -29449=>15535, -29451=>15536, -29452=>15537, -29453=>15538, -29455=>15539, -29456=>15540, -29457=>15541, -29458=>15542, -29460=>15543, -29464=>15544, -29465=>15545, -29466=>15546, -29471=>15547, -29472=>15548, -29475=>15549, -29476=>15550, -29478=>15551, -29479=>15552, -29480=>15553, -29485=>15554, -29487=>15555, -29488=>15556, -29490=>15557, -29491=>15558, -29493=>15559, -29498=>15560, -29500=>15561, -29501=>15562, -29504=>15563, -29506=>15564, -29507=>15565, -29510=>15566, -29511=>15567, -29512=>15568, -29513=>15569, -29514=>15570, -29515=>15571, -29516=>15572, -29518=>15573, -29519=>15574, -29521=>15575, -29523=>15576, -29524=>15577, -29525=>15578, -29526=>15579, -29528=>15580, -29529=>15581, -29530=>15582, -29531=>15583, -29532=>15584, -29533=>15585, -29534=>15586, -29535=>15587, -29537=>15588, -29538=>15589, -29539=>15590, -29540=>15591, -29541=>15592, -29542=>15593, -29543=>15594, -29545=>15595, -29550=>15596, -29553=>15597, -29555=>15598, -29556=>15599, -29558=>15600, -29561=>15601, -29565=>15602, -29567=>15603, -29569=>15604, -29570=>15605, -29571=>15606, -29573=>15607, -29574=>15608, -29576=>15609, -29578=>15610, -29580=>15611, -29581=>15612, -29583=>15613, -29584=>15614, -29586=>15615, -29587=>15616, -29588=>15617, -29589=>15618, -29591=>15619, -29592=>15620, -29593=>15621, -29594=>15622, -29596=>15623, -29597=>15624, -29598=>15625, -29600=>15626, -29601=>15627, -29603=>15628, -29604=>15629, -29605=>15630, -29606=>15631, -29607=>15632, -29608=>15633, -29610=>15634, -29612=>15635, -29613=>15636, -29617=>15637, -29620=>15638, -29621=>15639, -29622=>15640, -29624=>15641, -29625=>15642, -29628=>15643, -29629=>15644, -29630=>15645, -29631=>15646, -29633=>15647, -29635=>15648, -29636=>15649, -29637=>15650, -29638=>15651, -29639=>15652, -29643=>15653, -29644=>15654, -29646=>15655, -29650=>15656, -29651=>15657, -29652=>15658, -29653=>15659, -29654=>15660, -29655=>15661, -29656=>15662, -29658=>15663, -29659=>15664, -29660=>15665, -29661=>15666, -29663=>15667, -29665=>15668, -29666=>15669, -29667=>15670, -29668=>15671, -29670=>15672, -29672=>15673, -29674=>15674, -29675=>15675, -29676=>15676, -29678=>15677, -29679=>15678, -29680=>15679, -29681=>15680, -29683=>15681, -29684=>15682, -29685=>15683, -29686=>15684, -29687=>15685, -29688=>15686, -29689=>15687, -29690=>15688, -29691=>15689, -29692=>15690, -29693=>15691, -29695=>15692, -29696=>15693, -29697=>15694, -29698=>15695, -29700=>15696, -29703=>15697, -29704=>15698, -29707=>15699, -29708=>15700, -29709=>15701, -29710=>15702, -29713=>15703, -29714=>15704, -29715=>15705, -29716=>15706, -29717=>15707, -29718=>15708, -29719=>15709, -29720=>15710, -29721=>15711, -29724=>15712, -29725=>15713, -29726=>15714, -29727=>15715, -29728=>15716, -29729=>15717, -29731=>15718, -29732=>15719, -29735=>15720, -29737=>15721, -29739=>15722, -29741=>15723, -29743=>15724, -29745=>15725, -29746=>15726, -29751=>15727, -29752=>15728, -29753=>15729, -29754=>15730, -29755=>15731, -29757=>15732, -29758=>15733, -29760=>15734, -29762=>15735, -29763=>15736, -29764=>15737, -29765=>15738, -29766=>15739, -29767=>15740, -29768=>15741, -29769=>15742, -29770=>15743, -29772=>15744, -29773=>15745, -29774=>15746, -29775=>15747, -29776=>15748, -29777=>15749, -29778=>15750, -29779=>15751, -29780=>15752, -29782=>15753, -29784=>15754, -29789=>15755, -29792=>15756, -29793=>15757, -29794=>15758, -29796=>15759, -29797=>15760, -29798=>15761, -29799=>15762, -29800=>15763, -29803=>15764, -29804=>15765, -29806=>15766, -29807=>15767, -29809=>15768, -29810=>15769, -29811=>15770, -29812=>15771, -29813=>15772, -29816=>15773, -29817=>15774, -29818=>15775, -29819=>15776, -29820=>15777, -29821=>15778, -29823=>15779, -29826=>15780, -29828=>15781, -29829=>15782, -29830=>15783, -29832=>15784, -29834=>15785, -29836=>15786, -29837=>15787, -29839=>15788, -29841=>15789, -29842=>15790, -29843=>15791, -29844=>15792, -29845=>15793, -29846=>15794, -29847=>15795, -29848=>15796, -29849=>15797, -29850=>15798, -29851=>15799, -29853=>15800, -29855=>15801, -29856=>15802, -29857=>15803, -29858=>15804, -29860=>15805, -29861=>15806, -29866=>15807, -29867=>15808, -29868=>15809, -29869=>15810, -29870=>15811, -29871=>15812, -29873=>15813, -29874=>15814, -29875=>15815, -29876=>15816, -29877=>15817, -29878=>15818, -29879=>15819, -29880=>15820, -29881=>15821, -29883=>15822, -29884=>15823, -29886=>15824, -29887=>15825, -29888=>15826, -29889=>15827, -29890=>15828, -29891=>15829, -29892=>15830, -29893=>15831, -29894=>15832, -29895=>15833, -29896=>15834, -29897=>15835, -29899=>15836, -29900=>15837, -29901=>15838, -29902=>15839, -29904=>15840, -29905=>15841, -29907=>15842, -29909=>15843, -29910=>15844, -29911=>15845, -29912=>15846, -29913=>15847, -29915=>15848, -29917=>15849, -29919=>15850, -29921=>15851, -29925=>15852, -29927=>15853, -29928=>15854, -29929=>15855, -29930=>15856, -29931=>15857, -29932=>15858, -29933=>15859, -29936=>15860, -29937=>15861, -29938=>15862, -29939=>15863, -29941=>15864, -29944=>15865, -29945=>15866, -29946=>15867, -29947=>15868, -29948=>15869, -29949=>15870, -29950=>15871, -29952=>15872, -29953=>15873, -29954=>15874, -29955=>15875, -29957=>15876, -29958=>15877, -29959=>15878, -29960=>15879, -29961=>15880, -29962=>15881, -29963=>15882, -29966=>15883, -29968=>15884, -29970=>15885, -29972=>15886, -29973=>15887, -29974=>15888, -29975=>15889, -29979=>15890, -29981=>15891, -29982=>15892, -29984=>15893, -29985=>15894, -29986=>15895, -29988=>15896, -29990=>15897, -29991=>15898, -29994=>15899, -29998=>15900, -30004=>15901, -30006=>15902, -30009=>15903, -30012=>15904, -30013=>15905, -30015=>15906, -30017=>15907, -30018=>15908, -30019=>15909, -30020=>15910, -30022=>15911, -30023=>15912, -30025=>15913, -30026=>15914, -30029=>15915, -30032=>15916, -30033=>15917, -30034=>15918, -30035=>15919, -30037=>15920, -30038=>15921, -30039=>15922, -30040=>15923, -30046=>15924, -30047=>15925, -30048=>15926, -30049=>15927, -30051=>15928, -30052=>15929, -30055=>15930, -30056=>15931, -30057=>15932, -30060=>15933, -30061=>15934, -30062=>15935, -30063=>15936, -30064=>15937, -30065=>15938, -30067=>15939, -30069=>15940, -30071=>15941, -30074=>15942, -30075=>15943, -30076=>15944, -30077=>15945, -30078=>15946, -30080=>15947, -30081=>15948, -30082=>15949, -30084=>15950, -30085=>15951, -30088=>15952, -30089=>15953, -30090=>15954, -30092=>15955, -30093=>15956, -30094=>15957, -30096=>15958, -30099=>15959, -30101=>15960, -30104=>15961, -30107=>15962, -30108=>15963, -30110=>15964, -30114=>15965, -30118=>15966, -30119=>15967, -30120=>15968, -30121=>15969, -30122=>15970, -30125=>15971, -30134=>15972, -30135=>15973, -30138=>15974, -30139=>15975, -30143=>15976, -30144=>15977, -30145=>15978, -30150=>15979, -30155=>15980, -30156=>15981, -30158=>15982, -30159=>15983, -30160=>15984, -30161=>15985, -30163=>15986, -30167=>15987, -30170=>15988, -30172=>15989, -30173=>15990, -30175=>15991, -30176=>15992, -30177=>15993, -30181=>15994, -30185=>15995, -30188=>15996, -30189=>15997, -30190=>15998, -30191=>15999, -30194=>16000, -30195=>16001, -30197=>16002, -30198=>16003, -30199=>16004, -30200=>16005, -30202=>16006, -30203=>16007, -30205=>16008, -30206=>16009, -30212=>16010, -30214=>16011, -30215=>16012, -30216=>16013, -30217=>16014, -30222=>16015, -30223=>16016, -30225=>16017, -30226=>16018, -30227=>16019, -30228=>16020, -30230=>16021, -30234=>16022, -30236=>16023, -30237=>16024, -30243=>16025, -30248=>16026, -30252=>16027, -30254=>16028, -30255=>16029, -30257=>16030, -30258=>16031, -30262=>16032, -30263=>16033, -30265=>16034, -30266=>16035, -30269=>16036, -30273=>16037, -30276=>16038, -30277=>16039, -30280=>16040, -30282=>16041, -30283=>16042, -30286=>16043, -30287=>16044, -30288=>16045, -30289=>16046, -30290=>16047, -30291=>16048, -30293=>16049, -30295=>16050, -30297=>16051, -30298=>16052, -30299=>16053, -30301=>16054, -30304=>16055, -30305=>16056, -30310=>16057, -30312=>16058, -30314=>16059, -30323=>16060, -30324=>16061, -30325=>16062, -12136=>16063, -30326=>16063, -30327=>16064, -30329=>16065, -30330=>16066, -30335=>16067, -30336=>16068, -30337=>16069, -30339=>16070, -30341=>16071, -30345=>16072, -30346=>16073, -30348=>16074, -30349=>16075, -30351=>16076, -30352=>16077, -30354=>16078, -30356=>16079, -30357=>16080, -30359=>16081, -30360=>16082, -30363=>16083, -30364=>16084, -30365=>16085, -30366=>16086, -30367=>16087, -30368=>16088, -30369=>16089, -30370=>16090, -30371=>16091, -30373=>16092, -30374=>16093, -30375=>16094, -30376=>16095, -30377=>16096, -30378=>16097, -30379=>16098, -30380=>16099, -30381=>16100, -30383=>16101, -30384=>16102, -30387=>16103, -30389=>16104, -30390=>16105, -30391=>16106, -30393=>16107, -30395=>16108, -30396=>16109, -30397=>16110, -30398=>16111, -30400=>16112, -30401=>16113, -30403=>16114, -30404=>16115, -30407=>16116, -30409=>16117, -30411=>16118, -30412=>16119, -30419=>16120, -30421=>16121, -30425=>16122, -30426=>16123, -30428=>16124, -30429=>16125, -30432=>16126, -30434=>16127, -30438=>16128, -30440=>16129, -30441=>16130, -30442=>16131, -30443=>16132, -30444=>16133, -30445=>16134, -30448=>16135, -30451=>16136, -30453=>16137, -30454=>16138, -30455=>16139, -30458=>16140, -30459=>16141, -30461=>16142, -30463=>16143, -30464=>16144, -30466=>16145, -30467=>16146, -30469=>16147, -30470=>16148, -30474=>16149, -30476=>16150, -30478=>16151, -30479=>16152, -30480=>16153, -30481=>16154, -30482=>16155, -30483=>16156, -30484=>16157, -30485=>16158, -30486=>16159, -30487=>16160, -30488=>16161, -30491=>16162, -30492=>16163, -30493=>16164, -30494=>16165, -30497=>16166, -30499=>16167, -30500=>16168, -30501=>16169, -30503=>16170, -30506=>16171, -30507=>16172, -30508=>16173, -30510=>16174, -30512=>16175, -30513=>16176, -30514=>16177, -30515=>16178, -30516=>16179, -30521=>16180, -30523=>16181, -30525=>16182, -30526=>16183, -30527=>16184, -30530=>16185, -30532=>16186, -30533=>16187, -30534=>16188, -30536=>16189, -30537=>16190, -30538=>16191, -30539=>16192, -30540=>16193, -30541=>16194, -30542=>16195, -30546=>16196, -30547=>16197, -30548=>16198, -30549=>16199, -30550=>16200, -30551=>16201, -30552=>16202, -30553=>16203, -30556=>16204, -30557=>16205, -30559=>16206, -30560=>16207, -30564=>16208, -30567=>16209, -30569=>16210, -30570=>16211, -30573=>16212, -30574=>16213, -30575=>16214, -30576=>16215, -30577=>16216, -30578=>16217, -30579=>16218, -30580=>16219, -30581=>16220, -30582=>16221, -30583=>16222, -30584=>16223, -30586=>16224, -30587=>16225, -30588=>16226, -30593=>16227, -30594=>16228, -30595=>16229, -30598=>16230, -30599=>16231, -30600=>16232, -30601=>16233, -30602=>16234, -30603=>16235, -30607=>16236, -30608=>16237, -30611=>16238, -30612=>16239, -30613=>16240, -30614=>16241, -30615=>16242, -30617=>16243, -30618=>16244, -30619=>16245, -30620=>16246, -30621=>16247, -30625=>16248, -30627=>16249, -30628=>16250, -30630=>16251, -30632=>16252, -30635=>16253, -30638=>16254, -30639=>16255, -30641=>16256, -30642=>16257, -30644=>16258, -30646=>16259, -30647=>16260, -30648=>16261, -30649=>16262, -30650=>16263, -30654=>16264, -30656=>16265, -30657=>16266, -30658=>16267, -30659=>16268, -30660=>16269, -30661=>16270, -30662=>16271, -30664=>16272, -30665=>16273, -30666=>16274, -30667=>16275, -30668=>16276, -30670=>16277, -30671=>16278, -30672=>16279, -30673=>16280, -30674=>16281, -30675=>16282, -30676=>16283, -30677=>16284, -30678=>16285, -30680=>16286, -30681=>16287, -30685=>16288, -30686=>16289, -30687=>16290, -30688=>16291, -30689=>16292, -30692=>16293, -30694=>16294, -30696=>16295, -30698=>16296, -30704=>16297, -30705=>16298, -30706=>16299, -30708=>16300, -30709=>16301, -30711=>16302, -30713=>16303, -30714=>16304, -30715=>16305, -30716=>16306, -30723=>16307, -30724=>16308, -30725=>16309, -30726=>16310, -30727=>16311, -30728=>16312, -30730=>16313, -30731=>16314, -30734=>16315, -30735=>16316, -30736=>16317, -30739=>16318, -30741=>16319, -30745=>16320, -30747=>16321, -30750=>16322, -30752=>16323, -30753=>16324, -30754=>16325, -30756=>16326, -30760=>16327, -30762=>16328, -30763=>16329, -30766=>16330, -30767=>16331, -30769=>16332, -30770=>16333, -30771=>16334, -30773=>16335, -30774=>16336, -30781=>16337, -30783=>16338, -30785=>16339, -30786=>16340, -30788=>16341, -30790=>16342, -30792=>16343, -30793=>16344, -30794=>16345, -30795=>16346, -30797=>16347, -30799=>16348, -30801=>16349, -30803=>16350, -30804=>16351, -30808=>16352, -30809=>16353, -30810=>16354, -30811=>16355, -30812=>16356, -30814=>16357, -30815=>16358, -30816=>16359, -30817=>16360, -30818=>16361, -30819=>16362, -30821=>16363, -30822=>16364, -30823=>16365, -30825=>16366, -30832=>16367, -30833=>16368, -30834=>16369, -30835=>16370, -30836=>16371, -30837=>16372, -30838=>16373, -30840=>16374, -30841=>16375, -30842=>16376, -30843=>16377, -30845=>16378, -30846=>16379, -30847=>16380, -30848=>16381, -30849=>16382, -30850=>16383, -30851=>16384, -30852=>16385, -30853=>16386, -30854=>16387, -30856=>16388, -30858=>16389, -30859=>16390, -30863=>16391, -30864=>16392, -30866=>16393, -30868=>16394, -30869=>16395, -30870=>16396, -30873=>16397, -30877=>16398, -30878=>16399, -30880=>16400, -30882=>16401, -30884=>16402, -30886=>16403, -30888=>16404, -30890=>16405, -30891=>16406, -30892=>16407, -30894=>16408, -30895=>16409, -30901=>16410, -30902=>16411, -30903=>16412, -30907=>16413, -30909=>16414, -30911=>16415, -30912=>16416, -30914=>16417, -30915=>16418, -30916=>16419, -30918=>16420, -30919=>16421, -30920=>16422, -30924=>16423, -30925=>16424, -30926=>16425, -30927=>16426, -30929=>16427, -30930=>16428, -30931=>16429, -30934=>16430, -30935=>16431, -30936=>16432, -30939=>16433, -30940=>16434, -30941=>16435, -30942=>16436, -30943=>16437, -30944=>16438, -30945=>16439, -30946=>16440, -30948=>16441, -30949=>16442, -30950=>16443, -30953=>16444, -30954=>16445, -30955=>16446, -30957=>16447, -30958=>16448, -30960=>16449, -30961=>16450, -30963=>16451, -30965=>16452, -30966=>16453, -30968=>16454, -30969=>16455, -30971=>16456, -30972=>16457, -30974=>16458, -30975=>16459, -30976=>16460, -30978=>16461, -30979=>16462, -30980=>16463, -30982=>16464, -30983=>16465, -30984=>16466, -30985=>16467, -30986=>16468, -30987=>16469, -30988=>16470, -30989=>16471, -30991=>16472, -30992=>16473, -30993=>16474, -30994=>16475, -30996=>16476, -30997=>16477, -30998=>16478, -30999=>16479, -31000=>16480, -31002=>16481, -31003=>16482, -31004=>16483, -31005=>16484, -31007=>16485, -31008=>16486, -31009=>16487, -31010=>16488, -31011=>16489, -31013=>16490, -31015=>16491, -31016=>16492, -31017=>16493, -31021=>16494, -31022=>16495, -31023=>16496, -31024=>16497, -31026=>16498, -31027=>16499, -31029=>16500, -31030=>16501, -31031=>16502, -31032=>16503, -31033=>16504, -31037=>16505, -31039=>16506, -31042=>16507, -31043=>16508, -31044=>16509, -31045=>16510, -31047=>16511, -31050=>16512, -31051=>16513, -31052=>16514, -31053=>16515, -31054=>16516, -31055=>16517, -31056=>16518, -31057=>16519, -31058=>16520, -31060=>16521, -31061=>16522, -31064=>16523, -31065=>16524, -31073=>16525, -31075=>16526, -31076=>16527, -31078=>16528, -31081=>16529, -31082=>16530, -31083=>16531, -31084=>16532, -31086=>16533, -31088=>16534, -31089=>16535, -31090=>16536, -31091=>16537, -31092=>16538, -31093=>16539, -31094=>16540, -31097=>16541, -31099=>16542, -31100=>16543, -31101=>16544, -31102=>16545, -31103=>16546, -31106=>16547, -31107=>16548, -31110=>16549, -31111=>16550, -31112=>16551, -31113=>16552, -31115=>16553, -31116=>16554, -31120=>16555, -31121=>16556, -31122=>16557, -31123=>16558, -31124=>16559, -31125=>16560, -31126=>16561, -31127=>16562, -31128=>16563, -31129=>16564, -31131=>16565, -31132=>16566, -31133=>16567, -31134=>16568, -31135=>16569, -31136=>16570, -31137=>16571, -31138=>16572, -31139=>16573, -31140=>16574, -31141=>16575, -31144=>16576, -31145=>16577, -31147=>16578, -31148=>16579, -31149=>16580, -31151=>16581, -31154=>16582, -31156=>16583, -31157=>16584, -31158=>16585, -31159=>16586, -12145=>16587, -31160=>16587, -31164=>16588, -31167=>16589, -31170=>16590, -31172=>16591, -31173=>16592, -31175=>16593, -31176=>16594, -31178=>16595, -63893=>16595, -31180=>16596, -31182=>16597, -31183=>16598, -31184=>16599, -31187=>16600, -31188=>16601, -31190=>16602, -31191=>16603, -31193=>16604, -31194=>16605, -31195=>16606, -31196=>16607, -31197=>16608, -31198=>16609, -31200=>16610, -31201=>16611, -31202=>16612, -31205=>16613, -31208=>16614, -31210=>16615, -31212=>16616, -31214=>16617, -31217=>16618, -31218=>16619, -31219=>16620, -31220=>16621, -31221=>16622, -31222=>16623, -31223=>16624, -31225=>16625, -31226=>16626, -31228=>16627, -31230=>16628, -31231=>16629, -31233=>16630, -31236=>16631, -31237=>16632, -31239=>16633, -31240=>16634, -31241=>16635, -31242=>16636, -31244=>16637, -31247=>16638, -31248=>16639, -31249=>16640, -31250=>16641, -31251=>16642, -31253=>16643, -31254=>16644, -31256=>16645, -31257=>16646, -31259=>16647, -31260=>16648, -31261=>16649, -31263=>16650, -31265=>16651, -31266=>16652, -31268=>16653, -31269=>16654, -31270=>16655, -31271=>16656, -31272=>16657, -31273=>16658, -31274=>16659, -31275=>16660, -31276=>16661, -31277=>16662, -31279=>16663, -31280=>16664, -31282=>16665, -31284=>16666, -31285=>16667, -31286=>16668, -31288=>16669, -31290=>16670, -31294=>16671, -31297=>16672, -31298=>16673, -31299=>16674, -31300=>16675, -31301=>16676, -31303=>16677, -31304=>16678, -31305=>16679, -31306=>16680, -31307=>16681, -31311=>16682, -31312=>16683, -31314=>16684, -31315=>16685, -31316=>16686, -31317=>16687, -31318=>16688, -31320=>16689, -31321=>16690, -31322=>16691, -31323=>16692, -31324=>16693, -31325=>16694, -31326=>16695, -31327=>16696, -31328=>16697, -31331=>16698, -31332=>16699, -31333=>16700, -31334=>16701, -31335=>16702, -31336=>16703, -31338=>16704, -31340=>16705, -31341=>16706, -31342=>16707, -31343=>16708, -31345=>16709, -31346=>16710, -31347=>16711, -31349=>16712, -31355=>16713, -31356=>16714, -31357=>16715, -31358=>16716, -31362=>16717, -31365=>16718, -31367=>16719, -31369=>16720, -31370=>16721, -31371=>16722, -31372=>16723, -31374=>16724, -31375=>16725, -31376=>16726, -31379=>16727, -31380=>16728, -31385=>16729, -31386=>16730, -31387=>16731, -31390=>16732, -31393=>16733, -31394=>16734, -31395=>16735, -31396=>16736, -31399=>16737, -31403=>16738, -31407=>16739, -31408=>16740, -31409=>16741, -31410=>16742, -31412=>16743, -31413=>16744, -31415=>16745, -31416=>16746, -31417=>16747, -31419=>16748, -31420=>16749, -31421=>16750, -31422=>16751, -31424=>16752, -31425=>16753, -31426=>16754, -31427=>16755, -31430=>16756, -31433=>16757, -31436=>16758, -31437=>16759, -31438=>16760, -31439=>16761, -31440=>16762, -31441=>16763, -31442=>16764, -31443=>16765, -31444=>16766, -31445=>16767, -31447=>16768, -31448=>16769, -31450=>16770, -31451=>16771, -31452=>16772, -31453=>16773, -31457=>16774, -31458=>16775, -31460=>16776, -31463=>16777, -31464=>16778, -31465=>16779, -31467=>16780, -31468=>16781, -31470=>16782, -31472=>16783, -31473=>16784, -31474=>16785, -31475=>16786, -31476=>16787, -31477=>16788, -31479=>16789, -31480=>16790, -31483=>16791, -31484=>16792, -31486=>16793, -31488=>16794, -31489=>16795, -31490=>16796, -31493=>16797, -31495=>16798, -31497=>16799, -31500=>16800, -31501=>16801, -31502=>16802, -31504=>16803, -31506=>16804, -31507=>16805, -31510=>16806, -31511=>16807, -31512=>16808, -31514=>16809, -31516=>16810, -31517=>16811, -31519=>16812, -31521=>16813, -31522=>16814, -31523=>16815, -31527=>16816, -31529=>16817, -31533=>16818, -31535=>16819, -31536=>16820, -31538=>16821, -31540=>16822, -31541=>16823, -31542=>16824, -31543=>16825, -31545=>16826, -31547=>16827, -31549=>16828, -31551=>16829, -31552=>16830, -31553=>16831, -31554=>16832, -31555=>16833, -31556=>16834, -31560=>16835, -31562=>16836, -31565=>16837, -31566=>16838, -31571=>16839, -31573=>16840, -31575=>16841, -31577=>16842, -31580=>16843, -31582=>16844, -31583=>16845, -31585=>16846, -31587=>16847, -31588=>16848, -31589=>16849, -31590=>16850, -31592=>16851, -31593=>16852, -31594=>16853, -31595=>16854, -31596=>16855, -31597=>16856, -31599=>16857, -31600=>16858, -31603=>16859, -31604=>16860, -31606=>16861, -31608=>16862, -31610=>16863, -31612=>16864, -31613=>16865, -31615=>16866, -31617=>16867, -31618=>16868, -31619=>16869, -31620=>16870, -31622=>16871, -31623=>16872, -31624=>16873, -31625=>16874, -31626=>16875, -31628=>16876, -31630=>16877, -31631=>16878, -31633=>16879, -31634=>16880, -31635=>16881, -31638=>16882, -31640=>16883, -31641=>16884, -31642=>16885, -31643=>16886, -31646=>16887, -31647=>16888, -31648=>16889, -31651=>16890, -31652=>16891, -31653=>16892, -31662=>16893, -31663=>16894, -31664=>16895, -31666=>16896, -31667=>16897, -31669=>16898, -31670=>16899, -31671=>16900, -31673=>16901, -31674=>16902, -31675=>16903, -31676=>16904, -31677=>16905, -31678=>16906, -31679=>16907, -31682=>16908, -31683=>16909, -31685=>16910, -31688=>16911, -31690=>16912, -31693=>16913, -31694=>16914, -31695=>16915, -31696=>16916, -31698=>16917, -31700=>16918, -31701=>16919, -31702=>16920, -31703=>16921, -31704=>16922, -31707=>16923, -31708=>16924, -31710=>16925, -31711=>16926, -31712=>16927, -31714=>16928, -31715=>16929, -31719=>16930, -31720=>16931, -31723=>16932, -31724=>16933, -31725=>16934, -31727=>16935, -31728=>16936, -31730=>16937, -31732=>16938, -31733=>16939, -31734=>16940, -31736=>16941, -31737=>16942, -31738=>16943, -31739=>16944, -31741=>16945, -31743=>16946, -31745=>16947, -31746=>16948, -31747=>16949, -31748=>16950, -31749=>16951, -31750=>16952, -31752=>16953, -31753=>16954, -31754=>16955, -31758=>16956, -31760=>16957, -31761=>16958, -31762=>16959, -31763=>16960, -31764=>16961, -31765=>16962, -31767=>16963, -31768=>16964, -31769=>16965, -31770=>16966, -31771=>16967, -31772=>16968, -31773=>16969, -31776=>16970, -31778=>16971, -31780=>16972, -31781=>16973, -31784=>16974, -31785=>16975, -31788=>16976, -31789=>16977, -31790=>16978, -31791=>16979, -31792=>16980, -31793=>16981, -31794=>16982, -31795=>16983, -31796=>16984, -31797=>16985, -31798=>16986, -31799=>16987, -31801=>16988, -31802=>16989, -31803=>16990, -31804=>16991, -31810=>16992, -31812=>16993, -31813=>16994, -31814=>16995, -31815=>16996, -31816=>16997, -31817=>16998, -31818=>16999, -31819=>17000, -31822=>17001, -31823=>17002, -31824=>17003, -31825=>17004, -31826=>17005, -31827=>17006, -31828=>17007, -31829=>17008, -31830=>17009, -31831=>17010, -31832=>17011, -31833=>17012, -31834=>17013, -31835=>17014, -31837=>17015, -31838=>17016, -31841=>17017, -31842=>17018, -31843=>17019, -31845=>17020, -31846=>17021, -31847=>17022, -31848=>17023, -31851=>17024, -31853=>17025, -31855=>17026, -31856=>17027, -31857=>17028, -31861=>17029, -31862=>17030, -31863=>17031, -31864=>17032, -31865=>17033, -31866=>17034, -31870=>17035, -31871=>17036, -31872=>17037, -31873=>17038, -31874=>17039, -31875=>17040, -31876=>17041, -31877=>17042, -31878=>17043, -31879=>17044, -31880=>17045, -31882=>17046, -31883=>17047, -31884=>17048, -31885=>17049, -31886=>17050, -31887=>17051, -31888=>17052, -31891=>17053, -31892=>17054, -31894=>17055, -31897=>17056, -31898=>17057, -31899=>17058, -31904=>17059, -31905=>17060, -31907=>17061, -31910=>17062, -31911=>17063, -31912=>17064, -31913=>17065, -31915=>17066, -31916=>17067, -31917=>17068, -31919=>17069, -31920=>17070, -31924=>17071, -31925=>17072, -31926=>17073, -31927=>17074, -31928=>17075, -31930=>17076, -31931=>17077, -31935=>17078, -31936=>17079, -31938=>17080, -31939=>17081, -31940=>17082, -31942=>17083, -31945=>17084, -31947=>17085, -31950=>17086, -31951=>17087, -31952=>17088, -31953=>17089, -31954=>17090, -31955=>17091, -31956=>17092, -31960=>17093, -31962=>17094, -31963=>17095, -31969=>17096, -31970=>17097, -31971=>17098, -31972=>17099, -31973=>17100, -31974=>17101, -31977=>17102, -31978=>17103, -31979=>17104, -31980=>17105, -31981=>17106, -31982=>17107, -31985=>17108, -31987=>17109, -31989=>17110, -31991=>17111, -31994=>17112, -31996=>17113, -31997=>17114, -31999=>17115, -32001=>17116, -32003=>17117, -32012=>17118, -32014=>17119, -32015=>17120, -32017=>17121, -32018=>17122, -32022=>17123, -32024=>17124, -32029=>17125, -32030=>17126, -32031=>17127, -32035=>17128, -32036=>17129, -32037=>17130, -32038=>17131, -32040=>17132, -32041=>17133, -32042=>17134, -32044=>17135, -32045=>17136, -32046=>17137, -32052=>17138, -32053=>17139, -32054=>17140, -32055=>17141, -32056=>17142, -32059=>17143, -32061=>17144, -32062=>17145, -32065=>17146, -32067=>17147, -32069=>17148, -32071=>17149, -32072=>17150, -32073=>17151, -32074=>17152, -32075=>17153, -32076=>17154, -32077=>17155, -32079=>17156, -32081=>17157, -32082=>17158, -32083=>17159, -32084=>17160, -32085=>17161, -32086=>17162, -32087=>17163, -32088=>17164, -32089=>17165, -32090=>17166, -32091=>17167, -32092=>17168, -32095=>17169, -32096=>17170, -32099=>17171, -32100=>17172, -32101=>17173, -32103=>17174, -32105=>17175, -32106=>17176, -32107=>17177, -32108=>17178, -32109=>17179, -32111=>17180, -32112=>17181, -32116=>17182, -32117=>17183, -32120=>17184, -32122=>17185, -32123=>17186, -32124=>17187, -32125=>17188, -32126=>17189, -32127=>17190, -32128=>17191, -32130=>17192, -32132=>17193, -32133=>17194, -32135=>17195, -32138=>17196, -32139=>17197, -32140=>17198, -32141=>17199, -32142=>17200, -32144=>17201, -32145=>17202, -32146=>17203, -32148=>17204, -32149=>17205, -32150=>17206, -32151=>17207, -32152=>17208, -32153=>17209, -32154=>17210, -32155=>17211, -32157=>17212, -32159=>17213, -32160=>17214, -32161=>17215, -32164=>17216, -32165=>17217, -32167=>17218, -32168=>17219, -32169=>17220, -32170=>17221, -32175=>17222, -32181=>17223, -32182=>17224, -32183=>17225, -32188=>17226, -32192=>17227, -32193=>17228, -32194=>17229, -32195=>17230, -32197=>17231, -32198=>17232, -32200=>17233, -32201=>17234, -32204=>17235, -32205=>17236, -32206=>17237, -32207=>17238, -32208=>17239, -32211=>17240, -32213=>17241, -32214=>17242, -32218=>17243, -32219=>17244, -32220=>17245, -32223=>17246, -32226=>17247, -32228=>17248, -32229=>17249, -32231=>17250, -32234=>17251, -32235=>17252, -32237=>17253, -32238=>17254, -32240=>17255, -32243=>17256, -32245=>17257, -32247=>17258, -32248=>17259, -32250=>17260, -32252=>17261, -32253=>17262, -32254=>17263, -32255=>17264, -32256=>17265, -32257=>17266, -32258=>17267, -32259=>17268, -32260=>17269, -32261=>17270, -32262=>17271, -32263=>17272, -32268=>17273, -32269=>17274, -32270=>17275, -32271=>17276, -32274=>17277, -32275=>17278, -32276=>17279, -32277=>17280, -32278=>17281, -32279=>17282, -32280=>17283, -32281=>17284, -32282=>17285, -32284=>17286, -32288=>17287, -32289=>17288, -32290=>17289, -32292=>17290, -32293=>17291, -32294=>17292, -32296=>17293, -32297=>17294, -32298=>17295, -32300=>17296, -32303=>17297, -32304=>17298, -32307=>17299, -32312=>17300, -32314=>17301, -32316=>17302, -32319=>17303, -32320=>17304, -32322=>17305, -32323=>17306, -32324=>17307, -32328=>17308, -32329=>17309, -32330=>17310, -32331=>17311, -32332=>17312, -32333=>17313, -32334=>17314, -32335=>17315, -32336=>17316, -32337=>17317, -32339=>17318, -32342=>17319, -32343=>17320, -32344=>17321, -32345=>17322, -32347=>17323, -32348=>17324, -32349=>17325, -32351=>17326, -32352=>17327, -32353=>17328, -32355=>17329, -32356=>17330, -32357=>17331, -32358=>17332, -32359=>17333, -32360=>17334, -32364=>17335, -32369=>17336, -32370=>17337, -32372=>17338, -32373=>17339, -32374=>17340, -32375=>17341, -32376=>17342, -32378=>17343, -32379=>17344, -32383=>17345, -32384=>17346, -32385=>17347, -32387=>17348, -32388=>17349, -32389=>17350, -32390=>17351, -32391=>17352, -32393=>17353, -32395=>17354, -32398=>17355, -32400=>17356, -32401=>17357, -32402=>17358, -32405=>17359, -32407=>17360, -32409=>17361, -32410=>17362, -32413=>17363, -32414=>17364, -32430=>17365, -32436=>17366, -32443=>17367, -32444=>17368, -32470=>17369, -32484=>17370, -32492=>17371, -32505=>17372, -32522=>17373, -32528=>17374, -32542=>17375, -32567=>17376, -32569=>17377, -32571=>17378, -32572=>17379, -32573=>17380, -32574=>17381, -32575=>17382, -32576=>17383, -32577=>17384, -32579=>17385, -32582=>17386, -32583=>17387, -32584=>17388, -32585=>17389, -32586=>17390, -32587=>17391, -32589=>17392, -32591=>17393, -32594=>17394, -32595=>17395, -32598=>17396, -32601=>17397, -32603=>17398, -32604=>17399, -32605=>17400, -32606=>17401, -32608=>17402, -32611=>17403, -32612=>17404, -32613=>17405, -32614=>17406, -32615=>17407, -32619=>17408, -32620=>17409, -32621=>17410, -32623=>17411, -32627=>17412, -32629=>17413, -32630=>17414, -32632=>17415, -32634=>17416, -32635=>17417, -32636=>17418, -32637=>17419, -32639=>17420, -32640=>17421, -32642=>17422, -32643=>17423, -32644=>17424, -32647=>17425, -32649=>17426, -32651=>17427, -32653=>17428, -32655=>17429, -32656=>17430, -32657=>17431, -32658=>17432, -32659=>17433, -32661=>17434, -32662=>17435, -32663=>17436, -32664=>17437, -32665=>17438, -32667=>17439, -32668=>17440, -32672=>17441, -32674=>17442, -32675=>17443, -32678=>17444, -32680=>17445, -32682=>17446, -32683=>17447, -32684=>17448, -32685=>17449, -32686=>17450, -32689=>17451, -32691=>17452, -32692=>17453, -32693=>17454, -32694=>17455, -32695=>17456, -32698=>17457, -32699=>17458, -32702=>17459, -32704=>17460, -32706=>17461, -32707=>17462, -32708=>17463, -32710=>17464, -32711=>17465, -32712=>17466, -32713=>17467, -32715=>17468, -32717=>17469, -32719=>17470, -32720=>17471, -32721=>17472, -32723=>17473, -32726=>17474, -32727=>17475, -32729=>17476, -32730=>17477, -32731=>17478, -32732=>17479, -32733=>17480, -32734=>17481, -32738=>17482, -32739=>17483, -32740=>17484, -32743=>17485, -32744=>17486, -32746=>17487, -32747=>17488, -32748=>17489, -32749=>17490, -32751=>17491, -32754=>17492, -32756=>17493, -32757=>17494, -32758=>17495, -32759=>17496, -32760=>17497, -32762=>17498, -32765=>17499, -32766=>17500, -32767=>17501, -32770=>17502, -32775=>17503, -32776=>17504, -32777=>17505, -32778=>17506, -32782=>17507, -32783=>17508, -32785=>17509, -32787=>17510, -32794=>17511, -32795=>17512, -32797=>17513, -32798=>17514, -32799=>17515, -32801=>17516, -32803=>17517, -32804=>17518, -32811=>17519, -32813=>17520, -32815=>17521, -32816=>17522, -32818=>17523, -32820=>17524, -32825=>17525, -32826=>17526, -32828=>17527, -32830=>17528, -32832=>17529, -32833=>17530, -32836=>17531, -32837=>17532, -32839=>17533, -32840=>17534, -32841=>17535, -32846=>17536, -32847=>17537, -32848=>17538, -32849=>17539, -32851=>17540, -32853=>17541, -32855=>17542, -32857=>17543, -32859=>17544, -32860=>17545, -32861=>17546, -32863=>17547, -32864=>17548, -32865=>17549, -32866=>17550, -32867=>17551, -32868=>17552, -32869=>17553, -32870=>17554, -32871=>17555, -32872=>17556, -32875=>17557, -32876=>17558, -32877=>17559, -32878=>17560, -32884=>17561, -32888=>17562, -32890=>17563, -32891=>17564, -32892=>17565, -32897=>17566, -32898=>17567, -32904=>17568, -32906=>17569, -32909=>17570, -32910=>17571, -32911=>17572, -32912=>17573, -32913=>17574, -32914=>17575, -32916=>17576, -32917=>17577, -32919=>17578, -32921=>17579, -32926=>17580, -32931=>17581, -32934=>17582, -32935=>17583, -32936=>17584, -32940=>17585, -32944=>17586, -32947=>17587, -32949=>17588, -32950=>17589, -32952=>17590, -32953=>17591, -32955=>17592, -32965=>17593, -32967=>17594, -32968=>17595, -32969=>17596, -32970=>17597, -32971=>17598, -32975=>17599, -32976=>17600, -32977=>17601, -32978=>17602, -32979=>17603, -32980=>17604, -32981=>17605, -32984=>17606, -32991=>17607, -32992=>17608, -32994=>17609, -32995=>17610, -32998=>17611, -33006=>17612, -33013=>17613, -33015=>17614, -33017=>17615, -33019=>17616, -33022=>17617, -33023=>17618, -33024=>17619, -33025=>17620, -33027=>17621, -33028=>17622, -33031=>17623, -33032=>17624, -33035=>17625, -33036=>17626, -33045=>17627, -33047=>17628, -33049=>17629, -33052=>17630, -33053=>17631, -33055=>17632, -33056=>17633, -33057=>17634, -33058=>17635, -33059=>17636, -33060=>17637, -33061=>17638, -33062=>17639, -33063=>17640, -33064=>17641, -33065=>17642, -33066=>17643, -33067=>17644, -33069=>17645, -33070=>17646, -33072=>17647, -33075=>17648, -33076=>17649, -33077=>17650, -33079=>17651, -33082=>17652, -33083=>17653, -33084=>17654, -33085=>17655, -33087=>17656, -33088=>17657, -33089=>17658, -33090=>17659, -33091=>17660, -33092=>17661, -33093=>17662, -33095=>17663, -33097=>17664, -33101=>17665, -33103=>17666, -33106=>17667, -33111=>17668, -33112=>17669, -33115=>17670, -33116=>17671, -33117=>17672, -33118=>17673, -33119=>17674, -33122=>17675, -33123=>17676, -33124=>17677, -33128=>17678, -33130=>17679, -33132=>17680, -33135=>17681, -33138=>17682, -33139=>17683, -33141=>17684, -33142=>17685, -33143=>17686, -33153=>17687, -33155=>17688, -33156=>17689, -33157=>17690, -33158=>17691, -33159=>17692, -33161=>17693, -33163=>17694, -33164=>17695, -33165=>17696, -33166=>17697, -33168=>17698, -33170=>17699, -33171=>17700, -33172=>17701, -33173=>17702, -33174=>17703, -33175=>17704, -33177=>17705, -33182=>17706, -33183=>17707, -33185=>17708, -33186=>17709, -33188=>17710, -33189=>17711, -33191=>17712, -33195=>17713, -33196=>17714, -33197=>17715, -33198=>17716, -33199=>17717, -33200=>17718, -33201=>17719, -33202=>17720, -33204=>17721, -33205=>17722, -33206=>17723, -33207=>17724, -33208=>17725, -33209=>17726, -33212=>17727, -33220=>17728, -33221=>17729, -33223=>17730, -33224=>17731, -33227=>17732, -33230=>17733, -33232=>17734, -33233=>17735, -33234=>17736, -33235=>17737, -33236=>17738, -33237=>17739, -33238=>17740, -33239=>17741, -33241=>17742, -33243=>17743, -33244=>17744, -33245=>17745, -33246=>17746, -33249=>17747, -33250=>17748, -33252=>17749, -33253=>17750, -33254=>17751, -33257=>17752, -33259=>17753, -33262=>17754, -33263=>17755, -33264=>17756, -33265=>17757, -33266=>17758, -33269=>17759, -33270=>17760, -33271=>17761, -33272=>17762, -33273=>17763, -33277=>17764, -33279=>17765, -33283=>17766, -33291=>17767, -33294=>17768, -33295=>17769, -33297=>17770, -33299=>17771, -33301=>17772, -33302=>17773, -33303=>17774, -33304=>17775, -33305=>17776, -33306=>17777, -33309=>17778, -33312=>17779, -33316=>17780, -33317=>17781, -33318=>17782, -33319=>17783, -33321=>17784, -33326=>17785, -33330=>17786, -33338=>17787, -33340=>17788, -33341=>17789, -33343=>17790, -33344=>17791, -33345=>17792, -33346=>17793, -33347=>17794, -33349=>17795, -33350=>17796, -33352=>17797, -33354=>17798, -33356=>17799, -33357=>17800, -33358=>17801, -33360=>17802, -33361=>17803, -33362=>17804, -33363=>17805, -33364=>17806, -33365=>17807, -33366=>17808, -33367=>17809, -33371=>17810, -33372=>17811, -33373=>17812, -33374=>17813, -33376=>17814, -33377=>17815, -33378=>17816, -33379=>17817, -33381=>17818, -33383=>17819, -33385=>17820, -33386=>17821, -33388=>17822, -33389=>17823, -33397=>17824, -33398=>17825, -12171=>17826, -33400=>17826, -33403=>17827, -33404=>17828, -33408=>17829, -33409=>17830, -33411=>17831, -33413=>17832, -33414=>17833, -33415=>17834, -33417=>17835, -33420=>17836, -33424=>17837, -33427=>17838, -33428=>17839, -33429=>17840, -33430=>17841, -33434=>17842, -33435=>17843, -33438=>17844, -33440=>17845, -33442=>17846, -33443=>17847, -33447=>17848, -33458=>17849, -33461=>17850, -33462=>17851, -33466=>17852, -33468=>17853, -33471=>17854, -33472=>17855, -33474=>17856, -33475=>17857, -33477=>17858, -33478=>17859, -33481=>17860, -33488=>17861, -33494=>17862, -33497=>17863, -33498=>17864, -33501=>17865, -33506=>17866, -33512=>17867, -33513=>17868, -33514=>17869, -33516=>17870, -33517=>17871, -33518=>17872, -33520=>17873, -33522=>17874, -33523=>17875, -33525=>17876, -33526=>17877, -33528=>17878, -33530=>17879, -33532=>17880, -33533=>17881, -33534=>17882, -33535=>17883, -33536=>17884, -33546=>17885, -33547=>17886, -33549=>17887, -33552=>17888, -33554=>17889, -33555=>17890, -33558=>17891, -33560=>17892, -33561=>17893, -33565=>17894, -33566=>17895, -33567=>17896, -33568=>17897, -33569=>17898, -33570=>17899, -33571=>17900, -33572=>17901, -33573=>17902, -33574=>17903, -33577=>17904, -33578=>17905, -33582=>17906, -33584=>17907, -33586=>17908, -33591=>17909, -33595=>17910, -33597=>17911, -33598=>17912, -33599=>17913, -33601=>17914, -33602=>17915, -33604=>17916, -33605=>17917, -33608=>17918, -33610=>17919, -33611=>17920, -33612=>17921, -33613=>17922, -33614=>17923, -33619=>17924, -33621=>17925, -33622=>17926, -33623=>17927, -33624=>17928, -33625=>17929, -33629=>17930, -33634=>17931, -33648=>17932, -33649=>17933, -33650=>17934, -33651=>17935, -33652=>17936, -33653=>17937, -33654=>17938, -33657=>17939, -33658=>17940, -33662=>17941, -33663=>17942, -33664=>17943, -33665=>17944, -33666=>17945, -33667=>17946, -33668=>17947, -33671=>17948, -33672=>17949, -33675=>17950, -33676=>17951, -33677=>17952, -33679=>17953, -33680=>17954, -33681=>17955, -33684=>17956, -33685=>17957, -33687=>17958, -33689=>17959, -33690=>17960, -33693=>17961, -33695=>17962, -33697=>17963, -33699=>17964, -33700=>17965, -33701=>17966, -33702=>17967, -33708=>17968, -33709=>17969, -33710=>17970, -33711=>17971, -33717=>17972, -33723=>17973, -33726=>17974, -33727=>17975, -33730=>17976, -33731=>17977, -33732=>17978, -33734=>17979, -33736=>17980, -33737=>17981, -33739=>17982, -33741=>17983, -33742=>17984, -33744=>17985, -33745=>17986, -33746=>17987, -33747=>17988, -33749=>17989, -33751=>17990, -33753=>17991, -33754=>17992, -33755=>17993, -33758=>17994, -33762=>17995, -33763=>17996, -33764=>17997, -33766=>17998, -33767=>17999, -33768=>18000, -33771=>18001, -33772=>18002, -33773=>18003, -33774=>18004, -33779=>18005, -33780=>18006, -33781=>18007, -33782=>18008, -33783=>18009, -33786=>18010, -33787=>18011, -33788=>18012, -33790=>18013, -33791=>18014, -33792=>18015, -33794=>18016, -33797=>18017, -33800=>18018, -33801=>18019, -33808=>18020, -33810=>18021, -33811=>18022, -33812=>18023, -33813=>18024, -33814=>18025, -33815=>18026, -33817=>18027, -33818=>18028, -33819=>18029, -33822=>18030, -33823=>18031, -33824=>18032, -33825=>18033, -33826=>18034, -33827=>18035, -33833=>18036, -33834=>18037, -33835=>18038, -33837=>18039, -33838=>18040, -33839=>18041, -33840=>18042, -33842=>18043, -33843=>18044, -33844=>18045, -33846=>18046, -33847=>18047, -33849=>18048, -33850=>18049, -33851=>18050, -33854=>18051, -33855=>18052, -33856=>18053, -33857=>18054, -33858=>18055, -33859=>18056, -33860=>18057, -33861=>18058, -33863=>18059, -33864=>18060, -33866=>18061, -33867=>18062, -33868=>18063, -33869=>18064, -33870=>18065, -33871=>18066, -33872=>18067, -33875=>18068, -33876=>18069, -33877=>18070, -33878=>18071, -33880=>18072, -33885=>18073, -33886=>18074, -33887=>18075, -33888=>18076, -33890=>18077, -33893=>18078, -33895=>18079, -33896=>18080, -33898=>18081, -33902=>18082, -33904=>18083, -33906=>18084, -33908=>18085, -33913=>18086, -33915=>18087, -33916=>18088, -33917=>18089, -33918=>18090, -33919=>18091, -33920=>18092, -33921=>18093, -33923=>18094, -33924=>18095, -33925=>18096, -33926=>18097, -33930=>18098, -33933=>18099, -33935=>18100, -33936=>18101, -33937=>18102, -33938=>18103, -33941=>18104, -33942=>18105, -33944=>18106, -33946=>18107, -33947=>18108, -33949=>18109, -33950=>18110, -33951=>18111, -33952=>18112, -33954=>18113, -33955=>18114, -33956=>18115, -33957=>18116, -33958=>18117, -33959=>18118, -33960=>18119, -33961=>18120, -33962=>18121, -33963=>18122, -33964=>18123, -33965=>18124, -33966=>18125, -33968=>18126, -33969=>18127, -33971=>18128, -33973=>18129, -33974=>18130, -33975=>18131, -33979=>18132, -33982=>18133, -33986=>18134, -33987=>18135, -33989=>18136, -33990=>18137, -33991=>18138, -33992=>18139, -33996=>18140, -33998=>18141, -33999=>18142, -34002=>18143, -34004=>18144, -34005=>18145, -34007=>18146, -34008=>18147, -34009=>18148, -34010=>18149, -34011=>18150, -34012=>18151, -34014=>18152, -34017=>18153, -34018=>18154, -34020=>18155, -34023=>18156, -34024=>18157, -34025=>18158, -34026=>18159, -34027=>18160, -34029=>18161, -34033=>18162, -34034=>18163, -34035=>18164, -34036=>18165, -34037=>18166, -34038=>18167, -34039=>18168, -34040=>18169, -34041=>18170, -34042=>18171, -34043=>18172, -34046=>18173, -34048=>18174, -34049=>18175, -34050=>18176, -34051=>18177, -34052=>18178, -34053=>18179, -34054=>18180, -34055=>18181, -34056=>18182, -34057=>18183, -34058=>18184, -34059=>18185, -34061=>18186, -34062=>18187, -34063=>18188, -34064=>18189, -34066=>18190, -34069=>18191, -34070=>18192, -34072=>18193, -34073=>18194, -34075=>18195, -34076=>18196, -34077=>18197, -34080=>18198, -34082=>18199, -34084=>18200, -34085=>18201, -34087=>18202, -34088=>18203, -34089=>18204, -34090=>18205, -34094=>18206, -34095=>18207, -34096=>18208, -34097=>18209, -34098=>18210, -34099=>18211, -34100=>18212, -34101=>18213, -34102=>18214, -34110=>18215, -34111=>18216, -34112=>18217, -34114=>18218, -34116=>18219, -34117=>18220, -34119=>18221, -34123=>18222, -34124=>18223, -34125=>18224, -34127=>18225, -34128=>18226, -34129=>18227, -34132=>18228, -34135=>18229, -34138=>18230, -34139=>18231, -34140=>18232, -34141=>18233, -34143=>18234, -34144=>18235, -34145=>18236, -34147=>18237, -34149=>18238, -34150=>18239, -34151=>18240, -34155=>18241, -34156=>18242, -34158=>18243, -34159=>18244, -34160=>18245, -34161=>18246, -34163=>18247, -34165=>18248, -34166=>18249, -34168=>18250, -34172=>18251, -34173=>18252, -34175=>18253, -34176=>18254, -34177=>18255, -34178=>18256, -34179=>18257, -34182=>18258, -34185=>18259, -34187=>18260, -34189=>18261, -34190=>18262, -34192=>18263, -34194=>18264, -34195=>18265, -34197=>18266, -34198=>18267, -34199=>18268, -34200=>18269, -34201=>18270, -34202=>18271, -34205=>18272, -34206=>18273, -34208=>18274, -34209=>18275, -34210=>18276, -34211=>18277, -34213=>18278, -34215=>18279, -34219=>18280, -34220=>18281, -34221=>18282, -34225=>18283, -34226=>18284, -34227=>18285, -34228=>18286, -34229=>18287, -34230=>18288, -34232=>18289, -34235=>18290, -34236=>18291, -34237=>18292, -34238=>18293, -34239=>18294, -34240=>18295, -34242=>18296, -34243=>18297, -34244=>18298, -34245=>18299, -34246=>18300, -34247=>18301, -34248=>18302, -34250=>18303, -34251=>18304, -34252=>18305, -34257=>18306, -34258=>18307, -34260=>18308, -34262=>18309, -34263=>18310, -34264=>18311, -34265=>18312, -34266=>18313, -34267=>18314, -34270=>18315, -34271=>18316, -34272=>18317, -34273=>18318, -34274=>18319, -34275=>18320, -34278=>18321, -34279=>18322, -34280=>18323, -34283=>18324, -34284=>18325, -34285=>18326, -34286=>18327, -34287=>18328, -34288=>18329, -34289=>18330, -34290=>18331, -34291=>18332, -34293=>18333, -34295=>18334, -34296=>18335, -34300=>18336, -34301=>18337, -34302=>18338, -34304=>18339, -34305=>18340, -34306=>18341, -34307=>18342, -34312=>18343, -34313=>18344, -34314=>18345, -34316=>18346, -34317=>18347, -34318=>18348, -34319=>18349, -34320=>18350, -34322=>18351, -34323=>18352, -34324=>18353, -34325=>18354, -34327=>18355, -34328=>18356, -34329=>18357, -34331=>18358, -34332=>18359, -34333=>18360, -34335=>18361, -34336=>18362, -34337=>18363, -34339=>18364, -34340=>18365, -34341=>18366, -34342=>18367, -34344=>18368, -34346=>18369, -34347=>18370, -34348=>18371, -34350=>18372, -34351=>18373, -34352=>18374, -34353=>18375, -34354=>18376, -34355=>18377, -34356=>18378, -34357=>18379, -34358=>18380, -34359=>18381, -34361=>18382, -34363=>18383, -34365=>18384, -34366=>18385, -34368=>18386, -34369=>18387, -34370=>18388, -34371=>18389, -34372=>18390, -34373=>18391, -34374=>18392, -34375=>18393, -34376=>18394, -34377=>18395, -34378=>18396, -34379=>18397, -34380=>18398, -34386=>18399, -34387=>18400, -34390=>18401, -34391=>18402, -34392=>18403, -34393=>18404, -34395=>18405, -34397=>18406, -34400=>18407, -34401=>18408, -34403=>18409, -34404=>18410, -34405=>18411, -34406=>18412, -34408=>18413, -34409=>18414, -34410=>18415, -34413=>18416, -34415=>18417, -34416=>18418, -34418=>18419, -34419=>18420, -34420=>18421, -34421=>18422, -34422=>18423, -34423=>18424, -34424=>18425, -34435=>18426, -34436=>18427, -34437=>18428, -34438=>18429, -34439=>18430, -34440=>18431, -34441=>18432, -34446=>18433, -34447=>18434, -34448=>18435, -34449=>18436, -34450=>18437, -34452=>18438, -34454=>18439, -34455=>18440, -34456=>18441, -34457=>18442, -34458=>18443, -34459=>18444, -34462=>18445, -34463=>18446, -34464=>18447, -34465=>18448, -34466=>18449, -34469=>18450, -34470=>18451, -34475=>18452, -34477=>18453, -34478=>18454, -34482=>18455, -34483=>18456, -34487=>18457, -34488=>18458, -34489=>18459, -34491=>18460, -34492=>18461, -34493=>18462, -34494=>18463, -34495=>18464, -34497=>18465, -34498=>18466, -34499=>18467, -34501=>18468, -34504=>18469, -34508=>18470, -34509=>18471, -34514=>18472, -34515=>18473, -34517=>18474, -34518=>18475, -34519=>18476, -34522=>18477, -34524=>18478, -34525=>18479, -34528=>18480, -34529=>18481, -34530=>18482, -34531=>18483, -34533=>18484, -34534=>18485, -34535=>18486, -34536=>18487, -34538=>18488, -34539=>18489, -34540=>18490, -34543=>18491, -34549=>18492, -34550=>18493, -34551=>18494, -34555=>18495, -34556=>18496, -34557=>18497, -34559=>18498, -34561=>18499, -34564=>18500, -34565=>18501, -34571=>18502, -34572=>18503, -34574=>18504, -34575=>18505, -34576=>18506, -34577=>18507, -34580=>18508, -34582=>18509, -34585=>18510, -34587=>18511, -34589=>18512, -34591=>18513, -34592=>18514, -34596=>18515, -34598=>18516, -34599=>18517, -34600=>18518, -34602=>18519, -34603=>18520, -34604=>18521, -34605=>18522, -34607=>18523, -34608=>18524, -34610=>18525, -34611=>18526, -34613=>18527, -34614=>18528, -34616=>18529, -34617=>18530, -34618=>18531, -34620=>18532, -34621=>18533, -34624=>18534, -34625=>18535, -34626=>18536, -34627=>18537, -34628=>18538, -34629=>18539, -34630=>18540, -34634=>18541, -34635=>18542, -34637=>18543, -34639=>18544, -34640=>18545, -34641=>18546, -34642=>18547, -34644=>18548, -34646=>18549, -34648=>18550, -34650=>18551, -34651=>18552, -34652=>18553, -34653=>18554, -34654=>18555, -34655=>18556, -34657=>18557, -34658=>18558, -34663=>18559, -34664=>18560, -34665=>18561, -34666=>18562, -34667=>18563, -34668=>18564, -34669=>18565, -34671=>18566, -34673=>18567, -34674=>18568, -34675=>18569, -34677=>18570, -34679=>18571, -34681=>18572, -34682=>18573, -34687=>18574, -34688=>18575, -34689=>18576, -34694=>18577, -34695=>18578, -34697=>18579, -34698=>18580, -34700=>18581, -34702=>18582, -34703=>18583, -34704=>18584, -34705=>18585, -34706=>18586, -34708=>18587, -34709=>18588, -34710=>18589, -34712=>18590, -34713=>18591, -34714=>18592, -34715=>18593, -34716=>18594, -34717=>18595, -34720=>18596, -34721=>18597, -34723=>18598, -34724=>18599, -34725=>18600, -34726=>18601, -34727=>18602, -34729=>18603, -34730=>18604, -34734=>18605, -34736=>18606, -34737=>18607, -34738=>18608, -34740=>18609, -34742=>18610, -34743=>18611, -34744=>18612, -34745=>18613, -34748=>18614, -34750=>18615, -34751=>18616, -34753=>18617, -34754=>18618, -34755=>18619, -34757=>18620, -34759=>18621, -34761=>18622, -34764=>18623, -34765=>18624, -34767=>18625, -34768=>18626, -34772=>18627, -34773=>18628, -34774=>18629, -34775=>18630, -34776=>18631, -34777=>18632, -34778=>18633, -34780=>18634, -34781=>18635, -34782=>18636, -34783=>18637, -34785=>18638, -34786=>18639, -34788=>18640, -34790=>18641, -34791=>18642, -34792=>18643, -34793=>18644, -34795=>18645, -34797=>18646, -34800=>18647, -34801=>18648, -34803=>18649, -34804=>18650, -34805=>18651, -34807=>18652, -34808=>18653, -34810=>18654, -34812=>18655, -34813=>18656, -34815=>18657, -34816=>18658, -34817=>18659, -34818=>18660, -34820=>18661, -34823=>18662, -34824=>18663, -34825=>18664, -34827=>18665, -34828=>18666, -34829=>18667, -34830=>18668, -34831=>18669, -34834=>18670, -34836=>18671, -34839=>18672, -34840=>18673, -34841=>18674, -34842=>18675, -34844=>18676, -34845=>18677, -34846=>18678, -34848=>18679, -34852=>18680, -34853=>18681, -34854=>18682, -34855=>18683, -34856=>18684, -34857=>18685, -34858=>18686, -34859=>18687, -34860=>18688, -34861=>18689, -34862=>18690, -34863=>18691, -34864=>18692, -34867=>18693, -34868=>18694, -34869=>18695, -34871=>18696, -34872=>18697, -34874=>18698, -34877=>18699, -34878=>18700, -34879=>18701, -34881=>18702, -34882=>18703, -34883=>18704, -34887=>18705, -34888=>18706, -34889=>18707, -34891=>18708, -34894=>18709, -34895=>18710, -34896=>18711, -34897=>18712, -34898=>18713, -34901=>18714, -34902=>18715, -34904=>18716, -34906=>18717, -34908=>18718, -34910=>18719, -34911=>18720, -34912=>18721, -34918=>18722, -34919=>18723, -34922=>18724, -34925=>18725, -34927=>18726, -34929=>18727, -34931=>18728, -34932=>18729, -34933=>18730, -34934=>18731, -34936=>18732, -34938=>18733, -34939=>18734, -34940=>18735, -34944=>18736, -34947=>18737, -34950=>18738, -34951=>18739, -34953=>18740, -34954=>18741, -34956=>18742, -34958=>18743, -34959=>18744, -34960=>18745, -34961=>18746, -34963=>18747, -34964=>18748, -34965=>18749, -34967=>18750, -34968=>18751, -34969=>18752, -34970=>18753, -34971=>18754, -34973=>18755, -34974=>18756, -34975=>18757, -34976=>18758, -34977=>18759, -34979=>18760, -34981=>18761, -34982=>18762, -34983=>18763, -34984=>18764, -34985=>18765, -34986=>18766, -34988=>18767, -34990=>18768, -34991=>18769, -34992=>18770, -34994=>18771, -34995=>18772, -34996=>18773, -34997=>18774, -34998=>18775, -35000=>18776, -35001=>18777, -35002=>18778, -35003=>18779, -35005=>18780, -35006=>18781, -35007=>18782, -35008=>18783, -35011=>18784, -35012=>18785, -35015=>18786, -35016=>18787, -35019=>18788, -35020=>18789, -35021=>18790, -35024=>18791, -35025=>18792, -35027=>18793, -35030=>18794, -35031=>18795, -35034=>18796, -35035=>18797, -35038=>18798, -35040=>18799, -35041=>18800, -35046=>18801, -35047=>18802, -35049=>18803, -35050=>18804, -35051=>18805, -35052=>18806, -35053=>18807, -35054=>18808, -35055=>18809, -35058=>18810, -35061=>18811, -35062=>18812, -35063=>18813, -35066=>18814, -35067=>18815, -35071=>18816, -35072=>18817, -35073=>18818, -35075=>18819, -35076=>18820, -35077=>18821, -35078=>18822, -35080=>18823, -35081=>18824, -35083=>18825, -35084=>18826, -35085=>18827, -35086=>18828, -35087=>18829, -35089=>18830, -35092=>18831, -35093=>18832, -35094=>18833, -35095=>18834, -35096=>18835, -35100=>18836, -35101=>18837, -35102=>18838, -35103=>18839, -35104=>18840, -35106=>18841, -35107=>18842, -35108=>18843, -35110=>18844, -35111=>18845, -35112=>18846, -35113=>18847, -35116=>18848, -35117=>18849, -35118=>18850, -35119=>18851, -35121=>18852, -35125=>18853, -35127=>18854, -35129=>18855, -35130=>18856, -35132=>18857, -35133=>18858, -35134=>18859, -35135=>18860, -35136=>18861, -35138=>18862, -35139=>18863, -35141=>18864, -35142=>18865, -35144=>18866, -35145=>18867, -35146=>18868, -35147=>18869, -35148=>18870, -35149=>18871, -35150=>18872, -35151=>18873, -35152=>18874, -35153=>18875, -35154=>18876, -35155=>18877, -35156=>18878, -35157=>18879, -35159=>18880, -35160=>18881, -35161=>18882, -35162=>18883, -35163=>18884, -35164=>18885, -35169=>18886, -35170=>18887, -35171=>18888, -35173=>18889, -35175=>18890, -35176=>18891, -35177=>18892, -35179=>18893, -35181=>18894, -35182=>18895, -35184=>18896, -35185=>18897, -35187=>18898, -35188=>18899, -35189=>18900, -35190=>18901, -35191=>18902, -35192=>18903, -35193=>18904, -35194=>18905, -35196=>18906, -35197=>18907, -12177=>18908, -35198=>18908, -35200=>18909, -35202=>18910, -35204=>18911, -35205=>18912, -35207=>18913, -35208=>18914, -35209=>18915, -35210=>18916, -35212=>18917, -35213=>18918, -35214=>18919, -35216=>18920, -35217=>18921, -35218=>18922, -35220=>18923, -35221=>18924, -35223=>18925, -35225=>18926, -35226=>18927, -35227=>18928, -35228=>18929, -35229=>18930, -35230=>18931, -35231=>18932, -35232=>18933, -35234=>18934, -35235=>18935, -35236=>18936, -35237=>18937, -35239=>18938, -35240=>18939, -35241=>18940, -35243=>18941, -35245=>18942, -35246=>18943, -35248=>18944, -35249=>18945, -35251=>18946, -35252=>18947, -35253=>18948, -35254=>18949, -35256=>18950, -35257=>18951, -35259=>18952, -35260=>18953, -35262=>18954, -35267=>18955, -35277=>18956, -35283=>18957, -35284=>18958, -35285=>18959, -35287=>18960, -35288=>18961, -35289=>18962, -35291=>18963, -35293=>18964, -35295=>18965, -35296=>18966, -35297=>18967, -35298=>18968, -35300=>18969, -35303=>18970, -35304=>18971, -35305=>18972, -35306=>18973, -35308=>18974, -35309=>18975, -35310=>18976, -35312=>18977, -35313=>18978, -35314=>18979, -35317=>18980, -35319=>18981, -35321=>18982, -35322=>18983, -35323=>18984, -35324=>18985, -35325=>18986, -35326=>18987, -35327=>18988, -35332=>18989, -35333=>18990, -35334=>18991, -35337=>18992, -35339=>18993, -35341=>18994, -35343=>18995, -35345=>18996, -35346=>18997, -35348=>18998, -35351=>18999, -35353=>19000, -35354=>19001, -35356=>19002, -35358=>19003, -35360=>19004, -35361=>19005, -35362=>19006, -35364=>19007, -35366=>19008, -35367=>19009, -35368=>19010, -35369=>19011, -35371=>19012, -35372=>19013, -35374=>19014, -35375=>19015, -35376=>19016, -35378=>19017, -35379=>19018, -35381=>19019, -35383=>19020, -35384=>19021, -35385=>19022, -35387=>19023, -35388=>19024, -35389=>19025, -35391=>19026, -35392=>19027, -35394=>19028, -35395=>19029, -35396=>19030, -35397=>19031, -35399=>19032, -35401=>19033, -35402=>19034, -35403=>19035, -35404=>19036, -35405=>19037, -35407=>19038, -35409=>19039, -35411=>19040, -35414=>19041, -35415=>19042, -35417=>19043, -35418=>19044, -35420=>19045, -35421=>19046, -35423=>19047, -35424=>19048, -35428=>19049, -35429=>19050, -35431=>19051, -35432=>19052, -35434=>19053, -35439=>19054, -35444=>19055, -35446=>19056, -35447=>19057, -35448=>19058, -35450=>19059, -35451=>19060, -35453=>19061, -35454=>19062, -35456=>19063, -35457=>19064, -35458=>19065, -35459=>19066, -35464=>19067, -35467=>19068, -35468=>19069, -35470=>19070, -35471=>19071, -35472=>19072, -35476=>19073, -35478=>19074, -35479=>19075, -35481=>19076, -35483=>19077, -35484=>19078, -35485=>19079, -35487=>19080, -35490=>19081, -35495=>19082, -35497=>19083, -35498=>19084, -35499=>19085, -35501=>19086, -35502=>19087, -35503=>19088, -35505=>19089, -35507=>19090, -35508=>19091, -35509=>19092, -35511=>19093, -35512=>19094, -35514=>19095, -35515=>19096, -35517=>19097, -35518=>19098, -35520=>19099, -35521=>19100, -35523=>19101, -35525=>19102, -35526=>19103, -35528=>19104, -35530=>19105, -35532=>19106, -35534=>19107, -35536=>19108, -35539=>19109, -35540=>19110, -35541=>19111, -35544=>19112, -35545=>19113, -35546=>19114, -35549=>19115, -35551=>19116, -35552=>19117, -35553=>19118, -35555=>19119, -35557=>19120, -35560=>19121, -35561=>19122, -35562=>19123, -35564=>19124, -35567=>19125, -35568=>19126, -35570=>19127, -35572=>19128, -35573=>19129, -35577=>19130, -35579=>19131, -35581=>19132, -35583=>19133, -35587=>19134, -35590=>19135, -35592=>19136, -35593=>19137, -35595=>19138, -35596=>19139, -35597=>19140, -35599=>19141, -35601=>19142, -35602=>19143, -35603=>19144, -35605=>19145, -35608=>19146, -35612=>19147, -35614=>19148, -35615=>19149, -35616=>19150, -35618=>19151, -35619=>19152, -35620=>19153, -35621=>19154, -35623=>19155, -35625=>19156, -35626=>19157, -35630=>19158, -35631=>19159, -35632=>19160, -35633=>19161, -35634=>19162, -35636=>19163, -35637=>19164, -35638=>19165, -35639=>19166, -35640=>19167, -35642=>19168, -35643=>19169, -35644=>19170, -35645=>19171, -35647=>19172, -35648=>19173, -35649=>19174, -35650=>19175, -35651=>19176, -35652=>19177, -35653=>19178, -35654=>19179, -35655=>19180, -35656=>19181, -35658=>19182, -35659=>19183, -35660=>19184, -35661=>19185, -35664=>19186, -35665=>19187, -35666=>19188, -35667=>19189, -35668=>19190, -35669=>19191, -35671=>19192, -35675=>19193, -35677=>19194, -35678=>19195, -35679=>19196, -35680=>19197, -35681=>19198, -35682=>19199, -35683=>19200, -35684=>19201, -35685=>19202, -35687=>19203, -35688=>19204, -35689=>19205, -35690=>19206, -35693=>19207, -35694=>19208, -35697=>19209, -35698=>19210, -35699=>19211, -35701=>19212, -35702=>19213, -35704=>19214, -35705=>19215, -35706=>19216, -35707=>19217, -35708=>19218, -35710=>19219, -35711=>19220, -35713=>19221, -35714=>19222, -35715=>19223, -35716=>19224, -35717=>19225, -35718=>19226, -35719=>19227, -35720=>19228, -35721=>19229, -35723=>19230, -35724=>19231, -35725=>19232, -35727=>19233, -35728=>19234, -35729=>19235, -35732=>19236, -35735=>19237, -35736=>19238, -35737=>19239, -35738=>19240, -35739=>19241, -35741=>19242, -35743=>19243, -35756=>19244, -35761=>19245, -35771=>19246, -35783=>19247, -35792=>19248, -35818=>19249, -35849=>19250, -35870=>19251, -35896=>19252, -35897=>19253, -35898=>19254, -35899=>19255, -35900=>19256, -35901=>19257, -35902=>19258, -35903=>19259, -35904=>19260, -35906=>19261, -35907=>19262, -35908=>19263, -35909=>19264, -35914=>19265, -35915=>19266, -35917=>19267, -35918=>19268, -35919=>19269, -35921=>19270, -35922=>19271, -35923=>19272, -35924=>19273, -35926=>19274, -35927=>19275, -35928=>19276, -35929=>19277, -35931=>19278, -35932=>19279, -35933=>19280, -35934=>19281, -35935=>19282, -35936=>19283, -35939=>19284, -35940=>19285, -35941=>19286, -35942=>19287, -35943=>19288, -35944=>19289, -35945=>19290, -35948=>19291, -35949=>19292, -35950=>19293, -35951=>19294, -35952=>19295, -35953=>19296, -35954=>19297, -35956=>19298, -35957=>19299, -35958=>19300, -35959=>19301, -35963=>19302, -35964=>19303, -35965=>19304, -35966=>19305, -35967=>19306, -35968=>19307, -35969=>19308, -35971=>19309, -35972=>19310, -35974=>19311, -35975=>19312, -35976=>19313, -35979=>19314, -35981=>19315, -35982=>19316, -35983=>19317, -35984=>19318, -35985=>19319, -35986=>19320, -35987=>19321, -35989=>19322, -35990=>19323, -35991=>19324, -35993=>19325, -35994=>19326, -35995=>19327, -35996=>19328, -35999=>19329, -36003=>19330, -36004=>19331, -36005=>19332, -36006=>19333, -36013=>19334, -36014=>19335, -36017=>19336, -36021=>19337, -36025=>19338, -36030=>19339, -36038=>19340, -36041=>19341, -36043=>19342, -36044=>19343, -36045=>19344, -36046=>19345, -36047=>19346, -36048=>19347, -36052=>19348, -36054=>19349, -36055=>19350, -36056=>19351, -36057=>19352, -36059=>19353, -36061=>19354, -36063=>19355, -36069=>19356, -36072=>19357, -36073=>19358, -36078=>19359, -36079=>19360, -36080=>19361, -36081=>19362, -36082=>19363, -36083=>19364, -36085=>19365, -36086=>19366, -36087=>19367, -36088=>19368, -36089=>19369, -36095=>19370, -36096=>19371, -36097=>19372, -36098=>19373, -36099=>19374, -36102=>19375, -36103=>19376, -36105=>19377, -36108=>19378, -36110=>19379, -36113=>19380, -36114=>19381, -36115=>19382, -36116=>19383, -36117=>19384, -36119=>19385, -36120=>19386, -36121=>19387, -36122=>19388, -36128=>19389, -36177=>19390, -36178=>19391, -36183=>19392, -36191=>19393, -36197=>19394, -36200=>19395, -36201=>19396, -36202=>19397, -36204=>19398, -36206=>19399, -36207=>19400, -36209=>19401, -36210=>19402, -36216=>19403, -36217=>19404, -36218=>19405, -36219=>19406, -36220=>19407, -36221=>19408, -36222=>19409, -36223=>19410, -36224=>19411, -36226=>19412, -36227=>19413, -36230=>19414, -36231=>19415, -36232=>19416, -36233=>19417, -36236=>19418, -36237=>19419, -36238=>19420, -36239=>19421, -36240=>19422, -36242=>19423, -36243=>19424, -36246=>19425, -36247=>19426, -36248=>19427, -36250=>19428, -36251=>19429, -36252=>19430, -36253=>19431, -36254=>19432, -36256=>19433, -36257=>19434, -36258=>19435, -36260=>19436, -36261=>19437, -36262=>19438, -36263=>19439, -36265=>19440, -36266=>19441, -36267=>19442, -36268=>19443, -36269=>19444, -36270=>19445, -36271=>19446, -36272=>19447, -36278=>19448, -36279=>19449, -36281=>19450, -36283=>19451, -36285=>19452, -36288=>19453, -36289=>19454, -36290=>19455, -36293=>19456, -36295=>19457, -36296=>19458, -36297=>19459, -36298=>19460, -36301=>19461, -36304=>19462, -36306=>19463, -36307=>19464, -36308=>19465, -36309=>19466, -36312=>19467, -36313=>19468, -36316=>19469, -36320=>19470, -36321=>19471, -36322=>19472, -36325=>19473, -36326=>19474, -36327=>19475, -36329=>19476, -36333=>19477, -36334=>19478, -36336=>19479, -36337=>19480, -36338=>19481, -36340=>19482, -36342=>19483, -36348=>19484, -36350=>19485, -36351=>19486, -36352=>19487, -36353=>19488, -36354=>19489, -36355=>19490, -36356=>19491, -36358=>19492, -36359=>19493, -36360=>19494, -36363=>19495, -36365=>19496, -36366=>19497, -36369=>19498, -36370=>19499, -36371=>19500, -36373=>19501, -36374=>19502, -36375=>19503, -36376=>19504, -36377=>19505, -36378=>19506, -36379=>19507, -36380=>19508, -36384=>19509, -36385=>19510, -36388=>19511, -36389=>19512, -36390=>19513, -36391=>19514, -36392=>19515, -36395=>19516, -36397=>19517, -36400=>19518, -36402=>19519, -36403=>19520, -36406=>19521, -36407=>19522, -36408=>19523, -36411=>19524, -36412=>19525, -36414=>19526, -36415=>19527, -36419=>19528, -36421=>19529, -36422=>19530, -36429=>19531, -36430=>19532, -36431=>19533, -36432=>19534, -36435=>19535, -36436=>19536, -36438=>19537, -36439=>19538, -36440=>19539, -36442=>19540, -36443=>19541, -36444=>19542, -36445=>19543, -36446=>19544, -36447=>19545, -36448=>19546, -36449=>19547, -36450=>19548, -36452=>19549, -36453=>19550, -36455=>19551, -36456=>19552, -36458=>19553, -36459=>19554, -36462=>19555, -36465=>19556, -36467=>19557, -36469=>19558, -36471=>19559, -36472=>19560, -36473=>19561, -36475=>19562, -36477=>19563, -36478=>19564, -36480=>19565, -36482=>19566, -36483=>19567, -36484=>19568, -36486=>19569, -36488=>19570, -36492=>19571, -36494=>19572, -36501=>19573, -36502=>19574, -36503=>19575, -36504=>19576, -36505=>19577, -36507=>19578, -36509=>19579, -36511=>19580, -36512=>19581, -36514=>19582, -36515=>19583, -36516=>19584, -36519=>19585, -36520=>19586, -36521=>19587, -36525=>19588, -36526=>19589, -36528=>19590, -36529=>19591, -36531=>19592, -36532=>19593, -36533=>19594, -36534=>19595, -36535=>19596, -36536=>19597, -36537=>19598, -36539=>19599, -36540=>19600, -36541=>19601, -36542=>19602, -36543=>19603, -36545=>19604, -36546=>19605, -36547=>19606, -36548=>19607, -36549=>19608, -36550=>19609, -36551=>19610, -36552=>19611, -36553=>19612, -36559=>19613, -36560=>19614, -36561=>19615, -36563=>19616, -36565=>19617, -36566=>19618, -36567=>19619, -36568=>19620, -36569=>19621, -36570=>19622, -36572=>19623, -36573=>19624, -36574=>19625, -36576=>19626, -36577=>19627, -36578=>19628, -36579=>19629, -36581=>19630, -36582=>19631, -36583=>19632, -36584=>19633, -36585=>19634, -36586=>19635, -36588=>19636, -36589=>19637, -36590=>19638, -36591=>19639, -36592=>19640, -36593=>19641, -36595=>19642, -36596=>19643, -36597=>19644, -36598=>19645, -36599=>19646, -36605=>19647, -36607=>19648, -36608=>19649, -36609=>19650, -36610=>19651, -36612=>19652, -36614=>19653, -36616=>19654, -36619=>19655, -36620=>19656, -36621=>19657, -36622=>19658, -36623=>19659, -36624=>19660, -36625=>19661, -36627=>19662, -36630=>19663, -36631=>19664, -36632=>19665, -36633=>19666, -36634=>19667, -36640=>19668, -36641=>19669, -36642=>19670, -36643=>19671, -36644=>19672, -36647=>19673, -36648=>19674, -36651=>19675, -36652=>19676, -36653=>19677, -36654=>19678, -36656=>19679, -36657=>19680, -36658=>19681, -36660=>19682, -36661=>19683, -36662=>19684, -36663=>19685, -36665=>19686, -36666=>19687, -36668=>19688, -36669=>19689, -36672=>19690, -36673=>19691, -36675=>19692, -36679=>19693, -36680=>19694, -36682=>19695, -36683=>19696, -36684=>19697, -36687=>19698, -36688=>19699, -36689=>19700, -36690=>19701, -36691=>19702, -36693=>19703, -36694=>19704, -36695=>19705, -36696=>19706, -36697=>19707, -36698=>19708, -36699=>19709, -36700=>19710, -36701=>19711, -36702=>19712, -36704=>19713, -36707=>19714, -36709=>19715, -36714=>19716, -36736=>19717, -36748=>19718, -36754=>19719, -36765=>19720, -36768=>19721, -36769=>19722, -36770=>19723, -36772=>19724, -36773=>19725, -36775=>19726, -36778=>19727, -36780=>19728, -36787=>19729, -36788=>19730, -12193=>19731, -36789=>19731, -36791=>19732, -36792=>19733, -36794=>19734, -36795=>19735, -36796=>19736, -36799=>19737, -36800=>19738, -36803=>19739, -36806=>19740, -36809=>19741, -36810=>19742, -36811=>19743, -36812=>19744, -36813=>19745, -36815=>19746, -36818=>19747, -36822=>19748, -36823=>19749, -36826=>19750, -36832=>19751, -36833=>19752, -36835=>19753, -36839=>19754, -36844=>19755, -36847=>19756, -36849=>19757, -36850=>19758, -36853=>19759, -36854=>19760, -36858=>19761, -36859=>19762, -36860=>19763, -36862=>19764, -36863=>19765, -36871=>19766, -36872=>19767, -36876=>19768, -36878=>19769, -36883=>19770, -36888=>19771, -36892=>19772, -36900=>19773, -36901=>19774, -36903=>19775, -36904=>19776, -36905=>19777, -36906=>19778, -36907=>19779, -36908=>19780, -36912=>19781, -36913=>19782, -36915=>19783, -36916=>19784, -36919=>19785, -36921=>19786, -36922=>19787, -36925=>19788, -36927=>19789, -36928=>19790, -36931=>19791, -36933=>19792, -36934=>19793, -36936=>19794, -36937=>19795, -36938=>19796, -36940=>19797, -36950=>19798, -36953=>19799, -36954=>19800, -36957=>19801, -36959=>19802, -36961=>19803, -36964=>19804, -36966=>19805, -36967=>19806, -36970=>19807, -36971=>19808, -36972=>19809, -36975=>19810, -36976=>19811, -36977=>19812, -36979=>19813, -36982=>19814, -36985=>19815, -36987=>19816, -36990=>19817, -36997=>19818, -36998=>19819, -37001=>19820, -37004=>19821, -37005=>19822, -37006=>19823, -37010=>19824, -37012=>19825, -37014=>19826, -37016=>19827, -37018=>19828, -37020=>19829, -37022=>19830, -37023=>19831, -37024=>19832, -37028=>19833, -37029=>19834, -37031=>19835, -37032=>19836, -37033=>19837, -37035=>19838, -37037=>19839, -37042=>19840, -37047=>19841, -37052=>19842, -37053=>19843, -37055=>19844, -37056=>19845, -37058=>19846, -37059=>19847, -37062=>19848, -37064=>19849, -37065=>19850, -37067=>19851, -37068=>19852, -37069=>19853, -37074=>19854, -37076=>19855, -37077=>19856, -37078=>19857, -37080=>19858, -37081=>19859, -37082=>19860, -37086=>19861, -37088=>19862, -37091=>19863, -37092=>19864, -37093=>19865, -37097=>19866, -37098=>19867, -37100=>19868, -37102=>19869, -37104=>19870, -37105=>19871, -37106=>19872, -37107=>19873, -37110=>19874, -37111=>19875, -37113=>19876, -37114=>19877, -37115=>19878, -37116=>19879, -37119=>19880, -37120=>19881, -37121=>19882, -37123=>19883, -37125=>19884, -37127=>19885, -37128=>19886, -37130=>19887, -37131=>19888, -37132=>19889, -37133=>19890, -37134=>19891, -37135=>19892, -37136=>19893, -37137=>19894, -37139=>19895, -37141=>19896, -37143=>19897, -37144=>19898, -37146=>19899, -37147=>19900, -37148=>19901, -37149=>19902, -37151=>19903, -37152=>19904, -37153=>19905, -37156=>19906, -37157=>19907, -37158=>19908, -37160=>19909, -37161=>19910, -37162=>19911, -37163=>19912, -37164=>19913, -37166=>19914, -37171=>19915, -37173=>19916, -37175=>19917, -37176=>19918, -37179=>19919, -37180=>19920, -37181=>19921, -37182=>19922, -37183=>19923, -37184=>19924, -37185=>19925, -37186=>19926, -37188=>19927, -37189=>19928, -37191=>19929, -37201=>19930, -37203=>19931, -37204=>19932, -37205=>19933, -37206=>19934, -37208=>19935, -37209=>19936, -37211=>19937, -37212=>19938, -37215=>19939, -37216=>19940, -37222=>19941, -37223=>19942, -37224=>19943, -37227=>19944, -37229=>19945, -37235=>19946, -37242=>19947, -37243=>19948, -37244=>19949, -37248=>19950, -37249=>19951, -37250=>19952, -37251=>19953, -37252=>19954, -37254=>19955, -37256=>19956, -37258=>19957, -37262=>19958, -37263=>19959, -37267=>19960, -37268=>19961, -37269=>19962, -37271=>19963, -37272=>19964, -37273=>19965, -37277=>19966, -37278=>19967, -37279=>19968, -37280=>19969, -37281=>19970, -37284=>19971, -37285=>19972, -37286=>19973, -37287=>19974, -37288=>19975, -37289=>19976, -37296=>19977, -37297=>19978, -37298=>19979, -37299=>19980, -37302=>19981, -37303=>19982, -37304=>19983, -37305=>19984, -37307=>19985, -37308=>19986, -37309=>19987, -37310=>19988, -37311=>19989, -37314=>19990, -37316=>19991, -12196=>19992, -37318=>19992, -37320=>19993, -37328=>19994, -37334=>19995, -37338=>19996, -37339=>19997, -37342=>19998, -37343=>19999, -37344=>20000, -37345=>20001, -37346=>20002, -37349=>20003, -37350=>20004, -37352=>20005, -37354=>20006, -37355=>20007, -37356=>20008, -37357=>20009, -37358=>20010, -37359=>20011, -37360=>20012, -37361=>20013, -37362=>20014, -37363=>20015, -37364=>20016, -37366=>20017, -37368=>20018, -37371=>20019, -37372=>20020, -37373=>20021, -37374=>20022, -37375=>20023, -37378=>20024, -37379=>20025, -37381=>20026, -37382=>20027, -37383=>20028, -37386=>20029, -37387=>20030, -37388=>20031, -37391=>20032, -37394=>20033, -37395=>20034, -37398=>20035, -37399=>20036, -37400=>20037, -37401=>20038, -37402=>20039, -37403=>20040, -37404=>20041, -37405=>20042, -37407=>20043, -37408=>20044, -37409=>20045, -37410=>20046, -37412=>20047, -37416=>20048, -37417=>20049, -37418=>20050, -37419=>20051, -37420=>20052, -37421=>20053, -37423=>20054, -37425=>20055, -37426=>20056, -37429=>20057, -37430=>20058, -37435=>20059, -37436=>20060, -37441=>20061, -37442=>20062, -37443=>20063, -37444=>20064, -37446=>20065, -37447=>20066, -37450=>20067, -37451=>20068, -37452=>20069, -37454=>20070, -37455=>20071, -37456=>20072, -37458=>20073, -37459=>20074, -37460=>20075, -37462=>20076, -37464=>20077, -37465=>20078, -37468=>20079, -37469=>20080, -37471=>20081, -37472=>20082, -37473=>20083, -37475=>20084, -37476=>20085, -37477=>20086, -37479=>20087, -37480=>20088, -37481=>20089, -37482=>20090, -37483=>20091, -37486=>20092, -37487=>20093, -37488=>20094, -37489=>20095, -37490=>20096, -37491=>20097, -37493=>20098, -37494=>20099, -37495=>20100, -37497=>20101, -37500=>20102, -37501=>20103, -37502=>20104, -37505=>20105, -37506=>20106, -37508=>20107, -37510=>20108, -37511=>20109, -37512=>20110, -37513=>20111, -37514=>20112, -37515=>20113, -37516=>20114, -37517=>20115, -37519=>20116, -37520=>20117, -37522=>20118, -37524=>20119, -37525=>20120, -37527=>20121, -37529=>20122, -37531=>20123, -37533=>20124, -37534=>20125, -37535=>20126, -37537=>20127, -37538=>20128, -37540=>20129, -37543=>20130, -37549=>20131, -37551=>20132, -37552=>20133, -37554=>20134, -37555=>20135, -37556=>20136, -37557=>20137, -37558=>20138, -37560=>20139, -37562=>20140, -37565=>20141, -37566=>20142, -37567=>20143, -37568=>20144, -37570=>20145, -37572=>20146, -37574=>20147, -37577=>20148, -37578=>20149, -37579=>20150, -37581=>20151, -37582=>20152, -37584=>20153, -37585=>20154, -37587=>20155, -37588=>20156, -37589=>20157, -37590=>20158, -37591=>20159, -37592=>20160, -37593=>20161, -37594=>20162, -37595=>20163, -37596=>20164, -37598=>20165, -37600=>20166, -37601=>20167, -37602=>20168, -37607=>20169, -37609=>20170, -37611=>20171, -37612=>20172, -37618=>20173, -37619=>20174, -37620=>20175, -37621=>20176, -37623=>20177, -37625=>20178, -37626=>20179, -37627=>20180, -37629=>20181, -37630=>20182, -37631=>20183, -37632=>20184, -37634=>20185, -37635=>20186, -37636=>20187, -37637=>20188, -37641=>20189, -37642=>20190, -37643=>20191, -37644=>20192, -37645=>20193, -37646=>20194, -37647=>20195, -37649=>20196, -37651=>20197, -37652=>20198, -37654=>20199, -37655=>20200, -37660=>20201, -37661=>20202, -37662=>20203, -37665=>20204, -37667=>20205, -37668=>20206, -37669=>20207, -37671=>20208, -37673=>20209, -37674=>20210, -37676=>20211, -37677=>20212, -37680=>20213, -37681=>20214, -37684=>20215, -37685=>20216, -37687=>20217, -37689=>20218, -37690=>20219, -37691=>20220, -37692=>20221, -37693=>20222, -37695=>20223, -37698=>20224, -37700=>20225, -37701=>20226, -37704=>20227, -37705=>20228, -37706=>20229, -37708=>20230, -37710=>20231, -37711=>20232, -37712=>20233, -37713=>20234, -37714=>20235, -37715=>20236, -37717=>20237, -37718=>20238, -37719=>20239, -37721=>20240, -37722=>20241, -37724=>20242, -37725=>20243, -37726=>20244, -37727=>20245, -37728=>20246, -37729=>20247, -37730=>20248, -37731=>20249, -37734=>20250, -37735=>20251, -37736=>20252, -37739=>20253, -37741=>20254, -37742=>20255, -37743=>20256, -37745=>20257, -37746=>20258, -37747=>20259, -37748=>20260, -37751=>20261, -37752=>20262, -37753=>20263, -37755=>20264, -37756=>20265, -37757=>20266, -37759=>20267, -37760=>20268, -37761=>20269, -37763=>20270, -37765=>20271, -37766=>20272, -37768=>20273, -37769=>20274, -37771=>20275, -37772=>20276, -37773=>20277, -37774=>20278, -37776=>20279, -37777=>20280, -37778=>20281, -37779=>20282, -37780=>20283, -37781=>20284, -37783=>20285, -37785=>20286, -37786=>20287, -37787=>20288, -37788=>20289, -37789=>20290, -37790=>20291, -37791=>20292, -37792=>20293, -37793=>20294, -37796=>20295, -37797=>20296, -37800=>20297, -37803=>20298, -37805=>20299, -37807=>20300, -37809=>20301, -37810=>20302, -37812=>20303, -37814=>20304, -37815=>20305, -37817=>20306, -37818=>20307, -37819=>20308, -37820=>20309, -37821=>20310, -37822=>20311, -37824=>20312, -37825=>20313, -37826=>20314, -37828=>20315, -37829=>20316, -37830=>20317, -37833=>20318, -37835=>20319, -37838=>20320, -37839=>20321, -37840=>20322, -37842=>20323, -37843=>20324, -37844=>20325, -37845=>20326, -37849=>20327, -37850=>20328, -37851=>20329, -37856=>20330, -37859=>20331, -37861=>20332, -37862=>20333, -37863=>20334, -37865=>20335, -37866=>20336, -37867=>20337, -37868=>20338, -37869=>20339, -37870=>20340, -37871=>20341, -37872=>20342, -37873=>20343, -37874=>20344, -37875=>20345, -37876=>20346, -37878=>20347, -37880=>20348, -37882=>20349, -37883=>20350, -37884=>20351, -37885=>20352, -37886=>20353, -37887=>20354, -37888=>20355, -37889=>20356, -37890=>20357, -37892=>20358, -37893=>20359, -37894=>20360, -37895=>20361, -37896=>20362, -37897=>20363, -37898=>20364, -37900=>20365, -37901=>20366, -37902=>20367, -37903=>20368, -37905=>20369, -37909=>20370, -37910=>20371, -37911=>20372, -37914=>20373, -37915=>20374, -37916=>20375, -37918=>20376, -37919=>20377, -37921=>20378, -37922=>20379, -37923=>20380, -37924=>20381, -37925=>20382, -37929=>20383, -37930=>20384, -37931=>20385, -37932=>20386, -37933=>20387, -37935=>20388, -37936=>20389, -37937=>20390, -37940=>20391, -37942=>20392, -37943=>20393, -37945=>20394, -37947=>20395, -37948=>20396, -37949=>20397, -37952=>20398, -37953=>20399, -37954=>20400, -37955=>20401, -37957=>20402, -37958=>20403, -37959=>20404, -37960=>20405, -37961=>20406, -37963=>20407, -37965=>20408, -37966=>20409, -37967=>20410, -37968=>20411, -37969=>20412, -37971=>20413, -37973=>20414, -37974=>20415, -37975=>20416, -37976=>20417, -37977=>20418, -37978=>20419, -37979=>20420, -37980=>20421, -37981=>20422, -37982=>20423, -37983=>20424, -37985=>20425, -37986=>20426, -37988=>20427, -37990=>20428, -37991=>20429, -37992=>20430, -37993=>20431, -37994=>20432, -37996=>20433, -37998=>20434, -37999=>20435, -38001=>20436, -38003=>20437, -38004=>20438, -38005=>20439, -38006=>20440, -38008=>20441, -38010=>20442, -38011=>20443, -38016=>20444, -38017=>20445, -38018=>20446, -38019=>20447, -38020=>20448, -38033=>20449, -38038=>20450, -38040=>20451, -38087=>20452, -38095=>20453, -38099=>20454, -38100=>20455, -38106=>20456, -38118=>20457, -38139=>20458, -38172=>20459, -38176=>20460, -38183=>20461, -38195=>20462, -38205=>20463, -38211=>20464, -38216=>20465, -38219=>20466, -38229=>20467, -38234=>20468, -38240=>20469, -38254=>20470, -38260=>20471, -38261=>20472, -38264=>20473, -38265=>20474, -38266=>20475, -38267=>20476, -38268=>20477, -38269=>20478, -38270=>20479, -38273=>20480, -38276=>20481, -38277=>20482, -38279=>20483, -38280=>20484, -38282=>20485, -38285=>20486, -38288=>20487, -38290=>20488, -38293=>20489, -38294=>20490, -38295=>20491, -38297=>20492, -38298=>20493, -38299=>20494, -38300=>20495, -38301=>20496, -38302=>20497, -38303=>20498, -38304=>20499, -38306=>20500, -38310=>20501, -38311=>20502, -38314=>20503, -38318=>20504, -38319=>20505, -38320=>20506, -38321=>20507, -38323=>20508, -38324=>20509, -38325=>20510, -38327=>20511, -38328=>20512, -38330=>20513, -38336=>20514, -38337=>20515, -38338=>20516, -38340=>20517, -38341=>20518, -38343=>20519, -38345=>20520, -38349=>20521, -38350=>20522, -38351=>20523, -38353=>20524, -38354=>20525, -38355=>20526, -38359=>20527, -38360=>20528, -38361=>20529, -38362=>20530, -38363=>20531, -38365=>20532, -38367=>20533, -38368=>20534, -38371=>20535, -38372=>20536, -38374=>20537, -38375=>20538, -38380=>20539, -38399=>20540, -38407=>20541, -38419=>20542, -38424=>20543, -38427=>20544, -38430=>20545, -38432=>20546, -38435=>20547, -38436=>20548, -38437=>20549, -38438=>20550, -38439=>20551, -38440=>20552, -38441=>20553, -38443=>20554, -38444=>20555, -38445=>20556, -38447=>20557, -38448=>20558, -38455=>20559, -38456=>20560, -38457=>20561, -38458=>20562, -38462=>20563, -38465=>20564, -38467=>20565, -38474=>20566, -38478=>20567, -38479=>20568, -38481=>20569, -38482=>20570, -38483=>20571, -38486=>20572, -38487=>20573, -38489=>20574, -38490=>20575, -38492=>20576, -38494=>20577, -38496=>20578, -38501=>20579, -38502=>20580, -38507=>20581, -38509=>20582, -38510=>20583, -38511=>20584, -38513=>20585, -38521=>20586, -38522=>20587, -38523=>20588, -38524=>20589, -38526=>20590, -38527=>20591, -38528=>20592, -38529=>20593, -38530=>20594, -38531=>20595, -38532=>20596, -38535=>20597, -38537=>20598, -38540=>20599, -38545=>20600, -38546=>20601, -38547=>20602, -38550=>20603, -38554=>20604, -38557=>20605, -38558=>20606, -38559=>20607, -38560=>20608, -38561=>20609, -38562=>20610, -63985=>20611, -38563=>20611, -38564=>20612, -38565=>20613, -38566=>20614, -38569=>20615, -38571=>20616, -38572=>20617, -38573=>20618, -38574=>20619, -38575=>20620, -38578=>20621, -38581=>20622, -38583=>20623, -38586=>20624, -38591=>20625, -38594=>20626, -38595=>20627, -38600=>20628, -38602=>20629, -38603=>20630, -38608=>20631, -38609=>20632, -38611=>20633, -38612=>20634, -38615=>20635, -38616=>20636, -38618=>20637, -38621=>20638, -38622=>20639, -38623=>20640, -38625=>20641, -38628=>20642, -38629=>20643, -38630=>20644, -38631=>20645, -38635=>20646, -38636=>20647, -38637=>20648, -38638=>20649, -38640=>20650, -38641=>20651, -38644=>20652, -38645=>20653, -38648=>20654, -38650=>20655, -38652=>20656, -38653=>20657, -38655=>20658, -38658=>20659, -38659=>20660, -38661=>20661, -38666=>20662, -38667=>20663, -38668=>20664, -38672=>20665, -38673=>20666, -38674=>20667, -38676=>20668, -38677=>20669, -38679=>20670, -38680=>20671, -38681=>20672, -38682=>20673, -38683=>20674, -38685=>20675, -38687=>20676, -38688=>20677, -38689=>20678, -38690=>20679, -38691=>20680, -38692=>20681, -38693=>20682, -38694=>20683, -38696=>20684, -38697=>20685, -38699=>20686, -38700=>20687, -38702=>20688, -38703=>20689, -38705=>20690, -38707=>20691, -38708=>20692, -38709=>20693, -38710=>20694, -38711=>20695, -38714=>20696, -38715=>20697, -38716=>20698, -38719=>20699, -38720=>20700, -38721=>20701, -38723=>20702, -38725=>20703, -38726=>20704, -38727=>20705, -38729=>20706, -38730=>20707, -38731=>20708, -38732=>20709, -38733=>20710, -38734=>20711, -38735=>20712, -38736=>20713, -12205=>20714, -38737=>20714, -38740=>20715, -38741=>20716, -38743=>20717, -38744=>20718, -38748=>20719, -38749=>20720, -38751=>20721, -38755=>20722, -38756=>20723, -38758=>20724, -38759=>20725, -38762=>20726, -38763=>20727, -38764=>20728, -38765=>20729, -38766=>20730, -38767=>20731, -38768=>20732, -38769=>20733, -38770=>20734, -38773=>20735, -38775=>20736, -38776=>20737, -38777=>20738, -38778=>20739, -38779=>20740, -38781=>20741, -38782=>20742, -38783=>20743, -38784=>20744, -38785=>20745, -38786=>20746, -38787=>20747, -38788=>20748, -38790=>20749, -38791=>20750, -38792=>20751, -38793=>20752, -38794=>20753, -38796=>20754, -38798=>20755, -38800=>20756, -38803=>20757, -38805=>20758, -38806=>20759, -38807=>20760, -38809=>20761, -38810=>20762, -38811=>20763, -38812=>20764, -38813=>20765, -38814=>20766, -38815=>20767, -38817=>20768, -38818=>20769, -38820=>20770, -38821=>20771, -38823=>20772, -38824=>20773, -38825=>20774, -38826=>20775, -38828=>20776, -38830=>20777, -38832=>20778, -38833=>20779, -38835=>20780, -38837=>20781, -38838=>20782, -38839=>20783, -38840=>20784, -38841=>20785, -38842=>20786, -38843=>20787, -38844=>20788, -38846=>20789, -38847=>20790, -38848=>20791, -38849=>20792, -38850=>20793, -38852=>20794, -38853=>20795, -38855=>20796, -38856=>20797, -38858=>20798, -38861=>20799, -38862=>20800, -38863=>20801, -38864=>20802, -38865=>20803, -38866=>20804, -38868=>20805, -38869=>20806, -38870=>20807, -38871=>20808, -38872=>20809, -38874=>20810, -38875=>20811, -38877=>20812, -38879=>20813, -38880=>20814, -38881=>20815, -38882=>20816, -38883=>20817, -38884=>20818, -38885=>20819, -38888=>20820, -38894=>20821, -38895=>20822, -38896=>20823, -38897=>20824, -38898=>20825, -38900=>20826, -38903=>20827, -38904=>20828, -38905=>20829, -38906=>20830, -38907=>20831, -38908=>20832, -38909=>20833, -38910=>20834, -38912=>20835, -38916=>20836, -38921=>20837, -38923=>20838, -38925=>20839, -38932=>20840, -38933=>20841, -38934=>20842, -38937=>20843, -38938=>20844, -38939=>20845, -38941=>20846, -38942=>20847, -38943=>20848, -38944=>20849, -38946=>20850, -38947=>20851, -38949=>20852, -38951=>20853, -38952=>20854, -38953=>20855, -38954=>20856, -38955=>20857, -38956=>20858, -38958=>20859, -38959=>20860, -38961=>20861, -38962=>20862, -38963=>20863, -38964=>20864, -38965=>20865, -38966=>20866, -38969=>20867, -38970=>20868, -38972=>20869, -38974=>20870, -38975=>20871, -38976=>20872, -38977=>20873, -38978=>20874, -38979=>20875, -38980=>20876, -38981=>20877, -38983=>20878, -38984=>20879, -38985=>20880, -38986=>20881, -38987=>20882, -38991=>20883, -38992=>20884, -38993=>20885, -38994=>20886, -38997=>20887, -38998=>20888, -38999=>20889, -39002=>20890, -39004=>20891, -39005=>20892, -39007=>20893, -39008=>20894, -39009=>20895, -39011=>20896, -39012=>20897, -39014=>20898, -39016=>20899, -39017=>20900, -39018=>20901, -39021=>20902, -39022=>20903, -39026=>20904, -39051=>20905, -39054=>20906, -39058=>20907, -39061=>20908, -39065=>20909, -39075=>20910, -39081=>20911, -39082=>20912, -39083=>20913, -39084=>20914, -39085=>20915, -39088=>20916, -39090=>20917, -39092=>20918, -39093=>20919, -39095=>20920, -39096=>20921, -39097=>20922, -39098=>20923, -39099=>20924, -39101=>20925, -39102=>20926, -39103=>20927, -39104=>20928, -39105=>20929, -39106=>20930, -39107=>20931, -39109=>20932, -39111=>20933, -39113=>20934, -39114=>20935, -39115=>20936, -39116=>20937, -39117=>20938, -39119=>20939, -39120=>20940, -39124=>20941, -39126=>20942, -39127=>20943, -39132=>20944, -39133=>20945, -39137=>20946, -39139=>20947, -39140=>20948, -39141=>20949, -39142=>20950, -39148=>20951, -39150=>20952, -39152=>20953, -39153=>20954, -39155=>20955, -39157=>20956, -39158=>20957, -39159=>20958, -39160=>20959, -39161=>20960, -39162=>20961, -39163=>20962, -39167=>20963, -39168=>20964, -39169=>20965, -39170=>20966, -39172=>20967, -39174=>20968, -39175=>20969, -39176=>20970, -39179=>20971, -39182=>20972, -39183=>20973, -39188=>20974, -39189=>20975, -39190=>20976, -39191=>20977, -39193=>20978, -39194=>20979, -39196=>20980, -39197=>20981, -39199=>20982, -39200=>20983, -39202=>20984, -39203=>20985, -39204=>20986, -39205=>20987, -39206=>20988, -39207=>20989, -39209=>20990, -39210=>20991, -39211=>20992, -39212=>20993, -39213=>20994, -39215=>20995, -39216=>20996, -39217=>20997, -39218=>20998, -39220=>20999, -39221=>21000, -39222=>21001, -39224=>21002, -39225=>21003, -39226=>21004, -39227=>21005, -39229=>21006, -39232=>21007, -39233=>21008, -39234=>21009, -39236=>21010, -39238=>21011, -39239=>21012, -39245=>21013, -39246=>21014, -39247=>21015, -39248=>21016, -39251=>21017, -39254=>21018, -39256=>21019, -39257=>21020, -39258=>21021, -39259=>21022, -39261=>21023, -39263=>21024, -39264=>21025, -39265=>21026, -39268=>21027, -39270=>21028, -39283=>21029, -39288=>21030, -39289=>21031, -39291=>21032, -39294=>21033, -39298=>21034, -39299=>21035, -39305=>21036, -39308=>21037, -39310=>21038, -39322=>21039, -39323=>21040, -39324=>21041, -39325=>21042, -39326=>21043, -39327=>21044, -39328=>21045, -39329=>21046, -39330=>21047, -39331=>21048, -39332=>21049, -39334=>21050, -39335=>21051, -39337=>21052, -39338=>21053, -39339=>21054, -39343=>21055, -39344=>21056, -39346=>21057, -39349=>21058, -39350=>21059, -39351=>21060, -39352=>21061, -39353=>21062, -39354=>21063, -39355=>21064, -39356=>21065, -39357=>21066, -39358=>21067, -39359=>21068, -39360=>21069, -39362=>21070, -39363=>21071, -39364=>21072, -39365=>21073, -39366=>21074, -39367=>21075, -39368=>21076, -39369=>21077, -39370=>21078, -39371=>21079, -39372=>21080, -39373=>21081, -39374=>21082, -39375=>21083, -39379=>21084, -39382=>21085, -39383=>21086, -39386=>21087, -39388=>21088, -39390=>21089, -39392=>21090, -39395=>21091, -39396=>21092, -39397=>21093, -39398=>21094, -39399=>21095, -39400=>21096, -39401=>21097, -39402=>21098, -39403=>21099, -39404=>21100, -39406=>21101, -39407=>21102, -39408=>21103, -39410=>21104, -39411=>21105, -39412=>21106, -39413=>21107, -39414=>21108, -39415=>21109, -39416=>21110, -39417=>21111, -39418=>21112, -39419=>21113, -39420=>21114, -39421=>21115, -39422=>21116, -39424=>21117, -39426=>21118, -39427=>21119, -39428=>21120, -39430=>21121, -39431=>21122, -39432=>21123, -39433=>21124, -39434=>21125, -39435=>21126, -39436=>21127, -39440=>21128, -39441=>21129, -39442=>21130, -39443=>21131, -39444=>21132, -39445=>21133, -39447=>21134, -39448=>21135, -39450=>21136, -39451=>21137, -39452=>21138, -39453=>21139, -39454=>21140, -39455=>21141, -39456=>21142, -39457=>21143, -39458=>21144, -39459=>21145, -39460=>21146, -39461=>21147, -39462=>21148, -39463=>21149, -39464=>21150, -39465=>21151, -39466=>21152, -39468=>21153, -39471=>21154, -39473=>21155, -39474=>21156, -39475=>21157, -39476=>21158, -39477=>21159, -39481=>21160, -39482=>21161, -39483=>21162, -39484=>21163, -39485=>21164, -39487=>21165, -39494=>21166, -39495=>21167, -39496=>21168, -39497=>21169, -39499=>21170, -39500=>21171, -39502=>21172, -39504=>21173, -39505=>21174, -39506=>21175, -39507=>21176, -39508=>21177, -39510=>21178, -39512=>21179, -39513=>21180, -39516=>21181, -39517=>21182, -39518=>21183, -39520=>21184, -39521=>21185, -39523=>21186, -39526=>21187, -39527=>21188, -39528=>21189, -39529=>21190, -39531=>21191, -39538=>21192, -39555=>21193, -39561=>21194, -39565=>21195, -39566=>21196, -39572=>21197, -39573=>21198, -39577=>21199, -39590=>21200, -39593=>21201, -39594=>21202, -39595=>21203, -39596=>21204, -39597=>21205, -39598=>21206, -39602=>21207, -39603=>21208, -39604=>21209, -39605=>21210, -39609=>21211, -39611=>21212, -39613=>21213, -39614=>21214, -39615=>21215, -39619=>21216, -39620=>21217, -39622=>21218, -39623=>21219, -39624=>21220, -39625=>21221, -39626=>21222, -39629=>21223, -39630=>21224, -39632=>21225, -39639=>21226, -39641=>21227, -39642=>21228, -39643=>21229, -39644=>21230, -39645=>21231, -39646=>21232, -39648=>21233, -39650=>21234, -39651=>21235, -39652=>21236, -39653=>21237, -39655=>21238, -39656=>21239, -39657=>21240, -39658=>21241, -39660=>21242, -39664=>21243, -39665=>21244, -39666=>21245, -39667=>21246, -39668=>21247, -39669=>21248, -39670=>21249, -39671=>21250, -39672=>21251, -39674=>21252, -39676=>21253, -39677=>21254, -39678=>21255, -39679=>21256, -39680=>21257, -39681=>21258, -39682=>21259, -39684=>21260, -39685=>21261, -39687=>21262, -39689=>21263, -39690=>21264, -39691=>21265, -39692=>21266, -39694=>21267, -39696=>21268, -39697=>21269, -39698=>21270, -39700=>21271, -39701=>21272, -39702=>21273, -39703=>21274, -39704=>21275, -39705=>21276, -39707=>21277, -39708=>21278, -39709=>21279, -39710=>21280, -39712=>21281, -39713=>21282, -39716=>21283, -39718=>21284, -39720=>21285, -39722=>21286, -39723=>21287, -39724=>21288, -39725=>21289, -39728=>21290, -39731=>21291, -39732=>21292, -39733=>21293, -39734=>21294, -39735=>21295, -39736=>21296, -39737=>21297, -39738=>21298, -39741=>21299, -39742=>21300, -39743=>21301, -39744=>21302, -39750=>21303, -39754=>21304, -39755=>21305, -39756=>21306, -39760=>21307, -39762=>21308, -39763=>21309, -39765=>21310, -39766=>21311, -39767=>21312, -39769=>21313, -39771=>21314, -39772=>21315, -39773=>21316, -39774=>21317, -39775=>21318, -39776=>21319, -39777=>21320, -39778=>21321, -39779=>21322, -39780=>21323, -39781=>21324, -39782=>21325, -39783=>21326, -39784=>21327, -39785=>21328, -39786=>21329, -39787=>21330, -39788=>21331, -39789=>21332, -39790=>21333, -39792=>21334, -39793=>21335, -39794=>21336, -39795=>21337, -39797=>21338, -39798=>21339, -39800=>21340, -39801=>21341, -39802=>21342, -39803=>21343, -39804=>21344, -39805=>21345, -39806=>21346, -39807=>21347, -39808=>21348, -39810=>21349, -39812=>21350, -39813=>21351, -39814=>21352, -39815=>21353, -39816=>21354, -39817=>21355, -39818=>21356, -39819=>21357, -39820=>21358, -39821=>21359, -39823=>21360, -39827=>21361, -39828=>21362, -39829=>21363, -39830=>21364, -39831=>21365, -39832=>21366, -39833=>21367, -39835=>21368, -39836=>21369, -39839=>21370, -39840=>21371, -39841=>21372, -39842=>21373, -39843=>21374, -39844=>21375, -39845=>21376, -39846=>21377, -39847=>21378, -39848=>21379, -39849=>21380, -39852=>21381, -39855=>21382, -39856=>21383, -39857=>21384, -39858=>21385, -39859=>21386, -39860=>21387, -39861=>21388, -39862=>21389, -39863=>21390, -39864=>21391, -39865=>21392, -39866=>21393, -39867=>21394, -39868=>21395, -39869=>21396, -39870=>21397, -39871=>21398, -39874=>21399, -39875=>21400, -39876=>21401, -39877=>21402, -39878=>21403, -39880=>21404, -39883=>21405, -39884=>21406, -39885=>21407, -39886=>21408, -39887=>21409, -39888=>21410, -39889=>21411, -39890=>21412, -39891=>21413, -39893=>21414, -39895=>21415, -39896=>21416, -39897=>21417, -39898=>21418, -39900=>21419, -39902=>21420, -39903=>21421, -39904=>21422, -39907=>21423, -39909=>21424, -39910=>21425, -39913=>21426, -39916=>21427, -39917=>21428, -39918=>21429, -39919=>21430, -39921=>21431, -39922=>21432, -39923=>21433, -39925=>21434, -39926=>21435, -39927=>21436, -39928=>21437, -39929=>21438, -39930=>21439, -39931=>21440, -39932=>21441, -39934=>21442, -39936=>21443, -39937=>21444, -39938=>21445, -39939=>21446, -39940=>21447, -39941=>21448, -39942=>21449, -39943=>21450, -39946=>21451, -39947=>21452, -39948=>21453, -39950=>21454, -39951=>21455, -39953=>21456, -39956=>21457, -39957=>21458, -39958=>21459, -39959=>21460, -39960=>21461, -39961=>21462, -39962=>21463, -39963=>21464, -39964=>21465, -39965=>21466, -39966=>21467, -39967=>21468, -39969=>21469, -39970=>21470, -39972=>21471, -39974=>21472, -39975=>21473, -39978=>21474, -39979=>21475, -39980=>21476, -39982=>21477, -39983=>21478, -39984=>21479, -39988=>21480, -39990=>21481, -39992=>21482, -39994=>21483, -39996=>21484, -39997=>21485, -39999=>21486, -40000=>21487, -40001=>21488, -40002=>21489, -40003=>21490, -40004=>21491, -40006=>21492, -40007=>21493, -40010=>21494, -40011=>21495, -40012=>21496, -40013=>21497, -40014=>21498, -40015=>21499, -40016=>21500, -40017=>21501, -40019=>21502, -40021=>21503, -40025=>21504, -40026=>21505, -40027=>21506, -40028=>21507, -40030=>21508, -40032=>21509, -40033=>21510, -40034=>21511, -40035=>21512, -40036=>21513, -40037=>21514, -40038=>21515, -40040=>21516, -40041=>21517, -40042=>21518, -40043=>21519, -40044=>21520, -40046=>21521, -40047=>21522, -40048=>21523, -40049=>21524, -40050=>21525, -40051=>21526, -40052=>21527, -40053=>21528, -40054=>21529, -40055=>21530, -40057=>21531, -40059=>21532, -40061=>21533, -40062=>21534, -40064=>21535, -40067=>21536, -40068=>21537, -40073=>21538, -40074=>21539, -40076=>21540, -40079=>21541, -40083=>21542, -40086=>21543, -40087=>21544, -40088=>21545, -40089=>21546, -40093=>21547, -40106=>21548, -40108=>21549, -40111=>21550, -40121=>21551, -40126=>21552, -40127=>21553, -40128=>21554, -40129=>21555, -40130=>21556, -40136=>21557, -40137=>21558, -40145=>21559, -40146=>21560, -40154=>21561, -40155=>21562, -40160=>21563, -40161=>21564, -40163=>21565, -40164=>21566, -40166=>21567, -40167=>21568, -40168=>21569, -40170=>21570, -40171=>21571, -40173=>21572, -40174=>21573, -40175=>21574, -40176=>21575, -40177=>21576, -40178=>21577, -40181=>21578, -40183=>21579, -40184=>21580, -40185=>21581, -40186=>21582, -40187=>21583, -40188=>21584, -40189=>21585, -40190=>21586, -40191=>21587, -40192=>21588, -40193=>21589, -40194=>21590, -40195=>21591, -40196=>21592, -40197=>21593, -40200=>21594, -40202=>21595, -40203=>21596, -40204=>21597, -40205=>21598, -40206=>21599, -40207=>21600, -40208=>21601, -40209=>21602, -40210=>21603, -40211=>21604, -40212=>21605, -40214=>21606, -40215=>21607, -40216=>21608, -40217=>21609, -40218=>21610, -40220=>21611, -40222=>21612, -40224=>21613, -40225=>21614, -40226=>21615, -40228=>21616, -40229=>21617, -40231=>21618, -40233=>21619, -40234=>21620, -40235=>21621, -40236=>21622, -40237=>21623, -40238=>21624, -40241=>21625, -40242=>21626, -40243=>21627, -40244=>21628, -40245=>21629, -40246=>21630, -40247=>21631, -40248=>21632, -40249=>21633, -40250=>21634, -40252=>21635, -40253=>21636, -40254=>21637, -40256=>21638, -40257=>21639, -40259=>21640, -40260=>21641, -40261=>21642, -40262=>21643, -40263=>21644, -40264=>21645, -40265=>21646, -40266=>21647, -40267=>21648, -40268=>21649, -40269=>21650, -40270=>21651, -40271=>21652, -40272=>21653, -40276=>21654, -40277=>21655, -40278=>21656, -40279=>21657, -40280=>21658, -40281=>21659, -40282=>21660, -40283=>21661, -40286=>21662, -40287=>21663, -40290=>21664, -40291=>21665, -40292=>21666, -40293=>21667, -40294=>21668, -40295=>21669, -40296=>21670, -40297=>21671, -40299=>21672, -40301=>21673, -40302=>21674, -40304=>21675, -40305=>21676, -40307=>21677, -40308=>21678, -40309=>21679, -40310=>21680, -40311=>21681, -40312=>21682, -40313=>21683, -40314=>21684, -40315=>21685, -40316=>21686, -40317=>21687, -40318=>21688, -40319=>21689, -40320=>21690, -40321=>21691, -40322=>21692, -40323=>21693, -40324=>21694, -40325=>21695, -40326=>21696, -40328=>21697, -40330=>21698, -40331=>21699, -40332=>21700, -40333=>21701, -40334=>21702, -40335=>21703, -40336=>21704, -40337=>21705, -40338=>21706, -40340=>21707, -40341=>21708, -40342=>21709, -40343=>21710, -40345=>21711, -40347=>21712, -40348=>21713, -40349=>21714, -40350=>21715, -40351=>21716, -40352=>21717, -40353=>21718, -40354=>21719, -40355=>21720, -40356=>21721, -40358=>21722, -40359=>21723, -40360=>21724, -40362=>21725, -40363=>21726, -40364=>21727, -40365=>21728, -40366=>21729, -40368=>21730, -40369=>21731, -40370=>21732, -40371=>21733, -40373=>21734, -40374=>21735, -40375=>21736, -40376=>21737, -40377=>21738, -40378=>21739, -40381=>21740, -40382=>21741, -40383=>21742, -40385=>21743, -40387=>21744, -40389=>21745, -40390=>21746, -40391=>21747, -40392=>21748, -40393=>21749, -40394=>21750, -40395=>21751, -40396=>21752, -40397=>21753, -40398=>21754, -40399=>21755, -40400=>21756, -40401=>21757, -40402=>21758, -40404=>21759, -40405=>21760, -40406=>21761, -40408=>21762, -40411=>21763, -40412=>21764, -40413=>21765, -40414=>21766, -40415=>21767, -40416=>21768, -40417=>21769, -40418=>21770, -40419=>21771, -40420=>21772, -40423=>21773, -40424=>21774, -40425=>21775, -40426=>21776, -40427=>21777, -40428=>21778, -40429=>21779, -40430=>21780, -40432=>21781, -40433=>21782, -40436=>21783, -40437=>21784, -40438=>21785, -40439=>21786, -40443=>21787, -40444=>21788, -40445=>21789, -40446=>21790, -40447=>21791, -40448=>21792, -40449=>21793, -40450=>21794, -40451=>21795, -40452=>21796, -40453=>21797, -40454=>21798, -40455=>21799, -40456=>21800, -40457=>21801, -40458=>21802, -40459=>21803, -40461=>21804, -40462=>21805, -40463=>21806, -40464=>21807, -40465=>21808, -40466=>21809, -40467=>21810, -40468=>21811, -40470=>21812, -40471=>21813, -40472=>21814, -40473=>21815, -40476=>21816, -40484=>21817, -40487=>21818, -40494=>21819, -40496=>21820, -40500=>21821, -40507=>21822, -40508=>21823, -40512=>21824, -40525=>21825, -40528=>21826, -40530=>21827, -40531=>21828, -40532=>21829, -40534=>21830, -40537=>21831, -40541=>21832, -40543=>21833, -40544=>21834, -40545=>21835, -40546=>21836, -40549=>21837, -40558=>21838, -40559=>21839, -40562=>21840, -40564=>21841, -40566=>21842, -40567=>21843, -40568=>21844, -40571=>21845, -40576=>21846, -40577=>21847, -40579=>21848, -40580=>21849, -40581=>21850, -40582=>21851, -40585=>21852, -40586=>21853, -40588=>21854, -40589=>21855, -40590=>21856, -40591=>21857, -40592=>21858, -40593=>21859, -40596=>21860, -40597=>21861, -40598=>21862, -40600=>21863, -40601=>21864, -40602=>21865, -40603=>21866, -40604=>21867, -40606=>21868, -40608=>21869, -40609=>21870, -40610=>21871, -40611=>21872, -40612=>21873, -40615=>21874, -40616=>21875, -40618=>21876, -40619=>21877, -40620=>21878, -40621=>21879, -40622=>21880, -40624=>21881, -40625=>21882, -40626=>21883, -40627=>21884, -40630=>21885, -40631=>21886, -40633=>21887, -40634=>21888, -40636=>21889, -40639=>21890, -40640=>21891, -40641=>21892, -40642=>21893, -12232=>21894, -40643=>21894, -40645=>21895, -40646=>21896, -40647=>21897, -40648=>21898, -40650=>21899, -40651=>21900, -40656=>21901, -40658=>21902, -40659=>21903, -40661=>21904, -40662=>21905, -40663=>21906, -40665=>21907, -40666=>21908, -40673=>21909, -40675=>21910, -40676=>21911, -40678=>21912, -40683=>21913, -40684=>21914, -40685=>21915, -40686=>21916, -40688=>21917, -40689=>21918, -40691=>21919, -40693=>21920, -40694=>21921, -40696=>21922, -40698=>21923, -40704=>21924, -40705=>21925, -40706=>21926, -40707=>21927, -40708=>21928, -40709=>21929, -40710=>21930, -40711=>21931, -40712=>21932, -40714=>21933, -40716=>21934, -40719=>21935, -40721=>21936, -40722=>21937, -40724=>21938, -40726=>21939, -40728=>21940, -40730=>21941, -40731=>21942, -40732=>21943, -40733=>21944, -40734=>21945, -40735=>21946, -40737=>21947, -40739=>21948, -40740=>21949, -40741=>21950, -40742=>21951, -40743=>21952, -40744=>21953, -40745=>21954, -40746=>21955, -40747=>21956, -40749=>21957, -40750=>21958, -40752=>21959, -40753=>21960, -40754=>21961, -40755=>21962, -40756=>21963, -40757=>21964, -40758=>21965, -40760=>21966, -40762=>21967, -40764=>21968, -40767=>21969, -40768=>21970, -40769=>21971, -40770=>21972, -40771=>21973, -40773=>21974, -40774=>21975, -40775=>21976, -40776=>21977, -40777=>21978, -40780=>21979, -40781=>21980, -40782=>21981, -40787=>21982, -40789=>21983, -40790=>21984, -40791=>21985, -40792=>21986, -40794=>21987, -40795=>21988, -40797=>21989, -40798=>21990, -40802=>21991, -40804=>21992, -40805=>21993, -40807=>21994, -40808=>21995, -40809=>21996, -40811=>21997, -40813=>21998, -40814=>21999, -40815=>22000, -40816=>22001, -40817=>22002, -40819=>22003, -40820=>22004, -40821=>22005, -40822=>22006, -40824=>22007, -40825=>22008, -40826=>22009, -40827=>22010, -40828=>22011, -40829=>22012, -40830=>22013, -40833=>22014, -40834=>22015, -40846=>22016, -40847=>22017, -40849=>22018, -40850=>22019, -40851=>22020, -40854=>22021, -40855=>22022, -40856=>22023, -40861=>22024, -40862=>22025, -40865=>22026, -40866=>22027, -40867=>22028, -40868=>22029, -40869=>22030, -63788=>22031, -64013=>22032, -64014=>22033, -64015=>22034, -64017=>22035, -64019=>22036, -64020=>22037, -64024=>22038, -64031=>22039, -64032=>22040, -64033=>22041, -64035=>22042, -64036=>22043, -64039=>22044, -64040=>22045, -64041=>22046, -11905=>22047, -59413=>22047, -131207=>22048, -59414=>22048, -131209=>22049, -59415=>22049, -131276=>22050, -59416=>22050, -11908=>22051, -59417=>22051, -13427=>22052, -59418=>22052, -13383=>22053, -59419=>22053, -11912=>22054, -59420=>22054, -11915=>22055, -59421=>22055, -40884=>22056, -59422=>22056, -13726=>22057, -59423=>22057, -13850=>22058, -59424=>22058, -13838=>22059, -59425=>22059, -11916=>22060, -59426=>22060, -11927=>22061, -59427=>22061, -14702=>22062, -59428=>22062, -14616=>22063, -59429=>22063, -40885=>22064, -59430=>22064, -14799=>22065, -59431=>22065, -14815=>22066, -59432=>22066, -14963=>22067, -59433=>22067, -14800=>22068, -59434=>22068, -40886=>22069, -59435=>22069, -40887=>22070, -59436=>22070, -15182=>22071, -59437=>22071, -15470=>22072, -59438=>22072, -15584=>22073, -59439=>22073, -11943=>22074, -59440=>22074, -136663=>22075, -59441=>22075, -40888=>22076, -59442=>22076, -11946=>22077, -59443=>22077, -16470=>22078, -59444=>22078, -16735=>22079, -59445=>22079, -11950=>22080, -59446=>22080, -17207=>22081, -59447=>22081, -11955=>22082, -59448=>22082, -11958=>22083, -59449=>22083, -11959=>22084, -59450=>22084, -141711=>22085, -59451=>22085, -17329=>22086, -59452=>22086, -17324=>22087, -59453=>22087, -11963=>22088, -59454=>22088, -17373=>22089, -59455=>22089, -17622=>22090, -59456=>22090, -18017=>22091, -59457=>22091, -17996=>22092, -59458=>22092, -40889=>22093, -132361=>22093, -59459=>22093, -18211=>22094, -59460=>22094, -18217=>22095, -59461=>22095, -18300=>22096, -59462=>22096, -18317=>22097, -59463=>22097, -11978=>22098, -59464=>22098, -18759=>22099, -59465=>22099, -18810=>22100, -59466=>22100, -18813=>22101, -59467=>22101, -18818=>22102, -59468=>22102, -18819=>22103, -59469=>22103, -18821=>22104, -59470=>22104, -18822=>22105, -59471=>22105, -18847=>22106, -59472=>22106, -18843=>22107, -59473=>22107, -18871=>22108, -59474=>22108, -18870=>22109, -59475=>22109, -40890=>22110, -133533=>22110, -59476=>22110, -147966=>22111, -59477=>22111, -19619=>22112, -59478=>22112, -19615=>22113, -59479=>22113, -19616=>22114, -59480=>22114, -19617=>22115, -59481=>22115, -19575=>22116, -59482=>22116, -19618=>22117, -59483=>22117, -19731=>22118, -59484=>22118, -19732=>22119, -59485=>22119, -19733=>22120, -59486=>22120, -19734=>22121, -59487=>22121, -19735=>22122, -59488=>22122, -19736=>22123, -59489=>22123, -19737=>22124, -59490=>22124, -19886=>22125, -59491=>22125, -40891=>22126, -59492=>22126, -8364=>22353, -59244=>22353, -165=>22354, -12351=>22357, -12436=>22375, -12535=>22390, -12537=>22391, -12536=>22392, -12538=>22393, -12339=>22395, -12340=>22396, -12341=>22397, -12344=>22398, -12345=>22399, -12346=>22400, -12586=>22401, -12587=>22402, -12588=>22403, -12704=>22404, -12705=>22405, -12706=>22406, -12707=>22407, -12708=>22408, -12709=>22409, -12710=>22410, -12711=>22411, -12712=>22412, -12713=>22413, -12714=>22414, -12715=>22415, -12716=>22416, -12717=>22417, -12718=>22418, -12719=>22419, -12720=>22420, -12721=>22421, -12722=>22422, -12723=>22423, -12724=>22424, -12725=>22425, -12726=>22426, -12727=>22427, -11904=>22428, -11906=>22429, -11907=>22430, -11909=>22431, -11910=>22432, -11911=>22433, -11913=>22434, -11914=>22435, -11917=>22436, -11918=>22437, -11919=>22438, -11920=>22439, -11921=>22440, -11922=>22441, -11923=>22442, -11924=>22443, -11925=>22444, -11926=>22445, -11928=>22446, -11929=>22447, -11931=>22448, -11932=>22449, -11933=>22450, -11934=>22451, -11935=>22452, -11936=>22453, -11937=>22454, -11938=>22455, -11939=>22456, -11940=>22457, -11941=>22458, -11942=>22459, -11944=>22460, -11945=>22461, -11947=>22462, -11948=>22463, -11949=>22464, -11951=>22465, -11952=>22466, -11953=>22467, -11954=>22468, -11956=>22469, -11957=>22470, -11960=>22471, -11961=>22472, -11962=>22473, -11964=>22474, -11965=>22475, -11966=>22476, -11967=>22477, -11968=>22478, -11969=>22479, -11970=>22480, -11971=>22481, -11972=>22482, -11973=>22483, -11974=>22484, -11975=>22485, -11976=>22486, -11977=>22487, -11979=>22488, -11980=>22489, -11981=>22490, -11982=>22491, -11983=>22492, -11984=>22493, -11985=>22494, -11986=>22495, -11987=>22496, -11988=>22497, -11989=>22498, -11990=>22499, -11991=>22500, -11992=>22501, -11993=>22502, -11994=>22503, -11995=>22504, -11996=>22505, -11997=>22506, -11998=>22507, -11999=>22508, -12000=>22509, -12001=>22510, -12002=>22511, -12003=>22512, -12004=>22513, -12005=>22514, -12006=>22515, -12007=>22516, -12008=>22517, -12009=>22518, -12010=>22519, -12011=>22520, -12012=>22521, -12013=>22522, -12014=>22523, -12015=>22524, -12016=>22525, -12017=>22526, -12018=>22527, -12019=>22528, -13312=>22529, -13313=>22530, -13314=>22531, -13315=>22532, -13316=>22533, -13317=>22534, -13318=>22535, -13319=>22536, -13320=>22537, -13321=>22538, -13322=>22539, -13323=>22540, -13324=>22541, -13325=>22542, -13326=>22543, -13327=>22544, -13328=>22545, -13329=>22546, -13330=>22547, -13331=>22548, -13332=>22549, -13333=>22550, -13334=>22551, -13335=>22552, -13336=>22553, -13337=>22554, -13338=>22555, -13339=>22556, -13340=>22557, -13341=>22558, -13342=>22559, -13343=>22560, -13344=>22561, -13345=>22562, -13346=>22563, -13347=>22564, -13348=>22565, -13349=>22566, -13350=>22567, -13351=>22568, -13352=>22569, -13353=>22570, -13354=>22571, -13355=>22572, -13356=>22573, -13357=>22574, -13358=>22575, -13359=>22576, -13360=>22577, -13361=>22578, -13362=>22579, -13363=>22580, -13364=>22581, -13365=>22582, -13366=>22583, -13367=>22584, -13368=>22585, -13369=>22586, -13370=>22587, -13371=>22588, -13372=>22589, -13373=>22590, -13374=>22591, -13375=>22592, -13376=>22593, -13377=>22594, -13378=>22595, -13379=>22596, -13380=>22597, -13381=>22598, -13382=>22599, -13384=>22600, -13385=>22601, -13386=>22602, -13387=>22603, -13388=>22604, -13389=>22605, -13390=>22606, -13391=>22607, -13392=>22608, -13393=>22609, -13394=>22610, -13395=>22611, -13396=>22612, -13397=>22613, -13398=>22614, -13399=>22615, -13400=>22616, -13401=>22617, -13402=>22618, -13403=>22619, -13404=>22620, -13405=>22621, -13406=>22622, -13407=>22623, -13408=>22624, -13409=>22625, -13410=>22626, -13411=>22627, -13412=>22628, -13413=>22629, -13414=>22630, -13415=>22631, -13416=>22632, -13417=>22633, -13418=>22634, -13419=>22635, -13420=>22636, -13421=>22637, -13422=>22638, -13423=>22639, -13424=>22640, -13425=>22641, -13426=>22642, -13428=>22643, -13429=>22644, -13430=>22645, -13431=>22646, -13432=>22647, -13433=>22648, -13434=>22649, -13435=>22650, -13436=>22651, -13437=>22652, -13438=>22653, -13439=>22654, -13440=>22655, -13441=>22656, -13442=>22657, -13443=>22658, -13444=>22659, -13445=>22660, -13446=>22661, -13447=>22662, -13448=>22663, -13449=>22664, -13450=>22665, -13451=>22666, -13452=>22667, -13453=>22668, -13454=>22669, -13455=>22670, -13456=>22671, -13457=>22672, -13458=>22673, -13459=>22674, -13460=>22675, -13461=>22676, -13462=>22677, -13463=>22678, -13464=>22679, -13465=>22680, -13466=>22681, -13467=>22682, -13468=>22683, -13469=>22684, -13470=>22685, -13471=>22686, -13472=>22687, -13473=>22688, -13474=>22689, -13475=>22690, -13476=>22691, -13477=>22692, -13478=>22693, -13479=>22694, -13480=>22695, -13481=>22696, -13482=>22697, -13483=>22698, -13484=>22699, -13485=>22700, -13486=>22701, -13487=>22702, -13488=>22703, -13489=>22704, -13490=>22705, -13491=>22706, -13492=>22707, -13493=>22708, -13494=>22709, -13495=>22710, -13496=>22711, -13497=>22712, -13498=>22713, -13499=>22714, -13500=>22715, -13501=>22716, -13502=>22717, -13503=>22718, -13504=>22719, -13505=>22720, -13506=>22721, -13507=>22722, -13508=>22723, -13509=>22724, -13510=>22725, -13511=>22726, -13512=>22727, -13513=>22728, -13514=>22729, -13515=>22730, -13516=>22731, -13517=>22732, -13518=>22733, -13519=>22734, -13520=>22735, -13521=>22736, -13522=>22737, -13523=>22738, -13524=>22739, -13525=>22740, -13526=>22741, -13527=>22742, -13528=>22743, -13529=>22744, -13530=>22745, -13531=>22746, -13532=>22747, -13533=>22748, -13534=>22749, -13535=>22750, -13536=>22751, -13537=>22752, -13538=>22753, -13539=>22754, -13540=>22755, -13541=>22756, -13542=>22757, -13543=>22758, -13544=>22759, -13545=>22760, -13546=>22761, -13547=>22762, -13548=>22763, -13549=>22764, -13550=>22765, -13551=>22766, -13552=>22767, -13553=>22768, -13554=>22769, -13555=>22770, -13556=>22771, -13557=>22772, -13558=>22773, -13559=>22774, -13560=>22775, -13561=>22776, -13562=>22777, -13563=>22778, -13564=>22779, -13565=>22780, -13566=>22781, -13567=>22782, -13568=>22783, -13569=>22784, -13570=>22785, -13571=>22786, -13572=>22787, -13573=>22788, -13574=>22789, -13575=>22790, -13576=>22791, -13577=>22792, -13578=>22793, -13579=>22794, -13580=>22795, -13581=>22796, -13582=>22797, -13583=>22798, -13584=>22799, -13585=>22800, -13586=>22801, -13587=>22802, -13588=>22803, -13589=>22804, -13590=>22805, -13591=>22806, -13592=>22807, -13593=>22808, -13594=>22809, -13595=>22810, -13596=>22811, -13597=>22812, -13598=>22813, -13599=>22814, -13600=>22815, -13601=>22816, -13602=>22817, -13603=>22818, -13604=>22819, -13605=>22820, -13606=>22821, -13607=>22822, -13608=>22823, -13609=>22824, -13610=>22825, -13611=>22826, -13612=>22827, -13613=>22828, -13614=>22829, -13615=>22830, -13616=>22831, -13617=>22832, -13618=>22833, -13619=>22834, -13620=>22835, -13621=>22836, -13622=>22837, -13623=>22838, -13624=>22839, -13625=>22840, -13626=>22841, -13627=>22842, -13628=>22843, -13629=>22844, -13630=>22845, -13631=>22846, -13632=>22847, -13633=>22848, -13634=>22849, -13635=>22850, -13636=>22851, -13637=>22852, -13638=>22853, -13639=>22854, -13640=>22855, -13641=>22856, -13642=>22857, -13643=>22858, -13644=>22859, -13645=>22860, -13646=>22861, -13647=>22862, -13648=>22863, -13649=>22864, -13650=>22865, -13651=>22866, -13652=>22867, -13653=>22868, -13654=>22869, -13655=>22870, -13656=>22871, -13657=>22872, -13658=>22873, -13659=>22874, -13660=>22875, -13661=>22876, -13662=>22877, -13663=>22878, -13664=>22879, -13665=>22880, -13666=>22881, -13667=>22882, -13668=>22883, -13669=>22884, -13670=>22885, -13671=>22886, -13672=>22887, -13673=>22888, -13674=>22889, -13675=>22890, -13676=>22891, -13677=>22892, -13678=>22893, -13679=>22894, -13680=>22895, -13681=>22896, -13682=>22897, -13683=>22898, -13684=>22899, -13685=>22900, -13686=>22901, -13687=>22902, -13688=>22903, -13689=>22904, -13690=>22905, -13691=>22906, -13692=>22907, -13693=>22908, -13694=>22909, -13695=>22910, -13696=>22911, -13697=>22912, -13698=>22913, -13699=>22914, -13700=>22915, -13701=>22916, -13702=>22917, -13703=>22918, -13704=>22919, -13705=>22920, -13706=>22921, -13707=>22922, -13708=>22923, -13709=>22924, -13710=>22925, -13711=>22926, -13712=>22927, -13713=>22928, -13714=>22929, -13715=>22930, -13716=>22931, -13717=>22932, -13718=>22933, -13719=>22934, -13720=>22935, -13721=>22936, -13722=>22937, -13723=>22938, -13724=>22939, -13725=>22940, -13727=>22941, -13728=>22942, -13729=>22943, -13730=>22944, -13731=>22945, -13732=>22946, -13733=>22947, -13734=>22948, -13735=>22949, -13736=>22950, -13737=>22951, -13738=>22952, -13739=>22953, -13740=>22954, -13741=>22955, -13742=>22956, -13743=>22957, -13744=>22958, -13745=>22959, -13746=>22960, -13747=>22961, -13748=>22962, -13749=>22963, -13750=>22964, -13751=>22965, -13752=>22966, -13753=>22967, -13754=>22968, -13755=>22969, -13756=>22970, -13757=>22971, -13758=>22972, -13759=>22973, -13760=>22974, -13761=>22975, -13762=>22976, -13763=>22977, -13764=>22978, -13765=>22979, -13766=>22980, -13767=>22981, -13768=>22982, -13769=>22983, -13770=>22984, -13771=>22985, -13772=>22986, -13773=>22987, -13774=>22988, -13775=>22989, -13776=>22990, -13777=>22991, -13778=>22992, -13779=>22993, -13780=>22994, -13781=>22995, -13782=>22996, -13783=>22997, -13784=>22998, -13785=>22999, -13786=>23000, -13787=>23001, -13788=>23002, -13789=>23003, -13790=>23004, -13791=>23005, -13792=>23006, -13793=>23007, -13794=>23008, -13795=>23009, -13796=>23010, -13797=>23011, -13798=>23012, -13799=>23013, -13800=>23014, -13801=>23015, -13802=>23016, -13803=>23017, -13804=>23018, -13805=>23019, -13806=>23020, -13807=>23021, -13808=>23022, -13809=>23023, -13810=>23024, -13811=>23025, -13812=>23026, -13813=>23027, -13814=>23028, -13815=>23029, -13816=>23030, -13817=>23031, -13818=>23032, -13819=>23033, -13820=>23034, -13821=>23035, -13822=>23036, -13823=>23037, -13824=>23038, -13825=>23039, -13826=>23040, -13827=>23041, -13828=>23042, -13829=>23043, -13830=>23044, -13831=>23045, -13832=>23046, -13833=>23047, -13834=>23048, -13835=>23049, -13836=>23050, -13837=>23051, -13839=>23052, -13840=>23053, -13841=>23054, -13842=>23055, -13843=>23056, -13844=>23057, -13845=>23058, -13846=>23059, -13847=>23060, -13848=>23061, -13849=>23062, -13851=>23063, -13852=>23064, -13853=>23065, -13854=>23066, -13855=>23067, -13856=>23068, -13857=>23069, -13858=>23070, -13859=>23071, -13860=>23072, -13861=>23073, -13862=>23074, -13863=>23075, -13864=>23076, -13865=>23077, -13866=>23078, -13867=>23079, -13868=>23080, -13869=>23081, -13870=>23082, -13871=>23083, -13872=>23084, -13873=>23085, -13874=>23086, -13875=>23087, -13876=>23088, -13877=>23089, -13878=>23090, -13879=>23091, -13880=>23092, -13881=>23093, -13882=>23094, -13883=>23095, -13884=>23096, -13885=>23097, -13886=>23098, -13887=>23099, -13888=>23100, -13889=>23101, -13890=>23102, -13891=>23103, -13892=>23104, -13893=>23105, -13894=>23106, -13895=>23107, -13896=>23108, -13897=>23109, -13898=>23110, -13899=>23111, -13900=>23112, -13901=>23113, -13902=>23114, -13903=>23115, -13904=>23116, -13905=>23117, -13906=>23118, -13907=>23119, -13908=>23120, -13909=>23121, -13910=>23122, -13911=>23123, -13912=>23124, -13913=>23125, -13914=>23126, -13915=>23127, -13916=>23128, -13917=>23129, -13918=>23130, -13919=>23131, -13920=>23132, -13921=>23133, -13922=>23134, -13923=>23135, -13924=>23136, -13925=>23137, -13926=>23138, -13927=>23139, -13928=>23140, -13929=>23141, -13930=>23142, -13931=>23143, -13932=>23144, -13933=>23145, -13934=>23146, -13935=>23147, -13936=>23148, -13937=>23149, -13938=>23150, -13939=>23151, -13940=>23152, -13941=>23153, -13942=>23154, -13943=>23155, -13944=>23156, -13945=>23157, -13946=>23158, -13947=>23159, -13948=>23160, -13949=>23161, -13950=>23162, -13951=>23163, -13952=>23164, -13953=>23165, -13954=>23166, -13955=>23167, -13956=>23168, -13957=>23169, -13958=>23170, -13959=>23171, -13960=>23172, -13961=>23173, -13962=>23174, -13963=>23175, -13964=>23176, -13965=>23177, -13966=>23178, -13967=>23179, -13968=>23180, -13969=>23181, -13970=>23182, -13971=>23183, -13972=>23184, -13973=>23185, -13974=>23186, -13975=>23187, -13976=>23188, -13977=>23189, -13978=>23190, -13979=>23191, -13980=>23192, -13981=>23193, -13982=>23194, -13983=>23195, -13984=>23196, -13985=>23197, -13986=>23198, -13987=>23199, -13988=>23200, -13989=>23201, -13990=>23202, -13991=>23203, -13992=>23204, -13993=>23205, -13994=>23206, -13995=>23207, -13996=>23208, -13997=>23209, -13998=>23210, -13999=>23211, -14000=>23212, -14001=>23213, -14002=>23214, -14003=>23215, -14004=>23216, -14005=>23217, -14006=>23218, -14007=>23219, -14008=>23220, -14009=>23221, -14010=>23222, -14011=>23223, -14012=>23224, -14013=>23225, -14014=>23226, -14015=>23227, -14016=>23228, -14017=>23229, -14018=>23230, -14019=>23231, -14020=>23232, -14021=>23233, -14022=>23234, -14023=>23235, -14024=>23236, -14025=>23237, -14026=>23238, -14027=>23239, -14028=>23240, -14029=>23241, -14030=>23242, -14031=>23243, -14032=>23244, -14033=>23245, -14034=>23246, -14035=>23247, -14036=>23248, -14037=>23249, -14038=>23250, -14039=>23251, -14040=>23252, -14041=>23253, -14042=>23254, -14043=>23255, -14044=>23256, -14045=>23257, -14046=>23258, -14047=>23259, -14048=>23260, -14049=>23261, -14050=>23262, -14051=>23263, -14052=>23264, -14053=>23265, -14054=>23266, -14055=>23267, -14056=>23268, -14057=>23269, -14058=>23270, -14059=>23271, -14060=>23272, -14061=>23273, -14062=>23274, -14063=>23275, -14064=>23276, -14065=>23277, -14066=>23278, -14067=>23279, -14068=>23280, -14069=>23281, -14070=>23282, -14071=>23283, -14072=>23284, -14073=>23285, -14074=>23286, -14075=>23287, -14076=>23288, -14077=>23289, -14078=>23290, -14079=>23291, -14080=>23292, -14081=>23293, -14082=>23294, -14083=>23295, -14084=>23296, -14085=>23297, -14086=>23298, -14087=>23299, -14088=>23300, -14089=>23301, -14090=>23302, -14091=>23303, -14092=>23304, -14093=>23305, -14094=>23306, -14095=>23307, -14096=>23308, -14097=>23309, -14098=>23310, -14099=>23311, -14100=>23312, -14101=>23313, -14102=>23314, -14103=>23315, -14104=>23316, -14105=>23317, -14106=>23318, -14107=>23319, -14108=>23320, -14109=>23321, -14110=>23322, -14111=>23323, -14112=>23324, -14113=>23325, -14114=>23326, -14115=>23327, -14116=>23328, -14117=>23329, -14118=>23330, -14119=>23331, -14120=>23332, -14121=>23333, -14122=>23334, -14123=>23335, -14124=>23336, -14125=>23337, -14126=>23338, -14127=>23339, -14128=>23340, -14129=>23341, -14130=>23342, -14131=>23343, -14132=>23344, -14133=>23345, -14134=>23346, -14135=>23347, -14136=>23348, -14137=>23349, -14138=>23350, -14139=>23351, -14140=>23352, -14141=>23353, -14142=>23354, -14143=>23355, -14144=>23356, -14145=>23357, -14146=>23358, -14147=>23359, -14148=>23360, -14149=>23361, -14150=>23362, -14151=>23363, -14152=>23364, -14153=>23365, -14154=>23366, -14155=>23367, -14156=>23368, -14157=>23369, -14158=>23370, -14159=>23371, -14160=>23372, -14161=>23373, -14162=>23374, -14163=>23375, -14164=>23376, -14165=>23377, -14166=>23378, -14167=>23379, -14168=>23380, -14169=>23381, -14170=>23382, -14171=>23383, -14172=>23384, -14173=>23385, -14174=>23386, -14175=>23387, -14176=>23388, -14177=>23389, -14178=>23390, -14179=>23391, -14180=>23392, -14181=>23393, -14182=>23394, -14183=>23395, -14184=>23396, -14185=>23397, -14186=>23398, -14187=>23399, -14188=>23400, -14189=>23401, -14190=>23402, -14191=>23403, -14192=>23404, -14193=>23405, -14194=>23406, -14195=>23407, -14196=>23408, -14197=>23409, -14198=>23410, -14199=>23411, -14200=>23412, -14201=>23413, -14202=>23414, -14203=>23415, -14204=>23416, -14205=>23417, -14206=>23418, -14207=>23419, -14208=>23420, -14209=>23421, -14210=>23422, -14211=>23423, -14212=>23424, -14213=>23425, -14214=>23426, -14215=>23427, -14216=>23428, -14217=>23429, -14218=>23430, -14219=>23431, -14220=>23432, -14221=>23433, -14222=>23434, -14223=>23435, -14224=>23436, -14225=>23437, -14226=>23438, -14227=>23439, -14228=>23440, -14229=>23441, -14230=>23442, -14231=>23443, -14232=>23444, -14233=>23445, -14234=>23446, -14235=>23447, -14236=>23448, -14237=>23449, -14238=>23450, -14239=>23451, -14240=>23452, -14241=>23453, -14242=>23454, -14243=>23455, -14244=>23456, -14245=>23457, -14246=>23458, -14247=>23459, -14248=>23460, -14249=>23461, -14250=>23462, -14251=>23463, -14252=>23464, -14253=>23465, -14254=>23466, -14255=>23467, -14256=>23468, -14257=>23469, -14258=>23470, -14259=>23471, -14260=>23472, -14261=>23473, -14262=>23474, -14263=>23475, -14264=>23476, -14265=>23477, -14266=>23478, -14267=>23479, -14268=>23480, -14269=>23481, -14270=>23482, -14271=>23483, -14272=>23484, -14273=>23485, -14274=>23486, -14275=>23487, -14276=>23488, -14277=>23489, -14278=>23490, -14279=>23491, -14280=>23492, -14281=>23493, -14282=>23494, -14283=>23495, -14284=>23496, -14285=>23497, -14286=>23498, -14287=>23499, -14288=>23500, -14289=>23501, -14290=>23502, -14291=>23503, -14292=>23504, -14293=>23505, -14294=>23506, -14295=>23507, -14296=>23508, -14297=>23509, -14298=>23510, -14299=>23511, -14300=>23512, -14301=>23513, -14302=>23514, -14303=>23515, -14304=>23516, -14305=>23517, -14306=>23518, -14307=>23519, -14308=>23520, -14309=>23521, -14310=>23522, -14311=>23523, -14312=>23524, -14313=>23525, -14314=>23526, -14315=>23527, -14316=>23528, -14317=>23529, -14318=>23530, -14319=>23531, -14320=>23532, -14321=>23533, -14322=>23534, -14323=>23535, -14324=>23536, -14325=>23537, -14326=>23538, -14327=>23539, -14328=>23540, -14329=>23541, -14330=>23542, -14331=>23543, -14332=>23544, -14333=>23545, -14334=>23546, -14335=>23547, -14336=>23548, -14337=>23549, -14338=>23550, -14339=>23551, -14340=>23552, -14341=>23553, -14342=>23554, -14343=>23555, -14344=>23556, -14345=>23557, -14346=>23558, -14347=>23559, -14348=>23560, -14349=>23561, -14350=>23562, -14351=>23563, -14352=>23564, -14353=>23565, -14354=>23566, -14355=>23567, -14356=>23568, -14357=>23569, -14358=>23570, -14359=>23571, -14360=>23572, -14361=>23573, -14362=>23574, -14363=>23575, -14364=>23576, -14365=>23577, -14366=>23578, -14367=>23579, -14368=>23580, -14369=>23581, -14370=>23582, -14371=>23583, -14372=>23584, -14373=>23585, -14374=>23586, -14375=>23587, -14376=>23588, -14377=>23589, -14378=>23590, -14379=>23591, -14380=>23592, -14381=>23593, -14382=>23594, -14383=>23595, -14384=>23596, -14385=>23597, -14386=>23598, -14387=>23599, -14388=>23600, -14389=>23601, -14390=>23602, -14391=>23603, -14392=>23604, -14393=>23605, -14394=>23606, -14395=>23607, -14396=>23608, -14397=>23609, -14398=>23610, -14399=>23611, -14400=>23612, -14401=>23613, -14402=>23614, -14403=>23615, -14404=>23616, -14405=>23617, -14406=>23618, -14407=>23619, -14408=>23620, -14409=>23621, -14410=>23622, -14411=>23623, -14412=>23624, -14413=>23625, -14414=>23626, -14415=>23627, -14416=>23628, -14417=>23629, -14418=>23630, -14419=>23631, -14420=>23632, -14421=>23633, -14422=>23634, -14423=>23635, -14424=>23636, -14425=>23637, -14426=>23638, -14427=>23639, -14428=>23640, -14429=>23641, -14430=>23642, -14431=>23643, -14432=>23644, -14433=>23645, -14434=>23646, -14435=>23647, -14436=>23648, -14437=>23649, -14438=>23650, -14439=>23651, -14440=>23652, -14441=>23653, -14442=>23654, -14443=>23655, -14444=>23656, -14445=>23657, -14446=>23658, -14447=>23659, -14448=>23660, -14449=>23661, -14450=>23662, -14451=>23663, -14452=>23664, -14453=>23665, -14454=>23666, -14455=>23667, -14456=>23668, -14457=>23669, -14458=>23670, -14459=>23671, -14460=>23672, -14461=>23673, -14462=>23674, -14463=>23675, -14464=>23676, -14465=>23677, -14466=>23678, -14467=>23679, -14468=>23680, -14469=>23681, -14470=>23682, -14471=>23683, -14472=>23684, -14473=>23685, -14474=>23686, -14475=>23687, -14476=>23688, -14477=>23689, -14478=>23690, -14479=>23691, -14480=>23692, -14481=>23693, -14482=>23694, -14483=>23695, -14484=>23696, -14485=>23697, -14486=>23698, -14487=>23699, -14488=>23700, -14489=>23701, -14490=>23702, -14491=>23703, -14492=>23704, -14493=>23705, -14494=>23706, -14495=>23707, -14496=>23708, -14497=>23709, -14498=>23710, -14499=>23711, -14500=>23712, -14501=>23713, -14502=>23714, -14503=>23715, -14504=>23716, -14505=>23717, -14506=>23718, -14507=>23719, -14508=>23720, -14509=>23721, -14510=>23722, -14511=>23723, -14512=>23724, -14513=>23725, -14514=>23726, -14515=>23727, -14516=>23728, -14517=>23729, -14518=>23730, -14519=>23731, -14520=>23732, -14521=>23733, -14522=>23734, -14523=>23735, -14524=>23736, -14525=>23737, -14526=>23738, -14527=>23739, -14528=>23740, -14529=>23741, -14530=>23742, -14531=>23743, -14532=>23744, -14533=>23745, -14534=>23746, -14535=>23747, -14536=>23748, -14537=>23749, -14538=>23750, -14539=>23751, -14540=>23752, -14541=>23753, -14542=>23754, -14543=>23755, -14544=>23756, -14545=>23757, -14546=>23758, -14547=>23759, -14548=>23760, -14549=>23761, -14550=>23762, -14551=>23763, -14552=>23764, -14553=>23765, -14554=>23766, -14555=>23767, -14556=>23768, -14557=>23769, -14558=>23770, -14559=>23771, -14560=>23772, -14561=>23773, -14562=>23774, -14563=>23775, -14564=>23776, -14565=>23777, -14566=>23778, -14567=>23779, -14568=>23780, -14569=>23781, -14570=>23782, -14571=>23783, -14572=>23784, -14573=>23785, -14574=>23786, -14575=>23787, -14576=>23788, -14577=>23789, -14578=>23790, -14579=>23791, -14580=>23792, -14581=>23793, -14582=>23794, -14583=>23795, -14584=>23796, -14585=>23797, -14586=>23798, -14587=>23799, -14588=>23800, -14589=>23801, -14590=>23802, -14591=>23803, -14592=>23804, -14593=>23805, -14594=>23806, -14595=>23807, -14596=>23808, -14597=>23809, -14598=>23810, -14599=>23811, -14600=>23812, -14601=>23813, -14602=>23814, -14603=>23815, -14604=>23816, -14605=>23817, -14606=>23818, -14607=>23819, -14608=>23820, -14609=>23821, -14610=>23822, -14611=>23823, -14612=>23824, -14613=>23825, -14614=>23826, -14615=>23827, -14617=>23828, -14618=>23829, -14619=>23830, -14620=>23831, -14621=>23832, -14622=>23833, -14623=>23834, -14624=>23835, -14625=>23836, -14626=>23837, -14627=>23838, -14628=>23839, -14629=>23840, -14630=>23841, -14631=>23842, -14632=>23843, -14633=>23844, -14634=>23845, -14635=>23846, -14636=>23847, -14637=>23848, -14638=>23849, -14639=>23850, -14640=>23851, -14641=>23852, -14642=>23853, -14643=>23854, -14644=>23855, -14645=>23856, -14646=>23857, -14647=>23858, -14648=>23859, -14649=>23860, -14650=>23861, -14651=>23862, -14652=>23863, -14653=>23864, -14654=>23865, -14655=>23866, -14656=>23867, -14657=>23868, -14658=>23869, -14659=>23870, -14660=>23871, -14661=>23872, -14662=>23873, -14663=>23874, -14664=>23875, -14665=>23876, -14666=>23877, -14667=>23878, -14668=>23879, -14669=>23880, -14670=>23881, -14671=>23882, -14672=>23883, -14673=>23884, -14674=>23885, -14675=>23886, -14676=>23887, -14677=>23888, -14678=>23889, -14679=>23890, -14680=>23891, -14681=>23892, -14682=>23893, -14683=>23894, -14684=>23895, -14685=>23896, -14686=>23897, -14687=>23898, -14688=>23899, -14689=>23900, -14690=>23901, -14691=>23902, -14692=>23903, -14693=>23904, -14694=>23905, -14695=>23906, -14696=>23907, -14697=>23908, -14698=>23909, -14699=>23910, -14700=>23911, -14701=>23912, -14703=>23913, -14704=>23914, -14705=>23915, -14706=>23916, -14707=>23917, -14708=>23918, -14709=>23919, -14710=>23920, -14711=>23921, -14712=>23922, -14713=>23923, -14714=>23924, -14715=>23925, -14716=>23926, -14717=>23927, -14718=>23928, -14719=>23929, -14720=>23930, -14721=>23931, -14722=>23932, -14723=>23933, -14724=>23934, -14725=>23935, -14726=>23936, -14727=>23937, -14728=>23938, -14729=>23939, -14730=>23940, -14731=>23941, -14732=>23942, -14733=>23943, -14734=>23944, -14735=>23945, -14736=>23946, -14737=>23947, -14738=>23948, -14739=>23949, -14740=>23950, -14741=>23951, -14742=>23952, -14743=>23953, -14744=>23954, -14745=>23955, -14746=>23956, -14747=>23957, -14748=>23958, -14749=>23959, -14750=>23960, -14751=>23961, -14752=>23962, -14753=>23963, -14754=>23964, -14755=>23965, -14756=>23966, -14757=>23967, -14758=>23968, -14759=>23969, -14760=>23970, -14761=>23971, -14762=>23972, -14763=>23973, -14764=>23974, -14765=>23975, -14766=>23976, -14767=>23977, -14768=>23978, -14769=>23979, -14770=>23980, -14771=>23981, -14772=>23982, -14773=>23983, -14774=>23984, -14775=>23985, -14776=>23986, -14777=>23987, -14778=>23988, -14779=>23989, -14780=>23990, -14781=>23991, -14782=>23992, -14783=>23993, -14784=>23994, -14785=>23995, -14786=>23996, -14787=>23997, -14788=>23998, -14789=>23999, -14790=>24000, -14791=>24001, -14792=>24002, -14793=>24003, -14794=>24004, -14795=>24005, -14796=>24006, -14797=>24007, -14798=>24008, -14801=>24009, -14802=>24010, -14803=>24011, -14804=>24012, -14805=>24013, -14806=>24014, -14807=>24015, -14808=>24016, -14809=>24017, -14810=>24018, -14811=>24019, -14812=>24020, -14813=>24021, -14814=>24022, -14816=>24023, -14817=>24024, -14818=>24025, -14819=>24026, -14820=>24027, -14821=>24028, -14822=>24029, -14823=>24030, -14824=>24031, -14825=>24032, -14826=>24033, -14827=>24034, -14828=>24035, -14829=>24036, -14830=>24037, -14831=>24038, -14832=>24039, -14833=>24040, -14834=>24041, -14835=>24042, -14836=>24043, -14837=>24044, -14838=>24045, -14839=>24046, -14840=>24047, -14841=>24048, -14842=>24049, -14843=>24050, -14844=>24051, -14845=>24052, -14846=>24053, -14847=>24054, -14848=>24055, -14849=>24056, -14850=>24057, -14851=>24058, -14852=>24059, -14853=>24060, -14854=>24061, -14855=>24062, -14856=>24063, -14857=>24064, -14858=>24065, -14859=>24066, -14860=>24067, -14861=>24068, -14862=>24069, -14863=>24070, -14864=>24071, -14865=>24072, -14866=>24073, -14867=>24074, -14868=>24075, -14869=>24076, -14870=>24077, -14871=>24078, -14872=>24079, -14873=>24080, -14874=>24081, -14875=>24082, -14876=>24083, -14877=>24084, -14878=>24085, -14879=>24086, -14880=>24087, -14881=>24088, -14882=>24089, -14883=>24090, -14884=>24091, -14885=>24092, -14886=>24093, -14887=>24094, -14888=>24095, -14889=>24096, -14890=>24097, -14891=>24098, -14892=>24099, -14893=>24100, -14894=>24101, -14895=>24102, -14896=>24103, -14897=>24104, -14898=>24105, -14899=>24106, -14900=>24107, -14901=>24108, -14902=>24109, -14903=>24110, -14904=>24111, -14905=>24112, -14906=>24113, -14907=>24114, -14908=>24115, -14909=>24116, -14910=>24117, -14911=>24118, -14912=>24119, -14913=>24120, -14914=>24121, -14915=>24122, -14916=>24123, -14917=>24124, -14918=>24125, -14919=>24126, -14920=>24127, -14921=>24128, -14922=>24129, -14923=>24130, -14924=>24131, -14925=>24132, -14926=>24133, -14927=>24134, -14928=>24135, -14929=>24136, -14930=>24137, -14931=>24138, -14932=>24139, -14933=>24140, -14934=>24141, -14935=>24142, -14936=>24143, -14937=>24144, -14938=>24145, -14939=>24146, -14940=>24147, -14941=>24148, -14942=>24149, -14943=>24150, -14944=>24151, -14945=>24152, -14946=>24153, -14947=>24154, -14948=>24155, -14949=>24156, -14950=>24157, -14951=>24158, -14952=>24159, -14953=>24160, -14954=>24161, -14955=>24162, -14956=>24163, -14957=>24164, -14958=>24165, -14959=>24166, -14960=>24167, -14961=>24168, -14962=>24169, -14964=>24170, -14965=>24171, -14966=>24172, -14967=>24173, -14968=>24174, -14969=>24175, -14970=>24176, -14971=>24177, -14972=>24178, -14973=>24179, -14974=>24180, -14975=>24181, -14976=>24182, -14977=>24183, -14978=>24184, -14979=>24185, -14980=>24186, -14981=>24187, -14982=>24188, -14983=>24189, -14984=>24190, -14985=>24191, -14986=>24192, -14987=>24193, -14988=>24194, -14989=>24195, -14990=>24196, -14991=>24197, -14992=>24198, -14993=>24199, -14994=>24200, -14995=>24201, -14996=>24202, -14997=>24203, -14998=>24204, -14999=>24205, -15000=>24206, -15001=>24207, -15002=>24208, -15003=>24209, -15004=>24210, -15005=>24211, -15006=>24212, -15007=>24213, -15008=>24214, -15009=>24215, -15010=>24216, -15011=>24217, -15012=>24218, -15013=>24219, -15014=>24220, -15015=>24221, -15016=>24222, -15017=>24223, -15018=>24224, -15019=>24225, -15020=>24226, -15021=>24227, -15022=>24228, -15023=>24229, -15024=>24230, -15025=>24231, -15026=>24232, -15027=>24233, -15028=>24234, -15029=>24235, -15030=>24236, -15031=>24237, -15032=>24238, -15033=>24239, -15034=>24240, -15035=>24241, -15036=>24242, -15037=>24243, -15038=>24244, -15039=>24245, -15040=>24246, -15041=>24247, -15042=>24248, -15043=>24249, -15044=>24250, -15045=>24251, -15046=>24252, -15047=>24253, -15048=>24254, -15049=>24255, -15050=>24256, -15051=>24257, -15052=>24258, -15053=>24259, -15054=>24260, -15055=>24261, -15056=>24262, -15057=>24263, -15058=>24264, -15059=>24265, -15060=>24266, -15061=>24267, -15062=>24268, -15063=>24269, -15064=>24270, -15065=>24271, -15066=>24272, -15067=>24273, -15068=>24274, -15069=>24275, -15070=>24276, -15071=>24277, -15072=>24278, -15073=>24279, -15074=>24280, -15075=>24281, -15076=>24282, -15077=>24283, -15078=>24284, -15079=>24285, -15080=>24286, -15081=>24287, -15082=>24288, -15083=>24289, -15084=>24290, -15085=>24291, -15086=>24292, -15087=>24293, -15088=>24294, -15089=>24295, -15090=>24296, -15091=>24297, -15092=>24298, -15093=>24299, -15094=>24300, -15095=>24301, -15096=>24302, -15097=>24303, -15098=>24304, -15099=>24305, -15100=>24306, -15101=>24307, -15102=>24308, -15103=>24309, -15104=>24310, -15105=>24311, -15106=>24312, -15107=>24313, -15108=>24314, -15109=>24315, -15110=>24316, -15111=>24317, -15112=>24318, -15113=>24319, -15114=>24320, -15115=>24321, -15116=>24322, -15117=>24323, -15118=>24324, -15119=>24325, -15120=>24326, -15121=>24327, -15122=>24328, -15123=>24329, -15124=>24330, -15125=>24331, -15126=>24332, -15127=>24333, -15128=>24334, -15129=>24335, -15130=>24336, -15131=>24337, -15132=>24338, -15133=>24339, -15134=>24340, -15135=>24341, -15136=>24342, -15137=>24343, -15138=>24344, -15139=>24345, -15140=>24346, -15141=>24347, -15142=>24348, -15143=>24349, -15144=>24350, -15145=>24351, -15146=>24352, -15147=>24353, -15148=>24354, -15149=>24355, -15150=>24356, -15151=>24357, -15152=>24358, -15153=>24359, -15154=>24360, -15155=>24361, -15156=>24362, -15157=>24363, -15158=>24364, -15159=>24365, -15160=>24366, -15161=>24367, -15162=>24368, -15163=>24369, -15164=>24370, -15165=>24371, -15166=>24372, -15167=>24373, -15168=>24374, -15169=>24375, -15170=>24376, -15171=>24377, -15172=>24378, -15173=>24379, -15174=>24380, -15175=>24381, -15176=>24382, -15177=>24383, -15178=>24384, -15179=>24385, -15180=>24386, -15181=>24387, -15183=>24388, -15184=>24389, -15185=>24390, -15186=>24391, -15187=>24392, -15188=>24393, -15189=>24394, -15190=>24395, -15191=>24396, -15192=>24397, -15193=>24398, -15194=>24399, -15195=>24400, -15196=>24401, -15197=>24402, -15198=>24403, -15199=>24404, -15200=>24405, -15201=>24406, -15202=>24407, -15203=>24408, -15204=>24409, -15205=>24410, -15206=>24411, -15207=>24412, -15208=>24413, -15209=>24414, -15210=>24415, -15211=>24416, -15212=>24417, -15213=>24418, -15214=>24419, -15215=>24420, -15216=>24421, -15217=>24422, -15218=>24423, -15219=>24424, -15220=>24425, -15221=>24426, -15222=>24427, -15223=>24428, -15224=>24429, -15225=>24430, -15226=>24431, -15227=>24432, -15228=>24433, -15229=>24434, -15230=>24435, -15231=>24436, -15232=>24437, -15233=>24438, -15234=>24439, -15235=>24440, -15236=>24441, -15237=>24442, -15238=>24443, -15239=>24444, -15240=>24445, -15241=>24446, -15242=>24447, -15243=>24448, -15244=>24449, -15245=>24450, -15246=>24451, -15247=>24452, -15248=>24453, -15249=>24454, -15250=>24455, -15251=>24456, -15252=>24457, -15253=>24458, -15254=>24459, -15255=>24460, -15256=>24461, -15257=>24462, -15258=>24463, -15259=>24464, -15260=>24465, -15261=>24466, -15262=>24467, -15263=>24468, -15264=>24469, -15265=>24470, -15266=>24471, -15267=>24472, -15268=>24473, -15269=>24474, -15270=>24475, -15271=>24476, -15272=>24477, -15273=>24478, -15274=>24479, -15275=>24480, -15276=>24481, -15277=>24482, -15278=>24483, -15279=>24484, -15280=>24485, -15281=>24486, -15282=>24487, -15283=>24488, -15284=>24489, -15285=>24490, -15286=>24491, -15287=>24492, -15288=>24493, -15289=>24494, -15290=>24495, -15291=>24496, -15292=>24497, -15293=>24498, -15294=>24499, -15295=>24500, -15296=>24501, -15297=>24502, -15298=>24503, -15299=>24504, -15300=>24505, -15301=>24506, -15302=>24507, -15303=>24508, -15304=>24509, -15305=>24510, -15306=>24511, -15307=>24512, -15308=>24513, -15309=>24514, -15310=>24515, -15311=>24516, -15312=>24517, -15313=>24518, -15314=>24519, -15315=>24520, -15316=>24521, -15317=>24522, -15318=>24523, -15319=>24524, -15320=>24525, -15321=>24526, -15322=>24527, -15323=>24528, -15324=>24529, -15325=>24530, -15326=>24531, -15327=>24532, -15328=>24533, -15329=>24534, -15330=>24535, -15331=>24536, -15332=>24537, -15333=>24538, -15334=>24539, -15335=>24540, -15336=>24541, -15337=>24542, -15338=>24543, -15339=>24544, -15340=>24545, -15341=>24546, -15342=>24547, -15343=>24548, -15344=>24549, -15345=>24550, -15346=>24551, -15347=>24552, -15348=>24553, -15349=>24554, -15350=>24555, -15351=>24556, -15352=>24557, -15353=>24558, -15354=>24559, -15355=>24560, -15356=>24561, -15357=>24562, -15358=>24563, -15359=>24564, -15360=>24565, -15361=>24566, -15362=>24567, -15363=>24568, -15364=>24569, -15365=>24570, -15366=>24571, -15367=>24572, -15368=>24573, -15369=>24574, -15370=>24575, -15371=>24576, -15372=>24577, -15373=>24578, -15374=>24579, -15375=>24580, -15376=>24581, -15377=>24582, -15378=>24583, -15379=>24584, -15380=>24585, -15381=>24586, -15382=>24587, -15383=>24588, -15384=>24589, -15385=>24590, -15386=>24591, -15387=>24592, -15388=>24593, -15389=>24594, -15390=>24595, -15391=>24596, -15392=>24597, -15393=>24598, -15394=>24599, -15395=>24600, -15396=>24601, -15397=>24602, -15398=>24603, -15399=>24604, -15400=>24605, -15401=>24606, -15402=>24607, -15403=>24608, -15404=>24609, -15405=>24610, -15406=>24611, -15407=>24612, -15408=>24613, -15409=>24614, -15410=>24615, -15411=>24616, -15412=>24617, -15413=>24618, -15414=>24619, -15415=>24620, -15416=>24621, -15417=>24622, -15418=>24623, -15419=>24624, -15420=>24625, -15421=>24626, -15422=>24627, -15423=>24628, -15424=>24629, -15425=>24630, -15426=>24631, -15427=>24632, -15428=>24633, -15429=>24634, -15430=>24635, -15431=>24636, -15432=>24637, -15433=>24638, -15434=>24639, -15435=>24640, -15436=>24641, -15437=>24642, -15438=>24643, -15439=>24644, -15440=>24645, -15441=>24646, -15442=>24647, -15443=>24648, -15444=>24649, -15445=>24650, -15446=>24651, -15447=>24652, -15448=>24653, -15449=>24654, -15450=>24655, -15451=>24656, -15452=>24657, -15453=>24658, -15454=>24659, -15455=>24660, -15456=>24661, -15457=>24662, -15458=>24663, -15459=>24664, -15460=>24665, -15461=>24666, -15462=>24667, -15463=>24668, -15464=>24669, -15465=>24670, -15466=>24671, -15467=>24672, -15468=>24673, -15469=>24674, -15471=>24675, -15472=>24676, -15473=>24677, -15474=>24678, -15475=>24679, -15476=>24680, -15477=>24681, -15478=>24682, -15479=>24683, -15480=>24684, -15481=>24685, -15482=>24686, -15483=>24687, -15484=>24688, -15485=>24689, -15486=>24690, -15487=>24691, -15488=>24692, -15489=>24693, -15490=>24694, -15491=>24695, -15492=>24696, -15493=>24697, -15494=>24698, -15495=>24699, -15496=>24700, -15497=>24701, -15498=>24702, -15499=>24703, -15500=>24704, -15501=>24705, -15502=>24706, -15503=>24707, -15504=>24708, -15505=>24709, -15506=>24710, -15507=>24711, -15508=>24712, -15509=>24713, -15510=>24714, -15511=>24715, -15512=>24716, -15513=>24717, -15514=>24718, -15515=>24719, -15516=>24720, -15517=>24721, -15518=>24722, -15519=>24723, -15520=>24724, -15521=>24725, -15522=>24726, -15523=>24727, -15524=>24728, -15525=>24729, -15526=>24730, -15527=>24731, -15528=>24732, -15529=>24733, -15530=>24734, -15531=>24735, -15532=>24736, -15533=>24737, -15534=>24738, -15535=>24739, -15536=>24740, -15537=>24741, -15538=>24742, -15539=>24743, -15540=>24744, -15541=>24745, -15542=>24746, -15543=>24747, -15544=>24748, -15545=>24749, -15546=>24750, -15547=>24751, -15548=>24752, -15549=>24753, -15550=>24754, -15551=>24755, -15552=>24756, -15553=>24757, -15554=>24758, -15555=>24759, -15556=>24760, -15557=>24761, -15558=>24762, -15559=>24763, -15560=>24764, -15561=>24765, -15562=>24766, -15563=>24767, -15564=>24768, -15565=>24769, -15566=>24770, -15567=>24771, -15568=>24772, -15569=>24773, -15570=>24774, -15571=>24775, -15572=>24776, -15573=>24777, -15574=>24778, -15575=>24779, -15576=>24780, -15577=>24781, -15578=>24782, -15579=>24783, -15580=>24784, -15581=>24785, -15582=>24786, -15583=>24787, -15585=>24788, -15586=>24789, -15587=>24790, -15588=>24791, -15589=>24792, -15590=>24793, -15591=>24794, -15592=>24795, -15593=>24796, -15594=>24797, -15595=>24798, -15596=>24799, -15597=>24800, -15598=>24801, -15599=>24802, -15600=>24803, -15601=>24804, -15602=>24805, -15603=>24806, -15604=>24807, -15605=>24808, -15606=>24809, -15607=>24810, -15608=>24811, -15609=>24812, -15610=>24813, -15611=>24814, -15612=>24815, -15613=>24816, -15614=>24817, -15615=>24818, -15616=>24819, -15617=>24820, -15618=>24821, -15619=>24822, -15620=>24823, -15621=>24824, -15622=>24825, -15623=>24826, -15624=>24827, -15625=>24828, -15626=>24829, -15627=>24830, -15628=>24831, -15629=>24832, -15630=>24833, -15631=>24834, -15632=>24835, -15633=>24836, -15634=>24837, -15635=>24838, -15636=>24839, -15637=>24840, -15638=>24841, -15639=>24842, -15640=>24843, -15641=>24844, -15642=>24845, -15643=>24846, -15644=>24847, -15645=>24848, -15646=>24849, -15647=>24850, -15648=>24851, -15649=>24852, -15650=>24853, -15651=>24854, -15652=>24855, -15653=>24856, -15654=>24857, -15655=>24858, -15656=>24859, -15657=>24860, -15658=>24861, -15659=>24862, -15660=>24863, -15661=>24864, -15662=>24865, -15663=>24866, -15664=>24867, -15665=>24868, -15666=>24869, -15667=>24870, -15668=>24871, -15669=>24872, -15670=>24873, -15671=>24874, -15672=>24875, -15673=>24876, -15674=>24877, -15675=>24878, -15676=>24879, -15677=>24880, -15678=>24881, -15679=>24882, -15680=>24883, -15681=>24884, -15682=>24885, -15683=>24886, -15684=>24887, -15685=>24888, -15686=>24889, -15687=>24890, -15688=>24891, -15689=>24892, -15690=>24893, -15691=>24894, -15692=>24895, -15693=>24896, -15694=>24897, -15695=>24898, -15696=>24899, -15697=>24900, -15698=>24901, -15699=>24902, -15700=>24903, -15701=>24904, -15702=>24905, -15703=>24906, -15704=>24907, -15705=>24908, -15706=>24909, -15707=>24910, -15708=>24911, -15709=>24912, -15710=>24913, -15711=>24914, -15712=>24915, -15713=>24916, -15714=>24917, -15715=>24918, -15716=>24919, -15717=>24920, -15718=>24921, -15719=>24922, -15720=>24923, -15721=>24924, -15722=>24925, -15723=>24926, -15724=>24927, -15725=>24928, -15726=>24929, -15727=>24930, -15728=>24931, -15729=>24932, -15730=>24933, -15731=>24934, -15732=>24935, -15733=>24936, -15734=>24937, -15735=>24938, -15736=>24939, -15737=>24940, -15738=>24941, -15739=>24942, -15740=>24943, -15741=>24944, -15742=>24945, -15743=>24946, -15744=>24947, -15745=>24948, -15746=>24949, -15747=>24950, -15748=>24951, -15749=>24952, -15750=>24953, -15751=>24954, -15752=>24955, -15753=>24956, -15754=>24957, -15755=>24958, -15756=>24959, -15757=>24960, -15758=>24961, -15759=>24962, -15760=>24963, -15761=>24964, -15762=>24965, -15763=>24966, -15764=>24967, -15765=>24968, -15766=>24969, -15767=>24970, -15768=>24971, -15769=>24972, -15770=>24973, -15771=>24974, -15772=>24975, -15773=>24976, -15774=>24977, -15775=>24978, -15776=>24979, -15777=>24980, -15778=>24981, -15779=>24982, -15780=>24983, -15781=>24984, -15782=>24985, -15783=>24986, -15784=>24987, -15785=>24988, -15786=>24989, -15787=>24990, -15788=>24991, -15789=>24992, -15790=>24993, -15791=>24994, -15792=>24995, -15793=>24996, -15794=>24997, -15795=>24998, -15796=>24999, -15797=>25000, -15798=>25001, -15799=>25002, -15800=>25003, -15801=>25004, -15802=>25005, -15803=>25006, -15804=>25007, -15805=>25008, -15806=>25009, -15807=>25010, -15808=>25011, -15809=>25012, -15810=>25013, -15811=>25014, -15812=>25015, -15813=>25016, -15814=>25017, -15815=>25018, -15816=>25019, -15817=>25020, -15818=>25021, -15819=>25022, -15820=>25023, -15821=>25024, -15822=>25025, -15823=>25026, -15824=>25027, -15825=>25028, -15826=>25029, -15827=>25030, -15828=>25031, -15829=>25032, -15830=>25033, -15831=>25034, -15832=>25035, -15833=>25036, -15834=>25037, -15835=>25038, -15836=>25039, -15837=>25040, -15838=>25041, -15839=>25042, -15840=>25043, -15841=>25044, -15842=>25045, -15843=>25046, -15844=>25047, -15845=>25048, -15846=>25049, -15847=>25050, -15848=>25051, -15849=>25052, -15850=>25053, -15851=>25054, -15852=>25055, -15853=>25056, -15854=>25057, -15855=>25058, -15856=>25059, -15857=>25060, -15858=>25061, -15859=>25062, -15860=>25063, -15861=>25064, -15862=>25065, -15863=>25066, -15864=>25067, -15865=>25068, -15866=>25069, -15867=>25070, -15868=>25071, -15869=>25072, -15870=>25073, -15871=>25074, -15872=>25075, -15873=>25076, -15874=>25077, -15875=>25078, -15876=>25079, -15877=>25080, -15878=>25081, -15879=>25082, -15880=>25083, -15881=>25084, -15882=>25085, -15883=>25086, -15884=>25087, -15885=>25088, -15886=>25089, -15887=>25090, -15888=>25091, -15889=>25092, -15890=>25093, -15891=>25094, -15892=>25095, -15893=>25096, -15894=>25097, -15895=>25098, -15896=>25099, -15897=>25100, -15898=>25101, -15899=>25102, -15900=>25103, -15901=>25104, -15902=>25105, -15903=>25106, -15904=>25107, -15905=>25108, -15906=>25109, -15907=>25110, -15908=>25111, -15909=>25112, -15910=>25113, -15911=>25114, -15912=>25115, -15913=>25116, -15914=>25117, -15915=>25118, -15916=>25119, -15917=>25120, -15918=>25121, -15919=>25122, -15920=>25123, -15921=>25124, -15922=>25125, -15923=>25126, -15924=>25127, -15925=>25128, -15926=>25129, -15927=>25130, -15928=>25131, -15929=>25132, -15930=>25133, -15931=>25134, -15932=>25135, -15933=>25136, -15934=>25137, -15935=>25138, -15936=>25139, -15937=>25140, -15938=>25141, -15939=>25142, -15940=>25143, -15941=>25144, -15942=>25145, -15943=>25146, -15944=>25147, -15945=>25148, -15946=>25149, -15947=>25150, -15948=>25151, -15949=>25152, -15950=>25153, -15951=>25154, -15952=>25155, -15953=>25156, -15954=>25157, -15955=>25158, -15956=>25159, -15957=>25160, -15958=>25161, -15959=>25162, -15960=>25163, -15961=>25164, -15962=>25165, -15963=>25166, -15964=>25167, -15965=>25168, -15966=>25169, -15967=>25170, -15968=>25171, -15969=>25172, -15970=>25173, -15971=>25174, -15972=>25175, -15973=>25176, -15974=>25177, -15975=>25178, -15976=>25179, -15977=>25180, -15978=>25181, -15979=>25182, -15980=>25183, -15981=>25184, -15982=>25185, -15983=>25186, -15984=>25187, -15985=>25188, -15986=>25189, -15987=>25190, -15988=>25191, -15989=>25192, -15990=>25193, -15991=>25194, -15992=>25195, -15993=>25196, -15994=>25197, -15995=>25198, -15996=>25199, -15997=>25200, -15998=>25201, -15999=>25202, -16000=>25203, -16001=>25204, -16002=>25205, -16003=>25206, -16004=>25207, -16005=>25208, -16006=>25209, -16007=>25210, -16008=>25211, -16009=>25212, -16010=>25213, -16011=>25214, -16012=>25215, -16013=>25216, -16014=>25217, -16015=>25218, -16016=>25219, -16017=>25220, -16018=>25221, -16019=>25222, -16020=>25223, -16021=>25224, -16022=>25225, -16023=>25226, -16024=>25227, -16025=>25228, -16026=>25229, -16027=>25230, -16028=>25231, -16029=>25232, -16030=>25233, -16031=>25234, -16032=>25235, -16033=>25236, -16034=>25237, -16035=>25238, -16036=>25239, -16037=>25240, -16038=>25241, -16039=>25242, -16040=>25243, -16041=>25244, -16042=>25245, -16043=>25246, -16044=>25247, -16045=>25248, -16046=>25249, -16047=>25250, -16048=>25251, -16049=>25252, -16050=>25253, -16051=>25254, -16052=>25255, -16053=>25256, -16054=>25257, -16055=>25258, -16056=>25259, -16057=>25260, -16058=>25261, -16059=>25262, -16060=>25263, -16061=>25264, -16062=>25265, -16063=>25266, -16064=>25267, -16065=>25268, -16066=>25269, -16067=>25270, -16068=>25271, -16069=>25272, -16070=>25273, -16071=>25274, -16072=>25275, -16073=>25276, -16074=>25277, -16075=>25278, -16076=>25279, -16077=>25280, -16078=>25281, -16079=>25282, -16080=>25283, -16081=>25284, -16082=>25285, -16083=>25286, -16084=>25287, -16085=>25288, -16086=>25289, -16087=>25290, -16088=>25291, -16089=>25292, -16090=>25293, -16091=>25294, -16092=>25295, -16093=>25296, -16094=>25297, -16095=>25298, -16096=>25299, -16097=>25300, -16098=>25301, -16099=>25302, -16100=>25303, -16101=>25304, -16102=>25305, -16103=>25306, -16104=>25307, -16105=>25308, -16106=>25309, -16107=>25310, -16108=>25311, -16109=>25312, -16110=>25313, -16111=>25314, -16112=>25315, -16113=>25316, -16114=>25317, -16115=>25318, -16116=>25319, -16117=>25320, -16118=>25321, -16119=>25322, -16120=>25323, -16121=>25324, -16122=>25325, -16123=>25326, -16124=>25327, -16125=>25328, -16126=>25329, -16127=>25330, -16128=>25331, -16129=>25332, -16130=>25333, -16131=>25334, -16132=>25335, -16133=>25336, -16134=>25337, -16135=>25338, -16136=>25339, -16137=>25340, -16138=>25341, -16139=>25342, -16140=>25343, -16141=>25344, -16142=>25345, -16143=>25346, -16144=>25347, -16145=>25348, -16146=>25349, -16147=>25350, -16148=>25351, -16149=>25352, -16150=>25353, -16151=>25354, -16152=>25355, -16153=>25356, -16154=>25357, -16155=>25358, -16156=>25359, -16157=>25360, -16158=>25361, -16159=>25362, -16160=>25363, -16161=>25364, -16162=>25365, -16163=>25366, -16164=>25367, -16165=>25368, -16166=>25369, -16167=>25370, -16168=>25371, -16169=>25372, -16170=>25373, -16171=>25374, -16172=>25375, -16173=>25376, -16174=>25377, -16175=>25378, -16176=>25379, -16177=>25380, -16178=>25381, -16179=>25382, -16180=>25383, -16181=>25384, -16182=>25385, -16183=>25386, -16184=>25387, -16185=>25388, -16186=>25389, -16187=>25390, -16188=>25391, -16189=>25392, -16190=>25393, -16191=>25394, -16192=>25395, -16193=>25396, -16194=>25397, -16195=>25398, -16196=>25399, -16197=>25400, -16198=>25401, -16199=>25402, -16200=>25403, -16201=>25404, -16202=>25405, -16203=>25406, -16204=>25407, -16205=>25408, -16206=>25409, -16207=>25410, -16208=>25411, -16209=>25412, -16210=>25413, -16211=>25414, -16212=>25415, -16213=>25416, -16214=>25417, -16215=>25418, -16216=>25419, -16217=>25420, -16218=>25421, -16219=>25422, -16220=>25423, -16221=>25424, -16222=>25425, -16223=>25426, -16224=>25427, -16225=>25428, -16226=>25429, -16227=>25430, -16228=>25431, -16229=>25432, -16230=>25433, -16231=>25434, -16232=>25435, -16233=>25436, -16234=>25437, -16235=>25438, -16236=>25439, -16237=>25440, -16238=>25441, -16239=>25442, -16240=>25443, -16241=>25444, -16242=>25445, -16243=>25446, -16244=>25447, -16245=>25448, -16246=>25449, -16247=>25450, -16248=>25451, -16249=>25452, -16250=>25453, -16251=>25454, -16252=>25455, -16253=>25456, -16254=>25457, -16255=>25458, -16256=>25459, -16257=>25460, -16258=>25461, -16259=>25462, -16260=>25463, -16261=>25464, -16262=>25465, -16263=>25466, -16264=>25467, -16265=>25468, -16266=>25469, -16267=>25470, -16268=>25471, -16269=>25472, -16270=>25473, -16271=>25474, -16272=>25475, -16273=>25476, -16274=>25477, -16275=>25478, -16276=>25479, -16277=>25480, -16278=>25481, -16279=>25482, -16280=>25483, -16281=>25484, -16282=>25485, -16283=>25486, -16284=>25487, -16285=>25488, -16286=>25489, -16287=>25490, -16288=>25491, -16289=>25492, -16290=>25493, -16291=>25494, -16292=>25495, -16293=>25496, -16294=>25497, -16295=>25498, -16296=>25499, -16297=>25500, -16298=>25501, -16299=>25502, -16300=>25503, -16301=>25504, -16302=>25505, -16303=>25506, -16304=>25507, -16305=>25508, -16306=>25509, -16307=>25510, -16308=>25511, -16309=>25512, -16310=>25513, -16311=>25514, -16312=>25515, -16313=>25516, -16314=>25517, -16315=>25518, -16316=>25519, -16317=>25520, -16318=>25521, -16319=>25522, -16320=>25523, -16321=>25524, -16322=>25525, -16323=>25526, -16324=>25527, -16325=>25528, -16326=>25529, -16327=>25530, -16328=>25531, -16329=>25532, -16330=>25533, -16331=>25534, -16332=>25535, -16333=>25536, -16334=>25537, -16335=>25538, -16336=>25539, -16337=>25540, -16338=>25541, -16339=>25542, -16340=>25543, -16341=>25544, -16342=>25545, -16343=>25546, -16344=>25547, -16345=>25548, -16346=>25549, -16347=>25550, -16348=>25551, -16349=>25552, -16350=>25553, -16351=>25554, -16352=>25555, -16353=>25556, -16354=>25557, -16355=>25558, -16356=>25559, -16357=>25560, -16358=>25561, -16359=>25562, -16360=>25563, -16361=>25564, -16362=>25565, -16363=>25566, -16364=>25567, -16365=>25568, -16366=>25569, -16367=>25570, -16368=>25571, -16369=>25572, -16370=>25573, -16371=>25574, -16372=>25575, -16373=>25576, -16374=>25577, -16375=>25578, -16376=>25579, -16377=>25580, -16378=>25581, -16379=>25582, -16380=>25583, -16381=>25584, -16382=>25585, -16383=>25586, -16384=>25587, -16385=>25588, -16386=>25589, -16387=>25590, -16388=>25591, -16389=>25592, -16390=>25593, -16391=>25594, -16392=>25595, -16393=>25596, -16394=>25597, -16395=>25598, -16396=>25599, -16397=>25600, -16398=>25601, -16399=>25602, -16400=>25603, -16401=>25604, -16402=>25605, -16403=>25606, -16404=>25607, -16405=>25608, -16406=>25609, -16407=>25610, -16408=>25611, -16409=>25612, -16410=>25613, -16411=>25614, -16412=>25615, -16413=>25616, -16414=>25617, -16415=>25618, -16416=>25619, -16417=>25620, -16418=>25621, -16419=>25622, -16420=>25623, -16421=>25624, -16422=>25625, -16423=>25626, -16424=>25627, -16425=>25628, -16426=>25629, -16427=>25630, -16428=>25631, -16429=>25632, -16430=>25633, -16431=>25634, -16432=>25635, -16433=>25636, -16434=>25637, -16435=>25638, -16436=>25639, -16437=>25640, -16438=>25641, -16439=>25642, -16440=>25643, -16441=>25644, -16442=>25645, -16443=>25646, -16444=>25647, -16445=>25648, -16446=>25649, -16447=>25650, -16448=>25651, -16449=>25652, -16450=>25653, -16451=>25654, -16452=>25655, -16453=>25656, -16454=>25657, -16455=>25658, -16456=>25659, -16457=>25660, -16458=>25661, -16459=>25662, -16460=>25663, -16461=>25664, -16462=>25665, -16463=>25666, -16464=>25667, -16465=>25668, -16466=>25669, -16467=>25670, -16468=>25671, -16469=>25672, -16471=>25673, -16472=>25674, -16473=>25675, -16474=>25676, -16475=>25677, -16476=>25678, -16477=>25679, -16478=>25680, -16479=>25681, -16480=>25682, -16481=>25683, -16482=>25684, -16483=>25685, -16484=>25686, -16485=>25687, -16486=>25688, -16487=>25689, -16488=>25690, -16489=>25691, -16490=>25692, -16491=>25693, -16492=>25694, -16493=>25695, -16494=>25696, -16495=>25697, -16496=>25698, -16497=>25699, -16498=>25700, -16499=>25701, -16500=>25702, -16501=>25703, -16502=>25704, -16503=>25705, -16504=>25706, -16505=>25707, -16506=>25708, -16507=>25709, -16508=>25710, -16509=>25711, -16510=>25712, -16511=>25713, -16512=>25714, -16513=>25715, -16514=>25716, -16515=>25717, -16516=>25718, -16517=>25719, -16518=>25720, -16519=>25721, -16520=>25722, -16521=>25723, -16522=>25724, -16523=>25725, -16524=>25726, -16525=>25727, -16526=>25728, -16527=>25729, -16528=>25730, -16529=>25731, -16530=>25732, -16531=>25733, -16532=>25734, -16533=>25735, -16534=>25736, -16535=>25737, -16536=>25738, -16537=>25739, -16538=>25740, -16539=>25741, -16540=>25742, -16541=>25743, -16542=>25744, -16543=>25745, -16544=>25746, -16545=>25747, -16546=>25748, -16547=>25749, -16548=>25750, -16549=>25751, -16550=>25752, -16551=>25753, -16552=>25754, -16553=>25755, -16554=>25756, -16555=>25757, -16556=>25758, -16557=>25759, -16558=>25760, -16559=>25761, -16560=>25762, -16561=>25763, -16562=>25764, -16563=>25765, -16564=>25766, -16565=>25767, -16566=>25768, -16567=>25769, -16568=>25770, -16569=>25771, -16570=>25772, -16571=>25773, -16572=>25774, -16573=>25775, -16574=>25776, -16575=>25777, -16576=>25778, -16577=>25779, -16578=>25780, -16579=>25781, -16580=>25782, -16581=>25783, -16582=>25784, -16583=>25785, -16584=>25786, -16585=>25787, -16586=>25788, -16587=>25789, -16588=>25790, -16589=>25791, -16590=>25792, -16591=>25793, -16592=>25794, -16593=>25795, -16594=>25796, -16595=>25797, -16596=>25798, -16597=>25799, -16598=>25800, -16599=>25801, -16600=>25802, -16601=>25803, -16602=>25804, -16603=>25805, -16604=>25806, -16605=>25807, -16606=>25808, -16607=>25809, -16608=>25810, -16609=>25811, -16610=>25812, -16611=>25813, -16612=>25814, -16613=>25815, -16614=>25816, -16615=>25817, -16616=>25818, -16617=>25819, -16618=>25820, -16619=>25821, -16620=>25822, -16621=>25823, -16622=>25824, -16623=>25825, -16624=>25826, -16625=>25827, -16626=>25828, -16627=>25829, -16628=>25830, -16629=>25831, -16630=>25832, -16631=>25833, -16632=>25834, -16633=>25835, -16634=>25836, -16635=>25837, -16636=>25838, -16637=>25839, -16638=>25840, -16639=>25841, -16640=>25842, -16641=>25843, -16642=>25844, -16643=>25845, -16644=>25846, -16645=>25847, -16646=>25848, -16647=>25849, -16648=>25850, -16649=>25851, -16650=>25852, -16651=>25853, -16652=>25854, -16653=>25855, -16654=>25856, -16655=>25857, -16656=>25858, -16657=>25859, -16658=>25860, -16659=>25861, -16660=>25862, -16661=>25863, -16662=>25864, -16663=>25865, -16664=>25866, -16665=>25867, -16666=>25868, -16667=>25869, -16668=>25870, -16669=>25871, -16670=>25872, -16671=>25873, -16672=>25874, -16673=>25875, -16674=>25876, -16675=>25877, -16676=>25878, -16677=>25879, -16678=>25880, -16679=>25881, -16680=>25882, -16681=>25883, -16682=>25884, -16683=>25885, -16684=>25886, -16685=>25887, -16686=>25888, -16687=>25889, -16688=>25890, -16689=>25891, -16690=>25892, -16691=>25893, -16692=>25894, -16693=>25895, -16694=>25896, -16695=>25897, -16696=>25898, -16697=>25899, -16698=>25900, -16699=>25901, -16700=>25902, -16701=>25903, -16702=>25904, -16703=>25905, -16704=>25906, -16705=>25907, -16706=>25908, -16707=>25909, -16708=>25910, -16709=>25911, -16710=>25912, -16711=>25913, -16712=>25914, -16713=>25915, -16714=>25916, -16715=>25917, -16716=>25918, -16717=>25919, -16718=>25920, -16719=>25921, -16720=>25922, -16721=>25923, -16722=>25924, -16723=>25925, -16724=>25926, -16725=>25927, -16726=>25928, -16727=>25929, -16728=>25930, -16729=>25931, -16730=>25932, -16731=>25933, -16732=>25934, -16733=>25935, -16734=>25936, -16736=>25937, -16737=>25938, -16738=>25939, -16739=>25940, -16740=>25941, -16741=>25942, -16742=>25943, -16743=>25944, -16744=>25945, -16745=>25946, -16746=>25947, -16747=>25948, -16748=>25949, -16749=>25950, -16750=>25951, -16751=>25952, -16752=>25953, -16753=>25954, -16754=>25955, -16755=>25956, -16756=>25957, -16757=>25958, -16758=>25959, -16759=>25960, -16760=>25961, -16761=>25962, -16762=>25963, -16763=>25964, -16764=>25965, -16765=>25966, -16766=>25967, -16767=>25968, -16768=>25969, -16769=>25970, -16770=>25971, -16771=>25972, -16772=>25973, -16773=>25974, -16774=>25975, -16775=>25976, -16776=>25977, -16777=>25978, -16778=>25979, -16779=>25980, -16780=>25981, -16781=>25982, -16782=>25983, -16783=>25984, -16784=>25985, -16785=>25986, -16786=>25987, -16787=>25988, -16788=>25989, -16789=>25990, -16790=>25991, -16791=>25992, -16792=>25993, -16793=>25994, -16794=>25995, -16795=>25996, -16796=>25997, -16797=>25998, -16798=>25999, -16799=>26000, -16800=>26001, -16801=>26002, -16802=>26003, -16803=>26004, -16804=>26005, -16805=>26006, -16806=>26007, -16807=>26008, -16808=>26009, -16809=>26010, -16810=>26011, -16811=>26012, -16812=>26013, -16813=>26014, -16814=>26015, -16815=>26016, -16816=>26017, -16817=>26018, -16818=>26019, -16819=>26020, -16820=>26021, -16821=>26022, -16822=>26023, -16823=>26024, -16824=>26025, -16825=>26026, -16826=>26027, -16827=>26028, -16828=>26029, -16829=>26030, -16830=>26031, -16831=>26032, -16832=>26033, -16833=>26034, -16834=>26035, -16835=>26036, -16836=>26037, -16837=>26038, -16838=>26039, -16839=>26040, -16840=>26041, -16841=>26042, -16842=>26043, -16843=>26044, -16844=>26045, -16845=>26046, -16846=>26047, -16847=>26048, -16848=>26049, -16849=>26050, -16850=>26051, -16851=>26052, -16852=>26053, -16853=>26054, -16854=>26055, -16855=>26056, -16856=>26057, -16857=>26058, -16858=>26059, -16859=>26060, -16860=>26061, -16861=>26062, -16862=>26063, -16863=>26064, -16864=>26065, -16865=>26066, -16866=>26067, -16867=>26068, -16868=>26069, -16869=>26070, -16870=>26071, -16871=>26072, -16872=>26073, -16873=>26074, -16874=>26075, -16875=>26076, -16876=>26077, -16877=>26078, -16878=>26079, -16879=>26080, -16880=>26081, -16881=>26082, -16882=>26083, -16883=>26084, -16884=>26085, -16885=>26086, -16886=>26087, -16887=>26088, -16888=>26089, -16889=>26090, -16890=>26091, -16891=>26092, -16892=>26093, -16893=>26094, -16894=>26095, -16895=>26096, -16896=>26097, -16897=>26098, -16898=>26099, -16899=>26100, -16900=>26101, -16901=>26102, -16902=>26103, -16903=>26104, -16904=>26105, -16905=>26106, -16906=>26107, -16907=>26108, -16908=>26109, -16909=>26110, -16910=>26111, -16911=>26112, -16912=>26113, -16913=>26114, -16914=>26115, -16915=>26116, -16916=>26117, -16917=>26118, -16918=>26119, -16919=>26120, -16920=>26121, -16921=>26122, -16922=>26123, -16923=>26124, -16924=>26125, -16925=>26126, -16926=>26127, -16927=>26128, -16928=>26129, -16929=>26130, -16930=>26131, -16931=>26132, -16932=>26133, -16933=>26134, -16934=>26135, -16935=>26136, -16936=>26137, -16937=>26138, -16938=>26139, -16939=>26140, -16940=>26141, -16941=>26142, -16942=>26143, -16943=>26144, -16944=>26145, -16945=>26146, -16946=>26147, -16947=>26148, -16948=>26149, -16949=>26150, -16950=>26151, -16951=>26152, -16952=>26153, -16953=>26154, -16954=>26155, -16955=>26156, -16956=>26157, -16957=>26158, -16958=>26159, -16959=>26160, -16960=>26161, -16961=>26162, -16962=>26163, -16963=>26164, -16964=>26165, -16965=>26166, -16966=>26167, -16967=>26168, -16968=>26169, -16969=>26170, -16970=>26171, -16971=>26172, -16972=>26173, -16973=>26174, -16974=>26175, -16975=>26176, -16976=>26177, -16977=>26178, -16978=>26179, -16979=>26180, -16980=>26181, -16981=>26182, -16982=>26183, -16983=>26184, -16984=>26185, -16985=>26186, -16986=>26187, -16987=>26188, -16988=>26189, -16989=>26190, -16990=>26191, -16991=>26192, -16992=>26193, -16993=>26194, -16994=>26195, -16995=>26196, -16996=>26197, -16997=>26198, -16998=>26199, -16999=>26200, -17000=>26201, -17001=>26202, -17002=>26203, -17003=>26204, -17004=>26205, -17005=>26206, -17006=>26207, -17007=>26208, -17008=>26209, -17009=>26210, -17010=>26211, -17011=>26212, -17012=>26213, -17013=>26214, -17014=>26215, -17015=>26216, -17016=>26217, -17017=>26218, -17018=>26219, -17019=>26220, -17020=>26221, -17021=>26222, -17022=>26223, -17023=>26224, -17024=>26225, -17025=>26226, -17026=>26227, -17027=>26228, -17028=>26229, -17029=>26230, -17030=>26231, -17031=>26232, -17032=>26233, -17033=>26234, -17034=>26235, -17035=>26236, -17036=>26237, -17037=>26238, -17038=>26239, -17039=>26240, -17040=>26241, -17041=>26242, -17042=>26243, -17043=>26244, -17044=>26245, -17045=>26246, -17046=>26247, -17047=>26248, -17048=>26249, -17049=>26250, -17050=>26251, -17051=>26252, -17052=>26253, -17053=>26254, -17054=>26255, -17055=>26256, -17056=>26257, -17057=>26258, -17058=>26259, -17059=>26260, -17060=>26261, -17061=>26262, -17062=>26263, -17063=>26264, -17064=>26265, -17065=>26266, -17066=>26267, -17067=>26268, -17068=>26269, -17069=>26270, -17070=>26271, -17071=>26272, -17072=>26273, -17073=>26274, -17074=>26275, -17075=>26276, -17076=>26277, -17077=>26278, -17078=>26279, -17079=>26280, -17080=>26281, -17081=>26282, -17082=>26283, -17083=>26284, -17084=>26285, -17085=>26286, -17086=>26287, -17087=>26288, -17088=>26289, -17089=>26290, -17090=>26291, -17091=>26292, -17092=>26293, -17093=>26294, -17094=>26295, -17095=>26296, -17096=>26297, -17097=>26298, -17098=>26299, -17099=>26300, -17100=>26301, -17101=>26302, -17102=>26303, -17103=>26304, -17104=>26305, -17105=>26306, -17106=>26307, -17107=>26308, -17108=>26309, -17109=>26310, -17110=>26311, -17111=>26312, -17112=>26313, -17113=>26314, -17114=>26315, -17115=>26316, -17116=>26317, -17117=>26318, -17118=>26319, -17119=>26320, -17120=>26321, -17121=>26322, -17122=>26323, -17123=>26324, -17124=>26325, -17125=>26326, -17126=>26327, -17127=>26328, -17128=>26329, -17129=>26330, -17130=>26331, -17131=>26332, -17132=>26333, -17133=>26334, -17134=>26335, -17135=>26336, -17136=>26337, -17137=>26338, -17138=>26339, -17139=>26340, -17140=>26341, -17141=>26342, -17142=>26343, -17143=>26344, -17144=>26345, -17145=>26346, -17146=>26347, -17147=>26348, -17148=>26349, -17149=>26350, -17150=>26351, -17151=>26352, -17152=>26353, -17153=>26354, -17154=>26355, -17155=>26356, -17156=>26357, -17157=>26358, -17158=>26359, -17159=>26360, -17160=>26361, -17161=>26362, -17162=>26363, -17163=>26364, -17164=>26365, -17165=>26366, -17166=>26367, -17167=>26368, -17168=>26369, -17169=>26370, -17170=>26371, -17171=>26372, -17172=>26373, -17173=>26374, -17174=>26375, -17175=>26376, -17176=>26377, -17177=>26378, -17178=>26379, -17179=>26380, -17180=>26381, -17181=>26382, -17182=>26383, -17183=>26384, -17184=>26385, -17185=>26386, -17186=>26387, -17187=>26388, -17188=>26389, -17189=>26390, -17190=>26391, -17191=>26392, -17192=>26393, -17193=>26394, -17194=>26395, -17195=>26396, -17196=>26397, -17197=>26398, -17198=>26399, -17199=>26400, -17200=>26401, -17201=>26402, -17202=>26403, -17203=>26404, -17204=>26405, -17205=>26406, -17206=>26407, -17208=>26408, -17209=>26409, -17210=>26410, -17211=>26411, -17212=>26412, -17213=>26413, -17214=>26414, -17215=>26415, -17216=>26416, -17217=>26417, -17218=>26418, -17219=>26419, -17220=>26420, -17221=>26421, -17222=>26422, -17223=>26423, -17224=>26424, -17225=>26425, -17226=>26426, -17227=>26427, -17228=>26428, -17229=>26429, -17230=>26430, -17231=>26431, -17232=>26432, -17233=>26433, -17234=>26434, -17235=>26435, -17236=>26436, -17237=>26437, -17238=>26438, -17239=>26439, -17240=>26440, -17241=>26441, -17242=>26442, -17243=>26443, -17244=>26444, -17245=>26445, -17246=>26446, -17247=>26447, -17248=>26448, -17249=>26449, -17250=>26450, -17251=>26451, -17252=>26452, -17253=>26453, -17254=>26454, -17255=>26455, -17256=>26456, -17257=>26457, -17258=>26458, -17259=>26459, -17260=>26460, -17261=>26461, -17262=>26462, -17263=>26463, -17264=>26464, -17265=>26465, -17266=>26466, -17267=>26467, -17268=>26468, -17269=>26469, -17270=>26470, -17271=>26471, -17272=>26472, -17273=>26473, -17274=>26474, -17275=>26475, -17276=>26476, -17277=>26477, -17278=>26478, -17279=>26479, -17280=>26480, -17281=>26481, -17282=>26482, -17283=>26483, -17284=>26484, -17285=>26485, -17286=>26486, -17287=>26487, -17288=>26488, -17289=>26489, -17290=>26490, -17291=>26491, -17292=>26492, -17293=>26493, -17294=>26494, -17295=>26495, -17296=>26496, -17297=>26497, -17298=>26498, -17299=>26499, -17300=>26500, -17301=>26501, -17302=>26502, -17303=>26503, -17304=>26504, -17305=>26505, -17306=>26506, -17307=>26507, -17308=>26508, -17309=>26509, -17310=>26510, -17311=>26511, -17312=>26512, -17313=>26513, -17314=>26514, -17315=>26515, -17316=>26516, -17317=>26517, -17318=>26518, -17319=>26519, -17320=>26520, -17321=>26521, -17322=>26522, -17323=>26523, -17325=>26524, -17326=>26525, -17327=>26526, -17328=>26527, -17330=>26528, -17331=>26529, -17332=>26530, -17333=>26531, -17334=>26532, -17335=>26533, -17336=>26534, -17337=>26535, -17338=>26536, -17339=>26537, -17340=>26538, -17341=>26539, -17342=>26540, -17343=>26541, -17344=>26542, -17345=>26543, -17346=>26544, -17347=>26545, -17348=>26546, -17349=>26547, -17350=>26548, -17351=>26549, -17352=>26550, -17353=>26551, -17354=>26552, -17355=>26553, -17356=>26554, -17357=>26555, -17358=>26556, -17359=>26557, -17360=>26558, -17361=>26559, -17362=>26560, -17363=>26561, -17364=>26562, -17365=>26563, -17366=>26564, -17367=>26565, -17368=>26566, -17369=>26567, -17370=>26568, -17371=>26569, -17372=>26570, -17374=>26571, -17375=>26572, -17376=>26573, -17377=>26574, -17378=>26575, -17379=>26576, -17380=>26577, -17381=>26578, -17382=>26579, -17383=>26580, -17384=>26581, -17385=>26582, -17386=>26583, -17387=>26584, -17388=>26585, -17389=>26586, -17390=>26587, -17391=>26588, -17392=>26589, -17393=>26590, -17394=>26591, -17395=>26592, -17396=>26593, -17397=>26594, -17398=>26595, -17399=>26596, -17400=>26597, -17401=>26598, -17402=>26599, -17403=>26600, -17404=>26601, -17405=>26602, -17406=>26603, -17407=>26604, -17408=>26605, -17409=>26606, -17410=>26607, -17411=>26608, -17412=>26609, -17413=>26610, -17414=>26611, -17415=>26612, -17416=>26613, -17417=>26614, -17418=>26615, -17419=>26616, -17420=>26617, -17421=>26618, -17422=>26619, -17423=>26620, -17424=>26621, -17425=>26622, -17426=>26623, -17427=>26624, -17428=>26625, -17429=>26626, -17430=>26627, -17431=>26628, -17432=>26629, -17433=>26630, -17434=>26631, -17435=>26632, -17436=>26633, -17437=>26634, -17438=>26635, -17439=>26636, -17440=>26637, -17441=>26638, -17442=>26639, -17443=>26640, -17444=>26641, -17445=>26642, -17446=>26643, -17447=>26644, -17448=>26645, -17449=>26646, -17450=>26647, -17451=>26648, -17452=>26649, -17453=>26650, -17454=>26651, -17455=>26652, -17456=>26653, -17457=>26654, -17458=>26655, -17459=>26656, -17460=>26657, -17461=>26658, -17462=>26659, -17463=>26660, -17464=>26661, -17465=>26662, -17466=>26663, -17467=>26664, -17468=>26665, -17469=>26666, -17470=>26667, -17471=>26668, -17472=>26669, -17473=>26670, -17474=>26671, -17475=>26672, -17476=>26673, -17477=>26674, -17478=>26675, -17479=>26676, -17480=>26677, -17481=>26678, -17482=>26679, -17483=>26680, -17484=>26681, -17485=>26682, -17486=>26683, -17487=>26684, -17488=>26685, -17489=>26686, -17490=>26687, -17491=>26688, -17492=>26689, -17493=>26690, -17494=>26691, -17495=>26692, -17496=>26693, -17497=>26694, -17498=>26695, -17499=>26696, -17500=>26697, -17501=>26698, -17502=>26699, -17503=>26700, -17504=>26701, -17505=>26702, -17506=>26703, -17507=>26704, -17508=>26705, -17509=>26706, -17510=>26707, -17511=>26708, -17512=>26709, -17513=>26710, -17514=>26711, -17515=>26712, -17516=>26713, -17517=>26714, -17518=>26715, -17519=>26716, -17520=>26717, -17521=>26718, -17522=>26719, -17523=>26720, -17524=>26721, -17525=>26722, -17526=>26723, -17527=>26724, -17528=>26725, -17529=>26726, -17530=>26727, -17531=>26728, -17532=>26729, -17533=>26730, -17534=>26731, -17535=>26732, -17536=>26733, -17537=>26734, -17538=>26735, -17539=>26736, -17540=>26737, -17541=>26738, -17542=>26739, -17543=>26740, -17544=>26741, -17545=>26742, -17546=>26743, -17547=>26744, -17548=>26745, -17549=>26746, -17550=>26747, -17551=>26748, -17552=>26749, -17553=>26750, -17554=>26751, -17555=>26752, -17556=>26753, -17557=>26754, -17558=>26755, -17559=>26756, -17560=>26757, -17561=>26758, -17562=>26759, -17563=>26760, -17564=>26761, -17565=>26762, -17566=>26763, -17567=>26764, -17568=>26765, -17569=>26766, -17570=>26767, -17571=>26768, -17572=>26769, -17573=>26770, -17574=>26771, -17575=>26772, -17576=>26773, -17577=>26774, -17578=>26775, -17579=>26776, -17580=>26777, -17581=>26778, -17582=>26779, -17583=>26780, -17584=>26781, -17585=>26782, -17586=>26783, -17587=>26784, -17588=>26785, -17589=>26786, -17590=>26787, -17591=>26788, -17592=>26789, -17593=>26790, -17594=>26791, -17595=>26792, -17596=>26793, -17597=>26794, -17598=>26795, -17599=>26796, -17600=>26797, -17601=>26798, -17602=>26799, -17603=>26800, -17604=>26801, -17605=>26802, -17606=>26803, -17607=>26804, -17608=>26805, -17609=>26806, -17610=>26807, -17611=>26808, -17612=>26809, -17613=>26810, -17614=>26811, -17615=>26812, -17616=>26813, -17617=>26814, -17618=>26815, -17619=>26816, -17620=>26817, -17621=>26818, -17623=>26819, -17624=>26820, -17625=>26821, -17626=>26822, -17627=>26823, -17628=>26824, -17629=>26825, -17630=>26826, -17631=>26827, -17632=>26828, -17633=>26829, -17634=>26830, -17635=>26831, -17636=>26832, -17637=>26833, -17638=>26834, -17639=>26835, -17640=>26836, -17641=>26837, -17642=>26838, -17643=>26839, -17644=>26840, -17645=>26841, -17646=>26842, -17647=>26843, -17648=>26844, -17649=>26845, -17650=>26846, -17651=>26847, -17652=>26848, -17653=>26849, -17654=>26850, -17655=>26851, -17656=>26852, -17657=>26853, -17658=>26854, -17659=>26855, -17660=>26856, -17661=>26857, -17662=>26858, -17663=>26859, -17664=>26860, -17665=>26861, -17666=>26862, -17667=>26863, -17668=>26864, -17669=>26865, -17670=>26866, -17671=>26867, -17672=>26868, -17673=>26869, -17674=>26870, -17675=>26871, -17676=>26872, -17677=>26873, -17678=>26874, -17679=>26875, -17680=>26876, -17681=>26877, -17682=>26878, -17683=>26879, -17684=>26880, -17685=>26881, -17686=>26882, -17687=>26883, -17688=>26884, -17689=>26885, -17690=>26886, -17691=>26887, -17692=>26888, -17693=>26889, -17694=>26890, -17695=>26891, -17696=>26892, -17697=>26893, -17698=>26894, -17699=>26895, -17700=>26896, -17701=>26897, -17702=>26898, -17703=>26899, -17704=>26900, -17705=>26901, -17706=>26902, -17707=>26903, -17708=>26904, -17709=>26905, -17710=>26906, -17711=>26907, -17712=>26908, -17713=>26909, -17714=>26910, -17715=>26911, -17716=>26912, -17717=>26913, -17718=>26914, -17719=>26915, -17720=>26916, -17721=>26917, -17722=>26918, -17723=>26919, -17724=>26920, -17725=>26921, -17726=>26922, -17727=>26923, -17728=>26924, -17729=>26925, -17730=>26926, -17731=>26927, -17732=>26928, -17733=>26929, -17734=>26930, -17735=>26931, -17736=>26932, -17737=>26933, -17738=>26934, -17739=>26935, -17740=>26936, -17741=>26937, -17742=>26938, -17743=>26939, -17744=>26940, -17745=>26941, -17746=>26942, -17747=>26943, -17748=>26944, -17749=>26945, -17750=>26946, -17751=>26947, -17752=>26948, -17753=>26949, -17754=>26950, -17755=>26951, -17756=>26952, -17757=>26953, -17758=>26954, -17759=>26955, -17760=>26956, -17761=>26957, -17762=>26958, -17763=>26959, -17764=>26960, -17765=>26961, -17766=>26962, -17767=>26963, -17768=>26964, -17769=>26965, -17770=>26966, -17771=>26967, -17772=>26968, -17773=>26969, -17774=>26970, -17775=>26971, -17776=>26972, -17777=>26973, -17778=>26974, -17779=>26975, -17780=>26976, -17781=>26977, -17782=>26978, -17783=>26979, -17784=>26980, -17785=>26981, -17786=>26982, -17787=>26983, -17788=>26984, -17789=>26985, -17790=>26986, -17791=>26987, -17792=>26988, -17793=>26989, -17794=>26990, -17795=>26991, -17796=>26992, -17797=>26993, -17798=>26994, -17799=>26995, -17800=>26996, -17801=>26997, -17802=>26998, -17803=>26999, -17804=>27000, -17805=>27001, -17806=>27002, -17807=>27003, -17808=>27004, -17809=>27005, -17810=>27006, -17811=>27007, -17812=>27008, -17813=>27009, -17814=>27010, -17815=>27011, -17816=>27012, -17817=>27013, -17818=>27014, -17819=>27015, -17820=>27016, -17821=>27017, -17822=>27018, -17823=>27019, -17824=>27020, -17825=>27021, -17826=>27022, -17827=>27023, -17828=>27024, -17829=>27025, -17830=>27026, -17831=>27027, -17832=>27028, -17833=>27029, -17834=>27030, -17835=>27031, -17836=>27032, -17837=>27033, -17838=>27034, -17839=>27035, -17840=>27036, -17841=>27037, -17842=>27038, -17843=>27039, -17844=>27040, -17845=>27041, -17846=>27042, -17847=>27043, -17848=>27044, -17849=>27045, -17850=>27046, -17851=>27047, -17852=>27048, -17853=>27049, -17854=>27050, -17855=>27051, -17856=>27052, -17857=>27053, -17858=>27054, -17859=>27055, -17860=>27056, -17861=>27057, -17862=>27058, -17863=>27059, -17864=>27060, -17865=>27061, -17866=>27062, -17867=>27063, -17868=>27064, -17869=>27065, -17870=>27066, -17871=>27067, -17872=>27068, -17873=>27069, -17874=>27070, -17875=>27071, -17876=>27072, -17877=>27073, -17878=>27074, -17879=>27075, -17880=>27076, -17881=>27077, -17882=>27078, -17883=>27079, -17884=>27080, -17885=>27081, -17886=>27082, -17887=>27083, -17888=>27084, -17889=>27085, -17890=>27086, -17891=>27087, -17892=>27088, -17893=>27089, -17894=>27090, -17895=>27091, -17896=>27092, -17897=>27093, -17898=>27094, -17899=>27095, -17900=>27096, -17901=>27097, -17902=>27098, -17903=>27099, -17904=>27100, -17905=>27101, -17906=>27102, -17907=>27103, -17908=>27104, -17909=>27105, -17910=>27106, -17911=>27107, -17912=>27108, -17913=>27109, -17914=>27110, -17915=>27111, -17916=>27112, -17917=>27113, -17918=>27114, -17919=>27115, -17920=>27116, -17921=>27117, -17922=>27118, -17923=>27119, -17924=>27120, -17925=>27121, -17926=>27122, -17927=>27123, -17928=>27124, -17929=>27125, -17930=>27126, -17931=>27127, -17932=>27128, -17933=>27129, -17934=>27130, -17935=>27131, -17936=>27132, -17937=>27133, -17938=>27134, -17939=>27135, -17940=>27136, -17941=>27137, -17942=>27138, -17943=>27139, -17944=>27140, -17945=>27141, -17946=>27142, -17947=>27143, -17948=>27144, -17949=>27145, -17950=>27146, -17951=>27147, -17952=>27148, -17953=>27149, -17954=>27150, -17955=>27151, -17956=>27152, -17957=>27153, -17958=>27154, -17959=>27155, -17960=>27156, -17961=>27157, -17962=>27158, -17963=>27159, -17964=>27160, -17965=>27161, -17966=>27162, -17967=>27163, -17968=>27164, -17969=>27165, -17970=>27166, -17971=>27167, -17972=>27168, -17973=>27169, -17974=>27170, -17975=>27171, -17976=>27172, -17977=>27173, -17978=>27174, -17979=>27175, -17980=>27176, -17981=>27177, -17982=>27178, -17983=>27179, -17984=>27180, -17985=>27181, -17986=>27182, -17987=>27183, -17988=>27184, -17989=>27185, -17990=>27186, -17991=>27187, -17992=>27188, -17993=>27189, -17994=>27190, -17995=>27191, -17997=>27192, -17998=>27193, -17999=>27194, -18000=>27195, -18001=>27196, -18002=>27197, -18003=>27198, -18004=>27199, -18005=>27200, -18006=>27201, -18007=>27202, -18008=>27203, -18009=>27204, -18010=>27205, -18011=>27206, -18012=>27207, -18013=>27208, -18014=>27209, -18015=>27210, -18016=>27211, -18018=>27212, -18019=>27213, -18020=>27214, -18021=>27215, -18022=>27216, -18023=>27217, -18024=>27218, -18025=>27219, -18026=>27220, -18027=>27221, -18028=>27222, -18029=>27223, -18030=>27224, -18031=>27225, -18032=>27226, -18033=>27227, -18034=>27228, -18035=>27229, -18036=>27230, -18037=>27231, -18038=>27232, -18039=>27233, -18040=>27234, -18041=>27235, -18042=>27236, -18043=>27237, -18044=>27238, -18045=>27239, -18046=>27240, -18047=>27241, -18048=>27242, -18049=>27243, -18050=>27244, -18051=>27245, -18052=>27246, -18053=>27247, -18054=>27248, -18055=>27249, -18056=>27250, -18057=>27251, -18058=>27252, -18059=>27253, -18060=>27254, -18061=>27255, -18062=>27256, -18063=>27257, -18064=>27258, -18065=>27259, -18066=>27260, -18067=>27261, -18068=>27262, -18069=>27263, -18070=>27264, -18071=>27265, -18072=>27266, -18073=>27267, -18074=>27268, -18075=>27269, -18076=>27270, -18077=>27271, -18078=>27272, -18079=>27273, -18080=>27274, -18081=>27275, -18082=>27276, -18083=>27277, -18084=>27278, -18085=>27279, -18086=>27280, -18087=>27281, -18088=>27282, -18089=>27283, -18090=>27284, -18091=>27285, -18092=>27286, -18093=>27287, -18094=>27288, -18095=>27289, -18096=>27290, -18097=>27291, -18098=>27292, -18099=>27293, -18100=>27294, -18101=>27295, -18102=>27296, -18103=>27297, -18104=>27298, -18105=>27299, -18106=>27300, -18107=>27301, -18108=>27302, -18109=>27303, -18110=>27304, -18111=>27305, -18112=>27306, -18113=>27307, -18114=>27308, -18115=>27309, -18116=>27310, -18117=>27311, -18118=>27312, -18119=>27313, -18120=>27314, -18121=>27315, -18122=>27316, -18123=>27317, -18124=>27318, -18125=>27319, -18126=>27320, -18127=>27321, -18128=>27322, -18129=>27323, -18130=>27324, -18131=>27325, -18132=>27326, -18133=>27327, -18134=>27328, -18135=>27329, -18136=>27330, -18137=>27331, -18138=>27332, -18139=>27333, -18140=>27334, -18141=>27335, -18142=>27336, -18143=>27337, -18144=>27338, -18145=>27339, -18146=>27340, -18147=>27341, -18148=>27342, -18149=>27343, -18150=>27344, -18151=>27345, -18152=>27346, -18153=>27347, -18154=>27348, -18155=>27349, -18156=>27350, -18157=>27351, -18158=>27352, -18159=>27353, -18160=>27354, -18161=>27355, -18162=>27356, -18163=>27357, -18164=>27358, -18165=>27359, -18166=>27360, -18167=>27361, -18168=>27362, -18169=>27363, -18170=>27364, -18171=>27365, -18172=>27366, -18173=>27367, -18174=>27368, -18175=>27369, -18176=>27370, -18177=>27371, -18178=>27372, -18179=>27373, -18180=>27374, -18181=>27375, -18182=>27376, -18183=>27377, -18184=>27378, -18185=>27379, -18186=>27380, -18187=>27381, -18188=>27382, -18189=>27383, -18190=>27384, -18191=>27385, -18192=>27386, -18193=>27387, -18194=>27388, -18195=>27389, -18196=>27390, -18197=>27391, -18198=>27392, -18199=>27393, -18200=>27394, -18201=>27395, -18202=>27396, -18203=>27397, -18204=>27398, -18205=>27399, -18206=>27400, -18207=>27401, -18208=>27402, -18209=>27403, -18210=>27404, -18212=>27405, -18213=>27406, -18214=>27407, -18215=>27408, -18216=>27409, -18218=>27410, -18219=>27411, -18220=>27412, -18221=>27413, -18222=>27414, -18223=>27415, -18224=>27416, -18225=>27417, -18226=>27418, -18227=>27419, -18228=>27420, -18229=>27421, -18230=>27422, -18231=>27423, -18232=>27424, -18233=>27425, -18234=>27426, -18235=>27427, -18236=>27428, -18237=>27429, -18238=>27430, -18239=>27431, -18240=>27432, -18241=>27433, -18242=>27434, -18243=>27435, -18244=>27436, -18245=>27437, -18246=>27438, -18247=>27439, -18248=>27440, -18249=>27441, -18250=>27442, -18251=>27443, -18252=>27444, -18253=>27445, -18254=>27446, -18255=>27447, -18256=>27448, -18257=>27449, -18258=>27450, -18259=>27451, -18260=>27452, -18261=>27453, -18262=>27454, -18263=>27455, -18264=>27456, -18265=>27457, -18266=>27458, -18267=>27459, -18268=>27460, -18269=>27461, -18270=>27462, -18271=>27463, -18272=>27464, -18273=>27465, -18274=>27466, -18275=>27467, -18276=>27468, -18277=>27469, -18278=>27470, -18279=>27471, -18280=>27472, -18281=>27473, -18282=>27474, -18283=>27475, -18284=>27476, -18285=>27477, -18286=>27478, -18287=>27479, -18288=>27480, -18289=>27481, -18290=>27482, -18291=>27483, -18292=>27484, -18293=>27485, -18294=>27486, -18295=>27487, -18296=>27488, -18297=>27489, -18298=>27490, -18299=>27491, -18301=>27492, -18302=>27493, -18303=>27494, -18304=>27495, -18305=>27496, -18306=>27497, -18307=>27498, -18308=>27499, -18309=>27500, -18310=>27501, -18311=>27502, -18312=>27503, -18313=>27504, -18314=>27505, -18315=>27506, -18316=>27507, -18318=>27508, -18319=>27509, -18320=>27510, -18321=>27511, -18322=>27512, -18323=>27513, -18324=>27514, -18325=>27515, -18326=>27516, -18327=>27517, -18328=>27518, -18329=>27519, -18330=>27520, -18331=>27521, -18332=>27522, -18333=>27523, -18334=>27524, -18335=>27525, -18336=>27526, -18337=>27527, -18338=>27528, -18339=>27529, -18340=>27530, -18341=>27531, -18342=>27532, -18343=>27533, -18344=>27534, -18345=>27535, -18346=>27536, -18347=>27537, -18348=>27538, -18349=>27539, -18350=>27540, -18351=>27541, -18352=>27542, -18353=>27543, -18354=>27544, -18355=>27545, -18356=>27546, -18357=>27547, -18358=>27548, -18359=>27549, -18360=>27550, -18361=>27551, -18362=>27552, -18363=>27553, -18364=>27554, -18365=>27555, -18366=>27556, -18367=>27557, -18368=>27558, -18369=>27559, -18370=>27560, -18371=>27561, -18372=>27562, -18373=>27563, -18374=>27564, -18375=>27565, -18376=>27566, -18377=>27567, -18378=>27568, -18379=>27569, -18380=>27570, -18381=>27571, -18382=>27572, -18383=>27573, -18384=>27574, -18385=>27575, -18386=>27576, -18387=>27577, -18388=>27578, -18389=>27579, -18390=>27580, -18391=>27581, -18392=>27582, -18393=>27583, -18394=>27584, -18395=>27585, -18396=>27586, -18397=>27587, -18398=>27588, -18399=>27589, -18400=>27590, -18401=>27591, -18402=>27592, -18403=>27593, -18404=>27594, -18405=>27595, -18406=>27596, -18407=>27597, -18408=>27598, -18409=>27599, -18410=>27600, -18411=>27601, -18412=>27602, -18413=>27603, -18414=>27604, -18415=>27605, -18416=>27606, -18417=>27607, -18418=>27608, -18419=>27609, -18420=>27610, -18421=>27611, -18422=>27612, -18423=>27613, -18424=>27614, -18425=>27615, -18426=>27616, -18427=>27617, -18428=>27618, -18429=>27619, -18430=>27620, -18431=>27621, -18432=>27622, -18433=>27623, -18434=>27624, -18435=>27625, -18436=>27626, -18437=>27627, -18438=>27628, -18439=>27629, -18440=>27630, -18441=>27631, -18442=>27632, -18443=>27633, -18444=>27634, -18445=>27635, -18446=>27636, -18447=>27637, -18448=>27638, -18449=>27639, -18450=>27640, -18451=>27641, -18452=>27642, -18453=>27643, -18454=>27644, -18455=>27645, -18456=>27646, -18457=>27647, -18458=>27648, -18459=>27649, -18460=>27650, -18461=>27651, -18462=>27652, -18463=>27653, -18464=>27654, -18465=>27655, -18466=>27656, -18467=>27657, -18468=>27658, -18469=>27659, -18470=>27660, -18471=>27661, -18472=>27662, -18473=>27663, -18474=>27664, -18475=>27665, -18476=>27666, -18477=>27667, -18478=>27668, -18479=>27669, -18480=>27670, -18481=>27671, -18482=>27672, -18483=>27673, -18484=>27674, -18485=>27675, -18486=>27676, -18487=>27677, -18488=>27678, -18489=>27679, -18490=>27680, -18491=>27681, -18492=>27682, -18493=>27683, -18494=>27684, -18495=>27685, -18496=>27686, -18497=>27687, -18498=>27688, -18499=>27689, -18500=>27690, -18501=>27691, -18502=>27692, -18503=>27693, -18504=>27694, -18505=>27695, -18506=>27696, -18507=>27697, -18508=>27698, -18509=>27699, -18510=>27700, -18511=>27701, -18512=>27702, -18513=>27703, -18514=>27704, -18515=>27705, -18516=>27706, -18517=>27707, -18518=>27708, -18519=>27709, -18520=>27710, -18521=>27711, -18522=>27712, -18523=>27713, -18524=>27714, -18525=>27715, -18526=>27716, -18527=>27717, -18528=>27718, -18529=>27719, -18530=>27720, -18531=>27721, -18532=>27722, -18533=>27723, -18534=>27724, -18535=>27725, -18536=>27726, -18537=>27727, -18538=>27728, -18539=>27729, -18540=>27730, -18541=>27731, -18542=>27732, -18543=>27733, -18544=>27734, -18545=>27735, -18546=>27736, -18547=>27737, -18548=>27738, -18549=>27739, -18550=>27740, -18551=>27741, -18552=>27742, -18553=>27743, -18554=>27744, -18555=>27745, -18556=>27746, -18557=>27747, -18558=>27748, -18559=>27749, -18560=>27750, -18561=>27751, -18562=>27752, -18563=>27753, -18564=>27754, -18565=>27755, -18566=>27756, -18567=>27757, -18568=>27758, -18569=>27759, -18570=>27760, -18571=>27761, -18572=>27762, -18573=>27763, -18574=>27764, -18575=>27765, -18576=>27766, -18577=>27767, -18578=>27768, -18579=>27769, -18580=>27770, -18581=>27771, -18582=>27772, -18583=>27773, -18584=>27774, -18585=>27775, -18586=>27776, -18587=>27777, -18588=>27778, -18589=>27779, -18590=>27780, -18591=>27781, -18592=>27782, -18593=>27783, -18594=>27784, -18595=>27785, -18596=>27786, -18597=>27787, -18598=>27788, -18599=>27789, -18600=>27790, -18601=>27791, -18602=>27792, -18603=>27793, -18604=>27794, -18605=>27795, -18606=>27796, -18607=>27797, -18608=>27798, -18609=>27799, -18610=>27800, -18611=>27801, -18612=>27802, -18613=>27803, -18614=>27804, -18615=>27805, -18616=>27806, -18617=>27807, -18618=>27808, -18619=>27809, -18620=>27810, -18621=>27811, -18622=>27812, -18623=>27813, -18624=>27814, -18625=>27815, -18626=>27816, -18627=>27817, -18628=>27818, -18629=>27819, -18630=>27820, -18631=>27821, -18632=>27822, -18633=>27823, -18634=>27824, -18635=>27825, -18636=>27826, -18637=>27827, -18638=>27828, -18639=>27829, -18640=>27830, -18641=>27831, -18642=>27832, -18643=>27833, -18644=>27834, -18645=>27835, -18646=>27836, -18647=>27837, -18648=>27838, -18649=>27839, -18650=>27840, -18651=>27841, -18652=>27842, -18653=>27843, -18654=>27844, -18655=>27845, -18656=>27846, -18657=>27847, -18658=>27848, -18659=>27849, -18660=>27850, -18661=>27851, -18662=>27852, -18663=>27853, -18664=>27854, -18665=>27855, -18666=>27856, -18667=>27857, -18668=>27858, -18669=>27859, -18670=>27860, -18671=>27861, -18672=>27862, -18673=>27863, -18674=>27864, -18675=>27865, -18676=>27866, -18677=>27867, -18678=>27868, -18679=>27869, -18680=>27870, -18681=>27871, -18682=>27872, -18683=>27873, -18684=>27874, -18685=>27875, -18686=>27876, -18687=>27877, -18688=>27878, -18689=>27879, -18690=>27880, -18691=>27881, -18692=>27882, -18693=>27883, -18694=>27884, -18695=>27885, -18696=>27886, -18697=>27887, -18698=>27888, -18699=>27889, -18700=>27890, -18701=>27891, -18702=>27892, -18703=>27893, -18704=>27894, -18705=>27895, -18706=>27896, -18707=>27897, -18708=>27898, -18709=>27899, -18710=>27900, -18711=>27901, -18712=>27902, -18713=>27903, -18714=>27904, -18715=>27905, -18716=>27906, -18717=>27907, -18718=>27908, -18719=>27909, -18720=>27910, -18721=>27911, -18722=>27912, -18723=>27913, -18724=>27914, -18725=>27915, -18726=>27916, -18727=>27917, -18728=>27918, -18729=>27919, -18730=>27920, -18731=>27921, -18732=>27922, -18733=>27923, -18734=>27924, -18735=>27925, -18736=>27926, -18737=>27927, -18738=>27928, -18739=>27929, -18740=>27930, -18741=>27931, -18742=>27932, -18743=>27933, -18744=>27934, -18745=>27935, -18746=>27936, -18747=>27937, -18748=>27938, -18749=>27939, -18750=>27940, -18751=>27941, -18752=>27942, -18753=>27943, -18754=>27944, -18755=>27945, -18756=>27946, -18757=>27947, -18758=>27948, -18760=>27949, -18761=>27950, -18762=>27951, -18763=>27952, -18764=>27953, -18765=>27954, -18766=>27955, -18767=>27956, -18768=>27957, -18769=>27958, -18770=>27959, -18771=>27960, -18772=>27961, -18773=>27962, -18774=>27963, -18775=>27964, -18776=>27965, -18777=>27966, -18778=>27967, -18779=>27968, -18780=>27969, -18781=>27970, -18782=>27971, -18783=>27972, -18784=>27973, -18785=>27974, -18786=>27975, -18787=>27976, -18788=>27977, -18789=>27978, -18790=>27979, -18791=>27980, -18792=>27981, -18793=>27982, -18794=>27983, -18795=>27984, -18796=>27985, -18797=>27986, -18798=>27987, -18799=>27988, -18800=>27989, -18801=>27990, -18802=>27991, -18803=>27992, -18804=>27993, -18805=>27994, -18806=>27995, -18807=>27996, -18808=>27997, -18809=>27998, -18811=>27999, -18812=>28000, -18814=>28001, -18815=>28002, -18816=>28003, -18817=>28004, -18820=>28005, -18823=>28006, -18824=>28007, -18825=>28008, -18826=>28009, -18827=>28010, -18828=>28011, -18829=>28012, -18830=>28013, -18831=>28014, -18832=>28015, -18833=>28016, -18834=>28017, -18835=>28018, -18836=>28019, -18837=>28020, -18838=>28021, -18839=>28022, -18840=>28023, -18841=>28024, -18842=>28025, -18844=>28026, -18845=>28027, -18846=>28028, -18848=>28029, -18849=>28030, -18850=>28031, -18851=>28032, -18852=>28033, -18853=>28034, -18854=>28035, -18855=>28036, -18856=>28037, -18857=>28038, -18858=>28039, -18859=>28040, -18860=>28041, -18861=>28042, -18862=>28043, -18863=>28044, -18864=>28045, -18865=>28046, -18866=>28047, -18867=>28048, -18868=>28049, -18869=>28050, -18872=>28051, -18873=>28052, -18874=>28053, -18875=>28054, -18876=>28055, -18877=>28056, -18878=>28057, -18879=>28058, -18880=>28059, -18881=>28060, -18882=>28061, -18883=>28062, -18884=>28063, -18885=>28064, -18886=>28065, -18887=>28066, -18888=>28067, -18889=>28068, -18890=>28069, -18891=>28070, -18892=>28071, -18893=>28072, -18894=>28073, -18895=>28074, -18896=>28075, -18897=>28076, -18898=>28077, -18899=>28078, -18900=>28079, -18901=>28080, -18902=>28081, -18903=>28082, -18904=>28083, -18905=>28084, -18906=>28085, -18907=>28086, -18908=>28087, -18909=>28088, -18910=>28089, -18911=>28090, -18912=>28091, -18913=>28092, -18914=>28093, -18915=>28094, -18916=>28095, -18917=>28096, -18918=>28097, -18919=>28098, -18920=>28099, -18921=>28100, -18922=>28101, -18923=>28102, -18924=>28103, -18925=>28104, -18926=>28105, -18927=>28106, -18928=>28107, -18929=>28108, -18930=>28109, -18931=>28110, -18932=>28111, -18933=>28112, -18934=>28113, -18935=>28114, -18936=>28115, -18937=>28116, -18938=>28117, -18939=>28118, -18940=>28119, -18941=>28120, -18942=>28121, -18943=>28122, -18944=>28123, -18945=>28124, -18946=>28125, -18947=>28126, -18948=>28127, -18949=>28128, -18950=>28129, -18951=>28130, -18952=>28131, -18953=>28132, -18954=>28133, -18955=>28134, -18956=>28135, -18957=>28136, -18958=>28137, -18959=>28138, -18960=>28139, -18961=>28140, -18962=>28141, -18963=>28142, -18964=>28143, -18965=>28144, -18966=>28145, -18967=>28146, -18968=>28147, -18969=>28148, -18970=>28149, -18971=>28150, -18972=>28151, -18973=>28152, -18974=>28153, -18975=>28154, -18976=>28155, -18977=>28156, -18978=>28157, -18979=>28158, -18980=>28159, -18981=>28160, -18982=>28161, -18983=>28162, -18984=>28163, -18985=>28164, -18986=>28165, -18987=>28166, -18988=>28167, -18989=>28168, -18990=>28169, -18991=>28170, -18992=>28171, -18993=>28172, -18994=>28173, -18995=>28174, -18996=>28175, -18997=>28176, -18998=>28177, -18999=>28178, -19000=>28179, -19001=>28180, -19002=>28181, -19003=>28182, -19004=>28183, -19005=>28184, -19006=>28185, -19007=>28186, -19008=>28187, -19009=>28188, -19010=>28189, -19011=>28190, -19012=>28191, -19013=>28192, -19014=>28193, -19015=>28194, -19016=>28195, -19017=>28196, -19018=>28197, -19019=>28198, -19020=>28199, -19021=>28200, -19022=>28201, -19023=>28202, -19024=>28203, -19025=>28204, -19026=>28205, -19027=>28206, -19028=>28207, -19029=>28208, -19030=>28209, -19031=>28210, -19032=>28211, -19033=>28212, -19034=>28213, -19035=>28214, -19036=>28215, -19037=>28216, -19038=>28217, -19039=>28218, -19040=>28219, -19041=>28220, -19042=>28221, -19043=>28222, -19044=>28223, -19045=>28224, -19046=>28225, -19047=>28226, -19048=>28227, -19049=>28228, -19050=>28229, -19051=>28230, -19052=>28231, -19053=>28232, -19054=>28233, -19055=>28234, -19056=>28235, -19057=>28236, -19058=>28237, -19059=>28238, -19060=>28239, -19061=>28240, -19062=>28241, -19063=>28242, -19064=>28243, -19065=>28244, -19066=>28245, -19067=>28246, -19068=>28247, -19069=>28248, -19070=>28249, -19071=>28250, -19072=>28251, -19073=>28252, -19074=>28253, -19075=>28254, -19076=>28255, -19077=>28256, -19078=>28257, -19079=>28258, -19080=>28259, -19081=>28260, -19082=>28261, -19083=>28262, -19084=>28263, -19085=>28264, -19086=>28265, -19087=>28266, -19088=>28267, -19089=>28268, -19090=>28269, -19091=>28270, -19092=>28271, -19093=>28272, -19094=>28273, -19095=>28274, -19096=>28275, -19097=>28276, -19098=>28277, -19099=>28278, -19100=>28279, -19101=>28280, -19102=>28281, -19103=>28282, -19104=>28283, -19105=>28284, -19106=>28285, -19107=>28286, -19108=>28287, -19109=>28288, -19110=>28289, -19111=>28290, -19112=>28291, -19113=>28292, -19114=>28293, -19115=>28294, -19116=>28295, -19117=>28296, -19118=>28297, -19119=>28298, -19120=>28299, -19121=>28300, -19122=>28301, -19123=>28302, -19124=>28303, -19125=>28304, -19126=>28305, -19127=>28306, -19128=>28307, -19129=>28308, -19130=>28309, -19131=>28310, -19132=>28311, -19133=>28312, -19134=>28313, -19135=>28314, -19136=>28315, -19137=>28316, -19138=>28317, -19139=>28318, -19140=>28319, -19141=>28320, -19142=>28321, -19143=>28322, -19144=>28323, -19145=>28324, -19146=>28325, -19147=>28326, -19148=>28327, -19149=>28328, -19150=>28329, -19151=>28330, -19152=>28331, -19153=>28332, -19154=>28333, -19155=>28334, -19156=>28335, -19157=>28336, -19158=>28337, -19159=>28338, -19160=>28339, -19161=>28340, -19162=>28341, -19163=>28342, -19164=>28343, -19165=>28344, -19166=>28345, -19167=>28346, -19168=>28347, -19169=>28348, -19170=>28349, -19171=>28350, -19172=>28351, -19173=>28352, -19174=>28353, -19175=>28354, -19176=>28355, -19177=>28356, -19178=>28357, -19179=>28358, -19180=>28359, -19181=>28360, -19182=>28361, -19183=>28362, -19184=>28363, -19185=>28364, -19186=>28365, -19187=>28366, -19188=>28367, -19189=>28368, -19190=>28369, -19191=>28370, -19192=>28371, -19193=>28372, -19194=>28373, -19195=>28374, -19196=>28375, -19197=>28376, -19198=>28377, -19199=>28378, -19200=>28379, -19201=>28380, -19202=>28381, -19203=>28382, -19204=>28383, -19205=>28384, -19206=>28385, -19207=>28386, -19208=>28387, -19209=>28388, -19210=>28389, -19211=>28390, -19212=>28391, -19213=>28392, -19214=>28393, -19215=>28394, -19216=>28395, -19217=>28396, -19218=>28397, -19219=>28398, -19220=>28399, -19221=>28400, -19222=>28401, -19223=>28402, -19224=>28403, -19225=>28404, -19226=>28405, -19227=>28406, -19228=>28407, -19229=>28408, -19230=>28409, -19231=>28410, -19232=>28411, -19233=>28412, -19234=>28413, -19235=>28414, -19236=>28415, -19237=>28416, -19238=>28417, -19239=>28418, -19240=>28419, -19241=>28420, -19242=>28421, -19243=>28422, -19244=>28423, -19245=>28424, -19246=>28425, -19247=>28426, -19248=>28427, -19249=>28428, -19250=>28429, -19251=>28430, -19252=>28431, -19253=>28432, -19254=>28433, -19255=>28434, -19256=>28435, -19257=>28436, -19258=>28437, -19259=>28438, -19260=>28439, -19261=>28440, -19262=>28441, -19263=>28442, -19264=>28443, -19265=>28444, -19266=>28445, -19267=>28446, -19268=>28447, -19269=>28448, -19270=>28449, -19271=>28450, -19272=>28451, -19273=>28452, -19274=>28453, -19275=>28454, -19276=>28455, -19277=>28456, -19278=>28457, -19279=>28458, -19280=>28459, -19281=>28460, -19282=>28461, -19283=>28462, -19284=>28463, -19285=>28464, -19286=>28465, -19287=>28466, -19288=>28467, -19289=>28468, -19290=>28469, -19291=>28470, -19292=>28471, -19293=>28472, -19294=>28473, -19295=>28474, -19296=>28475, -19297=>28476, -19298=>28477, -19299=>28478, -19300=>28479, -19301=>28480, -19302=>28481, -19303=>28482, -19304=>28483, -19305=>28484, -19306=>28485, -19307=>28486, -19308=>28487, -19309=>28488, -19310=>28489, -19311=>28490, -19312=>28491, -19313=>28492, -19314=>28493, -19315=>28494, -19316=>28495, -19317=>28496, -19318=>28497, -19319=>28498, -19320=>28499, -19321=>28500, -19322=>28501, -19323=>28502, -19324=>28503, -19325=>28504, -19326=>28505, -19327=>28506, -19328=>28507, -19329=>28508, -19330=>28509, -19331=>28510, -19332=>28511, -19333=>28512, -19334=>28513, -19335=>28514, -19336=>28515, -19337=>28516, -19338=>28517, -19339=>28518, -19340=>28519, -19341=>28520, -19342=>28521, -19343=>28522, -19344=>28523, -19345=>28524, -19346=>28525, -19347=>28526, -19348=>28527, -19349=>28528, -19350=>28529, -19351=>28530, -19352=>28531, -19353=>28532, -19354=>28533, -19355=>28534, -19356=>28535, -19357=>28536, -19358=>28537, -19359=>28538, -19360=>28539, -19361=>28540, -19362=>28541, -19363=>28542, -19364=>28543, -19365=>28544, -19366=>28545, -19367=>28546, -19368=>28547, -19369=>28548, -19370=>28549, -19371=>28550, -19372=>28551, -19373=>28552, -19374=>28553, -19375=>28554, -19376=>28555, -19377=>28556, -19378=>28557, -19379=>28558, -19380=>28559, -19381=>28560, -19382=>28561, -19383=>28562, -19384=>28563, -19385=>28564, -19386=>28565, -19387=>28566, -19388=>28567, -19389=>28568, -19390=>28569, -19391=>28570, -19392=>28571, -19393=>28572, -19394=>28573, -19395=>28574, -19396=>28575, -19397=>28576, -19398=>28577, -19399=>28578, -19400=>28579, -19401=>28580, -19402=>28581, -19403=>28582, -19404=>28583, -19405=>28584, -19406=>28585, -19407=>28586, -19408=>28587, -19409=>28588, -19410=>28589, -19411=>28590, -19412=>28591, -19413=>28592, -19414=>28593, -19415=>28594, -19416=>28595, -19417=>28596, -19418=>28597, -19419=>28598, -19420=>28599, -19421=>28600, -19422=>28601, -19423=>28602, -19424=>28603, -19425=>28604, -19426=>28605, -19427=>28606, -19428=>28607, -19429=>28608, -19430=>28609, -19431=>28610, -19432=>28611, -19433=>28612, -19434=>28613, -19435=>28614, -19436=>28615, -19437=>28616, -19438=>28617, -19439=>28618, -19440=>28619, -19441=>28620, -19442=>28621, -19443=>28622, -19444=>28623, -19445=>28624, -19446=>28625, -19447=>28626, -19448=>28627, -19449=>28628, -19450=>28629, -19451=>28630, -19452=>28631, -19453=>28632, -19454=>28633, -19455=>28634, -19456=>28635, -19457=>28636, -19458=>28637, -19459=>28638, -19460=>28639, -19461=>28640, -19462=>28641, -19463=>28642, -19464=>28643, -19465=>28644, -19466=>28645, -19467=>28646, -19468=>28647, -19469=>28648, -19470=>28649, -19471=>28650, -19472=>28651, -19473=>28652, -19474=>28653, -19475=>28654, -19476=>28655, -19477=>28656, -19478=>28657, -19479=>28658, -19480=>28659, -19481=>28660, -19482=>28661, -19483=>28662, -19484=>28663, -19485=>28664, -19486=>28665, -19487=>28666, -19488=>28667, -19489=>28668, -19490=>28669, -19491=>28670, -19492=>28671, -19493=>28672, -19494=>28673, -19495=>28674, -19496=>28675, -19497=>28676, -19498=>28677, -19499=>28678, -19500=>28679, -19501=>28680, -19502=>28681, -19503=>28682, -19504=>28683, -19505=>28684, -19506=>28685, -19507=>28686, -19508=>28687, -19509=>28688, -19510=>28689, -19511=>28690, -19512=>28691, -19513=>28692, -19514=>28693, -19515=>28694, -19516=>28695, -19517=>28696, -19518=>28697, -19519=>28698, -19520=>28699, -19521=>28700, -19522=>28701, -19523=>28702, -19524=>28703, -19525=>28704, -19526=>28705, -19527=>28706, -19528=>28707, -19529=>28708, -19530=>28709, -19531=>28710, -19532=>28711, -19533=>28712, -19534=>28713, -19535=>28714, -19536=>28715, -19537=>28716, -19538=>28717, -19539=>28718, -19540=>28719, -19541=>28720, -19542=>28721, -19543=>28722, -19544=>28723, -19545=>28724, -19546=>28725, -19547=>28726, -19548=>28727, -19549=>28728, -19550=>28729, -19551=>28730, -19552=>28731, -19553=>28732, -19554=>28733, -19555=>28734, -19556=>28735, -19557=>28736, -19558=>28737, -19559=>28738, -19560=>28739, -19561=>28740, -19562=>28741, -19563=>28742, -19564=>28743, -19565=>28744, -19566=>28745, -19567=>28746, -19568=>28747, -19569=>28748, -19570=>28749, -19571=>28750, -19572=>28751, -19573=>28752, -19574=>28753, -19576=>28754, -19577=>28755, -19578=>28756, -19579=>28757, -19580=>28758, -19581=>28759, -19582=>28760, -19583=>28761, -19584=>28762, -19585=>28763, -19586=>28764, -19587=>28765, -19588=>28766, -19589=>28767, -19590=>28768, -19591=>28769, -19592=>28770, -19593=>28771, -19594=>28772, -19595=>28773, -19596=>28774, -19597=>28775, -19598=>28776, -19599=>28777, -19600=>28778, -19601=>28779, -19602=>28780, -19603=>28781, -19604=>28782, -19605=>28783, -19606=>28784, -19607=>28785, -19608=>28786, -19609=>28787, -19610=>28788, -19611=>28789, -19612=>28790, -19613=>28791, -19614=>28792, -19620=>28793, -19621=>28794, -19622=>28795, -19623=>28796, -19624=>28797, -19625=>28798, -19626=>28799, -19627=>28800, -19628=>28801, -19629=>28802, -19630=>28803, -19631=>28804, -19632=>28805, -19633=>28806, -19634=>28807, -19635=>28808, -19636=>28809, -19637=>28810, -19638=>28811, -19639=>28812, -19640=>28813, -19641=>28814, -19642=>28815, -19643=>28816, -19644=>28817, -19645=>28818, -19646=>28819, -19647=>28820, -19648=>28821, -19649=>28822, -19650=>28823, -19651=>28824, -19652=>28825, -19653=>28826, -19654=>28827, -19655=>28828, -19656=>28829, -19657=>28830, -19658=>28831, -19659=>28832, -19660=>28833, -19661=>28834, -19662=>28835, -19663=>28836, -19664=>28837, -19665=>28838, -19666=>28839, -19667=>28840, -19668=>28841, -19669=>28842, -19670=>28843, -19671=>28844, -19672=>28845, -19673=>28846, -19674=>28847, -19675=>28848, -19676=>28849, -19677=>28850, -19678=>28851, -19679=>28852, -19680=>28853, -19681=>28854, -19682=>28855, -19683=>28856, -19684=>28857, -19685=>28858, -19686=>28859, -19687=>28860, -19688=>28861, -19689=>28862, -19690=>28863, -19691=>28864, -19692=>28865, -19693=>28866, -19694=>28867, -19695=>28868, -19696=>28869, -19697=>28870, -19698=>28871, -19699=>28872, -19700=>28873, -19701=>28874, -19702=>28875, -19703=>28876, -19704=>28877, -19705=>28878, -19706=>28879, -19707=>28880, -19708=>28881, -19709=>28882, -19710=>28883, -19711=>28884, -19712=>28885, -19713=>28886, -19714=>28887, -19715=>28888, -19716=>28889, -19717=>28890, -19718=>28891, -19719=>28892, -19720=>28893, -19721=>28894, -19722=>28895, -19723=>28896, -19724=>28897, -19725=>28898, -19726=>28899, -19727=>28900, -19728=>28901, -19729=>28902, -19730=>28903, -19738=>28904, -19739=>28905, -19740=>28906, -19741=>28907, -19742=>28908, -19743=>28909, -19744=>28910, -19745=>28911, -19746=>28912, -19747=>28913, -19748=>28914, -19749=>28915, -19750=>28916, -19751=>28917, -19752=>28918, -19753=>28919, -19754=>28920, -19755=>28921, -19756=>28922, -19757=>28923, -19758=>28924, -19759=>28925, -19760=>28926, -19761=>28927, -19762=>28928, -19763=>28929, -19764=>28930, -19765=>28931, -19766=>28932, -19767=>28933, -19768=>28934, -19769=>28935, -19770=>28936, -19771=>28937, -19772=>28938, -19773=>28939, -19774=>28940, -19775=>28941, -19776=>28942, -19777=>28943, -19778=>28944, -19779=>28945, -19780=>28946, -19781=>28947, -19782=>28948, -19783=>28949, -19784=>28950, -19785=>28951, -19786=>28952, -19787=>28953, -19788=>28954, -19789=>28955, -19790=>28956, -19791=>28957, -19792=>28958, -19793=>28959, -19794=>28960, -19795=>28961, -19796=>28962, -19797=>28963, -19798=>28964, -19799=>28965, -19800=>28966, -19801=>28967, -19802=>28968, -19803=>28969, -19804=>28970, -19805=>28971, -19806=>28972, -19807=>28973, -19808=>28974, -19809=>28975, -19810=>28976, -19811=>28977, -19812=>28978, -19813=>28979, -19814=>28980, -19815=>28981, -19816=>28982, -19817=>28983, -19818=>28984, -19819=>28985, -19820=>28986, -19821=>28987, -19822=>28988, -19823=>28989, -19824=>28990, -19825=>28991, -19826=>28992, -19827=>28993, -19828=>28994, -19829=>28995, -19830=>28996, -19831=>28997, -19832=>28998, -19833=>28999, -19834=>29000, -19835=>29001, -19836=>29002, -19837=>29003, -19838=>29004, -19839=>29005, -19840=>29006, -19841=>29007, -19842=>29008, -19843=>29009, -19844=>29010, -19845=>29011, -19846=>29012, -19847=>29013, -19848=>29014, -19849=>29015, -19850=>29016, -19851=>29017, -19852=>29018, -19853=>29019, -19854=>29020, -19855=>29021, -19856=>29022, -19857=>29023, -19858=>29024, -19859=>29025, -19860=>29026, -19861=>29027, -19862=>29028, -19863=>29029, -19864=>29030, -19865=>29031, -19866=>29032, -19867=>29033, -19868=>29034, -19869=>29035, -19870=>29036, -19871=>29037, -19872=>29038, -19873=>29039, -19874=>29040, -19875=>29041, -19876=>29042, -19877=>29043, -19878=>29044, -19879=>29045, -19880=>29046, -19881=>29047, -19882=>29048, -19883=>29049, -19884=>29050, -19885=>29051, -19887=>29052, -19888=>29053, -19889=>29054, -19890=>29055, -19891=>29056, -19892=>29057, -19893=>29058, -40960=>29064, -40961=>29065, -40962=>29066, -40963=>29067, -40964=>29068, -40965=>29069, -40966=>29070, -40967=>29071, -40968=>29072, -40969=>29073, -40970=>29074, -40971=>29075, -40972=>29076, -40973=>29077, -40974=>29078, -40975=>29079, -40976=>29080, -40977=>29081, -40978=>29082, -40979=>29083, -40980=>29084, -40981=>29085, -40982=>29086, -40983=>29087, -40984=>29088, -40985=>29089, -40986=>29090, -40987=>29091, -40988=>29092, -40989=>29093, -40990=>29094, -40991=>29095, -40992=>29096, -40993=>29097, -40994=>29098, -40995=>29099, -40996=>29100, -40997=>29101, -40998=>29102, -40999=>29103, -41000=>29104, -41001=>29105, -41002=>29106, -41003=>29107, -41004=>29108, -41005=>29109, -41006=>29110, -41007=>29111, -41008=>29112, -41009=>29113, -41010=>29114, -41011=>29115, -41012=>29116, -41013=>29117, -41014=>29118, -41015=>29119, -41016=>29120, -41017=>29121, -41018=>29122, -41019=>29123, -41020=>29124, -41021=>29125, -41022=>29126, -41023=>29127, -41024=>29128, -41025=>29129, -41026=>29130, -41027=>29131, -41028=>29132, -41029=>29133, -41030=>29134, -41031=>29135, -41032=>29136, -41033=>29137, -41034=>29138, -41035=>29139, -41036=>29140, -41037=>29141, -41038=>29142, -41039=>29143, -41040=>29144, -41041=>29145, -41042=>29146, -41043=>29147, -41044=>29148, -41045=>29149, -41046=>29150, -41047=>29151, -41048=>29152, -41049=>29153, -41050=>29154, -41051=>29155, -41052=>29156, -41053=>29157, -41054=>29158, -41055=>29159, -41056=>29160, -41057=>29161, -41058=>29162, -41059=>29163, -41060=>29164, -41061=>29165, -41062=>29166, -41063=>29167, -41064=>29168, -41065=>29169, -41066=>29170, -41067=>29171, -41068=>29172, -41069=>29173, -41070=>29174, -41071=>29175, -41072=>29176, -41073=>29177, -41074=>29178, -41075=>29179, -41076=>29180, -41077=>29181, -41078=>29182, -41079=>29183, -41080=>29184, -41081=>29185, -41082=>29186, -41083=>29187, -41084=>29188, -41085=>29189, -41086=>29190, -41087=>29191, -41088=>29192, -41089=>29193, -41090=>29194, -41091=>29195, -41092=>29196, -41093=>29197, -41094=>29198, -41095=>29199, -41096=>29200, -41097=>29201, -41098=>29202, -41099=>29203, -41100=>29204, -41101=>29205, -41102=>29206, -41103=>29207, -41104=>29208, -41105=>29209, -41106=>29210, -41107=>29211, -41108=>29212, -41109=>29213, -41110=>29214, -41111=>29215, -41112=>29216, -41113=>29217, -41114=>29218, -41115=>29219, -41116=>29220, -41117=>29221, -41118=>29222, -41119=>29223, -41120=>29224, -41121=>29225, -41122=>29226, -41123=>29227, -41124=>29228, -41125=>29229, -41126=>29230, -41127=>29231, -41128=>29232, -41129=>29233, -41130=>29234, -41131=>29235, -41132=>29236, -41133=>29237, -41134=>29238, -41135=>29239, -41136=>29240, -41137=>29241, -41138=>29242, -41139=>29243, -41140=>29244, -41141=>29245, -41142=>29246, -41143=>29247, -41144=>29248, -41145=>29249, -41146=>29250, -41147=>29251, -41148=>29252, -41149=>29253, -41150=>29254, -41151=>29255, -41152=>29256, -41153=>29257, -41154=>29258, -41155=>29259, -41156=>29260, -41157=>29261, -41158=>29262, -41159=>29263, -41160=>29264, -41161=>29265, -41162=>29266, -41163=>29267, -41164=>29268, -41165=>29269, -41166=>29270, -41167=>29271, -41168=>29272, -41169=>29273, -41170=>29274, -41171=>29275, -41172=>29276, -41173=>29277, -41174=>29278, -41175=>29279, -41176=>29280, -41177=>29281, -41178=>29282, -41179=>29283, -41180=>29284, -41181=>29285, -41182=>29286, -41183=>29287, -41184=>29288, -41185=>29289, -41186=>29290, -41187=>29291, -41188=>29292, -41189=>29293, -41190=>29294, -41191=>29295, -41192=>29296, -41193=>29297, -41194=>29298, -41195=>29299, -41196=>29300, -41197=>29301, -41198=>29302, -41199=>29303, -41200=>29304, -41201=>29305, -41202=>29306, -41203=>29307, -41204=>29308, -41205=>29309, -41206=>29310, -41207=>29311, -41208=>29312, -41209=>29313, -41210=>29314, -41211=>29315, -41212=>29316, -41213=>29317, -41214=>29318, -41215=>29319, -41216=>29320, -41217=>29321, -41218=>29322, -41219=>29323, -41220=>29324, -41221=>29325, -41222=>29326, -41223=>29327, -41224=>29328, -41225=>29329, -41226=>29330, -41227=>29331, -41228=>29332, -41229=>29333, -41230=>29334, -41231=>29335, -41232=>29336, -41233=>29337, -41234=>29338, -41235=>29339, -41236=>29340, -41237=>29341, -41238=>29342, -41239=>29343, -41240=>29344, -41241=>29345, -41242=>29346, -41243=>29347, -41244=>29348, -41245=>29349, -41246=>29350, -41247=>29351, -41248=>29352, -41249=>29353, -41250=>29354, -41251=>29355, -41252=>29356, -41253=>29357, -41254=>29358, -41255=>29359, -41256=>29360, -41257=>29361, -41258=>29362, -41259=>29363, -41260=>29364, -41261=>29365, -41262=>29366, -41263=>29367, -41264=>29368, -41265=>29369, -41266=>29370, -41267=>29371, -41268=>29372, -41269=>29373, -41270=>29374, -41271=>29375, -41272=>29376, -41273=>29377, -41274=>29378, -41275=>29379, -41276=>29380, -41277=>29381, -41278=>29382, -41279=>29383, -41280=>29384, -41281=>29385, -41282=>29386, -41283=>29387, -41284=>29388, -41285=>29389, -41286=>29390, -41287=>29391, -41288=>29392, -41289=>29393, -41290=>29394, -41291=>29395, -41292=>29396, -41293=>29397, -41294=>29398, -41295=>29399, -41296=>29400, -41297=>29401, -41298=>29402, -41299=>29403, -41300=>29404, -41301=>29405, -41302=>29406, -41303=>29407, -41304=>29408, -41305=>29409, -41306=>29410, -41307=>29411, -41308=>29412, -41309=>29413, -41310=>29414, -41311=>29415, -41312=>29416, -41313=>29417, -41314=>29418, -41315=>29419, -41316=>29420, -41317=>29421, -41318=>29422, -41319=>29423, -41320=>29424, -41321=>29425, -41322=>29426, -41323=>29427, -41324=>29428, -41325=>29429, -41326=>29430, -41327=>29431, -41328=>29432, -41329=>29433, -41330=>29434, -41331=>29435, -41332=>29436, -41333=>29437, -41334=>29438, -41335=>29439, -41336=>29440, -41337=>29441, -41338=>29442, -41339=>29443, -41340=>29444, -41341=>29445, -41342=>29446, -41343=>29447, -41344=>29448, -41345=>29449, -41346=>29450, -41347=>29451, -41348=>29452, -41349=>29453, -41350=>29454, -41351=>29455, -41352=>29456, -41353=>29457, -41354=>29458, -41355=>29459, -41356=>29460, -41357=>29461, -41358=>29462, -41359=>29463, -41360=>29464, -41361=>29465, -41362=>29466, -41363=>29467, -41364=>29468, -41365=>29469, -41366=>29470, -41367=>29471, -41368=>29472, -41369=>29473, -41370=>29474, -41371=>29475, -41372=>29476, -41373=>29477, -41374=>29478, -41375=>29479, -41376=>29480, -41377=>29481, -41378=>29482, -41379=>29483, -41380=>29484, -41381=>29485, -41382=>29486, -41383=>29487, -41384=>29488, -41385=>29489, -41386=>29490, -41387=>29491, -41388=>29492, -41389=>29493, -41390=>29494, -41391=>29495, -41392=>29496, -41393=>29497, -41394=>29498, -41395=>29499, -41396=>29500, -41397=>29501, -41398=>29502, -41399=>29503, -41400=>29504, -41401=>29505, -41402=>29506, -41403=>29507, -41404=>29508, -41405=>29509, -41406=>29510, -41407=>29511, -41408=>29512, -41409=>29513, -41410=>29514, -41411=>29515, -41412=>29516, -41413=>29517, -41414=>29518, -41415=>29519, -41416=>29520, -41417=>29521, -41418=>29522, -41419=>29523, -41420=>29524, -41421=>29525, -41422=>29526, -41423=>29527, -41424=>29528, -41425=>29529, -41426=>29530, -41427=>29531, -41428=>29532, -41429=>29533, -41430=>29534, -41431=>29535, -41432=>29536, -41433=>29537, -41434=>29538, -41435=>29539, -41436=>29540, -41437=>29541, -41438=>29542, -41439=>29543, -41440=>29544, -41441=>29545, -41442=>29546, -41443=>29547, -41444=>29548, -41445=>29549, -41446=>29550, -41447=>29551, -41448=>29552, -41449=>29553, -41450=>29554, -41451=>29555, -41452=>29556, -41453=>29557, -41454=>29558, -41455=>29559, -41456=>29560, -41457=>29561, -41458=>29562, -41459=>29563, -41460=>29564, -41461=>29565, -41462=>29566, -41463=>29567, -41464=>29568, -41465=>29569, -41466=>29570, -41467=>29571, -41468=>29572, -41469=>29573, -41470=>29574, -41471=>29575, -41472=>29576, -41473=>29577, -41474=>29578, -41475=>29579, -41476=>29580, -41477=>29581, -41478=>29582, -41479=>29583, -41480=>29584, -41481=>29585, -41482=>29586, -41483=>29587, -41484=>29588, -41485=>29589, -41486=>29590, -41487=>29591, -41488=>29592, -41489=>29593, -41490=>29594, -41491=>29595, -41492=>29596, -41493=>29597, -41494=>29598, -41495=>29599, -41496=>29600, -41497=>29601, -41498=>29602, -41499=>29603, -41500=>29604, -41501=>29605, -41502=>29606, -41503=>29607, -41504=>29608, -41505=>29609, -41506=>29610, -41507=>29611, -41508=>29612, -41509=>29613, -41510=>29614, -41511=>29615, -41512=>29616, -41513=>29617, -41514=>29618, -41515=>29619, -41516=>29620, -41517=>29621, -41518=>29622, -41519=>29623, -41520=>29624, -41521=>29625, -41522=>29626, -41523=>29627, -41524=>29628, -41525=>29629, -41526=>29630, -41527=>29631, -41528=>29632, -41529=>29633, -41530=>29634, -41531=>29635, -41532=>29636, -41533=>29637, -41534=>29638, -41535=>29639, -41536=>29640, -41537=>29641, -41538=>29642, -41539=>29643, -41540=>29644, -41541=>29645, -41542=>29646, -41543=>29647, -41544=>29648, -41545=>29649, -41546=>29650, -41547=>29651, -41548=>29652, -41549=>29653, -41550=>29654, -41551=>29655, -41552=>29656, -41553=>29657, -41554=>29658, -41555=>29659, -41556=>29660, -41557=>29661, -41558=>29662, -41559=>29663, -41560=>29664, -41561=>29665, -41562=>29666, -41563=>29667, -41564=>29668, -41565=>29669, -41566=>29670, -41567=>29671, -41568=>29672, -41569=>29673, -41570=>29674, -41571=>29675, -41572=>29676, -41573=>29677, -41574=>29678, -41575=>29679, -41576=>29680, -41577=>29681, -41578=>29682, -41579=>29683, -41580=>29684, -41581=>29685, -41582=>29686, -41583=>29687, -41584=>29688, -41585=>29689, -41586=>29690, -41587=>29691, -41588=>29692, -41589=>29693, -41590=>29694, -41591=>29695, -41592=>29696, -41593=>29697, -41594=>29698, -41595=>29699, -41596=>29700, -41597=>29701, -41598=>29702, -41599=>29703, -41600=>29704, -41601=>29705, -41602=>29706, -41603=>29707, -41604=>29708, -41605=>29709, -41606=>29710, -41607=>29711, -41608=>29712, -41609=>29713, -41610=>29714, -41611=>29715, -41612=>29716, -41613=>29717, -41614=>29718, -41615=>29719, -41616=>29720, -41617=>29721, -41618=>29722, -41619=>29723, -41620=>29724, -41621=>29725, -41622=>29726, -41623=>29727, -41624=>29728, -41625=>29729, -41626=>29730, -41627=>29731, -41628=>29732, -41629=>29733, -41630=>29734, -41631=>29735, -41632=>29736, -41633=>29737, -41634=>29738, -41635=>29739, -41636=>29740, -41637=>29741, -41638=>29742, -41639=>29743, -41640=>29744, -41641=>29745, -41642=>29746, -41643=>29747, -41644=>29748, -41645=>29749, -41646=>29750, -41647=>29751, -41648=>29752, -41649=>29753, -41650=>29754, -41651=>29755, -41652=>29756, -41653=>29757, -41654=>29758, -41655=>29759, -41656=>29760, -41657=>29761, -41658=>29762, -41659=>29763, -41660=>29764, -41661=>29765, -41662=>29766, -41663=>29767, -41664=>29768, -41665=>29769, -41666=>29770, -41667=>29771, -41668=>29772, -41669=>29773, -41670=>29774, -41671=>29775, -41672=>29776, -41673=>29777, -41674=>29778, -41675=>29779, -41676=>29780, -41677=>29781, -41678=>29782, -41679=>29783, -41680=>29784, -41681=>29785, -41682=>29786, -41683=>29787, -41684=>29788, -41685=>29789, -41686=>29790, -41687=>29791, -41688=>29792, -41689=>29793, -41690=>29794, -41691=>29795, -41692=>29796, -41693=>29797, -41694=>29798, -41695=>29799, -41696=>29800, -41697=>29801, -41698=>29802, -41699=>29803, -41700=>29804, -41701=>29805, -41702=>29806, -41703=>29807, -41704=>29808, -41705=>29809, -41706=>29810, -41707=>29811, -41708=>29812, -41709=>29813, -41710=>29814, -41711=>29815, -41712=>29816, -41713=>29817, -41714=>29818, -41715=>29819, -41716=>29820, -41717=>29821, -41718=>29822, -41719=>29823, -41720=>29824, -41721=>29825, -41722=>29826, -41723=>29827, -41724=>29828, -41725=>29829, -41726=>29830, -41727=>29831, -41728=>29832, -41729=>29833, -41730=>29834, -41731=>29835, -41732=>29836, -41733=>29837, -41734=>29838, -41735=>29839, -41736=>29840, -41737=>29841, -41738=>29842, -41739=>29843, -41740=>29844, -41741=>29845, -41742=>29846, -41743=>29847, -41744=>29848, -41745=>29849, -41746=>29850, -41747=>29851, -41748=>29852, -41749=>29853, -41750=>29854, -41751=>29855, -41752=>29856, -41753=>29857, -41754=>29858, -41755=>29859, -41756=>29860, -41757=>29861, -41758=>29862, -41759=>29863, -41760=>29864, -41761=>29865, -41762=>29866, -41763=>29867, -41764=>29868, -41765=>29869, -41766=>29870, -41767=>29871, -41768=>29872, -41769=>29873, -41770=>29874, -41771=>29875, -41772=>29876, -41773=>29877, -41774=>29878, -41775=>29879, -41776=>29880, -41777=>29881, -41778=>29882, -41779=>29883, -41780=>29884, -41781=>29885, -41782=>29886, -41783=>29887, -41784=>29888, -41785=>29889, -41786=>29890, -41787=>29891, -41788=>29892, -41789=>29893, -41790=>29894, -41791=>29895, -41792=>29896, -41793=>29897, -41794=>29898, -41795=>29899, -41796=>29900, -41797=>29901, -41798=>29902, -41799=>29903, -41800=>29904, -41801=>29905, -41802=>29906, -41803=>29907, -41804=>29908, -41805=>29909, -41806=>29910, -41807=>29911, -41808=>29912, -41809=>29913, -41810=>29914, -41811=>29915, -41812=>29916, -41813=>29917, -41814=>29918, -41815=>29919, -41816=>29920, -41817=>29921, -41818=>29922, -41819=>29923, -41820=>29924, -41821=>29925, -41822=>29926, -41823=>29927, -41824=>29928, -41825=>29929, -41826=>29930, -41827=>29931, -41828=>29932, -41829=>29933, -41830=>29934, -41831=>29935, -41832=>29936, -41833=>29937, -41834=>29938, -41835=>29939, -41836=>29940, -41837=>29941, -41838=>29942, -41839=>29943, -41840=>29944, -41841=>29945, -41842=>29946, -41843=>29947, -41844=>29948, -41845=>29949, -41846=>29950, -41847=>29951, -41848=>29952, -41849=>29953, -41850=>29954, -41851=>29955, -41852=>29956, -41853=>29957, -41854=>29958, -41855=>29959, -41856=>29960, -41857=>29961, -41858=>29962, -41859=>29963, -41860=>29964, -41861=>29965, -41862=>29966, -41863=>29967, -41864=>29968, -41865=>29969, -41866=>29970, -41867=>29971, -41868=>29972, -41869=>29973, -41870=>29974, -41871=>29975, -41872=>29976, -41873=>29977, -41874=>29978, -41875=>29979, -41876=>29980, -41877=>29981, -41878=>29982, -41879=>29983, -41880=>29984, -41881=>29985, -41882=>29986, -41883=>29987, -41884=>29988, -41885=>29989, -41886=>29990, -41887=>29991, -41888=>29992, -41889=>29993, -41890=>29994, -41891=>29995, -41892=>29996, -41893=>29997, -41894=>29998, -41895=>29999, -41896=>30000, -41897=>30001, -41898=>30002, -41899=>30003, -41900=>30004, -41901=>30005, -41902=>30006, -41903=>30007, -41904=>30008, -41905=>30009, -41906=>30010, -41907=>30011, -41908=>30012, -41909=>30013, -41910=>30014, -41911=>30015, -41912=>30016, -41913=>30017, -41914=>30018, -41915=>30019, -41916=>30020, -41917=>30021, -41918=>30022, -41919=>30023, -41920=>30024, -41921=>30025, -41922=>30026, -41923=>30027, -41924=>30028, -41925=>30029, -41926=>30030, -41927=>30031, -41928=>30032, -41929=>30033, -41930=>30034, -41931=>30035, -41932=>30036, -41933=>30037, -41934=>30038, -41935=>30039, -41936=>30040, -41937=>30041, -41938=>30042, -41939=>30043, -41940=>30044, -41941=>30045, -41942=>30046, -41943=>30047, -41944=>30048, -41945=>30049, -41946=>30050, -41947=>30051, -41948=>30052, -41949=>30053, -41950=>30054, -41951=>30055, -41952=>30056, -41953=>30057, -41954=>30058, -41955=>30059, -41956=>30060, -41957=>30061, -41958=>30062, -41959=>30063, -41960=>30064, -41961=>30065, -41962=>30066, -41963=>30067, -41964=>30068, -41965=>30069, -41966=>30070, -41967=>30071, -41968=>30072, -41969=>30073, -41970=>30074, -41971=>30075, -41972=>30076, -41973=>30077, -41974=>30078, -41975=>30079, -41976=>30080, -41977=>30081, -41978=>30082, -41979=>30083, -41980=>30084, -41981=>30085, -41982=>30086, -41983=>30087, -41984=>30088, -41985=>30089, -41986=>30090, -41987=>30091, -41988=>30092, -41989=>30093, -41990=>30094, -41991=>30095, -41992=>30096, -41993=>30097, -41994=>30098, -41995=>30099, -41996=>30100, -41997=>30101, -41998=>30102, -41999=>30103, -42000=>30104, -42001=>30105, -42002=>30106, -42003=>30107, -42004=>30108, -42005=>30109, -42006=>30110, -42007=>30111, -42008=>30112, -42009=>30113, -42010=>30114, -42011=>30115, -42012=>30116, -42013=>30117, -42014=>30118, -42015=>30119, -42016=>30120, -42017=>30121, -42018=>30122, -42019=>30123, -42020=>30124, -42021=>30125, -42022=>30126, -42023=>30127, -42024=>30128, -42025=>30129, -42026=>30130, -42027=>30131, -42028=>30132, -42029=>30133, -42030=>30134, -42031=>30135, -42032=>30136, -42033=>30137, -42034=>30138, -42035=>30139, -42036=>30140, -42037=>30141, -42038=>30142, -42039=>30143, -42040=>30144, -42041=>30145, -42042=>30146, -42043=>30147, -42044=>30148, -42045=>30149, -42046=>30150, -42047=>30151, -42048=>30152, -42049=>30153, -42050=>30154, -42051=>30155, -42052=>30156, -42053=>30157, -42054=>30158, -42055=>30159, -42056=>30160, -42057=>30161, -42058=>30162, -42059=>30163, -42060=>30164, -42061=>30165, -42062=>30166, -42063=>30167, -42064=>30168, -42065=>30169, -42066=>30170, -42067=>30171, -42068=>30172, -42069=>30173, -42070=>30174, -42071=>30175, -42072=>30176, -42073=>30177, -42074=>30178, -42075=>30179, -42076=>30180, -42077=>30181, -42078=>30182, -42079=>30183, -42080=>30184, -42081=>30185, -42082=>30186, -42083=>30187, -42084=>30188, -42085=>30189, -42086=>30190, -42087=>30191, -42088=>30192, -42089=>30193, -42090=>30194, -42091=>30195, -42092=>30196, -42093=>30197, -42094=>30198, -42095=>30199, -42096=>30200, -42097=>30201, -42098=>30202, -42099=>30203, -42100=>30204, -42101=>30205, -42102=>30206, -42103=>30207, -42104=>30208, -42105=>30209, -42106=>30210, -42107=>30211, -42108=>30212, -42109=>30213, -42110=>30214, -42111=>30215, -42112=>30216, -42113=>30217, -42114=>30218, -42115=>30219, -42116=>30220, -42117=>30221, -42118=>30222, -42119=>30223, -42120=>30224, -42121=>30225, -42122=>30226, -42123=>30227, -42124=>30228, -42128=>30229, -42129=>30230, -42130=>30231, -42131=>30232, -42132=>30233, -42133=>30234, -42134=>30235, -42135=>30236, -42136=>30237, -42137=>30238, -42138=>30239, -42139=>30240, -42140=>30241, -42141=>30242, -42142=>30243, -42143=>30244, -42144=>30245, -42145=>30246, -42146=>30247, -42147=>30248, -42148=>30249, -42149=>30250, -42150=>30251, -42151=>30252, -42152=>30253, -42153=>30254, -42154=>30255, -42155=>30256, -42156=>30257, -42157=>30258, -42158=>30259, -42159=>30260, -42160=>30261, -42161=>30262, -42162=>30263, -42163=>30264, -42164=>30265, -42165=>30266, -42166=>30267, -42167=>30268, -42168=>30269, -42169=>30270, -42170=>30271, -42171=>30272, -42172=>30273, -42173=>30274, -42174=>30275, -42175=>30276, -42176=>30277, -42177=>30278, -42178=>30279, -42179=>30280, -42180=>30281, -42181=>30282, -42182=>30283, -); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_aj16.php b/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_aj16.php deleted file mode 100644 index a1e4dc74..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_aj16.php +++ /dev/null @@ -1,15705 +0,0 @@ -1, -32=>1, -33=>2, -34=>3, -35=>4, -36=>5, -37=>6, -38=>7, -39=>8, -40=>9, -41=>10, -42=>11, -43=>12, -44=>13, -8209=>14, -45=>14, -46=>15, -47=>16, -48=>17, -49=>18, -50=>19, -51=>20, -52=>21, -53=>22, -54=>23, -55=>24, -56=>25, -57=>26, -58=>27, -59=>28, -60=>29, -61=>30, -62=>31, -63=>32, -64=>33, -65=>34, -66=>35, -67=>36, -68=>37, -69=>38, -70=>39, -71=>40, -72=>41, -73=>42, -74=>43, -75=>44, -76=>45, -77=>46, -78=>47, -79=>48, -80=>49, -81=>50, -82=>51, -83=>52, -84=>53, -85=>54, -86=>55, -87=>56, -88=>57, -89=>58, -90=>59, -91=>60, -165=>61, -93=>62, -94=>63, -818=>64, -95=>64, -768=>65, -96=>65, -97=>66, -98=>67, -99=>68, -100=>69, -101=>70, -102=>71, -103=>72, -104=>73, -105=>74, -106=>75, -107=>76, -108=>77, -109=>78, -110=>79, -111=>80, -112=>81, -113=>82, -114=>83, -115=>84, -116=>85, -117=>86, -118=>87, -119=>88, -120=>89, -121=>90, -122=>91, -123=>92, -166=>93, -125=>94, -732=>95, -771=>95, -700=>96, -8217=>96, -92=>97, -699=>98, -8216=>98, -124=>99, -126=>100, -8764=>100, -161=>101, -162=>102, -163=>103, -8260=>104, -402=>105, -164=>107, -8220=>108, -171=>109, -8249=>110, -8250=>111, -64257=>112, -64258=>113, -8210=>114, -8211=>114, -183=>117, -8729=>117, -8226=>119, -8218=>120, -8222=>121, -8221=>122, -187=>123, -191=>126, -769=>127, -710=>128, -770=>128, -175=>129, -772=>129, -774=>130, -775=>131, -776=>132, -730=>133, -778=>133, -184=>134, -807=>134, -779=>135, -808=>136, -780=>137, -822=>138, -8212=>138, -198=>139, -170=>140, -321=>141, -216=>142, -338=>143, -186=>144, -230=>145, -305=>146, -322=>147, -248=>148, -339=>149, -223=>150, -173=>151, -169=>152, -172=>153, -174=>154, -178=>157, -179=>158, -181=>159, -185=>160, -188=>161, -189=>162, -190=>163, -192=>164, -193=>165, -194=>166, -195=>167, -196=>168, -197=>169, -199=>170, -200=>171, -201=>172, -202=>173, -203=>174, -204=>175, -205=>176, -206=>177, -207=>178, -208=>179, -209=>180, -210=>181, -211=>182, -212=>183, -213=>184, -214=>185, -217=>187, -218=>188, -219=>189, -220=>190, -221=>191, -222=>192, -224=>193, -225=>194, -226=>195, -227=>196, -228=>197, -229=>198, -231=>199, -232=>200, -233=>201, -234=>202, -235=>203, -236=>204, -237=>205, -238=>206, -239=>207, -240=>208, -241=>209, -242=>210, -243=>211, -244=>212, -245=>213, -246=>214, -249=>216, -250=>217, -251=>218, -252=>219, -253=>220, -254=>221, -255=>222, -352=>223, -376=>224, -381=>225, -773=>226, -8254=>226, -353=>227, -8482=>228, -382=>229, -8194=>231, -65512=>323, -65377=>327, -65378=>328, -65379=>329, -65380=>330, -65381=>331, -65382=>332, -65383=>333, -65384=>334, -65385=>335, -65386=>336, -65387=>337, -65388=>338, -65389=>339, -65390=>340, -65391=>341, -65392=>342, -65393=>343, -65394=>344, -65395=>345, -65396=>346, -65397=>347, -65398=>348, -65399=>349, -65400=>350, -65401=>351, -65402=>352, -65403=>353, -65404=>354, -65405=>355, -65406=>356, -65407=>357, -65408=>358, -65409=>359, -65410=>360, -65411=>361, -65412=>362, -65413=>363, -65414=>364, -65415=>365, -65416=>366, -65417=>367, -65418=>368, -65419=>369, -65420=>370, -65421=>371, -65422=>372, -65423=>373, -65424=>374, -65425=>375, -65426=>376, -65427=>377, -65428=>378, -65429=>379, -65430=>380, -65431=>381, -65432=>382, -65433=>383, -65434=>384, -65435=>385, -65436=>386, -65437=>387, -65438=>388, -65439=>389, -8195=>633, -12288=>633, -12289=>634, -12290=>635, -65292=>636, -65294=>637, -12539=>638, -65306=>639, -65307=>640, -65311=>641, -65281=>642, -12443=>643, -12444=>644, -180=>645, -65344=>646, -168=>647, -65342=>648, -65507=>649, -65343=>650, -12541=>651, -12542=>652, -12445=>653, -12446=>654, -12291=>655, -20189=>656, -12293=>657, -12294=>658, -12295=>659, -12540=>660, -8213=>661, -8208=>662, -65295=>663, -65340=>664, -12316=>665, -65374=>665, -8214=>666, -65372=>667, -8230=>668, -8229=>669, -65288=>674, -65289=>675, -12308=>676, -12309=>677, -65339=>678, -65341=>679, -65371=>680, -65373=>681, -12296=>682, -12297=>683, -12298=>684, -12299=>685, -12300=>686, -12301=>687, -12302=>688, -12303=>689, -12304=>690, -12305=>691, -65291=>692, -8722=>693, -65293=>693, -177=>694, -215=>695, -247=>696, -65309=>697, -8800=>698, -65308=>699, -65310=>700, -8806=>701, -8807=>702, -8734=>703, -8756=>704, -9794=>705, -9792=>706, -176=>707, -8242=>708, -8243=>709, -8451=>710, -65509=>711, -65284=>712, -65504=>713, -65505=>714, -65285=>715, -65283=>716, -65286=>717, -65290=>718, -65312=>719, -167=>720, -9734=>721, -9733=>722, -9675=>723, -9679=>724, -9678=>725, -9671=>726, -9670=>727, -9633=>728, -9632=>729, -9651=>730, -9650=>731, -9661=>732, -9660=>733, -8251=>734, -12306=>735, -8594=>736, -8592=>737, -8593=>738, -8595=>739, -12307=>740, -8712=>741, -8715=>742, -8838=>743, -8839=>744, -8834=>745, -8835=>746, -8746=>747, -8745=>748, -8743=>749, -8744=>750, -65506=>751, -8658=>752, -8660=>753, -8704=>754, -8707=>755, -8736=>756, -8869=>757, -8978=>758, -8706=>759, -8711=>760, -8801=>761, -8786=>762, -8810=>763, -8811=>764, -8730=>765, -8765=>766, -8733=>767, -8757=>768, -8747=>769, -8748=>770, -8491=>771, -8240=>772, -9839=>773, -9837=>774, -9834=>775, -8224=>776, -8225=>777, -182=>778, -9711=>779, -65296=>780, -65297=>781, -65298=>782, -65299=>783, -65300=>784, -65301=>785, -65302=>786, -65303=>787, -65304=>788, -65305=>789, -65313=>790, -65314=>791, -65315=>792, -65316=>793, -65317=>794, -65318=>795, -65319=>796, -65320=>797, -65321=>798, -65322=>799, -65323=>800, -65324=>801, -65325=>802, -65326=>803, -65327=>804, -65328=>805, -65329=>806, -65330=>807, -65331=>808, -65332=>809, -65333=>810, -65334=>811, -65335=>812, -65336=>813, -65337=>814, -65338=>815, -65345=>816, -65346=>817, -65347=>818, -65348=>819, -65349=>820, -65350=>821, -65351=>822, -65352=>823, -65353=>824, -65354=>825, -65355=>826, -65356=>827, -65357=>828, -65358=>829, -65359=>830, -65360=>831, -65361=>832, -65362=>833, -65363=>834, -65364=>835, -65365=>836, -65366=>837, -65367=>838, -65368=>839, -65369=>840, -65370=>841, -12353=>842, -12354=>843, -12355=>844, -12356=>845, -12357=>846, -12358=>847, -12359=>848, -12360=>849, -12361=>850, -12362=>851, -12363=>852, -12364=>853, -12365=>854, -12366=>855, -12367=>856, -12368=>857, -12369=>858, -12370=>859, -12371=>860, -12372=>861, -12373=>862, -12374=>863, -12375=>864, -12376=>865, -12377=>866, -12378=>867, -12379=>868, -12380=>869, -12381=>870, -12382=>871, -12383=>872, -12384=>873, -12385=>874, -12386=>875, -12387=>876, -12388=>877, -12389=>878, -12390=>879, -12391=>880, -12392=>881, -12393=>882, -12394=>883, -12395=>884, -12396=>885, -12397=>886, -12398=>887, -12399=>888, -12400=>889, -12401=>890, -12402=>891, -12403=>892, -12404=>893, -12405=>894, -12406=>895, -12407=>896, -12408=>897, -12409=>898, -12410=>899, -12411=>900, -12412=>901, -12413=>902, -12414=>903, -12415=>904, -12416=>905, -12417=>906, -12418=>907, -12419=>908, -12420=>909, -12421=>910, -12422=>911, -12423=>912, -12424=>913, -12425=>914, -12426=>915, -12427=>916, -12428=>917, -12429=>918, -12430=>919, -12431=>920, -12432=>921, -12433=>922, -12434=>923, -12435=>924, -12449=>925, -12450=>926, -12451=>927, -12452=>928, -12453=>929, -12454=>930, -12455=>931, -12456=>932, -12457=>933, -12458=>934, -12459=>935, -12460=>936, -12461=>937, -12462=>938, -12463=>939, -12464=>940, -12465=>941, -12466=>942, -12467=>943, -12468=>944, -12469=>945, -12470=>946, -12471=>947, -12472=>948, -12473=>949, -12474=>950, -12475=>951, -12476=>952, -12477=>953, -12478=>954, -12479=>955, -12480=>956, -12481=>957, -12482=>958, -12483=>959, -12484=>960, -12485=>961, -12486=>962, -12487=>963, -12488=>964, -12489=>965, -12490=>966, -12491=>967, -12492=>968, -12493=>969, -12494=>970, -12495=>971, -12496=>972, -12497=>973, -12498=>974, -12499=>975, -12500=>976, -12501=>977, -12502=>978, -12503=>979, -12504=>980, -12505=>981, -12506=>982, -12507=>983, -12508=>984, -12509=>985, -12510=>986, -12511=>987, -12512=>988, -12513=>989, -12514=>990, -12515=>991, -12516=>992, -12517=>993, -12518=>994, -12519=>995, -12520=>996, -12521=>997, -12522=>998, -12523=>999, -12524=>1000, -12525=>1001, -12526=>1002, -12527=>1003, -12528=>1004, -12529=>1005, -12530=>1006, -12531=>1007, -12532=>1008, -12533=>1009, -12534=>1010, -913=>1011, -914=>1012, -915=>1013, -916=>1014, -917=>1015, -918=>1016, -919=>1017, -920=>1018, -921=>1019, -922=>1020, -923=>1021, -924=>1022, -925=>1023, -926=>1024, -927=>1025, -928=>1026, -929=>1027, -931=>1028, -932=>1029, -933=>1030, -934=>1031, -935=>1032, -936=>1033, -937=>1034, -945=>1035, -946=>1036, -947=>1037, -948=>1038, -949=>1039, -950=>1040, -951=>1041, -952=>1042, -953=>1043, -954=>1044, -955=>1045, -956=>1046, -957=>1047, -958=>1048, -959=>1049, -960=>1050, -961=>1051, -963=>1052, -964=>1053, -965=>1054, -966=>1055, -967=>1056, -968=>1057, -969=>1058, -1040=>1059, -1041=>1060, -1042=>1061, -1043=>1062, -1044=>1063, -1045=>1064, -1025=>1065, -1046=>1066, -1047=>1067, -1048=>1068, -1049=>1069, -1050=>1070, -1051=>1071, -1052=>1072, -1053=>1073, -1054=>1074, -1055=>1075, -1056=>1076, -1057=>1077, -1058=>1078, -1059=>1079, -1060=>1080, -1061=>1081, -1062=>1082, -1063=>1083, -1064=>1084, -1065=>1085, -1066=>1086, -1067=>1087, -1068=>1088, -1069=>1089, -1070=>1090, -1071=>1091, -1072=>1092, -1073=>1093, -1074=>1094, -1075=>1095, -1076=>1096, -1077=>1097, -1105=>1098, -1078=>1099, -1079=>1100, -1080=>1101, -1081=>1102, -1082=>1103, -1083=>1104, -1084=>1105, -1085=>1106, -1086=>1107, -1087=>1108, -1088=>1109, -1089=>1110, -1090=>1111, -1091=>1112, -1092=>1113, -1093=>1114, -1094=>1115, -1095=>1116, -1096=>1117, -1097=>1118, -1098=>1119, -1099=>1120, -1100=>1121, -1101=>1122, -1102=>1123, -1103=>1124, -20124=>1125, -21782=>1126, -23043=>1127, -38463=>1128, -21696=>1129, -24859=>1130, -25384=>1131, -23030=>1132, -36898=>1133, -33909=>1134, -33564=>1135, -31312=>1136, -24746=>1137, -25569=>1138, -28197=>1139, -26093=>1140, -33894=>1141, -33446=>1142, -39925=>1143, -26771=>1144, -22311=>1145, -26017=>1146, -25201=>1147, -23451=>1148, -22992=>1149, -34427=>1150, -39156=>1151, -32098=>1152, -32190=>1153, -39822=>1154, -25110=>1155, -31903=>1156, -34999=>1157, -23433=>1158, -24245=>1159, -25353=>1160, -26263=>1161, -26696=>1162, -38343=>1163, -38797=>1164, -26447=>1165, -20197=>1166, -20234=>1167, -20301=>1168, -20381=>1169, -20553=>1170, -22258=>1171, -22839=>1172, -22996=>1173, -23041=>1174, -23561=>1175, -24799=>1176, -24847=>1177, -24944=>1178, -26131=>1179, -26885=>1180, -28858=>1181, -30031=>1182, -30064=>1183, -31227=>1184, -32173=>1185, -32239=>1186, -32963=>1187, -33806=>1188, -12176=>1189, -34915=>1189, -35586=>1190, -36949=>1191, -36986=>1192, -21307=>1193, -20117=>1194, -20133=>1195, -22495=>1196, -32946=>1197, -37057=>1198, -30959=>1199, -12032=>1200, -19968=>1200, -22769=>1201, -28322=>1202, -36920=>1203, -31282=>1204, -33576=>1205, -33419=>1206, -39983=>1207, -20801=>1208, -21360=>1209, -21693=>1210, -21729=>1211, -22240=>1212, -23035=>1213, -24341=>1214, -39154=>1215, -28139=>1216, -32996=>1217, -34093=>1218, -38498=>1219, -38512=>1220, -38560=>1221, -38907=>1222, -21515=>1223, -21491=>1224, -23431=>1225, -28879=>1226, -12155=>1227, -32701=>1227, -36802=>1228, -12204=>1229, -38632=>1229, -21359=>1230, -40284=>1231, -31418=>1232, -19985=>1233, -30867=>1234, -12165=>1235, -33276=>1235, -28198=>1236, -22040=>1237, -21764=>1238, -27421=>1239, -34074=>1240, -39995=>1241, -23013=>1242, -21417=>1243, -28006=>1244, -12128=>1245, -29916=>1245, -38287=>1246, -22082=>1247, -20113=>1248, -36939=>1249, -38642=>1250, -33615=>1251, -39180=>1252, -21473=>1253, -21942=>1254, -23344=>1255, -24433=>1256, -26144=>1257, -26355=>1258, -26628=>1259, -27704=>1260, -27891=>1261, -27945=>1262, -29787=>1263, -30408=>1264, -31310=>1265, -38964=>1266, -33521=>1267, -34907=>1268, -35424=>1269, -37613=>1270, -28082=>1271, -30123=>1272, -30410=>1273, -39365=>1274, -24742=>1275, -35585=>1276, -36234=>1277, -38322=>1278, -27022=>1279, -21421=>1280, -20870=>1281, -22290=>1282, -22576=>1283, -22852=>1284, -23476=>1285, -24310=>1286, -24616=>1287, -25513=>1288, -25588=>1289, -27839=>1290, -28436=>1291, -28814=>1292, -28948=>1293, -29017=>1294, -29141=>1295, -29503=>1296, -32257=>1297, -33398=>1298, -33489=>1299, -34199=>1300, -36960=>1301, -37467=>1302, -40219=>1303, -22633=>1304, -26044=>1305, -27738=>1306, -29989=>1307, -20985=>1308, -22830=>1309, -22885=>1310, -24448=>1311, -24540=>1312, -25276=>1313, -26106=>1314, -27178=>1315, -27431=>1316, -27572=>1317, -29579=>1318, -32705=>1319, -35158=>1320, -40236=>1321, -40206=>1322, -12009=>1323, -40644=>1323, -23713=>1324, -27798=>1325, -33659=>1326, -20740=>1327, -23627=>1328, -25014=>1329, -33222=>1330, -26742=>1331, -29281=>1332, -12036=>1333, -20057=>1333, -20474=>1334, -21368=>1335, -24681=>1336, -28201=>1337, -31311=>1338, -12211=>1339, -38899=>1339, -19979=>1340, -21270=>1341, -20206=>1342, -20309=>1343, -20285=>1344, -20385=>1345, -20339=>1346, -21152=>1347, -21487=>1348, -22025=>1349, -22799=>1350, -23233=>1351, -23478=>1352, -23521=>1353, -31185=>1354, -26247=>1355, -26524=>1356, -26550=>1357, -27468=>1358, -27827=>1359, -12117=>1360, -28779=>1360, -29634=>1361, -31117=>1362, -12146=>1363, -31166=>1363, -31292=>1364, -31623=>1365, -33457=>1366, -33499=>1367, -33540=>1368, -33655=>1369, -33775=>1370, -33747=>1371, -34662=>1372, -35506=>1373, -22057=>1374, -36008=>1375, -36838=>1376, -36942=>1377, -38686=>1378, -34442=>1379, -20420=>1380, -23784=>1381, -25105=>1382, -12123=>1383, -29273=>1383, -30011=>1384, -33253=>1385, -33469=>1386, -34558=>1387, -36032=>1388, -38597=>1389, -39187=>1390, -39381=>1391, -20171=>1392, -20250=>1393, -35299=>1394, -22238=>1395, -22602=>1396, -22730=>1397, -24315=>1398, -24555=>1399, -24618=>1400, -24724=>1401, -24674=>1402, -25040=>1403, -25106=>1404, -25296=>1405, -25913=>1406, -39745=>1407, -26214=>1408, -26800=>1409, -28023=>1410, -28784=>1411, -30028=>1412, -30342=>1413, -32117=>1414, -33445=>1415, -34809=>1416, -38283=>1417, -38542=>1418, -12185=>1419, -35997=>1419, -20977=>1420, -21182=>1421, -22806=>1422, -21683=>1423, -23475=>1424, -23830=>1425, -24936=>1426, -27010=>1427, -28079=>1428, -30861=>1429, -33995=>1430, -34903=>1431, -35442=>1432, -37799=>1433, -39608=>1434, -28012=>1435, -39336=>1436, -34521=>1437, -22435=>1438, -26623=>1439, -34510=>1440, -37390=>1441, -21123=>1442, -22151=>1443, -21508=>1444, -24275=>1445, -25313=>1446, -25785=>1447, -26684=>1448, -26680=>1449, -27579=>1450, -29554=>1451, -30906=>1452, -31339=>1453, -35226=>1454, -12179=>1455, -35282=>1455, -36203=>1456, -36611=>1457, -37101=>1458, -38307=>1459, -38548=>1460, -12208=>1461, -38761=>1461, -23398=>1462, -23731=>1463, -27005=>1464, -38989=>1465, -38990=>1466, -25499=>1467, -31520=>1468, -27179=>1469, -27263=>1470, -26806=>1471, -39949=>1472, -28511=>1473, -21106=>1474, -21917=>1475, -24688=>1476, -25324=>1477, -27963=>1478, -28167=>1479, -28369=>1480, -33883=>1481, -35088=>1482, -36676=>1483, -19988=>1484, -39993=>1485, -21494=>1486, -26907=>1487, -27194=>1488, -38788=>1489, -26666=>1490, -20828=>1491, -31427=>1492, -33970=>1493, -37340=>1494, -37772=>1495, -22107=>1496, -40232=>1497, -26658=>1498, -33541=>1499, -33841=>1500, -31909=>1501, -21000=>1502, -33477=>1503, -12129=>1504, -29926=>1504, -20094=>1505, -20355=>1506, -20896=>1507, -23506=>1508, -21002=>1509, -21208=>1510, -21223=>1511, -24059=>1512, -21914=>1513, -22570=>1514, -23014=>1515, -23436=>1516, -23448=>1517, -23515=>1518, -12082=>1519, -24178=>1519, -24185=>1520, -24739=>1521, -24863=>1522, -24931=>1523, -25022=>1524, -25563=>1525, -25954=>1526, -26577=>1527, -26707=>1528, -26874=>1529, -27454=>1530, -27475=>1531, -27735=>1532, -28450=>1533, -28567=>1534, -28485=>1535, -29872=>1536, -12130=>1537, -29976=>1537, -30435=>1538, -30475=>1539, -31487=>1540, -31649=>1541, -31777=>1542, -32233=>1543, -12152=>1544, -32566=>1544, -32752=>1545, -32925=>1546, -33382=>1547, -33694=>1548, -35251=>1549, -35532=>1550, -36011=>1551, -36996=>1552, -37969=>1553, -38291=>1554, -38289=>1555, -38306=>1556, -38501=>1557, -38867=>1558, -39208=>1559, -33304=>1560, -20024=>1561, -21547=>1562, -23736=>1563, -24012=>1564, -29609=>1565, -30284=>1566, -30524=>1567, -23721=>1568, -32747=>1569, -36107=>1570, -38593=>1571, -38929=>1572, -38996=>1573, -39000=>1574, -20225=>1575, -20238=>1576, -21361=>1577, -21916=>1578, -22120=>1579, -22522=>1580, -22855=>1581, -23305=>1582, -23492=>1583, -23696=>1584, -24076=>1585, -24190=>1586, -24524=>1587, -25582=>1588, -26426=>1589, -26071=>1590, -26082=>1591, -26399=>1592, -26827=>1593, -26820=>1594, -27231=>1595, -24112=>1596, -27589=>1597, -27671=>1598, -27773=>1599, -30079=>1600, -31048=>1601, -23395=>1602, -31232=>1603, -32000=>1604, -24509=>1605, -35215=>1606, -35352=>1607, -36020=>1608, -36215=>1609, -36556=>1610, -36637=>1611, -39138=>1612, -39438=>1613, -12004=>1614, -12225=>1614, -39740=>1614, -12018=>1615, -20096=>1615, -20605=>1616, -20736=>1617, -22931=>1618, -23452=>1619, -25135=>1620, -25216=>1621, -25836=>1622, -27450=>1623, -29344=>1624, -30097=>1625, -31047=>1626, -32681=>1627, -34811=>1628, -35516=>1629, -35696=>1630, -25516=>1631, -33738=>1632, -38816=>1633, -21513=>1634, -21507=>1635, -21931=>1636, -26708=>1637, -27224=>1638, -35440=>1639, -30759=>1640, -26485=>1641, -12233=>1642, -40653=>1642, -21364=>1643, -23458=>1644, -33050=>1645, -34384=>1646, -36870=>1647, -19992=>1648, -20037=>1649, -20167=>1650, -20241=>1651, -21450=>1652, -21560=>1653, -23470=>1654, -12088=>1655, -24339=>1655, -24613=>1656, -25937=>1657, -26429=>1658, -27714=>1659, -27762=>1660, -27875=>1661, -28792=>1662, -29699=>1663, -31350=>1664, -31406=>1665, -31496=>1666, -32026=>1667, -31998=>1668, -32102=>1669, -26087=>1670, -12124=>1671, -29275=>1671, -21435=>1672, -23621=>1673, -24040=>1674, -25298=>1675, -25312=>1676, -25369=>1677, -28192=>1678, -34394=>1679, -35377=>1680, -36317=>1681, -37624=>1682, -28417=>1683, -31142=>1684, -12226=>1685, -39770=>1685, -20136=>1686, -20139=>1687, -20140=>1688, -20379=>1689, -20384=>1690, -20689=>1691, -20807=>1692, -31478=>1693, -20849=>1694, -20982=>1695, -21332=>1696, -21281=>1697, -21375=>1698, -21483=>1699, -21932=>1700, -22659=>1701, -23777=>1702, -24375=>1703, -24394=>1704, -24623=>1705, -24656=>1706, -24685=>1707, -25375=>1708, -25945=>1709, -27211=>1710, -27841=>1711, -29378=>1712, -29421=>1713, -30703=>1714, -33016=>1715, -33029=>1716, -33288=>1717, -34126=>1718, -37111=>1719, -37857=>1720, -38911=>1721, -39255=>1722, -39514=>1723, -20208=>1724, -20957=>1725, -23597=>1726, -26241=>1727, -26989=>1728, -23616=>1729, -26354=>1730, -26997=>1731, -12127=>1732, -29577=>1732, -26704=>1733, -31873=>1734, -20677=>1735, -21220=>1736, -22343=>1737, -12081=>1738, -24062=>1738, -37670=>1739, -12100=>1740, -26020=>1740, -27427=>1741, -27453=>1742, -29748=>1743, -31105=>1744, -31165=>1745, -31563=>1746, -32202=>1747, -33465=>1748, -33740=>1749, -34943=>1750, -35167=>1751, -35641=>1752, -36817=>1753, -12198=>1754, -37329=>1754, -21535=>1755, -37504=>1756, -20061=>1757, -20534=>1758, -21477=>1759, -21306=>1760, -29399=>1761, -29590=>1762, -30697=>1763, -33510=>1764, -36527=>1765, -39366=>1766, -39368=>1767, -39378=>1768, -20855=>1769, -24858=>1770, -34398=>1771, -21936=>1772, -31354=>1773, -20598=>1774, -23507=>1775, -36935=>1776, -38533=>1777, -20018=>1778, -27355=>1779, -37351=>1780, -23633=>1781, -23624=>1782, -25496=>1783, -31391=>1784, -27795=>1785, -38772=>1786, -36705=>1787, -31402=>1788, -29066=>1789, -38536=>1790, -31874=>1791, -26647=>1792, -32368=>1793, -26705=>1794, -37740=>1795, -21234=>1796, -21531=>1797, -34219=>1798, -35347=>1799, -32676=>1800, -36557=>1801, -37089=>1802, -21350=>1803, -34952=>1804, -31041=>1805, -20418=>1806, -20670=>1807, -21009=>1808, -20804=>1809, -21843=>1810, -22317=>1811, -29674=>1812, -22411=>1813, -22865=>1814, -24418=>1815, -24452=>1816, -24693=>1817, -24950=>1818, -24935=>1819, -25001=>1820, -25522=>1821, -25658=>1822, -25964=>1823, -26223=>1824, -26690=>1825, -28179=>1826, -30054=>1827, -31293=>1828, -31995=>1829, -32076=>1830, -32153=>1831, -32331=>1832, -32619=>1833, -33550=>1834, -33610=>1835, -34509=>1836, -35336=>1837, -35427=>1838, -35686=>1839, -36605=>1840, -38938=>1841, -40335=>1842, -33464=>1843, -36814=>1844, -39912=>1845, -21127=>1846, -25119=>1847, -25731=>1848, -28608=>1849, -38553=>1850, -26689=>1851, -20625=>1852, -12107=>1853, -27424=>1853, -27770=>1854, -28500=>1855, -12147=>1856, -31348=>1856, -32080=>1857, -12174=>1858, -34880=>1858, -35363=>1859, -12105=>1860, -26376=>1860, -20214=>1861, -20537=>1862, -20518=>1863, -20581=>1864, -20860=>1865, -21048=>1866, -21091=>1867, -21927=>1868, -22287=>1869, -22533=>1870, -23244=>1871, -24314=>1872, -25010=>1873, -25080=>1874, -25331=>1875, -25458=>1876, -26908=>1877, -27177=>1878, -29309=>1879, -12125=>1880, -29356=>1880, -29486=>1881, -30740=>1882, -30831=>1883, -32121=>1884, -30476=>1885, -32937=>1886, -12178=>1887, -35211=>1887, -35609=>1888, -36066=>1889, -36562=>1890, -36963=>1891, -37749=>1892, -38522=>1893, -38997=>1894, -39443=>1895, -40568=>1896, -20803=>1897, -21407=>1898, -21427=>1899, -24187=>1900, -24358=>1901, -28187=>1902, -28304=>1903, -12126=>1904, -29572=>1904, -29694=>1905, -32067=>1906, -33335=>1907, -12180=>1908, -35328=>1908, -35578=>1909, -38480=>1910, -20046=>1911, -20491=>1912, -21476=>1913, -21628=>1914, -22266=>1915, -22993=>1916, -23396=>1917, -12080=>1918, -24049=>1918, -24235=>1919, -24359=>1920, -12094=>1921, -25144=>1921, -25925=>1922, -26543=>1923, -28246=>1924, -29392=>1925, -31946=>1926, -34996=>1927, -32929=>1928, -32993=>1929, -33776=>1930, -11969=>1931, -34382=>1931, -35463=>1932, -36328=>1933, -37431=>1934, -38599=>1935, -39015=>1936, -12238=>1937, -40723=>1937, -20116=>1938, -20114=>1939, -20237=>1940, -21320=>1941, -21577=>1942, -21566=>1943, -23087=>1944, -24460=>1945, -24481=>1946, -24735=>1947, -26791=>1948, -27278=>1949, -29786=>1950, -30849=>1951, -35486=>1952, -35492=>1953, -35703=>1954, -37264=>1955, -20062=>1956, -39881=>1957, -20132=>1958, -20348=>1959, -20399=>1960, -20505=>1961, -20502=>1962, -20809=>1963, -20844=>1964, -21151=>1965, -21177=>1966, -21246=>1967, -21402=>1968, -12061=>1969, -21475=>1969, -21521=>1970, -21518=>1971, -21897=>1972, -22353=>1973, -22434=>1974, -22909=>1975, -23380=>1976, -23389=>1977, -23439=>1978, -12079=>1979, -24037=>1979, -24039=>1980, -24055=>1981, -24184=>1982, -24195=>1983, -24218=>1984, -24247=>1985, -24344=>1986, -24658=>1987, -24908=>1988, -25239=>1989, -25304=>1990, -25511=>1991, -25915=>1992, -26114=>1993, -26179=>1994, -26356=>1995, -26477=>1996, -26657=>1997, -26775=>1998, -27083=>1999, -27743=>2000, -27946=>2001, -28009=>2002, -28207=>2003, -28317=>2004, -30002=>2005, -30343=>2006, -30828=>2007, -31295=>2008, -31968=>2009, -32005=>2010, -32024=>2011, -32094=>2012, -32177=>2013, -32789=>2014, -32771=>2015, -32943=>2016, -32945=>2017, -33108=>2018, -33167=>2019, -33322=>2020, -33618=>2021, -12175=>2022, -34892=>2022, -34913=>2023, -35611=>2024, -36002=>2025, -36092=>2026, -37066=>2027, -37237=>2028, -37489=>2029, -30783=>2030, -37628=>2031, -38308=>2032, -38477=>2033, -38917=>2034, -12217=>2035, -39321=>2035, -12220=>2036, -39640=>2036, -40251=>2037, -21083=>2038, -21163=>2039, -21495=>2040, -21512=>2041, -22741=>2042, -25335=>2043, -28640=>2044, -35946=>2045, -36703=>2046, -40633=>2047, -20811=>2048, -21051=>2049, -21578=>2050, -22269=>2051, -31296=>2052, -37239=>2053, -40288=>2054, -12234=>2055, -40658=>2055, -29508=>2056, -28425=>2057, -33136=>2058, -29969=>2059, -24573=>2060, -24794=>2061, -12219=>2062, -39592=>2062, -29403=>2063, -36796=>2064, -27492=>2065, -38915=>2066, -20170=>2067, -22256=>2068, -22372=>2069, -22718=>2070, -23130=>2071, -24680=>2072, -25031=>2073, -26127=>2074, -26118=>2075, -26681=>2076, -26801=>2077, -28151=>2078, -30165=>2079, -32058=>2080, -12169=>2081, -33390=>2081, -39746=>2082, -20123=>2083, -20304=>2084, -21449=>2085, -21766=>2086, -23919=>2087, -24038=>2088, -24046=>2089, -26619=>2090, -27801=>2091, -29811=>2092, -30722=>2093, -35408=>2094, -37782=>2095, -35039=>2096, -22352=>2097, -24231=>2098, -25387=>2099, -20661=>2100, -20652=>2101, -20877=>2102, -26368=>2103, -21705=>2104, -22622=>2105, -22971=>2106, -23472=>2107, -24425=>2108, -25165=>2109, -25505=>2110, -26685=>2111, -27507=>2112, -28168=>2113, -28797=>2114, -37319=>2115, -29312=>2116, -30741=>2117, -30758=>2118, -31085=>2119, -25998=>2120, -32048=>2121, -33756=>2122, -35009=>2123, -36617=>2124, -38555=>2125, -21092=>2126, -22312=>2127, -26448=>2128, -32618=>2129, -36001=>2130, -20916=>2131, -22338=>2132, -38442=>2133, -22586=>2134, -27018=>2135, -32948=>2136, -21682=>2137, -23822=>2138, -22524=>2139, -30869=>2140, -40442=>2141, -20316=>2142, -21066=>2143, -21643=>2144, -25662=>2145, -26152=>2146, -26388=>2147, -26613=>2148, -31364=>2149, -31574=>2150, -32034=>2151, -37679=>2152, -26716=>2153, -39853=>2154, -31545=>2155, -21273=>2156, -20874=>2157, -21047=>2158, -23519=>2159, -25334=>2160, -25774=>2161, -25830=>2162, -26413=>2163, -27578=>2164, -34217=>2165, -38609=>2166, -30352=>2167, -39894=>2168, -25420=>2169, -37638=>2170, -39851=>2171, -12139=>2172, -30399=>2172, -26194=>2173, -19977=>2174, -20632=>2175, -21442=>2176, -12077=>2177, -23665=>2177, -24808=>2178, -25746=>2179, -25955=>2180, -26719=>2181, -29158=>2182, -29642=>2183, -29987=>2184, -31639=>2185, -32386=>2186, -34453=>2187, -35715=>2188, -36059=>2189, -37240=>2190, -39184=>2191, -26028=>2192, -26283=>2193, -27531=>2194, -20181=>2195, -20180=>2196, -20282=>2197, -20351=>2198, -21050=>2199, -21496=>2200, -21490=>2201, -21987=>2202, -22235=>2203, -12064=>2204, -22763=>2204, -22987=>2205, -22985=>2206, -23039=>2207, -12070=>2208, -23376=>2208, -23629=>2209, -24066=>2210, -24107=>2211, -24535=>2212, -24605=>2213, -25351=>2214, -12096=>2215, -25903=>2215, -23388=>2216, -26031=>2217, -26045=>2218, -26088=>2219, -26525=>2220, -12108=>2221, -27490=>2221, -27515=>2222, -12114=>2223, -27663=>2223, -29509=>2224, -31049=>2225, -31169=>2226, -12151=>2227, -31992=>2227, -32025=>2228, -32043=>2229, -32930=>2230, -33026=>2231, -12164=>2232, -33267=>2232, -35222=>2233, -35422=>2234, -35433=>2235, -35430=>2236, -35468=>2237, -35566=>2238, -36039=>2239, -36060=>2240, -38604=>2241, -39164=>2242, -12013=>2243, -27503=>2243, -20107=>2244, -20284=>2245, -20365=>2246, -20816=>2247, -23383=>2248, -23546=>2249, -24904=>2250, -25345=>2251, -26178=>2252, -27425=>2253, -28363=>2254, -27835=>2255, -29246=>2256, -29885=>2257, -30164=>2258, -30913=>2259, -12144=>2260, -31034=>2260, -12157=>2261, -32780=>2261, -12159=>2262, -32819=>2262, -12163=>2263, -33258=>2263, -33940=>2264, -36766=>2265, -27728=>2266, -12229=>2267, -40575=>2267, -24335=>2268, -35672=>2269, -40235=>2270, -31482=>2271, -36600=>2272, -23437=>2273, -38635=>2274, -19971=>2275, -21489=>2276, -22519=>2277, -22833=>2278, -23241=>2279, -23460=>2280, -24713=>2281, -28287=>2282, -28422=>2283, -30142=>2284, -36074=>2285, -23455=>2286, -34048=>2287, -31712=>2288, -20594=>2289, -26612=>2290, -33437=>2291, -23649=>2292, -34122=>2293, -32286=>2294, -33294=>2295, -20889=>2296, -23556=>2297, -25448=>2298, -36198=>2299, -26012=>2300, -29038=>2301, -31038=>2302, -32023=>2303, -32773=>2304, -35613=>2305, -12190=>2306, -36554=>2306, -36974=>2307, -34503=>2308, -37034=>2309, -20511=>2310, -21242=>2311, -23610=>2312, -26451=>2313, -28796=>2314, -29237=>2315, -37196=>2316, -37320=>2317, -37675=>2318, -33509=>2319, -23490=>2320, -24369=>2321, -24825=>2322, -20027=>2323, -21462=>2324, -23432=>2325, -12095=>2326, -25163=>2326, -26417=>2327, -27530=>2328, -29417=>2329, -29664=>2330, -31278=>2331, -33131=>2332, -36259=>2333, -37202=>2334, -12216=>2335, -39318=>2335, -20754=>2336, -21463=>2337, -21610=>2338, -23551=>2339, -25480=>2340, -27193=>2341, -32172=>2342, -38656=>2343, -22234=>2344, -21454=>2345, -21608=>2346, -23447=>2347, -23601=>2348, -24030=>2349, -20462=>2350, -24833=>2351, -25342=>2352, -27954=>2353, -31168=>2354, -31179=>2355, -32066=>2356, -32333=>2357, -32722=>2358, -33261=>2359, -12168=>2360, -33311=>2360, -33936=>2361, -34886=>2362, -35186=>2363, -35728=>2364, -36468=>2365, -36655=>2366, -36913=>2367, -37195=>2368, -37228=>2369, -38598=>2370, -37276=>2371, -20160=>2372, -20303=>2373, -20805=>2374, -12055=>2375, -21313=>2375, -24467=>2376, -25102=>2377, -26580=>2378, -27713=>2379, -28171=>2380, -29539=>2381, -32294=>2382, -37325=>2383, -37507=>2384, -21460=>2385, -22809=>2386, -23487=>2387, -28113=>2388, -31069=>2389, -32302=>2390, -31899=>2391, -22654=>2392, -29087=>2393, -20986=>2394, -34899=>2395, -36848=>2396, -20426=>2397, -23803=>2398, -26149=>2399, -30636=>2400, -31459=>2401, -33308=>2402, -39423=>2403, -20934=>2404, -24490=>2405, -26092=>2406, -26991=>2407, -27529=>2408, -28147=>2409, -28310=>2410, -28516=>2411, -30462=>2412, -32020=>2413, -24033=>2414, -36981=>2415, -37255=>2416, -38918=>2417, -20966=>2418, -21021=>2419, -25152=>2420, -26257=>2421, -26329=>2422, -28186=>2423, -24246=>2424, -32210=>2425, -32626=>2426, -26360=>2427, -34223=>2428, -34295=>2429, -35576=>2430, -21161=>2431, -21465=>2432, -12069=>2433, -22899=>2433, -24207=>2434, -24464=>2435, -24661=>2436, -37604=>2437, -38500=>2438, -20663=>2439, -20767=>2440, -21213=>2441, -21280=>2442, -21319=>2443, -21484=>2444, -21736=>2445, -21830=>2446, -21809=>2447, -22039=>2448, -22888=>2449, -22974=>2450, -23100=>2451, -23477=>2452, -23558=>2453, -12073=>2454, -23567=>2454, -23569=>2455, -23578=>2456, -24196=>2457, -24202=>2458, -24288=>2459, -24432=>2460, -25215=>2461, -25220=>2462, -25307=>2463, -25484=>2464, -25463=>2465, -26119=>2466, -26124=>2467, -26157=>2468, -26230=>2469, -26494=>2470, -26786=>2471, -27167=>2472, -27189=>2473, -27836=>2474, -28040=>2475, -28169=>2476, -28248=>2477, -28988=>2478, -28966=>2479, -29031=>2480, -30151=>2481, -30465=>2482, -30813=>2483, -30977=>2484, -31077=>2485, -31216=>2486, -31456=>2487, -31505=>2488, -31911=>2489, -32057=>2490, -32918=>2491, -33750=>2492, -33931=>2493, -34121=>2494, -34909=>2495, -35059=>2496, -35359=>2497, -35388=>2498, -35412=>2499, -35443=>2500, -35937=>2501, -36062=>2502, -37284=>2503, -37478=>2504, -37758=>2505, -37912=>2506, -38556=>2507, -38808=>2508, -19978=>2509, -19976=>2510, -19998=>2511, -20055=>2512, -20887=>2513, -21104=>2514, -22478=>2515, -22580=>2516, -22732=>2517, -23330=>2518, -24120=>2519, -24773=>2520, -25854=>2521, -26465=>2522, -26454=>2523, -27972=>2524, -29366=>2525, -30067=>2526, -31331=>2527, -33976=>2528, -35698=>2529, -37304=>2530, -37664=>2531, -22065=>2532, -22516=>2533, -39166=>2534, -25325=>2535, -26893=>2536, -27542=>2537, -29165=>2538, -32340=>2539, -32887=>2540, -12170=>2541, -33394=>2541, -35302=>2542, -12215=>2543, -39135=>2543, -34645=>2544, -36785=>2545, -23611=>2546, -20280=>2547, -20449=>2548, -20405=>2549, -21767=>2550, -23072=>2551, -23517=>2552, -23529=>2553, -12092=>2554, -24515=>2554, -24910=>2555, -25391=>2556, -26032=>2557, -26187=>2558, -26862=>2559, -27035=>2560, -28024=>2561, -28145=>2562, -30003=>2563, -30137=>2564, -30495=>2565, -31070=>2566, -31206=>2567, -32051=>2568, -12162=>2569, -33251=>2569, -33455=>2570, -34218=>2571, -35242=>2572, -35386=>2573, -12189=>2574, -36523=>2574, -12191=>2575, -36763=>2575, -36914=>2576, -37341=>2577, -38663=>2578, -12040=>2579, -20154=>2579, -20161=>2580, -20995=>2581, -22645=>2582, -22764=>2583, -23563=>2584, -29978=>2585, -23613=>2586, -33102=>2587, -35338=>2588, -36805=>2589, -38499=>2590, -38765=>2591, -31525=>2592, -35535=>2593, -38920=>2594, -37218=>2595, -22259=>2596, -21416=>2597, -36887=>2598, -21561=>2599, -22402=>2600, -24101=>2601, -25512=>2602, -12116=>2603, -27700=>2603, -28810=>2604, -30561=>2605, -31883=>2606, -32736=>2607, -34928=>2608, -36930=>2609, -37204=>2610, -37648=>2611, -37656=>2612, -38543=>2613, -29790=>2614, -39620=>2615, -23815=>2616, -23913=>2617, -25968=>2618, -26530=>2619, -36264=>2620, -38619=>2621, -25454=>2622, -26441=>2623, -26905=>2624, -33733=>2625, -38935=>2626, -38592=>2627, -35070=>2628, -28548=>2629, -25722=>2630, -12072=>2631, -23544=>2631, -19990=>2632, -28716=>2633, -30045=>2634, -26159=>2635, -20932=>2636, -21046=>2637, -21218=>2638, -22995=>2639, -24449=>2640, -24615=>2641, -25104=>2642, -25919=>2643, -25972=>2644, -26143=>2645, -26228=>2646, -26866=>2647, -26646=>2648, -27491=>2649, -28165=>2650, -29298=>2651, -12131=>2652, -29983=>2652, -30427=>2653, -31934=>2654, -32854=>2655, -22768=>2656, -35069=>2657, -11972=>2658, -35199=>2658, -35488=>2659, -35475=>2660, -35531=>2661, -36893=>2662, -37266=>2663, -11992=>2664, -38738=>2664, -38745=>2665, -12011=>2666, -25993=>2666, -31246=>2667, -33030=>2668, -38587=>2669, -24109=>2670, -24796=>2671, -25114=>2672, -26021=>2673, -26132=>2674, -26512=>2675, -12143=>2676, -30707=>2676, -31309=>2677, -31821=>2678, -32318=>2679, -33034=>2680, -36012=>2681, -12186=>2682, -36196=>2682, -36321=>2683, -36447=>2684, -30889=>2685, -20999=>2686, -25305=>2687, -25509=>2688, -25666=>2689, -25240=>2690, -35373=>2691, -31363=>2692, -31680=>2693, -35500=>2694, -38634=>2695, -32118=>2696, -12166=>2697, -33292=>2697, -34633=>2698, -20185=>2699, -20808=>2700, -21315=>2701, -21344=>2702, -23459=>2703, -23554=>2704, -23574=>2705, -24029=>2706, -25126=>2707, -25159=>2708, -25776=>2709, -26643=>2710, -26676=>2711, -27849=>2712, -27973=>2713, -27927=>2714, -26579=>2715, -28508=>2716, -29006=>2717, -29053=>2718, -26059=>2719, -31359=>2720, -31661=>2721, -32218=>2722, -32330=>2723, -32680=>2724, -33146=>2725, -12167=>2726, -33307=>2726, -33337=>2727, -34214=>2728, -35438=>2729, -36046=>2730, -36341=>2731, -36984=>2732, -36983=>2733, -37549=>2734, -37521=>2735, -38275=>2736, -39854=>2737, -21069=>2738, -21892=>2739, -28472=>2740, -28982=>2741, -20840=>2742, -31109=>2743, -32341=>2744, -33203=>2745, -31950=>2746, -22092=>2747, -22609=>2748, -23720=>2749, -25514=>2750, -26366=>2751, -26365=>2752, -26970=>2753, -29401=>2754, -30095=>2755, -30094=>2756, -30990=>2757, -31062=>2758, -31199=>2759, -31895=>2760, -32032=>2761, -32068=>2762, -34311=>2763, -35380=>2764, -38459=>2765, -36961=>2766, -12239=>2767, -40736=>2767, -20711=>2768, -21109=>2769, -21452=>2770, -21474=>2771, -20489=>2772, -21930=>2773, -22766=>2774, -22863=>2775, -29245=>2776, -23435=>2777, -23652=>2778, -21277=>2779, -24803=>2780, -24819=>2781, -25436=>2782, -25475=>2783, -25407=>2784, -25531=>2785, -25805=>2786, -26089=>2787, -26361=>2788, -24035=>2789, -27085=>2790, -27133=>2791, -28437=>2792, -29157=>2793, -20105=>2794, -30185=>2795, -30456=>2796, -31379=>2797, -31967=>2798, -32207=>2799, -32156=>2800, -32865=>2801, -33609=>2802, -33624=>2803, -33900=>2804, -33980=>2805, -34299=>2806, -35013=>2807, -12187=>2808, -36208=>2808, -36865=>2809, -36973=>2810, -37783=>2811, -38684=>2812, -39442=>2813, -20687=>2814, -22679=>2815, -24974=>2816, -33235=>2817, -34101=>2818, -36104=>2819, -36896=>2820, -20419=>2821, -20596=>2822, -21063=>2823, -21363=>2824, -24687=>2825, -25417=>2826, -26463=>2827, -28204=>2828, -12188=>2829, -36275=>2829, -36895=>2830, -20439=>2831, -23646=>2832, -36042=>2833, -26063=>2834, -32154=>2835, -21330=>2836, -34966=>2837, -20854=>2838, -25539=>2839, -23384=>2840, -23403=>2841, -23562=>2842, -25613=>2843, -26449=>2844, -36956=>2845, -20182=>2846, -22810=>2847, -22826=>2848, -27760=>2849, -35409=>2850, -21822=>2851, -22549=>2852, -22949=>2853, -24816=>2854, -25171=>2855, -26561=>2856, -33333=>2857, -26965=>2858, -38464=>2859, -39364=>2860, -39464=>2861, -20307=>2862, -22534=>2863, -23550=>2864, -32784=>2865, -23729=>2866, -24111=>2867, -24453=>2868, -24608=>2869, -24907=>2870, -25140=>2871, -26367=>2872, -27888=>2873, -28382=>2874, -32974=>2875, -33151=>2876, -33492=>2877, -34955=>2878, -36024=>2879, -36864=>2880, -36910=>2881, -38538=>2882, -40667=>2883, -39899=>2884, -20195=>2885, -21488=>2886, -12068=>2887, -22823=>2887, -31532=>2888, -37261=>2889, -38988=>2890, -40441=>2891, -28381=>2892, -28711=>2893, -21331=>2894, -21828=>2895, -23429=>2896, -25176=>2897, -25246=>2898, -25299=>2899, -27810=>2900, -28655=>2901, -29730=>2902, -35351=>2903, -37944=>2904, -28609=>2905, -35582=>2906, -33592=>2907, -20967=>2908, -34552=>2909, -21482=>2910, -21481=>2911, -20294=>2912, -36948=>2913, -12192=>2914, -36784=>2914, -22890=>2915, -33073=>2916, -24061=>2917, -31466=>2918, -36799=>2919, -26842=>2920, -12181=>2921, -35895=>2921, -29432=>2922, -40008=>2923, -27197=>2924, -35504=>2925, -20025=>2926, -21336=>2927, -22022=>2928, -22374=>2929, -25285=>2930, -25506=>2931, -26086=>2932, -27470=>2933, -28129=>2934, -28251=>2935, -28845=>2936, -30701=>2937, -31471=>2938, -31658=>2939, -32187=>2940, -32829=>2941, -32966=>2942, -34507=>2943, -35477=>2944, -37723=>2945, -22243=>2946, -22727=>2947, -24382=>2948, -26029=>2949, -26262=>2950, -27264=>2951, -27573=>2952, -30007=>2953, -35527=>2954, -20516=>2955, -30693=>2956, -22320=>2957, -24347=>2958, -24677=>2959, -26234=>2960, -27744=>2961, -30196=>2962, -31258=>2963, -32622=>2964, -33268=>2965, -34584=>2966, -36933=>2967, -39347=>2968, -31689=>2969, -30044=>2970, -12149=>2971, -31481=>2971, -31569=>2972, -33988=>2973, -36880=>2974, -31209=>2975, -31378=>2976, -33590=>2977, -23265=>2978, -30528=>2979, -20013=>2980, -20210=>2981, -23449=>2982, -24544=>2983, -25277=>2984, -26172=>2985, -26609=>2986, -27880=>2987, -12173=>2988, -34411=>2988, -34935=>2989, -35387=>2990, -37198=>2991, -37619=>2992, -39376=>2993, -27159=>2994, -28710=>2995, -29482=>2996, -33511=>2997, -33879=>2998, -36015=>2999, -19969=>3000, -20806=>3001, -20939=>3002, -21899=>3003, -23541=>3004, -24086=>3005, -24115=>3006, -24193=>3007, -24340=>3008, -24373=>3009, -24427=>3010, -24500=>3011, -25074=>3012, -25361=>3013, -26274=>3014, -26397=>3015, -28526=>3016, -29266=>3017, -30010=>3018, -30522=>3019, -32884=>3020, -33081=>3021, -33144=>3022, -34678=>3023, -35519=>3024, -35548=>3025, -36229=>3026, -36339=>3027, -37530=>3028, -11985=>3029, -12199=>3029, -38263=>3029, -38914=>3030, -12227=>3031, -40165=>3031, -21189=>3032, -25431=>3033, -30452=>3034, -26389=>3035, -27784=>3036, -29645=>3037, -36035=>3038, -37806=>3039, -38515=>3040, -27941=>3041, -22684=>3042, -26894=>3043, -27084=>3044, -36861=>3045, -37786=>3046, -30171=>3047, -36890=>3048, -22618=>3049, -26626=>3050, -25524=>3051, -27131=>3052, -20291=>3053, -28460=>3054, -26584=>3055, -36795=>3056, -34086=>3057, -32180=>3058, -37716=>3059, -26943=>3060, -28528=>3061, -22378=>3062, -22775=>3063, -23340=>3064, -32044=>3065, -12118=>3066, -29226=>3066, -21514=>3067, -37347=>3068, -40372=>3069, -20141=>3070, -20302=>3071, -20572=>3072, -20597=>3073, -21059=>3074, -35998=>3075, -21576=>3076, -22564=>3077, -23450=>3078, -24093=>3079, -24213=>3080, -24237=>3081, -24311=>3082, -24351=>3083, -24716=>3084, -25269=>3085, -25402=>3086, -25552=>3087, -26799=>3088, -27712=>3089, -30855=>3090, -31118=>3091, -31243=>3092, -32224=>3093, -33351=>3094, -35330=>3095, -35558=>3096, -36420=>3097, -36883=>3098, -37048=>3099, -37165=>3100, -37336=>3101, -12237=>3102, -40718=>3102, -27877=>3103, -25688=>3104, -25826=>3105, -25973=>3106, -28404=>3107, -30340=>3108, -31515=>3109, -36969=>3110, -37841=>3111, -28346=>3112, -21746=>3113, -24505=>3114, -25764=>3115, -36685=>3116, -36845=>3117, -37444=>3118, -20856=>3119, -22635=>3120, -22825=>3121, -23637=>3122, -24215=>3123, -28155=>3124, -32399=>3125, -29980=>3126, -36028=>3127, -36578=>3128, -39003=>3129, -28857=>3130, -20253=>3131, -27583=>3132, -28593=>3133, -12133=>3134, -30000=>3134, -38651=>3135, -20814=>3136, -21520=>3137, -22581=>3138, -22615=>3139, -22956=>3140, -23648=>3141, -24466=>3142, -12099=>3143, -26007=>3143, -26460=>3144, -28193=>3145, -30331=>3146, -33759=>3147, -36077=>3148, -36884=>3149, -37117=>3150, -37709=>3151, -30757=>3152, -30778=>3153, -21162=>3154, -24230=>3155, -12063=>3156, -22303=>3156, -22900=>3157, -24594=>3158, -20498=>3159, -20826=>3160, -20908=>3161, -20941=>3162, -12049=>3163, -20992=>3163, -21776=>3164, -22612=>3165, -22616=>3166, -22871=>3167, -23445=>3168, -23798=>3169, -23947=>3170, -24764=>3171, -25237=>3172, -25645=>3173, -26481=>3174, -26691=>3175, -26812=>3176, -26847=>3177, -30423=>3178, -28120=>3179, -28271=>3180, -28059=>3181, -28783=>3182, -29128=>3183, -24403=>3184, -30168=>3185, -31095=>3186, -31561=>3187, -31572=>3188, -31570=>3189, -31958=>3190, -32113=>3191, -21040=>3192, -33891=>3193, -34153=>3194, -34276=>3195, -35342=>3196, -35588=>3197, -12182=>3198, -35910=>3198, -36367=>3199, -36867=>3200, -36879=>3201, -37913=>3202, -38518=>3203, -38957=>3204, -39472=>3205, -38360=>3206, -20685=>3207, -21205=>3208, -21516=>3209, -22530=>3210, -23566=>3211, -24999=>3212, -25758=>3213, -27934=>3214, -30643=>3215, -31461=>3216, -33012=>3217, -33796=>3218, -36947=>3219, -37509=>3220, -23776=>3221, -40199=>3222, -21311=>3223, -24471=>3224, -24499=>3225, -28060=>3226, -29305=>3227, -30563=>3228, -31167=>3229, -31716=>3230, -27602=>3231, -29420=>3232, -35501=>3233, -26627=>3234, -27233=>3235, -20984=>3236, -31361=>3237, -26932=>3238, -23626=>3239, -40182=>3240, -33515=>3241, -23493=>3242, -12195=>3243, -37193=>3243, -28702=>3244, -22136=>3245, -23663=>3246, -24775=>3247, -25958=>3248, -27788=>3249, -35930=>3250, -36929=>3251, -38931=>3252, -21585=>3253, -26311=>3254, -37389=>3255, -22856=>3256, -37027=>3257, -20869=>3258, -20045=>3259, -20970=>3260, -34201=>3261, -35598=>3262, -28760=>3263, -25466=>3264, -37707=>3265, -26978=>3266, -39348=>3267, -32260=>3268, -30071=>3269, -21335=>3270, -26976=>3271, -36575=>3272, -38627=>3273, -27741=>3274, -12038=>3275, -20108=>3275, -23612=>3276, -24336=>3277, -36841=>3278, -21250=>3279, -36049=>3280, -12161=>3281, -32905=>3281, -34425=>3282, -24319=>3283, -12103=>3284, -26085=>3284, -20083=>3285, -12042=>3286, -20837=>3286, -22914=>3287, -23615=>3288, -38894=>3289, -20219=>3290, -22922=>3291, -24525=>3292, -35469=>3293, -28641=>3294, -31152=>3295, -31074=>3296, -23527=>3297, -33905=>3298, -29483=>3299, -29105=>3300, -24180=>3301, -24565=>3302, -25467=>3303, -25754=>3304, -29123=>3305, -31896=>3306, -20035=>3307, -24316=>3308, -20043=>3309, -22492=>3310, -22178=>3311, -24745=>3312, -28611=>3313, -32013=>3314, -33021=>3315, -33075=>3316, -33215=>3317, -36786=>3318, -35223=>3319, -34468=>3320, -24052=>3321, -25226=>3322, -25773=>3323, -35207=>3324, -26487=>3325, -27874=>3326, -27966=>3327, -29750=>3328, -30772=>3329, -23110=>3330, -32629=>3331, -33453=>3332, -12218=>3333, -39340=>3333, -20467=>3334, -24259=>3335, -25309=>3336, -25490=>3337, -25943=>3338, -26479=>3339, -30403=>3340, -29260=>3341, -32972=>3342, -32954=>3343, -36649=>3344, -37197=>3345, -20493=>3346, -22521=>3347, -23186=>3348, -26757=>3349, -26995=>3350, -29028=>3351, -29437=>3352, -36023=>3353, -22770=>3354, -36064=>3355, -38506=>3356, -36889=>3357, -34687=>3358, -31204=>3359, -30695=>3360, -33833=>3361, -20271=>3362, -21093=>3363, -21338=>3364, -25293=>3365, -26575=>3366, -27850=>3367, -12137=>3368, -30333=>3368, -31636=>3369, -31893=>3370, -33334=>3371, -34180=>3372, -36843=>3373, -26333=>3374, -28448=>3375, -29190=>3376, -32283=>3377, -33707=>3378, -39361=>3379, -12008=>3380, -40614=>3380, -20989=>3381, -31665=>3382, -30834=>3383, -31672=>3384, -32903=>3385, -31560=>3386, -27368=>3387, -24161=>3388, -32908=>3389, -30033=>3390, -30048=>3391, -12043=>3392, -20843=>3392, -37474=>3393, -28300=>3394, -30330=>3395, -37271=>3396, -39658=>3397, -20240=>3398, -32624=>3399, -25244=>3400, -31567=>3401, -38309=>3402, -40169=>3403, -22138=>3404, -22617=>3405, -34532=>3406, -38588=>3407, -20276=>3408, -21028=>3409, -21322=>3410, -21453=>3411, -21467=>3412, -24070=>3413, -25644=>3414, -26001=>3415, -26495=>3416, -27710=>3417, -27726=>3418, -29256=>3419, -29359=>3420, -29677=>3421, -30036=>3422, -32321=>3423, -33324=>3424, -34281=>3425, -36009=>3426, -31684=>3427, -12196=>3428, -37318=>3428, -29033=>3429, -38930=>3430, -39151=>3431, -25405=>3432, -26217=>3433, -30058=>3434, -30436=>3435, -30928=>3436, -34115=>3437, -34542=>3438, -21290=>3439, -21329=>3440, -21542=>3441, -22915=>3442, -24199=>3443, -24444=>3444, -24754=>3445, -25161=>3446, -25209=>3447, -25259=>3448, -26000=>3449, -12112=>3450, -27604=>3450, -27852=>3451, -30130=>3452, -12138=>3453, -30382=>3453, -30865=>3454, -31192=>3455, -32203=>3456, -32631=>3457, -32933=>3458, -34987=>3459, -35513=>3460, -36027=>3461, -36991=>3462, -12206=>3463, -38750=>3463, -12214=>3464, -39131=>3464, -27147=>3465, -31800=>3466, -20633=>3467, -23614=>3468, -24494=>3469, -26503=>3470, -27608=>3471, -29749=>3472, -30473=>3473, -32654=>3474, -12240=>3475, -40763=>3475, -26570=>3476, -31255=>3477, -21305=>3478, -12134=>3479, -30091=>3479, -39661=>3480, -24422=>3481, -33181=>3482, -33777=>3483, -32920=>3484, -24380=>3485, -24517=>3486, -30050=>3487, -31558=>3488, -36924=>3489, -26727=>3490, -23019=>3491, -23195=>3492, -32016=>3493, -30334=>3494, -35628=>3495, -20469=>3496, -24426=>3497, -27161=>3498, -27703=>3499, -28418=>3500, -29922=>3501, -31080=>3502, -34920=>3503, -35413=>3504, -35961=>3505, -24287=>3506, -25551=>3507, -30149=>3508, -31186=>3509, -33495=>3510, -37672=>3511, -37618=>3512, -33948=>3513, -34541=>3514, -39981=>3515, -21697=>3516, -24428=>3517, -25996=>3518, -27996=>3519, -28693=>3520, -36007=>3521, -36051=>3522, -38971=>3523, -25935=>3524, -29942=>3525, -19981=>3526, -20184=>3527, -22496=>3528, -22827=>3529, -23142=>3530, -23500=>3531, -20904=>3532, -24067=>3533, -24220=>3534, -24598=>3535, -25206=>3536, -25975=>3537, -26023=>3538, -26222=>3539, -28014=>3540, -12119=>3541, -29238=>3541, -31526=>3542, -33104=>3543, -33178=>3544, -33433=>3545, -35676=>3546, -36000=>3547, -36070=>3548, -36212=>3549, -12201=>3550, -38428=>3550, -38468=>3551, -20398=>3552, -25771=>3553, -27494=>3554, -33310=>3555, -33889=>3556, -34154=>3557, -37096=>3558, -23553=>3559, -26963=>3560, -12213=>3561, -39080=>3561, -33914=>3562, -34135=>3563, -20239=>3564, -21103=>3565, -24489=>3566, -24133=>3567, -26381=>3568, -31119=>3569, -33145=>3570, -35079=>3571, -35206=>3572, -28149=>3573, -24343=>3574, -25173=>3575, -27832=>3576, -20175=>3577, -29289=>3578, -39826=>3579, -20998=>3580, -21563=>3581, -22132=>3582, -22707=>3583, -24996=>3584, -25198=>3585, -28954=>3586, -22894=>3587, -31881=>3588, -31966=>3589, -32027=>3590, -38640=>3591, -12098=>3592, -25991=>3592, -32862=>3593, -19993=>3594, -20341=>3595, -20853=>3596, -22592=>3597, -24163=>3598, -24179=>3599, -24330=>3600, -26564=>3601, -20006=>3602, -34109=>3603, -38281=>3604, -38491=>3605, -12150=>3606, -31859=>3606, -12212=>3607, -38913=>3607, -20731=>3608, -22721=>3609, -30294=>3610, -30887=>3611, -21029=>3612, -30629=>3613, -34065=>3614, -31622=>3615, -20559=>3616, -22793=>3617, -12122=>3618, -29255=>3618, -31687=>3619, -32232=>3620, -36794=>3621, -36820=>3622, -36941=>3623, -20415=>3624, -21193=>3625, -23081=>3626, -24321=>3627, -38829=>3628, -20445=>3629, -33303=>3630, -37610=>3631, -22275=>3632, -25429=>3633, -27497=>3634, -29995=>3635, -35036=>3636, -36628=>3637, -31298=>3638, -21215=>3639, -22675=>3640, -24917=>3641, -25098=>3642, -26286=>3643, -11935=>3644, -27597=>3644, -31807=>3645, -33769=>3646, -20515=>3647, -20472=>3648, -21253=>3649, -21574=>3650, -22577=>3651, -22857=>3652, -23453=>3653, -23792=>3654, -23791=>3655, -23849=>3656, -24214=>3657, -25265=>3658, -25447=>3659, -25918=>3660, -12101=>3661, -26041=>3661, -26379=>3662, -27861=>3663, -27873=>3664, -28921=>3665, -30770=>3666, -32299=>3667, -32990=>3668, -33459=>3669, -33804=>3670, -34028=>3671, -34562=>3672, -35090=>3673, -35370=>3674, -35914=>3675, -37030=>3676, -37586=>3677, -39165=>3678, -40179=>3679, -40300=>3680, -20047=>3681, -20129=>3682, -20621=>3683, -21078=>3684, -22346=>3685, -22952=>3686, -24125=>3687, -24536=>3688, -24537=>3689, -25151=>3690, -26292=>3691, -26395=>3692, -26576=>3693, -26834=>3694, -20882=>3695, -32033=>3696, -32938=>3697, -33192=>3698, -35584=>3699, -35980=>3700, -36031=>3701, -37502=>3702, -38450=>3703, -21536=>3704, -38956=>3705, -21271=>3706, -20693=>3707, -12056=>3708, -21340=>3708, -22696=>3709, -25778=>3710, -26420=>3711, -29287=>3712, -30566=>3713, -31302=>3714, -37350=>3715, -21187=>3716, -27809=>3717, -27526=>3718, -22528=>3719, -24140=>3720, -22868=>3721, -26412=>3722, -32763=>3723, -20961=>3724, -30406=>3725, -25705=>3726, -30952=>3727, -39764=>3728, -12231=>3729, -40635=>3729, -22475=>3730, -22969=>3731, -26151=>3732, -26522=>3733, -27598=>3734, -21737=>3735, -27097=>3736, -24149=>3737, -33180=>3738, -26517=>3739, -39850=>3740, -26622=>3741, -40018=>3742, -26717=>3743, -20134=>3744, -20451=>3745, -12060=>3746, -21448=>3746, -25273=>3747, -26411=>3748, -27819=>3749, -36804=>3750, -20397=>3751, -32365=>3752, -40639=>3753, -19975=>3754, -24930=>3755, -28288=>3756, -28459=>3757, -34067=>3758, -21619=>3759, -26410=>3760, -39749=>3761, -11922=>3762, -24051=>3762, -31637=>3763, -23724=>3764, -23494=>3765, -34588=>3766, -28234=>3767, -34001=>3768, -31252=>3769, -33032=>3770, -22937=>3771, -31885=>3772, -11936=>3773, -27665=>3773, -30496=>3774, -21209=>3775, -22818=>3776, -28961=>3777, -29279=>3778, -12141=>3779, -30683=>3779, -38695=>3780, -40289=>3781, -26891=>3782, -23167=>3783, -23064=>3784, -20901=>3785, -21517=>3786, -21629=>3787, -26126=>3788, -30431=>3789, -36855=>3790, -37528=>3791, -40180=>3792, -23018=>3793, -29277=>3794, -28357=>3795, -20813=>3796, -26825=>3797, -32191=>3798, -32236=>3799, -12207=>3800, -38754=>3800, -40634=>3801, -25720=>3802, -27169=>3803, -33538=>3804, -22916=>3805, -23391=>3806, -12113=>3807, -27611=>3807, -29467=>3808, -30450=>3809, -32178=>3810, -32791=>3811, -33945=>3812, -20786=>3813, -12106=>3814, -26408=>3814, -40665=>3815, -12140=>3816, -30446=>3816, -26466=>3817, -21247=>3818, -39173=>3819, -23588=>3820, -25147=>3821, -31870=>3822, -36016=>3823, -21839=>3824, -24758=>3825, -32011=>3826, -12200=>3827, -38272=>3827, -21249=>3828, -20063=>3829, -20918=>3830, -22812=>3831, -29242=>3832, -32822=>3833, -37326=>3834, -24357=>3835, -12142=>3836, -30690=>3836, -21380=>3837, -24441=>3838, -32004=>3839, -34220=>3840, -35379=>3841, -36493=>3842, -38742=>3843, -26611=>3844, -34222=>3845, -37971=>3846, -24841=>3847, -24840=>3848, -27833=>3849, -30290=>3850, -35565=>3851, -36664=>3852, -21807=>3853, -20305=>3854, -20778=>3855, -21191=>3856, -21451=>3857, -23461=>3858, -24189=>3859, -24736=>3860, -24962=>3861, -25558=>3862, -26377=>3863, -26586=>3864, -28263=>3865, -28044=>3866, -29494=>3867, -29495=>3868, -30001=>3869, -31056=>3870, -35029=>3871, -35480=>3872, -36938=>3873, -12194=>3874, -37009=>3874, -37109=>3875, -38596=>3876, -34701=>3877, -12067=>3878, -22805=>3878, -20104=>3879, -20313=>3880, -19982=>3881, -35465=>3882, -36671=>3883, -38928=>3884, -20653=>3885, -24188=>3886, -22934=>3887, -23481=>3888, -24248=>3889, -25562=>3890, -25594=>3891, -25793=>3892, -26332=>3893, -26954=>3894, -27096=>3895, -27915=>3896, -28342=>3897, -29076=>3898, -12132=>3899, -29992=>3899, -31407=>3900, -12154=>3901, -32650=>3901, -32768=>3902, -33865=>3903, -33993=>3904, -35201=>3905, -35617=>3906, -36362=>3907, -36965=>3908, -38525=>3909, -39178=>3910, -24958=>3911, -25233=>3912, -27442=>3913, -27779=>3914, -28020=>3915, -32716=>3916, -32764=>3917, -28096=>3918, -32645=>3919, -34746=>3920, -35064=>3921, -26469=>3922, -33713=>3923, -38972=>3924, -38647=>3925, -27931=>3926, -32097=>3927, -33853=>3928, -37226=>3929, -20081=>3930, -21365=>3931, -23888=>3932, -27396=>3933, -28651=>3934, -34253=>3935, -34349=>3936, -35239=>3937, -21033=>3938, -21519=>3939, -23653=>3940, -26446=>3941, -26792=>3942, -29702=>3943, -29827=>3944, -30178=>3945, -35023=>3946, -35041=>3947, -12197=>3948, -37324=>3948, -38626=>3949, -38520=>3950, -24459=>3951, -29575=>3952, -12148=>3953, -31435=>3953, -33870=>3954, -25504=>3955, -30053=>3956, -21129=>3957, -27969=>3958, -28316=>3959, -29705=>3960, -30041=>3961, -30827=>3962, -31890=>3963, -38534=>3964, -12015=>3965, -31452=>3965, -12243=>3966, -40845=>3966, -20406=>3967, -24942=>3968, -26053=>3969, -34396=>3970, -20102=>3971, -20142=>3972, -20698=>3973, -20001=>3974, -20940=>3975, -23534=>3976, -26009=>3977, -26753=>3978, -28092=>3979, -29471=>3980, -30274=>3981, -30637=>3982, -31260=>3983, -31975=>3984, -33391=>3985, -35538=>3986, -36988=>3987, -37327=>3988, -38517=>3989, -38936=>3990, -12050=>3991, -21147=>3991, -32209=>3992, -20523=>3993, -21400=>3994, -26519=>3995, -28107=>3996, -29136=>3997, -29747=>3998, -33256=>3999, -36650=>4000, -38563=>4001, -40023=>4002, -40607=>4003, -29792=>4004, -22593=>4005, -28057=>4006, -32047=>4007, -39006=>4008, -20196=>4009, -20278=>4010, -20363=>4011, -20919=>4012, -21169=>4013, -23994=>4014, -24604=>4015, -29618=>4016, -31036=>4017, -33491=>4018, -37428=>4019, -38583=>4020, -38646=>4021, -38666=>4022, -40599=>4023, -40802=>4024, -26278=>4025, -27508=>4026, -21015=>4027, -21155=>4028, -28872=>4029, -35010=>4030, -24265=>4031, -24651=>4032, -24976=>4033, -28451=>4034, -29001=>4035, -31806=>4036, -32244=>4037, -32879=>4038, -34030=>4039, -36899=>4040, -37676=>4041, -21570=>4042, -39791=>4043, -27347=>4044, -28809=>4045, -36034=>4046, -36335=>4047, -38706=>4048, -21172=>4049, -23105=>4050, -24266=>4051, -24324=>4052, -26391=>4053, -27004=>4054, -27028=>4055, -28010=>4056, -28431=>4057, -29282=>4058, -29436=>4059, -31725=>4060, -12156=>4061, -32769=>4061, -32894=>4062, -34635=>4063, -37070=>4064, -20845=>4065, -40595=>4066, -31108=>4067, -32907=>4068, -37682=>4069, -35542=>4070, -20525=>4071, -21644=>4072, -35441=>4073, -27498=>4074, -36036=>4075, -33031=>4076, -24785=>4077, -26528=>4078, -40434=>4079, -20121=>4080, -20120=>4081, -39952=>4082, -35435=>4083, -34241=>4084, -34152=>4085, -26880=>4086, -28286=>4087, -30871=>4088, -33109=>4089, -24332=>4090, -19984=>4091, -19989=>4092, -20010=>4093, -20017=>4094, -12034=>4095, -20022=>4095, -20028=>4096, -12035=>4097, -20031=>4097, -20034=>4098, -20054=>4099, -20056=>4100, -20098=>4101, -12037=>4102, -20101=>4102, -35947=>4103, -20106=>4104, -33298=>4105, -24333=>4106, -20110=>4107, -20126=>4108, -20127=>4109, -12039=>4110, -20128=>4110, -20130=>4111, -20144=>4112, -20147=>4113, -20150=>4114, -20174=>4115, -20173=>4116, -20164=>4117, -20166=>4118, -20162=>4119, -20183=>4120, -20190=>4121, -20205=>4122, -20191=>4123, -20215=>4124, -20233=>4125, -20314=>4126, -20272=>4127, -20315=>4128, -20317=>4129, -20311=>4130, -20295=>4131, -20342=>4132, -20360=>4133, -20367=>4134, -20376=>4135, -20347=>4136, -20329=>4137, -20336=>4138, -20369=>4139, -20335=>4140, -20358=>4141, -20374=>4142, -20760=>4143, -20436=>4144, -20447=>4145, -20430=>4146, -20440=>4147, -20443=>4148, -20433=>4149, -20442=>4150, -20432=>4151, -20452=>4152, -20453=>4153, -20506=>4154, -20520=>4155, -20500=>4156, -20522=>4157, -20517=>4158, -20485=>4159, -20252=>4160, -20470=>4161, -20513=>4162, -20521=>4163, -20524=>4164, -20478=>4165, -20463=>4166, -20497=>4167, -20486=>4168, -20547=>4169, -20551=>4170, -26371=>4171, -20565=>4172, -20560=>4173, -20552=>4174, -20570=>4175, -20566=>4176, -20588=>4177, -20600=>4178, -20608=>4179, -20634=>4180, -20613=>4181, -20660=>4182, -20658=>4183, -20681=>4184, -20682=>4185, -20659=>4186, -20674=>4187, -20694=>4188, -20702=>4189, -20709=>4190, -20717=>4191, -20707=>4192, -20718=>4193, -20729=>4194, -20725=>4195, -20745=>4196, -20737=>4197, -20738=>4198, -20758=>4199, -20757=>4200, -20756=>4201, -20762=>4202, -20769=>4203, -20794=>4204, -20791=>4205, -20796=>4206, -20795=>4207, -12041=>4208, -20799=>4208, -11918=>4209, -20800=>4209, -20818=>4210, -20812=>4211, -20820=>4212, -20834=>4213, -31480=>4214, -20841=>4215, -20842=>4216, -20846=>4217, -20864=>4218, -12044=>4219, -20866=>4219, -22232=>4220, -20876=>4221, -20873=>4222, -20879=>4223, -20881=>4224, -20883=>4225, -20885=>4226, -12045=>4227, -20886=>4227, -20900=>4228, -20902=>4229, -20898=>4230, -20905=>4231, -20906=>4232, -12046=>4233, -20907=>4233, -20915=>4234, -20913=>4235, -20914=>4236, -20912=>4237, -20917=>4238, -20925=>4239, -20933=>4240, -20937=>4241, -20955=>4242, -12047=>4243, -20960=>4243, -34389=>4244, -20969=>4245, -20973=>4246, -20976=>4247, -12048=>4248, -20981=>4248, -20990=>4249, -20996=>4250, -21003=>4251, -21012=>4252, -21006=>4253, -21031=>4254, -21034=>4255, -21038=>4256, -21043=>4257, -21049=>4258, -21071=>4259, -21060=>4260, -21067=>4261, -21068=>4262, -21086=>4263, -21076=>4264, -21098=>4265, -21108=>4266, -21097=>4267, -21107=>4268, -21119=>4269, -21117=>4270, -21133=>4271, -21140=>4272, -21138=>4273, -21105=>4274, -21128=>4275, -21137=>4276, -36776=>4277, -36775=>4278, -21164=>4279, -21165=>4280, -21180=>4281, -21173=>4282, -21185=>4283, -21197=>4284, -21207=>4285, -21214=>4286, -21219=>4287, -21222=>4288, -39149=>4289, -21216=>4290, -21235=>4291, -21237=>4292, -21240=>4293, -12051=>4294, -21241=>4294, -21254=>4295, -21256=>4296, -30008=>4297, -21261=>4298, -21264=>4299, -21263=>4300, -21269=>4301, -12052=>4301, -21274=>4302, -12053=>4302, -21283=>4303, -21295=>4304, -21297=>4305, -21299=>4306, -12054=>4307, -21304=>4307, -21312=>4308, -21318=>4309, -21317=>4310, -19991=>4311, -21321=>4312, -21325=>4313, -20950=>4314, -21342=>4315, -12057=>4316, -21353=>4316, -21358=>4317, -22808=>4318, -21371=>4319, -21367=>4320, -12058=>4321, -21378=>4321, -21398=>4322, -21408=>4323, -21414=>4324, -21413=>4325, -21422=>4326, -21424=>4327, -12059=>4328, -21430=>4328, -21443=>4329, -31762=>4330, -38617=>4331, -21471=>4332, -26364=>4333, -29166=>4334, -21486=>4335, -21480=>4336, -21485=>4337, -21498=>4338, -21505=>4339, -21565=>4340, -21568=>4341, -21548=>4342, -21549=>4343, -21564=>4344, -21550=>4345, -21558=>4346, -21545=>4347, -21533=>4348, -21582=>4349, -21647=>4350, -21621=>4351, -21646=>4352, -21599=>4353, -21617=>4354, -21623=>4355, -21616=>4356, -21650=>4357, -21627=>4358, -21632=>4359, -21622=>4360, -21636=>4361, -21648=>4362, -21638=>4363, -21703=>4364, -21666=>4365, -21688=>4366, -21669=>4367, -21676=>4368, -21700=>4369, -21704=>4370, -21672=>4371, -21675=>4372, -21698=>4373, -21668=>4374, -21694=>4375, -21692=>4376, -21720=>4377, -21733=>4378, -21734=>4379, -21775=>4380, -21780=>4381, -21757=>4382, -21742=>4383, -21741=>4384, -21754=>4385, -21730=>4386, -21817=>4387, -21824=>4388, -21859=>4389, -21836=>4390, -21806=>4391, -21852=>4392, -21829=>4393, -21846=>4394, -21847=>4395, -21816=>4396, -21811=>4397, -21853=>4398, -21913=>4399, -21888=>4400, -21679=>4401, -21898=>4402, -21919=>4403, -21883=>4404, -21886=>4405, -21912=>4406, -21918=>4407, -21934=>4408, -21884=>4409, -21891=>4410, -21929=>4411, -21895=>4412, -21928=>4413, -21978=>4414, -21957=>4415, -21983=>4416, -21956=>4417, -21980=>4418, -21988=>4419, -21972=>4420, -22036=>4421, -22007=>4422, -22038=>4423, -22014=>4424, -22013=>4425, -22043=>4426, -22009=>4427, -22094=>4428, -22096=>4429, -29151=>4430, -22068=>4431, -22070=>4432, -22066=>4433, -22072=>4434, -22123=>4435, -22116=>4436, -22063=>4437, -22124=>4438, -22122=>4439, -22150=>4440, -22144=>4441, -22154=>4442, -22176=>4443, -22164=>4444, -22159=>4445, -22181=>4446, -22190=>4447, -22198=>4448, -22196=>4449, -22210=>4450, -22204=>4451, -22209=>4452, -22211=>4453, -22208=>4454, -22216=>4455, -22222=>4456, -22225=>4457, -22227=>4458, -12062=>4459, -22231=>4459, -22254=>4460, -22265=>4461, -22272=>4462, -22271=>4463, -22276=>4464, -22281=>4465, -22280=>4466, -22283=>4467, -22285=>4468, -22291=>4469, -22296=>4470, -22294=>4471, -21959=>4472, -22300=>4473, -22310=>4474, -22327=>4475, -22328=>4476, -22350=>4477, -22331=>4478, -22336=>4479, -22351=>4480, -22377=>4481, -22464=>4482, -22408=>4483, -22369=>4484, -22399=>4485, -22409=>4486, -22419=>4487, -22432=>4488, -22451=>4489, -22436=>4490, -22442=>4491, -22448=>4492, -22467=>4493, -22470=>4494, -22484=>4495, -22482=>4496, -22483=>4497, -22538=>4498, -22486=>4499, -22499=>4500, -22539=>4501, -22553=>4502, -22557=>4503, -22642=>4504, -22561=>4505, -22626=>4506, -22603=>4507, -22640=>4508, -27584=>4509, -22610=>4510, -22589=>4511, -22649=>4512, -22661=>4513, -22713=>4514, -22687=>4515, -22699=>4516, -22714=>4517, -22750=>4518, -22715=>4519, -22712=>4520, -22702=>4521, -22725=>4522, -22739=>4523, -22737=>4524, -22743=>4525, -22745=>4526, -22744=>4527, -22757=>4528, -22748=>4529, -22756=>4530, -22751=>4531, -22767=>4532, -22778=>4533, -22777=>4534, -22779=>4535, -22780=>4536, -22781=>4537, -22786=>4538, -12065=>4538, -22794=>4539, -12066=>4539, -22800=>4540, -22811=>4541, -26790=>4542, -22821=>4543, -22828=>4544, -22829=>4545, -22834=>4546, -22840=>4547, -22846=>4548, -31442=>4549, -22869=>4550, -22864=>4551, -22862=>4552, -22874=>4553, -22872=>4554, -22882=>4555, -22880=>4556, -22887=>4557, -22892=>4558, -22889=>4559, -22904=>4560, -22913=>4561, -22941=>4562, -20318=>4563, -20395=>4564, -22947=>4565, -22962=>4566, -22982=>4567, -23016=>4568, -23004=>4569, -22925=>4570, -23001=>4571, -23002=>4572, -23077=>4573, -23071=>4574, -23057=>4575, -23068=>4576, -23049=>4577, -23066=>4578, -23104=>4579, -23148=>4580, -23113=>4581, -23093=>4582, -23094=>4583, -23138=>4584, -23146=>4585, -23194=>4586, -23228=>4587, -23230=>4588, -23243=>4589, -23234=>4590, -23229=>4591, -23267=>4592, -23255=>4593, -23270=>4594, -23273=>4595, -23254=>4596, -23290=>4597, -23291=>4598, -23308=>4599, -23307=>4600, -23318=>4601, -23346=>4602, -23248=>4603, -23338=>4604, -23350=>4605, -23358=>4606, -23363=>4607, -23365=>4608, -23360=>4609, -23377=>4610, -23381=>4611, -23386=>4612, -23387=>4613, -23397=>4614, -23401=>4615, -23408=>4616, -23411=>4617, -23413=>4618, -23416=>4619, -25992=>4620, -23418=>4621, -12071=>4622, -23424=>4622, -23427=>4623, -23462=>4624, -23480=>4625, -23491=>4626, -23495=>4627, -23497=>4628, -23508=>4629, -23504=>4630, -23524=>4631, -23526=>4632, -23522=>4633, -23518=>4634, -23525=>4635, -23531=>4636, -23536=>4637, -23542=>4638, -23539=>4639, -23557=>4640, -23559=>4641, -23560=>4642, -23565=>4643, -23571=>4644, -23584=>4645, -11920=>4646, -12074=>4646, -23586=>4646, -23592=>4647, -12075=>4648, -23608=>4648, -23609=>4649, -23617=>4650, -23622=>4651, -23630=>4652, -23635=>4653, -23632=>4654, -23631=>4655, -23409=>4656, -23660=>4657, -12076=>4658, -23662=>4658, -20066=>4659, -23670=>4660, -23673=>4661, -23692=>4662, -23697=>4663, -23700=>4664, -22939=>4665, -23723=>4666, -23739=>4667, -23734=>4668, -23740=>4669, -23735=>4670, -23749=>4671, -23742=>4672, -23751=>4673, -23769=>4674, -23785=>4675, -23805=>4676, -23802=>4677, -23789=>4678, -23948=>4679, -23786=>4680, -23819=>4681, -23829=>4682, -23831=>4683, -23900=>4684, -23839=>4685, -23835=>4686, -23825=>4687, -23828=>4688, -23842=>4689, -23834=>4690, -23833=>4691, -23832=>4692, -23884=>4693, -23890=>4694, -23886=>4695, -23883=>4696, -23916=>4697, -23923=>4698, -23926=>4699, -23943=>4700, -23940=>4701, -23938=>4702, -23970=>4703, -23965=>4704, -23980=>4705, -23982=>4706, -23997=>4707, -23952=>4708, -23991=>4709, -23996=>4710, -24009=>4711, -24013=>4712, -24019=>4713, -24018=>4714, -24022=>4715, -12078=>4716, -24027=>4716, -24043=>4717, -24050=>4718, -24053=>4719, -24075=>4720, -24090=>4721, -24089=>4722, -24081=>4723, -24091=>4724, -24118=>4725, -24119=>4726, -24132=>4727, -24131=>4728, -24128=>4729, -24142=>4730, -24151=>4731, -24148=>4732, -24159=>4733, -24162=>4734, -24164=>4735, -24135=>4736, -24181=>4737, -24182=>4738, -11923=>4739, -12083=>4739, -24186=>4739, -40636=>4740, -12084=>4741, -24191=>4741, -24224=>4742, -24257=>4743, -24258=>4744, -24264=>4745, -24272=>4746, -24271=>4747, -24278=>4748, -24291=>4749, -24285=>4750, -24282=>4751, -24283=>4752, -24290=>4753, -24289=>4754, -24296=>4755, -24297=>4756, -24300=>4757, -24305=>4758, -24307=>4759, -24304=>4760, -12085=>4761, -24308=>4761, -24312=>4762, -12086=>4763, -24318=>4763, -24323=>4764, -24329=>4765, -24413=>4766, -24412=>4767, -12087=>4768, -24331=>4768, -24337=>4769, -24342=>4770, -24361=>4771, -24365=>4772, -24376=>4773, -24385=>4774, -24392=>4775, -24396=>4776, -24398=>4777, -24367=>4778, -11924=>4779, -24401=>4779, -24406=>4780, -24407=>4781, -24409=>4782, -12090=>4783, -24417=>4783, -24429=>4784, -12091=>4785, -24435=>4785, -24439=>4786, -24451=>4787, -24450=>4788, -24447=>4789, -24458=>4790, -24456=>4791, -24465=>4792, -24455=>4793, -24478=>4794, -24473=>4795, -24472=>4796, -24480=>4797, -24488=>4798, -24493=>4799, -24508=>4800, -24534=>4801, -24571=>4802, -24548=>4803, -24568=>4804, -24561=>4805, -24541=>4806, -24755=>4807, -24575=>4808, -24609=>4809, -24672=>4810, -24601=>4811, -24592=>4812, -24617=>4813, -24590=>4814, -24625=>4815, -24603=>4816, -24597=>4817, -24619=>4818, -24614=>4819, -24591=>4820, -24634=>4821, -24666=>4822, -24641=>4823, -24682=>4824, -24695=>4825, -24671=>4826, -24650=>4827, -24646=>4828, -24653=>4829, -24675=>4830, -24643=>4831, -24676=>4832, -24642=>4833, -24684=>4834, -24683=>4835, -24665=>4836, -24705=>4837, -24717=>4838, -24807=>4839, -24707=>4840, -24730=>4841, -24708=>4842, -24731=>4843, -24726=>4844, -24727=>4845, -24722=>4846, -24743=>4847, -24715=>4848, -24801=>4849, -24760=>4850, -24800=>4851, -24787=>4852, -24756=>4853, -24560=>4854, -24765=>4855, -24774=>4856, -24757=>4857, -24792=>4858, -24909=>4859, -24853=>4860, -24838=>4861, -24822=>4862, -24823=>4863, -24832=>4864, -24820=>4865, -24826=>4866, -24835=>4867, -24865=>4868, -24827=>4869, -24817=>4870, -24845=>4871, -24846=>4872, -24903=>4873, -24894=>4874, -24872=>4875, -24871=>4876, -24906=>4877, -24895=>4878, -24892=>4879, -24876=>4880, -24884=>4881, -24893=>4882, -24898=>4883, -24900=>4884, -24947=>4885, -24951=>4886, -24920=>4887, -24921=>4888, -24922=>4889, -24939=>4890, -24948=>4891, -24943=>4892, -24933=>4893, -24945=>4894, -24927=>4895, -24925=>4896, -24915=>4897, -24949=>4898, -24985=>4899, -24982=>4900, -24967=>4901, -25004=>4902, -24980=>4903, -24986=>4904, -24970=>4905, -24977=>4906, -25003=>4907, -25006=>4908, -25036=>4909, -25034=>4910, -25033=>4911, -25079=>4912, -25032=>4913, -25027=>4914, -25030=>4915, -25018=>4916, -25035=>4917, -32633=>4918, -25037=>4919, -25062=>4920, -25059=>4921, -25078=>4922, -25082=>4923, -25076=>4924, -25087=>4925, -25085=>4926, -25084=>4927, -25086=>4928, -25088=>4929, -12093=>4930, -25096=>4930, -25097=>4931, -25101=>4932, -25100=>4933, -25108=>4934, -25115=>4935, -25118=>4936, -25121=>4937, -25130=>4938, -25134=>4939, -25136=>4940, -25138=>4941, -25139=>4942, -25153=>4943, -25166=>4944, -25182=>4945, -25187=>4946, -25179=>4947, -25184=>4948, -25192=>4949, -25212=>4950, -25218=>4951, -25225=>4952, -25214=>4953, -25234=>4954, -25235=>4955, -25238=>4956, -25300=>4957, -25219=>4958, -25236=>4959, -25303=>4960, -25297=>4961, -25275=>4962, -25295=>4963, -25343=>4964, -25286=>4965, -25812=>4966, -25288=>4967, -25308=>4968, -25292=>4969, -25290=>4970, -25282=>4971, -25287=>4972, -25243=>4973, -25289=>4974, -25356=>4975, -25326=>4976, -25329=>4977, -25383=>4978, -25346=>4979, -25352=>4980, -25327=>4981, -25333=>4982, -25424=>4983, -25406=>4984, -25421=>4985, -25628=>4986, -25423=>4987, -25494=>4988, -25486=>4989, -25472=>4990, -25515=>4991, -25462=>4992, -25507=>4993, -25487=>4994, -25481=>4995, -25503=>4996, -25525=>4997, -25451=>4998, -25449=>4999, -25534=>5000, -25577=>5001, -25536=>5002, -25542=>5003, -25571=>5004, -25545=>5005, -25554=>5006, -25590=>5007, -25540=>5008, -25622=>5009, -25652=>5010, -25606=>5011, -25619=>5012, -25638=>5013, -25654=>5014, -25885=>5015, -25623=>5016, -25640=>5017, -25615=>5018, -25703=>5019, -25711=>5020, -25718=>5021, -25678=>5022, -25898=>5023, -25749=>5024, -25747=>5025, -25765=>5026, -25769=>5027, -25736=>5028, -25788=>5029, -25818=>5030, -25810=>5031, -25797=>5032, -25799=>5033, -25787=>5034, -25816=>5035, -25794=>5036, -25841=>5037, -25831=>5038, -33289=>5039, -25824=>5040, -25825=>5041, -25260=>5042, -25827=>5043, -25839=>5044, -25900=>5045, -25846=>5046, -25844=>5047, -25842=>5048, -25850=>5049, -25856=>5050, -25853=>5051, -25880=>5052, -25884=>5053, -25861=>5054, -25892=>5055, -25891=>5056, -25899=>5057, -12097=>5058, -25908=>5058, -11929=>5059, -25909=>5059, -25911=>5060, -25910=>5061, -25912=>5062, -30027=>5063, -25928=>5064, -25942=>5065, -25941=>5066, -25933=>5067, -25944=>5068, -25950=>5069, -25949=>5070, -25970=>5071, -25976=>5072, -25986=>5073, -25987=>5074, -35722=>5075, -26011=>5076, -26015=>5077, -26027=>5078, -26039=>5079, -26051=>5080, -26054=>5081, -26049=>5082, -26052=>5083, -26060=>5084, -26066=>5085, -26075=>5086, -26073=>5087, -12102=>5088, -26080=>5088, -11931=>5089, -26081=>5089, -26097=>5090, -26482=>5091, -26122=>5092, -26115=>5093, -26107=>5094, -26483=>5095, -26165=>5096, -26166=>5097, -26164=>5098, -26140=>5099, -26191=>5100, -26180=>5101, -26185=>5102, -26177=>5103, -26206=>5104, -26205=>5105, -26212=>5106, -26215=>5107, -26216=>5108, -26207=>5109, -26210=>5110, -26224=>5111, -26243=>5112, -26248=>5113, -26254=>5114, -26249=>5115, -26244=>5116, -26264=>5117, -26269=>5118, -26305=>5119, -26297=>5120, -26313=>5121, -26302=>5122, -26300=>5123, -26308=>5124, -26296=>5125, -26326=>5126, -26330=>5127, -26336=>5128, -26175=>5129, -26342=>5130, -26345=>5131, -12104=>5132, -26352=>5132, -26357=>5133, -26359=>5134, -26383=>5135, -26390=>5136, -26398=>5137, -26406=>5138, -26407=>5139, -38712=>5140, -26414=>5141, -26431=>5142, -26422=>5143, -26433=>5144, -26424=>5145, -26423=>5146, -26438=>5147, -26462=>5148, -26464=>5149, -26457=>5150, -26467=>5151, -26468=>5152, -26505=>5153, -26480=>5154, -26537=>5155, -26492=>5156, -26474=>5157, -26508=>5158, -26507=>5159, -26534=>5160, -26529=>5161, -26501=>5162, -26551=>5163, -26607=>5164, -26548=>5165, -26604=>5166, -26547=>5167, -26601=>5168, -26552=>5169, -26596=>5170, -26590=>5171, -26589=>5172, -26594=>5173, -26606=>5174, -26553=>5175, -26574=>5176, -26566=>5177, -26599=>5178, -27292=>5179, -26654=>5180, -26694=>5181, -26665=>5182, -26688=>5183, -26701=>5184, -26674=>5185, -26702=>5186, -26803=>5187, -26667=>5188, -26713=>5189, -26723=>5190, -26743=>5191, -26751=>5192, -26783=>5193, -26767=>5194, -26797=>5195, -26772=>5196, -26781=>5197, -26779=>5198, -26755=>5199, -27310=>5200, -26809=>5201, -26740=>5202, -26805=>5203, -26784=>5204, -26810=>5205, -26895=>5206, -26765=>5207, -26750=>5208, -26881=>5209, -26826=>5210, -26888=>5211, -26840=>5212, -26914=>5213, -26918=>5214, -26849=>5215, -26892=>5216, -26829=>5217, -26836=>5218, -26855=>5219, -26837=>5220, -26934=>5221, -26898=>5222, -26884=>5223, -26839=>5224, -26851=>5225, -26917=>5226, -26873=>5227, -26848=>5228, -26863=>5229, -26920=>5230, -26922=>5231, -26906=>5232, -26915=>5233, -26913=>5234, -26822=>5235, -27001=>5236, -26999=>5237, -26972=>5238, -27000=>5239, -26987=>5240, -26964=>5241, -27006=>5242, -26990=>5243, -26937=>5244, -26996=>5245, -26941=>5246, -26969=>5247, -26928=>5248, -26977=>5249, -26974=>5250, -26973=>5251, -27009=>5252, -26986=>5253, -27058=>5254, -27054=>5255, -27088=>5256, -27071=>5257, -27073=>5258, -27091=>5259, -27070=>5260, -27086=>5261, -23528=>5262, -27082=>5263, -27101=>5264, -27067=>5265, -27075=>5266, -27047=>5267, -27182=>5268, -27025=>5269, -27040=>5270, -27036=>5271, -27029=>5272, -27060=>5273, -27102=>5274, -27112=>5275, -27138=>5276, -27163=>5277, -27135=>5278, -27402=>5279, -27129=>5280, -27122=>5281, -27111=>5282, -27141=>5283, -27057=>5284, -27166=>5285, -27117=>5286, -27156=>5287, -27115=>5288, -27146=>5289, -27154=>5290, -27329=>5291, -27171=>5292, -27155=>5293, -27204=>5294, -27148=>5295, -27250=>5296, -27190=>5297, -27256=>5298, -27207=>5299, -27234=>5300, -27225=>5301, -27238=>5302, -27208=>5303, -27192=>5304, -27170=>5305, -27280=>5306, -27277=>5307, -27296=>5308, -27268=>5309, -27298=>5310, -27299=>5311, -27287=>5312, -34327=>5313, -27323=>5314, -27331=>5315, -27330=>5316, -27320=>5317, -27315=>5318, -27308=>5319, -27358=>5320, -27345=>5321, -27359=>5322, -27306=>5323, -27354=>5324, -27370=>5325, -27387=>5326, -27397=>5327, -34326=>5328, -27386=>5329, -27410=>5330, -27414=>5331, -39729=>5332, -27423=>5333, -27448=>5334, -27447=>5335, -30428=>5336, -27449=>5337, -39150=>5338, -27463=>5339, -27459=>5340, -27465=>5341, -27472=>5342, -27481=>5343, -27476=>5344, -27483=>5345, -27487=>5346, -27489=>5347, -27512=>5348, -12109=>5349, -27513=>5349, -27519=>5350, -27520=>5351, -27524=>5352, -27523=>5353, -27533=>5354, -27544=>5355, -27541=>5356, -27550=>5357, -27556=>5358, -27562=>5359, -27563=>5360, -27567=>5361, -27570=>5362, -27569=>5363, -12110=>5364, -27571=>5364, -27575=>5365, -27580=>5366, -27590=>5367, -12111=>5368, -27595=>5368, -27603=>5369, -27615=>5370, -27628=>5371, -27627=>5372, -27635=>5373, -27631=>5374, -40638=>5375, -27656=>5376, -27667=>5377, -12115=>5378, -27668=>5378, -27675=>5379, -27684=>5380, -27683=>5381, -27742=>5382, -27733=>5383, -27746=>5384, -27754=>5385, -27778=>5386, -27789=>5387, -27802=>5388, -27777=>5389, -27803=>5390, -27774=>5391, -27752=>5392, -27763=>5393, -27794=>5394, -27792=>5395, -27844=>5396, -27889=>5397, -27859=>5398, -27837=>5399, -27863=>5400, -27845=>5401, -27869=>5402, -27822=>5403, -27825=>5404, -27838=>5405, -27834=>5406, -27867=>5407, -27887=>5408, -27865=>5409, -27882=>5410, -27935=>5411, -34893=>5412, -27958=>5413, -27947=>5414, -27965=>5415, -27960=>5416, -27929=>5417, -27957=>5418, -27955=>5419, -27922=>5420, -27916=>5421, -28003=>5422, -28051=>5423, -28004=>5424, -27994=>5425, -28025=>5426, -27993=>5427, -28046=>5428, -28053=>5429, -28644=>5430, -28037=>5431, -28153=>5432, -28181=>5433, -28170=>5434, -28085=>5435, -28103=>5436, -28134=>5437, -28088=>5438, -28102=>5439, -28140=>5440, -28126=>5441, -28108=>5442, -28136=>5443, -28114=>5444, -28101=>5445, -28154=>5446, -28121=>5447, -28132=>5448, -28117=>5449, -28138=>5450, -28142=>5451, -28205=>5452, -28270=>5453, -28206=>5454, -28185=>5455, -28274=>5456, -28255=>5457, -28222=>5458, -28195=>5459, -28267=>5460, -28203=>5461, -28278=>5462, -28237=>5463, -28191=>5464, -28227=>5465, -28218=>5466, -28238=>5467, -28196=>5468, -28415=>5469, -28189=>5470, -28216=>5471, -28290=>5472, -28330=>5473, -28312=>5474, -28361=>5475, -28343=>5476, -28371=>5477, -28349=>5478, -28335=>5479, -28356=>5480, -28338=>5481, -28372=>5482, -28373=>5483, -28303=>5484, -28325=>5485, -28354=>5486, -28319=>5487, -28481=>5488, -28433=>5489, -28748=>5490, -28396=>5491, -28408=>5492, -28414=>5493, -28479=>5494, -28402=>5495, -28465=>5496, -28399=>5497, -28466=>5498, -28364=>5499, -28478=>5500, -28435=>5501, -28407=>5502, -28550=>5503, -28538=>5504, -28536=>5505, -28545=>5506, -28544=>5507, -28527=>5508, -28507=>5509, -28659=>5510, -28525=>5511, -28546=>5512, -28540=>5513, -28504=>5514, -28558=>5515, -28561=>5516, -28610=>5517, -28518=>5518, -28595=>5519, -28579=>5520, -28577=>5521, -28580=>5522, -28601=>5523, -28614=>5524, -28586=>5525, -28639=>5526, -28629=>5527, -28652=>5528, -28628=>5529, -28632=>5530, -28657=>5531, -28654=>5532, -28635=>5533, -28681=>5534, -28683=>5535, -28666=>5536, -28689=>5537, -28673=>5538, -28687=>5539, -28670=>5540, -28699=>5541, -28698=>5542, -28532=>5543, -28701=>5544, -28696=>5545, -28703=>5546, -28720=>5547, -28734=>5548, -28722=>5549, -28753=>5550, -28771=>5551, -28825=>5552, -28818=>5553, -28847=>5554, -28913=>5555, -28844=>5556, -28856=>5557, -28851=>5558, -28846=>5559, -28895=>5560, -28875=>5561, -28893=>5562, -28889=>5563, -28937=>5564, -28925=>5565, -28956=>5566, -28953=>5567, -29029=>5568, -29013=>5569, -29064=>5570, -29030=>5571, -29026=>5572, -29004=>5573, -29014=>5574, -29036=>5575, -29071=>5576, -29179=>5577, -29060=>5578, -29077=>5579, -29096=>5580, -29100=>5581, -29143=>5582, -29113=>5583, -29118=>5584, -29138=>5585, -29129=>5586, -29140=>5587, -29134=>5588, -29152=>5589, -29164=>5590, -29159=>5591, -29173=>5592, -29180=>5593, -29177=>5594, -29183=>5595, -29197=>5596, -29200=>5597, -29211=>5598, -29224=>5599, -29229=>5600, -29228=>5601, -29232=>5602, -29234=>5603, -12120=>5604, -29243=>5604, -29244=>5605, -12121=>5606, -29247=>5606, -29248=>5607, -29254=>5608, -29259=>5609, -29272=>5610, -29300=>5611, -29310=>5612, -29314=>5613, -29313=>5614, -29319=>5615, -29330=>5616, -29334=>5617, -29346=>5618, -29351=>5619, -29369=>5620, -29362=>5621, -29379=>5622, -29382=>5623, -29380=>5624, -29390=>5625, -29394=>5626, -29410=>5627, -29408=>5628, -29409=>5629, -29433=>5630, -29431=>5631, -20495=>5632, -29463=>5633, -29450=>5634, -29468=>5635, -29462=>5636, -29469=>5637, -29492=>5638, -29487=>5639, -29481=>5640, -29477=>5641, -29502=>5642, -29518=>5643, -29519=>5644, -40664=>5645, -29527=>5646, -29546=>5647, -29544=>5648, -29552=>5649, -29560=>5650, -29557=>5651, -29563=>5652, -29562=>5653, -29640=>5654, -29619=>5655, -29646=>5656, -29627=>5657, -29632=>5658, -29669=>5659, -29678=>5660, -29662=>5661, -29858=>5662, -29701=>5663, -29807=>5664, -29733=>5665, -29688=>5666, -29746=>5667, -29754=>5668, -29781=>5669, -29759=>5670, -29791=>5671, -29785=>5672, -29761=>5673, -29788=>5674, -29801=>5675, -29808=>5676, -29795=>5677, -29802=>5678, -29814=>5679, -29822=>5680, -29835=>5681, -29854=>5682, -29863=>5683, -29898=>5684, -29903=>5685, -29908=>5686, -29681=>5687, -29920=>5688, -29923=>5689, -29927=>5690, -29929=>5691, -29934=>5692, -29938=>5693, -29936=>5694, -29937=>5695, -29944=>5696, -29943=>5697, -29956=>5698, -29955=>5699, -29957=>5700, -29964=>5701, -29966=>5702, -29965=>5703, -29973=>5704, -29971=>5705, -29982=>5706, -29990=>5707, -29996=>5708, -30012=>5709, -30020=>5710, -30029=>5711, -30026=>5712, -30025=>5713, -30043=>5714, -30022=>5715, -30042=>5716, -30057=>5717, -30052=>5718, -30055=>5719, -30059=>5720, -30061=>5721, -30072=>5722, -30070=>5723, -30086=>5724, -30087=>5725, -30068=>5726, -30090=>5727, -30089=>5728, -30082=>5729, -30100=>5730, -30106=>5731, -30109=>5732, -30117=>5733, -30115=>5734, -30146=>5735, -30131=>5736, -30147=>5737, -30133=>5738, -30141=>5739, -30136=>5740, -30140=>5741, -30129=>5742, -30157=>5743, -30154=>5744, -30162=>5745, -30169=>5746, -30179=>5747, -30174=>5748, -30206=>5749, -30207=>5750, -30204=>5751, -30209=>5752, -30192=>5753, -30202=>5754, -30194=>5755, -30195=>5756, -30219=>5757, -30221=>5758, -30217=>5759, -30239=>5760, -30247=>5761, -30240=>5762, -30241=>5763, -30242=>5764, -30244=>5765, -30260=>5766, -30256=>5767, -30267=>5768, -30279=>5769, -30280=>5770, -30278=>5771, -30300=>5772, -30296=>5773, -30305=>5774, -30306=>5775, -30312=>5776, -30313=>5777, -30314=>5778, -30311=>5779, -30316=>5780, -30320=>5781, -30322=>5782, -12136=>5783, -30326=>5783, -30328=>5784, -30332=>5785, -30336=>5786, -30339=>5787, -30344=>5788, -30347=>5789, -30350=>5790, -30358=>5791, -30355=>5792, -30361=>5793, -30362=>5794, -30384=>5795, -30388=>5796, -30392=>5797, -30393=>5798, -30394=>5799, -30402=>5800, -30413=>5801, -30422=>5802, -30418=>5803, -30430=>5804, -30433=>5805, -30437=>5806, -30439=>5807, -30442=>5808, -34351=>5809, -30459=>5810, -30472=>5811, -30471=>5812, -30468=>5813, -30505=>5814, -30500=>5815, -30494=>5816, -30501=>5817, -30502=>5818, -30491=>5819, -30519=>5820, -30520=>5821, -30535=>5822, -30554=>5823, -30568=>5824, -30571=>5825, -30555=>5826, -30565=>5827, -30591=>5828, -30590=>5829, -30585=>5830, -30606=>5831, -30603=>5832, -30609=>5833, -30624=>5834, -30622=>5835, -30640=>5836, -30646=>5837, -30649=>5838, -30655=>5839, -30652=>5840, -30653=>5841, -30651=>5842, -30663=>5843, -30669=>5844, -30679=>5845, -30682=>5846, -30684=>5847, -30691=>5848, -30702=>5849, -30716=>5850, -30732=>5851, -30738=>5852, -31014=>5853, -30752=>5854, -31018=>5855, -30789=>5856, -30862=>5857, -30836=>5858, -30854=>5859, -30844=>5860, -30874=>5861, -30860=>5862, -30883=>5863, -30901=>5864, -30890=>5865, -30895=>5866, -30929=>5867, -30918=>5868, -30923=>5869, -30932=>5870, -30910=>5871, -30908=>5872, -30917=>5873, -30922=>5874, -30956=>5875, -30951=>5876, -30938=>5877, -30973=>5878, -30964=>5879, -30983=>5880, -30994=>5881, -30993=>5882, -31001=>5883, -31020=>5884, -31019=>5885, -31040=>5886, -31072=>5887, -31063=>5888, -31071=>5889, -31066=>5890, -31061=>5891, -31059=>5892, -31098=>5893, -31103=>5894, -31114=>5895, -31133=>5896, -31143=>5897, -40779=>5898, -31146=>5899, -31150=>5900, -31155=>5901, -31161=>5902, -31162=>5903, -31177=>5904, -31189=>5905, -31207=>5906, -31212=>5907, -31201=>5908, -31203=>5909, -31240=>5910, -31245=>5911, -31256=>5912, -31257=>5913, -31264=>5914, -31263=>5915, -31104=>5916, -31281=>5917, -31291=>5918, -31294=>5919, -31287=>5920, -31299=>5921, -31319=>5922, -31305=>5923, -31329=>5924, -31330=>5925, -31337=>5926, -40861=>5927, -31344=>5928, -31353=>5929, -31357=>5930, -31368=>5931, -31383=>5932, -31381=>5933, -31384=>5934, -31382=>5935, -31401=>5936, -31432=>5937, -31408=>5938, -31414=>5939, -31429=>5940, -31428=>5941, -31423=>5942, -36995=>5943, -31431=>5944, -31434=>5945, -31437=>5946, -31439=>5947, -31445=>5948, -31443=>5949, -31449=>5950, -31450=>5951, -31453=>5952, -31457=>5953, -31458=>5954, -31462=>5955, -31469=>5956, -31472=>5957, -31490=>5958, -31503=>5959, -31498=>5960, -31494=>5961, -31539=>5962, -31512=>5963, -31513=>5964, -31518=>5965, -31541=>5966, -31528=>5967, -31542=>5968, -31568=>5969, -31610=>5970, -31492=>5971, -31565=>5972, -31499=>5973, -31564=>5974, -31557=>5975, -31605=>5976, -31589=>5977, -31604=>5978, -31591=>5979, -31600=>5980, -31601=>5981, -31596=>5982, -31598=>5983, -31645=>5984, -31640=>5985, -31647=>5986, -31629=>5987, -31644=>5988, -31642=>5989, -31627=>5990, -31634=>5991, -31631=>5992, -31581=>5993, -31641=>5994, -31691=>5995, -31681=>5996, -31692=>5997, -31695=>5998, -31668=>5999, -31686=>6000, -31709=>6001, -31721=>6002, -31761=>6003, -31764=>6004, -31718=>6005, -31717=>6006, -31840=>6007, -31744=>6008, -31751=>6009, -31763=>6010, -31731=>6011, -31735=>6012, -31767=>6013, -31757=>6014, -31734=>6015, -31779=>6016, -31783=>6017, -31786=>6018, -31775=>6019, -31799=>6020, -31787=>6021, -31805=>6022, -31820=>6023, -31811=>6024, -31828=>6025, -31823=>6026, -31808=>6027, -31824=>6028, -31832=>6029, -31839=>6030, -31844=>6031, -31830=>6032, -31845=>6033, -31852=>6034, -31861=>6035, -31875=>6036, -31888=>6037, -31908=>6038, -31917=>6039, -31906=>6040, -31915=>6041, -31905=>6042, -31912=>6043, -31923=>6044, -31922=>6045, -31921=>6046, -31918=>6047, -31929=>6048, -31933=>6049, -31936=>6050, -31941=>6051, -31938=>6052, -31960=>6053, -31954=>6054, -31964=>6055, -31970=>6056, -39739=>6057, -31983=>6058, -31986=>6059, -31988=>6060, -31990=>6061, -31994=>6062, -32006=>6063, -32002=>6064, -32028=>6065, -32021=>6066, -32010=>6067, -32069=>6068, -32075=>6069, -32046=>6070, -32050=>6071, -32063=>6072, -32053=>6073, -32070=>6074, -32115=>6075, -32086=>6076, -32078=>6077, -32114=>6078, -32104=>6079, -32110=>6080, -32079=>6081, -32099=>6082, -32147=>6083, -32137=>6084, -32091=>6085, -32143=>6086, -32125=>6087, -32155=>6088, -32186=>6089, -32174=>6090, -32163=>6091, -32181=>6092, -32199=>6093, -32189=>6094, -32171=>6095, -32317=>6096, -32162=>6097, -32175=>6098, -32220=>6099, -32184=>6100, -32159=>6101, -32176=>6102, -32216=>6103, -32221=>6104, -32228=>6105, -32222=>6106, -32251=>6107, -32242=>6108, -32225=>6109, -32261=>6110, -32266=>6111, -32291=>6112, -32289=>6113, -32274=>6114, -32305=>6115, -32287=>6116, -32265=>6117, -32267=>6118, -32290=>6119, -32326=>6120, -32358=>6121, -32315=>6122, -32309=>6123, -32313=>6124, -32323=>6125, -32311=>6126, -32306=>6127, -32314=>6128, -32359=>6129, -32349=>6130, -32342=>6131, -32350=>6132, -32345=>6133, -32346=>6134, -32377=>6135, -32362=>6136, -32361=>6137, -32380=>6138, -32379=>6139, -32387=>6140, -32213=>6141, -32381=>6142, -36782=>6143, -32383=>6144, -32392=>6145, -32393=>6146, -32396=>6147, -32402=>6148, -32400=>6149, -32403=>6150, -32404=>6151, -32406=>6152, -32398=>6153, -32411=>6154, -32412=>6155, -32568=>6156, -32570=>6157, -32581=>6158, -32588=>6159, -32589=>6160, -32590=>6161, -32592=>6162, -12153=>6163, -32593=>6163, -32597=>6164, -32596=>6165, -32600=>6166, -32607=>6167, -32608=>6168, -32616=>6169, -32617=>6170, -32615=>6171, -32632=>6172, -32642=>6173, -32646=>6174, -32643=>6175, -32648=>6176, -32647=>6177, -32652=>6178, -32660=>6179, -32670=>6180, -32669=>6181, -32666=>6182, -32675=>6183, -32687=>6184, -32690=>6185, -32697=>6186, -32686=>6187, -32694=>6188, -32696=>6189, -35697=>6190, -32709=>6191, -32710=>6192, -32714=>6193, -32725=>6194, -32724=>6195, -32737=>6196, -32742=>6197, -32745=>6198, -32755=>6199, -32761=>6200, -39132=>6201, -32774=>6202, -32772=>6203, -32779=>6204, -12158=>6205, -32786=>6205, -32792=>6206, -32793=>6207, -32796=>6208, -32801=>6209, -32808=>6210, -32831=>6211, -32827=>6212, -32842=>6213, -32838=>6214, -32850=>6215, -32856=>6216, -32858=>6217, -32863=>6218, -32866=>6219, -32872=>6220, -32883=>6221, -32882=>6222, -32880=>6223, -32886=>6224, -32889=>6225, -32893=>6226, -12160=>6227, -32895=>6227, -32900=>6228, -32902=>6229, -32901=>6230, -32923=>6231, -32915=>6232, -32922=>6233, -32941=>6234, -20880=>6235, -32940=>6236, -32987=>6237, -32997=>6238, -32985=>6239, -32989=>6240, -32964=>6241, -32986=>6242, -32982=>6243, -33033=>6244, -33007=>6245, -33009=>6246, -33051=>6247, -33065=>6248, -33059=>6249, -33071=>6250, -33099=>6251, -38539=>6252, -33094=>6253, -33086=>6254, -33107=>6255, -33105=>6256, -33020=>6257, -33137=>6258, -33134=>6259, -33125=>6260, -33126=>6261, -33140=>6262, -33155=>6263, -33160=>6264, -33162=>6265, -33152=>6266, -33154=>6267, -33184=>6268, -33173=>6269, -33188=>6270, -33187=>6271, -33119=>6272, -33171=>6273, -33193=>6274, -33200=>6275, -33205=>6276, -33214=>6277, -33208=>6278, -33213=>6279, -33216=>6280, -33218=>6281, -33210=>6282, -33225=>6283, -33229=>6284, -33233=>6285, -33241=>6286, -33240=>6287, -33224=>6288, -33242=>6289, -33247=>6290, -33248=>6291, -33255=>6292, -33274=>6293, -33275=>6294, -33278=>6295, -33281=>6296, -33282=>6297, -33285=>6298, -33287=>6299, -33290=>6300, -33293=>6301, -33296=>6302, -33302=>6303, -33321=>6304, -33323=>6305, -33336=>6306, -33331=>6307, -33344=>6308, -33369=>6309, -33368=>6310, -33373=>6311, -33370=>6312, -33375=>6313, -33380=>6314, -33378=>6315, -33384=>6316, -33386=>6317, -33387=>6318, -33326=>6319, -33393=>6320, -33399=>6321, -12171=>6322, -33400=>6322, -33406=>6323, -33421=>6324, -33426=>6325, -33451=>6326, -33439=>6327, -33467=>6328, -33452=>6329, -33505=>6330, -33507=>6331, -33503=>6332, -33490=>6333, -33524=>6334, -33523=>6335, -33530=>6336, -33683=>6337, -33539=>6338, -33531=>6339, -33529=>6340, -33502=>6341, -33542=>6342, -33500=>6343, -33545=>6344, -33497=>6345, -33589=>6346, -33588=>6347, -33558=>6348, -33586=>6349, -33585=>6350, -33600=>6351, -33593=>6352, -33616=>6353, -33605=>6354, -33583=>6355, -33579=>6356, -33559=>6357, -33560=>6358, -33669=>6359, -33690=>6360, -33706=>6361, -33695=>6362, -33698=>6363, -33686=>6364, -33571=>6365, -33678=>6366, -33671=>6367, -33674=>6368, -33660=>6369, -33717=>6370, -33651=>6371, -33653=>6372, -33696=>6373, -33673=>6374, -33704=>6375, -33780=>6376, -33811=>6377, -33771=>6378, -33742=>6379, -33789=>6380, -33795=>6381, -33752=>6382, -33803=>6383, -33729=>6384, -33783=>6385, -33799=>6386, -33760=>6387, -33778=>6388, -33805=>6389, -33826=>6390, -33824=>6391, -33725=>6392, -33848=>6393, -34054=>6394, -33787=>6395, -33901=>6396, -33834=>6397, -33852=>6398, -34138=>6399, -33924=>6400, -33911=>6401, -33899=>6402, -33965=>6403, -33902=>6404, -33922=>6405, -33897=>6406, -33862=>6407, -33836=>6408, -33903=>6409, -33913=>6410, -33845=>6411, -33994=>6412, -33890=>6413, -33977=>6414, -33983=>6415, -33951=>6416, -34009=>6417, -33997=>6418, -33979=>6419, -34010=>6420, -34000=>6421, -33985=>6422, -33990=>6423, -34006=>6424, -33953=>6425, -34081=>6426, -34047=>6427, -34036=>6428, -34071=>6429, -34072=>6430, -34092=>6431, -34079=>6432, -34069=>6433, -34068=>6434, -34044=>6435, -34112=>6436, -34147=>6437, -34136=>6438, -34120=>6439, -34113=>6440, -34306=>6441, -34123=>6442, -34133=>6443, -34176=>6444, -34212=>6445, -34184=>6446, -34193=>6447, -34186=>6448, -34216=>6449, -34157=>6450, -34196=>6451, -34203=>6452, -34282=>6453, -34183=>6454, -34204=>6455, -34167=>6456, -34174=>6457, -34192=>6458, -34249=>6459, -34234=>6460, -34255=>6461, -34233=>6462, -34256=>6463, -34261=>6464, -34269=>6465, -34277=>6466, -34268=>6467, -34297=>6468, -34314=>6469, -34323=>6470, -34315=>6471, -34302=>6472, -34298=>6473, -34310=>6474, -34338=>6475, -34330=>6476, -34352=>6477, -34367=>6478, -12172=>6479, -34381=>6479, -20053=>6480, -34388=>6481, -34399=>6482, -34407=>6483, -34417=>6484, -34451=>6485, -34467=>6486, -34473=>6487, -34474=>6488, -34443=>6489, -34444=>6490, -34486=>6491, -34479=>6492, -34500=>6493, -34502=>6494, -34480=>6495, -34505=>6496, -34851=>6497, -34475=>6498, -34516=>6499, -34526=>6500, -34537=>6501, -34540=>6502, -34527=>6503, -34523=>6504, -34543=>6505, -34578=>6506, -34566=>6507, -34568=>6508, -34560=>6509, -34563=>6510, -34555=>6511, -34577=>6512, -34569=>6513, -34573=>6514, -34553=>6515, -34570=>6516, -34612=>6517, -34623=>6518, -34615=>6519, -34619=>6520, -34597=>6521, -34601=>6522, -34586=>6523, -34656=>6524, -34655=>6525, -34680=>6526, -34636=>6527, -34638=>6528, -34676=>6529, -34647=>6530, -34664=>6531, -34670=>6532, -34649=>6533, -34643=>6534, -34659=>6535, -34666=>6536, -34821=>6537, -34722=>6538, -34719=>6539, -34690=>6540, -34735=>6541, -34763=>6542, -34749=>6543, -34752=>6544, -34768=>6545, -38614=>6546, -34731=>6547, -34756=>6548, -34739=>6549, -34759=>6550, -34758=>6551, -34747=>6552, -34799=>6553, -34802=>6554, -34784=>6555, -34831=>6556, -34829=>6557, -34814=>6558, -34806=>6559, -34807=>6560, -34830=>6561, -34770=>6562, -34833=>6563, -34838=>6564, -34837=>6565, -34850=>6566, -34849=>6567, -34865=>6568, -34870=>6569, -34873=>6570, -34855=>6571, -34875=>6572, -34884=>6573, -34882=>6574, -34898=>6575, -34905=>6576, -34910=>6577, -34914=>6578, -34923=>6579, -34945=>6580, -34942=>6581, -34974=>6582, -34933=>6583, -34941=>6584, -34997=>6585, -34930=>6586, -34946=>6587, -34967=>6588, -34962=>6589, -34990=>6590, -34969=>6591, -34978=>6592, -34957=>6593, -34980=>6594, -34992=>6595, -35007=>6596, -34993=>6597, -35011=>6598, -35012=>6599, -35028=>6600, -35032=>6601, -35033=>6602, -35037=>6603, -35065=>6604, -35074=>6605, -35068=>6606, -35060=>6607, -35048=>6608, -35058=>6609, -35076=>6610, -35084=>6611, -35082=>6612, -35091=>6613, -35139=>6614, -35102=>6615, -35109=>6616, -35114=>6617, -35115=>6618, -35137=>6619, -35140=>6620, -35131=>6621, -35126=>6622, -35128=>6623, -35148=>6624, -35101=>6625, -35168=>6626, -35166=>6627, -35174=>6628, -35172=>6629, -35181=>6630, -35178=>6631, -35183=>6632, -35188=>6633, -35191=>6634, -12177=>6635, -35198=>6635, -35203=>6636, -35208=>6637, -35210=>6638, -35219=>6639, -35224=>6640, -35233=>6641, -35241=>6642, -35238=>6643, -35244=>6644, -35247=>6645, -35250=>6646, -35258=>6647, -35261=>6648, -35263=>6649, -35264=>6650, -35290=>6651, -35292=>6652, -35293=>6653, -35303=>6654, -35316=>6655, -35320=>6656, -35331=>6657, -35350=>6658, -35344=>6659, -35340=>6660, -35355=>6661, -35357=>6662, -35365=>6663, -35382=>6664, -35393=>6665, -35419=>6666, -35410=>6667, -35398=>6668, -35400=>6669, -35452=>6670, -35437=>6671, -35436=>6672, -35426=>6673, -35461=>6674, -35458=>6675, -35460=>6676, -35496=>6677, -35489=>6678, -35473=>6679, -35493=>6680, -35494=>6681, -35482=>6682, -35491=>6683, -35524=>6684, -35533=>6685, -35522=>6686, -35546=>6687, -35563=>6688, -35571=>6689, -35559=>6690, -35556=>6691, -35569=>6692, -35604=>6693, -35552=>6694, -35554=>6695, -35575=>6696, -35550=>6697, -35547=>6698, -35596=>6699, -35591=>6700, -35610=>6701, -35553=>6702, -35606=>6703, -35600=>6704, -35607=>6705, -35616=>6706, -35635=>6707, -38827=>6708, -35622=>6709, -35627=>6710, -35646=>6711, -35624=>6712, -35649=>6713, -35660=>6714, -35663=>6715, -35662=>6716, -35657=>6717, -35670=>6718, -35675=>6719, -35674=>6720, -35691=>6721, -35679=>6722, -35692=>6723, -35695=>6724, -35700=>6725, -35709=>6726, -35712=>6727, -35724=>6728, -35726=>6729, -35730=>6730, -35731=>6731, -35734=>6732, -35737=>6733, -35738=>6734, -35898=>6735, -35905=>6736, -35903=>6737, -35912=>6738, -35916=>6739, -35918=>6740, -35920=>6741, -12183=>6742, -35925=>6742, -35938=>6743, -35948=>6744, -12184=>6745, -35960=>6745, -35962=>6746, -35970=>6747, -35977=>6748, -35973=>6749, -35978=>6750, -35981=>6751, -35982=>6752, -35988=>6753, -35964=>6754, -35992=>6755, -25117=>6756, -36013=>6757, -36010=>6758, -36029=>6759, -36018=>6760, -36019=>6761, -36014=>6762, -36022=>6763, -36040=>6764, -36033=>6765, -36068=>6766, -36067=>6767, -36058=>6768, -36093=>6769, -36090=>6770, -36091=>6771, -36100=>6772, -36101=>6773, -36106=>6774, -36103=>6775, -36111=>6776, -36109=>6777, -36112=>6778, -40782=>6779, -36115=>6780, -36045=>6781, -36116=>6782, -36118=>6783, -36199=>6784, -36205=>6785, -36209=>6786, -36211=>6787, -36225=>6788, -36249=>6789, -36290=>6790, -36286=>6791, -36282=>6792, -36303=>6793, -36314=>6794, -36310=>6795, -36300=>6796, -36315=>6797, -36299=>6798, -36330=>6799, -36331=>6800, -36319=>6801, -36323=>6802, -36348=>6803, -36360=>6804, -36361=>6805, -36351=>6806, -36381=>6807, -36382=>6808, -36368=>6809, -36383=>6810, -36418=>6811, -36405=>6812, -36400=>6813, -36404=>6814, -36426=>6815, -36423=>6816, -36425=>6817, -36428=>6818, -36432=>6819, -36424=>6820, -36441=>6821, -36452=>6822, -36448=>6823, -36394=>6824, -36451=>6825, -36437=>6826, -36470=>6827, -36466=>6828, -36476=>6829, -36481=>6830, -36487=>6831, -36485=>6832, -36484=>6833, -36491=>6834, -36490=>6835, -36499=>6836, -36497=>6837, -36500=>6838, -36505=>6839, -36522=>6840, -36513=>6841, -36524=>6842, -36528=>6843, -36550=>6844, -36529=>6845, -36542=>6846, -36549=>6847, -36552=>6848, -36555=>6849, -36571=>6850, -36579=>6851, -36604=>6852, -36603=>6853, -36587=>6854, -36606=>6855, -36618=>6856, -36613=>6857, -36629=>6858, -36626=>6859, -36633=>6860, -36627=>6861, -36636=>6862, -36639=>6863, -36635=>6864, -36620=>6865, -36646=>6866, -36659=>6867, -36667=>6868, -36665=>6869, -36677=>6870, -36674=>6871, -36670=>6872, -36684=>6873, -36681=>6874, -36678=>6875, -36686=>6876, -36695=>6877, -36700=>6878, -36706=>6879, -36707=>6880, -36708=>6881, -36764=>6882, -36767=>6883, -36771=>6884, -36781=>6885, -36783=>6886, -36791=>6887, -36826=>6888, -36837=>6889, -36834=>6890, -36842=>6891, -36847=>6892, -36999=>6893, -36852=>6894, -36869=>6895, -36857=>6896, -36858=>6897, -36881=>6898, -36885=>6899, -36897=>6900, -36877=>6901, -36894=>6902, -36886=>6903, -36875=>6904, -36903=>6905, -36918=>6906, -36917=>6907, -36921=>6908, -36856=>6909, -36943=>6910, -36944=>6911, -36945=>6912, -36946=>6913, -36878=>6914, -36937=>6915, -36926=>6916, -36950=>6917, -36952=>6918, -36958=>6919, -36968=>6920, -36975=>6921, -36982=>6922, -38568=>6923, -36978=>6924, -36994=>6925, -36989=>6926, -36993=>6927, -36992=>6928, -37002=>6929, -37001=>6930, -37007=>6931, -37032=>6932, -37039=>6933, -37041=>6934, -37045=>6935, -37090=>6936, -37092=>6937, -25160=>6938, -37083=>6939, -37122=>6940, -37138=>6941, -37145=>6942, -37170=>6943, -37168=>6944, -37194=>6945, -37206=>6946, -37208=>6947, -37219=>6948, -37221=>6949, -37225=>6950, -37235=>6951, -37234=>6952, -37259=>6953, -37257=>6954, -37250=>6955, -37282=>6956, -37291=>6957, -37295=>6958, -37290=>6959, -37301=>6960, -37300=>6961, -37306=>6962, -37312=>6963, -37313=>6964, -37321=>6965, -37323=>6966, -37328=>6967, -37334=>6968, -37343=>6969, -37345=>6970, -37339=>6971, -37372=>6972, -37365=>6973, -37366=>6974, -37406=>6975, -37375=>6976, -37396=>6977, -37420=>6978, -37397=>6979, -37393=>6980, -37470=>6981, -37463=>6982, -37445=>6983, -37449=>6984, -37476=>6985, -37448=>6986, -37525=>6987, -37439=>6988, -37451=>6989, -37456=>6990, -37532=>6991, -37526=>6992, -37523=>6993, -37531=>6994, -37466=>6995, -37583=>6996, -37561=>6997, -37559=>6998, -37609=>6999, -37647=>7000, -37626=>7001, -37700=>7002, -37678=>7003, -37657=>7004, -37666=>7005, -37658=>7006, -37667=>7007, -37690=>7008, -37685=>7009, -37691=>7010, -37724=>7011, -37728=>7012, -37756=>7013, -37742=>7014, -37718=>7015, -37808=>7016, -37804=>7017, -37805=>7018, -37780=>7019, -37817=>7020, -37846=>7021, -37847=>7022, -37864=>7023, -37861=>7024, -37848=>7025, -37827=>7026, -37853=>7027, -37840=>7028, -37832=>7029, -37860=>7030, -37914=>7031, -37908=>7032, -37907=>7033, -37891=>7034, -37895=>7035, -37904=>7036, -37942=>7037, -37931=>7038, -37941=>7039, -37921=>7040, -37946=>7041, -37953=>7042, -37970=>7043, -37956=>7044, -37979=>7045, -37984=>7046, -37986=>7047, -37982=>7048, -37994=>7049, -37417=>7050, -38000=>7051, -38005=>7052, -38007=>7053, -38013=>7054, -37978=>7055, -38012=>7056, -38014=>7057, -38017=>7058, -38015=>7059, -38274=>7060, -38279=>7061, -38282=>7062, -38292=>7063, -38294=>7064, -38296=>7065, -38297=>7066, -38304=>7067, -38312=>7068, -38311=>7069, -38317=>7070, -38332=>7071, -38331=>7072, -38329=>7073, -38334=>7074, -38346=>7075, -28662=>7076, -38339=>7077, -38349=>7078, -38348=>7079, -38357=>7080, -38356=>7081, -38358=>7082, -38364=>7083, -38369=>7084, -38373=>7085, -38370=>7086, -38433=>7087, -38440=>7088, -38446=>7089, -38447=>7090, -38466=>7091, -38476=>7092, -38479=>7093, -38475=>7094, -38519=>7095, -38492=>7096, -38494=>7097, -38493=>7098, -38495=>7099, -38502=>7100, -38514=>7101, -38508=>7102, -38541=>7103, -38552=>7104, -38549=>7105, -38551=>7106, -38570=>7107, -38567=>7108, -38577=>7109, -38578=>7110, -38576=>7111, -38580=>7112, -12202=>7113, -38582=>7113, -38584=>7114, -12203=>7115, -38585=>7115, -38606=>7116, -38603=>7117, -38601=>7118, -38605=>7119, -35149=>7120, -38620=>7121, -38669=>7122, -38613=>7123, -38649=>7124, -38660=>7125, -38662=>7126, -38664=>7127, -38675=>7128, -38670=>7129, -38673=>7130, -38671=>7131, -38678=>7132, -38681=>7133, -38692=>7134, -38698=>7135, -38704=>7136, -38713=>7137, -38717=>7138, -38718=>7139, -38724=>7140, -38726=>7141, -38728=>7142, -38722=>7143, -38729=>7144, -38748=>7145, -38752=>7146, -38756=>7147, -38758=>7148, -38760=>7149, -21202=>7150, -38763=>7151, -38769=>7152, -38777=>7153, -38789=>7154, -38780=>7155, -38785=>7156, -38778=>7157, -38790=>7158, -38795=>7159, -38799=>7160, -38800=>7161, -38812=>7162, -38824=>7163, -38822=>7164, -38819=>7165, -38835=>7166, -38836=>7167, -38851=>7168, -38854=>7169, -38856=>7170, -12209=>7171, -38859=>7171, -38876=>7172, -12210=>7173, -38893=>7173, -40783=>7174, -38898=>7175, -31455=>7176, -38902=>7177, -38901=>7178, -38927=>7179, -38924=>7180, -38968=>7181, -38948=>7182, -38945=>7183, -38967=>7184, -38973=>7185, -38982=>7186, -38991=>7187, -38987=>7188, -39019=>7189, -39023=>7190, -39024=>7191, -39025=>7192, -39028=>7193, -39027=>7194, -39082=>7195, -39087=>7196, -39089=>7197, -39094=>7198, -39108=>7199, -39107=>7200, -39110=>7201, -39145=>7202, -39147=>7203, -39171=>7204, -39177=>7205, -39186=>7206, -39188=>7207, -39192=>7208, -39201=>7209, -39197=>7210, -39198=>7211, -39204=>7212, -39200=>7213, -39212=>7214, -39214=>7215, -39229=>7216, -39230=>7217, -39234=>7218, -39241=>7219, -39237=>7220, -39248=>7221, -39243=>7222, -39249=>7223, -39250=>7224, -39244=>7225, -39253=>7226, -39319=>7227, -39320=>7228, -39333=>7229, -39341=>7230, -39342=>7231, -39356=>7232, -39391=>7233, -39387=>7234, -39389=>7235, -39384=>7236, -39377=>7237, -39405=>7238, -39406=>7239, -39409=>7240, -39410=>7241, -39419=>7242, -39416=>7243, -39425=>7244, -39439=>7245, -39429=>7246, -39394=>7247, -39449=>7248, -39467=>7249, -39479=>7250, -39493=>7251, -39490=>7252, -39488=>7253, -39491=>7254, -39486=>7255, -39509=>7256, -39501=>7257, -39515=>7258, -39511=>7259, -39519=>7260, -39522=>7261, -39525=>7262, -39524=>7263, -39529=>7264, -39531=>7265, -39530=>7266, -39597=>7267, -39600=>7268, -39612=>7269, -39616=>7270, -39631=>7271, -39633=>7272, -39635=>7273, -39636=>7274, -39646=>7275, -12221=>7276, -39647=>7276, -39650=>7277, -39651=>7278, -39654=>7279, -39663=>7280, -39659=>7281, -39662=>7282, -39668=>7283, -39665=>7284, -39671=>7285, -39675=>7286, -39686=>7287, -39704=>7288, -39706=>7289, -39711=>7290, -39714=>7291, -39715=>7292, -12222=>7293, -39717=>7293, -39719=>7294, -39720=>7295, -39721=>7296, -39722=>7297, -39726=>7298, -12223=>7299, -39727=>7299, -39730=>7300, -12224=>7300, -39748=>7301, -39747=>7302, -39759=>7303, -39757=>7304, -39758=>7305, -39761=>7306, -39768=>7307, -39796=>7308, -39827=>7309, -39811=>7310, -39825=>7311, -39830=>7312, -39831=>7313, -39839=>7314, -39840=>7315, -39848=>7316, -39860=>7317, -39872=>7318, -39882=>7319, -39865=>7320, -39878=>7321, -39887=>7322, -39889=>7323, -39890=>7324, -39907=>7325, -39906=>7326, -39908=>7327, -39892=>7328, -39905=>7329, -39994=>7330, -39922=>7331, -39921=>7332, -39920=>7333, -39957=>7334, -39956=>7335, -39945=>7336, -39955=>7337, -39948=>7338, -39942=>7339, -39944=>7340, -39954=>7341, -39946=>7342, -39940=>7343, -39982=>7344, -39963=>7345, -39973=>7346, -39972=>7347, -39969=>7348, -39984=>7349, -40007=>7350, -39986=>7351, -40006=>7352, -39998=>7353, -40026=>7354, -40032=>7355, -40039=>7356, -40054=>7357, -40056=>7358, -40167=>7359, -40172=>7360, -40176=>7361, -40201=>7362, -40200=>7363, -40171=>7364, -40195=>7365, -40198=>7366, -40234=>7367, -40230=>7368, -40367=>7369, -40227=>7370, -40223=>7371, -40260=>7372, -40213=>7373, -40210=>7374, -40257=>7375, -40255=>7376, -40254=>7377, -40262=>7378, -40264=>7379, -40285=>7380, -40286=>7381, -40292=>7382, -40273=>7383, -40272=>7384, -40281=>7385, -40306=>7386, -40329=>7387, -40327=>7388, -40363=>7389, -40303=>7390, -40314=>7391, -40346=>7392, -40356=>7393, -40361=>7394, -40370=>7395, -40388=>7396, -40385=>7397, -40379=>7398, -40376=>7399, -40378=>7400, -40390=>7401, -40399=>7402, -40386=>7403, -40409=>7404, -40403=>7405, -40440=>7406, -40422=>7407, -40429=>7408, -40431=>7409, -40445=>7410, -40474=>7411, -40475=>7412, -40478=>7413, -12228=>7414, -40565=>7414, -40569=>7415, -40573=>7416, -40577=>7417, -40584=>7418, -40587=>7419, -40588=>7420, -40594=>7421, -40597=>7422, -40593=>7423, -40605=>7424, -12230=>7425, -40613=>7425, -40617=>7426, -40632=>7427, -40618=>7428, -40621=>7429, -38753=>7430, -40652=>7431, -40654=>7432, -40655=>7433, -40656=>7434, -40660=>7435, -40668=>7436, -40670=>7437, -40669=>7438, -40672=>7439, -40677=>7440, -40680=>7441, -40687=>7442, -40692=>7443, -40694=>7444, -40695=>7445, -12235=>7446, -40697=>7446, -40699=>7447, -40700=>7448, -12236=>7449, -40701=>7449, -40711=>7450, -40712=>7451, -30391=>7452, -40725=>7453, -40737=>7454, -40748=>7455, -40766=>7456, -40778=>7457, -12241=>7457, -40786=>7458, -12242=>7458, -40788=>7459, -40803=>7460, -40799=>7461, -40800=>7462, -40801=>7463, -40806=>7464, -40807=>7465, -40812=>7466, -40810=>7467, -40823=>7468, -40818=>7469, -40822=>7470, -40853=>7471, -40860=>7472, -12244=>7472, -40864=>7473, -12245=>7473, -22575=>7474, -27079=>7475, -36953=>7476, -29796=>7477, -9472=>7479, -9473=>7480, -9474=>7481, -9475=>7482, -9476=>7483, -9477=>7484, -9478=>7485, -9479=>7486, -9480=>7487, -9481=>7488, -9482=>7489, -9483=>7490, -9484=>7491, -9485=>7492, -9486=>7493, -9487=>7494, -9488=>7495, -9489=>7496, -9490=>7497, -9491=>7498, -9492=>7499, -9493=>7500, -9494=>7501, -9495=>7502, -9496=>7503, -9497=>7504, -9498=>7505, -9499=>7506, -9500=>7507, -9501=>7508, -9502=>7509, -9503=>7510, -9504=>7511, -9505=>7512, -9506=>7513, -9507=>7514, -9508=>7515, -9509=>7516, -9510=>7517, -9511=>7518, -9512=>7519, -9513=>7520, -9514=>7521, -9515=>7522, -9516=>7523, -9517=>7524, -9518=>7525, -9519=>7526, -9520=>7527, -9521=>7528, -9522=>7529, -9523=>7530, -9524=>7531, -9525=>7532, -9526=>7533, -9527=>7534, -9528=>7535, -9529=>7536, -9530=>7537, -9531=>7538, -9532=>7539, -9533=>7540, -9534=>7541, -9535=>7542, -9536=>7543, -9537=>7544, -9538=>7545, -9539=>7546, -9540=>7547, -9541=>7548, -9542=>7549, -9543=>7550, -9544=>7551, -9545=>7552, -9546=>7553, -9547=>7554, -9312=>7555, -9313=>7556, -9314=>7557, -9315=>7558, -9316=>7559, -9317=>7560, -9318=>7561, -9319=>7562, -9320=>7563, -9321=>7564, -9322=>7565, -9323=>7566, -9324=>7567, -9325=>7568, -9326=>7569, -9327=>7570, -9328=>7571, -9329=>7572, -9330=>7573, -9331=>7574, -8544=>7575, -8545=>7576, -8546=>7577, -8547=>7578, -8548=>7579, -8549=>7580, -8550=>7581, -8551=>7582, -8552=>7583, -8553=>7584, -13129=>7585, -13076=>7586, -13133=>7588, -13095=>7590, -13110=>7592, -13137=>7593, -13069=>7595, -13094=>7596, -13099=>7598, -13130=>7599, -13212=>7601, -13213=>7602, -13214=>7603, -13198=>7604, -13199=>7605, -13252=>7606, -13217=>7607, -12317=>7608, -12319=>7609, -8470=>7610, -13261=>7611, -12964=>7613, -12965=>7614, -12966=>7615, -12967=>7616, -12968=>7617, -12849=>7618, -12850=>7619, -12857=>7620, -13182=>7621, -13181=>7622, -13180=>7623, -8750=>7624, -8721=>7625, -8735=>7629, -8895=>7630, -21854=>7633, -167133=>7641, -28976=>7644, -40407=>7646, -64054=>7651, -22169=>7654, -15694=>7655, -20448=>7660, -36544=>7663, -194797=>7665, -153716=>7670, -32363=>7671, -33606=>7672, -167670=>7673, -40572=>7677, -26171=>7680, -40628=>7682, -26629=>7687, -23650=>7693, -194780=>7695, -32353=>7697, -64070=>7700, -34083=>7706, -37292=>7707, -34796=>7715, -25620=>7724, -39506=>7727, -64074=>7732, -194692=>7734, -31774=>7739, -64016=>7746, -25681=>7747, -63980=>7750, -22625=>7751, -39002=>7752, -194679=>7754, -31153=>7758, -28678=>7760, -22218=>7770, -21085=>7774, -28497=>7776, -37297=>7777, -64106=>7788, -38960=>7795, -40629=>7797, -33802=>7807, -63939=>7808, -63890=>7809, -63891=>7810, -63897=>7811, -34847=>7813, -194575=>7814, -194771=>7816, -194584=>7817, -137754=>7825, -23643=>7826, -25890=>7831, -26618=>7834, -26766=>7836, -148432=>7838, -194848=>7839, -34110=>7861, -30562=>7877, -65041=>7887, -65042=>7888, -65075=>7890, -65073=>7892, -65074=>7893, -8285=>7897, -65049=>7897, -8282=>7898, -65072=>7898, -65077=>7899, -65078=>7900, -65081=>7901, -65082=>7902, -65095=>7903, -65096=>7904, -65079=>7905, -65080=>7906, -65087=>7907, -65088=>7908, -65085=>7909, -65086=>7910, -65089=>7911, -65090=>7912, -65091=>7913, -65092=>7914, -65083=>7915, -65084=>7916, -12436=>7958, -12437=>7959, -12438=>7960, -22099=>7963, -65508=>8005, -65287=>8006, -65282=>8007, -9665=>8009, -9655=>8010, -8681=>8011, -8679=>8012, -8678=>8013, -8680=>8014, -9634=>8015, -9831=>8016, -9825=>8017, -9828=>8018, -9826=>8019, -13216=>8020, -13218=>8021, -13220=>8022, -13221=>8023, -13207=>8024, -8467=>8025, -13208=>8026, -13235=>8027, -13234=>8028, -13233=>8029, -13232=>8030, -13189=>8031, -13190=>8032, -13191=>8033, -13259=>8034, -13200=>8035, -13268=>8036, -13206=>8037, -13090=>8038, -13078=>8039, -13080=>8040, -13077=>8041, -13059=>8042, -13091=>8043, -13143=>8044, -13122=>8045, -13113=>8046, -13115=>8047, -13056=>8048, -13105=>8049, -13127=>8050, -13086=>8051, -13098=>8052, -13183=>8054, -8481=>8055, -9742=>8056, -12342=>8057, -12320=>8058, -9352=>8062, -9353=>8063, -9354=>8064, -9355=>8065, -9356=>8066, -9357=>8067, -9358=>8068, -9359=>8069, -9360=>8070, -9332=>8071, -9333=>8072, -9334=>8073, -9335=>8074, -9336=>8075, -9337=>8076, -9338=>8077, -9339=>8078, -9340=>8079, -9341=>8080, -9342=>8081, -9343=>8082, -9344=>8083, -9345=>8084, -9346=>8085, -9347=>8086, -9348=>8087, -9349=>8088, -9350=>8089, -9351=>8090, -12881=>8091, -8560=>8092, -8561=>8093, -8562=>8094, -8563=>8095, -8564=>8096, -8565=>8097, -8566=>8098, -8567=>8099, -8568=>8100, -8569=>8101, -12882=>8102, -12883=>8103, -12884=>8104, -12885=>8105, -12886=>8106, -12887=>8107, -12888=>8108, -12889=>8109, -12890=>8110, -12891=>8111, -9372=>8112, -9373=>8113, -9374=>8114, -9375=>8115, -9376=>8116, -9377=>8117, -9378=>8118, -9379=>8119, -9380=>8120, -9381=>8121, -9382=>8122, -9383=>8123, -9384=>8124, -9385=>8125, -9386=>8126, -9387=>8127, -9388=>8128, -9389=>8129, -9390=>8130, -9391=>8131, -9392=>8132, -9393=>8133, -9394=>8134, -9395=>8135, -9396=>8136, -9397=>8137, -12867=>8138, -12861=>8139, -12863=>8140, -12852=>8141, -12856=>8142, -12851=>8143, -12860=>8144, -12866=>8145, -12862=>8146, -12854=>8147, -12853=>8148, -12859=>8149, -12864=>8150, -12858=>8151, -12976=>8152, -12973=>8153, -12969=>8154, -12975=>8155, -12948=>8156, -12970=>8157, -12952=>8158, -12971=>8159, -12946=>8160, -12945=>8161, -12947=>8162, -12972=>8163, -12974=>8164, -12950=>8165, -9131=>8174, -9132=>8175, -9133=>8176, -9127=>8178, -9128=>8179, -9129=>8180, -13260=>8182, -13061=>8183, -13215=>8186, -13219=>8187, -13222=>8188, -12958=>8191, -13192=>8192, -13193=>8193, -13256=>8194, -8749=>8195, -12848=>8197, -12842=>8198, -12843=>8199, -12844=>8200, -12845=>8201, -12846=>8202, -12847=>8203, -12855=>8204, -12865=>8205, -10145=>8206, -11013=>8207, -11014=>8208, -11015=>8209, -9673=>8210, -9824=>8211, -9829=>8212, -9827=>8213, -9830=>8214, -9728=>8215, -9729=>8216, -9730=>8217, -9731=>8218, -9758=>8219, -9756=>8220, -9757=>8221, -9759=>8222, -12953=>8223, -9450=>8224, -8554=>8225, -8555=>8226, -9601=>8230, -9602=>8231, -9603=>8232, -9604=>8233, -9605=>8234, -9606=>8235, -9607=>8236, -9608=>8237, -9615=>8238, -9614=>8239, -9613=>8240, -9612=>8241, -9611=>8242, -9610=>8243, -9609=>8244, -9620=>8245, -9621=>8246, -9581=>8247, -9582=>8248, -9584=>8249, -9583=>8250, -9552=>8251, -9566=>8252, -9578=>8253, -9569=>8254, -9698=>8255, -9699=>8256, -9701=>8257, -9700=>8258, -9585=>8261, -9586=>8262, -9587=>8263, -65040=>8268, -20956=>8284, -29081=>8285, -10102=>8286, -10103=>8287, -10104=>8288, -10105=>8289, -10106=>8290, -10107=>8291, -10108=>8292, -10109=>8293, -10110=>8294, -8570=>8298, -8571=>8299, -8575=>8303, -8458=>8304, -8457=>8305, -8507=>8307, -12292=>8308, -8646=>8309, -8644=>8310, -8645=>8311, -12535=>8313, -12536=>8314, -12537=>8315, -12538=>8316, -12957=>8319, -13179=>8323, -13107=>8327, -13134=>8328, -32394=>8359, -35100=>8360, -37704=>8361, -37512=>8362, -34012=>8363, -20425=>8364, -28859=>8365, -26161=>8366, -26824=>8367, -37625=>8368, -26363=>8369, -24389=>8370, -12033=>8371, -20008=>8371, -20193=>8372, -20220=>8373, -20224=>8374, -20227=>8375, -20281=>8376, -20310=>8377, -20370=>8378, -20362=>8379, -20378=>8380, -20372=>8381, -20429=>8382, -20544=>8383, -20514=>8384, -20479=>8385, -20510=>8386, -20550=>8387, -20592=>8388, -20546=>8389, -20628=>8390, -20724=>8391, -20696=>8392, -20810=>8393, -20836=>8394, -20893=>8395, -20926=>8396, -20972=>8397, -21013=>8398, -21148=>8399, -21158=>8400, -21184=>8401, -21211=>8402, -21248=>8403, -21284=>8405, -21362=>8406, -21395=>8407, -21426=>8408, -21469=>8409, -64014=>8410, -21660=>8411, -21642=>8412, -21673=>8413, -21759=>8414, -21894=>8415, -22361=>8416, -22373=>8417, -22444=>8418, -22472=>8419, -22471=>8420, -64015=>8421, -22686=>8423, -22706=>8424, -22795=>8425, -22867=>8426, -22875=>8427, -22877=>8428, -22883=>8429, -22948=>8430, -22970=>8431, -23382=>8432, -23488=>8433, -29999=>8434, -23512=>8435, -23582=>8437, -23718=>8438, -23738=>8439, -23797=>8440, -23847=>8441, -23891=>8442, -23874=>8444, -23917=>8445, -23992=>8446, -23993=>8447, -24016=>8448, -24353=>8449, -24372=>8450, -24423=>8451, -24503=>8452, -24542=>8453, -24669=>8454, -24709=>8455, -24714=>8456, -24798=>8457, -24789=>8458, -24864=>8459, -24818=>8460, -24849=>8461, -24887=>8462, -24880=>8463, -24984=>8464, -25107=>8465, -25254=>8466, -25589=>8467, -25696=>8468, -25757=>8469, -25806=>8470, -25934=>8471, -26112=>8472, -26133=>8473, -26121=>8474, -26158=>8475, -26148=>8477, -26213=>8478, -26199=>8479, -26201=>8480, -64018=>8481, -26227=>8482, -26265=>8483, -26272=>8484, -26290=>8485, -26303=>8486, -26362=>8487, -26382=>8488, -26470=>8490, -26555=>8491, -26706=>8492, -26560=>8493, -26692=>8495, -26831=>8496, -64019=>8497, -26984=>8498, -64020=>8499, -27032=>8500, -27106=>8501, -27184=>8502, -27243=>8503, -27206=>8504, -27251=>8505, -27262=>8506, -27362=>8507, -27364=>8508, -27606=>8509, -27711=>8510, -27740=>8511, -27782=>8512, -27759=>8513, -27866=>8514, -27908=>8515, -28039=>8516, -28015=>8517, -28054=>8518, -28076=>8519, -28111=>8520, -28152=>8521, -28146=>8522, -28156=>8523, -28217=>8524, -28252=>8525, -28199=>8526, -28220=>8527, -28351=>8528, -28552=>8529, -28597=>8530, -28661=>8531, -28677=>8532, -28679=>8533, -28712=>8534, -28805=>8535, -28843=>8536, -28943=>8537, -28932=>8538, -29020=>8539, -28998=>8540, -28999=>8541, -29121=>8543, -29182=>8544, -29361=>8545, -29374=>8546, -29476=>8547, -64022=>8548, -29559=>8549, -29629=>8550, -29641=>8551, -29654=>8552, -29667=>8553, -29650=>8554, -29703=>8555, -29685=>8556, -29734=>8557, -29738=>8558, -29737=>8559, -29742=>8560, -29833=>8562, -29855=>8563, -29953=>8564, -30063=>8565, -30338=>8566, -30364=>8567, -30366=>8568, -30363=>8569, -30374=>8570, -64023=>8571, -30534=>8572, -21167=>8573, -30753=>8574, -30798=>8575, -30820=>8576, -30842=>8577, -31024=>8578, -64024=>8579, -64025=>8580, -64026=>8581, -31124=>8582, -64027=>8583, -31131=>8584, -31441=>8585, -31463=>8586, -64028=>8587, -31467=>8588, -31646=>8589, -64029=>8590, -32072=>8591, -32183=>8593, -32160=>8594, -32214=>8595, -32338=>8596, -32583=>8597, -32673=>8598, -64030=>8599, -33537=>8600, -33634=>8601, -33663=>8602, -33735=>8603, -33782=>8604, -33864=>8605, -33972=>8606, -34131=>8607, -34137=>8608, -34155=>8609, -64031=>8610, -34224=>8611, -64032=>8612, -64033=>8613, -34823=>8614, -35061=>8615, -35346=>8616, -35383=>8617, -35449=>8618, -35495=>8619, -35518=>8620, -35551=>8621, -64034=>8622, -35574=>8623, -35667=>8624, -35711=>8625, -36080=>8626, -36084=>8627, -36114=>8628, -36214=>8629, -64035=>8630, -36559=>8631, -64037=>8633, -36967=>8634, -37086=>8635, -64038=>8636, -37141=>8637, -37159=>8638, -37338=>8639, -37335=>8640, -37342=>8641, -37357=>8642, -37358=>8643, -37348=>8644, -37349=>8645, -37382=>8646, -37392=>8647, -37386=>8648, -37434=>8649, -37440=>8650, -37436=>8651, -37454=>8652, -37465=>8653, -37457=>8654, -37433=>8655, -37479=>8656, -37543=>8657, -37495=>8658, -37496=>8659, -37607=>8660, -37591=>8661, -37593=>8662, -37584=>8663, -64039=>8664, -37589=>8665, -37600=>8666, -37587=>8667, -37669=>8668, -37665=>8669, -37627=>8670, -64040=>8671, -37662=>8672, -37631=>8673, -37661=>8674, -37634=>8675, -37744=>8676, -37719=>8677, -37796=>8678, -37830=>8679, -37854=>8680, -37880=>8681, -37937=>8682, -37957=>8683, -37960=>8684, -38290=>8685, -64041=>8687, -38557=>8688, -38575=>8689, -38707=>8690, -38715=>8691, -38723=>8692, -38733=>8693, -38735=>8694, -12205=>8695, -38737=>8695, -38999=>8697, -39013=>8698, -64042=>8699, -64043=>8700, -39207=>8701, -64044=>8702, -39326=>8703, -39502=>8704, -39641=>8705, -39644=>8706, -39797=>8707, -39794=>8708, -39823=>8709, -39857=>8710, -39867=>8711, -39936=>8712, -40304=>8713, -40299=>8714, -64045=>8715, -40473=>8716, -40657=>8717, -8364=>9354, -8486=>9355, -64256=>9358, -64259=>9359, -64260=>9360, -257=>9361, -299=>9362, -363=>9363, -275=>9364, -333=>9365, -256=>9366, -298=>9367, -362=>9368, -274=>9369, -332=>9370, -8539=>9371, -8540=>9372, -8541=>9373, -8542=>9374, -8531=>9375, -8532=>9376, -8304=>9377, -8308=>9378, -8309=>9379, -8310=>9380, -8311=>9381, -8312=>9382, -8313=>9383, -8320=>9384, -8321=>9385, -8322=>9386, -8323=>9387, -8324=>9388, -8325=>9389, -8326=>9390, -8327=>9391, -8328=>9392, -8329=>9393, -461=>9394, -282=>9395, -7868=>9397, -463=>9398, -296=>9400, -465=>9401, -467=>9403, -366=>9404, -360=>9405, -462=>9406, -283=>9407, -7869=>9409, -464=>9410, -297=>9412, -466=>9413, -468=>9415, -367=>9416, -361=>9417, -593=>9418, -8049=>9419, -8048=>9420, -509=>9421, -596=>9423, -601=>9426, -602=>9429, -603=>9432, -8051=>9433, -8050=>9434, -567=>9435, -331=>9436, -629=>9437, -652=>9438, -658=>9441, -643=>9442, -720=>9443, -8534=>9785, -8535=>9786, -8536=>9787, -8537=>9788, -8538=>9789, -12832=>10126, -12833=>10127, -12834=>10128, -12835=>10129, -12836=>10130, -12837=>10131, -12838=>10132, -12839=>10133, -12840=>10134, -12841=>10135, -12892=>10244, -12893=>10245, -12894=>10246, -12895=>10247, -12977=>10248, -12978=>10249, -12979=>10250, -12980=>10251, -12981=>10252, -12982=>10253, -12983=>10254, -12984=>10255, -12985=>10256, -12986=>10257, -12987=>10258, -12988=>10259, -12989=>10260, -12990=>10261, -12991=>10262, -9424=>10313, -9425=>10314, -9426=>10315, -9427=>10316, -9428=>10317, -9429=>10318, -9430=>10319, -9431=>10320, -9432=>10321, -9433=>10322, -9434=>10323, -9435=>10324, -9436=>10325, -9437=>10326, -9438=>10327, -9439=>10328, -9440=>10329, -9441=>10330, -9442=>10331, -9443=>10332, -9444=>10333, -9445=>10334, -9446=>10335, -9447=>10336, -9448=>10337, -9449=>10338, -9398=>10339, -9399=>10340, -9400=>10341, -9401=>10342, -9402=>10343, -9403=>10344, -9404=>10345, -9405=>10346, -9406=>10347, -9407=>10348, -9408=>10349, -9409=>10350, -9410=>10351, -9411=>10352, -9412=>10353, -9413=>10354, -9414=>10355, -9415=>10356, -9416=>10357, -9417=>10358, -9418=>10359, -9419=>10360, -9420=>10361, -9421=>10362, -9422=>10363, -9423=>10364, -13008=>10413, -13009=>10414, -13010=>10415, -13011=>10416, -13012=>10417, -13013=>10418, -13014=>10419, -13015=>10420, -13016=>10421, -13017=>10422, -13018=>10423, -13019=>10424, -13020=>10425, -13021=>10426, -13022=>10427, -13023=>10428, -13024=>10429, -13025=>10430, -13026=>10431, -13027=>10432, -13028=>10433, -13029=>10434, -13030=>10435, -13031=>10436, -13032=>10437, -13033=>10438, -13034=>10439, -13035=>10440, -13036=>10441, -13037=>10442, -13038=>10443, -13039=>10444, -13040=>10445, -13041=>10446, -13042=>10447, -13043=>10448, -13044=>10449, -13045=>10450, -13046=>10451, -13047=>10452, -13048=>10453, -13049=>10454, -13050=>10455, -13051=>10456, -13052=>10457, -13053=>10458, -13054=>10459, -12928=>10461, -12929=>10462, -12930=>10463, -12931=>10464, -12932=>10465, -12933=>10466, -12934=>10467, -12935=>10468, -12936=>10469, -12937=>10470, -12944=>10471, -12938=>10472, -12939=>10473, -12940=>10474, -12941=>10475, -12942=>10476, -12943=>10477, -12959=>10479, -12960=>10486, -12961=>10487, -12955=>10488, -12954=>10489, -12963=>10490, -12962=>10491, -12951=>10492, -12956=>10494, -12949=>10495, -9676=>10502, -9471=>10503, -10111=>10514, -9451=>10515, -9452=>10516, -9453=>10517, -9454=>10518, -9455=>10519, -9456=>10520, -9457=>10521, -9458=>10522, -9459=>10523, -9460=>10524, -8414=>11035, -13274=>11851, -8448=>11855, -13250=>11856, -8453=>11859, -13169=>11861, -13197=>11864, -13211=>11865, -13271=>11869, -13272=>11870, -13057=>11874, -13058=>11875, -13060=>11876, -13062=>11877, -13064=>11879, -13063=>11881, -13066=>11882, -13065=>11884, -13067=>11886, -13068=>11888, -13070=>11889, -13071=>11890, -13072=>11891, -13073=>11892, -13074=>11893, -13075=>11894, -13079=>11896, -13081=>11898, -13082=>11900, -13083=>11901, -13084=>11902, -13085=>11903, -13087=>11904, -13088=>11905, -13089=>11906, -13092=>11907, -13093=>11909, -13096=>11912, -13097=>11913, -13101=>11915, -13102=>11918, -13103=>11919, -13104=>11920, -13106=>11921, -13108=>11924, -13109=>11925, -13116=>11926, -13111=>11930, -13112=>11932, -13114=>11933, -13117=>11934, -13121=>11935, -13118=>11936, -13119=>11937, -13120=>11938, -13123=>11939, -13124=>11940, -13125=>11941, -13126=>11942, -13128=>11943, -13131=>11944, -13132=>11945, -13135=>11946, -13136=>11947, -13138=>11950, -13140=>11951, -13139=>11954, -13141=>11955, -13142=>11956, -8501=>12089, -976=>12090, -8714=>12091, -8463=>12092, -981=>12094, -987=>12095, -977=>12096, -9832=>12098, -9833=>12099, -9836=>12100, -12347=>12106, -12339=>12108, -12340=>12109, -12341=>12110, -8252=>12111, -8265=>12112, -8723=>12118, -8771=>12120, -8818=>12121, -8819=>12122, -12312=>12129, -12313=>12130, -65375=>12131, -65376=>12132, -9115=>12143, -9117=>12144, -9118=>12145, -9120=>12146, -9121=>12151, -9123=>12152, -9124=>12153, -9126=>12154, -9116=>12167, -9119=>12167, -9122=>12167, -9125=>12167, -9130=>12167, -9986=>12176, -12349=>12179, -12447=>12181, -8709=>12184, -8864=>12185, -8854=>12186, -8856=>12187, -8853=>12188, -8855=>12189, -9888=>12192, -9664=>12194, -9654=>12195, -8656=>12200, -8596=>12201, -8600=>12202, -8601=>12203, -8598=>12204, -8599=>12205, -8652=>12206, -8651=>12207, -12336=>12218, -8967=>12219, -10048=>12228, -10047=>12229, -9643=>12237, -9642=>12239, -10010=>12241, -9702=>12254, -10070=>12259, -65093=>12639, -65094=>12640, -64103=>13320, -64098=>13321, -32227=>13322, -12232=>13323, -40643=>13323, -28331=>13324, -64082=>13325, -64061=>13326, -64069=>13327, -64062=>13328, -27114=>13329, -28212=>13330, -64096=>13331, -64071=>13332, -64056=>13333, -64066=>13334, -64078=>13335, -34395=>13336, -64105=>13337, -64052=>13338, -64099=>13339, -25581=>13340, -25802=>13341, -30799=>13342, -64084=>13343, -63856=>13344, -64077=>13345, -64097=>13346, -64072=>13347, -64076=>13348, -64091=>13349, -64092=>13350, -64081=>13351, -64067=>13352, -64090=>13353, -28041=>13354, -29376=>13355, -194885=>13357, -64086=>13358, -64080=>13359, -64049=>13360, -64059=>13361, -24034=>13362, -64063=>13363, -64101=>13364, -21373=>13365, -64055=>13366, -64095=>13367, -24501=>13368, -64064=>13369, -64083=>13371, -64085=>13373, -64104=>13374, -64068=>13375, -64089=>13376, -26202=>13377, -64053=>13378, -64075=>13379, -64100=>13380, -64065=>13381, -64048=>13382, -64057=>13384, -64051=>13385, -27493=>13386, -64058=>13387, -27599=>13388, -64050=>13389, -25150=>13390, -64079=>13391, -63773=>13392, -63964=>13393, -63798=>13394, -28122=>13395, -63952=>13396, -26310=>13397, -27511=>13398, -64087=>13399, -37706=>13400, -37636=>13402, -133390=>13523, -35999=>13644, -11991=>13645, -11965=>13646, -158033=>13646, -37555=>13652, -38321=>13653, -194812=>13656, -194965=>13670, -194794=>13679, -26478=>13681, -11974=>13682, -194594=>13684, -156194=>13691, -13314=>13698, -26083=>13701, -134071=>13706, -171339=>13717, -194611=>13719, -24378=>13720, -11945=>13729, -20465=>13731, -63753=>13739, -11964=>13747, -194732=>13750, -26435=>13751, -133732=>13755, -35329=>13756, -25142=>13757, -21555=>13760, -23067=>13761, -25221=>13765, -194819=>13768, -21567=>13775, -27506=>13785, -29986=>13790, -19256=>13791, -24063=>13794, -194827=>13801, -29626=>13802, -134047=>13803, -194600=>13807, -194849=>13809, -194623=>13815, -194675=>13832, -11916=>13833, -11917=>13834, -23577=>13835, -131083=>13839, -23426=>13840, -194642=>13841, -11997=>13847, -11999=>13848, -39136=>13848, -11998=>13849, -169599=>13849, -14221=>13850, -11927=>13852, -14586=>13852, -194887=>13854, -11909=>13856, -20155=>13856, -131490=>13857, -13599=>13865, -194738=>13867, -11971=>13870, -35200=>13870, -31237=>13875, -35498=>13880, -32085=>13882, -28568=>13884, -25591=>13892, -30246=>13893, -11978=>13898, -163767=>13898, -146686=>13904, -13351=>13910, -33067=>13913, -194842=>13916, -11950=>13922, -154327=>13922, -194714=>13928, -194831=>13932, -22305=>13952, -135741=>13953, -194586=>13954, -64003=>13956, -21534=>13964, -15240=>13965, -20839=>13966, -63839=>13971, -20023=>13981, -11946=>13995, -150804=>13995, -24421=>13996, -23020=>13997, -194658=>13998, -24217=>14000, -13416=>14047, -40884=>14048, -21200=>14056, -38376=>14061, -26625=>14066, -195024=>14068, -195039=>14069, -153215=>14075, -11959=>14078, -36534=>14083, -63775=>14084, -63875=>14088, -31867=>14094, -63906=>14095, -63898=>14097, -11961=>14099, -32770=>14099, -157360=>14100, -11911=>14105, -132648=>14105, -131210=>14108, -133508=>14109, -194604=>14109, -11915=>14110, -13630=>14110, -21589=>14115, -22841=>14117, -23414=>14120, -194669=>14121, -23572=>14122, -14306=>14123, -23782=>14124, -20040=>14126, -194742=>14129, -158105=>14134, -25371=>14135, -26211=>14138, -194779=>14140, -27126=>14143, -27014=>14144, -27596=>14148, -28183=>14150, -27818=>14153, -11942=>14157, -20012=>14157, -29935=>14160, -30069=>14161, -30188=>14162, -30286=>14163, -16305=>14164, -30570=>14165, -30633=>14166, -31571=>14173, -16996=>14176, -194924=>14180, -32328=>14183, -132415=>14188, -11955=>14189, -156266=>14189, -33089=>14194, -17491=>14195, -33401=>14197, -11966=>14197, -64094=>14198, -11967=>14198, -64093=>14199, -11968=>14199, -20857=>14201, -33626=>14202, -17701=>14206, -34292=>14208, -131248=>14209, -34429=>14214, -13358=>14216, -35014=>14217, -18406=>14224, -36808=>14233, -166279=>14253, -167447=>14256, -38969=>14259, -39432=>14266, -39903=>14271, -148206=>14282, -21385=>14288, -64017=>14290, -194785=>14291, -146622=>14293, -132625=>14294, -19972=>14296, -19973=>14297, -19999=>14298, -20011=>14299, -20015=>14300, -20016=>14301, -20032=>14302, -20033=>14303, -20036=>14304, -11907=>14305, -20058=>14305, -20095=>14306, -20109=>14307, -20118=>14308, -20153=>14309, -20176=>14310, -20192=>14311, -20221=>14312, -20223=>14313, -20235=>14314, -20245=>14315, -20320=>14316, -20283=>14317, -20297=>14318, -20308=>14319, -20346=>14320, -20349=>14321, -20350=>14322, -20375=>14323, -20414=>14324, -20431=>14325, -20477=>14326, -20480=>14327, -20481=>14328, -20496=>14329, -20507=>14330, -20519=>14331, -20526=>14332, -20567=>14333, -20582=>14334, -20586=>14335, -20539=>14336, -20623=>14337, -20630=>14338, -20636=>14339, -20684=>14340, -20710=>14341, -20713=>14342, -20719=>14343, -20744=>14344, -20747=>14345, -20752=>14346, -20763=>14347, -20766=>14348, -20831=>14349, -20897=>14350, -20924=>14351, -20974=>14353, -20980=>14354, -20993=>14355, -11913=>14356, -20994=>14356, -21011=>14357, -21065=>14358, -21089=>14359, -21094=>14360, -21139=>14361, -21192=>14362, -21232=>14363, -21258=>14364, -21259=>14365, -21310=>14366, -21324=>14367, -21323=>14368, -21345=>14369, -21356=>14370, -21419=>14371, -21466=>14372, -21478=>14373, -21493=>14374, -21543=>14375, -21581=>14376, -21606=>14377, -21611=>14378, -21620=>14379, -21645=>14380, -21654=>14381, -21665=>14382, -21677=>14383, -21689=>14384, -21695=>14385, -21702=>14386, -21709=>14387, -21774=>14388, -21803=>14389, -21813=>14390, -21834=>14391, -21856=>14392, -21896=>14394, -21902=>14395, -22024=>14396, -22030=>14397, -22031=>14398, -22071=>14399, -22079=>14400, -22089=>14401, -22091=>14402, -22095=>14403, -22118=>14404, -22121=>14405, -22127=>14406, -22129=>14407, -22130=>14408, -22165=>14409, -22170=>14410, -22188=>14411, -22189=>14412, -22193=>14413, -22217=>14414, -22237=>14415, -22244=>14416, -22282=>14417, -22293=>14418, -22307=>14419, -22319=>14420, -22323=>14421, -22324=>14422, -22348=>14423, -22384=>14424, -22412=>14425, -22428=>14426, -22456=>14427, -22502=>14428, -22509=>14429, -22517=>14430, -22518=>14431, -22527=>14432, -22537=>14433, -22560=>14434, -22578=>14435, -22652=>14436, -22656=>14437, -22697=>14438, -22734=>14439, -22736=>14440, -22740=>14441, -22746=>14442, -22761=>14443, -22796=>14444, -22820=>14445, -22831=>14446, -22881=>14447, -22893=>14448, -22986=>14449, -22994=>14450, -23005=>14451, -23011=>14452, -23012=>14453, -23044=>14454, -23052=>14455, -23075=>14456, -23111=>14457, -23125=>14458, -23139=>14459, -23149=>14460, -23166=>14461, -23198=>14462, -23207=>14463, -23212=>14464, -23219=>14465, -23264=>14466, -23296=>14467, -23321=>14468, -23333=>14469, -23341=>14470, -23361=>14471, -23420=>14472, -23422=>14473, -23423=>14474, -23434=>14475, -11919=>14476, -23587=>14476, -23595=>14477, -23600=>14478, -23651=>14479, -23657=>14480, -23676=>14481, -23755=>14482, -23762=>14483, -23796=>14484, -23844=>14485, -23846=>14486, -23875=>14487, -23878=>14488, -23882=>14489, -23954=>14490, -23956=>14491, -23961=>14492, -23968=>14493, -24024=>14494, -24032=>14495, -24056=>14496, -24064=>14497, -24082=>14498, -24084=>14499, -24085=>14500, -24088=>14501, -24110=>14502, -24152=>14503, -24171=>14504, -24172=>14505, -24232=>14506, -24234=>14507, -24254=>14508, -24255=>14509, -24274=>14511, -24327=>14512, -24334=>14513, -24348=>14514, -24349=>14515, -24354=>14516, -24360=>14517, -24374=>14518, -24379=>14519, -24384=>14520, -12089=>14521, -24400=>14521, -24408=>14522, -24420=>14523, -24457=>14524, -24476=>14525, -24487=>14526, -24484=>14527, -24495=>14528, -24504=>14529, -11926=>14530, -24516=>14530, -24521=>14531, -24545=>14532, -24553=>14533, -24557=>14534, -24572=>14535, -24599=>14536, -24602=>14537, -24627=>14538, -24673=>14539, -24703=>14540, -24734=>14541, -24740=>14542, -24752=>14543, -24779=>14544, -24795=>14545, -24824=>14546, -24850=>14547, -24851=>14548, -24852=>14549, -24860=>14550, -24956=>14551, -24973=>14552, -24991=>14553, -25000=>14554, -25026=>14555, -25055=>14556, -25109=>14557, -25129=>14558, -25155=>14559, -25158=>14560, -11928=>14561, -25164=>14561, -25169=>14562, -25174=>14563, -25284=>14564, -25340=>14565, -25354=>14566, -25357=>14567, -25368=>14568, -25401=>14569, -25410=>14570, -25411=>14571, -25445=>14572, -25460=>14573, -25469=>14574, -25476=>14575, -25479=>14576, -25488=>14577, -25502=>14578, -25553=>14579, -25564=>14580, -25609=>14581, -25616=>14582, -25634=>14583, -25684=>14584, -25691=>14585, -25709=>14586, -25723=>14587, -25790=>14588, -25791=>14589, -25829=>14590, -25847=>14591, -25851=>14592, -25860=>14593, -25878=>14594, -25881=>14595, -25927=>14596, -25959=>14597, -25985=>14598, -25989=>14599, -26050=>14600, -26096=>14601, -26098=>14602, -26156=>14603, -26188=>14604, -26203=>14605, -26204=>14606, -26209=>14607, -26219=>14608, -26276=>14610, -26312=>14611, -26348=>14612, -26373=>14613, -26387=>14614, -26419=>14615, -26440=>14616, -26444=>14617, -26486=>14618, -26491=>14619, -26544=>14620, -26546=>14621, -26617=>14622, -26583=>14623, -26585=>14624, -26608=>14625, -26668=>14626, -26672=>14627, -26673=>14628, -26715=>14629, -26738=>14630, -26741=>14631, -26746=>14632, -26756=>14633, -26789=>14634, -26802=>14635, -26832=>14636, -26838=>14637, -26856=>14638, -26861=>14639, -26864=>14640, -26865=>14641, -26876=>14642, -26897=>14643, -26899=>14644, -26933=>14645, -26939=>14646, -26967=>14647, -26979=>14648, -26994=>14649, -27007=>14650, -27008=>14651, -27046=>14652, -27053=>14653, -27063=>14654, -27094=>14655, -27095=>14656, -27137=>14657, -27151=>14658, -27157=>14659, -27176=>14660, -27188=>14661, -27198=>14662, -27205=>14663, -27216=>14664, -27217=>14665, -27222=>14666, -27227=>14667, -27267=>14668, -27273=>14669, -27281=>14670, -27293=>14671, -27294=>14672, -27295=>14673, -27356=>14674, -27367=>14675, -27372=>14676, -27422=>14677, -27428=>14678, -27445=>14679, -27462=>14680, -27478=>14681, -27488=>14682, -27522=>14683, -27582=>14684, -27617=>14685, -27633=>14686, -27664=>14687, -27699=>14688, -27701=>14689, -11937=>14689, -11938=>14690, -27737=>14691, -27766=>14692, -27771=>14693, -27781=>14694, -27797=>14695, -27804=>14696, -27856=>14697, -27860=>14698, -27862=>14699, -27872=>14700, -27883=>14701, -27884=>14702, -27886=>14703, -27914=>14704, -27918=>14705, -27921=>14706, -27950=>14707, -27991=>14708, -27998=>14709, -28005=>14710, -28034=>14711, -28095=>14712, -28100=>14713, -28106=>14714, -28118=>14715, -28137=>14716, -28194=>14717, -28241=>14718, -28359=>14719, -28362=>14720, -28366=>14721, -28413=>14722, -28442=>14723, -28458=>14724, -28463=>14725, -28467=>14726, -28506=>14727, -28510=>14728, -28514=>14729, -28541=>14730, -28555=>14731, -28557=>14732, -28562=>14733, -28564=>14734, -28570=>14735, -28583=>14736, -28584=>14737, -28598=>14738, -28634=>14739, -28638=>14740, -28729=>14742, -28732=>14743, -28756=>14745, -28765=>14746, -28766=>14747, -28772=>14748, -11939=>14749, -28780=>14749, -28798=>14750, -28801=>14751, -28821=>14752, -28855=>14753, -28883=>14754, -28884=>14755, -28888=>14756, -28892=>14757, -28935=>14758, -28960=>14759, -28977=>14760, -29002=>14761, -29010=>14762, -29024=>14763, -29049=>14764, -29074=>14765, -29131=>14767, -29139=>14768, -29142=>14769, -29184=>14770, -29213=>14771, -29227=>14772, -29240=>14773, -29249=>14774, -29267=>14775, -29269=>14776, -29270=>14777, -29276=>14778, -29325=>14779, -11944=>14780, -29357=>14780, -29364=>14781, -29383=>14782, -29435=>14783, -29444=>14784, -29445=>14785, -29480=>14786, -29489=>14787, -29507=>14788, -29548=>14789, -29564=>14790, -29571=>14791, -29573=>14792, -29574=>14793, -29589=>14794, -29598=>14795, -29599=>14796, -29600=>14797, -29606=>14798, -29611=>14799, -29621=>14800, -29623=>14801, -29628=>14802, -29647=>14803, -29657=>14804, -29673=>14805, -29684=>14806, -29693=>14807, -29700=>14808, -29706=>14809, -29722=>14810, -29723=>14811, -29732=>14812, -29736=>14813, -29740=>14814, -29743=>14815, -29744=>14816, -29745=>14817, -29753=>14818, -29764=>14819, -29767=>14820, -29771=>14821, -29773=>14822, -29777=>14823, -29783=>14824, -29798=>14825, -29803=>14826, -29809=>14827, -29824=>14828, -29829=>14829, -29830=>14830, -29831=>14831, -29840=>14832, -29848=>14833, -29852=>14834, -29856=>14835, -29859=>14836, -29864=>14837, -29867=>14838, -29877=>14839, -29887=>14840, -29896=>14841, -29914=>14842, -29918=>14843, -30030=>14844, -30073=>14845, -30081=>14846, -30096=>14847, -12135=>14848, -30098=>14848, -30099=>14849, -30132=>14850, -30180=>14851, -30201=>14852, -30208=>14853, -30218=>14854, -30229=>14855, -30230=>14856, -30233=>14857, -30238=>14858, -30253=>14859, -30261=>14860, -30275=>14861, -30283=>14862, -30309=>14863, -30317=>14864, -30319=>14865, -30321=>14866, -30324=>14867, -30372=>14868, -30373=>14869, -30405=>14870, -30412=>14871, -30444=>14872, -30460=>14873, -30516=>14874, -30518=>14875, -30556=>14876, -30559=>14877, -30560=>14878, -30578=>14879, -30589=>14880, -30613=>14881, -30634=>14882, -30694=>14883, -30704=>14884, -30708=>14885, -30726=>14886, -30754=>14887, -30765=>14888, -30766=>14889, -30768=>14890, -30773=>14891, -30824=>14892, -30878=>14893, -30920=>14894, -30924=>14895, -30926=>14896, -30948=>14897, -30944=>14898, -30945=>14899, -30962=>14900, -30967=>14901, -30971=>14902, -31025=>14903, -11949=>14905, -31035=>14905, -31037=>14906, -31045=>14907, -31067=>14908, -31068=>14909, -31115=>14910, -31126=>14911, -31128=>14912, -12145=>14913, -31160=>14913, -31163=>14914, -31178=>14915, -31194=>14916, -31235=>14917, -31241=>14918, -31249=>14919, -31262=>14920, -31277=>14921, -31289=>14922, -31301=>14923, -31308=>14924, -31325=>14925, -31341=>14927, -31352=>14928, -31392=>14929, -31395=>14930, -31411=>14931, -31419=>14932, -31420=>14933, -31430=>14934, -31495=>14935, -31508=>14936, -31527=>14937, -31537=>14938, -31559=>14939, -31566=>14940, -31584=>14941, -31593=>14942, -31597=>14943, -31602=>14944, -31633=>14945, -31663=>14946, -31703=>14947, -31705=>14948, -31755=>14949, -31759=>14950, -31776=>14951, -31782=>14952, -31793=>14953, -31798=>14954, -31825=>14955, -31833=>14956, -31847=>14957, -31854=>14958, -31856=>14959, -31932=>14960, -31935=>14961, -31944=>14962, -31945=>14963, -31959=>14964, -31961=>14965, -31965=>14966, -31979=>14967, -32007=>14968, -32008=>14969, -32009=>14970, -32019=>14971, -32029=>14972, -32035=>14973, -32065=>14974, -32083=>14975, -32089=>14976, -32093=>14977, -32122=>14978, -32134=>14979, -32139=>14980, -32140=>14981, -32204=>14982, -32235=>14983, -32241=>14984, -32249=>14985, -32264=>14986, -32273=>14987, -32277=>14988, -32288=>14989, -32327=>14990, -32354=>14991, -32366=>14992, -32371=>14993, -32397=>14994, -32401=>14995, -32408=>14996, -32580=>14997, -32591=>14998, -11947=>14999, -11954=>14999, -32594=>14999, -11953=>15000, -32595=>15000, -32609=>15001, -32657=>15002, -32703=>15003, -32718=>15004, -32735=>15005, -32741=>15006, -32748=>15007, -32750=>15008, -32751=>15009, -32762=>15010, -32782=>15011, -32785=>15012, -32788=>15013, -32804=>15014, -32806=>15015, -32826=>15016, -32828=>15017, -32864=>15018, -32881=>15019, -32885=>15020, -32926=>15021, -32934=>15022, -32939=>15023, -32983=>15024, -32984=>15025, -33046=>15026, -33048=>15027, -33082=>15028, -33098=>15029, -33100=>15030, -33153=>15031, -33156=>15032, -33204=>15033, -33231=>15034, -33273=>15035, -33283=>15036, -33313=>15037, -33330=>15038, -33332=>15039, -33350=>15040, -33355=>15041, -33359=>15042, -33422=>15043, -33454=>15044, -33463=>15045, -33470=>15046, -33478=>15047, -33534=>15048, -33603=>15049, -33617=>15050, -33621=>15051, -33670=>15052, -33677=>15053, -33682=>15054, -33688=>15055, -33705=>15056, -33727=>15057, -33728=>15058, -33770=>15059, -33807=>15060, -33809=>15061, -33866=>15062, -33910=>15063, -33960=>15064, -33967=>15065, -33984=>15066, -33986=>15067, -34032=>15068, -34045=>15069, -34060=>15070, -34100=>15071, -34142=>15072, -34191=>15073, -34231=>15074, -34254=>15075, -34221=>15076, -34322=>15077, -34345=>15078, -34386=>15079, -34403=>15080, -34412=>15081, -34415=>15082, -34426=>15083, -34445=>15084, -34449=>15085, -34456=>15086, -34471=>15087, -34472=>15088, -34554=>15089, -34557=>15090, -34571=>15091, -34579=>15092, -34585=>15093, -34590=>15094, -34600=>15095, -34622=>15096, -34673=>15097, -34696=>15098, -34713=>15099, -34732=>15100, -34733=>15101, -34741=>15102, -34774=>15103, -34795=>15104, -34797=>15105, -34817=>15106, -34822=>15108, -34827=>15109, -34836=>15110, -34844=>15111, -34902=>15112, -34911=>15113, -11970=>15114, -34916=>15114, -34968=>15115, -34986=>15116, -35005=>15117, -35006=>15118, -35018=>15119, -35026=>15120, -35035=>15121, -35056=>15122, -35057=>15123, -35078=>15124, -35096=>15125, -35097=>15126, -35098=>15127, -35111=>15128, -35120=>15129, -35134=>15130, -35195=>15131, -35284=>15132, -35286=>15133, -35301=>15134, -35313=>15135, -35335=>15136, -35343=>15137, -35349=>15138, -35362=>15139, -35406=>15140, -35455=>15141, -35572=>15142, -35615=>15143, -35639=>15144, -35651=>15145, -35652=>15146, -35668=>15147, -35740=>15148, -35742=>15149, -35911=>15150, -35924=>15151, -35955=>15152, -36004=>15153, -36057=>15154, -36065=>15155, -36088=>15156, -36094=>15157, -36123=>15158, -36201=>15159, -36204=>15160, -36228=>15161, -36237=>15162, -36245=>15163, -36262=>15164, -36294=>15165, -36302=>15166, -36324=>15167, -36332=>15168, -36384=>15169, -36427=>15170, -36460=>15171, -36464=>15172, -36474=>15173, -36498=>15174, -36526=>15175, -36531=>15176, -36561=>15177, -36564=>15178, -36601=>15179, -36631=>15180, -36662=>15181, -36774=>15182, -12193=>15183, -36789=>15183, -11981=>15184, -36790=>15184, -36832=>15186, -36836=>15187, -36854=>15188, -36866=>15189, -36908=>15190, -36932=>15191, -37000=>15192, -37013=>15193, -37017=>15194, -37019=>15195, -37026=>15196, -37044=>15197, -37079=>15198, -37085=>15199, -37108=>15200, -37143=>15201, -37148=>15202, -37169=>15203, -37178=>15204, -37181=>15205, -37192=>15206, -37211=>15207, -37217=>15208, -37220=>15209, -37262=>15210, -37278=>15211, -37288=>15212, -37293=>15213, -37294=>15214, -37298=>15215, -37308=>15216, -37360=>15217, -37367=>15218, -37371=>15219, -37383=>15220, -37416=>15221, -37427=>15222, -37432=>15223, -37443=>15224, -37447=>15225, -37455=>15226, -37472=>15227, -37570=>15228, -37579=>15229, -37580=>15230, -37599=>15231, -37645=>15232, -37653=>15233, -37663=>15234, -37671=>15235, -37703=>15236, -37714=>15237, -37738=>15239, -37741=>15240, -37787=>15241, -37818=>15242, -37801=>15243, -37825=>15244, -37834=>15245, -37858=>15246, -37882=>15247, -37885=>15248, -37903=>15249, -37940=>15250, -37951=>15251, -37973=>15252, -37995=>15253, -38002=>15254, -11986=>15255, -38264=>15255, -38310=>15256, -38313=>15257, -38324=>15259, -38333=>15260, -38362=>15261, -11983=>15262, -11990=>15262, -38429=>15262, -38465=>15263, -38488=>15264, -38532=>15265, -38564=>15266, -38569=>15267, -38610=>15268, -195060=>15269, -38622=>15270, -38633=>15271, -38641=>15272, -38658=>15273, -38665=>15274, -38746=>15275, -38755=>15276, -38766=>15277, -38771=>15278, -38810=>15279, -38818=>15280, -38837=>15281, -38838=>15282, -38873=>15283, -38878=>15284, -38900=>15285, -38922=>15286, -38926=>15287, -38942=>15288, -38947=>15289, -38955=>15290, -38974=>15291, -38994=>15292, -38995=>15293, -39001=>15294, -39020=>15295, -39096=>15296, -39098=>15297, -39103=>15298, -39112=>15299, -39141=>15300, -39218=>15301, -39219=>15302, -39232=>15303, -39245=>15304, -39260=>15305, -39263=>15306, -39345=>15307, -39353=>15308, -39354=>15309, -39369=>15310, -39426=>15311, -39446=>15312, -39460=>15313, -39463=>15314, -39469=>15315, -39470=>15316, -39478=>15317, -39480=>15318, -39498=>15319, -39510=>15320, -39605=>15321, -39606=>15322, -39673=>15323, -39683=>15324, -39712=>15325, -39731=>15326, -39732=>15327, -39795=>15328, -39801=>15329, -39847=>15330, -39873=>15331, -39879=>15332, -39895=>15333, -39911=>15334, -39915=>15335, -39927=>15336, -39930=>15337, -39933=>15338, -39947=>15339, -39975=>15340, -39978=>15341, -39990=>15342, -40001=>15343, -40019=>15344, -40035=>15345, -40048=>15346, -40055=>15347, -40194=>15348, -40258=>15349, -40263=>15350, -40291=>15351, -40297=>15352, -40316=>15353, -40318=>15354, -40333=>15355, -40369=>15356, -40387=>15357, -40391=>15358, -40406=>15359, -40415=>15360, -40427=>15361, -40436=>15362, -40469=>15363, -40477=>15364, -40612=>15365, -40616=>15366, -40620=>15367, -40679=>15368, -40686=>15369, -40720=>15370, -40722=>15371, -40727=>15372, -40729=>15373, -40751=>15374, -40759=>15375, -40761=>15376, -40769=>15377, -40773=>15378, -40791=>15379, -40808=>15380, -40817=>15381, -40821=>15382, -40848=>15383, -40852=>15384, -40866=>15385, -13317=>15387, -194564=>15388, -22048=>15389, -24267=>15390, -11925=>15391, -144954=>15393, -28665=>15395, -28390=>15396, -29107=>15397, -11940=>15398, -64073=>15398, -11980=>15403, -64102=>15403, -23986=>15405, -20435=>15407, -20697=>15408, -20720=>15409, -20931=>15410, -22134=>15411, -27220=>15412, -27905=>15413, -28112=>15414, -28226=>15415, -28377=>15416, -29668=>15417, -29729=>15418, -30060=>15419, -30801=>15420, -34805=>15421, -144382=>15422, -29608=>15423, -15091=>15424, -13531=>15425, -17420=>15426, -16010=>15427, -40893=>15429, -19432=>15430, -40892=>15431, -16090=>15432, -15138=>15433, -40894=>15434, -17786=>15435, -16531=>15436, -18021=>15438, -16643=>15439, -17043=>15440, -18094=>15441, -13448=>15442, -140809=>15443, -63584=>15444, -63585=>15445, -63586=>15446, -63610=>15447, -63615=>15448, -8836=>15472, -8837=>15473, -8842=>15474, -8843=>15475, -8713=>15476, -8965=>15478, -8966=>15479, -8741=>15489, -8742=>15490, -8802=>15505, -8773=>15507, -8776=>15508, -8822=>15509, -8823=>15510, -8487=>15515, -8922=>15725, -8923=>15726, -8533=>15727, -8984=>15728, -7742=>15729, -7743=>15730, -504=>15731, -505=>15732, -470=>15733, -472=>15734, -474=>15735, -476=>15736, -260=>15737, -728=>15738, -317=>15739, -346=>15740, -350=>15741, -356=>15742, -377=>15743, -379=>15744, -261=>15745, -731=>15746, -318=>15747, -347=>15748, -711=>15749, -351=>15750, -357=>15751, -378=>15752, -733=>15753, -380=>15754, -340=>15755, -258=>15756, -313=>15757, -262=>15758, -268=>15759, -280=>15760, -270=>15761, -323=>15762, -327=>15763, -336=>15764, -344=>15765, -368=>15766, -354=>15767, -341=>15768, -259=>15769, -314=>15770, -263=>15771, -269=>15772, -281=>15773, -271=>15774, -273=>15775, -324=>15776, -328=>15777, -337=>15778, -345=>15779, -369=>15780, -355=>15781, -729=>15782, -264=>15783, -284=>15784, -292=>15785, -308=>15786, -348=>15787, -364=>15788, -265=>15789, -285=>15790, -293=>15791, -309=>15792, -349=>15793, -365=>15794, -625=>15795, -651=>15796, -638=>15797, -620=>15798, -622=>15799, -633=>15800, -648=>15801, -598=>15802, -627=>15803, -637=>15804, -642=>15805, -656=>15806, -635=>15807, -621=>15808, -607=>15809, -626=>15810, -669=>15811, -654=>15812, -609=>15813, -624=>15814, -641=>15815, -295=>15816, -661=>15817, -660=>15818, -614=>15819, -664=>15820, -450=>15821, -595=>15822, -599=>15823, -644=>15824, -608=>15825, -403=>15826, -616=>15827, -649=>15828, -600=>15829, -604=>15830, -606=>15831, -592=>15832, -623=>15833, -650=>15834, -612=>15835, -594=>15836, -653=>15837, -613=>15838, -674=>15839, -673=>15840, -597=>15841, -657=>15842, -634=>15843, -615=>15844, -865=>15845, -712=>15846, -716=>15847, -721=>15848, -8255=>15849, -783=>15850, -741=>15851, -742=>15852, -743=>15853, -744=>15854, -745=>15855, -805=>15858, -812=>15859, -825=>15860, -796=>15861, -799=>15862, -800=>15863, -829=>15864, -809=>15865, -815=>15866, -734=>15867, -804=>15868, -816=>15869, -828=>15870, -820=>15871, -797=>15872, -798=>15873, -792=>15874, -793=>15875, -810=>15876, -826=>15877, -827=>15878, -794=>15879, -610=>15883, -611=>15884, -618=>15885, -628=>15886, -630=>15887, -632=>15888, -640=>15889, -655=>15890, -665=>15891, -668=>15892, -671=>15893, -688=>15894, -690=>15895, -695=>15896, -705=>15897, -736=>15898, -737=>15899, -8862=>15906, -12348=>16194, -12543=>16195, -12310=>16197, -12311=>16198, -9838=>16199, -9835=>16200, -10548=>16201, -10549=>16202, -10687=>16203, -12448=>16205, -10746=>16207, -10747=>16208, -962=>16222, -9461=>16223, -9462=>16224, -9463=>16225, -9464=>16226, -9465=>16227, -9466=>16228, -9467=>16229, -9468=>16230, -9469=>16231, -9470=>16232, -9750=>16233, -9751=>16234, -9649=>16235, -12784=>16236, -12785=>16237, -12786=>16238, -12787=>16239, -12788=>16240, -12789=>16241, -12790=>16242, -12791=>16243, -12792=>16244, -12793=>16245, -12794=>16247, -12795=>16248, -12796=>16249, -12797=>16250, -12798=>16251, -12799=>16252, -9150=>16253, -9151=>16254, -9152=>16255, -9153=>16256, -9154=>16257, -9155=>16258, -9156=>16259, -9157=>16260, -9158=>16261, -9159=>16262, -9160=>16263, -9161=>16264, -9162=>16265, -9163=>16266, -9164=>16267, -10003=>16270, -9251=>16272, -9166=>16273, -9680=>16274, -9681=>16275, -9682=>16276, -9683=>16277, -8263=>16278, -8264=>16279, -8273=>16281, -8258=>16282, -12688=>16283, -12689=>16284, -12690=>16285, -12691=>16286, -12692=>16287, -12693=>16288, -12694=>16289, -12695=>16290, -12696=>16291, -12697=>16292, -12698=>16293, -12699=>16294, -12700=>16295, -12701=>16296, -12702=>16297, -12703=>16298, -9136=>16312, -9137=>16313, -9842=>16314, -9843=>16315, -9844=>16316, -9845=>16317, -9846=>16318, -9847=>16319, -9848=>16320, -9849=>16321, -9850=>16322, -9851=>16323, -9852=>16324, -9853=>16325, -12441=>16326, -12442=>16327, -8413=>16328, -20296=>16779, -20319=>16780, -20330=>16781, -20332=>16782, -20494=>16783, -20504=>16784, -20545=>16785, -20722=>16786, -20688=>16787, -20742=>16788, -20739=>16789, -20789=>16790, -20821=>16791, -20823=>16792, -13493=>16793, -20938=>16794, -20962=>16795, -21079=>16796, -21196=>16797, -21206=>16798, -21243=>16799, -21276=>16800, -21347=>16801, -21405=>16802, -21522=>16803, -21631=>16804, -21640=>16805, -21840=>16806, -21889=>16807, -21933=>16808, -21966=>16809, -22075=>16810, -22174=>16811, -22185=>16812, -22195=>16813, -22391=>16814, -22396=>16815, -135963=>16816, -22479=>16817, -22500=>16818, -22628=>16819, -22665=>16820, -136302=>16821, -22738=>16822, -22752=>16823, -34369=>16824, -22923=>16825, -22930=>16826, -22979=>16827, -23059=>16828, -23143=>16829, -23159=>16830, -23172=>16831, -23236=>16832, -137405=>16833, -23421=>16834, -23443=>16835, -23570=>16836, -64060=>16837, -136884=>16838, -23674=>16839, -23695=>16840, -23711=>16841, -23715=>16842, -23722=>16843, -23760=>16844, -138804=>16845, -23821=>16846, -23879=>16847, -23937=>16848, -23972=>16849, -23975=>16850, -24011=>16851, -24158=>16852, -24313=>16853, -24320=>16854, -24322=>16855, -24355=>16856, -24381=>16857, -24404=>16858, -24445=>16859, -24589=>16860, -24596=>16861, -24600=>16862, -24629=>16863, -24647=>16864, -24733=>16865, -24788=>16866, -24797=>16867, -24875=>16868, -25020=>16869, -25017=>16870, -25122=>16871, -25178=>16872, -25199=>16873, -25302=>16874, -25468=>16875, -25573=>16876, -25721=>16877, -25796=>16878, -25808=>16879, -25897=>16880, -26013=>16881, -26170=>16882, -26146=>16883, -26155=>16884, -26160=>16885, -26163=>16886, -26184=>16887, -143812=>16888, -26231=>16889, -26232=>16890, -26253=>16891, -26299=>16892, -26331=>16893, -26344=>16894, -26439=>16895, -26497=>16896, -26515=>16897, -26520=>16898, -26523=>16899, -26620=>16900, -26653=>16901, -26787=>16902, -26890=>16903, -26953=>16904, -144836=>16905, -26946=>16906, -26980=>16907, -27045=>16908, -27087=>16909, -15286=>16910, -15299=>16911, -27113=>16912, -27125=>16913, -145215=>16914, -27195=>16915, -145251=>16916, -27284=>16917, -27301=>16918, -15375=>16919, -27419=>16920, -27436=>16921, -27495=>16922, -27561=>16923, -27565=>16924, -27607=>16925, -27647=>16926, -27653=>16927, -27764=>16928, -27800=>16929, -27899=>16930, -27846=>16931, -27953=>16932, -27961=>16933, -27967=>16934, -27992=>16935, -28052=>16936, -28074=>16937, -28123=>16938, -28125=>16939, -28228=>16940, -28254=>16941, -28337=>16942, -28353=>16943, -28432=>16944, -28505=>16945, -28513=>16946, -28542=>16947, -28556=>16948, -28576=>16949, -28604=>16950, -28615=>16951, -28618=>16952, -28656=>16953, -28750=>16954, -28789=>16955, -28836=>16956, -28900=>16957, -28971=>16958, -28958=>16959, -28974=>16960, -29009=>16961, -29032=>16962, -29061=>16963, -29063=>16964, -29114=>16965, -29124=>16966, -29205=>16967, -15935=>16968, -29339=>16969, -149489=>16970, -29479=>16971, -29520=>16972, -29542=>16973, -29602=>16974, -29739=>16975, -29766=>16976, -29794=>16977, -29805=>16978, -29862=>16979, -29865=>16980, -29897=>16981, -29951=>16982, -29975=>16983, -16242=>16984, -30158=>16985, -30210=>16986, -30216=>16987, -30308=>16988, -30337=>16989, -30365=>16990, -30378=>16991, -30390=>16992, -30414=>16993, -30420=>16994, -30438=>16995, -30449=>16996, -30474=>16997, -30489=>16998, -30541=>16999, -30542=>17000, -30586=>17001, -30592=>17002, -30612=>17003, -30688=>17004, -152718=>17005, -30787=>17006, -30830=>17007, -30896=>17008, -152846=>17009, -30893=>17010, -30976=>17011, -31004=>17012, -31022=>17013, -31028=>17014, -31046=>17015, -31097=>17016, -31176=>17017, -153457=>17018, -31188=>17019, -31198=>17020, -31211=>17021, -31213=>17022, -31365=>17023, -154052=>17024, -31438=>17025, -31485=>17026, -31506=>17027, -31533=>17028, -31547=>17029, -31599=>17030, -31745=>17031, -31795=>17032, -155041=>17033, -31853=>17034, -31865=>17035, -31887=>17036, -31892=>17037, -31904=>17038, -31957=>17039, -32049=>17040, -32092=>17041, -32131=>17042, -32166=>17043, -32194=>17044, -32296=>17045, -32663=>17046, -32731=>17047, -32821=>17048, -32823=>17049, -32970=>17050, -32992=>17051, -33011=>17052, -33120=>17053, -33127=>17054, -33128=>17055, -33133=>17056, -33211=>17057, -33226=>17058, -33239=>17059, -17499=>17060, -33376=>17061, -33396=>17062, -158463=>17063, -33441=>17064, -33443=>17065, -33444=>17066, -33449=>17067, -33471=>17068, -33493=>17069, -33533=>17070, -33536=>17071, -33570=>17072, -33581=>17073, -33594=>17074, -33607=>17075, -33661=>17076, -33703=>17077, -33743=>17078, -33745=>17079, -33761=>17080, -33793=>17081, -33798=>17082, -33887=>17083, -33904=>17084, -33907=>17085, -33925=>17086, -33950=>17087, -33978=>17088, -159296=>17089, -34098=>17090, -34078=>17091, -34095=>17092, -34148=>17093, -34170=>17094, -34188=>17095, -34210=>17096, -34251=>17097, -34285=>17098, -34303=>17099, -34308=>17100, -34309=>17101, -34320=>17102, -159988=>17103, -34328=>17104, -34360=>17105, -34391=>17106, -34402=>17107, -17821=>17108, -34421=>17109, -34488=>17110, -34556=>17111, -34695=>17112, -17898=>17113, -34826=>17114, -34832=>17115, -35022=>17116, -161412=>17117, -35122=>17118, -35129=>17119, -35136=>17120, -35220=>17121, -35318=>17122, -35399=>17123, -35421=>17124, -35425=>17125, -35445=>17126, -35536=>17127, -35654=>17128, -35673=>17129, -35689=>17130, -35741=>17131, -35913=>17132, -35944=>17133, -36271=>17134, -36305=>17135, -36311=>17136, -36387=>17137, -36413=>17138, -36475=>17139, -164471=>17140, -18500=>17141, -36602=>17142, -36638=>17143, -36653=>17144, -36692=>17145, -164813=>17146, -36840=>17147, -36846=>17148, -36872=>17149, -36909=>17150, -37015=>17151, -37043=>17152, -37054=>17153, -37060=>17154, -37061=>17155, -37063=>17156, -37103=>17157, -37140=>17158, -37142=>17159, -37154=>17160, -37155=>17161, -37167=>17162, -37172=>17163, -37251=>17164, -37361=>17165, -37705=>17166, -37732=>17167, -37733=>17168, -37795=>17169, -37855=>17170, -37892=>17171, -37939=>17172, -37962=>17173, -37987=>17174, -38001=>17175, -38286=>17176, -38303=>17177, -38316=>17178, -38326=>17179, -38347=>17180, -38352=>17181, -38355=>17182, -18864=>17183, -38366=>17184, -38565=>17185, -38639=>17186, -38734=>17187, -38805=>17188, -38830=>17189, -38842=>17190, -38849=>17191, -38857=>17192, -38875=>17193, -38998=>17194, -39143=>17195, -39256=>17196, -39427=>17197, -39617=>17198, -39619=>17199, -39630=>17200, -39638=>17201, -39682=>17202, -39688=>17203, -19479=>17204, -39725=>17205, -39774=>17206, -39782=>17207, -39812=>17208, -39818=>17209, -39838=>17210, -39886=>17211, -39909=>17212, -39928=>17213, -39971=>17214, -40015=>17215, -40016=>17216, -40037=>17217, -40221=>17218, -40222=>17219, -40259=>17220, -40274=>17221, -40330=>17222, -40342=>17223, -40384=>17224, -40364=>17225, -40380=>17226, -172432=>17227, -40423=>17228, -40455=>17229, -40606=>17230, -40623=>17231, -40855=>17232, -131209=>17233, -19970=>17234, -19983=>17235, -19986=>17236, -20009=>17237, -20014=>17238, -20039=>17239, -131234=>17240, -20049=>17241, -13318=>17242, -131236=>17243, -20073=>17244, -20125=>17245, -13356=>17246, -20156=>17247, -20163=>17248, -20168=>17249, -20203=>17250, -20186=>17251, -20209=>17252, -20213=>17253, -20246=>17254, -20324=>17255, -20279=>17256, -20286=>17257, -20312=>17258, -131603=>17259, -20343=>17260, -20344=>17261, -20354=>17262, -20357=>17263, -20454=>17264, -20402=>17265, -20421=>17266, -20427=>17267, -20434=>17268, -13418=>17269, -20466=>17270, -20499=>17271, -20508=>17272, -20558=>17273, -20563=>17274, -20579=>17275, -20643=>17276, -20616=>17277, -20626=>17278, -20627=>17279, -20629=>17280, -20650=>17281, -131883=>17282, -20657=>17283, -20666=>17284, -20667=>17285, -20676=>17286, -20679=>17287, -20723=>17288, -131969=>17289, -20686=>17290, -131953=>17291, -20692=>17292, -20705=>17293, -13458=>17294, -132089=>17295, -20759=>17296, -132170=>17297, -20832=>17298, -132361=>17299, -20851=>17300, -20867=>17301, -20875=>17302, -13500=>17303, -20888=>17304, -20899=>17305, -20909=>17306, -13511=>17307, -132566=>17308, -20979=>17309, -21010=>17310, -21014=>17311, -132943=>17312, -21077=>17313, -21084=>17314, -21100=>17315, -21111=>17316, -21124=>17317, -21122=>17318, -133127=>17319, -21144=>17320, -133178=>17321, -21156=>17322, -21178=>17323, -21179=>17324, -21194=>17325, -21201=>17326, -133305=>17327, -21239=>17328, -21301=>17329, -21314=>17330, -133500=>17331, -133533=>17332, -21351=>17333, -21370=>17334, -21412=>17335, -21428=>17336, -133843=>17337, -21431=>17338, -21440=>17339, -133917=>17340, -13661=>17341, -13662=>17342, -21461=>17343, -13667=>17344, -21492=>17345, -21540=>17346, -21544=>17347, -13678=>17348, -21571=>17349, -21602=>17350, -21612=>17351, -21653=>17352, -21664=>17353, -21670=>17354, -21678=>17355, -21687=>17356, -21690=>17357, -21699=>17358, -134469=>17359, -21740=>17360, -21743=>17361, -21745=>17362, -21747=>17363, -21760=>17364, -21761=>17365, -21769=>17366, -21820=>17367, -21825=>17368, -13734=>17369, -21831=>17370, -13736=>17371, -21860=>17372, -134625=>17373, -21885=>17374, -21890=>17375, -21905=>17376, -13765=>17377, -21970=>17378, -134805=>17379, -134765=>17380, -21951=>17381, -21961=>17382, -21964=>17383, -21969=>17384, -21981=>17385, -13786=>17386, -21986=>17387, -134756=>17388, -21993=>17389, -22056=>17390, -135007=>17391, -22023=>17392, -22032=>17393, -22064=>17394, -13812=>17395, -22077=>17396, -22080=>17397, -22087=>17398, -22110=>17399, -22112=>17400, -22125=>17401, -13829=>17402, -22152=>17403, -22156=>17404, -22173=>17405, -22184=>17406, -22194=>17407, -22213=>17408, -22221=>17409, -22239=>17410, -22248=>17411, -22262=>17412, -22263=>17413, -135681=>17414, -135765=>17415, -22313=>17416, -135803=>17417, -22341=>17418, -22342=>17419, -22349=>17420, -135796=>17421, -22376=>17422, -22383=>17423, -22387=>17424, -22388=>17425, -22389=>17426, -22395=>17427, -135908=>17428, -135895=>17429, -22426=>17430, -22429=>17431, -22430=>17432, -22440=>17433, -22487=>17434, -135933=>17435, -22476=>17436, -135990=>17437, -136004=>17438, -22494=>17439, -22512=>17440, -13898=>17441, -22520=>17442, -22523=>17443, -22525=>17444, -22532=>17445, -22558=>17446, -22567=>17447, -22585=>17448, -136132=>17449, -22601=>17450, -22604=>17451, -22631=>17452, -22666=>17453, -22667=>17454, -22669=>17455, -22671=>17456, -22672=>17457, -22676=>17458, -22685=>17459, -22698=>17460, -22705=>17461, -136301=>17462, -22723=>17463, -22733=>17464, -22754=>17465, -22771=>17466, -22772=>17467, -22789=>17468, -22790=>17469, -22797=>17470, -22804=>17471, -136663=>17472, -13969=>17473, -22845=>17474, -13977=>17475, -22854=>17476, -13974=>17477, -158761=>17478, -22879=>17479, -136775=>17480, -22901=>17481, -22902=>17482, -22908=>17483, -22943=>17484, -22958=>17485, -22972=>17486, -22984=>17487, -22989=>17488, -23006=>17489, -23015=>17490, -23022=>17491, -136966=>17492, -137026=>17493, -14031=>17494, -23053=>17495, -23063=>17496, -23079=>17497, -23085=>17498, -23141=>17499, -23162=>17500, -23179=>17501, -23196=>17502, -23199=>17503, -23200=>17504, -23202=>17505, -23217=>17506, -23221=>17507, -23226=>17508, -23231=>17509, -23258=>17510, -23260=>17511, -23269=>17512, -23280=>17513, -23278=>17514, -23285=>17515, -23304=>17516, -23319=>17517, -23348=>17518, -23372=>17519, -23378=>17520, -23400=>17521, -23407=>17522, -23425=>17523, -23428=>17524, -137667=>17525, -23446=>17526, -23468=>17527, -14177=>17528, -14178=>17529, -23502=>17530, -23510=>17531, -14188=>17532, -14187=>17533, -23537=>17534, -23549=>17535, -14197=>17536, -23555=>17537, -23593=>17538, -138326=>17539, -23647=>17540, -23655=>17541, -23656=>17542, -23664=>17543, -138541=>17544, -138565=>17545, -138616=>17546, -138594=>17547, -23688=>17548, -23690=>17549, -14273=>17550, -138657=>17551, -138652=>17552, -23712=>17553, -23714=>17554, -23719=>17555, -138642=>17556, -23725=>17557, -23733=>17558, -138679=>17559, -23753=>17560, -138720=>17561, -138803=>17562, -23814=>17563, -23824=>17564, -23851=>17565, -23837=>17566, -23840=>17567, -23857=>17568, -23865=>17569, -14312=>17570, -23905=>17571, -23914=>17572, -14324=>17573, -23920=>17574, -139038=>17575, -14333=>17576, -23944=>17577, -14336=>17578, -23959=>17579, -23984=>17580, -23988=>17581, -139126=>17582, -24017=>17583, -24023=>17584, -139258=>17585, -24036=>17586, -24041=>17587, -14383=>17588, -14390=>17589, -14400=>17590, -24095=>17591, -24126=>17592, -24137=>17593, -14428=>17594, -24150=>17595, -14433=>17596, -24173=>17597, -24174=>17598, -139643=>17599, -24229=>17600, -24236=>17601, -24249=>17602, -24262=>17603, -24281=>17604, -140062=>17605, -24317=>17606, -24328=>17607, -140205=>17608, -24350=>17609, -24391=>17610, -24419=>17611, -24434=>17612, -24446=>17613, -24463=>17614, -24482=>17615, -24519=>17616, -24523=>17617, -24530=>17618, -24531=>17619, -24532=>17620, -24546=>17621, -24558=>17622, -24559=>17623, -24563=>17624, -14615=>17625, -24610=>17626, -24612=>17627, -14618=>17628, -24652=>17629, -24725=>17630, -24744=>17631, -141043=>17632, -24753=>17633, -24766=>17634, -24776=>17635, -24793=>17636, -24814=>17637, -24821=>17638, -24848=>17639, -24857=>17640, -24862=>17641, -24890=>17642, -14703=>17643, -24897=>17644, -24902=>17645, -24928=>17646, -141403=>17647, -24978=>17648, -24979=>17649, -24983=>17650, -24997=>17651, -25005=>17652, -141483=>17653, -25045=>17654, -25053=>17655, -25077=>17656, -141711=>17657, -25123=>17658, -25170=>17659, -25185=>17660, -25188=>17661, -25211=>17662, -25197=>17663, -25203=>17664, -25241=>17665, -25301=>17666, -142008=>17667, -25341=>17668, -25347=>17669, -25360=>17670, -142159=>17671, -142160=>17672, -25394=>17673, -25397=>17674, -25403=>17675, -25404=>17676, -25409=>17677, -25412=>17678, -25422=>17679, -142150=>17680, -25433=>17681, -142365=>17682, -142246=>17683, -25452=>17684, -25497=>17685, -142372=>17686, -25492=>17687, -25533=>17688, -25556=>17689, -25557=>17690, -25568=>17691, -25579=>17692, -25580=>17693, -25586=>17694, -25630=>17695, -25637=>17696, -25641=>17697, -25647=>17698, -25690=>17699, -25693=>17700, -25715=>17701, -25725=>17702, -25735=>17703, -25745=>17704, -25759=>17705, -25803=>17706, -25804=>17707, -25813=>17708, -25815=>17709, -142817=>17710, -25828=>17711, -25855=>17712, -14958=>17713, -25871=>17714, -25876=>17715, -14963=>17716, -25886=>17717, -25906=>17718, -25924=>17719, -25940=>17720, -25963=>17721, -25978=>17722, -25988=>17723, -25994=>17724, -26034=>17725, -26037=>17726, -26040=>17727, -26047=>17728, -26057=>17729, -26068=>17730, -15062=>17731, -26105=>17732, -26108=>17733, -26116=>17734, -26120=>17735, -26145=>17736, -26154=>17737, -26181=>17738, -26193=>17739, -26190=>17740, -15082=>17741, -143811=>17742, -143861=>17743, -143798=>17744, -26218=>17745, -26220=>17746, -26221=>17747, -26235=>17748, -26240=>17749, -26256=>17750, -26258=>17751, -15118=>17752, -26285=>17753, -26289=>17754, -26293=>17755, -15130=>17756, -15132=>17757, -15063=>17758, -26369=>17759, -26386=>17760, -144242=>17761, -26393=>17762, -144339=>17763, -144338=>17764, -26445=>17765, -26452=>17766, -26461=>17767, -144336=>17768, -144356=>17769, -144341=>17770, -26484=>17771, -144346=>17772, -26514=>17773, -144351=>17774, -33635=>17775, -26640=>17776, -26563=>17777, -26568=>17778, -26578=>17779, -26587=>17780, -26615=>17781, -144458=>17782, -144465=>17783, -144459=>17784, -26648=>17785, -26655=>17786, -26669=>17787, -144485=>17788, -26675=>17789, -26683=>17790, -26686=>17791, -26693=>17792, -26697=>17793, -26700=>17794, -26709=>17795, -26711=>17796, -15223=>17797, -26731=>17798, -26734=>17799, -26748=>17800, -26754=>17801, -26768=>17802, -26774=>17803, -15213=>17804, -26776=>17805, -26777=>17806, -26778=>17807, -26780=>17808, -26794=>17809, -26795=>17810, -26804=>17811, -26811=>17812, -26875=>17813, -144612=>17814, -144730=>17815, -26819=>17816, -26821=>17817, -26828=>17818, -26841=>17819, -26852=>17820, -26853=>17821, -26860=>17822, -26871=>17823, -26883=>17824, -26887=>17825, -15239=>17826, -144788=>17827, -15245=>17828, -26950=>17829, -26985=>17830, -26988=>17831, -27002=>17832, -27026=>17833, -15268=>17834, -27030=>17835, -27056=>17836, -27066=>17837, -27068=>17838, -27072=>17839, -27089=>17840, -144953=>17841, -144967=>17842, -144952=>17843, -27107=>17844, -27118=>17845, -27119=>17846, -27123=>17847, -15309=>17848, -27124=>17849, -27134=>17850, -27153=>17851, -27162=>17852, -27165=>17853, -145180=>17854, -27186=>17855, -27187=>17856, -27199=>17857, -27209=>17858, -27258=>17859, -27214=>17860, -27218=>17861, -27236=>17862, -145164=>17863, -27275=>17864, -15344=>17865, -27297=>17866, -145252=>17867, -27307=>17868, -27325=>17869, -27334=>17870, -27348=>17871, -27344=>17872, -27357=>17873, -145407=>17874, -145383=>17875, -27377=>17876, -27378=>17877, -27379=>17878, -27389=>17879, -145444=>17880, -27403=>17881, -27407=>17882, -27408=>17883, -27409=>17884, -145469=>17885, -27415=>17886, -15398=>17887, -27439=>17888, -27466=>17889, -27480=>17890, -27500=>17891, -27509=>17892, -11934=>17893, -27514=>17893, -27521=>17894, -27547=>17895, -27566=>17896, -146072=>17897, -27581=>17898, -27591=>17899, -27592=>17900, -27593=>17901, -27610=>17902, -27622=>17903, -27623=>17904, -27630=>17905, -27650=>17906, -27658=>17907, -27662=>17908, -27702=>17909, -146559=>17910, -27725=>17911, -27739=>17912, -27757=>17913, -27780=>17914, -27785=>17915, -15555=>17916, -27796=>17917, -27799=>17918, -27821=>17919, -27842=>17920, -15570=>17921, -27868=>17922, -27881=>17923, -27885=>17924, -146688=>17925, -27904=>17926, -27940=>17927, -27942=>17928, -27943=>17929, -27751=>17930, -27951=>17931, -27964=>17932, -27995=>17933, -28000=>17934, -28016=>17935, -28032=>17936, -28033=>17937, -28042=>17938, -28045=>17939, -28049=>17940, -28056=>17941, -146752=>17942, -146938=>17943, -146937=>17944, -146899=>17945, -28075=>17946, -28078=>17947, -28084=>17948, -28098=>17949, -27956=>17950, -28104=>17951, -28110=>17952, -28127=>17953, -28150=>17954, -28214=>17955, -28190=>17956, -15633=>17957, -28210=>17958, -28232=>17959, -28233=>17960, -28235=>17961, -28236=>17962, -28239=>17963, -28243=>17964, -28244=>17965, -28247=>17966, -28259=>17967, -15646=>17968, -28307=>17969, -28327=>17970, -28340=>17971, -28355=>17972, -28469=>17973, -28395=>17974, -28409=>17975, -28411=>17976, -28426=>17977, -28428=>17978, -28440=>17979, -28453=>17980, -28470=>17981, -28476=>17982, -147326=>17983, -28498=>17984, -28503=>17985, -28512=>17986, -28520=>17987, -28560=>17988, -28566=>17989, -28606=>17990, -28575=>17991, -28581=>17992, -28591=>17993, -15716=>17994, -28616=>17995, -28617=>17996, -28649=>17997, -147606=>17998, -28668=>17999, -28672=>18000, -28682=>18001, -28707=>18002, -147715=>18003, -28730=>18004, -28739=>18005, -28743=>18006, -28747=>18007, -15770=>18008, -28773=>18009, -28777=>18010, -28782=>18011, -28790=>18012, -28806=>18013, -28823=>18014, -147910=>18015, -28831=>18016, -28849=>18017, -147966=>18018, -28908=>18019, -28874=>18020, -28881=>18021, -28931=>18022, -28934=>18023, -28936=>18024, -28940=>18025, -15808=>18026, -28975=>18027, -29008=>18028, -29011=>18029, -29022=>18030, -15828=>18031, -29078=>18032, -29056=>18033, -29083=>18034, -29088=>18035, -29090=>18036, -29102=>18037, -29103=>18038, -148412=>18039, -29145=>18040, -29148=>18041, -29191=>18042, -15877=>18043, -29236=>18044, -29241=>18045, -29250=>18046, -29271=>18047, -29283=>18048, -149033=>18049, -29294=>18050, -29295=>18051, -29304=>18052, -29311=>18053, -29326=>18054, -149157=>18055, -29358=>18056, -29360=>18057, -29377=>18058, -15968=>18059, -29388=>18060, -15974=>18061, -15976=>18062, -29427=>18063, -29434=>18064, -29447=>18065, -29458=>18066, -29464=>18067, -29465=>18068, -16003=>18069, -29497=>18070, -29484=>18071, -29491=>18072, -29501=>18073, -29522=>18074, -16020=>18075, -29547=>18076, -149654=>18077, -29550=>18078, -29551=>18079, -29553=>18080, -29569=>18081, -29578=>18082, -29588=>18083, -29592=>18084, -29596=>18085, -29605=>18086, -29625=>18087, -29631=>18088, -29637=>18089, -29643=>18090, -29665=>18091, -29671=>18092, -29689=>18093, -29715=>18094, -29690=>18095, -29697=>18096, -29779=>18097, -29760=>18098, -29763=>18099, -29778=>18100, -29789=>18101, -29825=>18102, -29832=>18103, -150093=>18104, -29842=>18105, -29847=>18106, -29849=>18107, -29857=>18108, -29861=>18109, -29866=>18110, -29881=>18111, -29883=>18112, -29882=>18113, -29910=>18114, -29912=>18115, -29931=>18116, -150358=>18117, -29946=>18118, -150383=>18119, -29984=>18120, -29988=>18121, -29994=>18122, -16215=>18123, -150550=>18124, -30013=>18125, -30014=>18126, -30016=>18127, -30024=>18128, -30032=>18129, -30034=>18130, -30066=>18131, -30065=>18132, -30074=>18133, -30077=>18134, -30078=>18135, -30092=>18136, -16245=>18137, -30114=>18138, -16247=>18139, -30128=>18140, -30135=>18141, -30143=>18142, -30144=>18143, -30150=>18144, -30159=>18145, -30163=>18146, -30173=>18147, -30175=>18148, -30176=>18149, -30183=>18150, -30190=>18151, -30193=>18152, -30211=>18153, -30232=>18154, -30215=>18155, -30223=>18156, -16302=>18157, -151054=>18158, -30227=>18159, -30235=>18160, -30236=>18161, -151095=>18162, -30245=>18163, -30248=>18164, -30268=>18165, -30259=>18166, -151146=>18167, -16329=>18168, -30273=>18169, -151179=>18170, -30281=>18171, -30293=>18172, -16343=>18173, -30318=>18174, -30357=>18175, -30369=>18176, -30368=>18177, -30375=>18178, -30376=>18179, -30383=>18180, -151626=>18181, -30409=>18182, -151637=>18183, -30440=>18184, -151842=>18185, -30487=>18186, -30490=>18187, -30509=>18188, -30517=>18189, -151977=>18190, -16441=>18191, -152037=>18192, -152013=>18193, -30552=>18194, -152094=>18195, -30588=>18196, -152140=>18197, -16472=>18198, -30618=>18199, -30623=>18200, -30626=>18201, -30628=>18202, -30686=>18203, -30687=>18204, -30692=>18205, -30698=>18206, -30700=>18207, -30715=>18208, -152622=>18209, -30725=>18210, -30729=>18211, -30733=>18212, -30745=>18213, -30764=>18214, -30791=>18215, -30826=>18216, -152793=>18217, -30858=>18218, -30868=>18219, -30884=>18220, -30877=>18221, -30879=>18222, -30907=>18223, -30933=>18224, -30950=>18225, -30969=>18226, -30970=>18227, -30974=>18228, -152999=>18229, -30992=>18230, -31003=>18231, -31013=>18232, -31050=>18233, -31064=>18234, -16645=>18235, -31079=>18236, -31090=>18237, -31125=>18238, -31137=>18239, -31145=>18240, -31156=>18241, -31170=>18242, -31175=>18243, -31180=>18244, -31181=>18245, -31190=>18246, -16712=>18247, -153513=>18248, -153524=>18249, -16719=>18250, -31242=>18251, -31253=>18252, -31259=>18253, -16739=>18254, -31288=>18255, -31303=>18256, -31318=>18257, -31321=>18258, -31324=>18259, -31327=>18260, -31335=>18261, -31338=>18262, -31349=>18263, -31362=>18264, -31370=>18265, -31376=>18266, -31404=>18267, -154068=>18268, -16820=>18269, -31417=>18270, -31422=>18271, -16831=>18272, -31436=>18273, -31464=>18274, -31476=>18275, -154340=>18276, -154339=>18277, -154353=>18278, -31549=>18279, -31530=>18280, -31534=>18281, -31535=>18282, -16870=>18283, -16883=>18284, -31615=>18285, -31553=>18286, -16878=>18287, -31573=>18288, -31609=>18289, -31588=>18290, -31590=>18291, -31603=>18292, -154546=>18293, -16903=>18294, -31632=>18295, -31643=>18296, -16910=>18297, -31669=>18298, -31676=>18299, -31685=>18300, -31690=>18301, -154699=>18302, -154724=>18303, -31700=>18304, -31702=>18305, -31706=>18306, -31722=>18307, -31728=>18308, -31747=>18309, -31758=>18310, -31813=>18311, -31818=>18312, -31831=>18313, -31838=>18314, -31841=>18315, -31849=>18316, -31855=>18317, -155182=>18318, -155222=>18319, -155237=>18320, -31910=>18321, -155234=>18322, -31926=>18323, -31927=>18324, -155352=>18325, -31940=>18326, -155330=>18327, -31949=>18328, -155368=>18329, -155427=>18330, -31974=>18331, -155484=>18332, -31989=>18333, -32003=>18334, -17094=>18335, -32018=>18336, -32030=>18337, -155616=>18338, -155604=>18339, -32061=>18340, -32062=>18341, -32064=>18342, -32071=>18343, -155660=>18344, -155643=>18345, -17110=>18346, -32090=>18347, -32106=>18348, -32112=>18349, -17117=>18350, -32127=>18351, -155671=>18352, -32136=>18353, -32151=>18354, -155744=>18355, -32157=>18356, -32167=>18357, -32170=>18358, -32182=>18359, -32192=>18360, -32215=>18361, -32217=>18362, -32230=>18363, -17154=>18364, -155885=>18365, -64088=>18366, -32272=>18367, -32279=>18368, -32285=>18369, -32295=>18370, -32300=>18371, -32325=>18372, -32373=>18373, -32382=>18374, -32390=>18375, -32391=>18376, -17195=>18377, -32410=>18378, -17219=>18379, -32572=>18380, -32571=>18381, -32574=>18382, -32579=>18383, -13505=>18384, -156272=>18385, -156294=>18386, -32611=>18387, -32612=>18388, -32621=>18389, -32637=>18390, -32638=>18391, -32656=>18392, -20859=>18393, -146702=>18394, -32662=>18395, -32668=>18396, -32685=>18397, -156674=>18398, -32707=>18399, -32719=>18400, -32739=>18401, -32754=>18402, -32778=>18403, -32776=>18404, -32790=>18405, -32812=>18406, -32816=>18407, -32835=>18408, -32870=>18409, -32891=>18410, -32921=>18411, -32924=>18412, -32932=>18413, -32935=>18414, -32952=>18415, -157310=>18416, -32965=>18417, -32981=>18418, -32998=>18419, -33037=>18420, -33013=>18421, -33019=>18422, -17390=>18423, -33077=>18424, -33054=>18425, -17392=>18426, -33060=>18427, -33063=>18428, -33068=>18429, -157469=>18430, -33085=>18431, -17416=>18432, -33129=>18433, -17431=>18434, -17436=>18435, -33157=>18436, -17442=>18437, -33176=>18438, -33202=>18439, -33217=>18440, -33219=>18441, -33238=>18442, -33243=>18443, -157917=>18444, -33252=>18445, -157930=>18446, -33260=>18447, -33277=>18448, -33279=>18449, -158063=>18450, -33284=>18451, -158173=>18452, -33305=>18453, -33314=>18454, -158238=>18455, -33340=>18456, -33353=>18457, -33349=>18458, -158296=>18459, -17526=>18460, -17530=>18461, -33367=>18462, -158348=>18463, -33372=>18464, -33379=>18465, -158391=>18466, -17553=>18467, -33405=>18468, -33407=>18469, -33411=>18470, -33418=>18471, -33427=>18472, -33447=>18473, -33448=>18474, -33458=>18475, -33460=>18476, -33466=>18477, -33468=>18478, -33506=>18479, -33512=>18480, -33527=>18481, -33543=>18482, -33544=>18483, -33548=>18484, -33620=>18485, -33563=>18486, -33565=>18487, -33584=>18488, -33596=>18489, -33604=>18490, -33623=>18491, -17598=>18492, -17620=>18493, -17587=>18494, -33684=>18495, -33685=>18496, -33691=>18497, -33693=>18498, -33737=>18499, -33744=>18500, -33748=>18501, -33757=>18502, -33765=>18503, -33785=>18504, -33813=>18505, -158835=>18506, -33815=>18507, -33849=>18508, -33871=>18509, -33873=>18510, -33874=>18511, -33881=>18512, -33882=>18513, -33884=>18514, -158941=>18515, -33893=>18516, -33912=>18517, -33916=>18518, -33921=>18519, -17677=>18520, -33943=>18521, -33958=>18522, -33982=>18523, -17672=>18524, -33998=>18525, -33999=>18526, -34003=>18527, -159333=>18528, -34023=>18529, -34026=>18530, -34031=>18531, -34033=>18532, -34042=>18533, -34075=>18534, -34084=>18535, -34085=>18536, -34091=>18537, -34127=>18538, -34159=>18539, -17731=>18540, -34129=>18541, -34145=>18542, -34146=>18543, -159636=>18544, -34171=>18545, -34173=>18546, -34175=>18547, -34177=>18548, -34182=>18549, -34195=>18550, -34205=>18551, -34207=>18552, -159736=>18553, -159734=>18554, -159735=>18555, -34236=>18556, -34247=>18557, -34250=>18558, -34264=>18559, -34265=>18560, -34271=>18561, -34273=>18562, -34278=>18563, -34294=>18564, -34304=>18565, -34321=>18566, -34334=>18567, -34337=>18568, -34340=>18569, -34343=>18570, -160013=>18571, -34361=>18572, -34364=>18573, -160057=>18574, -34368=>18575, -34387=>18576, -34390=>18577, -34423=>18578, -34439=>18579, -34441=>18580, -34460=>18581, -34461=>18582, -34481=>18583, -34483=>18584, -34497=>18585, -34499=>18586, -34513=>18587, -34517=>18588, -34519=>18589, -34531=>18590, -34534=>18591, -17848=>18592, -34565=>18593, -34567=>18594, -34574=>18595, -34576=>18596, -34591=>18597, -34593=>18598, -34595=>18599, -34609=>18600, -34618=>18601, -34624=>18602, -34627=>18603, -34641=>18604, -34648=>18605, -34660=>18606, -34661=>18607, -34674=>18608, -34684=>18609, -160731=>18610, -160730=>18611, -34727=>18612, -34697=>18613, -34699=>18614, -34707=>18615, -34720=>18616, -160766=>18617, -17893=>18618, -34750=>18619, -160784=>18620, -34753=>18621, -34766=>18622, -34783=>18623, -160841=>18624, -34787=>18625, -34789=>18626, -34790=>18627, -34794=>18628, -34835=>18629, -34856=>18630, -34862=>18631, -34866=>18632, -34876=>18633, -17935=>18634, -34890=>18635, -34904=>18636, -161301=>18637, -161300=>18638, -34921=>18639, -161329=>18640, -34927=>18641, -34976=>18642, -35004=>18643, -35008=>18644, -161427=>18645, -35025=>18646, -35027=>18647, -17985=>18648, -35073=>18649, -161550=>18650, -35127=>18651, -161571=>18652, -35138=>18653, -35141=>18654, -35145=>18655, -161618=>18656, -35170=>18657, -35209=>18658, -35216=>18659, -35231=>18660, -35248=>18661, -35255=>18662, -35288=>18663, -35307=>18664, -18081=>18665, -35315=>18666, -35325=>18667, -35327=>18668, -18095=>18669, -35345=>18670, -35348=>18671, -162181=>18672, -35361=>18673, -35381=>18674, -35390=>18675, -35397=>18676, -35405=>18677, -35416=>18678, -35502=>18679, -35472=>18680, -35511=>18681, -35543=>18682, -35580=>18683, -162436=>18684, -35594=>18685, -35589=>18686, -35597=>18687, -35612=>18688, -35629=>18689, -18188=>18690, -35665=>18691, -35678=>18692, -35702=>18693, -35713=>18694, -35723=>18695, -35732=>18696, -35733=>18697, -35897=>18698, -162739=>18699, -35901=>18700, -162750=>18701, -162759=>18702, -35909=>18703, -35919=>18704, -35927=>18705, -35945=>18706, -35949=>18707, -163000=>18708, -35987=>18709, -35986=>18710, -35993=>18711, -18276=>18712, -35995=>18713, -36054=>18714, -36053=>18715, -163232=>18716, -36081=>18717, -163344=>18718, -36105=>18719, -36110=>18720, -36296=>18721, -36313=>18722, -36364=>18723, -18429=>18724, -36349=>18725, -36358=>18726, -163978=>18727, -36372=>18728, -36374=>18729, -36385=>18730, -36386=>18731, -36391=>18732, -164027=>18733, -18454=>18734, -36406=>18735, -36409=>18736, -36436=>18737, -36450=>18738, -36461=>18739, -36463=>18740, -36504=>18741, -36510=>18742, -36533=>18743, -36539=>18744, -164482=>18745, -18510=>18746, -164595=>18747, -36608=>18748, -36616=>18749, -36651=>18750, -36672=>18751, -36682=>18752, -36696=>18753, -164876=>18754, -36772=>18755, -36788=>18756, -164949=>18757, -36801=>18758, -36806=>18759, -64036=>18760, -36810=>18761, -36813=>18762, -36819=>18763, -36821=>18764, -36849=>18765, -36853=>18766, -36859=>18767, -36876=>18768, -36919=>18769, -165227=>18770, -36931=>18771, -36957=>18772, -165320=>18773, -165321=>18774, -36997=>18775, -37004=>18776, -37008=>18777, -37025=>18778, -18613=>18779, -37040=>18780, -37046=>18781, -37059=>18782, -37064=>18783, -165591=>18784, -37084=>18785, -37087=>18786, -165626=>18787, -37110=>18788, -37106=>18789, -37120=>18790, -37099=>18791, -37118=>18792, -37119=>18793, -37124=>18794, -37126=>18795, -37144=>18796, -37150=>18797, -37175=>18798, -37177=>18799, -37190=>18800, -37191=>18801, -37207=>18802, -37209=>18803, -37236=>18804, -37241=>18805, -37253=>18806, -37299=>18807, -37302=>18808, -37315=>18809, -37316=>18810, -166217=>18811, -166214=>18812, -37356=>18813, -37377=>18814, -37398=>18815, -37399=>18816, -166251=>18817, -37442=>18818, -37450=>18819, -37462=>18820, -37473=>18821, -37477=>18822, -37480=>18823, -166280=>18824, -37500=>18825, -37501=>18826, -37503=>18827, -37513=>18828, -37517=>18829, -37527=>18830, -37529=>18831, -37535=>18832, -37547=>18833, -166330=>18834, -166331=>18835, -37554=>18836, -37567=>18837, -37568=>18838, -37574=>18839, -37582=>18840, -37605=>18841, -37649=>18842, -166430=>18843, -166441=>18844, -37623=>18845, -37673=>18846, -166513=>18847, -166467=>18848, -37713=>18849, -37722=>18850, -37739=>18851, -37745=>18852, -37747=>18853, -37793=>18854, -166553=>18855, -166605=>18856, -37768=>18857, -37771=>18858, -37775=>18859, -37790=>18860, -37877=>18861, -166628=>18862, -166621=>18863, -37873=>18864, -37831=>18865, -37852=>18866, -37863=>18867, -37897=>18868, -37910=>18869, -37911=>18870, -37883=>18871, -37938=>18872, -37947=>18873, -166849=>18874, -166895=>18875, -37997=>18876, -37999=>18877, -38265=>18878, -38278=>18879, -38284=>18880, -38285=>18881, -167184=>18882, -167281=>18883, -38344=>18884, -167419=>18885, -167455=>18886, -38444=>18887, -38451=>18888, -38452=>18889, -167478=>18890, -38460=>18891, -38497=>18892, -167561=>18893, -38530=>18894, -167659=>18895, -38554=>18896, -167730=>18897, -18919=>18898, -38579=>18899, -38586=>18900, -38589=>18901, -18938=>18902, -167928=>18903, -38616=>18904, -38618=>18905, -38621=>18906, -18948=>18907, -38676=>18908, -38691=>18909, -18985=>18910, -38710=>18911, -38721=>18912, -38727=>18913, -38743=>18914, -38747=>18915, -38762=>18916, -168608=>18917, -168625=>18918, -38806=>18919, -38814=>18920, -38833=>18921, -38834=>18922, -38846=>18923, -38860=>18924, -38865=>18925, -38868=>18926, -38872=>18927, -38881=>18928, -38897=>18929, -38916=>18930, -38925=>18931, -38932=>18932, -38934=>18933, -19132=>18934, -169104=>18935, -38962=>18936, -38963=>18937, -38949=>18938, -38983=>18939, -39014=>18940, -39083=>18941, -39085=>18942, -39088=>18943, -169423=>18944, -39095=>18945, -39099=>18946, -39100=>18947, -39106=>18948, -39111=>18949, -39115=>18950, -39137=>18951, -39139=>18952, -39146=>18953, -39152=>18954, -39153=>18955, -39155=>18956, -39176=>18957, -19259=>18958, -169712=>18959, -39190=>18960, -39191=>18961, -169753=>18962, -39194=>18963, -39195=>18964, -39196=>18965, -169808=>18966, -39217=>18967, -39226=>18968, -39227=>18969, -39228=>18970, -39233=>18971, -39238=>18972, -39246=>18973, -39264=>18974, -39331=>18975, -39334=>18976, -39357=>18977, -39359=>18978, -39363=>18979, -39380=>18980, -39385=>18981, -39390=>18982, -170182=>18983, -39408=>18984, -39417=>18985, -39420=>18986, -39434=>18987, -39441=>18988, -39450=>18989, -39456=>18990, -39473=>18991, -39492=>18992, -39500=>18993, -39512=>18994, -19394=>18995, -39599=>18996, -19402=>18997, -39607=>18998, -19410=>18999, -39609=>19000, -170610=>19001, -39622=>19002, -39632=>19003, -39634=>19004, -39637=>19005, -39648=>19006, -39653=>19007, -39657=>19008, -39692=>19009, -39696=>19010, -39698=>19011, -39702=>19012, -39708=>19013, -39723=>19014, -39741=>19015, -19488=>19016, -39755=>19017, -39779=>19018, -39781=>19019, -39787=>19020, -39788=>19021, -39798=>19022, -39799=>19023, -39846=>19024, -39852=>19025, -171483=>19026, -39858=>19027, -39864=>19028, -39870=>19029, -39923=>19030, -39896=>19031, -39901=>19032, -39914=>19033, -39919=>19034, -39918=>19035, -171541=>19036, -171658=>19037, -171593=>19038, -39958=>19039, -39960=>19040, -39961=>19041, -39962=>19042, -39965=>19043, -39970=>19044, -39977=>19045, -171716=>19046, -39985=>19047, -39991=>19048, -40005=>19049, -40028=>19050, -171753=>19051, -40009=>19052, -40010=>19053, -171739=>19054, -40020=>19055, -40024=>19056, -40027=>19057, -40029=>19058, -40031=>19059, -40041=>19060, -40042=>19061, -40043=>19062, -40045=>19063, -40046=>19064, -40050=>19065, -40053=>19066, -40058=>19067, -40166=>19068, -40178=>19069, -40203=>19070, -171982=>19071, -171991=>19071, -40209=>19072, -40215=>19073, -40216=>19074, -172079=>19075, -19652=>19076, -172058=>19077, -40242=>19078, -19665=>19079, -40266=>19080, -40287=>19081, -40290=>19082, -172281=>19083, -172162=>19084, -40307=>19085, -40310=>19086, -40311=>19087, -40324=>19088, -40345=>19089, -40353=>19090, -40383=>19091, -40373=>19092, -40377=>19093, -40381=>19094, -40393=>19095, -40410=>19096, -40416=>19097, -40419=>19098, -19719=>19099, -40458=>19100, -40450=>19101, -40461=>19102, -40476=>19103, -40571=>19104, -139800=>19105, -40576=>19106, -40581=>19107, -40603=>19108, -172940=>19109, -40637=>19110, -173111=>19111, -40671=>19112, -40703=>19113, -40706=>19114, -19831=>19115, -40707=>19116, -40762=>19117, -40765=>19118, -40774=>19119, -40787=>19120, -40789=>19121, -40792=>19122, -173553=>19123, -40797=>19124, -173570=>19125, -40809=>19126, -40813=>19127, -40816=>19128, -173746=>19129, -11948=>19130, -13844=>19131, -14509=>19132, -15820=>19133, -16348=>19134, -17854=>19135, -17936=>19136, -19326=>19137, -19512=>19138, -19681=>19139, -19980=>19140, -20003=>19141, -20004=>19142, -20089=>19143, -20211=>19144, -20236=>19145, -20249=>19146, -20267=>19147, -20270=>19148, -20273=>19149, -20356=>19150, -20382=>19151, -20407=>19152, -20484=>19153, -20492=>19154, -20556=>19155, -20575=>19156, -20578=>19157, -20599=>19158, -20622=>19159, -20638=>19160, -20642=>19161, -20675=>19162, -20712=>19163, -20721=>19164, -20734=>19165, -20743=>19166, -20748=>19167, -20749=>19168, -20750=>19169, -20787=>19170, -20792=>19171, -20852=>19172, -20868=>19173, -20920=>19174, -20922=>19175, -20936=>19176, -20943=>19177, -20945=>19178, -20947=>19179, -20948=>19180, -20952=>19181, -20959=>19182, -20997=>19183, -21030=>19184, -21032=>19185, -21035=>19186, -21041=>19187, -21042=>19188, -21045=>19189, -21052=>19190, -21082=>19191, -21088=>19192, -21102=>19193, -21112=>19194, -21113=>19195, -21130=>19196, -21132=>19197, -21217=>19198, -21225=>19199, -21233=>19200, -21251=>19201, -21265=>19202, -21279=>19203, -21293=>19204, -21298=>19205, -21309=>19206, -21349=>19207, -21357=>19208, -21369=>19209, -21374=>19210, -21396=>19211, -21401=>19212, -21418=>19213, -21423=>19214, -21434=>19215, -21441=>19216, -21444=>19217, -21445=>19218, -21472=>19219, -21523=>19220, -21546=>19221, -21553=>19222, -21556=>19223, -21557=>19224, -21580=>19225, -21671=>19226, -21674=>19227, -21681=>19228, -21691=>19229, -21710=>19230, -21738=>19231, -21756=>19232, -21765=>19233, -21768=>19234, -21781=>19235, -21799=>19236, -21802=>19237, -21814=>19238, -21841=>19239, -21862=>19240, -21903=>19241, -21906=>19242, -21908=>19243, -21924=>19244, -21938=>19245, -21955=>19246, -21958=>19247, -21971=>19248, -21979=>19249, -21996=>19250, -21998=>19251, -22001=>19252, -22006=>19253, -22008=>19254, -22021=>19255, -22029=>19256, -22033=>19257, -22034=>19258, -22060=>19259, -22069=>19260, -22073=>19261, -22093=>19262, -22100=>19263, -22149=>19264, -22175=>19265, -22182=>19266, -22199=>19267, -22220=>19268, -22223=>19269, -22233=>19270, -22241=>19271, -22251=>19272, -22253=>19273, -22257=>19274, -22279=>19275, -22284=>19276, -22298=>19277, -22299=>19278, -22301=>19279, -22316=>19280, -22318=>19281, -22333=>19282, -22334=>19283, -22367=>19284, -22379=>19285, -22381=>19286, -22394=>19287, -22403=>19288, -22423=>19289, -22446=>19290, -22485=>19291, -22503=>19292, -22541=>19293, -22566=>19294, -22605=>19295, -22607=>19296, -22623=>19297, -22637=>19298, -22655=>19299, -22657=>19300, -22680=>19301, -22716=>19302, -22815=>19303, -22819=>19304, -22873=>19305, -22905=>19306, -22935=>19307, -22959=>19308, -22963=>19309, -23007=>19310, -23025=>19311, -23032=>19312, -23218=>19313, -23224=>19314, -23274=>19315, -23286=>19316, -23323=>19317, -23325=>19318, -23329=>19319, -23352=>19320, -23479=>19321, -23511=>19322, -23520=>19323, -23583=>19324, -23594=>19325, -23596=>19326, -23606=>19327, -23641=>19328, -23644=>19329, -23661=>19330, -23773=>19331, -23809=>19332, -23860=>19333, -23869=>19334, -23897=>19335, -23934=>19336, -23939=>19337, -24007=>19338, -24057=>19339, -24104=>19340, -24114=>19341, -24117=>19342, -24155=>19343, -24168=>19344, -24170=>19345, -24183=>19346, -24192=>19347, -24203=>19348, -24243=>19349, -24253=>19350, -24273=>19351, -24276=>19352, -24277=>19353, -24397=>19354, -24492=>19355, -24554=>19356, -24583=>19357, -24649=>19358, -24660=>19359, -24679=>19360, -24763=>19361, -24772=>19362, -24829=>19363, -24842=>19364, -24854=>19365, -24874=>19366, -24886=>19367, -24926=>19368, -24932=>19369, -24955=>19370, -24957=>19371, -24959=>19372, -24989=>19373, -25016=>19374, -25052=>19375, -25058=>19376, -25061=>19377, -25064=>19378, -25092=>19379, -25095=>19380, -25137=>19381, -25145=>19382, -25149=>19383, -25210=>19384, -25232=>19385, -25256=>19386, -25306=>19387, -25332=>19388, -25366=>19389, -25386=>19390, -25398=>19391, -25414=>19392, -25419=>19393, -25427=>19394, -25457=>19395, -25461=>19396, -25471=>19397, -25474=>19398, -25482=>19399, -25518=>19400, -25519=>19401, -25578=>19402, -25592=>19403, -25593=>19404, -25618=>19405, -25624=>19406, -25632=>19407, -25636=>19408, -25642=>19409, -25653=>19410, -25661=>19411, -25663=>19412, -25682=>19413, -25695=>19414, -25716=>19415, -25744=>19416, -25752=>19417, -25753=>19418, -25772=>19419, -25779=>19420, -25837=>19421, -25840=>19422, -25883=>19423, -25887=>19424, -25902=>19425, -25929=>19426, -25952=>19427, -26002=>19428, -26005=>19429, -26036=>19430, -26046=>19431, -26056=>19432, -26062=>19433, -26064=>19434, -26079=>19435, -26238=>19436, -26251=>19437, -26252=>19438, -26291=>19439, -26304=>19440, -26319=>19441, -26405=>19442, -26421=>19443, -26453=>19444, -26496=>19445, -26511=>19446, -26513=>19447, -26532=>19448, -26545=>19449, -26549=>19450, -26558=>19451, -26664=>19452, -26758=>19453, -26859=>19454, -26869=>19455, -26903=>19456, -26931=>19457, -26936=>19458, -26971=>19459, -26981=>19460, -27048=>19461, -27051=>19462, -27055=>19463, -27109=>19464, -27121=>19465, -27210=>19466, -27221=>19467, -27239=>19468, -27249=>19469, -27311=>19470, -27336=>19471, -27337=>19472, -27395=>19473, -27451=>19474, -27455=>19475, -27517=>19476, -27518=>19477, -27568=>19478, -27639=>19479, -27641=>19480, -27652=>19481, -27657=>19482, -27661=>19483, -27692=>19484, -27722=>19485, -27730=>19486, -27732=>19487, -27769=>19488, -27820=>19489, -27828=>19490, -27858=>19491, -28001=>19492, -28028=>19493, -28089=>19494, -28144=>19495, -28229=>19496, -28275=>19497, -28283=>19498, -28285=>19499, -28297=>19500, -28348=>19501, -28378=>19502, -28379=>19503, -28454=>19504, -28457=>19505, -28464=>19506, -28551=>19507, -28573=>19508, -28590=>19509, -28599=>19510, -28685=>19511, -28704=>19512, -28745=>19513, -28824=>19514, -28848=>19515, -28885=>19516, -28886=>19517, -28997=>19518, -29106=>19519, -29172=>19520, -29207=>19521, -29215=>19522, -29251=>19523, -29263=>19524, -29264=>19525, -29274=>19526, -29280=>19527, -29288=>19528, -29303=>19529, -29316=>19530, -29385=>19531, -29413=>19532, -29428=>19533, -29442=>19534, -29451=>19535, -29470=>19536, -29474=>19537, -29498=>19538, -29499=>19539, -29517=>19540, -29528=>19541, -29543=>19542, -29810=>19543, -29871=>19544, -29919=>19545, -29924=>19546, -29940=>19547, -29947=>19548, -29974=>19549, -29985=>19550, -30015=>19551, -30046=>19552, -30105=>19553, -30116=>19554, -30145=>19555, -30148=>19556, -30156=>19557, -30167=>19558, -30172=>19559, -30177=>19560, -30191=>19561, -30212=>19562, -30220=>19563, -30237=>19564, -30258=>19565, -30264=>19566, -30277=>19567, -30282=>19568, -30303=>19569, -30381=>19570, -30397=>19571, -30425=>19572, -30443=>19573, -30448=>19574, -30457=>19575, -30464=>19576, -30478=>19577, -30498=>19578, -30504=>19579, -30511=>19580, -30521=>19581, -30526=>19582, -30533=>19583, -30538=>19584, -30543=>19585, -30558=>19586, -30564=>19587, -30567=>19588, -30572=>19589, -30596=>19590, -30604=>19591, -30605=>19592, -30614=>19593, -30631=>19594, -30639=>19595, -30647=>19596, -30654=>19597, -30665=>19598, -30673=>19599, -30681=>19600, -30705=>19601, -30775=>19602, -30812=>19603, -30846=>19604, -30872=>19605, -30881=>19606, -30897=>19607, -30899=>19608, -30921=>19609, -30931=>19610, -30988=>19611, -31007=>19612, -31015=>19613, -31016=>19614, -31039=>19615, -31042=>19616, -31060=>19617, -31083=>19618, -31100=>19619, -31147=>19620, -31172=>19621, -31210=>19622, -31234=>19623, -31244=>19624, -31280=>19625, -31290=>19626, -31300=>19627, -31360=>19628, -31366=>19629, -31380=>19630, -31413=>19631, -31421=>19632, -31486=>19633, -31531=>19634, -31607=>19635, -31648=>19636, -31660=>19637, -31664=>19638, -31720=>19639, -31730=>19640, -31736=>19641, -31740=>19642, -31742=>19643, -31753=>19644, -31784=>19645, -31791=>19646, -31810=>19647, -31826=>19648, -31827=>19649, -31835=>19650, -31836=>19651, -31837=>19652, -31858=>19653, -31869=>19654, -31879=>19655, -31902=>19656, -31930=>19657, -31943=>19658, -31955=>19659, -31962=>19660, -32060=>19661, -32077=>19662, -32130=>19663, -32133=>19664, -32141=>19665, -32145=>19666, -32158=>19667, -32179=>19668, -32185=>19669, -32208=>19670, -32229=>19671, -32245=>19672, -32246=>19673, -32303=>19674, -32310=>19675, -32324=>19676, -32367=>19677, -32376=>19678, -32385=>19679, -32573=>19680, -32603=>19681, -32605=>19682, -32613=>19683, -32625=>19684, -32639=>19685, -32640=>19686, -32651=>19687, -32674=>19688, -32765=>19689, -32766=>19690, -32767=>19691, -32775=>19692, -32781=>19693, -32798=>19694, -32825=>19695, -32904=>19696, -32910=>19697, -32975=>19698, -32980=>19699, -33005=>19700, -33008=>19701, -33015=>19702, -33018=>19703, -33022=>19704, -33027=>19705, -33047=>19706, -33072=>19707, -33111=>19708, -33135=>19709, -33139=>19710, -33163=>19711, -33168=>19712, -33179=>19713, -33182=>19714, -33227=>19715, -33237=>19716, -33245=>19717, -33246=>19718, -33249=>19719, -33263=>19720, -33270=>19721, -33280=>19722, -33291=>19723, -33299=>19724, -33300=>19725, -33306=>19726, -33338=>19727, -33348=>19728, -33389=>19729, -33412=>19730, -33417=>19731, -33425=>19732, -33450=>19733, -33456=>19734, -33488=>19735, -33514=>19736, -33519=>19737, -33526=>19738, -33622=>19739, -33656=>19740, -33784=>19741, -33788=>19742, -33880=>19743, -33939=>19744, -33969=>19745, -33981=>19746, -34043=>19747, -34118=>19748, -34134=>19749, -34141=>19750, -34181=>19751, -34200=>19752, -34370=>19753, -34374=>19754, -34496=>19755, -34580=>19756, -34594=>19757, -34606=>19758, -34617=>19759, -34653=>19760, -34683=>19761, -34700=>19762, -34702=>19763, -34711=>19764, -34712=>19765, -34718=>19766, -34723=>19767, -34734=>19768, -34751=>19769, -34761=>19770, -34778=>19771, -34840=>19772, -34843=>19773, -34861=>19774, -34874=>19775, -34885=>19776, -34891=>19777, -34894=>19778, -34901=>19779, -34906=>19780, -34926=>19781, -34970=>19782, -34971=>19783, -34972=>19784, -35021=>19785, -35040=>19786, -35055=>19787, -35086=>19788, -35087=>19789, -35110=>19790, -35125=>19791, -35162=>19792, -35164=>19793, -35179=>19794, -35184=>19795, -35196=>19796, -35237=>19797, -35253=>19798, -35260=>19799, -35285=>19800, -35401=>19801, -35415=>19802, -35431=>19803, -35454=>19804, -35462=>19805, -35478=>19806, -35510=>19807, -35529=>19808, -35537=>19809, -35549=>19810, -35564=>19811, -35573=>19812, -35590=>19813, -35599=>19814, -35601=>19815, -35653=>19816, -35666=>19817, -35693=>19818, -35704=>19819, -35708=>19820, -35710=>19821, -35717=>19822, -35743=>19823, -35915=>19824, -35923=>19825, -35963=>19826, -36026=>19827, -36037=>19828, -36041=>19829, -36050=>19830, -36076=>19831, -36085=>19832, -36087=>19833, -36097=>19834, -36099=>19835, -36119=>19836, -36124=>19837, -36206=>19838, -36241=>19839, -36255=>19840, -36267=>19841, -36274=>19842, -36309=>19843, -36327=>19844, -36337=>19845, -36338=>19846, -36340=>19847, -36353=>19848, -36363=>19849, -36390=>19850, -36401=>19851, -36416=>19852, -36417=>19853, -36429=>19854, -36431=>19855, -36444=>19856, -36449=>19857, -36457=>19858, -36465=>19859, -36469=>19860, -36471=>19861, -36489=>19862, -36496=>19863, -36501=>19864, -36506=>19865, -36519=>19866, -36521=>19867, -36525=>19868, -36584=>19869, -36592=>19870, -36615=>19871, -36632=>19872, -36645=>19873, -36647=>19874, -36652=>19875, -36661=>19876, -36666=>19877, -36675=>19878, -36679=>19879, -36689=>19880, -36693=>19881, -36768=>19882, -36769=>19883, -36770=>19884, -36773=>19885, -36868=>19886, -36891=>19887, -36911=>19888, -36940=>19889, -36955=>19890, -36976=>19891, -36980=>19892, -36985=>19893, -37003=>19894, -37016=>19895, -37024=>19896, -37042=>19897, -37053=>19898, -37065=>19899, -37104=>19900, -37125=>19901, -37157=>19902, -37210=>19903, -37223=>19904, -37242=>19905, -37258=>19906, -37265=>19907, -37269=>19908, -37296=>19909, -37307=>19910, -37309=>19911, -37314=>19912, -37317=>19913, -37376=>19914, -37385=>19915, -37411=>19916, -37494=>19917, -37518=>19918, -37551=>19919, -37563=>19920, -37564=>19921, -37569=>19922, -37571=>19923, -37573=>19924, -37576=>19925, -37652=>19926, -37683=>19927, -37686=>19928, -37720=>19929, -37759=>19930, -37762=>19931, -37770=>19932, -37819=>19933, -37836=>19934, -37862=>19935, -37881=>19936, -37890=>19937, -37901=>19938, -37902=>19939, -37934=>19940, -37964=>19941, -38280=>19942, -38305=>19943, -38335=>19944, -38342=>19945, -38345=>19946, -38353=>19947, -38354=>19948, -38368=>19949, -38372=>19950, -38374=>19951, -38436=>19952, -38449=>19953, -38456=>19954, -38461=>19955, -38484=>19956, -38516=>19957, -38523=>19958, -38527=>19959, -38529=>19960, -38531=>19961, -38537=>19962, -38550=>19963, -38574=>19964, -38659=>19965, -38683=>19966, -38689=>19967, -38690=>19968, -38696=>19969, -38705=>19970, -38759=>19971, -38774=>19972, -38781=>19973, -38783=>19974, -38809=>19975, -38815=>19976, -38828=>19977, -38841=>19978, -38861=>19979, -38880=>19980, -38895=>19981, -38919=>19982, -38950=>19983, -38958=>19984, -39010=>19985, -39011=>19986, -39092=>19987, -39109=>19988, -39170=>19989, -39185=>19990, -39189=>19991, -39221=>19992, -39240=>19993, -39252=>19994, -39262=>19995, -39393=>19996, -39436=>19997, -39440=>19998, -39459=>19999, -39489=>20000, -39505=>20001, -39613=>20002, -39614=>20003, -39681=>20004, -39689=>20005, -39691=>20006, -39693=>20007, -39694=>20008, -39705=>20009, -39733=>20010, -39752=>20011, -39765=>20012, -39784=>20013, -39808=>20014, -39814=>20015, -39824=>20016, -39837=>20017, -39856=>20018, -39871=>20019, -39880=>20020, -39935=>20021, -39938=>20022, -39964=>20023, -39989=>20024, -40004=>20025, -40022=>20026, -40033=>20027, -40040=>20028, -40240=>20029, -40253=>20030, -40298=>20031, -40315=>20032, -40421=>20033, -40425=>20034, -40435=>20035, -40570=>20036, -40578=>20037, -40579=>20038, -40580=>20039, -40624=>20040, -40676=>20041, -40688=>20042, -40690=>20043, -40713=>20044, -40719=>20045, -40724=>20046, -40731=>20047, -40738=>20048, -40742=>20049, -40746=>20050, -40747=>20051, -40756=>20052, -40794=>20053, -40815=>20054, -40862=>20055, -40869=>20056, -131317=>20057, -151044=>20058, -151538=>20059, -163187=>20060, -194581=>20061, -194630=>20062, -194713=>20063, -194726=>20064, -194789=>20065, -195038=>20066, -13790=>20067, -40895=>20068, -40896=>20069, -40897=>20070, -40898=>20071, -172722=>20072, -131416=>20075, -132529=>20080, -132844=>20083, -134488=>20090, -154060=>20112, -14756=>20122, -14776=>20123, -142914=>20124, -14940=>20127, -133064=>20128, -143339=>20130, -162228=>20133, -15044=>20135, -15051=>20136, -14981=>20142, -15347=>20151, -27384=>20152, -15665=>20158, -147531=>20168, -15936=>20170, -14497=>20171, -158878=>20206, -18207=>20219, -162876=>20220, -18462=>20225, -39709=>20297, -39724=>20298, -20482=>20299, -20958=>20300, -21255=>20301, -23532=>20302, -63784=>20303, -26142=>20304, -63785=>20305, -28746=>20306, -64021=>20307, -21857=>20308, -27706=>20309, -31328=>20310, -156492=>20311, -34819=>20312, -38315=>20313, -38741=>20314, -171581=>20315, -173594=>20316, -900=>20317, -901=>20318, -272=>20322, -294=>20323, -306=>20324, -319=>20325, -330=>20326, -358=>20327, -307=>20328, -312=>20329, -320=>20330, -329=>20331, -359=>20332, -266=>20333, -278=>20334, -286=>20335, -290=>20336, -288=>20337, -304=>20338, -302=>20339, -310=>20340, -315=>20342, -325=>20343, -342=>20344, -370=>20345, -471=>20346, -475=>20347, -473=>20348, -469=>20349, -372=>20350, -374=>20351, -267=>20352, -279=>20353, -501=>20354, -287=>20355, -289=>20356, -303=>20357, -311=>20358, -316=>20360, -326=>20361, -343=>20362, -371=>20363, -373=>20364, -375=>20365, -8494=>20366, -8710=>20367, -8719=>20368, -8804=>20369, -8805=>20370, -9674=>20371, -902=>20427, -904=>20428, -905=>20429, -906=>20430, -938=>20431, -908=>20432, -910=>20433, -939=>20434, -911=>20435, -940=>20436, -941=>20437, -942=>20438, -943=>20439, -970=>20440, -912=>20441, -972=>20442, -973=>20443, -971=>20444, -944=>20445, -974=>20446, -1026=>20447, -1027=>20448, -1028=>20449, -1029=>20450, -1030=>20451, -1031=>20452, -1032=>20453, -1033=>20454, -1034=>20455, -1035=>20456, -1036=>20457, -1038=>20458, -1039=>20459, -1106=>20460, -1107=>20461, -1108=>20462, -1109=>20463, -1110=>20464, -1111=>20465, -1112=>20466, -1113=>20467, -1114=>20468, -1115=>20469, -1116=>20470, -1118=>20471, -1119=>20472, -9361=>20587, -9362=>20588, -20021=>21075, -20060=>21076, -20067=>21077, -20072=>21078, -20084=>21079, -20085=>21080, -20119=>21081, -20143=>21082, -20187=>21083, -20194=>21084, -20200=>21085, -20207=>21086, -20222=>21087, -20226=>21088, -20232=>21089, -20242=>21090, -20247=>21091, -20275=>21092, -20277=>21093, -20288=>21094, -20290=>21095, -20299=>21096, -20300=>21097, -20306=>21098, -20323=>21099, -20334=>21100, -20337=>21101, -20345=>21102, -20353=>21103, -20361=>21104, -20364=>21105, -20366=>21106, -20368=>21107, -20371=>21108, -20377=>21109, -20383=>21110, -20409=>21111, -20411=>21112, -20412=>21113, -20413=>21114, -20416=>21115, -20417=>21116, -20422=>21117, -20424=>21118, -20428=>21119, -20444=>21120, -20450=>21121, -20464=>21122, -20476=>21123, -20487=>21124, -20490=>21125, -20503=>21126, -20509=>21127, -20528=>21128, -20530=>21129, -20531=>21130, -20533=>21131, -20549=>21132, -20554=>21133, -20561=>21134, -20562=>21135, -20569=>21136, -20576=>21137, -20583=>21138, -20589=>21139, -20593=>21140, -20609=>21141, -20611=>21142, -20612=>21143, -20614=>21144, -20618=>21145, -20624=>21146, -20635=>21147, -20639=>21148, -20640=>21149, -20641=>21150, -20655=>21151, -20656=>21152, -20665=>21153, -20669=>21154, -20672=>21155, -20691=>21156, -20700=>21157, -20701=>21158, -20703=>21159, -20706=>21160, -20708=>21161, -20726=>21162, -20730=>21163, -20761=>21165, -20764=>21166, -20765=>21167, -20771=>21168, -20775=>21169, -20776=>21170, -20780=>21171, -20781=>21172, -20783=>21173, -20785=>21174, -20788=>21175, -20793=>21176, -20802=>21177, -20815=>21178, -20819=>21179, -20824=>21180, -20838=>21181, -20862=>21182, -20878=>21183, -20927=>21184, -20930=>21185, -20946=>21186, -20949=>21187, -20965=>21188, -20978=>21189, -20983=>21190, -21016=>21191, -21026=>21192, -21061=>21193, -21080=>21194, -21087=>21195, -21120=>21196, -21125=>21197, -21141=>21198, -21142=>21199, -21143=>21200, -21146=>21201, -21157=>21202, -21159=>21203, -21168=>21204, -21174=>21205, -21175=>21206, -21176=>21207, -21181=>21208, -21188=>21209, -21190=>21210, -21199=>21211, -21204=>21212, -21212=>21213, -21221=>21214, -21224=>21215, -21226=>21216, -21228=>21217, -21236=>21218, -21238=>21219, -21260=>21220, -21267=>21221, -21272=>21222, -21275=>21223, -21278=>21224, -21285=>21225, -21287=>21226, -21288=>21227, -21289=>21228, -21291=>21229, -21292=>21230, -21296=>21231, -21308=>21232, -21337=>21233, -21339=>21234, -21379=>21236, -21383=>21237, -21384=>21238, -21390=>21239, -21409=>21240, -21429=>21241, -21432=>21242, -21437=>21243, -21455=>21244, -21458=>21245, -21459=>21246, -21470=>21247, -21479=>21249, -21506=>21250, -21530=>21251, -21537=>21252, -21551=>21253, -21572=>21254, -21575=>21255, -21583=>21256, -21598=>21257, -21604=>21258, -21607=>21259, -21609=>21260, -21613=>21261, -21614=>21262, -21633=>21263, -21635=>21264, -21637=>21265, -21641=>21266, -21649=>21267, -21663=>21268, -21706=>21269, -21728=>21270, -21750=>21271, -21758=>21272, -21772=>21273, -21773=>21274, -21810=>21275, -21819=>21276, -21821=>21277, -21833=>21278, -21837=>21279, -21848=>21280, -21850=>21281, -21851=>21282, -21887=>21283, -21907=>21284, -21911=>21285, -21923=>21286, -21953=>21287, -21963=>21288, -21975=>21289, -21976=>21290, -21982=>21291, -22015=>21292, -22026=>21294, -22041=>21295, -22067=>21296, -22076=>21297, -22081=>21298, -22083=>21299, -22084=>21300, -22086=>21301, -22113=>21302, -22114=>21303, -22115=>21304, -22133=>21305, -22148=>21306, -22155=>21307, -22183=>21308, -22187=>21309, -22206=>21310, -22219=>21311, -22224=>21312, -22236=>21313, -22245=>21314, -22246=>21315, -22247=>21316, -22273=>21317, -22274=>21318, -22289=>21319, -22304=>21320, -22306=>21321, -22308=>21322, -22309=>21323, -22314=>21324, -22335=>21325, -22354=>21326, -22370=>21327, -22375=>21328, -22382=>21329, -22385=>21330, -22393=>21331, -22398=>21332, -22401=>21333, -22420=>21334, -22425=>21335, -22431=>21336, -22433=>21337, -22421=>21338, -22439=>21339, -22441=>21340, -22461=>21341, -22493=>21342, -22505=>21343, -22526=>21344, -22531=>21345, -22536=>21346, -22497=>21347, -22540=>21348, -22555=>21349, -22559=>21350, -22573=>21351, -22591=>21352, -22608=>21353, -22613=>21354, -22632=>21355, -22648=>21356, -22663=>21357, -22664=>21358, -22668=>21359, -22678=>21360, -22688=>21361, -22689=>21362, -22690=>21363, -22694=>21364, -22724=>21365, -22722=>21366, -22728=>21367, -22742=>21368, -22749=>21369, -22753=>21370, -22802=>21372, -22803=>21373, -22813=>21374, -22817=>21375, -22824=>21376, -22832=>21377, -22835=>21378, -22837=>21379, -22838=>21380, -22847=>21381, -22851=>21382, -22866=>21383, -22878=>21384, -22891=>21385, -22895=>21386, -22898=>21387, -22907=>21388, -22924=>21389, -22926=>21390, -22933=>21391, -22951=>21392, -22957=>21393, -22960=>21394, -22967=>21395, -22977=>21396, -22980=>21397, -23023=>21398, -23026=>21399, -23028=>21400, -23031=>21401, -23040=>21402, -23054=>21403, -23058=>21404, -23070=>21405, -23076=>21406, -23080=>21407, -23082=>21408, -23088=>21409, -23108=>21410, -23109=>21411, -23112=>21412, -23116=>21413, -23120=>21414, -23134=>21415, -23163=>21416, -23184=>21417, -23187=>21418, -23190=>21419, -23193=>21420, -23227=>21421, -23238=>21422, -23240=>21423, -23247=>21424, -23293=>21425, -23297=>21426, -23371=>21427, -23390=>21428, -23406=>21429, -23430=>21430, -23438=>21431, -23440=>21432, -23441=>21433, -23444=>21434, -23464=>21435, -23465=>21436, -23469=>21437, -23471=>21438, -23473=>21439, -23474=>21440, -23482=>21441, -23484=>21442, -23489=>21443, -23501=>21444, -23503=>21445, -23513=>21446, -23514=>21447, -23535=>21448, -23540=>21449, -23564=>21450, -23575=>21451, -23590=>21452, -23598=>21453, -23602=>21454, -23605=>21455, -23642=>21456, -23668=>21457, -23669=>21458, -23675=>21459, -23677=>21460, -23687=>21461, -23698=>21462, -23709=>21463, -23730=>21464, -23732=>21465, -23767=>21466, -23790=>21467, -23793=>21468, -23794=>21469, -23826=>21470, -23843=>21471, -23871=>21472, -23880=>21473, -23893=>21474, -23889=>21475, -23903=>21476, -23904=>21477, -23906=>21478, -23908=>21479, -23929=>21480, -23930=>21481, -23935=>21482, -23946=>21483, -23955=>21484, -23957=>21485, -23963=>21486, -23967=>21487, -23979=>21488, -24003=>21489, -24014=>21490, -24025=>21491, -24071=>21492, -24077=>21493, -24096=>21494, -24139=>21495, -24144=>21496, -24145=>21497, -24156=>21498, -24176=>21499, -24206=>21500, -24226=>21501, -24228=>21502, -24241=>21503, -24268=>21504, -24270=>21505, -24284=>21506, -24286=>21507, -24293=>21508, -24299=>21509, -24326=>21510, -24345=>21511, -24356=>21512, -24363=>21513, -24364=>21514, -24366=>21515, -24368=>21516, -24383=>21517, -24388=>21518, -24411=>21519, -24416=>21520, -24431=>21521, -24436=>21522, -24437=>21523, -24440=>21524, -24442=>21525, -24461=>21526, -24470=>21527, -24477=>21528, -24491=>21529, -24496=>21530, -24497=>21531, -24520=>21532, -24528=>21533, -24529=>21534, -24552=>21535, -24556=>21536, -24562=>21537, -24566=>21538, -24570=>21539, -24586=>21540, -24595=>21541, -24607=>21542, -24621=>21543, -24640=>21544, -24648=>21545, -24657=>21546, -24662=>21547, -24663=>21548, -24689=>21549, -24702=>21550, -24706=>21551, -24710=>21552, -24712=>21553, -24718=>21554, -24721=>21555, -24723=>21556, -24728=>21557, -24738=>21559, -24741=>21560, -24759=>21561, -24770=>21562, -24777=>21563, -24778=>21564, -24782=>21565, -24783=>21566, -24802=>21567, -24805=>21568, -24828=>21569, -24834=>21570, -24839=>21571, -24844=>21572, -24855=>21573, -24866=>21574, -24881=>21575, -24885=>21576, -24889=>21577, -24901=>21578, -24905=>21579, -24940=>21580, -24946=>21581, -24952=>21582, -24960=>21583, -24961=>21584, -24963=>21585, -24964=>21586, -24971=>21587, -24988=>21588, -24992=>21589, -25002=>21590, -25024=>21591, -25025=>21592, -25038=>21593, -25039=>21594, -25054=>21595, -25057=>21596, -25063=>21597, -25065=>21598, -25068=>21599, -25069=>21600, -25071=>21601, -25089=>21602, -25091=>21603, -25116=>21604, -25120=>21605, -25127=>21606, -25131=>21607, -25154=>21608, -25156=>21609, -25168=>21610, -25172=>21611, -25180=>21612, -25213=>21613, -25229=>21614, -25230=>21615, -25231=>21616, -25267=>21617, -25270=>21618, -25271=>21619, -25274=>21620, -25278=>21621, -25279=>21622, -25294=>21623, -25322=>21624, -25330=>21625, -25348=>21626, -25355=>21627, -25363=>21628, -25385=>21629, -25389=>21630, -25418=>21631, -25426=>21632, -25428=>21633, -25432=>21634, -25435=>21635, -25446=>21636, -25453=>21637, -25464=>21638, -25493=>21639, -25498=>21640, -25508=>21641, -25510=>21642, -25517=>21643, -25537=>21644, -25541=>21645, -25544=>21646, -25550=>21647, -25555=>21648, -25587=>21649, -25610=>21650, -25648=>21651, -25675=>21652, -25679=>21653, -25683=>21654, -25692=>21655, -25697=>21656, -25699=>21657, -25733=>21658, -25743=>21659, -25755=>21660, -25761=>21661, -25763=>21662, -25766=>21663, -25768=>21664, -25789=>21665, -25801=>21666, -25809=>21667, -25833=>21668, -25834=>21669, -25845=>21670, -25857=>21671, -25864=>21672, -25865=>21673, -25866=>21674, -25875=>21675, -25894=>21676, -25905=>21677, -25914=>21678, -25916=>21679, -25917=>21680, -25923=>21681, -25936=>21682, -25938=>21683, -25951=>21684, -25981=>21685, -26008=>21686, -26016=>21687, -26019=>21688, -26022=>21689, -26030=>21690, -26035=>21691, -26070=>21692, -26072=>21693, -26100=>21695, -26101=>21696, -26110=>21697, -26111=>21698, -26125=>21699, -26129=>21700, -26130=>21701, -26134=>21702, -26141=>21703, -26147=>21704, -26150=>21705, -26153=>21706, -26169=>21707, -26167=>21708, -26176=>21709, -26182=>21710, -26186=>21711, -26200=>21712, -26208=>21713, -26229=>21714, -26239=>21715, -26233=>21716, -26236=>21717, -26266=>21718, -26267=>21719, -26268=>21720, -26271=>21721, -26306=>21723, -26307=>21724, -26316=>21725, -26318=>21726, -26324=>21727, -26335=>21728, -26347=>21729, -26350=>21730, -26375=>21731, -26396=>21732, -26400=>21733, -26402=>21734, -26430=>21735, -26437=>21736, -26476=>21737, -26500=>21738, -26510=>21739, -26518=>21740, -26521=>21741, -26556=>21742, -26557=>21743, -26562=>21744, -26565=>21745, -26569=>21746, -26588=>21747, -26593=>21748, -26598=>21749, -26610=>21750, -26614=>21751, -26644=>21752, -26649=>21753, -26663=>21754, -26671=>21755, -26687=>21756, -26698=>21757, -26712=>21758, -26735=>21759, -26736=>21760, -26737=>21761, -26745=>21762, -26747=>21763, -26760=>21764, -26785=>21765, -26793=>21766, -26798=>21767, -26833=>21768, -26835=>21769, -26844=>21770, -26845=>21771, -26858=>21772, -26870=>21773, -26877=>21774, -26886=>21775, -26889=>21776, -26896=>21777, -26902=>21778, -26929=>21779, -26949=>21780, -26958=>21781, -26982=>21782, -26992=>21783, -26993=>21784, -27003=>21785, -27021=>21786, -27041=>21787, -27064=>21788, -27077=>21789, -27080=>21790, -27136=>21792, -27139=>21793, -27168=>21794, -27172=>21795, -27191=>21796, -27242=>21798, -27265=>21799, -27270=>21800, -27271=>21801, -27291=>21802, -27312=>21803, -27313=>21804, -27316=>21805, -27326=>21806, -27327=>21807, -27340=>21808, -27349=>21809, -27350=>21810, -27376=>21811, -27388=>21812, -27394=>21813, -27398=>21814, -27399=>21815, -27401=>21816, -27432=>21817, -27435=>21818, -27446=>21819, -27469=>21820, -27474=>21821, -27485=>21822, -27499=>21823, -27502=>21824, -27504=>21825, -27525=>21826, -27543=>21827, -27551=>21828, -27552=>21829, -27554=>21830, -27555=>21831, -27560=>21832, -27564=>21833, -27576=>21834, -27577=>21835, -27587=>21836, -27588=>21837, -27619=>21838, -27666=>21839, -27673=>21840, -27679=>21841, -27686=>21842, -27687=>21843, -27688=>21844, -27694=>21845, -27707=>21846, -27723=>21847, -27727=>21848, -27755=>21849, -27768=>21850, -27783=>21851, -27807=>21852, -27824=>21853, -27826=>21854, -27853=>21855, -27855=>21856, -27857=>21857, -27879=>21858, -27890=>21859, -27892=>21860, -27911=>21861, -27919=>21862, -27923=>21863, -27930=>21864, -27944=>21865, -27999=>21866, -28007=>21867, -28050=>21868, -28055=>21869, -28087=>21870, -28093=>21871, -28128=>21872, -28130=>21873, -28133=>21874, -28143=>21875, -28148=>21876, -28160=>21877, -28164=>21878, -28219=>21879, -28242=>21880, -28253=>21881, -28258=>21882, -28264=>21883, -28301=>21884, -28313=>21885, -28320=>21886, -28333=>21887, -28334=>21888, -28339=>21889, -28347=>21890, -28352=>21891, -28360=>21892, -28365=>21893, -28367=>21894, -28397=>21895, -28398=>21896, -28420=>21897, -28424=>21898, -28429=>21899, -28438=>21900, -28443=>21901, -28475=>21902, -28461=>21903, -28495=>21904, -28499=>21905, -28509=>21906, -28524=>21907, -28547=>21908, -28563=>21909, -28582=>21910, -28592=>21911, -28613=>21912, -28648=>21913, -28669=>21914, -28695=>21915, -28719=>21916, -28724=>21917, -28727=>21918, -28740=>21919, -28744=>21920, -28757=>21921, -28820=>21922, -28822=>21923, -28827=>21924, -28852=>21925, -28922=>21926, -28933=>21927, -28939=>21928, -28973=>21929, -28984=>21930, -28993=>21931, -29003=>21932, -29015=>21934, -29018=>21935, -29068=>21936, -29082=>21937, -29104=>21938, -29119=>21939, -29120=>21940, -29132=>21941, -29146=>21942, -29176=>21943, -29192=>21944, -29193=>21945, -29203=>21946, -29210=>21947, -29220=>21948, -29231=>21949, -29253=>21950, -29262=>21951, -29278=>21952, -29291=>21953, -29297=>21954, -29307=>21955, -29308=>21956, -29321=>21957, -29331=>21958, -29352=>21959, -29397=>21960, -29398=>21961, -29400=>21962, -29407=>21963, -29438=>21964, -29453=>21965, -29459=>21966, -29490=>21967, -29493=>21968, -29526=>21969, -29533=>21970, -29534=>21971, -29535=>21972, -29536=>21973, -29545=>21974, -29561=>21975, -29568=>21976, -29582=>21977, -29584=>21978, -29587=>21979, -29591=>21980, -29610=>21981, -29613=>21982, -29638=>21983, -29644=>21984, -29651=>21985, -29661=>21986, -29670=>21987, -29687=>21988, -29691=>21989, -29695=>21990, -29696=>21991, -29713=>21992, -29741=>21993, -29799=>21994, -29800=>21995, -29806=>21996, -29839=>21997, -29841=>21998, -29850=>21999, -29870=>22000, -29873=>22001, -29874=>22002, -29900=>22003, -29904=>22004, -29907=>22005, -29915=>22007, -29928=>22008, -29930=>22009, -29948=>22011, -29958=>22012, -29970=>22013, -29991=>22014, -29993=>22015, -30006=>22016, -30009=>22017, -30019=>22018, -30023=>22019, -30039=>22020, -30047=>22021, -30049=>22022, -30075=>22023, -30076=>22024, -30085=>22025, -30101=>22026, -30108=>22027, -30138=>22028, -30226=>22029, -30243=>22030, -30249=>22031, -30265=>22032, -30266=>22033, -30272=>22034, -30276=>22035, -30297=>22036, -30341=>22037, -30348=>22038, -30349=>22039, -30367=>22040, -30370=>22041, -30371=>22042, -30401=>22043, -30411=>22044, -30432=>22046, -30454=>22047, -30470=>22048, -30482=>22049, -30484=>22050, -30485=>22051, -30492=>22052, -30510=>22053, -30525=>22054, -30530=>22055, -30546=>22056, -30550=>22057, -30551=>22058, -30576=>22059, -30579=>22060, -30580=>22061, -30638=>22064, -30641=>22065, -30645=>22066, -30659=>22067, -30674=>22068, -30677=>22069, -30712=>22070, -30734=>22071, -30737=>22072, -30749=>22073, -30755=>22074, -30788=>22075, -30792=>22076, -30796=>22077, -30802=>22078, -30814=>22079, -30816=>22080, -30817=>22081, -30819=>22082, -30863=>22083, -30888=>22084, -30892=>22085, -30898=>22086, -30909=>22087, -30911=>22088, -30919=>22089, -30930=>22090, -30934=>22091, -30939=>22092, -30943=>22093, -30954=>22094, -30963=>22095, -30966=>22096, -30975=>22097, -30982=>22098, -31002=>22099, -31006=>22100, -31008=>22101, -31017=>22102, -31021=>22103, -31029=>22104, -31044=>22105, -31051=>22106, -31055=>22107, -31057=>22108, -31081=>22109, -31099=>22110, -31102=>22111, -31116=>22112, -31121=>22113, -31123=>22114, -31132=>22115, -31144=>22116, -31151=>22117, -31183=>22118, -31197=>22119, -31200=>22120, -31202=>22121, -31205=>22122, -31217=>22123, -31224=>22124, -31228=>22125, -31239=>22126, -31265=>22127, -31271=>22128, -31275=>22129, -31279=>22130, -31284=>22131, -31285=>22132, -31304=>22133, -31317=>22134, -31333=>22135, -31358=>22136, -31371=>22137, -31377=>22138, -31390=>22139, -31433=>22140, -31451=>22141, -31465=>22142, -31468=>22143, -31473=>22144, -31483=>22145, -31519=>22146, -31523=>22147, -31529=>22148, -31536=>22149, -31540=>22150, -31551=>22151, -31552=>22152, -31594=>22153, -31620=>22154, -31625=>22155, -31630=>22156, -31638=>22157, -31653=>22158, -31666=>22159, -31670=>22160, -31674=>22161, -31675=>22162, -31677=>22163, -31682=>22164, -31688=>22165, -31707=>22166, -31732=>22167, -31733=>22168, -31737=>22169, -31738=>22170, -31746=>22171, -31748=>22172, -31750=>22173, -31756=>22174, -31769=>22175, -31771=>22176, -31781=>22177, -31788=>22178, -31796=>22179, -31801=>22180, -31802=>22181, -31814=>22182, -31829=>22183, -31834=>22184, -31843=>22185, -31868=>22187, -31878=>22188, -31920=>22189, -31931=>22190, -31951=>22191, -31956=>22192, -31977=>22193, -32015=>22194, -32017=>22195, -32022=>22196, -32038=>22197, -32042=>22198, -32045=>22199, -32081=>22200, -32087=>22201, -32101=>22202, -32103=>22203, -32120=>22204, -32123=>22205, -32129=>22206, -32150=>22207, -32195=>22208, -32196=>22209, -32197=>22210, -32198=>22211, -32205=>22212, -32206=>22213, -32256=>22214, -32226=>22215, -32234=>22216, -32237=>22217, -32250=>22218, -32284=>22219, -32301=>22220, -32307=>22221, -32319=>22222, -32334=>22223, -32336=>22224, -32344=>22225, -32351=>22226, -32357=>22227, -32405=>22228, -32413=>22229, -32414=>22230, -32575=>22231, -32604=>22232, -32614=>22233, -32653=>22235, -32655=>22236, -32678=>22237, -32682=>22238, -32692=>22239, -32700=>22240, -32704=>22241, -32712=>22242, -32744=>22243, -32783=>22244, -32787=>22245, -32797=>22246, -32799=>22247, -32800=>22248, -32814=>22249, -32820=>22250, -32830=>22251, -32832=>22252, -32836=>22253, -32868=>22254, -32877=>22255, -32897=>22256, -32953=>22257, -32968=>22258, -32973=>22259, -32978=>22260, -33006=>22261, -33010=>22262, -33014=>22263, -33017=>22264, -33035=>22265, -33052=>22266, -33056=>22267, -33084=>22268, -33093=>22269, -33095=>22270, -33106=>22271, -33121=>22272, -33143=>22273, -33158=>22274, -33166=>22275, -33174=>22276, -33186=>22277, -33198=>22278, -33221=>22279, -33230=>22280, -33259=>22281, -33264=>22282, -33265=>22283, -33266=>22284, -33269=>22285, -33272=>22286, -33295=>22288, -33309=>22289, -33320=>22290, -33347=>22291, -33358=>22292, -33361=>22293, -33366=>22294, -33383=>22295, -33403=>22296, -33408=>22297, -33409=>22298, -33415=>22299, -33428=>22300, -33430=>22301, -33432=>22302, -33434=>22303, -33435=>22304, -33440=>22305, -33498=>22306, -33504=>22307, -33508=>22308, -33517=>22309, -33546=>22310, -33547=>22311, -33566=>22312, -33567=>22313, -33569=>22314, -33580=>22315, -33582=>22316, -33587=>22317, -33591=>22318, -33597=>22319, -33602=>22320, -33613=>22321, -33614=>22322, -33648=>22323, -33664=>22324, -33666=>22325, -33668=>22326, -33689=>22327, -33692=>22328, -33702=>22329, -33708=>22330, -33726=>22331, -33619=>22332, -33768=>22333, -33817=>22334, -33709=>22335, -33839=>22336, -33861=>22337, -33863=>22338, -33869=>22339, -33878=>22340, -33888=>22342, -33892=>22343, -33895=>22344, -33898=>22345, -33908=>22346, -33917=>22347, -33938=>22348, -33941=>22349, -33961=>22350, -33962=>22351, -33991=>22352, -33992=>22353, -33996=>22354, -34034=>22355, -34039=>22356, -34050=>22357, -34051=>22358, -34055=>22359, -34062=>22360, -34064=>22361, -34076=>22362, -34082=>22363, -34087=>22364, -34090=>22365, -34099=>22366, -34102=>22367, -34111=>22368, -34128=>22369, -34130=>22370, -34140=>22371, -34143=>22373, -34144=>22374, -34169=>22375, -34185=>22376, -34187=>22377, -34208=>22378, -34213=>22379, -34215=>22380, -34228=>22381, -34230=>22382, -34232=>22383, -34237=>22384, -34238=>22385, -34239=>22386, -34242=>22387, -34266=>22388, -34272=>22389, -34280=>22390, -34291=>22391, -34300=>22392, -34317=>22393, -34318=>22394, -34329=>22395, -34331=>22396, -34358=>22397, -34362=>22398, -34365=>22399, -34392=>22400, -34393=>22401, -34397=>22402, -34400=>22403, -34401=>22404, -34404=>22405, -34409=>22406, -34422=>22407, -34454=>22408, -34458=>22409, -34465=>22410, -34470=>22411, -34477=>22412, -34484=>22413, -34485=>22414, -34487=>22415, -34489=>22416, -34495=>22417, -34501=>22418, -34514=>22419, -34522=>22420, -34524=>22421, -34528=>22422, -34533=>22423, -34535=>22424, -34440=>22425, -34564=>22426, -34575=>22427, -34607=>22428, -34610=>22429, -34620=>22430, -34621=>22431, -34629=>22432, -34637=>22433, -34657=>22434, -34671=>22435, -34691=>22436, -34692=>22437, -34693=>22438, -34694=>22439, -34704=>22440, -34709=>22441, -34737=>22443, -34760=>22444, -34762=>22445, -34773=>22446, -34777=>22447, -34780=>22448, -34786=>22449, -34788=>22450, -34801=>22451, -34803=>22452, -34808=>22453, -34810=>22454, -34815=>22455, -34825=>22456, -34841=>22457, -34834=>22458, -34842=>22459, -34846=>22460, -34864=>22461, -34869=>22462, -34881=>22463, -34883=>22464, -34888=>22465, -34889=>22466, -34897=>22468, -34908=>22469, -34912=>22470, -34929=>22471, -34937=>22472, -34939=>22473, -34944=>22474, -34975=>22475, -34984=>22476, -35002=>22477, -35019=>22478, -35020=>22479, -35038=>22480, -35047=>22481, -35063=>22482, -35085=>22483, -35093=>22484, -35094=>22485, -35104=>22486, -35112=>22487, -35121=>22488, -35130=>22489, -35142=>22490, -35151=>22491, -35154=>22492, -35159=>22493, -35163=>22494, -35169=>22495, -35171=>22496, -35182=>22497, -35187=>22498, -35189=>22499, -35194=>22500, -35197=>22501, -35213=>22502, -35221=>22503, -35227=>22504, -35228=>22505, -35232=>22506, -35252=>22507, -35254=>22508, -35287=>22509, -35305=>22510, -35309=>22511, -35321=>22512, -35332=>22513, -35333=>22514, -35358=>22515, -35360=>22516, -35364=>22517, -35366=>22518, -35371=>22519, -35372=>22520, -35375=>22521, -35389=>22522, -35392=>22523, -35395=>22524, -35411=>22525, -35414=>22526, -35420=>22527, -35429=>22528, -35446=>22529, -35447=>22530, -35450=>22531, -35451=>22532, -35456=>22533, -35459=>22534, -35467=>22535, -35471=>22536, -35474=>22537, -35479=>22538, -35481=>22539, -35487=>22540, -35497=>22541, -35503=>22542, -35507=>22543, -35515=>22544, -35523=>22545, -35526=>22546, -35528=>22547, -35530=>22548, -35539=>22549, -35540=>22550, -35541=>22551, -35568=>22552, -35583=>22553, -35595=>22554, -35614=>22555, -35632=>22556, -35644=>22557, -35650=>22558, -35656=>22559, -35661=>22560, -35683=>22561, -35705=>22562, -35716=>22563, -35725=>22564, -35727=>22565, -35896=>22566, -35902=>22567, -35921=>22568, -35928=>22569, -35931=>22570, -35933=>22571, -35929=>22572, -35939=>22573, -35940=>22574, -35942=>22575, -35957=>22576, -35958=>22577, -35966=>22578, -35974=>22579, -35975=>22580, -35979=>22581, -35984=>22582, -35996=>22584, -36025=>22585, -36038=>22586, -36043=>22587, -36047=>22588, -36061=>22589, -36072=>22590, -36079=>22591, -36082=>22592, -36095=>22593, -36197=>22594, -36223=>22595, -36226=>22596, -36232=>22597, -36240=>22598, -36254=>22599, -36256=>22600, -36268=>22601, -36277=>22602, -36279=>22603, -36281=>22604, -36283=>22605, -36288=>22606, -36293=>22607, -36295=>22608, -36298=>22609, -36308=>22610, -36325=>22611, -36336=>22612, -36284=>22613, -36356=>22614, -36357=>22615, -36369=>22616, -36403=>22617, -36407=>22618, -36408=>22619, -36430=>22620, -36443=>22621, -36445=>22622, -36446=>22623, -36473=>22624, -36482=>22625, -36483=>22626, -36507=>22627, -36509=>22628, -36514=>22629, -36538=>22630, -36545=>22631, -36547=>22632, -36548=>22633, -36551=>22634, -36572=>22635, -36590=>22636, -36593=>22637, -36599=>22638, -36589=>22639, -36610=>22640, -36623=>22641, -36624=>22642, -36630=>22643, -36640=>22644, -36641=>22645, -36643=>22646, -36648=>22647, -36654=>22648, -36660=>22649, -36663=>22650, -36673=>22651, -36687=>22652, -36690=>22653, -36691=>22654, -36701=>22655, -36702=>22656, -36709=>22657, -36765=>22658, -36792=>22659, -36798=>22660, -36800=>22661, -36811=>22662, -36816=>22663, -36818=>22664, -36835=>22665, -36862=>22666, -36888=>22667, -36904=>22668, -36905=>22669, -36906=>22670, -36915=>22671, -36916=>22672, -36927=>22673, -36962=>22674, -36966=>22675, -36972=>22676, -37006=>22677, -37029=>22678, -37068=>22679, -37077=>22680, -37080=>22681, -37081=>22682, -37093=>22683, -37074=>22684, -37128=>22685, -37133=>22686, -37136=>22687, -37146=>22688, -37152=>22689, -37161=>22690, -37166=>22691, -37174=>22692, -37180=>22693, -37187=>22694, -37199=>22695, -37203=>22696, -37229=>22697, -37243=>22698, -37249=>22699, -37254=>22700, -37267=>22701, -37268=>22702, -37272=>22703, -37281=>22704, -37286=>22705, -37311=>22706, -37331=>22707, -37332=>22708, -37337=>22709, -37353=>22710, -37354=>22711, -37359=>22712, -37369=>22713, -37373=>22714, -37380=>22715, -37381=>22716, -37388=>22717, -37394=>22718, -37395=>22719, -37400=>22720, -37404=>22721, -37405=>22722, -37412=>22723, -37413=>22724, -37414=>22725, -37422=>22726, -37423=>22727, -37424=>22728, -37429=>22729, -37430=>22730, -37438=>22731, -37446=>22732, -37453=>22733, -37464=>22734, -37468=>22735, -37469=>22736, -37481=>22737, -37486=>22738, -37487=>22739, -37488=>22740, -37493=>22741, -37497=>22742, -37499=>22743, -37514=>22744, -37522=>22745, -37536=>22746, -37540=>22747, -37541=>22748, -37544=>22749, -37558=>22750, -37560=>22751, -37562=>22752, -37565=>22753, -37575=>22754, -37581=>22755, -37592=>22756, -37596=>22757, -37597=>22758, -37601=>22759, -37603=>22760, -37608=>22761, -37612=>22762, -37614=>22763, -37616=>22764, -37632=>22765, -37640=>22766, -37660=>22767, -37668=>22768, -37674=>22769, -37684=>22770, -37687=>22771, -37712=>22772, -37717=>22773, -37726=>22774, -37735=>22775, -37737=>22776, -37743=>22777, -37748=>22778, -37750=>22779, -37754=>22780, -37757=>22781, -37760=>22782, -37761=>22783, -37773=>22784, -37778=>22785, -37781=>22786, -37784=>22787, -37798=>22789, -37800=>22790, -37803=>22791, -37812=>22792, -37813=>22793, -37814=>22794, -37828=>22795, -37829=>22796, -37833=>22797, -37835=>22798, -37837=>22799, -37843=>22800, -37849=>22801, -37879=>22802, -37889=>22803, -37896=>22804, -37909=>22805, -37919=>22806, -37935=>22807, -37949=>22808, -37955=>22809, -37977=>22810, -37980=>22811, -37983=>22812, -37985=>22813, -37992=>22814, -37998=>22815, -38020=>22816, -38019=>22817, -38270=>22818, -38276=>22819, -38301=>22820, -38302=>22821, -38330=>22822, -38361=>22823, -38365=>22824, -38367=>22825, -38430=>22826, -38434=>22827, -38437=>22828, -38438=>22829, -38455=>22830, -38457=>22831, -38458=>22832, -38482=>22833, -38486=>22834, -38487=>22835, -38510=>22836, -38524=>22837, -38526=>22838, -38545=>22839, -38559=>22840, -38566=>22841, -38602=>22842, -38623=>22844, -38650=>22845, -38661=>22846, -38682=>22847, -38685=>22848, -38730=>22850, -38744=>22851, -38775=>22852, -38776=>22853, -38779=>22854, -38784=>22855, -38793=>22856, -38807=>22857, -38840=>22858, -38844=>22859, -38847=>22860, -38852=>22861, -38853=>22862, -38855=>22863, -38858=>22864, -38862=>22865, -38864=>22866, -38871=>22867, -38877=>22868, -38884=>22869, -38903=>22870, -38904=>22871, -38906=>22872, -38937=>22873, -38940=>22874, -38944=>22875, -38959=>22876, -38965=>22877, -38980=>22878, -38986=>22879, -38993=>22880, -39018=>22881, -39086=>22882, -39116=>22883, -39142=>22884, -39158=>22885, -39175=>22886, -39199=>22887, -39202=>22888, -39206=>22889, -39211=>22890, -39220=>22891, -39225=>22892, -39239=>22893, -39257=>22894, -39259=>22895, -39323=>22896, -39325=>22897, -39327=>22898, -39344=>22899, -39346=>22900, -39349=>22901, -39379=>22902, -39386=>22903, -39388=>22904, -39399=>22905, -39402=>22906, -39403=>22907, -39404=>22908, -39412=>22909, -39413=>22910, -39421=>22911, -39422=>22912, -39428=>22913, -39435=>22914, -39454=>22915, -39458=>22916, -39475=>22917, -39477=>22918, -39495=>22919, -39499=>22921, -39508=>22922, -39517=>22923, -39594=>22924, -39596=>22925, -39598=>22926, -39602=>22927, -39604=>22928, -39611=>22929, -39615=>22930, -39624=>22931, -39639=>22932, -39643=>22933, -39652=>22934, -39655=>22935, -39660=>22936, -39666=>22937, -39667=>22938, -39669=>22939, -39674=>22940, -39677=>22941, -39679=>22942, -39680=>22943, -39684=>22944, -39685=>22945, -39707=>22946, -39718=>22947, -39735=>22949, -39737=>22950, -39738=>22951, -39756=>22952, -39766=>22953, -39767=>22954, -39771=>22955, -39777=>22956, -39786=>22957, -39789=>22958, -39790=>22959, -39800=>22960, -39807=>22961, -39813=>22962, -39815=>22963, -39817=>22964, -39819=>22965, -39821=>22966, -39828=>22967, -39834=>22968, -39849=>22969, -39863=>22970, -39868=>22971, -39888=>22972, -39929=>22973, -39951=>22974, -39953=>22975, -39966=>22976, -39974=>22977, -39976=>22978, -39997=>22979, -40003=>22980, -40014=>22981, -40030=>22982, -40059=>22983, -40183=>22984, -40185=>22985, -40220=>22986, -40239=>22987, -40243=>22988, -40244=>22989, -40250=>22990, -40252=>22991, -40261=>22992, -40275=>22993, -40276=>22994, -40293=>22995, -40323=>22996, -40326=>22997, -40334=>22998, -40338=>22999, -40339=>23000, -40341=>23001, -40343=>23002, -40344=>23003, -40362=>23004, -40366=>23005, -40394=>23007, -40404=>23008, -40405=>23009, -40414=>23010, -40430=>23011, -40432=>23012, -40446=>23013, -40462=>23014, -40464=>23015, -40465=>23016, -40466=>23017, -40470=>23018, -40583=>23019, -40590=>23020, -40591=>23021, -40598=>23022, -40600=>23023, -40622=>23024, -40627=>23025, -40646=>23026, -40648=>23027, -40651=>23028, -40661=>23029, -40684=>23030, -40685=>23031, -40689=>23032, -40693=>23033, -40696=>23034, -40721=>23035, -40726=>23036, -40730=>23037, -40735=>23038, -40753=>23039, -40754=>23040, -40764=>23041, -40767=>23042, -40771=>23043, -40772=>23044, -40775=>23045, -40790=>23046, -40798=>23047, -40814=>23048, -40819=>23049, -40826=>23050, -40829=>23051, -40847=>23052, -40849=>23053, -40850=>23054, -40854=>23055, -40865=>23056, -40867=>23057, -); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ak12.php b/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ak12.php deleted file mode 100644 index 6d20827f..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/uni2cid_ak12.php +++ /dev/null @@ -1,17530 +0,0 @@ -1, -33=>2, -34=>3, -35=>4, -36=>5, -37=>6, -38=>7, -39=>8, -40=>9, -41=>10, -42=>11, -43=>12, -44=>13, -45=>14, -46=>15, -47=>16, -48=>17, -49=>18, -50=>19, -51=>20, -52=>21, -53=>22, -54=>23, -55=>24, -56=>25, -57=>26, -58=>27, -59=>28, -60=>29, -61=>30, -62=>31, -63=>32, -64=>33, -65=>34, -66=>35, -67=>36, -68=>37, -69=>38, -70=>39, -71=>40, -72=>41, -73=>42, -74=>43, -75=>44, -76=>45, -77=>46, -78=>47, -79=>48, -80=>49, -81=>50, -82=>51, -83=>52, -84=>53, -85=>54, -86=>55, -87=>56, -88=>57, -89=>58, -90=>59, -91=>60, -92=>61, -93=>62, -94=>63, -95=>64, -96=>65, -97=>66, -98=>67, -99=>68, -100=>69, -101=>70, -102=>71, -103=>72, -104=>73, -105=>74, -106=>75, -107=>76, -108=>77, -109=>78, -110=>79, -111=>80, -112=>81, -113=>82, -114=>83, -115=>84, -116=>85, -117=>86, -118=>87, -119=>88, -120=>89, -121=>90, -122=>91, -123=>92, -124=>93, -125=>94, -126=>95, -8361=>96, -8208=>97, -169=>98, -12644=>101, -12288=>101, -12289=>102, -12290=>103, -183=>104, -12539=>104, -8229=>105, -8943=>106, -8230=>106, -168=>107, -12291=>108, -8211=>109, -8212=>110, -8214=>111, -65340=>112, -65374=>113, -8216=>114, -8217=>115, -8220=>116, -8221=>117, -12308=>118, -12309=>119, -12296=>120, -12297=>121, -12298=>122, -12299=>123, -12300=>124, -12301=>125, -12302=>126, -12303=>127, -12304=>128, -12305=>129, -177=>130, -215=>131, -247=>132, -8800=>133, -8804=>134, -8805=>135, -8734=>136, -8756=>137, -176=>138, -8242=>139, -8243=>140, -8451=>141, -8491=>142, -65504=>143, -65505=>144, -65509=>145, -9794=>146, -9792=>147, -8736=>148, -8869=>149, -8978=>150, -8706=>151, -8711=>152, -8801=>153, -8786=>154, -167=>155, -8251=>156, -9734=>157, -9733=>158, -9675=>159, -9679=>160, -9678=>161, -9671=>162, -9670=>163, -9633=>164, -9632=>165, -9651=>166, -9650=>167, -9661=>168, -9660=>169, -8594=>170, -8592=>171, -8593=>172, -8595=>173, -8596=>174, -12307=>175, -171=>176, -187=>177, -8730=>178, -8765=>179, -8733=>180, -8757=>181, -8747=>182, -8748=>183, -8712=>184, -8715=>185, -8838=>186, -8839=>187, -8834=>188, -8835=>189, -8746=>190, -8745=>191, -8743=>192, -8744=>193, -65506=>194, -8658=>195, -8660=>196, -8704=>197, -8707=>198, -180=>199, -732=>200, -711=>201, -728=>202, -733=>203, -730=>204, -729=>205, -184=>206, -731=>207, -161=>208, -191=>209, -8758=>210, -8750=>211, -8721=>212, -8719=>213, -164=>214, -8457=>215, -8240=>216, -9665=>217, -9664=>218, -9655=>219, -9654=>220, -9828=>221, -9824=>222, -9825=>223, -9829=>224, -9831=>225, -9827=>226, -9673=>227, -9672=>228, -9635=>229, -9680=>230, -9681=>231, -9618=>232, -9636=>233, -9637=>234, -9640=>235, -9639=>236, -9638=>237, -9641=>238, -9832=>239, -9743=>240, -9742=>241, -9756=>242, -9758=>243, -182=>244, -8224=>245, -8225=>246, -8597=>247, -8599=>248, -8601=>249, -8598=>250, -8600=>251, -9837=>252, -9833=>253, -9834=>254, -9836=>255, -12927=>256, -12828=>257, -8470=>258, -13255=>259, -8482=>260, -13250=>261, -13272=>262, -8481=>263, -65281=>264, -65282=>265, -65283=>266, -65284=>267, -65285=>268, -65286=>269, -65287=>270, -65288=>271, -65289=>272, -65290=>273, -65291=>274, -65292=>275, -65293=>276, -65294=>277, -65295=>278, -65296=>279, -65297=>280, -65298=>281, -65299=>282, -65300=>283, -65301=>284, -65302=>285, -65303=>286, -65304=>287, -65305=>288, -65306=>289, -65307=>290, -65308=>291, -65309=>292, -65310=>293, -65311=>294, -65312=>295, -65313=>296, -65314=>297, -65315=>298, -65316=>299, -65317=>300, -65318=>301, -65319=>302, -65320=>303, -65321=>304, -65322=>305, -65323=>306, -65324=>307, -65325=>308, -65326=>309, -65327=>310, -65328=>311, -65329=>312, -65330=>313, -65331=>314, -65332=>315, -65333=>316, -65334=>317, -65335=>318, -65336=>319, -65337=>320, -65338=>321, -65339=>322, -65510=>323, -65341=>324, -65342=>325, -65343=>326, -65344=>327, -65345=>328, -65346=>329, -65347=>330, -65348=>331, -65349=>332, -65350=>333, -65351=>334, -65352=>335, -65353=>336, -65354=>337, -65355=>338, -65356=>339, -65357=>340, -65358=>341, -65359=>342, -65360=>343, -65361=>344, -65362=>345, -65363=>346, -65364=>347, -65365=>348, -65366=>349, -65367=>350, -65368=>351, -65369=>352, -65370=>353, -65371=>354, -65372=>355, -65373=>356, -65507=>357, -12593=>358, -12594=>359, -12595=>360, -12596=>361, -12597=>362, -12598=>363, -12599=>364, -12600=>365, -12601=>366, -12602=>367, -12603=>368, -12604=>369, -12605=>370, -12606=>371, -12607=>372, -12608=>373, -12609=>374, -12610=>375, -12611=>376, -12612=>377, -12613=>378, -12614=>379, -12615=>380, -12616=>381, -12617=>382, -12618=>383, -12619=>384, -12620=>385, -12621=>386, -12622=>387, -12623=>388, -12624=>389, -12625=>390, -12626=>391, -12627=>392, -12628=>393, -12629=>394, -12630=>395, -12631=>396, -12632=>397, -12633=>398, -12634=>399, -12635=>400, -12636=>401, -12637=>402, -12638=>403, -12639=>404, -12640=>405, -12641=>406, -12642=>407, -12643=>408, -12645=>409, -12646=>410, -12647=>411, -12648=>412, -12649=>413, -12650=>414, -12651=>415, -12652=>416, -12653=>417, -12654=>418, -12655=>419, -12656=>420, -12657=>421, -12658=>422, -12659=>423, -12660=>424, -12661=>425, -12662=>426, -12663=>427, -12664=>428, -12665=>429, -12666=>430, -12667=>431, -12668=>432, -12669=>433, -12670=>434, -12671=>435, -12672=>436, -12673=>437, -12674=>438, -12675=>439, -12676=>440, -12677=>441, -12678=>442, -12679=>443, -12680=>444, -12681=>445, -12682=>446, -12683=>447, -12684=>448, -12685=>449, -12686=>450, -8560=>451, -8561=>452, -8562=>453, -8563=>454, -8564=>455, -8565=>456, -8566=>457, -8567=>458, -8568=>459, -8569=>460, -8544=>461, -8545=>462, -8546=>463, -8547=>464, -8548=>465, -8549=>466, -8550=>467, -8551=>468, -8552=>469, -8553=>470, -913=>471, -914=>472, -915=>473, -916=>474, -917=>475, -918=>476, -919=>477, -920=>478, -921=>479, -922=>480, -923=>481, -924=>482, -925=>483, -926=>484, -927=>485, -928=>486, -929=>487, -931=>488, -932=>489, -933=>490, -934=>491, -935=>492, -936=>493, -937=>494, -945=>495, -946=>496, -947=>497, -948=>498, -949=>499, -950=>500, -951=>501, -952=>502, -953=>503, -954=>504, -955=>505, -956=>506, -957=>507, -958=>508, -959=>509, -960=>510, -961=>511, -963=>512, -964=>513, -965=>514, -966=>515, -967=>516, -968=>517, -969=>518, -9472=>519, -9474=>520, -9484=>521, -9488=>522, -9496=>523, -9492=>524, -9500=>525, -9516=>526, -9508=>527, -9524=>528, -9532=>529, -9473=>530, -9475=>531, -9487=>532, -9491=>533, -9499=>534, -9495=>535, -9507=>536, -9523=>537, -9515=>538, -9531=>539, -9547=>540, -9504=>541, -9519=>542, -9512=>543, -9527=>544, -9535=>545, -9501=>546, -9520=>547, -9509=>548, -9528=>549, -9538=>550, -9490=>551, -9489=>552, -9498=>553, -9497=>554, -9494=>555, -9493=>556, -9486=>557, -9485=>558, -9502=>559, -9503=>560, -9505=>561, -9506=>562, -9510=>563, -9511=>564, -9513=>565, -9514=>566, -9517=>567, -9518=>568, -9521=>569, -9522=>570, -9525=>571, -9526=>572, -9529=>573, -9530=>574, -9533=>575, -9534=>576, -9536=>577, -9537=>578, -9539=>579, -9540=>580, -9541=>581, -9542=>582, -9543=>583, -9544=>584, -9545=>585, -9546=>586, -13205=>587, -13206=>588, -13207=>589, -8467=>590, -13208=>591, -13252=>592, -13219=>593, -13220=>594, -13221=>595, -13222=>596, -13209=>597, -13210=>598, -13211=>599, -13212=>600, -13213=>601, -13214=>602, -13215=>603, -13216=>604, -13217=>605, -13218=>606, -13258=>607, -13197=>608, -13198=>609, -13199=>610, -13263=>611, -13192=>612, -13193=>613, -13256=>614, -13223=>615, -13224=>616, -13232=>617, -13233=>618, -13234=>619, -13235=>620, -13236=>621, -13237=>622, -13238=>623, -13239=>624, -13240=>625, -13241=>626, -13184=>627, -13185=>628, -13186=>629, -13187=>630, -13188=>631, -13242=>632, -13243=>633, -13244=>634, -13245=>635, -13246=>636, -13247=>637, -13200=>638, -13201=>639, -13202=>640, -13203=>641, -13204=>642, -8486=>643, -13248=>644, -13249=>645, -13194=>646, -13195=>647, -13196=>648, -13270=>649, -13253=>650, -13229=>651, -13230=>652, -13231=>653, -13275=>654, -13225=>655, -13226=>656, -13227=>657, -13228=>658, -13277=>659, -13264=>660, -13267=>661, -13251=>662, -13257=>663, -13276=>664, -13254=>665, -198=>666, -208=>667, -170=>668, -294=>669, -306=>670, -319=>671, -321=>672, -216=>673, -338=>674, -186=>675, -222=>676, -358=>677, -330=>678, -12896=>679, -12897=>680, -12898=>681, -12899=>682, -12900=>683, -12901=>684, -12902=>685, -12903=>686, -12904=>687, -12905=>688, -12906=>689, -12907=>690, -12908=>691, -12909=>692, -12910=>693, -12911=>694, -12912=>695, -12913=>696, -12914=>697, -12915=>698, -12916=>699, -12917=>700, -12918=>701, -12919=>702, -12920=>703, -12921=>704, -12922=>705, -12923=>706, -9424=>707, -9425=>708, -9426=>709, -9427=>710, -9428=>711, -9429=>712, -9430=>713, -9431=>714, -9432=>715, -9433=>716, -9434=>717, -9435=>718, -9436=>719, -9437=>720, -9438=>721, -9439=>722, -9440=>723, -9441=>724, -9442=>725, -9443=>726, -9444=>727, -9445=>728, -9446=>729, -9447=>730, -9448=>731, -9449=>732, -9312=>733, -9313=>734, -9314=>735, -9315=>736, -9316=>737, -9317=>738, -9318=>739, -9319=>740, -9320=>741, -9321=>742, -9322=>743, -9323=>744, -9324=>745, -9325=>746, -9326=>747, -189=>748, -8531=>749, -8532=>750, -188=>751, -190=>752, -8539=>753, -8540=>754, -8541=>755, -8542=>756, -230=>757, -273=>758, -240=>759, -295=>760, -305=>761, -307=>762, -312=>763, -320=>764, -322=>765, -248=>766, -339=>767, -223=>768, -254=>769, -359=>770, -331=>771, -329=>772, -12800=>773, -12801=>774, -12802=>775, -12803=>776, -12804=>777, -12805=>778, -12806=>779, -12807=>780, -12808=>781, -12809=>782, -12810=>783, -12811=>784, -12812=>785, -12813=>786, -12814=>787, -12815=>788, -12816=>789, -12817=>790, -12818=>791, -12819=>792, -12820=>793, -12821=>794, -12822=>795, -12823=>796, -12824=>797, -12825=>798, -12826=>799, -12827=>800, -9372=>801, -9373=>802, -9374=>803, -9375=>804, -9376=>805, -9377=>806, -9378=>807, -9379=>808, -9380=>809, -9381=>810, -9382=>811, -9383=>812, -9384=>813, -9385=>814, -9386=>815, -9387=>816, -9388=>817, -9389=>818, -9390=>819, -9391=>820, -9392=>821, -9393=>822, -9394=>823, -9395=>824, -9396=>825, -9397=>826, -9332=>827, -9333=>828, -9334=>829, -9335=>830, -9336=>831, -9337=>832, -9338=>833, -9339=>834, -9340=>835, -9341=>836, -9342=>837, -9343=>838, -9344=>839, -9345=>840, -9346=>841, -185=>842, -178=>843, -179=>844, -8308=>845, -8319=>846, -8321=>847, -8322=>848, -8323=>849, -8324=>850, -12353=>851, -12354=>852, -12355=>853, -12356=>854, -12357=>855, -12358=>856, -12359=>857, -12360=>858, -12361=>859, -12362=>860, -12363=>861, -12364=>862, -12365=>863, -12366=>864, -12367=>865, -12368=>866, -12369=>867, -12370=>868, -12371=>869, -12372=>870, -12373=>871, -12374=>872, -12375=>873, -12376=>874, -12377=>875, -12378=>876, -12379=>877, -12380=>878, -12381=>879, -12382=>880, -12383=>881, -12384=>882, -12385=>883, -12386=>884, -12387=>885, -12388=>886, -12389=>887, -12390=>888, -12391=>889, -12392=>890, -12393=>891, -12394=>892, -12395=>893, -12396=>894, -12397=>895, -12398=>896, -12399=>897, -12400=>898, -12401=>899, -12402=>900, -12403=>901, -12404=>902, -12405=>903, -12406=>904, -12407=>905, -12408=>906, -12409=>907, -12410=>908, -12411=>909, -12412=>910, -12413=>911, -12414=>912, -12415=>913, -12416=>914, -12417=>915, -12418=>916, -12419=>917, -12420=>918, -12421=>919, -12422=>920, -12423=>921, -12424=>922, -12425=>923, -12426=>924, -12427=>925, -12428=>926, -12429=>927, -12430=>928, -12431=>929, -12432=>930, -12433=>931, -12434=>932, -12435=>933, -12449=>934, -12450=>935, -12451=>936, -12452=>937, -12453=>938, -12454=>939, -12455=>940, -12456=>941, -12457=>942, -12458=>943, -12459=>944, -12460=>945, -12461=>946, -12462=>947, -12463=>948, -12464=>949, -12465=>950, -12466=>951, -12467=>952, -12468=>953, -12469=>954, -12470=>955, -12471=>956, -12472=>957, -12473=>958, -12474=>959, -12475=>960, -12476=>961, -12477=>962, -12478=>963, -12479=>964, -12480=>965, -12481=>966, -12482=>967, -12483=>968, -12484=>969, -12485=>970, -12486=>971, -12487=>972, -12488=>973, -12489=>974, -12490=>975, -12491=>976, -12492=>977, -12493=>978, -12494=>979, -12495=>980, -12496=>981, -12497=>982, -12498=>983, -12499=>984, -12500=>985, -12501=>986, -12502=>987, -12503=>988, -12504=>989, -12505=>990, -12506=>991, -12507=>992, -12508=>993, -12509=>994, -12510=>995, -12511=>996, -12512=>997, -12513=>998, -12514=>999, -12515=>1000, -12516=>1001, -12517=>1002, -12518=>1003, -12519=>1004, -12520=>1005, -12521=>1006, -12522=>1007, -12523=>1008, -12524=>1009, -12525=>1010, -12526=>1011, -12527=>1012, -12528=>1013, -12529=>1014, -12530=>1015, -12531=>1016, -12532=>1017, -12533=>1018, -12534=>1019, -1040=>1020, -1041=>1021, -1042=>1022, -1043=>1023, -1044=>1024, -1045=>1025, -1025=>1026, -1046=>1027, -1047=>1028, -1048=>1029, -1049=>1030, -1050=>1031, -1051=>1032, -1052=>1033, -1053=>1034, -1054=>1035, -1055=>1036, -1056=>1037, -1057=>1038, -1058=>1039, -1059=>1040, -1060=>1041, -1061=>1042, -1062=>1043, -1063=>1044, -1064=>1045, -1065=>1046, -1066=>1047, -1067=>1048, -1068=>1049, -1069=>1050, -1070=>1051, -1071=>1052, -1072=>1053, -1073=>1054, -1074=>1055, -1075=>1056, -1076=>1057, -1077=>1058, -1105=>1059, -1078=>1060, -1079=>1061, -1080=>1062, -1081=>1063, -1082=>1064, -1083=>1065, -1084=>1066, -1085=>1067, -1086=>1068, -1087=>1069, -1088=>1070, -1089=>1071, -1090=>1072, -1091=>1073, -1092=>1074, -1093=>1075, -1094=>1076, -1095=>1077, -1096=>1078, -1097=>1079, -1098=>1080, -1099=>1081, -1100=>1082, -1101=>1083, -1102=>1084, -1103=>1085, -44032=>1086, -44033=>1087, -44036=>1088, -44039=>1089, -44040=>1090, -44041=>1091, -44042=>1092, -44048=>1093, -44049=>1094, -44050=>1095, -44051=>1096, -44052=>1097, -44053=>1098, -44054=>1099, -44055=>1100, -44057=>1101, -44058=>1102, -44059=>1103, -44060=>1104, -44061=>1105, -44064=>1106, -44068=>1107, -44076=>1108, -44077=>1109, -44079=>1110, -44080=>1111, -44081=>1112, -44088=>1113, -44089=>1114, -44092=>1115, -44096=>1116, -44107=>1117, -44109=>1118, -44116=>1119, -44120=>1120, -44124=>1121, -44144=>1122, -44145=>1123, -44148=>1124, -44151=>1125, -44152=>1126, -44154=>1127, -44160=>1128, -44161=>1129, -44163=>1130, -44164=>1131, -44165=>1132, -44166=>1133, -44169=>1134, -44170=>1135, -44171=>1136, -44172=>1137, -44176=>1138, -44180=>1139, -44188=>1140, -44189=>1141, -44191=>1142, -44192=>1143, -44193=>1144, -44200=>1145, -44201=>1146, -44202=>1147, -44204=>1148, -44207=>1149, -44208=>1150, -44216=>1151, -44217=>1152, -44219=>1153, -44220=>1154, -44221=>1155, -44225=>1156, -44228=>1157, -44232=>1158, -44236=>1159, -44245=>1160, -44247=>1161, -44256=>1162, -44257=>1163, -44260=>1164, -44263=>1165, -44264=>1166, -44266=>1167, -44268=>1168, -44271=>1169, -44272=>1170, -44273=>1171, -44275=>1172, -44277=>1173, -44278=>1174, -44284=>1175, -44285=>1176, -44288=>1177, -44292=>1178, -44294=>1179, -44300=>1180, -44301=>1181, -44303=>1182, -44305=>1183, -44312=>1184, -44316=>1185, -44320=>1186, -44329=>1187, -44332=>1188, -44333=>1189, -44340=>1190, -44341=>1191, -44344=>1192, -44348=>1193, -44356=>1194, -44357=>1195, -44359=>1196, -44361=>1197, -44368=>1198, -44372=>1199, -44376=>1200, -44385=>1201, -44387=>1202, -44396=>1203, -44397=>1204, -44400=>1205, -44403=>1206, -44404=>1207, -44405=>1208, -44406=>1209, -44411=>1210, -44412=>1211, -44413=>1212, -44415=>1213, -44417=>1214, -44418=>1215, -44424=>1216, -44425=>1217, -44428=>1218, -44432=>1219, -44444=>1220, -44445=>1221, -44452=>1222, -44471=>1223, -44480=>1224, -44481=>1225, -44484=>1226, -44488=>1227, -44496=>1228, -44497=>1229, -44499=>1230, -44508=>1231, -44512=>1232, -44516=>1233, -44536=>1234, -44537=>1235, -44540=>1236, -44543=>1237, -44544=>1238, -44545=>1239, -44552=>1240, -44553=>1241, -44555=>1242, -44557=>1243, -44564=>1244, -44592=>1245, -44593=>1246, -44596=>1247, -44599=>1248, -44600=>1249, -44602=>1250, -44608=>1251, -44609=>1252, -44611=>1253, -44613=>1254, -44614=>1255, -44618=>1256, -44620=>1257, -44621=>1258, -44622=>1259, -44624=>1260, -44628=>1261, -44630=>1262, -44636=>1263, -44637=>1264, -44639=>1265, -44640=>1266, -44641=>1267, -44645=>1268, -44648=>1269, -44649=>1270, -44652=>1271, -44656=>1272, -44664=>1273, -44665=>1274, -44667=>1275, -44668=>1276, -44669=>1277, -44676=>1278, -44677=>1279, -44684=>1280, -44732=>1281, -44733=>1282, -44734=>1283, -44736=>1284, -44740=>1285, -44748=>1286, -44749=>1287, -44751=>1288, -44752=>1289, -44753=>1290, -44760=>1291, -44761=>1292, -44764=>1293, -44776=>1294, -44779=>1295, -44781=>1296, -44788=>1297, -44792=>1298, -44796=>1299, -44807=>1300, -44808=>1301, -44813=>1302, -44816=>1303, -44844=>1304, -44845=>1305, -44848=>1306, -44850=>1307, -44852=>1308, -44860=>1309, -44861=>1310, -44863=>1311, -44865=>1312, -44866=>1313, -44867=>1314, -44872=>1315, -44873=>1316, -44880=>1317, -44892=>1318, -44893=>1319, -44900=>1320, -44901=>1321, -44921=>1322, -44928=>1323, -44932=>1324, -44936=>1325, -44944=>1326, -44945=>1327, -44949=>1328, -44956=>1329, -44984=>1330, -44985=>1331, -44988=>1332, -44992=>1333, -44999=>1334, -45000=>1335, -45001=>1336, -45003=>1337, -45005=>1338, -45006=>1339, -45012=>1340, -45020=>1341, -45032=>1342, -45033=>1343, -45040=>1344, -45041=>1345, -45044=>1346, -45048=>1347, -45056=>1348, -45057=>1349, -45060=>1350, -45068=>1351, -45072=>1352, -45076=>1353, -45084=>1354, -45085=>1355, -45096=>1356, -45124=>1357, -45125=>1358, -45128=>1359, -45130=>1360, -45132=>1361, -45134=>1362, -45139=>1363, -45140=>1364, -45141=>1365, -45143=>1366, -45145=>1367, -45149=>1368, -45180=>1369, -45181=>1370, -45184=>1371, -45188=>1372, -45196=>1373, -45197=>1374, -45199=>1375, -45201=>1376, -45208=>1377, -45209=>1378, -45210=>1379, -45212=>1380, -45215=>1381, -45216=>1382, -45217=>1383, -45218=>1384, -45224=>1385, -45225=>1386, -45227=>1387, -45228=>1388, -45229=>1389, -45230=>1390, -45231=>1391, -45233=>1392, -45235=>1393, -45236=>1394, -45237=>1395, -45240=>1396, -45244=>1397, -45252=>1398, -45253=>1399, -45255=>1400, -45256=>1401, -45257=>1402, -45264=>1403, -45265=>1404, -45268=>1405, -45272=>1406, -45280=>1407, -45285=>1408, -45320=>1409, -45321=>1410, -45323=>1411, -45324=>1412, -45328=>1413, -45330=>1414, -45331=>1415, -45336=>1416, -45337=>1417, -45339=>1418, -45340=>1419, -45341=>1420, -45347=>1421, -45348=>1422, -45349=>1423, -45352=>1424, -45356=>1425, -45364=>1426, -45365=>1427, -45367=>1428, -45368=>1429, -45369=>1430, -45376=>1431, -45377=>1432, -45380=>1433, -45384=>1434, -45392=>1435, -45393=>1436, -45396=>1437, -45397=>1438, -45400=>1439, -45404=>1440, -45408=>1441, -45432=>1442, -45433=>1443, -45436=>1444, -45440=>1445, -45442=>1446, -45448=>1447, -45449=>1448, -45451=>1449, -45453=>1450, -45458=>1451, -45459=>1452, -45460=>1453, -45464=>1454, -45468=>1455, -45480=>1456, -45516=>1457, -45520=>1458, -45524=>1459, -45532=>1460, -45533=>1461, -45535=>1462, -45544=>1463, -45545=>1464, -45548=>1465, -45552=>1466, -45561=>1467, -45563=>1468, -45565=>1469, -45572=>1470, -45573=>1471, -45576=>1472, -45579=>1473, -45580=>1474, -45588=>1475, -45589=>1476, -45591=>1477, -45593=>1478, -45600=>1479, -45620=>1480, -45628=>1481, -45656=>1482, -45660=>1483, -45664=>1484, -45672=>1485, -45673=>1486, -45684=>1487, -45685=>1488, -45692=>1489, -45700=>1490, -45701=>1491, -45705=>1492, -45712=>1493, -45713=>1494, -45716=>1495, -45720=>1496, -45721=>1497, -45722=>1498, -45728=>1499, -45729=>1500, -45731=>1501, -45733=>1502, -45734=>1503, -45738=>1504, -45740=>1505, -45744=>1506, -45748=>1507, -45768=>1508, -45769=>1509, -45772=>1510, -45776=>1511, -45778=>1512, -45784=>1513, -45785=>1514, -45787=>1515, -45789=>1516, -45794=>1517, -45796=>1518, -45797=>1519, -45798=>1520, -45800=>1521, -45803=>1522, -45804=>1523, -45805=>1524, -45806=>1525, -45807=>1526, -45811=>1527, -45812=>1528, -45813=>1529, -45815=>1530, -45816=>1531, -45817=>1532, -45818=>1533, -45819=>1534, -45823=>1535, -45824=>1536, -45825=>1537, -45828=>1538, -45832=>1539, -45840=>1540, -45841=>1541, -45843=>1542, -45844=>1543, -45845=>1544, -45852=>1545, -45908=>1546, -45909=>1547, -45910=>1548, -45912=>1549, -45915=>1550, -45916=>1551, -45918=>1552, -45919=>1553, -45924=>1554, -45925=>1555, -45927=>1556, -45929=>1557, -45931=>1558, -45934=>1559, -45936=>1560, -45937=>1561, -45940=>1562, -45944=>1563, -45952=>1564, -45953=>1565, -45955=>1566, -45956=>1567, -45957=>1568, -45964=>1569, -45968=>1570, -45972=>1571, -45984=>1572, -45985=>1573, -45992=>1574, -45996=>1575, -46020=>1576, -46021=>1577, -46024=>1578, -46027=>1579, -46028=>1580, -46030=>1581, -46032=>1582, -46036=>1583, -46037=>1584, -46039=>1585, -46041=>1586, -46043=>1587, -46045=>1588, -46048=>1589, -46052=>1590, -46056=>1591, -46076=>1592, -46096=>1593, -46104=>1594, -46108=>1595, -46112=>1596, -46120=>1597, -46121=>1598, -46123=>1599, -46132=>1600, -46160=>1601, -46161=>1602, -46164=>1603, -46168=>1604, -46176=>1605, -46177=>1606, -46179=>1607, -46181=>1608, -46188=>1609, -46208=>1610, -46216=>1611, -46237=>1612, -46244=>1613, -46248=>1614, -46252=>1615, -46261=>1616, -46263=>1617, -46265=>1618, -46272=>1619, -46276=>1620, -46280=>1621, -46288=>1622, -46293=>1623, -46300=>1624, -46301=>1625, -46304=>1626, -46307=>1627, -46308=>1628, -46310=>1629, -46316=>1630, -46317=>1631, -46319=>1632, -46321=>1633, -46328=>1634, -46356=>1635, -46357=>1636, -46360=>1637, -46363=>1638, -46364=>1639, -46372=>1640, -46373=>1641, -46375=>1642, -46376=>1643, -46377=>1644, -46378=>1645, -46384=>1646, -46385=>1647, -46388=>1648, -46392=>1649, -46400=>1650, -46401=>1651, -46403=>1652, -46404=>1653, -46405=>1654, -46411=>1655, -46412=>1656, -46413=>1657, -46416=>1658, -46420=>1659, -46428=>1660, -46429=>1661, -46431=>1662, -46432=>1663, -46433=>1664, -46496=>1665, -46497=>1666, -46500=>1667, -46504=>1668, -46506=>1669, -46507=>1670, -46512=>1671, -46513=>1672, -46515=>1673, -46516=>1674, -46517=>1675, -46523=>1676, -46524=>1677, -46525=>1678, -46528=>1679, -46532=>1680, -46540=>1681, -46541=>1682, -46543=>1683, -46544=>1684, -46545=>1685, -46552=>1686, -46572=>1687, -46608=>1688, -46609=>1689, -46612=>1690, -46616=>1691, -46629=>1692, -46636=>1693, -46644=>1694, -46664=>1695, -46692=>1696, -46696=>1697, -46748=>1698, -46749=>1699, -46752=>1700, -46756=>1701, -46763=>1702, -46764=>1703, -46769=>1704, -46804=>1705, -46832=>1706, -46836=>1707, -46840=>1708, -46848=>1709, -46849=>1710, -46853=>1711, -46888=>1712, -46889=>1713, -46892=>1714, -46895=>1715, -46896=>1716, -46904=>1717, -46905=>1718, -46907=>1719, -46916=>1720, -46920=>1721, -46924=>1722, -46932=>1723, -46933=>1724, -46944=>1725, -46948=>1726, -46952=>1727, -46960=>1728, -46961=>1729, -46963=>1730, -46965=>1731, -46972=>1732, -46973=>1733, -46976=>1734, -46980=>1735, -46988=>1736, -46989=>1737, -46991=>1738, -46992=>1739, -46993=>1740, -46994=>1741, -46998=>1742, -46999=>1743, -47000=>1744, -47001=>1745, -47004=>1746, -47008=>1747, -47016=>1748, -47017=>1749, -47019=>1750, -47020=>1751, -47021=>1752, -47028=>1753, -47029=>1754, -47032=>1755, -47047=>1756, -47049=>1757, -47084=>1758, -47085=>1759, -47088=>1760, -47092=>1761, -47100=>1762, -47101=>1763, -47103=>1764, -47104=>1765, -47105=>1766, -47111=>1767, -47112=>1768, -47113=>1769, -47116=>1770, -47120=>1771, -47128=>1772, -47129=>1773, -47131=>1774, -47133=>1775, -47140=>1776, -47141=>1777, -47144=>1778, -47148=>1779, -47156=>1780, -47157=>1781, -47159=>1782, -47160=>1783, -47161=>1784, -47168=>1785, -47172=>1786, -47185=>1787, -47187=>1788, -47196=>1789, -47197=>1790, -47200=>1791, -47204=>1792, -47212=>1793, -47213=>1794, -47215=>1795, -47217=>1796, -47224=>1797, -47228=>1798, -47245=>1799, -47272=>1800, -47280=>1801, -47284=>1802, -47288=>1803, -47296=>1804, -47297=>1805, -47299=>1806, -47301=>1807, -47308=>1808, -47312=>1809, -47316=>1810, -47325=>1811, -47327=>1812, -47329=>1813, -47336=>1814, -47337=>1815, -47340=>1816, -47344=>1817, -47352=>1818, -47353=>1819, -47355=>1820, -47357=>1821, -47364=>1822, -47384=>1823, -47392=>1824, -47420=>1825, -47421=>1826, -47424=>1827, -47428=>1828, -47436=>1829, -47439=>1830, -47441=>1831, -47448=>1832, -47449=>1833, -47452=>1834, -47456=>1835, -47464=>1836, -47465=>1837, -47467=>1838, -47469=>1839, -47476=>1840, -47477=>1841, -47480=>1842, -47484=>1843, -47492=>1844, -47493=>1845, -47495=>1846, -47497=>1847, -47498=>1848, -47501=>1849, -47502=>1850, -47532=>1851, -47533=>1852, -47536=>1853, -47540=>1854, -47548=>1855, -47549=>1856, -47551=>1857, -47553=>1858, -47560=>1859, -47561=>1860, -47564=>1861, -47566=>1862, -47567=>1863, -47568=>1864, -47569=>1865, -47570=>1866, -47576=>1867, -47577=>1868, -47579=>1869, -47581=>1870, -47582=>1871, -47585=>1872, -47587=>1873, -47588=>1874, -47589=>1875, -47592=>1876, -47596=>1877, -47604=>1878, -47605=>1879, -47607=>1880, -47608=>1881, -47609=>1882, -47610=>1883, -47616=>1884, -47617=>1885, -47624=>1886, -47637=>1887, -47672=>1888, -47673=>1889, -47676=>1890, -47680=>1891, -47682=>1892, -47688=>1893, -47689=>1894, -47691=>1895, -47693=>1896, -47694=>1897, -47699=>1898, -47700=>1899, -47701=>1900, -47704=>1901, -47708=>1902, -47716=>1903, -47717=>1904, -47719=>1905, -47720=>1906, -47721=>1907, -47728=>1908, -47729=>1909, -47732=>1910, -47736=>1911, -47747=>1912, -47748=>1913, -47749=>1914, -47751=>1915, -47756=>1916, -47784=>1917, -47785=>1918, -47787=>1919, -47788=>1920, -47792=>1921, -47794=>1922, -47800=>1923, -47801=>1924, -47803=>1925, -47805=>1926, -47812=>1927, -47816=>1928, -47832=>1929, -47833=>1930, -47868=>1931, -47872=>1932, -47876=>1933, -47885=>1934, -47887=>1935, -47889=>1936, -47896=>1937, -47900=>1938, -47904=>1939, -47913=>1940, -47915=>1941, -47924=>1942, -47925=>1943, -47926=>1944, -47928=>1945, -47931=>1946, -47932=>1947, -47933=>1948, -47934=>1949, -47940=>1950, -47941=>1951, -47943=>1952, -47945=>1953, -47949=>1954, -47951=>1955, -47952=>1956, -47956=>1957, -47960=>1958, -47969=>1959, -47971=>1960, -47980=>1961, -48008=>1962, -48012=>1963, -48016=>1964, -48036=>1965, -48040=>1966, -48044=>1967, -48052=>1968, -48055=>1969, -48064=>1970, -48068=>1971, -48072=>1972, -48080=>1973, -48083=>1974, -48120=>1975, -48121=>1976, -48124=>1977, -48127=>1978, -48128=>1979, -48130=>1980, -48136=>1981, -48137=>1982, -48139=>1983, -48140=>1984, -48141=>1985, -48143=>1986, -48145=>1987, -48148=>1988, -48149=>1989, -48150=>1990, -48151=>1991, -48152=>1992, -48155=>1993, -48156=>1994, -48157=>1995, -48158=>1996, -48159=>1997, -48164=>1998, -48165=>1999, -48167=>2000, -48169=>2001, -48173=>2002, -48176=>2003, -48177=>2004, -48180=>2005, -48184=>2006, -48192=>2007, -48193=>2008, -48195=>2009, -48196=>2010, -48197=>2011, -48201=>2012, -48204=>2013, -48205=>2014, -48208=>2015, -48221=>2016, -48260=>2017, -48261=>2018, -48264=>2019, -48267=>2020, -48268=>2021, -48270=>2022, -48276=>2023, -48277=>2024, -48279=>2025, -48281=>2026, -48282=>2027, -48288=>2028, -48289=>2029, -48292=>2030, -48295=>2031, -48296=>2032, -48304=>2033, -48305=>2034, -48307=>2035, -48308=>2036, -48309=>2037, -48316=>2038, -48317=>2039, -48320=>2040, -48324=>2041, -48333=>2042, -48335=>2043, -48336=>2044, -48337=>2045, -48341=>2046, -48344=>2047, -48348=>2048, -48372=>2049, -48373=>2050, -48374=>2051, -48376=>2052, -48380=>2053, -48388=>2054, -48389=>2055, -48391=>2056, -48393=>2057, -48400=>2058, -48404=>2059, -48420=>2060, -48428=>2061, -48448=>2062, -48456=>2063, -48457=>2064, -48460=>2065, -48464=>2066, -48472=>2067, -48473=>2068, -48484=>2069, -48488=>2070, -48512=>2071, -48513=>2072, -48516=>2073, -48519=>2074, -48520=>2075, -48521=>2076, -48522=>2077, -48528=>2078, -48529=>2079, -48531=>2080, -48533=>2081, -48537=>2082, -48538=>2083, -48540=>2084, -48548=>2085, -48560=>2086, -48568=>2087, -48596=>2088, -48597=>2089, -48600=>2090, -48604=>2091, -48617=>2092, -48624=>2093, -48628=>2094, -48632=>2095, -48640=>2096, -48643=>2097, -48645=>2098, -48652=>2099, -48653=>2100, -48656=>2101, -48660=>2102, -48668=>2103, -48669=>2104, -48671=>2105, -48708=>2106, -48709=>2107, -48712=>2108, -48716=>2109, -48718=>2110, -48724=>2111, -48725=>2112, -48727=>2113, -48729=>2114, -48730=>2115, -48731=>2116, -48736=>2117, -48737=>2118, -48740=>2119, -48744=>2120, -48746=>2121, -48752=>2122, -48753=>2123, -48755=>2124, -48756=>2125, -48757=>2126, -48763=>2127, -48764=>2128, -48765=>2129, -48768=>2130, -48772=>2131, -48780=>2132, -48781=>2133, -48783=>2134, -48784=>2135, -48785=>2136, -48792=>2137, -48793=>2138, -48808=>2139, -48848=>2140, -48849=>2141, -48852=>2142, -48855=>2143, -48856=>2144, -48864=>2145, -48867=>2146, -48868=>2147, -48869=>2148, -48876=>2149, -48897=>2150, -48904=>2151, -48905=>2152, -48920=>2153, -48921=>2154, -48923=>2155, -48924=>2156, -48925=>2157, -48960=>2158, -48961=>2159, -48964=>2160, -48968=>2161, -48976=>2162, -48977=>2163, -48981=>2164, -49044=>2165, -49072=>2166, -49093=>2167, -49100=>2168, -49101=>2169, -49104=>2170, -49108=>2171, -49116=>2172, -49119=>2173, -49121=>2174, -49212=>2175, -49233=>2176, -49240=>2177, -49244=>2178, -49248=>2179, -49256=>2180, -49257=>2181, -49296=>2182, -49297=>2183, -49300=>2184, -49304=>2185, -49312=>2186, -49313=>2187, -49315=>2188, -49317=>2189, -49324=>2190, -49325=>2191, -49327=>2192, -49328=>2193, -49331=>2194, -49332=>2195, -49333=>2196, -49334=>2197, -49340=>2198, -49341=>2199, -49343=>2200, -49344=>2201, -49345=>2202, -49349=>2203, -49352=>2204, -49353=>2205, -49356=>2206, -49360=>2207, -49368=>2208, -49369=>2209, -49371=>2210, -49372=>2211, -49373=>2212, -49380=>2213, -49381=>2214, -49384=>2215, -49388=>2216, -49396=>2217, -49397=>2218, -49399=>2219, -49401=>2220, -49408=>2221, -49412=>2222, -49416=>2223, -49424=>2224, -49429=>2225, -49436=>2226, -49437=>2227, -49438=>2228, -49439=>2229, -49440=>2230, -49443=>2231, -49444=>2232, -49446=>2233, -49447=>2234, -49452=>2235, -49453=>2236, -49455=>2237, -49456=>2238, -49457=>2239, -49462=>2240, -49464=>2241, -49465=>2242, -49468=>2243, -49472=>2244, -49480=>2245, -49481=>2246, -49483=>2247, -49484=>2248, -49485=>2249, -49492=>2250, -49493=>2251, -49496=>2252, -49500=>2253, -49508=>2254, -49509=>2255, -49511=>2256, -49512=>2257, -49513=>2258, -49520=>2259, -49524=>2260, -49528=>2261, -49541=>2262, -49548=>2263, -49549=>2264, -49550=>2265, -49552=>2266, -49556=>2267, -49558=>2268, -49564=>2269, -49565=>2270, -49567=>2271, -49569=>2272, -49573=>2273, -49576=>2274, -49577=>2275, -49580=>2276, -49584=>2277, -49597=>2278, -49604=>2279, -49608=>2280, -49612=>2281, -49620=>2282, -49623=>2283, -49624=>2284, -49632=>2285, -49636=>2286, -49640=>2287, -49648=>2288, -49649=>2289, -49651=>2290, -49660=>2291, -49661=>2292, -49664=>2293, -49668=>2294, -49676=>2295, -49677=>2296, -49679=>2297, -49681=>2298, -49688=>2299, -49689=>2300, -49692=>2301, -49695=>2302, -49696=>2303, -49704=>2304, -49705=>2305, -49707=>2306, -49709=>2307, -49711=>2308, -49713=>2309, -49714=>2310, -49716=>2311, -49736=>2312, -49744=>2313, -49745=>2314, -49748=>2315, -49752=>2316, -49760=>2317, -49765=>2318, -49772=>2319, -49773=>2320, -49776=>2321, -49780=>2322, -49788=>2323, -49789=>2324, -49791=>2325, -49793=>2326, -49800=>2327, -49801=>2328, -49808=>2329, -49816=>2330, -49819=>2331, -49821=>2332, -49828=>2333, -49829=>2334, -49832=>2335, -49836=>2336, -49837=>2337, -49844=>2338, -49845=>2339, -49847=>2340, -49849=>2341, -49884=>2342, -49885=>2343, -49888=>2344, -49891=>2345, -49892=>2346, -49899=>2347, -49900=>2348, -49901=>2349, -49903=>2350, -49905=>2351, -49910=>2352, -49912=>2353, -49913=>2354, -49915=>2355, -49916=>2356, -49920=>2357, -49928=>2358, -49929=>2359, -49932=>2360, -49933=>2361, -49939=>2362, -49940=>2363, -49941=>2364, -49944=>2365, -49948=>2366, -49956=>2367, -49957=>2368, -49960=>2369, -49961=>2370, -49989=>2371, -50024=>2372, -50025=>2373, -50028=>2374, -50032=>2375, -50034=>2376, -50040=>2377, -50041=>2378, -50044=>2379, -50045=>2380, -50052=>2381, -50056=>2382, -50060=>2383, -50112=>2384, -50136=>2385, -50137=>2386, -50140=>2387, -50143=>2388, -50144=>2389, -50146=>2390, -50152=>2391, -50153=>2392, -50157=>2393, -50164=>2394, -50165=>2395, -50168=>2396, -50184=>2397, -50192=>2398, -50212=>2399, -50220=>2400, -50224=>2401, -50228=>2402, -50236=>2403, -50237=>2404, -50248=>2405, -50276=>2406, -50277=>2407, -50280=>2408, -50284=>2409, -50292=>2410, -50293=>2411, -50297=>2412, -50304=>2413, -50324=>2414, -50332=>2415, -50360=>2416, -50364=>2417, -50409=>2418, -50416=>2419, -50417=>2420, -50420=>2421, -50424=>2422, -50426=>2423, -50431=>2424, -50432=>2425, -50433=>2426, -50444=>2427, -50448=>2428, -50452=>2429, -50460=>2430, -50472=>2431, -50473=>2432, -50476=>2433, -50480=>2434, -50488=>2435, -50489=>2436, -50491=>2437, -50493=>2438, -50500=>2439, -50501=>2440, -50504=>2441, -50505=>2442, -50506=>2443, -50508=>2444, -50509=>2445, -50510=>2446, -50515=>2447, -50516=>2448, -50517=>2449, -50519=>2450, -50520=>2451, -50521=>2452, -50525=>2453, -50526=>2454, -50528=>2455, -50529=>2456, -50532=>2457, -50536=>2458, -50544=>2459, -50545=>2460, -50547=>2461, -50548=>2462, -50549=>2463, -50556=>2464, -50557=>2465, -50560=>2466, -50564=>2467, -50567=>2468, -50572=>2469, -50573=>2470, -50575=>2471, -50577=>2472, -50581=>2473, -50583=>2474, -50584=>2475, -50588=>2476, -50592=>2477, -50601=>2478, -50612=>2479, -50613=>2480, -50616=>2481, -50617=>2482, -50619=>2483, -50620=>2484, -50621=>2485, -50622=>2486, -50628=>2487, -50629=>2488, -50630=>2489, -50631=>2490, -50632=>2491, -50633=>2492, -50634=>2493, -50636=>2494, -50638=>2495, -50640=>2496, -50641=>2497, -50644=>2498, -50648=>2499, -50656=>2500, -50657=>2501, -50659=>2502, -50661=>2503, -50668=>2504, -50669=>2505, -50670=>2506, -50672=>2507, -50676=>2508, -50678=>2509, -50679=>2510, -50684=>2511, -50685=>2512, -50686=>2513, -50687=>2514, -50688=>2515, -50689=>2516, -50693=>2517, -50694=>2518, -50695=>2519, -50696=>2520, -50700=>2521, -50704=>2522, -50712=>2523, -50713=>2524, -50715=>2525, -50716=>2526, -50724=>2527, -50725=>2528, -50728=>2529, -50732=>2530, -50733=>2531, -50734=>2532, -50736=>2533, -50739=>2534, -50740=>2535, -50741=>2536, -50743=>2537, -50745=>2538, -50747=>2539, -50752=>2540, -50753=>2541, -50756=>2542, -50760=>2543, -50768=>2544, -50769=>2545, -50771=>2546, -50772=>2547, -50773=>2548, -50780=>2549, -50781=>2550, -50784=>2551, -50796=>2552, -50799=>2553, -50801=>2554, -50808=>2555, -50809=>2556, -50812=>2557, -50816=>2558, -50824=>2559, -50825=>2560, -50827=>2561, -50829=>2562, -50836=>2563, -50837=>2564, -50840=>2565, -50844=>2566, -50852=>2567, -50853=>2568, -50855=>2569, -50857=>2570, -50864=>2571, -50865=>2572, -50868=>2573, -50872=>2574, -50873=>2575, -50874=>2576, -50880=>2577, -50881=>2578, -50883=>2579, -50885=>2580, -50892=>2581, -50893=>2582, -50896=>2583, -50900=>2584, -50908=>2585, -50909=>2586, -50912=>2587, -50913=>2588, -50920=>2589, -50921=>2590, -50924=>2591, -50928=>2592, -50936=>2593, -50937=>2594, -50941=>2595, -50948=>2596, -50949=>2597, -50952=>2598, -50956=>2599, -50964=>2600, -50965=>2601, -50967=>2602, -50969=>2603, -50976=>2604, -50977=>2605, -50980=>2606, -50984=>2607, -50992=>2608, -50993=>2609, -50995=>2610, -50997=>2611, -50999=>2612, -51004=>2613, -51005=>2614, -51008=>2615, -51012=>2616, -51018=>2617, -51020=>2618, -51021=>2619, -51023=>2620, -51025=>2621, -51026=>2622, -51027=>2623, -51028=>2624, -51029=>2625, -51030=>2626, -51031=>2627, -51032=>2628, -51036=>2629, -51040=>2630, -51048=>2631, -51051=>2632, -51060=>2633, -51061=>2634, -51064=>2635, -51068=>2636, -51069=>2637, -51070=>2638, -51075=>2639, -51076=>2640, -51077=>2641, -51079=>2642, -51080=>2643, -51081=>2644, -51082=>2645, -51086=>2646, -51088=>2647, -51089=>2648, -51092=>2649, -51094=>2650, -51095=>2651, -51096=>2652, -51098=>2653, -51104=>2654, -51105=>2655, -51107=>2656, -51108=>2657, -51109=>2658, -51110=>2659, -51116=>2660, -51117=>2661, -51120=>2662, -51124=>2663, -51132=>2664, -51133=>2665, -51135=>2666, -51136=>2667, -51137=>2668, -51144=>2669, -51145=>2670, -51148=>2671, -51150=>2672, -51152=>2673, -51160=>2674, -51165=>2675, -51172=>2676, -51176=>2677, -51180=>2678, -51200=>2679, -51201=>2680, -51204=>2681, -51208=>2682, -51210=>2683, -51216=>2684, -51217=>2685, -51219=>2686, -51221=>2687, -51222=>2688, -51228=>2689, -51229=>2690, -51232=>2691, -51236=>2692, -51244=>2693, -51245=>2694, -51247=>2695, -51249=>2696, -51256=>2697, -51260=>2698, -51264=>2699, -51272=>2700, -51273=>2701, -51276=>2702, -51277=>2703, -51284=>2704, -51312=>2705, -51313=>2706, -51316=>2707, -51320=>2708, -51322=>2709, -51328=>2710, -51329=>2711, -51331=>2712, -51333=>2713, -51334=>2714, -51335=>2715, -51339=>2716, -51340=>2717, -51341=>2718, -51348=>2719, -51357=>2720, -51359=>2721, -51361=>2722, -51368=>2723, -51388=>2724, -51389=>2725, -51396=>2726, -51400=>2727, -51404=>2728, -51412=>2729, -51413=>2730, -51415=>2731, -51417=>2732, -51424=>2733, -51425=>2734, -51428=>2735, -51445=>2736, -51452=>2737, -51453=>2738, -51456=>2739, -51460=>2740, -51461=>2741, -51462=>2742, -51468=>2743, -51469=>2744, -51471=>2745, -51473=>2746, -51480=>2747, -51500=>2748, -51508=>2749, -51536=>2750, -51537=>2751, -51540=>2752, -51544=>2753, -51552=>2754, -51553=>2755, -51555=>2756, -51564=>2757, -51568=>2758, -51572=>2759, -51580=>2760, -51592=>2761, -51593=>2762, -51596=>2763, -51600=>2764, -51608=>2765, -51609=>2766, -51611=>2767, -51613=>2768, -51648=>2769, -51649=>2770, -51652=>2771, -51655=>2772, -51656=>2773, -51658=>2774, -51664=>2775, -51665=>2776, -51667=>2777, -51669=>2778, -51670=>2779, -51673=>2780, -51674=>2781, -51676=>2782, -51677=>2783, -51680=>2784, -51682=>2785, -51684=>2786, -51687=>2787, -51692=>2788, -51693=>2789, -51695=>2790, -51696=>2791, -51697=>2792, -51704=>2793, -51705=>2794, -51708=>2795, -51712=>2796, -51720=>2797, -51721=>2798, -51723=>2799, -51724=>2800, -51725=>2801, -51732=>2802, -51736=>2803, -51753=>2804, -51788=>2805, -51789=>2806, -51792=>2807, -51796=>2808, -51804=>2809, -51805=>2810, -51807=>2811, -51808=>2812, -51809=>2813, -51816=>2814, -51837=>2815, -51844=>2816, -51864=>2817, -51900=>2818, -51901=>2819, -51904=>2820, -51908=>2821, -51916=>2822, -51917=>2823, -51919=>2824, -51921=>2825, -51923=>2826, -51928=>2827, -51929=>2828, -51936=>2829, -51948=>2830, -51956=>2831, -51976=>2832, -51984=>2833, -51988=>2834, -51992=>2835, -52000=>2836, -52001=>2837, -52033=>2838, -52040=>2839, -52041=>2840, -52044=>2841, -52048=>2842, -52056=>2843, -52057=>2844, -52061=>2845, -52068=>2846, -52088=>2847, -52089=>2848, -52124=>2849, -52152=>2850, -52180=>2851, -52196=>2852, -52199=>2853, -52201=>2854, -52236=>2855, -52237=>2856, -52240=>2857, -52244=>2858, -52252=>2859, -52253=>2860, -52257=>2861, -52258=>2862, -52263=>2863, -52264=>2864, -52265=>2865, -52268=>2866, -52270=>2867, -52272=>2868, -52280=>2869, -52281=>2870, -52283=>2871, -52284=>2872, -52285=>2873, -52286=>2874, -52292=>2875, -52293=>2876, -52296=>2877, -52300=>2878, -52308=>2879, -52309=>2880, -52311=>2881, -52312=>2882, -52313=>2883, -52320=>2884, -52324=>2885, -52326=>2886, -52328=>2887, -52336=>2888, -52341=>2889, -52376=>2890, -52377=>2891, -52380=>2892, -52384=>2893, -52392=>2894, -52393=>2895, -52395=>2896, -52396=>2897, -52397=>2898, -52404=>2899, -52405=>2900, -52408=>2901, -52412=>2902, -52420=>2903, -52421=>2904, -52423=>2905, -52425=>2906, -52432=>2907, -52436=>2908, -52452=>2909, -52460=>2910, -52464=>2911, -52481=>2912, -52488=>2913, -52489=>2914, -52492=>2915, -52496=>2916, -52504=>2917, -52505=>2918, -52507=>2919, -52509=>2920, -52516=>2921, -52520=>2922, -52524=>2923, -52537=>2924, -52572=>2925, -52576=>2926, -52580=>2927, -52588=>2928, -52589=>2929, -52591=>2930, -52593=>2931, -52600=>2932, -52616=>2933, -52628=>2934, -52629=>2935, -52632=>2936, -52636=>2937, -52644=>2938, -52645=>2939, -52647=>2940, -52649=>2941, -52656=>2942, -52676=>2943, -52684=>2944, -52688=>2945, -52712=>2946, -52716=>2947, -52720=>2948, -52728=>2949, -52729=>2950, -52731=>2951, -52733=>2952, -52740=>2953, -52744=>2954, -52748=>2955, -52756=>2956, -52761=>2957, -52768=>2958, -52769=>2959, -52772=>2960, -52776=>2961, -52784=>2962, -52785=>2963, -52787=>2964, -52789=>2965, -52824=>2966, -52825=>2967, -52828=>2968, -52831=>2969, -52832=>2970, -52833=>2971, -52840=>2972, -52841=>2973, -52843=>2974, -52845=>2975, -52852=>2976, -52853=>2977, -52856=>2978, -52860=>2979, -52868=>2980, -52869=>2981, -52871=>2982, -52873=>2983, -52880=>2984, -52881=>2985, -52884=>2986, -52888=>2987, -52896=>2988, -52897=>2989, -52899=>2990, -52900=>2991, -52901=>2992, -52908=>2993, -52909=>2994, -52929=>2995, -52964=>2996, -52965=>2997, -52968=>2998, -52971=>2999, -52972=>3000, -52980=>3001, -52981=>3002, -52983=>3003, -52984=>3004, -52985=>3005, -52992=>3006, -52993=>3007, -52996=>3008, -53000=>3009, -53008=>3010, -53009=>3011, -53011=>3012, -53013=>3013, -53020=>3014, -53024=>3015, -53028=>3016, -53036=>3017, -53037=>3018, -53039=>3019, -53040=>3020, -53041=>3021, -53048=>3022, -53076=>3023, -53077=>3024, -53080=>3025, -53084=>3026, -53092=>3027, -53093=>3028, -53095=>3029, -53097=>3030, -53104=>3031, -53105=>3032, -53108=>3033, -53112=>3034, -53120=>3035, -53125=>3036, -53132=>3037, -53153=>3038, -53160=>3039, -53168=>3040, -53188=>3041, -53216=>3042, -53217=>3043, -53220=>3044, -53224=>3045, -53232=>3046, -53233=>3047, -53235=>3048, -53237=>3049, -53244=>3050, -53248=>3051, -53252=>3052, -53265=>3053, -53272=>3054, -53293=>3055, -53300=>3056, -53301=>3057, -53304=>3058, -53308=>3059, -53316=>3060, -53317=>3061, -53319=>3062, -53321=>3063, -53328=>3064, -53332=>3065, -53336=>3066, -53344=>3067, -53356=>3068, -53357=>3069, -53360=>3070, -53364=>3071, -53372=>3072, -53373=>3073, -53377=>3074, -53412=>3075, -53413=>3076, -53416=>3077, -53420=>3078, -53428=>3079, -53429=>3080, -53431=>3081, -53433=>3082, -53440=>3083, -53441=>3084, -53444=>3085, -53448=>3086, -53449=>3087, -53456=>3088, -53457=>3089, -53459=>3090, -53460=>3091, -53461=>3092, -53468=>3093, -53469=>3094, -53472=>3095, -53476=>3096, -53484=>3097, -53485=>3098, -53487=>3099, -53488=>3100, -53489=>3101, -53496=>3102, -53517=>3103, -53552=>3104, -53553=>3105, -53556=>3106, -53560=>3107, -53562=>3108, -53568=>3109, -53569=>3110, -53571=>3111, -53572=>3112, -53573=>3113, -53580=>3114, -53581=>3115, -53584=>3116, -53588=>3117, -53596=>3118, -53597=>3119, -53599=>3120, -53601=>3121, -53608=>3122, -53612=>3123, -53628=>3124, -53636=>3125, -53640=>3126, -53664=>3127, -53665=>3128, -53668=>3129, -53672=>3130, -53680=>3131, -53681=>3132, -53683=>3133, -53685=>3134, -53690=>3135, -53692=>3136, -53696=>3137, -53720=>3138, -53748=>3139, -53752=>3140, -53767=>3141, -53769=>3142, -53776=>3143, -53804=>3144, -53805=>3145, -53808=>3146, -53812=>3147, -53820=>3148, -53821=>3149, -53823=>3150, -53825=>3151, -53832=>3152, -53852=>3153, -53860=>3154, -53888=>3155, -53889=>3156, -53892=>3157, -53896=>3158, -53904=>3159, -53905=>3160, -53909=>3161, -53916=>3162, -53920=>3163, -53924=>3164, -53932=>3165, -53937=>3166, -53944=>3167, -53945=>3168, -53948=>3169, -53951=>3170, -53952=>3171, -53954=>3172, -53960=>3173, -53961=>3174, -53963=>3175, -53972=>3176, -53976=>3177, -53980=>3178, -53988=>3179, -53989=>3180, -54000=>3181, -54001=>3182, -54004=>3183, -54008=>3184, -54016=>3185, -54017=>3186, -54019=>3187, -54021=>3188, -54028=>3189, -54029=>3190, -54030=>3191, -54032=>3192, -54036=>3193, -54038=>3194, -54044=>3195, -54045=>3196, -54047=>3197, -54048=>3198, -54049=>3199, -54053=>3200, -54056=>3201, -54057=>3202, -54060=>3203, -54064=>3204, -54072=>3205, -54073=>3206, -54075=>3207, -54076=>3208, -54077=>3209, -54084=>3210, -54085=>3211, -54140=>3212, -54141=>3213, -54144=>3214, -54148=>3215, -54156=>3216, -54157=>3217, -54159=>3218, -54160=>3219, -54161=>3220, -54168=>3221, -54169=>3222, -54172=>3223, -54176=>3224, -54184=>3225, -54185=>3226, -54187=>3227, -54189=>3228, -54196=>3229, -54200=>3230, -54204=>3231, -54212=>3232, -54213=>3233, -54216=>3234, -54217=>3235, -54224=>3236, -54232=>3237, -54241=>3238, -54243=>3239, -54252=>3240, -54253=>3241, -54256=>3242, -54260=>3243, -54268=>3244, -54269=>3245, -54271=>3246, -54273=>3247, -54280=>3248, -54301=>3249, -54336=>3250, -54340=>3251, -54364=>3252, -54368=>3253, -54372=>3254, -54381=>3255, -54383=>3256, -54392=>3257, -54393=>3258, -54396=>3259, -54399=>3260, -54400=>3261, -54402=>3262, -54408=>3263, -54409=>3264, -54411=>3265, -54413=>3266, -54420=>3267, -54441=>3268, -54476=>3269, -54480=>3270, -54484=>3271, -54492=>3272, -54495=>3273, -54504=>3274, -54508=>3275, -54512=>3276, -54520=>3277, -54523=>3278, -54525=>3279, -54532=>3280, -54536=>3281, -54540=>3282, -54548=>3283, -54549=>3284, -54551=>3285, -54588=>3286, -54589=>3287, -54592=>3288, -54596=>3289, -54604=>3290, -54605=>3291, -54607=>3292, -54609=>3293, -54616=>3294, -54617=>3295, -54620=>3296, -54624=>3297, -54629=>3298, -54632=>3299, -54633=>3300, -54635=>3301, -54637=>3302, -54644=>3303, -54645=>3304, -54648=>3305, -54652=>3306, -54660=>3307, -54661=>3308, -54663=>3309, -54664=>3310, -54665=>3311, -54672=>3312, -54693=>3313, -54728=>3314, -54729=>3315, -54732=>3316, -54736=>3317, -54738=>3318, -54744=>3319, -54745=>3320, -54747=>3321, -54749=>3322, -54756=>3323, -54757=>3324, -54760=>3325, -54764=>3326, -54772=>3327, -54773=>3328, -54775=>3329, -54777=>3330, -54784=>3331, -54785=>3332, -54788=>3333, -54792=>3334, -54800=>3335, -54801=>3336, -54803=>3337, -54804=>3338, -54805=>3339, -54812=>3340, -54816=>3341, -54820=>3342, -54829=>3343, -54840=>3344, -54841=>3345, -54844=>3346, -54848=>3347, -54853=>3348, -54856=>3349, -54857=>3350, -54859=>3351, -54861=>3352, -54865=>3353, -54868=>3354, -54869=>3355, -54872=>3356, -54876=>3357, -54887=>3358, -54889=>3359, -54896=>3360, -54897=>3361, -54900=>3362, -54915=>3363, -54917=>3364, -54924=>3365, -54925=>3366, -54928=>3367, -54932=>3368, -54941=>3369, -54943=>3370, -54945=>3371, -54952=>3372, -54956=>3373, -54960=>3374, -54969=>3375, -54971=>3376, -54980=>3377, -54981=>3378, -54984=>3379, -54988=>3380, -54993=>3381, -54996=>3382, -54999=>3383, -55001=>3384, -55008=>3385, -55012=>3386, -55016=>3387, -55024=>3388, -55029=>3389, -55036=>3390, -55037=>3391, -55040=>3392, -55044=>3393, -55057=>3394, -55064=>3395, -55065=>3396, -55068=>3397, -55072=>3398, -55080=>3399, -55081=>3400, -55083=>3401, -55085=>3402, -55092=>3403, -55093=>3404, -55096=>3405, -55100=>3406, -55108=>3407, -55111=>3408, -55113=>3409, -55120=>3410, -55121=>3411, -55124=>3412, -55126=>3413, -55127=>3414, -55128=>3415, -55129=>3416, -55136=>3417, -55137=>3418, -55139=>3419, -55141=>3420, -55145=>3421, -55148=>3422, -55152=>3423, -55156=>3424, -55164=>3425, -55165=>3426, -55169=>3427, -55176=>3428, -55177=>3429, -55180=>3430, -55184=>3431, -55192=>3432, -55193=>3433, -55195=>3434, -55197=>3435, -20285=>3436, -20339=>3437, -20551=>3438, -20729=>3439, -21152=>3440, -21487=>3441, -21621=>3442, -21733=>3443, -22025=>3444, -23233=>3445, -23478=>3446, -26247=>3447, -26550=>3448, -26551=>3449, -26607=>3450, -27468=>3451, -29634=>3452, -30146=>3453, -31292=>3454, -33499=>3455, -33540=>3456, -34903=>3457, -34952=>3458, -35382=>3459, -36040=>3460, -63747=>3460, -36303=>3461, -36603=>3462, -36838=>3463, -39381=>3464, -21051=>3465, -21364=>3466, -21508=>3467, -24682=>3468, -24932=>3469, -27580=>3470, -29647=>3471, -33050=>3472, -35258=>3473, -12179=>3474, -35282=>3474, -38307=>3475, -20355=>3476, -21002=>3477, -22718=>3478, -22904=>3479, -23014=>3480, -12082=>3481, -24178=>3481, -24185=>3482, -25031=>3483, -25536=>3484, -26438=>3485, -26604=>3486, -26751=>3487, -28567=>3488, -30286=>3489, -30475=>3490, -30965=>3491, -31240=>3492, -31487=>3493, -31777=>3494, -32925=>3495, -12169=>3496, -33390=>3496, -33393=>3497, -35563=>3498, -38291=>3499, -20075=>3500, -21917=>3501, -26359=>3502, -28212=>3503, -30883=>3504, -31469=>3505, -33883=>3506, -35088=>3507, -34638=>3508, -38824=>3509, -21208=>3510, -22350=>3511, -22570=>3512, -23884=>3513, -24863=>3514, -25022=>3515, -25121=>3516, -25954=>3517, -26577=>3518, -27204=>3519, -28187=>3520, -12130=>3521, -29976=>3521, -30131=>3522, -30435=>3523, -30640=>3524, -32058=>3525, -37039=>3526, -37969=>3527, -37970=>3528, -40853=>3529, -21283=>3530, -23724=>3531, -30002=>3532, -32987=>3533, -37440=>3534, -38296=>3535, -21083=>3536, -22536=>3537, -23004=>3538, -23713=>3539, -23831=>3540, -24247=>3541, -24378=>3542, -24394=>3543, -24951=>3544, -27743=>3545, -30074=>3546, -30086=>3547, -31968=>3548, -32115=>3549, -32177=>3550, -32652=>3551, -33108=>3552, -33313=>3553, -34193=>3554, -35137=>3555, -35611=>3556, -37628=>3557, -38477=>3558, -64009=>3558, -40007=>3559, -20171=>3560, -20215=>3561, -20491=>3562, -20977=>3563, -22607=>3564, -24887=>3565, -24894=>3566, -24936=>3567, -25913=>3568, -27114=>3569, -28433=>3570, -30117=>3571, -30342=>3572, -30422=>3573, -31623=>3574, -33445=>3575, -33995=>3576, -37799=>3577, -38283=>3578, -21888=>3579, -23458=>3580, -22353=>3581, -31923=>3582, -32697=>3583, -37301=>3584, -20520=>3585, -21435=>3586, -23621=>3587, -24040=>3588, -25298=>3589, -25454=>3590, -25818=>3591, -25831=>3592, -28192=>3593, -28844=>3594, -31067=>3595, -36317=>3596, -36382=>3597, -36989=>3598, -37445=>3599, -37624=>3600, -20094=>3601, -20214=>3602, -20581=>3603, -12081=>3604, -24062=>3604, -24314=>3605, -24838=>3606, -26967=>3607, -33137=>3608, -34388=>3609, -36423=>3610, -37749=>3611, -39467=>3612, -20062=>3613, -20625=>3614, -26480=>3615, -26688=>3616, -20745=>3617, -21133=>3618, -21138=>3619, -27298=>3620, -30652=>3621, -37392=>3622, -40660=>3623, -21163=>3624, -24623=>3625, -36850=>3626, -20552=>3627, -25001=>3628, -25581=>3629, -25802=>3630, -26684=>3631, -27268=>3632, -28608=>3633, -33160=>3634, -35233=>3635, -38548=>3636, -22533=>3637, -29309=>3638, -12125=>3639, -29356=>3639, -29956=>3640, -32121=>3641, -32365=>3642, -32937=>3643, -12178=>3644, -35211=>3644, -64010=>3644, -35700=>3645, -36963=>3646, -40273=>3647, -25225=>3648, -27770=>3649, -28500=>3650, -32080=>3651, -32570=>3652, -35363=>3653, -20860=>3654, -24906=>3655, -31645=>3656, -35609=>3657, -37463=>3658, -37772=>3659, -20140=>3660, -20435=>3661, -20510=>3662, -20670=>3663, -20742=>3664, -21185=>3665, -21197=>3666, -21375=>3667, -22384=>3668, -22659=>3669, -24218=>3670, -24465=>3671, -24950=>3672, -25004=>3673, -25806=>3674, -25964=>3675, -26223=>3676, -26299=>3677, -26356=>3678, -63745=>3678, -26775=>3679, -28039=>3680, -28805=>3681, -28913=>3682, -29855=>3683, -29861=>3684, -29898=>3685, -30169=>3686, -30828=>3687, -30956=>3688, -31455=>3689, -31478=>3690, -32069=>3691, -32147=>3692, -32789=>3693, -32831=>3694, -33051=>3695, -33686=>3696, -35686=>3697, -36629=>3698, -36885=>3699, -37857=>3700, -38915=>3701, -38968=>3702, -39514=>3703, -39912=>3704, -20418=>3705, -21843=>3706, -22586=>3707, -22865=>3708, -63753=>3708, -23395=>3709, -23622=>3710, -24760=>3711, -25106=>3712, -26690=>3713, -26800=>3714, -26856=>3715, -28330=>3716, -30028=>3717, -30328=>3718, -30926=>3719, -31293=>3720, -31995=>3721, -32363=>3722, -32380=>3723, -35336=>3724, -35489=>3725, -35903=>3726, -38542=>3727, -40388=>3728, -21476=>3729, -21481=>3730, -21578=>3731, -21617=>3732, -22266=>3733, -22993=>3734, -23396=>3735, -23611=>3736, -24235=>3737, -25335=>3738, -25911=>3739, -25925=>3740, -25970=>3741, -26272=>3742, -26543=>3743, -27073=>3744, -27837=>3745, -30204=>3746, -30352=>3747, -30590=>3748, -31295=>3749, -32660=>3750, -32771=>3751, -32929=>3752, -33167=>3753, -33510=>3754, -33533=>3755, -33776=>3756, -34241=>3757, -34865=>3758, -34996=>3759, -35493=>3760, -36764=>3761, -37678=>3762, -38599=>3763, -39015=>3764, -12220=>3765, -39640=>3765, -12238=>3766, -40723=>3766, -21741=>3767, -26011=>3768, -26354=>3769, -26767=>3770, -31296=>3771, -12181=>3772, -35895=>3772, -40288=>3773, -22256=>3774, -22372=>3775, -23825=>3776, -26118=>3777, -26801=>3778, -26829=>3779, -28414=>3780, -29736=>3781, -34974=>3782, -39908=>3783, -27752=>3784, -12219=>3785, -39592=>3785, -20379=>3786, -20844=>3787, -20849=>3788, -21151=>3789, -23380=>3790, -12079=>3791, -24037=>3791, -24656=>3792, -24685=>3793, -25329=>3794, -25511=>3795, -25915=>3796, -29657=>3797, -31354=>3798, -34467=>3799, -36002=>3800, -38799=>3801, -20018=>3802, -63749=>3802, -23521=>3803, -12093=>3804, -25096=>3804, -26524=>3805, -12128=>3806, -29916=>3806, -31185=>3807, -33747=>3808, -35463=>3809, -35506=>3810, -36328=>3811, -36942=>3812, -37707=>3813, -38982=>3814, -24275=>3815, -64011=>3815, -27112=>3816, -34303=>3817, -37101=>3818, -20896=>3819, -23448=>3820, -23532=>3821, -24931=>3822, -26874=>3823, -27454=>3824, -28748=>3825, -29743=>3826, -29912=>3827, -31649=>3828, -32592=>3829, -33733=>3830, -35264=>3831, -36011=>3832, -38364=>3833, -39208=>3834, -21038=>3835, -24669=>3836, -25324=>3837, -36866=>3838, -20362=>3839, -20809=>3840, -21281=>3841, -22745=>3842, -24291=>3843, -26336=>3844, -27960=>3845, -28826=>3846, -29378=>3847, -29654=>3848, -31568=>3849, -33009=>3850, -37979=>3851, -21350=>3852, -25499=>3853, -32619=>3854, -20054=>3855, -20608=>3856, -22602=>3857, -22750=>3858, -24618=>3859, -24871=>3860, -25296=>3861, -27088=>3862, -39745=>3863, -23439=>3864, -32024=>3865, -32945=>3866, -36703=>3867, -20132=>3868, -20689=>3869, -21676=>3870, -21932=>3871, -23308=>3872, -23968=>3873, -24039=>3874, -25898=>3875, -25934=>3876, -26657=>3877, -27211=>3878, -29409=>3879, -30350=>3880, -30703=>3881, -32094=>3882, -32761=>3883, -33184=>3884, -34126=>3885, -34527=>3886, -36611=>3887, -36686=>3888, -37066=>3889, -39171=>3890, -39509=>3891, -39851=>3892, -19992=>3893, -20037=>3894, -20061=>3895, -20167=>3896, -20465=>3897, -20855=>3898, -21246=>3899, -21312=>3900, -12061=>3901, -21475=>3901, -21477=>3902, -63750=>3902, -21646=>3903, -22036=>3904, -22389=>3905, -22434=>3906, -23495=>3907, -23943=>3908, -24272=>3909, -25084=>3910, -25304=>3911, -25937=>3912, -26552=>3913, -26601=>3914, -27083=>3915, -27472=>3916, -27590=>3917, -27628=>3918, -27714=>3919, -28317=>3920, -28792=>3921, -29399=>3922, -29590=>3923, -29699=>3924, -30655=>3925, -30697=>3926, -31350=>3927, -32127=>3928, -32777=>3929, -12165=>3930, -33276=>3930, -33285=>3931, -33290=>3932, -33503=>3933, -34914=>3934, -35635=>3935, -36092=>3936, -36544=>3937, -36881=>3938, -37041=>3939, -37476=>3940, -37558=>3941, -39378=>3942, -39493=>3943, -40169=>3944, -40407=>3945, -12244=>3946, -40860=>3946, -63751=>3946, -63752=>3946, -22283=>3947, -23616=>3948, -33738=>3949, -38816=>3950, -38827=>3951, -40628=>3952, -21531=>3953, -31384=>3954, -32676=>3955, -35033=>3956, -36557=>3957, -37089=>3958, -22528=>3959, -23624=>3960, -25496=>3961, -31391=>3962, -23470=>3963, -12088=>3964, -24339=>3964, -31353=>3965, -31406=>3966, -33422=>3967, -36524=>3968, -20518=>3969, -21048=>3970, -21240=>3971, -21367=>3972, -22280=>3973, -25331=>3974, -25458=>3975, -27402=>3976, -28099=>3977, -30519=>3978, -21413=>3979, -29527=>3980, -34152=>3981, -36470=>3982, -38357=>3983, -26426=>3984, -27331=>3985, -28528=>3986, -35437=>3987, -36556=>3988, -39243=>3989, -26231=>3990, -27512=>3991, -36020=>3992, -12225=>3993, -39740=>3993, -21483=>3994, -22317=>3995, -22862=>3996, -25542=>3997, -27131=>3998, -29674=>3999, -30789=>4000, -31418=>4001, -31429=>4002, -31998=>4003, -33909=>4004, -35215=>4005, -36211=>4006, -36917=>4007, -38312=>4008, -21243=>4009, -22343=>4010, -30023=>4011, -31584=>4012, -33740=>4013, -37406=>4014, -27224=>4015, -20811=>4016, -21067=>4017, -21127=>4018, -25119=>4019, -26840=>4020, -26997=>4021, -38553=>4022, -20677=>4023, -21156=>4024, -21220=>4025, -25027=>4026, -12100=>4027, -26020=>4027, -26681=>4028, -27135=>4029, -29822=>4030, -31563=>4031, -33465=>4032, -33771=>4033, -35250=>4034, -35641=>4035, -36817=>4036, -39241=>4037, -20170=>4038, -22935=>4039, -25810=>4040, -26129=>4041, -27278=>4042, -29748=>4043, -31105=>4044, -31165=>4045, -33449=>4046, -34942=>4047, -34943=>4048, -35167=>4049, -37670=>4050, -20235=>4051, -21450=>4052, -24613=>4053, -25201=>4054, -27762=>4055, -32026=>4056, -32102=>4057, -20120=>4058, -20834=>4059, -30684=>4060, -32943=>4061, -20225=>4062, -20238=>4063, -20854=>4064, -20864=>4065, -21980=>4066, -22120=>4067, -22331=>4068, -22522=>4069, -22524=>4070, -22804=>4071, -22855=>4072, -22931=>4073, -23492=>4074, -23696=>4075, -23822=>4076, -12080=>4077, -24049=>4077, -24190=>4078, -24524=>4079, -25216=>4080, -26071=>4081, -26083=>4082, -26398=>4083, -26399=>4084, -26462=>4085, -26827=>4086, -26820=>4087, -27231=>4088, -27450=>4089, -27683=>4090, -27773=>4091, -27778=>4092, -28103=>4093, -29592=>4094, -29734=>4095, -29738=>4096, -29826=>4097, -29859=>4098, -30072=>4099, -30079=>4100, -30849=>4101, -30959=>4102, -31041=>4103, -31047=>4104, -31048=>4105, -31098=>4106, -31637=>4107, -32000=>4108, -32186=>4109, -32648=>4110, -32774=>4111, -32813=>4112, -32908=>4113, -35352=>4114, -35663=>4115, -35912=>4116, -63744=>4116, -36215=>4117, -37665=>4118, -37668=>4119, -39138=>4120, -39249=>4121, -39438=>4122, -39439=>4123, -39525=>4124, -40594=>4125, -32202=>4126, -20342=>4127, -21513=>4128, -25326=>4129, -26708=>4130, -12198=>4131, -37329=>4131, -63754=>4131, -21931=>4132, -20794=>4133, -23068=>4134, -25062=>4135, -25295=>4136, -63835=>4136, -25343=>4137, -37027=>4138, -35582=>4139, -63837=>4139, -26262=>4140, -29014=>4141, -38627=>4142, -25423=>4143, -25466=>4144, -21335=>4145, -26511=>4146, -26976=>4147, -28275=>4148, -30007=>4149, -32013=>4150, -34930=>4151, -22218=>4152, -23064=>4153, -20035=>4154, -20839=>4155, -22856=>4156, -63756=>4156, -26608=>4157, -32784=>4158, -12069=>4159, -22899=>4159, -63873=>4159, -24180=>4160, -63886=>4160, -25754=>4161, -63889=>4161, -31178=>4162, -63893=>4162, -24565=>4163, -63907=>4163, -24684=>4164, -25288=>4165, -25467=>4166, -63908=>4166, -23527=>4167, -63839=>4167, -63914=>4167, -23511=>4168, -21162=>4169, -22900=>4170, -24361=>4171, -24594=>4172, -63840=>4172, -29785=>4173, -39377=>4174, -28611=>4175, -33215=>4176, -36786=>4177, -24817=>4178, -33126=>4179, -23615=>4180, -63933=>4180, -23273=>4181, -35365=>4182, -26491=>4183, -63944=>4183, -32016=>4184, -63951=>4184, -33021=>4185, -23612=>4186, -27877=>4187, -63971=>4187, -21311=>4188, -63979=>4188, -28346=>4189, -63980=>4189, -22810=>4190, -33590=>4191, -63998=>4191, -20025=>4192, -63838=>4192, -20150=>4193, -20294=>4194, -21934=>4195, -22296=>4196, -22727=>4197, -24406=>4198, -26039=>4199, -26086=>4200, -27264=>4201, -27573=>4202, -28237=>4203, -30701=>4204, -31471=>4205, -31774=>4206, -32222=>4207, -34507=>4208, -34962=>4209, -37170=>4210, -37723=>4211, -25787=>4212, -28606=>4213, -29562=>4214, -30136=>4215, -36948=>4216, -21846=>4217, -22349=>4218, -25018=>4219, -25812=>4220, -26311=>4221, -28129=>4222, -28251=>4223, -28525=>4224, -28601=>4225, -30192=>4226, -32835=>4227, -33213=>4228, -34113=>4229, -35203=>4230, -35527=>4231, -35674=>4232, -37663=>4233, -27795=>4234, -30035=>4235, -31572=>4236, -36367=>4237, -36957=>4238, -21776=>4239, -22530=>4240, -22616=>4241, -24162=>4242, -25095=>4243, -25758=>4244, -26848=>4245, -30070=>4246, -31958=>4247, -64003=>4247, -34739=>4248, -40680=>4249, -20195=>4250, -22408=>4251, -22382=>4252, -12068=>4253, -22823=>4253, -23565=>4254, -23729=>4255, -24118=>4256, -24453=>4257, -25140=>4258, -25825=>4259, -29619=>4260, -33274=>4261, -34955=>4262, -36024=>4263, -38538=>4264, -40667=>4265, -23429=>4266, -64004=>4266, -24503=>4267, -24755=>4268, -20498=>4269, -12049=>4270, -20992=>4270, -21040=>4271, -22294=>4272, -22581=>4273, -22615=>4274, -23566=>4275, -23648=>4276, -23798=>4277, -23947=>4278, -24230=>4279, -64001=>4279, -24466=>4280, -24764=>4281, -25361=>4282, -25481=>4283, -25623=>4284, -26691=>4285, -26873=>4286, -27330=>4287, -28120=>4288, -28193=>4289, -28372=>4290, -28644=>4291, -29182=>4292, -30428=>4293, -30585=>4294, -31153=>4295, -31291=>4296, -33796=>4297, -35241=>4298, -36077=>4299, -36339=>4300, -36424=>4301, -36867=>4302, -36884=>4303, -36947=>4304, -37117=>4305, -37709=>4306, -38518=>4307, -38876=>4308, -27602=>4309, -28678=>4310, -29272=>4311, -29346=>4312, -29544=>4313, -30563=>4314, -31167=>4315, -31716=>4316, -32411=>4317, -35712=>4318, -63834=>4318, -22697=>4319, -24775=>4320, -25958=>4321, -26109=>4322, -26302=>4323, -27788=>4324, -28958=>4325, -29129=>4326, -35930=>4327, -38931=>4328, -20077=>4329, -31361=>4330, -20189=>4331, -20908=>4332, -20941=>4333, -21205=>4334, -21516=>4335, -24999=>4336, -26481=>4337, -26704=>4338, -26847=>4339, -27934=>4340, -64005=>4340, -28540=>4341, -30140=>4342, -30643=>4343, -31461=>4344, -33012=>4345, -33891=>4346, -37509=>4347, -20828=>4348, -12099=>4349, -26007=>4349, -26460=>4350, -26515=>4351, -30168=>4352, -31431=>4353, -33651=>4354, -12182=>4355, -35910=>4355, -36887=>4356, -38957=>4357, -23663=>4358, -33216=>4359, -33434=>4360, -36929=>4361, -36975=>4362, -37389=>4363, -24471=>4364, -23965=>4365, -27225=>4366, -29128=>4367, -30331=>4368, -31561=>4369, -34276=>4370, -35588=>4371, -37159=>4372, -39472=>4373, -21895=>4374, -63755=>4374, -25078=>4375, -63757=>4375, -30313=>4376, -63758=>4376, -32645=>4377, -63759=>4377, -34367=>4378, -63760=>4378, -34746=>4379, -63761=>4379, -35064=>4380, -63762=>4380, -37007=>4381, -63763=>4381, -27931=>4382, -63765=>4382, -28889=>4383, -63766=>4383, -29662=>4384, -63767=>4384, -32097=>4385, -33853=>4386, -63768=>4386, -37226=>4387, -63769=>4387, -39409=>4388, -63770=>4388, -20098=>4389, -63771=>4389, -21365=>4390, -63772=>4390, -27396=>4391, -63773=>4391, -27410=>4392, -28734=>4393, -29211=>4394, -63774=>4394, -34349=>4395, -63775=>4395, -40478=>4396, -63776=>4396, -21068=>4397, -36771=>4398, -23888=>4399, -63777=>4399, -25829=>4400, -25900=>4401, -27414=>4402, -28651=>4403, -63778=>4403, -31811=>4404, -32412=>4405, -34253=>4406, -63779=>4406, -35172=>4407, -63780=>4407, -35261=>4408, -25289=>4409, -63781=>4409, -33240=>4410, -63782=>4410, -34847=>4411, -63783=>4411, -24266=>4412, -63784=>4412, -26391=>4413, -63785=>4413, -28010=>4414, -63786=>4414, -29436=>4415, -63787=>4415, -29701=>4416, -29807=>4417, -34690=>4418, -37086=>4419, -63788=>4419, -20358=>4420, -63789=>4420, -23821=>4421, -24480=>4422, -33802=>4423, -20919=>4424, -63790=>4424, -25504=>4425, -63861=>4425, -30053=>4426, -63862=>4426, -20142=>4427, -63863=>4427, -20486=>4428, -20841=>4429, -63864=>4429, -20937=>4430, -63865=>4430, -26753=>4431, -63866=>4431, -27153=>4432, -31918=>4433, -31921=>4434, -31975=>4435, -63867=>4435, -33391=>4436, -63868=>4436, -35538=>4437, -63869=>4437, -36635=>4438, -37327=>4439, -63870=>4439, -20406=>4440, -20791=>4441, -21237=>4442, -63871=>4442, -21570=>4443, -63872=>4443, -24300=>4444, -63874=>4444, -24942=>4445, -25150=>4446, -26053=>4447, -63875=>4447, -27354=>4448, -28670=>4449, -63876=>4449, -31018=>4450, -63877=>4450, -34268=>4451, -34851=>4452, -38317=>4453, -63878=>4453, -39522=>4454, -39530=>4455, -63879=>4455, -40599=>4456, -63880=>4456, -40654=>4457, -63881=>4457, -12050=>4458, -21147=>4458, -63882=>4458, -26310=>4459, -63883=>4459, -27511=>4460, -63884=>4460, -28701=>4461, -31019=>4462, -36706=>4463, -63885=>4463, -38722=>4464, -24976=>4465, -63887=>4465, -25088=>4466, -63888=>4466, -25891=>4467, -28451=>4468, -63890=>4468, -29001=>4469, -63891=>4469, -29833=>4470, -63892=>4470, -32244=>4471, -63894=>4471, -32879=>4472, -63895=>4472, -34030=>4473, -63897=>4473, -36646=>4474, -63896=>4474, -36899=>4475, -63898=>4475, -37706=>4476, -63899=>4476, -20925=>4477, -21015=>4478, -63900=>4478, -21155=>4479, -63901=>4479, -27916=>4480, -28872=>4481, -63903=>4481, -35010=>4482, -63904=>4482, -24265=>4483, -63906=>4483, -25986=>4484, -27566=>4485, -63909=>4485, -28610=>4486, -31806=>4487, -63910=>4487, -29557=>4488, -63911=>4488, -20196=>4489, -63912=>4489, -20278=>4490, -22265=>4491, -63913=>4491, -23738=>4492, -23994=>4493, -63915=>4493, -24604=>4494, -63916=>4494, -29618=>4495, -63917=>4495, -31533=>4496, -32666=>4497, -63919=>4497, -32718=>4498, -32838=>4499, -63920=>4499, -36894=>4500, -37428=>4501, -63921=>4501, -38646=>4502, -63922=>4502, -38728=>4503, -63923=>4503, -38936=>4504, -63924=>4504, -40801=>4505, -20363=>4506, -63925=>4506, -28583=>4507, -31150=>4508, -63926=>4508, -37300=>4509, -63927=>4509, -38583=>4510, -63928=>4510, -21214=>4511, -63791=>4511, -25736=>4512, -25796=>4513, -63792=>4513, -27347=>4514, -63793=>4514, -28510=>4515, -28696=>4516, -29200=>4517, -63794=>4517, -30439=>4518, -63795=>4518, -12156=>4519, -32769=>4519, -63796=>4519, -34310=>4520, -63797=>4520, -34396=>4521, -63798=>4521, -36335=>4522, -63799=>4522, -36613=>4523, -38706=>4524, -63800=>4524, -39791=>4525, -63801=>4525, -40442=>4526, -63802=>4526, -12228=>4527, -40565=>4527, -30860=>4528, -63803=>4528, -31103=>4529, -63804=>4529, -32160=>4530, -63805=>4530, -33737=>4531, -63806=>4531, -37636=>4532, -63807=>4532, -12229=>4533, -40575=>4533, -63808=>4533, -40595=>4534, -35542=>4535, -63809=>4535, -22751=>4536, -63810=>4536, -24324=>4537, -63811=>4537, -26407=>4538, -28711=>4539, -29903=>4540, -31840=>4541, -63812=>4541, -32894=>4542, -63813=>4542, -20769=>4543, -28712=>4544, -29282=>4545, -63814=>4545, -30922=>4546, -63815=>4546, -36034=>4547, -63816=>4547, -36058=>4548, -36084=>4549, -38647=>4550, -63817=>4550, -20102=>4551, -63930=>4551, -20698=>4552, -63931=>4552, -23534=>4553, -63932=>4553, -24278=>4554, -26009=>4555, -63934=>4555, -29134=>4556, -63936=>4556, -30274=>4557, -63937=>4557, -30637=>4558, -32842=>4559, -34044=>4560, -63938=>4560, -36988=>4561, -63939=>4561, -39719=>4562, -12243=>4563, -40845=>4563, -63940=>4563, -22744=>4564, -63818=>4564, -23105=>4565, -23650=>4566, -63819=>4566, -27155=>4567, -63820=>4567, -28122=>4568, -63821=>4568, -28431=>4569, -63822=>4569, -30267=>4570, -32047=>4571, -63823=>4571, -32311=>4572, -63824=>4572, -34078=>4573, -35128=>4574, -37860=>4575, -38475=>4576, -63825=>4576, -21129=>4577, -63943=>4577, -26066=>4578, -26611=>4579, -63945=>4579, -27060=>4580, -27969=>4581, -63946=>4581, -28316=>4582, -63947=>4582, -28687=>4583, -29705=>4584, -63948=>4584, -29792=>4585, -30041=>4586, -63949=>4586, -30244=>4587, -30827=>4588, -63950=>4588, -35628=>4589, -39006=>4590, -63952=>4590, -20845=>4591, -63953=>4591, -25134=>4592, -63954=>4592, -38520=>4593, -63955=>4593, -20374=>4594, -20523=>4595, -63956=>4595, -23833=>4596, -63957=>4596, -28138=>4597, -63958=>4597, -32184=>4598, -36650=>4599, -63959=>4599, -24459=>4600, -63960=>4600, -24900=>4601, -63961=>4601, -26647=>4602, -63962=>4602, -38534=>4603, -63964=>4603, -21202=>4604, -63826=>4604, -32907=>4605, -63827=>4605, -20956=>4606, -63828=>4606, -20940=>4607, -63829=>4607, -26974=>4608, -31260=>4609, -63830=>4609, -32190=>4610, -63831=>4610, -33777=>4611, -63832=>4611, -38517=>4612, -63833=>4612, -20442=>4613, -21033=>4614, -63965=>4614, -21400=>4615, -21519=>4616, -63966=>4616, -21774=>4617, -23653=>4618, -63967=>4618, -24743=>4619, -26446=>4620, -63969=>4620, -26792=>4621, -63970=>4621, -28012=>4622, -29313=>4623, -29432=>4624, -29702=>4625, -63972=>4625, -29827=>4626, -30178=>4627, -63973=>4627, -31852=>4628, -32633=>4629, -63974=>4629, -32696=>4630, -33673=>4631, -35023=>4632, -63975=>4632, -35041=>4633, -63976=>4633, -12197=>4634, -37324=>4634, -63977=>4634, -37328=>4635, -38626=>4636, -63978=>4636, -39881=>4637, -21533=>4638, -63981=>4638, -28542=>4639, -29136=>4640, -63982=>4640, -29848=>4641, -63983=>4641, -34298=>4642, -63984=>4642, -36522=>4643, -38563=>4644, -63985=>4644, -40023=>4645, -63986=>4645, -40607=>4646, -63987=>4646, -26519=>4647, -63988=>4647, -28107=>4648, -63989=>4648, -29747=>4649, -33256=>4650, -63990=>4650, -38678=>4651, -30764=>4652, -12148=>4653, -31435=>4653, -63991=>4653, -31520=>4654, -63992=>4654, -31890=>4655, -63993=>4655, -25705=>4656, -29802=>4657, -30194=>4658, -30908=>4659, -30952=>4660, -12218=>4661, -39340=>4661, -39764=>4662, -12231=>4663, -40635=>4663, -23518=>4664, -24149=>4665, -28448=>4666, -33180=>4667, -33707=>4668, -37000=>4669, -19975=>4670, -21325=>4671, -23081=>4672, -24018=>4673, -24398=>4674, -24930=>4675, -25405=>4676, -26217=>4677, -26364=>4678, -28415=>4679, -28459=>4680, -28771=>4681, -30622=>4682, -33836=>4683, -34067=>4684, -34875=>4685, -36627=>4686, -39237=>4687, -39995=>4688, -21788=>4689, -25273=>4690, -26411=>4691, -27819=>4692, -33545=>4693, -35178=>4694, -38778=>4695, -20129=>4696, -22916=>4697, -24536=>4698, -24537=>4699, -26395=>4700, -32178=>4701, -32596=>4702, -33426=>4703, -33579=>4704, -33725=>4705, -36638=>4706, -37017=>4707, -22475=>4708, -22969=>4709, -23186=>4710, -23504=>4711, -26151=>4712, -26522=>4713, -26757=>4714, -27599=>4715, -29028=>4716, -32629=>4717, -36023=>4718, -36067=>4719, -36993=>4720, -39749=>4721, -33032=>4722, -35978=>4723, -38476=>4724, -39488=>4725, -12230=>4726, -40613=>4726, -23391=>4727, -27667=>4728, -29467=>4729, -30450=>4730, -30431=>4731, -33804=>4732, -20906=>4733, -35219=>4734, -20813=>4735, -20885=>4736, -21193=>4737, -26825=>4738, -27796=>4739, -30468=>4740, -30496=>4741, -32191=>4742, -32236=>4743, -12207=>4744, -38754=>4744, -40629=>4745, -28357=>4746, -34065=>4747, -20901=>4748, -21517=>4749, -21629=>4750, -26126=>4751, -26269=>4752, -26919=>4753, -28319=>4754, -12139=>4755, -30399=>4755, -30609=>4756, -33559=>4757, -33986=>4758, -34719=>4759, -37225=>4760, -37528=>4761, -40180=>4762, -34946=>4763, -20398=>4764, -20882=>4765, -21215=>4766, -22982=>4767, -24125=>4768, -24917=>4769, -25720=>4770, -25721=>4771, -26286=>4772, -26576=>4773, -27169=>4774, -27597=>4775, -12113=>4776, -27611=>4776, -29279=>4777, -29281=>4778, -29761=>4779, -30520=>4780, -12141=>4781, -30683=>4781, -32791=>4782, -33468=>4783, -33541=>4784, -35584=>4785, -35624=>4786, -35980=>4787, -12106=>4788, -26408=>4788, -27792=>4789, -29287=>4790, -12140=>4791, -30446=>4791, -30566=>4792, -31302=>4793, -40361=>4794, -27519=>4795, -27794=>4796, -22818=>4797, -26406=>4798, -33945=>4799, -21359=>4800, -22675=>4801, -22937=>4802, -24287=>4803, -25551=>4804, -26164=>4805, -26483=>4806, -28218=>4807, -29483=>4808, -31447=>4809, -33495=>4810, -37672=>4811, -21209=>4812, -24043=>4813, -25006=>4814, -25035=>4815, -25098=>4816, -25287=>4817, -25771=>4818, -12102=>4819, -26080=>4819, -26969=>4820, -27494=>4821, -12111=>4822, -27595=>4822, -28961=>4823, -29687=>4824, -30045=>4825, -32326=>4826, -33310=>4827, -33538=>4828, -34154=>4829, -35491=>4830, -36031=>4831, -38695=>4832, -40289=>4833, -22696=>4834, -40664=>4835, -20497=>4836, -21006=>4837, -21563=>4838, -21839=>4839, -12098=>4840, -25991=>4840, -27766=>4841, -32010=>4842, -32011=>4843, -32862=>4844, -34442=>4845, -12200=>4846, -38272=>4846, -38639=>4847, -21247=>4848, -27797=>4849, -29289=>4850, -21619=>4851, -23194=>4852, -23614=>4853, -23883=>4854, -24396=>4855, -24494=>4856, -26410=>4857, -26806=>4858, -26979=>4859, -28220=>4860, -28228=>4861, -30473=>4862, -12150=>4863, -31859=>4863, -32654=>4864, -34183=>4865, -35598=>4866, -36855=>4867, -38753=>4868, -40692=>4869, -23735=>4870, -24758=>4871, -24845=>4872, -25003=>4873, -25935=>4874, -26107=>4875, -26108=>4876, -27665=>4877, -27887=>4878, -29599=>4879, -29641=>4880, -32225=>4881, -38292=>4882, -23494=>4883, -34588=>4884, -35600=>4885, -21085=>4886, -21338=>4887, -25293=>4888, -25615=>4889, -25778=>4890, -26420=>4891, -27192=>4892, -27850=>4893, -29632=>4894, -29854=>4895, -31636=>4896, -31893=>4897, -32283=>4898, -33162=>4899, -33334=>4900, -34180=>4901, -36843=>4902, -38649=>4903, -39361=>4904, -20276=>4905, -21322=>4906, -21453=>4907, -21467=>4908, -25292=>4909, -25644=>4910, -25856=>4911, -26001=>4912, -27075=>4913, -27886=>4914, -28504=>4915, -29677=>4916, -30036=>4917, -30242=>4918, -30436=>4919, -30460=>4920, -30928=>4921, -30971=>4922, -63844=>4922, -31020=>4923, -32070=>4924, -33324=>4925, -34784=>4926, -36820=>4927, -38930=>4928, -39151=>4929, -21187=>4930, -25300=>4931, -25765=>4932, -28196=>4933, -28497=>4934, -30332=>4935, -36299=>4936, -37297=>4937, -37474=>4938, -39662=>4939, -39747=>4940, -20515=>4941, -20621=>4942, -22346=>4943, -22952=>4944, -23592=>4945, -24135=>4946, -24439=>4947, -25151=>4948, -25918=>4949, -12101=>4950, -26041=>4950, -26049=>4951, -26121=>4952, -26507=>4953, -27036=>4954, -28354=>4955, -30917=>4956, -32033=>4957, -32938=>4958, -33152=>4959, -33323=>4960, -33459=>4961, -33953=>4962, -34444=>4963, -35370=>4964, -35607=>4965, -37030=>4966, -38450=>4967, -40848=>4968, -20493=>4969, -20467=>4970, -22521=>4971, -24472=>4972, -25308=>4973, -25490=>4974, -26479=>4975, -28227=>4976, -28953=>4977, -30403=>4978, -32972=>4979, -32986=>4980, -35060=>4981, -35061=>4982, -35097=>4983, -36064=>4984, -36649=>4985, -37197=>4986, -38506=>4987, -20271=>4988, -20336=>4989, -24091=>4990, -26575=>4991, -26658=>4992, -12137=>4993, -30333=>4993, -30334=>4994, -39748=>4995, -24161=>4996, -27146=>4997, -29033=>4998, -29140=>4999, -30058=>5000, -32321=>5001, -34115=>5002, -34281=>5003, -39132=>5004, -20240=>5005, -31567=>5006, -32624=>5007, -38309=>5008, -20961=>5009, -24070=>5010, -26805=>5011, -27710=>5012, -27726=>5013, -27867=>5014, -29359=>5015, -31684=>5016, -33539=>5017, -27861=>5018, -29754=>5019, -20731=>5020, -21128=>5021, -22721=>5022, -25816=>5023, -27287=>5024, -29863=>5025, -30294=>5026, -30887=>5027, -34327=>5028, -38370=>5029, -38713=>5030, -21342=>5031, -24321=>5032, -35722=>5033, -36776=>5034, -36783=>5035, -37002=>5036, -21029=>5037, -30629=>5038, -40009=>5039, -40712=>5040, -19993=>5041, -20482=>5042, -20853=>5043, -23643=>5044, -24183=>5045, -26142=>5046, -26170=>5047, -26564=>5048, -26821=>5049, -28851=>5050, -29953=>5051, -30149=>5052, -31177=>5053, -31453=>5054, -36647=>5055, -39200=>5056, -39432=>5057, -20445=>5058, -22561=>5059, -22577=>5060, -23542=>5061, -26222=>5062, -27493=>5063, -27921=>5064, -28282=>5065, -28541=>5066, -29668=>5067, -29995=>5068, -33769=>5069, -35036=>5070, -35091=>5071, -35676=>5072, -36628=>5073, -20239=>5074, -20693=>5075, -21264=>5076, -12056=>5077, -21340=>5077, -23443=>5078, -24489=>5079, -63846=>5079, -26381=>5080, -31119=>5081, -33145=>5082, -33583=>5083, -34068=>5084, -35079=>5085, -35206=>5086, -36665=>5087, -36667=>5088, -64007=>5088, -39333=>5089, -39954=>5090, -26412=>5091, -20086=>5092, -20472=>5093, -22857=>5094, -23553=>5095, -23791=>5096, -23792=>5097, -25447=>5098, -26834=>5099, -28925=>5100, -29090=>5101, -29739=>5102, -32299=>5103, -34028=>5104, -34562=>5105, -36898=>5106, -37586=>5107, -40179=>5108, -19981=>5109, -63847=>5109, -20184=>5110, -20463=>5111, -20613=>5112, -21078=>5113, -21103=>5114, -21542=>5115, -21648=>5116, -22496=>5117, -22827=>5118, -23142=>5119, -23386=>5120, -23413=>5121, -23500=>5122, -24220=>5123, -25206=>5124, -25975=>5125, -26023=>5126, -28014=>5127, -28325=>5128, -12119=>5129, -29238=>5129, -31526=>5130, -31807=>5131, -12152=>5132, -32566=>5132, -33104=>5133, -33105=>5134, -33178=>5135, -33344=>5136, -33433=>5137, -33705=>5138, -35331=>5139, -36000=>5140, -36070=>5141, -36091=>5142, -36212=>5143, -36282=>5144, -37096=>5145, -37340=>5146, -12201=>5147, -38428=>5147, -38468=>5148, -39385=>5149, -40167=>5150, -21271=>5151, -63843=>5151, -20998=>5152, -21545=>5153, -22132=>5154, -22707=>5155, -22868=>5156, -22894=>5157, -24575=>5158, -24996=>5159, -25198=>5160, -26128=>5161, -27774=>5162, -28954=>5163, -30406=>5164, -31881=>5165, -31966=>5166, -32027=>5167, -33452=>5168, -36033=>5169, -38640=>5170, -20315=>5171, -24343=>5172, -24447=>5173, -25282=>5174, -23849=>5175, -26379=>5176, -26842=>5177, -30844=>5178, -32323=>5179, -40300=>5180, -19989=>5181, -20633=>5182, -12052=>5183, -21269=>5183, -21290=>5184, -21329=>5185, -22915=>5186, -23138=>5187, -24199=>5188, -24754=>5189, -24970=>5190, -25161=>5191, -25209=>5192, -26000=>5193, -26503=>5194, -27047=>5195, -12112=>5196, -27604=>5196, -27606=>5197, -27607=>5198, -27608=>5199, -27832=>5200, -29749=>5201, -30202=>5202, -30738=>5203, -30865=>5204, -31189=>5205, -31192=>5206, -31875=>5207, -32203=>5208, -32737=>5209, -32933=>5210, -33086=>5211, -33218=>5212, -33778=>5213, -34586=>5214, -35048=>5215, -35513=>5216, -35692=>5217, -36027=>5218, -37145=>5219, -12206=>5220, -38750=>5220, -12214=>5221, -39131=>5221, -12240=>5222, -40763=>5222, -22188=>5223, -23338=>5224, -24428=>5225, -25996=>5226, -27315=>5227, -27567=>5228, -27996=>5229, -28657=>5230, -28693=>5231, -29277=>5232, -29613=>5233, -36007=>5234, -36051=>5235, -38971=>5236, -24977=>5237, -27703=>5238, -32856=>5239, -39425=>5240, -20045=>5241, -20107=>5242, -20123=>5243, -20181=>5244, -20282=>5245, -20284=>5246, -20351=>5247, -20447=>5248, -20735=>5249, -21490=>5250, -21496=>5251, -21766=>5252, -21987=>5253, -22235=>5254, -12064=>5255, -22763=>5255, -22882=>5256, -23057=>5257, -23531=>5258, -23546=>5259, -23556=>5260, -24051=>5261, -24107=>5262, -24473=>5263, -24605=>5264, -25448=>5265, -26012=>5266, -26031=>5267, -26614=>5268, -26619=>5269, -26797=>5270, -27515=>5271, -27801=>5272, -27863=>5273, -28195=>5274, -28681=>5275, -29509=>5276, -30722=>5277, -31038=>5278, -31040=>5279, -31072=>5280, -31169=>5281, -31721=>5282, -32023=>5283, -32114=>5284, -32902=>5285, -33293=>5286, -33678=>5287, -34001=>5288, -34503=>5289, -35039=>5290, -35408=>5291, -35422=>5292, -35613=>5293, -36060=>5294, -36198=>5295, -36781=>5296, -37034=>5297, -39164=>5298, -39391=>5299, -40605=>5300, -21066=>5301, -26388=>5302, -20632=>5303, -21034=>5304, -12077=>5305, -23665=>5305, -25955=>5306, -27733=>5307, -29642=>5308, -29987=>5309, -30109=>5310, -31639=>5311, -33948=>5312, -37240=>5313, -38704=>5314, -20087=>5315, -25746=>5316, -27578=>5317, -63856=>5317, -29022=>5318, -34217=>5319, -19977=>5320, -26441=>5321, -26862=>5322, -28183=>5323, -33439=>5324, -34072=>5325, -34923=>5326, -25591=>5327, -28545=>5328, -37394=>5329, -39087=>5330, -19978=>5331, -20663=>5332, -20687=>5333, -20767=>5334, -21830=>5335, -21930=>5336, -22039=>5337, -23360=>5338, -23577=>5339, -23776=>5340, -24120=>5341, -24202=>5342, -24224=>5343, -24258=>5344, -24819=>5345, -26705=>5346, -27233=>5347, -28248=>5348, -29245=>5349, -29248=>5350, -29376=>5351, -63994=>5351, -30456=>5352, -31077=>5353, -31665=>5354, -32724=>5355, -35059=>5356, -35316=>5357, -35443=>5358, -35937=>5359, -36062=>5360, -38684=>5361, -22622=>5362, -63852=>5362, -29885=>5363, -36093=>5364, -21959=>5365, -31329=>5366, -32034=>5367, -63850=>5367, -12170=>5368, -33394=>5368, -29298=>5369, -12131=>5370, -29983=>5370, -29989=>5371, -31513=>5372, -22661=>5373, -22779=>5374, -23996=>5375, -24207=>5376, -24246=>5377, -24464=>5378, -24661=>5379, -25234=>5380, -25471=>5381, -25933=>5382, -26257=>5383, -26329=>5384, -26360=>5385, -26646=>5386, -26866=>5387, -29312=>5388, -29790=>5389, -31598=>5390, -32110=>5391, -32214=>5392, -32626=>5393, -32997=>5394, -33298=>5395, -34223=>5396, -35199=>5397, -35475=>5398, -36893=>5399, -37604=>5400, -12233=>5401, -40653=>5401, -12239=>5402, -40736=>5402, -12067=>5403, -22805=>5403, -22893=>5404, -24109=>5405, -24796=>5406, -26132=>5407, -26227=>5408, -26512=>5409, -27728=>5410, -28101=>5411, -28511=>5412, -12143=>5413, -30707=>5413, -30889=>5414, -33990=>5415, -37323=>5416, -37675=>5417, -20185=>5418, -20682=>5419, -20808=>5420, -21892=>5421, -23307=>5422, -23459=>5423, -25159=>5424, -25982=>5425, -26059=>5426, -28210=>5427, -29053=>5428, -29697=>5429, -29764=>5430, -29831=>5431, -29887=>5432, -30316=>5433, -31146=>5434, -32218=>5435, -32341=>5436, -32680=>5437, -33146=>5438, -33203=>5439, -33337=>5440, -34330=>5441, -34796=>5442, -35445=>5443, -36323=>5444, -36984=>5445, -37521=>5446, -37925=>5447, -39245=>5448, -39854=>5449, -21352=>5450, -23633=>5451, -26964=>5452, -27844=>5453, -27945=>5454, -28203=>5455, -12166=>5456, -33292=>5456, -34203=>5457, -35131=>5458, -35373=>5459, -35498=>5460, -63855=>5460, -63905=>5460, -38634=>5461, -40807=>5462, -21089=>5463, -26297=>5464, -27570=>5465, -32406=>5466, -34814=>5467, -36109=>5468, -38275=>5469, -38493=>5470, -25885=>5471, -28041=>5472, -29166=>5473, -22478=>5474, -22995=>5475, -23468=>5476, -24615=>5477, -24826=>5478, -25104=>5479, -26143=>5480, -26207=>5481, -29481=>5482, -29689=>5483, -30427=>5484, -30465=>5485, -63853=>5485, -31596=>5486, -32854=>5487, -32882=>5488, -33125=>5489, -35488=>5490, -37266=>5491, -19990=>5492, -21218=>5493, -27506=>5494, -27927=>5495, -31237=>5496, -31545=>5497, -32048=>5498, -36016=>5499, -21484=>5500, -22063=>5501, -22609=>5502, -23477=>5503, -12073=>5504, -23567=>5504, -23569=>5505, -24034=>5506, -25152=>5507, -25475=>5508, -25620=>5509, -26157=>5510, -26803=>5511, -27836=>5512, -28040=>5513, -28335=>5514, -28703=>5515, -28836=>5516, -29138=>5517, -29990=>5518, -30095=>5519, -30094=>5520, -30233=>5521, -31505=>5522, -31712=>5523, -31787=>5524, -32032=>5525, -32057=>5526, -34092=>5527, -34157=>5528, -34311=>5529, -35380=>5530, -36877=>5531, -36961=>5532, -37045=>5533, -37559=>5534, -38902=>5535, -39479=>5536, -20439=>5537, -23660=>5538, -26463=>5539, -28049=>5540, -31903=>5541, -32396=>5542, -35606=>5543, -36118=>5544, -36895=>5545, -23403=>5546, -24061=>5547, -25613=>5548, -33984=>5549, -36956=>5550, -39137=>5551, -29575=>5552, -63841=>5552, -63963=>5552, -23435=>5553, -24730=>5554, -26494=>5555, -28126=>5556, -35359=>5557, -35494=>5558, -36865=>5559, -38924=>5560, -21047=>5561, -28753=>5562, -30862=>5563, -37782=>5564, -34928=>5565, -37335=>5566, -20462=>5567, -21463=>5568, -22013=>5569, -22234=>5570, -22402=>5571, -22781=>5572, -23234=>5573, -23432=>5574, -23723=>5575, -23744=>5576, -24101=>5577, -24833=>5578, -25101=>5579, -12095=>5580, -25163=>5580, -25480=>5581, -25628=>5582, -25910=>5583, -25976=>5584, -63849=>5584, -27193=>5585, -27530=>5586, -12116=>5587, -27700=>5587, -27929=>5588, -28465=>5589, -29159=>5590, -29417=>5591, -29560=>5592, -29703=>5593, -29874=>5594, -30246=>5595, -30561=>5596, -31168=>5597, -31319=>5598, -31466=>5599, -31929=>5600, -32143=>5601, -32172=>5602, -32353=>5603, -32670=>5604, -33065=>5605, -33585=>5606, -33936=>5607, -34010=>5608, -34282=>5609, -34966=>5610, -35504=>5611, -35728=>5612, -36664=>5613, -36930=>5614, -36995=>5615, -37228=>5616, -37526=>5617, -37561=>5618, -38539=>5619, -38567=>5620, -38568=>5621, -38614=>5622, -38656=>5623, -38920=>5624, -12216=>5625, -39318=>5625, -39635=>5626, -39706=>5627, -21460=>5628, -22654=>5629, -22809=>5630, -23408=>5631, -23487=>5632, -28113=>5633, -28506=>5634, -29087=>5635, -29729=>5636, -29881=>5637, -32901=>5638, -33789=>5639, -24033=>5640, -24455=>5641, -24490=>5642, -24642=>5643, -26092=>5644, -26642=>5645, -26991=>5646, -27219=>5647, -27529=>5648, -27957=>5649, -28147=>5650, -29667=>5651, -30462=>5652, -30636=>5653, -31565=>5654, -32020=>5655, -33059=>5656, -33308=>5657, -33600=>5658, -34036=>5659, -34147=>5660, -35426=>5661, -35524=>5662, -37255=>5663, -37662=>5664, -38918=>5665, -39348=>5666, -25100=>5667, -34899=>5668, -36848=>5669, -37477=>5670, -23815=>5671, -23847=>5672, -23913=>5673, -29791=>5674, -33181=>5675, -34664=>5676, -28629=>5677, -25342=>5678, -63859=>5678, -32722=>5679, -35126=>5680, -35186=>5681, -19998=>5682, -20056=>5683, -20711=>5684, -21213=>5685, -21319=>5686, -25215=>5687, -26119=>5688, -32361=>5689, -34821=>5690, -38494=>5691, -20365=>5692, -21273=>5693, -22070=>5694, -22987=>5695, -23204=>5696, -12075=>5697, -23608=>5697, -23630=>5698, -23629=>5699, -24066=>5700, -24337=>5701, -24643=>5702, -26045=>5703, -26159=>5704, -26178=>5705, -26558=>5706, -26612=>5707, -29468=>5708, -12142=>5709, -30690=>5709, -12144=>5710, -31034=>5710, -32709=>5711, -33940=>5712, -33997=>5713, -35222=>5714, -35430=>5715, -35433=>5716, -35553=>5717, -12183=>5718, -35925=>5718, -35962=>5719, -22516=>5720, -23508=>5721, -24335=>5722, -24687=>5723, -25325=>5724, -26893=>5725, -27542=>5726, -28252=>5727, -29060=>5728, -31698=>5729, -34645=>5730, -35672=>5731, -63996=>5731, -36606=>5732, -12215=>5733, -39135=>5733, -39166=>5734, -20280=>5735, -20353=>5736, -20449=>5737, -21627=>5738, -23072=>5739, -23480=>5740, -24892=>5741, -26032=>5742, -26216=>5743, -29180=>5744, -30003=>5745, -31070=>5746, -32051=>5747, -33102=>5748, -12162=>5749, -33251=>5749, -33688=>5750, -34218=>5751, -34254=>5752, -34563=>5753, -35338=>5754, -12189=>5755, -36523=>5755, -12191=>5756, -36763=>5756, -36805=>5757, -22833=>5758, -23460=>5759, -23526=>5760, -24713=>5761, -23529=>5762, -23563=>5763, -12092=>5764, -24515=>5764, -27777=>5765, -28145=>5766, -28683=>5767, -29978=>5768, -33455=>5769, -35574=>5770, -20160=>5771, -63997=>5771, -12055=>5772, -21313=>5772, -38617=>5773, -12114=>5774, -27663=>5774, -20126=>5775, -20420=>5776, -20818=>5777, -21854=>5778, -23077=>5779, -23784=>5780, -25105=>5781, -12123=>5782, -29273=>5782, -33469=>5783, -33706=>5784, -34558=>5785, -34905=>5786, -35357=>5787, -38463=>5788, -38597=>5789, -39187=>5790, -40201=>5791, -40285=>5792, -22538=>5793, -23731=>5794, -23997=>5795, -24132=>5796, -24801=>5797, -63929=>5797, -24853=>5798, -25569=>5799, -27138=>5800, -63764=>5800, -63836=>5800, -63935=>5800, -28197=>5801, -37122=>5802, -37716=>5803, -38990=>5804, -39952=>5805, -40823=>5806, -23433=>5807, -23736=>5808, -25353=>5809, -26191=>5810, -26696=>5811, -30524=>5812, -38593=>5813, -38797=>5814, -38996=>5815, -39839=>5816, -26017=>5817, -35585=>5818, -36555=>5819, -38332=>5820, -21813=>5821, -23721=>5822, -24022=>5823, -24245=>5824, -26263=>5825, -30284=>5826, -33780=>5827, -38343=>5828, -22739=>5829, -25276=>5830, -29390=>5831, -40232=>5832, -20208=>5833, -22830=>5834, -24591=>5835, -26171=>5836, -27523=>5837, -31207=>5838, -40230=>5839, -21395=>5840, -21696=>5841, -22467=>5842, -23830=>5843, -24859=>5844, -26326=>5845, -28079=>5846, -30861=>5847, -33406=>5848, -38552=>5849, -38724=>5850, -21380=>5851, -25212=>5852, -25494=>5853, -28082=>5854, -32266=>5855, -33099=>5856, -38989=>5857, -27387=>5858, -32588=>5859, -40367=>5860, -40474=>5861, -20063=>5862, -20539=>5863, -20918=>5864, -22812=>5865, -24825=>5866, -25590=>5867, -26928=>5868, -29242=>5869, -32822=>5870, -37326=>5871, -24369=>5872, -32004=>5873, -33509=>5874, -63860=>5874, -33903=>5875, -33979=>5876, -34277=>5877, -36493=>5878, -20335=>5879, -22756=>5880, -23363=>5881, -24665=>5882, -25562=>5883, -25880=>5884, -25965=>5885, -26264=>5886, -26954=>5887, -27171=>5888, -27915=>5889, -28673=>5890, -29036=>5891, -30162=>5892, -30221=>5893, -31155=>5894, -31344=>5895, -12154=>5896, -32650=>5896, -35140=>5897, -35731=>5898, -37312=>5899, -38525=>5900, -39178=>5901, -22276=>5902, -24481=>5903, -26044=>5904, -28417=>5905, -30208=>5906, -31142=>5907, -35486=>5908, -39341=>5909, -12226=>5910, -39770=>5910, -40812=>5911, -20740=>5912, -25014=>5913, -25233=>5914, -27277=>5915, -33222=>5916, -20547=>5917, -22576=>5918, -24422=>5919, -28937=>5920, -12180=>5921, -35328=>5921, -35578=>5922, -23420=>5923, -34326=>5924, -20474=>5925, -20796=>5926, -22196=>5927, -22852=>5928, -25513=>5929, -28153=>5930, -23978=>5931, -26989=>5932, -20870=>5933, -20104=>5934, -20313=>5935, -22914=>5936, -27487=>5937, -27741=>5938, -29877=>5939, -30998=>5940, -33287=>5941, -33349=>5942, -33593=>5943, -36671=>5944, -36701=>5945, -39192=>5946, -20134=>5947, -22495=>5948, -24441=>5949, -26131=>5950, -63968=>5950, -30123=>5951, -32377=>5952, -35695=>5953, -36870=>5954, -39515=>5955, -22181=>5956, -22567=>5957, -23032=>5958, -23071=>5959, -23476=>5960, -24310=>5961, -25424=>5962, -25403=>5963, -26941=>5964, -27783=>5965, -27839=>5966, -28046=>5967, -28051=>5968, -28149=>5969, -28436=>5970, -28895=>5971, -28982=>5972, -29017=>5973, -29123=>5974, -29141=>5975, -30799=>5976, -30831=>5977, -31605=>5978, -32227=>5979, -32303=>5980, -34893=>5981, -36575=>5982, -37467=>5983, -40182=>5984, -24709=>5985, -28037=>5986, -29105=>5987, -38321=>5988, -21421=>5989, -26579=>5990, -28814=>5991, -28976=>5992, -29744=>5993, -33398=>5994, -33490=>5995, -38331=>5996, -39653=>5997, -40573=>5998, -26308=>5999, -29121=>6000, -33865=>6001, -63854=>6001, -22603=>6002, -23992=>6003, -24433=>6004, -26144=>6005, -26254=>6006, -27001=>6007, -27054=>6008, -27704=>6009, -27891=>6010, -28214=>6011, -28481=>6012, -28634=>6013, -28699=>6014, -28719=>6015, -29008=>6016, -29151=>6017, -29552=>6018, -29787=>6019, -29908=>6020, -30408=>6021, -31310=>6022, -32403=>6023, -33521=>6024, -35424=>6025, -36814=>6026, -37704=>6027, -38681=>6028, -20034=>6029, -20522=>6030, -21000=>6031, -21473=>6032, -26355=>6033, -27757=>6034, -28618=>6035, -29450=>6036, -30591=>6037, -31330=>6038, -33454=>6039, -34269=>6040, -34306=>6041, -35028=>6042, -35427=>6043, -35709=>6044, -35947=>6045, -37555=>6046, -38675=>6047, -38928=>6048, -20116=>6049, -20237=>6050, -20425=>6051, -20658=>6052, -21320=>6053, -21566=>6054, -21555=>6055, -21978=>6056, -22626=>6057, -22714=>6058, -22887=>6059, -23067=>6060, -23524=>6061, -24735=>6062, -25034=>6063, -25942=>6064, -26111=>6065, -26212=>6066, -26791=>6067, -27738=>6068, -28595=>6069, -28879=>6070, -29100=>6071, -29522=>6072, -31613=>6073, -34568=>6074, -35492=>6075, -39986=>6076, -40711=>6077, -23627=>6078, -27779=>6079, -29508=>6080, -12127=>6081, -29577=>6081, -37434=>6082, -28331=>6083, -29797=>6084, -30239=>6085, -31337=>6086, -32277=>6087, -34314=>6088, -20800=>6089, -22725=>6090, -25793=>6091, -29934=>6092, -29973=>6093, -30320=>6094, -32705=>6095, -37013=>6096, -38605=>6097, -39252=>6098, -28198=>6099, -12129=>6100, -29926=>6100, -31401=>6101, -31402=>6102, -33253=>6103, -34521=>6104, -34680=>6105, -35355=>6106, -23113=>6107, -23436=>6108, -23451=>6109, -26785=>6110, -26880=>6111, -28003=>6112, -29609=>6113, -29715=>6114, -29740=>6115, -30871=>6116, -32233=>6117, -32747=>6118, -33048=>6119, -33109=>6120, -33694=>6121, -35916=>6122, -38446=>6123, -63942=>6123, -38929=>6124, -12104=>6125, -26352=>6125, -24448=>6126, -26106=>6127, -26505=>6128, -27754=>6129, -29579=>6130, -20525=>6131, -23043=>6132, -27498=>6133, -30702=>6134, -22806=>6135, -23916=>6136, -24013=>6137, -29477=>6138, -30031=>6139, -20709=>6140, -20985=>6141, -22575=>6142, -22829=>6143, -22934=>6144, -23002=>6145, -23525=>6146, -23970=>6147, -25303=>6148, -25622=>6149, -25747=>6150, -25854=>6151, -26332=>6152, -27208=>6153, -29183=>6154, -29796=>6155, -31368=>6156, -31407=>6157, -32327=>6158, -32350=>6159, -32768=>6160, -33136=>6161, -34799=>6162, -35201=>6163, -35616=>6164, -36953=>6165, -36992=>6166, -39250=>6167, -24958=>6168, -27442=>6169, -28020=>6170, -32287=>6171, -35109=>6172, -36785=>6173, -20433=>6174, -20653=>6175, -20887=>6176, -21191=>6177, -22471=>6178, -22665=>6179, -23481=>6180, -24248=>6181, -24898=>6182, -27029=>6183, -28044=>6184, -28263=>6185, -28342=>6186, -29076=>6187, -29794=>6188, -12132=>6189, -29992=>6189, -29996=>6190, -32883=>6191, -33592=>6192, -33993=>6193, -36362=>6194, -37780=>6195, -37854=>6196, -20110=>6197, -20305=>6198, -20598=>6199, -20778=>6200, -12060=>6201, -21448=>6201, -21451=>6202, -21491=>6203, -23431=>6204, -23507=>6205, -23588=>6206, -24858=>6207, -24962=>6208, -26100=>6209, -12124=>6210, -29275=>6210, -29591=>6211, -29760=>6212, -30402=>6213, -31056=>6214, -31121=>6215, -31161=>6216, -32006=>6217, -12155=>6218, -32701=>6218, -33419=>6219, -34261=>6220, -34398=>6221, -36802=>6222, -36935=>6223, -37109=>6224, -37354=>6225, -38533=>6226, -12204=>6227, -38632=>6227, -38633=>6228, -21206=>6229, -24423=>6230, -26093=>6231, -26161=>6232, -26671=>6233, -29020=>6234, -31286=>6235, -37057=>6236, -38922=>6237, -20113=>6238, -27218=>6239, -27550=>6240, -28560=>6241, -29065=>6242, -32792=>6243, -33464=>6244, -34131=>6245, -36939=>6246, -38549=>6247, -38642=>6248, -38907=>6249, -34074=>6250, -39729=>6251, -20112=>6252, -29066=>6253, -38596=>6254, -20803=>6255, -21407=>6256, -21729=>6257, -22291=>6258, -22290=>6259, -22435=>6260, -23195=>6261, -23236=>6262, -23491=>6263, -24616=>6264, -24895=>6265, -25588=>6266, -27781=>6267, -27961=>6268, -28274=>6269, -28304=>6270, -29232=>6271, -29503=>6272, -29783=>6273, -33489=>6274, -34945=>6275, -36677=>6276, -36960=>6277, -38498=>6278, -39000=>6279, -40219=>6280, -12105=>6281, -26376=>6281, -36234=>6282, -37470=>6283, -20301=>6284, -20553=>6285, -20702=>6286, -21361=>6287, -22285=>6288, -22996=>6289, -23041=>6290, -23561=>6291, -24944=>6292, -26256=>6293, -28205=>6294, -29234=>6295, -29771=>6296, -32239=>6297, -32963=>6298, -33806=>6299, -33894=>6300, -34111=>6301, -34655=>6302, -34907=>6303, -35096=>6304, -35586=>6305, -36949=>6306, -12209=>6307, -38859=>6307, -39759=>6308, -20083=>6309, -20369=>6310, -20754=>6311, -20842=>6312, -21807=>6313, -21929=>6314, -23418=>6315, -23461=>6316, -24188=>6317, -24189=>6318, -24254=>6319, -24736=>6320, -24799=>6321, -24840=>6322, -24841=>6323, -25540=>6324, -25912=>6325, -26377=>6326, -26580=>6327, -26586=>6328, -26977=>6329, -26978=>6330, -27833=>6331, -27943=>6332, -28216=>6333, -28641=>6334, -29494=>6335, -29495=>6336, -29788=>6337, -30001=>6338, -30290=>6339, -32173=>6340, -33278=>6341, -33848=>6342, -35029=>6343, -35480=>6344, -35547=>6345, -35565=>6346, -36400=>6347, -36418=>6348, -36938=>6349, -36926=>6350, -36986=>6351, -12195=>6352, -37193=>6352, -37321=>6353, -37742=>6354, -22537=>6355, -27603=>6356, -12161=>6357, -32905=>6357, -32946=>6358, -20801=>6359, -22891=>6360, -23609=>6361, -28516=>6362, -29607=>6363, -32996=>6364, -36103=>6365, -37399=>6366, -38287=>6367, -12160=>6368, -32895=>6368, -25102=>6369, -28700=>6370, -32104=>6371, -34701=>6372, -22432=>6373, -24681=>6374, -24903=>6375, -27575=>6376, -35518=>6377, -37504=>6378, -38577=>6379, -12036=>6380, -20057=>6380, -21535=>6381, -28139=>6382, -34093=>6383, -38512=>6384, -12211=>6385, -38899=>6385, -39150=>6386, -25558=>6387, -27875=>6388, -12194=>6389, -37009=>6389, -20957=>6390, -25033=>6391, -33210=>6392, -40441=>6393, -20381=>6394, -20506=>6395, -20736=>6396, -23452=>6397, -24847=>6398, -25087=>6399, -25836=>6400, -26885=>6401, -27589=>6402, -30097=>6403, -30691=>6404, -32681=>6405, -33380=>6406, -34191=>6407, -34811=>6408, -12176=>6409, -34915=>6409, -35516=>6410, -35696=>6411, -37291=>6412, -12038=>6413, -20108=>6413, -20197=>6414, -20234=>6415, -22839=>6416, -23016=>6417, -24050=>6418, -24347=>6419, -24411=>6420, -24609=>6421, -29246=>6422, -29669=>6423, -30064=>6424, -63842=>6424, -30157=>6425, -31227=>6426, -12157=>6427, -32780=>6427, -12159=>6428, -32819=>6428, -32900=>6429, -33505=>6430, -33617=>6431, -36029=>6432, -36019=>6433, -36999=>6434, -39156=>6435, -39180=>6436, -28727=>6437, -30410=>6438, -32714=>6439, -32716=>6440, -32764=>6441, -35610=>6442, -12040=>6443, -20154=>6443, -20161=>6444, -20995=>6445, -21360=>6446, -21693=>6447, -63902=>6447, -22240=>6448, -23035=>6449, -23493=>6450, -24341=>6451, -24525=>6452, -28270=>6453, -32106=>6454, -33589=>6455, -34451=>6456, -35469=>6457, -38765=>6458, -38775=>6459, -12032=>6460, -19968=>6460, -20314=>6461, -20350=>6462, -22777=>6463, -12103=>6464, -26085=>6464, -28322=>6465, -36920=>6466, -37808=>6467, -39353=>6468, -20219=>6469, -22764=>6470, -22922=>6471, -23001=>6472, -24641=>6473, -31252=>6474, -33615=>6475, -36035=>6476, -12042=>6477, -20837=>6477, -21316=>6478, -20173=>6479, -21097=>6480, -23381=>6481, -33471=>6482, -20180=>6483, -21050=>6484, -63999=>6484, -21672=>6485, -22985=>6486, -23039=>6487, -12070=>6488, -23376=>6488, -23383=>6489, -23388=>6490, -24675=>6491, -24904=>6492, -28363=>6493, -28825=>6494, -63995=>6494, -29038=>6495, -29574=>6496, -29943=>6497, -30133=>6498, -30913=>6499, -32043=>6500, -32773=>6501, -12163=>6502, -33258=>6502, -33576=>6503, -34071=>6504, -34249=>6505, -35566=>6506, -36039=>6507, -38604=>6508, -20316=>6509, -21242=>6510, -22204=>6511, -26027=>6512, -26152=>6513, -28796=>6514, -28856=>6515, -29237=>6516, -32189=>6517, -33421=>6518, -37196=>6519, -38592=>6520, -40306=>6521, -23409=>6522, -26855=>6523, -27544=>6524, -28538=>6525, -30430=>6526, -23697=>6527, -26283=>6528, -28507=>6529, -31668=>6530, -31786=>6531, -34870=>6532, -38620=>6533, -19976=>6534, -20183=>6535, -21280=>6536, -22580=>6537, -22715=>6538, -22767=>6539, -22892=>6540, -23559=>6541, -24115=>6542, -24196=>6543, -24373=>6544, -25484=>6545, -26290=>6546, -26454=>6547, -27167=>6548, -27299=>6549, -27404=>6550, -28479=>6551, -29254=>6552, -29520=>6553, -29835=>6554, -31456=>6555, -31911=>6556, -33144=>6557, -33247=>6558, -33255=>6559, -33674=>6560, -33900=>6561, -34083=>6562, -34196=>6563, -34255=>6564, -35037=>6565, -36115=>6566, -37292=>6567, -12199=>6568, -38263=>6568, -38556=>6569, -20877=>6570, -21705=>6571, -22312=>6572, -23472=>6573, -25165=>6574, -26448=>6575, -26685=>6576, -26771=>6577, -28221=>6578, -28371=>6579, -28797=>6580, -32289=>6581, -35009=>6582, -36001=>6583, -36617=>6584, -40779=>6585, -40782=>6586, -29229=>6587, -31631=>6588, -35533=>6589, -37658=>6590, -20295=>6591, -20302=>6592, -20786=>6593, -21632=>6594, -22992=>6595, -24213=>6596, -25269=>6597, -26485=>6598, -26990=>6599, -27159=>6600, -27822=>6601, -28186=>6602, -29401=>6603, -29482=>6604, -30141=>6605, -31672=>6606, -32053=>6607, -33511=>6608, -33785=>6609, -33879=>6610, -34295=>6611, -35419=>6612, -36015=>6613, -36487=>6614, -36889=>6615, -37048=>6616, -38606=>6617, -40799=>6618, -21219=>6619, -21514=>6620, -23265=>6621, -23490=>6622, -25688=>6623, -25973=>6624, -28404=>6625, -29380=>6626, -30340=>6627, -31309=>6628, -31515=>6629, -31821=>6630, -32318=>6631, -32735=>6632, -33659=>6633, -35627=>6634, -36042=>6635, -12186=>6636, -36196=>6636, -36321=>6637, -36447=>6638, -36842=>6639, -36857=>6640, -36969=>6641, -37841=>6642, -20291=>6643, -20346=>6644, -20659=>6645, -20840=>6646, -20856=>6647, -21069=>6648, -21098=>6649, -22625=>6650, -22652=>6651, -22880=>6652, -23560=>6653, -23637=>6654, -24283=>6655, -24731=>6656, -25136=>6657, -26643=>6658, -27583=>6659, -27656=>6660, -28593=>6661, -29006=>6662, -29728=>6663, -12133=>6664, -30000=>6664, -30008=>6665, -30033=>6666, -30322=>6667, -31564=>6668, -31627=>6669, -31661=>6670, -31686=>6671, -32399=>6672, -35438=>6673, -36670=>6674, -36681=>6675, -37439=>6676, -37523=>6677, -37666=>6678, -37931=>6679, -38651=>6680, -39002=>6681, -39019=>6682, -39198=>6683, -20999=>6684, -64000=>6684, -25130=>6685, -25240=>6686, -27993=>6687, -30308=>6688, -31434=>6689, -31680=>6690, -32118=>6691, -21344=>6692, -23742=>6693, -24215=>6694, -28472=>6695, -28857=>6696, -31896=>6697, -38673=>6698, -39822=>6699, -40670=>6700, -25509=>6701, -25722=>6702, -34678=>6703, -19969=>6704, -20117=>6705, -20141=>6706, -20572=>6707, -20597=>6708, -21576=>6709, -22979=>6710, -23450=>6711, -24128=>6712, -24237=>6713, -24311=>6714, -24449=>6715, -24773=>6716, -25402=>6717, -25919=>6718, -25972=>6719, -26060=>6720, -26230=>6721, -26232=>6722, -26622=>6723, -26984=>6724, -27273=>6725, -27491=>6726, -27712=>6727, -28096=>6728, -28136=>6729, -28191=>6730, -28254=>6731, -28702=>6732, -28833=>6733, -29582=>6734, -29693=>6735, -30010=>6736, -30555=>6737, -30855=>6738, -31118=>6739, -31243=>6740, -31357=>6741, -31934=>6742, -32142=>6743, -33351=>6744, -35330=>6745, -35562=>6746, -35998=>6747, -37165=>6748, -37194=>6749, -37336=>6750, -37478=>6751, -37580=>6752, -37664=>6753, -38662=>6754, -38742=>6755, -38748=>6756, -38914=>6757, -12237=>6758, -40718=>6758, -21046=>6759, -21137=>6760, -21884=>6761, -22564=>6762, -24093=>6763, -24351=>6764, -24716=>6765, -25552=>6766, -26799=>6767, -28639=>6768, -31085=>6769, -31532=>6770, -33229=>6771, -34234=>6772, -35069=>6773, -35576=>6774, -36420=>6775, -37261=>6776, -38500=>6777, -38555=>6778, -38717=>6779, -38988=>6780, -12241=>6781, -40778=>6781, -20430=>6782, -20806=>6783, -20939=>6784, -21161=>6785, -22066=>6786, -24340=>6787, -24427=>6788, -25514=>6789, -25805=>6790, -26089=>6791, -26177=>6792, -26362=>6793, -26361=>6794, -26397=>6795, -26781=>6796, -26839=>6797, -27133=>6798, -28437=>6799, -28526=>6800, -29031=>6801, -29157=>6802, -12118=>6803, -29226=>6803, -29866=>6804, -30522=>6805, -31062=>6806, -31066=>6807, -31199=>6808, -31264=>6809, -31381=>6810, -31895=>6811, -31967=>6812, -32068=>6813, -32368=>6814, -32903=>6815, -34299=>6816, -34468=>6817, -35412=>6818, -35519=>6819, -36249=>6820, -36481=>6821, -36896=>6822, -36973=>6823, -37347=>6824, -38459=>6825, -38613=>6826, -12227=>6827, -40165=>6827, -26063=>6828, -31751=>6829, -12188=>6830, -36275=>6830, -37827=>6831, -23384=>6832, -23562=>6833, -21330=>6834, -25305=>6835, -29469=>6836, -20519=>6837, -23447=>6838, -24478=>6839, -24752=>6840, -24939=>6841, -26837=>6842, -28121=>6843, -29742=>6844, -31278=>6845, -32066=>6846, -32156=>6847, -32305=>6848, -33131=>6849, -36394=>6850, -36405=>6851, -37758=>6852, -37912=>6853, -20304=>6854, -22352=>6855, -24038=>6856, -24231=>6857, -25387=>6858, -32618=>6859, -20027=>6860, -20303=>6861, -20367=>6862, -20570=>6863, -23005=>6864, -32964=>6865, -21610=>6866, -21608=>6867, -22014=>6868, -22863=>6869, -23449=>6870, -24030=>6871, -24282=>6872, -26205=>6873, -26417=>6874, -26609=>6875, -26666=>6876, -27880=>6877, -27954=>6878, -28234=>6879, -28557=>6880, -28855=>6881, -29664=>6882, -30087=>6883, -31820=>6884, -32002=>6885, -32044=>6886, -32162=>6887, -12168=>6888, -33311=>6888, -34523=>6889, -35387=>6890, -35461=>6891, -12187=>6892, -36208=>6892, -36490=>6893, -36659=>6894, -36913=>6895, -37198=>6896, -37202=>6897, -37956=>6898, -39376=>6899, -12149=>6900, -31481=>6900, -31909=>6901, -20426=>6902, -20737=>6903, -20934=>6904, -22472=>6905, -23535=>6906, -23803=>6907, -26201=>6908, -27197=>6909, -27994=>6910, -28310=>6911, -28652=>6912, -28940=>6913, -30063=>6914, -31459=>6915, -34850=>6916, -36897=>6917, -36981=>6918, -38603=>6919, -39423=>6920, -33537=>6921, -20013=>6922, -20210=>6923, -34886=>6924, -37325=>6925, -21373=>6926, -27355=>6927, -26987=>6928, -27713=>6929, -33914=>6930, -22686=>6931, -24974=>6932, -26366=>6933, -25327=>6934, -28893=>6935, -29969=>6936, -30151=>6937, -32338=>6938, -33976=>6939, -35657=>6940, -36104=>6941, -20043=>6942, -21482=>6943, -21675=>6944, -22320=>6945, -22336=>6946, -24535=>6947, -25345=>6948, -25351=>6949, -25711=>6950, -12096=>6951, -25903=>6951, -26088=>6952, -26234=>6953, -26525=>6954, -26547=>6955, -12108=>6956, -27490=>6956, -27744=>6957, -27802=>6958, -28460=>6959, -30693=>6960, -30757=>6961, -31049=>6962, -31063=>6963, -32025=>6964, -32930=>6965, -33026=>6966, -12164=>6967, -33267=>6967, -33437=>6968, -33463=>6969, -34584=>6970, -35468=>6971, -36100=>6972, -36286=>6973, -36978=>6974, -30452=>6975, -31257=>6976, -31287=>6977, -32340=>6978, -32887=>6979, -21767=>6980, -21972=>6981, -22645=>6982, -25391=>6983, -25634=>6984, -26185=>6985, -26187=>6986, -26733=>6987, -27035=>6988, -27524=>6989, -27941=>6990, -28337=>6991, -29645=>6992, -29800=>6993, -29857=>6994, -30043=>6995, -30137=>6996, -30433=>6997, -30494=>6998, -30603=>6999, -31206=>7000, -32265=>7001, -32285=>7002, -33275=>7003, -34095=>7004, -34967=>7005, -35386=>7006, -36049=>7007, -36587=>7008, -12192=>7009, -36784=>7009, -63857=>7009, -36914=>7010, -37805=>7011, -38499=>7012, -38515=>7013, -38663=>7014, -20356=>7015, -21489=>7016, -23018=>7017, -23241=>7018, -24089=>7019, -26702=>7020, -29894=>7021, -30142=>7022, -31209=>7023, -31378=>7024, -33187=>7025, -34541=>7026, -36074=>7027, -36300=>7028, -36845=>7029, -26015=>7030, -26389=>7031, -22519=>7032, -28503=>7033, -32221=>7034, -36655=>7035, -37878=>7036, -38598=>7037, -24501=>7038, -25074=>7039, -28548=>7040, -19988=>7041, -20376=>7042, -20511=>7043, -21449=>7044, -21983=>7045, -23919=>7046, -24046=>7047, -27425=>7048, -27492=>7049, -30923=>7050, -31642=>7051, -36425=>7052, -12190=>7053, -36554=>7053, -63746=>7053, -36974=>7054, -25417=>7055, -25662=>7056, -30528=>7057, -31364=>7058, -37679=>7059, -38015=>7060, -40810=>7061, -25776=>7062, -28591=>7063, -29158=>7064, -29864=>7065, -29914=>7066, -31428=>7067, -31762=>7068, -32386=>7069, -31922=>7070, -32408=>7071, -35738=>7072, -36106=>7073, -38013=>7074, -39184=>7075, -39244=>7076, -21049=>7077, -23519=>7078, -25830=>7079, -26413=>7080, -32046=>7081, -20717=>7082, -21443=>7083, -63851=>7083, -22649=>7084, -24920=>7085, -24921=>7086, -25082=>7087, -26028=>7088, -31449=>7089, -35730=>7090, -35734=>7091, -20489=>7092, -20513=>7093, -21109=>7094, -21809=>7095, -23100=>7096, -24288=>7097, -24432=>7098, -24884=>7099, -25950=>7100, -26124=>7101, -26166=>7102, -26274=>7103, -27085=>7104, -28356=>7105, -28466=>7106, -29462=>7107, -30241=>7108, -31379=>7109, -33081=>7110, -33369=>7111, -33750=>7112, -33980=>7113, -20661=>7114, -22512=>7115, -23488=>7116, -23528=>7117, -24425=>7118, -25505=>7119, -30758=>7120, -32181=>7121, -33756=>7122, -34081=>7123, -37319=>7124, -37365=>7125, -20874=>7126, -26613=>7127, -31574=>7128, -36012=>7129, -20932=>7130, -22971=>7131, -24765=>7132, -34389=>7133, -20508=>7134, -21076=>7135, -23610=>7136, -24957=>7137, -25114=>7138, -25299=>7139, -64002=>7139, -25842=>7140, -26021=>7141, -28364=>7142, -30240=>7143, -33034=>7144, -36448=>7145, -38495=>7146, -38587=>7147, -20191=>7148, -21315=>7149, -21912=>7150, -22825=>7151, -24029=>7152, -25797=>7153, -27849=>7154, -28154=>7155, -29588=>7156, -31359=>7157, -12167=>7158, -33307=>7158, -34214=>7159, -36068=>7160, -36368=>7161, -36983=>7162, -37351=>7163, -38369=>7164, -38433=>7165, -38854=>7166, -20984=>7167, -21746=>7168, -21894=>7169, -24505=>7170, -25764=>7171, -28552=>7172, -32180=>7173, -36639=>7174, -36685=>7175, -37941=>7176, -20681=>7177, -23574=>7178, -27838=>7179, -28155=>7180, -29979=>7181, -30651=>7182, -31805=>7183, -31844=>7184, -35449=>7185, -35522=>7186, -22558=>7187, -22974=>7188, -24086=>7189, -25463=>7190, -29266=>7191, -30090=>7192, -30571=>7193, -35548=>7194, -36028=>7195, -36626=>7196, -24307=>7197, -26228=>7198, -28152=>7199, -32893=>7200, -33729=>7201, -35531=>7202, -12205=>7203, -38737=>7203, -39894=>7204, -21059=>7205, -26367=>7206, -28053=>7207, -28399=>7208, -32224=>7209, -35558=>7210, -36910=>7211, -36958=>7212, -39636=>7213, -21021=>7214, -21119=>7215, -21736=>7216, -24980=>7217, -25220=>7218, -25307=>7219, -26786=>7220, -26898=>7221, -26970=>7222, -27189=>7223, -28818=>7224, -28966=>7225, -30813=>7226, -30977=>7227, -30990=>7228, -31186=>7229, -31245=>7230, -32918=>7231, -12171=>7232, -33400=>7232, -33493=>7233, -33609=>7234, -34121=>7235, -35970=>7236, -36229=>7237, -37218=>7238, -37259=>7239, -37294=>7240, -20419=>7241, -22225=>7242, -29165=>7243, -30679=>7244, -34560=>7245, -35320=>7246, -12072=>7247, -23544=>7247, -24534=>7248, -26449=>7249, -37032=>7250, -21474=>7251, -22618=>7252, -23541=>7253, -24740=>7254, -24961=>7255, -25696=>7256, -32317=>7257, -32880=>7258, -34085=>7259, -37507=>7260, -25774=>7261, -20652=>7262, -23828=>7263, -26368=>7264, -22684=>7265, -25277=>7266, -25512=>7267, -26894=>7268, -27000=>7269, -27166=>7270, -28267=>7271, -30394=>7272, -31179=>7273, -33467=>7274, -33833=>7275, -35535=>7276, -36264=>7277, -36861=>7278, -37138=>7279, -37195=>7280, -37276=>7281, -37648=>7282, -37656=>7283, -37786=>7284, -38619=>7285, -39478=>7286, -39949=>7287, -19985=>7288, -30044=>7289, -31069=>7290, -31482=>7291, -31569=>7292, -31689=>7293, -32302=>7294, -33988=>7295, -36441=>7296, -36468=>7297, -36600=>7298, -36880=>7299, -26149=>7300, -26943=>7301, -29763=>7302, -20986=>7303, -26414=>7304, -40668=>7305, -20805=>7306, -24544=>7307, -27798=>7308, -34802=>7309, -34909=>7310, -34935=>7311, -24756=>7312, -33205=>7313, -33795=>7314, -36101=>7315, -21462=>7316, -21561=>7317, -22068=>7318, -23094=>7319, -23601=>7320, -28810=>7321, -32736=>7322, -32858=>7323, -33030=>7324, -33261=>7325, -36259=>7326, -37257=>7327, -39519=>7328, -40434=>7329, -20596=>7330, -20164=>7331, -21408=>7332, -24827=>7333, -28204=>7334, -23652=>7335, -20360=>7336, -20516=>7337, -21988=>7338, -23769=>7339, -24159=>7340, -24677=>7341, -26772=>7342, -27835=>7343, -28100=>7344, -29118=>7345, -30164=>7346, -30196=>7347, -30305=>7348, -31258=>7349, -31305=>7350, -32199=>7351, -32251=>7352, -32622=>7353, -33268=>7354, -34473=>7355, -36636=>7356, -38601=>7357, -39347=>7358, -12242=>7359, -40786=>7359, -21063=>7360, -21189=>7361, -39149=>7362, -35242=>7363, -19971=>7364, -26578=>7365, -28422=>7366, -20405=>7367, -23522=>7368, -26517=>7369, -27784=>7370, -63858=>7370, -28024=>7371, -29723=>7372, -30759=>7373, -37341=>7374, -37756=>7375, -34756=>7376, -31204=>7377, -31281=>7378, -24555=>7379, -20182=>7380, -21668=>7381, -21822=>7382, -22702=>7383, -22949=>7384, -24816=>7385, -25171=>7386, -25302=>7387, -26422=>7388, -26965=>7389, -33333=>7390, -38464=>7391, -39345=>7392, -39389=>7393, -20524=>7394, -21331=>7395, -21828=>7396, -22396=>7397, -25176=>7398, -25826=>7399, -26219=>7400, -26589=>7401, -28609=>7402, -28655=>7403, -29730=>7404, -29752=>7405, -35351=>7406, -37944=>7407, -21585=>7408, -22022=>7409, -22374=>7410, -24392=>7411, -24986=>7412, -27470=>7413, -28760=>7414, -28845=>7415, -32187=>7416, -35477=>7417, -22890=>7418, -33067=>7419, -25506=>7420, -30472=>7421, -32829=>7422, -36010=>7423, -22612=>7424, -25645=>7425, -27067=>7426, -23445=>7427, -24081=>7428, -28271=>7429, -34153=>7430, -20812=>7431, -21488=>7432, -22826=>7433, -24608=>7434, -24907=>7435, -27526=>7436, -27760=>7437, -27888=>7438, -31518=>7439, -32974=>7440, -33492=>7441, -36294=>7442, -37040=>7443, -39089=>7444, -25799=>7445, -28580=>7446, -25745=>7447, -25860=>7448, -20814=>7449, -21520=>7450, -12063=>7451, -22303=>7451, -35342=>7452, -24927=>7453, -26742=>7454, -30171=>7455, -31570=>7456, -32113=>7457, -36890=>7458, -22534=>7459, -27084=>7460, -33151=>7461, -35114=>7462, -36864=>7463, -38969=>7464, -20600=>7465, -22871=>7466, -22956=>7467, -25237=>7468, -36879=>7469, -39722=>7470, -24925=>7471, -29305=>7472, -38358=>7473, -22369=>7474, -23110=>7475, -24052=>7476, -25226=>7477, -25773=>7478, -25850=>7479, -26487=>7480, -27874=>7481, -27966=>7482, -29228=>7483, -29750=>7484, -30772=>7485, -32631=>7486, -33453=>7487, -36315=>7488, -38935=>7489, -21028=>7490, -22338=>7491, -26495=>7492, -29256=>7493, -29923=>7494, -36009=>7495, -36774=>7496, -37393=>7497, -38442=>7498, -12043=>7499, -20843=>7499, -21485=>7500, -25420=>7501, -20329=>7502, -21764=>7503, -24726=>7504, -25943=>7505, -27803=>7506, -28031=>7507, -29260=>7508, -29437=>7509, -31255=>7510, -35207=>7511, -12185=>7512, -35997=>7512, -24429=>7513, -28558=>7514, -28921=>7515, -33192=>7516, -24846=>7517, -20415=>7518, -63845=>7518, -20559=>7519, -25153=>7520, -12122=>7521, -29255=>7521, -31687=>7522, -32232=>7523, -32745=>7524, -36941=>7525, -38829=>7526, -39449=>7527, -36022=>7528, -22378=>7529, -24179=>7530, -26544=>7531, -33805=>7532, -35413=>7533, -21536=>7534, -23318=>7535, -24163=>7536, -24290=>7537, -24330=>7538, -25987=>7539, -32954=>7540, -34109=>7541, -38281=>7542, -38491=>7543, -20296=>7544, -21253=>7545, -21261=>7546, -21263=>7547, -21638=>7548, -21754=>7549, -22275=>7550, -24067=>7551, -24598=>7552, -25243=>7553, -25265=>7554, -25429=>7555, -27873=>7556, -28006=>7557, -30129=>7558, -30770=>7559, -32990=>7560, -33071=>7561, -33502=>7562, -33889=>7563, -33970=>7564, -34957=>7565, -35090=>7566, -36875=>7567, -37610=>7568, -39165=>7569, -39825=>7570, -24133=>7571, -26292=>7572, -64006=>7572, -26333=>7573, -28689=>7574, -29190=>7575, -20469=>7576, -21117=>7577, -24426=>7578, -24915=>7579, -26451=>7580, -27161=>7581, -28418=>7582, -29922=>7583, -31080=>7584, -34920=>7585, -35961=>7586, -39111=>7587, -39108=>7588, -39491=>7589, -21697=>7590, -31263=>7591, -26963=>7592, -35575=>7593, -35914=>7594, -12213=>7595, -39080=>7595, -39342=>7596, -24444=>7597, -25259=>7598, -30130=>7599, -12138=>7600, -30382=>7600, -34987=>7601, -36991=>7602, -38466=>7603, -21305=>7604, -24380=>7605, -24517=>7606, -27852=>7607, -63848=>7607, -29644=>7608, -30050=>7609, -12134=>7610, -30091=>7610, -31558=>7611, -33534=>7612, -39325=>7613, -20047=>7614, -36924=>7615, -19979=>7616, -20309=>7617, -21414=>7618, -22799=>7619, -24264=>7620, -26160=>7621, -27827=>7622, -29781=>7623, -33655=>7624, -34662=>7625, -36032=>7626, -36944=>7627, -38686=>7628, -39957=>7629, -22737=>7630, -23416=>7631, -34384=>7632, -35604=>7633, -40372=>7634, -23506=>7635, -24680=>7636, -24717=>7637, -26097=>7638, -27735=>7639, -28450=>7640, -28579=>7641, -28698=>7642, -32597=>7643, -32752=>7644, -38289=>7645, -38290=>7646, -38480=>7647, -38867=>7648, -21106=>7649, -36676=>7650, -20989=>7651, -21547=>7652, -21688=>7653, -21859=>7654, -21898=>7655, -27323=>7656, -28085=>7657, -32216=>7658, -33382=>7659, -37532=>7660, -38519=>7661, -40569=>7662, -21512=>7663, -21704=>7664, -30418=>7665, -34532=>7666, -38308=>7667, -38356=>7668, -38492=>7669, -20130=>7670, -20233=>7671, -23022=>7672, -23270=>7673, -24055=>7674, -24658=>7675, -25239=>7676, -26477=>7677, -26689=>7678, -27782=>7679, -28207=>7680, -32568=>7681, -32923=>7682, -33322=>7683, -38917=>7684, -20133=>7685, -20565=>7686, -21683=>7687, -22419=>7688, -22874=>7689, -23401=>7690, -23475=>7691, -25032=>7692, -26999=>7693, -28023=>7694, -28707=>7695, -34809=>7696, -35299=>7697, -35442=>7698, -35559=>7699, -36994=>7700, -39405=>7701, -39608=>7702, -21182=>7703, -26680=>7704, -20502=>7705, -24184=>7706, -26447=>7707, -33607=>7708, -12175=>7709, -34892=>7709, -64008=>7709, -20139=>7710, -21521=>7711, -22190=>7712, -29670=>7713, -37141=>7714, -38911=>7715, -39177=>7716, -39255=>7717, -12217=>7718, -39321=>7718, -22099=>7719, -22687=>7720, -34395=>7721, -35377=>7722, -25010=>7723, -27382=>7724, -29563=>7725, -36562=>7726, -27463=>7727, -38570=>7728, -39511=>7729, -22869=>7730, -29184=>7731, -36203=>7732, -12208=>7733, -38761=>7733, -20436=>7734, -23796=>7735, -24358=>7736, -25080=>7737, -26203=>7738, -27883=>7739, -28843=>7740, -12126=>7741, -29572=>7741, -29625=>7742, -29694=>7743, -30505=>7744, -30541=>7745, -32067=>7746, -32098=>7747, -32291=>7748, -33335=>7749, -34898=>7750, -36066=>7751, -37449=>7752, -39023=>7753, -23377=>7754, -12147=>7755, -31348=>7755, -12174=>7756, -34880=>7756, -12212=>7757, -38913=>7757, -23244=>7758, -20448=>7759, -21332=>7760, -22846=>7761, -23805=>7762, -25406=>7763, -28025=>7764, -29433=>7765, -33029=>7766, -33031=>7767, -33698=>7768, -37583=>7769, -38960=>7770, -20136=>7771, -20804=>7772, -21009=>7773, -22411=>7774, -24418=>7775, -27842=>7776, -28366=>7777, -28677=>7778, -28752=>7779, -28847=>7780, -29074=>7781, -29673=>7782, -29801=>7783, -63918=>7783, -33610=>7784, -34722=>7785, -34913=>7786, -36872=>7787, -37026=>7788, -37795=>7789, -39336=>7790, -20846=>7791, -24407=>7792, -24800=>7793, -24935=>7794, -26291=>7795, -34137=>7796, -36426=>7797, -37295=>7798, -38795=>7799, -20046=>7800, -20114=>7801, -21628=>7802, -22741=>7803, -22778=>7804, -22909=>7805, -23733=>7806, -24359=>7807, -12094=>7808, -25142=>7808, -25160=>7809, -26122=>7810, -26215=>7811, -27627=>7812, -28009=>7813, -28111=>7814, -28246=>7815, -28408=>7816, -28564=>7817, -28640=>7818, -28649=>7819, -28765=>7820, -29392=>7821, -29733=>7822, -29786=>7823, -29920=>7824, -30355=>7825, -31068=>7826, -31946=>7827, -32286=>7828, -32993=>7829, -33446=>7830, -33899=>7831, -33983=>7832, -34382=>7833, -34399=>7834, -34676=>7835, -35703=>7836, -35946=>7837, -37804=>7838, -38912=>7839, -39013=>7840, -24785=>7841, -25110=>7842, -37239=>7843, -23130=>7844, -26127=>7845, -28151=>7846, -28222=>7847, -29759=>7848, -39746=>7849, -24573=>7850, -24794=>7851, -31503=>7852, -21700=>7853, -24344=>7854, -27742=>7855, -27859=>7856, -27946=>7857, -28888=>7858, -32005=>7859, -34425=>7860, -35340=>7861, -40251=>7862, -21270=>7863, -21644=>7864, -23301=>7865, -27194=>7866, -12117=>7867, -28779=>7867, -30069=>7868, -31117=>7869, -12146=>7870, -31166=>7870, -33457=>7871, -33775=>7872, -35441=>7873, -35649=>7874, -36008=>7875, -38772=>7876, -25844=>7877, -25899=>7878, -30906=>7879, -30907=>7880, -31339=>7881, -20024=>7882, -21914=>7883, -22864=>7884, -23462=>7885, -24187=>7886, -24739=>7887, -25563=>7888, -27489=>7889, -26213=>7890, -26707=>7891, -28185=>7892, -29029=>7893, -29872=>7894, -32008=>7895, -36996=>7896, -39529=>7897, -39973=>7898, -27963=>7899, -28369=>7900, -63748=>7900, -29502=>7901, -35905=>7902, -38346=>7903, -20976=>7904, -24140=>7905, -24488=>7906, -24653=>7907, -24822=>7908, -24880=>7909, -24908=>7910, -26179=>7911, -26180=>7912, -27045=>7913, -27841=>7914, -28255=>7915, -28361=>7916, -28514=>7917, -29004=>7918, -29852=>7919, -30343=>7920, -31681=>7921, -31783=>7922, -33618=>7923, -34647=>7924, -36945=>7925, -38541=>7926, -12232=>7927, -40643=>7927, -21295=>7928, -22238=>7929, -24315=>7930, -24458=>7931, -24674=>7932, -24724=>7933, -25079=>7934, -26214=>7935, -26371=>7936, -27292=>7937, -28142=>7938, -28590=>7939, -28784=>7940, -29546=>7941, -32362=>7942, -33214=>7943, -33588=>7944, -34516=>7945, -35496=>7946, -36036=>7947, -21123=>7948, -29554=>7949, -23446=>7950, -27243=>7951, -37892=>7952, -21742=>7953, -22150=>7954, -23389=>7955, -25928=>7956, -25989=>7957, -26313=>7958, -26783=>7959, -28045=>7960, -28102=>7961, -12120=>7962, -29243=>7962, -32948=>7963, -37237=>7964, -39501=>7965, -20399=>7966, -20505=>7967, -21402=>7968, -21518=>7969, -21564=>7970, -21897=>7971, -21957=>7972, -24127=>7973, -24460=>7974, -26429=>7975, -29030=>7976, -29661=>7977, -36869=>7978, -21211=>7979, -21235=>7980, -22628=>7981, -22734=>7982, -28932=>7983, -29071=>7984, -29179=>7985, -34224=>7986, -35347=>7987, -26248=>7988, -63941=>7988, -34216=>7989, -21927=>7990, -26244=>7991, -29002=>7992, -33841=>7993, -21321=>7994, -21913=>7995, -27585=>7996, -24409=>7997, -24509=>7998, -25582=>7999, -26249=>8000, -28999=>8001, -35569=>8002, -36637=>8003, -40638=>8004, -20241=>8005, -25658=>8006, -28875=>8007, -30054=>8008, -34407=>8009, -24676=>8010, -35662=>8011, -40440=>8012, -20807=>8013, -20982=>8014, -21256=>8015, -27958=>8016, -33016=>8017, -12234=>8018, -40657=>8018, -26133=>8019, -27427=>8020, -28824=>8021, -30165=>8022, -21507=>8023, -23673=>8024, -32007=>8025, -35350=>8026, -12107=>8027, -27424=>8027, -27453=>8028, -27462=>8029, -21560=>8030, -24688=>8031, -27965=>8032, -32725=>8033, -33288=>8034, -20694=>8035, -20958=>8036, -21916=>8037, -22123=>8038, -22221=>8039, -23020=>8040, -23305=>8041, -24076=>8042, -24985=>8043, -24984=>8044, -25137=>8045, -26206=>8046, -26342=>8047, -29081=>8048, -29113=>8049, -29114=>8050, -29351=>8051, -31143=>8052, -31232=>8053, -32690=>8054, -35440=>8055, - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -12310=>8219, -12311=>8220, -12312=>8221, -12313=>8222, -8223=>8237, -8219=>8238, -8314=>8239, -8315=>8240, -8316=>8248, -8317=>8250, -8318=>8251, -700=>8275, -8942=>8320, -8759=>8321, -10122=>8342, -10123=>8343, -10124=>8344, -10125=>8345, -10126=>8346, -10127=>8347, -10128=>8348, -10129=>8349, -10130=>8350, -10131=>8351, -9398=>8388, -9399=>8389, -9400=>8390, -9401=>8391, -9402=>8392, -9403=>8393, -9404=>8394, -9405=>8395, -9406=>8396, -9407=>8397, -9408=>8398, -9409=>8399, -9410=>8400, -9411=>8401, -9412=>8402, -9413=>8403, -9414=>8404, -9415=>8405, -9416=>8406, -9417=>8407, -9418=>8408, -9419=>8409, -9420=>8410, -9421=>8411, -9422=>8412, -9423=>8413, -8826=>8475, -8827=>8476, -8910=>8477, -8911=>8478, -8832=>8479, -8833=>8480, -8816=>8481, -8817=>8482, -8818=>8483, -8819=>8484, -8842=>8486, -8843=>8488, -8822=>8489, -8823=>8490, -8825=>8491, -8922=>8492, -8923=>8493, -8773=>8499, -8771=>8500, -8776=>8501, -8868=>8503, -8244=>8582, -9839=>8594, -8258=>8599, -10045=>8604, -8226=>8607, -8249=>8612, -8250=>8613, -10010=>8630, -10006=>8631, -9711=>8633, -10070=>8637, -9676=>8639, -9775=>8664, -12320=>8671, -10102=>8673, -10103=>8674, -10104=>8675, -10105=>8676, -10106=>8677, -10107=>8678, -10108=>8679, -10109=>8680, -10110=>8681, -10111=>8682, -12306=>8700, -12342=>8701, -8710=>8715, -8735=>8717, -8741=>8719, -8742=>8720, -8787=>8722, -8785=>8723, -8806=>8724, -8807=>8725, -8723=>8726, -8853=>8727, -8854=>8728, -8855=>8729, -8980=>8731, -8802=>8734, -9649=>8736, -8738=>8738, -8784=>8739, -8867=>8742, -8814=>8745, -8815=>8746, -8837=>8747, -8836=>8748, -8713=>8749, -8716=>8750, -8891=>8751, -8892=>8752, -8794=>8753, -8966=>8754, -12958=>8761, -8252=>8763, -9702=>8775, -9663=>8779, -9653=>8780, -9657=>8781, -9667=>8782, -9674=>8787, -12849=>8788, -12857=>8789, -13259=>8790, -9327=>8791, -9328=>8792, -9329=>8793, -9330=>8794, -9331=>8795, -8656=>8814, -8655=>8815, -8653=>8816, -8657=>8854, -8659=>8855, -8626=>8864, -8625=>8865, -8628=>8867, -8624=>8868, -8627=>8869, -8636=>8884, -8640=>8885, -8644=>8896, -8645=>8897, -9347=>9042, -9348=>9043, -9349=>9044, -9350=>9045, -9351=>9046, -12948=>9080, -12965=>9096, -8672=>9190, -8674=>9191, -8673=>9192, -8675=>9193, -8678=>9198, -8680=>9199, -8679=>9200, -8681=>9201, -9757=>9222, -9759=>9223, -12944=>9300, -12938=>9301, -12939=>9302, -12940=>9303, -12941=>9304, -12942=>9305, -12943=>9306, -12318=>9322, -12319=>9323, -8246=>9324, -8245=>9326, -12540=>9330, -44034=>9333, -44035=>9334, -44037=>9335, -44038=>9336, -44043=>9337, -44044=>9338, -44045=>9339, -44046=>9340, -44047=>9341, -44056=>9342, -44062=>9343, -44063=>9344, -44065=>9345, -44066=>9346, -44067=>9347, -44069=>9348, -44070=>9349, -44071=>9350, -44072=>9351, -44073=>9352, -44074=>9353, -44075=>9354, -44078=>9355, -44082=>9356, -44083=>9357, -44084=>9358, -44085=>9359, -44086=>9360, -44087=>9361, -44090=>9362, -44091=>9363, -44093=>9364, -44094=>9365, -44095=>9366, -44097=>9367, -44098=>9368, -44099=>9369, -44100=>9370, -44101=>9371, -44102=>9372, -44103=>9373, -44104=>9374, -44105=>9375, -44106=>9376, -44108=>9377, -44110=>9378, -44111=>9379, -44112=>9380, -44113=>9381, -44114=>9382, -44115=>9383, -44117=>9384, -44118=>9385, -44119=>9386, -44121=>9387, -44122=>9388, -44123=>9389, -44125=>9390, -44126=>9391, -44127=>9392, -44128=>9393, -44129=>9394, -44130=>9395, -44131=>9396, -44132=>9397, -44133=>9398, -44134=>9399, -44135=>9400, -44136=>9401, -44137=>9402, -44138=>9403, -44139=>9404, -44140=>9405, -44141=>9406, -44142=>9407, -44143=>9408, -44146=>9409, -44147=>9410, -44149=>9411, -44150=>9412, -44153=>9413, -44155=>9414, -44156=>9415, -44157=>9416, -44158=>9417, -44159=>9418, -44162=>9419, -44167=>9420, -44168=>9421, -44173=>9422, -44174=>9423, -44175=>9424, -44177=>9425, -44178=>9426, -44179=>9427, -44181=>9428, -44182=>9429, -44183=>9430, -44184=>9431, -44185=>9432, -44186=>9433, -44187=>9434, -44190=>9435, -44194=>9436, -44195=>9437, -44196=>9438, -44197=>9439, -44198=>9440, -44199=>9441, -44203=>9442, -44205=>9443, -44206=>9444, -44209=>9445, -44210=>9446, -44211=>9447, -44212=>9448, -44213=>9449, -44214=>9450, -44215=>9451, -44218=>9452, -44222=>9453, -44223=>9454, -44224=>9455, -44226=>9456, -44227=>9457, -44229=>9458, -44230=>9459, -44231=>9460, -44233=>9461, -44234=>9462, -44235=>9463, -44237=>9464, -44238=>9465, -44239=>9466, -44240=>9467, -44241=>9468, -44242=>9469, -44243=>9470, -44244=>9471, -44246=>9472, -44248=>9473, -44249=>9474, -44250=>9475, -44251=>9476, -44252=>9477, -44253=>9478, -44254=>9479, -44255=>9480, -44258=>9481, -44259=>9482, -44261=>9483, -44262=>9484, -44265=>9485, -44267=>9486, -44269=>9487, -44270=>9488, -44274=>9489, -44276=>9490, -44279=>9491, -44280=>9492, -44281=>9493, -44282=>9494, -44283=>9495, -44286=>9496, -44287=>9497, -44289=>9498, -44290=>9499, -44291=>9500, -44293=>9501, -44295=>9502, -44296=>9503, -44297=>9504, -44298=>9505, -44299=>9506, -44302=>9507, -44304=>9508, -44306=>9509, -44307=>9510, -44308=>9511, -44309=>9512, -44310=>9513, -44311=>9514, -44313=>9515, -44314=>9516, -44315=>9517, -44317=>9518, -44318=>9519, -44319=>9520, -44321=>9521, -44322=>9522, -44323=>9523, -44324=>9524, -44325=>9525, -44326=>9526, -44327=>9527, -44328=>9528, -44330=>9529, -44331=>9530, -44334=>9531, -44335=>9532, -44336=>9533, -44337=>9534, -44338=>9535, -44339=>9536, -44342=>9537, -44343=>9538, -44345=>9539, -44346=>9540, -44347=>9541, -44349=>9542, -44350=>9543, -44351=>9544, -44352=>9545, -44353=>9546, -44354=>9547, -44355=>9548, -44358=>9549, -44360=>9550, -44362=>9551, -44363=>9552, -44364=>9553, -44365=>9554, -44366=>9555, -44367=>9556, -44369=>9557, -44370=>9558, -44371=>9559, -44373=>9560, -44374=>9561, -44375=>9562, -44377=>9563, -44378=>9564, -44379=>9565, -44380=>9566, -44381=>9567, -44382=>9568, -44383=>9569, -44384=>9570, -44386=>9571, -44388=>9572, -44389=>9573, -44390=>9574, -44391=>9575, -44392=>9576, -44393=>9577, -44394=>9578, -44395=>9579, -44398=>9580, -44399=>9581, -44401=>9582, -44402=>9583, -44407=>9584, -44408=>9585, -44409=>9586, -44410=>9587, -44414=>9588, -44416=>9589, -44419=>9590, -44420=>9591, -44421=>9592, -44422=>9593, -44423=>9594, -44426=>9595, -44427=>9596, -44429=>9597, -44430=>9598, -44431=>9599, -44433=>9600, -44434=>9601, -44435=>9602, -44436=>9603, -44437=>9604, -44438=>9605, -44439=>9606, -44440=>9607, -44441=>9608, -44442=>9609, -44443=>9610, -44446=>9611, -44447=>9612, -44448=>9613, -44449=>9614, -44450=>9615, -44451=>9616, -44453=>9617, -44454=>9618, -44455=>9619, -44456=>9620, -44457=>9621, -44458=>9622, -44459=>9623, -44460=>9624, -44461=>9625, -44462=>9626, -44463=>9627, -44464=>9628, -44465=>9629, -44466=>9630, -44467=>9631, -44468=>9632, -44469=>9633, -44470=>9634, -44472=>9635, -44473=>9636, -44474=>9637, -44475=>9638, -44476=>9639, -44477=>9640, -44478=>9641, -44479=>9642, -44482=>9643, -44483=>9644, -44485=>9645, -44486=>9646, -44487=>9647, -44489=>9648, -44490=>9649, -44491=>9650, -44492=>9651, -44493=>9652, -44494=>9653, -44495=>9654, -44498=>9655, -44500=>9656, -44501=>9657, -44502=>9658, -44503=>9659, -44504=>9660, -44505=>9661, -44506=>9662, -44507=>9663, -44509=>9664, -44510=>9665, -44511=>9666, -44513=>9667, -44514=>9668, -44515=>9669, -44517=>9670, -44518=>9671, -44519=>9672, -44520=>9673, -44521=>9674, -44522=>9675, -44523=>9676, -44524=>9677, -44525=>9678, -44526=>9679, -44527=>9680, -44528=>9681, -44529=>9682, -44530=>9683, -44531=>9684, -44532=>9685, -44533=>9686, -44534=>9687, -44535=>9688, -44538=>9689, -44539=>9690, -44541=>9691, -44542=>9692, -44546=>9693, -44547=>9694, -44548=>9695, -44549=>9696, -44550=>9697, -44551=>9698, -44554=>9699, -44556=>9700, -44558=>9701, -44559=>9702, -44560=>9703, -44561=>9704, -44562=>9705, -44563=>9706, -44565=>9707, -44566=>9708, -44567=>9709, -44568=>9710, -44569=>9711, -44570=>9712, -44571=>9713, -44572=>9714, -44573=>9715, -44574=>9716, -44575=>9717, -44576=>9718, -44577=>9719, -44578=>9720, -44579=>9721, -44580=>9722, -44581=>9723, -44582=>9724, -44583=>9725, -44584=>9726, -44585=>9727, -44586=>9728, -44587=>9729, -44588=>9730, -44589=>9731, -44590=>9732, -44591=>9733, -44594=>9734, -44595=>9735, -44597=>9736, -44598=>9737, -44601=>9738, -44603=>9739, -44604=>9740, -44605=>9741, -44606=>9742, -44607=>9743, -44610=>9744, -44612=>9745, -44615=>9746, -44616=>9747, -44617=>9748, -44619=>9749, -44623=>9750, -44625=>9751, -44626=>9752, -44627=>9753, -44629=>9754, -44631=>9755, -44632=>9756, -44633=>9757, -44634=>9758, -44635=>9759, -44638=>9760, -44642=>9761, -44643=>9762, -44644=>9763, -44646=>9764, -44647=>9765, -44650=>9766, -44651=>9767, -44653=>9768, -44654=>9769, -44655=>9770, -44657=>9771, -44658=>9772, -44659=>9773, -44660=>9774, -44661=>9775, -44662=>9776, -44663=>9777, -44666=>9778, -44670=>9779, -44671=>9780, -44672=>9781, -44673=>9782, -44674=>9783, -44675=>9784, -44678=>9785, -44679=>9786, -44680=>9787, -44681=>9788, -44682=>9789, -44683=>9790, -44685=>9791, -44686=>9792, -44687=>9793, -44688=>9794, -44689=>9795, -44690=>9796, -44691=>9797, -44692=>9798, -44693=>9799, -44694=>9800, -44695=>9801, -44696=>9802, -44697=>9803, -44698=>9804, -44699=>9805, -44700=>9806, -44701=>9807, -44702=>9808, -44703=>9809, -44704=>9810, -44705=>9811, -44706=>9812, -44707=>9813, -44708=>9814, -44709=>9815, -44710=>9816, -44711=>9817, -44712=>9818, -44713=>9819, -44714=>9820, -44715=>9821, -44716=>9822, -44717=>9823, -44718=>9824, -44719=>9825, -44720=>9826, -44721=>9827, -44722=>9828, -44723=>9829, -44724=>9830, -44725=>9831, -44726=>9832, -44727=>9833, -44728=>9834, -44729=>9835, -44730=>9836, -44731=>9837, -44735=>9838, -44737=>9839, -44738=>9840, -44739=>9841, -44741=>9842, -44742=>9843, -44743=>9844, -44744=>9845, -44745=>9846, -44746=>9847, -44747=>9848, -44750=>9849, -44754=>9850, -44755=>9851, -44756=>9852, -44757=>9853, -44758=>9854, -44759=>9855, -44762=>9856, -44763=>9857, -44765=>9858, -44766=>9859, -44767=>9860, -44768=>9861, -44769=>9862, -44770=>9863, -44771=>9864, -44772=>9865, -44773=>9866, -44774=>9867, -44775=>9868, -44777=>9869, -44778=>9870, -44780=>9871, -44782=>9872, -44783=>9873, -44784=>9874, -44785=>9875, -44786=>9876, -44787=>9877, -44789=>9878, -44790=>9879, -44791=>9880, -44793=>9881, -44794=>9882, -44795=>9883, -44797=>9884, -44798=>9885, -44799=>9886, -44800=>9887, -44801=>9888, -44802=>9889, -44803=>9890, -44804=>9891, -44805=>9892, -44806=>9893, -44809=>9894, -44810=>9895, -44811=>9896, -44812=>9897, -44814=>9898, -44815=>9899, -44817=>9900, -44818=>9901, -44819=>9902, -44820=>9903, -44821=>9904, -44822=>9905, -44823=>9906, -44824=>9907, -44825=>9908, -44826=>9909, -44827=>9910, -44828=>9911, -44829=>9912, -44830=>9913, -44831=>9914, -44832=>9915, -44833=>9916, -44834=>9917, -44835=>9918, -44836=>9919, -44837=>9920, -44838=>9921, -44839=>9922, -44840=>9923, -44841=>9924, -44842=>9925, -44843=>9926, -44846=>9927, -44847=>9928, -44849=>9929, -44851=>9930, -44853=>9931, -44854=>9932, -44855=>9933, -44856=>9934, -44857=>9935, -44858=>9936, -44859=>9937, -44862=>9938, -44864=>9939, -44868=>9940, -44869=>9941, -44870=>9942, -44871=>9943, -44874=>9944, -44875=>9945, -44876=>9946, -44877=>9947, -44878=>9948, -44879=>9949, -44881=>9950, -44882=>9951, -44883=>9952, -44884=>9953, -44885=>9954, -44886=>9955, -44887=>9956, -44888=>9957, -44889=>9958, -44890=>9959, -44891=>9960, -44894=>9961, -44895=>9962, -44896=>9963, -44897=>9964, -44898=>9965, -44899=>9966, -44902=>9967, -44903=>9968, -44904=>9969, -44905=>9970, -44906=>9971, -44907=>9972, -44908=>9973, -44909=>9974, -44910=>9975, -44911=>9976, -44912=>9977, -44913=>9978, -44914=>9979, -44915=>9980, -44916=>9981, -44917=>9982, -44918=>9983, -44919=>9984, -44920=>9985, -44922=>9986, -44923=>9987, -44924=>9988, -44925=>9989, -44926=>9990, -44927=>9991, -44929=>9992, -44930=>9993, -44931=>9994, -44933=>9995, -44934=>9996, -44935=>9997, -44937=>9998, -44938=>9999, -44939=>10000, -44940=>10001, -44941=>10002, -44942=>10003, -44943=>10004, -44946=>10005, -44947=>10006, -44948=>10007, -44950=>10008, -44951=>10009, -44952=>10010, -44953=>10011, -44954=>10012, -44955=>10013, -44957=>10014, -44958=>10015, -44959=>10016, -44960=>10017, -44961=>10018, -44962=>10019, -44963=>10020, -44964=>10021, -44965=>10022, -44966=>10023, -44967=>10024, -44968=>10025, -44969=>10026, -44970=>10027, -44971=>10028, -44972=>10029, -44973=>10030, -44974=>10031, -44975=>10032, -44976=>10033, -44977=>10034, -44978=>10035, -44979=>10036, -44980=>10037, -44981=>10038, -44982=>10039, -44983=>10040, -44986=>10041, -44987=>10042, -44989=>10043, -44990=>10044, -44991=>10045, -44993=>10046, -44994=>10047, -44995=>10048, -44996=>10049, -44997=>10050, -44998=>10051, -45002=>10052, -45004=>10053, -45007=>10054, -45008=>10055, -45009=>10056, -45010=>10057, -45011=>10058, -45013=>10059, -45014=>10060, -45015=>10061, -45016=>10062, -45017=>10063, -45018=>10064, -45019=>10065, -45021=>10066, -45022=>10067, -45023=>10068, -45024=>10069, -45025=>10070, -45026=>10071, -45027=>10072, -45028=>10073, -45029=>10074, -45030=>10075, -45031=>10076, -45034=>10077, -45035=>10078, -45036=>10079, -45037=>10080, -45038=>10081, -45039=>10082, -45042=>10083, -45043=>10084, -45045=>10085, -45046=>10086, -45047=>10087, -45049=>10088, -45050=>10089, -45051=>10090, -45052=>10091, -45053=>10092, -45054=>10093, -45055=>10094, -45058=>10095, -45059=>10096, -45061=>10097, -45062=>10098, -45063=>10099, -45064=>10100, -45065=>10101, -45066=>10102, -45067=>10103, -45069=>10104, -45070=>10105, -45071=>10106, -45073=>10107, -45074=>10108, -45075=>10109, -45077=>10110, -45078=>10111, -45079=>10112, -45080=>10113, -45081=>10114, -45082=>10115, -45083=>10116, -45086=>10117, -45087=>10118, -45088=>10119, -45089=>10120, -45090=>10121, -45091=>10122, -45092=>10123, -45093=>10124, -45094=>10125, -45095=>10126, -45097=>10127, -45098=>10128, -45099=>10129, -45100=>10130, -45101=>10131, -45102=>10132, -45103=>10133, -45104=>10134, -45105=>10135, -45106=>10136, -45107=>10137, -45108=>10138, -45109=>10139, -45110=>10140, -45111=>10141, -45112=>10142, -45113=>10143, -45114=>10144, -45115=>10145, -45116=>10146, -45117=>10147, -45118=>10148, -45119=>10149, -45120=>10150, -45121=>10151, -45122=>10152, -45123=>10153, -45126=>10154, -45127=>10155, -45129=>10156, -45131=>10157, -45133=>10158, -45135=>10159, -45136=>10160, -45137=>10161, -45138=>10162, -45142=>10163, -45144=>10164, -45146=>10165, -45147=>10166, -45148=>10167, -45150=>10168, -45151=>10169, -45152=>10170, -45153=>10171, -45154=>10172, -45155=>10173, -45156=>10174, -45157=>10175, -45158=>10176, -45159=>10177, -45160=>10178, -45161=>10179, -45162=>10180, -45163=>10181, -45164=>10182, -45165=>10183, -45166=>10184, -45167=>10185, -45168=>10186, -45169=>10187, -45170=>10188, -45171=>10189, -45172=>10190, -45173=>10191, -45174=>10192, -45175=>10193, -45176=>10194, -45177=>10195, -45178=>10196, -45179=>10197, -45182=>10198, -45183=>10199, -45185=>10200, -45186=>10201, -45187=>10202, -45189=>10203, -45190=>10204, -45191=>10205, -45192=>10206, -45193=>10207, -45194=>10208, -45195=>10209, -45198=>10210, -45200=>10211, -45202=>10212, -45203=>10213, -45204=>10214, -45205=>10215, -45206=>10216, -45207=>10217, -45211=>10218, -45213=>10219, -45214=>10220, -45219=>10221, -45220=>10222, -45221=>10223, -45222=>10224, -45223=>10225, -45226=>10226, -45232=>10227, -45234=>10228, -45238=>10229, -45239=>10230, -45241=>10231, -45242=>10232, -45243=>10233, -45245=>10234, -45246=>10235, -45247=>10236, -45248=>10237, -45249=>10238, -45250=>10239, -45251=>10240, -45254=>10241, -45258=>10242, -45259=>10243, -45260=>10244, -45261=>10245, -45262=>10246, -45263=>10247, -45266=>10248, -45267=>10249, -45269=>10250, -45270=>10251, -45271=>10252, -45273=>10253, -45274=>10254, -45275=>10255, -45276=>10256, -45277=>10257, -45278=>10258, -45279=>10259, -45281=>10260, -45282=>10261, -45283=>10262, -45284=>10263, -45286=>10264, -45287=>10265, -45288=>10266, -45289=>10267, -45290=>10268, -45291=>10269, -45292=>10270, -45293=>10271, -45294=>10272, -45295=>10273, -45296=>10274, -45297=>10275, -45298=>10276, -45299=>10277, -45300=>10278, -45301=>10279, -45302=>10280, -45303=>10281, -45304=>10282, -45305=>10283, -45306=>10284, -45307=>10285, -45308=>10286, -45309=>10287, -45310=>10288, -45311=>10289, -45312=>10290, -45313=>10291, -45314=>10292, -45315=>10293, -45316=>10294, -45317=>10295, -45318=>10296, -45319=>10297, -45322=>10298, -45325=>10299, -45326=>10300, -45327=>10301, -45329=>10302, -45332=>10303, -45333=>10304, -45334=>10305, -45335=>10306, -45338=>10307, -45342=>10308, -45343=>10309, -45344=>10310, -45345=>10311, -45346=>10312, -45350=>10313, -45351=>10314, -45353=>10315, -45354=>10316, -45355=>10317, -45357=>10318, -45358=>10319, -45359=>10320, -45360=>10321, -45361=>10322, -45362=>10323, -45363=>10324, -45366=>10325, -45370=>10326, -45371=>10327, -45372=>10328, -45373=>10329, -45374=>10330, -45375=>10331, -45378=>10332, -45379=>10333, -45381=>10334, -45382=>10335, -45383=>10336, -45385=>10337, -45386=>10338, -45387=>10339, -45388=>10340, -45389=>10341, -45390=>10342, -45391=>10343, -45394=>10344, -45395=>10345, -45398=>10346, -45399=>10347, -45401=>10348, -45402=>10349, -45403=>10350, -45405=>10351, -45406=>10352, -45407=>10353, -45409=>10354, -45410=>10355, -45411=>10356, -45412=>10357, -45413=>10358, -45414=>10359, -45415=>10360, -45416=>10361, -45417=>10362, -45418=>10363, -45419=>10364, -45420=>10365, -45421=>10366, -45422=>10367, -45423=>10368, -45424=>10369, -45425=>10370, -45426=>10371, -45427=>10372, -45428=>10373, -45429=>10374, -45430=>10375, -45431=>10376, -45434=>10377, -45435=>10378, -45437=>10379, -45438=>10380, -45439=>10381, -45441=>10382, -45443=>10383, -45444=>10384, -45445=>10385, -45446=>10386, -45447=>10387, -45450=>10388, -45452=>10389, -45454=>10390, -45455=>10391, -45456=>10392, -45457=>10393, -45461=>10394, -45462=>10395, -45463=>10396, -45465=>10397, -45466=>10398, -45467=>10399, -45469=>10400, -45470=>10401, -45471=>10402, -45472=>10403, -45473=>10404, -45474=>10405, -45475=>10406, -45476=>10407, -45477=>10408, -45478=>10409, -45479=>10410, -45481=>10411, -45482=>10412, -45483=>10413, -45484=>10414, -45485=>10415, -45486=>10416, -45487=>10417, -45488=>10418, -45489=>10419, -45490=>10420, -45491=>10421, -45492=>10422, -45493=>10423, -45494=>10424, -45495=>10425, -45496=>10426, -45497=>10427, -45498=>10428, -45499=>10429, -45500=>10430, -45501=>10431, -45502=>10432, -45503=>10433, -45504=>10434, -45505=>10435, -45506=>10436, -45507=>10437, -45508=>10438, -45509=>10439, -45510=>10440, -45511=>10441, -45512=>10442, -45513=>10443, -45514=>10444, -45515=>10445, -45517=>10446, -45518=>10447, -45519=>10448, -45521=>10449, -45522=>10450, -45523=>10451, -45525=>10452, -45526=>10453, -45527=>10454, -45528=>10455, -45529=>10456, -45530=>10457, -45531=>10458, -45534=>10459, -45536=>10460, -45537=>10461, -45538=>10462, -45539=>10463, -45540=>10464, -45541=>10465, -45542=>10466, -45543=>10467, -45546=>10468, -45547=>10469, -45549=>10470, -45550=>10471, -45551=>10472, -45553=>10473, -45554=>10474, -45555=>10475, -45556=>10476, -45557=>10477, -45558=>10478, -45559=>10479, -45560=>10480, -45562=>10481, -45564=>10482, -45566=>10483, -45567=>10484, -45568=>10485, -45569=>10486, -45570=>10487, -45571=>10488, -45574=>10489, -45575=>10490, -45577=>10491, -45578=>10492, -45581=>10493, -45582=>10494, -45583=>10495, -45584=>10496, -45585=>10497, -45586=>10498, -45587=>10499, -45590=>10500, -45592=>10501, -45594=>10502, -45595=>10503, -45596=>10504, -45597=>10505, -45598=>10506, -45599=>10507, -45601=>10508, -45602=>10509, -45603=>10510, -45604=>10511, -45605=>10512, -45606=>10513, -45607=>10514, -45608=>10515, -45609=>10516, -45610=>10517, -45611=>10518, -45612=>10519, -45613=>10520, -45614=>10521, -45615=>10522, -45616=>10523, -45617=>10524, -45618=>10525, -45619=>10526, -45621=>10527, -45622=>10528, -45623=>10529, -45624=>10530, -45625=>10531, -45626=>10532, -45627=>10533, -45629=>10534, -45630=>10535, -45631=>10536, -45632=>10537, -45633=>10538, -45634=>10539, -45635=>10540, -45636=>10541, -45637=>10542, -45638=>10543, -45639=>10544, -45640=>10545, -45641=>10546, -45642=>10547, -45643=>10548, -45644=>10549, -45645=>10550, -45646=>10551, -45647=>10552, -45648=>10553, -45649=>10554, -45650=>10555, -45651=>10556, -45652=>10557, -45653=>10558, -45654=>10559, -45655=>10560, -45657=>10561, -45658=>10562, -45659=>10563, -45661=>10564, -45662=>10565, -45663=>10566, -45665=>10567, -45666=>10568, -45667=>10569, -45668=>10570, -45669=>10571, -45670=>10572, -45671=>10573, -45674=>10574, -45675=>10575, -45676=>10576, -45677=>10577, -45678=>10578, -45679=>10579, -45680=>10580, -45681=>10581, -45682=>10582, -45683=>10583, -45686=>10584, -45687=>10585, -45688=>10586, -45689=>10587, -45690=>10588, -45691=>10589, -45693=>10590, -45694=>10591, -45695=>10592, -45696=>10593, -45697=>10594, -45698=>10595, -45699=>10596, -45702=>10597, -45703=>10598, -45704=>10599, -45706=>10600, -45707=>10601, -45708=>10602, -45709=>10603, -45710=>10604, -45711=>10605, -45714=>10606, -45715=>10607, -45717=>10608, -45718=>10609, -45719=>10610, -45723=>10611, -45724=>10612, -45725=>10613, -45726=>10614, -45727=>10615, -45730=>10616, -45732=>10617, -45735=>10618, -45736=>10619, -45737=>10620, -45739=>10621, -45741=>10622, -45742=>10623, -45743=>10624, -45745=>10625, -45746=>10626, -45747=>10627, -45749=>10628, -45750=>10629, -45751=>10630, -45752=>10631, -45753=>10632, -45754=>10633, -45755=>10634, -45756=>10635, -45757=>10636, -45758=>10637, -45759=>10638, -45760=>10639, -45761=>10640, -45762=>10641, -45763=>10642, -45764=>10643, -45765=>10644, -45766=>10645, -45767=>10646, -45770=>10647, -45771=>10648, -45773=>10649, -45774=>10650, -45775=>10651, -45777=>10652, -45779=>10653, -45780=>10654, -45781=>10655, -45782=>10656, -45783=>10657, -45786=>10658, -45788=>10659, -45790=>10660, -45791=>10661, -45792=>10662, -45793=>10663, -45795=>10664, -45799=>10665, -45801=>10666, -45802=>10667, -45808=>10668, -45809=>10669, -45810=>10670, -45814=>10671, -45820=>10672, -45821=>10673, -45822=>10674, -45826=>10675, -45827=>10676, -45829=>10677, -45830=>10678, -45831=>10679, -45833=>10680, -45834=>10681, -45835=>10682, -45836=>10683, -45837=>10684, -45838=>10685, -45839=>10686, -45842=>10687, -45846=>10688, -45847=>10689, -45848=>10690, -45849=>10691, -45850=>10692, -45851=>10693, -45853=>10694, -45854=>10695, -45855=>10696, -45856=>10697, -45857=>10698, -45858=>10699, -45859=>10700, -45860=>10701, -45861=>10702, -45862=>10703, -45863=>10704, -45864=>10705, -45865=>10706, -45866=>10707, -45867=>10708, -45868=>10709, -45869=>10710, -45870=>10711, -45871=>10712, -45872=>10713, -45873=>10714, -45874=>10715, -45875=>10716, -45876=>10717, -45877=>10718, -45878=>10719, -45879=>10720, -45880=>10721, -45881=>10722, -45882=>10723, -45883=>10724, -45884=>10725, -45885=>10726, -45886=>10727, -45887=>10728, -45888=>10729, -45889=>10730, -45890=>10731, -45891=>10732, -45892=>10733, -45893=>10734, -45894=>10735, -45895=>10736, -45896=>10737, -45897=>10738, -45898=>10739, -45899=>10740, -45900=>10741, -45901=>10742, -45902=>10743, -45903=>10744, -45904=>10745, -45905=>10746, -45906=>10747, -45907=>10748, -45911=>10749, -45913=>10750, -45914=>10751, -45917=>10752, -45920=>10753, -45921=>10754, -45922=>10755, -45923=>10756, -45926=>10757, -45928=>10758, -45930=>10759, -45932=>10760, -45933=>10761, -45935=>10762, -45938=>10763, -45939=>10764, -45941=>10765, -45942=>10766, -45943=>10767, -45945=>10768, -45946=>10769, -45947=>10770, -45948=>10771, -45949=>10772, -45950=>10773, -45951=>10774, -45954=>10775, -45958=>10776, -45959=>10777, -45960=>10778, -45961=>10779, -45962=>10780, -45963=>10781, -45965=>10782, -45966=>10783, -45967=>10784, -45969=>10785, -45970=>10786, -45971=>10787, -45973=>10788, -45974=>10789, -45975=>10790, -45976=>10791, -45977=>10792, -45978=>10793, -45979=>10794, -45980=>10795, -45981=>10796, -45982=>10797, -45983=>10798, -45986=>10799, -45987=>10800, -45988=>10801, -45989=>10802, -45990=>10803, -45991=>10804, -45993=>10805, -45994=>10806, -45995=>10807, -45997=>10808, -45998=>10809, -45999=>10810, -46000=>10811, -46001=>10812, -46002=>10813, -46003=>10814, -46004=>10815, -46005=>10816, -46006=>10817, -46007=>10818, -46008=>10819, -46009=>10820, -46010=>10821, -46011=>10822, -46012=>10823, -46013=>10824, -46014=>10825, -46015=>10826, -46016=>10827, -46017=>10828, -46018=>10829, -46019=>10830, -46022=>10831, -46023=>10832, -46025=>10833, -46026=>10834, -46029=>10835, -46031=>10836, -46033=>10837, -46034=>10838, -46035=>10839, -46038=>10840, -46040=>10841, -46042=>10842, -46044=>10843, -46046=>10844, -46047=>10845, -46049=>10846, -46050=>10847, -46051=>10848, -46053=>10849, -46054=>10850, -46055=>10851, -46057=>10852, -46058=>10853, -46059=>10854, -46060=>10855, -46061=>10856, -46062=>10857, -46063=>10858, -46064=>10859, -46065=>10860, -46066=>10861, -46067=>10862, -46068=>10863, -46069=>10864, -46070=>10865, -46071=>10866, -46072=>10867, -46073=>10868, -46074=>10869, -46075=>10870, -46077=>10871, -46078=>10872, -46079=>10873, -46080=>10874, -46081=>10875, -46082=>10876, -46083=>10877, -46084=>10878, -46085=>10879, -46086=>10880, -46087=>10881, -46088=>10882, -46089=>10883, -46090=>10884, -46091=>10885, -46092=>10886, -46093=>10887, -46094=>10888, -46095=>10889, -46097=>10890, -46098=>10891, -46099=>10892, -46100=>10893, -46101=>10894, -46102=>10895, -46103=>10896, -46105=>10897, -46106=>10898, -46107=>10899, -46109=>10900, -46110=>10901, -46111=>10902, -46113=>10903, -46114=>10904, -46115=>10905, -46116=>10906, -46117=>10907, -46118=>10908, -46119=>10909, -46122=>10910, -46124=>10911, -46125=>10912, -46126=>10913, -46127=>10914, -46128=>10915, -46129=>10916, -46130=>10917, -46131=>10918, -46133=>10919, -46134=>10920, -46135=>10921, -46136=>10922, -46137=>10923, -46138=>10924, -46139=>10925, -46140=>10926, -46141=>10927, -46142=>10928, -46143=>10929, -46144=>10930, -46145=>10931, -46146=>10932, -46147=>10933, -46148=>10934, -46149=>10935, -46150=>10936, -46151=>10937, -46152=>10938, -46153=>10939, -46154=>10940, -46155=>10941, -46156=>10942, -46157=>10943, -46158=>10944, -46159=>10945, -46162=>10946, -46163=>10947, -46165=>10948, -46166=>10949, -46167=>10950, -46169=>10951, -46170=>10952, -46171=>10953, -46172=>10954, -46173=>10955, -46174=>10956, -46175=>10957, -46178=>10958, -46180=>10959, -46182=>10960, -46183=>10961, -46184=>10962, -46185=>10963, -46186=>10964, -46187=>10965, -46189=>10966, -46190=>10967, -46191=>10968, -46192=>10969, -46193=>10970, -46194=>10971, -46195=>10972, -46196=>10973, -46197=>10974, -46198=>10975, -46199=>10976, -46200=>10977, -46201=>10978, -46202=>10979, -46203=>10980, -46204=>10981, -46205=>10982, -46206=>10983, -46207=>10984, -46209=>10985, -46210=>10986, -46211=>10987, -46212=>10988, -46213=>10989, -46214=>10990, -46215=>10991, -46217=>10992, -46218=>10993, -46219=>10994, -46220=>10995, -46221=>10996, -46222=>10997, -46223=>10998, -46224=>10999, -46225=>11000, -46226=>11001, -46227=>11002, -46228=>11003, -46229=>11004, -46230=>11005, -46231=>11006, -46232=>11007, -46233=>11008, -46234=>11009, -46235=>11010, -46236=>11011, -46238=>11012, -46239=>11013, -46240=>11014, -46241=>11015, -46242=>11016, -46243=>11017, -46245=>11018, -46246=>11019, -46247=>11020, -46249=>11021, -46250=>11022, -46251=>11023, -46253=>11024, -46254=>11025, -46255=>11026, -46256=>11027, -46257=>11028, -46258=>11029, -46259=>11030, -46260=>11031, -46262=>11032, -46264=>11033, -46266=>11034, -46267=>11035, -46268=>11036, -46269=>11037, -46270=>11038, -46271=>11039, -46273=>11040, -46274=>11041, -46275=>11042, -46277=>11043, -46278=>11044, -46279=>11045, -46281=>11046, -46282=>11047, -46283=>11048, -46284=>11049, -46285=>11050, -46286=>11051, -46287=>11052, -46289=>11053, -46290=>11054, -46291=>11055, -46292=>11056, -46294=>11057, -46295=>11058, -46296=>11059, -46297=>11060, -46298=>11061, -46299=>11062, -46302=>11063, -46303=>11064, -46305=>11065, -46306=>11066, -46309=>11067, -46311=>11068, -46312=>11069, -46313=>11070, -46314=>11071, -46315=>11072, -46318=>11073, -46320=>11074, -46322=>11075, -46323=>11076, -46324=>11077, -46325=>11078, -46326=>11079, -46327=>11080, -46329=>11081, -46330=>11082, -46331=>11083, -46332=>11084, -46333=>11085, -46334=>11086, -46335=>11087, -46336=>11088, -46337=>11089, -46338=>11090, -46339=>11091, -46340=>11092, -46341=>11093, -46342=>11094, -46343=>11095, -46344=>11096, -46345=>11097, -46346=>11098, -46347=>11099, -46348=>11100, -46349=>11101, -46350=>11102, -46351=>11103, -46352=>11104, -46353=>11105, -46354=>11106, -46355=>11107, -46358=>11108, -46359=>11109, -46361=>11110, -46362=>11111, -46365=>11112, -46366=>11113, -46367=>11114, -46368=>11115, -46369=>11116, -46370=>11117, -46371=>11118, -46374=>11119, -46379=>11120, -46380=>11121, -46381=>11122, -46382=>11123, -46383=>11124, -46386=>11125, -46387=>11126, -46389=>11127, -46390=>11128, -46391=>11129, -46393=>11130, -46394=>11131, -46395=>11132, -46396=>11133, -46397=>11134, -46398=>11135, -46399=>11136, -46402=>11137, -46406=>11138, -46407=>11139, -46408=>11140, -46409=>11141, -46410=>11142, -46414=>11143, -46415=>11144, -46417=>11145, -46418=>11146, -46419=>11147, -46421=>11148, -46422=>11149, -46423=>11150, -46424=>11151, -46425=>11152, -46426=>11153, -46427=>11154, -46430=>11155, -46434=>11156, -46435=>11157, -46436=>11158, -46437=>11159, -46438=>11160, -46439=>11161, -46440=>11162, -46441=>11163, -46442=>11164, -46443=>11165, -46444=>11166, -46445=>11167, -46446=>11168, -46447=>11169, -46448=>11170, -46449=>11171, -46450=>11172, -46451=>11173, -46452=>11174, -46453=>11175, -46454=>11176, -46455=>11177, -46456=>11178, -46457=>11179, -46458=>11180, -46459=>11181, -46460=>11182, -46461=>11183, -46462=>11184, -46463=>11185, -46464=>11186, -46465=>11187, -46466=>11188, -46467=>11189, -46468=>11190, -46469=>11191, -46470=>11192, -46471=>11193, -46472=>11194, -46473=>11195, -46474=>11196, -46475=>11197, -46476=>11198, -46477=>11199, -46478=>11200, -46479=>11201, -46480=>11202, -46481=>11203, -46482=>11204, -46483=>11205, -46484=>11206, -46485=>11207, -46486=>11208, -46487=>11209, -46488=>11210, -46489=>11211, -46490=>11212, -46491=>11213, -46492=>11214, -46493=>11215, -46494=>11216, -46495=>11217, -46498=>11218, -46499=>11219, -46501=>11220, -46502=>11221, -46503=>11222, -46505=>11223, -46508=>11224, -46509=>11225, -46510=>11226, -46511=>11227, -46514=>11228, -46518=>11229, -46519=>11230, -46520=>11231, -46521=>11232, -46522=>11233, -46526=>11234, -46527=>11235, -46529=>11236, -46530=>11237, -46531=>11238, -46533=>11239, -46534=>11240, -46535=>11241, -46536=>11242, -46537=>11243, -46538=>11244, -46539=>11245, -46542=>11246, -46546=>11247, -46547=>11248, -46548=>11249, -46549=>11250, -46550=>11251, -46551=>11252, -46553=>11253, -46554=>11254, -46555=>11255, -46556=>11256, -46557=>11257, -46558=>11258, -46559=>11259, -46560=>11260, -46561=>11261, -46562=>11262, -46563=>11263, -46564=>11264, -46565=>11265, -46566=>11266, -46567=>11267, -46568=>11268, -46569=>11269, -46570=>11270, -46571=>11271, -46573=>11272, -46574=>11273, -46575=>11274, -46576=>11275, -46577=>11276, -46578=>11277, -46579=>11278, -46580=>11279, -46581=>11280, -46582=>11281, -46583=>11282, -46584=>11283, -46585=>11284, -46586=>11285, -46587=>11286, -46588=>11287, -46589=>11288, -46590=>11289, -46591=>11290, -46592=>11291, -46593=>11292, -46594=>11293, -46595=>11294, -46596=>11295, -46597=>11296, -46598=>11297, -46599=>11298, -46600=>11299, -46601=>11300, -46602=>11301, -46603=>11302, -46604=>11303, -46605=>11304, -46606=>11305, -46607=>11306, -46610=>11307, -46611=>11308, -46613=>11309, -46614=>11310, -46615=>11311, -46617=>11312, -46618=>11313, -46619=>11314, -46620=>11315, -46621=>11316, -46622=>11317, -46623=>11318, -46624=>11319, -46625=>11320, -46626=>11321, -46627=>11322, -46628=>11323, -46630=>11324, -46631=>11325, -46632=>11326, -46633=>11327, -46634=>11328, -46635=>11329, -46637=>11330, -46638=>11331, -46639=>11332, -46640=>11333, -46641=>11334, -46642=>11335, -46643=>11336, -46645=>11337, -46646=>11338, -46647=>11339, -46648=>11340, -46649=>11341, -46650=>11342, -46651=>11343, -46652=>11344, -46653=>11345, -46654=>11346, -46655=>11347, -46656=>11348, -46657=>11349, -46658=>11350, -46659=>11351, -46660=>11352, -46661=>11353, -46662=>11354, -46663=>11355, -46665=>11356, -46666=>11357, -46667=>11358, -46668=>11359, -46669=>11360, -46670=>11361, -46671=>11362, -46672=>11363, -46673=>11364, -46674=>11365, -46675=>11366, -46676=>11367, -46677=>11368, -46678=>11369, -46679=>11370, -46680=>11371, -46681=>11372, -46682=>11373, -46683=>11374, -46684=>11375, -46685=>11376, -46686=>11377, -46687=>11378, -46688=>11379, -46689=>11380, -46690=>11381, -46691=>11382, -46693=>11383, -46694=>11384, -46695=>11385, -46697=>11386, -46698=>11387, -46699=>11388, -46700=>11389, -46701=>11390, -46702=>11391, -46703=>11392, -46704=>11393, -46705=>11394, -46706=>11395, -46707=>11396, -46708=>11397, -46709=>11398, -46710=>11399, -46711=>11400, -46712=>11401, -46713=>11402, -46714=>11403, -46715=>11404, -46716=>11405, -46717=>11406, -46718=>11407, -46719=>11408, -46720=>11409, -46721=>11410, -46722=>11411, -46723=>11412, -46724=>11413, -46725=>11414, -46726=>11415, -46727=>11416, -46728=>11417, -46729=>11418, -46730=>11419, -46731=>11420, -46732=>11421, -46733=>11422, -46734=>11423, -46735=>11424, -46736=>11425, -46737=>11426, -46738=>11427, -46739=>11428, -46740=>11429, -46741=>11430, -46742=>11431, -46743=>11432, -46744=>11433, -46745=>11434, -46746=>11435, -46747=>11436, -46750=>11437, -46751=>11438, -46753=>11439, -46754=>11440, -46755=>11441, -46757=>11442, -46758=>11443, -46759=>11444, -46760=>11445, -46761=>11446, -46762=>11447, -46765=>11448, -46766=>11449, -46767=>11450, -46768=>11451, -46770=>11452, -46771=>11453, -46772=>11454, -46773=>11455, -46774=>11456, -46775=>11457, -46776=>11458, -46777=>11459, -46778=>11460, -46779=>11461, -46780=>11462, -46781=>11463, -46782=>11464, -46783=>11465, -46784=>11466, -46785=>11467, -46786=>11468, -46787=>11469, -46788=>11470, -46789=>11471, -46790=>11472, -46791=>11473, -46792=>11474, -46793=>11475, -46794=>11476, -46795=>11477, -46796=>11478, -46797=>11479, -46798=>11480, -46799=>11481, -46800=>11482, -46801=>11483, -46802=>11484, -46803=>11485, -46805=>11486, -46806=>11487, -46807=>11488, -46808=>11489, -46809=>11490, -46810=>11491, -46811=>11492, -46812=>11493, -46813=>11494, -46814=>11495, -46815=>11496, -46816=>11497, -46817=>11498, -46818=>11499, -46819=>11500, -46820=>11501, -46821=>11502, -46822=>11503, -46823=>11504, -46824=>11505, -46825=>11506, -46826=>11507, -46827=>11508, -46828=>11509, -46829=>11510, -46830=>11511, -46831=>11512, -46833=>11513, -46834=>11514, -46835=>11515, -46837=>11516, -46838=>11517, -46839=>11518, -46841=>11519, -46842=>11520, -46843=>11521, -46844=>11522, -46845=>11523, -46846=>11524, -46847=>11525, -46850=>11526, -46851=>11527, -46852=>11528, -46854=>11529, -46855=>11530, -46856=>11531, -46857=>11532, -46858=>11533, -46859=>11534, -46860=>11535, -46861=>11536, -46862=>11537, -46863=>11538, -46864=>11539, -46865=>11540, -46866=>11541, -46867=>11542, -46868=>11543, -46869=>11544, -46870=>11545, -46871=>11546, -46872=>11547, -46873=>11548, -46874=>11549, -46875=>11550, -46876=>11551, -46877=>11552, -46878=>11553, -46879=>11554, -46880=>11555, -46881=>11556, -46882=>11557, -46883=>11558, -46884=>11559, -46885=>11560, -46886=>11561, -46887=>11562, -46890=>11563, -46891=>11564, -46893=>11565, -46894=>11566, -46897=>11567, -46898=>11568, -46899=>11569, -46900=>11570, -46901=>11571, -46902=>11572, -46903=>11573, -46906=>11574, -46908=>11575, -46909=>11576, -46910=>11577, -46911=>11578, -46912=>11579, -46913=>11580, -46914=>11581, -46915=>11582, -46917=>11583, -46918=>11584, -46919=>11585, -46921=>11586, -46922=>11587, -46923=>11588, -46925=>11589, -46926=>11590, -46927=>11591, -46928=>11592, -46929=>11593, -46930=>11594, -46931=>11595, -46934=>11596, -46935=>11597, -46936=>11598, -46937=>11599, -46938=>11600, -46939=>11601, -46940=>11602, -46941=>11603, -46942=>11604, -46943=>11605, -46945=>11606, -46946=>11607, -46947=>11608, -46949=>11609, -46950=>11610, -46951=>11611, -46953=>11612, -46954=>11613, -46955=>11614, -46956=>11615, -46957=>11616, -46958=>11617, -46959=>11618, -46962=>11619, -46964=>11620, -46966=>11621, -46967=>11622, -46968=>11623, -46969=>11624, -46970=>11625, -46971=>11626, -46974=>11627, -46975=>11628, -46977=>11629, -46978=>11630, -46979=>11631, -46981=>11632, -46982=>11633, -46983=>11634, -46984=>11635, -46985=>11636, -46986=>11637, -46987=>11638, -46990=>11639, -46995=>11640, -46996=>11641, -46997=>11642, -47002=>11643, -47003=>11644, -47005=>11645, -47006=>11646, -47007=>11647, -47009=>11648, -47010=>11649, -47011=>11650, -47012=>11651, -47013=>11652, -47014=>11653, -47015=>11654, -47018=>11655, -47022=>11656, -47023=>11657, -47024=>11658, -47025=>11659, -47026=>11660, -47027=>11661, -47030=>11662, -47031=>11663, -47033=>11664, -47034=>11665, -47035=>11666, -47036=>11667, -47037=>11668, -47038=>11669, -47039=>11670, -47040=>11671, -47041=>11672, -47042=>11673, -47043=>11674, -47044=>11675, -47045=>11676, -47046=>11677, -47048=>11678, -47050=>11679, -47051=>11680, -47052=>11681, -47053=>11682, -47054=>11683, -47055=>11684, -47056=>11685, -47057=>11686, -47058=>11687, -47059=>11688, -47060=>11689, -47061=>11690, -47062=>11691, -47063=>11692, -47064=>11693, -47065=>11694, -47066=>11695, -47067=>11696, -47068=>11697, -47069=>11698, -47070=>11699, -47071=>11700, -47072=>11701, -47073=>11702, -47074=>11703, -47075=>11704, -47076=>11705, -47077=>11706, -47078=>11707, -47079=>11708, -47080=>11709, -47081=>11710, -47082=>11711, -47083=>11712, -47086=>11713, -47087=>11714, -47089=>11715, -47090=>11716, -47091=>11717, -47093=>11718, -47094=>11719, -47095=>11720, -47096=>11721, -47097=>11722, -47098=>11723, -47099=>11724, -47102=>11725, -47106=>11726, -47107=>11727, -47108=>11728, -47109=>11729, -47110=>11730, -47114=>11731, -47115=>11732, -47117=>11733, -47118=>11734, -47119=>11735, -47121=>11736, -47122=>11737, -47123=>11738, -47124=>11739, -47125=>11740, -47126=>11741, -47127=>11742, -47130=>11743, -47132=>11744, -47134=>11745, -47135=>11746, -47136=>11747, -47137=>11748, -47138=>11749, -47139=>11750, -47142=>11751, -47143=>11752, -47145=>11753, -47146=>11754, -47147=>11755, -47149=>11756, -47150=>11757, -47151=>11758, -47152=>11759, -47153=>11760, -47154=>11761, -47155=>11762, -47158=>11763, -47162=>11764, -47163=>11765, -47164=>11766, -47165=>11767, -47166=>11768, -47167=>11769, -47169=>11770, -47170=>11771, -47171=>11772, -47173=>11773, -47174=>11774, -47175=>11775, -47176=>11776, -47177=>11777, -47178=>11778, -47179=>11779, -47180=>11780, -47181=>11781, -47182=>11782, -47183=>11783, -47184=>11784, -47186=>11785, -47188=>11786, -47189=>11787, -47190=>11788, -47191=>11789, -47192=>11790, -47193=>11791, -47194=>11792, -47195=>11793, -47198=>11794, -47199=>11795, -47201=>11796, -47202=>11797, -47203=>11798, -47205=>11799, -47206=>11800, -47207=>11801, -47208=>11802, -47209=>11803, -47210=>11804, -47211=>11805, -47214=>11806, -47216=>11807, -47218=>11808, -47219=>11809, -47220=>11810, -47221=>11811, -47222=>11812, -47223=>11813, -47225=>11814, -47226=>11815, -47227=>11816, -47229=>11817, -47230=>11818, -47231=>11819, -47232=>11820, -47233=>11821, -47234=>11822, -47235=>11823, -47236=>11824, -47237=>11825, -47238=>11826, -47239=>11827, -47240=>11828, -47241=>11829, -47242=>11830, -47243=>11831, -47244=>11832, -47246=>11833, -47247=>11834, -47248=>11835, -47249=>11836, -47250=>11837, -47251=>11838, -47252=>11839, -47253=>11840, -47254=>11841, -47255=>11842, -47256=>11843, -47257=>11844, -47258=>11845, -47259=>11846, -47260=>11847, -47261=>11848, -47262=>11849, -47263=>11850, -47264=>11851, -47265=>11852, -47266=>11853, -47267=>11854, -47268=>11855, -47269=>11856, -47270=>11857, -47271=>11858, -47273=>11859, -47274=>11860, -47275=>11861, -47276=>11862, -47277=>11863, -47278=>11864, -47279=>11865, -47281=>11866, -47282=>11867, -47283=>11868, -47285=>11869, -47286=>11870, -47287=>11871, -47289=>11872, -47290=>11873, -47291=>11874, -47292=>11875, -47293=>11876, -47294=>11877, -47295=>11878, -47298=>11879, -47300=>11880, -47302=>11881, -47303=>11882, -47304=>11883, -47305=>11884, -47306=>11885, -47307=>11886, -47309=>11887, -47310=>11888, -47311=>11889, -47313=>11890, -47314=>11891, -47315=>11892, -47317=>11893, -47318=>11894, -47319=>11895, -47320=>11896, -47321=>11897, -47322=>11898, -47323=>11899, -47324=>11900, -47326=>11901, -47328=>11902, -47330=>11903, -47331=>11904, -47332=>11905, -47333=>11906, -47334=>11907, -47335=>11908, -47338=>11909, -47339=>11910, -47341=>11911, -47342=>11912, -47343=>11913, -47345=>11914, -47346=>11915, -47347=>11916, -47348=>11917, -47349=>11918, -47350=>11919, -47351=>11920, -47354=>11921, -47356=>11922, -47358=>11923, -47359=>11924, -47360=>11925, -47361=>11926, -47362=>11927, -47363=>11928, -47365=>11929, -47366=>11930, -47367=>11931, -47368=>11932, -47369=>11933, -47370=>11934, -47371=>11935, -47372=>11936, -47373=>11937, -47374=>11938, -47375=>11939, -47376=>11940, -47377=>11941, -47378=>11942, -47379=>11943, -47380=>11944, -47381=>11945, -47382=>11946, -47383=>11947, -47385=>11948, -47386=>11949, -47387=>11950, -47388=>11951, -47389=>11952, -47390=>11953, -47391=>11954, -47393=>11955, -47394=>11956, -47395=>11957, -47396=>11958, -47397=>11959, -47398=>11960, -47399=>11961, -47400=>11962, -47401=>11963, -47402=>11964, -47403=>11965, -47404=>11966, -47405=>11967, -47406=>11968, -47407=>11969, -47408=>11970, -47409=>11971, -47410=>11972, -47411=>11973, -47412=>11974, -47413=>11975, -47414=>11976, -47415=>11977, -47416=>11978, -47417=>11979, -47418=>11980, -47419=>11981, -47422=>11982, -47423=>11983, -47425=>11984, -47426=>11985, -47427=>11986, -47429=>11987, -47430=>11988, -47431=>11989, -47432=>11990, -47433=>11991, -47434=>11992, -47435=>11993, -47437=>11994, -47438=>11995, -47440=>11996, -47442=>11997, -47443=>11998, -47444=>11999, -47445=>12000, -47446=>12001, -47447=>12002, -47450=>12003, -47451=>12004, -47453=>12005, -47454=>12006, -47455=>12007, -47457=>12008, -47458=>12009, -47459=>12010, -47460=>12011, -47461=>12012, -47462=>12013, -47463=>12014, -47466=>12015, -47468=>12016, -47470=>12017, -47471=>12018, -47472=>12019, -47473=>12020, -47474=>12021, -47475=>12022, -47478=>12023, -47479=>12024, -47481=>12025, -47482=>12026, -47483=>12027, -47485=>12028, -47486=>12029, -47487=>12030, -47488=>12031, -47489=>12032, -47490=>12033, -47491=>12034, -47494=>12035, -47496=>12036, -47499=>12037, -47500=>12038, -47503=>12039, -47504=>12040, -47505=>12041, -47506=>12042, -47507=>12043, -47508=>12044, -47509=>12045, -47510=>12046, -47511=>12047, -47512=>12048, -47513=>12049, -47514=>12050, -47515=>12051, -47516=>12052, -47517=>12053, -47518=>12054, -47519=>12055, -47520=>12056, -47521=>12057, -47522=>12058, -47523=>12059, -47524=>12060, -47525=>12061, -47526=>12062, -47527=>12063, -47528=>12064, -47529=>12065, -47530=>12066, -47531=>12067, -47534=>12068, -47535=>12069, -47537=>12070, -47538=>12071, -47539=>12072, -47541=>12073, -47542=>12074, -47543=>12075, -47544=>12076, -47545=>12077, -47546=>12078, -47547=>12079, -47550=>12080, -47552=>12081, -47554=>12082, -47555=>12083, -47556=>12084, -47557=>12085, -47558=>12086, -47559=>12087, -47562=>12088, -47563=>12089, -47565=>12090, -47571=>12091, -47572=>12092, -47573=>12093, -47574=>12094, -47575=>12095, -47578=>12096, -47580=>12097, -47583=>12098, -47584=>12099, -47586=>12100, -47590=>12101, -47591=>12102, -47593=>12103, -47594=>12104, -47595=>12105, -47597=>12106, -47598=>12107, -47599=>12108, -47600=>12109, -47601=>12110, -47602=>12111, -47603=>12112, -47606=>12113, -47611=>12114, -47612=>12115, -47613=>12116, -47614=>12117, -47615=>12118, -47618=>12119, -47619=>12120, -47620=>12121, -47621=>12122, -47622=>12123, -47623=>12124, -47625=>12125, -47626=>12126, -47627=>12127, -47628=>12128, -47629=>12129, -47630=>12130, -47631=>12131, -47632=>12132, -47633=>12133, -47634=>12134, -47635=>12135, -47636=>12136, -47638=>12137, -47639=>12138, -47640=>12139, -47641=>12140, -47642=>12141, -47643=>12142, -47644=>12143, -47645=>12144, -47646=>12145, -47647=>12146, -47648=>12147, -47649=>12148, -47650=>12149, -47651=>12150, -47652=>12151, -47653=>12152, -47654=>12153, -47655=>12154, -47656=>12155, -47657=>12156, -47658=>12157, -47659=>12158, -47660=>12159, -47661=>12160, -47662=>12161, -47663=>12162, -47664=>12163, -47665=>12164, -47666=>12165, -47667=>12166, -47668=>12167, -47669=>12168, -47670=>12169, -47671=>12170, -47674=>12171, -47675=>12172, -47677=>12173, -47678=>12174, -47679=>12175, -47681=>12176, -47683=>12177, -47684=>12178, -47685=>12179, -47686=>12180, -47687=>12181, -47690=>12182, -47692=>12183, -47695=>12184, -47696=>12185, -47697=>12186, -47698=>12187, -47702=>12188, -47703=>12189, -47705=>12190, -47706=>12191, -47707=>12192, -47709=>12193, -47710=>12194, -47711=>12195, -47712=>12196, -47713=>12197, -47714=>12198, -47715=>12199, -47718=>12200, -47722=>12201, -47723=>12202, -47724=>12203, -47725=>12204, -47726=>12205, -47727=>12206, -47730=>12207, -47731=>12208, -47733=>12209, -47734=>12210, -47735=>12211, -47737=>12212, -47738=>12213, -47739=>12214, -47740=>12215, -47741=>12216, -47742=>12217, -47743=>12218, -47744=>12219, -47745=>12220, -47746=>12221, -47750=>12222, -47752=>12223, -47753=>12224, -47754=>12225, -47755=>12226, -47757=>12227, -47758=>12228, -47759=>12229, -47760=>12230, -47761=>12231, -47762=>12232, -47763=>12233, -47764=>12234, -47765=>12235, -47766=>12236, -47767=>12237, -47768=>12238, -47769=>12239, -47770=>12240, -47771=>12241, -47772=>12242, -47773=>12243, -47774=>12244, -47775=>12245, -47776=>12246, -47777=>12247, -47778=>12248, -47779=>12249, -47780=>12250, -47781=>12251, -47782=>12252, -47783=>12253, -47786=>12254, -47789=>12255, -47790=>12256, -47791=>12257, -47793=>12258, -47795=>12259, -47796=>12260, -47797=>12261, -47798=>12262, -47799=>12263, -47802=>12264, -47804=>12265, -47806=>12266, -47807=>12267, -47808=>12268, -47809=>12269, -47810=>12270, -47811=>12271, -47813=>12272, -47814=>12273, -47815=>12274, -47817=>12275, -47818=>12276, -47819=>12277, -47820=>12278, -47821=>12279, -47822=>12280, -47823=>12281, -47824=>12282, -47825=>12283, -47826=>12284, -47827=>12285, -47828=>12286, -47829=>12287, -47830=>12288, -47831=>12289, -47834=>12290, -47835=>12291, -47836=>12292, -47837=>12293, -47838=>12294, -47839=>12295, -47840=>12296, -47841=>12297, -47842=>12298, -47843=>12299, -47844=>12300, -47845=>12301, -47846=>12302, -47847=>12303, -47848=>12304, -47849=>12305, -47850=>12306, -47851=>12307, -47852=>12308, -47853=>12309, -47854=>12310, -47855=>12311, -47856=>12312, -47857=>12313, -47858=>12314, -47859=>12315, -47860=>12316, -47861=>12317, -47862=>12318, -47863=>12319, -47864=>12320, -47865=>12321, -47866=>12322, -47867=>12323, -47869=>12324, -47870=>12325, -47871=>12326, -47873=>12327, -47874=>12328, -47875=>12329, -47877=>12330, -47878=>12331, -47879=>12332, -47880=>12333, -47881=>12334, -47882=>12335, -47883=>12336, -47884=>12337, -47886=>12338, -47888=>12339, -47890=>12340, -47891=>12341, -47892=>12342, -47893=>12343, -47894=>12344, -47895=>12345, -47897=>12346, -47898=>12347, -47899=>12348, -47901=>12349, -47902=>12350, -47903=>12351, -47905=>12352, -47906=>12353, -47907=>12354, -47908=>12355, -47909=>12356, -47910=>12357, -47911=>12358, -47912=>12359, -47914=>12360, -47916=>12361, -47917=>12362, -47918=>12363, -47919=>12364, -47920=>12365, -47921=>12366, -47922=>12367, -47923=>12368, -47927=>12369, -47929=>12370, -47930=>12371, -47935=>12372, -47936=>12373, -47937=>12374, -47938=>12375, -47939=>12376, -47942=>12377, -47944=>12378, -47946=>12379, -47947=>12380, -47948=>12381, -47950=>12382, -47953=>12383, -47954=>12384, -47955=>12385, -47957=>12386, -47958=>12387, -47959=>12388, -47961=>12389, -47962=>12390, -47963=>12391, -47964=>12392, -47965=>12393, -47966=>12394, -47967=>12395, -47968=>12396, -47970=>12397, -47972=>12398, -47973=>12399, -47974=>12400, -47975=>12401, -47976=>12402, -47977=>12403, -47978=>12404, -47979=>12405, -47981=>12406, -47982=>12407, -47983=>12408, -47984=>12409, -47985=>12410, -47986=>12411, -47987=>12412, -47988=>12413, -47989=>12414, -47990=>12415, -47991=>12416, -47992=>12417, -47993=>12418, -47994=>12419, -47995=>12420, -47996=>12421, -47997=>12422, -47998=>12423, -47999=>12424, -48000=>12425, -48001=>12426, -48002=>12427, -48003=>12428, -48004=>12429, -48005=>12430, -48006=>12431, -48007=>12432, -48009=>12433, -48010=>12434, -48011=>12435, -48013=>12436, -48014=>12437, -48015=>12438, -48017=>12439, -48018=>12440, -48019=>12441, -48020=>12442, -48021=>12443, -48022=>12444, -48023=>12445, -48024=>12446, -48025=>12447, -48026=>12448, -48027=>12449, -48028=>12450, -48029=>12451, -48030=>12452, -48031=>12453, -48032=>12454, -48033=>12455, -48034=>12456, -48035=>12457, -48037=>12458, -48038=>12459, -48039=>12460, -48041=>12461, -48042=>12462, -48043=>12463, -48045=>12464, -48046=>12465, -48047=>12466, -48048=>12467, -48049=>12468, -48050=>12469, -48051=>12470, -48053=>12471, -48054=>12472, -48056=>12473, -48057=>12474, -48058=>12475, -48059=>12476, -48060=>12477, -48061=>12478, -48062=>12479, -48063=>12480, -48065=>12481, -48066=>12482, -48067=>12483, -48069=>12484, -48070=>12485, -48071=>12486, -48073=>12487, -48074=>12488, -48075=>12489, -48076=>12490, -48077=>12491, -48078=>12492, -48079=>12493, -48081=>12494, -48082=>12495, -48084=>12496, -48085=>12497, -48086=>12498, -48087=>12499, -48088=>12500, -48089=>12501, -48090=>12502, -48091=>12503, -48092=>12504, -48093=>12505, -48094=>12506, -48095=>12507, -48096=>12508, -48097=>12509, -48098=>12510, -48099=>12511, -48100=>12512, -48101=>12513, -48102=>12514, -48103=>12515, -48104=>12516, -48105=>12517, -48106=>12518, -48107=>12519, -48108=>12520, -48109=>12521, -48110=>12522, -48111=>12523, -48112=>12524, -48113=>12525, -48114=>12526, -48115=>12527, -48116=>12528, -48117=>12529, -48118=>12530, -48119=>12531, -48122=>12532, -48123=>12533, -48125=>12534, -48126=>12535, -48129=>12536, -48131=>12537, -48132=>12538, -48133=>12539, -48134=>12540, -48135=>12541, -48138=>12542, -48142=>12543, -48144=>12544, -48146=>12545, -48147=>12546, -48153=>12547, -48154=>12548, -48160=>12549, -48161=>12550, -48162=>12551, -48163=>12552, -48166=>12553, -48168=>12554, -48170=>12555, -48171=>12556, -48172=>12557, -48174=>12558, -48175=>12559, -48178=>12560, -48179=>12561, -48181=>12562, -48182=>12563, -48183=>12564, -48185=>12565, -48186=>12566, -48187=>12567, -48188=>12568, -48189=>12569, -48190=>12570, -48191=>12571, -48194=>12572, -48198=>12573, -48199=>12574, -48200=>12575, -48202=>12576, -48203=>12577, -48206=>12578, -48207=>12579, -48209=>12580, -48210=>12581, -48211=>12582, -48212=>12583, -48213=>12584, -48214=>12585, -48215=>12586, -48216=>12587, -48217=>12588, -48218=>12589, -48219=>12590, -48220=>12591, -48222=>12592, -48223=>12593, -48224=>12594, -48225=>12595, -48226=>12596, -48227=>12597, -48228=>12598, -48229=>12599, -48230=>12600, -48231=>12601, -48232=>12602, -48233=>12603, -48234=>12604, -48235=>12605, -48236=>12606, -48237=>12607, -48238=>12608, -48239=>12609, -48240=>12610, -48241=>12611, -48242=>12612, -48243=>12613, -48244=>12614, -48245=>12615, -48246=>12616, -48247=>12617, -48248=>12618, -48249=>12619, -48250=>12620, -48251=>12621, -48252=>12622, -48253=>12623, -48254=>12624, -48255=>12625, -48256=>12626, -48257=>12627, -48258=>12628, -48259=>12629, -48262=>12630, -48263=>12631, -48265=>12632, -48266=>12633, -48269=>12634, -48271=>12635, -48272=>12636, -48273=>12637, -48274=>12638, -48275=>12639, -48278=>12640, -48280=>12641, -48283=>12642, -48284=>12643, -48285=>12644, -48286=>12645, -48287=>12646, -48290=>12647, -48291=>12648, -48293=>12649, -48294=>12650, -48297=>12651, -48298=>12652, -48299=>12653, -48300=>12654, -48301=>12655, -48302=>12656, -48303=>12657, -48306=>12658, -48310=>12659, -48311=>12660, -48312=>12661, -48313=>12662, -48314=>12663, -48315=>12664, -48318=>12665, -48319=>12666, -48321=>12667, -48322=>12668, -48323=>12669, -48325=>12670, -48326=>12671, -48327=>12672, -48328=>12673, -48329=>12674, -48330=>12675, -48331=>12676, -48332=>12677, -48334=>12678, -48338=>12679, -48339=>12680, -48340=>12681, -48342=>12682, -48343=>12683, -48345=>12684, -48346=>12685, -48347=>12686, -48349=>12687, -48350=>12688, -48351=>12689, -48352=>12690, -48353=>12691, -48354=>12692, -48355=>12693, -48356=>12694, -48357=>12695, -48358=>12696, -48359=>12697, -48360=>12698, -48361=>12699, -48362=>12700, -48363=>12701, -48364=>12702, -48365=>12703, -48366=>12704, -48367=>12705, -48368=>12706, -48369=>12707, -48370=>12708, -48371=>12709, -48375=>12710, -48377=>12711, -48378=>12712, -48379=>12713, -48381=>12714, -48382=>12715, -48383=>12716, -48384=>12717, -48385=>12718, -48386=>12719, -48387=>12720, -48390=>12721, -48392=>12722, -48394=>12723, -48395=>12724, -48396=>12725, -48397=>12726, -48398=>12727, -48399=>12728, -48401=>12729, -48402=>12730, -48403=>12731, -48405=>12732, -48406=>12733, -48407=>12734, -48408=>12735, -48409=>12736, -48410=>12737, -48411=>12738, -48412=>12739, -48413=>12740, -48414=>12741, -48415=>12742, -48416=>12743, -48417=>12744, -48418=>12745, -48419=>12746, -48421=>12747, -48422=>12748, -48423=>12749, -48424=>12750, -48425=>12751, -48426=>12752, -48427=>12753, -48429=>12754, -48430=>12755, -48431=>12756, -48432=>12757, -48433=>12758, -48434=>12759, -48435=>12760, -48436=>12761, -48437=>12762, -48438=>12763, -48439=>12764, -48440=>12765, -48441=>12766, -48442=>12767, -48443=>12768, -48444=>12769, -48445=>12770, -48446=>12771, -48447=>12772, -48449=>12773, -48450=>12774, -48451=>12775, -48452=>12776, -48453=>12777, -48454=>12778, -48455=>12779, -48458=>12780, -48459=>12781, -48461=>12782, -48462=>12783, -48463=>12784, -48465=>12785, -48466=>12786, -48467=>12787, -48468=>12788, -48469=>12789, -48470=>12790, -48471=>12791, -48474=>12792, -48475=>12793, -48476=>12794, -48477=>12795, -48478=>12796, -48479=>12797, -48480=>12798, -48481=>12799, -48482=>12800, -48483=>12801, -48485=>12802, -48486=>12803, -48487=>12804, -48489=>12805, -48490=>12806, -48491=>12807, -48492=>12808, -48493=>12809, -48494=>12810, -48495=>12811, -48496=>12812, -48497=>12813, -48498=>12814, -48499=>12815, -48500=>12816, -48501=>12817, -48502=>12818, -48503=>12819, -48504=>12820, -48505=>12821, -48506=>12822, -48507=>12823, -48508=>12824, -48509=>12825, -48510=>12826, -48511=>12827, -48514=>12828, -48515=>12829, -48517=>12830, -48518=>12831, -48523=>12832, -48524=>12833, -48525=>12834, -48526=>12835, -48527=>12836, -48530=>12837, -48532=>12838, -48534=>12839, -48535=>12840, -48536=>12841, -48539=>12842, -48541=>12843, -48542=>12844, -48543=>12845, -48544=>12846, -48545=>12847, -48546=>12848, -48547=>12849, -48549=>12850, -48550=>12851, -48551=>12852, -48552=>12853, -48553=>12854, -48554=>12855, -48555=>12856, -48556=>12857, -48557=>12858, -48558=>12859, -48559=>12860, -48561=>12861, -48562=>12862, -48563=>12863, -48564=>12864, -48565=>12865, -48566=>12866, -48567=>12867, -48569=>12868, -48570=>12869, -48571=>12870, -48572=>12871, -48573=>12872, -48574=>12873, -48575=>12874, -48576=>12875, -48577=>12876, -48578=>12877, -48579=>12878, -48580=>12879, -48581=>12880, -48582=>12881, -48583=>12882, -48584=>12883, -48585=>12884, -48586=>12885, -48587=>12886, -48588=>12887, -48589=>12888, -48590=>12889, -48591=>12890, -48592=>12891, -48593=>12892, -48594=>12893, -48595=>12894, -48598=>12895, -48599=>12896, -48601=>12897, -48602=>12898, -48603=>12899, -48605=>12900, -48606=>12901, -48607=>12902, -48608=>12903, -48609=>12904, -48610=>12905, -48611=>12906, -48612=>12907, -48613=>12908, -48614=>12909, -48615=>12910, -48616=>12911, -48618=>12912, -48619=>12913, -48620=>12914, -48621=>12915, -48622=>12916, -48623=>12917, -48625=>12918, -48626=>12919, -48627=>12920, -48629=>12921, -48630=>12922, -48631=>12923, -48633=>12924, -48634=>12925, -48635=>12926, -48636=>12927, -48637=>12928, -48638=>12929, -48639=>12930, -48641=>12931, -48642=>12932, -48644=>12933, -48646=>12934, -48647=>12935, -48648=>12936, -48649=>12937, -48650=>12938, -48651=>12939, -48654=>12940, -48655=>12941, -48657=>12942, -48658=>12943, -48659=>12944, -48661=>12945, -48662=>12946, -48663=>12947, -48664=>12948, -48665=>12949, -48666=>12950, -48667=>12951, -48670=>12952, -48672=>12953, -48673=>12954, -48674=>12955, -48675=>12956, -48676=>12957, -48677=>12958, -48678=>12959, -48679=>12960, -48680=>12961, -48681=>12962, -48682=>12963, -48683=>12964, -48684=>12965, -48685=>12966, -48686=>12967, -48687=>12968, -48688=>12969, -48689=>12970, -48690=>12971, -48691=>12972, -48692=>12973, -48693=>12974, -48694=>12975, -48695=>12976, -48696=>12977, -48697=>12978, -48698=>12979, -48699=>12980, -48700=>12981, -48701=>12982, -48702=>12983, -48703=>12984, -48704=>12985, -48705=>12986, -48706=>12987, -48707=>12988, -48710=>12989, -48711=>12990, -48713=>12991, -48714=>12992, -48715=>12993, -48717=>12994, -48719=>12995, -48720=>12996, -48721=>12997, -48722=>12998, -48723=>12999, -48726=>13000, -48728=>13001, -48732=>13002, -48733=>13003, -48734=>13004, -48735=>13005, -48738=>13006, -48739=>13007, -48741=>13008, -48742=>13009, -48743=>13010, -48745=>13011, -48747=>13012, -48748=>13013, -48749=>13014, -48750=>13015, -48751=>13016, -48754=>13017, -48758=>13018, -48759=>13019, -48760=>13020, -48761=>13021, -48762=>13022, -48766=>13023, -48767=>13024, -48769=>13025, -48770=>13026, -48771=>13027, -48773=>13028, -48774=>13029, -48775=>13030, -48776=>13031, -48777=>13032, -48778=>13033, -48779=>13034, -48782=>13035, -48786=>13036, -48787=>13037, -48788=>13038, -48789=>13039, -48790=>13040, -48791=>13041, -48794=>13042, -48795=>13043, -48796=>13044, -48797=>13045, -48798=>13046, -48799=>13047, -48800=>13048, -48801=>13049, -48802=>13050, -48803=>13051, -48804=>13052, -48805=>13053, -48806=>13054, -48807=>13055, -48809=>13056, -48810=>13057, -48811=>13058, -48812=>13059, -48813=>13060, -48814=>13061, -48815=>13062, -48816=>13063, -48817=>13064, -48818=>13065, -48819=>13066, -48820=>13067, -48821=>13068, -48822=>13069, -48823=>13070, -48824=>13071, -48825=>13072, -48826=>13073, -48827=>13074, -48828=>13075, -48829=>13076, -48830=>13077, -48831=>13078, -48832=>13079, -48833=>13080, -48834=>13081, -48835=>13082, -48836=>13083, -48837=>13084, -48838=>13085, -48839=>13086, -48840=>13087, -48841=>13088, -48842=>13089, -48843=>13090, -48844=>13091, -48845=>13092, -48846=>13093, -48847=>13094, -48850=>13095, -48851=>13096, -48853=>13097, -48854=>13098, -48857=>13099, -48858=>13100, -48859=>13101, -48860=>13102, -48861=>13103, -48862=>13104, -48863=>13105, -48865=>13106, -48866=>13107, -48870=>13108, -48871=>13109, -48872=>13110, -48873=>13111, -48874=>13112, -48875=>13113, -48877=>13114, -48878=>13115, -48879=>13116, -48880=>13117, -48881=>13118, -48882=>13119, -48883=>13120, -48884=>13121, -48885=>13122, -48886=>13123, -48887=>13124, -48888=>13125, -48889=>13126, -48890=>13127, -48891=>13128, -48892=>13129, -48893=>13130, -48894=>13131, -48895=>13132, -48896=>13133, -48898=>13134, -48899=>13135, -48900=>13136, -48901=>13137, -48902=>13138, -48903=>13139, -48906=>13140, -48907=>13141, -48908=>13142, -48909=>13143, -48910=>13144, -48911=>13145, -48912=>13146, -48913=>13147, -48914=>13148, -48915=>13149, -48916=>13150, -48917=>13151, -48918=>13152, -48919=>13153, -48922=>13154, -48926=>13155, -48927=>13156, -48928=>13157, -48929=>13158, -48930=>13159, -48931=>13160, -48932=>13161, -48933=>13162, -48934=>13163, -48935=>13164, -48936=>13165, -48937=>13166, -48938=>13167, -48939=>13168, -48940=>13169, -48941=>13170, -48942=>13171, -48943=>13172, -48944=>13173, -48945=>13174, -48946=>13175, -48947=>13176, -48948=>13177, -48949=>13178, -48950=>13179, -48951=>13180, -48952=>13181, -48953=>13182, -48954=>13183, -48955=>13184, -48956=>13185, -48957=>13186, -48958=>13187, -48959=>13188, -48962=>13189, -48963=>13190, -48965=>13191, -48966=>13192, -48967=>13193, -48969=>13194, -48970=>13195, -48971=>13196, -48972=>13197, -48973=>13198, -48974=>13199, -48975=>13200, -48978=>13201, -48979=>13202, -48980=>13203, -48982=>13204, -48983=>13205, -48984=>13206, -48985=>13207, -48986=>13208, -48987=>13209, -48988=>13210, -48989=>13211, -48990=>13212, -48991=>13213, -48992=>13214, -48993=>13215, -48994=>13216, -48995=>13217, -48996=>13218, -48997=>13219, -48998=>13220, -48999=>13221, -49000=>13222, -49001=>13223, -49002=>13224, -49003=>13225, -49004=>13226, -49005=>13227, -49006=>13228, -49007=>13229, -49008=>13230, -49009=>13231, -49010=>13232, -49011=>13233, -49012=>13234, -49013=>13235, -49014=>13236, -49015=>13237, -49016=>13238, -49017=>13239, -49018=>13240, -49019=>13241, -49020=>13242, -49021=>13243, -49022=>13244, -49023=>13245, -49024=>13246, -49025=>13247, -49026=>13248, -49027=>13249, -49028=>13250, -49029=>13251, -49030=>13252, -49031=>13253, -49032=>13254, -49033=>13255, -49034=>13256, -49035=>13257, -49036=>13258, -49037=>13259, -49038=>13260, -49039=>13261, -49040=>13262, -49041=>13263, -49042=>13264, -49043=>13265, -49045=>13266, -49046=>13267, -49047=>13268, -49048=>13269, -49049=>13270, -49050=>13271, -49051=>13272, -49052=>13273, -49053=>13274, -49054=>13275, -49055=>13276, -49056=>13277, -49057=>13278, -49058=>13279, -49059=>13280, -49060=>13281, -49061=>13282, -49062=>13283, -49063=>13284, -49064=>13285, -49065=>13286, -49066=>13287, -49067=>13288, -49068=>13289, -49069=>13290, -49070=>13291, -49071=>13292, -49073=>13293, -49074=>13294, -49075=>13295, -49076=>13296, -49077=>13297, -49078=>13298, -49079=>13299, -49080=>13300, -49081=>13301, -49082=>13302, -49083=>13303, -49084=>13304, -49085=>13305, -49086=>13306, -49087=>13307, -49088=>13308, -49089=>13309, -49090=>13310, -49091=>13311, -49092=>13312, -49094=>13313, -49095=>13314, -49096=>13315, -49097=>13316, -49098=>13317, -49099=>13318, -49102=>13319, -49103=>13320, -49105=>13321, -49106=>13322, -49107=>13323, -49109=>13324, -49110=>13325, -49111=>13326, -49112=>13327, -49113=>13328, -49114=>13329, -49115=>13330, -49117=>13331, -49118=>13332, -49120=>13333, -49122=>13334, -49123=>13335, -49124=>13336, -49125=>13337, -49126=>13338, -49127=>13339, -49128=>13340, -49129=>13341, -49130=>13342, -49131=>13343, -49132=>13344, -49133=>13345, -49134=>13346, -49135=>13347, -49136=>13348, -49137=>13349, -49138=>13350, -49139=>13351, -49140=>13352, -49141=>13353, -49142=>13354, -49143=>13355, -49144=>13356, -49145=>13357, -49146=>13358, -49147=>13359, -49148=>13360, -49149=>13361, -49150=>13362, -49151=>13363, -49152=>13364, -49153=>13365, -49154=>13366, -49155=>13367, -49156=>13368, -49157=>13369, -49158=>13370, -49159=>13371, -49160=>13372, -49161=>13373, -49162=>13374, -49163=>13375, -49164=>13376, -49165=>13377, -49166=>13378, -49167=>13379, -49168=>13380, -49169=>13381, -49170=>13382, -49171=>13383, -49172=>13384, -49173=>13385, -49174=>13386, -49175=>13387, -49176=>13388, -49177=>13389, -49178=>13390, -49179=>13391, -49180=>13392, -49181=>13393, -49182=>13394, -49183=>13395, -49184=>13396, -49185=>13397, -49186=>13398, -49187=>13399, -49188=>13400, -49189=>13401, -49190=>13402, -49191=>13403, -49192=>13404, -49193=>13405, -49194=>13406, -49195=>13407, -49196=>13408, -49197=>13409, -49198=>13410, -49199=>13411, -49200=>13412, -49201=>13413, -49202=>13414, -49203=>13415, -49204=>13416, -49205=>13417, -49206=>13418, -49207=>13419, -49208=>13420, -49209=>13421, -49210=>13422, -49211=>13423, -49213=>13424, -49214=>13425, -49215=>13426, -49216=>13427, -49217=>13428, -49218=>13429, -49219=>13430, -49220=>13431, -49221=>13432, -49222=>13433, -49223=>13434, -49224=>13435, -49225=>13436, -49226=>13437, -49227=>13438, -49228=>13439, -49229=>13440, -49230=>13441, -49231=>13442, -49232=>13443, -49234=>13444, -49235=>13445, -49236=>13446, -49237=>13447, -49238=>13448, -49239=>13449, -49241=>13450, -49242=>13451, -49243=>13452, -49245=>13453, -49246=>13454, -49247=>13455, -49249=>13456, -49250=>13457, -49251=>13458, -49252=>13459, -49253=>13460, -49254=>13461, -49255=>13462, -49258=>13463, -49259=>13464, -49260=>13465, -49261=>13466, -49262=>13467, -49263=>13468, -49264=>13469, -49265=>13470, -49266=>13471, -49267=>13472, -49268=>13473, -49269=>13474, -49270=>13475, -49271=>13476, -49272=>13477, -49273=>13478, -49274=>13479, -49275=>13480, -49276=>13481, -49277=>13482, -49278=>13483, -49279=>13484, -49280=>13485, -49281=>13486, -49282=>13487, -49283=>13488, -49284=>13489, -49285=>13490, -49286=>13491, -49287=>13492, -49288=>13493, -49289=>13494, -49290=>13495, -49291=>13496, -49292=>13497, -49293=>13498, -49294=>13499, -49295=>13500, -49298=>13501, -49299=>13502, -49301=>13503, -49302=>13504, -49303=>13505, -49305=>13506, -49306=>13507, -49307=>13508, -49308=>13509, -49309=>13510, -49310=>13511, -49311=>13512, -49314=>13513, -49316=>13514, -49318=>13515, -49319=>13516, -49320=>13517, -49321=>13518, -49322=>13519, -49323=>13520, -49326=>13521, -49329=>13522, -49330=>13523, -49335=>13524, -49336=>13525, -49337=>13526, -49338=>13527, -49339=>13528, -49342=>13529, -49346=>13530, -49347=>13531, -49348=>13532, -49350=>13533, -49351=>13534, -49354=>13535, -49355=>13536, -49357=>13537, -49358=>13538, -49359=>13539, -49361=>13540, -49362=>13541, -49363=>13542, -49364=>13543, -49365=>13544, -49366=>13545, -49367=>13546, -49370=>13547, -49374=>13548, -49375=>13549, -49376=>13550, -49377=>13551, -49378=>13552, -49379=>13553, -49382=>13554, -49383=>13555, -49385=>13556, -49386=>13557, -49387=>13558, -49389=>13559, -49390=>13560, -49391=>13561, -49392=>13562, -49393=>13563, -49394=>13564, -49395=>13565, -49398=>13566, -49400=>13567, -49402=>13568, -49403=>13569, -49404=>13570, -49405=>13571, -49406=>13572, -49407=>13573, -49409=>13574, -49410=>13575, -49411=>13576, -49413=>13577, -49414=>13578, -49415=>13579, -49417=>13580, -49418=>13581, -49419=>13582, -49420=>13583, -49421=>13584, -49422=>13585, -49423=>13586, -49425=>13587, -49426=>13588, -49427=>13589, -49428=>13590, -49430=>13591, -49431=>13592, -49432=>13593, -49433=>13594, -49434=>13595, -49435=>13596, -49441=>13597, -49442=>13598, -49445=>13599, -49448=>13600, -49449=>13601, -49450=>13602, -49451=>13603, -49454=>13604, -49458=>13605, -49459=>13606, -49460=>13607, -49461=>13608, -49463=>13609, -49466=>13610, -49467=>13611, -49469=>13612, -49470=>13613, -49471=>13614, -49473=>13615, -49474=>13616, -49475=>13617, -49476=>13618, -49477=>13619, -49478=>13620, -49479=>13621, -49482=>13622, -49486=>13623, -49487=>13624, -49488=>13625, -49489=>13626, -49490=>13627, -49491=>13628, -49494=>13629, -49495=>13630, -49497=>13631, -49498=>13632, -49499=>13633, -49501=>13634, -49502=>13635, -49503=>13636, -49504=>13637, -49505=>13638, -49506=>13639, -49507=>13640, -49510=>13641, -49514=>13642, -49515=>13643, -49516=>13644, -49517=>13645, -49518=>13646, -49519=>13647, -49521=>13648, -49522=>13649, -49523=>13650, -49525=>13651, -49526=>13652, -49527=>13653, -49529=>13654, -49530=>13655, -49531=>13656, -49532=>13657, -49533=>13658, -49534=>13659, -49535=>13660, -49536=>13661, -49537=>13662, -49538=>13663, -49539=>13664, -49540=>13665, -49542=>13666, -49543=>13667, -49544=>13668, -49545=>13669, -49546=>13670, -49547=>13671, -49551=>13672, -49553=>13673, -49554=>13674, -49555=>13675, -49557=>13676, -49559=>13677, -49560=>13678, -49561=>13679, -49562=>13680, -49563=>13681, -49566=>13682, -49568=>13683, -49570=>13684, -49571=>13685, -49572=>13686, -49574=>13687, -49575=>13688, -49578=>13689, -49579=>13690, -49581=>13691, -49582=>13692, -49583=>13693, -49585=>13694, -49586=>13695, -49587=>13696, -49588=>13697, -49589=>13698, -49590=>13699, -49591=>13700, -49592=>13701, -49593=>13702, -49594=>13703, -49595=>13704, -49596=>13705, -49598=>13706, -49599=>13707, -49600=>13708, -49601=>13709, -49602=>13710, -49603=>13711, -49605=>13712, -49606=>13713, -49607=>13714, -49609=>13715, -49610=>13716, -49611=>13717, -49613=>13718, -49614=>13719, -49615=>13720, -49616=>13721, -49617=>13722, -49618=>13723, -49619=>13724, -49621=>13725, -49622=>13726, -49625=>13727, -49626=>13728, -49627=>13729, -49628=>13730, -49629=>13731, -49630=>13732, -49631=>13733, -49633=>13734, -49634=>13735, -49635=>13736, -49637=>13737, -49638=>13738, -49639=>13739, -49641=>13740, -49642=>13741, -49643=>13742, -49644=>13743, -49645=>13744, -49646=>13745, -49647=>13746, -49650=>13747, -49652=>13748, -49653=>13749, -49654=>13750, -49655=>13751, -49656=>13752, -49657=>13753, -49658=>13754, -49659=>13755, -49662=>13756, -49663=>13757, -49665=>13758, -49666=>13759, -49667=>13760, -49669=>13761, -49670=>13762, -49671=>13763, -49672=>13764, -49673=>13765, -49674=>13766, -49675=>13767, -49678=>13768, -49680=>13769, -49682=>13770, -49683=>13771, -49684=>13772, -49685=>13773, -49686=>13774, -49687=>13775, -49690=>13776, -49691=>13777, -49693=>13778, -49694=>13779, -49697=>13780, -49698=>13781, -49699=>13782, -49700=>13783, -49701=>13784, -49702=>13785, -49703=>13786, -49706=>13787, -49708=>13788, -49710=>13789, -49712=>13790, -49715=>13791, -49717=>13792, -49718=>13793, -49719=>13794, -49720=>13795, -49721=>13796, -49722=>13797, -49723=>13798, -49724=>13799, -49725=>13800, -49726=>13801, -49727=>13802, -49728=>13803, -49729=>13804, -49730=>13805, -49731=>13806, -49732=>13807, -49733=>13808, -49734=>13809, -49735=>13810, -49737=>13811, -49738=>13812, -49739=>13813, -49740=>13814, -49741=>13815, -49742=>13816, -49743=>13817, -49746=>13818, -49747=>13819, -49749=>13820, -49750=>13821, -49751=>13822, -49753=>13823, -49754=>13824, -49755=>13825, -49756=>13826, -49757=>13827, -49758=>13828, -49759=>13829, -49761=>13830, -49762=>13831, -49763=>13832, -49764=>13833, -49766=>13834, -49767=>13835, -49768=>13836, -49769=>13837, -49770=>13838, -49771=>13839, -49774=>13840, -49775=>13841, -49777=>13842, -49778=>13843, -49779=>13844, -49781=>13845, -49782=>13846, -49783=>13847, -49784=>13848, -49785=>13849, -49786=>13850, -49787=>13851, -49790=>13852, -49792=>13853, -49794=>13854, -49795=>13855, -49796=>13856, -49797=>13857, -49798=>13858, -49799=>13859, -49802=>13860, -49803=>13861, -49804=>13862, -49805=>13863, -49806=>13864, -49807=>13865, -49809=>13866, -49810=>13867, -49811=>13868, -49812=>13869, -49813=>13870, -49814=>13871, -49815=>13872, -49817=>13873, -49818=>13874, -49820=>13875, -49822=>13876, -49823=>13877, -49824=>13878, -49825=>13879, -49826=>13880, -49827=>13881, -49830=>13882, -49831=>13883, -49833=>13884, -49834=>13885, -49835=>13886, -49838=>13887, -49839=>13888, -49840=>13889, -49841=>13890, -49842=>13891, -49843=>13892, -49846=>13893, -49848=>13894, -49850=>13895, -49851=>13896, -49852=>13897, -49853=>13898, -49854=>13899, -49855=>13900, -49856=>13901, -49857=>13902, -49858=>13903, -49859=>13904, -49860=>13905, -49861=>13906, -49862=>13907, -49863=>13908, -49864=>13909, -49865=>13910, -49866=>13911, -49867=>13912, -49868=>13913, -49869=>13914, -49870=>13915, -49871=>13916, -49872=>13917, -49873=>13918, -49874=>13919, -49875=>13920, -49876=>13921, -49877=>13922, -49878=>13923, -49879=>13924, -49880=>13925, -49881=>13926, -49882=>13927, -49883=>13928, -49886=>13929, -49887=>13930, -49889=>13931, -49890=>13932, -49893=>13933, -49894=>13934, -49895=>13935, -49896=>13936, -49897=>13937, -49898=>13938, -49902=>13939, -49904=>13940, -49906=>13941, -49907=>13942, -49908=>13943, -49909=>13944, -49911=>13945, -49914=>13946, -49917=>13947, -49918=>13948, -49919=>13949, -49921=>13950, -49922=>13951, -49923=>13952, -49924=>13953, -49925=>13954, -49926=>13955, -49927=>13956, -49930=>13957, -49931=>13958, -49934=>13959, -49935=>13960, -49936=>13961, -49937=>13962, -49938=>13963, -49942=>13964, -49943=>13965, -49945=>13966, -49946=>13967, -49947=>13968, -49949=>13969, -49950=>13970, -49951=>13971, -49952=>13972, -49953=>13973, -49954=>13974, -49955=>13975, -49958=>13976, -49959=>13977, -49962=>13978, -49963=>13979, -49964=>13980, -49965=>13981, -49966=>13982, -49967=>13983, -49968=>13984, -49969=>13985, -49970=>13986, -49971=>13987, -49972=>13988, -49973=>13989, -49974=>13990, -49975=>13991, -49976=>13992, -49977=>13993, -49978=>13994, -49979=>13995, -49980=>13996, -49981=>13997, -49982=>13998, -49983=>13999, -49984=>14000, -49985=>14001, -49986=>14002, -49987=>14003, -49988=>14004, -49990=>14005, -49991=>14006, -49992=>14007, -49993=>14008, -49994=>14009, -49995=>14010, -49996=>14011, -49997=>14012, -49998=>14013, -49999=>14014, -50000=>14015, -50001=>14016, -50002=>14017, -50003=>14018, -50004=>14019, -50005=>14020, -50006=>14021, -50007=>14022, -50008=>14023, -50009=>14024, -50010=>14025, -50011=>14026, -50012=>14027, -50013=>14028, -50014=>14029, -50015=>14030, -50016=>14031, -50017=>14032, -50018=>14033, -50019=>14034, -50020=>14035, -50021=>14036, -50022=>14037, -50023=>14038, -50026=>14039, -50027=>14040, -50029=>14041, -50030=>14042, -50031=>14043, -50033=>14044, -50035=>14045, -50036=>14046, -50037=>14047, -50038=>14048, -50039=>14049, -50042=>14050, -50043=>14051, -50046=>14052, -50047=>14053, -50048=>14054, -50049=>14055, -50050=>14056, -50051=>14057, -50053=>14058, -50054=>14059, -50055=>14060, -50057=>14061, -50058=>14062, -50059=>14063, -50061=>14064, -50062=>14065, -50063=>14066, -50064=>14067, -50065=>14068, -50066=>14069, -50067=>14070, -50068=>14071, -50069=>14072, -50070=>14073, -50071=>14074, -50072=>14075, -50073=>14076, -50074=>14077, -50075=>14078, -50076=>14079, -50077=>14080, -50078=>14081, -50079=>14082, -50080=>14083, -50081=>14084, -50082=>14085, -50083=>14086, -50084=>14087, -50085=>14088, -50086=>14089, -50087=>14090, -50088=>14091, -50089=>14092, -50090=>14093, -50091=>14094, -50092=>14095, -50093=>14096, -50094=>14097, -50095=>14098, -50096=>14099, -50097=>14100, -50098=>14101, -50099=>14102, -50100=>14103, -50101=>14104, -50102=>14105, -50103=>14106, -50104=>14107, -50105=>14108, -50106=>14109, -50107=>14110, -50108=>14111, -50109=>14112, -50110=>14113, -50111=>14114, -50113=>14115, -50114=>14116, -50115=>14117, -50116=>14118, -50117=>14119, -50118=>14120, -50119=>14121, -50120=>14122, -50121=>14123, -50122=>14124, -50123=>14125, -50124=>14126, -50125=>14127, -50126=>14128, -50127=>14129, -50128=>14130, -50129=>14131, -50130=>14132, -50131=>14133, -50132=>14134, -50133=>14135, -50134=>14136, -50135=>14137, -50138=>14138, -50139=>14139, -50141=>14140, -50142=>14141, -50145=>14142, -50147=>14143, -50148=>14144, -50149=>14145, -50150=>14146, -50151=>14147, -50154=>14148, -50155=>14149, -50156=>14150, -50158=>14151, -50159=>14152, -50160=>14153, -50161=>14154, -50162=>14155, -50163=>14156, -50166=>14157, -50167=>14158, -50169=>14159, -50170=>14160, -50171=>14161, -50172=>14162, -50173=>14163, -50174=>14164, -50175=>14165, -50176=>14166, -50177=>14167, -50178=>14168, -50179=>14169, -50180=>14170, -50181=>14171, -50182=>14172, -50183=>14173, -50185=>14174, -50186=>14175, -50187=>14176, -50188=>14177, -50189=>14178, -50190=>14179, -50191=>14180, -50193=>14181, -50194=>14182, -50195=>14183, -50196=>14184, -50197=>14185, -50198=>14186, -50199=>14187, -50200=>14188, -50201=>14189, -50202=>14190, -50203=>14191, -50204=>14192, -50205=>14193, -50206=>14194, -50207=>14195, -50208=>14196, -50209=>14197, -50210=>14198, -50211=>14199, -50213=>14200, -50214=>14201, -50215=>14202, -50216=>14203, -50217=>14204, -50218=>14205, -50219=>14206, -50221=>14207, -50222=>14208, -50223=>14209, -50225=>14210, -50226=>14211, -50227=>14212, -50229=>14213, -50230=>14214, -50231=>14215, -50232=>14216, -50233=>14217, -50234=>14218, -50235=>14219, -50238=>14220, -50239=>14221, -50240=>14222, -50241=>14223, -50242=>14224, -50243=>14225, -50244=>14226, -50245=>14227, -50246=>14228, -50247=>14229, -50249=>14230, -50250=>14231, -50251=>14232, -50252=>14233, -50253=>14234, -50254=>14235, -50255=>14236, -50256=>14237, -50257=>14238, -50258=>14239, -50259=>14240, -50260=>14241, -50261=>14242, -50262=>14243, -50263=>14244, -50264=>14245, -50265=>14246, -50266=>14247, -50267=>14248, -50268=>14249, -50269=>14250, -50270=>14251, -50271=>14252, -50272=>14253, -50273=>14254, -50274=>14255, -50275=>14256, -50278=>14257, -50279=>14258, -50281=>14259, -50282=>14260, -50283=>14261, -50285=>14262, -50286=>14263, -50287=>14264, -50288=>14265, -50289=>14266, -50290=>14267, -50291=>14268, -50294=>14269, -50295=>14270, -50296=>14271, -50298=>14272, -50299=>14273, -50300=>14274, -50301=>14275, -50302=>14276, -50303=>14277, -50305=>14278, -50306=>14279, -50307=>14280, -50308=>14281, -50309=>14282, -50310=>14283, -50311=>14284, -50312=>14285, -50313=>14286, -50314=>14287, -50315=>14288, -50316=>14289, -50317=>14290, -50318=>14291, -50319=>14292, -50320=>14293, -50321=>14294, -50322=>14295, -50323=>14296, -50325=>14297, -50326=>14298, -50327=>14299, -50328=>14300, -50329=>14301, -50330=>14302, -50331=>14303, -50333=>14304, -50334=>14305, -50335=>14306, -50336=>14307, -50337=>14308, -50338=>14309, -50339=>14310, -50340=>14311, -50341=>14312, -50342=>14313, -50343=>14314, -50344=>14315, -50345=>14316, -50346=>14317, -50347=>14318, -50348=>14319, -50349=>14320, -50350=>14321, -50351=>14322, -50352=>14323, -50353=>14324, -50354=>14325, -50355=>14326, -50356=>14327, -50357=>14328, -50358=>14329, -50359=>14330, -50361=>14331, -50362=>14332, -50363=>14333, -50365=>14334, -50366=>14335, -50367=>14336, -50368=>14337, -50369=>14338, -50370=>14339, -50371=>14340, -50372=>14341, -50373=>14342, -50374=>14343, -50375=>14344, -50376=>14345, -50377=>14346, -50378=>14347, -50379=>14348, -50380=>14349, -50381=>14350, -50382=>14351, -50383=>14352, -50384=>14353, -50385=>14354, -50386=>14355, -50387=>14356, -50388=>14357, -50389=>14358, -50390=>14359, -50391=>14360, -50392=>14361, -50393=>14362, -50394=>14363, -50395=>14364, -50396=>14365, -50397=>14366, -50398=>14367, -50399=>14368, -50400=>14369, -50401=>14370, -50402=>14371, -50403=>14372, -50404=>14373, -50405=>14374, -50406=>14375, -50407=>14376, -50408=>14377, -50410=>14378, -50411=>14379, -50412=>14380, -50413=>14381, -50414=>14382, -50415=>14383, -50418=>14384, -50419=>14385, -50421=>14386, -50422=>14387, -50423=>14388, -50425=>14389, -50427=>14390, -50428=>14391, -50429=>14392, -50430=>14393, -50434=>14394, -50435=>14395, -50436=>14396, -50437=>14397, -50438=>14398, -50439=>14399, -50440=>14400, -50441=>14401, -50442=>14402, -50443=>14403, -50445=>14404, -50446=>14405, -50447=>14406, -50449=>14407, -50450=>14408, -50451=>14409, -50453=>14410, -50454=>14411, -50455=>14412, -50456=>14413, -50457=>14414, -50458=>14415, -50459=>14416, -50461=>14417, -50462=>14418, -50463=>14419, -50464=>14420, -50465=>14421, -50466=>14422, -50467=>14423, -50468=>14424, -50469=>14425, -50470=>14426, -50471=>14427, -50474=>14428, -50475=>14429, -50477=>14430, -50478=>14431, -50479=>14432, -50481=>14433, -50482=>14434, -50483=>14435, -50484=>14436, -50485=>14437, -50486=>14438, -50487=>14439, -50490=>14440, -50492=>14441, -50494=>14442, -50495=>14443, -50496=>14444, -50497=>14445, -50498=>14446, -50499=>14447, -50502=>14448, -50503=>14449, -50507=>14450, -50511=>14451, -50512=>14452, -50513=>14453, -50514=>14454, -50518=>14455, -50522=>14456, -50523=>14457, -50524=>14458, -50527=>14459, -50530=>14460, -50531=>14461, -50533=>14462, -50534=>14463, -50535=>14464, -50537=>14465, -50538=>14466, -50539=>14467, -50540=>14468, -50541=>14469, -50542=>14470, -50543=>14471, -50546=>14472, -50550=>14473, -50551=>14474, -50552=>14475, -50553=>14476, -50554=>14477, -50555=>14478, -50558=>14479, -50559=>14480, -50561=>14481, -50562=>14482, -50563=>14483, -50565=>14484, -50566=>14485, -50568=>14486, -50569=>14487, -50570=>14488, -50571=>14489, -50574=>14490, -50576=>14491, -50578=>14492, -50579=>14493, -50580=>14494, -50582=>14495, -50585=>14496, -50586=>14497, -50587=>14498, -50589=>14499, -50590=>14500, -50591=>14501, -50593=>14502, -50594=>14503, -50595=>14504, -50596=>14505, -50597=>14506, -50598=>14507, -50599=>14508, -50600=>14509, -50602=>14510, -50603=>14511, -50604=>14512, -50605=>14513, -50606=>14514, -50607=>14515, -50608=>14516, -50609=>14517, -50610=>14518, -50611=>14519, -50614=>14520, -50615=>14521, -50618=>14522, -50623=>14523, -50624=>14524, -50625=>14525, -50626=>14526, -50627=>14527, -50635=>14528, -50637=>14529, -50639=>14530, -50642=>14531, -50643=>14532, -50645=>14533, -50646=>14534, -50647=>14535, -50649=>14536, -50650=>14537, -50651=>14538, -50652=>14539, -50653=>14540, -50654=>14541, -50655=>14542, -50658=>14543, -50660=>14544, -50662=>14545, -50663=>14546, -50664=>14547, -50665=>14548, -50666=>14549, -50667=>14550, -50671=>14551, -50673=>14552, -50674=>14553, -50675=>14554, -50677=>14555, -50680=>14556, -50681=>14557, -50682=>14558, -50683=>14559, -50690=>14560, -50691=>14561, -50692=>14562, -50697=>14563, -50698=>14564, -50699=>14565, -50701=>14566, -50702=>14567, -50703=>14568, -50705=>14569, -50706=>14570, -50707=>14571, -50708=>14572, -50709=>14573, -50710=>14574, -50711=>14575, -50714=>14576, -50717=>14577, -50718=>14578, -50719=>14579, -50720=>14580, -50721=>14581, -50722=>14582, -50723=>14583, -50726=>14584, -50727=>14585, -50729=>14586, -50730=>14587, -50731=>14588, -50735=>14589, -50737=>14590, -50738=>14591, -50742=>14592, -50744=>14593, -50746=>14594, -50748=>14595, -50749=>14596, -50750=>14597, -50751=>14598, -50754=>14599, -50755=>14600, -50757=>14601, -50758=>14602, -50759=>14603, -50761=>14604, -50762=>14605, -50763=>14606, -50764=>14607, -50765=>14608, -50766=>14609, -50767=>14610, -50770=>14611, -50774=>14612, -50775=>14613, -50776=>14614, -50777=>14615, -50778=>14616, -50779=>14617, -50782=>14618, -50783=>14619, -50785=>14620, -50786=>14621, -50787=>14622, -50788=>14623, -50789=>14624, -50790=>14625, -50791=>14626, -50792=>14627, -50793=>14628, -50794=>14629, -50795=>14630, -50797=>14631, -50798=>14632, -50800=>14633, -50802=>14634, -50803=>14635, -50804=>14636, -50805=>14637, -50806=>14638, -50807=>14639, -50810=>14640, -50811=>14641, -50813=>14642, -50814=>14643, -50815=>14644, -50817=>14645, -50818=>14646, -50819=>14647, -50820=>14648, -50821=>14649, -50822=>14650, -50823=>14651, -50826=>14652, -50828=>14653, -50830=>14654, -50831=>14655, -50832=>14656, -50833=>14657, -50834=>14658, -50835=>14659, -50838=>14660, -50839=>14661, -50841=>14662, -50842=>14663, -50843=>14664, -50845=>14665, -50846=>14666, -50847=>14667, -50848=>14668, -50849=>14669, -50850=>14670, -50851=>14671, -50854=>14672, -50856=>14673, -50858=>14674, -50859=>14675, -50860=>14676, -50861=>14677, -50862=>14678, -50863=>14679, -50866=>14680, -50867=>14681, -50869=>14682, -50870=>14683, -50871=>14684, -50875=>14685, -50876=>14686, -50877=>14687, -50878=>14688, -50879=>14689, -50882=>14690, -50884=>14691, -50886=>14692, -50887=>14693, -50888=>14694, -50889=>14695, -50890=>14696, -50891=>14697, -50894=>14698, -50895=>14699, -50897=>14700, -50898=>14701, -50899=>14702, -50901=>14703, -50902=>14704, -50903=>14705, -50904=>14706, -50905=>14707, -50906=>14708, -50907=>14709, -50910=>14710, -50911=>14711, -50914=>14712, -50915=>14713, -50916=>14714, -50917=>14715, -50918=>14716, -50919=>14717, -50922=>14718, -50923=>14719, -50925=>14720, -50926=>14721, -50927=>14722, -50929=>14723, -50930=>14724, -50931=>14725, -50932=>14726, -50933=>14727, -50934=>14728, -50935=>14729, -50938=>14730, -50939=>14731, -50940=>14732, -50942=>14733, -50943=>14734, -50944=>14735, -50945=>14736, -50946=>14737, -50947=>14738, -50950=>14739, -50951=>14740, -50953=>14741, -50954=>14742, -50955=>14743, -50957=>14744, -50958=>14745, -50959=>14746, -50960=>14747, -50961=>14748, -50962=>14749, -50963=>14750, -50966=>14751, -50968=>14752, -50970=>14753, -50971=>14754, -50972=>14755, -50973=>14756, -50974=>14757, -50975=>14758, -50978=>14759, -50979=>14760, -50981=>14761, -50982=>14762, -50983=>14763, -50985=>14764, -50986=>14765, -50987=>14766, -50988=>14767, -50989=>14768, -50990=>14769, -50991=>14770, -50994=>14771, -50996=>14772, -50998=>14773, -51000=>14774, -51001=>14775, -51002=>14776, -51003=>14777, -51006=>14778, -51007=>14779, -51009=>14780, -51010=>14781, -51011=>14782, -51013=>14783, -51014=>14784, -51015=>14785, -51016=>14786, -51017=>14787, -51019=>14788, -51022=>14789, -51024=>14790, -51033=>14791, -51034=>14792, -51035=>14793, -51037=>14794, -51038=>14795, -51039=>14796, -51041=>14797, -51042=>14798, -51043=>14799, -51044=>14800, -51045=>14801, -51046=>14802, -51047=>14803, -51049=>14804, -51050=>14805, -51052=>14806, -51053=>14807, -51054=>14808, -51055=>14809, -51056=>14810, -51057=>14811, -51058=>14812, -51059=>14813, -51062=>14814, -51063=>14815, -51065=>14816, -51066=>14817, -51067=>14818, -51071=>14819, -51072=>14820, -51073=>14821, -51074=>14822, -51078=>14823, -51083=>14824, -51084=>14825, -51085=>14826, -51087=>14827, -51090=>14828, -51091=>14829, -51093=>14830, -51097=>14831, -51099=>14832, -51100=>14833, -51101=>14834, -51102=>14835, -51103=>14836, -51106=>14837, -51111=>14838, -51112=>14839, -51113=>14840, -51114=>14841, -51115=>14842, -51118=>14843, -51119=>14844, -51121=>14845, -51122=>14846, -51123=>14847, -51125=>14848, -51126=>14849, -51127=>14850, -51128=>14851, -51129=>14852, -51130=>14853, -51131=>14854, -51134=>14855, -51138=>14856, -51139=>14857, -51140=>14858, -51141=>14859, -51142=>14860, -51143=>14861, -51146=>14862, -51147=>14863, -51149=>14864, -51151=>14865, -51153=>14866, -51154=>14867, -51155=>14868, -51156=>14869, -51157=>14870, -51158=>14871, -51159=>14872, -51161=>14873, -51162=>14874, -51163=>14875, -51164=>14876, -51166=>14877, -51167=>14878, -51168=>14879, -51169=>14880, -51170=>14881, -51171=>14882, -51173=>14883, -51174=>14884, -51175=>14885, -51177=>14886, -51178=>14887, -51179=>14888, -51181=>14889, -51182=>14890, -51183=>14891, -51184=>14892, -51185=>14893, -51186=>14894, -51187=>14895, -51188=>14896, -51189=>14897, -51190=>14898, -51191=>14899, -51192=>14900, -51193=>14901, -51194=>14902, -51195=>14903, -51196=>14904, -51197=>14905, -51198=>14906, -51199=>14907, -51202=>14908, -51203=>14909, -51205=>14910, -51206=>14911, -51207=>14912, -51209=>14913, -51211=>14914, -51212=>14915, -51213=>14916, -51214=>14917, -51215=>14918, -51218=>14919, -51220=>14920, -51223=>14921, -51224=>14922, -51225=>14923, -51226=>14924, -51227=>14925, -51230=>14926, -51231=>14927, -51233=>14928, -51234=>14929, -51235=>14930, -51237=>14931, -51238=>14932, -51239=>14933, -51240=>14934, -51241=>14935, -51242=>14936, -51243=>14937, -51246=>14938, -51248=>14939, -51250=>14940, -51251=>14941, -51252=>14942, -51253=>14943, -51254=>14944, -51255=>14945, -51257=>14946, -51258=>14947, -51259=>14948, -51261=>14949, -51262=>14950, -51263=>14951, -51265=>14952, -51266=>14953, -51267=>14954, -51268=>14955, -51269=>14956, -51270=>14957, -51271=>14958, -51274=>14959, -51275=>14960, -51278=>14961, -51279=>14962, -51280=>14963, -51281=>14964, -51282=>14965, -51283=>14966, -51285=>14967, -51286=>14968, -51287=>14969, -51288=>14970, -51289=>14971, -51290=>14972, -51291=>14973, -51292=>14974, -51293=>14975, -51294=>14976, -51295=>14977, -51296=>14978, -51297=>14979, -51298=>14980, -51299=>14981, -51300=>14982, -51301=>14983, -51302=>14984, -51303=>14985, -51304=>14986, -51305=>14987, -51306=>14988, -51307=>14989, -51308=>14990, -51309=>14991, -51310=>14992, -51311=>14993, -51314=>14994, -51315=>14995, -51317=>14996, -51318=>14997, -51319=>14998, -51321=>14999, -51323=>15000, -51324=>15001, -51325=>15002, -51326=>15003, -51327=>15004, -51330=>15005, -51332=>15006, -51336=>15007, -51337=>15008, -51338=>15009, -51342=>15010, -51343=>15011, -51344=>15012, -51345=>15013, -51346=>15014, -51347=>15015, -51349=>15016, -51350=>15017, -51351=>15018, -51352=>15019, -51353=>15020, -51354=>15021, -51355=>15022, -51356=>15023, -51358=>15024, -51360=>15025, -51362=>15026, -51363=>15027, -51364=>15028, -51365=>15029, -51366=>15030, -51367=>15031, -51369=>15032, -51370=>15033, -51371=>15034, -51372=>15035, -51373=>15036, -51374=>15037, -51375=>15038, -51376=>15039, -51377=>15040, -51378=>15041, -51379=>15042, -51380=>15043, -51381=>15044, -51382=>15045, -51383=>15046, -51384=>15047, -51385=>15048, -51386=>15049, -51387=>15050, -51390=>15051, -51391=>15052, -51392=>15053, -51393=>15054, -51394=>15055, -51395=>15056, -51397=>15057, -51398=>15058, -51399=>15059, -51401=>15060, -51402=>15061, -51403=>15062, -51405=>15063, -51406=>15064, -51407=>15065, -51408=>15066, -51409=>15067, -51410=>15068, -51411=>15069, -51414=>15070, -51416=>15071, -51418=>15072, -51419=>15073, -51420=>15074, -51421=>15075, -51422=>15076, -51423=>15077, -51426=>15078, -51427=>15079, -51429=>15080, -51430=>15081, -51431=>15082, -51432=>15083, -51433=>15084, -51434=>15085, -51435=>15086, -51436=>15087, -51437=>15088, -51438=>15089, -51439=>15090, -51440=>15091, -51441=>15092, -51442=>15093, -51443=>15094, -51444=>15095, -51446=>15096, -51447=>15097, -51448=>15098, -51449=>15099, -51450=>15100, -51451=>15101, -51454=>15102, -51455=>15103, -51457=>15104, -51458=>15105, -51459=>15106, -51463=>15107, -51464=>15108, -51465=>15109, -51466=>15110, -51467=>15111, -51470=>15112, -51472=>15113, -51474=>15114, -51475=>15115, -51476=>15116, -51477=>15117, -51478=>15118, -51479=>15119, -51481=>15120, -51482=>15121, -51483=>15122, -51484=>15123, -51485=>15124, -51486=>15125, -51487=>15126, -51488=>15127, -51489=>15128, -51490=>15129, -51491=>15130, -51492=>15131, -51493=>15132, -51494=>15133, -51495=>15134, -51496=>15135, -51497=>15136, -51498=>15137, -51499=>15138, -51501=>15139, -51502=>15140, -51503=>15141, -51504=>15142, -51505=>15143, -51506=>15144, -51507=>15145, -51509=>15146, -51510=>15147, -51511=>15148, -51512=>15149, -51513=>15150, -51514=>15151, -51515=>15152, -51516=>15153, -51517=>15154, -51518=>15155, -51519=>15156, -51520=>15157, -51521=>15158, -51522=>15159, -51523=>15160, -51524=>15161, -51525=>15162, -51526=>15163, -51527=>15164, -51528=>15165, -51529=>15166, -51530=>15167, -51531=>15168, -51532=>15169, -51533=>15170, -51534=>15171, -51535=>15172, -51538=>15173, -51539=>15174, -51541=>15175, -51542=>15176, -51543=>15177, -51545=>15178, -51546=>15179, -51547=>15180, -51548=>15181, -51549=>15182, -51550=>15183, -51551=>15184, -51554=>15185, -51556=>15186, -51557=>15187, -51558=>15188, -51559=>15189, -51560=>15190, -51561=>15191, -51562=>15192, -51563=>15193, -51565=>15194, -51566=>15195, -51567=>15196, -51569=>15197, -51570=>15198, -51571=>15199, -51573=>15200, -51574=>15201, -51575=>15202, -51576=>15203, -51577=>15204, -51578=>15205, -51579=>15206, -51581=>15207, -51582=>15208, -51583=>15209, -51584=>15210, -51585=>15211, -51586=>15212, -51587=>15213, -51588=>15214, -51589=>15215, -51590=>15216, -51591=>15217, -51594=>15218, -51595=>15219, -51597=>15220, -51598=>15221, -51599=>15222, -51601=>15223, -51602=>15224, -51603=>15225, -51604=>15226, -51605=>15227, -51606=>15228, -51607=>15229, -51610=>15230, -51612=>15231, -51614=>15232, -51615=>15233, -51616=>15234, -51617=>15235, -51618=>15236, -51619=>15237, -51620=>15238, -51621=>15239, -51622=>15240, -51623=>15241, -51624=>15242, -51625=>15243, -51626=>15244, -51627=>15245, -51628=>15246, -51629=>15247, -51630=>15248, -51631=>15249, -51632=>15250, -51633=>15251, -51634=>15252, -51635=>15253, -51636=>15254, -51637=>15255, -51638=>15256, -51639=>15257, -51640=>15258, -51641=>15259, -51642=>15260, -51643=>15261, -51644=>15262, -51645=>15263, -51646=>15264, -51647=>15265, -51650=>15266, -51651=>15267, -51653=>15268, -51654=>15269, -51657=>15270, -51659=>15271, -51660=>15272, -51661=>15273, -51662=>15274, -51663=>15275, -51666=>15276, -51668=>15277, -51671=>15278, -51672=>15279, -51675=>15280, -51678=>15281, -51679=>15282, -51681=>15283, -51683=>15284, -51685=>15285, -51686=>15286, -51688=>15287, -51689=>15288, -51690=>15289, -51691=>15290, -51694=>15291, -51698=>15292, -51699=>15293, -51700=>15294, -51701=>15295, -51702=>15296, -51703=>15297, -51706=>15298, -51707=>15299, -51709=>15300, -51710=>15301, -51711=>15302, -51713=>15303, -51714=>15304, -51715=>15305, -51716=>15306, -51717=>15307, -51718=>15308, -51719=>15309, -51722=>15310, -51726=>15311, -51727=>15312, -51728=>15313, -51729=>15314, -51730=>15315, -51731=>15316, -51733=>15317, -51734=>15318, -51735=>15319, -51737=>15320, -51738=>15321, -51739=>15322, -51740=>15323, -51741=>15324, -51742=>15325, -51743=>15326, -51744=>15327, -51745=>15328, -51746=>15329, -51747=>15330, -51748=>15331, -51749=>15332, -51750=>15333, -51751=>15334, -51752=>15335, -51754=>15336, -51755=>15337, -51756=>15338, -51757=>15339, -51758=>15340, -51759=>15341, -51760=>15342, -51761=>15343, -51762=>15344, -51763=>15345, -51764=>15346, -51765=>15347, -51766=>15348, -51767=>15349, -51768=>15350, -51769=>15351, -51770=>15352, -51771=>15353, -51772=>15354, -51773=>15355, -51774=>15356, -51775=>15357, -51776=>15358, -51777=>15359, -51778=>15360, -51779=>15361, -51780=>15362, -51781=>15363, -51782=>15364, -51783=>15365, -51784=>15366, -51785=>15367, -51786=>15368, -51787=>15369, -51790=>15370, -51791=>15371, -51793=>15372, -51794=>15373, -51795=>15374, -51797=>15375, -51798=>15376, -51799=>15377, -51800=>15378, -51801=>15379, -51802=>15380, -51803=>15381, -51806=>15382, -51810=>15383, -51811=>15384, -51812=>15385, -51813=>15386, -51814=>15387, -51815=>15388, -51817=>15389, -51818=>15390, -51819=>15391, -51820=>15392, -51821=>15393, -51822=>15394, -51823=>15395, -51824=>15396, -51825=>15397, -51826=>15398, -51827=>15399, -51828=>15400, -51829=>15401, -51830=>15402, -51831=>15403, -51832=>15404, -51833=>15405, -51834=>15406, -51835=>15407, -51836=>15408, -51838=>15409, -51839=>15410, -51840=>15411, -51841=>15412, -51842=>15413, -51843=>15414, -51845=>15415, -51846=>15416, -51847=>15417, -51848=>15418, -51849=>15419, -51850=>15420, -51851=>15421, -51852=>15422, -51853=>15423, -51854=>15424, -51855=>15425, -51856=>15426, -51857=>15427, -51858=>15428, -51859=>15429, -51860=>15430, -51861=>15431, -51862=>15432, -51863=>15433, -51865=>15434, -51866=>15435, -51867=>15436, -51868=>15437, -51869=>15438, -51870=>15439, -51871=>15440, -51872=>15441, -51873=>15442, -51874=>15443, -51875=>15444, -51876=>15445, -51877=>15446, -51878=>15447, -51879=>15448, -51880=>15449, -51881=>15450, -51882=>15451, -51883=>15452, -51884=>15453, -51885=>15454, -51886=>15455, -51887=>15456, -51888=>15457, -51889=>15458, -51890=>15459, -51891=>15460, -51892=>15461, -51893=>15462, -51894=>15463, -51895=>15464, -51896=>15465, -51897=>15466, -51898=>15467, -51899=>15468, -51902=>15469, -51903=>15470, -51905=>15471, -51906=>15472, -51907=>15473, -51909=>15474, -51910=>15475, -51911=>15476, -51912=>15477, -51913=>15478, -51914=>15479, -51915=>15480, -51918=>15481, -51920=>15482, -51922=>15483, -51924=>15484, -51925=>15485, -51926=>15486, -51927=>15487, -51930=>15488, -51931=>15489, -51932=>15490, -51933=>15491, -51934=>15492, -51935=>15493, -51937=>15494, -51938=>15495, -51939=>15496, -51940=>15497, -51941=>15498, -51942=>15499, -51943=>15500, -51944=>15501, -51945=>15502, -51946=>15503, -51947=>15504, -51949=>15505, -51950=>15506, -51951=>15507, -51952=>15508, -51953=>15509, -51954=>15510, -51955=>15511, -51957=>15512, -51958=>15513, -51959=>15514, -51960=>15515, -51961=>15516, -51962=>15517, -51963=>15518, -51964=>15519, -51965=>15520, -51966=>15521, -51967=>15522, -51968=>15523, -51969=>15524, -51970=>15525, -51971=>15526, -51972=>15527, -51973=>15528, -51974=>15529, -51975=>15530, -51977=>15531, -51978=>15532, -51979=>15533, -51980=>15534, -51981=>15535, -51982=>15536, -51983=>15537, -51985=>15538, -51986=>15539, -51987=>15540, -51989=>15541, -51990=>15542, -51991=>15543, -51993=>15544, -51994=>15545, -51995=>15546, -51996=>15547, -51997=>15548, -51998=>15549, -51999=>15550, -52002=>15551, -52003=>15552, -52004=>15553, -52005=>15554, -52006=>15555, -52007=>15556, -52008=>15557, -52009=>15558, -52010=>15559, -52011=>15560, -52012=>15561, -52013=>15562, -52014=>15563, -52015=>15564, -52016=>15565, -52017=>15566, -52018=>15567, -52019=>15568, -52020=>15569, -52021=>15570, -52022=>15571, -52023=>15572, -52024=>15573, -52025=>15574, -52026=>15575, -52027=>15576, -52028=>15577, -52029=>15578, -52030=>15579, -52031=>15580, -52032=>15581, -52034=>15582, -52035=>15583, -52036=>15584, -52037=>15585, -52038=>15586, -52039=>15587, -52042=>15588, -52043=>15589, -52045=>15590, -52046=>15591, -52047=>15592, -52049=>15593, -52050=>15594, -52051=>15595, -52052=>15596, -52053=>15597, -52054=>15598, -52055=>15599, -52058=>15600, -52059=>15601, -52060=>15602, -52062=>15603, -52063=>15604, -52064=>15605, -52065=>15606, -52066=>15607, -52067=>15608, -52069=>15609, -52070=>15610, -52071=>15611, -52072=>15612, -52073=>15613, -52074=>15614, -52075=>15615, -52076=>15616, -52077=>15617, -52078=>15618, -52079=>15619, -52080=>15620, -52081=>15621, -52082=>15622, -52083=>15623, -52084=>15624, -52085=>15625, -52086=>15626, -52087=>15627, -52090=>15628, -52091=>15629, -52092=>15630, -52093=>15631, -52094=>15632, -52095=>15633, -52096=>15634, -52097=>15635, -52098=>15636, -52099=>15637, -52100=>15638, -52101=>15639, -52102=>15640, -52103=>15641, -52104=>15642, -52105=>15643, -52106=>15644, -52107=>15645, -52108=>15646, -52109=>15647, -52110=>15648, -52111=>15649, -52112=>15650, -52113=>15651, -52114=>15652, -52115=>15653, -52116=>15654, -52117=>15655, -52118=>15656, -52119=>15657, -52120=>15658, -52121=>15659, -52122=>15660, -52123=>15661, -52125=>15662, -52126=>15663, -52127=>15664, -52128=>15665, -52129=>15666, -52130=>15667, -52131=>15668, -52132=>15669, -52133=>15670, -52134=>15671, -52135=>15672, -52136=>15673, -52137=>15674, -52138=>15675, -52139=>15676, -52140=>15677, -52141=>15678, -52142=>15679, -52143=>15680, -52144=>15681, -52145=>15682, -52146=>15683, -52147=>15684, -52148=>15685, -52149=>15686, -52150=>15687, -52151=>15688, -52153=>15689, -52154=>15690, -52155=>15691, -52156=>15692, -52157=>15693, -52158=>15694, -52159=>15695, -52160=>15696, -52161=>15697, -52162=>15698, -52163=>15699, -52164=>15700, -52165=>15701, -52166=>15702, -52167=>15703, -52168=>15704, -52169=>15705, -52170=>15706, -52171=>15707, -52172=>15708, -52173=>15709, -52174=>15710, -52175=>15711, -52176=>15712, -52177=>15713, -52178=>15714, -52179=>15715, -52181=>15716, -52182=>15717, -52183=>15718, -52184=>15719, -52185=>15720, -52186=>15721, -52187=>15722, -52188=>15723, -52189=>15724, -52190=>15725, -52191=>15726, -52192=>15727, -52193=>15728, -52194=>15729, -52195=>15730, -52197=>15731, -52198=>15732, -52200=>15733, -52202=>15734, -52203=>15735, -52204=>15736, -52205=>15737, -52206=>15738, -52207=>15739, -52208=>15740, -52209=>15741, -52210=>15742, -52211=>15743, -52212=>15744, -52213=>15745, -52214=>15746, -52215=>15747, -52216=>15748, -52217=>15749, -52218=>15750, -52219=>15751, -52220=>15752, -52221=>15753, -52222=>15754, -52223=>15755, -52224=>15756, -52225=>15757, -52226=>15758, -52227=>15759, -52228=>15760, -52229=>15761, -52230=>15762, -52231=>15763, -52232=>15764, -52233=>15765, -52234=>15766, -52235=>15767, -52238=>15768, -52239=>15769, -52241=>15770, -52242=>15771, -52243=>15772, -52245=>15773, -52246=>15774, -52247=>15775, -52248=>15776, -52249=>15777, -52250=>15778, -52251=>15779, -52254=>15780, -52255=>15781, -52256=>15782, -52259=>15783, -52260=>15784, -52261=>15785, -52262=>15786, -52266=>15787, -52267=>15788, -52269=>15789, -52271=>15790, -52273=>15791, -52274=>15792, -52275=>15793, -52276=>15794, -52277=>15795, -52278=>15796, -52279=>15797, -52282=>15798, -52287=>15799, -52288=>15800, -52289=>15801, -52290=>15802, -52291=>15803, -52294=>15804, -52295=>15805, -52297=>15806, -52298=>15807, -52299=>15808, -52301=>15809, -52302=>15810, -52303=>15811, -52304=>15812, -52305=>15813, -52306=>15814, -52307=>15815, -52310=>15816, -52314=>15817, -52315=>15818, -52316=>15819, -52317=>15820, -52318=>15821, -52319=>15822, -52321=>15823, -52322=>15824, -52323=>15825, -52325=>15826, -52327=>15827, -52329=>15828, -52330=>15829, -52331=>15830, -52332=>15831, -52333=>15832, -52334=>15833, -52335=>15834, -52337=>15835, -52338=>15836, -52339=>15837, -52340=>15838, -52342=>15839, -52343=>15840, -52344=>15841, -52345=>15842, -52346=>15843, -52347=>15844, -52348=>15845, -52349=>15846, -52350=>15847, -52351=>15848, -52352=>15849, -52353=>15850, -52354=>15851, -52355=>15852, -52356=>15853, -52357=>15854, -52358=>15855, -52359=>15856, -52360=>15857, -52361=>15858, -52362=>15859, -52363=>15860, -52364=>15861, -52365=>15862, -52366=>15863, -52367=>15864, -52368=>15865, -52369=>15866, -52370=>15867, -52371=>15868, -52372=>15869, -52373=>15870, -52374=>15871, -52375=>15872, -52378=>15873, -52379=>15874, -52381=>15875, -52382=>15876, -52383=>15877, -52385=>15878, -52386=>15879, -52387=>15880, -52388=>15881, -52389=>15882, -52390=>15883, -52391=>15884, -52394=>15885, -52398=>15886, -52399=>15887, -52400=>15888, -52401=>15889, -52402=>15890, -52403=>15891, -52406=>15892, -52407=>15893, -52409=>15894, -52410=>15895, -52411=>15896, -52413=>15897, -52414=>15898, -52415=>15899, -52416=>15900, -52417=>15901, -52418=>15902, -52419=>15903, -52422=>15904, -52424=>15905, -52426=>15906, -52427=>15907, -52428=>15908, -52429=>15909, -52430=>15910, -52431=>15911, -52433=>15912, -52434=>15913, -52435=>15914, -52437=>15915, -52438=>15916, -52439=>15917, -52440=>15918, -52441=>15919, -52442=>15920, -52443=>15921, -52444=>15922, -52445=>15923, -52446=>15924, -52447=>15925, -52448=>15926, -52449=>15927, -52450=>15928, -52451=>15929, -52453=>15930, -52454=>15931, -52455=>15932, -52456=>15933, -52457=>15934, -52458=>15935, -52459=>15936, -52461=>15937, -52462=>15938, -52463=>15939, -52465=>15940, -52466=>15941, -52467=>15942, -52468=>15943, -52469=>15944, -52470=>15945, -52471=>15946, -52472=>15947, -52473=>15948, -52474=>15949, -52475=>15950, -52476=>15951, -52477=>15952, -52478=>15953, -52479=>15954, -52480=>15955, -52482=>15956, -52483=>15957, -52484=>15958, -52485=>15959, -52486=>15960, -52487=>15961, -52490=>15962, -52491=>15963, -52493=>15964, -52494=>15965, -52495=>15966, -52497=>15967, -52498=>15968, -52499=>15969, -52500=>15970, -52501=>15971, -52502=>15972, -52503=>15973, -52506=>15974, -52508=>15975, -52510=>15976, -52511=>15977, -52512=>15978, -52513=>15979, -52514=>15980, -52515=>15981, -52517=>15982, -52518=>15983, -52519=>15984, -52521=>15985, -52522=>15986, -52523=>15987, -52525=>15988, -52526=>15989, -52527=>15990, -52528=>15991, -52529=>15992, -52530=>15993, -52531=>15994, -52532=>15995, -52533=>15996, -52534=>15997, -52535=>15998, -52536=>15999, -52538=>16000, -52539=>16001, -52540=>16002, -52541=>16003, -52542=>16004, -52543=>16005, -52544=>16006, -52545=>16007, -52546=>16008, -52547=>16009, -52548=>16010, -52549=>16011, -52550=>16012, -52551=>16013, -52552=>16014, -52553=>16015, -52554=>16016, -52555=>16017, -52556=>16018, -52557=>16019, -52558=>16020, -52559=>16021, -52560=>16022, -52561=>16023, -52562=>16024, -52563=>16025, -52564=>16026, -52565=>16027, -52566=>16028, -52567=>16029, -52568=>16030, -52569=>16031, -52570=>16032, -52571=>16033, -52573=>16034, -52574=>16035, -52575=>16036, -52577=>16037, -52578=>16038, -52579=>16039, -52581=>16040, -52582=>16041, -52583=>16042, -52584=>16043, -52585=>16044, -52586=>16045, -52587=>16046, -52590=>16047, -52592=>16048, -52594=>16049, -52595=>16050, -52596=>16051, -52597=>16052, -52598=>16053, -52599=>16054, -52601=>16055, -52602=>16056, -52603=>16057, -52604=>16058, -52605=>16059, -52606=>16060, -52607=>16061, -52608=>16062, -52609=>16063, -52610=>16064, -52611=>16065, -52612=>16066, -52613=>16067, -52614=>16068, -52615=>16069, -52617=>16070, -52618=>16071, -52619=>16072, -52620=>16073, -52621=>16074, -52622=>16075, -52623=>16076, -52624=>16077, -52625=>16078, -52626=>16079, -52627=>16080, -52630=>16081, -52631=>16082, -52633=>16083, -52634=>16084, -52635=>16085, -52637=>16086, -52638=>16087, -52639=>16088, -52640=>16089, -52641=>16090, -52642=>16091, -52643=>16092, -52646=>16093, -52648=>16094, -52650=>16095, -52651=>16096, -52652=>16097, -52653=>16098, -52654=>16099, -52655=>16100, -52657=>16101, -52658=>16102, -52659=>16103, -52660=>16104, -52661=>16105, -52662=>16106, -52663=>16107, -52664=>16108, -52665=>16109, -52666=>16110, -52667=>16111, -52668=>16112, -52669=>16113, -52670=>16114, -52671=>16115, -52672=>16116, -52673=>16117, -52674=>16118, -52675=>16119, -52677=>16120, -52678=>16121, -52679=>16122, -52680=>16123, -52681=>16124, -52682=>16125, -52683=>16126, -52685=>16127, -52686=>16128, -52687=>16129, -52689=>16130, -52690=>16131, -52691=>16132, -52692=>16133, -52693=>16134, -52694=>16135, -52695=>16136, -52696=>16137, -52697=>16138, -52698=>16139, -52699=>16140, -52700=>16141, -52701=>16142, -52702=>16143, -52703=>16144, -52704=>16145, -52705=>16146, -52706=>16147, -52707=>16148, -52708=>16149, -52709=>16150, -52710=>16151, -52711=>16152, -52713=>16153, -52714=>16154, -52715=>16155, -52717=>16156, -52718=>16157, -52719=>16158, -52721=>16159, -52722=>16160, -52723=>16161, -52724=>16162, -52725=>16163, -52726=>16164, -52727=>16165, -52730=>16166, -52732=>16167, -52734=>16168, -52735=>16169, -52736=>16170, -52737=>16171, -52738=>16172, -52739=>16173, -52741=>16174, -52742=>16175, -52743=>16176, -52745=>16177, -52746=>16178, -52747=>16179, -52749=>16180, -52750=>16181, -52751=>16182, -52752=>16183, -52753=>16184, -52754=>16185, -52755=>16186, -52757=>16187, -52758=>16188, -52759=>16189, -52760=>16190, -52762=>16191, -52763=>16192, -52764=>16193, -52765=>16194, -52766=>16195, -52767=>16196, -52770=>16197, -52771=>16198, -52773=>16199, -52774=>16200, -52775=>16201, -52777=>16202, -52778=>16203, -52779=>16204, -52780=>16205, -52781=>16206, -52782=>16207, -52783=>16208, -52786=>16209, -52788=>16210, -52790=>16211, -52791=>16212, -52792=>16213, -52793=>16214, -52794=>16215, -52795=>16216, -52796=>16217, -52797=>16218, -52798=>16219, -52799=>16220, -52800=>16221, -52801=>16222, -52802=>16223, -52803=>16224, -52804=>16225, -52805=>16226, -52806=>16227, -52807=>16228, -52808=>16229, -52809=>16230, -52810=>16231, -52811=>16232, -52812=>16233, -52813=>16234, -52814=>16235, -52815=>16236, -52816=>16237, -52817=>16238, -52818=>16239, -52819=>16240, -52820=>16241, -52821=>16242, -52822=>16243, -52823=>16244, -52826=>16245, -52827=>16246, -52829=>16247, -52830=>16248, -52834=>16249, -52835=>16250, -52836=>16251, -52837=>16252, -52838=>16253, -52839=>16254, -52842=>16255, -52844=>16256, -52846=>16257, -52847=>16258, -52848=>16259, -52849=>16260, -52850=>16261, -52851=>16262, -52854=>16263, -52855=>16264, -52857=>16265, -52858=>16266, -52859=>16267, -52861=>16268, -52862=>16269, -52863=>16270, -52864=>16271, -52865=>16272, -52866=>16273, -52867=>16274, -52870=>16275, -52872=>16276, -52874=>16277, -52875=>16278, -52876=>16279, -52877=>16280, -52878=>16281, -52879=>16282, -52882=>16283, -52883=>16284, -52885=>16285, -52886=>16286, -52887=>16287, -52889=>16288, -52890=>16289, -52891=>16290, -52892=>16291, -52893=>16292, -52894=>16293, -52895=>16294, -52898=>16295, -52902=>16296, -52903=>16297, -52904=>16298, -52905=>16299, -52906=>16300, -52907=>16301, -52910=>16302, -52911=>16303, -52912=>16304, -52913=>16305, -52914=>16306, -52915=>16307, -52916=>16308, -52917=>16309, -52918=>16310, -52919=>16311, -52920=>16312, -52921=>16313, -52922=>16314, -52923=>16315, -52924=>16316, -52925=>16317, -52926=>16318, -52927=>16319, -52928=>16320, -52930=>16321, -52931=>16322, -52932=>16323, -52933=>16324, -52934=>16325, -52935=>16326, -52936=>16327, -52937=>16328, -52938=>16329, -52939=>16330, -52940=>16331, -52941=>16332, -52942=>16333, -52943=>16334, -52944=>16335, -52945=>16336, -52946=>16337, -52947=>16338, -52948=>16339, -52949=>16340, -52950=>16341, -52951=>16342, -52952=>16343, -52953=>16344, -52954=>16345, -52955=>16346, -52956=>16347, -52957=>16348, -52958=>16349, -52959=>16350, -52960=>16351, -52961=>16352, -52962=>16353, -52963=>16354, -52966=>16355, -52967=>16356, -52969=>16357, -52970=>16358, -52973=>16359, -52974=>16360, -52975=>16361, -52976=>16362, -52977=>16363, -52978=>16364, -52979=>16365, -52982=>16366, -52986=>16367, -52987=>16368, -52988=>16369, -52989=>16370, -52990=>16371, -52991=>16372, -52994=>16373, -52995=>16374, -52997=>16375, -52998=>16376, -52999=>16377, -53001=>16378, -53002=>16379, -53003=>16380, -53004=>16381, -53005=>16382, -53006=>16383, -53007=>16384, -53010=>16385, -53012=>16386, -53014=>16387, -53015=>16388, -53016=>16389, -53017=>16390, -53018=>16391, -53019=>16392, -53021=>16393, -53022=>16394, -53023=>16395, -53025=>16396, -53026=>16397, -53027=>16398, -53029=>16399, -53030=>16400, -53031=>16401, -53032=>16402, -53033=>16403, -53034=>16404, -53035=>16405, -53038=>16406, -53042=>16407, -53043=>16408, -53044=>16409, -53045=>16410, -53046=>16411, -53047=>16412, -53049=>16413, -53050=>16414, -53051=>16415, -53052=>16416, -53053=>16417, -53054=>16418, -53055=>16419, -53056=>16420, -53057=>16421, -53058=>16422, -53059=>16423, -53060=>16424, -53061=>16425, -53062=>16426, -53063=>16427, -53064=>16428, -53065=>16429, -53066=>16430, -53067=>16431, -53068=>16432, -53069=>16433, -53070=>16434, -53071=>16435, -53072=>16436, -53073=>16437, -53074=>16438, -53075=>16439, -53078=>16440, -53079=>16441, -53081=>16442, -53082=>16443, -53083=>16444, -53085=>16445, -53086=>16446, -53087=>16447, -53088=>16448, -53089=>16449, -53090=>16450, -53091=>16451, -53094=>16452, -53096=>16453, -53098=>16454, -53099=>16455, -53100=>16456, -53101=>16457, -53102=>16458, -53103=>16459, -53106=>16460, -53107=>16461, -53109=>16462, -53110=>16463, -53111=>16464, -53113=>16465, -53114=>16466, -53115=>16467, -53116=>16468, -53117=>16469, -53118=>16470, -53119=>16471, -53121=>16472, -53122=>16473, -53123=>16474, -53124=>16475, -53126=>16476, -53127=>16477, -53128=>16478, -53129=>16479, -53130=>16480, -53131=>16481, -53133=>16482, -53134=>16483, -53135=>16484, -53136=>16485, -53137=>16486, -53138=>16487, -53139=>16488, -53140=>16489, -53141=>16490, -53142=>16491, -53143=>16492, -53144=>16493, -53145=>16494, -53146=>16495, -53147=>16496, -53148=>16497, -53149=>16498, -53150=>16499, -53151=>16500, -53152=>16501, -53154=>16502, -53155=>16503, -53156=>16504, -53157=>16505, -53158=>16506, -53159=>16507, -53161=>16508, -53162=>16509, -53163=>16510, -53164=>16511, -53165=>16512, -53166=>16513, -53167=>16514, -53169=>16515, -53170=>16516, -53171=>16517, -53172=>16518, -53173=>16519, -53174=>16520, -53175=>16521, -53176=>16522, -53177=>16523, -53178=>16524, -53179=>16525, -53180=>16526, -53181=>16527, -53182=>16528, -53183=>16529, -53184=>16530, -53185=>16531, -53186=>16532, -53187=>16533, -53189=>16534, -53190=>16535, -53191=>16536, -53192=>16537, -53193=>16538, -53194=>16539, -53195=>16540, -53196=>16541, -53197=>16542, -53198=>16543, -53199=>16544, -53200=>16545, -53201=>16546, -53202=>16547, -53203=>16548, -53204=>16549, -53205=>16550, -53206=>16551, -53207=>16552, -53208=>16553, -53209=>16554, -53210=>16555, -53211=>16556, -53212=>16557, -53213=>16558, -53214=>16559, -53215=>16560, -53218=>16561, -53219=>16562, -53221=>16563, -53222=>16564, -53223=>16565, -53225=>16566, -53226=>16567, -53227=>16568, -53228=>16569, -53229=>16570, -53230=>16571, -53231=>16572, -53234=>16573, -53236=>16574, -53238=>16575, -53239=>16576, -53240=>16577, -53241=>16578, -53242=>16579, -53243=>16580, -53245=>16581, -53246=>16582, -53247=>16583, -53249=>16584, -53250=>16585, -53251=>16586, -53253=>16587, -53254=>16588, -53255=>16589, -53256=>16590, -53257=>16591, -53258=>16592, -53259=>16593, -53260=>16594, -53261=>16595, -53262=>16596, -53263=>16597, -53264=>16598, -53266=>16599, -53267=>16600, -53268=>16601, -53269=>16602, -53270=>16603, -53271=>16604, -53273=>16605, -53274=>16606, -53275=>16607, -53276=>16608, -53277=>16609, -53278=>16610, -53279=>16611, -53280=>16612, -53281=>16613, -53282=>16614, -53283=>16615, -53284=>16616, -53285=>16617, -53286=>16618, -53287=>16619, -53288=>16620, -53289=>16621, -53290=>16622, -53291=>16623, -53292=>16624, -53294=>16625, -53295=>16626, -53296=>16627, -53297=>16628, -53298=>16629, -53299=>16630, -53302=>16631, -53303=>16632, -53305=>16633, -53306=>16634, -53307=>16635, -53309=>16636, -53310=>16637, -53311=>16638, -53312=>16639, -53313=>16640, -53314=>16641, -53315=>16642, -53318=>16643, -53320=>16644, -53322=>16645, -53323=>16646, -53324=>16647, -53325=>16648, -53326=>16649, -53327=>16650, -53329=>16651, -53330=>16652, -53331=>16653, -53333=>16654, -53334=>16655, -53335=>16656, -53337=>16657, -53338=>16658, -53339=>16659, -53340=>16660, -53341=>16661, -53342=>16662, -53343=>16663, -53345=>16664, -53346=>16665, -53347=>16666, -53348=>16667, -53349=>16668, -53350=>16669, -53351=>16670, -53352=>16671, -53353=>16672, -53354=>16673, -53355=>16674, -53358=>16675, -53359=>16676, -53361=>16677, -53362=>16678, -53363=>16679, -53365=>16680, -53366=>16681, -53367=>16682, -53368=>16683, -53369=>16684, -53370=>16685, -53371=>16686, -53374=>16687, -53375=>16688, -53376=>16689, -53378=>16690, -53379=>16691, -53380=>16692, -53381=>16693, -53382=>16694, -53383=>16695, -53384=>16696, -53385=>16697, -53386=>16698, -53387=>16699, -53388=>16700, -53389=>16701, -53390=>16702, -53391=>16703, -53392=>16704, -53393=>16705, -53394=>16706, -53395=>16707, -53396=>16708, -53397=>16709, -53398=>16710, -53399=>16711, -53400=>16712, -53401=>16713, -53402=>16714, -53403=>16715, -53404=>16716, -53405=>16717, -53406=>16718, -53407=>16719, -53408=>16720, -53409=>16721, -53410=>16722, -53411=>16723, -53414=>16724, -53415=>16725, -53417=>16726, -53418=>16727, -53419=>16728, -53421=>16729, -53422=>16730, -53423=>16731, -53424=>16732, -53425=>16733, -53426=>16734, -53427=>16735, -53430=>16736, -53432=>16737, -53434=>16738, -53435=>16739, -53436=>16740, -53437=>16741, -53438=>16742, -53439=>16743, -53442=>16744, -53443=>16745, -53445=>16746, -53446=>16747, -53447=>16748, -53450=>16749, -53451=>16750, -53452=>16751, -53453=>16752, -53454=>16753, -53455=>16754, -53458=>16755, -53462=>16756, -53463=>16757, -53464=>16758, -53465=>16759, -53466=>16760, -53467=>16761, -53470=>16762, -53471=>16763, -53473=>16764, -53474=>16765, -53475=>16766, -53477=>16767, -53478=>16768, -53479=>16769, -53480=>16770, -53481=>16771, -53482=>16772, -53483=>16773, -53486=>16774, -53490=>16775, -53491=>16776, -53492=>16777, -53493=>16778, -53494=>16779, -53495=>16780, -53497=>16781, -53498=>16782, -53499=>16783, -53500=>16784, -53501=>16785, -53502=>16786, -53503=>16787, -53504=>16788, -53505=>16789, -53506=>16790, -53507=>16791, -53508=>16792, -53509=>16793, -53510=>16794, -53511=>16795, -53512=>16796, -53513=>16797, -53514=>16798, -53515=>16799, -53516=>16800, -53518=>16801, -53519=>16802, -53520=>16803, -53521=>16804, -53522=>16805, -53523=>16806, -53524=>16807, -53525=>16808, -53526=>16809, -53527=>16810, -53528=>16811, -53529=>16812, -53530=>16813, -53531=>16814, -53532=>16815, -53533=>16816, -53534=>16817, -53535=>16818, -53536=>16819, -53537=>16820, -53538=>16821, -53539=>16822, -53540=>16823, -53541=>16824, -53542=>16825, -53543=>16826, -53544=>16827, -53545=>16828, -53546=>16829, -53547=>16830, -53548=>16831, -53549=>16832, -53550=>16833, -53551=>16834, -53554=>16835, -53555=>16836, -53557=>16837, -53558=>16838, -53559=>16839, -53561=>16840, -53563=>16841, -53564=>16842, -53565=>16843, -53566=>16844, -53567=>16845, -53570=>16846, -53574=>16847, -53575=>16848, -53576=>16849, -53577=>16850, -53578=>16851, -53579=>16852, -53582=>16853, -53583=>16854, -53585=>16855, -53586=>16856, -53587=>16857, -53589=>16858, -53590=>16859, -53591=>16860, -53592=>16861, -53593=>16862, -53594=>16863, -53595=>16864, -53598=>16865, -53600=>16866, -53602=>16867, -53603=>16868, -53604=>16869, -53605=>16870, -53606=>16871, -53607=>16872, -53609=>16873, -53610=>16874, -53611=>16875, -53613=>16876, -53614=>16877, -53615=>16878, -53616=>16879, -53617=>16880, -53618=>16881, -53619=>16882, -53620=>16883, -53621=>16884, -53622=>16885, -53623=>16886, -53624=>16887, -53625=>16888, -53626=>16889, -53627=>16890, -53629=>16891, -53630=>16892, -53631=>16893, -53632=>16894, -53633=>16895, -53634=>16896, -53635=>16897, -53637=>16898, -53638=>16899, -53639=>16900, -53641=>16901, -53642=>16902, -53643=>16903, -53644=>16904, -53645=>16905, -53646=>16906, -53647=>16907, -53648=>16908, -53649=>16909, -53650=>16910, -53651=>16911, -53652=>16912, -53653=>16913, -53654=>16914, -53655=>16915, -53656=>16916, -53657=>16917, -53658=>16918, -53659=>16919, -53660=>16920, -53661=>16921, -53662=>16922, -53663=>16923, -53666=>16924, -53667=>16925, -53669=>16926, -53670=>16927, -53671=>16928, -53673=>16929, -53674=>16930, -53675=>16931, -53676=>16932, -53677=>16933, -53678=>16934, -53679=>16935, -53682=>16936, -53684=>16937, -53686=>16938, -53687=>16939, -53688=>16940, -53689=>16941, -53691=>16942, -53693=>16943, -53694=>16944, -53695=>16945, -53697=>16946, -53698=>16947, -53699=>16948, -53700=>16949, -53701=>16950, -53702=>16951, -53703=>16952, -53704=>16953, -53705=>16954, -53706=>16955, -53707=>16956, -53708=>16957, -53709=>16958, -53710=>16959, -53711=>16960, -53712=>16961, -53713=>16962, -53714=>16963, -53715=>16964, -53716=>16965, -53717=>16966, -53718=>16967, -53719=>16968, -53721=>16969, -53722=>16970, -53723=>16971, -53724=>16972, -53725=>16973, -53726=>16974, -53727=>16975, -53728=>16976, -53729=>16977, -53730=>16978, -53731=>16979, -53732=>16980, -53733=>16981, -53734=>16982, -53735=>16983, -53736=>16984, -53737=>16985, -53738=>16986, -53739=>16987, -53740=>16988, -53741=>16989, -53742=>16990, -53743=>16991, -53744=>16992, -53745=>16993, -53746=>16994, -53747=>16995, -53749=>16996, -53750=>16997, -53751=>16998, -53753=>16999, -53754=>17000, -53755=>17001, -53756=>17002, -53757=>17003, -53758=>17004, -53759=>17005, -53760=>17006, -53761=>17007, -53762=>17008, -53763=>17009, -53764=>17010, -53765=>17011, -53766=>17012, -53768=>17013, -53770=>17014, -53771=>17015, -53772=>17016, -53773=>17017, -53774=>17018, -53775=>17019, -53777=>17020, -53778=>17021, -53779=>17022, -53780=>17023, -53781=>17024, -53782=>17025, -53783=>17026, -53784=>17027, -53785=>17028, -53786=>17029, -53787=>17030, -53788=>17031, -53789=>17032, -53790=>17033, -53791=>17034, -53792=>17035, -53793=>17036, -53794=>17037, -53795=>17038, -53796=>17039, -53797=>17040, -53798=>17041, -53799=>17042, -53800=>17043, -53801=>17044, -53802=>17045, -53803=>17046, -53806=>17047, -53807=>17048, -53809=>17049, -53810=>17050, -53811=>17051, -53813=>17052, -53814=>17053, -53815=>17054, -53816=>17055, -53817=>17056, -53818=>17057, -53819=>17058, -53822=>17059, -53824=>17060, -53826=>17061, -53827=>17062, -53828=>17063, -53829=>17064, -53830=>17065, -53831=>17066, -53833=>17067, -53834=>17068, -53835=>17069, -53836=>17070, -53837=>17071, -53838=>17072, -53839=>17073, -53840=>17074, -53841=>17075, -53842=>17076, -53843=>17077, -53844=>17078, -53845=>17079, -53846=>17080, -53847=>17081, -53848=>17082, -53849=>17083, -53850=>17084, -53851=>17085, -53853=>17086, -53854=>17087, -53855=>17088, -53856=>17089, -53857=>17090, -53858=>17091, -53859=>17092, -53861=>17093, -53862=>17094, -53863=>17095, -53864=>17096, -53865=>17097, -53866=>17098, -53867=>17099, -53868=>17100, -53869=>17101, -53870=>17102, -53871=>17103, -53872=>17104, -53873=>17105, -53874=>17106, -53875=>17107, -53876=>17108, -53877=>17109, -53878=>17110, -53879=>17111, -53880=>17112, -53881=>17113, -53882=>17114, -53883=>17115, -53884=>17116, -53885=>17117, -53886=>17118, -53887=>17119, -53890=>17120, -53891=>17121, -53893=>17122, -53894=>17123, -53895=>17124, -53897=>17125, -53898=>17126, -53899=>17127, -53900=>17128, -53901=>17129, -53902=>17130, -53903=>17131, -53906=>17132, -53907=>17133, -53908=>17134, -53910=>17135, -53911=>17136, -53912=>17137, -53913=>17138, -53914=>17139, -53915=>17140, -53917=>17141, -53918=>17142, -53919=>17143, -53921=>17144, -53922=>17145, -53923=>17146, -53925=>17147, -53926=>17148, -53927=>17149, -53928=>17150, -53929=>17151, -53930=>17152, -53931=>17153, -53933=>17154, -53934=>17155, -53935=>17156, -53936=>17157, -53938=>17158, -53939=>17159, -53940=>17160, -53941=>17161, -53942=>17162, -53943=>17163, -53946=>17164, -53947=>17165, -53949=>17166, -53950=>17167, -53953=>17168, -53955=>17169, -53956=>17170, -53957=>17171, -53958=>17172, -53959=>17173, -53962=>17174, -53964=>17175, -53965=>17176, -53966=>17177, -53967=>17178, -53968=>17179, -53969=>17180, -53970=>17181, -53971=>17182, -53973=>17183, -53974=>17184, -53975=>17185, -53977=>17186, -53978=>17187, -53979=>17188, -53981=>17189, -53982=>17190, -53983=>17191, -53984=>17192, -53985=>17193, -53986=>17194, -53987=>17195, -53990=>17196, -53991=>17197, -53992=>17198, -53993=>17199, -53994=>17200, -53995=>17201, -53996=>17202, -53997=>17203, -53998=>17204, -53999=>17205, -54002=>17206, -54003=>17207, -54005=>17208, -54006=>17209, -54007=>17210, -54009=>17211, -54010=>17212, -54011=>17213, -54012=>17214, -54013=>17215, -54014=>17216, -54015=>17217, -54018=>17218, -54020=>17219, -54022=>17220, -54023=>17221, -54024=>17222, -54025=>17223, -54026=>17224, -54027=>17225, -54031=>17226, -54033=>17227, -54034=>17228, -54035=>17229, -54037=>17230, -54039=>17231, -54040=>17232, -54041=>17233, -54042=>17234, -54043=>17235, -54046=>17236, -54050=>17237, -54051=>17238, -54052=>17239, -54054=>17240, -54055=>17241, -54058=>17242, -54059=>17243, -54061=>17244, -54062=>17245, -54063=>17246, -54065=>17247, -54066=>17248, -54067=>17249, -54068=>17250, -54069=>17251, -54070=>17252, -54071=>17253, -54074=>17254, -54078=>17255, -54079=>17256, -54080=>17257, -54081=>17258, -54082=>17259, -54083=>17260, -54086=>17261, -54087=>17262, -54088=>17263, -54089=>17264, -54090=>17265, -54091=>17266, -54092=>17267, -54093=>17268, -54094=>17269, -54095=>17270, -54096=>17271, -54097=>17272, -54098=>17273, -54099=>17274, -54100=>17275, -54101=>17276, -54102=>17277, -54103=>17278, -54104=>17279, -54105=>17280, -54106=>17281, -54107=>17282, -54108=>17283, -54109=>17284, -54110=>17285, -54111=>17286, -54112=>17287, -54113=>17288, -54114=>17289, -54115=>17290, -54116=>17291, -54117=>17292, -54118=>17293, -54119=>17294, -54120=>17295, -54121=>17296, -54122=>17297, -54123=>17298, -54124=>17299, -54125=>17300, -54126=>17301, -54127=>17302, -54128=>17303, -54129=>17304, -54130=>17305, -54131=>17306, -54132=>17307, -54133=>17308, -54134=>17309, -54135=>17310, -54136=>17311, -54137=>17312, -54138=>17313, -54139=>17314, -54142=>17315, -54143=>17316, -54145=>17317, -54146=>17318, -54147=>17319, -54149=>17320, -54150=>17321, -54151=>17322, -54152=>17323, -54153=>17324, -54154=>17325, -54155=>17326, -54158=>17327, -54162=>17328, -54163=>17329, -54164=>17330, -54165=>17331, -54166=>17332, -54167=>17333, -54170=>17334, -54171=>17335, -54173=>17336, -54174=>17337, -54175=>17338, -54177=>17339, -54178=>17340, -54179=>17341, -54180=>17342, -54181=>17343, -54182=>17344, -54183=>17345, -54186=>17346, -54188=>17347, -54190=>17348, -54191=>17349, -54192=>17350, -54193=>17351, -54194=>17352, -54195=>17353, -54197=>17354, -54198=>17355, -54199=>17356, -54201=>17357, -54202=>17358, -54203=>17359, -54205=>17360, -54206=>17361, -54207=>17362, -54208=>17363, -54209=>17364, -54210=>17365, -54211=>17366, -54214=>17367, -54215=>17368, -54218=>17369, -54219=>17370, -54220=>17371, -54221=>17372, -54222=>17373, -54223=>17374, -54225=>17375, -54226=>17376, -54227=>17377, -54228=>17378, -54229=>17379, -54230=>17380, -54231=>17381, -54233=>17382, -54234=>17383, -54235=>17384, -54236=>17385, -54237=>17386, -54238=>17387, -54239=>17388, -54240=>17389, -54242=>17390, -54244=>17391, -54245=>17392, -54246=>17393, -54247=>17394, -54248=>17395, -54249=>17396, -54250=>17397, -54251=>17398, -54254=>17399, -54255=>17400, -54257=>17401, -54258=>17402, -54259=>17403, -54261=>17404, -54262=>17405, -54263=>17406, -54264=>17407, -54265=>17408, -54266=>17409, -54267=>17410, -54270=>17411, -54272=>17412, -54274=>17413, -54275=>17414, -54276=>17415, -54277=>17416, -54278=>17417, -54279=>17418, -54281=>17419, -54282=>17420, -54283=>17421, -54284=>17422, -54285=>17423, -54286=>17424, -54287=>17425, -54288=>17426, -54289=>17427, -54290=>17428, -54291=>17429, -54292=>17430, -54293=>17431, -54294=>17432, -54295=>17433, -54296=>17434, -54297=>17435, -54298=>17436, -54299=>17437, -54300=>17438, -54302=>17439, -54303=>17440, -54304=>17441, -54305=>17442, -54306=>17443, -54307=>17444, -54308=>17445, -54309=>17446, -54310=>17447, -54311=>17448, -54312=>17449, -54313=>17450, -54314=>17451, -54315=>17452, -54316=>17453, -54317=>17454, -54318=>17455, -54319=>17456, -54320=>17457, -54321=>17458, -54322=>17459, -54323=>17460, -54324=>17461, -54325=>17462, -54326=>17463, -54327=>17464, -54328=>17465, -54329=>17466, -54330=>17467, -54331=>17468, -54332=>17469, -54333=>17470, -54334=>17471, -54335=>17472, -54337=>17473, -54338=>17474, -54339=>17475, -54341=>17476, -54342=>17477, -54343=>17478, -54344=>17479, -54345=>17480, -54346=>17481, -54347=>17482, -54348=>17483, -54349=>17484, -54350=>17485, -54351=>17486, -54352=>17487, -54353=>17488, -54354=>17489, -54355=>17490, -54356=>17491, -54357=>17492, -54358=>17493, -54359=>17494, -54360=>17495, -54361=>17496, -54362=>17497, -54363=>17498, -54365=>17499, -54366=>17500, -54367=>17501, -54369=>17502, -54370=>17503, -54371=>17504, -54373=>17505, -54374=>17506, -54375=>17507, -54376=>17508, -54377=>17509, -54378=>17510, -54379=>17511, -54380=>17512, -54382=>17513, -54384=>17514, -54385=>17515, -54386=>17516, -54387=>17517, -54388=>17518, -54389=>17519, -54390=>17520, -54391=>17521, -54394=>17522, -54395=>17523, -54397=>17524, -54398=>17525, -54401=>17526, -54403=>17527, -54404=>17528, -54405=>17529, -54406=>17530, -54407=>17531, -54410=>17532, -54412=>17533, -54414=>17534, -54415=>17535, -54416=>17536, -54417=>17537, -54418=>17538, -54419=>17539, -54421=>17540, -54422=>17541, -54423=>17542, -54424=>17543, -54425=>17544, -54426=>17545, -54427=>17546, -54428=>17547, -54429=>17548, -54430=>17549, -54431=>17550, -54432=>17551, -54433=>17552, -54434=>17553, -54435=>17554, -54436=>17555, -54437=>17556, -54438=>17557, -54439=>17558, -54440=>17559, -54442=>17560, -54443=>17561, -54444=>17562, -54445=>17563, -54446=>17564, -54447=>17565, -54448=>17566, -54449=>17567, -54450=>17568, -54451=>17569, -54452=>17570, -54453=>17571, -54454=>17572, -54455=>17573, -54456=>17574, -54457=>17575, -54458=>17576, -54459=>17577, -54460=>17578, -54461=>17579, -54462=>17580, -54463=>17581, -54464=>17582, -54465=>17583, -54466=>17584, -54467=>17585, -54468=>17586, -54469=>17587, -54470=>17588, -54471=>17589, -54472=>17590, -54473=>17591, -54474=>17592, -54475=>17593, -54477=>17594, -54478=>17595, -54479=>17596, -54481=>17597, -54482=>17598, -54483=>17599, -54485=>17600, -54486=>17601, -54487=>17602, -54488=>17603, -54489=>17604, -54490=>17605, -54491=>17606, -54493=>17607, -54494=>17608, -54496=>17609, -54497=>17610, -54498=>17611, -54499=>17612, -54500=>17613, -54501=>17614, -54502=>17615, -54503=>17616, -54505=>17617, -54506=>17618, -54507=>17619, -54509=>17620, -54510=>17621, -54511=>17622, -54513=>17623, -54514=>17624, -54515=>17625, -54516=>17626, -54517=>17627, -54518=>17628, -54519=>17629, -54521=>17630, -54522=>17631, -54524=>17632, -54526=>17633, -54527=>17634, -54528=>17635, -54529=>17636, -54530=>17637, -54531=>17638, -54533=>17639, -54534=>17640, -54535=>17641, -54537=>17642, -54538=>17643, -54539=>17644, -54541=>17645, -54542=>17646, -54543=>17647, -54544=>17648, -54545=>17649, -54546=>17650, -54547=>17651, -54550=>17652, -54552=>17653, -54553=>17654, -54554=>17655, -54555=>17656, -54556=>17657, -54557=>17658, -54558=>17659, -54559=>17660, -54560=>17661, -54561=>17662, -54562=>17663, -54563=>17664, -54564=>17665, -54565=>17666, -54566=>17667, -54567=>17668, -54568=>17669, -54569=>17670, -54570=>17671, -54571=>17672, -54572=>17673, -54573=>17674, -54574=>17675, -54575=>17676, -54576=>17677, -54577=>17678, -54578=>17679, -54579=>17680, -54580=>17681, -54581=>17682, -54582=>17683, -54583=>17684, -54584=>17685, -54585=>17686, -54586=>17687, -54587=>17688, -54590=>17689, -54591=>17690, -54593=>17691, -54594=>17692, -54595=>17693, -54597=>17694, -54598=>17695, -54599=>17696, -54600=>17697, -54601=>17698, -54602=>17699, -54603=>17700, -54606=>17701, -54608=>17702, -54610=>17703, -54611=>17704, -54612=>17705, -54613=>17706, -54614=>17707, -54615=>17708, -54618=>17709, -54619=>17710, -54621=>17711, -54622=>17712, -54623=>17713, -54625=>17714, -54626=>17715, -54627=>17716, -54628=>17717, -54630=>17718, -54631=>17719, -54634=>17720, -54636=>17721, -54638=>17722, -54639=>17723, -54640=>17724, -54641=>17725, -54642=>17726, -54643=>17727, -54646=>17728, -54647=>17729, -54649=>17730, -54650=>17731, -54651=>17732, -54653=>17733, -54654=>17734, -54655=>17735, -54656=>17736, -54657=>17737, -54658=>17738, -54659=>17739, -54662=>17740, -54666=>17741, -54667=>17742, -54668=>17743, -54669=>17744, -54670=>17745, -54671=>17746, -54673=>17747, -54674=>17748, -54675=>17749, -54676=>17750, -54677=>17751, -54678=>17752, -54679=>17753, -54680=>17754, -54681=>17755, -54682=>17756, -54683=>17757, -54684=>17758, -54685=>17759, -54686=>17760, -54687=>17761, -54688=>17762, -54689=>17763, -54690=>17764, -54691=>17765, -54692=>17766, -54694=>17767, -54695=>17768, -54696=>17769, -54697=>17770, -54698=>17771, -54699=>17772, -54700=>17773, -54701=>17774, -54702=>17775, -54703=>17776, -54704=>17777, -54705=>17778, -54706=>17779, -54707=>17780, -54708=>17781, -54709=>17782, -54710=>17783, -54711=>17784, -54712=>17785, -54713=>17786, -54714=>17787, -54715=>17788, -54716=>17789, -54717=>17790, -54718=>17791, -54719=>17792, -54720=>17793, -54721=>17794, -54722=>17795, -54723=>17796, -54724=>17797, -54725=>17798, -54726=>17799, -54727=>17800, -54730=>17801, -54731=>17802, -54733=>17803, -54734=>17804, -54735=>17805, -54737=>17806, -54739=>17807, -54740=>17808, -54741=>17809, -54742=>17810, -54743=>17811, -54746=>17812, -54748=>17813, -54750=>17814, -54751=>17815, -54752=>17816, -54753=>17817, -54754=>17818, -54755=>17819, -54758=>17820, -54759=>17821, -54761=>17822, -54762=>17823, -54763=>17824, -54765=>17825, -54766=>17826, -54767=>17827, -54768=>17828, -54769=>17829, -54770=>17830, -54771=>17831, -54774=>17832, -54776=>17833, -54778=>17834, -54779=>17835, -54780=>17836, -54781=>17837, -54782=>17838, -54783=>17839, -54786=>17840, -54787=>17841, -54789=>17842, -54790=>17843, -54791=>17844, -54793=>17845, -54794=>17846, -54795=>17847, -54796=>17848, -54797=>17849, -54798=>17850, -54799=>17851, -54802=>17852, -54806=>17853, -54807=>17854, -54808=>17855, -54809=>17856, -54810=>17857, -54811=>17858, -54813=>17859, -54814=>17860, -54815=>17861, -54817=>17862, -54818=>17863, -54819=>17864, -54821=>17865, -54822=>17866, -54823=>17867, -54824=>17868, -54825=>17869, -54826=>17870, -54827=>17871, -54828=>17872, -54830=>17873, -54831=>17874, -54832=>17875, -54833=>17876, -54834=>17877, -54835=>17878, -54836=>17879, -54837=>17880, -54838=>17881, -54839=>17882, -54842=>17883, -54843=>17884, -54845=>17885, -54846=>17886, -54847=>17887, -54849=>17888, -54850=>17889, -54851=>17890, -54852=>17891, -54854=>17892, -54855=>17893, -54858=>17894, -54860=>17895, -54862=>17896, -54863=>17897, -54864=>17898, -54866=>17899, -54867=>17900, -54870=>17901, -54871=>17902, -54873=>17903, -54874=>17904, -54875=>17905, -54877=>17906, -54878=>17907, -54879=>17908, -54880=>17909, -54881=>17910, -54882=>17911, -54883=>17912, -54884=>17913, -54885=>17914, -54886=>17915, -54888=>17916, -54890=>17917, -54891=>17918, -54892=>17919, -54893=>17920, -54894=>17921, -54895=>17922, -54898=>17923, -54899=>17924, -54901=>17925, -54902=>17926, -54903=>17927, -54904=>17928, -54905=>17929, -54906=>17930, -54907=>17931, -54908=>17932, -54909=>17933, -54910=>17934, -54911=>17935, -54912=>17936, -54913=>17937, -54914=>17938, -54916=>17939, -54918=>17940, -54919=>17941, -54920=>17942, -54921=>17943, -54922=>17944, -54923=>17945, -54926=>17946, -54927=>17947, -54929=>17948, -54930=>17949, -54931=>17950, -54933=>17951, -54934=>17952, -54935=>17953, -54936=>17954, -54937=>17955, -54938=>17956, -54939=>17957, -54940=>17958, -54942=>17959, -54944=>17960, -54946=>17961, -54947=>17962, -54948=>17963, -54949=>17964, -54950=>17965, -54951=>17966, -54953=>17967, -54954=>17968, -54955=>17969, -54957=>17970, -54958=>17971, -54959=>17972, -54961=>17973, -54962=>17974, -54963=>17975, -54964=>17976, -54965=>17977, -54966=>17978, -54967=>17979, -54968=>17980, -54970=>17981, -54972=>17982, -54973=>17983, -54974=>17984, -54975=>17985, -54976=>17986, -54977=>17987, -54978=>17988, -54979=>17989, -54982=>17990, -54983=>17991, -54985=>17992, -54986=>17993, -54987=>17994, -54989=>17995, -54990=>17996, -54991=>17997, -54992=>17998, -54994=>17999, -54995=>18000, -54997=>18001, -54998=>18002, -55000=>18003, -55002=>18004, -55003=>18005, -55004=>18006, -55005=>18007, -55006=>18008, -55007=>18009, -55009=>18010, -55010=>18011, -55011=>18012, -55013=>18013, -55014=>18014, -55015=>18015, -55017=>18016, -55018=>18017, -55019=>18018, -55020=>18019, -55021=>18020, -55022=>18021, -55023=>18022, -55025=>18023, -55026=>18024, -55027=>18025, -55028=>18026, -55030=>18027, -55031=>18028, -55032=>18029, -55033=>18030, -55034=>18031, -55035=>18032, -55038=>18033, -55039=>18034, -55041=>18035, -55042=>18036, -55043=>18037, -55045=>18038, -55046=>18039, -55047=>18040, -55048=>18041, -55049=>18042, -55050=>18043, -55051=>18044, -55052=>18045, -55053=>18046, -55054=>18047, -55055=>18048, -55056=>18049, -55058=>18050, -55059=>18051, -55060=>18052, -55061=>18053, -55062=>18054, -55063=>18055, -55066=>18056, -55067=>18057, -55069=>18058, -55070=>18059, -55071=>18060, -55073=>18061, -55074=>18062, -55075=>18063, -55076=>18064, -55077=>18065, -55078=>18066, -55079=>18067, -55082=>18068, -55084=>18069, -55086=>18070, -55087=>18071, -55088=>18072, -55089=>18073, -55090=>18074, -55091=>18075, -55094=>18076, -55095=>18077, -55097=>18078, -55098=>18079, -55099=>18080, -55101=>18081, -55102=>18082, -55103=>18083, -55104=>18084, -55105=>18085, -55106=>18086, -55107=>18087, -55109=>18088, -55110=>18089, -55112=>18090, -55114=>18091, -55115=>18092, -55116=>18093, -55117=>18094, -55118=>18095, -55119=>18096, -55122=>18097, -55123=>18098, -55125=>18099, -55130=>18100, -55131=>18101, -55132=>18102, -55133=>18103, -55134=>18104, -55135=>18105, -55138=>18106, -55140=>18107, -55142=>18108, -55143=>18109, -55144=>18110, -55146=>18111, -55147=>18112, -55149=>18113, -55150=>18114, -55151=>18115, -55153=>18116, -55154=>18117, -55155=>18118, -55157=>18119, -55158=>18120, -55159=>18121, -55160=>18122, -55161=>18123, -55162=>18124, -55163=>18125, -55166=>18126, -55167=>18127, -55168=>18128, -55170=>18129, -55171=>18130, -55172=>18131, -55173=>18132, -55174=>18133, -55175=>18134, -55178=>18135, -55179=>18136, -55181=>18137, -55182=>18138, -55183=>18139, -55185=>18140, -55186=>18141, -55187=>18142, -55188=>18143, -55189=>18144, -55190=>18145, -55191=>18146, -55194=>18147, -55196=>18148, -55198=>18149, -55199=>18150, -55200=>18151, -55201=>18152, -55202=>18153, -55203=>18154, -); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/unifont.ctg.z b/include/limesurvey/admin/classes/tcpdf/fonts/unifont.ctg.z deleted file mode 100644 index 35f03e7f..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/unifont.ctg.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/unifont.php b/include/limesurvey/admin/classes/tcpdf/fonts/unifont.php deleted file mode 100644 index 1ea17b38..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/unifont.php +++ /dev/null @@ -1,3291 +0,0 @@ -875,'Descent'=>-125,'CapHeight'=>63,'Flags'=>32,'FontBBox'=>'[-1000 -125 1000 875]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); -$up=-117; -$ut=39; -$dw=600; -$cw=array( -0=>1000,1=>1000,2=>1000,3=>1000,4=>1000,5=>1000,6=>1000,7=>1000,8=>1000,9=>1000, -10=>1000,11=>1000,12=>1000,13=>1000,14=>1000,15=>1000,16=>1000,17=>1000,18=>1000,19=>1000, -20=>1000,21=>1000,22=>1000,23=>1000,24=>1000,25=>1000,26=>1000,27=>1000,28=>1000,29=>1000, -30=>1000,31=>1000,32=>500,33=>500,34=>500,35=>500,36=>500,37=>500,38=>500,39=>500, -40=>500,41=>500,42=>500,43=>500,44=>500,45=>500,46=>500,47=>500,48=>500,49=>500, -50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>500,59=>500, -60=>500,61=>500,62=>500,63=>500,64=>500,65=>500,66=>500,67=>500,68=>500,69=>500, -70=>500,71=>500,72=>500,73=>500,74=>500,75=>500,76=>500,77=>500,78=>500,79=>500, -80=>500,81=>500,82=>500,83=>500,84=>500,85=>500,86=>500,87=>500,88=>500,89=>500, -90=>500,91=>500,92=>500,93=>500,94=>500,95=>500,96=>500,97=>500,98=>500,99=>500, -100=>500,101=>500,102=>500,103=>500,104=>500,105=>500,106=>500,107=>500,108=>500,109=>500, -110=>500,111=>500,112=>500,113=>500,114=>500,115=>500,116=>500,117=>500,118=>500,119=>500, -120=>500,121=>500,122=>500,123=>500,124=>500,125=>500,126=>500,127=>1000,8364=>500,129=>1000, -8218=>500,402=>500,8222=>500,8230=>500,8224=>500,8225=>500,710=>500,8240=>500,352=>500,8249=>500, -338=>500,141=>1000,381=>500,143=>1000,144=>1000,8216=>500,8217=>500,8220=>500,8221=>500,8226=>500, -8211=>500,8212=>500,732=>500,8482=>500,353=>500,8250=>500,339=>500,157=>1000,382=>500,376=>500, -160=>500,161=>500,162=>500,163=>500,164=>500,165=>500,166=>500,167=>500,168=>500,169=>500, -170=>500,171=>500,172=>500,173=>500,174=>500,175=>500,176=>500,177=>500,178=>500,179=>500, -180=>500,181=>500,182=>500,183=>500,184=>500,185=>500,186=>500,187=>500,188=>500,189=>500, -190=>500,191=>500,192=>500,193=>500,194=>500,195=>500,196=>500,197=>500,198=>500,199=>500, -200=>500,201=>500,202=>500,203=>500,204=>500,205=>500,206=>500,207=>500,208=>500,209=>500, -210=>500,211=>500,212=>500,213=>500,214=>500,215=>500,216=>500,217=>500,218=>500,219=>500, -220=>500,221=>500,222=>500,223=>500,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500, -230=>500,231=>500,232=>500,233=>500,234=>500,235=>500,236=>500,237=>500,238=>500,239=>500, -240=>500,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>500,248=>500,249=>500, -250=>500,251=>500,252=>500,253=>500,254=>500,255=>500,128=>1000,130=>1000,131=>1000,132=>1000, -133=>1000,134=>1000,135=>1000,136=>1000,137=>1000,138=>1000,139=>1000,140=>1000,142=>1000,145=>1000, -146=>1000,147=>1000,148=>1000,149=>1000,150=>1000,151=>1000,152=>1000,153=>1000,154=>1000,155=>1000, -156=>1000,158=>1000,159=>1000,256=>500,257=>500,258=>500,259=>500,260=>500,261=>500,262=>500, -263=>500,264=>500,265=>500,266=>500,267=>500,268=>500,269=>500,270=>500,271=>500,272=>500, -273=>500,274=>500,275=>500,276=>500,277=>500,278=>500,279=>500,280=>500,281=>500,282=>500, -283=>500,284=>500,285=>500,286=>500,287=>500,288=>500,289=>500,290=>500,291=>500,292=>500, -293=>500,294=>500,295=>500,296=>500,297=>500,298=>500,299=>500,300=>500,301=>500,302=>500, -303=>500,304=>500,305=>500,306=>500,307=>500,308=>500,309=>500,310=>500,311=>500,312=>500, -313=>500,314=>500,315=>500,316=>500,317=>500,318=>500,319=>500,320=>500,321=>500,322=>500, -323=>500,324=>500,325=>500,326=>500,327=>500,328=>500,329=>500,330=>500,331=>500,332=>500, -333=>500,334=>500,335=>500,336=>500,337=>500,340=>500,341=>500,342=>500,343=>500,344=>500, -345=>500,346=>500,347=>500,348=>500,349=>500,350=>500,351=>500,354=>500,355=>500,356=>500, -357=>500,358=>500,359=>500,360=>500,361=>500,362=>500,363=>500,364=>500,365=>500,366=>500, -367=>500,368=>500,369=>500,370=>500,371=>500,372=>500,373=>500,374=>500,375=>500,377=>500, -378=>500,379=>500,380=>500,383=>500,384=>500,385=>500,386=>500,387=>500,388=>500,389=>500, -390=>500,391=>500,392=>500,393=>500,394=>500,395=>500,396=>500,397=>500,398=>500,399=>500, -400=>500,401=>500,403=>500,404=>500,405=>500,406=>500,407=>500,408=>500,409=>500,410=>500, -411=>500,412=>500,413=>500,414=>500,415=>500,416=>500,417=>500,418=>500,419=>500,420=>500, -421=>500,422=>500,423=>500,424=>500,425=>500,426=>500,427=>500,428=>500,429=>500,430=>500, -431=>500,432=>500,433=>500,434=>500,435=>500,436=>500,437=>500,438=>500,439=>500,440=>500, -441=>500,442=>500,443=>500,444=>500,445=>500,446=>500,447=>500,448=>500,449=>500,450=>500, -451=>500,452=>500,453=>500,454=>500,455=>500,456=>500,457=>500,458=>500,459=>500,460=>500, -461=>500,462=>500,463=>500,464=>500,465=>500,466=>500,467=>500,468=>500,469=>500,470=>500, -471=>500,472=>500,473=>500,474=>500,475=>500,476=>500,477=>500,478=>500,479=>500,480=>500, -481=>500,482=>500,483=>500,484=>500,485=>500,486=>500,487=>500,488=>500,489=>500,490=>500, -491=>500,492=>500,493=>500,494=>500,495=>500,496=>500,497=>500,498=>500,499=>500,500=>500, -501=>500,502=>500,503=>500,504=>500,505=>500,506=>500,507=>500,508=>500,509=>500,510=>500, -511=>500,512=>500,513=>500,514=>500,515=>500,516=>500,517=>500,518=>500,519=>500,520=>500, -521=>500,522=>500,523=>500,524=>500,525=>500,526=>500,527=>500,528=>500,529=>500,530=>500, -531=>500,532=>500,533=>500,534=>500,535=>500,536=>500,537=>500,538=>500,539=>500,540=>500, -541=>500,542=>500,543=>500,544=>500,545=>500,546=>500,547=>500,548=>500,549=>500,550=>500, -551=>500,552=>500,553=>500,554=>500,555=>500,556=>500,557=>500,558=>500,559=>500,560=>500, -561=>500,562=>500,563=>500,564=>500,565=>500,566=>500,567=>500,568=>500,569=>500,570=>500, -571=>500,572=>500,573=>500,574=>500,575=>500,576=>500,577=>500,578=>500,579=>500,580=>500, -581=>500,582=>500,583=>500,584=>500,585=>500,586=>500,587=>500,588=>500,589=>500,590=>500, -591=>500,592=>500,593=>500,594=>500,595=>500,596=>500,597=>500,598=>500,599=>500,600=>500, -601=>500,602=>500,603=>500,604=>500,605=>500,606=>500,607=>500,608=>500,609=>500,610=>500, -611=>500,612=>500,613=>500,614=>500,615=>500,616=>500,617=>500,618=>500,619=>500,620=>500, -621=>500,622=>500,623=>500,624=>500,625=>500,626=>500,627=>500,628=>500,629=>500,630=>500, -631=>500,632=>500,633=>500,634=>500,635=>500,636=>500,637=>500,638=>500,639=>500,640=>500, -641=>500,642=>500,643=>500,644=>500,645=>500,646=>500,647=>500,648=>500,649=>500,650=>500, -651=>500,652=>500,653=>500,654=>500,655=>500,656=>500,657=>500,658=>500,659=>500,660=>500, -661=>500,662=>500,663=>500,664=>500,665=>500,666=>500,667=>500,668=>500,669=>500,670=>500, -671=>500,672=>500,673=>500,674=>500,675=>500,676=>500,677=>500,678=>500,679=>500,680=>500, -681=>500,682=>500,683=>500,684=>500,685=>500,686=>500,687=>500,688=>500,689=>500,690=>500, -691=>500,692=>500,693=>500,694=>500,695=>500,696=>500,697=>500,698=>500,699=>500,700=>500, -701=>500,702=>500,703=>500,704=>500,705=>500,706=>500,707=>500,708=>500,709=>500,711=>500, -712=>500,713=>500,714=>500,715=>500,716=>500,717=>500,718=>500,719=>500,720=>500,721=>500, -722=>500,723=>500,724=>500,725=>500,726=>500,727=>500,728=>500,729=>500,730=>500,731=>500, -733=>500,734=>500,735=>500,736=>500,737=>500,738=>500,739=>500,740=>500,741=>500,742=>500, -743=>500,744=>500,745=>500,746=>500,747=>500,748=>500,749=>500,750=>500,751=>500,752=>500, -753=>500,754=>500,755=>500,756=>500,757=>500,758=>500,759=>500,760=>500,761=>500,762=>500, -763=>500,764=>500,765=>500,766=>500,767=>500,768=>0,769=>0,770=>0,771=>0,772=>0, -773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0, -783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0, -793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0, -803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0, -813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0, -823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0, -833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0, -843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0, -853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0, -863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0, -873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,880=>500,881=>500,882=>500, -883=>500,884=>500,885=>500,886=>500,887=>500,888=>500,889=>500,890=>500,891=>500,892=>500, -893=>500,894=>500,895=>500,896=>500,897=>500,898=>500,899=>500,900=>500,901=>500,902=>500, -903=>500,904=>500,905=>500,906=>500,907=>500,908=>500,909=>500,910=>500,911=>500,912=>500, -913=>500,914=>500,915=>500,916=>500,917=>500,918=>500,919=>500,920=>500,921=>500,922=>500, -923=>500,924=>500,925=>500,926=>500,927=>500,928=>500,929=>500,930=>500,931=>500,932=>500, -933=>500,934=>500,935=>500,936=>500,937=>500,938=>500,939=>500,940=>500,941=>500,942=>500, -943=>500,944=>500,945=>500,946=>500,947=>500,948=>500,949=>500,950=>500,951=>500,952=>500, -953=>500,954=>500,955=>500,956=>500,957=>500,958=>500,959=>500,960=>500,961=>500,962=>500, -963=>500,964=>500,965=>500,966=>500,967=>500,968=>500,969=>500,970=>500,971=>500,972=>500, -973=>500,974=>500,975=>500,976=>500,977=>500,978=>500,979=>500,980=>500,981=>500,982=>500, -983=>500,984=>500,985=>500,986=>500,987=>500,988=>500,989=>500,990=>500,991=>500,992=>500, -993=>500,994=>500,995=>500,996=>500,997=>500,998=>500,999=>500,1000=>500,1001=>500,1002=>500, -1003=>500,1004=>500,1005=>500,1006=>500,1007=>500,1008=>500,1009=>500,1010=>500,1011=>500,1012=>500, -1013=>500,1014=>500,1015=>500,1016=>500,1017=>500,1018=>500,1019=>500,1020=>500,1021=>500,1022=>500, -1023=>500,1024=>500,1025=>500,1026=>500,1027=>500,1028=>500,1029=>500,1030=>500,1031=>500,1032=>500, -1033=>500,1034=>500,1035=>500,1036=>500,1037=>500,1038=>500,1039=>500,1040=>500,1041=>500,1042=>500, -1043=>500,1044=>500,1045=>500,1046=>500,1047=>500,1048=>500,1049=>500,1050=>500,1051=>500,1052=>500, -1053=>500,1054=>500,1055=>500,1056=>500,1057=>500,1058=>500,1059=>500,1060=>500,1061=>500,1062=>500, -1063=>500,1064=>500,1065=>500,1066=>500,1067=>500,1068=>500,1069=>500,1070=>500,1071=>500,1072=>500, -1073=>500,1074=>500,1075=>500,1076=>500,1077=>500,1078=>500,1079=>500,1080=>500,1081=>500,1082=>500, -1083=>500,1084=>500,1085=>500,1086=>500,1087=>500,1088=>500,1089=>500,1090=>500,1091=>500,1092=>500, -1093=>500,1094=>500,1095=>500,1096=>500,1097=>500,1098=>500,1099=>500,1100=>500,1101=>500,1102=>500, -1103=>500,1104=>500,1105=>500,1106=>500,1107=>500,1108=>500,1109=>500,1110=>500,1111=>500,1112=>500, -1113=>500,1114=>500,1115=>500,1116=>500,1117=>500,1118=>500,1119=>500,1120=>500,1121=>500,1122=>500, -1123=>500,1124=>500,1125=>500,1126=>500,1127=>500,1128=>500,1129=>500,1130=>500,1131=>500,1132=>500, -1133=>500,1134=>500,1135=>500,1136=>500,1137=>500,1138=>500,1139=>500,1140=>500,1141=>500,1142=>500, -1143=>500,1144=>500,1145=>500,1146=>500,1147=>500,1148=>500,1149=>500,1150=>500,1151=>500,1152=>500, -1153=>500,1154=>500,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>500, -1163=>500,1164=>500,1165=>500,1166=>500,1167=>500,1168=>500,1169=>500,1170=>500,1171=>500,1172=>500, -1173=>500,1174=>500,1175=>500,1176=>500,1177=>500,1178=>500,1179=>500,1180=>500,1181=>500,1182=>500, -1183=>500,1184=>500,1185=>500,1186=>500,1187=>500,1188=>500,1189=>500,1190=>500,1191=>500,1192=>500, -1193=>500,1194=>500,1195=>500,1196=>500,1197=>500,1198=>500,1199=>500,1200=>500,1201=>500,1202=>500, -1203=>500,1204=>500,1205=>500,1206=>500,1207=>500,1208=>500,1209=>500,1210=>500,1211=>500,1212=>500, -1213=>500,1214=>500,1215=>500,1216=>500,1217=>500,1218=>500,1219=>500,1220=>500,1221=>500,1222=>500, -1223=>500,1224=>500,1225=>500,1226=>500,1227=>500,1228=>500,1229=>500,1230=>500,1231=>500,1232=>500, -1233=>500,1234=>500,1235=>500,1236=>500,1237=>500,1238=>500,1239=>500,1240=>500,1241=>500,1242=>500, -1243=>500,1244=>500,1245=>500,1246=>500,1247=>500,1248=>500,1249=>500,1250=>500,1251=>500,1252=>500, -1253=>500,1254=>500,1255=>500,1256=>500,1257=>500,1258=>500,1259=>500,1260=>500,1261=>500,1262=>500, -1263=>500,1264=>500,1265=>500,1266=>500,1267=>500,1268=>500,1269=>500,1270=>500,1271=>500,1272=>500, -1273=>500,1274=>500,1275=>500,1276=>500,1277=>500,1278=>500,1279=>500,1280=>500,1281=>500,1282=>500, -1283=>500,1284=>500,1285=>500,1286=>500,1287=>500,1288=>500,1289=>500,1290=>500,1291=>500,1292=>500, -1293=>500,1294=>500,1295=>500,1296=>500,1297=>500,1298=>500,1299=>500,1300=>500,1301=>500,1302=>500, -1303=>500,1304=>500,1305=>500,1306=>500,1307=>500,1308=>500,1309=>500,1310=>500,1311=>500,1312=>500, -1313=>500,1314=>500,1315=>500,1316=>500,1317=>500,1318=>500,1319=>500,1320=>500,1321=>500,1322=>500, -1323=>500,1324=>500,1325=>500,1326=>500,1327=>500,1328=>500,1329=>500,1330=>500,1331=>500,1332=>500, -1333=>500,1334=>500,1335=>500,1336=>500,1337=>500,1338=>500,1339=>500,1340=>500,1341=>500,1342=>500, -1343=>500,1344=>500,1345=>500,1346=>500,1347=>500,1348=>500,1349=>500,1350=>500,1351=>500,1352=>500, -1353=>500,1354=>500,1355=>500,1356=>500,1357=>500,1358=>500,1359=>500,1360=>500,1361=>500,1362=>500, -1363=>500,1364=>500,1365=>500,1366=>500,1367=>500,1368=>500,1369=>500,1370=>500,1371=>500,1372=>500, -1373=>500,1374=>500,1375=>500,1376=>500,1377=>500,1378=>500,1379=>500,1380=>500,1381=>500,1382=>500, -1383=>500,1384=>500,1385=>500,1386=>500,1387=>500,1388=>500,1389=>500,1390=>500,1391=>500,1392=>500, -1393=>500,1394=>500,1395=>500,1396=>500,1397=>500,1398=>500,1399=>500,1400=>500,1401=>500,1402=>500, -1403=>500,1404=>500,1405=>500,1406=>500,1407=>500,1408=>500,1409=>500,1410=>500,1411=>500,1412=>500, -1413=>500,1414=>500,1415=>500,1416=>500,1417=>500,1418=>500,1419=>500,1420=>500,1421=>500,1422=>500, -1423=>500,1424=>500,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>0,1432=>0, -1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0, -1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0, -1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0, -1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>500,1471=>0,1472=>500, -1473=>0,1474=>0,1475=>500,1476=>0,1477=>0,1478=>500,1479=>0,1480=>500,1481=>500,1482=>500, -1483=>500,1484=>500,1485=>500,1486=>500,1487=>500,1488=>500,1489=>500,1490=>500,1491=>500,1492=>500, -1493=>500,1494=>500,1495=>500,1496=>500,1497=>500,1498=>500,1499=>500,1500=>500,1501=>500,1502=>500, -1503=>500,1504=>500,1505=>500,1506=>500,1507=>500,1508=>500,1509=>500,1510=>500,1511=>500,1512=>500, -1513=>500,1514=>500,1515=>500,1516=>500,1517=>500,1518=>500,1519=>500,1520=>500,1521=>500,1522=>500, -1523=>500,1524=>500,1525=>500,1526=>500,1527=>500,1528=>500,1529=>500,1530=>500,1531=>500,1532=>500, -1533=>500,1534=>500,1535=>500,1536=>1000,1537=>1000,1538=>1000,1539=>1000,1540=>500,1541=>500,1542=>1000, -1543=>1000,1544=>1000,1545=>500,1546=>500,1547=>1000,1548=>500,1549=>500,1550=>1000,1551=>1000,1552=>0, -1553=>0,1554=>0,1555=>0,1556=>0,1557=>0,1558=>0,1559=>0,1560=>0,1561=>0,1562=>0, -1563=>500,1564=>500,1565=>500,1566=>1000,1567=>500,1568=>500,1569=>500,1570=>500,1571=>500,1572=>500, -1573=>500,1574=>500,1575=>500,1576=>500,1577=>500,1578=>500,1579=>500,1580=>500,1581=>500,1582=>500, -1583=>500,1584=>500,1585=>500,1586=>500,1587=>500,1588=>500,1589=>500,1590=>500,1591=>500,1592=>500, -1593=>500,1594=>500,1595=>500,1596=>500,1597=>500,1598=>500,1599=>500,1600=>500,1601=>500,1602=>500, -1603=>500,1604=>500,1605=>500,1606=>500,1607=>1000,1608=>500,1609=>500,1610=>500,1611=>0,1612=>0, -1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1622=>0, -1623=>0,1624=>0,1625=>0,1626=>0,1627=>0,1628=>0,1629=>0,1630=>0,1631=>500,1632=>500, -1633=>500,1634=>500,1635=>500,1636=>500,1637=>500,1638=>500,1639=>500,1640=>500,1641=>500,1642=>500, -1643=>500,1644=>500,1645=>500,1646=>500,1647=>1000,1648=>0,1649=>500,1650=>500,1651=>500,1652=>500, -1653=>500,1654=>500,1655=>500,1656=>500,1657=>500,1658=>500,1659=>500,1660=>500,1661=>500,1662=>500, -1663=>500,1664=>500,1665=>500,1666=>500,1667=>500,1668=>500,1669=>500,1670=>500,1671=>500,1672=>500, -1673=>500,1674=>500,1675=>500,1676=>500,1677=>500,1678=>500,1679=>500,1680=>500,1681=>500,1682=>500, -1683=>500,1684=>500,1685=>500,1686=>500,1687=>500,1688=>500,1689=>500,1690=>500,1691=>500,1692=>500, -1693=>500,1694=>500,1695=>500,1696=>500,1697=>500,1698=>500,1699=>500,1700=>500,1701=>500,1702=>500, -1703=>500,1704=>500,1705=>500,1706=>1000,1707=>500,1708=>500,1709=>500,1710=>500,1711=>500,1712=>500, -1713=>500,1714=>500,1715=>500,1716=>500,1717=>500,1718=>500,1719=>500,1720=>500,1721=>500,1722=>500, -1723=>500,1724=>500,1725=>500,1726=>500,1727=>500,1728=>500,1729=>500,1730=>500,1731=>500,1732=>500, -1733=>500,1734=>500,1735=>500,1736=>500,1737=>500,1738=>500,1739=>500,1740=>500,1741=>500,1742=>500, -1743=>500,1744=>500,1745=>500,1746=>500,1747=>500,1748=>500,1749=>500,1750=>0,1751=>0,1752=>0, -1753=>0,1754=>0,1755=>0,1756=>0,1757=>1000,1758=>0,1759=>0,1760=>0,1761=>0,1762=>0, -1763=>0,1764=>0,1765=>500,1766=>500,1767=>0,1768=>0,1769=>1000,1770=>0,1771=>0,1772=>0, -1773=>0,1774=>500,1775=>500,1776=>500,1777=>500,1778=>500,1779=>500,1780=>500,1781=>500,1782=>500, -1783=>500,1784=>500,1785=>500,1786=>500,1787=>500,1788=>500,1789=>500,1790=>500,1791=>1000,1792=>1000, -1793=>500,1794=>500,1795=>500,1796=>500,1797=>500,1798=>500,1799=>500,1800=>500,1801=>500,1802=>500, -1803=>1000,1804=>1000,1805=>1000,1806=>500,1807=>1000,1808=>1000,1809=>0,1810=>1000,1811=>1000,1812=>1000, -1813=>500,1814=>500,1815=>1000,1816=>1000,1817=>500,1818=>1000,1819=>1000,1820=>1000,1821=>500,1822=>1000, -1823=>1000,1824=>1000,1825=>1000,1826=>1000,1827=>1000,1828=>1000,1829=>1000,1830=>1000,1831=>1000,1832=>1000, -1833=>1000,1834=>500,1835=>1000,1836=>1000,1837=>1000,1838=>1000,1839=>500,1840=>0,1841=>0,1842=>0, -1843=>0,1844=>0,1845=>0,1846=>0,1847=>0,1848=>0,1849=>0,1850=>0,1851=>0,1852=>0, -1853=>0,1854=>0,1855=>0,1856=>0,1857=>0,1858=>0,1859=>0,1860=>0,1861=>0,1862=>0, -1863=>0,1864=>0,1865=>0,1866=>0,1867=>500,1868=>500,1869=>1000,1870=>1000,1871=>1000,1872=>500, -1873=>500,1874=>500,1875=>500,1876=>500,1877=>500,1878=>500,1879=>500,1880=>500,1881=>500,1882=>500, -1883=>500,1884=>500,1885=>500,1886=>500,1887=>500,1888=>500,1889=>500,1890=>500,1891=>500,1892=>500, -1893=>500,1894=>500,1895=>500,1896=>500,1897=>500,1898=>500,1899=>500,1900=>500,1901=>500,1902=>500, -1903=>500,1904=>500,1905=>500,1906=>500,1907=>500,1908=>500,1909=>500,1910=>500,1911=>500,1912=>500, -1913=>500,1914=>500,1915=>500,1916=>500,1917=>500,1918=>500,1919=>500,1920=>500,1921=>500,1922=>500, -1923=>500,1924=>500,1925=>500,1926=>500,1927=>500,1928=>500,1929=>500,1930=>500,1931=>500,1932=>500, -1933=>500,1934=>500,1935=>500,1936=>1000,1937=>500,1938=>500,1939=>500,1940=>500,1941=>500,1942=>500, -1943=>500,1944=>500,1945=>500,1946=>500,1947=>500,1948=>500,1949=>1000,1950=>1000,1951=>1000,1952=>500, -1953=>500,1954=>500,1955=>500,1956=>500,1957=>500,1958=>0,1959=>0,1960=>0,1961=>0,1962=>0, -1963=>0,1964=>0,1965=>0,1966=>0,1967=>0,1968=>0,1969=>500,1970=>500,1971=>500,1972=>500, -1973=>500,1974=>500,1975=>500,1976=>500,1977=>500,1978=>500,1979=>500,1980=>500,1981=>500,1982=>500, -1983=>500,1984=>500,1985=>500,1986=>500,1987=>500,1988=>500,1989=>500,1990=>500,1991=>500,1992=>500, -1993=>500,1994=>500,1995=>500,1996=>500,1997=>500,1998=>500,1999=>500,2000=>500,2001=>500,2002=>500, -2003=>500,2004=>500,2005=>500,2006=>500,2007=>500,2008=>500,2009=>500,2010=>500,2011=>500,2012=>500, -2013=>500,2014=>500,2015=>500,2016=>500,2017=>500,2018=>500,2019=>500,2020=>500,2021=>500,2022=>500, -2023=>500,2024=>500,2025=>500,2026=>500,2027=>0,2028=>0,2029=>0,2030=>0,2031=>0,2032=>0, -2033=>0,2034=>0,2035=>0,2036=>500,2037=>500,2038=>500,2039=>500,2040=>500,2041=>500,2042=>500, -2043=>500,2044=>500,2045=>500,2046=>500,2047=>500,2048=>500,2049=>500,2050=>500,2051=>500,2052=>500, -2053=>500,2054=>500,2055=>500,2056=>500,2057=>500,2058=>500,2059=>500,2060=>500,2061=>500,2062=>500, -2063=>500,2064=>500,2065=>500,2066=>500,2067=>500,2068=>500,2069=>500,2070=>500,2071=>500,2072=>500, -2073=>500,2074=>500,2075=>500,2076=>500,2077=>500,2078=>500,2079=>500,2080=>500,2081=>500,2082=>500, -2083=>500,2084=>500,2085=>500,2086=>500,2087=>500,2088=>500,2089=>500,2090=>500,2091=>500,2092=>500, -2093=>500,2094=>500,2095=>500,2096=>500,2097=>500,2098=>500,2099=>500,2100=>500,2101=>500,2102=>500, -2103=>500,2104=>500,2105=>500,2106=>500,2107=>500,2108=>500,2109=>500,2110=>500,2111=>500,2112=>500, -2113=>500,2114=>500,2115=>500,2116=>500,2117=>500,2118=>500,2119=>500,2120=>500,2121=>500,2122=>500, -2123=>500,2124=>500,2125=>500,2126=>500,2127=>500,2128=>500,2129=>500,2130=>500,2131=>500,2132=>500, -2133=>500,2134=>500,2135=>500,2136=>500,2137=>500,2138=>500,2139=>500,2140=>500,2141=>500,2142=>500, -2143=>500,2144=>500,2145=>500,2146=>500,2147=>500,2148=>500,2149=>500,2150=>500,2151=>500,2152=>500, -2153=>500,2154=>500,2155=>500,2156=>500,2157=>500,2158=>500,2159=>500,2160=>500,2161=>500,2162=>500, -2163=>500,2164=>500,2165=>500,2166=>500,2167=>500,2168=>500,2169=>500,2170=>500,2171=>500,2172=>500, -2173=>500,2174=>500,2175=>500,2176=>500,2177=>500,2178=>500,2179=>500,2180=>500,2181=>500,2182=>500, -2183=>500,2184=>500,2185=>500,2186=>500,2187=>500,2188=>500,2189=>500,2190=>500,2191=>500,2192=>500, -2193=>500,2194=>500,2195=>500,2196=>500,2197=>500,2198=>500,2199=>500,2200=>500,2201=>500,2202=>500, -2203=>500,2204=>500,2205=>500,2206=>500,2207=>500,2208=>500,2209=>500,2210=>500,2211=>500,2212=>500, -2213=>500,2214=>500,2215=>500,2216=>500,2217=>500,2218=>500,2219=>500,2220=>500,2221=>500,2222=>500, -2223=>500,2224=>500,2225=>500,2226=>500,2227=>500,2228=>500,2229=>500,2230=>500,2231=>500,2232=>500, -2233=>500,2234=>500,2235=>500,2236=>500,2237=>500,2238=>500,2239=>500,2240=>500,2241=>500,2242=>500, -2243=>500,2244=>500,2245=>500,2246=>500,2247=>500,2248=>500,2249=>500,2250=>500,2251=>500,2252=>500, -2253=>500,2254=>500,2255=>500,2256=>500,2257=>500,2258=>500,2259=>500,2260=>500,2261=>500,2262=>500, -2263=>500,2264=>500,2265=>500,2266=>500,2267=>500,2268=>500,2269=>500,2270=>500,2271=>500,2272=>500, -2273=>500,2274=>500,2275=>500,2276=>500,2277=>500,2278=>500,2279=>500,2280=>500,2281=>500,2282=>500, -2283=>500,2284=>500,2285=>500,2286=>500,2287=>500,2288=>500,2289=>500,2290=>500,2291=>500,2292=>500, -2293=>500,2294=>500,2295=>500,2296=>500,2297=>500,2298=>500,2299=>500,2300=>500,2301=>500,2302=>500, -2303=>500,2304=>500,2305=>0,2306=>0,2307=>0,2308=>1000,2309=>1000,2310=>1000,2311=>1000,2312=>1000, -2313=>1000,2314=>1000,2315=>1000,2316=>1000,2317=>1000,2318=>1000,2319=>1000,2320=>1000,2321=>1000,2322=>1000, -2323=>1000,2324=>1000,2325=>1000,2326=>1000,2327=>1000,2328=>1000,2329=>1000,2330=>1000,2331=>1000,2332=>1000, -2333=>1000,2334=>1000,2335=>1000,2336=>1000,2337=>1000,2338=>1000,2339=>1000,2340=>1000,2341=>1000,2342=>1000, -2343=>1000,2344=>1000,2345=>1000,2346=>1000,2347=>1000,2348=>1000,2349=>1000,2350=>1000,2351=>1000,2352=>1000, -2353=>1000,2354=>1000,2355=>1000,2356=>1000,2357=>1000,2358=>1000,2359=>1000,2360=>1000,2361=>1000,2362=>500, -2363=>500,2364=>0,2365=>1000,2366=>0,2367=>0,2368=>0,2369=>0,2370=>0,2371=>0,2372=>0, -2373=>0,2374=>0,2375=>0,2376=>0,2377=>0,2378=>0,2379=>0,2380=>0,2381=>0,2382=>500, -2383=>500,2384=>1000,2385=>0,2386=>0,2387=>0,2388=>0,2389=>500,2390=>500,2391=>500,2392=>1000, -2393=>1000,2394=>1000,2395=>1000,2396=>1000,2397=>1000,2398=>1000,2399=>1000,2400=>1000,2401=>1000,2402=>0, -2403=>0,2404=>1000,2405=>1000,2406=>1000,2407=>1000,2408=>1000,2409=>1000,2410=>1000,2411=>1000,2412=>1000, -2413=>1000,2414=>1000,2415=>1000,2416=>1000,2417=>1000,2418=>1000,2419=>500,2420=>500,2421=>500,2422=>500, -2423=>500,2424=>500,2425=>500,2426=>500,2427=>1000,2428=>1000,2429=>1000,2430=>1000,2431=>1000,2432=>500, -2433=>0,2434=>0,2435=>0,2436=>500,2437=>1000,2438=>1000,2439=>1000,2440=>1000,2441=>1000,2442=>1000, -2443=>1000,2444=>1000,2445=>500,2446=>500,2447=>1000,2448=>1000,2449=>500,2450=>500,2451=>1000,2452=>1000, -2453=>1000,2454=>1000,2455=>1000,2456=>1000,2457=>1000,2458=>1000,2459=>1000,2460=>1000,2461=>1000,2462=>1000, -2463=>1000,2464=>1000,2465=>1000,2466=>1000,2467=>1000,2468=>1000,2469=>1000,2470=>1000,2471=>1000,2472=>1000, -2473=>500,2474=>1000,2475=>1000,2476=>1000,2477=>1000,2478=>1000,2479=>1000,2480=>1000,2481=>500,2482=>1000, -2483=>500,2484=>500,2485=>500,2486=>1000,2487=>1000,2488=>1000,2489=>1000,2490=>500,2491=>500,2492=>0, -2493=>1000,2494=>0,2495=>0,2496=>0,2497=>0,2498=>0,2499=>0,2500=>0,2501=>500,2502=>500, -2503=>0,2504=>0,2505=>500,2506=>500,2507=>0,2508=>0,2509=>0,2510=>1000,2511=>500,2512=>500, -2513=>500,2514=>500,2515=>500,2516=>500,2517=>500,2518=>500,2519=>0,2520=>500,2521=>500,2522=>500, -2523=>500,2524=>1000,2525=>1000,2526=>500,2527=>1000,2528=>1000,2529=>1000,2530=>0,2531=>0,2532=>500, -2533=>500,2534=>1000,2535=>1000,2536=>1000,2537=>1000,2538=>1000,2539=>1000,2540=>1000,2541=>1000,2542=>1000, -2543=>1000,2544=>1000,2545=>1000,2546=>1000,2547=>1000,2548=>1000,2549=>1000,2550=>1000,2551=>1000,2552=>1000, -2553=>1000,2554=>1000,2555=>500,2556=>500,2557=>500,2558=>500,2559=>500,2560=>500,2561=>0,2562=>0, -2563=>0,2564=>500,2565=>1000,2566=>1000,2567=>1000,2568=>1000,2569=>1000,2570=>1000,2571=>500,2572=>500, -2573=>500,2574=>500,2575=>1000,2576=>1000,2577=>500,2578=>500,2579=>1000,2580=>1000,2581=>1000,2582=>1000, -2583=>1000,2584=>1000,2585=>1000,2586=>1000,2587=>1000,2588=>1000,2589=>1000,2590=>1000,2591=>1000,2592=>1000, -2593=>1000,2594=>1000,2595=>1000,2596=>1000,2597=>1000,2598=>1000,2599=>1000,2600=>1000,2601=>500,2602=>1000, -2603=>1000,2604=>1000,2605=>1000,2606=>1000,2607=>1000,2608=>1000,2609=>500,2610=>1000,2611=>1000,2612=>500, -2613=>1000,2614=>1000,2615=>500,2616=>1000,2617=>1000,2618=>500,2619=>500,2620=>0,2621=>500,2622=>0, -2623=>0,2624=>0,2625=>0,2626=>0,2627=>500,2628=>500,2629=>500,2630=>500,2631=>0,2632=>0, -2633=>500,2634=>500,2635=>0,2636=>0,2637=>0,2638=>500,2639=>500,2640=>500,2641=>0,2642=>500, -2643=>500,2644=>500,2645=>500,2646=>500,2647=>500,2648=>500,2649=>1000,2650=>1000,2651=>1000,2652=>1000, -2653=>500,2654=>1000,2655=>500,2656=>500,2657=>500,2658=>500,2659=>500,2660=>500,2661=>500,2662=>1000, -2663=>1000,2664=>1000,2665=>1000,2666=>1000,2667=>1000,2668=>1000,2669=>1000,2670=>1000,2671=>1000,2672=>0, -2673=>0,2674=>1000,2675=>1000,2676=>1000,2677=>0,2678=>500,2679=>500,2680=>500,2681=>500,2682=>500, -2683=>500,2684=>500,2685=>500,2686=>500,2687=>500,2688=>500,2689=>0,2690=>0,2691=>0,2692=>500, -2693=>1000,2694=>1000,2695=>1000,2696=>1000,2697=>1000,2698=>1000,2699=>1000,2700=>1000,2701=>1000,2702=>500, -2703=>1000,2704=>1000,2705=>1000,2706=>500,2707=>1000,2708=>1000,2709=>1000,2710=>1000,2711=>1000,2712=>1000, -2713=>1000,2714=>1000,2715=>1000,2716=>1000,2717=>1000,2718=>1000,2719=>500,2720=>1000,2721=>500,2722=>1000, -2723=>1000,2724=>1000,2725=>1000,2726=>1000,2727=>1000,2728=>1000,2729=>500,2730=>1000,2731=>1000,2732=>1000, -2733=>1000,2734=>1000,2735=>1000,2736=>1000,2737=>500,2738=>1000,2739=>1000,2740=>500,2741=>1000,2742=>1000, -2743=>1000,2744=>1000,2745=>1000,2746=>500,2747=>500,2748=>0,2749=>500,2750=>0,2751=>0,2752=>0, -2753=>0,2754=>0,2755=>0,2756=>0,2757=>0,2758=>500,2759=>0,2760=>0,2761=>0,2762=>500, -2763=>0,2764=>0,2765=>0,2766=>500,2767=>500,2768=>1000,2769=>500,2770=>500,2771=>500,2772=>500, -2773=>500,2774=>500,2775=>500,2776=>500,2777=>500,2778=>500,2779=>500,2780=>500,2781=>500,2782=>500, -2783=>500,2784=>1000,2785=>1000,2786=>0,2787=>0,2788=>500,2789=>500,2790=>1000,2791=>1000,2792=>1000, -2793=>1000,2794=>1000,2795=>1000,2796=>1000,2797=>1000,2798=>1000,2799=>1000,2800=>500,2801=>1000,2802=>500, -2803=>500,2804=>500,2805=>500,2806=>500,2807=>500,2808=>500,2809=>500,2810=>500,2811=>500,2812=>500, -2813=>500,2814=>500,2815=>500,2816=>500,2817=>0,2818=>0,2819=>0,2820=>500,2821=>1000,2822=>1000, -2823=>1000,2824=>1000,2825=>1000,2826=>1000,2827=>1000,2828=>1000,2829=>500,2830=>500,2831=>500,2832=>1000, -2833=>500,2834=>500,2835=>1000,2836=>1000,2837=>1000,2838=>1000,2839=>1000,2840=>1000,2841=>1000,2842=>1000, -2843=>1000,2844=>1000,2845=>1000,2846=>1000,2847=>1000,2848=>1000,2849=>1000,2850=>1000,2851=>1000,2852=>1000, -2853=>1000,2854=>1000,2855=>1000,2856=>1000,2857=>500,2858=>1000,2859=>1000,2860=>1000,2861=>1000,2862=>1000, -2863=>1000,2864=>1000,2865=>500,2866=>1000,2867=>1000,2868=>500,2869=>1000,2870=>1000,2871=>1000,2872=>1000, -2873=>1000,2874=>500,2875=>500,2876=>0,2877=>500,2878=>0,2879=>0,2880=>0,2881=>0,2882=>0, -2883=>0,2884=>0,2885=>500,2886=>500,2887=>0,2888=>0,2889=>500,2890=>500,2891=>0,2892=>0, -2893=>0,2894=>500,2895=>500,2896=>500,2897=>500,2898=>500,2899=>500,2900=>500,2901=>500,2902=>0, -2903=>0,2904=>500,2905=>500,2906=>500,2907=>500,2908=>1000,2909=>1000,2910=>500,2911=>1000,2912=>1000, -2913=>1000,2914=>0,2915=>0,2916=>500,2917=>500,2918=>1000,2919=>1000,2920=>1000,2921=>1000,2922=>1000, -2923=>1000,2924=>1000,2925=>1000,2926=>1000,2927=>1000,2928=>1000,2929=>1000,2930=>500,2931=>500,2932=>500, -2933=>500,2934=>500,2935=>500,2936=>500,2937=>500,2938=>500,2939=>500,2940=>500,2941=>500,2942=>500, -2943=>500,2944=>500,2945=>500,2946=>0,2947=>1000,2948=>500,2949=>1000,2950=>1000,2951=>1000,2952=>1000, -2953=>1000,2954=>1000,2955=>500,2956=>500,2957=>500,2958=>1000,2959=>1000,2960=>1000,2961=>500,2962=>1000, -2963=>1000,2964=>1000,2965=>1000,2966=>500,2967=>500,2968=>500,2969=>1000,2970=>1000,2971=>500,2972=>1000, -2973=>500,2974=>1000,2975=>1000,2976=>500,2977=>500,2978=>500,2979=>1000,2980=>1000,2981=>500,2982=>500, -2983=>500,2984=>1000,2985=>1000,2986=>1000,2987=>500,2988=>500,2989=>500,2990=>1000,2991=>1000,2992=>1000, -2993=>1000,2994=>1000,2995=>1000,2996=>1000,2997=>1000,2998=>1000,2999=>1000,3000=>1000,3001=>1000,3002=>500, -3003=>500,3004=>500,3005=>500,3006=>0,3007=>0,3008=>0,3009=>0,3010=>0,3011=>500,3012=>500, -3013=>500,3014=>0,3015=>0,3016=>0,3017=>500,3018=>0,3019=>0,3020=>0,3021=>0,3022=>500, -3023=>500,3024=>0,3025=>500,3026=>500,3027=>500,3028=>500,3029=>500,3030=>500,3031=>0,3032=>500, -3033=>500,3034=>500,3035=>500,3036=>500,3037=>500,3038=>500,3039=>500,3040=>500,3041=>500,3042=>500, -3043=>500,3044=>500,3045=>500,3046=>1000,3047=>1000,3048=>1000,3049=>1000,3050=>1000,3051=>1000,3052=>1000, -3053=>1000,3054=>1000,3055=>1000,3056=>1000,3057=>1000,3058=>1000,3059=>1000,3060=>1000,3061=>1000,3062=>1000, -3063=>1000,3064=>1000,3065=>1000,3066=>1000,3067=>500,3068=>500,3069=>500,3070=>500,3071=>500,3072=>500, -3073=>0,3074=>0,3075=>0,3076=>500,3077=>1000,3078=>1000,3079=>1000,3080=>1000,3081=>1000,3082=>1000, -3083=>1000,3084=>1000,3085=>500,3086=>1000,3087=>1000,3088=>1000,3089=>500,3090=>1000,3091=>1000,3092=>1000, -3093=>1000,3094=>1000,3095=>1000,3096=>1000,3097=>1000,3098=>1000,3099=>1000,3100=>1000,3101=>1000,3102=>1000, -3103=>1000,3104=>1000,3105=>1000,3106=>1000,3107=>1000,3108=>1000,3109=>1000,3110=>1000,3111=>1000,3112=>1000, -3113=>500,3114=>1000,3115=>1000,3116=>1000,3117=>1000,3118=>1000,3119=>1000,3120=>1000,3121=>1000,3122=>1000, -3123=>1000,3124=>500,3125=>1000,3126=>1000,3127=>1000,3128=>1000,3129=>1000,3130=>500,3131=>500,3132=>500, -3133=>1000,3134=>0,3135=>0,3136=>0,3137=>0,3138=>0,3139=>0,3140=>0,3141=>500,3142=>0, -3143=>0,3144=>0,3145=>500,3146=>0,3147=>0,3148=>0,3149=>0,3150=>500,3151=>500,3152=>500, -3153=>500,3154=>500,3155=>500,3156=>500,3157=>0,3158=>0,3159=>500,3160=>1000,3161=>1000,3162=>500, -3163=>500,3164=>500,3165=>500,3166=>500,3167=>500,3168=>1000,3169=>1000,3170=>0,3171=>0,3172=>500, -3173=>500,3174=>1000,3175=>1000,3176=>1000,3177=>1000,3178=>1000,3179=>1000,3180=>1000,3181=>1000,3182=>1000, -3183=>1000,3184=>500,3185=>500,3186=>500,3187=>500,3188=>500,3189=>500,3190=>500,3191=>500,3192=>1000, -3193=>1000,3194=>1000,3195=>1000,3196=>1000,3197=>1000,3198=>1000,3199=>1000,3200=>500,3201=>500,3202=>0, -3203=>0,3204=>500,3205=>1000,3206=>1000,3207=>1000,3208=>1000,3209=>1000,3210=>1000,3211=>1000,3212=>1000, -3213=>500,3214=>1000,3215=>1000,3216=>1000,3217=>500,3218=>1000,3219=>1000,3220=>1000,3221=>1000,3222=>1000, -3223=>1000,3224=>1000,3225=>1000,3226=>1000,3227=>1000,3228=>1000,3229=>1000,3230=>1000,3231=>1000,3232=>1000, -3233=>1000,3234=>1000,3235=>1000,3236=>1000,3237=>1000,3238=>1000,3239=>1000,3240=>1000,3241=>500,3242=>1000, -3243=>1000,3244=>1000,3245=>1000,3246=>1000,3247=>1000,3248=>1000,3249=>1000,3250=>1000,3251=>1000,3252=>500, -3253=>1000,3254=>1000,3255=>1000,3256=>1000,3257=>1000,3258=>500,3259=>500,3260=>0,3261=>500,3262=>0, -3263=>0,3264=>0,3265=>0,3266=>0,3267=>0,3268=>0,3269=>500,3270=>0,3271=>0,3272=>0, -3273=>500,3274=>0,3275=>0,3276=>0,3277=>0,3278=>500,3279=>500,3280=>500,3281=>500,3282=>500, -3283=>500,3284=>500,3285=>0,3286=>0,3287=>500,3288=>500,3289=>500,3290=>500,3291=>500,3292=>500, -3293=>500,3294=>1000,3295=>500,3296=>1000,3297=>1000,3298=>0,3299=>0,3300=>500,3301=>500,3302=>1000, -3303=>1000,3304=>1000,3305=>1000,3306=>1000,3307=>1000,3308=>1000,3309=>1000,3310=>1000,3311=>1000,3312=>500, -3313=>1000,3314=>1000,3315=>500,3316=>500,3317=>500,3318=>500,3319=>500,3320=>500,3321=>500,3322=>500, -3323=>500,3324=>500,3325=>500,3326=>500,3327=>500,3328=>500,3329=>500,3330=>0,3331=>0,3332=>500, -3333=>1000,3334=>1000,3335=>1000,3336=>1000,3337=>1000,3338=>1000,3339=>1000,3340=>1000,3341=>500,3342=>1000, -3343=>1000,3344=>1000,3345=>500,3346=>1000,3347=>1000,3348=>1000,3349=>1000,3350=>1000,3351=>1000,3352=>1000, -3353=>1000,3354=>1000,3355=>1000,3356=>1000,3357=>1000,3358=>1000,3359=>1000,3360=>1000,3361=>1000,3362=>1000, -3363=>1000,3364=>1000,3365=>1000,3366=>1000,3367=>1000,3368=>1000,3369=>500,3370=>1000,3371=>1000,3372=>1000, -3373=>1000,3374=>1000,3375=>1000,3376=>1000,3377=>1000,3378=>1000,3379=>1000,3380=>1000,3381=>1000,3382=>1000, -3383=>1000,3384=>1000,3385=>1000,3386=>500,3387=>500,3388=>500,3389=>1000,3390=>0,3391=>0,3392=>0, -3393=>0,3394=>0,3395=>0,3396=>0,3397=>500,3398=>0,3399=>0,3400=>0,3401=>500,3402=>0, -3403=>0,3404=>0,3405=>0,3406=>500,3407=>500,3408=>500,3409=>500,3410=>500,3411=>500,3412=>500, -3413=>500,3414=>500,3415=>0,3416=>500,3417=>500,3418=>500,3419=>500,3420=>500,3421=>500,3422=>500, -3423=>500,3424=>1000,3425=>1000,3426=>0,3427=>0,3428=>500,3429=>500,3430=>1000,3431=>1000,3432=>1000, -3433=>1000,3434=>1000,3435=>1000,3436=>1000,3437=>1000,3438=>1000,3439=>1000,3440=>1000,3441=>1000,3442=>1000, -3443=>1000,3444=>1000,3445=>1000,3446=>500,3447=>500,3448=>500,3449=>1000,3450=>1000,3451=>1000,3452=>1000, -3453=>1000,3454=>1000,3455=>1000,3456=>500,3457=>500,3458=>0,3459=>0,3460=>500,3461=>1000,3462=>1000, -3463=>1000,3464=>1000,3465=>1000,3466=>1000,3467=>1000,3468=>1000,3469=>1000,3470=>1000,3471=>1000,3472=>1000, -3473=>1000,3474=>1000,3475=>1000,3476=>1000,3477=>1000,3478=>1000,3479=>500,3480=>500,3481=>500,3482=>1000, -3483=>1000,3484=>1000,3485=>1000,3486=>1000,3487=>1000,3488=>1000,3489=>1000,3490=>1000,3491=>1000,3492=>1000, -3493=>1000,3494=>1000,3495=>1000,3496=>1000,3497=>1000,3498=>1000,3499=>1000,3500=>1000,3501=>1000,3502=>1000, -3503=>1000,3504=>1000,3505=>1000,3506=>500,3507=>1000,3508=>1000,3509=>1000,3510=>1000,3511=>1000,3512=>1000, -3513=>1000,3514=>1000,3515=>1000,3516=>500,3517=>1000,3518=>500,3519=>500,3520=>1000,3521=>1000,3522=>1000, -3523=>1000,3524=>1000,3525=>1000,3526=>1000,3527=>500,3528=>500,3529=>500,3530=>0,3531=>500,3532=>500, -3533=>500,3534=>500,3535=>0,3536=>0,3537=>0,3538=>0,3539=>0,3540=>0,3541=>500,3542=>0, -3543=>500,3544=>0,3545=>0,3546=>0,3547=>0,3548=>0,3549=>0,3550=>0,3551=>0,3552=>500, -3553=>500,3554=>500,3555=>500,3556=>500,3557=>500,3558=>500,3559=>500,3560=>500,3561=>500,3562=>500, -3563=>500,3564=>500,3565=>500,3566=>500,3567=>500,3568=>500,3569=>500,3570=>0,3571=>0,3572=>1000, -3573=>500,3574=>500,3575=>500,3576=>500,3577=>500,3578=>500,3579=>500,3580=>500,3581=>500,3582=>500, -3583=>500,3584=>500,3585=>500,3586=>500,3587=>500,3588=>500,3589=>500,3590=>500,3591=>500,3592=>500, -3593=>500,3594=>500,3595=>500,3596=>500,3597=>500,3598=>500,3599=>500,3600=>500,3601=>500,3602=>500, -3603=>500,3604=>500,3605=>500,3606=>500,3607=>500,3608=>500,3609=>500,3610=>500,3611=>500,3612=>500, -3613=>500,3614=>500,3615=>500,3616=>500,3617=>500,3618=>500,3619=>500,3620=>500,3621=>500,3622=>500, -3623=>500,3624=>500,3625=>500,3626=>500,3627=>500,3628=>500,3629=>500,3630=>500,3631=>500,3632=>500, -3633=>0,3634=>500,3635=>500,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0, -3643=>500,3644=>500,3645=>500,3646=>500,3647=>500,3648=>500,3649=>500,3650=>500,3651=>500,3652=>500, -3653=>500,3654=>500,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0, -3663=>500,3664=>500,3665=>500,3666=>500,3667=>500,3668=>500,3669=>500,3670=>500,3671=>500,3672=>500, -3673=>500,3674=>500,3675=>500,3676=>500,3677=>500,3678=>500,3679=>500,3680=>500,3681=>500,3682=>500, -3683=>500,3684=>500,3685=>500,3686=>500,3687=>500,3688=>500,3689=>500,3690=>500,3691=>500,3692=>500, -3693=>500,3694=>500,3695=>500,3696=>500,3697=>500,3698=>500,3699=>500,3700=>500,3701=>500,3702=>500, -3703=>500,3704=>500,3705=>500,3706=>500,3707=>500,3708=>500,3709=>500,3710=>500,3711=>500,3712=>500, -3713=>500,3714=>500,3715=>500,3716=>500,3717=>500,3718=>500,3719=>500,3720=>500,3721=>500,3722=>500, -3723=>500,3724=>500,3725=>500,3726=>500,3727=>500,3728=>500,3729=>500,3730=>500,3731=>500,3732=>500, -3733=>500,3734=>500,3735=>500,3736=>500,3737=>500,3738=>500,3739=>500,3740=>500,3741=>500,3742=>500, -3743=>500,3744=>500,3745=>500,3746=>500,3747=>500,3748=>500,3749=>500,3750=>500,3751=>500,3752=>500, -3753=>500,3754=>500,3755=>500,3756=>500,3757=>500,3758=>500,3759=>500,3760=>500,3761=>0,3762=>500, -3763=>500,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3770=>500,3771=>0,3772=>0, -3773=>500,3774=>500,3775=>500,3776=>500,3777=>500,3778=>500,3779=>500,3780=>500,3781=>500,3782=>500, -3783=>500,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3790=>500,3791=>500,3792=>500, -3793=>500,3794=>500,3795=>500,3796=>500,3797=>500,3798=>500,3799=>500,3800=>500,3801=>500,3802=>500, -3803=>500,3804=>500,3805=>500,3806=>500,3807=>500,3808=>500,3809=>500,3810=>500,3811=>500,3812=>500, -3813=>500,3814=>500,3815=>500,3816=>500,3817=>500,3818=>500,3819=>500,3820=>500,3821=>500,3822=>500, -3823=>500,3824=>500,3825=>500,3826=>500,3827=>500,3828=>500,3829=>500,3830=>500,3831=>500,3832=>500, -3833=>500,3834=>500,3835=>500,3836=>500,3837=>500,3838=>500,3839=>500,3840=>500,3841=>500,3842=>1000, -3843=>1000,3844=>500,3845=>500,3846=>500,3847=>500,3848=>500,3849=>500,3850=>500,3851=>500,3852=>500, -3853=>500,3854=>500,3855=>500,3856=>500,3857=>500,3858=>500,3859=>500,3860=>500,3861=>500,3862=>1000, -3863=>1000,3864=>0,3865=>0,3866=>500,3867=>500,3868=>500,3869=>500,3870=>500,3871=>500,3872=>500, -3873=>500,3874=>500,3875=>500,3876=>500,3877=>500,3878=>500,3879=>500,3880=>500,3881=>500,3882=>500, -3883=>500,3884=>500,3885=>500,3886=>500,3887=>500,3888=>500,3889=>500,3890=>500,3891=>500,3892=>500, -3893=>0,3894=>500,3895=>0,3896=>500,3897=>0,3898=>1000,3899=>1000,3900=>500,3901=>500,3902=>0, -3903=>0,3904=>500,3905=>500,3906=>500,3907=>500,3908=>500,3909=>500,3910=>500,3911=>500,3912=>500, -3913=>500,3914=>500,3915=>500,3916=>500,3917=>500,3918=>500,3919=>500,3920=>500,3921=>500,3922=>500, -3923=>500,3924=>500,3925=>500,3926=>500,3927=>500,3928=>500,3929=>500,3930=>500,3931=>500,3932=>500, -3933=>500,3934=>500,3935=>500,3936=>500,3937=>500,3938=>500,3939=>500,3940=>500,3941=>500,3942=>500, -3943=>500,3944=>500,3945=>500,3946=>500,3947=>500,3948=>500,3949=>500,3950=>500,3951=>500,3952=>500, -3953=>0,3954=>0,3955=>0,3956=>0,3957=>0,3958=>0,3959=>0,3960=>0,3961=>0,3962=>0, -3963=>0,3964=>0,3965=>0,3966=>0,3967=>0,3968=>0,3969=>0,3970=>0,3971=>0,3972=>500, -3973=>500,3974=>0,3975=>0,3976=>1000,3977=>500,3978=>500,3979=>500,3980=>500,3981=>500,3982=>500, -3983=>500,3984=>0,3985=>0,3986=>0,3987=>0,3988=>0,3989=>0,3990=>0,3991=>0,3992=>500, -3993=>0,3994=>0,3995=>0,3996=>0,3997=>0,3998=>0,3999=>0,4000=>0,4001=>0,4002=>0, -4003=>0,4004=>0,4005=>0,4006=>0,4007=>0,4008=>0,4009=>0,4010=>0,4011=>0,4012=>0, -4013=>0,4014=>0,4015=>0,4016=>0,4017=>0,4018=>0,4019=>0,4020=>0,4021=>0,4022=>0, -4023=>0,4024=>0,4025=>0,4026=>0,4027=>0,4028=>0,4029=>500,4030=>500,4031=>500,4032=>500, -4033=>500,4034=>500,4035=>500,4036=>500,4037=>1000,4038=>0,4039=>1000,4040=>1000,4041=>1000,4042=>1000, -4043=>1000,4044=>1000,4045=>500,4046=>1000,4047=>1000,4048=>1000,4049=>500,4050=>1000,4051=>1000,4052=>1000, -4053=>500,4054=>500,4055=>500,4056=>500,4057=>500,4058=>500,4059=>500,4060=>500,4061=>500,4062=>500, -4063=>500,4064=>500,4065=>500,4066=>500,4067=>500,4068=>500,4069=>500,4070=>500,4071=>500,4072=>500, -4073=>500,4074=>500,4075=>500,4076=>500,4077=>500,4078=>500,4079=>500,4080=>500,4081=>500,4082=>500, -4083=>500,4084=>500,4085=>500,4086=>500,4087=>500,4088=>500,4089=>500,4090=>500,4091=>500,4092=>500, -4093=>500,4094=>500,4095=>500,4096=>1000,4097=>1000,4098=>1000,4099=>1000,4100=>1000,4101=>1000,4102=>1000, -4103=>1000,4104=>1000,4105=>1000,4106=>1000,4107=>1000,4108=>500,4109=>1000,4110=>1000,4111=>1000,4112=>1000, -4113=>1000,4114=>1000,4115=>1000,4116=>1000,4117=>1000,4118=>1000,4119=>1000,4120=>1000,4121=>1000,4122=>1000, -4123=>1000,4124=>1000,4125=>1000,4126=>1000,4127=>1000,4128=>500,4129=>1000,4130=>1000,4131=>1000,4132=>1000, -4133=>1000,4134=>1000,4135=>1000,4136=>1000,4137=>1000,4138=>1000,4139=>0,4140=>0,4141=>0,4142=>0, -4143=>0,4144=>0,4145=>0,4146=>0,4147=>0,4148=>0,4149=>0,4150=>0,4151=>0,4152=>0, -4153=>0,4154=>0,4155=>0,4156=>0,4157=>0,4158=>0,4159=>1000,4160=>1000,4161=>1000,4162=>500, -4163=>500,4164=>1000,4165=>1000,4166=>1000,4167=>1000,4168=>1000,4169=>1000,4170=>500,4171=>500,4172=>500, -4173=>1000,4174=>1000,4175=>1000,4176=>1000,4177=>1000,4178=>1000,4179=>1000,4180=>500,4181=>1000,4182=>0, -4183=>0,4184=>0,4185=>0,4186=>1000,4187=>1000,4188=>1000,4189=>1000,4190=>0,4191=>0,4192=>0, -4193=>1000,4194=>0,4195=>0,4196=>0,4197=>1000,4198=>1000,4199=>0,4200=>0,4201=>0,4202=>0, -4203=>0,4204=>0,4205=>0,4206=>1000,4207=>1000,4208=>1000,4209=>0,4210=>0,4211=>0,4212=>0, -4213=>1000,4214=>1000,4215=>1000,4216=>1000,4217=>1000,4218=>1000,4219=>1000,4220=>1000,4221=>1000,4222=>1000, -4223=>1000,4224=>1000,4225=>1000,4226=>0,4227=>0,4228=>0,4229=>0,4230=>0,4231=>0,4232=>0, -4233=>0,4234=>0,4235=>0,4236=>0,4237=>0,4238=>1000,4239=>0,4240=>1000,4241=>1000,4242=>1000, -4243=>1000,4244=>1000,4245=>1000,4246=>1000,4247=>1000,4248=>1000,4249=>1000,4250=>500,4251=>500,4252=>500, -4253=>500,4254=>1000,4255=>1000,4256=>500,4257=>500,4258=>500,4259=>500,4260=>500,4261=>500,4262=>500, -4263=>500,4264=>500,4265=>500,4266=>500,4267=>500,4268=>500,4269=>500,4270=>500,4271=>500,4272=>500, -4273=>500,4274=>500,4275=>500,4276=>500,4277=>500,4278=>500,4279=>500,4280=>500,4281=>500,4282=>500, -4283=>500,4284=>500,4285=>500,4286=>500,4287=>500,4288=>500,4289=>500,4290=>500,4291=>500,4292=>500, -4293=>500,4294=>500,4295=>500,4296=>500,4297=>500,4298=>500,4299=>500,4300=>500,4301=>500,4302=>500, -4303=>500,4304=>500,4305=>500,4306=>500,4307=>500,4308=>500,4309=>500,4310=>500,4311=>500,4312=>500, -4313=>500,4314=>500,4315=>500,4316=>500,4317=>500,4318=>500,4319=>500,4320=>500,4321=>500,4322=>500, -4323=>500,4324=>500,4325=>500,4326=>500,4327=>500,4328=>500,4329=>500,4330=>500,4331=>500,4332=>500, -4333=>500,4334=>500,4335=>500,4336=>500,4337=>500,4338=>500,4339=>500,4340=>500,4341=>500,4342=>500, -4343=>500,4344=>500,4345=>500,4346=>500,4347=>500,4348=>500,4349=>500,4350=>500,4351=>500,4352=>1000, -4353=>1000,4354=>1000,4355=>1000,4356=>1000,4357=>1000,4358=>1000,4359=>1000,4360=>1000,4361=>1000,4362=>1000, -4363=>1000,4364=>1000,4365=>1000,4366=>1000,4367=>1000,4368=>1000,4369=>1000,4370=>1000,4371=>1000,4372=>1000, -4373=>1000,4374=>1000,4375=>1000,4376=>1000,4377=>1000,4378=>1000,4379=>1000,4380=>1000,4381=>1000,4382=>1000, -4383=>1000,4384=>1000,4385=>1000,4386=>1000,4387=>1000,4388=>1000,4389=>1000,4390=>1000,4391=>1000,4392=>1000, -4393=>1000,4394=>1000,4395=>1000,4396=>1000,4397=>1000,4398=>1000,4399=>1000,4400=>1000,4401=>1000,4402=>1000, -4403=>1000,4404=>1000,4405=>1000,4406=>1000,4407=>1000,4408=>1000,4409=>1000,4410=>1000,4411=>1000,4412=>1000, -4413=>1000,4414=>1000,4415=>1000,4416=>1000,4417=>1000,4418=>1000,4419=>1000,4420=>1000,4421=>1000,4422=>1000, -4423=>1000,4424=>1000,4425=>1000,4426=>1000,4427=>1000,4428=>1000,4429=>1000,4430=>1000,4431=>1000,4432=>1000, -4433=>1000,4434=>1000,4435=>1000,4436=>1000,4437=>1000,4438=>1000,4439=>1000,4440=>1000,4441=>1000,4442=>500, -4443=>500,4444=>500,4445=>500,4446=>500,4449=>1000,4450=>1000,4451=>1000,4452=>1000,4453=>1000,4454=>1000, -4455=>1000,4456=>1000,4457=>1000,4458=>1000,4459=>1000,4460=>1000,4461=>1000,4462=>1000,4463=>1000,4464=>1000, -4465=>1000,4466=>1000,4467=>1000,4468=>1000,4469=>1000,4470=>1000,4471=>1000,4472=>1000,4473=>1000,4474=>1000, -4475=>1000,4476=>1000,4477=>1000,4478=>1000,4479=>1000,4480=>1000,4481=>1000,4482=>1000,4483=>1000,4484=>1000, -4485=>1000,4486=>1000,4487=>1000,4488=>1000,4489=>1000,4490=>1000,4491=>1000,4492=>1000,4493=>1000,4494=>1000, -4495=>1000,4496=>1000,4497=>1000,4498=>1000,4499=>1000,4500=>1000,4501=>1000,4502=>1000,4503=>1000,4504=>1000, -4505=>1000,4506=>1000,4507=>1000,4508=>1000,4509=>1000,4510=>1000,4511=>1000,4512=>1000,4513=>1000,4514=>1000, -4515=>500,4516=>500,4517=>500,4518=>500,4519=>500,4520=>1000,4521=>1000,4522=>1000,4523=>1000,4524=>1000, -4525=>1000,4526=>1000,4527=>1000,4528=>1000,4529=>1000,4530=>1000,4531=>1000,4532=>1000,4533=>1000,4534=>1000, -4535=>1000,4536=>1000,4537=>1000,4538=>1000,4539=>1000,4540=>1000,4541=>1000,4542=>1000,4543=>1000,4544=>1000, -4545=>1000,4546=>1000,4547=>1000,4548=>1000,4549=>1000,4550=>1000,4551=>1000,4552=>1000,4553=>1000,4554=>1000, -4555=>1000,4556=>1000,4557=>1000,4558=>1000,4559=>1000,4560=>1000,4561=>1000,4562=>1000,4563=>1000,4564=>1000, -4565=>1000,4566=>1000,4567=>1000,4568=>1000,4569=>1000,4570=>1000,4571=>1000,4572=>1000,4573=>1000,4574=>1000, -4575=>1000,4576=>1000,4577=>1000,4578=>1000,4579=>1000,4580=>1000,4581=>1000,4582=>1000,4583=>1000,4584=>1000, -4585=>1000,4586=>1000,4587=>1000,4588=>1000,4589=>1000,4590=>1000,4591=>1000,4592=>1000,4593=>1000,4594=>1000, -4595=>1000,4596=>1000,4597=>1000,4598=>1000,4599=>1000,4600=>1000,4601=>1000,4602=>500,4603=>500,4604=>500, -4605=>500,4606=>500,4607=>500,4608=>1000,4609=>1000,4610=>1000,4611=>1000,4612=>1000,4613=>1000,4614=>1000, -4615=>1000,4616=>1000,4617=>1000,4618=>1000,4619=>1000,4620=>1000,4621=>1000,4622=>1000,4623=>1000,4624=>1000, -4625=>1000,4626=>1000,4627=>1000,4628=>1000,4629=>1000,4630=>1000,4631=>1000,4632=>1000,4633=>1000,4634=>1000, -4635=>1000,4636=>1000,4637=>1000,4638=>1000,4639=>1000,4640=>1000,4641=>1000,4642=>1000,4643=>1000,4644=>1000, -4645=>1000,4646=>1000,4647=>1000,4648=>1000,4649=>1000,4650=>1000,4651=>1000,4652=>1000,4653=>1000,4654=>1000, -4655=>1000,4656=>1000,4657=>1000,4658=>1000,4659=>1000,4660=>1000,4661=>1000,4662=>1000,4663=>1000,4664=>1000, -4665=>1000,4666=>1000,4667=>1000,4668=>1000,4669=>1000,4670=>1000,4671=>1000,4672=>1000,4673=>1000,4674=>1000, -4675=>1000,4676=>1000,4677=>1000,4678=>1000,4679=>1000,4680=>1000,4681=>500,4682=>1000,4683=>1000,4684=>1000, -4685=>1000,4686=>500,4687=>500,4688=>1000,4689=>1000,4690=>1000,4691=>1000,4692=>1000,4693=>1000,4694=>1000, -4695=>500,4696=>1000,4697=>500,4698=>1000,4699=>1000,4700=>1000,4701=>1000,4702=>500,4703=>500,4704=>1000, -4705=>1000,4706=>1000,4707=>1000,4708=>1000,4709=>1000,4710=>1000,4711=>1000,4712=>1000,4713=>1000,4714=>1000, -4715=>1000,4716=>1000,4717=>1000,4718=>1000,4719=>1000,4720=>1000,4721=>1000,4722=>1000,4723=>1000,4724=>1000, -4725=>1000,4726=>1000,4727=>1000,4728=>1000,4729=>1000,4730=>1000,4731=>1000,4732=>1000,4733=>1000,4734=>1000, -4735=>1000,4736=>1000,4737=>1000,4738=>1000,4739=>1000,4740=>1000,4741=>1000,4742=>1000,4743=>1000,4744=>1000, -4745=>500,4746=>1000,4747=>1000,4748=>1000,4749=>1000,4750=>500,4751=>500,4752=>1000,4753=>1000,4754=>1000, -4755=>1000,4756=>1000,4757=>1000,4758=>1000,4759=>1000,4760=>1000,4761=>1000,4762=>1000,4763=>1000,4764=>1000, -4765=>1000,4766=>1000,4767=>1000,4768=>1000,4769=>1000,4770=>1000,4771=>1000,4772=>1000,4773=>1000,4774=>1000, -4775=>1000,4776=>1000,4777=>1000,4778=>1000,4779=>1000,4780=>1000,4781=>1000,4782=>1000,4783=>1000,4784=>1000, -4785=>500,4786=>1000,4787=>1000,4788=>1000,4789=>1000,4790=>500,4791=>500,4792=>1000,4793=>1000,4794=>1000, -4795=>1000,4796=>1000,4797=>1000,4798=>1000,4799=>500,4800=>1000,4801=>500,4802=>1000,4803=>1000,4804=>1000, -4805=>1000,4806=>500,4807=>500,4808=>1000,4809=>1000,4810=>1000,4811=>1000,4812=>1000,4813=>1000,4814=>1000, -4815=>1000,4816=>1000,4817=>1000,4818=>1000,4819=>1000,4820=>1000,4821=>1000,4822=>1000,4823=>500,4824=>1000, -4825=>1000,4826=>1000,4827=>1000,4828=>1000,4829=>1000,4830=>1000,4831=>1000,4832=>1000,4833=>1000,4834=>1000, -4835=>1000,4836=>1000,4837=>1000,4838=>1000,4839=>1000,4840=>1000,4841=>1000,4842=>1000,4843=>1000,4844=>1000, -4845=>1000,4846=>1000,4847=>1000,4848=>1000,4849=>1000,4850=>1000,4851=>1000,4852=>1000,4853=>1000,4854=>1000, -4855=>1000,4856=>1000,4857=>1000,4858=>1000,4859=>1000,4860=>1000,4861=>1000,4862=>1000,4863=>1000,4864=>1000, -4865=>1000,4866=>1000,4867=>1000,4868=>1000,4869=>1000,4870=>1000,4871=>1000,4872=>1000,4873=>1000,4874=>1000, -4875=>1000,4876=>1000,4877=>1000,4878=>1000,4879=>1000,4880=>1000,4881=>500,4882=>1000,4883=>1000,4884=>1000, -4885=>1000,4886=>500,4887=>500,4888=>1000,4889=>1000,4890=>1000,4891=>1000,4892=>1000,4893=>1000,4894=>1000, -4895=>1000,4896=>1000,4897=>1000,4898=>1000,4899=>1000,4900=>1000,4901=>1000,4902=>1000,4903=>1000,4904=>1000, -4905=>1000,4906=>1000,4907=>1000,4908=>1000,4909=>1000,4910=>1000,4911=>1000,4912=>1000,4913=>1000,4914=>1000, -4915=>1000,4916=>1000,4917=>1000,4918=>1000,4919=>1000,4920=>1000,4921=>1000,4922=>1000,4923=>1000,4924=>1000, -4925=>1000,4926=>1000,4927=>1000,4928=>1000,4929=>1000,4930=>1000,4931=>500,4932=>1000,4933=>1000,4934=>1000, -4935=>1000,4936=>1000,4937=>1000,4938=>1000,4939=>1000,4940=>1000,4941=>1000,4942=>1000,4943=>1000,4944=>1000, -4945=>1000,4946=>1000,4947=>1000,4948=>1000,4949=>1000,4950=>1000,4951=>1000,4952=>1000,4953=>1000,4954=>1000, -4955=>500,4956=>500,4957=>500,4958=>500,4959=>0,4960=>1000,4961=>500,4962=>1000,4963=>1000,4964=>1000, -4965=>1000,4966=>1000,4967=>1000,4968=>1000,4969=>1000,4970=>1000,4971=>1000,4972=>1000,4973=>1000,4974=>1000, -4975=>1000,4976=>1000,4977=>1000,4978=>1000,4979=>1000,4980=>1000,4981=>1000,4982=>1000,4983=>1000,4984=>1000, -4985=>1000,4986=>1000,4987=>1000,4988=>1000,4989=>500,4990=>500,4991=>500,4992=>1000,4993=>1000,4994=>1000, -4995=>1000,4996=>1000,4997=>1000,4998=>1000,4999=>1000,5000=>1000,5001=>1000,5002=>1000,5003=>1000,5004=>1000, -5005=>1000,5006=>1000,5007=>1000,5008=>500,5009=>500,5010=>500,5011=>500,5012=>500,5013=>1000,5014=>500, -5015=>1000,5016=>1000,5017=>500,5018=>500,5019=>500,5020=>500,5021=>500,5022=>500,5023=>500,5024=>500, -5025=>500,5026=>500,5027=>500,5028=>500,5029=>500,5030=>500,5031=>500,5032=>500,5033=>500,5034=>500, -5035=>500,5036=>500,5037=>500,5038=>500,5039=>500,5040=>500,5041=>500,5042=>500,5043=>500,5044=>500, -5045=>500,5046=>500,5047=>500,5048=>500,5049=>500,5050=>500,5051=>500,5052=>500,5053=>500,5054=>500, -5055=>500,5056=>500,5057=>500,5058=>500,5059=>500,5060=>500,5061=>500,5062=>500,5063=>500,5064=>500, -5065=>500,5066=>500,5067=>500,5068=>500,5069=>500,5070=>500,5071=>500,5072=>500,5073=>500,5074=>500, -5075=>500,5076=>500,5077=>500,5078=>500,5079=>500,5080=>500,5081=>500,5082=>500,5083=>500,5084=>500, -5085=>500,5086=>500,5087=>500,5088=>500,5089=>500,5090=>500,5091=>500,5092=>500,5093=>500,5094=>500, -5095=>500,5096=>500,5097=>500,5098=>500,5099=>500,5100=>500,5101=>500,5102=>500,5103=>500,5104=>500, -5105=>500,5106=>500,5107=>500,5108=>500,5109=>500,5110=>500,5111=>500,5112=>500,5113=>500,5114=>500, -5115=>500,5116=>500,5117=>500,5118=>500,5119=>500,5120=>500,5121=>500,5122=>500,5123=>500,5124=>500, -5125=>500,5126=>500,5127=>500,5128=>500,5129=>500,5130=>500,5131=>500,5132=>500,5133=>500,5134=>500, -5135=>500,5136=>500,5137=>500,5138=>500,5139=>500,5140=>500,5141=>500,5142=>500,5143=>500,5144=>500, -5145=>500,5146=>500,5147=>500,5148=>500,5149=>500,5150=>500,5151=>500,5152=>500,5153=>500,5154=>500, -5155=>500,5156=>500,5157=>500,5158=>500,5159=>500,5160=>500,5161=>500,5162=>500,5163=>500,5164=>500, -5165=>500,5166=>500,5167=>500,5168=>500,5169=>500,5170=>500,5171=>500,5172=>500,5173=>500,5174=>500, -5175=>500,5176=>500,5177=>500,5178=>500,5179=>500,5180=>500,5181=>500,5182=>500,5183=>500,5184=>500, -5185=>500,5186=>500,5187=>500,5188=>500,5189=>500,5190=>500,5191=>500,5192=>500,5193=>500,5194=>500, -5195=>500,5196=>500,5197=>500,5198=>500,5199=>500,5200=>500,5201=>500,5202=>500,5203=>500,5204=>500, -5205=>500,5206=>500,5207=>500,5208=>500,5209=>500,5210=>500,5211=>500,5212=>500,5213=>500,5214=>500, -5215=>500,5216=>500,5217=>500,5218=>500,5219=>500,5220=>500,5221=>500,5222=>500,5223=>500,5224=>500, -5225=>500,5226=>500,5227=>500,5228=>500,5229=>500,5230=>500,5231=>500,5232=>500,5233=>500,5234=>500, -5235=>500,5236=>500,5237=>500,5238=>500,5239=>500,5240=>500,5241=>500,5242=>500,5243=>500,5244=>500, -5245=>500,5246=>500,5247=>500,5248=>500,5249=>500,5250=>500,5251=>500,5252=>500,5253=>500,5254=>500, -5255=>500,5256=>500,5257=>500,5258=>500,5259=>500,5260=>500,5261=>500,5262=>500,5263=>500,5264=>500, -5265=>500,5266=>500,5267=>500,5268=>500,5269=>500,5270=>500,5271=>500,5272=>500,5273=>500,5274=>500, -5275=>500,5276=>500,5277=>500,5278=>500,5279=>500,5280=>500,5281=>500,5282=>500,5283=>500,5284=>500, -5285=>500,5286=>500,5287=>500,5288=>500,5289=>500,5290=>500,5291=>500,5292=>500,5293=>500,5294=>500, -5295=>500,5296=>500,5297=>500,5298=>500,5299=>500,5300=>500,5301=>500,5302=>500,5303=>500,5304=>500, -5305=>500,5306=>500,5307=>500,5308=>500,5309=>500,5310=>500,5311=>500,5312=>500,5313=>500,5314=>500, -5315=>500,5316=>500,5317=>500,5318=>500,5319=>500,5320=>500,5321=>500,5322=>500,5323=>500,5324=>500, -5325=>500,5326=>500,5327=>500,5328=>500,5329=>500,5330=>500,5331=>500,5332=>500,5333=>500,5334=>500, -5335=>500,5336=>500,5337=>500,5338=>500,5339=>500,5340=>500,5341=>500,5342=>500,5343=>500,5344=>500, -5345=>500,5346=>500,5347=>500,5348=>500,5349=>500,5350=>500,5351=>500,5352=>500,5353=>500,5354=>500, -5355=>500,5356=>500,5357=>500,5358=>500,5359=>500,5360=>500,5361=>500,5362=>500,5363=>500,5364=>500, -5365=>500,5366=>500,5367=>500,5368=>500,5369=>500,5370=>500,5371=>500,5372=>500,5373=>500,5374=>500, -5375=>500,5376=>500,5377=>500,5378=>500,5379=>500,5380=>500,5381=>500,5382=>500,5383=>500,5384=>500, -5385=>500,5386=>500,5387=>500,5388=>1000,5389=>1000,5390=>1000,5391=>1000,5392=>500,5393=>500,5394=>500, -5395=>500,5396=>500,5397=>500,5398=>500,5399=>500,5400=>500,5401=>500,5402=>500,5403=>500,5404=>500, -5405=>500,5406=>500,5407=>500,5408=>500,5409=>500,5410=>500,5411=>500,5412=>500,5413=>500,5414=>500, -5415=>500,5416=>500,5417=>500,5418=>500,5419=>500,5420=>500,5421=>500,5422=>500,5423=>500,5424=>500, -5425=>500,5426=>500,5427=>500,5428=>500,5429=>500,5430=>500,5431=>500,5432=>500,5433=>500,5434=>500, -5435=>500,5436=>500,5437=>500,5438=>500,5439=>500,5440=>500,5441=>500,5442=>500,5443=>500,5444=>500, -5445=>500,5446=>500,5447=>500,5448=>500,5449=>500,5450=>500,5451=>500,5452=>500,5453=>500,5454=>500, -5455=>500,5456=>500,5457=>500,5458=>500,5459=>500,5460=>500,5461=>500,5462=>500,5463=>500,5464=>500, -5465=>500,5466=>500,5467=>500,5468=>500,5469=>500,5470=>500,5471=>500,5472=>500,5473=>500,5474=>500, -5475=>500,5476=>500,5477=>500,5478=>500,5479=>500,5480=>500,5481=>500,5482=>500,5483=>500,5484=>500, -5485=>500,5486=>500,5487=>1000,5488=>500,5489=>500,5490=>500,5491=>500,5492=>500,5493=>500,5494=>500, -5495=>500,5496=>500,5497=>500,5498=>500,5499=>500,5500=>500,5501=>500,5502=>1000,5503=>1000,5504=>1000, -5505=>1000,5506=>1000,5507=>1000,5508=>1000,5509=>500,5510=>500,5511=>500,5512=>500,5513=>500,5514=>500, -5515=>500,5516=>500,5517=>500,5518=>1000,5519=>1000,5520=>1000,5521=>1000,5522=>1000,5523=>1000,5524=>1000, -5525=>500,5526=>1000,5527=>500,5528=>500,5529=>500,5530=>500,5531=>500,5532=>500,5533=>500,5534=>500, -5535=>500,5536=>500,5537=>500,5538=>500,5539=>500,5540=>500,5541=>500,5542=>500,5543=>500,5544=>500, -5545=>500,5546=>500,5547=>500,5548=>500,5549=>500,5550=>500,5551=>500,5552=>500,5553=>500,5554=>500, -5555=>500,5556=>500,5557=>500,5558=>500,5559=>500,5560=>500,5561=>500,5562=>500,5563=>500,5564=>500, -5565=>500,5566=>500,5567=>500,5568=>500,5569=>500,5570=>500,5571=>500,5572=>500,5573=>500,5574=>500, -5575=>500,5576=>500,5577=>500,5578=>500,5579=>500,5580=>500,5581=>500,5582=>500,5583=>500,5584=>500, -5585=>500,5586=>500,5587=>500,5588=>500,5589=>500,5590=>500,5591=>500,5592=>500,5593=>500,5594=>500, -5595=>500,5596=>500,5597=>500,5598=>500,5599=>500,5600=>500,5601=>500,5602=>500,5603=>500,5604=>500, -5605=>500,5606=>500,5607=>500,5608=>500,5609=>500,5610=>500,5611=>500,5612=>500,5613=>500,5614=>500, -5615=>500,5616=>500,5617=>500,5618=>500,5619=>500,5620=>500,5621=>500,5622=>500,5623=>500,5624=>500, -5625=>500,5626=>500,5627=>500,5628=>500,5629=>500,5630=>500,5631=>500,5632=>500,5633=>500,5634=>500, -5635=>500,5636=>500,5637=>500,5638=>500,5639=>500,5640=>500,5641=>500,5642=>500,5643=>500,5644=>500, -5645=>500,5646=>500,5647=>500,5648=>500,5649=>500,5650=>500,5651=>500,5652=>500,5653=>500,5654=>500, -5655=>1000,5656=>1000,5657=>1000,5658=>1000,5659=>1000,5660=>1000,5661=>1000,5662=>1000,5663=>1000,5664=>1000, -5665=>1000,5666=>1000,5667=>1000,5668=>500,5669=>500,5670=>500,5671=>500,5672=>1000,5673=>1000,5674=>500, -5675=>500,5676=>500,5677=>500,5678=>500,5679=>500,5680=>500,5681=>500,5682=>500,5683=>500,5684=>1000, -5685=>1000,5686=>500,5687=>500,5688=>500,5689=>500,5690=>1000,5691=>1000,5692=>1000,5693=>1000,5694=>1000, -5695=>1000,5696=>500,5697=>500,5698=>1000,5699=>1000,5700=>1000,5701=>1000,5702=>500,5703=>500,5704=>500, -5705=>500,5706=>1000,5707=>1000,5708=>1000,5709=>1000,5710=>1000,5711=>1000,5712=>1000,5713=>1000,5714=>1000, -5715=>1000,5716=>1000,5717=>1000,5718=>1000,5719=>1000,5720=>1000,5721=>1000,5722=>500,5723=>1000,5724=>1000, -5725=>1000,5726=>1000,5727=>1000,5728=>1000,5729=>1000,5730=>1000,5731=>1000,5732=>1000,5733=>1000,5734=>1000, -5735=>1000,5736=>1000,5737=>1000,5738=>1000,5739=>1000,5740=>1000,5741=>500,5742=>500,5743=>1000,5744=>1000, -5745=>1000,5746=>1000,5747=>1000,5748=>1000,5749=>1000,5750=>1000,5751=>500,5752=>500,5753=>500,5754=>500, -5755=>500,5756=>500,5757=>500,5758=>500,5759=>500,5760=>1000,5761=>1000,5762=>1000,5763=>1000,5764=>1000, -5765=>1000,5766=>1000,5767=>1000,5768=>1000,5769=>1000,5770=>1000,5771=>1000,5772=>1000,5773=>1000,5774=>1000, -5775=>1000,5776=>1000,5777=>1000,5778=>1000,5779=>1000,5780=>1000,5781=>1000,5782=>1000,5783=>1000,5784=>1000, -5785=>1000,5786=>1000,5787=>1000,5788=>1000,5789=>500,5790=>500,5791=>500,5792=>500,5793=>500,5794=>500, -5795=>500,5796=>500,5797=>500,5798=>500,5799=>500,5800=>500,5801=>500,5802=>500,5803=>500,5804=>500, -5805=>500,5806=>500,5807=>500,5808=>500,5809=>500,5810=>500,5811=>500,5812=>500,5813=>500,5814=>500, -5815=>500,5816=>500,5817=>500,5818=>500,5819=>500,5820=>500,5821=>500,5822=>500,5823=>500,5824=>500, -5825=>500,5826=>500,5827=>500,5828=>500,5829=>500,5830=>500,5831=>500,5832=>500,5833=>500,5834=>500, -5835=>500,5836=>500,5837=>500,5838=>500,5839=>500,5840=>500,5841=>500,5842=>500,5843=>500,5844=>500, -5845=>500,5846=>500,5847=>500,5848=>500,5849=>500,5850=>500,5851=>500,5852=>500,5853=>500,5854=>500, -5855=>500,5856=>1000,5857=>500,5858=>1000,5859=>500,5860=>500,5861=>500,5862=>500,5863=>500,5864=>500, -5865=>500,5866=>500,5867=>500,5868=>500,5869=>500,5870=>500,5871=>500,5872=>500,5873=>500,5874=>500, -5875=>500,5876=>500,5877=>500,5878=>500,5879=>500,5880=>500,5881=>500,5882=>500,5883=>500,5884=>500, -5885=>500,5886=>500,5887=>500,5888=>1000,5889=>1000,5890=>1000,5891=>1000,5892=>1000,5893=>1000,5894=>1000, -5895=>1000,5896=>1000,5897=>1000,5898=>1000,5899=>1000,5900=>1000,5901=>500,5902=>1000,5903=>1000,5904=>1000, -5905=>1000,5906=>0,5907=>0,5908=>0,5909=>500,5910=>500,5911=>500,5912=>500,5913=>500,5914=>500, -5915=>500,5916=>500,5917=>500,5918=>500,5919=>500,5920=>1000,5921=>1000,5922=>1000,5923=>1000,5924=>1000, -5925=>1000,5926=>1000,5927=>1000,5928=>1000,5929=>1000,5930=>1000,5931=>1000,5932=>1000,5933=>1000,5934=>1000, -5935=>1000,5936=>1000,5937=>1000,5938=>0,5939=>0,5940=>0,5941=>1000,5942=>1000,5943=>500,5944=>500, -5945=>500,5946=>500,5947=>500,5948=>500,5949=>500,5950=>500,5951=>500,5952=>1000,5953=>1000,5954=>1000, -5955=>1000,5956=>1000,5957=>1000,5958=>1000,5959=>1000,5960=>1000,5961=>1000,5962=>1000,5963=>1000,5964=>1000, -5965=>1000,5966=>1000,5967=>1000,5968=>1000,5969=>1000,5970=>0,5971=>0,5972=>500,5973=>500,5974=>500, -5975=>500,5976=>500,5977=>500,5978=>500,5979=>500,5980=>500,5981=>500,5982=>500,5983=>500,5984=>1000, -5985=>1000,5986=>500,5987=>1000,5988=>1000,5989=>1000,5990=>1000,5991=>1000,5992=>1000,5993=>1000,5994=>1000, -5995=>1000,5996=>1000,5997=>500,5998=>1000,5999=>1000,6000=>1000,6001=>500,6002=>0,6003=>0,6004=>500, -6005=>500,6006=>500,6007=>500,6008=>500,6009=>500,6010=>500,6011=>500,6012=>500,6013=>500,6014=>500, -6015=>500,6016=>1000,6017=>1000,6018=>1000,6019=>1000,6020=>1000,6021=>1000,6022=>1000,6023=>1000,6024=>1000, -6025=>1000,6026=>1000,6027=>1000,6028=>1000,6029=>1000,6030=>1000,6031=>1000,6032=>1000,6033=>1000,6034=>1000, -6035=>1000,6036=>1000,6037=>1000,6038=>1000,6039=>1000,6040=>1000,6041=>1000,6042=>1000,6043=>1000,6044=>1000, -6045=>1000,6046=>1000,6047=>1000,6048=>1000,6049=>1000,6050=>1000,6051=>1000,6052=>1000,6053=>1000,6054=>1000, -6055=>1000,6056=>1000,6057=>1000,6058=>1000,6059=>1000,6060=>1000,6061=>1000,6062=>1000,6063=>1000,6064=>1000, -6065=>1000,6066=>1000,6067=>1000,6068=>1000,6069=>1000,6070=>0,6071=>0,6072=>0,6073=>0,6074=>0, -6075=>0,6076=>0,6077=>0,6078=>0,6079=>0,6080=>0,6081=>0,6082=>0,6083=>0,6084=>0, -6085=>0,6086=>0,6087=>0,6088=>0,6089=>0,6090=>0,6091=>0,6092=>0,6093=>0,6094=>0, -6095=>0,6096=>0,6097=>0,6098=>0,6099=>0,6100=>1000,6101=>1000,6102=>500,6103=>1000,6104=>1000, -6105=>1000,6106=>1000,6107=>1000,6108=>500,6109=>0,6110=>500,6111=>500,6112=>1000,6113=>1000,6114=>1000, -6115=>1000,6116=>1000,6117=>1000,6118=>1000,6119=>1000,6120=>1000,6121=>1000,6122=>500,6123=>500,6124=>500, -6125=>500,6126=>500,6127=>500,6128=>500,6129=>500,6130=>500,6131=>500,6132=>500,6133=>500,6134=>500, -6135=>500,6136=>500,6137=>500,6138=>500,6139=>500,6140=>500,6141=>500,6142=>500,6143=>500,6144=>1000, -6145=>1000,6146=>1000,6147=>1000,6148=>1000,6149=>1000,6150=>1000,6151=>1000,6152=>1000,6153=>1000,6154=>1000, -6155=>1000,6156=>1000,6157=>1000,6158=>1000,6159=>500,6160=>1000,6161=>1000,6162=>1000,6163=>1000,6164=>1000, -6165=>1000,6166=>1000,6167=>1000,6168=>1000,6169=>1000,6170=>500,6171=>500,6172=>500,6173=>500,6174=>500, -6175=>500,6176=>1000,6177=>1000,6178=>1000,6179=>1000,6180=>1000,6181=>1000,6182=>1000,6183=>1000,6184=>1000, -6185=>1000,6186=>1000,6187=>1000,6188=>1000,6189=>1000,6190=>1000,6191=>1000,6192=>1000,6193=>1000,6194=>1000, -6195=>1000,6196=>1000,6197=>1000,6198=>1000,6199=>1000,6200=>1000,6201=>1000,6202=>1000,6203=>1000,6204=>1000, -6205=>1000,6206=>1000,6207=>1000,6208=>1000,6209=>1000,6210=>1000,6211=>1000,6212=>1000,6213=>1000,6214=>1000, -6215=>1000,6216=>1000,6217=>1000,6218=>1000,6219=>1000,6220=>1000,6221=>1000,6222=>1000,6223=>1000,6224=>1000, -6225=>1000,6226=>1000,6227=>1000,6228=>1000,6229=>1000,6230=>1000,6231=>1000,6232=>1000,6233=>1000,6234=>1000, -6235=>1000,6236=>1000,6237=>1000,6238=>1000,6239=>1000,6240=>1000,6241=>1000,6242=>1000,6243=>1000,6244=>1000, -6245=>1000,6246=>1000,6247=>1000,6248=>1000,6249=>1000,6250=>1000,6251=>1000,6252=>1000,6253=>1000,6254=>1000, -6255=>1000,6256=>1000,6257=>1000,6258=>1000,6259=>1000,6260=>1000,6261=>1000,6262=>1000,6263=>1000,6264=>500, -6265=>500,6266=>500,6267=>500,6268=>500,6269=>500,6270=>500,6271=>500,6272=>1000,6273=>1000,6274=>1000, -6275=>1000,6276=>1000,6277=>1000,6278=>1000,6279=>1000,6280=>1000,6281=>1000,6282=>1000,6283=>1000,6284=>1000, -6285=>1000,6286=>1000,6287=>1000,6288=>1000,6289=>1000,6290=>1000,6291=>1000,6292=>1000,6293=>1000,6294=>1000, -6295=>1000,6296=>1000,6297=>1000,6298=>1000,6299=>1000,6300=>1000,6301=>1000,6302=>1000,6303=>1000,6304=>1000, -6305=>1000,6306=>1000,6307=>1000,6308=>1000,6309=>1000,6310=>1000,6311=>1000,6312=>1000,6313=>0,6314=>1000, -6315=>500,6316=>500,6317=>500,6318=>500,6319=>500,6320=>500,6321=>500,6322=>500,6323=>500,6324=>500, -6325=>500,6326=>500,6327=>500,6328=>500,6329=>500,6330=>500,6331=>500,6332=>500,6333=>500,6334=>500, -6335=>500,6336=>500,6337=>500,6338=>500,6339=>500,6340=>500,6341=>500,6342=>500,6343=>500,6344=>500, -6345=>500,6346=>500,6347=>500,6348=>500,6349=>500,6350=>500,6351=>500,6352=>500,6353=>500,6354=>500, -6355=>500,6356=>500,6357=>500,6358=>500,6359=>500,6360=>500,6361=>500,6362=>500,6363=>500,6364=>500, -6365=>500,6366=>500,6367=>500,6368=>500,6369=>500,6370=>500,6371=>500,6372=>500,6373=>500,6374=>500, -6375=>500,6376=>500,6377=>500,6378=>500,6379=>500,6380=>500,6381=>500,6382=>500,6383=>500,6384=>500, -6385=>500,6386=>500,6387=>500,6388=>500,6389=>500,6390=>500,6391=>500,6392=>500,6393=>500,6394=>500, -6395=>500,6396=>500,6397=>500,6398=>500,6399=>500,6400=>1000,6401=>1000,6402=>1000,6403=>1000,6404=>1000, -6405=>1000,6406=>1000,6407=>1000,6408=>1000,6409=>500,6410=>1000,6411=>1000,6412=>1000,6413=>1000,6414=>1000, -6415=>1000,6416=>1000,6417=>1000,6418=>1000,6419=>1000,6420=>1000,6421=>500,6422=>1000,6423=>1000,6424=>1000, -6425=>1000,6426=>500,6427=>1000,6428=>1000,6429=>500,6430=>500,6431=>500,6432=>0,6433=>0,6434=>0, -6435=>0,6436=>0,6437=>0,6438=>0,6439=>0,6440=>0,6441=>0,6442=>0,6443=>0,6444=>500, -6445=>500,6446=>500,6447=>500,6448=>0,6449=>0,6450=>0,6451=>0,6452=>0,6453=>0,6454=>0, -6455=>0,6456=>0,6457=>0,6458=>0,6459=>0,6460=>500,6461=>500,6462=>500,6463=>500,6464=>1000, -6465=>500,6466=>500,6467=>500,6468=>500,6469=>1000,6470=>1000,6471=>1000,6472=>1000,6473=>1000,6474=>1000, -6475=>1000,6476=>1000,6477=>1000,6478=>1000,6479=>1000,6480=>500,6481=>500,6482=>500,6483=>500,6484=>500, -6485=>500,6486=>500,6487=>500,6488=>500,6489=>500,6490=>500,6491=>500,6492=>500,6493=>500,6494=>500, -6495=>500,6496=>500,6497=>500,6498=>500,6499=>500,6500=>500,6501=>500,6502=>500,6503=>500,6504=>500, -6505=>500,6506=>500,6507=>500,6508=>500,6509=>500,6510=>500,6511=>500,6512=>500,6513=>500,6514=>500, -6515=>500,6516=>500,6517=>500,6518=>500,6519=>500,6520=>500,6521=>500,6522=>500,6523=>500,6524=>500, -6525=>500,6526=>500,6527=>500,6528=>1000,6529=>1000,6530=>1000,6531=>1000,6532=>1000,6533=>1000,6534=>1000, -6535=>1000,6536=>1000,6537=>1000,6538=>1000,6539=>1000,6540=>1000,6541=>1000,6542=>1000,6543=>1000,6544=>1000, -6545=>1000,6546=>1000,6547=>1000,6548=>1000,6549=>1000,6550=>1000,6551=>1000,6552=>1000,6553=>1000,6554=>1000, -6555=>1000,6556=>1000,6557=>1000,6558=>1000,6559=>1000,6560=>1000,6561=>1000,6562=>1000,6563=>1000,6564=>1000, -6565=>1000,6566=>1000,6567=>1000,6568=>1000,6569=>1000,6570=>500,6571=>500,6572=>500,6573=>500,6574=>500, -6575=>500,6576=>0,6577=>0,6578=>0,6579=>0,6580=>0,6581=>0,6582=>0,6583=>0,6584=>0, -6585=>0,6586=>0,6587=>0,6588=>0,6589=>0,6590=>0,6591=>0,6592=>0,6593=>1000,6594=>1000, -6595=>1000,6596=>1000,6597=>1000,6598=>1000,6599=>1000,6600=>0,6601=>0,6602=>500,6603=>500,6604=>500, -6605=>500,6606=>500,6607=>500,6608=>1000,6609=>1000,6610=>1000,6611=>1000,6612=>1000,6613=>1000,6614=>1000, -6615=>1000,6616=>1000,6617=>1000,6618=>500,6619=>500,6620=>500,6621=>500,6622=>1000,6623=>1000,6624=>1000, -6625=>1000,6626=>1000,6627=>1000,6628=>1000,6629=>1000,6630=>1000,6631=>1000,6632=>1000,6633=>1000,6634=>1000, -6635=>1000,6636=>1000,6637=>1000,6638=>1000,6639=>1000,6640=>1000,6641=>1000,6642=>1000,6643=>1000,6644=>1000, -6645=>1000,6646=>1000,6647=>1000,6648=>1000,6649=>1000,6650=>1000,6651=>1000,6652=>1000,6653=>1000,6654=>1000, -6655=>1000,6656=>500,6657=>1000,6658=>500,6659=>500,6660=>1000,6661=>500,6662=>500,6663=>1000,6664=>500, -6665=>500,6666=>500,6667=>1000,6668=>1000,6669=>1000,6670=>1000,6671=>1000,6672=>1000,6673=>500,6674=>1000, -6675=>1000,6676=>1000,6677=>1000,6678=>1000,6679=>0,6680=>0,6681=>0,6682=>0,6683=>0,6684=>500, -6685=>500,6686=>500,6687=>500,6688=>500,6689=>500,6690=>500,6691=>500,6692=>500,6693=>500,6694=>500, -6695=>500,6696=>500,6697=>500,6698=>500,6699=>500,6700=>500,6701=>500,6702=>500,6703=>500,6704=>500, -6705=>500,6706=>500,6707=>500,6708=>500,6709=>500,6710=>500,6711=>500,6712=>500,6713=>500,6714=>500, -6715=>500,6716=>500,6717=>500,6718=>500,6719=>500,6720=>500,6721=>500,6722=>500,6723=>500,6724=>500, -6725=>500,6726=>500,6727=>500,6728=>500,6729=>500,6730=>500,6731=>500,6732=>500,6733=>500,6734=>500, -6735=>500,6736=>500,6737=>500,6738=>500,6739=>500,6740=>500,6741=>500,6742=>500,6743=>500,6744=>500, -6745=>500,6746=>500,6747=>500,6748=>500,6749=>500,6750=>500,6751=>500,6752=>500,6753=>500,6754=>500, -6755=>500,6756=>500,6757=>500,6758=>500,6759=>500,6760=>500,6761=>500,6762=>500,6763=>500,6764=>500, -6765=>500,6766=>500,6767=>500,6768=>500,6769=>500,6770=>500,6771=>500,6772=>500,6773=>500,6774=>500, -6775=>500,6776=>500,6777=>500,6778=>500,6779=>500,6780=>500,6781=>500,6782=>500,6783=>500,6784=>500, -6785=>500,6786=>500,6787=>500,6788=>500,6789=>500,6790=>500,6791=>500,6792=>500,6793=>500,6794=>500, -6795=>500,6796=>500,6797=>500,6798=>500,6799=>500,6800=>500,6801=>500,6802=>500,6803=>500,6804=>500, -6805=>500,6806=>500,6807=>500,6808=>500,6809=>500,6810=>500,6811=>500,6812=>500,6813=>500,6814=>500, -6815=>500,6816=>500,6817=>500,6818=>500,6819=>500,6820=>500,6821=>500,6822=>500,6823=>500,6824=>500, -6825=>500,6826=>500,6827=>500,6828=>500,6829=>500,6830=>500,6831=>500,6832=>500,6833=>500,6834=>500, -6835=>500,6836=>500,6837=>500,6838=>500,6839=>500,6840=>500,6841=>500,6842=>500,6843=>500,6844=>500, -6845=>500,6846=>500,6847=>500,6848=>500,6849=>500,6850=>500,6851=>500,6852=>500,6853=>500,6854=>500, -6855=>500,6856=>500,6857=>500,6858=>500,6859=>500,6860=>500,6861=>500,6862=>500,6863=>500,6864=>500, -6865=>500,6866=>500,6867=>500,6868=>500,6869=>500,6870=>500,6871=>500,6872=>500,6873=>500,6874=>500, -6875=>500,6876=>500,6877=>500,6878=>500,6879=>500,6880=>500,6881=>500,6882=>500,6883=>500,6884=>500, -6885=>500,6886=>500,6887=>500,6888=>500,6889=>500,6890=>500,6891=>500,6892=>500,6893=>500,6894=>500, -6895=>500,6896=>500,6897=>500,6898=>500,6899=>500,6900=>500,6901=>500,6902=>500,6903=>500,6904=>500, -6905=>500,6906=>500,6907=>500,6908=>500,6909=>500,6910=>500,6911=>500,6912=>0,6913=>0,6914=>0, -6915=>0,6916=>0,6917=>1000,6918=>1000,6919=>1000,6920=>1000,6921=>1000,6922=>1000,6923=>1000,6924=>1000, -6925=>1000,6926=>1000,6927=>1000,6928=>1000,6929=>1000,6930=>1000,6931=>1000,6932=>1000,6933=>1000,6934=>1000, -6935=>1000,6936=>1000,6937=>1000,6938=>1000,6939=>1000,6940=>1000,6941=>1000,6942=>1000,6943=>1000,6944=>1000, -6945=>1000,6946=>1000,6947=>1000,6948=>1000,6949=>1000,6950=>1000,6951=>1000,6952=>1000,6953=>1000,6954=>1000, -6955=>1000,6956=>1000,6957=>1000,6958=>1000,6959=>1000,6960=>1000,6961=>1000,6962=>1000,6963=>1000,6964=>0, -6965=>0,6966=>0,6967=>0,6968=>0,6969=>0,6970=>0,6971=>0,6972=>0,6973=>0,6974=>0, -6975=>0,6976=>0,6977=>0,6978=>0,6979=>0,6980=>0,6981=>1000,6982=>1000,6983=>1000,6984=>1000, -6985=>1000,6986=>1000,6987=>1000,6988=>500,6989=>500,6990=>500,6991=>500,6992=>1000,6993=>1000,6994=>1000, -6995=>1000,6996=>1000,6997=>1000,6998=>1000,6999=>1000,7000=>1000,7001=>1000,7002=>1000,7003=>1000,7004=>1000, -7005=>1000,7006=>1000,7007=>1000,7008=>1000,7009=>1000,7010=>1000,7011=>1000,7012=>1000,7013=>1000,7014=>1000, -7015=>1000,7016=>500,7017=>1000,7018=>500,7019=>0,7020=>0,7021=>0,7022=>0,7023=>0,7024=>0, -7025=>0,7026=>0,7027=>0,7028=>500,7029=>500,7030=>500,7031=>500,7032=>500,7033=>500,7034=>500, -7035=>500,7036=>500,7037=>500,7038=>500,7039=>500,7040=>0,7041=>0,7042=>0,7043=>1000,7044=>1000, -7045=>1000,7046=>1000,7047=>1000,7048=>1000,7049=>1000,7050=>1000,7051=>1000,7052=>1000,7053=>1000,7054=>1000, -7055=>1000,7056=>1000,7057=>1000,7058=>1000,7059=>1000,7060=>1000,7061=>1000,7062=>1000,7063=>1000,7064=>1000, -7065=>1000,7066=>1000,7067=>1000,7068=>1000,7069=>1000,7070=>1000,7071=>1000,7072=>1000,7073=>0,7074=>0, -7075=>0,7076=>0,7077=>0,7078=>0,7079=>0,7080=>0,7081=>0,7082=>0,7083=>500,7084=>500, -7085=>500,7086=>1000,7087=>1000,7088=>1000,7089=>1000,7090=>1000,7091=>1000,7092=>1000,7093=>1000,7094=>1000, -7095=>1000,7096=>1000,7097=>1000,7098=>500,7099=>500,7100=>500,7101=>500,7102=>500,7103=>500,7104=>500, -7105=>500,7106=>500,7107=>500,7108=>500,7109=>500,7110=>500,7111=>500,7112=>500,7113=>500,7114=>500, -7115=>500,7116=>500,7117=>500,7118=>500,7119=>500,7120=>500,7121=>500,7122=>500,7123=>500,7124=>500, -7125=>500,7126=>500,7127=>500,7128=>500,7129=>500,7130=>500,7131=>500,7132=>500,7133=>500,7134=>500, -7135=>500,7136=>500,7137=>500,7138=>500,7139=>500,7140=>500,7141=>500,7142=>500,7143=>500,7144=>500, -7145=>500,7146=>500,7147=>500,7148=>500,7149=>500,7150=>500,7151=>500,7152=>500,7153=>500,7154=>500, -7155=>500,7156=>500,7157=>500,7158=>500,7159=>500,7160=>500,7161=>500,7162=>500,7163=>500,7164=>500, -7165=>500,7166=>500,7167=>500,7168=>1000,7169=>1000,7170=>1000,7171=>1000,7172=>1000,7173=>1000,7174=>1000, -7175=>1000,7176=>1000,7177=>1000,7178=>1000,7179=>1000,7180=>1000,7181=>1000,7182=>1000,7183=>1000,7184=>1000, -7185=>1000,7186=>1000,7187=>1000,7188=>1000,7189=>1000,7190=>1000,7191=>1000,7192=>1000,7193=>1000,7194=>1000, -7195=>1000,7196=>1000,7197=>1000,7198=>1000,7199=>1000,7200=>1000,7201=>1000,7202=>1000,7203=>1000,7204=>0, -7205=>0,7206=>0,7207=>0,7208=>0,7209=>0,7210=>0,7211=>0,7212=>0,7213=>0,7214=>0, -7215=>0,7216=>0,7217=>0,7218=>0,7219=>0,7220=>0,7221=>0,7222=>0,7223=>0,7224=>500, -7225=>500,7226=>500,7227=>1000,7228=>1000,7229=>1000,7230=>1000,7231=>1000,7232=>1000,7233=>1000,7234=>1000, -7235=>1000,7236=>1000,7237=>1000,7238=>1000,7239=>1000,7240=>1000,7241=>1000,7242=>500,7243=>500,7244=>500, -7245=>1000,7246=>1000,7247=>1000,7248=>500,7249=>500,7250=>500,7251=>500,7252=>500,7253=>500,7254=>500, -7255=>500,7256=>500,7257=>500,7258=>500,7259=>500,7260=>500,7261=>500,7262=>500,7263=>500,7264=>500, -7265=>500,7266=>500,7267=>500,7268=>500,7269=>500,7270=>500,7271=>500,7272=>500,7273=>500,7274=>500, -7275=>500,7276=>500,7277=>500,7278=>500,7279=>500,7280=>500,7281=>500,7282=>500,7283=>500,7284=>500, -7285=>500,7286=>500,7287=>500,7288=>500,7289=>500,7290=>500,7291=>500,7292=>500,7293=>500,7294=>500, -7295=>500,7296=>500,7297=>500,7298=>500,7299=>500,7300=>500,7301=>500,7302=>500,7303=>500,7304=>500, -7305=>500,7306=>500,7307=>500,7308=>500,7309=>500,7310=>500,7311=>500,7312=>500,7313=>500,7314=>500, -7315=>500,7316=>500,7317=>500,7318=>500,7319=>500,7320=>500,7321=>500,7322=>500,7323=>500,7324=>500, -7325=>500,7326=>500,7327=>500,7328=>500,7329=>500,7330=>500,7331=>500,7332=>500,7333=>500,7334=>500, -7335=>500,7336=>500,7337=>500,7338=>500,7339=>500,7340=>500,7341=>500,7342=>500,7343=>500,7344=>500, -7345=>500,7346=>500,7347=>500,7348=>500,7349=>500,7350=>500,7351=>500,7352=>500,7353=>500,7354=>500, -7355=>500,7356=>500,7357=>500,7358=>500,7359=>500,7360=>500,7361=>500,7362=>500,7363=>500,7364=>500, -7365=>500,7366=>500,7367=>500,7368=>500,7369=>500,7370=>500,7371=>500,7372=>500,7373=>500,7374=>500, -7375=>500,7376=>500,7377=>500,7378=>500,7379=>500,7380=>500,7381=>500,7382=>500,7383=>500,7384=>500, -7385=>500,7386=>500,7387=>500,7388=>500,7389=>500,7390=>500,7391=>500,7392=>500,7393=>500,7394=>500, -7395=>500,7396=>500,7397=>500,7398=>500,7399=>500,7400=>500,7401=>500,7402=>500,7403=>500,7404=>500, -7405=>500,7406=>500,7407=>500,7408=>500,7409=>500,7410=>500,7411=>500,7412=>500,7413=>500,7414=>500, -7415=>500,7416=>500,7417=>500,7418=>500,7419=>500,7420=>500,7421=>500,7422=>500,7423=>500,7424=>500, -7425=>500,7426=>500,7427=>500,7428=>500,7429=>500,7430=>500,7431=>500,7432=>500,7433=>500,7434=>500, -7435=>500,7436=>500,7437=>500,7438=>500,7439=>500,7440=>500,7441=>500,7442=>500,7443=>500,7444=>500, -7445=>500,7446=>500,7447=>500,7448=>500,7449=>500,7450=>500,7451=>500,7452=>500,7453=>500,7454=>500, -7455=>500,7456=>500,7457=>500,7458=>500,7459=>500,7460=>500,7461=>500,7462=>500,7463=>500,7464=>500, -7465=>500,7466=>500,7467=>500,7468=>500,7469=>500,7470=>500,7471=>500,7472=>500,7473=>500,7474=>500, -7475=>500,7476=>500,7477=>500,7478=>500,7479=>500,7480=>500,7481=>500,7482=>500,7483=>500,7484=>500, -7485=>500,7486=>500,7487=>500,7488=>500,7489=>500,7490=>500,7491=>500,7492=>500,7493=>500,7494=>500, -7495=>500,7496=>500,7497=>500,7498=>500,7499=>500,7500=>500,7501=>500,7502=>500,7503=>500,7504=>500, -7505=>500,7506=>500,7507=>500,7508=>500,7509=>500,7510=>500,7511=>500,7512=>500,7513=>500,7514=>500, -7515=>500,7516=>500,7517=>500,7518=>500,7519=>500,7520=>500,7521=>500,7522=>500,7523=>500,7524=>500, -7525=>500,7526=>500,7527=>500,7528=>500,7529=>500,7530=>500,7531=>500,7532=>500,7533=>500,7534=>500, -7535=>500,7536=>500,7537=>500,7538=>500,7539=>500,7540=>500,7541=>500,7542=>500,7543=>500,7544=>500, -7545=>500,7546=>1000,7547=>500,7548=>500,7549=>500,7550=>500,7551=>500,7552=>500,7553=>500,7554=>500, -7555=>500,7556=>500,7557=>500,7558=>500,7559=>500,7560=>500,7561=>500,7562=>500,7563=>500,7564=>500, -7565=>500,7566=>500,7567=>500,7568=>500,7569=>500,7570=>500,7571=>500,7572=>500,7573=>1000,7574=>500, -7575=>500,7576=>500,7577=>500,7578=>500,7579=>500,7580=>500,7581=>500,7582=>500,7583=>500,7584=>500, -7585=>500,7586=>500,7587=>500,7588=>500,7589=>500,7590=>500,7591=>500,7592=>500,7593=>500,7594=>500, -7595=>500,7596=>500,7597=>500,7598=>500,7599=>500,7600=>500,7601=>500,7602=>500,7603=>500,7604=>500, -7605=>500,7606=>500,7607=>500,7608=>500,7609=>500,7610=>500,7611=>500,7612=>500,7613=>500,7614=>500, -7615=>500,7616=>0,7617=>0,7618=>0,7619=>0,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0, -7625=>0,7626=>0,7627=>0,7628=>0,7629=>0,7630=>0,7631=>0,7632=>0,7633=>0,7634=>0, -7635=>0,7636=>0,7637=>0,7638=>0,7639=>0,7640=>0,7641=>0,7642=>0,7643=>0,7644=>0, -7645=>0,7646=>0,7647=>0,7648=>0,7649=>0,7650=>0,7651=>0,7652=>0,7653=>0,7654=>0, -7655=>500,7656=>500,7657=>500,7658=>500,7659=>500,7660=>500,7661=>500,7662=>500,7663=>500,7664=>500, -7665=>500,7666=>500,7667=>500,7668=>500,7669=>500,7670=>500,7671=>500,7672=>500,7673=>500,7674=>500, -7675=>500,7676=>500,7677=>500,7678=>0,7679=>0,7680=>500,7681=>500,7682=>500,7683=>500,7684=>500, -7685=>500,7686=>500,7687=>500,7688=>500,7689=>500,7690=>500,7691=>500,7692=>500,7693=>500,7694=>500, -7695=>500,7696=>500,7697=>500,7698=>500,7699=>500,7700=>500,7701=>500,7702=>500,7703=>500,7704=>500, -7705=>500,7706=>500,7707=>500,7708=>500,7709=>500,7710=>500,7711=>500,7712=>500,7713=>500,7714=>500, -7715=>500,7716=>500,7717=>500,7718=>500,7719=>500,7720=>500,7721=>500,7722=>500,7723=>500,7724=>500, -7725=>500,7726=>500,7727=>500,7728=>500,7729=>500,7730=>500,7731=>500,7732=>500,7733=>500,7734=>500, -7735=>500,7736=>500,7737=>500,7738=>500,7739=>500,7740=>500,7741=>500,7742=>500,7743=>500,7744=>500, -7745=>500,7746=>500,7747=>500,7748=>500,7749=>500,7750=>500,7751=>500,7752=>500,7753=>500,7754=>500, -7755=>500,7756=>500,7757=>500,7758=>500,7759=>500,7760=>500,7761=>500,7762=>500,7763=>500,7764=>500, -7765=>500,7766=>500,7767=>500,7768=>500,7769=>500,7770=>500,7771=>500,7772=>500,7773=>500,7774=>500, -7775=>500,7776=>500,7777=>500,7778=>500,7779=>500,7780=>500,7781=>500,7782=>500,7783=>500,7784=>500, -7785=>500,7786=>500,7787=>500,7788=>500,7789=>500,7790=>500,7791=>500,7792=>500,7793=>500,7794=>500, -7795=>500,7796=>500,7797=>500,7798=>500,7799=>500,7800=>500,7801=>500,7802=>500,7803=>500,7804=>500, -7805=>500,7806=>500,7807=>500,7808=>500,7809=>500,7810=>500,7811=>500,7812=>500,7813=>500,7814=>500, -7815=>500,7816=>500,7817=>500,7818=>500,7819=>500,7820=>500,7821=>500,7822=>500,7823=>500,7824=>500, -7825=>500,7826=>500,7827=>500,7828=>500,7829=>500,7830=>500,7831=>500,7832=>500,7833=>500,7834=>500, -7835=>500,7836=>500,7837=>500,7838=>500,7839=>500,7840=>500,7841=>500,7842=>500,7843=>500,7844=>500, -7845=>500,7846=>500,7847=>500,7848=>500,7849=>500,7850=>500,7851=>500,7852=>500,7853=>500,7854=>500, -7855=>500,7856=>500,7857=>500,7858=>500,7859=>500,7860=>500,7861=>500,7862=>500,7863=>500,7864=>500, -7865=>500,7866=>500,7867=>500,7868=>500,7869=>500,7870=>500,7871=>500,7872=>500,7873=>500,7874=>500, -7875=>500,7876=>500,7877=>500,7878=>500,7879=>500,7880=>500,7881=>500,7882=>500,7883=>500,7884=>500, -7885=>500,7886=>500,7887=>500,7888=>500,7889=>500,7890=>500,7891=>500,7892=>500,7893=>500,7894=>500, -7895=>500,7896=>500,7897=>500,7898=>500,7899=>500,7900=>500,7901=>500,7902=>500,7903=>500,7904=>500, -7905=>500,7906=>500,7907=>500,7908=>500,7909=>500,7910=>500,7911=>500,7912=>500,7913=>500,7914=>500, -7915=>500,7916=>500,7917=>500,7918=>500,7919=>500,7920=>500,7921=>500,7922=>500,7923=>500,7924=>500, -7925=>500,7926=>500,7927=>500,7928=>500,7929=>500,7930=>500,7931=>500,7932=>500,7933=>500,7934=>500, -7935=>500,7936=>500,7937=>500,7938=>500,7939=>500,7940=>500,7941=>500,7942=>500,7943=>500,7944=>500, -7945=>500,7946=>500,7947=>500,7948=>500,7949=>500,7950=>500,7951=>500,7952=>500,7953=>500,7954=>500, -7955=>500,7956=>500,7957=>500,7958=>500,7959=>500,7960=>500,7961=>500,7962=>500,7963=>500,7964=>500, -7965=>500,7966=>500,7967=>500,7968=>500,7969=>500,7970=>500,7971=>500,7972=>500,7973=>500,7974=>500, -7975=>500,7976=>500,7977=>500,7978=>500,7979=>500,7980=>500,7981=>500,7982=>500,7983=>500,7984=>500, -7985=>500,7986=>500,7987=>500,7988=>500,7989=>500,7990=>500,7991=>500,7992=>500,7993=>500,7994=>500, -7995=>500,7996=>500,7997=>500,7998=>500,7999=>500,8000=>500,8001=>500,8002=>500,8003=>500,8004=>500, -8005=>500,8006=>500,8007=>500,8008=>500,8009=>500,8010=>500,8011=>500,8012=>500,8013=>500,8014=>500, -8015=>500,8016=>500,8017=>500,8018=>500,8019=>500,8020=>500,8021=>500,8022=>500,8023=>500,8024=>500, -8025=>500,8026=>500,8027=>500,8028=>500,8029=>500,8030=>500,8031=>500,8032=>500,8033=>500,8034=>500, -8035=>500,8036=>500,8037=>500,8038=>500,8039=>500,8040=>500,8041=>500,8042=>500,8043=>500,8044=>500, -8045=>500,8046=>500,8047=>500,8048=>500,8049=>500,8050=>500,8051=>500,8052=>500,8053=>500,8054=>500, -8055=>500,8056=>500,8057=>500,8058=>500,8059=>500,8060=>500,8061=>500,8062=>500,8063=>500,8064=>500, -8065=>500,8066=>500,8067=>500,8068=>500,8069=>500,8070=>500,8071=>500,8072=>500,8073=>500,8074=>500, -8075=>500,8076=>500,8077=>500,8078=>500,8079=>500,8080=>500,8081=>500,8082=>500,8083=>500,8084=>500, -8085=>500,8086=>500,8087=>500,8088=>500,8089=>500,8090=>500,8091=>500,8092=>500,8093=>500,8094=>500, -8095=>500,8096=>500,8097=>500,8098=>500,8099=>500,8100=>500,8101=>500,8102=>500,8103=>500,8104=>500, -8105=>500,8106=>500,8107=>500,8108=>500,8109=>500,8110=>500,8111=>500,8112=>500,8113=>500,8114=>500, -8115=>500,8116=>500,8117=>500,8118=>500,8119=>500,8120=>500,8121=>500,8122=>500,8123=>500,8124=>500, -8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>500,8131=>500,8132=>500,8133=>500,8134=>500, -8135=>500,8136=>500,8137=>500,8138=>500,8139=>500,8140=>500,8141=>500,8142=>500,8143=>500,8144=>500, -8145=>500,8146=>500,8147=>500,8148=>500,8149=>500,8150=>500,8151=>500,8152=>500,8153=>500,8154=>500, -8155=>500,8156=>500,8157=>500,8158=>500,8159=>500,8160=>500,8161=>500,8162=>500,8163=>500,8164=>500, -8165=>500,8166=>500,8167=>500,8168=>500,8169=>500,8170=>500,8171=>500,8172=>500,8173=>500,8174=>500, -8175=>500,8176=>500,8177=>500,8178=>500,8179=>500,8180=>500,8181=>500,8182=>500,8183=>500,8184=>500, -8185=>500,8186=>500,8187=>500,8188=>500,8189=>500,8190=>500,8191=>500,8192=>500,8193=>500,8194=>500, -8195=>500,8196=>500,8197=>500,8198=>500,8199=>500,8200=>500,8201=>500,8202=>500,8203=>500,8204=>500, -8205=>500,8206=>500,8207=>500,8208=>500,8209=>500,8210=>500,8213=>500,8214=>500,8215=>500,8219=>500, -8223=>500,8227=>500,8228=>500,8229=>500,8231=>500,8232=>1000,8233=>1000,8234=>1000,8235=>1000,8236=>1000, -8237=>1000,8238=>1000,8239=>500,8241=>500,8242=>500,8243=>500,8244=>500,8245=>500,8246=>500,8247=>500, -8248=>500,8251=>500,8252=>500,8253=>500,8254=>500,8255=>500,8256=>500,8257=>500,8258=>500,8259=>500, -8260=>500,8261=>500,8262=>500,8263=>500,8264=>500,8265=>500,8266=>500,8267=>500,8268=>500,8269=>500, -8270=>500,8271=>500,8272=>500,8273=>500,8274=>500,8275=>500,8276=>500,8277=>500,8278=>500,8279=>1000, -8280=>500,8281=>500,8282=>500,8283=>500,8284=>500,8285=>500,8286=>500,8287=>500,8293=>500,8294=>500, -8295=>500,8296=>500,8297=>500,8298=>1000,8299=>1000,8300=>1000,8301=>1000,8302=>1000,8303=>1000,8304=>500, -8305=>500,8306=>500,8307=>500,8308=>500,8309=>500,8310=>500,8311=>500,8312=>500,8313=>500,8314=>500, -8315=>500,8316=>500,8317=>500,8318=>500,8319=>500,8320=>500,8321=>500,8322=>500,8323=>500,8324=>500, -8325=>500,8326=>500,8327=>500,8328=>500,8329=>500,8330=>500,8331=>500,8332=>500,8333=>500,8334=>500, -8335=>500,8336=>500,8337=>500,8338=>500,8339=>500,8340=>500,8341=>500,8342=>500,8343=>500,8344=>500, -8345=>500,8346=>500,8347=>500,8348=>500,8349=>500,8350=>500,8351=>500,8352=>500,8353=>500,8354=>500, -8355=>500,8356=>500,8357=>500,8358=>500,8359=>500,8360=>500,8361=>500,8362=>500,8363=>500,8365=>500, -8366=>500,8367=>500,8368=>500,8369=>500,8370=>500,8371=>500,8372=>500,8373=>500,8374=>500,8375=>500, -8376=>500,8377=>500,8378=>500,8379=>500,8380=>500,8381=>500,8382=>500,8383=>500,8384=>500,8385=>500, -8386=>500,8387=>500,8388=>500,8389=>500,8390=>500,8391=>500,8392=>500,8393=>500,8394=>500,8395=>500, -8396=>500,8397=>500,8398=>500,8399=>500,8400=>0,8401=>0,8402=>0,8403=>0,8404=>0,8405=>0, -8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0, -8416=>0,8417=>0,8418=>0,8419=>0,8420=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0, -8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8433=>500,8434=>500,8435=>500, -8436=>500,8437=>500,8438=>500,8439=>500,8440=>500,8441=>500,8442=>500,8443=>500,8444=>500,8445=>500, -8446=>500,8447=>500,8448=>500,8449=>500,8450=>500,8451=>500,8452=>500,8453=>500,8454=>500,8455=>500, -8456=>500,8457=>500,8458=>500,8459=>500,8460=>500,8461=>500,8462=>500,8463=>500,8464=>500,8465=>500, -8466=>500,8467=>500,8468=>500,8469=>500,8470=>500,8471=>500,8472=>500,8473=>500,8474=>500,8475=>500, -8476=>500,8477=>500,8478=>500,8479=>500,8480=>500,8481=>500,8483=>500,8484=>500,8485=>500,8486=>500, -8487=>500,8488=>500,8489=>500,8490=>500,8491=>500,8492=>500,8493=>500,8494=>500,8495=>500,8496=>500, -8497=>500,8498=>500,8499=>500,8500=>500,8501=>500,8502=>500,8503=>500,8504=>500,8505=>500,8506=>1000, -8507=>1000,8508=>1000,8509=>1000,8510=>500,8511=>1000,8512=>1000,8513=>500,8514=>500,8515=>500,8516=>500, -8517=>1000,8518=>1000,8519=>500,8520=>500,8521=>500,8522=>500,8523=>500,8524=>1000,8525=>500,8526=>500, -8527=>1000,8528=>500,8529=>500,8530=>500,8531=>500,8532=>500,8533=>500,8534=>500,8535=>500,8536=>500, -8537=>500,8538=>500,8539=>500,8540=>500,8541=>500,8542=>500,8543=>500,8544=>500,8545=>500,8546=>500, -8547=>500,8548=>500,8549=>500,8550=>500,8551=>500,8552=>500,8553=>500,8554=>500,8555=>500,8556=>500, -8557=>500,8558=>500,8559=>500,8560=>500,8561=>500,8562=>500,8563=>500,8564=>500,8565=>500,8566=>500, -8567=>500,8568=>500,8569=>500,8570=>500,8571=>500,8572=>500,8573=>500,8574=>500,8575=>500,8576=>500, -8577=>500,8578=>1000,8579=>500,8580=>500,8581=>500,8582=>500,8583=>500,8584=>1000,8585=>500,8586=>500, -8587=>500,8588=>500,8589=>500,8590=>500,8591=>500,8592=>500,8593=>500,8594=>500,8595=>500,8596=>500, -8597=>500,8598=>500,8599=>500,8600=>500,8601=>500,8602=>500,8603=>500,8604=>500,8605=>500,8606=>500, -8607=>500,8608=>500,8609=>500,8610=>500,8611=>500,8612=>500,8613=>500,8614=>500,8615=>500,8616=>500, -8617=>500,8618=>500,8619=>500,8620=>500,8621=>500,8622=>500,8623=>500,8624=>500,8625=>500,8626=>500, -8627=>500,8628=>500,8629=>500,8630=>500,8631=>500,8632=>500,8633=>500,8634=>500,8635=>500,8636=>500, -8637=>500,8638=>500,8639=>500,8640=>500,8641=>500,8642=>500,8643=>500,8644=>500,8645=>500,8646=>500, -8647=>500,8648=>500,8649=>500,8650=>500,8651=>500,8652=>500,8653=>500,8654=>500,8655=>500,8656=>500, -8657=>500,8658=>500,8659=>500,8660=>500,8661=>500,8662=>500,8663=>500,8664=>500,8665=>500,8666=>500, -8667=>500,8668=>500,8669=>500,8670=>500,8671=>500,8672=>500,8673=>500,8674=>500,8675=>500,8676=>500, -8677=>500,8678=>500,8679=>500,8680=>500,8681=>500,8682=>500,8683=>500,8684=>500,8685=>500,8686=>500, -8687=>500,8688=>500,8689=>500,8690=>500,8691=>500,8692=>1000,8693=>500,8694=>500,8695=>500,8696=>500, -8697=>1000,8698=>1000,8699=>1000,8700=>1000,8701=>500,8702=>500,8703=>1000,8704=>500,8705=>500,8706=>500, -8707=>500,8708=>500,8709=>500,8710=>500,8711=>500,8712=>500,8713=>500,8714=>500,8715=>500,8716=>500, -8717=>500,8718=>500,8719=>500,8720=>500,8721=>500,8722=>500,8723=>500,8724=>500,8725=>500,8726=>500, -8727=>500,8728=>500,8729=>500,8730=>500,8731=>500,8732=>500,8733=>500,8734=>500,8735=>500,8736=>500, -8737=>500,8738=>500,8739=>500,8740=>500,8741=>500,8742=>500,8743=>500,8744=>500,8745=>500,8746=>500, -8747=>500,8748=>500,8749=>500,8750=>500,8751=>500,8752=>500,8753=>500,8754=>500,8755=>500,8756=>500, -8757=>500,8758=>500,8759=>500,8760=>500,8761=>500,8762=>500,8763=>500,8764=>500,8765=>500,8766=>500, -8767=>500,8768=>500,8769=>500,8770=>500,8771=>500,8772=>500,8773=>500,8774=>500,8775=>500,8776=>500, -8777=>500,8778=>500,8779=>500,8780=>500,8781=>500,8782=>500,8783=>500,8784=>500,8785=>500,8786=>500, -8787=>500,8788=>500,8789=>500,8790=>500,8791=>500,8792=>500,8793=>500,8794=>500,8795=>500,8796=>500, -8797=>500,8798=>500,8799=>500,8800=>500,8801=>500,8802=>500,8803=>500,8804=>500,8805=>500,8806=>500, -8807=>500,8808=>500,8809=>500,8810=>500,8811=>500,8812=>500,8813=>500,8814=>500,8815=>500,8816=>500, -8817=>500,8818=>500,8819=>500,8820=>500,8821=>500,8822=>500,8823=>500,8824=>500,8825=>500,8826=>500, -8827=>500,8828=>500,8829=>500,8830=>500,8831=>500,8832=>500,8833=>500,8834=>500,8835=>500,8836=>500, -8837=>500,8838=>500,8839=>500,8840=>500,8841=>500,8842=>500,8843=>500,8844=>500,8845=>500,8846=>500, -8847=>500,8848=>500,8849=>500,8850=>500,8851=>500,8852=>500,8853=>500,8854=>500,8855=>500,8856=>500, -8857=>500,8858=>500,8859=>500,8860=>500,8861=>500,8862=>500,8863=>500,8864=>500,8865=>500,8866=>500, -8867=>500,8868=>500,8869=>500,8870=>500,8871=>500,8872=>500,8873=>500,8874=>500,8875=>500,8876=>500, -8877=>500,8878=>500,8879=>500,8880=>500,8881=>500,8882=>500,8883=>500,8884=>500,8885=>500,8886=>500, -8887=>500,8888=>500,8889=>500,8890=>500,8891=>500,8892=>500,8893=>500,8894=>500,8895=>500,8896=>500, -8897=>500,8898=>500,8899=>500,8900=>500,8901=>500,8902=>500,8903=>500,8904=>500,8905=>500,8906=>500, -8907=>500,8908=>500,8909=>500,8910=>500,8911=>500,8912=>500,8913=>500,8914=>500,8915=>500,8916=>500, -8917=>500,8918=>500,8919=>500,8920=>500,8921=>500,8922=>500,8923=>500,8924=>500,8925=>500,8926=>500, -8927=>500,8928=>500,8929=>500,8930=>500,8931=>500,8932=>500,8933=>500,8934=>500,8935=>500,8936=>500, -8937=>500,8938=>500,8939=>500,8940=>500,8941=>500,8942=>500,8943=>500,8944=>500,8945=>500,8946=>1000, -8947=>1000,8948=>500,8949=>1000,8950=>1000,8951=>500,8952=>1000,8953=>1000,8954=>1000,8955=>1000,8956=>500, -8957=>1000,8958=>500,8959=>1000,8960=>500,8961=>500,8962=>500,8963=>500,8964=>500,8965=>500,8966=>500, -8967=>500,8968=>500,8969=>500,8970=>500,8971=>500,8972=>500,8973=>500,8974=>500,8975=>500,8976=>500, -8977=>500,8978=>500,8979=>500,8980=>500,8981=>500,8982=>500,8983=>500,8984=>500,8985=>500,8986=>500, -8987=>500,8988=>500,8989=>500,8990=>500,8991=>500,8992=>500,8993=>500,8994=>500,8995=>500,8996=>500, -8997=>500,8998=>500,8999=>500,9000=>500,9001=>500,9002=>500,9003=>500,9004=>500,9005=>500,9006=>500, -9007=>500,9008=>500,9009=>500,9010=>500,9011=>500,9012=>500,9013=>500,9014=>500,9015=>500,9016=>500, -9017=>500,9018=>500,9019=>500,9020=>500,9021=>500,9022=>500,9023=>500,9024=>500,9025=>500,9026=>500, -9027=>500,9028=>500,9029=>500,9030=>500,9031=>500,9032=>500,9033=>500,9034=>500,9035=>500,9036=>500, -9037=>500,9038=>500,9039=>500,9040=>500,9041=>500,9042=>500,9043=>500,9044=>500,9045=>500,9046=>500, -9047=>500,9048=>500,9049=>500,9050=>500,9051=>500,9052=>500,9053=>500,9054=>500,9055=>500,9056=>500, -9057=>500,9058=>500,9059=>500,9060=>500,9061=>500,9062=>500,9063=>500,9064=>500,9065=>500,9066=>500, -9067=>500,9068=>500,9069=>500,9070=>500,9071=>500,9072=>500,9073=>500,9074=>500,9075=>500,9076=>500, -9077=>500,9078=>500,9079=>500,9080=>500,9081=>500,9082=>500,9083=>1000,9084=>1000,9085=>1000,9086=>1000, -9087=>500,9088=>500,9089=>1000,9090=>1000,9091=>1000,9092=>1000,9093=>1000,9094=>1000,9095=>1000,9096=>1000, -9097=>1000,9098=>1000,9099=>1000,9100=>1000,9101=>1000,9102=>1000,9103=>1000,9104=>1000,9105=>1000,9106=>1000, -9107=>1000,9108=>1000,9109=>500,9110=>500,9111=>1000,9112=>1000,9113=>1000,9114=>1000,9115=>500,9116=>500, -9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500, -9127=>500,9128=>500,9129=>500,9130=>500,9131=>500,9132=>500,9133=>500,9134=>500,9135=>500,9136=>500, -9137=>500,9138=>1000,9139=>1000,9140=>1000,9141=>1000,9142=>1000,9143=>500,9144=>500,9145=>500,9146=>500, -9147=>500,9148=>500,9149=>500,9150=>500,9151=>500,9152=>1000,9153=>1000,9154=>1000,9155=>1000,9156=>1000, -9157=>1000,9158=>1000,9159=>1000,9160=>1000,9161=>1000,9162=>1000,9163=>500,9164=>500,9165=>1000,9166=>1000, -9167=>500,9168=>500,9169=>500,9170=>500,9171=>500,9172=>1000,9173=>1000,9174=>1000,9175=>1000,9176=>1000, -9177=>1000,9178=>500,9179=>1000,9180=>1000,9181=>1000,9182=>1000,9183=>1000,9184=>1000,9185=>1000,9186=>1000, -9187=>1000,9188=>1000,9189=>1000,9190=>1000,9191=>1000,9192=>500,9193=>500,9194=>500,9195=>500,9196=>500, -9197=>500,9198=>500,9199=>500,9200=>500,9201=>500,9202=>500,9203=>500,9204=>500,9205=>500,9206=>500, -9207=>500,9208=>500,9209=>500,9210=>500,9211=>500,9212=>500,9213=>500,9214=>500,9215=>500,9216=>1000, -9217=>1000,9218=>1000,9219=>1000,9220=>1000,9221=>1000,9222=>1000,9223=>1000,9224=>1000,9225=>1000,9226=>1000, -9227=>1000,9228=>1000,9229=>1000,9230=>1000,9231=>1000,9232=>1000,9233=>1000,9234=>1000,9235=>1000,9236=>1000, -9237=>1000,9238=>1000,9239=>1000,9240=>1000,9241=>1000,9242=>1000,9243=>1000,9244=>1000,9245=>1000,9246=>1000, -9247=>1000,9248=>1000,9249=>1000,9250=>500,9251=>500,9252=>500,9253=>500,9254=>500,9255=>500,9256=>500, -9257=>500,9258=>500,9259=>500,9260=>500,9261=>500,9262=>500,9263=>500,9264=>500,9265=>500,9266=>500, -9267=>500,9268=>500,9269=>500,9270=>500,9271=>500,9272=>500,9273=>500,9274=>500,9275=>500,9276=>500, -9277=>500,9278=>500,9279=>500,9280=>500,9281=>500,9282=>500,9283=>500,9284=>500,9285=>500,9286=>500, -9287=>500,9288=>500,9289=>500,9290=>500,9291=>500,9292=>500,9293=>500,9294=>500,9295=>500,9296=>500, -9297=>500,9298=>500,9299=>500,9300=>500,9301=>500,9302=>500,9303=>500,9304=>500,9305=>500,9306=>500, -9307=>500,9308=>500,9309=>500,9310=>500,9311=>500,9312=>1000,9313=>1000,9314=>1000,9315=>1000,9316=>1000, -9317=>1000,9318=>1000,9319=>1000,9320=>1000,9321=>1000,9322=>1000,9323=>1000,9324=>1000,9325=>1000,9326=>1000, -9327=>1000,9328=>1000,9329=>1000,9330=>1000,9331=>1000,9332=>1000,9333=>1000,9334=>1000,9335=>1000,9336=>1000, -9337=>1000,9338=>1000,9339=>1000,9340=>1000,9341=>1000,9342=>1000,9343=>1000,9344=>1000,9345=>1000,9346=>1000, -9347=>1000,9348=>1000,9349=>1000,9350=>1000,9351=>1000,9352=>1000,9353=>1000,9354=>1000,9355=>1000,9356=>1000, -9357=>1000,9358=>1000,9359=>1000,9360=>1000,9361=>1000,9362=>1000,9363=>1000,9364=>1000,9365=>1000,9366=>1000, -9367=>1000,9368=>1000,9369=>1000,9370=>1000,9371=>1000,9372=>1000,9373=>1000,9374=>1000,9375=>1000,9376=>1000, -9377=>1000,9378=>1000,9379=>1000,9380=>1000,9381=>1000,9382=>1000,9383=>1000,9384=>1000,9385=>1000,9386=>1000, -9387=>1000,9388=>1000,9389=>1000,9390=>1000,9391=>1000,9392=>1000,9393=>1000,9394=>1000,9395=>1000,9396=>1000, -9397=>1000,9398=>1000,9399=>1000,9400=>1000,9401=>1000,9402=>1000,9403=>1000,9404=>1000,9405=>1000,9406=>1000, -9407=>1000,9408=>1000,9409=>1000,9410=>1000,9411=>1000,9412=>1000,9413=>1000,9414=>1000,9415=>1000,9416=>1000, -9417=>1000,9418=>1000,9419=>1000,9420=>1000,9421=>1000,9422=>1000,9423=>1000,9424=>1000,9425=>1000,9426=>1000, -9427=>1000,9428=>1000,9429=>1000,9430=>1000,9431=>1000,9432=>1000,9433=>1000,9434=>1000,9435=>1000,9436=>1000, -9437=>1000,9438=>1000,9439=>1000,9440=>1000,9441=>1000,9442=>1000,9443=>1000,9444=>1000,9445=>1000,9446=>1000, -9447=>1000,9448=>1000,9449=>1000,9450=>1000,9451=>1000,9452=>1000,9453=>1000,9454=>1000,9455=>1000,9456=>1000, -9457=>1000,9458=>1000,9459=>1000,9460=>1000,9461=>1000,9462=>1000,9463=>1000,9464=>1000,9465=>1000,9466=>1000, -9467=>1000,9468=>1000,9469=>1000,9470=>1000,9471=>1000,9472=>500,9473=>500,9474=>500,9475=>500,9476=>500, -9477=>500,9478=>500,9479=>500,9480=>500,9481=>500,9482=>500,9483=>500,9484=>500,9485=>500,9486=>500, -9487=>500,9488=>500,9489=>500,9490=>500,9491=>500,9492=>500,9493=>500,9494=>500,9495=>500,9496=>500, -9497=>500,9498=>500,9499=>500,9500=>500,9501=>500,9502=>500,9503=>500,9504=>500,9505=>500,9506=>500, -9507=>500,9508=>500,9509=>500,9510=>500,9511=>500,9512=>500,9513=>500,9514=>500,9515=>500,9516=>500, -9517=>500,9518=>500,9519=>500,9520=>500,9521=>500,9522=>500,9523=>500,9524=>500,9525=>500,9526=>500, -9527=>500,9528=>500,9529=>500,9530=>500,9531=>500,9532=>500,9533=>500,9534=>500,9535=>500,9536=>500, -9537=>500,9538=>500,9539=>500,9540=>500,9541=>500,9542=>500,9543=>500,9544=>500,9545=>500,9546=>500, -9547=>500,9548=>500,9549=>500,9550=>500,9551=>500,9552=>500,9553=>500,9554=>500,9555=>500,9556=>500, -9557=>500,9558=>500,9559=>500,9560=>500,9561=>500,9562=>500,9563=>500,9564=>500,9565=>500,9566=>500, -9567=>500,9568=>500,9569=>500,9570=>500,9571=>500,9572=>500,9573=>500,9574=>500,9575=>500,9576=>500, -9577=>500,9578=>500,9579=>500,9580=>500,9581=>500,9582=>500,9583=>500,9584=>500,9585=>500,9586=>500, -9587=>500,9588=>500,9589=>500,9590=>500,9591=>500,9592=>500,9593=>500,9594=>500,9595=>500,9596=>500, -9597=>500,9598=>500,9599=>500,9600=>1000,9601=>1000,9602=>1000,9603=>1000,9604=>1000,9605=>1000,9606=>1000, -9607=>1000,9608=>1000,9609=>1000,9610=>1000,9611=>1000,9612=>1000,9613=>1000,9614=>1000,9615=>1000,9616=>1000, -9617=>1000,9618=>1000,9619=>1000,9620=>1000,9621=>1000,9622=>1000,9623=>1000,9624=>1000,9625=>1000,9626=>1000, -9627=>1000,9628=>1000,9629=>1000,9630=>1000,9631=>1000,9632=>500,9633=>500,9634=>500,9635=>500,9636=>500, -9637=>500,9638=>500,9639=>500,9640=>500,9641=>500,9642=>500,9643=>500,9644=>500,9645=>500,9646=>500, -9647=>500,9648=>500,9649=>500,9650=>500,9651=>500,9652=>500,9653=>500,9654=>500,9655=>500,9656=>500, -9657=>500,9658=>500,9659=>500,9660=>500,9661=>500,9662=>500,9663=>500,9664=>500,9665=>500,9666=>500, -9667=>500,9668=>500,9669=>500,9670=>500,9671=>500,9672=>500,9673=>500,9674=>500,9675=>500,9676=>500, -9677=>500,9678=>500,9679=>500,9680=>500,9681=>500,9682=>500,9683=>500,9684=>500,9685=>500,9686=>500, -9687=>500,9688=>500,9689=>500,9690=>500,9691=>500,9692=>500,9693=>500,9694=>500,9695=>500,9696=>500, -9697=>500,9698=>500,9699=>500,9700=>500,9701=>500,9702=>500,9703=>500,9704=>500,9705=>500,9706=>500, -9707=>500,9708=>500,9709=>500,9710=>500,9711=>500,9712=>500,9713=>500,9714=>500,9715=>500,9716=>500, -9717=>500,9718=>500,9719=>500,9720=>500,9721=>500,9722=>500,9723=>500,9724=>500,9725=>500,9726=>500, -9727=>500,9728=>500,9729=>500,9730=>500,9731=>1000,9732=>500,9733=>500,9734=>500,9735=>500,9736=>500, -9737=>500,9738=>500,9739=>500,9740=>500,9741=>500,9742=>500,9743=>500,9744=>500,9745=>500,9746=>500, -9747=>500,9748=>500,9749=>1000,9750=>1000,9751=>1000,9752=>1000,9753=>1000,9754=>500,9755=>500,9756=>500, -9757=>500,9758=>500,9759=>500,9760=>500,9761=>500,9762=>1000,9763=>1000,9764=>1000,9765=>500,9766=>500, -9767=>500,9768=>500,9769=>500,9770=>500,9771=>1000,9772=>1000,9773=>500,9774=>500,9775=>1000,9776=>1000, -9777=>1000,9778=>1000,9779=>1000,9780=>1000,9781=>1000,9782=>1000,9783=>1000,9784=>500,9785=>500,9786=>500, -9787=>500,9788=>500,9789=>500,9790=>500,9791=>500,9792=>500,9793=>500,9794=>500,9795=>500,9796=>500, -9797=>500,9798=>500,9799=>500,9800=>500,9801=>500,9802=>500,9803=>500,9804=>500,9805=>500,9806=>500, -9807=>500,9808=>500,9809=>500,9810=>500,9811=>500,9812=>500,9813=>500,9814=>500,9815=>500,9816=>500, -9817=>500,9818=>500,9819=>500,9820=>500,9821=>500,9822=>500,9823=>500,9824=>500,9825=>500,9826=>500, -9827=>500,9828=>500,9829=>500,9830=>500,9831=>500,9832=>500,9833=>500,9834=>500,9835=>500,9836=>500, -9837=>500,9838=>500,9839=>500,9840=>500,9841=>500,9842=>1000,9843=>1000,9844=>1000,9845=>1000,9846=>1000, -9847=>1000,9848=>1000,9849=>1000,9850=>1000,9851=>1000,9852=>1000,9853=>1000,9854=>1000,9855=>1000,9856=>1000, -9857=>1000,9858=>1000,9859=>1000,9860=>1000,9861=>1000,9862=>1000,9863=>1000,9864=>1000,9865=>1000,9866=>1000, -9867=>1000,9868=>1000,9869=>1000,9870=>1000,9871=>1000,9872=>500,9873=>500,9874=>1000,9875=>1000,9876=>1000, -9877=>1000,9878=>1000,9879=>1000,9880=>1000,9881=>1000,9882=>1000,9883=>1000,9884=>1000,9885=>1000,9886=>500, -9887=>500,9888=>1000,9889=>500,9890=>1000,9891=>1000,9892=>1000,9893=>1000,9894=>1000,9895=>1000,9896=>500, -9897=>1000,9898=>500,9899=>500,9900=>500,9901=>1000,9902=>1000,9903=>1000,9904=>1000,9905=>1000,9906=>500, -9907=>500,9908=>500,9909=>500,9910=>1000,9911=>500,9912=>500,9913=>500,9914=>500,9915=>500,9916=>500, -9917=>500,9918=>500,9919=>500,9920=>1000,9921=>1000,9922=>1000,9923=>1000,9924=>500,9925=>500,9926=>500, -9927=>500,9928=>500,9929=>500,9930=>500,9931=>500,9932=>500,9933=>500,9934=>500,9935=>500,9936=>500, -9937=>500,9938=>500,9939=>500,9940=>500,9941=>500,9942=>500,9943=>500,9944=>500,9945=>500,9946=>500, -9947=>500,9948=>500,9949=>500,9950=>500,9951=>500,9952=>500,9953=>500,9954=>500,9955=>500,9956=>500, -9957=>500,9958=>500,9959=>500,9960=>500,9961=>500,9962=>500,9963=>500,9964=>500,9965=>500,9966=>500, -9967=>500,9968=>500,9969=>500,9970=>500,9971=>500,9972=>500,9973=>500,9974=>500,9975=>500,9976=>500, -9977=>500,9978=>500,9979=>500,9980=>500,9981=>500,9982=>500,9983=>500,9984=>500,9985=>1000,9986=>1000, -9987=>1000,9988=>1000,9989=>500,9990=>1000,9991=>1000,9992=>1000,9993=>1000,9994=>500,9995=>500,9996=>1000, -9997=>1000,9998=>1000,9999=>1000,10000=>1000,10001=>1000,10002=>1000,10003=>1000,10004=>1000,10005=>1000,10006=>1000, -10007=>1000,10008=>1000,10009=>1000,10010=>1000,10011=>1000,10012=>1000,10013=>1000,10014=>1000,10015=>1000,10016=>1000, -10017=>1000,10018=>1000,10019=>1000,10020=>1000,10021=>1000,10022=>1000,10023=>1000,10024=>500,10025=>1000,10026=>1000, -10027=>1000,10028=>1000,10029=>1000,10030=>1000,10031=>1000,10032=>1000,10033=>1000,10034=>1000,10035=>1000,10036=>1000, -10037=>1000,10038=>1000,10039=>1000,10040=>1000,10041=>1000,10042=>1000,10043=>1000,10044=>1000,10045=>1000,10046=>1000, -10047=>1000,10048=>1000,10049=>1000,10050=>1000,10051=>1000,10052=>1000,10053=>1000,10054=>1000,10055=>1000,10056=>1000, -10057=>1000,10058=>1000,10059=>1000,10060=>500,10061=>1000,10062=>500,10063=>1000,10064=>1000,10065=>1000,10066=>1000, -10067=>500,10068=>500,10069=>500,10070=>1000,10071=>500,10072=>1000,10073=>1000,10074=>1000,10075=>1000,10076=>1000, -10077=>1000,10078=>1000,10079=>500,10080=>500,10081=>1000,10082=>1000,10083=>1000,10084=>1000,10085=>1000,10086=>1000, -10087=>1000,10088=>500,10089=>500,10090=>500,10091=>500,10092=>500,10093=>500,10094=>500,10095=>500,10096=>500, -10097=>500,10098=>500,10099=>500,10100=>500,10101=>500,10102=>1000,10103=>1000,10104=>1000,10105=>1000,10106=>1000, -10107=>1000,10108=>1000,10109=>1000,10110=>1000,10111=>1000,10112=>1000,10113=>1000,10114=>1000,10115=>1000,10116=>1000, -10117=>1000,10118=>1000,10119=>1000,10120=>1000,10121=>1000,10122=>1000,10123=>1000,10124=>1000,10125=>1000,10126=>1000, -10127=>1000,10128=>1000,10129=>1000,10130=>1000,10131=>1000,10132=>1000,10133=>500,10134=>500,10135=>500,10136=>1000, -10137=>1000,10138=>1000,10139=>1000,10140=>1000,10141=>1000,10142=>1000,10143=>1000,10144=>1000,10145=>1000,10146=>1000, -10147=>1000,10148=>1000,10149=>1000,10150=>1000,10151=>1000,10152=>1000,10153=>1000,10154=>1000,10155=>1000,10156=>1000, -10157=>1000,10158=>1000,10159=>1000,10160=>500,10161=>1000,10162=>1000,10163=>1000,10164=>1000,10165=>1000,10166=>1000, -10167=>1000,10168=>1000,10169=>1000,10170=>1000,10171=>1000,10172=>1000,10173=>1000,10174=>1000,10175=>500,10176=>500, -10177=>1000,10178=>500,10179=>1000,10180=>1000,10181=>500,10182=>500,10183=>500,10184=>1000,10185=>1000,10186=>500, -10187=>500,10188=>1000,10189=>500,10190=>500,10191=>500,10192=>1000,10193=>500,10194=>1000,10195=>500,10196=>500, -10197=>1000,10198=>1000,10199=>1000,10200=>1000,10201=>1000,10202=>1000,10203=>1000,10204=>1000,10205=>1000,10206=>1000, -10207=>1000,10208=>500,10209=>1000,10210=>1000,10211=>1000,10212=>1000,10213=>1000,10214=>500,10215=>500,10216=>500, -10217=>500,10218=>500,10219=>500,10220=>500,10221=>500,10222=>500,10223=>500,10224=>1000,10225=>1000,10226=>1000, -10227=>1000,10228=>1000,10229=>1000,10230=>1000,10231=>1000,10232=>1000,10233=>1000,10234=>1000,10235=>1000,10236=>1000, -10237=>1000,10238=>1000,10239=>1000,10240=>500,10241=>500,10242=>500,10243=>500,10244=>500,10245=>500,10246=>500, -10247=>500,10248=>500,10249=>500,10250=>500,10251=>500,10252=>500,10253=>500,10254=>500,10255=>500,10256=>500, -10257=>500,10258=>500,10259=>500,10260=>500,10261=>500,10262=>500,10263=>500,10264=>500,10265=>500,10266=>500, -10267=>500,10268=>500,10269=>500,10270=>500,10271=>500,10272=>500,10273=>500,10274=>500,10275=>500,10276=>500, -10277=>500,10278=>500,10279=>500,10280=>500,10281=>500,10282=>500,10283=>500,10284=>500,10285=>500,10286=>500, -10287=>500,10288=>500,10289=>500,10290=>500,10291=>500,10292=>500,10293=>500,10294=>500,10295=>500,10296=>500, -10297=>500,10298=>500,10299=>500,10300=>500,10301=>500,10302=>500,10303=>500,10304=>500,10305=>500,10306=>500, -10307=>500,10308=>500,10309=>500,10310=>500,10311=>500,10312=>500,10313=>500,10314=>500,10315=>500,10316=>500, -10317=>500,10318=>500,10319=>500,10320=>500,10321=>500,10322=>500,10323=>500,10324=>500,10325=>500,10326=>500, -10327=>500,10328=>500,10329=>500,10330=>500,10331=>500,10332=>500,10333=>500,10334=>500,10335=>500,10336=>500, -10337=>500,10338=>500,10339=>500,10340=>500,10341=>500,10342=>500,10343=>500,10344=>500,10345=>500,10346=>500, -10347=>500,10348=>500,10349=>500,10350=>500,10351=>500,10352=>500,10353=>500,10354=>500,10355=>500,10356=>500, -10357=>500,10358=>500,10359=>500,10360=>500,10361=>500,10362=>500,10363=>500,10364=>500,10365=>500,10366=>500, -10367=>500,10368=>500,10369=>500,10370=>500,10371=>500,10372=>500,10373=>500,10374=>500,10375=>500,10376=>500, -10377=>500,10378=>500,10379=>500,10380=>500,10381=>500,10382=>500,10383=>500,10384=>500,10385=>500,10386=>500, -10387=>500,10388=>500,10389=>500,10390=>500,10391=>500,10392=>500,10393=>500,10394=>500,10395=>500,10396=>500, -10397=>500,10398=>500,10399=>500,10400=>500,10401=>500,10402=>500,10403=>500,10404=>500,10405=>500,10406=>500, -10407=>500,10408=>500,10409=>500,10410=>500,10411=>500,10412=>500,10413=>500,10414=>500,10415=>500,10416=>500, -10417=>500,10418=>500,10419=>500,10420=>500,10421=>500,10422=>500,10423=>500,10424=>500,10425=>500,10426=>500, -10427=>500,10428=>500,10429=>500,10430=>500,10431=>500,10432=>500,10433=>500,10434=>500,10435=>500,10436=>500, -10437=>500,10438=>500,10439=>500,10440=>500,10441=>500,10442=>500,10443=>500,10444=>500,10445=>500,10446=>500, -10447=>500,10448=>500,10449=>500,10450=>500,10451=>500,10452=>500,10453=>500,10454=>500,10455=>500,10456=>500, -10457=>500,10458=>500,10459=>500,10460=>500,10461=>500,10462=>500,10463=>500,10464=>500,10465=>500,10466=>500, -10467=>500,10468=>500,10469=>500,10470=>500,10471=>500,10472=>500,10473=>500,10474=>500,10475=>500,10476=>500, -10477=>500,10478=>500,10479=>500,10480=>500,10481=>500,10482=>500,10483=>500,10484=>500,10485=>500,10486=>500, -10487=>500,10488=>500,10489=>500,10490=>500,10491=>500,10492=>500,10493=>500,10494=>500,10495=>500,10496=>1000, -10497=>1000,10498=>1000,10499=>1000,10500=>1000,10501=>1000,10502=>1000,10503=>1000,10504=>1000,10505=>1000,10506=>1000, -10507=>1000,10508=>1000,10509=>1000,10510=>1000,10511=>1000,10512=>1000,10513=>1000,10514=>500,10515=>500,10516=>1000, -10517=>1000,10518=>1000,10519=>1000,10520=>1000,10521=>1000,10522=>1000,10523=>1000,10524=>1000,10525=>1000,10526=>1000, -10527=>1000,10528=>1000,10529=>1000,10530=>1000,10531=>1000,10532=>1000,10533=>1000,10534=>1000,10535=>1000,10536=>1000, -10537=>1000,10538=>1000,10539=>1000,10540=>1000,10541=>1000,10542=>1000,10543=>1000,10544=>1000,10545=>1000,10546=>1000, -10547=>1000,10548=>1000,10549=>1000,10550=>1000,10551=>1000,10552=>500,10553=>500,10554=>1000,10555=>1000,10556=>1000, -10557=>1000,10558=>1000,10559=>1000,10560=>1000,10561=>1000,10562=>1000,10563=>1000,10564=>1000,10565=>1000,10566=>1000, -10567=>1000,10568=>1000,10569=>500,10570=>1000,10571=>1000,10572=>500,10573=>500,10574=>1000,10575=>500,10576=>1000, -10577=>500,10578=>1000,10579=>1000,10580=>500,10581=>500,10582=>1000,10583=>1000,10584=>500,10585=>500,10586=>1000, -10587=>1000,10588=>500,10589=>500,10590=>1000,10591=>1000,10592=>500,10593=>500,10594=>1000,10595=>1000,10596=>1000, -10597=>1000,10598=>1000,10599=>1000,10600=>1000,10601=>1000,10602=>1000,10603=>1000,10604=>1000,10605=>1000,10606=>1000, -10607=>1000,10608=>1000,10609=>1000,10610=>1000,10611=>1000,10612=>1000,10613=>1000,10614=>1000,10615=>1000,10616=>1000, -10617=>1000,10618=>1000,10619=>1000,10620=>500,10621=>500,10622=>1000,10623=>1000,10624=>500,10625=>1000,10626=>500, -10627=>500,10628=>500,10629=>500,10630=>500,10631=>500,10632=>500,10633=>500,10634=>500,10635=>500,10636=>500, -10637=>500,10638=>500,10639=>500,10640=>500,10641=>500,10642=>500,10643=>1000,10644=>1000,10645=>1000,10646=>1000, -10647=>500,10648=>500,10649=>500,10650=>1000,10651=>1000,10652=>1000,10653=>1000,10654=>1000,10655=>1000,10656=>1000, -10657=>1000,10658=>1000,10659=>1000,10660=>1000,10661=>1000,10662=>500,10663=>500,10664=>1000,10665=>1000,10666=>1000, -10667=>1000,10668=>1000,10669=>1000,10670=>1000,10671=>1000,10672=>1000,10673=>1000,10674=>1000,10675=>1000,10676=>1000, -10677=>1000,10678=>1000,10679=>1000,10680=>1000,10681=>1000,10682=>1000,10683=>1000,10684=>1000,10685=>1000,10686=>1000, -10687=>1000,10688=>1000,10689=>1000,10690=>1000,10691=>1000,10692=>1000,10693=>1000,10694=>1000,10695=>1000,10696=>1000, -10697=>1000,10698=>1000,10699=>1000,10700=>1000,10701=>1000,10702=>1000,10703=>1000,10704=>1000,10705=>500,10706=>500, -10707=>500,10708=>500,10709=>500,10710=>500,10711=>500,10712=>500,10713=>500,10714=>1000,10715=>1000,10716=>1000, -10717=>1000,10718=>1000,10719=>1000,10720=>1000,10721=>1000,10722=>1000,10723=>1000,10724=>1000,10725=>1000,10726=>1000, -10727=>1000,10728=>1000,10729=>1000,10730=>1000,10731=>500,10732=>1000,10733=>1000,10734=>1000,10735=>1000,10736=>1000, -10737=>1000,10738=>1000,10739=>1000,10740=>1000,10741=>500,10742=>500,10743=>500,10744=>500,10745=>500,10746=>500, -10747=>500,10748=>500,10749=>500,10750=>1000,10751=>1000,10752=>1000,10753=>1000,10754=>1000,10755=>1000,10756=>1000, -10757=>1000,10758=>1000,10759=>1000,10760=>1000,10761=>1000,10762=>1000,10763=>1000,10764=>1000,10765=>1000,10766=>1000, -10767=>1000,10768=>1000,10769=>1000,10770=>1000,10771=>1000,10772=>1000,10773=>1000,10774=>1000,10775=>1000,10776=>1000, -10777=>1000,10778=>1000,10779=>1000,10780=>1000,10781=>1000,10782=>500,10783=>500,10784=>1000,10785=>500,10786=>500, -10787=>500,10788=>500,10789=>500,10790=>500,10791=>1000,10792=>500,10793=>500,10794=>500,10795=>500,10796=>500, -10797=>1000,10798=>1000,10799=>500,10800=>500,10801=>500,10802=>500,10803=>1000,10804=>1000,10805=>1000,10806=>1000, -10807=>1000,10808=>1000,10809=>1000,10810=>1000,10811=>1000,10812=>500,10813=>500,10814=>500,10815=>1000,10816=>1000, -10817=>1000,10818=>1000,10819=>1000,10820=>1000,10821=>1000,10822=>500,10823=>500,10824=>500,10825=>500,10826=>500, -10827=>500,10828=>1000,10829=>1000,10830=>1000,10831=>1000,10832=>1000,10833=>1000,10834=>1000,10835=>1000,10836=>1000, -10837=>1000,10838=>1000,10839=>1000,10840=>1000,10841=>1000,10842=>1000,10843=>1000,10844=>1000,10845=>1000,10846=>1000, -10847=>1000,10848=>1000,10849=>1000,10850=>1000,10851=>1000,10852=>1000,10853=>1000,10854=>500,10855=>500,10856=>1000, -10857=>1000,10858=>500,10859=>500,10860=>500,10861=>500,10862=>1000,10863=>500,10864=>500,10865=>500,10866=>500, -10867=>500,10868=>1000,10869=>1000,10870=>1000,10871=>500,10872=>1000,10873=>1000,10874=>1000,10875=>1000,10876=>1000, -10877=>1000,10878=>1000,10879=>1000,10880=>1000,10881=>1000,10882=>1000,10883=>1000,10884=>1000,10885=>1000,10886=>1000, -10887=>1000,10888=>1000,10889=>1000,10890=>1000,10891=>500,10892=>500,10893=>1000,10894=>1000,10895=>500,10896=>500, -10897=>500,10898=>500,10899=>500,10900=>500,10901=>1000,10902=>1000,10903=>1000,10904=>1000,10905=>1000,10906=>1000, -10907=>1000,10908=>1000,10909=>1000,10910=>1000,10911=>1000,10912=>1000,10913=>1000,10914=>1000,10915=>1000,10916=>1000, -10917=>1000,10918=>1000,10919=>1000,10920=>1000,10921=>1000,10922=>1000,10923=>1000,10924=>1000,10925=>1000,10926=>1000, -10927=>1000,10928=>1000,10929=>1000,10930=>1000,10931=>1000,10932=>1000,10933=>1000,10934=>1000,10935=>1000,10936=>1000, -10937=>1000,10938=>1000,10939=>1000,10940=>1000,10941=>1000,10942=>1000,10943=>500,10944=>500,10945=>500,10946=>500, -10947=>500,10948=>500,10949=>500,10950=>500,10951=>1000,10952=>1000,10953=>500,10954=>500,10955=>500,10956=>500, -10957=>1000,10958=>1000,10959=>1000,10960=>1000,10961=>1000,10962=>1000,10963=>500,10964=>500,10965=>500,10966=>500, -10967=>1000,10968=>1000,10969=>1000,10970=>1000,10971=>1000,10972=>1000,10973=>1000,10974=>500,10975=>1000,10976=>1000, -10977=>1000,10978=>1000,10979=>1000,10980=>1000,10981=>1000,10982=>1000,10983=>1000,10984=>1000,10985=>1000,10986=>1000, -10987=>1000,10988=>1000,10989=>1000,10990=>500,10991=>500,10992=>500,10993=>500,10994=>500,10995=>1000,10996=>1000, -10997=>1000,10998=>500,10999=>1000,11000=>1000,11001=>1000,11002=>1000,11003=>1000,11004=>1000,11005=>1000,11006=>500, -11007=>500,11008=>1000,11009=>1000,11010=>1000,11011=>1000,11012=>1000,11013=>1000,11014=>500,11015=>500,11016=>1000, -11017=>1000,11018=>1000,11019=>1000,11020=>1000,11021=>500,11022=>1000,11023=>1000,11024=>1000,11025=>1000,11026=>1000, -11027=>1000,11028=>1000,11029=>1000,11030=>1000,11031=>1000,11032=>1000,11033=>1000,11034=>1000,11035=>1000,11036=>1000, -11037=>500,11038=>500,11039=>1000,11040=>1000,11041=>1000,11042=>1000,11043=>1000,11044=>1000,11045=>500,11046=>500, -11047=>500,11048=>500,11049=>500,11050=>500,11051=>500,11052=>1000,11053=>1000,11054=>500,11055=>500,11056=>1000, -11057=>1000,11058=>1000,11059=>1000,11060=>1000,11061=>1000,11062=>1000,11063=>1000,11064=>1000,11065=>1000,11066=>1000, -11067=>1000,11068=>1000,11069=>1000,11070=>1000,11071=>1000,11072=>1000,11073=>1000,11074=>1000,11075=>1000,11076=>1000, -11077=>1000,11078=>1000,11079=>1000,11080=>1000,11081=>1000,11082=>1000,11083=>1000,11084=>1000,11085=>500,11086=>500, -11087=>500,11088=>1000,11089=>1000,11090=>1000,11091=>1000,11092=>1000,11093=>500,11094=>500,11095=>500,11096=>500, -11097=>500,11098=>500,11099=>500,11100=>500,11101=>500,11102=>500,11103=>500,11104=>500,11105=>500,11106=>500, -11107=>500,11108=>500,11109=>500,11110=>500,11111=>500,11112=>500,11113=>500,11114=>500,11115=>500,11116=>500, -11117=>500,11118=>500,11119=>500,11120=>500,11121=>500,11122=>500,11123=>500,11124=>500,11125=>500,11126=>500, -11127=>500,11128=>500,11129=>500,11130=>500,11131=>500,11132=>500,11133=>500,11134=>500,11135=>500,11136=>500, -11137=>500,11138=>500,11139=>500,11140=>500,11141=>500,11142=>500,11143=>500,11144=>500,11145=>500,11146=>500, -11147=>500,11148=>500,11149=>500,11150=>500,11151=>500,11152=>500,11153=>500,11154=>500,11155=>500,11156=>500, -11157=>500,11158=>500,11159=>500,11160=>500,11161=>500,11162=>500,11163=>500,11164=>500,11165=>500,11166=>500, -11167=>500,11168=>500,11169=>500,11170=>500,11171=>500,11172=>500,11173=>500,11174=>500,11175=>500,11176=>500, -11177=>500,11178=>500,11179=>500,11180=>500,11181=>500,11182=>500,11183=>500,11184=>500,11185=>500,11186=>500, -11187=>500,11188=>500,11189=>500,11190=>500,11191=>500,11192=>500,11193=>500,11194=>500,11195=>500,11196=>500, -11197=>500,11198=>500,11199=>500,11200=>500,11201=>500,11202=>500,11203=>500,11204=>500,11205=>500,11206=>500, -11207=>500,11208=>500,11209=>500,11210=>500,11211=>500,11212=>500,11213=>500,11214=>500,11215=>500,11216=>500, -11217=>500,11218=>500,11219=>500,11220=>500,11221=>500,11222=>500,11223=>500,11224=>500,11225=>500,11226=>500, -11227=>500,11228=>500,11229=>500,11230=>500,11231=>500,11232=>500,11233=>500,11234=>500,11235=>500,11236=>500, -11237=>500,11238=>500,11239=>500,11240=>500,11241=>500,11242=>500,11243=>500,11244=>500,11245=>500,11246=>500, -11247=>500,11248=>500,11249=>500,11250=>500,11251=>500,11252=>500,11253=>500,11254=>500,11255=>500,11256=>500, -11257=>500,11258=>500,11259=>500,11260=>500,11261=>500,11262=>500,11263=>500,11264=>500,11265=>500,11266=>500, -11267=>500,11268=>500,11269=>500,11270=>500,11271=>500,11272=>500,11273=>500,11274=>500,11275=>500,11276=>500, -11277=>500,11278=>500,11279=>1000,11280=>500,11281=>500,11282=>500,11283=>500,11284=>500,11285=>500,11286=>500, -11287=>500,11288=>500,11289=>500,11290=>500,11291=>500,11292=>500,11293=>500,11294=>500,11295=>1000,11296=>500, -11297=>500,11298=>500,11299=>500,11300=>500,11301=>500,11302=>500,11303=>1000,11304=>1000,11305=>1000,11306=>500, -11307=>500,11308=>500,11309=>500,11310=>500,11311=>500,11312=>500,11313=>500,11314=>500,11315=>500,11316=>500, -11317=>500,11318=>500,11319=>500,11320=>500,11321=>500,11322=>500,11323=>500,11324=>500,11325=>500,11326=>500, -11327=>1000,11328=>500,11329=>500,11330=>500,11331=>500,11332=>500,11333=>500,11334=>500,11335=>500,11336=>500, -11337=>500,11338=>500,11339=>500,11340=>500,11341=>500,11342=>500,11343=>1000,11344=>500,11345=>500,11346=>500, -11347=>500,11348=>500,11349=>500,11350=>500,11351=>1000,11352=>1000,11353=>1000,11354=>500,11355=>500,11356=>500, -11357=>500,11358=>500,11359=>500,11360=>500,11361=>500,11362=>500,11363=>500,11364=>500,11365=>500,11366=>500, -11367=>500,11368=>500,11369=>500,11370=>500,11371=>500,11372=>500,11373=>500,11374=>500,11375=>500,11376=>500, -11377=>500,11378=>500,11379=>500,11380=>500,11381=>500,11382=>500,11383=>500,11384=>500,11385=>500,11386=>500, -11387=>500,11388=>500,11389=>500,11390=>500,11391=>500,11392=>500,11393=>500,11394=>500,11395=>500,11396=>500, -11397=>500,11398=>500,11399=>500,11400=>500,11401=>500,11402=>500,11403=>500,11404=>500,11405=>500,11406=>500, -11407=>500,11408=>500,11409=>500,11410=>500,11411=>500,11412=>500,11413=>500,11414=>500,11415=>500,11416=>500, -11417=>500,11418=>500,11419=>500,11420=>500,11421=>500,11422=>500,11423=>500,11424=>500,11425=>500,11426=>500, -11427=>500,11428=>500,11429=>500,11430=>500,11431=>500,11432=>500,11433=>500,11434=>500,11435=>500,11436=>500, -11437=>500,11438=>500,11439=>500,11440=>500,11441=>500,11442=>500,11443=>500,11444=>500,11445=>500,11446=>500, -11447=>500,11448=>500,11449=>500,11450=>500,11451=>500,11452=>500,11453=>500,11454=>500,11455=>500,11456=>500, -11457=>500,11458=>500,11459=>500,11460=>500,11461=>500,11462=>500,11463=>500,11464=>500,11465=>500,11466=>500, -11467=>500,11468=>500,11469=>500,11470=>1000,11471=>1000,11472=>500,11473=>500,11474=>500,11475=>500,11476=>500, -11477=>500,11478=>500,11479=>500,11480=>500,11481=>500,11482=>500,11483=>500,11484=>500,11485=>500,11486=>500, -11487=>500,11488=>500,11489=>500,11490=>500,11491=>500,11492=>500,11493=>500,11494=>500,11495=>1000,11496=>500, -11497=>500,11498=>1000,11499=>500,11500=>500,11501=>500,11502=>500,11503=>500,11504=>500,11505=>500,11506=>500, -11507=>500,11508=>500,11509=>500,11510=>500,11511=>500,11512=>500,11513=>500,11514=>500,11515=>500,11516=>500, -11517=>500,11518=>500,11519=>500,11520=>500,11521=>500,11522=>500,11523=>500,11524=>500,11525=>1000,11526=>500, -11527=>1000,11528=>500,11529=>500,11530=>1000,11531=>500,11532=>500,11533=>1000,11534=>500,11535=>500,11536=>1000, -11537=>500,11538=>500,11539=>1000,11540=>1000,11541=>500,11542=>500,11543=>500,11544=>500,11545=>500,11546=>500, -11547=>1000,11548=>1000,11549=>500,11550=>500,11551=>500,11552=>1000,11553=>500,11554=>500,11555=>500,11556=>500, -11557=>1000,11558=>500,11559=>500,11560=>500,11561=>500,11562=>500,11563=>500,11564=>500,11565=>500,11566=>500, -11567=>500,11568=>500,11569=>500,11570=>500,11571=>500,11572=>500,11573=>500,11574=>500,11575=>500,11576=>500, -11577=>500,11578=>500,11579=>500,11580=>500,11581=>500,11582=>500,11583=>500,11584=>500,11585=>500,11586=>500, -11587=>500,11588=>500,11589=>500,11590=>500,11591=>500,11592=>1000,11593=>500,11594=>500,11595=>500,11596=>500, -11597=>500,11598=>500,11599=>500,11600=>500,11601=>500,11602=>500,11603=>500,11604=>500,11605=>500,11606=>500, -11607=>500,11608=>500,11609=>500,11610=>500,11611=>500,11612=>500,11613=>500,11614=>500,11615=>500,11616=>500, -11617=>500,11618=>500,11619=>500,11620=>500,11621=>500,11622=>500,11623=>500,11624=>500,11625=>500,11626=>500, -11627=>500,11628=>500,11629=>500,11630=>500,11631=>500,11632=>500,11633=>500,11634=>500,11635=>500,11636=>500, -11637=>500,11638=>500,11639=>500,11640=>500,11641=>500,11642=>500,11643=>500,11644=>500,11645=>500,11646=>500, -11647=>500,11648=>1000,11649=>1000,11650=>1000,11651=>1000,11652=>1000,11653=>1000,11654=>1000,11655=>1000,11656=>1000, -11657=>1000,11658=>1000,11659=>1000,11660=>1000,11661=>1000,11662=>1000,11663=>1000,11664=>1000,11665=>1000,11666=>1000, -11667=>1000,11668=>1000,11669=>1000,11670=>1000,11671=>500,11672=>500,11673=>500,11674=>500,11675=>500,11676=>500, -11677=>500,11678=>500,11679=>500,11680=>1000,11681=>1000,11682=>1000,11683=>1000,11684=>1000,11685=>1000,11686=>1000, -11687=>500,11688=>1000,11689=>1000,11690=>1000,11691=>1000,11692=>1000,11693=>1000,11694=>1000,11695=>500,11696=>1000, -11697=>1000,11698=>1000,11699=>1000,11700=>1000,11701=>1000,11702=>1000,11703=>500,11704=>1000,11705=>1000,11706=>1000, -11707=>1000,11708=>1000,11709=>1000,11710=>1000,11711=>500,11712=>1000,11713=>1000,11714=>1000,11715=>1000,11716=>1000, -11717=>1000,11718=>1000,11719=>500,11720=>1000,11721=>1000,11722=>1000,11723=>1000,11724=>1000,11725=>1000,11726=>1000, -11727=>500,11728=>1000,11729=>1000,11730=>1000,11731=>1000,11732=>1000,11733=>1000,11734=>1000,11735=>500,11736=>1000, -11737=>1000,11738=>1000,11739=>1000,11740=>1000,11741=>1000,11742=>1000,11743=>500,11744=>0,11745=>0,11746=>0, -11747=>0,11748=>0,11749=>0,11750=>0,11751=>0,11752=>0,11753=>0,11754=>0,11755=>0,11756=>0, -11757=>0,11758=>0,11759=>0,11760=>0,11761=>0,11762=>0,11763=>0,11764=>0,11765=>0,11766=>0, -11767=>0,11768=>0,11769=>0,11770=>0,11771=>0,11772=>0,11773=>0,11774=>0,11775=>0,11776=>500, -11777=>500,11778=>500,11779=>500,11780=>500,11781=>500,11782=>500,11783=>500,11784=>500,11785=>500,11786=>500, -11787=>500,11788=>500,11789=>500,11790=>1000,11791=>1000,11792=>1000,11793=>1000,11794=>500,11795=>1000,11796=>1000, -11797=>1000,11798=>500,11799=>500,11800=>500,11801=>500,11802=>500,11803=>500,11804=>500,11805=>500,11806=>500, -11807=>500,11808=>500,11809=>500,11810=>500,11811=>500,11812=>500,11813=>500,11814=>500,11815=>500,11816=>500, -11817=>500,11818=>500,11819=>500,11820=>500,11821=>500,11822=>500,11823=>500,11824=>500,11825=>500,11826=>500, -11827=>500,11828=>500,11829=>500,11830=>500,11831=>500,11832=>500,11833=>500,11834=>500,11835=>500,11836=>500, -11837=>500,11838=>500,11839=>500,11840=>500,11841=>500,11842=>500,11843=>500,11844=>500,11845=>500,11846=>500, -11847=>500,11848=>500,11849=>500,11850=>500,11851=>500,11852=>500,11853=>500,11854=>500,11855=>500,11856=>500, -11857=>500,11858=>500,11859=>500,11860=>500,11861=>500,11862=>500,11863=>500,11864=>500,11865=>500,11866=>500, -11867=>500,11868=>500,11869=>500,11870=>500,11871=>500,11872=>500,11873=>500,11874=>500,11875=>500,11876=>500, -11877=>500,11878=>500,11879=>500,11880=>500,11881=>500,11882=>500,11883=>500,11884=>500,11885=>500,11886=>500, -11887=>500,11888=>500,11889=>500,11890=>500,11891=>500,11892=>500,11893=>500,11894=>500,11895=>500,11896=>500, -11897=>500,11898=>500,11899=>500,11900=>500,11901=>500,11902=>500,11903=>500,11904=>1000,11905=>1000,11906=>1000, -11907=>1000,11908=>1000,11909=>1000,11910=>1000,11911=>1000,11912=>1000,11913=>1000,11914=>1000,11915=>1000,11916=>1000, -11917=>1000,11918=>1000,11919=>1000,11920=>1000,11921=>1000,11922=>1000,11923=>1000,11924=>1000,11925=>1000,11926=>1000, -11927=>1000,11928=>1000,11929=>1000,11930=>500,11931=>1000,11932=>1000,11933=>1000,11934=>1000,11935=>1000,11936=>1000, -11937=>1000,11938=>1000,11939=>1000,11940=>1000,11941=>1000,11942=>1000,11943=>1000,11944=>1000,11945=>1000,11946=>1000, -11947=>1000,11948=>1000,11949=>1000,11950=>1000,11951=>1000,11952=>1000,11953=>1000,11954=>1000,11955=>1000,11956=>1000, -11957=>1000,11958=>1000,11959=>1000,11960=>1000,11961=>1000,11962=>1000,11963=>1000,11964=>1000,11965=>1000,11966=>1000, -11967=>1000,11968=>1000,11969=>1000,11970=>1000,11971=>1000,11972=>1000,11973=>1000,11974=>1000,11975=>1000,11976=>1000, -11977=>1000,11978=>1000,11979=>1000,11980=>1000,11981=>1000,11982=>1000,11983=>1000,11984=>1000,11985=>1000,11986=>1000, -11987=>1000,11988=>1000,11989=>1000,11990=>1000,11991=>1000,11992=>1000,11993=>1000,11994=>1000,11995=>1000,11996=>1000, -11997=>1000,11998=>1000,11999=>1000,12000=>1000,12001=>1000,12002=>1000,12003=>1000,12004=>1000,12005=>1000,12006=>1000, -12007=>1000,12008=>1000,12009=>1000,12010=>1000,12011=>1000,12012=>1000,12013=>1000,12014=>1000,12015=>1000,12016=>1000, -12017=>1000,12018=>1000,12019=>1000,12020=>500,12021=>500,12022=>500,12023=>500,12024=>500,12025=>500,12026=>500, -12027=>500,12028=>500,12029=>500,12030=>500,12031=>500,12032=>1000,12033=>1000,12034=>1000,12035=>1000,12036=>1000, -12037=>1000,12038=>1000,12039=>1000,12040=>1000,12041=>1000,12042=>1000,12043=>1000,12044=>1000,12045=>1000,12046=>1000, -12047=>1000,12048=>1000,12049=>1000,12050=>1000,12051=>1000,12052=>1000,12053=>1000,12054=>1000,12055=>1000,12056=>1000, -12057=>1000,12058=>1000,12059=>1000,12060=>1000,12061=>1000,12062=>1000,12063=>1000,12064=>1000,12065=>1000,12066=>1000, -12067=>1000,12068=>1000,12069=>1000,12070=>1000,12071=>1000,12072=>1000,12073=>1000,12074=>1000,12075=>1000,12076=>1000, -12077=>1000,12078=>1000,12079=>1000,12080=>1000,12081=>1000,12082=>1000,12083=>1000,12084=>1000,12085=>1000,12086=>1000, -12087=>1000,12088=>1000,12089=>1000,12090=>1000,12091=>1000,12092=>1000,12093=>1000,12094=>1000,12095=>1000,12096=>1000, -12097=>1000,12098=>1000,12099=>1000,12100=>1000,12101=>1000,12102=>1000,12103=>1000,12104=>1000,12105=>1000,12106=>1000, -12107=>1000,12108=>1000,12109=>1000,12110=>1000,12111=>1000,12112=>1000,12113=>1000,12114=>1000,12115=>1000,12116=>1000, -12117=>1000,12118=>1000,12119=>1000,12120=>1000,12121=>1000,12122=>1000,12123=>1000,12124=>1000,12125=>1000,12126=>1000, -12127=>1000,12128=>1000,12129=>1000,12130=>1000,12131=>1000,12132=>1000,12133=>1000,12134=>1000,12135=>1000,12136=>1000, -12137=>1000,12138=>1000,12139=>1000,12140=>1000,12141=>1000,12142=>1000,12143=>1000,12144=>1000,12145=>1000,12146=>1000, -12147=>1000,12148=>1000,12149=>1000,12150=>1000,12151=>1000,12152=>1000,12153=>1000,12154=>1000,12155=>1000,12156=>1000, -12157=>1000,12158=>1000,12159=>1000,12160=>1000,12161=>1000,12162=>1000,12163=>1000,12164=>1000,12165=>1000,12166=>1000, -12167=>1000,12168=>1000,12169=>1000,12170=>1000,12171=>1000,12172=>1000,12173=>1000,12174=>1000,12175=>1000,12176=>1000, -12177=>1000,12178=>1000,12179=>1000,12180=>1000,12181=>1000,12182=>1000,12183=>1000,12184=>1000,12185=>1000,12186=>1000, -12187=>1000,12188=>1000,12189=>1000,12190=>1000,12191=>1000,12192=>1000,12193=>1000,12194=>1000,12195=>1000,12196=>1000, -12197=>1000,12198=>1000,12199=>1000,12200=>1000,12201=>1000,12202=>1000,12203=>1000,12204=>1000,12205=>1000,12206=>1000, -12207=>1000,12208=>1000,12209=>1000,12210=>1000,12211=>1000,12212=>1000,12213=>1000,12214=>1000,12215=>1000,12216=>1000, -12217=>1000,12218=>1000,12219=>1000,12220=>1000,12221=>1000,12222=>1000,12223=>1000,12224=>1000,12225=>1000,12226=>1000, -12227=>1000,12228=>1000,12229=>1000,12230=>1000,12231=>1000,12232=>1000,12233=>1000,12234=>1000,12235=>1000,12236=>1000, -12237=>1000,12238=>1000,12239=>1000,12240=>1000,12241=>1000,12242=>1000,12243=>1000,12244=>1000,12245=>1000,12246=>500, -12247=>500,12248=>500,12249=>500,12250=>500,12251=>500,12252=>500,12253=>500,12254=>500,12255=>500,12256=>500, -12257=>500,12258=>500,12259=>500,12260=>500,12261=>500,12262=>500,12263=>500,12264=>500,12265=>500,12266=>500, -12267=>500,12268=>500,12269=>500,12270=>500,12271=>500,12272=>1000,12273=>1000,12274=>1000,12275=>1000,12276=>1000, -12277=>1000,12278=>1000,12279=>1000,12280=>1000,12281=>1000,12282=>1000,12283=>1000,12284=>500,12285=>500,12286=>500, -12287=>500,12288=>1000,12289=>1000,12290=>1000,12291=>1000,12292=>1000,12293=>1000,12294=>1000,12295=>1000,12296=>1000, -12297=>1000,12298=>1000,12299=>1000,12300=>1000,12301=>1000,12302=>1000,12303=>1000,12304=>1000,12305=>1000,12306=>1000, -12307=>1000,12308=>1000,12309=>1000,12310=>1000,12311=>1000,12312=>1000,12313=>1000,12314=>1000,12315=>1000,12316=>1000, -12317=>1000,12318=>1000,12319=>1000,12320=>1000,12321=>1000,12322=>1000,12323=>1000,12324=>1000,12325=>1000,12326=>1000, -12327=>1000,12328=>1000,12329=>1000,12330=>0,12331=>0,12332=>0,12333=>0,12334=>0,12335=>0,12336=>1000, -12337=>1000,12338=>1000,12339=>1000,12340=>1000,12341=>1000,12342=>1000,12343=>1000,12344=>1000,12345=>1000,12346=>1000, -12347=>1000,12348=>1000,12349=>1000,12350=>1000,12351=>500,12352=>500,12353=>1000,12354=>1000,12355=>1000,12356=>1000, -12357=>1000,12358=>1000,12359=>1000,12360=>1000,12361=>1000,12362=>1000,12363=>1000,12364=>1000,12365=>1000,12366=>1000, -12367=>1000,12368=>1000,12369=>1000,12370=>1000,12371=>1000,12372=>1000,12373=>1000,12374=>1000,12375=>1000,12376=>1000, -12377=>1000,12378=>1000,12379=>1000,12380=>1000,12381=>1000,12382=>1000,12383=>1000,12384=>1000,12385=>1000,12386=>1000, -12387=>1000,12388=>1000,12389=>1000,12390=>1000,12391=>1000,12392=>1000,12393=>1000,12394=>1000,12395=>1000,12396=>1000, -12397=>1000,12398=>1000,12399=>1000,12400=>1000,12401=>1000,12402=>1000,12403=>1000,12404=>1000,12405=>1000,12406=>1000, -12407=>1000,12408=>1000,12409=>1000,12410=>1000,12411=>1000,12412=>1000,12413=>1000,12414=>1000,12415=>1000,12416=>1000, -12417=>1000,12418=>1000,12419=>1000,12420=>1000,12421=>1000,12422=>1000,12423=>1000,12424=>1000,12425=>1000,12426=>1000, -12427=>1000,12428=>1000,12429=>1000,12430=>1000,12431=>1000,12432=>1000,12433=>1000,12434=>1000,12435=>1000,12436=>1000, -12437=>1000,12438=>1000,12439=>500,12440=>500,12441=>0,12442=>0,12443=>1000,12444=>1000,12445=>1000,12446=>1000, -12447=>1000,12448=>1000,12449=>1000,12450=>1000,12451=>1000,12452=>1000,12453=>1000,12454=>1000,12455=>1000,12456=>1000, -12457=>1000,12458=>1000,12459=>1000,12460=>1000,12461=>1000,12462=>1000,12463=>1000,12464=>1000,12465=>1000,12466=>1000, -12467=>1000,12468=>1000,12469=>1000,12470=>1000,12471=>1000,12472=>1000,12473=>1000,12474=>1000,12475=>1000,12476=>1000, -12477=>1000,12478=>1000,12479=>1000,12480=>1000,12481=>1000,12482=>1000,12483=>1000,12484=>1000,12485=>1000,12486=>1000, -12487=>1000,12488=>1000,12489=>1000,12490=>1000,12491=>1000,12492=>1000,12493=>1000,12494=>1000,12495=>1000,12496=>1000, -12497=>1000,12498=>1000,12499=>1000,12500=>1000,12501=>1000,12502=>1000,12503=>1000,12504=>1000,12505=>1000,12506=>1000, -12507=>1000,12508=>1000,12509=>1000,12510=>1000,12511=>1000,12512=>1000,12513=>1000,12514=>1000,12515=>1000,12516=>1000, -12517=>1000,12518=>1000,12519=>1000,12520=>1000,12521=>1000,12522=>1000,12523=>1000,12524=>1000,12525=>1000,12526=>1000, -12527=>1000,12528=>1000,12529=>1000,12530=>1000,12531=>1000,12532=>1000,12533=>1000,12534=>1000,12535=>1000,12536=>1000, -12537=>1000,12538=>1000,12539=>1000,12540=>1000,12541=>1000,12542=>1000,12543=>1000,12544=>500,12545=>500,12546=>500, -12547=>500,12548=>500,12549=>1000,12550=>1000,12551=>1000,12552=>1000,12553=>1000,12554=>1000,12555=>1000,12556=>1000, -12557=>1000,12558=>1000,12559=>1000,12560=>1000,12561=>1000,12562=>1000,12563=>1000,12564=>1000,12565=>1000,12566=>1000, -12567=>1000,12568=>1000,12569=>1000,12570=>1000,12571=>1000,12572=>1000,12573=>1000,12574=>1000,12575=>1000,12576=>1000, -12577=>1000,12578=>1000,12579=>1000,12580=>1000,12581=>1000,12582=>1000,12583=>1000,12584=>1000,12585=>1000,12586=>1000, -12587=>1000,12588=>1000,12589=>1000,12590=>500,12591=>500,12592=>500,12593=>1000,12594=>1000,12595=>1000,12596=>1000, -12597=>1000,12598=>1000,12599=>1000,12600=>1000,12601=>1000,12602=>1000,12603=>1000,12604=>1000,12605=>1000,12606=>1000, -12607=>1000,12608=>1000,12609=>1000,12610=>1000,12611=>1000,12612=>1000,12613=>1000,12614=>1000,12615=>1000,12616=>1000, -12617=>1000,12618=>1000,12619=>1000,12620=>1000,12621=>1000,12622=>1000,12623=>1000,12624=>1000,12625=>1000,12626=>1000, -12627=>1000,12628=>1000,12629=>1000,12630=>1000,12631=>1000,12632=>1000,12633=>1000,12634=>1000,12635=>1000,12636=>1000, -12637=>1000,12638=>1000,12639=>1000,12640=>1000,12641=>1000,12642=>1000,12643=>1000,12645=>1000,12646=>1000,12647=>1000, -12648=>1000,12649=>1000,12650=>1000,12651=>1000,12652=>1000,12653=>1000,12654=>1000,12655=>1000,12656=>1000,12657=>1000, -12658=>1000,12659=>1000,12660=>1000,12661=>1000,12662=>1000,12663=>1000,12664=>1000,12665=>1000,12666=>1000,12667=>1000, -12668=>1000,12669=>1000,12670=>1000,12671=>1000,12672=>1000,12673=>1000,12674=>1000,12675=>1000,12676=>1000,12677=>1000, -12678=>1000,12679=>1000,12680=>1000,12681=>1000,12682=>1000,12683=>1000,12684=>1000,12685=>1000,12686=>1000,12687=>500, -12688=>1000,12689=>1000,12690=>1000,12691=>1000,12692=>1000,12693=>1000,12694=>1000,12695=>1000,12696=>1000,12697=>1000, -12698=>1000,12699=>1000,12700=>1000,12701=>1000,12702=>1000,12703=>1000,12704=>1000,12705=>1000,12706=>1000,12707=>1000, -12708=>1000,12709=>1000,12710=>1000,12711=>1000,12712=>1000,12713=>1000,12714=>1000,12715=>1000,12716=>1000,12717=>1000, -12718=>1000,12719=>1000,12720=>1000,12721=>1000,12722=>1000,12723=>1000,12724=>1000,12725=>1000,12726=>1000,12727=>1000, -12728=>500,12729=>500,12730=>500,12731=>500,12732=>500,12733=>500,12734=>500,12735=>500,12736=>1000,12737=>1000, -12738=>1000,12739=>1000,12740=>1000,12741=>1000,12742=>1000,12743=>1000,12744=>1000,12745=>1000,12746=>1000,12747=>1000, -12748=>1000,12749=>1000,12750=>1000,12751=>1000,12752=>1000,12753=>1000,12754=>1000,12755=>1000,12756=>1000,12757=>1000, -12758=>1000,12759=>1000,12760=>1000,12761=>1000,12762=>1000,12763=>1000,12764=>1000,12765=>1000,12766=>1000,12767=>1000, -12768=>1000,12769=>1000,12770=>1000,12771=>1000,12772=>500,12773=>500,12774=>500,12775=>500,12776=>500,12777=>500, -12778=>500,12779=>500,12780=>500,12781=>500,12782=>500,12783=>500,12784=>1000,12785=>1000,12786=>1000,12787=>1000, -12788=>1000,12789=>1000,12790=>1000,12791=>1000,12792=>1000,12793=>1000,12794=>1000,12795=>1000,12796=>1000,12797=>1000, -12798=>1000,12799=>1000,12800=>1000,12801=>1000,12802=>1000,12803=>1000,12804=>1000,12805=>1000,12806=>1000,12807=>1000, -12808=>1000,12809=>1000,12810=>1000,12811=>1000,12812=>1000,12813=>1000,12814=>1000,12815=>1000,12816=>1000,12817=>1000, -12818=>1000,12819=>1000,12820=>1000,12821=>1000,12822=>1000,12823=>1000,12824=>1000,12825=>1000,12826=>1000,12827=>1000, -12828=>1000,12829=>1000,12830=>1000,12831=>500,12832=>1000,12833=>1000,12834=>1000,12835=>1000,12836=>1000,12837=>1000, -12838=>1000,12839=>1000,12840=>1000,12841=>1000,12842=>1000,12843=>1000,12844=>1000,12845=>1000,12846=>1000,12847=>1000, -12848=>1000,12849=>1000,12850=>1000,12851=>1000,12852=>1000,12853=>1000,12854=>1000,12855=>1000,12856=>1000,12857=>1000, -12858=>1000,12859=>1000,12860=>1000,12861=>1000,12862=>1000,12863=>1000,12864=>1000,12865=>1000,12866=>1000,12867=>1000, -12868=>500,12869=>500,12870=>500,12871=>500,12872=>500,12873=>500,12874=>500,12875=>500,12876=>500,12877=>500, -12878=>500,12879=>500,12880=>1000,12881=>1000,12882=>1000,12883=>1000,12884=>1000,12885=>1000,12886=>1000,12887=>1000, -12888=>1000,12889=>1000,12890=>1000,12891=>1000,12892=>1000,12893=>1000,12894=>1000,12895=>1000,12896=>1000,12897=>1000, -12898=>1000,12899=>1000,12900=>1000,12901=>1000,12902=>1000,12903=>1000,12904=>1000,12905=>1000,12906=>1000,12907=>1000, -12908=>1000,12909=>1000,12910=>1000,12911=>1000,12912=>1000,12913=>1000,12914=>1000,12915=>1000,12916=>1000,12917=>1000, -12918=>1000,12919=>1000,12920=>1000,12921=>1000,12922=>1000,12923=>1000,12924=>1000,12925=>1000,12926=>1000,12927=>1000, -12928=>1000,12929=>1000,12930=>1000,12931=>1000,12932=>1000,12933=>1000,12934=>1000,12935=>1000,12936=>1000,12937=>1000, -12938=>1000,12939=>1000,12940=>1000,12941=>1000,12942=>1000,12943=>1000,12944=>1000,12945=>1000,12946=>1000,12947=>1000, -12948=>1000,12949=>1000,12950=>1000,12951=>1000,12952=>1000,12953=>1000,12954=>1000,12955=>1000,12956=>1000,12957=>1000, -12958=>1000,12959=>1000,12960=>1000,12961=>1000,12962=>1000,12963=>1000,12964=>1000,12965=>1000,12966=>1000,12967=>1000, -12968=>1000,12969=>1000,12970=>1000,12971=>1000,12972=>1000,12973=>1000,12974=>1000,12975=>1000,12976=>1000,12977=>1000, -12978=>1000,12979=>1000,12980=>1000,12981=>1000,12982=>1000,12983=>1000,12984=>1000,12985=>1000,12986=>1000,12987=>1000, -12988=>1000,12989=>1000,12990=>1000,12991=>1000,12992=>1000,12993=>1000,12994=>1000,12995=>1000,12996=>1000,12997=>1000, -12998=>1000,12999=>1000,13000=>1000,13001=>1000,13002=>1000,13003=>1000,13004=>1000,13005=>1000,13006=>1000,13007=>1000, -13008=>1000,13009=>1000,13010=>1000,13011=>1000,13012=>1000,13013=>1000,13014=>1000,13015=>1000,13016=>1000,13017=>1000, -13018=>1000,13019=>1000,13020=>1000,13021=>1000,13022=>1000,13023=>1000,13024=>1000,13025=>1000,13026=>1000,13027=>1000, -13028=>1000,13029=>1000,13030=>1000,13031=>1000,13032=>1000,13033=>1000,13034=>1000,13035=>1000,13036=>1000,13037=>1000, -13038=>1000,13039=>1000,13040=>1000,13041=>1000,13042=>1000,13043=>1000,13044=>1000,13045=>1000,13046=>1000,13047=>1000, -13048=>1000,13049=>1000,13050=>1000,13051=>1000,13052=>1000,13053=>1000,13054=>1000,13055=>500,13056=>1000,13057=>1000, -13058=>1000,13059=>1000,13060=>1000,13061=>1000,13062=>1000,13063=>1000,13064=>1000,13065=>1000,13066=>1000,13067=>1000, -13068=>1000,13069=>1000,13070=>1000,13071=>1000,13072=>1000,13073=>1000,13074=>1000,13075=>1000,13076=>1000,13077=>1000, -13078=>1000,13079=>1000,13080=>1000,13081=>1000,13082=>1000,13083=>1000,13084=>1000,13085=>1000,13086=>1000,13087=>1000, -13088=>1000,13089=>1000,13090=>1000,13091=>1000,13092=>1000,13093=>1000,13094=>1000,13095=>1000,13096=>1000,13097=>1000, -13098=>1000,13099=>1000,13100=>1000,13101=>1000,13102=>1000,13103=>1000,13104=>1000,13105=>1000,13106=>1000,13107=>1000, -13108=>1000,13109=>1000,13110=>1000,13111=>1000,13112=>1000,13113=>1000,13114=>1000,13115=>1000,13116=>1000,13117=>1000, -13118=>1000,13119=>1000,13120=>1000,13121=>1000,13122=>1000,13123=>1000,13124=>1000,13125=>1000,13126=>1000,13127=>1000, -13128=>1000,13129=>1000,13130=>1000,13131=>1000,13132=>1000,13133=>1000,13134=>1000,13135=>1000,13136=>1000,13137=>1000, -13138=>1000,13139=>1000,13140=>1000,13141=>1000,13142=>1000,13143=>1000,13144=>1000,13145=>1000,13146=>1000,13147=>1000, -13148=>1000,13149=>1000,13150=>1000,13151=>1000,13152=>1000,13153=>1000,13154=>1000,13155=>1000,13156=>1000,13157=>1000, -13158=>1000,13159=>1000,13160=>1000,13161=>1000,13162=>1000,13163=>1000,13164=>1000,13165=>1000,13166=>1000,13167=>1000, -13168=>1000,13169=>1000,13170=>1000,13171=>1000,13172=>1000,13173=>1000,13174=>1000,13175=>1000,13176=>1000,13177=>1000, -13178=>1000,13179=>1000,13180=>1000,13181=>1000,13182=>1000,13183=>1000,13184=>1000,13185=>1000,13186=>1000,13187=>1000, -13188=>1000,13189=>1000,13190=>1000,13191=>1000,13192=>1000,13193=>1000,13194=>1000,13195=>1000,13196=>1000,13197=>1000, -13198=>1000,13199=>1000,13200=>1000,13201=>1000,13202=>1000,13203=>1000,13204=>1000,13205=>1000,13206=>1000,13207=>1000, -13208=>1000,13209=>1000,13210=>1000,13211=>1000,13212=>1000,13213=>1000,13214=>1000,13215=>1000,13216=>1000,13217=>1000, -13218=>1000,13219=>1000,13220=>1000,13221=>1000,13222=>1000,13223=>1000,13224=>1000,13225=>1000,13226=>1000,13227=>1000, -13228=>1000,13229=>1000,13230=>1000,13231=>1000,13232=>1000,13233=>1000,13234=>1000,13235=>1000,13236=>1000,13237=>1000, -13238=>1000,13239=>1000,13240=>1000,13241=>1000,13242=>1000,13243=>1000,13244=>1000,13245=>1000,13246=>1000,13247=>1000, -13248=>1000,13249=>1000,13250=>1000,13251=>1000,13252=>1000,13253=>1000,13254=>1000,13255=>1000,13256=>1000,13257=>1000, -13258=>1000,13259=>1000,13260=>1000,13261=>1000,13262=>1000,13263=>1000,13264=>1000,13265=>1000,13266=>1000,13267=>1000, -13268=>1000,13269=>1000,13270=>1000,13271=>1000,13272=>1000,13273=>1000,13274=>1000,13275=>1000,13276=>1000,13277=>1000, -13278=>1000,13279=>1000,13280=>1000,13281=>1000,13282=>1000,13283=>1000,13284=>1000,13285=>1000,13286=>1000,13287=>1000, -13288=>1000,13289=>1000,13290=>1000,13291=>1000,13292=>1000,13293=>1000,13294=>1000,13295=>1000,13296=>1000,13297=>1000, -13298=>1000,13299=>1000,13300=>1000,13301=>1000,13302=>1000,13303=>1000,13304=>1000,13305=>1000,13306=>1000,13307=>1000, -13308=>1000,13309=>1000,13310=>1000,13311=>1000,13312=>1000,13313=>1000,13314=>1000,13315=>1000,13316=>1000,13317=>1000, -13318=>1000,13319=>1000,13320=>1000,13321=>1000,13322=>1000,13323=>1000,13324=>1000,13325=>1000,13326=>1000,13327=>1000, -13328=>1000,13329=>1000,13330=>1000,13331=>1000,13332=>1000,13333=>1000,13334=>1000,13335=>1000,13336=>1000,13337=>1000, -13338=>1000,13339=>1000,13340=>1000,13341=>1000,13342=>1000,13343=>1000,13344=>1000,13345=>1000,13346=>1000,13347=>1000, -13348=>1000,13349=>1000,13350=>1000,13351=>1000,13352=>1000,13353=>1000,13354=>1000,13355=>1000,13356=>1000,13357=>1000, -13358=>1000,13359=>1000,13360=>1000,13361=>1000,13362=>1000,13363=>1000,13364=>1000,13365=>1000,13366=>1000,13367=>1000, -13368=>1000,13369=>1000,13370=>1000,13371=>1000,13372=>1000,13373=>1000,13374=>1000,13375=>1000,13376=>1000,13377=>1000, -13378=>1000,13379=>1000,13380=>1000,13381=>1000,13382=>1000,13383=>1000,13384=>1000,13385=>1000,13386=>1000,13387=>1000, -13388=>1000,13389=>1000,13390=>1000,13391=>1000,13392=>1000,13393=>1000,13394=>1000,13395=>1000,13396=>1000,13397=>1000, -13398=>1000,13399=>1000,13400=>1000,13401=>1000,13402=>1000,13403=>1000,13404=>1000,13405=>1000,13406=>1000,13407=>1000, -13408=>1000,13409=>1000,13410=>1000,13411=>1000,13412=>1000,13413=>1000,13414=>1000,13415=>1000,13416=>1000,13417=>1000, -13418=>1000,13419=>1000,13420=>1000,13421=>1000,13422=>1000,13423=>1000,13424=>1000,13425=>1000,13426=>1000,13427=>1000, -13428=>1000,13429=>1000,13430=>1000,13431=>1000,13432=>1000,13433=>1000,13434=>1000,13435=>1000,13436=>1000,13437=>1000, -13438=>1000,13439=>1000,13440=>1000,13441=>1000,13442=>1000,13443=>1000,13444=>1000,13445=>1000,13446=>1000,13447=>1000, -13448=>1000,13449=>1000,13450=>1000,13451=>1000,13452=>1000,13453=>1000,13454=>1000,13455=>1000,13456=>1000,13457=>1000, -13458=>1000,13459=>1000,13460=>1000,13461=>1000,13462=>1000,13463=>1000,13464=>1000,13465=>1000,13466=>1000,13467=>1000, -13468=>1000,13469=>1000,13470=>1000,13471=>1000,13472=>1000,13473=>1000,13474=>1000,13475=>1000,13476=>1000,13477=>1000, -13478=>1000,13479=>1000,13480=>1000,13481=>1000,13482=>1000,13483=>1000,13484=>1000,13485=>1000,13486=>1000,13487=>1000, -13488=>1000,13489=>1000,13490=>1000,13491=>1000,13492=>1000,13493=>1000,13494=>1000,13495=>1000,13496=>1000,13497=>1000, -13498=>1000,13499=>1000,13500=>1000,13501=>1000,13502=>1000,13503=>1000,13504=>1000,13505=>1000,13506=>1000,13507=>1000, -13508=>1000,13509=>1000,13510=>1000,13511=>1000,13512=>1000,13513=>1000,13514=>1000,13515=>1000,13516=>1000,13517=>1000, -13518=>1000,13519=>1000,13520=>1000,13521=>1000,13522=>1000,13523=>1000,13524=>1000,13525=>1000,13526=>1000,13527=>1000, -13528=>1000,13529=>1000,13530=>1000,13531=>1000,13532=>1000,13533=>1000,13534=>1000,13535=>1000,13536=>1000,13537=>1000, -13538=>1000,13539=>1000,13540=>1000,13541=>1000,13542=>1000,13543=>1000,13544=>1000,13545=>1000,13546=>1000,13547=>1000, -13548=>1000,13549=>1000,13550=>1000,13551=>1000,13552=>1000,13553=>1000,13554=>1000,13555=>1000,13556=>1000,13557=>1000, -13558=>1000,13559=>1000,13560=>1000,13561=>1000,13562=>1000,13563=>1000,13564=>1000,13565=>1000,13566=>1000,13567=>1000, -13568=>1000,13569=>1000,13570=>1000,13571=>1000,13572=>1000,13573=>1000,13574=>1000,13575=>1000,13576=>1000,13577=>1000, -13578=>1000,13579=>1000,13580=>1000,13581=>1000,13582=>1000,13583=>1000,13584=>1000,13585=>1000,13586=>1000,13587=>1000, -13588=>1000,13589=>1000,13590=>1000,13591=>1000,13592=>1000,13593=>1000,13594=>1000,13595=>1000,13596=>1000,13597=>1000, -13598=>1000,13599=>1000,13600=>1000,13601=>1000,13602=>1000,13603=>1000,13604=>1000,13605=>1000,13606=>1000,13607=>1000, -13608=>1000,13609=>1000,13610=>1000,13611=>1000,13612=>1000,13613=>1000,13614=>1000,13615=>1000,13616=>1000,13617=>1000, -13618=>1000,13619=>1000,13620=>1000,13621=>1000,13622=>1000,13623=>1000,13624=>1000,13625=>1000,13626=>1000,13627=>1000, -13628=>1000,13629=>1000,13630=>1000,13631=>1000,13632=>1000,13633=>1000,13634=>1000,13635=>1000,13636=>1000,13637=>1000, -13638=>1000,13639=>1000,13640=>1000,13641=>1000,13642=>1000,13643=>1000,13644=>1000,13645=>1000,13646=>1000,13647=>1000, -13648=>1000,13649=>1000,13650=>1000,13651=>1000,13652=>1000,13653=>1000,13654=>1000,13655=>1000,13656=>1000,13657=>1000, -13658=>1000,13659=>1000,13660=>1000,13661=>1000,13662=>1000,13663=>1000,13664=>1000,13665=>1000,13666=>1000,13667=>1000, -13668=>1000,13669=>1000,13670=>1000,13671=>1000,13672=>1000,13673=>1000,13674=>1000,13675=>1000,13676=>1000,13677=>1000, -13678=>1000,13679=>1000,13680=>1000,13681=>1000,13682=>1000,13683=>1000,13684=>1000,13685=>1000,13686=>1000,13687=>1000, -13688=>1000,13689=>1000,13690=>1000,13691=>1000,13692=>1000,13693=>1000,13694=>1000,13695=>1000,13696=>1000,13697=>1000, -13698=>1000,13699=>1000,13700=>1000,13701=>1000,13702=>1000,13703=>1000,13704=>1000,13705=>1000,13706=>1000,13707=>1000, -13708=>1000,13709=>1000,13710=>1000,13711=>1000,13712=>1000,13713=>1000,13714=>1000,13715=>1000,13716=>1000,13717=>1000, -13718=>1000,13719=>1000,13720=>1000,13721=>1000,13722=>1000,13723=>1000,13724=>1000,13725=>1000,13726=>1000,13727=>1000, -13728=>1000,13729=>1000,13730=>1000,13731=>1000,13732=>1000,13733=>1000,13734=>1000,13735=>1000,13736=>1000,13737=>1000, -13738=>1000,13739=>1000,13740=>1000,13741=>1000,13742=>1000,13743=>1000,13744=>1000,13745=>1000,13746=>1000,13747=>1000, -13748=>1000,13749=>1000,13750=>1000,13751=>1000,13752=>1000,13753=>1000,13754=>1000,13755=>1000,13756=>1000,13757=>1000, -13758=>1000,13759=>1000,13760=>1000,13761=>1000,13762=>1000,13763=>1000,13764=>1000,13765=>1000,13766=>1000,13767=>1000, -13768=>1000,13769=>1000,13770=>1000,13771=>1000,13772=>1000,13773=>1000,13774=>1000,13775=>1000,13776=>1000,13777=>1000, -13778=>1000,13779=>1000,13780=>1000,13781=>1000,13782=>1000,13783=>1000,13784=>1000,13785=>1000,13786=>1000,13787=>1000, -13788=>1000,13789=>1000,13790=>1000,13791=>1000,13792=>1000,13793=>1000,13794=>1000,13795=>1000,13796=>1000,13797=>1000, -13798=>1000,13799=>1000,13800=>1000,13801=>1000,13802=>1000,13803=>1000,13804=>1000,13805=>1000,13806=>1000,13807=>1000, -13808=>1000,13809=>1000,13810=>1000,13811=>1000,13812=>1000,13813=>1000,13814=>1000,13815=>1000,13816=>1000,13817=>1000, -13818=>1000,13819=>1000,13820=>1000,13821=>1000,13822=>1000,13823=>1000,13824=>1000,13825=>1000,13826=>1000,13827=>1000, -13828=>1000,13829=>1000,13830=>1000,13831=>1000,13832=>1000,13833=>1000,13834=>1000,13835=>1000,13836=>1000,13837=>1000, -13838=>1000,13839=>1000,13840=>1000,13841=>1000,13842=>1000,13843=>1000,13844=>1000,13845=>1000,13846=>1000,13847=>1000, -13848=>1000,13849=>1000,13850=>1000,13851=>1000,13852=>1000,13853=>1000,13854=>1000,13855=>1000,13856=>1000,13857=>1000, -13858=>1000,13859=>1000,13860=>1000,13861=>1000,13862=>1000,13863=>1000,13864=>1000,13865=>1000,13866=>1000,13867=>1000, -13868=>1000,13869=>1000,13870=>1000,13871=>1000,13872=>1000,13873=>1000,13874=>1000,13875=>1000,13876=>1000,13877=>1000, -13878=>1000,13879=>1000,13880=>1000,13881=>1000,13882=>1000,13883=>1000,13884=>1000,13885=>1000,13886=>1000,13887=>1000, -13888=>1000,13889=>1000,13890=>1000,13891=>1000,13892=>1000,13893=>1000,13894=>1000,13895=>1000,13896=>1000,13897=>1000, -13898=>1000,13899=>1000,13900=>1000,13901=>1000,13902=>1000,13903=>1000,13904=>1000,13905=>1000,13906=>1000,13907=>1000, -13908=>1000,13909=>1000,13910=>1000,13911=>1000,13912=>1000,13913=>1000,13914=>1000,13915=>1000,13916=>1000,13917=>1000, -13918=>1000,13919=>1000,13920=>1000,13921=>1000,13922=>1000,13923=>1000,13924=>1000,13925=>1000,13926=>1000,13927=>1000, -13928=>1000,13929=>1000,13930=>1000,13931=>1000,13932=>1000,13933=>1000,13934=>1000,13935=>1000,13936=>1000,13937=>1000, -13938=>1000,13939=>1000,13940=>1000,13941=>1000,13942=>1000,13943=>1000,13944=>1000,13945=>1000,13946=>1000,13947=>1000, -13948=>1000,13949=>1000,13950=>1000,13951=>1000,13952=>1000,13953=>1000,13954=>1000,13955=>1000,13956=>1000,13957=>1000, -13958=>1000,13959=>1000,13960=>1000,13961=>1000,13962=>1000,13963=>1000,13964=>1000,13965=>1000,13966=>1000,13967=>1000, -13968=>1000,13969=>1000,13970=>1000,13971=>1000,13972=>1000,13973=>1000,13974=>1000,13975=>1000,13976=>1000,13977=>1000, -13978=>1000,13979=>1000,13980=>1000,13981=>1000,13982=>1000,13983=>1000,13984=>1000,13985=>1000,13986=>1000,13987=>1000, -13988=>1000,13989=>1000,13990=>1000,13991=>1000,13992=>1000,13993=>1000,13994=>1000,13995=>1000,13996=>1000,13997=>1000, -13998=>1000,13999=>1000,14000=>1000,14001=>1000,14002=>1000,14003=>1000,14004=>1000,14005=>1000,14006=>1000,14007=>1000, -14008=>1000,14009=>1000,14010=>1000,14011=>1000,14012=>1000,14013=>1000,14014=>1000,14015=>1000,14016=>1000,14017=>1000, -14018=>1000,14019=>1000,14020=>1000,14021=>1000,14022=>1000,14023=>1000,14024=>1000,14025=>1000,14026=>1000,14027=>1000, -14028=>1000,14029=>1000,14030=>1000,14031=>1000,14032=>1000,14033=>1000,14034=>1000,14035=>1000,14036=>1000,14037=>1000, -14038=>1000,14039=>1000,14040=>1000,14041=>1000,14042=>1000,14043=>1000,14044=>1000,14045=>1000,14046=>1000,14047=>1000, -14048=>1000,14049=>1000,14050=>1000,14051=>1000,14052=>1000,14053=>1000,14054=>1000,14055=>1000,14056=>1000,14057=>1000, -14058=>1000,14059=>1000,14060=>1000,14061=>1000,14062=>1000,14063=>1000,14064=>1000,14065=>1000,14066=>1000,14067=>1000, -14068=>1000,14069=>1000,14070=>1000,14071=>1000,14072=>1000,14073=>1000,14074=>1000,14075=>1000,14076=>1000,14077=>1000, -14078=>1000,14079=>1000,14080=>1000,14081=>1000,14082=>1000,14083=>1000,14084=>1000,14085=>1000,14086=>1000,14087=>1000, -14088=>1000,14089=>1000,14090=>1000,14091=>1000,14092=>1000,14093=>1000,14094=>1000,14095=>1000,14096=>1000,14097=>1000, -14098=>1000,14099=>1000,14100=>1000,14101=>1000,14102=>1000,14103=>1000,14104=>1000,14105=>1000,14106=>1000,14107=>1000, -14108=>1000,14109=>1000,14110=>1000,14111=>1000,14112=>1000,14113=>1000,14114=>1000,14115=>1000,14116=>1000,14117=>1000, -14118=>1000,14119=>1000,14120=>1000,14121=>1000,14122=>1000,14123=>1000,14124=>1000,14125=>1000,14126=>1000,14127=>1000, -14128=>1000,14129=>1000,14130=>1000,14131=>1000,14132=>1000,14133=>1000,14134=>1000,14135=>1000,14136=>1000,14137=>1000, -14138=>1000,14139=>1000,14140=>1000,14141=>1000,14142=>1000,14143=>1000,14144=>1000,14145=>1000,14146=>1000,14147=>1000, -14148=>1000,14149=>1000,14150=>1000,14151=>1000,14152=>1000,14153=>1000,14154=>1000,14155=>1000,14156=>1000,14157=>1000, -14158=>1000,14159=>1000,14160=>1000,14161=>1000,14162=>1000,14163=>1000,14164=>1000,14165=>1000,14166=>1000,14167=>1000, -14168=>1000,14169=>1000,14170=>1000,14171=>1000,14172=>1000,14173=>1000,14174=>1000,14175=>1000,14176=>1000,14177=>1000, -14178=>1000,14179=>1000,14180=>1000,14181=>1000,14182=>1000,14183=>1000,14184=>1000,14185=>1000,14186=>1000,14187=>1000, -14188=>1000,14189=>1000,14190=>1000,14191=>1000,14192=>1000,14193=>1000,14194=>1000,14195=>1000,14196=>1000,14197=>1000, -14198=>1000,14199=>1000,14200=>1000,14201=>1000,14202=>1000,14203=>1000,14204=>1000,14205=>1000,14206=>1000,14207=>1000, -14208=>1000,14209=>1000,14210=>1000,14211=>1000,14212=>1000,14213=>1000,14214=>1000,14215=>1000,14216=>1000,14217=>1000, -14218=>1000,14219=>1000,14220=>1000,14221=>1000,14222=>1000,14223=>1000,14224=>1000,14225=>1000,14226=>1000,14227=>1000, -14228=>1000,14229=>1000,14230=>1000,14231=>1000,14232=>1000,14233=>1000,14234=>1000,14235=>1000,14236=>1000,14237=>1000, -14238=>1000,14239=>1000,14240=>1000,14241=>1000,14242=>1000,14243=>1000,14244=>1000,14245=>1000,14246=>1000,14247=>1000, -14248=>1000,14249=>1000,14250=>1000,14251=>1000,14252=>1000,14253=>1000,14254=>1000,14255=>1000,14256=>1000,14257=>1000, -14258=>1000,14259=>1000,14260=>1000,14261=>1000,14262=>1000,14263=>1000,14264=>1000,14265=>1000,14266=>1000,14267=>1000, -14268=>1000,14269=>1000,14270=>1000,14271=>1000,14272=>1000,14273=>1000,14274=>1000,14275=>1000,14276=>1000,14277=>1000, -14278=>1000,14279=>1000,14280=>1000,14281=>1000,14282=>1000,14283=>1000,14284=>1000,14285=>1000,14286=>1000,14287=>1000, -14288=>1000,14289=>1000,14290=>1000,14291=>1000,14292=>1000,14293=>1000,14294=>1000,14295=>1000,14296=>1000,14297=>1000, -14298=>1000,14299=>1000,14300=>1000,14301=>1000,14302=>1000,14303=>1000,14304=>1000,14305=>1000,14306=>1000,14307=>1000, -14308=>1000,14309=>1000,14310=>1000,14311=>1000,14312=>1000,14313=>1000,14314=>1000,14315=>1000,14316=>1000,14317=>1000, -14318=>1000,14319=>1000,14320=>1000,14321=>1000,14322=>1000,14323=>1000,14324=>1000,14325=>1000,14326=>1000,14327=>1000, -14328=>1000,14329=>1000,14330=>1000,14331=>1000,14332=>1000,14333=>1000,14334=>1000,14335=>1000,14336=>1000,14337=>1000, -14338=>1000,14339=>1000,14340=>1000,14341=>1000,14342=>1000,14343=>1000,14344=>1000,14345=>1000,14346=>1000,14347=>1000, -14348=>1000,14349=>1000,14350=>1000,14351=>1000,14352=>1000,14353=>1000,14354=>1000,14355=>1000,14356=>1000,14357=>1000, -14358=>1000,14359=>1000,14360=>1000,14361=>1000,14362=>1000,14363=>1000,14364=>1000,14365=>1000,14366=>1000,14367=>1000, -14368=>1000,14369=>1000,14370=>1000,14371=>1000,14372=>1000,14373=>1000,14374=>1000,14375=>1000,14376=>1000,14377=>1000, -14378=>1000,14379=>1000,14380=>1000,14381=>1000,14382=>1000,14383=>1000,14384=>1000,14385=>1000,14386=>1000,14387=>1000, -14388=>1000,14389=>1000,14390=>1000,14391=>1000,14392=>1000,14393=>1000,14394=>1000,14395=>1000,14396=>1000,14397=>1000, -14398=>1000,14399=>1000,14400=>1000,14401=>1000,14402=>1000,14403=>1000,14404=>1000,14405=>1000,14406=>1000,14407=>1000, -14408=>1000,14409=>1000,14410=>1000,14411=>1000,14412=>1000,14413=>1000,14414=>1000,14415=>1000,14416=>1000,14417=>1000, -14418=>1000,14419=>1000,14420=>1000,14421=>1000,14422=>1000,14423=>1000,14424=>1000,14425=>1000,14426=>1000,14427=>1000, -14428=>1000,14429=>1000,14430=>1000,14431=>1000,14432=>1000,14433=>1000,14434=>1000,14435=>1000,14436=>1000,14437=>1000, -14438=>1000,14439=>1000,14440=>1000,14441=>1000,14442=>1000,14443=>1000,14444=>1000,14445=>1000,14446=>1000,14447=>1000, -14448=>1000,14449=>1000,14450=>1000,14451=>1000,14452=>1000,14453=>1000,14454=>1000,14455=>1000,14456=>1000,14457=>1000, -14458=>1000,14459=>1000,14460=>1000,14461=>1000,14462=>1000,14463=>1000,14464=>1000,14465=>1000,14466=>1000,14467=>1000, -14468=>1000,14469=>1000,14470=>1000,14471=>1000,14472=>1000,14473=>1000,14474=>1000,14475=>1000,14476=>1000,14477=>1000, -14478=>1000,14479=>1000,14480=>1000,14481=>1000,14482=>1000,14483=>1000,14484=>1000,14485=>1000,14486=>1000,14487=>1000, -14488=>1000,14489=>1000,14490=>1000,14491=>1000,14492=>1000,14493=>1000,14494=>1000,14495=>1000,14496=>1000,14497=>1000, -14498=>1000,14499=>1000,14500=>1000,14501=>1000,14502=>1000,14503=>1000,14504=>1000,14505=>1000,14506=>1000,14507=>1000, -14508=>1000,14509=>1000,14510=>1000,14511=>1000,14512=>1000,14513=>1000,14514=>1000,14515=>1000,14516=>1000,14517=>1000, -14518=>1000,14519=>1000,14520=>1000,14521=>1000,14522=>1000,14523=>1000,14524=>1000,14525=>1000,14526=>1000,14527=>1000, -14528=>1000,14529=>1000,14530=>1000,14531=>1000,14532=>1000,14533=>1000,14534=>1000,14535=>1000,14536=>1000,14537=>1000, -14538=>1000,14539=>1000,14540=>1000,14541=>1000,14542=>1000,14543=>1000,14544=>1000,14545=>1000,14546=>1000,14547=>1000, -14548=>1000,14549=>1000,14550=>1000,14551=>1000,14552=>1000,14553=>1000,14554=>1000,14555=>1000,14556=>1000,14557=>1000, -14558=>1000,14559=>1000,14560=>1000,14561=>1000,14562=>1000,14563=>1000,14564=>1000,14565=>1000,14566=>1000,14567=>1000, -14568=>1000,14569=>1000,14570=>1000,14571=>1000,14572=>1000,14573=>1000,14574=>1000,14575=>1000,14576=>1000,14577=>1000, -14578=>1000,14579=>1000,14580=>1000,14581=>1000,14582=>1000,14583=>1000,14584=>1000,14585=>1000,14586=>1000,14587=>1000, -14588=>1000,14589=>1000,14590=>1000,14591=>1000,14592=>1000,14593=>1000,14594=>1000,14595=>1000,14596=>1000,14597=>1000, -14598=>1000,14599=>1000,14600=>1000,14601=>1000,14602=>1000,14603=>1000,14604=>1000,14605=>1000,14606=>1000,14607=>1000, -14608=>1000,14609=>1000,14610=>1000,14611=>1000,14612=>1000,14613=>1000,14614=>1000,14615=>1000,14616=>1000,14617=>1000, -14618=>1000,14619=>1000,14620=>1000,14621=>1000,14622=>1000,14623=>1000,14624=>1000,14625=>1000,14626=>1000,14627=>1000, -14628=>1000,14629=>1000,14630=>1000,14631=>1000,14632=>1000,14633=>1000,14634=>1000,14635=>1000,14636=>1000,14637=>1000, -14638=>1000,14639=>1000,14640=>1000,14641=>1000,14642=>1000,14643=>1000,14644=>1000,14645=>1000,14646=>1000,14647=>1000, -14648=>1000,14649=>1000,14650=>1000,14651=>1000,14652=>1000,14653=>1000,14654=>1000,14655=>1000,14656=>1000,14657=>1000, -14658=>1000,14659=>1000,14660=>1000,14661=>1000,14662=>1000,14663=>1000,14664=>1000,14665=>1000,14666=>1000,14667=>1000, -14668=>1000,14669=>1000,14670=>1000,14671=>1000,14672=>1000,14673=>1000,14674=>1000,14675=>1000,14676=>1000,14677=>1000, -14678=>1000,14679=>1000,14680=>1000,14681=>1000,14682=>1000,14683=>1000,14684=>1000,14685=>1000,14686=>1000,14687=>1000, -14688=>1000,14689=>1000,14690=>1000,14691=>1000,14692=>1000,14693=>1000,14694=>1000,14695=>1000,14696=>1000,14697=>1000, -14698=>1000,14699=>1000,14700=>1000,14701=>1000,14702=>1000,14703=>1000,14704=>1000,14705=>1000,14706=>1000,14707=>1000, -14708=>1000,14709=>1000,14710=>1000,14711=>1000,14712=>1000,14713=>1000,14714=>1000,14715=>1000,14716=>1000,14717=>1000, -14718=>1000,14719=>1000,14720=>1000,14721=>1000,14722=>1000,14723=>1000,14724=>1000,14725=>1000,14726=>1000,14727=>1000, -14728=>1000,14729=>1000,14730=>1000,14731=>1000,14732=>1000,14733=>1000,14734=>1000,14735=>1000,14736=>1000,14737=>1000, -14738=>1000,14739=>1000,14740=>1000,14741=>1000,14742=>1000,14743=>1000,14744=>1000,14745=>1000,14746=>1000,14747=>1000, -14748=>1000,14749=>1000,14750=>1000,14751=>1000,14752=>1000,14753=>1000,14754=>1000,14755=>1000,14756=>1000,14757=>1000, -14758=>1000,14759=>1000,14760=>1000,14761=>1000,14762=>1000,14763=>1000,14764=>1000,14765=>1000,14766=>1000,14767=>1000, -14768=>1000,14769=>1000,14770=>1000,14771=>1000,14772=>1000,14773=>1000,14774=>1000,14775=>1000,14776=>1000,14777=>1000, -14778=>1000,14779=>1000,14780=>1000,14781=>1000,14782=>1000,14783=>1000,14784=>1000,14785=>1000,14786=>1000,14787=>1000, -14788=>1000,14789=>1000,14790=>1000,14791=>1000,14792=>1000,14793=>1000,14794=>1000,14795=>1000,14796=>1000,14797=>1000, -14798=>1000,14799=>1000,14800=>1000,14801=>1000,14802=>1000,14803=>1000,14804=>1000,14805=>1000,14806=>1000,14807=>1000, -14808=>1000,14809=>1000,14810=>1000,14811=>1000,14812=>1000,14813=>1000,14814=>1000,14815=>1000,14816=>1000,14817=>1000, -14818=>1000,14819=>1000,14820=>1000,14821=>1000,14822=>1000,14823=>1000,14824=>1000,14825=>1000,14826=>1000,14827=>1000, -14828=>1000,14829=>1000,14830=>1000,14831=>1000,14832=>1000,14833=>1000,14834=>1000,14835=>1000,14836=>1000,14837=>1000, -14838=>1000,14839=>1000,14840=>1000,14841=>1000,14842=>1000,14843=>1000,14844=>1000,14845=>1000,14846=>1000,14847=>1000, -14848=>1000,14849=>1000,14850=>1000,14851=>1000,14852=>1000,14853=>1000,14854=>1000,14855=>1000,14856=>1000,14857=>1000, -14858=>1000,14859=>1000,14860=>1000,14861=>1000,14862=>1000,14863=>1000,14864=>1000,14865=>1000,14866=>1000,14867=>1000, -14868=>1000,14869=>1000,14870=>1000,14871=>1000,14872=>1000,14873=>1000,14874=>1000,14875=>1000,14876=>1000,14877=>1000, -14878=>1000,14879=>1000,14880=>1000,14881=>1000,14882=>1000,14883=>1000,14884=>1000,14885=>1000,14886=>1000,14887=>1000, -14888=>1000,14889=>1000,14890=>1000,14891=>1000,14892=>1000,14893=>1000,14894=>1000,14895=>1000,14896=>1000,14897=>1000, -14898=>1000,14899=>1000,14900=>1000,14901=>1000,14902=>1000,14903=>1000,14904=>1000,14905=>1000,14906=>1000,14907=>1000, -14908=>1000,14909=>1000,14910=>1000,14911=>1000,14912=>1000,14913=>1000,14914=>1000,14915=>1000,14916=>1000,14917=>1000, -14918=>1000,14919=>1000,14920=>1000,14921=>1000,14922=>1000,14923=>1000,14924=>1000,14925=>1000,14926=>1000,14927=>1000, -14928=>1000,14929=>1000,14930=>1000,14931=>1000,14932=>1000,14933=>1000,14934=>1000,14935=>1000,14936=>1000,14937=>1000, -14938=>1000,14939=>1000,14940=>1000,14941=>1000,14942=>1000,14943=>1000,14944=>1000,14945=>1000,14946=>1000,14947=>1000, -14948=>1000,14949=>1000,14950=>1000,14951=>1000,14952=>1000,14953=>1000,14954=>1000,14955=>1000,14956=>1000,14957=>1000, -14958=>1000,14959=>1000,14960=>1000,14961=>1000,14962=>1000,14963=>1000,14964=>1000,14965=>1000,14966=>1000,14967=>1000, -14968=>1000,14969=>1000,14970=>1000,14971=>1000,14972=>1000,14973=>1000,14974=>1000,14975=>1000,14976=>1000,14977=>1000, -14978=>1000,14979=>1000,14980=>1000,14981=>1000,14982=>1000,14983=>1000,14984=>1000,14985=>1000,14986=>1000,14987=>1000, -14988=>1000,14989=>1000,14990=>1000,14991=>1000,14992=>1000,14993=>1000,14994=>1000,14995=>1000,14996=>1000,14997=>1000, -14998=>1000,14999=>1000,15000=>1000,15001=>1000,15002=>1000,15003=>1000,15004=>1000,15005=>1000,15006=>1000,15007=>1000, -15008=>1000,15009=>1000,15010=>1000,15011=>1000,15012=>1000,15013=>1000,15014=>1000,15015=>1000,15016=>1000,15017=>1000, -15018=>1000,15019=>1000,15020=>1000,15021=>1000,15022=>1000,15023=>1000,15024=>1000,15025=>1000,15026=>1000,15027=>1000, -15028=>1000,15029=>1000,15030=>1000,15031=>1000,15032=>1000,15033=>1000,15034=>1000,15035=>1000,15036=>1000,15037=>1000, -15038=>1000,15039=>1000,15040=>1000,15041=>1000,15042=>1000,15043=>1000,15044=>1000,15045=>1000,15046=>1000,15047=>1000, -15048=>1000,15049=>1000,15050=>1000,15051=>1000,15052=>1000,15053=>1000,15054=>1000,15055=>1000,15056=>1000,15057=>1000, -15058=>1000,15059=>1000,15060=>1000,15061=>1000,15062=>1000,15063=>1000,15064=>1000,15065=>1000,15066=>1000,15067=>1000, -15068=>1000,15069=>1000,15070=>1000,15071=>1000,15072=>1000,15073=>1000,15074=>1000,15075=>1000,15076=>1000,15077=>1000, -15078=>1000,15079=>1000,15080=>1000,15081=>1000,15082=>1000,15083=>1000,15084=>1000,15085=>1000,15086=>1000,15087=>1000, -15088=>1000,15089=>1000,15090=>1000,15091=>1000,15092=>1000,15093=>1000,15094=>1000,15095=>1000,15096=>1000,15097=>1000, -15098=>1000,15099=>1000,15100=>1000,15101=>1000,15102=>1000,15103=>1000,15104=>1000,15105=>1000,15106=>1000,15107=>1000, -15108=>1000,15109=>1000,15110=>1000,15111=>1000,15112=>1000,15113=>1000,15114=>1000,15115=>1000,15116=>1000,15117=>1000, -15118=>1000,15119=>1000,15120=>1000,15121=>1000,15122=>1000,15123=>1000,15124=>1000,15125=>1000,15126=>1000,15127=>1000, -15128=>1000,15129=>1000,15130=>1000,15131=>1000,15132=>1000,15133=>1000,15134=>1000,15135=>1000,15136=>1000,15137=>1000, -15138=>1000,15139=>1000,15140=>1000,15141=>1000,15142=>1000,15143=>1000,15144=>1000,15145=>1000,15146=>1000,15147=>1000, -15148=>1000,15149=>1000,15150=>1000,15151=>1000,15152=>1000,15153=>1000,15154=>1000,15155=>1000,15156=>1000,15157=>1000, -15158=>1000,15159=>1000,15160=>1000,15161=>1000,15162=>1000,15163=>1000,15164=>1000,15165=>1000,15166=>1000,15167=>1000, -15168=>1000,15169=>1000,15170=>1000,15171=>1000,15172=>1000,15173=>1000,15174=>1000,15175=>1000,15176=>1000,15177=>1000, -15178=>1000,15179=>1000,15180=>1000,15181=>1000,15182=>1000,15183=>1000,15184=>1000,15185=>1000,15186=>1000,15187=>1000, -15188=>1000,15189=>1000,15190=>1000,15191=>1000,15192=>1000,15193=>1000,15194=>1000,15195=>1000,15196=>1000,15197=>1000, -15198=>1000,15199=>1000,15200=>1000,15201=>1000,15202=>1000,15203=>1000,15204=>1000,15205=>1000,15206=>1000,15207=>1000, -15208=>1000,15209=>1000,15210=>1000,15211=>1000,15212=>1000,15213=>1000,15214=>1000,15215=>1000,15216=>1000,15217=>1000, -15218=>1000,15219=>1000,15220=>1000,15221=>1000,15222=>1000,15223=>1000,15224=>1000,15225=>1000,15226=>1000,15227=>1000, -15228=>1000,15229=>1000,15230=>1000,15231=>1000,15232=>1000,15233=>1000,15234=>1000,15235=>1000,15236=>1000,15237=>1000, -15238=>1000,15239=>1000,15240=>1000,15241=>1000,15242=>1000,15243=>1000,15244=>1000,15245=>1000,15246=>1000,15247=>1000, -15248=>1000,15249=>1000,15250=>1000,15251=>1000,15252=>1000,15253=>1000,15254=>1000,15255=>1000,15256=>1000,15257=>1000, -15258=>1000,15259=>1000,15260=>1000,15261=>1000,15262=>1000,15263=>1000,15264=>1000,15265=>1000,15266=>1000,15267=>1000, -15268=>1000,15269=>1000,15270=>1000,15271=>1000,15272=>1000,15273=>1000,15274=>1000,15275=>1000,15276=>1000,15277=>1000, -15278=>1000,15279=>1000,15280=>1000,15281=>1000,15282=>1000,15283=>1000,15284=>1000,15285=>1000,15286=>1000,15287=>1000, -15288=>1000,15289=>1000,15290=>1000,15291=>1000,15292=>1000,15293=>1000,15294=>1000,15295=>1000,15296=>1000,15297=>1000, -15298=>1000,15299=>1000,15300=>1000,15301=>1000,15302=>1000,15303=>1000,15304=>1000,15305=>1000,15306=>1000,15307=>1000, -15308=>1000,15309=>1000,15310=>1000,15311=>1000,15312=>1000,15313=>1000,15314=>1000,15315=>1000,15316=>1000,15317=>1000, -15318=>1000,15319=>1000,15320=>1000,15321=>1000,15322=>1000,15323=>1000,15324=>1000,15325=>1000,15326=>1000,15327=>1000, -15328=>1000,15329=>1000,15330=>1000,15331=>1000,15332=>1000,15333=>1000,15334=>1000,15335=>1000,15336=>1000,15337=>1000, -15338=>1000,15339=>1000,15340=>1000,15341=>1000,15342=>1000,15343=>1000,15344=>1000,15345=>1000,15346=>1000,15347=>1000, -15348=>1000,15349=>1000,15350=>1000,15351=>1000,15352=>1000,15353=>1000,15354=>1000,15355=>1000,15356=>1000,15357=>1000, -15358=>1000,15359=>1000,15360=>1000,15361=>1000,15362=>1000,15363=>1000,15364=>1000,15365=>1000,15366=>1000,15367=>1000, -15368=>1000,15369=>1000,15370=>1000,15371=>1000,15372=>1000,15373=>1000,15374=>1000,15375=>1000,15376=>1000,15377=>1000, -15378=>1000,15379=>1000,15380=>1000,15381=>1000,15382=>1000,15383=>1000,15384=>1000,15385=>1000,15386=>1000,15387=>1000, -15388=>1000,15389=>1000,15390=>1000,15391=>1000,15392=>1000,15393=>1000,15394=>1000,15395=>1000,15396=>1000,15397=>1000, -15398=>1000,15399=>1000,15400=>1000,15401=>1000,15402=>1000,15403=>1000,15404=>1000,15405=>1000,15406=>1000,15407=>1000, -15408=>1000,15409=>1000,15410=>1000,15411=>1000,15412=>1000,15413=>1000,15414=>1000,15415=>1000,15416=>1000,15417=>1000, -15418=>1000,15419=>1000,15420=>1000,15421=>1000,15422=>1000,15423=>1000,15424=>1000,15425=>1000,15426=>1000,15427=>1000, -15428=>1000,15429=>1000,15430=>1000,15431=>1000,15432=>1000,15433=>1000,15434=>1000,15435=>1000,15436=>1000,15437=>1000, -15438=>1000,15439=>1000,15440=>1000,15441=>1000,15442=>1000,15443=>1000,15444=>1000,15445=>1000,15446=>1000,15447=>1000, -15448=>1000,15449=>1000,15450=>1000,15451=>1000,15452=>1000,15453=>1000,15454=>1000,15455=>1000,15456=>1000,15457=>1000, -15458=>1000,15459=>1000,15460=>1000,15461=>1000,15462=>1000,15463=>1000,15464=>1000,15465=>1000,15466=>1000,15467=>1000, -15468=>1000,15469=>1000,15470=>1000,15471=>1000,15472=>1000,15473=>1000,15474=>1000,15475=>1000,15476=>1000,15477=>1000, -15478=>1000,15479=>1000,15480=>1000,15481=>1000,15482=>1000,15483=>1000,15484=>1000,15485=>1000,15486=>1000,15487=>1000, -15488=>1000,15489=>1000,15490=>1000,15491=>1000,15492=>1000,15493=>1000,15494=>1000,15495=>1000,15496=>1000,15497=>1000, -15498=>1000,15499=>1000,15500=>1000,15501=>1000,15502=>1000,15503=>1000,15504=>1000,15505=>1000,15506=>1000,15507=>1000, -15508=>1000,15509=>1000,15510=>1000,15511=>1000,15512=>1000,15513=>1000,15514=>1000,15515=>1000,15516=>1000,15517=>1000, -15518=>1000,15519=>1000,15520=>1000,15521=>1000,15522=>1000,15523=>1000,15524=>1000,15525=>1000,15526=>1000,15527=>1000, -15528=>1000,15529=>1000,15530=>1000,15531=>1000,15532=>1000,15533=>1000,15534=>1000,15535=>1000,15536=>1000,15537=>1000, -15538=>1000,15539=>1000,15540=>1000,15541=>1000,15542=>1000,15543=>1000,15544=>1000,15545=>1000,15546=>1000,15547=>1000, -15548=>1000,15549=>1000,15550=>1000,15551=>1000,15552=>1000,15553=>1000,15554=>1000,15555=>1000,15556=>1000,15557=>1000, -15558=>1000,15559=>1000,15560=>1000,15561=>1000,15562=>1000,15563=>1000,15564=>1000,15565=>1000,15566=>1000,15567=>1000, -15568=>1000,15569=>1000,15570=>1000,15571=>1000,15572=>1000,15573=>1000,15574=>1000,15575=>1000,15576=>1000,15577=>1000, -15578=>1000,15579=>1000,15580=>1000,15581=>1000,15582=>1000,15583=>1000,15584=>1000,15585=>1000,15586=>1000,15587=>1000, -15588=>1000,15589=>1000,15590=>1000,15591=>1000,15592=>1000,15593=>1000,15594=>1000,15595=>1000,15596=>1000,15597=>1000, -15598=>1000,15599=>1000,15600=>1000,15601=>1000,15602=>1000,15603=>1000,15604=>1000,15605=>1000,15606=>1000,15607=>1000, -15608=>1000,15609=>1000,15610=>1000,15611=>1000,15612=>1000,15613=>1000,15614=>1000,15615=>1000,15616=>1000,15617=>1000, -15618=>1000,15619=>1000,15620=>1000,15621=>1000,15622=>1000,15623=>1000,15624=>1000,15625=>1000,15626=>1000,15627=>1000, -15628=>1000,15629=>1000,15630=>1000,15631=>1000,15632=>1000,15633=>1000,15634=>1000,15635=>1000,15636=>1000,15637=>1000, -15638=>1000,15639=>1000,15640=>1000,15641=>1000,15642=>1000,15643=>1000,15644=>1000,15645=>1000,15646=>1000,15647=>1000, -15648=>1000,15649=>1000,15650=>1000,15651=>1000,15652=>1000,15653=>1000,15654=>1000,15655=>1000,15656=>1000,15657=>1000, -15658=>1000,15659=>1000,15660=>1000,15661=>1000,15662=>1000,15663=>1000,15664=>1000,15665=>1000,15666=>1000,15667=>1000, -15668=>1000,15669=>1000,15670=>1000,15671=>1000,15672=>1000,15673=>1000,15674=>1000,15675=>1000,15676=>1000,15677=>1000, -15678=>1000,15679=>1000,15680=>1000,15681=>1000,15682=>1000,15683=>1000,15684=>1000,15685=>1000,15686=>1000,15687=>1000, -15688=>1000,15689=>1000,15690=>1000,15691=>1000,15692=>1000,15693=>1000,15694=>1000,15695=>1000,15696=>1000,15697=>1000, -15698=>1000,15699=>1000,15700=>1000,15701=>1000,15702=>1000,15703=>1000,15704=>1000,15705=>1000,15706=>1000,15707=>1000, -15708=>1000,15709=>1000,15710=>1000,15711=>1000,15712=>1000,15713=>1000,15714=>1000,15715=>1000,15716=>1000,15717=>1000, -15718=>1000,15719=>1000,15720=>1000,15721=>1000,15722=>1000,15723=>1000,15724=>1000,15725=>1000,15726=>1000,15727=>1000, -15728=>1000,15729=>1000,15730=>1000,15731=>1000,15732=>1000,15733=>1000,15734=>1000,15735=>1000,15736=>1000,15737=>1000, -15738=>1000,15739=>1000,15740=>1000,15741=>1000,15742=>1000,15743=>1000,15744=>1000,15745=>1000,15746=>1000,15747=>1000, -15748=>1000,15749=>1000,15750=>1000,15751=>1000,15752=>1000,15753=>1000,15754=>1000,15755=>1000,15756=>1000,15757=>1000, -15758=>1000,15759=>1000,15760=>1000,15761=>1000,15762=>1000,15763=>1000,15764=>1000,15765=>1000,15766=>1000,15767=>1000, -15768=>1000,15769=>1000,15770=>1000,15771=>1000,15772=>1000,15773=>1000,15774=>1000,15775=>1000,15776=>1000,15777=>1000, -15778=>1000,15779=>1000,15780=>1000,15781=>1000,15782=>1000,15783=>1000,15784=>1000,15785=>1000,15786=>1000,15787=>1000, -15788=>1000,15789=>1000,15790=>1000,15791=>1000,15792=>1000,15793=>1000,15794=>1000,15795=>1000,15796=>1000,15797=>1000, -15798=>1000,15799=>1000,15800=>1000,15801=>1000,15802=>1000,15803=>1000,15804=>1000,15805=>1000,15806=>1000,15807=>1000, -15808=>1000,15809=>1000,15810=>1000,15811=>1000,15812=>1000,15813=>1000,15814=>1000,15815=>1000,15816=>1000,15817=>1000, -15818=>1000,15819=>1000,15820=>1000,15821=>1000,15822=>1000,15823=>1000,15824=>1000,15825=>1000,15826=>1000,15827=>1000, -15828=>1000,15829=>1000,15830=>1000,15831=>1000,15832=>1000,15833=>1000,15834=>1000,15835=>1000,15836=>1000,15837=>1000, -15838=>1000,15839=>1000,15840=>1000,15841=>1000,15842=>1000,15843=>1000,15844=>1000,15845=>1000,15846=>1000,15847=>1000, -15848=>1000,15849=>1000,15850=>1000,15851=>1000,15852=>1000,15853=>1000,15854=>1000,15855=>1000,15856=>1000,15857=>1000, -15858=>1000,15859=>1000,15860=>1000,15861=>1000,15862=>1000,15863=>1000,15864=>1000,15865=>1000,15866=>1000,15867=>1000, -15868=>1000,15869=>1000,15870=>1000,15871=>1000,15872=>1000,15873=>1000,15874=>1000,15875=>1000,15876=>1000,15877=>1000, -15878=>1000,15879=>1000,15880=>1000,15881=>1000,15882=>1000,15883=>1000,15884=>1000,15885=>1000,15886=>1000,15887=>1000, -15888=>1000,15889=>1000,15890=>1000,15891=>1000,15892=>1000,15893=>1000,15894=>1000,15895=>1000,15896=>1000,15897=>1000, -15898=>1000,15899=>1000,15900=>1000,15901=>1000,15902=>1000,15903=>1000,15904=>1000,15905=>1000,15906=>1000,15907=>1000, -15908=>1000,15909=>1000,15910=>1000,15911=>1000,15912=>1000,15913=>1000,15914=>1000,15915=>1000,15916=>1000,15917=>1000, -15918=>1000,15919=>1000,15920=>1000,15921=>1000,15922=>1000,15923=>1000,15924=>1000,15925=>1000,15926=>1000,15927=>1000, -15928=>1000,15929=>1000,15930=>1000,15931=>1000,15932=>1000,15933=>1000,15934=>1000,15935=>1000,15936=>1000,15937=>1000, -15938=>1000,15939=>1000,15940=>1000,15941=>1000,15942=>1000,15943=>1000,15944=>1000,15945=>1000,15946=>1000,15947=>1000, -15948=>1000,15949=>1000,15950=>1000,15951=>1000,15952=>1000,15953=>1000,15954=>1000,15955=>1000,15956=>1000,15957=>1000, -15958=>1000,15959=>1000,15960=>1000,15961=>1000,15962=>1000,15963=>1000,15964=>1000,15965=>1000,15966=>1000,15967=>1000, -15968=>1000,15969=>1000,15970=>1000,15971=>1000,15972=>1000,15973=>1000,15974=>1000,15975=>1000,15976=>1000,15977=>1000, -15978=>1000,15979=>1000,15980=>1000,15981=>1000,15982=>1000,15983=>1000,15984=>1000,15985=>1000,15986=>1000,15987=>1000, -15988=>1000,15989=>1000,15990=>1000,15991=>1000,15992=>1000,15993=>1000,15994=>1000,15995=>1000,15996=>1000,15997=>1000, -15998=>1000,15999=>1000,16000=>1000,16001=>1000,16002=>1000,16003=>1000,16004=>1000,16005=>1000,16006=>1000,16007=>1000, -16008=>1000,16009=>1000,16010=>1000,16011=>1000,16012=>1000,16013=>1000,16014=>1000,16015=>1000,16016=>1000,16017=>1000, -16018=>1000,16019=>1000,16020=>1000,16021=>1000,16022=>1000,16023=>1000,16024=>1000,16025=>1000,16026=>1000,16027=>1000, -16028=>1000,16029=>1000,16030=>1000,16031=>1000,16032=>1000,16033=>1000,16034=>1000,16035=>1000,16036=>1000,16037=>1000, -16038=>1000,16039=>1000,16040=>1000,16041=>1000,16042=>1000,16043=>1000,16044=>1000,16045=>1000,16046=>1000,16047=>1000, -16048=>1000,16049=>1000,16050=>1000,16051=>1000,16052=>1000,16053=>1000,16054=>1000,16055=>1000,16056=>1000,16057=>1000, -16058=>1000,16059=>1000,16060=>1000,16061=>1000,16062=>1000,16063=>1000,16064=>1000,16065=>1000,16066=>1000,16067=>1000, -16068=>1000,16069=>1000,16070=>1000,16071=>1000,16072=>1000,16073=>1000,16074=>1000,16075=>1000,16076=>1000,16077=>1000, -16078=>1000,16079=>1000,16080=>1000,16081=>1000,16082=>1000,16083=>1000,16084=>1000,16085=>1000,16086=>1000,16087=>1000, -16088=>1000,16089=>1000,16090=>1000,16091=>1000,16092=>1000,16093=>1000,16094=>1000,16095=>1000,16096=>1000,16097=>1000, -16098=>1000,16099=>1000,16100=>1000,16101=>1000,16102=>1000,16103=>1000,16104=>1000,16105=>1000,16106=>1000,16107=>1000, -16108=>1000,16109=>1000,16110=>1000,16111=>1000,16112=>1000,16113=>1000,16114=>1000,16115=>1000,16116=>1000,16117=>1000, -16118=>1000,16119=>1000,16120=>1000,16121=>1000,16122=>1000,16123=>1000,16124=>1000,16125=>1000,16126=>1000,16127=>1000, -16128=>1000,16129=>1000,16130=>1000,16131=>1000,16132=>1000,16133=>1000,16134=>1000,16135=>1000,16136=>1000,16137=>1000, -16138=>1000,16139=>1000,16140=>1000,16141=>1000,16142=>1000,16143=>1000,16144=>1000,16145=>1000,16146=>1000,16147=>1000, -16148=>1000,16149=>1000,16150=>1000,16151=>1000,16152=>1000,16153=>1000,16154=>1000,16155=>1000,16156=>1000,16157=>1000, -16158=>1000,16159=>1000,16160=>1000,16161=>1000,16162=>1000,16163=>1000,16164=>1000,16165=>1000,16166=>1000,16167=>1000, -16168=>1000,16169=>1000,16170=>1000,16171=>1000,16172=>1000,16173=>1000,16174=>1000,16175=>1000,16176=>1000,16177=>1000, -16178=>1000,16179=>1000,16180=>1000,16181=>1000,16182=>1000,16183=>1000,16184=>1000,16185=>1000,16186=>1000,16187=>1000, -16188=>1000,16189=>1000,16190=>1000,16191=>1000,16192=>1000,16193=>1000,16194=>1000,16195=>1000,16196=>1000,16197=>1000, -16198=>1000,16199=>1000,16200=>1000,16201=>1000,16202=>1000,16203=>1000,16204=>1000,16205=>1000,16206=>1000,16207=>1000, -16208=>1000,16209=>1000,16210=>1000,16211=>1000,16212=>1000,16213=>1000,16214=>1000,16215=>1000,16216=>1000,16217=>1000, -16218=>1000,16219=>1000,16220=>1000,16221=>1000,16222=>1000,16223=>1000,16224=>1000,16225=>1000,16226=>1000,16227=>1000, -16228=>1000,16229=>1000,16230=>1000,16231=>1000,16232=>1000,16233=>1000,16234=>1000,16235=>1000,16236=>1000,16237=>1000, -16238=>1000,16239=>1000,16240=>1000,16241=>1000,16242=>1000,16243=>1000,16244=>1000,16245=>1000,16246=>1000,16247=>1000, -16248=>1000,16249=>1000,16250=>1000,16251=>1000,16252=>1000,16253=>1000,16254=>1000,16255=>1000,16256=>1000,16257=>1000, -16258=>1000,16259=>1000,16260=>1000,16261=>1000,16262=>1000,16263=>1000,16264=>1000,16265=>1000,16266=>1000,16267=>1000, -16268=>1000,16269=>1000,16270=>1000,16271=>1000,16272=>1000,16273=>1000,16274=>1000,16275=>1000,16276=>1000,16277=>1000, -16278=>1000,16279=>1000,16280=>1000,16281=>1000,16282=>1000,16283=>1000,16284=>1000,16285=>1000,16286=>1000,16287=>1000, -16288=>1000,16289=>1000,16290=>1000,16291=>1000,16292=>1000,16293=>1000,16294=>1000,16295=>1000,16296=>1000,16297=>1000, -16298=>1000,16299=>1000,16300=>1000,16301=>1000,16302=>1000,16303=>1000,16304=>1000,16305=>1000,16306=>1000,16307=>1000, -16308=>1000,16309=>1000,16310=>1000,16311=>1000,16312=>1000,16313=>1000,16314=>1000,16315=>1000,16316=>1000,16317=>1000, -16318=>1000,16319=>1000,16320=>1000,16321=>1000,16322=>1000,16323=>1000,16324=>1000,16325=>1000,16326=>1000,16327=>1000, -16328=>1000,16329=>1000,16330=>1000,16331=>1000,16332=>1000,16333=>1000,16334=>1000,16335=>1000,16336=>1000,16337=>1000, -16338=>1000,16339=>1000,16340=>1000,16341=>1000,16342=>1000,16343=>1000,16344=>1000,16345=>1000,16346=>1000,16347=>1000, -16348=>1000,16349=>1000,16350=>1000,16351=>1000,16352=>1000,16353=>1000,16354=>1000,16355=>1000,16356=>1000,16357=>1000, -16358=>1000,16359=>1000,16360=>1000,16361=>1000,16362=>1000,16363=>1000,16364=>1000,16365=>1000,16366=>1000,16367=>1000, -16368=>1000,16369=>1000,16370=>1000,16371=>1000,16372=>1000,16373=>1000,16374=>1000,16375=>1000,16376=>1000,16377=>1000, -16378=>1000,16379=>1000,16380=>1000,16381=>1000,16382=>1000,16383=>1000,16384=>1000,16385=>1000,16386=>1000,16387=>1000, -16388=>1000,16389=>1000,16390=>1000,16391=>1000,16392=>1000,16393=>1000,16394=>1000,16395=>1000,16396=>1000,16397=>1000, -16398=>1000,16399=>1000,16400=>1000,16401=>1000,16402=>1000,16403=>1000,16404=>1000,16405=>1000,16406=>1000,16407=>1000, -16408=>1000,16409=>1000,16410=>1000,16411=>1000,16412=>1000,16413=>1000,16414=>1000,16415=>1000,16416=>1000,16417=>1000, -16418=>1000,16419=>1000,16420=>1000,16421=>1000,16422=>1000,16423=>1000,16424=>1000,16425=>1000,16426=>1000,16427=>1000, -16428=>1000,16429=>1000,16430=>1000,16431=>1000,16432=>1000,16433=>1000,16434=>1000,16435=>1000,16436=>1000,16437=>1000, -16438=>1000,16439=>1000,16440=>1000,16441=>1000,16442=>1000,16443=>1000,16444=>1000,16445=>1000,16446=>1000,16447=>1000, -16448=>1000,16449=>1000,16450=>1000,16451=>1000,16452=>1000,16453=>1000,16454=>1000,16455=>1000,16456=>1000,16457=>1000, -16458=>1000,16459=>1000,16460=>1000,16461=>1000,16462=>1000,16463=>1000,16464=>1000,16465=>1000,16466=>1000,16467=>1000, -16468=>1000,16469=>1000,16470=>1000,16471=>1000,16472=>1000,16473=>1000,16474=>1000,16475=>1000,16476=>1000,16477=>1000, -16478=>1000,16479=>1000,16480=>1000,16481=>1000,16482=>1000,16483=>1000,16484=>1000,16485=>1000,16486=>1000,16487=>1000, -16488=>1000,16489=>1000,16490=>1000,16491=>1000,16492=>1000,16493=>1000,16494=>1000,16495=>1000,16496=>1000,16497=>1000, -16498=>1000,16499=>1000,16500=>1000,16501=>1000,16502=>1000,16503=>1000,16504=>1000,16505=>1000,16506=>1000,16507=>1000, -16508=>1000,16509=>1000,16510=>1000,16511=>1000,16512=>1000,16513=>1000,16514=>1000,16515=>1000,16516=>1000,16517=>1000, -16518=>1000,16519=>1000,16520=>1000,16521=>1000,16522=>1000,16523=>1000,16524=>1000,16525=>1000,16526=>1000,16527=>1000, -16528=>1000,16529=>1000,16530=>1000,16531=>1000,16532=>1000,16533=>1000,16534=>1000,16535=>1000,16536=>1000,16537=>1000, -16538=>1000,16539=>1000,16540=>1000,16541=>1000,16542=>1000,16543=>1000,16544=>1000,16545=>1000,16546=>1000,16547=>1000, -16548=>1000,16549=>1000,16550=>1000,16551=>1000,16552=>1000,16553=>1000,16554=>1000,16555=>1000,16556=>1000,16557=>1000, -16558=>1000,16559=>1000,16560=>1000,16561=>1000,16562=>1000,16563=>1000,16564=>1000,16565=>1000,16566=>1000,16567=>1000, -16568=>1000,16569=>1000,16570=>1000,16571=>1000,16572=>1000,16573=>1000,16574=>1000,16575=>1000,16576=>1000,16577=>1000, -16578=>1000,16579=>1000,16580=>1000,16581=>1000,16582=>1000,16583=>1000,16584=>1000,16585=>1000,16586=>1000,16587=>1000, -16588=>1000,16589=>1000,16590=>1000,16591=>1000,16592=>1000,16593=>1000,16594=>1000,16595=>1000,16596=>1000,16597=>1000, -16598=>1000,16599=>1000,16600=>1000,16601=>1000,16602=>1000,16603=>1000,16604=>1000,16605=>1000,16606=>1000,16607=>1000, -16608=>1000,16609=>1000,16610=>1000,16611=>1000,16612=>1000,16613=>1000,16614=>1000,16615=>1000,16616=>1000,16617=>1000, -16618=>1000,16619=>1000,16620=>1000,16621=>1000,16622=>1000,16623=>1000,16624=>1000,16625=>1000,16626=>1000,16627=>1000, -16628=>1000,16629=>1000,16630=>1000,16631=>1000,16632=>1000,16633=>1000,16634=>1000,16635=>1000,16636=>1000,16637=>1000, -16638=>1000,16639=>1000,16640=>1000,16641=>1000,16642=>1000,16643=>1000,16644=>1000,16645=>1000,16646=>1000,16647=>1000, -16648=>1000,16649=>1000,16650=>1000,16651=>1000,16652=>1000,16653=>1000,16654=>1000,16655=>1000,16656=>1000,16657=>1000, -16658=>1000,16659=>1000,16660=>1000,16661=>1000,16662=>1000,16663=>1000,16664=>1000,16665=>1000,16666=>1000,16667=>1000, -16668=>1000,16669=>1000,16670=>1000,16671=>1000,16672=>1000,16673=>1000,16674=>1000,16675=>1000,16676=>1000,16677=>1000, -16678=>1000,16679=>1000,16680=>1000,16681=>1000,16682=>1000,16683=>1000,16684=>1000,16685=>1000,16686=>1000,16687=>1000, -16688=>1000,16689=>1000,16690=>1000,16691=>1000,16692=>1000,16693=>1000,16694=>1000,16695=>1000,16696=>1000,16697=>1000, -16698=>1000,16699=>1000,16700=>1000,16701=>1000,16702=>1000,16703=>1000,16704=>1000,16705=>1000,16706=>1000,16707=>1000, -16708=>1000,16709=>1000,16710=>1000,16711=>1000,16712=>1000,16713=>1000,16714=>1000,16715=>1000,16716=>1000,16717=>1000, -16718=>1000,16719=>1000,16720=>1000,16721=>1000,16722=>1000,16723=>1000,16724=>1000,16725=>1000,16726=>1000,16727=>1000, -16728=>1000,16729=>1000,16730=>1000,16731=>1000,16732=>1000,16733=>1000,16734=>1000,16735=>1000,16736=>1000,16737=>1000, -16738=>1000,16739=>1000,16740=>1000,16741=>1000,16742=>1000,16743=>1000,16744=>1000,16745=>1000,16746=>1000,16747=>1000, -16748=>1000,16749=>1000,16750=>1000,16751=>1000,16752=>1000,16753=>1000,16754=>1000,16755=>1000,16756=>1000,16757=>1000, -16758=>1000,16759=>1000,16760=>1000,16761=>1000,16762=>1000,16763=>1000,16764=>1000,16765=>1000,16766=>1000,16767=>1000, -16768=>1000,16769=>1000,16770=>1000,16771=>1000,16772=>1000,16773=>1000,16774=>1000,16775=>1000,16776=>1000,16777=>1000, -16778=>1000,16779=>1000,16780=>1000,16781=>1000,16782=>1000,16783=>1000,16784=>1000,16785=>1000,16786=>1000,16787=>1000, -16788=>1000,16789=>1000,16790=>1000,16791=>1000,16792=>1000,16793=>1000,16794=>1000,16795=>1000,16796=>1000,16797=>1000, -16798=>1000,16799=>1000,16800=>1000,16801=>1000,16802=>1000,16803=>1000,16804=>1000,16805=>1000,16806=>1000,16807=>1000, -16808=>1000,16809=>1000,16810=>1000,16811=>1000,16812=>1000,16813=>1000,16814=>1000,16815=>1000,16816=>1000,16817=>1000, -16818=>1000,16819=>1000,16820=>1000,16821=>1000,16822=>1000,16823=>1000,16824=>1000,16825=>1000,16826=>1000,16827=>1000, -16828=>1000,16829=>1000,16830=>1000,16831=>1000,16832=>1000,16833=>1000,16834=>1000,16835=>1000,16836=>1000,16837=>1000, -16838=>1000,16839=>1000,16840=>1000,16841=>1000,16842=>1000,16843=>1000,16844=>1000,16845=>1000,16846=>1000,16847=>1000, -16848=>1000,16849=>1000,16850=>1000,16851=>1000,16852=>1000,16853=>1000,16854=>1000,16855=>1000,16856=>1000,16857=>1000, -16858=>1000,16859=>1000,16860=>1000,16861=>1000,16862=>1000,16863=>1000,16864=>1000,16865=>1000,16866=>1000,16867=>1000, -16868=>1000,16869=>1000,16870=>1000,16871=>1000,16872=>1000,16873=>1000,16874=>1000,16875=>1000,16876=>1000,16877=>1000, -16878=>1000,16879=>1000,16880=>1000,16881=>1000,16882=>1000,16883=>1000,16884=>1000,16885=>1000,16886=>1000,16887=>1000, -16888=>1000,16889=>1000,16890=>1000,16891=>1000,16892=>1000,16893=>1000,16894=>1000,16895=>1000,16896=>1000,16897=>1000, -16898=>1000,16899=>1000,16900=>1000,16901=>1000,16902=>1000,16903=>1000,16904=>1000,16905=>1000,16906=>1000,16907=>1000, -16908=>1000,16909=>1000,16910=>1000,16911=>1000,16912=>1000,16913=>1000,16914=>1000,16915=>1000,16916=>1000,16917=>1000, -16918=>1000,16919=>1000,16920=>1000,16921=>1000,16922=>1000,16923=>1000,16924=>1000,16925=>1000,16926=>1000,16927=>1000, -16928=>1000,16929=>1000,16930=>1000,16931=>1000,16932=>1000,16933=>1000,16934=>1000,16935=>1000,16936=>1000,16937=>1000, -16938=>1000,16939=>1000,16940=>1000,16941=>1000,16942=>1000,16943=>1000,16944=>1000,16945=>1000,16946=>1000,16947=>1000, -16948=>1000,16949=>1000,16950=>1000,16951=>1000,16952=>1000,16953=>1000,16954=>1000,16955=>1000,16956=>1000,16957=>1000, -16958=>1000,16959=>1000,16960=>1000,16961=>1000,16962=>1000,16963=>1000,16964=>1000,16965=>1000,16966=>1000,16967=>1000, -16968=>1000,16969=>1000,16970=>1000,16971=>1000,16972=>1000,16973=>1000,16974=>1000,16975=>1000,16976=>1000,16977=>1000, -16978=>1000,16979=>1000,16980=>1000,16981=>1000,16982=>1000,16983=>1000,16984=>1000,16985=>1000,16986=>1000,16987=>1000, -16988=>1000,16989=>1000,16990=>1000,16991=>1000,16992=>1000,16993=>1000,16994=>1000,16995=>1000,16996=>1000,16997=>1000, -16998=>1000,16999=>1000,17000=>1000,17001=>1000,17002=>1000,17003=>1000,17004=>1000,17005=>1000,17006=>1000,17007=>1000, -17008=>1000,17009=>1000,17010=>1000,17011=>1000,17012=>1000,17013=>1000,17014=>1000,17015=>1000,17016=>1000,17017=>1000, -17018=>1000,17019=>1000,17020=>1000,17021=>1000,17022=>1000,17023=>1000,17024=>1000,17025=>1000,17026=>1000,17027=>1000, -17028=>1000,17029=>1000,17030=>1000,17031=>1000,17032=>1000,17033=>1000,17034=>1000,17035=>1000,17036=>1000,17037=>1000, -17038=>1000,17039=>1000,17040=>1000,17041=>1000,17042=>1000,17043=>1000,17044=>1000,17045=>1000,17046=>1000,17047=>1000, -17048=>1000,17049=>1000,17050=>1000,17051=>1000,17052=>1000,17053=>1000,17054=>1000,17055=>1000,17056=>1000,17057=>1000, -17058=>1000,17059=>1000,17060=>1000,17061=>1000,17062=>1000,17063=>1000,17064=>1000,17065=>1000,17066=>1000,17067=>1000, -17068=>1000,17069=>1000,17070=>1000,17071=>1000,17072=>1000,17073=>1000,17074=>1000,17075=>1000,17076=>1000,17077=>1000, -17078=>1000,17079=>1000,17080=>1000,17081=>1000,17082=>1000,17083=>1000,17084=>1000,17085=>1000,17086=>1000,17087=>1000, -17088=>1000,17089=>1000,17090=>1000,17091=>1000,17092=>1000,17093=>1000,17094=>1000,17095=>1000,17096=>1000,17097=>1000, -17098=>1000,17099=>1000,17100=>1000,17101=>1000,17102=>1000,17103=>1000,17104=>1000,17105=>1000,17106=>1000,17107=>1000, -17108=>1000,17109=>1000,17110=>1000,17111=>1000,17112=>1000,17113=>1000,17114=>1000,17115=>1000,17116=>1000,17117=>1000, -17118=>1000,17119=>1000,17120=>1000,17121=>1000,17122=>1000,17123=>1000,17124=>1000,17125=>1000,17126=>1000,17127=>1000, -17128=>1000,17129=>1000,17130=>1000,17131=>1000,17132=>1000,17133=>1000,17134=>1000,17135=>1000,17136=>1000,17137=>1000, -17138=>1000,17139=>1000,17140=>1000,17141=>1000,17142=>1000,17143=>1000,17144=>1000,17145=>1000,17146=>1000,17147=>1000, -17148=>1000,17149=>1000,17150=>1000,17151=>1000,17152=>1000,17153=>1000,17154=>1000,17155=>1000,17156=>1000,17157=>1000, -17158=>1000,17159=>1000,17160=>1000,17161=>1000,17162=>1000,17163=>1000,17164=>1000,17165=>1000,17166=>1000,17167=>1000, -17168=>1000,17169=>1000,17170=>1000,17171=>1000,17172=>1000,17173=>1000,17174=>1000,17175=>1000,17176=>1000,17177=>1000, -17178=>1000,17179=>1000,17180=>1000,17181=>1000,17182=>1000,17183=>1000,17184=>1000,17185=>1000,17186=>1000,17187=>1000, -17188=>1000,17189=>1000,17190=>1000,17191=>1000,17192=>1000,17193=>1000,17194=>1000,17195=>1000,17196=>1000,17197=>1000, -17198=>1000,17199=>1000,17200=>1000,17201=>1000,17202=>1000,17203=>1000,17204=>1000,17205=>1000,17206=>1000,17207=>1000, -17208=>1000,17209=>1000,17210=>1000,17211=>1000,17212=>1000,17213=>1000,17214=>1000,17215=>1000,17216=>1000,17217=>1000, -17218=>1000,17219=>1000,17220=>1000,17221=>1000,17222=>1000,17223=>1000,17224=>1000,17225=>1000,17226=>1000,17227=>1000, -17228=>1000,17229=>1000,17230=>1000,17231=>1000,17232=>1000,17233=>1000,17234=>1000,17235=>1000,17236=>1000,17237=>1000, -17238=>1000,17239=>1000,17240=>1000,17241=>1000,17242=>1000,17243=>1000,17244=>1000,17245=>1000,17246=>1000,17247=>1000, -17248=>1000,17249=>1000,17250=>1000,17251=>1000,17252=>1000,17253=>1000,17254=>1000,17255=>1000,17256=>1000,17257=>1000, -17258=>1000,17259=>1000,17260=>1000,17261=>1000,17262=>1000,17263=>1000,17264=>1000,17265=>1000,17266=>1000,17267=>1000, -17268=>1000,17269=>1000,17270=>1000,17271=>1000,17272=>1000,17273=>1000,17274=>1000,17275=>1000,17276=>1000,17277=>1000, -17278=>1000,17279=>1000,17280=>1000,17281=>1000,17282=>1000,17283=>1000,17284=>1000,17285=>1000,17286=>1000,17287=>1000, -17288=>1000,17289=>1000,17290=>1000,17291=>1000,17292=>1000,17293=>1000,17294=>1000,17295=>1000,17296=>1000,17297=>1000, -17298=>1000,17299=>1000,17300=>1000,17301=>1000,17302=>1000,17303=>1000,17304=>1000,17305=>1000,17306=>1000,17307=>1000, -17308=>1000,17309=>1000,17310=>1000,17311=>1000,17312=>1000,17313=>1000,17314=>1000,17315=>1000,17316=>1000,17317=>1000, -17318=>1000,17319=>1000,17320=>1000,17321=>1000,17322=>1000,17323=>1000,17324=>1000,17325=>1000,17326=>1000,17327=>1000, -17328=>1000,17329=>1000,17330=>1000,17331=>1000,17332=>1000,17333=>1000,17334=>1000,17335=>1000,17336=>1000,17337=>1000, -17338=>1000,17339=>1000,17340=>1000,17341=>1000,17342=>1000,17343=>1000,17344=>1000,17345=>1000,17346=>1000,17347=>1000, -17348=>1000,17349=>1000,17350=>1000,17351=>1000,17352=>1000,17353=>1000,17354=>1000,17355=>1000,17356=>1000,17357=>1000, -17358=>1000,17359=>1000,17360=>1000,17361=>1000,17362=>1000,17363=>1000,17364=>1000,17365=>1000,17366=>1000,17367=>1000, -17368=>1000,17369=>1000,17370=>1000,17371=>1000,17372=>1000,17373=>1000,17374=>1000,17375=>1000,17376=>1000,17377=>1000, -17378=>1000,17379=>1000,17380=>1000,17381=>1000,17382=>1000,17383=>1000,17384=>1000,17385=>1000,17386=>1000,17387=>1000, -17388=>1000,17389=>1000,17390=>1000,17391=>1000,17392=>1000,17393=>1000,17394=>1000,17395=>1000,17396=>1000,17397=>1000, -17398=>1000,17399=>1000,17400=>1000,17401=>1000,17402=>1000,17403=>1000,17404=>1000,17405=>1000,17406=>1000,17407=>1000, -17408=>1000,17409=>1000,17410=>1000,17411=>1000,17412=>1000,17413=>1000,17414=>1000,17415=>1000,17416=>1000,17417=>1000, -17418=>1000,17419=>1000,17420=>1000,17421=>1000,17422=>1000,17423=>1000,17424=>1000,17425=>1000,17426=>1000,17427=>1000, -17428=>1000,17429=>1000,17430=>1000,17431=>1000,17432=>1000,17433=>1000,17434=>1000,17435=>1000,17436=>1000,17437=>1000, -17438=>1000,17439=>1000,17440=>1000,17441=>1000,17442=>1000,17443=>1000,17444=>1000,17445=>1000,17446=>1000,17447=>1000, -17448=>1000,17449=>1000,17450=>1000,17451=>1000,17452=>1000,17453=>1000,17454=>1000,17455=>1000,17456=>1000,17457=>1000, -17458=>1000,17459=>1000,17460=>1000,17461=>1000,17462=>1000,17463=>1000,17464=>1000,17465=>1000,17466=>1000,17467=>1000, -17468=>1000,17469=>1000,17470=>1000,17471=>1000,17472=>1000,17473=>1000,17474=>1000,17475=>1000,17476=>1000,17477=>1000, -17478=>1000,17479=>1000,17480=>1000,17481=>1000,17482=>1000,17483=>1000,17484=>1000,17485=>1000,17486=>1000,17487=>1000, -17488=>1000,17489=>1000,17490=>1000,17491=>1000,17492=>1000,17493=>1000,17494=>1000,17495=>1000,17496=>1000,17497=>1000, -17498=>1000,17499=>1000,17500=>1000,17501=>1000,17502=>1000,17503=>1000,17504=>1000,17505=>1000,17506=>1000,17507=>1000, -17508=>1000,17509=>1000,17510=>1000,17511=>1000,17512=>1000,17513=>1000,17514=>1000,17515=>1000,17516=>1000,17517=>1000, -17518=>1000,17519=>1000,17520=>1000,17521=>1000,17522=>1000,17523=>1000,17524=>1000,17525=>1000,17526=>1000,17527=>1000, -17528=>1000,17529=>1000,17530=>1000,17531=>1000,17532=>1000,17533=>1000,17534=>1000,17535=>1000,17536=>1000,17537=>1000, -17538=>1000,17539=>1000,17540=>1000,17541=>1000,17542=>1000,17543=>1000,17544=>1000,17545=>1000,17546=>1000,17547=>1000, -17548=>1000,17549=>1000,17550=>1000,17551=>1000,17552=>1000,17553=>1000,17554=>1000,17555=>1000,17556=>1000,17557=>1000, -17558=>1000,17559=>1000,17560=>1000,17561=>1000,17562=>1000,17563=>1000,17564=>1000,17565=>1000,17566=>1000,17567=>1000, -17568=>1000,17569=>1000,17570=>1000,17571=>1000,17572=>1000,17573=>1000,17574=>1000,17575=>1000,17576=>1000,17577=>1000, -17578=>1000,17579=>1000,17580=>1000,17581=>1000,17582=>1000,17583=>1000,17584=>1000,17585=>1000,17586=>1000,17587=>1000, -17588=>1000,17589=>1000,17590=>1000,17591=>1000,17592=>1000,17593=>1000,17594=>1000,17595=>1000,17596=>1000,17597=>1000, -17598=>1000,17599=>1000,17600=>1000,17601=>1000,17602=>1000,17603=>1000,17604=>1000,17605=>1000,17606=>1000,17607=>1000, -17608=>1000,17609=>1000,17610=>1000,17611=>1000,17612=>1000,17613=>1000,17614=>1000,17615=>1000,17616=>1000,17617=>1000, -17618=>1000,17619=>1000,17620=>1000,17621=>1000,17622=>1000,17623=>1000,17624=>1000,17625=>1000,17626=>1000,17627=>1000, -17628=>1000,17629=>1000,17630=>1000,17631=>1000,17632=>1000,17633=>1000,17634=>1000,17635=>1000,17636=>1000,17637=>1000, -17638=>1000,17639=>1000,17640=>1000,17641=>1000,17642=>1000,17643=>1000,17644=>1000,17645=>1000,17646=>1000,17647=>1000, -17648=>1000,17649=>1000,17650=>1000,17651=>1000,17652=>1000,17653=>1000,17654=>1000,17655=>1000,17656=>1000,17657=>1000, -17658=>1000,17659=>1000,17660=>1000,17661=>1000,17662=>1000,17663=>1000,17664=>1000,17665=>1000,17666=>1000,17667=>1000, -17668=>1000,17669=>1000,17670=>1000,17671=>1000,17672=>1000,17673=>1000,17674=>1000,17675=>1000,17676=>1000,17677=>1000, -17678=>1000,17679=>1000,17680=>1000,17681=>1000,17682=>1000,17683=>1000,17684=>1000,17685=>1000,17686=>1000,17687=>1000, -17688=>1000,17689=>1000,17690=>1000,17691=>1000,17692=>1000,17693=>1000,17694=>1000,17695=>1000,17696=>1000,17697=>1000, -17698=>1000,17699=>1000,17700=>1000,17701=>1000,17702=>1000,17703=>1000,17704=>1000,17705=>1000,17706=>1000,17707=>1000, -17708=>1000,17709=>1000,17710=>1000,17711=>1000,17712=>1000,17713=>1000,17714=>1000,17715=>1000,17716=>1000,17717=>1000, -17718=>1000,17719=>1000,17720=>1000,17721=>1000,17722=>1000,17723=>1000,17724=>1000,17725=>1000,17726=>1000,17727=>1000, -17728=>1000,17729=>1000,17730=>1000,17731=>1000,17732=>1000,17733=>1000,17734=>1000,17735=>1000,17736=>1000,17737=>1000, -17738=>1000,17739=>1000,17740=>1000,17741=>1000,17742=>1000,17743=>1000,17744=>1000,17745=>1000,17746=>1000,17747=>1000, -17748=>1000,17749=>1000,17750=>1000,17751=>1000,17752=>1000,17753=>1000,17754=>1000,17755=>1000,17756=>1000,17757=>1000, -17758=>1000,17759=>1000,17760=>1000,17761=>1000,17762=>1000,17763=>1000,17764=>1000,17765=>1000,17766=>1000,17767=>1000, -17768=>1000,17769=>1000,17770=>1000,17771=>1000,17772=>1000,17773=>1000,17774=>1000,17775=>1000,17776=>1000,17777=>1000, -17778=>1000,17779=>1000,17780=>1000,17781=>1000,17782=>1000,17783=>1000,17784=>1000,17785=>1000,17786=>1000,17787=>1000, -17788=>1000,17789=>1000,17790=>1000,17791=>1000,17792=>1000,17793=>1000,17794=>1000,17795=>1000,17796=>1000,17797=>1000, -17798=>1000,17799=>1000,17800=>1000,17801=>1000,17802=>1000,17803=>1000,17804=>1000,17805=>1000,17806=>1000,17807=>1000, -17808=>1000,17809=>1000,17810=>1000,17811=>1000,17812=>1000,17813=>1000,17814=>1000,17815=>1000,17816=>1000,17817=>1000, -17818=>1000,17819=>1000,17820=>1000,17821=>1000,17822=>1000,17823=>1000,17824=>1000,17825=>1000,17826=>1000,17827=>1000, -17828=>1000,17829=>1000,17830=>1000,17831=>1000,17832=>1000,17833=>1000,17834=>1000,17835=>1000,17836=>1000,17837=>1000, -17838=>1000,17839=>1000,17840=>1000,17841=>1000,17842=>1000,17843=>1000,17844=>1000,17845=>1000,17846=>1000,17847=>1000, -17848=>1000,17849=>1000,17850=>1000,17851=>1000,17852=>1000,17853=>1000,17854=>1000,17855=>1000,17856=>1000,17857=>1000, -17858=>1000,17859=>1000,17860=>1000,17861=>1000,17862=>1000,17863=>1000,17864=>1000,17865=>1000,17866=>1000,17867=>1000, -17868=>1000,17869=>1000,17870=>1000,17871=>1000,17872=>1000,17873=>1000,17874=>1000,17875=>1000,17876=>1000,17877=>1000, -17878=>1000,17879=>1000,17880=>1000,17881=>1000,17882=>1000,17883=>1000,17884=>1000,17885=>1000,17886=>1000,17887=>1000, -17888=>1000,17889=>1000,17890=>1000,17891=>1000,17892=>1000,17893=>1000,17894=>1000,17895=>1000,17896=>1000,17897=>1000, -17898=>1000,17899=>1000,17900=>1000,17901=>1000,17902=>1000,17903=>1000,17904=>1000,17905=>1000,17906=>1000,17907=>1000, -17908=>1000,17909=>1000,17910=>1000,17911=>1000,17912=>1000,17913=>1000,17914=>1000,17915=>1000,17916=>1000,17917=>1000, -17918=>1000,17919=>1000,17920=>1000,17921=>1000,17922=>1000,17923=>1000,17924=>1000,17925=>1000,17926=>1000,17927=>1000, -17928=>1000,17929=>1000,17930=>1000,17931=>1000,17932=>1000,17933=>1000,17934=>1000,17935=>1000,17936=>1000,17937=>1000, -17938=>1000,17939=>1000,17940=>1000,17941=>1000,17942=>1000,17943=>1000,17944=>1000,17945=>1000,17946=>1000,17947=>1000, -17948=>1000,17949=>1000,17950=>1000,17951=>1000,17952=>1000,17953=>1000,17954=>1000,17955=>1000,17956=>1000,17957=>1000, -17958=>1000,17959=>1000,17960=>1000,17961=>1000,17962=>1000,17963=>1000,17964=>1000,17965=>1000,17966=>1000,17967=>1000, -17968=>1000,17969=>1000,17970=>1000,17971=>1000,17972=>1000,17973=>1000,17974=>1000,17975=>1000,17976=>1000,17977=>1000, -17978=>1000,17979=>1000,17980=>1000,17981=>1000,17982=>1000,17983=>1000,17984=>1000,17985=>1000,17986=>1000,17987=>1000, -17988=>1000,17989=>1000,17990=>1000,17991=>1000,17992=>1000,17993=>1000,17994=>1000,17995=>1000,17996=>1000,17997=>1000, -17998=>1000,17999=>1000,18000=>1000,18001=>1000,18002=>1000,18003=>1000,18004=>1000,18005=>1000,18006=>1000,18007=>1000, -18008=>1000,18009=>1000,18010=>1000,18011=>1000,18012=>1000,18013=>1000,18014=>1000,18015=>1000,18016=>1000,18017=>1000, -18018=>1000,18019=>1000,18020=>1000,18021=>1000,18022=>1000,18023=>1000,18024=>1000,18025=>1000,18026=>1000,18027=>1000, -18028=>1000,18029=>1000,18030=>1000,18031=>1000,18032=>1000,18033=>1000,18034=>1000,18035=>1000,18036=>1000,18037=>1000, -18038=>1000,18039=>1000,18040=>1000,18041=>1000,18042=>1000,18043=>1000,18044=>1000,18045=>1000,18046=>1000,18047=>1000, -18048=>1000,18049=>1000,18050=>1000,18051=>1000,18052=>1000,18053=>1000,18054=>1000,18055=>1000,18056=>1000,18057=>1000, -18058=>1000,18059=>1000,18060=>1000,18061=>1000,18062=>1000,18063=>1000,18064=>1000,18065=>1000,18066=>1000,18067=>1000, -18068=>1000,18069=>1000,18070=>1000,18071=>1000,18072=>1000,18073=>1000,18074=>1000,18075=>1000,18076=>1000,18077=>1000, -18078=>1000,18079=>1000,18080=>1000,18081=>1000,18082=>1000,18083=>1000,18084=>1000,18085=>1000,18086=>1000,18087=>1000, -18088=>1000,18089=>1000,18090=>1000,18091=>1000,18092=>1000,18093=>1000,18094=>1000,18095=>1000,18096=>1000,18097=>1000, -18098=>1000,18099=>1000,18100=>1000,18101=>1000,18102=>1000,18103=>1000,18104=>1000,18105=>1000,18106=>1000,18107=>1000, -18108=>1000,18109=>1000,18110=>1000,18111=>1000,18112=>1000,18113=>1000,18114=>1000,18115=>1000,18116=>1000,18117=>1000, -18118=>1000,18119=>1000,18120=>1000,18121=>1000,18122=>1000,18123=>1000,18124=>1000,18125=>1000,18126=>1000,18127=>1000, -18128=>1000,18129=>1000,18130=>1000,18131=>1000,18132=>1000,18133=>1000,18134=>1000,18135=>1000,18136=>1000,18137=>1000, -18138=>1000,18139=>1000,18140=>1000,18141=>1000,18142=>1000,18143=>1000,18144=>1000,18145=>1000,18146=>1000,18147=>1000, -18148=>1000,18149=>1000,18150=>1000,18151=>1000,18152=>1000,18153=>1000,18154=>1000,18155=>1000,18156=>1000,18157=>1000, -18158=>1000,18159=>1000,18160=>1000,18161=>1000,18162=>1000,18163=>1000,18164=>1000,18165=>1000,18166=>1000,18167=>1000, -18168=>1000,18169=>1000,18170=>1000,18171=>1000,18172=>1000,18173=>1000,18174=>1000,18175=>1000,18176=>1000,18177=>1000, -18178=>1000,18179=>1000,18180=>1000,18181=>1000,18182=>1000,18183=>1000,18184=>1000,18185=>1000,18186=>1000,18187=>1000, -18188=>1000,18189=>1000,18190=>1000,18191=>1000,18192=>1000,18193=>1000,18194=>1000,18195=>1000,18196=>1000,18197=>1000, -18198=>1000,18199=>1000,18200=>1000,18201=>1000,18202=>1000,18203=>1000,18204=>1000,18205=>1000,18206=>1000,18207=>1000, -18208=>1000,18209=>1000,18210=>1000,18211=>1000,18212=>1000,18213=>1000,18214=>1000,18215=>1000,18216=>1000,18217=>1000, -18218=>1000,18219=>1000,18220=>1000,18221=>1000,18222=>1000,18223=>1000,18224=>1000,18225=>1000,18226=>1000,18227=>1000, -18228=>1000,18229=>1000,18230=>1000,18231=>1000,18232=>1000,18233=>1000,18234=>1000,18235=>1000,18236=>1000,18237=>1000, -18238=>1000,18239=>1000,18240=>1000,18241=>1000,18242=>1000,18243=>1000,18244=>1000,18245=>1000,18246=>1000,18247=>1000, -18248=>1000,18249=>1000,18250=>1000,18251=>1000,18252=>1000,18253=>1000,18254=>1000,18255=>1000,18256=>1000,18257=>1000, -18258=>1000,18259=>1000,18260=>1000,18261=>1000,18262=>1000,18263=>1000,18264=>1000,18265=>1000,18266=>1000,18267=>1000, -18268=>1000,18269=>1000,18270=>1000,18271=>1000,18272=>1000,18273=>1000,18274=>1000,18275=>1000,18276=>1000,18277=>1000, -18278=>1000,18279=>1000,18280=>1000,18281=>1000,18282=>1000,18283=>1000,18284=>1000,18285=>1000,18286=>1000,18287=>1000, -18288=>1000,18289=>1000,18290=>1000,18291=>1000,18292=>1000,18293=>1000,18294=>1000,18295=>1000,18296=>1000,18297=>1000, -18298=>1000,18299=>1000,18300=>1000,18301=>1000,18302=>1000,18303=>1000,18304=>1000,18305=>1000,18306=>1000,18307=>1000, -18308=>1000,18309=>1000,18310=>1000,18311=>1000,18312=>1000,18313=>1000,18314=>1000,18315=>1000,18316=>1000,18317=>1000, -18318=>1000,18319=>1000,18320=>1000,18321=>1000,18322=>1000,18323=>1000,18324=>1000,18325=>1000,18326=>1000,18327=>1000, -18328=>1000,18329=>1000,18330=>1000,18331=>1000,18332=>1000,18333=>1000,18334=>1000,18335=>1000,18336=>1000,18337=>1000, -18338=>1000,18339=>1000,18340=>1000,18341=>1000,18342=>1000,18343=>1000,18344=>1000,18345=>1000,18346=>1000,18347=>1000, -18348=>1000,18349=>1000,18350=>1000,18351=>1000,18352=>1000,18353=>1000,18354=>1000,18355=>1000,18356=>1000,18357=>1000, -18358=>1000,18359=>1000,18360=>1000,18361=>1000,18362=>1000,18363=>1000,18364=>1000,18365=>1000,18366=>1000,18367=>1000, -18368=>1000,18369=>1000,18370=>1000,18371=>1000,18372=>1000,18373=>1000,18374=>1000,18375=>1000,18376=>1000,18377=>1000, -18378=>1000,18379=>1000,18380=>1000,18381=>1000,18382=>1000,18383=>1000,18384=>1000,18385=>1000,18386=>1000,18387=>1000, -18388=>1000,18389=>1000,18390=>1000,18391=>1000,18392=>1000,18393=>1000,18394=>1000,18395=>1000,18396=>1000,18397=>1000, -18398=>1000,18399=>1000,18400=>1000,18401=>1000,18402=>1000,18403=>1000,18404=>1000,18405=>1000,18406=>1000,18407=>1000, -18408=>1000,18409=>1000,18410=>1000,18411=>1000,18412=>1000,18413=>1000,18414=>1000,18415=>1000,18416=>1000,18417=>1000, -18418=>1000,18419=>1000,18420=>1000,18421=>1000,18422=>1000,18423=>1000,18424=>1000,18425=>1000,18426=>1000,18427=>1000, -18428=>1000,18429=>1000,18430=>1000,18431=>1000,18432=>1000,18433=>1000,18434=>1000,18435=>1000,18436=>1000,18437=>1000, -18438=>1000,18439=>1000,18440=>1000,18441=>1000,18442=>1000,18443=>1000,18444=>1000,18445=>1000,18446=>1000,18447=>1000, -18448=>1000,18449=>1000,18450=>1000,18451=>1000,18452=>1000,18453=>1000,18454=>1000,18455=>1000,18456=>1000,18457=>1000, -18458=>1000,18459=>1000,18460=>1000,18461=>1000,18462=>1000,18463=>1000,18464=>1000,18465=>1000,18466=>1000,18467=>1000, -18468=>1000,18469=>1000,18470=>1000,18471=>1000,18472=>1000,18473=>1000,18474=>1000,18475=>1000,18476=>1000,18477=>1000, -18478=>1000,18479=>1000,18480=>1000,18481=>1000,18482=>1000,18483=>1000,18484=>1000,18485=>1000,18486=>1000,18487=>1000, -18488=>1000,18489=>1000,18490=>1000,18491=>1000,18492=>1000,18493=>1000,18494=>1000,18495=>1000,18496=>1000,18497=>1000, -18498=>1000,18499=>1000,18500=>1000,18501=>1000,18502=>1000,18503=>1000,18504=>1000,18505=>1000,18506=>1000,18507=>1000, -18508=>1000,18509=>1000,18510=>1000,18511=>1000,18512=>1000,18513=>1000,18514=>1000,18515=>1000,18516=>1000,18517=>1000, -18518=>1000,18519=>1000,18520=>1000,18521=>1000,18522=>1000,18523=>1000,18524=>1000,18525=>1000,18526=>1000,18527=>1000, -18528=>1000,18529=>1000,18530=>1000,18531=>1000,18532=>1000,18533=>1000,18534=>1000,18535=>1000,18536=>1000,18537=>1000, -18538=>1000,18539=>1000,18540=>1000,18541=>1000,18542=>1000,18543=>1000,18544=>1000,18545=>1000,18546=>1000,18547=>1000, -18548=>1000,18549=>1000,18550=>1000,18551=>1000,18552=>1000,18553=>1000,18554=>1000,18555=>1000,18556=>1000,18557=>1000, -18558=>1000,18559=>1000,18560=>1000,18561=>1000,18562=>1000,18563=>1000,18564=>1000,18565=>1000,18566=>1000,18567=>1000, -18568=>1000,18569=>1000,18570=>1000,18571=>1000,18572=>1000,18573=>1000,18574=>1000,18575=>1000,18576=>1000,18577=>1000, -18578=>1000,18579=>1000,18580=>1000,18581=>1000,18582=>1000,18583=>1000,18584=>1000,18585=>1000,18586=>1000,18587=>1000, -18588=>1000,18589=>1000,18590=>1000,18591=>1000,18592=>1000,18593=>1000,18594=>1000,18595=>1000,18596=>1000,18597=>1000, -18598=>1000,18599=>1000,18600=>1000,18601=>1000,18602=>1000,18603=>1000,18604=>1000,18605=>1000,18606=>1000,18607=>1000, -18608=>1000,18609=>1000,18610=>1000,18611=>1000,18612=>1000,18613=>1000,18614=>1000,18615=>1000,18616=>1000,18617=>1000, -18618=>1000,18619=>1000,18620=>1000,18621=>1000,18622=>1000,18623=>1000,18624=>1000,18625=>1000,18626=>1000,18627=>1000, -18628=>1000,18629=>1000,18630=>1000,18631=>1000,18632=>1000,18633=>1000,18634=>1000,18635=>1000,18636=>1000,18637=>1000, -18638=>1000,18639=>1000,18640=>1000,18641=>1000,18642=>1000,18643=>1000,18644=>1000,18645=>1000,18646=>1000,18647=>1000, -18648=>1000,18649=>1000,18650=>1000,18651=>1000,18652=>1000,18653=>1000,18654=>1000,18655=>1000,18656=>1000,18657=>1000, -18658=>1000,18659=>1000,18660=>1000,18661=>1000,18662=>1000,18663=>1000,18664=>1000,18665=>1000,18666=>1000,18667=>1000, -18668=>1000,18669=>1000,18670=>1000,18671=>1000,18672=>1000,18673=>1000,18674=>1000,18675=>1000,18676=>1000,18677=>1000, -18678=>1000,18679=>1000,18680=>1000,18681=>1000,18682=>1000,18683=>1000,18684=>1000,18685=>1000,18686=>1000,18687=>1000, -18688=>1000,18689=>1000,18690=>1000,18691=>1000,18692=>1000,18693=>1000,18694=>1000,18695=>1000,18696=>1000,18697=>1000, -18698=>1000,18699=>1000,18700=>1000,18701=>1000,18702=>1000,18703=>1000,18704=>1000,18705=>1000,18706=>1000,18707=>1000, -18708=>1000,18709=>1000,18710=>1000,18711=>1000,18712=>1000,18713=>1000,18714=>1000,18715=>1000,18716=>1000,18717=>1000, -18718=>1000,18719=>1000,18720=>1000,18721=>1000,18722=>1000,18723=>1000,18724=>1000,18725=>1000,18726=>1000,18727=>1000, -18728=>1000,18729=>1000,18730=>1000,18731=>1000,18732=>1000,18733=>1000,18734=>1000,18735=>1000,18736=>1000,18737=>1000, -18738=>1000,18739=>1000,18740=>1000,18741=>1000,18742=>1000,18743=>1000,18744=>1000,18745=>1000,18746=>1000,18747=>1000, -18748=>1000,18749=>1000,18750=>1000,18751=>1000,18752=>1000,18753=>1000,18754=>1000,18755=>1000,18756=>1000,18757=>1000, -18758=>1000,18759=>1000,18760=>1000,18761=>1000,18762=>1000,18763=>1000,18764=>1000,18765=>1000,18766=>1000,18767=>1000, -18768=>1000,18769=>1000,18770=>1000,18771=>1000,18772=>1000,18773=>1000,18774=>1000,18775=>1000,18776=>1000,18777=>1000, -18778=>1000,18779=>1000,18780=>1000,18781=>1000,18782=>1000,18783=>1000,18784=>1000,18785=>1000,18786=>1000,18787=>1000, -18788=>1000,18789=>1000,18790=>1000,18791=>1000,18792=>1000,18793=>1000,18794=>1000,18795=>1000,18796=>1000,18797=>1000, -18798=>1000,18799=>1000,18800=>1000,18801=>1000,18802=>1000,18803=>1000,18804=>1000,18805=>1000,18806=>1000,18807=>1000, -18808=>1000,18809=>1000,18810=>1000,18811=>1000,18812=>1000,18813=>1000,18814=>1000,18815=>1000,18816=>1000,18817=>1000, -18818=>1000,18819=>1000,18820=>1000,18821=>1000,18822=>1000,18823=>1000,18824=>1000,18825=>1000,18826=>1000,18827=>1000, -18828=>1000,18829=>1000,18830=>1000,18831=>1000,18832=>1000,18833=>1000,18834=>1000,18835=>1000,18836=>1000,18837=>1000, -18838=>1000,18839=>1000,18840=>1000,18841=>1000,18842=>1000,18843=>1000,18844=>1000,18845=>1000,18846=>1000,18847=>1000, -18848=>1000,18849=>1000,18850=>1000,18851=>1000,18852=>1000,18853=>1000,18854=>1000,18855=>1000,18856=>1000,18857=>1000, -18858=>1000,18859=>1000,18860=>1000,18861=>1000,18862=>1000,18863=>1000,18864=>1000,18865=>1000,18866=>1000,18867=>1000, -18868=>1000,18869=>1000,18870=>1000,18871=>1000,18872=>1000,18873=>1000,18874=>1000,18875=>1000,18876=>1000,18877=>1000, -18878=>1000,18879=>1000,18880=>1000,18881=>1000,18882=>1000,18883=>1000,18884=>1000,18885=>1000,18886=>1000,18887=>1000, -18888=>1000,18889=>1000,18890=>1000,18891=>1000,18892=>1000,18893=>1000,18894=>1000,18895=>1000,18896=>1000,18897=>1000, -18898=>1000,18899=>1000,18900=>1000,18901=>1000,18902=>1000,18903=>1000,18904=>1000,18905=>1000,18906=>1000,18907=>1000, -18908=>1000,18909=>1000,18910=>1000,18911=>1000,18912=>1000,18913=>1000,18914=>1000,18915=>1000,18916=>1000,18917=>1000, -18918=>1000,18919=>1000,18920=>1000,18921=>1000,18922=>1000,18923=>1000,18924=>1000,18925=>1000,18926=>1000,18927=>1000, -18928=>1000,18929=>1000,18930=>1000,18931=>1000,18932=>1000,18933=>1000,18934=>1000,18935=>1000,18936=>1000,18937=>1000, -18938=>1000,18939=>1000,18940=>1000,18941=>1000,18942=>1000,18943=>1000,18944=>1000,18945=>1000,18946=>1000,18947=>1000, -18948=>1000,18949=>1000,18950=>1000,18951=>1000,18952=>1000,18953=>1000,18954=>1000,18955=>1000,18956=>1000,18957=>1000, -18958=>1000,18959=>1000,18960=>1000,18961=>1000,18962=>1000,18963=>1000,18964=>1000,18965=>1000,18966=>1000,18967=>1000, -18968=>1000,18969=>1000,18970=>1000,18971=>1000,18972=>1000,18973=>1000,18974=>1000,18975=>1000,18976=>1000,18977=>1000, -18978=>1000,18979=>1000,18980=>1000,18981=>1000,18982=>1000,18983=>1000,18984=>1000,18985=>1000,18986=>1000,18987=>1000, -18988=>1000,18989=>1000,18990=>1000,18991=>1000,18992=>1000,18993=>1000,18994=>1000,18995=>1000,18996=>1000,18997=>1000, -18998=>1000,18999=>1000,19000=>1000,19001=>1000,19002=>1000,19003=>1000,19004=>1000,19005=>1000,19006=>1000,19007=>1000, -19008=>1000,19009=>1000,19010=>1000,19011=>1000,19012=>1000,19013=>1000,19014=>1000,19015=>1000,19016=>1000,19017=>1000, -19018=>1000,19019=>1000,19020=>1000,19021=>1000,19022=>1000,19023=>1000,19024=>1000,19025=>1000,19026=>1000,19027=>1000, -19028=>1000,19029=>1000,19030=>1000,19031=>1000,19032=>1000,19033=>1000,19034=>1000,19035=>1000,19036=>1000,19037=>1000, -19038=>1000,19039=>1000,19040=>1000,19041=>1000,19042=>1000,19043=>1000,19044=>1000,19045=>1000,19046=>1000,19047=>1000, -19048=>1000,19049=>1000,19050=>1000,19051=>1000,19052=>1000,19053=>1000,19054=>1000,19055=>1000,19056=>1000,19057=>1000, -19058=>1000,19059=>1000,19060=>1000,19061=>1000,19062=>1000,19063=>1000,19064=>1000,19065=>1000,19066=>1000,19067=>1000, -19068=>1000,19069=>1000,19070=>1000,19071=>1000,19072=>1000,19073=>1000,19074=>1000,19075=>1000,19076=>1000,19077=>1000, -19078=>1000,19079=>1000,19080=>1000,19081=>1000,19082=>1000,19083=>1000,19084=>1000,19085=>1000,19086=>1000,19087=>1000, -19088=>1000,19089=>1000,19090=>1000,19091=>1000,19092=>1000,19093=>1000,19094=>1000,19095=>1000,19096=>1000,19097=>1000, -19098=>1000,19099=>1000,19100=>1000,19101=>1000,19102=>1000,19103=>1000,19104=>1000,19105=>1000,19106=>1000,19107=>1000, -19108=>1000,19109=>1000,19110=>1000,19111=>1000,19112=>1000,19113=>1000,19114=>1000,19115=>1000,19116=>1000,19117=>1000, -19118=>1000,19119=>1000,19120=>1000,19121=>1000,19122=>1000,19123=>1000,19124=>1000,19125=>1000,19126=>1000,19127=>1000, -19128=>1000,19129=>1000,19130=>1000,19131=>1000,19132=>1000,19133=>1000,19134=>1000,19135=>1000,19136=>1000,19137=>1000, -19138=>1000,19139=>1000,19140=>1000,19141=>1000,19142=>1000,19143=>1000,19144=>1000,19145=>1000,19146=>1000,19147=>1000, -19148=>1000,19149=>1000,19150=>1000,19151=>1000,19152=>1000,19153=>1000,19154=>1000,19155=>1000,19156=>1000,19157=>1000, -19158=>1000,19159=>1000,19160=>1000,19161=>1000,19162=>1000,19163=>1000,19164=>1000,19165=>1000,19166=>1000,19167=>1000, -19168=>1000,19169=>1000,19170=>1000,19171=>1000,19172=>1000,19173=>1000,19174=>1000,19175=>1000,19176=>1000,19177=>1000, -19178=>1000,19179=>1000,19180=>1000,19181=>1000,19182=>1000,19183=>1000,19184=>1000,19185=>1000,19186=>1000,19187=>1000, -19188=>1000,19189=>1000,19190=>1000,19191=>1000,19192=>1000,19193=>1000,19194=>1000,19195=>1000,19196=>1000,19197=>1000, -19198=>1000,19199=>1000,19200=>1000,19201=>1000,19202=>1000,19203=>1000,19204=>1000,19205=>1000,19206=>1000,19207=>1000, -19208=>1000,19209=>1000,19210=>1000,19211=>1000,19212=>1000,19213=>1000,19214=>1000,19215=>1000,19216=>1000,19217=>1000, -19218=>1000,19219=>1000,19220=>1000,19221=>1000,19222=>1000,19223=>1000,19224=>1000,19225=>1000,19226=>1000,19227=>1000, -19228=>1000,19229=>1000,19230=>1000,19231=>1000,19232=>1000,19233=>1000,19234=>1000,19235=>1000,19236=>1000,19237=>1000, -19238=>1000,19239=>1000,19240=>1000,19241=>1000,19242=>1000,19243=>1000,19244=>1000,19245=>1000,19246=>1000,19247=>1000, -19248=>1000,19249=>1000,19250=>1000,19251=>1000,19252=>1000,19253=>1000,19254=>1000,19255=>1000,19256=>1000,19257=>1000, -19258=>1000,19259=>1000,19260=>1000,19261=>1000,19262=>1000,19263=>1000,19264=>1000,19265=>1000,19266=>1000,19267=>1000, -19268=>1000,19269=>1000,19270=>1000,19271=>1000,19272=>1000,19273=>1000,19274=>1000,19275=>1000,19276=>1000,19277=>1000, -19278=>1000,19279=>1000,19280=>1000,19281=>1000,19282=>1000,19283=>1000,19284=>1000,19285=>1000,19286=>1000,19287=>1000, -19288=>1000,19289=>1000,19290=>1000,19291=>1000,19292=>1000,19293=>1000,19294=>1000,19295=>1000,19296=>1000,19297=>1000, -19298=>1000,19299=>1000,19300=>1000,19301=>1000,19302=>1000,19303=>1000,19304=>1000,19305=>1000,19306=>1000,19307=>1000, -19308=>1000,19309=>1000,19310=>1000,19311=>1000,19312=>1000,19313=>1000,19314=>1000,19315=>1000,19316=>1000,19317=>1000, -19318=>1000,19319=>1000,19320=>1000,19321=>1000,19322=>1000,19323=>1000,19324=>1000,19325=>1000,19326=>1000,19327=>1000, -19328=>1000,19329=>1000,19330=>1000,19331=>1000,19332=>1000,19333=>1000,19334=>1000,19335=>1000,19336=>1000,19337=>1000, -19338=>1000,19339=>1000,19340=>1000,19341=>1000,19342=>1000,19343=>1000,19344=>1000,19345=>1000,19346=>1000,19347=>1000, -19348=>1000,19349=>1000,19350=>1000,19351=>1000,19352=>1000,19353=>1000,19354=>1000,19355=>1000,19356=>1000,19357=>1000, -19358=>1000,19359=>1000,19360=>1000,19361=>1000,19362=>1000,19363=>1000,19364=>1000,19365=>1000,19366=>1000,19367=>1000, -19368=>1000,19369=>1000,19370=>1000,19371=>1000,19372=>1000,19373=>1000,19374=>1000,19375=>1000,19376=>1000,19377=>1000, -19378=>1000,19379=>1000,19380=>1000,19381=>1000,19382=>1000,19383=>1000,19384=>1000,19385=>1000,19386=>1000,19387=>1000, -19388=>1000,19389=>1000,19390=>1000,19391=>1000,19392=>1000,19393=>1000,19394=>1000,19395=>1000,19396=>1000,19397=>1000, -19398=>1000,19399=>1000,19400=>1000,19401=>1000,19402=>1000,19403=>1000,19404=>1000,19405=>1000,19406=>1000,19407=>1000, -19408=>1000,19409=>1000,19410=>1000,19411=>1000,19412=>1000,19413=>1000,19414=>1000,19415=>1000,19416=>1000,19417=>1000, -19418=>1000,19419=>1000,19420=>1000,19421=>1000,19422=>1000,19423=>1000,19424=>1000,19425=>1000,19426=>1000,19427=>1000, -19428=>1000,19429=>1000,19430=>1000,19431=>1000,19432=>1000,19433=>1000,19434=>1000,19435=>1000,19436=>1000,19437=>1000, -19438=>1000,19439=>1000,19440=>1000,19441=>1000,19442=>1000,19443=>1000,19444=>1000,19445=>1000,19446=>1000,19447=>1000, -19448=>1000,19449=>1000,19450=>1000,19451=>1000,19452=>1000,19453=>1000,19454=>1000,19455=>1000,19456=>1000,19457=>1000, -19458=>1000,19459=>1000,19460=>1000,19461=>1000,19462=>1000,19463=>1000,19464=>1000,19465=>1000,19466=>1000,19467=>1000, -19468=>1000,19469=>1000,19470=>1000,19471=>1000,19472=>1000,19473=>1000,19474=>1000,19475=>1000,19476=>1000,19477=>1000, -19478=>1000,19479=>1000,19480=>1000,19481=>1000,19482=>1000,19483=>1000,19484=>1000,19485=>1000,19486=>1000,19487=>1000, -19488=>1000,19489=>1000,19490=>1000,19491=>1000,19492=>1000,19493=>1000,19494=>1000,19495=>1000,19496=>1000,19497=>1000, -19498=>1000,19499=>1000,19500=>1000,19501=>1000,19502=>1000,19503=>1000,19504=>1000,19505=>1000,19506=>1000,19507=>1000, -19508=>1000,19509=>1000,19510=>1000,19511=>1000,19512=>1000,19513=>1000,19514=>1000,19515=>1000,19516=>1000,19517=>1000, -19518=>1000,19519=>1000,19520=>1000,19521=>1000,19522=>1000,19523=>1000,19524=>1000,19525=>1000,19526=>1000,19527=>1000, -19528=>1000,19529=>1000,19530=>1000,19531=>1000,19532=>1000,19533=>1000,19534=>1000,19535=>1000,19536=>1000,19537=>1000, -19538=>1000,19539=>1000,19540=>1000,19541=>1000,19542=>1000,19543=>1000,19544=>1000,19545=>1000,19546=>1000,19547=>1000, -19548=>1000,19549=>1000,19550=>1000,19551=>1000,19552=>1000,19553=>1000,19554=>1000,19555=>1000,19556=>1000,19557=>1000, -19558=>1000,19559=>1000,19560=>1000,19561=>1000,19562=>1000,19563=>1000,19564=>1000,19565=>1000,19566=>1000,19567=>1000, -19568=>1000,19569=>1000,19570=>1000,19571=>1000,19572=>1000,19573=>1000,19574=>1000,19575=>1000,19576=>1000,19577=>1000, -19578=>1000,19579=>1000,19580=>1000,19581=>1000,19582=>1000,19583=>1000,19584=>1000,19585=>1000,19586=>1000,19587=>1000, -19588=>1000,19589=>1000,19590=>1000,19591=>1000,19592=>1000,19593=>1000,19594=>1000,19595=>1000,19596=>1000,19597=>1000, -19598=>1000,19599=>1000,19600=>1000,19601=>1000,19602=>1000,19603=>1000,19604=>1000,19605=>1000,19606=>1000,19607=>1000, -19608=>1000,19609=>1000,19610=>1000,19611=>1000,19612=>1000,19613=>1000,19614=>1000,19615=>1000,19616=>1000,19617=>1000, -19618=>1000,19619=>1000,19620=>1000,19621=>1000,19622=>1000,19623=>1000,19624=>1000,19625=>1000,19626=>1000,19627=>1000, -19628=>1000,19629=>1000,19630=>1000,19631=>1000,19632=>1000,19633=>1000,19634=>1000,19635=>1000,19636=>1000,19637=>1000, -19638=>1000,19639=>1000,19640=>1000,19641=>1000,19642=>1000,19643=>1000,19644=>1000,19645=>1000,19646=>1000,19647=>1000, -19648=>1000,19649=>1000,19650=>1000,19651=>1000,19652=>1000,19653=>1000,19654=>1000,19655=>1000,19656=>1000,19657=>1000, -19658=>1000,19659=>1000,19660=>1000,19661=>1000,19662=>1000,19663=>1000,19664=>1000,19665=>1000,19666=>1000,19667=>1000, -19668=>1000,19669=>1000,19670=>1000,19671=>1000,19672=>1000,19673=>1000,19674=>1000,19675=>1000,19676=>1000,19677=>1000, -19678=>1000,19679=>1000,19680=>1000,19681=>1000,19682=>1000,19683=>1000,19684=>1000,19685=>1000,19686=>1000,19687=>1000, -19688=>1000,19689=>1000,19690=>1000,19691=>1000,19692=>1000,19693=>1000,19694=>1000,19695=>1000,19696=>1000,19697=>1000, -19698=>1000,19699=>1000,19700=>1000,19701=>1000,19702=>1000,19703=>1000,19704=>1000,19705=>1000,19706=>1000,19707=>1000, -19708=>1000,19709=>1000,19710=>1000,19711=>1000,19712=>1000,19713=>1000,19714=>1000,19715=>1000,19716=>1000,19717=>1000, -19718=>1000,19719=>1000,19720=>1000,19721=>1000,19722=>1000,19723=>1000,19724=>1000,19725=>1000,19726=>1000,19727=>1000, -19728=>1000,19729=>1000,19730=>1000,19731=>1000,19732=>1000,19733=>1000,19734=>1000,19735=>1000,19736=>1000,19737=>1000, -19738=>1000,19739=>1000,19740=>1000,19741=>1000,19742=>1000,19743=>1000,19744=>1000,19745=>1000,19746=>1000,19747=>1000, -19748=>1000,19749=>1000,19750=>1000,19751=>1000,19752=>1000,19753=>1000,19754=>1000,19755=>1000,19756=>1000,19757=>1000, -19758=>1000,19759=>1000,19760=>1000,19761=>1000,19762=>1000,19763=>1000,19764=>1000,19765=>1000,19766=>1000,19767=>1000, -19768=>1000,19769=>1000,19770=>1000,19771=>1000,19772=>1000,19773=>1000,19774=>1000,19775=>1000,19776=>1000,19777=>1000, -19778=>1000,19779=>1000,19780=>1000,19781=>1000,19782=>1000,19783=>1000,19784=>1000,19785=>1000,19786=>1000,19787=>1000, -19788=>1000,19789=>1000,19790=>1000,19791=>1000,19792=>1000,19793=>1000,19794=>1000,19795=>1000,19796=>1000,19797=>1000, -19798=>1000,19799=>1000,19800=>1000,19801=>1000,19802=>1000,19803=>1000,19804=>1000,19805=>1000,19806=>1000,19807=>1000, -19808=>1000,19809=>1000,19810=>1000,19811=>1000,19812=>1000,19813=>1000,19814=>1000,19815=>1000,19816=>1000,19817=>1000, -19818=>1000,19819=>1000,19820=>1000,19821=>1000,19822=>1000,19823=>1000,19824=>1000,19825=>1000,19826=>1000,19827=>1000, -19828=>1000,19829=>1000,19830=>1000,19831=>1000,19832=>1000,19833=>1000,19834=>1000,19835=>1000,19836=>1000,19837=>1000, -19838=>1000,19839=>1000,19840=>1000,19841=>1000,19842=>1000,19843=>1000,19844=>1000,19845=>1000,19846=>1000,19847=>1000, -19848=>1000,19849=>1000,19850=>1000,19851=>1000,19852=>1000,19853=>1000,19854=>1000,19855=>1000,19856=>1000,19857=>1000, -19858=>1000,19859=>1000,19860=>1000,19861=>1000,19862=>1000,19863=>1000,19864=>1000,19865=>1000,19866=>1000,19867=>1000, -19868=>1000,19869=>1000,19870=>1000,19871=>1000,19872=>1000,19873=>1000,19874=>1000,19875=>1000,19876=>1000,19877=>1000, -19878=>1000,19879=>1000,19880=>1000,19881=>1000,19882=>1000,19883=>1000,19884=>1000,19885=>1000,19886=>1000,19887=>1000, -19888=>1000,19889=>1000,19890=>1000,19891=>1000,19892=>1000,19893=>1000,19894=>500,19895=>500,19896=>500,19897=>500, -19898=>500,19899=>500,19900=>500,19901=>500,19902=>500,19903=>500,19904=>1000,19905=>1000,19906=>1000,19907=>1000, -19908=>1000,19909=>1000,19910=>1000,19911=>1000,19912=>1000,19913=>1000,19914=>1000,19915=>1000,19916=>1000,19917=>1000, -19918=>1000,19919=>1000,19920=>1000,19921=>1000,19922=>1000,19923=>1000,19924=>1000,19925=>1000,19926=>1000,19927=>1000, -19928=>1000,19929=>1000,19930=>1000,19931=>1000,19932=>1000,19933=>1000,19934=>1000,19935=>1000,19936=>1000,19937=>1000, -19938=>1000,19939=>1000,19940=>1000,19941=>1000,19942=>1000,19943=>1000,19944=>1000,19945=>1000,19946=>1000,19947=>1000, -19948=>1000,19949=>1000,19950=>1000,19951=>1000,19952=>1000,19953=>1000,19954=>1000,19955=>1000,19956=>1000,19957=>1000, -19958=>1000,19959=>1000,19960=>1000,19961=>1000,19962=>1000,19963=>1000,19964=>1000,19965=>1000,19966=>1000,19967=>1000, -19968=>1000,19969=>1000,19970=>1000,19971=>1000,19972=>1000,19973=>1000,19974=>1000,19975=>1000,19976=>1000,19977=>1000, -19978=>1000,19979=>1000,19980=>1000,19981=>1000,19982=>1000,19983=>1000,19984=>1000,19985=>1000,19986=>1000,19987=>1000, -19988=>1000,19989=>1000,19990=>1000,19991=>1000,19992=>1000,19993=>1000,19994=>1000,19995=>1000,19996=>1000,19997=>1000, -19998=>1000,19999=>1000,20000=>1000,20001=>1000,20002=>1000,20003=>1000,20004=>1000,20005=>1000,20006=>1000,20007=>1000, -20008=>1000,20009=>1000,20010=>1000,20011=>1000,20012=>1000,20013=>1000,20014=>1000,20015=>1000,20016=>1000,20017=>1000, -20018=>1000,20019=>1000,20020=>1000,20021=>1000,20022=>1000,20023=>1000,20024=>1000,20025=>1000,20026=>1000,20027=>1000, -20028=>1000,20029=>1000,20030=>1000,20031=>1000,20032=>1000,20033=>1000,20034=>1000,20035=>1000,20036=>1000,20037=>1000, -20038=>1000,20039=>1000,20040=>1000,20041=>1000,20042=>1000,20043=>1000,20044=>1000,20045=>1000,20046=>1000,20047=>1000, -20048=>1000,20049=>1000,20050=>1000,20051=>1000,20052=>1000,20053=>1000,20054=>1000,20055=>1000,20056=>1000,20057=>1000, -20058=>1000,20059=>1000,20060=>1000,20061=>1000,20062=>1000,20063=>1000,20064=>1000,20065=>1000,20066=>1000,20067=>1000, -20068=>1000,20069=>1000,20070=>1000,20071=>1000,20072=>1000,20073=>1000,20074=>1000,20075=>1000,20076=>1000,20077=>1000, -20078=>1000,20079=>1000,20080=>1000,20081=>1000,20082=>1000,20083=>1000,20084=>1000,20085=>1000,20086=>1000,20087=>1000, -20088=>1000,20089=>1000,20090=>1000,20091=>1000,20092=>1000,20093=>1000,20094=>1000,20095=>1000,20096=>1000,20097=>1000, -20098=>1000,20099=>1000,20100=>1000,20101=>1000,20102=>1000,20103=>1000,20104=>1000,20105=>1000,20106=>1000,20107=>1000, -20108=>1000,20109=>1000,20110=>1000,20111=>1000,20112=>1000,20113=>1000,20114=>1000,20115=>1000,20116=>1000,20117=>1000, -20118=>1000,20119=>1000,20120=>1000,20121=>1000,20122=>1000,20123=>1000,20124=>1000,20125=>1000,20126=>1000,20127=>1000, -20128=>1000,20129=>1000,20130=>1000,20131=>1000,20132=>1000,20133=>1000,20134=>1000,20135=>1000,20136=>1000,20137=>1000, -20138=>1000,20139=>1000,20140=>1000,20141=>1000,20142=>1000,20143=>1000,20144=>1000,20145=>1000,20146=>1000,20147=>1000, -20148=>1000,20149=>1000,20150=>1000,20151=>1000,20152=>1000,20153=>1000,20154=>1000,20155=>1000,20156=>1000,20157=>1000, -20158=>1000,20159=>1000,20160=>1000,20161=>1000,20162=>1000,20163=>1000,20164=>1000,20165=>1000,20166=>1000,20167=>1000, -20168=>1000,20169=>1000,20170=>1000,20171=>1000,20172=>1000,20173=>1000,20174=>1000,20175=>1000,20176=>1000,20177=>1000, -20178=>1000,20179=>1000,20180=>1000,20181=>1000,20182=>1000,20183=>1000,20184=>1000,20185=>1000,20186=>1000,20187=>1000, -20188=>1000,20189=>1000,20190=>1000,20191=>1000,20192=>1000,20193=>1000,20194=>1000,20195=>1000,20196=>1000,20197=>1000, -20198=>1000,20199=>1000,20200=>1000,20201=>1000,20202=>1000,20203=>1000,20204=>1000,20205=>1000,20206=>1000,20207=>1000, -20208=>1000,20209=>1000,20210=>1000,20211=>1000,20212=>1000,20213=>1000,20214=>1000,20215=>1000,20216=>1000,20217=>1000, -20218=>1000,20219=>1000,20220=>1000,20221=>1000,20222=>1000,20223=>1000,20224=>1000,20225=>1000,20226=>1000,20227=>1000, -20228=>1000,20229=>1000,20230=>1000,20231=>1000,20232=>1000,20233=>1000,20234=>1000,20235=>1000,20236=>1000,20237=>1000, -20238=>1000,20239=>1000,20240=>1000,20241=>1000,20242=>1000,20243=>1000,20244=>1000,20245=>1000,20246=>1000,20247=>1000, -20248=>1000,20249=>1000,20250=>1000,20251=>1000,20252=>1000,20253=>1000,20254=>1000,20255=>1000,20256=>1000,20257=>1000, -20258=>1000,20259=>1000,20260=>1000,20261=>1000,20262=>1000,20263=>1000,20264=>1000,20265=>1000,20266=>1000,20267=>1000, -20268=>1000,20269=>1000,20270=>1000,20271=>1000,20272=>1000,20273=>1000,20274=>1000,20275=>1000,20276=>1000,20277=>1000, -20278=>1000,20279=>1000,20280=>1000,20281=>1000,20282=>1000,20283=>1000,20284=>1000,20285=>1000,20286=>1000,20287=>1000, -20288=>1000,20289=>1000,20290=>1000,20291=>1000,20292=>1000,20293=>1000,20294=>1000,20295=>1000,20296=>1000,20297=>1000, -20298=>1000,20299=>1000,20300=>1000,20301=>1000,20302=>1000,20303=>1000,20304=>1000,20305=>1000,20306=>1000,20307=>1000, -20308=>1000,20309=>1000,20310=>1000,20311=>1000,20312=>1000,20313=>1000,20314=>1000,20315=>1000,20316=>1000,20317=>1000, -20318=>1000,20319=>1000,20320=>1000,20321=>1000,20322=>1000,20323=>1000,20324=>1000,20325=>1000,20326=>1000,20327=>1000, -20328=>1000,20329=>1000,20330=>1000,20331=>1000,20332=>1000,20333=>1000,20334=>1000,20335=>1000,20336=>1000,20337=>1000, -20338=>1000,20339=>1000,20340=>1000,20341=>1000,20342=>1000,20343=>1000,20344=>1000,20345=>1000,20346=>1000,20347=>1000, -20348=>1000,20349=>1000,20350=>1000,20351=>1000,20352=>1000,20353=>1000,20354=>1000,20355=>1000,20356=>1000,20357=>1000, -20358=>1000,20359=>1000,20360=>1000,20361=>1000,20362=>1000,20363=>1000,20364=>1000,20365=>1000,20366=>1000,20367=>1000, -20368=>1000,20369=>1000,20370=>1000,20371=>1000,20372=>1000,20373=>1000,20374=>1000,20375=>1000,20376=>1000,20377=>1000, -20378=>1000,20379=>1000,20380=>1000,20381=>1000,20382=>1000,20383=>1000,20384=>1000,20385=>1000,20386=>1000,20387=>1000, -20388=>1000,20389=>1000,20390=>1000,20391=>1000,20392=>1000,20393=>1000,20394=>1000,20395=>1000,20396=>1000,20397=>1000, -20398=>1000,20399=>1000,20400=>1000,20401=>1000,20402=>1000,20403=>1000,20404=>1000,20405=>1000,20406=>1000,20407=>1000, -20408=>1000,20409=>1000,20410=>1000,20411=>1000,20412=>1000,20413=>1000,20414=>1000,20415=>1000,20416=>1000,20417=>1000, -20418=>1000,20419=>1000,20420=>1000,20421=>1000,20422=>1000,20423=>1000,20424=>1000,20425=>1000,20426=>1000,20427=>1000, -20428=>1000,20429=>1000,20430=>1000,20431=>1000,20432=>1000,20433=>1000,20434=>1000,20435=>1000,20436=>1000,20437=>1000, -20438=>1000,20439=>1000,20440=>1000,20441=>1000,20442=>1000,20443=>1000,20444=>1000,20445=>1000,20446=>1000,20447=>1000, -20448=>1000,20449=>1000,20450=>1000,20451=>1000,20452=>1000,20453=>1000,20454=>1000,20455=>1000,20456=>1000,20457=>1000, -20458=>1000,20459=>1000,20460=>1000,20461=>1000,20462=>1000,20463=>1000,20464=>1000,20465=>1000,20466=>1000,20467=>1000, -20468=>1000,20469=>1000,20470=>1000,20471=>1000,20472=>1000,20473=>1000,20474=>1000,20475=>1000,20476=>1000,20477=>1000, -20478=>1000,20479=>1000,20480=>1000,20481=>1000,20482=>1000,20483=>1000,20484=>1000,20485=>1000,20486=>1000,20487=>1000, -20488=>1000,20489=>1000,20490=>1000,20491=>1000,20492=>1000,20493=>1000,20494=>1000,20495=>1000,20496=>1000,20497=>1000, -20498=>1000,20499=>1000,20500=>1000,20501=>1000,20502=>1000,20503=>1000,20504=>1000,20505=>1000,20506=>1000,20507=>1000, -20508=>1000,20509=>1000,20510=>1000,20511=>1000,20512=>1000,20513=>1000,20514=>1000,20515=>1000,20516=>1000,20517=>1000, -20518=>1000,20519=>1000,20520=>1000,20521=>1000,20522=>1000,20523=>1000,20524=>1000,20525=>1000,20526=>1000,20527=>1000, -20528=>1000,20529=>1000,20530=>1000,20531=>1000,20532=>1000,20533=>1000,20534=>1000,20535=>1000,20536=>1000,20537=>1000, -20538=>1000,20539=>1000,20540=>1000,20541=>1000,20542=>1000,20543=>1000,20544=>1000,20545=>1000,20546=>1000,20547=>1000, -20548=>1000,20549=>1000,20550=>1000,20551=>1000,20552=>1000,20553=>1000,20554=>1000,20555=>1000,20556=>1000,20557=>1000, -20558=>1000,20559=>1000,20560=>1000,20561=>1000,20562=>1000,20563=>1000,20564=>1000,20565=>1000,20566=>1000,20567=>1000, -20568=>1000,20569=>1000,20570=>1000,20571=>1000,20572=>1000,20573=>1000,20574=>1000,20575=>1000,20576=>1000,20577=>1000, -20578=>1000,20579=>1000,20580=>1000,20581=>1000,20582=>1000,20583=>1000,20584=>1000,20585=>1000,20586=>1000,20587=>1000, -20588=>1000,20589=>1000,20590=>1000,20591=>1000,20592=>1000,20593=>1000,20594=>1000,20595=>1000,20596=>1000,20597=>1000, -20598=>1000,20599=>1000,20600=>1000,20601=>1000,20602=>1000,20603=>1000,20604=>1000,20605=>1000,20606=>1000,20607=>1000, -20608=>1000,20609=>1000,20610=>1000,20611=>1000,20612=>1000,20613=>1000,20614=>1000,20615=>1000,20616=>1000,20617=>1000, -20618=>1000,20619=>1000,20620=>1000,20621=>1000,20622=>1000,20623=>1000,20624=>1000,20625=>1000,20626=>1000,20627=>1000, -20628=>1000,20629=>1000,20630=>1000,20631=>1000,20632=>1000,20633=>1000,20634=>1000,20635=>1000,20636=>1000,20637=>1000, -20638=>1000,20639=>1000,20640=>1000,20641=>1000,20642=>1000,20643=>1000,20644=>1000,20645=>1000,20646=>1000,20647=>1000, -20648=>1000,20649=>1000,20650=>1000,20651=>1000,20652=>1000,20653=>1000,20654=>1000,20655=>1000,20656=>1000,20657=>1000, -20658=>1000,20659=>1000,20660=>1000,20661=>1000,20662=>1000,20663=>1000,20664=>1000,20665=>1000,20666=>1000,20667=>1000, -20668=>1000,20669=>1000,20670=>1000,20671=>1000,20672=>1000,20673=>1000,20674=>1000,20675=>1000,20676=>1000,20677=>1000, -20678=>1000,20679=>1000,20680=>1000,20681=>1000,20682=>1000,20683=>1000,20684=>1000,20685=>1000,20686=>1000,20687=>1000, -20688=>1000,20689=>1000,20690=>1000,20691=>1000,20692=>1000,20693=>1000,20694=>1000,20695=>1000,20696=>1000,20697=>1000, -20698=>1000,20699=>1000,20700=>1000,20701=>1000,20702=>1000,20703=>1000,20704=>1000,20705=>1000,20706=>1000,20707=>1000, -20708=>1000,20709=>1000,20710=>1000,20711=>1000,20712=>1000,20713=>1000,20714=>1000,20715=>1000,20716=>1000,20717=>1000, -20718=>1000,20719=>1000,20720=>1000,20721=>1000,20722=>1000,20723=>1000,20724=>1000,20725=>1000,20726=>1000,20727=>1000, -20728=>1000,20729=>1000,20730=>1000,20731=>1000,20732=>1000,20733=>1000,20734=>1000,20735=>1000,20736=>1000,20737=>1000, -20738=>1000,20739=>1000,20740=>1000,20741=>1000,20742=>1000,20743=>1000,20744=>1000,20745=>1000,20746=>1000,20747=>1000, -20748=>1000,20749=>1000,20750=>1000,20751=>1000,20752=>1000,20753=>1000,20754=>1000,20755=>1000,20756=>1000,20757=>1000, -20758=>1000,20759=>1000,20760=>1000,20761=>1000,20762=>1000,20763=>1000,20764=>1000,20765=>1000,20766=>1000,20767=>1000, -20768=>1000,20769=>1000,20770=>1000,20771=>1000,20772=>1000,20773=>1000,20774=>1000,20775=>1000,20776=>1000,20777=>1000, -20778=>1000,20779=>1000,20780=>1000,20781=>1000,20782=>1000,20783=>1000,20784=>1000,20785=>1000,20786=>1000,20787=>1000, -20788=>1000,20789=>1000,20790=>1000,20791=>1000,20792=>1000,20793=>1000,20794=>1000,20795=>1000,20796=>1000,20797=>1000, -20798=>1000,20799=>1000,20800=>1000,20801=>1000,20802=>1000,20803=>1000,20804=>1000,20805=>1000,20806=>1000,20807=>1000, -20808=>1000,20809=>1000,20810=>1000,20811=>1000,20812=>1000,20813=>1000,20814=>1000,20815=>1000,20816=>1000,20817=>1000, -20818=>1000,20819=>1000,20820=>1000,20821=>1000,20822=>1000,20823=>1000,20824=>1000,20825=>1000,20826=>1000,20827=>1000, -20828=>1000,20829=>1000,20830=>1000,20831=>1000,20832=>1000,20833=>1000,20834=>1000,20835=>1000,20836=>1000,20837=>1000, -20838=>1000,20839=>1000,20840=>1000,20841=>1000,20842=>1000,20843=>1000,20844=>1000,20845=>1000,20846=>1000,20847=>1000, -20848=>1000,20849=>1000,20850=>1000,20851=>1000,20852=>1000,20853=>1000,20854=>1000,20855=>1000,20856=>1000,20857=>1000, -20858=>1000,20859=>1000,20860=>1000,20861=>1000,20862=>1000,20863=>1000,20864=>1000,20865=>1000,20866=>1000,20867=>1000, -20868=>1000,20869=>1000,20870=>1000,20871=>1000,20872=>1000,20873=>1000,20874=>1000,20875=>1000,20876=>1000,20877=>1000, -20878=>1000,20879=>1000,20880=>1000,20881=>1000,20882=>1000,20883=>1000,20884=>1000,20885=>1000,20886=>1000,20887=>1000, -20888=>1000,20889=>1000,20890=>1000,20891=>1000,20892=>1000,20893=>1000,20894=>1000,20895=>1000,20896=>1000,20897=>1000, -20898=>1000,20899=>1000,20900=>1000,20901=>1000,20902=>1000,20903=>1000,20904=>1000,20905=>1000,20906=>1000,20907=>1000, -20908=>1000,20909=>1000,20910=>1000,20911=>1000,20912=>1000,20913=>1000,20914=>1000,20915=>1000,20916=>1000,20917=>1000, -20918=>1000,20919=>1000,20920=>1000,20921=>1000,20922=>1000,20923=>1000,20924=>1000,20925=>1000,20926=>1000,20927=>1000, -20928=>1000,20929=>1000,20930=>1000,20931=>1000,20932=>1000,20933=>1000,20934=>1000,20935=>1000,20936=>1000,20937=>1000, -20938=>1000,20939=>1000,20940=>1000,20941=>1000,20942=>1000,20943=>1000,20944=>1000,20945=>1000,20946=>1000,20947=>1000, -20948=>1000,20949=>1000,20950=>1000,20951=>1000,20952=>1000,20953=>1000,20954=>1000,20955=>1000,20956=>1000,20957=>1000, -20958=>1000,20959=>1000,20960=>1000,20961=>1000,20962=>1000,20963=>1000,20964=>1000,20965=>1000,20966=>1000,20967=>1000, -20968=>1000,20969=>1000,20970=>1000,20971=>1000,20972=>1000,20973=>1000,20974=>1000,20975=>1000,20976=>1000,20977=>1000, -20978=>1000,20979=>1000,20980=>1000,20981=>1000,20982=>1000,20983=>1000,20984=>1000,20985=>1000,20986=>1000,20987=>1000, -20988=>1000,20989=>1000,20990=>1000,20991=>1000,20992=>1000,20993=>1000,20994=>1000,20995=>1000,20996=>1000,20997=>1000, -20998=>1000,20999=>1000,21000=>1000,21001=>1000,21002=>1000,21003=>1000,21004=>1000,21005=>1000,21006=>1000,21007=>1000, -21008=>1000,21009=>1000,21010=>1000,21011=>1000,21012=>1000,21013=>1000,21014=>1000,21015=>1000,21016=>1000,21017=>1000, -21018=>1000,21019=>1000,21020=>1000,21021=>1000,21022=>1000,21023=>1000,21024=>1000,21025=>1000,21026=>1000,21027=>1000, -21028=>1000,21029=>1000,21030=>1000,21031=>1000,21032=>1000,21033=>1000,21034=>1000,21035=>1000,21036=>1000,21037=>1000, -21038=>1000,21039=>1000,21040=>1000,21041=>1000,21042=>1000,21043=>1000,21044=>1000,21045=>1000,21046=>1000,21047=>1000, -21048=>1000,21049=>1000,21050=>1000,21051=>1000,21052=>1000,21053=>1000,21054=>1000,21055=>1000,21056=>1000,21057=>1000, -21058=>1000,21059=>1000,21060=>1000,21061=>1000,21062=>1000,21063=>1000,21064=>1000,21065=>1000,21066=>1000,21067=>1000, -21068=>1000,21069=>1000,21070=>1000,21071=>1000,21072=>1000,21073=>1000,21074=>1000,21075=>1000,21076=>1000,21077=>1000, -21078=>1000,21079=>1000,21080=>1000,21081=>1000,21082=>1000,21083=>1000,21084=>1000,21085=>1000,21086=>1000,21087=>1000, -21088=>1000,21089=>1000,21090=>1000,21091=>1000,21092=>1000,21093=>1000,21094=>1000,21095=>1000,21096=>1000,21097=>1000, -21098=>1000,21099=>1000,21100=>1000,21101=>1000,21102=>1000,21103=>1000,21104=>1000,21105=>1000,21106=>1000,21107=>1000, -21108=>1000,21109=>1000,21110=>1000,21111=>1000,21112=>1000,21113=>1000,21114=>1000,21115=>1000,21116=>1000,21117=>1000, -21118=>1000,21119=>1000,21120=>1000,21121=>1000,21122=>1000,21123=>1000,21124=>1000,21125=>1000,21126=>1000,21127=>1000, -21128=>1000,21129=>1000,21130=>1000,21131=>1000,21132=>1000,21133=>1000,21134=>1000,21135=>1000,21136=>1000,21137=>1000, -21138=>1000,21139=>1000,21140=>1000,21141=>1000,21142=>1000,21143=>1000,21144=>1000,21145=>1000,21146=>1000,21147=>1000, -21148=>1000,21149=>1000,21150=>1000,21151=>1000,21152=>1000,21153=>1000,21154=>1000,21155=>1000,21156=>1000,21157=>1000, -21158=>1000,21159=>1000,21160=>1000,21161=>1000,21162=>1000,21163=>1000,21164=>1000,21165=>1000,21166=>1000,21167=>1000, -21168=>1000,21169=>1000,21170=>1000,21171=>1000,21172=>1000,21173=>1000,21174=>1000,21175=>1000,21176=>1000,21177=>1000, -21178=>1000,21179=>1000,21180=>1000,21181=>1000,21182=>1000,21183=>1000,21184=>1000,21185=>1000,21186=>1000,21187=>1000, -21188=>1000,21189=>1000,21190=>1000,21191=>1000,21192=>1000,21193=>1000,21194=>1000,21195=>1000,21196=>1000,21197=>1000, -21198=>1000,21199=>1000,21200=>1000,21201=>1000,21202=>1000,21203=>1000,21204=>1000,21205=>1000,21206=>1000,21207=>1000, -21208=>1000,21209=>1000,21210=>1000,21211=>1000,21212=>1000,21213=>1000,21214=>1000,21215=>1000,21216=>1000,21217=>1000, -21218=>1000,21219=>1000,21220=>1000,21221=>1000,21222=>1000,21223=>1000,21224=>1000,21225=>1000,21226=>1000,21227=>1000, -21228=>1000,21229=>1000,21230=>1000,21231=>1000,21232=>1000,21233=>1000,21234=>1000,21235=>1000,21236=>1000,21237=>1000, -21238=>1000,21239=>1000,21240=>1000,21241=>1000,21242=>1000,21243=>1000,21244=>1000,21245=>1000,21246=>1000,21247=>1000, -21248=>1000,21249=>1000,21250=>1000,21251=>1000,21252=>1000,21253=>1000,21254=>1000,21255=>1000,21256=>1000,21257=>1000, -21258=>1000,21259=>1000,21260=>1000,21261=>1000,21262=>1000,21263=>1000,21264=>1000,21265=>1000,21266=>1000,21267=>1000, -21268=>1000,21269=>1000,21270=>1000,21271=>1000,21272=>1000,21273=>1000,21274=>1000,21275=>1000,21276=>1000,21277=>1000, -21278=>1000,21279=>1000,21280=>1000,21281=>1000,21282=>1000,21283=>1000,21284=>1000,21285=>1000,21286=>1000,21287=>1000, -21288=>1000,21289=>1000,21290=>1000,21291=>1000,21292=>1000,21293=>1000,21294=>1000,21295=>1000,21296=>1000,21297=>1000, -21298=>1000,21299=>1000,21300=>1000,21301=>1000,21302=>1000,21303=>1000,21304=>1000,21305=>1000,21306=>1000,21307=>1000, -21308=>1000,21309=>1000,21310=>1000,21311=>1000,21312=>1000,21313=>1000,21314=>1000,21315=>1000,21316=>1000,21317=>1000, -21318=>1000,21319=>1000,21320=>1000,21321=>1000,21322=>1000,21323=>1000,21324=>1000,21325=>1000,21326=>1000,21327=>1000, -21328=>1000,21329=>1000,21330=>1000,21331=>1000,21332=>1000,21333=>1000,21334=>1000,21335=>1000,21336=>1000,21337=>1000, -21338=>1000,21339=>1000,21340=>1000,21341=>1000,21342=>1000,21343=>1000,21344=>1000,21345=>1000,21346=>1000,21347=>1000, -21348=>1000,21349=>1000,21350=>1000,21351=>1000,21352=>1000,21353=>1000,21354=>1000,21355=>1000,21356=>1000,21357=>1000, -21358=>1000,21359=>1000,21360=>1000,21361=>1000,21362=>1000,21363=>1000,21364=>1000,21365=>1000,21366=>1000,21367=>1000, -21368=>1000,21369=>1000,21370=>1000,21371=>1000,21372=>1000,21373=>1000,21374=>1000,21375=>1000,21376=>1000,21377=>1000, -21378=>1000,21379=>1000,21380=>1000,21381=>1000,21382=>1000,21383=>1000,21384=>1000,21385=>1000,21386=>1000,21387=>1000, -21388=>1000,21389=>1000,21390=>1000,21391=>1000,21392=>1000,21393=>1000,21394=>1000,21395=>1000,21396=>1000,21397=>1000, -21398=>1000,21399=>1000,21400=>1000,21401=>1000,21402=>1000,21403=>1000,21404=>1000,21405=>1000,21406=>1000,21407=>1000, -21408=>1000,21409=>1000,21410=>1000,21411=>1000,21412=>1000,21413=>1000,21414=>1000,21415=>1000,21416=>1000,21417=>1000, -21418=>1000,21419=>1000,21420=>1000,21421=>1000,21422=>1000,21423=>1000,21424=>1000,21425=>1000,21426=>1000,21427=>1000, -21428=>1000,21429=>1000,21430=>1000,21431=>1000,21432=>1000,21433=>1000,21434=>1000,21435=>1000,21436=>1000,21437=>1000, -21438=>1000,21439=>1000,21440=>1000,21441=>1000,21442=>1000,21443=>1000,21444=>1000,21445=>1000,21446=>1000,21447=>1000, -21448=>1000,21449=>1000,21450=>1000,21451=>1000,21452=>1000,21453=>1000,21454=>1000,21455=>1000,21456=>1000,21457=>1000, -21458=>1000,21459=>1000,21460=>1000,21461=>1000,21462=>1000,21463=>1000,21464=>1000,21465=>1000,21466=>1000,21467=>1000, -21468=>1000,21469=>1000,21470=>1000,21471=>1000,21472=>1000,21473=>1000,21474=>1000,21475=>1000,21476=>1000,21477=>1000, -21478=>1000,21479=>1000,21480=>1000,21481=>1000,21482=>1000,21483=>1000,21484=>1000,21485=>1000,21486=>1000,21487=>1000, -21488=>1000,21489=>1000,21490=>1000,21491=>1000,21492=>1000,21493=>1000,21494=>1000,21495=>1000,21496=>1000,21497=>1000, -21498=>1000,21499=>1000,21500=>1000,21501=>1000,21502=>1000,21503=>1000,21504=>1000,21505=>1000,21506=>1000,21507=>1000, -21508=>1000,21509=>1000,21510=>1000,21511=>1000,21512=>1000,21513=>1000,21514=>1000,21515=>1000,21516=>1000,21517=>1000, -21518=>1000,21519=>1000,21520=>1000,21521=>1000,21522=>1000,21523=>1000,21524=>1000,21525=>1000,21526=>1000,21527=>1000, -21528=>1000,21529=>1000,21530=>1000,21531=>1000,21532=>1000,21533=>1000,21534=>1000,21535=>1000,21536=>1000,21537=>1000, -21538=>1000,21539=>1000,21540=>1000,21541=>1000,21542=>1000,21543=>1000,21544=>1000,21545=>1000,21546=>1000,21547=>1000, -21548=>1000,21549=>1000,21550=>1000,21551=>1000,21552=>1000,21553=>1000,21554=>1000,21555=>1000,21556=>1000,21557=>1000, -21558=>1000,21559=>1000,21560=>1000,21561=>1000,21562=>1000,21563=>1000,21564=>1000,21565=>1000,21566=>1000,21567=>1000, -21568=>1000,21569=>1000,21570=>1000,21571=>1000,21572=>1000,21573=>1000,21574=>1000,21575=>1000,21576=>1000,21577=>1000, -21578=>1000,21579=>1000,21580=>1000,21581=>1000,21582=>1000,21583=>1000,21584=>1000,21585=>1000,21586=>1000,21587=>1000, -21588=>1000,21589=>1000,21590=>1000,21591=>1000,21592=>1000,21593=>1000,21594=>1000,21595=>1000,21596=>1000,21597=>1000, -21598=>1000,21599=>1000,21600=>1000,21601=>1000,21602=>1000,21603=>1000,21604=>1000,21605=>1000,21606=>1000,21607=>1000, -21608=>1000,21609=>1000,21610=>1000,21611=>1000,21612=>1000,21613=>1000,21614=>1000,21615=>1000,21616=>1000,21617=>1000, -21618=>1000,21619=>1000,21620=>1000,21621=>1000,21622=>1000,21623=>1000,21624=>1000,21625=>1000,21626=>1000,21627=>1000, -21628=>1000,21629=>1000,21630=>1000,21631=>1000,21632=>1000,21633=>1000,21634=>1000,21635=>1000,21636=>1000,21637=>1000, -21638=>1000,21639=>1000,21640=>1000,21641=>1000,21642=>1000,21643=>1000,21644=>1000,21645=>1000,21646=>1000,21647=>1000, -21648=>1000,21649=>1000,21650=>1000,21651=>1000,21652=>1000,21653=>1000,21654=>1000,21655=>1000,21656=>1000,21657=>1000, -21658=>1000,21659=>1000,21660=>1000,21661=>1000,21662=>1000,21663=>1000,21664=>1000,21665=>1000,21666=>1000,21667=>1000, -21668=>1000,21669=>1000,21670=>1000,21671=>1000,21672=>1000,21673=>1000,21674=>1000,21675=>1000,21676=>1000,21677=>1000, -21678=>1000,21679=>1000,21680=>1000,21681=>1000,21682=>1000,21683=>1000,21684=>1000,21685=>1000,21686=>1000,21687=>1000, -21688=>1000,21689=>1000,21690=>1000,21691=>1000,21692=>1000,21693=>1000,21694=>1000,21695=>1000,21696=>1000,21697=>1000, -21698=>1000,21699=>1000,21700=>1000,21701=>1000,21702=>1000,21703=>1000,21704=>1000,21705=>1000,21706=>1000,21707=>1000, -21708=>1000,21709=>1000,21710=>1000,21711=>1000,21712=>1000,21713=>1000,21714=>1000,21715=>1000,21716=>1000,21717=>1000, -21718=>1000,21719=>1000,21720=>1000,21721=>1000,21722=>1000,21723=>1000,21724=>1000,21725=>1000,21726=>1000,21727=>1000, -21728=>1000,21729=>1000,21730=>1000,21731=>1000,21732=>1000,21733=>1000,21734=>1000,21735=>1000,21736=>1000,21737=>1000, -21738=>1000,21739=>1000,21740=>1000,21741=>1000,21742=>1000,21743=>1000,21744=>1000,21745=>1000,21746=>1000,21747=>1000, -21748=>1000,21749=>1000,21750=>1000,21751=>1000,21752=>1000,21753=>1000,21754=>1000,21755=>1000,21756=>1000,21757=>1000, -21758=>1000,21759=>1000,21760=>1000,21761=>1000,21762=>1000,21763=>1000,21764=>1000,21765=>1000,21766=>1000,21767=>1000, -21768=>1000,21769=>1000,21770=>1000,21771=>1000,21772=>1000,21773=>1000,21774=>1000,21775=>1000,21776=>1000,21777=>1000, -21778=>1000,21779=>1000,21780=>1000,21781=>1000,21782=>1000,21783=>1000,21784=>1000,21785=>1000,21786=>1000,21787=>1000, -21788=>1000,21789=>1000,21790=>1000,21791=>1000,21792=>1000,21793=>1000,21794=>1000,21795=>1000,21796=>1000,21797=>1000, -21798=>1000,21799=>1000,21800=>1000,21801=>1000,21802=>1000,21803=>1000,21804=>1000,21805=>1000,21806=>1000,21807=>1000, -21808=>1000,21809=>1000,21810=>1000,21811=>1000,21812=>1000,21813=>1000,21814=>1000,21815=>1000,21816=>1000,21817=>1000, -21818=>1000,21819=>1000,21820=>1000,21821=>1000,21822=>1000,21823=>1000,21824=>1000,21825=>1000,21826=>1000,21827=>1000, -21828=>1000,21829=>1000,21830=>1000,21831=>1000,21832=>1000,21833=>1000,21834=>1000,21835=>1000,21836=>1000,21837=>1000, -21838=>1000,21839=>1000,21840=>1000,21841=>1000,21842=>1000,21843=>1000,21844=>1000,21845=>1000,21846=>1000,21847=>1000, -21848=>1000,21849=>1000,21850=>1000,21851=>1000,21852=>1000,21853=>1000,21854=>1000,21855=>1000,21856=>1000,21857=>1000, -21858=>1000,21859=>1000,21860=>1000,21861=>1000,21862=>1000,21863=>1000,21864=>1000,21865=>1000,21866=>1000,21867=>1000, -21868=>1000,21869=>1000,21870=>1000,21871=>1000,21872=>1000,21873=>1000,21874=>1000,21875=>1000,21876=>1000,21877=>1000, -21878=>1000,21879=>1000,21880=>1000,21881=>1000,21882=>1000,21883=>1000,21884=>1000,21885=>1000,21886=>1000,21887=>1000, -21888=>1000,21889=>1000,21890=>1000,21891=>1000,21892=>1000,21893=>1000,21894=>1000,21895=>1000,21896=>1000,21897=>1000, -21898=>1000,21899=>1000,21900=>1000,21901=>1000,21902=>1000,21903=>1000,21904=>1000,21905=>1000,21906=>1000,21907=>1000, -21908=>1000,21909=>1000,21910=>1000,21911=>1000,21912=>1000,21913=>1000,21914=>1000,21915=>1000,21916=>1000,21917=>1000, -21918=>1000,21919=>1000,21920=>1000,21921=>1000,21922=>1000,21923=>1000,21924=>1000,21925=>1000,21926=>1000,21927=>1000, -21928=>1000,21929=>1000,21930=>1000,21931=>1000,21932=>1000,21933=>1000,21934=>1000,21935=>1000,21936=>1000,21937=>1000, -21938=>1000,21939=>1000,21940=>1000,21941=>1000,21942=>1000,21943=>1000,21944=>1000,21945=>1000,21946=>1000,21947=>1000, -21948=>1000,21949=>1000,21950=>1000,21951=>1000,21952=>1000,21953=>1000,21954=>1000,21955=>1000,21956=>1000,21957=>1000, -21958=>1000,21959=>1000,21960=>1000,21961=>1000,21962=>1000,21963=>1000,21964=>1000,21965=>1000,21966=>1000,21967=>1000, -21968=>1000,21969=>1000,21970=>1000,21971=>1000,21972=>1000,21973=>1000,21974=>1000,21975=>1000,21976=>1000,21977=>1000, -21978=>1000,21979=>1000,21980=>1000,21981=>1000,21982=>1000,21983=>1000,21984=>1000,21985=>1000,21986=>1000,21987=>1000, -21988=>1000,21989=>1000,21990=>1000,21991=>1000,21992=>1000,21993=>1000,21994=>1000,21995=>1000,21996=>1000,21997=>1000, -21998=>1000,21999=>1000,22000=>1000,22001=>1000,22002=>1000,22003=>1000,22004=>1000,22005=>1000,22006=>1000,22007=>1000, -22008=>1000,22009=>1000,22010=>1000,22011=>1000,22012=>1000,22013=>1000,22014=>1000,22015=>1000,22016=>1000,22017=>1000, -22018=>1000,22019=>1000,22020=>1000,22021=>1000,22022=>1000,22023=>1000,22024=>1000,22025=>1000,22026=>1000,22027=>1000, -22028=>1000,22029=>1000,22030=>1000,22031=>1000,22032=>1000,22033=>1000,22034=>1000,22035=>1000,22036=>1000,22037=>1000, -22038=>1000,22039=>1000,22040=>1000,22041=>1000,22042=>1000,22043=>1000,22044=>1000,22045=>1000,22046=>1000,22047=>1000, -22048=>1000,22049=>1000,22050=>1000,22051=>1000,22052=>1000,22053=>1000,22054=>1000,22055=>1000,22056=>1000,22057=>1000, -22058=>1000,22059=>1000,22060=>1000,22061=>1000,22062=>1000,22063=>1000,22064=>1000,22065=>1000,22066=>1000,22067=>1000, -22068=>1000,22069=>1000,22070=>1000,22071=>1000,22072=>1000,22073=>1000,22074=>1000,22075=>1000,22076=>1000,22077=>1000, -22078=>1000,22079=>1000,22080=>1000,22081=>1000,22082=>1000,22083=>1000,22084=>1000,22085=>1000,22086=>1000,22087=>1000, -22088=>1000,22089=>1000,22090=>1000,22091=>1000,22092=>1000,22093=>1000,22094=>1000,22095=>1000,22096=>1000,22097=>1000, -22098=>1000,22099=>1000,22100=>1000,22101=>1000,22102=>1000,22103=>1000,22104=>1000,22105=>1000,22106=>1000,22107=>1000, -22108=>1000,22109=>1000,22110=>1000,22111=>1000,22112=>1000,22113=>1000,22114=>1000,22115=>1000,22116=>1000,22117=>1000, -22118=>1000,22119=>1000,22120=>1000,22121=>1000,22122=>1000,22123=>1000,22124=>1000,22125=>1000,22126=>1000,22127=>1000, -22128=>1000,22129=>1000,22130=>1000,22131=>1000,22132=>1000,22133=>1000,22134=>1000,22135=>1000,22136=>1000,22137=>1000, -22138=>1000,22139=>1000,22140=>1000,22141=>1000,22142=>1000,22143=>1000,22144=>1000,22145=>1000,22146=>1000,22147=>1000, -22148=>1000,22149=>1000,22150=>1000,22151=>1000,22152=>1000,22153=>1000,22154=>1000,22155=>1000,22156=>1000,22157=>1000, -22158=>1000,22159=>1000,22160=>1000,22161=>1000,22162=>1000,22163=>1000,22164=>1000,22165=>1000,22166=>1000,22167=>1000, -22168=>1000,22169=>1000,22170=>1000,22171=>1000,22172=>1000,22173=>1000,22174=>1000,22175=>1000,22176=>1000,22177=>1000, -22178=>1000,22179=>1000,22180=>1000,22181=>1000,22182=>1000,22183=>1000,22184=>1000,22185=>1000,22186=>1000,22187=>1000, -22188=>1000,22189=>1000,22190=>1000,22191=>1000,22192=>1000,22193=>1000,22194=>1000,22195=>1000,22196=>1000,22197=>1000, -22198=>1000,22199=>1000,22200=>1000,22201=>1000,22202=>1000,22203=>1000,22204=>1000,22205=>1000,22206=>1000,22207=>1000, -22208=>1000,22209=>1000,22210=>1000,22211=>1000,22212=>1000,22213=>1000,22214=>1000,22215=>1000,22216=>1000,22217=>1000, -22218=>1000,22219=>1000,22220=>1000,22221=>1000,22222=>1000,22223=>1000,22224=>1000,22225=>1000,22226=>1000,22227=>1000, -22228=>1000,22229=>1000,22230=>1000,22231=>1000,22232=>1000,22233=>1000,22234=>1000,22235=>1000,22236=>1000,22237=>1000, -22238=>1000,22239=>1000,22240=>1000,22241=>1000,22242=>1000,22243=>1000,22244=>1000,22245=>1000,22246=>1000,22247=>1000, -22248=>1000,22249=>1000,22250=>1000,22251=>1000,22252=>1000,22253=>1000,22254=>1000,22255=>1000,22256=>1000,22257=>1000, -22258=>1000,22259=>1000,22260=>1000,22261=>1000,22262=>1000,22263=>1000,22264=>1000,22265=>1000,22266=>1000,22267=>1000, -22268=>1000,22269=>1000,22270=>1000,22271=>1000,22272=>1000,22273=>1000,22274=>1000,22275=>1000,22276=>1000,22277=>1000, -22278=>1000,22279=>1000,22280=>1000,22281=>1000,22282=>1000,22283=>1000,22284=>1000,22285=>1000,22286=>1000,22287=>1000, -22288=>1000,22289=>1000,22290=>1000,22291=>1000,22292=>1000,22293=>1000,22294=>1000,22295=>1000,22296=>1000,22297=>1000, -22298=>1000,22299=>1000,22300=>1000,22301=>1000,22302=>1000,22303=>1000,22304=>1000,22305=>1000,22306=>1000,22307=>1000, -22308=>1000,22309=>1000,22310=>1000,22311=>1000,22312=>1000,22313=>1000,22314=>1000,22315=>1000,22316=>1000,22317=>1000, -22318=>1000,22319=>1000,22320=>1000,22321=>1000,22322=>1000,22323=>1000,22324=>1000,22325=>1000,22326=>1000,22327=>1000, -22328=>1000,22329=>1000,22330=>1000,22331=>1000,22332=>1000,22333=>1000,22334=>1000,22335=>1000,22336=>1000,22337=>1000, -22338=>1000,22339=>1000,22340=>1000,22341=>1000,22342=>1000,22343=>1000,22344=>1000,22345=>1000,22346=>1000,22347=>1000, -22348=>1000,22349=>1000,22350=>1000,22351=>1000,22352=>1000,22353=>1000,22354=>1000,22355=>1000,22356=>1000,22357=>1000, -22358=>1000,22359=>1000,22360=>1000,22361=>1000,22362=>1000,22363=>1000,22364=>1000,22365=>1000,22366=>1000,22367=>1000, -22368=>1000,22369=>1000,22370=>1000,22371=>1000,22372=>1000,22373=>1000,22374=>1000,22375=>1000,22376=>1000,22377=>1000, -22378=>1000,22379=>1000,22380=>1000,22381=>1000,22382=>1000,22383=>1000,22384=>1000,22385=>1000,22386=>1000,22387=>1000, -22388=>1000,22389=>1000,22390=>1000,22391=>1000,22392=>1000,22393=>1000,22394=>1000,22395=>1000,22396=>1000,22397=>1000, -22398=>1000,22399=>1000,22400=>1000,22401=>1000,22402=>1000,22403=>1000,22404=>1000,22405=>1000,22406=>1000,22407=>1000, -22408=>1000,22409=>1000,22410=>1000,22411=>1000,22412=>1000,22413=>1000,22414=>1000,22415=>1000,22416=>1000,22417=>1000, -22418=>1000,22419=>1000,22420=>1000,22421=>1000,22422=>1000,22423=>1000,22424=>1000,22425=>1000,22426=>1000,22427=>1000, -22428=>1000,22429=>1000,22430=>1000,22431=>1000,22432=>1000,22433=>1000,22434=>1000,22435=>1000,22436=>1000,22437=>1000, -22438=>1000,22439=>1000,22440=>1000,22441=>1000,22442=>1000,22443=>1000,22444=>1000,22445=>1000,22446=>1000,22447=>1000, -22448=>1000,22449=>1000,22450=>1000,22451=>1000,22452=>1000,22453=>1000,22454=>1000,22455=>1000,22456=>1000,22457=>1000, -22458=>1000,22459=>1000,22460=>1000,22461=>1000,22462=>1000,22463=>1000,22464=>1000,22465=>1000,22466=>1000,22467=>1000, -22468=>1000,22469=>1000,22470=>1000,22471=>1000,22472=>1000,22473=>1000,22474=>1000,22475=>1000,22476=>1000,22477=>1000, -22478=>1000,22479=>1000,22480=>1000,22481=>1000,22482=>1000,22483=>1000,22484=>1000,22485=>1000,22486=>1000,22487=>1000, -22488=>1000,22489=>1000,22490=>1000,22491=>1000,22492=>1000,22493=>1000,22494=>1000,22495=>1000,22496=>1000,22497=>1000, -22498=>1000,22499=>1000,22500=>1000,22501=>1000,22502=>1000,22503=>1000,22504=>1000,22505=>1000,22506=>1000,22507=>1000, -22508=>1000,22509=>1000,22510=>1000,22511=>1000,22512=>1000,22513=>1000,22514=>1000,22515=>1000,22516=>1000,22517=>1000, -22518=>1000,22519=>1000,22520=>1000,22521=>1000,22522=>1000,22523=>1000,22524=>1000,22525=>1000,22526=>1000,22527=>1000, -22528=>1000,22529=>1000,22530=>1000,22531=>1000,22532=>1000,22533=>1000,22534=>1000,22535=>1000,22536=>1000,22537=>1000, -22538=>1000,22539=>1000,22540=>1000,22541=>1000,22542=>1000,22543=>1000,22544=>1000,22545=>1000,22546=>1000,22547=>1000, -22548=>1000,22549=>1000,22550=>1000,22551=>1000,22552=>1000,22553=>1000,22554=>1000,22555=>1000,22556=>1000,22557=>1000, -22558=>1000,22559=>1000,22560=>1000,22561=>1000,22562=>1000,22563=>1000,22564=>1000,22565=>1000,22566=>1000,22567=>1000, -22568=>1000,22569=>1000,22570=>1000,22571=>1000,22572=>1000,22573=>1000,22574=>1000,22575=>1000,22576=>1000,22577=>1000, -22578=>1000,22579=>1000,22580=>1000,22581=>1000,22582=>1000,22583=>1000,22584=>1000,22585=>1000,22586=>1000,22587=>1000, -22588=>1000,22589=>1000,22590=>1000,22591=>1000,22592=>1000,22593=>1000,22594=>1000,22595=>1000,22596=>1000,22597=>1000, -22598=>1000,22599=>1000,22600=>1000,22601=>1000,22602=>1000,22603=>1000,22604=>1000,22605=>1000,22606=>1000,22607=>1000, -22608=>1000,22609=>1000,22610=>1000,22611=>1000,22612=>1000,22613=>1000,22614=>1000,22615=>1000,22616=>1000,22617=>1000, -22618=>1000,22619=>1000,22620=>1000,22621=>1000,22622=>1000,22623=>1000,22624=>1000,22625=>1000,22626=>1000,22627=>1000, -22628=>1000,22629=>1000,22630=>1000,22631=>1000,22632=>1000,22633=>1000,22634=>1000,22635=>1000,22636=>1000,22637=>1000, -22638=>1000,22639=>1000,22640=>1000,22641=>1000,22642=>1000,22643=>1000,22644=>1000,22645=>1000,22646=>1000,22647=>1000, -22648=>1000,22649=>1000,22650=>1000,22651=>1000,22652=>1000,22653=>1000,22654=>1000,22655=>1000,22656=>1000,22657=>1000, -22658=>1000,22659=>1000,22660=>1000,22661=>1000,22662=>1000,22663=>1000,22664=>1000,22665=>1000,22666=>1000,22667=>1000, -22668=>1000,22669=>1000,22670=>1000,22671=>1000,22672=>1000,22673=>1000,22674=>1000,22675=>1000,22676=>1000,22677=>1000, -22678=>1000,22679=>1000,22680=>1000,22681=>1000,22682=>1000,22683=>1000,22684=>1000,22685=>1000,22686=>1000,22687=>1000, -22688=>1000,22689=>1000,22690=>1000,22691=>1000,22692=>1000,22693=>1000,22694=>1000,22695=>1000,22696=>1000,22697=>1000, -22698=>1000,22699=>1000,22700=>1000,22701=>1000,22702=>1000,22703=>1000,22704=>1000,22705=>1000,22706=>1000,22707=>1000, -22708=>1000,22709=>1000,22710=>1000,22711=>1000,22712=>1000,22713=>1000,22714=>1000,22715=>1000,22716=>1000,22717=>1000, -22718=>1000,22719=>1000,22720=>1000,22721=>1000,22722=>1000,22723=>1000,22724=>1000,22725=>1000,22726=>1000,22727=>1000, -22728=>1000,22729=>1000,22730=>1000,22731=>1000,22732=>1000,22733=>1000,22734=>1000,22735=>1000,22736=>1000,22737=>1000, -22738=>1000,22739=>1000,22740=>1000,22741=>1000,22742=>1000,22743=>1000,22744=>1000,22745=>1000,22746=>1000,22747=>1000, -22748=>1000,22749=>1000,22750=>1000,22751=>1000,22752=>1000,22753=>1000,22754=>1000,22755=>1000,22756=>1000,22757=>1000, -22758=>1000,22759=>1000,22760=>1000,22761=>1000,22762=>1000,22763=>1000,22764=>1000,22765=>1000,22766=>1000,22767=>1000, -22768=>1000,22769=>1000,22770=>1000,22771=>1000,22772=>1000,22773=>1000,22774=>1000,22775=>1000,22776=>1000,22777=>1000, -22778=>1000,22779=>1000,22780=>1000,22781=>1000,22782=>1000,22783=>1000,22784=>1000,22785=>1000,22786=>1000,22787=>1000, -22788=>1000,22789=>1000,22790=>1000,22791=>1000,22792=>1000,22793=>1000,22794=>1000,22795=>1000,22796=>1000,22797=>1000, -22798=>1000,22799=>1000,22800=>1000,22801=>1000,22802=>1000,22803=>1000,22804=>1000,22805=>1000,22806=>1000,22807=>1000, -22808=>1000,22809=>1000,22810=>1000,22811=>1000,22812=>1000,22813=>1000,22814=>1000,22815=>1000,22816=>1000,22817=>1000, -22818=>1000,22819=>1000,22820=>1000,22821=>1000,22822=>1000,22823=>1000,22824=>1000,22825=>1000,22826=>1000,22827=>1000, -22828=>1000,22829=>1000,22830=>1000,22831=>1000,22832=>1000,22833=>1000,22834=>1000,22835=>1000,22836=>1000,22837=>1000, -22838=>1000,22839=>1000,22840=>1000,22841=>1000,22842=>1000,22843=>1000,22844=>1000,22845=>1000,22846=>1000,22847=>1000, -22848=>1000,22849=>1000,22850=>1000,22851=>1000,22852=>1000,22853=>1000,22854=>1000,22855=>1000,22856=>1000,22857=>1000, -22858=>1000,22859=>1000,22860=>1000,22861=>1000,22862=>1000,22863=>1000,22864=>1000,22865=>1000,22866=>1000,22867=>1000, -22868=>1000,22869=>1000,22870=>1000,22871=>1000,22872=>1000,22873=>1000,22874=>1000,22875=>1000,22876=>1000,22877=>1000, -22878=>1000,22879=>1000,22880=>1000,22881=>1000,22882=>1000,22883=>1000,22884=>1000,22885=>1000,22886=>1000,22887=>1000, -22888=>1000,22889=>1000,22890=>1000,22891=>1000,22892=>1000,22893=>1000,22894=>1000,22895=>1000,22896=>1000,22897=>1000, -22898=>1000,22899=>1000,22900=>1000,22901=>1000,22902=>1000,22903=>1000,22904=>1000,22905=>1000,22906=>1000,22907=>1000, -22908=>1000,22909=>1000,22910=>1000,22911=>1000,22912=>1000,22913=>1000,22914=>1000,22915=>1000,22916=>1000,22917=>1000, -22918=>1000,22919=>1000,22920=>1000,22921=>1000,22922=>1000,22923=>1000,22924=>1000,22925=>1000,22926=>1000,22927=>1000, -22928=>1000,22929=>1000,22930=>1000,22931=>1000,22932=>1000,22933=>1000,22934=>1000,22935=>1000,22936=>1000,22937=>1000, -22938=>1000,22939=>1000,22940=>1000,22941=>1000,22942=>1000,22943=>1000,22944=>1000,22945=>1000,22946=>1000,22947=>1000, -22948=>1000,22949=>1000,22950=>1000,22951=>1000,22952=>1000,22953=>1000,22954=>1000,22955=>1000,22956=>1000,22957=>1000, -22958=>1000,22959=>1000,22960=>1000,22961=>1000,22962=>1000,22963=>1000,22964=>1000,22965=>1000,22966=>1000,22967=>1000, -22968=>1000,22969=>1000,22970=>1000,22971=>1000,22972=>1000,22973=>1000,22974=>1000,22975=>1000,22976=>1000,22977=>1000, -22978=>1000,22979=>1000,22980=>1000,22981=>1000,22982=>1000,22983=>1000,22984=>1000,22985=>1000,22986=>1000,22987=>1000, -22988=>1000,22989=>1000,22990=>1000,22991=>1000,22992=>1000,22993=>1000,22994=>1000,22995=>1000,22996=>1000,22997=>1000, -22998=>1000,22999=>1000,23000=>1000,23001=>1000,23002=>1000,23003=>1000,23004=>1000,23005=>1000,23006=>1000,23007=>1000, -23008=>1000,23009=>1000,23010=>1000,23011=>1000,23012=>1000,23013=>1000,23014=>1000,23015=>1000,23016=>1000,23017=>1000, -23018=>1000,23019=>1000,23020=>1000,23021=>1000,23022=>1000,23023=>1000,23024=>1000,23025=>1000,23026=>1000,23027=>1000, -23028=>1000,23029=>1000,23030=>1000,23031=>1000,23032=>1000,23033=>1000,23034=>1000,23035=>1000,23036=>1000,23037=>1000, -23038=>1000,23039=>1000,23040=>1000,23041=>1000,23042=>1000,23043=>1000,23044=>1000,23045=>1000,23046=>1000,23047=>1000, -23048=>1000,23049=>1000,23050=>1000,23051=>1000,23052=>1000,23053=>1000,23054=>1000,23055=>1000,23056=>1000,23057=>1000, -23058=>1000,23059=>1000,23060=>1000,23061=>1000,23062=>1000,23063=>1000,23064=>1000,23065=>1000,23066=>1000,23067=>1000, -23068=>1000,23069=>1000,23070=>1000,23071=>1000,23072=>1000,23073=>1000,23074=>1000,23075=>1000,23076=>1000,23077=>1000, -23078=>1000,23079=>1000,23080=>1000,23081=>1000,23082=>1000,23083=>1000,23084=>1000,23085=>1000,23086=>1000,23087=>1000, -23088=>1000,23089=>1000,23090=>1000,23091=>1000,23092=>1000,23093=>1000,23094=>1000,23095=>1000,23096=>1000,23097=>1000, -23098=>1000,23099=>1000,23100=>1000,23101=>1000,23102=>1000,23103=>1000,23104=>1000,23105=>1000,23106=>1000,23107=>1000, -23108=>1000,23109=>1000,23110=>1000,23111=>1000,23112=>1000,23113=>1000,23114=>1000,23115=>1000,23116=>1000,23117=>1000, -23118=>1000,23119=>1000,23120=>1000,23121=>1000,23122=>1000,23123=>1000,23124=>1000,23125=>1000,23126=>1000,23127=>1000, -23128=>1000,23129=>1000,23130=>1000,23131=>1000,23132=>1000,23133=>1000,23134=>1000,23135=>1000,23136=>1000,23137=>1000, -23138=>1000,23139=>1000,23140=>1000,23141=>1000,23142=>1000,23143=>1000,23144=>1000,23145=>1000,23146=>1000,23147=>1000, -23148=>1000,23149=>1000,23150=>1000,23151=>1000,23152=>1000,23153=>1000,23154=>1000,23155=>1000,23156=>1000,23157=>1000, -23158=>1000,23159=>1000,23160=>1000,23161=>1000,23162=>1000,23163=>1000,23164=>1000,23165=>1000,23166=>1000,23167=>1000, -23168=>1000,23169=>1000,23170=>1000,23171=>1000,23172=>1000,23173=>1000,23174=>1000,23175=>1000,23176=>1000,23177=>1000, -23178=>1000,23179=>1000,23180=>1000,23181=>1000,23182=>1000,23183=>1000,23184=>1000,23185=>1000,23186=>1000,23187=>1000, -23188=>1000,23189=>1000,23190=>1000,23191=>1000,23192=>1000,23193=>1000,23194=>1000,23195=>1000,23196=>1000,23197=>1000, -23198=>1000,23199=>1000,23200=>1000,23201=>1000,23202=>1000,23203=>1000,23204=>1000,23205=>1000,23206=>1000,23207=>1000, -23208=>1000,23209=>1000,23210=>1000,23211=>1000,23212=>1000,23213=>1000,23214=>1000,23215=>1000,23216=>1000,23217=>1000, -23218=>1000,23219=>1000,23220=>1000,23221=>1000,23222=>1000,23223=>1000,23224=>1000,23225=>1000,23226=>1000,23227=>1000, -23228=>1000,23229=>1000,23230=>1000,23231=>1000,23232=>1000,23233=>1000,23234=>1000,23235=>1000,23236=>1000,23237=>1000, -23238=>1000,23239=>1000,23240=>1000,23241=>1000,23242=>1000,23243=>1000,23244=>1000,23245=>1000,23246=>1000,23247=>1000, -23248=>1000,23249=>1000,23250=>1000,23251=>1000,23252=>1000,23253=>1000,23254=>1000,23255=>1000,23256=>1000,23257=>1000, -23258=>1000,23259=>1000,23260=>1000,23261=>1000,23262=>1000,23263=>1000,23264=>1000,23265=>1000,23266=>1000,23267=>1000, -23268=>1000,23269=>1000,23270=>1000,23271=>1000,23272=>1000,23273=>1000,23274=>1000,23275=>1000,23276=>1000,23277=>1000, -23278=>1000,23279=>1000,23280=>1000,23281=>1000,23282=>1000,23283=>1000,23284=>1000,23285=>1000,23286=>1000,23287=>1000, -23288=>1000,23289=>1000,23290=>1000,23291=>1000,23292=>1000,23293=>1000,23294=>1000,23295=>1000,23296=>1000,23297=>1000, -23298=>1000,23299=>1000,23300=>1000,23301=>1000,23302=>1000,23303=>1000,23304=>1000,23305=>1000,23306=>1000,23307=>1000, -23308=>1000,23309=>1000,23310=>1000,23311=>1000,23312=>1000,23313=>1000,23314=>1000,23315=>1000,23316=>1000,23317=>1000, -23318=>1000,23319=>1000,23320=>1000,23321=>1000,23322=>1000,23323=>1000,23324=>1000,23325=>1000,23326=>1000,23327=>1000, -23328=>1000,23329=>1000,23330=>1000,23331=>1000,23332=>1000,23333=>1000,23334=>1000,23335=>1000,23336=>1000,23337=>1000, -23338=>1000,23339=>1000,23340=>1000,23341=>1000,23342=>1000,23343=>1000,23344=>1000,23345=>1000,23346=>1000,23347=>1000, -23348=>1000,23349=>1000,23350=>1000,23351=>1000,23352=>1000,23353=>1000,23354=>1000,23355=>1000,23356=>1000,23357=>1000, -23358=>1000,23359=>1000,23360=>1000,23361=>1000,23362=>1000,23363=>1000,23364=>1000,23365=>1000,23366=>1000,23367=>1000, -23368=>1000,23369=>1000,23370=>1000,23371=>1000,23372=>1000,23373=>1000,23374=>1000,23375=>1000,23376=>1000,23377=>1000, -23378=>1000,23379=>1000,23380=>1000,23381=>1000,23382=>1000,23383=>1000,23384=>1000,23385=>1000,23386=>1000,23387=>1000, -23388=>1000,23389=>1000,23390=>1000,23391=>1000,23392=>1000,23393=>1000,23394=>1000,23395=>1000,23396=>1000,23397=>1000, -23398=>1000,23399=>1000,23400=>1000,23401=>1000,23402=>1000,23403=>1000,23404=>1000,23405=>1000,23406=>1000,23407=>1000, -23408=>1000,23409=>1000,23410=>1000,23411=>1000,23412=>1000,23413=>1000,23414=>1000,23415=>1000,23416=>1000,23417=>1000, -23418=>1000,23419=>1000,23420=>1000,23421=>1000,23422=>1000,23423=>1000,23424=>1000,23425=>1000,23426=>1000,23427=>1000, -23428=>1000,23429=>1000,23430=>1000,23431=>1000,23432=>1000,23433=>1000,23434=>1000,23435=>1000,23436=>1000,23437=>1000, -23438=>1000,23439=>1000,23440=>1000,23441=>1000,23442=>1000,23443=>1000,23444=>1000,23445=>1000,23446=>1000,23447=>1000, -23448=>1000,23449=>1000,23450=>1000,23451=>1000,23452=>1000,23453=>1000,23454=>1000,23455=>1000,23456=>1000,23457=>1000, -23458=>1000,23459=>1000,23460=>1000,23461=>1000,23462=>1000,23463=>1000,23464=>1000,23465=>1000,23466=>1000,23467=>1000, -23468=>1000,23469=>1000,23470=>1000,23471=>1000,23472=>1000,23473=>1000,23474=>1000,23475=>1000,23476=>1000,23477=>1000, -23478=>1000,23479=>1000,23480=>1000,23481=>1000,23482=>1000,23483=>1000,23484=>1000,23485=>1000,23486=>1000,23487=>1000, -23488=>1000,23489=>1000,23490=>1000,23491=>1000,23492=>1000,23493=>1000,23494=>1000,23495=>1000,23496=>1000,23497=>1000, -23498=>1000,23499=>1000,23500=>1000,23501=>1000,23502=>1000,23503=>1000,23504=>1000,23505=>1000,23506=>1000,23507=>1000, -23508=>1000,23509=>1000,23510=>1000,23511=>1000,23512=>1000,23513=>1000,23514=>1000,23515=>1000,23516=>1000,23517=>1000, -23518=>1000,23519=>1000,23520=>1000,23521=>1000,23522=>1000,23523=>1000,23524=>1000,23525=>1000,23526=>1000,23527=>1000, -23528=>1000,23529=>1000,23530=>1000,23531=>1000,23532=>1000,23533=>1000,23534=>1000,23535=>1000,23536=>1000,23537=>1000, -23538=>1000,23539=>1000,23540=>1000,23541=>1000,23542=>1000,23543=>1000,23544=>1000,23545=>1000,23546=>1000,23547=>1000, -23548=>1000,23549=>1000,23550=>1000,23551=>1000,23552=>1000,23553=>1000,23554=>1000,23555=>1000,23556=>1000,23557=>1000, -23558=>1000,23559=>1000,23560=>1000,23561=>1000,23562=>1000,23563=>1000,23564=>1000,23565=>1000,23566=>1000,23567=>1000, -23568=>1000,23569=>1000,23570=>1000,23571=>1000,23572=>1000,23573=>1000,23574=>1000,23575=>1000,23576=>1000,23577=>1000, -23578=>1000,23579=>1000,23580=>1000,23581=>1000,23582=>1000,23583=>1000,23584=>1000,23585=>1000,23586=>1000,23587=>1000, -23588=>1000,23589=>1000,23590=>1000,23591=>1000,23592=>1000,23593=>1000,23594=>1000,23595=>1000,23596=>1000,23597=>1000, -23598=>1000,23599=>1000,23600=>1000,23601=>1000,23602=>1000,23603=>1000,23604=>1000,23605=>1000,23606=>1000,23607=>1000, -23608=>1000,23609=>1000,23610=>1000,23611=>1000,23612=>1000,23613=>1000,23614=>1000,23615=>1000,23616=>1000,23617=>1000, -23618=>1000,23619=>1000,23620=>1000,23621=>1000,23622=>1000,23623=>1000,23624=>1000,23625=>1000,23626=>1000,23627=>1000, -23628=>1000,23629=>1000,23630=>1000,23631=>1000,23632=>1000,23633=>1000,23634=>1000,23635=>1000,23636=>1000,23637=>1000, -23638=>1000,23639=>1000,23640=>1000,23641=>1000,23642=>1000,23643=>1000,23644=>1000,23645=>1000,23646=>1000,23647=>1000, -23648=>1000,23649=>1000,23650=>1000,23651=>1000,23652=>1000,23653=>1000,23654=>1000,23655=>1000,23656=>1000,23657=>1000, -23658=>1000,23659=>1000,23660=>1000,23661=>1000,23662=>1000,23663=>1000,23664=>1000,23665=>1000,23666=>1000,23667=>1000, -23668=>1000,23669=>1000,23670=>1000,23671=>1000,23672=>1000,23673=>1000,23674=>1000,23675=>1000,23676=>1000,23677=>1000, -23678=>1000,23679=>1000,23680=>1000,23681=>1000,23682=>1000,23683=>1000,23684=>1000,23685=>1000,23686=>1000,23687=>1000, -23688=>1000,23689=>1000,23690=>1000,23691=>1000,23692=>1000,23693=>1000,23694=>1000,23695=>1000,23696=>1000,23697=>1000, -23698=>1000,23699=>1000,23700=>1000,23701=>1000,23702=>1000,23703=>1000,23704=>1000,23705=>1000,23706=>1000,23707=>1000, -23708=>1000,23709=>1000,23710=>1000,23711=>1000,23712=>1000,23713=>1000,23714=>1000,23715=>1000,23716=>1000,23717=>1000, -23718=>1000,23719=>1000,23720=>1000,23721=>1000,23722=>1000,23723=>1000,23724=>1000,23725=>1000,23726=>1000,23727=>1000, -23728=>1000,23729=>1000,23730=>1000,23731=>1000,23732=>1000,23733=>1000,23734=>1000,23735=>1000,23736=>1000,23737=>1000, -23738=>1000,23739=>1000,23740=>1000,23741=>1000,23742=>1000,23743=>1000,23744=>1000,23745=>1000,23746=>1000,23747=>1000, -23748=>1000,23749=>1000,23750=>1000,23751=>1000,23752=>1000,23753=>1000,23754=>1000,23755=>1000,23756=>1000,23757=>1000, -23758=>1000,23759=>1000,23760=>1000,23761=>1000,23762=>1000,23763=>1000,23764=>1000,23765=>1000,23766=>1000,23767=>1000, -23768=>1000,23769=>1000,23770=>1000,23771=>1000,23772=>1000,23773=>1000,23774=>1000,23775=>1000,23776=>1000,23777=>1000, -23778=>1000,23779=>1000,23780=>1000,23781=>1000,23782=>1000,23783=>1000,23784=>1000,23785=>1000,23786=>1000,23787=>1000, -23788=>1000,23789=>1000,23790=>1000,23791=>1000,23792=>1000,23793=>1000,23794=>1000,23795=>1000,23796=>1000,23797=>1000, -23798=>1000,23799=>1000,23800=>1000,23801=>1000,23802=>1000,23803=>1000,23804=>1000,23805=>1000,23806=>1000,23807=>1000, -23808=>1000,23809=>1000,23810=>1000,23811=>1000,23812=>1000,23813=>1000,23814=>1000,23815=>1000,23816=>1000,23817=>1000, -23818=>1000,23819=>1000,23820=>1000,23821=>1000,23822=>1000,23823=>1000,23824=>1000,23825=>1000,23826=>1000,23827=>1000, -23828=>1000,23829=>1000,23830=>1000,23831=>1000,23832=>1000,23833=>1000,23834=>1000,23835=>1000,23836=>1000,23837=>1000, -23838=>1000,23839=>1000,23840=>1000,23841=>1000,23842=>1000,23843=>1000,23844=>1000,23845=>1000,23846=>1000,23847=>1000, -23848=>1000,23849=>1000,23850=>1000,23851=>1000,23852=>1000,23853=>1000,23854=>1000,23855=>1000,23856=>1000,23857=>1000, -23858=>1000,23859=>1000,23860=>1000,23861=>1000,23862=>1000,23863=>1000,23864=>1000,23865=>1000,23866=>1000,23867=>1000, -23868=>1000,23869=>1000,23870=>1000,23871=>1000,23872=>1000,23873=>1000,23874=>1000,23875=>1000,23876=>1000,23877=>1000, -23878=>1000,23879=>1000,23880=>1000,23881=>1000,23882=>1000,23883=>1000,23884=>1000,23885=>1000,23886=>1000,23887=>1000, -23888=>1000,23889=>1000,23890=>1000,23891=>1000,23892=>1000,23893=>1000,23894=>1000,23895=>1000,23896=>1000,23897=>1000, -23898=>1000,23899=>1000,23900=>1000,23901=>1000,23902=>1000,23903=>1000,23904=>1000,23905=>1000,23906=>1000,23907=>1000, -23908=>1000,23909=>1000,23910=>1000,23911=>1000,23912=>1000,23913=>1000,23914=>1000,23915=>1000,23916=>1000,23917=>1000, -23918=>1000,23919=>1000,23920=>1000,23921=>1000,23922=>1000,23923=>1000,23924=>1000,23925=>1000,23926=>1000,23927=>1000, -23928=>1000,23929=>1000,23930=>1000,23931=>1000,23932=>1000,23933=>1000,23934=>1000,23935=>1000,23936=>1000,23937=>1000, -23938=>1000,23939=>1000,23940=>1000,23941=>1000,23942=>1000,23943=>1000,23944=>1000,23945=>1000,23946=>1000,23947=>1000, -23948=>1000,23949=>1000,23950=>1000,23951=>1000,23952=>1000,23953=>1000,23954=>1000,23955=>1000,23956=>1000,23957=>1000, -23958=>1000,23959=>1000,23960=>1000,23961=>1000,23962=>1000,23963=>1000,23964=>1000,23965=>1000,23966=>1000,23967=>1000, -23968=>1000,23969=>1000,23970=>1000,23971=>1000,23972=>1000,23973=>1000,23974=>1000,23975=>1000,23976=>1000,23977=>1000, -23978=>1000,23979=>1000,23980=>1000,23981=>1000,23982=>1000,23983=>1000,23984=>1000,23985=>1000,23986=>1000,23987=>1000, -23988=>1000,23989=>1000,23990=>1000,23991=>1000,23992=>1000,23993=>1000,23994=>1000,23995=>1000,23996=>1000,23997=>1000, -23998=>1000,23999=>1000,24000=>1000,24001=>1000,24002=>1000,24003=>1000,24004=>1000,24005=>1000,24006=>1000,24007=>1000, -24008=>1000,24009=>1000,24010=>1000,24011=>1000,24012=>1000,24013=>1000,24014=>1000,24015=>1000,24016=>1000,24017=>1000, -24018=>1000,24019=>1000,24020=>1000,24021=>1000,24022=>1000,24023=>1000,24024=>1000,24025=>1000,24026=>1000,24027=>1000, -24028=>1000,24029=>1000,24030=>1000,24031=>1000,24032=>1000,24033=>1000,24034=>1000,24035=>1000,24036=>1000,24037=>1000, -24038=>1000,24039=>1000,24040=>1000,24041=>1000,24042=>1000,24043=>1000,24044=>1000,24045=>1000,24046=>1000,24047=>1000, -24048=>1000,24049=>1000,24050=>1000,24051=>1000,24052=>1000,24053=>1000,24054=>1000,24055=>1000,24056=>1000,24057=>1000, -24058=>1000,24059=>1000,24060=>1000,24061=>1000,24062=>1000,24063=>1000,24064=>1000,24065=>1000,24066=>1000,24067=>1000, -24068=>1000,24069=>1000,24070=>1000,24071=>1000,24072=>1000,24073=>1000,24074=>1000,24075=>1000,24076=>1000,24077=>1000, -24078=>1000,24079=>1000,24080=>1000,24081=>1000,24082=>1000,24083=>1000,24084=>1000,24085=>1000,24086=>1000,24087=>1000, -24088=>1000,24089=>1000,24090=>1000,24091=>1000,24092=>1000,24093=>1000,24094=>1000,24095=>1000,24096=>1000,24097=>1000, -24098=>1000,24099=>1000,24100=>1000,24101=>1000,24102=>1000,24103=>1000,24104=>1000,24105=>1000,24106=>1000,24107=>1000, -24108=>1000,24109=>1000,24110=>1000,24111=>1000,24112=>1000,24113=>1000,24114=>1000,24115=>1000,24116=>1000,24117=>1000, -24118=>1000,24119=>1000,24120=>1000,24121=>1000,24122=>1000,24123=>1000,24124=>1000,24125=>1000,24126=>1000,24127=>1000, -24128=>1000,24129=>1000,24130=>1000,24131=>1000,24132=>1000,24133=>1000,24134=>1000,24135=>1000,24136=>1000,24137=>1000, -24138=>1000,24139=>1000,24140=>1000,24141=>1000,24142=>1000,24143=>1000,24144=>1000,24145=>1000,24146=>1000,24147=>1000, -24148=>1000,24149=>1000,24150=>1000,24151=>1000,24152=>1000,24153=>1000,24154=>1000,24155=>1000,24156=>1000,24157=>1000, -24158=>1000,24159=>1000,24160=>1000,24161=>1000,24162=>1000,24163=>1000,24164=>1000,24165=>1000,24166=>1000,24167=>1000, -24168=>1000,24169=>1000,24170=>1000,24171=>1000,24172=>1000,24173=>1000,24174=>1000,24175=>1000,24176=>1000,24177=>1000, -24178=>1000,24179=>1000,24180=>1000,24181=>1000,24182=>1000,24183=>1000,24184=>1000,24185=>1000,24186=>1000,24187=>1000, -24188=>1000,24189=>1000,24190=>1000,24191=>1000,24192=>1000,24193=>1000,24194=>1000,24195=>1000,24196=>1000,24197=>1000, -24198=>1000,24199=>1000,24200=>1000,24201=>1000,24202=>1000,24203=>1000,24204=>1000,24205=>1000,24206=>1000,24207=>1000, -24208=>1000,24209=>1000,24210=>1000,24211=>1000,24212=>1000,24213=>1000,24214=>1000,24215=>1000,24216=>1000,24217=>1000, -24218=>1000,24219=>1000,24220=>1000,24221=>1000,24222=>1000,24223=>1000,24224=>1000,24225=>1000,24226=>1000,24227=>1000, -24228=>1000,24229=>1000,24230=>1000,24231=>1000,24232=>1000,24233=>1000,24234=>1000,24235=>1000,24236=>1000,24237=>1000, -24238=>1000,24239=>1000,24240=>1000,24241=>1000,24242=>1000,24243=>1000,24244=>1000,24245=>1000,24246=>1000,24247=>1000, -24248=>1000,24249=>1000,24250=>1000,24251=>1000,24252=>1000,24253=>1000,24254=>1000,24255=>1000,24256=>1000,24257=>1000, -24258=>1000,24259=>1000,24260=>1000,24261=>1000,24262=>1000,24263=>1000,24264=>1000,24265=>1000,24266=>1000,24267=>1000, -24268=>1000,24269=>1000,24270=>1000,24271=>1000,24272=>1000,24273=>1000,24274=>1000,24275=>1000,24276=>1000,24277=>1000, -24278=>1000,24279=>1000,24280=>1000,24281=>1000,24282=>1000,24283=>1000,24284=>1000,24285=>1000,24286=>1000,24287=>1000, -24288=>1000,24289=>1000,24290=>1000,24291=>1000,24292=>1000,24293=>1000,24294=>1000,24295=>1000,24296=>1000,24297=>1000, -24298=>1000,24299=>1000,24300=>1000,24301=>1000,24302=>1000,24303=>1000,24304=>1000,24305=>1000,24306=>1000,24307=>1000, -24308=>1000,24309=>1000,24310=>1000,24311=>1000,24312=>1000,24313=>1000,24314=>1000,24315=>1000,24316=>1000,24317=>1000, -24318=>1000,24319=>1000,24320=>1000,24321=>1000,24322=>1000,24323=>1000,24324=>1000,24325=>1000,24326=>1000,24327=>1000, -24328=>1000,24329=>1000,24330=>1000,24331=>1000,24332=>1000,24333=>1000,24334=>1000,24335=>1000,24336=>1000,24337=>1000, -24338=>1000,24339=>1000,24340=>1000,24341=>1000,24342=>1000,24343=>1000,24344=>1000,24345=>1000,24346=>1000,24347=>1000, -24348=>1000,24349=>1000,24350=>1000,24351=>1000,24352=>1000,24353=>1000,24354=>1000,24355=>1000,24356=>1000,24357=>1000, -24358=>1000,24359=>1000,24360=>1000,24361=>1000,24362=>1000,24363=>1000,24364=>1000,24365=>1000,24366=>1000,24367=>1000, -24368=>1000,24369=>1000,24370=>1000,24371=>1000,24372=>1000,24373=>1000,24374=>1000,24375=>1000,24376=>1000,24377=>1000, -24378=>1000,24379=>1000,24380=>1000,24381=>1000,24382=>1000,24383=>1000,24384=>1000,24385=>1000,24386=>1000,24387=>1000, -24388=>1000,24389=>1000,24390=>1000,24391=>1000,24392=>1000,24393=>1000,24394=>1000,24395=>1000,24396=>1000,24397=>1000, -24398=>1000,24399=>1000,24400=>1000,24401=>1000,24402=>1000,24403=>1000,24404=>1000,24405=>1000,24406=>1000,24407=>1000, -24408=>1000,24409=>1000,24410=>1000,24411=>1000,24412=>1000,24413=>1000,24414=>1000,24415=>1000,24416=>1000,24417=>1000, -24418=>1000,24419=>1000,24420=>1000,24421=>1000,24422=>1000,24423=>1000,24424=>1000,24425=>1000,24426=>1000,24427=>1000, -24428=>1000,24429=>1000,24430=>1000,24431=>1000,24432=>1000,24433=>1000,24434=>1000,24435=>1000,24436=>1000,24437=>1000, -24438=>1000,24439=>1000,24440=>1000,24441=>1000,24442=>1000,24443=>1000,24444=>1000,24445=>1000,24446=>1000,24447=>1000, -24448=>1000,24449=>1000,24450=>1000,24451=>1000,24452=>1000,24453=>1000,24454=>1000,24455=>1000,24456=>1000,24457=>1000, -24458=>1000,24459=>1000,24460=>1000,24461=>1000,24462=>1000,24463=>1000,24464=>1000,24465=>1000,24466=>1000,24467=>1000, -24468=>1000,24469=>1000,24470=>1000,24471=>1000,24472=>1000,24473=>1000,24474=>1000,24475=>1000,24476=>1000,24477=>1000, -24478=>1000,24479=>1000,24480=>1000,24481=>1000,24482=>1000,24483=>1000,24484=>1000,24485=>1000,24486=>1000,24487=>1000, -24488=>1000,24489=>1000,24490=>1000,24491=>1000,24492=>1000,24493=>1000,24494=>1000,24495=>1000,24496=>1000,24497=>1000, -24498=>1000,24499=>1000,24500=>1000,24501=>1000,24502=>1000,24503=>1000,24504=>1000,24505=>1000,24506=>1000,24507=>1000, -24508=>1000,24509=>1000,24510=>1000,24511=>1000,24512=>1000,24513=>1000,24514=>1000,24515=>1000,24516=>1000,24517=>1000, -24518=>1000,24519=>1000,24520=>1000,24521=>1000,24522=>1000,24523=>1000,24524=>1000,24525=>1000,24526=>1000,24527=>1000, -24528=>1000,24529=>1000,24530=>1000,24531=>1000,24532=>1000,24533=>1000,24534=>1000,24535=>1000,24536=>1000,24537=>1000, -24538=>1000,24539=>1000,24540=>1000,24541=>1000,24542=>1000,24543=>1000,24544=>1000,24545=>1000,24546=>1000,24547=>1000, -24548=>1000,24549=>1000,24550=>1000,24551=>1000,24552=>1000,24553=>1000,24554=>1000,24555=>1000,24556=>1000,24557=>1000, -24558=>1000,24559=>1000,24560=>1000,24561=>1000,24562=>1000,24563=>1000,24564=>1000,24565=>1000,24566=>1000,24567=>1000, -24568=>1000,24569=>1000,24570=>1000,24571=>1000,24572=>1000,24573=>1000,24574=>1000,24575=>1000,24576=>1000,24577=>1000, -24578=>1000,24579=>1000,24580=>1000,24581=>1000,24582=>1000,24583=>1000,24584=>1000,24585=>1000,24586=>1000,24587=>1000, -24588=>1000,24589=>1000,24590=>1000,24591=>1000,24592=>1000,24593=>1000,24594=>1000,24595=>1000,24596=>1000,24597=>1000, -24598=>1000,24599=>1000,24600=>1000,24601=>1000,24602=>1000,24603=>1000,24604=>1000,24605=>1000,24606=>1000,24607=>1000, -24608=>1000,24609=>1000,24610=>1000,24611=>1000,24612=>1000,24613=>1000,24614=>1000,24615=>1000,24616=>1000,24617=>1000, -24618=>1000,24619=>1000,24620=>1000,24621=>1000,24622=>1000,24623=>1000,24624=>1000,24625=>1000,24626=>1000,24627=>1000, -24628=>1000,24629=>1000,24630=>1000,24631=>1000,24632=>1000,24633=>1000,24634=>1000,24635=>1000,24636=>1000,24637=>1000, -24638=>1000,24639=>1000,24640=>1000,24641=>1000,24642=>1000,24643=>1000,24644=>1000,24645=>1000,24646=>1000,24647=>1000, -24648=>1000,24649=>1000,24650=>1000,24651=>1000,24652=>1000,24653=>1000,24654=>1000,24655=>1000,24656=>1000,24657=>1000, -24658=>1000,24659=>1000,24660=>1000,24661=>1000,24662=>1000,24663=>1000,24664=>1000,24665=>1000,24666=>1000,24667=>1000, -24668=>1000,24669=>1000,24670=>1000,24671=>1000,24672=>1000,24673=>1000,24674=>1000,24675=>1000,24676=>1000,24677=>1000, -24678=>1000,24679=>1000,24680=>1000,24681=>1000,24682=>1000,24683=>1000,24684=>1000,24685=>1000,24686=>1000,24687=>1000, -24688=>1000,24689=>1000,24690=>1000,24691=>1000,24692=>1000,24693=>1000,24694=>1000,24695=>1000,24696=>1000,24697=>1000, -24698=>1000,24699=>1000,24700=>1000,24701=>1000,24702=>1000,24703=>1000,24704=>1000,24705=>1000,24706=>1000,24707=>1000, -24708=>1000,24709=>1000,24710=>1000,24711=>1000,24712=>1000,24713=>1000,24714=>1000,24715=>1000,24716=>1000,24717=>1000, -24718=>1000,24719=>1000,24720=>1000,24721=>1000,24722=>1000,24723=>1000,24724=>1000,24725=>1000,24726=>1000,24727=>1000, -24728=>1000,24729=>1000,24730=>1000,24731=>1000,24732=>1000,24733=>1000,24734=>1000,24735=>1000,24736=>1000,24737=>1000, -24738=>1000,24739=>1000,24740=>1000,24741=>1000,24742=>1000,24743=>1000,24744=>1000,24745=>1000,24746=>1000,24747=>1000, -24748=>1000,24749=>1000,24750=>1000,24751=>1000,24752=>1000,24753=>1000,24754=>1000,24755=>1000,24756=>1000,24757=>1000, -24758=>1000,24759=>1000,24760=>1000,24761=>1000,24762=>1000,24763=>1000,24764=>1000,24765=>1000,24766=>1000,24767=>1000, -24768=>1000,24769=>1000,24770=>1000,24771=>1000,24772=>1000,24773=>1000,24774=>1000,24775=>1000,24776=>1000,24777=>1000, -24778=>1000,24779=>1000,24780=>1000,24781=>1000,24782=>1000,24783=>1000,24784=>1000,24785=>1000,24786=>1000,24787=>1000, -24788=>1000,24789=>1000,24790=>1000,24791=>1000,24792=>1000,24793=>1000,24794=>1000,24795=>1000,24796=>1000,24797=>1000, -24798=>1000,24799=>1000,24800=>1000,24801=>1000,24802=>1000,24803=>1000,24804=>1000,24805=>1000,24806=>1000,24807=>1000, -24808=>1000,24809=>1000,24810=>1000,24811=>1000,24812=>1000,24813=>1000,24814=>1000,24815=>1000,24816=>1000,24817=>1000, -24818=>1000,24819=>1000,24820=>1000,24821=>1000,24822=>1000,24823=>1000,24824=>1000,24825=>1000,24826=>1000,24827=>1000, -24828=>1000,24829=>1000,24830=>1000,24831=>1000,24832=>1000,24833=>1000,24834=>1000,24835=>1000,24836=>1000,24837=>1000, -24838=>1000,24839=>1000,24840=>1000,24841=>1000,24842=>1000,24843=>1000,24844=>1000,24845=>1000,24846=>1000,24847=>1000, -24848=>1000,24849=>1000,24850=>1000,24851=>1000,24852=>1000,24853=>1000,24854=>1000,24855=>1000,24856=>1000,24857=>1000, -24858=>1000,24859=>1000,24860=>1000,24861=>1000,24862=>1000,24863=>1000,24864=>1000,24865=>1000,24866=>1000,24867=>1000, -24868=>1000,24869=>1000,24870=>1000,24871=>1000,24872=>1000,24873=>1000,24874=>1000,24875=>1000,24876=>1000,24877=>1000, -24878=>1000,24879=>1000,24880=>1000,24881=>1000,24882=>1000,24883=>1000,24884=>1000,24885=>1000,24886=>1000,24887=>1000, -24888=>1000,24889=>1000,24890=>1000,24891=>1000,24892=>1000,24893=>1000,24894=>1000,24895=>1000,24896=>1000,24897=>1000, -24898=>1000,24899=>1000,24900=>1000,24901=>1000,24902=>1000,24903=>1000,24904=>1000,24905=>1000,24906=>1000,24907=>1000, -24908=>1000,24909=>1000,24910=>1000,24911=>1000,24912=>1000,24913=>1000,24914=>1000,24915=>1000,24916=>1000,24917=>1000, -24918=>1000,24919=>1000,24920=>1000,24921=>1000,24922=>1000,24923=>1000,24924=>1000,24925=>1000,24926=>1000,24927=>1000, -24928=>1000,24929=>1000,24930=>1000,24931=>1000,24932=>1000,24933=>1000,24934=>1000,24935=>1000,24936=>1000,24937=>1000, -24938=>1000,24939=>1000,24940=>1000,24941=>1000,24942=>1000,24943=>1000,24944=>1000,24945=>1000,24946=>1000,24947=>1000, -24948=>1000,24949=>1000,24950=>1000,24951=>1000,24952=>1000,24953=>1000,24954=>1000,24955=>1000,24956=>1000,24957=>1000, -24958=>1000,24959=>1000,24960=>1000,24961=>1000,24962=>1000,24963=>1000,24964=>1000,24965=>1000,24966=>1000,24967=>1000, -24968=>1000,24969=>1000,24970=>1000,24971=>1000,24972=>1000,24973=>1000,24974=>1000,24975=>1000,24976=>1000,24977=>1000, -24978=>1000,24979=>1000,24980=>1000,24981=>1000,24982=>1000,24983=>1000,24984=>1000,24985=>1000,24986=>1000,24987=>1000, -24988=>1000,24989=>1000,24990=>1000,24991=>1000,24992=>1000,24993=>1000,24994=>1000,24995=>1000,24996=>1000,24997=>1000, -24998=>1000,24999=>1000,25000=>1000,25001=>1000,25002=>1000,25003=>1000,25004=>1000,25005=>1000,25006=>1000,25007=>1000, -25008=>1000,25009=>1000,25010=>1000,25011=>1000,25012=>1000,25013=>1000,25014=>1000,25015=>1000,25016=>1000,25017=>1000, -25018=>1000,25019=>1000,25020=>1000,25021=>1000,25022=>1000,25023=>1000,25024=>1000,25025=>1000,25026=>1000,25027=>1000, -25028=>1000,25029=>1000,25030=>1000,25031=>1000,25032=>1000,25033=>1000,25034=>1000,25035=>1000,25036=>1000,25037=>1000, -25038=>1000,25039=>1000,25040=>1000,25041=>1000,25042=>1000,25043=>1000,25044=>1000,25045=>1000,25046=>1000,25047=>1000, -25048=>1000,25049=>1000,25050=>1000,25051=>1000,25052=>1000,25053=>1000,25054=>1000,25055=>1000,25056=>1000,25057=>1000, -25058=>1000,25059=>1000,25060=>1000,25061=>1000,25062=>1000,25063=>1000,25064=>1000,25065=>1000,25066=>1000,25067=>1000, -25068=>1000,25069=>1000,25070=>1000,25071=>1000,25072=>1000,25073=>1000,25074=>1000,25075=>1000,25076=>1000,25077=>1000, -25078=>1000,25079=>1000,25080=>1000,25081=>1000,25082=>1000,25083=>1000,25084=>1000,25085=>1000,25086=>1000,25087=>1000, -25088=>1000,25089=>1000,25090=>1000,25091=>1000,25092=>1000,25093=>1000,25094=>1000,25095=>1000,25096=>1000,25097=>1000, -25098=>1000,25099=>1000,25100=>1000,25101=>1000,25102=>1000,25103=>1000,25104=>1000,25105=>1000,25106=>1000,25107=>1000, -25108=>1000,25109=>1000,25110=>1000,25111=>1000,25112=>1000,25113=>1000,25114=>1000,25115=>1000,25116=>1000,25117=>1000, -25118=>1000,25119=>1000,25120=>1000,25121=>1000,25122=>1000,25123=>1000,25124=>1000,25125=>1000,25126=>1000,25127=>1000, -25128=>1000,25129=>1000,25130=>1000,25131=>1000,25132=>1000,25133=>1000,25134=>1000,25135=>1000,25136=>1000,25137=>1000, -25138=>1000,25139=>1000,25140=>1000,25141=>1000,25142=>1000,25143=>1000,25144=>1000,25145=>1000,25146=>1000,25147=>1000, -25148=>1000,25149=>1000,25150=>1000,25151=>1000,25152=>1000,25153=>1000,25154=>1000,25155=>1000,25156=>1000,25157=>1000, -25158=>1000,25159=>1000,25160=>1000,25161=>1000,25162=>1000,25163=>1000,25164=>1000,25165=>1000,25166=>1000,25167=>1000, -25168=>1000,25169=>1000,25170=>1000,25171=>1000,25172=>1000,25173=>1000,25174=>1000,25175=>1000,25176=>1000,25177=>1000, -25178=>1000,25179=>1000,25180=>1000,25181=>1000,25182=>1000,25183=>1000,25184=>1000,25185=>1000,25186=>1000,25187=>1000, -25188=>1000,25189=>1000,25190=>1000,25191=>1000,25192=>1000,25193=>1000,25194=>1000,25195=>1000,25196=>1000,25197=>1000, -25198=>1000,25199=>1000,25200=>1000,25201=>1000,25202=>1000,25203=>1000,25204=>1000,25205=>1000,25206=>1000,25207=>1000, -25208=>1000,25209=>1000,25210=>1000,25211=>1000,25212=>1000,25213=>1000,25214=>1000,25215=>1000,25216=>1000,25217=>1000, -25218=>1000,25219=>1000,25220=>1000,25221=>1000,25222=>1000,25223=>1000,25224=>1000,25225=>1000,25226=>1000,25227=>1000, -25228=>1000,25229=>1000,25230=>1000,25231=>1000,25232=>1000,25233=>1000,25234=>1000,25235=>1000,25236=>1000,25237=>1000, -25238=>1000,25239=>1000,25240=>1000,25241=>1000,25242=>1000,25243=>1000,25244=>1000,25245=>1000,25246=>1000,25247=>1000, -25248=>1000,25249=>1000,25250=>1000,25251=>1000,25252=>1000,25253=>1000,25254=>1000,25255=>1000,25256=>1000,25257=>1000, -25258=>1000,25259=>1000,25260=>1000,25261=>1000,25262=>1000,25263=>1000,25264=>1000,25265=>1000,25266=>1000,25267=>1000, -25268=>1000,25269=>1000,25270=>1000,25271=>1000,25272=>1000,25273=>1000,25274=>1000,25275=>1000,25276=>1000,25277=>1000, -25278=>1000,25279=>1000,25280=>1000,25281=>1000,25282=>1000,25283=>1000,25284=>1000,25285=>1000,25286=>1000,25287=>1000, -25288=>1000,25289=>1000,25290=>1000,25291=>1000,25292=>1000,25293=>1000,25294=>1000,25295=>1000,25296=>1000,25297=>1000, -25298=>1000,25299=>1000,25300=>1000,25301=>1000,25302=>1000,25303=>1000,25304=>1000,25305=>1000,25306=>1000,25307=>1000, -25308=>1000,25309=>1000,25310=>1000,25311=>1000,25312=>1000,25313=>1000,25314=>1000,25315=>1000,25316=>1000,25317=>1000, -25318=>1000,25319=>1000,25320=>1000,25321=>1000,25322=>1000,25323=>1000,25324=>1000,25325=>1000,25326=>1000,25327=>1000, -25328=>1000,25329=>1000,25330=>1000,25331=>1000,25332=>1000,25333=>1000,25334=>1000,25335=>1000,25336=>1000,25337=>1000, -25338=>1000,25339=>1000,25340=>1000,25341=>1000,25342=>1000,25343=>1000,25344=>1000,25345=>1000,25346=>1000,25347=>1000, -25348=>1000,25349=>1000,25350=>1000,25351=>1000,25352=>1000,25353=>1000,25354=>1000,25355=>1000,25356=>1000,25357=>1000, -25358=>1000,25359=>1000,25360=>1000,25361=>1000,25362=>1000,25363=>1000,25364=>1000,25365=>1000,25366=>1000,25367=>1000, -25368=>1000,25369=>1000,25370=>1000,25371=>1000,25372=>1000,25373=>1000,25374=>1000,25375=>1000,25376=>1000,25377=>1000, -25378=>1000,25379=>1000,25380=>1000,25381=>1000,25382=>1000,25383=>1000,25384=>1000,25385=>1000,25386=>1000,25387=>1000, -25388=>1000,25389=>1000,25390=>1000,25391=>1000,25392=>1000,25393=>1000,25394=>1000,25395=>1000,25396=>1000,25397=>1000, -25398=>1000,25399=>1000,25400=>1000,25401=>1000,25402=>1000,25403=>1000,25404=>1000,25405=>1000,25406=>1000,25407=>1000, -25408=>1000,25409=>1000,25410=>1000,25411=>1000,25412=>1000,25413=>1000,25414=>1000,25415=>1000,25416=>1000,25417=>1000, -25418=>1000,25419=>1000,25420=>1000,25421=>1000,25422=>1000,25423=>1000,25424=>1000,25425=>1000,25426=>1000,25427=>1000, -25428=>1000,25429=>1000,25430=>1000,25431=>1000,25432=>1000,25433=>1000,25434=>1000,25435=>1000,25436=>1000,25437=>1000, -25438=>1000,25439=>1000,25440=>1000,25441=>1000,25442=>1000,25443=>1000,25444=>1000,25445=>1000,25446=>1000,25447=>1000, -25448=>1000,25449=>1000,25450=>1000,25451=>1000,25452=>1000,25453=>1000,25454=>1000,25455=>1000,25456=>1000,25457=>1000, -25458=>1000,25459=>1000,25460=>1000,25461=>1000,25462=>1000,25463=>1000,25464=>1000,25465=>1000,25466=>1000,25467=>1000, -25468=>1000,25469=>1000,25470=>1000,25471=>1000,25472=>1000,25473=>1000,25474=>1000,25475=>1000,25476=>1000,25477=>1000, -25478=>1000,25479=>1000,25480=>1000,25481=>1000,25482=>1000,25483=>1000,25484=>1000,25485=>1000,25486=>1000,25487=>1000, -25488=>1000,25489=>1000,25490=>1000,25491=>1000,25492=>1000,25493=>1000,25494=>1000,25495=>1000,25496=>1000,25497=>1000, -25498=>1000,25499=>1000,25500=>1000,25501=>1000,25502=>1000,25503=>1000,25504=>1000,25505=>1000,25506=>1000,25507=>1000, -25508=>1000,25509=>1000,25510=>1000,25511=>1000,25512=>1000,25513=>1000,25514=>1000,25515=>1000,25516=>1000,25517=>1000, -25518=>1000,25519=>1000,25520=>1000,25521=>1000,25522=>1000,25523=>1000,25524=>1000,25525=>1000,25526=>1000,25527=>1000, -25528=>1000,25529=>1000,25530=>1000,25531=>1000,25532=>1000,25533=>1000,25534=>1000,25535=>1000,25536=>1000,25537=>1000, -25538=>1000,25539=>1000,25540=>1000,25541=>1000,25542=>1000,25543=>1000,25544=>1000,25545=>1000,25546=>1000,25547=>1000, -25548=>1000,25549=>1000,25550=>1000,25551=>1000,25552=>1000,25553=>1000,25554=>1000,25555=>1000,25556=>1000,25557=>1000, -25558=>1000,25559=>1000,25560=>1000,25561=>1000,25562=>1000,25563=>1000,25564=>1000,25565=>1000,25566=>1000,25567=>1000, -25568=>1000,25569=>1000,25570=>1000,25571=>1000,25572=>1000,25573=>1000,25574=>1000,25575=>1000,25576=>1000,25577=>1000, -25578=>1000,25579=>1000,25580=>1000,25581=>1000,25582=>1000,25583=>1000,25584=>1000,25585=>1000,25586=>1000,25587=>1000, -25588=>1000,25589=>1000,25590=>1000,25591=>1000,25592=>1000,25593=>1000,25594=>1000,25595=>1000,25596=>1000,25597=>1000, -25598=>1000,25599=>1000,25600=>1000,25601=>1000,25602=>1000,25603=>1000,25604=>1000,25605=>1000,25606=>1000,25607=>1000, -25608=>1000,25609=>1000,25610=>1000,25611=>1000,25612=>1000,25613=>1000,25614=>1000,25615=>1000,25616=>1000,25617=>1000, -25618=>1000,25619=>1000,25620=>1000,25621=>1000,25622=>1000,25623=>1000,25624=>1000,25625=>1000,25626=>1000,25627=>1000, -25628=>1000,25629=>1000,25630=>1000,25631=>1000,25632=>1000,25633=>1000,25634=>1000,25635=>1000,25636=>1000,25637=>1000, -25638=>1000,25639=>1000,25640=>1000,25641=>1000,25642=>1000,25643=>1000,25644=>1000,25645=>1000,25646=>1000,25647=>1000, -25648=>1000,25649=>1000,25650=>1000,25651=>1000,25652=>1000,25653=>1000,25654=>1000,25655=>1000,25656=>1000,25657=>1000, -25658=>1000,25659=>1000,25660=>1000,25661=>1000,25662=>1000,25663=>1000,25664=>1000,25665=>1000,25666=>1000,25667=>1000, -25668=>1000,25669=>1000,25670=>1000,25671=>1000,25672=>1000,25673=>1000,25674=>1000,25675=>1000,25676=>1000,25677=>1000, -25678=>1000,25679=>1000,25680=>1000,25681=>1000,25682=>1000,25683=>1000,25684=>1000,25685=>1000,25686=>1000,25687=>1000, -25688=>1000,25689=>1000,25690=>1000,25691=>1000,25692=>1000,25693=>1000,25694=>1000,25695=>1000,25696=>1000,25697=>1000, -25698=>1000,25699=>1000,25700=>1000,25701=>1000,25702=>1000,25703=>1000,25704=>1000,25705=>1000,25706=>1000,25707=>1000, -25708=>1000,25709=>1000,25710=>1000,25711=>1000,25712=>1000,25713=>1000,25714=>1000,25715=>1000,25716=>1000,25717=>1000, -25718=>1000,25719=>1000,25720=>1000,25721=>1000,25722=>1000,25723=>1000,25724=>1000,25725=>1000,25726=>1000,25727=>1000, -25728=>1000,25729=>1000,25730=>1000,25731=>1000,25732=>1000,25733=>1000,25734=>1000,25735=>1000,25736=>1000,25737=>1000, -25738=>1000,25739=>1000,25740=>1000,25741=>1000,25742=>1000,25743=>1000,25744=>1000,25745=>1000,25746=>1000,25747=>1000, -25748=>1000,25749=>1000,25750=>1000,25751=>1000,25752=>1000,25753=>1000,25754=>1000,25755=>1000,25756=>1000,25757=>1000, -25758=>1000,25759=>1000,25760=>1000,25761=>1000,25762=>1000,25763=>1000,25764=>1000,25765=>1000,25766=>1000,25767=>1000, -25768=>1000,25769=>1000,25770=>1000,25771=>1000,25772=>1000,25773=>1000,25774=>1000,25775=>1000,25776=>1000,25777=>1000, -25778=>1000,25779=>1000,25780=>1000,25781=>1000,25782=>1000,25783=>1000,25784=>1000,25785=>1000,25786=>1000,25787=>1000, -25788=>1000,25789=>1000,25790=>1000,25791=>1000,25792=>1000,25793=>1000,25794=>1000,25795=>1000,25796=>1000,25797=>1000, -25798=>1000,25799=>1000,25800=>1000,25801=>1000,25802=>1000,25803=>1000,25804=>1000,25805=>1000,25806=>1000,25807=>1000, -25808=>1000,25809=>1000,25810=>1000,25811=>1000,25812=>1000,25813=>1000,25814=>1000,25815=>1000,25816=>1000,25817=>1000, -25818=>1000,25819=>1000,25820=>1000,25821=>1000,25822=>1000,25823=>1000,25824=>1000,25825=>1000,25826=>1000,25827=>1000, -25828=>1000,25829=>1000,25830=>1000,25831=>1000,25832=>1000,25833=>1000,25834=>1000,25835=>1000,25836=>1000,25837=>1000, -25838=>1000,25839=>1000,25840=>1000,25841=>1000,25842=>1000,25843=>1000,25844=>1000,25845=>1000,25846=>1000,25847=>1000, -25848=>1000,25849=>1000,25850=>1000,25851=>1000,25852=>1000,25853=>1000,25854=>1000,25855=>1000,25856=>1000,25857=>1000, -25858=>1000,25859=>1000,25860=>1000,25861=>1000,25862=>1000,25863=>1000,25864=>1000,25865=>1000,25866=>1000,25867=>1000, -25868=>1000,25869=>1000,25870=>1000,25871=>1000,25872=>1000,25873=>1000,25874=>1000,25875=>1000,25876=>1000,25877=>1000, -25878=>1000,25879=>1000,25880=>1000,25881=>1000,25882=>1000,25883=>1000,25884=>1000,25885=>1000,25886=>1000,25887=>1000, -25888=>1000,25889=>1000,25890=>1000,25891=>1000,25892=>1000,25893=>1000,25894=>1000,25895=>1000,25896=>1000,25897=>1000, -25898=>1000,25899=>1000,25900=>1000,25901=>1000,25902=>1000,25903=>1000,25904=>1000,25905=>1000,25906=>1000,25907=>1000, -25908=>1000,25909=>1000,25910=>1000,25911=>1000,25912=>1000,25913=>1000,25914=>1000,25915=>1000,25916=>1000,25917=>1000, -25918=>1000,25919=>1000,25920=>1000,25921=>1000,25922=>1000,25923=>1000,25924=>1000,25925=>1000,25926=>1000,25927=>1000, -25928=>1000,25929=>1000,25930=>1000,25931=>1000,25932=>1000,25933=>1000,25934=>1000,25935=>1000,25936=>1000,25937=>1000, -25938=>1000,25939=>1000,25940=>1000,25941=>1000,25942=>1000,25943=>1000,25944=>1000,25945=>1000,25946=>1000,25947=>1000, -25948=>1000,25949=>1000,25950=>1000,25951=>1000,25952=>1000,25953=>1000,25954=>1000,25955=>1000,25956=>1000,25957=>1000, -25958=>1000,25959=>1000,25960=>1000,25961=>1000,25962=>1000,25963=>1000,25964=>1000,25965=>1000,25966=>1000,25967=>1000, -25968=>1000,25969=>1000,25970=>1000,25971=>1000,25972=>1000,25973=>1000,25974=>1000,25975=>1000,25976=>1000,25977=>1000, -25978=>1000,25979=>1000,25980=>1000,25981=>1000,25982=>1000,25983=>1000,25984=>1000,25985=>1000,25986=>1000,25987=>1000, -25988=>1000,25989=>1000,25990=>1000,25991=>1000,25992=>1000,25993=>1000,25994=>1000,25995=>1000,25996=>1000,25997=>1000, -25998=>1000,25999=>1000,26000=>1000,26001=>1000,26002=>1000,26003=>1000,26004=>1000,26005=>1000,26006=>1000,26007=>1000, -26008=>1000,26009=>1000,26010=>1000,26011=>1000,26012=>1000,26013=>1000,26014=>1000,26015=>1000,26016=>1000,26017=>1000, -26018=>1000,26019=>1000,26020=>1000,26021=>1000,26022=>1000,26023=>1000,26024=>1000,26025=>1000,26026=>1000,26027=>1000, -26028=>1000,26029=>1000,26030=>1000,26031=>1000,26032=>1000,26033=>1000,26034=>1000,26035=>1000,26036=>1000,26037=>1000, -26038=>1000,26039=>1000,26040=>1000,26041=>1000,26042=>1000,26043=>1000,26044=>1000,26045=>1000,26046=>1000,26047=>1000, -26048=>1000,26049=>1000,26050=>1000,26051=>1000,26052=>1000,26053=>1000,26054=>1000,26055=>1000,26056=>1000,26057=>1000, -26058=>1000,26059=>1000,26060=>1000,26061=>1000,26062=>1000,26063=>1000,26064=>1000,26065=>1000,26066=>1000,26067=>1000, -26068=>1000,26069=>1000,26070=>1000,26071=>1000,26072=>1000,26073=>1000,26074=>1000,26075=>1000,26076=>1000,26077=>1000, -26078=>1000,26079=>1000,26080=>1000,26081=>1000,26082=>1000,26083=>1000,26084=>1000,26085=>1000,26086=>1000,26087=>1000, -26088=>1000,26089=>1000,26090=>1000,26091=>1000,26092=>1000,26093=>1000,26094=>1000,26095=>1000,26096=>1000,26097=>1000, -26098=>1000,26099=>1000,26100=>1000,26101=>1000,26102=>1000,26103=>1000,26104=>1000,26105=>1000,26106=>1000,26107=>1000, -26108=>1000,26109=>1000,26110=>1000,26111=>1000,26112=>1000,26113=>1000,26114=>1000,26115=>1000,26116=>1000,26117=>1000, -26118=>1000,26119=>1000,26120=>1000,26121=>1000,26122=>1000,26123=>1000,26124=>1000,26125=>1000,26126=>1000,26127=>1000, -26128=>1000,26129=>1000,26130=>1000,26131=>1000,26132=>1000,26133=>1000,26134=>1000,26135=>1000,26136=>1000,26137=>1000, -26138=>1000,26139=>1000,26140=>1000,26141=>1000,26142=>1000,26143=>1000,26144=>1000,26145=>1000,26146=>1000,26147=>1000, -26148=>1000,26149=>1000,26150=>1000,26151=>1000,26152=>1000,26153=>1000,26154=>1000,26155=>1000,26156=>1000,26157=>1000, -26158=>1000,26159=>1000,26160=>1000,26161=>1000,26162=>1000,26163=>1000,26164=>1000,26165=>1000,26166=>1000,26167=>1000, -26168=>1000,26169=>1000,26170=>1000,26171=>1000,26172=>1000,26173=>1000,26174=>1000,26175=>1000,26176=>1000,26177=>1000, -26178=>1000,26179=>1000,26180=>1000,26181=>1000,26182=>1000,26183=>1000,26184=>1000,26185=>1000,26186=>1000,26187=>1000, -26188=>1000,26189=>1000,26190=>1000,26191=>1000,26192=>1000,26193=>1000,26194=>1000,26195=>1000,26196=>1000,26197=>1000, -26198=>1000,26199=>1000,26200=>1000,26201=>1000,26202=>1000,26203=>1000,26204=>1000,26205=>1000,26206=>1000,26207=>1000, -26208=>1000,26209=>1000,26210=>1000,26211=>1000,26212=>1000,26213=>1000,26214=>1000,26215=>1000,26216=>1000,26217=>1000, -26218=>1000,26219=>1000,26220=>1000,26221=>1000,26222=>1000,26223=>1000,26224=>1000,26225=>1000,26226=>1000,26227=>1000, -26228=>1000,26229=>1000,26230=>1000,26231=>1000,26232=>1000,26233=>1000,26234=>1000,26235=>1000,26236=>1000,26237=>1000, -26238=>1000,26239=>1000,26240=>1000,26241=>1000,26242=>1000,26243=>1000,26244=>1000,26245=>1000,26246=>1000,26247=>1000, -26248=>1000,26249=>1000,26250=>1000,26251=>1000,26252=>1000,26253=>1000,26254=>1000,26255=>1000,26256=>1000,26257=>1000, -26258=>1000,26259=>1000,26260=>1000,26261=>1000,26262=>1000,26263=>1000,26264=>1000,26265=>1000,26266=>1000,26267=>1000, -26268=>1000,26269=>1000,26270=>1000,26271=>1000,26272=>1000,26273=>1000,26274=>1000,26275=>1000,26276=>1000,26277=>1000, -26278=>1000,26279=>1000,26280=>1000,26281=>1000,26282=>1000,26283=>1000,26284=>1000,26285=>1000,26286=>1000,26287=>1000, -26288=>1000,26289=>1000,26290=>1000,26291=>1000,26292=>1000,26293=>1000,26294=>1000,26295=>1000,26296=>1000,26297=>1000, -26298=>1000,26299=>1000,26300=>1000,26301=>1000,26302=>1000,26303=>1000,26304=>1000,26305=>1000,26306=>1000,26307=>1000, -26308=>1000,26309=>1000,26310=>1000,26311=>1000,26312=>1000,26313=>1000,26314=>1000,26315=>1000,26316=>1000,26317=>1000, -26318=>1000,26319=>1000,26320=>1000,26321=>1000,26322=>1000,26323=>1000,26324=>1000,26325=>1000,26326=>1000,26327=>1000, -26328=>1000,26329=>1000,26330=>1000,26331=>1000,26332=>1000,26333=>1000,26334=>1000,26335=>1000,26336=>1000,26337=>1000, -26338=>1000,26339=>1000,26340=>1000,26341=>1000,26342=>1000,26343=>1000,26344=>1000,26345=>1000,26346=>1000,26347=>1000, -26348=>1000,26349=>1000,26350=>1000,26351=>1000,26352=>1000,26353=>1000,26354=>1000,26355=>1000,26356=>1000,26357=>1000, -26358=>1000,26359=>1000,26360=>1000,26361=>1000,26362=>1000,26363=>1000,26364=>1000,26365=>1000,26366=>1000,26367=>1000, -26368=>1000,26369=>1000,26370=>1000,26371=>1000,26372=>1000,26373=>1000,26374=>1000,26375=>1000,26376=>1000,26377=>1000, -26378=>1000,26379=>1000,26380=>1000,26381=>1000,26382=>1000,26383=>1000,26384=>1000,26385=>1000,26386=>1000,26387=>1000, -26388=>1000,26389=>1000,26390=>1000,26391=>1000,26392=>1000,26393=>1000,26394=>1000,26395=>1000,26396=>1000,26397=>1000, -26398=>1000,26399=>1000,26400=>1000,26401=>1000,26402=>1000,26403=>1000,26404=>1000,26405=>1000,26406=>1000,26407=>1000, -26408=>1000,26409=>1000,26410=>1000,26411=>1000,26412=>1000,26413=>1000,26414=>1000,26415=>1000,26416=>1000,26417=>1000, -26418=>1000,26419=>1000,26420=>1000,26421=>1000,26422=>1000,26423=>1000,26424=>1000,26425=>1000,26426=>1000,26427=>1000, -26428=>1000,26429=>1000,26430=>1000,26431=>1000,26432=>1000,26433=>1000,26434=>1000,26435=>1000,26436=>1000,26437=>1000, -26438=>1000,26439=>1000,26440=>1000,26441=>1000,26442=>1000,26443=>1000,26444=>1000,26445=>1000,26446=>1000,26447=>1000, -26448=>1000,26449=>1000,26450=>1000,26451=>1000,26452=>1000,26453=>1000,26454=>1000,26455=>1000,26456=>1000,26457=>1000, -26458=>1000,26459=>1000,26460=>1000,26461=>1000,26462=>1000,26463=>1000,26464=>1000,26465=>1000,26466=>1000,26467=>1000, -26468=>1000,26469=>1000,26470=>1000,26471=>1000,26472=>1000,26473=>1000,26474=>1000,26475=>1000,26476=>1000,26477=>1000, -26478=>1000,26479=>1000,26480=>1000,26481=>1000,26482=>1000,26483=>1000,26484=>1000,26485=>1000,26486=>1000,26487=>1000, -26488=>1000,26489=>1000,26490=>1000,26491=>1000,26492=>1000,26493=>1000,26494=>1000,26495=>1000,26496=>1000,26497=>1000, -26498=>1000,26499=>1000,26500=>1000,26501=>1000,26502=>1000,26503=>1000,26504=>1000,26505=>1000,26506=>1000,26507=>1000, -26508=>1000,26509=>1000,26510=>1000,26511=>1000,26512=>1000,26513=>1000,26514=>1000,26515=>1000,26516=>1000,26517=>1000, -26518=>1000,26519=>1000,26520=>1000,26521=>1000,26522=>1000,26523=>1000,26524=>1000,26525=>1000,26526=>1000,26527=>1000, -26528=>1000,26529=>1000,26530=>1000,26531=>1000,26532=>1000,26533=>1000,26534=>1000,26535=>1000,26536=>1000,26537=>1000, -26538=>1000,26539=>1000,26540=>1000,26541=>1000,26542=>1000,26543=>1000,26544=>1000,26545=>1000,26546=>1000,26547=>1000, -26548=>1000,26549=>1000,26550=>1000,26551=>1000,26552=>1000,26553=>1000,26554=>1000,26555=>1000,26556=>1000,26557=>1000, -26558=>1000,26559=>1000,26560=>1000,26561=>1000,26562=>1000,26563=>1000,26564=>1000,26565=>1000,26566=>1000,26567=>1000, -26568=>1000,26569=>1000,26570=>1000,26571=>1000,26572=>1000,26573=>1000,26574=>1000,26575=>1000,26576=>1000,26577=>1000, -26578=>1000,26579=>1000,26580=>1000,26581=>1000,26582=>1000,26583=>1000,26584=>1000,26585=>1000,26586=>1000,26587=>1000, -26588=>1000,26589=>1000,26590=>1000,26591=>1000,26592=>1000,26593=>1000,26594=>1000,26595=>1000,26596=>1000,26597=>1000, -26598=>1000,26599=>1000,26600=>1000,26601=>1000,26602=>1000,26603=>1000,26604=>1000,26605=>1000,26606=>1000,26607=>1000, -26608=>1000,26609=>1000,26610=>1000,26611=>1000,26612=>1000,26613=>1000,26614=>1000,26615=>1000,26616=>1000,26617=>1000, -26618=>1000,26619=>1000,26620=>1000,26621=>1000,26622=>1000,26623=>1000,26624=>1000,26625=>1000,26626=>1000,26627=>1000, -26628=>1000,26629=>1000,26630=>1000,26631=>1000,26632=>1000,26633=>1000,26634=>1000,26635=>1000,26636=>1000,26637=>1000, -26638=>1000,26639=>1000,26640=>1000,26641=>1000,26642=>1000,26643=>1000,26644=>1000,26645=>1000,26646=>1000,26647=>1000, -26648=>1000,26649=>1000,26650=>1000,26651=>1000,26652=>1000,26653=>1000,26654=>1000,26655=>1000,26656=>1000,26657=>1000, -26658=>1000,26659=>1000,26660=>1000,26661=>1000,26662=>1000,26663=>1000,26664=>1000,26665=>1000,26666=>1000,26667=>1000, -26668=>1000,26669=>1000,26670=>1000,26671=>1000,26672=>1000,26673=>1000,26674=>1000,26675=>1000,26676=>1000,26677=>1000, -26678=>1000,26679=>1000,26680=>1000,26681=>1000,26682=>1000,26683=>1000,26684=>1000,26685=>1000,26686=>1000,26687=>1000, -26688=>1000,26689=>1000,26690=>1000,26691=>1000,26692=>1000,26693=>1000,26694=>1000,26695=>1000,26696=>1000,26697=>1000, -26698=>1000,26699=>1000,26700=>1000,26701=>1000,26702=>1000,26703=>1000,26704=>1000,26705=>1000,26706=>1000,26707=>1000, -26708=>1000,26709=>1000,26710=>1000,26711=>1000,26712=>1000,26713=>1000,26714=>1000,26715=>1000,26716=>1000,26717=>1000, -26718=>1000,26719=>1000,26720=>1000,26721=>1000,26722=>1000,26723=>1000,26724=>1000,26725=>1000,26726=>1000,26727=>1000, -26728=>1000,26729=>1000,26730=>1000,26731=>1000,26732=>1000,26733=>1000,26734=>1000,26735=>1000,26736=>1000,26737=>1000, -26738=>1000,26739=>1000,26740=>1000,26741=>1000,26742=>1000,26743=>1000,26744=>1000,26745=>1000,26746=>1000,26747=>1000, -26748=>1000,26749=>1000,26750=>1000,26751=>1000,26752=>1000,26753=>1000,26754=>1000,26755=>1000,26756=>1000,26757=>1000, -26758=>1000,26759=>1000,26760=>1000,26761=>1000,26762=>1000,26763=>1000,26764=>1000,26765=>1000,26766=>1000,26767=>1000, -26768=>1000,26769=>1000,26770=>1000,26771=>1000,26772=>1000,26773=>1000,26774=>1000,26775=>1000,26776=>1000,26777=>1000, -26778=>1000,26779=>1000,26780=>1000,26781=>1000,26782=>1000,26783=>1000,26784=>1000,26785=>1000,26786=>1000,26787=>1000, -26788=>1000,26789=>1000,26790=>1000,26791=>1000,26792=>1000,26793=>1000,26794=>1000,26795=>1000,26796=>1000,26797=>1000, -26798=>1000,26799=>1000,26800=>1000,26801=>1000,26802=>1000,26803=>1000,26804=>1000,26805=>1000,26806=>1000,26807=>1000, -26808=>1000,26809=>1000,26810=>1000,26811=>1000,26812=>1000,26813=>1000,26814=>1000,26815=>1000,26816=>1000,26817=>1000, -26818=>1000,26819=>1000,26820=>1000,26821=>1000,26822=>1000,26823=>1000,26824=>1000,26825=>1000,26826=>1000,26827=>1000, -26828=>1000,26829=>1000,26830=>1000,26831=>1000,26832=>1000,26833=>1000,26834=>1000,26835=>1000,26836=>1000,26837=>1000, -26838=>1000,26839=>1000,26840=>1000,26841=>1000,26842=>1000,26843=>1000,26844=>1000,26845=>1000,26846=>1000,26847=>1000, -26848=>1000,26849=>1000,26850=>1000,26851=>1000,26852=>1000,26853=>1000,26854=>1000,26855=>1000,26856=>1000,26857=>1000, -26858=>1000,26859=>1000,26860=>1000,26861=>1000,26862=>1000,26863=>1000,26864=>1000,26865=>1000,26866=>1000,26867=>1000, -26868=>1000,26869=>1000,26870=>1000,26871=>1000,26872=>1000,26873=>1000,26874=>1000,26875=>1000,26876=>1000,26877=>1000, -26878=>1000,26879=>1000,26880=>1000,26881=>1000,26882=>1000,26883=>1000,26884=>1000,26885=>1000,26886=>1000,26887=>1000, -26888=>1000,26889=>1000,26890=>1000,26891=>1000,26892=>1000,26893=>1000,26894=>1000,26895=>1000,26896=>1000,26897=>1000, -26898=>1000,26899=>1000,26900=>1000,26901=>1000,26902=>1000,26903=>1000,26904=>1000,26905=>1000,26906=>1000,26907=>1000, -26908=>1000,26909=>1000,26910=>1000,26911=>1000,26912=>1000,26913=>1000,26914=>1000,26915=>1000,26916=>1000,26917=>1000, -26918=>1000,26919=>1000,26920=>1000,26921=>1000,26922=>1000,26923=>1000,26924=>1000,26925=>1000,26926=>1000,26927=>1000, -26928=>1000,26929=>1000,26930=>1000,26931=>1000,26932=>1000,26933=>1000,26934=>1000,26935=>1000,26936=>1000,26937=>1000, -26938=>1000,26939=>1000,26940=>1000,26941=>1000,26942=>1000,26943=>1000,26944=>1000,26945=>1000,26946=>1000,26947=>1000, -26948=>1000,26949=>1000,26950=>1000,26951=>1000,26952=>1000,26953=>1000,26954=>1000,26955=>1000,26956=>1000,26957=>1000, -26958=>1000,26959=>1000,26960=>1000,26961=>1000,26962=>1000,26963=>1000,26964=>1000,26965=>1000,26966=>1000,26967=>1000, -26968=>1000,26969=>1000,26970=>1000,26971=>1000,26972=>1000,26973=>1000,26974=>1000,26975=>1000,26976=>1000,26977=>1000, -26978=>1000,26979=>1000,26980=>1000,26981=>1000,26982=>1000,26983=>1000,26984=>1000,26985=>1000,26986=>1000,26987=>1000, -26988=>1000,26989=>1000,26990=>1000,26991=>1000,26992=>1000,26993=>1000,26994=>1000,26995=>1000,26996=>1000,26997=>1000, -26998=>1000,26999=>1000,27000=>1000,27001=>1000,27002=>1000,27003=>1000,27004=>1000,27005=>1000,27006=>1000,27007=>1000, -27008=>1000,27009=>1000,27010=>1000,27011=>1000,27012=>1000,27013=>1000,27014=>1000,27015=>1000,27016=>1000,27017=>1000, -27018=>1000,27019=>1000,27020=>1000,27021=>1000,27022=>1000,27023=>1000,27024=>1000,27025=>1000,27026=>1000,27027=>1000, -27028=>1000,27029=>1000,27030=>1000,27031=>1000,27032=>1000,27033=>1000,27034=>1000,27035=>1000,27036=>1000,27037=>1000, -27038=>1000,27039=>1000,27040=>1000,27041=>1000,27042=>1000,27043=>1000,27044=>1000,27045=>1000,27046=>1000,27047=>1000, -27048=>1000,27049=>1000,27050=>1000,27051=>1000,27052=>1000,27053=>1000,27054=>1000,27055=>1000,27056=>1000,27057=>1000, -27058=>1000,27059=>1000,27060=>1000,27061=>1000,27062=>1000,27063=>1000,27064=>1000,27065=>1000,27066=>1000,27067=>1000, -27068=>1000,27069=>1000,27070=>1000,27071=>1000,27072=>1000,27073=>1000,27074=>1000,27075=>1000,27076=>1000,27077=>1000, -27078=>1000,27079=>1000,27080=>1000,27081=>1000,27082=>1000,27083=>1000,27084=>1000,27085=>1000,27086=>1000,27087=>1000, -27088=>1000,27089=>1000,27090=>1000,27091=>1000,27092=>1000,27093=>1000,27094=>1000,27095=>1000,27096=>1000,27097=>1000, -27098=>1000,27099=>1000,27100=>1000,27101=>1000,27102=>1000,27103=>1000,27104=>1000,27105=>1000,27106=>1000,27107=>1000, -27108=>1000,27109=>1000,27110=>1000,27111=>1000,27112=>1000,27113=>1000,27114=>1000,27115=>1000,27116=>1000,27117=>1000, -27118=>1000,27119=>1000,27120=>1000,27121=>1000,27122=>1000,27123=>1000,27124=>1000,27125=>1000,27126=>1000,27127=>1000, -27128=>1000,27129=>1000,27130=>1000,27131=>1000,27132=>1000,27133=>1000,27134=>1000,27135=>1000,27136=>1000,27137=>1000, -27138=>1000,27139=>1000,27140=>1000,27141=>1000,27142=>1000,27143=>1000,27144=>1000,27145=>1000,27146=>1000,27147=>1000, -27148=>1000,27149=>1000,27150=>1000,27151=>1000,27152=>1000,27153=>1000,27154=>1000,27155=>1000,27156=>1000,27157=>1000, -27158=>1000,27159=>1000,27160=>1000,27161=>1000,27162=>1000,27163=>1000,27164=>1000,27165=>1000,27166=>1000,27167=>1000, -27168=>1000,27169=>1000,27170=>1000,27171=>1000,27172=>1000,27173=>1000,27174=>1000,27175=>1000,27176=>1000,27177=>1000, -27178=>1000,27179=>1000,27180=>1000,27181=>1000,27182=>1000,27183=>1000,27184=>1000,27185=>1000,27186=>1000,27187=>1000, -27188=>1000,27189=>1000,27190=>1000,27191=>1000,27192=>1000,27193=>1000,27194=>1000,27195=>1000,27196=>1000,27197=>1000, -27198=>1000,27199=>1000,27200=>1000,27201=>1000,27202=>1000,27203=>1000,27204=>1000,27205=>1000,27206=>1000,27207=>1000, -27208=>1000,27209=>1000,27210=>1000,27211=>1000,27212=>1000,27213=>1000,27214=>1000,27215=>1000,27216=>1000,27217=>1000, -27218=>1000,27219=>1000,27220=>1000,27221=>1000,27222=>1000,27223=>1000,27224=>1000,27225=>1000,27226=>1000,27227=>1000, -27228=>1000,27229=>1000,27230=>1000,27231=>1000,27232=>1000,27233=>1000,27234=>1000,27235=>1000,27236=>1000,27237=>1000, -27238=>1000,27239=>1000,27240=>1000,27241=>1000,27242=>1000,27243=>1000,27244=>1000,27245=>1000,27246=>1000,27247=>1000, -27248=>1000,27249=>1000,27250=>1000,27251=>1000,27252=>1000,27253=>1000,27254=>1000,27255=>1000,27256=>1000,27257=>1000, -27258=>1000,27259=>1000,27260=>1000,27261=>1000,27262=>1000,27263=>1000,27264=>1000,27265=>1000,27266=>1000,27267=>1000, -27268=>1000,27269=>1000,27270=>1000,27271=>1000,27272=>1000,27273=>1000,27274=>1000,27275=>1000,27276=>1000,27277=>1000, -27278=>1000,27279=>1000,27280=>1000,27281=>1000,27282=>1000,27283=>1000,27284=>1000,27285=>1000,27286=>1000,27287=>1000, -27288=>1000,27289=>1000,27290=>1000,27291=>1000,27292=>1000,27293=>1000,27294=>1000,27295=>1000,27296=>1000,27297=>1000, -27298=>1000,27299=>1000,27300=>1000,27301=>1000,27302=>1000,27303=>1000,27304=>1000,27305=>1000,27306=>1000,27307=>1000, -27308=>1000,27309=>1000,27310=>1000,27311=>1000,27312=>1000,27313=>1000,27314=>1000,27315=>1000,27316=>1000,27317=>1000, -27318=>1000,27319=>1000,27320=>1000,27321=>1000,27322=>1000,27323=>1000,27324=>1000,27325=>1000,27326=>1000,27327=>1000, -27328=>1000,27329=>1000,27330=>1000,27331=>1000,27332=>1000,27333=>1000,27334=>1000,27335=>1000,27336=>1000,27337=>1000, -27338=>1000,27339=>1000,27340=>1000,27341=>1000,27342=>1000,27343=>1000,27344=>1000,27345=>1000,27346=>1000,27347=>1000, -27348=>1000,27349=>1000,27350=>1000,27351=>1000,27352=>1000,27353=>1000,27354=>1000,27355=>1000,27356=>1000,27357=>1000, -27358=>1000,27359=>1000,27360=>1000,27361=>1000,27362=>1000,27363=>1000,27364=>1000,27365=>1000,27366=>1000,27367=>1000, -27368=>1000,27369=>1000,27370=>1000,27371=>1000,27372=>1000,27373=>1000,27374=>1000,27375=>1000,27376=>1000,27377=>1000, -27378=>1000,27379=>1000,27380=>1000,27381=>1000,27382=>1000,27383=>1000,27384=>1000,27385=>1000,27386=>1000,27387=>1000, -27388=>1000,27389=>1000,27390=>1000,27391=>1000,27392=>1000,27393=>1000,27394=>1000,27395=>1000,27396=>1000,27397=>1000, -27398=>1000,27399=>1000,27400=>1000,27401=>1000,27402=>1000,27403=>1000,27404=>1000,27405=>1000,27406=>1000,27407=>1000, -27408=>1000,27409=>1000,27410=>1000,27411=>1000,27412=>1000,27413=>1000,27414=>1000,27415=>1000,27416=>1000,27417=>1000, -27418=>1000,27419=>1000,27420=>1000,27421=>1000,27422=>1000,27423=>1000,27424=>1000,27425=>1000,27426=>1000,27427=>1000, -27428=>1000,27429=>1000,27430=>1000,27431=>1000,27432=>1000,27433=>1000,27434=>1000,27435=>1000,27436=>1000,27437=>1000, -27438=>1000,27439=>1000,27440=>1000,27441=>1000,27442=>1000,27443=>1000,27444=>1000,27445=>1000,27446=>1000,27447=>1000, -27448=>1000,27449=>1000,27450=>1000,27451=>1000,27452=>1000,27453=>1000,27454=>1000,27455=>1000,27456=>1000,27457=>1000, -27458=>1000,27459=>1000,27460=>1000,27461=>1000,27462=>1000,27463=>1000,27464=>1000,27465=>1000,27466=>1000,27467=>1000, -27468=>1000,27469=>1000,27470=>1000,27471=>1000,27472=>1000,27473=>1000,27474=>1000,27475=>1000,27476=>1000,27477=>1000, -27478=>1000,27479=>1000,27480=>1000,27481=>1000,27482=>1000,27483=>1000,27484=>1000,27485=>1000,27486=>1000,27487=>1000, -27488=>1000,27489=>1000,27490=>1000,27491=>1000,27492=>1000,27493=>1000,27494=>1000,27495=>1000,27496=>1000,27497=>1000, -27498=>1000,27499=>1000,27500=>1000,27501=>1000,27502=>1000,27503=>1000,27504=>1000,27505=>1000,27506=>1000,27507=>1000, -27508=>1000,27509=>1000,27510=>1000,27511=>1000,27512=>1000,27513=>1000,27514=>1000,27515=>1000,27516=>1000,27517=>1000, -27518=>1000,27519=>1000,27520=>1000,27521=>1000,27522=>1000,27523=>1000,27524=>1000,27525=>1000,27526=>1000,27527=>1000, -27528=>1000,27529=>1000,27530=>1000,27531=>1000,27532=>1000,27533=>1000,27534=>1000,27535=>1000,27536=>1000,27537=>1000, -27538=>1000,27539=>1000,27540=>1000,27541=>1000,27542=>1000,27543=>1000,27544=>1000,27545=>1000,27546=>1000,27547=>1000, -27548=>1000,27549=>1000,27550=>1000,27551=>1000,27552=>1000,27553=>1000,27554=>1000,27555=>1000,27556=>1000,27557=>1000, -27558=>1000,27559=>1000,27560=>1000,27561=>1000,27562=>1000,27563=>1000,27564=>1000,27565=>1000,27566=>1000,27567=>1000, -27568=>1000,27569=>1000,27570=>1000,27571=>1000,27572=>1000,27573=>1000,27574=>1000,27575=>1000,27576=>1000,27577=>1000, -27578=>1000,27579=>1000,27580=>1000,27581=>1000,27582=>1000,27583=>1000,27584=>1000,27585=>1000,27586=>1000,27587=>1000, -27588=>1000,27589=>1000,27590=>1000,27591=>1000,27592=>1000,27593=>1000,27594=>1000,27595=>1000,27596=>1000,27597=>1000, -27598=>1000,27599=>1000,27600=>1000,27601=>1000,27602=>1000,27603=>1000,27604=>1000,27605=>1000,27606=>1000,27607=>1000, -27608=>1000,27609=>1000,27610=>1000,27611=>1000,27612=>1000,27613=>1000,27614=>1000,27615=>1000,27616=>1000,27617=>1000, -27618=>1000,27619=>1000,27620=>1000,27621=>1000,27622=>1000,27623=>1000,27624=>1000,27625=>1000,27626=>1000,27627=>1000, -27628=>1000,27629=>1000,27630=>1000,27631=>1000,27632=>1000,27633=>1000,27634=>1000,27635=>1000,27636=>1000,27637=>1000, -27638=>1000,27639=>1000,27640=>1000,27641=>1000,27642=>1000,27643=>1000,27644=>1000,27645=>1000,27646=>1000,27647=>1000, -27648=>1000,27649=>1000,27650=>1000,27651=>1000,27652=>1000,27653=>1000,27654=>1000,27655=>1000,27656=>1000,27657=>1000, -27658=>1000,27659=>1000,27660=>1000,27661=>1000,27662=>1000,27663=>1000,27664=>1000,27665=>1000,27666=>1000,27667=>1000, -27668=>1000,27669=>1000,27670=>1000,27671=>1000,27672=>1000,27673=>1000,27674=>1000,27675=>1000,27676=>1000,27677=>1000, -27678=>1000,27679=>1000,27680=>1000,27681=>1000,27682=>1000,27683=>1000,27684=>1000,27685=>1000,27686=>1000,27687=>1000, -27688=>1000,27689=>1000,27690=>1000,27691=>1000,27692=>1000,27693=>1000,27694=>1000,27695=>1000,27696=>1000,27697=>1000, -27698=>1000,27699=>1000,27700=>1000,27701=>1000,27702=>1000,27703=>1000,27704=>1000,27705=>1000,27706=>1000,27707=>1000, -27708=>1000,27709=>1000,27710=>1000,27711=>1000,27712=>1000,27713=>1000,27714=>1000,27715=>1000,27716=>1000,27717=>1000, -27718=>1000,27719=>1000,27720=>1000,27721=>1000,27722=>1000,27723=>1000,27724=>1000,27725=>1000,27726=>1000,27727=>1000, -27728=>1000,27729=>1000,27730=>1000,27731=>1000,27732=>1000,27733=>1000,27734=>1000,27735=>1000,27736=>1000,27737=>1000, -27738=>1000,27739=>1000,27740=>1000,27741=>1000,27742=>1000,27743=>1000,27744=>1000,27745=>1000,27746=>1000,27747=>1000, -27748=>1000,27749=>1000,27750=>1000,27751=>1000,27752=>1000,27753=>1000,27754=>1000,27755=>1000,27756=>1000,27757=>1000, -27758=>1000,27759=>1000,27760=>1000,27761=>1000,27762=>1000,27763=>1000,27764=>1000,27765=>1000,27766=>1000,27767=>1000, -27768=>1000,27769=>1000,27770=>1000,27771=>1000,27772=>1000,27773=>1000,27774=>1000,27775=>1000,27776=>1000,27777=>1000, -27778=>1000,27779=>1000,27780=>1000,27781=>1000,27782=>1000,27783=>1000,27784=>1000,27785=>1000,27786=>1000,27787=>1000, -27788=>1000,27789=>1000,27790=>1000,27791=>1000,27792=>1000,27793=>1000,27794=>1000,27795=>1000,27796=>1000,27797=>1000, -27798=>1000,27799=>1000,27800=>1000,27801=>1000,27802=>1000,27803=>1000,27804=>1000,27805=>1000,27806=>1000,27807=>1000, -27808=>1000,27809=>1000,27810=>1000,27811=>1000,27812=>1000,27813=>1000,27814=>1000,27815=>1000,27816=>1000,27817=>1000, -27818=>1000,27819=>1000,27820=>1000,27821=>1000,27822=>1000,27823=>1000,27824=>1000,27825=>1000,27826=>1000,27827=>1000, -27828=>1000,27829=>1000,27830=>1000,27831=>1000,27832=>1000,27833=>1000,27834=>1000,27835=>1000,27836=>1000,27837=>1000, -27838=>1000,27839=>1000,27840=>1000,27841=>1000,27842=>1000,27843=>1000,27844=>1000,27845=>1000,27846=>1000,27847=>1000, -27848=>1000,27849=>1000,27850=>1000,27851=>1000,27852=>1000,27853=>1000,27854=>1000,27855=>1000,27856=>1000,27857=>1000, -27858=>1000,27859=>1000,27860=>1000,27861=>1000,27862=>1000,27863=>1000,27864=>1000,27865=>1000,27866=>1000,27867=>1000, -27868=>1000,27869=>1000,27870=>1000,27871=>1000,27872=>1000,27873=>1000,27874=>1000,27875=>1000,27876=>1000,27877=>1000, -27878=>1000,27879=>1000,27880=>1000,27881=>1000,27882=>1000,27883=>1000,27884=>1000,27885=>1000,27886=>1000,27887=>1000, -27888=>1000,27889=>1000,27890=>1000,27891=>1000,27892=>1000,27893=>1000,27894=>1000,27895=>1000,27896=>1000,27897=>1000, -27898=>1000,27899=>1000,27900=>1000,27901=>1000,27902=>1000,27903=>1000,27904=>1000,27905=>1000,27906=>1000,27907=>1000, -27908=>1000,27909=>1000,27910=>1000,27911=>1000,27912=>1000,27913=>1000,27914=>1000,27915=>1000,27916=>1000,27917=>1000, -27918=>1000,27919=>1000,27920=>1000,27921=>1000,27922=>1000,27923=>1000,27924=>1000,27925=>1000,27926=>1000,27927=>1000, -27928=>1000,27929=>1000,27930=>1000,27931=>1000,27932=>1000,27933=>1000,27934=>1000,27935=>1000,27936=>1000,27937=>1000, -27938=>1000,27939=>1000,27940=>1000,27941=>1000,27942=>1000,27943=>1000,27944=>1000,27945=>1000,27946=>1000,27947=>1000, -27948=>1000,27949=>1000,27950=>1000,27951=>1000,27952=>1000,27953=>1000,27954=>1000,27955=>1000,27956=>1000,27957=>1000, -27958=>1000,27959=>1000,27960=>1000,27961=>1000,27962=>1000,27963=>1000,27964=>1000,27965=>1000,27966=>1000,27967=>1000, -27968=>1000,27969=>1000,27970=>1000,27971=>1000,27972=>1000,27973=>1000,27974=>1000,27975=>1000,27976=>1000,27977=>1000, -27978=>1000,27979=>1000,27980=>1000,27981=>1000,27982=>1000,27983=>1000,27984=>1000,27985=>1000,27986=>1000,27987=>1000, -27988=>1000,27989=>1000,27990=>1000,27991=>1000,27992=>1000,27993=>1000,27994=>1000,27995=>1000,27996=>1000,27997=>1000, -27998=>1000,27999=>1000,28000=>1000,28001=>1000,28002=>1000,28003=>1000,28004=>1000,28005=>1000,28006=>1000,28007=>1000, -28008=>1000,28009=>1000,28010=>1000,28011=>1000,28012=>1000,28013=>1000,28014=>1000,28015=>1000,28016=>1000,28017=>1000, -28018=>1000,28019=>1000,28020=>1000,28021=>1000,28022=>1000,28023=>1000,28024=>1000,28025=>1000,28026=>1000,28027=>1000, -28028=>1000,28029=>1000,28030=>1000,28031=>1000,28032=>1000,28033=>1000,28034=>1000,28035=>1000,28036=>1000,28037=>1000, -28038=>1000,28039=>1000,28040=>1000,28041=>1000,28042=>1000,28043=>1000,28044=>1000,28045=>1000,28046=>1000,28047=>1000, -28048=>1000,28049=>1000,28050=>1000,28051=>1000,28052=>1000,28053=>1000,28054=>1000,28055=>1000,28056=>1000,28057=>1000, -28058=>1000,28059=>1000,28060=>1000,28061=>1000,28062=>1000,28063=>1000,28064=>1000,28065=>1000,28066=>1000,28067=>1000, -28068=>1000,28069=>1000,28070=>1000,28071=>1000,28072=>1000,28073=>1000,28074=>1000,28075=>1000,28076=>1000,28077=>1000, -28078=>1000,28079=>1000,28080=>1000,28081=>1000,28082=>1000,28083=>1000,28084=>1000,28085=>1000,28086=>1000,28087=>1000, -28088=>1000,28089=>1000,28090=>1000,28091=>1000,28092=>1000,28093=>1000,28094=>1000,28095=>1000,28096=>1000,28097=>1000, -28098=>1000,28099=>1000,28100=>1000,28101=>1000,28102=>1000,28103=>1000,28104=>1000,28105=>1000,28106=>1000,28107=>1000, -28108=>1000,28109=>1000,28110=>1000,28111=>1000,28112=>1000,28113=>1000,28114=>1000,28115=>1000,28116=>1000,28117=>1000, -28118=>1000,28119=>1000,28120=>1000,28121=>1000,28122=>1000,28123=>1000,28124=>1000,28125=>1000,28126=>1000,28127=>1000, -28128=>1000,28129=>1000,28130=>1000,28131=>1000,28132=>1000,28133=>1000,28134=>1000,28135=>1000,28136=>1000,28137=>1000, -28138=>1000,28139=>1000,28140=>1000,28141=>1000,28142=>1000,28143=>1000,28144=>1000,28145=>1000,28146=>1000,28147=>1000, -28148=>1000,28149=>1000,28150=>1000,28151=>1000,28152=>1000,28153=>1000,28154=>1000,28155=>1000,28156=>1000,28157=>1000, -28158=>1000,28159=>1000,28160=>1000,28161=>1000,28162=>1000,28163=>1000,28164=>1000,28165=>1000,28166=>1000,28167=>1000, -28168=>1000,28169=>1000,28170=>1000,28171=>1000,28172=>1000,28173=>1000,28174=>1000,28175=>1000,28176=>1000,28177=>1000, -28178=>1000,28179=>1000,28180=>1000,28181=>1000,28182=>1000,28183=>1000,28184=>1000,28185=>1000,28186=>1000,28187=>1000, -28188=>1000,28189=>1000,28190=>1000,28191=>1000,28192=>1000,28193=>1000,28194=>1000,28195=>1000,28196=>1000,28197=>1000, -28198=>1000,28199=>1000,28200=>1000,28201=>1000,28202=>1000,28203=>1000,28204=>1000,28205=>1000,28206=>1000,28207=>1000, -28208=>1000,28209=>1000,28210=>1000,28211=>1000,28212=>1000,28213=>1000,28214=>1000,28215=>1000,28216=>1000,28217=>1000, -28218=>1000,28219=>1000,28220=>1000,28221=>1000,28222=>1000,28223=>1000,28224=>1000,28225=>1000,28226=>1000,28227=>1000, -28228=>1000,28229=>1000,28230=>1000,28231=>1000,28232=>1000,28233=>1000,28234=>1000,28235=>1000,28236=>1000,28237=>1000, -28238=>1000,28239=>1000,28240=>1000,28241=>1000,28242=>1000,28243=>1000,28244=>1000,28245=>1000,28246=>1000,28247=>1000, -28248=>1000,28249=>1000,28250=>1000,28251=>1000,28252=>1000,28253=>1000,28254=>1000,28255=>1000,28256=>1000,28257=>1000, -28258=>1000,28259=>1000,28260=>1000,28261=>1000,28262=>1000,28263=>1000,28264=>1000,28265=>1000,28266=>1000,28267=>1000, -28268=>1000,28269=>1000,28270=>1000,28271=>1000,28272=>1000,28273=>1000,28274=>1000,28275=>1000,28276=>1000,28277=>1000, -28278=>1000,28279=>1000,28280=>1000,28281=>1000,28282=>1000,28283=>1000,28284=>1000,28285=>1000,28286=>1000,28287=>1000, -28288=>1000,28289=>1000,28290=>1000,28291=>1000,28292=>1000,28293=>1000,28294=>1000,28295=>1000,28296=>1000,28297=>1000, -28298=>1000,28299=>1000,28300=>1000,28301=>1000,28302=>1000,28303=>1000,28304=>1000,28305=>1000,28306=>1000,28307=>1000, -28308=>1000,28309=>1000,28310=>1000,28311=>1000,28312=>1000,28313=>1000,28314=>1000,28315=>1000,28316=>1000,28317=>1000, -28318=>1000,28319=>1000,28320=>1000,28321=>1000,28322=>1000,28323=>1000,28324=>1000,28325=>1000,28326=>1000,28327=>1000, -28328=>1000,28329=>1000,28330=>1000,28331=>1000,28332=>1000,28333=>1000,28334=>1000,28335=>1000,28336=>1000,28337=>1000, -28338=>1000,28339=>1000,28340=>1000,28341=>1000,28342=>1000,28343=>1000,28344=>1000,28345=>1000,28346=>1000,28347=>1000, -28348=>1000,28349=>1000,28350=>1000,28351=>1000,28352=>1000,28353=>1000,28354=>1000,28355=>1000,28356=>1000,28357=>1000, -28358=>1000,28359=>1000,28360=>1000,28361=>1000,28362=>1000,28363=>1000,28364=>1000,28365=>1000,28366=>1000,28367=>1000, -28368=>1000,28369=>1000,28370=>1000,28371=>1000,28372=>1000,28373=>1000,28374=>1000,28375=>1000,28376=>1000,28377=>1000, -28378=>1000,28379=>1000,28380=>1000,28381=>1000,28382=>1000,28383=>1000,28384=>1000,28385=>1000,28386=>1000,28387=>1000, -28388=>1000,28389=>1000,28390=>1000,28391=>1000,28392=>1000,28393=>1000,28394=>1000,28395=>1000,28396=>1000,28397=>1000, -28398=>1000,28399=>1000,28400=>1000,28401=>1000,28402=>1000,28403=>1000,28404=>1000,28405=>1000,28406=>1000,28407=>1000, -28408=>1000,28409=>1000,28410=>1000,28411=>1000,28412=>1000,28413=>1000,28414=>1000,28415=>1000,28416=>1000,28417=>1000, -28418=>1000,28419=>1000,28420=>1000,28421=>1000,28422=>1000,28423=>1000,28424=>1000,28425=>1000,28426=>1000,28427=>1000, -28428=>1000,28429=>1000,28430=>1000,28431=>1000,28432=>1000,28433=>1000,28434=>1000,28435=>1000,28436=>1000,28437=>1000, -28438=>1000,28439=>1000,28440=>1000,28441=>1000,28442=>1000,28443=>1000,28444=>1000,28445=>1000,28446=>1000,28447=>1000, -28448=>1000,28449=>1000,28450=>1000,28451=>1000,28452=>1000,28453=>1000,28454=>1000,28455=>1000,28456=>1000,28457=>1000, -28458=>1000,28459=>1000,28460=>1000,28461=>1000,28462=>1000,28463=>1000,28464=>1000,28465=>1000,28466=>1000,28467=>1000, -28468=>1000,28469=>1000,28470=>1000,28471=>1000,28472=>1000,28473=>1000,28474=>1000,28475=>1000,28476=>1000,28477=>1000, -28478=>1000,28479=>1000,28480=>1000,28481=>1000,28482=>1000,28483=>1000,28484=>1000,28485=>1000,28486=>1000,28487=>1000, -28488=>1000,28489=>1000,28490=>1000,28491=>1000,28492=>1000,28493=>1000,28494=>1000,28495=>1000,28496=>1000,28497=>1000, -28498=>1000,28499=>1000,28500=>1000,28501=>1000,28502=>1000,28503=>1000,28504=>1000,28505=>1000,28506=>1000,28507=>1000, -28508=>1000,28509=>1000,28510=>1000,28511=>1000,28512=>1000,28513=>1000,28514=>1000,28515=>1000,28516=>1000,28517=>1000, -28518=>1000,28519=>1000,28520=>1000,28521=>1000,28522=>1000,28523=>1000,28524=>1000,28525=>1000,28526=>1000,28527=>1000, -28528=>1000,28529=>1000,28530=>1000,28531=>1000,28532=>1000,28533=>1000,28534=>1000,28535=>1000,28536=>1000,28537=>1000, -28538=>1000,28539=>1000,28540=>1000,28541=>1000,28542=>1000,28543=>1000,28544=>1000,28545=>1000,28546=>1000,28547=>1000, -28548=>1000,28549=>1000,28550=>1000,28551=>1000,28552=>1000,28553=>1000,28554=>1000,28555=>1000,28556=>1000,28557=>1000, -28558=>1000,28559=>1000,28560=>1000,28561=>1000,28562=>1000,28563=>1000,28564=>1000,28565=>1000,28566=>1000,28567=>1000, -28568=>1000,28569=>1000,28570=>1000,28571=>1000,28572=>1000,28573=>1000,28574=>1000,28575=>1000,28576=>1000,28577=>1000, -28578=>1000,28579=>1000,28580=>1000,28581=>1000,28582=>1000,28583=>1000,28584=>1000,28585=>1000,28586=>1000,28587=>1000, -28588=>1000,28589=>1000,28590=>1000,28591=>1000,28592=>1000,28593=>1000,28594=>1000,28595=>1000,28596=>1000,28597=>1000, -28598=>1000,28599=>1000,28600=>1000,28601=>1000,28602=>1000,28603=>1000,28604=>1000,28605=>1000,28606=>1000,28607=>1000, -28608=>1000,28609=>1000,28610=>1000,28611=>1000,28612=>1000,28613=>1000,28614=>1000,28615=>1000,28616=>1000,28617=>1000, -28618=>1000,28619=>1000,28620=>1000,28621=>1000,28622=>1000,28623=>1000,28624=>1000,28625=>1000,28626=>1000,28627=>1000, -28628=>1000,28629=>1000,28630=>1000,28631=>1000,28632=>1000,28633=>1000,28634=>1000,28635=>1000,28636=>1000,28637=>1000, -28638=>1000,28639=>1000,28640=>1000,28641=>1000,28642=>1000,28643=>1000,28644=>1000,28645=>1000,28646=>1000,28647=>1000, -28648=>1000,28649=>1000,28650=>1000,28651=>1000,28652=>1000,28653=>1000,28654=>1000,28655=>1000,28656=>1000,28657=>1000, -28658=>1000,28659=>1000,28660=>1000,28661=>1000,28662=>1000,28663=>1000,28664=>1000,28665=>1000,28666=>1000,28667=>1000, -28668=>1000,28669=>1000,28670=>1000,28671=>1000,28672=>1000,28673=>1000,28674=>1000,28675=>1000,28676=>1000,28677=>1000, -28678=>1000,28679=>1000,28680=>1000,28681=>1000,28682=>1000,28683=>1000,28684=>1000,28685=>1000,28686=>1000,28687=>1000, -28688=>1000,28689=>1000,28690=>1000,28691=>1000,28692=>1000,28693=>1000,28694=>1000,28695=>1000,28696=>1000,28697=>1000, -28698=>1000,28699=>1000,28700=>1000,28701=>1000,28702=>1000,28703=>1000,28704=>1000,28705=>1000,28706=>1000,28707=>1000, -28708=>1000,28709=>1000,28710=>1000,28711=>1000,28712=>1000,28713=>1000,28714=>1000,28715=>1000,28716=>1000,28717=>1000, -28718=>1000,28719=>1000,28720=>1000,28721=>1000,28722=>1000,28723=>1000,28724=>1000,28725=>1000,28726=>1000,28727=>1000, -28728=>1000,28729=>1000,28730=>1000,28731=>1000,28732=>1000,28733=>1000,28734=>1000,28735=>1000,28736=>1000,28737=>1000, -28738=>1000,28739=>1000,28740=>1000,28741=>1000,28742=>1000,28743=>1000,28744=>1000,28745=>1000,28746=>1000,28747=>1000, -28748=>1000,28749=>1000,28750=>1000,28751=>1000,28752=>1000,28753=>1000,28754=>1000,28755=>1000,28756=>1000,28757=>1000, -28758=>1000,28759=>1000,28760=>1000,28761=>1000,28762=>1000,28763=>1000,28764=>1000,28765=>1000,28766=>1000,28767=>1000, -28768=>1000,28769=>1000,28770=>1000,28771=>1000,28772=>1000,28773=>1000,28774=>1000,28775=>1000,28776=>1000,28777=>1000, -28778=>1000,28779=>1000,28780=>1000,28781=>1000,28782=>1000,28783=>1000,28784=>1000,28785=>1000,28786=>1000,28787=>1000, -28788=>1000,28789=>1000,28790=>1000,28791=>1000,28792=>1000,28793=>1000,28794=>1000,28795=>1000,28796=>1000,28797=>1000, -28798=>1000,28799=>1000,28800=>1000,28801=>1000,28802=>1000,28803=>1000,28804=>1000,28805=>1000,28806=>1000,28807=>1000, -28808=>1000,28809=>1000,28810=>1000,28811=>1000,28812=>1000,28813=>1000,28814=>1000,28815=>1000,28816=>1000,28817=>1000, -28818=>1000,28819=>1000,28820=>1000,28821=>1000,28822=>1000,28823=>1000,28824=>1000,28825=>1000,28826=>1000,28827=>1000, -28828=>1000,28829=>1000,28830=>1000,28831=>1000,28832=>1000,28833=>1000,28834=>1000,28835=>1000,28836=>1000,28837=>1000, -28838=>1000,28839=>1000,28840=>1000,28841=>1000,28842=>1000,28843=>1000,28844=>1000,28845=>1000,28846=>1000,28847=>1000, -28848=>1000,28849=>1000,28850=>1000,28851=>1000,28852=>1000,28853=>1000,28854=>1000,28855=>1000,28856=>1000,28857=>1000, -28858=>1000,28859=>1000,28860=>1000,28861=>1000,28862=>1000,28863=>1000,28864=>1000,28865=>1000,28866=>1000,28867=>1000, -28868=>1000,28869=>1000,28870=>1000,28871=>1000,28872=>1000,28873=>1000,28874=>1000,28875=>1000,28876=>1000,28877=>1000, -28878=>1000,28879=>1000,28880=>1000,28881=>1000,28882=>1000,28883=>1000,28884=>1000,28885=>1000,28886=>1000,28887=>1000, -28888=>1000,28889=>1000,28890=>1000,28891=>1000,28892=>1000,28893=>1000,28894=>1000,28895=>1000,28896=>1000,28897=>1000, -28898=>1000,28899=>1000,28900=>1000,28901=>1000,28902=>1000,28903=>1000,28904=>1000,28905=>1000,28906=>1000,28907=>1000, -28908=>1000,28909=>1000,28910=>1000,28911=>1000,28912=>1000,28913=>1000,28914=>1000,28915=>1000,28916=>1000,28917=>1000, -28918=>1000,28919=>1000,28920=>1000,28921=>1000,28922=>1000,28923=>1000,28924=>1000,28925=>1000,28926=>1000,28927=>1000, -28928=>1000,28929=>1000,28930=>1000,28931=>1000,28932=>1000,28933=>1000,28934=>1000,28935=>1000,28936=>1000,28937=>1000, -28938=>1000,28939=>1000,28940=>1000,28941=>1000,28942=>1000,28943=>1000,28944=>1000,28945=>1000,28946=>1000,28947=>1000, -28948=>1000,28949=>1000,28950=>1000,28951=>1000,28952=>1000,28953=>1000,28954=>1000,28955=>1000,28956=>1000,28957=>1000, -28958=>1000,28959=>1000,28960=>1000,28961=>1000,28962=>1000,28963=>1000,28964=>1000,28965=>1000,28966=>1000,28967=>1000, -28968=>1000,28969=>1000,28970=>1000,28971=>1000,28972=>1000,28973=>1000,28974=>1000,28975=>1000,28976=>1000,28977=>1000, -28978=>1000,28979=>1000,28980=>1000,28981=>1000,28982=>1000,28983=>1000,28984=>1000,28985=>1000,28986=>1000,28987=>1000, -28988=>1000,28989=>1000,28990=>1000,28991=>1000,28992=>1000,28993=>1000,28994=>1000,28995=>1000,28996=>1000,28997=>1000, -28998=>1000,28999=>1000,29000=>1000,29001=>1000,29002=>1000,29003=>1000,29004=>1000,29005=>1000,29006=>1000,29007=>1000, -29008=>1000,29009=>1000,29010=>1000,29011=>1000,29012=>1000,29013=>1000,29014=>1000,29015=>1000,29016=>1000,29017=>1000, -29018=>1000,29019=>1000,29020=>1000,29021=>1000,29022=>1000,29023=>1000,29024=>1000,29025=>1000,29026=>1000,29027=>1000, -29028=>1000,29029=>1000,29030=>1000,29031=>1000,29032=>1000,29033=>1000,29034=>1000,29035=>1000,29036=>1000,29037=>1000, -29038=>1000,29039=>1000,29040=>1000,29041=>1000,29042=>1000,29043=>1000,29044=>1000,29045=>1000,29046=>1000,29047=>1000, -29048=>1000,29049=>1000,29050=>1000,29051=>1000,29052=>1000,29053=>1000,29054=>1000,29055=>1000,29056=>1000,29057=>1000, -29058=>1000,29059=>1000,29060=>1000,29061=>1000,29062=>1000,29063=>1000,29064=>1000,29065=>1000,29066=>1000,29067=>1000, -29068=>1000,29069=>1000,29070=>1000,29071=>1000,29072=>1000,29073=>1000,29074=>1000,29075=>1000,29076=>1000,29077=>1000, -29078=>1000,29079=>1000,29080=>1000,29081=>1000,29082=>1000,29083=>1000,29084=>1000,29085=>1000,29086=>1000,29087=>1000, -29088=>1000,29089=>1000,29090=>1000,29091=>1000,29092=>1000,29093=>1000,29094=>1000,29095=>1000,29096=>1000,29097=>1000, -29098=>1000,29099=>1000,29100=>1000,29101=>1000,29102=>1000,29103=>1000,29104=>1000,29105=>1000,29106=>1000,29107=>1000, -29108=>1000,29109=>1000,29110=>1000,29111=>1000,29112=>1000,29113=>1000,29114=>1000,29115=>1000,29116=>1000,29117=>1000, -29118=>1000,29119=>1000,29120=>1000,29121=>1000,29122=>1000,29123=>1000,29124=>1000,29125=>1000,29126=>1000,29127=>1000, -29128=>1000,29129=>1000,29130=>1000,29131=>1000,29132=>1000,29133=>1000,29134=>1000,29135=>1000,29136=>1000,29137=>1000, -29138=>1000,29139=>1000,29140=>1000,29141=>1000,29142=>1000,29143=>1000,29144=>1000,29145=>1000,29146=>1000,29147=>1000, -29148=>1000,29149=>1000,29150=>1000,29151=>1000,29152=>1000,29153=>1000,29154=>1000,29155=>1000,29156=>1000,29157=>1000, -29158=>1000,29159=>1000,29160=>1000,29161=>1000,29162=>1000,29163=>1000,29164=>1000,29165=>1000,29166=>1000,29167=>1000, -29168=>1000,29169=>1000,29170=>1000,29171=>1000,29172=>1000,29173=>1000,29174=>1000,29175=>1000,29176=>1000,29177=>1000, -29178=>1000,29179=>1000,29180=>1000,29181=>1000,29182=>1000,29183=>1000,29184=>1000,29185=>1000,29186=>1000,29187=>1000, -29188=>1000,29189=>1000,29190=>1000,29191=>1000,29192=>1000,29193=>1000,29194=>1000,29195=>1000,29196=>1000,29197=>1000, -29198=>1000,29199=>1000,29200=>1000,29201=>1000,29202=>1000,29203=>1000,29204=>1000,29205=>1000,29206=>1000,29207=>1000, -29208=>1000,29209=>1000,29210=>1000,29211=>1000,29212=>1000,29213=>1000,29214=>1000,29215=>1000,29216=>1000,29217=>1000, -29218=>1000,29219=>1000,29220=>1000,29221=>1000,29222=>1000,29223=>1000,29224=>1000,29225=>1000,29226=>1000,29227=>1000, -29228=>1000,29229=>1000,29230=>1000,29231=>1000,29232=>1000,29233=>1000,29234=>1000,29235=>1000,29236=>1000,29237=>1000, -29238=>1000,29239=>1000,29240=>1000,29241=>1000,29242=>1000,29243=>1000,29244=>1000,29245=>1000,29246=>1000,29247=>1000, -29248=>1000,29249=>1000,29250=>1000,29251=>1000,29252=>1000,29253=>1000,29254=>1000,29255=>1000,29256=>1000,29257=>1000, -29258=>1000,29259=>1000,29260=>1000,29261=>1000,29262=>1000,29263=>1000,29264=>1000,29265=>1000,29266=>1000,29267=>1000, -29268=>1000,29269=>1000,29270=>1000,29271=>1000,29272=>1000,29273=>1000,29274=>1000,29275=>1000,29276=>1000,29277=>1000, -29278=>1000,29279=>1000,29280=>1000,29281=>1000,29282=>1000,29283=>1000,29284=>1000,29285=>1000,29286=>1000,29287=>1000, -29288=>1000,29289=>1000,29290=>1000,29291=>1000,29292=>1000,29293=>1000,29294=>1000,29295=>1000,29296=>1000,29297=>1000, -29298=>1000,29299=>1000,29300=>1000,29301=>1000,29302=>1000,29303=>1000,29304=>1000,29305=>1000,29306=>1000,29307=>1000, -29308=>1000,29309=>1000,29310=>1000,29311=>1000,29312=>1000,29313=>1000,29314=>1000,29315=>1000,29316=>1000,29317=>1000, -29318=>1000,29319=>1000,29320=>1000,29321=>1000,29322=>1000,29323=>1000,29324=>1000,29325=>1000,29326=>1000,29327=>1000, -29328=>1000,29329=>1000,29330=>1000,29331=>1000,29332=>1000,29333=>1000,29334=>1000,29335=>1000,29336=>1000,29337=>1000, -29338=>1000,29339=>1000,29340=>1000,29341=>1000,29342=>1000,29343=>1000,29344=>1000,29345=>1000,29346=>1000,29347=>1000, -29348=>1000,29349=>1000,29350=>1000,29351=>1000,29352=>1000,29353=>1000,29354=>1000,29355=>1000,29356=>1000,29357=>1000, -29358=>1000,29359=>1000,29360=>1000,29361=>1000,29362=>1000,29363=>1000,29364=>1000,29365=>1000,29366=>1000,29367=>1000, -29368=>1000,29369=>1000,29370=>1000,29371=>1000,29372=>1000,29373=>1000,29374=>1000,29375=>1000,29376=>1000,29377=>1000, -29378=>1000,29379=>1000,29380=>1000,29381=>1000,29382=>1000,29383=>1000,29384=>1000,29385=>1000,29386=>1000,29387=>1000, -29388=>1000,29389=>1000,29390=>1000,29391=>1000,29392=>1000,29393=>1000,29394=>1000,29395=>1000,29396=>1000,29397=>1000, -29398=>1000,29399=>1000,29400=>1000,29401=>1000,29402=>1000,29403=>1000,29404=>1000,29405=>1000,29406=>1000,29407=>1000, -29408=>1000,29409=>1000,29410=>1000,29411=>1000,29412=>1000,29413=>1000,29414=>1000,29415=>1000,29416=>1000,29417=>1000, -29418=>1000,29419=>1000,29420=>1000,29421=>1000,29422=>1000,29423=>1000,29424=>1000,29425=>1000,29426=>1000,29427=>1000, -29428=>1000,29429=>1000,29430=>1000,29431=>1000,29432=>1000,29433=>1000,29434=>1000,29435=>1000,29436=>1000,29437=>1000, -29438=>1000,29439=>1000,29440=>1000,29441=>1000,29442=>1000,29443=>1000,29444=>1000,29445=>1000,29446=>1000,29447=>1000, -29448=>1000,29449=>1000,29450=>1000,29451=>1000,29452=>1000,29453=>1000,29454=>1000,29455=>1000,29456=>1000,29457=>1000, -29458=>1000,29459=>1000,29460=>1000,29461=>1000,29462=>1000,29463=>1000,29464=>1000,29465=>1000,29466=>1000,29467=>1000, -29468=>1000,29469=>1000,29470=>1000,29471=>1000,29472=>1000,29473=>1000,29474=>1000,29475=>1000,29476=>1000,29477=>1000, -29478=>1000,29479=>1000,29480=>1000,29481=>1000,29482=>1000,29483=>1000,29484=>1000,29485=>1000,29486=>1000,29487=>1000, -29488=>1000,29489=>1000,29490=>1000,29491=>1000,29492=>1000,29493=>1000,29494=>1000,29495=>1000,29496=>1000,29497=>1000, -29498=>1000,29499=>1000,29500=>1000,29501=>1000,29502=>1000,29503=>1000,29504=>1000,29505=>1000,29506=>1000,29507=>1000, -29508=>1000,29509=>1000,29510=>1000,29511=>1000,29512=>1000,29513=>1000,29514=>1000,29515=>1000,29516=>1000,29517=>1000, -29518=>1000,29519=>1000,29520=>1000,29521=>1000,29522=>1000,29523=>1000,29524=>1000,29525=>1000,29526=>1000,29527=>1000, -29528=>1000,29529=>1000,29530=>1000,29531=>1000,29532=>1000,29533=>1000,29534=>1000,29535=>1000,29536=>1000,29537=>1000, -29538=>1000,29539=>1000,29540=>1000,29541=>1000,29542=>1000,29543=>1000,29544=>1000,29545=>1000,29546=>1000,29547=>1000, -29548=>1000,29549=>1000,29550=>1000,29551=>1000,29552=>1000,29553=>1000,29554=>1000,29555=>1000,29556=>1000,29557=>1000, -29558=>1000,29559=>1000,29560=>1000,29561=>1000,29562=>1000,29563=>1000,29564=>1000,29565=>1000,29566=>1000,29567=>1000, -29568=>1000,29569=>1000,29570=>1000,29571=>1000,29572=>1000,29573=>1000,29574=>1000,29575=>1000,29576=>1000,29577=>1000, -29578=>1000,29579=>1000,29580=>1000,29581=>1000,29582=>1000,29583=>1000,29584=>1000,29585=>1000,29586=>1000,29587=>1000, -29588=>1000,29589=>1000,29590=>1000,29591=>1000,29592=>1000,29593=>1000,29594=>1000,29595=>1000,29596=>1000,29597=>1000, -29598=>1000,29599=>1000,29600=>1000,29601=>1000,29602=>1000,29603=>1000,29604=>1000,29605=>1000,29606=>1000,29607=>1000, -29608=>1000,29609=>1000,29610=>1000,29611=>1000,29612=>1000,29613=>1000,29614=>1000,29615=>1000,29616=>1000,29617=>1000, -29618=>1000,29619=>1000,29620=>1000,29621=>1000,29622=>1000,29623=>1000,29624=>1000,29625=>1000,29626=>1000,29627=>1000, -29628=>1000,29629=>1000,29630=>1000,29631=>1000,29632=>1000,29633=>1000,29634=>1000,29635=>1000,29636=>1000,29637=>1000, -29638=>1000,29639=>1000,29640=>1000,29641=>1000,29642=>1000,29643=>1000,29644=>1000,29645=>1000,29646=>1000,29647=>1000, -29648=>1000,29649=>1000,29650=>1000,29651=>1000,29652=>1000,29653=>1000,29654=>1000,29655=>1000,29656=>1000,29657=>1000, -29658=>1000,29659=>1000,29660=>1000,29661=>1000,29662=>1000,29663=>1000,29664=>1000,29665=>1000,29666=>1000,29667=>1000, -29668=>1000,29669=>1000,29670=>1000,29671=>1000,29672=>1000,29673=>1000,29674=>1000,29675=>1000,29676=>1000,29677=>1000, -29678=>1000,29679=>1000,29680=>1000,29681=>1000,29682=>1000,29683=>1000,29684=>1000,29685=>1000,29686=>1000,29687=>1000, -29688=>1000,29689=>1000,29690=>1000,29691=>1000,29692=>1000,29693=>1000,29694=>1000,29695=>1000,29696=>1000,29697=>1000, -29698=>1000,29699=>1000,29700=>1000,29701=>1000,29702=>1000,29703=>1000,29704=>1000,29705=>1000,29706=>1000,29707=>1000, -29708=>1000,29709=>1000,29710=>1000,29711=>1000,29712=>1000,29713=>1000,29714=>1000,29715=>1000,29716=>1000,29717=>1000, -29718=>1000,29719=>1000,29720=>1000,29721=>1000,29722=>1000,29723=>1000,29724=>1000,29725=>1000,29726=>1000,29727=>1000, -29728=>1000,29729=>1000,29730=>1000,29731=>1000,29732=>1000,29733=>1000,29734=>1000,29735=>1000,29736=>1000,29737=>1000, -29738=>1000,29739=>1000,29740=>1000,29741=>1000,29742=>1000,29743=>1000,29744=>1000,29745=>1000,29746=>1000,29747=>1000, -29748=>1000,29749=>1000,29750=>1000,29751=>1000,29752=>1000,29753=>1000,29754=>1000,29755=>1000,29756=>1000,29757=>1000, -29758=>1000,29759=>1000,29760=>1000,29761=>1000,29762=>1000,29763=>1000,29764=>1000,29765=>1000,29766=>1000,29767=>1000, -29768=>1000,29769=>1000,29770=>1000,29771=>1000,29772=>1000,29773=>1000,29774=>1000,29775=>1000,29776=>1000,29777=>1000, -29778=>1000,29779=>1000,29780=>1000,29781=>1000,29782=>1000,29783=>1000,29784=>1000,29785=>1000,29786=>1000,29787=>1000, -29788=>1000,29789=>1000,29790=>1000,29791=>1000,29792=>1000,29793=>1000,29794=>1000,29795=>1000,29796=>1000,29797=>1000, -29798=>1000,29799=>1000,29800=>1000,29801=>1000,29802=>1000,29803=>1000,29804=>1000,29805=>1000,29806=>1000,29807=>1000, -29808=>1000,29809=>1000,29810=>1000,29811=>1000,29812=>1000,29813=>1000,29814=>1000,29815=>1000,29816=>1000,29817=>1000, -29818=>1000,29819=>1000,29820=>1000,29821=>1000,29822=>1000,29823=>1000,29824=>1000,29825=>1000,29826=>1000,29827=>1000, -29828=>1000,29829=>1000,29830=>1000,29831=>1000,29832=>1000,29833=>1000,29834=>1000,29835=>1000,29836=>1000,29837=>1000, -29838=>1000,29839=>1000,29840=>1000,29841=>1000,29842=>1000,29843=>1000,29844=>1000,29845=>1000,29846=>1000,29847=>1000, -29848=>1000,29849=>1000,29850=>1000,29851=>1000,29852=>1000,29853=>1000,29854=>1000,29855=>1000,29856=>1000,29857=>1000, -29858=>1000,29859=>1000,29860=>1000,29861=>1000,29862=>1000,29863=>1000,29864=>1000,29865=>1000,29866=>1000,29867=>1000, -29868=>1000,29869=>1000,29870=>1000,29871=>1000,29872=>1000,29873=>1000,29874=>1000,29875=>1000,29876=>1000,29877=>1000, -29878=>1000,29879=>1000,29880=>1000,29881=>1000,29882=>1000,29883=>1000,29884=>1000,29885=>1000,29886=>1000,29887=>1000, -29888=>1000,29889=>1000,29890=>1000,29891=>1000,29892=>1000,29893=>1000,29894=>1000,29895=>1000,29896=>1000,29897=>1000, -29898=>1000,29899=>1000,29900=>1000,29901=>1000,29902=>1000,29903=>1000,29904=>1000,29905=>1000,29906=>1000,29907=>1000, -29908=>1000,29909=>1000,29910=>1000,29911=>1000,29912=>1000,29913=>1000,29914=>1000,29915=>1000,29916=>1000,29917=>1000, -29918=>1000,29919=>1000,29920=>1000,29921=>1000,29922=>1000,29923=>1000,29924=>1000,29925=>1000,29926=>1000,29927=>1000, -29928=>1000,29929=>1000,29930=>1000,29931=>1000,29932=>1000,29933=>1000,29934=>1000,29935=>1000,29936=>1000,29937=>1000, -29938=>1000,29939=>1000,29940=>1000,29941=>1000,29942=>1000,29943=>1000,29944=>1000,29945=>1000,29946=>1000,29947=>1000, -29948=>1000,29949=>1000,29950=>1000,29951=>1000,29952=>1000,29953=>1000,29954=>1000,29955=>1000,29956=>1000,29957=>1000, -29958=>1000,29959=>1000,29960=>1000,29961=>1000,29962=>1000,29963=>1000,29964=>1000,29965=>1000,29966=>1000,29967=>1000, -29968=>1000,29969=>1000,29970=>1000,29971=>1000,29972=>1000,29973=>1000,29974=>1000,29975=>1000,29976=>1000,29977=>1000, -29978=>1000,29979=>1000,29980=>1000,29981=>1000,29982=>1000,29983=>1000,29984=>1000,29985=>1000,29986=>1000,29987=>1000, -29988=>1000,29989=>1000,29990=>1000,29991=>1000,29992=>1000,29993=>1000,29994=>1000,29995=>1000,29996=>1000,29997=>1000, -29998=>1000,29999=>1000,30000=>1000,30001=>1000,30002=>1000,30003=>1000,30004=>1000,30005=>1000,30006=>1000,30007=>1000, -30008=>1000,30009=>1000,30010=>1000,30011=>1000,30012=>1000,30013=>1000,30014=>1000,30015=>1000,30016=>1000,30017=>1000, -30018=>1000,30019=>1000,30020=>1000,30021=>1000,30022=>1000,30023=>1000,30024=>1000,30025=>1000,30026=>1000,30027=>1000, -30028=>1000,30029=>1000,30030=>1000,30031=>1000,30032=>1000,30033=>1000,30034=>1000,30035=>1000,30036=>1000,30037=>1000, -30038=>1000,30039=>1000,30040=>1000,30041=>1000,30042=>1000,30043=>1000,30044=>1000,30045=>1000,30046=>1000,30047=>1000, -30048=>1000,30049=>1000,30050=>1000,30051=>1000,30052=>1000,30053=>1000,30054=>1000,30055=>1000,30056=>1000,30057=>1000, -30058=>1000,30059=>1000,30060=>1000,30061=>1000,30062=>1000,30063=>1000,30064=>1000,30065=>1000,30066=>1000,30067=>1000, -30068=>1000,30069=>1000,30070=>1000,30071=>1000,30072=>1000,30073=>1000,30074=>1000,30075=>1000,30076=>1000,30077=>1000, -30078=>1000,30079=>1000,30080=>1000,30081=>1000,30082=>1000,30083=>1000,30084=>1000,30085=>1000,30086=>1000,30087=>1000, -30088=>1000,30089=>1000,30090=>1000,30091=>1000,30092=>1000,30093=>1000,30094=>1000,30095=>1000,30096=>1000,30097=>1000, -30098=>1000,30099=>1000,30100=>1000,30101=>1000,30102=>1000,30103=>1000,30104=>1000,30105=>1000,30106=>1000,30107=>1000, -30108=>1000,30109=>1000,30110=>1000,30111=>1000,30112=>1000,30113=>1000,30114=>1000,30115=>1000,30116=>1000,30117=>1000, -30118=>1000,30119=>1000,30120=>1000,30121=>1000,30122=>1000,30123=>1000,30124=>1000,30125=>1000,30126=>1000,30127=>1000, -30128=>1000,30129=>1000,30130=>1000,30131=>1000,30132=>1000,30133=>1000,30134=>1000,30135=>1000,30136=>1000,30137=>1000, -30138=>1000,30139=>1000,30140=>1000,30141=>1000,30142=>1000,30143=>1000,30144=>1000,30145=>1000,30146=>1000,30147=>1000, -30148=>1000,30149=>1000,30150=>1000,30151=>1000,30152=>1000,30153=>1000,30154=>1000,30155=>1000,30156=>1000,30157=>1000, -30158=>1000,30159=>1000,30160=>1000,30161=>1000,30162=>1000,30163=>1000,30164=>1000,30165=>1000,30166=>1000,30167=>1000, -30168=>1000,30169=>1000,30170=>1000,30171=>1000,30172=>1000,30173=>1000,30174=>1000,30175=>1000,30176=>1000,30177=>1000, -30178=>1000,30179=>1000,30180=>1000,30181=>1000,30182=>1000,30183=>1000,30184=>1000,30185=>1000,30186=>1000,30187=>1000, -30188=>1000,30189=>1000,30190=>1000,30191=>1000,30192=>1000,30193=>1000,30194=>1000,30195=>1000,30196=>1000,30197=>1000, -30198=>1000,30199=>1000,30200=>1000,30201=>1000,30202=>1000,30203=>1000,30204=>1000,30205=>1000,30206=>1000,30207=>1000, -30208=>1000,30209=>1000,30210=>1000,30211=>1000,30212=>1000,30213=>1000,30214=>1000,30215=>1000,30216=>1000,30217=>1000, -30218=>1000,30219=>1000,30220=>1000,30221=>1000,30222=>1000,30223=>1000,30224=>1000,30225=>1000,30226=>1000,30227=>1000, -30228=>1000,30229=>1000,30230=>1000,30231=>1000,30232=>1000,30233=>1000,30234=>1000,30235=>1000,30236=>1000,30237=>1000, -30238=>1000,30239=>1000,30240=>1000,30241=>1000,30242=>1000,30243=>1000,30244=>1000,30245=>1000,30246=>1000,30247=>1000, -30248=>1000,30249=>1000,30250=>1000,30251=>1000,30252=>1000,30253=>1000,30254=>1000,30255=>1000,30256=>1000,30257=>1000, -30258=>1000,30259=>1000,30260=>1000,30261=>1000,30262=>1000,30263=>1000,30264=>1000,30265=>1000,30266=>1000,30267=>1000, -30268=>1000,30269=>1000,30270=>1000,30271=>1000,30272=>1000,30273=>1000,30274=>1000,30275=>1000,30276=>1000,30277=>1000, -30278=>1000,30279=>1000,30280=>1000,30281=>1000,30282=>1000,30283=>1000,30284=>1000,30285=>1000,30286=>1000,30287=>1000, -30288=>1000,30289=>1000,30290=>1000,30291=>1000,30292=>1000,30293=>1000,30294=>1000,30295=>1000,30296=>1000,30297=>1000, -30298=>1000,30299=>1000,30300=>1000,30301=>1000,30302=>1000,30303=>1000,30304=>1000,30305=>1000,30306=>1000,30307=>1000, -30308=>1000,30309=>1000,30310=>1000,30311=>1000,30312=>1000,30313=>1000,30314=>1000,30315=>1000,30316=>1000,30317=>1000, -30318=>1000,30319=>1000,30320=>1000,30321=>1000,30322=>1000,30323=>1000,30324=>1000,30325=>1000,30326=>1000,30327=>1000, -30328=>1000,30329=>1000,30330=>1000,30331=>1000,30332=>1000,30333=>1000,30334=>1000,30335=>1000,30336=>1000,30337=>1000, -30338=>1000,30339=>1000,30340=>1000,30341=>1000,30342=>1000,30343=>1000,30344=>1000,30345=>1000,30346=>1000,30347=>1000, -30348=>1000,30349=>1000,30350=>1000,30351=>1000,30352=>1000,30353=>1000,30354=>1000,30355=>1000,30356=>1000,30357=>1000, -30358=>1000,30359=>1000,30360=>1000,30361=>1000,30362=>1000,30363=>1000,30364=>1000,30365=>1000,30366=>1000,30367=>1000, -30368=>1000,30369=>1000,30370=>1000,30371=>1000,30372=>1000,30373=>1000,30374=>1000,30375=>1000,30376=>1000,30377=>1000, -30378=>1000,30379=>1000,30380=>1000,30381=>1000,30382=>1000,30383=>1000,30384=>1000,30385=>1000,30386=>1000,30387=>1000, -30388=>1000,30389=>1000,30390=>1000,30391=>1000,30392=>1000,30393=>1000,30394=>1000,30395=>1000,30396=>1000,30397=>1000, -30398=>1000,30399=>1000,30400=>1000,30401=>1000,30402=>1000,30403=>1000,30404=>1000,30405=>1000,30406=>1000,30407=>1000, -30408=>1000,30409=>1000,30410=>1000,30411=>1000,30412=>1000,30413=>1000,30414=>1000,30415=>1000,30416=>1000,30417=>1000, -30418=>1000,30419=>1000,30420=>1000,30421=>1000,30422=>1000,30423=>1000,30424=>1000,30425=>1000,30426=>1000,30427=>1000, -30428=>1000,30429=>1000,30430=>1000,30431=>1000,30432=>1000,30433=>1000,30434=>1000,30435=>1000,30436=>1000,30437=>1000, -30438=>1000,30439=>1000,30440=>1000,30441=>1000,30442=>1000,30443=>1000,30444=>1000,30445=>1000,30446=>1000,30447=>1000, -30448=>1000,30449=>1000,30450=>1000,30451=>1000,30452=>1000,30453=>1000,30454=>1000,30455=>1000,30456=>1000,30457=>1000, -30458=>1000,30459=>1000,30460=>1000,30461=>1000,30462=>1000,30463=>1000,30464=>1000,30465=>1000,30466=>1000,30467=>1000, -30468=>1000,30469=>1000,30470=>1000,30471=>1000,30472=>1000,30473=>1000,30474=>1000,30475=>1000,30476=>1000,30477=>1000, -30478=>1000,30479=>1000,30480=>1000,30481=>1000,30482=>1000,30483=>1000,30484=>1000,30485=>1000,30486=>1000,30487=>1000, -30488=>1000,30489=>1000,30490=>1000,30491=>1000,30492=>1000,30493=>1000,30494=>1000,30495=>1000,30496=>1000,30497=>1000, -30498=>1000,30499=>1000,30500=>1000,30501=>1000,30502=>1000,30503=>1000,30504=>1000,30505=>1000,30506=>1000,30507=>1000, -30508=>1000,30509=>1000,30510=>1000,30511=>1000,30512=>1000,30513=>1000,30514=>1000,30515=>1000,30516=>1000,30517=>1000, -30518=>1000,30519=>1000,30520=>1000,30521=>1000,30522=>1000,30523=>1000,30524=>1000,30525=>1000,30526=>1000,30527=>1000, -30528=>1000,30529=>1000,30530=>1000,30531=>1000,30532=>1000,30533=>1000,30534=>1000,30535=>1000,30536=>1000,30537=>1000, -30538=>1000,30539=>1000,30540=>1000,30541=>1000,30542=>1000,30543=>1000,30544=>1000,30545=>1000,30546=>1000,30547=>1000, -30548=>1000,30549=>1000,30550=>1000,30551=>1000,30552=>1000,30553=>1000,30554=>1000,30555=>1000,30556=>1000,30557=>1000, -30558=>1000,30559=>1000,30560=>1000,30561=>1000,30562=>1000,30563=>1000,30564=>1000,30565=>1000,30566=>1000,30567=>1000, -30568=>1000,30569=>1000,30570=>1000,30571=>1000,30572=>1000,30573=>1000,30574=>1000,30575=>1000,30576=>1000,30577=>1000, -30578=>1000,30579=>1000,30580=>1000,30581=>1000,30582=>1000,30583=>1000,30584=>1000,30585=>1000,30586=>1000,30587=>1000, -30588=>1000,30589=>1000,30590=>1000,30591=>1000,30592=>1000,30593=>1000,30594=>1000,30595=>1000,30596=>1000,30597=>1000, -30598=>1000,30599=>1000,30600=>1000,30601=>1000,30602=>1000,30603=>1000,30604=>1000,30605=>1000,30606=>1000,30607=>1000, -30608=>1000,30609=>1000,30610=>1000,30611=>1000,30612=>1000,30613=>1000,30614=>1000,30615=>1000,30616=>1000,30617=>1000, -30618=>1000,30619=>1000,30620=>1000,30621=>1000,30622=>1000,30623=>1000,30624=>1000,30625=>1000,30626=>1000,30627=>1000, -30628=>1000,30629=>1000,30630=>1000,30631=>1000,30632=>1000,30633=>1000,30634=>1000,30635=>1000,30636=>1000,30637=>1000, -30638=>1000,30639=>1000,30640=>1000,30641=>1000,30642=>1000,30643=>1000,30644=>1000,30645=>1000,30646=>1000,30647=>1000, -30648=>1000,30649=>1000,30650=>1000,30651=>1000,30652=>1000,30653=>1000,30654=>1000,30655=>1000,30656=>1000,30657=>1000, -30658=>1000,30659=>1000,30660=>1000,30661=>1000,30662=>1000,30663=>1000,30664=>1000,30665=>1000,30666=>1000,30667=>1000, -30668=>1000,30669=>1000,30670=>1000,30671=>1000,30672=>1000,30673=>1000,30674=>1000,30675=>1000,30676=>1000,30677=>1000, -30678=>1000,30679=>1000,30680=>1000,30681=>1000,30682=>1000,30683=>1000,30684=>1000,30685=>1000,30686=>1000,30687=>1000, -30688=>1000,30689=>1000,30690=>1000,30691=>1000,30692=>1000,30693=>1000,30694=>1000,30695=>1000,30696=>1000,30697=>1000, -30698=>1000,30699=>1000,30700=>1000,30701=>1000,30702=>1000,30703=>1000,30704=>1000,30705=>1000,30706=>1000,30707=>1000, -30708=>1000,30709=>1000,30710=>1000,30711=>1000,30712=>1000,30713=>1000,30714=>1000,30715=>1000,30716=>1000,30717=>1000, -30718=>1000,30719=>1000,30720=>1000,30721=>1000,30722=>1000,30723=>1000,30724=>1000,30725=>1000,30726=>1000,30727=>1000, -30728=>1000,30729=>1000,30730=>1000,30731=>1000,30732=>1000,30733=>1000,30734=>1000,30735=>1000,30736=>1000,30737=>1000, -30738=>1000,30739=>1000,30740=>1000,30741=>1000,30742=>1000,30743=>1000,30744=>1000,30745=>1000,30746=>1000,30747=>1000, -30748=>1000,30749=>1000,30750=>1000,30751=>1000,30752=>1000,30753=>1000,30754=>1000,30755=>1000,30756=>1000,30757=>1000, -30758=>1000,30759=>1000,30760=>1000,30761=>1000,30762=>1000,30763=>1000,30764=>1000,30765=>1000,30766=>1000,30767=>1000, -30768=>1000,30769=>1000,30770=>1000,30771=>1000,30772=>1000,30773=>1000,30774=>1000,30775=>1000,30776=>1000,30777=>1000, -30778=>1000,30779=>1000,30780=>1000,30781=>1000,30782=>1000,30783=>1000,30784=>1000,30785=>1000,30786=>1000,30787=>1000, -30788=>1000,30789=>1000,30790=>1000,30791=>1000,30792=>1000,30793=>1000,30794=>1000,30795=>1000,30796=>1000,30797=>1000, -30798=>1000,30799=>1000,30800=>1000,30801=>1000,30802=>1000,30803=>1000,30804=>1000,30805=>1000,30806=>1000,30807=>1000, -30808=>1000,30809=>1000,30810=>1000,30811=>1000,30812=>1000,30813=>1000,30814=>1000,30815=>1000,30816=>1000,30817=>1000, -30818=>1000,30819=>1000,30820=>1000,30821=>1000,30822=>1000,30823=>1000,30824=>1000,30825=>1000,30826=>1000,30827=>1000, -30828=>1000,30829=>1000,30830=>1000,30831=>1000,30832=>1000,30833=>1000,30834=>1000,30835=>1000,30836=>1000,30837=>1000, -30838=>1000,30839=>1000,30840=>1000,30841=>1000,30842=>1000,30843=>1000,30844=>1000,30845=>1000,30846=>1000,30847=>1000, -30848=>1000,30849=>1000,30850=>1000,30851=>1000,30852=>1000,30853=>1000,30854=>1000,30855=>1000,30856=>1000,30857=>1000, -30858=>1000,30859=>1000,30860=>1000,30861=>1000,30862=>1000,30863=>1000,30864=>1000,30865=>1000,30866=>1000,30867=>1000, -30868=>1000,30869=>1000,30870=>1000,30871=>1000,30872=>1000,30873=>1000,30874=>1000,30875=>1000,30876=>1000,30877=>1000, -30878=>1000,30879=>1000,30880=>1000,30881=>1000,30882=>1000,30883=>1000,30884=>1000,30885=>1000,30886=>1000,30887=>1000, -30888=>1000,30889=>1000,30890=>1000,30891=>1000,30892=>1000,30893=>1000,30894=>1000,30895=>1000,30896=>1000,30897=>1000, -30898=>1000,30899=>1000,30900=>1000,30901=>1000,30902=>1000,30903=>1000,30904=>1000,30905=>1000,30906=>1000,30907=>1000, -30908=>1000,30909=>1000,30910=>1000,30911=>1000,30912=>1000,30913=>1000,30914=>1000,30915=>1000,30916=>1000,30917=>1000, -30918=>1000,30919=>1000,30920=>1000,30921=>1000,30922=>1000,30923=>1000,30924=>1000,30925=>1000,30926=>1000,30927=>1000, -30928=>1000,30929=>1000,30930=>1000,30931=>1000,30932=>1000,30933=>1000,30934=>1000,30935=>1000,30936=>1000,30937=>1000, -30938=>1000,30939=>1000,30940=>1000,30941=>1000,30942=>1000,30943=>1000,30944=>1000,30945=>1000,30946=>1000,30947=>1000, -30948=>1000,30949=>1000,30950=>1000,30951=>1000,30952=>1000,30953=>1000,30954=>1000,30955=>1000,30956=>1000,30957=>1000, -30958=>1000,30959=>1000,30960=>1000,30961=>1000,30962=>1000,30963=>1000,30964=>1000,30965=>1000,30966=>1000,30967=>1000, -30968=>1000,30969=>1000,30970=>1000,30971=>1000,30972=>1000,30973=>1000,30974=>1000,30975=>1000,30976=>1000,30977=>1000, -30978=>1000,30979=>1000,30980=>1000,30981=>1000,30982=>1000,30983=>1000,30984=>1000,30985=>1000,30986=>1000,30987=>1000, -30988=>1000,30989=>1000,30990=>1000,30991=>1000,30992=>1000,30993=>1000,30994=>1000,30995=>1000,30996=>1000,30997=>1000, -30998=>1000,30999=>1000,31000=>1000,31001=>1000,31002=>1000,31003=>1000,31004=>1000,31005=>1000,31006=>1000,31007=>1000, -31008=>1000,31009=>1000,31010=>1000,31011=>1000,31012=>1000,31013=>1000,31014=>1000,31015=>1000,31016=>1000,31017=>1000, -31018=>1000,31019=>1000,31020=>1000,31021=>1000,31022=>1000,31023=>1000,31024=>1000,31025=>1000,31026=>1000,31027=>1000, -31028=>1000,31029=>1000,31030=>1000,31031=>1000,31032=>1000,31033=>1000,31034=>1000,31035=>1000,31036=>1000,31037=>1000, -31038=>1000,31039=>1000,31040=>1000,31041=>1000,31042=>1000,31043=>1000,31044=>1000,31045=>1000,31046=>1000,31047=>1000, -31048=>1000,31049=>1000,31050=>1000,31051=>1000,31052=>1000,31053=>1000,31054=>1000,31055=>1000,31056=>1000,31057=>1000, -31058=>1000,31059=>1000,31060=>1000,31061=>1000,31062=>1000,31063=>1000,31064=>1000,31065=>1000,31066=>1000,31067=>1000, -31068=>1000,31069=>1000,31070=>1000,31071=>1000,31072=>1000,31073=>1000,31074=>1000,31075=>1000,31076=>1000,31077=>1000, -31078=>1000,31079=>1000,31080=>1000,31081=>1000,31082=>1000,31083=>1000,31084=>1000,31085=>1000,31086=>1000,31087=>1000, -31088=>1000,31089=>1000,31090=>1000,31091=>1000,31092=>1000,31093=>1000,31094=>1000,31095=>1000,31096=>1000,31097=>1000, -31098=>1000,31099=>1000,31100=>1000,31101=>1000,31102=>1000,31103=>1000,31104=>1000,31105=>1000,31106=>1000,31107=>1000, -31108=>1000,31109=>1000,31110=>1000,31111=>1000,31112=>1000,31113=>1000,31114=>1000,31115=>1000,31116=>1000,31117=>1000, -31118=>1000,31119=>1000,31120=>1000,31121=>1000,31122=>1000,31123=>1000,31124=>1000,31125=>1000,31126=>1000,31127=>1000, -31128=>1000,31129=>1000,31130=>1000,31131=>1000,31132=>1000,31133=>1000,31134=>1000,31135=>1000,31136=>1000,31137=>1000, -31138=>1000,31139=>1000,31140=>1000,31141=>1000,31142=>1000,31143=>1000,31144=>1000,31145=>1000,31146=>1000,31147=>1000, -31148=>1000,31149=>1000,31150=>1000,31151=>1000,31152=>1000,31153=>1000,31154=>1000,31155=>1000,31156=>1000,31157=>1000, -31158=>1000,31159=>1000,31160=>1000,31161=>1000,31162=>1000,31163=>1000,31164=>1000,31165=>1000,31166=>1000,31167=>1000, -31168=>1000,31169=>1000,31170=>1000,31171=>1000,31172=>1000,31173=>1000,31174=>1000,31175=>1000,31176=>1000,31177=>1000, -31178=>1000,31179=>1000,31180=>1000,31181=>1000,31182=>1000,31183=>1000,31184=>1000,31185=>1000,31186=>1000,31187=>1000, -31188=>1000,31189=>1000,31190=>1000,31191=>1000,31192=>1000,31193=>1000,31194=>1000,31195=>1000,31196=>1000,31197=>1000, -31198=>1000,31199=>1000,31200=>1000,31201=>1000,31202=>1000,31203=>1000,31204=>1000,31205=>1000,31206=>1000,31207=>1000, -31208=>1000,31209=>1000,31210=>1000,31211=>1000,31212=>1000,31213=>1000,31214=>1000,31215=>1000,31216=>1000,31217=>1000, -31218=>1000,31219=>1000,31220=>1000,31221=>1000,31222=>1000,31223=>1000,31224=>1000,31225=>1000,31226=>1000,31227=>1000, -31228=>1000,31229=>1000,31230=>1000,31231=>1000,31232=>1000,31233=>1000,31234=>1000,31235=>1000,31236=>1000,31237=>1000, -31238=>1000,31239=>1000,31240=>1000,31241=>1000,31242=>1000,31243=>1000,31244=>1000,31245=>1000,31246=>1000,31247=>1000, -31248=>1000,31249=>1000,31250=>1000,31251=>1000,31252=>1000,31253=>1000,31254=>1000,31255=>1000,31256=>1000,31257=>1000, -31258=>1000,31259=>1000,31260=>1000,31261=>1000,31262=>1000,31263=>1000,31264=>1000,31265=>1000,31266=>1000,31267=>1000, -31268=>1000,31269=>1000,31270=>1000,31271=>1000,31272=>1000,31273=>1000,31274=>1000,31275=>1000,31276=>1000,31277=>1000, -31278=>1000,31279=>1000,31280=>1000,31281=>1000,31282=>1000,31283=>1000,31284=>1000,31285=>1000,31286=>1000,31287=>1000, -31288=>1000,31289=>1000,31290=>1000,31291=>1000,31292=>1000,31293=>1000,31294=>1000,31295=>1000,31296=>1000,31297=>1000, -31298=>1000,31299=>1000,31300=>1000,31301=>1000,31302=>1000,31303=>1000,31304=>1000,31305=>1000,31306=>1000,31307=>1000, -31308=>1000,31309=>1000,31310=>1000,31311=>1000,31312=>1000,31313=>1000,31314=>1000,31315=>1000,31316=>1000,31317=>1000, -31318=>1000,31319=>1000,31320=>1000,31321=>1000,31322=>1000,31323=>1000,31324=>1000,31325=>1000,31326=>1000,31327=>1000, -31328=>1000,31329=>1000,31330=>1000,31331=>1000,31332=>1000,31333=>1000,31334=>1000,31335=>1000,31336=>1000,31337=>1000, -31338=>1000,31339=>1000,31340=>1000,31341=>1000,31342=>1000,31343=>1000,31344=>1000,31345=>1000,31346=>1000,31347=>1000, -31348=>1000,31349=>1000,31350=>1000,31351=>1000,31352=>1000,31353=>1000,31354=>1000,31355=>1000,31356=>1000,31357=>1000, -31358=>1000,31359=>1000,31360=>1000,31361=>1000,31362=>1000,31363=>1000,31364=>1000,31365=>1000,31366=>1000,31367=>1000, -31368=>1000,31369=>1000,31370=>1000,31371=>1000,31372=>1000,31373=>1000,31374=>1000,31375=>1000,31376=>1000,31377=>1000, -31378=>1000,31379=>1000,31380=>1000,31381=>1000,31382=>1000,31383=>1000,31384=>1000,31385=>1000,31386=>1000,31387=>1000, -31388=>1000,31389=>1000,31390=>1000,31391=>1000,31392=>1000,31393=>1000,31394=>1000,31395=>1000,31396=>1000,31397=>1000, -31398=>1000,31399=>1000,31400=>1000,31401=>1000,31402=>1000,31403=>1000,31404=>1000,31405=>1000,31406=>1000,31407=>1000, -31408=>1000,31409=>1000,31410=>1000,31411=>1000,31412=>1000,31413=>1000,31414=>1000,31415=>1000,31416=>1000,31417=>1000, -31418=>1000,31419=>1000,31420=>1000,31421=>1000,31422=>1000,31423=>1000,31424=>1000,31425=>1000,31426=>1000,31427=>1000, -31428=>1000,31429=>1000,31430=>1000,31431=>1000,31432=>1000,31433=>1000,31434=>1000,31435=>1000,31436=>1000,31437=>1000, -31438=>1000,31439=>1000,31440=>1000,31441=>1000,31442=>1000,31443=>1000,31444=>1000,31445=>1000,31446=>1000,31447=>1000, -31448=>1000,31449=>1000,31450=>1000,31451=>1000,31452=>1000,31453=>1000,31454=>1000,31455=>1000,31456=>1000,31457=>1000, -31458=>1000,31459=>1000,31460=>1000,31461=>1000,31462=>1000,31463=>1000,31464=>1000,31465=>1000,31466=>1000,31467=>1000, -31468=>1000,31469=>1000,31470=>1000,31471=>1000,31472=>1000,31473=>1000,31474=>1000,31475=>1000,31476=>1000,31477=>1000, -31478=>1000,31479=>1000,31480=>1000,31481=>1000,31482=>1000,31483=>1000,31484=>1000,31485=>1000,31486=>1000,31487=>1000, -31488=>1000,31489=>1000,31490=>1000,31491=>1000,31492=>1000,31493=>1000,31494=>1000,31495=>1000,31496=>1000,31497=>1000, -31498=>1000,31499=>1000,31500=>1000,31501=>1000,31502=>1000,31503=>1000,31504=>1000,31505=>1000,31506=>1000,31507=>1000, -31508=>1000,31509=>1000,31510=>1000,31511=>1000,31512=>1000,31513=>1000,31514=>1000,31515=>1000,31516=>1000,31517=>1000, -31518=>1000,31519=>1000,31520=>1000,31521=>1000,31522=>1000,31523=>1000,31524=>1000,31525=>1000,31526=>1000,31527=>1000, -31528=>1000,31529=>1000,31530=>1000,31531=>1000,31532=>1000,31533=>1000,31534=>1000,31535=>1000,31536=>1000,31537=>1000, -31538=>1000,31539=>1000,31540=>1000,31541=>1000,31542=>1000,31543=>1000,31544=>1000,31545=>1000,31546=>1000,31547=>1000, -31548=>1000,31549=>1000,31550=>1000,31551=>1000,31552=>1000,31553=>1000,31554=>1000,31555=>1000,31556=>1000,31557=>1000, -31558=>1000,31559=>1000,31560=>1000,31561=>1000,31562=>1000,31563=>1000,31564=>1000,31565=>1000,31566=>1000,31567=>1000, -31568=>1000,31569=>1000,31570=>1000,31571=>1000,31572=>1000,31573=>1000,31574=>1000,31575=>1000,31576=>1000,31577=>1000, -31578=>1000,31579=>1000,31580=>1000,31581=>1000,31582=>1000,31583=>1000,31584=>1000,31585=>1000,31586=>1000,31587=>1000, -31588=>1000,31589=>1000,31590=>1000,31591=>1000,31592=>1000,31593=>1000,31594=>1000,31595=>1000,31596=>1000,31597=>1000, -31598=>1000,31599=>1000,31600=>1000,31601=>1000,31602=>1000,31603=>1000,31604=>1000,31605=>1000,31606=>1000,31607=>1000, -31608=>1000,31609=>1000,31610=>1000,31611=>1000,31612=>1000,31613=>1000,31614=>1000,31615=>1000,31616=>1000,31617=>1000, -31618=>1000,31619=>1000,31620=>1000,31621=>1000,31622=>1000,31623=>1000,31624=>1000,31625=>1000,31626=>1000,31627=>1000, -31628=>1000,31629=>1000,31630=>1000,31631=>1000,31632=>1000,31633=>1000,31634=>1000,31635=>1000,31636=>1000,31637=>1000, -31638=>1000,31639=>1000,31640=>1000,31641=>1000,31642=>1000,31643=>1000,31644=>1000,31645=>1000,31646=>1000,31647=>1000, -31648=>1000,31649=>1000,31650=>1000,31651=>1000,31652=>1000,31653=>1000,31654=>1000,31655=>1000,31656=>1000,31657=>1000, -31658=>1000,31659=>1000,31660=>1000,31661=>1000,31662=>1000,31663=>1000,31664=>1000,31665=>1000,31666=>1000,31667=>1000, -31668=>1000,31669=>1000,31670=>1000,31671=>1000,31672=>1000,31673=>1000,31674=>1000,31675=>1000,31676=>1000,31677=>1000, -31678=>1000,31679=>1000,31680=>1000,31681=>1000,31682=>1000,31683=>1000,31684=>1000,31685=>1000,31686=>1000,31687=>1000, -31688=>1000,31689=>1000,31690=>1000,31691=>1000,31692=>1000,31693=>1000,31694=>1000,31695=>1000,31696=>1000,31697=>1000, -31698=>1000,31699=>1000,31700=>1000,31701=>1000,31702=>1000,31703=>1000,31704=>1000,31705=>1000,31706=>1000,31707=>1000, -31708=>1000,31709=>1000,31710=>1000,31711=>1000,31712=>1000,31713=>1000,31714=>1000,31715=>1000,31716=>1000,31717=>1000, -31718=>1000,31719=>1000,31720=>1000,31721=>1000,31722=>1000,31723=>1000,31724=>1000,31725=>1000,31726=>1000,31727=>1000, -31728=>1000,31729=>1000,31730=>1000,31731=>1000,31732=>1000,31733=>1000,31734=>1000,31735=>1000,31736=>1000,31737=>1000, -31738=>1000,31739=>1000,31740=>1000,31741=>1000,31742=>1000,31743=>1000,31744=>1000,31745=>1000,31746=>1000,31747=>1000, -31748=>1000,31749=>1000,31750=>1000,31751=>1000,31752=>1000,31753=>1000,31754=>1000,31755=>1000,31756=>1000,31757=>1000, -31758=>1000,31759=>1000,31760=>1000,31761=>1000,31762=>1000,31763=>1000,31764=>1000,31765=>1000,31766=>1000,31767=>1000, -31768=>1000,31769=>1000,31770=>1000,31771=>1000,31772=>1000,31773=>1000,31774=>1000,31775=>1000,31776=>1000,31777=>1000, -31778=>1000,31779=>1000,31780=>1000,31781=>1000,31782=>1000,31783=>1000,31784=>1000,31785=>1000,31786=>1000,31787=>1000, -31788=>1000,31789=>1000,31790=>1000,31791=>1000,31792=>1000,31793=>1000,31794=>1000,31795=>1000,31796=>1000,31797=>1000, -31798=>1000,31799=>1000,31800=>1000,31801=>1000,31802=>1000,31803=>1000,31804=>1000,31805=>1000,31806=>1000,31807=>1000, -31808=>1000,31809=>1000,31810=>1000,31811=>1000,31812=>1000,31813=>1000,31814=>1000,31815=>1000,31816=>1000,31817=>1000, -31818=>1000,31819=>1000,31820=>1000,31821=>1000,31822=>1000,31823=>1000,31824=>1000,31825=>1000,31826=>1000,31827=>1000, -31828=>1000,31829=>1000,31830=>1000,31831=>1000,31832=>1000,31833=>1000,31834=>1000,31835=>1000,31836=>1000,31837=>1000, -31838=>1000,31839=>1000,31840=>1000,31841=>1000,31842=>1000,31843=>1000,31844=>1000,31845=>1000,31846=>1000,31847=>1000, -31848=>1000,31849=>1000,31850=>1000,31851=>1000,31852=>1000,31853=>1000,31854=>1000,31855=>1000,31856=>1000,31857=>1000, -31858=>1000,31859=>1000,31860=>1000,31861=>1000,31862=>1000,31863=>1000,31864=>1000,31865=>1000,31866=>1000,31867=>1000, -31868=>1000,31869=>1000,31870=>1000,31871=>1000,31872=>1000,31873=>1000,31874=>1000,31875=>1000,31876=>1000,31877=>1000, -31878=>1000,31879=>1000,31880=>1000,31881=>1000,31882=>1000,31883=>1000,31884=>1000,31885=>1000,31886=>1000,31887=>1000, -31888=>1000,31889=>1000,31890=>1000,31891=>1000,31892=>1000,31893=>1000,31894=>1000,31895=>1000,31896=>1000,31897=>1000, -31898=>1000,31899=>1000,31900=>1000,31901=>1000,31902=>1000,31903=>1000,31904=>1000,31905=>1000,31906=>1000,31907=>1000, -31908=>1000,31909=>1000,31910=>1000,31911=>1000,31912=>1000,31913=>1000,31914=>1000,31915=>1000,31916=>1000,31917=>1000, -31918=>1000,31919=>1000,31920=>1000,31921=>1000,31922=>1000,31923=>1000,31924=>1000,31925=>1000,31926=>1000,31927=>1000, -31928=>1000,31929=>1000,31930=>1000,31931=>1000,31932=>1000,31933=>1000,31934=>1000,31935=>1000,31936=>1000,31937=>1000, -31938=>1000,31939=>1000,31940=>1000,31941=>1000,31942=>1000,31943=>1000,31944=>1000,31945=>1000,31946=>1000,31947=>1000, -31948=>1000,31949=>1000,31950=>1000,31951=>1000,31952=>1000,31953=>1000,31954=>1000,31955=>1000,31956=>1000,31957=>1000, -31958=>1000,31959=>1000,31960=>1000,31961=>1000,31962=>1000,31963=>1000,31964=>1000,31965=>1000,31966=>1000,31967=>1000, -31968=>1000,31969=>1000,31970=>1000,31971=>1000,31972=>1000,31973=>1000,31974=>1000,31975=>1000,31976=>1000,31977=>1000, -31978=>1000,31979=>1000,31980=>1000,31981=>1000,31982=>1000,31983=>1000,31984=>1000,31985=>1000,31986=>1000,31987=>1000, -31988=>1000,31989=>1000,31990=>1000,31991=>1000,31992=>1000,31993=>1000,31994=>1000,31995=>1000,31996=>1000,31997=>1000, -31998=>1000,31999=>1000,32000=>1000,32001=>1000,32002=>1000,32003=>1000,32004=>1000,32005=>1000,32006=>1000,32007=>1000, -32008=>1000,32009=>1000,32010=>1000,32011=>1000,32012=>1000,32013=>1000,32014=>1000,32015=>1000,32016=>1000,32017=>1000, -32018=>1000,32019=>1000,32020=>1000,32021=>1000,32022=>1000,32023=>1000,32024=>1000,32025=>1000,32026=>1000,32027=>1000, -32028=>1000,32029=>1000,32030=>1000,32031=>1000,32032=>1000,32033=>1000,32034=>1000,32035=>1000,32036=>1000,32037=>1000, -32038=>1000,32039=>1000,32040=>1000,32041=>1000,32042=>1000,32043=>1000,32044=>1000,32045=>1000,32046=>1000,32047=>1000, -32048=>1000,32049=>1000,32050=>1000,32051=>1000,32052=>1000,32053=>1000,32054=>1000,32055=>1000,32056=>1000,32057=>1000, -32058=>1000,32059=>1000,32060=>1000,32061=>1000,32062=>1000,32063=>1000,32064=>1000,32065=>1000,32066=>1000,32067=>1000, -32068=>1000,32069=>1000,32070=>1000,32071=>1000,32072=>1000,32073=>1000,32074=>1000,32075=>1000,32076=>1000,32077=>1000, -32078=>1000,32079=>1000,32080=>1000,32081=>1000,32082=>1000,32083=>1000,32084=>1000,32085=>1000,32086=>1000,32087=>1000, -32088=>1000,32089=>1000,32090=>1000,32091=>1000,32092=>1000,32093=>1000,32094=>1000,32095=>1000,32096=>1000,32097=>1000, -32098=>1000,32099=>1000,32100=>1000,32101=>1000,32102=>1000,32103=>1000,32104=>1000,32105=>1000,32106=>1000,32107=>1000, -32108=>1000,32109=>1000,32110=>1000,32111=>1000,32112=>1000,32113=>1000,32114=>1000,32115=>1000,32116=>1000,32117=>1000, -32118=>1000,32119=>1000,32120=>1000,32121=>1000,32122=>1000,32123=>1000,32124=>1000,32125=>1000,32126=>1000,32127=>1000, -32128=>1000,32129=>1000,32130=>1000,32131=>1000,32132=>1000,32133=>1000,32134=>1000,32135=>1000,32136=>1000,32137=>1000, -32138=>1000,32139=>1000,32140=>1000,32141=>1000,32142=>1000,32143=>1000,32144=>1000,32145=>1000,32146=>1000,32147=>1000, -32148=>1000,32149=>1000,32150=>1000,32151=>1000,32152=>1000,32153=>1000,32154=>1000,32155=>1000,32156=>1000,32157=>1000, -32158=>1000,32159=>1000,32160=>1000,32161=>1000,32162=>1000,32163=>1000,32164=>1000,32165=>1000,32166=>1000,32167=>1000, -32168=>1000,32169=>1000,32170=>1000,32171=>1000,32172=>1000,32173=>1000,32174=>1000,32175=>1000,32176=>1000,32177=>1000, -32178=>1000,32179=>1000,32180=>1000,32181=>1000,32182=>1000,32183=>1000,32184=>1000,32185=>1000,32186=>1000,32187=>1000, -32188=>1000,32189=>1000,32190=>1000,32191=>1000,32192=>1000,32193=>1000,32194=>1000,32195=>1000,32196=>1000,32197=>1000, -32198=>1000,32199=>1000,32200=>1000,32201=>1000,32202=>1000,32203=>1000,32204=>1000,32205=>1000,32206=>1000,32207=>1000, -32208=>1000,32209=>1000,32210=>1000,32211=>1000,32212=>1000,32213=>1000,32214=>1000,32215=>1000,32216=>1000,32217=>1000, -32218=>1000,32219=>1000,32220=>1000,32221=>1000,32222=>1000,32223=>1000,32224=>1000,32225=>1000,32226=>1000,32227=>1000, -32228=>1000,32229=>1000,32230=>1000,32231=>1000,32232=>1000,32233=>1000,32234=>1000,32235=>1000,32236=>1000,32237=>1000, -32238=>1000,32239=>1000,32240=>1000,32241=>1000,32242=>1000,32243=>1000,32244=>1000,32245=>1000,32246=>1000,32247=>1000, -32248=>1000,32249=>1000,32250=>1000,32251=>1000,32252=>1000,32253=>1000,32254=>1000,32255=>1000,32256=>1000,32257=>1000, -32258=>1000,32259=>1000,32260=>1000,32261=>1000,32262=>1000,32263=>1000,32264=>1000,32265=>1000,32266=>1000,32267=>1000, -32268=>1000,32269=>1000,32270=>1000,32271=>1000,32272=>1000,32273=>1000,32274=>1000,32275=>1000,32276=>1000,32277=>1000, -32278=>1000,32279=>1000,32280=>1000,32281=>1000,32282=>1000,32283=>1000,32284=>1000,32285=>1000,32286=>1000,32287=>1000, -32288=>1000,32289=>1000,32290=>1000,32291=>1000,32292=>1000,32293=>1000,32294=>1000,32295=>1000,32296=>1000,32297=>1000, -32298=>1000,32299=>1000,32300=>1000,32301=>1000,32302=>1000,32303=>1000,32304=>1000,32305=>1000,32306=>1000,32307=>1000, -32308=>1000,32309=>1000,32310=>1000,32311=>1000,32312=>1000,32313=>1000,32314=>1000,32315=>1000,32316=>1000,32317=>1000, -32318=>1000,32319=>1000,32320=>1000,32321=>1000,32322=>1000,32323=>1000,32324=>1000,32325=>1000,32326=>1000,32327=>1000, -32328=>1000,32329=>1000,32330=>1000,32331=>1000,32332=>1000,32333=>1000,32334=>1000,32335=>1000,32336=>1000,32337=>1000, -32338=>1000,32339=>1000,32340=>1000,32341=>1000,32342=>1000,32343=>1000,32344=>1000,32345=>1000,32346=>1000,32347=>1000, -32348=>1000,32349=>1000,32350=>1000,32351=>1000,32352=>1000,32353=>1000,32354=>1000,32355=>1000,32356=>1000,32357=>1000, -32358=>1000,32359=>1000,32360=>1000,32361=>1000,32362=>1000,32363=>1000,32364=>1000,32365=>1000,32366=>1000,32367=>1000, -32368=>1000,32369=>1000,32370=>1000,32371=>1000,32372=>1000,32373=>1000,32374=>1000,32375=>1000,32376=>1000,32377=>1000, -32378=>1000,32379=>1000,32380=>1000,32381=>1000,32382=>1000,32383=>1000,32384=>1000,32385=>1000,32386=>1000,32387=>1000, -32388=>1000,32389=>1000,32390=>1000,32391=>1000,32392=>1000,32393=>1000,32394=>1000,32395=>1000,32396=>1000,32397=>1000, -32398=>1000,32399=>1000,32400=>1000,32401=>1000,32402=>1000,32403=>1000,32404=>1000,32405=>1000,32406=>1000,32407=>1000, -32408=>1000,32409=>1000,32410=>1000,32411=>1000,32412=>1000,32413=>1000,32414=>1000,32415=>1000,32416=>1000,32417=>1000, -32418=>1000,32419=>1000,32420=>1000,32421=>1000,32422=>1000,32423=>1000,32424=>1000,32425=>1000,32426=>1000,32427=>1000, -32428=>1000,32429=>1000,32430=>1000,32431=>1000,32432=>1000,32433=>1000,32434=>1000,32435=>1000,32436=>1000,32437=>1000, -32438=>1000,32439=>1000,32440=>1000,32441=>1000,32442=>1000,32443=>1000,32444=>1000,32445=>1000,32446=>1000,32447=>1000, -32448=>1000,32449=>1000,32450=>1000,32451=>1000,32452=>1000,32453=>1000,32454=>1000,32455=>1000,32456=>1000,32457=>1000, -32458=>1000,32459=>1000,32460=>1000,32461=>1000,32462=>1000,32463=>1000,32464=>1000,32465=>1000,32466=>1000,32467=>1000, -32468=>1000,32469=>1000,32470=>1000,32471=>1000,32472=>1000,32473=>1000,32474=>1000,32475=>1000,32476=>1000,32477=>1000, -32478=>1000,32479=>1000,32480=>1000,32481=>1000,32482=>1000,32483=>1000,32484=>1000,32485=>1000,32486=>1000,32487=>1000, -32488=>1000,32489=>1000,32490=>1000,32491=>1000,32492=>1000,32493=>1000,32494=>1000,32495=>1000,32496=>1000,32497=>1000, -32498=>1000,32499=>1000,32500=>1000,32501=>1000,32502=>1000,32503=>1000,32504=>1000,32505=>1000,32506=>1000,32507=>1000, -32508=>1000,32509=>1000,32510=>1000,32511=>1000,32512=>1000,32513=>1000,32514=>1000,32515=>1000,32516=>1000,32517=>1000, -32518=>1000,32519=>1000,32520=>1000,32521=>1000,32522=>1000,32523=>1000,32524=>1000,32525=>1000,32526=>1000,32527=>1000, -32528=>1000,32529=>1000,32530=>1000,32531=>1000,32532=>1000,32533=>1000,32534=>1000,32535=>1000,32536=>1000,32537=>1000, -32538=>1000,32539=>1000,32540=>1000,32541=>1000,32542=>1000,32543=>1000,32544=>1000,32545=>1000,32546=>1000,32547=>1000, -32548=>1000,32549=>1000,32550=>1000,32551=>1000,32552=>1000,32553=>1000,32554=>1000,32555=>1000,32556=>1000,32557=>1000, -32558=>1000,32559=>1000,32560=>1000,32561=>1000,32562=>1000,32563=>1000,32564=>1000,32565=>1000,32566=>1000,32567=>1000, -32568=>1000,32569=>1000,32570=>1000,32571=>1000,32572=>1000,32573=>1000,32574=>1000,32575=>1000,32576=>1000,32577=>1000, -32578=>1000,32579=>1000,32580=>1000,32581=>1000,32582=>1000,32583=>1000,32584=>1000,32585=>1000,32586=>1000,32587=>1000, -32588=>1000,32589=>1000,32590=>1000,32591=>1000,32592=>1000,32593=>1000,32594=>1000,32595=>1000,32596=>1000,32597=>1000, -32598=>1000,32599=>1000,32600=>1000,32601=>1000,32602=>1000,32603=>1000,32604=>1000,32605=>1000,32606=>1000,32607=>1000, -32608=>1000,32609=>1000,32610=>1000,32611=>1000,32612=>1000,32613=>1000,32614=>1000,32615=>1000,32616=>1000,32617=>1000, -32618=>1000,32619=>1000,32620=>1000,32621=>1000,32622=>1000,32623=>1000,32624=>1000,32625=>1000,32626=>1000,32627=>1000, -32628=>1000,32629=>1000,32630=>1000,32631=>1000,32632=>1000,32633=>1000,32634=>1000,32635=>1000,32636=>1000,32637=>1000, -32638=>1000,32639=>1000,32640=>1000,32641=>1000,32642=>1000,32643=>1000,32644=>1000,32645=>1000,32646=>1000,32647=>1000, -32648=>1000,32649=>1000,32650=>1000,32651=>1000,32652=>1000,32653=>1000,32654=>1000,32655=>1000,32656=>1000,32657=>1000, -32658=>1000,32659=>1000,32660=>1000,32661=>1000,32662=>1000,32663=>1000,32664=>1000,32665=>1000,32666=>1000,32667=>1000, -32668=>1000,32669=>1000,32670=>1000,32671=>1000,32672=>1000,32673=>1000,32674=>1000,32675=>1000,32676=>1000,32677=>1000, -32678=>1000,32679=>1000,32680=>1000,32681=>1000,32682=>1000,32683=>1000,32684=>1000,32685=>1000,32686=>1000,32687=>1000, -32688=>1000,32689=>1000,32690=>1000,32691=>1000,32692=>1000,32693=>1000,32694=>1000,32695=>1000,32696=>1000,32697=>1000, -32698=>1000,32699=>1000,32700=>1000,32701=>1000,32702=>1000,32703=>1000,32704=>1000,32705=>1000,32706=>1000,32707=>1000, -32708=>1000,32709=>1000,32710=>1000,32711=>1000,32712=>1000,32713=>1000,32714=>1000,32715=>1000,32716=>1000,32717=>1000, -32718=>1000,32719=>1000,32720=>1000,32721=>1000,32722=>1000,32723=>1000,32724=>1000,32725=>1000,32726=>1000,32727=>1000, -32728=>1000,32729=>1000,32730=>1000,32731=>1000,32732=>1000,32733=>1000,32734=>1000,32735=>1000,32736=>1000,32737=>1000, -32738=>1000,32739=>1000,32740=>1000,32741=>1000,32742=>1000,32743=>1000,32744=>1000,32745=>1000,32746=>1000,32747=>1000, -32748=>1000,32749=>1000,32750=>1000,32751=>1000,32752=>1000,32753=>1000,32754=>1000,32755=>1000,32756=>1000,32757=>1000, -32758=>1000,32759=>1000,32760=>1000,32761=>1000,32762=>1000,32763=>1000,32764=>1000,32765=>1000,32766=>1000,32767=>1000, -32768=>1000,32769=>1000,32770=>1000,32771=>1000,32772=>1000); -$enc=''; -$diff=''; -$file='unifont.z'; -$ctg='unifont.ctg.z'; -$originalsize=16336376; -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/unifont.z b/include/limesurvey/admin/classes/tcpdf/fonts/unifont.z deleted file mode 100644 index 4ff238b7..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/unifont.z and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/README.TXT b/include/limesurvey/admin/classes/tcpdf/fonts/utils/README.TXT deleted file mode 100644 index 96d39fb8..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/README.TXT +++ /dev/null @@ -1,135 +0,0 @@ -TCPDF Fonts - -TCPDF supports TrueTypeUnicode (UTF-8 Unicode), OpenTypeUnicode, TrueType, OpenType, Type1, CID-0 and Core (standard) fonts. - -There are two ways to use a new font: embedding it in the PDF (with or without subsetting) or not. When a font is not embedded, it is searched in the system. The advantage is that the PDF file is lighter; on the other hand, if it is not available, a substitution font is used. So it is preferable to ensure that the needed font is installed on the client systems. If the file is to be viewed by a large audience, it is recommended to embed. - -TCPDF support font subsetting to reduce the size of documents using large unicode font files. -If you embed the whole font in the PDF, the person on the other end can make changes to it even if he didn't have your font. -If you subset the font, file size of the PDF will be smaller but the person who receives your PDF would need to have your same font in order to make changes to your PDF. -The option for enabling/disabling the font subsetting are explained on the source code documentation for methods SetFont() and AddFont(). - -The fonts that could be not embedded are only the standard core fonts and CID-0 fonts. - -The PDF Core (standard) fonts are: - - * courier : Courier - * courierb : Courier Bold - * courierbi : Courier Bold Italic - * courieri : Courier Italic - * helvetica : Helvetica - * helveticab : Helvetica Bold - * helveticabi : Helvetica Bold Italic - * helveticai : Helvetica Italic - * symbol : Symbol - * times : Times New Roman - * timesb : Times New Roman Bold - * timesbi : Times New Roman Bold Italic - * timesi : Times New Roman Italic - * zapfdingbats : Zapf Dingbats - -Setting up a font for usage with TCPDF requires the following steps: - - 1. Convert all font filenames to lowercase and rename using the following schema: - * [basic-font-name-in-lowercase].ttf for regular font - * [basic-font-name-in-lowercase]b.ttf for bold variation - * [basic-font-name-in-lowercase]i.ttf for oblique variation - * [basic-font-name-in-lowercase]bi.ttf for bold oblique variation - - 2. Generate the font's metrics file. - * For Type1 font files this first step is not necessary because the AFM file is usually shipped with the font. In case you have only a metric file in PFM format, use the pfm2afm utility (fonts/utils/pfm2afm) to get the AFM file. If you own a Type1 font in ASCII format (.pfa), you can convert it to binary format with Type 1 utilities. - * For TrueTypeUnicode or TrueType font files, use the the provided ttf2ufm utility (fonts/utils/ttf2ufm): - - $ ttf2ufm -a -F myfont.ttf - - * For OpenTypeUnicode or OpenType font files, use the the provided ttf2ufm utility (fonts/utils/ttf2ufm): - - $ ttf2ufm -a -F myfont.otf - - 3. Run makefont.php script. - * For TrueTypeUnicode: - - $ php -q makefont.php myfont.ttf myfont.ufm - - * For OpenTypeUnicode: - - $ php -q makefont.php myfont.otf myfont.ufm - - * For TrueType: - - $ php -q makefont.php myfont.ttf myfont.afm - - * For OpenType: - - $ php -q makefont.php myfont.otf myfont.afm - - * For Type1: - - $ php -q makefont.php myfont.pfb myfont.afm - - You may also specify additional parameters: - - MakeFont(string $fontfile, string $fmfile [, boolean $embedded [, $enc="cp1252" [, $patch=array()]]]) - - * $fontfile : Path to the .ttf or .pfb file. - * $fmfile : Path to the .afm file for Type1 and TrueType or .ufm for TrueTypeUnicode. - * $embedded : Set to false to not embed the font, true otherwise (default). - * $enc : Name of the encoding table to use. Default value: cp1252. Omit this parameter for TrueType Unicode, OpenType Unicode and symbolic fonts like Symbol or ZapfDingBats. The encoding defines the association between a code (from 0 to 255) and a character. The first 128 are fixed and correspond to ASCII. The encodings are stored in .map files. Those available are: - o cp1250 (Central Europe) - o cp1251 (Cyrillic) - o cp1252 (Western Europe) - o cp1253 (Greek) - o cp1254 (Turkish) - o cp1255 (Hebrew) - o cp1257 (Baltic) - o cp1258 (Vietnamese) - o cp874 (Thai) - o iso-8859-1 (Western Europe) - o iso-8859-2 (Central Europe) - o iso-8859-4 (Baltic) - o iso-8859-5 (Cyrillic) - o iso-8859-7 (Greek) - o iso-8859-9 (Turkish) - o iso-8859-11 (Thai) - o iso-8859-15 (Western Europe) - o iso-8859-16 (Central Europe) - o koi8-r (Russian) - o koi8-u (Ukrainian) - Of course, the font must contain the characters corresponding to the chosen encoding. The encodings which begin with cp are those used by Windows; Linux systems usually use ISO. - * $patch : Optional modification of the encoding. Empty by default. This parameter gives the possibility to alter the encoding. Sometimes you may want to add some characters. For instance, ISO-8859-1 does not contain the euro symbol. To add it at position 164, pass array(164=>'Euro'). - - 4. Edit and copy resulting files by case: - * For embedded fonts: copy the resulting .php, .z and .ctg.z (if available) files to the TCPDF fonts directory. - * For not-embedding the font, edit the .php file and comment the $file entry. - * For CID-0 fonts (not embeddeed) you have to edit the .php file: - o change the font type to: $type='cidfont0'; - o set the default font width by adding the line: $dw=1000; - o remove the $enc, $file and $ctg variables definitions - o add one of the following blocks of text at the end of the file (depends by the language you are using - see the arialunicid0.php file for a working example): - + // Chinese Simplified - $enc='UniCNS-UTF16-H'; - $cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'CNS1','Supplement'=>0); - include(dirname(__FILE__).'/uni2cid_ac15.php'); - - + // Chinese Traditional - $enc='UniGB-UTF16-H'; - $cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'GB1','Supplement'=>2); - include(dirname(__FILE__).'/uni2cid_ag15.php'); - - + // Korean - $enc='UniKS-UTF16-H'; - $cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Korea1','Supplement'=>0); - include(dirname(__FILE__).'/uni2cid_ak12.php'); - - + // Japanese - $enc='UniJIS-UTF16-H'; - $cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Japan1','Supplement'=>5); - include(dirname(__FILE__).'/uni2cid_aj16.php'); - - o copy the .php file to the TCPDF fonts directory. - 5. Rename php font files variations using the following schema: - * [basic-font-name-in-lowercase].php for regular font - * [basic-font-name-in-lowercase]b.php for bold variation - * [basic-font-name-in-lowercase]i.php for oblique variation - * [basic-font-name-in-lowercase]bi.php for bold oblique variation - diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1250.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1250.map deleted file mode 100644 index ec110af0..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1250.map +++ /dev/null @@ -1,251 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+015A Sacute -!8D U+0164 Tcaron -!8E U+017D Zcaron -!8F U+0179 Zacute -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+015B sacute -!9D U+0165 tcaron -!9E U+017E zcaron -!9F U+017A zacute -!A0 U+00A0 space -!A1 U+02C7 caron -!A2 U+02D8 breve -!A3 U+0141 Lslash -!A4 U+00A4 currency -!A5 U+0104 Aogonek -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+015E Scedilla -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+02DB ogonek -!B3 U+0142 lslash -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+0105 aogonek -!BA U+015F scedilla -!BB U+00BB guillemotright -!BC U+013D Lcaron -!BD U+02DD hungarumlaut -!BE U+013E lcaron -!BF U+017C zdotaccent -!C0 U+0154 Racute -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0139 Lacute -!C6 U+0106 Cacute -!C7 U+00C7 Ccedilla -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+011A Ecaron -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+010E Dcaron -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+0147 Ncaron -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0158 Rcaron -!D9 U+016E Uring -!DA U+00DA Uacute -!DB U+0170 Uhungarumlaut -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+0162 Tcommaaccent -!DF U+00DF germandbls -!E0 U+0155 racute -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+013A lacute -!E6 U+0107 cacute -!E7 U+00E7 ccedilla -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+011B ecaron -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+010F dcaron -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+0148 ncaron -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0159 rcaron -!F9 U+016F uring -!FA U+00FA uacute -!FB U+0171 uhungarumlaut -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+0163 tcommaaccent -!FF U+02D9 dotaccent diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1251.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1251.map deleted file mode 100644 index de6a198d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1251.map +++ /dev/null @@ -1,255 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0402 afii10051 -!81 U+0403 afii10052 -!82 U+201A quotesinglbase -!83 U+0453 afii10100 -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+20AC Euro -!89 U+2030 perthousand -!8A U+0409 afii10058 -!8B U+2039 guilsinglleft -!8C U+040A afii10059 -!8D U+040C afii10061 -!8E U+040B afii10060 -!8F U+040F afii10145 -!90 U+0452 afii10099 -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9A U+0459 afii10106 -!9B U+203A guilsinglright -!9C U+045A afii10107 -!9D U+045C afii10109 -!9E U+045B afii10108 -!9F U+045F afii10193 -!A0 U+00A0 space -!A1 U+040E afii10062 -!A2 U+045E afii10110 -!A3 U+0408 afii10057 -!A4 U+00A4 currency -!A5 U+0490 afii10050 -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+0401 afii10023 -!A9 U+00A9 copyright -!AA U+0404 afii10053 -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+0407 afii10056 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+0406 afii10055 -!B3 U+0456 afii10103 -!B4 U+0491 afii10098 -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+0451 afii10071 -!B9 U+2116 afii61352 -!BA U+0454 afii10101 -!BB U+00BB guillemotright -!BC U+0458 afii10105 -!BD U+0405 afii10054 -!BE U+0455 afii10102 -!BF U+0457 afii10104 -!C0 U+0410 afii10017 -!C1 U+0411 afii10018 -!C2 U+0412 afii10019 -!C3 U+0413 afii10020 -!C4 U+0414 afii10021 -!C5 U+0415 afii10022 -!C6 U+0416 afii10024 -!C7 U+0417 afii10025 -!C8 U+0418 afii10026 -!C9 U+0419 afii10027 -!CA U+041A afii10028 -!CB U+041B afii10029 -!CC U+041C afii10030 -!CD U+041D afii10031 -!CE U+041E afii10032 -!CF U+041F afii10033 -!D0 U+0420 afii10034 -!D1 U+0421 afii10035 -!D2 U+0422 afii10036 -!D3 U+0423 afii10037 -!D4 U+0424 afii10038 -!D5 U+0425 afii10039 -!D6 U+0426 afii10040 -!D7 U+0427 afii10041 -!D8 U+0428 afii10042 -!D9 U+0429 afii10043 -!DA U+042A afii10044 -!DB U+042B afii10045 -!DC U+042C afii10046 -!DD U+042D afii10047 -!DE U+042E afii10048 -!DF U+042F afii10049 -!E0 U+0430 afii10065 -!E1 U+0431 afii10066 -!E2 U+0432 afii10067 -!E3 U+0433 afii10068 -!E4 U+0434 afii10069 -!E5 U+0435 afii10070 -!E6 U+0436 afii10072 -!E7 U+0437 afii10073 -!E8 U+0438 afii10074 -!E9 U+0439 afii10075 -!EA U+043A afii10076 -!EB U+043B afii10077 -!EC U+043C afii10078 -!ED U+043D afii10079 -!EE U+043E afii10080 -!EF U+043F afii10081 -!F0 U+0440 afii10082 -!F1 U+0441 afii10083 -!F2 U+0442 afii10084 -!F3 U+0443 afii10085 -!F4 U+0444 afii10086 -!F5 U+0445 afii10087 -!F6 U+0446 afii10088 -!F7 U+0447 afii10089 -!F8 U+0448 afii10090 -!F9 U+0449 afii10091 -!FA U+044A afii10092 -!FB U+044B afii10093 -!FC U+044C afii10094 -!FD U+044D afii10095 -!FE U+044E afii10096 -!FF U+044F afii10097 diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1252.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1252.map deleted file mode 100644 index dd490e59..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1252.map +++ /dev/null @@ -1,251 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+0152 OE -!8E U+017D Zcaron -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+0153 oe -!9E U+017E zcaron -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1253.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1253.map deleted file mode 100644 index 4bd826fb..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1253.map +++ /dev/null @@ -1,239 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9B U+203A guilsinglright -!A0 U+00A0 space -!A1 U+0385 dieresistonos -!A2 U+0386 Alphatonos -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+2015 afii00208 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+0384 tonos -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+0388 Epsilontonos -!B9 U+0389 Etatonos -!BA U+038A Iotatonos -!BB U+00BB guillemotright -!BC U+038C Omicrontonos -!BD U+00BD onehalf -!BE U+038E Upsilontonos -!BF U+038F Omegatonos -!C0 U+0390 iotadieresistonos -!C1 U+0391 Alpha -!C2 U+0392 Beta -!C3 U+0393 Gamma -!C4 U+0394 Delta -!C5 U+0395 Epsilon -!C6 U+0396 Zeta -!C7 U+0397 Eta -!C8 U+0398 Theta -!C9 U+0399 Iota -!CA U+039A Kappa -!CB U+039B Lambda -!CC U+039C Mu -!CD U+039D Nu -!CE U+039E Xi -!CF U+039F Omicron -!D0 U+03A0 Pi -!D1 U+03A1 Rho -!D3 U+03A3 Sigma -!D4 U+03A4 Tau -!D5 U+03A5 Upsilon -!D6 U+03A6 Phi -!D7 U+03A7 Chi -!D8 U+03A8 Psi -!D9 U+03A9 Omega -!DA U+03AA Iotadieresis -!DB U+03AB Upsilondieresis -!DC U+03AC alphatonos -!DD U+03AD epsilontonos -!DE U+03AE etatonos -!DF U+03AF iotatonos -!E0 U+03B0 upsilondieresistonos -!E1 U+03B1 alpha -!E2 U+03B2 beta -!E3 U+03B3 gamma -!E4 U+03B4 delta -!E5 U+03B5 epsilon -!E6 U+03B6 zeta -!E7 U+03B7 eta -!E8 U+03B8 theta -!E9 U+03B9 iota -!EA U+03BA kappa -!EB U+03BB lambda -!EC U+03BC mu -!ED U+03BD nu -!EE U+03BE xi -!EF U+03BF omicron -!F0 U+03C0 pi -!F1 U+03C1 rho -!F2 U+03C2 sigma1 -!F3 U+03C3 sigma -!F4 U+03C4 tau -!F5 U+03C5 upsilon -!F6 U+03C6 phi -!F7 U+03C7 chi -!F8 U+03C8 psi -!F9 U+03C9 omega -!FA U+03CA iotadieresis -!FB U+03CB upsilondieresis -!FC U+03CC omicrontonos -!FD U+03CD upsilontonos -!FE U+03CE omegatonos diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1254.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1254.map deleted file mode 100644 index 829473b2..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1254.map +++ /dev/null @@ -1,249 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+0152 OE -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+0153 oe -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+011E Gbreve -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0130 Idotaccent -!DE U+015E Scedilla -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+011F gbreve -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0131 dotlessi -!FE U+015F scedilla -!FF U+00FF ydieresis diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1255.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1255.map deleted file mode 100644 index 079e10c6..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1255.map +++ /dev/null @@ -1,233 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9B U+203A guilsinglright -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+20AA afii57636 -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00D7 multiply -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD sfthyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 middot -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00F7 divide -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+05B0 afii57799 -!C1 U+05B1 afii57801 -!C2 U+05B2 afii57800 -!C3 U+05B3 afii57802 -!C4 U+05B4 afii57793 -!C5 U+05B5 afii57794 -!C6 U+05B6 afii57795 -!C7 U+05B7 afii57798 -!C8 U+05B8 afii57797 -!C9 U+05B9 afii57806 -!CB U+05BB afii57796 -!CC U+05BC afii57807 -!CD U+05BD afii57839 -!CE U+05BE afii57645 -!CF U+05BF afii57841 -!D0 U+05C0 afii57842 -!D1 U+05C1 afii57804 -!D2 U+05C2 afii57803 -!D3 U+05C3 afii57658 -!D4 U+05F0 afii57716 -!D5 U+05F1 afii57717 -!D6 U+05F2 afii57718 -!D7 U+05F3 gereshhebrew -!D8 U+05F4 gershayimhebrew -!E0 U+05D0 afii57664 -!E1 U+05D1 afii57665 -!E2 U+05D2 afii57666 -!E3 U+05D3 afii57667 -!E4 U+05D4 afii57668 -!E5 U+05D5 afii57669 -!E6 U+05D6 afii57670 -!E7 U+05D7 afii57671 -!E8 U+05D8 afii57672 -!E9 U+05D9 afii57673 -!EA U+05DA afii57674 -!EB U+05DB afii57675 -!EC U+05DC afii57676 -!ED U+05DD afii57677 -!EE U+05DE afii57678 -!EF U+05DF afii57679 -!F0 U+05E0 afii57680 -!F1 U+05E1 afii57681 -!F2 U+05E2 afii57682 -!F3 U+05E3 afii57683 -!F4 U+05E4 afii57684 -!F5 U+05E5 afii57685 -!F6 U+05E6 afii57686 -!F7 U+05E7 afii57687 -!F8 U+05E8 afii57688 -!F9 U+05E9 afii57689 -!FA U+05EA afii57690 -!FD U+200E afii299 -!FE U+200F afii300 diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1257.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1257.map deleted file mode 100644 index 2f2ecfa2..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1257.map +++ /dev/null @@ -1,244 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!8D U+00A8 dieresis -!8E U+02C7 caron -!8F U+00B8 cedilla -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9B U+203A guilsinglright -!9D U+00AF macron -!9E U+02DB ogonek -!A0 U+00A0 space -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00D8 Oslash -!A9 U+00A9 copyright -!AA U+0156 Rcommaaccent -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00C6 AE -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00F8 oslash -!B9 U+00B9 onesuperior -!BA U+0157 rcommaaccent -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00E6 ae -!C0 U+0104 Aogonek -!C1 U+012E Iogonek -!C2 U+0100 Amacron -!C3 U+0106 Cacute -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+0118 Eogonek -!C7 U+0112 Emacron -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0179 Zacute -!CB U+0116 Edotaccent -!CC U+0122 Gcommaaccent -!CD U+0136 Kcommaaccent -!CE U+012A Imacron -!CF U+013B Lcommaaccent -!D0 U+0160 Scaron -!D1 U+0143 Nacute -!D2 U+0145 Ncommaaccent -!D3 U+00D3 Oacute -!D4 U+014C Omacron -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0172 Uogonek -!D9 U+0141 Lslash -!DA U+015A Sacute -!DB U+016A Umacron -!DC U+00DC Udieresis -!DD U+017B Zdotaccent -!DE U+017D Zcaron -!DF U+00DF germandbls -!E0 U+0105 aogonek -!E1 U+012F iogonek -!E2 U+0101 amacron -!E3 U+0107 cacute -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+0119 eogonek -!E7 U+0113 emacron -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+017A zacute -!EB U+0117 edotaccent -!EC U+0123 gcommaaccent -!ED U+0137 kcommaaccent -!EE U+012B imacron -!EF U+013C lcommaaccent -!F0 U+0161 scaron -!F1 U+0144 nacute -!F2 U+0146 ncommaaccent -!F3 U+00F3 oacute -!F4 U+014D omacron -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0173 uogonek -!F9 U+0142 lslash -!FA U+015B sacute -!FB U+016B umacron -!FC U+00FC udieresis -!FD U+017C zdotaccent -!FE U+017E zcaron -!FF U+02D9 dotaccent diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1258.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1258.map deleted file mode 100644 index fed915f7..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp1258.map +++ /dev/null @@ -1,247 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!8C U+0152 OE -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9B U+203A guilsinglright -!9C U+0153 oe -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+0300 gravecomb -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+0110 Dcroat -!D1 U+00D1 Ntilde -!D2 U+0309 hookabovecomb -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+01A0 Ohorn -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+01AF Uhorn -!DE U+0303 tildecomb -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+0301 acutecomb -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+0111 dcroat -!F1 U+00F1 ntilde -!F2 U+0323 dotbelowcomb -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+01A1 ohorn -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+01B0 uhorn -!FE U+20AB dong -!FF U+00FF ydieresis diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp874.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp874.map deleted file mode 100644 index 1006e6b1..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/cp874.map +++ /dev/null @@ -1,225 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!85 U+2026 ellipsis -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!A0 U+00A0 space -!A1 U+0E01 kokaithai -!A2 U+0E02 khokhaithai -!A3 U+0E03 khokhuatthai -!A4 U+0E04 khokhwaithai -!A5 U+0E05 khokhonthai -!A6 U+0E06 khorakhangthai -!A7 U+0E07 ngonguthai -!A8 U+0E08 chochanthai -!A9 U+0E09 chochingthai -!AA U+0E0A chochangthai -!AB U+0E0B sosothai -!AC U+0E0C chochoethai -!AD U+0E0D yoyingthai -!AE U+0E0E dochadathai -!AF U+0E0F topatakthai -!B0 U+0E10 thothanthai -!B1 U+0E11 thonangmonthothai -!B2 U+0E12 thophuthaothai -!B3 U+0E13 nonenthai -!B4 U+0E14 dodekthai -!B5 U+0E15 totaothai -!B6 U+0E16 thothungthai -!B7 U+0E17 thothahanthai -!B8 U+0E18 thothongthai -!B9 U+0E19 nonuthai -!BA U+0E1A bobaimaithai -!BB U+0E1B poplathai -!BC U+0E1C phophungthai -!BD U+0E1D fofathai -!BE U+0E1E phophanthai -!BF U+0E1F fofanthai -!C0 U+0E20 phosamphaothai -!C1 U+0E21 momathai -!C2 U+0E22 yoyakthai -!C3 U+0E23 roruathai -!C4 U+0E24 ruthai -!C5 U+0E25 lolingthai -!C6 U+0E26 luthai -!C7 U+0E27 wowaenthai -!C8 U+0E28 sosalathai -!C9 U+0E29 sorusithai -!CA U+0E2A sosuathai -!CB U+0E2B hohipthai -!CC U+0E2C lochulathai -!CD U+0E2D oangthai -!CE U+0E2E honokhukthai -!CF U+0E2F paiyannoithai -!D0 U+0E30 saraathai -!D1 U+0E31 maihanakatthai -!D2 U+0E32 saraaathai -!D3 U+0E33 saraamthai -!D4 U+0E34 saraithai -!D5 U+0E35 saraiithai -!D6 U+0E36 sarauethai -!D7 U+0E37 saraueethai -!D8 U+0E38 sarauthai -!D9 U+0E39 sarauuthai -!DA U+0E3A phinthuthai -!DF U+0E3F bahtthai -!E0 U+0E40 saraethai -!E1 U+0E41 saraaethai -!E2 U+0E42 saraothai -!E3 U+0E43 saraaimaimuanthai -!E4 U+0E44 saraaimaimalaithai -!E5 U+0E45 lakkhangyaothai -!E6 U+0E46 maiyamokthai -!E7 U+0E47 maitaikhuthai -!E8 U+0E48 maiekthai -!E9 U+0E49 maithothai -!EA U+0E4A maitrithai -!EB U+0E4B maichattawathai -!EC U+0E4C thanthakhatthai -!ED U+0E4D nikhahitthai -!EE U+0E4E yamakkanthai -!EF U+0E4F fongmanthai -!F0 U+0E50 zerothai -!F1 U+0E51 onethai -!F2 U+0E52 twothai -!F3 U+0E53 threethai -!F4 U+0E54 fourthai -!F5 U+0E55 fivethai -!F6 U+0E56 sixthai -!F7 U+0E57 seventhai -!F8 U+0E58 eightthai -!F9 U+0E59 ninethai -!FA U+0E5A angkhankhuthai -!FB U+0E5B khomutthai diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-1.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-1.map deleted file mode 100644 index 61740a38..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-1.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-11.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-11.map deleted file mode 100644 index 91688120..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-11.map +++ /dev/null @@ -1,248 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0E01 kokaithai -!A2 U+0E02 khokhaithai -!A3 U+0E03 khokhuatthai -!A4 U+0E04 khokhwaithai -!A5 U+0E05 khokhonthai -!A6 U+0E06 khorakhangthai -!A7 U+0E07 ngonguthai -!A8 U+0E08 chochanthai -!A9 U+0E09 chochingthai -!AA U+0E0A chochangthai -!AB U+0E0B sosothai -!AC U+0E0C chochoethai -!AD U+0E0D yoyingthai -!AE U+0E0E dochadathai -!AF U+0E0F topatakthai -!B0 U+0E10 thothanthai -!B1 U+0E11 thonangmonthothai -!B2 U+0E12 thophuthaothai -!B3 U+0E13 nonenthai -!B4 U+0E14 dodekthai -!B5 U+0E15 totaothai -!B6 U+0E16 thothungthai -!B7 U+0E17 thothahanthai -!B8 U+0E18 thothongthai -!B9 U+0E19 nonuthai -!BA U+0E1A bobaimaithai -!BB U+0E1B poplathai -!BC U+0E1C phophungthai -!BD U+0E1D fofathai -!BE U+0E1E phophanthai -!BF U+0E1F fofanthai -!C0 U+0E20 phosamphaothai -!C1 U+0E21 momathai -!C2 U+0E22 yoyakthai -!C3 U+0E23 roruathai -!C4 U+0E24 ruthai -!C5 U+0E25 lolingthai -!C6 U+0E26 luthai -!C7 U+0E27 wowaenthai -!C8 U+0E28 sosalathai -!C9 U+0E29 sorusithai -!CA U+0E2A sosuathai -!CB U+0E2B hohipthai -!CC U+0E2C lochulathai -!CD U+0E2D oangthai -!CE U+0E2E honokhukthai -!CF U+0E2F paiyannoithai -!D0 U+0E30 saraathai -!D1 U+0E31 maihanakatthai -!D2 U+0E32 saraaathai -!D3 U+0E33 saraamthai -!D4 U+0E34 saraithai -!D5 U+0E35 saraiithai -!D6 U+0E36 sarauethai -!D7 U+0E37 saraueethai -!D8 U+0E38 sarauthai -!D9 U+0E39 sarauuthai -!DA U+0E3A phinthuthai -!DF U+0E3F bahtthai -!E0 U+0E40 saraethai -!E1 U+0E41 saraaethai -!E2 U+0E42 saraothai -!E3 U+0E43 saraaimaimuanthai -!E4 U+0E44 saraaimaimalaithai -!E5 U+0E45 lakkhangyaothai -!E6 U+0E46 maiyamokthai -!E7 U+0E47 maitaikhuthai -!E8 U+0E48 maiekthai -!E9 U+0E49 maithothai -!EA U+0E4A maitrithai -!EB U+0E4B maichattawathai -!EC U+0E4C thanthakhatthai -!ED U+0E4D nikhahitthai -!EE U+0E4E yamakkanthai -!EF U+0E4F fongmanthai -!F0 U+0E50 zerothai -!F1 U+0E51 onethai -!F2 U+0E52 twothai -!F3 U+0E53 threethai -!F4 U+0E54 fourthai -!F5 U+0E55 fivethai -!F6 U+0E56 sixthai -!F7 U+0E57 seventhai -!F8 U+0E58 eightthai -!F9 U+0E59 ninethai -!FA U+0E5A angkhankhuthai -!FB U+0E5B khomutthai diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-15.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-15.map deleted file mode 100644 index 6c2b5712..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-15.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+20AC Euro -!A5 U+00A5 yen -!A6 U+0160 Scaron -!A7 U+00A7 section -!A8 U+0161 scaron -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+017D Zcaron -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+017E zcaron -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+0152 OE -!BD U+0153 oe -!BE U+0178 Ydieresis -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-16.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-16.map deleted file mode 100644 index 202c8fe5..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-16.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+0105 aogonek -!A3 U+0141 Lslash -!A4 U+20AC Euro -!A5 U+201E quotedblbase -!A6 U+0160 Scaron -!A7 U+00A7 section -!A8 U+0161 scaron -!A9 U+00A9 copyright -!AA U+0218 Scommaaccent -!AB U+00AB guillemotleft -!AC U+0179 Zacute -!AD U+00AD hyphen -!AE U+017A zacute -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+010C Ccaron -!B3 U+0142 lslash -!B4 U+017D Zcaron -!B5 U+201D quotedblright -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+017E zcaron -!B9 U+010D ccaron -!BA U+0219 scommaaccent -!BB U+00BB guillemotright -!BC U+0152 OE -!BD U+0153 oe -!BE U+0178 Ydieresis -!BF U+017C zdotaccent -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0106 Cacute -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+015A Sacute -!D8 U+0170 Uhungarumlaut -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0118 Eogonek -!DE U+021A Tcommaaccent -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+0107 cacute -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+015B sacute -!F8 U+0171 uhungarumlaut -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0119 eogonek -!FE U+021B tcommaaccent -!FF U+00FF ydieresis diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-2.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-2.map deleted file mode 100644 index 65ae09f9..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-2.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+02D8 breve -!A3 U+0141 Lslash -!A4 U+00A4 currency -!A5 U+013D Lcaron -!A6 U+015A Sacute -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+0160 Scaron -!AA U+015E Scedilla -!AB U+0164 Tcaron -!AC U+0179 Zacute -!AD U+00AD hyphen -!AE U+017D Zcaron -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+0105 aogonek -!B2 U+02DB ogonek -!B3 U+0142 lslash -!B4 U+00B4 acute -!B5 U+013E lcaron -!B6 U+015B sacute -!B7 U+02C7 caron -!B8 U+00B8 cedilla -!B9 U+0161 scaron -!BA U+015F scedilla -!BB U+0165 tcaron -!BC U+017A zacute -!BD U+02DD hungarumlaut -!BE U+017E zcaron -!BF U+017C zdotaccent -!C0 U+0154 Racute -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0139 Lacute -!C6 U+0106 Cacute -!C7 U+00C7 Ccedilla -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+011A Ecaron -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+010E Dcaron -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+0147 Ncaron -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0158 Rcaron -!D9 U+016E Uring -!DA U+00DA Uacute -!DB U+0170 Uhungarumlaut -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+0162 Tcommaaccent -!DF U+00DF germandbls -!E0 U+0155 racute -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+013A lacute -!E6 U+0107 cacute -!E7 U+00E7 ccedilla -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+011B ecaron -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+010F dcaron -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+0148 ncaron -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0159 rcaron -!F9 U+016F uring -!FA U+00FA uacute -!FB U+0171 uhungarumlaut -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+0163 tcommaaccent -!FF U+02D9 dotaccent diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-4.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-4.map deleted file mode 100644 index a7d87bf3..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-4.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+0138 kgreenlandic -!A3 U+0156 Rcommaaccent -!A4 U+00A4 currency -!A5 U+0128 Itilde -!A6 U+013B Lcommaaccent -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+0160 Scaron -!AA U+0112 Emacron -!AB U+0122 Gcommaaccent -!AC U+0166 Tbar -!AD U+00AD hyphen -!AE U+017D Zcaron -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+0105 aogonek -!B2 U+02DB ogonek -!B3 U+0157 rcommaaccent -!B4 U+00B4 acute -!B5 U+0129 itilde -!B6 U+013C lcommaaccent -!B7 U+02C7 caron -!B8 U+00B8 cedilla -!B9 U+0161 scaron -!BA U+0113 emacron -!BB U+0123 gcommaaccent -!BC U+0167 tbar -!BD U+014A Eng -!BE U+017E zcaron -!BF U+014B eng -!C0 U+0100 Amacron -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+012E Iogonek -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+0116 Edotaccent -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+012A Imacron -!D0 U+0110 Dcroat -!D1 U+0145 Ncommaaccent -!D2 U+014C Omacron -!D3 U+0136 Kcommaaccent -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+0172 Uogonek -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0168 Utilde -!DE U+016A Umacron -!DF U+00DF germandbls -!E0 U+0101 amacron -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+012F iogonek -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+0117 edotaccent -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+012B imacron -!F0 U+0111 dcroat -!F1 U+0146 ncommaaccent -!F2 U+014D omacron -!F3 U+0137 kcommaaccent -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+0173 uogonek -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0169 utilde -!FE U+016B umacron -!FF U+02D9 dotaccent diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-5.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-5.map deleted file mode 100644 index f9cd4edc..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-5.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0401 afii10023 -!A2 U+0402 afii10051 -!A3 U+0403 afii10052 -!A4 U+0404 afii10053 -!A5 U+0405 afii10054 -!A6 U+0406 afii10055 -!A7 U+0407 afii10056 -!A8 U+0408 afii10057 -!A9 U+0409 afii10058 -!AA U+040A afii10059 -!AB U+040B afii10060 -!AC U+040C afii10061 -!AD U+00AD hyphen -!AE U+040E afii10062 -!AF U+040F afii10145 -!B0 U+0410 afii10017 -!B1 U+0411 afii10018 -!B2 U+0412 afii10019 -!B3 U+0413 afii10020 -!B4 U+0414 afii10021 -!B5 U+0415 afii10022 -!B6 U+0416 afii10024 -!B7 U+0417 afii10025 -!B8 U+0418 afii10026 -!B9 U+0419 afii10027 -!BA U+041A afii10028 -!BB U+041B afii10029 -!BC U+041C afii10030 -!BD U+041D afii10031 -!BE U+041E afii10032 -!BF U+041F afii10033 -!C0 U+0420 afii10034 -!C1 U+0421 afii10035 -!C2 U+0422 afii10036 -!C3 U+0423 afii10037 -!C4 U+0424 afii10038 -!C5 U+0425 afii10039 -!C6 U+0426 afii10040 -!C7 U+0427 afii10041 -!C8 U+0428 afii10042 -!C9 U+0429 afii10043 -!CA U+042A afii10044 -!CB U+042B afii10045 -!CC U+042C afii10046 -!CD U+042D afii10047 -!CE U+042E afii10048 -!CF U+042F afii10049 -!D0 U+0430 afii10065 -!D1 U+0431 afii10066 -!D2 U+0432 afii10067 -!D3 U+0433 afii10068 -!D4 U+0434 afii10069 -!D5 U+0435 afii10070 -!D6 U+0436 afii10072 -!D7 U+0437 afii10073 -!D8 U+0438 afii10074 -!D9 U+0439 afii10075 -!DA U+043A afii10076 -!DB U+043B afii10077 -!DC U+043C afii10078 -!DD U+043D afii10079 -!DE U+043E afii10080 -!DF U+043F afii10081 -!E0 U+0440 afii10082 -!E1 U+0441 afii10083 -!E2 U+0442 afii10084 -!E3 U+0443 afii10085 -!E4 U+0444 afii10086 -!E5 U+0445 afii10087 -!E6 U+0446 afii10088 -!E7 U+0447 afii10089 -!E8 U+0448 afii10090 -!E9 U+0449 afii10091 -!EA U+044A afii10092 -!EB U+044B afii10093 -!EC U+044C afii10094 -!ED U+044D afii10095 -!EE U+044E afii10096 -!EF U+044F afii10097 -!F0 U+2116 afii61352 -!F1 U+0451 afii10071 -!F2 U+0452 afii10099 -!F3 U+0453 afii10100 -!F4 U+0454 afii10101 -!F5 U+0455 afii10102 -!F6 U+0456 afii10103 -!F7 U+0457 afii10104 -!F8 U+0458 afii10105 -!F9 U+0459 afii10106 -!FA U+045A afii10107 -!FB U+045B afii10108 -!FC U+045C afii10109 -!FD U+00A7 section -!FE U+045E afii10110 -!FF U+045F afii10193 diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-7.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-7.map deleted file mode 100644 index e163796b..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-7.map +++ /dev/null @@ -1,250 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+2018 quoteleft -!A2 U+2019 quoteright -!A3 U+00A3 sterling -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AF U+2015 afii00208 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+0384 tonos -!B5 U+0385 dieresistonos -!B6 U+0386 Alphatonos -!B7 U+00B7 periodcentered -!B8 U+0388 Epsilontonos -!B9 U+0389 Etatonos -!BA U+038A Iotatonos -!BB U+00BB guillemotright -!BC U+038C Omicrontonos -!BD U+00BD onehalf -!BE U+038E Upsilontonos -!BF U+038F Omegatonos -!C0 U+0390 iotadieresistonos -!C1 U+0391 Alpha -!C2 U+0392 Beta -!C3 U+0393 Gamma -!C4 U+0394 Delta -!C5 U+0395 Epsilon -!C6 U+0396 Zeta -!C7 U+0397 Eta -!C8 U+0398 Theta -!C9 U+0399 Iota -!CA U+039A Kappa -!CB U+039B Lambda -!CC U+039C Mu -!CD U+039D Nu -!CE U+039E Xi -!CF U+039F Omicron -!D0 U+03A0 Pi -!D1 U+03A1 Rho -!D3 U+03A3 Sigma -!D4 U+03A4 Tau -!D5 U+03A5 Upsilon -!D6 U+03A6 Phi -!D7 U+03A7 Chi -!D8 U+03A8 Psi -!D9 U+03A9 Omega -!DA U+03AA Iotadieresis -!DB U+03AB Upsilondieresis -!DC U+03AC alphatonos -!DD U+03AD epsilontonos -!DE U+03AE etatonos -!DF U+03AF iotatonos -!E0 U+03B0 upsilondieresistonos -!E1 U+03B1 alpha -!E2 U+03B2 beta -!E3 U+03B3 gamma -!E4 U+03B4 delta -!E5 U+03B5 epsilon -!E6 U+03B6 zeta -!E7 U+03B7 eta -!E8 U+03B8 theta -!E9 U+03B9 iota -!EA U+03BA kappa -!EB U+03BB lambda -!EC U+03BC mu -!ED U+03BD nu -!EE U+03BE xi -!EF U+03BF omicron -!F0 U+03C0 pi -!F1 U+03C1 rho -!F2 U+03C2 sigma1 -!F3 U+03C3 sigma -!F4 U+03C4 tau -!F5 U+03C5 upsilon -!F6 U+03C6 phi -!F7 U+03C7 chi -!F8 U+03C8 psi -!F9 U+03C9 omega -!FA U+03CA iotadieresis -!FB U+03CB upsilondieresis -!FC U+03CC omicrontonos -!FD U+03CD upsilontonos -!FE U+03CE omegatonos diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-9.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-9.map deleted file mode 100644 index 48c123ae..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/iso-8859-9.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+011E Gbreve -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0130 Idotaccent -!DE U+015E Scedilla -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+011F gbreve -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0131 dotlessi -!FE U+015F scedilla -!FF U+00FF ydieresis diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/koi8-r.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/koi8-r.map deleted file mode 100644 index 6ad5d05d..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/koi8-r.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+2500 SF100000 -!81 U+2502 SF110000 -!82 U+250C SF010000 -!83 U+2510 SF030000 -!84 U+2514 SF020000 -!85 U+2518 SF040000 -!86 U+251C SF080000 -!87 U+2524 SF090000 -!88 U+252C SF060000 -!89 U+2534 SF070000 -!8A U+253C SF050000 -!8B U+2580 upblock -!8C U+2584 dnblock -!8D U+2588 block -!8E U+258C lfblock -!8F U+2590 rtblock -!90 U+2591 ltshade -!91 U+2592 shade -!92 U+2593 dkshade -!93 U+2320 integraltp -!94 U+25A0 filledbox -!95 U+2219 periodcentered -!96 U+221A radical -!97 U+2248 approxequal -!98 U+2264 lessequal -!99 U+2265 greaterequal -!9A U+00A0 space -!9B U+2321 integralbt -!9C U+00B0 degree -!9D U+00B2 twosuperior -!9E U+00B7 periodcentered -!9F U+00F7 divide -!A0 U+2550 SF430000 -!A1 U+2551 SF240000 -!A2 U+2552 SF510000 -!A3 U+0451 afii10071 -!A4 U+2553 SF520000 -!A5 U+2554 SF390000 -!A6 U+2555 SF220000 -!A7 U+2556 SF210000 -!A8 U+2557 SF250000 -!A9 U+2558 SF500000 -!AA U+2559 SF490000 -!AB U+255A SF380000 -!AC U+255B SF280000 -!AD U+255C SF270000 -!AE U+255D SF260000 -!AF U+255E SF360000 -!B0 U+255F SF370000 -!B1 U+2560 SF420000 -!B2 U+2561 SF190000 -!B3 U+0401 afii10023 -!B4 U+2562 SF200000 -!B5 U+2563 SF230000 -!B6 U+2564 SF470000 -!B7 U+2565 SF480000 -!B8 U+2566 SF410000 -!B9 U+2567 SF450000 -!BA U+2568 SF460000 -!BB U+2569 SF400000 -!BC U+256A SF540000 -!BD U+256B SF530000 -!BE U+256C SF440000 -!BF U+00A9 copyright -!C0 U+044E afii10096 -!C1 U+0430 afii10065 -!C2 U+0431 afii10066 -!C3 U+0446 afii10088 -!C4 U+0434 afii10069 -!C5 U+0435 afii10070 -!C6 U+0444 afii10086 -!C7 U+0433 afii10068 -!C8 U+0445 afii10087 -!C9 U+0438 afii10074 -!CA U+0439 afii10075 -!CB U+043A afii10076 -!CC U+043B afii10077 -!CD U+043C afii10078 -!CE U+043D afii10079 -!CF U+043E afii10080 -!D0 U+043F afii10081 -!D1 U+044F afii10097 -!D2 U+0440 afii10082 -!D3 U+0441 afii10083 -!D4 U+0442 afii10084 -!D5 U+0443 afii10085 -!D6 U+0436 afii10072 -!D7 U+0432 afii10067 -!D8 U+044C afii10094 -!D9 U+044B afii10093 -!DA U+0437 afii10073 -!DB U+0448 afii10090 -!DC U+044D afii10095 -!DD U+0449 afii10091 -!DE U+0447 afii10089 -!DF U+044A afii10092 -!E0 U+042E afii10048 -!E1 U+0410 afii10017 -!E2 U+0411 afii10018 -!E3 U+0426 afii10040 -!E4 U+0414 afii10021 -!E5 U+0415 afii10022 -!E6 U+0424 afii10038 -!E7 U+0413 afii10020 -!E8 U+0425 afii10039 -!E9 U+0418 afii10026 -!EA U+0419 afii10027 -!EB U+041A afii10028 -!EC U+041B afii10029 -!ED U+041C afii10030 -!EE U+041D afii10031 -!EF U+041E afii10032 -!F0 U+041F afii10033 -!F1 U+042F afii10049 -!F2 U+0420 afii10034 -!F3 U+0421 afii10035 -!F4 U+0422 afii10036 -!F5 U+0423 afii10037 -!F6 U+0416 afii10024 -!F7 U+0412 afii10019 -!F8 U+042C afii10046 -!F9 U+042B afii10045 -!FA U+0417 afii10025 -!FB U+0428 afii10042 -!FC U+042D afii10047 -!FD U+0429 afii10043 -!FE U+0427 afii10041 -!FF U+042A afii10044 diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/koi8-u.map b/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/koi8-u.map deleted file mode 100644 index 40a7e4fd..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/enc/koi8-u.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+2500 SF100000 -!81 U+2502 SF110000 -!82 U+250C SF010000 -!83 U+2510 SF030000 -!84 U+2514 SF020000 -!85 U+2518 SF040000 -!86 U+251C SF080000 -!87 U+2524 SF090000 -!88 U+252C SF060000 -!89 U+2534 SF070000 -!8A U+253C SF050000 -!8B U+2580 upblock -!8C U+2584 dnblock -!8D U+2588 block -!8E U+258C lfblock -!8F U+2590 rtblock -!90 U+2591 ltshade -!91 U+2592 shade -!92 U+2593 dkshade -!93 U+2320 integraltp -!94 U+25A0 filledbox -!95 U+2022 bullet -!96 U+221A radical -!97 U+2248 approxequal -!98 U+2264 lessequal -!99 U+2265 greaterequal -!9A U+00A0 space -!9B U+2321 integralbt -!9C U+00B0 degree -!9D U+00B2 twosuperior -!9E U+00B7 periodcentered -!9F U+00F7 divide -!A0 U+2550 SF430000 -!A1 U+2551 SF240000 -!A2 U+2552 SF510000 -!A3 U+0451 afii10071 -!A4 U+0454 afii10101 -!A5 U+2554 SF390000 -!A6 U+0456 afii10103 -!A7 U+0457 afii10104 -!A8 U+2557 SF250000 -!A9 U+2558 SF500000 -!AA U+2559 SF490000 -!AB U+255A SF380000 -!AC U+255B SF280000 -!AD U+0491 afii10098 -!AE U+255D SF260000 -!AF U+255E SF360000 -!B0 U+255F SF370000 -!B1 U+2560 SF420000 -!B2 U+2561 SF190000 -!B3 U+0401 afii10023 -!B4 U+0404 afii10053 -!B5 U+2563 SF230000 -!B6 U+0406 afii10055 -!B7 U+0407 afii10056 -!B8 U+2566 SF410000 -!B9 U+2567 SF450000 -!BA U+2568 SF460000 -!BB U+2569 SF400000 -!BC U+256A SF540000 -!BD U+0490 afii10050 -!BE U+256C SF440000 -!BF U+00A9 copyright -!C0 U+044E afii10096 -!C1 U+0430 afii10065 -!C2 U+0431 afii10066 -!C3 U+0446 afii10088 -!C4 U+0434 afii10069 -!C5 U+0435 afii10070 -!C6 U+0444 afii10086 -!C7 U+0433 afii10068 -!C8 U+0445 afii10087 -!C9 U+0438 afii10074 -!CA U+0439 afii10075 -!CB U+043A afii10076 -!CC U+043B afii10077 -!CD U+043C afii10078 -!CE U+043D afii10079 -!CF U+043E afii10080 -!D0 U+043F afii10081 -!D1 U+044F afii10097 -!D2 U+0440 afii10082 -!D3 U+0441 afii10083 -!D4 U+0442 afii10084 -!D5 U+0443 afii10085 -!D6 U+0436 afii10072 -!D7 U+0432 afii10067 -!D8 U+044C afii10094 -!D9 U+044B afii10093 -!DA U+0437 afii10073 -!DB U+0448 afii10090 -!DC U+044D afii10095 -!DD U+0449 afii10091 -!DE U+0447 afii10089 -!DF U+044A afii10092 -!E0 U+042E afii10048 -!E1 U+0410 afii10017 -!E2 U+0411 afii10018 -!E3 U+0426 afii10040 -!E4 U+0414 afii10021 -!E5 U+0415 afii10022 -!E6 U+0424 afii10038 -!E7 U+0413 afii10020 -!E8 U+0425 afii10039 -!E9 U+0418 afii10026 -!EA U+0419 afii10027 -!EB U+041A afii10028 -!EC U+041B afii10029 -!ED U+041C afii10030 -!EE U+041D afii10031 -!EF U+041E afii10032 -!F0 U+041F afii10033 -!F1 U+042F afii10049 -!F2 U+0420 afii10034 -!F3 U+0421 afii10035 -!F4 U+0422 afii10036 -!F5 U+0423 afii10037 -!F6 U+0416 afii10024 -!F7 U+0412 afii10019 -!F8 U+042C afii10046 -!F9 U+042B afii10045 -!FA U+0417 afii10025 -!FB U+0428 afii10042 -!FC U+042D afii10047 -!FD U+0429 afii10043 -!FE U+0427 afii10041 -!FF U+042A afii10044 diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/freetype6.dll b/include/limesurvey/admin/classes/tcpdf/fonts/utils/freetype6.dll deleted file mode 100644 index 53878a03..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/utils/freetype6.dll and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/makeallttffonts.php b/include/limesurvey/admin/classes/tcpdf/fonts/utils/makeallttffonts.php deleted file mode 100644 index 4b10f526..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/makeallttffonts.php +++ /dev/null @@ -1,69 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -//============================================================+ - -/** - * Process all TTF files on current directory to build TCPDF compatible font files. - * @package com.tecnick.tcpdf - * @author Nicola Asuni - * @copyright Copyright © 2004-2009, Nicola Asuni - Tecnick.com S.r.l. - ITALY - www.tecnick.com - info@tecnick.com - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @link www.tecnick.com - * @since 2008-12-07 - */ - -/** - */ - -// read directory for files (only graphics files). -$handle = opendir('.'); -while($file = readdir($handle)) { - $path_parts = pathinfo($file); - $file_ext = strtolower($path_parts['extension']); - if ($file_ext == 'ttf') { - exec('./ttf2ufm -a -F '.$path_parts['basename'].''); - exec('php -q makefont.php '.$path_parts['basename'].' '.$path_parts['filename'].'.ufm'); - } -} -closedir($handle); - -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/makefont.php b/include/limesurvey/admin/classes/tcpdf/fonts/utils/makefont.php deleted file mode 100644 index 608ec040..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/makefont.php +++ /dev/null @@ -1,615 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -// ---------------------------------------------------------------------------- -// -// Description : Utility to generate font definition files fot TCPDF -// -// Authors: Nicola Asuni, Olivier Plathey, Steven Wittens -// -// (c) Copyright: -// Nicola Asuni -// Tecnick.com S.r.l. -// Via della Pace, 11 -// 09044 Quartucciu (CA) -// ITALY -// www.tecnick.com -// info@tecnick.com -//============================================================+ - -/** - * Utility to generate font definition files fot TCPDF. - * @author Nicola Asuni, Olivier Plathey, Steven Wittens - * @copyright 2004-2008 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @package com.tecnick.tcpdf - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL -*/ - -/** - * - * @param string $fontfile path to font file (TTF, OTF or PFB). - * @param string $fmfile font metrics file (UFM or AFM). - * @param boolean $embedded Set to false to not embed the font, true otherwise (default). - * @param string $enc Name of the encoding table to use. Omit this parameter for TrueType Unicode, OpenType Unicode and symbolic fonts like Symbol or ZapfDingBats. - * @param array $patch Optional modification of the encoding - */ -function MakeFont($fontfile, $fmfile, $embedded=true, $enc='cp1252', $patch=array()) { - //Generate a font definition file - set_magic_quotes_runtime(0); - ini_set('auto_detect_line_endings', '1'); - if (!file_exists($fontfile)) { - die('Error: file not found: '.$fontfile); - } - if (!file_exists($fmfile)) { - die('Error: file not found: '.$fmfile); - } - $cidtogidmap = ''; - $map = array(); - $diff = ''; - $dw = 0; // default width - $ffext = strtolower(substr($fontfile, -3)); - $fmext = strtolower(substr($fmfile, -3)); - if ($fmext == 'afm') { - if (($ffext == 'ttf') OR ($ffext == 'otf')) { - $type = 'TrueType'; - } elseif ($ffext == 'pfb') { - $type = 'Type1'; - } else { - die('Error: unrecognized font file extension: '.$ffext); - } - if ($enc) { - $map = ReadMap($enc); - foreach ($patch as $cc => $gn) { - $map[$cc] = $gn; - } - } - $fm = ReadAFM($fmfile, $map); - if (isset($widths['.notdef'])) { - $dw = $widths['.notdef']; - } - if ($enc) { - $diff = MakeFontEncoding($map); - } - $fd = MakeFontDescriptor($fm, empty($map)); - } elseif ($fmext == 'ufm') { - $enc = ''; - if (($ffext == 'ttf') OR ($ffext == 'otf')) { - $type = 'TrueTypeUnicode'; - } else { - die('Error: not a TrueType font: '.$ffext); - } - $fm = ReadUFM($fmfile, $cidtogidmap); - $dw = $fm['MissingWidth']; - $fd = MakeFontDescriptor($fm, false); - } - //Start generation - $s = ' 0)) { - // assign default space width - $dw = $fm['Widths'][32]; - } else { - $dw = 600; - } - } - $s .= '$dw='.$dw.";\n"; - $w = MakeWidthArray($fm); - $s .= '$cw='.$w.";\n"; - $s .= '$enc=\''.$enc."';\n"; - $s .= '$diff=\''.$diff."';\n"; - $basename = substr(basename($fmfile), 0, -4); - if ($embedded) { - //Embedded font - if (($type == 'TrueType') OR ($type == 'TrueTypeUnicode')) { - CheckTTF($fontfile); - } - $f = fopen($fontfile,'rb'); - if (!$f) { - die('Error: Unable to open '.$fontfile); - } - $file = fread($f, filesize($fontfile)); - fclose($f); - if ($type == 'Type1') { - //Find first two sections and discard third one - $header = (ord($file{0}) == 128); - if ($header) { - //Strip first binary header - $file = substr($file, 6); - } - $pos = strpos($file, 'eexec'); - if (!$pos) { - die('Error: font file does not seem to be valid Type1'); - } - $size1 = $pos + 6; - if ($header AND (ord($file{$size1}) == 128)) { - //Strip second binary header - $file = substr($file, 0, $size1).substr($file, $size1+6); - } - $pos = strpos($file, '00000000'); - if (!$pos) { - die('Error: font file does not seem to be valid Type1'); - } - $size2 = $pos - $size1; - $file = substr($file, 0, ($size1 + $size2)); - } - $basename = strtolower($basename); - if (function_exists('gzcompress')) { - $cmp = $basename.'.z'; - SaveToFile($cmp, gzcompress($file, 9), 'b'); - $s .= '$file=\''.$cmp."';\n"; - print "Font file compressed (".$cmp.")\n"; - if (!empty($cidtogidmap)) { - $cmp = $basename.'.ctg.z'; - SaveToFile($cmp, gzcompress($cidtogidmap, 9), 'b'); - print "CIDToGIDMap created and compressed (".$cmp.")\n"; - $s .= '$ctg=\''.$cmp."';\n"; - } - } else { - $s .= '$file=\''.basename($fontfile)."';\n"; - print "Notice: font file could not be compressed (zlib extension not available)\n"; - if (!empty($cidtogidmap)) { - $cmp = $basename.'.ctg'; - $f = fopen($cmp, 'wb'); - fwrite($f, $cidtogidmap); - fclose($f); - print "CIDToGIDMap created (".$cmp.")\n"; - $s .= '$ctg=\''.$cmp."';\n"; - } - } - if($type == 'Type1') { - $s .= '$size1='.$size1.";\n"; - $s .= '$size2='.$size2.";\n"; - } else { - $s.='$originalsize='.filesize($fontfile).";\n"; - } - } else { - //Not embedded font - $s .= '$file='."'';\n"; - } - $s .= '// --- EOF ---'; - SaveToFile($basename.'.php',$s); - print "Font definition file generated (".$basename.".php)\n"; -} - -/** - * Read the specified encoding map. - * @param string $enc map name (see /enc/ folder for valid names). - */ -function ReadMap($enc) { - //Read a map file - $file = dirname(__FILE__).'/enc/'.strtolower($enc).'.map'; - $a = file($file); - if (empty($a)) { - die('Error: encoding not found: '.$enc); - } - $cc2gn = array(); - foreach ($a as $l) { - if ($l{0} == '!') { - $e = preg_split('/[ \\t]+/',rtrim($l)); - $cc = hexdec(substr($e[0],1)); - $gn = $e[2]; - $cc2gn[$cc] = $gn; - } - } - for($i = 0; $i <= 255; $i++) { - if(!isset($cc2gn[$i])) { - $cc2gn[$i] = '.notdef'; - } - } - return $cc2gn; -} - -/** - * Read UFM file - */ -function ReadUFM($file, &$cidtogidmap) { - //Prepare empty CIDToGIDMap - $cidtogidmap = str_pad('', (256 * 256 * 2), "\x00"); - //Read a font metric file - $a = file($file); - if (empty($a)) { - die('File not found'); - } - $widths = array(); - $fm = array(); - foreach($a as $l) { - $e = explode(' ',chop($l)); - if(count($e) < 2) { - continue; - } - $code = $e[0]; - $param = $e[1]; - if($code == 'U') { - // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; - //Character metrics - $cc = (int)$e[1]; - if ($cc != -1) { - $gn = $e[7]; - $w = $e[4]; - $glyph = $e[10]; - $widths[$cc] = $w; - if($cc == ord('X')) { - $fm['CapXHeight'] = $e[13]; - } - // Set GID - if (($cc >= 0) AND ($cc < 0xFFFF) AND $glyph) { - $cidtogidmap{($cc * 2)} = chr($glyph >> 8); - $cidtogidmap{(($cc * 2) + 1)} = chr($glyph & 0xFF); - } - } - if((isset($gn) AND ($gn == '.notdef')) AND (!isset($fm['MissingWidth']))) { - $fm['MissingWidth'] = $w; - } - } elseif($code == 'FontName') { - $fm['FontName'] = $param; - } elseif($code == 'Weight') { - $fm['Weight'] = $param; - } elseif($code == 'ItalicAngle') { - $fm['ItalicAngle'] = (double)$param; - } elseif($code == 'Ascender') { - $fm['Ascender'] = (int)$param; - } elseif($code == 'Descender') { - $fm['Descender'] = (int)$param; - } elseif($code == 'UnderlineThickness') { - $fm['UnderlineThickness'] = (int)$param; - } elseif($code == 'UnderlinePosition') { - $fm['UnderlinePosition'] = (int)$param; - } elseif($code == 'IsFixedPitch') { - $fm['IsFixedPitch'] = ($param == 'true'); - } elseif($code == 'FontBBox') { - $fm['FontBBox'] = array($e[1], $e[2], $e[3], $e[4]); - } elseif($code == 'CapHeight') { - $fm['CapHeight'] = (int)$param; - } elseif($code == 'StdVW') { - $fm['StdVW'] = (int)$param; - } - } - if(!isset($fm['MissingWidth'])) { - $fm['MissingWidth'] = 600; - } - if(!isset($fm['FontName'])) { - die('FontName not found'); - } - $fm['Widths'] = $widths; - return $fm; -} - -/** - * Read AFM file - */ -function ReadAFM($file,&$map) { - //Read a font metric file - $a = file($file); - if(empty($a)) { - die('File not found'); - } - $widths = array(); - $fm = array(); - $fix = array( - 'Edot'=>'Edotaccent', - 'edot'=>'edotaccent', - 'Idot'=>'Idotaccent', - 'Zdot'=>'Zdotaccent', - 'zdot'=>'zdotaccent', - 'Odblacute' => 'Ohungarumlaut', - 'odblacute' => 'ohungarumlaut', - 'Udblacute'=>'Uhungarumlaut', - 'udblacute'=>'uhungarumlaut', - 'Gcedilla'=>'Gcommaaccent' - ,'gcedilla'=>'gcommaaccent', - 'Kcedilla'=>'Kcommaaccent', - 'kcedilla'=>'kcommaaccent', - 'Lcedilla'=>'Lcommaaccent', - 'lcedilla'=>'lcommaaccent', - 'Ncedilla'=>'Ncommaaccent', - 'ncedilla'=>'ncommaaccent', - 'Rcedilla'=>'Rcommaaccent', - 'rcedilla'=>'rcommaaccent', - 'Scedilla'=>'Scommaaccent', - 'scedilla'=>'scommaaccent', - 'Tcedilla'=>'Tcommaaccent', - 'tcedilla'=>'tcommaaccent', - 'Dslash'=>'Dcroat', - 'dslash'=>'dcroat', - 'Dmacron'=>'Dcroat', - 'dmacron'=>'dcroat', - 'combininggraveaccent'=>'gravecomb', - 'combininghookabove'=>'hookabovecomb', - 'combiningtildeaccent'=>'tildecomb', - 'combiningacuteaccent'=>'acutecomb', - 'combiningdotbelow'=>'dotbelowcomb', - 'dongsign'=>'dong' - ); - foreach($a as $l) { - $e = explode(' ', rtrim($l)); - if (count($e) < 2) { - continue; - } - $code = $e[0]; - $param = $e[1]; - if ($code == 'C') { - //Character metrics - $cc = (int)$e[1]; - $w = $e[4]; - $gn = $e[7]; - if (substr($gn, -4) == '20AC') { - $gn = 'Euro'; - } - if (isset($fix[$gn])) { - //Fix incorrect glyph name - foreach ($map as $c => $n) { - if ($n == $fix[$gn]) { - $map[$c] = $gn; - } - } - } - if (empty($map)) { - //Symbolic font: use built-in encoding - $widths[$cc] = $w; - } else { - $widths[$gn] = $w; - if($gn == 'X') { - $fm['CapXHeight'] = $e[13]; - } - } - if($gn == '.notdef') { - $fm['MissingWidth'] = $w; - } - } elseif($code == 'FontName') { - $fm['FontName'] = $param; - } elseif($code == 'Weight') { - $fm['Weight'] = $param; - } elseif($code == 'ItalicAngle') { - $fm['ItalicAngle'] = (double)$param; - } elseif($code == 'Ascender') { - $fm['Ascender'] = (int)$param; - } elseif($code == 'Descender') { - $fm['Descender'] = (int)$param; - } elseif($code == 'UnderlineThickness') { - $fm['UnderlineThickness'] = (int)$param; - } elseif($code == 'UnderlinePosition') { - $fm['UnderlinePosition'] = (int)$param; - } elseif($code == 'IsFixedPitch') { - $fm['IsFixedPitch'] = ($param == 'true'); - } elseif($code == 'FontBBox') { - $fm['FontBBox'] = array($e[1], $e[2], $e[3], $e[4]); - } elseif($code == 'CapHeight') { - $fm['CapHeight'] = (int)$param; - } elseif($code == 'StdVW') { - $fm['StdVW'] = (int)$param; - } - } - if (!isset($fm['FontName'])) { - die('FontName not found'); - } - if (!empty($map)) { - if (!isset($widths['.notdef'])) { - $widths['.notdef'] = 600; - } - if (!isset($widths['Delta']) AND isset($widths['increment'])) { - $widths['Delta'] = $widths['increment']; - } - //Order widths according to map - for ($i = 0; $i <= 255; $i++) { - if (!isset($widths[$map[$i]])) { - print "Warning: character ".$map[$i]." is missing\n"; - $widths[$i] = $widths['.notdef']; - } else { - $widths[$i] = $widths[$map[$i]]; - } - } - } - $fm['Widths'] = $widths; - return $fm; -} - -function MakeFontDescriptor($fm, $symbolic=false) { - //Ascent - $asc = (isset($fm['Ascender']) ? $fm['Ascender'] : 1000); - $fd = "array('Ascent'=>".$asc; - //Descent - $desc = (isset($fm['Descender']) ? $fm['Descender'] : -200); - $fd .= ",'Descent'=>".$desc; - //CapHeight - if (isset($fm['CapHeight'])) { - $ch = $fm['CapHeight']; - } elseif (isset($fm['CapXHeight'])) { - $ch = $fm['CapXHeight']; - } else { - $ch = $asc; - } - $fd .= ",'CapHeight'=>".$ch; - //Flags - $flags = 0; - if (isset($fm['IsFixedPitch']) AND $fm['IsFixedPitch']) { - $flags += 1<<0; - } - if ($symbolic) { - $flags += 1<<2; - } else { - $flags += 1<<5; - } - if (isset($fm['ItalicAngle']) AND ($fm['ItalicAngle'] != 0)) { - $flags += 1<<6; - } - $fd .= ",'Flags'=>".$flags; - //FontBBox - if (isset($fm['FontBBox'])) { - $fbb = $fm['FontBBox']; - } else { - $fbb = array(0, ($desc - 100), 1000, ($asc + 100)); - } - $fd .= ",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; - //ItalicAngle - $ia = (isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); - $fd .= ",'ItalicAngle'=>".$ia; - //StemV - if (isset($fm['StdVW'])) { - $stemv = $fm['StdVW']; - } elseif (isset($fm['Weight']) AND preg_match('/(bold|black)/i', $fm['Weight'])) { - $stemv = 120; - } else { - $stemv = 70; - } - $fd .= ",'StemV'=>".$stemv; - //MissingWidth - if(isset($fm['MissingWidth'])) { - $fd .= ",'MissingWidth'=>".$fm['MissingWidth']; - } - $fd .= ')'; - return $fd; -} - -function MakeWidthArray($fm) { - //Make character width array - $s = 'array('; - $cw = $fm['Widths']; - $els = array(); - $c = 0; - foreach ($cw as $i => $w) { - if (is_numeric($i)) { - $els[] = (((($c++)%10) == 0) ? "\n" : '').$i.'=>'.$w; - } - } - $s .= implode(',', $els); - $s .= ')'; - return $s; -} - -function MakeFontEncoding($map) { - //Build differences from reference encoding - $ref = ReadMap('cp1252'); - $s = ''; - $last = 0; - for ($i = 32; $i <= 255; $i++) { - if ($map[$i] != $ref[$i]) { - if ($i != $last+1) { - $s .= $i.' '; - } - $last = $i; - $s .= '/'.$map[$i].' '; - } - } - return rtrim($s); -} - -function SaveToFile($file, $s, $mode='t') { - $f = fopen($file, 'w'.$mode); - if(!$f) { - die('Can\'t write to file '.$file); - } - fwrite($f, $s, strlen($s)); - fclose($f); -} - -function ReadShort($f) { - $a = unpack('n1n', fread($f, 2)); - return $a['n']; -} - -function ReadLong($f) { - $a = unpack('N1N', fread($f, 4)); - return $a['N']; -} - -function CheckTTF($file) { - //Check if font license allows embedding - $f = fopen($file, 'rb'); - if (!$f) { - die('Error: unable to open '.$file); - } - //Extract number of tables - fseek($f, 4, SEEK_CUR); - $nb = ReadShort($f); - fseek($f, 6, SEEK_CUR); - //Seek OS/2 table - $found = false; - for ($i = 0; $i < $nb; $i++) { - if (fread($f, 4) == 'OS/2') { - $found = true; - break; - } - fseek($f, 12, SEEK_CUR); - } - if (!$found) { - fclose($f); - return; - } - fseek($f, 4, SEEK_CUR); - $offset = ReadLong($f); - fseek($f, $offset, SEEK_SET); - //Extract fsType flags - fseek($f, 8, SEEK_CUR); - $fsType = ReadShort($f); - $rl = ($fsType & 0x02) != 0; - $pp = ($fsType & 0x04) != 0; - $e = ($fsType & 0x08) != 0; - fclose($f); - if($rl AND (!$pp) AND (!$e)) { - print "Warning: font license does not allow embedding\n"; - } -} - -$arg = $GLOBALS['argv']; -if (count($arg) >= 3) { - ob_start(); - array_shift($arg); - if (sizeof($arg) == 3) { - $arg[3] = $arg[2]; - $arg[2] = true; - } else { - if (!isset($arg[2])) { - $arg[2] = true; - } - if (!isset($arg[3])) { - $arg[3] = 'cp1252'; - } - } - if (!isset($arg[4])) { - $arg[4] = array(); - } - MakeFont($arg[0], $arg[1], $arg[2], $arg[3], $arg[4]); - $t = ob_get_clean(); - print preg_replace('!!i', "\n", $t); -} else { - print "Usage: makefont.php \n"; -} - -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/pfm2afm b/include/limesurvey/admin/classes/tcpdf/fonts/utils/pfm2afm deleted file mode 100644 index c75b565c..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/utils/pfm2afm and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/pfm2afm.exe b/include/limesurvey/admin/classes/tcpdf/fonts/utils/pfm2afm.exe deleted file mode 100644 index 25c21fa1..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/utils/pfm2afm.exe and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/pfm2afm-src.tar.gz b/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/pfm2afm-src.tar.gz deleted file mode 100644 index 72abae50..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/pfm2afm-src.tar.gz and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/readme.txt b/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/readme.txt deleted file mode 100644 index f351cd9a..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/readme.txt +++ /dev/null @@ -1,17 +0,0 @@ -To embed TrueType and OpenType font files, you need to extract the -font metrics from the font files and build the required tables using -the utility TTF2UFM. - -TTF2UFM is a modified version of Mark Heath's TTF 2 PT1 converter -(http://ttf2pt1.sourceforge.net/) by Steven Wittens -(http://www.acko.net/blog/ufpdf). That version has been further -modified by Ulrich Telle for use with the wxWidgets component -wxPdfDocument. - -Following changes where made: - -1) Generated AFM files contain the glyph number for each character. -2) Generated UFM files contain the bounding box for each character. -3) OpenType support has been activated for the Windows binary, - and the generated AFM/UFM files contain the associated - original Unicode codes for each character. diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/ttf2ufm-src.tar.gz b/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/ttf2ufm-src.tar.gz deleted file mode 100644 index 2aeca608..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/utils/src/ttf2ufm-src.tar.gz and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/ttf2ufm b/include/limesurvey/admin/classes/tcpdf/fonts/utils/ttf2ufm deleted file mode 100644 index f81604fa..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/utils/ttf2ufm and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/ttf2ufm.exe b/include/limesurvey/admin/classes/tcpdf/fonts/utils/ttf2ufm.exe deleted file mode 100644 index 07751055..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/utils/ttf2ufm.exe and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/utils/zlib1.dll b/include/limesurvey/admin/classes/tcpdf/fonts/utils/zlib1.dll deleted file mode 100644 index 31996cd3..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/fonts/utils/zlib1.dll and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/zapfdingbats.php b/include/limesurvey/admin/classes/tcpdf/fonts/zapfdingbats.php deleted file mode 100644 index 99eda4d6..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/zapfdingbats.php +++ /dev/null @@ -1,32 +0,0 @@ -0,1=>0,2=>0,3=>0,4=>0,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0,11=>0,12=>0, -13=>0,14=>0,15=>0,16=>0,17=>0,18=>0,19=>0,20=>0,21=>0,22=>0,23=>0,24=>0,25=>0, -26=>0,27=>0,28=>0,29=>0,30=>0,31=>0,32=>278,33=>974,34=>961,35=>974,36=>980, -37=>719,38=>789,39=>790,40=>791,41=>690,42=>960,43=>939,44=>549,45=>855,46=>911, -47=>933,48=>911,49=>945,50=>974,51=>755,52=>846,53=>762,54=>761,55=>571,56=>677, -57=>763,58=>760,59=>759,60=>754,61=>494,62=>552,63=>537,64=>577,65=>692,66=>786, -67=>788,68=>788,69=>790,70=>793,71=>794,72=>816,73=>823,74=>789,75=>841,76=>823, -77=>833,78=>816,79=>831,80=>923,81=>744,82=>723,83=>749,84=>790,85=>792,86=>695, -87=>776,88=>768,89=>792,90=>759,91=>707,92=>708,93=>682,94=>701,95=>826,96=>815, -97=>789,98=>789,99=>707,100=>687,101=>696,102=>689,103=>786,104=>787,105=>713, -106=>791,107=>785,108=>791,109=>873,110=>761,111=>762,112=>762,113=>759,114=>759, -115=>892,116=>892,117=>788,118=>784,119=>438,120=>138,121=>277,122=>415,123=>392, -124=>392,125=>668,126=>668,127=>0,128=>390,129=>390,130=>317,131=>317,132=>276, -133=>276,134=>509,135=>509,136=>410,137=>410,138=>234,139=>234,140=>334,141=>334, -142=>0,143=>0,144=>0,145=>0,146=>0,147=>0,148=>0,149=>0,150=>0,151=>0,152=>0, -153=>0,154=>0,155=>0,156=>0,157=>0,158=>0,159=>0,160=>0,161=>732,162=>544,163=>544, -164=>910,165=>667,166=>760,167=>760,168=>776,169=>595,170=>694,171=>626,172=>788, -173=>788,174=>788,175=>788,176=>788,177=>788,178=>788,179=>788,180=>788,181=>788, -182=>788,183=>788,184=>788,185=>788,186=>788,187=>788,188=>788,189=>788,190=>788, -191=>788,192=>788,193=>788,194=>788,195=>788,196=>788,197=>788,198=>788,199=>788, -200=>788,201=>788,202=>788,203=>788,204=>788,205=>788,206=>788,207=>788,208=>788, -209=>788,210=>788,211=>788,212=>894,213=>838,214=>1016,215=>458,216=>748,217=>924, -218=>748,219=>918,220=>927,221=>928,222=>928,223=>834,224=>873,225=>828,226=>924, -227=>924,228=>917,229=>930,230=>931,231=>463,232=>883,233=>836,234=>836,235=>867, -236=>867,237=>696,238=>696,239=>874,240=>0,241=>874,242=>760,243=>946,244=>771, -245=>865,246=>771,247=>888,248=>967,249=>888,250=>831,251=>873,252=>927,253=>970, -254=>918,255=>0); -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/fonts/zarbold.php b/include/limesurvey/admin/classes/tcpdf/fonts/zarbold.php deleted file mode 100644 index 4f120145..00000000 --- a/include/limesurvey/admin/classes/tcpdf/fonts/zarbold.php +++ /dev/null @@ -1,47 +0,0 @@ -733,'Descent'=>-317,'CapHeight'=>733,'Flags'=>32,'FontBBox'=>'[-126 -535 1164 1046]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); -$up=-356; -$ut=49; -$dw=600; -$cw=array( - 0=>0,32=>227,33=>235,34=>282,35=>667,36=>458,37=>493,38=>635,39=>156,40=>303,41=>303,42=>489,43=>489,44=>237,45=>489,46=>231,47=>277, - 48=>552,49=>552,50=>552,51=>552,52=>552,53=>552,54=>552,55=>552,56=>552,57=>552,58=>231,59=>237,60=>667,61=>489,62=>667,63=>448, - 64=>917,65=>604,66=>542,67=>615,68=>708,69=>479,70=>427,71=>667,72=>688,73=>302,74=>292,75=>583,76=>469,77=>885,78=>677,79=>729, - 80=>479,81=>729,82=>542,83=>448,84=>521,85=>677,86=>615,87=>969,88=>604,89=>583,90=>594,91=>208,92=>510,93=>208,94=>469,95=>500, - 96=>333,97=>469,98=>510,99=>448,100=>521,101=>438,102=>313,103=>500,104=>552,105=>271,106=>260,107=>500,108=>271,109=>802,110=>552,111=>490, - 112=>531,113=>521,114=>396,115=>365,116=>292,117=>552,118=>479,119=>750,120=>521,121=>469,122=>448,123=>479,124=>510,125=>479,126=>667,8218=>240, - 402=>531,8222=>458,8230=>1000,8224=>438,8225=>438,710=>333,8240=>1010,352=>448,8249=>250,338=>865,8216=>240,8217=>240,8220=>317,8221=>317,8226=>281,8211=>500, - 8212=>1000,8482=>906,353=>365,8250=>250,339=>823,376=>583,160=>244,161=>317,162=>448,163=>583,164=>500,165=>583,166=>200,167=>417,168=>333,169=>765, - 170=>313,171=>417,172=>667,173=>564,174=>765,175=>333,176=>375,177=>462,178=>354,179=>354,180=>333,181=>510,182=>438,183=>198,184=>333,185=>354, - 186=>323,187=>417,188=>854,189=>854,190=>854,191=>448,192=>604,711=>333,215=>462,224=>469,226=>469,231=>448,232=>438,233=>438,234=>438,235=>438, - 238=>271,239=>271,244=>490,305=>271,247=>483,249=>552,251=>552,252=>552,255=>469,9249=>781,1548=>237,1563=>237,1567=>340,1569=>426,1570=>416,1571=>238, - 1572=>429,1573=>260,1574=>817,1575=>238,1576=>853,1577=>439,1578=>853,1579=>853,1580=>720,1581=>720,1582=>720,1583=>485,1584=>485,1585=>423,1586=>423,1587=>1016, - 1588=>1016,1589=>1128,1590=>1128,1591=>794,1592=>794,1593=>685,1594=>685,1600=>371,1601=>840,1602=>696,1603=>1148,1604=>744,1605=>514,1606=>686,1607=>439,1608=>429, - 1609=>817,1610=>817,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1632=>479,1633=>479,1634=>479,1635=>479,1636=>479,1637=>479, - 1638=>479,1639=>479,1640=>479,1641=>483,1642=>493,1645=>563,1648=>227,1649=>363,1652=>227,1662=>853,1670=>720,1688=>423,1700=>840,1705=>1148,1711=>1149,1740=>817, - 1749=>439,1764=>227,1776=>479,1777=>479,1778=>479,1779=>479,1780=>479,1781=>479,1782=>479,1783=>479,1784=>479,1785=>483,8204=>22,8205=>22,8206=>22,8207=>22, - 59424=>227,59425=>227,59426=>227,59427=>227,59428=>227,59429=>227,59430=>227,59431=>227,59432=>227,59433=>227,59434=>227,59435=>227,59436=>227,59416=>227,59437=>227,59442=>227, - 59443=>227,59444=>227,59445=>227,59446=>227,64336=>363,64337=>263,64342=>853,64343=>967,64344=>267,64345=>271,64362=>840,64363=>959,64364=>305,64365=>341,64378=>720,64379=>725, - 64380=>630,64381=>652,64394=>423,64395=>450,64398=>1148,64399=>1089,64400=>522,64401=>461,64402=>1149,64403=>1084,64404=>525,64405=>462,64508=>817,64509=>784,64606=>227,64607=>227, - 64608=>227,64609=>227,64610=>227,64754=>371,64755=>371,64756=>371,64828=>331,64829=>276,64830=>303,64831=>303,65010=>866,65136=>227,65137=>371,65138=>227,65140=>227,65142=>227, - 65143=>371,65144=>227,65145=>371,65146=>227,65147=>371,65148=>227,65149=>371,65150=>227,65151=>371,65152=>426,65153=>416,65154=>354,65155=>238,65156=>282,65157=>429,65158=>507, - 65159=>260,65160=>286,65161=>817,65162=>784,65163=>190,65164=>276,65165=>238,65166=>263,65167=>853,65168=>967,65169=>186,65170=>271,65171=>439,65172=>452,65173=>853,65174=>967, - 65175=>256,65176=>271,65177=>853,65178=>967,65179=>267,65180=>271,65181=>720,65182=>725,65183=>630,65184=>652,65185=>720,65186=>725,65187=>630,65188=>652,65189=>720,65190=>725, - 65191=>630,65192=>652,65193=>485,65194=>608,65195=>485,65196=>608,65197=>423,65198=>450,65199=>423,65200=>450,65201=>1016,65202=>1041,65203=>498,65204=>475,65205=>1016,65206=>1041, - 65207=>498,65208=>475,65209=>1128,65210=>1150,65211=>633,65212=>655,65213=>1128,65214=>1150,65215=>633,65216=>655,65217=>794,65218=>814,65219=>566,65220=>588,65221=>794,65222=>814, - 65223=>566,65224=>588,65225=>685,65226=>655,65227=>414,65228=>330,65229=>685,65230=>655,65231=>414,65232=>330,65233=>840,65234=>959,65235=>305,65236=>341,65237=>696,65238=>780, - 65239=>305,65240=>341,65241=>1148,65242=>1089,65243=>522,65244=>461,65245=>744,65246=>741,65247=>202,65248=>259,65249=>514,65250=>585,65251=>345,65252=>477,65253=>686,65254=>764, - 65255=>186,65256=>271,65257=>439,65258=>452,65259=>501,65260=>381,65261=>429,65262=>507,65263=>817,65264=>784,65265=>817,65266=>784,64510=>265,64511=>271,65269=>610,65270=>652, - 65271=>539,65272=>611,65273=>539,65274=>611,65275=>539,65276=>611,65279=>0,64486=>408,64487=>408); -$enc=''; -$diff=''; -$file='zarbold.z'; -$ctg='zarbold.ctg.z'; -$originalsize=73296; -// --- EOF --- diff --git a/include/limesurvey/admin/classes/tcpdf/htmlcolors.php b/include/limesurvey/admin/classes/tcpdf/htmlcolors.php deleted file mode 100644 index e07be272..00000000 --- a/include/limesurvey/admin/classes/tcpdf/htmlcolors.php +++ /dev/null @@ -1,201 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -// ------------------------------------------------------------------- -// -// Description : Array of WEB safe colors -// -//============================================================+ - -/** - * Array of WEB safe colors. - * @author Nicola Asuni - * @copyright 2002-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @package com.tecnick.tcpdf - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @since 2.9.000 (2008-03-26) -*/ - -/** - * Array of WEB safe colors - */ -$webcolor = array ( -'aliceblue' => 'f0f8ff', -'antiquewhite' => 'faebd7', -'aqua' => '00ffff', -'aquamarine' => '7fffd4', -'azure' => 'f0ffff', -'beige' => 'f5f5dc', -'bisque' => 'ffe4c4', -'black' => '000000', -'blanchedalmond' => 'ffebcd', -'blue' => '0000ff', -'blueviolet' => '8a2be2', -'brown' => 'a52a2a', -'burlywood' => 'deb887', -'cadetblue' => '5f9ea0', -'chartreuse' => '7fff00', -'chocolate' => 'd2691e', -'coral' => 'ff7f50', -'cornflowerblue' => '6495ed', -'cornsilk' => 'fff8dc', -'crimson' => 'dc143c', -'cyan' => '00ffff', -'darkblue' => '00008b', -'darkcyan' => '008b8b', -'darkgoldenrod' => 'b8860b', -'dkgray' => 'a9a9a9', -'darkgray' => 'a9a9a9', -'darkgrey' => 'a9a9a9', -'darkgreen' => '006400', -'darkkhaki' => 'bdb76b', -'darkmagenta' => '8b008b', -'darkolivegreen' => '556b2f', -'darkorange' => 'ff8c00', -'darkorchid' => '9932cc', -'darkred' => '8b0000', -'darksalmon' => 'e9967a', -'darkseagreen' => '8fbc8f', -'darkslateblue' => '483d8b', -'darkslategray' => '2f4f4f', -'darkslategrey' => '2f4f4f', -'darkturquoise' => '00ced1', -'darkviolet' => '9400d3', -'deeppink' => 'ff1493', -'deepskyblue' => '00bfff', -'dimgray' => '696969', -'dimgrey' => '696969', -'dodgerblue' => '1e90ff', -'firebrick' => 'b22222', -'floralwhite' => 'fffaf0', -'forestgreen' => '228b22', -'fuchsia' => 'ff00ff', -'gainsboro' => 'dcdcdc', -'ghostwhite' => 'f8f8ff', -'gold' => 'ffd700', -'goldenrod' => 'daa520', -'gray' => '808080', -'grey' => '808080', -'green' => '008000', -'greenyellow' => 'adff2f', -'honeydew' => 'f0fff0', -'hotpink' => 'ff69b4', -'indianred' => 'cd5c5c', -'indigo' => '4b0082', -'ivory' => 'fffff0', -'khaki' => 'f0e68c', -'lavender' => 'e6e6fa', -'lavenderblush' => 'fff0f5', -'lawngreen' => '7cfc00', -'lemonchiffon' => 'fffacd', -'lightblue' => 'add8e6', -'lightcoral' => 'f08080', -'lightcyan' => 'e0ffff', -'lightgoldenrodyellow' => 'fafad2', -'ltgray' => 'd3d3d3', -'lightgray' => 'd3d3d3', -'lightgrey' => 'd3d3d3', -'lightgreen' => '90ee90', -'lightpink' => 'ffb6c1', -'lightsalmon' => 'ffa07a', -'lightseagreen' => '20b2aa', -'lightskyblue' => '87cefa', -'lightslategray' => '778899', -'lightslategrey' => '778899', -'lightsteelblue' => 'b0c4de', -'lightyellow' => 'ffffe0', -'lime' => '00ff00', -'limegreen' => '32cd32', -'linen' => 'faf0e6', -'magenta' => 'ff00ff', -'maroon' => '800000', -'mediumaquamarine' => '66cdaa', -'mediumblue' => '0000cd', -'mediumorchid' => 'ba55d3', -'mediumpurple' => '9370d8', -'mediumseagreen' => '3cb371', -'mediumslateblue' => '7b68ee', -'mediumspringgreen' => '00fa9a', -'mediumturquoise' => '48d1cc', -'mediumvioletred' => 'c71585', -'midnightblue' => '191970', -'mintcream' => 'f5fffa', -'mistyrose' => 'ffe4e1', -'moccasin' => 'ffe4b5', -'navajowhite' => 'ffdead', -'navy' => '000080', -'oldlace' => 'fdf5e6', -'olive' => '808000', -'olivedrab' => '6b8e23', -'orange' => 'ffa500', -'orangered' => 'ff4500', -'orchid' => 'da70d6', -'palegoldenrod' => 'eee8aa', -'palegreen' => '98fb98', -'paleturquoise' => 'afeeee', -'palevioletred' => 'd87093', -'papayawhip' => 'ffefd5', -'peachpuff' => 'ffdab9', -'peru' => 'cd853f', -'pink' => 'ffc0cb', -'plum' => 'dda0dd', -'powderblue' => 'b0e0e6', -'purple' => '800080', -'red' => 'ff0000', -'rosybrown' => 'bc8f8f', -'royalblue' => '4169e1', -'saddlebrown' => '8b4513', -'salmon' => 'fa8072', -'sandybrown' => 'f4a460', -'seagreen' => '2e8b57', -'seashell' => 'fff5ee', -'sienna' => 'a0522d', -'silver' => 'c0c0c0', -'skyblue' => '87ceeb', -'slateblue' => '6a5acd', -'slategray' => '708090', -'slategrey' => '708090', -'snow' => 'fffafa', -'springgreen' => '00ff7f', -'steelblue' => '4682b4', -'tan' => 'd2b48c', -'teal' => '008080', -'thistle' => 'd8bfd8', -'tomato' => 'ff6347', -'turquoise' => '40e0d0', -'violet' => 'ee82ee', -'wheat' => 'f5deb3', -'white' => 'ffffff', -'whitesmoke' => 'f5f5f5', -'yellow' => 'ffff00', -'yellowgreen' => '9acd32' -); - -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/tcpdf/images/README.TXT b/include/limesurvey/admin/classes/tcpdf/images/README.TXT deleted file mode 100644 index 338e8bb5..00000000 --- a/include/limesurvey/admin/classes/tcpdf/images/README.TXT +++ /dev/null @@ -1 +0,0 @@ -Don't delete this directory. It is needed to prevent path traveling issues. \ No newline at end of file diff --git a/include/limesurvey/admin/classes/tcpdf/images/index.html b/include/limesurvey/admin/classes/tcpdf/images/index.html deleted file mode 100644 index e69de29b..00000000 diff --git a/include/limesurvey/admin/classes/tcpdf/mypdf.php b/include/limesurvey/admin/classes/tcpdf/mypdf.php deleted file mode 100644 index 129c23b0..00000000 --- a/include/limesurvey/admin/classes/tcpdf/mypdf.php +++ /dev/null @@ -1,337 +0,0 @@ -SetAutoPageBreak(true,10); - $this->AliasNbPages(); - } - /** - * - * obsolete - * @param $text - * @param $format - * @return unknown_type - */ - function intopdf($text,$format='') - { - $text = $this->delete_html($text); - $oldformat = $this->FontStyle; - $this->SetFont('',$format,$this->FontSizePt); - $this->Write(5,$text); - $this->ln(5); - $this->SetFont('',$oldformat,$this->FontSizePt); - } - /** - * - * obsolete - * @param $text - * @return unknown_type - */ - function helptextintopdf($text) - { - $oldsize = $this->FontSizePt; - $this->SetFontSize($oldsize-2); - $this->Write(5,$this->delete_html($text)); - $this->ln(5); - $this->SetFontSize($oldsize); - } - /** - * - * writes a big title in the page + description - * @param $title - * @param $description - * @return unknown_type - */ - function titleintopdf($title,$description='') - { - if(!empty($title)) - { - $title = $this->delete_html($title); - $oldsize = $this->FontSizePt; - $this->SetFontSize($oldsize+4); - $this->Line(5,$this->y,($this->w-5),$this->y); - $this->ln(3); - $this->MultiCell('','',$title,'','C',0); - if(!empty($description) && isset($description)) - { - $description = $this->delete_html($description); - $this->ln(7); - $this->SetFontSize($oldsize+2); - $this->MultiCell('','',$description,'','C',0); - $this->ln(2); - } - else - { - $this->ln(4); - } - $this->Line(5,$this->y,($this->w-5),$this->y); - $this->ln(5); - $this->SetFontSize($oldsize); - } - } - /** - * - * Creates a Table with equal cell width and Bold text. Used as Head for equalTable() - * @param $array(0=>) - * @return unknown_type - */ - function tablehead($array) - { - //$maxwidth = array(); - $maxwidth = $this->getEqualWidth($array); - $oldStyle = $this->FontStyle; - $this->SetFont($this->FontFamily, 'B', $this->FontSizePt); - for($a=0;$aCell($maxwidth,4,$this->delete_html($array[$a][$b]),0,0,'L'); - } - $this->ln(); - } - $this->ln(5); - $this->SetFont($this->FontFamily, $oldStyle, $this->FontSizePt); - } - /** - * - * Creates a Table with equal cell width. - * @param $array - table array( 0=> array("td", "td", "td"), - * 1=> array("td", "td", "td")) - * @param $modulo - fills each second row with a light-grey for better visibility. Default is on turn off with 0 - * @return unknown_type - */ - function equalTable($array, $modulo=1) - { - //$maxwidth = array(); - $maxwidth = $this->getEqualWidth($array); - $this->SetFillColor(220, 220, 220); - for($a=0;$aCell($maxwidth,4,$this->delete_html($array[$a][$b]),0,0,'L',$fill); - - } - $this->ln(); - } - $this->ln(5); - } - /** - * - * creates a table using the full width of page - * @param $array - table array( 0=> array("td", "td", "td"), - * 1=> array("td", "td", "td")) - * @param $modulo - fills each second row with a light-grey for better visibility. Default is off, turn on with 1 - * @return unknown_type - */ - function tableintopdf($array, $modulo=1 ) - { - $maxwidth = array(); - $maxwidth = $this->getFullWidth($array); - - $this->SetFillColor(220, 220, 220); - for($a=0;$a"; - $this->Cell($maxwidth[$b],4,$this->delete_html($array[$a][$b]),0,0,'L',$fill); - } - $this->ln(); - } - $this->ln(5); - } - /** - * - * creates a table with a bold head using the full width of page - * @param $head - head array( 0=> array("th", "th", "th")) - * @param $table - table array( 0=> array("td", "td", "td"), - * 1=> array("td", "td", "td")) - * @param $modulo - fills each second row with a light-grey for better visibility. Default is on, turn off with 0 - * @return unknown_type - */ - function headTable($head, $table, $modulo=1 ) - { - $array = array_merge_recursive($head, $table); - //print_r($array); - $maxwidth = array(); - $maxwidth = $this->getFullWidth($array); - - $this->SetFillColor(220, 220, 220); - for($a=0;$aFontStyle; - $this->SetFont($this->FontFamily, 'B', $this->FontSizePt); - - if ($maxwidth[$b] > 140) $maxwidth[$b]=130; - if ($maxwidth[$b] < 20) $maxwidth[$b]=20; - $this->MultiCell($maxwidth[$b],6,$this->delete_html($array[$a][$b]),0,'L',1,$bEndOfCell); - - $this->SetFont($this->FontFamily, $oldStyle, $this->FontSizePt); - } - else - { - if ($a==1) - { - $this->SetFillColor(250, 250, 250); - } - //echo $maxwidth[$b]." max $b.Spalte
    "; - - if ($maxwidth[$b] > 140) $maxwidth[$b]=130; - if ($b==0) - { - $iLines=$this->MultiCell($maxwidth[$b],6,$this->delete_html($array[$a][$b]),0,'L',$fill,$bEndOfCell); - } - else - { - $this->MultiCell($maxwidth[$b],$iLines,$this->delete_html($array[$a][$b]),0,'L',$fill,$bEndOfCell); - } - - } - } - } - $this->ln(5); - } - function getminwidth($array) - { - $width = array(); - for($i=0;$idelete_html($array[$i][$j]),1); - foreach($chars as $char) - { - $stringWidth = $stringWidth+$this->GetCharWidth($char); - - //echo $stringWidth.": ".$char."
    "; - } - if($stringWidth!=0 && $stringWidth<8) - $stringWidth = $stringWidth*3; - if(!isset($width[$j])|| $stringWidth>$width[$j]) - { - $width[$j] = $stringWidth; - } - } - } - return $width; - } - function getmaxwidth($array) - { - for($i=0;$i=0) - { - if(strlen($this->delete_html($array[($i-1)][$j])) < strlen($this->delete_html($array[$i][$j]))) - { - $width[$j] = strlen($this->delete_html($array[$i][$j])); - } - } - else - { - $width[$j]=strlen($this->delete_html($array[$i][$j])); - } - } - } - return ($width); - } - /** - * - * Gets the width for columns in a table based on their Stringlength and the width of the page... - * @param $array - * @return array with column width - */ - function getFullWidth($array) - { - $maxlength = array(); - $width = array(); - $width = $this->getminwidth($array); - - $margins = $this->getMargins(); - $deadSpace = $margins['left']+$margins['right']; - $fullWidth = ($this->GetLineWidth()*1000)-$deadSpace; - $faktor = $fullWidth/array_sum($width); - - for($i=0;$igetMargins(); - $deadSpace = $margins['left']+$margins['right']; - - $width = ($this->GetLineWidth()*1000)-$deadSpace; - $count = 0; - for($i=0;$i$count) - { - $count = sizeof($array[$i]); - } - } - } - - if($count!=0) - return ($width/$count); - else - return FALSE; - } - function write_out($name) - { - $this->Output($name,"D"); - } - - function delete_html($text) - { - $text = html_entity_decode($text); - return strip_tags($text); - } - - } -?> diff --git a/include/limesurvey/admin/classes/tcpdf/pdf417.php b/include/limesurvey/admin/classes/tcpdf/pdf417.php deleted file mode 100644 index d31163b9..00000000 --- a/include/limesurvey/admin/classes/tcpdf/pdf417.php +++ /dev/null @@ -1,1003 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -// ------------------------------------------------------------------- -// -// DESCRIPTION : -// -// Class to create PDF417 barcode arrays for TCPDF class. -// PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991. -// It is one of the most popular 2D codes because of its ability to be read with slightly modified handheld laser or linear CCD scanners. -// TECHNICAL DATA / FEATURES OF PDF417: -// Encodable Character Set: All 128 ASCII Characters (including extended) -// Code Type: Continuous, Multi-Row -// Symbol Height: 3 - 90 Rows -// Symbol Width: 90X - 583X -// Bidirectional Decoding: Yes -// Error Correction Characters: 2 - 512 -// Maximum Data Characters: 1850 text, 2710 digits, 1108 bytes -// -//============================================================+ - -/** - * Class to create PDF417 barcode arrays for TCPDF class. - * PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991. - * (requires PHP bcmath extension) - * @package com.tecnick.tcpdf - * @abstract Class to create PDF417 barcode arrays for TCPDF class. - * @author Nicola Asuni - * @copyright 2010-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @version 1.0.003 - */ - -// definitions -if (!defined('PDF417DEFS')) { - - /** - * Indicate that definitions for this class are set - */ - define('PDF417DEFS', true); - - // ----------------------------------------------------- - - /** - * Row height respect X dimension of single module - */ - define('ROWHEIGHT', 4); - - /** - * Horizontal quiet zone in modules - */ - define('QUIETH', 2); - - /** - * Vertical quiet zone in modules - */ - define('QUIETV', 2); - - - -} // end of definitions - -// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# - -if (!class_exists('PDF417', false)) { - - /** - * Class to create PDF417 barcode arrays for TCPDF class. - * PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991. - * @name PDF417 - * @package com.tecnick.tcpdf - * @abstract Class to create PDF417 barcode arrays for TCPDF class. - * @author Nicola Asuni - * @copyright 2010-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @version 1.0.003 - */ - class PDF417 { - - /** - * @var barcode array to be returned which is readable by TCPDF - * @access protected - */ - protected $barcode_array = array(); - - /** - * @var start pattern - * @access protected - */ - protected $start_pattern = '11111111010101000'; - - /** - * @var start pattern - * @access protected - */ - protected $stop_pattern = '111111101000101001'; - - /** - * @var Text Compaction Sub-Modes (values 0xFB - 0xFF are used for submode changers) - * @access protected - */ - protected $textsubmodes = array( - array(0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x20,0xFD,0xFE,0xFF), // Alpha - array(0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x20,0xFD,0xFE,0xFF), // Lower - array(0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x26,0x0d,0x09,0x2c,0x3a,0x23,0x2d,0x2e,0x24,0x2f,0x2b,0x25,0x2a,0x3d,0x5e,0xFB,0x20,0xFD,0xFE,0xFF), // Mixed - array(0x3b,0x3c,0x3e,0x40,0x5b,0x5c,0x5d,0x5f,0x60,0x7e,0x21,0x0d,0x09,0x2c,0x3a,0x0a,0x2d,0x2e,0x24,0x2f,0x22,0x7c,0x2a,0x28,0x29,0x3f,0x7b,0x7d,0x27,0xFF) // Puntuaction - ); - - /** - * @var Switching codes for Text Compaction Sub-Modes - * @access protected - */ - protected $textlatch = array( - '01' => array(27), '02' => array(28), '03' => array(28,25), // - '10' => array(28,28), '12' => array(28), '13' => array(28,25), // - '20' => array(28), '21' => array(27), '23' => array(25), // - '30' => array(29), '31' => array(29,27), '32' => array(29,28) // - ); - - /** - * @var clusters of codewords (0, 3, 6)
    - * Values are hex equivalents of binary representation of bars (1 = bar, 0 = space).
    - * The codewords numbered from 900 to 928 have special meaning, some enable to switch between modes in order to optimise the code:
      - *
    • 900 : Switch to "Text" mode
    • - *
    • 901 : Switch to "Byte" mode
    • - *
    • 902 : Switch to "Numeric" mode
    • - *
    • 903 - 912 : Reserved
    • - *
    • 913 : Switch to "Octet" only for the next codeword
    • - *
    • 914 - 920 : Reserved
    • - *
    • 921 : Initialization
    • - *
    • 922 : Terminator codeword for Macro PDF control block
    • - *
    • 923 : Sequence tag to identify the beginning of optional fields in the Macro PDF control block
    • - *
    • 924 : Switch to "Byte" mode (If the total number of byte is multiple of 6)
    • - *
    • 925 : Identifier for a user defined Extended Channel Interpretation (ECI)
    • - *
    • 926 : Identifier for a general purpose ECI format
    • - *
    • 927 : Identifier for an ECI of a character set or code page
    • - *
    • 928 : Macro marker codeword to indicate the beginning of a Macro PDF Control Block
    • - *
    - * @access protected - */ - protected $clusters = array( - array( // cluster 0 ----------------------------------------------------------------------- - 0x1d5c0,0x1eaf0,0x1f57c,0x1d4e0,0x1ea78,0x1f53e,0x1a8c0,0x1d470,0x1a860,0x15040, // 10 - 0x1a830,0x15020,0x1adc0,0x1d6f0,0x1eb7c,0x1ace0,0x1d678,0x1eb3e,0x158c0,0x1ac70, // 20 - 0x15860,0x15dc0,0x1aef0,0x1d77c,0x15ce0,0x1ae78,0x1d73e,0x15c70,0x1ae3c,0x15ef0, // 30 - 0x1af7c,0x15e78,0x1af3e,0x15f7c,0x1f5fa,0x1d2e0,0x1e978,0x1f4be,0x1a4c0,0x1d270, // 40 - 0x1e93c,0x1a460,0x1d238,0x14840,0x1a430,0x1d21c,0x14820,0x1a418,0x14810,0x1a6e0, // 50 - 0x1d378,0x1e9be,0x14cc0,0x1a670,0x1d33c,0x14c60,0x1a638,0x1d31e,0x14c30,0x1a61c, // 60 - 0x14ee0,0x1a778,0x1d3be,0x14e70,0x1a73c,0x14e38,0x1a71e,0x14f78,0x1a7be,0x14f3c, // 70 - 0x14f1e,0x1a2c0,0x1d170,0x1e8bc,0x1a260,0x1d138,0x1e89e,0x14440,0x1a230,0x1d11c, // 80 - 0x14420,0x1a218,0x14410,0x14408,0x146c0,0x1a370,0x1d1bc,0x14660,0x1a338,0x1d19e, // 90 - 0x14630,0x1a31c,0x14618,0x1460c,0x14770,0x1a3bc,0x14738,0x1a39e,0x1471c,0x147bc, // 100 - 0x1a160,0x1d0b8,0x1e85e,0x14240,0x1a130,0x1d09c,0x14220,0x1a118,0x1d08e,0x14210, // 110 - 0x1a10c,0x14208,0x1a106,0x14360,0x1a1b8,0x1d0de,0x14330,0x1a19c,0x14318,0x1a18e, // 120 - 0x1430c,0x14306,0x1a1de,0x1438e,0x14140,0x1a0b0,0x1d05c,0x14120,0x1a098,0x1d04e, // 130 - 0x14110,0x1a08c,0x14108,0x1a086,0x14104,0x141b0,0x14198,0x1418c,0x140a0,0x1d02e, // 140 - 0x1a04c,0x1a046,0x14082,0x1cae0,0x1e578,0x1f2be,0x194c0,0x1ca70,0x1e53c,0x19460, // 150 - 0x1ca38,0x1e51e,0x12840,0x19430,0x12820,0x196e0,0x1cb78,0x1e5be,0x12cc0,0x19670, // 160 - 0x1cb3c,0x12c60,0x19638,0x12c30,0x12c18,0x12ee0,0x19778,0x1cbbe,0x12e70,0x1973c, // 170 - 0x12e38,0x12e1c,0x12f78,0x197be,0x12f3c,0x12fbe,0x1dac0,0x1ed70,0x1f6bc,0x1da60, // 180 - 0x1ed38,0x1f69e,0x1b440,0x1da30,0x1ed1c,0x1b420,0x1da18,0x1ed0e,0x1b410,0x1da0c, // 190 - 0x192c0,0x1c970,0x1e4bc,0x1b6c0,0x19260,0x1c938,0x1e49e,0x1b660,0x1db38,0x1ed9e, // 200 - 0x16c40,0x12420,0x19218,0x1c90e,0x16c20,0x1b618,0x16c10,0x126c0,0x19370,0x1c9bc, // 210 - 0x16ec0,0x12660,0x19338,0x1c99e,0x16e60,0x1b738,0x1db9e,0x16e30,0x12618,0x16e18, // 220 - 0x12770,0x193bc,0x16f70,0x12738,0x1939e,0x16f38,0x1b79e,0x16f1c,0x127bc,0x16fbc, // 230 - 0x1279e,0x16f9e,0x1d960,0x1ecb8,0x1f65e,0x1b240,0x1d930,0x1ec9c,0x1b220,0x1d918, // 240 - 0x1ec8e,0x1b210,0x1d90c,0x1b208,0x1b204,0x19160,0x1c8b8,0x1e45e,0x1b360,0x19130, // 250 - 0x1c89c,0x16640,0x12220,0x1d99c,0x1c88e,0x16620,0x12210,0x1910c,0x16610,0x1b30c, // 260 - 0x19106,0x12204,0x12360,0x191b8,0x1c8de,0x16760,0x12330,0x1919c,0x16730,0x1b39c, // 270 - 0x1918e,0x16718,0x1230c,0x12306,0x123b8,0x191de,0x167b8,0x1239c,0x1679c,0x1238e, // 280 - 0x1678e,0x167de,0x1b140,0x1d8b0,0x1ec5c,0x1b120,0x1d898,0x1ec4e,0x1b110,0x1d88c, // 290 - 0x1b108,0x1d886,0x1b104,0x1b102,0x12140,0x190b0,0x1c85c,0x16340,0x12120,0x19098, // 300 - 0x1c84e,0x16320,0x1b198,0x1d8ce,0x16310,0x12108,0x19086,0x16308,0x1b186,0x16304, // 310 - 0x121b0,0x190dc,0x163b0,0x12198,0x190ce,0x16398,0x1b1ce,0x1638c,0x12186,0x16386, // 320 - 0x163dc,0x163ce,0x1b0a0,0x1d858,0x1ec2e,0x1b090,0x1d84c,0x1b088,0x1d846,0x1b084, // 330 - 0x1b082,0x120a0,0x19058,0x1c82e,0x161a0,0x12090,0x1904c,0x16190,0x1b0cc,0x19046, // 340 - 0x16188,0x12084,0x16184,0x12082,0x120d8,0x161d8,0x161cc,0x161c6,0x1d82c,0x1d826, // 350 - 0x1b042,0x1902c,0x12048,0x160c8,0x160c4,0x160c2,0x18ac0,0x1c570,0x1e2bc,0x18a60, // 360 - 0x1c538,0x11440,0x18a30,0x1c51c,0x11420,0x18a18,0x11410,0x11408,0x116c0,0x18b70, // 370 - 0x1c5bc,0x11660,0x18b38,0x1c59e,0x11630,0x18b1c,0x11618,0x1160c,0x11770,0x18bbc, // 380 - 0x11738,0x18b9e,0x1171c,0x117bc,0x1179e,0x1cd60,0x1e6b8,0x1f35e,0x19a40,0x1cd30, // 390 - 0x1e69c,0x19a20,0x1cd18,0x1e68e,0x19a10,0x1cd0c,0x19a08,0x1cd06,0x18960,0x1c4b8, // 400 - 0x1e25e,0x19b60,0x18930,0x1c49c,0x13640,0x11220,0x1cd9c,0x1c48e,0x13620,0x19b18, // 410 - 0x1890c,0x13610,0x11208,0x13608,0x11360,0x189b8,0x1c4de,0x13760,0x11330,0x1cdde, // 420 - 0x13730,0x19b9c,0x1898e,0x13718,0x1130c,0x1370c,0x113b8,0x189de,0x137b8,0x1139c, // 430 - 0x1379c,0x1138e,0x113de,0x137de,0x1dd40,0x1eeb0,0x1f75c,0x1dd20,0x1ee98,0x1f74e, // 440 - 0x1dd10,0x1ee8c,0x1dd08,0x1ee86,0x1dd04,0x19940,0x1ccb0,0x1e65c,0x1bb40,0x19920, // 450 - 0x1eedc,0x1e64e,0x1bb20,0x1dd98,0x1eece,0x1bb10,0x19908,0x1cc86,0x1bb08,0x1dd86, // 460 - 0x19902,0x11140,0x188b0,0x1c45c,0x13340,0x11120,0x18898,0x1c44e,0x17740,0x13320, // 470 - 0x19998,0x1ccce,0x17720,0x1bb98,0x1ddce,0x18886,0x17710,0x13308,0x19986,0x17708, // 480 - 0x11102,0x111b0,0x188dc,0x133b0,0x11198,0x188ce,0x177b0,0x13398,0x199ce,0x17798, // 490 - 0x1bbce,0x11186,0x13386,0x111dc,0x133dc,0x111ce,0x177dc,0x133ce,0x1dca0,0x1ee58, // 500 - 0x1f72e,0x1dc90,0x1ee4c,0x1dc88,0x1ee46,0x1dc84,0x1dc82,0x198a0,0x1cc58,0x1e62e, // 510 - 0x1b9a0,0x19890,0x1ee6e,0x1b990,0x1dccc,0x1cc46,0x1b988,0x19884,0x1b984,0x19882, // 520 - 0x1b982,0x110a0,0x18858,0x1c42e,0x131a0,0x11090,0x1884c,0x173a0,0x13190,0x198cc, // 530 - 0x18846,0x17390,0x1b9cc,0x11084,0x17388,0x13184,0x11082,0x13182,0x110d8,0x1886e, // 540 - 0x131d8,0x110cc,0x173d8,0x131cc,0x110c6,0x173cc,0x131c6,0x110ee,0x173ee,0x1dc50, // 550 - 0x1ee2c,0x1dc48,0x1ee26,0x1dc44,0x1dc42,0x19850,0x1cc2c,0x1b8d0,0x19848,0x1cc26, // 560 - 0x1b8c8,0x1dc66,0x1b8c4,0x19842,0x1b8c2,0x11050,0x1882c,0x130d0,0x11048,0x18826, // 570 - 0x171d0,0x130c8,0x19866,0x171c8,0x1b8e6,0x11042,0x171c4,0x130c2,0x171c2,0x130ec, // 580 - 0x171ec,0x171e6,0x1ee16,0x1dc22,0x1cc16,0x19824,0x19822,0x11028,0x13068,0x170e8, // 590 - 0x11022,0x13062,0x18560,0x10a40,0x18530,0x10a20,0x18518,0x1c28e,0x10a10,0x1850c, // 600 - 0x10a08,0x18506,0x10b60,0x185b8,0x1c2de,0x10b30,0x1859c,0x10b18,0x1858e,0x10b0c, // 610 - 0x10b06,0x10bb8,0x185de,0x10b9c,0x10b8e,0x10bde,0x18d40,0x1c6b0,0x1e35c,0x18d20, // 620 - 0x1c698,0x18d10,0x1c68c,0x18d08,0x1c686,0x18d04,0x10940,0x184b0,0x1c25c,0x11b40, // 630 - 0x10920,0x1c6dc,0x1c24e,0x11b20,0x18d98,0x1c6ce,0x11b10,0x10908,0x18486,0x11b08, // 640 - 0x18d86,0x10902,0x109b0,0x184dc,0x11bb0,0x10998,0x184ce,0x11b98,0x18dce,0x11b8c, // 650 - 0x10986,0x109dc,0x11bdc,0x109ce,0x11bce,0x1cea0,0x1e758,0x1f3ae,0x1ce90,0x1e74c, // 660 - 0x1ce88,0x1e746,0x1ce84,0x1ce82,0x18ca0,0x1c658,0x19da0,0x18c90,0x1c64c,0x19d90, // 670 - 0x1cecc,0x1c646,0x19d88,0x18c84,0x19d84,0x18c82,0x19d82,0x108a0,0x18458,0x119a0, // 680 - 0x10890,0x1c66e,0x13ba0,0x11990,0x18ccc,0x18446,0x13b90,0x19dcc,0x10884,0x13b88, // 690 - 0x11984,0x10882,0x11982,0x108d8,0x1846e,0x119d8,0x108cc,0x13bd8,0x119cc,0x108c6, // 700 - 0x13bcc,0x119c6,0x108ee,0x119ee,0x13bee,0x1ef50,0x1f7ac,0x1ef48,0x1f7a6,0x1ef44, // 710 - 0x1ef42,0x1ce50,0x1e72c,0x1ded0,0x1ef6c,0x1e726,0x1dec8,0x1ef66,0x1dec4,0x1ce42, // 720 - 0x1dec2,0x18c50,0x1c62c,0x19cd0,0x18c48,0x1c626,0x1bdd0,0x19cc8,0x1ce66,0x1bdc8, // 730 - 0x1dee6,0x18c42,0x1bdc4,0x19cc2,0x1bdc2,0x10850,0x1842c,0x118d0,0x10848,0x18426, // 740 - 0x139d0,0x118c8,0x18c66,0x17bd0,0x139c8,0x19ce6,0x10842,0x17bc8,0x1bde6,0x118c2, // 750 - 0x17bc4,0x1086c,0x118ec,0x10866,0x139ec,0x118e6,0x17bec,0x139e6,0x17be6,0x1ef28, // 760 - 0x1f796,0x1ef24,0x1ef22,0x1ce28,0x1e716,0x1de68,0x1ef36,0x1de64,0x1ce22,0x1de62, // 770 - 0x18c28,0x1c616,0x19c68,0x18c24,0x1bce8,0x19c64,0x18c22,0x1bce4,0x19c62,0x1bce2, // 780 - 0x10828,0x18416,0x11868,0x18c36,0x138e8,0x11864,0x10822,0x179e8,0x138e4,0x11862, // 790 - 0x179e4,0x138e2,0x179e2,0x11876,0x179f6,0x1ef12,0x1de34,0x1de32,0x19c34,0x1bc74, // 800 - 0x1bc72,0x11834,0x13874,0x178f4,0x178f2,0x10540,0x10520,0x18298,0x10510,0x10508, // 810 - 0x10504,0x105b0,0x10598,0x1058c,0x10586,0x105dc,0x105ce,0x186a0,0x18690,0x1c34c, // 820 - 0x18688,0x1c346,0x18684,0x18682,0x104a0,0x18258,0x10da0,0x186d8,0x1824c,0x10d90, // 830 - 0x186cc,0x10d88,0x186c6,0x10d84,0x10482,0x10d82,0x104d8,0x1826e,0x10dd8,0x186ee, // 840 - 0x10dcc,0x104c6,0x10dc6,0x104ee,0x10dee,0x1c750,0x1c748,0x1c744,0x1c742,0x18650, // 850 - 0x18ed0,0x1c76c,0x1c326,0x18ec8,0x1c766,0x18ec4,0x18642,0x18ec2,0x10450,0x10cd0, // 860 - 0x10448,0x18226,0x11dd0,0x10cc8,0x10444,0x11dc8,0x10cc4,0x10442,0x11dc4,0x10cc2, // 870 - 0x1046c,0x10cec,0x10466,0x11dec,0x10ce6,0x11de6,0x1e7a8,0x1e7a4,0x1e7a2,0x1c728, // 880 - 0x1cf68,0x1e7b6,0x1cf64,0x1c722,0x1cf62,0x18628,0x1c316,0x18e68,0x1c736,0x19ee8, // 890 - 0x18e64,0x18622,0x19ee4,0x18e62,0x19ee2,0x10428,0x18216,0x10c68,0x18636,0x11ce8, // 900 - 0x10c64,0x10422,0x13de8,0x11ce4,0x10c62,0x13de4,0x11ce2,0x10436,0x10c76,0x11cf6, // 910 - 0x13df6,0x1f7d4,0x1f7d2,0x1e794,0x1efb4,0x1e792,0x1efb2,0x1c714,0x1cf34,0x1c712, // 920 - 0x1df74,0x1cf32,0x1df72,0x18614,0x18e34,0x18612,0x19e74,0x18e32,0x1bef4), // 929 - array( // cluster 3 ----------------------------------------------------------------------- - 0x1f560,0x1fab8,0x1ea40,0x1f530,0x1fa9c,0x1ea20,0x1f518,0x1fa8e,0x1ea10,0x1f50c, // 10 - 0x1ea08,0x1f506,0x1ea04,0x1eb60,0x1f5b8,0x1fade,0x1d640,0x1eb30,0x1f59c,0x1d620, // 20 - 0x1eb18,0x1f58e,0x1d610,0x1eb0c,0x1d608,0x1eb06,0x1d604,0x1d760,0x1ebb8,0x1f5de, // 30 - 0x1ae40,0x1d730,0x1eb9c,0x1ae20,0x1d718,0x1eb8e,0x1ae10,0x1d70c,0x1ae08,0x1d706, // 40 - 0x1ae04,0x1af60,0x1d7b8,0x1ebde,0x15e40,0x1af30,0x1d79c,0x15e20,0x1af18,0x1d78e, // 50 - 0x15e10,0x1af0c,0x15e08,0x1af06,0x15f60,0x1afb8,0x1d7de,0x15f30,0x1af9c,0x15f18, // 60 - 0x1af8e,0x15f0c,0x15fb8,0x1afde,0x15f9c,0x15f8e,0x1e940,0x1f4b0,0x1fa5c,0x1e920, // 70 - 0x1f498,0x1fa4e,0x1e910,0x1f48c,0x1e908,0x1f486,0x1e904,0x1e902,0x1d340,0x1e9b0, // 80 - 0x1f4dc,0x1d320,0x1e998,0x1f4ce,0x1d310,0x1e98c,0x1d308,0x1e986,0x1d304,0x1d302, // 90 - 0x1a740,0x1d3b0,0x1e9dc,0x1a720,0x1d398,0x1e9ce,0x1a710,0x1d38c,0x1a708,0x1d386, // 100 - 0x1a704,0x1a702,0x14f40,0x1a7b0,0x1d3dc,0x14f20,0x1a798,0x1d3ce,0x14f10,0x1a78c, // 110 - 0x14f08,0x1a786,0x14f04,0x14fb0,0x1a7dc,0x14f98,0x1a7ce,0x14f8c,0x14f86,0x14fdc, // 120 - 0x14fce,0x1e8a0,0x1f458,0x1fa2e,0x1e890,0x1f44c,0x1e888,0x1f446,0x1e884,0x1e882, // 130 - 0x1d1a0,0x1e8d8,0x1f46e,0x1d190,0x1e8cc,0x1d188,0x1e8c6,0x1d184,0x1d182,0x1a3a0, // 140 - 0x1d1d8,0x1e8ee,0x1a390,0x1d1cc,0x1a388,0x1d1c6,0x1a384,0x1a382,0x147a0,0x1a3d8, // 150 - 0x1d1ee,0x14790,0x1a3cc,0x14788,0x1a3c6,0x14784,0x14782,0x147d8,0x1a3ee,0x147cc, // 160 - 0x147c6,0x147ee,0x1e850,0x1f42c,0x1e848,0x1f426,0x1e844,0x1e842,0x1d0d0,0x1e86c, // 170 - 0x1d0c8,0x1e866,0x1d0c4,0x1d0c2,0x1a1d0,0x1d0ec,0x1a1c8,0x1d0e6,0x1a1c4,0x1a1c2, // 180 - 0x143d0,0x1a1ec,0x143c8,0x1a1e6,0x143c4,0x143c2,0x143ec,0x143e6,0x1e828,0x1f416, // 190 - 0x1e824,0x1e822,0x1d068,0x1e836,0x1d064,0x1d062,0x1a0e8,0x1d076,0x1a0e4,0x1a0e2, // 200 - 0x141e8,0x1a0f6,0x141e4,0x141e2,0x1e814,0x1e812,0x1d034,0x1d032,0x1a074,0x1a072, // 210 - 0x1e540,0x1f2b0,0x1f95c,0x1e520,0x1f298,0x1f94e,0x1e510,0x1f28c,0x1e508,0x1f286, // 220 - 0x1e504,0x1e502,0x1cb40,0x1e5b0,0x1f2dc,0x1cb20,0x1e598,0x1f2ce,0x1cb10,0x1e58c, // 230 - 0x1cb08,0x1e586,0x1cb04,0x1cb02,0x19740,0x1cbb0,0x1e5dc,0x19720,0x1cb98,0x1e5ce, // 240 - 0x19710,0x1cb8c,0x19708,0x1cb86,0x19704,0x19702,0x12f40,0x197b0,0x1cbdc,0x12f20, // 250 - 0x19798,0x1cbce,0x12f10,0x1978c,0x12f08,0x19786,0x12f04,0x12fb0,0x197dc,0x12f98, // 260 - 0x197ce,0x12f8c,0x12f86,0x12fdc,0x12fce,0x1f6a0,0x1fb58,0x16bf0,0x1f690,0x1fb4c, // 270 - 0x169f8,0x1f688,0x1fb46,0x168fc,0x1f684,0x1f682,0x1e4a0,0x1f258,0x1f92e,0x1eda0, // 280 - 0x1e490,0x1fb6e,0x1ed90,0x1f6cc,0x1f246,0x1ed88,0x1e484,0x1ed84,0x1e482,0x1ed82, // 290 - 0x1c9a0,0x1e4d8,0x1f26e,0x1dba0,0x1c990,0x1e4cc,0x1db90,0x1edcc,0x1e4c6,0x1db88, // 300 - 0x1c984,0x1db84,0x1c982,0x1db82,0x193a0,0x1c9d8,0x1e4ee,0x1b7a0,0x19390,0x1c9cc, // 310 - 0x1b790,0x1dbcc,0x1c9c6,0x1b788,0x19384,0x1b784,0x19382,0x1b782,0x127a0,0x193d8, // 320 - 0x1c9ee,0x16fa0,0x12790,0x193cc,0x16f90,0x1b7cc,0x193c6,0x16f88,0x12784,0x16f84, // 330 - 0x12782,0x127d8,0x193ee,0x16fd8,0x127cc,0x16fcc,0x127c6,0x16fc6,0x127ee,0x1f650, // 340 - 0x1fb2c,0x165f8,0x1f648,0x1fb26,0x164fc,0x1f644,0x1647e,0x1f642,0x1e450,0x1f22c, // 350 - 0x1ecd0,0x1e448,0x1f226,0x1ecc8,0x1f666,0x1ecc4,0x1e442,0x1ecc2,0x1c8d0,0x1e46c, // 360 - 0x1d9d0,0x1c8c8,0x1e466,0x1d9c8,0x1ece6,0x1d9c4,0x1c8c2,0x1d9c2,0x191d0,0x1c8ec, // 370 - 0x1b3d0,0x191c8,0x1c8e6,0x1b3c8,0x1d9e6,0x1b3c4,0x191c2,0x1b3c2,0x123d0,0x191ec, // 380 - 0x167d0,0x123c8,0x191e6,0x167c8,0x1b3e6,0x167c4,0x123c2,0x167c2,0x123ec,0x167ec, // 390 - 0x123e6,0x167e6,0x1f628,0x1fb16,0x162fc,0x1f624,0x1627e,0x1f622,0x1e428,0x1f216, // 400 - 0x1ec68,0x1f636,0x1ec64,0x1e422,0x1ec62,0x1c868,0x1e436,0x1d8e8,0x1c864,0x1d8e4, // 410 - 0x1c862,0x1d8e2,0x190e8,0x1c876,0x1b1e8,0x1d8f6,0x1b1e4,0x190e2,0x1b1e2,0x121e8, // 420 - 0x190f6,0x163e8,0x121e4,0x163e4,0x121e2,0x163e2,0x121f6,0x163f6,0x1f614,0x1617e, // 430 - 0x1f612,0x1e414,0x1ec34,0x1e412,0x1ec32,0x1c834,0x1d874,0x1c832,0x1d872,0x19074, // 440 - 0x1b0f4,0x19072,0x1b0f2,0x120f4,0x161f4,0x120f2,0x161f2,0x1f60a,0x1e40a,0x1ec1a, // 450 - 0x1c81a,0x1d83a,0x1903a,0x1b07a,0x1e2a0,0x1f158,0x1f8ae,0x1e290,0x1f14c,0x1e288, // 460 - 0x1f146,0x1e284,0x1e282,0x1c5a0,0x1e2d8,0x1f16e,0x1c590,0x1e2cc,0x1c588,0x1e2c6, // 470 - 0x1c584,0x1c582,0x18ba0,0x1c5d8,0x1e2ee,0x18b90,0x1c5cc,0x18b88,0x1c5c6,0x18b84, // 480 - 0x18b82,0x117a0,0x18bd8,0x1c5ee,0x11790,0x18bcc,0x11788,0x18bc6,0x11784,0x11782, // 490 - 0x117d8,0x18bee,0x117cc,0x117c6,0x117ee,0x1f350,0x1f9ac,0x135f8,0x1f348,0x1f9a6, // 500 - 0x134fc,0x1f344,0x1347e,0x1f342,0x1e250,0x1f12c,0x1e6d0,0x1e248,0x1f126,0x1e6c8, // 510 - 0x1f366,0x1e6c4,0x1e242,0x1e6c2,0x1c4d0,0x1e26c,0x1cdd0,0x1c4c8,0x1e266,0x1cdc8, // 520 - 0x1e6e6,0x1cdc4,0x1c4c2,0x1cdc2,0x189d0,0x1c4ec,0x19bd0,0x189c8,0x1c4e6,0x19bc8, // 530 - 0x1cde6,0x19bc4,0x189c2,0x19bc2,0x113d0,0x189ec,0x137d0,0x113c8,0x189e6,0x137c8, // 540 - 0x19be6,0x137c4,0x113c2,0x137c2,0x113ec,0x137ec,0x113e6,0x137e6,0x1fba8,0x175f0, // 550 - 0x1bafc,0x1fba4,0x174f8,0x1ba7e,0x1fba2,0x1747c,0x1743e,0x1f328,0x1f996,0x132fc, // 560 - 0x1f768,0x1fbb6,0x176fc,0x1327e,0x1f764,0x1f322,0x1767e,0x1f762,0x1e228,0x1f116, // 570 - 0x1e668,0x1e224,0x1eee8,0x1f776,0x1e222,0x1eee4,0x1e662,0x1eee2,0x1c468,0x1e236, // 580 - 0x1cce8,0x1c464,0x1dde8,0x1cce4,0x1c462,0x1dde4,0x1cce2,0x1dde2,0x188e8,0x1c476, // 590 - 0x199e8,0x188e4,0x1bbe8,0x199e4,0x188e2,0x1bbe4,0x199e2,0x1bbe2,0x111e8,0x188f6, // 600 - 0x133e8,0x111e4,0x177e8,0x133e4,0x111e2,0x177e4,0x133e2,0x177e2,0x111f6,0x133f6, // 610 - 0x1fb94,0x172f8,0x1b97e,0x1fb92,0x1727c,0x1723e,0x1f314,0x1317e,0x1f734,0x1f312, // 620 - 0x1737e,0x1f732,0x1e214,0x1e634,0x1e212,0x1ee74,0x1e632,0x1ee72,0x1c434,0x1cc74, // 630 - 0x1c432,0x1dcf4,0x1cc72,0x1dcf2,0x18874,0x198f4,0x18872,0x1b9f4,0x198f2,0x1b9f2, // 640 - 0x110f4,0x131f4,0x110f2,0x173f4,0x131f2,0x173f2,0x1fb8a,0x1717c,0x1713e,0x1f30a, // 650 - 0x1f71a,0x1e20a,0x1e61a,0x1ee3a,0x1c41a,0x1cc3a,0x1dc7a,0x1883a,0x1987a,0x1b8fa, // 660 - 0x1107a,0x130fa,0x171fa,0x170be,0x1e150,0x1f0ac,0x1e148,0x1f0a6,0x1e144,0x1e142, // 670 - 0x1c2d0,0x1e16c,0x1c2c8,0x1e166,0x1c2c4,0x1c2c2,0x185d0,0x1c2ec,0x185c8,0x1c2e6, // 680 - 0x185c4,0x185c2,0x10bd0,0x185ec,0x10bc8,0x185e6,0x10bc4,0x10bc2,0x10bec,0x10be6, // 690 - 0x1f1a8,0x1f8d6,0x11afc,0x1f1a4,0x11a7e,0x1f1a2,0x1e128,0x1f096,0x1e368,0x1e124, // 700 - 0x1e364,0x1e122,0x1e362,0x1c268,0x1e136,0x1c6e8,0x1c264,0x1c6e4,0x1c262,0x1c6e2, // 710 - 0x184e8,0x1c276,0x18de8,0x184e4,0x18de4,0x184e2,0x18de2,0x109e8,0x184f6,0x11be8, // 720 - 0x109e4,0x11be4,0x109e2,0x11be2,0x109f6,0x11bf6,0x1f9d4,0x13af8,0x19d7e,0x1f9d2, // 730 - 0x13a7c,0x13a3e,0x1f194,0x1197e,0x1f3b4,0x1f192,0x13b7e,0x1f3b2,0x1e114,0x1e334, // 740 - 0x1e112,0x1e774,0x1e332,0x1e772,0x1c234,0x1c674,0x1c232,0x1cef4,0x1c672,0x1cef2, // 750 - 0x18474,0x18cf4,0x18472,0x19df4,0x18cf2,0x19df2,0x108f4,0x119f4,0x108f2,0x13bf4, // 760 - 0x119f2,0x13bf2,0x17af0,0x1bd7c,0x17a78,0x1bd3e,0x17a3c,0x17a1e,0x1f9ca,0x1397c, // 770 - 0x1fbda,0x17b7c,0x1393e,0x17b3e,0x1f18a,0x1f39a,0x1f7ba,0x1e10a,0x1e31a,0x1e73a, // 780 - 0x1ef7a,0x1c21a,0x1c63a,0x1ce7a,0x1defa,0x1843a,0x18c7a,0x19cfa,0x1bdfa,0x1087a, // 790 - 0x118fa,0x139fa,0x17978,0x1bcbe,0x1793c,0x1791e,0x138be,0x179be,0x178bc,0x1789e, // 800 - 0x1785e,0x1e0a8,0x1e0a4,0x1e0a2,0x1c168,0x1e0b6,0x1c164,0x1c162,0x182e8,0x1c176, // 810 - 0x182e4,0x182e2,0x105e8,0x182f6,0x105e4,0x105e2,0x105f6,0x1f0d4,0x10d7e,0x1f0d2, // 820 - 0x1e094,0x1e1b4,0x1e092,0x1e1b2,0x1c134,0x1c374,0x1c132,0x1c372,0x18274,0x186f4, // 830 - 0x18272,0x186f2,0x104f4,0x10df4,0x104f2,0x10df2,0x1f8ea,0x11d7c,0x11d3e,0x1f0ca, // 840 - 0x1f1da,0x1e08a,0x1e19a,0x1e3ba,0x1c11a,0x1c33a,0x1c77a,0x1823a,0x1867a,0x18efa, // 850 - 0x1047a,0x10cfa,0x11dfa,0x13d78,0x19ebe,0x13d3c,0x13d1e,0x11cbe,0x13dbe,0x17d70, // 860 - 0x1bebc,0x17d38,0x1be9e,0x17d1c,0x17d0e,0x13cbc,0x17dbc,0x13c9e,0x17d9e,0x17cb8, // 870 - 0x1be5e,0x17c9c,0x17c8e,0x13c5e,0x17cde,0x17c5c,0x17c4e,0x17c2e,0x1c0b4,0x1c0b2, // 880 - 0x18174,0x18172,0x102f4,0x102f2,0x1e0da,0x1c09a,0x1c1ba,0x1813a,0x1837a,0x1027a, // 890 - 0x106fa,0x10ebe,0x11ebc,0x11e9e,0x13eb8,0x19f5e,0x13e9c,0x13e8e,0x11e5e,0x13ede, // 900 - 0x17eb0,0x1bf5c,0x17e98,0x1bf4e,0x17e8c,0x17e86,0x13e5c,0x17edc,0x13e4e,0x17ece, // 910 - 0x17e58,0x1bf2e,0x17e4c,0x17e46,0x13e2e,0x17e6e,0x17e2c,0x17e26,0x10f5e,0x11f5c, // 920 - 0x11f4e,0x13f58,0x19fae,0x13f4c,0x13f46,0x11f2e,0x13f6e,0x13f2c,0x13f26), // 929 - array( // cluster 6 ----------------------------------------------------------------------- - 0x1abe0,0x1d5f8,0x153c0,0x1a9f0,0x1d4fc,0x151e0,0x1a8f8,0x1d47e,0x150f0,0x1a87c, // 10 - 0x15078,0x1fad0,0x15be0,0x1adf8,0x1fac8,0x159f0,0x1acfc,0x1fac4,0x158f8,0x1ac7e, // 20 - 0x1fac2,0x1587c,0x1f5d0,0x1faec,0x15df8,0x1f5c8,0x1fae6,0x15cfc,0x1f5c4,0x15c7e, // 30 - 0x1f5c2,0x1ebd0,0x1f5ec,0x1ebc8,0x1f5e6,0x1ebc4,0x1ebc2,0x1d7d0,0x1ebec,0x1d7c8, // 40 - 0x1ebe6,0x1d7c4,0x1d7c2,0x1afd0,0x1d7ec,0x1afc8,0x1d7e6,0x1afc4,0x14bc0,0x1a5f0, // 50 - 0x1d2fc,0x149e0,0x1a4f8,0x1d27e,0x148f0,0x1a47c,0x14878,0x1a43e,0x1483c,0x1fa68, // 60 - 0x14df0,0x1a6fc,0x1fa64,0x14cf8,0x1a67e,0x1fa62,0x14c7c,0x14c3e,0x1f4e8,0x1fa76, // 70 - 0x14efc,0x1f4e4,0x14e7e,0x1f4e2,0x1e9e8,0x1f4f6,0x1e9e4,0x1e9e2,0x1d3e8,0x1e9f6, // 80 - 0x1d3e4,0x1d3e2,0x1a7e8,0x1d3f6,0x1a7e4,0x1a7e2,0x145e0,0x1a2f8,0x1d17e,0x144f0, // 90 - 0x1a27c,0x14478,0x1a23e,0x1443c,0x1441e,0x1fa34,0x146f8,0x1a37e,0x1fa32,0x1467c, // 100 - 0x1463e,0x1f474,0x1477e,0x1f472,0x1e8f4,0x1e8f2,0x1d1f4,0x1d1f2,0x1a3f4,0x1a3f2, // 110 - 0x142f0,0x1a17c,0x14278,0x1a13e,0x1423c,0x1421e,0x1fa1a,0x1437c,0x1433e,0x1f43a, // 120 - 0x1e87a,0x1d0fa,0x14178,0x1a0be,0x1413c,0x1411e,0x141be,0x140bc,0x1409e,0x12bc0, // 130 - 0x195f0,0x1cafc,0x129e0,0x194f8,0x1ca7e,0x128f0,0x1947c,0x12878,0x1943e,0x1283c, // 140 - 0x1f968,0x12df0,0x196fc,0x1f964,0x12cf8,0x1967e,0x1f962,0x12c7c,0x12c3e,0x1f2e8, // 150 - 0x1f976,0x12efc,0x1f2e4,0x12e7e,0x1f2e2,0x1e5e8,0x1f2f6,0x1e5e4,0x1e5e2,0x1cbe8, // 160 - 0x1e5f6,0x1cbe4,0x1cbe2,0x197e8,0x1cbf6,0x197e4,0x197e2,0x1b5e0,0x1daf8,0x1ed7e, // 170 - 0x169c0,0x1b4f0,0x1da7c,0x168e0,0x1b478,0x1da3e,0x16870,0x1b43c,0x16838,0x1b41e, // 180 - 0x1681c,0x125e0,0x192f8,0x1c97e,0x16de0,0x124f0,0x1927c,0x16cf0,0x1b67c,0x1923e, // 190 - 0x16c78,0x1243c,0x16c3c,0x1241e,0x16c1e,0x1f934,0x126f8,0x1937e,0x1fb74,0x1f932, // 200 - 0x16ef8,0x1267c,0x1fb72,0x16e7c,0x1263e,0x16e3e,0x1f274,0x1277e,0x1f6f4,0x1f272, // 210 - 0x16f7e,0x1f6f2,0x1e4f4,0x1edf4,0x1e4f2,0x1edf2,0x1c9f4,0x1dbf4,0x1c9f2,0x1dbf2, // 220 - 0x193f4,0x193f2,0x165c0,0x1b2f0,0x1d97c,0x164e0,0x1b278,0x1d93e,0x16470,0x1b23c, // 230 - 0x16438,0x1b21e,0x1641c,0x1640e,0x122f0,0x1917c,0x166f0,0x12278,0x1913e,0x16678, // 240 - 0x1b33e,0x1663c,0x1221e,0x1661e,0x1f91a,0x1237c,0x1fb3a,0x1677c,0x1233e,0x1673e, // 250 - 0x1f23a,0x1f67a,0x1e47a,0x1ecfa,0x1c8fa,0x1d9fa,0x191fa,0x162e0,0x1b178,0x1d8be, // 260 - 0x16270,0x1b13c,0x16238,0x1b11e,0x1621c,0x1620e,0x12178,0x190be,0x16378,0x1213c, // 270 - 0x1633c,0x1211e,0x1631e,0x121be,0x163be,0x16170,0x1b0bc,0x16138,0x1b09e,0x1611c, // 280 - 0x1610e,0x120bc,0x161bc,0x1209e,0x1619e,0x160b8,0x1b05e,0x1609c,0x1608e,0x1205e, // 290 - 0x160de,0x1605c,0x1604e,0x115e0,0x18af8,0x1c57e,0x114f0,0x18a7c,0x11478,0x18a3e, // 300 - 0x1143c,0x1141e,0x1f8b4,0x116f8,0x18b7e,0x1f8b2,0x1167c,0x1163e,0x1f174,0x1177e, // 310 - 0x1f172,0x1e2f4,0x1e2f2,0x1c5f4,0x1c5f2,0x18bf4,0x18bf2,0x135c0,0x19af0,0x1cd7c, // 320 - 0x134e0,0x19a78,0x1cd3e,0x13470,0x19a3c,0x13438,0x19a1e,0x1341c,0x1340e,0x112f0, // 330 - 0x1897c,0x136f0,0x11278,0x1893e,0x13678,0x19b3e,0x1363c,0x1121e,0x1361e,0x1f89a, // 340 - 0x1137c,0x1f9ba,0x1377c,0x1133e,0x1373e,0x1f13a,0x1f37a,0x1e27a,0x1e6fa,0x1c4fa, // 350 - 0x1cdfa,0x189fa,0x1bae0,0x1dd78,0x1eebe,0x174c0,0x1ba70,0x1dd3c,0x17460,0x1ba38, // 360 - 0x1dd1e,0x17430,0x1ba1c,0x17418,0x1ba0e,0x1740c,0x132e0,0x19978,0x1ccbe,0x176e0, // 370 - 0x13270,0x1993c,0x17670,0x1bb3c,0x1991e,0x17638,0x1321c,0x1761c,0x1320e,0x1760e, // 380 - 0x11178,0x188be,0x13378,0x1113c,0x17778,0x1333c,0x1111e,0x1773c,0x1331e,0x1771e, // 390 - 0x111be,0x133be,0x177be,0x172c0,0x1b970,0x1dcbc,0x17260,0x1b938,0x1dc9e,0x17230, // 400 - 0x1b91c,0x17218,0x1b90e,0x1720c,0x17206,0x13170,0x198bc,0x17370,0x13138,0x1989e, // 410 - 0x17338,0x1b99e,0x1731c,0x1310e,0x1730e,0x110bc,0x131bc,0x1109e,0x173bc,0x1319e, // 420 - 0x1739e,0x17160,0x1b8b8,0x1dc5e,0x17130,0x1b89c,0x17118,0x1b88e,0x1710c,0x17106, // 430 - 0x130b8,0x1985e,0x171b8,0x1309c,0x1719c,0x1308e,0x1718e,0x1105e,0x130de,0x171de, // 440 - 0x170b0,0x1b85c,0x17098,0x1b84e,0x1708c,0x17086,0x1305c,0x170dc,0x1304e,0x170ce, // 450 - 0x17058,0x1b82e,0x1704c,0x17046,0x1302e,0x1706e,0x1702c,0x17026,0x10af0,0x1857c, // 460 - 0x10a78,0x1853e,0x10a3c,0x10a1e,0x10b7c,0x10b3e,0x1f0ba,0x1e17a,0x1c2fa,0x185fa, // 470 - 0x11ae0,0x18d78,0x1c6be,0x11a70,0x18d3c,0x11a38,0x18d1e,0x11a1c,0x11a0e,0x10978, // 480 - 0x184be,0x11b78,0x1093c,0x11b3c,0x1091e,0x11b1e,0x109be,0x11bbe,0x13ac0,0x19d70, // 490 - 0x1cebc,0x13a60,0x19d38,0x1ce9e,0x13a30,0x19d1c,0x13a18,0x19d0e,0x13a0c,0x13a06, // 500 - 0x11970,0x18cbc,0x13b70,0x11938,0x18c9e,0x13b38,0x1191c,0x13b1c,0x1190e,0x13b0e, // 510 - 0x108bc,0x119bc,0x1089e,0x13bbc,0x1199e,0x13b9e,0x1bd60,0x1deb8,0x1ef5e,0x17a40, // 520 - 0x1bd30,0x1de9c,0x17a20,0x1bd18,0x1de8e,0x17a10,0x1bd0c,0x17a08,0x1bd06,0x17a04, // 530 - 0x13960,0x19cb8,0x1ce5e,0x17b60,0x13930,0x19c9c,0x17b30,0x1bd9c,0x19c8e,0x17b18, // 540 - 0x1390c,0x17b0c,0x13906,0x17b06,0x118b8,0x18c5e,0x139b8,0x1189c,0x17bb8,0x1399c, // 550 - 0x1188e,0x17b9c,0x1398e,0x17b8e,0x1085e,0x118de,0x139de,0x17bde,0x17940,0x1bcb0, // 560 - 0x1de5c,0x17920,0x1bc98,0x1de4e,0x17910,0x1bc8c,0x17908,0x1bc86,0x17904,0x17902, // 570 - 0x138b0,0x19c5c,0x179b0,0x13898,0x19c4e,0x17998,0x1bcce,0x1798c,0x13886,0x17986, // 580 - 0x1185c,0x138dc,0x1184e,0x179dc,0x138ce,0x179ce,0x178a0,0x1bc58,0x1de2e,0x17890, // 590 - 0x1bc4c,0x17888,0x1bc46,0x17884,0x17882,0x13858,0x19c2e,0x178d8,0x1384c,0x178cc, // 600 - 0x13846,0x178c6,0x1182e,0x1386e,0x178ee,0x17850,0x1bc2c,0x17848,0x1bc26,0x17844, // 610 - 0x17842,0x1382c,0x1786c,0x13826,0x17866,0x17828,0x1bc16,0x17824,0x17822,0x13816, // 620 - 0x17836,0x10578,0x182be,0x1053c,0x1051e,0x105be,0x10d70,0x186bc,0x10d38,0x1869e, // 630 - 0x10d1c,0x10d0e,0x104bc,0x10dbc,0x1049e,0x10d9e,0x11d60,0x18eb8,0x1c75e,0x11d30, // 640 - 0x18e9c,0x11d18,0x18e8e,0x11d0c,0x11d06,0x10cb8,0x1865e,0x11db8,0x10c9c,0x11d9c, // 650 - 0x10c8e,0x11d8e,0x1045e,0x10cde,0x11dde,0x13d40,0x19eb0,0x1cf5c,0x13d20,0x19e98, // 660 - 0x1cf4e,0x13d10,0x19e8c,0x13d08,0x19e86,0x13d04,0x13d02,0x11cb0,0x18e5c,0x13db0, // 670 - 0x11c98,0x18e4e,0x13d98,0x19ece,0x13d8c,0x11c86,0x13d86,0x10c5c,0x11cdc,0x10c4e, // 680 - 0x13ddc,0x11cce,0x13dce,0x1bea0,0x1df58,0x1efae,0x1be90,0x1df4c,0x1be88,0x1df46, // 690 - 0x1be84,0x1be82,0x13ca0,0x19e58,0x1cf2e,0x17da0,0x13c90,0x19e4c,0x17d90,0x1becc, // 700 - 0x19e46,0x17d88,0x13c84,0x17d84,0x13c82,0x17d82,0x11c58,0x18e2e,0x13cd8,0x11c4c, // 710 - 0x17dd8,0x13ccc,0x11c46,0x17dcc,0x13cc6,0x17dc6,0x10c2e,0x11c6e,0x13cee,0x17dee, // 720 - 0x1be50,0x1df2c,0x1be48,0x1df26,0x1be44,0x1be42,0x13c50,0x19e2c,0x17cd0,0x13c48, // 730 - 0x19e26,0x17cc8,0x1be66,0x17cc4,0x13c42,0x17cc2,0x11c2c,0x13c6c,0x11c26,0x17cec, // 740 - 0x13c66,0x17ce6,0x1be28,0x1df16,0x1be24,0x1be22,0x13c28,0x19e16,0x17c68,0x13c24, // 750 - 0x17c64,0x13c22,0x17c62,0x11c16,0x13c36,0x17c76,0x1be14,0x1be12,0x13c14,0x17c34, // 760 - 0x13c12,0x17c32,0x102bc,0x1029e,0x106b8,0x1835e,0x1069c,0x1068e,0x1025e,0x106de, // 770 - 0x10eb0,0x1875c,0x10e98,0x1874e,0x10e8c,0x10e86,0x1065c,0x10edc,0x1064e,0x10ece, // 780 - 0x11ea0,0x18f58,0x1c7ae,0x11e90,0x18f4c,0x11e88,0x18f46,0x11e84,0x11e82,0x10e58, // 790 - 0x1872e,0x11ed8,0x18f6e,0x11ecc,0x10e46,0x11ec6,0x1062e,0x10e6e,0x11eee,0x19f50, // 800 - 0x1cfac,0x19f48,0x1cfa6,0x19f44,0x19f42,0x11e50,0x18f2c,0x13ed0,0x19f6c,0x18f26, // 810 - 0x13ec8,0x11e44,0x13ec4,0x11e42,0x13ec2,0x10e2c,0x11e6c,0x10e26,0x13eec,0x11e66, // 820 - 0x13ee6,0x1dfa8,0x1efd6,0x1dfa4,0x1dfa2,0x19f28,0x1cf96,0x1bf68,0x19f24,0x1bf64, // 830 - 0x19f22,0x1bf62,0x11e28,0x18f16,0x13e68,0x11e24,0x17ee8,0x13e64,0x11e22,0x17ee4, // 840 - 0x13e62,0x17ee2,0x10e16,0x11e36,0x13e76,0x17ef6,0x1df94,0x1df92,0x19f14,0x1bf34, // 850 - 0x19f12,0x1bf32,0x11e14,0x13e34,0x11e12,0x17e74,0x13e32,0x17e72,0x1df8a,0x19f0a, // 860 - 0x1bf1a,0x11e0a,0x13e1a,0x17e3a,0x1035c,0x1034e,0x10758,0x183ae,0x1074c,0x10746, // 870 - 0x1032e,0x1076e,0x10f50,0x187ac,0x10f48,0x187a6,0x10f44,0x10f42,0x1072c,0x10f6c, // 880 - 0x10726,0x10f66,0x18fa8,0x1c7d6,0x18fa4,0x18fa2,0x10f28,0x18796,0x11f68,0x18fb6, // 890 - 0x11f64,0x10f22,0x11f62,0x10716,0x10f36,0x11f76,0x1cfd4,0x1cfd2,0x18f94,0x19fb4, // 900 - 0x18f92,0x19fb2,0x10f14,0x11f34,0x10f12,0x13f74,0x11f32,0x13f72,0x1cfca,0x18f8a, // 910 - 0x19f9a,0x10f0a,0x11f1a,0x13f3a,0x103ac,0x103a6,0x107a8,0x183d6,0x107a4,0x107a2, // 920 - 0x10396,0x107b6,0x187d4,0x187d2,0x10794,0x10fb4,0x10792,0x10fb2,0x1c7ea) // 929 - ); // end of $clusters array - - /** - * @var Factors of the Reed-Solomon polynomial equations used for error correction; one sub array for each correction level (0-8) - * @access protected - */ - protected $rsfactors = array( - array( // ECL 0 (2 factors) ------------------------------------------------------------------------------- - 0x01b,0x395), // 2 - array( // ECL 1 (4 factors) ------------------------------------------------------------------------------- - 0x20a,0x238,0x2d3,0x329), // 4 - array( // ECL 2 (8 factors) ------------------------------------------------------------------------------- - 0x0ed,0x134,0x1b4,0x11c,0x286,0x28d,0x1ac,0x17b), // 8 - array( // ECL 3 (16 factors) ------------------------------------------------------------------------------ - 0x112,0x232,0x0e8,0x2f3,0x257,0x20c,0x321,0x084,0x127,0x074,0x1ba,0x1ac,0x127,0x02a,0x0b0,0x041),// 16 - array( // ECL 4 (32 factors) ------------------------------------------------------------------------------ - 0x169,0x23f,0x39a,0x20d,0x0b0,0x24a,0x280,0x141,0x218,0x2e6,0x2a5,0x2e6,0x2af,0x11c,0x0c1,0x205, // 16 - 0x111,0x1ee,0x107,0x093,0x251,0x320,0x23b,0x140,0x323,0x085,0x0e7,0x186,0x2ad,0x14a,0x03f,0x19a),// 32 - array( // ECL 5 (64 factors) ------------------------------------------------------------------------------ - 0x21b,0x1a6,0x006,0x05d,0x35e,0x303,0x1c5,0x06a,0x262,0x11f,0x06b,0x1f9,0x2dd,0x36d,0x17d,0x264, // 16 - 0x2d3,0x1dc,0x1ce,0x0ac,0x1ae,0x261,0x35a,0x336,0x21f,0x178,0x1ff,0x190,0x2a0,0x2fa,0x11b,0x0b8, // 32 - 0x1b8,0x023,0x207,0x01f,0x1cc,0x252,0x0e1,0x217,0x205,0x160,0x25d,0x09e,0x28b,0x0c9,0x1e8,0x1f6, // 48 - 0x288,0x2dd,0x2cd,0x053,0x194,0x061,0x118,0x303,0x348,0x275,0x004,0x17d,0x34b,0x26f,0x108,0x21f),// 64 - array( // ECL 6 (128 factors) ----------------------------------------------------------------------------- - 0x209,0x136,0x360,0x223,0x35a,0x244,0x128,0x17b,0x035,0x30b,0x381,0x1bc,0x190,0x39d,0x2ed,0x19f, // 16 - 0x336,0x05d,0x0d9,0x0d0,0x3a0,0x0f4,0x247,0x26c,0x0f6,0x094,0x1bf,0x277,0x124,0x38c,0x1ea,0x2c0, // 32 - 0x204,0x102,0x1c9,0x38b,0x252,0x2d3,0x2a2,0x124,0x110,0x060,0x2ac,0x1b0,0x2ae,0x25e,0x35c,0x239, // 48 - 0x0c1,0x0db,0x081,0x0ba,0x0ec,0x11f,0x0c0,0x307,0x116,0x0ad,0x028,0x17b,0x2c8,0x1cf,0x286,0x308, // 64 - 0x0ab,0x1eb,0x129,0x2fb,0x09c,0x2dc,0x05f,0x10e,0x1bf,0x05a,0x1fb,0x030,0x0e4,0x335,0x328,0x382, // 80 - 0x310,0x297,0x273,0x17a,0x17e,0x106,0x17c,0x25a,0x2f2,0x150,0x059,0x266,0x057,0x1b0,0x29e,0x268, // 96 - 0x09d,0x176,0x0f2,0x2d6,0x258,0x10d,0x177,0x382,0x34d,0x1c6,0x162,0x082,0x32e,0x24b,0x324,0x022, // 112 - 0x0d3,0x14a,0x21b,0x129,0x33b,0x361,0x025,0x205,0x342,0x13b,0x226,0x056,0x321,0x004,0x06c,0x21b),// 128 - array( // ECL 7 (256 factors) ----------------------------------------------------------------------------- - 0x20c,0x37e,0x04b,0x2fe,0x372,0x359,0x04a,0x0cc,0x052,0x24a,0x2c4,0x0fa,0x389,0x312,0x08a,0x2d0, // 16 - 0x35a,0x0c2,0x137,0x391,0x113,0x0be,0x177,0x352,0x1b6,0x2dd,0x0c2,0x118,0x0c9,0x118,0x33c,0x2f5, // 32 - 0x2c6,0x32e,0x397,0x059,0x044,0x239,0x00b,0x0cc,0x31c,0x25d,0x21c,0x391,0x321,0x2bc,0x31f,0x089, // 48 - 0x1b7,0x1a2,0x250,0x29c,0x161,0x35b,0x172,0x2b6,0x145,0x0f0,0x0d8,0x101,0x11c,0x225,0x0d1,0x374, // 64 - 0x13b,0x046,0x149,0x319,0x1ea,0x112,0x36d,0x0a2,0x2ed,0x32c,0x2ac,0x1cd,0x14e,0x178,0x351,0x209, // 80 - 0x133,0x123,0x323,0x2c8,0x013,0x166,0x18f,0x38c,0x067,0x1ff,0x033,0x008,0x205,0x0e1,0x121,0x1d6, // 96 - 0x27d,0x2db,0x042,0x0ff,0x395,0x10d,0x1cf,0x33e,0x2da,0x1b1,0x350,0x249,0x088,0x21a,0x38a,0x05a, // 112 - 0x002,0x122,0x2e7,0x0c7,0x28f,0x387,0x149,0x031,0x322,0x244,0x163,0x24c,0x0bc,0x1ce,0x00a,0x086, // 128 - 0x274,0x140,0x1df,0x082,0x2e3,0x047,0x107,0x13e,0x176,0x259,0x0c0,0x25d,0x08e,0x2a1,0x2af,0x0ea, // 144 - 0x2d2,0x180,0x0b1,0x2f0,0x25f,0x280,0x1c7,0x0c1,0x2b1,0x2c3,0x325,0x281,0x030,0x03c,0x2dc,0x26d, // 160 - 0x37f,0x220,0x105,0x354,0x28f,0x135,0x2b9,0x2f3,0x2f4,0x03c,0x0e7,0x305,0x1b2,0x1a5,0x2d6,0x210, // 176 - 0x1f7,0x076,0x031,0x31b,0x020,0x090,0x1f4,0x0ee,0x344,0x18a,0x118,0x236,0x13f,0x009,0x287,0x226, // 192 - 0x049,0x392,0x156,0x07e,0x020,0x2a9,0x14b,0x318,0x26c,0x03c,0x261,0x1b9,0x0b4,0x317,0x37d,0x2f2, // 208 - 0x25d,0x17f,0x0e4,0x2ed,0x2f8,0x0d5,0x036,0x129,0x086,0x036,0x342,0x12b,0x39a,0x0bf,0x38e,0x214, // 224 - 0x261,0x33d,0x0bd,0x014,0x0a7,0x01d,0x368,0x1c1,0x053,0x192,0x029,0x290,0x1f9,0x243,0x1e1,0x0ad, // 240 - 0x194,0x0fb,0x2b0,0x05f,0x1f1,0x22b,0x282,0x21f,0x133,0x09f,0x39c,0x22e,0x288,0x037,0x1f1,0x00a),// 256 - array( // ECL 8 (512 factors) ----------------------------------------------------------------------------- - 0x160,0x04d,0x175,0x1f8,0x023,0x257,0x1ac,0x0cf,0x199,0x23e,0x076,0x1f2,0x11d,0x17c,0x15e,0x1ec, // 16 - 0x0c5,0x109,0x398,0x09b,0x392,0x12b,0x0e5,0x283,0x126,0x367,0x132,0x058,0x057,0x0c1,0x160,0x30d, // 32 - 0x34e,0x04b,0x147,0x208,0x1b3,0x21f,0x0cb,0x29a,0x0f9,0x15a,0x30d,0x26d,0x280,0x10c,0x31a,0x216, // 48 - 0x21b,0x30d,0x198,0x186,0x284,0x066,0x1dc,0x1f3,0x122,0x278,0x221,0x025,0x35a,0x394,0x228,0x029, // 64 - 0x21e,0x121,0x07a,0x110,0x17f,0x320,0x1e5,0x062,0x2f0,0x1d8,0x2f9,0x06b,0x310,0x35c,0x292,0x2e5, // 80 - 0x122,0x0cc,0x2a9,0x197,0x357,0x055,0x063,0x03e,0x1e2,0x0b4,0x014,0x129,0x1c3,0x251,0x391,0x08e, // 96 - 0x328,0x2ac,0x11f,0x218,0x231,0x04c,0x28d,0x383,0x2d9,0x237,0x2e8,0x186,0x201,0x0c0,0x204,0x102, // 112 - 0x0f0,0x206,0x31a,0x18b,0x300,0x350,0x033,0x262,0x180,0x0a8,0x0be,0x33a,0x148,0x254,0x312,0x12f, // 128 - 0x23a,0x17d,0x19f,0x281,0x09c,0x0ed,0x097,0x1ad,0x213,0x0cf,0x2a4,0x2c6,0x059,0x0a8,0x130,0x192, // 144 - 0x028,0x2c4,0x23f,0x0a2,0x360,0x0e5,0x041,0x35d,0x349,0x200,0x0a4,0x1dd,0x0dd,0x05c,0x166,0x311, // 160 - 0x120,0x165,0x352,0x344,0x33b,0x2e0,0x2c3,0x05e,0x008,0x1ee,0x072,0x209,0x002,0x1f3,0x353,0x21f, // 176 - 0x098,0x2d9,0x303,0x05f,0x0f8,0x169,0x242,0x143,0x358,0x31d,0x121,0x033,0x2ac,0x1d2,0x215,0x334, // 192 - 0x29d,0x02d,0x386,0x1c4,0x0a7,0x156,0x0f4,0x0ad,0x023,0x1cf,0x28b,0x033,0x2bb,0x24f,0x1c4,0x242, // 208 - 0x025,0x07c,0x12a,0x14c,0x228,0x02b,0x1ab,0x077,0x296,0x309,0x1db,0x352,0x2fc,0x16c,0x242,0x38f, // 224 - 0x11b,0x2c7,0x1d8,0x1a4,0x0f5,0x120,0x252,0x18a,0x1ff,0x147,0x24d,0x309,0x2bb,0x2b0,0x02b,0x198, // 240 - 0x34a,0x17f,0x2d1,0x209,0x230,0x284,0x2ca,0x22f,0x03e,0x091,0x369,0x297,0x2c9,0x09f,0x2a0,0x2d9, // 256 - 0x270,0x03b,0x0c1,0x1a1,0x09e,0x0d1,0x233,0x234,0x157,0x2b5,0x06d,0x260,0x233,0x16d,0x0b5,0x304, // 272 - 0x2a5,0x136,0x0f8,0x161,0x2c4,0x19a,0x243,0x366,0x269,0x349,0x278,0x35c,0x121,0x218,0x023,0x309, // 288 - 0x26a,0x24a,0x1a8,0x341,0x04d,0x255,0x15a,0x10d,0x2f5,0x278,0x2b7,0x2ef,0x14b,0x0f7,0x0b8,0x02d, // 304 - 0x313,0x2a8,0x012,0x042,0x197,0x171,0x036,0x1ec,0x0e4,0x265,0x33e,0x39a,0x1b5,0x207,0x284,0x389, // 320 - 0x315,0x1a4,0x131,0x1b9,0x0cf,0x12c,0x37c,0x33b,0x08d,0x219,0x17d,0x296,0x201,0x038,0x0fc,0x155, // 336 - 0x0f2,0x31d,0x346,0x345,0x2d0,0x0e0,0x133,0x277,0x03d,0x057,0x230,0x136,0x2f4,0x299,0x18d,0x328, // 352 - 0x353,0x135,0x1d9,0x31b,0x17a,0x01f,0x287,0x393,0x1cb,0x326,0x24e,0x2db,0x1a9,0x0d8,0x224,0x0f9, // 368 - 0x141,0x371,0x2bb,0x217,0x2a1,0x30e,0x0d2,0x32f,0x389,0x12f,0x34b,0x39a,0x119,0x049,0x1d5,0x317, // 384 - 0x294,0x0a2,0x1f2,0x134,0x09b,0x1a6,0x38b,0x331,0x0bb,0x03e,0x010,0x1a9,0x217,0x150,0x11e,0x1b5, // 400 - 0x177,0x111,0x262,0x128,0x0b7,0x39b,0x074,0x29b,0x2ef,0x161,0x03e,0x16e,0x2b3,0x17b,0x2af,0x34a, // 416 - 0x025,0x165,0x2d0,0x2e6,0x14a,0x005,0x027,0x39b,0x137,0x1a8,0x0f2,0x2ed,0x141,0x036,0x29d,0x13c, // 432 - 0x156,0x12b,0x216,0x069,0x29b,0x1e8,0x280,0x2a0,0x240,0x21c,0x13c,0x1e6,0x2d1,0x262,0x02e,0x290, // 448 - 0x1bf,0x0ab,0x268,0x1d0,0x0be,0x213,0x129,0x141,0x2fa,0x2f0,0x215,0x0af,0x086,0x00e,0x17d,0x1b1, // 464 - 0x2cd,0x02d,0x06f,0x014,0x254,0x11c,0x2e0,0x08a,0x286,0x19b,0x36d,0x29d,0x08d,0x397,0x02d,0x30c, // 480 - 0x197,0x0a4,0x14c,0x383,0x0a5,0x2d6,0x258,0x145,0x1f2,0x28f,0x165,0x2f0,0x300,0x0df,0x351,0x287, // 496 - 0x03f,0x136,0x35f,0x0fb,0x16e,0x130,0x11a,0x2e2,0x2a3,0x19a,0x185,0x0f4,0x01f,0x079,0x12f,0x107) // 512 - ); - - /** - * This is the class constructor. - * Creates a PDF417 object - * @param string $code code to represent using PDF417 - * @param int $ecl error correction level (0-8); default -1 = automatic correction level - * @param float $aspectratio the width to height of the symbol (excluding quiet zones) - * òparam array $macro information for macro block - * @access public - */ - public function __construct($code, $ecl=-1, $aspectratio=2, $macro=array()) { - $barcode_array = array(); - if ((is_null($code)) OR ($code == '\0') OR ($code == '')) { - return false; - } - // get the input sequence array - $sequence = $this->getInputSequences($code); - $codewords = array(); // array of code-words - foreach($sequence as $seq) { - $cw = $this->getCompaction($seq[0], $seq[1], true); - $codewords = array_merge($codewords, $cw); - } - if ($codewords[0] == 900) { - // Text Alpha is the default mode, so remove the first code - array_shift($codewords); - } - // count number of codewords - $numcw = count($codewords); - if ($numcw > 925) { - // reached maximum data codeword capacity - return false; - } - // build macro control block codewords - if (!empty($macro)) { - $macrocw = array(); - // beginning of macro control block - $macrocw[] = 928; - // segment index - $cw = $this->getCompaction(902, sprintf('%05d', $macro['segment_index']), false); - $macrocw = array_merge($macrocw, $cw); - // file ID - $cw = $this->getCompaction(900, $macro['file_id'], false); - $macrocw = array_merge($macrocw, $cw); - // optional fields - $optmodes = array(900,902,902,900,900,902,902); - $optsize = array(-1,2,4,-1,-1,-1,2); - foreach ($optmodes as $k => $omode) { - if (isset($macro['option_'.$k])) { - $macrocw[] = 923; - $macrocw[] = $k; - if ($optsize[$k] == 2) { - $macro['option_'.$k] = sprintf('%05d', $macro['option_'.$k]); - } elseif ($optsize[$k] == 4) { - $macro['option_'.$k] = sprintf('%010d', $macro['option_'.$k]); - } - $cw = $this->getCompaction($omode, $macro['option_'.$k], false); - $macrocw = array_merge($macrocw, $cw); - } - } - if ($macro['segment_index'] == ($macro['segment_total'] - 1)) { - // end of control block - $macrocw[] = 922; - } - // update total codewords - $numcw += count($macrocw); - } - // set error correction level - $ecl = $this->getErrorCorrectionLevel($ecl, $numcw); - // number of codewords for error correction - $errsize = (2 << $ecl); - // calculate number of columns (number of codewords per row) and rows - $nce = ($numcw + $errsize + 1); - $cols = round((sqrt(4761 + (68 * $aspectratio * ROWHEIGHT * $nce)) - 69) / 34); - // adjust cols - if ($cols < 1) { - $cols = 1; - } elseif ($cols > 30) { - $cols = 30; - } - $rows = ceil($nce / $cols); - $size = ($cols * $rows); - // adjust rows - if (($rows < 3) OR ($rows > 90)) { - if ($rows < 3) { - $rows = 3; - } elseif ($rows > 90) { - $rows = 90; - } - $cols = ceil($size / $rows); - $size = ($cols * $rows); - } - if ($size > 928) { - // set dimensions to get maximum capacity - if (abs($aspectratio - (17 * 29 / 32)) < abs($aspectratio - (17 * 16 / 58))) { - $cols = 29; - $rows = 32; - } else { - $cols = 16; - $rows = 58; - } - $size = 928; - } - // calculate padding - $pad = ($size - $nce); - if ($pad > 0) { - if (($size - $rows) == $nce) { - --$rows; - $size -= $rows; - } else { - // add pading - $codewords = array_merge($codewords, array_fill(0, $pad, 900)); - } - } - if (!empty($macro)) { - // add macro section - $codewords = array_merge($codewords, $macrocw); - } - // Symbol Lenght Descriptor (number of data codewords including Symbol Lenght Descriptor and pad codewords) - $sld = $size - $errsize; - // add symbol length description - array_unshift($codewords, $sld); - // calculate error correction - $ecw = $this->getErrorCorrection($codewords, $ecl); - // add error correction codewords - $codewords = array_merge($codewords, $ecw); - // add horizontal quiet zones to start and stop patterns - $pstart = str_repeat('0', QUIETH).$this->start_pattern; - $pstop = $this->stop_pattern.str_repeat('0', QUIETH); - $barcode_array['num_rows'] = ($rows * ROWHEIGHT) + (2 * QUIETV); - $barcode_array['num_cols'] = (($cols + 2) * 17) + 35 + (2 * QUIETH); - $barcode_array['bcode'] = array(); - // build rows for vertical quiet zone - if (QUIETV > 0) { - $empty_row = array_fill(0, $barcode_array['num_cols'], 0); - for ($i = 0; $i < QUIETV; ++$i) { - // add vertical quiet rows - $barcode_array['bcode'][] = $empty_row; - } - } - $k = 0; // codeword index - $cid = 0; // initial cluster - // for each row - for ($r = 0; $r < $rows; ++$r) { - // row start code - $row = $pstart; - switch ($cid) { - case 0: { - $L = ((30 * intval($r / 3)) + intval(($rows - 1) / 3)); - break; - } - case 1: { - $L = ((30 * intval($r / 3)) + ($ecl * 3) + (($rows - 1) % 3)); - break; - } - case 2: { - $L = ((30 * intval($r / 3)) + ($cols - 1)); - break; - } - } - // left row indicator - $row .= sprintf('%17b', $this->clusters[$cid][$L]); - // for each column - for ($c = 0; $c < $cols; ++$c) { - $row .= sprintf('%17b', $this->clusters[$cid][$codewords[$k]]); - ++$k; - } - switch ($cid) { - case 0: { - $L = ((30 * intval($r / 3)) + ($cols - 1)); - break; - } - case 1: { - $L = ((30 * intval($r / 3)) + intval(($rows - 1) / 3)); - break; - } - case 2: { - $L = ((30 * intval($r / 3)) + ($ecl * 3) + (($rows - 1) % 3)); - break; - } - } - // right row indicator - $row .= sprintf('%17b', $this->clusters[$cid][$L]); - // row stop code - $row .= $pstop; - // convert the string to array - $arow = preg_split('//', $row, -1, PREG_SPLIT_NO_EMPTY); - // duplicate row to get the desired height - for ($h = 0; $h < ROWHEIGHT; ++$h) { - $barcode_array['bcode'][] = $arow; - } - ++$cid; - if ($cid > 2) { - $cid = 0; - } - } - if (QUIETV > 0) { - for ($i = 0; $i < QUIETV; ++$i) { - // add vertical quiet rows - $barcode_array['bcode'][] = $empty_row; - } - } - $this->barcode_array = $barcode_array; - } - - /** - * Returns a barcode array which is readable by TCPDF - * @return array barcode array readable by TCPDF; - * @access public - */ - public function getBarcodeArray() { - return $this->barcode_array; - } - - /** - * Returns the error correction level (0-8) to be used - * @param int $ecl error correction level - * @param int $numcw number of data codewords - * @return int error correction level - * @access protected - */ - protected function getErrorCorrectionLevel($ecl, $numcw) { - // get maximum correction level - $maxecl = 8; // starting error level - $maxerrsize = (928 - $numcw); // available codewords for error - while ($maxecl > 0) { - $errsize = (2 << $ecl); - if ($maxerrsize >= $errsize) { - break; - } - --$maxecl; - } - // check for automatic levels - if (($ecl < 0) OR ($ecl > 8)) { - if ($numcw < 41) { - $ecl = 2; - } elseif ($numcw < 161) { - $ecl = 3; - } elseif ($numcw < 321) { - $ecl = 4; - } elseif ($numcw < 864) { - $ecl = 5; - } else { - $ecl = $maxecl; - } - } - if ($ecl > $maxecl) { - $ecl = $maxecl; - } - return $ecl; - } - - /** - * Returns the error correction codewords - * @param array $cw array of codewords including Symbol Lenght Descriptor and pad - * @param int $ecl error correction level 0-8 - * @return array of error correction codewords - * @access protected - */ - protected function getErrorCorrection($cw, $ecl) { - // get error correction coefficients - $ecc = $this->rsfactors[$ecl]; - // number of error correction factors - $eclsize = (2 << $ecl); - // maximum index for $rsfactors[$ecl] - $eclmaxid = ($eclsize - 1); - // initialize array of error correction codewords - $ecw = array_fill(0, $eclsize, 0); - // for each data codeword - foreach($cw as $k => $d) { - $t1 = ($d + $ecw[$eclmaxid]) % 929; - for ($j = $eclmaxid; $j > 0; --$j) { - $t2 = ($t1 * $ecc[$j]) % 929; - $t3 = 929 - $t2; - $ecw[$j] = ($ecw[($j - 1)] + $t3) % 929; - } - $t2 = ($t1 * $ecc[0]) % 929; - $t3 = 929 - $t2; - $ecw[0] = $t3 % 929; - } - foreach($ecw as $j => $e) { - if ($e != 0) { - $ecw[$j] = 929 - $e; - } - } - $ecw = array_reverse($ecw); - return $ecw; - } - - /** - * Create array of sequences from input - * @param string $code code - * @return bidimensional array containing characters and classification - * @access protected - */ - protected function getInputSequences($code) { - $sequence_array = array(); // array to be returned - $numseq = array(); - // get numeric sequences - preg_match_all('/([0-9]{13,})/', $code, $numseq, PREG_OFFSET_CAPTURE); - $numseq[1][] = array('', strlen($code)); - $offset = 0; - foreach($numseq[1] as $seq) { - $seqlen = strlen($seq[0]); - if ($seq[1] > 0) { - // extract text sequence before the number sequence - $prevseq = substr($code, $offset, ($seq[1] - $offset)); - $textseq = array(); - // get text sequences - preg_match_all('/([\x09\x0a\x0d\x20-\x7e]{5,})/', $prevseq, $textseq, PREG_OFFSET_CAPTURE); - $textseq[1][] = array('', strlen($prevseq)); - $txtoffset = 0; - foreach($textseq[1] as $txtseq) { - $txtseqlen = strlen($txtseq[0]); - if ($txtseq[1] > 0) { - // extract byte sequence before the text sequence - $prevtxtseq = substr($prevseq, $txtoffset, ($txtseq[1] - $txtoffset)); - if (strlen($prevtxtseq) > 0) { - // add BYTE sequence - if ((strlen($prevtxtseq) == 1) AND ((count($sequence_array) > 0) AND ($sequence_array[(count($sequence_array) - 1)][0] == 900))) { - $sequence_array[] = array(913, $prevtxtseq); - } elseif ((strlen($prevtxtseq) % 6) == 0) { - $sequence_array[] = array(924, $prevtxtseq); - } else { - $sequence_array[] = array(901, $prevtxtseq); - } - } - } - if ($txtseqlen > 0) { - // add numeric sequence - $sequence_array[] = array(900, $txtseq[0]); - } - $txtoffset = $txtseq[1] + $txtseqlen; - } - } - if ($seqlen > 0) { - // add numeric sequence - $sequence_array[] = array(902, $seq[0]); - } - $offset = $seq[1] + $seqlen; - } - return $sequence_array; - } - - /** - * Compact data by mode. - * @param int $mode compaction mode number - * @param string $code data to compact - * @param boolean $addmode if true add the mode codeword at first position - * @return array of codewords - * @access protected - */ - protected function getCompaction($mode, $code, $addmode=true) { - $cw = array(); // array of codewords to return - switch($mode) { - case 900: { // Text Compaction mode latch - $submode = 0; // default Alpha sub-mode - $txtarr = array(); // array of characters and sub-mode switching characters - $codelen = strlen($code); - for ($i = 0; $i < $codelen; ++$i) { - $chval = ord($code{$i}); - if (($k = array_search($chval, $this->textsubmodes[$submode])) !== false) { - // we are on the same sub-mode - $txtarr[] = $k; - } else { - // the sub-mode is changed - for ($s = 0; $s < 4; ++$s) { - // search new sub-mode - if (($s != $submode) AND (($k = array_search($chval, $this->textsubmodes[$s])) !== false)) { - // $s is the new submode - if (((($i + 1) == $codelen) OR ((($i + 1) < $codelen) AND (array_search(ord($code{($i + 1)}), $this->textsubmodes[$submode]) !== false))) AND (($s == 3) OR (($s == 0) AND ($submode == 1)))) { - // shift (temporary change only for this char) - if ($s == 3) { - // shift to puntuaction - $txtarr[] = 29; - } else { - // shift from lower to alpha - $txtarr[] = 27; - } - } else { - // latch - $txtarr = array_merge($txtarr, $this->textlatch[''.$submode.$s]); - // set new submode - $submode = $s; - } - // add characted code to array - $txtarr[] = $k; - break; - } - } - } - } - $txtarrlen = count($txtarr); - if (($txtarrlen % 2) != 0) { - // add padding - $txtarr[] = 29; - ++$txtarrlen; - } - // calculate codewords - for ($i = 0; $i < $txtarrlen; $i += 2) { - $cw[] = (30 * $txtarr[$i]) + $txtarr[($i + 1)]; - } - break; - } - case 901: - case 924: { // Byte Compaction mode latch - while (($codelen = strlen($code)) > 0) { - if ($codelen > 6) { - $rest = substr($code, 6); - $code = substr($code, 0, 6); - $sublen = 6; - } else { - $rest = ''; - $sublen = strlen($code); - } - if ($sublen == 6) { - $t = bcmul(''.ord($code{0}), '1099511627776'); - $t = bcadd($t, bcmul(''.ord($code{1}), '4294967296')); - $t = bcadd($t, bcmul(''.ord($code{2}), '16777216')); - $t = bcadd($t, bcmul(''.ord($code{3}), '65536')); - $t = bcadd($t, bcmul(''.ord($code{4}), '256')); - $t = bcadd($t, ''.ord($code{5})); - do { - $d = bcmod($t, '900'); - $t = bcdiv($t, '900'); - array_unshift($cw, $d); - } while ($t != '0'); - } else { - for ($i = 0; $i < $sublen; ++$i) { - $cw[] = ord($code{$i}); - } - } - $code = $rest; - } - break; - } - case 902: { // Numeric Compaction mode latch - while (($codelen = strlen($code)) > 0) { - if ($codelen > 44) { - $rest = substr($code, 44); - $code = substr($code, 0, 44); - } else { - $rest = ''; - } - $t = '1'.$code; - do { - $d = bcmod($t, '900'); - $t = bcdiv($t, '900'); - array_unshift($cw, $d); - } while ($t != '0'); - $code = $rest; - } - break; - } - case 913: { // Byte Compaction mode shift - $cw[] = ord($code); - break; - } - } - if ($addmode) { - // add the compaction mode codeword at the beginning - array_unshift($cw, $mode); - } - return $cw; - } - - } // end PDF417 class - -} // END OF "class_exists PDF417" -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/tcpdf/qrcode.php b/include/limesurvey/admin/classes/tcpdf/qrcode.php deleted file mode 100644 index 636b07e8..00000000 --- a/include/limesurvey/admin/classes/tcpdf/qrcode.php +++ /dev/null @@ -1,2879 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -// ------------------------------------------------------------------- -// -// DESCRIPTION : -// -// Class to create QR-code arrays for TCPDF class. -// QR Code symbol is a 2D barcode that can be scanned by -// handy terminals such as a mobile phone with CCD. -// The capacity of QR Code is up to 7000 digits or 4000 -// characters, and has high robustness. -// This class supports QR Code model 2, described in -// JIS (Japanese Industrial Standards) X0510:2004 -// or ISO/IEC 18004. -// Currently the following features are not supported: -// ECI and FNC1 mode, Micro QR Code, QR Code model 1, -// Structured mode. -// -// This class is derived from the following projects: -// --------------------------------------------------------- -// "PHP QR Code encoder" -// License: GNU-LGPLv3 -// Copyright (C) 2010 by Dominik Dzienia -// http://phpqrcode.sourceforge.net/ -// https://sourceforge.net/projects/phpqrcode/ -// -// The "PHP QR Code encoder" is based on -// "C libqrencode library" (ver. 3.1.1) -// License: GNU-LGPL 2.1 -// Copyright (C) 2006-2010 by Kentaro Fukuchi -// http://megaui.net/fukuchi/works/qrencode/index.en.html -// -// Reed-Solomon code encoder is written by Phil Karn, KA9Q. -// Copyright (C) 2002-2006 Phil Karn, KA9Q -// -// QR Code is registered trademark of DENSO WAVE INCORPORATED -// http://www.denso-wave.com/qrcode/index-e.html -// --------------------------------------------------------- -//============================================================+ - -/** - * Class to create QR-code arrays for TCPDF class. - * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. - * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. - * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. - * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. - * - * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). - * Please read comments on this class source file for full copyright and license information. - * - * @package com.tecnick.tcpdf - * @abstract Class for generating QR-code array for TCPDF. - * @author Nicola Asuni - * @copyright 2010-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @version 1.0.006 - */ - -// definitions -if (!defined('QRCODEDEFS')) { - - /** - * Indicate that definitions for this class are set - */ - define('QRCODEDEFS', true); - - // ----------------------------------------------------- - - // Encoding modes (characters which can be encoded in QRcode) - - /** - * Encoding mode - */ - define('QR_MODE_NL', -1); - - /** - * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode. - */ - define('QR_MODE_NM', 0); - - /** - * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode. - */ - define('QR_MODE_AN', 1); - - /** - * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode. - */ - define('QR_MODE_8B', 2); - - /** - * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode. - */ - define('QR_MODE_KJ', 3); - - /** - * Encoding mode STRUCTURED (currently unsupported) - */ - define('QR_MODE_ST', 4); - - // ----------------------------------------------------- - - // Levels of error correction. - // QRcode has a function of an error correcting for miss reading that white is black. - // Error correcting is defined in 4 level as below. - - /** - * Error correction level L : About 7% or less errors can be corrected. - */ - define('QR_ECLEVEL_L', 0); - - /** - * Error correction level M : About 15% or less errors can be corrected. - */ - define('QR_ECLEVEL_M', 1); - - /** - * Error correction level Q : About 25% or less errors can be corrected. - */ - define('QR_ECLEVEL_Q', 2); - - /** - * Error correction level H : About 30% or less errors can be corrected. - */ - define('QR_ECLEVEL_H', 3); - - // ----------------------------------------------------- - - // Version. Size of QRcode is defined as version. - // Version is from 1 to 40. - // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. - // So version 40 is 177*177 matrix. - - /** - * Maximum QR Code version. - */ - define('QRSPEC_VERSION_MAX', 40); - - /** - * Maximum matrix size for maximum version (version 40 is 177*177 matrix). - */ - define('QRSPEC_WIDTH_MAX', 177); - - // ----------------------------------------------------- - - /** - * Matrix index to get width from $capacity array. - */ - define('QRCAP_WIDTH', 0); - - /** - * Matrix index to get number of words from $capacity array. - */ - define('QRCAP_WORDS', 1); - - /** - * Matrix index to get remainder from $capacity array. - */ - define('QRCAP_REMINDER', 2); - - /** - * Matrix index to get error correction level from $capacity array. - */ - define('QRCAP_EC', 3); - - // ----------------------------------------------------- - - // Structure (currently usupported) - - /** - * Number of header bits for structured mode - */ - define('STRUCTURE_HEADER_BITS', 20); - - /** - * Max number of symbols for structured mode - */ - define('MAX_STRUCTURED_SYMBOLS', 16); - - // ----------------------------------------------------- - - // Masks - - /** - * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column) - */ - define('N1', 3); - - /** - * Down point base value for case 2 mask pattern (module block of same color) - */ - define('N2', 3); - - /** - * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column) - */ - define('N3', 40); - - /** - * Down point base value for case 4 mask pattern (ration of dark modules in whole) - */ - define('N4', 10); - - // ----------------------------------------------------- - - // Optimization settings - - /** - * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code - */ - define('QR_FIND_BEST_MASK', true); - - /** - * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly - */ - define('QR_FIND_FROM_RANDOM', 2); - - /** - * when QR_FIND_BEST_MASK === false - */ - define('QR_DEFAULT_MASK', 2); - - // ----------------------------------------------------- - -} // end of definitions - -// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# - -if (!class_exists('QRcode', false)) { - - // for compatibility with PHP4 - if (!function_exists('str_split')) { - /** - * Convert a string to an array (needed for PHP4 compatibility) - * @param string $string The input string. - * @param int $split_length Maximum length of the chunk. - * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element. - */ - function str_split($string, $split_length=1) { - if ((strlen($string) > $split_length) OR (!$split_length)) { - do { - $c = strlen($string); - $parts[] = substr($string, 0, $split_length); - $string = substr($string, $split_length); - } while ($string !== false); - } else { - $parts = array($string); - } - return $parts; - } - } - - // ##################################################### - - /** - * Class to create QR-code arrays for TCPDF class. - * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. - * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. - * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. - * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. - * - * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). - * Please read comments on this class source file for full copyright and license information. - * - * @name QRcode - * @package com.tecnick.tcpdf - * @abstract Class for generating QR-code array for TCPDF. - * @author Nicola Asuni - * @copyright 2010-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @version 1.0.006 - */ - class QRcode { - - /** - * @var barcode array to be returned which is readable by TCPDF - * @access protected - */ - protected $barcode_array = array(); - - /** - * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix. - * @access protected - */ - protected $version = 0; - - /** - * @var Levels of error correction. See definitions for possible values. - * @access protected - */ - protected $level = QR_ECLEVEL_L; - - /** - * @var Encoding mode - * @access protected - */ - protected $hint = QR_MODE_8B; - - /** - * @var if true the input string will be converted to uppercase - * @access protected - */ - protected $casesensitive = true; - - /** - * @var structured QR code (not supported yet) - * @access protected - */ - protected $structured = 0; - - /** - * @var mask data - * @access protected - */ - protected $data; - - // FrameFiller - - /** - * @var width - * @access protected - */ - protected $width; - - /** - * @var frame - * @access protected - */ - protected $frame; - - /** - * @var X position of bit - * @access protected - */ - protected $x; - - /** - * @var Y position of bit - * @access protected - */ - protected $y; - - /** - * @var direction - * @access protected - */ - protected $dir; - - /** - * @var single bit - * @access protected - */ - protected $bit; - - // ---- QRrawcode ---- - - /** - * @var data code - * @access protected - */ - protected $datacode = array(); - - /** - * @var error correction code - * @access protected - */ - protected $ecccode = array(); - - /** - * @var blocks - * @access protected - */ - protected $blocks; - - /** - * @var Reed-Solomon blocks - * @access protected - */ - protected $rsblocks = array(); //of RSblock - - /** - * @var counter - * @access protected - */ - protected $count; - - /** - * @var data length - * @access protected - */ - protected $dataLength; - - /** - * @var error correction length - * @access protected - */ - protected $eccLength; - - /** - * @var b1 - * @access protected - */ - protected $b1; - - // ---- QRmask ---- - - /** - * @var run length - * @access protected - */ - protected $runLength = array(); - - // ---- QRsplit ---- - - /** - * @var input data string - * @access protected - */ - protected $dataStr = ''; - - /** - * @var input items - * @access protected - */ - protected $items; - - // Reed-Solomon items - - /** - * @var Reed-Solomon items - * @access protected - */ - protected $rsitems = array(); - - /** - * @var array of frames - * @access protected - */ - protected $frames = array(); - - /** - * @var alphabet-numeric convesion table - * @access protected - */ - protected $anTable = array( - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // - 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // - ); - - /** - * @var array Table of the capacity of symbols - * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004. - * @access protected - */ - protected $capacity = array( - array( 0, 0, 0, array( 0, 0, 0, 0)), // - array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 - array( 25, 44, 7, array( 10, 16, 22, 28)), // - array( 29, 70, 7, array( 15, 26, 36, 44)), // - array( 33, 100, 7, array( 20, 36, 52, 64)), // - array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 - array( 41, 172, 7, array( 36, 64, 96, 112)), // - array( 45, 196, 0, array( 40, 72, 108, 130)), // - array( 49, 242, 0, array( 48, 88, 132, 156)), // - array( 53, 292, 0, array( 60, 110, 160, 192)), // - array( 57, 346, 0, array( 72, 130, 192, 224)), // 10 - array( 61, 404, 0, array( 80, 150, 224, 264)), // - array( 65, 466, 0, array( 96, 176, 260, 308)), // - array( 69, 532, 0, array( 104, 198, 288, 352)), // - array( 73, 581, 3, array( 120, 216, 320, 384)), // - array( 77, 655, 3, array( 132, 240, 360, 432)), // 15 - array( 81, 733, 3, array( 144, 280, 408, 480)), // - array( 85, 815, 3, array( 168, 308, 448, 532)), // - array( 89, 901, 3, array( 180, 338, 504, 588)), // - array( 93, 991, 3, array( 196, 364, 546, 650)), // - array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20 - array(101, 1156, 4, array( 224, 442, 644, 750)), // - array(105, 1258, 4, array( 252, 476, 690, 816)), // - array(109, 1364, 4, array( 270, 504, 750, 900)), // - array(113, 1474, 4, array( 300, 560, 810, 960)), // - array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25 - array(121, 1706, 4, array( 336, 644, 952, 1110)), // - array(125, 1828, 4, array( 360, 700, 1020, 1200)), // - array(129, 1921, 3, array( 390, 728, 1050, 1260)), // - array(133, 2051, 3, array( 420, 784, 1140, 1350)), // - array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30 - array(141, 2323, 3, array( 480, 868, 1290, 1530)), // - array(145, 2465, 3, array( 510, 924, 1350, 1620)), // - array(149, 2611, 3, array( 540, 980, 1440, 1710)), // - array(153, 2761, 3, array( 570, 1036, 1530, 1800)), // - array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35 - array(161, 3034, 0, array( 600, 1120, 1680, 1980)), // - array(165, 3196, 0, array( 630, 1204, 1770, 2100)), // - array(169, 3362, 0, array( 660, 1260, 1860, 2220)), // - array(173, 3532, 0, array( 720, 1316, 1950, 2310)), // - array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40 - ); - - /** - * @var array Length indicator - * @access protected - */ - protected $lengthTableBits = array( - array(10, 12, 14), - array( 9, 11, 13), - array( 8, 16, 16), - array( 8, 10, 12) - ); - - /** - * @var array Table of the error correction code (Reed-Solomon block) - * See Table 12-16 (pp.30-36), JIS X0510:2004. - * @access protected - */ - protected $eccTable = array( - array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), // - array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 - array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // - array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), // - array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), // - array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 - array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), // - array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), // - array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), // - array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), // - array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10 - array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), // - array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), // - array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), // - array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), // - array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15 - array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), // - array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), // - array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), // - array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), // - array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20 - array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), // - array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), // - array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), // - array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), // - array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25 - array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), // - array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), // - array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), // - array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), // - array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30 - array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), // - array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), // - array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), // - array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), // - array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35 - array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), // - array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), // - array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), // - array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), // - array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40 - ); - - /** - * @var array Positions of alignment patterns. - * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them. - * See Table 1 in Appendix E (pp.71) of JIS X0510:2004. - * @access protected - */ - protected $alignmentPattern = array( - array( 0, 0), - array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 - array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 - array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15 - array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20 - array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25 - array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30 - array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35 - array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40 - ); - - /** - * @var array Version information pattern (BCH coded). - * See Table 1 in Appendix D (pp.68) of JIS X0510:2004. - * size: [QRSPEC_VERSION_MAX - 6] - * @access protected - */ - protected $versionPattern = array( - 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, // - 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, // - 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, // - 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, // - 0x27541, 0x28c69 - ); - - /** - * @var array Format information - * @access protected - */ - protected $formatInfo = array( - array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), // - array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), // - array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), // - array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) // - ); - - - // ------------------------------------------------- - // ------------------------------------------------- - - - /** - * This is the class constructor. - * Creates a QRcode object - * @param string $code code to represent using QRcode - * @param string $eclevel error level:
    • L : About 7% or less errors can be corrected.
    • M : About 15% or less errors can be corrected.
    • Q : About 25% or less errors can be corrected.
    • H : About 30% or less errors can be corrected.
    - * @access public - * @since 1.0.000 - */ - public function __construct($code, $eclevel = 'L') { - $barcode_array = array(); - if ((is_null($code)) OR ($code == '\0') OR ($code == '')) { - return false; - } - // set error correction level - $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H')); - if ($this->level === false) { - $this->level = QR_ECLEVEL_L; - } - if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) { - return false; - } - if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) { - return false; - } - $this->items = array(); - $this->encodeString($code); - if (is_null($this->data)) { - return false; - } - $qrTab = $this->binarize($this->data); - $size = count($qrTab); - $barcode_array['num_rows'] = $size; - $barcode_array['num_cols'] = $size; - $barcode_array['bcode'] = array(); - foreach ($qrTab as $line) { - $arrAdd = array(); - foreach (str_split($line) as $char) { - $arrAdd[] = ($char=='1')?1:0; - } - $barcode_array['bcode'][] = $arrAdd; - } - $this->barcode_array = $barcode_array; - } - - /** - * Returns a barcode array which is readable by TCPDF - * @return array barcode array readable by TCPDF; - * @access public - */ - public function getBarcodeArray() { - return $this->barcode_array; - } - - /** - * Convert the frame in binary form - * @param array $frame array to binarize - * @return array frame in binary form - */ - protected function binarize($frame) { - $len = count($frame); - // the frame is square (width = height) - foreach ($frame as &$frameLine) { - for ($i=0; $i<$len; $i++) { - $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; - } - } - return $frame; - } - - /** - * Encode the input string to QR code - * @param string $string input string to encode - */ - protected function encodeString($string) { - $this->dataStr = $string; - if (!$this->casesensitive) { - $this->toUpper(); - } - $ret = $this->splitString(); - if ($ret < 0) { - return NULL; - } - $this->encodeMask(-1); - } - - /** - * Encode mask - * @param int $mask masking mode - */ - protected function encodeMask($mask) { - $spec = array(0, 0, 0, 0, 0); - $this->datacode = $this->getByteStream($this->items); - if (is_null($this->datacode)) { - return NULL; - } - $spec = $this->getEccSpec($this->version, $this->level, $spec); - $this->b1 = $this->rsBlockNum1($spec); - $this->dataLength = $this->rsDataLength($spec); - $this->eccLength = $this->rsEccLength($spec); - $this->ecccode = array_fill(0, $this->eccLength, 0); - $this->blocks = $this->rsBlockNum($spec); - $ret = $this->init($spec); - if ($ret < 0) { - return NULL; - } - $this->count = 0; - $this->width = $this->getWidth($this->version); - $this->frame = $this->newFrame($this->version); - $this->x = $this->width - 1; - $this->y = $this->width - 1; - $this->dir = -1; - $this->bit = -1; - // inteleaved data and ecc codes - for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) { - $code = $this->getCode(); - $bit = 0x80; - for ($j=0; $j<8; $j++) { - $addr = $this->getNextPosition(); - $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); - $bit = $bit >> 1; - } - } - // remainder bits - $j = $this->getRemainder($this->version); - for ($i=0; $i<$j; $i++) { - $addr = $this->getNextPosition(); - $this->setFrameAt($addr, 0x02); - } - // masking - $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); - if ($mask < 0) { - if (QR_FIND_BEST_MASK) { - $masked = $this->mask($this->width, $this->frame, $this->level); - } else { - $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level); - } - } else { - $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level); - } - if ($masked == NULL) { - return NULL; - } - $this->data = $masked; - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // FrameFiller - - /** - * Set frame value at specified position - * @param array $at x,y position - * @param int $val value of the character to set - */ - protected function setFrameAt($at, $val) { - $this->frame[$at['y']][$at['x']] = chr($val); - } - - /** - * Get frame value at specified position - * @param array $at x,y position - * @return value at specified position - */ - protected function getFrameAt($at) { - return ord($this->frame[$at['y']][$at['x']]); - } - - /** - * Return the next frame position - * @return array of x,y coordinates - */ - protected function getNextPosition() { - do { - if ($this->bit == -1) { - $this->bit = 0; - return array('x'=>$this->x, 'y'=>$this->y); - } - $x = $this->x; - $y = $this->y; - $w = $this->width; - if ($this->bit == 0) { - $x--; - $this->bit++; - } else { - $x++; - $y += $this->dir; - $this->bit--; - } - if ($this->dir < 0) { - if ($y < 0) { - $y = 0; - $x -= 2; - $this->dir = 1; - if ($x == 6) { - $x--; - $y = 9; - } - } - } else { - if ($y == $w) { - $y = $w - 1; - $x -= 2; - $this->dir = -1; - if ($x == 6) { - $x--; - $y -= 8; - } - } - } - if (($x < 0) OR ($y < 0)) { - return NULL; - } - $this->x = $x; - $this->y = $y; - } while(ord($this->frame[$y][$x]) & 0x80); - return array('x'=>$x, 'y'=>$y); - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRrawcode - - /** - * Initialize code. - * @param array $spec array of ECC specification - * @return 0 in case of success, -1 in case of error - */ - protected function init($spec) { - $dl = $this->rsDataCodes1($spec); - $el = $this->rsEccCodes1($spec); - $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); - $blockNo = 0; - $dataPos = 0; - $eccPos = 0; - $endfor = $this->rsBlockNum1($spec); - for ($i=0; $i < $endfor; ++$i) { - $ecc = array_slice($this->ecccode, $eccPos); - $this->rsblocks[$blockNo] = array(); - $this->rsblocks[$blockNo]['dataLength'] = $dl; - $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); - $this->rsblocks[$blockNo]['eccLength'] = $el; - $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); - $this->rsblocks[$blockNo]['ecc'] = $ecc; - $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); - $dataPos += $dl; - $eccPos += $el; - $blockNo++; - } - if ($this->rsBlockNum2($spec) == 0) { - return 0; - } - $dl = $this->rsDataCodes2($spec); - $el = $this->rsEccCodes2($spec); - $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); - if ($rs == NULL) { - return -1; - } - $endfor = $this->rsBlockNum2($spec); - for ($i=0; $i < $endfor; ++$i) { - $ecc = array_slice($this->ecccode, $eccPos); - $this->rsblocks[$blockNo] = array(); - $this->rsblocks[$blockNo]['dataLength'] = $dl; - $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); - $this->rsblocks[$blockNo]['eccLength'] = $el; - $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); - $this->rsblocks[$blockNo]['ecc'] = $ecc; - $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc); - $dataPos += $dl; - $eccPos += $el; - $blockNo++; - } - return 0; - } - - /** - * Return Reed-Solomon block code. - * @return array rsblocks - */ - protected function getCode() { - if ($this->count < $this->dataLength) { - $row = $this->count % $this->blocks; - $col = $this->count / $this->blocks; - if ($col >= $this->rsblocks[0]['dataLength']) { - $row += $this->b1; - } - $ret = $this->rsblocks[$row]['data'][$col]; - } elseif ($this->count < $this->dataLength + $this->eccLength) { - $row = ($this->count - $this->dataLength) % $this->blocks; - $col = ($this->count - $this->dataLength) / $this->blocks; - $ret = $this->rsblocks[$row]['ecc'][$col]; - } else { - return 0; - } - $this->count++; - return $ret; - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRmask - - /** - * Write Format Information on frame and returns the number of black bits - * @param int $width frame width - * @param array $frame frame - * @param array $mask masking mode - * @param int $level error correction level - * @return int blacks - */ - protected function writeFormatInformation($width, &$frame, $mask, $level) { - $blacks = 0; - $format = $this->getFormatInfo($mask, $level); - for ($i=0; $i<8; ++$i) { - if ($format & 1) { - $blacks += 2; - $v = 0x85; - } else { - $v = 0x84; - } - $frame[8][$width - 1 - $i] = chr($v); - if ($i < 6) { - $frame[$i][8] = chr($v); - } else { - $frame[$i + 1][8] = chr($v); - } - $format = $format >> 1; - } - for ($i=0; $i<7; ++$i) { - if ($format & 1) { - $blacks += 2; - $v = 0x85; - } else { - $v = 0x84; - } - $frame[$width - 7 + $i][8] = chr($v); - if ($i == 0) { - $frame[8][7] = chr($v); - } else { - $frame[8][6 - $i] = chr($v); - } - $format = $format >> 1; - } - return $blacks; - } - - /** - * mask0 - * @param int $x X position - * @param int $y Y position - * @return int mask - */ - protected function mask0($x, $y) { - return ($x + $y) & 1; - } - - /** - * mask1 - * @param int $x X position - * @param int $y Y position - * @return int mask - */ - protected function mask1($x, $y) { - return ($y & 1); - } - - /** - * mask2 - * @param int $x X position - * @param int $y Y position - * @return int mask - */ - protected function mask2($x, $y) { - return ($x % 3); - } - - /** - * mask3 - * @param int $x X position - * @param int $y Y position - * @return int mask - */ - protected function mask3($x, $y) { - return ($x + $y) % 3; - } - - /** - * mask4 - * @param int $x X position - * @param int $y Y position - * @return int mask - */ - protected function mask4($x, $y) { - return (((int)($y / 2)) + ((int)($x / 3))) & 1; - } - - /** - * mask5 - * @param int $x X position - * @param int $y Y position - * @return int mask - */ - protected function mask5($x, $y) { - return (($x * $y) & 1) + ($x * $y) % 3; - } - - /** - * mask6 - * @param int $x X position - * @param int $y Y position - * @return int mask - */ - protected function mask6($x, $y) { - return ((($x * $y) & 1) + ($x * $y) % 3) & 1; - } - - /** - * mask7 - * @param int $x X position - * @param int $y Y position - * @return int mask - */ - protected function mask7($x, $y) { - return ((($x * $y) % 3) + (($x + $y) & 1)) & 1; - } - - /** - * Return bitmask - * @param int $maskNo mask number - * @param int $width width - * @param array $frame frame - * @return array bitmask - */ - protected function generateMaskNo($maskNo, $width, $frame) { - $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); - for ($y=0; $y<$width; ++$y) { - for ($x=0; $x<$width; ++$x) { - if (ord($frame[$y][$x]) & 0x80) { - $bitMask[$y][$x] = 0; - } else { - $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); - $bitMask[$y][$x] = ($maskFunc == 0)?1:0; - } - } - } - return $bitMask; - } - - /** - * makeMaskNo - * @param int $maskNo - * @param int $width - * @param int $s - * @param int $d - * @param boolean $maskGenOnly - * @return int b - */ - protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) { - $b = 0; - $bitMask = array(); - $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); - if ($maskGenOnly) { - return; - } - $d = $s; - for ($y=0; $y<$width; ++$y) { - for ($x=0; $x<$width; ++$x) { - if ($bitMask[$y][$x] == 1) { - $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); - } - $b += (int)(ord($d[$y][$x]) & 1); - } - } - return $b; - } - - /** - * makeMask - * @param int $width - * @param array $frame - * @param int $maskNo - * @param int $level - * @return array mask - */ - protected function makeMask($width, $frame, $maskNo, $level) { - $masked = array_fill(0, $width, str_repeat("\0", $width)); - $this->makeMaskNo($maskNo, $width, $frame, $masked); - $this->writeFormatInformation($width, $masked, $maskNo, $level); - return $masked; - } - - /** - * calcN1N3 - * @param int $length - * @return int demerit - */ - protected function calcN1N3($length) { - $demerit = 0; - for ($i=0; $i<$length; ++$i) { - if ($this->runLength[$i] >= 5) { - $demerit += (N1 + ($this->runLength[$i] - 5)); - } - if ($i & 1) { - if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) { - $fact = (int)($this->runLength[$i] / 3); - if (($this->runLength[$i-2] == $fact) - AND ($this->runLength[$i-1] == $fact) - AND ($this->runLength[$i+1] == $fact) - AND ($this->runLength[$i+2] == $fact)) { - if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) { - $demerit += N3; - } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) { - $demerit += N3; - } - } - } - } - } - return $demerit; - } - - /** - * evaluateSymbol - * @param int $width - * @param array $frame - * @return int demerit - */ - protected function evaluateSymbol($width, $frame) { - $head = 0; - $demerit = 0; - for ($y=0; $y<$width; ++$y) { - $head = 0; - $this->runLength[0] = 1; - $frameY = $frame[$y]; - if ($y > 0) { - $frameYM = $frame[$y-1]; - } - for ($x=0; $x<$width; ++$x) { - if (($x > 0) AND ($y > 0)) { - $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); - $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); - if (($b22 | ($w22 ^ 1)) & 1) { - $demerit += N2; - } - } - if (($x == 0) AND (ord($frameY[$x]) & 1)) { - $this->runLength[0] = -1; - $head = 1; - $this->runLength[$head] = 1; - } elseif ($x > 0) { - if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { - $head++; - $this->runLength[$head] = 1; - } else { - $this->runLength[$head]++; - } - } - } - $demerit += $this->calcN1N3($head+1); - } - for ($x=0; $x<$width; ++$x) { - $head = 0; - $this->runLength[0] = 1; - for ($y=0; $y<$width; ++$y) { - if (($y == 0) AND (ord($frame[$y][$x]) & 1)) { - $this->runLength[0] = -1; - $head = 1; - $this->runLength[$head] = 1; - } elseif ($y > 0) { - if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { - $head++; - $this->runLength[$head] = 1; - } else { - $this->runLength[$head]++; - } - } - } - $demerit += $this->calcN1N3($head+1); - } - return $demerit; - } - - /** - * mask - * @param int $width - * @param array $frame - * @param int $level - * @return array best mask - */ - protected function mask($width, $frame, $level) { - $minDemerit = PHP_INT_MAX; - $bestMaskNum = 0; - $bestMask = array(); - $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7); - if (QR_FIND_FROM_RANDOM !== false) { - $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9); - for ($i = 0; $i < $howManuOut; ++$i) { - $remPos = rand (0, count($checked_masks)-1); - unset($checked_masks[$remPos]); - $checked_masks = array_values($checked_masks); - } - } - $bestMask = $frame; - foreach ($checked_masks as $i) { - $mask = array_fill(0, $width, str_repeat("\0", $width)); - $demerit = 0; - $blacks = 0; - $blacks = $this->makeMaskNo($i, $width, $frame, $mask); - $blacks += $this->writeFormatInformation($width, $mask, $i, $level); - $blacks = (int)(100 * $blacks / ($width * $width)); - $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); - $demerit += $this->evaluateSymbol($width, $mask); - if ($demerit < $minDemerit) { - $minDemerit = $demerit; - $bestMask = $mask; - $bestMaskNum = $i; - } - } - return $bestMask; - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRsplit - - /** - * Return true if the character at specified position is a number - * @param string $str string - * @param int $pos characted position - * @return boolean true of false - */ - protected function isdigitat($str, $pos) { - if ($pos >= strlen($str)) { - return false; - } - return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); - } - - /** - * Return true if the character at specified position is an alphanumeric character - * @param string $str string - * @param int $pos characted position - * @return boolean true of false - */ - protected function isalnumat($str, $pos) { - if ($pos >= strlen($str)) { - return false; - } - return ($this->lookAnTable(ord($str[$pos])) >= 0); - } - - /** - * identifyMode - * @param int $pos - * @return int mode - */ - protected function identifyMode($pos) { - if ($pos >= strlen($this->dataStr)) { - return QR_MODE_NL; - } - $c = $this->dataStr[$pos]; - if ($this->isdigitat($this->dataStr, $pos)) { - return QR_MODE_NM; - } elseif ($this->isalnumat($this->dataStr, $pos)) { - return QR_MODE_AN; - } elseif ($this->hint == QR_MODE_KJ) { - if ($pos+1 < strlen($this->dataStr)) { - $d = $this->dataStr[$pos+1]; - $word = (ord($c) << 8) | ord($d); - if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) { - return QR_MODE_KJ; - } - } - } - return QR_MODE_8B; - } - - /** - * eatNum - * @return int run - */ - protected function eatNum() { - $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); - $p = 0; - while($this->isdigitat($this->dataStr, $p)) { - $p++; - } - $run = $p; - $mode = $this->identifyMode($p); - if ($mode == QR_MODE_8B) { - $dif = $this->estimateBitsModeNum($run) + 4 + $ln - + $this->estimateBitsMode8(1) // + 4 + l8 - - $this->estimateBitsMode8($run + 1); // - 4 - l8 - if ($dif > 0) { - return $this->eat8(); - } - } - if ($mode == QR_MODE_AN) { - $dif = $this->estimateBitsModeNum($run) + 4 + $ln - + $this->estimateBitsModeAn(1) // + 4 + la - - $this->estimateBitsModeAn($run + 1);// - 4 - la - if ($dif > 0) { - return $this->eatAn(); - } - } - $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr)); - return $run; - } - - /** - * eatAn - * @return int run - */ - protected function eatAn() { - $la = $this->lengthIndicator(QR_MODE_AN, $this->version); - $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); - $p = 0; - while($this->isalnumat($this->dataStr, $p)) { - if ($this->isdigitat($this->dataStr, $p)) { - $q = $p; - while($this->isdigitat($this->dataStr, $q)) { - $q++; - } - $dif = $this->estimateBitsModeAn($p) // + 4 + la - + $this->estimateBitsModeNum($q - $p) + 4 + $ln - - $this->estimateBitsModeAn($q); // - 4 - la - if ($dif < 0) { - break; - } else { - $p = $q; - } - } else { - $p++; - } - } - $run = $p; - if (!$this->isalnumat($this->dataStr, $p)) { - $dif = $this->estimateBitsModeAn($run) + 4 + $la - + $this->estimateBitsMode8(1) // + 4 + l8 - - $this->estimateBitsMode8($run + 1); // - 4 - l8 - if ($dif > 0) { - return $this->eat8(); - } - } - $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr)); - return $run; - } - - /** - * eatKanji - * @return int run - */ - protected function eatKanji() { - $p = 0; - while($this->identifyMode($p) == QR_MODE_KJ) { - $p += 2; - } - $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr)); - return $run; - } - - /** - * eat8 - * @return int run - */ - protected function eat8() { - $la = $this->lengthIndicator(QR_MODE_AN, $this->version); - $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); - $p = 1; - $dataStrLen = strlen($this->dataStr); - while($p < $dataStrLen) { - $mode = $this->identifyMode($p); - if ($mode == QR_MODE_KJ) { - break; - } - if ($mode == QR_MODE_NM) { - $q = $p; - while($this->isdigitat($this->dataStr, $q)) { - $q++; - } - $dif = $this->estimateBitsMode8($p) // + 4 + l8 - + $this->estimateBitsModeNum($q - $p) + 4 + $ln - - $this->estimateBitsMode8($q); // - 4 - l8 - if ($dif < 0) { - break; - } else { - $p = $q; - } - } elseif ($mode == QR_MODE_AN) { - $q = $p; - while($this->isalnumat($this->dataStr, $q)) { - $q++; - } - $dif = $this->estimateBitsMode8($p) // + 4 + l8 - + $this->estimateBitsModeAn($q - $p) + 4 + $la - - $this->estimateBitsMode8($q); // - 4 - l8 - if ($dif < 0) { - break; - } else { - $p = $q; - } - } else { - $p++; - } - } - $run = $p; - $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr)); - return $run; - } - - /** - * splitString - */ - protected function splitString() { - while (strlen($this->dataStr) > 0) { - if ($this->dataStr == '') { - return 0; - } - $mode = $this->identifyMode(0); - switch ($mode) { - case QR_MODE_NM: { - $length = $this->eatNum(); - break; - } - case QR_MODE_AN: { - $length = $this->eatAn(); - break; - } - case QR_MODE_KJ: { - if ($hint == QR_MODE_KJ) { - $length = $this->eatKanji(); - } else { - $length = $this->eat8(); - } - break; - } - default: { - $length = $this->eat8(); - break; - } - } - if ($length == 0) { - return 0; - } - if ($length < 0) { - return -1; - } - $this->dataStr = substr($this->dataStr, $length); - } - } - - /** - * toUpper - */ - protected function toUpper() { - $stringLen = strlen($this->dataStr); - $p = 0; - while ($p < $stringLen) { - $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint); - if ($mode == QR_MODE_KJ) { - $p += 2; - } else { - if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) { - $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); - } - $p++; - } - } - return $this->dataStr; - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRinputItem - - /** - * newInputItem - * @param int $mode - * @param int $size - * @param array $data - * @param array $bstream - * @return array input item - */ - protected function newInputItem($mode, $size, $data, $bstream=null) { - $setData = array_slice($data, 0, $size); - if (count($setData) < $size) { - $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0)); - } - if (!$this->check($mode, $size, $setData)) { - return NULL; - } - $inputitem = array(); - $inputitem['mode'] = $mode; - $inputitem['size'] = $size; - $inputitem['data'] = $setData; - $inputitem['bstream'] = $bstream; - return $inputitem; - } - - /** - * encodeModeNum - * @param array $inputitem - * @param int $version - * @return array input item - */ - protected function encodeModeNum($inputitem, $version) { - $words = (int)($inputitem['size'] / 3); - $inputitem['bstream'] = array(); - $val = 0x1; - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']); - for ($i=0; $i < $words; ++$i) { - $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100; - $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10; - $val += (ord($inputitem['data'][$i*3+2]) - ord('0')); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val); - } - if ($inputitem['size'] - $words * 3 == 1) { - $val = ord($inputitem['data'][$words*3]) - ord('0'); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); - } elseif (($inputitem['size'] - ($words * 3)) == 2) { - $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10; - $val += (ord($inputitem['data'][$words*3+1]) - ord('0')); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val); - } - return $inputitem; - } - - /** - * encodeModeAn - * @param array $inputitem - * @param int $version - * @return array input item - */ - protected function encodeModeAn($inputitem, $version) { - $words = (int)($inputitem['size'] / 2); - $inputitem['bstream'] = array(); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']); - for ($i=0; $i < $words; ++$i) { - $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45; - $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1])); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val); - } - if ($inputitem['size'] & 1) { - $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)])); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val); - } - return $inputitem; - } - - /** - * encodeMode8 - * @param array $inputitem - * @param int $version - * @return array input item - */ - protected function encodeMode8($inputitem, $version) { - $inputitem['bstream'] = array(); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']); - for ($i=0; $i < $inputitem['size']; ++$i) { - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i])); - } - return $inputitem; - } - - /** - * encodeModeKanji - * @param array $inputitem - * @param int $version - * @return array input item - */ - protected function encodeModeKanji($inputitem, $version) { - $inputitem['bstream'] = array(); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2)); - for ($i=0; $i<$inputitem['size']; $i+=2) { - $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]); - if ($val <= 0x9ffc) { - $val -= 0x8140; - } else { - $val -= 0xc140; - } - $h = ($val >> 8) * 0xc0; - $val = ($val & 0xff) + $h; - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val); - } - return $inputitem; - } - - /** - * encodeModeStructure - * @param array $inputitem - * @return array input item - */ - protected function encodeModeStructure($inputitem) { - $inputitem['bstream'] = array(); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1); - $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2])); - return $inputitem; - } - - /** - * encodeBitStream - * @param array $inputitem - * @param int $version - * @return array input item - */ - protected function encodeBitStream($inputitem, $version) { - $inputitem['bstream'] = array(); - $words = $this->maximumWords($inputitem['mode'], $version); - if ($inputitem['size'] > $words) { - $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']); - $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words)); - $st1 = $this->encodeBitStream($st1, $version); - $st2 = $this->encodeBitStream($st2, $version); - $inputitem['bstream'] = array(); - $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']); - $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']); - } else { - switch($inputitem['mode']) { - case QR_MODE_NM: { - $inputitem = $this->encodeModeNum($inputitem, $version); - break; - } - case QR_MODE_AN: { - $inputitem = $this->encodeModeAn($inputitem, $version); - break; - } - case QR_MODE_8B: { - $inputitem = $this->encodeMode8($inputitem, $version); - break; - } - case QR_MODE_KJ: { - $inputitem = $this->encodeModeKanji($inputitem, $version); - break; - } - case QR_MODE_ST: { - $inputitem = $this->encodeModeStructure($inputitem); - break; - } - default: { - break; - } - } - } - return $inputitem; - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRinput - - /** - * Append data to an input object. - * The data is copied and appended to the input object. - * @param array items input items - * @param int $mode encoding mode. - * @param int $size size of data (byte). - * @param array $data array of input data. - * @return items - * - */ - protected function appendNewInputItem($items, $mode, $size, $data) { - $items[] = $this->newInputItem($mode, $size, $data); - return $items; - } - - /** - * insertStructuredAppendHeader - * @param array $items - * @param int $size - * @param int $index - * @param int $parity - * @return array items - */ - protected function insertStructuredAppendHeader($items, $size, $index, $parity) { - if ($size > MAX_STRUCTURED_SYMBOLS) { - return -1; - } - if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) { - return -1; - } - $buf = array($size, $index, $parity); - $entry = $this->newInputItem(QR_MODE_ST, 3, buf); - array_unshift($items, $entry); - return $items; - } - - /** - * calcParity - * @param array $items - * @return int parity - */ - protected function calcParity($items) { - $parity = 0; - foreach ($items as $item) { - if ($item['mode'] != QR_MODE_ST) { - for ($i=$item['size']-1; $i>=0; --$i) { - $parity ^= $item['data'][$i]; - } - } - } - return $parity; - } - - /** - * checkModeNum - * @param int $size - * @param array $data - * @return boolean true or false - */ - protected function checkModeNum($size, $data) { - for ($i=0; $i<$size; ++$i) { - if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){ - return false; - } - } - return true; - } - - /** - * estimateBitsModeNum - * @param int $size - * @return int number of bits - */ - protected function estimateBitsModeNum($size) { - $w = (int)$size / 3; - $bits = $w * 10; - switch($size - $w * 3) { - case 1: { - $bits += 4; - break; - } - case 2: { - $bits += 7; - break; - } - default: { - break; - } - } - return $bits; - } - - /** - * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19). - * @param int $c character value - * @return value - */ - protected function lookAnTable($c) { - return (($c > 127)?-1:$this->anTable[$c]); - } - - /** - * checkModeAn - * @param int $size - * @param array $data - * @return boolean true or false - */ - protected function checkModeAn($size, $data) { - for ($i=0; $i<$size; ++$i) { - if ($this->lookAnTable(ord($data[$i])) == -1) { - return false; - } - } - return true; - } - - /** - * estimateBitsModeAn - * @param int $size - * @return int number of bits - */ - protected function estimateBitsModeAn($size) { - $w = (int)($size / 2); - $bits = $w * 11; - if ($size & 1) { - $bits += 6; - } - return $bits; - } - - /** - * estimateBitsMode8 - * @param int $size - * @return int number of bits - */ - protected function estimateBitsMode8($size) { - return $size * 8; - } - - /** - * estimateBitsModeKanji - * @param int $size - * @return int number of bits - */ - protected function estimateBitsModeKanji($size) { - return (int)(($size / 2) * 13); - } - - /** - * checkModeKanji - * @param int $size - * @param array $data - * @return boolean true or false - */ - protected function checkModeKanji($size, $data) { - if ($size & 1) { - return false; - } - for ($i=0; $i<$size; $i+=2) { - $val = (ord($data[$i]) << 8) | ord($data[$i+1]); - if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) { - return false; - } - } - return true; - } - - /** - * Validate the input data. - * @param int $mode encoding mode. - * @param int $size size of data (byte). - * @param array data data to validate - * @return boolean true in case of valid data, false otherwise - */ - protected function check($mode, $size, $data) { - if ($size <= 0) { - return false; - } - switch($mode) { - case QR_MODE_NM: { - return $this->checkModeNum($size, $data); - } - case QR_MODE_AN: { - return $this->checkModeAn($size, $data); - } - case QR_MODE_KJ: { - return $this->checkModeKanji($size, $data); - } - case QR_MODE_8B: { - return true; - } - case QR_MODE_ST: { - return true; - } - default: { - break; - } - } - return false; - } - - /** - * estimateBitStreamSize - * @param array $items - * @param int $version - * @return int bits - */ - protected function estimateBitStreamSize($items, $version) { - $bits = 0; - if ($version == 0) { - $version = 1; - } - foreach ($items as $item) { - switch($item['mode']) { - case QR_MODE_NM: { - $bits = $this->estimateBitsModeNum($item['size']); - break; - } - case QR_MODE_AN: { - $bits = $this->estimateBitsModeAn($item['size']); - break; - } - case QR_MODE_8B: { - $bits = $this->estimateBitsMode8($item['size']); - break; - } - case QR_MODE_KJ: { - $bits = $this->estimateBitsModeKanji($item['size']); - break; - } - case QR_MODE_ST: { - return STRUCTURE_HEADER_BITS; - } - default: { - return 0; - } - } - $l = $this->lengthIndicator($item['mode'], $version); - $m = 1 << $l; - $num = (int)(($item['size'] + $m - 1) / $m); - $bits += $num * (4 + $l); - } - return $bits; - } - - /** - * estimateVersion - * @param array $items - * @return int version - */ - protected function estimateVersion($items) { - $version = 0; - $prev = 0; - do { - $prev = $version; - $bits = $this->estimateBitStreamSize($items, $prev); - $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); - if ($version < 0) { - return -1; - } - } while ($version > $prev); - return $version; - } - - /** - * lengthOfCode - * @param int $mode - * @param int $version - * @param int $bits - * @return int size - */ - protected function lengthOfCode($mode, $version, $bits) { - $payload = $bits - 4 - $this->lengthIndicator($mode, $version); - switch($mode) { - case QR_MODE_NM: { - $chunks = (int)($payload / 10); - $remain = $payload - $chunks * 10; - $size = $chunks * 3; - if ($remain >= 7) { - $size += 2; - } elseif ($remain >= 4) { - $size += 1; - } - break; - } - case QR_MODE_AN: { - $chunks = (int)($payload / 11); - $remain = $payload - $chunks * 11; - $size = $chunks * 2; - if ($remain >= 6) { - ++$size; - } - break; - } - case QR_MODE_8B: { - $size = (int)($payload / 8); - break; - } - case QR_MODE_KJ: { - $size = (int)(($payload / 13) * 2); - break; - } - case QR_MODE_ST: { - $size = (int)($payload / 8); - break; - } - default: { - $size = 0; - break; - } - } - $maxsize = $this->maximumWords($mode, $version); - if ($size < 0) { - $size = 0; - } - if ($size > $maxsize) { - $size = $maxsize; - } - return $size; - } - - /** - * createBitStream - * @param array $items - * @return array of items and total bits - */ - protected function createBitStream($items) { - $total = 0; - foreach ($items as $key => $item) { - $items[$key] = $this->encodeBitStream($item, $this->version); - $bits = count($items[$key]['bstream']); - $total += $bits; - } - return array($items, $total); - } - - /** - * convertData - * @param array $items - * @return array items - */ - protected function convertData($items) { - $ver = $this->estimateVersion($items); - if ($ver > $this->version) { - $this->version = $ver; - } - for (;;) { - $cbs = $this->createBitStream($items); - $items = $cbs[0]; - $bits = $cbs[1]; - if ($bits < 0) { - return -1; - } - $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); - if ($ver < 0) { - return -1; - } elseif ($ver > $this->version) { - $this->version = $ver; - } else { - break; - } - } - return $items; - } - - /** - * Append Padding Bit to bitstream - * @param array $bstream - * @return array bitstream - */ - protected function appendPaddingBit($bstream) { - if (is_null($bstream)) { - return null; - } - $bits = count($bstream); - $maxwords = $this->getDataLength($this->version, $this->level); - $maxbits = $maxwords * 8; - if ($maxbits == $bits) { - return 0; - } - if ($maxbits - $bits < 5) { - return $this->appendNum($bstream, $maxbits - $bits, 0); - } - $bits += 4; - $words = (int)(($bits + 7) / 8); - $padding = array(); - $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0); - $padlen = $maxwords - $words; - if ($padlen > 0) { - $padbuf = array(); - for ($i=0; $i<$padlen; ++$i) { - $padbuf[$i] = ($i&1)?0x11:0xec; - } - $padding = $this->appendBytes($padding, $padlen, $padbuf); - } - return $this->appendBitstream($bstream, $padding); - } - - /** - * mergeBitStream - * @param array $bstream - * @return array bitstream - */ - protected function mergeBitStream($items) { - $items = $this->convertData($items); - if (!is_array($items)) { - return null; - } - $bstream = array(); - foreach ($items as $item) { - $bstream = $this->appendBitstream($bstream, $item['bstream']); - } - return $bstream; - } - - /** - * Returns a stream of bits. - * @param int $items - * @return array padded merged byte stream - */ - protected function getBitStream($items) { - $bstream = $this->mergeBitStream($items); - return $this->appendPaddingBit($bstream); - } - - /** - * Pack all bit streams padding bits into a byte array. - * @param int $items - * @return array padded merged byte stream - */ - protected function getByteStream($items) { - $bstream = $this->getBitStream($items); - return $this->bitstreamToByte($bstream); - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRbitstream - - /** - * Return an array with zeros - * @param int $setLength array size - * @return array - */ - protected function allocate($setLength) { - return array_fill(0, $setLength, 0); - } - - /** - * Return new bitstream from number - * @param int $bits number of bits - * @param int $num number - * @return array bitstream - */ - protected function newFromNum($bits, $num) { - $bstream = $this->allocate($bits); - $mask = 1 << ($bits - 1); - for ($i=0; $i<$bits; ++$i) { - if ($num & $mask) { - $bstream[$i] = 1; - } else { - $bstream[$i] = 0; - } - $mask = $mask >> 1; - } - return $bstream; - } - - /** - * Return new bitstream from bytes - * @param int $size size - * @param array $data bytes - * @return array bitstream - */ - protected function newFromBytes($size, $data) { - $bstream = $this->allocate($size * 8); - $p=0; - for ($i=0; $i<$size; ++$i) { - $mask = 0x80; - for ($j=0; $j<8; ++$j) { - if ($data[$i] & $mask) { - $bstream[$p] = 1; - } else { - $bstream[$p] = 0; - } - $p++; - $mask = $mask >> 1; - } - } - return $bstream; - } - - /** - * Append one bitstream to another - * @param array $bitstream original bitstream - * @param array $append bitstream to append - * @return array bitstream - */ - protected function appendBitstream($bitstream, $append) { - if ((!is_array($append)) OR (count($append) == 0)) { - return $bitstream; - } - if (count($bitstream) == 0) { - return $append; - } - return array_values(array_merge($bitstream, $append)); - } - - /** - * Append one bitstream created from number to another - * @param array $bitstream original bitstream - * @param int $bits number of bits - * @param int $num number - * @return array bitstream - */ - protected function appendNum($bitstream, $bits, $num) { - if ($bits == 0) { - return 0; - } - $b = $this->newFromNum($bits, $num); - return $this->appendBitstream($bitstream, $b); - } - - /** - * Append one bitstream created from bytes to another - * @param array $bitstream original bitstream - * @param int $size size - * @param array $data bytes - * @return array bitstream - */ - protected function appendBytes($bitstream, $size, $data) { - if ($size == 0) { - return 0; - } - $b = $this->newFromBytes($size, $data); - return $this->appendBitstream($bitstream, $b); - } - - /** - * Convert bitstream to bytes - * @param array $bitstream original bitstream - * @return array of bytes - */ - protected function bitstreamToByte($bstream) { - if (is_null($bstream)) { - return null; - } - $size = count($bstream); - if ($size == 0) { - return array(); - } - $data = array_fill(0, (int)(($size + 7) / 8), 0); - $bytes = (int)($size / 8); - $p = 0; - for ($i=0; $i<$bytes; $i++) { - $v = 0; - for ($j=0; $j<8; $j++) { - $v = $v << 1; - $v |= $bstream[$p]; - $p++; - } - $data[$i] = $v; - } - if ($size & 7) { - $v = 0; - for ($j=0; $j<($size & 7); $j++) { - $v = $v << 1; - $v |= $bstream[$p]; - $p++; - } - $data[$bytes] = $v; - } - return $data; - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRspec - - /** - * Replace a value on the array at the specified position - * @param array $srctab - * @param int $x X position - * @param int $y Y position - * @param string $repl value to replace - * @param int $replLen length of the repl string - * @return array srctab - */ - protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) { - $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); - return $srctab; - } - - /** - * Return maximum data code length (bytes) for the version. - * @param int $version version - * @param int $level error correction level - * @return int maximum size (bytes) - */ - protected function getDataLength($version, $level) { - return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level]; - } - - /** - * Return maximum error correction code length (bytes) for the version. - * @param int $version version - * @param int $level error correction level - * @return int ECC size (bytes) - */ - protected function getECCLength($version, $level){ - return $this->capacity[$version][QRCAP_EC][$level]; - } - - /** - * Return the width of the symbol for the version. - * @param int $version version - * @return int width - */ - protected function getWidth($version) { - return $this->capacity[$version][QRCAP_WIDTH]; - } - - /** - * Return the numer of remainder bits. - * @param int $version version - * @return int number of remainder bits - */ - protected function getRemainder($version) { - return $this->capacity[$version][QRCAP_REMINDER]; - } - - /** - * Return a version number that satisfies the input code length. - * @param int $size input code length (byte) - * @param int $level error correction level - * @return int version number - */ - protected function getMinimumVersion($size, $level) { - for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) { - $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]; - if ($words >= $size) { - return $i; - } - } - return -1; - } - - /** - * Return the size of length indicator for the mode and version. - * @param int $mode encoding mode - * @param int $version version - * @return int the size of the appropriate length indicator (bits). - */ - protected function lengthIndicator($mode, $version) { - if ($mode == QR_MODE_ST) { - return 0; - } - if ($version <= 9) { - $l = 0; - } elseif ($version <= 26) { - $l = 1; - } else { - $l = 2; - } - return $this->lengthTableBits[$mode][$l]; - } - - /** - * Return the maximum length for the mode and version. - * @param int $mode encoding mode - * @param int $version version - * @return int the maximum length (bytes) - */ - protected function maximumWords($mode, $version) { - if ($mode == QR_MODE_ST) { - return 3; - } - if ($version <= 9) { - $l = 0; - } else if ($version <= 26) { - $l = 1; - } else { - $l = 2; - } - $bits = $this->lengthTableBits[$mode][$l]; - $words = (1 << $bits) - 1; - if ($mode == QR_MODE_KJ) { - $words *= 2; // the number of bytes is required - } - return $words; - } - - /** - * Return an array of ECC specification. - * @param int $version version - * @param int $level error correction level - * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code} - * @return array spec - */ - protected function getEccSpec($version, $level, $spec) { - if (count($spec) < 5) { - $spec = array(0, 0, 0, 0, 0); - } - $b1 = $this->eccTable[$version][$level][0]; - $b2 = $this->eccTable[$version][$level][1]; - $data = $this->getDataLength($version, $level); - $ecc = $this->getECCLength($version, $level); - if ($b2 == 0) { - $spec[0] = $b1; - $spec[1] = (int)($data / $b1); - $spec[2] = (int)($ecc / $b1); - $spec[3] = 0; - $spec[4] = 0; - } else { - $spec[0] = $b1; - $spec[1] = (int)($data / ($b1 + $b2)); - $spec[2] = (int)($ecc / ($b1 + $b2)); - $spec[3] = $b2; - $spec[4] = $spec[1] + 1; - } - return $spec; - } - - /** - * Put an alignment marker. - * @param array $frame frame - * @param int $width width - * @param int $ox X center coordinate of the pattern - * @param int $oy Y center coordinate of the pattern - * @return array frame - */ - protected function putAlignmentMarker($frame, $ox, $oy) { - $finder = array( - "\xa1\xa1\xa1\xa1\xa1", - "\xa1\xa0\xa0\xa0\xa1", - "\xa1\xa0\xa1\xa0\xa1", - "\xa1\xa0\xa0\xa0\xa1", - "\xa1\xa1\xa1\xa1\xa1" - ); - $yStart = $oy - 2; - $xStart = $ox - 2; - for ($y=0; $y < 5; $y++) { - $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]); - } - return $frame; - } - - /** - * Put an alignment pattern. - * @param int $version version - * @param array $fram frame - * @param int $width width - * @return array frame - */ - protected function putAlignmentPattern($version, $frame, $width) { - if ($version < 2) { - return $frame; - } - $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0]; - if ($d < 0) { - $w = 2; - } else { - $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2); - } - if ($w * $w - 3 == 1) { - $x = $this->alignmentPattern[$version][0]; - $y = $this->alignmentPattern[$version][0]; - $frame = $this->putAlignmentMarker($frame, $x, $y); - return $frame; - } - $cx = $this->alignmentPattern[$version][0]; - $wo = $w - 1; - for ($x=1; $x < $wo; ++$x) { - $frame = $this->putAlignmentMarker($frame, 6, $cx); - $frame = $this->putAlignmentMarker($frame, $cx, 6); - $cx += $d; - } - $cy = $this->alignmentPattern[$version][0]; - for ($y=0; $y < $wo; ++$y) { - $cx = $this->alignmentPattern[$version][0]; - for ($x=0; $x < $wo; ++$x) { - $frame = $this->putAlignmentMarker($frame, $cx, $cy); - $cx += $d; - } - $cy += $d; - } - return $frame; - } - - /** - * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits. - * @param int $version version - * @return BCH encoded version information pattern - */ - protected function getVersionPattern($version) { - if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) { - return 0; - } - return $this->versionPattern[($version - 7)]; - } - - /** - * Return BCH encoded format information pattern. - * @param array $mask - * @param int $level error correction level - * @return BCH encoded format information pattern - */ - protected function getFormatInfo($mask, $level) { - if (($mask < 0) OR ($mask > 7)) { - return 0; - } - if (($level < 0) OR ($level > 3)) { - return 0; - } - return $this->formatInfo[$level][$mask]; - } - - /** - * Put a finder pattern. - * @param array $frame frame - * @param int $width width - * @param int $ox X center coordinate of the pattern - * @param int $oy Y center coordinate of the pattern - * @return array frame - */ - protected function putFinderPattern($frame, $ox, $oy) { - $finder = array( - "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", - "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", - "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", - "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", - "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", - "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", - "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" - ); - for ($y=0; $y < 7; $y++) { - $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]); - } - return $frame; - } - - /** - * Return a copy of initialized frame. - * @param int $version version - * @return Array of unsigned char. - */ - protected function createFrame($version) { - $width = $this->capacity[$version][QRCAP_WIDTH]; - $frameLine = str_repeat ("\0", $width); - $frame = array_fill(0, $width, $frameLine); - // Finder pattern - $frame = $this->putFinderPattern($frame, 0, 0); - $frame = $this->putFinderPattern($frame, $width - 7, 0); - $frame = $this->putFinderPattern($frame, 0, $width - 7); - // Separator - $yOffset = $width - 7; - for ($y=0; $y < 7; ++$y) { - $frame[$y][7] = "\xc0"; - $frame[$y][$width - 8] = "\xc0"; - $frame[$yOffset][7] = "\xc0"; - ++$yOffset; - } - $setPattern = str_repeat("\xc0", 8); - $frame = $this->qrstrset($frame, 0, 7, $setPattern); - $frame = $this->qrstrset($frame, $width-8, 7, $setPattern); - $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern); - // Format info - $setPattern = str_repeat("\x84", 9); - $frame = $this->qrstrset($frame, 0, 8, $setPattern); - $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8); - $yOffset = $width - 8; - for ($y=0; $y < 8; ++$y,++$yOffset) { - $frame[$y][8] = "\x84"; - $frame[$yOffset][8] = "\x84"; - } - // Timing pattern - $wo = $width - 15; - for ($i=1; $i < $wo; ++$i) { - $frame[6][7+$i] = chr(0x90 | ($i & 1)); - $frame[7+$i][6] = chr(0x90 | ($i & 1)); - } - // Alignment pattern - $frame = $this->putAlignmentPattern($version, $frame, $width); - // Version information - if ($version >= 7) { - $vinf = $this->getVersionPattern($version); - $v = $vinf; - for ($x=0; $x<6; ++$x) { - for ($y=0; $y<3; ++$y) { - $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); - $v = $v >> 1; - } - } - $v = $vinf; - for ($y=0; $y<6; ++$y) { - for ($x=0; $x<3; ++$x) { - $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); - $v = $v >> 1; - } - } - } - // and a little bit... - $frame[$width - 8][8] = "\x81"; - return $frame; - } - - /** - * Set new frame for the specified version. - * @param int $version version - * @return Array of unsigned char. - */ - protected function newFrame($version) { - if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) { - return NULL; - } - if (!isset($this->frames[$version])) { - $this->frames[$version] = $this->createFrame($version); - } - if (is_null($this->frames[$version])) { - return NULL; - } - return $this->frames[$version]; - } - - /** - * Return block number 0 - * @param array $spec - * @return int value - */ - protected function rsBlockNum($spec) { - return ($spec[0] + $spec[3]); - } - - /** - * Return block number 1 - * @param array $spec - * @return int value - */ - protected function rsBlockNum1($spec) { - return $spec[0]; - } - - /** - * Return data codes 1 - * @param array $spec - * @return int value - */ - protected function rsDataCodes1($spec) { - return $spec[1]; - } - - /** - * Return ecc codes 1 - * @param array $spec - * @return int value - */ - protected function rsEccCodes1($spec) { - return $spec[2]; - } - - /** - * Return block number 2 - * @param array $spec - * @return int value - */ - protected function rsBlockNum2($spec) { - return $spec[3]; - } - - /** - * Return data codes 2 - * @param array $spec - * @return int value - */ - protected function rsDataCodes2($spec) { - return $spec[4]; - } - - /** - * Return ecc codes 2 - * @param array $spec - * @return int value - */ - protected function rsEccCodes2($spec) { - return $spec[2]; - } - - /** - * Return data length - * @param array $spec - * @return int value - */ - protected function rsDataLength($spec) { - return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); - } - - /** - * Return ecc length - * @param array $spec - * @return int value - */ - protected function rsEccLength($spec) { - return ($spec[0] + $spec[3]) * $spec[2]; - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRrs - - /** - * Initialize a Reed-Solomon codec and add it to existing rsitems - * @param int $symsize symbol size, bits - * @param int $gfpoly Field generator polynomial coefficients - * @param int $fcr first root of RS code generator polynomial, index form - * @param int $prim primitive element to generate polynomial roots - * @param int $nroots RS code generator polynomial degree (number of roots) - * @param int $pad padding bytes at front of shortened block - * @return array Array of RS values:
    • mm = Bits per symbol;
    • nn = Symbols per block;
    • alpha_to = log lookup table array;
    • index_of = Antilog lookup table array;
    • genpoly = Generator polynomial array;
    • nroots = Number of generator;
    • roots = number of parity symbols;
    • fcr = First consecutive root, index form;
    • prim = Primitive element, index form;
    • iprim = prim-th root of 1, index form;
    • pad = Padding bytes in shortened block;
    • gfpoly
    . - */ - protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { - foreach ($this->rsitems as $rs) { - if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize) - OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) { - continue; - } - return $rs; - } - $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); - array_unshift($this->rsitems, $rs); - return $rs; - } - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - // QRrsItem - - /** - * modnn - * @param array RS values - * @param int $x X position - * @return int X osition - */ - protected function modnn($rs, $x) { - while ($x >= $rs['nn']) { - $x -= $rs['nn']; - $x = ($x >> $rs['mm']) + ($x & $rs['nn']); - } - return $x; - } - - /** - * Initialize a Reed-Solomon codec and returns an array of values. - * @param int $symsize symbol size, bits - * @param int $gfpoly Field generator polynomial coefficients - * @param int $fcr first root of RS code generator polynomial, index form - * @param int $prim primitive element to generate polynomial roots - * @param int $nroots RS code generator polynomial degree (number of roots) - * @param int $pad padding bytes at front of shortened block - * @return array Array of RS values:
    • mm = Bits per symbol;
    • nn = Symbols per block;
    • alpha_to = log lookup table array;
    • index_of = Antilog lookup table array;
    • genpoly = Generator polynomial array;
    • nroots = Number of generator;
    • roots = number of parity symbols;
    • fcr = First consecutive root, index form;
    • prim = Primitive element, index form;
    • iprim = prim-th root of 1, index form;
    • pad = Padding bytes in shortened block;
    • gfpoly
    . - */ - protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { - // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2) - $rs = null; - // Check parameter ranges - if (($symsize < 0) OR ($symsize > 8)) { - return $rs; - } - if (($fcr < 0) OR ($fcr >= (1<<$symsize))) { - return $rs; - } - if (($prim <= 0) OR ($prim >= (1<<$symsize))) { - return $rs; - } - if (($nroots < 0) OR ($nroots >= (1<<$symsize))) { - return $rs; - } - if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) { - return $rs; - } - $rs = array(); - $rs['mm'] = $symsize; - $rs['nn'] = (1 << $symsize) - 1; - $rs['pad'] = $pad; - $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0); - $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0); - // PHP style macro replacement ;) - $NN =& $rs['nn']; - $A0 =& $NN; - // Generate Galois field lookup tables - $rs['index_of'][0] = $A0; // log(zero) = -inf - $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0 - $sr = 1; - for ($i=0; $i<$rs['nn']; ++$i) { - $rs['index_of'][$sr] = $i; - $rs['alpha_to'][$i] = $sr; - $sr <<= 1; - if ($sr & (1 << $symsize)) { - $sr ^= $gfpoly; - } - $sr &= $rs['nn']; - } - if ($sr != 1) { - // field generator polynomial is not primitive! - return NULL; - } - // Form RS code generator polynomial from its roots - $rs['genpoly'] = array_fill(0, ($nroots + 1), 0); - $rs['fcr'] = $fcr; - $rs['prim'] = $prim; - $rs['nroots'] = $nroots; - $rs['gfpoly'] = $gfpoly; - // Find prim-th root of 1, used in decoding - for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) { - ; // intentional empty-body loop! - } - $rs['iprim'] = (int)($iprim / $prim); - $rs['genpoly'][0] = 1; - for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { - $rs['genpoly'][$i+1] = 1; - // Multiply rs->genpoly[] by @**(root + x) - for ($j = $i; $j > 0; --$j) { - if ($rs['genpoly'][$j] != 0) { - $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)]; - } else { - $rs['genpoly'][$j] = $rs['genpoly'][$j-1]; - } - } - // rs->genpoly[0] can never be zero - $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)]; - } - // convert rs->genpoly[] to index form for quicker encoding - for ($i = 0; $i <= $nroots; ++$i) { - $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]]; - } - return $rs; - } - - /** - * Encode a Reed-Solomon codec and returns the parity array - * @param array $rs RS values - * @param array $data data - * @param array $parity parity - * @return parity array - */ - protected function encode_rs_char($rs, $data, $parity) { - $MM =& $rs['mm']; // bits per symbol - $NN =& $rs['nn']; // the total number of symbols in a RS block - $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form - $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form - $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form - $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block - $FCR =& $rs['fcr']; // first consecutive root, index form - $PRIM =& $rs['prim']; // primitive element, index form - $IPRIM =& $rs['iprim']; // prim-th root of 1, index form - $PAD =& $rs['pad']; // the number of pad symbols in a block - $A0 =& $NN; - $parity = array_fill(0, $NROOTS, 0); - for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) { - $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; - if ($feedback != $A0) { - // feedback term is non-zero - // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must - // always be for the polynomials constructed by init_rs() - $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback); - for ($j=1; $j < $NROOTS; ++$j) { - $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])]; - } - } - // Shift - array_shift($parity); - if ($feedback != $A0) { - array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]); - } else { - array_push($parity, 0); - } - } - return $parity; - } - - } // end QRcode class - -} // END OF "class_exists QRcode" -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/tcpdf/tcpdf.crt b/include/limesurvey/admin/classes/tcpdf/tcpdf.crt deleted file mode 100644 index f0491391..00000000 --- a/include/limesurvey/admin/classes/tcpdf/tcpdf.crt +++ /dev/null @@ -1,40 +0,0 @@ -Bag Attributes - localKeyID: 7B AB 1B 7A BE 4C 85 C0 1A A6 DC 59 3F 79 48 C3 93 38 68 9C -subject=/CN=TCPDF DEMO/O=TCPDF/OU=DEMO/emailAddress=you@example.com/C=IT -issuer=/CN=TCPDF DEMO/O=TCPDF/OU=DEMO/emailAddress=you@example.com/C=IT ------BEGIN CERTIFICATE----- -MIIC1TCCAj6gAwIBAgIKkehOL/XGkB5cjjANBgkqhkiG9w0BAQUFADBhMRMwEQYD -VQQDEwpUQ1BERiBERU1PMQ4wDAYDVQQKEwVUQ1BERjENMAsGA1UECxMEREVNTzEe -MBwGCSqGSIb3DQEJARYPeW91QGV4YW1wbGUuY29tMQswCQYDVQQGEwJJVDAeFw0w -OTA4MjExMjU0NDhaFw0xNDA4MjExMjU0NDhaMGExEzARBgNVBAMTClRDUERGIERF -TU8xDjAMBgNVBAoTBVRDUERGMQ0wCwYDVQQLEwRERU1PMR4wHAYJKoZIhvcNAQkB -Fg95b3VAZXhhbXBsZS5jb20xCzAJBgNVBAYTAklUMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDAqIL0uGKmTR98Lxx2vEEE1OGKkMXFo0JViitALe7Onhxxqx0H -XMUDKF5mvEVu1rcvh7/oAnAfrCuEpL/up3u1mQCgBE7WXBnFFE/AE3jCksh9OkS0 -Z0Xj9woN5bzxRDsGoPiOu/4xzk5qSEXt8jf2Ep90QuNkqLIRT4swAzpDbwIDAQAB -o4GTMIGQMDcGA1UdEgQwMC6gEQYDVQQDDApUQ1BERiBERU1PoAwGA1UECgwFVENQ -REagCwYDVQQLDARERU1PMDcGA1UdEQQwMC6gEQYDVQQDDApUQ1BERiBERU1PoAwG -A1UECgwFVENQREagCwYDVQQLDARERU1PMA8GCSqGSIb3LwEBCgQCBQAwCwYDVR0P -BAQDAgSQMA0GCSqGSIb3DQEBBQUAA4GBAEhTQfqX3ZNdHmpTLDbIj22RHXii2roE -OavCbu9WsHoWpva0qSd+yIoD594VHvYAd29sfzDfiN+7W0aiZfDhq5jpaSQMVlN8 -RGYMupbHY/+a9Gz1wqxnR84mlTtIkZVRYAhsfPwy6M1BEjdMqfdh9h40JIdkdjtb -8faTCfXPePWQ ------END CERTIFICATE----- -Bag Attributes - localKeyID: 7B AB 1B 7A BE 4C 85 C0 1A A6 DC 59 3F 79 48 C3 93 38 68 9C -Key Attributes: ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQDAqIL0uGKmTR98Lxx2vEEE1OGKkMXFo0JViitALe7Onhxxqx0H -XMUDKF5mvEVu1rcvh7/oAnAfrCuEpL/up3u1mQCgBE7WXBnFFE/AE3jCksh9OkS0 -Z0Xj9woN5bzxRDsGoPiOu/4xzk5qSEXt8jf2Ep90QuNkqLIRT4swAzpDbwIDAQAB -AoGAXc+wNMmz/5Z+RlIKYia44klmqbplEx+0JULqXI4BQsrqvs67i+I4bJkznoL+ -rEIRYSuQ3sCRKFsFtckjTGpxadnxkB+uwGKc6pZChv99BFX6HFR4hgBlT/BBRAQA -hMDlM2JIRr4S4SMVXR7MHwGMUf9mUeanGLR3ZWtU3aXJrIECQQD7OaYUVYNEEnM9 -uXyjm22CuHyqyEf5gb13sK0uQty67547yJTMUQZd/sQc9KGwhzBbhrob2LO2jAhh -S+f+NSRnAkEAxFHm3fMI5RgXmswxlGm4QW07a/Ueo7ZJG6xjTkFXluJhd+XHswRD -dQIO3zG9nGjNUoeMrPhXhPvKqFc2F9RDuQJAQBEGin74N77gxqfr4ik79y8nE8J5 -oGZ2s/RJZdfFRKLg3mwbjjNHhWb4Ck5UgZkoOt8TzRApXG8/n9hktE5HFwJBALur -M5AueO1Pl5kB489lNJ9OxUQRYUXMxpxuscuoCQwSwmv0O2+0/qtG2WKhUQnI4aYo -L+FV0YwtivBb1jj3T/kCQQDIWOxq8eRowdaMzvJpRUHFgMcf1AVZExKyrugwYOWd -KNsDxC4KaQOsPt8iT/Ulo4g/MJC0HolCOhWibKmR9Ayl ------END RSA PRIVATE KEY----- diff --git a/include/limesurvey/admin/classes/tcpdf/tcpdf.fdf b/include/limesurvey/admin/classes/tcpdf/tcpdf.fdf deleted file mode 100644 index a8f7c35d..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/tcpdf.fdf and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/tcpdf.p12 b/include/limesurvey/admin/classes/tcpdf/tcpdf.p12 deleted file mode 100644 index 611f0dfb..00000000 Binary files a/include/limesurvey/admin/classes/tcpdf/tcpdf.p12 and /dev/null differ diff --git a/include/limesurvey/admin/classes/tcpdf/tcpdf.pem b/include/limesurvey/admin/classes/tcpdf/tcpdf.pem deleted file mode 100644 index 07277302..00000000 --- a/include/limesurvey/admin/classes/tcpdf/tcpdf.pem +++ /dev/null @@ -1,36 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQDCYF2R29GgR2rQ8sMpzopD3JKS5WRXntRV2pRq3tz3ae6nMjEb -7iay/9YtzXanyistJ9T4tLpzyBmh70AX9EDJz5P0reJc2jHwVYYYQR42SUTR+Myl -s1PQJ+Sw12D9/SflfS+9LBCOyFPNYpdl1evYPPQzzbinpg9deVVUhbl5pQIDAQAB -AoGBALWpXontSXNki74QxLmT4MEfqpVDco45UPWUPVXMR/Oru3HjhOY3o09zr3ZL -KnQSjFu9eFugfQmsn9gqRFqe2tSfvBw6p1ENK8yQyswlBf8P6FD3mPwCp1pUQAe2 -5bKXvPEJw+2uFkH08zygu7+n9UPlPOerA4v/xN222w1PTN1ZAkEA8VnT3pRY0J6A -isizyvkV4CWMrSNsukBnHeefS3AMsvno8Tfwa0oCMXxP89Ko6AmtbQAgDaTsfqra -e1PQ/BkFZwJBAM4soveqL3P1rusEbMNO3RgzEedVlQriL/SwFsaO6H1qPp+GQEB2 -XiHXdVMMQe71PDKDYhnsw8IiW/kDJKaqdRMCQQDEdn7FHLT/fUbdsmrIuuJXx7kv -5zpGks5dxYIiAmAUAOLiGMsYSvJmHe9nZwAfgmEt7YAqGyp4IdQfuCbST/vZAkBm -P7DazuYVxkRnfZxLCDOSKtG4PrNZ4G8UFLhW5MzcVfKUvsnirlFkyyv+cdfJIIoo -Kwxd+xPilZOzXSGyHltNAkBq3bhxYu3hj354n/VxMrUnL6KWwvYXFVow/KOLmX8v -MndvSovNX0V5UL+851xKqBPyYcfjWia5WSwbVtgmTDsi ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIDYjCCAsugAwIBAgIJANd0jxvex4IPMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNV -BAYTAklUMQ4wDAYDVQQIEwVUQ1BERjEOMAwGA1UEBxMFVENQREYxDjAMBgNVBAoT -BVRDUERGMQ4wDAYDVQQLEwVUQ1BERjEOMAwGA1UEAxMFVENQREYxHzAdBgkqhkiG -9w0BCQEWEGluZm9AdGVjbmljay5jb20wIBcNMDkwNDI1MDgzNTQ5WhgPMTkxOTEx -MDIwNDQ5NDFaMH4xCzAJBgNVBAYTAklUMQ4wDAYDVQQIEwVUQ1BERjEOMAwGA1UE -BxMFVENQREYxDjAMBgNVBAoTBVRDUERGMQ4wDAYDVQQLEwVUQ1BERjEOMAwGA1UE -AxMFVENQREYxHzAdBgkqhkiG9w0BCQEWEGluZm9AdGVjbmljay5jb20wgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAMJgXZHb0aBHatDywynOikPckpLlZFee1FXa -lGre3Pdp7qcyMRvuJrL/1i3NdqfKKy0n1Pi0unPIGaHvQBf0QMnPk/St4lzaMfBV -hhhBHjZJRNH4zKWzU9An5LDXYP39J+V9L70sEI7IU81il2XV69g89DPNuKemD115 -VVSFuXmlAgMBAAGjgeUwgeIwHQYDVR0OBBYEFK02kBpw12Co/GkW9AjG71dmpMkj -MIGyBgNVHSMEgaowgaeAFK02kBpw12Co/GkW9AjG71dmpMkjoYGDpIGAMH4xCzAJ -BgNVBAYTAklUMQ4wDAYDVQQIEwVUQ1BERjEOMAwGA1UEBxMFVENQREYxDjAMBgNV -BAoTBVRDUERGMQ4wDAYDVQQLEwVUQ1BERjEOMAwGA1UEAxMFVENQREYxHzAdBgkq -hkiG9w0BCQEWEGluZm9AdGVjbmljay5jb22CCQDXdI8b3seCDzAMBgNVHRMEBTAD -AQH/MA0GCSqGSIb3DQEBBQUAA4GBABntFkyJVLt0HID8LZ5f+NHDmZx1UKo8Q6z0 -RCX3oYyRENLgAhZ9ep7Iz3bu0Pxg7H7tJROuATSHgMvbiRy9gGORWOhoEYOZ3Tau -fbs69oQqs5m/GehmmiB8gehMZxUbY8ORPZJzvgr/HsXrsVcctSjXzziLgsrqvy7g -bdkZ7dhT ------END CERTIFICATE----- diff --git a/include/limesurvey/admin/classes/tcpdf/tcpdf.php b/include/limesurvey/admin/classes/tcpdf/tcpdf.php deleted file mode 100644 index 984e4b5b..00000000 --- a/include/limesurvey/admin/classes/tcpdf/tcpdf.php +++ /dev/null @@ -1,25673 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -// ------------------------------------------------------------------- -// -// Description : This is a PHP class for generating PDF documents without -// requiring external extensions. -// -// NOTE: -// This class was originally derived in 2002 from the Public -// Domain FPDF class by Olivier Plathey (http://www.fpdf.org), -// but now is almost entirely rewritten and contains thousands of -// new lines of code and hundreds new features. -// -// Main features: -// * no external libraries are required for the basic functions; -// * all standard page formats, custom page formats, custom margins and units of measure; -// * UTF-8 Unicode and Right-To-Left languages; -// * TrueTypeUnicode, OpenTypeUnicode, TrueType, OpenType, Type1 and CID-0 fonts; -// * font subsetting; -// * methods to publish some XHTML + CSS code, Javascript and Forms; -// * images, graphic (geometric figures) and transformation methods; -// * supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/www/formats.html) -// * 1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, QR-Code, PDF417; -// * Grayscale, RGB, CMYK, Spot Colors and Transparencies; -// * automatic page header and footer management; -// * document encryption up to 256 bit and digital signature certifications; -// * transactions to UNDO commands; -// * PDF annotations, including links, text and file attachments; -// * text rendering modes (fill, stroke and clipping); -// * multiple columns mode; -// * no-write page regions; -// * bookmarks and table of content; -// * text hyphenation; -// * text stretching and spacing (tracking/kerning); -// * automatic page break, line break and text alignments including justification; -// * automatic page numbering and page groups; -// * move and delete pages; -// * page compression (requires php-zlib extension); -// * XOBject Templates; -// -// ----------------------------------------------------------- -// THANKS TO: -// -// Olivier Plathey (http://www.fpdf.org) for original FPDF. -// Efthimios Mavrogeorgiadis (emavro@yahoo.com) for suggestions on RTL language support. -// Klemen Vodopivec (http://www.fpdf.de/downloads/addons/37/) for Encryption algorithm. -// Warren Sherliker (wsherliker@gmail.com) for better image handling. -// dullus for text Justification. -// Bob Vincent (pillarsdotnet@users.sourceforge.net) for
  • value attribute. -// Patrick Benny for text stretch suggestion on Cell(). -// Johannes Güntert for JavaScript support. -// Denis Van Nuffelen for Dynamic Form. -// Jacek Czekaj for multibyte justification -// Anthony Ferrara for the reintroduction of legacy image methods. -// Sourceforge user 1707880 (hucste) for line-trough mode. -// Larry Stanbery for page groups. -// Martin Hall-May for transparency. -// Aaron C. Spike for Polycurve method. -// Mohamad Ali Golkar, Saleh AlMatrafe, Charles Abbott for Arabic and Persian support. -// Moritz Wagner and Andreas Wurmser for graphic functions. -// Andrew Whitehead for core fonts support. -// Esteban Joël Marín for OpenType font conversion. -// Teus Hagen for several suggestions and fixes. -// Yukihiro Nakadaira for CID-0 CJK fonts fixes. -// Kosmas Papachristos for some CSS improvements. -// Marcel Partap for some fixes. -// Won Kyu Park for several suggestions, fixes and patches. -// Dominik Dzienia for QR-code support. -// Laurent Minguet for some suggestions. -// Christian Deligant for some suggestions and fixes. -// Anyone that has reported a bug or sent a suggestion. -//============================================================+ - -/** - * This is a PHP class for generating PDF documents without requiring external extensions.
    - * TCPDF project (http://www.tcpdf.org) was originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.
    - *

    TCPDF main features are:

    - *
      - *
    • no external libraries are required for the basic functions;
    • - *
    • all standard page formats, custom page formats, custom margins and units of measure;
    • - *
    • UTF-8 Unicode and Right-To-Left languages;
    • - *
    • TrueTypeUnicode, OpenTypeUnicode, TrueType, OpenType, Type1 and CID-0 fonts;
    • - *
    • font subsetting;
    • - *
    • methods to publish some XHTML + CSS code, Javascript and Forms;
    • - *
    • images, graphic (geometric figures) and transformation methods; - *
    • supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/www/formats.html)
    • - *
    • 1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, QR-Code, PDF417;
    • - *
    • Grayscale, RGB, CMYK, Spot Colors and Transparencies;
    • - *
    • automatic page header and footer management;
    • - *
    • document encryption up to 256 bit and digital signature certifications;
    • - *
    • transactions to UNDO commands;
    • - *
    • PDF annotations, including links, text and file attachments;
    • - *
    • text rendering modes (fill, stroke and clipping);
    • - *
    • multiple columns mode;
    • - *
    • no-write page regions;
    • - *
    • bookmarks and table of content;
    • - *
    • text hyphenation;
    • - *
    • text stretching and spacing (tracking/kerning);
    • - *
    • automatic page break, line break and text alignments including justification;
    • - *
    • automatic page numbering and page groups;
    • - *
    • move and delete pages;
    • - *
    • page compression (requires php-zlib extension);
    • - *
    • XOBject Templates;
    • - *
    - * Tools to encode your unicode fonts are on fonts/utils directory.

    - * @package com.tecnick.tcpdf - * @abstract Class for generating PDF files on-the-fly without requiring external extensions. - * @author Nicola Asuni - * @copyright 2002-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @version 5.9.011 - */ - -/** - * main configuration file - * (define the K_TCPDF_EXTERNAL_CONFIG constant to skip this file) - */ -require_once(dirname(__FILE__).'/config/tcpdf_config.php'); - -/** - * define default PDF document producer - */ -define('PDF_PRODUCER', 'TCPDF 5.9.011 (http://www.tcpdf.org)'); - -/** -* This is a PHP class for generating PDF documents without requiring external extensions.
    -* TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.
    -* @name TCPDF -* @package com.tecnick.tcpdf -* @version 5.9.011 -* @author Nicola Asuni - info@tecnick.com -* @link http://www.tcpdf.org -* @license http://www.gnu.org/copyleft/lesser.html LGPL -*/ -class TCPDF { - - // Protected properties - - /** - * @var current page number - * @access protected - */ - protected $page; - - /** - * @var current object number - * @access protected - */ - protected $n; - - /** - * @var array of object offsets - * @access protected - */ - protected $offsets; - - /** - * @var buffer holding in-memory PDF - * @access protected - */ - protected $buffer; - - /** - * @var array containing pages - * @access protected - */ - protected $pages = array(); - - /** - * @var current document state - * @access protected - */ - protected $state; - - /** - * @var compression flag - * @access protected - */ - protected $compress; - - /** - * @var current page orientation (P = Portrait, L = Landscape) - * @access protected - */ - protected $CurOrientation; - - /** - * @var Page dimensions - * @access protected - */ - protected $pagedim = array(); - - /** - * @var scale factor (number of points in user unit) - * @access protected - */ - protected $k; - - /** - * @var width of page format in points - * @access protected - */ - protected $fwPt; - - /** - * @var height of page format in points - * @access protected - */ - protected $fhPt; - - /** - * @var current width of page in points - * @access protected - */ - protected $wPt; - - /** - * @var current height of page in points - * @access protected - */ - protected $hPt; - - /** - * @var current width of page in user unit - * @access protected - */ - protected $w; - - /** - * @var current height of page in user unit - * @access protected - */ - protected $h; - - /** - * @var left margin - * @access protected - */ - protected $lMargin; - - /** - * @var top margin - * @access protected - */ - protected $tMargin; - - /** - * @var right margin - * @access protected - */ - protected $rMargin; - - /** - * @var page break margin - * @access protected - */ - protected $bMargin; - - /** - * @var array of cell internal paddings ('T' => top, 'R' => right, 'B' => bottom, 'L' => left) - * @since 5.9.000 (2010-10-03) - * @access protected - */ - protected $cell_padding = array('T' => 0, 'R' => 0, 'B' => 0, 'L' => 0); - - /** - * @var array of cell margins ('T' => top, 'R' => right, 'B' => bottom, 'L' => left) - * @since 5.9.000 (2010-10-04) - * @access protected - */ - protected $cell_margin = array('T' => 0, 'R' => 0, 'B' => 0, 'L' => 0); - - /** - * @var current horizontal position in user unit for cell positioning - * @access protected - */ - protected $x; - - /** - * @var current vertical position in user unit for cell positioning - * @access protected - */ - protected $y; - - /** - * @var height of last cell printed - * @access protected - */ - protected $lasth; - - /** - * @var line width in user unit - * @access protected - */ - protected $LineWidth; - - /** - * @var array of standard font names - * @access protected - */ - protected $CoreFonts; - - /** - * @var array of used fonts - * @access protected - */ - protected $fonts = array(); - - /** - * @var array of font files - * @access protected - */ - protected $FontFiles = array(); - - /** - * @var array of encoding differences - * @access protected - */ - protected $diffs = array(); - - /** - * @var array of used images - * @access protected - */ - protected $images = array(); - - /** - * @var array of Annotations in pages - * @access protected - */ - protected $PageAnnots = array(); - - /** - * @var array of internal links - * @access protected - */ - protected $links = array(); - - /** - * @var current font family - * @access protected - */ - protected $FontFamily; - - /** - * @var current font style - * @access protected - */ - protected $FontStyle; - - /** - * @var current font ascent (distance between font top and baseline) - * @access protected - * @since 2.8.000 (2007-03-29) - */ - protected $FontAscent; - - /** - * @var current font descent (distance between font bottom and baseline) - * @access protected - * @since 2.8.000 (2007-03-29) - */ - protected $FontDescent; - - /** - * @var underlining flag - * @access protected - */ - protected $underline; - - /** - * @var overlining flag - * @access protected - */ - protected $overline; - - /** - * @var current font info - * @access protected - */ - protected $CurrentFont; - - /** - * @var current font size in points - * @access protected - */ - protected $FontSizePt; - - /** - * @var current font size in user unit - * @access protected - */ - protected $FontSize; - - /** - * @var commands for drawing color - * @access protected - */ - protected $DrawColor; - - /** - * @var commands for filling color - * @access protected - */ - protected $FillColor; - - /** - * @var commands for text color - * @access protected - */ - protected $TextColor; - - /** - * @var indicates whether fill and text colors are different - * @access protected - */ - protected $ColorFlag; - - /** - * @var automatic page breaking - * @access protected - */ - protected $AutoPageBreak; - - /** - * @var threshold used to trigger page breaks - * @access protected - */ - protected $PageBreakTrigger; - - /** - * @var flag set when processing footer - * @access protected - */ - protected $InFooter = false; - - /** - * @var zoom display mode - * @access protected - */ - protected $ZoomMode; - - /** - * @var layout display mode - * @access protected - */ - protected $LayoutMode; - - /** - * @var title - * @access protected - */ - protected $title = ''; - - /** - * @var subject - * @access protected - */ - protected $subject = ''; - - /** - * @var author - * @access protected - */ - protected $author = ''; - - /** - * @var keywords - * @access protected - */ - protected $keywords = ''; - - /** - * @var creator - * @access protected - */ - protected $creator = ''; - - /** - * @var alias for total number of pages - * @access protected - */ - protected $AliasNbPages = '{nb}'; - - /** - * @var alias for page number - * @access protected - */ - protected $AliasNumPage = '{pnb}'; - - /** - * @var right-bottom corner X coordinate of inserted image - * @since 2002-07-31 - * @author Nicola Asuni - * @access protected - */ - protected $img_rb_x; - - /** - * @var right-bottom corner Y coordinate of inserted image - * @since 2002-07-31 - * @author Nicola Asuni - * @access protected - */ - protected $img_rb_y; - - /** - * @var adjusting factor to convert pixels to user units. - * @since 2004-06-14 - * @author Nicola Asuni - * @access protected - */ - protected $imgscale = 1; - - /** - * @var boolean set to true when the input text is unicode (require unicode fonts) - * @since 2005-01-02 - * @author Nicola Asuni - * @access protected - */ - protected $isunicode = false; - - /** - * @var object containing unicode data - * @since 5.9.004 (2010-10-18) - * @author Nicola Asuni - * @access protected - */ - protected $unicode; - - /** - * @var PDF version - * @since 1.5.3 - * @access protected - */ - protected $PDFVersion = '1.7'; - - /** - * @var Minimum distance between header and top page margin. - * @access protected - */ - protected $header_margin; - - /** - * @var Minimum distance between footer and bottom page margin. - * @access protected - */ - protected $footer_margin; - - /** - * @var original left margin value - * @access protected - * @since 1.53.0.TC013 - */ - protected $original_lMargin; - - /** - * @var original right margin value - * @access protected - * @since 1.53.0.TC013 - */ - protected $original_rMargin; - - /** - * @var Header font. - * @access protected - */ - protected $header_font; - - /** - * @var Footer font. - * @access protected - */ - protected $footer_font; - - /** - * @var Language templates. - * @access protected - */ - protected $l; - - /** - * @var Barcode to print on page footer (only if set). - * @access protected - */ - protected $barcode = false; - - /** - * @var If true prints header - * @access protected - */ - protected $print_header = true; - - /** - * @var If true prints footer. - * @access protected - */ - protected $print_footer = true; - - /** - * @var Header image logo. - * @access protected - */ - protected $header_logo = ''; - - /** - * @var Header image logo width in mm. - * @access protected - */ - protected $header_logo_width = 30; - - /** - * @var String to print as title on document header. - * @access protected - */ - protected $header_title = ''; - - /** - * @var String to print on document header. - * @access protected - */ - protected $header_string = ''; - - /** - * @var Default number of columns for html table. - * @access protected - */ - protected $default_table_columns = 4; - - // variables for html parser - - /** - * @var HTML PARSER: array to store current link and rendering styles. - * @access protected - */ - protected $HREF = array(); - - /** - * @var store a list of available fonts on filesystem. - * @access protected - */ - protected $fontlist = array(); - - /** - * @var current foreground color - * @access protected - */ - protected $fgcolor; - - /** - * @var HTML PARSER: array of boolean values, true in case of ordered list (OL), false otherwise. - * @access protected - */ - protected $listordered = array(); - - /** - * @var HTML PARSER: array count list items on nested lists. - * @access protected - */ - protected $listcount = array(); - - /** - * @var HTML PARSER: current list nesting level. - * @access protected - */ - protected $listnum = 0; - - /** - * @var HTML PARSER: indent amount for lists. - * @access protected - */ - protected $listindent = 0; - - /** - * @var HTML PARSER: current list indententation level. - * @access protected - */ - protected $listindentlevel = 0; - - /** - * @var current background color - * @access protected - */ - protected $bgcolor; - - /** - * @var Store temporary font size in points. - * @access protected - */ - protected $tempfontsize = 10; - - /** - * @var spacer for LI tags. - * @access protected - */ - protected $lispacer = ''; - - /** - * @var default encoding - * @access protected - * @since 1.53.0.TC010 - */ - protected $encoding = 'UTF-8'; - - /** - * @var PHP internal encoding - * @access protected - * @since 1.53.0.TC016 - */ - protected $internal_encoding; - - /** - * @var indicates if the document language is Right-To-Left - * @access protected - * @since 2.0.000 - */ - protected $rtl = false; - - /** - * @var used to force RTL or LTR string inversion - * @access protected - * @since 2.0.000 - */ - protected $tmprtl = false; - - // --- Variables used for document encryption: - - /** - * Indicates whether document is protected - * @access protected - * @since 2.0.000 (2008-01-02) - */ - protected $encrypted; - - /** - * Array containing encryption settings - * @access protected - * @since 5.0.005 (2010-05-11) - */ - protected $encryptdata = array(); - - /** - * last RC4 key encrypted (cached for optimisation) - * @access protected - * @since 2.0.000 (2008-01-02) - */ - protected $last_enc_key; - - /** - * last RC4 computed key - * @access protected - * @since 2.0.000 (2008-01-02) - */ - protected $last_enc_key_c; - - /** - * Encryption padding - * @access protected - */ - protected $enc_padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A"; - - /** - * File ID (used on trailer) - * @access protected - * @since 5.0.005 (2010-05-12) - */ - protected $file_id; - - // --- bookmark --- - - /** - * Outlines for bookmark - * @access protected - * @since 2.1.002 (2008-02-12) - */ - protected $outlines = array(); - - /** - * Outline root for bookmark - * @access protected - * @since 2.1.002 (2008-02-12) - */ - protected $OutlineRoot; - - // --- javascript and form --- - - /** - * javascript code - * @access protected - * @since 2.1.002 (2008-02-12) - */ - protected $javascript = ''; - - /** - * javascript counter - * @access protected - * @since 2.1.002 (2008-02-12) - */ - protected $n_js; - - /** - * line trough state - * @access protected - * @since 2.8.000 (2008-03-19) - */ - protected $linethrough; - - /** - * Array with additional document-wide usage rights for the document. - * @access protected - * @since 5.8.014 (2010-08-23) - */ - protected $ur = array(); - - /** - * Dot Per Inch Document Resolution (do not change) - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $dpi = 72; - - /** - * Array of page numbers were a new page group was started - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $newpagegroup = array(); - - /** - * Contains the number of pages of the groups - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $pagegroups; - - /** - * Contains the alias of the current page group - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $currpagegroup; - - /** - * Restrict the rendering of some elements to screen or printout. - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $visibility = 'all'; - - /** - * Print visibility. - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $n_ocg_print; - - /** - * View visibility. - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $n_ocg_view; - - /** - * Array of transparency objects and parameters. - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $extgstates; - - /** - * Set the default JPEG compression quality (1-100) - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected $jpeg_quality; - - /** - * Default cell height ratio. - * @access protected - * @since 3.0.014 (2008-05-23) - */ - protected $cell_height_ratio = K_CELL_HEIGHT_RATIO; - - /** - * PDF viewer preferences. - * @access protected - * @since 3.1.000 (2008-06-09) - */ - protected $viewer_preferences; - - /** - * A name object specifying how the document should be displayed when opened. - * @access protected - * @since 3.1.000 (2008-06-09) - */ - protected $PageMode; - - /** - * Array for storing gradient information. - * @access protected - * @since 3.1.000 (2008-06-09) - */ - protected $gradients = array(); - - /** - * Array used to store positions inside the pages buffer. - * keys are the page numbers - * @access protected - * @since 3.2.000 (2008-06-26) - */ - protected $intmrk = array(); - - /** - * Array used to store positions inside the pages buffer. - * keys are the page numbers - * @access protected - * @since 5.7.000 (2010-08-03) - */ - protected $bordermrk = array(); - - /** - * Array used to store page positions to track empty pages. - * keys are the page numbers - * @access protected - * @since 5.8.007 (2010-08-18) - */ - protected $emptypagemrk = array(); - - /** - * Array used to store content positions inside the pages buffer. - * keys are the page numbers - * @access protected - * @since 4.6.021 (2009-07-20) - */ - protected $cntmrk = array(); - - /** - * Array used to store footer positions of each page. - * @access protected - * @since 3.2.000 (2008-07-01) - */ - protected $footerpos = array(); - - /** - * Array used to store footer length of each page. - * @access protected - * @since 4.0.014 (2008-07-29) - */ - protected $footerlen = array(); - - /** - * True if a newline is created. - * @access protected - * @since 3.2.000 (2008-07-01) - */ - protected $newline = true; - - /** - * End position of the latest inserted line - * @access protected - * @since 3.2.000 (2008-07-01) - */ - protected $endlinex = 0; - - /** - * PDF string for last line width - * @access protected - * @since 4.0.006 (2008-07-16) - */ - protected $linestyleWidth = ''; - - /** - * PDF string for last line width - * @access protected - * @since 4.0.006 (2008-07-16) - */ - protected $linestyleCap = '0 J'; - - /** - * PDF string for last line width - * @access protected - * @since 4.0.006 (2008-07-16) - */ - protected $linestyleJoin = '0 j'; - - /** - * PDF string for last line width - * @access protected - * @since 4.0.006 (2008-07-16) - */ - protected $linestyleDash = '[] 0 d'; - - /** - * True if marked-content sequence is open - * @access protected - * @since 4.0.013 (2008-07-28) - */ - protected $openMarkedContent = false; - - /** - * Count the latest inserted vertical spaces on HTML - * @access protected - * @since 4.0.021 (2008-08-24) - */ - protected $htmlvspace = 0; - - /** - * Array of Spot colors - * @access protected - * @since 4.0.024 (2008-09-12) - */ - protected $spot_colors = array(); - - /** - * Symbol used for HTML unordered list items - * @access protected - * @since 4.0.028 (2008-09-26) - */ - protected $lisymbol = ''; - - /** - * String used to mark the beginning and end of EPS image blocks - * @access protected - * @since 4.1.000 (2008-10-18) - */ - protected $epsmarker = 'x#!#EPS#!#x'; - - /** - * Array of transformation matrix - * @access protected - * @since 4.2.000 (2008-10-29) - */ - protected $transfmatrix = array(); - - /** - * Current key for transformation matrix - * @access protected - * @since 4.8.005 (2009-09-17) - */ - protected $transfmatrix_key = 0; - - /** - * Booklet mode for double-sided pages - * @access protected - * @since 4.2.000 (2008-10-29) - */ - protected $booklet = false; - - /** - * Epsilon value used for float calculations - * @access protected - * @since 4.2.000 (2008-10-29) - */ - protected $feps = 0.005; - - /** - * Array used for custom vertical spaces for HTML tags - * @access protected - * @since 4.2.001 (2008-10-30) - */ - protected $tagvspaces = array(); - - /** - * @var HTML PARSER: custom indent amount for lists. - * Negative value means disabled. - * @access protected - * @since 4.2.007 (2008-11-12) - */ - protected $customlistindent = -1; - - /** - * @var if true keeps the border open for the cell sides that cross the page. - * @access protected - * @since 4.2.010 (2008-11-14) - */ - protected $opencell = true; - - /** - * @var array of files to embedd - * @access protected - * @since 4.4.000 (2008-12-07) - */ - protected $embeddedfiles = array(); - - /** - * @var boolean true when inside html pre tag - * @access protected - * @since 4.4.001 (2008-12-08) - */ - protected $premode = false; - - /** - * Array used to store positions of graphics transformation blocks inside the page buffer. - * keys are the page numbers - * @access protected - * @since 4.4.002 (2008-12-09) - */ - protected $transfmrk = array(); - - /** - * Default color for html links - * @access protected - * @since 4.4.003 (2008-12-09) - */ - protected $htmlLinkColorArray = array(0, 0, 255); - - /** - * Default font style to add to html links - * @access protected - * @since 4.4.003 (2008-12-09) - */ - protected $htmlLinkFontStyle = 'U'; - - /** - * Counts the number of pages. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected $numpages = 0; - - /** - * Array containing page lengths in bytes. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected $pagelen = array(); - - /** - * Counts the number of pages. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected $numimages = 0; - - /** - * Store the image keys. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected $imagekeys = array(); - - /** - * Length of the buffer in bytes. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected $bufferlen = 0; - - /** - * If true enables disk caching. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected $diskcache = false; - - /** - * Counts the number of fonts. - * @access protected - * @since 4.5.000 (2009-01-02) - */ - protected $numfonts = 0; - - /** - * Store the font keys. - * @access protected - * @since 4.5.000 (2009-01-02) - */ - protected $fontkeys = array(); - - /** - * Store the font object IDs. - * @access protected - * @since 4.8.001 (2009-09-09) - */ - protected $font_obj_ids = array(); - - /** - * Store the fage status (true when opened, false when closed). - * @access protected - * @since 4.5.000 (2009-01-02) - */ - protected $pageopen = array(); - - /** - * Default monospaced font - * @access protected - * @since 4.5.025 (2009-03-10) - */ - protected $default_monospaced_font = 'courier'; - - /** - * Used to store a cloned copy of the current class object - * @access protected - * @since 4.5.029 (2009-03-19) - */ - protected $objcopy; - - /** - * Array used to store the lengths of cache files - * @access protected - * @since 4.5.029 (2009-03-19) - */ - protected $cache_file_length = array(); - - /** - * Table header content to be repeated on each new page - * @access protected - * @since 4.5.030 (2009-03-20) - */ - protected $thead = ''; - - /** - * Margins used for table header. - * @access protected - * @since 4.5.030 (2009-03-20) - */ - protected $theadMargins = array(); - - /** - * Cache array for UTF8StringToArray() method. - * @access protected - * @since 4.5.037 (2009-04-07) - */ - protected $cache_UTF8StringToArray = array(); - - /** - * Maximum size of cache array used for UTF8StringToArray() method. - * @access protected - * @since 4.5.037 (2009-04-07) - */ - protected $cache_maxsize_UTF8StringToArray = 8; - - /** - * Current size of cache array used for UTF8StringToArray() method. - * @access protected - * @since 4.5.037 (2009-04-07) - */ - protected $cache_size_UTF8StringToArray = 0; - - /** - * If true enables document signing - * @access protected - * @since 4.6.005 (2009-04-24) - */ - protected $sign = false; - - /** - * Signature data - * @access protected - * @since 4.6.005 (2009-04-24) - */ - protected $signature_data = array(); - - /** - * Signature max length - * @access protected - * @since 4.6.005 (2009-04-24) - */ - protected $signature_max_length = 11742; - - /** - * data for signature appearance - * @access protected - * @since 5.3.011 (2010-06-16) - */ - protected $signature_appearance = array('page' => 1, 'rect' => '0 0 0 0'); - - /** - * Regular expression used to find blank characters used for word-wrapping. - * @access protected - * @since 4.6.006 (2009-04-28) - */ - protected $re_spaces = '/[^\S\xa0]/'; - - /** - * Array of parts $re_spaces - * @access protected - * @since 5.5.011 (2010-07-09) - */ - protected $re_space = array('p' => '[^\S\xa0]', 'm' => ''); - - /** - * Signature object ID - * @access protected - * @since 4.6.022 (2009-06-23) - */ - protected $sig_obj_id = 0; - - /** - * ByteRange placemark used during signature process. - * @access protected - * @since 4.6.028 (2009-08-25) - */ - protected $byterange_string = '/ByteRange[0 ********** ********** **********]'; - - /** - * Placemark used during signature process. - * @access protected - * @since 4.6.028 (2009-08-25) - */ - protected $sig_annot_ref = '***SIGANNREF*** 0 R'; - - /** - * ID of page objects - * @access protected - * @since 4.7.000 (2009-08-29) - */ - protected $page_obj_id = array(); - - /** - * List of form annotations IDs - * @access protected - * @since 4.8.000 (2009-09-07) - */ - protected $form_obj_id = array(); - - /** - * Deafult Javascript field properties. Possible values are described on official Javascript for Acrobat API reference. Annotation options can be directly specified using the 'aopt' entry. - * @access protected - * @since 4.8.000 (2009-09-07) - */ - protected $default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128)); - - /** - * Javascript objects array - * @access protected - * @since 4.8.000 (2009-09-07) - */ - protected $js_objects = array(); - - /** - * Current form action (used during XHTML rendering) - * @access protected - * @since 4.8.000 (2009-09-07) - */ - protected $form_action = ''; - - /** - * Current form encryption type (used during XHTML rendering) - * @access protected - * @since 4.8.000 (2009-09-07) - */ - protected $form_enctype = 'application/x-www-form-urlencoded'; - - /** - * Current method to submit forms. - * @access protected - * @since 4.8.000 (2009-09-07) - */ - protected $form_mode = 'post'; - - /** - * List of fonts used on form fields (fontname => fontkey). - * @access protected - * @since 4.8.001 (2009-09-09) - */ - protected $annotation_fonts = array(); - - /** - * List of radio buttons parent objects. - * @access protected - * @since 4.8.001 (2009-09-09) - */ - protected $radiobutton_groups = array(); - - /** - * List of radio group objects IDs - * @access protected - * @since 4.8.001 (2009-09-09) - */ - protected $radio_groups = array(); - - /** - * Text indentation value (used for text-indent CSS attribute) - * @access protected - * @since 4.8.006 (2009-09-23) - */ - protected $textindent = 0; - - /** - * Store page number when startTransaction() is called. - * @access protected - * @since 4.8.006 (2009-09-23) - */ - protected $start_transaction_page = 0; - - /** - * Store Y position when startTransaction() is called. - * @access protected - * @since 4.9.001 (2010-03-28) - */ - protected $start_transaction_y = 0; - - /** - * True when we are printing the thead section on a new page - * @access protected - * @since 4.8.027 (2010-01-25) - */ - protected $inthead = false; - - /** - * Array of column measures (width, space, starting Y position) - * @access protected - * @since 4.9.001 (2010-03-28) - */ - protected $columns = array(); - - /** - * Number of colums - * @access protected - * @since 4.9.001 (2010-03-28) - */ - protected $num_columns = 1; - - /** - * Current column number - * @access protected - * @since 4.9.001 (2010-03-28) - */ - protected $current_column = 0; - - /** - * Starting page for columns - * @access protected - * @since 4.9.001 (2010-03-28) - */ - protected $column_start_page = 0; - - /** - * Maximum page and column selected - * @access protected - * @since 5.8.000 (2010-08-11) - */ - protected $maxselcol = array('page' => 0, 'column' => 0); - - /** - * Array of: X difference between table cell x start and starting page margin, cellspacing, cellpadding - * @access protected - * @since 5.8.000 (2010-08-11) - */ - protected $colxshift = array('x' => 0, 's' => array('H' => 0, 'V' => 0), 'p' => array('L' => 0, 'T' => 0, 'R' => 0, 'B' => 0)); - - /** - * Text rendering mode: 0 = Fill text; 1 = Stroke text; 2 = Fill, then stroke text; 3 = Neither fill nor stroke text (invisible); 4 = Fill text and add to path for clipping; 5 = Stroke text and add to path for clipping; 6 = Fill, then stroke text and add to path for clipping; 7 = Add text to path for clipping. - * @access protected - * @since 4.9.008 (2010-04-03) - */ - protected $textrendermode = 0; - - /** - * Text stroke width in doc units - * @access protected - * @since 4.9.008 (2010-04-03) - */ - protected $textstrokewidth = 0; - - /** - * @var current stroke color - * @access protected - * @since 4.9.008 (2010-04-03) - */ - protected $strokecolor; - - /** - * @var default unit of measure for document - * @access protected - * @since 5.0.000 (2010-04-22) - */ - protected $pdfunit = 'mm'; - - /** - * @var true when we are on TOC (Table Of Content) page - * @access protected - */ - protected $tocpage = false; - - /** - * @var If true convert vector images (SVG, EPS) to raster image using GD or ImageMagick library. - * @access protected - * @since 5.0.000 (2010-04-26) - */ - protected $rasterize_vector_images = false; - - /** - * @var If true enables font subsetting by default - * @access protected - * @since 5.3.002 (2010-06-07) - */ - protected $font_subsetting = true; - - /** - * @var Array of default graphic settings - * @access protected - * @since 5.5.008 (2010-07-02) - */ - protected $default_graphic_vars = array(); - - /** - * @var Array of XObjects - * @access protected - * @since 5.8.014 (2010-08-23) - */ - protected $xobjects = array(); - - /** - * @var boolean true when we are inside an XObject - * @access protected - * @since 5.8.017 (2010-08-24) - */ - protected $inxobj = false; - - /** - * @var current XObject ID - * @access protected - * @since 5.8.017 (2010-08-24) - */ - protected $xobjid = ''; - - /** - * @var percentage of character stretching - * @access protected - * @since 5.9.000 (2010-09-29) - */ - protected $font_stretching = 100; - - /** - * @var increases or decreases the space between characters in a text by the specified amount (tracking/kerning). - * @access protected - * @since 5.9.000 (2010-09-29) - */ - protected $font_spacing = 0; - - /** - * @var array of no-write regions - * ('page' => page number or empy for current page, 'xt' => X top, 'yt' => Y top, 'xb' => X bottom, 'yb' => Y bottom, 'side' => page side 'L' = left or 'R' = right) - * @access protected - * @since 5.9.003 (2010-10-14) - */ - protected $page_regions = array(); - - /** - * @var array containing HTML color names and values - * @access protected - * @since 5.9.004 (2010-10-18) - */ - protected $webcolor = array(); - - /** - * @var directory used for the last SVG image - * @access protected - * @since 5.0.000 (2010-05-05) - */ - protected $svgdir = ''; - - /** - * @var Deafult unit of measure for SVG - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svgunit = 'px'; - - /** - * @var array of SVG gradients - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svggradients = array(); - - /** - * @var ID of last SVG gradient - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svggradientid = 0; - - /** - * @var true when in SVG defs group - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svgdefsmode = false; - - /** - * @var array of SVG defs - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svgdefs = array(); - - /** - * @var true when in SVG clipPath tag - * @access protected - * @since 5.0.000 (2010-04-26) - */ - protected $svgclipmode = false; - - /** - * @var array of SVG clipPath commands - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svgclippaths = array(); - - /** - * @var array of SVG clipPath tranformation matrix - * @access protected - * @since 5.8.022 (2010-08-31) - */ - protected $svgcliptm = array(); - - /** - * @var ID of last SVG clipPath - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svgclipid = 0; - - /** - * @var svg text - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svgtext = ''; - - /** - * @var svg text properties - * @access protected - * @since 5.8.013 (2010-08-23) - */ - protected $svgtextmode = array(); - - /** - * @var array of hinheritable SVG properties - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svginheritprop = array('clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cursor', 'direction', 'fill', 'fill-opacity', 'fill-rule', 'font', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'image-rendering', 'kerning', 'letter-spacing', 'marker', 'marker-end', 'marker-mid', 'marker-start', 'pointer-events', 'shape-rendering', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-rendering', 'visibility', 'word-spacing', 'writing-mode'); - - /** - * @var array of SVG properties - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected $svgstyles = array(array( - 'alignment-baseline' => 'auto', - 'baseline-shift' => 'baseline', - 'clip' => 'auto', - 'clip-path' => 'none', - 'clip-rule' => 'nonzero', - 'color' => 'black', - 'color-interpolation' => 'sRGB', - 'color-interpolation-filters' => 'linearRGB', - 'color-profile' => 'auto', - 'color-rendering' => 'auto', - 'cursor' => 'auto', - 'direction' => 'ltr', - 'display' => 'inline', - 'dominant-baseline' => 'auto', - 'enable-background' => 'accumulate', - 'fill' => 'black', - 'fill-opacity' => 1, - 'fill-rule' => 'nonzero', - 'filter' => 'none', - 'flood-color' => 'black', - 'flood-opacity' => 1, - 'font' => '', - 'font-family' => 'helvetica', - 'font-size' => 'medium', - 'font-size-adjust' => 'none', - 'font-stretch' => 'normal', - 'font-style' => 'normal', - 'font-variant' => 'normal', - 'font-weight' => 'normal', - 'glyph-orientation-horizontal' => '0deg', - 'glyph-orientation-vertical' => 'auto', - 'image-rendering' => 'auto', - 'kerning' => 'auto', - 'letter-spacing' => 'normal', - 'lighting-color' => 'white', - 'marker' => '', - 'marker-end' => 'none', - 'marker-mid' => 'none', - 'marker-start' => 'none', - 'mask' => 'none', - 'opacity' => 1, - 'overflow' => 'auto', - 'pointer-events' => 'visiblePainted', - 'shape-rendering' => 'auto', - 'stop-color' => 'black', - 'stop-opacity' => 1, - 'stroke' => 'none', - 'stroke-dasharray' => 'none', - 'stroke-dashoffset' => 0, - 'stroke-linecap' => 'butt', - 'stroke-linejoin' => 'miter', - 'stroke-miterlimit' => 4, - 'stroke-opacity' => 1, - 'stroke-width' => 1, - 'text-anchor' => 'start', - 'text-decoration' => 'none', - 'text-rendering' => 'auto', - 'unicode-bidi' => 'normal', - 'visibility' => 'visible', - 'word-spacing' => 'normal', - 'writing-mode' => 'lr-tb', - 'text-color' => 'black', - 'transfmatrix' => array(1, 0, 0, 1, 0, 0) - )); - - //------------------------------------------------------------ - // METHODS - //------------------------------------------------------------ - - /** - * This is the class constructor. - * It allows to set up the page format, the orientation and the measure unit used in all the methods (except for the font sizes). - * @param string $orientation page orientation. Possible values are (case insensitive):
    • P or Portrait (default)
    • L or Landscape
    • '' (empty string) for automatic orientation
    - * @param string $unit User measure unit. Possible values are:
    • pt: point
    • mm: millimeter (default)
    • cm: centimeter
    • in: inch

    A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit. - * @param mixed $format The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat(). - * @param boolean $unicode TRUE means that the input text is unicode (default = true) - * @param boolean $diskcache if TRUE reduce the RAM memory usage by caching temporary data on filesystem (slower). - * @param String $encoding charset encoding; default is UTF-8 - * @access public - * @see getPageSizeFromFormat(), setPageFormat() - */ - public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false) { - /* Set internal character encoding to ASCII */ - if (function_exists('mb_internal_encoding') AND mb_internal_encoding()) { - $this->internal_encoding = mb_internal_encoding(); - mb_internal_encoding('ASCII'); - } - require(dirname(__FILE__).'/htmlcolors.php'); - $this->webcolor = $webcolor; - require_once(dirname(__FILE__).'/unicode_data.php'); - $this->unicode = new TCPDF_UNICODE_DATA(); - $this->font_obj_ids = array(); - $this->page_obj_id = array(); - $this->form_obj_id = array(); - // set disk caching - $this->diskcache = $diskcache ? true : false; - // set language direction - $this->rtl = false; - $this->tmprtl = false; - // some checks - $this->_dochecks(); - // initialization of properties - $this->isunicode = $unicode; - $this->page = 0; - $this->transfmrk[0] = array(); - $this->pagedim = array(); - $this->n = 2; - $this->buffer = ''; - $this->pages = array(); - $this->state = 0; - $this->fonts = array(); - $this->FontFiles = array(); - $this->diffs = array(); - $this->images = array(); - $this->links = array(); - $this->gradients = array(); - $this->InFooter = false; - $this->lasth = 0; - $this->FontFamily = 'helvetica'; - $this->FontStyle = ''; - $this->FontSizePt = 12; - $this->underline = false; - $this->overline = false; - $this->linethrough = false; - $this->DrawColor = '0 G'; - $this->FillColor = '0 g'; - $this->TextColor = '0 g'; - $this->ColorFlag = false; - // encryption values - $this->encrypted = false; - $this->last_enc_key = ''; - // standard Unicode fonts - $this->CoreFonts = array( - 'courier'=>'Courier', - 'courierB'=>'Courier-Bold', - 'courierI'=>'Courier-Oblique', - 'courierBI'=>'Courier-BoldOblique', - 'helvetica'=>'Helvetica', - 'helveticaB'=>'Helvetica-Bold', - 'helveticaI'=>'Helvetica-Oblique', - 'helveticaBI'=>'Helvetica-BoldOblique', - 'times'=>'Times-Roman', - 'timesB'=>'Times-Bold', - 'timesI'=>'Times-Italic', - 'timesBI'=>'Times-BoldItalic', - 'symbol'=>'Symbol', - 'zapfdingbats'=>'ZapfDingbats' - ); - // set scale factor - $this->setPageUnit($unit); - // set page format and orientation - $this->setPageFormat($format, $orientation); - // page margins (1 cm) - $margin = 28.35 / $this->k; - $this->SetMargins($margin, $margin); - // internal cell padding - $cpadding = $margin / 10; - $this->setCellPaddings($cpadding, 0, $cpadding, 0); - // cell margins - $this->setCellMargins(0, 0, 0, 0); - // line width (0.2 mm) - $this->LineWidth = 0.57 / $this->k; - $this->linestyleWidth = sprintf('%.2F w', ($this->LineWidth * $this->k)); - $this->linestyleCap = '0 J'; - $this->linestyleJoin = '0 j'; - $this->linestyleDash = '[] 0 d'; - // automatic page break - $this->SetAutoPageBreak(true, (2 * $margin)); - // full width display mode - $this->SetDisplayMode('fullwidth'); - // compression - $this->SetCompression(true); - // set default PDF version number - $this->PDFVersion = '1.7'; - $this->encoding = $encoding; - $this->HREF = array(); - $this->getFontsList(); - $this->fgcolor = array('R' => 0, 'G' => 0, 'B' => 0); - $this->strokecolor = array('R' => 0, 'G' => 0, 'B' => 0); - $this->bgcolor = array('R' => 255, 'G' => 255, 'B' => 255); - $this->extgstates = array(); - // user's rights - $this->sign = false; - $this->ur['enabled'] = false; - $this->ur['document'] = '/FullSave'; - $this->ur['annots'] = '/Create/Delete/Modify/Copy/Import/Export'; - $this->ur['form'] = '/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate'; - $this->ur['signature'] = '/Modify'; - $this->ur['ef'] = '/Create/Delete/Modify/Import'; - $this->ur['formex'] = ''; - $this->signature_appearance = array('page' => 1, 'rect' => '0 0 0 0'); - // set default JPEG quality - $this->jpeg_quality = 75; - // initialize some settings - $this->utf8Bidi(array(''), ''); - // set default font - $this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt); - // check if PCRE Unicode support is enabled - if ($this->isunicode AND (@preg_match('/\pL/u', 'a') == 1)) { - // PCRE unicode support is turned ON - // \p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator. - // \p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants. - // \p{Lo} is needed because Chinese characters are packed next to each other without spaces in between. - //$this->setSpacesRE('/[^\S\P{Z}\P{Lo}\xa0]/u'); - $this->setSpacesRE('/[^\S\P{Z}\xa0]/u'); - } else { - // PCRE unicode support is turned OFF - $this->setSpacesRE('/[^\S\xa0]/'); - } - $this->default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128)); - // set file ID for trailer - $this->file_id = md5($this->getRandomSeed('TCPDF'.$orientation.$unit.$format.$encoding)); - // get default graphic vars - $this->default_graphic_vars = $this->getGraphicVars(); - } - - /** - * Default destructor. - * @access public - * @since 1.53.0.TC016 - */ - public function __destruct() { - // restore internal encoding - if (isset($this->internal_encoding) AND !empty($this->internal_encoding)) { - mb_internal_encoding($this->internal_encoding); - } - // unset all class variables - $this->_destroy(true); - } - - /** - * Set the units of measure for the document. - * @param string $unit User measure unit. Possible values are:
    • pt: point
    • mm: millimeter (default)
    • cm: centimeter
    • in: inch

    A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit. - * @access public - * @since 3.0.015 (2008-06-06) - */ - public function setPageUnit($unit) { - $unit = strtolower($unit); - //Set scale factor - switch ($unit) { - // points - case 'px': - case 'pt': { - $this->k = 1; - break; - } - // millimeters - case 'mm': { - $this->k = $this->dpi / 25.4; - break; - } - // centimeters - case 'cm': { - $this->k = $this->dpi / 2.54; - break; - } - // inches - case 'in': { - $this->k = $this->dpi; - break; - } - // unsupported unit - default : { - $this->Error('Incorrect unit: '.$unit); - break; - } - } - $this->pdfunit = $unit; - if (isset($this->CurOrientation)) { - $this->setPageOrientation($this->CurOrientation); - } - } - - /** - * Get page dimensions from format name. - * @param mixed $format The format name. It can be:
      - *
    • ISO 216 A Series + 2 SIS 014711 extensions
    • - *
    • A0 (841x1189 mm ; 33.11x46.81 in)
    • - *
    • A1 (594x841 mm ; 23.39x33.11 in)
    • - *
    • A2 (420x594 mm ; 16.54x23.39 in)
    • - *
    • A3 (297x420 mm ; 11.69x16.54 in)
    • - *
    • A4 (210x297 mm ; 8.27x11.69 in)
    • - *
    • A5 (148x210 mm ; 5.83x8.27 in)
    • - *
    • A6 (105x148 mm ; 4.13x5.83 in)
    • - *
    • A7 (74x105 mm ; 2.91x4.13 in)
    • - *
    • A8 (52x74 mm ; 2.05x2.91 in)
    • - *
    • A9 (37x52 mm ; 1.46x2.05 in)
    • - *
    • A10 (26x37 mm ; 1.02x1.46 in)
    • - *
    • A11 (18x26 mm ; 0.71x1.02 in)
    • - *
    • A12 (13x18 mm ; 0.51x0.71 in)
    • - *
    • ISO 216 B Series + 2 SIS 014711 extensions
    • - *
    • B0 (1000x1414 mm ; 39.37x55.67 in)
    • - *
    • B1 (707x1000 mm ; 27.83x39.37 in)
    • - *
    • B2 (500x707 mm ; 19.69x27.83 in)
    • - *
    • B3 (353x500 mm ; 13.90x19.69 in)
    • - *
    • B4 (250x353 mm ; 9.84x13.90 in)
    • - *
    • B5 (176x250 mm ; 6.93x9.84 in)
    • - *
    • B6 (125x176 mm ; 4.92x6.93 in)
    • - *
    • B7 (88x125 mm ; 3.46x4.92 in)
    • - *
    • B8 (62x88 mm ; 2.44x3.46 in)
    • - *
    • B9 (44x62 mm ; 1.73x2.44 in)
    • - *
    • B10 (31x44 mm ; 1.22x1.73 in)
    • - *
    • B11 (22x31 mm ; 0.87x1.22 in)
    • - *
    • B12 (15x22 mm ; 0.59x0.87 in)
    • - *
    • ISO 216 C Series + 2 SIS 014711 extensions + 2 EXTENSION
    • - *
    • C0 (917x1297 mm ; 36.10x51.06 in)
    • - *
    • C1 (648x917 mm ; 25.51x36.10 in)
    • - *
    • C2 (458x648 mm ; 18.03x25.51 in)
    • - *
    • C3 (324x458 mm ; 12.76x18.03 in)
    • - *
    • C4 (229x324 mm ; 9.02x12.76 in)
    • - *
    • C5 (162x229 mm ; 6.38x9.02 in)
    • - *
    • C6 (114x162 mm ; 4.49x6.38 in)
    • - *
    • C7 (81x114 mm ; 3.19x4.49 in)
    • - *
    • C8 (57x81 mm ; 2.24x3.19 in)
    • - *
    • C9 (40x57 mm ; 1.57x2.24 in)
    • - *
    • C10 (28x40 mm ; 1.10x1.57 in)
    • - *
    • C11 (20x28 mm ; 0.79x1.10 in)
    • - *
    • C12 (14x20 mm ; 0.55x0.79 in)
    • - *
    • C76 (81x162 mm ; 3.19x6.38 in)
    • - *
    • DL (110x220 mm ; 4.33x8.66 in)
    • - *
    • SIS 014711 E Series
    • - *
    • E0 (879x1241 mm ; 34.61x48.86 in)
    • - *
    • E1 (620x879 mm ; 24.41x34.61 in)
    • - *
    • E2 (440x620 mm ; 17.32x24.41 in)
    • - *
    • E3 (310x440 mm ; 12.20x17.32 in)
    • - *
    • E4 (220x310 mm ; 8.66x12.20 in)
    • - *
    • E5 (155x220 mm ; 6.10x8.66 in)
    • - *
    • E6 (110x155 mm ; 4.33x6.10 in)
    • - *
    • E7 (78x110 mm ; 3.07x4.33 in)
    • - *
    • E8 (55x78 mm ; 2.17x3.07 in)
    • - *
    • E9 (39x55 mm ; 1.54x2.17 in)
    • - *
    • E10 (27x39 mm ; 1.06x1.54 in)
    • - *
    • E11 (19x27 mm ; 0.75x1.06 in)
    • - *
    • E12 (13x19 mm ; 0.51x0.75 in)
    • - *
    • SIS 014711 G Series
    • - *
    • G0 (958x1354 mm ; 37.72x53.31 in)
    • - *
    • G1 (677x958 mm ; 26.65x37.72 in)
    • - *
    • G2 (479x677 mm ; 18.86x26.65 in)
    • - *
    • G3 (338x479 mm ; 13.31x18.86 in)
    • - *
    • G4 (239x338 mm ; 9.41x13.31 in)
    • - *
    • G5 (169x239 mm ; 6.65x9.41 in)
    • - *
    • G6 (119x169 mm ; 4.69x6.65 in)
    • - *
    • G7 (84x119 mm ; 3.31x4.69 in)
    • - *
    • G8 (59x84 mm ; 2.32x3.31 in)
    • - *
    • G9 (42x59 mm ; 1.65x2.32 in)
    • - *
    • G10 (29x42 mm ; 1.14x1.65 in)
    • - *
    • G11 (21x29 mm ; 0.83x1.14 in)
    • - *
    • G12 (14x21 mm ; 0.55x0.83 in)
    • - *
    • ISO Press
    • - *
    • RA0 (860x1220 mm ; 33.86x48.03 in)
    • - *
    • RA1 (610x860 mm ; 24.02x33.86 in)
    • - *
    • RA2 (430x610 mm ; 16.93x24.02 in)
    • - *
    • RA3 (305x430 mm ; 12.01x16.93 in)
    • - *
    • RA4 (215x305 mm ; 8.46x12.01 in)
    • - *
    • SRA0 (900x1280 mm ; 35.43x50.39 in)
    • - *
    • SRA1 (640x900 mm ; 25.20x35.43 in)
    • - *
    • SRA2 (450x640 mm ; 17.72x25.20 in)
    • - *
    • SRA3 (320x450 mm ; 12.60x17.72 in)
    • - *
    • SRA4 (225x320 mm ; 8.86x12.60 in)
    • - *
    • German DIN 476
    • - *
    • 4A0 (1682x2378 mm ; 66.22x93.62 in)
    • - *
    • 2A0 (1189x1682 mm ; 46.81x66.22 in)
    • - *
    • Variations on the ISO Standard
    • - *
    • A2_EXTRA (445x619 mm ; 17.52x24.37 in)
    • - *
    • A3+ (329x483 mm ; 12.95x19.02 in)
    • - *
    • A3_EXTRA (322x445 mm ; 12.68x17.52 in)
    • - *
    • A3_SUPER (305x508 mm ; 12.01x20.00 in)
    • - *
    • SUPER_A3 (305x487 mm ; 12.01x19.17 in)
    • - *
    • A4_EXTRA (235x322 mm ; 9.25x12.68 in)
    • - *
    • A4_SUPER (229x322 mm ; 9.02x12.68 in)
    • - *
    • SUPER_A4 (227x356 mm ; 8.94x14.02 in)
    • - *
    • A4_LONG (210x348 mm ; 8.27x13.70 in)
    • - *
    • F4 (210x330 mm ; 8.27x12.99 in)
    • - *
    • SO_B5_EXTRA (202x276 mm ; 7.95x10.87 in)
    • - *
    • A5_EXTRA (173x235 mm ; 6.81x9.25 in)
    • - *
    • ANSI Series
    • - *
    • ANSI_E (864x1118 mm ; 34.00x44.00 in)
    • - *
    • ANSI_D (559x864 mm ; 22.00x34.00 in)
    • - *
    • ANSI_C (432x559 mm ; 17.00x22.00 in)
    • - *
    • ANSI_B (279x432 mm ; 11.00x17.00 in)
    • - *
    • ANSI_A (216x279 mm ; 8.50x11.00 in)
    • - *
    • Traditional 'Loose' North American Paper Sizes
    • - *
    • LEDGER, USLEDGER (432x279 mm ; 17.00x11.00 in)
    • - *
    • TABLOID, USTABLOID, BIBLE, ORGANIZERK (279x432 mm ; 11.00x17.00 in)
    • - *
    • LETTER, USLETTER, ORGANIZERM (216x279 mm ; 8.50x11.00 in)
    • - *
    • LEGAL, USLEGAL (216x356 mm ; 8.50x14.00 in)
    • - *
    • GLETTER, GOVERNMENTLETTER (203x267 mm ; 8.00x10.50 in)
    • - *
    • JLEGAL, JUNIORLEGAL (203x127 mm ; 8.00x5.00 in)
    • - *
    • Other North American Paper Sizes
    • - *
    • QUADDEMY (889x1143 mm ; 35.00x45.00 in)
    • - *
    • SUPER_B (330x483 mm ; 13.00x19.00 in)
    • - *
    • QUARTO (229x279 mm ; 9.00x11.00 in)
    • - *
    • FOLIO, GOVERNMENTLEGAL (216x330 mm ; 8.50x13.00 in)
    • - *
    • EXECUTIVE, MONARCH (184x267 mm ; 7.25x10.50 in)
    • - *
    • MEMO, STATEMENT, ORGANIZERL (140x216 mm ; 5.50x8.50 in)
    • - *
    • FOOLSCAP (210x330 mm ; 8.27x13.00 in)
    • - *
    • COMPACT (108x171 mm ; 4.25x6.75 in)
    • - *
    • ORGANIZERJ (70x127 mm ; 2.75x5.00 in)
    • - *
    • Canadian standard CAN 2-9.60M
    • - *
    • P1 (560x860 mm ; 22.05x33.86 in)
    • - *
    • P2 (430x560 mm ; 16.93x22.05 in)
    • - *
    • P3 (280x430 mm ; 11.02x16.93 in)
    • - *
    • P4 (215x280 mm ; 8.46x11.02 in)
    • - *
    • P5 (140x215 mm ; 5.51x8.46 in)
    • - *
    • P6 (107x140 mm ; 4.21x5.51 in)
    • - *
    • North American Architectural Sizes
    • - *
    • ARCH_E (914x1219 mm ; 36.00x48.00 in)
    • - *
    • ARCH_E1 (762x1067 mm ; 30.00x42.00 in)
    • - *
    • ARCH_D (610x914 mm ; 24.00x36.00 in)
    • - *
    • ARCH_C, BROADSHEET (457x610 mm ; 18.00x24.00 in)
    • - *
    • ARCH_B (305x457 mm ; 12.00x18.00 in)
    • - *
    • ARCH_A (229x305 mm ; 9.00x12.00 in)
    • - *
    • Announcement Envelopes
    • - *
    • ANNENV_A2 (111x146 mm ; 4.37x5.75 in)
    • - *
    • ANNENV_A6 (121x165 mm ; 4.75x6.50 in)
    • - *
    • ANNENV_A7 (133x184 mm ; 5.25x7.25 in)
    • - *
    • ANNENV_A8 (140x206 mm ; 5.50x8.12 in)
    • - *
    • ANNENV_A10 (159x244 mm ; 6.25x9.62 in)
    • - *
    • ANNENV_SLIM (98x225 mm ; 3.87x8.87 in)
    • - *
    • Commercial Envelopes
    • - *
    • COMMENV_N6_1/4 (89x152 mm ; 3.50x6.00 in)
    • - *
    • COMMENV_N6_3/4 (92x165 mm ; 3.62x6.50 in)
    • - *
    • COMMENV_N8 (98x191 mm ; 3.87x7.50 in)
    • - *
    • COMMENV_N9 (98x225 mm ; 3.87x8.87 in)
    • - *
    • COMMENV_N10 (105x241 mm ; 4.12x9.50 in)
    • - *
    • COMMENV_N11 (114x263 mm ; 4.50x10.37 in)
    • - *
    • COMMENV_N12 (121x279 mm ; 4.75x11.00 in)
    • - *
    • COMMENV_N14 (127x292 mm ; 5.00x11.50 in)
    • - *
    • Catalogue Envelopes
    • - *
    • CATENV_N1 (152x229 mm ; 6.00x9.00 in)
    • - *
    • CATENV_N1_3/4 (165x241 mm ; 6.50x9.50 in)
    • - *
    • CATENV_N2 (165x254 mm ; 6.50x10.00 in)
    • - *
    • CATENV_N3 (178x254 mm ; 7.00x10.00 in)
    • - *
    • CATENV_N6 (191x267 mm ; 7.50x10.50 in)
    • - *
    • CATENV_N7 (203x279 mm ; 8.00x11.00 in)
    • - *
    • CATENV_N8 (210x286 mm ; 8.25x11.25 in)
    • - *
    • CATENV_N9_1/2 (216x267 mm ; 8.50x10.50 in)
    • - *
    • CATENV_N9_3/4 (222x286 mm ; 8.75x11.25 in)
    • - *
    • CATENV_N10_1/2 (229x305 mm ; 9.00x12.00 in)
    • - *
    • CATENV_N12_1/2 (241x318 mm ; 9.50x12.50 in)
    • - *
    • CATENV_N13_1/2 (254x330 mm ; 10.00x13.00 in)
    • - *
    • CATENV_N14_1/4 (286x311 mm ; 11.25x12.25 in)
    • - *
    • CATENV_N14_1/2 (292x368 mm ; 11.50x14.50 in)
    • - *
    • Japanese (JIS P 0138-61) Standard B-Series
    • - *
    • JIS_B0 (1030x1456 mm ; 40.55x57.32 in)
    • - *
    • JIS_B1 (728x1030 mm ; 28.66x40.55 in)
    • - *
    • JIS_B2 (515x728 mm ; 20.28x28.66 in)
    • - *
    • JIS_B3 (364x515 mm ; 14.33x20.28 in)
    • - *
    • JIS_B4 (257x364 mm ; 10.12x14.33 in)
    • - *
    • JIS_B5 (182x257 mm ; 7.17x10.12 in)
    • - *
    • JIS_B6 (128x182 mm ; 5.04x7.17 in)
    • - *
    • JIS_B7 (91x128 mm ; 3.58x5.04 in)
    • - *
    • JIS_B8 (64x91 mm ; 2.52x3.58 in)
    • - *
    • JIS_B9 (45x64 mm ; 1.77x2.52 in)
    • - *
    • JIS_B10 (32x45 mm ; 1.26x1.77 in)
    • - *
    • JIS_B11 (22x32 mm ; 0.87x1.26 in)
    • - *
    • JIS_B12 (16x22 mm ; 0.63x0.87 in)
    • - *
    • PA Series
    • - *
    • PA0 (840x1120 mm ; 33.07x44.09 in)
    • - *
    • PA1 (560x840 mm ; 22.05x33.07 in)
    • - *
    • PA2 (420x560 mm ; 16.54x22.05 in)
    • - *
    • PA3 (280x420 mm ; 11.02x16.54 in)
    • - *
    • PA4 (210x280 mm ; 8.27x11.02 in)
    • - *
    • PA5 (140x210 mm ; 5.51x8.27 in)
    • - *
    • PA6 (105x140 mm ; 4.13x5.51 in)
    • - *
    • PA7 (70x105 mm ; 2.76x4.13 in)
    • - *
    • PA8 (52x70 mm ; 2.05x2.76 in)
    • - *
    • PA9 (35x52 mm ; 1.38x2.05 in)
    • - *
    • PA10 (26x35 mm ; 1.02x1.38 in)
    • - *
    • Standard Photographic Print Sizes
    • - *
    • PASSPORT_PHOTO (35x45 mm ; 1.38x1.77 in)
    • - *
    • E (82x120 mm ; 3.25x4.72 in)
    • - *
    • 3R, L (89x127 mm ; 3.50x5.00 in)
    • - *
    • 4R, KG (102x152 mm ; 4.02x5.98 in)
    • - *
    • 4D (120x152 mm ; 4.72x5.98 in)
    • - *
    • 5R, 2L (127x178 mm ; 5.00x7.01 in)
    • - *
    • 6R, 8P (152x203 mm ; 5.98x7.99 in)
    • - *
    • 8R, 6P (203x254 mm ; 7.99x10.00 in)
    • - *
    • S8R, 6PW (203x305 mm ; 7.99x12.01 in)
    • - *
    • 10R, 4P (254x305 mm ; 10.00x12.01 in)
    • - *
    • S10R, 4PW (254x381 mm ; 10.00x15.00 in)
    • - *
    • 11R (279x356 mm ; 10.98x14.02 in)
    • - *
    • S11R (279x432 mm ; 10.98x17.01 in)
    • - *
    • 12R (305x381 mm ; 12.01x15.00 in)
    • - *
    • S12R (305x456 mm ; 12.01x17.95 in)
    • - *
    • Common Newspaper Sizes
    • - *
    • NEWSPAPER_BROADSHEET (750x600 mm ; 29.53x23.62 in)
    • - *
    • NEWSPAPER_BERLINER (470x315 mm ; 18.50x12.40 in)
    • - *
    • NEWSPAPER_COMPACT, NEWSPAPER_TABLOID (430x280 mm ; 16.93x11.02 in)
    • - *
    • Business Cards
    • - *
    • CREDIT_CARD, BUSINESS_CARD, BUSINESS_CARD_ISO7810 (54x86 mm ; 2.13x3.37 in)
    • - *
    • BUSINESS_CARD_ISO216 (52x74 mm ; 2.05x2.91 in)
    • - *
    • BUSINESS_CARD_IT, BUSINESS_CARD_UK, BUSINESS_CARD_FR, BUSINESS_CARD_DE, BUSINESS_CARD_ES (55x85 mm ; 2.17x3.35 in)
    • - *
    • BUSINESS_CARD_US, BUSINESS_CARD_CA (51x89 mm ; 2.01x3.50 in)
    • - *
    • BUSINESS_CARD_JP (55x91 mm ; 2.17x3.58 in)
    • - *
    • BUSINESS_CARD_HK (54x90 mm ; 2.13x3.54 in)
    • - *
    • BUSINESS_CARD_AU, BUSINESS_CARD_DK, BUSINESS_CARD_SE (55x90 mm ; 2.17x3.54 in)
    • - *
    • BUSINESS_CARD_RU, BUSINESS_CARD_CZ, BUSINESS_CARD_FI, BUSINESS_CARD_HU, BUSINESS_CARD_IL (50x90 mm ; 1.97x3.54 in)
    • - *
    • Billboards
    • - *
    • 4SHEET (1016x1524 mm ; 40.00x60.00 in)
    • - *
    • 6SHEET (1200x1800 mm ; 47.24x70.87 in)
    • - *
    • 12SHEET (3048x1524 mm ; 120.00x60.00 in)
    • - *
    • 16SHEET (2032x3048 mm ; 80.00x120.00 in)
    • - *
    • 32SHEET (4064x3048 mm ; 160.00x120.00 in)
    • - *
    • 48SHEET (6096x3048 mm ; 240.00x120.00 in)
    • - *
    • 64SHEET (8128x3048 mm ; 320.00x120.00 in)
    • - *
    • 96SHEET (12192x3048 mm ; 480.00x120.00 in)
    • - *
    • Old Imperial English (some are still used in USA)
    • - *
    • EN_EMPEROR (1219x1829 mm ; 48.00x72.00 in)
    • - *
    • EN_ANTIQUARIAN (787x1346 mm ; 31.00x53.00 in)
    • - *
    • EN_GRAND_EAGLE (730x1067 mm ; 28.75x42.00 in)
    • - *
    • EN_DOUBLE_ELEPHANT (679x1016 mm ; 26.75x40.00 in)
    • - *
    • EN_ATLAS (660x864 mm ; 26.00x34.00 in)
    • - *
    • EN_COLOMBIER (597x876 mm ; 23.50x34.50 in)
    • - *
    • EN_ELEPHANT (584x711 mm ; 23.00x28.00 in)
    • - *
    • EN_DOUBLE_DEMY (572x902 mm ; 22.50x35.50 in)
    • - *
    • EN_IMPERIAL (559x762 mm ; 22.00x30.00 in)
    • - *
    • EN_PRINCESS (546x711 mm ; 21.50x28.00 in)
    • - *
    • EN_CARTRIDGE (533x660 mm ; 21.00x26.00 in)
    • - *
    • EN_DOUBLE_LARGE_POST (533x838 mm ; 21.00x33.00 in)
    • - *
    • EN_ROYAL (508x635 mm ; 20.00x25.00 in)
    • - *
    • EN_SHEET, EN_HALF_POST (495x597 mm ; 19.50x23.50 in)
    • - *
    • EN_SUPER_ROYAL (483x686 mm ; 19.00x27.00 in)
    • - *
    • EN_DOUBLE_POST (483x775 mm ; 19.00x30.50 in)
    • - *
    • EN_MEDIUM (445x584 mm ; 17.50x23.00 in)
    • - *
    • EN_DEMY (445x572 mm ; 17.50x22.50 in)
    • - *
    • EN_LARGE_POST (419x533 mm ; 16.50x21.00 in)
    • - *
    • EN_COPY_DRAUGHT (406x508 mm ; 16.00x20.00 in)
    • - *
    • EN_POST (394x489 mm ; 15.50x19.25 in)
    • - *
    • EN_CROWN (381x508 mm ; 15.00x20.00 in)
    • - *
    • EN_PINCHED_POST (375x470 mm ; 14.75x18.50 in)
    • - *
    • EN_BRIEF (343x406 mm ; 13.50x16.00 in)
    • - *
    • EN_FOOLSCAP (343x432 mm ; 13.50x17.00 in)
    • - *
    • EN_SMALL_FOOLSCAP (337x419 mm ; 13.25x16.50 in)
    • - *
    • EN_POTT (318x381 mm ; 12.50x15.00 in)
    • - *
    • Old Imperial Belgian
    • - *
    • BE_GRAND_AIGLE (700x1040 mm ; 27.56x40.94 in)
    • - *
    • BE_COLOMBIER (620x850 mm ; 24.41x33.46 in)
    • - *
    • BE_DOUBLE_CARRE (620x920 mm ; 24.41x36.22 in)
    • - *
    • BE_ELEPHANT (616x770 mm ; 24.25x30.31 in)
    • - *
    • BE_PETIT_AIGLE (600x840 mm ; 23.62x33.07 in)
    • - *
    • BE_GRAND_JESUS (550x730 mm ; 21.65x28.74 in)
    • - *
    • BE_JESUS (540x730 mm ; 21.26x28.74 in)
    • - *
    • BE_RAISIN (500x650 mm ; 19.69x25.59 in)
    • - *
    • BE_GRAND_MEDIAN (460x605 mm ; 18.11x23.82 in)
    • - *
    • BE_DOUBLE_POSTE (435x565 mm ; 17.13x22.24 in)
    • - *
    • BE_COQUILLE (430x560 mm ; 16.93x22.05 in)
    • - *
    • BE_PETIT_MEDIAN (415x530 mm ; 16.34x20.87 in)
    • - *
    • BE_RUCHE (360x460 mm ; 14.17x18.11 in)
    • - *
    • BE_PROPATRIA (345x430 mm ; 13.58x16.93 in)
    • - *
    • BE_LYS (317x397 mm ; 12.48x15.63 in)
    • - *
    • BE_POT (307x384 mm ; 12.09x15.12 in)
    • - *
    • BE_ROSETTE (270x347 mm ; 10.63x13.66 in)
    • - *
    • Old Imperial French
    • - *
    • FR_UNIVERS (1000x1300 mm ; 39.37x51.18 in)
    • - *
    • FR_DOUBLE_COLOMBIER (900x1260 mm ; 35.43x49.61 in)
    • - *
    • FR_GRANDE_MONDE (900x1260 mm ; 35.43x49.61 in)
    • - *
    • FR_DOUBLE_SOLEIL (800x1200 mm ; 31.50x47.24 in)
    • - *
    • FR_DOUBLE_JESUS (760x1120 mm ; 29.92x44.09 in)
    • - *
    • FR_GRAND_AIGLE (750x1060 mm ; 29.53x41.73 in)
    • - *
    • FR_PETIT_AIGLE (700x940 mm ; 27.56x37.01 in)
    • - *
    • FR_DOUBLE_RAISIN (650x1000 mm ; 25.59x39.37 in)
    • - *
    • FR_JOURNAL (650x940 mm ; 25.59x37.01 in)
    • - *
    • FR_COLOMBIER_AFFICHE (630x900 mm ; 24.80x35.43 in)
    • - *
    • FR_DOUBLE_CAVALIER (620x920 mm ; 24.41x36.22 in)
    • - *
    • FR_CLOCHE (600x800 mm ; 23.62x31.50 in)
    • - *
    • FR_SOLEIL (600x800 mm ; 23.62x31.50 in)
    • - *
    • FR_DOUBLE_CARRE (560x900 mm ; 22.05x35.43 in)
    • - *
    • FR_DOUBLE_COQUILLE (560x880 mm ; 22.05x34.65 in)
    • - *
    • FR_JESUS (560x760 mm ; 22.05x29.92 in)
    • - *
    • FR_RAISIN (500x650 mm ; 19.69x25.59 in)
    • - *
    • FR_CAVALIER (460x620 mm ; 18.11x24.41 in)
    • - *
    • FR_DOUBLE_COURONNE (460x720 mm ; 18.11x28.35 in)
    • - *
    • FR_CARRE (450x560 mm ; 17.72x22.05 in)
    • - *
    • FR_COQUILLE (440x560 mm ; 17.32x22.05 in)
    • - *
    • FR_DOUBLE_TELLIERE (440x680 mm ; 17.32x26.77 in)
    • - *
    • FR_DOUBLE_CLOCHE (400x600 mm ; 15.75x23.62 in)
    • - *
    • FR_DOUBLE_POT (400x620 mm ; 15.75x24.41 in)
    • - *
    • FR_ECU (400x520 mm ; 15.75x20.47 in)
    • - *
    • FR_COURONNE (360x460 mm ; 14.17x18.11 in)
    • - *
    • FR_TELLIERE (340x440 mm ; 13.39x17.32 in)
    • - *
    • FR_POT (310x400 mm ; 12.20x15.75 in)
    • - *
    - * @return array containing page width and height in points - * @access public - * @since 5.0.010 (2010-05-17) - */ - public function getPageSizeFromFormat($format) { - // Paper cordinates are calculated in this way: (inches * 72) where (1 inch = 25.4 mm) - switch (strtoupper($format)) { - // ISO 216 A Series + 2 SIS 014711 extensions - case 'A0' : {$pf = array( 2383.937, 3370.394); break;} - case 'A1' : {$pf = array( 1683.780, 2383.937); break;} - case 'A2' : {$pf = array( 1190.551, 1683.780); break;} - case 'A3' : {$pf = array( 841.890, 1190.551); break;} - case 'A4' : {$pf = array( 595.276, 841.890); break;} - case 'A5' : {$pf = array( 419.528, 595.276); break;} - case 'A6' : {$pf = array( 297.638, 419.528); break;} - case 'A7' : {$pf = array( 209.764, 297.638); break;} - case 'A8' : {$pf = array( 147.402, 209.764); break;} - case 'A9' : {$pf = array( 104.882, 147.402); break;} - case 'A10': {$pf = array( 73.701, 104.882); break;} - case 'A11': {$pf = array( 51.024, 73.701); break;} - case 'A12': {$pf = array( 36.850, 51.024); break;} - // ISO 216 B Series + 2 SIS 014711 extensions - case 'B0' : {$pf = array( 2834.646, 4008.189); break;} - case 'B1' : {$pf = array( 2004.094, 2834.646); break;} - case 'B2' : {$pf = array( 1417.323, 2004.094); break;} - case 'B3' : {$pf = array( 1000.630, 1417.323); break;} - case 'B4' : {$pf = array( 708.661, 1000.630); break;} - case 'B5' : {$pf = array( 498.898, 708.661); break;} - case 'B6' : {$pf = array( 354.331, 498.898); break;} - case 'B7' : {$pf = array( 249.449, 354.331); break;} - case 'B8' : {$pf = array( 175.748, 249.449); break;} - case 'B9' : {$pf = array( 124.724, 175.748); break;} - case 'B10': {$pf = array( 87.874, 124.724); break;} - case 'B11': {$pf = array( 62.362, 87.874); break;} - case 'B12': {$pf = array( 42.520, 62.362); break;} - // ISO 216 C Series + 2 SIS 014711 extensions + 2 EXTENSION - case 'C0' : {$pf = array( 2599.370, 3676.535); break;} - case 'C1' : {$pf = array( 1836.850, 2599.370); break;} - case 'C2' : {$pf = array( 1298.268, 1836.850); break;} - case 'C3' : {$pf = array( 918.425, 1298.268); break;} - case 'C4' : {$pf = array( 649.134, 918.425); break;} - case 'C5' : {$pf = array( 459.213, 649.134); break;} - case 'C6' : {$pf = array( 323.150, 459.213); break;} - case 'C7' : {$pf = array( 229.606, 323.150); break;} - case 'C8' : {$pf = array( 161.575, 229.606); break;} - case 'C9' : {$pf = array( 113.386, 161.575); break;} - case 'C10': {$pf = array( 79.370, 113.386); break;} - case 'C11': {$pf = array( 56.693, 79.370); break;} - case 'C12': {$pf = array( 39.685, 56.693); break;} - case 'C76': {$pf = array( 229.606, 459.213); break;} - case 'DL' : {$pf = array( 311.811, 623.622); break;} - // SIS 014711 E Series - case 'E0' : {$pf = array( 2491.654, 3517.795); break;} - case 'E1' : {$pf = array( 1757.480, 2491.654); break;} - case 'E2' : {$pf = array( 1247.244, 1757.480); break;} - case 'E3' : {$pf = array( 878.740, 1247.244); break;} - case 'E4' : {$pf = array( 623.622, 878.740); break;} - case 'E5' : {$pf = array( 439.370, 623.622); break;} - case 'E6' : {$pf = array( 311.811, 439.370); break;} - case 'E7' : {$pf = array( 221.102, 311.811); break;} - case 'E8' : {$pf = array( 155.906, 221.102); break;} - case 'E9' : {$pf = array( 110.551, 155.906); break;} - case 'E10': {$pf = array( 76.535, 110.551); break;} - case 'E11': {$pf = array( 53.858, 76.535); break;} - case 'E12': {$pf = array( 36.850, 53.858); break;} - // SIS 014711 G Series - case 'G0' : {$pf = array( 2715.591, 3838.110); break;} - case 'G1' : {$pf = array( 1919.055, 2715.591); break;} - case 'G2' : {$pf = array( 1357.795, 1919.055); break;} - case 'G3' : {$pf = array( 958.110, 1357.795); break;} - case 'G4' : {$pf = array( 677.480, 958.110); break;} - case 'G5' : {$pf = array( 479.055, 677.480); break;} - case 'G6' : {$pf = array( 337.323, 479.055); break;} - case 'G7' : {$pf = array( 238.110, 337.323); break;} - case 'G8' : {$pf = array( 167.244, 238.110); break;} - case 'G9' : {$pf = array( 119.055, 167.244); break;} - case 'G10': {$pf = array( 82.205, 119.055); break;} - case 'G11': {$pf = array( 59.528, 82.205); break;} - case 'G12': {$pf = array( 39.685, 59.528); break;} - // ISO Press - case 'RA0': {$pf = array( 2437.795, 3458.268); break;} - case 'RA1': {$pf = array( 1729.134, 2437.795); break;} - case 'RA2': {$pf = array( 1218.898, 1729.134); break;} - case 'RA3': {$pf = array( 864.567, 1218.898); break;} - case 'RA4': {$pf = array( 609.449, 864.567); break;} - case 'SRA0': {$pf = array( 2551.181, 3628.346); break;} - case 'SRA1': {$pf = array( 1814.173, 2551.181); break;} - case 'SRA2': {$pf = array( 1275.591, 1814.173); break;} - case 'SRA3': {$pf = array( 907.087, 1275.591); break;} - case 'SRA4': {$pf = array( 637.795, 907.087); break;} - // German DIN 476 - case '4A0': {$pf = array( 4767.874, 6740.787); break;} - case '2A0': {$pf = array( 3370.394, 4767.874); break;} - // Variations on the ISO Standard - case 'A2_EXTRA' : {$pf = array( 1261.417, 1754.646); break;} - case 'A3+' : {$pf = array( 932.598, 1369.134); break;} - case 'A3_EXTRA' : {$pf = array( 912.756, 1261.417); break;} - case 'A3_SUPER' : {$pf = array( 864.567, 1440.000); break;} - case 'SUPER_A3' : {$pf = array( 864.567, 1380.472); break;} - case 'A4_EXTRA' : {$pf = array( 666.142, 912.756); break;} - case 'A4_SUPER' : {$pf = array( 649.134, 912.756); break;} - case 'SUPER_A4' : {$pf = array( 643.465, 1009.134); break;} - case 'A4_LONG' : {$pf = array( 595.276, 986.457); break;} - case 'F4' : {$pf = array( 595.276, 935.433); break;} - case 'SO_B5_EXTRA': {$pf = array( 572.598, 782.362); break;} - case 'A5_EXTRA' : {$pf = array( 490.394, 666.142); break;} - // ANSI Series - case 'ANSI_E': {$pf = array( 2448.000, 3168.000); break;} - case 'ANSI_D': {$pf = array( 1584.000, 2448.000); break;} - case 'ANSI_C': {$pf = array( 1224.000, 1584.000); break;} - case 'ANSI_B': {$pf = array( 792.000, 1224.000); break;} - case 'ANSI_A': {$pf = array( 612.000, 792.000); break;} - // Traditional 'Loose' North American Paper Sizes - case 'USLEDGER': - case 'LEDGER' : {$pf = array( 1224.000, 792.000); break;} - case 'ORGANIZERK': - case 'BIBLE': - case 'USTABLOID': - case 'TABLOID': {$pf = array( 792.000, 1224.000); break;} - case 'ORGANIZERM': - case 'USLETTER': - case 'LETTER' : {$pf = array( 612.000, 792.000); break;} - case 'USLEGAL': - case 'LEGAL' : {$pf = array( 612.000, 1008.000); break;} - case 'GOVERNMENTLETTER': - case 'GLETTER': {$pf = array( 576.000, 756.000); break;} - case 'JUNIORLEGAL': - case 'JLEGAL' : {$pf = array( 576.000, 360.000); break;} - // Other North American Paper Sizes - case 'QUADDEMY': {$pf = array( 2520.000, 3240.000); break;} - case 'SUPER_B': {$pf = array( 936.000, 1368.000); break;} - case 'QUARTO': {$pf = array( 648.000, 792.000); break;} - case 'GOVERNMENTLEGAL': - case 'FOLIO': {$pf = array( 612.000, 936.000); break;} - case 'MONARCH': - case 'EXECUTIVE': {$pf = array( 522.000, 756.000); break;} - case 'ORGANIZERL': - case 'STATEMENT': - case 'MEMO': {$pf = array( 396.000, 612.000); break;} - case 'FOOLSCAP': {$pf = array( 595.440, 936.000); break;} - case 'COMPACT': {$pf = array( 306.000, 486.000); break;} - case 'ORGANIZERJ': {$pf = array( 198.000, 360.000); break;} - // Canadian standard CAN 2-9.60M - case 'P1': {$pf = array( 1587.402, 2437.795); break;} - case 'P2': {$pf = array( 1218.898, 1587.402); break;} - case 'P3': {$pf = array( 793.701, 1218.898); break;} - case 'P4': {$pf = array( 609.449, 793.701); break;} - case 'P5': {$pf = array( 396.850, 609.449); break;} - case 'P6': {$pf = array( 303.307, 396.850); break;} - // North American Architectural Sizes - case 'ARCH_E' : {$pf = array( 2592.000, 3456.000); break;} - case 'ARCH_E1': {$pf = array( 2160.000, 3024.000); break;} - case 'ARCH_D' : {$pf = array( 1728.000, 2592.000); break;} - case 'BROADSHEET': - case 'ARCH_C' : {$pf = array( 1296.000, 1728.000); break;} - case 'ARCH_B' : {$pf = array( 864.000, 1296.000); break;} - case 'ARCH_A' : {$pf = array( 648.000, 864.000); break;} - // --- North American Envelope Sizes --- - // - Announcement Envelopes - case 'ANNENV_A2' : {$pf = array( 314.640, 414.000); break;} - case 'ANNENV_A6' : {$pf = array( 342.000, 468.000); break;} - case 'ANNENV_A7' : {$pf = array( 378.000, 522.000); break;} - case 'ANNENV_A8' : {$pf = array( 396.000, 584.640); break;} - case 'ANNENV_A10' : {$pf = array( 450.000, 692.640); break;} - case 'ANNENV_SLIM': {$pf = array( 278.640, 638.640); break;} - // - Commercial Envelopes - case 'COMMENV_N6_1/4': {$pf = array( 252.000, 432.000); break;} - case 'COMMENV_N6_3/4': {$pf = array( 260.640, 468.000); break;} - case 'COMMENV_N8' : {$pf = array( 278.640, 540.000); break;} - case 'COMMENV_N9' : {$pf = array( 278.640, 638.640); break;} - case 'COMMENV_N10' : {$pf = array( 296.640, 684.000); break;} - case 'COMMENV_N11' : {$pf = array( 324.000, 746.640); break;} - case 'COMMENV_N12' : {$pf = array( 342.000, 792.000); break;} - case 'COMMENV_N14' : {$pf = array( 360.000, 828.000); break;} - // - Catalogue Envelopes - case 'CATENV_N1' : {$pf = array( 432.000, 648.000); break;} - case 'CATENV_N1_3/4' : {$pf = array( 468.000, 684.000); break;} - case 'CATENV_N2' : {$pf = array( 468.000, 720.000); break;} - case 'CATENV_N3' : {$pf = array( 504.000, 720.000); break;} - case 'CATENV_N6' : {$pf = array( 540.000, 756.000); break;} - case 'CATENV_N7' : {$pf = array( 576.000, 792.000); break;} - case 'CATENV_N8' : {$pf = array( 594.000, 810.000); break;} - case 'CATENV_N9_1/2' : {$pf = array( 612.000, 756.000); break;} - case 'CATENV_N9_3/4' : {$pf = array( 630.000, 810.000); break;} - case 'CATENV_N10_1/2': {$pf = array( 648.000, 864.000); break;} - case 'CATENV_N12_1/2': {$pf = array( 684.000, 900.000); break;} - case 'CATENV_N13_1/2': {$pf = array( 720.000, 936.000); break;} - case 'CATENV_N14_1/4': {$pf = array( 810.000, 882.000); break;} - case 'CATENV_N14_1/2': {$pf = array( 828.000, 1044.000); break;} - // Japanese (JIS P 0138-61) Standard B-Series - case 'JIS_B0' : {$pf = array( 2919.685, 4127.244); break;} - case 'JIS_B1' : {$pf = array( 2063.622, 2919.685); break;} - case 'JIS_B2' : {$pf = array( 1459.843, 2063.622); break;} - case 'JIS_B3' : {$pf = array( 1031.811, 1459.843); break;} - case 'JIS_B4' : {$pf = array( 728.504, 1031.811); break;} - case 'JIS_B5' : {$pf = array( 515.906, 728.504); break;} - case 'JIS_B6' : {$pf = array( 362.835, 515.906); break;} - case 'JIS_B7' : {$pf = array( 257.953, 362.835); break;} - case 'JIS_B8' : {$pf = array( 181.417, 257.953); break;} - case 'JIS_B9' : {$pf = array( 127.559, 181.417); break;} - case 'JIS_B10': {$pf = array( 90.709, 127.559); break;} - case 'JIS_B11': {$pf = array( 62.362, 90.709); break;} - case 'JIS_B12': {$pf = array( 45.354, 62.362); break;} - // PA Series - case 'PA0' : {$pf = array( 2381.102, 3174.803,); break;} - case 'PA1' : {$pf = array( 1587.402, 2381.102); break;} - case 'PA2' : {$pf = array( 1190.551, 1587.402); break;} - case 'PA3' : {$pf = array( 793.701, 1190.551); break;} - case 'PA4' : {$pf = array( 595.276, 793.701); break;} - case 'PA5' : {$pf = array( 396.850, 595.276); break;} - case 'PA6' : {$pf = array( 297.638, 396.850); break;} - case 'PA7' : {$pf = array( 198.425, 297.638); break;} - case 'PA8' : {$pf = array( 147.402, 198.425); break;} - case 'PA9' : {$pf = array( 99.213, 147.402); break;} - case 'PA10': {$pf = array( 73.701, 99.213); break;} - // Standard Photographic Print Sizes - case 'PASSPORT_PHOTO': {$pf = array( 99.213, 127.559); break;} - case 'E' : {$pf = array( 233.858, 340.157); break;} - case 'L': - case '3R' : {$pf = array( 252.283, 360.000); break;} - case 'KG': - case '4R' : {$pf = array( 289.134, 430.866); break;} - case '4D' : {$pf = array( 340.157, 430.866); break;} - case '2L': - case '5R' : {$pf = array( 360.000, 504.567); break;} - case '8P': - case '6R' : {$pf = array( 430.866, 575.433); break;} - case '6P': - case '8R' : {$pf = array( 575.433, 720.000); break;} - case '6PW': - case 'S8R' : {$pf = array( 575.433, 864.567); break;} - case '4P': - case '10R' : {$pf = array( 720.000, 864.567); break;} - case '4PW': - case 'S10R': {$pf = array( 720.000, 1080.000); break;} - case '11R' : {$pf = array( 790.866, 1009.134); break;} - case 'S11R': {$pf = array( 790.866, 1224.567); break;} - case '12R' : {$pf = array( 864.567, 1080.000); break;} - case 'S12R': {$pf = array( 864.567, 1292.598); break;} - // Common Newspaper Sizes - case 'NEWSPAPER_BROADSHEET': {$pf = array( 2125.984, 1700.787); break;} - case 'NEWSPAPER_BERLINER' : {$pf = array( 1332.283, 892.913); break;} - case 'NEWSPAPER_TABLOID': - case 'NEWSPAPER_COMPACT' : {$pf = array( 1218.898, 793.701); break;} - // Business Cards - case 'CREDIT_CARD': - case 'BUSINESS_CARD': - case 'BUSINESS_CARD_ISO7810': {$pf = array( 153.014, 242.646); break;} - case 'BUSINESS_CARD_ISO216' : {$pf = array( 147.402, 209.764); break;} - case 'BUSINESS_CARD_IT': - case 'BUSINESS_CARD_UK': - case 'BUSINESS_CARD_FR': - case 'BUSINESS_CARD_DE': - case 'BUSINESS_CARD_ES' : {$pf = array( 155.906, 240.945); break;} - case 'BUSINESS_CARD_CA': - case 'BUSINESS_CARD_US' : {$pf = array( 144.567, 252.283); break;} - case 'BUSINESS_CARD_JP' : {$pf = array( 155.906, 257.953); break;} - case 'BUSINESS_CARD_HK' : {$pf = array( 153.071, 255.118); break;} - case 'BUSINESS_CARD_AU': - case 'BUSINESS_CARD_DK': - case 'BUSINESS_CARD_SE' : {$pf = array( 155.906, 255.118); break;} - case 'BUSINESS_CARD_RU': - case 'BUSINESS_CARD_CZ': - case 'BUSINESS_CARD_FI': - case 'BUSINESS_CARD_HU': - case 'BUSINESS_CARD_IL' : {$pf = array( 141.732, 255.118); break;} - // Billboards - case '4SHEET' : {$pf = array( 2880.000, 4320.000); break;} - case '6SHEET' : {$pf = array( 3401.575, 5102.362); break;} - case '12SHEET': {$pf = array( 8640.000, 4320.000); break;} - case '16SHEET': {$pf = array( 5760.000, 8640.000); break;} - case '32SHEET': {$pf = array(11520.000, 8640.000); break;} - case '48SHEET': {$pf = array(17280.000, 8640.000); break;} - case '64SHEET': {$pf = array(23040.000, 8640.000); break;} - case '96SHEET': {$pf = array(34560.000, 8640.000); break;} - // Old European Sizes - // - Old Imperial English Sizes - case 'EN_EMPEROR' : {$pf = array( 3456.000, 5184.000); break;} - case 'EN_ANTIQUARIAN' : {$pf = array( 2232.000, 3816.000); break;} - case 'EN_GRAND_EAGLE' : {$pf = array( 2070.000, 3024.000); break;} - case 'EN_DOUBLE_ELEPHANT' : {$pf = array( 1926.000, 2880.000); break;} - case 'EN_ATLAS' : {$pf = array( 1872.000, 2448.000); break;} - case 'EN_COLOMBIER' : {$pf = array( 1692.000, 2484.000); break;} - case 'EN_ELEPHANT' : {$pf = array( 1656.000, 2016.000); break;} - case 'EN_DOUBLE_DEMY' : {$pf = array( 1620.000, 2556.000); break;} - case 'EN_IMPERIAL' : {$pf = array( 1584.000, 2160.000); break;} - case 'EN_PRINCESS' : {$pf = array( 1548.000, 2016.000); break;} - case 'EN_CARTRIDGE' : {$pf = array( 1512.000, 1872.000); break;} - case 'EN_DOUBLE_LARGE_POST': {$pf = array( 1512.000, 2376.000); break;} - case 'EN_ROYAL' : {$pf = array( 1440.000, 1800.000); break;} - case 'EN_SHEET': - case 'EN_HALF_POST' : {$pf = array( 1404.000, 1692.000); break;} - case 'EN_SUPER_ROYAL' : {$pf = array( 1368.000, 1944.000); break;} - case 'EN_DOUBLE_POST' : {$pf = array( 1368.000, 2196.000); break;} - case 'EN_MEDIUM' : {$pf = array( 1260.000, 1656.000); break;} - case 'EN_DEMY' : {$pf = array( 1260.000, 1620.000); break;} - case 'EN_LARGE_POST' : {$pf = array( 1188.000, 1512.000); break;} - case 'EN_COPY_DRAUGHT' : {$pf = array( 1152.000, 1440.000); break;} - case 'EN_POST' : {$pf = array( 1116.000, 1386.000); break;} - case 'EN_CROWN' : {$pf = array( 1080.000, 1440.000); break;} - case 'EN_PINCHED_POST' : {$pf = array( 1062.000, 1332.000); break;} - case 'EN_BRIEF' : {$pf = array( 972.000, 1152.000); break;} - case 'EN_FOOLSCAP' : {$pf = array( 972.000, 1224.000); break;} - case 'EN_SMALL_FOOLSCAP' : {$pf = array( 954.000, 1188.000); break;} - case 'EN_POTT' : {$pf = array( 900.000, 1080.000); break;} - // - Old Imperial Belgian Sizes - case 'BE_GRAND_AIGLE' : {$pf = array( 1984.252, 2948.031); break;} - case 'BE_COLOMBIER' : {$pf = array( 1757.480, 2409.449); break;} - case 'BE_DOUBLE_CARRE': {$pf = array( 1757.480, 2607.874); break;} - case 'BE_ELEPHANT' : {$pf = array( 1746.142, 2182.677); break;} - case 'BE_PETIT_AIGLE' : {$pf = array( 1700.787, 2381.102); break;} - case 'BE_GRAND_JESUS' : {$pf = array( 1559.055, 2069.291); break;} - case 'BE_JESUS' : {$pf = array( 1530.709, 2069.291); break;} - case 'BE_RAISIN' : {$pf = array( 1417.323, 1842.520); break;} - case 'BE_GRAND_MEDIAN': {$pf = array( 1303.937, 1714.961); break;} - case 'BE_DOUBLE_POSTE': {$pf = array( 1233.071, 1601.575); break;} - case 'BE_COQUILLE' : {$pf = array( 1218.898, 1587.402); break;} - case 'BE_PETIT_MEDIAN': {$pf = array( 1176.378, 1502.362); break;} - case 'BE_RUCHE' : {$pf = array( 1020.472, 1303.937); break;} - case 'BE_PROPATRIA' : {$pf = array( 977.953, 1218.898); break;} - case 'BE_LYS' : {$pf = array( 898.583, 1125.354); break;} - case 'BE_POT' : {$pf = array( 870.236, 1088.504); break;} - case 'BE_ROSETTE' : {$pf = array( 765.354, 983.622); break;} - // - Old Imperial French Sizes - case 'FR_UNIVERS' : {$pf = array( 2834.646, 3685.039); break;} - case 'FR_DOUBLE_COLOMBIER' : {$pf = array( 2551.181, 3571.654); break;} - case 'FR_GRANDE_MONDE' : {$pf = array( 2551.181, 3571.654); break;} - case 'FR_DOUBLE_SOLEIL' : {$pf = array( 2267.717, 3401.575); break;} - case 'FR_DOUBLE_JESUS' : {$pf = array( 2154.331, 3174.803); break;} - case 'FR_GRAND_AIGLE' : {$pf = array( 2125.984, 3004.724); break;} - case 'FR_PETIT_AIGLE' : {$pf = array( 1984.252, 2664.567); break;} - case 'FR_DOUBLE_RAISIN' : {$pf = array( 1842.520, 2834.646); break;} - case 'FR_JOURNAL' : {$pf = array( 1842.520, 2664.567); break;} - case 'FR_COLOMBIER_AFFICHE': {$pf = array( 1785.827, 2551.181); break;} - case 'FR_DOUBLE_CAVALIER' : {$pf = array( 1757.480, 2607.874); break;} - case 'FR_CLOCHE' : {$pf = array( 1700.787, 2267.717); break;} - case 'FR_SOLEIL' : {$pf = array( 1700.787, 2267.717); break;} - case 'FR_DOUBLE_CARRE' : {$pf = array( 1587.402, 2551.181); break;} - case 'FR_DOUBLE_COQUILLE' : {$pf = array( 1587.402, 2494.488); break;} - case 'FR_JESUS' : {$pf = array( 1587.402, 2154.331); break;} - case 'FR_RAISIN' : {$pf = array( 1417.323, 1842.520); break;} - case 'FR_CAVALIER' : {$pf = array( 1303.937, 1757.480); break;} - case 'FR_DOUBLE_COURONNE' : {$pf = array( 1303.937, 2040.945); break;} - case 'FR_CARRE' : {$pf = array( 1275.591, 1587.402); break;} - case 'FR_COQUILLE' : {$pf = array( 1247.244, 1587.402); break;} - case 'FR_DOUBLE_TELLIERE' : {$pf = array( 1247.244, 1927.559); break;} - case 'FR_DOUBLE_CLOCHE' : {$pf = array( 1133.858, 1700.787); break;} - case 'FR_DOUBLE_POT' : {$pf = array( 1133.858, 1757.480); break;} - case 'FR_ECU' : {$pf = array( 1133.858, 1474.016); break;} - case 'FR_COURONNE' : {$pf = array( 1020.472, 1303.937); break;} - case 'FR_TELLIERE' : {$pf = array( 963.780, 1247.244); break;} - case 'FR_POT' : {$pf = array( 878.740, 1133.858); break;} - // DEFAULT ISO A4 - default: {$pf = array( 595.276, 841.890); break;} - } - return $pf; - } - - /** - * Change the format of the current page - * @param mixed $format The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() documentation or an array of two numners (width, height) or an array containing the following measures and options:
      - *
    • ['format'] = page format name (one of the above);
    • - *
    • ['Rotate'] : The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.
    • - *
    • ['PZ'] : The page's preferred zoom (magnification) factor.
    • - *
    • ['MediaBox'] : the boundaries of the physical medium on which the page shall be displayed or printed:
    • - *
    • ['MediaBox']['llx'] : lower-left x coordinate in points
    • - *
    • ['MediaBox']['lly'] : lower-left y coordinate in points
    • - *
    • ['MediaBox']['urx'] : upper-right x coordinate in points
    • - *
    • ['MediaBox']['ury'] : upper-right y coordinate in points
    • - *
    • ['CropBox'] : the visible region of default user space:
    • - *
    • ['CropBox']['llx'] : lower-left x coordinate in points
    • - *
    • ['CropBox']['lly'] : lower-left y coordinate in points
    • - *
    • ['CropBox']['urx'] : upper-right x coordinate in points
    • - *
    • ['CropBox']['ury'] : upper-right y coordinate in points
    • - *
    • ['BleedBox'] : the region to which the contents of the page shall be clipped when output in a production environment:
    • - *
    • ['BleedBox']['llx'] : lower-left x coordinate in points
    • - *
    • ['BleedBox']['lly'] : lower-left y coordinate in points
    • - *
    • ['BleedBox']['urx'] : upper-right x coordinate in points
    • - *
    • ['BleedBox']['ury'] : upper-right y coordinate in points
    • - *
    • ['TrimBox'] : the intended dimensions of the finished page after trimming:
    • - *
    • ['TrimBox']['llx'] : lower-left x coordinate in points
    • - *
    • ['TrimBox']['lly'] : lower-left y coordinate in points
    • - *
    • ['TrimBox']['urx'] : upper-right x coordinate in points
    • - *
    • ['TrimBox']['ury'] : upper-right y coordinate in points
    • - *
    • ['ArtBox'] : the extent of the page's meaningful content:
    • - *
    • ['ArtBox']['llx'] : lower-left x coordinate in points
    • - *
    • ['ArtBox']['lly'] : lower-left y coordinate in points
    • - *
    • ['ArtBox']['urx'] : upper-right x coordinate in points
    • - *
    • ['ArtBox']['ury'] : upper-right y coordinate in points
    • - *
    • ['BoxColorInfo'] :specify the colours and other visual characteristics that should be used in displaying guidelines on the screen for each of the possible page boundaries other than the MediaBox:
    • - *
    • ['BoxColorInfo'][BOXTYPE]['C'] : an array of three numbers in the range 0-255, representing the components in the DeviceRGB colour space.
    • - *
    • ['BoxColorInfo'][BOXTYPE]['W'] : the guideline width in default user units
    • - *
    • ['BoxColorInfo'][BOXTYPE]['S'] : the guideline style: S = Solid; D = Dashed
    • - *
    • ['BoxColorInfo'][BOXTYPE]['D'] : dash array defining a pattern of dashes and gaps to be used in drawing dashed guidelines
    • - *
    • ['trans'] : the style and duration of the visual transition to use when moving from another page to the given page during a presentation
    • - *
    • ['trans']['Dur'] : The page's display duration (also called its advance timing): the maximum length of time, in seconds, that the page shall be displayed during presentations before the viewer application shall automatically advance to the next page.
    • - *
    • ['trans']['S'] : transition style : Split, Blinds, Box, Wipe, Dissolve, Glitter, R, Fly, Push, Cover, Uncover, Fade
    • - *
    • ['trans']['D'] : The duration of the transition effect, in seconds.
    • - *
    • ['trans']['Dm'] : (Split and Blinds transition styles only) The dimension in which the specified transition effect shall occur: H = Horizontal, V = Vertical. Default value: H.
    • - *
    • ['trans']['M'] : (Split, Box and Fly transition styles only) The direction of motion for the specified transition effect: I = Inward from the edges of the page, O = Outward from the center of the pageDefault value: I.
    • - *
    • ['trans']['Di'] : (Wipe, Glitter, Fly, Cover, Uncover and Push transition styles only) The direction in which the specified transition effect shall moves, expressed in degrees counterclockwise starting from a left-to-right direction. If the value is a number, it shall be one of: 0 = Left to right, 90 = Bottom to top (Wipe only), 180 = Right to left (Wipe only), 270 = Top to bottom, 315 = Top-left to bottom-right (Glitter only). If the value is a name, it shall be None, which is relevant only for the Fly transition when the value of SS is not 1.0. Default value: 0.
    • - *
    • ['trans']['SS'] : (Fly transition style only) The starting or ending scale at which the changes shall be drawn. If M specifies an inward transition, the scale of the changes drawn shall progress from SS to 1.0 over the course of the transition. If M specifies an outward transition, the scale of the changes drawn shall progress from 1.0 to SS over the course of the transition. Default: 1.0.
    • - *
    • ['trans']['B'] : (Fly transition style only) If true, the area that shall be flown in is rectangular and opaque. Default: false.
    • - *
    - * @param string $orientation page orientation. Possible values are (case insensitive):
      - *
    • P or Portrait (default)
    • - *
    • L or Landscape
    • - *
    • '' (empty string) for automatic orientation
    • - *
    - * @access protected - * @since 3.0.015 (2008-06-06) - * @see getPageSizeFromFormat() - */ - protected function setPageFormat($format, $orientation='P') { - if (!empty($format) AND isset($this->pagedim[$this->page])) { - // remove inherited values - unset($this->pagedim[$this->page]); - } - if (is_string($format)) { - // get page measures from format name - $pf = $this->getPageSizeFromFormat($format); - $this->fwPt = $pf[0]; - $this->fhPt = $pf[1]; - } else { - // the boundaries of the physical medium on which the page shall be displayed or printed - if (isset($format['MediaBox'])) { - $this->setPageBoxes($this->page, 'MediaBox', $format['MediaBox']['llx'], $format['MediaBox']['lly'], $format['MediaBox']['urx'], $format['MediaBox']['ury'], false); - $this->fwPt = (($format['MediaBox']['urx'] - $format['MediaBox']['llx']) * $this->k); - $this->fhPt = (($format['MediaBox']['ury'] - $format['MediaBox']['lly']) * $this->k); - } else { - if (isset($format[0]) AND is_numeric($format[0]) AND isset($format[1]) AND is_numeric($format[1])) { - $pf = array(($format[0] * $this->k), ($format[1] * $this->k)); - } else { - if (!isset($format['format'])) { - // default value - $format['format'] = 'A4'; - } - $pf = $this->getPageSizeFromFormat($format['format']); - } - $this->fwPt = $pf[0]; - $this->fhPt = $pf[1]; - $this->setPageBoxes($this->page, 'MediaBox', 0, 0, $this->fwPt, $this->fhPt, true); - } - // the visible region of default user space - if (isset($format['CropBox'])) { - $this->setPageBoxes($this->page, 'CropBox', $format['CropBox']['llx'], $format['CropBox']['lly'], $format['CropBox']['urx'], $format['CropBox']['ury'], false); - } - // the region to which the contents of the page shall be clipped when output in a production environment - if (isset($format['BleedBox'])) { - $this->setPageBoxes($this->page, 'BleedBox', $format['BleedBox']['llx'], $format['BleedBox']['lly'], $format['BleedBox']['urx'], $format['BleedBox']['ury'], false); - } - // the intended dimensions of the finished page after trimming - if (isset($format['TrimBox'])) { - $this->setPageBoxes($this->page, 'TrimBox', $format['TrimBox']['llx'], $format['TrimBox']['lly'], $format['TrimBox']['urx'], $format['TrimBox']['ury'], false); - } - // the page's meaningful content (including potential white space) - if (isset($format['ArtBox'])) { - $this->setPageBoxes($this->page, 'ArtBox', $format['ArtBox']['llx'], $format['ArtBox']['lly'], $format['ArtBox']['urx'], $format['ArtBox']['ury'], false); - } - // specify the colours and other visual characteristics that should be used in displaying guidelines on the screen for the various page boundaries - if (isset($format['BoxColorInfo'])) { - $this->pagedim[$this->page]['BoxColorInfo'] = $format['BoxColorInfo']; - } - if (isset($format['Rotate']) AND (($format['Rotate'] % 90) == 0)) { - // The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90. - $this->pagedim[$this->page]['Rotate'] = intval($format['Rotate']); - } - if (isset($format['PZ'])) { - // The page's preferred zoom (magnification) factor - $this->pagedim[$this->page]['PZ'] = floatval($format['PZ']); - } - if (isset($format['trans'])) { - // The style and duration of the visual transition to use when moving from another page to the given page during a presentation - if (isset($format['trans']['Dur'])) { - // The page's display duration - $this->pagedim[$this->page]['trans']['Dur'] = floatval($format['trans']['Dur']); - } - $stansition_styles = array('Split', 'Blinds', 'Box', 'Wipe', 'Dissolve', 'Glitter', 'R', 'Fly', 'Push', 'Cover', 'Uncover', 'Fade'); - if (isset($format['trans']['S']) AND in_array($format['trans']['S'], $stansition_styles)) { - // The transition style that shall be used when moving to this page from another during a presentation - $this->pagedim[$this->page]['trans']['S'] = $format['trans']['S']; - $valid_effect = array('Split', 'Blinds'); - $valid_vals = array('H', 'V'); - if (isset($format['trans']['Dm']) AND in_array($format['trans']['S'], $valid_effect) AND in_array($format['trans']['Dm'], $valid_vals)) { - $this->pagedim[$this->page]['trans']['Dm'] = $format['trans']['Dm']; - } - $valid_effect = array('Split', 'Box', 'Fly'); - $valid_vals = array('I', 'O'); - if (isset($format['trans']['M']) AND in_array($format['trans']['S'], $valid_effect) AND in_array($format['trans']['M'], $valid_vals)) { - $this->pagedim[$this->page]['trans']['M'] = $format['trans']['M']; - } - $valid_effect = array('Wipe', 'Glitter', 'Fly', 'Cover', 'Uncover', 'Push'); - if (isset($format['trans']['Di']) AND in_array($format['trans']['S'], $valid_effect)) { - if (((($format['trans']['Di'] == 90) OR ($format['trans']['Di'] == 180)) AND ($format['trans']['S'] == 'Wipe')) - OR (($format['trans']['Di'] == 315) AND ($format['trans']['S'] == 'Glitter')) - OR (($format['trans']['Di'] == 0) OR ($format['trans']['Di'] == 270))) { - $this->pagedim[$this->page]['trans']['Di'] = intval($format['trans']['Di']); - } - } - if (isset($format['trans']['SS']) AND ($format['trans']['S'] == 'Fly')) { - $this->pagedim[$this->page]['trans']['SS'] = floatval($format['trans']['SS']); - } - if (isset($format['trans']['B']) AND ($format['trans']['B'] === true) AND ($format['trans']['S'] == 'Fly')) { - $this->pagedim[$this->page]['trans']['B'] = 'true'; - } - } else { - $this->pagedim[$this->page]['trans']['S'] = 'R'; - } - if (isset($format['trans']['D'])) { - // The duration of the transition effect, in seconds - $this->pagedim[$this->page]['trans']['D'] = floatval($format['trans']['D']); - } else { - $this->pagedim[$this->page]['trans']['D'] = 1; - } - } - } - $this->setPageOrientation($orientation); - } - - /** - * Set page boundaries. - * @param int $page page number - * @param string $type valid values are:
    • 'MediaBox' : the boundaries of the physical medium on which the page shall be displayed or printed;
    • 'CropBox' : the visible region of default user space;
    • 'BleedBox' : the region to which the contents of the page shall be clipped when output in a production environment;
    • 'TrimBox' : the intended dimensions of the finished page after trimming;
    • 'ArtBox' : the page's meaningful content (including potential white space).
    - * @param float $llx lower-left x coordinate in user units - * @param float $lly lower-left y coordinate in user units - * @param float $urx upper-right x coordinate in user units - * @param float $ury upper-right y coordinate in user units - * @param boolean $points if true uses user units as unit of measure, otherwise uses PDF points - * @access public - * @since 5.0.010 (2010-05-17) - */ - public function setPageBoxes($page, $type, $llx, $lly, $urx, $ury, $points=false) { - if (!isset($this->pagedim[$page])) { - // initialize array - $this->pagedim[$page] = array(); - } - $pageboxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'); - if (!in_array($type, $pageboxes)) { - return; - } - if ($points) { - $k = 1; - } else { - $k = $this->k; - } - $this->pagedim[$page][$type]['llx'] = ($llx * $k); - $this->pagedim[$page][$type]['lly'] = ($lly * $k); - $this->pagedim[$page][$type]['urx'] = ($urx * $k); - $this->pagedim[$page][$type]['ury'] = ($ury * $k); - } - - /** - * Swap X and Y coordinates of page boxes (change page boxes orientation). - * @param int $page page number - * @access protected - * @since 5.0.010 (2010-05-17) - */ - protected function swapPageBoxCoordinates($page) { - $pageboxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'); - foreach ($pageboxes as $type) { - // swap X and Y coordinates - if (isset($this->pagedim[$page][$type])) { - $tmp = $this->pagedim[$page][$type]['llx']; - $this->pagedim[$page][$type]['llx'] = $this->pagedim[$page][$type]['lly']; - $this->pagedim[$page][$type]['lly'] = $tmp; - $tmp = $this->pagedim[$page][$type]['urx']; - $this->pagedim[$page][$type]['urx'] = $this->pagedim[$page][$type]['ury']; - $this->pagedim[$page][$type]['ury'] = $tmp; - } - } - } - - /** - * Set page orientation. - * @param string $orientation page orientation. Possible values are (case insensitive):
    • P or Portrait (default)
    • L or Landscape
    • '' (empty string) for automatic orientation
    - * @param boolean $autopagebreak Boolean indicating if auto-page-break mode should be on or off. - * @param float $bottommargin bottom margin of the page. - * @access public - * @since 3.0.015 (2008-06-06) - */ - public function setPageOrientation($orientation, $autopagebreak='', $bottommargin='') { - if (!isset($this->pagedim[$this->page]['MediaBox'])) { - // the boundaries of the physical medium on which the page shall be displayed or printed - $this->setPageBoxes($this->page, 'MediaBox', 0, 0, $this->fwPt, $this->fhPt, true); - } - if (!isset($this->pagedim[$this->page]['CropBox'])) { - // the visible region of default user space - $this->setPageBoxes($this->page, 'CropBox', $this->pagedim[$this->page]['MediaBox']['llx'], $this->pagedim[$this->page]['MediaBox']['lly'], $this->pagedim[$this->page]['MediaBox']['urx'], $this->pagedim[$this->page]['MediaBox']['ury'], true); - } - if (!isset($this->pagedim[$this->page]['BleedBox'])) { - // the region to which the contents of the page shall be clipped when output in a production environment - $this->setPageBoxes($this->page, 'BleedBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true); - } - if (!isset($this->pagedim[$this->page]['TrimBox'])) { - // the intended dimensions of the finished page after trimming - $this->setPageBoxes($this->page, 'TrimBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true); - } - if (!isset($this->pagedim[$this->page]['ArtBox'])) { - // the page's meaningful content (including potential white space) - $this->setPageBoxes($this->page, 'ArtBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true); - } - if (!isset($this->pagedim[$this->page]['Rotate'])) { - // The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90. - $this->pagedim[$this->page]['Rotate'] = 0; - } - if (!isset($this->pagedim[$this->page]['PZ'])) { - // The page's preferred zoom (magnification) factor - $this->pagedim[$this->page]['PZ'] = 1; - } - if ($this->fwPt > $this->fhPt) { - // landscape - $default_orientation = 'L'; - } else { - // portrait - $default_orientation = 'P'; - } - $valid_orientations = array('P', 'L'); - if (empty($orientation)) { - $orientation = $default_orientation; - } else { - $orientation = strtoupper($orientation{0}); - } - if (in_array($orientation, $valid_orientations) AND ($orientation != $default_orientation)) { - $this->CurOrientation = $orientation; - $this->wPt = $this->fhPt; - $this->hPt = $this->fwPt; - } else { - $this->CurOrientation = $default_orientation; - $this->wPt = $this->fwPt; - $this->hPt = $this->fhPt; - } - if ((abs($this->pagedim[$this->page]['MediaBox']['urx'] - $this->hPt) < $this->feps) AND (abs($this->pagedim[$this->page]['MediaBox']['ury'] - $this->wPt) < $this->feps)){ - // swap X and Y coordinates (change page orientation) - $this->swapPageBoxCoordinates($this->page); - } - $this->w = $this->wPt / $this->k; - $this->h = $this->hPt / $this->k; - if ($this->empty_string($autopagebreak)) { - if (isset($this->AutoPageBreak)) { - $autopagebreak = $this->AutoPageBreak; - } else { - $autopagebreak = true; - } - } - if ($this->empty_string($bottommargin)) { - if (isset($this->bMargin)) { - $bottommargin = $this->bMargin; - } else { - // default value = 2 cm - $bottommargin = 2 * 28.35 / $this->k; - } - } - $this->SetAutoPageBreak($autopagebreak, $bottommargin); - // store page dimensions - $this->pagedim[$this->page]['w'] = $this->wPt; - $this->pagedim[$this->page]['h'] = $this->hPt; - $this->pagedim[$this->page]['wk'] = $this->w; - $this->pagedim[$this->page]['hk'] = $this->h; - $this->pagedim[$this->page]['tm'] = $this->tMargin; - $this->pagedim[$this->page]['bm'] = $bottommargin; - $this->pagedim[$this->page]['lm'] = $this->lMargin; - $this->pagedim[$this->page]['rm'] = $this->rMargin; - $this->pagedim[$this->page]['pb'] = $autopagebreak; - $this->pagedim[$this->page]['or'] = $this->CurOrientation; - $this->pagedim[$this->page]['olm'] = $this->original_lMargin; - $this->pagedim[$this->page]['orm'] = $this->original_rMargin; - } - - /** - * Set regular expression to detect withespaces or word separators. - * The pattern delimiter must be the forward-slash character '/'. - * Some example patterns are: - *
    -	 * Non-Unicode or missing PCRE unicode support: '/[^\S\xa0]/'
    -	 * Unicode and PCRE unicode support: '/[^\S\P{Z}\xa0]/u'
    -	 * Unicode and PCRE unicode support in Chinese mode: '/[^\S\P{Z}\P{Lo}\xa0]/u'
    -	 * if PCRE unicode support is turned ON (\P is the negate class of \p):
    -	 * 	\p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator.
    -	 * 	\p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants.
    -	 * 	\p{Lo} is needed for Chinese characters because are packed next to each other without spaces in between.
    -	 * 
    - * @param string $re regular expression (leave empty for default). - * @access public - * @since 4.6.016 (2009-06-15) - */ - public function setSpacesRE($re='/[^\S\xa0]/') { - $this->re_spaces = $re; - $re_parts = explode('/', $re); - // get pattern parts - $this->re_space = array(); - if (isset($re_parts[1]) AND !empty($re_parts[1])) { - $this->re_space['p'] = $re_parts[1]; - } else { - $this->re_space['p'] = '[\s]'; - } - // set pattern modifiers - if (isset($re_parts[2]) AND !empty($re_parts[2])) { - $this->re_space['m'] = $re_parts[2]; - } else { - $this->re_space['m'] = ''; - } - } - - /** - * Enable or disable Right-To-Left language mode - * @param Boolean $enable if true enable Right-To-Left language mode. - * @param Boolean $resetx if true reset the X position on direction change. - * @access public - * @since 2.0.000 (2008-01-03) - */ - public function setRTL($enable, $resetx=true) { - $enable = $enable ? true : false; - $resetx = ($resetx AND ($enable != $this->rtl)); - $this->rtl = $enable; - $this->tmprtl = false; - if ($resetx) { - $this->Ln(0); - } - } - - /** - * Return the RTL status - * @return boolean - * @access public - * @since 4.0.012 (2008-07-24) - */ - public function getRTL() { - return $this->rtl; - } - - /** - * Force temporary RTL language direction - * @param mixed $mode can be false, 'L' for LTR or 'R' for RTL - * @access public - * @since 2.1.000 (2008-01-09) - */ - public function setTempRTL($mode) { - $newmode = false; - switch (strtoupper($mode)) { - case 'LTR': - case 'L': { - if ($this->rtl) { - $newmode = 'L'; - } - break; - } - case 'RTL': - case 'R': { - if (!$this->rtl) { - $newmode = 'R'; - } - break; - } - case false: - default: { - $newmode = false; - break; - } - } - $this->tmprtl = $newmode; - } - - /** - * Return the current temporary RTL status - * @return boolean - * @access public - * @since 4.8.014 (2009-11-04) - */ - public function isRTLTextDir() { - return ($this->rtl OR ($this->tmprtl == 'R')); - } - - /** - * Set the last cell height. - * @param float $h cell height. - * @author Nicola Asuni - * @access public - * @since 1.53.0.TC034 - */ - public function setLastH($h) { - $this->lasth = $h; - } - - /** - * Reset the last cell height. - * @access public - * @since 5.9.000 (2010-10-03) - */ - public function resetLastH() { - $this->lasth = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B']; - } - - /** - * Get the last cell height. - * @return last cell height - * @access public - * @since 4.0.017 (2008-08-05) - */ - public function getLastH() { - return $this->lasth; - } - - /** - * Set the adjusting factor to convert pixels to user units. - * @param float $scale adjusting factor to convert pixels to user units. - * @author Nicola Asuni - * @access public - * @since 1.5.2 - */ - public function setImageScale($scale) { - $this->imgscale = $scale; - } - - /** - * Returns the adjusting factor to convert pixels to user units. - * @return float adjusting factor to convert pixels to user units. - * @author Nicola Asuni - * @access public - * @since 1.5.2 - */ - public function getImageScale() { - return $this->imgscale; - } - - /** - * Returns an array of page dimensions: - *
    • $this->pagedim[$this->page]['w'] = page width in points
    • $this->pagedim[$this->page]['h'] = height in points
    • $this->pagedim[$this->page]['wk'] = page width in user units
    • $this->pagedim[$this->page]['hk'] = page height in user units
    • $this->pagedim[$this->page]['tm'] = top margin
    • $this->pagedim[$this->page]['bm'] = bottom margin
    • $this->pagedim[$this->page]['lm'] = left margin
    • $this->pagedim[$this->page]['rm'] = right margin
    • $this->pagedim[$this->page]['pb'] = auto page break
    • $this->pagedim[$this->page]['or'] = page orientation
    • $this->pagedim[$this->page]['olm'] = original left margin
    • $this->pagedim[$this->page]['orm'] = original right margin
    • $this->pagedim[$this->page]['Rotate'] = The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.
    • $this->pagedim[$this->page]['PZ'] = The page's preferred zoom (magnification) factor.
    • $this->pagedim[$this->page]['trans'] : the style and duration of the visual transition to use when moving from another page to the given page during a presentation
      • $this->pagedim[$this->page]['trans']['Dur'] = The page's display duration (also called its advance timing): the maximum length of time, in seconds, that the page shall be displayed during presentations before the viewer application shall automatically advance to the next page.
      • $this->pagedim[$this->page]['trans']['S'] = transition style : Split, Blinds, Box, Wipe, Dissolve, Glitter, R, Fly, Push, Cover, Uncover, Fade
      • $this->pagedim[$this->page]['trans']['D'] = The duration of the transition effect, in seconds.
      • $this->pagedim[$this->page]['trans']['Dm'] = (Split and Blinds transition styles only) The dimension in which the specified transition effect shall occur: H = Horizontal, V = Vertical. Default value: H.
      • $this->pagedim[$this->page]['trans']['M'] = (Split, Box and Fly transition styles only) The direction of motion for the specified transition effect: I = Inward from the edges of the page, O = Outward from the center of the pageDefault value: I.
      • $this->pagedim[$this->page]['trans']['Di'] = (Wipe, Glitter, Fly, Cover, Uncover and Push transition styles only) The direction in which the specified transition effect shall moves, expressed in degrees counterclockwise starting from a left-to-right direction. If the value is a number, it shall be one of: 0 = Left to right, 90 = Bottom to top (Wipe only), 180 = Right to left (Wipe only), 270 = Top to bottom, 315 = Top-left to bottom-right (Glitter only). If the value is a name, it shall be None, which is relevant only for the Fly transition when the value of SS is not 1.0. Default value: 0.
      • $this->pagedim[$this->page]['trans']['SS'] = (Fly transition style only) The starting or ending scale at which the changes shall be drawn. If M specifies an inward transition, the scale of the changes drawn shall progress from SS to 1.0 over the course of the transition. If M specifies an outward transition, the scale of the changes drawn shall progress from 1.0 to SS over the course of the transition. Default: 1.0.
      • $this->pagedim[$this->page]['trans']['B'] = (Fly transition style only) If true, the area that shall be flown in is rectangular and opaque. Default: false.
    • $this->pagedim[$this->page]['MediaBox'] : the boundaries of the physical medium on which the page shall be displayed or printed
      • $this->pagedim[$this->page]['MediaBox']['llx'] = lower-left x coordinate in points
      • $this->pagedim[$this->page]['MediaBox']['lly'] = lower-left y coordinate in points
      • $this->pagedim[$this->page]['MediaBox']['urx'] = upper-right x coordinate in points
      • $this->pagedim[$this->page]['MediaBox']['ury'] = upper-right y coordinate in points
    • $this->pagedim[$this->page]['CropBox'] : the visible region of default user space
      • $this->pagedim[$this->page]['CropBox']['llx'] = lower-left x coordinate in points
      • $this->pagedim[$this->page]['CropBox']['lly'] = lower-left y coordinate in points
      • $this->pagedim[$this->page]['CropBox']['urx'] = upper-right x coordinate in points
      • $this->pagedim[$this->page]['CropBox']['ury'] = upper-right y coordinate in points
    • $this->pagedim[$this->page]['BleedBox'] : the region to which the contents of the page shall be clipped when output in a production environment
      • $this->pagedim[$this->page]['BleedBox']['llx'] = lower-left x coordinate in points
      • $this->pagedim[$this->page]['BleedBox']['lly'] = lower-left y coordinate in points
      • $this->pagedim[$this->page]['BleedBox']['urx'] = upper-right x coordinate in points
      • $this->pagedim[$this->page]['BleedBox']['ury'] = upper-right y coordinate in points
    • $this->pagedim[$this->page]['TrimBox'] : the intended dimensions of the finished page after trimming
      • $this->pagedim[$this->page]['TrimBox']['llx'] = lower-left x coordinate in points
      • $this->pagedim[$this->page]['TrimBox']['lly'] = lower-left y coordinate in points
      • $this->pagedim[$this->page]['TrimBox']['urx'] = upper-right x coordinate in points
      • $this->pagedim[$this->page]['TrimBox']['ury'] = upper-right y coordinate in points
    • $this->pagedim[$this->page]['ArtBox'] : the extent of the page's meaningful content
      • $this->pagedim[$this->page]['ArtBox']['llx'] = lower-left x coordinate in points
      • $this->pagedim[$this->page]['ArtBox']['lly'] = lower-left y coordinate in points
      • $this->pagedim[$this->page]['ArtBox']['urx'] = upper-right x coordinate in points
      • $this->pagedim[$this->page]['ArtBox']['ury'] = upper-right y coordinate in points
    - * @param int $pagenum page number (empty = current page) - * @return array of page dimensions. - * @author Nicola Asuni - * @access public - * @since 4.5.027 (2009-03-16) - */ - public function getPageDimensions($pagenum='') { - if (empty($pagenum)) { - $pagenum = $this->page; - } - return $this->pagedim[$pagenum]; - } - - /** - * Returns the page width in units. - * @param int $pagenum page number (empty = current page) - * @return int page width. - * @author Nicola Asuni - * @access public - * @since 1.5.2 - * @see getPageDimensions() - */ - public function getPageWidth($pagenum='') { - if (empty($pagenum)) { - return $this->w; - } - return $this->pagedim[$pagenum]['w']; - } - - /** - * Returns the page height in units. - * @param int $pagenum page number (empty = current page) - * @return int page height. - * @author Nicola Asuni - * @access public - * @since 1.5.2 - * @see getPageDimensions() - */ - public function getPageHeight($pagenum='') { - if (empty($pagenum)) { - return $this->h; - } - return $this->pagedim[$pagenum]['h']; - } - - /** - * Returns the page break margin. - * @param int $pagenum page number (empty = current page) - * @return int page break margin. - * @author Nicola Asuni - * @access public - * @since 1.5.2 - * @see getPageDimensions() - */ - public function getBreakMargin($pagenum='') { - if (empty($pagenum)) { - return $this->bMargin; - } - return $this->pagedim[$pagenum]['bm']; - } - - /** - * Returns the scale factor (number of points in user unit). - * @return int scale factor. - * @author Nicola Asuni - * @access public - * @since 1.5.2 - */ - public function getScaleFactor() { - return $this->k; - } - - /** - * Defines the left, top and right margins. - * @param float $left Left margin. - * @param float $top Top margin. - * @param float $right Right margin. Default value is the left one. - * @param boolean $keepmargins if true overwrites the default page margins - * @access public - * @since 1.0 - * @see SetLeftMargin(), SetTopMargin(), SetRightMargin(), SetAutoPageBreak() - */ - public function SetMargins($left, $top, $right=-1, $keepmargins=false) { - //Set left, top and right margins - $this->lMargin = $left; - $this->tMargin = $top; - if ($right == -1) { - $right = $left; - } - $this->rMargin = $right; - if ($keepmargins) { - // overwrite original values - $this->original_lMargin = $this->lMargin; - $this->original_rMargin = $this->rMargin; - } - } - - /** - * Defines the left margin. The method can be called before creating the first page. If the current abscissa gets out of page, it is brought back to the margin. - * @param float $margin The margin. - * @access public - * @since 1.4 - * @see SetTopMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins() - */ - public function SetLeftMargin($margin) { - //Set left margin - $this->lMargin = $margin; - if (($this->page > 0) AND ($this->x < $margin)) { - $this->x = $margin; - } - } - - /** - * Defines the top margin. The method can be called before creating the first page. - * @param float $margin The margin. - * @access public - * @since 1.5 - * @see SetLeftMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins() - */ - public function SetTopMargin($margin) { - //Set top margin - $this->tMargin = $margin; - if (($this->page > 0) AND ($this->y < $margin)) { - $this->y = $margin; - } - } - - /** - * Defines the right margin. The method can be called before creating the first page. - * @param float $margin The margin. - * @access public - * @since 1.5 - * @see SetLeftMargin(), SetTopMargin(), SetAutoPageBreak(), SetMargins() - */ - public function SetRightMargin($margin) { - $this->rMargin = $margin; - if (($this->page > 0) AND ($this->x > ($this->w - $margin))) { - $this->x = $this->w - $margin; - } - } - - /** - * Set the same internal Cell padding for top, right, bottom, left- - * @param float $pad internal padding. - * @access public - * @since 2.1.000 (2008-01-09) - * @see getCellPaddings(), setCellPaddings() - */ - public function SetCellPadding($pad) { - if ($pad >= 0) { - $this->cell_padding['L'] = $pad; - $this->cell_padding['T'] = $pad; - $this->cell_padding['R'] = $pad; - $this->cell_padding['B'] = $pad; - } - } - - /** - * Set the internal Cell paddings. - * @param float $left left padding - * @param float $top top padding - * @param float $right right padding - * @param float $bottom bottom padding - * @access public - * @since 5.9.000 (2010-10-03) - * @see getCellPaddings(), SetCellPadding() - */ - public function setCellPaddings($left='', $top='', $right='', $bottom='') { - if (($left !== '') AND ($left >= 0)) { - $this->cell_padding['L'] = $left; - } - if (($top !== '') AND ($top >= 0)) { - $this->cell_padding['T'] = $top; - } - if (($right !== '') AND ($right >= 0)) { - $this->cell_padding['R'] = $right; - } - if (($bottom !== '') AND ($bottom >= 0)) { - $this->cell_padding['B'] = $bottom; - } - } - - /** - * Get the internal Cell padding array. - * @return array of padding values - * @access public - * @since 5.9.000 (2010-10-03) - * @see setCellPaddings(), SetCellPadding() - */ - public function getCellPaddings() { - return $this->cell_padding; - } - - /** - * Set the internal Cell margins. - * @param float $left left margin - * @param float $top top margin - * @param float $right right margin - * @param float $bottom bottom margin - * @access public - * @since 5.9.000 (2010-10-03) - * @see getCellMargins() - */ - public function setCellMargins($left='', $top='', $right='', $bottom='') { - if (($left !== '') AND ($left >= 0)) { - $this->cell_margin['L'] = $left; - } - if (($top !== '') AND ($top >= 0)) { - $this->cell_margin['T'] = $top; - } - if (($right !== '') AND ($right >= 0)) { - $this->cell_margin['R'] = $right; - } - if (($bottom !== '') AND ($bottom >= 0)) { - $this->cell_margin['B'] = $bottom; - } - } - - /** - * Get the internal Cell margin array. - * @return array of margin values - * @access public - * @since 5.9.000 (2010-10-03) - * @see setCellMargins() - */ - public function getCellMargins() { - return $this->cell_margin; - } - - /** - * Adjust the internal Cell padding array to take account of the line width. - * @param mixed $brd Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @return array of adjustments - * @access public - * @since 5.9.000 (2010-10-03) - */ - protected function adjustCellPadding($brd=0) { - if (empty($brd)) { - return; - } - if (is_string($brd)) { - // convert string to array - $slen = strlen($brd); - $newbrd = array(); - for ($i = 0; $i < $slen; ++$i) { - $newbrd[$brd{$i}] = true; - } - $brd = $newbrd; - } elseif (($brd === 1) OR ($brd === true) OR (is_numeric($brd) AND (intval($brd) > 0))) { - $brd = array('LRTB' => true); - } - if (!is_array($brd)) { - return; - } - // store current cell padding - $cp = $this->cell_padding; - // select border mode - if (isset($brd['mode'])) { - $mode = $brd['mode']; - unset($brd['mode']); - } else { - $mode = 'normal'; - } - // process borders - foreach ($brd as $border => $style) { - $line_width = $this->LineWidth; - if (is_array($style) AND isset($style['width'])) { - // get border width - $line_width = $style['width']; - } - $adj = 0; // line width inside the cell - switch ($mode) { - case 'ext': { - $adj = 0; - break; - } - case 'int': { - $adj = $line_width; - break; - } - case 'normal': - default: { - $adj = ($line_width / 2); - break; - } - } - // correct internal cell padding if required to avoid overlap between text and lines - if ((strpos($border,'T') !== false) AND ($this->cell_padding['T'] < $adj)) { - $this->cell_padding['T'] = $adj; - } - if ((strpos($border,'R') !== false) AND ($this->cell_padding['R'] < $adj)) { - $this->cell_padding['R'] = $adj; - } - if ((strpos($border,'B') !== false) AND ($this->cell_padding['B'] < $adj)) { - $this->cell_padding['B'] = $adj; - } - if ((strpos($border,'L') !== false) AND ($this->cell_padding['L'] < $adj)) { - $this->cell_padding['L'] = $adj; - } - } - return array('T' => ($this->cell_padding['T'] - $cp['T']), 'R' => ($this->cell_padding['R'] - $cp['R']), 'B' => ($this->cell_padding['B'] - $cp['B']), 'L' => ($this->cell_padding['L'] - $cp['L'])); - } - - /** - * Enables or disables the automatic page breaking mode. When enabling, the second parameter is the distance from the bottom of the page that defines the triggering limit. By default, the mode is on and the margin is 2 cm. - * @param boolean $auto Boolean indicating if mode should be on or off. - * @param float $margin Distance from the bottom of the page. - * @access public - * @since 1.0 - * @see Cell(), MultiCell(), AcceptPageBreak() - */ - public function SetAutoPageBreak($auto, $margin=0) { - //Set auto page break mode and triggering margin - $this->AutoPageBreak = $auto; - $this->bMargin = $margin; - $this->PageBreakTrigger = $this->h - $margin; - } - - /** - * Defines the way the document is to be displayed by the viewer. - * @param mixed $zoom The zoom to use. It can be one of the following string values or a number indicating the zooming factor to use.
    • fullpage: displays the entire page on screen
    • fullwidth: uses maximum width of window
    • real: uses real size (equivalent to 100% zoom)
    • default: uses viewer default mode
    - * @param string $layout The page layout. Possible values are:
    • SinglePage Display one page at a time
    • OneColumn Display the pages in one column
    • TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left
    • TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right
    • TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left
    • TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right
    - * @param string $mode A name object specifying how the document should be displayed when opened:
    • UseNone Neither document outline nor thumbnail images visible
    • UseOutlines Document outline visible
    • UseThumbs Thumbnail images visible
    • FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible
    • UseOC (PDF 1.5) Optional content group panel visible
    • UseAttachments (PDF 1.6) Attachments panel visible
    - * @access public - * @since 1.2 - */ - public function SetDisplayMode($zoom, $layout='SinglePage', $mode='UseNone') { - //Set display mode in viewer - if (($zoom == 'fullpage') OR ($zoom == 'fullwidth') OR ($zoom == 'real') OR ($zoom == 'default') OR (!is_string($zoom))) { - $this->ZoomMode = $zoom; - } else { - $this->Error('Incorrect zoom display mode: '.$zoom); - } - switch ($layout) { - case 'default': - case 'single': - case 'SinglePage': { - $this->LayoutMode = 'SinglePage'; - break; - } - case 'continuous': - case 'OneColumn': { - $this->LayoutMode = 'OneColumn'; - break; - } - case 'two': - case 'TwoColumnLeft': { - $this->LayoutMode = 'TwoColumnLeft'; - break; - } - case 'TwoColumnRight': { - $this->LayoutMode = 'TwoColumnRight'; - break; - } - case 'TwoPageLeft': { - $this->LayoutMode = 'TwoPageLeft'; - break; - } - case 'TwoPageRight': { - $this->LayoutMode = 'TwoPageRight'; - break; - } - default: { - $this->LayoutMode = 'SinglePage'; - } - } - switch ($mode) { - case 'UseNone': { - $this->PageMode = 'UseNone'; - break; - } - case 'UseOutlines': { - $this->PageMode = 'UseOutlines'; - break; - } - case 'UseThumbs': { - $this->PageMode = 'UseThumbs'; - break; - } - case 'FullScreen': { - $this->PageMode = 'FullScreen'; - break; - } - case 'UseOC': { - $this->PageMode = 'UseOC'; - break; - } - case '': { - $this->PageMode = 'UseAttachments'; - break; - } - default: { - $this->PageMode = 'UseNone'; - } - } - } - - /** - * Activates or deactivates page compression. When activated, the internal representation of each page is compressed, which leads to a compression ratio of about 2 for the resulting document. Compression is on by default. - * Note: the Zlib extension is required for this feature. If not present, compression will be turned off. - * @param boolean $compress Boolean indicating if compression must be enabled. - * @access public - * @since 1.4 - */ - public function SetCompression($compress) { - //Set page compression - if (function_exists('gzcompress')) { - $this->compress = $compress ? true : false; - } else { - $this->compress = false; - } - } - - /** - * Defines the title of the document. - * @param string $title The title. - * @access public - * @since 1.2 - * @see SetAuthor(), SetCreator(), SetKeywords(), SetSubject() - */ - public function SetTitle($title) { - //Title of document - $this->title = $title; - } - - /** - * Defines the subject of the document. - * @param string $subject The subject. - * @access public - * @since 1.2 - * @see SetAuthor(), SetCreator(), SetKeywords(), SetTitle() - */ - public function SetSubject($subject) { - //Subject of document - $this->subject = $subject; - } - - /** - * Defines the author of the document. - * @param string $author The name of the author. - * @access public - * @since 1.2 - * @see SetCreator(), SetKeywords(), SetSubject(), SetTitle() - */ - public function SetAuthor($author) { - //Author of document - $this->author = $author; - } - - /** - * Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'. - * @param string $keywords The list of keywords. - * @access public - * @since 1.2 - * @see SetAuthor(), SetCreator(), SetSubject(), SetTitle() - */ - public function SetKeywords($keywords) { - //Keywords of document - $this->keywords = $keywords; - } - - /** - * Defines the creator of the document. This is typically the name of the application that generates the PDF. - * @param string $creator The name of the creator. - * @access public - * @since 1.2 - * @see SetAuthor(), SetKeywords(), SetSubject(), SetTitle() - */ - public function SetCreator($creator) { - //Creator of document - $this->creator = $creator; - } - - /** - * This method is automatically called in case of fatal error; it simply outputs the message and halts the execution. An inherited class may override it to customize the error handling but should always halt the script, or the resulting document would probably be invalid. - * 2004-06-11 :: Nicola Asuni : changed bold tag with strong - * @param string $msg The error message - * @access public - * @since 1.0 - */ - public function Error($msg) { - // unset all class variables - $this->_destroy(true); - // exit program and print error - die('TCPDF ERROR: '.$msg); - } - - /** - * This method begins the generation of the PDF document. - * It is not necessary to call it explicitly because AddPage() does it automatically. - * Note: no page is created by this method - * @access public - * @since 1.0 - * @see AddPage(), Close() - */ - public function Open() { - //Begin document - $this->state = 1; - } - - /** - * Terminates the PDF document. - * It is not necessary to call this method explicitly because Output() does it automatically. - * If the document contains no page, AddPage() is called to prevent from getting an invalid document. - * @access public - * @since 1.0 - * @see Open(), Output() - */ - public function Close() { - if ($this->state == 3) { - return; - } - if ($this->page == 0) { - $this->AddPage(); - } - // save current graphic settings - $gvars = $this->getGraphicVars(); - $this->lastpage(true); - $this->SetAutoPageBreak(false); - $this->x = 0; - $this->y = $this->h - (1 / $this->k); - $this->lMargin = 0; - $this->_out('q'); - $this->setVisibility('screen'); - $this->SetFont('helvetica', '', 1); - $this->SetTextColor(255, 255, 255); - $msg = "\x50\x6f\x77\x65\x72\x65\x64\x20\x62\x79\x20\x54\x43\x50\x44\x46\x20\x28\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29"; - $lnk = "\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67"; - $this->Cell(0, 0, $msg, 0, 0, 'L', 0, $lnk, 0, false, 'D', 'B'); - $this->setVisibility('all'); - $this->_out('Q'); - // restore graphic settings - $this->setGraphicVars($gvars); - // close page - $this->endPage(); - // close document - $this->_enddoc(); - // unset all class variables (except critical ones) - $this->_destroy(false); - } - - /** - * Move pointer at the specified document page and update page dimensions. - * @param int $pnum page number (1 ... numpages) - * @param boolean $resetmargins if true reset left, right, top margins and Y position. - * @access public - * @since 2.1.000 (2008-01-07) - * @see getPage(), lastpage(), getNumPages() - */ - public function setPage($pnum, $resetmargins=false) { - if (($pnum == $this->page) AND ($this->state == 2)) { - return; - } - if (($pnum > 0) AND ($pnum <= $this->numpages)) { - $this->state = 2; - // save current graphic settings - //$gvars = $this->getGraphicVars(); - $oldpage = $this->page; - $this->page = $pnum; - $this->wPt = $this->pagedim[$this->page]['w']; - $this->hPt = $this->pagedim[$this->page]['h']; - $this->w = $this->pagedim[$this->page]['wk']; - $this->h = $this->pagedim[$this->page]['hk']; - $this->tMargin = $this->pagedim[$this->page]['tm']; - $this->bMargin = $this->pagedim[$this->page]['bm']; - $this->original_lMargin = $this->pagedim[$this->page]['olm']; - $this->original_rMargin = $this->pagedim[$this->page]['orm']; - $this->AutoPageBreak = $this->pagedim[$this->page]['pb']; - $this->CurOrientation = $this->pagedim[$this->page]['or']; - $this->SetAutoPageBreak($this->AutoPageBreak, $this->bMargin); - // restore graphic settings - //$this->setGraphicVars($gvars); - if ($resetmargins) { - $this->lMargin = $this->pagedim[$this->page]['olm']; - $this->rMargin = $this->pagedim[$this->page]['orm']; - $this->SetY($this->tMargin); - } else { - // account for booklet mode - if ($this->pagedim[$this->page]['olm'] != $this->pagedim[$oldpage]['olm']) { - $deltam = $this->pagedim[$this->page]['olm'] - $this->pagedim[$this->page]['orm']; - $this->lMargin += $deltam; - $this->rMargin -= $deltam; - } - } - } else { - $this->Error('Wrong page number on setPage() function: '.$pnum); - } - } - - /** - * Reset pointer to the last document page. - * @param boolean $resetmargins if true reset left, right, top margins and Y position. - * @access public - * @since 2.0.000 (2008-01-04) - * @see setPage(), getPage(), getNumPages() - */ - public function lastPage($resetmargins=false) { - $this->setPage($this->getNumPages(), $resetmargins); - } - - /** - * Get current document page number. - * @return int page number - * @access public - * @since 2.1.000 (2008-01-07) - * @see setPage(), lastpage(), getNumPages() - */ - public function getPage() { - return $this->page; - } - - /** - * Get the total number of insered pages. - * @return int number of pages - * @access public - * @since 2.1.000 (2008-01-07) - * @see setPage(), getPage(), lastpage() - */ - public function getNumPages() { - return $this->numpages; - } - - /** - * Adds a new TOC (Table Of Content) page to the document. - * @param string $orientation page orientation. - * @param boolean $keepmargins if true overwrites the default page margins with the current margins - * @access public - * @since 5.0.001 (2010-05-06) - * @see AddPage(), startPage(), endPage(), endTOCPage() - */ - public function addTOCPage($orientation='', $format='', $keepmargins=false) { - $this->AddPage($orientation, $format, $keepmargins, true); - } - - /** - * Terminate the current TOC (Table Of Content) page - * @access public - * @since 5.0.001 (2010-05-06) - * @see AddPage(), startPage(), endPage(), addTOCPage() - */ - public function endTOCPage() { - $this->endPage(true); - } - - /** - * Adds a new page to the document. If a page is already present, the Footer() method is called first to output the footer (if enabled). Then the page is added, the current position set to the top-left corner according to the left and top margins (or top-right if in RTL mode), and Header() is called to display the header (if enabled). - * The origin of the coordinate system is at the top-left corner (or top-right for RTL) and increasing ordinates go downwards. - * @param string $orientation page orientation. Possible values are (case insensitive):
    • P or PORTRAIT (default)
    • L or LANDSCAPE
    - * @param mixed $format The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat(). - * @param boolean $keepmargins if true overwrites the default page margins with the current margins - * @param boolean $tocpage if true set the tocpage state to true (the added page will be used to display Table Of Content). - * @access public - * @since 1.0 - * @see startPage(), endPage(), addTOCPage(), endTOCPage(), getPageSizeFromFormat(), setPageFormat() - */ - public function AddPage($orientation='', $format='', $keepmargins=false, $tocpage=false) { - if ($this->inxobj) { - // we are inside an XObject template - return; - } - if (!isset($this->original_lMargin) OR $keepmargins) { - $this->original_lMargin = $this->lMargin; - } - if (!isset($this->original_rMargin) OR $keepmargins) { - $this->original_rMargin = $this->rMargin; - } - // terminate previous page - $this->endPage(); - // start new page - $this->startPage($orientation, $format, $tocpage); - } - - /** - * Terminate the current page - * @param boolean $tocpage if true set the tocpage state to false (end the page used to display Table Of Content). - * @access public - * @since 4.2.010 (2008-11-14) - * @see AddPage(), startPage(), addTOCPage(), endTOCPage() - */ - public function endPage($tocpage=false) { - // check if page is already closed - if (($this->page == 0) OR ($this->numpages > $this->page) OR (!$this->pageopen[$this->page])) { - return; - } - $this->InFooter = true; - // print page footer - $this->setFooter(); - // close page - $this->_endpage(); - // mark page as closed - $this->pageopen[$this->page] = false; - $this->InFooter = false; - if ($tocpage) { - $this->tocpage = false; - } - } - - /** - * Starts a new page to the document. The page must be closed using the endPage() function. - * The origin of the coordinate system is at the top-left corner and increasing ordinates go downwards. - * @param string $orientation page orientation. Possible values are (case insensitive):
    • P or PORTRAIT (default)
    • L or LANDSCAPE
    - * @param mixed $format The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat(). - * @access public - * @since 4.2.010 (2008-11-14) - * @see AddPage(), endPage(), addTOCPage(), endTOCPage(), getPageSizeFromFormat(), setPageFormat() - */ - public function startPage($orientation='', $format='', $tocpage=false) { - if ($tocpage) { - $this->tocpage = true; - } - if ($this->numpages > $this->page) { - // this page has been already added - $this->setPage($this->page + 1); - $this->SetY($this->tMargin); - return; - } - // start a new page - if ($this->state == 0) { - $this->Open(); - } - ++$this->numpages; - $this->swapMargins($this->booklet); - // save current graphic settings - $gvars = $this->getGraphicVars(); - // start new page - $this->_beginpage($orientation, $format); - // mark page as open - $this->pageopen[$this->page] = true; - // restore graphic settings - $this->setGraphicVars($gvars); - // mark this point - $this->setPageMark(); - // print page header - $this->setHeader(); - // restore graphic settings - $this->setGraphicVars($gvars); - // mark this point - $this->setPageMark(); - // print table header (if any) - $this->setTableHeader(); - // set mark for empty page check - $this->emptypagemrk[$this->page]= $this->pagelen[$this->page]; - } - - /** - * Set start-writing mark on current page stream used to put borders and fills. - * Borders and fills are always created after content and inserted on the position marked by this method. - * This function must be called after calling Image() function for a background image. - * Background images must be always inserted before calling Multicell() or WriteHTMLCell() or WriteHTML() functions. - * @access public - * @since 4.0.016 (2008-07-30) - */ - public function setPageMark() { - $this->intmrk[$this->page] = $this->pagelen[$this->page]; - $this->bordermrk[$this->page] = $this->intmrk[$this->page]; - $this->setContentMark(); - } - - /** - * Set start-writing mark on selected page. - * Borders and fills are always created after content and inserted on the position marked by this method. - * @param int $page page number (default is the current page) - * @access protected - * @since 4.6.021 (2009-07-20) - */ - protected function setContentMark($page=0) { - if ($page <= 0) { - $page = $this->page; - } - if (isset($this->footerlen[$page])) { - $this->cntmrk[$page] = $this->pagelen[$page] - $this->footerlen[$page]; - } else { - $this->cntmrk[$page] = $this->pagelen[$page]; - } - } - - /** - * Set header data. - * @param string $ln header image logo - * @param string $lw header image logo width in mm - * @param string $ht string to print as title on document header - * @param string $hs string to print on document header - * @access public - */ - public function setHeaderData($ln='', $lw=0, $ht='', $hs='') { - $this->header_logo = $ln; - $this->header_logo_width = $lw; - $this->header_title = $ht; - $this->header_string = $hs; - } - - /** - * Returns header data: - *
    • $ret['logo'] = logo image
    • $ret['logo_width'] = width of the image logo in user units
    • $ret['title'] = header title
    • $ret['string'] = header description string
    - * @return array() - * @access public - * @since 4.0.012 (2008-07-24) - */ - public function getHeaderData() { - $ret = array(); - $ret['logo'] = $this->header_logo; - $ret['logo_width'] = $this->header_logo_width; - $ret['title'] = $this->header_title; - $ret['string'] = $this->header_string; - return $ret; - } - - /** - * Set header margin. - * (minimum distance between header and top page margin) - * @param int $hm distance in user units - * @access public - */ - public function setHeaderMargin($hm=10) { - $this->header_margin = $hm; - } - - /** - * Returns header margin in user units. - * @return float - * @since 4.0.012 (2008-07-24) - * @access public - */ - public function getHeaderMargin() { - return $this->header_margin; - } - - /** - * Set footer margin. - * (minimum distance between footer and bottom page margin) - * @param int $fm distance in user units - * @access public - */ - public function setFooterMargin($fm=10) { - $this->footer_margin = $fm; - } - - /** - * Returns footer margin in user units. - * @return float - * @since 4.0.012 (2008-07-24) - * @access public - */ - public function getFooterMargin() { - return $this->footer_margin; - } - /** - * Set a flag to print page header. - * @param boolean $val set to true to print the page header (default), false otherwise. - * @access public - */ - public function setPrintHeader($val=true) { - $this->print_header = $val; - } - - /** - * Set a flag to print page footer. - * @param boolean $value set to true to print the page footer (default), false otherwise. - * @access public - */ - public function setPrintFooter($val=true) { - $this->print_footer = $val; - } - - /** - * Return the right-bottom (or left-bottom for RTL) corner X coordinate of last inserted image - * @return float - * @access public - */ - public function getImageRBX() { - return $this->img_rb_x; - } - - /** - * Return the right-bottom (or left-bottom for RTL) corner Y coordinate of last inserted image - * @return float - * @access public - */ - public function getImageRBY() { - return $this->img_rb_y; - } - - /** - * This method is used to render the page header. - * It is automatically called by AddPage() and could be overwritten in your own inherited class. - * @access public - */ - public function Header() { - $ormargins = $this->getOriginalMargins(); - $headerfont = $this->getHeaderFont(); - $headerdata = $this->getHeaderData(); - if (($headerdata['logo']) AND ($headerdata['logo'] != K_BLANK_IMAGE)) { - $this->Image(K_PATH_IMAGES.$headerdata['logo'], '', '', $headerdata['logo_width']); - $imgy = $this->getImageRBY(); - } else { - $imgy = $this->GetY(); - } - $cell_height = round(($this->getCellHeightRatio() * $headerfont[2]) / $this->getScaleFactor(), 2); - // set starting margin for text data cell - if ($this->getRTL()) { - $header_x = $ormargins['right'] + ($headerdata['logo_width'] * 1.1); - } else { - $header_x = $ormargins['left'] + ($headerdata['logo_width'] * 1.1); - } - $this->SetTextColor(0, 0, 0); - // header title - $this->SetFont($headerfont[0], 'B', $headerfont[2] + 1); - $this->SetX($header_x); - $this->Cell(0, $cell_height, $headerdata['title'], 0, 1, '', 0, '', 0); - // header string - $this->SetFont($headerfont[0], $headerfont[1], $headerfont[2]); - $this->SetX($header_x); - $this->MultiCell(0, $cell_height, $headerdata['string'], 0, '', 0, 1, '', '', true, 0, false); - // print an ending header line - $this->SetLineStyle(array('width' => 0.85 / $this->getScaleFactor(), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); - $this->SetY((2.835 / $this->getScaleFactor()) + max($imgy, $this->GetY())); - if ($this->getRTL()) { - $this->SetX($ormargins['right']); - } else { - $this->SetX($ormargins['left']); - } - $this->Cell(0, 0, '', 'T', 0, 'C'); - } - - /** - * This method is used to render the page footer. - * It is automatically called by AddPage() and could be overwritten in your own inherited class. - * @access public - */ - public function Footer() { - $cur_y = $this->GetY(); - $ormargins = $this->getOriginalMargins(); - $this->SetTextColor(0, 0, 0); - //set style for cell border - $line_width = 0.85 / $this->getScaleFactor(); - $this->SetLineStyle(array('width' => $line_width, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); - //print document barcode - $barcode = $this->getBarcode(); - if (!empty($barcode)) { - $this->Ln($line_width); - $barcode_width = round(($this->getPageWidth() - $ormargins['left'] - $ormargins['right']) / 3); - $style = array( - 'position' => $this->rtl?'R':'L', - 'align' => $this->rtl?'R':'L', - 'stretch' => false, - 'fitwidth' => true, - 'cellfitalign' => '', - 'border' => false, - 'padding' => 0, - 'fgcolor' => array(0,0,0), - 'bgcolor' => false, - 'text' => false - ); - $this->write1DBarcode($barcode, 'C128B', '', $cur_y + $line_width, '', (($this->getFooterMargin() / 3) - $line_width), 0.3, $style, ''); - } - if (empty($this->pagegroups)) { - $pagenumtxt = $this->l['w_page'].' '.$this->getAliasNumPage().' / '.$this->getAliasNbPages(); - } else { - $pagenumtxt = $this->l['w_page'].' '.$this->getPageNumGroupAlias().' / '.$this->getPageGroupAlias(); - } - $this->SetY($cur_y); - //Print page number - if ($this->getRTL()) { - $this->SetX($ormargins['right']); - $this->Cell(0, 0, $pagenumtxt, 'T', 0, 'L'); - } else { - $this->SetX($ormargins['left']); - $this->Cell(0, 0, $pagenumtxt, 'T', 0, 'R'); - } - } - - /** - * This method is used to render the page header. - * @access protected - * @since 4.0.012 (2008-07-24) - */ - protected function setHeader() { - if ($this->print_header) { - $this->setGraphicVars($this->default_graphic_vars); - $temp_thead = $this->thead; - $temp_theadMargins = $this->theadMargins; - $lasth = $this->lasth; - $this->_out('q'); - $this->rMargin = $this->original_rMargin; - $this->lMargin = $this->original_lMargin; - $this->SetCellPadding(0); - //set current position - if ($this->rtl) { - $this->SetXY($this->original_rMargin, $this->header_margin); - } else { - $this->SetXY($this->original_lMargin, $this->header_margin); - } - $this->SetFont($this->header_font[0], $this->header_font[1], $this->header_font[2]); - $this->Header(); - //restore position - if ($this->rtl) { - $this->SetXY($this->original_rMargin, $this->tMargin); - } else { - $this->SetXY($this->original_lMargin, $this->tMargin); - } - $this->_out('Q'); - $this->lasth = $lasth; - $this->thead = $temp_thead; - $this->theadMargins = $temp_theadMargins; - $this->newline = false; - } - } - - /** - * This method is used to render the page footer. - * @access protected - * @since 4.0.012 (2008-07-24) - */ - protected function setFooter() { - //Page footer - // save current graphic settings - $gvars = $this->getGraphicVars(); - // mark this point - $this->footerpos[$this->page] = $this->pagelen[$this->page]; - $this->_out("\n"); - if ($this->print_footer) { - $this->setGraphicVars($this->default_graphic_vars); - $this->current_column = 0; - $this->num_columns = 1; - $temp_thead = $this->thead; - $temp_theadMargins = $this->theadMargins; - $lasth = $this->lasth; - $this->_out('q'); - $this->rMargin = $this->original_rMargin; - $this->lMargin = $this->original_lMargin; - $this->SetCellPadding(0); - //set current position - $footer_y = $this->h - $this->footer_margin; - if ($this->rtl) { - $this->SetXY($this->original_rMargin, $footer_y); - } else { - $this->SetXY($this->original_lMargin, $footer_y); - } - $this->SetFont($this->footer_font[0], $this->footer_font[1], $this->footer_font[2]); - $this->Footer(); - //restore position - if ($this->rtl) { - $this->SetXY($this->original_rMargin, $this->tMargin); - } else { - $this->SetXY($this->original_lMargin, $this->tMargin); - } - $this->_out('Q'); - $this->lasth = $lasth; - $this->thead = $temp_thead; - $this->theadMargins = $temp_theadMargins; - } - // restore graphic settings - $this->setGraphicVars($gvars); - $this->current_column = $gvars['current_column']; - $this->num_columns = $gvars['num_columns']; - // calculate footer length - $this->footerlen[$this->page] = $this->pagelen[$this->page] - $this->footerpos[$this->page] + 1; - } - - /** - * This method is used to render the table header on new page (if any). - * @access protected - * @since 4.5.030 (2009-03-25) - */ - protected function setTableHeader() { - if ($this->num_columns > 1) { - // multi column mode - return; - } - if (isset($this->theadMargins['top'])) { - // restore the original top-margin - $this->tMargin = $this->theadMargins['top']; - $this->pagedim[$this->page]['tm'] = $this->tMargin; - $this->y = $this->tMargin; - } - if (!$this->empty_string($this->thead) AND (!$this->inthead)) { - // set margins - $prev_lMargin = $this->lMargin; - $prev_rMargin = $this->rMargin; - $prev_cell_padding = $this->cell_padding; - $this->lMargin = $this->theadMargins['lmargin'] + ($this->pagedim[$this->page]['olm'] - $this->pagedim[$this->theadMargins['page']]['olm']); - $this->rMargin = $this->theadMargins['rmargin'] + ($this->pagedim[$this->page]['orm'] - $this->pagedim[$this->theadMargins['page']]['orm']); - $this->cell_padding = $this->theadMargins['cell_padding']; - if ($this->rtl) { - $this->x = $this->w - $this->rMargin; - } else { - $this->x = $this->lMargin; - } - // print table header - $this->writeHTML($this->thead, false, false, false, false, ''); - // set new top margin to skip the table headers - if (!isset($this->theadMargins['top'])) { - $this->theadMargins['top'] = $this->tMargin; - } - $this->tMargin = $this->y; - $this->pagedim[$this->page]['tm'] = $this->tMargin; - $this->lasth = 0; - $this->lMargin = $prev_lMargin; - $this->rMargin = $prev_rMargin; - $this->cell_padding = $prev_cell_padding; - } - } - - /** - * Returns the current page number. - * @return int page number - * @access public - * @since 1.0 - * @see AliasNbPages(), getAliasNbPages() - */ - public function PageNo() { - return $this->page; - } - - /** - * Defines a new spot color. - * It can be expressed in RGB components or gray scale. - * The method can be called before the first page is created and the value is retained from page to page. - * @param int $c Cyan color for CMYK. Value between 0 and 255 - * @param int $m Magenta color for CMYK. Value between 0 and 255 - * @param int $y Yellow color for CMYK. Value between 0 and 255 - * @param int $k Key (Black) color for CMYK. Value between 0 and 255 - * @access public - * @since 4.0.024 (2008-09-12) - * @see SetDrawSpotColor(), SetFillSpotColor(), SetTextSpotColor() - */ - public function AddSpotColor($name, $c, $m, $y, $k) { - if (!isset($this->spot_colors[$name])) { - $i = 1 + count($this->spot_colors); - $this->spot_colors[$name] = array('i' => $i, 'c' => $c, 'm' => $m, 'y' => $y, 'k' => $k); - } - } - - /** - * Defines the color used for all drawing operations (lines, rectangles and cell borders). - * It can be expressed in RGB components or gray scale. - * The method can be called before the first page is created and the value is retained from page to page. - * @param array $color array of colors - * @param boolean $ret if true do not send the command. - * @return string the PDF command - * @access public - * @since 3.1.000 (2008-06-11) - * @see SetDrawColor() - */ - public function SetDrawColorArray($color, $ret=false) { - if (is_array($color)) { - $color = array_values($color); - $r = isset($color[0]) ? $color[0] : -1; - $g = isset($color[1]) ? $color[1] : -1; - $b = isset($color[2]) ? $color[2] : -1; - $k = isset($color[3]) ? $color[3] : -1; - if ($r >= 0) { - return $this->SetDrawColor($r, $g, $b, $k, $ret); - } - } - return ''; - } - - /** - * Defines the color used for all drawing operations (lines, rectangles and cell borders). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. - * @param int $col1 Gray level for single color, or Red color for RGB, or Cyan color for CMYK. Value between 0 and 255 - * @param int $col2 Green color for RGB, or Magenta color for CMYK. Value between 0 and 255 - * @param int $col3 Blue color for RGB, or Yellow color for CMYK. Value between 0 and 255 - * @param int $col4 Key (Black) color for CMYK. Value between 0 and 255 - * @param boolean $ret if true do not send the command. - * @return string the PDF command - * @access public - * @since 1.3 - * @see SetDrawColorArray(), SetFillColor(), SetTextColor(), Line(), Rect(), Cell(), MultiCell() - */ - public function SetDrawColor($col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false) { - // set default values - if (!is_numeric($col1)) { - $col1 = 0; - } - if (!is_numeric($col2)) { - $col2 = -1; - } - if (!is_numeric($col3)) { - $col3 = -1; - } - if (!is_numeric($col4)) { - $col4 = -1; - } - //Set color for all stroking operations - if (($col2 == -1) AND ($col3 == -1) AND ($col4 == -1)) { - // Grey scale - $this->DrawColor = sprintf('%.3F G', $col1/255); - $this->strokecolor = array('G' => $col1); - } elseif ($col4 == -1) { - // RGB - $this->DrawColor = sprintf('%.3F %.3F %.3F RG', $col1/255, $col2/255, $col3/255); - $this->strokecolor = array('R' => $col1, 'G' => $col2, 'B' => $col3); - } else { - // CMYK - $this->DrawColor = sprintf('%.3F %.3F %.3F %.3F K', $col1/100, $col2/100, $col3/100, $col4/100); - $this->strokecolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4); - } - if ($this->page > 0) { - if (!$ret) { - $this->_out($this->DrawColor); - } - return $this->DrawColor; - } - return ''; - } - - /** - * Defines the spot color used for all drawing operations (lines, rectangles and cell borders). - * @param string $name name of the spot color - * @param int $tint the intensity of the color (from 0 to 100 ; 100 = full intensity by default). - * @access public - * @since 4.0.024 (2008-09-12) - * @see AddSpotColor(), SetFillSpotColor(), SetTextSpotColor() - */ - public function SetDrawSpotColor($name, $tint=100) { - if (!isset($this->spot_colors[$name])) { - $this->Error('Undefined spot color: '.$name); - } - $this->DrawColor = sprintf('/CS%d CS %.3F SCN', $this->spot_colors[$name]['i'], $tint/100); - if ($this->page > 0) { - $this->_out($this->DrawColor); - } - } - - /** - * Defines the color used for all filling operations (filled rectangles and cell backgrounds). - * It can be expressed in RGB components or gray scale. - * The method can be called before the first page is created and the value is retained from page to page. - * @param array $color array of colors - * @access public - * @since 3.1.000 (2008-6-11) - * @see SetFillColor() - */ - public function SetFillColorArray($color) { - if (is_array($color)) { - $color = array_values($color); - $r = isset($color[0]) ? $color[0] : -1; - $g = isset($color[1]) ? $color[1] : -1; - $b = isset($color[2]) ? $color[2] : -1; - $k = isset($color[3]) ? $color[3] : -1; - if ($r >= 0) { - $this->SetFillColor($r, $g, $b, $k); - } - } - } - - /** - * Defines the color used for all filling operations (filled rectangles and cell backgrounds). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. - * @param int $col1 Gray level for single color, or Red color for RGB, or Cyan color for CMYK. Value between 0 and 255 - * @param int $col2 Green color for RGB, or Magenta color for CMYK. Value between 0 and 255 - * @param int $col3 Blue color for RGB, or Yellow color for CMYK. Value between 0 and 255 - * @param int $col4 Key (Black) color for CMYK. Value between 0 and 255 - * @access public - * @since 1.3 - * @see SetFillColorArray(), SetDrawColor(), SetTextColor(), Rect(), Cell(), MultiCell() - */ - public function SetFillColor($col1=0, $col2=-1, $col3=-1, $col4=-1) { - // set default values - if (!is_numeric($col1)) { - $col1 = 0; - } - if (!is_numeric($col2)) { - $col2 = -1; - } - if (!is_numeric($col3)) { - $col3 = -1; - } - if (!is_numeric($col4)) { - $col4 = -1; - } - //Set color for all filling operations - if (($col2 == -1) AND ($col3 == -1) AND ($col4 == -1)) { - // Grey scale - $this->FillColor = sprintf('%.3F g', $col1/255); - $this->bgcolor = array('G' => $col1); - } elseif ($col4 == -1) { - // RGB - $this->FillColor = sprintf('%.3F %.3F %.3F rg', $col1/255, $col2/255, $col3/255); - $this->bgcolor = array('R' => $col1, 'G' => $col2, 'B' => $col3); - } else { - // CMYK - $this->FillColor = sprintf('%.3F %.3F %.3F %.3F k', $col1/100, $col2/100, $col3/100, $col4/100); - $this->bgcolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4); - } - $this->ColorFlag = ($this->FillColor != $this->TextColor); - if ($this->page > 0) { - $this->_out($this->FillColor); - } - } - - /** - * Defines the spot color used for all filling operations (filled rectangles and cell backgrounds). - * @param string $name name of the spot color - * @param int $tint the intensity of the color (from 0 to 100 ; 100 = full intensity by default). - * @access public - * @since 4.0.024 (2008-09-12) - * @see AddSpotColor(), SetDrawSpotColor(), SetTextSpotColor() - */ - public function SetFillSpotColor($name, $tint=100) { - if (!isset($this->spot_colors[$name])) { - $this->Error('Undefined spot color: '.$name); - } - $this->FillColor = sprintf('/CS%d cs %.3F scn', $this->spot_colors[$name]['i'], $tint/100); - $this->ColorFlag = ($this->FillColor != $this->TextColor); - if ($this->page > 0) { - $this->_out($this->FillColor); - } - } - - /** - * Defines the color used for text. It can be expressed in RGB components or gray scale. - * The method can be called before the first page is created and the value is retained from page to page. - * @param array $color array of colors - * @access public - * @since 3.1.000 (2008-6-11) - * @see SetFillColor() - */ - public function SetTextColorArray($color) { - if (is_array($color)) { - $color = array_values($color); - $r = isset($color[0]) ? $color[0] : -1; - $g = isset($color[1]) ? $color[1] : -1; - $b = isset($color[2]) ? $color[2] : -1; - $k = isset($color[3]) ? $color[3] : -1; - if ($r >= 0) { - $this->SetTextColor($r, $g, $b, $k); - } - } - } - - /** - * Defines the color used for text. It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. - * @param int $col1 Gray level for single color, or Red color for RGB, or Cyan color for CMYK. Value between 0 and 255 - * @param int $col2 Green color for RGB, or Magenta color for CMYK. Value between 0 and 255 - * @param int $col3 Blue color for RGB, or Yellow color for CMYK. Value between 0 and 255 - * @param int $col4 Key (Black) color for CMYK. Value between 0 and 255 - * @access public - * @since 1.3 - * @see SetTextColorArray(), SetDrawColor(), SetFillColor(), Text(), Cell(), MultiCell() - */ - public function SetTextColor($col1=0, $col2=-1, $col3=-1, $col4=-1) { - // set default values - if (!is_numeric($col1)) { - $col1 = 0; - } - if (!is_numeric($col2)) { - $col2 = -1; - } - if (!is_numeric($col3)) { - $col3 = -1; - } - if (!is_numeric($col4)) { - $col4 = -1; - } - //Set color for text - if (($col2 == -1) AND ($col3 == -1) AND ($col4 == -1)) { - // Grey scale - $this->TextColor = sprintf('%.3F g', $col1/255); - $this->fgcolor = array('G' => $col1); - } elseif ($col4 == -1) { - // RGB - $this->TextColor = sprintf('%.3F %.3F %.3F rg', $col1/255, $col2/255, $col3/255); - $this->fgcolor = array('R' => $col1, 'G' => $col2, 'B' => $col3); - } else { - // CMYK - $this->TextColor = sprintf('%.3F %.3F %.3F %.3F k', $col1/100, $col2/100, $col3/100, $col4/100); - $this->fgcolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4); - } - $this->ColorFlag = ($this->FillColor != $this->TextColor); - } - - /** - * Defines the spot color used for text. - * @param string $name name of the spot color - * @param int $tint the intensity of the color (from 0 to 100 ; 100 = full intensity by default). - * @access public - * @since 4.0.024 (2008-09-12) - * @see AddSpotColor(), SetDrawSpotColor(), SetFillSpotColor() - */ - public function SetTextSpotColor($name, $tint=100) { - if (!isset($this->spot_colors[$name])) { - $this->Error('Undefined spot color: '.$name); - } - $this->TextColor = sprintf('/CS%d cs %.3F scn', $this->spot_colors[$name]['i'], $tint/100); - $this->ColorFlag = ($this->FillColor != $this->TextColor); - if ($this->page > 0) { - $this->_out($this->TextColor); - } - } - - /** - * Returns the length of a string in user unit. A font must be selected.
    - * @param string $s The string whose length is to be computed - * @param string $fontname Family font. It can be either a name defined by AddFont() or one of the standard families. It is also possible to pass an empty string, in that case, the current family is retained. - * @param string $fontstyle Font style. Possible values are (case insensitive):
    • empty string: regular
    • B: bold
    • I: italic
    • U: underline
    • D: line-trough
    • O: overline
    or any combination. The default value is regular. - * @param float $fontsize Font size in points. The default value is the current size. - * @param boolean $getarray if true returns an array of characters widths, if false returns the total length. - * @return mixed int total string length or array of characted widths - * @author Nicola Asuni - * @access public - * @since 1.2 - */ - public function GetStringWidth($s, $fontname='', $fontstyle='', $fontsize=0, $getarray=false) { - return $this->GetArrStringWidth($this->utf8Bidi($this->UTF8StringToArray($s), $s, $this->tmprtl), $fontname, $fontstyle, $fontsize, $getarray); - } - - /** - * Returns the string length of an array of chars in user unit or an array of characters widths. A font must be selected.
    - * @param string $sa The array of chars whose total length is to be computed - * @param string $fontname Family font. It can be either a name defined by AddFont() or one of the standard families. It is also possible to pass an empty string, in that case, the current family is retained. - * @param string $fontstyle Font style. Possible values are (case insensitive):
    • empty string: regular
    • B: bold
    • I: italic
    • U: underline
    • D: line trough
    • O: overline
    or any combination. The default value is regular. - * @param float $fontsize Font size in points. The default value is the current size. - * @param boolean $getarray if true returns an array of characters widths, if false returns the total length. - * @return mixed int total string length or array of characted widths - * @author Nicola Asuni - * @access public - * @since 2.4.000 (2008-03-06) - */ - public function GetArrStringWidth($sa, $fontname='', $fontstyle='', $fontsize=0, $getarray=false) { - // store current values - if (!$this->empty_string($fontname)) { - $prev_FontFamily = $this->FontFamily; - $prev_FontStyle = $this->FontStyle; - $prev_FontSizePt = $this->FontSizePt; - $this->SetFont($fontname, $fontstyle, $fontsize); - } - // convert UTF-8 array to Latin1 if required - $sa = $this->UTF8ArrToLatin1($sa); - $w = 0; // total width - $wa = array(); // array of characters widths - foreach ($sa as $ck => $char) { - // character width - $cw = $this->GetCharWidth($char, isset($sa[($ck + 1)])); - $wa[] = $cw; - $w += $cw; - } - // restore previous values - if (!$this->empty_string($fontname)) { - $this->SetFont($prev_FontFamily, $prev_FontStyle, $prev_FontSizePt); - } - if ($getarray) { - return $wa; - } - return $w; - } - - /** - * Returns the length of the char in user unit for the current font considering current stretching and spacing (tracking/kerning). - * @param int $char The char code whose length is to be returned - * @param boolean $notlast set to false for the latest character on string, true otherwise (default) - * @return float char width - * @author Nicola Asuni - * @access public - * @since 2.4.000 (2008-03-06) - */ - public function GetCharWidth($char, $notlast=true) { - // get raw width - $chw = $this->getRawCharWidth($char); - if (($this->font_spacing != 0) AND $notlast) { - // increase/decrease font spacing - $chw += $this->font_spacing; - } - if ($this->font_stretching != 100) { - // fixed stretching mode - $chw *= ($this->font_stretching / 100); - } - return $chw; - } - - /** - * Returns the length of the char in user unit for the current font. - * @param int $char The char code whose length is to be returned - * @return float char width - * @author Nicola Asuni - * @access public - * @since 5.9.000 (2010-09-28) - */ - public function getRawCharWidth($char) { - if ($char == 173) { - // SHY character will not be printed - return (0); - } - $cw = &$this->CurrentFont['cw']; - if (isset($cw[$char])) { - $w = $cw[$char]; - } elseif (isset($this->CurrentFont['dw'])) { - // default width - $w = $this->CurrentFont['dw']; - } elseif (isset($cw[32])) { - // default width - $w = $cw[32]; - } else { - $w = 600; - } - return ($w * $this->FontSize / 1000); - } - - /** - * Returns the numbero of characters in a string. - * @param string $s The input string. - * @return int number of characters - * @access public - * @since 2.0.0001 (2008-01-07) - */ - public function GetNumChars($s) { - if ($this->isUnicodeFont()) { - return count($this->UTF8StringToArray($s)); - } - return strlen($s); - } - - /** - * Fill the list of available fonts ($this->fontlist). - * @access protected - * @since 4.0.013 (2008-07-28) - */ - protected function getFontsList() { - $fontsdir = opendir($this->_getfontpath()); - while (($file = readdir($fontsdir)) !== false) { - if (substr($file, -4) == '.php') { - array_push($this->fontlist, strtolower(basename($file, '.php'))); - } - } - closedir($fontsdir); - } - - /** - * Imports a TrueType, Type1, core, or CID0 font and makes it available. - * It is necessary to generate a font definition file first (read /fonts/utils/README.TXT). - * The definition file (and the font file itself when embedding) must be present either in the current directory or in the one indicated by K_PATH_FONTS if the constant is defined. If it could not be found, the error "Could not include font definition file" is generated. - * @param string $family Font family. The name can be chosen arbitrarily. If it is a standard family name, it will override the corresponding font. - * @param string $style Font style. Possible values are (case insensitive):
    • empty string: regular (default)
    • B: bold
    • I: italic
    • BI or IB: bold italic
    - * @param string $fontfile The font definition file. By default, the name is built from the family and style, in lower case with no spaces. - * @return array containing the font data, or false in case of error. - * @param mixed $subset if true embedd only a subset of the font (stores only the information related to the used characters); if false embedd full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font. - * @access public - * @since 1.5 - * @see SetFont(), setFontSubsetting() - */ - public function AddFont($family, $style='', $fontfile='', $subset='default') { - if ($subset === 'default') { - $subset = $this->font_subsetting; - } - if ($this->empty_string($family)) { - if (!$this->empty_string($this->FontFamily)) { - $family = $this->FontFamily; - } else { - $this->Error('Empty font family'); - } - } - // move embedded styles on $style - if (substr($family, -1) == 'I') { - $style .= 'I'; - $family = substr($family, 0, -1); - } - if (substr($family, -1) == 'B') { - $style .= 'B'; - $family = substr($family, 0, -1); - } - // normalize family name - $family = strtolower($family); - if ((!$this->isunicode) AND ($family == 'arial')) { - $family = 'helvetica'; - } - if (($family == 'symbol') OR ($family == 'zapfdingbats')) { - $style = ''; - } - $tempstyle = strtoupper($style); - $style = ''; - // underline - if (strpos($tempstyle, 'U') !== false) { - $this->underline = true; - } else { - $this->underline = false; - } - // line-through (deleted) - if (strpos($tempstyle, 'D') !== false) { - $this->linethrough = true; - } else { - $this->linethrough = false; - } - // overline - if (strpos($tempstyle, 'O') !== false) { - $this->overline = true; - } else { - $this->overline = false; - } - // bold - if (strpos($tempstyle, 'B') !== false) { - $style .= 'B'; - } - // oblique - if (strpos($tempstyle, 'I') !== false) { - $style .= 'I'; - } - $bistyle = $style; - $fontkey = $family.$style; - $font_style = $style.($this->underline ? 'U' : '').($this->linethrough ? 'D' : '').($this->overline ? 'O' : ''); - $fontdata = array('fontkey' => $fontkey, 'family' => $family, 'style' => $font_style); - // check if the font has been already added - $fb = $this->getFontBuffer($fontkey); - if ($fb !== false) { - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['fonts'][$fontkey] = $fb['i']; - } - return $fontdata; - } - if (isset($type)) { - unset($type); - } - if (isset($cw)) { - unset($cw); - } - // get specified font directory (if any) - $fontdir = false; - if (!$this->empty_string($fontfile)) { - $fontdir = dirname($fontfile); - if ($this->empty_string($fontdir) OR ($fontdir == '.')) { - $fontdir = ''; - } else { - $fontdir .= '/'; - } - } - // search and include font file - if ($this->empty_string($fontfile) OR (!file_exists($fontfile))) { - // build a standard filenames for specified font - $fontfile1 = str_replace(' ', '', $family).strtolower($style).'.php'; - $fontfile2 = str_replace(' ', '', $family).'.php'; - // search files on various directories - if (($fontdir !== false) AND file_exists($fontdir.$fontfile1)) { - $fontfile = $fontdir.$fontfile1; - } elseif (file_exists($this->_getfontpath().$fontfile1)) { - $fontfile = $this->_getfontpath().$fontfile1; - } elseif (file_exists($fontfile1)) { - $fontfile = $fontfile1; - } elseif (($fontdir !== false) AND file_exists($fontdir.$fontfile2)) { - $fontfile = $fontdir.$fontfile2; - } elseif (file_exists($this->_getfontpath().$fontfile2)) { - $fontfile = $this->_getfontpath().$fontfile2; - } else { - $fontfile = $fontfile2; - } - } - // include font file - if (file_exists($fontfile)) { - include($fontfile); - } else { - $this->Error('Could not include font definition file: '.$family.''); - } - // check font parameters - if ((!isset($type)) OR (!isset($cw))) { - $this->Error('The font definition file has a bad format: '.$fontfile.''); - } - // SET default parameters - if (!isset($file) OR $this->empty_string($file)) { - $file = ''; - } - if (!isset($enc) OR $this->empty_string($enc)) { - $enc = ''; - } - if (!isset($cidinfo) OR $this->empty_string($cidinfo)) { - $cidinfo = array('Registry'=>'Adobe','Ordering'=>'Identity','Supplement'=>0); - $cidinfo['uni2cid'] = array(); - } - if (!isset($ctg) OR $this->empty_string($ctg)) { - $ctg = ''; - } - if (!isset($desc) OR $this->empty_string($desc)) { - $desc = array(); - } - if (!isset($up) OR $this->empty_string($up)) { - $up = -100; - } - if (!isset($ut) OR $this->empty_string($ut)) { - $ut = 50; - } - if (!isset($cw) OR $this->empty_string($cw)) { - $cw = array(); - } - if (!isset($dw) OR $this->empty_string($dw)) { - // set default width - if (isset($desc['MissingWidth']) AND ($desc['MissingWidth'] > 0)) { - $dw = $desc['MissingWidth']; - } elseif (isset($cw[32])) { - $dw = $cw[32]; - } else { - $dw = 600; - } - } - ++$this->numfonts; - if ($type == 'cidfont0') { - // register CID font (all styles at once) - $styles = array('' => '', 'B' => ',Bold', 'I' => ',Italic', 'BI' => ',BoldItalic'); - $sname = $name.$styles[$bistyle]; - // artificial bold - if (strpos($bistyle, 'B') !== false) { - if (isset($desc['StemV'])) { - $desc['StemV'] *= 2; - } else { - $desc['StemV'] = 120; - } - } - // artificial italic - if (strpos($bistyle, 'I') !== false) { - if (isset($desc['ItalicAngle'])) { - $desc['ItalicAngle'] -= 11; - } else { - $desc['ItalicAngle'] = -11; - } - } - } elseif ($type == 'core') { - $name = $this->CoreFonts[$fontkey]; - $subset = false; - } elseif (($type == 'TrueType') OR ($type == 'Type1')) { - $subset = false; - } elseif ($type == 'TrueTypeUnicode') { - $enc = 'Identity-H'; - } else { - $this->Error('Unknow font type: '.$type.''); - } - // initialize subsetchars to contain default ASCII values (0-255) - $subsetchars = array_fill(0, 256, true); - $this->setFontBuffer($fontkey, array('fontkey' => $fontkey, 'i' => $this->numfonts, 'type' => $type, 'name' => $name, 'desc' => $desc, 'up' => $up, 'ut' => $ut, 'cw' => $cw, 'dw' => $dw, 'enc' => $enc, 'cidinfo' => $cidinfo, 'file' => $file, 'ctg' => $ctg, 'subset' => $subset, 'subsetchars' => $subsetchars)); - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['fonts'][$fontkey] = $this->numfonts; - } - if (isset($diff) AND (!empty($diff))) { - //Search existing encodings - $d = 0; - $nb = count($this->diffs); - for ($i=1; $i <= $nb; ++$i) { - if ($this->diffs[$i] == $diff) { - $d = $i; - break; - } - } - if ($d == 0) { - $d = $nb + 1; - $this->diffs[$d] = $diff; - } - $this->setFontSubBuffer($fontkey, 'diff', $d); - } - if (!$this->empty_string($file)) { - if (!isset($this->FontFiles[$file])) { - if ((strcasecmp($type,'TrueType') == 0) OR (strcasecmp($type, 'TrueTypeUnicode') == 0)) { - $this->FontFiles[$file] = array('length1' => $originalsize, 'fontdir' => $fontdir, 'subset' => $subset, 'fontkeys' => array($fontkey)); - } elseif ($type != 'core') { - $this->FontFiles[$file] = array('length1' => $size1, 'length2' => $size2, 'fontdir' => $fontdir, 'subset' => $subset, 'fontkeys' => array($fontkey)); - } - } else { - // update fontkeys that are sharing this font file - $this->FontFiles[$file]['subset'] = ($this->FontFiles[$file]['subset'] AND $subset); - if (!in_array($fontkey, $this->FontFiles[$file]['fontkeys'])) { - $this->FontFiles[$file]['fontkeys'][] = $fontkey; - } - } - } - return $fontdata; - } - - /** - * Sets the font used to print character strings. - * The font can be either a standard one or a font added via the AddFont() method. Standard fonts use Windows encoding cp1252 (Western Europe). - * The method can be called before the first page is created and the font is retained from page to page. - * If you just wish to change the current font size, it is simpler to call SetFontSize(). - * Note: for the standard fonts, the font metric files must be accessible. There are three possibilities for this:
    • They are in the current directory (the one where the running script lies)
    • They are in one of the directories defined by the include_path parameter
    • They are in the directory defined by the K_PATH_FONTS constant

    - * @param string $family Family font. It can be either a name defined by AddFont() or one of the standard Type1 families (case insensitive):
    • times (Times-Roman)
    • timesb (Times-Bold)
    • timesi (Times-Italic)
    • timesbi (Times-BoldItalic)
    • helvetica (Helvetica)
    • helveticab (Helvetica-Bold)
    • helveticai (Helvetica-Oblique)
    • helveticabi (Helvetica-BoldOblique)
    • courier (Courier)
    • courierb (Courier-Bold)
    • courieri (Courier-Oblique)
    • courierbi (Courier-BoldOblique)
    • symbol (Symbol)
    • zapfdingbats (ZapfDingbats)
    It is also possible to pass an empty string. In that case, the current family is retained. - * @param string $style Font style. Possible values are (case insensitive):
    • empty string: regular
    • B: bold
    • I: italic
    • U: underline
    • D: line trough
    • O: overline
    or any combination. The default value is regular. Bold and italic styles do not apply to Symbol and ZapfDingbats basic fonts or other fonts when not defined. - * @param float $size Font size in points. The default value is the current size. If no size has been specified since the beginning of the document, the value taken is 12 - * @param string $fontfile The font definition file. By default, the name is built from the family and style, in lower case with no spaces. - * @param mixed $subset if true embedd only a subset of the font (stores only the information related to the used characters); if false embedd full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font. - * @author Nicola Asuni - * @access public - * @since 1.0 - * @see AddFont(), SetFontSize() - */ - public function SetFont($family, $style='', $size=0, $fontfile='', $subset='default') { - //Select a font; size given in points - if ($size == 0) { - $size = $this->FontSizePt; - } - // try to add font (if not already added) - $fontdata = $this->AddFont($family, $style, $fontfile, $subset); - $this->FontFamily = $fontdata['family']; - $this->FontStyle = $fontdata['style']; - $this->CurrentFont = $this->getFontBuffer($fontdata['fontkey']); - $this->SetFontSize($size); - } - - /** - * Defines the size of the current font. - * @param float $size The size (in points) - * @param boolean $out if true output the font size command, otherwise only set the font properties. - * @access public - * @since 1.0 - * @see SetFont() - */ - public function SetFontSize($size, $out=true) { - // font size in points - $this->FontSizePt = $size; - // font size in user units - $this->FontSize = $size / $this->k; - // calculate some font metrics - if (isset($this->CurrentFont['desc']['FontBBox'])) { - $bbox = explode(' ', substr($this->CurrentFont['desc']['FontBBox'], 1, -1)); - $font_height = ((intval($bbox[3]) - intval($bbox[1])) * $size / 1000); - } else { - $font_height = $size * 1.219; - } - if (isset($this->CurrentFont['desc']['Ascent']) AND ($this->CurrentFont['desc']['Ascent'] > 0)) { - $font_ascent = ($this->CurrentFont['desc']['Ascent'] * $size / 1000); - } - if (isset($this->CurrentFont['desc']['Descent']) AND ($this->CurrentFont['desc']['Descent'] <= 0)) { - $font_descent = (- $this->CurrentFont['desc']['Descent'] * $size / 1000); - } - if (!isset($font_ascent) AND !isset($font_descent)) { - // core font - $font_ascent = 0.76 * $font_height; - $font_descent = $font_height - $font_ascent; - } elseif (!isset($font_descent)) { - $font_descent = $font_height - $font_ascent; - } elseif (!isset($font_ascent)) { - $font_ascent = $font_height - $font_descent; - } - $this->FontAscent = $font_ascent / $this->k; - $this->FontDescent = $font_descent / $this->k; - if ($out AND ($this->page > 0) AND (isset($this->CurrentFont['i']))) { - $this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); - } - } - - /** - * Return the font descent value - * @param string $font font name - * @param string $style font style - * @param float $size The size (in points) - * @return int font descent - * @access public - * @author Nicola Asuni - * @since 4.9.003 (2010-03-30) - */ - public function getFontDescent($font, $style='', $size=0) { - $fontdata = $this->AddFont($font, $style); - $fontinfo = $this->getFontBuffer($fontdata['fontkey']); - if (isset($fontinfo['desc']['Descent']) AND ($fontinfo['desc']['Descent'] <= 0)) { - $descent = (- $fontinfo['desc']['Descent'] * $size / 1000); - } else { - $descent = 1.219 * 0.24 * $size; - } - return ($descent / $this->k); - } - - /** - * Return the font ascent value - * @param string $font font name - * @param string $style font style - * @param float $size The size (in points) - * @return int font ascent - * @access public - * @author Nicola Asuni - * @since 4.9.003 (2010-03-30) - */ - public function getFontAscent($font, $style='', $size=0) { - $fontdata = $this->AddFont($font, $style); - $fontinfo = $this->getFontBuffer($fontdata['fontkey']); - if (isset($fontinfo['desc']['Ascent']) AND ($fontinfo['desc']['Ascent'] > 0)) { - $ascent = ($fontinfo['desc']['Ascent'] * $size / 1000); - } else { - $ascent = 1.219 * 0.76 * $size; - } - return ($ascent / $this->k); - } - - /** - * Defines the default monospaced font. - * @param string $font Font name. - * @access public - * @since 4.5.025 - */ - public function SetDefaultMonospacedFont($font) { - $this->default_monospaced_font = $font; - } - - /** - * Creates a new internal link and returns its identifier. An internal link is a clickable area which directs to another place within the document.
    - * The identifier can then be passed to Cell(), Write(), Image() or Link(). The destination is defined with SetLink(). - * @access public - * @since 1.5 - * @see Cell(), Write(), Image(), Link(), SetLink() - */ - public function AddLink() { - //Create a new internal link - $n = count($this->links) + 1; - $this->links[$n] = array(0, 0); - return $n; - } - - /** - * Defines the page and position a link points to. - * @param int $link The link identifier returned by AddLink() - * @param float $y Ordinate of target position; -1 indicates the current position. The default value is 0 (top of page) - * @param int $page Number of target page; -1 indicates the current page. This is the default value - * @access public - * @since 1.5 - * @see AddLink() - */ - public function SetLink($link, $y=0, $page=-1) { - if ($y == -1) { - $y = $this->y; - } - if ($page == -1) { - $page = $this->page; - } - $this->links[$link] = array($page, $y); - } - - /** - * Puts a link on a rectangular area of the page. - * Text or image links are generally put via Cell(), Write() or Image(), but this method can be useful for instance to define a clickable area inside an image. - * @param float $x Abscissa of the upper-left corner of the rectangle - * @param float $y Ordinate of the upper-left corner of the rectangle - * @param float $w Width of the rectangle - * @param float $h Height of the rectangle - * @param mixed $link URL or identifier returned by AddLink() - * @param int $spaces number of spaces on the text to link - * @access public - * @since 1.5 - * @see AddLink(), Annotation(), Cell(), Write(), Image() - */ - public function Link($x, $y, $w, $h, $link, $spaces=0) { - $this->Annotation($x, $y, $w, $h, $link, array('Subtype'=>'Link'), $spaces); - } - - /** - * Puts a markup annotation on a rectangular area of the page. - * !!!!THE ANNOTATION SUPPORT IS NOT YET FULLY IMPLEMENTED !!!! - * @param float $x Abscissa of the upper-left corner of the rectangle - * @param float $y Ordinate of the upper-left corner of the rectangle - * @param float $w Width of the rectangle - * @param float $h Height of the rectangle - * @param string $text annotation text or alternate content - * @param array $opt array of options (see section 8.4 of PDF reference 1.7). - * @param int $spaces number of spaces on the text to link - * @access public - * @since 4.0.018 (2008-08-06) - */ - public function Annotation($x, $y, $w, $h, $text, $opt=array('Subtype'=>'Text'), $spaces=0) { - if ($this->inxobj) { - // store parameters for later use on template - $this->xobjects[$this->xobjid]['annotations'][] = array('x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'text' => $text, 'opt' => $opt, 'spaces' => $spaces); - return; - } - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - // recalculate coordinates to account for graphic transformations - if (isset($this->transfmatrix) AND !empty($this->transfmatrix)) { - for ($i=$this->transfmatrix_key; $i > 0; --$i) { - $maxid = count($this->transfmatrix[$i]) - 1; - for ($j=$maxid; $j >= 0; --$j) { - $ctm = $this->transfmatrix[$i][$j]; - if (isset($ctm['a'])) { - $x = $x * $this->k; - $y = ($this->h - $y) * $this->k; - $w = $w * $this->k; - $h = $h * $this->k; - // top left - $xt = $x; - $yt = $y; - $x1 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e']; - $y1 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f']; - // top right - $xt = $x + $w; - $yt = $y; - $x2 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e']; - $y2 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f']; - // bottom left - $xt = $x; - $yt = $y - $h; - $x3 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e']; - $y3 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f']; - // bottom right - $xt = $x + $w; - $yt = $y - $h; - $x4 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e']; - $y4 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f']; - // new coordinates (rectangle area) - $x = min($x1, $x2, $x3, $x4); - $y = max($y1, $y2, $y3, $y4); - $w = (max($x1, $x2, $x3, $x4) - $x) / $this->k; - $h = ($y - min($y1, $y2, $y3, $y4)) / $this->k; - $x = $x / $this->k; - $y = $this->h - ($y / $this->k); - } - } - } - } - if ($this->page <= 0) { - $page = 1; - } else { - $page = $this->page; - } - if (!isset($this->PageAnnots[$page])) { - $this->PageAnnots[$page] = array(); - } - ++$this->n; - $this->PageAnnots[$page][] = array('n' => $this->n, 'x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'txt' => $text, 'opt' => $opt, 'numspaces' => $spaces); - if ((($opt['Subtype'] == 'FileAttachment') OR ($opt['Subtype'] == 'Sound')) AND (!$this->empty_string($opt['FS'])) AND file_exists($opt['FS']) AND (!isset($this->embeddedfiles[basename($opt['FS'])]))) { - ++$this->n; - $this->embeddedfiles[basename($opt['FS'])] = array('n' => $this->n, 'file' => $opt['FS']); - } - // Add widgets annotation's icons - if (isset($opt['mk']['i']) AND file_exists($opt['mk']['i'])) { - $this->Image($opt['mk']['i'], '', '', 10, 10, '', '', '', false, 300, '', false, false, 0, false, true); - } - if (isset($opt['mk']['ri']) AND file_exists($opt['mk']['ri'])) { - $this->Image($opt['mk']['ri'], '', '', 0, 0, '', '', '', false, 300, '', false, false, 0, false, true); - } - if (isset($opt['mk']['ix']) AND file_exists($opt['mk']['ix'])) { - $this->Image($opt['mk']['ix'], '', '', 0, 0, '', '', '', false, 300, '', false, false, 0, false, true); - } - } - - /** - * Embedd the attached files. - * @since 4.4.000 (2008-12-07) - * @access protected - * @see Annotation() - */ - protected function _putEmbeddedFiles() { - reset($this->embeddedfiles); - foreach ($this->embeddedfiles as $filename => $filedata) { - $data = file_get_contents($filedata['file']); - $filter = ''; - if ($this->compress) { - $data = gzcompress($data); - $filter = ' /Filter /FlateDecode'; - } - $stream = $this->_getrawstream($data, $filedata['n']); - $out = $this->_getobj($filedata['n'])."\n"; - $out .= '<< /Type /EmbeddedFile'.$filter.' /Length '.strlen($stream).' >>'; - $out .= ' stream'."\n".$stream."\n".'endstream'; - $out .= "\n".'endobj'; - $this->_out($out); - } - } - - /** - * Prints a text cell at the specified position. - * The origin is on the left of the first charcter, on the baseline. - * This method allows to place a string precisely on the page. - * @param float $x Abscissa of the cell origin - * @param float $y Ordinate of the cell origin - * @param string $txt String to print - * @param int $fstroke outline size in user units (false = disable) - * @param boolean $fclip if true activate clipping mode (you must call StartTransform() before this function and StopTransform() to stop the clipping tranformation). - * @param boolean $ffill if true fills the text - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param int $ln Indicates where the current position should go after the call. Possible values are:
    • 0: to the right (or left for RTL languages)
    • 1: to the beginning of the next line
    • 2: below
    Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. - * @param string $align Allows to center or align the text. Possible values are:
    • L or empty string: left align (default value)
    • C: center
    • R: right align
    • J: justify
    - * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false). - * @param mixed $link URL or identifier returned by AddLink(). - * @param int $stretch font stretch mode:
    • 0 = disabled
    • 1 = horizontal scaling only if text is larger than cell width
    • 2 = forced horizontal scaling to fit cell width
    • 3 = character spacing only if text is larger than cell width
    • 4 = forced character spacing to fit cell width
    General font stretching and scaling values will be preserved when possible. - * @param boolean $ignore_min_height if true ignore automatic minimum height value. - * @param string $calign cell vertical alignment relative to the specified Y value. Possible values are:
    • T : cell top
    • A : font top
    • L : font baseline
    • D : font bottom
    • B : cell bottom
    - * @param string $valign text vertical alignment inside the cell. Possible values are:
    • T : top
    • C : center
    • B : bottom
    - * @param boolean $rtloff if true uses the page top-left corner as origin of axis for $x and $y initial position. - * @access public - * @since 1.0 - * @see Cell(), Write(), MultiCell(), WriteHTML(), WriteHTMLCell() - */ - public function Text($x, $y, $txt, $fstroke=false, $fclip=false, $ffill=true, $border=0, $ln=0, $align='', $fill=false, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M', $rtloff=false) { - $textrendermode = $this->textrendermode; - $textstrokewidth = $this->textstrokewidth; - $this->setTextRenderingMode($fstroke, $ffill, $fclip); - $this->SetXY($x, $y, $rtloff); - $this->Cell(0, 0, $txt, $border, $ln, $align, $fill, $link, $stretch, $ignore_min_height, $calign, $valign); - // restore previous rendering mode - $this->textrendermode = $textrendermode; - $this->textstrokewidth = $textstrokewidth; - } - - /** - * Whenever a page break condition is met, the method is called, and the break is issued or not depending on the returned value. - * The default implementation returns a value according to the mode selected by SetAutoPageBreak().
    - * This method is called automatically and should not be called directly by the application. - * @return boolean - * @access public - * @since 1.4 - * @see SetAutoPageBreak() - */ - public function AcceptPageBreak() { - if ($this->num_columns > 1) { - // multi column mode - if($this->current_column < ($this->num_columns - 1)) { - // go to next column - $this->selectColumn($this->current_column + 1); - } else { - // add a new page - $this->AddPage(); - // set first column - $this->selectColumn(0); - } - // avoid page breaking from checkPageBreak() - return false; - } - return $this->AutoPageBreak; - } - - /** - * Add page if needed. - * @param float $h Cell height. Default value: 0. - * @param mixed $y starting y position, leave empty for current position. - * @param boolean $addpage if true add a page, otherwise only return the true/false state - * @return boolean true in case of page break, false otherwise. - * @since 3.2.000 (2008-07-01) - * @access protected - */ - protected function checkPageBreak($h=0, $y='', $addpage=true) { - if ($this->empty_string($y)) { - $y = $this->y; - } - $current_page = $this->page; - if ((($y + $h) > $this->PageBreakTrigger) AND (!$this->InFooter) AND ($this->AcceptPageBreak())) { - if ($addpage) { - //Automatic page break - $x = $this->x; - $this->AddPage($this->CurOrientation); - $this->y = $this->tMargin; - $oldpage = $this->page - 1; - if ($this->rtl) { - if ($this->pagedim[$this->page]['orm'] != $this->pagedim[$oldpage]['orm']) { - $this->x = $x - ($this->pagedim[$this->page]['orm'] - $this->pagedim[$oldpage]['orm']); - } else { - $this->x = $x; - } - } else { - if ($this->pagedim[$this->page]['olm'] != $this->pagedim[$oldpage]['olm']) { - $this->x = $x + ($this->pagedim[$this->page]['olm'] - $this->pagedim[$oldpage]['olm']); - } else { - $this->x = $x; - } - } - } - $this->newline = true; - return true; - } - if ($current_page != $this->page) { - // account for columns mode - $this->newline = true; - return true; - } - return false; - } - - /** - * Removes SHY characters from text. - * Unicode Data:
      - *
    • Name : SOFT HYPHEN, commonly abbreviated as SHY
    • - *
    • HTML Entity (decimal): &#173;
    • - *
    • HTML Entity (hex): &#xad;
    • - *
    • HTML Entity (named): &shy;
    • - *
    • How to type in Microsoft Windows: [Alt +00AD] or [Alt 0173]
    • - *
    • UTF-8 (hex): 0xC2 0xAD (c2ad)
    • - *
    • UTF-8 character: chr(194).chr(173)
    • - *
    - * @param string $txt input string - * @return string without SHY characters. - * @access public - * @since (4.5.019) 2009-02-28 - */ - public function removeSHY($txt='') { - $txt = preg_replace('/([\\xc2]{1}[\\xad]{1})/', '', $txt); - if (!$this->isunicode) { - $txt = preg_replace('/([\\xad]{1})/', '', $txt); - } - return $txt; - } - - /** - * Prints a cell (rectangular area) with optional borders, background color and character string. The upper-left corner of the cell corresponds to the current position. The text can be aligned or centered. After the call, the current position moves to the right or to the next line. It is possible to put a link on the text.
    - * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting. - * @param float $w Cell width. If 0, the cell extends up to the right margin. - * @param float $h Cell height. Default value: 0. - * @param string $txt String to print. Default value: empty string. - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param int $ln Indicates where the current position should go after the call. Possible values are:
    • 0: to the right (or left for RTL languages)
    • 1: to the beginning of the next line
    • 2: below
    Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. - * @param string $align Allows to center or align the text. Possible values are:
    • L or empty string: left align (default value)
    • C: center
    • R: right align
    • J: justify
    - * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false). - * @param mixed $link URL or identifier returned by AddLink(). - * @param int $stretch font stretch mode:
    • 0 = disabled
    • 1 = horizontal scaling only if text is larger than cell width
    • 2 = forced horizontal scaling to fit cell width
    • 3 = character spacing only if text is larger than cell width
    • 4 = forced character spacing to fit cell width
    General font stretching and scaling values will be preserved when possible. - * @param boolean $ignore_min_height if true ignore automatic minimum height value. - * @param string $calign cell vertical alignment relative to the specified Y value. Possible values are:
    • T : cell top
    • C : center
    • B : cell bottom
    • A : font top
    • L : font baseline
    • D : font bottom
    - * @param string $valign text vertical alignment inside the cell. Possible values are:
    • T : top
    • C : center
    • B : bottom
    - * @access public - * @since 1.0 - * @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), AddLink(), Ln(), MultiCell(), Write(), SetAutoPageBreak() - */ - public function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M') { - $prev_cell_margin = $this->cell_margin; - $prev_cell_padding = $this->cell_padding; - $this->adjustCellPadding($border); - if (!$ignore_min_height) { - $min_cell_height = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B']; - if ($h < $min_cell_height) { - $h = $min_cell_height; - } - } - $this->checkPageBreak($h + $this->cell_margin['T'] + $this->cell_margin['B']); - $this->_out($this->getCellCode($w, $h, $txt, $border, $ln, $align, $fill, $link, $stretch, true, $calign, $valign)); - $this->cell_padding = $prev_cell_padding; - $this->cell_margin = $prev_cell_margin; - } - - /** - * Returns the PDF string code to print a cell (rectangular area) with optional borders, background color and character string. The upper-left corner of the cell corresponds to the current position. The text can be aligned or centered. After the call, the current position moves to the right or to the next line. It is possible to put a link on the text.
    - * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting. - * @param float $w Cell width. If 0, the cell extends up to the right margin. - * @param float $h Cell height. Default value: 0. - * @param string $txt String to print. Default value: empty string. - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param int $ln Indicates where the current position should go after the call. Possible values are:
    • 0: to the right (or left for RTL languages)
    • 1: to the beginning of the next line
    • 2: below
    Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. - * @param string $align Allows to center or align the text. Possible values are:
    • L or empty string: left align (default value)
    • C: center
    • R: right align
    • J: justify
    - * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false). - * @param mixed $link URL or identifier returned by AddLink(). - * @param int $stretch font stretch mode:
    • 0 = disabled
    • 1 = horizontal scaling only if text is larger than cell width
    • 2 = forced horizontal scaling to fit cell width
    • 3 = character spacing only if text is larger than cell width
    • 4 = forced character spacing to fit cell width
    General font stretching and scaling values will be preserved when possible. - * @param boolean $ignore_min_height if true ignore automatic minimum height value. - * @param string $calign cell vertical alignment relative to the specified Y value. Possible values are:
    • T : cell top
    • C : center
    • B : cell bottom
    • A : font top
    • L : font baseline
    • D : font bottom
    - * @param string $valign text vertical alignment inside the cell. Possible values are:
    • T : top
    • M : middle
    • B : bottom
    - * @return string containing cell code - * @access protected - * @since 1.0 - * @see Cell() - */ - protected function getCellCode($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M') { - $prev_cell_margin = $this->cell_margin; - $prev_cell_padding = $this->cell_padding; - $txt = $this->removeSHY($txt); - $rs = ''; //string to be returned - $this->adjustCellPadding($border); - if (!$ignore_min_height) { - $min_cell_height = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B']; - if ($h < $min_cell_height) { - $h = $min_cell_height; - } - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h); - $k = $this->k; - if ($this->rtl) { - $x = $this->x - $this->cell_margin['R']; - } else { - $x = $this->x + $this->cell_margin['L']; - } - $y = $this->y + $this->cell_margin['T']; - $prev_font_stretching = $this->font_stretching; - $prev_font_spacing = $this->font_spacing; - // cell vertical alignment - switch ($calign) { - case 'A': { - // font top - switch ($valign) { - case 'T': { - // top - $y -= $this->cell_padding['T']; - break; - } - case 'B': { - // bottom - $y -= ($h - $this->cell_padding['B'] - $this->FontAscent - $this->FontDescent); - break; - } - default: - case 'C': - case 'M': { - // center - $y -= (($h - $this->FontAscent - $this->FontDescent) / 2); - break; - } - } - break; - } - case 'L': { - // font baseline - switch ($valign) { - case 'T': { - // top - $y -= ($this->cell_padding['T'] + $this->FontAscent); - break; - } - case 'B': { - // bottom - $y -= ($h - $this->cell_padding['B'] - $this->FontDescent); - break; - } - default: - case 'C': - case 'M': { - // center - $y -= (($h + $this->FontAscent - $this->FontDescent) / 2); - break; - } - } - break; - } - case 'D': { - // font bottom - switch ($valign) { - case 'T': { - // top - $y -= ($this->cell_padding['T'] + $this->FontAscent + $this->FontDescent); - break; - } - case 'B': { - // bottom - $y -= ($h - $this->cell_padding['B']); - break; - } - default: - case 'C': - case 'M': { - // center - $y -= (($h + $this->FontAscent + $this->FontDescent) / 2); - break; - } - } - break; - } - case 'B': { - // cell bottom - $y -= $h; - break; - } - case 'C': - case 'M': { - // cell center - $y -= ($h / 2); - break; - } - default: - case 'T': { - // cell top - break; - } - } - // text vertical alignment - switch ($valign) { - case 'T': { - // top - $yt = $y + $this->cell_padding['T']; - break; - } - case 'B': { - // bottom - $yt = $y + $h - $this->cell_padding['B'] - $this->FontAscent - $this->FontDescent; - break; - } - default: - case 'C': - case 'M': { - // center - $yt = $y + (($h - $this->FontAscent - $this->FontDescent) / 2); - break; - } - } - $basefonty = $yt + $this->FontAscent; - if ($this->empty_string($w) OR ($w <= 0)) { - if ($this->rtl) { - $w = $x - $this->lMargin; - } else { - $w = $this->w - $this->rMargin - $x; - } - } - $s = ''; - // fill and borders - if (is_string($border) AND (strlen($border) == 4)) { - // full border - $border = 1; - } - if ($fill OR ($border == 1)) { - if ($fill) { - $op = ($border == 1) ? 'B' : 'f'; - } else { - $op = 'S'; - } - if ($this->rtl) { - $xk = (($x - $w) * $k); - } else { - $xk = ($x * $k); - } - $s .= sprintf('%.2F %.2F %.2F %.2F re %s ', $xk, (($this->h - $y) * $k), ($w * $k), (-$h * $k), $op); - } - // draw borders - $s .= $this->getCellBorder($x, $y, $w, $h, $border); - if ($txt != '') { - $txt2 = $txt; - if ($this->isunicode) { - if (($this->CurrentFont['type'] == 'core') OR ($this->CurrentFont['type'] == 'TrueType') OR ($this->CurrentFont['type'] == 'Type1')) { - $txt2 = $this->UTF8ToLatin1($txt2); - } else { - $unicode = $this->UTF8StringToArray($txt); // array of UTF-8 unicode values - $unicode = $this->utf8Bidi($unicode, '', $this->tmprtl); - if (defined('K_THAI_TOPCHARS') AND (K_THAI_TOPCHARS == true)) { - // ---- Fix for bug #2977340 "Incorrect Thai characters position arrangement" ---- - // NOTE: this doesn't work with HTML justification - // Symbols that could overlap on the font top (only works in LTR) - $topchar = array(3611, 3613, 3615, 3650, 3651, 3652); // chars that extends on top - $topsym = array(3633, 3636, 3637, 3638, 3639, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662); // symbols with top position - $numchars = count($unicode); // number of chars - $unik = 0; - $uniblock = array(); - $uniblock[$unik] = array(); - $uniblock[$unik][] = $unicode[0]; - // resolve overlapping conflicts by splitting the string in several parts - for ($i = 1; $i < $numchars; ++$i) { - // check if symbols overlaps at top - if (in_array($unicode[$i], $topsym) AND (in_array($unicode[($i - 1)], $topsym) OR in_array($unicode[($i - 1)], $topchar))) { - // move symbols to another array - ++$unik; - $uniblock[$unik] = array(); - $uniblock[$unik][] = $unicode[$i]; - ++$unik; - $uniblock[$unik] = array(); - $unicode[$i] = 0x200b; // Unicode Character 'ZERO WIDTH SPACE' (DEC:8203, U+200B) - } else { - $uniblock[$unik][] = $unicode[$i]; - } - } - // ---- END OF Fix for bug #2977340 - } - $txt2 = $this->arrUTF8ToUTF16BE($unicode, false); - } - } - $txt2 = $this->_escape($txt2); - // get current text width (considering general font stretching and spacing) - $txwidth = $this->GetStringWidth($txt); - $width = $txwidth; - // check for stretch mode - if ($stretch > 0) { - // calculate ratio between cell width and text width - if ($width <= 0) { - $ratio = 1; - } else { - $ratio = (($w - $this->cell_padding['L'] - $this->cell_padding['R']) / $width); - } - // check if stretching is required - if (($ratio < 1) OR (($ratio > 1) AND (($stretch % 2) == 0))) { - // the text will be stretched to fit cell width - if ($stretch > 2) { - // set new character spacing - $this->font_spacing += ($w - $this->cell_padding['L'] - $this->cell_padding['R'] - $width) / (max(($this->GetNumChars($txt) - 1), 1) * ($this->font_stretching / 100)); - } else { - // set new horizontal stretching - $this->font_stretching *= $ratio; - } - // recalculate text width (the text fills the entire cell) - $width = $w - $this->cell_padding['L'] - $this->cell_padding['R']; - // reset alignment - $align = ''; - } - } - if ($this->font_stretching != 100) { - // apply font stretching - $rs .= sprintf('BT %.2F Tz ET ', $this->font_stretching); - } - if ($this->font_spacing != 0) { - // increase/decrease font spacing - $rs .= sprintf('BT %.2F Tc ET ', ($this->font_spacing * $this->k)); - } - if ($this->ColorFlag) { - $s .= 'q '.$this->TextColor.' '; - } - // rendering mode - $s .= sprintf('BT %d Tr %.2F w ET ', $this->textrendermode, $this->textstrokewidth); - // count number of spaces - $ns = substr_count($txt, chr(32)); - // Justification - $spacewidth = 0; - if (($align == 'J') AND ($ns > 0)) { - if ($this->isUnicodeFont()) { - // get string width without spaces - $width = $this->GetStringWidth(str_replace(' ', '', $txt)); - // calculate average space width - $spacewidth = -1000 * ($w - $width - $this->cell_padding['L'] - $this->cell_padding['R']) / ($ns?$ns:1) / $this->FontSize; - if ($this->font_stretching != 100) { - // word spacing is affected by stretching - $spacewidth /= ($this->font_stretching / 100); - } - // set word position to be used with TJ operator - $txt2 = str_replace(chr(0).chr(32), ') '.sprintf('%.3F', $spacewidth).' (', $txt2); - $unicode_justification = true; - } else { - // get string width - $width = $txwidth; - // new space width - $spacewidth = (($w - $width - $this->cell_padding['L'] - $this->cell_padding['R']) / ($ns?$ns:1)) * $this->k; - if ($this->font_stretching != 100) { - // word spacing (Tw) is affected by stretching - $spacewidth /= ($this->font_stretching / 100); - } - // set word spacing - $rs .= sprintf('BT %.3F Tw ET ', $spacewidth); - } - $width = $w - $this->cell_padding['L'] - $this->cell_padding['R']; - } - // replace carriage return characters - $txt2 = str_replace("\r", ' ', $txt2); - switch ($align) { - case 'C': { - $dx = ($w - $width) / 2; - break; - } - case 'R': { - if ($this->rtl) { - $dx = $this->cell_padding['R']; - } else { - $dx = $w - $width - $this->cell_padding['R']; - } - break; - } - case 'L': { - if ($this->rtl) { - $dx = $w - $width - $this->cell_padding['L']; - } else { - $dx = $this->cell_padding['L']; - } - break; - } - case 'J': - default: { - if ($this->rtl) { - $dx = $this->cell_padding['R']; - } else { - $dx = $this->cell_padding['L']; - } - break; - } - } - if ($this->rtl) { - $xdx = $x - $dx - $width; - } else { - $xdx = $x + $dx; - } - $xdk = $xdx * $k; - // print text - $s .= sprintf('BT %.2F %.2F Td [(%s)] TJ ET', $xdk, (($this->h - $basefonty) * $k), $txt2); - if (isset($uniblock)) { - // print overlapping characters as separate string - $xshift = 0; // horizontal shift - $ty = (($this->h - $basefonty + (0.2 * $this->FontSize)) * $k); - $spw = (($w - $txwidth - $this->cell_padding['L'] - $this->cell_padding['R']) / ($ns?$ns:1)); - foreach ($uniblock as $uk => $uniarr) { - if (($uk % 2) == 0) { - // x space to skip - if ($spacewidth != 0) { - // justification shift - $xshift += (count(array_keys($uniarr, 32)) * $spw); - } - $xshift += $this->GetArrStringWidth($uniarr); // + shift justification - } else { - // character to print - $topchr = $this->arrUTF8ToUTF16BE($uniarr, false); - $topchr = $this->_escape($topchr); - $s .= sprintf(' BT %.2F %.2F Td [(%s)] TJ ET', ($xdk + ($xshift * $k)), $ty, $topchr); - } - } - } - if ($this->underline) { - $s .= ' '.$this->_dounderlinew($xdx, $basefonty, $width); - } - if ($this->linethrough) { - $s .= ' '.$this->_dolinethroughw($xdx, $basefonty, $width); - } - if ($this->overline) { - $s .= ' '.$this->_dooverlinew($xdx, $basefonty, $width); - } - if ($this->ColorFlag) { - $s .= ' Q'; - } - if ($link) { - $this->Link($xdx, $yt, $width, ($this->FontAscent + $this->FontDescent), $link, $ns); - } - } - // output cell - if ($s) { - // output cell - $rs .= $s; - if ($this->font_spacing != 0) { - // reset font spacing mode - $rs .= ' BT 0 Tc ET'; - } - if ($this->font_stretching != 100) { - // reset font stretching mode - $rs .= ' BT 100 Tz ET'; - } - } - // reset word spacing - if (!$this->isUnicodeFont() AND ($align == 'J')) { - $rs .= ' BT 0 Tw ET'; - } - // reset stretching and spacing - $this->font_stretching = $prev_font_stretching; - $this->font_spacing = $prev_font_spacing; - $this->lasth = $h; - if ($ln > 0) { - //Go to the beginning of the next line - $this->y = $y + $h + $this->cell_margin['B']; - if ($ln == 1) { - if ($this->rtl) { - $this->x = $this->w - $this->rMargin; - } else { - $this->x = $this->lMargin; - } - } - } else { - // go left or right by case - if ($this->rtl) { - $this->x = $x - $w - $this->cell_margin['L']; - } else { - $this->x = $x + $w + $this->cell_margin['R']; - } - } - $gstyles = ''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor."\n"; - $rs = $gstyles.$rs; - $this->cell_padding = $prev_cell_padding; - $this->cell_margin = $prev_cell_margin; - return $rs; - } - - /** - * Returns the code to draw the cell border - * @param float $x X coordinate. - * @param float $y Y coordinate. - * @param float $w Cell width. - * @param float $h Cell height. - * @param mixed $brd Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param string $mode border position respect the square edge: normal: centered; ext: external; int: internal; - * @return string containing cell border code - * @access protected - * @see SetLineStyle() - * @since 5.7.000 (2010-08-02) - */ - protected function getCellBorder($x, $y, $w, $h, $brd) { - $s = ''; // string to be returned - if (empty($brd)) { - return $s; - } - if ($brd == 1) { - $brd = array('LRTB' => true); - } - // calculate coordinates for border - $k = $this->k; - if ($this->rtl) { - $xeL = ($x - $w) * $k; - $xeR = $x * $k; - } else { - $xeL = $x * $k; - $xeR = ($x + $w) * $k; - } - $yeL = (($this->h - ($y + $h)) * $k); - $yeT = (($this->h - $y) * $k); - $xeT = $xeL; - $xeB = $xeR; - $yeR = $yeT; - $yeB = $yeL; - if (is_string($brd)) { - // convert string to array - $slen = strlen($brd); - $newbrd = array(); - for ($i = 0; $i < $slen; ++$i) { - $newbrd[$brd{$i}] = array('cap' => 'square', 'join' => 'miter'); - } - $brd = $newbrd; - } - if (isset($brd['mode'])) { - $mode = $brd['mode']; - unset($brd['mode']); - } else { - $mode = 'normal'; - } - foreach ($brd as $border => $style) { - if (is_array($style) AND !empty($style)) { - // apply border style - $prev_style = $this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '; - $s .= $this->SetLineStyle($style, true)."\n"; - } - switch ($mode) { - case 'ext': { - $off = (($this->LineWidth / 2) * $k); - $xL = $xeL - $off; - $xR = $xeR + $off; - $yT = $yeT + $off; - $yL = $yeL - $off; - $xT = $xL; - $xB = $xR; - $yR = $yT; - $yB = $yL; - $w += $this->LineWidth; - $h += $this->LineWidth; - break; - } - case 'int': { - $off = ($this->LineWidth / 2) * $k; - $xL = $xeL + $off; - $xR = $xeR - $off; - $yT = $yeT - $off; - $yL = $yeL + $off; - $xT = $xL; - $xB = $xR; - $yR = $yT; - $yB = $yL; - $w -= $this->LineWidth; - $h -= $this->LineWidth; - break; - } - case 'normal': - default: { - $xL = $xeL; - $xT = $xeT; - $xB = $xeB; - $xR = $xeR; - $yL = $yeL; - $yT = $yeT; - $yB = $yeB; - $yR = $yeR; - break; - } - } - // draw borders by case - if (strlen($border) == 4) { - $s .= sprintf('%.2F %.2F %.2F %.2F re S ', $xT, $yT, ($w * $k), (-$h * $k)); - } elseif (strlen($border) == 3) { - if (strpos($border,'B') === false) { // LTR - $s .= sprintf('%.2F %.2F m ', $xL, $yL); - $s .= sprintf('%.2F %.2F l ', $xT, $yT); - $s .= sprintf('%.2F %.2F l ', $xR, $yR); - $s .= sprintf('%.2F %.2F l ', $xB, $yB); - $s .= 'S '; - } elseif (strpos($border,'L') === false) { // TRB - $s .= sprintf('%.2F %.2F m ', $xT, $yT); - $s .= sprintf('%.2F %.2F l ', $xR, $yR); - $s .= sprintf('%.2F %.2F l ', $xB, $yB); - $s .= sprintf('%.2F %.2F l ', $xL, $yL); - $s .= 'S '; - } elseif (strpos($border,'T') === false) { // RBL - $s .= sprintf('%.2F %.2F m ', $xR, $yR); - $s .= sprintf('%.2F %.2F l ', $xB, $yB); - $s .= sprintf('%.2F %.2F l ', $xL, $yL); - $s .= sprintf('%.2F %.2F l ', $xT, $yT); - $s .= 'S '; - } elseif (strpos($border,'R') === false) { // BLT - $s .= sprintf('%.2F %.2F m ', $xB, $yB); - $s .= sprintf('%.2F %.2F l ', $xL, $yL); - $s .= sprintf('%.2F %.2F l ', $xT, $yT); - $s .= sprintf('%.2F %.2F l ', $xR, $yR); - $s .= 'S '; - } - } elseif (strlen($border) == 2) { - if ((strpos($border,'L') !== false) AND (strpos($border,'T') !== false)) { // LT - $s .= sprintf('%.2F %.2F m ', $xL, $yL); - $s .= sprintf('%.2F %.2F l ', $xT, $yT); - $s .= sprintf('%.2F %.2F l ', $xR, $yR); - $s .= 'S '; - } elseif ((strpos($border,'T') !== false) AND (strpos($border,'R') !== false)) { // TR - $s .= sprintf('%.2F %.2F m ', $xT, $yT); - $s .= sprintf('%.2F %.2F l ', $xR, $yR); - $s .= sprintf('%.2F %.2F l ', $xB, $yB); - $s .= 'S '; - } elseif ((strpos($border,'R') !== false) AND (strpos($border,'B') !== false)) { // RB - $s .= sprintf('%.2F %.2F m ', $xR, $yR); - $s .= sprintf('%.2F %.2F l ', $xB, $yB); - $s .= sprintf('%.2F %.2F l ', $xL, $yL); - $s .= 'S '; - } elseif ((strpos($border,'B') !== false) AND (strpos($border,'L') !== false)) { // BL - $s .= sprintf('%.2F %.2F m ', $xB, $yB); - $s .= sprintf('%.2F %.2F l ', $xL, $yL); - $s .= sprintf('%.2F %.2F l ', $xT, $yT); - $s .= 'S '; - } elseif ((strpos($border,'L') !== false) AND (strpos($border,'R') !== false)) { // LR - $s .= sprintf('%.2F %.2F m ', $xL, $yL); - $s .= sprintf('%.2F %.2F l ', $xT, $yT); - $s .= 'S '; - $s .= sprintf('%.2F %.2F m ', $xR, $yR); - $s .= sprintf('%.2F %.2F l ', $xB, $yB); - $s .= 'S '; - } elseif ((strpos($border,'T') !== false) AND (strpos($border,'B') !== false)) { // TB - $s .= sprintf('%.2F %.2F m ', $xT, $yT); - $s .= sprintf('%.2F %.2F l ', $xR, $yR); - $s .= 'S '; - $s .= sprintf('%.2F %.2F m ', $xB, $yB); - $s .= sprintf('%.2F %.2F l ', $xL, $yL); - $s .= 'S '; - } - } else { // strlen($border) == 1 - if (strpos($border,'L') !== false) { // L - $s .= sprintf('%.2F %.2F m ', $xL, $yL); - $s .= sprintf('%.2F %.2F l ', $xT, $yT); - $s .= 'S '; - } elseif (strpos($border,'T') !== false) { // T - $s .= sprintf('%.2F %.2F m ', $xT, $yT); - $s .= sprintf('%.2F %.2F l ', $xR, $yR); - $s .= 'S '; - } elseif (strpos($border,'R') !== false) { // R - $s .= sprintf('%.2F %.2F m ', $xR, $yR); - $s .= sprintf('%.2F %.2F l ', $xB, $yB); - $s .= 'S '; - } elseif (strpos($border,'B') !== false) { // B - $s .= sprintf('%.2F %.2F m ', $xB, $yB); - $s .= sprintf('%.2F %.2F l ', $xL, $yL); - $s .= 'S '; - } - } - if (is_array($style) AND !empty($style)) { - // reset border style to previous value - $s .= "\n".$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor."\n"; - } - } - return $s; - } - - /** - * This method allows printing text with line breaks. - * They can be automatic (as soon as the text reaches the right border of the cell) or explicit (via the \n character). As many cells as necessary are output, one below the other.
    - * Text can be aligned, centered or justified. The cell block can be framed and the background painted. - * @param float $w Width of cells. If 0, they extend up to the right margin of the page. - * @param float $h Cell minimum height. The cell extends automatically if needed. - * @param string $txt String to print - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param string $align Allows to center or align the text. Possible values are:
    • L or empty string: left align
    • C: center
    • R: right align
    • J: justification (default value when $ishtml=false)
    - * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false). - * @param int $ln Indicates where the current position should go after the call. Possible values are:
    • 0: to the right
    • 1: to the beginning of the next line [DEFAULT]
    • 2: below
    - * @param float $x x position in user units - * @param float $y y position in user units - * @param boolean $reseth if true reset the last cell height (default true). - * @param int $stretch font stretch mode:
    • 0 = disabled
    • 1 = horizontal scaling only if text is larger than cell width
    • 2 = forced horizontal scaling to fit cell width
    • 3 = character spacing only if text is larger than cell width
    • 4 = forced character spacing to fit cell width
    General font stretching and scaling values will be preserved when possible. - * @param boolean $ishtml set to true if $txt is HTML content (default = false). - * @param boolean $autopadding if true, uses internal padding and automatically adjust it to account for line width. - * @param float $maxh maximum height. It should be >= $h and less then remaining space to the bottom of the page, or 0 for disable this feature. This feature works only when $ishtml=false. - * @param string $valign Vertical alignment of text (requires $maxh = $h > 0). Possible values are:
    • T: TOP
    • M: middle
    • B: bottom
    . This feature works only when $ishtml=false. - * @param boolean $fitcell if true attempt to fit all the text within the cell by reducing the font size. - * @return int Return the number of cells or 1 for html mode. - * @access public - * @since 1.3 - * @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), Cell(), Write(), SetAutoPageBreak() - */ - public function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0, $valign='T', $fitcell=false) { - $prev_cell_margin = $this->cell_margin; - $prev_cell_padding = $this->cell_padding; - // adjust internal padding - $this->adjustCellPadding($border); - $mc_padding = $this->cell_padding; - $mc_margin = $this->cell_margin; - $this->cell_padding['T'] = 0; - $this->cell_padding['B'] = 0; - $this->setCellMargins(0, 0, 0, 0); - if ($this->empty_string($this->lasth) OR $reseth) { - // reset row height - $this->resetLastH(); - } - if (!$this->empty_string($y)) { - $this->SetY($y); - } else { - $y = $this->GetY(); - } - $resth = 0; - if ((!$this->InFooter) AND (($y + $h + $mc_margin['T'] + $mc_margin['B']) > $this->PageBreakTrigger)) { - // spit cell in more pages/columns - $newh = $this->PageBreakTrigger - $y; - $resth = $h - $newh; // cell to be printed on the next page/column - $h = $newh; - } - // get current page number - $startpage = $this->page; - // get current column - $startcolumn = $this->current_column; - if (!$this->empty_string($x)) { - $this->SetX($x); - } else { - $x = $this->GetX(); - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions(0, $x, $y); - // apply margins - $oy = $y + $mc_margin['T']; - if ($this->rtl) { - $ox = $this->w - $x - $mc_margin['R']; - } else { - $ox = $x + $mc_margin['L']; - } - $this->x = $ox; - $this->y = $oy; - // set width - if ($this->empty_string($w) OR ($w <= 0)) { - if ($this->rtl) { - $w = $this->x - $this->lMargin - $mc_margin['L']; - } else { - $w = $this->w - $this->x - $this->rMargin - $mc_margin['R']; - } - } - // store original margin values - $lMargin = $this->lMargin; - $rMargin = $this->rMargin; - if ($this->rtl) { - $this->rMargin = $this->w - $this->x; - $this->lMargin = $this->x - $w; - } else { - $this->lMargin = $this->x; - $this->rMargin = $this->w - $this->x - $w; - } - if ($autopadding) { - // add top padding - $this->y += $mc_padding['T']; - } - if ($ishtml) { // ******* Write HTML text - $this->writeHTML($txt, true, 0, $reseth, true, $align); - $nl = 1; - } else { // ******* Write simple text - // vertical alignment - if ($maxh > 0) { - // get text height - $text_height = $this->getStringHeight($w, $txt, $reseth, $autopadding, $mc_padding, $border); - if ($fitcell) { - $prev_FontSizePt = $this->FontSizePt; - // try to reduce font size to fit text on cell (use a quick search algorithm) - $fmin = 1; - $fmax = $this->FontSizePt; - $prev_text_height = $text_height; - $maxit = 100; // max number of iterations - while ($maxit > 0) { - $fmid = (($fmax + $fmin) / 2); - $this->SetFontSize($fmid, false); - $this->resetLastH(); - $text_height = $this->getStringHeight($w, $txt, $reseth, $autopadding, $mc_padding, $border); - if (($text_height == $maxh) OR (($text_height < $maxh) AND ($fmin >= ($fmax - 0.01)))) { - break; - } elseif ($text_height < $maxh) { - $fmin = $fmid; - } else { - $fmax = $fmid; - } - --$maxit; - } - $this->SetFontSize($this->FontSizePt); - } - if ($text_height < $maxh) { - if ($valign == 'M') { - // text vertically centered - $this->y += (($maxh - $text_height) / 2); - } elseif ($valign == 'B') { - // text vertically aligned on bottom - $this->y += ($maxh - $text_height); - } - } - } - $nl = $this->Write($this->lasth, $txt, '', 0, $align, true, $stretch, false, true, $maxh, 0, $mc_margin); - if ($fitcell) { - // restore font size - $this->SetFontSize($prev_FontSizePt); - } - } - if ($autopadding) { - // add bottom padding - $this->y += $mc_padding['B']; - } - // Get end-of-text Y position - $currentY = $this->y; - // get latest page number - $endpage = $this->page; - if ($resth > 0) { - $skip = ($endpage - $startpage); - $tmpresth = $resth; - while ($tmpresth > 0) { - if ($skip <= 0) { - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $this->checkPageBreak($this->PageBreakTrigger + 1); - } - if ($this->num_columns > 1) { - $tmpresth -= ($this->h - $this->y - $this->bMargin); - } else { - $tmpresth -= ($this->h - $this->tMargin - $this->bMargin); - } - --$skip; - } - $currentY = $this->y; - $endpage = $this->page; - } - // get latest column - $endcolumn = $this->current_column; - if ($this->num_columns == 0) { - $this->num_columns = 1; - } - // get border modes - $border_start = $this->getBorderMode($border, $position='start'); - $border_end = $this->getBorderMode($border, $position='end'); - $border_middle = $this->getBorderMode($border, $position='middle'); - // design borders around HTML cells. - for ($page = $startpage; $page <= $endpage; ++$page) { // for each page - $ccode = ''; - $this->setPage($page); - if ($this->num_columns < 2) { - // single-column mode - $this->SetX($x); - $this->y = $this->tMargin; - } - // account for margin changes - if ($page > $startpage) { - if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) { - $this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']); - } elseif ((!$this->rtl) AND ($this->pagedim[$page]['olm'] != $this->pagedim[$startpage]['olm'])) { - $this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']); - } - } - if ($startpage == $endpage) { - // single page - for ($column = $startcolumn; $column <= $endcolumn; ++$column) { // for each column - $this->selectColumn($column); - if ($this->rtl) { - $this->x -= $mc_margin['R']; - } else { - $this->x += $mc_margin['L']; - } - if ($startcolumn == $endcolumn) { // single column - $cborder = $border; - $h = max($h, ($currentY - $oy)); - $this->y = $oy; - } elseif ($column == $startcolumn) { // first column - $cborder = $border_start; - $this->y = $oy; - $h = $this->h - $this->y - $this->bMargin; - } elseif ($column == $endcolumn) { // end column - $cborder = $border_end; - $h = $currentY - $this->y; - if ($resth > $h) { - $h = $resth; - } - } else { // middle column - $cborder = $border_middle; - $h = $this->h - $this->y - $this->bMargin; - $resth -= $h; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } elseif ($page == $startpage) { // first page - for ($column = $startcolumn; $column < $this->num_columns; ++$column) { // for each column - $this->selectColumn($column); - if ($this->rtl) { - $this->x -= $mc_margin['R']; - } else { - $this->x += $mc_margin['L']; - } - if ($column == $startcolumn) { // first column - $cborder = $border_start; - $this->y = $oy; - $h = $this->h - $this->y - $this->bMargin; - } else { // middle column - $cborder = $border_middle; - $h = $this->h - $this->y - $this->bMargin; - $resth -= $h; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } elseif ($page == $endpage) { // last page - for ($column = 0; $column <= $endcolumn; ++$column) { // for each column - $this->selectColumn($column); - if ($this->rtl) { - $this->x -= $mc_margin['R']; - } else { - $this->x += $mc_margin['L']; - } - if ($column == $endcolumn) { - // end column - $cborder = $border_end; - $h = $currentY - $this->y; - if ($resth > $h) { - $h = $resth; - } - } else { - // middle column - $cborder = $border_middle; - $h = $this->h - $this->y - $this->bMargin; - $resth -= $h; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } else { // middle page - for ($column = 0; $column < $this->num_columns; ++$column) { // for each column - $this->selectColumn($column); - if ($this->rtl) { - $this->x -= $mc_margin['R']; - } else { - $this->x += $mc_margin['L']; - } - $cborder = $border_middle; - $h = $this->h - $this->y - $this->bMargin; - $resth -= $h; - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } - if ($cborder OR $fill) { - // draw border and fill - if ($this->inxobj) { - // we are inside an XObject template - if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) { - $pagemarkkey = key($this->xobjects[$this->xobjid]['transfmrk']); - $pagemark = &$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey]; - } else { - $pagemark = &$this->xobjects[$this->xobjid]['intmrk']; - } - $pagebuff = $this->xobjects[$this->xobjid]['outdata']; - $pstart = substr($pagebuff, 0, $pagemark); - $pend = substr($pagebuff, $pagemark); - $this->xobjects[$this->xobjid]['outdata'] = $pstart.$ccode.$pend; - $pagemark += strlen($ccode); - } else { - if (end($this->transfmrk[$this->page]) !== false) { - $pagemarkkey = key($this->transfmrk[$this->page]); - $pagemark = &$this->transfmrk[$this->page][$pagemarkkey]; - } elseif ($this->InFooter) { - $pagemark = &$this->footerpos[$this->page]; - } else { - $pagemark = &$this->intmrk[$this->page]; - } - $pagebuff = $this->getPageBuffer($this->page); - $pstart = substr($pagebuff, 0, $pagemark); - $pend = substr($pagebuff, $pagemark); - $this->setPageBuffer($this->page, $pstart.$ccode.$pend); - $pagemark += strlen($ccode); - } - } - } // end for each page - // Get end-of-cell Y position - $currentY = $this->GetY(); - // restore original margin values - $this->SetLeftMargin($lMargin); - $this->SetRightMargin($rMargin); - if ($ln > 0) { - //Go to the beginning of the next line - $this->SetY($currentY + $mc_margin['B']); - if ($ln == 2) { - $this->SetX($x + $w + $mc_margin['L'] + $mc_margin['R']); - } - } else { - // go left or right by case - $this->setPage($startpage); - $this->y = $y; - $this->SetX($x + $w + $mc_margin['L'] + $mc_margin['R']); - } - $this->setContentMark(); - $this->cell_padding = $prev_cell_padding; - $this->cell_margin = $prev_cell_margin; - return $currentY-$this->y; - } - - /** - * Get the border mode accounting for multicell position (opens bottom side of multicell crossing pages) - * @param mixed $brd Indicates if borders must be drawn around the cell block. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param string multicell position: 'start', 'middle', 'end' - * @return border mode array - * @access protected - * @since 4.4.002 (2008-12-09) - */ - protected function getBorderMode($brd, $position='start') { - if ((!$this->opencell) OR empty($brd)) { - return $brd; - } - if ($brd == 1) { - $brd = 'LTRB'; - } - if (is_string($brd)) { - // convert string to array - $slen = strlen($brd); - $newbrd = array(); - for ($i = 0; $i < $slen; ++$i) { - $newbrd[$brd{$i}] = array('cap' => 'square', 'join' => 'miter'); - } - $brd = $newbrd; - } - foreach ($brd as $border => $style) { - switch ($position) { - case 'start': { - if (strpos($border, 'B') !== false) { - // remove bottom line - $newkey = str_replace('B', '', $border); - if (strlen($newkey) > 0) { - $brd[$newkey] = $style; - } - unset($brd[$border]); - } - break; - } - case 'middle': { - if (strpos($border, 'B') !== false) { - // remove bottom line - $newkey = str_replace('B', '', $border); - if (strlen($newkey) > 0) { - $brd[$newkey] = $style; - } - unset($brd[$border]); - $border = $newkey; - } - if (strpos($border, 'T') !== false) { - // remove bottom line - $newkey = str_replace('T', '', $border); - if (strlen($newkey) > 0) { - $brd[$newkey] = $style; - } - unset($brd[$border]); - } - break; - } - case 'end': { - if (strpos($border, 'T') !== false) { - // remove bottom line - $newkey = str_replace('T', '', $border); - if (strlen($newkey) > 0) { - $brd[$newkey] = $style; - } - unset($brd[$border]); - } - break; - } - } - } - return $brd; - } - - /** - * This method return the estimated number of lines for print a simple text string using Multicell() method. - * @param string $txt String for calculating his height - * @param float $w Width of cells. If 0, they extend up to the right margin of the page. - * @param boolean $reseth if true reset the last cell height (default false). - * @param boolean $autopadding if true, uses internal padding and automatically adjust it to account for line width (default true). - * @param float $cellpadding Internal cell padding, if empty uses default cell padding. - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @return float Return the minimal height needed for multicell method for printing the $txt param. - * @author Alexander Escalona Fernández, Nicola Asuni - * @access public - * @since 4.5.011 - */ - public function getNumLines($txt, $w=0, $reseth=false, $autopadding=true, $cellpadding='', $border=0) { - if ($txt === '') { - // empty string - return 1; - } - // adjust internal padding - $prev_cell_padding = $this->cell_padding; - $prev_lasth = $this->lasth; - if (is_array($cellpadding)) { - $this->cell_padding = $cellpadding; - } - $this->adjustCellPadding($border); - if ($this->empty_string($w) OR ($w <= 0)) { - if ($this->rtl) { - $w = $this->x - $this->lMargin; - } else { - $w = $this->w - $this->rMargin - $this->x; - } - } - $wmax = $w - $this->cell_padding['L'] - $this->cell_padding['R']; - if ($reseth) { - // reset row height - $this->resetLastH(); - } - $lines = 1; - $sum = 0; - $chars = $this->utf8Bidi($this->UTF8StringToArray($txt), $txt, $this->tmprtl); - $charsWidth = $this->GetArrStringWidth($chars, '', '', 0, true); - $length = count($chars); - $lastSeparator = -1; - for ($i = 0; $i < $length; ++$i) { - $charWidth = $charsWidth[$i]; - if (preg_match($this->re_spaces, $this->unichr($chars[$i]))) { - $lastSeparator = $i; - } - if ((($sum + $charWidth) > $wmax) OR ($chars[$i] == 10)) { - ++$lines; - if ($lastSeparator != -1) { - $i = $lastSeparator; - $lastSeparator = -1; - $sum = 0; - } else { - $sum = $charWidth; - } - } else { - $sum += $charWidth; - } - } - if ($chars[($length - 1)] == 10) { - --$lines; - } - $this->cell_padding = $prev_cell_padding; - $this->lasth = $prev_lasth; - return $lines; - } - - /** - * This method return the estimated needed height for print a simple text string in Multicell() method. - * Generally, if you want to know the exact height for a block of content you can use the following alternative technique: - *
    -	 *  // store current object
    -	 *  $pdf->startTransaction();
    -	 *  // store starting values
    -	 *  $start_y = $pdf->GetY();
    -	 *  $start_page = $pdf->getPage();
    -	 *  // call your printing functions with your parameters
    -	 *  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -	 *  $pdf->MultiCell($w=0, $h=0, $txt, $border=1, $align='L', $fill=false, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0);
    -	 *  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -	 *  // get the new Y
    -	 *  $end_y = $pdf->GetY();
    -	 *  $end_page = $pdf->getPage();
    -	 *  // calculate height
    -	 *  $height = 0;
    -	 *  if ($end_page == $start_page) {
    -	 *  	$height = $end_y - $start_y;
    -	 *  } else {
    -	 *  	for ($page=$start_page; $page <= $end_page; ++$page) {
    -	 *  		$this->setPage($page);
    -	 *  		if ($page == $start_page) {
    -	 *  			// first page
    -	 *  			$height = $this->h - $start_y - $this->bMargin;
    -	 *  		} elseif ($page == $end_page) {
    -	 *  			// last page
    -	 *  			$height = $end_y - $this->tMargin;
    -	 *  		} else {
    -	 *  			$height = $this->h - $this->tMargin - $this->bMargin;
    -	 *  		}
    -	 *  	}
    -	 *  }
    -	 *  // restore previous object
    -	 *  $pdf = $pdf->rollbackTransaction();
    -	 * 
    - * @param float $w Width of cells. If 0, they extend up to the right margin of the page. - * @param string $txt String for calculating his height - * @param boolean $reseth if true reset the last cell height (default false). - * @param boolean $autopadding if true, uses internal padding and automatically adjust it to account for line width (default true). - * @param float $cellpadding Internal cell padding, if empty uses default cell padding. - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @return float Return the minimal height needed for multicell method for printing the $txt param. - * @author Nicola Asuni, Alexander Escalona Fernández - * @access public - */ - public function getStringHeight($w, $txt, $reseth=false, $autopadding=true, $cellpadding='', $border=0) { - // adjust internal padding - $prev_cell_padding = $this->cell_padding; - $prev_lasth = $this->lasth; - if (is_array($cellpadding)) { - $this->cell_padding = $cellpadding; - } - $this->adjustCellPadding($border); - $lines = $this->getNumLines($txt, $w, $reseth, $autopadding, $cellpadding, $border); - $height = $lines * ($this->FontSize * $this->cell_height_ratio); - if ($autopadding) { - // add top and bottom padding - $height += ($this->cell_padding['T'] + $this->cell_padding['B']); - } - $this->cell_padding = $prev_cell_padding; - $this->lasth = $prev_lasth; - return $height; - } - - /** - * This method prints text from the current position.
    - * @param float $h Line height - * @param string $txt String to print - * @param mixed $link URL or identifier returned by AddLink() - * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false). - * @param string $align Allows to center or align the text. Possible values are:
    • L or empty string: left align (default value)
    • C: center
    • R: right align
    • J: justify
    - * @param boolean $ln if true set cursor at the bottom of the line, otherwise set cursor at the top of the line. - * @param int $stretch font stretch mode:
    • 0 = disabled
    • 1 = horizontal scaling only if text is larger than cell width
    • 2 = forced horizontal scaling to fit cell width
    • 3 = character spacing only if text is larger than cell width
    • 4 = forced character spacing to fit cell width
    General font stretching and scaling values will be preserved when possible. - * @param boolean $firstline if true prints only the first line and return the remaining string. - * @param boolean $firstblock if true the string is the starting of a line. - * @param float $maxh maximum height. The remaining unprinted text will be returned. It should be >= $h and less then remaining space to the bottom of the page, or 0 for disable this feature. - * @param float $wadj first line width will be reduced by this amount (used in HTML mode). - * @param array $margin margin array of the parent container - * @return mixed Return the number of cells or the remaining string if $firstline = true. - * @access public - * @since 1.5 - */ - public function Write($h, $txt, $link='', $fill=false, $align='', $ln=false, $stretch=0, $firstline=false, $firstblock=false, $maxh=0, $wadj=0, $margin='') { - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h); - if (strlen($txt) == 0) { - // fix empty text - $txt = ' '; - } - if ($margin === '') { - // set default margins - $margin = $this->cell_margin; - } - // remove carriage returns - $s = str_replace("\r", '', $txt); - // check if string contains arabic text - if (preg_match($this->unicode->uni_RE_PATTERN_ARABIC, $s)) { - $arabic = true; - } else { - $arabic = false; - } - // check if string contains RTL text - if ($arabic OR ($this->tmprtl == 'R') OR preg_match($this->unicode->uni_RE_PATTERN_RTL, $s)) { - $rtlmode = true; - } else { - $rtlmode = false; - } - // get a char width - $chrwidth = $this->GetCharWidth('.'); - // get array of unicode values - $chars = $this->UTF8StringToArray($s); - // get array of chars - $uchars = $this->UTF8ArrayToUniArray($chars); - // get the number of characters - $nb = count($chars); - // replacement for SHY character (minus symbol) - $shy_replacement = 45; - $shy_replacement_char = $this->unichr($shy_replacement); - // widht for SHY replacement - $shy_replacement_width = $this->GetCharWidth($shy_replacement); - // max Y - $maxy = $this->y + $maxh - $h - $this->cell_padding['T'] - $this->cell_padding['B']; - // calculate remaining line width ($w) - if ($this->rtl) { - $w = $this->x - $this->lMargin; - } else { - $w = $this->w - $this->rMargin - $this->x; - } - // max column width - $wmax = $w - $wadj; - if (!$firstline) { - $wmax -= ($this->cell_padding['L'] + $this->cell_padding['R']); - } - if ((!$firstline) AND (($chrwidth > $wmax) OR ($this->GetCharWidth($chars[0]) > $wmax))) { - // a single character do not fit on column - return ''; - } - // minimum row height - $row_height = max($h, $this->FontSize * $this->cell_height_ratio); - $start_page = $this->page; - $i = 0; // character position - $j = 0; // current starting position - $sep = -1; // position of the last blank space - $shy = false; // true if the last blank is a soft hypen (SHY) - $l = 0; // current string length - $nl = 0; //number of lines - $linebreak = false; - $pc = 0; // previous character - // for each character - while ($i < $nb) { - if (($maxh > 0) AND ($this->y >= $maxy) ) { - break; - } - //Get the current character - $c = $chars[$i]; - if ($c == 10) { // 10 = "\n" = new line - //Explicit line break - if ($align == 'J') { - if ($this->rtl) { - $talign = 'R'; - } else { - $talign = 'L'; - } - } else { - $talign = $align; - } - $tmpstr = $this->UniArrSubString($uchars, $j, $i); - if ($firstline) { - $startx = $this->x; - $tmparr = array_slice($chars, $j, ($i - $j)); - if ($rtlmode) { - $tmparr = $this->utf8Bidi($tmparr, $tmpstr, $this->tmprtl); - } - $linew = $this->GetArrStringWidth($tmparr); - unset($tmparr); - if ($this->rtl) { - $this->endlinex = $startx - $linew; - } else { - $this->endlinex = $startx + $linew; - } - $w = $linew; - $tmpcellpadding = $this->cell_padding; - if ($maxh == 0) { - $this->SetCellPadding(0); - } - } - if ($firstblock AND $this->isRTLTextDir()) { - $tmpstr = $this->stringRightTrim($tmpstr); - } - // Skip newlines at the begining of a page or column - if (!empty($tmpstr) OR ($this->y < ($this->PageBreakTrigger - $row_height))) { - $this->Cell($w, $h, $tmpstr, 0, 1, $talign, $fill, $link, $stretch); - } - unset($tmpstr); - if ($firstline) { - $this->cell_padding = $tmpcellpadding; - return ($this->UniArrSubString($uchars, $i)); - } - ++$nl; - $j = $i + 1; - $l = 0; - $sep = -1; - $shy = false; - // account for margin changes - if ((($this->y + $this->lasth) > $this->PageBreakTrigger) AND (!$this->InFooter)) { - $this->AcceptPageBreak(); - if ($this->rtl) { - $this->x -= $margin['R']; - } else { - $this->x += $margin['L']; - } - $this->lMargin += $margin['L']; - $this->rMargin += $margin['R']; - } - $w = $this->getRemainingWidth(); - $wmax = $w - $this->cell_padding['L'] - $this->cell_padding['R']; - } else { - // 160 is the non-breaking space. - // 173 is SHY (Soft Hypen). - // \p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator. - // \p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants. - // \p{Lo} is needed because Chinese characters are packed next to each other without spaces in between. - if (($c != 160) AND (($c == 173) OR preg_match($this->re_spaces, $this->unichr($c)))) { - // update last blank space position - $sep = $i; - // check if is a SHY - if ($c == 173) { - $shy = true; - if ($pc == 45) { - $tmp_shy_replacement_width = 0; - $tmp_shy_replacement_char = ''; - } else { - $tmp_shy_replacement_width = $shy_replacement_width; - $tmp_shy_replacement_char = $shy_replacement_char; - } - } else { - $shy = false; - } - } - // update string length - if ($this->isUnicodeFont() AND ($arabic)) { - // with bidirectional algorithm some chars may be changed affecting the line length - // *** very slow *** - $l = $this->GetArrStringWidth($this->utf8Bidi(array_slice($chars, $j, ($i - $j)), '', $this->tmprtl)); - } else { - $l += $this->GetCharWidth($c); - } - if (($l > $wmax) OR (($c == 173) AND (($l + $tmp_shy_replacement_width) > $wmax)) ) { - // we have reached the end of column - if ($sep == -1) { - // check if the line was already started - if (($this->rtl AND ($this->x <= ($this->w - $this->rMargin - $chrwidth))) - OR ((!$this->rtl) AND ($this->x >= ($this->lMargin + $chrwidth)))) { - // print a void cell and go to next line - $this->Cell($w, $h, '', 0, 1); - $linebreak = true; - if ($firstline) { - return ($this->UniArrSubString($uchars, $j)); - } - } else { - // truncate the word because do not fit on column - $tmpstr = $this->UniArrSubString($uchars, $j, $i); - if ($firstline) { - $startx = $this->x; - $tmparr = array_slice($chars, $j, ($i - $j)); - if ($rtlmode) { - $tmparr = $this->utf8Bidi($tmparr, $tmpstr, $this->tmprtl); - } - $linew = $this->GetArrStringWidth($tmparr); - unset($tmparr); - if ($this->rtl) { - $this->endlinex = $startx - $linew; - } else { - $this->endlinex = $startx + $linew; - } - $w = $linew; - $tmpcellpadding = $this->cell_padding; - if ($maxh == 0) { - $this->SetCellPadding(0); - } - } - if ($firstblock AND $this->isRTLTextDir()) { - $tmpstr = $this->stringRightTrim($tmpstr); - } - $this->Cell($w, $h, $tmpstr, 0, 1, $align, $fill, $link, $stretch); - unset($tmpstr); - if ($firstline) { - $this->cell_padding = $tmpcellpadding; - return ($this->UniArrSubString($uchars, $i)); - } - $j = $i; - --$i; - } - } else { - // word wrapping - if ($this->rtl AND (!$firstblock) AND ($sep < $i)) { - $endspace = 1; - } else { - $endspace = 0; - } - if ($shy) { - // add hypen (minus symbol) at the end of the line - $shy_width = $tmp_shy_replacement_width; - if ($this->rtl) { - $shy_char_left = $tmp_shy_replacement_char; - $shy_char_right = ''; - } else { - $shy_char_left = ''; - $shy_char_right = $tmp_shy_replacement_char; - } - } else { - $shy_width = 0; - $shy_char_left = ''; - $shy_char_right = ''; - } - $tmpstr = $this->UniArrSubString($uchars, $j, ($sep + $endspace)); - if ($firstline) { - $startx = $this->x; - $tmparr = array_slice($chars, $j, (($sep + $endspace) - $j)); - if ($rtlmode) { - $tmparr = $this->utf8Bidi($tmparr, $tmpstr, $this->tmprtl); - } - $linew = $this->GetArrStringWidth($tmparr); - unset($tmparr); - if ($this->rtl) { - $this->endlinex = $startx - $linew - $shy_width; - } else { - $this->endlinex = $startx + $linew + $shy_width; - } - $w = $linew; - $tmpcellpadding = $this->cell_padding; - if ($maxh == 0) { - $this->SetCellPadding(0); - } - } - // print the line - if ($firstblock AND $this->isRTLTextDir()) { - $tmpstr = $this->stringRightTrim($tmpstr); - } - $this->Cell($w, $h, $shy_char_left.$tmpstr.$shy_char_right, 0, 1, $align, $fill, $link, $stretch); - unset($tmpstr); - if ($firstline) { - // return the remaining text - $this->cell_padding = $tmpcellpadding; - return ($this->UniArrSubString($uchars, ($sep + $endspace))); - } - $i = $sep; - $sep = -1; - $shy = false; - $j = ($i+1); - } - // account for margin changes - if ((($this->y + $this->lasth) > $this->PageBreakTrigger) AND (!$this->InFooter)) { - $this->AcceptPageBreak(); - if ($this->rtl) { - $this->x -= $margin['R']; - } else { - $this->x += $margin['L']; - } - $this->lMargin += $margin['L']; - $this->rMargin += $margin['R']; - } - $w = $this->getRemainingWidth(); - $wmax = $w - $this->cell_padding['L'] - $this->cell_padding['R']; - if ($linebreak) { - $linebreak = false; - } else { - ++$nl; - $l = 0; - } - } - } - // save last character - $pc = $c; - ++$i; - } // end while i < nb - // print last substring (if any) - if ($l > 0) { - switch ($align) { - case 'J': - case 'C': { - $w = $w; - break; - } - case 'L': { - if ($this->rtl) { - $w = $w; - } else { - $w = $l; - } - break; - } - case 'R': { - if ($this->rtl) { - $w = $l; - } else { - $w = $w; - } - break; - } - default: { - $w = $l; - break; - } - } - $tmpstr = $this->UniArrSubString($uchars, $j, $nb); - if ($firstline) { - $startx = $this->x; - $tmparr = array_slice($chars, $j, ($nb - $j)); - if ($rtlmode) { - $tmparr = $this->utf8Bidi($tmparr, $tmpstr, $this->tmprtl); - } - $linew = $this->GetArrStringWidth($tmparr); - unset($tmparr); - if ($this->rtl) { - $this->endlinex = $startx - $linew; - } else { - $this->endlinex = $startx + $linew; - } - $w = $linew; - $tmpcellpadding = $this->cell_padding; - if ($maxh == 0) { - $this->SetCellPadding(0); - } - } - if ($firstblock AND $this->isRTLTextDir()) { - $tmpstr = $this->stringRightTrim($tmpstr); - } - $this->Cell($w, $h, $tmpstr, 0, $ln, $align, $fill, $link, $stretch); - unset($tmpstr); - if ($firstline) { - $this->cell_padding = $tmpcellpadding; - return ($this->UniArrSubString($uchars, $nb)); - } - ++$nl; - } - if ($firstline) { - return ''; - } - return $nl; - } - - /** - * Returns the remaining width between the current position and margins. - * @return int Return the remaining width - * @access protected - */ - protected function getRemainingWidth() { - $this->checkPageRegions(); - if ($this->rtl) { - return ($this->x - $this->lMargin); - } else { - return ($this->w - $this->rMargin - $this->x); - } - } - - /** - * Extract a slice of the $strarr array and return it as string. - * @param string $strarr The input array of characters. - * @param int $start the starting element of $strarr. - * @param int $end first element that will not be returned. - * @return Return part of a string - * @access public - */ - public function UTF8ArrSubString($strarr, $start='', $end='') { - if (strlen($start) == 0) { - $start = 0; - } - if (strlen($end) == 0) { - $end = count($strarr); - } - $string = ''; - for ($i=$start; $i < $end; ++$i) { - $string .= $this->unichr($strarr[$i]); - } - return $string; - } - - /** - * Extract a slice of the $uniarr array and return it as string. - * @param string $uniarr The input array of characters. - * @param int $start the starting element of $strarr. - * @param int $end first element that will not be returned. - * @return Return part of a string - * @access public - * @since 4.5.037 (2009-04-07) - */ - public function UniArrSubString($uniarr, $start='', $end='') { - if (strlen($start) == 0) { - $start = 0; - } - if (strlen($end) == 0) { - $end = count($uniarr); - } - $string = ''; - for ($i=$start; $i < $end; ++$i) { - $string .= $uniarr[$i]; - } - return $string; - } - - /** - * Convert an array of UTF8 values to array of unicode characters - * @param string $ta The input array of UTF8 values. - * @return Return array of unicode characters - * @access public - * @since 4.5.037 (2009-04-07) - */ - public function UTF8ArrayToUniArray($ta) { - return array_map(array($this, 'unichr'), $ta); - } - - /** - * Returns the unicode caracter specified by UTF-8 value - * @param int $c UTF-8 value - * @return Returns the specified character. - * @author Miguel Perez, Nicola Asuni - * @access public - * @since 2.3.000 (2008-03-05) - */ - public function unichr($c) { - if (!$this->isunicode) { - return chr($c); - } elseif ($c <= 0x7F) { - // one byte - return chr($c); - } elseif ($c <= 0x7FF) { - // two bytes - return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F); - } elseif ($c <= 0xFFFF) { - // three bytes - return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F); - } elseif ($c <= 0x10FFFF) { - // four bytes - return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F); - } else { - return ''; - } - } - - /** - * Return the image type given the file name or array returned by getimagesize() function. - * @param string $imgfile image file name - * @param array $iminfo array of image information returned by getimagesize() function. - * @return string image type - * @since 4.8.017 (2009-11-27) - */ - public function getImageFileType($imgfile, $iminfo=array()) { - $type = ''; - if (isset($iminfo['mime']) AND !empty($iminfo['mime'])) { - $mime = explode('/', $iminfo['mime']); - if ((count($mime) > 1) AND ($mime[0] == 'image') AND (!empty($mime[1]))) { - $type = strtolower(trim($mime[1])); - } - } - if (empty($type)) { - $fileinfo = pathinfo($imgfile); - if (isset($fileinfo['extension']) AND (!$this->empty_string($fileinfo['extension']))) { - $type = strtolower(trim($fileinfo['extension'])); - } - } - if ($type == 'jpg') { - $type = 'jpeg'; - } - return $type; - } - - /** - * Set the block dimensions accounting for page breaks and page/column fitting - * @param float $w width - * @param float $h height - * @param float $x X coordinate - * @param float $y Y coodiante - * @param boolean $fitonpage if true the block is resized to not exceed page dimensions. - * @access protected - * @since 5.5.009 (2010-07-05) - */ - protected function fitBlock(&$w, &$h, &$x, &$y, $fitonpage=false) { - // resize the block to be vertically contained on a single page or single column - if ($fitonpage OR $this->AutoPageBreak) { - $ratio_wh = ($w / $h); - if ($h > ($this->PageBreakTrigger - $this->tMargin)) { - $h = $this->PageBreakTrigger - $this->tMargin; - $w = ($h * $ratio_wh); - } - // resize the block to be horizontally contained on a single page or single column - if ($fitonpage) { - $maxw = ($this->w - $this->lMargin - $this->rMargin); - if ($w > $maxw) { - $w = $maxw; - $h = ($w / $ratio_wh); - } - } - } - // Check whether we need a new page or new column first as this does not fit - $prev_x = $this->x; - $prev_y = $this->y; - if ($this->checkPageBreak($h, $y) OR ($this->y < $prev_y)) { - $y = $this->y; - if ($this->rtl) { - $x += ($prev_x - $this->x); - } else { - $x += ($this->x - $prev_x); - } - } - // resize the block to be contained on the remaining available page or column space - if ($fitonpage) { - $ratio_wh = ($w / $h); - if (($y + $h) > $this->PageBreakTrigger) { - $h = $this->PageBreakTrigger - $y; - $w = ($h * $ratio_wh); - } - if ((!$this->rtl) AND (($x + $w) > ($this->w - $this->rMargin))) { - $w = $this->w - $this->rMargin - $x; - $h = ($w / $ratio_wh); - } elseif (($this->rtl) AND (($x - $w) < ($this->lMargin))) { - $w = $x - $this->lMargin; - $h = ($w / $ratio_wh); - } - } - } - - /** - * Puts an image in the page. - * The upper-left corner must be given. - * The dimensions can be specified in different ways:
      - *
    • explicit width and height (expressed in user unit)
    • - *
    • one explicit dimension, the other being calculated automatically in order to keep the original proportions
    • - *
    • no explicit dimension, in which case the image is put at 72 dpi
    - * Supported formats are JPEG and PNG images whitout GD library and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM; - * The format can be specified explicitly or inferred from the file extension.
    - * It is possible to put a link on the image.
    - * Remark: if an image is used several times, only one copy will be embedded in the file.
    - * @param string $file Name of the file containing the image. - * @param float $x Abscissa of the upper-left corner (LTR) or upper-right corner (RTL). - * @param float $y Ordinate of the upper-left corner (LTR) or upper-right corner (RTL). - * @param float $w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. - * @param float $h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. - * @param string $type Image format. Possible values are (case insensitive): JPEG and PNG (whitout GD library) and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;. If not specified, the type is inferred from the file extension. - * @param mixed $link URL or identifier returned by AddLink(). - * @param string $align Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:
    • T: top-right for LTR or top-left for RTL
    • M: middle-right for LTR or middle-left for RTL
    • B: bottom-right for LTR or bottom-left for RTL
    • N: next line
    - * @param mixed $resize If true resize (reduce) the image to fit $w and $h (requires GD or ImageMagick library); if false do not resize; if 2 force resize in all cases (upscaling and downscaling). - * @param int $dpi dot-per-inch resolution used on resize - * @param string $palign Allows to center or align the image on the current line. Possible values are:
    • L : left align
    • C : center
    • R : right align
    • '' : empty string : left for LTR or right for RTL
    - * @param boolean $ismask true if this image is a mask, false otherwise - * @param mixed $imgmask image object returned by this function or false - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param boolean $fitbox If true scale image dimensions proportionally to fit within the ($w, $h) box. - * @param boolean $hidden if true do not display the image. - * @param boolean $fitonpage if true the image is resized to not exceed page dimensions. - * @return image information - * @access public - * @since 1.1 - */ - public function Image($file, $x='', $y='', $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0, $fitbox=false, $hidden=false, $fitonpage=false) { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - $cached_file = false; // true when the file is cached - // check if is local file - if (!@file_exists($file)) { - // encode spaces on filename (file is probably an URL) - $file = str_replace(' ', '%20', $file); - } - // get image dimensions - $imsize = @getimagesize($file); - if ($imsize === FALSE) { - if (function_exists('curl_init')) { - // try to get remote file data using cURL - $cs = curl_init(); // curl session - curl_setopt($cs, CURLOPT_URL, $file); - curl_setopt($cs, CURLOPT_BINARYTRANSFER, true); - curl_setopt($cs, CURLOPT_FAILONERROR, true); - curl_setopt($cs, CURLOPT_RETURNTRANSFER, true); - curl_setopt($cs, CURLOPT_CONNECTTIMEOUT, 5); - curl_setopt($cs, CURLOPT_TIMEOUT, 30); - $imgdata = curl_exec($cs); - curl_close($cs); - if($imgdata !== FALSE) { - // copy image to cache - $file = tempnam(K_PATH_CACHE, 'img_'); - $fp = fopen($file, 'w'); - fwrite($fp, $imgdata); - fclose($fp); - unset($imgdata); - $cached_file = true; - $imsize = @getimagesize($file); - if ($imsize === FALSE) { - unlink($file); - $cached_file = false; - } - } - } elseif (($w > 0) AND ($h > 0)) { - // get measures from specified data - $pw = $this->getHTMLUnitToUnits($w, 0, $this->pdfunit, true) * $this->imgscale * $this->k; - $ph = $this->getHTMLUnitToUnits($h, 0, $this->pdfunit, true) * $this->imgscale * $this->k; - $imsize = array($pw, $ph); - } - } - if ($imsize === FALSE) { - $this->Error('[Image] Unable to get image: '.$file); - } - // get original image width and height in pixels - list($pixw, $pixh) = $imsize; - // calculate image width and height on document - if (($w <= 0) AND ($h <= 0)) { - // convert image size to document unit - $w = $this->pixelsToUnits($pixw); - $h = $this->pixelsToUnits($pixh); - } elseif ($w <= 0) { - $w = $h * $pixw / $pixh; - } elseif ($h <= 0) { - $h = $w * $pixh / $pixw; - } elseif ($fitbox AND ($w > 0) AND ($h > 0)) { - // scale image dimensions proportionally to fit within the ($w, $h) box - if ((($w * $pixh) / ($h * $pixw)) < 1) { - $h = $w * $pixh / $pixw; - } else { - $w = $h * $pixw / $pixh; - } - } - // fit the image on available space - $this->fitBlock($w, $h, $x, $y, $fitonpage); - // calculate new minimum dimensions in pixels - $neww = round($w * $this->k * $dpi / $this->dpi); - $newh = round($h * $this->k * $dpi / $this->dpi); - // check if resize is necessary (resize is used only to reduce the image) - $newsize = ($neww * $newh); - $pixsize = ($pixw * $pixh); - if (intval($resize) == 2) { - $resize = true; - } elseif ($newsize >= $pixsize) { - $resize = false; - } - // check if image has been already added on document - $newimage = true; - if (in_array($file, $this->imagekeys)) { - $newimage = false; - // get existing image data - $info = $this->getImageBuffer($file); - // check if the newer image is larger - $oldsize = ($info['w'] * $info['h']); - if ((($oldsize < $newsize) AND ($resize)) OR (($oldsize < $pixsize) AND (!$resize))) { - $newimage = true; - } - } - if ($newimage) { - //First use of image, get info - $type = strtolower($type); - if ($type == '') { - $type = $this->getImageFileType($file, $imsize); - } elseif ($type == 'jpg') { - $type = 'jpeg'; - } - $mqr = $this->get_mqr(); - $this->set_mqr(false); - // Specific image handlers - $mtd = '_parse'.$type; - // GD image handler function - $gdfunction = 'imagecreatefrom'.$type; - $info = false; - if ((method_exists($this, $mtd)) AND (!($resize AND function_exists($gdfunction)))) { - // TCPDF image functions - $info = $this->$mtd($file); - if ($info == 'pngalpha') { - return $this->ImagePngAlpha($file, $x, $y, $pixw, $pixh, $w, $h, 'PNG', $link, $align, $resize, $dpi, $palign); - } - } - if (!$info) { - if (function_exists($gdfunction)) { - // GD library - $img = $gdfunction($file); - if ($resize) { - $imgr = imagecreatetruecolor($neww, $newh); - if (($type == 'gif') OR ($type == 'png')) { - $imgr = $this->_setGDImageTransparency($imgr, $img); - } - imagecopyresampled($imgr, $img, 0, 0, 0, 0, $neww, $newh, $pixw, $pixh); - if (($type == 'gif') OR ($type == 'png')) { - $info = $this->_toPNG($imgr); - } else { - $info = $this->_toJPEG($imgr); - } - } else { - if (($type == 'gif') OR ($type == 'png')) { - $info = $this->_toPNG($img); - } else { - $info = $this->_toJPEG($img); - } - } - } elseif (extension_loaded('imagick')) { - // ImageMagick library - $img = new Imagick(); - if ($type == 'SVG') { - // get SVG file content - $svgimg = file_get_contents($file); - // get width and height - $regs = array(); - if (preg_match('/]*)>/si', $svgimg, $regs)) { - $svgtag = $regs[1]; - $tmp = array(); - if (preg_match('/[\s]+width[\s]*=[\s]*"([^"]*)"/si', $svgtag, $tmp)) { - $ow = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false); - $owu = sprintf('%.3F', ($ow * $dpi / 72)).$this->pdfunit; - $svgtag = preg_replace('/[\s]+width[\s]*=[\s]*"[^"]*"/si', ' width="'.$owu.'"', $svgtag, 1); - } else { - $ow = $w; - } - $tmp = array(); - if (preg_match('/[\s]+height[\s]*=[\s]*"([^"]*)"/si', $svgtag, $tmp)) { - $oh = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false); - $ohu = sprintf('%.3F', ($oh * $dpi / 72)).$this->pdfunit; - $svgtag = preg_replace('/[\s]+height[\s]*=[\s]*"[^"]*"/si', ' height="'.$ohu.'"', $svgtag, 1); - } else { - $oh = $h; - } - $tmp = array(); - if (!preg_match('/[\s]+viewBox[\s]*=[\s]*"[\s]*([0-9\.]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]*"/si', $svgtag, $tmp)) { - $vbw = ($ow * $this->imgscale * $this->k); - $vbh = ($oh * $this->imgscale * $this->k); - $vbox = sprintf(' viewBox="0 0 %.3F %.3F" ', $vbw, $vbh); - $svgtag = $vbox.$svgtag; - } - $svgimg = preg_replace('/]*)>/si', '', $svgimg, 1); - } - $img->readImageBlob($svgimg); - } else { - $img->readImage($file); - } - if ($resize) { - $img->resizeImage($neww, $newh, 10, 1, false); - } - $img->setCompressionQuality($this->jpeg_quality); - $img->setImageFormat('jpeg'); - $tempname = tempnam(K_PATH_CACHE, 'jpg_'); - $img->writeImage($tempname); - $info = $this->_parsejpeg($tempname); - unlink($tempname); - $img->destroy(); - } else { - return; - } - } - if ($info === false) { - //If false, we cannot process image - return; - } - $this->set_mqr($mqr); - if ($ismask) { - // force grayscale - $info['cs'] = 'DeviceGray'; - } - $info['i'] = $this->numimages; - if (!in_array($file, $this->imagekeys)) { - ++$info['i']; - } - if ($imgmask !== false) { - $info['masked'] = $imgmask; - } - // add image to document - $this->setImageBuffer($file, $info); - } - if ($cached_file) { - // remove cached file - unlink($file); - } - // set alignment - $this->img_rb_y = $y + $h; - // set alignment - if ($this->rtl) { - if ($palign == 'L') { - $ximg = $this->lMargin; - } elseif ($palign == 'C') { - $ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($palign == 'R') { - $ximg = $this->w - $this->rMargin - $w; - } else { - $ximg = $x - $w; - } - $this->img_rb_x = $ximg; - } else { - if ($palign == 'L') { - $ximg = $this->lMargin; - } elseif ($palign == 'C') { - $ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($palign == 'R') { - $ximg = $this->w - $this->rMargin - $w; - } else { - $ximg = $x; - } - $this->img_rb_x = $ximg + $w; - } - if ($ismask OR $hidden) { - // image is not displayed - return $info['i']; - } - $xkimg = $ximg * $this->k; - $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%u Do Q', ($w * $this->k), ($h * $this->k), $xkimg, (($this->h - ($y + $h)) * $this->k), $info['i'])); - if (!empty($border)) { - $bx = $this->x; - $by = $this->y; - $this->x = $ximg; - if ($this->rtl) { - $this->x += $w; - } - $this->y = $y; - $this->Cell($w, $h, '', $border, 0, '', 0, '', 0, true); - $this->x = $bx; - $this->y = $by; - } - if ($link) { - $this->Link($ximg, $y, $w, $h, $link, 0); - } - // set pointer to align the next text/objects - switch($align) { - case 'T': { - $this->y = $y; - $this->x = $this->img_rb_x; - break; - } - case 'M': { - $this->y = $y + round($h/2); - $this->x = $this->img_rb_x; - break; - } - case 'B': { - $this->y = $this->img_rb_y; - $this->x = $this->img_rb_x; - break; - } - case 'N': { - $this->SetY($this->img_rb_y); - break; - } - default:{ - break; - } - } - $this->endlinex = $this->img_rb_x; - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['images'][] = $info['i']; - } - return $info['i']; - } - - /** - * Sets the current active configuration setting of magic_quotes_runtime (if the set_magic_quotes_runtime function exist) - * @param boolean $mqr FALSE for off, TRUE for on. - * @since 4.6.025 (2009-08-17) - */ - public function set_mqr($mqr) { - if(!defined('PHP_VERSION_ID')) { - $version = PHP_VERSION; - define('PHP_VERSION_ID', (($version{0} * 10000) + ($version{2} * 100) + $version{4})); - } - if (PHP_VERSION_ID < 50300) { - @set_magic_quotes_runtime($mqr); - } - } - - /** - * Gets the current active configuration setting of magic_quotes_runtime (if the get_magic_quotes_runtime function exist) - * @return Returns 0 if magic quotes runtime is off or get_magic_quotes_runtime doesn't exist, 1 otherwise. - * @since 4.6.025 (2009-08-17) - */ - public function get_mqr() { - if(!defined('PHP_VERSION_ID')) { - $version = PHP_VERSION; - define('PHP_VERSION_ID', (($version{0} * 10000) + ($version{2} * 100) + $version{4})); - } - if (PHP_VERSION_ID < 50300) { - return @get_magic_quotes_runtime(); - } - return 0; - } - - /** - * Convert the loaded image to a JPEG and then return a structure for the PDF creator. - * This function requires GD library and write access to the directory defined on K_PATH_CACHE constant. - * @param string $file Image file name. - * @param image $image Image object. - * return image JPEG image object. - * @access protected - */ - protected function _toJPEG($image) { - $tempname = tempnam(K_PATH_CACHE, 'jpg_'); - imagejpeg($image, $tempname, $this->jpeg_quality); - imagedestroy($image); - $retvars = $this->_parsejpeg($tempname); - // tidy up by removing temporary image - unlink($tempname); - return $retvars; - } - - /** - * Convert the loaded image to a PNG and then return a structure for the PDF creator. - * This function requires GD library and write access to the directory defined on K_PATH_CACHE constant. - * @param string $file Image file name. - * @param image $image Image object. - * return image PNG image object. - * @access protected - * @since 4.9.016 (2010-04-20) - */ - protected function _toPNG($image) { - $tempname = tempnam(K_PATH_CACHE, 'jpg_'); - imagepng($image, $tempname); - imagedestroy($image); - $retvars = $this->_parsepng($tempname); - // tidy up by removing temporary image - unlink($tempname); - return $retvars; - } - - /** - * Set the transparency for the given GD image. - * @param image $new_image GD image object - * @param image $image GD image object. - * return GD image object. - * @access protected - * @since 4.9.016 (2010-04-20) - */ - protected function _setGDImageTransparency($new_image, $image) { - // transparency index - $tid = imagecolortransparent($image); - // default transparency color - $tcol = array('red' => 255, 'green' => 255, 'blue' => 255); - if ($tid >= 0) { - // get the colors for the transparency index - $tcol = imagecolorsforindex($image, $tid); - } - $tid = imagecolorallocate($new_image, $tcol['red'], $tcol['green'], $tcol['blue']); - imagefill($new_image, 0, 0, $tid); - imagecolortransparent($new_image, $tid); - return $new_image; - } - - /** - * Extract info from a JPEG file without using the GD library. - * @param string $file image file to parse - * @return array structure containing the image data - * @access protected - */ - protected function _parsejpeg($file) { - $a = getimagesize($file); - if (empty($a)) { - $this->Error('Missing or incorrect image file: '.$file); - } - if ($a[2] != 2) { - $this->Error('Not a JPEG file: '.$file); - } - if ((!isset($a['channels'])) OR ($a['channels'] == 3)) { - $colspace = 'DeviceRGB'; - } elseif ($a['channels'] == 4) { - $colspace = 'DeviceCMYK'; - } else { - $colspace = 'DeviceGray'; - } - $bpc = isset($a['bits']) ? $a['bits'] : 8; - $data = file_get_contents($file); - return array('w' => $a[0], 'h' => $a[1], 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'DCTDecode', 'data' => $data); - } - - /** - * Extract info from a PNG file without using the GD library. - * @param string $file image file to parse - * @return array structure containing the image data - * @access protected - */ - protected function _parsepng($file) { - $f = fopen($file, 'rb'); - if ($f === false) { - $this->Error('Can\'t open image file: '.$file); - } - //Check signature - if (fread($f, 8) != chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) { - $this->Error('Not a PNG file: '.$file); - } - //Read header chunk - fread($f, 4); - if (fread($f, 4) != 'IHDR') { - $this->Error('Incorrect PNG file: '.$file); - } - $w = $this->_freadint($f); - $h = $this->_freadint($f); - $bpc = ord(fread($f, 1)); - if ($bpc > 8) { - //$this->Error('16-bit depth not supported: '.$file); - fclose($f); - return false; - } - $ct = ord(fread($f, 1)); - if ($ct == 0) { - $colspace = 'DeviceGray'; - } elseif ($ct == 2) { - $colspace = 'DeviceRGB'; - } elseif ($ct == 3) { - $colspace = 'Indexed'; - } else { - // alpha channel - fclose($f); - return 'pngalpha'; - } - if (ord(fread($f, 1)) != 0) { - //$this->Error('Unknown compression method: '.$file); - fclose($f); - return false; - } - if (ord(fread($f, 1)) != 0) { - //$this->Error('Unknown filter method: '.$file); - fclose($f); - return false; - } - if (ord(fread($f, 1)) != 0) { - //$this->Error('Interlacing not supported: '.$file); - fclose($f); - return false; - } - fread($f, 4); - $parms = '/DecodeParms << /Predictor 15 /Colors '.($ct == 2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.' >>'; - //Scan chunks looking for palette, transparency and image data - $pal = ''; - $trns = ''; - $data = ''; - do { - $n = $this->_freadint($f); - $type = fread($f, 4); - if ($type == 'PLTE') { - //Read palette - $pal = $this->rfread($f, $n); - fread($f, 4); - } elseif ($type == 'tRNS') { - //Read transparency info - $t = $this->rfread($f, $n); - if ($ct == 0) { - $trns = array(ord(substr($t, 1, 1))); - } elseif ($ct == 2) { - $trns = array(ord(substr($t, 1, 1)), ord(substr($t, 3, 1)), ord(substr($t, 5, 1))); - } else { - $pos = strpos($t, chr(0)); - if ($pos !== false) { - $trns = array($pos); - } - } - fread($f, 4); - } elseif ($type == 'IDAT') { - //Read image data block - $data .= $this->rfread($f, $n); - fread($f, 4); - } elseif ($type == 'IEND') { - break; - } else { - $this->rfread($f, $n + 4); - } - } while ($n); - if (($colspace == 'Indexed') AND (empty($pal))) { - //$this->Error('Missing palette in '.$file); - fclose($f); - return false; - } - fclose($f); - return array('w' => $w, 'h' => $h, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'FlateDecode', 'parms' => $parms, 'pal' => $pal, 'trns' => $trns, 'data' => $data); - } - - /** - * Binary-safe and URL-safe file read. - * Reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met: length bytes have been read; EOF (end of file) is reached. - * @param resource $handle - * @param int $length - * @return Returns the read string or FALSE in case of error. - * @author Nicola Asuni - * @access protected - * @since 4.5.027 (2009-03-16) - */ - protected function rfread($handle, $length) { - $data = fread($handle, $length); - if ($data === false) { - return false; - } - $rest = $length - strlen($data); - if ($rest > 0) { - $data .= $this->rfread($handle, $rest); - } - return $data; - } - - /** - * Extract info from a PNG image with alpha channel using the GD library. - * @param string $file Name of the file containing the image. - * @param float $x Abscissa of the upper-left corner. - * @param float $y Ordinate of the upper-left corner. - * @param float $wpx Original width of the image in pixels. - * @param float $hpx original height of the image in pixels. - * @param float $w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. - * @param float $h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. - * @param string $type Image format. Possible values are (case insensitive): JPEG and PNG (whitout GD library) and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;. If not specified, the type is inferred from the file extension. - * @param mixed $link URL or identifier returned by AddLink(). - * @param string $align Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:
    • T: top-right for LTR or top-left for RTL
    • M: middle-right for LTR or middle-left for RTL
    • B: bottom-right for LTR or bottom-left for RTL
    • N: next line
    - * @param boolean $resize If true resize (reduce) the image to fit $w and $h (requires GD library). - * @param int $dpi dot-per-inch resolution used on resize - * @param string $palign Allows to center or align the image on the current line. Possible values are:
    • L : left align
    • C : center
    • R : right align
    • '' : empty string : left for LTR or right for RTL
    - * @author Nicola Asuni - * @access protected - * @since 4.3.007 (2008-12-04) - * @see Image() - */ - protected function ImagePngAlpha($file, $x, $y, $wpx, $hpx, $w, $h, $type, $link, $align, $resize, $dpi, $palign) { - // create temp image file (without alpha channel) - $tempfile_plain = tempnam(K_PATH_CACHE, 'mskp_'); - // create temp alpha file - $tempfile_alpha = tempnam(K_PATH_CACHE, 'mska_'); - if (extension_loaded('imagick')) { // ImageMagick - // ImageMagick library - $img = new Imagick(); - $img->readImage($file); - // clone image object - $imga = $img->clone(); - // extract alpha channel - $img->separateImageChannel(imagick::CHANNEL_ALPHA | imagick::CHANNEL_OPACITY | imagick::CHANNEL_MATTE); - $img->negateImage(true); - $img->setImageFormat('png'); - $img->writeImage($tempfile_alpha); - // remove alpha channel - $imga->separateImageChannel(imagick::CHANNEL_ALL & ~(imagick::CHANNEL_ALPHA | imagick::CHANNEL_OPACITY | imagick::CHANNEL_MATTE)); - $imga->setImageFormat('png'); - $imga->writeImage($tempfile_plain); - } else { // GD library - // generate images - $img = imagecreatefrompng($file); - $imgalpha = imagecreate($wpx, $hpx); - // generate gray scale palette (0 -> 255) - for ($c = 0; $c < 256; ++$c) { - ImageColorAllocate($imgalpha, $c, $c, $c); - } - // extract alpha channel - for ($xpx = 0; $xpx < $wpx; ++$xpx) { - for ($ypx = 0; $ypx < $hpx; ++$ypx) { - $color = imagecolorat($img, $xpx, $ypx); - $alpha = ($color >> 24); // shifts off the first 24 bits (where 8x3 are used for each color), and returns the remaining 7 allocated bits (commonly used for alpha) - $alpha = (((127 - $alpha) / 127) * 255); // GD alpha is only 7 bit (0 -> 127) - $alpha = $this->getGDgamma($alpha); // correct gamma - imagesetpixel($imgalpha, $xpx, $ypx, $alpha); - } - } - imagepng($imgalpha, $tempfile_alpha); - imagedestroy($imgalpha); - // extract image without alpha channel - $imgplain = imagecreatetruecolor($wpx, $hpx); - imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); - imagepng($imgplain, $tempfile_plain); - imagedestroy($imgplain); - } - // embed mask image - $imgmask = $this->Image($tempfile_alpha, $x, $y, $w, $h, 'PNG', '', '', $resize, $dpi, '', true, false); - // embed image, masked with previously embedded mask - $this->Image($tempfile_plain, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, false, $imgmask); - // remove temp files - unlink($tempfile_alpha); - unlink($tempfile_plain); - } - - /** - * Correct the gamma value to be used with GD library - * @param float $v the gamma value to be corrected - * @access protected - * @since 4.3.007 (2008-12-04) - */ - protected function getGDgamma($v) { - return (pow(($v / 255), 2.2) * 255); - } - - /** - * Performs a line break. - * The current abscissa goes back to the left margin and the ordinate increases by the amount passed in parameter. - * @param float $h The height of the break. By default, the value equals the height of the last printed cell. - * @param boolean $cell if true add the current left (or right o for RTL) padding to the X coordinate - * @access public - * @since 1.0 - * @see Cell() - */ - public function Ln($h='', $cell=false) { - if (($this->num_columns > 1) AND ($this->y == $this->columns[$this->current_column]['y']) AND isset($this->columns[$this->current_column]['x']) AND ($this->x == $this->columns[$this->current_column]['x'])) { - // revove vertical space from the top of the column - return; - } - if ($cell) { - if ($this->rtl) { - $cellpadding = $this->cell_padding['R']; - } else { - $cellpadding = $this->cell_padding['L']; - } - } else { - $cellpadding = 0; - } - if ($this->rtl) { - $this->x = $this->w - $this->rMargin - $cellpadding; - } else { - $this->x = $this->lMargin + $cellpadding; - } - if (is_string($h)) { - $this->y += $this->lasth; - } else { - $this->y += $h; - } - $this->newline = true; - } - - /** - * Returns the relative X value of current position. - * The value is relative to the left border for LTR languages and to the right border for RTL languages. - * @return float - * @access public - * @since 1.2 - * @see SetX(), GetY(), SetY() - */ - public function GetX() { - //Get x position - if ($this->rtl) { - return ($this->w - $this->x); - } else { - return $this->x; - } - } - - /** - * Returns the absolute X value of current position. - * @return float - * @access public - * @since 1.2 - * @see SetX(), GetY(), SetY() - */ - public function GetAbsX() { - return $this->x; - } - - /** - * Returns the ordinate of the current position. - * @return float - * @access public - * @since 1.0 - * @see SetY(), GetX(), SetX() - */ - public function GetY() { - return $this->y; - } - - /** - * Defines the abscissa of the current position. - * If the passed value is negative, it is relative to the right of the page (or left if language is RTL). - * @param float $x The value of the abscissa. - * @param boolean $rtloff if true always uses the page top-left corner as origin of axis. - * @access public - * @since 1.2 - * @see GetX(), GetY(), SetY(), SetXY() - */ - public function SetX($x, $rtloff=false) { - if (!$rtloff AND $this->rtl) { - if ($x >= 0) { - $this->x = $this->w - $x; - } else { - $this->x = abs($x); - } - } else { - if ($x >= 0) { - $this->x = $x; - } else { - $this->x = $this->w + $x; - } - } - if ($this->x < 0) { - $this->x = 0; - } - if ($this->x > $this->w) { - $this->x = $this->w; - } - } - - /** - * Moves the current abscissa back to the left margin and sets the ordinate. - * If the passed value is negative, it is relative to the bottom of the page. - * @param float $y The value of the ordinate. - * @param bool $resetx if true (default) reset the X position. - * @param boolean $rtloff if true always uses the page top-left corner as origin of axis. - * @access public - * @since 1.0 - * @see GetX(), GetY(), SetY(), SetXY() - */ - public function SetY($y, $resetx=true, $rtloff=false) { - if ($resetx) { - //reset x - if (!$rtloff AND $this->rtl) { - $this->x = $this->w - $this->rMargin; - } else { - $this->x = $this->lMargin; - } - } - if ($y >= 0) { - $this->y = $y; - } else { - $this->y = $this->h + $y; - } - if ($this->y < 0) { - $this->y = 0; - } - if ($this->y > $this->h) { - $this->y = $this->h; - } - } - - /** - * Defines the abscissa and ordinate of the current position. - * If the passed values are negative, they are relative respectively to the right and bottom of the page. - * @param float $x The value of the abscissa. - * @param float $y The value of the ordinate. - * @param boolean $rtloff if true always uses the page top-left corner as origin of axis. - * @access public - * @since 1.2 - * @see SetX(), SetY() - */ - public function SetXY($x, $y, $rtloff=false) { - $this->SetY($y, false, $rtloff); - $this->SetX($x, $rtloff); - } - - /** - * Send the document to a given destination: string, local file or browser. - * In the last case, the plug-in may be used (if present) or a download ("Save as" dialog box) may be forced.
    - * The method first calls Close() if necessary to terminate the document. - * @param string $name The name of the file when saved. Note that special characters are removed and blanks characters are replaced with the underscore character. - * @param string $dest Destination where to send the document. It can take one of the following values:
    • I: send the file inline to the browser (default). The plug-in is used if available. The name given by name is used when one selects the "Save as" option on the link generating the PDF.
    • D: send to the browser and force a file download with the name given by name.
    • F: save to a local server file with the name given by name.
    • S: return the document as a string. name is ignored.
    • FI: equivalent to F + I option
    • FD: equivalent to F + D option
    - * @access public - * @since 1.0 - * @see Close() - */ - public function Output($name='doc.pdf', $dest='I') { - //Output PDF to some destination - //Finish document if necessary - if ($this->state < 3) { - $this->Close(); - } - //Normalize parameters - if (is_bool($dest)) { - $dest = $dest ? 'D' : 'F'; - } - $dest = strtoupper($dest); - if ($dest{0} != 'F') { - $name = preg_replace('/[\s]+/', '_', $name); - $name = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $name); - } - if ($this->sign) { - // *** apply digital signature to the document *** - // get the document content - $pdfdoc = $this->getBuffer(); - // remove last newline - $pdfdoc = substr($pdfdoc, 0, -1); - // Remove the original buffer - if (isset($this->diskcache) AND $this->diskcache) { - // remove buffer file from cache - unlink($this->buffer); - } - unset($this->buffer); - // remove filler space - $byterange_string_len = strlen($this->byterange_string); - // define the ByteRange - $byte_range = array(); - $byte_range[0] = 0; - $byte_range[1] = strpos($pdfdoc, $this->byterange_string) + $byterange_string_len + 10; - $byte_range[2] = $byte_range[1] + $this->signature_max_length + 2; - $byte_range[3] = strlen($pdfdoc) - $byte_range[2]; - $pdfdoc = substr($pdfdoc, 0, $byte_range[1]).substr($pdfdoc, $byte_range[2]); - // replace the ByteRange - $byterange = sprintf('/ByteRange[0 %u %u %u]', $byte_range[1], $byte_range[2], $byte_range[3]); - $byterange .= str_repeat(' ', ($byterange_string_len - strlen($byterange))); - $pdfdoc = str_replace($this->byterange_string, $byterange, $pdfdoc); - // write the document to a temporary folder - $tempdoc = tempnam(K_PATH_CACHE, 'tmppdf_'); - $f = fopen($tempdoc, 'wb'); - if (!$f) { - $this->Error('Unable to create temporary file: '.$tempdoc); - } - $pdfdoc_length = strlen($pdfdoc); - fwrite($f, $pdfdoc, $pdfdoc_length); - fclose($f); - // get digital signature via openssl library - $tempsign = tempnam(K_PATH_CACHE, 'tmpsig_'); - if (empty($this->signature_data['extracerts'])) { - openssl_pkcs7_sign($tempdoc, $tempsign, $this->signature_data['signcert'], array($this->signature_data['privkey'], $this->signature_data['password']), array(), PKCS7_BINARY | PKCS7_DETACHED); - } else { - openssl_pkcs7_sign($tempdoc, $tempsign, $this->signature_data['signcert'], array($this->signature_data['privkey'], $this->signature_data['password']), array(), PKCS7_BINARY | PKCS7_DETACHED, $this->signature_data['extracerts']); - } - unlink($tempdoc); - // read signature - $signature = file_get_contents($tempsign); - unlink($tempsign); - // extract signature - $signature = substr($signature, $pdfdoc_length); - $signature = substr($signature, (strpos($signature, "%%EOF\n\n------") + 13)); - $tmparr = explode("\n\n", $signature); - $signature = $tmparr[1]; - unset($tmparr); - // decode signature - $signature = base64_decode(trim($signature)); - // convert signature to hex - $signature = current(unpack('H*', $signature)); - $signature = str_pad($signature, $this->signature_max_length, '0'); - // Add signature to the document - $pdfdoc = substr($pdfdoc, 0, $byte_range[1]).'<'.$signature.'>'.substr($pdfdoc, $byte_range[1]); - $this->diskcache = false; - $this->buffer = &$pdfdoc; - $this->bufferlen = strlen($pdfdoc); - } - switch($dest) { - case 'I': { - // Send PDF to the standard output - if (ob_get_contents()) { - $this->Error('Some data has already been output, can\'t send PDF file'); - } - if (php_sapi_name() != 'cli') { - //We send to a browser - header('Content-Type: application/pdf'); - if (headers_sent()) { - $this->Error('Some data has already been output to browser, can\'t send PDF file'); - } - header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 - header('Pragma: public'); - header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past - header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); - header('Content-Length: '.$this->bufferlen); - header('Content-Disposition: inline; filename="'.basename($name).'";'); - } - echo $this->getBuffer(); - break; - } - case 'D': { - // Download PDF as file - if (ob_get_contents()) { - $this->Error('Some data has already been output, can\'t send PDF file'); - } - header('Content-Description: File Transfer'); - if (headers_sent()) { - $this->Error('Some data has already been output to browser, can\'t send PDF file'); - } - header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 - header('Pragma: public'); - header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past - header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); - // force download dialog - header('Content-Type: application/force-download'); - header('Content-Type: application/octet-stream', false); - header('Content-Type: application/download', false); - header('Content-Type: application/pdf', false); - // use the Content-Disposition header to supply a recommended filename - header('Content-Disposition: attachment; filename="'.basename($name).'";'); - header('Content-Transfer-Encoding: binary'); - header('Content-Length: '.$this->bufferlen); - echo $this->getBuffer(); - break; - } - case 'F': - case 'FI': - case 'FD': { - // Save PDF to a local file - if ($this->diskcache) { - copy($this->buffer, $name); - } else { - $f = fopen($name, 'wb'); - if (!$f) { - $this->Error('Unable to create output file: '.$name); - } - fwrite($f, $this->getBuffer(), $this->bufferlen); - fclose($f); - } - if ($dest == 'FI') { - // send headers to browser - header('Content-Type: application/pdf'); - header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 - header('Pragma: public'); - header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past - header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); - header('Content-Length: '.filesize($name)); - header('Content-Disposition: inline; filename="'.basename($name).'";'); - // send document to the browser - echo file_get_contents($name); - } elseif ($dest == 'FD') { - // send headers to browser - if (ob_get_contents()) { - $this->Error('Some data has already been output, can\'t send PDF file'); - } - header('Content-Description: File Transfer'); - if (headers_sent()) { - $this->Error('Some data has already been output to browser, can\'t send PDF file'); - } - header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 - header('Pragma: public'); - header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past - header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); - // force download dialog - header('Content-Type: application/force-download'); - header('Content-Type: application/octet-stream', false); - header('Content-Type: application/download', false); - header('Content-Type: application/pdf', false); - // use the Content-Disposition header to supply a recommended filename - header('Content-Disposition: attachment; filename="'.basename($name).'";'); - header('Content-Transfer-Encoding: binary'); - header('Content-Length: '.filesize($name)); - // send document to the browser - echo file_get_contents($name); - } - break; - } - case 'S': { - // Returns PDF as a string - return $this->getBuffer(); - } - default: { - $this->Error('Incorrect output destination: '.$dest); - } - } - return ''; - } - - /** - * Unset all class variables except the following critical variables: internal_encoding, state, bufferlen, buffer and diskcache. - * @param boolean $destroyall if true destroys all class variables, otherwise preserves critical variables. - * @param boolean $preserve_objcopy if true preserves the objcopy variable - * @access public - * @since 4.5.016 (2009-02-24) - */ - public function _destroy($destroyall=false, $preserve_objcopy=false) { - if ($destroyall AND isset($this->diskcache) AND $this->diskcache AND (!$preserve_objcopy) AND (!$this->empty_string($this->buffer))) { - // remove buffer file from cache - unlink($this->buffer); - } - foreach (array_keys(get_object_vars($this)) as $val) { - if ($destroyall OR ( - ($val != 'internal_encoding') - AND ($val != 'state') - AND ($val != 'bufferlen') - AND ($val != 'buffer') - AND ($val != 'diskcache') - AND ($val != 'sign') - AND ($val != 'signature_data') - AND ($val != 'signature_max_length') - AND ($val != 'byterange_string') - )) { - if ((!$preserve_objcopy OR ($val != 'objcopy')) AND isset($this->$val)) { - unset($this->$val); - } - } - } - } - - /** - * Check for locale-related bug - * @access protected - */ - protected function _dochecks() { - //Check for locale-related bug - if (1.1 == 1) { - $this->Error('Don\'t alter the locale before including class file'); - } - //Check for decimal separator - if (sprintf('%.1F', 1.0) != '1.0') { - setlocale(LC_NUMERIC, 'C'); - } - } - - /** - * Return fonts path - * @return string - * @access protected - */ - protected function _getfontpath() { - if (!defined('K_PATH_FONTS') AND is_dir(dirname(__FILE__).'/fonts')) { - define('K_PATH_FONTS', dirname(__FILE__).'/fonts/'); - } - return defined('K_PATH_FONTS') ? K_PATH_FONTS : ''; - } - - /** - * Output pages. - * @access protected - */ - protected function _putpages() { - $nb = $this->numpages; - if (!empty($this->AliasNbPages)) { - $nbs = $this->formatPageNumber($nb); - $nbu = $this->UTF8ToUTF16BE($nbs, false); // replacement for unicode font - $alias_a = $this->_escape($this->AliasNbPages); - $alias_au = $this->_escape('{'.$this->AliasNbPages.'}'); - if ($this->isunicode) { - $alias_b = $this->_escape($this->UTF8ToLatin1($this->AliasNbPages)); - $alias_bu = $this->_escape($this->UTF8ToLatin1('{'.$this->AliasNbPages.'}')); - $alias_c = $this->_escape($this->utf8StrRev($this->AliasNbPages, false, $this->tmprtl)); - $alias_cu = $this->_escape($this->utf8StrRev('{'.$this->AliasNbPages.'}', false, $this->tmprtl)); - } - } - if (!empty($this->AliasNumPage)) { - $alias_pa = $this->_escape($this->AliasNumPage); - $alias_pau = $this->_escape('{'.$this->AliasNumPage.'}'); - if ($this->isunicode) { - $alias_pb = $this->_escape($this->UTF8ToLatin1($this->AliasNumPage)); - $alias_pbu = $this->_escape($this->UTF8ToLatin1('{'.$this->AliasNumPage.'}')); - $alias_pc = $this->_escape($this->utf8StrRev($this->AliasNumPage, false, $this->tmprtl)); - $alias_pcu = $this->_escape($this->utf8StrRev('{'.$this->AliasNumPage.'}', false, $this->tmprtl)); - } - } - $pagegroupnum = 0; - $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; - for ($n=1; $n <= $nb; ++$n) { - $temppage = $this->getPageBuffer($n); - if (!empty($this->pagegroups)) { - if(isset($this->newpagegroup[$n])) { - $pagegroupnum = 0; - } - ++$pagegroupnum; - foreach ($this->pagegroups as $k => $v) { - // replace total pages group numbers - $vs = $this->formatPageNumber($v); - $vu = $this->UTF8ToUTF16BE($vs, false); - $alias_ga = $this->_escape($k); - $alias_gau = $this->_escape('{'.$k.'}'); - if ($this->isunicode) { - $alias_gb = $this->_escape($this->UTF8ToLatin1($k)); - $alias_gbu = $this->_escape($this->UTF8ToLatin1('{'.$k.'}')); - $alias_gc = $this->_escape($this->utf8StrRev($k, false, $this->tmprtl)); - $alias_gcu = $this->_escape($this->utf8StrRev('{'.$k.'}', false, $this->tmprtl)); - } - $temppage = str_replace($alias_gau, $vu, $temppage); - if ($this->isunicode) { - $temppage = str_replace($alias_gbu, $vu, $temppage); - $temppage = str_replace($alias_gcu, $vu, $temppage); - $temppage = str_replace($alias_gb, $vs, $temppage); - $temppage = str_replace($alias_gc, $vs, $temppage); - } - $temppage = str_replace($alias_ga, $vs, $temppage); - // replace page group numbers - $pvs = $this->formatPageNumber($pagegroupnum); - $pvu = $this->UTF8ToUTF16BE($pvs, false); - $pk = str_replace('{nb', '{pnb', $k); - $alias_pga = $this->_escape($pk); - $alias_pgau = $this->_escape('{'.$pk.'}'); - if ($this->isunicode) { - $alias_pgb = $this->_escape($this->UTF8ToLatin1($pk)); - $alias_pgbu = $this->_escape($this->UTF8ToLatin1('{'.$pk.'}')); - $alias_pgc = $this->_escape($this->utf8StrRev($pk, false, $this->tmprtl)); - $alias_pgcu = $this->_escape($this->utf8StrRev('{'.$pk.'}', false, $this->tmprtl)); - } - $temppage = str_replace($alias_pgau, $pvu, $temppage); - if ($this->isunicode) { - $temppage = str_replace($alias_pgbu, $pvu, $temppage); - $temppage = str_replace($alias_pgcu, $pvu, $temppage); - $temppage = str_replace($alias_pgb, $pvs, $temppage); - $temppage = str_replace($alias_pgc, $pvs, $temppage); - } - $temppage = str_replace($alias_pga, $pvs, $temppage); - } - } - if (!empty($this->AliasNbPages)) { - // replace total pages number - $temppage = str_replace($alias_au, $nbu, $temppage); - if ($this->isunicode) { - $temppage = str_replace($alias_bu, $nbu, $temppage); - $temppage = str_replace($alias_cu, $nbu, $temppage); - $temppage = str_replace($alias_b, $nbs, $temppage); - $temppage = str_replace($alias_c, $nbs, $temppage); - } - $temppage = str_replace($alias_a, $nbs, $temppage); - } - if (!empty($this->AliasNumPage)) { - // replace page number - $pnbs = $this->formatPageNumber($n); - $pnbu = $this->UTF8ToUTF16BE($pnbs, false); // replacement for unicode font - $temppage = str_replace($alias_pau, $pnbu, $temppage); - if ($this->isunicode) { - $temppage = str_replace($alias_pbu, $pnbu, $temppage); - $temppage = str_replace($alias_pcu, $pnbu, $temppage); - $temppage = str_replace($alias_pb, $pnbs, $temppage); - $temppage = str_replace($alias_pc, $pnbs, $temppage); - } - $temppage = str_replace($alias_pa, $pnbs, $temppage); - } - $temppage = str_replace($this->epsmarker, '', $temppage); - //Page - $this->page_obj_id[$n] = $this->_newobj(); - $out = '<<'; - $out .= ' /Type /Page'; - $out .= ' /Parent 1 0 R'; - $out .= ' /LastModified '.$this->_datestring(); - $out .= ' /Resources 2 0 R'; - $boxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'); - foreach ($boxes as $box) { - $out .= ' /'.$box; - $out .= sprintf(' [%.2F %.2F %.2F %.2F]', $this->pagedim[$n][$box]['llx'], $this->pagedim[$n][$box]['lly'], $this->pagedim[$n][$box]['urx'], $this->pagedim[$n][$box]['ury']); - } - if (isset($this->pagedim[$n]['BoxColorInfo']) AND !empty($this->pagedim[$n]['BoxColorInfo'])) { - $out .= ' /BoxColorInfo <<'; - foreach ($boxes as $box) { - if (isset($this->pagedim[$n]['BoxColorInfo'][$box])) { - $out .= ' /'.$box.' <<'; - if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['C'])) { - $color = $this->pagedim[$n]['BoxColorInfo'][$box]['C']; - $out .= ' /C ['; - $out .= sprintf(' %.3F %.3F %.3F', $color[0]/255, $color[1]/255, $color[2]/255); - $out .= ' ]'; - } - if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['W'])) { - $out .= ' /W '.($this->pagedim[$n]['BoxColorInfo'][$box]['W'] * $this->k); - } - if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['S'])) { - $out .= ' /S /'.$this->pagedim[$n]['BoxColorInfo'][$box]['S']; - } - if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['D'])) { - $dashes = $this->pagedim[$n]['BoxColorInfo'][$box]['D']; - $out .= ' /D ['; - foreach ($dashes as $dash) { - $out .= sprintf(' %.3F', ($dash * $this->k)); - } - $out .= ' ]'; - } - $out .= ' >>'; - } - } - $out .= ' >>'; - } - $out .= ' /Contents '.($this->n + 1).' 0 R'; - $out .= ' /Rotate '.$this->pagedim[$n]['Rotate']; - $out .= ' /Group << /Type /Group /S /Transparency /CS /DeviceRGB >>'; - if (isset($this->pagedim[$n]['trans']) AND !empty($this->pagedim[$n]['trans'])) { - // page transitions - if (isset($this->pagedim[$n]['trans']['Dur'])) { - $out .= ' /Dur '.$this->pagedim[$n]['trans']['Dur']; - } - $out .= ' /Trans <<'; - $out .= ' /Type /Trans'; - if (isset($this->pagedim[$n]['trans']['S'])) { - $out .= ' /S /'.$this->pagedim[$n]['trans']['S']; - } - if (isset($this->pagedim[$n]['trans']['D'])) { - $out .= ' /D '.$this->pagedim[$n]['trans']['D']; - } - if (isset($this->pagedim[$n]['trans']['Dm'])) { - $out .= ' /Dm /'.$this->pagedim[$n]['trans']['Dm']; - } - if (isset($this->pagedim[$n]['trans']['M'])) { - $out .= ' /M /'.$this->pagedim[$n]['trans']['M']; - } - if (isset($this->pagedim[$n]['trans']['Di'])) { - $out .= ' /Di '.$this->pagedim[$n]['trans']['Di']; - } - if (isset($this->pagedim[$n]['trans']['SS'])) { - $out .= ' /SS '.$this->pagedim[$n]['trans']['SS']; - } - if (isset($this->pagedim[$n]['trans']['B'])) { - $out .= ' /B '.$this->pagedim[$n]['trans']['B']; - } - $out .= ' >>'; - } - $out .= $this->_getannotsrefs($n); - $out .= ' /PZ '.$this->pagedim[$n]['PZ']; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - //Page content - $p = ($this->compress) ? gzcompress($temppage) : $temppage; - $this->_newobj(); - $p = $this->_getrawstream($p); - $this->_out('<<'.$filter.'/Length '.strlen($p).'>> stream'."\n".$p."\n".'endstream'."\n".'endobj'); - if ($this->diskcache) { - // remove temporary files - unlink($this->pages[$n]); - } - } - //Pages root - $out = $this->_getobj(1)."\n"; - $out .= '<< /Type /Pages /Kids ['; - foreach($this->page_obj_id as $page_obj) { - $out .= ' '.$page_obj.' 0 R'; - } - $out .= ' ] /Count '.$nb.' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - - /** - * Output references to page annotations - * @param int $n page number - * @access protected - * @author Nicola Asuni - * @since 4.7.000 (2008-08-29) - * @deprecated - */ - protected function _putannotsrefs($n) { - $this->_out($this->_getannotsrefs($n)); - } - - /** - * Get references to page annotations. - * @param int $n page number - * @return string - * @access protected - * @author Nicola Asuni - * @since 5.0.010 (2010-05-17) - */ - protected function _getannotsrefs($n) { - if (!(isset($this->PageAnnots[$n]) OR ($this->sign AND isset($this->signature_data['cert_type'])))) { - return ''; - } - $out = ' /Annots ['; - if (isset($this->PageAnnots[$n])) { - foreach ($this->PageAnnots[$n] as $key => $val) { - if (!in_array($val['n'], $this->radio_groups)) { - $out .= ' '.$val['n'].' 0 R'; - } - } - // add radiobutton groups - if (isset($this->radiobutton_groups[$n])) { - foreach ($this->radiobutton_groups[$n] as $key => $data) { - if (isset($data['n'])) { - $out .= ' '.$data['n'].' 0 R'; - } - } - } - } - if ($this->sign AND ($n == $this->signature_appearance['page']) AND isset($this->signature_data['cert_type'])) { - // set reference for signature object - $out .= ' '.$this->sig_obj_id.' 0 R'; - } - $out .= ' ]'; - return $out; - } - - /** - * Output annotations objects for all pages. - * !!! THIS METHOD IS NOT YET COMPLETED !!! - * See section 12.5 of PDF 32000_2008 reference. - * @access protected - * @author Nicola Asuni - * @since 4.0.018 (2008-08-06) - */ - protected function _putannotsobjs() { - // reset object counter - for ($n=1; $n <= $this->numpages; ++$n) { - if (isset($this->PageAnnots[$n])) { - // set page annotations - foreach ($this->PageAnnots[$n] as $key => $pl) { - $annot_obj_id = $this->PageAnnots[$n][$key]['n']; - // create annotation object for grouping radiobuttons - if (isset($this->radiobutton_groups[$n][$pl['txt']]) AND is_array($this->radiobutton_groups[$n][$pl['txt']])) { - $radio_button_obj_id = $this->radiobutton_groups[$n][$pl['txt']]['n']; - $annots = '<<'; - $annots .= ' /Type /Annot'; - $annots .= ' /Subtype /Widget'; - $annots .= ' /Rect [0 0 0 0]'; - $annots .= ' /T '.$this->_datastring($pl['txt'], $radio_button_obj_id); - $annots .= ' /FT /Btn'; - $annots .= ' /Ff 49152'; - $annots .= ' /Kids ['; - foreach ($this->radiobutton_groups[$n][$pl['txt']] as $key => $data) { - if ($key !== 'n') { - $annots .= ' '.$data['kid'].' 0 R'; - if ($data['def'] !== 'Off') { - $defval = $data['def']; - } - } - } - $annots .= ' ]'; - if (isset($defval)) { - $annots .= ' /V /'.$defval; - } - $annots .= ' >>'; - $this->_out($this->_getobj($radio_button_obj_id)."\n".$annots."\n".'endobj'); - $this->form_obj_id[] = $radio_button_obj_id; - // store object id to be used on Parent entry of Kids - $this->radiobutton_groups[$n][$pl['txt']] = $radio_button_obj_id; - } - $formfield = false; - $pl['opt'] = array_change_key_case($pl['opt'], CASE_LOWER); - $a = $pl['x'] * $this->k; - $b = $this->pagedim[$n]['h'] - (($pl['y'] + $pl['h']) * $this->k); - $c = $pl['w'] * $this->k; - $d = $pl['h'] * $this->k; - $rect = sprintf('%.2F %.2F %.2F %.2F', $a, $b, $a+$c, $b+$d); - // create new annotation object - $annots = '<_textstring($pl['txt'], $annot_obj_id); - $annots .= ' /P '.$this->page_obj_id[$n].' 0 R'; - $annots .= ' /NM '.$this->_datastring(sprintf('%04u-%04u', $n, $key), $annot_obj_id); - $annots .= ' /M '.$this->_datestring($annot_obj_id); - if (isset($pl['opt']['f'])) { - $val = 0; - if (is_array($pl['opt']['f'])) { - foreach ($pl['opt']['f'] as $f) { - switch (strtolower($f)) { - case 'invisible': { - $val += 1 << 0; - break; - } - case 'hidden': { - $val += 1 << 1; - break; - } - case 'print': { - $val += 1 << 2; - break; - } - case 'nozoom': { - $val += 1 << 3; - break; - } - case 'norotate': { - $val += 1 << 4; - break; - } - case 'noview': { - $val += 1 << 5; - break; - } - case 'readonly': { - $val += 1 << 6; - break; - } - case 'locked': { - $val += 1 << 8; - break; - } - case 'togglenoview': { - $val += 1 << 9; - break; - } - case 'lockedcontents': { - $val += 1 << 10; - break; - } - default: { - break; - } - } - } - } else { - $val = intval($pl['opt']['f']); - } - $annots .= ' /F '.intval($val); - } - if (isset($pl['opt']['as']) AND is_string($pl['opt']['as'])) { - $annots .= ' /AS /'.$pl['opt']['as']; - } - if (isset($pl['opt']['ap'])) { - // appearance stream - $annots .= ' /AP <<'; - if (is_array($pl['opt']['ap'])) { - foreach ($pl['opt']['ap'] as $apmode => $apdef) { - // $apmode can be: n = normal; r = rollover; d = down; - $annots .= ' /'.strtoupper($apmode); - if (is_array($apdef)) { - $annots .= ' <<'; - foreach ($apdef as $apstate => $stream) { - // reference to XObject that define the appearance for this mode-state - $apsobjid = $this->_putAPXObject($c, $d, $stream); - $annots .= ' /'.$apstate.' '.$apsobjid.' 0 R'; - } - $annots .= ' >>'; - } else { - // reference to XObject that define the appearance for this mode - $apsobjid = $this->_putAPXObject($c, $d, $apdef); - $annots .= ' '.$apsobjid.' 0 R'; - } - } - } else { - $annots .= $pl['opt']['ap']; - } - $annots .= ' >>'; - } - if (isset($pl['opt']['bs']) AND (is_array($pl['opt']['bs']))) { - $annots .= ' /BS <<'; - $annots .= ' /Type /Border'; - if (isset($pl['opt']['bs']['w'])) { - $annots .= ' /W '.intval($pl['opt']['bs']['w']); - } - $bstyles = array('S', 'D', 'B', 'I', 'U'); - if (isset($pl['opt']['bs']['s']) AND in_array($pl['opt']['bs']['s'], $bstyles)) { - $annots .= ' /S /'.$pl['opt']['bs']['s']; - } - if (isset($pl['opt']['bs']['d']) AND (is_array($pl['opt']['bs']['d']))) { - $annots .= ' /D ['; - foreach ($pl['opt']['bs']['d'] as $cord) { - $annots .= ' '.intval($cord); - } - $annots .= ']'; - } - $annots .= ' >>'; - } else { - $annots .= ' /Border ['; - if (isset($pl['opt']['border']) AND (count($pl['opt']['border']) >= 3)) { - $annots .= intval($pl['opt']['border'][0]).' '; - $annots .= intval($pl['opt']['border'][1]).' '; - $annots .= intval($pl['opt']['border'][2]); - if (isset($pl['opt']['border'][3]) AND is_array($pl['opt']['border'][3])) { - $annots .= ' ['; - foreach ($pl['opt']['border'][3] as $dash) { - $annots .= intval($dash).' '; - } - $annots .= ']'; - } - } else { - $annots .= '0 0 0'; - } - $annots .= ']'; - } - if (isset($pl['opt']['be']) AND (is_array($pl['opt']['be']))) { - $annots .= ' /BE <<'; - $bstyles = array('S', 'C'); - if (isset($pl['opt']['be']['s']) AND in_array($pl['opt']['be']['s'], $markups)) { - $annots .= ' /S /'.$pl['opt']['bs']['s']; - } else { - $annots .= ' /S /S'; - } - if (isset($pl['opt']['be']['i']) AND ($pl['opt']['be']['i'] >= 0) AND ($pl['opt']['be']['i'] <= 2)) { - $annots .= ' /I '.sprintf(' %.4F', $pl['opt']['be']['i']); - } - $annots .= '>>'; - } - if (isset($pl['opt']['c']) AND (is_array($pl['opt']['c'])) AND !empty($pl['opt']['c'])) { - $annots .= ' /C ['; - foreach ($pl['opt']['c'] as $col) { - $col = intval($col); - $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255); - $annots .= sprintf(' %.4F', $color); - } - $annots .= ']'; - } - //$annots .= ' /StructParent '; - //$annots .= ' /OC '; - $markups = array('text', 'freetext', 'line', 'square', 'circle', 'polygon', 'polyline', 'highlight', 'underline', 'squiggly', 'strikeout', 'stamp', 'caret', 'ink', 'fileattachment', 'sound'); - if (in_array(strtolower($pl['opt']['subtype']), $markups)) { - // this is a markup type - if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) { - $annots .= ' /T '.$this->_textstring($pl['opt']['t'], $annot_obj_id); - } - //$annots .= ' /Popup '; - if (isset($pl['opt']['ca'])) { - $annots .= ' /CA '.sprintf('%.4F', floatval($pl['opt']['ca'])); - } - if (isset($pl['opt']['rc'])) { - $annots .= ' /RC '.$this->_textstring($pl['opt']['rc'], $annot_obj_id); - } - $annots .= ' /CreationDate '.$this->_datestring($annot_obj_id); - //$annots .= ' /IRT '; - if (isset($pl['opt']['subj'])) { - $annots .= ' /Subj '.$this->_textstring($pl['opt']['subj'], $annot_obj_id); - } - //$annots .= ' /RT '; - //$annots .= ' /IT '; - //$annots .= ' /ExData '; - } - $lineendings = array('Square', 'Circle', 'Diamond', 'OpenArrow', 'ClosedArrow', 'None', 'Butt', 'ROpenArrow', 'RClosedArrow', 'Slash'); - // Annotation types - switch (strtolower($pl['opt']['subtype'])) { - case 'text': { - if (isset($pl['opt']['open'])) { - $annots .= ' /Open '. (strtolower($pl['opt']['open']) == 'true' ? 'true' : 'false'); - } - $iconsapp = array('Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph'); - if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) { - $annots .= ' /Name /'.$pl['opt']['name']; - } else { - $annots .= ' /Name /Note'; - } - $statemodels = array('Marked', 'Review'); - if (isset($pl['opt']['statemodel']) AND in_array($pl['opt']['statemodel'], $statemodels)) { - $annots .= ' /StateModel /'.$pl['opt']['statemodel']; - } else { - $pl['opt']['statemodel'] = 'Marked'; - $annots .= ' /StateModel /'.$pl['opt']['statemodel']; - } - if ($pl['opt']['statemodel'] == 'Marked') { - $states = array('Accepted', 'Unmarked'); - } else { - $states = array('Accepted', 'Rejected', 'Cancelled', 'Completed', 'None'); - } - if (isset($pl['opt']['state']) AND in_array($pl['opt']['state'], $states)) { - $annots .= ' /State /'.$pl['opt']['state']; - } else { - if ($pl['opt']['statemodel'] == 'Marked') { - $annots .= ' /State /Unmarked'; - } else { - $annots .= ' /State /None'; - } - } - break; - } - case 'link': { - if(is_string($pl['txt'])) { - // external URI link - $annots .= ' /A <_datastring($this->unhtmlentities($pl['txt']), $annot_obj_id).'>>'; - } else { - // internal link - $l = $this->links[$pl['txt']]; - $annots .= sprintf(' /Dest [%u 0 R /XYZ 0 %.2F null]', $this->page_obj_id[($l[0])], ($this->pagedim[$l[0]]['h'] - ($l[1] * $this->k))); - } - $hmodes = array('N', 'I', 'O', 'P'); - if (isset($pl['opt']['h']) AND in_array($pl['opt']['h'], $hmodes)) { - $annots .= ' /H /'.$pl['opt']['h']; - } else { - $annots .= ' /H /I'; - } - //$annots .= ' /PA '; - //$annots .= ' /Quadpoints '; - break; - } - case 'freetext': { - if (isset($pl['opt']['da']) AND !empty($pl['opt']['da'])) { - $annots .= ' /DA ('.$pl['opt']['da'].')'; - } - if (isset($pl['opt']['q']) AND ($pl['opt']['q'] >= 0) AND ($pl['opt']['q'] <= 2)) { - $annots .= ' /Q '.intval($pl['opt']['q']); - } - if (isset($pl['opt']['rc'])) { - $annots .= ' /RC '.$this->_textstring($pl['opt']['rc'], $annot_obj_id); - } - if (isset($pl['opt']['ds'])) { - $annots .= ' /DS '.$this->_textstring($pl['opt']['ds'], $annot_obj_id); - } - if (isset($pl['opt']['cl']) AND is_array($pl['opt']['cl'])) { - $annots .= ' /CL ['; - foreach ($pl['opt']['cl'] as $cl) { - $annots .= sprintf('%.4F ', $cl * $this->k); - } - $annots .= ']'; - } - $tfit = array('FreeText', 'FreeTextCallout', 'FreeTextTypeWriter'); - if (isset($pl['opt']['it']) AND in_array($pl['opt']['it'], $tfit)) { - $annots .= ' /IT /'.$pl['opt']['it']; - } - if (isset($pl['opt']['rd']) AND is_array($pl['opt']['rd'])) { - $l = $pl['opt']['rd'][0] * $this->k; - $r = $pl['opt']['rd'][1] * $this->k; - $t = $pl['opt']['rd'][2] * $this->k; - $b = $pl['opt']['rd'][3] * $this->k; - $annots .= ' /RD ['.sprintf('%.2F %.2F %.2F %.2F', $l, $r, $t, $b).']'; - } - if (isset($pl['opt']['le']) AND in_array($pl['opt']['le'], $lineendings)) { - $annots .= ' /LE /'.$pl['opt']['le']; - } - break; - } - case 'line': { - break; - } - case 'square': { - break; - } - case 'circle': { - break; - } - case 'polygon': { - break; - } - case 'polyline': { - break; - } - case 'highlight': { - break; - } - case 'underline': { - break; - } - case 'squiggly': { - break; - } - case 'strikeout': { - break; - } - case 'stamp': { - break; - } - case 'caret': { - break; - } - case 'ink': { - break; - } - case 'popup': { - break; - } - case 'fileattachment': { - if (!isset($pl['opt']['fs'])) { - break; - } - $filename = basename($pl['opt']['fs']); - if (isset($this->embeddedfiles[$filename]['n'])) { - $annots .= ' /FS <_datastring($filename, $annot_obj_id).' /EF <embeddedfiles[$filename]['n'].' 0 R>> >>'; - $iconsapp = array('Graph', 'Paperclip', 'PushPin', 'Tag'); - if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) { - $annots .= ' /Name /'.$pl['opt']['name']; - } else { - $annots .= ' /Name /PushPin'; - } - } - break; - } - case 'sound': { - if (!isset($pl['opt']['fs'])) { - break; - } - $filename = basename($pl['opt']['fs']); - if (isset($this->embeddedfiles[$filename]['n'])) { - // ... TO BE COMPLETED ... - // /R /C /B /E /CO /CP - $annots .= ' /Sound <_datastring($filename, $annot_obj_id).' /EF <embeddedfiles[$filename]['n'].' 0 R>> >>'; - $iconsapp = array('Speaker', 'Mic'); - if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) { - $annots .= ' /Name /'.$pl['opt']['name']; - } else { - $annots .= ' /Name /Speaker'; - } - } - break; - } - case 'movie': { - break; - } - case 'widget': { - $hmode = array('N', 'I', 'O', 'P', 'T'); - if (isset($pl['opt']['h']) AND in_array($pl['opt']['h'], $hmode)) { - $annots .= ' /H /'.$pl['opt']['h']; - } - if (isset($pl['opt']['mk']) AND (is_array($pl['opt']['mk'])) AND !empty($pl['opt']['mk'])) { - $annots .= ' /MK <<'; - if (isset($pl['opt']['mk']['r'])) { - $annots .= ' /R '.$pl['opt']['mk']['r']; - } - if (isset($pl['opt']['mk']['bc']) AND (is_array($pl['opt']['mk']['bc']))) { - $annots .= ' /BC ['; - foreach($pl['opt']['mk']['bc'] AS $col) { - $col = intval($col); - $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255); - $annots .= sprintf(' %.2F', $color); - } - $annots .= ']'; - } - if (isset($pl['opt']['mk']['bg']) AND (is_array($pl['opt']['mk']['bg']))) { - $annots .= ' /BG ['; - foreach($pl['opt']['mk']['bg'] AS $col) { - $col = intval($col); - $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255); - $annots .= sprintf(' %.2F', $color); - } - $annots .= ']'; - } - if (isset($pl['opt']['mk']['ca'])) { - $annots .= ' /CA '.$pl['opt']['mk']['ca']; - } - if (isset($pl['opt']['mk']['rc'])) { - $annots .= ' /RC '.$pl['opt']['mk']['rc']; - } - if (isset($pl['opt']['mk']['ac'])) { - $annots .= ' /AC '.$pl['opt']['mk']['ac']; - } - if (isset($pl['opt']['mk']['i'])) { - $info = $this->getImageBuffer($pl['opt']['mk']['i']); - if ($info !== false) { - $annots .= ' /I '.$info['n'].' 0 R'; - } - } - if (isset($pl['opt']['mk']['ri'])) { - $info = $this->getImageBuffer($pl['opt']['mk']['ri']); - if ($info !== false) { - $annots .= ' /RI '.$info['n'].' 0 R'; - } - } - if (isset($pl['opt']['mk']['ix'])) { - $info = $this->getImageBuffer($pl['opt']['mk']['ix']); - if ($info !== false) { - $annots .= ' /IX '.$info['n'].' 0 R'; - } - } - if (isset($pl['opt']['mk']['if']) AND (is_array($pl['opt']['mk']['if'])) AND !empty($pl['opt']['mk']['if'])) { - $annots .= ' /IF <<'; - $if_sw = array('A', 'B', 'S', 'N'); - if (isset($pl['opt']['mk']['if']['sw']) AND in_array($pl['opt']['mk']['if']['sw'], $if_sw)) { - $annots .= ' /SW /'.$pl['opt']['mk']['if']['sw']; - } - $if_s = array('A', 'P'); - if (isset($pl['opt']['mk']['if']['s']) AND in_array($pl['opt']['mk']['if']['s'], $if_s)) { - $annots .= ' /S /'.$pl['opt']['mk']['if']['s']; - } - if (isset($pl['opt']['mk']['if']['a']) AND (is_array($pl['opt']['mk']['if']['a'])) AND !empty($pl['opt']['mk']['if']['a'])) { - $annots .= sprintf(' /A [%.2F %.2F]', $pl['opt']['mk']['if']['a'][0], $pl['opt']['mk']['if']['a'][1]); - } - if (isset($pl['opt']['mk']['if']['fb']) AND ($pl['opt']['mk']['if']['fb'])) { - $annots .= ' /FB true'; - } - $annots .= '>>'; - } - if (isset($pl['opt']['mk']['tp']) AND ($pl['opt']['mk']['tp'] >= 0) AND ($pl['opt']['mk']['tp'] <= 6)) { - $annots .= ' /TP '.intval($pl['opt']['mk']['tp']); - } else { - $annots .= ' /TP 0'; - } - $annots .= '>>'; - } // end MK - // --- Entries for field dictionaries --- - if (isset($this->radiobutton_groups[$n][$pl['txt']])) { - // set parent - $annots .= ' /Parent '.$this->radiobutton_groups[$n][$pl['txt']].' 0 R'; - } - if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) { - $annots .= ' /T '.$this->_datastring($pl['opt']['t'], $annot_obj_id); - } - if (isset($pl['opt']['tu']) AND is_string($pl['opt']['tu'])) { - $annots .= ' /TU '.$this->_datastring($pl['opt']['tu'], $annot_obj_id); - } - if (isset($pl['opt']['tm']) AND is_string($pl['opt']['tm'])) { - $annots .= ' /TM '.$this->_datastring($pl['opt']['tm'], $annot_obj_id); - } - if (isset($pl['opt']['ff'])) { - if (is_array($pl['opt']['ff'])) { - // array of bit settings - $flag = 0; - foreach($pl['opt']['ff'] as $val) { - $flag += 1 << ($val - 1); - } - } else { - $flag = intval($pl['opt']['ff']); - } - $annots .= ' /Ff '.$flag; - } - if (isset($pl['opt']['maxlen'])) { - $annots .= ' /MaxLen '.intval($pl['opt']['maxlen']); - } - if (isset($pl['opt']['v'])) { - $annots .= ' /V'; - if (is_array($pl['opt']['v'])) { - foreach ($pl['opt']['v'] AS $optval) { - if (is_float($optval)) { - $optval = sprintf('%.2F', $optval); - } - $annots .= ' '.$optval; - } - } else { - $annots .= ' '.$this->_textstring($pl['opt']['v'], $annot_obj_id); - } - } - if (isset($pl['opt']['dv'])) { - $annots .= ' /DV'; - if (is_array($pl['opt']['dv'])) { - foreach ($pl['opt']['dv'] AS $optval) { - if (is_float($optval)) { - $optval = sprintf('%.2F', $optval); - } - $annots .= ' '.$optval; - } - } else { - $annots .= ' '.$this->_textstring($pl['opt']['dv'], $annot_obj_id); - } - } - if (isset($pl['opt']['rv'])) { - $annots .= ' /RV'; - if (is_array($pl['opt']['rv'])) { - foreach ($pl['opt']['rv'] AS $optval) { - if (is_float($optval)) { - $optval = sprintf('%.2F', $optval); - } - $annots .= ' '.$optval; - } - } else { - $annots .= ' '.$this->_textstring($pl['opt']['rv'], $annot_obj_id); - } - } - if (isset($pl['opt']['a']) AND !empty($pl['opt']['a'])) { - $annots .= ' /A << '.$pl['opt']['a'].' >>'; - } - if (isset($pl['opt']['aa']) AND !empty($pl['opt']['aa'])) { - $annots .= ' /AA << '.$pl['opt']['aa'].' >>'; - } - if (isset($pl['opt']['da']) AND !empty($pl['opt']['da'])) { - $annots .= ' /DA ('.$pl['opt']['da'].')'; - } - if (isset($pl['opt']['q']) AND ($pl['opt']['q'] >= 0) AND ($pl['opt']['q'] <= 2)) { - $annots .= ' /Q '.intval($pl['opt']['q']); - } - if (isset($pl['opt']['opt']) AND (is_array($pl['opt']['opt'])) AND !empty($pl['opt']['opt'])) { - $annots .= ' /Opt ['; - foreach($pl['opt']['opt'] AS $copt) { - if (is_array($copt)) { - $annots .= ' ['.$this->_textstring($copt[0], $annot_obj_id).' '.$this->_textstring($copt[1], $annot_obj_id).']'; - } else { - $annots .= ' '.$this->_textstring($copt, $annot_obj_id); - } - } - $annots .= ']'; - } - if (isset($pl['opt']['ti'])) { - $annots .= ' /TI '.intval($pl['opt']['ti']); - } - if (isset($pl['opt']['i']) AND (is_array($pl['opt']['i'])) AND !empty($pl['opt']['i'])) { - $annots .= ' /I ['; - foreach($pl['opt']['i'] AS $copt) { - $annots .= intval($copt).' '; - } - $annots .= ']'; - } - break; - } - case 'screen': { - break; - } - case 'printermark': { - break; - } - case 'trapnet': { - break; - } - case 'watermark': { - break; - } - case '3d': { - break; - } - default: { - break; - } - } - $annots .= '>>'; - // create new annotation object - $this->_out($this->_getobj($annot_obj_id)."\n".$annots."\n".'endobj'); - if ($formfield AND !isset($this->radiobutton_groups[$n][$pl['txt']])) { - // store reference of form object - $this->form_obj_id[] = $annot_obj_id; - } - } - } - } // end for each page - } - - /** - * Put appearance streams XObject used to define annotation's appearance states - * @param int $w annotation width - * @param int $h annotation height - * @param string $stream appearance stream - * @return int object ID - * @access protected - * @since 4.8.001 (2009-09-09) - */ - protected function _putAPXObject($w=0, $h=0, $stream='') { - $stream = trim($stream); - $out = $this->_getobj()."\n"; - $this->xobjects['AX'.$this->n] = array('n' => $this->n); - $out .= '<<'; - $out .= ' /Type /XObject'; - $out .= ' /Subtype /Form'; - $out .= ' /FormType 1'; - if ($this->compress) { - $stream = gzcompress($stream); - $out .= ' /Filter /FlateDecode'; - } - $rect = sprintf('%.2F %.2F', $w, $h); - $out .= ' /BBox [0 0 '.$rect.']'; - $out .= ' /Matrix [1 0 0 1 0 0]'; - $out .= ' /Resources <<'; - $out .= ' /ProcSet [/PDF /Text]'; - $out .= ' /Font <<'; - foreach ($this->annotation_fonts as $fontkey => $fontid) { - $out .= ' /F'.$fontid.' '.$this->font_obj_ids[$fontkey].' 0 R'; - } - $out .= ' >>'; - $out .= ' >>'; - $stream = $this->_getrawstream($stream); - $out .= ' /Length '.strlen($stream); - $out .= ' >>'; - $out .= ' stream'."\n".$stream."\n".'endstream'; - $out .= "\n".'endobj'; - $this->_out($out); - return $this->n; - } - - /** - * Get ULONG from string (Big Endian 32-bit unsigned integer). - * @param string $str string from where to extract value - * @param int $offset point from where to read the data - * @return int 32 bit value - * @author Nicola Asuni - * @access protected - * @since 5.2.000 (2010-06-02) - */ - protected function _getULONG(&$str, &$offset) { - $v = unpack('Ni', substr($str, $offset, 4)); - $offset += 4; - return $v['i']; - } - - /** - * Get USHORT from string (Big Endian 16-bit unsigned integer). - * @param string $str string from where to extract value - * @param int $offset point from where to read the data - * @return int 16 bit value - * @author Nicola Asuni - * @access protected - * @since 5.2.000 (2010-06-02) - */ - protected function _getUSHORT(&$str, &$offset) { - $v = unpack('ni', substr($str, $offset, 2)); - $offset += 2; - return $v['i']; - } - - /** - * Get SHORT from string (Big Endian 16-bit signed integer). - * @param string $str string from where to extract value - * @param int $offset point from where to read the data - * @return int 16 bit value - * @author Nicola Asuni - * @access protected - * @since 5.2.000 (2010-06-02) - */ - protected function _getSHORT(&$str, &$offset) { - $v = unpack('si', substr($str, $offset, 2)); - $offset += 2; - return $v['i']; - } - - /** - * Get BYTE from string (8-bit unsigned integer). - * @param string $str string from where to extract value - * @param int $offset point from where to read the data - * @return int 8 bit value - * @author Nicola Asuni - * @access protected - * @since 5.2.000 (2010-06-02) - */ - protected function _getBYTE(&$str, &$offset) { - $v = unpack('Ci', substr($str, $offset, 1)); - ++$offset; - return $v['i']; - } - - /** - * Returns a subset of the TrueType font data without the unused glyphs. - * @param string $font TrueType font data - * @param array $subsetchars array of used characters (the glyphs to keep) - * @return string a subset of TrueType font data without the unused glyphs - * @author Nicola Asuni - * @access protected - * @since 5.2.000 (2010-06-02) - */ - protected function _getTrueTypeFontSubset($font, $subsetchars) { - ksort($subsetchars); - $offset = 0; // offset position of the font data - if ($this->_getULONG($font, $offset) != 0x10000) { - // sfnt version must be 0x00010000 for TrueType version 1.0. - return $font; - } - // get number of tables - $numTables = $this->_getUSHORT($font, $offset); - // skip searchRange, entrySelector and rangeShift - $offset += 6; - // tables array - $table = array(); - // for each table - for ($i = 0; $i < $numTables; ++$i) { - // get table info - $tag = substr($font, $offset, 4); - $offset += 4; - $table[$tag] = array(); - $table[$tag]['checkSum'] = $this->_getULONG($font, $offset); - $table[$tag]['offset'] = $this->_getULONG($font, $offset); - $table[$tag]['length'] = $this->_getULONG($font, $offset); - } - // check magicNumber - $offset = $table['head']['offset'] + 12; - if ($this->_getULONG($font, $offset) != 0x5F0F3CF5) { - // magicNumber must be 0x5F0F3CF5 - return $font; - } - // get offset mode (indexToLocFormat : 0 = short, 1 = long) - $offset = $table['head']['offset'] + 50; - $short_offset = ($this->_getSHORT($font, $offset) == 0); - // get the offsets to the locations of the glyphs in the font, relative to the beginning of the glyphData table - $indexToLoc = array(); - $offset = $table['loca']['offset']; - if ($short_offset) { - // short version - $n = $table['loca']['length'] / 2; // numGlyphs + 1 - for ($i = 0; $i < $n; ++$i) { - $indexToLoc[$i] = $this->_getUSHORT($font, $offset) * 2; - } - } else { - // long version - $n = $table['loca']['length'] / 4; // numGlyphs + 1 - for ($i = 0; $i < $n; ++$i) { - $indexToLoc[$i] = $this->_getULONG($font, $offset); - } - } - // get glyphs indexes of chars from cmap table - $subsetglyphs = array(); // glyph IDs on key - $subsetglyphs[0] = true; // character codes that do not correspond to any glyph in the font should be mapped to glyph index 0 - $offset = $table['cmap']['offset'] + 2; - $numEncodingTables = $this->_getUSHORT($font, $offset); - $encodingTables = array(); - for ($i = 0; $i < $numEncodingTables; ++$i) { - $encodingTables[$i]['platformID'] = $this->_getUSHORT($font, $offset); - $encodingTables[$i]['encodingID'] = $this->_getUSHORT($font, $offset); - $encodingTables[$i]['offset'] = $this->_getULONG($font, $offset); - } - foreach ($encodingTables as $enctable) { - if (($enctable['platformID'] == 3) AND ($enctable['encodingID'] == 0)) { - $modesymbol = true; - } else { - $modesymbol = false; - } - $offset = $table['cmap']['offset'] + $enctable['offset']; - $format = $this->_getUSHORT($font, $offset); - switch ($format) { - case 0: { // Format 0: Byte encoding table - $offset += 4; // skip length and version/language - for ($k = 0; $k < 256; ++$k) { - if (isset($subsetchars[$k])) { - $g = $this->_getBYTE($font, $offset); - $subsetglyphs[$g] = $k; - } else { - ++$offset; - } - } - break; - } - case 2: { // Format 2: High-byte mapping through table - $offset += 4; // skip length and version - // to be implemented ... - break; - } - case 4: { // Format 4: Segment mapping to delta values - $length = $this->_getUSHORT($font, $offset); - $offset += 2; // skip version/language - $segCount = ($this->_getUSHORT($font, $offset) / 2); - $offset += 6; // skip searchRange, entrySelector, rangeShift - $endCount = array(); // array of end character codes for each segment - for ($k = 0; $k < $segCount; ++$k) { - $endCount[$k] = $this->_getUSHORT($font, $offset); - } - $offset += 2; // skip reservedPad - $startCount = array(); // array of start character codes for each segment - for ($k = 0; $k < $segCount; ++$k) { - $startCount[$k] = $this->_getUSHORT($font, $offset); - } - $idDelta = array(); // delta for all character codes in segment - for ($k = 0; $k < $segCount; ++$k) { - $idDelta[$k] = $this->_getUSHORT($font, $offset); - } - $idRangeOffset = array(); // Offsets into glyphIdArray or 0 - for ($k = 0; $k < $segCount; ++$k) { - $idRangeOffset[$k] = $this->_getUSHORT($font, $offset); - } - $gidlen = ($length / 2) - 8 - (4 * $segCount); - $glyphIdArray = array(); // glyph index array - for ($k = 0; $k < $gidlen; ++$k) { - $glyphIdArray[$k] = $this->_getUSHORT($font, $offset); - } - for ($k = 0; $k < $segCount; ++$k) { - for ($c = $startCount[$k]; $c <= $endCount[$k]; ++$c) { - if (isset($subsetchars[$c])) { - if ($idRangeOffset[$k] == 0) { - $g = $c; - } else { - $gid = (($idRangeOffset[$k] / 2) + ($c - $startCount[$k]) - ($segCount - $k)); - $g = $glyphIdArray[$gid]; - } - $g += ($idDelta[$k] - 65536); - if ($g < 0) { - $g = 0; - } - $subsetglyphs[$g] = $c; - } - } - } - break; - } - case 6: { // Format 6: Trimmed table mapping - $offset += 4; // skip length and version/language - $firstCode = $this->_getUSHORT($font, $offset); - $entryCount = $this->_getUSHORT($font, $offset); - for ($k = 0; $k < $entryCount; ++$k) { - $c = ($k + $firstCode); - if (isset($subsetchars[$c])) { - $g = $this->_getUSHORT($font, $offset); - $subsetglyphs[$g] = $c; - } else { - $offset += 2; - } - } - break; - } - case 8: { // Format 8: Mixed 16-bit and 32-bit coverage - $offset += 10; // skip length and version - // to be implemented ... - break; - } - case 10: { // Format 10: Trimmed array - $offset += 10; // skip length and version/language - $startCharCode = $this->_getULONG($font, $offset); - $numChars = $this->_getULONG($font, $offset); - for ($k = 0; $k < $numChars; ++$k) { - $c = ($k + $startCharCode); - if (isset($subsetchars[$c])) { - $g = $this->_getUSHORT($font, $offset); - $subsetglyphs[$g] = $c; - } else { - $offset += 2; - } - } - break; - } - case 12: { // Format 12: Segmented coverage - $offset += 10; // skip length and version/language - $nGroups = $this->_getULONG($font, $offset); - for ($k = 0; $k < $nGroups; ++$k) { - $startCharCode = $this->_getULONG($font, $offset); - $endCharCode = $this->_getULONG($font, $offset); - $startGlyphCode = $this->_getULONG($font, $offset); - for ($c = $startCharCode; $c <= $endCharCode; ++$c) { - if (isset($subsetchars[$c])) { - $subsetglyphs[$startGlyphCode] = $c; - } - ++$startGlyphCode; - } - } - break; - } - } - } - // sort glyphs by key - ksort($subsetglyphs); - // add composite glyps to $subsetglyphs and remove missing glyphs - foreach ($subsetglyphs as $key => $val) { - if (isset($indexToLoc[$key])) { - $offset = $table['glyf']['offset'] + $indexToLoc[$key]; - $numberOfContours = $this->_getSHORT($font, $offset); - if ($numberOfContours < 0) { // composite glyph - $offset += 8; // skip xMin, yMin, xMax, yMax - do { - $flags = $this->_getUSHORT($font, $offset); - $glyphIndex = $this->_getUSHORT($font, $offset); - if (!isset($subsetglyphs[$glyphIndex]) AND isset($indexToLoc[$glyphIndex])) { - // add missing glyphs - $subsetglyphs[$glyphIndex] = true; - } - // skip some bytes by case - if ($flags & 1) { - $offset += 4; - } else { - $offset += 2; - } - if ($flags & 8) { - $offset += 2; - } elseif ($flags & 64) { - $offset += 4; - } elseif ($flags & 128) { - $offset += 8; - } - } while ($flags & 32); - } - } else { - unset($subsetglyphs[$key]); - } - } - // build new glyf table with only used glyphs - $glyf = ''; - $glyfSize = 0; - // create new empty indexToLoc table - $newIndexToLoc = array_fill(0, count($indexToLoc), 0); - $goffset = 0; - foreach ($subsetglyphs as $glyphID => $char) { - if (isset($indexToLoc[$glyphID]) AND isset($indexToLoc[($glyphID + 1)])) { - $start = $indexToLoc[$glyphID]; - $length = ($indexToLoc[($glyphID + 1)] - $start); - $glyf .= substr($font, ($table['glyf']['offset'] + $start), $length); - $newIndexToLoc[$glyphID] = $goffset; - $goffset += $length; - } - } - // build new loca table - $loca = ''; - if ($short_offset) { - foreach ($newIndexToLoc as $glyphID => $offset) { - $loca .= pack('n', ($offset / 2)); - } - } else { - foreach ($newIndexToLoc as $glyphID => $offset) { - $loca .= pack('N', $offset); - } - } - // array of table names to preserve (loca and glyf tables will be added later) - //$table_names = array ('cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2', 'post', 'cvt ', 'fpgm', 'prep'); - // the cmap table is not needed and shall not be present, since the mapping from character codes to glyph descriptions is provided separately - $table_names = array ('head', 'hhea', 'hmtx', 'maxp', 'cvt ', 'fpgm', 'prep'); // minimum required table names - // get the tables to preserve - $offset = 12; - foreach ($table as $tag => $val) { - if (in_array($tag, $table_names)) { - $table[$tag]['data'] = substr($font, $table[$tag]['offset'], $table[$tag]['length']); - if ($tag == 'head') { - // set the checkSumAdjustment to 0 - $table[$tag]['data'] = substr($table[$tag]['data'], 0, 8)."\x0\x0\x0\x0".substr($table[$tag]['data'], 12); - } - $pad = 4 - ($table[$tag]['length'] % 4); - if ($pad != 4) { - // the length of a table must be a multiple of four bytes - $table[$tag]['length'] += $pad; - $table[$tag]['data'] .= str_repeat("\x0", $pad); - } - $table[$tag]['offset'] = $offset; - $offset += $table[$tag]['length']; - // check sum is not changed (so keep the following line commented) - //$table[$tag]['checkSum'] = $this->_getTTFtableChecksum($table[$tag]['data'], $table[$tag]['length']); - } else { - unset($table[$tag]); - } - } - // add loca - $table['loca']['data'] = $loca; - $table['loca']['length'] = strlen($loca); - $pad = 4 - ($table['loca']['length'] % 4); - if ($pad != 4) { - // the length of a table must be a multiple of four bytes - $table['loca']['length'] += $pad; - $table['loca']['data'] .= str_repeat("\x0", $pad); - } - $table['loca']['offset'] = $offset; - $table['loca']['checkSum'] = $this->_getTTFtableChecksum($table['loca']['data'], $table['loca']['length']); - $offset += $table['loca']['length']; - // add glyf - $table['glyf']['data'] = $glyf; - $table['glyf']['length'] = strlen($glyf); - $pad = 4 - ($table['glyf']['length'] % 4); - if ($pad != 4) { - // the length of a table must be a multiple of four bytes - $table['glyf']['length'] += $pad; - $table['glyf']['data'] .= str_repeat("\x0", $pad); - } - $table['glyf']['offset'] = $offset; - $table['glyf']['checkSum'] = $this->_getTTFtableChecksum($table['glyf']['data'], $table['glyf']['length']); - // rebuild font - $font = ''; - $font .= pack('N', 0x10000); // sfnt version - $numTables = count($table); - $font .= pack('n', $numTables); // numTables - $entrySelector = floor(log($numTables, 2)); - $searchRange = pow(2, $entrySelector) * 16; - $rangeShift = ($numTables * 16) - $searchRange; - $font .= pack('n', $searchRange); // searchRange - $font .= pack('n', $entrySelector); // entrySelector - $font .= pack('n', $rangeShift); // rangeShift - $offset = ($numTables * 16); - foreach ($table as $tag => $data) { - $font .= $tag; // tag - $font .= pack('N', $data['checkSum']); // checkSum - $font .= pack('N', ($data['offset'] + $offset)); // offset - $font .= pack('N', $data['length']); // length - } - foreach ($table as $data) { - $font .= $data['data']; - } - // set checkSumAdjustment on head table - $checkSumAdjustment = 0xB1B0AFBA - $this->_getTTFtableChecksum($font, strlen($font)); - $font = substr($font, 0, $table['head']['offset'] + 8).pack('N', $checkSumAdjustment).substr($font, $table['head']['offset'] + 12); - return $font; - } - - /** - * Returs the checksum of a TTF table. - * @param string $table table to check - * @param int $length lenght of table in bytes - * @return int checksum - * @author Nicola Asuni - * @access protected - * @since 5.2.000 (2010-06-02) - */ - protected function _getTTFtableChecksum($table, $length) { - $sum = 0; - $tlen = ($length / 4); - $offset = 0; - for ($i = 0; $i < $tlen; ++$i) { - $v = unpack('Ni', substr($table, $offset, 4)); - $sum += $v['i']; - $offset += 4; - } - $sum = unpack('Ni', pack('N', $sum)); - return $sum['i']; - } - - /** - * Outputs font widths - * @param array $font font data - * @param int $cidoffset offset for CID values - * @return PDF command string for font widths - * @author Nicola Asuni - * @access protected - * @since 4.4.000 (2008-12-07) - */ - protected function _putfontwidths($font, $cidoffset=0) { - ksort($font['cw']); - $rangeid = 0; - $range = array(); - $prevcid = -2; - $prevwidth = -1; - $interval = false; - // for each character - foreach ($font['cw'] as $cid => $width) { - $cid -= $cidoffset; - if ($font['subset'] AND ($cid > 255) AND (!isset($font['subsetchars'][$cid]))) { - // ignore the unused characters (font subsetting) - continue; - } - if ($width != $font['dw']) { - if ($cid == ($prevcid + 1)) { - // consecutive CID - if ($width == $prevwidth) { - if ($width == $range[$rangeid][0]) { - $range[$rangeid][] = $width; - } else { - array_pop($range[$rangeid]); - // new range - $rangeid = $prevcid; - $range[$rangeid] = array(); - $range[$rangeid][] = $prevwidth; - $range[$rangeid][] = $width; - } - $interval = true; - $range[$rangeid]['interval'] = true; - } else { - if ($interval) { - // new range - $rangeid = $cid; - $range[$rangeid] = array(); - $range[$rangeid][] = $width; - } else { - $range[$rangeid][] = $width; - } - $interval = false; - } - } else { - // new range - $rangeid = $cid; - $range[$rangeid] = array(); - $range[$rangeid][] = $width; - $interval = false; - } - $prevcid = $cid; - $prevwidth = $width; - } - } - // optimize ranges - $prevk = -1; - $nextk = -1; - $prevint = false; - foreach ($range as $k => $ws) { - $cws = count($ws); - if (($k == $nextk) AND (!$prevint) AND ((!isset($ws['interval'])) OR ($cws < 4))) { - if (isset($range[$k]['interval'])) { - unset($range[$k]['interval']); - } - $range[$prevk] = array_merge($range[$prevk], $range[$k]); - unset($range[$k]); - } else { - $prevk = $k; - } - $nextk = $k + $cws; - if (isset($ws['interval'])) { - if ($cws > 3) { - $prevint = true; - } else { - $prevint = false; - } - unset($range[$k]['interval']); - --$nextk; - } else { - $prevint = false; - } - } - // output data - $w = ''; - foreach ($range as $k => $ws) { - if (count(array_count_values($ws)) == 1) { - // interval mode is more compact - $w .= ' '.$k.' '.($k + count($ws) - 1).' '.$ws[0]; - } else { - // range mode - $w .= ' '.$k.' [ '.implode(' ', $ws).' ]'; - } - } - return '/W ['.$w.' ]'; - } - - /** - * Output fonts. - * @author Nicola Asuni - * @access protected - */ - protected function _putfonts() { - $nf = $this->n; - foreach ($this->diffs as $diff) { - //Encodings - $this->_newobj(); - $this->_out('<< /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.'] >>'."\n".'endobj'); - } - $mqr = $this->get_mqr(); - $this->set_mqr(false); - foreach ($this->FontFiles as $file => $info) { - // search and get font file to embedd - $fontdir = $info['fontdir']; - $file = strtolower($file); - $fontfile = ''; - // search files on various directories - if (($fontdir !== false) AND file_exists($fontdir.$file)) { - $fontfile = $fontdir.$file; - } elseif (file_exists($this->_getfontpath().$file)) { - $fontfile = $this->_getfontpath().$file; - } elseif (file_exists($file)) { - $fontfile = $file; - } - if (!$this->empty_string($fontfile)) { - $font = file_get_contents($fontfile); - $compressed = (substr($file, -2) == '.z'); - if ((!$compressed) AND (isset($info['length2']))) { - $header = (ord($font{0}) == 128); - if ($header) { - //Strip first binary header - $font = substr($font, 6); - } - if ($header AND (ord($font{$info['length1']}) == 128)) { - //Strip second binary header - $font = substr($font, 0, $info['length1']).substr($font, ($info['length1'] + 6)); - } - } elseif ($info['subset'] AND ((!$compressed) OR ($compressed AND function_exists('gzcompress')))) { - if ($compressed) { - // uncompress font - $font = gzuncompress($font); - } - // merge subset characters - $subsetchars = array(); // used chars - foreach ($info['fontkeys'] as $fontkey) { - $fontinfo = $this->getFontBuffer($fontkey); - $subsetchars += $fontinfo['subsetchars']; - } - $font = $this->_getTrueTypeFontSubset($font, $subsetchars); - if ($compressed) { - // recompress font - $font = gzcompress($font); - } - } - $this->_newobj(); - $this->FontFiles[$file]['n'] = $this->n; - $stream = $this->_getrawstream($font); - $out = '<< /Length '.strlen($stream); - if ($compressed) { - $out .= ' /Filter /FlateDecode'; - } - $out .= ' /Length1 '.$info['length1']; - if (isset($info['length2'])) { - $out .= ' /Length2 '.$info['length2'].' /Length3 0'; - } - $out .= ' >>'; - $out .= ' stream'."\n".$stream."\n".'endstream'; - $out .= "\n".'endobj'; - $this->_out($out); - } - } - $this->set_mqr($mqr); - foreach ($this->fontkeys as $k) { - //Font objects - $font = $this->getFontBuffer($k); - $type = $font['type']; - $name = $font['name']; - if ($type == 'core') { - // standard core font - $out = $this->_getobj($this->font_obj_ids[$k])."\n"; - $out .= '<annotation_fonts[$k] = $font['i']; - } - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } elseif (($type == 'Type1') OR ($type == 'TrueType')) { - // additional Type1 or TrueType font - $out = $this->_getobj($this->font_obj_ids[$k])."\n"; - $out .= '<n + 1).' 0 R'; - $out .= ' /FontDescriptor '.($this->n + 2).' 0 R'; - if ($font['enc']) { - if (isset($font['diff'])) { - $out .= ' /Encoding '.($nf + $font['diff']).' 0 R'; - } else { - $out .= ' /Encoding /WinAnsiEncoding'; - } - } - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - // Widths - $this->_newobj(); - $cw = &$font['cw']; - $s = '['; - for ($i = 32; $i < 256; ++$i) { - $s .= $cw[$i].' '; - } - $s .= ']'; - $s .= "\n".'endobj'; - $this->_out($s); - //Descriptor - $this->_newobj(); - $s = '< $fdv) { - if(is_float($fdv)) { - $fdv = sprintf('%.3F', $fdv); - } - $s .= ' /'.$fdk.' '.$fdv.''; - } - if (!$this->empty_string($font['file'])) { - $s .= ' /FontFile'.($type == 'Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R'; - } - $s .= '>>'; - $s .= "\n".'endobj'; - $this->_out($s); - } else { - // additional types - $mtd = '_put'.strtolower($type); - if (!method_exists($this, $mtd)) { - $this->Error('Unsupported font type: '.$type); - } - $this->$mtd($font); - } - } - } - - /** - * Adds unicode fonts.
    - * Based on PDF Reference 1.3 (section 5) - * @param array $font font data - * @access protected - * @author Nicola Asuni - * @since 1.52.0.TC005 (2005-01-05) - */ - protected function _puttruetypeunicode($font) { - $fontname = ''; - if ($font['subset']) { - // change name for font subsetting - $subtag = sprintf('%06u', $font['i']); - $subtag = strtr($subtag, '0123456789', 'ABCDEFGHIJ'); - $fontname .= $subtag.'+'; - } - $fontname .= $font['name']; - // Type0 Font - // A composite font composed of other fonts, organized hierarchically - $out = $this->_getobj($this->font_obj_ids[$font['fontkey']])."\n"; - $out .= '<< /Type /Font'; - $out .= ' /Subtype /Type0'; - $out .= ' /BaseFont /'.$fontname; - $out .= ' /Name /F'.$font['i']; - $out .= ' /Encoding /'.$font['enc']; - $out .= ' /ToUnicode '.($this->n + 1).' 0 R'; - $out .= ' /DescendantFonts ['.($this->n + 2).' 0 R]'; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - // ToUnicode map for Identity-H - $stream = "/CIDInit /ProcSet findresource begin\n"; - $stream .= "12 dict begin\n"; - $stream .= "begincmap\n"; - $stream .= "/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\n"; - $stream .= "/CMapName /Adobe-Identity-UCS def\n"; - $stream .= "/CMapType 2 def\n"; - $stream .= "/WMode 0 def\n"; - $stream .= "1 begincodespacerange\n"; - $stream .= "<0000> \n"; - $stream .= "endcodespacerange\n"; - $stream .= "100 beginbfrange\n"; - $stream .= "<0000> <00ff> <0000>\n"; - $stream .= "<0100> <01ff> <0100>\n"; - $stream .= "<0200> <02ff> <0200>\n"; - $stream .= "<0300> <03ff> <0300>\n"; - $stream .= "<0400> <04ff> <0400>\n"; - $stream .= "<0500> <05ff> <0500>\n"; - $stream .= "<0600> <06ff> <0600>\n"; - $stream .= "<0700> <07ff> <0700>\n"; - $stream .= "<0800> <08ff> <0800>\n"; - $stream .= "<0900> <09ff> <0900>\n"; - $stream .= "<0a00> <0aff> <0a00>\n"; - $stream .= "<0b00> <0bff> <0b00>\n"; - $stream .= "<0c00> <0cff> <0c00>\n"; - $stream .= "<0d00> <0dff> <0d00>\n"; - $stream .= "<0e00> <0eff> <0e00>\n"; - $stream .= "<0f00> <0fff> <0f00>\n"; - $stream .= "<1000> <10ff> <1000>\n"; - $stream .= "<1100> <11ff> <1100>\n"; - $stream .= "<1200> <12ff> <1200>\n"; - $stream .= "<1300> <13ff> <1300>\n"; - $stream .= "<1400> <14ff> <1400>\n"; - $stream .= "<1500> <15ff> <1500>\n"; - $stream .= "<1600> <16ff> <1600>\n"; - $stream .= "<1700> <17ff> <1700>\n"; - $stream .= "<1800> <18ff> <1800>\n"; - $stream .= "<1900> <19ff> <1900>\n"; - $stream .= "<1a00> <1aff> <1a00>\n"; - $stream .= "<1b00> <1bff> <1b00>\n"; - $stream .= "<1c00> <1cff> <1c00>\n"; - $stream .= "<1d00> <1dff> <1d00>\n"; - $stream .= "<1e00> <1eff> <1e00>\n"; - $stream .= "<1f00> <1fff> <1f00>\n"; - $stream .= "<2000> <20ff> <2000>\n"; - $stream .= "<2100> <21ff> <2100>\n"; - $stream .= "<2200> <22ff> <2200>\n"; - $stream .= "<2300> <23ff> <2300>\n"; - $stream .= "<2400> <24ff> <2400>\n"; - $stream .= "<2500> <25ff> <2500>\n"; - $stream .= "<2600> <26ff> <2600>\n"; - $stream .= "<2700> <27ff> <2700>\n"; - $stream .= "<2800> <28ff> <2800>\n"; - $stream .= "<2900> <29ff> <2900>\n"; - $stream .= "<2a00> <2aff> <2a00>\n"; - $stream .= "<2b00> <2bff> <2b00>\n"; - $stream .= "<2c00> <2cff> <2c00>\n"; - $stream .= "<2d00> <2dff> <2d00>\n"; - $stream .= "<2e00> <2eff> <2e00>\n"; - $stream .= "<2f00> <2fff> <2f00>\n"; - $stream .= "<3000> <30ff> <3000>\n"; - $stream .= "<3100> <31ff> <3100>\n"; - $stream .= "<3200> <32ff> <3200>\n"; - $stream .= "<3300> <33ff> <3300>\n"; - $stream .= "<3400> <34ff> <3400>\n"; - $stream .= "<3500> <35ff> <3500>\n"; - $stream .= "<3600> <36ff> <3600>\n"; - $stream .= "<3700> <37ff> <3700>\n"; - $stream .= "<3800> <38ff> <3800>\n"; - $stream .= "<3900> <39ff> <3900>\n"; - $stream .= "<3a00> <3aff> <3a00>\n"; - $stream .= "<3b00> <3bff> <3b00>\n"; - $stream .= "<3c00> <3cff> <3c00>\n"; - $stream .= "<3d00> <3dff> <3d00>\n"; - $stream .= "<3e00> <3eff> <3e00>\n"; - $stream .= "<3f00> <3fff> <3f00>\n"; - $stream .= "<4000> <40ff> <4000>\n"; - $stream .= "<4100> <41ff> <4100>\n"; - $stream .= "<4200> <42ff> <4200>\n"; - $stream .= "<4300> <43ff> <4300>\n"; - $stream .= "<4400> <44ff> <4400>\n"; - $stream .= "<4500> <45ff> <4500>\n"; - $stream .= "<4600> <46ff> <4600>\n"; - $stream .= "<4700> <47ff> <4700>\n"; - $stream .= "<4800> <48ff> <4800>\n"; - $stream .= "<4900> <49ff> <4900>\n"; - $stream .= "<4a00> <4aff> <4a00>\n"; - $stream .= "<4b00> <4bff> <4b00>\n"; - $stream .= "<4c00> <4cff> <4c00>\n"; - $stream .= "<4d00> <4dff> <4d00>\n"; - $stream .= "<4e00> <4eff> <4e00>\n"; - $stream .= "<4f00> <4fff> <4f00>\n"; - $stream .= "<5000> <50ff> <5000>\n"; - $stream .= "<5100> <51ff> <5100>\n"; - $stream .= "<5200> <52ff> <5200>\n"; - $stream .= "<5300> <53ff> <5300>\n"; - $stream .= "<5400> <54ff> <5400>\n"; - $stream .= "<5500> <55ff> <5500>\n"; - $stream .= "<5600> <56ff> <5600>\n"; - $stream .= "<5700> <57ff> <5700>\n"; - $stream .= "<5800> <58ff> <5800>\n"; - $stream .= "<5900> <59ff> <5900>\n"; - $stream .= "<5a00> <5aff> <5a00>\n"; - $stream .= "<5b00> <5bff> <5b00>\n"; - $stream .= "<5c00> <5cff> <5c00>\n"; - $stream .= "<5d00> <5dff> <5d00>\n"; - $stream .= "<5e00> <5eff> <5e00>\n"; - $stream .= "<5f00> <5fff> <5f00>\n"; - $stream .= "<6000> <60ff> <6000>\n"; - $stream .= "<6100> <61ff> <6100>\n"; - $stream .= "<6200> <62ff> <6200>\n"; - $stream .= "<6300> <63ff> <6300>\n"; - $stream .= "endbfrange\n"; - $stream .= "100 beginbfrange\n"; - $stream .= "<6400> <64ff> <6400>\n"; - $stream .= "<6500> <65ff> <6500>\n"; - $stream .= "<6600> <66ff> <6600>\n"; - $stream .= "<6700> <67ff> <6700>\n"; - $stream .= "<6800> <68ff> <6800>\n"; - $stream .= "<6900> <69ff> <6900>\n"; - $stream .= "<6a00> <6aff> <6a00>\n"; - $stream .= "<6b00> <6bff> <6b00>\n"; - $stream .= "<6c00> <6cff> <6c00>\n"; - $stream .= "<6d00> <6dff> <6d00>\n"; - $stream .= "<6e00> <6eff> <6e00>\n"; - $stream .= "<6f00> <6fff> <6f00>\n"; - $stream .= "<7000> <70ff> <7000>\n"; - $stream .= "<7100> <71ff> <7100>\n"; - $stream .= "<7200> <72ff> <7200>\n"; - $stream .= "<7300> <73ff> <7300>\n"; - $stream .= "<7400> <74ff> <7400>\n"; - $stream .= "<7500> <75ff> <7500>\n"; - $stream .= "<7600> <76ff> <7600>\n"; - $stream .= "<7700> <77ff> <7700>\n"; - $stream .= "<7800> <78ff> <7800>\n"; - $stream .= "<7900> <79ff> <7900>\n"; - $stream .= "<7a00> <7aff> <7a00>\n"; - $stream .= "<7b00> <7bff> <7b00>\n"; - $stream .= "<7c00> <7cff> <7c00>\n"; - $stream .= "<7d00> <7dff> <7d00>\n"; - $stream .= "<7e00> <7eff> <7e00>\n"; - $stream .= "<7f00> <7fff> <7f00>\n"; - $stream .= "<8000> <80ff> <8000>\n"; - $stream .= "<8100> <81ff> <8100>\n"; - $stream .= "<8200> <82ff> <8200>\n"; - $stream .= "<8300> <83ff> <8300>\n"; - $stream .= "<8400> <84ff> <8400>\n"; - $stream .= "<8500> <85ff> <8500>\n"; - $stream .= "<8600> <86ff> <8600>\n"; - $stream .= "<8700> <87ff> <8700>\n"; - $stream .= "<8800> <88ff> <8800>\n"; - $stream .= "<8900> <89ff> <8900>\n"; - $stream .= "<8a00> <8aff> <8a00>\n"; - $stream .= "<8b00> <8bff> <8b00>\n"; - $stream .= "<8c00> <8cff> <8c00>\n"; - $stream .= "<8d00> <8dff> <8d00>\n"; - $stream .= "<8e00> <8eff> <8e00>\n"; - $stream .= "<8f00> <8fff> <8f00>\n"; - $stream .= "<9000> <90ff> <9000>\n"; - $stream .= "<9100> <91ff> <9100>\n"; - $stream .= "<9200> <92ff> <9200>\n"; - $stream .= "<9300> <93ff> <9300>\n"; - $stream .= "<9400> <94ff> <9400>\n"; - $stream .= "<9500> <95ff> <9500>\n"; - $stream .= "<9600> <96ff> <9600>\n"; - $stream .= "<9700> <97ff> <9700>\n"; - $stream .= "<9800> <98ff> <9800>\n"; - $stream .= "<9900> <99ff> <9900>\n"; - $stream .= "<9a00> <9aff> <9a00>\n"; - $stream .= "<9b00> <9bff> <9b00>\n"; - $stream .= "<9c00> <9cff> <9c00>\n"; - $stream .= "<9d00> <9dff> <9d00>\n"; - $stream .= "<9e00> <9eff> <9e00>\n"; - $stream .= "<9f00> <9fff> <9f00>\n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= "endbfrange\n"; - $stream .= "56 beginbfrange\n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= " \n"; - $stream .= "endbfrange\n"; - $stream .= "endcmap\n"; - $stream .= "CMapName currentdict /CMap defineresource pop\n"; - $stream .= "end\n"; - $stream .= "end"; - // ToUnicode Object - $this->_newobj(); - $stream = ($this->compress) ? gzcompress($stream) : $stream; - $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; - $stream = $this->_getrawstream($stream); - $this->_out('<<'.$filter.'/Length '.strlen($stream).'>> stream'."\n".$stream."\n".'endstream'."\n".'endobj'); - // CIDFontType2 - // A CIDFont whose glyph descriptions are based on TrueType font technology - $oid = $this->_newobj(); - $out = '<< /Type /Font'; - $out .= ' /Subtype /CIDFontType2'; - $out .= ' /BaseFont /'.$fontname; - // A dictionary containing entries that define the character collection of the CIDFont. - $cidinfo = '/Registry '.$this->_datastring($font['cidinfo']['Registry'], $oid); - $cidinfo .= ' /Ordering '.$this->_datastring($font['cidinfo']['Ordering'], $oid); - $cidinfo .= ' /Supplement '.$font['cidinfo']['Supplement']; - $out .= ' /CIDSystemInfo << '.$cidinfo.' >>'; - $out .= ' /FontDescriptor '.($this->n + 1).' 0 R'; - $out .= ' /DW '.$font['dw']; // default width - $out .= "\n".$this->_putfontwidths($font, 0); - if (isset($font['ctg']) AND (!$this->empty_string($font['ctg']))) { - $out .= "\n".'/CIDToGIDMap '.($this->n + 2).' 0 R'; - } - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - // Font descriptor - // A font descriptor describing the CIDFont default metrics other than its glyph widths - $this->_newobj(); - $out = '<< /Type /FontDescriptor'; - $out .= ' /FontName /'.$fontname; - foreach ($font['desc'] as $key => $value) { - if(is_float($value)) { - $value = sprintf('%.3F', $value); - } - $out .= ' /'.$key.' '.$value; - } - $fontdir = false; - if (!$this->empty_string($font['file'])) { - // A stream containing a TrueType font - $out .= ' /FontFile2 '.$this->FontFiles[$font['file']]['n'].' 0 R'; - $fontdir = $this->FontFiles[$font['file']]['fontdir']; - } - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - if (isset($font['ctg']) AND (!$this->empty_string($font['ctg']))) { - $this->_newobj(); - // Embed CIDToGIDMap - // A specification of the mapping from CIDs to glyph indices - // search and get CTG font file to embedd - $ctgfile = strtolower($font['ctg']); - // search and get ctg font file to embedd - $fontfile = ''; - // search files on various directories - if (($fontdir !== false) AND file_exists($fontdir.$ctgfile)) { - $fontfile = $fontdir.$ctgfile; - } elseif (file_exists($this->_getfontpath().$ctgfile)) { - $fontfile = $this->_getfontpath().$ctgfile; - } elseif (file_exists($ctgfile)) { - $fontfile = $ctgfile; - } - if ($this->empty_string($fontfile)) { - $this->Error('Font file not found: '.$ctgfile); - } - $stream = $this->_getrawstream(file_get_contents($fontfile)); - $out = '<< /Length '.strlen($stream).''; - if (substr($fontfile, -2) == '.z') { // check file extension - // Decompresses data encoded using the public-domain - // zlib/deflate compression method, reproducing the - // original text or binary data - $out .= ' /Filter /FlateDecode'; - } - $out .= ' >>'; - $out .= ' stream'."\n".$stream."\n".'endstream'; - $out .= "\n".'endobj'; - $this->_out($out); - } - } - - /** - * Output CID-0 fonts. - * A Type 0 CIDFont contains glyph descriptions based on the Adobe Type 1 font format - * @param array $font font data - * @access protected - * @author Andrew Whitehead, Nicola Asuni, Yukihiro Nakadaira - * @since 3.2.000 (2008-06-23) - */ - protected function _putcidfont0($font) { - $cidoffset = 0; - if (!isset($font['cw'][1])) { - $cidoffset = 31; - } - if (isset($font['cidinfo']['uni2cid'])) { - // convert unicode to cid. - $uni2cid = $font['cidinfo']['uni2cid']; - $cw = array(); - foreach ($font['cw'] as $uni => $width) { - if (isset($uni2cid[$uni])) { - $cw[($uni2cid[$uni] + $cidoffset)] = $width; - } elseif ($uni < 256) { - $cw[$uni] = $width; - } // else unknown character - } - $font = array_merge($font, array('cw' => $cw)); - } - $name = $font['name']; - $enc = $font['enc']; - if ($enc) { - $longname = $name.'-'.$enc; - } else { - $longname = $name; - } - $out = $this->_getobj($this->font_obj_ids[$font['fontkey']])."\n"; - $out .= '<n + 1).' 0 R]'; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - $oid = $this->_newobj(); - $out = '<_datastring($font['cidinfo']['Registry'], $oid); - $cidinfo .= ' /Ordering '.$this->_datastring($font['cidinfo']['Ordering'], $oid); - $cidinfo .= ' /Supplement '.$font['cidinfo']['Supplement']; - $out .= ' /CIDSystemInfo <<'.$cidinfo.'>>'; - $out .= ' /FontDescriptor '.($this->n + 1).' 0 R'; - $out .= ' /DW '.$font['dw']; - $out .= "\n".$this->_putfontwidths($font, $cidoffset); - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - $this->_newobj(); - $s = '< $v) { - if ($k != 'Style') { - if(is_float($v)) { - $v = sprintf('%.3F', $v); - } - $s .= ' /'.$k.' '.$v.''; - } - } - $s .= '>>'; - $s .= "\n".'endobj'; - $this->_out($s); - } - - /** - * Output images. - * @access protected - */ - protected function _putimages() { - $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; - foreach ($this->imagekeys as $file) { - $info = $this->getImageBuffer($file); - $oid = $this->_newobj(); - $this->xobjects['I'.$info['i']] = array('n' => $oid); - $this->setImageSubBuffer($file, 'n', $this->n); - $out = '<n - 1).' 0 R'; - } - if ($info['cs'] == 'Indexed') { - $out .= ' /ColorSpace [/Indexed /DeviceRGB '.((strlen($info['pal']) / 3) - 1).' '.($this->n + 1).' 0 R]'; - } else { - $out .= ' /ColorSpace /'.$info['cs']; - if ($info['cs'] == 'DeviceCMYK') { - $out .= ' /Decode [1 0 1 0 1 0 1 0]'; - } - } - $out .= ' /BitsPerComponent '.$info['bpc']; - if (isset($info['f'])) { - $out .= ' /Filter /'.$info['f']; - } - if (isset($info['parms'])) { - $out .= ' '.$info['parms']; - } - if (isset($info['trns']) AND is_array($info['trns'])) { - $trns=''; - $count_info = count($info['trns']); - for ($i=0; $i < $count_info; ++$i) { - $trns .= $info['trns'][$i].' '.$info['trns'][$i].' '; - } - $out .= ' /Mask ['.$trns.']'; - } - $stream = $this->_getrawstream($info['data']); - $out .= ' /Length '.strlen($stream).' >>'; - $out .= ' stream'."\n".$stream."\n".'endstream'; - $out .= "\n".'endobj'; - $this->_out($out); - //Palette - if ($info['cs'] == 'Indexed') { - $this->_newobj(); - $pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal']; - $pal = $this->_getrawstream($pal); - $this->_out('<<'.$filter.'/Length '.strlen($pal).'>> stream'."\n".$pal."\n".'endstream'."\n".'endobj'); - } - } - } - - /** - * Output Form XObjects Templates. - * @author Nicola Asuni - * @since 5.8.017 (2010-08-24) - * @access protected - * @see startTemplate(), endTemplate(), printTemplate() - */ - protected function _putxobjects() { - foreach ($this->xobjects as $key => $data) { - if (isset($data['outdata'])) { - $stream = trim($data['outdata']); - $out = $this->_getobj($data['n'])."\n"; - $out .= '<<'; - $out .= ' /Type /XObject'; - $out .= ' /Subtype /Form'; - $out .= ' /FormType 1'; - if ($this->compress) { - $stream = gzcompress($stream); - $out .= ' /Filter /FlateDecode'; - } - $out .= sprintf(' /BBox [%.2F %.2F %.2F %.2F]', ($data['x'] * $this->k), (-$data['y'] * $this->k), (($data['w'] + $data['x']) * $this->k), (($data['h'] - $data['y']) * $this->k)); - $out .= ' /Matrix [1 0 0 1 0 0]'; - $out .= ' /Resources <<'; - $out .= ' /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'; - // fonts - if (!empty($data['fonts'])) { - $out .= ' /Font <<'; - foreach ($data['fonts'] as $fontkey => $fontid) { - $out .= ' /F'.$fontid.' '.$this->font_obj_ids[$fontkey].' 0 R'; - } - $out .= ' >>'; - } - // images or nested xobjects - if (!empty($data['images']) OR !empty($data['xobjects'])) { - $out .= ' /XObject <<'; - foreach ($data['images'] as $imgid) { - $out .= ' /I'.$imgid.' '.$this->xobjects['I'.$imgid]['n'].' 0 R'; - } - foreach ($data['xobjects'] as $sub_id => $sub_objid) { - $out .= ' /'.$sub_id.' '.$sub_objid['n'].' 0 R'; - } - $out .= ' >>'; - } - $out .= ' >>'; - $stream = $this->_getrawstream($stream); - $out .= ' /Length '.strlen($stream); - $out .= ' >>'; - $out .= ' stream'."\n".$stream."\n".'endstream'; - $out .= "\n".'endobj'; - $this->_out($out); - } - } - } - - /** - * Output Spot Colors Resources. - * @access protected - * @since 4.0.024 (2008-09-12) - */ - protected function _putspotcolors() { - foreach ($this->spot_colors as $name => $color) { - $this->_newobj(); - $this->spot_colors[$name]['n'] = $this->n; - $out = '[/Separation /'.str_replace(' ', '#20', $name); - $out .= ' /DeviceCMYK <<'; - $out .= ' /Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0]'; - $out .= ' '.sprintf('/C1 [%.4F %.4F %.4F %.4F] ', $color['c']/100, $color['m']/100, $color['y']/100, $color['k']/100); - $out .= ' /FunctionType 2 /Domain [0 1] /N 1>>]'; - $out .= "\n".'endobj'; - $this->_out($out); - } - } - - /** - * Return XObjects Dictionary. - * @return string XObjects dictionary - * @access protected - * @since 5.8.014 (2010-08-23) - */ - protected function _getxobjectdict() { - $out = ''; - foreach ($this->xobjects as $id => $objid) { - $out .= ' /'.$id.' '.$objid['n'].' 0 R'; - } - return $out; - } - - /** - * Output Resources Dictionary. - * @access protected - */ - protected function _putresourcedict() { - $out = $this->_getobj(2)."\n"; - $out .= '<< /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'; - $out .= ' /Font <<'; - foreach ($this->fontkeys as $fontkey) { - $font = $this->getFontBuffer($fontkey); - $out .= ' /F'.$font['i'].' '.$font['n'].' 0 R'; - } - $out .= ' >>'; - $out .= ' /XObject <<'; - $out .= $this->_getxobjectdict(); - $out .= ' >>'; - // visibility - $out .= ' /Properties <n_ocg_print.' 0 R /OC2 '.$this->n_ocg_view.' 0 R>>'; - // transparency - $out .= ' /ExtGState <<'; - foreach ($this->extgstates as $k => $extgstate) { - if (isset($extgstate['name'])) { - $out .= ' /'.$extgstate['name']; - } else { - $out .= ' /GS'.$k; - } - $out .= ' '.$extgstate['n'].' 0 R'; - } - $out .= ' >>'; - // gradient patterns - if (isset($this->gradients) AND (count($this->gradients) > 0)) { - $out .= ' /Pattern <<'; - foreach ($this->gradients as $id => $grad) { - $out .= ' /p'.$id.' '.$grad['pattern'].' 0 R'; - } - $out .= ' >>'; - } - // gradient shadings - if (isset($this->gradients) AND (count($this->gradients) > 0)) { - $out .= ' /Shading <<'; - foreach ($this->gradients as $id => $grad) { - $out .= ' /Sh'.$id.' '.$grad['id'].' 0 R'; - } - $out .= ' >>'; - } - // spot colors - if (isset($this->spot_colors) AND (count($this->spot_colors) > 0)) { - $out .= ' /ColorSpace <<'; - foreach ($this->spot_colors as $color) { - $out .= ' /CS'.$color['i'].' '.$color['n'].' 0 R'; - } - $out .= ' >>'; - } - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - - /** - * Output Resources. - * @access protected - */ - protected function _putresources() { - $this->_putextgstates(); - $this->_putocg(); - $this->_putfonts(); - $this->_putimages(); - $this->_putxobjects(); - $this->_putspotcolors(); - $this->_putshaders(); - $this->_putresourcedict(); - $this->_putbookmarks(); - $this->_putEmbeddedFiles(); - $this->_putannotsobjs(); - $this->_putjavascript(); - $this->_putencryption(); - } - - /** - * Adds some Metadata information (Document Information Dictionary) - * (see Chapter 14.3.3 Document Information Dictionary of PDF32000_2008.pdf Reference) - * @return int object id - * @access protected - */ - protected function _putinfo() { - $oid = $this->_newobj(); - $out = '<<'; - if (!$this->empty_string($this->title)) { - // The document's title. - $out .= ' /Title '.$this->_textstring($this->title, $oid); - } - if (!$this->empty_string($this->author)) { - // The name of the person who created the document. - $out .= ' /Author '.$this->_textstring($this->author, $oid); - } - if (!$this->empty_string($this->subject)) { - // The subject of the document. - $out .= ' /Subject '.$this->_textstring($this->subject, $oid); - } - if (!$this->empty_string($this->keywords)) { - // Keywords associated with the document. - $out .= ' /Keywords '.$this->_textstring($this->keywords.' TCP'.'DF', $oid); - } - if (!$this->empty_string($this->creator)) { - // If the document was converted to PDF from another format, the name of the conforming product that created the original document from which it was converted. - $out .= ' /Creator '.$this->_textstring($this->creator, $oid); - } - if (defined('PDF_PRODUCER')) { - // If the document was converted to PDF from another format, the name of the conforming product that converted it to PDF. - $out .= ' /Producer '.$this->_textstring(PDF_PRODUCER.' (TCP'.'DF)', $oid); - } else { - // default producer - $out .= ' /Producer '.$this->_textstring('TCP'.'DF', $oid); - } - // The date and time the document was created, in human-readable form - $out .= ' /CreationDate '.$this->_datestring(); - // The date and time the document was most recently modified, in human-readable form - $out .= ' /ModDate '.$this->_datestring(); - // A name object indicating whether the document has been modified to include trapping information - $out .= ' /Trapped /False'; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - return $oid; - } - - /** - * Output Catalog. - * @return int object id - * @access protected - */ - protected function _putcatalog() { - $oid = $this->_newobj(); - $out = '<< /Type /Catalog'; - $out .= ' /Pages 1 0 R'; - if ($this->ZoomMode == 'fullpage') { - $out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /Fit]'; - } elseif ($this->ZoomMode == 'fullwidth') { - $out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /FitH null]'; - } elseif ($this->ZoomMode == 'real') { - $out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null 1]'; - } elseif (!is_string($this->ZoomMode)) { - $out .= sprintf(' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null %.2F]',($this->ZoomMode / 100)); - } - if (isset($this->LayoutMode) AND (!$this->empty_string($this->LayoutMode))) { - $out .= ' /PageLayout /'.$this->LayoutMode; - } - if (isset($this->PageMode) AND (!$this->empty_string($this->PageMode))) { - $out .= ' /PageMode /'.$this->PageMode; - } - if (isset($this->l['a_meta_language'])) { - $out .= ' /Lang '.$this->_textstring($this->l['a_meta_language'], $oid); - } - $out .= ' /Names <<'; - if ((!empty($this->javascript)) OR (!empty($this->js_objects))) { - $out .= ' /JavaScript '.($this->n_js).' 0 R'; - } - $out .= ' >>'; - if (count($this->outlines) > 0) { - $out .= ' /Outlines '.$this->OutlineRoot.' 0 R'; - $out .= ' /PageMode /UseOutlines'; - } - $out .= ' '.$this->_putviewerpreferences(); - $p = $this->n_ocg_print.' 0 R'; - $v = $this->n_ocg_view.' 0 R'; - $as = '<< /Event /Print /OCGs ['.$p.' '.$v.'] /Category [/Print] >> << /Event /View /OCGs ['.$p.' '.$v.'] /Category [/View] >>'; - $out .= ' /OCProperties << /OCGs ['.$p.' '.$v.'] /D << /ON ['.$p.'] /OFF ['.$v.'] /AS ['.$as.'] >> >>'; - // AcroForm - if (!empty($this->form_obj_id) OR ($this->sign AND isset($this->signature_data['cert_type']))) { - $out .= ' /AcroForm <<'; - $objrefs = ''; - if ($this->sign AND isset($this->signature_data['cert_type'])) { - $objrefs .= $this->sig_obj_id.' 0 R'; - } - if (!empty($this->form_obj_id)) { - foreach($this->form_obj_id as $objid) { - $objrefs .= ' '.$objid.' 0 R'; - } - } - $out .= ' /Fields ['.$objrefs.']'; - if (!empty($this->form_obj_id) AND !$this->sign) { - // It's better to turn off this value and set the appearance stream for each annotation (/AP) to avoid conflicts with signature fields. - $out .= ' /NeedAppearances true'; - } - if ($this->sign AND isset($this->signature_data['cert_type'])) { - if ($this->signature_data['cert_type'] > 0) { - $out .= ' /SigFlags 3'; - } else { - $out .= ' /SigFlags 1'; - } - } - //$out .= ' /CO '; - if (isset($this->annotation_fonts) AND !empty($this->annotation_fonts)) { - $out .= ' /DR <<'; - $out .= ' /Font <<'; - foreach ($this->annotation_fonts as $fontkey => $fontid) { - $out .= ' /F'.$fontid.' '.$this->font_obj_ids[$fontkey].' 0 R'; - } - $out .= ' >> >>'; - } - $font = $this->getFontBuffer('helvetica'); - $out .= ' /DA (/F'.$font['i'].' 0 Tf 0 g)'; - $out .= ' /Q '.(($this->rtl)?'2':'0'); - //$out .= ' /XFA '; - $out .= ' >>'; - // signatures - if ($this->sign AND isset($this->signature_data['cert_type'])) { - if ($this->signature_data['cert_type'] > 0) { - $out .= ' /Perms << /DocMDP '.($this->sig_obj_id + 1).' 0 R >>'; - } else { - $out .= ' /Perms << /UR3 '.($this->sig_obj_id + 1).' 0 R >>'; - } - } - } - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - return $oid; - } - - /** - * Output viewer preferences. - * @return string for viewer preferences - * @author Nicola asuni - * @since 3.1.000 (2008-06-09) - * @access protected - */ - protected function _putviewerpreferences() { - $out = '/ViewerPreferences <<'; - if ($this->rtl) { - $out .= ' /Direction /R2L'; - } else { - $out .= ' /Direction /L2R'; - } - if (isset($this->viewer_preferences['HideToolbar']) AND ($this->viewer_preferences['HideToolbar'])) { - $out .= ' /HideToolbar true'; - } - if (isset($this->viewer_preferences['HideMenubar']) AND ($this->viewer_preferences['HideMenubar'])) { - $out .= ' /HideMenubar true'; - } - if (isset($this->viewer_preferences['HideWindowUI']) AND ($this->viewer_preferences['HideWindowUI'])) { - $out .= ' /HideWindowUI true'; - } - if (isset($this->viewer_preferences['FitWindow']) AND ($this->viewer_preferences['FitWindow'])) { - $out .= ' /FitWindow true'; - } - if (isset($this->viewer_preferences['CenterWindow']) AND ($this->viewer_preferences['CenterWindow'])) { - $out .= ' /CenterWindow true'; - } - if (isset($this->viewer_preferences['DisplayDocTitle']) AND ($this->viewer_preferences['DisplayDocTitle'])) { - $out .= ' /DisplayDocTitle true'; - } - if (isset($this->viewer_preferences['NonFullScreenPageMode'])) { - $out .= ' /NonFullScreenPageMode /'.$this->viewer_preferences['NonFullScreenPageMode']; - } - if (isset($this->viewer_preferences['ViewArea'])) { - $out .= ' /ViewArea /'.$this->viewer_preferences['ViewArea']; - } - if (isset($this->viewer_preferences['ViewClip'])) { - $out .= ' /ViewClip /'.$this->viewer_preferences['ViewClip']; - } - if (isset($this->viewer_preferences['PrintArea'])) { - $out .= ' /PrintArea /'.$this->viewer_preferences['PrintArea']; - } - if (isset($this->viewer_preferences['PrintClip'])) { - $out .= ' /PrintClip /'.$this->viewer_preferences['PrintClip']; - } - if (isset($this->viewer_preferences['PrintScaling'])) { - $out .= ' /PrintScaling /'.$this->viewer_preferences['PrintScaling']; - } - if (isset($this->viewer_preferences['Duplex']) AND (!$this->empty_string($this->viewer_preferences['Duplex']))) { - $out .= ' /Duplex /'.$this->viewer_preferences['Duplex']; - } - if (isset($this->viewer_preferences['PickTrayByPDFSize'])) { - if ($this->viewer_preferences['PickTrayByPDFSize']) { - $out .= ' /PickTrayByPDFSize true'; - } else { - $out .= ' /PickTrayByPDFSize false'; - } - } - if (isset($this->viewer_preferences['PrintPageRange'])) { - $PrintPageRangeNum = ''; - foreach ($this->viewer_preferences['PrintPageRange'] as $k => $v) { - $PrintPageRangeNum .= ' '.($v - 1).''; - } - $out .= ' /PrintPageRange ['.substr($PrintPageRangeNum,1).']'; - } - if (isset($this->viewer_preferences['NumCopies'])) { - $out .= ' /NumCopies '.intval($this->viewer_preferences['NumCopies']); - } - $out .= ' >>'; - return $out; - } - - /** - * Output PDF header. - * @access protected - */ - protected function _putheader() { - $this->_out('%PDF-'.$this->PDFVersion); - } - - /** - * Output end of document (EOF). - * @access protected - */ - protected function _enddoc() { - $this->state = 1; - $this->_putheader(); - $this->_putpages(); - $this->_putresources(); - // Signature - if ($this->sign AND isset($this->signature_data['cert_type'])) { - // widget annotation for signature - $out = $this->_getobj($this->sig_obj_id)."\n"; - $out .= '<< /Type /Annot'; - $out .= ' /Subtype /Widget'; - $out .= ' /Rect ['.$this->signature_appearance['rect'].']'; - $out .= ' /P '.$this->page_obj_id[($this->signature_appearance['page'])].' 0 R'; // link to signature appearance page - $out .= ' /F 4'; - $out .= ' /FT /Sig'; - $out .= ' /T '.$this->_textstring('Signature', $this->sig_obj_id); - $out .= ' /Ff 0'; - $out .= ' /V '.($this->sig_obj_id + 1).' 0 R'; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - // signature - $this->_putsignature(); - } - // Info - $objid_info = $this->_putinfo(); - // Catalog - $objid_catalog = $this->_putcatalog(); - // Cross-ref - $o = $this->bufferlen; - // XREF section - $this->_out('xref'); - $this->_out('0 '.($this->n + 1)); - $this->_out('0000000000 65535 f '); - for ($i=1; $i <= $this->n; ++$i) { - $this->_out(sprintf('%010d 00000 n ', $this->offsets[$i])); - } - // TRAILER - $out = 'trailer <<'; - $out .= ' /Size '.($this->n + 1); - $out .= ' /Root '.$objid_catalog.' 0 R'; - $out .= ' /Info '.$objid_info.' 0 R'; - if ($this->encrypted) { - $out .= ' /Encrypt '.$this->encryptdata['objid'].' 0 R'; - } - $out .= ' /ID [ <'.$this->file_id.'> <'.$this->file_id.'> ]'; - $out .= ' >>'; - $this->_out($out); - $this->_out('startxref'); - $this->_out($o); - $this->_out('%%EOF'); - $this->state = 3; // end-of-doc - if ($this->diskcache) { - // remove temporary files used for images - foreach ($this->imagekeys as $key) { - // remove temporary files - unlink($this->images[$key]); - } - foreach ($this->fontkeys as $key) { - // remove temporary files - unlink($this->fonts[$key]); - } - } - } - - /** - * Initialize a new page. - * @param string $orientation page orientation. Possible values are (case insensitive):
    • P or PORTRAIT (default)
    • L or LANDSCAPE
    - * @param mixed $format The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat(). - * @access protected - * @see getPageSizeFromFormat(), setPageFormat() - */ - protected function _beginpage($orientation='', $format='') { - ++$this->page; - $this->setPageBuffer($this->page, ''); - // initialize array for graphics tranformation positions inside a page buffer - $this->transfmrk[$this->page] = array(); - $this->state = 2; - if ($this->empty_string($orientation)) { - if (isset($this->CurOrientation)) { - $orientation = $this->CurOrientation; - } elseif ($this->fwPt > $this->fhPt) { - // landscape - $orientation = 'L'; - } else { - // portrait - $orientation = 'P'; - } - } - if ($this->empty_string($format)) { - $this->pagedim[$this->page] = $this->pagedim[($this->page - 1)]; - $this->setPageOrientation($orientation); - } else { - $this->setPageFormat($format, $orientation); - } - if ($this->rtl) { - $this->x = $this->w - $this->rMargin; - } else { - $this->x = $this->lMargin; - } - $this->y = $this->tMargin; - if (isset($this->newpagegroup[$this->page])) { - // start a new group - $n = sizeof($this->pagegroups) + 1; - $alias = '{nb'.$n.'}'; - $this->pagegroups[$alias] = 1; - $this->currpagegroup = $alias; - } elseif ($this->currpagegroup) { - ++$this->pagegroups[$this->currpagegroup]; - } - } - - /** - * Mark end of page. - * @access protected - */ - protected function _endpage() { - $this->setVisibility('all'); - $this->state = 1; - } - - /** - * Begin a new object and return the object number. - * @return int object number - * @access protected - */ - protected function _newobj() { - $this->_out($this->_getobj()); - return $this->n; - } - - /** - * Return the starting object string for the selected object ID. - * @param int $objid Object ID (leave empty to get a new ID). - * @return string the starting object string - * @access protected - * @since 5.8.009 (2010-08-20) - */ - protected function _getobj($objid='') { - if ($objid === '') { - ++$this->n; - $objid = $this->n; - } - $this->offsets[$objid] = $this->bufferlen; - return $objid.' 0 obj'; - } - - /** - * Underline text. - * @param int $x X coordinate - * @param int $y Y coordinate - * @param string $txt text to underline - * @access protected - */ - protected function _dounderline($x, $y, $txt) { - $w = $this->GetStringWidth($txt); - return $this->_dounderlinew($x, $y, $w); - } - - /** - * Underline for rectangular text area. - * @param int $x X coordinate - * @param int $y Y coordinate - * @param int $w width to underline - * @access protected - * @since 4.8.008 (2009-09-29) - */ - protected function _dounderlinew($x, $y, $w) { - $linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt; - return sprintf('%.2F %.2F %.2F %.2F re f', $x * $this->k, ((($this->h - $y) * $this->k) + $linew), $w * $this->k, $linew); - } - - /** - * Line through text. - * @param int $x X coordinate - * @param int $y Y coordinate - * @param string $txt text to linethrough - * @access protected - */ - protected function _dolinethrough($x, $y, $txt) { - $w = $this->GetStringWidth($txt); - return $this->_dolinethroughw($x, $y, $w); - } - - /** - * Line through for rectangular text area. - * @param int $x X coordinate - * @param int $y Y coordinate - * @param string $txt text to linethrough - * @access protected - * @since 4.9.008 (2009-09-29) - */ - protected function _dolinethroughw($x, $y, $w) { - $linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt; - return sprintf('%.2F %.2F %.2F %.2F re f', $x * $this->k, ((($this->h - $y) * $this->k) + $linew + ($this->FontSizePt / 3)), $w * $this->k, $linew); - } - - /** - * Overline text. - * @param int $x X coordinate - * @param int $y Y coordinate - * @param string $txt text to overline - * @access protected - * @since 4.9.015 (2010-04-19) - */ - protected function _dooverline($x, $y, $txt) { - $w = $this->GetStringWidth($txt); - return $this->_dooverlinew($x, $y, $w); - } - - /** - * Overline for rectangular text area. - * @param int $x X coordinate - * @param int $y Y coordinate - * @param int $w width to overline - * @access protected - * @since 4.9.015 (2010-04-19) - */ - protected function _dooverlinew($x, $y, $w) { - $linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt; - return sprintf('%.2F %.2F %.2F %.2F re f', $x * $this->k, (($this->h - $y + $this->FontAscent) * $this->k) - $linew, $w * $this->k, $linew); - - } - - /** - * Read a 4-byte (32 bit) integer from file. - * @param string $f file name. - * @return 4-byte integer - * @access protected - */ - protected function _freadint($f) { - $a = unpack('Ni', fread($f, 4)); - return $a['i']; - } - - /** - * Add "\" before "\", "(" and ")" - * @param string $s string to escape. - * @return string escaped string. - * @access protected - */ - protected function _escape($s) { - // the chr(13) substitution fixes the Bugs item #1421290. - return strtr($s, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r')); - } - - /** - * Format a data string for meta information - * @param string $s data string to escape. - * @param int $n object ID - * @return string escaped string. - * @access protected - */ - protected function _datastring($s, $n=0) { - if ($n == 0) { - $n = $this->n; - } - $s = $this->_encrypt_data($n, $s); - return '('. $this->_escape($s).')'; - } - - /** - * Returns a formatted date for meta information - * @param int $n object ID - * @return string escaped date string. - * @access protected - * @since 4.6.028 (2009-08-25) - */ - protected function _datestring($n=0) { - $current_time = substr_replace(date('YmdHisO'), '\'', (0 - 2), 0).'\''; - return $this->_datastring('D:'.$current_time, $n); - } - - /** - * Format a text string for meta information - * @param string $s string to escape. - * @param int $n object ID - * @return string escaped string. - * @access protected - */ - protected function _textstring($s, $n=0) { - if ($this->isunicode) { - //Convert string to UTF-16BE - $s = $this->UTF8ToUTF16BE($s, true); - } - return $this->_datastring($s, $n); - } - - /** - * THIS METHOD IS DEPRECATED - * Format a text string - * @param string $s string to escape. - * @return string escaped string. - * @access protected - * @deprecated - */ - protected function _escapetext($s) { - if ($this->isunicode) { - if (($this->CurrentFont['type'] == 'core') OR ($this->CurrentFont['type'] == 'TrueType') OR ($this->CurrentFont['type'] == 'Type1')) { - $s = $this->UTF8ToLatin1($s); - } else { - //Convert string to UTF-16BE and reverse RTL language - $s = $this->utf8StrRev($s, false, $this->tmprtl); - } - } - return $this->_escape($s); - } - - /** - * get raw output stream. - * @param string $s string to output. - * @param int $n object reference for encryption mode - * @access protected - * @author Nicola Asuni - * @since 5.5.000 (2010-06-22) - */ - protected function _getrawstream($s, $n=0) { - if ($n <= 0) { - // default to current object - $n = $this->n; - } - return $this->_encrypt_data($n, $s); - } - - /** - * Format output stream (DEPRECATED). - * @param string $s string to output. - * @param int $n object reference for encryption mode - * @access protected - * @deprecated - */ - protected function _getstream($s, $n=0) { - return 'stream'."\n".$this->_getrawstream($s, $n)."\n".'endstream'; - } - - /** - * Output a stream (DEPRECATED). - * @param string $s string to output. - * @param int $n object reference for encryption mode - * @access protected - * @deprecated - */ - protected function _putstream($s, $n=0) { - $this->_out($this->_getstream($s, $n)); - } - - /** - * Output a string to the document. - * @param string $s string to output. - * @access protected - */ - protected function _out($s) { - if ($this->state == 2) { - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['outdata'] .= $s."\n"; - } elseif ((!$this->InFooter) AND isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) { - // puts data before page footer - $pagebuff = $this->getPageBuffer($this->page); - $page = substr($pagebuff, 0, -$this->footerlen[$this->page]); - $footer = substr($pagebuff, -$this->footerlen[$this->page]); - $this->setPageBuffer($this->page, $page.$s."\n".$footer); - // update footer position - $this->footerpos[$this->page] += strlen($s."\n"); - } else { - $this->setPageBuffer($this->page, $s."\n", true); - } - } else { - $this->setBuffer($s."\n"); - } - } - - /** - * Converts UTF-8 strings to codepoints array.
    - * Invalid byte sequences will be replaced with 0xFFFD (replacement character)
    - * Based on: http://www.faqs.org/rfcs/rfc3629.html - *
    -	 *    Char. number range  |        UTF-8 octet sequence
    -	 *       (hexadecimal)    |              (binary)
    -	 *    --------------------+-----------------------------------------------
    -	 *    0000 0000-0000 007F | 0xxxxxxx
    -	 *    0000 0080-0000 07FF | 110xxxxx 10xxxxxx
    -	 *    0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
    -	 *    0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    -	 *    ---------------------------------------------------------------------
    -	 *
    -	 *   ABFN notation:
    -	 *   ---------------------------------------------------------------------
    -	 *   UTF8-octets = *( UTF8-char )
    -	 *   UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
    -	 *   UTF8-1      = %x00-7F
    -	 *   UTF8-2      = %xC2-DF UTF8-tail
    -	 *
    -	 *   UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
    -	 *                 %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
    -	 *   UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
    -	 *                 %xF4 %x80-8F 2( UTF8-tail )
    -	 *   UTF8-tail   = %x80-BF
    -	 *   ---------------------------------------------------------------------
    -	 * 
    - * @param string $str string to process. - * @return array containing codepoints (UTF-8 characters values) - * @access protected - * @author Nicola Asuni - * @since 1.53.0.TC005 (2005-01-05) - */ - protected function UTF8StringToArray($str) { - // build a unique string key - $strkey = md5($str); - if (isset($this->cache_UTF8StringToArray[$strkey])) { - // return cached value - $chrarray = $this->cache_UTF8StringToArray[$strkey]['s']; - if (!isset($this->cache_UTF8StringToArray[$strkey]['f'][$this->CurrentFont['fontkey']])) { - if ($this->isunicode) { - foreach ($chrarray as $chr) { - // store this char for font subsetting - $this->CurrentFont['subsetchars'][$chr] = true; - } - // update font subsetchars - $this->setFontSubBuffer($this->CurrentFont['fontkey'], 'subsetchars', $this->CurrentFont['subsetchars']); - } - $this->cache_UTF8StringToArray[$strkey]['f'][$this->CurrentFont['fontkey']] = true; - } - return $chrarray; - } - // check cache size - if ($this->cache_size_UTF8StringToArray >= $this->cache_maxsize_UTF8StringToArray) { - // remove first element - array_shift($this->cache_UTF8StringToArray); - } - // new cache array for selected string - $this->cache_UTF8StringToArray[$strkey] = array('s' => array(), 'f' => array()); - ++$this->cache_size_UTF8StringToArray; - if (!$this->isunicode) { - // split string into array of equivalent codes - $strarr = array(); - $strlen = strlen($str); - for ($i=0; $i < $strlen; ++$i) { - $strarr[] = ord($str{$i}); - } - // insert new value on cache - $this->cache_UTF8StringToArray[$strkey]['s'] = $strarr; - $this->cache_UTF8StringToArray[$strkey]['f'][$this->CurrentFont['fontkey']] = true; - return $strarr; - } - $unichar = -1; // last unicode char - $unicode = array(); // array containing unicode values - $bytes = array(); // array containing single character byte sequences - $numbytes = 1; // number of octetc needed to represent the UTF-8 character - $str .= ''; // force $str to be a string - $length = strlen($str); - for ($i = 0; $i < $length; ++$i) { - $char = ord($str{$i}); // get one string character at time - if (count($bytes) == 0) { // get starting octect - if ($char <= 0x7F) { - $unichar = $char; // use the character "as is" because is ASCII - $numbytes = 1; - } elseif (($char >> 0x05) == 0x06) { // 2 bytes character (0x06 = 110 BIN) - $bytes[] = ($char - 0xC0) << 0x06; - $numbytes = 2; - } elseif (($char >> 0x04) == 0x0E) { // 3 bytes character (0x0E = 1110 BIN) - $bytes[] = ($char - 0xE0) << 0x0C; - $numbytes = 3; - } elseif (($char >> 0x03) == 0x1E) { // 4 bytes character (0x1E = 11110 BIN) - $bytes[] = ($char - 0xF0) << 0x12; - $numbytes = 4; - } else { - // use replacement character for other invalid sequences - $unichar = 0xFFFD; - $bytes = array(); - $numbytes = 1; - } - } elseif (($char >> 0x06) == 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN - $bytes[] = $char - 0x80; - if (count($bytes) == $numbytes) { - // compose UTF-8 bytes to a single unicode value - $char = $bytes[0]; - for ($j = 1; $j < $numbytes; ++$j) { - $char += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); - } - if ((($char >= 0xD800) AND ($char <= 0xDFFF)) OR ($char >= 0x10FFFF)) { - /* The definition of UTF-8 prohibits encoding character numbers between - U+D800 and U+DFFF, which are reserved for use with the UTF-16 - encoding form (as surrogate pairs) and do not directly represent - characters. */ - $unichar = 0xFFFD; // use replacement character - } else { - $unichar = $char; // add char to array - } - // reset data for next char - $bytes = array(); - $numbytes = 1; - } - } else { - // use replacement character for other invalid sequences - $unichar = 0xFFFD; - $bytes = array(); - $numbytes = 1; - } - if ($unichar >= 0) { - // insert unicode value into array - $unicode[] = $unichar; - // store this char for font subsetting - $this->CurrentFont['subsetchars'][$unichar] = true; - $unichar = -1; - } - } - // update font subsetchars - $this->setFontSubBuffer($this->CurrentFont['fontkey'], 'subsetchars', $this->CurrentFont['subsetchars']); - // insert new value on cache - $this->cache_UTF8StringToArray[$strkey]['s'] = $unicode; - $this->cache_UTF8StringToArray[$strkey]['f'][$this->CurrentFont['fontkey']] = true; - return $unicode; - } - - /** - * Converts UTF-8 strings to UTF16-BE.
    - * @param string $str string to process. - * @param boolean $setbom if true set the Byte Order Mark (BOM = 0xFEFF) - * @return string - * @access protected - * @author Nicola Asuni - * @since 1.53.0.TC005 (2005-01-05) - * @uses UTF8StringToArray(), arrUTF8ToUTF16BE() - */ - protected function UTF8ToUTF16BE($str, $setbom=true) { - if (!$this->isunicode) { - return $str; // string is not in unicode - } - $unicode = $this->UTF8StringToArray($str); // array containing UTF-8 unicode values - return $this->arrUTF8ToUTF16BE($unicode, $setbom); - } - - /** - * Converts UTF-8 strings to Latin1 when using the standard 14 core fonts.
    - * @param string $str string to process. - * @return string - * @author Andrew Whitehead, Nicola Asuni - * @access protected - * @since 3.2.000 (2008-06-23) - */ - protected function UTF8ToLatin1($str) { - if (!$this->isunicode) { - return $str; // string is not in unicode - } - $outstr = ''; // string to be returned - $unicode = $this->UTF8StringToArray($str); // array containing UTF-8 unicode values - foreach ($unicode as $char) { - if ($char < 256) { - $outstr .= chr($char); - } elseif (array_key_exists($char, $this->unicode->uni_utf8tolatin)) { - // map from UTF-8 - $outstr .= chr($this->unicode->uni_utf8tolatin[$char]); - } elseif ($char == 0xFFFD) { - // skip - } else { - $outstr .= '?'; - } - } - return $outstr; - } - - /** - * Converts UTF-8 characters array to array of Latin1 characters
    - * @param array $unicode array containing UTF-8 unicode values - * @return array - * @author Nicola Asuni - * @access protected - * @since 4.8.023 (2010-01-15) - */ - protected function UTF8ArrToLatin1($unicode) { - if ((!$this->isunicode) OR $this->isUnicodeFont()) { - return $unicode; - } - $outarr = array(); // array to be returned - foreach ($unicode as $char) { - if ($char < 256) { - $outarr[] = $char; - } elseif (array_key_exists($char, $this->unicode->uni_utf8tolatin)) { - // map from UTF-8 - $outarr[] = $this->unicode->uni_utf8tolatin[$char]; - } elseif ($char == 0xFFFD) { - // skip - } else { - $outarr[] = 63; // '?' character - } - } - return $outarr; - } - - /** - * Converts array of UTF-8 characters to UTF16-BE string.
    - * Based on: http://www.faqs.org/rfcs/rfc2781.html - *
    -	 *   Encoding UTF-16:
    -	 *
    -	 *   Encoding of a single character from an ISO 10646 character value to
    -	 *    UTF-16 proceeds as follows. Let U be the character number, no greater
    -	 *    than 0x10FFFF.
    -	 *
    -	 *    1) If U < 0x10000, encode U as a 16-bit unsigned integer and
    -	 *       terminate.
    -	 *
    -	 *    2) Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF,
    -	 *       U' must be less than or equal to 0xFFFFF. That is, U' can be
    -	 *       represented in 20 bits.
    -	 *
    -	 *    3) Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and
    -	 *       0xDC00, respectively. These integers each have 10 bits free to
    -	 *       encode the character value, for a total of 20 bits.
    -	 *
    -	 *    4) Assign the 10 high-order bits of the 20-bit U' to the 10 low-order
    -	 *       bits of W1 and the 10 low-order bits of U' to the 10 low-order
    -	 *       bits of W2. Terminate.
    -	 *
    -	 *    Graphically, steps 2 through 4 look like:
    -	 *    U' = yyyyyyyyyyxxxxxxxxxx
    -	 *    W1 = 110110yyyyyyyyyy
    -	 *    W2 = 110111xxxxxxxxxx
    -	 * 
    - * @param array $unicode array containing UTF-8 unicode values - * @param boolean $setbom if true set the Byte Order Mark (BOM = 0xFEFF) - * @return string - * @access protected - * @author Nicola Asuni - * @since 2.1.000 (2008-01-08) - * @see UTF8ToUTF16BE() - */ - protected function arrUTF8ToUTF16BE($unicode, $setbom=true) { - $outstr = ''; // string to be returned - if ($setbom) { - $outstr .= "\xFE\xFF"; // Byte Order Mark (BOM) - } - foreach ($unicode as $char) { - if ($char == 0x200b) { - // skip Unicode Character 'ZERO WIDTH SPACE' (DEC:8203, U+200B) - } elseif ($char == 0xFFFD) { - $outstr .= "\xFF\xFD"; // replacement character - } elseif ($char < 0x10000) { - $outstr .= chr($char >> 0x08); - $outstr .= chr($char & 0xFF); - } else { - $char -= 0x10000; - $w1 = 0xD800 | ($char >> 0x10); - $w2 = 0xDC00 | ($char & 0x3FF); - $outstr .= chr($w1 >> 0x08); - $outstr .= chr($w1 & 0xFF); - $outstr .= chr($w2 >> 0x08); - $outstr .= chr($w2 & 0xFF); - } - } - return $outstr; - } - // ==================================================== - - /** - * Set header font. - * @param array $font font - * @access public - * @since 1.1 - */ - public function setHeaderFont($font) { - $this->header_font = $font; - } - - /** - * Get header font. - * @return array() - * @access public - * @since 4.0.012 (2008-07-24) - */ - public function getHeaderFont() { - return $this->header_font; - } - - /** - * Set footer font. - * @param array $font font - * @access public - * @since 1.1 - */ - public function setFooterFont($font) { - $this->footer_font = $font; - } - - /** - * Get Footer font. - * @return array() - * @access public - * @since 4.0.012 (2008-07-24) - */ - public function getFooterFont() { - return $this->footer_font; - } - - /** - * Set language array. - * @param array $language - * @access public - * @since 1.1 - */ - public function setLanguageArray($language) { - $this->l = $language; - if (isset($this->l['a_meta_dir'])) { - $this->rtl = $this->l['a_meta_dir']=='rtl' ? true : false; - } else { - $this->rtl = false; - } - } - - /** - * Returns the PDF data. - * @access public - */ - public function getPDFData() { - if ($this->state < 3) { - $this->Close(); - } - return $this->buffer; - } - - /** - * Output anchor link. - * @param string $url link URL or internal link (i.e.: <a href="#23,4.5">link to page 23 at 4.5 Y position</a>) - * @param string $name link name - * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false). - * @param boolean $firstline if true prints only the first line and return the remaining string. - * @param array $color array of RGB text color - * @param string $style font style (U, D, B, I) - * @param boolean $firstblock if true the string is the starting of a line. - * @return the number of cells used or the remaining text if $firstline = true; - * @access public - */ - public function addHtmlLink($url, $name, $fill=false, $firstline=false, $color='', $style=-1, $firstblock=false) { - if (!$this->empty_string($url) AND ($url{0} == '#')) { - // convert url to internal link - $lnkdata = explode(',', $url); - if (isset($lnkdata[0])) { - $page = intval(substr($lnkdata[0], 1)); - if (empty($page) OR ($page <= 0)) { - $page = $this->page; - } - if (isset($lnkdata[1]) AND (strlen($lnkdata[1]) > 0)) { - $lnky = floatval($lnkdata[1]); - } else { - $lnky = 0; - } - $url = $this->AddLink(); - $this->SetLink($url, $lnky, $page); - } - } - // store current settings - $prevcolor = $this->fgcolor; - $prevstyle = $this->FontStyle; - if (empty($color)) { - $this->SetTextColorArray($this->htmlLinkColorArray); - } else { - $this->SetTextColorArray($color); - } - if ($style == -1) { - $this->SetFont('', $this->FontStyle.$this->htmlLinkFontStyle); - } else { - $this->SetFont('', $this->FontStyle.$style); - } - $ret = $this->Write($this->lasth, $name, $url, $fill, '', false, 0, $firstline, $firstblock, 0); - // restore settings - $this->SetFont('', $prevstyle); - $this->SetTextColorArray($prevcolor); - return $ret; - } - - /** - * Returns an associative array (keys: R,G,B) from an html color name or a six-digit or three-digit hexadecimal color representation (i.e. #3FE5AA or #7FF). - * @param string $color html color - * @return array RGB color or false in case of error. - * @access public - */ - public function convertHTMLColorToDec($color='#FFFFFF') { - $returncolor = false; - $color = preg_replace('/[\s]*/', '', $color); // remove extra spaces - $color = strtolower($color); - if (($dotpos = strpos($color, '.')) !== false) { - // remove class parent (i.e.: color.red) - $color = substr($color, ($dotpos + 1)); - } - if (strlen($color) == 0) { - return false; - } - // RGB ARRAY - if (substr($color, 0, 3) == 'rgb') { - $codes = substr($color, 4); - $codes = str_replace(')', '', $codes); - $returncolor = explode(',', $codes); - return $returncolor; - } - // CMYK ARRAY - if (substr($color, 0, 4) == 'cmyk') { - $codes = substr($color, 5); - $codes = str_replace(')', '', $codes); - $returncolor = explode(',', $codes); - return $returncolor; - } - // COLOR NAME - if (substr($color, 0, 1) != '#') { - // decode color name - if (isset($this->webcolor[$color])) { - $color_code = $this->webcolor[$color]; - } else { - return false; - } - } else { - $color_code = substr($color, 1); - } - // RGB VALUE - switch (strlen($color_code)) { - case 3: { - // three-digit hexadecimal representation - $r = substr($color_code, 0, 1); - $g = substr($color_code, 1, 1); - $b = substr($color_code, 2, 1); - $returncolor['R'] = hexdec($r.$r); - $returncolor['G'] = hexdec($g.$g); - $returncolor['B'] = hexdec($b.$b); - break; - } - case 6: { - // six-digit hexadecimal representation - $returncolor['R'] = hexdec(substr($color_code, 0, 2)); - $returncolor['G'] = hexdec(substr($color_code, 2, 2)); - $returncolor['B'] = hexdec(substr($color_code, 4, 2)); - break; - } - } - return $returncolor; - } - - /** - * Converts pixels to User's Units. - * @param int $px pixels - * @return float value in user's unit - * @access public - * @see setImageScale(), getImageScale() - */ - public function pixelsToUnits($px) { - return ($px / ($this->imgscale * $this->k)); - } - - /** - * Reverse function for htmlentities. - * Convert entities in UTF-8. - * @param string $text_to_convert Text to convert. - * @return string converted text string - * @access public - */ - public function unhtmlentities($text_to_convert) { - return html_entity_decode($text_to_convert, ENT_QUOTES, $this->encoding); - } - - // ENCRYPTION METHODS ---------------------------------- - - /** - * Returns a string containing random data to be used as a seed for encryption methods. - * @param string $seed starting seed value - * @return string containing random data - * @author Nicola Asuni - * @since 5.9.006 (2010-10-19) - * @access protected - */ - protected function getRandomSeed($seed='') { - $seed .= microtime(); - if (function_exists('openssl_random_pseudo_bytes')) { - $seed .= openssl_random_pseudo_bytes(512); - } - $seed .= uniqid('', true); - $seed .= rand(); - $seed .= getmypid(); - $seed .= __FILE__; - $seed .= $this->bufferlen; - if (isset($_SERVER['REMOTE_ADDR'])) { - $seed .= $_SERVER['REMOTE_ADDR']; - } - if (isset($_SERVER['HTTP_USER_AGENT'])) { - $seed .= $_SERVER['HTTP_USER_AGENT']; - } - if (isset($_SERVER['HTTP_ACCEPT'])) { - $seed .= $_SERVER['HTTP_ACCEPT']; - } - if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) { - $seed .= $_SERVER['HTTP_ACCEPT_ENCODING']; - } - if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - $seed .= $_SERVER['HTTP_ACCEPT_LANGUAGE']; - } - if (isset($_SERVER['HTTP_ACCEPT_CHARSET'])) { - $seed .= $_SERVER['HTTP_ACCEPT_CHARSET']; - } - $seed .= rand(); - $seed .= uniqid('', true); - $seed .= microtime(); - return $seed; - } - - /** - * Compute encryption key depending on object number where the encrypted data is stored. - * This is used for all strings and streams without crypt filter specifier. - * @param int $n object number - * @return int object key - * @access protected - * @author Nicola Asuni - * @since 2.0.000 (2008-01-02) - */ - protected function _objectkey($n) { - $objkey = $this->encryptdata['key'].pack('VXxx', $n); - if ($this->encryptdata['mode'] == 2) { // AES-128 - // AES padding - $objkey .= "\x73\x41\x6C\x54"; // sAlT - } - $objkey = substr($this->_md5_16($objkey), 0, (($this->encryptdata['Length'] / 8) + 5)); - $objkey = substr($objkey, 0, 16); - return $objkey; - } - - /** - * Encrypt the input string. - * @param int $n object number - * @param string $s data string to encrypt - * @return encrypted string - * @access protected - * @author Nicola Asuni - * @since 5.0.005 (2010-05-11) - */ - protected function _encrypt_data($n, $s) { - if (!$this->encrypted) { - return $s; - } - switch ($this->encryptdata['mode']) { - case 0: // RC4-40 - case 1: { // RC4-128 - $s = $this->_RC4($this->_objectkey($n), $s); - break; - } - case 2: { // AES-128 - $s = $this->_AES($this->_objectkey($n), $s); - break; - } - case 3: { // AES-256 - $s = $this->_AES($this->encryptdata['key'], $s); - break; - } - } - return $s; - } - - /** - * Put encryption on PDF document. - * @access protected - * @author Nicola Asuni - * @since 2.0.000 (2008-01-02) - */ - protected function _putencryption() { - if (!$this->encrypted) { - return; - } - $this->encryptdata['objid'] = $this->_newobj(); - $out = '<<'; - if (!isset($this->encryptdata['Filter']) OR empty($this->encryptdata['Filter'])) { - $this->encryptdata['Filter'] = 'Standard'; - } - $out .= ' /Filter /'.$this->encryptdata['Filter']; - if (isset($this->encryptdata['SubFilter']) AND !empty($this->encryptdata['SubFilter'])) { - $out .= ' /SubFilter /'.$this->encryptdata['SubFilter']; - } - if (!isset($this->encryptdata['V']) OR empty($this->encryptdata['V'])) { - $this->encryptdata['V'] = 1; - } - // V is a code specifying the algorithm to be used in encrypting and decrypting the document - $out .= ' /V '.$this->encryptdata['V']; - if (isset($this->encryptdata['Length']) AND !empty($this->encryptdata['Length'])) { - // The length of the encryption key, in bits. The value shall be a multiple of 8, in the range 40 to 256 - $out .= ' /Length '.$this->encryptdata['Length']; - } else { - $out .= ' /Length 40'; - } - if ($this->encryptdata['V'] >= 4) { - if (!isset($this->encryptdata['StmF']) OR empty($this->encryptdata['StmF'])) { - $this->encryptdata['StmF'] = 'Identity'; - } - if (!isset($this->encryptdata['StrF']) OR empty($this->encryptdata['StrF'])) { - // The name of the crypt filter that shall be used when decrypting all strings in the document. - $this->encryptdata['StrF'] = 'Identity'; - } - // A dictionary whose keys shall be crypt filter names and whose values shall be the corresponding crypt filter dictionaries. - if (isset($this->encryptdata['CF']) AND !empty($this->encryptdata['CF'])) { - $out .= ' /CF <<'; - $out .= ' /'.$this->encryptdata['StmF'].' <<'; - $out .= ' /Type /CryptFilter'; - if (isset($this->encryptdata['CF']['CFM']) AND !empty($this->encryptdata['CF']['CFM'])) { - // The method used - $out .= ' /CFM /'.$this->encryptdata['CF']['CFM']; - if ($this->encryptdata['pubkey']) { - $out .= ' /Recipients ['; - foreach ($this->encryptdata['Recipients'] as $rec) { - $out .= ' <'.$rec.'>'; - } - $out .= ' ]'; - if (isset($this->encryptdata['CF']['EncryptMetadata']) AND (!$this->encryptdata['CF']['EncryptMetadata'])) { - $out .= ' /EncryptMetadata false'; - } else { - $out .= ' /EncryptMetadata true'; - } - } - } else { - $out .= ' /CFM /None'; - } - if (isset($this->encryptdata['CF']['AuthEvent']) AND !empty($this->encryptdata['CF']['AuthEvent'])) { - // The event to be used to trigger the authorization that is required to access encryption keys used by this filter. - $out .= ' /AuthEvent /'.$this->encryptdata['CF']['AuthEvent']; - } else { - $out .= ' /AuthEvent /DocOpen'; - } - if (isset($this->encryptdata['CF']['Length']) AND !empty($this->encryptdata['CF']['Length'])) { - // The bit length of the encryption key. - $out .= ' /Length '.$this->encryptdata['CF']['Length']; - } - $out .= ' >> >>'; - } - // The name of the crypt filter that shall be used by default when decrypting streams. - $out .= ' /StmF /'.$this->encryptdata['StmF']; - // The name of the crypt filter that shall be used when decrypting all strings in the document. - $out .= ' /StrF /'.$this->encryptdata['StrF']; - if (isset($this->encryptdata['EFF']) AND !empty($this->encryptdata['EFF'])) { - // The name of the crypt filter that shall be used when encrypting embedded file streams that do not have their own crypt filter specifier. - $out .= ' /EFF /'.$this->encryptdata['']; - } - } - // Additional encryption dictionary entries for the standard security handler - if ($this->encryptdata['pubkey']) { - if (($this->encryptdata['V'] < 4) AND isset($this->encryptdata['Recipients']) AND !empty($this->encryptdata['Recipients'])) { - $out .= ' /Recipients ['; - foreach ($this->encryptdata['Recipients'] as $rec) { - $out .= ' <'.$rec.'>'; - } - $out .= ' ]'; - } - } else { - $out .= ' /R'; - if ($this->encryptdata['V'] == 5) { // AES-256 - $out .= ' 5'; - $out .= ' /OE ('.$this->_escape($this->encryptdata['OE']).')'; - $out .= ' /UE ('.$this->_escape($this->encryptdata['UE']).')'; - $out .= ' /Perms ('.$this->_escape($this->encryptdata['perms']).')'; - } elseif ($this->encryptdata['V'] == 4) { // AES-128 - $out .= ' 4'; - } elseif ($this->encryptdata['V'] < 2) { // RC-40 - $out .= ' 2'; - } else { // RC-128 - $out .= ' 3'; - } - $out .= ' /O ('.$this->_escape($this->encryptdata['O']).')'; - $out .= ' /U ('.$this->_escape($this->encryptdata['U']).')'; - $out .= ' /P '.$this->encryptdata['P']; - if (isset($this->encryptdata['EncryptMetadata']) AND (!$this->encryptdata['EncryptMetadata'])) { - $out .= ' /EncryptMetadata false'; - } else { - $out .= ' /EncryptMetadata true'; - } - } - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - - /** - * Returns the input text encrypted using RC4 algorithm and the specified key. - * RC4 is the standard encryption algorithm used in PDF format - * @param string $key encryption key - * @param String $text input text to be encrypted - * @return String encrypted text - * @access protected - * @since 2.0.000 (2008-01-02) - * @author Klemen Vodopivec, Nicola Asuni - */ - protected function _RC4($key, $text) { - if (function_exists('mcrypt_decrypt') AND ($out = @mcrypt_decrypt(MCRYPT_ARCFOUR, $key, $text, MCRYPT_MODE_STREAM, ''))) { - // try to use mcrypt function if exist - return $out; - } - if ($this->last_enc_key != $key) { - $k = str_repeat($key, ((256 / strlen($key)) + 1)); - $rc4 = range(0, 255); - $j = 0; - for ($i = 0; $i < 256; ++$i) { - $t = $rc4[$i]; - $j = ($j + $t + ord($k{$i})) % 256; - $rc4[$i] = $rc4[$j]; - $rc4[$j] = $t; - } - $this->last_enc_key = $key; - $this->last_enc_key_c = $rc4; - } else { - $rc4 = $this->last_enc_key_c; - } - $len = strlen($text); - $a = 0; - $b = 0; - $out = ''; - for ($i = 0; $i < $len; ++$i) { - $a = ($a + 1) % 256; - $t = $rc4[$a]; - $b = ($b + $t) % 256; - $rc4[$a] = $rc4[$b]; - $rc4[$b] = $t; - $k = $rc4[($rc4[$a] + $rc4[$b]) % 256]; - $out .= chr(ord($text{$i}) ^ $k); - } - return $out; - } - - /** - * Returns the input text exrypted using AES algorithm and the specified key. - * This method requires mcrypt. - * @param string $key encryption key - * @param String $text input text to be encrypted - * @return String encrypted text - * @access protected - * @author Nicola Asuni - * @since 5.0.005 (2010-05-11) - */ - protected function _AES($key, $text) { - // padding (RFC 2898, PKCS #5: Password-Based Cryptography Specification Version 2.0) - $padding = 16 - (strlen($text) % 16); - $text .= str_repeat(chr($padding), $padding); - $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND); - $text = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv); - $text = $iv.$text; - return $text; - } - - /** - * Encrypts a string using MD5 and returns it's value as a binary string. - * @param string $str input string - * @return String MD5 encrypted binary string - * @access protected - * @since 2.0.000 (2008-01-02) - * @author Klemen Vodopivec - */ - protected function _md5_16($str) { - return pack('H*', md5($str)); - } - - /** - * Compute U value (used for encryption) - * @return string U value - * @access protected - * @since 2.0.000 (2008-01-02) - * @author Nicola Asuni - */ - protected function _Uvalue() { - if ($this->encryptdata['mode'] == 0) { // RC4-40 - return $this->_RC4($this->encryptdata['key'], $this->enc_padding); - } elseif ($this->encryptdata['mode'] < 3) { // RC4-128, AES-128 - $tmp = $this->_md5_16($this->enc_padding.$this->encryptdata['fileid']); - $enc = $this->_RC4($this->encryptdata['key'], $tmp); - $len = strlen($tmp); - for ($i = 1; $i <= 19; ++$i) { - $ek = ''; - for ($j = 0; $j < $len; ++$j) { - $ek .= chr(ord($this->encryptdata['key']{$j}) ^ $i); - } - $enc = $this->_RC4($ek, $enc); - } - $enc .= str_repeat("\x00", 16); - return substr($enc, 0, 32); - } elseif ($this->encryptdata['mode'] == 3) { // AES-256 - $seed = $this->_md5_16($this->getRandomSeed()); - // User Validation Salt - $this->encryptdata['UVS'] = substr($seed, 0, 8); - // User Key Salt - $this->encryptdata['UKS'] = substr($seed, 8, 16); - return hash('sha256', $this->encryptdata['user_password'].$this->encryptdata['UVS'], true).$this->encryptdata['UVS'].$this->encryptdata['UKS']; - } - } - - /** - * Compute UE value (used for encryption) - * @return string UE value - * @access protected - * @since 5.9.006 (2010-10-19) - * @author Nicola Asuni - */ - protected function _UEvalue() { - $hashkey = hash('sha256', $this->encryptdata['user_password'].$this->encryptdata['UKS'], true); - $iv = str_repeat("\x00", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); - return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $hashkey, $this->encryptdata['key'], MCRYPT_MODE_CBC, $iv); - } - - /** - * Compute O value (used for encryption) - * @return string O value - * @access protected - * @since 2.0.000 (2008-01-02) - * @author Nicola Asuni - */ - protected function _Ovalue() { - if ($this->encryptdata['mode'] < 3) { // RC4-40, RC4-128, AES-128 - $tmp = $this->_md5_16($this->encryptdata['owner_password']); - if ($this->encryptdata['mode'] > 0) { - for ($i = 0; $i < 50; ++$i) { - $tmp = $this->_md5_16($tmp); - } - } - $owner_key = substr($tmp, 0, ($this->encryptdata['Length'] / 8)); - $enc = $this->_RC4($owner_key, $this->encryptdata['user_password']); - if ($this->encryptdata['mode'] > 0) { - $len = strlen($owner_key); - for ($i = 1; $i <= 19; ++$i) { - $ek = ''; - for ($j = 0; $j < $len; ++$j) { - $ek .= chr(ord($owner_key{$j}) ^ $i); - } - $enc = $this->_RC4($ek, $enc); - } - } - return $enc; - } elseif ($this->encryptdata['mode'] == 3) { // AES-256 - $seed = $this->_md5_16($this->getRandomSeed()); - // Owner Validation Salt - $this->encryptdata['OVS'] = substr($seed, 0, 8); - // Owner Key Salt - $this->encryptdata['OKS'] = substr($seed, 8, 16); - return hash('sha256', $this->encryptdata['owner_password'].$this->encryptdata['OVS'].$this->encryptdata['U'], true).$this->encryptdata['OVS'].$this->encryptdata['OKS']; - } - } - - /** - * Compute OE value (used for encryption) - * @return string OE value - * @access protected - * @since 5.9.006 (2010-10-19) - * @author Nicola Asuni - */ - protected function _OEvalue() { - $hashkey = hash('sha256', $this->encryptdata['owner_password'].$this->encryptdata['OKS'].$this->encryptdata['U'], true); - $iv = str_repeat("\x00", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); - return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $hashkey, $this->encryptdata['key'], MCRYPT_MODE_CBC, $iv); - } - - /** - * Convert password for AES-256 encryption mode - * @return string password - * @access protected - * @since 5.9.006 (2010-10-19) - * @author Nicola Asuni - */ - protected function _fixAES256Password($password) { - $psw = ''; // password to be returned - $psw_array = $this->utf8Bidi($this->UTF8StringToArray($password), $password, $this->rtl); - foreach ($psw_array as $c) { - $psw .= $this->unichr($c); - } - return substr($psw, 0, 127); - } - - /** - * Compute encryption key - * @access protected - * @since 2.0.000 (2008-01-02) - * @author Nicola Asuni - */ - protected function _generateencryptionkey() { - $keybytelen = ($this->encryptdata['Length'] / 8); - if (!$this->encryptdata['pubkey']) { // standard mode - if ($this->encryptdata['mode'] == 3) { // AES-256 - // generate 256 bit random key - $this->encryptdata['key'] = substr(hash('sha256', $this->getRandomSeed(), true), 0, $keybytelen); - // truncate passwords - $this->encryptdata['user_password'] = $this->_fixAES256Password($this->encryptdata['user_password']); - $this->encryptdata['owner_password'] = $this->_fixAES256Password($this->encryptdata['owner_password']); - // Compute U value - $this->encryptdata['U'] = $this->_Uvalue(); - // Compute UE value - $this->encryptdata['UE'] = $this->_UEvalue(); - // Compute O value - $this->encryptdata['O'] = $this->_Ovalue(); - // Compute OE value - $this->encryptdata['OE'] = $this->_OEvalue(); - // Compute P value - $this->encryptdata['P'] = $this->encryptdata['protection']; - // Computing the encryption dictionary's Perms (permissions) value - $perms = $this->getEncPermissionsString($this->encryptdata['protection']); // bytes 0-3 - $perms .= chr(255).chr(255).chr(255).chr(255); // bytes 4-7 - if (isset($this->encryptdata['CF']['EncryptMetadata']) AND (!$this->encryptdata['CF']['EncryptMetadata'])) { // byte 8 - $perms .= 'F'; - } else { - $perms .= 'T'; - } - $perms .= 'adb'; // bytes 9-11 - $perms .= 'nick'; // bytes 12-15 - $iv = str_repeat("\x00", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB)); - $this->encryptdata['perms'] = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->encryptdata['key'], $perms, MCRYPT_MODE_ECB, $iv); - } else { // RC4-40, RC4-128, AES-128 - // Pad passwords - $this->encryptdata['user_password'] = substr($this->encryptdata['user_password'].$this->enc_padding, 0, 32); - $this->encryptdata['owner_password'] = substr($this->encryptdata['owner_password'].$this->enc_padding, 0, 32); - // Compute O value - $this->encryptdata['O'] = $this->_Ovalue(); - // get default permissions (reverse byte order) - $permissions = $this->getEncPermissionsString($this->encryptdata['protection']); - // Compute encryption key - $tmp = $this->_md5_16($this->encryptdata['user_password'].$this->encryptdata['O'].$permissions.$this->encryptdata['fileid']); - if ($this->encryptdata['mode'] > 0) { - for ($i = 0; $i < 50; ++$i) { - $tmp = $this->_md5_16(substr($tmp, 0, $keybytelen)); - } - } - $this->encryptdata['key'] = substr($tmp, 0, $keybytelen); - // Compute U value - $this->encryptdata['U'] = $this->_Uvalue(); - // Compute P value - $this->encryptdata['P'] = $this->encryptdata['protection']; - } - } else { // Public-Key mode - // random 20-byte seed - $seed = sha1($this->getRandomSeed(), true); - $recipient_bytes = ''; - foreach ($this->encryptdata['pubkeys'] as $pubkey) { - // for each public certificate - if (isset($pubkey['p'])) { - $pkprotection = $this->getUserPermissionCode($pubkey['p'], $this->encryptdata['mode']); - } else { - $pkprotection = $this->encryptdata['protection']; - } - // get default permissions (reverse byte order) - $pkpermissions = $this->getEncPermissionsString($pkprotection); - // envelope data - $envelope = $seed.$pkpermissions; - // write the envelope data to a temporary file - $tempkeyfile = tempnam(K_PATH_CACHE, 'tmpkey_'); - $f = fopen($tempkeyfile, 'wb'); - if (!$f) { - $this->Error('Unable to create temporary key file: '.$tempkeyfile); - } - $envelope_lenght = strlen($envelope); - fwrite($f, $envelope, $envelope_lenght); - fclose($f); - $tempencfile = tempnam(K_PATH_CACHE, 'tmpenc_'); - if (!openssl_pkcs7_encrypt($tempkeyfile, $tempencfile, $pubkey['c'], array(), PKCS7_DETACHED | PKCS7_BINARY)) { - $this->Error('Unable to encrypt the file: '.$tempkeyfile); - } - unlink($tempkeyfile); - // read encryption signature - $signature = file_get_contents($tempencfile, false, null, $envelope_lenght); - unlink($tempencfile); - // extract signature - $signature = substr($signature, strpos($signature, 'Content-Disposition')); - $tmparr = explode("\n\n", $signature); - $signature = trim($tmparr[1]); - unset($tmparr); - // decode signature - $signature = base64_decode($signature); - // convert signature to hex - $hexsignature = current(unpack('H*', $signature)); - // store signature on recipients array - $this->encryptdata['Recipients'][] = $hexsignature; - // The bytes of each item in the Recipients array of PKCS#7 objects in the order in which they appear in the array - $recipient_bytes .= $signature; - } - // calculate encryption key - if ($this->encryptdata['mode'] == 3) { // AES-256 - $this->encryptdata['key'] = substr(hash('sha256', $seed.$recipient_bytes, true), 0, $keybytelen); - } else { // RC4-40, RC4-128, AES-128 - $this->encryptdata['key'] = substr(sha1($seed.$recipient_bytes, true), 0, $keybytelen); - } - } - } - - /** - * Return the premission code used on encryption (P value). - * @param Array $permissions the set of permissions (specify the ones you want to block). - * @param int $mode encryption strength: 0 = RC4 40 bit; 1 = RC4 128 bit; 2 = AES 128 bit; 3 = AES 256 bit. - * @access protected - * @since 5.0.005 (2010-05-12) - * @author Nicola Asuni - */ - protected function getUserPermissionCode($permissions, $mode=0) { - $options = array( - 'owner' => 2, // bit 2 -- inverted logic: cleared by default - 'print' => 4, // bit 3 - 'modify' => 8, // bit 4 - 'copy' => 16, // bit 5 - 'annot-forms' => 32, // bit 6 - 'fill-forms' => 256, // bit 9 - 'extract' => 512, // bit 10 - 'assemble' => 1024,// bit 11 - 'print-high' => 2048 // bit 12 - ); - $protection = 2147422012; // 32 bit: (01111111 11111111 00001111 00111100) - foreach ($permissions as $permission) { - if (!isset($options[$permission])) { - $this->Error('Incorrect permission: '.$permission); - } - if (($mode > 0) OR ($options[$permission] <= 32)) { - // set only valid permissions - if ($options[$permission] == 2) { - // the logic for bit 2 is inverted (cleared by default) - $protection += $options[$permission]; - } else { - $protection -= $options[$permission]; - } - } - } - return $protection; - } - - /** - * Set document protection - * Remark: the protection against modification is for people who have the full Acrobat product. - * If you don't set any password, the document will open as usual. If you set a user password, the PDF viewer will ask for it before displaying the document. The master password, if different from the user one, can be used to get full access. - * Note: protecting a document requires to encrypt it, which increases the processing time a lot. This can cause a PHP time-out in some cases, especially if the document contains images or fonts. - * @param Array $permissions the set of permissions (specify the ones you want to block):
    • print : Print the document;
    • modify : Modify the contents of the document by operations other than those controlled by 'fill-forms', 'extract' and 'assemble';
    • copy : Copy or otherwise extract text and graphics from the document;
    • annot-forms : Add or modify text annotations, fill in interactive form fields, and, if 'modify' is also set, create or modify interactive form fields (including signature fields);
    • fill-forms : Fill in existing interactive form fields (including signature fields), even if 'annot-forms' is not specified;
    • extract : Extract text and graphics (in support of accessibility to users with disabilities or for other purposes);
    • assemble : Assemble the document (insert, rotate, or delete pages and create bookmarks or thumbnail images), even if 'modify' is not set;
    • print-high : Print the document to a representation from which a faithful digital copy of the PDF content could be generated. When this is not set, printing is limited to a low-level representation of the appearance, possibly of degraded quality.
    • owner : (inverted logic - only for public-key) when set permits change of encryption and enables all other permissions.
    - * @param String $user_pass user password. Empty by default. - * @param String $owner_pass owner password. If not specified, a random value is used. - * @param int $mode encryption strength: 0 = RC4 40 bit; 1 = RC4 128 bit; 2 = AES 128 bit; 3 = AES 256 bit. - * @param String $pubkeys array of recipients containing public-key certificates ('c') and permissions ('p'). For example: array(array('c' => 'file://../tcpdf.crt', 'p' => array('print'))) - * @access public - * @since 2.0.000 (2008-01-02) - * @author Nicola Asuni - */ - public function SetProtection($permissions=array('print', 'modify', 'copy', 'annot-forms', 'fill-forms', 'extract', 'assemble', 'print-high'), $user_pass='', $owner_pass=null, $mode=0, $pubkeys=null) { - $this->encryptdata['protection'] = $this->getUserPermissionCode($permissions, $mode); - if (($pubkeys !== null) AND (is_array($pubkeys))) { - // public-key mode - $this->encryptdata['pubkeys'] = $pubkeys; - if ($mode == 0) { - // public-Key Security requires at least 128 bit - $mode = 1; - } - if (!function_exists('openssl_pkcs7_encrypt')) { - $this->Error('Public-Key Security requires openssl library.'); - } - // Set Public-Key filter (availabe are: Entrust.PPKEF, Adobe.PPKLite, Adobe.PubSec) - $this->encryptdata['pubkey'] = true; - $this->encryptdata['Filter'] = 'Adobe.PubSec'; - $this->encryptdata['StmF'] = 'DefaultCryptFilter'; - $this->encryptdata['StrF'] = 'DefaultCryptFilter'; - } else { - // standard mode (password mode) - $this->encryptdata['pubkey'] = false; - $this->encryptdata['Filter'] = 'Standard'; - $this->encryptdata['StmF'] = 'StdCF'; - $this->encryptdata['StrF'] = 'StdCF'; - } - if ($mode > 1) { // AES - if (!extension_loaded('mcrypt')) { - $this->Error('AES encryption requires mcrypt library (http://www.php.net/manual/en/mcrypt.requirements.php).'); - } - if (mcrypt_get_cipher_name(MCRYPT_RIJNDAEL_128) === false) { - $this->Error('AES encryption requires MCRYPT_RIJNDAEL_128 cypher.'); - } - if (($mode == 3) AND !function_exists('hash')) { - // the Hash extension requires no external libraries and is enabled by default as of PHP 5.1.2. - $this->Error('AES 256 encryption requires HASH Message Digest Framework (http://www.php.net/manual/en/book.hash.php).'); - } - } - if ($owner_pass === null) { - $owner_pass = md5($this->getRandomSeed()); - } - $this->encryptdata['user_password'] = $user_pass; - $this->encryptdata['owner_password'] = $owner_pass; - $this->encryptdata['mode'] = $mode; - switch ($mode) { - case 0: { // RC4 40 bit - $this->encryptdata['V'] = 1; - $this->encryptdata['Length'] = 40; - $this->encryptdata['CF']['CFM'] = 'V2'; - break; - } - case 1: { // RC4 128 bit - $this->encryptdata['V'] = 2; - $this->encryptdata['Length'] = 128; - $this->encryptdata['CF']['CFM'] = 'V2'; - if ($this->encryptdata['pubkey']) { - $this->encryptdata['SubFilter'] = 'adbe.pkcs7.s4'; - $this->encryptdata['Recipients'] = array(); - } - break; - } - case 2: { // AES 128 bit - $this->encryptdata['V'] = 4; - $this->encryptdata['Length'] = 128; - $this->encryptdata['CF']['CFM'] = 'AESV2'; - $this->encryptdata['CF']['Length'] = 128; - if ($this->encryptdata['pubkey']) { - $this->encryptdata['SubFilter'] = 'adbe.pkcs7.s5'; - $this->encryptdata['Recipients'] = array(); - } - break; - } - case 3: { // AES 256 bit - $this->encryptdata['V'] = 5; - $this->encryptdata['Length'] = 256; - $this->encryptdata['CF']['CFM'] = 'AESV3'; - $this->encryptdata['CF']['Length'] = 256; - if ($this->encryptdata['pubkey']) { - $this->encryptdata['SubFilter'] = 'adbe.pkcs7.s5'; - $this->encryptdata['Recipients'] = array(); - } - break; - } - } - $this->encrypted = true; - $this->encryptdata['fileid'] = $this->convertHexStringToString($this->file_id); - $this->_generateencryptionkey(); - } - - /** - * Convert hexadecimal string to string - * @param string $bs byte-string to convert - * @return String - * @access protected - * @since 5.0.005 (2010-05-12) - * @author Nicola Asuni - */ - protected function convertHexStringToString($bs) { - $string = ''; // string to be returned - $bslenght = strlen($bs); - if (($bslenght % 2) != 0) { - // padding - $bs .= '0'; - ++$bslenght; - } - for ($i = 0; $i < $bslenght; $i += 2) { - $string .= chr(hexdec($bs{$i}.$bs{($i + 1)})); - } - return $string; - } - - /** - * Convert string to hexadecimal string (byte string) - * @param string $s string to convert - * @return byte string - * @access protected - * @since 5.0.010 (2010-05-17) - * @author Nicola Asuni - */ - protected function convertStringToHexString($s) { - $bs = ''; - $chars = preg_split('//', $s, -1, PREG_SPLIT_NO_EMPTY); - foreach ($chars as $c) { - $bs .= sprintf('%02s', dechex(ord($c))); - } - return $bs; - } - - /** - * Convert encryption P value to a string of bytes, low-order byte first. - * @param string $protection 32bit encryption permission value (P value) - * @return String - * @access protected - * @since 5.0.005 (2010-05-12) - * @author Nicola Asuni - */ - protected function getEncPermissionsString($protection) { - $binprot = sprintf('%032b', $protection); - $str = chr(bindec(substr($binprot, 24, 8))); - $str .= chr(bindec(substr($binprot, 16, 8))); - $str .= chr(bindec(substr($binprot, 8, 8))); - $str .= chr(bindec(substr($binprot, 0, 8))); - return $str; - } - - // END OF ENCRYPTION FUNCTIONS ------------------------- - - // START TRANSFORMATIONS SECTION ----------------------- - - /** - * Starts a 2D tranformation saving current graphic state. - * This function must be called before scaling, mirroring, translation, rotation and skewing. - * Use StartTransform() before, and StopTransform() after the transformations to restore the normal behavior. - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function StartTransform() { - $this->_out('q'); - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['transfmrk'][] = strlen($this->xobjects[$this->xobjid]['outdata']); - } else { - $this->transfmrk[$this->page][] = $this->pagelen[$this->page]; - } - ++$this->transfmatrix_key; - $this->transfmatrix[$this->transfmatrix_key] = array(); - } - - /** - * Stops a 2D tranformation restoring previous graphic state. - * This function must be called after scaling, mirroring, translation, rotation and skewing. - * Use StartTransform() before, and StopTransform() after the transformations to restore the normal behavior. - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function StopTransform() { - $this->_out('Q'); - if (isset($this->transfmatrix[$this->transfmatrix_key])) { - array_pop($this->transfmatrix[$this->transfmatrix_key]); - --$this->transfmatrix_key; - } - if ($this->inxobj) { - // we are inside an XObject template - array_pop($this->xobjects[$this->xobjid]['transfmrk']); - } else { - array_pop($this->transfmrk[$this->page]); - } - } - /** - * Horizontal Scaling. - * @param float $s_x scaling factor for width as percent. 0 is not allowed. - * @param int $x abscissa of the scaling center. Default is current x position - * @param int $y ordinate of the scaling center. Default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function ScaleX($s_x, $x='', $y='') { - $this->Scale($s_x, 100, $x, $y); - } - - /** - * Vertical Scaling. - * @param float $s_y scaling factor for height as percent. 0 is not allowed. - * @param int $x abscissa of the scaling center. Default is current x position - * @param int $y ordinate of the scaling center. Default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function ScaleY($s_y, $x='', $y='') { - $this->Scale(100, $s_y, $x, $y); - } - - /** - * Vertical and horizontal proportional Scaling. - * @param float $s scaling factor for width and height as percent. 0 is not allowed. - * @param int $x abscissa of the scaling center. Default is current x position - * @param int $y ordinate of the scaling center. Default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function ScaleXY($s, $x='', $y='') { - $this->Scale($s, $s, $x, $y); - } - - /** - * Vertical and horizontal non-proportional Scaling. - * @param float $s_x scaling factor for width as percent. 0 is not allowed. - * @param float $s_y scaling factor for height as percent. 0 is not allowed. - * @param int $x abscissa of the scaling center. Default is current x position - * @param int $y ordinate of the scaling center. Default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function Scale($s_x, $s_y, $x='', $y='') { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - if (($s_x == 0) OR ($s_y == 0)) { - $this->Error('Please do not use values equal to zero for scaling'); - } - $y = ($this->h - $y) * $this->k; - $x *= $this->k; - //calculate elements of transformation matrix - $s_x /= 100; - $s_y /= 100; - $tm = array(); - $tm[0] = $s_x; - $tm[1] = 0; - $tm[2] = 0; - $tm[3] = $s_y; - $tm[4] = $x * (1 - $s_x); - $tm[5] = $y * (1 - $s_y); - //scale the coordinate system - $this->Transform($tm); - } - - /** - * Horizontal Mirroring. - * @param int $x abscissa of the point. Default is current x position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function MirrorH($x='') { - $this->Scale(-100, 100, $x); - } - - /** - * Verical Mirroring. - * @param int $y ordinate of the point. Default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function MirrorV($y='') { - $this->Scale(100, -100, '', $y); - } - - /** - * Point reflection mirroring. - * @param int $x abscissa of the point. Default is current x position - * @param int $y ordinate of the point. Default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function MirrorP($x='',$y='') { - $this->Scale(-100, -100, $x, $y); - } - - /** - * Reflection against a straight line through point (x, y) with the gradient angle (angle). - * @param float $angle gradient angle of the straight line. Default is 0 (horizontal line). - * @param int $x abscissa of the point. Default is current x position - * @param int $y ordinate of the point. Default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function MirrorL($angle=0, $x='',$y='') { - $this->Scale(-100, 100, $x, $y); - $this->Rotate(-2*($angle-90), $x, $y); - } - - /** - * Translate graphic object horizontally. - * @param int $t_x movement to the right (or left for RTL) - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function TranslateX($t_x) { - $this->Translate($t_x, 0); - } - - /** - * Translate graphic object vertically. - * @param int $t_y movement to the bottom - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function TranslateY($t_y) { - $this->Translate(0, $t_y); - } - - /** - * Translate graphic object horizontally and vertically. - * @param int $t_x movement to the right - * @param int $t_y movement to the bottom - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function Translate($t_x, $t_y) { - //calculate elements of transformation matrix - $tm = array(); - $tm[0] = 1; - $tm[1] = 0; - $tm[2] = 0; - $tm[3] = 1; - $tm[4] = $t_x * $this->k; - $tm[5] = -$t_y * $this->k; - //translate the coordinate system - $this->Transform($tm); - } - - /** - * Rotate object. - * @param float $angle angle in degrees for counter-clockwise rotation - * @param int $x abscissa of the rotation center. Default is current x position - * @param int $y ordinate of the rotation center. Default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function Rotate($angle, $x='', $y='') { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - $y = ($this->h - $y) * $this->k; - $x *= $this->k; - //calculate elements of transformation matrix - $tm = array(); - $tm[0] = cos(deg2rad($angle)); - $tm[1] = sin(deg2rad($angle)); - $tm[2] = -$tm[1]; - $tm[3] = $tm[0]; - $tm[4] = $x + ($tm[1] * $y) - ($tm[0] * $x); - $tm[5] = $y - ($tm[0] * $y) - ($tm[1] * $x); - //rotate the coordinate system around ($x,$y) - $this->Transform($tm); - } - - /** - * Skew horizontally. - * @param float $angle_x angle in degrees between -90 (skew to the left) and 90 (skew to the right) - * @param int $x abscissa of the skewing center. default is current x position - * @param int $y ordinate of the skewing center. default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function SkewX($angle_x, $x='', $y='') { - $this->Skew($angle_x, 0, $x, $y); - } - - /** - * Skew vertically. - * @param float $angle_y angle in degrees between -90 (skew to the bottom) and 90 (skew to the top) - * @param int $x abscissa of the skewing center. default is current x position - * @param int $y ordinate of the skewing center. default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function SkewY($angle_y, $x='', $y='') { - $this->Skew(0, $angle_y, $x, $y); - } - - /** - * Skew. - * @param float $angle_x angle in degrees between -90 (skew to the left) and 90 (skew to the right) - * @param float $angle_y angle in degrees between -90 (skew to the bottom) and 90 (skew to the top) - * @param int $x abscissa of the skewing center. default is current x position - * @param int $y ordinate of the skewing center. default is current y position - * @access public - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - public function Skew($angle_x, $angle_y, $x='', $y='') { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - if (($angle_x <= -90) OR ($angle_x >= 90) OR ($angle_y <= -90) OR ($angle_y >= 90)) { - $this->Error('Please use values between -90 and +90 degrees for Skewing.'); - } - $x *= $this->k; - $y = ($this->h - $y) * $this->k; - //calculate elements of transformation matrix - $tm = array(); - $tm[0] = 1; - $tm[1] = tan(deg2rad($angle_y)); - $tm[2] = tan(deg2rad($angle_x)); - $tm[3] = 1; - $tm[4] = -$tm[2] * $y; - $tm[5] = -$tm[1] * $x; - //skew the coordinate system - $this->Transform($tm); - } - - /** - * Apply graphic transformations. - * @param array $tm transformation matrix - * @access protected - * @since 2.1.000 (2008-01-07) - * @see StartTransform(), StopTransform() - */ - protected function Transform($tm) { - $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); - // add tranformation matrix - $this->transfmatrix[$this->transfmatrix_key][] = array('a' => $tm[0], 'b' => $tm[1], 'c' => $tm[2], 'd' => $tm[3], 'e' => $tm[4], 'f' => $tm[5]); - // update transformation mark - if ($this->inxobj) { - // we are inside an XObject template - if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) { - $key = key($this->xobjects[$this->xobjid]['transfmrk']); - $this->xobjects[$this->xobjid]['transfmrk'][$key] = strlen($this->xobjects[$this->xobjid]['outdata']); - } - } elseif (end($this->transfmrk[$this->page]) !== false) { - $key = key($this->transfmrk[$this->page]); - $this->transfmrk[$this->page][$key] = $this->pagelen[$this->page]; - } - } - - // END TRANSFORMATIONS SECTION ------------------------- - - // START GRAPHIC FUNCTIONS SECTION --------------------- - // The following section is based on the code provided by David Hernandez Sanz - - /** - * Defines the line width. By default, the value equals 0.2 mm. The method can be called before the first page is created and the value is retained from page to page. - * @param float $width The width. - * @access public - * @since 1.0 - * @see Line(), Rect(), Cell(), MultiCell() - */ - public function SetLineWidth($width) { - //Set line width - $this->LineWidth = $width; - $this->linestyleWidth = sprintf('%.2F w', ($width * $this->k)); - if ($this->page > 0) { - $this->_out($this->linestyleWidth); - } - } - - /** - * Returns the current the line width. - * @return int Line width - * @access public - * @since 2.1.000 (2008-01-07) - * @see Line(), SetLineWidth() - */ - public function GetLineWidth() { - return $this->LineWidth; - } - - /** - * Set line style. - * @param array $style Line style. Array with keys among the following: - *
      - *
    • width (float): Width of the line in user units.
    • - *
    • cap (string): Type of cap to put on the line. Possible values are: - * butt, round, square. The difference between "square" and "butt" is that - * "square" projects a flat end past the end of the line.
    • - *
    • join (string): Type of join. Possible values are: miter, round, - * bevel.
    • - *
    • dash (mixed): Dash pattern. Is 0 (without dash) or string with - * series of length values, which are the lengths of the on and off dashes. - * For example: "2" represents 2 on, 2 off, 2 on, 2 off, ...; "2,1" is 2 on, - * 1 off, 2 on, 1 off, ...
    • - *
    • phase (integer): Modifier on the dash pattern which is used to shift - * the point at which the pattern starts.
    • - *
    • color (array): Draw color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K).
    • - *
    - * @param boolean $ret if true do not send the command. - * @return string the PDF command - * @access public - * @since 2.1.000 (2008-01-08) - */ - public function SetLineStyle($style, $ret=false) { - $s = ''; // string to be returned - if (!is_array($style)) { - return; - } - extract($style); - if (isset($width)) { - $this->LineWidth = $width; - $this->linestyleWidth = sprintf('%.2F w', ($width * $this->k)); - $s .= $this->linestyleWidth.' '; - } - if (isset($cap)) { - $ca = array('butt' => 0, 'round'=> 1, 'square' => 2); - if (isset($ca[$cap])) { - $this->linestyleCap = $ca[$cap].' J'; - $s .= $this->linestyleCap.' '; - } - } - if (isset($join)) { - $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2); - if (isset($ja[$join])) { - $this->linestyleJoin = $ja[$join].' j'; - $s .= $this->linestyleJoin.' '; - } - } - if (isset($dash)) { - $dash_string = ''; - if ($dash) { - if (preg_match('/^.+,/', $dash) > 0) { - $tab = explode(',', $dash); - } else { - $tab = array($dash); - } - $dash_string = ''; - foreach ($tab as $i => $v) { - if ($i) { - $dash_string .= ' '; - } - $dash_string .= sprintf('%.2F', $v); - } - } - if (!isset($phase) OR !$dash) { - $phase = 0; - } - $this->linestyleDash = sprintf('[%s] %.2F d', $dash_string, $phase); - $s .= $this->linestyleDash.' '; - } - if (isset($color)) { - $s .= $this->SetDrawColorArray($color, true).' '; - } - if (!$ret) { - $this->_out($s); - } - return $s; - } - - /** - * Begin a new subpath by moving the current point to coordinates (x, y), omitting any connecting line segment. - * @param float $x Abscissa of point. - * @param float $y Ordinate of point. - * @access protected - * @since 2.1.000 (2008-01-08) - */ - protected function _outPoint($x, $y) { - $this->_out(sprintf('%.2F %.2F m', $x * $this->k, ($this->h - $y) * $this->k)); - } - - /** - * Append a straight line segment from the current point to the point (x, y). - * The new current point shall be (x, y). - * @param float $x Abscissa of end point. - * @param float $y Ordinate of end point. - * @access protected - * @since 2.1.000 (2008-01-08) - */ - protected function _outLine($x, $y) { - $this->_out(sprintf('%.2F %.2F l', $x * $this->k, ($this->h - $y) * $this->k)); - } - - /** - * Append a rectangle to the current path as a complete subpath, with lower-left corner (x, y) and dimensions widthand height in user space. - * @param float $x Abscissa of upper-left corner (or upper-right corner for RTL language). - * @param float $y Ordinate of upper-left corner (or upper-right corner for RTL language). - * @param float $w Width. - * @param float $h Height. - * @param string $op options - * @access protected - * @since 2.1.000 (2008-01-08) - */ - protected function _outRect($x, $y, $w, $h, $op) { - $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s', $x * $this->k, ($this->h - $y) * $this->k, $w * $this->k, -$h * $this->k, $op)); - } - - /** - * Append a cubic Bézier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using (x1, y1) and (x2, y2) as the Bézier control points. - * The new current point shall be (x3, y3). - * @param float $x1 Abscissa of control point 1. - * @param float $y1 Ordinate of control point 1. - * @param float $x2 Abscissa of control point 2. - * @param float $y2 Ordinate of control point 2. - * @param float $x3 Abscissa of end point. - * @param float $y3 Ordinate of end point. - * @access protected - * @since 2.1.000 (2008-01-08) - */ - protected function _outCurve($x1, $y1, $x2, $y2, $x3, $y3) { - $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c', $x1 * $this->k, ($this->h - $y1) * $this->k, $x2 * $this->k, ($this->h - $y2) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); - } - - /** - * Append a cubic Bézier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using the current point and (x2, y2) as the Bézier control points. - * The new current point shall be (x3, y3). - * @param float $x2 Abscissa of control point 2. - * @param float $y2 Ordinate of control point 2. - * @param float $x3 Abscissa of end point. - * @param float $y3 Ordinate of end point. - * @access protected - * @since 4.9.019 (2010-04-26) - */ - protected function _outCurveV($x2, $y2, $x3, $y3) { - $this->_out(sprintf('%.2F %.2F %.2F %.2F v', $x2 * $this->k, ($this->h - $y2) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); - } - - /** - * Append a cubic Bézier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using (x1, y1) and (x3, y3) as the Bézier control points. - * The new current point shall be (x3, y3). - * @param float $x1 Abscissa of control point 1. - * @param float $y1 Ordinate of control point 1. - * @param float $x2 Abscissa of control point 2. - * @param float $y2 Ordinate of control point 2. - * @param float $x3 Abscissa of end point. - * @param float $y3 Ordinate of end point. - * @access protected - * @since 2.1.000 (2008-01-08) - */ - protected function _outCurveY($x1, $y1, $x3, $y3) { - $this->_out(sprintf('%.2F %.2F %.2F %.2F y', $x1 * $this->k, ($this->h - $y1) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); - } - - /** - * Draws a line between two points. - * @param float $x1 Abscissa of first point. - * @param float $y1 Ordinate of first point. - * @param float $x2 Abscissa of second point. - * @param float $y2 Ordinate of second point. - * @param array $style Line style. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @access public - * @since 1.0 - * @see SetLineWidth(), SetDrawColor(), SetLineStyle() - */ - public function Line($x1, $y1, $x2, $y2, $style=array()) { - if (is_array($style)) { - $this->SetLineStyle($style); - } - $this->_outPoint($x1, $y1); - $this->_outLine($x2, $y2); - $this->_out('S'); - } - - /** - * Draws a rectangle. - * @param float $x Abscissa of upper-left corner (or upper-right corner for RTL language). - * @param float $y Ordinate of upper-left corner (or upper-right corner for RTL language). - * @param float $w Width. - * @param float $h Height. - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $border_style Border style of rectangle. Array with keys among the following: - *
      - *
    • all: Line style of all borders. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    • L, T, R, B or combinations: Line style of left, top, right or bottom border. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    - * If a key is not present or is null, not draws the border. Default value: default line style (empty array). - * @param array $border_style Border style of rectangle. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). - * @access public - * @since 1.0 - * @see SetLineStyle() - */ - public function Rect($x, $y, $w, $h, $style='', $border_style=array(), $fill_color=array()) { - if (!(false === strpos($style, 'F')) AND !empty($fill_color)) { - $this->SetFillColorArray($fill_color); - } - $op = $this->getPathPaintOperator($style); - if ((!$border_style) OR (isset($border_style['all']))) { - if (isset($border_style['all']) AND $border_style['all']) { - $this->SetLineStyle($border_style['all']); - $border_style = array(); - } - } - $this->_outRect($x, $y, $w, $h, $op); - if ($border_style) { - $border_style2 = array(); - foreach ($border_style as $line => $value) { - $length = strlen($line); - for ($i = 0; $i < $length; ++$i) { - $border_style2[$line[$i]] = $value; - } - } - $border_style = $border_style2; - if (isset($border_style['L']) AND $border_style['L']) { - $this->Line($x, $y, $x, $y + $h, $border_style['L']); - } - if (isset($border_style['T']) AND $border_style['T']) { - $this->Line($x, $y, $x + $w, $y, $border_style['T']); - } - if (isset($border_style['R']) AND $border_style['R']) { - $this->Line($x + $w, $y, $x + $w, $y + $h, $border_style['R']); - } - if (isset($border_style['B']) AND $border_style['B']) { - $this->Line($x, $y + $h, $x + $w, $y + $h, $border_style['B']); - } - } - } - - /** - * Draws a Bezier curve. - * The Bezier curve is a tangent to the line between the control points at - * either end of the curve. - * @param float $x0 Abscissa of start point. - * @param float $y0 Ordinate of start point. - * @param float $x1 Abscissa of control point 1. - * @param float $y1 Ordinate of control point 1. - * @param float $x2 Abscissa of control point 2. - * @param float $y2 Ordinate of control point 2. - * @param float $x3 Abscissa of end point. - * @param float $y3 Ordinate of end point. - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $line_style Line style of curve. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). - * @access public - * @see SetLineStyle() - * @since 2.1.000 (2008-01-08) - */ - public function Curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3, $style='', $line_style=array(), $fill_color=array()) { - if (!(false === strpos($style, 'F')) AND isset($fill_color)) { - $this->SetFillColorArray($fill_color); - } - $op = $this->getPathPaintOperator($style); - if ($line_style) { - $this->SetLineStyle($line_style); - } - $this->_outPoint($x0, $y0); - $this->_outCurve($x1, $y1, $x2, $y2, $x3, $y3); - $this->_out($op); - } - - /** - * Draws a poly-Bezier curve. - * Each Bezier curve segment is a tangent to the line between the control points at - * either end of the curve. - * @param float $x0 Abscissa of start point. - * @param float $y0 Ordinate of start point. - * @param float $segments An array of bezier descriptions. Format: array(x1, y1, x2, y2, x3, y3). - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $line_style Line style of curve. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). - * @access public - * @see SetLineStyle() - * @since 3.0008 (2008-05-12) - */ - public function Polycurve($x0, $y0, $segments, $style='', $line_style=array(), $fill_color=array()) { - if (!(false === strpos($style, 'F')) AND isset($fill_color)) { - $this->SetFillColorArray($fill_color); - } - $op = $this->getPathPaintOperator($style); - if ($op == 'f') { - $line_style = array(); - } - if ($line_style) { - $this->SetLineStyle($line_style); - } - $this->_outPoint($x0, $y0); - foreach ($segments as $segment) { - list($x1, $y1, $x2, $y2, $x3, $y3) = $segment; - $this->_outCurve($x1, $y1, $x2, $y2, $x3, $y3); - } - $this->_out($op); - } - - /** - * Draws an ellipse. - * An ellipse is formed from n Bezier curves. - * @param float $x0 Abscissa of center point. - * @param float $y0 Ordinate of center point. - * @param float $rx Horizontal radius. - * @param float $ry Vertical radius (if ry = 0 then is a circle, see {@link Circle Circle}). Default value: 0. - * @param float $angle: Angle oriented (anti-clockwise). Default value: 0. - * @param float $astart: Angle start of draw line. Default value: 0. - * @param float $afinish: Angle finish of draw line. Default value: 360. - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $line_style Line style of ellipse. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). - * @param integer $nc Number of curves used to draw a 90 degrees portion of ellipse. - * @author Nicola Asuni - * @access public - * @since 2.1.000 (2008-01-08) - */ - public function Ellipse($x0, $y0, $rx, $ry='', $angle=0, $astart=0, $afinish=360, $style='', $line_style=array(), $fill_color=array(), $nc=2) { - if ($this->empty_string($ry) OR ($ry == 0)) { - $ry = $rx; - } - if (!(false === strpos($style, 'F')) AND isset($fill_color)) { - $this->SetFillColorArray($fill_color); - } - $op = $this->getPathPaintOperator($style); - if ($op == 'f') { - $line_style = array(); - } - if ($line_style) { - $this->SetLineStyle($line_style); - } - $this->_outellipticalarc($x0, $y0, $rx, $ry, $angle, $astart, $afinish, false, $nc); - $this->_out($op); - } - - /** - * Append an elliptical arc to the current path. - * An ellipse is formed from n Bezier curves. - * @param float $xc Abscissa of center point. - * @param float $yc Ordinate of center point. - * @param float $rx Horizontal radius. - * @param float $ry Vertical radius (if ry = 0 then is a circle, see {@link Circle Circle}). Default value: 0. - * @param float $xang: Angle between the X-axis and the major axis of the ellipse. Default value: 0. - * @param float $angs: Angle start of draw line. Default value: 0. - * @param float $angf: Angle finish of draw line. Default value: 360. - * @param boolean $pie if true do not mark the border point (used to draw pie sectors). - * @param integer $nc Number of curves used to draw a 90 degrees portion of ellipse. - * @author Nicola Asuni - * @access protected - * @since 4.9.019 (2010-04-26) - */ - protected function _outellipticalarc($xc, $yc, $rx, $ry, $xang=0, $angs=0, $angf=360, $pie=false, $nc=2) { - $k = $this->k; - if ($nc < 2) { - $nc = 2; - } - if ($pie) { - // center of the arc - $this->_outPoint($xc, $yc); - } - $xang = deg2rad((float) $xang); - $angs = deg2rad((float) $angs); - $angf = deg2rad((float) $angf); - $as = atan2((sin($angs) / $ry), (cos($angs) / $rx)); - $af = atan2((sin($angf) / $ry), (cos($angf) / $rx)); - if ($as < 0) { - $as += (2 * M_PI); - } - if ($af < 0) { - $af += (2 * M_PI); - } - if ($as > $af) { - // reverse rotation go clockwise - $as -= (2 * M_PI); - } - $total_angle = ($af - $as); - if ($nc < 2) { - $nc = 2; - } - // total arcs to draw - $nc *= (2 * abs($total_angle) / M_PI); - $nc = round($nc) + 1; - // angle of each arc - $arcang = $total_angle / $nc; - // center point in PDF coordiantes - $x0 = $xc; - $y0 = ($this->h - $yc); - // starting angle - $ang = $as; - $alpha = sin($arcang) * ((sqrt(4 + (3 * pow(tan(($arcang) / 2), 2))) - 1) / 3); - $cos_xang = cos($xang); - $sin_xang = sin($xang); - $cos_ang = cos($ang); - $sin_ang = sin($ang); - // first arc point - $px1 = $x0 + ($rx * $cos_xang * $cos_ang) - ($ry * $sin_xang * $sin_ang); - $py1 = $y0 + ($rx * $sin_xang * $cos_ang) + ($ry * $cos_xang * $sin_ang); - // first Bezier control point - $qx1 = ($alpha * ((-$rx * $cos_xang * $sin_ang) - ($ry * $sin_xang * $cos_ang))); - $qy1 = ($alpha * ((-$rx * $sin_xang * $sin_ang) + ($ry * $cos_xang * $cos_ang))); - if ($pie) { - $this->_outLine($px1, $this->h - $py1); - } else { - $this->_outPoint($px1, $this->h - $py1); - } - // draw arcs - for ($i = 1; $i <= $nc; ++$i) { - // starting angle - $ang = $as + ($i * $arcang); - $cos_xang = cos($xang); - $sin_xang = sin($xang); - $cos_ang = cos($ang); - $sin_ang = sin($ang); - // second arc point - $px2 = $x0 + ($rx * $cos_xang * $cos_ang) - ($ry * $sin_xang * $sin_ang); - $py2 = $y0 + ($rx * $sin_xang * $cos_ang) + ($ry * $cos_xang * $sin_ang); - // second Bezier control point - $qx2 = ($alpha * ((-$rx * $cos_xang * $sin_ang) - ($ry * $sin_xang * $cos_ang))); - $qy2 = ($alpha * ((-$rx * $sin_xang * $sin_ang) + ($ry * $cos_xang * $cos_ang))); - // draw arc - $this->_outCurve(($px1 + $qx1), ($this->h - ($py1 + $qy1)), ($px2 - $qx2), ($this->h - ($py2 - $qy2)), $px2, ($this->h - $py2)); - // move to next point - $px1 = $px2; - $py1 = $py2; - $qx1 = $qx2; - $qy1 = $qy2; - } - if ($pie) { - $this->_outLine($xc, $yc); - } - } - - /** - * Draws a circle. - * A circle is formed from n Bezier curves. - * @param float $x0 Abscissa of center point. - * @param float $y0 Ordinate of center point. - * @param float $r Radius. - * @param float $angstr: Angle start of draw line. Default value: 0. - * @param float $angend: Angle finish of draw line. Default value: 360. - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $line_style Line style of circle. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $fill_color Fill color. Format: array(red, green, blue). Default value: default color (empty array). - * @param integer $nc Number of curves used to draw a 90 degrees portion of circle. - * @access public - * @since 2.1.000 (2008-01-08) - */ - public function Circle($x0, $y0, $r, $angstr=0, $angend=360, $style='', $line_style=array(), $fill_color=array(), $nc=2) { - $this->Ellipse($x0, $y0, $r, $r, 0, $angstr, $angend, $style, $line_style, $fill_color, $nc); - } - - /** - * Draws a polygonal line - * @param array $p Points 0 to ($np - 1). Array with values (x0, y0, x1, y1,..., x(np-1), y(np - 1)) - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $line_style Line style of polygon. Array with keys among the following: - *
      - *
    • all: Line style of all lines. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    • 0 to ($np - 1): Line style of each line. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    - * If a key is not present or is null, not draws the line. Default value is default line style (empty array). - * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). - * @param boolean $closed if true the polygon is closes, otherwise will remain open - * @access public - * @since 4.8.003 (2009-09-15) - */ - public function PolyLine($p, $style='', $line_style=array(), $fill_color=array()) { - $this->Polygon($p, $style, $line_style, $fill_color, false); - } - - /** - * Draws a polygon. - * @param array $p Points 0 to ($np - 1). Array with values (x0, y0, x1, y1,..., x(np-1), y(np - 1)) - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $line_style Line style of polygon. Array with keys among the following: - *
      - *
    • all: Line style of all lines. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    • 0 to ($np - 1): Line style of each line. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    - * If a key is not present or is null, not draws the line. Default value is default line style (empty array). - * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). - * @param boolean $closed if true the polygon is closes, otherwise will remain open - * @access public - * @since 2.1.000 (2008-01-08) - */ - public function Polygon($p, $style='', $line_style=array(), $fill_color=array(), $closed=true) { - $nc = count($p); // number of coordinates - $np = $nc / 2; // number of points - if ($closed) { - // close polygon by adding the first 2 points at the end (one line) - for ($i = 0; $i < 4; ++$i) { - $p[$nc + $i] = $p[$i]; - } - // copy style for the last added line - if (isset($line_style[0])) { - $line_style[$np] = $line_style[0]; - } - $nc += 4; - } - if (!(false === strpos($style, 'F')) AND isset($fill_color)) { - $this->SetFillColorArray($fill_color); - } - $op = $this->getPathPaintOperator($style); - if ($op == 'f') { - $line_style = array(); - } - $draw = true; - if ($line_style) { - if (isset($line_style['all'])) { - $this->SetLineStyle($line_style['all']); - } else { - $draw = false; - if ($op == 'B') { - // draw fill - $op = 'f'; - $this->_outPoint($p[0], $p[1]); - for ($i = 2; $i < $nc; $i = $i + 2) { - $this->_outLine($p[$i], $p[$i + 1]); - } - $this->_out($op); - } - // draw outline - $this->_outPoint($p[0], $p[1]); - for ($i = 2; $i < $nc; $i = $i + 2) { - $line_num = ($i / 2) - 1; - if (isset($line_style[$line_num])) { - if ($line_style[$line_num] != 0) { - if (is_array($line_style[$line_num])) { - $this->_out('S'); - $this->SetLineStyle($line_style[$line_num]); - $this->_outPoint($p[$i - 2], $p[$i - 1]); - $this->_outLine($p[$i], $p[$i + 1]); - $this->_out('S'); - $this->_outPoint($p[$i], $p[$i + 1]); - } else { - $this->_outLine($p[$i], $p[$i + 1]); - } - } - } else { - $this->_outLine($p[$i], $p[$i + 1]); - } - } - $this->_out($op); - } - } - if ($draw) { - $this->_outPoint($p[0], $p[1]); - for ($i = 2; $i < $nc; $i = $i + 2) { - $this->_outLine($p[$i], $p[$i + 1]); - } - $this->_out($op); - } - } - - /** - * Draws a regular polygon. - * @param float $x0 Abscissa of center point. - * @param float $y0 Ordinate of center point. - * @param float $r: Radius of inscribed circle. - * @param integer $ns Number of sides. - * @param float $angle Angle oriented (anti-clockwise). Default value: 0. - * @param boolean $draw_circle Draw inscribed circle or not. Default value: false. - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $line_style Line style of polygon sides. Array with keys among the following: - *
      - *
    • all: Line style of all sides. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    • 0 to ($ns - 1): Line style of each side. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    - * If a key is not present or is null, not draws the side. Default value is default line style (empty array). - * @param array $fill_color Fill color. Format: array(red, green, blue). Default value: default color (empty array). - * @param string $circle_style Style of rendering of inscribed circle (if draws). Possible values are: - *
      - *
    • D or empty string: Draw (default).
    • - *
    • F: Fill.
    • - *
    • DF or FD: Draw and fill.
    • - *
    • CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).
    • - *
    • CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).
    • - *
    - * @param array $circle_outLine_style Line style of inscribed circle (if draws). Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $circle_fill_color Fill color of inscribed circle (if draws). Format: array(red, green, blue). Default value: default color (empty array). - * @access public - * @since 2.1.000 (2008-01-08) - */ - public function RegularPolygon($x0, $y0, $r, $ns, $angle=0, $draw_circle=false, $style='', $line_style=array(), $fill_color=array(), $circle_style='', $circle_outLine_style=array(), $circle_fill_color=array()) { - if (3 > $ns) { - $ns = 3; - } - if ($draw_circle) { - $this->Circle($x0, $y0, $r, 0, 360, $circle_style, $circle_outLine_style, $circle_fill_color); - } - $p = array(); - for ($i = 0; $i < $ns; ++$i) { - $a = $angle + ($i * 360 / $ns); - $a_rad = deg2rad((float) $a); - $p[] = $x0 + ($r * sin($a_rad)); - $p[] = $y0 + ($r * cos($a_rad)); - } - $this->Polygon($p, $style, $line_style, $fill_color); - } - - /** - * Draws a star polygon - * @param float $x0 Abscissa of center point. - * @param float $y0 Ordinate of center point. - * @param float $r Radius of inscribed circle. - * @param integer $nv Number of vertices. - * @param integer $ng Number of gap (if ($ng % $nv = 1) then is a regular polygon). - * @param float $angle: Angle oriented (anti-clockwise). Default value: 0. - * @param boolean $draw_circle: Draw inscribed circle or not. Default value is false. - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $line_style Line style of polygon sides. Array with keys among the following: - *
      - *
    • all: Line style of all sides. Array like for - * {@link SetLineStyle SetLineStyle}.
    • - *
    • 0 to (n - 1): Line style of each side. Array like for {@link SetLineStyle SetLineStyle}.
    • - *
    - * If a key is not present or is null, not draws the side. Default value is default line style (empty array). - * @param array $fill_color Fill color. Format: array(red, green, blue). Default value: default color (empty array). - * @param string $circle_style Style of rendering of inscribed circle (if draws). Possible values are: - *
      - *
    • D or empty string: Draw (default).
    • - *
    • F: Fill.
    • - *
    • DF or FD: Draw and fill.
    • - *
    • CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).
    • - *
    • CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).
    • - *
    - * @param array $circle_outLine_style Line style of inscribed circle (if draws). Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $circle_fill_color Fill color of inscribed circle (if draws). Format: array(red, green, blue). Default value: default color (empty array). - * @access public - * @since 2.1.000 (2008-01-08) - */ - public function StarPolygon($x0, $y0, $r, $nv, $ng, $angle=0, $draw_circle=false, $style='', $line_style=array(), $fill_color=array(), $circle_style='', $circle_outLine_style=array(), $circle_fill_color=array()) { - if ($nv < 2) { - $nv = 2; - } - if ($draw_circle) { - $this->Circle($x0, $y0, $r, 0, 360, $circle_style, $circle_outLine_style, $circle_fill_color); - } - $p2 = array(); - $visited = array(); - for ($i = 0; $i < $nv; ++$i) { - $a = $angle + ($i * 360 / $nv); - $a_rad = deg2rad((float) $a); - $p2[] = $x0 + ($r * sin($a_rad)); - $p2[] = $y0 + ($r * cos($a_rad)); - $visited[] = false; - } - $p = array(); - $i = 0; - do { - $p[] = $p2[$i * 2]; - $p[] = $p2[($i * 2) + 1]; - $visited[$i] = true; - $i += $ng; - $i %= $nv; - } while (!$visited[$i]); - $this->Polygon($p, $style, $line_style, $fill_color); - } - - /** - * Draws a rounded rectangle. - * @param float $x Abscissa of upper-left corner. - * @param float $y Ordinate of upper-left corner. - * @param float $w Width. - * @param float $h Height. - * @param float $r the radius of the circle used to round off the corners of the rectangle. - * @param string $round_corner Draws rounded corner or not. String with a 0 (not rounded i-corner) or 1 (rounded i-corner) in i-position. Positions are, in order and begin to 0: top left, top right, bottom right and bottom left. Default value: all rounded corner ("1111"). - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $border_style Border style of rectangle. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). - * @access public - * @since 2.1.000 (2008-01-08) - */ - public function RoundedRect($x, $y, $w, $h, $r, $round_corner='1111', $style='', $border_style=array(), $fill_color=array()) { - $this->RoundedRectXY($x, $y, $w, $h, $r, $r, $round_corner, $style, $border_style, $fill_color); - } - - /** - * Draws a rounded rectangle. - * @param float $x Abscissa of upper-left corner. - * @param float $y Ordinate of upper-left corner. - * @param float $w Width. - * @param float $h Height. - * @param float $rx the x-axis radius of the ellipse used to round off the corners of the rectangle. - * @param float $ry the y-axis radius of the ellipse used to round off the corners of the rectangle. - * @param string $round_corner Draws rounded corner or not. String with a 0 (not rounded i-corner) or 1 (rounded i-corner) in i-position. Positions are, in order and begin to 0: top left, top right, bottom right and bottom left. Default value: all rounded corner ("1111"). - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param array $border_style Border style of rectangle. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). - * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). - * @access public - * @since 4.9.019 (2010-04-22) - */ - public function RoundedRectXY($x, $y, $w, $h, $rx, $ry, $round_corner='1111', $style='', $border_style=array(), $fill_color=array()) { - if (($round_corner == '0000') OR (($rx == $ry) AND ($rx == 0))) { - // Not rounded - $this->Rect($x, $y, $w, $h, $style, $border_style, $fill_color); - return; - } - // Rounded - if (!(false === strpos($style, 'F')) AND isset($fill_color)) { - $this->SetFillColorArray($fill_color); - } - $op = $this->getPathPaintOperator($style); - if ($op == 'f') { - $border_style = array(); - } - if ($border_style) { - $this->SetLineStyle($border_style); - } - $MyArc = 4 / 3 * (sqrt(2) - 1); - $this->_outPoint($x + $rx, $y); - $xc = $x + $w - $rx; - $yc = $y + $ry; - $this->_outLine($xc, $y); - if ($round_corner[0]) { - $this->_outCurve($xc + ($rx * $MyArc), $yc - $ry, $xc + $rx, $yc - ($ry * $MyArc), $xc + $rx, $yc); - } else { - $this->_outLine($x + $w, $y); - } - $xc = $x + $w - $rx; - $yc = $y + $h - $ry; - $this->_outLine($x + $w, $yc); - if ($round_corner[1]) { - $this->_outCurve($xc + $rx, $yc + ($ry * $MyArc), $xc + ($rx * $MyArc), $yc + $ry, $xc, $yc + $ry); - } else { - $this->_outLine($x + $w, $y + $h); - } - $xc = $x + $rx; - $yc = $y + $h - $ry; - $this->_outLine($xc, $y + $h); - if ($round_corner[2]) { - $this->_outCurve($xc - ($rx * $MyArc), $yc + $ry, $xc - $rx, $yc + ($ry * $MyArc), $xc - $rx, $yc); - } else { - $this->_outLine($x, $y + $h); - } - $xc = $x + $rx; - $yc = $y + $ry; - $this->_outLine($x, $yc); - if ($round_corner[3]) { - $this->_outCurve($xc - $rx, $yc - ($ry * $MyArc), $xc - ($rx * $MyArc), $yc - $ry, $xc, $yc - $ry); - } else { - $this->_outLine($x, $y); - $this->_outLine($x + $rx, $y); - } - $this->_out($op); - } - - /** - * Draws a grahic arrow. - * @param float $x0 Abscissa of first point. - * @param float $y0 Ordinate of first point. - * @param float $x0 Abscissa of second point. - * @param float $y1 Ordinate of second point. - * @param int $head_style (0 = draw only arrowhead arms, 1 = draw closed arrowhead, but no fill, 2 = closed and filled arrowhead, 3 = filled arrowhead) - * @param float $arm_size length of arrowhead arms - * @param int $arm_angle angle between an arm and the shaft - * @author Piotr Galecki, Nicola Asuni, Andy Meier - * @since 4.6.018 (2009-07-10) - */ - public function Arrow($x0, $y0, $x1, $y1, $head_style=0, $arm_size=5, $arm_angle=15) { - // getting arrow direction angle - // 0 deg angle is when both arms go along X axis. angle grows clockwise. - $dir_angle = atan2(($y0 - $y1), ($x0 - $x1)); - if ($dir_angle < 0) { - $dir_angle += (2 * M_PI); - } - $arm_angle = deg2rad($arm_angle); - $sx1 = $x1; - $sy1 = $y1; - if ($head_style > 0) { - // calculate the stopping point for the arrow shaft - $sx1 = $x1 + (($arm_size - $this->LineWidth) * cos($dir_angle)); - $sy1 = $y1 + (($arm_size - $this->LineWidth) * sin($dir_angle)); - } - // main arrow line / shaft - $this->Line($x0, $y0, $sx1, $sy1); - // left arrowhead arm tip - $x2L = $x1 + ($arm_size * cos($dir_angle + $arm_angle)); - $y2L = $y1 + ($arm_size * sin($dir_angle + $arm_angle)); - // right arrowhead arm tip - $x2R = $x1 + ($arm_size * cos($dir_angle - $arm_angle)); - $y2R = $y1 + ($arm_size * sin($dir_angle - $arm_angle)); - $mode = 'D'; - $style = array(); - switch ($head_style) { - case 0: { - // draw only arrowhead arms - $mode = 'D'; - $style = array(1, 1, 0); - break; - } - case 1: { - // draw closed arrowhead, but no fill - $mode = 'D'; - break; - } - case 2: { - // closed and filled arrowhead - $mode = 'DF'; - break; - } - case 3: { - // filled arrowhead - $mode = 'F'; - break; - } - } - $this->Polygon(array($x2L, $y2L, $x1, $y1, $x2R, $y2R), $mode, $style, array()); - } - - // END GRAPHIC FUNCTIONS SECTION ----------------------- - - // BIDIRECTIONAL TEXT SECTION -------------------------- - - /** - * Reverse the RLT substrings using the Bidirectional Algorithm (http://unicode.org/reports/tr9/). - * @param string $str string to manipulate. - * @param bool $setbom if true set the Byte Order Mark (BOM = 0xFEFF) - * @param bool $forcertl if true forces RTL text direction - * @return string - * @access protected - * @author Nicola Asuni - * @since 2.1.000 (2008-01-08) - */ - protected function utf8StrRev($str, $setbom=false, $forcertl=false) { - return $this->utf8StrArrRev($this->UTF8StringToArray($str), $str, $setbom, $forcertl); - } - - /** - * Reverse the RLT substrings array using the Bidirectional Algorithm (http://unicode.org/reports/tr9/). - * @param array $arr array of unicode values. - * @param string $str string to manipulate (or empty value). - * @param bool $setbom if true set the Byte Order Mark (BOM = 0xFEFF) - * @param bool $forcertl if true forces RTL text direction - * @return string - * @access protected - * @author Nicola Asuni - * @since 4.9.000 (2010-03-27) - */ - protected function utf8StrArrRev($arr, $str='', $setbom=false, $forcertl=false) { - return $this->arrUTF8ToUTF16BE($this->utf8Bidi($arr, $str, $forcertl), $setbom); - } - - /** - * Reverse the RLT substrings using the Bidirectional Algorithm (http://unicode.org/reports/tr9/). - * @param array $ta array of characters composing the string. - * @param string $str string to process - * @param bool $forcertl if 'R' forces RTL, if 'L' forces LTR - * @return array of unicode chars - * @author Nicola Asuni - * @access protected - * @since 2.4.000 (2008-03-06) - */ - protected function utf8Bidi($ta, $str='', $forcertl=false) { - // paragraph embedding level - $pel = 0; - // max level - $maxlevel = 0; - if ($this->empty_string($str)) { - // create string from array - $str = $this->UTF8ArrSubString($ta); - } - // check if string contains arabic text - if (preg_match($this->unicode->uni_RE_PATTERN_ARABIC, $str)) { - $arabic = true; - } else { - $arabic = false; - } - // check if string contains RTL text - if (!($forcertl OR $arabic OR preg_match($this->unicode->uni_RE_PATTERN_RTL, $str))) { - return $ta; - } - - // get number of chars - $numchars = count($ta); - - if ($forcertl == 'R') { - $pel = 1; - } elseif ($forcertl == 'L') { - $pel = 0; - } else { - // P2. In each paragraph, find the first character of type L, AL, or R. - // P3. If a character is found in P2 and it is of type AL or R, then set the paragraph embedding level to one; otherwise, set it to zero. - for ($i=0; $i < $numchars; ++$i) { - $type = $this->unicode->uni_type[$ta[$i]]; - if ($type == 'L') { - $pel = 0; - break; - } elseif (($type == 'AL') OR ($type == 'R')) { - $pel = 1; - break; - } - } - } - - // Current Embedding Level - $cel = $pel; - // directional override status - $dos = 'N'; - $remember = array(); - // start-of-level-run - $sor = $pel % 2 ? 'R' : 'L'; - $eor = $sor; - - // Array of characters data - $chardata = Array(); - - // X1. Begin by setting the current embedding level to the paragraph embedding level. Set the directional override status to neutral. Process each character iteratively, applying rules X2 through X9. Only embedding levels from 0 to 61 are valid in this phase. - // In the resolution of levels in rules I1 and I2, the maximum embedding level of 62 can be reached. - for ($i=0; $i < $numchars; ++$i) { - if ($ta[$i] == $this->unicode->uni_RLE) { - // X2. With each RLE, compute the least greater odd embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + ($cel % 2) + 1; - if ($next_level < 62) { - $remember[] = array('num' => $this->unicode->uni_RLE, 'cel' => $cel, 'dos' => $dos); - $cel = $next_level; - $dos = 'N'; - $sor = $eor; - $eor = $cel % 2 ? 'R' : 'L'; - } - } elseif ($ta[$i] == $this->unicode->uni_LRE) { - // X3. With each LRE, compute the least greater even embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + 2 - ($cel % 2); - if ( $next_level < 62 ) { - $remember[] = array('num' => $this->unicode->uni_LRE, 'cel' => $cel, 'dos' => $dos); - $cel = $next_level; - $dos = 'N'; - $sor = $eor; - $eor = $cel % 2 ? 'R' : 'L'; - } - } elseif ($ta[$i] == $this->unicode->uni_RLO) { - // X4. With each RLO, compute the least greater odd embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to right-to-left. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + ($cel % 2) + 1; - if ($next_level < 62) { - $remember[] = array('num' => $this->unicode->uni_RLO, 'cel' => $cel, 'dos' => $dos); - $cel = $next_level; - $dos = 'R'; - $sor = $eor; - $eor = $cel % 2 ? 'R' : 'L'; - } - } elseif ($ta[$i] == $this->unicode->uni_LRO) { - // X5. With each LRO, compute the least greater even embedding level. - // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to left-to-right. - // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. - $next_level = $cel + 2 - ($cel % 2); - if ( $next_level < 62 ) { - $remember[] = array('num' => $this->unicode->uni_LRO, 'cel' => $cel, 'dos' => $dos); - $cel = $next_level; - $dos = 'L'; - $sor = $eor; - $eor = $cel % 2 ? 'R' : 'L'; - } - } elseif ($ta[$i] == $this->unicode->uni_PDF) { - // X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override. - if (count($remember)) { - $last = count($remember ) - 1; - if (($remember[$last]['num'] == $this->unicode->uni_RLE) OR - ($remember[$last]['num'] == $this->unicode->uni_LRE) OR - ($remember[$last]['num'] == $this->unicode->uni_RLO) OR - ($remember[$last]['num'] == $this->unicode->uni_LRO)) { - $match = array_pop($remember); - $cel = $match['cel']; - $dos = $match['dos']; - $sor = $eor; - $eor = ($cel > $match['cel'] ? $cel : $match['cel']) % 2 ? 'R' : 'L'; - } - } - } elseif (($ta[$i] != $this->unicode->uni_RLE) AND - ($ta[$i] != $this->unicode->uni_LRE) AND - ($ta[$i] != $this->unicode->uni_RLO) AND - ($ta[$i] != $this->unicode->uni_LRO) AND - ($ta[$i] != $this->unicode->uni_PDF)) { - // X6. For all types besides RLE, LRE, RLO, LRO, and PDF: - // a. Set the level of the current character to the current embedding level. - // b. Whenever the directional override status is not neutral, reset the current character type to the directional override status. - if ($dos != 'N') { - $chardir = $dos; - } else { - if (isset($this->unicode->uni_type[$ta[$i]])) { - $chardir = $this->unicode->uni_type[$ta[$i]]; - } else { - $chardir = 'L'; - } - } - // stores string characters and other information - $chardata[] = array('char' => $ta[$i], 'level' => $cel, 'type' => $chardir, 'sor' => $sor, 'eor' => $eor); - } - } // end for each char - - // X8. All explicit directional embeddings and overrides are completely terminated at the end of each paragraph. Paragraph separators are not included in the embedding. - // X9. Remove all RLE, LRE, RLO, LRO, PDF, and BN codes. - // X10. The remaining rules are applied to each run of characters at the same level. For each run, determine the start-of-level-run (sor) and end-of-level-run (eor) type, either L or R. This depends on the higher of the two levels on either side of the boundary (at the start or end of the paragraph, the level of the 'other' run is the base embedding level). If the higher level is odd, the type is R; otherwise, it is L. - - // 3.3.3 Resolving Weak Types - // Weak types are now resolved one level run at a time. At level run boundaries where the type of the character on the other side of the boundary is required, the type assigned to sor or eor is used. - // Nonspacing marks are now resolved based on the previous characters. - $numchars = count($chardata); - - // W1. Examine each nonspacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor. - $prevlevel = -1; // track level changes - $levcount = 0; // counts consecutive chars at the same level - for ($i=0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == 'NSM') { - if ($levcount) { - $chardata[$i]['type'] = $chardata[$i]['sor']; - } elseif ($i > 0) { - $chardata[$i]['type'] = $chardata[($i-1)]['type']; - } - } - if ($chardata[$i]['level'] != $prevlevel) { - $levcount = 0; - } else { - ++$levcount; - } - $prevlevel = $chardata[$i]['level']; - } - - // W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sor) is found. If an AL is found, change the type of the European number to Arabic number. - $prevlevel = -1; - $levcount = 0; - for ($i=0; $i < $numchars; ++$i) { - if ($chardata[$i]['char'] == 'EN') { - for ($j=$levcount; $j >= 0; $j--) { - if ($chardata[$j]['type'] == 'AL') { - $chardata[$i]['type'] = 'AN'; - } elseif (($chardata[$j]['type'] == 'L') OR ($chardata[$j]['type'] == 'R')) { - break; - } - } - } - if ($chardata[$i]['level'] != $prevlevel) { - $levcount = 0; - } else { - ++$levcount; - } - $prevlevel = $chardata[$i]['level']; - } - - // W3. Change all ALs to R. - for ($i=0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == 'AL') { - $chardata[$i]['type'] = 'R'; - } - } - - // W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type. - $prevlevel = -1; - $levcount = 0; - for ($i=0; $i < $numchars; ++$i) { - if (($levcount > 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) { - if (($chardata[$i]['type'] == 'ES') AND ($chardata[($i-1)]['type'] == 'EN') AND ($chardata[($i+1)]['type'] == 'EN')) { - $chardata[$i]['type'] = 'EN'; - } elseif (($chardata[$i]['type'] == 'CS') AND ($chardata[($i-1)]['type'] == 'EN') AND ($chardata[($i+1)]['type'] == 'EN')) { - $chardata[$i]['type'] = 'EN'; - } elseif (($chardata[$i]['type'] == 'CS') AND ($chardata[($i-1)]['type'] == 'AN') AND ($chardata[($i+1)]['type'] == 'AN')) { - $chardata[$i]['type'] = 'AN'; - } - } - if ($chardata[$i]['level'] != $prevlevel) { - $levcount = 0; - } else { - ++$levcount; - } - $prevlevel = $chardata[$i]['level']; - } - - // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers. - $prevlevel = -1; - $levcount = 0; - for ($i=0; $i < $numchars; ++$i) { - if ($chardata[$i]['type'] == 'ET') { - if (($levcount > 0) AND ($chardata[($i-1)]['type'] == 'EN')) { - $chardata[$i]['type'] = 'EN'; - } else { - $j = $i+1; - while (($j < $numchars) AND ($chardata[$j]['level'] == $prevlevel)) { - if ($chardata[$j]['type'] == 'EN') { - $chardata[$i]['type'] = 'EN'; - break; - } elseif ($chardata[$j]['type'] != 'ET') { - break; - } - ++$j; - } - } - } - if ($chardata[$i]['level'] != $prevlevel) { - $levcount = 0; - } else { - ++$levcount; - } - $prevlevel = $chardata[$i]['level']; - } - - // W6. Otherwise, separators and terminators change to Other Neutral. - $prevlevel = -1; - $levcount = 0; - for ($i=0; $i < $numchars; ++$i) { - if (($chardata[$i]['type'] == 'ET') OR ($chardata[$i]['type'] == 'ES') OR ($chardata[$i]['type'] == 'CS')) { - $chardata[$i]['type'] = 'ON'; - } - if ($chardata[$i]['level'] != $prevlevel) { - $levcount = 0; - } else { - ++$levcount; - } - $prevlevel = $chardata[$i]['level']; - } - - //W7. Search backward from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L. - $prevlevel = -1; - $levcount = 0; - for ($i=0; $i < $numchars; ++$i) { - if ($chardata[$i]['char'] == 'EN') { - for ($j=$levcount; $j >= 0; $j--) { - if ($chardata[$j]['type'] == 'L') { - $chardata[$i]['type'] = 'L'; - } elseif ($chardata[$j]['type'] == 'R') { - break; - } - } - } - if ($chardata[$i]['level'] != $prevlevel) { - $levcount = 0; - } else { - ++$levcount; - } - $prevlevel = $chardata[$i]['level']; - } - - // N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers act as if they were R in terms of their influence on neutrals. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries. - $prevlevel = -1; - $levcount = 0; - for ($i=0; $i < $numchars; ++$i) { - if (($levcount > 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) { - if (($chardata[$i]['type'] == 'N') AND ($chardata[($i-1)]['type'] == 'L') AND ($chardata[($i+1)]['type'] == 'L')) { - $chardata[$i]['type'] = 'L'; - } elseif (($chardata[$i]['type'] == 'N') AND - (($chardata[($i-1)]['type'] == 'R') OR ($chardata[($i-1)]['type'] == 'EN') OR ($chardata[($i-1)]['type'] == 'AN')) AND - (($chardata[($i+1)]['type'] == 'R') OR ($chardata[($i+1)]['type'] == 'EN') OR ($chardata[($i+1)]['type'] == 'AN'))) { - $chardata[$i]['type'] = 'R'; - } elseif ($chardata[$i]['type'] == 'N') { - // N2. Any remaining neutrals take the embedding direction - $chardata[$i]['type'] = $chardata[$i]['sor']; - } - } elseif (($levcount == 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) { - // first char - if (($chardata[$i]['type'] == 'N') AND ($chardata[$i]['sor'] == 'L') AND ($chardata[($i+1)]['type'] == 'L')) { - $chardata[$i]['type'] = 'L'; - } elseif (($chardata[$i]['type'] == 'N') AND - (($chardata[$i]['sor'] == 'R') OR ($chardata[$i]['sor'] == 'EN') OR ($chardata[$i]['sor'] == 'AN')) AND - (($chardata[($i+1)]['type'] == 'R') OR ($chardata[($i+1)]['type'] == 'EN') OR ($chardata[($i+1)]['type'] == 'AN'))) { - $chardata[$i]['type'] = 'R'; - } elseif ($chardata[$i]['type'] == 'N') { - // N2. Any remaining neutrals take the embedding direction - $chardata[$i]['type'] = $chardata[$i]['sor']; - } - } elseif (($levcount > 0) AND ((($i+1) == $numchars) OR (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] != $prevlevel))) { - //last char - if (($chardata[$i]['type'] == 'N') AND ($chardata[($i-1)]['type'] == 'L') AND ($chardata[$i]['eor'] == 'L')) { - $chardata[$i]['type'] = 'L'; - } elseif (($chardata[$i]['type'] == 'N') AND - (($chardata[($i-1)]['type'] == 'R') OR ($chardata[($i-1)]['type'] == 'EN') OR ($chardata[($i-1)]['type'] == 'AN')) AND - (($chardata[$i]['eor'] == 'R') OR ($chardata[$i]['eor'] == 'EN') OR ($chardata[$i]['eor'] == 'AN'))) { - $chardata[$i]['type'] = 'R'; - } elseif ($chardata[$i]['type'] == 'N') { - // N2. Any remaining neutrals take the embedding direction - $chardata[$i]['type'] = $chardata[$i]['sor']; - } - } elseif ($chardata[$i]['type'] == 'N') { - // N2. Any remaining neutrals take the embedding direction - $chardata[$i]['type'] = $chardata[$i]['sor']; - } - if ($chardata[$i]['level'] != $prevlevel) { - $levcount = 0; - } else { - ++$levcount; - } - $prevlevel = $chardata[$i]['level']; - } - - // I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels. - // I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level. - for ($i=0; $i < $numchars; ++$i) { - $odd = $chardata[$i]['level'] % 2; - if ($odd) { - if (($chardata[$i]['type'] == 'L') OR ($chardata[$i]['type'] == 'AN') OR ($chardata[$i]['type'] == 'EN')) { - $chardata[$i]['level'] += 1; - } - } else { - if ($chardata[$i]['type'] == 'R') { - $chardata[$i]['level'] += 1; - } elseif (($chardata[$i]['type'] == 'AN') OR ($chardata[$i]['type'] == 'EN')) { - $chardata[$i]['level'] += 2; - } - } - $maxlevel = max($chardata[$i]['level'],$maxlevel); - } - - // L1. On each line, reset the embedding level of the following characters to the paragraph embedding level: - // 1. Segment separators, - // 2. Paragraph separators, - // 3. Any sequence of whitespace characters preceding a segment separator or paragraph separator, and - // 4. Any sequence of white space characters at the end of the line. - for ($i=0; $i < $numchars; ++$i) { - if (($chardata[$i]['type'] == 'B') OR ($chardata[$i]['type'] == 'S')) { - $chardata[$i]['level'] = $pel; - } elseif ($chardata[$i]['type'] == 'WS') { - $j = $i+1; - while ($j < $numchars) { - if ((($chardata[$j]['type'] == 'B') OR ($chardata[$j]['type'] == 'S')) OR - (($j == ($numchars-1)) AND ($chardata[$j]['type'] == 'WS'))) { - $chardata[$i]['level'] = $pel; - break; - } elseif ($chardata[$j]['type'] != 'WS') { - break; - } - ++$j; - } - } - } - - // Arabic Shaping - // Cursively connected scripts, such as Arabic or Syriac, require the selection of positional character shapes that depend on adjacent characters. Shaping is logically applied after the Bidirectional Algorithm is used and is limited to characters within the same directional run. - if ($arabic) { - $endedletter = array(1569,1570,1571,1572,1573,1575,1577,1583,1584,1585,1586,1608,1688); - $alfletter = array(1570,1571,1573,1575); - $chardata2 = $chardata; - $laaletter = false; - $charAL = array(); - $x = 0; - for ($i=0; $i < $numchars; ++$i) { - if (($this->unicode->uni_type[$chardata[$i]['char']] == 'AL') OR ($chardata[$i]['char'] == 32) OR ($chardata[$i]['char'] == 8204)) { - $charAL[$x] = $chardata[$i]; - $charAL[$x]['i'] = $i; - $chardata[$i]['x'] = $x; - ++$x; - } - } - $numAL = $x; - for ($i=0; $i < $numchars; ++$i) { - $thischar = $chardata[$i]; - if ($i > 0) { - $prevchar = $chardata[($i-1)]; - } else { - $prevchar = false; - } - if (($i+1) < $numchars) { - $nextchar = $chardata[($i+1)]; - } else { - $nextchar = false; - } - if ($this->unicode->uni_type[$thischar['char']] == 'AL') { - $x = $thischar['x']; - if ($x > 0) { - $prevchar = $charAL[($x-1)]; - } else { - $prevchar = false; - } - if (($x+1) < $numAL) { - $nextchar = $charAL[($x+1)]; - } else { - $nextchar = false; - } - // if laa letter - if (($prevchar !== false) AND ($prevchar['char'] == 1604) AND (in_array($thischar['char'], $alfletter))) { - $arabicarr = $this->unicode->uni_laa_array; - $laaletter = true; - if ($x > 1) { - $prevchar = $charAL[($x-2)]; - } else { - $prevchar = false; - } - } else { - $arabicarr = $this->unicode->uni_arabicsubst; - $laaletter = false; - } - if (($prevchar !== false) AND ($nextchar !== false) AND - (($this->unicode->uni_type[$prevchar['char']] == 'AL') OR ($this->unicode->uni_type[$prevchar['char']] == 'NSM')) AND - (($this->unicode->uni_type[$nextchar['char']] == 'AL') OR ($this->unicode->uni_type[$nextchar['char']] == 'NSM')) AND - ($prevchar['type'] == $thischar['type']) AND - ($nextchar['type'] == $thischar['type']) AND - ($nextchar['char'] != 1567)) { - if (in_array($prevchar['char'], $endedletter)) { - if (isset($arabicarr[$thischar['char']][2])) { - // initial - $chardata2[$i]['char'] = $arabicarr[$thischar['char']][2]; - } - } else { - if (isset($arabicarr[$thischar['char']][3])) { - // medial - $chardata2[$i]['char'] = $arabicarr[$thischar['char']][3]; - } - } - } elseif (($nextchar !== false) AND - (($this->unicode->uni_type[$nextchar['char']] == 'AL') OR ($this->unicode->uni_type[$nextchar['char']] == 'NSM')) AND - ($nextchar['type'] == $thischar['type']) AND - ($nextchar['char'] != 1567)) { - if (isset($arabicarr[$chardata[$i]['char']][2])) { - // initial - $chardata2[$i]['char'] = $arabicarr[$thischar['char']][2]; - } - } elseif ((($prevchar !== false) AND - (($this->unicode->uni_type[$prevchar['char']] == 'AL') OR ($this->unicode->uni_type[$prevchar['char']] == 'NSM')) AND - ($prevchar['type'] == $thischar['type'])) OR - (($nextchar !== false) AND ($nextchar['char'] == 1567))) { - // final - if (($i > 1) AND ($thischar['char'] == 1607) AND - ($chardata[$i-1]['char'] == 1604) AND - ($chardata[$i-2]['char'] == 1604)) { - //Allah Word - // mark characters to delete with false - $chardata2[$i-2]['char'] = false; - $chardata2[$i-1]['char'] = false; - $chardata2[$i]['char'] = 65010; - } else { - if (($prevchar !== false) AND in_array($prevchar['char'], $endedletter)) { - if (isset($arabicarr[$thischar['char']][0])) { - // isolated - $chardata2[$i]['char'] = $arabicarr[$thischar['char']][0]; - } - } else { - if (isset($arabicarr[$thischar['char']][1])) { - // final - $chardata2[$i]['char'] = $arabicarr[$thischar['char']][1]; - } - } - } - } elseif (isset($arabicarr[$thischar['char']][0])) { - // isolated - $chardata2[$i]['char'] = $arabicarr[$thischar['char']][0]; - } - // if laa letter - if ($laaletter) { - // mark characters to delete with false - $chardata2[($charAL[($x-1)]['i'])]['char'] = false; - } - } // end if AL (Arabic Letter) - } // end for each char - /* - * Combining characters that can occur with Arabic Shadda (0651 HEX, 1617 DEC) are replaced. - * Putting the combining mark and shadda in the same glyph allows us to avoid the two marks overlapping each other in an illegible manner. - */ - $cw = &$this->CurrentFont['cw']; - for ($i = 0; $i < ($numchars-1); ++$i) { - if (($chardata2[$i]['char'] == 1617) AND (isset($this->unicode->uni_diacritics[($chardata2[$i+1]['char'])]))) { - // check if the subtitution font is defined on current font - if (isset($cw[($this->unicode->uni_diacritics[($chardata2[$i+1]['char'])])])) { - $chardata2[$i]['char'] = false; - $chardata2[$i+1]['char'] = $this->unicode->uni_diacritics[($chardata2[$i+1]['char'])]; - } - } - } - // remove marked characters - foreach ($chardata2 as $key => $value) { - if ($value['char'] === false) { - unset($chardata2[$key]); - } - } - $chardata = array_values($chardata2); - $numchars = count($chardata); - unset($chardata2); - unset($arabicarr); - unset($laaletter); - unset($charAL); - } - - // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher. - for ($j=$maxlevel; $j > 0; $j--) { - $ordarray = Array(); - $revarr = Array(); - $onlevel = false; - for ($i=0; $i < $numchars; ++$i) { - if ($chardata[$i]['level'] >= $j) { - $onlevel = true; - if (isset($this->unicode->uni_mirror[$chardata[$i]['char']])) { - // L4. A character is depicted by a mirrored glyph if and only if (a) the resolved directionality of that character is R, and (b) the Bidi_Mirrored property value of that character is true. - $chardata[$i]['char'] = $this->unicode->uni_mirror[$chardata[$i]['char']]; - } - $revarr[] = $chardata[$i]; - } else { - if ($onlevel) { - $revarr = array_reverse($revarr); - $ordarray = array_merge($ordarray, $revarr); - $revarr = Array(); - $onlevel = false; - } - $ordarray[] = $chardata[$i]; - } - } - if ($onlevel) { - $revarr = array_reverse($revarr); - $ordarray = array_merge($ordarray, $revarr); - } - $chardata = $ordarray; - } - - $ordarray = array(); - for ($i=0; $i < $numchars; ++$i) { - $ordarray[] = $chardata[$i]['char']; - // store char values for subsetting - $this->CurrentFont['subsetchars'][$chardata[$i]['char']] = true; - } - // update font subsetchars - $this->setFontSubBuffer($this->CurrentFont['fontkey'], 'subsetchars', $this->CurrentFont['subsetchars']); - return $ordarray; - } - - // END OF BIDIRECTIONAL TEXT SECTION ------------------- - - /** - * Adds a bookmark. - * @param string $txt bookmark description. - * @param int $level bookmark level (minimum value is 0). - * @param float $y Y position in user units of the bookmark on the selected page (default = -1 = current position; 0 = page start;). - * @param int $page target page number (leave empty for current page). - * @access public - * @author Olivier Plathey, Nicola Asuni - * @since 2.1.002 (2008-02-12) - */ - public function Bookmark($txt, $level=0, $y=-1, $page='') { - if ($level < 0) { - $level = 0; - } - if (isset($this->outlines[0])) { - $lastoutline = end($this->outlines); - $maxlevel = $lastoutline['l'] + 1; - } else { - $maxlevel = 0; - } - if ($level > $maxlevel) { - $level = $maxlevel; - } - if ($y == -1) { - $y = $this->GetY(); - } - if (empty($page)) { - $page = $this->PageNo(); - if (empty($page)) { - return; - } - } - $this->outlines[] = array('t' => $txt, 'l' => $level, 'y' => $y, 'p' => $page); - } - - /** - * Create a bookmark PDF string. - * @access protected - * @author Olivier Plathey, Nicola Asuni - * @since 2.1.002 (2008-02-12) - */ - protected function _putbookmarks() { - $nb = count($this->outlines); - if ($nb == 0) { - return; - } - // get sorting columns - $outline_p = array(); - $outline_y = array(); - foreach ($this->outlines as $key => $row) { - $outline_p[$key] = $row['p']; - $outline_k[$key] = $key; - } - // sort outlines by page and original position - array_multisort($outline_p, SORT_NUMERIC, SORT_ASC, $outline_k, SORT_NUMERIC, SORT_ASC, $this->outlines); - $lru = array(); - $level = 0; - foreach ($this->outlines as $i => $o) { - if ($o['l'] > 0) { - $parent = $lru[($o['l'] - 1)]; - //Set parent and last pointers - $this->outlines[$i]['parent'] = $parent; - $this->outlines[$parent]['last'] = $i; - if ($o['l'] > $level) { - //Level increasing: set first pointer - $this->outlines[$parent]['first'] = $i; - } - } else { - $this->outlines[$i]['parent'] = $nb; - } - if (($o['l'] <= $level) AND ($i > 0)) { - //Set prev and next pointers - $prev = $lru[$o['l']]; - $this->outlines[$prev]['next'] = $i; - $this->outlines[$i]['prev'] = $prev; - } - $lru[$o['l']] = $i; - $level = $o['l']; - } - //Outline items - $n = $this->n + 1; - $nltags = '/|<\/(blockquote|dd|dl|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|p|pre|ul|tcpdf|table|tr|td)>/si'; - foreach ($this->outlines as $i => $o) { - if (isset($this->page_obj_id[($o['p'])])) { - $oid = $this->_newobj(); - // covert HTML title to string - $title = preg_replace($nltags, "\n", $o['t']); - $title = preg_replace("/[\r]+/si", '', $title); - $title = preg_replace("/[\n]+/si", "\n", $title); - $title = strip_tags($title); - $title = $this->stringTrim($title); - $out = '<_textstring($title, $oid); - $out .= ' /Parent '.($n + $o['parent']).' 0 R'; - if (isset($o['prev'])) { - $out .= ' /Prev '.($n + $o['prev']).' 0 R'; - } - if (isset($o['next'])) { - $out .= ' /Next '.($n + $o['next']).' 0 R'; - } - if (isset($o['first'])) { - $out .= ' /First '.($n + $o['first']).' 0 R'; - } - if (isset($o['last'])) { - $out .= ' /Last '.($n + $o['last']).' 0 R'; - } - $out .= ' '.sprintf('/Dest [%u 0 R /XYZ 0 %.2F null]', $this->page_obj_id[($o['p'])], ($this->pagedim[$o['p']]['h'] - ($o['y'] * $this->k))); - $out .= ' /Count 0 >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - } - //Outline root - $this->OutlineRoot = $this->_newobj(); - $this->_out('<< /Type /Outlines /First '.$n.' 0 R /Last '.($n + $lru[0]).' 0 R >>'."\n".'endobj'); - } - - // --- JAVASCRIPT ------------------------------------------------------ - - /** - * Adds a javascript - * @param string $script Javascript code - * @access public - * @author Johannes Güntert, Nicola Asuni - * @since 2.1.002 (2008-02-12) - */ - public function IncludeJS($script) { - $this->javascript .= $script; - } - - /** - * Adds a javascript object and return object ID - * @param string $script Javascript code - * @param boolean $onload if true executes this object when opening the document - * @return int internal object ID - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-07) - */ - public function addJavascriptObject($script, $onload=false) { - ++$this->n; - $this->js_objects[$this->n] = array('n' => $this->n, 'js' => $script, 'onload' => $onload); - return $this->n; - } - - /** - * Create a javascript PDF string. - * @access protected - * @author Johannes Güntert, Nicola Asuni - * @since 2.1.002 (2008-02-12) - */ - protected function _putjavascript() { - if (empty($this->javascript) AND empty($this->js_objects)) { - return; - } - if (strpos($this->javascript, 'this.addField') > 0) { - if (!$this->ur['enabled']) { - //$this->setUserRights(); - } - // the following two lines are used to avoid form fields duplication after saving - // The addField method only works when releasing user rights (UR3) - $jsa = sprintf("ftcpdfdocsaved=this.addField('%s','%s',%d,[%.2F,%.2F,%.2F,%.2F]);", 'tcpdfdocsaved', 'text', 0, 0, 1, 0, 1); - $jsb = "getField('tcpdfdocsaved').value='saved';"; - $this->javascript = $jsa."\n".$this->javascript."\n".$jsb; - } - $this->n_js = $this->_newobj(); - $out = ' << /Names ['; - if (!empty($this->javascript)) { - $out .= ' (EmbeddedJS) '.($this->n + 1).' 0 R'; - } - if (!empty($this->js_objects)) { - foreach ($this->js_objects as $key => $val) { - if ($val['onload']) { - $out .= ' (JS'.$key.') '.$key.' 0 R'; - } - } - } - $out .= ' ] >>'; - $out .= "\n".'endobj'; - $this->_out($out); - // default Javascript object - if (!empty($this->javascript)) { - $obj_id = $this->_newobj(); - $out = '<< /S /JavaScript'; - $out .= ' /JS '.$this->_textstring($this->javascript, $obj_id); - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - // additional Javascript objects - if (!empty($this->js_objects)) { - foreach ($this->js_objects as $key => $val) { - $out = $this->_getobj($key)."\n".' << /S /JavaScript /JS '.$this->_textstring($val['js'], $key).' >>'."\n".'endobj'; - $this->_out($out); - } - } - } - - /** - * Convert color to javascript color. - * @param string $color color name or #RRGGBB - * @access protected - * @author Denis Van Nuffelen, Nicola Asuni - * @since 2.1.002 (2008-02-12) - */ - protected function _JScolor($color) { - static $aColors = array('transparent', 'black', 'white', 'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'dkGray', 'gray', 'ltGray'); - if (substr($color,0,1) == '#') { - return sprintf("['RGB',%.3F,%.3F,%.3F]", hexdec(substr($color,1,2))/255, hexdec(substr($color,3,2))/255, hexdec(substr($color,5,2))/255); - } - if (!in_array($color,$aColors)) { - $this->Error('Invalid color: '.$color); - } - return 'color.'.$color; - } - - /** - * Adds a javascript form field. - * @param string $type field type - * @param string $name field name - * @param int $x horizontal position - * @param int $y vertical position - * @param int $w width - * @param int $h height - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @access protected - * @author Denis Van Nuffelen, Nicola Asuni - * @since 2.1.002 (2008-02-12) - */ - protected function _addfield($type, $name, $x, $y, $w, $h, $prop) { - if ($this->rtl) { - $x = $x - $w; - } - // the followind avoid fields duplication after saving the document - $this->javascript .= "if(getField('tcpdfdocsaved').value != 'saved') {"; - $k = $this->k; - $this->javascript .= sprintf("f".$name."=this.addField('%s','%s',%u,[%.2F,%.2F,%.2F,%.2F]);", $name, $type, $this->PageNo()-1, $x*$k, ($this->h-$y)*$k+1, ($x+$w)*$k, ($this->h-$y-$h)*$k+1)."\n"; - $this->javascript .= 'f'.$name.'.textSize='.$this->FontSizePt.";\n"; - while (list($key, $val) = each($prop)) { - if (strcmp(substr($key, -5), 'Color') == 0) { - $val = $this->_JScolor($val); - } else { - $val = "'".$val."'"; - } - $this->javascript .= 'f'.$name.'.'.$key.'='.$val.";\n"; - } - if ($this->rtl) { - $this->x -= $w; - } else { - $this->x += $w; - } - $this->javascript .= '}'; - } - - // --- FORM FIELDS ----------------------------------------------------- - - /** - * Convert JavaScript form fields properties array to Annotation Properties array. - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @return array of annotation properties - * @access protected - * @author Nicola Asuni - * @since 4.8.000 (2009-09-06) - */ - protected function getAnnotOptFromJSProp($prop) { - if (isset($prop['aopt']) AND is_array($prop['aopt'])) { - // the annotation options area lready defined - return $prop['aopt']; - } - $opt = array(); // value to be returned - // alignment: Controls how the text is laid out within the text field. - if (isset($prop['alignment'])) { - switch ($prop['alignment']) { - case 'left': { - $opt['q'] = 0; - break; - } - case 'center': { - $opt['q'] = 1; - break; - } - case 'right': { - $opt['q'] = 2; - break; - } - default: { - $opt['q'] = ($this->rtl)?2:0; - break; - } - } - } - // lineWidth: Specifies the thickness of the border when stroking the perimeter of a field's rectangle. - if (isset($prop['lineWidth'])) { - $linewidth = intval($prop['lineWidth']); - } else { - $linewidth = 1; - } - // borderStyle: The border style for a field. - if (isset($prop['borderStyle'])) { - switch ($prop['borderStyle']) { - case 'border.d': - case 'dashed': { - $opt['border'] = array(0, 0, $linewidth, array(3, 2)); - $opt['bs'] = array('w'=>$linewidth, 's'=>'D', 'd'=>array(3, 2)); - break; - } - case 'border.b': - case 'beveled': { - $opt['border'] = array(0, 0, $linewidth); - $opt['bs'] = array('w'=>$linewidth, 's'=>'B'); - break; - } - case 'border.i': - case 'inset': { - $opt['border'] = array(0, 0, $linewidth); - $opt['bs'] = array('w'=>$linewidth, 's'=>'I'); - break; - } - case 'border.u': - case 'underline': { - $opt['border'] = array(0, 0, $linewidth); - $opt['bs'] = array('w'=>$linewidth, 's'=>'U'); - break; - } - default: - case 'border.s': - case 'solid': { - $opt['border'] = array(0, 0, $linewidth); - $opt['bs'] = array('w'=>$linewidth, 's'=>'S'); - break; - } - } - } - if (isset($prop['border']) AND is_array($prop['border'])) { - $opt['border'] = $prop['border']; - } - if (!isset($opt['mk'])) { - $opt['mk'] = array(); - } - if (!isset($opt['mk']['if'])) { - $opt['mk']['if'] = array(); - } - $opt['mk']['if']['a'] = array(0.5, 0.5); - // buttonAlignX: Controls how space is distributed from the left of the button face with respect to the icon. - if (isset($prop['buttonAlignX'])) { - $opt['mk']['if']['a'][0] = $prop['buttonAlignX']; - } - // buttonAlignY: Controls how unused space is distributed from the bottom of the button face with respect to the icon. - if (isset($prop['buttonAlignY'])) { - $opt['mk']['if']['a'][1] = $prop['buttonAlignY']; - } - // buttonFitBounds: If true, the extent to which the icon may be scaled is set to the bounds of the button field. - if (isset($prop['buttonFitBounds']) AND ($prop['buttonFitBounds'] == 'true')) { - $opt['mk']['if']['fb'] = true; - } - // buttonScaleHow: Controls how the icon is scaled (if necessary) to fit inside the button face. - if (isset($prop['buttonScaleHow'])) { - switch ($prop['buttonScaleHow']) { - case 'scaleHow.proportional': { - $opt['mk']['if']['s'] = 'P'; - break; - } - case 'scaleHow.anamorphic': { - $opt['mk']['if']['s'] = 'A'; - break; - } - } - } - // buttonScaleWhen: Controls when an icon is scaled to fit inside the button face. - if (isset($prop['buttonScaleWhen'])) { - switch ($prop['buttonScaleWhen']) { - case 'scaleWhen.always': { - $opt['mk']['if']['sw'] = 'A'; - break; - } - case 'scaleWhen.never': { - $opt['mk']['if']['sw'] = 'N'; - break; - } - case 'scaleWhen.tooBig': { - $opt['mk']['if']['sw'] = 'B'; - break; - } - case 'scaleWhen.tooSmall': { - $opt['mk']['if']['sw'] = 'S'; - break; - } - } - } - // buttonPosition: Controls how the text and the icon of the button are positioned with respect to each other within the button face. - if (isset($prop['buttonPosition'])) { - switch ($prop['buttonPosition']) { - case 0: - case 'position.textOnly': { - $opt['mk']['tp'] = 0; - break; - } - case 1: - case 'position.iconOnly': { - $opt['mk']['tp'] = 1; - break; - } - case 2: - case 'position.iconTextV': { - $opt['mk']['tp'] = 2; - break; - } - case 3: - case 'position.textIconV': { - $opt['mk']['tp'] = 3; - break; - } - case 4: - case 'position.iconTextH': { - $opt['mk']['tp'] = 4; - break; - } - case 5: - case 'position.textIconH': { - $opt['mk']['tp'] = 5; - break; - } - case 6: - case 'position.overlay': { - $opt['mk']['tp'] = 6; - break; - } - } - } - // fillColor: Specifies the background color for a field. - if (isset($prop['fillColor'])) { - if (is_array($prop['fillColor'])) { - $opt['mk']['bg'] = $prop['fillColor']; - } else { - $opt['mk']['bg'] = $this->convertHTMLColorToDec($prop['fillColor']); - } - } - // strokeColor: Specifies the stroke color for a field that is used to stroke the rectangle of the field with a line as large as the line width. - if (isset($prop['strokeColor'])) { - if (is_array($prop['strokeColor'])) { - $opt['mk']['bc'] = $prop['strokeColor']; - } else { - $opt['mk']['bc'] = $this->convertHTMLColorToDec($prop['strokeColor']); - } - } - // rotation: The rotation of a widget in counterclockwise increments. - if (isset($prop['rotation'])) { - $opt['mk']['r'] = $prop['rotation']; - } - // charLimit: Limits the number of characters that a user can type into a text field. - if (isset($prop['charLimit'])) { - $opt['maxlen'] = intval($prop['charLimit']); - } - if (!isset($ff)) { - $ff = 0; - } - // readonly: The read-only characteristic of a field. If a field is read-only, the user can see the field but cannot change it. - if (isset($prop['readonly']) AND ($prop['readonly'] == 'true')) { - $ff += 1 << 0; - } - // required: Specifies whether a field requires a value. - if (isset($prop['required']) AND ($prop['required'] == 'true')) { - $ff += 1 << 1; - } - // multiline: Controls how text is wrapped within the field. - if (isset($prop['multiline']) AND ($prop['multiline'] == 'true')) { - $ff += 1 << 12; - } - // password: Specifies whether the field should display asterisks when data is entered in the field. - if (isset($prop['password']) AND ($prop['password'] == 'true')) { - $ff += 1 << 13; - } - // NoToggleToOff: If set, exactly one radio button shall be selected at all times; selecting the currently selected button has no effect. - if (isset($prop['NoToggleToOff']) AND ($prop['NoToggleToOff'] == 'true')) { - $ff += 1 << 14; - } - // Radio: If set, the field is a set of radio buttons. - if (isset($prop['Radio']) AND ($prop['Radio'] == 'true')) { - $ff += 1 << 15; - } - // Pushbutton: If set, the field is a pushbutton that does not retain a permanent value. - if (isset($prop['Pushbutton']) AND ($prop['Pushbutton'] == 'true')) { - $ff += 1 << 16; - } - // Combo: If set, the field is a combo box; if clear, the field is a list box. - if (isset($prop['Combo']) AND ($prop['Combo'] == 'true')) { - $ff += 1 << 17; - } - // editable: Controls whether a combo box is editable. - if (isset($prop['editable']) AND ($prop['editable'] == 'true')) { - $ff += 1 << 18; - } - // Sort: If set, the field's option items shall be sorted alphabetically. - if (isset($prop['Sort']) AND ($prop['Sort'] == 'true')) { - $ff += 1 << 19; - } - // fileSelect: If true, sets the file-select flag in the Options tab of the text field (Field is Used for File Selection). - if (isset($prop['fileSelect']) AND ($prop['fileSelect'] == 'true')) { - $ff += 1 << 20; - } - // multipleSelection: If true, indicates that a list box allows a multiple selection of items. - if (isset($prop['multipleSelection']) AND ($prop['multipleSelection'] == 'true')) { - $ff += 1 << 21; - } - // doNotSpellCheck: If true, spell checking is not performed on this editable text field. - if (isset($prop['doNotSpellCheck']) AND ($prop['doNotSpellCheck'] == 'true')) { - $ff += 1 << 22; - } - // doNotScroll: If true, the text field does not scroll and the user, therefore, is limited by the rectangular region designed for the field. - if (isset($prop['doNotScroll']) AND ($prop['doNotScroll'] == 'true')) { - $ff += 1 << 23; - } - // comb: If set to true, the field background is drawn as series of boxes (one for each character in the value of the field) and each character of the content is drawn within those boxes. The number of boxes drawn is determined from the charLimit property. It applies only to text fields. The setter will also raise if any of the following field properties are also set multiline, password, and fileSelect. A side-effect of setting this property is that the doNotScroll property is also set. - if (isset($prop['comb']) AND ($prop['comb'] == 'true')) { - $ff += 1 << 24; - } - // radiosInUnison: If false, even if a group of radio buttons have the same name and export value, they behave in a mutually exclusive fashion, like HTML radio buttons. - if (isset($prop['radiosInUnison']) AND ($prop['radiosInUnison'] == 'true')) { - $ff += 1 << 25; - } - // richText: If true, the field allows rich text formatting. - if (isset($prop['richText']) AND ($prop['richText'] == 'true')) { - $ff += 1 << 25; - } - // commitOnSelChange: Controls whether a field value is committed after a selection change. - if (isset($prop['commitOnSelChange']) AND ($prop['commitOnSelChange'] == 'true')) { - $ff += 1 << 26; - } - $opt['ff'] = $ff; - // defaultValue: The default value of a field - that is, the value that the field is set to when the form is reset. - if (isset($prop['defaultValue'])) { - $opt['dv'] = $prop['defaultValue']; - } - $f = 4; // default value for annotation flags - // readonly: The read-only characteristic of a field. If a field is read-only, the user can see the field but cannot change it. - if (isset($prop['readonly']) AND ($prop['readonly'] == 'true')) { - $f += 1 << 6; - } - // display: Controls whether the field is hidden or visible on screen and in print. - if (isset($prop['display'])) { - if ($prop['display'] == 'display.visible') { - // - } elseif ($prop['display'] == 'display.hidden') { - $f += 1 << 1; - } elseif ($prop['display'] == 'display.noPrint') { - $f -= 1 << 2; - } elseif ($prop['display'] == 'display.noView') { - $f += 1 << 5; - } - } - $opt['f'] = $f; - // currentValueIndices: Reads and writes single or multiple values of a list box or combo box. - if (isset($prop['currentValueIndices']) AND is_array($prop['currentValueIndices'])) { - $opt['i'] = $prop['currentValueIndices']; - } - // value: The value of the field data that the user has entered. - if (isset($prop['value'])) { - if (is_array($prop['value'])) { - $opt['opt'] = array(); - foreach ($prop['value'] AS $key => $optval) { - // exportValues: An array of strings representing the export values for the field. - if (isset($prop['exportValues'][$key])) { - $opt['opt'][$key] = array($prop['exportValues'][$key], $prop['value'][$key]); - } else { - $opt['opt'][$key] = $prop['value'][$key]; - } - } - } else { - $opt['v'] = $prop['value']; - } - } - // richValue: This property specifies the text contents and formatting of a rich text field. - if (isset($prop['richValue'])) { - $opt['rv'] = $prop['richValue']; - } - // submitName: If nonempty, used during form submission instead of name. Only applicable if submitting in HTML format (that is, URL-encoded). - if (isset($prop['submitName'])) { - $opt['tm'] = $prop['submitName']; - } - // name: Fully qualified field name. - if (isset($prop['name'])) { - $opt['t'] = $prop['name']; - } - // userName: The user name (short description string) of the field. - if (isset($prop['userName'])) { - $opt['tu'] = $prop['userName']; - } - // highlight: Defines how a button reacts when a user clicks it. - if (isset($prop['highlight'])) { - switch ($prop['highlight']) { - case 'none': - case 'highlight.n': { - $opt['h'] = 'N'; - break; - } - case 'invert': - case 'highlight.i': { - $opt['h'] = 'i'; - break; - } - case 'push': - case 'highlight.p': { - $opt['h'] = 'P'; - break; - } - case 'outline': - case 'highlight.o': { - $opt['h'] = 'O'; - break; - } - } - } - // Unsupported options: - // - calcOrderIndex: Changes the calculation order of fields in the document. - // - delay: Delays the redrawing of a field's appearance. - // - defaultStyle: This property defines the default style attributes for the form field. - // - style: Allows the user to set the glyph style of a check box or radio button. - // - textColor, textFont, textSize - return $opt; - } - - /** - * Set default properties for form fields. - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-06) - */ - public function setFormDefaultProp($prop=array()) { - $this->default_form_prop = $prop; - } - - /** - * Return the default properties for form fields. - * @return array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-06) - */ - public function getFormDefaultProp() { - return $this->default_form_prop; - } - - /** - * Creates a text field - * @param string $name field name - * @param float $w Width of the rectangle - * @param float $h Height of the rectangle - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. - * @param float $x Abscissa of the upper-left corner of the rectangle - * @param float $y Ordinate of the upper-left corner of the rectangle - * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-07) - */ - public function TextField($name, $w, $h, $prop=array(), $opt=array(), $x='', $y='', $js=false) { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - if ($js) { - $this->_addfield('text', $name, $x, $y, $w, $h, $prop); - return; - } - // get default style - $prop = array_merge($this->getFormDefaultProp(), $prop); - // get annotation data - $popt = $this->getAnnotOptFromJSProp($prop); - // set default appearance stream - $this->annotation_fonts[$this->CurrentFont['fontkey']] = $this->CurrentFont['i']; - $fontstyle = sprintf('/F%d %.2F Tf %s', $this->CurrentFont['i'], $this->FontSizePt, $this->TextColor); - $popt['da'] = $fontstyle; - $popt['ap'] = array(); - $popt['ap']['n'] = 'q BT '.$fontstyle.' ET Q'; - // merge options - $opt = array_merge($popt, $opt); - // remove some conflicting options - unset($opt['bs']); - // set remaining annotation data - $opt['Subtype'] = 'Widget'; - $opt['ft'] = 'Tx'; - $opt['t'] = $name; - /* - Additional annotation's parameters (check _putannotsobj() method): - //$opt['f'] - //$opt['ap'] - //$opt['as'] - //$opt['bs'] - //$opt['be'] - //$opt['c'] - //$opt['border'] - //$opt['h'] - //$opt['mk'] - //$opt['mk']['r'] - //$opt['mk']['bc'] - //$opt['mk']['bg'] - //$opt['mk']['ca'] - //$opt['mk']['rc'] - //$opt['mk']['ac'] - //$opt['mk']['i'] - //$opt['mk']['ri'] - //$opt['mk']['ix'] - //$opt['mk']['if'] - //$opt['mk']['if']['sw'] - //$opt['mk']['if']['s'] - //$opt['mk']['if']['a'] - //$opt['mk']['if']['fb'] - //$opt['mk']['tp'] - //$opt['tu'] - //$opt['tm'] - //$opt['ff'] - //$opt['v'] - //$opt['dv'] - //$opt['a'] - //$opt['aa'] - //$opt['q'] - */ - $this->Annotation($x, $y, $w, $h, $name, $opt, 0); - if ($this->rtl) { - $this->x -= $w; - } else { - $this->x += $w; - } - } - - /** - * Creates a RadioButton field - * @param string $name field name - * @param int $w width - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. - * @param string $onvalue value to be returned if selected. - * @param boolean $checked define the initial state. - * @param float $x Abscissa of the upper-left corner of the rectangle - * @param float $y Ordinate of the upper-left corner of the rectangle - * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-07) - */ - public function RadioButton($name, $w, $prop=array(), $opt=array(), $onvalue='On', $checked=false, $x='', $y='', $js=false) { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($w, $x, $y); - if ($js) { - $this->_addfield('radiobutton', $name, $x, $y, $w, $w, $prop); - return; - } - if ($this->empty_string($onvalue)) { - $onvalue = 'On'; - } - if ($checked) { - $defval = $onvalue; - } else { - $defval = 'Off'; - } - // set data for parent group - if (!isset($this->radiobutton_groups[$this->page])) { - $this->radiobutton_groups[$this->page] = array(); - } - if (!isset($this->radiobutton_groups[$this->page][$name])) { - $this->radiobutton_groups[$this->page][$name] = array(); - ++$this->n; - $this->radiobutton_groups[$this->page][$name]['n'] = $this->n; - $this->radio_groups[] = $this->n; - $kid = ($this->n + 2); - } else { - $kid = ($this->n + 1); - } - // save object ID to be added on Kids entry on parent object - $this->radiobutton_groups[$this->page][$name][] = array('kid' => $kid, 'def' => $defval); - // get default style - $prop = array_merge($this->getFormDefaultProp(), $prop); - $prop['NoToggleToOff'] = 'true'; - $prop['Radio'] = 'true'; - $prop['borderStyle'] = 'inset'; - // get annotation data - $popt = $this->getAnnotOptFromJSProp($prop); - // set additional default values - $font = 'zapfdingbats'; - $this->AddFont($font); - $tmpfont = $this->getFontBuffer($font); - $this->annotation_fonts[$tmpfont['fontkey']] = $tmpfont['i']; - $fontstyle = sprintf('/F%d %.2F Tf %s', $tmpfont['i'], $this->FontSizePt, $this->TextColor); - $popt['da'] = $fontstyle; - $popt['ap'] = array(); - $popt['ap']['n'] = array(); - $popt['ap']['n'][$onvalue] = 'q BT '.$fontstyle.' 0 0 Td (8) Tj ET Q'; - $popt['ap']['n']['Off'] = 'q BT '.$fontstyle.' 0 0 Td (8) Tj ET Q'; - if (!isset($popt['mk'])) { - $popt['mk'] = array(); - } - $popt['mk']['ca'] = '(l)'; - // merge options - $opt = array_merge($popt, $opt); - // set remaining annotation data - $opt['Subtype'] = 'Widget'; - $opt['ft'] = 'Btn'; - if ($checked) { - $opt['v'] = array('/'.$onvalue); - $opt['as'] = $onvalue; - } else { - $opt['as'] = 'Off'; - } - $this->Annotation($x, $y, $w, $w, $name, $opt, 0); - if ($this->rtl) { - $this->x -= $w; - } else { - $this->x += $w; - } - } - - /** - * Creates a List-box field - * @param string $name field name - * @param int $w width - * @param int $h height - * @param array $values array containing the list of values. - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. - * @param float $x Abscissa of the upper-left corner of the rectangle - * @param float $y Ordinate of the upper-left corner of the rectangle - * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-07) - */ - public function ListBox($name, $w, $h, $values, $prop=array(), $opt=array(), $x='', $y='', $js=false) { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - if ($js) { - $this->_addfield('listbox', $name, $x, $y, $w, $h, $prop); - $s = ''; - foreach ($values as $value) { - $s .= "'".addslashes($value)."',"; - } - $this->javascript .= 'f'.$name.'.setItems(['.substr($s, 0, -1)."]);\n"; - return; - } - // get default style - $prop = array_merge($this->getFormDefaultProp(), $prop); - // get annotation data - $popt = $this->getAnnotOptFromJSProp($prop); - // set additional default values - $this->annotation_fonts[$this->CurrentFont['fontkey']] = $this->CurrentFont['i']; - $fontstyle = sprintf('/F%d %.2F Tf %s', $this->CurrentFont['i'], $this->FontSizePt, $this->TextColor); - $popt['da'] = $fontstyle; - $popt['ap'] = array(); - $popt['ap']['n'] = 'q BT '.$fontstyle.' ET Q'; - // merge options - $opt = array_merge($popt, $opt); - // set remaining annotation data - $opt['Subtype'] = 'Widget'; - $opt['ft'] = 'Ch'; - $opt['t'] = $name; - $opt['opt'] = $values; - $this->Annotation($x, $y, $w, $h, $name, $opt, 0); - if ($this->rtl) { - $this->x -= $w; - } else { - $this->x += $w; - } - } - - /** - * Creates a Combo-box field - * @param string $name field name - * @param int $w width - * @param int $h height - * @param array $values array containing the list of values. - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. - * @param float $x Abscissa of the upper-left corner of the rectangle - * @param float $y Ordinate of the upper-left corner of the rectangle - * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-07) - */ - public function ComboBox($name, $w, $h, $values, $prop=array(), $opt=array(), $x='', $y='', $js=false) { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - if ($js) { - $this->_addfield('combobox', $name, $x, $y, $w, $h, $prop); - $s = ''; - foreach ($values as $value) { - $s .= "'".addslashes($value)."',"; - } - $this->javascript .= 'f'.$name.'.setItems(['.substr($s, 0, -1)."]);\n"; - return; - } - // get default style - $prop = array_merge($this->getFormDefaultProp(), $prop); - $prop['Combo'] = true; - // get annotation data - $popt = $this->getAnnotOptFromJSProp($prop); - // set additional default options - $this->annotation_fonts[$this->CurrentFont['fontkey']] = $this->CurrentFont['i']; - $fontstyle = sprintf('/F%d %.2F Tf %s', $this->CurrentFont['i'], $this->FontSizePt, $this->TextColor); - $popt['da'] = $fontstyle; - $popt['ap'] = array(); - $popt['ap']['n'] = 'q BT '.$fontstyle.' ET Q'; - // merge options - $opt = array_merge($popt, $opt); - // set remaining annotation data - $opt['Subtype'] = 'Widget'; - $opt['ft'] = 'Ch'; - $opt['t'] = $name; - $opt['opt'] = $values; - $this->Annotation($x, $y, $w, $h, $name, $opt, 0); - if ($this->rtl) { - $this->x -= $w; - } else { - $this->x += $w; - } - } - - /** - * Creates a CheckBox field - * @param string $name field name - * @param int $w width - * @param boolean $checked define the initial state. - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. - * @param string $onvalue value to be returned if selected. - * @param float $x Abscissa of the upper-left corner of the rectangle - * @param float $y Ordinate of the upper-left corner of the rectangle - * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-07) - */ - public function CheckBox($name, $w, $checked=false, $prop=array(), $opt=array(), $onvalue='Yes', $x='', $y='', $js=false) { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($w, $x, $y); - if ($js) { - $this->_addfield('checkbox', $name, $x, $y, $w, $w, $prop); - return; - } - if (!isset($prop['value'])) { - $prop['value'] = array('Yes'); - } - // get default style - $prop = array_merge($this->getFormDefaultProp(), $prop); - $prop['borderStyle'] = 'inset'; - // get annotation data - $popt = $this->getAnnotOptFromJSProp($prop); - // set additional default options - $font = 'zapfdingbats'; - $this->AddFont($font); - $tmpfont = $this->getFontBuffer($font); - $this->annotation_fonts[$tmpfont['fontkey']] = $tmpfont['i']; - $fontstyle = sprintf('/F%d %.2F Tf %s', $tmpfont['i'], $this->FontSizePt, $this->TextColor); - $popt['da'] = $fontstyle; - $popt['ap'] = array(); - $popt['ap']['n'] = array(); - $popt['ap']['n']['Yes'] = 'q BT '.$fontstyle.' 0 0 Td (8) Tj ET Q'; - $popt['ap']['n']['Off'] = 'q BT '.$fontstyle.' 0 0 Td (8) Tj ET Q'; - // merge options - $opt = array_merge($popt, $opt); - // set remaining annotation data - $opt['Subtype'] = 'Widget'; - $opt['ft'] = 'Btn'; - $opt['t'] = $name; - $opt['opt'] = array($onvalue); - if ($checked) { - $opt['v'] = array('/0'); - $opt['as'] = 'Yes'; - } else { - $opt['v'] = array('/Off'); - $opt['as'] = 'Off'; - } - $this->Annotation($x, $y, $w, $w, $name, $opt, 0); - if ($this->rtl) { - $this->x -= $w; - } else { - $this->x += $w; - } - } - - /** - * Creates a button field - * @param string $name field name - * @param int $w width - * @param int $h height - * @param string $caption caption. - * @param mixed $action action triggered by pressing the button. Use a string to specify a javascript action. Use an array to specify a form action options as on section 12.7.5 of PDF32000_2008. - * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. - * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. - * @param float $x Abscissa of the upper-left corner of the rectangle - * @param float $y Ordinate of the upper-left corner of the rectangle - * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). - * @access public - * @author Nicola Asuni - * @since 4.8.000 (2009-09-07) - */ - public function Button($name, $w, $h, $caption, $action, $prop=array(), $opt=array(), $x='', $y='', $js=false) { - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - if ($js) { - $this->_addfield('button', $name, $this->x, $this->y, $w, $h, $prop); - $this->javascript .= 'f'.$name.".buttonSetCaption('".addslashes($caption)."');\n"; - $this->javascript .= 'f'.$name.".setAction('MouseUp','".addslashes($action)."');\n"; - $this->javascript .= 'f'.$name.".highlight='push';\n"; - $this->javascript .= 'f'.$name.".print=false;\n"; - return; - } - // get default style - $prop = array_merge($this->getFormDefaultProp(), $prop); - $prop['Pushbutton'] = 'true'; - $prop['highlight'] = 'push'; - $prop['display'] = 'display.noPrint'; - // get annotation data - $popt = $this->getAnnotOptFromJSProp($prop); - $this->annotation_fonts[$this->CurrentFont['fontkey']] = $this->CurrentFont['i']; - $fontstyle = sprintf('/F%d %.2F Tf %s', $this->CurrentFont['i'], $this->FontSizePt, $this->TextColor); - $popt['da'] = $fontstyle; - $popt['ap'] = array(); - $popt['ap']['n'] = 'q BT '.$fontstyle.' ET Q'; - // set additional default options - if (!isset($popt['mk'])) { - $popt['mk'] = array(); - } - $ann_obj_id = ($this->n + 1); - if (!empty($action) AND !is_array($action)) { - $ann_obj_id = ($this->n + 2); - } - $popt['mk']['ca'] = $this->_textstring($caption, $ann_obj_id); - $popt['mk']['rc'] = $this->_textstring($caption, $ann_obj_id); - $popt['mk']['ac'] = $this->_textstring($caption, $ann_obj_id); - // merge options - $opt = array_merge($popt, $opt); - // set remaining annotation data - $opt['Subtype'] = 'Widget'; - $opt['ft'] = 'Btn'; - $opt['t'] = $caption; - $opt['v'] = $name; - if (!empty($action)) { - if (is_array($action)) { - // form action options as on section 12.7.5 of PDF32000_2008. - $opt['aa'] = '/D <<'; - $bmode = array('SubmitForm', 'ResetForm', 'ImportData'); - foreach ($action AS $key => $val) { - if (($key == 'S') AND in_array($val, $bmode)) { - $opt['aa'] .= ' /S /'.$val; - } elseif (($key == 'F') AND (!empty($val))) { - $opt['aa'] .= ' /F '.$this->_datastring($val, $ann_obj_id); - } elseif (($key == 'Fields') AND is_array($val) AND !empty($val)) { - $opt['aa'] .= ' /Fields ['; - foreach ($val AS $field) { - $opt['aa'] .= ' '.$this->_textstring($field, $ann_obj_id); - } - $opt['aa'] .= ']'; - } elseif (($key == 'Flags')) { - $ff = 0; - if (is_array($val)) { - foreach ($val AS $flag) { - switch ($flag) { - case 'Include/Exclude': { - $ff += 1 << 0; - break; - } - case 'IncludeNoValueFields': { - $ff += 1 << 1; - break; - } - case 'ExportFormat': { - $ff += 1 << 2; - break; - } - case 'GetMethod': { - $ff += 1 << 3; - break; - } - case 'SubmitCoordinates': { - $ff += 1 << 4; - break; - } - case 'XFDF': { - $ff += 1 << 5; - break; - } - case 'IncludeAppendSaves': { - $ff += 1 << 6; - break; - } - case 'IncludeAnnotations': { - $ff += 1 << 7; - break; - } - case 'SubmitPDF': { - $ff += 1 << 8; - break; - } - case 'CanonicalFormat': { - $ff += 1 << 9; - break; - } - case 'ExclNonUserAnnots': { - $ff += 1 << 10; - break; - } - case 'ExclFKey': { - $ff += 1 << 11; - break; - } - case 'EmbedForm': { - $ff += 1 << 13; - break; - } - } - } - } else { - $ff = intval($val); - } - $opt['aa'] .= ' /Flags '.$ff; - } - } - $opt['aa'] .= ' >>'; - } else { - // Javascript action or raw action command - $js_obj_id = $this->addJavascriptObject($action); - $opt['aa'] = '/D '.$js_obj_id.' 0 R'; - } - } - $this->Annotation($x, $y, $w, $h, $name, $opt, 0); - if ($this->rtl) { - $this->x -= $w; - } else { - $this->x += $w; - } - } - - // --- END FORMS FIELDS ------------------------------------------------ - - /** - * Add certification signature (DocMDP or UR3) - * You can set only one signature type - * @access protected - * @author Nicola Asuni - * @since 4.6.008 (2009-05-07) - */ - protected function _putsignature() { - if ((!$this->sign) OR (!isset($this->signature_data['cert_type']))) { - return; - } - $out = $this->_getobj($this->sig_obj_id + 1)."\n"; - $out .= '<< /Type /Sig'; - $out .= ' /Filter /Adobe.PPKLite'; - $out .= ' /SubFilter /adbe.pkcs7.detached'; - $out .= ' '.$this->byterange_string; - $out .= ' /Contents<'.str_repeat('0', $this->signature_max_length).'>'; - $out .= ' /Reference ['; // array of signature reference dictionaries - $out .= ' << /Type /SigRef'; - if ($this->signature_data['cert_type'] > 0) { - $out .= ' /TransformMethod /DocMDP'; - $out .= ' /TransformParams <<'; - $out .= ' /Type /TransformParams'; - $out .= ' /V /1.2'; - $out .= ' /P '.$this->signature_data['cert_type']; - } else { - $out .= ' /TransformMethod /UR3'; - $out .= ' /TransformParams <<'; - $out .= ' /Type /TransformParams'; - $out .= ' /V /2.2'; - if (!$this->empty_string($this->ur['document'])) { - $out .= ' /Document['.$this->ur['document'].']'; - } - if (!$this->empty_string($this->ur['form'])) { - $out .= ' /Form['.$this->ur['form'].']'; - } - if (!$this->empty_string($this->ur['signature'])) { - $out .= ' /Signature['.$this->ur['signature'].']'; - } - if (!$this->empty_string($this->ur['annots'])) { - $out .= ' /Annots['.$this->ur['annots'].']'; - } - if (!$this->empty_string($this->ur['ef'])) { - $out .= ' /EF['.$this->ur['ef'].']'; - } - if (!$this->empty_string($this->ur['formex'])) { - $out .= ' /FormEX['.$this->ur['formex'].']'; - } - } - $out .= ' >>'; // close TransformParams - // optional digest data (values must be calculated and replaced later) - //$out .= ' /Data ********** 0 R'; - //$out .= ' /DigestMethod/MD5'; - //$out .= ' /DigestLocation[********** 34]'; - //$out .= ' /DigestValue<********************************>'; - $out .= ' >>'; - $out .= ' ]'; // end of reference - if (isset($this->signature_data['info']['Name']) AND !$this->empty_string($this->signature_data['info']['Name'])) { - $out .= ' /Name '.$this->_textstring($this->signature_data['info']['Name']); - } - if (isset($this->signature_data['info']['Location']) AND !$this->empty_string($this->signature_data['info']['Location'])) { - $out .= ' /Location '.$this->_textstring($this->signature_data['info']['Location']); - } - if (isset($this->signature_data['info']['Reason']) AND !$this->empty_string($this->signature_data['info']['Reason'])) { - $out .= ' /Reason '.$this->_textstring($this->signature_data['info']['Reason']); - } - if (isset($this->signature_data['info']['ContactInfo']) AND !$this->empty_string($this->signature_data['info']['ContactInfo'])) { - $out .= ' /ContactInfo '.$this->_textstring($this->signature_data['info']['ContactInfo']); - } - $out .= ' /M '.$this->_datestring(); - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - - /** - * Set User's Rights for PDF Reader - * WARNING: This is experimental and currently do not work. - * Check the PDF Reference 8.7.1 Transform Methods, - * Table 8.105 Entries in the UR transform parameters dictionary - * @param boolean $enable if true enable user's rights on PDF reader - * @param string $document Names specifying additional document-wide usage rights for the document. The only defined value is "/FullSave", which permits a user to save the document along with modified form and/or annotation data. - * @param string $annots Names specifying additional annotation-related usage rights for the document. Valid names in PDF 1.5 and later are /Create/Delete/Modify/Copy/Import/Export, which permit the user to perform the named operation on annotations. - * @param string $form Names specifying additional form-field-related usage rights for the document. Valid names are: /Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate - * @param string $signature Names specifying additional signature-related usage rights for the document. The only defined value is /Modify, which permits a user to apply a digital signature to an existing signature form field or clear a signed signature form field. - * @param string $ef Names specifying additional usage rights for named embedded files in the document. Valid names are /Create/Delete/Modify/Import, which permit the user to perform the named operation on named embedded files - Names specifying additional embedded-files-related usage rights for the document. - * @param string $formex Names specifying additional form-field-related usage rights. The only valid name is BarcodePlaintext, which permits text form field data to be encoded as a plaintext two-dimensional barcode. - * @access public - * @author Nicola Asuni - * @since 2.9.000 (2008-03-26) - */ - public function setUserRights( - $enable=true, - $document='/FullSave', - $annots='/Create/Delete/Modify/Copy/Import/Export', - $form='/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate', - $signature='/Modify', - $ef='/Create/Delete/Modify/Import', - $formex='') { - $this->ur['enabled'] = $enable; - $this->ur['document'] = $document; - $this->ur['annots'] = $annots; - $this->ur['form'] = $form; - $this->ur['signature'] = $signature; - $this->ur['ef'] = $ef; - $this->ur['formex'] = $formex; - if (!$this->sign) { - $this->setSignature('', '', '', '', 0, array()); - } - } - - /** - * Enable document signature (requires the OpenSSL Library). - * The digital signature improve document authenticity and integrity and allows o enable extra features on Acrobat Reader. - * To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt - * To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12 - * To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes - * @param mixed $signing_cert signing certificate (string or filename prefixed with 'file://') - * @param mixed $private_key private key (string or filename prefixed with 'file://') - * @param string $private_key_password password - * @param string $extracerts specifies the name of a file containing a bunch of extra certificates to include in the signature which can for example be used to help the recipient to verify the certificate that you used. - * @param int $cert_type The access permissions granted for this document. Valid values shall be: 1 = No changes to the document shall be permitted; any change to the document shall invalidate the signature; 2 = Permitted changes shall be filling in forms, instantiating page templates, and signing; other changes shall invalidate the signature; 3 = Permitted changes shall be the same as for 2, as well as annotation creation, deletion, and modification; other changes shall invalidate the signature. - * @param array $info array of option information: Name, Location, Reason, ContactInfo. - * @access public - * @author Nicola Asuni - * @since 4.6.005 (2009-04-24) - */ - public function setSignature($signing_cert='', $private_key='', $private_key_password='', $extracerts='', $cert_type=2, $info=array()) { - // to create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt - // to export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12 - // to convert pfx certificate to pem: openssl - // OpenSSL> pkcs12 -in -out -nodes - $this->sign = true; - ++$this->n; - $this->sig_obj_id = $this->n; // signature widget - ++$this->n; // signature object ($this->sig_obj_id + 1) - $this->signature_data = array(); - if (strlen($signing_cert) == 0) { - $signing_cert = 'file://'.dirname(__FILE__).'/tcpdf.crt'; - $private_key_password = 'tcpdfdemo'; - } - if (strlen($private_key) == 0) { - $private_key = $signing_cert; - } - $this->signature_data['signcert'] = $signing_cert; - $this->signature_data['privkey'] = $private_key; - $this->signature_data['password'] = $private_key_password; - $this->signature_data['extracerts'] = $extracerts; - $this->signature_data['cert_type'] = $cert_type; - $this->signature_data['info'] = $info; - } - - /** - * Set the digital signature appearance (a cliccable rectangle area to get signature properties) - * @param float $x Abscissa of the upper-left corner. - * @param float $y Ordinate of the upper-left corner. - * @param float $w Width of the signature area. - * @param float $h Height of the signature area. - * @param int $page option page number (if < 0 the current page is used). - * @access public - * @author Nicola Asuni - * @since 5.3.011 (2010-06-17) - */ - public function setSignatureAppearance($x=0, $y=0, $w=0, $h=0, $page=-1) { - if (($page < 1) OR ($page > $this->numpages)) { - $this->signature_appearance['page'] = $this->page; - } else { - $this->signature_appearance['page'] = intval($page); - } - $a = $x * $this->k; - $b = $this->pagedim[($this->signature_appearance['page'])]['h'] - (($y + $h) * $this->k); - $c = $w * $this->k; - $d = $h * $this->k; - $this->signature_appearance['rect'] = sprintf('%.2F %.2F %.2F %.2F', $a, $b, $a+$c, $b+$d); - } - - /** - * Create a new page group. - * NOTE: call this function before calling AddPage() - * @param int $page starting group page (leave empty for next page). - * @access public - * @since 3.0.000 (2008-03-27) - */ - public function startPageGroup($page='') { - if (empty($page)) { - $page = $this->page + 1; - } - $this->newpagegroup[$page] = true; - } - - /** - * Defines an alias for the total number of pages. - * It will be substituted as the document is closed. - * @param string $alias The alias. - * @access public - * @since 1.4 - * @see getAliasNbPages(), PageNo(), Footer() - */ - public function AliasNbPages($alias='{nb}') { - $this->AliasNbPages = $alias; - } - - /** - * Returns the string alias used for the total number of pages. - * If the current font is unicode type, the returned string is surrounded by additional curly braces. - * @return string - * @access public - * @since 4.0.018 (2008-08-08) - * @see AliasNbPages(), PageNo(), Footer() - */ - public function getAliasNbPages() { - if ($this->isUnicodeFont()) { - return '{'.$this->AliasNbPages.'}'; - } - return $this->AliasNbPages; - } - - /** - * Defines an alias for the page number. - * It will be substituted as the document is closed. - * @param string $alias The alias. - * @access public - * @since 4.5.000 (2009-01-02) - * @see getAliasNbPages(), PageNo(), Footer() - */ - public function AliasNumPage($alias='{pnb}') { - //Define an alias for total number of pages - $this->AliasNumPage = $alias; - } - - /** - * Returns the string alias used for the page number. - * If the current font is unicode type, the returned string is surrounded by additional curly braces. - * @return string - * @access public - * @since 4.5.000 (2009-01-02) - * @see AliasNbPages(), PageNo(), Footer() - */ - public function getAliasNumPage() { - if ($this->isUnicodeFont()) { - return '{'.$this->AliasNumPage.'}'; - } - return $this->AliasNumPage; - } - - /** - * Return the current page in the group. - * @return current page in the group - * @access public - * @since 3.0.000 (2008-03-27) - */ - public function getGroupPageNo() { - return $this->pagegroups[$this->currpagegroup]; - } - - /** - * Returns the current group page number formatted as a string. - * @access public - * @since 4.3.003 (2008-11-18) - * @see PaneNo(), formatPageNumber() - */ - public function getGroupPageNoFormatted() { - return $this->formatPageNumber($this->getGroupPageNo()); - } - - /** - * Return the alias of the current page group - * If the current font is unicode type, the returned string is surrounded by additional curly braces. - * (will be replaced by the total number of pages in this group). - * @return alias of the current page group - * @access public - * @since 3.0.000 (2008-03-27) - */ - public function getPageGroupAlias() { - if ($this->isUnicodeFont()) { - return '{'.$this->currpagegroup.'}'; - } - return $this->currpagegroup; - } - - /** - * Return the alias for the page number on the current page group - * If the current font is unicode type, the returned string is surrounded by additional curly braces. - * (will be replaced by the total number of pages in this group). - * @return alias of the current page group - * @access public - * @since 4.5.000 (2009-01-02) - */ - public function getPageNumGroupAlias() { - if ($this->isUnicodeFont()) { - return '{'.str_replace('{nb', '{pnb', $this->currpagegroup).'}'; - } - return str_replace('{nb', '{pnb', $this->currpagegroup); - } - - /** - * Format the page numbers. - * This method can be overriden for custom formats. - * @param int $num page number - * @access protected - * @since 4.2.005 (2008-11-06) - */ - protected function formatPageNumber($num) { - return number_format((float)$num, 0, '', '.'); - } - - /** - * Format the page numbers on the Table Of Content. - * This method can be overriden for custom formats. - * @param int $num page number - * @access protected - * @since 4.5.001 (2009-01-04) - * @see addTOC(), addHTMLTOC() - */ - protected function formatTOCPageNumber($num) { - return number_format((float)$num, 0, '', '.'); - } - - /** - * Returns the current page number formatted as a string. - * @access public - * @since 4.2.005 (2008-11-06) - * @see PaneNo(), formatPageNumber() - */ - public function PageNoFormatted() { - return $this->formatPageNumber($this->PageNo()); - } - - /** - * Put visibility settings. - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected function _putocg() { - $this->n_ocg_print = $this->_newobj(); - $this->_out('<< /Type /OCG /Name '.$this->_textstring('print', $this->n_ocg_print).' /Usage << /Print <> /View <> >> >>'."\n".'endobj'); - $this->n_ocg_view = $this->_newobj(); - $this->_out('<< /Type /OCG /Name '.$this->_textstring('view', $this->n_ocg_view).' /Usage << /Print <> /View <> >> >>'."\n".'endobj'); - } - - /** - * Set the visibility of the successive elements. - * This can be useful, for instance, to put a background - * image or color that will show on screen but won't print. - * @param string $v visibility mode. Legal values are: all, print, screen. - * @access public - * @since 3.0.000 (2008-03-27) - */ - public function setVisibility($v) { - if ($this->openMarkedContent) { - // close existing open marked-content - $this->_out('EMC'); - $this->openMarkedContent = false; - } - switch($v) { - case 'print': { - $this->_out('/OC /OC1 BDC'); - $this->openMarkedContent = true; - break; - } - case 'screen': { - $this->_out('/OC /OC2 BDC'); - $this->openMarkedContent = true; - break; - } - case 'all': { - $this->_out(''); - break; - } - default: { - $this->Error('Incorrect visibility: '.$v); - break; - } - } - $this->visibility = $v; - } - - /** - * Add transparency parameters to the current extgstate - * @param array $params parameters - * @return the number of extgstates - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected function addExtGState($parms) { - $n = count($this->extgstates) + 1; - // check if this ExtGState already exist - for ($i = 1; $i < $n; ++$i) { - if ($this->extgstates[$i]['parms'] == $parms) { - // return reference to existing ExtGState - return $i; - } - } - $this->extgstates[$n]['parms'] = $parms; - return $n; - } - - /** - * Add an extgstate - * @param array $gs extgstate - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected function setExtGState($gs) { - $this->_out(sprintf('/GS%d gs', $gs)); - } - - /** - * Put extgstates for object transparency - * @param array $gs extgstate - * @access protected - * @since 3.0.000 (2008-03-27) - */ - protected function _putextgstates() { - $ne = count($this->extgstates); - for ($i = 1; $i <= $ne; ++$i) { - $this->extgstates[$i]['n'] = $this->_newobj(); - $out = '<< /Type /ExtGState'; - foreach ($this->extgstates[$i]['parms'] as $k => $v) { - if (is_float($v)) { - $v = sprintf('%.2F', $v); - } - $out .= ' /'.$k.' '.$v; - } - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - } - - /** - * Set alpha for stroking (CA) and non-stroking (ca) operations. - * @param float $alpha real value from 0 (transparent) to 1 (opaque) - * @param string $bm blend mode, one of the following: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity - * @access public - * @since 3.0.000 (2008-03-27) - */ - public function setAlpha($alpha, $bm='Normal') { - $gs = $this->addExtGState(array('ca' => $alpha, 'CA' => $alpha, 'BM' => '/'.$bm, 'AIS' => 'false')); - $this->setExtGState($gs); - } - - /** - * Set the default JPEG compression quality (1-100) - * @param int $quality JPEG quality, integer between 1 and 100 - * @access public - * @since 3.0.000 (2008-03-27) - */ - public function setJPEGQuality($quality) { - if (($quality < 1) OR ($quality > 100)) { - $quality = 75; - } - $this->jpeg_quality = intval($quality); - } - - /** - * Set the default number of columns in a row for HTML tables. - * @param int $cols number of columns - * @access public - * @since 3.0.014 (2008-06-04) - */ - public function setDefaultTableColumns($cols=4) { - $this->default_table_columns = intval($cols); - } - - /** - * Set the height of the cell (line height) respect the font height. - * @param int $h cell proportion respect font height (typical value = 1.25). - * @access public - * @since 3.0.014 (2008-06-04) - */ - public function setCellHeightRatio($h) { - $this->cell_height_ratio = $h; - } - - /** - * return the height of cell repect font height. - * @access public - * @since 4.0.012 (2008-07-24) - */ - public function getCellHeightRatio() { - return $this->cell_height_ratio; - } - - /** - * Set the PDF version (check PDF reference for valid values). - * Default value is 1.t - * @access public - * @since 3.1.000 (2008-06-09) - */ - public function setPDFVersion($version='1.7') { - $this->PDFVersion = $version; - } - - /** - * Set the viewer preferences dictionary controlling the way the document is to be presented on the screen or in print. - * (see Section 8.1 of PDF reference, "Viewer Preferences"). - *
    • HideToolbar boolean (Optional) A flag specifying whether to hide the viewer application's tool bars when the document is active. Default value: false.
    • HideMenubar boolean (Optional) A flag specifying whether to hide the viewer application's menu bar when the document is active. Default value: false.
    • HideWindowUI boolean (Optional) A flag specifying whether to hide user interface elements in the document's window (such as scroll bars and navigation controls), leaving only the document's contents displayed. Default value: false.
    • FitWindow boolean (Optional) A flag specifying whether to resize the document's window to fit the size of the first displayed page. Default value: false.
    • CenterWindow boolean (Optional) A flag specifying whether to position the document's window in the center of the screen. Default value: false.
    • DisplayDocTitle boolean (Optional; PDF 1.4) A flag specifying whether the window's title bar should display the document title taken from the Title entry of the document information dictionary (see Section 10.2.1, "Document Information Dictionary"). If false, the title bar should instead display the name of the PDF file containing the document. Default value: false.
    • NonFullScreenPageMode name (Optional) The document's page mode, specifying how to display the document on exiting full-screen mode:
      • UseNone Neither document outline nor thumbnail images visible
      • UseOutlines Document outline visible
      • UseThumbs Thumbnail images visible
      • UseOC Optional content group panel visible
      This entry is meaningful only if the value of the PageMode entry in the catalog dictionary (see Section 3.6.1, "Document Catalog") is FullScreen; it is ignored otherwise. Default value: UseNone.
    • ViewArea name (Optional; PDF 1.4) The name of the page boundary representing the area of a page to be displayed when viewing the document on the screen. Valid values are (see Section 10.10.1, "Page Boundaries").:
      • MediaBox
      • CropBox (default)
      • BleedBox
      • TrimBox
      • ArtBox
    • ViewClip name (Optional; PDF 1.4) The name of the page boundary to which the contents of a page are to be clipped when viewing the document on the screen. Valid values are (see Section 10.10.1, "Page Boundaries").:
      • MediaBox
      • CropBox (default)
      • BleedBox
      • TrimBox
      • ArtBox
    • PrintArea name (Optional; PDF 1.4) The name of the page boundary representing the area of a page to be rendered when printing the document. Valid values are (see Section 10.10.1, "Page Boundaries").:
      • MediaBox
      • CropBox (default)
      • BleedBox
      • TrimBox
      • ArtBox
    • PrintClip name (Optional; PDF 1.4) The name of the page boundary to which the contents of a page are to be clipped when printing the document. Valid values are (see Section 10.10.1, "Page Boundaries").:
      • MediaBox
      • CropBox (default)
      • BleedBox
      • TrimBox
      • ArtBox
    • PrintScaling name (Optional; PDF 1.6) The page scaling option to be selected when a print dialog is displayed for this document. Valid values are:
      • None, which indicates that the print dialog should reflect no page scaling
      • AppDefault (default), which indicates that applications should use the current print scaling
    • Duplex name (Optional; PDF 1.7) The paper handling option to use when printing the file from the print dialog. The following values are valid:
      • Simplex - Print single-sided
      • DuplexFlipShortEdge - Duplex and flip on the short edge of the sheet
      • DuplexFlipLongEdge - Duplex and flip on the long edge of the sheet
      Default value: none
    • PickTrayByPDFSize boolean (Optional; PDF 1.7) A flag specifying whether the PDF page size is used to select the input paper tray. This setting influences only the preset values used to populate the print dialog presented by a PDF viewer application. If PickTrayByPDFSize is true, the check box in the print dialog associated with input paper tray is checked. Note: This setting has no effect on Mac OS systems, which do not provide the ability to pick the input tray by size.
    • PrintPageRange array (Optional; PDF 1.7) The page numbers used to initialize the print dialog box when the file is printed. The first page of the PDF file is denoted by 1. Each pair consists of the first and last pages in the sub-range. An odd number of integers causes this entry to be ignored. Negative numbers cause the entire array to be ignored. Default value: as defined by PDF viewer application
    • NumCopies integer (Optional; PDF 1.7) The number of copies to be printed when the print dialog is opened for this file. Supported values are the integers 2 through 5. Values outside this range are ignored. Default value: as defined by PDF viewer application, but typically 1
    - * @param array $preferences array of options. - * @author Nicola Asuni - * @access public - * @since 3.1.000 (2008-06-09) - */ - public function setViewerPreferences($preferences) { - $this->viewer_preferences = $preferences; - } - - /** - * Paints color transition registration bars - * @param float $x abscissa of the top left corner of the rectangle. - * @param float $y ordinate of the top left corner of the rectangle. - * @param float $w width of the rectangle. - * @param float $h height of the rectangle. - * @param boolean $transition if true prints tcolor transitions to white. - * @param boolean $vertical if true prints bar vertically. - * @param string $colors colors to print, one letter per color separated by comma (for example 'A,W,R,G,B,C,M,Y,K'): A=black, W=white, R=red, G=green, B=blue, C=cyan, M=magenta, Y=yellow, K=black. - * @author Nicola Asuni - * @since 4.9.000 (2010-03-26) - * @access public - */ - public function colorRegistrationBar($x, $y, $w, $h, $transition=true, $vertical=false, $colors='A,R,G,B,C,M,Y,K') { - $bars = explode(',', $colors); - $numbars = count($bars); // number of bars to print - // set bar measures - if ($vertical) { - $coords = array(0, 0, 0, 1); - $wb = $w / $numbars; // bar width - $hb = $h; // bar height - $xd = $wb; // delta x - $yd = 0; // delta y - } else { - $coords = array(1, 0, 0, 0); - $wb = $w; // bar width - $hb = $h / $numbars; // bar height - $xd = 0; // delta x - $yd = $hb; // delta y - } - $xb = $x; - $yb = $y; - foreach ($bars as $col) { - switch ($col) { - // set transition colors - case 'A': { // BLACK - $col_a = array(255); - $col_b = array(0); - break; - } - case 'W': { // WHITE - $col_a = array(0); - $col_b = array(255); - break; - } - case 'R': { // R - $col_a = array(255,255,255); - $col_b = array(255,0,0); - break; - } - case 'G': { // G - $col_a = array(255,255,255); - $col_b = array(0,255,0); - break; - } - case 'B': { // B - $col_a = array(255,255,255); - $col_b = array(0,0,255); - break; - } - case 'C': { // C - $col_a = array(0,0,0,0); - $col_b = array(100,0,0,0); - break; - } - case 'M': { // M - $col_a = array(0,0,0,0); - $col_b = array(0,100,0,0); - break; - } - case 'Y': { // Y - $col_a = array(0,0,0,0); - $col_b = array(0,0,100,0); - break; - } - case 'K': { // K - $col_a = array(0,0,0,0); - $col_b = array(0,0,0,100); - break; - } - default: { // GRAY - $col_a = array(255); - $col_b = array(0); - break; - } - } - if ($transition) { - // color gradient - $this->LinearGradient($xb, $yb, $wb, $hb, $col_a, $col_b, $coords); - } else { - // color rectangle - $this->SetFillColorArray($col_b); - $this->Rect($xb, $yb, $wb, $hb, 'F', array()); - } - $xb += $xd; - $yb += $yd; - } - } - - /** - * Paints crop mark - * @param float $x abscissa of the crop mark center. - * @param float $y ordinate of the crop mark center. - * @param float $w width of the crop mark. - * @param float $h height of the crop mark. - * @param string $type type of crop mark, one sybol per type separated by comma: A = top left, B = top right, C = bottom left, D = bottom right. - * @param array $color crop mark color (default black). - * @author Nicola Asuni - * @since 4.9.000 (2010-03-26) - * @access public - */ - public function cropMark($x, $y, $w, $h, $type='A,B,C,D', $color=array(0,0,0)) { - $this->SetLineStyle(array('width' => (0.5 / $this->k), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $color)); - $crops = explode(',', $type); - $numcrops = count($crops); // number of crop marks to print - $dw = $w / 4; // horizontal space to leave before the intersection point - $dh = $h / 4; // vertical space to leave before the intersection point - foreach ($crops as $crop) { - switch ($crop) { - case 'A': { - $x1 = $x; - $y1 = $y - $h; - $x2 = $x; - $y2 = $y - $dh; - $x3 = $x - $w; - $y3 = $y; - $x4 = $x - $dw; - $y4 = $y; - break; - } - case 'B': { - $x1 = $x; - $y1 = $y - $h; - $x2 = $x; - $y2 = $y - $dh; - $x3 = $x + $dw; - $y3 = $y; - $x4 = $x + $w; - $y4 = $y; - break; - } - case 'C': { - $x1 = $x - $w; - $y1 = $y; - $x2 = $x - $dw; - $y2 = $y; - $x3 = $x; - $y3 = $y + $dh; - $x4 = $x; - $y4 = $y + $h; - break; - } - case 'D': { - $x1 = $x + $dw; - $y1 = $y; - $x2 = $x + $w; - $y2 = $y; - $x3 = $x; - $y3 = $y + $dh; - $x4 = $x; - $y4 = $y + $h; - break; - } - } - $this->Line($x1, $y1, $x2, $y2); - $this->Line($x3, $y3, $x4, $y4); - } - } - - /** - * Paints a registration mark - * @param float $x abscissa of the registration mark center. - * @param float $y ordinate of the registration mark center. - * @param float $r radius of the crop mark. - * @param boolean $double if true print two concentric crop marks. - * @param array $cola crop mark color (default black). - * @param array $colb second crop mark color. - * @author Nicola Asuni - * @since 4.9.000 (2010-03-26) - * @access public - */ - public function registrationMark($x, $y, $r, $double=false, $cola=array(0,0,0), $colb=array(255,255,255)) { - $line_style = array('width' => (0.5 / $this->k), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $cola); - $this->SetFillColorArray($cola); - $this->PieSector($x, $y, $r, 90, 180, 'F'); - $this->PieSector($x, $y, $r, 270, 360, 'F'); - $this->Circle($x, $y, $r, 0, 360, 'C', $line_style, array(), 8); - if ($double) { - $r2 = $r * 0.5; - $this->SetFillColorArray($colb); - $this->PieSector($x, $y, $r2, 90, 180, 'F'); - $this->PieSector($x, $y, $r2, 270, 360, 'F'); - $this->SetFillColorArray($cola); - $this->PieSector($x, $y, $r2, 0, 90, 'F'); - $this->PieSector($x, $y, $r2, 180, 270, 'F'); - $this->Circle($x, $y, $r2, 0, 360, 'C', $line_style, array(), 8); - } - } - - /** - * Paints a linear colour gradient. - * @param float $x abscissa of the top left corner of the rectangle. - * @param float $y ordinate of the top left corner of the rectangle. - * @param float $w width of the rectangle. - * @param float $h height of the rectangle. - * @param array $col1 first color (Grayscale, RGB or CMYK components). - * @param array $col2 second color (Grayscale, RGB or CMYK components). - * @param array $coords array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg). The default value is from left to right (x1=0, y1=0, x2=1, y2=0). - * @author Andreas Würmser, Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access public - */ - public function LinearGradient($x, $y, $w, $h, $col1=array(), $col2=array(), $coords=array(0,0,1,0)) { - $this->Clip($x, $y, $w, $h); - $this->Gradient(2, $coords, array(array('color' => $col1, 'offset' => 0, 'exponent' => 1), array('color' => $col2, 'offset' => 1, 'exponent' => 1)), array(), false); - } - - /** - * Paints a radial colour gradient. - * @param float $x abscissa of the top left corner of the rectangle. - * @param float $y ordinate of the top left corner of the rectangle. - * @param float $w width of the rectangle. - * @param float $h height of the rectangle. - * @param array $col1 first color (Grayscale, RGB or CMYK components). - * @param array $col2 second color (Grayscale, RGB or CMYK components). - * @param array $coords array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1, (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg). (fx, fy) should be inside the circle, otherwise some areas will not be defined. - * @author Andreas Würmser, Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access public - */ - public function RadialGradient($x, $y, $w, $h, $col1=array(), $col2=array(), $coords=array(0.5,0.5,0.5,0.5,1)) { - $this->Clip($x, $y, $w, $h); - $this->Gradient(3, $coords, array(array('color' => $col1, 'offset' => 0, 'exponent' => 1), array('color' => $col2, 'offset' => 1, 'exponent' => 1)), array(), false); - } - - /** - * Paints a coons patch mesh. - * @param float $x abscissa of the top left corner of the rectangle. - * @param float $y ordinate of the top left corner of the rectangle. - * @param float $w width of the rectangle. - * @param float $h height of the rectangle. - * @param array $col1 first color (lower left corner) (RGB components). - * @param array $col2 second color (lower right corner) (RGB components). - * @param array $col3 third color (upper right corner) (RGB components). - * @param array $col4 fourth color (upper left corner) (RGB components). - * @param array $coords
    • for one patch mesh: array(float x1, float y1, .... float x12, float y12): 12 pairs of coordinates (normally from 0 to 1) which specify the Bezier control points that define the patch. First pair is the lower left edge point, next is its right control point (control point 2). Then the other points are defined in the order: control point 1, edge point, control point 2 going counter-clockwise around the patch. Last (x12, y12) is the first edge point's left control point (control point 1).
    • for two or more patch meshes: array[number of patches]: arrays with the following keys for each patch: f: where to put that patch (0 = first patch, 1, 2, 3 = right, top and left of precedent patch - I didn't figure this out completely - just try and error ;-) points: 12 pairs of coordinates of the Bezier control points as above for the first patch, 8 pairs of coordinates for the following patches, ignoring the coordinates already defined by the precedent patch (I also didn't figure out the order of these - also: try and see what's happening) colors: must be 4 colors for the first patch, 2 colors for the following patches
    - * @param array $coords_min minimum value used by the coordinates. If a coordinate's value is smaller than this it will be cut to coords_min. default: 0 - * @param array $coords_max maximum value used by the coordinates. If a coordinate's value is greater than this it will be cut to coords_max. default: 1 - * @param boolean $antialias A flag indicating whether to filter the shading function to prevent aliasing artifacts. - * @author Andreas Würmser, Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access public - */ - public function CoonsPatchMesh($x, $y, $w, $h, $col1=array(), $col2=array(), $col3=array(), $col4=array(), $coords=array(0.00,0.0,0.33,0.00,0.67,0.00,1.00,0.00,1.00,0.33,1.00,0.67,1.00,1.00,0.67,1.00,0.33,1.00,0.00,1.00,0.00,0.67,0.00,0.33), $coords_min=0, $coords_max=1, $antialias=false) { - $this->Clip($x, $y, $w, $h); - $n = count($this->gradients) + 1; - $this->gradients[$n] = array(); - $this->gradients[$n]['type'] = 6; //coons patch mesh - $this->gradients[$n]['coords'] = array(); - $this->gradients[$n]['antialias'] = $antialias; - $this->gradients[$n]['colors'] = array(); - $this->gradients[$n]['transparency'] = false; - //check the coords array if it is the simple array or the multi patch array - if (!isset($coords[0]['f'])) { - //simple array -> convert to multi patch array - if (!isset($col1[1])) { - $col1[1] = $col1[2] = $col1[0]; - } - if (!isset($col2[1])) { - $col2[1] = $col2[2] = $col2[0]; - } - if (!isset($col3[1])) { - $col3[1] = $col3[2] = $col3[0]; - } - if (!isset($col4[1])) { - $col4[1] = $col4[2] = $col4[0]; - } - $patch_array[0]['f'] = 0; - $patch_array[0]['points'] = $coords; - $patch_array[0]['colors'][0]['r'] = $col1[0]; - $patch_array[0]['colors'][0]['g'] = $col1[1]; - $patch_array[0]['colors'][0]['b'] = $col1[2]; - $patch_array[0]['colors'][1]['r'] = $col2[0]; - $patch_array[0]['colors'][1]['g'] = $col2[1]; - $patch_array[0]['colors'][1]['b'] = $col2[2]; - $patch_array[0]['colors'][2]['r'] = $col3[0]; - $patch_array[0]['colors'][2]['g'] = $col3[1]; - $patch_array[0]['colors'][2]['b'] = $col3[2]; - $patch_array[0]['colors'][3]['r'] = $col4[0]; - $patch_array[0]['colors'][3]['g'] = $col4[1]; - $patch_array[0]['colors'][3]['b'] = $col4[2]; - } else { - //multi patch array - $patch_array = $coords; - } - $bpcd = 65535; //16 bits per coordinate - //build the data stream - $this->gradients[$n]['stream'] = ''; - $count_patch = count($patch_array); - for ($i=0; $i < $count_patch; ++$i) { - $this->gradients[$n]['stream'] .= chr($patch_array[$i]['f']); //start with the edge flag as 8 bit - $count_points = count($patch_array[$i]['points']); - for ($j=0; $j < $count_points; ++$j) { - //each point as 16 bit - $patch_array[$i]['points'][$j] = (($patch_array[$i]['points'][$j] - $coords_min) / ($coords_max - $coords_min)) * $bpcd; - if ($patch_array[$i]['points'][$j] < 0) { - $patch_array[$i]['points'][$j] = 0; - } - if ($patch_array[$i]['points'][$j] > $bpcd) { - $patch_array[$i]['points'][$j] = $bpcd; - } - $this->gradients[$n]['stream'] .= chr(floor($patch_array[$i]['points'][$j] / 256)); - $this->gradients[$n]['stream'] .= chr(floor($patch_array[$i]['points'][$j] % 256)); - } - $count_cols = count($patch_array[$i]['colors']); - for ($j=0; $j < $count_cols; ++$j) { - //each color component as 8 bit - $this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['r']); - $this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['g']); - $this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['b']); - } - } - //paint the gradient - $this->_out('/Sh'.$n.' sh'); - //restore previous Graphic State - $this->_out('Q'); - } - - /** - * Set a rectangular clipping area. - * @param float $x abscissa of the top left corner of the rectangle (or top right corner for RTL mode). - * @param float $y ordinate of the top left corner of the rectangle. - * @param float $w width of the rectangle. - * @param float $h height of the rectangle. - * @author Andreas Würmser, Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access protected - */ - protected function Clip($x, $y, $w, $h) { - if ($this->rtl) { - $x = $this->w - $x - $w; - } - //save current Graphic State - $s = 'q'; - //set clipping area - $s .= sprintf(' %.2F %.2F %.2F %.2F re W n', $x*$this->k, ($this->h-$y)*$this->k, $w*$this->k, -$h*$this->k); - //set up transformation matrix for gradient - $s .= sprintf(' %.3F 0 0 %.3F %.3F %.3F cm', $w*$this->k, $h*$this->k, $x*$this->k, ($this->h-($y+$h))*$this->k); - $this->_out($s); - } - - /** - * Output gradient. - * @param int $type type of gradient (1 Function-based shading; 2 Axial shading; 3 Radial shading; 4 Free-form Gouraud-shaded triangle mesh; 5 Lattice-form Gouraud-shaded triangle mesh; 6 Coons patch mesh; 7 Tensor-product patch mesh). (Not all types are currently supported) - * @param array $coords array of coordinates. - * @param array $stops array gradient color components: color = array of GRAY, RGB or CMYK color components; offset = (0 to 1) represents a location along the gradient vector; exponent = exponent of the exponential interpolation function (default = 1). - * @param array $background An array of colour components appropriate to the colour space, specifying a single background colour value. - * @param boolean $antialias A flag indicating whether to filter the shading function to prevent aliasing artifacts. - * @author Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access public - */ - public function Gradient($type, $coords, $stops, $background=array(), $antialias=false) { - $n = count($this->gradients) + 1; - $this->gradients[$n] = array(); - $this->gradients[$n]['type'] = $type; - $this->gradients[$n]['coords'] = $coords; - $this->gradients[$n]['antialias'] = $antialias; - $this->gradients[$n]['colors'] = array(); - $this->gradients[$n]['transparency'] = false; - // color space - $numcolspace = count($stops[0]['color']); - $bcolor = array_values($background); - switch($numcolspace) { - case 4: { // CMYK - $this->gradients[$n]['colspace'] = 'DeviceCMYK'; - if (!empty($background)) { - $this->gradients[$n]['background'] = sprintf('%.3F %.3F %.3F %.3F', $bcolor[0]/100, $bcolor[1]/100, $bcolor[2]/100, $bcolor[3]/100); - } - break; - } - case 3: { // RGB - $this->gradients[$n]['colspace'] = 'DeviceRGB'; - if (!empty($background)) { - $this->gradients[$n]['background'] = sprintf('%.3F %.3F %.3F', $bcolor[0]/255, $bcolor[1]/255, $bcolor[2]/255); - } - break; - } - case 1: { // Gray scale - $this->gradients[$n]['colspace'] = 'DeviceGray'; - if (!empty($background)) { - $this->gradients[$n]['background'] = sprintf('%.3F', $bcolor[0]/255); - } - break; - } - } - $num_stops = count($stops); - $last_stop_id = $num_stops - 1; - foreach ($stops as $key => $stop) { - $this->gradients[$n]['colors'][$key] = array(); - // offset represents a location along the gradient vector - if (isset($stop['offset'])) { - $this->gradients[$n]['colors'][$key]['offset'] = $stop['offset']; - } else { - if ($key == 0) { - $this->gradients[$n]['colors'][$key]['offset'] = 0; - } elseif ($key == $last_stop_id) { - $this->gradients[$n]['colors'][$key]['offset'] = 1; - } else { - $offsetstep = (1 - $this->gradients[$n]['colors'][($key - 1)]['offset']) / ($num_stops - $key); - $this->gradients[$n]['colors'][$key]['offset'] = $this->gradients[$n]['colors'][($key - 1)]['offset'] + $offsetstep; - } - } - if (isset($stop['opacity'])) { - $this->gradients[$n]['colors'][$key]['opacity'] = $stop['opacity']; - if ($stop['opacity'] < 1) { - $this->gradients[$n]['transparency'] = true; - } - } else { - $this->gradients[$n]['colors'][$key]['opacity'] = 1; - } - // exponent for the exponential interpolation function - if (isset($stop['exponent'])) { - $this->gradients[$n]['colors'][$key]['exponent'] = $stop['exponent']; - } else { - $this->gradients[$n]['colors'][$key]['exponent'] = 1; - } - // set colors - $color = array_values($stop['color']); - switch($numcolspace) { - case 4: { // CMYK - $this->gradients[$n]['colors'][$key]['color'] = sprintf('%.3F %.3F %.3F %.3F', $color[0]/100, $color[1]/100, $color[2]/100, $color[3]/100); - break; - } - case 3: { // RGB - $this->gradients[$n]['colors'][$key]['color'] = sprintf('%.3F %.3F %.3F', $color[0]/255, $color[1]/255, $color[2]/255); - break; - } - case 1: { // Gray scale - $this->gradients[$n]['colors'][$key]['color'] = sprintf('%.3F', $color[0]/255); - break; - } - } - } - if ($this->gradients[$n]['transparency']) { - // paint luminosity gradient - $this->_out('/TGS'.$n.' gs'); - } - //paint the gradient - $this->_out('/Sh'.$n.' sh'); - //restore previous Graphic State - $this->_out('Q'); - } - - /** - * Output gradient shaders. - * @author Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access protected - */ - function _putshaders() { - $idt = count($this->gradients); //index for transparency gradients - foreach ($this->gradients as $id => $grad) { - if (($grad['type'] == 2) OR ($grad['type'] == 3)) { - $fc = $this->_newobj(); - $out = '<<'; - $out .= ' /FunctionType 3'; - $out .= ' /Domain [0 1]'; - $functions = ''; - $bounds = ''; - $encode = ''; - $i = 1; - $num_cols = count($grad['colors']); - $lastcols = $num_cols - 1; - for ($i = 1; $i < $num_cols; ++$i) { - $functions .= ($fc + $i).' 0 R '; - if ($i < $lastcols) { - $bounds .= sprintf('%.3F ', $grad['colors'][$i]['offset']); - } - $encode .= '0 1 '; - } - $out .= ' /Functions ['.trim($functions).']'; - $out .= ' /Bounds ['.trim($bounds).']'; - $out .= ' /Encode ['.trim($encode).']'; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - for ($i = 1; $i < $num_cols; ++$i) { - $this->_newobj(); - $out = '<<'; - $out .= ' /FunctionType 2'; - $out .= ' /Domain [0 1]'; - $out .= ' /C0 ['.$grad['colors'][($i - 1)]['color'].']'; - $out .= ' /C1 ['.$grad['colors'][$i]['color'].']'; - $out .= ' /N '.$grad['colors'][$i]['exponent']; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - // set transparency fuctions - if ($grad['transparency']) { - $ft = $this->_newobj(); - $out = '<<'; - $out .= ' /FunctionType 3'; - $out .= ' /Domain [0 1]'; - $functions = ''; - $i = 1; - $num_cols = count($grad['colors']); - for ($i = 1; $i < $num_cols; ++$i) { - $functions .= ($ft + $i).' 0 R '; - } - $out .= ' /Functions ['.trim($functions).']'; - $out .= ' /Bounds ['.trim($bounds).']'; - $out .= ' /Encode ['.trim($encode).']'; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - for ($i = 1; $i < $num_cols; ++$i) { - $this->_newobj(); - $out = '<<'; - $out .= ' /FunctionType 2'; - $out .= ' /Domain [0 1]'; - $out .= ' /C0 ['.$grad['colors'][($i - 1)]['opacity'].']'; - $out .= ' /C1 ['.$grad['colors'][$i]['opacity'].']'; - $out .= ' /N '.$grad['colors'][$i]['exponent']; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - } - } - } - // set shading object - $this->_newobj(); - $out = '<< /ShadingType '.$grad['type']; - if (isset($grad['colspace'])) { - $out .= ' /ColorSpace /'.$grad['colspace']; - } else { - $out .= ' /ColorSpace /DeviceRGB'; - } - if (isset($grad['background']) AND !empty($grad['background'])) { - $out .= ' /Background ['.$grad['background'].']'; - } - if (isset($grad['antialias']) AND ($grad['antialias'] === true)) { - $out .= ' /AntiAlias true'; - } - if ($grad['type'] == 2) { - $out .= ' '.sprintf('/Coords [%.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3]); - $out .= ' /Domain [0 1]'; - $out .= ' /Function '.$fc.' 0 R'; - $out .= ' /Extend [true true]'; - $out .= ' >>'; - } elseif ($grad['type'] == 3) { - //x0, y0, r0, x1, y1, r1 - //at this this time radius of inner circle is 0 - $out .= ' '.sprintf('/Coords [%.3F %.3F 0 %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3], $grad['coords'][4]); - $out .= ' /Domain [0 1]'; - $out .= ' /Function '.$fc.' 0 R'; - $out .= ' /Extend [true true]'; - $out .= ' >>'; - } elseif ($grad['type'] == 6) { - $out .= ' /BitsPerCoordinate 16'; - $out .= ' /BitsPerComponent 8'; - $out .= ' /Decode[0 1 0 1 0 1 0 1 0 1]'; - $out .= ' /BitsPerFlag 8'; - $stream = $this->_getrawstream($grad['stream']); - $out .= ' /Length '.strlen($stream); - $out .= ' >>'; - $out .= ' stream'."\n".$stream."\n".'endstream'; - } - $out .= "\n".'endobj'; - $this->_out($out); - if ($grad['transparency']) { - $shading_transparency = preg_replace('/\/ColorSpace \/[^\s]+/si', '/ColorSpace /DeviceGray', $out); - $shading_transparency = preg_replace('/\/Function [0-9]+ /si', '/Function '.$ft.' ', $shading_transparency); - } - $this->gradients[$id]['id'] = $this->n; - // set pattern object - $this->_newobj(); - $out = '<< /Type /Pattern /PatternType 2'; - $out .= ' /Shading '.$this->gradients[$id]['id'].' 0 R'; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - $this->gradients[$id]['pattern'] = $this->n; - // set shading and pattern for transparency mask - if ($grad['transparency']) { - // luminosity pattern - $idgs = $id + $idt; - $this->_newobj(); - $this->_out($shading_transparency); - $this->gradients[$idgs]['id'] = $this->n; - $this->_newobj(); - $out = '<< /Type /Pattern /PatternType 2'; - $out .= ' /Shading '.$this->gradients[$idgs]['id'].' 0 R'; - $out .= ' >>'; - $out .= "\n".'endobj'; - $this->_out($out); - $this->gradients[$idgs]['pattern'] = $this->n; - // luminosity XObject - $oid = $this->_newobj(); - $this->xobjects['LX'.$oid] = array('n' => $oid); - $filter = ''; - $stream = 'q /a0 gs /Pattern cs /p'.$idgs.' scn 0 0 '.$this->wPt.' '.$this->hPt.' re f Q'; - if ($this->compress) { - $filter = ' /Filter /FlateDecode'; - $stream = gzcompress($stream); - } - $stream = $this->_getrawstream($stream); - $out = '<< /Type /XObject /Subtype /Form /FormType 1'.$filter; - $out .= ' /Length '.strlen($stream); - $rect = sprintf('%.2F %.2F', $this->wPt, $this->hPt); - $out .= ' /BBox [0 0 '.$rect.']'; - $out .= ' /Group << /Type /Group /S /Transparency /CS /DeviceGray >>'; - $out .= ' /Resources <<'; - $out .= ' /ExtGState << /a0 << /ca 1 /CA 1 >> >>'; - $out .= ' /Pattern << /p'.$idgs.' '.$this->gradients[$idgs]['pattern'].' 0 R >>'; - $out .= ' >>'; - $out .= ' >> '; - $out .= ' stream'."\n".$stream."\n".'endstream'; - $out .= "\n".'endobj'; - $this->_out($out); - // SMask - $this->_newobj(); - $out = '<< /Type /Mask /S /Luminosity /G '.($this->n - 1).' 0 R >>'."\n".'endobj'; - $this->_out($out); - // ExtGState - $this->_newobj(); - $out = '<< /Type /ExtGState /SMask '.($this->n - 1).' 0 R /AIS false >>'."\n".'endobj'; - $this->_out($out); - $this->extgstates[] = array('n' => $this->n, 'name' => 'TGS'.$id); - } - } - } - - /** - * Draw the sector of a circle. - * It can be used for instance to render pie charts. - * @param float $xc abscissa of the center. - * @param float $yc ordinate of the center. - * @param float $r radius. - * @param float $a start angle (in degrees). - * @param float $b end angle (in degrees). - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param float $cw: indicates whether to go clockwise (default: true). - * @param float $o: origin of angles (0 for 3 o'clock, 90 for noon, 180 for 9 o'clock, 270 for 6 o'clock). Default: 90. - * @author Maxime Delorme, Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access public - */ - public function PieSector($xc, $yc, $r, $a, $b, $style='FD', $cw=true, $o=90) { - $this->PieSectorXY($xc, $yc, $r, $r, $a, $b, $style, $cw, $o); - } - - /** - * Draw the sector of an ellipse. - * It can be used for instance to render pie charts. - * @param float $xc abscissa of the center. - * @param float $yc ordinate of the center. - * @param float $rx the x-axis radius. - * @param float $ry the y-axis radius. - * @param float $a start angle (in degrees). - * @param float $b end angle (in degrees). - * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. - * @param float $cw: indicates whether to go clockwise. - * @param float $o: origin of angles (0 for 3 o'clock, 90 for noon, 180 for 9 o'clock, 270 for 6 o'clock). - * @param integer $nc Number of curves used to draw a 90 degrees portion of arc. - * @author Maxime Delorme, Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access public - */ - public function PieSectorXY($xc, $yc, $rx, $ry, $a, $b, $style='FD', $cw=false, $o=0, $nc=2) { - if ($this->rtl) { - $xc = $this->w - $xc; - } - $op = $this->getPathPaintOperator($style); - if ($op == 'f') { - $line_style = array(); - } - if ($cw) { - $d = $b; - $b = 360 - $a + $o; - $a = 360 - $d + $o; - } else { - $b += $o; - $a += $o; - } - $this->_outellipticalarc($xc, $yc, $rx, $ry, 0, $a, $b, true, $nc); - $this->_out($op); - } - - /** - * Embed vector-based Adobe Illustrator (AI) or AI-compatible EPS files. - * NOTE: EPS is not yet fully implemented, use the setRasterizeVectorImages() method to enable/disable rasterization of vector images using ImageMagick library. - * Only vector drawing is supported, not text or bitmap. - * Although the script was successfully tested with various AI format versions, best results are probably achieved with files that were exported in the AI3 format (tested with Illustrator CS2, Freehand MX and Photoshop CS2). - * @param string $file Name of the file containing the image. - * @param float $x Abscissa of the upper-left corner. - * @param float $y Ordinate of the upper-left corner. - * @param float $w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. - * @param float $h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. - * @param mixed $link URL or identifier returned by AddLink(). - * @param boolean useBoundingBox specifies whether to position the bounding box (true) or the complete canvas (false) at location (x,y). Default value is true. - * @param string $align Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:
    • T: top-right for LTR or top-left for RTL
    • M: middle-right for LTR or middle-left for RTL
    • B: bottom-right for LTR or bottom-left for RTL
    • N: next line
    - * @param string $palign Allows to center or align the image on the current line. Possible values are:
    • L : left align
    • C : center
    • R : right align
    • '' : empty string : left for LTR or right for RTL
    - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
    • 0: no border (default)
    • 1: frame
    or a string containing some or all of the following characters (in any order):
    • L: left
    • T: top
    • R: right
    • B: bottom
    or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param boolean $fitonpage if true the image is resized to not exceed page dimensions. - * @author Valentin Schmidt, Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access public - */ - public function ImageEps($file, $x='', $y='', $w=0, $h=0, $link='', $useBoundingBox=true, $align='', $palign='', $border=0, $fitonpage=false) { - if ($this->rasterize_vector_images AND ($w > 0) AND ($h > 0)) { - // convert EPS to raster image using GD or ImageMagick libraries - return $this->Image($file, $x, $y, $w, $h, 'EPS', $link, $align, true, 300, $palign, false, false, $border, false, false, $fitonpage); - } - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - $k = $this->k; - $data = file_get_contents($file); - if ($data === false) { - $this->Error('EPS file not found: '.$file); - } - $regs = array(); - // EPS/AI compatibility check (only checks files created by Adobe Illustrator!) - preg_match("/%%Creator:([^\r\n]+)/", $data, $regs); # find Creator - if (count($regs) > 1) { - $version_str = trim($regs[1]); # e.g. "Adobe Illustrator(R) 8.0" - if (strpos($version_str, 'Adobe Illustrator') !== false) { - $versexp = explode(' ', $version_str); - $version = (float)array_pop($versexp); - if ($version >= 9) { - $this->Error('This version of Adobe Illustrator file is not supported: '.$file); - } - } - } - // strip binary bytes in front of PS-header - $start = strpos($data, '%!PS-Adobe'); - if ($start > 0) { - $data = substr($data, $start); - } - // find BoundingBox params - preg_match("/%%BoundingBox:([^\r\n]+)/", $data, $regs); - if (count($regs) > 1) { - list($x1, $y1, $x2, $y2) = explode(' ', trim($regs[1])); - } else { - $this->Error('No BoundingBox found in EPS file: '.$file); - } - $start = strpos($data, '%%EndSetup'); - if ($start === false) { - $start = strpos($data, '%%EndProlog'); - } - if ($start === false) { - $start = strpos($data, '%%BoundingBox'); - } - $data = substr($data, $start); - $end = strpos($data, '%%PageTrailer'); - if ($end===false) { - $end = strpos($data, 'showpage'); - } - if ($end) { - $data = substr($data, 0, $end); - } - // calculate image width and height on document - if (($w <= 0) AND ($h <= 0)) { - $w = ($x2 - $x1) / $k; - $h = ($y2 - $y1) / $k; - } elseif ($w <= 0) { - $w = ($x2-$x1) / $k * ($h / (($y2 - $y1) / $k)); - } elseif ($h <= 0) { - $h = ($y2 - $y1) / $k * ($w / (($x2 - $x1) / $k)); - } - // fit the image on available space - $this->fitBlock($w, $h, $x, $y, $fitonpage); - if ($this->rasterize_vector_images) { - // convert EPS to raster image using GD or ImageMagick libraries - return $this->Image($file, $x, $y, $w, $h, 'EPS', $link, $align, true, 300, $palign, false, false, $border, false, false, $fitonpage); - } - // set scaling factors - $scale_x = $w / (($x2 - $x1) / $k); - $scale_y = $h / (($y2 - $y1) / $k); - // set alignment - $this->img_rb_y = $y + $h; - // set alignment - if ($this->rtl) { - if ($palign == 'L') { - $ximg = $this->lMargin; - } elseif ($palign == 'C') { - $ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($palign == 'R') { - $ximg = $this->w - $this->rMargin - $w; - } else { - $ximg = $x - $w; - } - $this->img_rb_x = $ximg; - } else { - if ($palign == 'L') { - $ximg = $this->lMargin; - } elseif ($palign == 'C') { - $ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($palign == 'R') { - $ximg = $this->w - $this->rMargin - $w; - } else { - $ximg = $x; - } - $this->img_rb_x = $ximg + $w; - } - if ($useBoundingBox) { - $dx = $ximg * $k - $x1; - $dy = $y * $k - $y1; - } else { - $dx = $ximg * $k; - $dy = $y * $k; - } - // save the current graphic state - $this->_out('q'.$this->epsmarker); - // translate - $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', 1, 0, 0, 1, $dx, $dy + ($this->hPt - (2 * $y * $k) - ($y2 - $y1)))); - // scale - if (isset($scale_x)) { - $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $scale_x, 0, 0, $scale_y, $x1 * (1 - $scale_x), $y2 * (1 - $scale_y))); - } - // handle pc/unix/mac line endings - preg_match('/[\r\n]+/s', $data, $regs); - $lines = explode($regs[0], $data); - $u=0; - $cnt = count($lines); - for ($i=0; $i < $cnt; ++$i) { - $line = $lines[$i]; - if (($line == '') OR ($line{0} == '%')) { - continue; - } - $len = strlen($line); - $chunks = explode(' ', $line); - $cmd = array_pop($chunks); - // RGB - if (($cmd == 'Xa') OR ($cmd == 'XA')) { - $b = array_pop($chunks); - $g = array_pop($chunks); - $r = array_pop($chunks); - $this->_out(''.$r.' '.$g.' '.$b.' '.($cmd=='Xa'?'rg':'RG')); //substr($line, 0, -2).'rg' -> in EPS (AI8): c m y k r g b rg! - continue; - } - switch ($cmd) { - case 'm': - case 'l': - case 'v': - case 'y': - case 'c': - case 'k': - case 'K': - case 'g': - case 'G': - case 's': - case 'S': - case 'J': - case 'j': - case 'w': - case 'M': - case 'd': - case 'n': { - $this->_out($line); - break; - } - case 'x': {// custom fill color - list($c,$m,$y,$k) = $chunks; - $this->_out(''.$c.' '.$m.' '.$y.' '.$k.' k'); - break; - } - case 'X': { // custom stroke color - list($c,$m,$y,$k) = $chunks; - $this->_out(''.$c.' '.$m.' '.$y.' '.$k.' K'); - break; - } - case 'Y': - case 'N': - case 'V': - case 'L': - case 'C': { - $line{$len-1} = strtolower($cmd); - $this->_out($line); - break; - } - case 'b': - case 'B': { - $this->_out($cmd . '*'); - break; - } - case 'f': - case 'F': { - if ($u > 0) { - $isU = false; - $max = min($i+5, $cnt); - for ($j=$i+1; $j < $max; ++$j) { - $isU = ($isU OR (($lines[$j] == 'U') OR ($lines[$j] == '*U'))); - } - if ($isU) { - $this->_out('f*'); - } - } else { - $this->_out('f*'); - } - break; - } - case '*u': { - ++$u; - break; - } - case '*U': { - --$u; - break; - } - } - } - // restore previous graphic state - $this->_out($this->epsmarker.'Q'); - if (!empty($border)) { - $bx = $this->x; - $by = $this->y; - $this->x = $ximg; - if ($this->rtl) { - $this->x += $w; - } - $this->y = $y; - $this->Cell($w, $h, '', $border, 0, '', 0, '', 0, true); - $this->x = $bx; - $this->y = $by; - } - if ($link) { - $this->Link($ximg, $y, $w, $h, $link, 0); - } - // set pointer to align the next text/objects - switch($align) { - case 'T':{ - $this->y = $y; - $this->x = $this->img_rb_x; - break; - } - case 'M':{ - $this->y = $y + round($h/2); - $this->x = $this->img_rb_x; - break; - } - case 'B':{ - $this->y = $this->img_rb_y; - $this->x = $this->img_rb_x; - break; - } - case 'N':{ - $this->SetY($this->img_rb_y); - break; - } - default:{ - break; - } - } - $this->endlinex = $this->img_rb_x; - } - - /** - * Set document barcode. - * @param string $bc barcode - * @access public - */ - public function setBarcode($bc='') { - $this->barcode = $bc; - } - - /** - * Get current barcode. - * @return string - * @access public - * @since 4.0.012 (2008-07-24) - */ - public function getBarcode() { - return $this->barcode; - } - - /** - * Print a Linear Barcode. - * @param string $code code to print - * @param string $type type of barcode (see barcodes.php for supported formats). - * @param int $x x position in user units (empty string = current x position) - * @param int $y y position in user units (empty string = current y position) - * @param int $w width in user units (empty string = remaining page width) - * @param int $h height in user units (empty string = remaining page height) - * @param float $xres width of the smallest bar in user units (empty string = default value = 0.4mm) - * @param array $style array of options:
      - *
    • boolean $style['border'] if true prints a border
    • - *
    • int $style['padding'] padding to leave around the barcode in user units (set to 'auto' for automatic padding)
    • - *
    • int $style['hpadding'] horizontal padding in user units (set to 'auto' for automatic padding)
    • - *
    • int $style['vpadding'] vertical padding in user units (set to 'auto' for automatic padding)
    • - *
    • array $style['fgcolor'] color array for bars and text
    • - *
    • mixed $style['bgcolor'] color array for background (set to false for transparent)
    • - *
    • boolean $style['text'] if true prints text below the barcode
    • - *
    • string $style['label'] override default label
    • - *
    • string $style['font'] font name for text
    • int $style['fontsize'] font size for text
    • - *
    • int $style['stretchtext']: 0 = disabled; 1 = horizontal scaling only if necessary; 2 = forced horizontal scaling; 3 = character spacing only if necessary; 4 = forced character spacing.
    • - *
    • string $style['position'] horizontal position of the containing barcode cell on the page: L = left margin; C = center; R = right margin.
    • - *
    • string $style['align'] horizontal position of the barcode on the containing rectangle: L = left; C = center; R = right.
    • - *
    • string $style['stretch'] if true stretch the barcode to best fit the available width, otherwise uses $xres resolution for a single bar.
    • - *
    • string $style['fitwidth'] if true reduce the width to fit the barcode width + padding. When this option is enabled the 'stretch' option is automatically disabled.
    • - *
    • string $style['cellfitalign'] this option works only when 'fitwidth' is true and 'position' is unset or empty. Set the horizontal position of the containing barcode cell inside the specified rectangle: L = left; C = center; R = right.
    - * @param string $align Indicates the alignment of the pointer next to barcode insertion relative to barcode height. The value can be:
    • T: top-right for LTR or top-left for RTL
    • M: middle-right for LTR or middle-left for RTL
    • B: bottom-right for LTR or bottom-left for RTL
    • N: next line
    - * @author Nicola Asuni - * @since 3.1.000 (2008-06-09) - * @access public - */ - public function write1DBarcode($code, $type, $x='', $y='', $w='', $h='', $xres='', $style='', $align='') { - if ($this->empty_string(trim($code))) { - return; - } - require_once(dirname(__FILE__).'/barcodes.php'); - // save current graphic settings - $gvars = $this->getGraphicVars(); - // create new barcode object - $barcodeobj = new TCPDFBarcode($code, $type); - $arrcode = $barcodeobj->getBarcodeArray(); - if ($arrcode === false) { - $this->Error('Error in 1D barcode string'); - } - // set default values - if (!isset($style['position'])) { - $style['position'] = ''; - } elseif ($style['position'] == 'S') { - // keep this for backward compatibility - $style['position'] = ''; - $style['stretch'] = true; - } - if (!isset($style['fitwidth'])) { - if (!isset($style['stretch'])) { - $style['fitwidth'] = true; - } else { - $style['fitwidth'] = false; - } - } - if ($style['fitwidth']) { - // disable stretch - $style['stretch'] = false; - } - if (!isset($style['stretch'])) { - if (($w === '') OR ($w <= 0)) { - $style['stretch'] = false; - } else { - $style['stretch'] = true; - } - } - if (!isset($style['fgcolor'])) { - $style['fgcolor'] = array(0,0,0); // default black - } - if (!isset($style['bgcolor'])) { - $style['bgcolor'] = false; // default transparent - } - if (!isset($style['border'])) { - $style['border'] = false; - } - $fontsize = 0; - if (!isset($style['text'])) { - $style['text'] = false; - } - if ($style['text'] AND isset($style['font'])) { - if (isset($style['fontsize'])) { - $fontsize = $style['fontsize']; - } - $this->SetFont($style['font'], '', $fontsize); - } - if (!isset($style['stretchtext'])) { - $style['stretchtext'] = 4; - } - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - if (($w === '') OR ($w <= 0)) { - if ($this->rtl) { - $w = $x - $this->lMargin; - } else { - $w = $this->w - $this->rMargin - $x; - } - } - // padding - if (!isset($style['padding'])) { - $padding = 0; - } elseif ($style['padding'] === 'auto') { - $padding = 10 * ($w / ($arrcode['maxw'] + 20)); - } else { - $padding = floatval($style['padding']); - } - // horizontal padding - if (!isset($style['hpadding'])) { - $hpadding = $padding; - } elseif ($style['hpadding'] === 'auto') { - $hpadding = 10 * ($w / ($arrcode['maxw'] + 20)); - } else { - $hpadding = floatval($style['hpadding']); - } - // vertical padding - if (!isset($style['vpadding'])) { - $vpadding = $padding; - } elseif ($style['vpadding'] === 'auto') { - $vpadding = ($hpadding / 2); - } else { - $vpadding = floatval($style['vpadding']); - } - // calculate xres (single bar width) - $max_xres = ($w - (2 * $hpadding)) / $arrcode['maxw']; - if ($style['stretch']) { - $xres = $max_xres; - } else { - if ($this->empty_string($xres)) { - $xres = (0.141 * $this->k); // default bar width = 0.4 mm - } - if ($xres > $max_xres) { - // correct xres to fit on $w - $xres = $max_xres; - } - if ((isset($style['padding']) AND ($style['padding'] === 'auto')) - OR (isset($style['hpadding']) AND ($style['hpadding'] === 'auto'))) { - $hpadding = 10 * $xres; - if (isset($style['vpadding']) AND ($style['vpadding'] === 'auto')) { - $vpadding = ($hpadding / 2); - } - } - } - if ($style['fitwidth']) { - $wold = $w; - $w = (($arrcode['maxw'] * $xres) + (2 * $hpadding)); - if (isset($style['cellfitalign'])) { - switch ($style['cellfitalign']) { - case 'L': { - if ($this->rtl) { - $x -= ($wold - $w); - } - break; - } - case 'R': { - if (!$this->rtl) { - $x += ($wold - $w); - } - break; - } - case 'C': { - if ($this->rtl) { - $x -= (($wold - $w) / 2); - } else { - $x += (($wold - $w) / 2); - } - break; - } - default : { - break; - } - } - } - } - $text_height = ($this->cell_height_ratio * $fontsize / $this->k); - // height - if (($h === '') OR ($h <= 0)) { - // set default height - $h = (($arrcode['maxw'] * $xres) / 3) + (2 * $vpadding) + $text_height; - } - $barh = $h - $text_height - (2 * $vpadding); - if ($barh <=0) { - // try to reduce font or padding to fit barcode on available height - if ($text_height > $h) { - $fontsize = (($h * $this->k) / (4 * $this->cell_height_ratio)); - $text_height = ($this->cell_height_ratio * $fontsize / $this->k); - $this->SetFont($style['font'], '', $fontsize); - } - if ($vpadding > 0) { - $vpadding = (($h - $text_height) / 4); - } - $barh = $h - $text_height - (2 * $vpadding); - } - // fit the barcode on available space - $this->fitBlock($w, $h, $x, $y, false); - // set alignment - $this->img_rb_y = $y + $h; - // set alignment - if ($this->rtl) { - if ($style['position'] == 'L') { - $xpos = $this->lMargin; - } elseif ($style['position'] == 'C') { - $xpos = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($style['position'] == 'R') { - $xpos = $this->w - $this->rMargin - $w; - } else { - $xpos = $x - $w; - } - $this->img_rb_x = $xpos; - } else { - if ($style['position'] == 'L') { - $xpos = $this->lMargin; - } elseif ($style['position'] == 'C') { - $xpos = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($style['position'] == 'R') { - $xpos = $this->w - $this->rMargin - $w; - } else { - $xpos = $x; - } - $this->img_rb_x = $xpos + $w; - } - $xpos_rect = $xpos; - if (!isset($style['align'])) { - $style['align'] = 'C'; - } - switch ($style['align']) { - case 'L': { - $xpos = $xpos_rect + $hpadding; - break; - } - case 'R': { - $xpos = $xpos_rect + ($w - ($arrcode['maxw'] * $xres)) - $hpadding; - break; - } - case 'C': - default : { - $xpos = $xpos_rect + (($w - ($arrcode['maxw'] * $xres)) / 2); - break; - } - } - $xpos_text = $xpos; - // barcode is always printed in LTR direction - $tempRTL = $this->rtl; - $this->rtl = false; - // print background color - if ($style['bgcolor']) { - $this->Rect($xpos_rect, $y, $w, $h, $style['border'] ? 'DF' : 'F', '', $style['bgcolor']); - } elseif ($style['border']) { - $this->Rect($xpos_rect, $y, $w, $h, 'D'); - } - // set foreground color - $this->SetDrawColorArray($style['fgcolor']); - $this->SetTextColorArray($style['fgcolor']); - // print bars - foreach ($arrcode['bcode'] as $k => $v) { - $bw = ($v['w'] * $xres); - if ($v['t']) { - // draw a vertical bar - $ypos = $y + $vpadding + ($v['p'] * $barh / $arrcode['maxh']); - $this->Rect($xpos, $ypos, $bw, ($v['h'] * $barh / $arrcode['maxh']), 'F', array(), $style['fgcolor']); - } - $xpos += $bw; - } - // print text - if ($style['text']) { - if (isset($style['label']) AND !$this->empty_string($style['label'])) { - $label = $style['label']; - } else { - $label = $code; - } - $txtwidth = ($arrcode['maxw'] * $xres); - if ($this->GetStringWidth($label) > $txtwidth) { - $style['stretchtext'] = 2; - } - // print text - $this->x = $xpos_text; - $this->y = $y + $vpadding + $barh; - $cellpadding = $this->cell_padding; - $this->SetCellPadding(0); - $this->Cell($txtwidth, '', $label, 0, 0, 'C', 0, '', $style['stretchtext'], false, 'T', 'T'); - $this->cell_padding = $cellpadding; - } - // restore original direction - $this->rtl = $tempRTL; - // restore previous settings - $this->setGraphicVars($gvars); - // set pointer to align the next text/objects - switch($align) { - case 'T':{ - $this->y = $y; - $this->x = $this->img_rb_x; - break; - } - case 'M':{ - $this->y = $y + round($h / 2); - $this->x = $this->img_rb_x; - break; - } - case 'B':{ - $this->y = $this->img_rb_y; - $this->x = $this->img_rb_x; - break; - } - case 'N':{ - $this->SetY($this->img_rb_y); - break; - } - default:{ - break; - } - } - $this->endlinex = $this->img_rb_x; - } - - /** - * This function is DEPRECATED, please use the new write1DBarcode() function. - * @param int $x x position in user units - * @param int $y y position in user units - * @param int $w width in user units - * @param int $h height position in user units - * @param string $type type of barcode - * @param string $style barcode style - * @param string $font font for text - * @param int $xres x resolution - * @param string $code code to print - * @deprecated deprecated since version 3.1.000 (2008-06-10) - * @access public - * @see write1DBarcode() - */ - public function writeBarcode($x, $y, $w, $h, $type, $style, $font, $xres, $code) { - // convert old settings for the new write1DBarcode() function. - $xres = 1 / $xres; - $newstyle = array( - 'position' => '', - 'align' => '', - 'stretch' => false, - 'fitwidth' => false, - 'cellfitalign' => '', - 'border' => false, - 'padding' => 0, - 'fgcolor' => array(0,0,0), - 'bgcolor' => false, - 'text' => true, - 'font' => $font, - 'fontsize' => 8, - 'stretchtext' => 4 - ); - if ($style & 1) { - $newstyle['border'] = true; - } - if ($style & 2) { - $newstyle['bgcolor'] = false; - } - if ($style & 4) { - $newstyle['position'] = 'C'; - } elseif ($style & 8) { - $newstyle['position'] = 'L'; - } elseif ($style & 16) { - $newstyle['position'] = 'R'; - } - if ($style & 128) { - $newstyle['text'] = true; - } - if ($style & 256) { - $newstyle['stretchtext'] = 4; - } - $this->write1DBarcode($code, $type, $x, $y, $w, $h, $xres, $newstyle, ''); - } - - /** - * Print 2D Barcode. - * @param string $code code to print - * @param string $type type of barcode (see 2dbarcodes.php for supported formats). - * @param int $x x position in user units - * @param int $y y position in user units - * @param int $w width in user units - * @param int $h height in user units - * @param array $style array of options:
      - *
    • boolean $style['border'] if true prints a border around the barcode
    • - *
    • int $style['padding'] padding to leave around the barcode in barcode units (set to 'auto' for automatic padding)
    • - *
    • int $style['hpadding'] horizontal padding in barcode units (set to 'auto' for automatic padding)
    • - *
    • int $style['vpadding'] vertical padding in barcode units (set to 'auto' for automatic padding)
    • - *
    • int $style['module_width'] width of a single module in points
    • - *
    • int $style['module_height'] height of a single module in points
    • - *
    • array $style['fgcolor'] color array for bars and text
    • - *
    • mixed $style['bgcolor'] color array for background or false for transparent
    • - *
    • string $style['position'] barcode position on the page: L = left margin; C = center; R = right margin; S = stretch
    • $style['module_width'] width of a single module in points
    • - *
    • $style['module_height'] height of a single module in points
    - * @param string $align Indicates the alignment of the pointer next to barcode insertion relative to barcode height. The value can be:
    • T: top-right for LTR or top-left for RTL
    • M: middle-right for LTR or middle-left for RTL
    • B: bottom-right for LTR or bottom-left for RTL
    • N: next line
    - * @param boolean $distort if true distort the barcode to fit width and height, otherwise preserve aspect ratio - * @author Nicola Asuni - * @since 4.5.037 (2009-04-07) - * @access public - */ - public function write2DBarcode($code, $type, $x='', $y='', $w='', $h='', $style='', $align='', $distort=false) { - if ($this->empty_string(trim($code))) { - return; - } - require_once(dirname(__FILE__).'/2dbarcodes.php'); - // save current graphic settings - $gvars = $this->getGraphicVars(); - // create new barcode object - $barcodeobj = new TCPDF2DBarcode($code, $type); - $arrcode = $barcodeobj->getBarcodeArray(); - if (($arrcode === false) OR empty($arrcode)) { - $this->Error('Error in 2D barcode string'); - } - // set default values - if (!isset($style['position'])) { - $style['position'] = ''; - } - if (!isset($style['fgcolor'])) { - $style['fgcolor'] = array(0,0,0); // default black - } - if (!isset($style['bgcolor'])) { - $style['bgcolor'] = false; // default transparent - } - if (!isset($style['border'])) { - $style['border'] = false; - } - // padding - if (!isset($style['padding'])) { - $style['padding'] = 0; - } elseif ($style['padding'] === 'auto') { - $style['padding'] = 4; - } - if (!isset($style['hpadding'])) { - $style['hpadding'] = $style['padding']; - } elseif ($style['hpadding'] === 'auto') { - $style['hpadding'] = 4; - } - if (!isset($style['vpadding'])) { - $style['vpadding'] = $style['padding']; - } elseif ($style['vpadding'] === 'auto') { - $style['vpadding'] = 4; - } - // cell (module) dimension - if (!isset($style['module_width'])) { - $style['module_width'] = 1; // width of a single module in points - } - if (!isset($style['module_height'])) { - $style['module_height'] = 1; // height of a single module in points - } - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - // number of barcode columns and rows - $rows = $arrcode['num_rows']; - $cols = $arrcode['num_cols']; - // module width and height - $mw = $style['module_width']; - $mh = $style['module_height']; - // get max dimensions - if ($this->rtl) { - $maxw = $x - $this->lMargin; - } else { - $maxw = $this->w - $this->rMargin - $x; - } - $maxh = ($this->h - $this->tMargin - $this->bMargin); - $ratioHW = ($rows * $mh) / ($cols * $mw); - $ratioWH = ($cols * $mw) / ($rows * $mh); - if (!$distort) { - if (($maxw * $ratioHW) > $maxh) { - $maxw = $maxh * $ratioWH; - } - if (($maxh * $ratioWH) > $maxw) { - $maxh = $maxw * $ratioHW; - } - } - // set maximum dimesions - if ($w > $maxw) { - $w = $maxw; - } - if ($h > $maxh) { - $h = $maxh; - } - $hpad = (2 * $style['hpadding']); - $vpad = (2 * $style['vpadding']); - // set dimensions - if ((($w === '') OR ($w <= 0)) AND (($h === '') OR ($h <= 0))) { - $w = ($cols + $hpad) * ($mw / $this->k); - $h = ($rows + $vpad) * ($mh / $this->k); - } elseif (($w === '') OR ($w <= 0)) { - $w = $h * $ratioWH; - } elseif (($h === '') OR ($h <= 0)) { - $h = $w * $ratioHW; - } - // barcode size (excluding padding) - $bw = ($w * $cols) / ($cols + $hpad); - $bh = ($h * $rows) / ($rows + $vpad); - // dimension of single barcode cell unit - $cw = $bw / $cols; - $ch = $bh / $rows; - if (!$distort) { - if (($cw / $ch) > ($mw / $mh)) { - // correct horizontal distortion - $cw = $ch * $mw / $mh; - $bw = $cw * $cols; - $style['hpadding'] = ($w - $bw) / (2 * $cw); - } else { - // correct vertical distortion - $ch = $cw * $mh / $mw; - $bh = $ch * $rows; - $style['vpadding'] = ($h - $bh) / (2 * $ch); - } - } - // fit the barcode on available space - $this->fitBlock($w, $h, $x, $y, false); - // set alignment - $this->img_rb_y = $y + $h; - // set alignment - if ($this->rtl) { - if ($style['position'] == 'L') { - $xpos = $this->lMargin; - } elseif ($style['position'] == 'C') { - $xpos = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($style['position'] == 'R') { - $xpos = $this->w - $this->rMargin - $w; - } else { - $xpos = $x - $w; - } - $this->img_rb_x = $xpos; - } else { - if ($style['position'] == 'L') { - $xpos = $this->lMargin; - } elseif ($style['position'] == 'C') { - $xpos = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($style['position'] == 'R') { - $xpos = $this->w - $this->rMargin - $w; - } else { - $xpos = $x; - } - $this->img_rb_x = $xpos + $w; - } - $xstart = $xpos + ($style['hpadding'] * $cw); - $ystart = $y + ($style['vpadding'] * $ch); - // barcode is always printed in LTR direction - $tempRTL = $this->rtl; - $this->rtl = false; - // print background color - if ($style['bgcolor']) { - $this->Rect($xpos, $y, $w, $h, $style['border'] ? 'DF' : 'F', '', $style['bgcolor']); - } elseif ($style['border']) { - $this->Rect($xpos, $y, $w, $h, 'D'); - } - // set foreground color - $this->SetDrawColorArray($style['fgcolor']); - // print barcode cells - // for each row - for ($r = 0; $r < $rows; ++$r) { - $xr = $xstart; - // for each column - for ($c = 0; $c < $cols; ++$c) { - if ($arrcode['bcode'][$r][$c] == 1) { - // draw a single barcode cell - $this->Rect($xr, $ystart, $cw, $ch, 'F', array(), $style['fgcolor']); - } - $xr += $cw; - } - $ystart += $ch; - } - // restore original direction - $this->rtl = $tempRTL; - // restore previous settings - $this->setGraphicVars($gvars); - // set pointer to align the next text/objects - switch($align) { - case 'T':{ - $this->y = $y; - $this->x = $this->img_rb_x; - break; - } - case 'M':{ - $this->y = $y + round($h/2); - $this->x = $this->img_rb_x; - break; - } - case 'B':{ - $this->y = $this->img_rb_y; - $this->x = $this->img_rb_x; - break; - } - case 'N':{ - $this->SetY($this->img_rb_y); - break; - } - default:{ - break; - } - } - $this->endlinex = $this->img_rb_x; - } - - /** - * Returns an array containing current margins: - *
      -
    • $ret['left'] = left margin
    • -
    • $ret['right'] = right margin
    • -
    • $ret['top'] = top margin
    • -
    • $ret['bottom'] = bottom margin
    • -
    • $ret['header'] = header margin
    • -
    • $ret['footer'] = footer margin
    • -
    • $ret['cell'] = cell padding array
    • -
    • $ret['padding_left'] = cell left padding
    • -
    • $ret['padding_top'] = cell top padding
    • -
    • $ret['padding_right'] = cell right padding
    • -
    • $ret['padding_bottom'] = cell bottom padding
    • - *
    - * @return array containing all margins measures - * @access public - * @since 3.2.000 (2008-06-23) - */ - public function getMargins() { - $ret = array( - 'left' => $this->lMargin, - 'right' => $this->rMargin, - 'top' => $this->tMargin, - 'bottom' => $this->bMargin, - 'header' => $this->header_margin, - 'footer' => $this->footer_margin, - 'cell' => $this->cell_padding, - 'padding_left' => $this->cell_padding['L'], - 'padding_top' => $this->cell_padding['T'], - 'padding_right' => $this->cell_padding['R'], - 'padding_bottom' => $this->cell_padding['B'] - ); - return $ret; - } - - /** - * Returns an array containing original margins: - *
      -
    • $ret['left'] = left margin
    • -
    • $ret['right'] = right margin
    • - *
    - * @return array containing all margins measures - * @access public - * @since 4.0.012 (2008-07-24) - */ - public function getOriginalMargins() { - $ret = array( - 'left' => $this->original_lMargin, - 'right' => $this->original_rMargin - ); - return $ret; - } - - /** - * Returns the current font size. - * @return current font size - * @access public - * @since 3.2.000 (2008-06-23) - */ - public function getFontSize() { - return $this->FontSize; - } - - /** - * Returns the current font size in points unit. - * @return current font size in points unit - * @access public - * @since 3.2.000 (2008-06-23) - */ - public function getFontSizePt() { - return $this->FontSizePt; - } - - /** - * Returns the current font family name. - * @return string current font family name - * @access public - * @since 4.3.008 (2008-12-05) - */ - public function getFontFamily() { - return $this->FontFamily; - } - - /** - * Returns the current font style. - * @return string current font style - * @access public - * @since 4.3.008 (2008-12-05) - */ - public function getFontStyle() { - return $this->FontStyle; - } - - /** - * Extracts the CSS properties from a CSS string. - * @param string $cssdata string containing CSS definitions. - * @return An array where the keys are the CSS selectors and the values are the CSS properties. - * @author Nicola Asuni - * @since 5.1.000 (2010-05-25) - * @access protected - */ - protected function extractCSSproperties($cssdata) { - if (empty($cssdata)) { - return array(); - } - // remove comments - $cssdata = preg_replace('/\/\*[^\*]*\*\//', '', $cssdata); - // remove newlines and multiple spaces - $cssdata = preg_replace('/[\s]+/', ' ', $cssdata); - // remove some spaces - $cssdata = preg_replace('/[\s]*([;:\{\}]{1})[\s]*/', '\\1', $cssdata); - // remove empty blocks - $cssdata = preg_replace('/([^\}\{]+)\{\}/', '', $cssdata); - // replace media type parenthesis - $cssdata = preg_replace('/@media[\s]+([^\{]*)\{/i', '@media \\1§', $cssdata); - $cssdata = preg_replace('/\}\}/si', '}§', $cssdata); - // trim string - $cssdata = trim($cssdata); - // find media blocks (all, braille, embossed, handheld, print, projection, screen, speech, tty, tv) - $cssblocks = array(); - $matches = array(); - if (preg_match_all('/@media[\s]+([^\§]*)§([^§]*)§/i', $cssdata, $matches) > 0) { - foreach ($matches[1] as $key => $type) { - $cssblocks[$type] = $matches[2][$key]; - } - // remove media blocks - $cssdata = preg_replace('/@media[\s]+([^\§]*)§([^§]*)§/i', '', $cssdata); - } - // keep 'all' and 'print' media, other media types are discarded - if (isset($cssblocks['all']) AND !empty($cssblocks['all'])) { - $cssdata .= $cssblocks['all']; - } - if (isset($cssblocks['print']) AND !empty($cssblocks['print'])) { - $cssdata .= $cssblocks['print']; - } - // reset css blocks array - $cssblocks = array(); - $matches = array(); - // explode css data string into array - if (substr($cssdata, -1) == '}') { - // remove last parethesis - $cssdata = substr($cssdata, 0, -1); - } - $matches = explode('}', $cssdata); - foreach ($matches as $key => $block) { - // index 0 contains the CSS selector, index 1 contains CSS properties - $cssblocks[$key] = explode('{', $block); - if (!isset($cssblocks[$key][1])) { - // remove empty definitions - unset($cssblocks[$key]); - } - } - // split groups of selectors (comma-separated list of selectors) - foreach ($cssblocks as $key => $block) { - if (strpos($block[0], ',') > 0) { - $selectors = explode(',', $block[0]); - foreach ($selectors as $sel) { - $cssblocks[] = array(0 => trim($sel), 1 => $block[1]); - } - unset($cssblocks[$key]); - } - } - // covert array to selector => properties - $cssdata = array(); - foreach ($cssblocks as $block) { - $selector = $block[0]; - // calculate selector's specificity - $matches = array(); - $a = 0; // the declaration is not from is a 'style' attribute - $b = intval(preg_match_all('/[\#]/', $selector, $matches)); // number of ID attributes - $c = intval(preg_match_all('/[\[\.]/', $selector, $matches)); // number of other attributes - $c += intval(preg_match_all('/[\:]link|visited|hover|active|focus|target|lang|enabled|disabled|checked|indeterminate|root|nth|first|last|only|empty|contains|not/i', $selector, $matches)); // number of pseudo-classes - $d = intval(preg_match_all('/[\>\+\~\s]{1}[a-zA-Z0-9\*]+/', ' '.$selector, $matches)); // number of element names - $d += intval(preg_match_all('/[\:][\:]/', $selector, $matches)); // number of pseudo-elements - $specificity = $a.$b.$c.$d; - // add specificity to the beginning of the selector - $cssdata[$specificity.' '.$selector] = $block[1]; - } - // sort selectors alphabetically to account for specificity - ksort($cssdata, SORT_STRING); - // return array - return $cssdata; - } - - /** - * Returns true if the CSS selector is valid for the selected HTML tag - * @param array $dom array of HTML tags and properties - * @param int $key key of the current HTML tag - * @param string $selector CSS selector string - * @return true if the selector is valid, false otherwise - * @access protected - * @since 5.1.000 (2010-05-25) - */ - protected function isValidCSSSelectorForTag($dom, $key, $selector) { - $valid = false; // value to be returned - $tag = $dom[$key]['value']; - $class = array(); - if (isset($dom[$key]['attribute']['class']) AND !empty($dom[$key]['attribute']['class'])) { - $class = explode(' ', strtolower($dom[$key]['attribute']['class'])); - } - $id = ''; - if (isset($dom[$key]['attribute']['id']) AND !empty($dom[$key]['attribute']['id'])) { - $id = strtolower($dom[$key]['attribute']['id']); - } - $selector = preg_replace('/([\>\+\~\s]{1})([\.]{1})([^\>\+\~\s]*)/si', '\\1*.\\3', $selector); - $matches = array(); - if (preg_match_all('/([\>\+\~\s]{1})([a-zA-Z0-9\*]+)([^\>\+\~\s]*)/si', $selector, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE) > 0) { - $parentop = array_pop($matches[1]); - $operator = $parentop[0]; - $offset = $parentop[1]; - $lasttag = array_pop($matches[2]); - $lasttag = strtolower(trim($lasttag[0])); - if (($lasttag == '*') OR ($lasttag == $tag)) { - // the last element on selector is our tag or 'any tag' - $attrib = array_pop($matches[3]); - $attrib = strtolower(trim($attrib[0])); - if (!empty($attrib)) { - // check if matches class, id, attribute, pseudo-class or pseudo-element - switch ($attrib{0}) { - case '.': { // class - if (in_array(substr($attrib, 1), $class)) { - $valid = true; - } - break; - } - case '#': { // ID - if (substr($attrib, 1) == $id) { - $valid = true; - } - break; - } - case '[': { // attribute - $attrmatch = array(); - if (preg_match('/\[([a-zA-Z0-9]*)[\s]*([\~\^\$\*\|\=]*)[\s]*["]?([^"\]]*)["]?\]/i', $attrib, $attrmatch) > 0) { - $att = strtolower($attrmatch[1]); - $val = $attrmatch[3]; - if (isset($dom[$key]['attribute'][$att])) { - switch ($attrmatch[2]) { - case '=': { - if ($dom[$key]['attribute'][$att] == $val) { - $valid = true; - } - break; - } - case '~=': { - if (in_array($val, explode(' ', $dom[$key]['attribute'][$att]))) { - $valid = true; - } - break; - } - case '^=': { - if ($val == substr($dom[$key]['attribute'][$att], 0, strlen($val))) { - $valid = true; - } - break; - } - case '$=': { - if ($val == substr($dom[$key]['attribute'][$att], -strlen($val))) { - $valid = true; - } - break; - } - case '*=': { - if (strpos($dom[$key]['attribute'][$att], $val) !== false) { - $valid = true; - } - break; - } - case '|=': { - if ($dom[$key]['attribute'][$att] == $val) { - $valid = true; - } elseif (preg_match('/'.$val.'[\-]{1}/i', $dom[$key]['attribute'][$att]) > 0) { - $valid = true; - } - break; - } - default: { - $valid = true; - } - } - } - } - break; - } - case ':': { // pseudo-class or pseudo-element - if ($attrib{1} == ':') { // pseudo-element - // pseudo-elements are not supported! - // (::first-line, ::first-letter, ::before, ::after) - } else { // pseudo-class - // pseudo-classes are not supported! - // (:root, :nth-child(n), :nth-last-child(n), :nth-of-type(n), :nth-last-of-type(n), :first-child, :last-child, :first-of-type, :last-of-type, :only-child, :only-of-type, :empty, :link, :visited, :active, :hover, :focus, :target, :lang(fr), :enabled, :disabled, :checked) - } - break; - } - } // end of switch - } else { - $valid = true; - } - if ($valid AND ($offset > 0)) { - $valid = false; - // check remaining selector part - $selector = substr($selector, 0, $offset); - switch ($operator) { - case ' ': { // descendant of an element - while ($dom[$key]['parent'] > 0) { - if ($this->isValidCSSSelectorForTag($dom, $dom[$key]['parent'], $selector)) { - $valid = true; - break; - } else { - $key = $dom[$key]['parent']; - } - } - break; - } - case '>': { // child of an element - $valid = $this->isValidCSSSelectorForTag($dom, $dom[$key]['parent'], $selector); - break; - } - case '+': { // immediately preceded by an element - for ($i = ($key - 1); $i > $dom[$key]['parent']; --$i) { - if ($dom[$i]['tag'] AND $dom[$i]['opening']) { - $valid = $this->isValidCSSSelectorForTag($dom, $i, $selector); - break; - } - } - break; - } - case '~': { // preceded by an element - for ($i = ($key - 1); $i > $dom[$key]['parent']; --$i) { - if ($dom[$i]['tag'] AND $dom[$i]['opening']) { - if ($this->isValidCSSSelectorForTag($dom, $i, $selector)) { - break; - } - } - } - break; - } - } - } - } - } - return $valid; - } - - /** - * Returns the styles that apply for the selected HTML tag. - * @param array $dom array of HTML tags and properties - * @param int $key key of the current HTML tag - * @param array $css array of CSS properties - * @return string containing CSS properties - * @access protected - * @since 5.1.000 (2010-05-25) - */ - protected function getTagStyleFromCSS($dom, $key, $css) { - $tagstyle = ''; // style to be returned - // get all styles that apply - foreach($css as $selector => $style) { - // remove specificity - $selector = substr($selector, strpos($selector, ' ')); - // check if this selector apply to current tag - if ($this->isValidCSSSelectorForTag($dom, $key, $selector)) { - // apply style - $tagstyle .= ';'.$style; - } - } - if (isset($dom[$key]['attribute']['style'])) { - // attach inline style (latest properties have high priority) - $tagstyle .= ';'.$dom[$key]['attribute']['style']; - } - // remove multiple semicolons - $tagstyle = preg_replace('/[;]+/', ';', $tagstyle); - return $tagstyle; - } - - /** - * Returns the border width from CSS property - * @param string $width border width - * @return int with in user units - * @access protected - * @since 5.7.000 (2010-08-02) - */ - protected function getCSSBorderWidth($width) { - if ($width == 'thin') { - $width = (2 / $this->k); - } elseif ($width == 'medium') { - $width = (4 / $this->k); - } elseif ($width == 'thick') { - $width = (6 / $this->k); - } else { - $width = $this->getHTMLUnitToUnits($width, 1, 'px', false); - } - return $width; - } - - /** - * Returns the border dash style from CSS property - * @param string $style border style to convert - * @return int sash style (return -1 in case of none or hidden border) - * @access protected - * @since 5.7.000 (2010-08-02) - */ - protected function getCSSBorderDashStyle($style) { - switch (strtolower($style)) { - case 'none': - case 'hidden': { - $dash = -1; - break; - } - case 'dotted': { - $dash = 1; - break; - } - case 'dashed': { - $dash = 3; - break; - } - case 'double': - case 'groove': - case 'ridge': - case 'inset': - case 'outset': - case 'solid': - default: { - $dash = 0; - break; - } - } - return $dash; - } - - /** - * Returns the border style array from CSS border properties - * @param string $cssborder border properties - * @return array containing border properties - * @access protected - * @since 5.7.000 (2010-08-02) - */ - protected function getCSSBorderStyle($cssborder) { - $bprop = preg_split('/[\s]+/', trim($cssborder)); - $border = array(); // value to be returned - switch (count($bprop)) { - case 3: { - $width = $bprop[0]; - $style = $bprop[1]; - $color = $bprop[2]; - break; - } - case 2: { - $width = 'medium'; - $style = $bprop[0]; - $color = $bprop[1]; - break; - } - case 1: { - $width = 'medium'; - $style = $bprop[0]; - $color = 'black'; - break; - } - default: { - $width = 'medium'; - $style = 'solid'; - $color = 'black'; - break; - } - } - if ($style == 'none') { - return array(); - } - $border['cap'] = 'square'; - $border['join'] = 'miter'; - $border['dash'] = $this->getCSSBorderDashStyle($style); - if ($border['dash'] < 0) { - return array(); - } - $border['width'] = $this->getCSSBorderWidth($width); - $border['color'] = $this->convertHTMLColorToDec($color); - return $border; - } - - /** - * Get the internal Cell padding from CSS attribute. - * @param string $csspadding padding properties - * @param float $width width of the containing element - * @return array of cell paddings - * @access public - * @since 5.9.000 (2010-10-04) - */ - public function getCSSPadding($csspadding, $width=0) { - $padding = preg_split('/[\s]+/', trim($csspadding)); - $cell_padding = array(); // value to be returned - switch (count($padding)) { - case 4: { - $cell_padding['T'] = $padding[0]; - $cell_padding['R'] = $padding[1]; - $cell_padding['B'] = $padding[2]; - $cell_padding['L'] = $padding[3]; - break; - } - case 3: { - $cell_padding['T'] = $padding[0]; - $cell_padding['R'] = $padding[1]; - $cell_padding['B'] = $padding[2]; - $cell_padding['L'] = $padding[1]; - break; - } - case 2: { - $cell_padding['T'] = $padding[0]; - $cell_padding['R'] = $padding[1]; - $cell_padding['B'] = $padding[0]; - $cell_padding['L'] = $padding[1]; - break; - } - case 1: { - $cell_padding['T'] = $padding[0]; - $cell_padding['R'] = $padding[0]; - $cell_padding['B'] = $padding[0]; - $cell_padding['L'] = $padding[0]; - break; - } - default: { - return $this->cell_padding; - } - } - if ($width == 0) { - $width = $this->w - $this->lMargin - $this->rMargin; - } - $cell_padding['T'] = $this->getHTMLUnitToUnits($cell_padding['T'], $width, 'px', false); - $cell_padding['R'] = $this->getHTMLUnitToUnits($cell_padding['R'], $width, 'px', false); - $cell_padding['B'] = $this->getHTMLUnitToUnits($cell_padding['B'], $width, 'px', false); - $cell_padding['L'] = $this->getHTMLUnitToUnits($cell_padding['L'], $width, 'px', false); - return $cell_padding; - } - - /** - * Get the internal Cell margin from CSS attribute. - * @param string $cssmargin margin properties - * @param float $width width of the containing element - * @return array of cell margins - * @access public - * @since 5.9.000 (2010-10-04) - */ - public function getCSSMargin($cssmargin, $width=0) { - $margin = preg_split('/[\s]+/', trim($cssmargin)); - $cell_margin = array(); // value to be returned - switch (count($margin)) { - case 4: { - $cell_margin['T'] = $margin[0]; - $cell_margin['R'] = $margin[1]; - $cell_margin['B'] = $margin[2]; - $cell_margin['L'] = $margin[3]; - break; - } - case 3: { - $cell_margin['T'] = $margin[0]; - $cell_margin['R'] = $margin[1]; - $cell_margin['B'] = $margin[2]; - $cell_margin['L'] = $margin[1]; - break; - } - case 2: { - $cell_margin['T'] = $margin[0]; - $cell_margin['R'] = $margin[1]; - $cell_margin['B'] = $margin[0]; - $cell_margin['L'] = $margin[1]; - break; - } - case 1: { - $cell_margin['T'] = $margin[0]; - $cell_margin['R'] = $margin[0]; - $cell_margin['B'] = $margin[0]; - $cell_margin['L'] = $margin[0]; - break; - } - default: { - return $this->cell_margin; - } - } - if ($width == 0) { - $width = $this->w - $this->lMargin - $this->rMargin; - } - $cell_margin['T'] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $cell_margin['T']), $width, 'px', false); - $cell_margin['R'] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $cell_margin['R']), $width, 'px', false); - $cell_margin['B'] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $cell_margin['B']), $width, 'px', false); - $cell_margin['L'] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $cell_margin['L']), $width, 'px', false); - return $cell_margin; - } - - /** - * Get the border-spacing from CSS attribute. - * @param string $cssbspace border-spacing CSS properties - * @param float $width width of the containing element - * @return array of border spacings - * @access public - * @since 5.9.010 (2010-10-27) - */ - public function getCSSBorderMargin($cssbspace, $width=0) { - $space = preg_split('/[\s]+/', trim($cssbspace)); - $border_spacing = array(); // value to be returned - switch (count($space)) { - case 2: { - $border_spacing['H'] = $space[0]; - $border_spacing['V'] = $space[1]; - break; - } - case 1: { - $border_spacing['H'] = $space[0]; - $border_spacing['V'] = $space[0]; - break; - } - default: { - return array('H' => 0, 'V' => 0); - } - } - if ($width == 0) { - $width = $this->w - $this->lMargin - $this->rMargin; - } - $border_spacing['H'] = $this->getHTMLUnitToUnits($border_spacing['H'], $width, 'px', false); - $border_spacing['V'] = $this->getHTMLUnitToUnits($border_spacing['V'], $width, 'px', false); - return $border_spacing; - } - - /** - * Returns the letter-spacing value from CSS value - * @param string $spacing letter-spacing value - * @param float $parent font spacing (tracking/kerning) value of the parent element - * @return float quantity to increases or decreases the space between characters in a text. - * @access protected - * @since 5.9.000 (2010-10-02) - */ - protected function getCSSFontSpacing($spacing, $parent=0) { - $val = 0; // value to be returned - $spacing = trim($spacing); - switch ($spacing) { - case 'normal': { - $val = 0; - break; - } - case 'inherit': { - if ($parent == 'normal') { - $val = 0; - } else { - $val = $parent; - } - break; - } - default: { - $val = $this->getHTMLUnitToUnits($spacing, 0, 'px', false); - } - } - return $val; - } - - /** - * Returns the percentage of font stretching from CSS value - * @param string $stretch stretch mode - * @param float $parent stretch value of the parent element - * @return float font stretching percentage - * @access protected - * @since 5.9.000 (2010-10-02) - */ - protected function getCSSFontStretching($stretch, $parent=100) { - $val = 100; // value to be returned - $stretch = trim($stretch); - switch ($stretch) { - case 'ultra-condensed': { - $val = 40; - break; - } - case 'extra-condensed': { - $val = 55; - break; - } - case 'condensed': { - $val = 70; - break; - } - case 'semi-condensed': { - $val = 85; - break; - } - case 'normal': { - $val = 100; - break; - } - case 'semi-expanded': { - $val = 115; - break; - } - case 'expanded': { - $val = 130; - break; - } - case 'extra-expanded': { - $val = 145; - break; - } - case 'ultra-expanded': { - $val = 160; - break; - } - case 'wider': { - $val = $parent + 10; - break; - } - case 'narrower': { - $val = $parent - 10; - break; - } - case 'inherit': { - if ($parent == 'normal') { - $val = 100; - } else { - $val = $parent; - } - break; - } - default: { - $val = $this->getHTMLUnitToUnits($stretch, 100, '%', false); - } - } - return $val; - } - - /** - * Returns the HTML DOM array. - * @param string $html html code - * @return array - * @access protected - * @since 3.2.000 (2008-06-20) - */ - protected function getHtmlDomArray($html) { - // array of CSS styles ( selector => properties). - $css = array(); - // get CSS array defined at previous call - $matches = array(); - if (preg_match_all('/([^\<]*)<\/cssarray>/isU', $html, $matches) > 0) { - if (isset($matches[1][0])) { - $css = array_merge($css, unserialize($this->unhtmlentities($matches[1][0]))); - } - $html = preg_replace('/(.*?)<\/cssarray>/isU', '', $html); - } - // extract external CSS files - $matches = array(); - if (preg_match_all('/]*)>/isU', $html, $matches) > 0) { - foreach ($matches[1] as $key => $link) { - $type = array(); - if (preg_match('/type[\s]*=[\s]*"text\/css"/', $link, $type)) { - $type = array(); - preg_match('/media[\s]*=[\s]*"([^"]*)"/', $link, $type); - // get 'all' and 'print' media, other media types are discarded - // (all, braille, embossed, handheld, print, projection, screen, speech, tty, tv) - if (empty($type) OR (isset($type[1]) AND (($type[1] == 'all') OR ($type[1] == 'print')))) { - $type = array(); - if (preg_match('/href[\s]*=[\s]*"([^"]*)"/', $link, $type) > 0) { - // read CSS data file - $cssdata = file_get_contents(trim($type[1])); - $css = array_merge($css, $this->extractCSSproperties($cssdata)); - } - } - } - } - } - // extract style tags - $matches = array(); - if (preg_match_all('/]*)>([^\<]*)<\/style>/isU', $html, $matches) > 0) { - foreach ($matches[1] as $key => $media) { - $type = array(); - preg_match('/media[\s]*=[\s]*"([^"]*)"/', $media, $type); - // get 'all' and 'print' media, other media types are discarded - // (all, braille, embossed, handheld, print, projection, screen, speech, tty, tv) - if (empty($type) OR (isset($type[1]) AND (($type[1] == 'all') OR ($type[1] == 'print')))) { - $cssdata = $matches[2][$key]; - $css = array_merge($css, $this->extractCSSproperties($cssdata)); - } - } - } - // create a special tag to contain the CSS array (used for table content) - $csstagarray = ''.htmlentities(serialize($css)).''; - // remove head and style blocks - $html = preg_replace('/]*)>(.*?)<\/head>/siU', '', $html); - $html = preg_replace('/]*)>([^\<]*)<\/style>/isU', '', $html); - // define block tags - $blocktags = array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table','tr','td'); - // define self-closing tags - $selfclosingtags = array('area','base','basefont','br','hr','input','img','link','meta'); - // remove all unsupported tags (the line below lists all supported tags) - $html = strip_tags($html, '




    1. ', $offset)) !== false) {
      -			$html_a = substr($html, 0, $offset);
      -			$html_b = substr($html, $offset, ($pos - $offset + 11));
      -			while (preg_match("']*)>(.*?)\n(.*?)'si", $html_b)) {
      -				// preserve newlines on 'si", "\\2\\3", $html_b);
      -				$html_b = preg_replace("']*)>(.*?)[\"](.*?)'si", "\\2''\\3", $html_b);
      -			}
      -			$html = $html_a.$html_b.substr($html, $pos + 11);
      -			$offset = strlen($html_a.$html_b);
      -		}
      -		$html = preg_replace('/([\s]*)', $html);
      -		$offset = 0;
      -		while (($offset < strlen($html)) AND ($pos = strpos($html, '', $offset)) !== false) {
      -			$html_a = substr($html, 0, $offset);
      -			$html_b = substr($html, $offset, ($pos - $offset + 9));
      -			while (preg_match("']*)>(.*?)'si", $html_b)) {
      -				$html_b = preg_replace("']*)>(.*?)'si", "\\2#!TaB!#\\4#!NwL!#", $html_b);
      -				$html_b = preg_replace("']*)>(.*?)'si", "\\2#!NwL!#", $html_b);
      -			}
      -			$html = $html_a.$html_b.substr($html, $pos + 9);
      -			$offset = strlen($html_a.$html_b);
      -		}
      -		if (preg_match("']*)>'si", "'si", "\" />", $html);
      -		}
      -		$html = str_replace("\n", ' ', $html);
      -		// restore textarea newlines
      -		$html = str_replace('', "\n", $html);
      -		// remove extra spaces from code
      -		$html = preg_replace('/[\s]+<\/(table|tr|ul|ol|dl)>/', '', $html);
      -		$html = preg_replace('/'.$this->re_space['p'].'+<\/(td|th|li|dt|dd)>/'.$this->re_space['m'], '', $html);
      -		$html = preg_replace('/[\s]+<(tr|td|th|li|dt|dd)/', '<\\1', $html);
      -		$html = preg_replace('/'.$this->re_space['p'].'+<(ul|ol|dl|br)/'.$this->re_space['m'], '<\\1', $html);
      -		$html = preg_replace('/<\/(table|tr|td|th|blockquote|dd|dt|dl|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|ul|p)>[\s]+<', $html);
      -		$html = preg_replace('/<\/(td|th)>/', '', $html);
      -		$html = preg_replace('/<\/table>([\s]*)/', '', $html);
      -		$html = preg_replace('/'.$this->re_space['p'].'+re_space['m'], chr(32).']*)>/xi', '', $html);
      -		$html = preg_replace('/]*)>([^\<]*)<\/textarea>/xi', '', $html);
      -		$html = preg_replace('/]*)><\/li>/', ' ', $html);
      -		$html = preg_replace('/]*)>'.$this->re_space['p'].'*re_space['m'], ' \/]*)>[\s]/', '<\\1> ', $html); // preserve some spaces
      -		$html = preg_replace('/[\s]<\/([^\>]*)>/', ' ', $html); // preserve some spaces
      -		$html = preg_replace('/'.$this->re_space['p'].'+/'.$this->re_space['m'], chr(32), $html); // replace multiple spaces with a single space
      -		// trim string
      -		$html = $this->stringTrim($html);
      -		// pattern for generic tag
      -		$tagpattern = '/(<[^>]+>)/';
      -		// explodes the string
      -		$a = preg_split($tagpattern, $html, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
      -		// count elements
      -		$maxel = count($a);
      -		$elkey = 0;
      -		$key = 0;
      -		// create an array of elements
      -		$dom = array();
      -		$dom[$key] = array();
      -		// set inheritable properties fot the first void element
      -		// possible inheritable properties are: azimuth, border-collapse, border-spacing, caption-side, color, cursor, direction, empty-cells, font, font-family, font-stretch, font-size, font-size-adjust, font-style, font-variant, font-weight, letter-spacing, line-height, list-style, list-style-image, list-style-position, list-style-type, orphans, page, page-break-inside, quotes, speak, speak-header, text-align, text-indent, text-transform, volume, white-space, widows, word-spacing
      -		$dom[$key]['tag'] = false;
      -		$dom[$key]['block'] = false;
      -		$dom[$key]['value'] = '';
      -		$dom[$key]['parent'] = 0;
      -		$dom[$key]['fontname'] = $this->FontFamily;
      -		$dom[$key]['fontstyle'] = $this->FontStyle;
      -		$dom[$key]['fontsize'] = $this->FontSizePt;
      -		$dom[$key]['font-stretch'] = 100;
      -		$dom[$key]['letter-spacing'] = 0;
      -		$dom[$key]['stroke'] = $this->textstrokewidth;
      -		$dom[$key]['fill'] = (($this->textrendermode % 2) == 0);
      -		$dom[$key]['clip'] = ($this->textrendermode > 3);
      -		$dom[$key]['line-height'] = $this->cell_height_ratio;
      -		$dom[$key]['bgcolor'] = false;
      -		$dom[$key]['fgcolor'] = $this->fgcolor; // color
      -		$dom[$key]['strokecolor'] = $this->strokecolor;
      -		$dom[$key]['align'] = '';
      -		$dom[$key]['listtype'] = '';
      -		$dom[$key]['text-indent'] = 0;
      -		$dom[$key]['border'] = array();
      -		$dom[$key]['dir'] = $this->rtl?'rtl':'ltr';
      -		$thead = false; // true when we are inside the THEAD tag
      -		++$key;
      -		$level = array();
      -		array_push($level, 0); // root
      -		while ($elkey < $maxel) {
      -			$dom[$key] = array();
      -			$element = $a[$elkey];
      -			$dom[$key]['elkey'] = $elkey;
      -			if (preg_match($tagpattern, $element)) {
      -				// html tag
      -				$element = substr($element, 1, -1);
      -				// get tag name
      -				preg_match('/[\/]?([a-zA-Z0-9]*)/', $element, $tag);
      -				$tagname = strtolower($tag[1]);
      -				// check if we are inside a table header
      -				if ($tagname == 'thead') {
      -					if ($element{0} == '/') {
      -						$thead = false;
      -					} else {
      -						$thead = true;
      -					}
      -					++$elkey;
      -					continue;
      -				}
      -				$dom[$key]['tag'] = true;
      -				$dom[$key]['value'] = $tagname;
      -				if (in_array($dom[$key]['value'], $blocktags)) {
      -					$dom[$key]['block'] = true;
      -				} else {
      -					$dom[$key]['block'] = false;
      -				}
      -				if ($element{0} == '/') {
      -					// *** closing html tag
      -					$dom[$key]['opening'] = false;
      -					$dom[$key]['parent'] = end($level);
      -					array_pop($level);
      -					$dom[$key]['fontname'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontname'];
      -					$dom[$key]['fontstyle'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontstyle'];
      -					$dom[$key]['fontsize'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontsize'];
      -					$dom[$key]['font-stretch'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['font-stretch'];
      -					$dom[$key]['letter-spacing'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['letter-spacing'];
      -					$dom[$key]['stroke'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['stroke'];
      -					$dom[$key]['fill'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fill'];
      -					$dom[$key]['clip'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['clip'];
      -					$dom[$key]['line-height'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['line-height'];
      -					$dom[$key]['bgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['bgcolor'];
      -					$dom[$key]['fgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fgcolor'];
      -					$dom[$key]['strokecolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['strokecolor'];
      -					$dom[$key]['align'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['align'];
      -					$dom[$key]['dir'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['dir'];
      -					if (isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'])) {
      -						$dom[$key]['listtype'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'];
      -					}
      -					// set the number of columns in table tag
      -					if (($dom[$key]['value'] == 'tr') AND (!isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['cols']))) {
      -						$dom[($dom[($dom[$key]['parent'])]['parent'])]['cols'] = $dom[($dom[$key]['parent'])]['cols'];
      -					}
      -					if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) {
      -						$dom[($dom[$key]['parent'])]['content'] = $csstagarray;
      -						for ($i = ($dom[$key]['parent'] + 1); $i < $key; ++$i) {
      -							$dom[($dom[$key]['parent'])]['content'] .= $a[$dom[$i]['elkey']];
      -						}
      -						$key = $i;
      -						// mark nested tables
      -						$dom[($dom[$key]['parent'])]['content'] = str_replace('', '', $dom[($dom[$key]['parent'])]['content']);
      -						$dom[($dom[$key]['parent'])]['content'] = str_replace('', '', $dom[($dom[$key]['parent'])]['content']);
      -					}
      -					// store header rows on a new table
      -					if (($dom[$key]['value'] == 'tr') AND ($dom[($dom[$key]['parent'])]['thead'] === true)) {
      -						if ($this->empty_string($dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'])) {
      -							$dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] = $a[$dom[($dom[($dom[$key]['parent'])]['parent'])]['elkey']];
      -						}
      -						for ($i = $dom[$key]['parent']; $i <= $key; ++$i) {
      -							$dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] .= $a[$dom[$i]['elkey']];
      -						}
      -						if (!isset($dom[($dom[$key]['parent'])]['attribute'])) {
      -							$dom[($dom[$key]['parent'])]['attribute'] = array();
      -						}
      -						// header elements must be always contained in a single page
      -						$dom[($dom[$key]['parent'])]['attribute']['nobr'] = 'true';
      -					}
      -					if (($dom[$key]['value'] == 'table') AND (!$this->empty_string($dom[($dom[$key]['parent'])]['thead']))) {
      -						// remove the nobr attributes from the table header
      -						$dom[($dom[$key]['parent'])]['thead'] = str_replace(' nobr="true"', '', $dom[($dom[$key]['parent'])]['thead']);
      -						$dom[($dom[$key]['parent'])]['thead'] .= '';
      -					}
      -				} else {
      -					// *** opening or self-closing html tag
      -					$dom[$key]['opening'] = true;
      -					$dom[$key]['parent'] = end($level);
      -					if ((substr($element, -1, 1) == '/') OR (in_array($dom[$key]['value'], $selfclosingtags))) {
      -						// self-closing tag
      -						$dom[$key]['self'] = true;
      -					} else {
      -						// opening tag
      -						array_push($level, $key);
      -						$dom[$key]['self'] = false;
      -					}
      -					// copy some values from parent
      -					$parentkey = 0;
      -					if ($key > 0) {
      -						$parentkey = $dom[$key]['parent'];
      -						$dom[$key]['fontname'] = $dom[$parentkey]['fontname'];
      -						$dom[$key]['fontstyle'] = $dom[$parentkey]['fontstyle'];
      -						$dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'];
      -						$dom[$key]['font-stretch'] = $dom[$parentkey]['font-stretch'];
      -						$dom[$key]['letter-spacing'] = $dom[$parentkey]['letter-spacing'];
      -						$dom[$key]['stroke'] = $dom[$parentkey]['stroke'];
      -						$dom[$key]['fill'] = $dom[$parentkey]['fill'];
      -						$dom[$key]['clip'] = $dom[$parentkey]['clip'];
      -						$dom[$key]['line-height'] = $dom[$parentkey]['line-height'];
      -						$dom[$key]['bgcolor'] = $dom[$parentkey]['bgcolor'];
      -						$dom[$key]['fgcolor'] = $dom[$parentkey]['fgcolor'];
      -						$dom[$key]['strokecolor'] = $dom[$parentkey]['strokecolor'];
      -						$dom[$key]['align'] = $dom[$parentkey]['align'];
      -						$dom[$key]['listtype'] = $dom[$parentkey]['listtype'];
      -						$dom[$key]['text-indent'] = $dom[$parentkey]['text-indent'];
      -						$dom[$key]['border'] = array();
      -						$dom[$key]['dir'] = $dom[$parentkey]['dir'];
      -					}
      -					// get attributes
      -					preg_match_all('/([^=\s]*)[\s]*=[\s]*"([^"]*)"/', $element, $attr_array, PREG_PATTERN_ORDER);
      -					$dom[$key]['attribute'] = array(); // reset attribute array
      -					while (list($id, $name) = each($attr_array[1])) {
      -						$dom[$key]['attribute'][strtolower($name)] = $attr_array[2][$id];
      -					}
      -					if (!empty($css)) {
      -						// merge eternal CSS style to current style
      -						$dom[$key]['attribute']['style'] = $this->getTagStyleFromCSS($dom, $key, $css);
      -					}
      -					// split style attributes
      -					if (isset($dom[$key]['attribute']['style']) AND !empty($dom[$key]['attribute']['style'])) {
      -						// get style attributes
      -						preg_match_all('/([^;:\s]*):([^;]*)/', $dom[$key]['attribute']['style'], $style_array, PREG_PATTERN_ORDER);
      -						$dom[$key]['style'] = array(); // reset style attribute array
      -						while (list($id, $name) = each($style_array[1])) {
      -							// in case of duplicate attribute the last replace the previous
      -							$dom[$key]['style'][strtolower($name)] = trim($style_array[2][$id]);
      -						}
      -						// --- get some style attributes ---
      -						// text direction
      -						if (isset($dom[$key]['style']['direction'])) {
      -							$dom[$key]['dir'] = $dom[$key]['style']['direction'];
      -						}
      -						// font family
      -						if (isset($dom[$key]['style']['font-family'])) {
      -							$dom[$key]['fontname'] = $this->getFontFamilyName($dom[$key]['style']['font-family']);
      -						}
      -						// list-style-type
      -						if (isset($dom[$key]['style']['list-style-type'])) {
      -							$dom[$key]['listtype'] = trim(strtolower($dom[$key]['style']['list-style-type']));
      -							if ($dom[$key]['listtype'] == 'inherit') {
      -								$dom[$key]['listtype'] = $dom[$parentkey]['listtype'];
      -							}
      -						}
      -						// text-indent
      -						if (isset($dom[$key]['style']['text-indent'])) {
      -							$dom[$key]['text-indent'] = $this->getHTMLUnitToUnits($dom[$key]['style']['text-indent']);
      -							if ($dom[$key]['text-indent'] == 'inherit') {
      -								$dom[$key]['text-indent'] = $dom[$parentkey]['text-indent'];
      -							}
      -						}
      -						// font size
      -						if (isset($dom[$key]['style']['font-size'])) {
      -							$fsize = trim($dom[$key]['style']['font-size']);
      -							switch ($fsize) {
      -								// absolute-size
      -								case 'xx-small': {
      -									$dom[$key]['fontsize'] = $dom[0]['fontsize'] - 4;
      -									break;
      -								}
      -								case 'x-small': {
      -									$dom[$key]['fontsize'] = $dom[0]['fontsize'] - 3;
      -									break;
      -								}
      -								case 'small': {
      -									$dom[$key]['fontsize'] = $dom[0]['fontsize'] - 2;
      -									break;
      -								}
      -								case 'medium': {
      -									$dom[$key]['fontsize'] = $dom[0]['fontsize'];
      -									break;
      -								}
      -								case 'large': {
      -									$dom[$key]['fontsize'] = $dom[0]['fontsize'] + 2;
      -									break;
      -								}
      -								case 'x-large': {
      -									$dom[$key]['fontsize'] = $dom[0]['fontsize'] + 4;
      -									break;
      -								}
      -								case 'xx-large': {
      -									$dom[$key]['fontsize'] = $dom[0]['fontsize'] + 6;
      -									break;
      -								}
      -								// relative-size
      -								case 'smaller': {
      -									$dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'] - 3;
      -									break;
      -								}
      -								case 'larger': {
      -									$dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'] + 3;
      -									break;
      -								}
      -								default: {
      -									$dom[$key]['fontsize'] = $this->getHTMLUnitToUnits($fsize, $dom[$parentkey]['fontsize'], 'pt', true);
      -								}
      -							}
      -						}
      -						// font-stretch
      -						if (isset($dom[$key]['style']['font-stretch'])) {
      -							$dom[$key]['font-stretch'] = $this->getCSSFontStretching($dom[$key]['style']['font-stretch'], $dom[$parentkey]['font-stretch']);
      -						}
      -						// letter-spacing
      -						if (isset($dom[$key]['style']['letter-spacing'])) {
      -							$dom[$key]['letter-spacing'] = $this->getCSSFontSpacing($dom[$key]['style']['letter-spacing'], $dom[$parentkey]['letter-spacing']);
      -						}
      -						// line-height
      -						if (isset($dom[$key]['style']['line-height'])) {
      -							$lineheight = trim($dom[$key]['style']['line-height']);
      -							switch ($lineheight) {
      -								// A normal line height. This is default
      -								case 'normal': {
      -									$dom[$key]['line-height'] = $dom[0]['line-height'];
      -									break;
      -								}
      -								default: {
      -									if (is_numeric($lineheight)) {
      -										$lineheight = $lineheight * 100;
      -									}
      -									$dom[$key]['line-height'] = $this->getHTMLUnitToUnits($lineheight, 1, '%', true);
      -								}
      -							}
      -						}
      -						// font style
      -						if (isset($dom[$key]['style']['font-weight']) AND (strtolower($dom[$key]['style']['font-weight']{0}) == 'b')) {
      -							$dom[$key]['fontstyle'] .= 'B';
      -						}
      -						if (isset($dom[$key]['style']['font-style']) AND (strtolower($dom[$key]['style']['font-style']{0}) == 'i')) {
      -							$dom[$key]['fontstyle'] .= 'I';
      -						}
      -						// font color
      -						if (isset($dom[$key]['style']['color']) AND (!$this->empty_string($dom[$key]['style']['color']))) {
      -							$dom[$key]['fgcolor'] = $this->convertHTMLColorToDec($dom[$key]['style']['color']);
      -						} elseif ($dom[$key]['value'] == 'a') {
      -							$dom[$key]['fgcolor'] = $this->htmlLinkColorArray;
      -						}
      -						// background color
      -						if (isset($dom[$key]['style']['background-color']) AND (!$this->empty_string($dom[$key]['style']['background-color']))) {
      -							$dom[$key]['bgcolor'] = $this->convertHTMLColorToDec($dom[$key]['style']['background-color']);
      -						}
      -						// text-decoration
      -						if (isset($dom[$key]['style']['text-decoration'])) {
      -							$decors = explode(' ', strtolower($dom[$key]['style']['text-decoration']));
      -							foreach ($decors as $dec) {
      -								$dec = trim($dec);
      -								if (!$this->empty_string($dec)) {
      -									if ($dec{0} == 'u') {
      -										// underline
      -										$dom[$key]['fontstyle'] .= 'U';
      -									} elseif ($dec{0} == 'l') {
      -										// line-trough
      -										$dom[$key]['fontstyle'] .= 'D';
      -									} elseif ($dec{0} == 'o') {
      -										// overline
      -										$dom[$key]['fontstyle'] .= 'O';
      -									}
      -								}
      -							}
      -						} elseif ($dom[$key]['value'] == 'a') {
      -							$dom[$key]['fontstyle'] = $this->htmlLinkFontStyle;
      -						}
      -						// check for width attribute
      -						if (isset($dom[$key]['style']['width'])) {
      -							$dom[$key]['width'] = $dom[$key]['style']['width'];
      -						}
      -						// check for height attribute
      -						if (isset($dom[$key]['style']['height'])) {
      -							$dom[$key]['height'] = $dom[$key]['style']['height'];
      -						}
      -						// check for text alignment
      -						if (isset($dom[$key]['style']['text-align'])) {
      -							$dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align']{0});
      -						}
      -						// check for CSS border properties
      -						if (isset($dom[$key]['style']['border'])) {
      -							$borderstyle = $this->getCSSBorderStyle($dom[$key]['style']['border']);
      -							if (!empty($borderstyle)) {
      -								$dom[$key]['border']['LTRB'] = $borderstyle;
      -							}
      -						}
      -						if (isset($dom[$key]['style']['border-color'])) {
      -							$brd_colors = preg_split('/[\s]+/', trim($dom[$key]['style']['border-color']));
      -							if (isset($brd_colors[3])) {
      -								$dom[$key]['border']['L']['color'] = $this->convertHTMLColorToDec($brd_colors[3]);
      -							}
      -							if (isset($brd_colors[1])) {
      -								$dom[$key]['border']['R']['color'] = $this->convertHTMLColorToDec($brd_colors[1]);
      -							}
      -							if (isset($brd_colors[0])) {
      -								$dom[$key]['border']['T']['color'] = $this->convertHTMLColorToDec($brd_colors[0]);
      -							}
      -							if (isset($brd_colors[2])) {
      -								$dom[$key]['border']['B']['color'] = $this->convertHTMLColorToDec($brd_colors[2]);
      -							}
      -						}
      -						if (isset($dom[$key]['style']['border-width'])) {
      -							$brd_widths = preg_split('/[\s]+/', trim($dom[$key]['style']['border-width']));
      -							if (isset($brd_widths[3])) {
      -								$dom[$key]['border']['L']['width'] = $this->getCSSBorderWidth($brd_widths[3]);
      -							}
      -							if (isset($brd_widths[1])) {
      -								$dom[$key]['border']['R']['width'] = $this->getCSSBorderWidth($brd_widths[1]);
      -							}
      -							if (isset($brd_widths[0])) {
      -								$dom[$key]['border']['T']['width'] = $this->getCSSBorderWidth($brd_widths[0]);
      -							}
      -							if (isset($brd_widths[2])) {
      -								$dom[$key]['border']['B']['width'] = $this->getCSSBorderWidth($brd_widths[2]);
      -							}
      -						}
      -						if (isset($dom[$key]['style']['border-style'])) {
      -							$brd_styles = preg_split('/[\s]+/', trim($dom[$key]['style']['border-style']));
      -							if (isset($brd_styles[3])) {
      -								$dom[$key]['border']['L']['cap'] = 'square';
      -								$dom[$key]['border']['L']['join'] = 'miter';
      -								$dom[$key]['border']['L']['dash'] = $this->getCSSBorderDashStyle($brd_styles[3]);
      -								if ($dom[$key]['border']['L']['dash'] < 0) {
      -									$dom[$key]['border']['L'] = array();
      -								}
      -							}
      -							if (isset($brd_styles[1])) {
      -								$dom[$key]['border']['R']['cap'] = 'square';
      -								$dom[$key]['border']['R']['join'] = 'miter';
      -								$dom[$key]['border']['R']['dash'] = $this->getCSSBorderDashStyle($brd_styles[1]);
      -								if ($dom[$key]['border']['R']['dash'] < 0) {
      -									$dom[$key]['border']['R'] = array();
      -								}
      -							}
      -							if (isset($brd_styles[0])) {
      -								$dom[$key]['border']['T']['cap'] = 'square';
      -								$dom[$key]['border']['T']['join'] = 'miter';
      -								$dom[$key]['border']['T']['dash'] = $this->getCSSBorderDashStyle($brd_styles[0]);
      -								if ($dom[$key]['border']['T']['dash'] < 0) {
      -									$dom[$key]['border']['T'] = array();
      -								}
      -							}
      -							if (isset($brd_styles[2])) {
      -								$dom[$key]['border']['B']['cap'] = 'square';
      -								$dom[$key]['border']['B']['join'] = 'miter';
      -								$dom[$key]['border']['B']['dash'] = $this->getCSSBorderDashStyle($brd_styles[2]);
      -								if ($dom[$key]['border']['B']['dash'] < 0) {
      -									$dom[$key]['border']['B'] = array();
      -								}
      -							}
      -						}
      -						$cellside = array('L' => 'left', 'R' => 'right', 'T' => 'top', 'B' => 'bottom');
      -						foreach ($cellside as $bsk => $bsv) {
      -							if (isset($dom[$key]['style']['border-'.$bsv])) {
      -								$borderstyle = $this->getCSSBorderStyle($dom[$key]['style']['border-'.$bsv]);
      -								if (!empty($borderstyle)) {
      -									$dom[$key]['border'][$bsk] = $borderstyle;
      -								}
      -							}
      -							if (isset($dom[$key]['style']['border-'.$bsv.'-color'])) {
      -								$dom[$key]['border'][$bsk]['color'] = $this->convertHTMLColorToDec($dom[$key]['style']['border-'.$bsv.'-color']);
      -							}
      -							if (isset($dom[$key]['style']['border-'.$bsv.'-width'])) {
      -								$dom[$key]['border'][$bsk]['width'] = $this->getCSSBorderWidth($dom[$key]['style']['border-'.$bsv.'-width']);
      -							}
      -							if (isset($dom[$key]['style']['border-'.$bsv.'-style'])) {
      -								$dom[$key]['border'][$bsk]['dash'] = $this->getCSSBorderDashStyle($dom[$key]['style']['border-'.$bsv.'-style']);
      -								if ($dom[$key]['border'][$bsk]['dash'] < 0) {
      -									$dom[$key]['border'][$bsk] = array();
      -								}
      -							}
      -						}
      -						// check for CSS padding properties
      -						if (isset($dom[$key]['style']['padding'])) {
      -							$dom[$key]['padding'] = $this->getCSSPadding($dom[$key]['style']['padding']);
      -						} else {
      -							$dom[$key]['padding'] = $this->cell_padding;
      -						}
      -						foreach ($cellside as $psk => $psv) {
      -							if (isset($dom[$key]['style']['padding-'.$psv])) {
      -								$dom[$key]['padding'][$psk] = $this->getHTMLUnitToUnits($dom[$key]['style']['padding-'.$psv], 0, 'px', false);
      -							}
      -						}
      -						// check for CSS margin properties
      -						if (isset($dom[$key]['style']['margin'])) {
      -							$dom[$key]['margin'] = $this->getCSSMargin($dom[$key]['style']['margin']);
      -						} else {
      -							$dom[$key]['margin'] = $this->cell_margin;
      -						}
      -						foreach ($cellside as $psk => $psv) {
      -							if (isset($dom[$key]['style']['margin-'.$psv])) {
      -								$dom[$key]['margin'][$psk] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $dom[$key]['style']['margin-'.$psv]), 0, 'px', false);
      -							}
      -						}
      -						// check for CSS border-spacing properties
      -						if (isset($dom[$key]['style']['border-spacing'])) {
      -							$dom[$key]['border-spacing'] = $this->getCSSBorderMargin($dom[$key]['style']['border-spacing']);
      -						}
      -						// page-break-inside
      -						if (isset($dom[$key]['style']['page-break-inside']) AND ($dom[$key]['style']['page-break-inside'] == 'avoid')) {
      -							$dom[$key]['attribute']['nobr'] = 'true';
      -						}
      -						// page-break-before
      -						if (isset($dom[$key]['style']['page-break-before'])) {
      -							if ($dom[$key]['style']['page-break-before'] == 'always') {
      -								$dom[$key]['attribute']['pagebreak'] = 'true';
      -							} elseif ($dom[$key]['style']['page-break-before'] == 'left') {
      -								$dom[$key]['attribute']['pagebreak'] = 'left';
      -							} elseif ($dom[$key]['style']['page-break-before'] == 'right') {
      -								$dom[$key]['attribute']['pagebreak'] = 'right';
      -							}
      -						}
      -						// page-break-after
      -						if (isset($dom[$key]['style']['page-break-after'])) {
      -							if ($dom[$key]['style']['page-break-after'] == 'always') {
      -								$dom[$key]['attribute']['pagebreakafter'] = 'true';
      -							} elseif ($dom[$key]['style']['page-break-after'] == 'left') {
      -								$dom[$key]['attribute']['pagebreakafter'] = 'left';
      -							} elseif ($dom[$key]['style']['page-break-after'] == 'right') {
      -								$dom[$key]['attribute']['pagebreakafter'] = 'right';
      -							}
      -						}
      -					}
      -					if (isset($dom[$key]['attribute']['border']) AND ($dom[$key]['attribute']['border'] != 0)) {
      -						$borderstyle = $this->getCSSBorderStyle($dom[$key]['attribute']['border'].' solid black');
      -						if (!empty($borderstyle)) {
      -							$dom[$key]['border']['LTRB'] = $borderstyle;
      -						}
      -					}
      -					// check for font tag
      -					if ($dom[$key]['value'] == 'font') {
      -						// font family
      -						if (isset($dom[$key]['attribute']['face'])) {
      -							$dom[$key]['fontname'] = $this->getFontFamilyName($dom[$key]['attribute']['face']);
      -						}
      -						// font size
      -						if (isset($dom[$key]['attribute']['size'])) {
      -							if ($key > 0) {
      -								if ($dom[$key]['attribute']['size']{0} == '+') {
      -									$dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] + intval(substr($dom[$key]['attribute']['size'], 1));
      -								} elseif ($dom[$key]['attribute']['size']{0} == '-') {
      -									$dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] - intval(substr($dom[$key]['attribute']['size'], 1));
      -								} else {
      -									$dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']);
      -								}
      -							} else {
      -								$dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']);
      -							}
      -						}
      -					}
      -					// force natural alignment for lists
      -					if ((($dom[$key]['value'] == 'ul') OR ($dom[$key]['value'] == 'ol') OR ($dom[$key]['value'] == 'dl'))
      -						AND (!isset($dom[$key]['align']) OR $this->empty_string($dom[$key]['align']) OR ($dom[$key]['align'] != 'J'))) {
      -						if ($this->rtl) {
      -							$dom[$key]['align'] = 'R';
      -						} else {
      -							$dom[$key]['align'] = 'L';
      -						}
      -					}
      -					if (($dom[$key]['value'] == 'small') OR ($dom[$key]['value'] == 'sup') OR ($dom[$key]['value'] == 'sub')) {
      -						if (!isset($dom[$key]['attribute']['size']) AND !isset($dom[$key]['style']['font-size'])) {
      -							$dom[$key]['fontsize'] = $dom[$key]['fontsize'] * K_SMALL_RATIO;
      -						}
      -					}
      -					if (($dom[$key]['value'] == 'strong') OR ($dom[$key]['value'] == 'b')) {
      -						$dom[$key]['fontstyle'] .= 'B';
      -					}
      -					if (($dom[$key]['value'] == 'em') OR ($dom[$key]['value'] == 'i')) {
      -						$dom[$key]['fontstyle'] .= 'I';
      -					}
      -					if ($dom[$key]['value'] == 'u') {
      -						$dom[$key]['fontstyle'] .= 'U';
      -					}
      -					if (($dom[$key]['value'] == 'del') OR ($dom[$key]['value'] == 's') OR ($dom[$key]['value'] == 'strike')) {
      -						$dom[$key]['fontstyle'] .= 'D';
      -					}
      -					if (!isset($dom[$key]['style']['text-decoration']) AND ($dom[$key]['value'] == 'a')) {
      -						$dom[$key]['fontstyle'] = $this->htmlLinkFontStyle;
      -					}
      -					if (($dom[$key]['value'] == 'pre') OR ($dom[$key]['value'] == 'tt')) {
      -						$dom[$key]['fontname'] = $this->default_monospaced_font;
      -					}
      -					if (($dom[$key]['value']{0} == 'h') AND (intval($dom[$key]['value']{1}) > 0) AND (intval($dom[$key]['value']{1}) < 7)) {
      -						// headings h1, h2, h3, h4, h5, h6
      -						if (!isset($dom[$key]['attribute']['size']) AND !isset($dom[$key]['style']['font-size'])) {
      -							$headsize = (4 - intval($dom[$key]['value']{1})) * 2;
      -							$dom[$key]['fontsize'] = $dom[0]['fontsize'] + $headsize;
      -						}
      -						if (!isset($dom[$key]['style']['font-weight'])) {
      -							$dom[$key]['fontstyle'] .= 'B';
      -						}
      -					}
      -					if (($dom[$key]['value'] == 'table')) {
      -						$dom[$key]['rows'] = 0; // number of rows
      -						$dom[$key]['trids'] = array(); // IDs of TR elements
      -						$dom[$key]['thead'] = ''; // table header rows
      -					}
      -					if (($dom[$key]['value'] == 'tr')) {
      -						$dom[$key]['cols'] = 0;
      -						if ($thead) {
      -							$dom[$key]['thead'] = true;
      -							// rows on thead block are printed as a separate table
      -						} else {
      -							$dom[$key]['thead'] = false;
      -							// store the number of rows on table element
      -							++$dom[($dom[$key]['parent'])]['rows'];
      -							// store the TR elements IDs on table element
      -							array_push($dom[($dom[$key]['parent'])]['trids'], $key);
      -						}
      -					}
      -					if (($dom[$key]['value'] == 'th') OR ($dom[$key]['value'] == 'td')) {
      -						if (isset($dom[$key]['attribute']['colspan'])) {
      -							$colspan = intval($dom[$key]['attribute']['colspan']);
      -						} else {
      -							$colspan = 1;
      -						}
      -						$dom[$key]['attribute']['colspan'] = $colspan;
      -						$dom[($dom[$key]['parent'])]['cols'] += $colspan;
      -					}
      -					// text direction
      -					if (isset($dom[$key]['attribute']['dir'])) {
      -						$dom[$key]['dir'] = $dom[$key]['attribute']['dir'];
      -					}
      -					// set foreground color attribute
      -					if (isset($dom[$key]['attribute']['color']) AND (!$this->empty_string($dom[$key]['attribute']['color']))) {
      -						$dom[$key]['fgcolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['color']);
      -					} elseif (!isset($dom[$key]['style']['color']) AND ($dom[$key]['value'] == 'a')) {
      -						$dom[$key]['fgcolor'] = $this->htmlLinkColorArray;
      -					}
      -					// set background color attribute
      -					if (isset($dom[$key]['attribute']['bgcolor']) AND (!$this->empty_string($dom[$key]['attribute']['bgcolor']))) {
      -						$dom[$key]['bgcolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['bgcolor']);
      -					}
      -					// set stroke color attribute
      -					if (isset($dom[$key]['attribute']['strokecolor']) AND (!$this->empty_string($dom[$key]['attribute']['strokecolor']))) {
      -						$dom[$key]['strokecolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['strokecolor']);
      -					}
      -					// check for width attribute
      -					if (isset($dom[$key]['attribute']['width'])) {
      -						$dom[$key]['width'] = $dom[$key]['attribute']['width'];
      -					}
      -					// check for height attribute
      -					if (isset($dom[$key]['attribute']['height'])) {
      -						$dom[$key]['height'] = $dom[$key]['attribute']['height'];
      -					}
      -					// check for text alignment
      -					if (isset($dom[$key]['attribute']['align']) AND (!$this->empty_string($dom[$key]['attribute']['align'])) AND ($dom[$key]['value'] !== 'img')) {
      -						$dom[$key]['align'] = strtoupper($dom[$key]['attribute']['align']{0});
      -					}
      -					// check for text rendering mode (the following attributes do not exist in HTML)
      -					if (isset($dom[$key]['attribute']['stroke'])) {
      -						// font stroke width
      -						$dom[$key]['stroke'] = $this->getHTMLUnitToUnits($dom[$key]['attribute']['stroke'], $dom[$key]['fontsize'], 'pt', true);
      -					}
      -					if (isset($dom[$key]['attribute']['fill'])) {
      -						// font fill
      -						if ($dom[$key]['attribute']['fill'] == 'true') {
      -							$dom[$key]['fill'] = true;
      -						} else {
      -							$dom[$key]['fill'] = false;
      -						}
      -					}
      -					if (isset($dom[$key]['attribute']['clip'])) {
      -						// clipping mode
      -						if ($dom[$key]['attribute']['clip'] == 'true') {
      -							$dom[$key]['clip'] = true;
      -						} else {
      -							$dom[$key]['clip'] = false;
      -						}
      -					}
      -				} // end opening tag
      -			} else {
      -				// text
      -				$dom[$key]['tag'] = false;
      -				$dom[$key]['block'] = false;
      -				$element = str_replace('$nbsp;', $this->unichr(160), $element);
      -				$dom[$key]['value'] = stripslashes($this->unhtmlentities($element));
      -				$dom[$key]['parent'] = end($level);
      -			}
      -			++$elkey;
      -			++$key;
      -		}
      -		return $dom;
      -	}
      -
      -	/**
      -	 * Returns the string used to find spaces
      -	 * @return string
      -	 * @access protected
      -	 * @author Nicola Asuni
      -	 * @since 4.8.024 (2010-01-15)
      -	 */
      -	protected function getSpaceString() {
      -		$spacestr = chr(32);
      -		if ($this->isUnicodeFont()) {
      -			$spacestr = chr(0).chr(32);
      -		}
      -		return $spacestr;
      -	}
      -
      -	/**
      -	 * Prints a cell (rectangular area) with optional borders, background color and html text string.
      -	 * The upper-left corner of the cell corresponds to the current position. After the call, the current position moves to the right or to the next line.
      - * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting. - * @param float $w Cell width. If 0, the cell extends up to the right margin. - * @param float $h Cell minimum height. The cell extends automatically if needed. - * @param float $x upper-left corner X coordinate - * @param float $y upper-left corner Y coordinate - * @param string $html html text to print. Default value: empty string. - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
      • 0: no border (default)
      • 1: frame
      or a string containing some or all of the following characters (in any order):
      • L: left
      • T: top
      • R: right
      • B: bottom
      or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param int $ln Indicates where the current position should go after the call. Possible values are:
      • 0: to the right (or left for RTL language)
      • 1: to the beginning of the next line
      • 2: below
      -Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. - * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false). - * @param boolean $reseth if true reset the last cell height (default true). - * @param string $align Allows to center or align the text. Possible values are:
      • L : left align
      • C : center
      • R : right align
      • '' : empty string : left for LTR or right for RTL
      - * @param boolean $autopadding if true, uses internal padding and automatically adjust it to account for line width. - * @access public - * @uses MultiCell() - * @see Multicell(), writeHTML() - */ - public function writeHTMLCell($w, $h, $x, $y, $html='', $border=0, $ln=0, $fill=false, $reseth=true, $align='', $autopadding=true) { - return $this->MultiCell($w, $h, $html, $border, $align, $fill, $ln, $x, $y, $reseth, 0, true, $autopadding, 0); - } - - /** - * Allows to preserve some HTML formatting (limited support).
      - * IMPORTANT: The HTML must be well formatted - try to clean-up it using an application like HTML-Tidy before submitting. - * Supported tags are: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul - * @param string $html text to display - * @param boolean $ln if true add a new line after text (default = true) - * @param boolean $fill Indicates if the background must be painted (true) or transparent (false). - * @param boolean $reseth if true reset the last cell height (default false). - * @param boolean $cell if true add the current left (or right for RTL) padding to each Write (default false). - * @param string $align Allows to center or align the text. Possible values are:
      • L : left align
      • C : center
      • R : right align
      • '' : empty string : left for LTR or right for RTL
      - * @access public - */ - public function writeHTML($html, $ln=true, $fill=false, $reseth=false, $cell=false, $align='') { - $gvars = $this->getGraphicVars(); - // store current values - $prev_cell_margin = $this->cell_margin; - $prev_cell_padding = $this->cell_padding; - $prevPage = $this->page; - $prevlMargin = $this->lMargin; - $prevrMargin = $this->rMargin; - $curfontname = $this->FontFamily; - $curfontstyle = $this->FontStyle; - $curfontsize = $this->FontSizePt; - $curfontascent = $this->getFontAscent($curfontname, $curfontstyle, $curfontsize); - $curfontdescent = $this->getFontDescent($curfontname, $curfontstyle, $curfontsize); - $curfontstretcing = $this->font_stretching; - $curfontkerning = $this->font_spacing; - $this->newline = true; - $newline = true; - $startlinepage = $this->page; - $minstartliney = $this->y; - $maxbottomliney = 0; - $startlinex = $this->x; - $startliney = $this->y; - $yshift = 0; - $loop = 0; - $curpos = 0; - $this_method_vars = array(); - $undo = false; - $fontaligned = false; - $reverse_dir = false; // true when the text direction is reversed - $this->premode = false; - if ($this->inxobj) { - // we are inside an XObject template - $pask = count($this->xobjects[$this->xobjid]['annotations']); - } elseif (isset($this->PageAnnots[$this->page])) { - $pask = count($this->PageAnnots[$this->page]); - } else { - $pask = 0; - } - if ($this->inxobj) { - // we are inside an XObject template - $startlinepos = strlen($this->xobjects[$this->xobjid]['outdata']); - } elseif (!$this->InFooter) { - if (isset($this->footerlen[$this->page])) { - $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; - } else { - $this->footerpos[$this->page] = $this->pagelen[$this->page]; - } - $startlinepos = $this->footerpos[$this->page]; - } else { - // we are inside the footer - $startlinepos = $this->pagelen[$this->page]; - } - $lalign = $align; - $plalign = $align; - if ($this->rtl) { - $w = $this->x - $this->lMargin; - } else { - $w = $this->w - $this->rMargin - $this->x; - } - $w -= ($this->cell_padding['L'] + $this->cell_padding['R']); - if ($cell) { - if ($this->rtl) { - $this->x -= $this->cell_padding['R']; - $this->lMargin += $this->cell_padding['R']; - } else { - $this->x += $this->cell_padding['L']; - $this->rMargin += $this->cell_padding['L']; - } - } - if ($this->customlistindent >= 0) { - $this->listindent = $this->customlistindent; - } else { - $this->listindent = $this->GetStringWidth('0000'); - } - $this->listindentlevel = 0; - // save previous states - $prev_cell_height_ratio = $this->cell_height_ratio; - $prev_listnum = $this->listnum; - $prev_listordered = $this->listordered; - $prev_listcount = $this->listcount; - $prev_lispacer = $this->lispacer; - $this->listnum = 0; - $this->listordered = array(); - $this->listcount = array(); - $this->lispacer = ''; - if (($this->empty_string($this->lasth)) OR ($reseth)) { - // reset row height - $this->resetLastH(); - } - $dom = $this->getHtmlDomArray($html); - $maxel = count($dom); - $key = 0; - while ($key < $maxel) { - if ($dom[$key]['tag'] AND isset($dom[$key]['attribute']['pagebreak'])) { - // check for pagebreak - if (($dom[$key]['attribute']['pagebreak'] == 'true') OR ($dom[$key]['attribute']['pagebreak'] == 'left') OR ($dom[$key]['attribute']['pagebreak'] == 'right')) { - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $this->checkPageBreak($this->PageBreakTrigger + 1); - } - if ((($dom[$key]['attribute']['pagebreak'] == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0)))) - OR (($dom[$key]['attribute']['pagebreak'] == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) { - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $this->checkPageBreak($this->PageBreakTrigger + 1); - } - } - if ($dom[$key]['tag'] AND $dom[$key]['opening'] AND isset($dom[$key]['attribute']['nobr']) AND ($dom[$key]['attribute']['nobr'] == 'true')) { - if (isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) { - $dom[$key]['attribute']['nobr'] = false; - } else { - // store current object - $this->startTransaction(); - // save this method vars - $this_method_vars['html'] = $html; - $this_method_vars['ln'] = $ln; - $this_method_vars['fill'] = $fill; - $this_method_vars['reseth'] = $reseth; - $this_method_vars['cell'] = $cell; - $this_method_vars['align'] = $align; - $this_method_vars['gvars'] = $gvars; - $this_method_vars['prevPage'] = $prevPage; - $this_method_vars['prev_cell_margin'] = $prev_cell_margin; - $this_method_vars['prev_cell_padding'] = $prev_cell_padding; - $this_method_vars['prevlMargin'] = $prevlMargin; - $this_method_vars['prevrMargin'] = $prevrMargin; - $this_method_vars['curfontname'] = $curfontname; - $this_method_vars['curfontstyle'] = $curfontstyle; - $this_method_vars['curfontsize'] = $curfontsize; - $this_method_vars['curfontascent'] = $curfontascent; - $this_method_vars['curfontdescent'] = $curfontdescent; - $this_method_vars['curfontstretcing'] = $curfontstretcing; - $this_method_vars['curfontkerning'] = $curfontkerning; - $this_method_vars['minstartliney'] = $minstartliney; - $this_method_vars['maxbottomliney'] = $maxbottomliney; - $this_method_vars['yshift'] = $yshift; - $this_method_vars['startlinepage'] = $startlinepage; - $this_method_vars['startlinepos'] = $startlinepos; - $this_method_vars['startlinex'] = $startlinex; - $this_method_vars['startliney'] = $startliney; - $this_method_vars['newline'] = $newline; - $this_method_vars['loop'] = $loop; - $this_method_vars['curpos'] = $curpos; - $this_method_vars['pask'] = $pask; - $this_method_vars['lalign'] = $lalign; - $this_method_vars['plalign'] = $plalign; - $this_method_vars['w'] = $w; - $this_method_vars['prev_cell_height_ratio'] = $prev_cell_height_ratio; - $this_method_vars['prev_listnum'] = $prev_listnum; - $this_method_vars['prev_listordered'] = $prev_listordered; - $this_method_vars['prev_listcount'] = $prev_listcount; - $this_method_vars['prev_lispacer'] = $prev_lispacer; - $this_method_vars['fontaligned'] = $fontaligned; - $this_method_vars['key'] = $key; - $this_method_vars['dom'] = $dom; - } - } - // print THEAD block - if (($dom[$key]['value'] == 'tr') AND isset($dom[$key]['thead']) AND $dom[$key]['thead']) { - if (isset($dom[$key]['parent']) AND isset($dom[$dom[$key]['parent']]['thead']) AND !$this->empty_string($dom[$dom[$key]['parent']]['thead'])) { - $this->inthead = true; - // print table header (thead) - $this->writeHTML($this->thead, false, false, false, false, ''); - // check if we are on a new page or on a new column - if (($this->y < $this->start_transaction_y) OR ($this->checkPageBreak($this->lasth, '', false))) { - // we are on a new page or on a new column and the total object height is less than the available vertical space. - // restore previous object - $this->rollbackTransaction(true); - // restore previous values - foreach ($this_method_vars as $vkey => $vval) { - $$vkey = $vval; - } - // disable table header - $tmp_thead = $this->thead; - $this->thead = ''; - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $pre_y = $this->y; - if ((!$this->checkPageBreak($this->PageBreakTrigger + 1)) AND ($this->y < $pre_y)) { - // fix for multicolumn mode - $startliney = $this->y; - } - $this->start_transaction_page = $this->page; - $this->start_transaction_y = $this->y; - // restore table header - $this->thead = $tmp_thead; - // fix table border properties - if (isset($dom[$dom[$key]['parent']]['attribute']['cellspacing'])) { - $tmp_cellspacing = $this->getHTMLUnitToUnits($dom[$dom[$key]['parent']]['attribute']['cellspacing'], 1, 'px'); - } elseif (isset($dom[$dom[$key]['parent']]['border-spacing'])) { - $tmp_cellspacing = $dom[$dom[$key]['parent']]['border-spacing']['V']; - } else { - $tmp_cellspacing = 0; - } - $dom[$dom[$key]['parent']]['borderposition']['page'] = $this->page; - $dom[$dom[$key]['parent']]['borderposition']['column'] = $this->current_column; - $dom[$dom[$key]['parent']]['borderposition']['y'] = $this->y + $tmp_cellspacing; - $xoffset = ($this->x - $dom[$dom[$key]['parent']]['borderposition']['x']); - $dom[$dom[$key]['parent']]['borderposition']['x'] += $xoffset; - $dom[$dom[$key]['parent']]['borderposition']['xmax'] += $xoffset; - // print table header (thead) - $this->writeHTML($this->thead, false, false, false, false, ''); - } - } - // move $key index forward to skip THEAD block - while ( ($key < $maxel) AND (!( - ($dom[$key]['tag'] AND $dom[$key]['opening'] AND ($dom[$key]['value'] == 'tr') AND (!isset($dom[$key]['thead']) OR !$dom[$key]['thead'])) - OR ($dom[$key]['tag'] AND (!$dom[$key]['opening']) AND ($dom[$key]['value'] == 'table'))) )) { - ++$key; - } - } - if ($dom[$key]['tag'] OR ($key == 0)) { - if ((($dom[$key]['value'] == 'table') OR ($dom[$key]['value'] == 'tr')) AND (isset($dom[$key]['align']))) { - $dom[$key]['align'] = ($this->rtl) ? 'R' : 'L'; - } - // vertically align image in line - if ((!$this->newline) AND ($dom[$key]['value'] == 'img') AND (isset($dom[$key]['height'])) AND ($dom[$key]['height'] > 0)) { - // get image height - $imgh = $this->getHTMLUnitToUnits($dom[$key]['height'], $this->lasth, 'px'); - // check for automatic line break - $autolinebreak = false; - if (isset($dom[$key]['width']) AND ($dom[$key]['width'] > 0)) { - $imgw = $this->getHTMLUnitToUnits($dom[$key]['width'], 1, 'px', false); - if (($this->rtl AND (($this->x - $imgw) < ($this->lMargin + $this->cell_padding['L']))) - OR (!$this->rtl AND (($this->x + $imgw) > ($this->w - $this->rMargin - $this->cell_padding['R'])))) { - // add automatic line break - $autolinebreak = true; - $this->Ln('', $cell); - // go back to evaluate this line break - --$key; - } - } - if (!$autolinebreak) { - if (!$this->InFooter) { - $pre_y = $this->y; - // check for page break - if ((!$this->checkPageBreak($imgh)) AND ($this->y < $pre_y)) { - // fix for multicolumn mode - $startliney = $this->y; - } - } - if ($this->page > $startlinepage) { - // fix line splitted over two pages - if (isset($this->footerlen[$startlinepage])) { - $curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; - } - // line to be moved one page forward - $pagebuff = $this->getPageBuffer($startlinepage); - $linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos)); - $tstart = substr($pagebuff, 0, $startlinepos); - $tend = substr($this->getPageBuffer($startlinepage), $curpos); - // remove line from previous page - $this->setPageBuffer($startlinepage, $tstart.''.$tend); - $pagebuff = $this->getPageBuffer($this->page); - $tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]); - $tend = substr($pagebuff, $this->cntmrk[$this->page]); - // add line start to current page - $yshift = $minstartliney - $this->y; - if ($fontaligned) { - $yshift += ($curfontsize / $this->k); - } - $try = sprintf('1 0 0 1 0 %.3F cm', ($yshift * $this->k)); - $this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend); - // shift the annotations and links - if (isset($this->PageAnnots[$this->page])) { - $next_pask = count($this->PageAnnots[$this->page]); - } else { - $next_pask = 0; - } - if (isset($this->PageAnnots[$startlinepage])) { - foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) { - if ($pak >= $pask) { - $this->PageAnnots[$this->page][] = $pac; - unset($this->PageAnnots[$startlinepage][$pak]); - $npak = count($this->PageAnnots[$this->page]) - 1; - $this->PageAnnots[$this->page][$npak]['y'] -= $yshift; - } - } - } - $pask = $next_pask; - $startlinepos = $this->cntmrk[$this->page]; - $startlinepage = $this->page; - $startliney = $this->y; - $this->newline = false; - } - $this->y += ((($curfontsize * $this->cell_height_ratio / $this->k) + $curfontascent - $curfontdescent) / 2) - $imgh; - $minstartliney = min($this->y, $minstartliney); - $maxbottomliney = ($startliney + ($this->FontSize * $this->cell_height_ratio)); - } - } elseif (isset($dom[$key]['fontname']) OR isset($dom[$key]['fontstyle']) OR isset($dom[$key]['fontsize']) OR isset($dom[$key]['line-height'])) { - // account for different font size - $pfontname = $curfontname; - $pfontstyle = $curfontstyle; - $pfontsize = $curfontsize; - $fontname = isset($dom[$key]['fontname']) ? $dom[$key]['fontname'] : $curfontname; - $fontstyle = isset($dom[$key]['fontstyle']) ? $dom[$key]['fontstyle'] : $curfontstyle; - $fontsize = isset($dom[$key]['fontsize']) ? $dom[$key]['fontsize'] : $curfontsize; - $fontascent = $this->getFontAscent($fontname, $fontstyle, $fontsize); - $fontdescent = $this->getFontDescent($fontname, $fontstyle, $fontsize); - if (($fontname != $curfontname) OR ($fontstyle != $curfontstyle) OR ($fontsize != $curfontsize) OR ($this->cell_height_ratio != $dom[$key]['line-height'])) { - if ((!$this->newline) AND ($key < ($maxel - 1)) - AND ((is_numeric($fontsize) AND ($fontsize >= 0) AND is_numeric($curfontsize) AND ($curfontsize >= 0) AND ($fontsize != $curfontsize)) - OR ($this->cell_height_ratio != $dom[$key]['line-height']))) { - if ($this->page > $startlinepage) { - // fix lines splitted over two pages - if (isset($this->footerlen[$startlinepage])) { - $curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; - } - // line to be moved one page forward - $pagebuff = $this->getPageBuffer($startlinepage); - $linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos)); - $tstart = substr($pagebuff, 0, $startlinepos); - $tend = substr($this->getPageBuffer($startlinepage), $curpos); - // remove line start from previous page - $this->setPageBuffer($startlinepage, $tstart.''.$tend); - $pagebuff = $this->getPageBuffer($this->page); - $tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]); - $tend = substr($pagebuff, $this->cntmrk[$this->page]); - // add line start to current page - $yshift = $minstartliney - $this->y; - $try = sprintf('1 0 0 1 0 %.3F cm', ($yshift * $this->k)); - $this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend); - // shift the annotations and links - if (isset($this->PageAnnots[$this->page])) { - $next_pask = count($this->PageAnnots[$this->page]); - } else { - $next_pask = 0; - } - if (isset($this->PageAnnots[$startlinepage])) { - foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) { - if ($pak >= $pask) { - $this->PageAnnots[$this->page][] = $pac; - unset($this->PageAnnots[$startlinepage][$pak]); - $npak = count($this->PageAnnots[$this->page]) - 1; - $this->PageAnnots[$this->page][$npak]['y'] -= $yshift; - } - } - } - $pask = $next_pask; - $startlinepos = $this->cntmrk[$this->page]; - $startlinepage = $this->page; - $startliney = $this->y; - } - if (!isset($dom[$key]['line-height'])) { - $dom[$key]['line-height'] = $this->cell_height_ratio; - } - if (!$dom[$key]['block']) { - $this->y += (((($curfontsize * $this->cell_height_ratio ) - ($fontsize * $dom[$key]['line-height'])) / $this->k) + $curfontascent - $fontascent - $curfontdescent + $fontdescent) / 2; - if (($dom[$key]['value'] != 'sup') AND ($dom[$key]['value'] != 'sub')) { - $minstartliney = min($this->y, $minstartliney); - $maxbottomliney = max(($this->y + (($fontsize * $this->cell_height_ratio) / $this->k)), $maxbottomliney); - } - } - $this->cell_height_ratio = $dom[$key]['line-height']; - $fontaligned = true; - } - $this->SetFont($fontname, $fontstyle, $fontsize); - // reset row height - $this->resetLastH(); - $curfontname = $fontname; - $curfontstyle = $fontstyle; - $curfontsize = $fontsize; - $curfontascent = $fontascent; - $curfontdescent = $fontdescent; - } - } - // set text rendering mode - $textstroke = isset($dom[$key]['stroke']) ? $dom[$key]['stroke'] : $this->textstrokewidth; - $textfill = isset($dom[$key]['fill']) ? $dom[$key]['fill'] : (($this->textrendermode % 2) == 0); - $textclip = isset($dom[$key]['clip']) ? $dom[$key]['clip'] : ($this->textrendermode > 3); - $this->setTextRenderingMode($textstroke, $textfill, $textclip); - if (isset($dom[$key]['font-stretch']) AND ($dom[$key]['font-stretch'] !== false)) { - $this->setFontStretching($dom[$key]['font-stretch']); - } - if (isset($dom[$key]['letter-spacing']) AND ($dom[$key]['letter-spacing'] !== false)) { - $this->setFontSpacing($dom[$key]['letter-spacing']); - } - if (($plalign == 'J') AND $dom[$key]['block']) { - $plalign = ''; - } - // get current position on page buffer - $curpos = $this->pagelen[$startlinepage]; - if (isset($dom[$key]['bgcolor']) AND ($dom[$key]['bgcolor'] !== false)) { - $this->SetFillColorArray($dom[$key]['bgcolor']); - $wfill = true; - } else { - $wfill = $fill | false; - } - if (isset($dom[$key]['fgcolor']) AND ($dom[$key]['fgcolor'] !== false)) { - $this->SetTextColorArray($dom[$key]['fgcolor']); - } - if (isset($dom[$key]['strokecolor']) AND ($dom[$key]['strokecolor'] !== false)) { - $this->SetDrawColorArray($dom[$key]['strokecolor']); - } - if (isset($dom[$key]['align'])) { - $lalign = $dom[$key]['align']; - } - if ($this->empty_string($lalign)) { - $lalign = $align; - } - } - // align lines - if ($this->newline AND (strlen($dom[$key]['value']) > 0) AND ($dom[$key]['value'] != 'td') AND ($dom[$key]['value'] != 'th')) { - $newline = true; - $fontaligned = false; - // we are at the beginning of a new line - if (isset($startlinex)) { - $yshift = $minstartliney - $startliney; - if (($yshift > 0) OR ($this->page > $startlinepage)) { - $yshift = 0; - } - $t_x = 0; - // the last line must be shifted to be aligned as requested - $linew = abs($this->endlinex - $startlinex); - if ($this->inxobj) { - // we are inside an XObject template - $pstart = substr($this->xobjects[$this->xobjid]['outdata'], 0, $startlinepos); - if (isset($opentagpos)) { - $midpos = $opentagpos; - } else { - $midpos = 0; - } - if ($midpos > 0) { - $pmid = substr($this->xobjects[$this->xobjid]['outdata'], $startlinepos, ($midpos - $startlinepos)); - $pend = substr($this->xobjects[$this->xobjid]['outdata'], $midpos); - } else { - $pmid = substr($this->xobjects[$this->xobjid]['outdata'], $startlinepos); - $pend = ''; - } - } else { - $pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos); - if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { - $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; - $midpos = min($opentagpos, $this->footerpos[$startlinepage]); - } elseif (isset($opentagpos)) { - $midpos = $opentagpos; - } elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { - $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; - $midpos = $this->footerpos[$startlinepage]; - } else { - $midpos = 0; - } - if ($midpos > 0) { - $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos)); - $pend = substr($this->getPageBuffer($startlinepage), $midpos); - } else { - $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos); - $pend = ''; - } - } - if ((isset($plalign) AND ((($plalign == 'C') OR ($plalign == 'J') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl)))))) { - // calculate shifting amount - $tw = $w; - if (($plalign == 'J') AND $this->isRTLTextDir() AND ($this->num_columns > 1)) { - $tw += $this->cell_padding['R']; - } - if ($this->lMargin != $prevlMargin) { - $tw += ($prevlMargin - $this->lMargin); - } - if ($this->rMargin != $prevrMargin) { - $tw += ($prevrMargin - $this->rMargin); - } - $one_space_width = $this->GetStringWidth(chr(32)); - $no = 0; // number of spaces on a line contained on a single block - if ($this->isRTLTextDir()) { // RTL - // remove left space if exist - $pos1 = $this->revstrpos($pmid, '[('); - if ($pos1 > 0) { - $pos1 = intval($pos1); - if ($this->isUnicodeFont()) { - $pos2 = intval($this->revstrpos($pmid, '[('.chr(0).chr(32))); - $spacelen = 2; - } else { - $pos2 = intval($this->revstrpos($pmid, '[('.chr(32))); - $spacelen = 1; - } - if ($pos1 == $pos2) { - $pmid = substr($pmid, 0, ($pos1 + 2)).substr($pmid, ($pos1 + 2 + $spacelen)); - if (substr($pmid, $pos1, 4) == '[()]') { - $linew -= $one_space_width; - } elseif ($pos1 == strpos($pmid, '[(')) { - $no = 1; - } - } - } - } else { // LTR - // remove right space if exist - $pos1 = $this->revstrpos($pmid, ')]'); - if ($pos1 > 0) { - $pos1 = intval($pos1); - if ($this->isUnicodeFont()) { - $pos2 = intval($this->revstrpos($pmid, chr(0).chr(32).')]')) + 2; - $spacelen = 2; - } else { - $pos2 = intval($this->revstrpos($pmid, chr(32).')]')) + 1; - $spacelen = 1; - } - if ($pos1 == $pos2) { - $pmid = substr($pmid, 0, ($pos1 - $spacelen)).substr($pmid, $pos1); - $linew -= $one_space_width; - } - } - } - $mdiff = ($tw - $linew); - if ($plalign == 'C') { - if ($this->rtl) { - $t_x = -($mdiff / 2); - } else { - $t_x = ($mdiff / 2); - } - } elseif ($plalign == 'R') { - // right alignment on LTR document - $t_x = $mdiff; - } elseif ($plalign == 'L') { - // left alignment on RTL document - $t_x = -$mdiff; - } elseif (($plalign == 'J') AND ($plalign == $lalign)) { - // Justification - if ($this->isRTLTextDir()) { - // align text on the left - $t_x = -$mdiff; - } - $ns = 0; // number of spaces - $pmidtemp = $pmid; - // escape special characters - $pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp); - $pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp); - // search spaces - if (preg_match_all('/\[\(([^\)]*)\)\]/x', $pmidtemp, $lnstring, PREG_PATTERN_ORDER)) { - $spacestr = $this->getSpaceString(); - $maxkk = count($lnstring[1]) - 1; - for ($kk=0; $kk <= $maxkk; ++$kk) { - // restore special characters - $lnstring[1][$kk] = str_replace('#!#OP#!#', '(', $lnstring[1][$kk]); - $lnstring[1][$kk] = str_replace('#!#CP#!#', ')', $lnstring[1][$kk]); - // store number of spaces on the strings - $lnstring[2][$kk] = substr_count($lnstring[1][$kk], $spacestr); - // count total spaces on line - $ns += $lnstring[2][$kk]; - $lnstring[3][$kk] = $ns; - } - if ($ns == 0) { - $ns = 1; - } - // calculate additional space to add to each existing space - $spacewidth = ($mdiff / ($ns - $no)) * $this->k; - $spacewidthu = -1000 * ($mdiff + (($ns + $no) * $one_space_width)) / $ns / $this->FontSize; - if ($this->font_spacing != 0) { - // fixed spacing mode - $osw = -1000 * $this->font_spacing / $this->FontSize; - $spacewidthu += $osw; - } - $nsmax = $ns; - $ns = 0; - reset($lnstring); - $offset = 0; - $strcount = 0; - $prev_epsposbeg = 0; - $textpos = 0; - if ($this->isRTLTextDir()) { - $textpos = $this->wPt; - } - global $spacew; - while (preg_match('/([0-9\.\+\-]*)[\s](Td|cm|m|l|c|re)[\s]/x', $pmid, $strpiece, PREG_OFFSET_CAPTURE, $offset) == 1) { - // check if we are inside a string section '[( ... )]' - $stroffset = strpos($pmid, '[(', $offset); - if (($stroffset !== false) AND ($stroffset <= $strpiece[2][1])) { - // set offset to the end of string section - $offset = strpos($pmid, ')]', $stroffset); - while (($offset !== false) AND ($pmid{($offset - 1)} == '\\')) { - $offset = strpos($pmid, ')]', ($offset + 1)); - } - if ($offset === false) { - $this->Error('HTML Justification: malformed PDF code.'); - } - continue; - } - if ($this->isRTLTextDir()) { - $spacew = ($spacewidth * ($nsmax - $ns)); - } else { - $spacew = ($spacewidth * $ns); - } - $offset = $strpiece[2][1] + strlen($strpiece[2][0]); - $epsposbeg = strpos($pmid, 'q'.$this->epsmarker, $offset); - $epsposend = strpos($pmid, $this->epsmarker.'Q', $offset) + strlen($this->epsmarker.'Q'); - if ((($epsposbeg > 0) AND ($epsposend > 0) AND ($offset > $epsposbeg) AND ($offset < $epsposend)) - OR (($epsposbeg === false) AND ($epsposend > 0) AND ($offset < $epsposend))) { - // shift EPS images - $trx = sprintf('1 0 0 1 %.3F 0 cm', $spacew); - $epsposbeg = strpos($pmid, 'q'.$this->epsmarker, ($prev_epsposbeg - 6)); - $pmid_b = substr($pmid, 0, $epsposbeg); - $pmid_m = substr($pmid, $epsposbeg, ($epsposend - $epsposbeg)); - $pmid_e = substr($pmid, $epsposend); - $pmid = $pmid_b."\nq\n".$trx."\n".$pmid_m."\nQ\n".$pmid_e; - $offset = $epsposend; - continue; - - } - $prev_epsposbeg = $epsposbeg; - $currentxpos = 0; - // shift blocks of code - switch ($strpiece[2][0]) { - case 'Td': - case 'cm': - case 'm': - case 'l': { - // get current X position - preg_match('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches); - $currentxpos = $xmatches[1]; - $textpos = $currentxpos; - if (($strcount <= $maxkk) AND ($strpiece[2][0] == 'Td')) { - $ns = $lnstring[3][$strcount]; - if ($this->isRTLTextDir()) { - $spacew = ($spacewidth * ($nsmax - $ns)); - } - ++$strcount; - } - // justify block - $pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', - create_function('$matches', 'global $spacew; - $newx = sprintf("%.2F",(floatval($matches[1]) + $spacew)); - return "".$newx." ".$matches[2]." x*#!#*x".$matches[3].$matches[4];'), $pmid, 1); - break; - } - case 're': { - // justify block - if (!$this->empty_string($this->lispacer)) { - $this->lispacer = ''; - continue; - } - preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s](re)([\s]*)/x', $pmid, $xmatches); - $currentxpos = $xmatches[1]; - global $x_diff, $w_diff; - $x_diff = 0; - $w_diff = 0; - if ($this->isRTLTextDir()) { // RTL - if ($currentxpos < $textpos) { - $x_diff = ($spacewidth * ($nsmax - $lnstring[3][$strcount])); - $w_diff = ($spacewidth * $lnstring[2][$strcount]); - } else { - if ($strcount > 0) { - $x_diff = ($spacewidth * ($nsmax - $lnstring[3][($strcount - 1)])); - $w_diff = ($spacewidth * $lnstring[2][($strcount - 1)]); - } - } - } else { // LTR - if ($currentxpos > $textpos) { - if ($strcount > 0) { - $x_diff = ($spacewidth * $lnstring[3][($strcount - 1)]); - } - $w_diff = ($spacewidth * $lnstring[2][$strcount]); - } else { - if ($strcount > 1) { - $x_diff = ($spacewidth * $lnstring[3][($strcount - 2)]); - } - if ($strcount > 0) { - $w_diff = ($spacewidth * $lnstring[2][($strcount - 1)]); - } - } - } - $pmid = preg_replace_callback('/('.$xmatches[1].')[\s]('.$xmatches[2].')[\s]('.$xmatches[3].')[\s]('.$strpiece[1][0].')[\s](re)([\s]*)/x', - create_function('$matches', 'global $x_diff, $w_diff; - $newx = sprintf("%.2F",(floatval($matches[1]) + $x_diff)); - $neww = sprintf("%.2F",(floatval($matches[3]) + $w_diff)); - return "".$newx." ".$matches[2]." ".$neww." ".$matches[4]." x*#!#*x".$matches[5].$matches[6];'), $pmid, 1); - break; - } - case 'c': { - // get current X position - preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s](c)([\s]*)/x', $pmid, $xmatches); - $currentxpos = $xmatches[1]; - // justify block - $pmid = preg_replace_callback('/('.$xmatches[1].')[\s]('.$xmatches[2].')[\s]('.$xmatches[3].')[\s]('.$xmatches[4].')[\s]('.$xmatches[5].')[\s]('.$strpiece[1][0].')[\s](c)([\s]*)/x', - create_function('$matches', 'global $spacew; - $newx1 = sprintf("%.3F",(floatval($matches[1]) + $spacew)); - $newx2 = sprintf("%.3F",(floatval($matches[3]) + $spacew)); - $newx3 = sprintf("%.3F",(floatval($matches[5]) + $spacew)); - return "".$newx1." ".$matches[2]." ".$newx2." ".$matches[4]." ".$newx3." ".$matches[6]." x*#!#*x".$matches[7].$matches[8];'), $pmid, 1); - break; - } - } - // shift the annotations and links - $cxpos = ($currentxpos / $this->k); - $lmpos = ($this->lMargin + $this->cell_padding['L'] + $this->feps); - if ($this->inxobj) { - // we are inside an XObject template - foreach ($this->xobjects[$this->xobjid]['annotations'] as $pak => $pac) { - if (($pac['y'] >= $minstartliney) AND (($pac['x'] * $this->k) >= ($currentxpos - $this->feps)) AND (($pac['x'] * $this->k) <= ($currentxpos + $this->feps))) { - if ($cxpos > $lmpos) { - $this->xobjects[$this->xobjid]['annotations'][$pak]['x'] += ($spacew / $this->k); - $this->xobjects[$this->xobjid]['annotations'][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k); - } else { - $this->xobjects[$this->xobjid]['annotations'][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k); - } - break; - } - } - } elseif (isset($this->PageAnnots[$this->page])) { - foreach ($this->PageAnnots[$this->page] as $pak => $pac) { - if (($pac['y'] >= $minstartliney) AND (($pac['x'] * $this->k) >= ($currentxpos - $this->feps)) AND (($pac['x'] * $this->k) <= ($currentxpos + $this->feps))) { - if ($cxpos > $lmpos) { - $this->PageAnnots[$this->page][$pak]['x'] += ($spacew / $this->k); - $this->PageAnnots[$this->page][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k); - } else { - $this->PageAnnots[$this->page][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k); - } - break; - } - } - } - } // end of while - // remove markers - $pmid = str_replace('x*#!#*x', '', $pmid); - if ($this->isUnicodeFont()) { - // multibyte characters - $spacew = $spacewidthu; - if ($this->font_stretching != 100) { - // word spacing is affected by stretching - $spacew /= ($this->font_stretching / 100); - } - $pmidtemp = $pmid; - // escape special characters - $pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp); - $pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp); - $pmid = preg_replace_callback("/\[\(([^\)]*)\)\]/x", - create_function('$matches', 'global $spacew; - $matches[1] = str_replace("#!#OP#!#", "(", $matches[1]); - $matches[1] = str_replace("#!#CP#!#", ")", $matches[1]); - return "[(".str_replace(chr(0).chr(32), ") ".sprintf("%.3F", $spacew)." (", $matches[1]).")]";'), $pmidtemp); - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['outdata'] = $pstart."\n".$pmid."\n".$pend; - } else { - $this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\n".$pend); - } - $endlinepos = strlen($pstart."\n".$pmid."\n"); - } else { - // non-unicode (single-byte characters) - if ($this->font_stretching != 100) { - // word spacing (Tw) is affected by stretching - $spacewidth /= ($this->font_stretching / 100); - } - $rs = sprintf('%.3F Tw', $spacewidth); - $pmid = preg_replace("/\[\(/x", $rs.' [(', $pmid); - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['outdata'] = $pstart."\n".$pmid."\nBT 0 Tw ET\n".$pend; - } else { - $this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\nBT 0 Tw ET\n".$pend); - } - $endlinepos = strlen($pstart."\n".$pmid."\nBT 0 Tw ET\n"); - } - } - } // end of J - } // end if $startlinex - if (($t_x != 0) OR ($yshift < 0)) { - // shift the line - $trx = sprintf('1 0 0 1 %.3F %.3F cm', ($t_x * $this->k), ($yshift * $this->k)); - $pstart .= "\nq\n".$trx."\n".$pmid."\nQ\n"; - $endlinepos = strlen($pstart); - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['outdata'] = $pstart.$pend; - foreach ($this->xobjects[$this->xobjid]['annotations'] as $pak => $pac) { - if ($pak >= $pask) { - $this->xobjects[$this->xobjid]['annotations'][$pak]['x'] += $t_x; - $this->xobjects[$this->xobjid]['annotations'][$pak]['y'] -= $yshift; - } - } - } else { - $this->setPageBuffer($startlinepage, $pstart.$pend); - // shift the annotations and links - if (isset($this->PageAnnots[$this->page])) { - foreach ($this->PageAnnots[$this->page] as $pak => $pac) { - if ($pak >= $pask) { - $this->PageAnnots[$this->page][$pak]['x'] += $t_x; - $this->PageAnnots[$this->page][$pak]['y'] -= $yshift; - } - } - } - } - $this->y -= $yshift; - } - } - $pbrk = $this->checkPageBreak($this->lasth); - $this->newline = false; - $startlinex = $this->x; - $startliney = $this->y; - if ($dom[$dom[$key]['parent']]['value'] == 'sup') { - $startliney -= ((0.3 * $this->FontSizePt) / $this->k); - } elseif ($dom[$dom[$key]['parent']]['value'] == 'sub') { - $startliney -= (($this->FontSizePt / 0.7) / $this->k); - } else { - $minstartliney = $startliney; - $maxbottomliney = ($this->y + (($fontsize * $this->cell_height_ratio) / $this->k)); - } - $startlinepage = $this->page; - if (isset($endlinepos) AND (!$pbrk)) { - $startlinepos = $endlinepos; - } else { - if ($this->inxobj) { - // we are inside an XObject template - $startlinepos = strlen($this->xobjects[$this->xobjid]['outdata']); - } elseif (!$this->InFooter) { - if (isset($this->footerlen[$this->page])) { - $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; - } else { - $this->footerpos[$this->page] = $this->pagelen[$this->page]; - } - $startlinepos = $this->footerpos[$this->page]; - } else { - $startlinepos = $this->pagelen[$this->page]; - } - } - unset($endlinepos); - $plalign = $lalign; - if (isset($this->PageAnnots[$this->page])) { - $pask = count($this->PageAnnots[$this->page]); - } else { - $pask = 0; - } - if (!($dom[$key]['tag'] AND !$dom[$key]['opening'] AND ($dom[$key]['value'] == 'table') AND ($this->emptypagemrk[$this->page] == $this->pagelen[$this->page]))) { - $this->SetFont($fontname, $fontstyle, $fontsize); - if ($wfill) { - $this->SetFillColorArray($this->bgcolor); - } - } - } // end newline - if (isset($opentagpos)) { - unset($opentagpos); - } - if ($dom[$key]['tag']) { - if ($dom[$key]['opening']) { - // get text indentation (if any) - if (isset($dom[$key]['text-indent']) AND $dom[$key]['block']) { - $this->textindent = $dom[$key]['text-indent']; - $this->newline = true; - } - // table - if ($dom[$key]['value'] == 'table') { - // available page width - if ($this->rtl) { - $wtmp = $this->x - $this->lMargin; - } else { - $wtmp = $this->w - $this->rMargin - $this->x; - } - // get cell spacing - if (isset($dom[$key]['attribute']['cellspacing'])) { - $clsp = $this->getHTMLUnitToUnits($dom[$key]['attribute']['cellspacing'], 1, 'px'); - $cellspacing = array('H' => $clsp, 'V' => $clsp); - } elseif (isset($dom[$key]['border-spacing'])) { - $cellspacing = $dom[$key]['border-spacing']; - } else { - $cellspacing = array('H' => 0, 'V' => 0); - } - // table width - if (isset($dom[$key]['width'])) { - $table_width = $this->getHTMLUnitToUnits($dom[$key]['width'], $wtmp, 'px'); - } else { - $table_width = $wtmp; - } - $table_width -= (2 * $cellspacing['H']); - if (!$this->inthead) { - $this->y += $cellspacing['V']; - } - if ($this->rtl) { - $cellspacingx = -$cellspacing['H']; - } else { - $cellspacingx = $cellspacing['H']; - } - // total table width without cellspaces - $table_columns_width = ($table_width - ($cellspacing['H'] * ($dom[$key]['cols'] - 1))); - // minimum column width - $table_min_column_width = ($table_columns_width / $dom[$key]['cols']); - // array of custom column widths - $table_colwidths = array_fill(0, $dom[$key]['cols'], $table_min_column_width); - } - // table row - if ($dom[$key]['value'] == 'tr') { - // reset column counter - $colid = 0; - } - // table cell - if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) { - $trid = $dom[$key]['parent']; - $table_el = $dom[$trid]['parent']; - if (!isset($dom[$table_el]['cols'])) { - $dom[$table_el]['cols'] = $dom[$trid]['cols']; - } - // store border info - $tdborder = 0; - if (isset($dom[$key]['border']) AND !empty($dom[$key]['border'])) { - $tdborder = $dom[$key]['border']; - } - $colspan = $dom[$key]['attribute']['colspan']; - $old_cell_padding = $this->cell_padding; - if (isset($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'])) { - $crclpd = $this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'], 1, 'px'); - $current_cell_padding = array('L' => $crclpd, 'T' => $crclpd, 'R' => $crclpd, 'B' => $crclpd); - } elseif (isset($dom[($dom[$trid]['parent'])]['padding'])) { - $current_cell_padding = $dom[($dom[$trid]['parent'])]['padding']; - } else { - $current_cell_padding = array('L' => 0, 'T' => 0, 'R' => 0, 'B' => 0); - } - $this->cell_padding = $current_cell_padding; - if (isset($dom[$key]['height'])) { - // minimum cell height - $cellh = $this->getHTMLUnitToUnits($dom[$key]['height'], 0, 'px'); - } else { - $cellh = 0; - } - if (isset($dom[$key]['content'])) { - $cell_content = $dom[$key]['content']; - } else { - $cell_content = ' '; - } - $tagtype = $dom[$key]['value']; - $parentid = $key; - while (($key < $maxel) AND (!(($dom[$key]['tag']) AND (!$dom[$key]['opening']) AND ($dom[$key]['value'] == $tagtype) AND ($dom[$key]['parent'] == $parentid)))) { - // move $key index forward - ++$key; - } - if (!isset($dom[$trid]['startpage'])) { - $dom[$trid]['startpage'] = $this->page; - } else { - $this->setPage($dom[$trid]['startpage']); - } - if (!isset($dom[$trid]['startcolumn'])) { - $dom[$trid]['startcolumn'] = $this->current_column; - } elseif ($this->current_column != $dom[$trid]['startcolumn']) { - $tmpx = $this->x; - $this->selectColumn($dom[$trid]['startcolumn']); - $this->x = $tmpx; - } - if (!isset($dom[$trid]['starty'])) { - $dom[$trid]['starty'] = $this->y; - } else { - $this->y = $dom[$trid]['starty']; - } - if (!isset($dom[$trid]['startx'])) { - $dom[$trid]['startx'] = $this->x; - $this->x += $cellspacingx; - } else { - $this->x += ($cellspacingx / 2); - } - if (isset($dom[$parentid]['attribute']['rowspan'])) { - $rowspan = intval($dom[$parentid]['attribute']['rowspan']); - } else { - $rowspan = 1; - } - // skip row-spanned cells started on the previous rows - if (isset($dom[$table_el]['rowspans'])) { - $rsk = 0; - $rskmax = count($dom[$table_el]['rowspans']); - while ($rsk < $rskmax) { - $trwsp = $dom[$table_el]['rowspans'][$rsk]; - $rsstartx = $trwsp['startx']; - $rsendx = $trwsp['endx']; - // account for margin changes - if ($trwsp['startpage'] < $this->page) { - if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$trwsp['startpage']]['orm'])) { - $dl = ($this->pagedim[$this->page]['orm'] - $this->pagedim[$trwsp['startpage']]['orm']); - $rsstartx -= $dl; - $rsendx -= $dl; - } elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$trwsp['startpage']]['olm'])) { - $dl = ($this->pagedim[$this->page]['olm'] - $this->pagedim[$trwsp['startpage']]['olm']); - $rsstartx += $dl; - $rsendx += $dl; - } - } - if (($trwsp['rowspan'] > 0) - AND ($rsstartx > ($this->x - $cellspacing['H'] - $current_cell_padding['L'] - $this->feps)) - AND ($rsstartx < ($this->x + $cellspacing['H'] + $current_cell_padding['R'] + $this->feps)) - AND (($trwsp['starty'] < ($this->y - $this->feps)) OR ($trwsp['startpage'] < $this->page) OR ($trwsp['startcolumn'] < $this->current_column))) { - // set the starting X position of the current cell - $this->x = $rsendx + $cellspacingx; - // increment column indicator - $colid += $trwsp['colspan']; - if (($trwsp['rowspan'] == 1) - AND (isset($dom[$trid]['endy'])) - AND (isset($dom[$trid]['endpage'])) - AND (isset($dom[$trid]['endcolumn'])) - AND ($trwsp['endpage'] == $dom[$trid]['endpage']) - AND ($trwsp['endcolumn'] == $dom[$trid]['endcolumn'])) { - // set ending Y position for row - $dom[$table_el]['rowspans'][$rsk]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']); - $dom[$trid]['endy'] = $dom[$table_el]['rowspans'][$rsk]['endy']; - } - $rsk = 0; - } else { - ++$rsk; - } - } - } - if (isset($dom[$parentid]['width'])) { - // user specified width - $cellw = $this->getHTMLUnitToUnits($dom[$parentid]['width'], $table_columns_width, 'px'); - $tmpcw = ($cellw / $colspan); - for ($i = 0; $i < $colspan; ++$i) { - $table_colwidths[($colid + $i)] = $tmpcw; - } - } else { - // inherit column width - $cellw = 0; - for ($i = 0; $i < $colspan; ++$i) { - $cellw += $table_colwidths[($colid + $i)]; - } - } - $cellw += (($colspan - 1) * $cellspacing['H']); - // increment column indicator - $colid += $colspan; - // add rowspan information to table element - if ($rowspan > 1) { - $trsid = array_push($dom[$table_el]['rowspans'], array('trid' => $trid, 'rowspan' => $rowspan, 'mrowspan' => $rowspan, 'colspan' => $colspan, 'startpage' => $this->page, 'startcolumn' => $this->current_column, 'startx' => $this->x, 'starty' => $this->y)); - } - $cellid = array_push($dom[$trid]['cellpos'], array('startx' => $this->x)); - if ($rowspan > 1) { - $dom[$trid]['cellpos'][($cellid - 1)]['rowspanid'] = ($trsid - 1); - } - // push background colors - if (isset($dom[$parentid]['bgcolor']) AND ($dom[$parentid]['bgcolor'] !== false)) { - $dom[$trid]['cellpos'][($cellid - 1)]['bgcolor'] = $dom[$parentid]['bgcolor']; - } - // store border info - if (isset($tdborder) AND !empty($tdborder)) { - $dom[$trid]['cellpos'][($cellid - 1)]['border'] = $tdborder; - } - $prevLastH = $this->lasth; - // store some info for multicolumn mode - if ($this->rtl) { - $this->colxshift['x'] = $this->w - $this->x - $this->rMargin; - } else { - $this->colxshift['x'] = $this->x - $this->lMargin; - } - $this->colxshift['s'] = $cellspacing; - $this->colxshift['p'] = $current_cell_padding; - // ****** write the cell content ****** - $this->MultiCell($cellw, $cellh, $cell_content, false, $lalign, false, 2, '', '', true, 0, true); - // restore some values - $this->colxshift = array('x' => 0, 's' => array('H' => 0, 'V' => 0), 'p' => array('L' => 0, 'T' => 0, 'R' => 0, 'B' => 0)); - $this->lasth = $prevLastH; - $this->cell_padding = $old_cell_padding; - $dom[$trid]['cellpos'][($cellid - 1)]['endx'] = $this->x; - // update the end of row position - if ($rowspan <= 1) { - if (isset($dom[$trid]['endy'])) { - if (($this->page == $dom[$trid]['endpage']) AND ($this->current_column == $dom[$trid]['endcolumn'])) { - $dom[$trid]['endy'] = max($this->y, $dom[$trid]['endy']); - } elseif (($this->page > $dom[$trid]['endpage']) OR ($this->current_column > $dom[$trid]['endcolumn'])) { - $dom[$trid]['endy'] = $this->y; - } - } else { - $dom[$trid]['endy'] = $this->y; - } - if (isset($dom[$trid]['endpage'])) { - $dom[$trid]['endpage'] = max($this->page, $dom[$trid]['endpage']); - } else { - $dom[$trid]['endpage'] = $this->page; - } - if (isset($dom[$trid]['endcolumn'])) { - $dom[$trid]['endcolumn'] = max($this->current_column, $dom[$trid]['endcolumn']); - } else { - $dom[$trid]['endcolumn'] = $this->current_column; - } - } else { - // account for row-spanned cells - $dom[$table_el]['rowspans'][($trsid - 1)]['endx'] = $this->x; - $dom[$table_el]['rowspans'][($trsid - 1)]['endy'] = $this->y; - $dom[$table_el]['rowspans'][($trsid - 1)]['endpage'] = $this->page; - $dom[$table_el]['rowspans'][($trsid - 1)]['endcolumn'] = $this->current_column; - } - if (isset($dom[$table_el]['rowspans'])) { - // update endy and endpage on rowspanned cells - foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { - if ($trwsp['rowspan'] > 0) { - if (isset($dom[$trid]['endpage'])) { - if (($trwsp['endpage'] == $dom[$trid]['endpage']) AND ($trwsp['endcolumn'] == $dom[$trid]['endcolumn'])) { - $dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']); - } elseif (($trwsp['endpage'] < $dom[$trid]['endpage']) OR ($trwsp['endcolumn'] < $dom[$trid]['endcolumn'])) { - $dom[$table_el]['rowspans'][$k]['endy'] = $dom[$trid]['endy']; - $dom[$table_el]['rowspans'][$k]['endpage'] = $dom[$trid]['endpage']; - $dom[$table_el]['rowspans'][$k]['endcolumn'] = $dom[$trid]['endcolumn']; - } else { - $dom[$trid]['endy'] = $this->pagedim[$dom[$trid]['endpage']]['hk'] - $this->pagedim[$dom[$trid]['endpage']]['bm']; - } - } - } - } - } - $this->x += ($cellspacingx / 2); - } else { - // opening tag (or self-closing tag) - if (!isset($opentagpos)) { - if ($this->inxobj) { - // we are inside an XObject template - $opentagpos = strlen($this->xobjects[$this->xobjid]['outdata']); - } elseif (!$this->InFooter) { - if (isset($this->footerlen[$this->page])) { - $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; - } else { - $this->footerpos[$this->page] = $this->pagelen[$this->page]; - } - $opentagpos = $this->footerpos[$this->page]; - } - } - $this->openHTMLTagHandler($dom, $key, $cell); - } - } else { // closing tag - $prev_numpages = $this->numpages; - $old_bordermrk = $this->bordermrk[$this->page]; - $this->closeHTMLTagHandler($dom, $key, $cell, $maxbottomliney); - if ($this->bordermrk[$this->page] > $old_bordermrk) { - $startlinepos += ($this->bordermrk[$this->page] - $old_bordermrk); - } - if ($prev_numpages > $this->numpages) { - $startlinepage = $this->page; - } - } - } elseif (strlen($dom[$key]['value']) > 0) { - // print list-item - if (!$this->empty_string($this->lispacer) AND ($this->lispacer != '^')) { - $this->SetFont($pfontname, $pfontstyle, $pfontsize); - $this->resetLastH(); - $minstartliney = $this->y; - $maxbottomliney = ($startliney + ($this->FontSize * $this->cell_height_ratio)); - $this->putHtmlListBullet($this->listnum, $this->lispacer, $pfontsize); - $this->SetFont($curfontname, $curfontstyle, $curfontsize); - $this->resetLastH(); - if (is_numeric($pfontsize) AND ($pfontsize > 0) AND is_numeric($curfontsize) AND ($curfontsize > 0) AND ($pfontsize != $curfontsize)) { - $pfontascent = $this->getFontAscent($pfontname, $pfontstyle, $pfontsize); - $pfontdescent = $this->getFontDescent($pfontname, $pfontstyle, $pfontsize); - $this->y += ((($pfontsize - $curfontsize) * $this->cell_height_ratio / $this->k) + $pfontascent - $curfontascent - $pfontdescent + $curfontdescent) / 2; - $minstartliney = min($this->y, $minstartliney); - $maxbottomliney = max(($this->y + (($pfontsize * $this->cell_height_ratio) / $this->k)), $maxbottomliney); - } - } - // text - $this->htmlvspace = 0; - if ((!$this->premode) AND $this->isRTLTextDir()) { - // reverse spaces order - $lsp = ''; // left spaces - $rsp = ''; // right spaces - if (preg_match('/^('.$this->re_space['p'].'+)/'.$this->re_space['m'], $dom[$key]['value'], $matches)) { - $lsp = $matches[1]; - } - if (preg_match('/('.$this->re_space['p'].'+)$/'.$this->re_space['m'], $dom[$key]['value'], $matches)) { - $rsp = $matches[1]; - } - $dom[$key]['value'] = $rsp.$this->stringTrim($dom[$key]['value']).$lsp; - } - if ($newline) { - if (!$this->premode) { - $prelen = strlen($dom[$key]['value']); - if ($this->isRTLTextDir()) { - // right trim except non-breaking space - $dom[$key]['value'] = $this->stringRightTrim($dom[$key]['value']); - } else { - // left trim except non-breaking space - $dom[$key]['value'] = $this->stringLeftTrim($dom[$key]['value']); - } - $postlen = strlen($dom[$key]['value']); - if (($postlen == 0) AND ($prelen > 0)) { - $dom[$key]['trimmed_space'] = true; - } - } - $newline = false; - $firstblock = true; - } else { - $firstblock = false; - // replace empty multiple spaces string with a single space - $dom[$key]['value'] = preg_replace('/^'.$this->re_space['p'].'+$/'.$this->re_space['m'], chr(32), $dom[$key]['value']); - } - $strrest = ''; - if ($this->rtl) { - $this->x -= $this->textindent; - } else { - $this->x += $this->textindent; - } - if (!isset($dom[$key]['trimmed_space']) OR !$dom[$key]['trimmed_space']) { - if (!empty($this->HREF) AND (isset($this->HREF['url']))) { - // HTML Link - $hrefcolor = ''; - if (isset($dom[($dom[$key]['parent'])]['fgcolor']) AND ($dom[($dom[$key]['parent'])]['fgcolor'] !== false)) { - $hrefcolor = $dom[($dom[$key]['parent'])]['fgcolor']; - } - $hrefstyle = -1; - if (isset($dom[($dom[$key]['parent'])]['fontstyle']) AND ($dom[($dom[$key]['parent'])]['fontstyle'] !== false)) { - $hrefstyle = $dom[($dom[$key]['parent'])]['fontstyle']; - } - $strrest = $this->addHtmlLink($this->HREF['url'], $dom[$key]['value'], $wfill, true, $hrefcolor, $hrefstyle, true); - } else { - $wadj = 0; // space to leave for block continuity - $adjblks = 0; // number of blocks - // check the next text blocks for continuity - $nkey = ($key + 1); - $write_block = true; - $tmp_fontname = $this->FontFamily; - $tmp_fontstyle = $this->FontStyle; - $tmp_fontsize = $this->FontSizePt; - while ($write_block AND isset($dom[$nkey])) { - if ($dom[$nkey]['tag']) { - if ($dom[$nkey]['block']) { - // end of block - $write_block = false; - } - $tmp_fontname = isset($dom[$nkey]['fontname']) ? $dom[$nkey]['fontname'] : $this->FontFamily; - $tmp_fontstyle = isset($dom[$nkey]['fontstyle']) ? $dom[$nkey]['fontstyle'] : $this->FontStyle; - $tmp_fontsize = isset($dom[$nkey]['fontsize']) ? $dom[$nkey]['fontsize'] : $this->FontSizePt; - } else { - $nextstr = preg_split('/'.$this->re_space['p'].'+/'.$this->re_space['m'], $dom[$nkey]['value']); - if (isset($nextstr[0])) { - $wadj += $this->GetStringWidth($nextstr[0], $tmp_fontname, $tmp_fontstyle, $tmp_fontsize); - ++$adjblks; - } - if (isset($nextstr[1])) { - $write_block = false; - } - } - ++$nkey; - } - // check for reversed text direction - if (($wadj > 0) AND (($this->rtl AND ($this->tmprtl == 'L')) OR (!$this->rtl AND ($this->tmprtl == 'R')))) { - // LTR text on RTL direction or RTL text on LTR direction - $reverse_dir = true; - $this->rtl = !$this->rtl; - $revshift = ($this->GetStringWidth($dom[$key]['value']) + $wadj) + 0.000001; // add little quantity for rounding problems - if ($this->rtl) { - $this->x += $revshift; - } else { - $this->x -= $revshift; - } - $xws = $this->x; - } - // ****** write only until the end of the line and get the rest ****** - $strrest = $this->Write($this->lasth, $dom[$key]['value'], '', $wfill, '', false, 0, true, $firstblock, 0, $wadj); - // restore default direction - if ($reverse_dir AND ($wadj == 0)) { - $this->x = $xws; - $this->rtl = !$this->rtl; - $reverse_dir = false; - } - } - } - $this->textindent = 0; - if (strlen($strrest) > 0) { - // store the remaining string on the previous $key position - $this->newline = true; - if ($strrest == $dom[$key]['value']) { - // used to avoid infinite loop - ++$loop; - } else { - $loop = 0; - } - $dom[$key]['value'] = $strrest; - if ($cell) { - if ($this->rtl) { - $this->x -= $this->cell_padding['R']; - } else { - $this->x += $this->cell_padding['L']; - } - } - if ($loop < 3) { - --$key; - } - } else { - $loop = 0; - } - } - ++$key; - if (isset($dom[$key]['tag']) AND $dom[$key]['tag'] AND (!isset($dom[$key]['opening']) OR !$dom[$key]['opening']) AND isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) { - // check if we are on a new page or on a new column - if ((!$undo) AND ($this->y < $this->start_transaction_y)) { - // we are on a new page or on a new column and the total object height is less than the available vertical space. - // restore previous object - $this->rollbackTransaction(true); - // restore previous values - foreach ($this_method_vars as $vkey => $vval) { - $$vkey = $vval; - } - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $pre_y = $this->y; - if ((!$this->checkPageBreak($this->PageBreakTrigger + 1)) AND ($this->y < $pre_y)) { - $startliney = $this->y; - } - $undo = true; // avoid infinite loop - } else { - $undo = false; - } - } - } // end for each $key - // align the last line - if (isset($startlinex)) { - $yshift = $minstartliney - $startliney; - if (($yshift > 0) OR ($this->page > $startlinepage)) { - $yshift = 0; - } - $t_x = 0; - // the last line must be shifted to be aligned as requested - $linew = abs($this->endlinex - $startlinex); - if ($this->inxobj) { - // we are inside an XObject template - $pstart = substr($this->xobjects[$this->xobjid]['outdata'], 0, $startlinepos); - if (isset($opentagpos)) { - $midpos = $opentagpos; - } else { - $midpos = 0; - } - if ($midpos > 0) { - $pmid = substr($this->xobjects[$this->xobjid]['outdata'], $startlinepos, ($midpos - $startlinepos)); - $pend = substr($this->xobjects[$this->xobjid]['outdata'], $midpos); - } else { - $pmid = substr($this->xobjects[$this->xobjid]['outdata'], $startlinepos); - $pend = ''; - } - } else { - $pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos); - if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { - $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; - $midpos = min($opentagpos, $this->footerpos[$startlinepage]); - } elseif (isset($opentagpos)) { - $midpos = $opentagpos; - } elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { - $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; - $midpos = $this->footerpos[$startlinepage]; - } else { - $midpos = 0; - } - if ($midpos > 0) { - $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos)); - $pend = substr($this->getPageBuffer($startlinepage), $midpos); - } else { - $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos); - $pend = ''; - } - } - if ((isset($plalign) AND ((($plalign == 'C') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl)))))) { - // calculate shifting amount - $tw = $w; - if ($this->lMargin != $prevlMargin) { - $tw += ($prevlMargin - $this->lMargin); - } - if ($this->rMargin != $prevrMargin) { - $tw += ($prevrMargin - $this->rMargin); - } - $one_space_width = $this->GetStringWidth(chr(32)); - $no = 0; // number of spaces on a line contained on a single block - if ($this->isRTLTextDir()) { // RTL - // remove left space if exist - $pos1 = $this->revstrpos($pmid, '[('); - if ($pos1 > 0) { - $pos1 = intval($pos1); - if ($this->isUnicodeFont()) { - $pos2 = intval($this->revstrpos($pmid, '[('.chr(0).chr(32))); - $spacelen = 2; - } else { - $pos2 = intval($this->revstrpos($pmid, '[('.chr(32))); - $spacelen = 1; - } - if ($pos1 == $pos2) { - $pmid = substr($pmid, 0, ($pos1 + 2)).substr($pmid, ($pos1 + 2 + $spacelen)); - if (substr($pmid, $pos1, 4) == '[()]') { - $linew -= $one_space_width; - } elseif ($pos1 == strpos($pmid, '[(')) { - $no = 1; - } - } - } - } else { // LTR - // remove right space if exist - $pos1 = $this->revstrpos($pmid, ')]'); - if ($pos1 > 0) { - $pos1 = intval($pos1); - if ($this->isUnicodeFont()) { - $pos2 = intval($this->revstrpos($pmid, chr(0).chr(32).')]')) + 2; - $spacelen = 2; - } else { - $pos2 = intval($this->revstrpos($pmid, chr(32).')]')) + 1; - $spacelen = 1; - } - if ($pos1 == $pos2) { - $pmid = substr($pmid, 0, ($pos1 - $spacelen)).substr($pmid, $pos1); - $linew -= $one_space_width; - } - } - } - $mdiff = ($tw - $linew); - if ($plalign == 'C') { - if ($this->rtl) { - $t_x = -($mdiff / 2); - } else { - $t_x = ($mdiff / 2); - } - } elseif ($plalign == 'R') { - // right alignment on LTR document - $t_x = $mdiff; - } elseif ($plalign == 'L') { - // left alignment on RTL document - $t_x = -$mdiff; - } - } // end if startlinex - if (($t_x != 0) OR ($yshift < 0)) { - // shift the line - $trx = sprintf('1 0 0 1 %.3F %.3F cm', ($t_x * $this->k), ($yshift * $this->k)); - $pstart .= "\nq\n".$trx."\n".$pmid."\nQ\n"; - $endlinepos = strlen($pstart); - if ($this->inxobj) { - // we are inside an XObject template - $this->xobjects[$this->xobjid]['outdata'] = $pstart.$pend; - foreach ($this->xobjects[$this->xobjid]['annotations'] as $pak => $pac) { - if ($pak >= $pask) { - $this->xobjects[$this->xobjid]['annotations'][$pak]['x'] += $t_x; - $this->xobjects[$this->xobjid]['annotations'][$pak]['y'] -= $yshift; - } - } - } else { - $this->setPageBuffer($startlinepage, $pstart.$pend); - // shift the annotations and links - if (isset($this->PageAnnots[$this->page])) { - foreach ($this->PageAnnots[$this->page] as $pak => $pac) { - if ($pak >= $pask) { - $this->PageAnnots[$this->page][$pak]['x'] += $t_x; - $this->PageAnnots[$this->page][$pak]['y'] -= $yshift; - } - } - } - } - $this->y -= $yshift; - } - } - // restore previous values - $this->setGraphicVars($gvars); - if ($this->num_columns > 1) { - $this->selectColumn(); - } elseif ($this->page > $prevPage) { - $this->lMargin = $this->pagedim[$this->page]['olm']; - $this->rMargin = $this->pagedim[$this->page]['orm']; - } - // restore previous list state - $this->cell_height_ratio = $prev_cell_height_ratio; - $this->listnum = $prev_listnum; - $this->listordered = $prev_listordered; - $this->listcount = $prev_listcount; - $this->lispacer = $prev_lispacer; - if ($ln AND (!($cell AND ($dom[$key-1]['value'] == 'table')))) { - $this->Ln($this->lasth); - if ($this->y < $maxbottomliney) { - $this->y = $maxbottomliney; - } - } - unset($dom); - } - - /** - * Process opening tags. - * @param array $dom html dom array - * @param int $key current element id - * @param boolean $cell if true add the default left (or right if RTL) padding to each new line (default false). - * @access protected - */ - protected function openHTMLTagHandler(&$dom, $key, $cell) { - $tag = $dom[$key]; - $parent = $dom[($dom[$key]['parent'])]; - $firsttag = ($key == 1); - // check for text direction attribute - if (isset($tag['dir'])) { - $this->setTempRTL($tag['dir']); - } else { - $this->tmprtl = false; - } - if ($tag['block']) { - $hbz = 0; // distance from y to line bottom - $hb = 0; // vertical space between block tags - // calculate vertical space for block tags - if (isset($this->tagvspaces[$tag['value']][0]['h']) AND ($this->tagvspaces[$tag['value']][0]['h'] >= 0)) { - $cur_h = $this->tagvspaces[$tag['value']][0]['h']; - } elseif (isset($tag['fontsize'])) { - $cur_h = ($tag['fontsize'] / $this->k) * $this->cell_height_ratio; - } else { - $cur_h = $this->FontSize * $this->cell_height_ratio; - } - if (isset($this->tagvspaces[$tag['value']][0]['n'])) { - $n = $this->tagvspaces[$tag['value']][0]['n']; - } elseif (preg_match('/[h][0-9]/', $tag['value']) > 0) { - $n = 0.6; - } else { - $n = 1; - } - $hb = ($n * $cur_h); - if (($this->htmlvspace <= 0) AND ($n > 0)) { - if (isset($parent['fontsize'])) { - $hbz = (($parent['fontsize'] / $this->k) * $this->cell_height_ratio); - } else { - $hbz = $this->FontSize * $this->cell_height_ratio; - } - } - } - // Opening tag - switch($tag['value']) { - case 'table': { - $cp = 0; - $cs = 0; - $dom[$key]['rowspans'] = array(); - if (!isset($dom[$key]['attribute']['nested']) OR ($dom[$key]['attribute']['nested'] != 'true')) { - // set table header - if (!$this->empty_string($dom[$key]['thead'])) { - // set table header - $this->thead = $dom[$key]['thead']; - if (!isset($this->theadMargins) OR (empty($this->theadMargins))) { - $this->theadMargins = array(); - $this->theadMargins['cell_padding'] = $this->cell_padding; - $this->theadMargins['lmargin'] = $this->lMargin; - $this->theadMargins['rmargin'] = $this->rMargin; - $this->theadMargins['page'] = $this->page; - } - } - } - // store current margins and page - $dom[$key]['old_cell_padding'] = $this->cell_padding; - if (isset($tag['attribute']['cellpadding'])) { - $pad = $this->getHTMLUnitToUnits($tag['attribute']['cellpadding'], 1, 'px'); - $this->SetCellPadding($pad); - } elseif (isset($tag['padding'])) { - $this->cell_padding = $tag['padding']; - } - if (isset($tag['attribute']['cellspacing'])) { - $cs = $this->getHTMLUnitToUnits($tag['attribute']['cellspacing'], 1, 'px'); - } elseif (isset($tag['border-spacing'])) { - $cs = $tag['border-spacing']['V']; - } - $prev_y = $this->y; - if ($this->checkPageBreak(((2 * $cp) + (2 * $cs) + $this->lasth), '', false) OR ($this->y < $prev_y)) { - $this->inthead = true; - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $this->checkPageBreak($this->PageBreakTrigger + 1); - } - break; - } - case 'tr': { - // array of columns positions - $dom[$key]['cellpos'] = array(); - break; - } - case 'hr': { - if ((isset($tag['height'])) AND ($tag['height'] != '')) { - $hrHeight = $this->getHTMLUnitToUnits($tag['height'], 1, 'px'); - } else { - $hrHeight = $this->GetLineWidth(); - } - $this->addHTMLVertSpace($hbz, ($hrHeight / 2), $cell, $firsttag); - $x = $this->GetX(); - $y = $this->GetY(); - $wtmp = $this->w - $this->lMargin - $this->rMargin; - if ($cell) { - $wtmp -= ($this->cell_padding['L'] + $this->cell_padding['R']); - } - if ((isset($tag['width'])) AND ($tag['width'] != '')) { - $hrWidth = $this->getHTMLUnitToUnits($tag['width'], $wtmp, 'px'); - } else { - $hrWidth = $wtmp; - } - $prevlinewidth = $this->GetLineWidth(); - $this->SetLineWidth($hrHeight); - $this->Line($x, $y, $x + $hrWidth, $y); - $this->SetLineWidth($prevlinewidth); - $this->addHTMLVertSpace(($hrHeight / 2), 0, $cell, !isset($dom[($key + 1)])); - break; - } - case 'a': { - if (array_key_exists('href', $tag['attribute'])) { - $this->HREF['url'] = $tag['attribute']['href']; - } - break; - } - case 'img': { - if (isset($tag['attribute']['src'])) { - // replace relative path with real server path - if (($tag['attribute']['src'][0] == '/') AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { - $findroot = strpos($tag['attribute']['src'], $_SERVER['DOCUMENT_ROOT']); - if (($findroot === false) OR ($findroot > 1)) { - $tag['attribute']['src'] = $_SERVER['DOCUMENT_ROOT'].$tag['attribute']['src']; - } - } - $tag['attribute']['src'] = urldecode($tag['attribute']['src']); - $type = $this->getImageFileType($tag['attribute']['src']); - $testscrtype = @parse_url($tag['attribute']['src']); - if (!isset($testscrtype['query']) OR empty($testscrtype['query'])) { - // convert URL to server path - $tag['attribute']['src'] = str_replace(K_PATH_URL, K_PATH_MAIN, $tag['attribute']['src']); - } - if (!isset($tag['width'])) { - $tag['width'] = 0; - } - if (!isset($tag['height'])) { - $tag['height'] = 0; - } - //if (!isset($tag['attribute']['align'])) { - // the only alignment supported is "bottom" - // further development is required for other modes. - $tag['attribute']['align'] = 'bottom'; - //} - switch($tag['attribute']['align']) { - case 'top': { - $align = 'T'; - break; - } - case 'middle': { - $align = 'M'; - break; - } - case 'bottom': { - $align = 'B'; - break; - } - default: { - $align = 'B'; - break; - } - } - $prevy = $this->y; - $xpos = $this->x; - // eliminate marker spaces - if (isset($dom[($key - 1)])) { - if (($dom[($key - 1)]['value'] == ' ') OR (isset($dom[($key - 1)]['trimmed_space']))) { - $xpos -= $this->GetStringWidth(chr(32)); - } elseif ($this->rtl AND $dom[($key - 1)]['value'] == ' ') { - $xpos += (2 * $this->GetStringWidth(chr(32))); - } - } - $imglink = ''; - if (isset($this->HREF['url']) AND !$this->empty_string($this->HREF['url'])) { - $imglink = $this->HREF['url']; - if ($imglink{0} == '#') { - // convert url to internal link - $lnkdata = explode(',', $imglink); - if (isset($lnkdata[0])) { - $page = intval(substr($lnkdata[0], 1)); - if (empty($page) OR ($page <= 0)) { - $page = $this->page; - } - if (isset($lnkdata[1]) AND (strlen($lnkdata[1]) > 0)) { - $lnky = floatval($lnkdata[1]); - } else { - $lnky = 0; - } - $imglink = $this->AddLink(); - $this->SetLink($imglink, $lnky, $page); - } - } - } - $border = 0; - if (isset($tag['border']) AND !empty($tag['border'])) { - // currently only support 1 (frame) or a combination of 'LTRB' - $border = $tag['border']; - } - $iw = ''; - if (isset($tag['width'])) { - $iw = $this->getHTMLUnitToUnits($tag['width'], 1, 'px', false); - } - $ih = ''; - if (isset($tag['height'])) { - $ih = $this->getHTMLUnitToUnits($tag['height'], 1, 'px', false); - } - if (($type == 'eps') OR ($type == 'ai')) { - $this->ImageEps($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, $imglink, true, $align, '', $border, true); - } elseif ($type == 'svg') { - $this->ImageSVG($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, $imglink, $align, '', $border, true); - } else { - $this->Image($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, '', $imglink, $align, false, 300, '', false, false, $border, false, false, true); - } - switch($align) { - case 'T': { - $this->y = $prevy; - break; - } - case 'M': { - $this->y = (($this->img_rb_y + $prevy - ($tag['fontsize'] / $this->k)) / 2) ; - break; - } - case 'B': { - $this->y = $this->img_rb_y - ($tag['fontsize'] / $this->k); - break; - } - } - } - break; - } - case 'dl': { - ++$this->listnum; - if ($this->listnum == 1) { - $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag); - } else { - $this->addHTMLVertSpace(0, 0, $cell, $firsttag); - } - break; - } - case 'dt': { - $this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); - break; - } - case 'dd': { - if ($this->rtl) { - $this->rMargin += $this->listindent; - } else { - $this->lMargin += $this->listindent; - } - ++$this->listindentlevel; - $this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); - break; - } - case 'ul': - case 'ol': { - ++$this->listnum; - if ($tag['value'] == 'ol') { - $this->listordered[$this->listnum] = true; - } else { - $this->listordered[$this->listnum] = false; - } - if (isset($tag['attribute']['start'])) { - $this->listcount[$this->listnum] = intval($tag['attribute']['start']) - 1; - } else { - $this->listcount[$this->listnum] = 0; - } - if ($this->rtl) { - $this->rMargin += $this->listindent; - $this->x -= $this->listindent; - } else { - $this->lMargin += $this->listindent; - $this->x += $this->listindent; - } - ++$this->listindentlevel; - if ($this->listnum == 1) { - $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag); - } else { - $this->addHTMLVertSpace(0, 0, $cell, $firsttag); - } - break; - } - case 'li': { - $this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); - if ($this->listordered[$this->listnum]) { - // ordered item - if (isset($parent['attribute']['type']) AND !$this->empty_string($parent['attribute']['type'])) { - $this->lispacer = $parent['attribute']['type']; - } elseif (isset($parent['listtype']) AND !$this->empty_string($parent['listtype'])) { - $this->lispacer = $parent['listtype']; - } elseif (isset($this->lisymbol) AND !$this->empty_string($this->lisymbol)) { - $this->lispacer = $this->lisymbol; - } else { - $this->lispacer = '#'; - } - ++$this->listcount[$this->listnum]; - if (isset($tag['attribute']['value'])) { - $this->listcount[$this->listnum] = intval($tag['attribute']['value']); - } - } else { - // unordered item - if (isset($parent['attribute']['type']) AND !$this->empty_string($parent['attribute']['type'])) { - $this->lispacer = $parent['attribute']['type']; - } elseif (isset($parent['listtype']) AND !$this->empty_string($parent['listtype'])) { - $this->lispacer = $parent['listtype']; - } elseif (isset($this->lisymbol) AND !$this->empty_string($this->lisymbol)) { - $this->lispacer = $this->lisymbol; - } else { - $this->lispacer = '!'; - } - } - break; - } - case 'blockquote': { - if ($this->rtl) { - $this->rMargin += $this->listindent; - } else { - $this->lMargin += $this->listindent; - } - ++$this->listindentlevel; - $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag); - break; - } - case 'br': { - $this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); - break; - } - case 'div': { - $this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); - break; - } - case 'p': { - $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag); - break; - } - case 'pre': { - $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag); - $this->premode = true; - break; - } - case 'sup': { - $this->SetXY($this->GetX(), $this->GetY() - ((0.7 * $this->FontSizePt) / $this->k)); - break; - } - case 'sub': { - $this->SetXY($this->GetX(), $this->GetY() + ((0.3 * $this->FontSizePt) / $this->k)); - break; - } - case 'h1': - case 'h2': - case 'h3': - case 'h4': - case 'h5': - case 'h6': { - $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag); - break; - } - // Form fields (since 4.8.000 - 2009-09-07) - case 'form': { - if (isset($tag['attribute']['action'])) { - $this->form_action = $tag['attribute']['action']; - } else { - $this->form_action = K_PATH_URL.$_SERVER['SCRIPT_NAME']; - } - if (isset($tag['attribute']['enctype'])) { - $this->form_enctype = $tag['attribute']['enctype']; - } else { - $this->form_enctype = 'application/x-www-form-urlencoded'; - } - if (isset($tag['attribute']['method'])) { - $this->form_mode = $tag['attribute']['method']; - } else { - $this->form_mode = 'post'; - } - break; - } - case 'input': { - if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { - $name = $tag['attribute']['name']; - } else { - break; - } - $prop = array(); - $opt = array(); - if (isset($tag['attribute']['readonly']) AND !$this->empty_string($tag['attribute']['readonly'])) { - $prop['readonly'] = true; - } - if (isset($tag['attribute']['value']) AND !$this->empty_string($tag['attribute']['value'])) { - $value = $tag['attribute']['value']; - } - if (isset($tag['attribute']['maxlength']) AND !$this->empty_string($tag['attribute']['maxlength'])) { - $opt['maxlen'] = intval($tag['attribute']['value']); - } - $h = $this->FontSize * $this->cell_height_ratio; - if (isset($tag['attribute']['size']) AND !$this->empty_string($tag['attribute']['size'])) { - $w = intval($tag['attribute']['size']) * $this->GetStringWidth(chr(32)) * 2; - } else { - $w = $h; - } - if (isset($tag['attribute']['checked']) AND (($tag['attribute']['checked'] == 'checked') OR ($tag['attribute']['checked'] == 'true'))) { - $checked = true; - } else { - $checked = false; - } - switch ($tag['attribute']['type']) { - case 'text': { - if (isset($value)) { - $opt['v'] = $value; - } - $this->TextField($name, $w, $h, $prop, $opt, '', '', false); - break; - } - case 'password': { - if (isset($value)) { - $opt['v'] = $value; - } - $prop['password'] = 'true'; - $this->TextField($name, $w, $h, $prop, $opt, '', '', false); - break; - } - case 'checkbox': { - $this->CheckBox($name, $w, $checked, $prop, $opt, $value, '', '', false); - break; - } - case 'radio': { - $this->RadioButton($name, $w, $prop, $opt, $value, $checked, '', '', false); - break; - } - case 'submit': { - $w = $this->GetStringWidth($value) * 1.5; - $h *= 1.6; - $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); - $action = array(); - $action['S'] = 'SubmitForm'; - $action['F'] = $this->form_action; - if ($this->form_enctype != 'FDF') { - $action['Flags'] = array('ExportFormat'); - } - if ($this->form_mode == 'get') { - $action['Flags'] = array('GetMethod'); - } - $this->Button($name, $w, $h, $value, $action, $prop, $opt, '', '', false); - break; - } - case 'reset': { - $w = $this->GetStringWidth($value) * 1.5; - $h *= 1.6; - $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); - $this->Button($name, $w, $h, $value, array('S'=>'ResetForm'), $prop, $opt, '', '', false); - break; - } - case 'file': { - $prop['fileSelect'] = 'true'; - $this->TextField($name, $w, $h, $prop, $opt, '', '', false); - if (!isset($value)) { - $value = '*'; - } - $w = $this->GetStringWidth($value) * 2; - $h *= 1.2; - $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); - $jsaction = 'var f=this.getField(\''.$name.'\'); f.browseForFileToSubmit();'; - $this->Button('FB_'.$name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); - break; - } - case 'hidden': { - if (isset($value)) { - $opt['v'] = $value; - } - $opt['f'] = array('invisible', 'hidden'); - $this->TextField($name, 0, 0, $prop, $opt, '', '', false); - break; - } - case 'image': { - // THIS TYPE MUST BE FIXED - if (isset($tag['attribute']['src']) AND !$this->empty_string($tag['attribute']['src'])) { - $img = $tag['attribute']['src']; - } else { - break; - } - $value = 'img'; - //$opt['mk'] = array('i'=>$img, 'tp'=>1, 'if'=>array('sw'=>'A', 's'=>'A', 'fb'=>false)); - if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) { - $jsaction = $tag['attribute']['onclick']; - } else { - $jsaction = ''; - } - $this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); - break; - } - case 'button': { - $w = $this->GetStringWidth($value) * 1.5; - $h *= 1.6; - $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); - if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) { - $jsaction = $tag['attribute']['onclick']; - } else { - $jsaction = ''; - } - $this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); - break; - } - } - break; - } - case 'textarea': { - $prop = array(); - $opt = array(); - if (isset($tag['attribute']['readonly']) AND !$this->empty_string($tag['attribute']['readonly'])) { - $prop['readonly'] = true; - } - if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { - $name = $tag['attribute']['name']; - } else { - break; - } - if (isset($tag['attribute']['value']) AND !$this->empty_string($tag['attribute']['value'])) { - $opt['v'] = $tag['attribute']['value']; - } - if (isset($tag['attribute']['cols']) AND !$this->empty_string($tag['attribute']['cols'])) { - $w = intval($tag['attribute']['cols']) * $this->GetStringWidth(chr(32)) * 2; - } else { - $w = 40; - } - if (isset($tag['attribute']['rows']) AND !$this->empty_string($tag['attribute']['rows'])) { - $h = intval($tag['attribute']['rows']) * $this->FontSize * $this->cell_height_ratio; - } else { - $h = 10; - } - $prop['multiline'] = 'true'; - $this->TextField($name, $w, $h, $prop, $opt, '', '', false); - break; - } - case 'select': { - $h = $this->FontSize * $this->cell_height_ratio; - if (isset($tag['attribute']['size']) AND !$this->empty_string($tag['attribute']['size'])) { - $h *= ($tag['attribute']['size'] + 1); - } - $prop = array(); - $opt = array(); - if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { - $name = $tag['attribute']['name']; - } else { - break; - } - $w = 0; - if (isset($tag['attribute']['opt']) AND !$this->empty_string($tag['attribute']['opt'])) { - $options = explode('#!NwL!#', $tag['attribute']['opt']); - $values = array(); - foreach ($options as $val) { - if (strpos($val, '#!TaB!#') !== false) { - $opts = explode('#!TaB!#', $val); - $values[] = $opts; - $w = max($w, $this->GetStringWidth($opts[1])); - } else { - $values[] = $val; - $w = max($w, $this->GetStringWidth($val)); - } - } - } else { - break; - } - $w *= 2; - if (isset($tag['attribute']['multiple']) AND ($tag['attribute']['multiple']='multiple')) { - $prop['multipleSelection'] = 'true'; - $this->ListBox($name, $w, $h, $values, $prop, $opt, '', '', false); - } else { - $this->ComboBox($name, $w, $h, $values, $prop, $opt, '', '', false); - } - break; - } - case 'tcpdf': { - if (defined('K_TCPDF_CALLS_IN_HTML') AND (K_TCPDF_CALLS_IN_HTML === true)) { - // Special tag used to call TCPDF methods - if (isset($tag['attribute']['method'])) { - $tcpdf_method = $tag['attribute']['method']; - if (method_exists($this, $tcpdf_method)) { - if (isset($tag['attribute']['params']) AND (!empty($tag['attribute']['params']))) { - $params = unserialize(urldecode($tag['attribute']['params'])); - call_user_func_array(array($this, $tcpdf_method), $params); - } else { - $this->$tcpdf_method(); - } - $this->newline = true; - } - } - } - break; - } - default: { - break; - } - } - // define tags that support borders and background colors - $bordertags = array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table'); - if (in_array($tag['value'], $bordertags)) { - // set border - $dom[$key]['borderposition'] = $this->getBorderStartPosition(); - } - if ($dom[$key]['self'] AND isset($dom[$key]['attribute']['pagebreakafter'])) { - $pba = $dom[$key]['attribute']['pagebreakafter']; - // check for pagebreak - if (($pba == 'true') OR ($pba == 'left') OR ($pba == 'right')) { - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $this->checkPageBreak($this->PageBreakTrigger + 1); - } - if ((($pba == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0)))) - OR (($pba == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) { - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $this->checkPageBreak($this->PageBreakTrigger + 1); - } - } - } - - /** - * Process closing tags. - * @param array $dom html dom array - * @param int $key current element id - * @param boolean $cell if true add the default left (or right if RTL) padding to each new line (default false). - * @param int $maxbottomliney maximum y value of current line - * @access protected - */ - protected function closeHTMLTagHandler(&$dom, $key, $cell, $maxbottomliney=0) { - $tag = $dom[$key]; - $parent = $dom[($dom[$key]['parent'])]; - $lasttag = ((!isset($dom[($key + 1)])) OR ((!isset($dom[($key + 2)])) AND ($dom[($key + 1)]['value'] == 'marker'))); - $in_table_head = false; - // maximum x position (used to draw borders) - if ($this->rtl) { - $xmax = $this->w; - } else { - $xmax = 0; - } - if ($tag['block']) { - $hbz = 0; // distance from y to line bottom - $hb = 0; // vertical space between block tags - // calculate vertical space for block tags - if (isset($this->tagvspaces[$tag['value']][1]['h']) AND ($this->tagvspaces[$tag['value']][1]['h'] >= 0)) { - $pre_h = $this->tagvspaces[$tag['value']][1]['h']; - } elseif (isset($parent['fontsize'])) { - $pre_h = (($parent['fontsize'] / $this->k) * $this->cell_height_ratio); - } else { - $pre_h = $this->FontSize * $this->cell_height_ratio; - } - if (isset($this->tagvspaces[$tag['value']][1]['n'])) { - $n = $this->tagvspaces[$tag['value']][1]['n']; - } elseif (preg_match('/[h][0-9]/', $tag['value']) > 0) { - $n = 0.6; - } else { - $n = 1; - } - $hb = ($n * $pre_h); - if ($this->y < $maxbottomliney) { - $hbz = ($maxbottomliney - $this->y); - } - } - // Closing tag - switch($tag['value']) { - case 'tr': { - $table_el = $dom[($dom[$key]['parent'])]['parent']; - if (!isset($parent['endy'])) { - $dom[($dom[$key]['parent'])]['endy'] = $this->y; - $parent['endy'] = $this->y; - } - if (!isset($parent['endpage'])) { - $dom[($dom[$key]['parent'])]['endpage'] = $this->page; - $parent['endpage'] = $this->page; - } - if (!isset($parent['endcolumn'])) { - $dom[($dom[$key]['parent'])]['endcolumn'] = $this->current_column; - $parent['endcolumn'] = $this->current_column; - } - // update row-spanned cells - if (isset($dom[$table_el]['rowspans'])) { - foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { - $dom[$table_el]['rowspans'][$k]['rowspan'] -= 1; - if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { - if (($dom[$table_el]['rowspans'][$k]['endpage'] == $parent['endpage']) AND ($dom[$table_el]['rowspans'][$k]['endcolumn'] == $parent['endcolumn'])) { - $dom[($dom[$key]['parent'])]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $parent['endy']); - } elseif (($dom[$table_el]['rowspans'][$k]['endpage'] > $parent['endpage']) OR ($dom[$table_el]['rowspans'][$k]['endcolumn'] > $parent['endcolumn'])) { - $dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy']; - $dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage']; - $dom[($dom[$key]['parent'])]['endcolumn'] = $dom[$table_el]['rowspans'][$k]['endcolumn']; - } - } - } - // report new endy and endpage to the rowspanned cells - foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { - if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { - $dom[$table_el]['rowspans'][$k]['endpage'] = max($dom[$table_el]['rowspans'][$k]['endpage'], $dom[($dom[$key]['parent'])]['endpage']); - $dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage']; - $dom[$table_el]['rowspans'][$k]['endcolumn'] = max($dom[$table_el]['rowspans'][$k]['endcolumn'], $dom[($dom[$key]['parent'])]['endcolumn']); - $dom[($dom[$key]['parent'])]['endcolumn'] = $dom[$table_el]['rowspans'][$k]['endcolumn']; - $dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $dom[($dom[$key]['parent'])]['endy']); - $dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy']; - } - } - // update remaining rowspanned cells - foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { - if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { - $dom[$table_el]['rowspans'][$k]['endpage'] = $dom[($dom[$key]['parent'])]['endpage']; - $dom[$table_el]['rowspans'][$k]['endcolumn'] = $dom[($dom[$key]['parent'])]['endcolumn']; - $dom[$table_el]['rowspans'][$k]['endy'] = $dom[($dom[$key]['parent'])]['endy']; - } - } - } - $this->setPage($dom[($dom[$key]['parent'])]['endpage']); - if ($this->num_columns > 1) { - $this->selectColumn($dom[($dom[$key]['parent'])]['endcolumn']); - } - $this->y = $dom[($dom[$key]['parent'])]['endy']; - if (isset($dom[$table_el]['attribute']['cellspacing'])) { - $this->y += $this->getHTMLUnitToUnits($dom[$table_el]['attribute']['cellspacing'], 1, 'px'); - } elseif (isset($dom[$table_el]['border-spacing'])) { - $this->y += $dom[$table_el]['border-spacing']['V']; - } - $this->Ln(0, $cell); - if ($this->current_column == $parent['startcolumn']) { - $this->x = $parent['startx']; - } - // account for booklet mode - if ($this->page > $parent['startpage']) { - if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$parent['startpage']]['orm'])) { - $this->x -= ($this->pagedim[$this->page]['orm'] - $this->pagedim[$parent['startpage']]['orm']); - } elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$parent['startpage']]['olm'])) { - $this->x += ($this->pagedim[$this->page]['olm'] - $this->pagedim[$parent['startpage']]['olm']); - } - } - break; - } - case 'tablehead': - // closing tag used for the thead part - $in_table_head = true; - $this->inthead = false; - case 'table': { - $table_el = $parent; - // set default border - if (isset($table_el['attribute']['border']) AND ($table_el['attribute']['border'] > 0)) { - // set default border - $border = array('LTRB' => array('width' => $this->getCSSBorderWidth($table_el['attribute']['border']), 'cap'=>'square', 'join'=>'miter', 'dash'=> 0, 'color'=>array(0,0,0))); - } else { - $border = 0; - } - $default_border = $border; - // fix bottom line alignment of last line before page break - foreach ($dom[($dom[$key]['parent'])]['trids'] as $j => $trkey) { - // update row-spanned cells - if (isset($dom[($dom[$key]['parent'])]['rowspans'])) { - foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) { - if ($trwsp['trid'] == $trkey) { - $dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] -= 1; - } - if (isset($prevtrkey) AND ($trwsp['trid'] == $prevtrkey) AND ($trwsp['mrowspan'] >= 0)) { - $dom[($dom[$key]['parent'])]['rowspans'][$k]['trid'] = $trkey; - } - } - } - if (isset($prevtrkey) AND ($dom[$trkey]['startpage'] > $dom[$prevtrkey]['endpage'])) { - $pgendy = $this->pagedim[$dom[$prevtrkey]['endpage']]['hk'] - $this->pagedim[$dom[$prevtrkey]['endpage']]['bm']; - $dom[$prevtrkey]['endy'] = $pgendy; - // update row-spanned cells - if (isset($dom[($dom[$key]['parent'])]['rowspans'])) { - foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) { - if (($trwsp['trid'] == $trkey) AND ($trwsp['mrowspan'] > 1) AND ($trwsp['endpage'] == $dom[$prevtrkey]['endpage'])) { - $dom[($dom[$key]['parent'])]['rowspans'][$k]['endy'] = $pgendy; - $dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] = -1; - } - } - } - } - $prevtrkey = $trkey; - $table_el = $dom[($dom[$key]['parent'])]; - } - // for each row - unset($xmax); - foreach ($table_el['trids'] as $j => $trkey) { - $parent = $dom[$trkey]; - if (!isset($xmax)) { - $xmax = $parent['cellpos'][(count($parent['cellpos']) - 1)]['endx']; - } - // for each cell on the row - foreach ($parent['cellpos'] as $k => $cellpos) { - if (isset($cellpos['rowspanid']) AND ($cellpos['rowspanid'] >= 0)) { - $cellpos['startx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['startx']; - $cellpos['endx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['endx']; - $endy = $table_el['rowspans'][($cellpos['rowspanid'])]['endy']; - $startpage = $table_el['rowspans'][($cellpos['rowspanid'])]['startpage']; - $endpage = $table_el['rowspans'][($cellpos['rowspanid'])]['endpage']; - $startcolumn = $table_el['rowspans'][($cellpos['rowspanid'])]['startcolumn']; - $endcolumn = $table_el['rowspans'][($cellpos['rowspanid'])]['endcolumn']; - } else { - $endy = $parent['endy']; - $startpage = $parent['startpage']; - $endpage = $parent['endpage']; - $startcolumn = $parent['startcolumn']; - $endcolumn = $parent['endcolumn']; - } - if ($this->num_columns == 0) { - $this->num_columns = 1; - } - if (isset($cellpos['border'])) { - $border = $cellpos['border']; - } - if (isset($cellpos['bgcolor']) AND ($cellpos['bgcolor']) !== false) { - $this->SetFillColorArray($cellpos['bgcolor']); - $fill = true; - } else { - $fill = false; - } - $x = $cellpos['startx']; - $y = $parent['starty']; - $starty = $y; - $w = abs($cellpos['endx'] - $cellpos['startx']); - // get border modes - $border_start = $this->getBorderMode($border, $position='start'); - $border_end = $this->getBorderMode($border, $position='end'); - $border_middle = $this->getBorderMode($border, $position='middle'); - // design borders around HTML cells. - for ($page = $startpage; $page <= $endpage; ++$page) { // for each page - $ccode = ''; - $this->setPage($page); - if ($this->num_columns < 2) { - // single-column mode - $this->x = $x; - $this->y = $this->tMargin; - } - // account for margin changes - if ($page > $startpage) { - if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) { - $this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']); - } elseif ((!$this->rtl) AND ($this->pagedim[$page]['olm'] != $this->pagedim[$startpage]['olm'])) { - $this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']); - } - } - if ($startpage == $endpage) { // single page - $deltacol = 0; - $deltath = 0; - for ($column = $startcolumn; $column <= $endcolumn; ++$column) { // for each column - $this->selectColumn($column); - if ($startcolumn == $endcolumn) { // single column - $cborder = $border; - $h = $endy - $parent['starty']; - $this->y = $y; - $this->x = $x; - } elseif ($column == $startcolumn) { // first column - $cborder = $border_start; - $this->y = $starty; - $this->x = $x; - $h = $this->h - $this->y - $this->bMargin; - if ($this->rtl) { - $deltacol = $this->x + $this->rMargin - $this->w; - } else { - $deltacol = $this->x - $this->lMargin; - } - } elseif ($column == $endcolumn) { // end column - $cborder = $border_end; - if (isset($this->columns[$column]['th']['\''.$page.'\''])) { - $this->y = $this->columns[$column]['th']['\''.$page.'\'']; - } - $this->x += $deltacol; - $h = $endy - $this->y; - } else { // middle column - $cborder = $border_middle; - if (isset($this->columns[$column]['th']['\''.$page.'\''])) { - $this->y = $this->columns[$column]['th']['\''.$page.'\'']; - } - $this->x += $deltacol; - $h = $this->h - $this->y - $this->bMargin; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } elseif ($page == $startpage) { // first page - $deltacol = 0; - $deltath = 0; - for ($column = $startcolumn; $column < $this->num_columns; ++$column) { // for each column - $this->selectColumn($column); - if ($column == $startcolumn) { // first column - $cborder = $border_start; - $this->y = $starty; - $this->x = $x; - $h = $this->h - $this->y - $this->bMargin; - if ($this->rtl) { - $deltacol = $this->x + $this->rMargin - $this->w; - } else { - $deltacol = $this->x - $this->lMargin; - } - } else { // middle column - $cborder = $border_middle; - if (isset($this->columns[$column]['th']['\''.$page.'\''])) { - $this->y = $this->columns[$column]['th']['\''.$page.'\'']; - } - $this->x += $deltacol; - $h = $this->h - $this->y - $this->bMargin; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } elseif ($page == $endpage) { // last page - $deltacol = 0; - $deltath = 0; - for ($column = 0; $column <= $endcolumn; ++$column) { // for each column - $this->selectColumn($column); - if ($column == $endcolumn) { // end column - $cborder = $border_end; - if (isset($this->columns[$column]['th']['\''.$page.'\''])) { - $this->y = $this->columns[$column]['th']['\''.$page.'\'']; - } - $this->x += $deltacol; - $h = $endy - $this->y; - } else { // middle column - $cborder = $border_middle; - if (isset($this->columns[$column]['th']['\''.$page.'\''])) { - $this->y = $this->columns[$column]['th']['\''.$page.'\'']; - } - $this->x += $deltacol; - $h = $this->h - $this->y - $this->bMargin; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } else { // middle page - $deltacol = 0; - $deltath = 0; - for ($column = 0; $column < $this->num_columns; ++$column) { // for each column - $this->selectColumn($column); - $cborder = $border_middle; - if (isset($this->columns[$column]['th']['\''.$page.'\''])) { - $this->y = $this->columns[$column]['th']['\''.$page.'\'']; - } - $this->x += $deltacol; - $h = $this->h - $this->y - $this->bMargin; - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } - if ($cborder OR $fill) { - // draw border and fill - if ($this->inxobj) { - // we are inside an XObject template - if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) { - $pagemarkkey = key($this->xobjects[$this->xobjid]['transfmrk']); - $pagemark = &$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey]; - } else { - $pagemark = &$this->xobjects[$this->xobjid]['intmrk']; - } - $pagebuff = $this->xobjects[$this->xobjid]['outdata']; - $pstart = substr($pagebuff, 0, $pagemark); - $pend = substr($pagebuff, $pagemark); - $this->xobjects[$this->xobjid]['outdata'] = $pstart.$ccode.$pend; - $pagemark += strlen($ccode); - } else { - // draw border and fill - if (end($this->transfmrk[$this->page]) !== false) { - $pagemarkkey = key($this->transfmrk[$this->page]); - $pagemark = &$this->transfmrk[$this->page][$pagemarkkey]; - } elseif ($this->InFooter) { - $pagemark = &$this->footerpos[$this->page]; - } else { - $pagemark = &$this->intmrk[$this->page]; - } - $pagebuff = $this->getPageBuffer($this->page); - $pstart = substr($pagebuff, 0, $pagemark); - $pend = substr($pagebuff, $pagemark); - $this->setPageBuffer($this->page, $pstart.$ccode.$pend); - $pagemark += strlen($ccode); - } - } - } // end for each page - // restore default border - $border = $default_border; - } // end for each cell on the row - if (isset($table_el['attribute']['cellspacing'])) { - $this->y += $this->getHTMLUnitToUnits($table_el['attribute']['cellspacing'], 1, 'px'); - } elseif (isset($table_el['border-spacing'])) { - $this->y += $table_el['border-spacing']['V']; - } - $this->Ln(0, $cell); - $this->x = $parent['startx']; - if ($endpage > $startpage) { - if (($this->rtl) AND ($this->pagedim[$endpage]['orm'] != $this->pagedim[$startpage]['orm'])) { - $this->x += ($this->pagedim[$endpage]['orm'] - $this->pagedim[$startpage]['orm']); - } elseif ((!$this->rtl) AND ($this->pagedim[$endpage]['olm'] != $this->pagedim[$startpage]['olm'])) { - $this->x += ($this->pagedim[$endpage]['olm'] - $this->pagedim[$startpage]['olm']); - } - } - } - if (!$in_table_head) { // we are not inside a thead section - $this->cell_padding = $table_el['old_cell_padding']; - // reset row height - $this->resetLastH(); - if (($this->page == ($this->numpages - 1)) AND ($this->pageopen[$this->numpages]) AND ($this->emptypagemrk[$this->numpages] == $this->pagelen[$this->numpages])) { - // remove last blank page - $this->deletePage($this->numpages); - } - if (isset($this->theadMargins['top'])) { - // restore top margin - $this->tMargin = $this->theadMargins['top']; - $this->pagedim[$this->page]['tm'] = $this->tMargin; - } - if (!isset($table_el['attribute']['nested']) OR ($table_el['attribute']['nested'] != 'true')) { - // reset main table header - $this->thead = ''; - $this->theadMargins = array(); - } - } - $parent = $table_el; - break; - } - case 'a': { - $this->HREF = ''; - break; - } - case 'sup': { - $this->SetXY($this->GetX(), $this->GetY() + ((0.7 * $parent['fontsize']) / $this->k)); - break; - } - case 'sub': { - $this->SetXY($this->GetX(), $this->GetY() - ((0.3 * $parent['fontsize'])/$this->k)); - break; - } - case 'div': { - $this->addHTMLVertSpace($hbz, 0, $cell, false, $lasttag); - break; - } - case 'blockquote': { - if ($this->rtl) { - $this->rMargin -= $this->listindent; - } else { - $this->lMargin -= $this->listindent; - } - --$this->listindentlevel; - $this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag); - break; - } - case 'p': { - $this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag); - break; - } - case 'pre': { - $this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag); - $this->premode = false; - break; - } - case 'dl': { - --$this->listnum; - if ($this->listnum <= 0) { - $this->listnum = 0; - $this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag); - } else { - $this->addHTMLVertSpace(0, 0, $cell, false, $lasttag); - } - $this->resetLastH(); - break; - } - case 'dt': { - $this->lispacer = ''; - $this->addHTMLVertSpace(0, 0, $cell, false, $lasttag); - break; - } - case 'dd': { - $this->lispacer = ''; - if ($this->rtl) { - $this->rMargin -= $this->listindent; - } else { - $this->lMargin -= $this->listindent; - } - --$this->listindentlevel; - $this->addHTMLVertSpace(0, 0, $cell, false, $lasttag); - break; - } - case 'ul': - case 'ol': { - --$this->listnum; - $this->lispacer = ''; - if ($this->rtl) { - $this->rMargin -= $this->listindent; - } else { - $this->lMargin -= $this->listindent; - } - --$this->listindentlevel; - if ($this->listnum <= 0) { - $this->listnum = 0; - $this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag); - } else { - $this->addHTMLVertSpace(0, 0, $cell, false, $lasttag); - } - $this->resetLastH(); - break; - } - case 'li': { - $this->lispacer = ''; - $this->addHTMLVertSpace(0, 0, $cell, false, $lasttag); - break; - } - case 'h1': - case 'h2': - case 'h3': - case 'h4': - case 'h5': - case 'h6': { - $this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag); - break; - } - // Form fields (since 4.8.000 - 2009-09-07) - case 'form': { - $this->form_action = ''; - $this->form_enctype = 'application/x-www-form-urlencoded'; - break; - } - default : { - break; - } - } - // draw border and background (if any) - $this->drawHTMLTagBorder($parent, $xmax); - if (isset($dom[($dom[$key]['parent'])]['attribute']['pagebreakafter'])) { - $pba = $dom[($dom[$key]['parent'])]['attribute']['pagebreakafter']; - // check for pagebreak - if (($pba == 'true') OR ($pba == 'left') OR ($pba == 'right')) { - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $this->checkPageBreak($this->PageBreakTrigger + 1); - } - if ((($pba == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0)))) - OR (($pba == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) { - // add a page (or trig AcceptPageBreak() for multicolumn mode) - $this->checkPageBreak($this->PageBreakTrigger + 1); - } - } - $this->tmprtl = false; - } - - /** - * Add vertical spaces if needed. - * @param string $hbz Distance between current y and line bottom. - * @param string $hb The height of the break. - * @param boolean $cell if true add the default left (or right if RTL) padding to each new line (default false). - * @param boolean $firsttag set to true when the tag is the first. - * @param boolean $lasttag set to true when the tag is the last. - * @access protected - */ - protected function addHTMLVertSpace($hbz=0, $hb=0, $cell=false, $firsttag=false, $lasttag=false) { - if ($firsttag) { - $this->Ln(0, $cell); - $this->htmlvspace = 0; - return; - } - if ($lasttag) { - $this->Ln($hbz, $cell); - $this->htmlvspace = 0; - return; - } - if ($hb < $this->htmlvspace) { - $hd = 0; - } else { - $hd = $hb - $this->htmlvspace; - $this->htmlvspace = $hb; - } - $this->Ln(($hbz + $hd), $cell); - } - - /** - * Return the starting coordinates to draw an html border - * @return array containing top-left border coordinates - * @access protected - * @since 5.7.000 (2010-08-03) - */ - protected function getBorderStartPosition() { - if ($this->rtl) { - $xmax = $this->lMargin; - } else { - $xmax = $this->w - $this->rMargin; - } - return array('page' => $this->page, 'column' => $this->current_column, 'x' => $this->x, 'y' => $this->y, 'xmax' => $xmax); - } - - /** - * Draw an HTML block border and fill - * @param array $tag array of tag properties. - * @param int $xmax end X coordinate for border. - * @access protected - * @since 5.7.000 (2010-08-03) - */ - protected function drawHTMLTagBorder($tag, $xmax) { - if (!isset($tag['borderposition'])) { - // nothing to draw - return; - } - $prev_x = $this->x; - $prev_y = $this->y; - $prev_lasth = $this->lasth; - $border = 0; - $fill = false; - $this->lasth = 0; - if (isset($tag['border']) AND !empty($tag['border'])) { - // get border style - $border = $tag['border']; - if (!$this->empty_string($this->thead) AND (!$this->inthead)) { - // border for table header - $border = $this->getBorderMode($border, $position='middle'); - } - } - if (isset($tag['bgcolor']) AND ($tag['bgcolor'] !== false)) { - // get background color - $old_bgcolor = $this->bgcolor; - $this->SetFillColorArray($tag['bgcolor']); - $fill = true; - } - if (!$border AND !$fill) { - // nothing to draw - return; - } - if (isset($tag['attribute']['cellspacing'])) { - $clsp = $this->getHTMLUnitToUnits($tag['attribute']['cellspacing'], 1, 'px'); - $cellspacing = array('H' => $clsp, 'V' => $clsp); - } elseif (isset($tag['border-spacing'])) { - $cellspacing = $tag['border-spacing']; - } else { - $cellspacing = array('H' => 0, 'V' => 0); - } - if (($tag['value'] != 'table') AND (is_array($border)) AND (!empty($border))) { - // draw the border externally respect the sqare edge. - $border['mode'] = 'ext'; - } - if ($this->rtl) { - if ($xmax >= $tag['borderposition']['x']) { - $xmax = $tag['borderposition']['xmax']; - } - $w = ($tag['borderposition']['x'] - $xmax); - } else { - if ($xmax <= $tag['borderposition']['x']) { - $xmax = $tag['borderposition']['xmax']; - } - $w = ($xmax - $tag['borderposition']['x']); - } - if ($w <= 0) { - return; - } - $w += $cellspacing['H']; - $startpage = $tag['borderposition']['page']; - $startcolumn = $tag['borderposition']['column']; - $x = $tag['borderposition']['x']; - $y = $tag['borderposition']['y']; - $endpage = $this->page; - $starty = $tag['borderposition']['y'] - $cellspacing['V']; - $currentY = $this->y; - $this->x = $x; - // get latest column - $endcolumn = $this->current_column; - if ($this->num_columns == 0) { - $this->num_columns = 1; - } - // get border modes - $border_start = $this->getBorderMode($border, $position='start'); - $border_end = $this->getBorderMode($border, $position='end'); - $border_middle = $this->getBorderMode($border, $position='middle'); - // design borders around HTML cells. - for ($page = $startpage; $page <= $endpage; ++$page) { // for each page - $ccode = ''; - $this->setPage($page); - if ($this->num_columns < 2) { - // single-column mode - $this->x = $x; - $this->y = $this->tMargin; - } - // account for margin changes - if ($page > $startpage) { - if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) { - $this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']); - } elseif ((!$this->rtl) AND ($this->pagedim[$page]['olm'] != $this->pagedim[$startpage]['olm'])) { - $this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']); - } - } - if ($startpage == $endpage) { - // single page - for ($column = $startcolumn; $column <= $endcolumn; ++$column) { // for each column - $this->selectColumn($column); - if ($startcolumn == $endcolumn) { // single column - $cborder = $border; - $h = ($currentY - $y) + $cellspacing['V']; - $this->y = $starty; - } elseif ($column == $startcolumn) { // first column - $cborder = $border_start; - $this->y = $starty; - $h = $this->h - $this->y - $this->bMargin; - } elseif ($column == $endcolumn) { // end column - $cborder = $border_end; - $h = $currentY - $this->y; - } else { // middle column - $cborder = $border_middle; - $h = $this->h - $this->y - $this->bMargin; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } elseif ($page == $startpage) { // first page - for ($column = $startcolumn; $column < $this->num_columns; ++$column) { // for each column - $this->selectColumn($column); - if ($column == $startcolumn) { // first column - $cborder = $border_start; - $this->y = $starty; - $h = $this->h - $this->y - $this->bMargin; - } else { // middle column - $cborder = $border_middle; - $h = $this->h - $this->y - $this->bMargin; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } elseif ($page == $endpage) { // last page - for ($column = 0; $column <= $endcolumn; ++$column) { // for each column - $this->selectColumn($column); - if ($column == $endcolumn) { - // end column - $cborder = $border_end; - $h = $currentY - $this->y; - } else { - // middle column - $cborder = $border_middle; - $h = $this->h - $this->y - $this->bMargin; - } - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } else { // middle page - for ($column = 0; $column < $this->num_columns; ++$column) { // for each column - $this->selectColumn($column); - $cborder = $border_middle; - $h = $this->h - $this->y - $this->bMargin; - $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n"; - } // end for each column - } - if ($cborder OR $fill) { - // draw border and fill - if ($this->inxobj) { - // we are inside an XObject template - if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) { - $pagemarkkey = key($this->xobjects[$this->xobjid]['transfmrk']); - $pagemark = &$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey]; - } else { - $pagemark = &$this->xobjects[$this->xobjid]['intmrk']; - } - $pagebuff = $this->xobjects[$this->xobjid]['outdata']; - $pstart = substr($pagebuff, 0, $pagemark); - $pend = substr($pagebuff, $pagemark); - $this->xobjects[$this->xobjid]['outdata'] = $pstart.$ccode.$pend; - $pagemark += strlen($ccode); - } else { - if (end($this->transfmrk[$this->page]) !== false) { - $pagemarkkey = key($this->transfmrk[$this->page]); - $pagemark = &$this->transfmrk[$this->page][$pagemarkkey]; - } elseif ($this->InFooter) { - $pagemark = &$this->footerpos[$this->page]; - } else { - $pagemark = &$this->intmrk[$this->page]; - } - $pagebuff = $this->getPageBuffer($this->page); - $pstart = substr($pagebuff, 0, $this->bordermrk[$this->page]); - $pend = substr($pagebuff, $this->bordermrk[$this->page]); - $this->setPageBuffer($this->page, $pstart.$ccode.$pend); - $offsetlen = strlen($ccode); - $this->bordermrk[$this->page] += $offsetlen; - $this->cntmrk[$this->page] += $offsetlen; - $pagemark += $offsetlen; - } - } - } // end for each page - if (isset($old_bgcolor)) { - // restore background color - $this->SetFillColorArray($old_bgcolor); - } - // restore pointer position - $this->x = $prev_x; - $this->y = $prev_y; - $this->lasth = $prev_lasth; - } - - /** - * Set the default bullet to be used as LI bullet symbol - * @param string $symbol character or string to be used (legal values are: '' = automatic, '!' = auto bullet, '#' = auto numbering, 'disc', 'disc', 'circle', 'square', '1', 'decimal', 'decimal-leading-zero', 'i', 'lower-roman', 'I', 'upper-roman', 'a', 'lower-alpha', 'lower-latin', 'A', 'upper-alpha', 'upper-latin', 'lower-greek') - * @access public - * @since 4.0.028 (2008-09-26) - */ - public function setLIsymbol($symbol='!') { - $symbol = strtolower($symbol); - switch ($symbol) { - case '!' : - case '#' : - case 'disc' : - case 'circle' : - case 'square' : - case '1': - case 'decimal': - case 'decimal-leading-zero': - case 'i': - case 'lower-roman': - case 'I': - case 'upper-roman': - case 'a': - case 'lower-alpha': - case 'lower-latin': - case 'A': - case 'upper-alpha': - case 'upper-latin': - case 'lower-greek': { - $this->lisymbol = $symbol; - break; - } - default : { - $this->lisymbol = ''; - } - } - } - - /** - * Set the booklet mode for double-sided pages. - * @param boolean $booklet true set the booklet mode on, false otherwise. - * @param float $inner Inner page margin. - * @param float $outer Outer page margin. - * @access public - * @since 4.2.000 (2008-10-29) - */ - public function SetBooklet($booklet=true, $inner=-1, $outer=-1) { - $this->booklet = $booklet; - if ($inner >= 0) { - $this->lMargin = $inner; - } - if ($outer >= 0) { - $this->rMargin = $outer; - } - } - - /** - * Swap the left and right margins. - * @param boolean $reverse if true swap left and right margins. - * @access protected - * @since 4.2.000 (2008-10-29) - */ - protected function swapMargins($reverse=true) { - if ($reverse) { - // swap left and right margins - $mtemp = $this->original_lMargin; - $this->original_lMargin = $this->original_rMargin; - $this->original_rMargin = $mtemp; - $deltam = $this->original_lMargin - $this->original_rMargin; - $this->lMargin += $deltam; - $this->rMargin -= $deltam; - } - } - - /** - * Set the vertical spaces for HTML tags. - * The array must have the following structure (example): - * $tagvs = array('h1' => array(0 => array('h' => '', 'n' => 2), 1 => array('h' => 1.3, 'n' => 1))); - * The first array level contains the tag names, - * the second level contains 0 for opening tags or 1 for closing tags, - * the third level contains the vertical space unit (h) and the number spaces to add (n). - * If the h parameter is not specified, default values are used. - * @param array $tagvs array of tags and relative vertical spaces. - * @access public - * @since 4.2.001 (2008-10-30) - */ - public function setHtmlVSpace($tagvs) { - $this->tagvspaces = $tagvs; - } - - /** - * Set custom width for list indentation. - * @param float $width width of the indentation. Use negative value to disable it. - * @access public - * @since 4.2.007 (2008-11-12) - */ - public function setListIndentWidth($width) { - return $this->customlistindent = floatval($width); - } - - /** - * Set the top/bottom cell sides to be open or closed when the cell cross the page. - * @param boolean $isopen if true keeps the top/bottom border open for the cell sides that cross the page. - * @access public - * @since 4.2.010 (2008-11-14) - */ - public function setOpenCell($isopen) { - $this->opencell = $isopen; - } - - /** - * Set the color and font style for HTML links. - * @param array $color RGB array of colors - * @param string $fontstyle additional font styles to add - * @access public - * @since 4.4.003 (2008-12-09) - */ - public function setHtmlLinksStyle($color=array(0,0,255), $fontstyle='U') { - $this->htmlLinkColorArray = $color; - $this->htmlLinkFontStyle = $fontstyle; - } - - /** - * Convert HTML string containing value and unit of measure to user's units or points. - * @param string $htmlval string containing values and unit - * @param string $refsize reference value in points - * @param string $defaultunit default unit (can be one of the following: %, em, ex, px, in, mm, pc, pt). - * @param boolean $point if true returns points, otherwise returns value in user's units - * @return float value in user's unit or point if $points=true - * @access public - * @since 4.4.004 (2008-12-10) - */ - public function getHTMLUnitToUnits($htmlval, $refsize=1, $defaultunit='px', $points=false) { - $supportedunits = array('%', 'em', 'ex', 'px', 'in', 'cm', 'mm', 'pc', 'pt'); - $retval = 0; - $value = 0; - $unit = 'px'; - $k = $this->k; - if ($points) { - $k = 1; - } - if (in_array($defaultunit, $supportedunits)) { - $unit = $defaultunit; - } - if (is_numeric($htmlval)) { - $value = floatval($htmlval); - } elseif (preg_match('/([0-9\.\-\+]+)/', $htmlval, $mnum)) { - $value = floatval($mnum[1]); - if (preg_match('/([a-z%]+)/', $htmlval, $munit)) { - if (in_array($munit[1], $supportedunits)) { - $unit = $munit[1]; - } - } - } - switch ($unit) { - // percentage - case '%': { - $retval = (($value * $refsize) / 100); - break; - } - // relative-size - case 'em': { - $retval = ($value * $refsize); - break; - } - // height of lower case 'x' (about half the font-size) - case 'ex': { - $retval = $value * ($refsize / 2); - break; - } - // absolute-size - case 'in': { - $retval = ($value * $this->dpi) / $k; - break; - } - // centimeters - case 'cm': { - $retval = ($value / 2.54 * $this->dpi) / $k; - break; - } - // millimeters - case 'mm': { - $retval = ($value / 25.4 * $this->dpi) / $k; - break; - } - // one pica is 12 points - case 'pc': { - $retval = ($value * 12) / $k; - break; - } - // points - case 'pt': { - $retval = $value / $k; - break; - } - // pixels - case 'px': { - $retval = $this->pixelsToUnits($value); - break; - } - } - return $retval; - } - - /** - * Returns the Roman representation of an integer number - * @param int number to convert - * @return string roman representation of the specified number - * @access public - * @since 4.4.004 (2008-12-10) - */ - public function intToRoman($number) { - $roman = ''; - while ($number >= 1000) { - $roman .= 'M'; - $number -= 1000; - } - while ($number >= 900) { - $roman .= 'CM'; - $number -= 900; - } - while ($number >= 500) { - $roman .= 'D'; - $number -= 500; - } - while ($number >= 400) { - $roman .= 'CD'; - $number -= 400; - } - while ($number >= 100) { - $roman .= 'C'; - $number -= 100; - } - while ($number >= 90) { - $roman .= 'XC'; - $number -= 90; - } - while ($number >= 50) { - $roman .= 'L'; - $number -= 50; - } - while ($number >= 40) { - $roman .= 'XL'; - $number -= 40; - } - while ($number >= 10) { - $roman .= 'X'; - $number -= 10; - } - while ($number >= 9) { - $roman .= 'IX'; - $number -= 9; - } - while ($number >= 5) { - $roman .= 'V'; - $number -= 5; - } - while ($number >= 4) { - $roman .= 'IV'; - $number -= 4; - } - while ($number >= 1) { - $roman .= 'I'; - --$number; - } - return $roman; - } - - /** - * Output an HTML list bullet or ordered item symbol - * @param int $listdepth list nesting level - * @param string $listtype type of list - * @param float $size current font size - * @access protected - * @since 4.4.004 (2008-12-10) - */ - protected function putHtmlListBullet($listdepth, $listtype='', $size=10) { - $size /= $this->k; - $fill = ''; - $color = $this->fgcolor; - $width = 0; - $textitem = ''; - $tmpx = $this->x; - $lspace = $this->GetStringWidth(' '); - if ($listtype == '^') { - // special symbol used for avoid justification of rect bullet - $this->lispacer = ''; - return; - } elseif ($listtype == '!') { - // set default list type for unordered list - $deftypes = array('disc', 'circle', 'square'); - $listtype = $deftypes[($listdepth - 1) % 3]; - } elseif ($listtype == '#') { - // set default list type for ordered list - $listtype = 'decimal'; - } - switch ($listtype) { - // unordered types - case 'none': { - break; - } - case 'disc': { - $fill = 'F'; - } - case 'circle': { - $fill .= 'D'; - $r = $size / 6; - $lspace += (2 * $r); - if ($this->rtl) { - $this->x += $lspace; - } else { - $this->x -= $lspace; - } - $this->Circle(($this->x + $r), ($this->y + ($this->lasth / 2)), $r, 0, 360, $fill, array('color'=>$color), $color, 8); - break; - } - case 'square': { - $l = $size / 3; - $lspace += $l; - if ($this->rtl) {; - $this->x += $lspace; - } else { - $this->x -= $lspace; - } - $this->Rect($this->x, ($this->y + (($this->lasth - $l)/ 2)), $l, $l, 'F', array(), $color); - break; - } - // ordered types - // $this->listcount[$this->listnum]; - // $textitem - case '1': - case 'decimal': { - $textitem = $this->listcount[$this->listnum]; - break; - } - case 'decimal-leading-zero': { - $textitem = sprintf('%02d', $this->listcount[$this->listnum]); - break; - } - case 'i': - case 'lower-roman': { - $textitem = strtolower($this->intToRoman($this->listcount[$this->listnum])); - break; - } - case 'I': - case 'upper-roman': { - $textitem = $this->intToRoman($this->listcount[$this->listnum]); - break; - } - case 'a': - case 'lower-alpha': - case 'lower-latin': { - $textitem = chr(97 + $this->listcount[$this->listnum] - 1); - break; - } - case 'A': - case 'upper-alpha': - case 'upper-latin': { - $textitem = chr(65 + $this->listcount[$this->listnum] - 1); - break; - } - case 'lower-greek': { - $textitem = $this->unichr(945 + $this->listcount[$this->listnum] - 1); - break; - } - /* - // Types to be implemented (special handling) - case 'hebrew': { - break; - } - case 'armenian': { - break; - } - case 'georgian': { - break; - } - case 'cjk-ideographic': { - break; - } - case 'hiragana': { - break; - } - case 'katakana': { - break; - } - case 'hiragana-iroha': { - break; - } - case 'katakana-iroha': { - break; - } - */ - default: { - $textitem = $this->listcount[$this->listnum]; - } - } - if (!$this->empty_string($textitem)) { - // print ordered item - if ($this->rtl) { - $textitem = '.'.$textitem; - } else { - $textitem = $textitem.'.'; - } - $lspace += $this->GetStringWidth($textitem); - if ($this->rtl) { - $this->x += $lspace; - } else { - $this->x -= $lspace; - } - $this->Write($this->lasth, $textitem, '', false, '', false, 0, false); - } - $this->x = $tmpx; - $this->lispacer = '^'; - } - - /** - * Returns current graphic variables as array. - * @return array of graphic variables - * @access protected - * @since 4.2.010 (2008-11-14) - */ - protected function getGraphicVars() { - $grapvars = array( - 'FontFamily' => $this->FontFamily, - 'FontStyle' => $this->FontStyle, - 'FontSizePt' => $this->FontSizePt, - 'rMargin' => $this->rMargin, - 'lMargin' => $this->lMargin, - 'cell_padding' => $this->cell_padding, - 'cell_margin' => $this->cell_margin, - 'LineWidth' => $this->LineWidth, - 'linestyleWidth' => $this->linestyleWidth, - 'linestyleCap' => $this->linestyleCap, - 'linestyleJoin' => $this->linestyleJoin, - 'linestyleDash' => $this->linestyleDash, - 'textrendermode' => $this->textrendermode, - 'textstrokewidth' => $this->textstrokewidth, - 'DrawColor' => $this->DrawColor, - 'FillColor' => $this->FillColor, - 'TextColor' => $this->TextColor, - 'ColorFlag' => $this->ColorFlag, - 'bgcolor' => $this->bgcolor, - 'fgcolor' => $this->fgcolor, - 'htmlvspace' => $this->htmlvspace, - 'listindent' => $this->listindent, - 'listindentlevel' => $this->listindentlevel, - 'listnum' => $this->listnum, - 'listordered' => $this->listordered, - 'listcount' => $this->listcount, - 'lispacer' => $this->lispacer, - 'cell_height_ratio' => $this->cell_height_ratio, - 'font_stretching' => $this->font_stretching, - 'font_spacing' => $this->font_spacing, - // extended - 'lasth' => $this->lasth, - 'tMargin' => $this->tMargin, - 'bMargin' => $this->bMargin, - 'AutoPageBreak' => $this->AutoPageBreak, - 'PageBreakTrigger' => $this->PageBreakTrigger, - 'x' => $this->x, - 'y' => $this->y, - 'w' => $this->w, - 'h' => $this->h, - 'wPt' => $this->wPt, - 'hPt' => $this->hPt, - 'fwPt' => $this->fwPt, - 'fhPt' => $this->fhPt, - 'page' => $this->page, - 'current_column' => $this->current_column, - 'num_columns' => $this->num_columns - ); - return $grapvars; - } - - /** - * Set graphic variables. - * @param array $gvars array of graphic variablesto restore - * @param boolean $extended if true restore extended graphic variables - * @access protected - * @since 4.2.010 (2008-11-14) - */ - protected function setGraphicVars($gvars, $extended=false) { - $this->FontFamily = $gvars['FontFamily']; - $this->FontStyle = $gvars['FontStyle']; - $this->FontSizePt = $gvars['FontSizePt']; - $this->rMargin = $gvars['rMargin']; - $this->lMargin = $gvars['lMargin']; - $this->cell_padding = $gvars['cell_padding']; - $this->cell_margin = $gvars['cell_margin']; - $this->LineWidth = $gvars['LineWidth']; - $this->linestyleWidth = $gvars['linestyleWidth']; - $this->linestyleCap = $gvars['linestyleCap']; - $this->linestyleJoin = $gvars['linestyleJoin']; - $this->linestyleDash = $gvars['linestyleDash']; - $this->textrendermode = $gvars['textrendermode']; - $this->textstrokewidth = $gvars['textstrokewidth']; - $this->DrawColor = $gvars['DrawColor']; - $this->FillColor = $gvars['FillColor']; - $this->TextColor = $gvars['TextColor']; - $this->ColorFlag = $gvars['ColorFlag']; - $this->bgcolor = $gvars['bgcolor']; - $this->fgcolor = $gvars['fgcolor']; - $this->htmlvspace = $gvars['htmlvspace']; - $this->listindent = $gvars['listindent']; - $this->listindentlevel = $gvars['listindentlevel']; - $this->listnum = $gvars['listnum']; - $this->listordered = $gvars['listordered']; - $this->listcount = $gvars['listcount']; - $this->lispacer = $gvars['lispacer']; - $this->cell_height_ratio = $gvars['cell_height_ratio']; - $this->font_stretching = $gvars['font_stretching']; - $this->font_spacing = $gvars['font_spacing']; - if ($extended) { - // restore extended values - $this->lasth = $gvars['lasth']; - $this->tMargin = $gvars['tMargin']; - $this->bMargin = $gvars['bMargin']; - $this->AutoPageBreak = $gvars['AutoPageBreak']; - $this->PageBreakTrigger = $gvars['PageBreakTrigger']; - $this->x = $gvars['x']; - $this->y = $gvars['y']; - $this->w = $gvars['w']; - $this->h = $gvars['h']; - $this->wPt = $gvars['wPt']; - $this->hPt = $gvars['hPt']; - $this->fwPt = $gvars['fwPt']; - $this->fhPt = $gvars['fhPt']; - $this->page = $gvars['page']; - $this->current_column = $gvars['current_column']; - $this->num_columns = $gvars['num_columns']; - } - $this->_out(''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor.''); - if (!$this->empty_string($this->FontFamily)) { - $this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt); - } - } - - /** - * Returns a temporary filename for caching object on filesystem. - * @param string $prefix prefix to add to filename - * return string filename. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected function getObjFilename($name) { - return tempnam(K_PATH_CACHE, $name.'_'); - } - - /** - * Writes data to a temporary file on filesystem. - * @param string $file file name - * @param mixed $data data to write on file - * @param boolean $append if true append data, false replace. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected function writeDiskCache($filename, $data, $append=false) { - if ($append) { - $fmode = 'ab+'; - } else { - $fmode = 'wb+'; - } - $f = @fopen($filename, $fmode); - if (!$f) { - $this->Error('Unable to write cache file: '.$filename); - } else { - fwrite($f, $data); - fclose($f); - } - // update file length (needed for transactions) - if (!isset($this->cache_file_length['_'.$filename])) { - $this->cache_file_length['_'.$filename] = strlen($data); - } else { - $this->cache_file_length['_'.$filename] += strlen($data); - } - } - - /** - * Read data from a temporary file on filesystem. - * @param string $file file name - * @return mixed retrieved data - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected function readDiskCache($filename) { - return file_get_contents($filename); - } - - /** - * Set buffer content (always append data). - * @param string $data data - * @access protected - * @since 4.5.000 (2009-01-02) - */ - protected function setBuffer($data) { - $this->bufferlen += strlen($data); - if ($this->diskcache) { - if (!isset($this->buffer) OR $this->empty_string($this->buffer)) { - $this->buffer = $this->getObjFilename('buffer'); - } - $this->writeDiskCache($this->buffer, $data, true); - } else { - $this->buffer .= $data; - } - } - - /** - * Replace the buffer content - * @param string $data data - * @access protected - * @since 5.5.000 (2010-06-22) - */ - protected function replaceBuffer($data) { - $this->bufferlen = strlen($data); - if ($this->diskcache) { - if (!isset($this->buffer) OR $this->empty_string($this->buffer)) { - $this->buffer = $this->getObjFilename('buffer'); - } - $this->writeDiskCache($this->buffer, $data, false); - } else { - $this->buffer = $data; - } - } - - /** - * Get buffer content. - * @return string buffer content - * @access protected - * @since 4.5.000 (2009-01-02) - */ - protected function getBuffer() { - if ($this->diskcache) { - return $this->readDiskCache($this->buffer); - } else { - return $this->buffer; - } - } - - /** - * Set page buffer content. - * @param int $page page number - * @param string $data page data - * @param boolean $append if true append data, false replace. - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected function setPageBuffer($page, $data, $append=false) { - if ($this->diskcache) { - if (!isset($this->pages[$page])) { - $this->pages[$page] = $this->getObjFilename('page'.$page); - } - $this->writeDiskCache($this->pages[$page], $data, $append); - } else { - if ($append) { - $this->pages[$page] .= $data; - } else { - $this->pages[$page] = $data; - } - } - if ($append AND isset($this->pagelen[$page])) { - $this->pagelen[$page] += strlen($data); - } else { - $this->pagelen[$page] = strlen($data); - } - } - - /** - * Get page buffer content. - * @param int $page page number - * @return string page buffer content or false in case of error - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected function getPageBuffer($page) { - if ($this->diskcache) { - return $this->readDiskCache($this->pages[$page]); - } elseif (isset($this->pages[$page])) { - return $this->pages[$page]; - } - return false; - } - - /** - * Set image buffer content. - * @param string $image image key - * @param array $data image data - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected function setImageBuffer($image, $data) { - if ($this->diskcache) { - if (!isset($this->images[$image])) { - $this->images[$image] = $this->getObjFilename('image'.$image); - } - $this->writeDiskCache($this->images[$image], serialize($data)); - } else { - $this->images[$image] = $data; - } - if (!in_array($image, $this->imagekeys)) { - $this->imagekeys[] = $image; - ++$this->numimages; - } - } - - /** - * Set image buffer content for a specified sub-key. - * @param string $image image key - * @param string $key image sub-key - * @param array $data image data - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected function setImageSubBuffer($image, $key, $data) { - if (!isset($this->images[$image])) { - $this->setImageBuffer($image, array()); - } - if ($this->diskcache) { - $tmpimg = $this->getImageBuffer($image); - $tmpimg[$key] = $data; - $this->writeDiskCache($this->images[$image], serialize($tmpimg)); - } else { - $this->images[$image][$key] = $data; - } - } - - /** - * Get image buffer content. - * @param string $image image key - * @return string image buffer content or false in case of error - * @access protected - * @since 4.5.000 (2008-12-31) - */ - protected function getImageBuffer($image) { - if ($this->diskcache AND isset($this->images[$image])) { - return unserialize($this->readDiskCache($this->images[$image])); - } elseif (isset($this->images[$image])) { - return $this->images[$image]; - } - return false; - } - - /** - * Set font buffer content. - * @param string $font font key - * @param array $data font data - * @access protected - * @since 4.5.000 (2009-01-02) - */ - protected function setFontBuffer($font, $data) { - if ($this->diskcache) { - if (!isset($this->fonts[$font])) { - $this->fonts[$font] = $this->getObjFilename('font'); - } - $this->writeDiskCache($this->fonts[$font], serialize($data)); - } else { - $this->fonts[$font] = $data; - } - if (!in_array($font, $this->fontkeys)) { - $this->fontkeys[] = $font; - // store object ID for current font - ++$this->n; - $this->font_obj_ids[$font] = $this->n; - $this->setFontSubBuffer($font, 'n', $this->n); - } - } - - /** - * Set font buffer content. - * @param string $font font key - * @param string $key font sub-key - * @param array $data font data - * @access protected - * @since 4.5.000 (2009-01-02) - */ - protected function setFontSubBuffer($font, $key, $data) { - if (!isset($this->fonts[$font])) { - $this->setFontBuffer($font, array()); - } - if ($this->diskcache) { - $tmpfont = $this->getFontBuffer($font); - $tmpfont[$key] = $data; - $this->writeDiskCache($this->fonts[$font], serialize($tmpfont)); - } else { - $this->fonts[$font][$key] = $data; - } - } - - /** - * Get font buffer content. - * @param string $font font key - * @return string font buffer content or false in case of error - * @access protected - * @since 4.5.000 (2009-01-02) - */ - protected function getFontBuffer($font) { - if ($this->diskcache AND isset($this->fonts[$font])) { - return unserialize($this->readDiskCache($this->fonts[$font])); - } elseif (isset($this->fonts[$font])) { - return $this->fonts[$font]; - } - return false; - } - - /** - * Move a page to a previous position. - * @param int $frompage number of the source page - * @param int $topage number of the destination page (must be less than $frompage) - * @return true in case of success, false in case of error. - * @access public - * @since 4.5.000 (2009-01-02) - */ - public function movePage($frompage, $topage) { - if (($frompage > $this->numpages) OR ($frompage <= $topage)) { - return false; - } - if ($frompage == $this->page) { - // close the page before moving it - $this->endPage(); - } - // move all page-related states - $tmppage = $this->pages[$frompage]; - $tmppagedim = $this->pagedim[$frompage]; - $tmppagelen = $this->pagelen[$frompage]; - $tmpintmrk = $this->intmrk[$frompage]; - $tmpbordermrk = $this->bordermrk[$frompage]; - $tmpcntmrk = $this->cntmrk[$frompage]; - if (isset($this->footerpos[$frompage])) { - $tmpfooterpos = $this->footerpos[$frompage]; - } - if (isset($this->footerlen[$frompage])) { - $tmpfooterlen = $this->footerlen[$frompage]; - } - if (isset($this->transfmrk[$frompage])) { - $tmptransfmrk = $this->transfmrk[$frompage]; - } - if (isset($this->PageAnnots[$frompage])) { - $tmpannots = $this->PageAnnots[$frompage]; - } - if (isset($this->newpagegroup[$frompage])) { - $tmpnewpagegroup = $this->newpagegroup[$frompage]; - } - for ($i = $frompage; $i > $topage; --$i) { - $j = $i - 1; - // shift pages down - $this->pages[$i] = $this->pages[$j]; - $this->pagedim[$i] = $this->pagedim[$j]; - $this->pagelen[$i] = $this->pagelen[$j]; - $this->intmrk[$i] = $this->intmrk[$j]; - $this->bordermrk[$i] = $this->bordermrk[$j]; - $this->cntmrk[$i] = $this->cntmrk[$j]; - if (isset($this->footerpos[$j])) { - $this->footerpos[$i] = $this->footerpos[$j]; - } elseif (isset($this->footerpos[$i])) { - unset($this->footerpos[$i]); - } - if (isset($this->footerlen[$j])) { - $this->footerlen[$i] = $this->footerlen[$j]; - } elseif (isset($this->footerlen[$i])) { - unset($this->footerlen[$i]); - } - if (isset($this->transfmrk[$j])) { - $this->transfmrk[$i] = $this->transfmrk[$j]; - } elseif (isset($this->transfmrk[$i])) { - unset($this->transfmrk[$i]); - } - if (isset($this->PageAnnots[$j])) { - $this->PageAnnots[$i] = $this->PageAnnots[$j]; - } elseif (isset($this->PageAnnots[$i])) { - unset($this->PageAnnots[$i]); - } - if (isset($this->newpagegroup[$j])) { - $this->newpagegroup[$i] = $this->newpagegroup[$j]; - } elseif (isset($this->newpagegroup[$i])) { - unset($this->newpagegroup[$i]); - } - } - $this->pages[$topage] = $tmppage; - $this->pagedim[$topage] = $tmppagedim; - $this->pagelen[$topage] = $tmppagelen; - $this->intmrk[$topage] = $tmpintmrk; - $this->bordermrk[$topage] = $tmpbordermrk; - $this->cntmrk[$topage] = $tmpcntmrk; - if (isset($tmpfooterpos)) { - $this->footerpos[$topage] = $tmpfooterpos; - } elseif (isset($this->footerpos[$topage])) { - unset($this->footerpos[$topage]); - } - if (isset($tmpfooterlen)) { - $this->footerlen[$topage] = $tmpfooterlen; - } elseif (isset($this->footerlen[$topage])) { - unset($this->footerlen[$topage]); - } - if (isset($tmptransfmrk)) { - $this->transfmrk[$topage] = $tmptransfmrk; - } elseif (isset($this->transfmrk[$topage])) { - unset($this->transfmrk[$topage]); - } - if (isset($tmpannots)) { - $this->PageAnnots[$topage] = $tmpannots; - } elseif (isset($this->PageAnnots[$topage])) { - unset($this->PageAnnots[$topage]); - } - if (isset($tmpnewpagegroup)) { - $this->newpagegroup[$topage] = $tmpnewpagegroup; - } elseif (isset($this->newpagegroup[$topage])) { - unset($this->newpagegroup[$topage]); - } - // adjust outlines - $tmpoutlines = $this->outlines; - foreach ($tmpoutlines as $key => $outline) { - if (($outline['p'] >= $topage) AND ($outline['p'] < $frompage)) { - $this->outlines[$key]['p'] = $outline['p'] + 1; - } elseif ($outline['p'] == $frompage) { - $this->outlines[$key]['p'] = $topage; - } - } - // adjust links - $tmplinks = $this->links; - foreach ($tmplinks as $key => $link) { - if (($link[0] >= $topage) AND ($link[0] < $frompage)) { - $this->links[$key][0] = $link[0] + 1; - } elseif ($link[0] == $frompage) { - $this->links[$key][0] = $topage; - } - } - // adjust javascript - $tmpjavascript = $this->javascript; - global $jfrompage, $jtopage; - $jfrompage = $frompage; - $jtopage = $topage; - $this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/', - create_function('$matches', 'global $jfrompage, $jtopage; - $pagenum = intval($matches[3]) + 1; - if (($pagenum >= $jtopage) AND ($pagenum < $jfrompage)) { - $newpage = ($pagenum + 1); - } elseif ($pagenum == $jfrompage) { - $newpage = $jtopage; - } else { - $newpage = $pagenum; - } - --$newpage; - return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript); - // return to last page - $this->lastPage(true); - return true; - } - - /** - * Remove the specified page. - * @param int $page page to remove - * @return true in case of success, false in case of error. - * @access public - * @since 4.6.004 (2009-04-23) - */ - public function deletePage($page) { - if (($page < 1) OR ($page > $this->numpages)) { - return false; - } - // delete current page - unset($this->pages[$page]); - unset($this->pagedim[$page]); - unset($this->pagelen[$page]); - unset($this->intmrk[$page]); - unset($this->bordermrk[$page]); - unset($this->cntmrk[$page]); - if (isset($this->footerpos[$page])) { - unset($this->footerpos[$page]); - } - if (isset($this->footerlen[$page])) { - unset($this->footerlen[$page]); - } - if (isset($this->transfmrk[$page])) { - unset($this->transfmrk[$page]); - } - if (isset($this->PageAnnots[$page])) { - unset($this->PageAnnots[$page]); - } - if (isset($this->newpagegroup[$page])) { - unset($this->newpagegroup[$page]); - } - if (isset($this->pageopen[$page])) { - unset($this->pageopen[$page]); - } - // update remaining pages - for ($i = $page; $i < $this->numpages; ++$i) { - $j = $i + 1; - // shift pages - $this->pages[$i] = $this->pages[$j]; - $this->pagedim[$i] = $this->pagedim[$j]; - $this->pagelen[$i] = $this->pagelen[$j]; - $this->intmrk[$i] = $this->intmrk[$j]; - $this->bordermrk[$i] = $this->bordermrk[$j]; - $this->cntmrk[$i] = $this->cntmrk[$j]; - if (isset($this->footerpos[$j])) { - $this->footerpos[$i] = $this->footerpos[$j]; - } elseif (isset($this->footerpos[$i])) { - unset($this->footerpos[$i]); - } - if (isset($this->footerlen[$j])) { - $this->footerlen[$i] = $this->footerlen[$j]; - } elseif (isset($this->footerlen[$i])) { - unset($this->footerlen[$i]); - } - if (isset($this->transfmrk[$j])) { - $this->transfmrk[$i] = $this->transfmrk[$j]; - } elseif (isset($this->transfmrk[$i])) { - unset($this->transfmrk[$i]); - } - if (isset($this->PageAnnots[$j])) { - $this->PageAnnots[$i] = $this->PageAnnots[$j]; - } elseif (isset($this->PageAnnots[$i])) { - unset($this->PageAnnots[$i]); - } - if (isset($this->newpagegroup[$j])) { - $this->newpagegroup[$i] = $this->newpagegroup[$j]; - } elseif (isset($this->newpagegroup[$i])) { - unset($this->newpagegroup[$i]); - } - if (isset($this->pageopen[$j])) { - $this->pageopen[$i] = $this->pageopen[$j]; - } elseif (isset($this->pageopen[$i])) { - unset($this->pageopen[$i]); - } - } - // remove last page - unset($this->pages[$this->numpages]); - unset($this->pagedim[$this->numpages]); - unset($this->pagelen[$this->numpages]); - unset($this->intmrk[$this->numpages]); - unset($this->bordermrk[$this->numpages]); - unset($this->cntmrk[$this->numpages]); - if (isset($this->footerpos[$this->numpages])) { - unset($this->footerpos[$this->numpages]); - } - if (isset($this->footerlen[$this->numpages])) { - unset($this->footerlen[$this->numpages]); - } - if (isset($this->transfmrk[$this->numpages])) { - unset($this->transfmrk[$this->numpages]); - } - if (isset($this->PageAnnots[$this->numpages])) { - unset($this->PageAnnots[$this->numpages]); - } - if (isset($this->newpagegroup[$this->numpages])) { - unset($this->newpagegroup[$this->numpages]); - } - if (isset($this->pageopen[$this->numpages])) { - unset($this->pageopen[$this->numpages]); - } - --$this->numpages; - $this->page = $this->numpages; - // adjust outlines - $tmpoutlines = $this->outlines; - foreach ($tmpoutlines as $key => $outline) { - if ($outline['p'] > $page) { - $this->outlines[$key]['p'] = $outline['p'] - 1; - } elseif ($outline['p'] == $page) { - unset($this->outlines[$key]); - } - } - // adjust links - $tmplinks = $this->links; - foreach ($tmplinks as $key => $link) { - if ($link[0] > $page) { - $this->links[$key][0] = $link[0] - 1; - } elseif ($link[0] == $page) { - unset($this->links[$key]); - } - } - // adjust javascript - $tmpjavascript = $this->javascript; - global $jpage; - $jpage = $page; - $this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/', - create_function('$matches', 'global $jpage; - $pagenum = intval($matches[3]) + 1; - if ($pagenum >= $jpage) { - $newpage = ($pagenum - 1); - } elseif ($pagenum == $jpage) { - $newpage = 1; - } else { - $newpage = $pagenum; - } - --$newpage; - return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript); - // return to last page - $this->lastPage(true); - return true; - } - - /** - * Clone the specified page to a new page. - * @param int $page number of page to copy (0 = current page) - * @return true in case of success, false in case of error. - * @access public - * @since 4.9.015 (2010-04-20) - */ - public function copyPage($page=0) { - if ($page == 0) { - // default value - $page = $this->page; - } - if (($page < 1) OR ($page > $this->numpages)) { - return false; - } - if ($page == $this->page) { - // close the page before cloning it - $this->endPage(); - } - // copy all page-related states - ++$this->numpages; - $this->page = $this->numpages; - $this->pages[$this->page] = $this->pages[$page]; - $this->pagedim[$this->page] = $this->pagedim[$page]; - $this->pagelen[$this->page] = $this->pagelen[$page]; - $this->intmrk[$this->page] = $this->intmrk[$page]; - $this->bordermrk[$this->page] = $this->bordermrk[$page]; - $this->cntmrk[$this->page] = $this->cntmrk[$page]; - $this->pageopen[$this->page] = false; - if (isset($this->footerpos[$page])) { - $this->footerpos[$this->page] = $this->footerpos[$page]; - } - if (isset($this->footerlen[$page])) { - $this->footerlen[$this->page] = $this->footerlen[$page]; - } - if (isset($this->transfmrk[$page])) { - $this->transfmrk[$this->page] = $this->transfmrk[$page]; - } - if (isset($this->PageAnnots[$page])) { - $this->PageAnnots[$this->page] = $this->PageAnnots[$page]; - } - if (isset($this->newpagegroup[$page])) { - $this->newpagegroup[$this->page] = $this->newpagegroup[$page]; - } - // copy outlines - $tmpoutlines = $this->outlines; - foreach ($tmpoutlines as $key => $outline) { - if ($outline['p'] == $page) { - $this->outlines[] = array('t' => $outline['t'], 'l' => $outline['l'], 'y' => $outline['y'], 'p' => $this->page); - } - } - // copy links - $tmplinks = $this->links; - foreach ($tmplinks as $key => $link) { - if ($link[0] == $page) { - $this->links[] = array($this->page, $link[1]); - } - } - // return to last page - $this->lastPage(true); - return true; - } - - /** - * Output a Table of Content Index (TOC). - * Before calling this method you have to open the page using the addTOCPage() method. - * After calling this method you have to call endTOCPage() to close the TOC page. - * You can override this method to achieve different styles. - * @param int $page page number where this TOC should be inserted (leave empty for current page). - * @param string $numbersfont set the font for page numbers (please use monospaced font for better alignment). - * @param string $filler string used to fill the space between text and page number. - * @param string $toc_name name to use for TOC bookmark. - * @access public - * @author Nicola Asuni - * @since 4.5.000 (2009-01-02) - * @see addTOCPage(), endTOCPage(), addHTMLTOC() - */ - public function addTOC($page='', $numbersfont='', $filler='.', $toc_name='TOC') { - $fontsize = $this->FontSizePt; - $fontfamily = $this->FontFamily; - $fontstyle = $this->FontStyle; - $w = $this->w - $this->lMargin - $this->rMargin; - $spacer = $this->GetStringWidth(chr(32)) * 4; - $page_first = $this->getPage(); - $lmargin = $this->lMargin; - $rmargin = $this->rMargin; - $x_start = $this->GetX(); - $current_page = $this->page; - $current_column = $this->current_column; - if ($this->empty_string($numbersfont)) { - $numbersfont = $this->default_monospaced_font; - } - if ($this->empty_string($filler)) { - $filler = ' '; - } - if ($this->empty_string($page)) { - $gap = ' '; - } else { - $gap = ''; - if ($page < 1) { - $page = 1; - } - } - foreach ($this->outlines as $key => $outline) { - if ($this->rtl) { - $aligntext = 'R'; - $alignnum = 'L'; - } else { - $aligntext = 'L'; - $alignnum = 'R'; - } - if ($outline['l'] == 0) { - $this->SetFont($fontfamily, $fontstyle.'B', $fontsize); - } else { - $this->SetFont($fontfamily, $fontstyle, $fontsize - $outline['l']); - } - // check for page break - $this->checkPageBreak(($this->FontSize * $this->cell_height_ratio)); - // set margins and X position - if (($this->page == $current_page) AND ($this->current_column == $current_column)) { - $this->lMargin = $lmargin; - $this->rMargin = $rmargin; - } else { - if ($this->current_column != $current_column) { - if ($this->rtl) { - $x_start = $this->w - $this->columns[$this->current_column]['x']; - } else { - $x_start = $this->columns[$this->current_column]['x']; - } - } - $lmargin = $this->lMargin; - $rmargin = $this->rMargin; - $current_page = $this->page; - $current_column = $this->current_column; - } - $this->SetX($x_start); - $indent = ($spacer * $outline['l']); - if ($this->rtl) { - $this->rMargin += $indent; - $this->x -= $indent; - } else { - $this->lMargin += $indent; - $this->x += $indent; - } - $link = $this->AddLink(); - $this->SetLink($link, $outline['y'], $outline['p']); - // write the text - $this->Write(0, $outline['t'], $link, 0, $aligntext, false, 0, false, false, 0); - $this->SetFont($numbersfont, $fontstyle, $fontsize); - if ($this->empty_string($page)) { - $pagenum = $outline['p']; - } else { - // placemark to be replaced with the correct number - $pagenum = '{#'.($outline['p']).'}'; - if ($this->isUnicodeFont()) { - $pagenum = '{'.$pagenum.'}'; - } - } - $numwidth = $this->GetStringWidth($pagenum); - if ($this->rtl) { - $tw = $this->x - $this->lMargin; - } else { - $tw = $this->w - $this->rMargin - $this->x; - } - $fw = $tw - $numwidth - $this->GetStringWidth(chr(32)); - $numfills = floor($fw / $this->GetStringWidth($filler)); - if ($numfills > 0) { - $rowfill = str_repeat($filler, $numfills); - } else { - $rowfill = ''; - } - if ($this->rtl) { - $pagenum = $pagenum.$gap.$rowfill.' '; - } else { - $pagenum = ' '.$rowfill.$gap.$pagenum; - } - // write the number - $this->Cell($tw, 0, $pagenum, 0, 1, $alignnum, 0, $link, 0); - } - $page_last = $this->getPage(); - $numpages = $page_last - $page_first + 1; - if (!$this->empty_string($page)) { - for ($p = $page_first; $p <= $page_last; ++$p) { - // get page data - $temppage = $this->getPageBuffer($p); - for ($n = 1; $n <= $this->numpages; ++$n) { - // update page numbers - $k = '{#'.$n.'}'; - $ku = '{'.$k.'}'; - $alias_a = $this->_escape($k); - $alias_au = $this->_escape($ku); - if ($this->isunicode) { - $alias_b = $this->_escape($this->UTF8ToLatin1($k)); - $alias_bu = $this->_escape($this->UTF8ToLatin1($ku)); - $alias_c = $this->_escape($this->utf8StrRev($k, false, $this->tmprtl)); - $alias_cu = $this->_escape($this->utf8StrRev($ku, false, $this->tmprtl)); - } - if ($n >= $page) { - $np = $n + $numpages; - } else { - $np = $n; - } - $ns = $this->formatTOCPageNumber($np); - $nu = $ns; - $sdiff = strlen($k) - strlen($ns) - 1; - $sdiffu = strlen($ku) - strlen($ns) - 1; - $sfill = str_repeat($filler, $sdiff); - $sfillu = str_repeat($filler, $sdiffu); - if ($this->rtl) { - $ns = $ns.' '.$sfill; - $nu = $nu.' '.$sfillu; - } else { - $ns = $sfill.' '.$ns; - $nu = $sfillu.' '.$nu; - } - $nu = $this->UTF8ToUTF16BE($nu, false); - $temppage = str_replace($alias_au, $nu, $temppage); - if ($this->isunicode) { - $temppage = str_replace($alias_bu, $nu, $temppage); - $temppage = str_replace($alias_cu, $nu, $temppage); - $temppage = str_replace($alias_b, $ns, $temppage); - $temppage = str_replace($alias_c, $ns, $temppage); - } - $temppage = str_replace($alias_a, $ns, $temppage); - } - // save changes - $this->setPageBuffer($p, $temppage); - } - // move pages - $this->Bookmark($toc_name, 0, 0, $page_first); - for ($i = 0; $i < $numpages; ++$i) { - $this->movePage($page_last, $page); - } - } - } - - /** - * Output a Table Of Content Index (TOC) using HTML templates. - * Before calling this method you have to open the page using the addTOCPage() method. - * After calling this method you have to call endTOCPage() to close the TOC page. - * @param int $page page number where this TOC should be inserted (leave empty for current page). - * @param string $toc_name name to use for TOC bookmark. - * @param array $templates array of html templates. Use: #TOC_DESCRIPTION# for bookmark title, #TOC_PAGE_NUMBER# for page number. - * @param boolean $correct_align if true correct the number alignment (numbers must be in monospaced font like courier and right aligned on LTR, or left aligned on RTL) - * @access public - * @author Nicola Asuni - * @since 5.0.001 (2010-05-06) - * @see addTOCPage(), endTOCPage(), addTOC() - */ - public function addHTMLTOC($page='', $toc_name='TOC', $templates=array(), $correct_align=true) { - $prev_htmlLinkColorArray = $this->htmlLinkColorArray; - $prev_htmlLinkFontStyle = $this->htmlLinkFontStyle; - // set new style for link - $this->htmlLinkColorArray = array(); - $this->htmlLinkFontStyle = ''; - $page_first = $this->getPage(); - // get the font type used for numbers in each template - $current_font = $this->FontFamily; - foreach ($templates as $level => $html) { - $dom = $this->getHtmlDomArray($html); - foreach ($dom as $key => $value) { - if ($value['value'] == '#TOC_PAGE_NUMBER#') { - $this->SetFont($dom[($key - 1)]['fontname']); - $templates['F'.$level] = $this->isUnicodeFont(); - } - } - } - $this->SetFont($current_font); - foreach ($this->outlines as $key => $outline) { - // get HTML template - $row = $templates[$outline['l']]; - if ($this->empty_string($page)) { - $pagenum = $outline['p']; - } else { - // placemark to be replaced with the correct number - $pagenum = '{#'.($outline['p']).'}'; - if ($templates['F'.$outline['l']]) { - $pagenum = '{'.$pagenum.'}'; - } - } - // replace templates with current values - $row = str_replace('#TOC_DESCRIPTION#', $outline['t'], $row); - $row = str_replace('#TOC_PAGE_NUMBER#', $pagenum, $row); - // add link to page - $row = ''.$row.''; - // write bookmark entry - $this->writeHTML($row, false, false, true, false, ''); - } - // restore link styles - $this->htmlLinkColorArray = $prev_htmlLinkColorArray; - $this->htmlLinkFontStyle = $prev_htmlLinkFontStyle; - // move TOC page and replace numbers - $page_last = $this->getPage(); - $numpages = $page_last - $page_first + 1; - if (!$this->empty_string($page)) { - for ($p = $page_first; $p <= $page_last; ++$p) { - // get page data - $temppage = $this->getPageBuffer($p); - for ($n = 1; $n <= $this->numpages; ++$n) { - // update page numbers - $k = '{#'.$n.'}'; - $ku = '{'.$k.'}'; - $alias_a = $this->_escape($k); - $alias_au = $this->_escape('{'.$k.'}'); - if ($this->isunicode) { - $alias_b = $this->_escape($this->UTF8ToLatin1($k)); - $alias_bu = $this->_escape($this->UTF8ToLatin1($ku)); - $alias_c = $this->_escape($this->utf8StrRev($k, false, $this->tmprtl)); - $alias_cu = $this->_escape($this->utf8StrRev($ku, false, $this->tmprtl)); - } - if ($n >= $page) { - $np = $n + $numpages; - } else { - $np = $n; - } - $ns = $this->formatTOCPageNumber($np); - $nu = $ns; - if ($correct_align) { - $sdiff = strlen($k) - strlen($ns); - $sdiffu = strlen($ku) - strlen($ns); - $sfill = str_repeat(' ', $sdiff); - $sfillu = str_repeat(' ', $sdiffu); - if ($this->rtl) { - $ns = $ns.$sfill; - $nu = $nu.$sfillu; - } else { - $ns = $sfill.$ns; - $nu = $sfillu.$nu; - } - } - $nu = $this->UTF8ToUTF16BE($nu, false); - $temppage = str_replace($alias_au, $nu, $temppage); - if ($this->isunicode) { - $temppage = str_replace($alias_bu, $nu, $temppage); - $temppage = str_replace($alias_cu, $nu, $temppage); - $temppage = str_replace($alias_b, $ns, $temppage); - $temppage = str_replace($alias_c, $ns, $temppage); - } - $temppage = str_replace($alias_a, $ns, $temppage); - } - // save changes - $this->setPageBuffer($p, $temppage); - } - // move pages - $this->Bookmark($toc_name, 0, 0, $page_first); - for ($i = 0; $i < $numpages; ++$i) { - $this->movePage($page_last, $page); - } - } - } - - /** - * Stores a copy of the current TCPDF object used for undo operation. - * @access public - * @since 4.5.029 (2009-03-19) - */ - public function startTransaction() { - if (isset($this->objcopy)) { - // remove previous copy - $this->commitTransaction(); - } - // record current page number and Y position - $this->start_transaction_page = $this->page; - $this->start_transaction_y = $this->y; - // clone current object - $this->objcopy = $this->objclone($this); - } - - /** - * Delete the copy of the current TCPDF object used for undo operation. - * @access public - * @since 4.5.029 (2009-03-19) - */ - public function commitTransaction() { - if (isset($this->objcopy)) { - $this->objcopy->_destroy(true, true); - unset($this->objcopy); - } - } - - /** - * This method allows to undo the latest transaction by returning the latest saved TCPDF object with startTransaction(). - * @param boolean $self if true restores current class object to previous state without the need of reassignment via the returned value. - * @return TCPDF object. - * @access public - * @since 4.5.029 (2009-03-19) - */ - public function rollbackTransaction($self=false) { - if (isset($this->objcopy)) { - if (isset($this->objcopy->diskcache) AND $this->objcopy->diskcache) { - // truncate files to previous values - foreach ($this->objcopy->cache_file_length as $file => $length) { - $file = substr($file, 1); - $handle = fopen($file, 'r+'); - ftruncate($handle, $length); - } - } - $this->_destroy(true, true); - if ($self) { - $objvars = get_object_vars($this->objcopy); - foreach ($objvars as $key => $value) { - $this->$key = $value; - } - } - return $this->objcopy; - } - return $this; - } - - /** - * Creates a copy of a class object - * @param object $object class object to be cloned - * @return cloned object - * @access public - * @since 4.5.029 (2009-03-19) - */ - public function objclone($object) { - return @clone($object); - } - - /** - * Determine whether a string is empty. - * @param string $str string to be checked - * @return boolean true if string is empty - * @access public - * @since 4.5.044 (2009-04-16) - */ - public function empty_string($str) { - return (is_null($str) OR (is_string($str) AND (strlen($str) == 0))); - } - - /** - * Find position of last occurrence of a substring in a string - * @param string $haystack The string to search in. - * @param string $needle substring to search. - * @param int $offset May be specified to begin searching an arbitrary number of characters into the string. - * @return Returns the position where the needle exists. Returns FALSE if the needle was not found. - * @access public - * @since 4.8.038 (2010-03-13) - */ - public function revstrpos($haystack, $needle, $offset = 0) { - $length = strlen($haystack); - $offset = ($offset > 0)?($length - $offset):abs($offset); - $pos = strpos(strrev($haystack), strrev($needle), $offset); - return ($pos === false)?false:($length - $pos - strlen($needle)); - } - - // --- MULTI COLUMNS METHODS ----------------------- - - /** - * Set multiple columns of the same size - * @param int $numcols number of columns (set to zero to disable columns mode) - * @param int $width column width - * @param int $y column starting Y position (leave empty for current Y position) - * @access public - * @since 4.9.001 (2010-03-28) - */ - public function setEqualColumns($numcols=0, $width=0, $y='') { - $this->columns = array(); - if ($numcols < 2) { - $numcols = 0; - $this->columns = array(); - } else { - // maximum column width - $maxwidth = ($this->w - $this->original_lMargin - $this->original_rMargin) / $numcols; - if (($width == 0) OR ($width > $maxwidth)) { - $width = $maxwidth; - } - if ($this->empty_string($y)) { - $y = $this->y; - } - // space between columns - $space = (($this->w - $this->original_lMargin - $this->original_rMargin - ($numcols * $width)) / ($numcols - 1)); - // fill the columns array (with, space, starting Y position) - for ($i = 0; $i < $numcols; ++$i) { - $this->columns[$i] = array('w' => $width, 's' => $space, 'y' => $y); - } - } - $this->num_columns = $numcols; - $this->current_column = 0; - $this->column_start_page = $this->page; - } - - /** - * Set columns array. - * Each column is represented by and array with the following keys: (w = width, s = space between columns, y = column top position). - * @param array $columns - * @access public - * @since 4.9.001 (2010-03-28) - */ - public function setColumnsArray($columns) { - $this->columns = $columns; - $this->num_columns = count($columns); - $this->current_column = 0; - $this->column_start_page = $this->page; - } - - /** - * Set position at a given column - * @param int $col column number (from 0 to getNumberOfColumns()-1); empty string = current column. - * @access public - * @since 4.9.001 (2010-03-28) - */ - public function selectColumn($col='') { - if (is_string($col)) { - $col = $this->current_column; - } elseif($col >= $this->num_columns) { - $col = 0; - } - $xshift = 0; - $enable_thead = false; - if ($this->num_columns > 1) { - if ($col != $this->current_column) { - // move Y pointer at the top of the column - if ($this->column_start_page == $this->page) { - $this->y = $this->columns[$col]['y']; - } else { - $this->y = $this->tMargin; - } - // Avoid to write table headers more than once - if (($this->page > $this->maxselcol['page']) OR (($this->page == $this->maxselcol['page']) AND ($col > $this->maxselcol['column']))) { - $enable_thead = true; - $this->maxselcol['page'] = $this->page; - $this->maxselcol['column'] = $col; - } - } - $xshift = $this->colxshift; - // set X position of the current column by case - $listindent = ($this->listindentlevel * $this->listindent); - $colpos = ($col * ($this->columns[$col]['w'] + $this->columns[$col]['s'])); - if ($this->rtl) { - $x = $this->w - $this->original_rMargin - $colpos; - $this->rMargin = ($this->w - $x + $listindent); - $this->lMargin = ($x - $this->columns[$col]['w']); - $this->x = $x - $listindent; - } else { - $x = $this->original_lMargin + $colpos; - $this->lMargin = ($x + $listindent); - $this->rMargin = ($this->w - $x - $this->columns[$col]['w']); - $this->x = $x + $listindent; - } - $this->columns[$col]['x'] = $x; - } - $this->current_column = $col; - // fix for HTML mode - $this->newline = true; - // print HTML table header (if any) - if ((!$this->empty_string($this->thead)) AND (!$this->inthead)) { - if ($enable_thead) { - // print table header - $this->writeHTML($this->thead, false, false, false, false, ''); - $this->y += $xshift['s']['V']; - // store end of header position - if (!isset($this->columns[$col]['th'])) { - $this->columns[$col]['th'] = array(); - } - $this->columns[$col]['th']['\''.$this->page.'\''] = $this->y; - $this->lasth = 0; - } elseif (isset($this->columns[$col]['th']['\''.$this->page.'\''])) { - $this->y = $this->columns[$col]['th']['\''.$this->page.'\'']; - } - } - // account for an html table cell over multiple columns - if ($this->rtl) { - $this->rMargin += $xshift['x']; - $this->x -= ($xshift['x'] + $xshift['p']['R']); - } else { - $this->lMargin += $xshift['x']; - $this->x += $xshift['x'] + $xshift['p']['L']; - } - } - - /** - * Return the current column number - * @return int current column number - * @access public - * @since 5.5.011 (2010-07-08) - */ - public function getColumn() { - return $this->current_column; - } - - /** - * Return the current number of columns. - * @return int number of columns - * @access public - * @since 5.8.018 (2010-08-25) - */ - public function getNumberOfColumns() { - return $this->num_columns; - } - - /** - * Serialize an array of parameters to be used with TCPDF tag in HTML code. - * @param array $pararray parameters array - * @return sting containing serialized data - * @access public - * @since 4.9.006 (2010-04-02) - */ - public function serializeTCPDFtagParameters($pararray) { - return urlencode(serialize($pararray)); - } - - /** - * Set Text rendering mode. - * @param int $stroke outline size in user units (0 = disable). - * @param boolean $fill if true fills the text (default). - * @param boolean $clip if true activate clipping mode - * @access public - * @since 4.9.008 (2009-04-02) - */ - public function setTextRenderingMode($stroke=0, $fill=true, $clip=false) { - // Ref.: PDF 32000-1:2008 - 9.3.6 Text Rendering Mode - // convert text rendering parameters - if ($stroke < 0) { - $stroke = 0; - } - if ($fill === true) { - if ($stroke > 0) { - if ($clip === true) { - // Fill, then stroke text and add to path for clipping - $textrendermode = 6; - } else { - // Fill, then stroke text - $textrendermode = 2; - } - $textstrokewidth = $stroke; - } else { - if ($clip === true) { - // Fill text and add to path for clipping - $textrendermode = 4; - } else { - // Fill text - $textrendermode = 0; - } - } - } else { - if ($stroke > 0) { - if ($clip === true) { - // Stroke text and add to path for clipping - $textrendermode = 5; - } else { - // Stroke text - $textrendermode = 1; - } - $textstrokewidth = $stroke; - } else { - if ($clip === true) { - // Add text to path for clipping - $textrendermode = 7; - } else { - // Neither fill nor stroke text (invisible) - $textrendermode = 3; - } - } - } - $this->textrendermode = $textrendermode; - $this->textstrokewidth = $stroke * $this->k; - } - - /** - * Returns an array of chars containing soft hyphens. - * @param array $word array of chars - * @param array $patterns Array of hypenation patterns. - * @param array $dictionary Array of words to be returned without applying the hyphenation algoritm. - * @param int $leftmin Minimum number of character to leave on the left of the word without applying the hyphens. - * @param int $rightmin Minimum number of character to leave on the right of the word without applying the hyphens. - * @param int $charmin Minimum word lenght to apply the hyphenation algoritm. - * @param int $charmax Maximum lenght of broken piece of word. - * @return array text with soft hyphens - * @author Nicola Asuni - * @since 4.9.012 (2010-04-12) - * @access protected - */ - protected function hyphenateWord($word, $patterns, $dictionary=array(), $leftmin=1, $rightmin=2, $charmin=1, $charmax=8) { - $hyphenword = array(); // hyphens positions - $numchars = count($word); - if ($numchars <= $charmin) { - return $word; - } - $word_string = $this->UTF8ArrSubString($word); - // some words will be returned as-is - $pattern = '/^([a-zA-Z0-9_\.\-]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/'; - if (preg_match($pattern, $word_string) > 0) { - // email - return $word; - } - $pattern = '/(([a-zA-Z0-9\-]+\.)?)((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/'; - if (preg_match($pattern, $word_string) > 0) { - // URL - return $word; - } - if (isset($dictionary[$word_string])) { - return $this->UTF8StringToArray($dictionary[$word_string]); - } - // suround word with '_' characters - $tmpword = array_merge(array(95), $word, array(95)); - $tmpnumchars = $numchars + 2; - $maxpos = $tmpnumchars - $charmin; - for ($pos = 0; $pos < $maxpos; ++$pos) { - $imax = min(($tmpnumchars - $pos), $charmax); - for ($i = $charmin; $i <= $imax; ++$i) { - $subword = strtolower($this->UTF8ArrSubString($tmpword, $pos, $pos + $i)); - if (isset($patterns[$subword])) { - $pattern = $this->UTF8StringToArray($patterns[$subword]); - $pattern_length = count($pattern); - $digits = 1; - for ($j = 0; $j < $pattern_length; ++$j) { - // check if $pattern[$j] is a number - if (($pattern[$j] >= 48) AND ($pattern[$j] <= 57)) { - if ($j == 0) { - $zero = $pos - 1; - } else { - $zero = $pos + $j - $digits; - } - if (!isset($hyphenword[$zero]) OR ($hyphenword[$zero] != $pattern[$j])) { - $hyphenword[$zero] = $this->unichr($pattern[$j]); - } - ++$digits; - } - } - } - } - } - $inserted = 0; - $maxpos = $numchars - $rightmin; - for($i = $leftmin; $i <= $maxpos; ++$i) { - if(isset($hyphenword[$i]) AND (($hyphenword[$i] % 2) != 0)) { - // 173 = soft hyphen character - array_splice($word, $i + $inserted, 0, 173); - ++$inserted; - } - } - return $word; - } - - /** - * Returns an array of hyphenation patterns. - * @param string $file TEX file containing hypenation patterns. TEX pattrns can be downloaded from http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/ - * @return array of hyphenation patterns - * @author Nicola Asuni - * @since 4.9.012 (2010-04-12) - * @access public - */ - public function getHyphenPatternsFromTEX($file) { - // TEX patterns are available at: - // http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/ - $data = file_get_contents($file); - $patterns = array(); - // remove comments - $data = preg_replace('/\%[^\n]*/', '', $data); - // extract the patterns part - preg_match('/\\\\patterns\{([^\}]*)\}/i', $data, $matches); - $data = trim(substr($matches[0], 10, -1)); - // extract each pattern - $patterns_array = preg_split('/[\s]+/', $data); - // create new language array of patterns - $patterns = array(); - foreach($patterns_array as $val) { - if (!$this->empty_string($val)) { - $val = trim($val); - $val = str_replace('\'', '\\\'', $val); - $key = preg_replace('/[0-9]+/', '', $val); - $patterns[$key] = $val; - } - } - return $patterns; - } - - /** - * Returns text with soft hyphens. - * @param string $text text to process - * @param mixed $patterns Array of hypenation patterns or a TEX file containing hypenation patterns. TEX patterns can be downloaded from http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/ - * @param array $dictionary Array of words to be returned without applying the hyphenation algoritm. - * @param int $leftmin Minimum number of character to leave on the left of the word without applying the hyphens. - * @param int $rightmin Minimum number of character to leave on the right of the word without applying the hyphens. - * @param int $charmin Minimum word lenght to apply the hyphenation algoritm. - * @param int $charmax Maximum lenght of broken piece of word. - * @return array text with soft hyphens - * @author Nicola Asuni - * @since 4.9.012 (2010-04-12) - * @access public - */ - public function hyphenateText($text, $patterns, $dictionary=array(), $leftmin=1, $rightmin=2, $charmin=1, $charmax=8) { - $text = $this->unhtmlentities($text); - $word = array(); // last word - $txtarr = array(); // text to be returned - $intag = false; // true if we are inside an HTML tag - if (!is_array($patterns)) { - $patterns = $this->getHyphenPatternsFromTEX($patterns); - } - // get array of characters - $unichars = $this->UTF8StringToArray($text); - // for each char - foreach ($unichars as $char) { - if ((!$intag) AND $this->unicode->uni_type[$char] == 'L') { - // letter character - $word[] = $char; - } else { - // other type of character - if (!$this->empty_string($word)) { - // hypenate the word - $txtarr = array_merge($txtarr, $this->hyphenateWord($word, $patterns, $dictionary, $leftmin, $rightmin, $charmin, $charmax)); - $word = array(); - } - $txtarr[] = $char; - if (chr($char) == '<') { - // we are inside an HTML tag - $intag = true; - } elseif ($intag AND (chr($char) == '>')) { - // end of HTML tag - $intag = false; - } - } - } - if (!$this->empty_string($word)) { - // hypenate the word - $txtarr = array_merge($txtarr, $this->hyphenateWord($word, $patterns, $dictionary, $leftmin, $rightmin, $charmin, $charmax)); - } - // convert char array to string and return - return $this->UTF8ArrSubString($txtarr); - } - - /** - * Enable/disable rasterization of vector images using ImageMagick library. - * @param boolean $mode if true enable rasterization, false otherwise. - * @access public - * @since 5.0.000 (2010-04-27) - */ - public function setRasterizeVectorImages($mode) { - $this->rasterize_vector_images = $mode; - } - - /** - * Get the Path-Painting Operators. - * @param string $style Style of rendering. Possible values are: - *
        - *
      • S or D: Stroke the path.
      • - *
      • s or d: Close and stroke the path.
      • - *
      • f or F: Fill the path, using the nonzero winding number rule to determine the region to fill.
      • - *
      • f* or F*: Fill the path, using the even-odd rule to determine the region to fill.
      • - *
      • B or FD or DF: Fill and then stroke the path, using the nonzero winding number rule to determine the region to fill.
      • - *
      • B* or F*D or DF*: Fill and then stroke the path, using the even-odd rule to determine the region to fill.
      • - *
      • b or fd or df: Close, fill, and then stroke the path, using the nonzero winding number rule to determine the region to fill.
      • - *
      • b or f*d or df*: Close, fill, and then stroke the path, using the even-odd rule to determine the region to fill.
      • - *
      • CNZ: Clipping mode using the even-odd rule to determine which regions lie inside the clipping path.
      • - *
      • CEO: Clipping mode using the nonzero winding number rule to determine which regions lie inside the clipping path
      • - *
      • n: End the path object without filling or stroking it.
      • - *
      - * @param string $default default style - * @param boolean $mode if true enable rasterization, false otherwise. - * @author Nicola Asuni - * @access protected - * @since 5.0.000 (2010-04-30) - */ - protected function getPathPaintOperator($style, $default='S') { - $op = ''; - switch($style) { - case 'S': - case 'D': { - $op = 'S'; - break; - } - case 's': - case 'd': { - $op = 's'; - break; - } - case 'f': - case 'F': { - $op = 'f'; - break; - } - case 'f*': - case 'F*': { - $op = 'f*'; - break; - } - case 'B': - case 'FD': - case 'DF': { - $op = 'B'; - break; - } - case 'B*': - case 'F*D': - case 'DF*': { - $op = 'B*'; - break; - } - case 'b': - case 'fd': - case 'df': { - $op = 'b'; - break; - } - case 'b*': - case 'f*d': - case 'df*': { - $op = 'b*'; - break; - } - case 'CNZ': { - $op = 'W n'; - break; - } - case 'CEO': { - $op = 'W* n'; - break; - } - case 'n': { - $op = 'n'; - break; - } - default: { - if (!empty($default)) { - $op = $this->getPathPaintOperator($default, ''); - } else { - $op = ''; - } - } - } - return $op; - } - - /** - * Enable or disable default option for font subsetting. - * @param boolean $enable if true enable font subsetting by default. - * @author Nicola Asuni - * @access public - * @since 5.3.002 (2010-06-07) - */ - public function setFontSubsetting($enable=true) { - $this->font_subsetting = $enable ? true : false; - } - - /** - * Return the default option for font subsetting. - * @return boolean default font subsetting state. - * @author Nicola Asuni - * @access public - * @since 5.3.002 (2010-06-07) - */ - public function getFontSubsetting() { - return $this->font_subsetting; - } - - /** - * Left trim the input string - * @param string $str string to trim - * @param string $replace string that replace spaces. - * @return left trimmed string - * @author Nicola Asuni - * @access public - * @since 5.8.000 (2010-08-11) - */ - public function stringLeftTrim($str, $replace='') { - return preg_replace('/^'.$this->re_space['p'].'+/'.$this->re_space['m'], $replace, $str); - } - - /** - * Right trim the input string - * @param string $str string to trim - * @param string $replace string that replace spaces. - * @return right trimmed string - * @author Nicola Asuni - * @access public - * @since 5.8.000 (2010-08-11) - */ - public function stringRightTrim($str, $replace='') { - return preg_replace('/'.$this->re_space['p'].'+$/'.$this->re_space['m'], $replace, $str); - } - - /** - * Trim the input string - * @param string $str string to trim - * @param string $replace string that replace spaces. - * @return trimmed string - * @author Nicola Asuni - * @access public - * @since 5.8.000 (2010-08-11) - */ - public function stringTrim($str, $replace='') { - $str = $this->stringLeftTrim($str, $replace); - $str = $this->stringRightTrim($str, $replace); - return $str; - } - - /** - * Return true if the current font is unicode type. - * @return true for unicode font, false otherwise. - * @author Nicola Asuni - * @access public - * @since 5.8.002 (2010-08-14) - */ - public function isUnicodeFont() { - return (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')); - } - - /** - * Return normalized font name - * @param string $fontfamily property string containing font family names - * @return string normalized font name - * @author Nicola Asuni - * @access public - * @since 5.8.004 (2010-08-17) - */ - public function getFontFamilyName($fontfamily) { - // remove spaces and symbols - $fontfamily = preg_replace('/[^a-z0-9\,]/', '', strtolower($fontfamily)); - // extract all font names - $fontslist = preg_split('/[,]/', $fontfamily); - // find first valid font name - foreach ($fontslist as $font) { - // replace font variations - $font = preg_replace('/italic$/', 'I', $font); - $font = preg_replace('/oblique$/', 'I', $font); - $font = preg_replace('/bold([I]?)$/', 'B\\1', $font); - // replace common family names and core fonts - $pattern = array(); - $replacement = array(); - $pattern[] = '/^serif|^cursive|^fantasy|^timesnewroman/'; - $replacement[] = 'times'; - $pattern[] = '/^sansserif/'; - $replacement[] = 'helvetica'; - $pattern[] = '/^monospace/'; - $replacement[] = 'courier'; - $font = preg_replace($pattern, $replacement, $font); - if (in_array(strtolower($font), $this->fontlist) OR in_array($font, $this->fontkeys)) { - return $font; - } - } - // return current font as default - return $this->CurrentFont['fontkey']; - } - - /** - * Start a new XObject Template. - * An XObject Template is a PDF block that is a self-contained description of any sequence of graphics objects (including path objects, text objects, and sampled images). - * An XObject Template may be painted multiple times, either on several pages or at several locations on the same page and produces the same results each time, subject only to the graphics state at the time it is invoked. - * Note: X,Y coordinates will be reset to 0,0. - * @param int $w Template width in user units (empty string or zero = page width less margins) - * @param int $h Template height in user units (empty string or zero = page height less margins) - * @return int the XObject Template ID in case of success or false in case of error. - * @author Nicola Asuni - * @access public - * @since 5.8.017 (2010-08-24) - * @see endTemplate(), printTemplate() - */ - public function startTemplate($w=0, $h=0) { - if ($this->inxobj) { - // we are already inside an XObject template - return false; - } - $this->inxobj = true; - ++$this->n; - // XObject ID - $this->xobjid = 'XT'.$this->n; - // object ID - $this->xobjects[$this->xobjid] = array('n' => $this->n); - // store current graphic state - $this->xobjects[$this->xobjid]['gvars'] = $this->getGraphicVars(); - // initialize data - $this->xobjects[$this->xobjid]['intmrk'] = 0; - $this->xobjects[$this->xobjid]['transfmrk'] = array(); - $this->xobjects[$this->xobjid]['outdata'] = ''; - $this->xobjects[$this->xobjid]['xobjects'] = array(); - $this->xobjects[$this->xobjid]['images'] = array(); - $this->xobjects[$this->xobjid]['fonts'] = array(); - $this->xobjects[$this->xobjid]['annotations'] = array(); - // set new environment - $this->num_columns = 1; - $this->current_column = 0; - $this->SetAutoPageBreak(false); - if (($w === '') OR ($w <= 0)) { - $w = $this->w - $this->lMargin - $this->rMargin; - } - if (($h === '') OR ($h <= 0)) { - $h = $this->h - $this->tMargin - $this->bMargin; - } - $this->xobjects[$this->xobjid]['x'] = 0; - $this->xobjects[$this->xobjid]['y'] = 0; - $this->xobjects[$this->xobjid]['w'] = $w; - $this->xobjects[$this->xobjid]['h'] = $h; - $this->w = $w; - $this->h = $h; - $this->wPt = $this->w * $this->k; - $this->hPt = $this->h * $this->k; - $this->fwPt = $this->wPt; - $this->fhPt = $this->hPt; - $this->x = 0; - $this->y = 0; - $this->lMargin = 0; - $this->rMargin = 0; - $this->tMargin = 0; - $this->bMargin = 0; - return $this->xobjid; - } - - /** - * End the current XObject Template started with startTemplate() and restore the previous graphic state. - * An XObject Template is a PDF block that is a self-contained description of any sequence of graphics objects (including path objects, text objects, and sampled images). - * An XObject Template may be painted multiple times, either on several pages or at several locations on the same page and produces the same results each time, subject only to the graphics state at the time it is invoked. - * @return int the XObject Template ID in case of success or false in case of error. - * @author Nicola Asuni - * @access public - * @since 5.8.017 (2010-08-24) - * @see startTemplate(), printTemplate() - */ - public function endTemplate() { - if (!$this->inxobj) { - // we are not inside a template - return false; - } - $this->inxobj = false; - // restore previous graphic state - $this->setGraphicVars($this->xobjects[$this->xobjid]['gvars'], true); - return $this->xobjid; - } - - /** - * Print an XObject Template. - * You can print an XObject Template inside the currently opened Template. - * An XObject Template is a PDF block that is a self-contained description of any sequence of graphics objects (including path objects, text objects, and sampled images). - * An XObject Template may be painted multiple times, either on several pages or at several locations on the same page and produces the same results each time, subject only to the graphics state at the time it is invoked. - * @param string $id The ID of XObject Template to print. - * @param int $x X position in user units (empty string = current x position) - * @param int $y Y position in user units (empty string = current y position) - * @param int $w Width in user units (zero = remaining page width) - * @param int $h Height in user units (zero = remaining page height) - * @param string $align Indicates the alignment of the pointer next to template insertion relative to template height. The value can be:
      • T: top-right for LTR or top-left for RTL
      • M: middle-right for LTR or middle-left for RTL
      • B: bottom-right for LTR or bottom-left for RTL
      • N: next line
      - * @param string $palign Allows to center or align the template on the current line. Possible values are:
      • L : left align
      • C : center
      • R : right align
      • '' : empty string : left for LTR or right for RTL
      - * @param boolean $fitonpage if true the template is resized to not exceed page dimensions. - * @author Nicola Asuni - * @access public - * @since 5.8.017 (2010-08-24) - * @see startTemplate(), endTemplate() - */ - public function printTemplate($id, $x='', $y='', $w=0, $h=0, $align='', $palign='', $fitonpage=false) { - if (!isset($this->xobjects[$id])) { - $this->Error('The XObject Template \''.$id.'\' doesn\'t exist!'); - } - if ($this->inxobj) { - if ($id == $this->xobjid) { - // close current template - $this->endTemplate(); - } else { - // use the template as resource for the template currently opened - $this->xobjects[$this->xobjid]['xobjects'][$id] = $this->xobjects[$id]; - } - } - // set default values - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($h, $x, $y); - $ow = $this->xobjects[$id]['w']; - $oh = $this->xobjects[$id]['h']; - // calculate template width and height on document - if (($w <= 0) AND ($h <= 0)) { - $w = $ow; - $h = $oh; - } elseif ($w <= 0) { - $w = $h * $ow / $oh; - } elseif ($h <= 0) { - $h = $w * $oh / $ow; - } - // fit the template on available space - $this->fitBlock($w, $h, $x, $y, $fitonpage); - // set page alignment - $rb_y = $y + $h; - // set alignment - if ($this->rtl) { - if ($palign == 'L') { - $xt = $this->lMargin; - } elseif ($palign == 'C') { - $xt = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($palign == 'R') { - $xt = $this->w - $this->rMargin - $w; - } else { - $xt = $x - $w; - } - $rb_x = $xt; - } else { - if ($palign == 'L') { - $xt = $this->lMargin; - } elseif ($palign == 'C') { - $xt = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($palign == 'R') { - $xt = $this->w - $this->rMargin - $w; - } else { - $xt = $x; - } - $rb_x = $xt + $w; - } - // print XObject Template + Transformation matrix - $this->StartTransform(); - // translate and scale - $sx = ($w / $this->xobjects[$id]['w']); - $sy = ($h / $this->xobjects[$id]['h']); - $tm = array(); - $tm[0] = $sx; - $tm[1] = 0; - $tm[2] = 0; - $tm[3] = $sy; - $tm[4] = $xt * $this->k; - $tm[5] = ($this->h - $h - $y) * $this->k; - $this->Transform($tm); - // set object - $this->_out('/'.$id.' Do'); - $this->StopTransform(); - // add annotations - if (!empty($this->xobjects[$id]['annotations'])) { - foreach ($this->xobjects[$id]['annotations'] as $annot) { - // transform original coordinates - $coordlt = $this->getTransformationMatrixProduct($tm, array(1, 0, 0, 1, ($annot['x'] * $this->k), (-$annot['y'] * $this->k))); - $ax = ($coordlt[4] / $this->k); - $ay = ($this->h - $h - ($coordlt[5] / $this->k)); - $coordrb = $this->getTransformationMatrixProduct($tm, array(1, 0, 0, 1, (($annot['x'] + $annot['w']) * $this->k), ((-$annot['y'] - $annot['h']) * $this->k))); - $aw = ($coordrb[4] / $this->k) - $ax; - $ah = ($this->h - $h - ($coordrb[5] / $this->k)) - $ay; - $this->Annotation($ax, $ay, $aw, $ah, $annot['text'], $annot['opt'], $annot['spaces']); - } - } - // set pointer to align the next text/objects - switch($align) { - case 'T': { - $this->y = $y; - $this->x = $rb_x; - break; - } - case 'M': { - $this->y = $y + round($h/2); - $this->x = $rb_x; - break; - } - case 'B': { - $this->y = $rb_y; - $this->x = $rb_x; - break; - } - case 'N': { - $this->SetY($rb_y); - break; - } - default:{ - break; - } - } - } - - /** - * Set the percentage of character stretching. - * @param int $perc percentage of stretching (100 = no stretching) - * @author Nicola Asuni - * @access public - * @since 5.9.000 (2010-09-29) - */ - public function setFontStretching($perc=100) { - $this->font_stretching = $perc; - } - - /** - * Get the percentage of character stretching. - * @return float stretching value - * @author Nicola Asuni - * @access public - * @since 5.9.000 (2010-09-29) - */ - public function getFontStretching() { - return $this->font_stretching; - } - - /** - * Set the amount to increase or decrease the space between characters in a text. - * @param float $spacing amount to increase or decrease the space between characters in a text (0 = default spacing) - * @author Nicola Asuni - * @access public - * @since 5.9.000 (2010-09-29) - */ - public function setFontSpacing($spacing=0) { - $this->font_spacing = $spacing; - } - - /** - * Get the amount to increase or decrease the space between characters in a text. - * @return int font spacing (tracking/kerning) value - * @author Nicola Asuni - * @access public - * @since 5.9.000 (2010-09-29) - */ - public function getFontSpacing() { - return $this->font_spacing; - } - - /** - * Return an array of no-write page regions - * @return array of no-write page regions - * @author Nicola Asuni - * @access public - * @since 5.9.003 (2010-10-13) - * @see setPageRegions(), addPageRegion() - */ - public function getPageRegions() { - return $this->page_regions; - } - - /** - * Set no-write regions on page. - * A no-write region is a portion of the page with a rectangular or trapezium shape that will not be covered when writing text or html code. - * A region is always aligned on the left or right side of the page ad is defined using a vertical segment. - * You can set multiple regions for the same page. - * @param array $regions array of no-write regions. For each region you can define an array as follow: ('page' => page number or empy for current page, 'xt' => X top, 'yt' => Y top, 'xb' => X bottom, 'yb' => Y bottom, 'side' => page side 'L' = left or 'R' = right). Omit this parameter to remove all regions. - * @author Nicola Asuni - * @access public - * @since 5.9.003 (2010-10-13) - * @see addPageRegion(), getPageRegions() - */ - public function setPageRegions($regions=array()) { - // empty current regions array - $this->page_regions = array(); - // add regions - foreach ($regions as $data) { - $this->addPageRegion($data); - } - } - - /** - * Add a single no-write region on selected page. - * A no-write region is a portion of the page with a rectangular or trapezium shape that will not be covered when writing text or html code. - * A region is always aligned on the left or right side of the page ad is defined using a vertical segment. - * You can set multiple regions for the same page. - * @param array $region array of a single no-write region array: ('page' => page number or empy for current page, 'xt' => X top, 'yt' => Y top, 'xb' => X bottom, 'yb' => Y bottom, 'side' => page side 'L' = left or 'R' = right). - * @author Nicola Asuni - * @access public - * @since 5.9.003 (2010-10-13) - * @see setPageRegions(), getPageRegions() - */ - public function addPageRegion($region) { - if (!isset($region['page']) OR empty($region['page'])) { - $region['page'] = $this->page; - } - if (isset($region['xt']) AND isset($region['xb']) AND ($region['xt'] > 0) AND ($region['xb'] > 0) - AND isset($region['yt']) AND isset($region['yb']) AND ($region['yt'] >= 0) AND ($region['yt'] < $region['yb']) - AND isset($region['side']) AND (($region['side'] == 'L') OR ($region['side'] == 'R'))) { - $this->page_regions[] = $region; - } - } - - /** - * Remove a single no-write region. - * @param int $key region key - * @author Nicola Asuni - * @access public - * @since 5.9.003 (2010-10-13) - * @see setPageRegions(), getPageRegions() - */ - public function removePageRegion($key) { - if (isset($this->page_regions[$key])) { - unset($this->page_regions[$key]); - } - } - - /** - * Check page for no-write regions and adapt current coordinates and page margins if necessary. - * A no-write region is a portion of the page with a rectangular or trapezium shape that will not be covered when writing text or html code. - * A region is always aligned on the left or right side of the page ad is defined using a vertical segment. - * @param float $h height of the text/image/object to print in user units - * @param float $x current X coordinate in user units - * @param float $y current Y coordinate in user units - * @author Nicola Asuni - * @access protected - * @since 5.9.003 (2010-10-13) - */ - protected function checkPageRegions($h=0, &$x='', &$y='') { - // set default values - if ($x === '') { - $x = &$this->x; - } - if ($y === '') { - $y = &$this->y; - } - if (empty($this->page_regions)) { - // no page regions defined - return; - } - if (empty($h)) { - $h = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B']; - } - if ($this->rtl) { - $this->lMargin = $this->original_lMargin; - } else { - $this->rMargin = $this->original_rMargin; - } - if ($this->AutoPageBreak AND !$this->InFooter AND (($y + $h) > $this->PageBreakTrigger)) { - // the content will be printed on a new page - return; - } - // adjust coordinates and page margins - foreach ($this->page_regions as $regid => $regdata) { - if ($regdata['page'] == $this->page) { - // check region boundaries - if (($y > ($regdata['yt'] - $h)) AND ($y <= $regdata['yb'])) { - // Y is inside the region - $minv = ($regdata['xb'] - $regdata['xt']) / ($regdata['yb'] - $regdata['yt']); // inverse of angular coefficient - $yt = max($y, $regdata['yt']); - $yb = min(($yt + $h), $regdata['yb']); - $xt = (($yt - $regdata['yt']) * $minv) + $regdata['xt']; - $xb = (($yb - $regdata['yt']) * $minv) + $regdata['xt']; - if ($regdata['side'] == 'L') { // left side - $new_margin = max($xt, $xb); - if ($this->lMargin < $new_margin) { - if ($this->rtl) { - // adjust left page margin - $this->lMargin = $new_margin; - } - if ($x < $new_margin) { - // adjust x position - $x = $new_margin; - } - } - } elseif ($regdata['side'] == 'R') { // right side - $new_margin = min($xt, $xb); - if (($this->w - $this->rMargin) > $new_margin) { - if (!$this->rtl) { - // adjust right page margin - $this->rMargin = ($this->w - $new_margin); - } - if ($x > $new_margin) { - // adjust x position - $x = $new_margin; - } - } - } - } - } - } - } - - // -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- - // SVG METHODS - // -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- - - /** - * Embedd a Scalable Vector Graphics (SVG) image. - * NOTE: SVG standard is not yet fully implemented, use the setRasterizeVectorImages() method to enable/disable rasterization of vector images using ImageMagick library. - * @param string $file Name of the SVG file. - * @param float $x Abscissa of the upper-left corner. - * @param float $y Ordinate of the upper-left corner. - * @param float $w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. - * @param float $h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. - * @param mixed $link URL or identifier returned by AddLink(). - * @param string $align Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:
      • T: top-right for LTR or top-left for RTL
      • M: middle-right for LTR or middle-left for RTL
      • B: bottom-right for LTR or bottom-left for RTL
      • N: next line
      If the alignment is an empty string, then the pointer will be restored on the starting SVG position. - * @param string $palign Allows to center or align the image on the current line. Possible values are:
      • L : left align
      • C : center
      • R : right align
      • '' : empty string : left for LTR or right for RTL
      - * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
      • 0: no border (default)
      • 1: frame
      or a string containing some or all of the following characters (in any order):
      • L: left
      • T: top
      • R: right
      • B: bottom
      or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) - * @param boolean $fitonpage if true the image is resized to not exceed page dimensions. - * @author Nicola Asuni - * @since 5.0.000 (2010-05-02) - * @access public - */ - public function ImageSVG($file, $x='', $y='', $w=0, $h=0, $link='', $align='', $palign='', $border=0, $fitonpage=false) { - if ($this->rasterize_vector_images AND ($w > 0) AND ($h > 0)) { - // convert SVG to raster image using GD or ImageMagick libraries - return $this->Image($file, $x, $y, $w, $h, 'SVG', $link, $align, true, 300, $palign, false, false, $border, false, false, false); - } - $this->svgdir = dirname($file); - $svgdata = file_get_contents($file); - if ($svgdata === false) { - $this->Error('SVG file not found: '.$file); - } - if ($x === '') { - $x = $this->x; - } - if ($y === '') { - $y = $this->y; - } - // check page for no-write regions and adapt page margins if necessary - $this->checkPageRegions($x, $y); - $k = $this->k; - $ox = 0; - $oy = 0; - $ow = $w; - $oh = $h; - $aspect_ratio_align = 'xMidYMid'; - $aspect_ratio_ms = 'meet'; - $regs = array(); - // get original image width and height - preg_match('/]*)>/si', $svgdata, $regs); - if (isset($regs[1]) AND !empty($regs[1])) { - $tmp = array(); - if (preg_match('/[\s]+x[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { - $ox = $this->getHTMLUnitToUnits($tmp[1], 0, $this->svgunit, false); - } - $tmp = array(); - if (preg_match('/[\s]+y[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { - $oy = $this->getHTMLUnitToUnits($tmp[1], 0, $this->svgunit, false); - } - $tmp = array(); - if (preg_match('/[\s]+width[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { - $ow = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false); - } - $tmp = array(); - if (preg_match('/[\s]+height[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { - $oh = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false); - } - $tmp = array(); - $view_box = array(); - if (preg_match('/[\s]+viewBox[\s]*=[\s]*"[\s]*([0-9\.\-]+)[\s]+([0-9\.\-]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]*"/si', $regs[1], $tmp)) { - if (count($tmp) == 5) { - array_shift($tmp); - foreach ($tmp as $key => $val) { - $view_box[$key] = $this->getHTMLUnitToUnits($val, 0, $this->svgunit, false); - } - $ox = $view_box[0]; - $oy = $view_box[1]; - } - // get aspect ratio - $tmp = array(); - if (preg_match('/[\s]+preserveAspectRatio[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { - $aspect_ratio = preg_split('/[\s]+/si', $tmp[1]); - switch (count($aspect_ratio)) { - case 3: { - $aspect_ratio_align = $aspect_ratio[1]; - $aspect_ratio_ms = $aspect_ratio[2]; - break; - } - case 2: { - $aspect_ratio_align = $aspect_ratio[0]; - $aspect_ratio_ms = $aspect_ratio[1]; - break; - } - case 1: { - $aspect_ratio_align = $aspect_ratio[0]; - $aspect_ratio_ms = 'meet'; - break; - } - } - } - } - } - // calculate image width and height on document - if (($w <= 0) AND ($h <= 0)) { - // convert image size to document unit - $w = $ow; - $h = $oh; - } elseif ($w <= 0) { - $w = $h * $ow / $oh; - } elseif ($h <= 0) { - $h = $w * $oh / $ow; - } - // fit the image on available space - $this->fitBlock($w, $h, $x, $y, $fitonpage); - if ($this->rasterize_vector_images) { - // convert SVG to raster image using GD or ImageMagick libraries - return $this->Image($file, $x, $y, $w, $h, 'SVG', $link, $align, true, 300, $palign, false, false, $border, false, false, false); - } - // set alignment - $this->img_rb_y = $y + $h; - // set alignment - if ($this->rtl) { - if ($palign == 'L') { - $ximg = $this->lMargin; - } elseif ($palign == 'C') { - $ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($palign == 'R') { - $ximg = $this->w - $this->rMargin - $w; - } else { - $ximg = $x - $w; - } - $this->img_rb_x = $ximg; - } else { - if ($palign == 'L') { - $ximg = $this->lMargin; - } elseif ($palign == 'C') { - $ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2; - } elseif ($palign == 'R') { - $ximg = $this->w - $this->rMargin - $w; - } else { - $ximg = $x; - } - $this->img_rb_x = $ximg + $w; - } - // store current graphic vars - $gvars = $this->getGraphicVars(); - // store SVG position and scale factors - $svgoffset_x = ($ximg - $ox) * $this->k; - $svgoffset_y = -($y - $oy) * $this->k; - if (isset($view_box[2]) AND ($view_box[2] > 0) AND ($view_box[3] > 0)) { - $ow = $view_box[2]; - $oh = $view_box[3]; - } - $svgscale_x = $w / $ow; - $svgscale_y = $h / $oh; - // scaling and alignment - if ($aspect_ratio_align != 'none') { - // store current scaling values - $svgscale_old_x = $svgscale_x; - $svgscale_old_y = $svgscale_y; - // force uniform scaling - if ($aspect_ratio_ms == 'slice') { - // the entire viewport is covered by the viewBox - if ($svgscale_x > $svgscale_y) { - $svgscale_y = $svgscale_x; - } elseif ($svgscale_x < $svgscale_y) { - $svgscale_x = $svgscale_y; - } - } else { // meet - // the entire viewBox is visible within the viewport - if ($svgscale_x < $svgscale_y) { - $svgscale_y = $svgscale_x; - } elseif ($svgscale_x > $svgscale_y) { - $svgscale_x = $svgscale_y; - } - } - // correct X alignment - switch (substr($aspect_ratio_align, 1, 3)) { - case 'Min': { - // do nothing - break; - } - case 'Max': { - $svgoffset_x += (($w * $this->k) - ($ow * $this->k * $svgscale_x)); - break; - } - default: - case 'Mid': { - $svgoffset_x += ((($w * $this->k) - ($ow * $this->k * $svgscale_x)) / 2); - break; - } - } - // correct Y alignment - switch (substr($aspect_ratio_align, 5)) { - case 'Min': { - // do nothing - break; - } - case 'Max': { - $svgoffset_y -= (($h * $this->k) - ($oh * $this->k * $svgscale_y)); - break; - } - default: - case 'Mid': { - $svgoffset_y -= ((($h * $this->k) - ($oh * $this->k * $svgscale_y)) / 2); - break; - } - } - } - // store current page break mode - $page_break_mode = $this->AutoPageBreak; - $page_break_margin = $this->getBreakMargin(); - $cell_padding = $this->cell_padding; - $this->SetCellPadding(0); - $this->SetAutoPageBreak(false); - // save the current graphic state - $this->_out('q'.$this->epsmarker); - // set initial clipping mask - $this->Rect($x, $y, $w, $h, 'CNZ', array(), array()); - // scale and translate - $e = $ox * $this->k * (1 - $svgscale_x); - $f = ($this->h - $oy) * $this->k * (1 - $svgscale_y); - $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $svgscale_x, 0, 0, $svgscale_y, $e + $svgoffset_x, $f + $svgoffset_y)); - // creates a new XML parser to be used by the other XML functions - $this->parser = xml_parser_create('UTF-8'); - // the following function allows to use parser inside object - xml_set_object($this->parser, $this); - // disable case-folding for this XML parser - xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); - // sets the element handler functions for the XML parser - xml_set_element_handler($this->parser, 'startSVGElementHandler', 'endSVGElementHandler'); - // sets the character data handler function for the XML parser - xml_set_character_data_handler($this->parser, 'segSVGContentHandler'); - // start parsing an XML document - if(!xml_parse($this->parser, $svgdata)) { - $error_message = sprintf("SVG Error: %s at line %d", xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser)); - $this->Error($error_message); - } - // free this XML parser - xml_parser_free($this->parser); - // restore previous graphic state - $this->_out($this->epsmarker.'Q'); - // restore graphic vars - $this->setGraphicVars($gvars); - $this->lasth = $gvars['lasth']; - if (!empty($border)) { - $bx = $this->x; - $by = $this->y; - $this->x = $ximg; - if ($this->rtl) { - $this->x += $w; - } - $this->y = $y; - $this->Cell($w, $h, '', $border, 0, '', 0, '', 0, true); - $this->x = $bx; - $this->y = $by; - } - if ($link) { - $this->Link($ximg, $y, $w, $h, $link, 0); - } - // set pointer to align the next text/objects - switch($align) { - case 'T':{ - $this->y = $y; - $this->x = $this->img_rb_x; - break; - } - case 'M':{ - $this->y = $y + round($h/2); - $this->x = $this->img_rb_x; - break; - } - case 'B':{ - $this->y = $this->img_rb_y; - $this->x = $this->img_rb_x; - break; - } - case 'N':{ - $this->SetY($this->img_rb_y); - break; - } - default:{ - // restore pointer to starting position - $this->x = $gvars['x']; - $this->y = $gvars['y']; - $this->page = $gvars['page']; - $this->current_column = $gvars['current_column']; - $this->tMargin = $gvars['tMargin']; - $this->bMargin = $gvars['bMargin']; - $this->w = $gvars['w']; - $this->h = $gvars['h']; - $this->wPt = $gvars['wPt']; - $this->hPt = $gvars['hPt']; - $this->fwPt = $gvars['fwPt']; - $this->fhPt = $gvars['fhPt']; - break; - } - } - $this->endlinex = $this->img_rb_x; - // restore page break - $this->SetAutoPageBreak($page_break_mode, $page_break_margin); - $this->cell_padding = $cell_padding; - } - - /** - * Get the tranformation matrix from SVG transform attribute - * @param string transformation - * @return array of transformations - * @author Nicola Asuni - * @since 5.0.000 (2010-05-02) - * @access protected - */ - protected function getSVGTransformMatrix($attribute) { - // identity matrix - $tm = array(1, 0, 0, 1, 0, 0); - $transform = array(); - if (preg_match_all('/(matrix|translate|scale|rotate|skewX|skewY)[\s]*\(([^\)]+)\)/si', $attribute, $transform, PREG_SET_ORDER) > 0) { - foreach ($transform as $key => $data) { - if (!empty($data[2])) { - $a = 1; - $b = 0; - $c = 0; - $d = 1; - $e = 0; - $f = 0; - $regs = array(); - switch ($data[1]) { - case 'matrix': { - if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) { - $a = $regs[1]; - $b = $regs[2]; - $c = $regs[3]; - $d = $regs[4]; - $e = $regs[5]; - $f = $regs[6]; - } - break; - } - case 'translate': { - if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) { - $e = $regs[1]; - $f = $regs[2]; - } elseif (preg_match('/([a-z0-9\-\.]+)/si', $data[2], $regs)) { - $e = $regs[1]; - } - break; - } - case 'scale': { - if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) { - $a = $regs[1]; - $d = $regs[2]; - } elseif (preg_match('/([a-z0-9\-\.]+)/si', $data[2], $regs)) { - $a = $regs[1]; - $d = $a; - } - break; - } - case 'rotate': { - if (preg_match('/([0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) { - $ang = deg2rad($regs[1]); - $x = $regs[2]; - $y = $regs[3]; - $a = cos($ang); - $b = sin($ang); - $c = -$b; - $d = $a; - $e = ($x * (1 - $a)) - ($y * $c); - $f = ($y * (1 - $d)) - ($x * $b); - } elseif (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) { - $ang = deg2rad($regs[1]); - $a = cos($ang); - $b = sin($ang); - $c = -$b; - $d = $a; - $e = 0; - $f = 0; - } - break; - } - case 'skewX': { - if (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) { - $c = tan(deg2rad($regs[1])); - } - break; - } - case 'skewY': { - if (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) { - $b = tan(deg2rad($regs[1])); - } - break; - } - } - $tm = $this->getTransformationMatrixProduct($tm, array($a, $b, $c, $d, $e, $f)); - } - } - } - return $tm; - } - - /** - * Get the product of two SVG tranformation matrices - * @param array $ta first SVG tranformation matrix - * @param array $tb second SVG tranformation matrix - * @return transformation array - * @author Nicola Asuni - * @since 5.0.000 (2010-05-02) - * @access protected - */ - protected function getTransformationMatrixProduct($ta, $tb) { - $tm = array(); - $tm[0] = ($ta[0] * $tb[0]) + ($ta[2] * $tb[1]); - $tm[1] = ($ta[1] * $tb[0]) + ($ta[3] * $tb[1]); - $tm[2] = ($ta[0] * $tb[2]) + ($ta[2] * $tb[3]); - $tm[3] = ($ta[1] * $tb[2]) + ($ta[3] * $tb[3]); - $tm[4] = ($ta[0] * $tb[4]) + ($ta[2] * $tb[5]) + $ta[4]; - $tm[5] = ($ta[1] * $tb[4]) + ($ta[3] * $tb[5]) + $ta[5]; - return $tm; - } - - /** - * Convert SVG transformation matrix to PDF. - * @param array $tm original SVG transformation matrix - * @return array transformation matrix - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected function convertSVGtMatrix($tm) { - $a = $tm[0]; - $b = -$tm[1]; - $c = -$tm[2]; - $d = $tm[3]; - $e = $this->getHTMLUnitToUnits($tm[4], 1, $this->svgunit, false) * $this->k; - $f = -$this->getHTMLUnitToUnits($tm[5], 1, $this->svgunit, false) * $this->k; - $x = 0; - $y = $this->h * $this->k; - $e = ($x * (1 - $a)) - ($y * $c) + $e; - $f = ($y * (1 - $d)) - ($x * $b) + $f; - return array($a, $b, $c, $d, $e, $f); - } - - /** - * Apply SVG graphic transformation matrix. - * @param array $tm original SVG transformation matrix - * @access protected - * @since 5.0.000 (2010-05-02) - */ - protected function SVGTransform($tm) { - $this->Transform($this->convertSVGtMatrix($tm)); - } - - /** - * Apply the requested SVG styles (*** TO BE COMPLETED ***) - * @param array $svgstyle array of SVG styles to apply - * @param array $prevsvgstyle array of previous SVG style - * @param int $x X origin of the bounding box - * @param int $y Y origin of the bounding box - * @param int $w width of the bounding box - * @param int $h height of the bounding box - * @param string $clip_function clip function - * @param array $clip_params array of parameters for clipping function - * @return object style - * @author Nicola Asuni - * @since 5.0.000 (2010-05-02) - * @access protected - */ - protected function setSVGStyles($svgstyle, $prevsvgstyle, $x=0, $y=0, $w=1, $h=1, $clip_function='', $clip_params=array()) { - $objstyle = ''; - if(!isset($svgstyle['opacity'])) { - return $objstyle; - } - // clip-path - $regs = array(); - if (preg_match('/url\([\s]*\#([^\)]*)\)/si', $svgstyle['clip-path'], $regs)) { - $clip_path = $this->svgclippaths[$regs[1]]; - foreach ($clip_path as $cp) { - $this->startSVGElementHandler('clip-path', $cp['name'], $cp['attribs'], $cp['tm']); - } - } - // opacity - if ($svgstyle['opacity'] != 1) { - $this->SetAlpha($svgstyle['opacity']); - } - // color - $fill_color = $this->convertHTMLColorToDec($svgstyle['color']); - $this->SetFillColorArray($fill_color); - // text color - $text_color = $this->convertHTMLColorToDec($svgstyle['text-color']); - $this->SetTextColorArray($text_color); - // clip - if (preg_match('/rect\(([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)\)/si', $svgstyle['clip'], $regs)) { - $top = (isset($regs[1])?$this->getHTMLUnitToUnits($regs[1], 0, $this->svgunit, false):0); - $right = (isset($regs[2])?$this->getHTMLUnitToUnits($regs[2], 0, $this->svgunit, false):0); - $bottom = (isset($regs[3])?$this->getHTMLUnitToUnits($regs[3], 0, $this->svgunit, false):0); - $left = (isset($regs[4])?$this->getHTMLUnitToUnits($regs[4], 0, $this->svgunit, false):0); - $cx = $x + $left; - $cy = $y + $top; - $cw = $w - $left - $right; - $ch = $h - $top - $bottom; - if ($svgstyle['clip-rule'] == 'evenodd') { - $clip_rule = 'CNZ'; - } else { - $clip_rule = 'CEO'; - } - $this->Rect($cx, $cy, $cw, $ch, $clip_rule, array(), array()); - } - // fill - $regs = array(); - if (preg_match('/url\([\s]*\#([^\)]*)\)/si', $svgstyle['fill'], $regs)) { - // gradient - $gradient = $this->svggradients[$regs[1]]; - if (isset($gradient['xref'])) { - // reference to another gradient definition - $newgradient = $this->svggradients[$gradient['xref']]; - $newgradient['coords'] = $gradient['coords']; - $newgradient['mode'] = $gradient['mode']; - $newgradient['gradientUnits'] = $gradient['gradientUnits']; - if (isset($gradient['gradientTransform'])) { - $newgradient['gradientTransform'] = $gradient['gradientTransform']; - } - $gradient = $newgradient; - } - //save current Graphic State - $this->_out('q'); - //set clipping area - if (!empty($clip_function) AND method_exists($this, $clip_function)) { - $bbox = call_user_func_array(array($this, $clip_function), $clip_params); - if (is_array($bbox) AND (count($bbox) == 4)) { - list($x, $y, $w, $h) = $bbox; - } - } - if ($gradient['mode'] == 'measure') { - if (isset($gradient['gradientTransform']) AND !empty($gradient['gradientTransform'])) { - $gtm = $gradient['gradientTransform']; - // apply transformation matrix - $xa = ($gtm[0] * $gradient['coords'][0]) + ($gtm[2] * $gradient['coords'][1]) + $gtm[4]; - $ya = ($gtm[1] * $gradient['coords'][0]) + ($gtm[3] * $gradient['coords'][1]) + $gtm[5]; - $xb = ($gtm[0] * $gradient['coords'][2]) + ($gtm[2] * $gradient['coords'][3]) + $gtm[4]; - $yb = ($gtm[1] * $gradient['coords'][2]) + ($gtm[3] * $gradient['coords'][3]) + $gtm[5]; - if (isset($gradient['coords'][4])) { - $gradient['coords'][4] = sqrt(pow(($gtm[0] * $gradient['coords'][4]), 2) + pow(($gtm[1] * $gradient['coords'][4]), 2)); - } - $gradient['coords'][0] = $xa; - $gradient['coords'][1] = $ya; - $gradient['coords'][2] = $xb; - $gradient['coords'][3] = $yb; - - } - // convert SVG coordinates to user units - $gradient['coords'][0] = $this->getHTMLUnitToUnits($gradient['coords'][0], 0, $this->svgunit, false); - $gradient['coords'][1] = $this->getHTMLUnitToUnits($gradient['coords'][1], 0, $this->svgunit, false); - $gradient['coords'][2] = $this->getHTMLUnitToUnits($gradient['coords'][2], 0, $this->svgunit, false); - $gradient['coords'][3] = $this->getHTMLUnitToUnits($gradient['coords'][3], 0, $this->svgunit, false); - if (isset($gradient['coords'][4])) { - $gradient['coords'][4] = $this->getHTMLUnitToUnits($gradient['coords'][4], 0, $this->svgunit, false); - } - // shift units - if ($gradient['gradientUnits'] == 'objectBoundingBox') { - // convert to SVG coordinate system - $gradient['coords'][0] += $x; - $gradient['coords'][1] += $y; - $gradient['coords'][2] += $x; - $gradient['coords'][3] += $y; - } - // calculate percentages - $gradient['coords'][0] = ($gradient['coords'][0] - $x) / $w; - $gradient['coords'][1] = ($gradient['coords'][1] - $y) / $h; - $gradient['coords'][2] = ($gradient['coords'][2] - $x) / $w; - $gradient['coords'][3] = ($gradient['coords'][3] - $y) / $h; - if (isset($gradient['coords'][4])) { - $gradient['coords'][4] /= $w; - } - // fix values - foreach($gradient['coords'] as $key => $val) { - if ($val < 0) { - $gradient['coords'][$key] = 0; - } elseif ($val > 1) { - $gradient['coords'][$key] = 1; - } - } - if (($gradient['type'] == 2) AND ($gradient['coords'][0] == $gradient['coords'][2]) AND ($gradient['coords'][1] == $gradient['coords'][3])) { - // single color (no shading) - $gradient['coords'][0] = 1; - $gradient['coords'][1] = 0; - $gradient['coords'][2] = 0.999; - $gradient['coords'][3] = 0; - } - } - // swap Y coordinates - $tmp = $gradient['coords'][1]; - $gradient['coords'][1] = $gradient['coords'][3]; - $gradient['coords'][3] = $tmp; - // set transformation map for gradient - if (($gradient['type'] == 3) AND ($gradient['mode'] == 'measure')) { - // gradient is always circular - $cy = $this->h - $y - ($gradient['coords'][1] * ($w + $h)); - $this->_out(sprintf('%.3F 0 0 %.3F %.3F %.3F cm', $w*$this->k, $w*$this->k, $x*$this->k, $cy*$this->k)); - } else { - $this->_out(sprintf('%.3F 0 0 %.3F %.3F %.3F cm', $w*$this->k, $h*$this->k, $x*$this->k, ($this->h-($y+$h))*$this->k)); - } - if (count($gradient['stops']) > 1) { - $this->Gradient($gradient['type'], $gradient['coords'], $gradient['stops'], array(), false); - } - } elseif ($svgstyle['fill'] != 'none') { - $fill_color = $this->convertHTMLColorToDec($svgstyle['fill']); - if ($svgstyle['fill-opacity'] != 1) { - $this->SetAlpha($svgstyle['fill-opacity']); - } - $this->SetFillColorArray($fill_color); - if ($svgstyle['fill-rule'] == 'evenodd') { - $objstyle .= 'F*'; - } else { - $objstyle .= 'F'; - } - } - // stroke - if ($svgstyle['stroke'] != 'none') { - $stroke_style = array( - 'color' => $this->convertHTMLColorToDec($svgstyle['stroke']), - 'width' => $this->getHTMLUnitToUnits($svgstyle['stroke-width'], 0, $this->svgunit, false), - 'cap' => $svgstyle['stroke-linecap'], - 'join' => $svgstyle['stroke-linejoin'] - ); - if (isset($svgstyle['stroke-dasharray']) AND !empty($svgstyle['stroke-dasharray']) AND ($svgstyle['stroke-dasharray'] != 'none')) { - $stroke_style['dash'] = $svgstyle['stroke-dasharray']; - } - $this->SetLineStyle($stroke_style); - $objstyle .= 'D'; - } - // font - $regs = array(); - if (!empty($svgstyle['font'])) { - if (preg_match('/font-family[\s]*:[\s]*([^\;\"]*)/si', $svgstyle['font'], $regs)) { - $font_family = $this->getFontFamilyName($regs[1]); - } else { - $font_family = $svgstyle['font-family']; - } - if (preg_match('/font-size[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { - $font_size = trim($regs[1]); - } else { - $font_size = $svgstyle['font-size']; - } - if (preg_match('/font-style[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { - $font_style = trim($regs[1]); - } else { - $font_style = $svgstyle['font-style']; - } - if (preg_match('/font-weight[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { - $font_weight = trim($regs[1]); - } else { - $font_weight = $svgstyle['font-weight']; - } - if (preg_match('/font-stretch[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { - $font_stretch = trim($regs[1]); - } else { - $font_stretch = $svgstyle['font-stretch']; - } - if (preg_match('/letter-spacing[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { - $font_spacing = trim($regs[1]); - } else { - $font_spacing = $svgstyle['letter-spacing']; - } - } else { - $font_family = $this->getFontFamilyName($svgstyle['font-family']); - $font_size = $svgstyle['font-size']; - $font_style = $svgstyle['font-style']; - $font_weight = $svgstyle['font-weight']; - $font_stretch = $svgstyle['font-stretch']; - $font_spacing = $svgstyle['letter-spacing']; - } - $font_size = $this->getHTMLUnitToUnits($font_size, $prevsvgstyle['font-size'], $this->svgunit, false) * $this->k; - $font_stretch = $this->getCSSFontStretching($font_stretch, $svgstyle['font-stretch']); - $font_spacing = $this->getCSSFontSpacing($font_spacing, $svgstyle['letter-spacing']); - switch ($font_style) { - case 'italic': { - $font_style = 'I'; - break; - } - case 'oblique': { - $font_style = 'I'; - break; - } - default: - case 'normal': { - $font_style = ''; - break; - } - } - switch ($font_weight) { - case 'bold': - case 'bolder': { - $font_style .= 'B'; - break; - } - } - switch ($svgstyle['text-decoration']) { - case 'underline': { - $font_style .= 'U'; - break; - } - case 'overline': { - $font_style .= 'O'; - break; - } - case 'line-through': { - $font_style .= 'D'; - break; - } - default: - case 'none': { - break; - } - } - $this->SetFont($font_family, $font_style, $font_size); - $this->setFontStretching($font_stretch); - $this->setFontSpacing($font_spacing); - return $objstyle; - } - - /** - * Draws an SVG path - * @param string $d attribute d of the path SVG element - * @param string $style Style of rendering. Possible values are: - *
        - *
      • D or empty string: Draw (default).
      • - *
      • F: Fill.
      • - *
      • F*: Fill using the even-odd rule to determine which regions lie inside the clipping path.
      • - *
      • DF or FD: Draw and fill.
      • - *
      • DF* or FD*: Draw and fill using the even-odd rule to determine which regions lie inside the clipping path.
      • - *
      • CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).
      • - *
      • CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).
      • - *
      - * @return array of container box measures (x, y, w, h) - * @author Nicola Asuni - * @since 5.0.000 (2010-05-02) - * @access protected - */ - protected function SVGPath($d, $style='') { - // set fill/stroke style - $op = $this->getPathPaintOperator($style, ''); - if (empty($op)) { - return; - } - $paths = array(); - $d = str_replace('-', ' -', $d); - $d = str_replace('+', ' +', $d); - preg_match_all('/([a-zA-Z])[\s]*([^a-zA-Z\"]*)/si', $d, $paths, PREG_SET_ORDER); - $x = 0; - $y = 0; - $x1 = 0; - $y1 = 0; - $x2 = 0; - $y2 = 0; - $xmin = 2147483647; - $xmax = 0; - $ymin = 2147483647; - $ymax = 0; - $relcoord = false; - // draw curve pieces - foreach ($paths as $key => $val) { - // get curve type - $cmd = trim($val[1]); - if (strtolower($cmd) == $cmd) { - // use relative coordinated instead of absolute - $relcoord = true; - $xoffset = $x; - $yoffset = $y; - } else { - $relcoord = false; - $xoffset = 0; - $yoffset = 0; - } - $params = array(); - if (isset($val[2])) { - // get curve parameters - $rawparams = preg_split('/([\,\s]+)/si', trim($val[2])); - $params = array(); - foreach ($rawparams as $ck => $cp) { - $params[$ck] = $this->getHTMLUnitToUnits($cp, 0, $this->svgunit, false); - } - } - switch (strtoupper($cmd)) { - case 'M': { // moveto - foreach ($params as $ck => $cp) { - if (($ck % 2) == 0) { - $x = $cp + $xoffset; - } else { - $y = $cp + $yoffset; - if ($ck == 1) { - $this->_outPoint($x, $y); - } else { - $this->_outLine($x, $y); - } - $xmin = min($xmin, $x); - $ymin = min($ymin, $y); - $xmax = max($xmax, $x); - $ymax = max($ymax, $y); - if ($relcoord) { - $xoffset = $x; - $yoffset = $y; - } - } - } - break; - } - case 'L': { // lineto - foreach ($params as $ck => $cp) { - if (($ck % 2) == 0) { - $x = $cp + $xoffset; - } else { - $y = $cp + $yoffset; - $this->_outLine($x, $y); - $xmin = min($xmin, $x); - $ymin = min($ymin, $y); - $xmax = max($xmax, $x); - $ymax = max($ymax, $y); - if ($relcoord) { - $xoffset = $x; - $yoffset = $y; - } - } - } - break; - } - case 'H': { // horizontal lineto - foreach ($params as $ck => $cp) { - $x = $cp + $xoffset; - $this->_outLine($x, $y); - $xmin = min($xmin, $x); - $xmax = max($xmax, $x); - if ($relcoord) { - $xoffset = $x; - } - } - break; - } - case 'V': { // vertical lineto - foreach ($params as $ck => $cp) { - $y = $cp + $yoffset; - $this->_outLine($x, $y); - $ymin = min($ymin, $y); - $ymax = max($ymax, $y); - if ($relcoord) { - $yoffset = $y; - } - } - break; - } - case 'C': { // curveto - foreach ($params as $ck => $cp) { - $params[$ck] = $cp; - if ((($ck + 1) % 6) == 0) { - $x1 = $params[($ck - 5)] + $xoffset; - $y1 = $params[($ck - 4)] + $yoffset; - $x2 = $params[($ck - 3)] + $xoffset; - $y2 = $params[($ck - 2)] + $yoffset; - $x = $params[($ck - 1)] + $xoffset; - $y = $params[($ck)] + $yoffset; - $this->_outCurve($x1, $y1, $x2, $y2, $x, $y); - $xmin = min($xmin, $x, $x1, $x2); - $ymin = min($ymin, $y, $y1, $y2); - $xmax = max($xmax, $x, $x1, $x2); - $ymax = max($ymax, $y, $y1, $y2); - if ($relcoord) { - $xoffset = $x; - $yoffset = $y; - } - } - } - break; - } - case 'S': { // shorthand/smooth curveto - foreach ($params as $ck => $cp) { - $params[$ck] = $cp; - if ((($ck + 1) % 4) == 0) { - if (($key > 0) AND ((strtoupper($paths[($key - 1)][1]) == 'C') OR (strtoupper($paths[($key - 1)][1]) == 'S'))) { - $x1 = (2 * $x) - $x2; - $y1 = (2 * $y) - $y2; - } else { - $x1 = $x; - $y1 = $y; - } - $x2 = $params[($ck - 3)] + $xoffset; - $y2 = $params[($ck - 2)] + $yoffset; - $x = $params[($ck - 1)] + $xoffset; - $y = $params[($ck)] + $yoffset; - $this->_outCurve($x1, $y1, $x2, $y2, $x, $y); - $xmin = min($xmin, $x, $x1, $x2); - $ymin = min($ymin, $y, $y1, $y2); - $xmax = max($xmax, $x, $x1, $x2); - $ymax = max($ymax, $y, $y1, $y2); - if ($relcoord) { - $xoffset = $x; - $yoffset = $y; - } - } - } - break; - } - case 'Q': { // quadratic Bézier curveto - foreach ($params as $ck => $cp) { - $params[$ck] = $cp; - if ((($ck + 1) % 4) == 0) { - // convert quadratic points to cubic points - $x1 = $params[($ck - 3)] + $xoffset; - $y1 = $params[($ck - 2)] + $yoffset; - $xa = ($x + (2 * $x1)) / 3; - $ya = ($y + (2 * $y1)) / 3; - $x = $params[($ck - 1)] + $xoffset; - $y = $params[($ck)] + $yoffset; - $xb = ($x + (2 * $x1)) / 3; - $yb = ($y + (2 * $y1)) / 3; - $this->_outCurve($xa, $ya, $xb, $yb, $x, $y); - $xmin = min($xmin, $x, $xa, $xb); - $ymin = min($ymin, $y, $ya, $yb); - $xmax = max($xmax, $x, $xa, $xb); - $ymax = max($ymax, $y, $ya, $yb); - if ($relcoord) { - $xoffset = $x; - $yoffset = $y; - } - } - } - break; - } - case 'T': { // shorthand/smooth quadratic Bézier curveto - foreach ($params as $ck => $cp) { - $params[$ck] = $cp; - if (($ck % 2) != 0) { - if (($key > 0) AND ((strtoupper($paths[($key - 1)][1]) == 'Q') OR (strtoupper($paths[($key - 1)][1]) == 'T'))) { - $x1 = (2 * $x) - $x1; - $y1 = (2 * $y) - $y1; - } else { - $x1 = $x; - $y1 = $y; - } - // convert quadratic points to cubic points - $xa = ($x + (2 * $x1)) / 3; - $ya = ($y + (2 * $y1)) / 3; - $x = $params[($ck - 1)] + $xoffset; - $y = $params[($ck)] + $yoffset; - $xb = ($x + (2 * $x1)) / 3; - $yb = ($y + (2 * $y1)) / 3; - $this->_outCurve($xa, $ya, $xb, $yb, $x, $y); - $xmin = min($xmin, $x, $x1, $x2); - $ymin = min($ymin, $y, $y1, $y2); - $xmax = max($xmax, $x, $x1, $x2); - $ymax = max($ymax, $y, $y1, $y2); - if ($relcoord) { - $xoffset = $x; - $yoffset = $y; - } - } - } - break; - } - case 'A': { // elliptical arc - foreach ($params as $ck => $cp) { - $params[$ck] = $cp; - if ((($ck + 1) % 7) == 0) { - $x0 = $x; - $y0 = $y; - $rx = abs($params[($ck - 6)]); - $ry = abs($params[($ck - 5)]); - $ang = -$rawparams[($ck - 4)]; - $angle = deg2rad($ang); - $fa = $rawparams[($ck - 3)]; // large-arc-flag - $fs = $rawparams[($ck - 2)]; // sweep-flag - $x = $params[($ck - 1)] + $xoffset; - $y = $params[$ck] + $yoffset; - $cos_ang = cos($angle); - $sin_ang = sin($angle); - $a = ($x0 - $x) / 2; - $b = ($y0 - $y) / 2; - $xa = ($a * $cos_ang) - ($b * $sin_ang); - $ya = ($a * $sin_ang) + ($b * $cos_ang); - $rx2 = $rx * $rx; - $ry2 = $ry * $ry; - $xa2 = $xa * $xa; - $ya2 = $ya * $ya; - $delta = ($xa2 / $rx2) + ($ya2 / $ry2); - if ($delta > 1) { - $rx *= sqrt($delta); - $ry *= sqrt($delta); - $rx2 = $rx * $rx; - $ry2 = $ry * $ry; - } - $numerator = (($rx2 * $ry2) - ($rx2 * $ya2) - ($ry2 * $xa2)); - if ($numerator < 0) { - $root = 0; - } else { - $root = sqrt($numerator / (($rx2 * $ya2) + ($ry2 * $xa2))); - } - if ($fa == $fs) { - $root *= -1; - } - $cax = $root * (($rx * $ya) / $ry); - $cay = -$root * (($ry * $xa) / $rx); - // coordinates of ellipse center - $cx = ($cax * $cos_ang) - ($cay * $sin_ang) + (($x0 + $x) / 2); - $cy = ($cax * $sin_ang) + ($cay * $cos_ang) + (($y0 + $y) / 2); - // get angles - $angs = $this->getVectorsAngle(1, 0, (($xa - $cax) / $rx), (($cay - $ya) / $ry)); - $dang = $this->getVectorsAngle((($xa - $cax) / $rx), (($ya - $cay) / $ry), ((-$xa - $cax) / $rx), ((-$ya - $cay) / $ry)); - if (($fs == 0) AND ($dang > 0)) { - $dang -= (2 * M_PI); - } elseif (($fs == 1) AND ($dang < 0)) { - $dang += (2 * M_PI); - } - $angf = $angs - $dang; - if (($fs == 1) AND ($angs > $angf)) { - $tmp = $angs; - $angs = $angf; - $angf = $tmp; - } - $angs = rad2deg($angs); - $angf = rad2deg($angf); - $pie = false; - if ((isset($paths[($key + 1)][1])) AND (trim($paths[($key + 1)][1]) == 'z')) { - $pie = true; - } - $this->_outellipticalarc($cx, $cy, $rx, $ry, $ang, $angs, $angf, $pie, 2); - $this->_outPoint($x, $y); - $xmin = min($xmin, $x); - $ymin = min($ymin, $y); - $xmax = max($xmax, $x); - $ymax = max($ymax, $y); - if ($relcoord) { - $xoffset = $x; - $yoffset = $y; - } - } - } - break; - } - case 'Z': { - $this->_out('h'); - break; - } - } - } // end foreach - if (!empty($op)) { - $this->_out($op); - } - return array($xmin, $ymin, ($xmax - $xmin), ($ymax - $ymin)); - } - - /** - * Returns the angle in radiants between two vectors - * @param int $x1 X coordiante of first vector point - * @param int $y1 Y coordiante of first vector point - * @param int $x2 X coordiante of second vector point - * @param int $y2 Y coordiante of second vector point - * @author Nicola Asuni - * @since 5.0.000 (2010-05-04) - * @access protected - */ - protected function getVectorsAngle($x1, $y1, $x2, $y2) { - $dprod = ($x1 * $x2) + ($y1 * $y2); - $dist1 = sqrt(($x1 * $x1) + ($y1 * $y1)); - $dist2 = sqrt(($x2 * $x2) + ($y2 * $y2)); - $angle = acos($dprod / ($dist1 * $dist2)); - if (is_nan($angle)) { - $angle = M_PI; - } - if ((($x1 * $y2) - ($x2 * $y1)) < 0) { - $angle *= -1; - } - return $angle; - } - - /** - * Sets the opening SVG element handler function for the XML parser. (*** TO BE COMPLETED ***) - * @param resource $parser The first parameter, parser, is a reference to the XML parser calling the handler. - * @param string $name The second parameter, name, contains the name of the element for which this handler is called. If case-folding is in effect for this parser, the element name will be in uppercase letters. - * @param array $attribs The third parameter, attribs, contains an associative array with the element's attributes (if any). The keys of this array are the attribute names, the values are the attribute values. Attribute names are case-folded on the same criteria as element names. Attribute values are not case-folded. The original order of the attributes can be retrieved by walking through attribs the normal way, using each(). The first key in the array was the first attribute, and so on. - * @param array $ctm tranformation matrix for clipping mode (starting transformation matrix). - * @author Nicola Asuni - * @since 5.0.000 (2010-05-02) - * @access protected - */ - protected function startSVGElementHandler($parser, $name, $attribs, $ctm=array()) { - // check if we are in clip mode - if ($this->svgclipmode) { - $this->svgclippaths[$this->svgclipid][] = array('name' => $name, 'attribs' => $attribs, 'tm' => $this->svgcliptm[$this->svgclipid]); - return; - } - if ($this->svgdefsmode AND !in_array($name, array('clipPath', 'linearGradient', 'radialGradient', 'stop'))) { - if (!isset($attribs['id'])) { - $attribs['id'] = 'DF_'.(count($this->svgdefs) + 1); - } - $this->svgdefs[$attribs['id']] = array('name' => $name, 'attribs' => $attribs); - return; - } - $clipping = false; - if ($parser == 'clip-path') { - // set clipping mode - $clipping = true; - } - // get styling properties - $prev_svgstyle = $this->svgstyles[(count($this->svgstyles) - 1)]; // previous style - $svgstyle = $this->svgstyles[0]; // set default style - if (isset($attribs['style']) AND !$this->empty_string($attribs['style'])) { - // fix style for regular expression - $attribs['style'] = ';'.$attribs['style']; - } - foreach ($prev_svgstyle as $key => $val) { - if (in_array($key, $this->svginheritprop)) { - // inherit previous value - $svgstyle[$key] = $val; - } - if (isset($attribs[$key]) AND !$this->empty_string($attribs[$key])) { - // specific attribute settings - if ($attribs[$key] == 'inherit') { - $svgstyle[$key] = $val; - } else { - $svgstyle[$key] = $attribs[$key]; - } - } elseif (isset($attribs['style']) AND !$this->empty_string($attribs['style'])) { - // CSS style syntax - $attrval = array(); - if (preg_match('/[;\"\s]{1}'.$key.'[\s]*:[\s]*([^;\"]*)/si', $attribs['style'], $attrval) AND isset($attrval[1])) { - if ($attrval[1] == 'inherit') { - $svgstyle[$key] = $val; - } else { - $svgstyle[$key] = $attrval[1]; - } - } - } - } - // transformation matrix - if (!empty($ctm)) { - $tm = $ctm; - } else { - $tm = $this->svgstyles[(count($this->svgstyles) - 1)]['transfmatrix']; - } - if (isset($attribs['transform']) AND !empty($attribs['transform'])) { - $tm = $this->getTransformationMatrixProduct($tm, $this->getSVGTransformMatrix($attribs['transform'])); - } - $svgstyle['transfmatrix'] = $tm; - $invisible = false; - if (($svgstyle['visibility'] == 'hidden') OR ($svgstyle['visibility'] == 'collapse') OR ($svgstyle['display'] == 'none')) { - // the current graphics element is invisible (nothing is painted) - $invisible = true; - } - // process tag - switch($name) { - case 'defs': { - $this->svgdefsmode = true; - break; - } - // clipPath - case 'clipPath': { - if ($invisible) { - break; - } - $this->svgclipmode = true; - if (!isset($attribs['id'])) { - $attribs['id'] = 'CP_'.(count($this->svgcliptm) + 1); - } - $this->svgclipid = $attribs['id']; - $this->svgclippaths[$this->svgclipid] = array(); - $this->svgcliptm[$this->svgclipid] = $tm; - break; - } - case 'svg': { - // start of SVG object - break; - } - case 'g': { - // group together related graphics elements - array_push($this->svgstyles, $svgstyle); - $this->StartTransform(); - $this->setSVGStyles($svgstyle, $prev_svgstyle); - break; - } - case 'linearGradient': { - if (!isset($attribs['id'])) { - $attribs['id'] = 'GR_'.(count($this->svggradients) + 1); - } - $this->svggradientid = $attribs['id']; - $this->svggradients[$this->svggradientid] = array(); - $this->svggradients[$this->svggradientid]['type'] = 2; - $this->svggradients[$this->svggradientid]['stops'] = array(); - if (isset($attribs['gradientUnits'])) { - $this->svggradients[$this->svggradientid]['gradientUnits'] = $attribs['gradientUnits']; - } else { - $this->svggradients[$this->svggradientid]['gradientUnits'] = 'objectBoundingBox'; - } - //$attribs['spreadMethod'] - $x1 = (isset($attribs['x1'])?$attribs['x1']:0); - $y1 = (isset($attribs['y1'])?$attribs['y1']:0); - $x2 = (isset($attribs['x2'])?$attribs['x2']:1); - $y2 = (isset($attribs['y2'])?$attribs['y2']:0); - if (isset($attribs['x1']) AND (substr($attribs['x1'], -1) != '%')) { - $this->svggradients[$this->svggradientid]['mode'] = 'measure'; - } else { - $this->svggradients[$this->svggradientid]['mode'] = 'percentage'; - } - if (isset($attribs['gradientTransform'])) { - $this->svggradients[$this->svggradientid]['gradientTransform'] = $this->getSVGTransformMatrix($attribs['gradientTransform']); - } - $this->svggradients[$this->svggradientid]['coords'] = array($x1, $y1, $x2, $y2); - if (isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])) { - // gradient is defined on another place - $this->svggradients[$this->svggradientid]['xref'] = substr($attribs['xlink:href'], 1); - } - break; - } - case 'radialGradient': { - if (!isset($attribs['id'])) { - $attribs['id'] = 'GR_'.(count($this->svggradients) + 1); - } - $this->svggradientid = $attribs['id']; - $this->svggradients[$this->svggradientid] = array(); - $this->svggradients[$this->svggradientid]['type'] = 3; - $this->svggradients[$this->svggradientid]['stops'] = array(); - if (isset($attribs['gradientUnits'])) { - $this->svggradients[$this->svggradientid]['gradientUnits'] = $attribs['gradientUnits']; - } else { - $this->svggradients[$this->svggradientid]['gradientUnits'] = 'objectBoundingBox'; - } - //$attribs['spreadMethod'] - $cx = (isset($attribs['cx'])?$attribs['cx']:0.5); - $cy = (isset($attribs['cy'])?$attribs['cy']:0.5); - $fx = (isset($attribs['fx'])?$attribs['fx']:$cx); - $fy = (isset($attribs['fy'])?$attribs['fy']:$cy); - $r = (isset($attribs['r'])?$attribs['r']:0.5); - if (isset($attribs['cx']) AND (substr($attribs['cx'], -1) != '%')) { - $this->svggradients[$this->svggradientid]['mode'] = 'measure'; - } else { - $this->svggradients[$this->svggradientid]['mode'] = 'percentage'; - } - if (isset($attribs['gradientTransform'])) { - $this->svggradients[$this->svggradientid]['gradientTransform'] = $this->getSVGTransformMatrix($attribs['gradientTransform']); - } - $this->svggradients[$this->svggradientid]['coords'] = array($cx, $cy, $fx, $fy, $r); - if (isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])) { - // gradient is defined on another place - $this->svggradients[$this->svggradientid]['xref'] = substr($attribs['xlink:href'], 1); - } - break; - } - case 'stop': { - // gradient stops - if (substr($attribs['offset'], -1) == '%') { - $offset = floatval(substr($attribs['offset'], -1)) / 100; - } else { - $offset = floatval($attribs['offset']); - if ($offset > 1) { - $offset /= 100; - } - } - $stop_color = isset($svgstyle['stop-color'])?$this->convertHTMLColorToDec($svgstyle['stop-color']):'black'; - $opacity = isset($svgstyle['stop-opacity'])?$svgstyle['stop-opacity']:1; - $this->svggradients[$this->svggradientid]['stops'][] = array('offset' => $offset, 'color' => $stop_color, 'opacity' => $opacity); - break; - } - // paths - case 'path': { - if ($invisible) { - break; - } - $d = trim($attribs['d']); - if ($clipping) { - $this->SVGTransform($tm); - $this->SVGPath($d, 'CNZ'); - } else { - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, 0, 0, 1, 1, 'SVGPath', array($d, 'CNZ')); - if (!empty($obstyle)) { - $this->SVGPath($d, $obstyle); - } - $this->StopTransform(); - } - break; - } - // shapes - case 'rect': { - if ($invisible) { - break; - } - $x = (isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false):0); - $y = (isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false):0); - $w = (isset($attribs['width'])?$this->getHTMLUnitToUnits($attribs['width'], 0, $this->svgunit, false):0); - $h = (isset($attribs['height'])?$this->getHTMLUnitToUnits($attribs['height'], 0, $this->svgunit, false):0); - $rx = (isset($attribs['rx'])?$this->getHTMLUnitToUnits($attribs['rx'], 0, $this->svgunit, false):0); - $ry = (isset($attribs['ry'])?$this->getHTMLUnitToUnits($attribs['ry'], 0, $this->svgunit, false):$rx); - if ($clipping) { - $this->SVGTransform($tm); - $this->RoundedRectXY($x, $y, $w, $h, $rx, $ry, '1111', 'CNZ', array(), array()); - } else { - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'RoundedRectXY', array($x, $y, $w, $h, $rx, $ry, '1111', 'CNZ')); - if (!empty($obstyle)) { - $this->RoundedRectXY($x, $y, $w, $h, $rx, $ry, '1111', $obstyle, array(), array()); - } - $this->StopTransform(); - } - break; - } - case 'circle': { - if ($invisible) { - break; - } - $cx = (isset($attribs['cx'])?$this->getHTMLUnitToUnits($attribs['cx'], 0, $this->svgunit, false):0); - $cy = (isset($attribs['cy'])?$this->getHTMLUnitToUnits($attribs['cy'], 0, $this->svgunit, false):0); - $r = (isset($attribs['r'])?$this->getHTMLUnitToUnits($attribs['r'], 0, $this->svgunit, false):0); - $x = $cx - $r; - $y = $cy - $r; - $w = 2 * $r; - $h = $w; - if ($clipping) { - $this->SVGTransform($tm); - $this->Circle($cx, $cy, $r, 0, 360, 'CNZ', array(), array(), 8); - } else { - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Circle', array($cx, $cy, $r, 0, 360, 'CNZ')); - if (!empty($obstyle)) { - $this->Circle($cx, $cy, $r, 0, 360, $obstyle, array(), array(), 8); - } - $this->StopTransform(); - } - break; - } - case 'ellipse': { - if ($invisible) { - break; - } - $cx = (isset($attribs['cx'])?$this->getHTMLUnitToUnits($attribs['cx'], 0, $this->svgunit, false):0); - $cy = (isset($attribs['cy'])?$this->getHTMLUnitToUnits($attribs['cy'], 0, $this->svgunit, false):0); - $rx = (isset($attribs['rx'])?$this->getHTMLUnitToUnits($attribs['rx'], 0, $this->svgunit, false):0); - $ry = (isset($attribs['ry'])?$this->getHTMLUnitToUnits($attribs['ry'], 0, $this->svgunit, false):0); - $x = $cx - $rx; - $y = $cy - $ry; - $w = 2 * $rx; - $h = 2 * $ry; - if ($clipping) { - $this->SVGTransform($tm); - $this->Ellipse($cx, $cy, $rx, $ry, 0, 0, 360, 'CNZ', array(), array(), 8); - } else { - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Ellipse', array($cx, $cy, $rx, $ry, 0, 0, 360, 'CNZ')); - if (!empty($obstyle)) { - $this->Ellipse($cx, $cy, $rx, $ry, 0, 0, 360, $obstyle, array(), array(), 8); - } - $this->StopTransform(); - } - break; - } - case 'line': { - if ($invisible) { - break; - } - $x1 = (isset($attribs['x1'])?$this->getHTMLUnitToUnits($attribs['x1'], 0, $this->svgunit, false):0); - $y1 = (isset($attribs['y1'])?$this->getHTMLUnitToUnits($attribs['y1'], 0, $this->svgunit, false):0); - $x2 = (isset($attribs['x2'])?$this->getHTMLUnitToUnits($attribs['x2'], 0, $this->svgunit, false):0); - $y2 = (isset($attribs['y2'])?$this->getHTMLUnitToUnits($attribs['y2'], 0, $this->svgunit, false):0); - $x = $x1; - $y = $y1; - $w = abs($x2 - $x1); - $h = abs($y2 - $y1); - if (!$clipping) { - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Line', array($x1, $y1, $x2, $y2)); - $this->Line($x1, $y1, $x2, $y2); - $this->StopTransform(); - } - break; - } - case 'polyline': - case 'polygon': { - if ($invisible) { - break; - } - $points = (isset($attribs['points'])?$attribs['points']:'0 0'); - $points = trim($points); - // note that point may use a complex syntax not covered here - $points = preg_split('/[\,\s]+/si', $points); - if (count($points) < 4) { - break; - } - $p = array(); - $xmin = 2147483647; - $xmax = 0; - $ymin = 2147483647; - $ymax = 0; - foreach ($points as $key => $val) { - $p[$key] = $this->getHTMLUnitToUnits($val, 0, $this->svgunit, false); - if (($key % 2) == 0) { - // X coordinate - $xmin = min($xmin, $p[$key]); - $xmax = max($xmax, $p[$key]); - } else { - // Y coordinate - $ymin = min($ymin, $p[$key]); - $ymax = max($ymax, $p[$key]); - } - } - $x = $xmin; - $y = $ymin; - $w = ($xmax - $xmin); - $h = ($ymax - $ymin); - if ($name == 'polyline') { - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'PolyLine', array($p, 'CNZ')); - $this->PolyLine($p, 'D', array(), array()); - $this->StopTransform(); - } else { // polygon - if ($clipping) { - $this->SVGTransform($tm); - $this->Polygon($p, 'CNZ', array(), array(), true); - } else { - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Polygon', array($p, 'CNZ')); - if (!empty($obstyle)) { - $this->Polygon($p, $obstyle, array(), array(), true); - } - $this->StopTransform(); - } - } - break; - } - // image - case 'image': { - if ($invisible) { - break; - } - if (!isset($attribs['xlink:href']) OR empty($attribs['xlink:href'])) { - break; - } - $x = (isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false):0); - $y = (isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false):0); - $w = (isset($attribs['width'])?$this->getHTMLUnitToUnits($attribs['width'], 0, $this->svgunit, false):0); - $h = (isset($attribs['height'])?$this->getHTMLUnitToUnits($attribs['height'], 0, $this->svgunit, false):0); - $img = $attribs['xlink:href']; - if (!$clipping) { - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h); - // fix image path - if (!$this->empty_string($this->svgdir) AND (($img{0} == '.') OR (basename($img) == $img))) { - // replace relative path with full server path - $img = $this->svgdir.'/'.$img; - } - if (($img{0} == '/') AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { - $findroot = strpos($img, $_SERVER['DOCUMENT_ROOT']); - if (($findroot === false) OR ($findroot > 1)) { - // replace relative path with full server path - $img = $_SERVER['DOCUMENT_ROOT'].$img; - } - } - $img = urldecode($img); - $testscrtype = @parse_url($img); - if (!isset($testscrtype['query']) OR empty($testscrtype['query'])) { - // convert URL to server path - $img = str_replace(K_PATH_URL, K_PATH_MAIN, $img); - } - $this->Image($img, $x, $y, $w, $h); - $this->StopTransform(); - } - break; - } - // text - case 'text': - case 'tspan': { - $this->svgtextmode['invisible'] = $invisible; - if ($invisible) { - break; - } - array_push($this->svgstyles, $svgstyle); - // only basic support - advanced features must be implemented - $x = (isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false):$this->x); - $y = (isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false):$this->y); - $svgstyle['text-color'] = $svgstyle['fill']; - $this->svgtext = ''; - if (isset($svgstyle['text-anchor'])) { - $this->svgtextmode['text-anchor'] = $svgstyle['text-anchor']; - } else { - $this->svgtextmode['text-anchor'] = 'start'; - } - if (isset($svgstyle['direction'])) { - if ($svgstyle['direction'] == 'rtl') { - $this->svgtextmode['rtl'] = true; - } else { - $this->svgtextmode['rtl'] = false; - } - } else { - $this->svgtextmode['rtl'] = false; - } - if (isset($svgstyle['stroke']) AND ($svgstyle['stroke'] != 'none') AND isset($svgstyle['stroke-width']) AND ($svgstyle['stroke-width'] > 0)) { - $this->svgtextmode['stroke'] = $this->getHTMLUnitToUnits($svgstyle['stroke-width'], 0, $this->svgunit, false); - } else { - $this->svgtextmode['stroke'] = false; - } - $this->StartTransform(); - $this->SVGTransform($tm); - $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, 1, 1); - $this->x = $x; - $this->y = $y; - break; - } - // use - case 'use': { - if (isset($attribs['xlink:href'])) { - $use = $this->svgdefs[substr($attribs['xlink:href'], 1)]; - if (isset($attribs['xlink:href'])) { - unset($attribs['xlink:href']); - } - if (isset($attribs['id'])) { - unset($attribs['id']); - } - $attribs = array_merge($use['attribs'], $attribs); - $this->startSVGElementHandler($parser, $use['name'], $use['attribs']); - } - break; - } - default: { - break; - } - } // end of switch - } - - /** - * Sets the closing SVG element handler function for the XML parser. - * @param resource $parser The first parameter, parser, is a reference to the XML parser calling the handler. - * @param string $name The second parameter, name, contains the name of the element for which this handler is called. If case-folding is in effect for this parser, the element name will be in uppercase letters. - * @author Nicola Asuni - * @since 5.0.000 (2010-05-02) - * @access protected - */ - protected function endSVGElementHandler($parser, $name) { - switch($name) { - case 'defs': { - $this->svgdefsmode = false; - break; - } - // clipPath - case 'clipPath': { - $this->svgclipmode = false; - break; - } - case 'g': { - // ungroup: remove last style from array - array_pop($this->svgstyles); - $this->StopTransform(); - break; - } - case 'text': - case 'tspan': { - if ($this->svgtextmode['invisible']) { - // This implementation must be fixed to following the rule: - // If the 'visibility' property is set to hidden on a 'tspan', 'tref' or 'altGlyph' element, then the text is invisible but still takes up space in text layout calculations. - break; - } - // print text - $text = $this->stringTrim($this->svgtext); - if ($this->svgtextmode['text-anchor'] != 'start') { - $textlen = $this->GetStringWidth($text); - // check if string is RTL text - if ($this->svgtextmode['text-anchor'] == 'end') { - if ($this->svgtextmode['rtl']) { - $this->x += $textlen; - } else { - $this->x -= $textlen; - } - } elseif ($this->svgtextmode['text-anchor'] == 'middle') { - if ($this->svgtextmode['rtl']) { - $this->x += ($textlen / 2); - } else { - $this->x -= ($textlen / 2); - } - } - } - $textrendermode = $this->textrendermode; - $textstrokewidth = $this->textstrokewidth; - $this->setTextRenderingMode($this->svgtextmode['stroke'], true, false); - $this->Cell(0, 0, $text, 0, 0, '', false, '', 0, false, 'L', 'T'); - // restore previous rendering mode - $this->textrendermode = $textrendermode; - $this->textstrokewidth = $textstrokewidth; - $this->svgtext = ''; - $this->StopTransform(); - array_pop($this->svgstyles); - break; - } - default: { - break; - } - } - } - - /** - * Sets the character data handler function for the XML parser. - * @param resource $parser The first parameter, parser, is a reference to the XML parser calling the handler. - * @param string $data The second parameter, data, contains the character data as a string. - * @author Nicola Asuni - * @since 5.0.000 (2010-05-02) - * @access protected - */ - protected function segSVGContentHandler($parser, $data) { - $this->svgtext .= $data; - } - - // --- END SVG METHODS ----------------------------- - -} // END OF TCPDF CLASS - -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/tcpdf/unicode_data.php b/include/limesurvey/admin/classes/tcpdf/unicode_data.php deleted file mode 100644 index 190dbc54..00000000 --- a/include/limesurvey/admin/classes/tcpdf/unicode_data.php +++ /dev/null @@ -1,18378 +0,0 @@ -. -// -// See LICENSE.TXT file for more information. -// ------------------------------------------------------------------- -// -// Description : Unicode data for TCPDF library. -// -//============================================================+ -// THANKS TO -// Efthimios Mavrogeorgiadis -// Saleh AlMatrafe - -/** - * Unicode data class for TCPDF library. - * @author Nicola Asuni - * @copyright 2008-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com - * @package com.tecnick.tcpdf - * @link http://www.tcpdf.org - * @license http://www.gnu.org/copyleft/lesser.html LGPL - * @since 2.1.000 (2008-01-08) -*/ - -/** -* This is a PHP class containing Unicde data for TCPDF library -* @name TCPDF_UNICODE_DATA -* @package com.tecnick.tcpdf -* @version 1.0.006 -* @author Nicola Asuni - info@tecnick.com -* @link http://www.tcpdf.org -* @license http://www.gnu.org/copyleft/lesser.html LGPL -*/ -class TCPDF_UNICODE_DATA { - -/** - * @var Unicode code for Left-to-Right Mark - * @access public - */ -public $uni_LRM = 8206; - -/** - * @var Unicode code for Right-to-Left Mark - * @access public - */ -public $uni_RLM = 8207; - -/** - * @var Unicode code for Left-to-Right Embedding - * @access public - */ -public $uni_LRE = 8234; - -/** - * @var Unicode code for Right-to-Left Embedding - * @access public - */ -public $uni_RLE = 8235; - -/** - * @var Unicode code for Pop Directional Format - * @access public - */ -public $uni_PDF = 8236; - -/** - * @var Unicode code for Left-to-Right Override - * @access public - */ -public $uni_LRO = 8237; - -/** - * @var Unicode code for Right-to-Left Override - * @access public - */ -public $uni_RLO = 8238; - -/* - * @var Pattern to test RTL (Righ-To-Left) strings using regular expressions. - * @access public - */ -public $uni_RE_PATTERN_RTL = "/( - \xD6\xBE # R - | \xD7[\x80\x83\x86\x90-\xAA\xB0-\xB4] # R - | \xDF[\x80-\xAA\xB4\xB5\xBA] # R - | \xE2\x80\x8F # R - | \xEF\xAC[\x9D\x9F\xA0-\xA8\xAA-\xB6\xB8-\xBC\xBE] # R - | \xEF\xAD[\x80\x81\x83\x84\x86-\x8F] # R - | \xF0\x90\xA0[\x80-\x85\x88\x8A-\xB5\xB7\xB8\xBC\xBF] # R - | \xF0\x90\xA4[\x80-\x99] # R - | \xF0\x90\xA8[\x80\x90-\x93\x95-\x97\x99-\xB3] # R - | \xF0\x90\xA9[\x80-\x87\x90-\x98] # R - | \xE2\x80[\xAB\xAE] # RLE & RLO - )/x"; - -/* - * @var Pattern to test Arabic strings using regular expressions. - * Source: http://www.w3.org/International/questions/qa-forms-utf-8 - * @access public - */ -public $uni_RE_PATTERN_ARABIC = "/( - \xD8[\x80-\x83\x8B\x8D\x9B\x9E\x9F\xA1-\xBA] # AL - | \xD9[\x80-\x8A\xAD-\xAF\xB1-\xBF] # AL - | \xDA[\x80-\xBF] # AL - | \xDB[\x80-\x95\x9D\xA5\xA6\xAE\xAF\xBA-\xBF] # AL - | \xDC[\x80-\x8D\x90\x92-\xAF] # AL - | \xDD[\x8D-\xAD] # AL - | \xDE[\x80-\xA5\xB1] # AL - | \xEF\xAD[\x90-\xBF] # AL - | \xEF\xAE[\x80-\xB1] # AL - | \xEF\xAF[\x93-\xBF] # AL - | \xEF[\xB0-\xB3][\x80-\xBF] # AL - | \xEF\xB4[\x80-\xBD] # AL - | \xEF\xB5[\x90-\xBF] # AL - | \xEF\xB6[\x80-\x8F\x92-\xBF] # AL - | \xEF\xB7[\x80-\x87\xB0-\xBC] # AL - | \xEF\xB9[\xB0-\xB4\xB6-\xBF] # AL - | \xEF\xBA[\x80-\xBF] # AL - | \xEF\xBB[\x80-\xBC] # AL - | \xD9[\xA0-\xA9\xAB\xAC] # AN - )/x"; - -/** - * @var Array of Unicode types - * @access public - */ -public $uni_type = array( -0=>'BN', -1=>'BN', -2=>'BN', -3=>'BN', -4=>'BN', -5=>'BN', -6=>'BN', -7=>'BN', -8=>'BN', -9=>'S', -10=>'B', -11=>'S', -12=>'WS', -13=>'B', -14=>'BN', -15=>'BN', -16=>'BN', -17=>'BN', -18=>'BN', -19=>'BN', -20=>'BN', -21=>'BN', -22=>'BN', -23=>'BN', -24=>'BN', -25=>'BN', -26=>'BN', -27=>'BN', -28=>'B', -29=>'B', -30=>'B', -31=>'S', -32=>'WS', -33=>'ON', -34=>'ON', -35=>'ET', -36=>'ET', -37=>'ET', -38=>'ON', -39=>'ON', -40=>'ON', -41=>'ON', -42=>'ON', -43=>'ES', -44=>'CS', -45=>'ES', -46=>'CS', -47=>'CS', -48=>'EN', -49=>'EN', -50=>'EN', -51=>'EN', -52=>'EN', -53=>'EN', -54=>'EN', -55=>'EN', -56=>'EN', -57=>'EN', -58=>'CS', -59=>'ON', -60=>'ON', -61=>'ON', -62=>'ON', -63=>'ON', -64=>'ON', -65=>'L', -66=>'L', -67=>'L', -68=>'L', -69=>'L', -70=>'L', -71=>'L', -72=>'L', -73=>'L', -74=>'L', -75=>'L', -76=>'L', -77=>'L', -78=>'L', -79=>'L', -80=>'L', -81=>'L', -82=>'L', -83=>'L', -84=>'L', -85=>'L', -86=>'L', -87=>'L', -88=>'L', -89=>'L', -90=>'L', -91=>'ON', -92=>'ON', -93=>'ON', -94=>'ON', -95=>'ON', -96=>'ON', -97=>'L', -98=>'L', -99=>'L', -100=>'L', -101=>'L', -102=>'L', -103=>'L', -104=>'L', -105=>'L', -106=>'L', -107=>'L', -108=>'L', -109=>'L', -110=>'L', -111=>'L', -112=>'L', -113=>'L', -114=>'L', -115=>'L', -116=>'L', -117=>'L', -118=>'L', -119=>'L', -120=>'L', -121=>'L', -122=>'L', -123=>'ON', -124=>'ON', -125=>'ON', -126=>'ON', -127=>'BN', -128=>'BN', -129=>'BN', -130=>'BN', -131=>'BN', -132=>'BN', -133=>'B', -134=>'BN', -135=>'BN', -136=>'BN', -137=>'BN', -138=>'BN', -139=>'BN', -140=>'BN', -141=>'BN', -142=>'BN', -143=>'BN', -144=>'BN', -145=>'BN', -146=>'BN', -147=>'BN', -148=>'BN', -149=>'BN', -150=>'BN', -151=>'BN', -152=>'BN', -153=>'BN', -154=>'BN', -155=>'BN', -156=>'BN', -157=>'BN', -158=>'BN', -159=>'BN', -160=>'CS', -161=>'ON', -162=>'ET', -163=>'ET', -164=>'ET', -165=>'ET', -166=>'ON', -167=>'ON', -168=>'ON', -169=>'ON', -170=>'L', -171=>'ON', -172=>'ON', -173=>'BN', -174=>'ON', -175=>'ON', -176=>'ET', -177=>'ET', -178=>'EN', -179=>'EN', -180=>'ON', -181=>'L', -182=>'ON', -183=>'ON', -184=>'ON', -185=>'EN', -186=>'L', -187=>'ON', -188=>'ON', -189=>'ON', -190=>'ON', -191=>'ON', -192=>'L', -193=>'L', -194=>'L', -195=>'L', -196=>'L', -197=>'L', -198=>'L', -199=>'L', -200=>'L', -201=>'L', -202=>'L', -203=>'L', -204=>'L', -205=>'L', -206=>'L', -207=>'L', -208=>'L', -209=>'L', -210=>'L', -211=>'L', -212=>'L', -213=>'L', -214=>'L', -215=>'ON', -216=>'L', -217=>'L', -218=>'L', -219=>'L', -220=>'L', -221=>'L', -222=>'L', -223=>'L', -224=>'L', -225=>'L', -226=>'L', -227=>'L', -228=>'L', -229=>'L', -230=>'L', -231=>'L', -232=>'L', -233=>'L', -234=>'L', -235=>'L', -236=>'L', -237=>'L', -238=>'L', -239=>'L', -240=>'L', -241=>'L', -242=>'L', -243=>'L', -244=>'L', -245=>'L', -246=>'L', -247=>'ON', -248=>'L', -249=>'L', -250=>'L', -251=>'L', -252=>'L', -253=>'L', -254=>'L', -255=>'L', -256=>'L', -257=>'L', -258=>'L', -259=>'L', -260=>'L', -261=>'L', -262=>'L', -263=>'L', -264=>'L', -265=>'L', -266=>'L', -267=>'L', -268=>'L', -269=>'L', -270=>'L', -271=>'L', -272=>'L', -273=>'L', -274=>'L', -275=>'L', -276=>'L', -277=>'L', -278=>'L', -279=>'L', -280=>'L', -281=>'L', -282=>'L', -283=>'L', -284=>'L', -285=>'L', -286=>'L', -287=>'L', -288=>'L', -289=>'L', -290=>'L', -291=>'L', -292=>'L', -293=>'L', -294=>'L', -295=>'L', -296=>'L', -297=>'L', -298=>'L', -299=>'L', -300=>'L', -301=>'L', -302=>'L', -303=>'L', -304=>'L', -305=>'L', -306=>'L', -307=>'L', -308=>'L', -309=>'L', -310=>'L', -311=>'L', -312=>'L', -313=>'L', -314=>'L', -315=>'L', -316=>'L', -317=>'L', -318=>'L', -319=>'L', -320=>'L', -321=>'L', -322=>'L', -323=>'L', -324=>'L', -325=>'L', -326=>'L', -327=>'L', -328=>'L', -329=>'L', -330=>'L', -331=>'L', -332=>'L', -333=>'L', -334=>'L', -335=>'L', -336=>'L', -337=>'L', -338=>'L', -339=>'L', -340=>'L', -341=>'L', -342=>'L', -343=>'L', -344=>'L', -345=>'L', -346=>'L', -347=>'L', -348=>'L', -349=>'L', -350=>'L', -351=>'L', -352=>'L', -353=>'L', -354=>'L', -355=>'L', -356=>'L', -357=>'L', -358=>'L', -359=>'L', -360=>'L', -361=>'L', -362=>'L', -363=>'L', -364=>'L', -365=>'L', -366=>'L', -367=>'L', -368=>'L', -369=>'L', -370=>'L', -371=>'L', -372=>'L', -373=>'L', -374=>'L', -375=>'L', -376=>'L', -377=>'L', -378=>'L', -379=>'L', -380=>'L', -381=>'L', -382=>'L', -383=>'L', -384=>'L', -385=>'L', -386=>'L', -387=>'L', -388=>'L', -389=>'L', -390=>'L', -391=>'L', -392=>'L', -393=>'L', -394=>'L', -395=>'L', -396=>'L', -397=>'L', -398=>'L', -399=>'L', -400=>'L', -401=>'L', -402=>'L', -403=>'L', -404=>'L', -405=>'L', -406=>'L', -407=>'L', -408=>'L', -409=>'L', -410=>'L', -411=>'L', -412=>'L', -413=>'L', -414=>'L', -415=>'L', -416=>'L', -417=>'L', -418=>'L', -419=>'L', -420=>'L', -421=>'L', -422=>'L', -423=>'L', -424=>'L', -425=>'L', -426=>'L', -427=>'L', -428=>'L', -429=>'L', -430=>'L', -431=>'L', -432=>'L', -433=>'L', -434=>'L', -435=>'L', -436=>'L', -437=>'L', -438=>'L', -439=>'L', -440=>'L', -441=>'L', -442=>'L', -443=>'L', -444=>'L', -445=>'L', -446=>'L', -447=>'L', -448=>'L', -449=>'L', -450=>'L', -451=>'L', -452=>'L', -453=>'L', -454=>'L', -455=>'L', -456=>'L', -457=>'L', -458=>'L', -459=>'L', -460=>'L', -461=>'L', -462=>'L', -463=>'L', -464=>'L', -465=>'L', -466=>'L', -467=>'L', -468=>'L', -469=>'L', -470=>'L', -471=>'L', -472=>'L', -473=>'L', -474=>'L', -475=>'L', -476=>'L', -477=>'L', -478=>'L', -479=>'L', -480=>'L', -481=>'L', -482=>'L', -483=>'L', -484=>'L', -485=>'L', -486=>'L', -487=>'L', -488=>'L', -489=>'L', -490=>'L', -491=>'L', -492=>'L', -493=>'L', -494=>'L', -495=>'L', -496=>'L', -497=>'L', -498=>'L', -499=>'L', -500=>'L', -501=>'L', -502=>'L', -503=>'L', -504=>'L', -505=>'L', -506=>'L', -507=>'L', -508=>'L', -509=>'L', -510=>'L', -511=>'L', -512=>'L', -513=>'L', -514=>'L', -515=>'L', -516=>'L', -517=>'L', -518=>'L', -519=>'L', -520=>'L', -521=>'L', -522=>'L', -523=>'L', -524=>'L', -525=>'L', -526=>'L', -527=>'L', -528=>'L', -529=>'L', -530=>'L', -531=>'L', -532=>'L', -533=>'L', -534=>'L', -535=>'L', -536=>'L', -537=>'L', -538=>'L', -539=>'L', -540=>'L', -541=>'L', -542=>'L', -543=>'L', -544=>'L', -545=>'L', -546=>'L', -547=>'L', -548=>'L', -549=>'L', -550=>'L', -551=>'L', -552=>'L', -553=>'L', -554=>'L', -555=>'L', -556=>'L', -557=>'L', -558=>'L', -559=>'L', -560=>'L', -561=>'L', -562=>'L', -563=>'L', -564=>'L', -565=>'L', -566=>'L', -567=>'L', -568=>'L', -569=>'L', -570=>'L', -571=>'L', -572=>'L', -573=>'L', -574=>'L', -575=>'L', -576=>'L', -577=>'L', -578=>'L', -579=>'L', -580=>'L', -581=>'L', -582=>'L', -583=>'L', -584=>'L', -585=>'L', -586=>'L', -587=>'L', -588=>'L', -589=>'L', -590=>'L', -591=>'L', -592=>'L', -593=>'L', -594=>'L', -595=>'L', -596=>'L', -597=>'L', -598=>'L', -599=>'L', -600=>'L', -601=>'L', -602=>'L', -603=>'L', -604=>'L', -605=>'L', -606=>'L', -607=>'L', -608=>'L', -609=>'L', -610=>'L', -611=>'L', -612=>'L', -613=>'L', -614=>'L', -615=>'L', -616=>'L', -617=>'L', -618=>'L', -619=>'L', -620=>'L', -621=>'L', -622=>'L', -623=>'L', -624=>'L', -625=>'L', -626=>'L', -627=>'L', -628=>'L', -629=>'L', -630=>'L', -631=>'L', -632=>'L', -633=>'L', -634=>'L', -635=>'L', -636=>'L', -637=>'L', -638=>'L', -639=>'L', -640=>'L', -641=>'L', -642=>'L', -643=>'L', -644=>'L', -645=>'L', -646=>'L', -647=>'L', -648=>'L', -649=>'L', -650=>'L', -651=>'L', -652=>'L', -653=>'L', -654=>'L', -655=>'L', -656=>'L', -657=>'L', -658=>'L', -659=>'L', -660=>'L', -661=>'L', -662=>'L', -663=>'L', -664=>'L', -665=>'L', -666=>'L', -667=>'L', -668=>'L', -669=>'L', -670=>'L', -671=>'L', -672=>'L', -673=>'L', -674=>'L', -675=>'L', -676=>'L', -677=>'L', -678=>'L', -679=>'L', -680=>'L', -681=>'L', -682=>'L', -683=>'L', -684=>'L', -685=>'L', -686=>'L', -687=>'L', -688=>'L', -689=>'L', -690=>'L', -691=>'L', -692=>'L', -693=>'L', -694=>'L', -695=>'L', -696=>'L', -697=>'ON', -698=>'ON', -699=>'L', -700=>'L', -701=>'L', -702=>'L', -703=>'L', -704=>'L', -705=>'L', -706=>'ON', -707=>'ON', -708=>'ON', -709=>'ON', -710=>'ON', -711=>'ON', -712=>'ON', -713=>'ON', -714=>'ON', -715=>'ON', -716=>'ON', -717=>'ON', -718=>'ON', -719=>'ON', -720=>'L', -721=>'L', -722=>'ON', -723=>'ON', -724=>'ON', -725=>'ON', -726=>'ON', -727=>'ON', -728=>'ON', -729=>'ON', -730=>'ON', -731=>'ON', -732=>'ON', -733=>'ON', -734=>'ON', -735=>'ON', -736=>'L', -737=>'L', -738=>'L', -739=>'L', -740=>'L', -741=>'ON', -742=>'ON', -743=>'ON', -744=>'ON', -745=>'ON', -746=>'ON', -747=>'ON', -748=>'ON', -749=>'ON', -750=>'L', -751=>'ON', -752=>'ON', -753=>'ON', -754=>'ON', -755=>'ON', -756=>'ON', -757=>'ON', -758=>'ON', -759=>'ON', -760=>'ON', -761=>'ON', -762=>'ON', -763=>'ON', -764=>'ON', -765=>'ON', -766=>'ON', -767=>'ON', -768=>'NSM', -769=>'NSM', -770=>'NSM', -771=>'NSM', -772=>'NSM', -773=>'NSM', -774=>'NSM', -775=>'NSM', -776=>'NSM', -777=>'NSM', -778=>'NSM', -779=>'NSM', -780=>'NSM', -781=>'NSM', -782=>'NSM', -783=>'NSM', -784=>'NSM', -785=>'NSM', -786=>'NSM', -787=>'NSM', -788=>'NSM', -789=>'NSM', -790=>'NSM', -791=>'NSM', -792=>'NSM', -793=>'NSM', -794=>'NSM', -795=>'NSM', -796=>'NSM', -797=>'NSM', -798=>'NSM', -799=>'NSM', -800=>'NSM', -801=>'NSM', -802=>'NSM', -803=>'NSM', -804=>'NSM', -805=>'NSM', -806=>'NSM', -807=>'NSM', -808=>'NSM', -809=>'NSM', -810=>'NSM', -811=>'NSM', -812=>'NSM', -813=>'NSM', -814=>'NSM', -815=>'NSM', -816=>'NSM', -817=>'NSM', -818=>'NSM', -819=>'NSM', -820=>'NSM', -821=>'NSM', -822=>'NSM', -823=>'NSM', -824=>'NSM', -825=>'NSM', -826=>'NSM', -827=>'NSM', -828=>'NSM', -829=>'NSM', -830=>'NSM', -831=>'NSM', -832=>'NSM', -833=>'NSM', -834=>'NSM', -835=>'NSM', -836=>'NSM', -837=>'NSM', -838=>'NSM', -839=>'NSM', -840=>'NSM', -841=>'NSM', -842=>'NSM', -843=>'NSM', -844=>'NSM', -845=>'NSM', -846=>'NSM', -847=>'NSM', -848=>'NSM', -849=>'NSM', -850=>'NSM', -851=>'NSM', -852=>'NSM', -853=>'NSM', -854=>'NSM', -855=>'NSM', -856=>'NSM', -857=>'NSM', -858=>'NSM', -859=>'NSM', -860=>'NSM', -861=>'NSM', -862=>'NSM', -863=>'NSM', -864=>'NSM', -865=>'NSM', -866=>'NSM', -867=>'NSM', -868=>'NSM', -869=>'NSM', -870=>'NSM', -871=>'NSM', -872=>'NSM', -873=>'NSM', -874=>'NSM', -875=>'NSM', -876=>'NSM', -877=>'NSM', -878=>'NSM', -879=>'NSM', -884=>'ON', -885=>'ON', -890=>'L', -891=>'L', -892=>'L', -893=>'L', -894=>'ON', -900=>'ON', -901=>'ON', -902=>'L', -903=>'ON', -904=>'L', -905=>'L', -906=>'L', -908=>'L', -910=>'L', -911=>'L', -912=>'L', -913=>'L', -914=>'L', -915=>'L', -916=>'L', -917=>'L', -918=>'L', -919=>'L', -920=>'L', -921=>'L', -922=>'L', -923=>'L', -924=>'L', -925=>'L', -926=>'L', -927=>'L', -928=>'L', -929=>'L', -931=>'L', -932=>'L', -933=>'L', -934=>'L', -935=>'L', -936=>'L', -937=>'L', -938=>'L', -939=>'L', -940=>'L', -941=>'L', -942=>'L', -943=>'L', -944=>'L', -945=>'L', -946=>'L', -947=>'L', -948=>'L', -949=>'L', -950=>'L', -951=>'L', -952=>'L', -953=>'L', -954=>'L', -955=>'L', -956=>'L', -957=>'L', -958=>'L', -959=>'L', -960=>'L', -961=>'L', -962=>'L', -963=>'L', -964=>'L', -965=>'L', -966=>'L', -967=>'L', -968=>'L', -969=>'L', -970=>'L', -971=>'L', -972=>'L', -973=>'L', -974=>'L', -976=>'L', -977=>'L', -978=>'L', -979=>'L', -980=>'L', -981=>'L', -982=>'L', -983=>'L', -984=>'L', -985=>'L', -986=>'L', -987=>'L', -988=>'L', -989=>'L', -990=>'L', -991=>'L', -992=>'L', -993=>'L', -994=>'L', -995=>'L', -996=>'L', -997=>'L', -998=>'L', -999=>'L', -1000=>'L', -1001=>'L', -1002=>'L', -1003=>'L', -1004=>'L', -1005=>'L', -1006=>'L', -1007=>'L', -1008=>'L', -1009=>'L', -1010=>'L', -1011=>'L', -1012=>'L', -1013=>'L', -1014=>'ON', -1015=>'L', -1016=>'L', -1017=>'L', -1018=>'L', -1019=>'L', -1020=>'L', -1021=>'L', -1022=>'L', -1023=>'L', -1024=>'L', -1025=>'L', -1026=>'L', -1027=>'L', -1028=>'L', -1029=>'L', -1030=>'L', -1031=>'L', -1032=>'L', -1033=>'L', -1034=>'L', -1035=>'L', -1036=>'L', -1037=>'L', -1038=>'L', -1039=>'L', -1040=>'L', -1041=>'L', -1042=>'L', -1043=>'L', -1044=>'L', -1045=>'L', -1046=>'L', -1047=>'L', -1048=>'L', -1049=>'L', -1050=>'L', -1051=>'L', -1052=>'L', -1053=>'L', -1054=>'L', -1055=>'L', -1056=>'L', -1057=>'L', -1058=>'L', -1059=>'L', -1060=>'L', -1061=>'L', -1062=>'L', -1063=>'L', -1064=>'L', -1065=>'L', -1066=>'L', -1067=>'L', -1068=>'L', -1069=>'L', -1070=>'L', -1071=>'L', -1072=>'L', -1073=>'L', -1074=>'L', -1075=>'L', -1076=>'L', -1077=>'L', -1078=>'L', -1079=>'L', -1080=>'L', -1081=>'L', -1082=>'L', -1083=>'L', -1084=>'L', -1085=>'L', -1086=>'L', -1087=>'L', -1088=>'L', -1089=>'L', -1090=>'L', -1091=>'L', -1092=>'L', -1093=>'L', -1094=>'L', -1095=>'L', -1096=>'L', -1097=>'L', -1098=>'L', -1099=>'L', -1100=>'L', -1101=>'L', -1102=>'L', -1103=>'L', -1104=>'L', -1105=>'L', -1106=>'L', -1107=>'L', -1108=>'L', -1109=>'L', -1110=>'L', -1111=>'L', -1112=>'L', -1113=>'L', -1114=>'L', -1115=>'L', -1116=>'L', -1117=>'L', -1118=>'L', -1119=>'L', -1120=>'L', -1121=>'L', -1122=>'L', -1123=>'L', -1124=>'L', -1125=>'L', -1126=>'L', -1127=>'L', -1128=>'L', -1129=>'L', -1130=>'L', -1131=>'L', -1132=>'L', -1133=>'L', -1134=>'L', -1135=>'L', -1136=>'L', -1137=>'L', -1138=>'L', -1139=>'L', -1140=>'L', -1141=>'L', -1142=>'L', -1143=>'L', -1144=>'L', -1145=>'L', -1146=>'L', -1147=>'L', -1148=>'L', -1149=>'L', -1150=>'L', -1151=>'L', -1152=>'L', -1153=>'L', -1154=>'L', -1155=>'NSM', -1156=>'NSM', -1157=>'NSM', -1158=>'NSM', -1160=>'NSM', -1161=>'NSM', -1162=>'L', -1163=>'L', -1164=>'L', -1165=>'L', -1166=>'L', -1167=>'L', -1168=>'L', -1169=>'L', -1170=>'L', -1171=>'L', -1172=>'L', -1173=>'L', -1174=>'L', -1175=>'L', -1176=>'L', -1177=>'L', -1178=>'L', -1179=>'L', -1180=>'L', -1181=>'L', -1182=>'L', -1183=>'L', -1184=>'L', -1185=>'L', -1186=>'L', -1187=>'L', -1188=>'L', -1189=>'L', -1190=>'L', -1191=>'L', -1192=>'L', -1193=>'L', -1194=>'L', -1195=>'L', -1196=>'L', -1197=>'L', -1198=>'L', -1199=>'L', -1200=>'L', -1201=>'L', -1202=>'L', -1203=>'L', -1204=>'L', -1205=>'L', -1206=>'L', -1207=>'L', -1208=>'L', -1209=>'L', -1210=>'L', -1211=>'L', -1212=>'L', -1213=>'L', -1214=>'L', -1215=>'L', -1216=>'L', -1217=>'L', -1218=>'L', -1219=>'L', -1220=>'L', -1221=>'L', -1222=>'L', -1223=>'L', -1224=>'L', -1225=>'L', -1226=>'L', -1227=>'L', -1228=>'L', -1229=>'L', -1230=>'L', -1231=>'L', -1232=>'L', -1233=>'L', -1234=>'L', -1235=>'L', -1236=>'L', -1237=>'L', -1238=>'L', -1239=>'L', -1240=>'L', -1241=>'L', -1242=>'L', -1243=>'L', -1244=>'L', -1245=>'L', -1246=>'L', -1247=>'L', -1248=>'L', -1249=>'L', -1250=>'L', -1251=>'L', -1252=>'L', -1253=>'L', -1254=>'L', -1255=>'L', -1256=>'L', -1257=>'L', -1258=>'L', -1259=>'L', -1260=>'L', -1261=>'L', -1262=>'L', -1263=>'L', -1264=>'L', -1265=>'L', -1266=>'L', -1267=>'L', -1268=>'L', -1269=>'L', -1270=>'L', -1271=>'L', -1272=>'L', -1273=>'L', -1274=>'L', -1275=>'L', -1276=>'L', -1277=>'L', -1278=>'L', -1279=>'L', -1280=>'L', -1281=>'L', -1282=>'L', -1283=>'L', -1284=>'L', -1285=>'L', -1286=>'L', -1287=>'L', -1288=>'L', -1289=>'L', -1290=>'L', -1291=>'L', -1292=>'L', -1293=>'L', -1294=>'L', -1295=>'L', -1296=>'L', -1297=>'L', -1298=>'L', -1299=>'L', -1329=>'L', -1330=>'L', -1331=>'L', -1332=>'L', -1333=>'L', -1334=>'L', -1335=>'L', -1336=>'L', -1337=>'L', -1338=>'L', -1339=>'L', -1340=>'L', -1341=>'L', -1342=>'L', -1343=>'L', -1344=>'L', -1345=>'L', -1346=>'L', -1347=>'L', -1348=>'L', -1349=>'L', -1350=>'L', -1351=>'L', -1352=>'L', -1353=>'L', -1354=>'L', -1355=>'L', -1356=>'L', -1357=>'L', -1358=>'L', -1359=>'L', -1360=>'L', -1361=>'L', -1362=>'L', -1363=>'L', -1364=>'L', -1365=>'L', -1366=>'L', -1369=>'L', -1370=>'L', -1371=>'L', -1372=>'L', -1373=>'L', -1374=>'L', -1375=>'L', -1377=>'L', -1378=>'L', -1379=>'L', -1380=>'L', -1381=>'L', -1382=>'L', -1383=>'L', -1384=>'L', -1385=>'L', -1386=>'L', -1387=>'L', -1388=>'L', -1389=>'L', -1390=>'L', -1391=>'L', -1392=>'L', -1393=>'L', -1394=>'L', -1395=>'L', -1396=>'L', -1397=>'L', -1398=>'L', -1399=>'L', -1400=>'L', -1401=>'L', -1402=>'L', -1403=>'L', -1404=>'L', -1405=>'L', -1406=>'L', -1407=>'L', -1408=>'L', -1409=>'L', -1410=>'L', -1411=>'L', -1412=>'L', -1413=>'L', -1414=>'L', -1415=>'L', -1417=>'L', -1418=>'ON', -1425=>'NSM', -1426=>'NSM', -1427=>'NSM', -1428=>'NSM', -1429=>'NSM', -1430=>'NSM', -1431=>'NSM', -1432=>'NSM', -1433=>'NSM', -1434=>'NSM', -1435=>'NSM', -1436=>'NSM', -1437=>'NSM', -1438=>'NSM', -1439=>'NSM', -1440=>'NSM', -1441=>'NSM', -1442=>'NSM', -1443=>'NSM', -1444=>'NSM', -1445=>'NSM', -1446=>'NSM', -1447=>'NSM', -1448=>'NSM', -1449=>'NSM', -1450=>'NSM', -1451=>'NSM', -1452=>'NSM', -1453=>'NSM', -1454=>'NSM', -1455=>'NSM', -1456=>'NSM', -1457=>'NSM', -1458=>'NSM', -1459=>'NSM', -1460=>'NSM', -1461=>'NSM', -1462=>'NSM', -1463=>'NSM', -1464=>'NSM', -1465=>'NSM', -1466=>'NSM', -1467=>'NSM', -1468=>'NSM', -1469=>'NSM', -1470=>'R', -1471=>'NSM', -1472=>'R', -1473=>'NSM', -1474=>'NSM', -1475=>'R', -1476=>'NSM', -1477=>'NSM', -1478=>'R', -1479=>'NSM', -1488=>'R', -1489=>'R', -1490=>'R', -1491=>'R', -1492=>'R', -1493=>'R', -1494=>'R', -1495=>'R', -1496=>'R', -1497=>'R', -1498=>'R', -1499=>'R', -1500=>'R', -1501=>'R', -1502=>'R', -1503=>'R', -1504=>'R', -1505=>'R', -1506=>'R', -1507=>'R', -1508=>'R', -1509=>'R', -1510=>'R', -1511=>'R', -1512=>'R', -1513=>'R', -1514=>'R', -1520=>'R', -1521=>'R', -1522=>'R', -1523=>'R', -1524=>'R', -1536=>'AL', -1537=>'AL', -1538=>'AL', -1539=>'AL', -1547=>'AL', -1548=>'CS', -1549=>'AL', -1550=>'ON', -1551=>'ON', -1552=>'NSM', -1553=>'NSM', -1554=>'NSM', -1555=>'NSM', -1556=>'NSM', -1557=>'NSM', -1563=>'AL', -1566=>'AL', -1567=>'AL', -1569=>'AL', -1570=>'AL', -1571=>'AL', -1572=>'AL', -1573=>'AL', -1574=>'AL', -1575=>'AL', -1576=>'AL', -1577=>'AL', -1578=>'AL', -1579=>'AL', -1580=>'AL', -1581=>'AL', -1582=>'AL', -1583=>'AL', -1584=>'AL', -1585=>'AL', -1586=>'AL', -1587=>'AL', -1588=>'AL', -1589=>'AL', -1590=>'AL', -1591=>'AL', -1592=>'AL', -1593=>'AL', -1594=>'AL', -1600=>'AL', -1601=>'AL', -1602=>'AL', -1603=>'AL', -1604=>'AL', -1605=>'AL', -1606=>'AL', -1607=>'AL', -1608=>'AL', -1609=>'AL', -1610=>'AL', -1611=>'NSM', -1612=>'NSM', -1613=>'NSM', -1614=>'NSM', -1615=>'NSM', -1616=>'NSM', -1617=>'NSM', -1618=>'NSM', -1619=>'NSM', -1620=>'NSM', -1621=>'NSM', -1622=>'NSM', -1623=>'NSM', -1624=>'NSM', -1625=>'NSM', -1626=>'NSM', -1627=>'NSM', -1628=>'NSM', -1629=>'NSM', -1630=>'NSM', -1632=>'AN', -1633=>'AN', -1634=>'AN', -1635=>'AN', -1636=>'AN', -1637=>'AN', -1638=>'AN', -1639=>'AN', -1640=>'AN', -1641=>'AN', -1642=>'ET', -1643=>'AN', -1644=>'AN', -1645=>'AL', -1646=>'AL', -1647=>'AL', -1648=>'NSM', -1649=>'AL', -1650=>'AL', -1651=>'AL', -1652=>'AL', -1653=>'AL', -1654=>'AL', -1655=>'AL', -1656=>'AL', -1657=>'AL', -1658=>'AL', -1659=>'AL', -1660=>'AL', -1661=>'AL', -1662=>'AL', -1663=>'AL', -1664=>'AL', -1665=>'AL', -1666=>'AL', -1667=>'AL', -1668=>'AL', -1669=>'AL', -1670=>'AL', -1671=>'AL', -1672=>'AL', -1673=>'AL', -1674=>'AL', -1675=>'AL', -1676=>'AL', -1677=>'AL', -1678=>'AL', -1679=>'AL', -1680=>'AL', -1681=>'AL', -1682=>'AL', -1683=>'AL', -1684=>'AL', -1685=>'AL', -1686=>'AL', -1687=>'AL', -1688=>'AL', -1689=>'AL', -1690=>'AL', -1691=>'AL', -1692=>'AL', -1693=>'AL', -1694=>'AL', -1695=>'AL', -1696=>'AL', -1697=>'AL', -1698=>'AL', -1699=>'AL', -1700=>'AL', -1701=>'AL', -1702=>'AL', -1703=>'AL', -1704=>'AL', -1705=>'AL', -1706=>'AL', -1707=>'AL', -1708=>'AL', -1709=>'AL', -1710=>'AL', -1711=>'AL', -1712=>'AL', -1713=>'AL', -1714=>'AL', -1715=>'AL', -1716=>'AL', -1717=>'AL', -1718=>'AL', -1719=>'AL', -1720=>'AL', -1721=>'AL', -1722=>'AL', -1723=>'AL', -1724=>'AL', -1725=>'AL', -1726=>'AL', -1727=>'AL', -1728=>'AL', -1729=>'AL', -1730=>'AL', -1731=>'AL', -1732=>'AL', -1733=>'AL', -1734=>'AL', -1735=>'AL', -1736=>'AL', -1737=>'AL', -1738=>'AL', -1739=>'AL', -1740=>'AL', -1741=>'AL', -1742=>'AL', -1743=>'AL', -1744=>'AL', -1745=>'AL', -1746=>'AL', -1747=>'AL', -1748=>'AL', -1749=>'AL', -1750=>'NSM', -1751=>'NSM', -1752=>'NSM', -1753=>'NSM', -1754=>'NSM', -1755=>'NSM', -1756=>'NSM', -1757=>'AL', -1758=>'NSM', -1759=>'NSM', -1760=>'NSM', -1761=>'NSM', -1762=>'NSM', -1763=>'NSM', -1764=>'NSM', -1765=>'AL', -1766=>'AL', -1767=>'NSM', -1768=>'NSM', -1769=>'ON', -1770=>'NSM', -1771=>'NSM', -1772=>'NSM', -1773=>'NSM', -1774=>'AL', -1775=>'AL', -1776=>'EN', -1777=>'EN', -1778=>'EN', -1779=>'EN', -1780=>'EN', -1781=>'EN', -1782=>'EN', -1783=>'EN', -1784=>'EN', -1785=>'EN', -1786=>'AL', -1787=>'AL', -1788=>'AL', -1789=>'AL', -1790=>'AL', -1791=>'AL', -1792=>'AL', -1793=>'AL', -1794=>'AL', -1795=>'AL', -1796=>'AL', -1797=>'AL', -1798=>'AL', -1799=>'AL', -1800=>'AL', -1801=>'AL', -1802=>'AL', -1803=>'AL', -1804=>'AL', -1805=>'AL', -1807=>'BN', -1808=>'AL', -1809=>'NSM', -1810=>'AL', -1811=>'AL', -1812=>'AL', -1813=>'AL', -1814=>'AL', -1815=>'AL', -1816=>'AL', -1817=>'AL', -1818=>'AL', -1819=>'AL', -1820=>'AL', -1821=>'AL', -1822=>'AL', -1823=>'AL', -1824=>'AL', -1825=>'AL', -1826=>'AL', -1827=>'AL', -1828=>'AL', -1829=>'AL', -1830=>'AL', -1831=>'AL', -1832=>'AL', -1833=>'AL', -1834=>'AL', -1835=>'AL', -1836=>'AL', -1837=>'AL', -1838=>'AL', -1839=>'AL', -1840=>'NSM', -1841=>'NSM', -1842=>'NSM', -1843=>'NSM', -1844=>'NSM', -1845=>'NSM', -1846=>'NSM', -1847=>'NSM', -1848=>'NSM', -1849=>'NSM', -1850=>'NSM', -1851=>'NSM', -1852=>'NSM', -1853=>'NSM', -1854=>'NSM', -1855=>'NSM', -1856=>'NSM', -1857=>'NSM', -1858=>'NSM', -1859=>'NSM', -1860=>'NSM', -1861=>'NSM', -1862=>'NSM', -1863=>'NSM', -1864=>'NSM', -1865=>'NSM', -1866=>'NSM', -1869=>'AL', -1870=>'AL', -1871=>'AL', -1872=>'AL', -1873=>'AL', -1874=>'AL', -1875=>'AL', -1876=>'AL', -1877=>'AL', -1878=>'AL', -1879=>'AL', -1880=>'AL', -1881=>'AL', -1882=>'AL', -1883=>'AL', -1884=>'AL', -1885=>'AL', -1886=>'AL', -1887=>'AL', -1888=>'AL', -1889=>'AL', -1890=>'AL', -1891=>'AL', -1892=>'AL', -1893=>'AL', -1894=>'AL', -1895=>'AL', -1896=>'AL', -1897=>'AL', -1898=>'AL', -1899=>'AL', -1900=>'AL', -1901=>'AL', -1920=>'AL', -1921=>'AL', -1922=>'AL', -1923=>'AL', -1924=>'AL', -1925=>'AL', -1926=>'AL', -1927=>'AL', -1928=>'AL', -1929=>'AL', -1930=>'AL', -1931=>'AL', -1932=>'AL', -1933=>'AL', -1934=>'AL', -1935=>'AL', -1936=>'AL', -1937=>'AL', -1938=>'AL', -1939=>'AL', -1940=>'AL', -1941=>'AL', -1942=>'AL', -1943=>'AL', -1944=>'AL', -1945=>'AL', -1946=>'AL', -1947=>'AL', -1948=>'AL', -1949=>'AL', -1950=>'AL', -1951=>'AL', -1952=>'AL', -1953=>'AL', -1954=>'AL', -1955=>'AL', -1956=>'AL', -1957=>'AL', -1958=>'NSM', -1959=>'NSM', -1960=>'NSM', -1961=>'NSM', -1962=>'NSM', -1963=>'NSM', -1964=>'NSM', -1965=>'NSM', -1966=>'NSM', -1967=>'NSM', -1968=>'NSM', -1969=>'AL', -1984=>'R', -1985=>'R', -1986=>'R', -1987=>'R', -1988=>'R', -1989=>'R', -1990=>'R', -1991=>'R', -1992=>'R', -1993=>'R', -1994=>'R', -1995=>'R', -1996=>'R', -1997=>'R', -1998=>'R', -1999=>'R', -2000=>'R', -2001=>'R', -2002=>'R', -2003=>'R', -2004=>'R', -2005=>'R', -2006=>'R', -2007=>'R', -2008=>'R', -2009=>'R', -2010=>'R', -2011=>'R', -2012=>'R', -2013=>'R', -2014=>'R', -2015=>'R', -2016=>'R', -2017=>'R', -2018=>'R', -2019=>'R', -2020=>'R', -2021=>'R', -2022=>'R', -2023=>'R', -2024=>'R', -2025=>'R', -2026=>'R', -2027=>'NSM', -2028=>'NSM', -2029=>'NSM', -2030=>'NSM', -2031=>'NSM', -2032=>'NSM', -2033=>'NSM', -2034=>'NSM', -2035=>'NSM', -2036=>'R', -2037=>'R', -2038=>'ON', -2039=>'ON', -2040=>'ON', -2041=>'ON', -2042=>'R', -2305=>'NSM', -2306=>'NSM', -2307=>'L', -2308=>'L', -2309=>'L', -2310=>'L', -2311=>'L', -2312=>'L', -2313=>'L', -2314=>'L', -2315=>'L', -2316=>'L', -2317=>'L', -2318=>'L', -2319=>'L', -2320=>'L', -2321=>'L', -2322=>'L', -2323=>'L', -2324=>'L', -2325=>'L', -2326=>'L', -2327=>'L', -2328=>'L', -2329=>'L', -2330=>'L', -2331=>'L', -2332=>'L', -2333=>'L', -2334=>'L', -2335=>'L', -2336=>'L', -2337=>'L', -2338=>'L', -2339=>'L', -2340=>'L', -2341=>'L', -2342=>'L', -2343=>'L', -2344=>'L', -2345=>'L', -2346=>'L', -2347=>'L', -2348=>'L', -2349=>'L', -2350=>'L', -2351=>'L', -2352=>'L', -2353=>'L', -2354=>'L', -2355=>'L', -2356=>'L', -2357=>'L', -2358=>'L', -2359=>'L', -2360=>'L', -2361=>'L', -2364=>'NSM', -2365=>'L', -2366=>'L', -2367=>'L', -2368=>'L', -2369=>'NSM', -2370=>'NSM', -2371=>'NSM', -2372=>'NSM', -2373=>'NSM', -2374=>'NSM', -2375=>'NSM', -2376=>'NSM', -2377=>'L', -2378=>'L', -2379=>'L', -2380=>'L', -2381=>'NSM', -2384=>'L', -2385=>'NSM', -2386=>'NSM', -2387=>'NSM', -2388=>'NSM', -2392=>'L', -2393=>'L', -2394=>'L', -2395=>'L', -2396=>'L', -2397=>'L', -2398=>'L', -2399=>'L', -2400=>'L', -2401=>'L', -2402=>'NSM', -2403=>'NSM', -2404=>'L', -2405=>'L', -2406=>'L', -2407=>'L', -2408=>'L', -2409=>'L', -2410=>'L', -2411=>'L', -2412=>'L', -2413=>'L', -2414=>'L', -2415=>'L', -2416=>'L', -2427=>'L', -2428=>'L', -2429=>'L', -2430=>'L', -2431=>'L', -2433=>'NSM', -2434=>'L', -2435=>'L', -2437=>'L', -2438=>'L', -2439=>'L', -2440=>'L', -2441=>'L', -2442=>'L', -2443=>'L', -2444=>'L', -2447=>'L', -2448=>'L', -2451=>'L', -2452=>'L', -2453=>'L', -2454=>'L', -2455=>'L', -2456=>'L', -2457=>'L', -2458=>'L', -2459=>'L', -2460=>'L', -2461=>'L', -2462=>'L', -2463=>'L', -2464=>'L', -2465=>'L', -2466=>'L', -2467=>'L', -2468=>'L', -2469=>'L', -2470=>'L', -2471=>'L', -2472=>'L', -2474=>'L', -2475=>'L', -2476=>'L', -2477=>'L', -2478=>'L', -2479=>'L', -2480=>'L', -2482=>'L', -2486=>'L', -2487=>'L', -2488=>'L', -2489=>'L', -2492=>'NSM', -2493=>'L', -2494=>'L', -2495=>'L', -2496=>'L', -2497=>'NSM', -2498=>'NSM', -2499=>'NSM', -2500=>'NSM', -2503=>'L', -2504=>'L', -2507=>'L', -2508=>'L', -2509=>'NSM', -2510=>'L', -2519=>'L', -2524=>'L', -2525=>'L', -2527=>'L', -2528=>'L', -2529=>'L', -2530=>'NSM', -2531=>'NSM', -2534=>'L', -2535=>'L', -2536=>'L', -2537=>'L', -2538=>'L', -2539=>'L', -2540=>'L', -2541=>'L', -2542=>'L', -2543=>'L', -2544=>'L', -2545=>'L', -2546=>'ET', -2547=>'ET', -2548=>'L', -2549=>'L', -2550=>'L', -2551=>'L', -2552=>'L', -2553=>'L', -2554=>'L', -2561=>'NSM', -2562=>'NSM', -2563=>'L', -2565=>'L', -2566=>'L', -2567=>'L', -2568=>'L', -2569=>'L', -2570=>'L', -2575=>'L', -2576=>'L', -2579=>'L', -2580=>'L', -2581=>'L', -2582=>'L', -2583=>'L', -2584=>'L', -2585=>'L', -2586=>'L', -2587=>'L', -2588=>'L', -2589=>'L', -2590=>'L', -2591=>'L', -2592=>'L', -2593=>'L', -2594=>'L', -2595=>'L', -2596=>'L', -2597=>'L', -2598=>'L', -2599=>'L', -2600=>'L', -2602=>'L', -2603=>'L', -2604=>'L', -2605=>'L', -2606=>'L', -2607=>'L', -2608=>'L', -2610=>'L', -2611=>'L', -2613=>'L', -2614=>'L', -2616=>'L', -2617=>'L', -2620=>'NSM', -2622=>'L', -2623=>'L', -2624=>'L', -2625=>'NSM', -2626=>'NSM', -2631=>'NSM', -2632=>'NSM', -2635=>'NSM', -2636=>'NSM', -2637=>'NSM', -2649=>'L', -2650=>'L', -2651=>'L', -2652=>'L', -2654=>'L', -2662=>'L', -2663=>'L', -2664=>'L', -2665=>'L', -2666=>'L', -2667=>'L', -2668=>'L', -2669=>'L', -2670=>'L', -2671=>'L', -2672=>'NSM', -2673=>'NSM', -2674=>'L', -2675=>'L', -2676=>'L', -2689=>'NSM', -2690=>'NSM', -2691=>'L', -2693=>'L', -2694=>'L', -2695=>'L', -2696=>'L', -2697=>'L', -2698=>'L', -2699=>'L', -2700=>'L', -2701=>'L', -2703=>'L', -2704=>'L', -2705=>'L', -2707=>'L', -2708=>'L', -2709=>'L', -2710=>'L', -2711=>'L', -2712=>'L', -2713=>'L', -2714=>'L', -2715=>'L', -2716=>'L', -2717=>'L', -2718=>'L', -2719=>'L', -2720=>'L', -2721=>'L', -2722=>'L', -2723=>'L', -2724=>'L', -2725=>'L', -2726=>'L', -2727=>'L', -2728=>'L', -2730=>'L', -2731=>'L', -2732=>'L', -2733=>'L', -2734=>'L', -2735=>'L', -2736=>'L', -2738=>'L', -2739=>'L', -2741=>'L', -2742=>'L', -2743=>'L', -2744=>'L', -2745=>'L', -2748=>'NSM', -2749=>'L', -2750=>'L', -2751=>'L', -2752=>'L', -2753=>'NSM', -2754=>'NSM', -2755=>'NSM', -2756=>'NSM', -2757=>'NSM', -2759=>'NSM', -2760=>'NSM', -2761=>'L', -2763=>'L', -2764=>'L', -2765=>'NSM', -2768=>'L', -2784=>'L', -2785=>'L', -2786=>'NSM', -2787=>'NSM', -2790=>'L', -2791=>'L', -2792=>'L', -2793=>'L', -2794=>'L', -2795=>'L', -2796=>'L', -2797=>'L', -2798=>'L', -2799=>'L', -2801=>'ET', -2817=>'NSM', -2818=>'L', -2819=>'L', -2821=>'L', -2822=>'L', -2823=>'L', -2824=>'L', -2825=>'L', -2826=>'L', -2827=>'L', -2828=>'L', -2831=>'L', -2832=>'L', -2835=>'L', -2836=>'L', -2837=>'L', -2838=>'L', -2839=>'L', -2840=>'L', -2841=>'L', -2842=>'L', -2843=>'L', -2844=>'L', -2845=>'L', -2846=>'L', -2847=>'L', -2848=>'L', -2849=>'L', -2850=>'L', -2851=>'L', -2852=>'L', -2853=>'L', -2854=>'L', -2855=>'L', -2856=>'L', -2858=>'L', -2859=>'L', -2860=>'L', -2861=>'L', -2862=>'L', -2863=>'L', -2864=>'L', -2866=>'L', -2867=>'L', -2869=>'L', -2870=>'L', -2871=>'L', -2872=>'L', -2873=>'L', -2876=>'NSM', -2877=>'L', -2878=>'L', -2879=>'NSM', -2880=>'L', -2881=>'NSM', -2882=>'NSM', -2883=>'NSM', -2887=>'L', -2888=>'L', -2891=>'L', -2892=>'L', -2893=>'NSM', -2902=>'NSM', -2903=>'L', -2908=>'L', -2909=>'L', -2911=>'L', -2912=>'L', -2913=>'L', -2918=>'L', -2919=>'L', -2920=>'L', -2921=>'L', -2922=>'L', -2923=>'L', -2924=>'L', -2925=>'L', -2926=>'L', -2927=>'L', -2928=>'L', -2929=>'L', -2946=>'NSM', -2947=>'L', -2949=>'L', -2950=>'L', -2951=>'L', -2952=>'L', -2953=>'L', -2954=>'L', -2958=>'L', -2959=>'L', -2960=>'L', -2962=>'L', -2963=>'L', -2964=>'L', -2965=>'L', -2969=>'L', -2970=>'L', -2972=>'L', -2974=>'L', -2975=>'L', -2979=>'L', -2980=>'L', -2984=>'L', -2985=>'L', -2986=>'L', -2990=>'L', -2991=>'L', -2992=>'L', -2993=>'L', -2994=>'L', -2995=>'L', -2996=>'L', -2997=>'L', -2998=>'L', -2999=>'L', -3000=>'L', -3001=>'L', -3006=>'L', -3007=>'L', -3008=>'NSM', -3009=>'L', -3010=>'L', -3014=>'L', -3015=>'L', -3016=>'L', -3018=>'L', -3019=>'L', -3020=>'L', -3021=>'NSM', -3031=>'L', -3046=>'L', -3047=>'L', -3048=>'L', -3049=>'L', -3050=>'L', -3051=>'L', -3052=>'L', -3053=>'L', -3054=>'L', -3055=>'L', -3056=>'L', -3057=>'L', -3058=>'L', -3059=>'ON', -3060=>'ON', -3061=>'ON', -3062=>'ON', -3063=>'ON', -3064=>'ON', -3065=>'ET', -3066=>'ON', -3073=>'L', -3074=>'L', -3075=>'L', -3077=>'L', -3078=>'L', -3079=>'L', -3080=>'L', -3081=>'L', -3082=>'L', -3083=>'L', -3084=>'L', -3086=>'L', -3087=>'L', -3088=>'L', -3090=>'L', -3091=>'L', -3092=>'L', -3093=>'L', -3094=>'L', -3095=>'L', -3096=>'L', -3097=>'L', -3098=>'L', -3099=>'L', -3100=>'L', -3101=>'L', -3102=>'L', -3103=>'L', -3104=>'L', -3105=>'L', -3106=>'L', -3107=>'L', -3108=>'L', -3109=>'L', -3110=>'L', -3111=>'L', -3112=>'L', -3114=>'L', -3115=>'L', -3116=>'L', -3117=>'L', -3118=>'L', -3119=>'L', -3120=>'L', -3121=>'L', -3122=>'L', -3123=>'L', -3125=>'L', -3126=>'L', -3127=>'L', -3128=>'L', -3129=>'L', -3134=>'NSM', -3135=>'NSM', -3136=>'NSM', -3137=>'L', -3138=>'L', -3139=>'L', -3140=>'L', -3142=>'NSM', -3143=>'NSM', -3144=>'NSM', -3146=>'NSM', -3147=>'NSM', -3148=>'NSM', -3149=>'NSM', -3157=>'NSM', -3158=>'NSM', -3168=>'L', -3169=>'L', -3174=>'L', -3175=>'L', -3176=>'L', -3177=>'L', -3178=>'L', -3179=>'L', -3180=>'L', -3181=>'L', -3182=>'L', -3183=>'L', -3202=>'L', -3203=>'L', -3205=>'L', -3206=>'L', -3207=>'L', -3208=>'L', -3209=>'L', -3210=>'L', -3211=>'L', -3212=>'L', -3214=>'L', -3215=>'L', -3216=>'L', -3218=>'L', -3219=>'L', -3220=>'L', -3221=>'L', -3222=>'L', -3223=>'L', -3224=>'L', -3225=>'L', -3226=>'L', -3227=>'L', -3228=>'L', -3229=>'L', -3230=>'L', -3231=>'L', -3232=>'L', -3233=>'L', -3234=>'L', -3235=>'L', -3236=>'L', -3237=>'L', -3238=>'L', -3239=>'L', -3240=>'L', -3242=>'L', -3243=>'L', -3244=>'L', -3245=>'L', -3246=>'L', -3247=>'L', -3248=>'L', -3249=>'L', -3250=>'L', -3251=>'L', -3253=>'L', -3254=>'L', -3255=>'L', -3256=>'L', -3257=>'L', -3260=>'NSM', -3261=>'L', -3262=>'L', -3263=>'L', -3264=>'L', -3265=>'L', -3266=>'L', -3267=>'L', -3268=>'L', -3270=>'L', -3271=>'L', -3272=>'L', -3274=>'L', -3275=>'L', -3276=>'NSM', -3277=>'NSM', -3285=>'L', -3286=>'L', -3294=>'L', -3296=>'L', -3297=>'L', -3298=>'NSM', -3299=>'NSM', -3302=>'L', -3303=>'L', -3304=>'L', -3305=>'L', -3306=>'L', -3307=>'L', -3308=>'L', -3309=>'L', -3310=>'L', -3311=>'L', -3313=>'ON', -3314=>'ON', -3330=>'L', -3331=>'L', -3333=>'L', -3334=>'L', -3335=>'L', -3336=>'L', -3337=>'L', -3338=>'L', -3339=>'L', -3340=>'L', -3342=>'L', -3343=>'L', -3344=>'L', -3346=>'L', -3347=>'L', -3348=>'L', -3349=>'L', -3350=>'L', -3351=>'L', -3352=>'L', -3353=>'L', -3354=>'L', -3355=>'L', -3356=>'L', -3357=>'L', -3358=>'L', -3359=>'L', -3360=>'L', -3361=>'L', -3362=>'L', -3363=>'L', -3364=>'L', -3365=>'L', -3366=>'L', -3367=>'L', -3368=>'L', -3370=>'L', -3371=>'L', -3372=>'L', -3373=>'L', -3374=>'L', -3375=>'L', -3376=>'L', -3377=>'L', -3378=>'L', -3379=>'L', -3380=>'L', -3381=>'L', -3382=>'L', -3383=>'L', -3384=>'L', -3385=>'L', -3390=>'L', -3391=>'L', -3392=>'L', -3393=>'NSM', -3394=>'NSM', -3395=>'NSM', -3398=>'L', -3399=>'L', -3400=>'L', -3402=>'L', -3403=>'L', -3404=>'L', -3405=>'NSM', -3415=>'L', -3424=>'L', -3425=>'L', -3430=>'L', -3431=>'L', -3432=>'L', -3433=>'L', -3434=>'L', -3435=>'L', -3436=>'L', -3437=>'L', -3438=>'L', -3439=>'L', -3458=>'L', -3459=>'L', -3461=>'L', -3462=>'L', -3463=>'L', -3464=>'L', -3465=>'L', -3466=>'L', -3467=>'L', -3468=>'L', -3469=>'L', -3470=>'L', -3471=>'L', -3472=>'L', -3473=>'L', -3474=>'L', -3475=>'L', -3476=>'L', -3477=>'L', -3478=>'L', -3482=>'L', -3483=>'L', -3484=>'L', -3485=>'L', -3486=>'L', -3487=>'L', -3488=>'L', -3489=>'L', -3490=>'L', -3491=>'L', -3492=>'L', -3493=>'L', -3494=>'L', -3495=>'L', -3496=>'L', -3497=>'L', -3498=>'L', -3499=>'L', -3500=>'L', -3501=>'L', -3502=>'L', -3503=>'L', -3504=>'L', -3505=>'L', -3507=>'L', -3508=>'L', -3509=>'L', -3510=>'L', -3511=>'L', -3512=>'L', -3513=>'L', -3514=>'L', -3515=>'L', -3517=>'L', -3520=>'L', -3521=>'L', -3522=>'L', -3523=>'L', -3524=>'L', -3525=>'L', -3526=>'L', -3530=>'NSM', -3535=>'L', -3536=>'L', -3537=>'L', -3538=>'NSM', -3539=>'NSM', -3540=>'NSM', -3542=>'NSM', -3544=>'L', -3545=>'L', -3546=>'L', -3547=>'L', -3548=>'L', -3549=>'L', -3550=>'L', -3551=>'L', -3570=>'L', -3571=>'L', -3572=>'L', -3585=>'L', -3586=>'L', -3587=>'L', -3588=>'L', -3589=>'L', -3590=>'L', -3591=>'L', -3592=>'L', -3593=>'L', -3594=>'L', -3595=>'L', -3596=>'L', -3597=>'L', -3598=>'L', -3599=>'L', -3600=>'L', -3601=>'L', -3602=>'L', -3603=>'L', -3604=>'L', -3605=>'L', -3606=>'L', -3607=>'L', -3608=>'L', -3609=>'L', -3610=>'L', -3611=>'L', -3612=>'L', -3613=>'L', -3614=>'L', -3615=>'L', -3616=>'L', -3617=>'L', -3618=>'L', -3619=>'L', -3620=>'L', -3621=>'L', -3622=>'L', -3623=>'L', -3624=>'L', -3625=>'L', -3626=>'L', -3627=>'L', -3628=>'L', -3629=>'L', -3630=>'L', -3631=>'L', -3632=>'L', -3633=>'NSM', -3634=>'L', -3635=>'L', -3636=>'NSM', -3637=>'NSM', -3638=>'NSM', -3639=>'NSM', -3640=>'NSM', -3641=>'NSM', -3642=>'NSM', -3647=>'ET', -3648=>'L', -3649=>'L', -3650=>'L', -3651=>'L', -3652=>'L', -3653=>'L', -3654=>'L', -3655=>'NSM', -3656=>'NSM', -3657=>'NSM', -3658=>'NSM', -3659=>'NSM', -3660=>'NSM', -3661=>'NSM', -3662=>'NSM', -3663=>'L', -3664=>'L', -3665=>'L', -3666=>'L', -3667=>'L', -3668=>'L', -3669=>'L', -3670=>'L', -3671=>'L', -3672=>'L', -3673=>'L', -3674=>'L', -3675=>'L', -3713=>'L', -3714=>'L', -3716=>'L', -3719=>'L', -3720=>'L', -3722=>'L', -3725=>'L', -3732=>'L', -3733=>'L', -3734=>'L', -3735=>'L', -3737=>'L', -3738=>'L', -3739=>'L', -3740=>'L', -3741=>'L', -3742=>'L', -3743=>'L', -3745=>'L', -3746=>'L', -3747=>'L', -3749=>'L', -3751=>'L', -3754=>'L', -3755=>'L', -3757=>'L', -3758=>'L', -3759=>'L', -3760=>'L', -3761=>'NSM', -3762=>'L', -3763=>'L', -3764=>'NSM', -3765=>'NSM', -3766=>'NSM', -3767=>'NSM', -3768=>'NSM', -3769=>'NSM', -3771=>'NSM', -3772=>'NSM', -3773=>'L', -3776=>'L', -3777=>'L', -3778=>'L', -3779=>'L', -3780=>'L', -3782=>'L', -3784=>'NSM', -3785=>'NSM', -3786=>'NSM', -3787=>'NSM', -3788=>'NSM', -3789=>'NSM', -3792=>'L', -3793=>'L', -3794=>'L', -3795=>'L', -3796=>'L', -3797=>'L', -3798=>'L', -3799=>'L', -3800=>'L', -3801=>'L', -3804=>'L', -3805=>'L', -3840=>'L', -3841=>'L', -3842=>'L', -3843=>'L', -3844=>'L', -3845=>'L', -3846=>'L', -3847=>'L', -3848=>'L', -3849=>'L', -3850=>'L', -3851=>'L', -3852=>'L', -3853=>'L', -3854=>'L', -3855=>'L', -3856=>'L', -3857=>'L', -3858=>'L', -3859=>'L', -3860=>'L', -3861=>'L', -3862=>'L', -3863=>'L', -3864=>'NSM', -3865=>'NSM', -3866=>'L', -3867=>'L', -3868=>'L', -3869=>'L', -3870=>'L', -3871=>'L', -3872=>'L', -3873=>'L', -3874=>'L', -3875=>'L', -3876=>'L', -3877=>'L', -3878=>'L', -3879=>'L', -3880=>'L', -3881=>'L', -3882=>'L', -3883=>'L', -3884=>'L', -3885=>'L', -3886=>'L', -3887=>'L', -3888=>'L', -3889=>'L', -3890=>'L', -3891=>'L', -3892=>'L', -3893=>'NSM', -3894=>'L', -3895=>'NSM', -3896=>'L', -3897=>'NSM', -3898=>'ON', -3899=>'ON', -3900=>'ON', -3901=>'ON', -3902=>'L', -3903=>'L', -3904=>'L', -3905=>'L', -3906=>'L', -3907=>'L', -3908=>'L', -3909=>'L', -3910=>'L', -3911=>'L', -3913=>'L', -3914=>'L', -3915=>'L', -3916=>'L', -3917=>'L', -3918=>'L', -3919=>'L', -3920=>'L', -3921=>'L', -3922=>'L', -3923=>'L', -3924=>'L', -3925=>'L', -3926=>'L', -3927=>'L', -3928=>'L', -3929=>'L', -3930=>'L', -3931=>'L', -3932=>'L', -3933=>'L', -3934=>'L', -3935=>'L', -3936=>'L', -3937=>'L', -3938=>'L', -3939=>'L', -3940=>'L', -3941=>'L', -3942=>'L', -3943=>'L', -3944=>'L', -3945=>'L', -3946=>'L', -3953=>'NSM', -3954=>'NSM', -3955=>'NSM', -3956=>'NSM', -3957=>'NSM', -3958=>'NSM', -3959=>'NSM', -3960=>'NSM', -3961=>'NSM', -3962=>'NSM', -3963=>'NSM', -3964=>'NSM', -3965=>'NSM', -3966=>'NSM', -3967=>'L', -3968=>'NSM', -3969=>'NSM', -3970=>'NSM', -3971=>'NSM', -3972=>'NSM', -3973=>'L', -3974=>'NSM', -3975=>'NSM', -3976=>'L', -3977=>'L', -3978=>'L', -3979=>'L', -3984=>'NSM', -3985=>'NSM', -3986=>'NSM', -3987=>'NSM', -3988=>'NSM', -3989=>'NSM', -3990=>'NSM', -3991=>'NSM', -3993=>'NSM', -3994=>'NSM', -3995=>'NSM', -3996=>'NSM', -3997=>'NSM', -3998=>'NSM', -3999=>'NSM', -4000=>'NSM', -4001=>'NSM', -4002=>'NSM', -4003=>'NSM', -4004=>'NSM', -4005=>'NSM', -4006=>'NSM', -4007=>'NSM', -4008=>'NSM', -4009=>'NSM', -4010=>'NSM', -4011=>'NSM', -4012=>'NSM', -4013=>'NSM', -4014=>'NSM', -4015=>'NSM', -4016=>'NSM', -4017=>'NSM', -4018=>'NSM', -4019=>'NSM', -4020=>'NSM', -4021=>'NSM', -4022=>'NSM', -4023=>'NSM', -4024=>'NSM', -4025=>'NSM', -4026=>'NSM', -4027=>'NSM', -4028=>'NSM', -4030=>'L', -4031=>'L', -4032=>'L', -4033=>'L', -4034=>'L', -4035=>'L', -4036=>'L', -4037=>'L', -4038=>'NSM', -4039=>'L', -4040=>'L', -4041=>'L', -4042=>'L', -4043=>'L', -4044=>'L', -4047=>'L', -4048=>'L', -4049=>'L', -4096=>'L', -4097=>'L', -4098=>'L', -4099=>'L', -4100=>'L', -4101=>'L', -4102=>'L', -4103=>'L', -4104=>'L', -4105=>'L', -4106=>'L', -4107=>'L', -4108=>'L', -4109=>'L', -4110=>'L', -4111=>'L', -4112=>'L', -4113=>'L', -4114=>'L', -4115=>'L', -4116=>'L', -4117=>'L', -4118=>'L', -4119=>'L', -4120=>'L', -4121=>'L', -4122=>'L', -4123=>'L', -4124=>'L', -4125=>'L', -4126=>'L', -4127=>'L', -4128=>'L', -4129=>'L', -4131=>'L', -4132=>'L', -4133=>'L', -4134=>'L', -4135=>'L', -4137=>'L', -4138=>'L', -4140=>'L', -4141=>'NSM', -4142=>'NSM', -4143=>'NSM', -4144=>'NSM', -4145=>'L', -4146=>'NSM', -4150=>'NSM', -4151=>'NSM', -4152=>'L', -4153=>'NSM', -4160=>'L', -4161=>'L', -4162=>'L', -4163=>'L', -4164=>'L', -4165=>'L', -4166=>'L', -4167=>'L', -4168=>'L', -4169=>'L', -4170=>'L', -4171=>'L', -4172=>'L', -4173=>'L', -4174=>'L', -4175=>'L', -4176=>'L', -4177=>'L', -4178=>'L', -4179=>'L', -4180=>'L', -4181=>'L', -4182=>'L', -4183=>'L', -4184=>'NSM', -4185=>'NSM', -4256=>'L', -4257=>'L', -4258=>'L', -4259=>'L', -4260=>'L', -4261=>'L', -4262=>'L', -4263=>'L', -4264=>'L', -4265=>'L', -4266=>'L', -4267=>'L', -4268=>'L', -4269=>'L', -4270=>'L', -4271=>'L', -4272=>'L', -4273=>'L', -4274=>'L', -4275=>'L', -4276=>'L', -4277=>'L', -4278=>'L', -4279=>'L', -4280=>'L', -4281=>'L', -4282=>'L', -4283=>'L', -4284=>'L', -4285=>'L', -4286=>'L', -4287=>'L', -4288=>'L', -4289=>'L', -4290=>'L', -4291=>'L', -4292=>'L', -4293=>'L', -4304=>'L', -4305=>'L', -4306=>'L', -4307=>'L', -4308=>'L', -4309=>'L', -4310=>'L', -4311=>'L', -4312=>'L', -4313=>'L', -4314=>'L', -4315=>'L', -4316=>'L', -4317=>'L', -4318=>'L', -4319=>'L', -4320=>'L', -4321=>'L', -4322=>'L', -4323=>'L', -4324=>'L', -4325=>'L', -4326=>'L', -4327=>'L', -4328=>'L', -4329=>'L', -4330=>'L', -4331=>'L', -4332=>'L', -4333=>'L', -4334=>'L', -4335=>'L', -4336=>'L', -4337=>'L', -4338=>'L', -4339=>'L', -4340=>'L', -4341=>'L', -4342=>'L', -4343=>'L', -4344=>'L', -4345=>'L', -4346=>'L', -4347=>'L', -4348=>'L', -4352=>'L', -4353=>'L', -4354=>'L', -4355=>'L', -4356=>'L', -4357=>'L', -4358=>'L', -4359=>'L', -4360=>'L', -4361=>'L', -4362=>'L', -4363=>'L', -4364=>'L', -4365=>'L', -4366=>'L', -4367=>'L', -4368=>'L', -4369=>'L', -4370=>'L', -4371=>'L', -4372=>'L', -4373=>'L', -4374=>'L', -4375=>'L', -4376=>'L', -4377=>'L', -4378=>'L', -4379=>'L', -4380=>'L', -4381=>'L', -4382=>'L', -4383=>'L', -4384=>'L', -4385=>'L', -4386=>'L', -4387=>'L', -4388=>'L', -4389=>'L', -4390=>'L', -4391=>'L', -4392=>'L', -4393=>'L', -4394=>'L', -4395=>'L', -4396=>'L', -4397=>'L', -4398=>'L', -4399=>'L', -4400=>'L', -4401=>'L', -4402=>'L', -4403=>'L', -4404=>'L', -4405=>'L', -4406=>'L', -4407=>'L', -4408=>'L', -4409=>'L', -4410=>'L', -4411=>'L', -4412=>'L', -4413=>'L', -4414=>'L', -4415=>'L', -4416=>'L', -4417=>'L', -4418=>'L', -4419=>'L', -4420=>'L', -4421=>'L', -4422=>'L', -4423=>'L', -4424=>'L', -4425=>'L', -4426=>'L', -4427=>'L', -4428=>'L', -4429=>'L', -4430=>'L', -4431=>'L', -4432=>'L', -4433=>'L', -4434=>'L', -4435=>'L', -4436=>'L', -4437=>'L', -4438=>'L', -4439=>'L', -4440=>'L', -4441=>'L', -4447=>'L', -4448=>'L', -4449=>'L', -4450=>'L', -4451=>'L', -4452=>'L', -4453=>'L', -4454=>'L', -4455=>'L', -4456=>'L', -4457=>'L', -4458=>'L', -4459=>'L', -4460=>'L', -4461=>'L', -4462=>'L', -4463=>'L', -4464=>'L', -4465=>'L', -4466=>'L', -4467=>'L', -4468=>'L', -4469=>'L', -4470=>'L', -4471=>'L', -4472=>'L', -4473=>'L', -4474=>'L', -4475=>'L', -4476=>'L', -4477=>'L', -4478=>'L', -4479=>'L', -4480=>'L', -4481=>'L', -4482=>'L', -4483=>'L', -4484=>'L', -4485=>'L', -4486=>'L', -4487=>'L', -4488=>'L', -4489=>'L', -4490=>'L', -4491=>'L', -4492=>'L', -4493=>'L', -4494=>'L', -4495=>'L', -4496=>'L', -4497=>'L', -4498=>'L', -4499=>'L', -4500=>'L', -4501=>'L', -4502=>'L', -4503=>'L', -4504=>'L', -4505=>'L', -4506=>'L', -4507=>'L', -4508=>'L', -4509=>'L', -4510=>'L', -4511=>'L', -4512=>'L', -4513=>'L', -4514=>'L', -4520=>'L', -4521=>'L', -4522=>'L', -4523=>'L', -4524=>'L', -4525=>'L', -4526=>'L', -4527=>'L', -4528=>'L', -4529=>'L', -4530=>'L', -4531=>'L', -4532=>'L', -4533=>'L', -4534=>'L', -4535=>'L', -4536=>'L', -4537=>'L', -4538=>'L', -4539=>'L', -4540=>'L', -4541=>'L', -4542=>'L', -4543=>'L', -4544=>'L', -4545=>'L', -4546=>'L', -4547=>'L', -4548=>'L', -4549=>'L', -4550=>'L', -4551=>'L', -4552=>'L', -4553=>'L', -4554=>'L', -4555=>'L', -4556=>'L', -4557=>'L', -4558=>'L', -4559=>'L', -4560=>'L', -4561=>'L', -4562=>'L', -4563=>'L', -4564=>'L', -4565=>'L', -4566=>'L', -4567=>'L', -4568=>'L', -4569=>'L', -4570=>'L', -4571=>'L', -4572=>'L', -4573=>'L', -4574=>'L', -4575=>'L', -4576=>'L', -4577=>'L', -4578=>'L', -4579=>'L', -4580=>'L', -4581=>'L', -4582=>'L', -4583=>'L', -4584=>'L', -4585=>'L', -4586=>'L', -4587=>'L', -4588=>'L', -4589=>'L', -4590=>'L', -4591=>'L', -4592=>'L', -4593=>'L', -4594=>'L', -4595=>'L', -4596=>'L', -4597=>'L', -4598=>'L', -4599=>'L', -4600=>'L', -4601=>'L', -4608=>'L', -4609=>'L', -4610=>'L', -4611=>'L', -4612=>'L', -4613=>'L', -4614=>'L', -4615=>'L', -4616=>'L', -4617=>'L', -4618=>'L', -4619=>'L', -4620=>'L', -4621=>'L', -4622=>'L', -4623=>'L', -4624=>'L', -4625=>'L', -4626=>'L', -4627=>'L', -4628=>'L', -4629=>'L', -4630=>'L', -4631=>'L', -4632=>'L', -4633=>'L', -4634=>'L', -4635=>'L', -4636=>'L', -4637=>'L', -4638=>'L', -4639=>'L', -4640=>'L', -4641=>'L', -4642=>'L', -4643=>'L', -4644=>'L', -4645=>'L', -4646=>'L', -4647=>'L', -4648=>'L', -4649=>'L', -4650=>'L', -4651=>'L', -4652=>'L', -4653=>'L', -4654=>'L', -4655=>'L', -4656=>'L', -4657=>'L', -4658=>'L', -4659=>'L', -4660=>'L', -4661=>'L', -4662=>'L', -4663=>'L', -4664=>'L', -4665=>'L', -4666=>'L', -4667=>'L', -4668=>'L', -4669=>'L', -4670=>'L', -4671=>'L', -4672=>'L', -4673=>'L', -4674=>'L', -4675=>'L', -4676=>'L', -4677=>'L', -4678=>'L', -4679=>'L', -4680=>'L', -4682=>'L', -4683=>'L', -4684=>'L', -4685=>'L', -4688=>'L', -4689=>'L', -4690=>'L', -4691=>'L', -4692=>'L', -4693=>'L', -4694=>'L', -4696=>'L', -4698=>'L', -4699=>'L', -4700=>'L', -4701=>'L', -4704=>'L', -4705=>'L', -4706=>'L', -4707=>'L', -4708=>'L', -4709=>'L', -4710=>'L', -4711=>'L', -4712=>'L', -4713=>'L', -4714=>'L', -4715=>'L', -4716=>'L', -4717=>'L', -4718=>'L', -4719=>'L', -4720=>'L', -4721=>'L', -4722=>'L', -4723=>'L', -4724=>'L', -4725=>'L', -4726=>'L', -4727=>'L', -4728=>'L', -4729=>'L', -4730=>'L', -4731=>'L', -4732=>'L', -4733=>'L', -4734=>'L', -4735=>'L', -4736=>'L', -4737=>'L', -4738=>'L', -4739=>'L', -4740=>'L', -4741=>'L', -4742=>'L', -4743=>'L', -4744=>'L', -4746=>'L', -4747=>'L', -4748=>'L', -4749=>'L', -4752=>'L', -4753=>'L', -4754=>'L', -4755=>'L', -4756=>'L', -4757=>'L', -4758=>'L', -4759=>'L', -4760=>'L', -4761=>'L', -4762=>'L', -4763=>'L', -4764=>'L', -4765=>'L', -4766=>'L', -4767=>'L', -4768=>'L', -4769=>'L', -4770=>'L', -4771=>'L', -4772=>'L', -4773=>'L', -4774=>'L', -4775=>'L', -4776=>'L', -4777=>'L', -4778=>'L', -4779=>'L', -4780=>'L', -4781=>'L', -4782=>'L', -4783=>'L', -4784=>'L', -4786=>'L', -4787=>'L', -4788=>'L', -4789=>'L', -4792=>'L', -4793=>'L', -4794=>'L', -4795=>'L', -4796=>'L', -4797=>'L', -4798=>'L', -4800=>'L', -4802=>'L', -4803=>'L', -4804=>'L', -4805=>'L', -4808=>'L', -4809=>'L', -4810=>'L', -4811=>'L', -4812=>'L', -4813=>'L', -4814=>'L', -4815=>'L', -4816=>'L', -4817=>'L', -4818=>'L', -4819=>'L', -4820=>'L', -4821=>'L', -4822=>'L', -4824=>'L', -4825=>'L', -4826=>'L', -4827=>'L', -4828=>'L', -4829=>'L', -4830=>'L', -4831=>'L', -4832=>'L', -4833=>'L', -4834=>'L', -4835=>'L', -4836=>'L', -4837=>'L', -4838=>'L', -4839=>'L', -4840=>'L', -4841=>'L', -4842=>'L', -4843=>'L', -4844=>'L', -4845=>'L', -4846=>'L', -4847=>'L', -4848=>'L', -4849=>'L', -4850=>'L', -4851=>'L', -4852=>'L', -4853=>'L', -4854=>'L', -4855=>'L', -4856=>'L', -4857=>'L', -4858=>'L', -4859=>'L', -4860=>'L', -4861=>'L', -4862=>'L', -4863=>'L', -4864=>'L', -4865=>'L', -4866=>'L', -4867=>'L', -4868=>'L', -4869=>'L', -4870=>'L', -4871=>'L', -4872=>'L', -4873=>'L', -4874=>'L', -4875=>'L', -4876=>'L', -4877=>'L', -4878=>'L', -4879=>'L', -4880=>'L', -4882=>'L', -4883=>'L', -4884=>'L', -4885=>'L', -4888=>'L', -4889=>'L', -4890=>'L', -4891=>'L', -4892=>'L', -4893=>'L', -4894=>'L', -4895=>'L', -4896=>'L', -4897=>'L', -4898=>'L', -4899=>'L', -4900=>'L', -4901=>'L', -4902=>'L', -4903=>'L', -4904=>'L', -4905=>'L', -4906=>'L', -4907=>'L', -4908=>'L', -4909=>'L', -4910=>'L', -4911=>'L', -4912=>'L', -4913=>'L', -4914=>'L', -4915=>'L', -4916=>'L', -4917=>'L', -4918=>'L', -4919=>'L', -4920=>'L', -4921=>'L', -4922=>'L', -4923=>'L', -4924=>'L', -4925=>'L', -4926=>'L', -4927=>'L', -4928=>'L', -4929=>'L', -4930=>'L', -4931=>'L', -4932=>'L', -4933=>'L', -4934=>'L', -4935=>'L', -4936=>'L', -4937=>'L', -4938=>'L', -4939=>'L', -4940=>'L', -4941=>'L', -4942=>'L', -4943=>'L', -4944=>'L', -4945=>'L', -4946=>'L', -4947=>'L', -4948=>'L', -4949=>'L', -4950=>'L', -4951=>'L', -4952=>'L', -4953=>'L', -4954=>'L', -4959=>'NSM', -4960=>'L', -4961=>'L', -4962=>'L', -4963=>'L', -4964=>'L', -4965=>'L', -4966=>'L', -4967=>'L', -4968=>'L', -4969=>'L', -4970=>'L', -4971=>'L', -4972=>'L', -4973=>'L', -4974=>'L', -4975=>'L', -4976=>'L', -4977=>'L', -4978=>'L', -4979=>'L', -4980=>'L', -4981=>'L', -4982=>'L', -4983=>'L', -4984=>'L', -4985=>'L', -4986=>'L', -4987=>'L', -4988=>'L', -4992=>'L', -4993=>'L', -4994=>'L', -4995=>'L', -4996=>'L', -4997=>'L', -4998=>'L', -4999=>'L', -5000=>'L', -5001=>'L', -5002=>'L', -5003=>'L', -5004=>'L', -5005=>'L', -5006=>'L', -5007=>'L', -5008=>'ON', -5009=>'ON', -5010=>'ON', -5011=>'ON', -5012=>'ON', -5013=>'ON', -5014=>'ON', -5015=>'ON', -5016=>'ON', -5017=>'ON', -5024=>'L', -5025=>'L', -5026=>'L', -5027=>'L', -5028=>'L', -5029=>'L', -5030=>'L', -5031=>'L', -5032=>'L', -5033=>'L', -5034=>'L', -5035=>'L', -5036=>'L', -5037=>'L', -5038=>'L', -5039=>'L', -5040=>'L', -5041=>'L', -5042=>'L', -5043=>'L', -5044=>'L', -5045=>'L', -5046=>'L', -5047=>'L', -5048=>'L', -5049=>'L', -5050=>'L', -5051=>'L', -5052=>'L', -5053=>'L', -5054=>'L', -5055=>'L', -5056=>'L', -5057=>'L', -5058=>'L', -5059=>'L', -5060=>'L', -5061=>'L', -5062=>'L', -5063=>'L', -5064=>'L', -5065=>'L', -5066=>'L', -5067=>'L', -5068=>'L', -5069=>'L', -5070=>'L', -5071=>'L', -5072=>'L', -5073=>'L', -5074=>'L', -5075=>'L', -5076=>'L', -5077=>'L', -5078=>'L', -5079=>'L', -5080=>'L', -5081=>'L', -5082=>'L', -5083=>'L', -5084=>'L', -5085=>'L', -5086=>'L', -5087=>'L', -5088=>'L', -5089=>'L', -5090=>'L', -5091=>'L', -5092=>'L', -5093=>'L', -5094=>'L', -5095=>'L', -5096=>'L', -5097=>'L', -5098=>'L', -5099=>'L', -5100=>'L', -5101=>'L', -5102=>'L', -5103=>'L', -5104=>'L', -5105=>'L', -5106=>'L', -5107=>'L', -5108=>'L', -5121=>'L', -5122=>'L', -5123=>'L', -5124=>'L', -5125=>'L', -5126=>'L', -5127=>'L', -5128=>'L', -5129=>'L', -5130=>'L', -5131=>'L', -5132=>'L', -5133=>'L', -5134=>'L', -5135=>'L', -5136=>'L', -5137=>'L', -5138=>'L', -5139=>'L', -5140=>'L', -5141=>'L', -5142=>'L', -5143=>'L', -5144=>'L', -5145=>'L', -5146=>'L', -5147=>'L', -5148=>'L', -5149=>'L', -5150=>'L', -5151=>'L', -5152=>'L', -5153=>'L', -5154=>'L', -5155=>'L', -5156=>'L', -5157=>'L', -5158=>'L', -5159=>'L', -5160=>'L', -5161=>'L', -5162=>'L', -5163=>'L', -5164=>'L', -5165=>'L', -5166=>'L', -5167=>'L', -5168=>'L', -5169=>'L', -5170=>'L', -5171=>'L', -5172=>'L', -5173=>'L', -5174=>'L', -5175=>'L', -5176=>'L', -5177=>'L', -5178=>'L', -5179=>'L', -5180=>'L', -5181=>'L', -5182=>'L', -5183=>'L', -5184=>'L', -5185=>'L', -5186=>'L', -5187=>'L', -5188=>'L', -5189=>'L', -5190=>'L', -5191=>'L', -5192=>'L', -5193=>'L', -5194=>'L', -5195=>'L', -5196=>'L', -5197=>'L', -5198=>'L', -5199=>'L', -5200=>'L', -5201=>'L', -5202=>'L', -5203=>'L', -5204=>'L', -5205=>'L', -5206=>'L', -5207=>'L', -5208=>'L', -5209=>'L', -5210=>'L', -5211=>'L', -5212=>'L', -5213=>'L', -5214=>'L', -5215=>'L', -5216=>'L', -5217=>'L', -5218=>'L', -5219=>'L', -5220=>'L', -5221=>'L', -5222=>'L', -5223=>'L', -5224=>'L', -5225=>'L', -5226=>'L', -5227=>'L', -5228=>'L', -5229=>'L', -5230=>'L', -5231=>'L', -5232=>'L', -5233=>'L', -5234=>'L', -5235=>'L', -5236=>'L', -5237=>'L', -5238=>'L', -5239=>'L', -5240=>'L', -5241=>'L', -5242=>'L', -5243=>'L', -5244=>'L', -5245=>'L', -5246=>'L', -5247=>'L', -5248=>'L', -5249=>'L', -5250=>'L', -5251=>'L', -5252=>'L', -5253=>'L', -5254=>'L', -5255=>'L', -5256=>'L', -5257=>'L', -5258=>'L', -5259=>'L', -5260=>'L', -5261=>'L', -5262=>'L', -5263=>'L', -5264=>'L', -5265=>'L', -5266=>'L', -5267=>'L', -5268=>'L', -5269=>'L', -5270=>'L', -5271=>'L', -5272=>'L', -5273=>'L', -5274=>'L', -5275=>'L', -5276=>'L', -5277=>'L', -5278=>'L', -5279=>'L', -5280=>'L', -5281=>'L', -5282=>'L', -5283=>'L', -5284=>'L', -5285=>'L', -5286=>'L', -5287=>'L', -5288=>'L', -5289=>'L', -5290=>'L', -5291=>'L', -5292=>'L', -5293=>'L', -5294=>'L', -5295=>'L', -5296=>'L', -5297=>'L', -5298=>'L', -5299=>'L', -5300=>'L', -5301=>'L', -5302=>'L', -5303=>'L', -5304=>'L', -5305=>'L', -5306=>'L', -5307=>'L', -5308=>'L', -5309=>'L', -5310=>'L', -5311=>'L', -5312=>'L', -5313=>'L', -5314=>'L', -5315=>'L', -5316=>'L', -5317=>'L', -5318=>'L', -5319=>'L', -5320=>'L', -5321=>'L', -5322=>'L', -5323=>'L', -5324=>'L', -5325=>'L', -5326=>'L', -5327=>'L', -5328=>'L', -5329=>'L', -5330=>'L', -5331=>'L', -5332=>'L', -5333=>'L', -5334=>'L', -5335=>'L', -5336=>'L', -5337=>'L', -5338=>'L', -5339=>'L', -5340=>'L', -5341=>'L', -5342=>'L', -5343=>'L', -5344=>'L', -5345=>'L', -5346=>'L', -5347=>'L', -5348=>'L', -5349=>'L', -5350=>'L', -5351=>'L', -5352=>'L', -5353=>'L', -5354=>'L', -5355=>'L', -5356=>'L', -5357=>'L', -5358=>'L', -5359=>'L', -5360=>'L', -5361=>'L', -5362=>'L', -5363=>'L', -5364=>'L', -5365=>'L', -5366=>'L', -5367=>'L', -5368=>'L', -5369=>'L', -5370=>'L', -5371=>'L', -5372=>'L', -5373=>'L', -5374=>'L', -5375=>'L', -5376=>'L', -5377=>'L', -5378=>'L', -5379=>'L', -5380=>'L', -5381=>'L', -5382=>'L', -5383=>'L', -5384=>'L', -5385=>'L', -5386=>'L', -5387=>'L', -5388=>'L', -5389=>'L', -5390=>'L', -5391=>'L', -5392=>'L', -5393=>'L', -5394=>'L', -5395=>'L', -5396=>'L', -5397=>'L', -5398=>'L', -5399=>'L', -5400=>'L', -5401=>'L', -5402=>'L', -5403=>'L', -5404=>'L', -5405=>'L', -5406=>'L', -5407=>'L', -5408=>'L', -5409=>'L', -5410=>'L', -5411=>'L', -5412=>'L', -5413=>'L', -5414=>'L', -5415=>'L', -5416=>'L', -5417=>'L', -5418=>'L', -5419=>'L', -5420=>'L', -5421=>'L', -5422=>'L', -5423=>'L', -5424=>'L', -5425=>'L', -5426=>'L', -5427=>'L', -5428=>'L', -5429=>'L', -5430=>'L', -5431=>'L', -5432=>'L', -5433=>'L', -5434=>'L', -5435=>'L', -5436=>'L', -5437=>'L', -5438=>'L', -5439=>'L', -5440=>'L', -5441=>'L', -5442=>'L', -5443=>'L', -5444=>'L', -5445=>'L', -5446=>'L', -5447=>'L', -5448=>'L', -5449=>'L', -5450=>'L', -5451=>'L', -5452=>'L', -5453=>'L', -5454=>'L', -5455=>'L', -5456=>'L', -5457=>'L', -5458=>'L', -5459=>'L', -5460=>'L', -5461=>'L', -5462=>'L', -5463=>'L', -5464=>'L', -5465=>'L', -5466=>'L', -5467=>'L', -5468=>'L', -5469=>'L', -5470=>'L', -5471=>'L', -5472=>'L', -5473=>'L', -5474=>'L', -5475=>'L', -5476=>'L', -5477=>'L', -5478=>'L', -5479=>'L', -5480=>'L', -5481=>'L', -5482=>'L', -5483=>'L', -5484=>'L', -5485=>'L', -5486=>'L', -5487=>'L', -5488=>'L', -5489=>'L', -5490=>'L', -5491=>'L', -5492=>'L', -5493=>'L', -5494=>'L', -5495=>'L', -5496=>'L', -5497=>'L', -5498=>'L', -5499=>'L', -5500=>'L', -5501=>'L', -5502=>'L', -5503=>'L', -5504=>'L', -5505=>'L', -5506=>'L', -5507=>'L', -5508=>'L', -5509=>'L', -5510=>'L', -5511=>'L', -5512=>'L', -5513=>'L', -5514=>'L', -5515=>'L', -5516=>'L', -5517=>'L', -5518=>'L', -5519=>'L', -5520=>'L', -5521=>'L', -5522=>'L', -5523=>'L', -5524=>'L', -5525=>'L', -5526=>'L', -5527=>'L', -5528=>'L', -5529=>'L', -5530=>'L', -5531=>'L', -5532=>'L', -5533=>'L', -5534=>'L', -5535=>'L', -5536=>'L', -5537=>'L', -5538=>'L', -5539=>'L', -5540=>'L', -5541=>'L', -5542=>'L', -5543=>'L', -5544=>'L', -5545=>'L', -5546=>'L', -5547=>'L', -5548=>'L', -5549=>'L', -5550=>'L', -5551=>'L', -5552=>'L', -5553=>'L', -5554=>'L', -5555=>'L', -5556=>'L', -5557=>'L', -5558=>'L', -5559=>'L', -5560=>'L', -5561=>'L', -5562=>'L', -5563=>'L', -5564=>'L', -5565=>'L', -5566=>'L', -5567=>'L', -5568=>'L', -5569=>'L', -5570=>'L', -5571=>'L', -5572=>'L', -5573=>'L', -5574=>'L', -5575=>'L', -5576=>'L', -5577=>'L', -5578=>'L', -5579=>'L', -5580=>'L', -5581=>'L', -5582=>'L', -5583=>'L', -5584=>'L', -5585=>'L', -5586=>'L', -5587=>'L', -5588=>'L', -5589=>'L', -5590=>'L', -5591=>'L', -5592=>'L', -5593=>'L', -5594=>'L', -5595=>'L', -5596=>'L', -5597=>'L', -5598=>'L', -5599=>'L', -5600=>'L', -5601=>'L', -5602=>'L', -5603=>'L', -5604=>'L', -5605=>'L', -5606=>'L', -5607=>'L', -5608=>'L', -5609=>'L', -5610=>'L', -5611=>'L', -5612=>'L', -5613=>'L', -5614=>'L', -5615=>'L', -5616=>'L', -5617=>'L', -5618=>'L', -5619=>'L', -5620=>'L', -5621=>'L', -5622=>'L', -5623=>'L', -5624=>'L', -5625=>'L', -5626=>'L', -5627=>'L', -5628=>'L', -5629=>'L', -5630=>'L', -5631=>'L', -5632=>'L', -5633=>'L', -5634=>'L', -5635=>'L', -5636=>'L', -5637=>'L', -5638=>'L', -5639=>'L', -5640=>'L', -5641=>'L', -5642=>'L', -5643=>'L', -5644=>'L', -5645=>'L', -5646=>'L', -5647=>'L', -5648=>'L', -5649=>'L', -5650=>'L', -5651=>'L', -5652=>'L', -5653=>'L', -5654=>'L', -5655=>'L', -5656=>'L', -5657=>'L', -5658=>'L', -5659=>'L', -5660=>'L', -5661=>'L', -5662=>'L', -5663=>'L', -5664=>'L', -5665=>'L', -5666=>'L', -5667=>'L', -5668=>'L', -5669=>'L', -5670=>'L', -5671=>'L', -5672=>'L', -5673=>'L', -5674=>'L', -5675=>'L', -5676=>'L', -5677=>'L', -5678=>'L', -5679=>'L', -5680=>'L', -5681=>'L', -5682=>'L', -5683=>'L', -5684=>'L', -5685=>'L', -5686=>'L', -5687=>'L', -5688=>'L', -5689=>'L', -5690=>'L', -5691=>'L', -5692=>'L', -5693=>'L', -5694=>'L', -5695=>'L', -5696=>'L', -5697=>'L', -5698=>'L', -5699=>'L', -5700=>'L', -5701=>'L', -5702=>'L', -5703=>'L', -5704=>'L', -5705=>'L', -5706=>'L', -5707=>'L', -5708=>'L', -5709=>'L', -5710=>'L', -5711=>'L', -5712=>'L', -5713=>'L', -5714=>'L', -5715=>'L', -5716=>'L', -5717=>'L', -5718=>'L', -5719=>'L', -5720=>'L', -5721=>'L', -5722=>'L', -5723=>'L', -5724=>'L', -5725=>'L', -5726=>'L', -5727=>'L', -5728=>'L', -5729=>'L', -5730=>'L', -5731=>'L', -5732=>'L', -5733=>'L', -5734=>'L', -5735=>'L', -5736=>'L', -5737=>'L', -5738=>'L', -5739=>'L', -5740=>'L', -5741=>'L', -5742=>'L', -5743=>'L', -5744=>'L', -5745=>'L', -5746=>'L', -5747=>'L', -5748=>'L', -5749=>'L', -5750=>'L', -5760=>'WS', -5761=>'L', -5762=>'L', -5763=>'L', -5764=>'L', -5765=>'L', -5766=>'L', -5767=>'L', -5768=>'L', -5769=>'L', -5770=>'L', -5771=>'L', -5772=>'L', -5773=>'L', -5774=>'L', -5775=>'L', -5776=>'L', -5777=>'L', -5778=>'L', -5779=>'L', -5780=>'L', -5781=>'L', -5782=>'L', -5783=>'L', -5784=>'L', -5785=>'L', -5786=>'L', -5787=>'ON', -5788=>'ON', -5792=>'L', -5793=>'L', -5794=>'L', -5795=>'L', -5796=>'L', -5797=>'L', -5798=>'L', -5799=>'L', -5800=>'L', -5801=>'L', -5802=>'L', -5803=>'L', -5804=>'L', -5805=>'L', -5806=>'L', -5807=>'L', -5808=>'L', -5809=>'L', -5810=>'L', -5811=>'L', -5812=>'L', -5813=>'L', -5814=>'L', -5815=>'L', -5816=>'L', -5817=>'L', -5818=>'L', -5819=>'L', -5820=>'L', -5821=>'L', -5822=>'L', -5823=>'L', -5824=>'L', -5825=>'L', -5826=>'L', -5827=>'L', -5828=>'L', -5829=>'L', -5830=>'L', -5831=>'L', -5832=>'L', -5833=>'L', -5834=>'L', -5835=>'L', -5836=>'L', -5837=>'L', -5838=>'L', -5839=>'L', -5840=>'L', -5841=>'L', -5842=>'L', -5843=>'L', -5844=>'L', -5845=>'L', -5846=>'L', -5847=>'L', -5848=>'L', -5849=>'L', -5850=>'L', -5851=>'L', -5852=>'L', -5853=>'L', -5854=>'L', -5855=>'L', -5856=>'L', -5857=>'L', -5858=>'L', -5859=>'L', -5860=>'L', -5861=>'L', -5862=>'L', -5863=>'L', -5864=>'L', -5865=>'L', -5866=>'L', -5867=>'L', -5868=>'L', -5869=>'L', -5870=>'L', -5871=>'L', -5872=>'L', -5888=>'L', -5889=>'L', -5890=>'L', -5891=>'L', -5892=>'L', -5893=>'L', -5894=>'L', -5895=>'L', -5896=>'L', -5897=>'L', -5898=>'L', -5899=>'L', -5900=>'L', -5902=>'L', -5903=>'L', -5904=>'L', -5905=>'L', -5906=>'NSM', -5907=>'NSM', -5908=>'NSM', -5920=>'L', -5921=>'L', -5922=>'L', -5923=>'L', -5924=>'L', -5925=>'L', -5926=>'L', -5927=>'L', -5928=>'L', -5929=>'L', -5930=>'L', -5931=>'L', -5932=>'L', -5933=>'L', -5934=>'L', -5935=>'L', -5936=>'L', -5937=>'L', -5938=>'NSM', -5939=>'NSM', -5940=>'NSM', -5941=>'L', -5942=>'L', -5952=>'L', -5953=>'L', -5954=>'L', -5955=>'L', -5956=>'L', -5957=>'L', -5958=>'L', -5959=>'L', -5960=>'L', -5961=>'L', -5962=>'L', -5963=>'L', -5964=>'L', -5965=>'L', -5966=>'L', -5967=>'L', -5968=>'L', -5969=>'L', -5970=>'NSM', -5971=>'NSM', -5984=>'L', -5985=>'L', -5986=>'L', -5987=>'L', -5988=>'L', -5989=>'L', -5990=>'L', -5991=>'L', -5992=>'L', -5993=>'L', -5994=>'L', -5995=>'L', -5996=>'L', -5998=>'L', -5999=>'L', -6000=>'L', -6002=>'NSM', -6003=>'NSM', -6016=>'L', -6017=>'L', -6018=>'L', -6019=>'L', -6020=>'L', -6021=>'L', -6022=>'L', -6023=>'L', -6024=>'L', -6025=>'L', -6026=>'L', -6027=>'L', -6028=>'L', -6029=>'L', -6030=>'L', -6031=>'L', -6032=>'L', -6033=>'L', -6034=>'L', -6035=>'L', -6036=>'L', -6037=>'L', -6038=>'L', -6039=>'L', -6040=>'L', -6041=>'L', -6042=>'L', -6043=>'L', -6044=>'L', -6045=>'L', -6046=>'L', -6047=>'L', -6048=>'L', -6049=>'L', -6050=>'L', -6051=>'L', -6052=>'L', -6053=>'L', -6054=>'L', -6055=>'L', -6056=>'L', -6057=>'L', -6058=>'L', -6059=>'L', -6060=>'L', -6061=>'L', -6062=>'L', -6063=>'L', -6064=>'L', -6065=>'L', -6066=>'L', -6067=>'L', -6068=>'L', -6069=>'L', -6070=>'L', -6071=>'NSM', -6072=>'NSM', -6073=>'NSM', -6074=>'NSM', -6075=>'NSM', -6076=>'NSM', -6077=>'NSM', -6078=>'L', -6079=>'L', -6080=>'L', -6081=>'L', -6082=>'L', -6083=>'L', -6084=>'L', -6085=>'L', -6086=>'NSM', -6087=>'L', -6088=>'L', -6089=>'NSM', -6090=>'NSM', -6091=>'NSM', -6092=>'NSM', -6093=>'NSM', -6094=>'NSM', -6095=>'NSM', -6096=>'NSM', -6097=>'NSM', -6098=>'NSM', -6099=>'NSM', -6100=>'L', -6101=>'L', -6102=>'L', -6103=>'L', -6104=>'L', -6105=>'L', -6106=>'L', -6107=>'ET', -6108=>'L', -6109=>'NSM', -6112=>'L', -6113=>'L', -6114=>'L', -6115=>'L', -6116=>'L', -6117=>'L', -6118=>'L', -6119=>'L', -6120=>'L', -6121=>'L', -6128=>'ON', -6129=>'ON', -6130=>'ON', -6131=>'ON', -6132=>'ON', -6133=>'ON', -6134=>'ON', -6135=>'ON', -6136=>'ON', -6137=>'ON', -6144=>'ON', -6145=>'ON', -6146=>'ON', -6147=>'ON', -6148=>'ON', -6149=>'ON', -6150=>'ON', -6151=>'ON', -6152=>'ON', -6153=>'ON', -6154=>'ON', -6155=>'NSM', -6156=>'NSM', -6157=>'NSM', -6158=>'WS', -6160=>'L', -6161=>'L', -6162=>'L', -6163=>'L', -6164=>'L', -6165=>'L', -6166=>'L', -6167=>'L', -6168=>'L', -6169=>'L', -6176=>'L', -6177=>'L', -6178=>'L', -6179=>'L', -6180=>'L', -6181=>'L', -6182=>'L', -6183=>'L', -6184=>'L', -6185=>'L', -6186=>'L', -6187=>'L', -6188=>'L', -6189=>'L', -6190=>'L', -6191=>'L', -6192=>'L', -6193=>'L', -6194=>'L', -6195=>'L', -6196=>'L', -6197=>'L', -6198=>'L', -6199=>'L', -6200=>'L', -6201=>'L', -6202=>'L', -6203=>'L', -6204=>'L', -6205=>'L', -6206=>'L', -6207=>'L', -6208=>'L', -6209=>'L', -6210=>'L', -6211=>'L', -6212=>'L', -6213=>'L', -6214=>'L', -6215=>'L', -6216=>'L', -6217=>'L', -6218=>'L', -6219=>'L', -6220=>'L', -6221=>'L', -6222=>'L', -6223=>'L', -6224=>'L', -6225=>'L', -6226=>'L', -6227=>'L', -6228=>'L', -6229=>'L', -6230=>'L', -6231=>'L', -6232=>'L', -6233=>'L', -6234=>'L', -6235=>'L', -6236=>'L', -6237=>'L', -6238=>'L', -6239=>'L', -6240=>'L', -6241=>'L', -6242=>'L', -6243=>'L', -6244=>'L', -6245=>'L', -6246=>'L', -6247=>'L', -6248=>'L', -6249=>'L', -6250=>'L', -6251=>'L', -6252=>'L', -6253=>'L', -6254=>'L', -6255=>'L', -6256=>'L', -6257=>'L', -6258=>'L', -6259=>'L', -6260=>'L', -6261=>'L', -6262=>'L', -6263=>'L', -6272=>'L', -6273=>'L', -6274=>'L', -6275=>'L', -6276=>'L', -6277=>'L', -6278=>'L', -6279=>'L', -6280=>'L', -6281=>'L', -6282=>'L', -6283=>'L', -6284=>'L', -6285=>'L', -6286=>'L', -6287=>'L', -6288=>'L', -6289=>'L', -6290=>'L', -6291=>'L', -6292=>'L', -6293=>'L', -6294=>'L', -6295=>'L', -6296=>'L', -6297=>'L', -6298=>'L', -6299=>'L', -6300=>'L', -6301=>'L', -6302=>'L', -6303=>'L', -6304=>'L', -6305=>'L', -6306=>'L', -6307=>'L', -6308=>'L', -6309=>'L', -6310=>'L', -6311=>'L', -6312=>'L', -6313=>'NSM', -6400=>'L', -6401=>'L', -6402=>'L', -6403=>'L', -6404=>'L', -6405=>'L', -6406=>'L', -6407=>'L', -6408=>'L', -6409=>'L', -6410=>'L', -6411=>'L', -6412=>'L', -6413=>'L', -6414=>'L', -6415=>'L', -6416=>'L', -6417=>'L', -6418=>'L', -6419=>'L', -6420=>'L', -6421=>'L', -6422=>'L', -6423=>'L', -6424=>'L', -6425=>'L', -6426=>'L', -6427=>'L', -6428=>'L', -6432=>'NSM', -6433=>'NSM', -6434=>'NSM', -6435=>'L', -6436=>'L', -6437=>'L', -6438=>'L', -6439=>'NSM', -6440=>'NSM', -6441=>'NSM', -6442=>'NSM', -6443=>'NSM', -6448=>'L', -6449=>'L', -6450=>'NSM', -6451=>'L', -6452=>'L', -6453=>'L', -6454=>'L', -6455=>'L', -6456=>'L', -6457=>'NSM', -6458=>'NSM', -6459=>'NSM', -6464=>'ON', -6468=>'ON', -6469=>'ON', -6470=>'L', -6471=>'L', -6472=>'L', -6473=>'L', -6474=>'L', -6475=>'L', -6476=>'L', -6477=>'L', -6478=>'L', -6479=>'L', -6480=>'L', -6481=>'L', -6482=>'L', -6483=>'L', -6484=>'L', -6485=>'L', -6486=>'L', -6487=>'L', -6488=>'L', -6489=>'L', -6490=>'L', -6491=>'L', -6492=>'L', -6493=>'L', -6494=>'L', -6495=>'L', -6496=>'L', -6497=>'L', -6498=>'L', -6499=>'L', -6500=>'L', -6501=>'L', -6502=>'L', -6503=>'L', -6504=>'L', -6505=>'L', -6506=>'L', -6507=>'L', -6508=>'L', -6509=>'L', -6512=>'L', -6513=>'L', -6514=>'L', -6515=>'L', -6516=>'L', -6528=>'L', -6529=>'L', -6530=>'L', -6531=>'L', -6532=>'L', -6533=>'L', -6534=>'L', -6535=>'L', -6536=>'L', -6537=>'L', -6538=>'L', -6539=>'L', -6540=>'L', -6541=>'L', -6542=>'L', -6543=>'L', -6544=>'L', -6545=>'L', -6546=>'L', -6547=>'L', -6548=>'L', -6549=>'L', -6550=>'L', -6551=>'L', -6552=>'L', -6553=>'L', -6554=>'L', -6555=>'L', -6556=>'L', -6557=>'L', -6558=>'L', -6559=>'L', -6560=>'L', -6561=>'L', -6562=>'L', -6563=>'L', -6564=>'L', -6565=>'L', -6566=>'L', -6567=>'L', -6568=>'L', -6569=>'L', -6576=>'L', -6577=>'L', -6578=>'L', -6579=>'L', -6580=>'L', -6581=>'L', -6582=>'L', -6583=>'L', -6584=>'L', -6585=>'L', -6586=>'L', -6587=>'L', -6588=>'L', -6589=>'L', -6590=>'L', -6591=>'L', -6592=>'L', -6593=>'L', -6594=>'L', -6595=>'L', -6596=>'L', -6597=>'L', -6598=>'L', -6599=>'L', -6600=>'L', -6601=>'L', -6608=>'L', -6609=>'L', -6610=>'L', -6611=>'L', -6612=>'L', -6613=>'L', -6614=>'L', -6615=>'L', -6616=>'L', -6617=>'L', -6622=>'ON', -6623=>'ON', -6624=>'ON', -6625=>'ON', -6626=>'ON', -6627=>'ON', -6628=>'ON', -6629=>'ON', -6630=>'ON', -6631=>'ON', -6632=>'ON', -6633=>'ON', -6634=>'ON', -6635=>'ON', -6636=>'ON', -6637=>'ON', -6638=>'ON', -6639=>'ON', -6640=>'ON', -6641=>'ON', -6642=>'ON', -6643=>'ON', -6644=>'ON', -6645=>'ON', -6646=>'ON', -6647=>'ON', -6648=>'ON', -6649=>'ON', -6650=>'ON', -6651=>'ON', -6652=>'ON', -6653=>'ON', -6654=>'ON', -6655=>'ON', -6656=>'L', -6657=>'L', -6658=>'L', -6659=>'L', -6660=>'L', -6661=>'L', -6662=>'L', -6663=>'L', -6664=>'L', -6665=>'L', -6666=>'L', -6667=>'L', -6668=>'L', -6669=>'L', -6670=>'L', -6671=>'L', -6672=>'L', -6673=>'L', -6674=>'L', -6675=>'L', -6676=>'L', -6677=>'L', -6678=>'L', -6679=>'NSM', -6680=>'NSM', -6681=>'L', -6682=>'L', -6683=>'L', -6686=>'L', -6687=>'L', -6912=>'NSM', -6913=>'NSM', -6914=>'NSM', -6915=>'NSM', -6916=>'L', -6917=>'L', -6918=>'L', -6919=>'L', -6920=>'L', -6921=>'L', -6922=>'L', -6923=>'L', -6924=>'L', -6925=>'L', -6926=>'L', -6927=>'L', -6928=>'L', -6929=>'L', -6930=>'L', -6931=>'L', -6932=>'L', -6933=>'L', -6934=>'L', -6935=>'L', -6936=>'L', -6937=>'L', -6938=>'L', -6939=>'L', -6940=>'L', -6941=>'L', -6942=>'L', -6943=>'L', -6944=>'L', -6945=>'L', -6946=>'L', -6947=>'L', -6948=>'L', -6949=>'L', -6950=>'L', -6951=>'L', -6952=>'L', -6953=>'L', -6954=>'L', -6955=>'L', -6956=>'L', -6957=>'L', -6958=>'L', -6959=>'L', -6960=>'L', -6961=>'L', -6962=>'L', -6963=>'L', -6964=>'NSM', -6965=>'L', -6966=>'NSM', -6967=>'NSM', -6968=>'NSM', -6969=>'NSM', -6970=>'NSM', -6971=>'L', -6972=>'NSM', -6973=>'L', -6974=>'L', -6975=>'L', -6976=>'L', -6977=>'L', -6978=>'NSM', -6979=>'L', -6980=>'L', -6981=>'L', -6982=>'L', -6983=>'L', -6984=>'L', -6985=>'L', -6986=>'L', -6987=>'L', -6992=>'L', -6993=>'L', -6994=>'L', -6995=>'L', -6996=>'L', -6997=>'L', -6998=>'L', -6999=>'L', -7000=>'L', -7001=>'L', -7002=>'L', -7003=>'L', -7004=>'L', -7005=>'L', -7006=>'L', -7007=>'L', -7008=>'L', -7009=>'L', -7010=>'L', -7011=>'L', -7012=>'L', -7013=>'L', -7014=>'L', -7015=>'L', -7016=>'L', -7017=>'L', -7018=>'L', -7019=>'NSM', -7020=>'NSM', -7021=>'NSM', -7022=>'NSM', -7023=>'NSM', -7024=>'NSM', -7025=>'NSM', -7026=>'NSM', -7027=>'NSM', -7028=>'L', -7029=>'L', -7030=>'L', -7031=>'L', -7032=>'L', -7033=>'L', -7034=>'L', -7035=>'L', -7036=>'L', -7424=>'L', -7425=>'L', -7426=>'L', -7427=>'L', -7428=>'L', -7429=>'L', -7430=>'L', -7431=>'L', -7432=>'L', -7433=>'L', -7434=>'L', -7435=>'L', -7436=>'L', -7437=>'L', -7438=>'L', -7439=>'L', -7440=>'L', -7441=>'L', -7442=>'L', -7443=>'L', -7444=>'L', -7445=>'L', -7446=>'L', -7447=>'L', -7448=>'L', -7449=>'L', -7450=>'L', -7451=>'L', -7452=>'L', -7453=>'L', -7454=>'L', -7455=>'L', -7456=>'L', -7457=>'L', -7458=>'L', -7459=>'L', -7460=>'L', -7461=>'L', -7462=>'L', -7463=>'L', -7464=>'L', -7465=>'L', -7466=>'L', -7467=>'L', -7468=>'L', -7469=>'L', -7470=>'L', -7471=>'L', -7472=>'L', -7473=>'L', -7474=>'L', -7475=>'L', -7476=>'L', -7477=>'L', -7478=>'L', -7479=>'L', -7480=>'L', -7481=>'L', -7482=>'L', -7483=>'L', -7484=>'L', -7485=>'L', -7486=>'L', -7487=>'L', -7488=>'L', -7489=>'L', -7490=>'L', -7491=>'L', -7492=>'L', -7493=>'L', -7494=>'L', -7495=>'L', -7496=>'L', -7497=>'L', -7498=>'L', -7499=>'L', -7500=>'L', -7501=>'L', -7502=>'L', -7503=>'L', -7504=>'L', -7505=>'L', -7506=>'L', -7507=>'L', -7508=>'L', -7509=>'L', -7510=>'L', -7511=>'L', -7512=>'L', -7513=>'L', -7514=>'L', -7515=>'L', -7516=>'L', -7517=>'L', -7518=>'L', -7519=>'L', -7520=>'L', -7521=>'L', -7522=>'L', -7523=>'L', -7524=>'L', -7525=>'L', -7526=>'L', -7527=>'L', -7528=>'L', -7529=>'L', -7530=>'L', -7531=>'L', -7532=>'L', -7533=>'L', -7534=>'L', -7535=>'L', -7536=>'L', -7537=>'L', -7538=>'L', -7539=>'L', -7540=>'L', -7541=>'L', -7542=>'L', -7543=>'L', -7544=>'L', -7545=>'L', -7546=>'L', -7547=>'L', -7548=>'L', -7549=>'L', -7550=>'L', -7551=>'L', -7552=>'L', -7553=>'L', -7554=>'L', -7555=>'L', -7556=>'L', -7557=>'L', -7558=>'L', -7559=>'L', -7560=>'L', -7561=>'L', -7562=>'L', -7563=>'L', -7564=>'L', -7565=>'L', -7566=>'L', -7567=>'L', -7568=>'L', -7569=>'L', -7570=>'L', -7571=>'L', -7572=>'L', -7573=>'L', -7574=>'L', -7575=>'L', -7576=>'L', -7577=>'L', -7578=>'L', -7579=>'L', -7580=>'L', -7581=>'L', -7582=>'L', -7583=>'L', -7584=>'L', -7585=>'L', -7586=>'L', -7587=>'L', -7588=>'L', -7589=>'L', -7590=>'L', -7591=>'L', -7592=>'L', -7593=>'L', -7594=>'L', -7595=>'L', -7596=>'L', -7597=>'L', -7598=>'L', -7599=>'L', -7600=>'L', -7601=>'L', -7602=>'L', -7603=>'L', -7604=>'L', -7605=>'L', -7606=>'L', -7607=>'L', -7608=>'L', -7609=>'L', -7610=>'L', -7611=>'L', -7612=>'L', -7613=>'L', -7614=>'L', -7615=>'L', -7616=>'NSM', -7617=>'NSM', -7618=>'NSM', -7619=>'NSM', -7620=>'NSM', -7621=>'NSM', -7622=>'NSM', -7623=>'NSM', -7624=>'NSM', -7625=>'NSM', -7626=>'NSM', -7678=>'NSM', -7679=>'NSM', -7680=>'L', -7681=>'L', -7682=>'L', -7683=>'L', -7684=>'L', -7685=>'L', -7686=>'L', -7687=>'L', -7688=>'L', -7689=>'L', -7690=>'L', -7691=>'L', -7692=>'L', -7693=>'L', -7694=>'L', -7695=>'L', -7696=>'L', -7697=>'L', -7698=>'L', -7699=>'L', -7700=>'L', -7701=>'L', -7702=>'L', -7703=>'L', -7704=>'L', -7705=>'L', -7706=>'L', -7707=>'L', -7708=>'L', -7709=>'L', -7710=>'L', -7711=>'L', -7712=>'L', -7713=>'L', -7714=>'L', -7715=>'L', -7716=>'L', -7717=>'L', -7718=>'L', -7719=>'L', -7720=>'L', -7721=>'L', -7722=>'L', -7723=>'L', -7724=>'L', -7725=>'L', -7726=>'L', -7727=>'L', -7728=>'L', -7729=>'L', -7730=>'L', -7731=>'L', -7732=>'L', -7733=>'L', -7734=>'L', -7735=>'L', -7736=>'L', -7737=>'L', -7738=>'L', -7739=>'L', -7740=>'L', -7741=>'L', -7742=>'L', -7743=>'L', -7744=>'L', -7745=>'L', -7746=>'L', -7747=>'L', -7748=>'L', -7749=>'L', -7750=>'L', -7751=>'L', -7752=>'L', -7753=>'L', -7754=>'L', -7755=>'L', -7756=>'L', -7757=>'L', -7758=>'L', -7759=>'L', -7760=>'L', -7761=>'L', -7762=>'L', -7763=>'L', -7764=>'L', -7765=>'L', -7766=>'L', -7767=>'L', -7768=>'L', -7769=>'L', -7770=>'L', -7771=>'L', -7772=>'L', -7773=>'L', -7774=>'L', -7775=>'L', -7776=>'L', -7777=>'L', -7778=>'L', -7779=>'L', -7780=>'L', -7781=>'L', -7782=>'L', -7783=>'L', -7784=>'L', -7785=>'L', -7786=>'L', -7787=>'L', -7788=>'L', -7789=>'L', -7790=>'L', -7791=>'L', -7792=>'L', -7793=>'L', -7794=>'L', -7795=>'L', -7796=>'L', -7797=>'L', -7798=>'L', -7799=>'L', -7800=>'L', -7801=>'L', -7802=>'L', -7803=>'L', -7804=>'L', -7805=>'L', -7806=>'L', -7807=>'L', -7808=>'L', -7809=>'L', -7810=>'L', -7811=>'L', -7812=>'L', -7813=>'L', -7814=>'L', -7815=>'L', -7816=>'L', -7817=>'L', -7818=>'L', -7819=>'L', -7820=>'L', -7821=>'L', -7822=>'L', -7823=>'L', -7824=>'L', -7825=>'L', -7826=>'L', -7827=>'L', -7828=>'L', -7829=>'L', -7830=>'L', -7831=>'L', -7832=>'L', -7833=>'L', -7834=>'L', -7835=>'L', -7840=>'L', -7841=>'L', -7842=>'L', -7843=>'L', -7844=>'L', -7845=>'L', -7846=>'L', -7847=>'L', -7848=>'L', -7849=>'L', -7850=>'L', -7851=>'L', -7852=>'L', -7853=>'L', -7854=>'L', -7855=>'L', -7856=>'L', -7857=>'L', -7858=>'L', -7859=>'L', -7860=>'L', -7861=>'L', -7862=>'L', -7863=>'L', -7864=>'L', -7865=>'L', -7866=>'L', -7867=>'L', -7868=>'L', -7869=>'L', -7870=>'L', -7871=>'L', -7872=>'L', -7873=>'L', -7874=>'L', -7875=>'L', -7876=>'L', -7877=>'L', -7878=>'L', -7879=>'L', -7880=>'L', -7881=>'L', -7882=>'L', -7883=>'L', -7884=>'L', -7885=>'L', -7886=>'L', -7887=>'L', -7888=>'L', -7889=>'L', -7890=>'L', -7891=>'L', -7892=>'L', -7893=>'L', -7894=>'L', -7895=>'L', -7896=>'L', -7897=>'L', -7898=>'L', -7899=>'L', -7900=>'L', -7901=>'L', -7902=>'L', -7903=>'L', -7904=>'L', -7905=>'L', -7906=>'L', -7907=>'L', -7908=>'L', -7909=>'L', -7910=>'L', -7911=>'L', -7912=>'L', -7913=>'L', -7914=>'L', -7915=>'L', -7916=>'L', -7917=>'L', -7918=>'L', -7919=>'L', -7920=>'L', -7921=>'L', -7922=>'L', -7923=>'L', -7924=>'L', -7925=>'L', -7926=>'L', -7927=>'L', -7928=>'L', -7929=>'L', -7936=>'L', -7937=>'L', -7938=>'L', -7939=>'L', -7940=>'L', -7941=>'L', -7942=>'L', -7943=>'L', -7944=>'L', -7945=>'L', -7946=>'L', -7947=>'L', -7948=>'L', -7949=>'L', -7950=>'L', -7951=>'L', -7952=>'L', -7953=>'L', -7954=>'L', -7955=>'L', -7956=>'L', -7957=>'L', -7960=>'L', -7961=>'L', -7962=>'L', -7963=>'L', -7964=>'L', -7965=>'L', -7968=>'L', -7969=>'L', -7970=>'L', -7971=>'L', -7972=>'L', -7973=>'L', -7974=>'L', -7975=>'L', -7976=>'L', -7977=>'L', -7978=>'L', -7979=>'L', -7980=>'L', -7981=>'L', -7982=>'L', -7983=>'L', -7984=>'L', -7985=>'L', -7986=>'L', -7987=>'L', -7988=>'L', -7989=>'L', -7990=>'L', -7991=>'L', -7992=>'L', -7993=>'L', -7994=>'L', -7995=>'L', -7996=>'L', -7997=>'L', -7998=>'L', -7999=>'L', -8000=>'L', -8001=>'L', -8002=>'L', -8003=>'L', -8004=>'L', -8005=>'L', -8008=>'L', -8009=>'L', -8010=>'L', -8011=>'L', -8012=>'L', -8013=>'L', -8016=>'L', -8017=>'L', -8018=>'L', -8019=>'L', -8020=>'L', -8021=>'L', -8022=>'L', -8023=>'L', -8025=>'L', -8027=>'L', -8029=>'L', -8031=>'L', -8032=>'L', -8033=>'L', -8034=>'L', -8035=>'L', -8036=>'L', -8037=>'L', -8038=>'L', -8039=>'L', -8040=>'L', -8041=>'L', -8042=>'L', -8043=>'L', -8044=>'L', -8045=>'L', -8046=>'L', -8047=>'L', -8048=>'L', -8049=>'L', -8050=>'L', -8051=>'L', -8052=>'L', -8053=>'L', -8054=>'L', -8055=>'L', -8056=>'L', -8057=>'L', -8058=>'L', -8059=>'L', -8060=>'L', -8061=>'L', -8064=>'L', -8065=>'L', -8066=>'L', -8067=>'L', -8068=>'L', -8069=>'L', -8070=>'L', -8071=>'L', -8072=>'L', -8073=>'L', -8074=>'L', -8075=>'L', -8076=>'L', -8077=>'L', -8078=>'L', -8079=>'L', -8080=>'L', -8081=>'L', -8082=>'L', -8083=>'L', -8084=>'L', -8085=>'L', -8086=>'L', -8087=>'L', -8088=>'L', -8089=>'L', -8090=>'L', -8091=>'L', -8092=>'L', -8093=>'L', -8094=>'L', -8095=>'L', -8096=>'L', -8097=>'L', -8098=>'L', -8099=>'L', -8100=>'L', -8101=>'L', -8102=>'L', -8103=>'L', -8104=>'L', -8105=>'L', -8106=>'L', -8107=>'L', -8108=>'L', -8109=>'L', -8110=>'L', -8111=>'L', -8112=>'L', -8113=>'L', -8114=>'L', -8115=>'L', -8116=>'L', -8118=>'L', -8119=>'L', -8120=>'L', -8121=>'L', -8122=>'L', -8123=>'L', -8124=>'L', -8125=>'ON', -8126=>'L', -8127=>'ON', -8128=>'ON', -8129=>'ON', -8130=>'L', -8131=>'L', -8132=>'L', -8134=>'L', -8135=>'L', -8136=>'L', -8137=>'L', -8138=>'L', -8139=>'L', -8140=>'L', -8141=>'ON', -8142=>'ON', -8143=>'ON', -8144=>'L', -8145=>'L', -8146=>'L', -8147=>'L', -8150=>'L', -8151=>'L', -8152=>'L', -8153=>'L', -8154=>'L', -8155=>'L', -8157=>'ON', -8158=>'ON', -8159=>'ON', -8160=>'L', -8161=>'L', -8162=>'L', -8163=>'L', -8164=>'L', -8165=>'L', -8166=>'L', -8167=>'L', -8168=>'L', -8169=>'L', -8170=>'L', -8171=>'L', -8172=>'L', -8173=>'ON', -8174=>'ON', -8175=>'ON', -8178=>'L', -8179=>'L', -8180=>'L', -8182=>'L', -8183=>'L', -8184=>'L', -8185=>'L', -8186=>'L', -8187=>'L', -8188=>'L', -8189=>'ON', -8190=>'ON', -8192=>'WS', -8193=>'WS', -8194=>'WS', -8195=>'WS', -8196=>'WS', -8197=>'WS', -8198=>'WS', -8199=>'WS', -8200=>'WS', -8201=>'WS', -8202=>'WS', -8203=>'BN', -8204=>'BN', -8205=>'BN', -8206=>'L', -8207=>'R', -8208=>'ON', -8209=>'ON', -8210=>'ON', -8211=>'ON', -8212=>'ON', -8213=>'ON', -8214=>'ON', -8215=>'ON', -8216=>'ON', -8217=>'ON', -8218=>'ON', -8219=>'ON', -8220=>'ON', -8221=>'ON', -8222=>'ON', -8223=>'ON', -8224=>'ON', -8225=>'ON', -8226=>'ON', -8227=>'ON', -8228=>'ON', -8229=>'ON', -8230=>'ON', -8231=>'ON', -8232=>'WS', -8233=>'B', -8234=>'LRE', -8235=>'RLE', -8236=>'PDF', -8237=>'LRO', -8238=>'RLO', -8239=>'CS', -8240=>'ET', -8241=>'ET', -8242=>'ET', -8243=>'ET', -8244=>'ET', -8245=>'ON', -8246=>'ON', -8247=>'ON', -8248=>'ON', -8249=>'ON', -8250=>'ON', -8251=>'ON', -8252=>'ON', -8253=>'ON', -8254=>'ON', -8255=>'ON', -8256=>'ON', -8257=>'ON', -8258=>'ON', -8259=>'ON', -8260=>'CS', -8261=>'ON', -8262=>'ON', -8263=>'ON', -8264=>'ON', -8265=>'ON', -8266=>'ON', -8267=>'ON', -8268=>'ON', -8269=>'ON', -8270=>'ON', -8271=>'ON', -8272=>'ON', -8273=>'ON', -8274=>'ON', -8275=>'ON', -8276=>'ON', -8277=>'ON', -8278=>'ON', -8279=>'ON', -8280=>'ON', -8281=>'ON', -8282=>'ON', -8283=>'ON', -8284=>'ON', -8285=>'ON', -8286=>'ON', -8287=>'WS', -8288=>'BN', -8289=>'BN', -8290=>'BN', -8291=>'BN', -8298=>'BN', -8299=>'BN', -8300=>'BN', -8301=>'BN', -8302=>'BN', -8303=>'BN', -8304=>'EN', -8305=>'L', -8308=>'EN', -8309=>'EN', -8310=>'EN', -8311=>'EN', -8312=>'EN', -8313=>'EN', -8314=>'ES', -8315=>'ES', -8316=>'ON', -8317=>'ON', -8318=>'ON', -8319=>'L', -8320=>'EN', -8321=>'EN', -8322=>'EN', -8323=>'EN', -8324=>'EN', -8325=>'EN', -8326=>'EN', -8327=>'EN', -8328=>'EN', -8329=>'EN', -8330=>'ES', -8331=>'ES', -8332=>'ON', -8333=>'ON', -8334=>'ON', -8336=>'L', -8337=>'L', -8338=>'L', -8339=>'L', -8340=>'L', -8352=>'ET', -8353=>'ET', -8354=>'ET', -8355=>'ET', -8356=>'ET', -8357=>'ET', -8358=>'ET', -8359=>'ET', -8360=>'ET', -8361=>'ET', -8362=>'ET', -8363=>'ET', -8364=>'ET', -8365=>'ET', -8366=>'ET', -8367=>'ET', -8368=>'ET', -8369=>'ET', -8370=>'ET', -8371=>'ET', -8372=>'ET', -8373=>'ET', -8400=>'NSM', -8401=>'NSM', -8402=>'NSM', -8403=>'NSM', -8404=>'NSM', -8405=>'NSM', -8406=>'NSM', -8407=>'NSM', -8408=>'NSM', -8409=>'NSM', -8410=>'NSM', -8411=>'NSM', -8412=>'NSM', -8413=>'NSM', -8414=>'NSM', -8415=>'NSM', -8416=>'NSM', -8417=>'NSM', -8418=>'NSM', -8419=>'NSM', -8420=>'NSM', -8421=>'NSM', -8422=>'NSM', -8423=>'NSM', -8424=>'NSM', -8425=>'NSM', -8426=>'NSM', -8427=>'NSM', -8428=>'NSM', -8429=>'NSM', -8430=>'NSM', -8431=>'NSM', -8448=>'ON', -8449=>'ON', -8450=>'L', -8451=>'ON', -8452=>'ON', -8453=>'ON', -8454=>'ON', -8455=>'L', -8456=>'ON', -8457=>'ON', -8458=>'L', -8459=>'L', -8460=>'L', -8461=>'L', -8462=>'L', -8463=>'L', -8464=>'L', -8465=>'L', -8466=>'L', -8467=>'L', -8468=>'ON', -8469=>'L', -8470=>'ON', -8471=>'ON', -8472=>'ON', -8473=>'L', -8474=>'L', -8475=>'L', -8476=>'L', -8477=>'L', -8478=>'ON', -8479=>'ON', -8480=>'ON', -8481=>'ON', -8482=>'ON', -8483=>'ON', -8484=>'L', -8485=>'ON', -8486=>'L', -8487=>'ON', -8488=>'L', -8489=>'ON', -8490=>'L', -8491=>'L', -8492=>'L', -8493=>'L', -8494=>'ET', -8495=>'L', -8496=>'L', -8497=>'L', -8498=>'L', -8499=>'L', -8500=>'L', -8501=>'L', -8502=>'L', -8503=>'L', -8504=>'L', -8505=>'L', -8506=>'ON', -8507=>'ON', -8508=>'L', -8509=>'L', -8510=>'L', -8511=>'L', -8512=>'ON', -8513=>'ON', -8514=>'ON', -8515=>'ON', -8516=>'ON', -8517=>'L', -8518=>'L', -8519=>'L', -8520=>'L', -8521=>'L', -8522=>'ON', -8523=>'ON', -8524=>'ON', -8525=>'ON', -8526=>'L', -8531=>'ON', -8532=>'ON', -8533=>'ON', -8534=>'ON', -8535=>'ON', -8536=>'ON', -8537=>'ON', -8538=>'ON', -8539=>'ON', -8540=>'ON', -8541=>'ON', -8542=>'ON', -8543=>'ON', -8544=>'L', -8545=>'L', -8546=>'L', -8547=>'L', -8548=>'L', -8549=>'L', -8550=>'L', -8551=>'L', -8552=>'L', -8553=>'L', -8554=>'L', -8555=>'L', -8556=>'L', -8557=>'L', -8558=>'L', -8559=>'L', -8560=>'L', -8561=>'L', -8562=>'L', -8563=>'L', -8564=>'L', -8565=>'L', -8566=>'L', -8567=>'L', -8568=>'L', -8569=>'L', -8570=>'L', -8571=>'L', -8572=>'L', -8573=>'L', -8574=>'L', -8575=>'L', -8576=>'L', -8577=>'L', -8578=>'L', -8579=>'L', -8580=>'L', -8592=>'ON', -8593=>'ON', -8594=>'ON', -8595=>'ON', -8596=>'ON', -8597=>'ON', -8598=>'ON', -8599=>'ON', -8600=>'ON', -8601=>'ON', -8602=>'ON', -8603=>'ON', -8604=>'ON', -8605=>'ON', -8606=>'ON', -8607=>'ON', -8608=>'ON', -8609=>'ON', -8610=>'ON', -8611=>'ON', -8612=>'ON', -8613=>'ON', -8614=>'ON', -8615=>'ON', -8616=>'ON', -8617=>'ON', -8618=>'ON', -8619=>'ON', -8620=>'ON', -8621=>'ON', -8622=>'ON', -8623=>'ON', -8624=>'ON', -8625=>'ON', -8626=>'ON', -8627=>'ON', -8628=>'ON', -8629=>'ON', -8630=>'ON', -8631=>'ON', -8632=>'ON', -8633=>'ON', -8634=>'ON', -8635=>'ON', -8636=>'ON', -8637=>'ON', -8638=>'ON', -8639=>'ON', -8640=>'ON', -8641=>'ON', -8642=>'ON', -8643=>'ON', -8644=>'ON', -8645=>'ON', -8646=>'ON', -8647=>'ON', -8648=>'ON', -8649=>'ON', -8650=>'ON', -8651=>'ON', -8652=>'ON', -8653=>'ON', -8654=>'ON', -8655=>'ON', -8656=>'ON', -8657=>'ON', -8658=>'ON', -8659=>'ON', -8660=>'ON', -8661=>'ON', -8662=>'ON', -8663=>'ON', -8664=>'ON', -8665=>'ON', -8666=>'ON', -8667=>'ON', -8668=>'ON', -8669=>'ON', -8670=>'ON', -8671=>'ON', -8672=>'ON', -8673=>'ON', -8674=>'ON', -8675=>'ON', -8676=>'ON', -8677=>'ON', -8678=>'ON', -8679=>'ON', -8680=>'ON', -8681=>'ON', -8682=>'ON', -8683=>'ON', -8684=>'ON', -8685=>'ON', -8686=>'ON', -8687=>'ON', -8688=>'ON', -8689=>'ON', -8690=>'ON', -8691=>'ON', -8692=>'ON', -8693=>'ON', -8694=>'ON', -8695=>'ON', -8696=>'ON', -8697=>'ON', -8698=>'ON', -8699=>'ON', -8700=>'ON', -8701=>'ON', -8702=>'ON', -8703=>'ON', -8704=>'ON', -8705=>'ON', -8706=>'ON', -8707=>'ON', -8708=>'ON', -8709=>'ON', -8710=>'ON', -8711=>'ON', -8712=>'ON', -8713=>'ON', -8714=>'ON', -8715=>'ON', -8716=>'ON', -8717=>'ON', -8718=>'ON', -8719=>'ON', -8720=>'ON', -8721=>'ON', -8722=>'ES', -8723=>'ET', -8724=>'ON', -8725=>'ON', -8726=>'ON', -8727=>'ON', -8728=>'ON', -8729=>'ON', -8730=>'ON', -8731=>'ON', -8732=>'ON', -8733=>'ON', -8734=>'ON', -8735=>'ON', -8736=>'ON', -8737=>'ON', -8738=>'ON', -8739=>'ON', -8740=>'ON', -8741=>'ON', -8742=>'ON', -8743=>'ON', -8744=>'ON', -8745=>'ON', -8746=>'ON', -8747=>'ON', -8748=>'ON', -8749=>'ON', -8750=>'ON', -8751=>'ON', -8752=>'ON', -8753=>'ON', -8754=>'ON', -8755=>'ON', -8756=>'ON', -8757=>'ON', -8758=>'ON', -8759=>'ON', -8760=>'ON', -8761=>'ON', -8762=>'ON', -8763=>'ON', -8764=>'ON', -8765=>'ON', -8766=>'ON', -8767=>'ON', -8768=>'ON', -8769=>'ON', -8770=>'ON', -8771=>'ON', -8772=>'ON', -8773=>'ON', -8774=>'ON', -8775=>'ON', -8776=>'ON', -8777=>'ON', -8778=>'ON', -8779=>'ON', -8780=>'ON', -8781=>'ON', -8782=>'ON', -8783=>'ON', -8784=>'ON', -8785=>'ON', -8786=>'ON', -8787=>'ON', -8788=>'ON', -8789=>'ON', -8790=>'ON', -8791=>'ON', -8792=>'ON', -8793=>'ON', -8794=>'ON', -8795=>'ON', -8796=>'ON', -8797=>'ON', -8798=>'ON', -8799=>'ON', -8800=>'ON', -8801=>'ON', -8802=>'ON', -8803=>'ON', -8804=>'ON', -8805=>'ON', -8806=>'ON', -8807=>'ON', -8808=>'ON', -8809=>'ON', -8810=>'ON', -8811=>'ON', -8812=>'ON', -8813=>'ON', -8814=>'ON', -8815=>'ON', -8816=>'ON', -8817=>'ON', -8818=>'ON', -8819=>'ON', -8820=>'ON', -8821=>'ON', -8822=>'ON', -8823=>'ON', -8824=>'ON', -8825=>'ON', -8826=>'ON', -8827=>'ON', -8828=>'ON', -8829=>'ON', -8830=>'ON', -8831=>'ON', -8832=>'ON', -8833=>'ON', -8834=>'ON', -8835=>'ON', -8836=>'ON', -8837=>'ON', -8838=>'ON', -8839=>'ON', -8840=>'ON', -8841=>'ON', -8842=>'ON', -8843=>'ON', -8844=>'ON', -8845=>'ON', -8846=>'ON', -8847=>'ON', -8848=>'ON', -8849=>'ON', -8850=>'ON', -8851=>'ON', -8852=>'ON', -8853=>'ON', -8854=>'ON', -8855=>'ON', -8856=>'ON', -8857=>'ON', -8858=>'ON', -8859=>'ON', -8860=>'ON', -8861=>'ON', -8862=>'ON', -8863=>'ON', -8864=>'ON', -8865=>'ON', -8866=>'ON', -8867=>'ON', -8868=>'ON', -8869=>'ON', -8870=>'ON', -8871=>'ON', -8872=>'ON', -8873=>'ON', -8874=>'ON', -8875=>'ON', -8876=>'ON', -8877=>'ON', -8878=>'ON', -8879=>'ON', -8880=>'ON', -8881=>'ON', -8882=>'ON', -8883=>'ON', -8884=>'ON', -8885=>'ON', -8886=>'ON', -8887=>'ON', -8888=>'ON', -8889=>'ON', -8890=>'ON', -8891=>'ON', -8892=>'ON', -8893=>'ON', -8894=>'ON', -8895=>'ON', -8896=>'ON', -8897=>'ON', -8898=>'ON', -8899=>'ON', -8900=>'ON', -8901=>'ON', -8902=>'ON', -8903=>'ON', -8904=>'ON', -8905=>'ON', -8906=>'ON', -8907=>'ON', -8908=>'ON', -8909=>'ON', -8910=>'ON', -8911=>'ON', -8912=>'ON', -8913=>'ON', -8914=>'ON', -8915=>'ON', -8916=>'ON', -8917=>'ON', -8918=>'ON', -8919=>'ON', -8920=>'ON', -8921=>'ON', -8922=>'ON', -8923=>'ON', -8924=>'ON', -8925=>'ON', -8926=>'ON', -8927=>'ON', -8928=>'ON', -8929=>'ON', -8930=>'ON', -8931=>'ON', -8932=>'ON', -8933=>'ON', -8934=>'ON', -8935=>'ON', -8936=>'ON', -8937=>'ON', -8938=>'ON', -8939=>'ON', -8940=>'ON', -8941=>'ON', -8942=>'ON', -8943=>'ON', -8944=>'ON', -8945=>'ON', -8946=>'ON', -8947=>'ON', -8948=>'ON', -8949=>'ON', -8950=>'ON', -8951=>'ON', -8952=>'ON', -8953=>'ON', -8954=>'ON', -8955=>'ON', -8956=>'ON', -8957=>'ON', -8958=>'ON', -8959=>'ON', -8960=>'ON', -8961=>'ON', -8962=>'ON', -8963=>'ON', -8964=>'ON', -8965=>'ON', -8966=>'ON', -8967=>'ON', -8968=>'ON', -8969=>'ON', -8970=>'ON', -8971=>'ON', -8972=>'ON', -8973=>'ON', -8974=>'ON', -8975=>'ON', -8976=>'ON', -8977=>'ON', -8978=>'ON', -8979=>'ON', -8980=>'ON', -8981=>'ON', -8982=>'ON', -8983=>'ON', -8984=>'ON', -8985=>'ON', -8986=>'ON', -8987=>'ON', -8988=>'ON', -8989=>'ON', -8990=>'ON', -8991=>'ON', -8992=>'ON', -8993=>'ON', -8994=>'ON', -8995=>'ON', -8996=>'ON', -8997=>'ON', -8998=>'ON', -8999=>'ON', -9000=>'ON', -9001=>'ON', -9002=>'ON', -9003=>'ON', -9004=>'ON', -9005=>'ON', -9006=>'ON', -9007=>'ON', -9008=>'ON', -9009=>'ON', -9010=>'ON', -9011=>'ON', -9012=>'ON', -9013=>'ON', -9014=>'L', -9015=>'L', -9016=>'L', -9017=>'L', -9018=>'L', -9019=>'L', -9020=>'L', -9021=>'L', -9022=>'L', -9023=>'L', -9024=>'L', -9025=>'L', -9026=>'L', -9027=>'L', -9028=>'L', -9029=>'L', -9030=>'L', -9031=>'L', -9032=>'L', -9033=>'L', -9034=>'L', -9035=>'L', -9036=>'L', -9037=>'L', -9038=>'L', -9039=>'L', -9040=>'L', -9041=>'L', -9042=>'L', -9043=>'L', -9044=>'L', -9045=>'L', -9046=>'L', -9047=>'L', -9048=>'L', -9049=>'L', -9050=>'L', -9051=>'L', -9052=>'L', -9053=>'L', -9054=>'L', -9055=>'L', -9056=>'L', -9057=>'L', -9058=>'L', -9059=>'L', -9060=>'L', -9061=>'L', -9062=>'L', -9063=>'L', -9064=>'L', -9065=>'L', -9066=>'L', -9067=>'L', -9068=>'L', -9069=>'L', -9070=>'L', -9071=>'L', -9072=>'L', -9073=>'L', -9074=>'L', -9075=>'L', -9076=>'L', -9077=>'L', -9078=>'L', -9079=>'L', -9080=>'L', -9081=>'L', -9082=>'L', -9083=>'ON', -9084=>'ON', -9085=>'ON', -9086=>'ON', -9087=>'ON', -9088=>'ON', -9089=>'ON', -9090=>'ON', -9091=>'ON', -9092=>'ON', -9093=>'ON', -9094=>'ON', -9095=>'ON', -9096=>'ON', -9097=>'ON', -9098=>'ON', -9099=>'ON', -9100=>'ON', -9101=>'ON', -9102=>'ON', -9103=>'ON', -9104=>'ON', -9105=>'ON', -9106=>'ON', -9107=>'ON', -9108=>'ON', -9109=>'L', -9110=>'ON', -9111=>'ON', -9112=>'ON', -9113=>'ON', -9114=>'ON', -9115=>'ON', -9116=>'ON', -9117=>'ON', -9118=>'ON', -9119=>'ON', -9120=>'ON', -9121=>'ON', -9122=>'ON', -9123=>'ON', -9124=>'ON', -9125=>'ON', -9126=>'ON', -9127=>'ON', -9128=>'ON', -9129=>'ON', -9130=>'ON', -9131=>'ON', -9132=>'ON', -9133=>'ON', -9134=>'ON', -9135=>'ON', -9136=>'ON', -9137=>'ON', -9138=>'ON', -9139=>'ON', -9140=>'ON', -9141=>'ON', -9142=>'ON', -9143=>'ON', -9144=>'ON', -9145=>'ON', -9146=>'ON', -9147=>'ON', -9148=>'ON', -9149=>'ON', -9150=>'ON', -9151=>'ON', -9152=>'ON', -9153=>'ON', -9154=>'ON', -9155=>'ON', -9156=>'ON', -9157=>'ON', -9158=>'ON', -9159=>'ON', -9160=>'ON', -9161=>'ON', -9162=>'ON', -9163=>'ON', -9164=>'ON', -9165=>'ON', -9166=>'ON', -9167=>'ON', -9168=>'ON', -9169=>'ON', -9170=>'ON', -9171=>'ON', -9172=>'ON', -9173=>'ON', -9174=>'ON', -9175=>'ON', -9176=>'ON', -9177=>'ON', -9178=>'ON', -9179=>'ON', -9180=>'ON', -9181=>'ON', -9182=>'ON', -9183=>'ON', -9184=>'ON', -9185=>'ON', -9186=>'ON', -9187=>'ON', -9188=>'ON', -9189=>'ON', -9190=>'ON', -9191=>'ON', -9216=>'ON', -9217=>'ON', -9218=>'ON', -9219=>'ON', -9220=>'ON', -9221=>'ON', -9222=>'ON', -9223=>'ON', -9224=>'ON', -9225=>'ON', -9226=>'ON', -9227=>'ON', -9228=>'ON', -9229=>'ON', -9230=>'ON', -9231=>'ON', -9232=>'ON', -9233=>'ON', -9234=>'ON', -9235=>'ON', -9236=>'ON', -9237=>'ON', -9238=>'ON', -9239=>'ON', -9240=>'ON', -9241=>'ON', -9242=>'ON', -9243=>'ON', -9244=>'ON', -9245=>'ON', -9246=>'ON', -9247=>'ON', -9248=>'ON', -9249=>'ON', -9250=>'ON', -9251=>'ON', -9252=>'ON', -9253=>'ON', -9254=>'ON', -9280=>'ON', -9281=>'ON', -9282=>'ON', -9283=>'ON', -9284=>'ON', -9285=>'ON', -9286=>'ON', -9287=>'ON', -9288=>'ON', -9289=>'ON', -9290=>'ON', -9312=>'ON', -9313=>'ON', -9314=>'ON', -9315=>'ON', -9316=>'ON', -9317=>'ON', -9318=>'ON', -9319=>'ON', -9320=>'ON', -9321=>'ON', -9322=>'ON', -9323=>'ON', -9324=>'ON', -9325=>'ON', -9326=>'ON', -9327=>'ON', -9328=>'ON', -9329=>'ON', -9330=>'ON', -9331=>'ON', -9332=>'ON', -9333=>'ON', -9334=>'ON', -9335=>'ON', -9336=>'ON', -9337=>'ON', -9338=>'ON', -9339=>'ON', -9340=>'ON', -9341=>'ON', -9342=>'ON', -9343=>'ON', -9344=>'ON', -9345=>'ON', -9346=>'ON', -9347=>'ON', -9348=>'ON', -9349=>'ON', -9350=>'ON', -9351=>'ON', -9352=>'EN', -9353=>'EN', -9354=>'EN', -9355=>'EN', -9356=>'EN', -9357=>'EN', -9358=>'EN', -9359=>'EN', -9360=>'EN', -9361=>'EN', -9362=>'EN', -9363=>'EN', -9364=>'EN', -9365=>'EN', -9366=>'EN', -9367=>'EN', -9368=>'EN', -9369=>'EN', -9370=>'EN', -9371=>'EN', -9372=>'L', -9373=>'L', -9374=>'L', -9375=>'L', -9376=>'L', -9377=>'L', -9378=>'L', -9379=>'L', -9380=>'L', -9381=>'L', -9382=>'L', -9383=>'L', -9384=>'L', -9385=>'L', -9386=>'L', -9387=>'L', -9388=>'L', -9389=>'L', -9390=>'L', -9391=>'L', -9392=>'L', -9393=>'L', -9394=>'L', -9395=>'L', -9396=>'L', -9397=>'L', -9398=>'L', -9399=>'L', -9400=>'L', -9401=>'L', -9402=>'L', -9403=>'L', -9404=>'L', -9405=>'L', -9406=>'L', -9407=>'L', -9408=>'L', -9409=>'L', -9410=>'L', -9411=>'L', -9412=>'L', -9413=>'L', -9414=>'L', -9415=>'L', -9416=>'L', -9417=>'L', -9418=>'L', -9419=>'L', -9420=>'L', -9421=>'L', -9422=>'L', -9423=>'L', -9424=>'L', -9425=>'L', -9426=>'L', -9427=>'L', -9428=>'L', -9429=>'L', -9430=>'L', -9431=>'L', -9432=>'L', -9433=>'L', -9434=>'L', -9435=>'L', -9436=>'L', -9437=>'L', -9438=>'L', -9439=>'L', -9440=>'L', -9441=>'L', -9442=>'L', -9443=>'L', -9444=>'L', -9445=>'L', -9446=>'L', -9447=>'L', -9448=>'L', -9449=>'L', -9450=>'ON', -9451=>'ON', -9452=>'ON', -9453=>'ON', -9454=>'ON', -9455=>'ON', -9456=>'ON', -9457=>'ON', -9458=>'ON', -9459=>'ON', -9460=>'ON', -9461=>'ON', -9462=>'ON', -9463=>'ON', -9464=>'ON', -9465=>'ON', -9466=>'ON', -9467=>'ON', -9468=>'ON', -9469=>'ON', -9470=>'ON', -9471=>'ON', -9472=>'ON', -9473=>'ON', -9474=>'ON', -9475=>'ON', -9476=>'ON', -9477=>'ON', -9478=>'ON', -9479=>'ON', -9480=>'ON', -9481=>'ON', -9482=>'ON', -9483=>'ON', -9484=>'ON', -9485=>'ON', -9486=>'ON', -9487=>'ON', -9488=>'ON', -9489=>'ON', -9490=>'ON', -9491=>'ON', -9492=>'ON', -9493=>'ON', -9494=>'ON', -9495=>'ON', -9496=>'ON', -9497=>'ON', -9498=>'ON', -9499=>'ON', -9500=>'ON', -9501=>'ON', -9502=>'ON', -9503=>'ON', -9504=>'ON', -9505=>'ON', -9506=>'ON', -9507=>'ON', -9508=>'ON', -9509=>'ON', -9510=>'ON', -9511=>'ON', -9512=>'ON', -9513=>'ON', -9514=>'ON', -9515=>'ON', -9516=>'ON', -9517=>'ON', -9518=>'ON', -9519=>'ON', -9520=>'ON', -9521=>'ON', -9522=>'ON', -9523=>'ON', -9524=>'ON', -9525=>'ON', -9526=>'ON', -9527=>'ON', -9528=>'ON', -9529=>'ON', -9530=>'ON', -9531=>'ON', -9532=>'ON', -9533=>'ON', -9534=>'ON', -9535=>'ON', -9536=>'ON', -9537=>'ON', -9538=>'ON', -9539=>'ON', -9540=>'ON', -9541=>'ON', -9542=>'ON', -9543=>'ON', -9544=>'ON', -9545=>'ON', -9546=>'ON', -9547=>'ON', -9548=>'ON', -9549=>'ON', -9550=>'ON', -9551=>'ON', -9552=>'ON', -9553=>'ON', -9554=>'ON', -9555=>'ON', -9556=>'ON', -9557=>'ON', -9558=>'ON', -9559=>'ON', -9560=>'ON', -9561=>'ON', -9562=>'ON', -9563=>'ON', -9564=>'ON', -9565=>'ON', -9566=>'ON', -9567=>'ON', -9568=>'ON', -9569=>'ON', -9570=>'ON', -9571=>'ON', -9572=>'ON', -9573=>'ON', -9574=>'ON', -9575=>'ON', -9576=>'ON', -9577=>'ON', -9578=>'ON', -9579=>'ON', -9580=>'ON', -9581=>'ON', -9582=>'ON', -9583=>'ON', -9584=>'ON', -9585=>'ON', -9586=>'ON', -9587=>'ON', -9588=>'ON', -9589=>'ON', -9590=>'ON', -9591=>'ON', -9592=>'ON', -9593=>'ON', -9594=>'ON', -9595=>'ON', -9596=>'ON', -9597=>'ON', -9598=>'ON', -9599=>'ON', -9600=>'ON', -9601=>'ON', -9602=>'ON', -9603=>'ON', -9604=>'ON', -9605=>'ON', -9606=>'ON', -9607=>'ON', -9608=>'ON', -9609=>'ON', -9610=>'ON', -9611=>'ON', -9612=>'ON', -9613=>'ON', -9614=>'ON', -9615=>'ON', -9616=>'ON', -9617=>'ON', -9618=>'ON', -9619=>'ON', -9620=>'ON', -9621=>'ON', -9622=>'ON', -9623=>'ON', -9624=>'ON', -9625=>'ON', -9626=>'ON', -9627=>'ON', -9628=>'ON', -9629=>'ON', -9630=>'ON', -9631=>'ON', -9632=>'ON', -9633=>'ON', -9634=>'ON', -9635=>'ON', -9636=>'ON', -9637=>'ON', -9638=>'ON', -9639=>'ON', -9640=>'ON', -9641=>'ON', -9642=>'ON', -9643=>'ON', -9644=>'ON', -9645=>'ON', -9646=>'ON', -9647=>'ON', -9648=>'ON', -9649=>'ON', -9650=>'ON', -9651=>'ON', -9652=>'ON', -9653=>'ON', -9654=>'ON', -9655=>'ON', -9656=>'ON', -9657=>'ON', -9658=>'ON', -9659=>'ON', -9660=>'ON', -9661=>'ON', -9662=>'ON', -9663=>'ON', -9664=>'ON', -9665=>'ON', -9666=>'ON', -9667=>'ON', -9668=>'ON', -9669=>'ON', -9670=>'ON', -9671=>'ON', -9672=>'ON', -9673=>'ON', -9674=>'ON', -9675=>'ON', -9676=>'ON', -9677=>'ON', -9678=>'ON', -9679=>'ON', -9680=>'ON', -9681=>'ON', -9682=>'ON', -9683=>'ON', -9684=>'ON', -9685=>'ON', -9686=>'ON', -9687=>'ON', -9688=>'ON', -9689=>'ON', -9690=>'ON', -9691=>'ON', -9692=>'ON', -9693=>'ON', -9694=>'ON', -9695=>'ON', -9696=>'ON', -9697=>'ON', -9698=>'ON', -9699=>'ON', -9700=>'ON', -9701=>'ON', -9702=>'ON', -9703=>'ON', -9704=>'ON', -9705=>'ON', -9706=>'ON', -9707=>'ON', -9708=>'ON', -9709=>'ON', -9710=>'ON', -9711=>'ON', -9712=>'ON', -9713=>'ON', -9714=>'ON', -9715=>'ON', -9716=>'ON', -9717=>'ON', -9718=>'ON', -9719=>'ON', -9720=>'ON', -9721=>'ON', -9722=>'ON', -9723=>'ON', -9724=>'ON', -9725=>'ON', -9726=>'ON', -9727=>'ON', -9728=>'ON', -9729=>'ON', -9730=>'ON', -9731=>'ON', -9732=>'ON', -9733=>'ON', -9734=>'ON', -9735=>'ON', -9736=>'ON', -9737=>'ON', -9738=>'ON', -9739=>'ON', -9740=>'ON', -9741=>'ON', -9742=>'ON', -9743=>'ON', -9744=>'ON', -9745=>'ON', -9746=>'ON', -9747=>'ON', -9748=>'ON', -9749=>'ON', -9750=>'ON', -9751=>'ON', -9752=>'ON', -9753=>'ON', -9754=>'ON', -9755=>'ON', -9756=>'ON', -9757=>'ON', -9758=>'ON', -9759=>'ON', -9760=>'ON', -9761=>'ON', -9762=>'ON', -9763=>'ON', -9764=>'ON', -9765=>'ON', -9766=>'ON', -9767=>'ON', -9768=>'ON', -9769=>'ON', -9770=>'ON', -9771=>'ON', -9772=>'ON', -9773=>'ON', -9774=>'ON', -9775=>'ON', -9776=>'ON', -9777=>'ON', -9778=>'ON', -9779=>'ON', -9780=>'ON', -9781=>'ON', -9782=>'ON', -9783=>'ON', -9784=>'ON', -9785=>'ON', -9786=>'ON', -9787=>'ON', -9788=>'ON', -9789=>'ON', -9790=>'ON', -9791=>'ON', -9792=>'ON', -9793=>'ON', -9794=>'ON', -9795=>'ON', -9796=>'ON', -9797=>'ON', -9798=>'ON', -9799=>'ON', -9800=>'ON', -9801=>'ON', -9802=>'ON', -9803=>'ON', -9804=>'ON', -9805=>'ON', -9806=>'ON', -9807=>'ON', -9808=>'ON', -9809=>'ON', -9810=>'ON', -9811=>'ON', -9812=>'ON', -9813=>'ON', -9814=>'ON', -9815=>'ON', -9816=>'ON', -9817=>'ON', -9818=>'ON', -9819=>'ON', -9820=>'ON', -9821=>'ON', -9822=>'ON', -9823=>'ON', -9824=>'ON', -9825=>'ON', -9826=>'ON', -9827=>'ON', -9828=>'ON', -9829=>'ON', -9830=>'ON', -9831=>'ON', -9832=>'ON', -9833=>'ON', -9834=>'ON', -9835=>'ON', -9836=>'ON', -9837=>'ON', -9838=>'ON', -9839=>'ON', -9840=>'ON', -9841=>'ON', -9842=>'ON', -9843=>'ON', -9844=>'ON', -9845=>'ON', -9846=>'ON', -9847=>'ON', -9848=>'ON', -9849=>'ON', -9850=>'ON', -9851=>'ON', -9852=>'ON', -9853=>'ON', -9854=>'ON', -9855=>'ON', -9856=>'ON', -9857=>'ON', -9858=>'ON', -9859=>'ON', -9860=>'ON', -9861=>'ON', -9862=>'ON', -9863=>'ON', -9864=>'ON', -9865=>'ON', -9866=>'ON', -9867=>'ON', -9868=>'ON', -9869=>'ON', -9870=>'ON', -9871=>'ON', -9872=>'ON', -9873=>'ON', -9874=>'ON', -9875=>'ON', -9876=>'ON', -9877=>'ON', -9878=>'ON', -9879=>'ON', -9880=>'ON', -9881=>'ON', -9882=>'ON', -9883=>'ON', -9884=>'ON', -9888=>'ON', -9889=>'ON', -9890=>'ON', -9891=>'ON', -9892=>'ON', -9893=>'ON', -9894=>'ON', -9895=>'ON', -9896=>'ON', -9897=>'ON', -9898=>'ON', -9899=>'ON', -9900=>'L', -9901=>'ON', -9902=>'ON', -9903=>'ON', -9904=>'ON', -9905=>'ON', -9906=>'ON', -9985=>'ON', -9986=>'ON', -9987=>'ON', -9988=>'ON', -9990=>'ON', -9991=>'ON', -9992=>'ON', -9993=>'ON', -9996=>'ON', -9997=>'ON', -9998=>'ON', -9999=>'ON', -10000=>'ON', -10001=>'ON', -10002=>'ON', -10003=>'ON', -10004=>'ON', -10005=>'ON', -10006=>'ON', -10007=>'ON', -10008=>'ON', -10009=>'ON', -10010=>'ON', -10011=>'ON', -10012=>'ON', -10013=>'ON', -10014=>'ON', -10015=>'ON', -10016=>'ON', -10017=>'ON', -10018=>'ON', -10019=>'ON', -10020=>'ON', -10021=>'ON', -10022=>'ON', -10023=>'ON', -10025=>'ON', -10026=>'ON', -10027=>'ON', -10028=>'ON', -10029=>'ON', -10030=>'ON', -10031=>'ON', -10032=>'ON', -10033=>'ON', -10034=>'ON', -10035=>'ON', -10036=>'ON', -10037=>'ON', -10038=>'ON', -10039=>'ON', -10040=>'ON', -10041=>'ON', -10042=>'ON', -10043=>'ON', -10044=>'ON', -10045=>'ON', -10046=>'ON', -10047=>'ON', -10048=>'ON', -10049=>'ON', -10050=>'ON', -10051=>'ON', -10052=>'ON', -10053=>'ON', -10054=>'ON', -10055=>'ON', -10056=>'ON', -10057=>'ON', -10058=>'ON', -10059=>'ON', -10061=>'ON', -10063=>'ON', -10064=>'ON', -10065=>'ON', -10066=>'ON', -10070=>'ON', -10072=>'ON', -10073=>'ON', -10074=>'ON', -10075=>'ON', -10076=>'ON', -10077=>'ON', -10078=>'ON', -10081=>'ON', -10082=>'ON', -10083=>'ON', -10084=>'ON', -10085=>'ON', -10086=>'ON', -10087=>'ON', -10088=>'ON', -10089=>'ON', -10090=>'ON', -10091=>'ON', -10092=>'ON', -10093=>'ON', -10094=>'ON', -10095=>'ON', -10096=>'ON', -10097=>'ON', -10098=>'ON', -10099=>'ON', -10100=>'ON', -10101=>'ON', -10102=>'ON', -10103=>'ON', -10104=>'ON', -10105=>'ON', -10106=>'ON', -10107=>'ON', -10108=>'ON', -10109=>'ON', -10110=>'ON', -10111=>'ON', -10112=>'ON', -10113=>'ON', -10114=>'ON', -10115=>'ON', -10116=>'ON', -10117=>'ON', -10118=>'ON', -10119=>'ON', -10120=>'ON', -10121=>'ON', -10122=>'ON', -10123=>'ON', -10124=>'ON', -10125=>'ON', -10126=>'ON', -10127=>'ON', -10128=>'ON', -10129=>'ON', -10130=>'ON', -10131=>'ON', -10132=>'ON', -10136=>'ON', -10137=>'ON', -10138=>'ON', -10139=>'ON', -10140=>'ON', -10141=>'ON', -10142=>'ON', -10143=>'ON', -10144=>'ON', -10145=>'ON', -10146=>'ON', -10147=>'ON', -10148=>'ON', -10149=>'ON', -10150=>'ON', -10151=>'ON', -10152=>'ON', -10153=>'ON', -10154=>'ON', -10155=>'ON', -10156=>'ON', -10157=>'ON', -10158=>'ON', -10159=>'ON', -10161=>'ON', -10162=>'ON', -10163=>'ON', -10164=>'ON', -10165=>'ON', -10166=>'ON', -10167=>'ON', -10168=>'ON', -10169=>'ON', -10170=>'ON', -10171=>'ON', -10172=>'ON', -10173=>'ON', -10174=>'ON', -10176=>'ON', -10177=>'ON', -10178=>'ON', -10179=>'ON', -10180=>'ON', -10181=>'ON', -10182=>'ON', -10183=>'ON', -10184=>'ON', -10185=>'ON', -10186=>'ON', -10192=>'ON', -10193=>'ON', -10194=>'ON', -10195=>'ON', -10196=>'ON', -10197=>'ON', -10198=>'ON', -10199=>'ON', -10200=>'ON', -10201=>'ON', -10202=>'ON', -10203=>'ON', -10204=>'ON', -10205=>'ON', -10206=>'ON', -10207=>'ON', -10208=>'ON', -10209=>'ON', -10210=>'ON', -10211=>'ON', -10212=>'ON', -10213=>'ON', -10214=>'ON', -10215=>'ON', -10216=>'ON', -10217=>'ON', -10218=>'ON', -10219=>'ON', -10224=>'ON', -10225=>'ON', -10226=>'ON', -10227=>'ON', -10228=>'ON', -10229=>'ON', -10230=>'ON', -10231=>'ON', -10232=>'ON', -10233=>'ON', -10234=>'ON', -10235=>'ON', -10236=>'ON', -10237=>'ON', -10238=>'ON', -10239=>'ON', -10240=>'L', -10241=>'L', -10242=>'L', -10243=>'L', -10244=>'L', -10245=>'L', -10246=>'L', -10247=>'L', -10248=>'L', -10249=>'L', -10250=>'L', -10251=>'L', -10252=>'L', -10253=>'L', -10254=>'L', -10255=>'L', -10256=>'L', -10257=>'L', -10258=>'L', -10259=>'L', -10260=>'L', -10261=>'L', -10262=>'L', -10263=>'L', -10264=>'L', -10265=>'L', -10266=>'L', -10267=>'L', -10268=>'L', -10269=>'L', -10270=>'L', -10271=>'L', -10272=>'L', -10273=>'L', -10274=>'L', -10275=>'L', -10276=>'L', -10277=>'L', -10278=>'L', -10279=>'L', -10280=>'L', -10281=>'L', -10282=>'L', -10283=>'L', -10284=>'L', -10285=>'L', -10286=>'L', -10287=>'L', -10288=>'L', -10289=>'L', -10290=>'L', -10291=>'L', -10292=>'L', -10293=>'L', -10294=>'L', -10295=>'L', -10296=>'L', -10297=>'L', -10298=>'L', -10299=>'L', -10300=>'L', -10301=>'L', -10302=>'L', -10303=>'L', -10304=>'L', -10305=>'L', -10306=>'L', -10307=>'L', -10308=>'L', -10309=>'L', -10310=>'L', -10311=>'L', -10312=>'L', -10313=>'L', -10314=>'L', -10315=>'L', -10316=>'L', -10317=>'L', -10318=>'L', -10319=>'L', -10320=>'L', -10321=>'L', -10322=>'L', -10323=>'L', -10324=>'L', -10325=>'L', -10326=>'L', -10327=>'L', -10328=>'L', -10329=>'L', -10330=>'L', -10331=>'L', -10332=>'L', -10333=>'L', -10334=>'L', -10335=>'L', -10336=>'L', -10337=>'L', -10338=>'L', -10339=>'L', -10340=>'L', -10341=>'L', -10342=>'L', -10343=>'L', -10344=>'L', -10345=>'L', -10346=>'L', -10347=>'L', -10348=>'L', -10349=>'L', -10350=>'L', -10351=>'L', -10352=>'L', -10353=>'L', -10354=>'L', -10355=>'L', -10356=>'L', -10357=>'L', -10358=>'L', -10359=>'L', -10360=>'L', -10361=>'L', -10362=>'L', -10363=>'L', -10364=>'L', -10365=>'L', -10366=>'L', -10367=>'L', -10368=>'L', -10369=>'L', -10370=>'L', -10371=>'L', -10372=>'L', -10373=>'L', -10374=>'L', -10375=>'L', -10376=>'L', -10377=>'L', -10378=>'L', -10379=>'L', -10380=>'L', -10381=>'L', -10382=>'L', -10383=>'L', -10384=>'L', -10385=>'L', -10386=>'L', -10387=>'L', -10388=>'L', -10389=>'L', -10390=>'L', -10391=>'L', -10392=>'L', -10393=>'L', -10394=>'L', -10395=>'L', -10396=>'L', -10397=>'L', -10398=>'L', -10399=>'L', -10400=>'L', -10401=>'L', -10402=>'L', -10403=>'L', -10404=>'L', -10405=>'L', -10406=>'L', -10407=>'L', -10408=>'L', -10409=>'L', -10410=>'L', -10411=>'L', -10412=>'L', -10413=>'L', -10414=>'L', -10415=>'L', -10416=>'L', -10417=>'L', -10418=>'L', -10419=>'L', -10420=>'L', -10421=>'L', -10422=>'L', -10423=>'L', -10424=>'L', -10425=>'L', -10426=>'L', -10427=>'L', -10428=>'L', -10429=>'L', -10430=>'L', -10431=>'L', -10432=>'L', -10433=>'L', -10434=>'L', -10435=>'L', -10436=>'L', -10437=>'L', -10438=>'L', -10439=>'L', -10440=>'L', -10441=>'L', -10442=>'L', -10443=>'L', -10444=>'L', -10445=>'L', -10446=>'L', -10447=>'L', -10448=>'L', -10449=>'L', -10450=>'L', -10451=>'L', -10452=>'L', -10453=>'L', -10454=>'L', -10455=>'L', -10456=>'L', -10457=>'L', -10458=>'L', -10459=>'L', -10460=>'L', -10461=>'L', -10462=>'L', -10463=>'L', -10464=>'L', -10465=>'L', -10466=>'L', -10467=>'L', -10468=>'L', -10469=>'L', -10470=>'L', -10471=>'L', -10472=>'L', -10473=>'L', -10474=>'L', -10475=>'L', -10476=>'L', -10477=>'L', -10478=>'L', -10479=>'L', -10480=>'L', -10481=>'L', -10482=>'L', -10483=>'L', -10484=>'L', -10485=>'L', -10486=>'L', -10487=>'L', -10488=>'L', -10489=>'L', -10490=>'L', -10491=>'L', -10492=>'L', -10493=>'L', -10494=>'L', -10495=>'L', -10496=>'ON', -10497=>'ON', -10498=>'ON', -10499=>'ON', -10500=>'ON', -10501=>'ON', -10502=>'ON', -10503=>'ON', -10504=>'ON', -10505=>'ON', -10506=>'ON', -10507=>'ON', -10508=>'ON', -10509=>'ON', -10510=>'ON', -10511=>'ON', -10512=>'ON', -10513=>'ON', -10514=>'ON', -10515=>'ON', -10516=>'ON', -10517=>'ON', -10518=>'ON', -10519=>'ON', -10520=>'ON', -10521=>'ON', -10522=>'ON', -10523=>'ON', -10524=>'ON', -10525=>'ON', -10526=>'ON', -10527=>'ON', -10528=>'ON', -10529=>'ON', -10530=>'ON', -10531=>'ON', -10532=>'ON', -10533=>'ON', -10534=>'ON', -10535=>'ON', -10536=>'ON', -10537=>'ON', -10538=>'ON', -10539=>'ON', -10540=>'ON', -10541=>'ON', -10542=>'ON', -10543=>'ON', -10544=>'ON', -10545=>'ON', -10546=>'ON', -10547=>'ON', -10548=>'ON', -10549=>'ON', -10550=>'ON', -10551=>'ON', -10552=>'ON', -10553=>'ON', -10554=>'ON', -10555=>'ON', -10556=>'ON', -10557=>'ON', -10558=>'ON', -10559=>'ON', -10560=>'ON', -10561=>'ON', -10562=>'ON', -10563=>'ON', -10564=>'ON', -10565=>'ON', -10566=>'ON', -10567=>'ON', -10568=>'ON', -10569=>'ON', -10570=>'ON', -10571=>'ON', -10572=>'ON', -10573=>'ON', -10574=>'ON', -10575=>'ON', -10576=>'ON', -10577=>'ON', -10578=>'ON', -10579=>'ON', -10580=>'ON', -10581=>'ON', -10582=>'ON', -10583=>'ON', -10584=>'ON', -10585=>'ON', -10586=>'ON', -10587=>'ON', -10588=>'ON', -10589=>'ON', -10590=>'ON', -10591=>'ON', -10592=>'ON', -10593=>'ON', -10594=>'ON', -10595=>'ON', -10596=>'ON', -10597=>'ON', -10598=>'ON', -10599=>'ON', -10600=>'ON', -10601=>'ON', -10602=>'ON', -10603=>'ON', -10604=>'ON', -10605=>'ON', -10606=>'ON', -10607=>'ON', -10608=>'ON', -10609=>'ON', -10610=>'ON', -10611=>'ON', -10612=>'ON', -10613=>'ON', -10614=>'ON', -10615=>'ON', -10616=>'ON', -10617=>'ON', -10618=>'ON', -10619=>'ON', -10620=>'ON', -10621=>'ON', -10622=>'ON', -10623=>'ON', -10624=>'ON', -10625=>'ON', -10626=>'ON', -10627=>'ON', -10628=>'ON', -10629=>'ON', -10630=>'ON', -10631=>'ON', -10632=>'ON', -10633=>'ON', -10634=>'ON', -10635=>'ON', -10636=>'ON', -10637=>'ON', -10638=>'ON', -10639=>'ON', -10640=>'ON', -10641=>'ON', -10642=>'ON', -10643=>'ON', -10644=>'ON', -10645=>'ON', -10646=>'ON', -10647=>'ON', -10648=>'ON', -10649=>'ON', -10650=>'ON', -10651=>'ON', -10652=>'ON', -10653=>'ON', -10654=>'ON', -10655=>'ON', -10656=>'ON', -10657=>'ON', -10658=>'ON', -10659=>'ON', -10660=>'ON', -10661=>'ON', -10662=>'ON', -10663=>'ON', -10664=>'ON', -10665=>'ON', -10666=>'ON', -10667=>'ON', -10668=>'ON', -10669=>'ON', -10670=>'ON', -10671=>'ON', -10672=>'ON', -10673=>'ON', -10674=>'ON', -10675=>'ON', -10676=>'ON', -10677=>'ON', -10678=>'ON', -10679=>'ON', -10680=>'ON', -10681=>'ON', -10682=>'ON', -10683=>'ON', -10684=>'ON', -10685=>'ON', -10686=>'ON', -10687=>'ON', -10688=>'ON', -10689=>'ON', -10690=>'ON', -10691=>'ON', -10692=>'ON', -10693=>'ON', -10694=>'ON', -10695=>'ON', -10696=>'ON', -10697=>'ON', -10698=>'ON', -10699=>'ON', -10700=>'ON', -10701=>'ON', -10702=>'ON', -10703=>'ON', -10704=>'ON', -10705=>'ON', -10706=>'ON', -10707=>'ON', -10708=>'ON', -10709=>'ON', -10710=>'ON', -10711=>'ON', -10712=>'ON', -10713=>'ON', -10714=>'ON', -10715=>'ON', -10716=>'ON', -10717=>'ON', -10718=>'ON', -10719=>'ON', -10720=>'ON', -10721=>'ON', -10722=>'ON', -10723=>'ON', -10724=>'ON', -10725=>'ON', -10726=>'ON', -10727=>'ON', -10728=>'ON', -10729=>'ON', -10730=>'ON', -10731=>'ON', -10732=>'ON', -10733=>'ON', -10734=>'ON', -10735=>'ON', -10736=>'ON', -10737=>'ON', -10738=>'ON', -10739=>'ON', -10740=>'ON', -10741=>'ON', -10742=>'ON', -10743=>'ON', -10744=>'ON', -10745=>'ON', -10746=>'ON', -10747=>'ON', -10748=>'ON', -10749=>'ON', -10750=>'ON', -10751=>'ON', -10752=>'ON', -10753=>'ON', -10754=>'ON', -10755=>'ON', -10756=>'ON', -10757=>'ON', -10758=>'ON', -10759=>'ON', -10760=>'ON', -10761=>'ON', -10762=>'ON', -10763=>'ON', -10764=>'ON', -10765=>'ON', -10766=>'ON', -10767=>'ON', -10768=>'ON', -10769=>'ON', -10770=>'ON', -10771=>'ON', -10772=>'ON', -10773=>'ON', -10774=>'ON', -10775=>'ON', -10776=>'ON', -10777=>'ON', -10778=>'ON', -10779=>'ON', -10780=>'ON', -10781=>'ON', -10782=>'ON', -10783=>'ON', -10784=>'ON', -10785=>'ON', -10786=>'ON', -10787=>'ON', -10788=>'ON', -10789=>'ON', -10790=>'ON', -10791=>'ON', -10792=>'ON', -10793=>'ON', -10794=>'ON', -10795=>'ON', -10796=>'ON', -10797=>'ON', -10798=>'ON', -10799=>'ON', -10800=>'ON', -10801=>'ON', -10802=>'ON', -10803=>'ON', -10804=>'ON', -10805=>'ON', -10806=>'ON', -10807=>'ON', -10808=>'ON', -10809=>'ON', -10810=>'ON', -10811=>'ON', -10812=>'ON', -10813=>'ON', -10814=>'ON', -10815=>'ON', -10816=>'ON', -10817=>'ON', -10818=>'ON', -10819=>'ON', -10820=>'ON', -10821=>'ON', -10822=>'ON', -10823=>'ON', -10824=>'ON', -10825=>'ON', -10826=>'ON', -10827=>'ON', -10828=>'ON', -10829=>'ON', -10830=>'ON', -10831=>'ON', -10832=>'ON', -10833=>'ON', -10834=>'ON', -10835=>'ON', -10836=>'ON', -10837=>'ON', -10838=>'ON', -10839=>'ON', -10840=>'ON', -10841=>'ON', -10842=>'ON', -10843=>'ON', -10844=>'ON', -10845=>'ON', -10846=>'ON', -10847=>'ON', -10848=>'ON', -10849=>'ON', -10850=>'ON', -10851=>'ON', -10852=>'ON', -10853=>'ON', -10854=>'ON', -10855=>'ON', -10856=>'ON', -10857=>'ON', -10858=>'ON', -10859=>'ON', -10860=>'ON', -10861=>'ON', -10862=>'ON', -10863=>'ON', -10864=>'ON', -10865=>'ON', -10866=>'ON', -10867=>'ON', -10868=>'ON', -10869=>'ON', -10870=>'ON', -10871=>'ON', -10872=>'ON', -10873=>'ON', -10874=>'ON', -10875=>'ON', -10876=>'ON', -10877=>'ON', -10878=>'ON', -10879=>'ON', -10880=>'ON', -10881=>'ON', -10882=>'ON', -10883=>'ON', -10884=>'ON', -10885=>'ON', -10886=>'ON', -10887=>'ON', -10888=>'ON', -10889=>'ON', -10890=>'ON', -10891=>'ON', -10892=>'ON', -10893=>'ON', -10894=>'ON', -10895=>'ON', -10896=>'ON', -10897=>'ON', -10898=>'ON', -10899=>'ON', -10900=>'ON', -10901=>'ON', -10902=>'ON', -10903=>'ON', -10904=>'ON', -10905=>'ON', -10906=>'ON', -10907=>'ON', -10908=>'ON', -10909=>'ON', -10910=>'ON', -10911=>'ON', -10912=>'ON', -10913=>'ON', -10914=>'ON', -10915=>'ON', -10916=>'ON', -10917=>'ON', -10918=>'ON', -10919=>'ON', -10920=>'ON', -10921=>'ON', -10922=>'ON', -10923=>'ON', -10924=>'ON', -10925=>'ON', -10926=>'ON', -10927=>'ON', -10928=>'ON', -10929=>'ON', -10930=>'ON', -10931=>'ON', -10932=>'ON', -10933=>'ON', -10934=>'ON', -10935=>'ON', -10936=>'ON', -10937=>'ON', -10938=>'ON', -10939=>'ON', -10940=>'ON', -10941=>'ON', -10942=>'ON', -10943=>'ON', -10944=>'ON', -10945=>'ON', -10946=>'ON', -10947=>'ON', -10948=>'ON', -10949=>'ON', -10950=>'ON', -10951=>'ON', -10952=>'ON', -10953=>'ON', -10954=>'ON', -10955=>'ON', -10956=>'ON', -10957=>'ON', -10958=>'ON', -10959=>'ON', -10960=>'ON', -10961=>'ON', -10962=>'ON', -10963=>'ON', -10964=>'ON', -10965=>'ON', -10966=>'ON', -10967=>'ON', -10968=>'ON', -10969=>'ON', -10970=>'ON', -10971=>'ON', -10972=>'ON', -10973=>'ON', -10974=>'ON', -10975=>'ON', -10976=>'ON', -10977=>'ON', -10978=>'ON', -10979=>'ON', -10980=>'ON', -10981=>'ON', -10982=>'ON', -10983=>'ON', -10984=>'ON', -10985=>'ON', -10986=>'ON', -10987=>'ON', -10988=>'ON', -10989=>'ON', -10990=>'ON', -10991=>'ON', -10992=>'ON', -10993=>'ON', -10994=>'ON', -10995=>'ON', -10996=>'ON', -10997=>'ON', -10998=>'ON', -10999=>'ON', -11000=>'ON', -11001=>'ON', -11002=>'ON', -11003=>'ON', -11004=>'ON', -11005=>'ON', -11006=>'ON', -11007=>'ON', -11008=>'ON', -11009=>'ON', -11010=>'ON', -11011=>'ON', -11012=>'ON', -11013=>'ON', -11014=>'ON', -11015=>'ON', -11016=>'ON', -11017=>'ON', -11018=>'ON', -11019=>'ON', -11020=>'ON', -11021=>'ON', -11022=>'ON', -11023=>'ON', -11024=>'ON', -11025=>'ON', -11026=>'ON', -11027=>'ON', -11028=>'ON', -11029=>'ON', -11030=>'ON', -11031=>'ON', -11032=>'ON', -11033=>'ON', -11034=>'ON', -11040=>'ON', -11041=>'ON', -11042=>'ON', -11043=>'ON', -11264=>'L', -11265=>'L', -11266=>'L', -11267=>'L', -11268=>'L', -11269=>'L', -11270=>'L', -11271=>'L', -11272=>'L', -11273=>'L', -11274=>'L', -11275=>'L', -11276=>'L', -11277=>'L', -11278=>'L', -11279=>'L', -11280=>'L', -11281=>'L', -11282=>'L', -11283=>'L', -11284=>'L', -11285=>'L', -11286=>'L', -11287=>'L', -11288=>'L', -11289=>'L', -11290=>'L', -11291=>'L', -11292=>'L', -11293=>'L', -11294=>'L', -11295=>'L', -11296=>'L', -11297=>'L', -11298=>'L', -11299=>'L', -11300=>'L', -11301=>'L', -11302=>'L', -11303=>'L', -11304=>'L', -11305=>'L', -11306=>'L', -11307=>'L', -11308=>'L', -11309=>'L', -11310=>'L', -11312=>'L', -11313=>'L', -11314=>'L', -11315=>'L', -11316=>'L', -11317=>'L', -11318=>'L', -11319=>'L', -11320=>'L', -11321=>'L', -11322=>'L', -11323=>'L', -11324=>'L', -11325=>'L', -11326=>'L', -11327=>'L', -11328=>'L', -11329=>'L', -11330=>'L', -11331=>'L', -11332=>'L', -11333=>'L', -11334=>'L', -11335=>'L', -11336=>'L', -11337=>'L', -11338=>'L', -11339=>'L', -11340=>'L', -11341=>'L', -11342=>'L', -11343=>'L', -11344=>'L', -11345=>'L', -11346=>'L', -11347=>'L', -11348=>'L', -11349=>'L', -11350=>'L', -11351=>'L', -11352=>'L', -11353=>'L', -11354=>'L', -11355=>'L', -11356=>'L', -11357=>'L', -11358=>'L', -11360=>'L', -11361=>'L', -11362=>'L', -11363=>'L', -11364=>'L', -11365=>'L', -11366=>'L', -11367=>'L', -11368=>'L', -11369=>'L', -11370=>'L', -11371=>'L', -11372=>'L', -11380=>'L', -11381=>'L', -11382=>'L', -11383=>'L', -11392=>'L', -11393=>'L', -11394=>'L', -11395=>'L', -11396=>'L', -11397=>'L', -11398=>'L', -11399=>'L', -11400=>'L', -11401=>'L', -11402=>'L', -11403=>'L', -11404=>'L', -11405=>'L', -11406=>'L', -11407=>'L', -11408=>'L', -11409=>'L', -11410=>'L', -11411=>'L', -11412=>'L', -11413=>'L', -11414=>'L', -11415=>'L', -11416=>'L', -11417=>'L', -11418=>'L', -11419=>'L', -11420=>'L', -11421=>'L', -11422=>'L', -11423=>'L', -11424=>'L', -11425=>'L', -11426=>'L', -11427=>'L', -11428=>'L', -11429=>'L', -11430=>'L', -11431=>'L', -11432=>'L', -11433=>'L', -11434=>'L', -11435=>'L', -11436=>'L', -11437=>'L', -11438=>'L', -11439=>'L', -11440=>'L', -11441=>'L', -11442=>'L', -11443=>'L', -11444=>'L', -11445=>'L', -11446=>'L', -11447=>'L', -11448=>'L', -11449=>'L', -11450=>'L', -11451=>'L', -11452=>'L', -11453=>'L', -11454=>'L', -11455=>'L', -11456=>'L', -11457=>'L', -11458=>'L', -11459=>'L', -11460=>'L', -11461=>'L', -11462=>'L', -11463=>'L', -11464=>'L', -11465=>'L', -11466=>'L', -11467=>'L', -11468=>'L', -11469=>'L', -11470=>'L', -11471=>'L', -11472=>'L', -11473=>'L', -11474=>'L', -11475=>'L', -11476=>'L', -11477=>'L', -11478=>'L', -11479=>'L', -11480=>'L', -11481=>'L', -11482=>'L', -11483=>'L', -11484=>'L', -11485=>'L', -11486=>'L', -11487=>'L', -11488=>'L', -11489=>'L', -11490=>'L', -11491=>'L', -11492=>'L', -11493=>'ON', -11494=>'ON', -11495=>'ON', -11496=>'ON', -11497=>'ON', -11498=>'ON', -11513=>'ON', -11514=>'ON', -11515=>'ON', -11516=>'ON', -11517=>'ON', -11518=>'ON', -11519=>'ON', -11520=>'L', -11521=>'L', -11522=>'L', -11523=>'L', -11524=>'L', -11525=>'L', -11526=>'L', -11527=>'L', -11528=>'L', -11529=>'L', -11530=>'L', -11531=>'L', -11532=>'L', -11533=>'L', -11534=>'L', -11535=>'L', -11536=>'L', -11537=>'L', -11538=>'L', -11539=>'L', -11540=>'L', -11541=>'L', -11542=>'L', -11543=>'L', -11544=>'L', -11545=>'L', -11546=>'L', -11547=>'L', -11548=>'L', -11549=>'L', -11550=>'L', -11551=>'L', -11552=>'L', -11553=>'L', -11554=>'L', -11555=>'L', -11556=>'L', -11557=>'L', -11568=>'L', -11569=>'L', -11570=>'L', -11571=>'L', -11572=>'L', -11573=>'L', -11574=>'L', -11575=>'L', -11576=>'L', -11577=>'L', -11578=>'L', -11579=>'L', -11580=>'L', -11581=>'L', -11582=>'L', -11583=>'L', -11584=>'L', -11585=>'L', -11586=>'L', -11587=>'L', -11588=>'L', -11589=>'L', -11590=>'L', -11591=>'L', -11592=>'L', -11593=>'L', -11594=>'L', -11595=>'L', -11596=>'L', -11597=>'L', -11598=>'L', -11599=>'L', -11600=>'L', -11601=>'L', -11602=>'L', -11603=>'L', -11604=>'L', -11605=>'L', -11606=>'L', -11607=>'L', -11608=>'L', -11609=>'L', -11610=>'L', -11611=>'L', -11612=>'L', -11613=>'L', -11614=>'L', -11615=>'L', -11616=>'L', -11617=>'L', -11618=>'L', -11619=>'L', -11620=>'L', -11621=>'L', -11631=>'L', -11648=>'L', -11649=>'L', -11650=>'L', -11651=>'L', -11652=>'L', -11653=>'L', -11654=>'L', -11655=>'L', -11656=>'L', -11657=>'L', -11658=>'L', -11659=>'L', -11660=>'L', -11661=>'L', -11662=>'L', -11663=>'L', -11664=>'L', -11665=>'L', -11666=>'L', -11667=>'L', -11668=>'L', -11669=>'L', -11670=>'L', -11680=>'L', -11681=>'L', -11682=>'L', -11683=>'L', -11684=>'L', -11685=>'L', -11686=>'L', -11688=>'L', -11689=>'L', -11690=>'L', -11691=>'L', -11692=>'L', -11693=>'L', -11694=>'L', -11696=>'L', -11697=>'L', -11698=>'L', -11699=>'L', -11700=>'L', -11701=>'L', -11702=>'L', -11704=>'L', -11705=>'L', -11706=>'L', -11707=>'L', -11708=>'L', -11709=>'L', -11710=>'L', -11712=>'L', -11713=>'L', -11714=>'L', -11715=>'L', -11716=>'L', -11717=>'L', -11718=>'L', -11720=>'L', -11721=>'L', -11722=>'L', -11723=>'L', -11724=>'L', -11725=>'L', -11726=>'L', -11728=>'L', -11729=>'L', -11730=>'L', -11731=>'L', -11732=>'L', -11733=>'L', -11734=>'L', -11736=>'L', -11737=>'L', -11738=>'L', -11739=>'L', -11740=>'L', -11741=>'L', -11742=>'L', -11776=>'ON', -11777=>'ON', -11778=>'ON', -11779=>'ON', -11780=>'ON', -11781=>'ON', -11782=>'ON', -11783=>'ON', -11784=>'ON', -11785=>'ON', -11786=>'ON', -11787=>'ON', -11788=>'ON', -11789=>'ON', -11790=>'ON', -11791=>'ON', -11792=>'ON', -11793=>'ON', -11794=>'ON', -11795=>'ON', -11796=>'ON', -11797=>'ON', -11798=>'ON', -11799=>'ON', -11804=>'ON', -11805=>'ON', -11904=>'ON', -11905=>'ON', -11906=>'ON', -11907=>'ON', -11908=>'ON', -11909=>'ON', -11910=>'ON', -11911=>'ON', -11912=>'ON', -11913=>'ON', -11914=>'ON', -11915=>'ON', -11916=>'ON', -11917=>'ON', -11918=>'ON', -11919=>'ON', -11920=>'ON', -11921=>'ON', -11922=>'ON', -11923=>'ON', -11924=>'ON', -11925=>'ON', -11926=>'ON', -11927=>'ON', -11928=>'ON', -11929=>'ON', -11931=>'ON', -11932=>'ON', -11933=>'ON', -11934=>'ON', -11935=>'ON', -11936=>'ON', -11937=>'ON', -11938=>'ON', -11939=>'ON', -11940=>'ON', -11941=>'ON', -11942=>'ON', -11943=>'ON', -11944=>'ON', -11945=>'ON', -11946=>'ON', -11947=>'ON', -11948=>'ON', -11949=>'ON', -11950=>'ON', -11951=>'ON', -11952=>'ON', -11953=>'ON', -11954=>'ON', -11955=>'ON', -11956=>'ON', -11957=>'ON', -11958=>'ON', -11959=>'ON', -11960=>'ON', -11961=>'ON', -11962=>'ON', -11963=>'ON', -11964=>'ON', -11965=>'ON', -11966=>'ON', -11967=>'ON', -11968=>'ON', -11969=>'ON', -11970=>'ON', -11971=>'ON', -11972=>'ON', -11973=>'ON', -11974=>'ON', -11975=>'ON', -11976=>'ON', -11977=>'ON', -11978=>'ON', -11979=>'ON', -11980=>'ON', -11981=>'ON', -11982=>'ON', -11983=>'ON', -11984=>'ON', -11985=>'ON', -11986=>'ON', -11987=>'ON', -11988=>'ON', -11989=>'ON', -11990=>'ON', -11991=>'ON', -11992=>'ON', -11993=>'ON', -11994=>'ON', -11995=>'ON', -11996=>'ON', -11997=>'ON', -11998=>'ON', -11999=>'ON', -12000=>'ON', -12001=>'ON', -12002=>'ON', -12003=>'ON', -12004=>'ON', -12005=>'ON', -12006=>'ON', -12007=>'ON', -12008=>'ON', -12009=>'ON', -12010=>'ON', -12011=>'ON', -12012=>'ON', -12013=>'ON', -12014=>'ON', -12015=>'ON', -12016=>'ON', -12017=>'ON', -12018=>'ON', -12019=>'ON', -12032=>'ON', -12033=>'ON', -12034=>'ON', -12035=>'ON', -12036=>'ON', -12037=>'ON', -12038=>'ON', -12039=>'ON', -12040=>'ON', -12041=>'ON', -12042=>'ON', -12043=>'ON', -12044=>'ON', -12045=>'ON', -12046=>'ON', -12047=>'ON', -12048=>'ON', -12049=>'ON', -12050=>'ON', -12051=>'ON', -12052=>'ON', -12053=>'ON', -12054=>'ON', -12055=>'ON', -12056=>'ON', -12057=>'ON', -12058=>'ON', -12059=>'ON', -12060=>'ON', -12061=>'ON', -12062=>'ON', -12063=>'ON', -12064=>'ON', -12065=>'ON', -12066=>'ON', -12067=>'ON', -12068=>'ON', -12069=>'ON', -12070=>'ON', -12071=>'ON', -12072=>'ON', -12073=>'ON', -12074=>'ON', -12075=>'ON', -12076=>'ON', -12077=>'ON', -12078=>'ON', -12079=>'ON', -12080=>'ON', -12081=>'ON', -12082=>'ON', -12083=>'ON', -12084=>'ON', -12085=>'ON', -12086=>'ON', -12087=>'ON', -12088=>'ON', -12089=>'ON', -12090=>'ON', -12091=>'ON', -12092=>'ON', -12093=>'ON', -12094=>'ON', -12095=>'ON', -12096=>'ON', -12097=>'ON', -12098=>'ON', -12099=>'ON', -12100=>'ON', -12101=>'ON', -12102=>'ON', -12103=>'ON', -12104=>'ON', -12105=>'ON', -12106=>'ON', -12107=>'ON', -12108=>'ON', -12109=>'ON', -12110=>'ON', -12111=>'ON', -12112=>'ON', -12113=>'ON', -12114=>'ON', -12115=>'ON', -12116=>'ON', -12117=>'ON', -12118=>'ON', -12119=>'ON', -12120=>'ON', -12121=>'ON', -12122=>'ON', -12123=>'ON', -12124=>'ON', -12125=>'ON', -12126=>'ON', -12127=>'ON', -12128=>'ON', -12129=>'ON', -12130=>'ON', -12131=>'ON', -12132=>'ON', -12133=>'ON', -12134=>'ON', -12135=>'ON', -12136=>'ON', -12137=>'ON', -12138=>'ON', -12139=>'ON', -12140=>'ON', -12141=>'ON', -12142=>'ON', -12143=>'ON', -12144=>'ON', -12145=>'ON', -12146=>'ON', -12147=>'ON', -12148=>'ON', -12149=>'ON', -12150=>'ON', -12151=>'ON', -12152=>'ON', -12153=>'ON', -12154=>'ON', -12155=>'ON', -12156=>'ON', -12157=>'ON', -12158=>'ON', -12159=>'ON', -12160=>'ON', -12161=>'ON', -12162=>'ON', -12163=>'ON', -12164=>'ON', -12165=>'ON', -12166=>'ON', -12167=>'ON', -12168=>'ON', -12169=>'ON', -12170=>'ON', -12171=>'ON', -12172=>'ON', -12173=>'ON', -12174=>'ON', -12175=>'ON', -12176=>'ON', -12177=>'ON', -12178=>'ON', -12179=>'ON', -12180=>'ON', -12181=>'ON', -12182=>'ON', -12183=>'ON', -12184=>'ON', -12185=>'ON', -12186=>'ON', -12187=>'ON', -12188=>'ON', -12189=>'ON', -12190=>'ON', -12191=>'ON', -12192=>'ON', -12193=>'ON', -12194=>'ON', -12195=>'ON', -12196=>'ON', -12197=>'ON', -12198=>'ON', -12199=>'ON', -12200=>'ON', -12201=>'ON', -12202=>'ON', -12203=>'ON', -12204=>'ON', -12205=>'ON', -12206=>'ON', -12207=>'ON', -12208=>'ON', -12209=>'ON', -12210=>'ON', -12211=>'ON', -12212=>'ON', -12213=>'ON', -12214=>'ON', -12215=>'ON', -12216=>'ON', -12217=>'ON', -12218=>'ON', -12219=>'ON', -12220=>'ON', -12221=>'ON', -12222=>'ON', -12223=>'ON', -12224=>'ON', -12225=>'ON', -12226=>'ON', -12227=>'ON', -12228=>'ON', -12229=>'ON', -12230=>'ON', -12231=>'ON', -12232=>'ON', -12233=>'ON', -12234=>'ON', -12235=>'ON', -12236=>'ON', -12237=>'ON', -12238=>'ON', -12239=>'ON', -12240=>'ON', -12241=>'ON', -12242=>'ON', -12243=>'ON', -12244=>'ON', -12245=>'ON', -12272=>'ON', -12273=>'ON', -12274=>'ON', -12275=>'ON', -12276=>'ON', -12277=>'ON', -12278=>'ON', -12279=>'ON', -12280=>'ON', -12281=>'ON', -12282=>'ON', -12283=>'ON', -12288=>'WS', -12289=>'ON', -12290=>'ON', -12291=>'ON', -12292=>'ON', -12293=>'L', -12294=>'L', -12295=>'L', -12296=>'ON', -12297=>'ON', -12298=>'ON', -12299=>'ON', -12300=>'ON', -12301=>'ON', -12302=>'ON', -12303=>'ON', -12304=>'ON', -12305=>'ON', -12306=>'ON', -12307=>'ON', -12308=>'ON', -12309=>'ON', -12310=>'ON', -12311=>'ON', -12312=>'ON', -12313=>'ON', -12314=>'ON', -12315=>'ON', -12316=>'ON', -12317=>'ON', -12318=>'ON', -12319=>'ON', -12320=>'ON', -12321=>'L', -12322=>'L', -12323=>'L', -12324=>'L', -12325=>'L', -12326=>'L', -12327=>'L', -12328=>'L', -12329=>'L', -12330=>'NSM', -12331=>'NSM', -12332=>'NSM', -12333=>'NSM', -12334=>'NSM', -12335=>'NSM', -12336=>'ON', -12337=>'L', -12338=>'L', -12339=>'L', -12340=>'L', -12341=>'L', -12342=>'ON', -12343=>'ON', -12344=>'L', -12345=>'L', -12346=>'L', -12347=>'L', -12348=>'L', -12349=>'ON', -12350=>'ON', -12351=>'ON', -12353=>'L', -12354=>'L', -12355=>'L', -12356=>'L', -12357=>'L', -12358=>'L', -12359=>'L', -12360=>'L', -12361=>'L', -12362=>'L', -12363=>'L', -12364=>'L', -12365=>'L', -12366=>'L', -12367=>'L', -12368=>'L', -12369=>'L', -12370=>'L', -12371=>'L', -12372=>'L', -12373=>'L', -12374=>'L', -12375=>'L', -12376=>'L', -12377=>'L', -12378=>'L', -12379=>'L', -12380=>'L', -12381=>'L', -12382=>'L', -12383=>'L', -12384=>'L', -12385=>'L', -12386=>'L', -12387=>'L', -12388=>'L', -12389=>'L', -12390=>'L', -12391=>'L', -12392=>'L', -12393=>'L', -12394=>'L', -12395=>'L', -12396=>'L', -12397=>'L', -12398=>'L', -12399=>'L', -12400=>'L', -12401=>'L', -12402=>'L', -12403=>'L', -12404=>'L', -12405=>'L', -12406=>'L', -12407=>'L', -12408=>'L', -12409=>'L', -12410=>'L', -12411=>'L', -12412=>'L', -12413=>'L', -12414=>'L', -12415=>'L', -12416=>'L', -12417=>'L', -12418=>'L', -12419=>'L', -12420=>'L', -12421=>'L', -12422=>'L', -12423=>'L', -12424=>'L', -12425=>'L', -12426=>'L', -12427=>'L', -12428=>'L', -12429=>'L', -12430=>'L', -12431=>'L', -12432=>'L', -12433=>'L', -12434=>'L', -12435=>'L', -12436=>'L', -12437=>'L', -12438=>'L', -12441=>'NSM', -12442=>'NSM', -12443=>'ON', -12444=>'ON', -12445=>'L', -12446=>'L', -12447=>'L', -12448=>'ON', -12449=>'L', -12450=>'L', -12451=>'L', -12452=>'L', -12453=>'L', -12454=>'L', -12455=>'L', -12456=>'L', -12457=>'L', -12458=>'L', -12459=>'L', -12460=>'L', -12461=>'L', -12462=>'L', -12463=>'L', -12464=>'L', -12465=>'L', -12466=>'L', -12467=>'L', -12468=>'L', -12469=>'L', -12470=>'L', -12471=>'L', -12472=>'L', -12473=>'L', -12474=>'L', -12475=>'L', -12476=>'L', -12477=>'L', -12478=>'L', -12479=>'L', -12480=>'L', -12481=>'L', -12482=>'L', -12483=>'L', -12484=>'L', -12485=>'L', -12486=>'L', -12487=>'L', -12488=>'L', -12489=>'L', -12490=>'L', -12491=>'L', -12492=>'L', -12493=>'L', -12494=>'L', -12495=>'L', -12496=>'L', -12497=>'L', -12498=>'L', -12499=>'L', -12500=>'L', -12501=>'L', -12502=>'L', -12503=>'L', -12504=>'L', -12505=>'L', -12506=>'L', -12507=>'L', -12508=>'L', -12509=>'L', -12510=>'L', -12511=>'L', -12512=>'L', -12513=>'L', -12514=>'L', -12515=>'L', -12516=>'L', -12517=>'L', -12518=>'L', -12519=>'L', -12520=>'L', -12521=>'L', -12522=>'L', -12523=>'L', -12524=>'L', -12525=>'L', -12526=>'L', -12527=>'L', -12528=>'L', -12529=>'L', -12530=>'L', -12531=>'L', -12532=>'L', -12533=>'L', -12534=>'L', -12535=>'L', -12536=>'L', -12537=>'L', -12538=>'L', -12539=>'ON', -12540=>'L', -12541=>'L', -12542=>'L', -12543=>'L', -12549=>'L', -12550=>'L', -12551=>'L', -12552=>'L', -12553=>'L', -12554=>'L', -12555=>'L', -12556=>'L', -12557=>'L', -12558=>'L', -12559=>'L', -12560=>'L', -12561=>'L', -12562=>'L', -12563=>'L', -12564=>'L', -12565=>'L', -12566=>'L', -12567=>'L', -12568=>'L', -12569=>'L', -12570=>'L', -12571=>'L', -12572=>'L', -12573=>'L', -12574=>'L', -12575=>'L', -12576=>'L', -12577=>'L', -12578=>'L', -12579=>'L', -12580=>'L', -12581=>'L', -12582=>'L', -12583=>'L', -12584=>'L', -12585=>'L', -12586=>'L', -12587=>'L', -12588=>'L', -12593=>'L', -12594=>'L', -12595=>'L', -12596=>'L', -12597=>'L', -12598=>'L', -12599=>'L', -12600=>'L', -12601=>'L', -12602=>'L', -12603=>'L', -12604=>'L', -12605=>'L', -12606=>'L', -12607=>'L', -12608=>'L', -12609=>'L', -12610=>'L', -12611=>'L', -12612=>'L', -12613=>'L', -12614=>'L', -12615=>'L', -12616=>'L', -12617=>'L', -12618=>'L', -12619=>'L', -12620=>'L', -12621=>'L', -12622=>'L', -12623=>'L', -12624=>'L', -12625=>'L', -12626=>'L', -12627=>'L', -12628=>'L', -12629=>'L', -12630=>'L', -12631=>'L', -12632=>'L', -12633=>'L', -12634=>'L', -12635=>'L', -12636=>'L', -12637=>'L', -12638=>'L', -12639=>'L', -12640=>'L', -12641=>'L', -12642=>'L', -12643=>'L', -12644=>'L', -12645=>'L', -12646=>'L', -12647=>'L', -12648=>'L', -12649=>'L', -12650=>'L', -12651=>'L', -12652=>'L', -12653=>'L', -12654=>'L', -12655=>'L', -12656=>'L', -12657=>'L', -12658=>'L', -12659=>'L', -12660=>'L', -12661=>'L', -12662=>'L', -12663=>'L', -12664=>'L', -12665=>'L', -12666=>'L', -12667=>'L', -12668=>'L', -12669=>'L', -12670=>'L', -12671=>'L', -12672=>'L', -12673=>'L', -12674=>'L', -12675=>'L', -12676=>'L', -12677=>'L', -12678=>'L', -12679=>'L', -12680=>'L', -12681=>'L', -12682=>'L', -12683=>'L', -12684=>'L', -12685=>'L', -12686=>'L', -12688=>'L', -12689=>'L', -12690=>'L', -12691=>'L', -12692=>'L', -12693=>'L', -12694=>'L', -12695=>'L', -12696=>'L', -12697=>'L', -12698=>'L', -12699=>'L', -12700=>'L', -12701=>'L', -12702=>'L', -12703=>'L', -12704=>'L', -12705=>'L', -12706=>'L', -12707=>'L', -12708=>'L', -12709=>'L', -12710=>'L', -12711=>'L', -12712=>'L', -12713=>'L', -12714=>'L', -12715=>'L', -12716=>'L', -12717=>'L', -12718=>'L', -12719=>'L', -12720=>'L', -12721=>'L', -12722=>'L', -12723=>'L', -12724=>'L', -12725=>'L', -12726=>'L', -12727=>'L', -12736=>'ON', -12737=>'ON', -12738=>'ON', -12739=>'ON', -12740=>'ON', -12741=>'ON', -12742=>'ON', -12743=>'ON', -12744=>'ON', -12745=>'ON', -12746=>'ON', -12747=>'ON', -12748=>'ON', -12749=>'ON', -12750=>'ON', -12751=>'ON', -12784=>'L', -12785=>'L', -12786=>'L', -12787=>'L', -12788=>'L', -12789=>'L', -12790=>'L', -12791=>'L', -12792=>'L', -12793=>'L', -12794=>'L', -12795=>'L', -12796=>'L', -12797=>'L', -12798=>'L', -12799=>'L', -12800=>'L', -12801=>'L', -12802=>'L', -12803=>'L', -12804=>'L', -12805=>'L', -12806=>'L', -12807=>'L', -12808=>'L', -12809=>'L', -12810=>'L', -12811=>'L', -12812=>'L', -12813=>'L', -12814=>'L', -12815=>'L', -12816=>'L', -12817=>'L', -12818=>'L', -12819=>'L', -12820=>'L', -12821=>'L', -12822=>'L', -12823=>'L', -12824=>'L', -12825=>'L', -12826=>'L', -12827=>'L', -12828=>'L', -12829=>'ON', -12830=>'ON', -12832=>'L', -12833=>'L', -12834=>'L', -12835=>'L', -12836=>'L', -12837=>'L', -12838=>'L', -12839=>'L', -12840=>'L', -12841=>'L', -12842=>'L', -12843=>'L', -12844=>'L', -12845=>'L', -12846=>'L', -12847=>'L', -12848=>'L', -12849=>'L', -12850=>'L', -12851=>'L', -12852=>'L', -12853=>'L', -12854=>'L', -12855=>'L', -12856=>'L', -12857=>'L', -12858=>'L', -12859=>'L', -12860=>'L', -12861=>'L', -12862=>'L', -12863=>'L', -12864=>'L', -12865=>'L', -12866=>'L', -12867=>'L', -12880=>'ON', -12881=>'ON', -12882=>'ON', -12883=>'ON', -12884=>'ON', -12885=>'ON', -12886=>'ON', -12887=>'ON', -12888=>'ON', -12889=>'ON', -12890=>'ON', -12891=>'ON', -12892=>'ON', -12893=>'ON', -12894=>'ON', -12895=>'ON', -12896=>'L', -12897=>'L', -12898=>'L', -12899=>'L', -12900=>'L', -12901=>'L', -12902=>'L', -12903=>'L', -12904=>'L', -12905=>'L', -12906=>'L', -12907=>'L', -12908=>'L', -12909=>'L', -12910=>'L', -12911=>'L', -12912=>'L', -12913=>'L', -12914=>'L', -12915=>'L', -12916=>'L', -12917=>'L', -12918=>'L', -12919=>'L', -12920=>'L', -12921=>'L', -12922=>'L', -12923=>'L', -12924=>'ON', -12925=>'ON', -12926=>'ON', -12927=>'L', -12928=>'L', -12929=>'L', -12930=>'L', -12931=>'L', -12932=>'L', -12933=>'L', -12934=>'L', -12935=>'L', -12936=>'L', -12937=>'L', -12938=>'L', -12939=>'L', -12940=>'L', -12941=>'L', -12942=>'L', -12943=>'L', -12944=>'L', -12945=>'L', -12946=>'L', -12947=>'L', -12948=>'L', -12949=>'L', -12950=>'L', -12951=>'L', -12952=>'L', -12953=>'L', -12954=>'L', -12955=>'L', -12956=>'L', -12957=>'L', -12958=>'L', -12959=>'L', -12960=>'L', -12961=>'L', -12962=>'L', -12963=>'L', -12964=>'L', -12965=>'L', -12966=>'L', -12967=>'L', -12968=>'L', -12969=>'L', -12970=>'L', -12971=>'L', -12972=>'L', -12973=>'L', -12974=>'L', -12975=>'L', -12976=>'L', -12977=>'ON', -12978=>'ON', -12979=>'ON', -12980=>'ON', -12981=>'ON', -12982=>'ON', -12983=>'ON', -12984=>'ON', -12985=>'ON', -12986=>'ON', -12987=>'ON', -12988=>'ON', -12989=>'ON', -12990=>'ON', -12991=>'ON', -12992=>'L', -12993=>'L', -12994=>'L', -12995=>'L', -12996=>'L', -12997=>'L', -12998=>'L', -12999=>'L', -13000=>'L', -13001=>'L', -13002=>'L', -13003=>'L', -13004=>'ON', -13005=>'ON', -13006=>'ON', -13007=>'ON', -13008=>'L', -13009=>'L', -13010=>'L', -13011=>'L', -13012=>'L', -13013=>'L', -13014=>'L', -13015=>'L', -13016=>'L', -13017=>'L', -13018=>'L', -13019=>'L', -13020=>'L', -13021=>'L', -13022=>'L', -13023=>'L', -13024=>'L', -13025=>'L', -13026=>'L', -13027=>'L', -13028=>'L', -13029=>'L', -13030=>'L', -13031=>'L', -13032=>'L', -13033=>'L', -13034=>'L', -13035=>'L', -13036=>'L', -13037=>'L', -13038=>'L', -13039=>'L', -13040=>'L', -13041=>'L', -13042=>'L', -13043=>'L', -13044=>'L', -13045=>'L', -13046=>'L', -13047=>'L', -13048=>'L', -13049=>'L', -13050=>'L', -13051=>'L', -13052=>'L', -13053=>'L', -13054=>'L', -13056=>'L', -13057=>'L', -13058=>'L', -13059=>'L', -13060=>'L', -13061=>'L', -13062=>'L', -13063=>'L', -13064=>'L', -13065=>'L', -13066=>'L', -13067=>'L', -13068=>'L', -13069=>'L', -13070=>'L', -13071=>'L', -13072=>'L', -13073=>'L', -13074=>'L', -13075=>'L', -13076=>'L', -13077=>'L', -13078=>'L', -13079=>'L', -13080=>'L', -13081=>'L', -13082=>'L', -13083=>'L', -13084=>'L', -13085=>'L', -13086=>'L', -13087=>'L', -13088=>'L', -13089=>'L', -13090=>'L', -13091=>'L', -13092=>'L', -13093=>'L', -13094=>'L', -13095=>'L', -13096=>'L', -13097=>'L', -13098=>'L', -13099=>'L', -13100=>'L', -13101=>'L', -13102=>'L', -13103=>'L', -13104=>'L', -13105=>'L', -13106=>'L', -13107=>'L', -13108=>'L', -13109=>'L', -13110=>'L', -13111=>'L', -13112=>'L', -13113=>'L', -13114=>'L', -13115=>'L', -13116=>'L', -13117=>'L', -13118=>'L', -13119=>'L', -13120=>'L', -13121=>'L', -13122=>'L', -13123=>'L', -13124=>'L', -13125=>'L', -13126=>'L', -13127=>'L', -13128=>'L', -13129=>'L', -13130=>'L', -13131=>'L', -13132=>'L', -13133=>'L', -13134=>'L', -13135=>'L', -13136=>'L', -13137=>'L', -13138=>'L', -13139=>'L', -13140=>'L', -13141=>'L', -13142=>'L', -13143=>'L', -13144=>'L', -13145=>'L', -13146=>'L', -13147=>'L', -13148=>'L', -13149=>'L', -13150=>'L', -13151=>'L', -13152=>'L', -13153=>'L', -13154=>'L', -13155=>'L', -13156=>'L', -13157=>'L', -13158=>'L', -13159=>'L', -13160=>'L', -13161=>'L', -13162=>'L', -13163=>'L', -13164=>'L', -13165=>'L', -13166=>'L', -13167=>'L', -13168=>'L', -13169=>'L', -13170=>'L', -13171=>'L', -13172=>'L', -13173=>'L', -13174=>'L', -13175=>'ON', -13176=>'ON', -13177=>'ON', -13178=>'ON', -13179=>'L', -13180=>'L', -13181=>'L', -13182=>'L', -13183=>'L', -13184=>'L', -13185=>'L', -13186=>'L', -13187=>'L', -13188=>'L', -13189=>'L', -13190=>'L', -13191=>'L', -13192=>'L', -13193=>'L', -13194=>'L', -13195=>'L', -13196=>'L', -13197=>'L', -13198=>'L', -13199=>'L', -13200=>'L', -13201=>'L', -13202=>'L', -13203=>'L', -13204=>'L', -13205=>'L', -13206=>'L', -13207=>'L', -13208=>'L', -13209=>'L', -13210=>'L', -13211=>'L', -13212=>'L', -13213=>'L', -13214=>'L', -13215=>'L', -13216=>'L', -13217=>'L', -13218=>'L', -13219=>'L', -13220=>'L', -13221=>'L', -13222=>'L', -13223=>'L', -13224=>'L', -13225=>'L', -13226=>'L', -13227=>'L', -13228=>'L', -13229=>'L', -13230=>'L', -13231=>'L', -13232=>'L', -13233=>'L', -13234=>'L', -13235=>'L', -13236=>'L', -13237=>'L', -13238=>'L', -13239=>'L', -13240=>'L', -13241=>'L', -13242=>'L', -13243=>'L', -13244=>'L', -13245=>'L', -13246=>'L', -13247=>'L', -13248=>'L', -13249=>'L', -13250=>'L', -13251=>'L', -13252=>'L', -13253=>'L', -13254=>'L', -13255=>'L', -13256=>'L', -13257=>'L', -13258=>'L', -13259=>'L', -13260=>'L', -13261=>'L', -13262=>'L', -13263=>'L', -13264=>'L', -13265=>'L', -13266=>'L', -13267=>'L', -13268=>'L', -13269=>'L', -13270=>'L', -13271=>'L', -13272=>'L', -13273=>'L', -13274=>'L', -13275=>'L', -13276=>'L', -13277=>'L', -13278=>'ON', -13279=>'ON', -13280=>'L', -13281=>'L', -13282=>'L', -13283=>'L', -13284=>'L', -13285=>'L', -13286=>'L', -13287=>'L', -13288=>'L', -13289=>'L', -13290=>'L', -13291=>'L', -13292=>'L', -13293=>'L', -13294=>'L', -13295=>'L', -13296=>'L', -13297=>'L', -13298=>'L', -13299=>'L', -13300=>'L', -13301=>'L', -13302=>'L', -13303=>'L', -13304=>'L', -13305=>'L', -13306=>'L', -13307=>'L', -13308=>'L', -13309=>'L', -13310=>'L', -13311=>'ON', -13312=>'L', -19893=>'L', -19904=>'ON', -19905=>'ON', -19906=>'ON', -19907=>'ON', -19908=>'ON', -19909=>'ON', -19910=>'ON', -19911=>'ON', -19912=>'ON', -19913=>'ON', -19914=>'ON', -19915=>'ON', -19916=>'ON', -19917=>'ON', -19918=>'ON', -19919=>'ON', -19920=>'ON', -19921=>'ON', -19922=>'ON', -19923=>'ON', -19924=>'ON', -19925=>'ON', -19926=>'ON', -19927=>'ON', -19928=>'ON', -19929=>'ON', -19930=>'ON', -19931=>'ON', -19932=>'ON', -19933=>'ON', -19934=>'ON', -19935=>'ON', -19936=>'ON', -19937=>'ON', -19938=>'ON', -19939=>'ON', -19940=>'ON', -19941=>'ON', -19942=>'ON', -19943=>'ON', -19944=>'ON', -19945=>'ON', -19946=>'ON', -19947=>'ON', -19948=>'ON', -19949=>'ON', -19950=>'ON', -19951=>'ON', -19952=>'ON', -19953=>'ON', -19954=>'ON', -19955=>'ON', -19956=>'ON', -19957=>'ON', -19958=>'ON', -19959=>'ON', -19960=>'ON', -19961=>'ON', -19962=>'ON', -19963=>'ON', -19964=>'ON', -19965=>'ON', -19966=>'ON', -19967=>'ON', -19968=>'L', -40891=>'L', -40960=>'L', -40961=>'L', -40962=>'L', -40963=>'L', -40964=>'L', -40965=>'L', -40966=>'L', -40967=>'L', -40968=>'L', -40969=>'L', -40970=>'L', -40971=>'L', -40972=>'L', -40973=>'L', -40974=>'L', -40975=>'L', -40976=>'L', -40977=>'L', -40978=>'L', -40979=>'L', -40980=>'L', -40981=>'L', -40982=>'L', -40983=>'L', -40984=>'L', -40985=>'L', -40986=>'L', -40987=>'L', -40988=>'L', -40989=>'L', -40990=>'L', -40991=>'L', -40992=>'L', -40993=>'L', -40994=>'L', -40995=>'L', -40996=>'L', -40997=>'L', -40998=>'L', -40999=>'L', -41000=>'L', -41001=>'L', -41002=>'L', -41003=>'L', -41004=>'L', -41005=>'L', -41006=>'L', -41007=>'L', -41008=>'L', -41009=>'L', -41010=>'L', -41011=>'L', -41012=>'L', -41013=>'L', -41014=>'L', -41015=>'L', -41016=>'L', -41017=>'L', -41018=>'L', -41019=>'L', -41020=>'L', -41021=>'L', -41022=>'L', -41023=>'L', -41024=>'L', -41025=>'L', -41026=>'L', -41027=>'L', -41028=>'L', -41029=>'L', -41030=>'L', -41031=>'L', -41032=>'L', -41033=>'L', -41034=>'L', -41035=>'L', -41036=>'L', -41037=>'L', -41038=>'L', -41039=>'L', -41040=>'L', -41041=>'L', -41042=>'L', -41043=>'L', -41044=>'L', -41045=>'L', -41046=>'L', -41047=>'L', -41048=>'L', -41049=>'L', -41050=>'L', -41051=>'L', -41052=>'L', -41053=>'L', -41054=>'L', -41055=>'L', -41056=>'L', -41057=>'L', -41058=>'L', -41059=>'L', -41060=>'L', -41061=>'L', -41062=>'L', -41063=>'L', -41064=>'L', -41065=>'L', -41066=>'L', -41067=>'L', -41068=>'L', -41069=>'L', -41070=>'L', -41071=>'L', -41072=>'L', -41073=>'L', -41074=>'L', -41075=>'L', -41076=>'L', -41077=>'L', -41078=>'L', -41079=>'L', -41080=>'L', -41081=>'L', -41082=>'L', -41083=>'L', -41084=>'L', -41085=>'L', -41086=>'L', -41087=>'L', -41088=>'L', -41089=>'L', -41090=>'L', -41091=>'L', -41092=>'L', -41093=>'L', -41094=>'L', -41095=>'L', -41096=>'L', -41097=>'L', -41098=>'L', -41099=>'L', -41100=>'L', -41101=>'L', -41102=>'L', -41103=>'L', -41104=>'L', -41105=>'L', -41106=>'L', -41107=>'L', -41108=>'L', -41109=>'L', -41110=>'L', -41111=>'L', -41112=>'L', -41113=>'L', -41114=>'L', -41115=>'L', -41116=>'L', -41117=>'L', -41118=>'L', -41119=>'L', -41120=>'L', -41121=>'L', -41122=>'L', -41123=>'L', -41124=>'L', -41125=>'L', -41126=>'L', -41127=>'L', -41128=>'L', -41129=>'L', -41130=>'L', -41131=>'L', -41132=>'L', -41133=>'L', -41134=>'L', -41135=>'L', -41136=>'L', -41137=>'L', -41138=>'L', -41139=>'L', -41140=>'L', -41141=>'L', -41142=>'L', -41143=>'L', -41144=>'L', -41145=>'L', -41146=>'L', -41147=>'L', -41148=>'L', -41149=>'L', -41150=>'L', -41151=>'L', -41152=>'L', -41153=>'L', -41154=>'L', -41155=>'L', -41156=>'L', -41157=>'L', -41158=>'L', -41159=>'L', -41160=>'L', -41161=>'L', -41162=>'L', -41163=>'L', -41164=>'L', -41165=>'L', -41166=>'L', -41167=>'L', -41168=>'L', -41169=>'L', -41170=>'L', -41171=>'L', -41172=>'L', -41173=>'L', -41174=>'L', -41175=>'L', -41176=>'L', -41177=>'L', -41178=>'L', -41179=>'L', -41180=>'L', -41181=>'L', -41182=>'L', -41183=>'L', -41184=>'L', -41185=>'L', -41186=>'L', -41187=>'L', -41188=>'L', -41189=>'L', -41190=>'L', -41191=>'L', -41192=>'L', -41193=>'L', -41194=>'L', -41195=>'L', -41196=>'L', -41197=>'L', -41198=>'L', -41199=>'L', -41200=>'L', -41201=>'L', -41202=>'L', -41203=>'L', -41204=>'L', -41205=>'L', -41206=>'L', -41207=>'L', -41208=>'L', -41209=>'L', -41210=>'L', -41211=>'L', -41212=>'L', -41213=>'L', -41214=>'L', -41215=>'L', -41216=>'L', -41217=>'L', -41218=>'L', -41219=>'L', -41220=>'L', -41221=>'L', -41222=>'L', -41223=>'L', -41224=>'L', -41225=>'L', -41226=>'L', -41227=>'L', -41228=>'L', -41229=>'L', -41230=>'L', -41231=>'L', -41232=>'L', -41233=>'L', -41234=>'L', -41235=>'L', -41236=>'L', -41237=>'L', -41238=>'L', -41239=>'L', -41240=>'L', -41241=>'L', -41242=>'L', -41243=>'L', -41244=>'L', -41245=>'L', -41246=>'L', -41247=>'L', -41248=>'L', -41249=>'L', -41250=>'L', -41251=>'L', -41252=>'L', -41253=>'L', -41254=>'L', -41255=>'L', -41256=>'L', -41257=>'L', -41258=>'L', -41259=>'L', -41260=>'L', -41261=>'L', -41262=>'L', -41263=>'L', -41264=>'L', -41265=>'L', -41266=>'L', -41267=>'L', -41268=>'L', -41269=>'L', -41270=>'L', -41271=>'L', -41272=>'L', -41273=>'L', -41274=>'L', -41275=>'L', -41276=>'L', -41277=>'L', -41278=>'L', -41279=>'L', -41280=>'L', -41281=>'L', -41282=>'L', -41283=>'L', -41284=>'L', -41285=>'L', -41286=>'L', -41287=>'L', -41288=>'L', -41289=>'L', -41290=>'L', -41291=>'L', -41292=>'L', -41293=>'L', -41294=>'L', -41295=>'L', -41296=>'L', -41297=>'L', -41298=>'L', -41299=>'L', -41300=>'L', -41301=>'L', -41302=>'L', -41303=>'L', -41304=>'L', -41305=>'L', -41306=>'L', -41307=>'L', -41308=>'L', -41309=>'L', -41310=>'L', -41311=>'L', -41312=>'L', -41313=>'L', -41314=>'L', -41315=>'L', -41316=>'L', -41317=>'L', -41318=>'L', -41319=>'L', -41320=>'L', -41321=>'L', -41322=>'L', -41323=>'L', -41324=>'L', -41325=>'L', -41326=>'L', -41327=>'L', -41328=>'L', -41329=>'L', -41330=>'L', -41331=>'L', -41332=>'L', -41333=>'L', -41334=>'L', -41335=>'L', -41336=>'L', -41337=>'L', -41338=>'L', -41339=>'L', -41340=>'L', -41341=>'L', -41342=>'L', -41343=>'L', -41344=>'L', -41345=>'L', -41346=>'L', -41347=>'L', -41348=>'L', -41349=>'L', -41350=>'L', -41351=>'L', -41352=>'L', -41353=>'L', -41354=>'L', -41355=>'L', -41356=>'L', -41357=>'L', -41358=>'L', -41359=>'L', -41360=>'L', -41361=>'L', -41362=>'L', -41363=>'L', -41364=>'L', -41365=>'L', -41366=>'L', -41367=>'L', -41368=>'L', -41369=>'L', -41370=>'L', -41371=>'L', -41372=>'L', -41373=>'L', -41374=>'L', -41375=>'L', -41376=>'L', -41377=>'L', -41378=>'L', -41379=>'L', -41380=>'L', -41381=>'L', -41382=>'L', -41383=>'L', -41384=>'L', -41385=>'L', -41386=>'L', -41387=>'L', -41388=>'L', -41389=>'L', -41390=>'L', -41391=>'L', -41392=>'L', -41393=>'L', -41394=>'L', -41395=>'L', -41396=>'L', -41397=>'L', -41398=>'L', -41399=>'L', -41400=>'L', -41401=>'L', -41402=>'L', -41403=>'L', -41404=>'L', -41405=>'L', -41406=>'L', -41407=>'L', -41408=>'L', -41409=>'L', -41410=>'L', -41411=>'L', -41412=>'L', -41413=>'L', -41414=>'L', -41415=>'L', -41416=>'L', -41417=>'L', -41418=>'L', -41419=>'L', -41420=>'L', -41421=>'L', -41422=>'L', -41423=>'L', -41424=>'L', -41425=>'L', -41426=>'L', -41427=>'L', -41428=>'L', -41429=>'L', -41430=>'L', -41431=>'L', -41432=>'L', -41433=>'L', -41434=>'L', -41435=>'L', -41436=>'L', -41437=>'L', -41438=>'L', -41439=>'L', -41440=>'L', -41441=>'L', -41442=>'L', -41443=>'L', -41444=>'L', -41445=>'L', -41446=>'L', -41447=>'L', -41448=>'L', -41449=>'L', -41450=>'L', -41451=>'L', -41452=>'L', -41453=>'L', -41454=>'L', -41455=>'L', -41456=>'L', -41457=>'L', -41458=>'L', -41459=>'L', -41460=>'L', -41461=>'L', -41462=>'L', -41463=>'L', -41464=>'L', -41465=>'L', -41466=>'L', -41467=>'L', -41468=>'L', -41469=>'L', -41470=>'L', -41471=>'L', -41472=>'L', -41473=>'L', -41474=>'L', -41475=>'L', -41476=>'L', -41477=>'L', -41478=>'L', -41479=>'L', -41480=>'L', -41481=>'L', -41482=>'L', -41483=>'L', -41484=>'L', -41485=>'L', -41486=>'L', -41487=>'L', -41488=>'L', -41489=>'L', -41490=>'L', -41491=>'L', -41492=>'L', -41493=>'L', -41494=>'L', -41495=>'L', -41496=>'L', -41497=>'L', -41498=>'L', -41499=>'L', -41500=>'L', -41501=>'L', -41502=>'L', -41503=>'L', -41504=>'L', -41505=>'L', -41506=>'L', -41507=>'L', -41508=>'L', -41509=>'L', -41510=>'L', -41511=>'L', -41512=>'L', -41513=>'L', -41514=>'L', -41515=>'L', -41516=>'L', -41517=>'L', -41518=>'L', -41519=>'L', -41520=>'L', -41521=>'L', -41522=>'L', -41523=>'L', -41524=>'L', -41525=>'L', -41526=>'L', -41527=>'L', -41528=>'L', -41529=>'L', -41530=>'L', -41531=>'L', -41532=>'L', -41533=>'L', -41534=>'L', -41535=>'L', -41536=>'L', -41537=>'L', -41538=>'L', -41539=>'L', -41540=>'L', -41541=>'L', -41542=>'L', -41543=>'L', -41544=>'L', -41545=>'L', -41546=>'L', -41547=>'L', -41548=>'L', -41549=>'L', -41550=>'L', -41551=>'L', -41552=>'L', -41553=>'L', -41554=>'L', -41555=>'L', -41556=>'L', -41557=>'L', -41558=>'L', -41559=>'L', -41560=>'L', -41561=>'L', -41562=>'L', -41563=>'L', -41564=>'L', -41565=>'L', -41566=>'L', -41567=>'L', -41568=>'L', -41569=>'L', -41570=>'L', -41571=>'L', -41572=>'L', -41573=>'L', -41574=>'L', -41575=>'L', -41576=>'L', -41577=>'L', -41578=>'L', -41579=>'L', -41580=>'L', -41581=>'L', -41582=>'L', -41583=>'L', -41584=>'L', -41585=>'L', -41586=>'L', -41587=>'L', -41588=>'L', -41589=>'L', -41590=>'L', -41591=>'L', -41592=>'L', -41593=>'L', -41594=>'L', -41595=>'L', -41596=>'L', -41597=>'L', -41598=>'L', -41599=>'L', -41600=>'L', -41601=>'L', -41602=>'L', -41603=>'L', -41604=>'L', -41605=>'L', -41606=>'L', -41607=>'L', -41608=>'L', -41609=>'L', -41610=>'L', -41611=>'L', -41612=>'L', -41613=>'L', -41614=>'L', -41615=>'L', -41616=>'L', -41617=>'L', -41618=>'L', -41619=>'L', -41620=>'L', -41621=>'L', -41622=>'L', -41623=>'L', -41624=>'L', -41625=>'L', -41626=>'L', -41627=>'L', -41628=>'L', -41629=>'L', -41630=>'L', -41631=>'L', -41632=>'L', -41633=>'L', -41634=>'L', -41635=>'L', -41636=>'L', -41637=>'L', -41638=>'L', -41639=>'L', -41640=>'L', -41641=>'L', -41642=>'L', -41643=>'L', -41644=>'L', -41645=>'L', -41646=>'L', -41647=>'L', -41648=>'L', -41649=>'L', -41650=>'L', -41651=>'L', -41652=>'L', -41653=>'L', -41654=>'L', -41655=>'L', -41656=>'L', -41657=>'L', -41658=>'L', -41659=>'L', -41660=>'L', -41661=>'L', -41662=>'L', -41663=>'L', -41664=>'L', -41665=>'L', -41666=>'L', -41667=>'L', -41668=>'L', -41669=>'L', -41670=>'L', -41671=>'L', -41672=>'L', -41673=>'L', -41674=>'L', -41675=>'L', -41676=>'L', -41677=>'L', -41678=>'L', -41679=>'L', -41680=>'L', -41681=>'L', -41682=>'L', -41683=>'L', -41684=>'L', -41685=>'L', -41686=>'L', -41687=>'L', -41688=>'L', -41689=>'L', -41690=>'L', -41691=>'L', -41692=>'L', -41693=>'L', -41694=>'L', -41695=>'L', -41696=>'L', -41697=>'L', -41698=>'L', -41699=>'L', -41700=>'L', -41701=>'L', -41702=>'L', -41703=>'L', -41704=>'L', -41705=>'L', -41706=>'L', -41707=>'L', -41708=>'L', -41709=>'L', -41710=>'L', -41711=>'L', -41712=>'L', -41713=>'L', -41714=>'L', -41715=>'L', -41716=>'L', -41717=>'L', -41718=>'L', -41719=>'L', -41720=>'L', -41721=>'L', -41722=>'L', -41723=>'L', -41724=>'L', -41725=>'L', -41726=>'L', -41727=>'L', -41728=>'L', -41729=>'L', -41730=>'L', -41731=>'L', -41732=>'L', -41733=>'L', -41734=>'L', -41735=>'L', -41736=>'L', -41737=>'L', -41738=>'L', -41739=>'L', -41740=>'L', -41741=>'L', -41742=>'L', -41743=>'L', -41744=>'L', -41745=>'L', -41746=>'L', -41747=>'L', -41748=>'L', -41749=>'L', -41750=>'L', -41751=>'L', -41752=>'L', -41753=>'L', -41754=>'L', -41755=>'L', -41756=>'L', -41757=>'L', -41758=>'L', -41759=>'L', -41760=>'L', -41761=>'L', -41762=>'L', -41763=>'L', -41764=>'L', -41765=>'L', -41766=>'L', -41767=>'L', -41768=>'L', -41769=>'L', -41770=>'L', -41771=>'L', -41772=>'L', -41773=>'L', -41774=>'L', -41775=>'L', -41776=>'L', -41777=>'L', -41778=>'L', -41779=>'L', -41780=>'L', -41781=>'L', -41782=>'L', -41783=>'L', -41784=>'L', -41785=>'L', -41786=>'L', -41787=>'L', -41788=>'L', -41789=>'L', -41790=>'L', -41791=>'L', -41792=>'L', -41793=>'L', -41794=>'L', -41795=>'L', -41796=>'L', -41797=>'L', -41798=>'L', -41799=>'L', -41800=>'L', -41801=>'L', -41802=>'L', -41803=>'L', -41804=>'L', -41805=>'L', -41806=>'L', -41807=>'L', -41808=>'L', -41809=>'L', -41810=>'L', -41811=>'L', -41812=>'L', -41813=>'L', -41814=>'L', -41815=>'L', -41816=>'L', -41817=>'L', -41818=>'L', -41819=>'L', -41820=>'L', -41821=>'L', -41822=>'L', -41823=>'L', -41824=>'L', -41825=>'L', -41826=>'L', -41827=>'L', -41828=>'L', -41829=>'L', -41830=>'L', -41831=>'L', -41832=>'L', -41833=>'L', -41834=>'L', -41835=>'L', -41836=>'L', -41837=>'L', -41838=>'L', -41839=>'L', -41840=>'L', -41841=>'L', -41842=>'L', -41843=>'L', -41844=>'L', -41845=>'L', -41846=>'L', -41847=>'L', -41848=>'L', -41849=>'L', -41850=>'L', -41851=>'L', -41852=>'L', -41853=>'L', -41854=>'L', -41855=>'L', -41856=>'L', -41857=>'L', -41858=>'L', -41859=>'L', -41860=>'L', -41861=>'L', -41862=>'L', -41863=>'L', -41864=>'L', -41865=>'L', -41866=>'L', -41867=>'L', -41868=>'L', -41869=>'L', -41870=>'L', -41871=>'L', -41872=>'L', -41873=>'L', -41874=>'L', -41875=>'L', -41876=>'L', -41877=>'L', -41878=>'L', -41879=>'L', -41880=>'L', -41881=>'L', -41882=>'L', -41883=>'L', -41884=>'L', -41885=>'L', -41886=>'L', -41887=>'L', -41888=>'L', -41889=>'L', -41890=>'L', -41891=>'L', -41892=>'L', -41893=>'L', -41894=>'L', -41895=>'L', -41896=>'L', -41897=>'L', -41898=>'L', -41899=>'L', -41900=>'L', -41901=>'L', -41902=>'L', -41903=>'L', -41904=>'L', -41905=>'L', -41906=>'L', -41907=>'L', -41908=>'L', -41909=>'L', -41910=>'L', -41911=>'L', -41912=>'L', -41913=>'L', -41914=>'L', -41915=>'L', -41916=>'L', -41917=>'L', -41918=>'L', -41919=>'L', -41920=>'L', -41921=>'L', -41922=>'L', -41923=>'L', -41924=>'L', -41925=>'L', -41926=>'L', -41927=>'L', -41928=>'L', -41929=>'L', -41930=>'L', -41931=>'L', -41932=>'L', -41933=>'L', -41934=>'L', -41935=>'L', -41936=>'L', -41937=>'L', -41938=>'L', -41939=>'L', -41940=>'L', -41941=>'L', -41942=>'L', -41943=>'L', -41944=>'L', -41945=>'L', -41946=>'L', -41947=>'L', -41948=>'L', -41949=>'L', -41950=>'L', -41951=>'L', -41952=>'L', -41953=>'L', -41954=>'L', -41955=>'L', -41956=>'L', -41957=>'L', -41958=>'L', -41959=>'L', -41960=>'L', -41961=>'L', -41962=>'L', -41963=>'L', -41964=>'L', -41965=>'L', -41966=>'L', -41967=>'L', -41968=>'L', -41969=>'L', -41970=>'L', -41971=>'L', -41972=>'L', -41973=>'L', -41974=>'L', -41975=>'L', -41976=>'L', -41977=>'L', -41978=>'L', -41979=>'L', -41980=>'L', -41981=>'L', -41982=>'L', -41983=>'L', -41984=>'L', -41985=>'L', -41986=>'L', -41987=>'L', -41988=>'L', -41989=>'L', -41990=>'L', -41991=>'L', -41992=>'L', -41993=>'L', -41994=>'L', -41995=>'L', -41996=>'L', -41997=>'L', -41998=>'L', -41999=>'L', -42000=>'L', -42001=>'L', -42002=>'L', -42003=>'L', -42004=>'L', -42005=>'L', -42006=>'L', -42007=>'L', -42008=>'L', -42009=>'L', -42010=>'L', -42011=>'L', -42012=>'L', -42013=>'L', -42014=>'L', -42015=>'L', -42016=>'L', -42017=>'L', -42018=>'L', -42019=>'L', -42020=>'L', -42021=>'L', -42022=>'L', -42023=>'L', -42024=>'L', -42025=>'L', -42026=>'L', -42027=>'L', -42028=>'L', -42029=>'L', -42030=>'L', -42031=>'L', -42032=>'L', -42033=>'L', -42034=>'L', -42035=>'L', -42036=>'L', -42037=>'L', -42038=>'L', -42039=>'L', -42040=>'L', -42041=>'L', -42042=>'L', -42043=>'L', -42044=>'L', -42045=>'L', -42046=>'L', -42047=>'L', -42048=>'L', -42049=>'L', -42050=>'L', -42051=>'L', -42052=>'L', -42053=>'L', -42054=>'L', -42055=>'L', -42056=>'L', -42057=>'L', -42058=>'L', -42059=>'L', -42060=>'L', -42061=>'L', -42062=>'L', -42063=>'L', -42064=>'L', -42065=>'L', -42066=>'L', -42067=>'L', -42068=>'L', -42069=>'L', -42070=>'L', -42071=>'L', -42072=>'L', -42073=>'L', -42074=>'L', -42075=>'L', -42076=>'L', -42077=>'L', -42078=>'L', -42079=>'L', -42080=>'L', -42081=>'L', -42082=>'L', -42083=>'L', -42084=>'L', -42085=>'L', -42086=>'L', -42087=>'L', -42088=>'L', -42089=>'L', -42090=>'L', -42091=>'L', -42092=>'L', -42093=>'L', -42094=>'L', -42095=>'L', -42096=>'L', -42097=>'L', -42098=>'L', -42099=>'L', -42100=>'L', -42101=>'L', -42102=>'L', -42103=>'L', -42104=>'L', -42105=>'L', -42106=>'L', -42107=>'L', -42108=>'L', -42109=>'L', -42110=>'L', -42111=>'L', -42112=>'L', -42113=>'L', -42114=>'L', -42115=>'L', -42116=>'L', -42117=>'L', -42118=>'L', -42119=>'L', -42120=>'L', -42121=>'L', -42122=>'L', -42123=>'L', -42124=>'L', -42128=>'ON', -42129=>'ON', -42130=>'ON', -42131=>'ON', -42132=>'ON', -42133=>'ON', -42134=>'ON', -42135=>'ON', -42136=>'ON', -42137=>'ON', -42138=>'ON', -42139=>'ON', -42140=>'ON', -42141=>'ON', -42142=>'ON', -42143=>'ON', -42144=>'ON', -42145=>'ON', -42146=>'ON', -42147=>'ON', -42148=>'ON', -42149=>'ON', -42150=>'ON', -42151=>'ON', -42152=>'ON', -42153=>'ON', -42154=>'ON', -42155=>'ON', -42156=>'ON', -42157=>'ON', -42158=>'ON', -42159=>'ON', -42160=>'ON', -42161=>'ON', -42162=>'ON', -42163=>'ON', -42164=>'ON', -42165=>'ON', -42166=>'ON', -42167=>'ON', -42168=>'ON', -42169=>'ON', -42170=>'ON', -42171=>'ON', -42172=>'ON', -42173=>'ON', -42174=>'ON', -42175=>'ON', -42176=>'ON', -42177=>'ON', -42178=>'ON', -42179=>'ON', -42180=>'ON', -42181=>'ON', -42182=>'ON', -42752=>'ON', -42753=>'ON', -42754=>'ON', -42755=>'ON', -42756=>'ON', -42757=>'ON', -42758=>'ON', -42759=>'ON', -42760=>'ON', -42761=>'ON', -42762=>'ON', -42763=>'ON', -42764=>'ON', -42765=>'ON', -42766=>'ON', -42767=>'ON', -42768=>'ON', -42769=>'ON', -42770=>'ON', -42771=>'ON', -42772=>'ON', -42773=>'ON', -42774=>'ON', -42775=>'ON', -42776=>'ON', -42777=>'ON', -42778=>'ON', -42784=>'ON', -42785=>'ON', -43008=>'L', -43009=>'L', -43010=>'NSM', -43011=>'L', -43012=>'L', -43013=>'L', -43014=>'NSM', -43015=>'L', -43016=>'L', -43017=>'L', -43018=>'L', -43019=>'NSM', -43020=>'L', -43021=>'L', -43022=>'L', -43023=>'L', -43024=>'L', -43025=>'L', -43026=>'L', -43027=>'L', -43028=>'L', -43029=>'L', -43030=>'L', -43031=>'L', -43032=>'L', -43033=>'L', -43034=>'L', -43035=>'L', -43036=>'L', -43037=>'L', -43038=>'L', -43039=>'L', -43040=>'L', -43041=>'L', -43042=>'L', -43043=>'L', -43044=>'L', -43045=>'NSM', -43046=>'NSM', -43047=>'L', -43048=>'ON', -43049=>'ON', -43050=>'ON', -43051=>'ON', -43072=>'L', -43073=>'L', -43074=>'L', -43075=>'L', -43076=>'L', -43077=>'L', -43078=>'L', -43079=>'L', -43080=>'L', -43081=>'L', -43082=>'L', -43083=>'L', -43084=>'L', -43085=>'L', -43086=>'L', -43087=>'L', -43088=>'L', -43089=>'L', -43090=>'L', -43091=>'L', -43092=>'L', -43093=>'L', -43094=>'L', -43095=>'L', -43096=>'L', -43097=>'L', -43098=>'L', -43099=>'L', -43100=>'L', -43101=>'L', -43102=>'L', -43103=>'L', -43104=>'L', -43105=>'L', -43106=>'L', -43107=>'L', -43108=>'L', -43109=>'L', -43110=>'L', -43111=>'L', -43112=>'L', -43113=>'L', -43114=>'L', -43115=>'L', -43116=>'L', -43117=>'L', -43118=>'L', -43119=>'L', -43120=>'L', -43121=>'L', -43122=>'L', -43123=>'L', -43124=>'ON', -43125=>'ON', -43126=>'ON', -43127=>'ON', -44032=>'L', -55203=>'L', -55296=>'L', -56191=>'L', -56192=>'L', -56319=>'L', -56320=>'L', -57343=>'L', -57344=>'L', -63743=>'L', -63744=>'L', -63745=>'L', -63746=>'L', -63747=>'L', -63748=>'L', -63749=>'L', -63750=>'L', -63751=>'L', -63752=>'L', -63753=>'L', -63754=>'L', -63755=>'L', -63756=>'L', -63757=>'L', -63758=>'L', -63759=>'L', -63760=>'L', -63761=>'L', -63762=>'L', -63763=>'L', -63764=>'L', -63765=>'L', -63766=>'L', -63767=>'L', -63768=>'L', -63769=>'L', -63770=>'L', -63771=>'L', -63772=>'L', -63773=>'L', -63774=>'L', -63775=>'L', -63776=>'L', -63777=>'L', -63778=>'L', -63779=>'L', -63780=>'L', -63781=>'L', -63782=>'L', -63783=>'L', -63784=>'L', -63785=>'L', -63786=>'L', -63787=>'L', -63788=>'L', -63789=>'L', -63790=>'L', -63791=>'L', -63792=>'L', -63793=>'L', -63794=>'L', -63795=>'L', -63796=>'L', -63797=>'L', -63798=>'L', -63799=>'L', -63800=>'L', -63801=>'L', -63802=>'L', -63803=>'L', -63804=>'L', -63805=>'L', -63806=>'L', -63807=>'L', -63808=>'L', -63809=>'L', -63810=>'L', -63811=>'L', -63812=>'L', -63813=>'L', -63814=>'L', -63815=>'L', -63816=>'L', -63817=>'L', -63818=>'L', -63819=>'L', -63820=>'L', -63821=>'L', -63822=>'L', -63823=>'L', -63824=>'L', -63825=>'L', -63826=>'L', -63827=>'L', -63828=>'L', -63829=>'L', -63830=>'L', -63831=>'L', -63832=>'L', -63833=>'L', -63834=>'L', -63835=>'L', -63836=>'L', -63837=>'L', -63838=>'L', -63839=>'L', -63840=>'L', -63841=>'L', -63842=>'L', -63843=>'L', -63844=>'L', -63845=>'L', -63846=>'L', -63847=>'L', -63848=>'L', -63849=>'L', -63850=>'L', -63851=>'L', -63852=>'L', -63853=>'L', -63854=>'L', -63855=>'L', -63856=>'L', -63857=>'L', -63858=>'L', -63859=>'L', -63860=>'L', -63861=>'L', -63862=>'L', -63863=>'L', -63864=>'L', -63865=>'L', -63866=>'L', -63867=>'L', -63868=>'L', -63869=>'L', -63870=>'L', -63871=>'L', -63872=>'L', -63873=>'L', -63874=>'L', -63875=>'L', -63876=>'L', -63877=>'L', -63878=>'L', -63879=>'L', -63880=>'L', -63881=>'L', -63882=>'L', -63883=>'L', -63884=>'L', -63885=>'L', -63886=>'L', -63887=>'L', -63888=>'L', -63889=>'L', -63890=>'L', -63891=>'L', -63892=>'L', -63893=>'L', -63894=>'L', -63895=>'L', -63896=>'L', -63897=>'L', -63898=>'L', -63899=>'L', -63900=>'L', -63901=>'L', -63902=>'L', -63903=>'L', -63904=>'L', -63905=>'L', -63906=>'L', -63907=>'L', -63908=>'L', -63909=>'L', -63910=>'L', -63911=>'L', -63912=>'L', -63913=>'L', -63914=>'L', -63915=>'L', -63916=>'L', -63917=>'L', -63918=>'L', -63919=>'L', -63920=>'L', -63921=>'L', -63922=>'L', -63923=>'L', -63924=>'L', -63925=>'L', -63926=>'L', -63927=>'L', -63928=>'L', -63929=>'L', -63930=>'L', -63931=>'L', -63932=>'L', -63933=>'L', -63934=>'L', -63935=>'L', -63936=>'L', -63937=>'L', -63938=>'L', -63939=>'L', -63940=>'L', -63941=>'L', -63942=>'L', -63943=>'L', -63944=>'L', -63945=>'L', -63946=>'L', -63947=>'L', -63948=>'L', -63949=>'L', -63950=>'L', -63951=>'L', -63952=>'L', -63953=>'L', -63954=>'L', -63955=>'L', -63956=>'L', -63957=>'L', -63958=>'L', -63959=>'L', -63960=>'L', -63961=>'L', -63962=>'L', -63963=>'L', -63964=>'L', -63965=>'L', -63966=>'L', -63967=>'L', -63968=>'L', -63969=>'L', -63970=>'L', -63971=>'L', -63972=>'L', -63973=>'L', -63974=>'L', -63975=>'L', -63976=>'L', -63977=>'L', -63978=>'L', -63979=>'L', -63980=>'L', -63981=>'L', -63982=>'L', -63983=>'L', -63984=>'L', -63985=>'L', -63986=>'L', -63987=>'L', -63988=>'L', -63989=>'L', -63990=>'L', -63991=>'L', -63992=>'L', -63993=>'L', -63994=>'L', -63995=>'L', -63996=>'L', -63997=>'L', -63998=>'L', -63999=>'L', -64000=>'L', -64001=>'L', -64002=>'L', -64003=>'L', -64004=>'L', -64005=>'L', -64006=>'L', -64007=>'L', -64008=>'L', -64009=>'L', -64010=>'L', -64011=>'L', -64012=>'L', -64013=>'L', -64014=>'L', -64015=>'L', -64016=>'L', -64017=>'L', -64018=>'L', -64019=>'L', -64020=>'L', -64021=>'L', -64022=>'L', -64023=>'L', -64024=>'L', -64025=>'L', -64026=>'L', -64027=>'L', -64028=>'L', -64029=>'L', -64030=>'L', -64031=>'L', -64032=>'L', -64033=>'L', -64034=>'L', -64035=>'L', -64036=>'L', -64037=>'L', -64038=>'L', -64039=>'L', -64040=>'L', -64041=>'L', -64042=>'L', -64043=>'L', -64044=>'L', -64045=>'L', -64048=>'L', -64049=>'L', -64050=>'L', -64051=>'L', -64052=>'L', -64053=>'L', -64054=>'L', -64055=>'L', -64056=>'L', -64057=>'L', -64058=>'L', -64059=>'L', -64060=>'L', -64061=>'L', -64062=>'L', -64063=>'L', -64064=>'L', -64065=>'L', -64066=>'L', -64067=>'L', -64068=>'L', -64069=>'L', -64070=>'L', -64071=>'L', -64072=>'L', -64073=>'L', -64074=>'L', -64075=>'L', -64076=>'L', -64077=>'L', -64078=>'L', -64079=>'L', -64080=>'L', -64081=>'L', -64082=>'L', -64083=>'L', -64084=>'L', -64085=>'L', -64086=>'L', -64087=>'L', -64088=>'L', -64089=>'L', -64090=>'L', -64091=>'L', -64092=>'L', -64093=>'L', -64094=>'L', -64095=>'L', -64096=>'L', -64097=>'L', -64098=>'L', -64099=>'L', -64100=>'L', -64101=>'L', -64102=>'L', -64103=>'L', -64104=>'L', -64105=>'L', -64106=>'L', -64112=>'L', -64113=>'L', -64114=>'L', -64115=>'L', -64116=>'L', -64117=>'L', -64118=>'L', -64119=>'L', -64120=>'L', -64121=>'L', -64122=>'L', -64123=>'L', -64124=>'L', -64125=>'L', -64126=>'L', -64127=>'L', -64128=>'L', -64129=>'L', -64130=>'L', -64131=>'L', -64132=>'L', -64133=>'L', -64134=>'L', -64135=>'L', -64136=>'L', -64137=>'L', -64138=>'L', -64139=>'L', -64140=>'L', -64141=>'L', -64142=>'L', -64143=>'L', -64144=>'L', -64145=>'L', -64146=>'L', -64147=>'L', -64148=>'L', -64149=>'L', -64150=>'L', -64151=>'L', -64152=>'L', -64153=>'L', -64154=>'L', -64155=>'L', -64156=>'L', -64157=>'L', -64158=>'L', -64159=>'L', -64160=>'L', -64161=>'L', -64162=>'L', -64163=>'L', -64164=>'L', -64165=>'L', -64166=>'L', -64167=>'L', -64168=>'L', -64169=>'L', -64170=>'L', -64171=>'L', -64172=>'L', -64173=>'L', -64174=>'L', -64175=>'L', -64176=>'L', -64177=>'L', -64178=>'L', -64179=>'L', -64180=>'L', -64181=>'L', -64182=>'L', -64183=>'L', -64184=>'L', -64185=>'L', -64186=>'L', -64187=>'L', -64188=>'L', -64189=>'L', -64190=>'L', -64191=>'L', -64192=>'L', -64193=>'L', -64194=>'L', -64195=>'L', -64196=>'L', -64197=>'L', -64198=>'L', -64199=>'L', -64200=>'L', -64201=>'L', -64202=>'L', -64203=>'L', -64204=>'L', -64205=>'L', -64206=>'L', -64207=>'L', -64208=>'L', -64209=>'L', -64210=>'L', -64211=>'L', -64212=>'L', -64213=>'L', -64214=>'L', -64215=>'L', -64216=>'L', -64217=>'L', -64256=>'L', -64257=>'L', -64258=>'L', -64259=>'L', -64260=>'L', -64261=>'L', -64262=>'L', -64275=>'L', -64276=>'L', -64277=>'L', -64278=>'L', -64279=>'L', -64285=>'R', -64286=>'NSM', -64287=>'R', -64288=>'R', -64289=>'R', -64290=>'R', -64291=>'R', -64292=>'R', -64293=>'R', -64294=>'R', -64295=>'R', -64296=>'R', -64297=>'ES', -64298=>'R', -64299=>'R', -64300=>'R', -64301=>'R', -64302=>'R', -64303=>'R', -64304=>'R', -64305=>'R', -64306=>'R', -64307=>'R', -64308=>'R', -64309=>'R', -64310=>'R', -64312=>'R', -64313=>'R', -64314=>'R', -64315=>'R', -64316=>'R', -64318=>'R', -64320=>'R', -64321=>'R', -64323=>'R', -64324=>'R', -64326=>'R', -64327=>'R', -64328=>'R', -64329=>'R', -64330=>'R', -64331=>'R', -64332=>'R', -64333=>'R', -64334=>'R', -64335=>'R', -64336=>'AL', -64337=>'AL', -64338=>'AL', -64339=>'AL', -64340=>'AL', -64341=>'AL', -64342=>'AL', -64343=>'AL', -64344=>'AL', -64345=>'AL', -64346=>'AL', -64347=>'AL', -64348=>'AL', -64349=>'AL', -64350=>'AL', -64351=>'AL', -64352=>'AL', -64353=>'AL', -64354=>'AL', -64355=>'AL', -64356=>'AL', -64357=>'AL', -64358=>'AL', -64359=>'AL', -64360=>'AL', -64361=>'AL', -64362=>'AL', -64363=>'AL', -64364=>'AL', -64365=>'AL', -64366=>'AL', -64367=>'AL', -64368=>'AL', -64369=>'AL', -64370=>'AL', -64371=>'AL', -64372=>'AL', -64373=>'AL', -64374=>'AL', -64375=>'AL', -64376=>'AL', -64377=>'AL', -64378=>'AL', -64379=>'AL', -64380=>'AL', -64381=>'AL', -64382=>'AL', -64383=>'AL', -64384=>'AL', -64385=>'AL', -64386=>'AL', -64387=>'AL', -64388=>'AL', -64389=>'AL', -64390=>'AL', -64391=>'AL', -64392=>'AL', -64393=>'AL', -64394=>'AL', -64395=>'AL', -64396=>'AL', -64397=>'AL', -64398=>'AL', -64399=>'AL', -64400=>'AL', -64401=>'AL', -64402=>'AL', -64403=>'AL', -64404=>'AL', -64405=>'AL', -64406=>'AL', -64407=>'AL', -64408=>'AL', -64409=>'AL', -64410=>'AL', -64411=>'AL', -64412=>'AL', -64413=>'AL', -64414=>'AL', -64415=>'AL', -64416=>'AL', -64417=>'AL', -64418=>'AL', -64419=>'AL', -64420=>'AL', -64421=>'AL', -64422=>'AL', -64423=>'AL', -64424=>'AL', -64425=>'AL', -64426=>'AL', -64427=>'AL', -64428=>'AL', -64429=>'AL', -64430=>'AL', -64431=>'AL', -64432=>'AL', -64433=>'AL', -64467=>'AL', -64468=>'AL', -64469=>'AL', -64470=>'AL', -64471=>'AL', -64472=>'AL', -64473=>'AL', -64474=>'AL', -64475=>'AL', -64476=>'AL', -64477=>'AL', -64478=>'AL', -64479=>'AL', -64480=>'AL', -64481=>'AL', -64482=>'AL', -64483=>'AL', -64484=>'AL', -64485=>'AL', -64486=>'AL', -64487=>'AL', -64488=>'AL', -64489=>'AL', -64490=>'AL', -64491=>'AL', -64492=>'AL', -64493=>'AL', -64494=>'AL', -64495=>'AL', -64496=>'AL', -64497=>'AL', -64498=>'AL', -64499=>'AL', -64500=>'AL', -64501=>'AL', -64502=>'AL', -64503=>'AL', -64504=>'AL', -64505=>'AL', -64506=>'AL', -64507=>'AL', -64508=>'AL', -64509=>'AL', -64510=>'AL', -64511=>'AL', -64512=>'AL', -64513=>'AL', -64514=>'AL', -64515=>'AL', -64516=>'AL', -64517=>'AL', -64518=>'AL', -64519=>'AL', -64520=>'AL', -64521=>'AL', -64522=>'AL', -64523=>'AL', -64524=>'AL', -64525=>'AL', -64526=>'AL', -64527=>'AL', -64528=>'AL', -64529=>'AL', -64530=>'AL', -64531=>'AL', -64532=>'AL', -64533=>'AL', -64534=>'AL', -64535=>'AL', -64536=>'AL', -64537=>'AL', -64538=>'AL', -64539=>'AL', -64540=>'AL', -64541=>'AL', -64542=>'AL', -64543=>'AL', -64544=>'AL', -64545=>'AL', -64546=>'AL', -64547=>'AL', -64548=>'AL', -64549=>'AL', -64550=>'AL', -64551=>'AL', -64552=>'AL', -64553=>'AL', -64554=>'AL', -64555=>'AL', -64556=>'AL', -64557=>'AL', -64558=>'AL', -64559=>'AL', -64560=>'AL', -64561=>'AL', -64562=>'AL', -64563=>'AL', -64564=>'AL', -64565=>'AL', -64566=>'AL', -64567=>'AL', -64568=>'AL', -64569=>'AL', -64570=>'AL', -64571=>'AL', -64572=>'AL', -64573=>'AL', -64574=>'AL', -64575=>'AL', -64576=>'AL', -64577=>'AL', -64578=>'AL', -64579=>'AL', -64580=>'AL', -64581=>'AL', -64582=>'AL', -64583=>'AL', -64584=>'AL', -64585=>'AL', -64586=>'AL', -64587=>'AL', -64588=>'AL', -64589=>'AL', -64590=>'AL', -64591=>'AL', -64592=>'AL', -64593=>'AL', -64594=>'AL', -64595=>'AL', -64596=>'AL', -64597=>'AL', -64598=>'AL', -64599=>'AL', -64600=>'AL', -64601=>'AL', -64602=>'AL', -64603=>'AL', -64604=>'AL', -64605=>'AL', -64606=>'AL', -64607=>'AL', -64608=>'AL', -64609=>'AL', -64610=>'AL', -64611=>'AL', -64612=>'AL', -64613=>'AL', -64614=>'AL', -64615=>'AL', -64616=>'AL', -64617=>'AL', -64618=>'AL', -64619=>'AL', -64620=>'AL', -64621=>'AL', -64622=>'AL', -64623=>'AL', -64624=>'AL', -64625=>'AL', -64626=>'AL', -64627=>'AL', -64628=>'AL', -64629=>'AL', -64630=>'AL', -64631=>'AL', -64632=>'AL', -64633=>'AL', -64634=>'AL', -64635=>'AL', -64636=>'AL', -64637=>'AL', -64638=>'AL', -64639=>'AL', -64640=>'AL', -64641=>'AL', -64642=>'AL', -64643=>'AL', -64644=>'AL', -64645=>'AL', -64646=>'AL', -64647=>'AL', -64648=>'AL', -64649=>'AL', -64650=>'AL', -64651=>'AL', -64652=>'AL', -64653=>'AL', -64654=>'AL', -64655=>'AL', -64656=>'AL', -64657=>'AL', -64658=>'AL', -64659=>'AL', -64660=>'AL', -64661=>'AL', -64662=>'AL', -64663=>'AL', -64664=>'AL', -64665=>'AL', -64666=>'AL', -64667=>'AL', -64668=>'AL', -64669=>'AL', -64670=>'AL', -64671=>'AL', -64672=>'AL', -64673=>'AL', -64674=>'AL', -64675=>'AL', -64676=>'AL', -64677=>'AL', -64678=>'AL', -64679=>'AL', -64680=>'AL', -64681=>'AL', -64682=>'AL', -64683=>'AL', -64684=>'AL', -64685=>'AL', -64686=>'AL', -64687=>'AL', -64688=>'AL', -64689=>'AL', -64690=>'AL', -64691=>'AL', -64692=>'AL', -64693=>'AL', -64694=>'AL', -64695=>'AL', -64696=>'AL', -64697=>'AL', -64698=>'AL', -64699=>'AL', -64700=>'AL', -64701=>'AL', -64702=>'AL', -64703=>'AL', -64704=>'AL', -64705=>'AL', -64706=>'AL', -64707=>'AL', -64708=>'AL', -64709=>'AL', -64710=>'AL', -64711=>'AL', -64712=>'AL', -64713=>'AL', -64714=>'AL', -64715=>'AL', -64716=>'AL', -64717=>'AL', -64718=>'AL', -64719=>'AL', -64720=>'AL', -64721=>'AL', -64722=>'AL', -64723=>'AL', -64724=>'AL', -64725=>'AL', -64726=>'AL', -64727=>'AL', -64728=>'AL', -64729=>'AL', -64730=>'AL', -64731=>'AL', -64732=>'AL', -64733=>'AL', -64734=>'AL', -64735=>'AL', -64736=>'AL', -64737=>'AL', -64738=>'AL', -64739=>'AL', -64740=>'AL', -64741=>'AL', -64742=>'AL', -64743=>'AL', -64744=>'AL', -64745=>'AL', -64746=>'AL', -64747=>'AL', -64748=>'AL', -64749=>'AL', -64750=>'AL', -64751=>'AL', -64752=>'AL', -64753=>'AL', -64754=>'AL', -64755=>'AL', -64756=>'AL', -64757=>'AL', -64758=>'AL', -64759=>'AL', -64760=>'AL', -64761=>'AL', -64762=>'AL', -64763=>'AL', -64764=>'AL', -64765=>'AL', -64766=>'AL', -64767=>'AL', -64768=>'AL', -64769=>'AL', -64770=>'AL', -64771=>'AL', -64772=>'AL', -64773=>'AL', -64774=>'AL', -64775=>'AL', -64776=>'AL', -64777=>'AL', -64778=>'AL', -64779=>'AL', -64780=>'AL', -64781=>'AL', -64782=>'AL', -64783=>'AL', -64784=>'AL', -64785=>'AL', -64786=>'AL', -64787=>'AL', -64788=>'AL', -64789=>'AL', -64790=>'AL', -64791=>'AL', -64792=>'AL', -64793=>'AL', -64794=>'AL', -64795=>'AL', -64796=>'AL', -64797=>'AL', -64798=>'AL', -64799=>'AL', -64800=>'AL', -64801=>'AL', -64802=>'AL', -64803=>'AL', -64804=>'AL', -64805=>'AL', -64806=>'AL', -64807=>'AL', -64808=>'AL', -64809=>'AL', -64810=>'AL', -64811=>'AL', -64812=>'AL', -64813=>'AL', -64814=>'AL', -64815=>'AL', -64816=>'AL', -64817=>'AL', -64818=>'AL', -64819=>'AL', -64820=>'AL', -64821=>'AL', -64822=>'AL', -64823=>'AL', -64824=>'AL', -64825=>'AL', -64826=>'AL', -64827=>'AL', -64828=>'AL', -64829=>'AL', -64830=>'ON', -64831=>'ON', -64848=>'AL', -64849=>'AL', -64850=>'AL', -64851=>'AL', -64852=>'AL', -64853=>'AL', -64854=>'AL', -64855=>'AL', -64856=>'AL', -64857=>'AL', -64858=>'AL', -64859=>'AL', -64860=>'AL', -64861=>'AL', -64862=>'AL', -64863=>'AL', -64864=>'AL', -64865=>'AL', -64866=>'AL', -64867=>'AL', -64868=>'AL', -64869=>'AL', -64870=>'AL', -64871=>'AL', -64872=>'AL', -64873=>'AL', -64874=>'AL', -64875=>'AL', -64876=>'AL', -64877=>'AL', -64878=>'AL', -64879=>'AL', -64880=>'AL', -64881=>'AL', -64882=>'AL', -64883=>'AL', -64884=>'AL', -64885=>'AL', -64886=>'AL', -64887=>'AL', -64888=>'AL', -64889=>'AL', -64890=>'AL', -64891=>'AL', -64892=>'AL', -64893=>'AL', -64894=>'AL', -64895=>'AL', -64896=>'AL', -64897=>'AL', -64898=>'AL', -64899=>'AL', -64900=>'AL', -64901=>'AL', -64902=>'AL', -64903=>'AL', -64904=>'AL', -64905=>'AL', -64906=>'AL', -64907=>'AL', -64908=>'AL', -64909=>'AL', -64910=>'AL', -64911=>'AL', -64914=>'AL', -64915=>'AL', -64916=>'AL', -64917=>'AL', -64918=>'AL', -64919=>'AL', -64920=>'AL', -64921=>'AL', -64922=>'AL', -64923=>'AL', -64924=>'AL', -64925=>'AL', -64926=>'AL', -64927=>'AL', -64928=>'AL', -64929=>'AL', -64930=>'AL', -64931=>'AL', -64932=>'AL', -64933=>'AL', -64934=>'AL', -64935=>'AL', -64936=>'AL', -64937=>'AL', -64938=>'AL', -64939=>'AL', -64940=>'AL', -64941=>'AL', -64942=>'AL', -64943=>'AL', -64944=>'AL', -64945=>'AL', -64946=>'AL', -64947=>'AL', -64948=>'AL', -64949=>'AL', -64950=>'AL', -64951=>'AL', -64952=>'AL', -64953=>'AL', -64954=>'AL', -64955=>'AL', -64956=>'AL', -64957=>'AL', -64958=>'AL', -64959=>'AL', -64960=>'AL', -64961=>'AL', -64962=>'AL', -64963=>'AL', -64964=>'AL', -64965=>'AL', -64966=>'AL', -64967=>'AL', -65008=>'AL', -65009=>'AL', -65010=>'AL', -65011=>'AL', -65012=>'AL', -65013=>'AL', -65014=>'AL', -65015=>'AL', -65016=>'AL', -65017=>'AL', -65018=>'AL', -65019=>'AL', -65020=>'AL', -65021=>'ON', -65024=>'NSM', -65025=>'NSM', -65026=>'NSM', -65027=>'NSM', -65028=>'NSM', -65029=>'NSM', -65030=>'NSM', -65031=>'NSM', -65032=>'NSM', -65033=>'NSM', -65034=>'NSM', -65035=>'NSM', -65036=>'NSM', -65037=>'NSM', -65038=>'NSM', -65039=>'NSM', -65040=>'ON', -65041=>'ON', -65042=>'ON', -65043=>'ON', -65044=>'ON', -65045=>'ON', -65046=>'ON', -65047=>'ON', -65048=>'ON', -65049=>'ON', -65056=>'NSM', -65057=>'NSM', -65058=>'NSM', -65059=>'NSM', -65072=>'ON', -65073=>'ON', -65074=>'ON', -65075=>'ON', -65076=>'ON', -65077=>'ON', -65078=>'ON', -65079=>'ON', -65080=>'ON', -65081=>'ON', -65082=>'ON', -65083=>'ON', -65084=>'ON', -65085=>'ON', -65086=>'ON', -65087=>'ON', -65088=>'ON', -65089=>'ON', -65090=>'ON', -65091=>'ON', -65092=>'ON', -65093=>'ON', -65094=>'ON', -65095=>'ON', -65096=>'ON', -65097=>'ON', -65098=>'ON', -65099=>'ON', -65100=>'ON', -65101=>'ON', -65102=>'ON', -65103=>'ON', -65104=>'CS', -65105=>'ON', -65106=>'CS', -65108=>'ON', -65109=>'CS', -65110=>'ON', -65111=>'ON', -65112=>'ON', -65113=>'ON', -65114=>'ON', -65115=>'ON', -65116=>'ON', -65117=>'ON', -65118=>'ON', -65119=>'ET', -65120=>'ON', -65121=>'ON', -65122=>'ES', -65123=>'ES', -65124=>'ON', -65125=>'ON', -65126=>'ON', -65128=>'ON', -65129=>'ET', -65130=>'ET', -65131=>'ON', -65136=>'AL', -65137=>'AL', -65138=>'AL', -65139=>'AL', -65140=>'AL', -65142=>'AL', -65143=>'AL', -65144=>'AL', -65145=>'AL', -65146=>'AL', -65147=>'AL', -65148=>'AL', -65149=>'AL', -65150=>'AL', -65151=>'AL', -65152=>'AL', -65153=>'AL', -65154=>'AL', -65155=>'AL', -65156=>'AL', -65157=>'AL', -65158=>'AL', -65159=>'AL', -65160=>'AL', -65161=>'AL', -65162=>'AL', -65163=>'AL', -65164=>'AL', -65165=>'AL', -65166=>'AL', -65167=>'AL', -65168=>'AL', -65169=>'AL', -65170=>'AL', -65171=>'AL', -65172=>'AL', -65173=>'AL', -65174=>'AL', -65175=>'AL', -65176=>'AL', -65177=>'AL', -65178=>'AL', -65179=>'AL', -65180=>'AL', -65181=>'AL', -65182=>'AL', -65183=>'AL', -65184=>'AL', -65185=>'AL', -65186=>'AL', -65187=>'AL', -65188=>'AL', -65189=>'AL', -65190=>'AL', -65191=>'AL', -65192=>'AL', -65193=>'AL', -65194=>'AL', -65195=>'AL', -65196=>'AL', -65197=>'AL', -65198=>'AL', -65199=>'AL', -65200=>'AL', -65201=>'AL', -65202=>'AL', -65203=>'AL', -65204=>'AL', -65205=>'AL', -65206=>'AL', -65207=>'AL', -65208=>'AL', -65209=>'AL', -65210=>'AL', -65211=>'AL', -65212=>'AL', -65213=>'AL', -65214=>'AL', -65215=>'AL', -65216=>'AL', -65217=>'AL', -65218=>'AL', -65219=>'AL', -65220=>'AL', -65221=>'AL', -65222=>'AL', -65223=>'AL', -65224=>'AL', -65225=>'AL', -65226=>'AL', -65227=>'AL', -65228=>'AL', -65229=>'AL', -65230=>'AL', -65231=>'AL', -65232=>'AL', -65233=>'AL', -65234=>'AL', -65235=>'AL', -65236=>'AL', -65237=>'AL', -65238=>'AL', -65239=>'AL', -65240=>'AL', -65241=>'AL', -65242=>'AL', -65243=>'AL', -65244=>'AL', -65245=>'AL', -65246=>'AL', -65247=>'AL', -65248=>'AL', -65249=>'AL', -65250=>'AL', -65251=>'AL', -65252=>'AL', -65253=>'AL', -65254=>'AL', -65255=>'AL', -65256=>'AL', -65257=>'AL', -65258=>'AL', -65259=>'AL', -65260=>'AL', -65261=>'AL', -65262=>'AL', -65263=>'AL', -65264=>'AL', -65265=>'AL', -65266=>'AL', -65267=>'AL', -65268=>'AL', -65269=>'AL', -65270=>'AL', -65271=>'AL', -65272=>'AL', -65273=>'AL', -65274=>'AL', -65275=>'AL', -65276=>'AL', -65279=>'BN', -65281=>'ON', -65282=>'ON', -65283=>'ET', -65284=>'ET', -65285=>'ET', -65286=>'ON', -65287=>'ON', -65288=>'ON', -65289=>'ON', -65290=>'ON', -65291=>'ES', -65292=>'CS', -65293=>'ES', -65294=>'CS', -65295=>'CS', -65296=>'EN', -65297=>'EN', -65298=>'EN', -65299=>'EN', -65300=>'EN', -65301=>'EN', -65302=>'EN', -65303=>'EN', -65304=>'EN', -65305=>'EN', -65306=>'CS', -65307=>'ON', -65308=>'ON', -65309=>'ON', -65310=>'ON', -65311=>'ON', -65312=>'ON', -65313=>'L', -65314=>'L', -65315=>'L', -65316=>'L', -65317=>'L', -65318=>'L', -65319=>'L', -65320=>'L', -65321=>'L', -65322=>'L', -65323=>'L', -65324=>'L', -65325=>'L', -65326=>'L', -65327=>'L', -65328=>'L', -65329=>'L', -65330=>'L', -65331=>'L', -65332=>'L', -65333=>'L', -65334=>'L', -65335=>'L', -65336=>'L', -65337=>'L', -65338=>'L', -65339=>'ON', -65340=>'ON', -65341=>'ON', -65342=>'ON', -65343=>'ON', -65344=>'ON', -65345=>'L', -65346=>'L', -65347=>'L', -65348=>'L', -65349=>'L', -65350=>'L', -65351=>'L', -65352=>'L', -65353=>'L', -65354=>'L', -65355=>'L', -65356=>'L', -65357=>'L', -65358=>'L', -65359=>'L', -65360=>'L', -65361=>'L', -65362=>'L', -65363=>'L', -65364=>'L', -65365=>'L', -65366=>'L', -65367=>'L', -65368=>'L', -65369=>'L', -65370=>'L', -65371=>'ON', -65372=>'ON', -65373=>'ON', -65374=>'ON', -65375=>'ON', -65376=>'ON', -65377=>'ON', -65378=>'ON', -65379=>'ON', -65380=>'ON', -65381=>'ON', -65382=>'L', -65383=>'L', -65384=>'L', -65385=>'L', -65386=>'L', -65387=>'L', -65388=>'L', -65389=>'L', -65390=>'L', -65391=>'L', -65392=>'L', -65393=>'L', -65394=>'L', -65395=>'L', -65396=>'L', -65397=>'L', -65398=>'L', -65399=>'L', -65400=>'L', -65401=>'L', -65402=>'L', -65403=>'L', -65404=>'L', -65405=>'L', -65406=>'L', -65407=>'L', -65408=>'L', -65409=>'L', -65410=>'L', -65411=>'L', -65412=>'L', -65413=>'L', -65414=>'L', -65415=>'L', -65416=>'L', -65417=>'L', -65418=>'L', -65419=>'L', -65420=>'L', -65421=>'L', -65422=>'L', -65423=>'L', -65424=>'L', -65425=>'L', -65426=>'L', -65427=>'L', -65428=>'L', -65429=>'L', -65430=>'L', -65431=>'L', -65432=>'L', -65433=>'L', -65434=>'L', -65435=>'L', -65436=>'L', -65437=>'L', -65438=>'L', -65439=>'L', -65440=>'L', -65441=>'L', -65442=>'L', -65443=>'L', -65444=>'L', -65445=>'L', -65446=>'L', -65447=>'L', -65448=>'L', -65449=>'L', -65450=>'L', -65451=>'L', -65452=>'L', -65453=>'L', -65454=>'L', -65455=>'L', -65456=>'L', -65457=>'L', -65458=>'L', -65459=>'L', -65460=>'L', -65461=>'L', -65462=>'L', -65463=>'L', -65464=>'L', -65465=>'L', -65466=>'L', -65467=>'L', -65468=>'L', -65469=>'L', -65470=>'L', -65474=>'L', -65475=>'L', -65476=>'L', -65477=>'L', -65478=>'L', -65479=>'L', -65482=>'L', -65483=>'L', -65484=>'L', -65485=>'L', -65486=>'L', -65487=>'L', -65490=>'L', -65491=>'L', -65492=>'L', -65493=>'L', -65494=>'L', -65495=>'L', -65498=>'L', -65499=>'L', -65500=>'L', -65504=>'ET', -65505=>'ET', -65506=>'ON', -65507=>'ON', -65508=>'ON', -65509=>'ET', -65510=>'ET', -65512=>'ON', -65513=>'ON', -65514=>'ON', -65515=>'ON', -65516=>'ON', -65517=>'ON', -65518=>'ON', -65529=>'ON', -65530=>'ON', -65531=>'ON', -65532=>'ON', -65533=>'ON', -65536=>'L', -65537=>'L', -65538=>'L', -65539=>'L', -65540=>'L', -65541=>'L', -65542=>'L', -65543=>'L', -65544=>'L', -65545=>'L', -65546=>'L', -65547=>'L', -65549=>'L', -65550=>'L', -65551=>'L', -65552=>'L', -65553=>'L', -65554=>'L', -65555=>'L', -65556=>'L', -65557=>'L', -65558=>'L', -65559=>'L', -65560=>'L', -65561=>'L', -65562=>'L', -65563=>'L', -65564=>'L', -65565=>'L', -65566=>'L', -65567=>'L', -65568=>'L', -65569=>'L', -65570=>'L', -65571=>'L', -65572=>'L', -65573=>'L', -65574=>'L', -65576=>'L', -65577=>'L', -65578=>'L', -65579=>'L', -65580=>'L', -65581=>'L', -65582=>'L', -65583=>'L', -65584=>'L', -65585=>'L', -65586=>'L', -65587=>'L', -65588=>'L', -65589=>'L', -65590=>'L', -65591=>'L', -65592=>'L', -65593=>'L', -65594=>'L', -65596=>'L', -65597=>'L', -65599=>'L', -65600=>'L', -65601=>'L', -65602=>'L', -65603=>'L', -65604=>'L', -65605=>'L', -65606=>'L', -65607=>'L', -65608=>'L', -65609=>'L', -65610=>'L', -65611=>'L', -65612=>'L', -65613=>'L', -65616=>'L', -65617=>'L', -65618=>'L', -65619=>'L', -65620=>'L', -65621=>'L', -65622=>'L', -65623=>'L', -65624=>'L', -65625=>'L', -65626=>'L', -65627=>'L', -65628=>'L', -65629=>'L', -65664=>'L', -65665=>'L', -65666=>'L', -65667=>'L', -65668=>'L', -65669=>'L', -65670=>'L', -65671=>'L', -65672=>'L', -65673=>'L', -65674=>'L', -65675=>'L', -65676=>'L', -65677=>'L', -65678=>'L', -65679=>'L', -65680=>'L', -65681=>'L', -65682=>'L', -65683=>'L', -65684=>'L', -65685=>'L', -65686=>'L', -65687=>'L', -65688=>'L', -65689=>'L', -65690=>'L', -65691=>'L', -65692=>'L', -65693=>'L', -65694=>'L', -65695=>'L', -65696=>'L', -65697=>'L', -65698=>'L', -65699=>'L', -65700=>'L', -65701=>'L', -65702=>'L', -65703=>'L', -65704=>'L', -65705=>'L', -65706=>'L', -65707=>'L', -65708=>'L', -65709=>'L', -65710=>'L', -65711=>'L', -65712=>'L', -65713=>'L', -65714=>'L', -65715=>'L', -65716=>'L', -65717=>'L', -65718=>'L', -65719=>'L', -65720=>'L', -65721=>'L', -65722=>'L', -65723=>'L', -65724=>'L', -65725=>'L', -65726=>'L', -65727=>'L', -65728=>'L', -65729=>'L', -65730=>'L', -65731=>'L', -65732=>'L', -65733=>'L', -65734=>'L', -65735=>'L', -65736=>'L', -65737=>'L', -65738=>'L', -65739=>'L', -65740=>'L', -65741=>'L', -65742=>'L', -65743=>'L', -65744=>'L', -65745=>'L', -65746=>'L', -65747=>'L', -65748=>'L', -65749=>'L', -65750=>'L', -65751=>'L', -65752=>'L', -65753=>'L', -65754=>'L', -65755=>'L', -65756=>'L', -65757=>'L', -65758=>'L', -65759=>'L', -65760=>'L', -65761=>'L', -65762=>'L', -65763=>'L', -65764=>'L', -65765=>'L', -65766=>'L', -65767=>'L', -65768=>'L', -65769=>'L', -65770=>'L', -65771=>'L', -65772=>'L', -65773=>'L', -65774=>'L', -65775=>'L', -65776=>'L', -65777=>'L', -65778=>'L', -65779=>'L', -65780=>'L', -65781=>'L', -65782=>'L', -65783=>'L', -65784=>'L', -65785=>'L', -65786=>'L', -65792=>'L', -65793=>'ON', -65794=>'L', -65799=>'L', -65800=>'L', -65801=>'L', -65802=>'L', -65803=>'L', -65804=>'L', -65805=>'L', -65806=>'L', -65807=>'L', -65808=>'L', -65809=>'L', -65810=>'L', -65811=>'L', -65812=>'L', -65813=>'L', -65814=>'L', -65815=>'L', -65816=>'L', -65817=>'L', -65818=>'L', -65819=>'L', -65820=>'L', -65821=>'L', -65822=>'L', -65823=>'L', -65824=>'L', -65825=>'L', -65826=>'L', -65827=>'L', -65828=>'L', -65829=>'L', -65830=>'L', -65831=>'L', -65832=>'L', -65833=>'L', -65834=>'L', -65835=>'L', -65836=>'L', -65837=>'L', -65838=>'L', -65839=>'L', -65840=>'L', -65841=>'L', -65842=>'L', -65843=>'L', -65847=>'L', -65848=>'L', -65849=>'L', -65850=>'L', -65851=>'L', -65852=>'L', -65853=>'L', -65854=>'L', -65855=>'L', -65856=>'ON', -65857=>'ON', -65858=>'ON', -65859=>'ON', -65860=>'ON', -65861=>'ON', -65862=>'ON', -65863=>'ON', -65864=>'ON', -65865=>'ON', -65866=>'ON', -65867=>'ON', -65868=>'ON', -65869=>'ON', -65870=>'ON', -65871=>'ON', -65872=>'ON', -65873=>'ON', -65874=>'ON', -65875=>'ON', -65876=>'ON', -65877=>'ON', -65878=>'ON', -65879=>'ON', -65880=>'ON', -65881=>'ON', -65882=>'ON', -65883=>'ON', -65884=>'ON', -65885=>'ON', -65886=>'ON', -65887=>'ON', -65888=>'ON', -65889=>'ON', -65890=>'ON', -65891=>'ON', -65892=>'ON', -65893=>'ON', -65894=>'ON', -65895=>'ON', -65896=>'ON', -65897=>'ON', -65898=>'ON', -65899=>'ON', -65900=>'ON', -65901=>'ON', -65902=>'ON', -65903=>'ON', -65904=>'ON', -65905=>'ON', -65906=>'ON', -65907=>'ON', -65908=>'ON', -65909=>'ON', -65910=>'ON', -65911=>'ON', -65912=>'ON', -65913=>'ON', -65914=>'ON', -65915=>'ON', -65916=>'ON', -65917=>'ON', -65918=>'ON', -65919=>'ON', -65920=>'ON', -65921=>'ON', -65922=>'ON', -65923=>'ON', -65924=>'ON', -65925=>'ON', -65926=>'ON', -65927=>'ON', -65928=>'ON', -65929=>'ON', -65930=>'ON', -66304=>'L', -66305=>'L', -66306=>'L', -66307=>'L', -66308=>'L', -66309=>'L', -66310=>'L', -66311=>'L', -66312=>'L', -66313=>'L', -66314=>'L', -66315=>'L', -66316=>'L', -66317=>'L', -66318=>'L', -66319=>'L', -66320=>'L', -66321=>'L', -66322=>'L', -66323=>'L', -66324=>'L', -66325=>'L', -66326=>'L', -66327=>'L', -66328=>'L', -66329=>'L', -66330=>'L', -66331=>'L', -66332=>'L', -66333=>'L', -66334=>'L', -66336=>'L', -66337=>'L', -66338=>'L', -66339=>'L', -66352=>'L', -66353=>'L', -66354=>'L', -66355=>'L', -66356=>'L', -66357=>'L', -66358=>'L', -66359=>'L', -66360=>'L', -66361=>'L', -66362=>'L', -66363=>'L', -66364=>'L', -66365=>'L', -66366=>'L', -66367=>'L', -66368=>'L', -66369=>'L', -66370=>'L', -66371=>'L', -66372=>'L', -66373=>'L', -66374=>'L', -66375=>'L', -66376=>'L', -66377=>'L', -66378=>'L', -66432=>'L', -66433=>'L', -66434=>'L', -66435=>'L', -66436=>'L', -66437=>'L', -66438=>'L', -66439=>'L', -66440=>'L', -66441=>'L', -66442=>'L', -66443=>'L', -66444=>'L', -66445=>'L', -66446=>'L', -66447=>'L', -66448=>'L', -66449=>'L', -66450=>'L', -66451=>'L', -66452=>'L', -66453=>'L', -66454=>'L', -66455=>'L', -66456=>'L', -66457=>'L', -66458=>'L', -66459=>'L', -66460=>'L', -66461=>'L', -66463=>'L', -66464=>'L', -66465=>'L', -66466=>'L', -66467=>'L', -66468=>'L', -66469=>'L', -66470=>'L', -66471=>'L', -66472=>'L', -66473=>'L', -66474=>'L', -66475=>'L', -66476=>'L', -66477=>'L', -66478=>'L', -66479=>'L', -66480=>'L', -66481=>'L', -66482=>'L', -66483=>'L', -66484=>'L', -66485=>'L', -66486=>'L', -66487=>'L', -66488=>'L', -66489=>'L', -66490=>'L', -66491=>'L', -66492=>'L', -66493=>'L', -66494=>'L', -66495=>'L', -66496=>'L', -66497=>'L', -66498=>'L', -66499=>'L', -66504=>'L', -66505=>'L', -66506=>'L', -66507=>'L', -66508=>'L', -66509=>'L', -66510=>'L', -66511=>'L', -66512=>'L', -66513=>'L', -66514=>'L', -66515=>'L', -66516=>'L', -66517=>'L', -66560=>'L', -66561=>'L', -66562=>'L', -66563=>'L', -66564=>'L', -66565=>'L', -66566=>'L', -66567=>'L', -66568=>'L', -66569=>'L', -66570=>'L', -66571=>'L', -66572=>'L', -66573=>'L', -66574=>'L', -66575=>'L', -66576=>'L', -66577=>'L', -66578=>'L', -66579=>'L', -66580=>'L', -66581=>'L', -66582=>'L', -66583=>'L', -66584=>'L', -66585=>'L', -66586=>'L', -66587=>'L', -66588=>'L', -66589=>'L', -66590=>'L', -66591=>'L', -66592=>'L', -66593=>'L', -66594=>'L', -66595=>'L', -66596=>'L', -66597=>'L', -66598=>'L', -66599=>'L', -66600=>'L', -66601=>'L', -66602=>'L', -66603=>'L', -66604=>'L', -66605=>'L', -66606=>'L', -66607=>'L', -66608=>'L', -66609=>'L', -66610=>'L', -66611=>'L', -66612=>'L', -66613=>'L', -66614=>'L', -66615=>'L', -66616=>'L', -66617=>'L', -66618=>'L', -66619=>'L', -66620=>'L', -66621=>'L', -66622=>'L', -66623=>'L', -66624=>'L', -66625=>'L', -66626=>'L', -66627=>'L', -66628=>'L', -66629=>'L', -66630=>'L', -66631=>'L', -66632=>'L', -66633=>'L', -66634=>'L', -66635=>'L', -66636=>'L', -66637=>'L', -66638=>'L', -66639=>'L', -66640=>'L', -66641=>'L', -66642=>'L', -66643=>'L', -66644=>'L', -66645=>'L', -66646=>'L', -66647=>'L', -66648=>'L', -66649=>'L', -66650=>'L', -66651=>'L', -66652=>'L', -66653=>'L', -66654=>'L', -66655=>'L', -66656=>'L', -66657=>'L', -66658=>'L', -66659=>'L', -66660=>'L', -66661=>'L', -66662=>'L', -66663=>'L', -66664=>'L', -66665=>'L', -66666=>'L', -66667=>'L', -66668=>'L', -66669=>'L', -66670=>'L', -66671=>'L', -66672=>'L', -66673=>'L', -66674=>'L', -66675=>'L', -66676=>'L', -66677=>'L', -66678=>'L', -66679=>'L', -66680=>'L', -66681=>'L', -66682=>'L', -66683=>'L', -66684=>'L', -66685=>'L', -66686=>'L', -66687=>'L', -66688=>'L', -66689=>'L', -66690=>'L', -66691=>'L', -66692=>'L', -66693=>'L', -66694=>'L', -66695=>'L', -66696=>'L', -66697=>'L', -66698=>'L', -66699=>'L', -66700=>'L', -66701=>'L', -66702=>'L', -66703=>'L', -66704=>'L', -66705=>'L', -66706=>'L', -66707=>'L', -66708=>'L', -66709=>'L', -66710=>'L', -66711=>'L', -66712=>'L', -66713=>'L', -66714=>'L', -66715=>'L', -66716=>'L', -66717=>'L', -66720=>'L', -66721=>'L', -66722=>'L', -66723=>'L', -66724=>'L', -66725=>'L', -66726=>'L', -66727=>'L', -66728=>'L', -66729=>'L', -67584=>'R', -67585=>'R', -67586=>'R', -67587=>'R', -67588=>'R', -67589=>'R', -67592=>'R', -67594=>'R', -67595=>'R', -67596=>'R', -67597=>'R', -67598=>'R', -67599=>'R', -67600=>'R', -67601=>'R', -67602=>'R', -67603=>'R', -67604=>'R', -67605=>'R', -67606=>'R', -67607=>'R', -67608=>'R', -67609=>'R', -67610=>'R', -67611=>'R', -67612=>'R', -67613=>'R', -67614=>'R', -67615=>'R', -67616=>'R', -67617=>'R', -67618=>'R', -67619=>'R', -67620=>'R', -67621=>'R', -67622=>'R', -67623=>'R', -67624=>'R', -67625=>'R', -67626=>'R', -67627=>'R', -67628=>'R', -67629=>'R', -67630=>'R', -67631=>'R', -67632=>'R', -67633=>'R', -67634=>'R', -67635=>'R', -67636=>'R', -67637=>'R', -67639=>'R', -67640=>'R', -67644=>'R', -67647=>'R', -67840=>'R', -67841=>'R', -67842=>'R', -67843=>'R', -67844=>'R', -67845=>'R', -67846=>'R', -67847=>'R', -67848=>'R', -67849=>'R', -67850=>'R', -67851=>'R', -67852=>'R', -67853=>'R', -67854=>'R', -67855=>'R', -67856=>'R', -67857=>'R', -67858=>'R', -67859=>'R', -67860=>'R', -67861=>'R', -67862=>'R', -67863=>'R', -67864=>'R', -67865=>'R', -67871=>'ON', -68096=>'R', -68097=>'NSM', -68098=>'NSM', -68099=>'NSM', -68101=>'NSM', -68102=>'NSM', -68108=>'NSM', -68109=>'NSM', -68110=>'NSM', -68111=>'NSM', -68112=>'R', -68113=>'R', -68114=>'R', -68115=>'R', -68117=>'R', -68118=>'R', -68119=>'R', -68121=>'R', -68122=>'R', -68123=>'R', -68124=>'R', -68125=>'R', -68126=>'R', -68127=>'R', -68128=>'R', -68129=>'R', -68130=>'R', -68131=>'R', -68132=>'R', -68133=>'R', -68134=>'R', -68135=>'R', -68136=>'R', -68137=>'R', -68138=>'R', -68139=>'R', -68140=>'R', -68141=>'R', -68142=>'R', -68143=>'R', -68144=>'R', -68145=>'R', -68146=>'R', -68147=>'R', -68152=>'NSM', -68153=>'NSM', -68154=>'NSM', -68159=>'NSM', -68160=>'R', -68161=>'R', -68162=>'R', -68163=>'R', -68164=>'R', -68165=>'R', -68166=>'R', -68167=>'R', -68176=>'R', -68177=>'R', -68178=>'R', -68179=>'R', -68180=>'R', -68181=>'R', -68182=>'R', -68183=>'R', -68184=>'R', -73728=>'L', -73729=>'L', -73730=>'L', -73731=>'L', -73732=>'L', -73733=>'L', -73734=>'L', -73735=>'L', -73736=>'L', -73737=>'L', -73738=>'L', -73739=>'L', -73740=>'L', -73741=>'L', -73742=>'L', -73743=>'L', -73744=>'L', -73745=>'L', -73746=>'L', -73747=>'L', -73748=>'L', -73749=>'L', -73750=>'L', -73751=>'L', -73752=>'L', -73753=>'L', -73754=>'L', -73755=>'L', -73756=>'L', -73757=>'L', -73758=>'L', -73759=>'L', -73760=>'L', -73761=>'L', -73762=>'L', -73763=>'L', -73764=>'L', -73765=>'L', -73766=>'L', -73767=>'L', -73768=>'L', -73769=>'L', -73770=>'L', -73771=>'L', -73772=>'L', -73773=>'L', -73774=>'L', -73775=>'L', -73776=>'L', -73777=>'L', -73778=>'L', -73779=>'L', -73780=>'L', -73781=>'L', -73782=>'L', -73783=>'L', -73784=>'L', -73785=>'L', -73786=>'L', -73787=>'L', -73788=>'L', -73789=>'L', -73790=>'L', -73791=>'L', -73792=>'L', -73793=>'L', -73794=>'L', -73795=>'L', -73796=>'L', -73797=>'L', -73798=>'L', -73799=>'L', -73800=>'L', -73801=>'L', -73802=>'L', -73803=>'L', -73804=>'L', -73805=>'L', -73806=>'L', -73807=>'L', -73808=>'L', -73809=>'L', -73810=>'L', -73811=>'L', -73812=>'L', -73813=>'L', -73814=>'L', -73815=>'L', -73816=>'L', -73817=>'L', -73818=>'L', -73819=>'L', -73820=>'L', -73821=>'L', -73822=>'L', -73823=>'L', -73824=>'L', -73825=>'L', -73826=>'L', -73827=>'L', -73828=>'L', -73829=>'L', -73830=>'L', -73831=>'L', -73832=>'L', -73833=>'L', -73834=>'L', -73835=>'L', -73836=>'L', -73837=>'L', -73838=>'L', -73839=>'L', -73840=>'L', -73841=>'L', -73842=>'L', -73843=>'L', -73844=>'L', -73845=>'L', -73846=>'L', -73847=>'L', -73848=>'L', -73849=>'L', -73850=>'L', -73851=>'L', -73852=>'L', -73853=>'L', -73854=>'L', -73855=>'L', -73856=>'L', -73857=>'L', -73858=>'L', -73859=>'L', -73860=>'L', -73861=>'L', -73862=>'L', -73863=>'L', -73864=>'L', -73865=>'L', -73866=>'L', -73867=>'L', -73868=>'L', -73869=>'L', -73870=>'L', -73871=>'L', -73872=>'L', -73873=>'L', -73874=>'L', -73875=>'L', -73876=>'L', -73877=>'L', -73878=>'L', -73879=>'L', -73880=>'L', -73881=>'L', -73882=>'L', -73883=>'L', -73884=>'L', -73885=>'L', -73886=>'L', -73887=>'L', -73888=>'L', -73889=>'L', -73890=>'L', -73891=>'L', -73892=>'L', -73893=>'L', -73894=>'L', -73895=>'L', -73896=>'L', -73897=>'L', -73898=>'L', -73899=>'L', -73900=>'L', -73901=>'L', -73902=>'L', -73903=>'L', -73904=>'L', -73905=>'L', -73906=>'L', -73907=>'L', -73908=>'L', -73909=>'L', -73910=>'L', -73911=>'L', -73912=>'L', -73913=>'L', -73914=>'L', -73915=>'L', -73916=>'L', -73917=>'L', -73918=>'L', -73919=>'L', -73920=>'L', -73921=>'L', -73922=>'L', -73923=>'L', -73924=>'L', -73925=>'L', -73926=>'L', -73927=>'L', -73928=>'L', -73929=>'L', -73930=>'L', -73931=>'L', -73932=>'L', -73933=>'L', -73934=>'L', -73935=>'L', -73936=>'L', -73937=>'L', -73938=>'L', -73939=>'L', -73940=>'L', -73941=>'L', -73942=>'L', -73943=>'L', -73944=>'L', -73945=>'L', -73946=>'L', -73947=>'L', -73948=>'L', -73949=>'L', -73950=>'L', -73951=>'L', -73952=>'L', -73953=>'L', -73954=>'L', -73955=>'L', -73956=>'L', -73957=>'L', -73958=>'L', -73959=>'L', -73960=>'L', -73961=>'L', -73962=>'L', -73963=>'L', -73964=>'L', -73965=>'L', -73966=>'L', -73967=>'L', -73968=>'L', -73969=>'L', -73970=>'L', -73971=>'L', -73972=>'L', -73973=>'L', -73974=>'L', -73975=>'L', -73976=>'L', -73977=>'L', -73978=>'L', -73979=>'L', -73980=>'L', -73981=>'L', -73982=>'L', -73983=>'L', -73984=>'L', -73985=>'L', -73986=>'L', -73987=>'L', -73988=>'L', -73989=>'L', -73990=>'L', -73991=>'L', -73992=>'L', -73993=>'L', -73994=>'L', -73995=>'L', -73996=>'L', -73997=>'L', -73998=>'L', -73999=>'L', -74000=>'L', -74001=>'L', -74002=>'L', -74003=>'L', -74004=>'L', -74005=>'L', -74006=>'L', -74007=>'L', -74008=>'L', -74009=>'L', -74010=>'L', -74011=>'L', -74012=>'L', -74013=>'L', -74014=>'L', -74015=>'L', -74016=>'L', -74017=>'L', -74018=>'L', -74019=>'L', -74020=>'L', -74021=>'L', -74022=>'L', -74023=>'L', -74024=>'L', -74025=>'L', -74026=>'L', -74027=>'L', -74028=>'L', -74029=>'L', -74030=>'L', -74031=>'L', -74032=>'L', -74033=>'L', -74034=>'L', -74035=>'L', -74036=>'L', -74037=>'L', -74038=>'L', -74039=>'L', -74040=>'L', -74041=>'L', -74042=>'L', -74043=>'L', -74044=>'L', -74045=>'L', -74046=>'L', -74047=>'L', -74048=>'L', -74049=>'L', -74050=>'L', -74051=>'L', -74052=>'L', -74053=>'L', -74054=>'L', -74055=>'L', -74056=>'L', -74057=>'L', -74058=>'L', -74059=>'L', -74060=>'L', -74061=>'L', -74062=>'L', -74063=>'L', -74064=>'L', -74065=>'L', -74066=>'L', -74067=>'L', -74068=>'L', -74069=>'L', -74070=>'L', -74071=>'L', -74072=>'L', -74073=>'L', -74074=>'L', -74075=>'L', -74076=>'L', -74077=>'L', -74078=>'L', -74079=>'L', -74080=>'L', -74081=>'L', -74082=>'L', -74083=>'L', -74084=>'L', -74085=>'L', -74086=>'L', -74087=>'L', -74088=>'L', -74089=>'L', -74090=>'L', -74091=>'L', -74092=>'L', -74093=>'L', -74094=>'L', -74095=>'L', -74096=>'L', -74097=>'L', -74098=>'L', -74099=>'L', -74100=>'L', -74101=>'L', -74102=>'L', -74103=>'L', -74104=>'L', -74105=>'L', -74106=>'L', -74107=>'L', -74108=>'L', -74109=>'L', -74110=>'L', -74111=>'L', -74112=>'L', -74113=>'L', -74114=>'L', -74115=>'L', -74116=>'L', -74117=>'L', -74118=>'L', -74119=>'L', -74120=>'L', -74121=>'L', -74122=>'L', -74123=>'L', -74124=>'L', -74125=>'L', -74126=>'L', -74127=>'L', -74128=>'L', -74129=>'L', -74130=>'L', -74131=>'L', -74132=>'L', -74133=>'L', -74134=>'L', -74135=>'L', -74136=>'L', -74137=>'L', -74138=>'L', -74139=>'L', -74140=>'L', -74141=>'L', -74142=>'L', -74143=>'L', -74144=>'L', -74145=>'L', -74146=>'L', -74147=>'L', -74148=>'L', -74149=>'L', -74150=>'L', -74151=>'L', -74152=>'L', -74153=>'L', -74154=>'L', -74155=>'L', -74156=>'L', -74157=>'L', -74158=>'L', -74159=>'L', -74160=>'L', -74161=>'L', -74162=>'L', -74163=>'L', -74164=>'L', -74165=>'L', -74166=>'L', -74167=>'L', -74168=>'L', -74169=>'L', -74170=>'L', -74171=>'L', -74172=>'L', -74173=>'L', -74174=>'L', -74175=>'L', -74176=>'L', -74177=>'L', -74178=>'L', -74179=>'L', -74180=>'L', -74181=>'L', -74182=>'L', -74183=>'L', -74184=>'L', -74185=>'L', -74186=>'L', -74187=>'L', -74188=>'L', -74189=>'L', -74190=>'L', -74191=>'L', -74192=>'L', -74193=>'L', -74194=>'L', -74195=>'L', -74196=>'L', -74197=>'L', -74198=>'L', -74199=>'L', -74200=>'L', -74201=>'L', -74202=>'L', -74203=>'L', -74204=>'L', -74205=>'L', -74206=>'L', -74207=>'L', -74208=>'L', -74209=>'L', -74210=>'L', -74211=>'L', -74212=>'L', -74213=>'L', -74214=>'L', -74215=>'L', -74216=>'L', -74217=>'L', -74218=>'L', -74219=>'L', -74220=>'L', -74221=>'L', -74222=>'L', -74223=>'L', -74224=>'L', -74225=>'L', -74226=>'L', -74227=>'L', -74228=>'L', -74229=>'L', -74230=>'L', -74231=>'L', -74232=>'L', -74233=>'L', -74234=>'L', -74235=>'L', -74236=>'L', -74237=>'L', -74238=>'L', -74239=>'L', -74240=>'L', -74241=>'L', -74242=>'L', -74243=>'L', -74244=>'L', -74245=>'L', -74246=>'L', -74247=>'L', -74248=>'L', -74249=>'L', -74250=>'L', -74251=>'L', -74252=>'L', -74253=>'L', -74254=>'L', -74255=>'L', -74256=>'L', -74257=>'L', -74258=>'L', -74259=>'L', -74260=>'L', -74261=>'L', -74262=>'L', -74263=>'L', -74264=>'L', -74265=>'L', -74266=>'L', -74267=>'L', -74268=>'L', -74269=>'L', -74270=>'L', -74271=>'L', -74272=>'L', -74273=>'L', -74274=>'L', -74275=>'L', -74276=>'L', -74277=>'L', -74278=>'L', -74279=>'L', -74280=>'L', -74281=>'L', -74282=>'L', -74283=>'L', -74284=>'L', -74285=>'L', -74286=>'L', -74287=>'L', -74288=>'L', -74289=>'L', -74290=>'L', -74291=>'L', -74292=>'L', -74293=>'L', -74294=>'L', -74295=>'L', -74296=>'L', -74297=>'L', -74298=>'L', -74299=>'L', -74300=>'L', -74301=>'L', -74302=>'L', -74303=>'L', -74304=>'L', -74305=>'L', -74306=>'L', -74307=>'L', -74308=>'L', -74309=>'L', -74310=>'L', -74311=>'L', -74312=>'L', -74313=>'L', -74314=>'L', -74315=>'L', -74316=>'L', -74317=>'L', -74318=>'L', -74319=>'L', -74320=>'L', -74321=>'L', -74322=>'L', -74323=>'L', -74324=>'L', -74325=>'L', -74326=>'L', -74327=>'L', -74328=>'L', -74329=>'L', -74330=>'L', -74331=>'L', -74332=>'L', -74333=>'L', -74334=>'L', -74335=>'L', -74336=>'L', -74337=>'L', -74338=>'L', -74339=>'L', -74340=>'L', -74341=>'L', -74342=>'L', -74343=>'L', -74344=>'L', -74345=>'L', -74346=>'L', -74347=>'L', -74348=>'L', -74349=>'L', -74350=>'L', -74351=>'L', -74352=>'L', -74353=>'L', -74354=>'L', -74355=>'L', -74356=>'L', -74357=>'L', -74358=>'L', -74359=>'L', -74360=>'L', -74361=>'L', -74362=>'L', -74363=>'L', -74364=>'L', -74365=>'L', -74366=>'L', -74367=>'L', -74368=>'L', -74369=>'L', -74370=>'L', -74371=>'L', -74372=>'L', -74373=>'L', -74374=>'L', -74375=>'L', -74376=>'L', -74377=>'L', -74378=>'L', -74379=>'L', -74380=>'L', -74381=>'L', -74382=>'L', -74383=>'L', -74384=>'L', -74385=>'L', -74386=>'L', -74387=>'L', -74388=>'L', -74389=>'L', -74390=>'L', -74391=>'L', -74392=>'L', -74393=>'L', -74394=>'L', -74395=>'L', -74396=>'L', -74397=>'L', -74398=>'L', -74399=>'L', -74400=>'L', -74401=>'L', -74402=>'L', -74403=>'L', -74404=>'L', -74405=>'L', -74406=>'L', -74407=>'L', -74408=>'L', -74409=>'L', -74410=>'L', -74411=>'L', -74412=>'L', -74413=>'L', -74414=>'L', -74415=>'L', -74416=>'L', -74417=>'L', -74418=>'L', -74419=>'L', -74420=>'L', -74421=>'L', -74422=>'L', -74423=>'L', -74424=>'L', -74425=>'L', -74426=>'L', -74427=>'L', -74428=>'L', -74429=>'L', -74430=>'L', -74431=>'L', -74432=>'L', -74433=>'L', -74434=>'L', -74435=>'L', -74436=>'L', -74437=>'L', -74438=>'L', -74439=>'L', -74440=>'L', -74441=>'L', -74442=>'L', -74443=>'L', -74444=>'L', -74445=>'L', -74446=>'L', -74447=>'L', -74448=>'L', -74449=>'L', -74450=>'L', -74451=>'L', -74452=>'L', -74453=>'L', -74454=>'L', -74455=>'L', -74456=>'L', -74457=>'L', -74458=>'L', -74459=>'L', -74460=>'L', -74461=>'L', -74462=>'L', -74463=>'L', -74464=>'L', -74465=>'L', -74466=>'L', -74467=>'L', -74468=>'L', -74469=>'L', -74470=>'L', -74471=>'L', -74472=>'L', -74473=>'L', -74474=>'L', -74475=>'L', -74476=>'L', -74477=>'L', -74478=>'L', -74479=>'L', -74480=>'L', -74481=>'L', -74482=>'L', -74483=>'L', -74484=>'L', -74485=>'L', -74486=>'L', -74487=>'L', -74488=>'L', -74489=>'L', -74490=>'L', -74491=>'L', -74492=>'L', -74493=>'L', -74494=>'L', -74495=>'L', -74496=>'L', -74497=>'L', -74498=>'L', -74499=>'L', -74500=>'L', -74501=>'L', -74502=>'L', -74503=>'L', -74504=>'L', -74505=>'L', -74506=>'L', -74507=>'L', -74508=>'L', -74509=>'L', -74510=>'L', -74511=>'L', -74512=>'L', -74513=>'L', -74514=>'L', -74515=>'L', -74516=>'L', -74517=>'L', -74518=>'L', -74519=>'L', -74520=>'L', -74521=>'L', -74522=>'L', -74523=>'L', -74524=>'L', -74525=>'L', -74526=>'L', -74527=>'L', -74528=>'L', -74529=>'L', -74530=>'L', -74531=>'L', -74532=>'L', -74533=>'L', -74534=>'L', -74535=>'L', -74536=>'L', -74537=>'L', -74538=>'L', -74539=>'L', -74540=>'L', -74541=>'L', -74542=>'L', -74543=>'L', -74544=>'L', -74545=>'L', -74546=>'L', -74547=>'L', -74548=>'L', -74549=>'L', -74550=>'L', -74551=>'L', -74552=>'L', -74553=>'L', -74554=>'L', -74555=>'L', -74556=>'L', -74557=>'L', -74558=>'L', -74559=>'L', -74560=>'L', -74561=>'L', -74562=>'L', -74563=>'L', -74564=>'L', -74565=>'L', -74566=>'L', -74567=>'L', -74568=>'L', -74569=>'L', -74570=>'L', -74571=>'L', -74572=>'L', -74573=>'L', -74574=>'L', -74575=>'L', -74576=>'L', -74577=>'L', -74578=>'L', -74579=>'L', -74580=>'L', -74581=>'L', -74582=>'L', -74583=>'L', -74584=>'L', -74585=>'L', -74586=>'L', -74587=>'L', -74588=>'L', -74589=>'L', -74590=>'L', -74591=>'L', -74592=>'L', -74593=>'L', -74594=>'L', -74595=>'L', -74596=>'L', -74597=>'L', -74598=>'L', -74599=>'L', -74600=>'L', -74601=>'L', -74602=>'L', -74603=>'L', -74604=>'L', -74605=>'L', -74606=>'L', -74752=>'L', -74753=>'L', -74754=>'L', -74755=>'L', -74756=>'L', -74757=>'L', -74758=>'L', -74759=>'L', -74760=>'L', -74761=>'L', -74762=>'L', -74763=>'L', -74764=>'L', -74765=>'L', -74766=>'L', -74767=>'L', -74768=>'L', -74769=>'L', -74770=>'L', -74771=>'L', -74772=>'L', -74773=>'L', -74774=>'L', -74775=>'L', -74776=>'L', -74777=>'L', -74778=>'L', -74779=>'L', -74780=>'L', -74781=>'L', -74782=>'L', -74783=>'L', -74784=>'L', -74785=>'L', -74786=>'L', -74787=>'L', -74788=>'L', -74789=>'L', -74790=>'L', -74791=>'L', -74792=>'L', -74793=>'L', -74794=>'L', -74795=>'L', -74796=>'L', -74797=>'L', -74798=>'L', -74799=>'L', -74800=>'L', -74801=>'L', -74802=>'L', -74803=>'L', -74804=>'L', -74805=>'L', -74806=>'L', -74807=>'L', -74808=>'L', -74809=>'L', -74810=>'L', -74811=>'L', -74812=>'L', -74813=>'L', -74814=>'L', -74815=>'L', -74816=>'L', -74817=>'L', -74818=>'L', -74819=>'L', -74820=>'L', -74821=>'L', -74822=>'L', -74823=>'L', -74824=>'L', -74825=>'L', -74826=>'L', -74827=>'L', -74828=>'L', -74829=>'L', -74830=>'L', -74831=>'L', -74832=>'L', -74833=>'L', -74834=>'L', -74835=>'L', -74836=>'L', -74837=>'L', -74838=>'L', -74839=>'L', -74840=>'L', -74841=>'L', -74842=>'L', -74843=>'L', -74844=>'L', -74845=>'L', -74846=>'L', -74847=>'L', -74848=>'L', -74849=>'L', -74850=>'L', -74864=>'L', -74865=>'L', -74866=>'L', -74867=>'L', -118784=>'L', -118785=>'L', -118786=>'L', -118787=>'L', -118788=>'L', -118789=>'L', -118790=>'L', -118791=>'L', -118792=>'L', -118793=>'L', -118794=>'L', -118795=>'L', -118796=>'L', -118797=>'L', -118798=>'L', -118799=>'L', -118800=>'L', -118801=>'L', -118802=>'L', -118803=>'L', -118804=>'L', -118805=>'L', -118806=>'L', -118807=>'L', -118808=>'L', -118809=>'L', -118810=>'L', -118811=>'L', -118812=>'L', -118813=>'L', -118814=>'L', -118815=>'L', -118816=>'L', -118817=>'L', -118818=>'L', -118819=>'L', -118820=>'L', -118821=>'L', -118822=>'L', -118823=>'L', -118824=>'L', -118825=>'L', -118826=>'L', -118827=>'L', -118828=>'L', -118829=>'L', -118830=>'L', -118831=>'L', -118832=>'L', -118833=>'L', -118834=>'L', -118835=>'L', -118836=>'L', -118837=>'L', -118838=>'L', -118839=>'L', -118840=>'L', -118841=>'L', -118842=>'L', -118843=>'L', -118844=>'L', -118845=>'L', -118846=>'L', -118847=>'L', -118848=>'L', -118849=>'L', -118850=>'L', -118851=>'L', -118852=>'L', -118853=>'L', -118854=>'L', -118855=>'L', -118856=>'L', -118857=>'L', -118858=>'L', -118859=>'L', -118860=>'L', -118861=>'L', -118862=>'L', -118863=>'L', -118864=>'L', -118865=>'L', -118866=>'L', -118867=>'L', -118868=>'L', -118869=>'L', -118870=>'L', -118871=>'L', -118872=>'L', -118873=>'L', -118874=>'L', -118875=>'L', -118876=>'L', -118877=>'L', -118878=>'L', -118879=>'L', -118880=>'L', -118881=>'L', -118882=>'L', -118883=>'L', -118884=>'L', -118885=>'L', -118886=>'L', -118887=>'L', -118888=>'L', -118889=>'L', -118890=>'L', -118891=>'L', -118892=>'L', -118893=>'L', -118894=>'L', -118895=>'L', -118896=>'L', -118897=>'L', -118898=>'L', -118899=>'L', -118900=>'L', -118901=>'L', -118902=>'L', -118903=>'L', -118904=>'L', -118905=>'L', -118906=>'L', -118907=>'L', -118908=>'L', -118909=>'L', -118910=>'L', -118911=>'L', -118912=>'L', -118913=>'L', -118914=>'L', -118915=>'L', -118916=>'L', -118917=>'L', -118918=>'L', -118919=>'L', -118920=>'L', -118921=>'L', -118922=>'L', -118923=>'L', -118924=>'L', -118925=>'L', -118926=>'L', -118927=>'L', -118928=>'L', -118929=>'L', -118930=>'L', -118931=>'L', -118932=>'L', -118933=>'L', -118934=>'L', -118935=>'L', -118936=>'L', -118937=>'L', -118938=>'L', -118939=>'L', -118940=>'L', -118941=>'L', -118942=>'L', -118943=>'L', -118944=>'L', -118945=>'L', -118946=>'L', -118947=>'L', -118948=>'L', -118949=>'L', -118950=>'L', -118951=>'L', -118952=>'L', -118953=>'L', -118954=>'L', -118955=>'L', -118956=>'L', -118957=>'L', -118958=>'L', -118959=>'L', -118960=>'L', -118961=>'L', -118962=>'L', -118963=>'L', -118964=>'L', -118965=>'L', -118966=>'L', -118967=>'L', -118968=>'L', -118969=>'L', -118970=>'L', -118971=>'L', -118972=>'L', -118973=>'L', -118974=>'L', -118975=>'L', -118976=>'L', -118977=>'L', -118978=>'L', -118979=>'L', -118980=>'L', -118981=>'L', -118982=>'L', -118983=>'L', -118984=>'L', -118985=>'L', -118986=>'L', -118987=>'L', -118988=>'L', -118989=>'L', -118990=>'L', -118991=>'L', -118992=>'L', -118993=>'L', -118994=>'L', -118995=>'L', -118996=>'L', -118997=>'L', -118998=>'L', -118999=>'L', -119000=>'L', -119001=>'L', -119002=>'L', -119003=>'L', -119004=>'L', -119005=>'L', -119006=>'L', -119007=>'L', -119008=>'L', -119009=>'L', -119010=>'L', -119011=>'L', -119012=>'L', -119013=>'L', -119014=>'L', -119015=>'L', -119016=>'L', -119017=>'L', -119018=>'L', -119019=>'L', -119020=>'L', -119021=>'L', -119022=>'L', -119023=>'L', -119024=>'L', -119025=>'L', -119026=>'L', -119027=>'L', -119028=>'L', -119029=>'L', -119040=>'L', -119041=>'L', -119042=>'L', -119043=>'L', -119044=>'L', -119045=>'L', -119046=>'L', -119047=>'L', -119048=>'L', -119049=>'L', -119050=>'L', -119051=>'L', -119052=>'L', -119053=>'L', -119054=>'L', -119055=>'L', -119056=>'L', -119057=>'L', -119058=>'L', -119059=>'L', -119060=>'L', -119061=>'L', -119062=>'L', -119063=>'L', -119064=>'L', -119065=>'L', -119066=>'L', -119067=>'L', -119068=>'L', -119069=>'L', -119070=>'L', -119071=>'L', -119072=>'L', -119073=>'L', -119074=>'L', -119075=>'L', -119076=>'L', -119077=>'L', -119078=>'L', -119082=>'L', -119083=>'L', -119084=>'L', -119085=>'L', -119086=>'L', -119087=>'L', -119088=>'L', -119089=>'L', -119090=>'L', -119091=>'L', -119092=>'L', -119093=>'L', -119094=>'L', -119095=>'L', -119096=>'L', -119097=>'L', -119098=>'L', -119099=>'L', -119100=>'L', -119101=>'L', -119102=>'L', -119103=>'L', -119104=>'L', -119105=>'L', -119106=>'L', -119107=>'L', -119108=>'L', -119109=>'L', -119110=>'L', -119111=>'L', -119112=>'L', -119113=>'L', -119114=>'L', -119115=>'L', -119116=>'L', -119117=>'L', -119118=>'L', -119119=>'L', -119120=>'L', -119121=>'L', -119122=>'L', -119123=>'L', -119124=>'L', -119125=>'L', -119126=>'L', -119127=>'L', -119128=>'L', -119129=>'L', -119130=>'L', -119131=>'L', -119132=>'L', -119133=>'L', -119134=>'L', -119135=>'L', -119136=>'L', -119137=>'L', -119138=>'L', -119139=>'L', -119140=>'L', -119141=>'L', -119142=>'L', -119143=>'NSM', -119144=>'NSM', -119145=>'NSM', -119146=>'L', -119147=>'L', -119148=>'L', -119149=>'L', -119150=>'L', -119151=>'L', -119152=>'L', -119153=>'L', -119154=>'L', -119155=>'BN', -119156=>'BN', -119157=>'BN', -119158=>'BN', -119159=>'BN', -119160=>'BN', -119161=>'BN', -119162=>'BN', -119163=>'NSM', -119164=>'NSM', -119165=>'NSM', -119166=>'NSM', -119167=>'NSM', -119168=>'NSM', -119169=>'NSM', -119170=>'NSM', -119171=>'L', -119172=>'L', -119173=>'NSM', -119174=>'NSM', -119175=>'NSM', -119176=>'NSM', -119177=>'NSM', -119178=>'NSM', -119179=>'NSM', -119180=>'L', -119181=>'L', -119182=>'L', -119183=>'L', -119184=>'L', -119185=>'L', -119186=>'L', -119187=>'L', -119188=>'L', -119189=>'L', -119190=>'L', -119191=>'L', -119192=>'L', -119193=>'L', -119194=>'L', -119195=>'L', -119196=>'L', -119197=>'L', -119198=>'L', -119199=>'L', -119200=>'L', -119201=>'L', -119202=>'L', -119203=>'L', -119204=>'L', -119205=>'L', -119206=>'L', -119207=>'L', -119208=>'L', -119209=>'L', -119210=>'NSM', -119211=>'NSM', -119212=>'NSM', -119213=>'NSM', -119214=>'L', -119215=>'L', -119216=>'L', -119217=>'L', -119218=>'L', -119219=>'L', -119220=>'L', -119221=>'L', -119222=>'L', -119223=>'L', -119224=>'L', -119225=>'L', -119226=>'L', -119227=>'L', -119228=>'L', -119229=>'L', -119230=>'L', -119231=>'L', -119232=>'L', -119233=>'L', -119234=>'L', -119235=>'L', -119236=>'L', -119237=>'L', -119238=>'L', -119239=>'L', -119240=>'L', -119241=>'L', -119242=>'L', -119243=>'L', -119244=>'L', -119245=>'L', -119246=>'L', -119247=>'L', -119248=>'L', -119249=>'L', -119250=>'L', -119251=>'L', -119252=>'L', -119253=>'L', -119254=>'L', -119255=>'L', -119256=>'L', -119257=>'L', -119258=>'L', -119259=>'L', -119260=>'L', -119261=>'L', -119296=>'ON', -119297=>'ON', -119298=>'ON', -119299=>'ON', -119300=>'ON', -119301=>'ON', -119302=>'ON', -119303=>'ON', -119304=>'ON', -119305=>'ON', -119306=>'ON', -119307=>'ON', -119308=>'ON', -119309=>'ON', -119310=>'ON', -119311=>'ON', -119312=>'ON', -119313=>'ON', -119314=>'ON', -119315=>'ON', -119316=>'ON', -119317=>'ON', -119318=>'ON', -119319=>'ON', -119320=>'ON', -119321=>'ON', -119322=>'ON', -119323=>'ON', -119324=>'ON', -119325=>'ON', -119326=>'ON', -119327=>'ON', -119328=>'ON', -119329=>'ON', -119330=>'ON', -119331=>'ON', -119332=>'ON', -119333=>'ON', -119334=>'ON', -119335=>'ON', -119336=>'ON', -119337=>'ON', -119338=>'ON', -119339=>'ON', -119340=>'ON', -119341=>'ON', -119342=>'ON', -119343=>'ON', -119344=>'ON', -119345=>'ON', -119346=>'ON', -119347=>'ON', -119348=>'ON', -119349=>'ON', -119350=>'ON', -119351=>'ON', -119352=>'ON', -119353=>'ON', -119354=>'ON', -119355=>'ON', -119356=>'ON', -119357=>'ON', -119358=>'ON', -119359=>'ON', -119360=>'ON', -119361=>'ON', -119362=>'NSM', -119363=>'NSM', -119364=>'NSM', -119365=>'ON', -119552=>'ON', -119553=>'ON', -119554=>'ON', -119555=>'ON', -119556=>'ON', -119557=>'ON', -119558=>'ON', -119559=>'ON', -119560=>'ON', -119561=>'ON', -119562=>'ON', -119563=>'ON', -119564=>'ON', -119565=>'ON', -119566=>'ON', -119567=>'ON', -119568=>'ON', -119569=>'ON', -119570=>'ON', -119571=>'ON', -119572=>'ON', -119573=>'ON', -119574=>'ON', -119575=>'ON', -119576=>'ON', -119577=>'ON', -119578=>'ON', -119579=>'ON', -119580=>'ON', -119581=>'ON', -119582=>'ON', -119583=>'ON', -119584=>'ON', -119585=>'ON', -119586=>'ON', -119587=>'ON', -119588=>'ON', -119589=>'ON', -119590=>'ON', -119591=>'ON', -119592=>'ON', -119593=>'ON', -119594=>'ON', -119595=>'ON', -119596=>'ON', -119597=>'ON', -119598=>'ON', -119599=>'ON', -119600=>'ON', -119601=>'ON', -119602=>'ON', -119603=>'ON', -119604=>'ON', -119605=>'ON', -119606=>'ON', -119607=>'ON', -119608=>'ON', -119609=>'ON', -119610=>'ON', -119611=>'ON', -119612=>'ON', -119613=>'ON', -119614=>'ON', -119615=>'ON', -119616=>'ON', -119617=>'ON', -119618=>'ON', -119619=>'ON', -119620=>'ON', -119621=>'ON', -119622=>'ON', -119623=>'ON', -119624=>'ON', -119625=>'ON', -119626=>'ON', -119627=>'ON', -119628=>'ON', -119629=>'ON', -119630=>'ON', -119631=>'ON', -119632=>'ON', -119633=>'ON', -119634=>'ON', -119635=>'ON', -119636=>'ON', -119637=>'ON', -119638=>'ON', -119648=>'L', -119649=>'L', -119650=>'L', -119651=>'L', -119652=>'L', -119653=>'L', -119654=>'L', -119655=>'L', -119656=>'L', -119657=>'L', -119658=>'L', -119659=>'L', -119660=>'L', -119661=>'L', -119662=>'L', -119663=>'L', -119664=>'L', -119665=>'L', -119808=>'L', -119809=>'L', -119810=>'L', -119811=>'L', -119812=>'L', -119813=>'L', -119814=>'L', -119815=>'L', -119816=>'L', -119817=>'L', -119818=>'L', -119819=>'L', -119820=>'L', -119821=>'L', -119822=>'L', -119823=>'L', -119824=>'L', -119825=>'L', -119826=>'L', -119827=>'L', -119828=>'L', -119829=>'L', -119830=>'L', -119831=>'L', -119832=>'L', -119833=>'L', -119834=>'L', -119835=>'L', -119836=>'L', -119837=>'L', -119838=>'L', -119839=>'L', -119840=>'L', -119841=>'L', -119842=>'L', -119843=>'L', -119844=>'L', -119845=>'L', -119846=>'L', -119847=>'L', -119848=>'L', -119849=>'L', -119850=>'L', -119851=>'L', -119852=>'L', -119853=>'L', -119854=>'L', -119855=>'L', -119856=>'L', -119857=>'L', -119858=>'L', -119859=>'L', -119860=>'L', -119861=>'L', -119862=>'L', -119863=>'L', -119864=>'L', -119865=>'L', -119866=>'L', -119867=>'L', -119868=>'L', -119869=>'L', -119870=>'L', -119871=>'L', -119872=>'L', -119873=>'L', -119874=>'L', -119875=>'L', -119876=>'L', -119877=>'L', -119878=>'L', -119879=>'L', -119880=>'L', -119881=>'L', -119882=>'L', -119883=>'L', -119884=>'L', -119885=>'L', -119886=>'L', -119887=>'L', -119888=>'L', -119889=>'L', -119890=>'L', -119891=>'L', -119892=>'L', -119894=>'L', -119895=>'L', -119896=>'L', -119897=>'L', -119898=>'L', -119899=>'L', -119900=>'L', -119901=>'L', -119902=>'L', -119903=>'L', -119904=>'L', -119905=>'L', -119906=>'L', -119907=>'L', -119908=>'L', -119909=>'L', -119910=>'L', -119911=>'L', -119912=>'L', -119913=>'L', -119914=>'L', -119915=>'L', -119916=>'L', -119917=>'L', -119918=>'L', -119919=>'L', -119920=>'L', -119921=>'L', -119922=>'L', -119923=>'L', -119924=>'L', -119925=>'L', -119926=>'L', -119927=>'L', -119928=>'L', -119929=>'L', -119930=>'L', -119931=>'L', -119932=>'L', -119933=>'L', -119934=>'L', -119935=>'L', -119936=>'L', -119937=>'L', -119938=>'L', -119939=>'L', -119940=>'L', -119941=>'L', -119942=>'L', -119943=>'L', -119944=>'L', -119945=>'L', -119946=>'L', -119947=>'L', -119948=>'L', -119949=>'L', -119950=>'L', -119951=>'L', -119952=>'L', -119953=>'L', -119954=>'L', -119955=>'L', -119956=>'L', -119957=>'L', -119958=>'L', -119959=>'L', -119960=>'L', -119961=>'L', -119962=>'L', -119963=>'L', -119964=>'L', -119966=>'L', -119967=>'L', -119970=>'L', -119973=>'L', -119974=>'L', -119977=>'L', -119978=>'L', -119979=>'L', -119980=>'L', -119982=>'L', -119983=>'L', -119984=>'L', -119985=>'L', -119986=>'L', -119987=>'L', -119988=>'L', -119989=>'L', -119990=>'L', -119991=>'L', -119992=>'L', -119993=>'L', -119995=>'L', -119997=>'L', -119998=>'L', -119999=>'L', -120000=>'L', -120001=>'L', -120002=>'L', -120003=>'L', -120005=>'L', -120006=>'L', -120007=>'L', -120008=>'L', -120009=>'L', -120010=>'L', -120011=>'L', -120012=>'L', -120013=>'L', -120014=>'L', -120015=>'L', -120016=>'L', -120017=>'L', -120018=>'L', -120019=>'L', -120020=>'L', -120021=>'L', -120022=>'L', -120023=>'L', -120024=>'L', -120025=>'L', -120026=>'L', -120027=>'L', -120028=>'L', -120029=>'L', -120030=>'L', -120031=>'L', -120032=>'L', -120033=>'L', -120034=>'L', -120035=>'L', -120036=>'L', -120037=>'L', -120038=>'L', -120039=>'L', -120040=>'L', -120041=>'L', -120042=>'L', -120043=>'L', -120044=>'L', -120045=>'L', -120046=>'L', -120047=>'L', -120048=>'L', -120049=>'L', -120050=>'L', -120051=>'L', -120052=>'L', -120053=>'L', -120054=>'L', -120055=>'L', -120056=>'L', -120057=>'L', -120058=>'L', -120059=>'L', -120060=>'L', -120061=>'L', -120062=>'L', -120063=>'L', -120064=>'L', -120065=>'L', -120066=>'L', -120067=>'L', -120068=>'L', -120069=>'L', -120071=>'L', -120072=>'L', -120073=>'L', -120074=>'L', -120077=>'L', -120078=>'L', -120079=>'L', -120080=>'L', -120081=>'L', -120082=>'L', -120083=>'L', -120084=>'L', -120086=>'L', -120087=>'L', -120088=>'L', -120089=>'L', -120090=>'L', -120091=>'L', -120092=>'L', -120094=>'L', -120095=>'L', -120096=>'L', -120097=>'L', -120098=>'L', -120099=>'L', -120100=>'L', -120101=>'L', -120102=>'L', -120103=>'L', -120104=>'L', -120105=>'L', -120106=>'L', -120107=>'L', -120108=>'L', -120109=>'L', -120110=>'L', -120111=>'L', -120112=>'L', -120113=>'L', -120114=>'L', -120115=>'L', -120116=>'L', -120117=>'L', -120118=>'L', -120119=>'L', -120120=>'L', -120121=>'L', -120123=>'L', -120124=>'L', -120125=>'L', -120126=>'L', -120128=>'L', -120129=>'L', -120130=>'L', -120131=>'L', -120132=>'L', -120134=>'L', -120138=>'L', -120139=>'L', -120140=>'L', -120141=>'L', -120142=>'L', -120143=>'L', -120144=>'L', -120146=>'L', -120147=>'L', -120148=>'L', -120149=>'L', -120150=>'L', -120151=>'L', -120152=>'L', -120153=>'L', -120154=>'L', -120155=>'L', -120156=>'L', -120157=>'L', -120158=>'L', -120159=>'L', -120160=>'L', -120161=>'L', -120162=>'L', -120163=>'L', -120164=>'L', -120165=>'L', -120166=>'L', -120167=>'L', -120168=>'L', -120169=>'L', -120170=>'L', -120171=>'L', -120172=>'L', -120173=>'L', -120174=>'L', -120175=>'L', -120176=>'L', -120177=>'L', -120178=>'L', -120179=>'L', -120180=>'L', -120181=>'L', -120182=>'L', -120183=>'L', -120184=>'L', -120185=>'L', -120186=>'L', -120187=>'L', -120188=>'L', -120189=>'L', -120190=>'L', -120191=>'L', -120192=>'L', -120193=>'L', -120194=>'L', -120195=>'L', -120196=>'L', -120197=>'L', -120198=>'L', -120199=>'L', -120200=>'L', -120201=>'L', -120202=>'L', -120203=>'L', -120204=>'L', -120205=>'L', -120206=>'L', -120207=>'L', -120208=>'L', -120209=>'L', -120210=>'L', -120211=>'L', -120212=>'L', -120213=>'L', -120214=>'L', -120215=>'L', -120216=>'L', -120217=>'L', -120218=>'L', -120219=>'L', -120220=>'L', -120221=>'L', -120222=>'L', -120223=>'L', -120224=>'L', -120225=>'L', -120226=>'L', -120227=>'L', -120228=>'L', -120229=>'L', -120230=>'L', -120231=>'L', -120232=>'L', -120233=>'L', -120234=>'L', -120235=>'L', -120236=>'L', -120237=>'L', -120238=>'L', -120239=>'L', -120240=>'L', -120241=>'L', -120242=>'L', -120243=>'L', -120244=>'L', -120245=>'L', -120246=>'L', -120247=>'L', -120248=>'L', -120249=>'L', -120250=>'L', -120251=>'L', -120252=>'L', -120253=>'L', -120254=>'L', -120255=>'L', -120256=>'L', -120257=>'L', -120258=>'L', -120259=>'L', -120260=>'L', -120261=>'L', -120262=>'L', -120263=>'L', -120264=>'L', -120265=>'L', -120266=>'L', -120267=>'L', -120268=>'L', -120269=>'L', -120270=>'L', -120271=>'L', -120272=>'L', -120273=>'L', -120274=>'L', -120275=>'L', -120276=>'L', -120277=>'L', -120278=>'L', -120279=>'L', -120280=>'L', -120281=>'L', -120282=>'L', -120283=>'L', -120284=>'L', -120285=>'L', -120286=>'L', -120287=>'L', -120288=>'L', -120289=>'L', -120290=>'L', -120291=>'L', -120292=>'L', -120293=>'L', -120294=>'L', -120295=>'L', -120296=>'L', -120297=>'L', -120298=>'L', -120299=>'L', -120300=>'L', -120301=>'L', -120302=>'L', -120303=>'L', -120304=>'L', -120305=>'L', -120306=>'L', -120307=>'L', -120308=>'L', -120309=>'L', -120310=>'L', -120311=>'L', -120312=>'L', -120313=>'L', -120314=>'L', -120315=>'L', -120316=>'L', -120317=>'L', -120318=>'L', -120319=>'L', -120320=>'L', -120321=>'L', -120322=>'L', -120323=>'L', -120324=>'L', -120325=>'L', -120326=>'L', -120327=>'L', -120328=>'L', -120329=>'L', -120330=>'L', -120331=>'L', -120332=>'L', -120333=>'L', -120334=>'L', -120335=>'L', -120336=>'L', -120337=>'L', -120338=>'L', -120339=>'L', -120340=>'L', -120341=>'L', -120342=>'L', -120343=>'L', -120344=>'L', -120345=>'L', -120346=>'L', -120347=>'L', -120348=>'L', -120349=>'L', -120350=>'L', -120351=>'L', -120352=>'L', -120353=>'L', -120354=>'L', -120355=>'L', -120356=>'L', -120357=>'L', -120358=>'L', -120359=>'L', -120360=>'L', -120361=>'L', -120362=>'L', -120363=>'L', -120364=>'L', -120365=>'L', -120366=>'L', -120367=>'L', -120368=>'L', -120369=>'L', -120370=>'L', -120371=>'L', -120372=>'L', -120373=>'L', -120374=>'L', -120375=>'L', -120376=>'L', -120377=>'L', -120378=>'L', -120379=>'L', -120380=>'L', -120381=>'L', -120382=>'L', -120383=>'L', -120384=>'L', -120385=>'L', -120386=>'L', -120387=>'L', -120388=>'L', -120389=>'L', -120390=>'L', -120391=>'L', -120392=>'L', -120393=>'L', -120394=>'L', -120395=>'L', -120396=>'L', -120397=>'L', -120398=>'L', -120399=>'L', -120400=>'L', -120401=>'L', -120402=>'L', -120403=>'L', -120404=>'L', -120405=>'L', -120406=>'L', -120407=>'L', -120408=>'L', -120409=>'L', -120410=>'L', -120411=>'L', -120412=>'L', -120413=>'L', -120414=>'L', -120415=>'L', -120416=>'L', -120417=>'L', -120418=>'L', -120419=>'L', -120420=>'L', -120421=>'L', -120422=>'L', -120423=>'L', -120424=>'L', -120425=>'L', -120426=>'L', -120427=>'L', -120428=>'L', -120429=>'L', -120430=>'L', -120431=>'L', -120432=>'L', -120433=>'L', -120434=>'L', -120435=>'L', -120436=>'L', -120437=>'L', -120438=>'L', -120439=>'L', -120440=>'L', -120441=>'L', -120442=>'L', -120443=>'L', -120444=>'L', -120445=>'L', -120446=>'L', -120447=>'L', -120448=>'L', -120449=>'L', -120450=>'L', -120451=>'L', -120452=>'L', -120453=>'L', -120454=>'L', -120455=>'L', -120456=>'L', -120457=>'L', -120458=>'L', -120459=>'L', -120460=>'L', -120461=>'L', -120462=>'L', -120463=>'L', -120464=>'L', -120465=>'L', -120466=>'L', -120467=>'L', -120468=>'L', -120469=>'L', -120470=>'L', -120471=>'L', -120472=>'L', -120473=>'L', -120474=>'L', -120475=>'L', -120476=>'L', -120477=>'L', -120478=>'L', -120479=>'L', -120480=>'L', -120481=>'L', -120482=>'L', -120483=>'L', -120484=>'L', -120485=>'L', -120488=>'L', -120489=>'L', -120490=>'L', -120491=>'L', -120492=>'L', -120493=>'L', -120494=>'L', -120495=>'L', -120496=>'L', -120497=>'L', -120498=>'L', -120499=>'L', -120500=>'L', -120501=>'L', -120502=>'L', -120503=>'L', -120504=>'L', -120505=>'L', -120506=>'L', -120507=>'L', -120508=>'L', -120509=>'L', -120510=>'L', -120511=>'L', -120512=>'L', -120513=>'L', -120514=>'L', -120515=>'L', -120516=>'L', -120517=>'L', -120518=>'L', -120519=>'L', -120520=>'L', -120521=>'L', -120522=>'L', -120523=>'L', -120524=>'L', -120525=>'L', -120526=>'L', -120527=>'L', -120528=>'L', -120529=>'L', -120530=>'L', -120531=>'L', -120532=>'L', -120533=>'L', -120534=>'L', -120535=>'L', -120536=>'L', -120537=>'L', -120538=>'L', -120539=>'L', -120540=>'L', -120541=>'L', -120542=>'L', -120543=>'L', -120544=>'L', -120545=>'L', -120546=>'L', -120547=>'L', -120548=>'L', -120549=>'L', -120550=>'L', -120551=>'L', -120552=>'L', -120553=>'L', -120554=>'L', -120555=>'L', -120556=>'L', -120557=>'L', -120558=>'L', -120559=>'L', -120560=>'L', -120561=>'L', -120562=>'L', -120563=>'L', -120564=>'L', -120565=>'L', -120566=>'L', -120567=>'L', -120568=>'L', -120569=>'L', -120570=>'L', -120571=>'L', -120572=>'L', -120573=>'L', -120574=>'L', -120575=>'L', -120576=>'L', -120577=>'L', -120578=>'L', -120579=>'L', -120580=>'L', -120581=>'L', -120582=>'L', -120583=>'L', -120584=>'L', -120585=>'L', -120586=>'L', -120587=>'L', -120588=>'L', -120589=>'L', -120590=>'L', -120591=>'L', -120592=>'L', -120593=>'L', -120594=>'L', -120595=>'L', -120596=>'L', -120597=>'L', -120598=>'L', -120599=>'L', -120600=>'L', -120601=>'L', -120602=>'L', -120603=>'L', -120604=>'L', -120605=>'L', -120606=>'L', -120607=>'L', -120608=>'L', -120609=>'L', -120610=>'L', -120611=>'L', -120612=>'L', -120613=>'L', -120614=>'L', -120615=>'L', -120616=>'L', -120617=>'L', -120618=>'L', -120619=>'L', -120620=>'L', -120621=>'L', -120622=>'L', -120623=>'L', -120624=>'L', -120625=>'L', -120626=>'L', -120627=>'L', -120628=>'L', -120629=>'L', -120630=>'L', -120631=>'L', -120632=>'L', -120633=>'L', -120634=>'L', -120635=>'L', -120636=>'L', -120637=>'L', -120638=>'L', -120639=>'L', -120640=>'L', -120641=>'L', -120642=>'L', -120643=>'L', -120644=>'L', -120645=>'L', -120646=>'L', -120647=>'L', -120648=>'L', -120649=>'L', -120650=>'L', -120651=>'L', -120652=>'L', -120653=>'L', -120654=>'L', -120655=>'L', -120656=>'L', -120657=>'L', -120658=>'L', -120659=>'L', -120660=>'L', -120661=>'L', -120662=>'L', -120663=>'L', -120664=>'L', -120665=>'L', -120666=>'L', -120667=>'L', -120668=>'L', -120669=>'L', -120670=>'L', -120671=>'L', -120672=>'L', -120673=>'L', -120674=>'L', -120675=>'L', -120676=>'L', -120677=>'L', -120678=>'L', -120679=>'L', -120680=>'L', -120681=>'L', -120682=>'L', -120683=>'L', -120684=>'L', -120685=>'L', -120686=>'L', -120687=>'L', -120688=>'L', -120689=>'L', -120690=>'L', -120691=>'L', -120692=>'L', -120693=>'L', -120694=>'L', -120695=>'L', -120696=>'L', -120697=>'L', -120698=>'L', -120699=>'L', -120700=>'L', -120701=>'L', -120702=>'L', -120703=>'L', -120704=>'L', -120705=>'L', -120706=>'L', -120707=>'L', -120708=>'L', -120709=>'L', -120710=>'L', -120711=>'L', -120712=>'L', -120713=>'L', -120714=>'L', -120715=>'L', -120716=>'L', -120717=>'L', -120718=>'L', -120719=>'L', -120720=>'L', -120721=>'L', -120722=>'L', -120723=>'L', -120724=>'L', -120725=>'L', -120726=>'L', -120727=>'L', -120728=>'L', -120729=>'L', -120730=>'L', -120731=>'L', -120732=>'L', -120733=>'L', -120734=>'L', -120735=>'L', -120736=>'L', -120737=>'L', -120738=>'L', -120739=>'L', -120740=>'L', -120741=>'L', -120742=>'L', -120743=>'L', -120744=>'L', -120745=>'L', -120746=>'L', -120747=>'L', -120748=>'L', -120749=>'L', -120750=>'L', -120751=>'L', -120752=>'L', -120753=>'L', -120754=>'L', -120755=>'L', -120756=>'L', -120757=>'L', -120758=>'L', -120759=>'L', -120760=>'L', -120761=>'L', -120762=>'L', -120763=>'L', -120764=>'L', -120765=>'L', -120766=>'L', -120767=>'L', -120768=>'L', -120769=>'L', -120770=>'L', -120771=>'L', -120772=>'L', -120773=>'L', -120774=>'L', -120775=>'L', -120776=>'L', -120777=>'L', -120778=>'L', -120779=>'L', -120782=>'EN', -120783=>'EN', -120784=>'EN', -120785=>'EN', -120786=>'EN', -120787=>'EN', -120788=>'EN', -120789=>'EN', -120790=>'EN', -120791=>'EN', -120792=>'EN', -120793=>'EN', -120794=>'EN', -120795=>'EN', -120796=>'EN', -120797=>'EN', -120798=>'EN', -120799=>'EN', -120800=>'EN', -120801=>'EN', -120802=>'EN', -120803=>'EN', -120804=>'EN', -120805=>'EN', -120806=>'EN', -120807=>'EN', -120808=>'EN', -120809=>'EN', -120810=>'EN', -120811=>'EN', -120812=>'EN', -120813=>'EN', -120814=>'EN', -120815=>'EN', -120816=>'EN', -120817=>'EN', -120818=>'EN', -120819=>'EN', -120820=>'EN', -120821=>'EN', -120822=>'EN', -120823=>'EN', -120824=>'EN', -120825=>'EN', -120826=>'EN', -120827=>'EN', -120828=>'EN', -120829=>'EN', -120830=>'EN', -120831=>'EN', -131072=>'L', -173782=>'L', -194560=>'L', -194561=>'L', -194562=>'L', -194563=>'L', -194564=>'L', -194565=>'L', -194566=>'L', -194567=>'L', -194568=>'L', -194569=>'L', -194570=>'L', -194571=>'L', -194572=>'L', -194573=>'L', -194574=>'L', -194575=>'L', -194576=>'L', -194577=>'L', -194578=>'L', -194579=>'L', -194580=>'L', -194581=>'L', -194582=>'L', -194583=>'L', -194584=>'L', -194585=>'L', -194586=>'L', -194587=>'L', -194588=>'L', -194589=>'L', -194590=>'L', -194591=>'L', -194592=>'L', -194593=>'L', -194594=>'L', -194595=>'L', -194596=>'L', -194597=>'L', -194598=>'L', -194599=>'L', -194600=>'L', -194601=>'L', -194602=>'L', -194603=>'L', -194604=>'L', -194605=>'L', -194606=>'L', -194607=>'L', -194608=>'L', -194609=>'L', -194610=>'L', -194611=>'L', -194612=>'L', -194613=>'L', -194614=>'L', -194615=>'L', -194616=>'L', -194617=>'L', -194618=>'L', -194619=>'L', -194620=>'L', -194621=>'L', -194622=>'L', -194623=>'L', -194624=>'L', -194625=>'L', -194626=>'L', -194627=>'L', -194628=>'L', -194629=>'L', -194630=>'L', -194631=>'L', -194632=>'L', -194633=>'L', -194634=>'L', -194635=>'L', -194636=>'L', -194637=>'L', -194638=>'L', -194639=>'L', -194640=>'L', -194641=>'L', -194642=>'L', -194643=>'L', -194644=>'L', -194645=>'L', -194646=>'L', -194647=>'L', -194648=>'L', -194649=>'L', -194650=>'L', -194651=>'L', -194652=>'L', -194653=>'L', -194654=>'L', -194655=>'L', -194656=>'L', -194657=>'L', -194658=>'L', -194659=>'L', -194660=>'L', -194661=>'L', -194662=>'L', -194663=>'L', -194664=>'L', -194665=>'L', -194666=>'L', -194667=>'L', -194668=>'L', -194669=>'L', -194670=>'L', -194671=>'L', -194672=>'L', -194673=>'L', -194674=>'L', -194675=>'L', -194676=>'L', -194677=>'L', -194678=>'L', -194679=>'L', -194680=>'L', -194681=>'L', -194682=>'L', -194683=>'L', -194684=>'L', -194685=>'L', -194686=>'L', -194687=>'L', -194688=>'L', -194689=>'L', -194690=>'L', -194691=>'L', -194692=>'L', -194693=>'L', -194694=>'L', -194695=>'L', -194696=>'L', -194697=>'L', -194698=>'L', -194699=>'L', -194700=>'L', -194701=>'L', -194702=>'L', -194703=>'L', -194704=>'L', -194705=>'L', -194706=>'L', -194707=>'L', -194708=>'L', -194709=>'L', -194710=>'L', -194711=>'L', -194712=>'L', -194713=>'L', -194714=>'L', -194715=>'L', -194716=>'L', -194717=>'L', -194718=>'L', -194719=>'L', -194720=>'L', -194721=>'L', -194722=>'L', -194723=>'L', -194724=>'L', -194725=>'L', -194726=>'L', -194727=>'L', -194728=>'L', -194729=>'L', -194730=>'L', -194731=>'L', -194732=>'L', -194733=>'L', -194734=>'L', -194735=>'L', -194736=>'L', -194737=>'L', -194738=>'L', -194739=>'L', -194740=>'L', -194741=>'L', -194742=>'L', -194743=>'L', -194744=>'L', -194745=>'L', -194746=>'L', -194747=>'L', -194748=>'L', -194749=>'L', -194750=>'L', -194751=>'L', -194752=>'L', -194753=>'L', -194754=>'L', -194755=>'L', -194756=>'L', -194757=>'L', -194758=>'L', -194759=>'L', -194760=>'L', -194761=>'L', -194762=>'L', -194763=>'L', -194764=>'L', -194765=>'L', -194766=>'L', -194767=>'L', -194768=>'L', -194769=>'L', -194770=>'L', -194771=>'L', -194772=>'L', -194773=>'L', -194774=>'L', -194775=>'L', -194776=>'L', -194777=>'L', -194778=>'L', -194779=>'L', -194780=>'L', -194781=>'L', -194782=>'L', -194783=>'L', -194784=>'L', -194785=>'L', -194786=>'L', -194787=>'L', -194788=>'L', -194789=>'L', -194790=>'L', -194791=>'L', -194792=>'L', -194793=>'L', -194794=>'L', -194795=>'L', -194796=>'L', -194797=>'L', -194798=>'L', -194799=>'L', -194800=>'L', -194801=>'L', -194802=>'L', -194803=>'L', -194804=>'L', -194805=>'L', -194806=>'L', -194807=>'L', -194808=>'L', -194809=>'L', -194810=>'L', -194811=>'L', -194812=>'L', -194813=>'L', -194814=>'L', -194815=>'L', -194816=>'L', -194817=>'L', -194818=>'L', -194819=>'L', -194820=>'L', -194821=>'L', -194822=>'L', -194823=>'L', -194824=>'L', -194825=>'L', -194826=>'L', -194827=>'L', -194828=>'L', -194829=>'L', -194830=>'L', -194831=>'L', -194832=>'L', -194833=>'L', -194834=>'L', -194835=>'L', -194836=>'L', -194837=>'L', -194838=>'L', -194839=>'L', -194840=>'L', -194841=>'L', -194842=>'L', -194843=>'L', -194844=>'L', -194845=>'L', -194846=>'L', -194847=>'L', -194848=>'L', -194849=>'L', -194850=>'L', -194851=>'L', -194852=>'L', -194853=>'L', -194854=>'L', -194855=>'L', -194856=>'L', -194857=>'L', -194858=>'L', -194859=>'L', -194860=>'L', -194861=>'L', -194862=>'L', -194863=>'L', -194864=>'L', -194865=>'L', -194866=>'L', -194867=>'L', -194868=>'L', -194869=>'L', -194870=>'L', -194871=>'L', -194872=>'L', -194873=>'L', -194874=>'L', -194875=>'L', -194876=>'L', -194877=>'L', -194878=>'L', -194879=>'L', -194880=>'L', -194881=>'L', -194882=>'L', -194883=>'L', -194884=>'L', -194885=>'L', -194886=>'L', -194887=>'L', -194888=>'L', -194889=>'L', -194890=>'L', -194891=>'L', -194892=>'L', -194893=>'L', -194894=>'L', -194895=>'L', -194896=>'L', -194897=>'L', -194898=>'L', -194899=>'L', -194900=>'L', -194901=>'L', -194902=>'L', -194903=>'L', -194904=>'L', -194905=>'L', -194906=>'L', -194907=>'L', -194908=>'L', -194909=>'L', -194910=>'L', -194911=>'L', -194912=>'L', -194913=>'L', -194914=>'L', -194915=>'L', -194916=>'L', -194917=>'L', -194918=>'L', -194919=>'L', -194920=>'L', -194921=>'L', -194922=>'L', -194923=>'L', -194924=>'L', -194925=>'L', -194926=>'L', -194927=>'L', -194928=>'L', -194929=>'L', -194930=>'L', -194931=>'L', -194932=>'L', -194933=>'L', -194934=>'L', -194935=>'L', -194936=>'L', -194937=>'L', -194938=>'L', -194939=>'L', -194940=>'L', -194941=>'L', -194942=>'L', -194943=>'L', -194944=>'L', -194945=>'L', -194946=>'L', -194947=>'L', -194948=>'L', -194949=>'L', -194950=>'L', -194951=>'L', -194952=>'L', -194953=>'L', -194954=>'L', -194955=>'L', -194956=>'L', -194957=>'L', -194958=>'L', -194959=>'L', -194960=>'L', -194961=>'L', -194962=>'L', -194963=>'L', -194964=>'L', -194965=>'L', -194966=>'L', -194967=>'L', -194968=>'L', -194969=>'L', -194970=>'L', -194971=>'L', -194972=>'L', -194973=>'L', -194974=>'L', -194975=>'L', -194976=>'L', -194977=>'L', -194978=>'L', -194979=>'L', -194980=>'L', -194981=>'L', -194982=>'L', -194983=>'L', -194984=>'L', -194985=>'L', -194986=>'L', -194987=>'L', -194988=>'L', -194989=>'L', -194990=>'L', -194991=>'L', -194992=>'L', -194993=>'L', -194994=>'L', -194995=>'L', -194996=>'L', -194997=>'L', -194998=>'L', -194999=>'L', -195000=>'L', -195001=>'L', -195002=>'L', -195003=>'L', -195004=>'L', -195005=>'L', -195006=>'L', -195007=>'L', -195008=>'L', -195009=>'L', -195010=>'L', -195011=>'L', -195012=>'L', -195013=>'L', -195014=>'L', -195015=>'L', -195016=>'L', -195017=>'L', -195018=>'L', -195019=>'L', -195020=>'L', -195021=>'L', -195022=>'L', -195023=>'L', -195024=>'L', -195025=>'L', -195026=>'L', -195027=>'L', -195028=>'L', -195029=>'L', -195030=>'L', -195031=>'L', -195032=>'L', -195033=>'L', -195034=>'L', -195035=>'L', -195036=>'L', -195037=>'L', -195038=>'L', -195039=>'L', -195040=>'L', -195041=>'L', -195042=>'L', -195043=>'L', -195044=>'L', -195045=>'L', -195046=>'L', -195047=>'L', -195048=>'L', -195049=>'L', -195050=>'L', -195051=>'L', -195052=>'L', -195053=>'L', -195054=>'L', -195055=>'L', -195056=>'L', -195057=>'L', -195058=>'L', -195059=>'L', -195060=>'L', -195061=>'L', -195062=>'L', -195063=>'L', -195064=>'L', -195065=>'L', -195066=>'L', -195067=>'L', -195068=>'L', -195069=>'L', -195070=>'L', -195071=>'L', -195072=>'L', -195073=>'L', -195074=>'L', -195075=>'L', -195076=>'L', -195077=>'L', -195078=>'L', -195079=>'L', -195080=>'L', -195081=>'L', -195082=>'L', -195083=>'L', -195084=>'L', -195085=>'L', -195086=>'L', -195087=>'L', -195088=>'L', -195089=>'L', -195090=>'L', -195091=>'L', -195092=>'L', -195093=>'L', -195094=>'L', -195095=>'L', -195096=>'L', -195097=>'L', -195098=>'L', -195099=>'L', -195100=>'L', -195101=>'L', -917505=>'BN', -917536=>'BN', -917537=>'BN', -917538=>'BN', -917539=>'BN', -917540=>'BN', -917541=>'BN', -917542=>'BN', -917543=>'BN', -917544=>'BN', -917545=>'BN', -917546=>'BN', -917547=>'BN', -917548=>'BN', -917549=>'BN', -917550=>'BN', -917551=>'BN', -917552=>'BN', -917553=>'BN', -917554=>'BN', -917555=>'BN', -917556=>'BN', -917557=>'BN', -917558=>'BN', -917559=>'BN', -917560=>'BN', -917561=>'BN', -917562=>'BN', -917563=>'BN', -917564=>'BN', -917565=>'BN', -917566=>'BN', -917567=>'BN', -917568=>'BN', -917569=>'BN', -917570=>'BN', -917571=>'BN', -917572=>'BN', -917573=>'BN', -917574=>'BN', -917575=>'BN', -917576=>'BN', -917577=>'BN', -917578=>'BN', -917579=>'BN', -917580=>'BN', -917581=>'BN', -917582=>'BN', -917583=>'BN', -917584=>'BN', -917585=>'BN', -917586=>'BN', -917587=>'BN', -917588=>'BN', -917589=>'BN', -917590=>'BN', -917591=>'BN', -917592=>'BN', -917593=>'BN', -917594=>'BN', -917595=>'BN', -917596=>'BN', -917597=>'BN', -917598=>'BN', -917599=>'BN', -917600=>'BN', -917601=>'BN', -917602=>'BN', -917603=>'BN', -917604=>'BN', -917605=>'BN', -917606=>'BN', -917607=>'BN', -917608=>'BN', -917609=>'BN', -917610=>'BN', -917611=>'BN', -917612=>'BN', -917613=>'BN', -917614=>'BN', -917615=>'BN', -917616=>'BN', -917617=>'BN', -917618=>'BN', -917619=>'BN', -917620=>'BN', -917621=>'BN', -917622=>'BN', -917623=>'BN', -917624=>'BN', -917625=>'BN', -917626=>'BN', -917627=>'BN', -917628=>'BN', -917629=>'BN', -917630=>'BN', -917631=>'BN', -917760=>'NSM', -917761=>'NSM', -917762=>'NSM', -917763=>'NSM', -917764=>'NSM', -917765=>'NSM', -917766=>'NSM', -917767=>'NSM', -917768=>'NSM', -917769=>'NSM', -917770=>'NSM', -917771=>'NSM', -917772=>'NSM', -917773=>'NSM', -917774=>'NSM', -917775=>'NSM', -917776=>'NSM', -917777=>'NSM', -917778=>'NSM', -917779=>'NSM', -917780=>'NSM', -917781=>'NSM', -917782=>'NSM', -917783=>'NSM', -917784=>'NSM', -917785=>'NSM', -917786=>'NSM', -917787=>'NSM', -917788=>'NSM', -917789=>'NSM', -917790=>'NSM', -917791=>'NSM', -917792=>'NSM', -917793=>'NSM', -917794=>'NSM', -917795=>'NSM', -917796=>'NSM', -917797=>'NSM', -917798=>'NSM', -917799=>'NSM', -917800=>'NSM', -917801=>'NSM', -917802=>'NSM', -917803=>'NSM', -917804=>'NSM', -917805=>'NSM', -917806=>'NSM', -917807=>'NSM', -917808=>'NSM', -917809=>'NSM', -917810=>'NSM', -917811=>'NSM', -917812=>'NSM', -917813=>'NSM', -917814=>'NSM', -917815=>'NSM', -917816=>'NSM', -917817=>'NSM', -917818=>'NSM', -917819=>'NSM', -917820=>'NSM', -917821=>'NSM', -917822=>'NSM', -917823=>'NSM', -917824=>'NSM', -917825=>'NSM', -917826=>'NSM', -917827=>'NSM', -917828=>'NSM', -917829=>'NSM', -917830=>'NSM', -917831=>'NSM', -917832=>'NSM', -917833=>'NSM', -917834=>'NSM', -917835=>'NSM', -917836=>'NSM', -917837=>'NSM', -917838=>'NSM', -917839=>'NSM', -917840=>'NSM', -917841=>'NSM', -917842=>'NSM', -917843=>'NSM', -917844=>'NSM', -917845=>'NSM', -917846=>'NSM', -917847=>'NSM', -917848=>'NSM', -917849=>'NSM', -917850=>'NSM', -917851=>'NSM', -917852=>'NSM', -917853=>'NSM', -917854=>'NSM', -917855=>'NSM', -917856=>'NSM', -917857=>'NSM', -917858=>'NSM', -917859=>'NSM', -917860=>'NSM', -917861=>'NSM', -917862=>'NSM', -917863=>'NSM', -917864=>'NSM', -917865=>'NSM', -917866=>'NSM', -917867=>'NSM', -917868=>'NSM', -917869=>'NSM', -917870=>'NSM', -917871=>'NSM', -917872=>'NSM', -917873=>'NSM', -917874=>'NSM', -917875=>'NSM', -917876=>'NSM', -917877=>'NSM', -917878=>'NSM', -917879=>'NSM', -917880=>'NSM', -917881=>'NSM', -917882=>'NSM', -917883=>'NSM', -917884=>'NSM', -917885=>'NSM', -917886=>'NSM', -917887=>'NSM', -917888=>'NSM', -917889=>'NSM', -917890=>'NSM', -917891=>'NSM', -917892=>'NSM', -917893=>'NSM', -917894=>'NSM', -917895=>'NSM', -917896=>'NSM', -917897=>'NSM', -917898=>'NSM', -917899=>'NSM', -917900=>'NSM', -917901=>'NSM', -917902=>'NSM', -917903=>'NSM', -917904=>'NSM', -917905=>'NSM', -917906=>'NSM', -917907=>'NSM', -917908=>'NSM', -917909=>'NSM', -917910=>'NSM', -917911=>'NSM', -917912=>'NSM', -917913=>'NSM', -917914=>'NSM', -917915=>'NSM', -917916=>'NSM', -917917=>'NSM', -917918=>'NSM', -917919=>'NSM', -917920=>'NSM', -917921=>'NSM', -917922=>'NSM', -917923=>'NSM', -917924=>'NSM', -917925=>'NSM', -917926=>'NSM', -917927=>'NSM', -917928=>'NSM', -917929=>'NSM', -917930=>'NSM', -917931=>'NSM', -917932=>'NSM', -917933=>'NSM', -917934=>'NSM', -917935=>'NSM', -917936=>'NSM', -917937=>'NSM', -917938=>'NSM', -917939=>'NSM', -917940=>'NSM', -917941=>'NSM', -917942=>'NSM', -917943=>'NSM', -917944=>'NSM', -917945=>'NSM', -917946=>'NSM', -917947=>'NSM', -917948=>'NSM', -917949=>'NSM', -917950=>'NSM', -917951=>'NSM', -917952=>'NSM', -917953=>'NSM', -917954=>'NSM', -917955=>'NSM', -917956=>'NSM', -917957=>'NSM', -917958=>'NSM', -917959=>'NSM', -917960=>'NSM', -917961=>'NSM', -917962=>'NSM', -917963=>'NSM', -917964=>'NSM', -917965=>'NSM', -917966=>'NSM', -917967=>'NSM', -917968=>'NSM', -917969=>'NSM', -917970=>'NSM', -917971=>'NSM', -917972=>'NSM', -917973=>'NSM', -917974=>'NSM', -917975=>'NSM', -917976=>'NSM', -917977=>'NSM', -917978=>'NSM', -917979=>'NSM', -917980=>'NSM', -917981=>'NSM', -917982=>'NSM', -917983=>'NSM', -917984=>'NSM', -917985=>'NSM', -917986=>'NSM', -917987=>'NSM', -917988=>'NSM', -917989=>'NSM', -917990=>'NSM', -917991=>'NSM', -917992=>'NSM', -917993=>'NSM', -917994=>'NSM', -917995=>'NSM', -917996=>'NSM', -917997=>'NSM', -917998=>'NSM', -917999=>'NSM', -983040=>'L', -1048573=>'L', -1048576=>'L', -1114109=>'L' -); - -/** - * @var Mirror unicode characters. - * For information on bidi mirroring, see UAX #9: Bidirectional Algorithm, - * at http://www.unicode.org/unicode/reports/tr9/ - * @access public - */ -public $uni_mirror = array ( -0x0028=>0x0029, -0x0029=>0x0028, -0x003C=>0x003E, -0x003E=>0x003C, -0x005B=>0x005D, -0x005D=>0x005B, -0x007B=>0x007D, -0x007D=>0x007B, -0x00AB=>0x00BB, -0x00BB=>0x00AB, -0x0F3A=>0x0F3B, -0x0F3B=>0x0F3A, -0x0F3C=>0x0F3D, -0x0F3D=>0x0F3C, -0x169B=>0x169C, -0x169C=>0x169B, -0x2018=>0x2019, -0x2019=>0x2018, -0x201C=>0x201D, -0x201D=>0x201C, -0x2039=>0x203A, -0x203A=>0x2039, -0x2045=>0x2046, -0x2046=>0x2045, -0x207D=>0x207E, -0x207E=>0x207D, -0x208D=>0x208E, -0x208E=>0x208D, -0x2208=>0x220B, -0x2209=>0x220C, -0x220A=>0x220D, -0x220B=>0x2208, -0x220C=>0x2209, -0x220D=>0x220A, -0x2215=>0x29F5, -0x223C=>0x223D, -0x223D=>0x223C, -0x2243=>0x22CD, -0x2252=>0x2253, -0x2253=>0x2252, -0x2254=>0x2255, -0x2255=>0x2254, -0x2264=>0x2265, -0x2265=>0x2264, -0x2266=>0x2267, -0x2267=>0x2266, -0x2268=>0x2269, -0x2269=>0x2268, -0x226A=>0x226B, -0x226B=>0x226A, -0x226E=>0x226F, -0x226F=>0x226E, -0x2270=>0x2271, -0x2271=>0x2270, -0x2272=>0x2273, -0x2273=>0x2272, -0x2274=>0x2275, -0x2275=>0x2274, -0x2276=>0x2277, -0x2277=>0x2276, -0x2278=>0x2279, -0x2279=>0x2278, -0x227A=>0x227B, -0x227B=>0x227A, -0x227C=>0x227D, -0x227D=>0x227C, -0x227E=>0x227F, -0x227F=>0x227E, -0x2280=>0x2281, -0x2281=>0x2280, -0x2282=>0x2283, -0x2283=>0x2282, -0x2284=>0x2285, -0x2285=>0x2284, -0x2286=>0x2287, -0x2287=>0x2286, -0x2288=>0x2289, -0x2289=>0x2288, -0x228A=>0x228B, -0x228B=>0x228A, -0x228F=>0x2290, -0x2290=>0x228F, -0x2291=>0x2292, -0x2292=>0x2291, -0x2298=>0x29B8, -0x22A2=>0x22A3, -0x22A3=>0x22A2, -0x22A6=>0x2ADE, -0x22A8=>0x2AE4, -0x22A9=>0x2AE3, -0x22AB=>0x2AE5, -0x22B0=>0x22B1, -0x22B1=>0x22B0, -0x22B2=>0x22B3, -0x22B3=>0x22B2, -0x22B4=>0x22B5, -0x22B5=>0x22B4, -0x22B6=>0x22B7, -0x22B7=>0x22B6, -0x22C9=>0x22CA, -0x22CA=>0x22C9, -0x22CB=>0x22CC, -0x22CC=>0x22CB, -0x22CD=>0x2243, -0x22D0=>0x22D1, -0x22D1=>0x22D0, -0x22D6=>0x22D7, -0x22D7=>0x22D6, -0x22D8=>0x22D9, -0x22D9=>0x22D8, -0x22DA=>0x22DB, -0x22DB=>0x22DA, -0x22DC=>0x22DD, -0x22DD=>0x22DC, -0x22DE=>0x22DF, -0x22DF=>0x22DE, -0x22E0=>0x22E1, -0x22E1=>0x22E0, -0x22E2=>0x22E3, -0x22E3=>0x22E2, -0x22E4=>0x22E5, -0x22E5=>0x22E4, -0x22E6=>0x22E7, -0x22E7=>0x22E6, -0x22E8=>0x22E9, -0x22E9=>0x22E8, -0x22EA=>0x22EB, -0x22EB=>0x22EA, -0x22EC=>0x22ED, -0x22ED=>0x22EC, -0x22F0=>0x22F1, -0x22F1=>0x22F0, -0x22F2=>0x22FA, -0x22F3=>0x22FB, -0x22F4=>0x22FC, -0x22F6=>0x22FD, -0x22F7=>0x22FE, -0x22FA=>0x22F2, -0x22FB=>0x22F3, -0x22FC=>0x22F4, -0x22FD=>0x22F6, -0x22FE=>0x22F7, -0x2308=>0x2309, -0x2309=>0x2308, -0x230A=>0x230B, -0x230B=>0x230A, -0x2329=>0x232A, -0x232A=>0x2329, -0x2768=>0x2769, -0x2769=>0x2768, -0x276A=>0x276B, -0x276B=>0x276A, -0x276C=>0x276D, -0x276D=>0x276C, -0x276E=>0x276F, -0x276F=>0x276E, -0x2770=>0x2771, -0x2771=>0x2770, -0x2772=>0x2773, -0x2773=>0x2772, -0x2774=>0x2775, -0x2775=>0x2774, -0x27C3=>0x27C4, -0x27C4=>0x27C3, -0x27C5=>0x27C6, -0x27C6=>0x27C5, -0x27D5=>0x27D6, -0x27D6=>0x27D5, -0x27DD=>0x27DE, -0x27DE=>0x27DD, -0x27E2=>0x27E3, -0x27E3=>0x27E2, -0x27E4=>0x27E5, -0x27E5=>0x27E4, -0x27E6=>0x27E7, -0x27E7=>0x27E6, -0x27E8=>0x27E9, -0x27E9=>0x27E8, -0x27EA=>0x27EB, -0x27EB=>0x27EA, -0x2983=>0x2984, -0x2984=>0x2983, -0x2985=>0x2986, -0x2986=>0x2985, -0x2987=>0x2988, -0x2988=>0x2987, -0x2989=>0x298A, -0x298A=>0x2989, -0x298B=>0x298C, -0x298C=>0x298B, -0x298D=>0x2990, -0x298E=>0x298F, -0x298F=>0x298E, -0x2990=>0x298D, -0x2991=>0x2992, -0x2992=>0x2991, -0x2993=>0x2994, -0x2994=>0x2993, -0x2995=>0x2996, -0x2996=>0x2995, -0x2997=>0x2998, -0x2998=>0x2997, -0x29B8=>0x2298, -0x29C0=>0x29C1, -0x29C1=>0x29C0, -0x29C4=>0x29C5, -0x29C5=>0x29C4, -0x29CF=>0x29D0, -0x29D0=>0x29CF, -0x29D1=>0x29D2, -0x29D2=>0x29D1, -0x29D4=>0x29D5, -0x29D5=>0x29D4, -0x29D8=>0x29D9, -0x29D9=>0x29D8, -0x29DA=>0x29DB, -0x29DB=>0x29DA, -0x29F5=>0x2215, -0x29F8=>0x29F9, -0x29F9=>0x29F8, -0x29FC=>0x29FD, -0x29FD=>0x29FC, -0x2A2B=>0x2A2C, -0x2A2C=>0x2A2B, -0x2A2D=>0x2A2E, -0x2A2E=>0x2A2D, -0x2A34=>0x2A35, -0x2A35=>0x2A34, -0x2A3C=>0x2A3D, -0x2A3D=>0x2A3C, -0x2A64=>0x2A65, -0x2A65=>0x2A64, -0x2A79=>0x2A7A, -0x2A7A=>0x2A79, -0x2A7D=>0x2A7E, -0x2A7E=>0x2A7D, -0x2A7F=>0x2A80, -0x2A80=>0x2A7F, -0x2A81=>0x2A82, -0x2A82=>0x2A81, -0x2A83=>0x2A84, -0x2A84=>0x2A83, -0x2A8B=>0x2A8C, -0x2A8C=>0x2A8B, -0x2A91=>0x2A92, -0x2A92=>0x2A91, -0x2A93=>0x2A94, -0x2A94=>0x2A93, -0x2A95=>0x2A96, -0x2A96=>0x2A95, -0x2A97=>0x2A98, -0x2A98=>0x2A97, -0x2A99=>0x2A9A, -0x2A9A=>0x2A99, -0x2A9B=>0x2A9C, -0x2A9C=>0x2A9B, -0x2AA1=>0x2AA2, -0x2AA2=>0x2AA1, -0x2AA6=>0x2AA7, -0x2AA7=>0x2AA6, -0x2AA8=>0x2AA9, -0x2AA9=>0x2AA8, -0x2AAA=>0x2AAB, -0x2AAB=>0x2AAA, -0x2AAC=>0x2AAD, -0x2AAD=>0x2AAC, -0x2AAF=>0x2AB0, -0x2AB0=>0x2AAF, -0x2AB3=>0x2AB4, -0x2AB4=>0x2AB3, -0x2ABB=>0x2ABC, -0x2ABC=>0x2ABB, -0x2ABD=>0x2ABE, -0x2ABE=>0x2ABD, -0x2ABF=>0x2AC0, -0x2AC0=>0x2ABF, -0x2AC1=>0x2AC2, -0x2AC2=>0x2AC1, -0x2AC3=>0x2AC4, -0x2AC4=>0x2AC3, -0x2AC5=>0x2AC6, -0x2AC6=>0x2AC5, -0x2ACD=>0x2ACE, -0x2ACE=>0x2ACD, -0x2ACF=>0x2AD0, -0x2AD0=>0x2ACF, -0x2AD1=>0x2AD2, -0x2AD2=>0x2AD1, -0x2AD3=>0x2AD4, -0x2AD4=>0x2AD3, -0x2AD5=>0x2AD6, -0x2AD6=>0x2AD5, -0x2ADE=>0x22A6, -0x2AE3=>0x22A9, -0x2AE4=>0x22A8, -0x2AE5=>0x22AB, -0x2AEC=>0x2AED, -0x2AED=>0x2AEC, -0x2AF7=>0x2AF8, -0x2AF8=>0x2AF7, -0x2AF9=>0x2AFA, -0x2AFA=>0x2AF9, -0x2E02=>0x2E03, -0x2E03=>0x2E02, -0x2E04=>0x2E05, -0x2E05=>0x2E04, -0x2E09=>0x2E0A, -0x2E0A=>0x2E09, -0x2E0C=>0x2E0D, -0x2E0D=>0x2E0C, -0x2E1C=>0x2E1D, -0x2E1D=>0x2E1C, -0x3008=>0x3009, -0x3009=>0x3008, -0x300A=>0x300B, -0x300B=>0x300A, -0x300C=>0x300D, -0x300D=>0x300C, -0x300E=>0x300F, -0x300F=>0x300E, -0x3010=>0x3011, -0x3011=>0x3010, -0x3014=>0x3015, -0x3015=>0x3014, -0x3016=>0x3017, -0x3017=>0x3016, -0x3018=>0x3019, -0x3019=>0x3018, -0x301A=>0x301B, -0x301B=>0x301A, -0x301D=>0x301E, -0x301E=>0x301D, -0xFE59=>0xFE5A, -0xFE5A=>0xFE59, -0xFE5B=>0xFE5C, -0xFE5C=>0xFE5B, -0xFE5D=>0xFE5E, -0xFE5E=>0xFE5D, -0xFE64=>0xFE65, -0xFE65=>0xFE64, -0xFF08=>0xFF09, -0xFF09=>0xFF08, -0xFF1C=>0xFF1E, -0xFF1E=>0xFF1C, -0xFF3B=>0xFF3D, -0xFF3D=>0xFF3B, -0xFF5B=>0xFF5D, -0xFF5D=>0xFF5B, -0xFF5F=>0xFF60, -0xFF60=>0xFF5F, -0xFF62=>0xFF63, -0xFF63=>0xFF62); - -/** - * @var Arabic shape substitutions: char code => (isolated, final, initial, medial) - * @access public - */ -public $uni_arabicsubst = array( -1569=>array(65152), -1570=>array(65153, 65154, 65153, 65154), -1571=>array(65155, 65156, 65155, 65156), -1572=>array(65157, 65158), -1573=>array(65159, 65160, 65159, 65160), -1574=>array(65161, 65162, 65163, 65164), -1575=>array(65165, 65166, 65165, 65166), -1576=>array(65167, 65168, 65169, 65170), -1577=>array(65171, 65172), -1578=>array(65173, 65174, 65175, 65176), -1579=>array(65177, 65178, 65179, 65180), -1580=>array(65181, 65182, 65183, 65184), -1581=>array(65185, 65186, 65187, 65188), -1582=>array(65189, 65190, 65191, 65192), -1583=>array(65193, 65194, 65193, 65194), -1584=>array(65195, 65196, 65195, 65196), -1585=>array(65197, 65198, 65197, 65198), -1586=>array(65199, 65200, 65199, 65200), -1587=>array(65201, 65202, 65203, 65204), -1588=>array(65205, 65206, 65207, 65208), -1589=>array(65209, 65210, 65211, 65212), -1590=>array(65213, 65214, 65215, 65216), -1591=>array(65217, 65218, 65219, 65220), -1592=>array(65221, 65222, 65223, 65224), -1593=>array(65225, 65226, 65227, 65228), -1594=>array(65229, 65230, 65231, 65232), -1601=>array(65233, 65234, 65235, 65236), -1602=>array(65237, 65238, 65239, 65240), -1603=>array(65241, 65242, 65243, 65244), -1604=>array(65245, 65246, 65247, 65248), -1605=>array(65249, 65250, 65251, 65252), -1606=>array(65253, 65254, 65255, 65256), -1607=>array(65257, 65258, 65259, 65260), -1608=>array(65261, 65262, 65261, 65262), -1609=>array(65263, 65264, 64488, 64489), -1610=>array(65265, 65266, 65267, 65268), -1649=>array(64336, 64337), -1655=>array(64477), -1657=>array(64358, 64359, 64360, 64361), -1658=>array(64350, 64351, 64352, 64353), -1659=>array(64338, 64339, 64340, 64341), -1662=>array(64342, 64343, 64344, 64345), -1663=>array(64354, 64355, 64356, 64357), -1664=>array(64346, 64347, 64348, 64349), -1667=>array(64374, 64375, 64376, 64377), -1668=>array(64370, 64371, 64372, 64373), -1670=>array(64378, 64379, 64380, 64381), -1671=>array(64382, 64383, 64384, 64385), -1672=>array(64392, 64393), -1676=>array(64388, 64389), -1677=>array(64386, 64387), -1678=>array(64390, 64391), -1681=>array(64396, 64397), -1688=>array(64394, 64395, 64394, 64395), -1700=>array(64362, 64363, 64364, 64365), -1702=>array(64366, 64367, 64368, 64369), -1705=>array(64398, 64399, 64400, 64401), -1709=>array(64467, 64468, 64469, 64470), -1711=>array(64402, 64403, 64404, 64405), -1713=>array(64410, 64411, 64412, 64413), -1715=>array(64406, 64407, 64408, 64409), -1722=>array(64414, 64415), -1723=>array(64416, 64417, 64418, 64419), -1726=>array(64426, 64427, 64428, 64429), -1728=>array(64420, 64421), -1729=>array(64422, 64423, 64424, 64425), -1733=>array(64480, 64481), -1734=>array(64473, 64474), -1735=>array(64471, 64472), -1736=>array(64475, 64476), -1737=>array(64482, 64483), -1739=>array(64478, 64479), -1740=>array(64508, 64509, 64510, 64511), -1744=>array(64484, 64485, 64486, 64487), -1746=>array(64430, 64431), -1747=>array(64432, 64433) -); - -/** - * @var Arabic laa letter: char code => isolated, final, initial, medial - * @access public - */ -public $uni_laa_array = array ( -1570 =>array(65269, 65270, 65269, 65270), -1571 =>array(65271, 65272, 65271, 65272), -1573 =>array(65273, 65274, 65273, 65274), -1575 =>array(65275, 65276, 65275, 65276) -); - -/** - * @var Array of character substitutions for sequences of two diacritics symbols. - * Putting the combining mark and character in the same glyph allows us to avoid the two marks overlapping each other in an illegible manner. - * second NSM char code => substitution char - * @access public - */ -public $uni_diacritics = array ( -1612=>64606, # Shadda + Dammatan -1613=>64607, # Shadda + Kasratan -1614=>64608, # Shadda + Fatha -1615=>64609, # Shadda + Damma -1616=>64610 # Shadda + Kasra -); - -/** - * @var Array of character substitutions from UTF-8 Unicode to Latin1 - * @access public - */ -public $uni_utf8tolatin = array ( -8364=>128, # Euro1 -338=>140, # OE -352=>138, # Scaron -376=>159, # Ydieresis -381=>142, # Zcaron2 -8226=>149, # bullet3 -710=>136, # circumflex -8224=>134, # dagger -8225=>135, # daggerdbl -8230=>133, # ellipsis -8212=>151, # emdash -8211=>150, # endash -402=>131, # florin -8249=>139, # guilsinglleft -8250=>155, # guilsinglright -339=>156, # oe -8240=>137, # perthousand -8222=>132, # quotedblbase -8220=>147, # quotedblleft -8221=>148, # quotedblright -8216=>145, # quoteleft -8217=>146, # quoteright -8218=>130, # quotesinglbase -353=>154, # scaron -732=>152, # tilde -8482=>153, # trademark -382=>158 # zcaron2 -); - -} // --- END OF CLASS --- - -//============================================================+ -// END OF FILE -//============================================================+ diff --git a/include/limesurvey/admin/classes/xmlrpc/Changelog b/include/limesurvey/admin/classes/xmlrpc/Changelog deleted file mode 100644 index d2cad218..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/Changelog +++ /dev/null @@ -1,1573 +0,0 @@ -2009-09-05 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpcs.inc, xmlrpcs.inc: remove code that was left for compatibility - with php 4; use __METHOD__ constant for error messages instead of hardcoded - values - - * xmlrpcs.inc: catch exceptions thrown during execution of invoked methods; - check for $_SERVER having been disabled via php.ini and log an error if so - - * server.php, testsuite.php: add a new test and server method for exception - catching in the server - - * xmlrpc.inc: added new method SetUserAgent to client to allow having different - user-agent http headers - - * tagged and released as 3.0.0 beta - -2009-08-05 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc_wrappers.inc: improve compatibility with php 5.0 when registering - class/object methods - -2009-08-02 - G. Giunta (giunta.gaetano@gmail.com) thanks Laurens - - * xmlrpcs.inc: add a new member var in server class to allow fine-tuning - of the encoding of returned values when the server is in 'phpvals' mode; - allow servers in 'xmlrpcvals' mode to also register plain php functions by - defining them in the dispatch map with an added option: - 'parameters_type' => 'phpvals' (feature request #2806628) - - * xmlrpc.inc: added new method xmrlpc_client::SetCurlOptions($array) to - allow extra flexibility in tweaking http config, such as explicitly - binding to an ip address (feature request #2787468); fix bad encoding if - same object is encoded twice using php_xmlrpc_encode; removed some by-ref - assignments and declarations - -2009-07-31 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc: add support for dateTime objects in both in php_xmlrpc_encode - and as parameter for constructor of xmlrpcvals; add support for timestamps - as parameter for constructor of xmlrpcvals; add option 'dates_as_objects' to - php_xmlrpc_decode to return dateTime objects for xmlrpc datetimes - - * benchmark.php, xmlrpc_wrappers.inc: remove usage of split(), deprecated in - php 5.3 - - * benchmark.php: fixed url of server page used for testing; improved - verification of correspondence of test results; added more variants for - http options comparison - - * verify_compat.php: check for php version 5 for client side too - - * makefile: remove from build the compat directory - -2009-07-26 - G. Giunta (giunta.gaetano@gmail.com) - - * server.php: remove usage of ereg*(), deprecated in php 5.3 - -2009-07-16 - G. Giunta (giunta.gaetano@gmail.com) thanks Jean-Jacques Sarton - - * xmlrpc.inc: add support for the from the apache library, both - in input and output (feature request #...) - - * xmlrpc.inc, testsuite.php: remove usage of split(), deprecated in php 5.3 - - * testsuite.php: flush better results with output_buffering on - - * server: php: avoid one warning about static function calls - -2009-07-02 - G. Giunta (giunta.gaetano@gmail.com) thanks Heiko Stuebner - - * xmlrpc.inc: fix: when checking the parameters against the signatures xmlrpc - checks for "array" but PHP returns "Array" resulting in a not matches signature - -2009-05-07 - G. Giunta (giunta.gaetano@gmail.com) - - * replace all usage of '= & new' with '= new', as this is deprecated in php 5 - and has been shown to cause problems too - -2009-05-06 - G. Giunta (giunta.gaetano@gmail.com) - - * create php4 branch, rename trunk to 3.0.0beta - it will be the php5-only version - - * xmlrpc.inc: removed test for php version and inclusion of compat patches for really - really old versions of php 4 - -2009-03-16 - G. Giunta (giunta.gaetano@gmail.com) thanks Tommaso Trani - - * move from CVS to SVN on sf.net; file layout now is the same as in packaged lib - - * xmlrpc.inc: fix php warning when receiving 'false' in a bool value - - * Makefile, doc/Makefile: alter to follow new file layout - - * tagged and released as 2.2.2 - -2009-02-03 - G. Giunta (giunta.gaetano@gmail.com) - - * debugger/action.php: improve code robustness when parsing system.listmethods - and system.describemethods call - - * xmlrpc.inc: format floating point values using the correct decimal separator - even when php locale is set to one that uses comma (bug #2517579); - use feof() to test if socket connections are to be closed instead of the - number of bytes read (bug #2556209) - -2008-10-29 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpcs.inc: allow add_to_map server method to add docs for single params, too - -2008-09-20 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc_wrappers.inc: added the possibility to wrap for exposure as xmlrpc - methods plain php class methods, object methods and even whole classes - - * testsuite.php, server.php: added test cases for the new code - -2008-09-07 - G. Giunta (giunta.gaetano@gmail.com) thanks Bruno Zanetti Melotti - - * xmlrpc.inc: be more tolerant in detection of charset in http headers (fix for bug #2058158) - -2008-04-05 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc: fix encoding of UTF8 chars outside of the BMP - - * xmlrpcs.inc: fix detection of zlib.output_compression (thanks xbert) - -2008-03-06 - G. Giunta (giunta.gaetano@gmail.com) - - * tagged and released as 2.2.1 - - * Makefile: improve usage on windows xp despite cmd's broken mkdir - -2007-10-26 - G. Giunta (giunta.gaetano@gmail.com) thanks sajo_raftman - - * xmlrpc.inc: remove one warning in xmlrpc_client creator - -2007-10-26 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc: improve support for windows cp1252 character set (still - commented in the code) - -2007-09-05 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc, xmlrps.inc: do not try to set invalid charsets as output for - xml parser, even if user set them up for internal_encoding (helps encoding - to exotic charsets, while decoding to UTF8) - -2007-09-05 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc: fix parsing of '1e+1' as valid float - -2007-09-01 - G. Giunta (giunta.gaetano@gmail.com), thanks Frederic Lecointre - - * xmlrpcs.inc: allow errorlevel 3 to work when prev. error handler was a static method - - * testsuite.php: fix test on setCookie() - -2007-08-31 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc: minor fix in cookie parsing - -2007-07-31 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc: Fix usage of client::setcookie() for multiple cookies in non-ssl mode - -2007-07-26 - G. Giunta (giunta.gaetano@gmail.com) thanks Mark Olive - - * xmlrpc.inc: Fix for bug # 1756274 (usage of cookies in ssl mode) - -2007-04-28 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc: give more detailed curl information when DEBUG = 2; fix handling - of case where curl w. keepalive is used and one connection of many fails - - * testsuite improvements: add one testcase; give feedbcak while tests are - running - -2007-04-01 - G. Giunta (giunta.gaetano@gmail.com) - - * doc/makefile, doc/custom.fo.xsl: improve pdf rendering of php source code - - * makefile: recover version number from source instead of having it hardcoded - -2007-03-10 - G. Giunta (giunta.gaetano@gmail.com) - - * doc/makefile, doc/convert.php, doc/*.xsl: created customizations xslt to - produce a documentation more in line with the php manual, esp. with regards - to functions synopsis; added jellyfish book cover as local resource and a - screenshot of the debugger too; various updates to the manual source; added - a php script to highlight examples inside html docs - -2007-03-09 - G. Giunta (giunta.gaetano@gmail.com) - - * debugger/action.php: css tweak for IE - - * added phpunit license file in the phpunit directory - - * added link to license (on sf.net site) to many files - -2007-03-04 - G. Giunta (giunta.gaetano@gmail.com) - - * Makefile, doc/makefile: assorted improvements - -2007-03-03 - G. Giunta (giunta.gaetano@gmail.com) - - * xmlrpc.inc: micro-optimization in declaration of global vars xmlrpcerr, xmlrpcstr - -2007-02-25 Gaetano Giunta - - * removed a couple of warnings emitted in testsuite.php - - * doc/makefile: added command for invocation of xxe to generate docs - - * better rendering of docs in xml+css format for function prototypes - - * updated documentation - - * tagged and released as 2.2 - -2007-02-22 Gaetano Giunta - - * debugger: workaround for case of magic_quotes_gpc being set (properly - unescape user input); fix case of user not setting msg id in jsonrpc case - when executing a remote method; allow strings, false, true and null as msg id - -2007-02-13 Gaetano Giunta - - * testsuite.php: added one test for automatic encoding/decoding case - -2007-02-05 Gaetano Giunta - - * xmlrpc.inc: slightly faster encoding of UTF8 data to ascii - -2007-01-11 Gaetano Giunta - - * xmlrpc.inc: when calling client::multicall() with an unspecified http version, - use the client default rather than the fixed 'http 1.0' - -2006-09-17 Gaetano Giunta - - * xmlrpc.inc, xmlrpcs.inc, testsuite.php: added support for and - system.getCapabilities, and one more testcase to go with it - -2006-09-05 Gaetano Giunta - - * xmlrpc.inc: fix support for https through proxies; client parses debug - messages sent by client even for compressed responses; - - * testsuite.php, parse_args.php: added 3 test cases for proxy connections - -2006-09-01 Gaetano Giunta - - xmlrpc_wrappers.inc: add two more options in wrap_xmlrpc_method and fix - typo to allow obj encoding - -2006-08-28 Gaetano Giunta - - * xmlrpc_wrappers.inc: more options added to wrap_php_function and - wrap_xmlrpc_method - - * xmlrpc.inc: pave the way to support for - - * doc/xmlrpc_php.xml documentation updated - - * tagged and released as 2.1 - -2006-08-25 Gaetano Giunta - - * xmlrpc.inc: stricter parsing of incoming messages: detect two DATA elements - inside an ARRAY, a STRUCT or SCALAR inside an already filled VALUE - - * testsuite.php: added two testcases to check for the above cases - -2006-08-24 Gaetano Giunta - - * xmlrpc.inc: more code optimization in xmlrpcval::serialize() and - php_xmlrpc_encode(); fixed bug where struct elements with non-ascii chars - in their name would not be properly encoded - - * testsuite.php: added a testcase for the new bug - -2006-08-23 Gaetano Giunta - - * remove old code left in comments across many files; many more javadoc - comments added - - * xmlrpc.inc: a bit of code optimization: reorder switch() statements of - xml parsing element handlers; inline code for xmlrpcval() - this breaks - new xmlrpcval('true') and changes error msgs on new xmlrpcval($x, 'invalid_type') - - * testsuite.php: change according to above - - * benchmark.php: basic support for xdebug 2 profiling - -2006-08-22 Gaetano Giunta - - * xmlrpc.inc: addscalar() and addstruct() where not returning 1 when adding - data to an already formed value - -2006-08-21 Gaetano Giunta - - * xmlrpcs.inc, xmlrpc.inc: added support for emulating the xmlrpc-extension - API (the full emulation layer is part of the extras package); - fix support for the HTTP 'deflate' encoding - - * xmlrpc.inc: better support for http compression with and without CURL; - a minor decoding speedup; added a new function: php_xmlrpc_decode_xml(), - that will convert into the appropriate object the xml representation of - either a request, response or a single value; log reception of invalid - datetime values - - * xmlrpcs.inc: add a new parameter and return type to server->service(); - let server->add_to_map() accept method definitions without parameter types - - * xmlrpc_wrappers.inc: more logging of errors; wrap_php_functions now takes - more options; better support for jsonrpc; escape quote chars when wrapping - remothe servers / remote methods - - * added cvs Id tag to files that missed it; speling fixes; updated NEWS files - -2006-08-07 Gaetano Giunta - - * assorted fixes to make the suite more compatible with php 4.0.5 and 5.x - -2006-07-02 Gaetano Giunta - - * xmlrpc_warppers.inc: added new function to wrap entire remote server into - a local php class; changed default calling synopsis of wrap_remote_method, - to ease passing multiple options at a time (but old syntax still works!) - - * updated makefile, debugger/action.php in accord with the above - -2006-06-30 Gaetano Giunta - - * added to debugger capability to generate json-rpc code stubs - - * added to debugger capability to load and launch self correctly if - controller.php is called directly from outside processes (single url access) - -2006-06-26 Gaetano Giunta - - * moved wrap_php_functions and wrap_xmlrpc_method into a file of their own. - This will let us add further stub functionality without the base lib growing too much. - All of the files that reference this functionality have been modified accordingly. - - * made wrap_xmlrpc_method generate better code (with php type juggling), and - some phpdoc for the generated function, too - - * added to debugger an option to produce for the user the generated php code - for wrapping a call to a remote method into a php function - -2006-06-22 Gaetano Giunta - - * xmlrpcs.inc: added description of parameters for system.xxx methods (useful with - html-self-documenting servers); - server->service() now returns response object, in case user has need for it... - - * xmlrpc.inc: save full response payload into xmlrpcresp obj for better debugging - -2006-06-15 Gaetano Giunta - - * verify_compat.php: more tests - -2006-06-09 Gaetano Giunta - - * xmlrpcs.inc: fixed sending of compressed responses when output compression - is already enabled in php.ini - - * verify_compat.php: split tests between server and client cases - -2006-05-29 Gaetano Giunta - - * added new file: verify_compat.php, to help troubleshooting platform - support for the library; added it to makefile, too - -2006-05-24 Gaetano Giunta - - * xmlrpc.inc: removed residual usage of regexp in favour of pregexps; fixed - a bug in specifying Host http header with non std ports - -2006-05-23 Gaetano Giunta - - * xmlrpc.inc: improvements to wrap_php_function: let it deal correctly - with php functions returning xmlrpcresp objs; make it generate also - docs for single parameters (useful for documenting_xmlrpc_server class) - -2006-05-22 Gaetano Giunta - - * xmlrpc.inc, xmlrpcs.inc: minor performance tuning updates: replaced - some explode vs. split, ereg vs. preg, single vs. double quotes - - * xmlrpc.inc: fix wrap_xmlrpc_method to NOT rebuild php objects received - from the server by default, as it might pose a security risk - -2006-04-24 Gaetano Giunta - - * minor fixes makefiles. Tagged and released as 2.0 final - -2006-04-22 Gaetano Giunta - - * debugger/*: added option to set cainfo; improve web layout - - * xmlrpc.inc: set sslverifypeer to TRUE instaed of 1 by default - - * doc/php_xmlrpc.xml: documentation updates - -2006-04-21 Gaetano Giunta - - * xmlrpc.inc: added option to set ca certs dir instead of single cert - (used to validate server in https connetions) - -2006-04-18 Gaetano Giunta - - * xmlrpc.inc: fixed bug in xmlrpcval::structmemexists() - - * testsuite.php: added test case for xmlrpcval::structmemexists() - -2006-04-03 Gaetano Giunta - - * xmlrpc.inc: add support for Digest and NTLM authentication, both to server - and to proxies (note: must use CURL for this to work) - - * debugger/*: add support for Digest/NTLM auth to remote servers - -2006-03-19 Gaetano Giunta - - * xmlrpc.inc: fix a bug parsing of 'true' bool values; - added a new method to the client class: SetCaCertificate; - add column number in xml parsing error messages; - fix serialization of messages to ISO-8859-1 charset with php 5 (by adding - encoding to the xml prologue of generated messages) - - * xmlrpcs.inc: correct detection of charset in http headers; - add column number in xml parsing error messages; - fix serialization of responses to ISO-8859-1 charset with php 5 (by adding - encoding to the xml prologue of generated responses) - - * testsuite.php: added two more tests on charset encoding - - * NEWS: update info for impending release - -2006-03-23 Gaetano Giunta - - * added a new demo file: simple_call.php - -2006-02-20 Gaetano Giunta - - * xmlrpcs.inc: more error checking and logging with regard to user-coded - method handler functions not being well behaved; - fix a case where error handler would not be reset upon user function - returning not valid xmlrpresp - - * xmlrpc.inc: fix bug in detection of php 4.3.0 - - * Makefile: fix uppercase filenames - -2006-02-15 - - * xmlrpc.inc: parse 'true' and 'false' as valid booleans, even though the - spec is quite clear on that; fix small bug w. internal_encoding = utf8; add - definition of $GLOBALS['xmlrpcNull'] for extensibility, e.g. json or - extensions to the xmlrpc spec - -2006-02-05 Gaetano Giunta - - * xmlrpc.inc: fix bug in wrap_xmlrpc_method if client passed to function has - return_type=phpvals - - * all demo files: review code, add more comments and information - - * added 2 demo files: proxy.php (implementing an xmlrpc proxy server) and - wrap.php (showing usage of wrap_method_call) - -2006-02-04 Gaetano Giunta - - * xmlrpc.inc: fix bug in multicall in case of no fallback and server error - -2006-01-30 Gaetano Giunta - - * xmlrpc.inc: fix recursive serialization of xmlrpcvals loosing UTF8 charset; - correctly set type field of xmlrpcvals returned by send() calls - - * xmlrpcs.inc: add to server checks for correct return type of user-coded - method handling function; tolerate xmlrpcval instead of xmlrpcresp - - * minor change in xmlrpcresp internals, to ease subclassing (store payload - in an internal var on serialize(), same as xmlrpcclient does) - -2006-01-22 Gaetano Giunta - - * benchmark.php: do not run http 1.1 tests if CURL notfound - - * Released as 2.0 Rc3 - -2006-01-19 Gaetano Giunta - - * xmlrpc.inc: make xmlrpc_client::setDebug() accept int values instead of - boolean. At level 2, the request payload is printed to screen before being - sent; fix bug with repeated sending of the same msg object and using request - compression w. php 5.1.2 (objects passed by ref by default!!!) - - * xmlrpcs.inc: fix detection of clients accepting compressed responses - - * comment.php: remove warnings due to liberal usage of $HTTP_POST/GET_VARS - - * benchmark.php: add a test using http compression of both requests and - responses - - * testsuite.php: added test for fix in xmlrpc.inc - -2006-01-17 Gaetano Giunta - - * xmlrpcs.php: minor fix: do not raise a PHP warning when std server is - called via GET (global HTTP_RAW_POST_DATA undefined). Some might have called - it a security breach (path disclosure)... - -2006-01-15 Gaetano Giunta - - * testsuite.php: minor fix to expected date format in http cookie hedaer - to cope with PHP 5.1.2 - -2006-01-05 Gaetano Giunta - - * xmlrpcs.inc: merge code from the 'extras' subclass that allows server - to register plain php functions in dispatch map instead of functions - accepting a single xmlrpcmgs obj parameter. - One step closer to the kitchen sink!!! - -2005-12-31 Gaetano Giunta - - * xmlrpcs.inc: let the server accept 'class::method' syntax in the dispatch - map - - * testsuite.php, server.php: added new tests for the recent charset encoding - capabilities - -2005-12-24 Gaetano Giunta - - * xmlrpc.inc: correctly serialize() string xmlrpcvals that have been - created out of non-string php variables, when internal encoding is UTF8; - serialize to '0' int and double values created out of non-string php - variables, eg. 'hello', instead of creating invalid xmlrpc; - extend the php_xmlrpc_encode function to allow serializing string values - to charsets other tha US-ASCII; - minor tweak to xml parsing to allow correct parsing of empty strings when - in 'direct to php values' mode - - * xmlrpcs.inc: advances in system.multicall with plain php values - -2005-12-17 Gaetano Giunta - - * xmlrpcs.inc: let the functions implementing the system.* methods work - fine when called with plain php values as parameters instead of xmlrpcmsg - objects (multicall not quite finished yet...); - encode level 3 debug info as base64 data, to avoid charset encoding hell - - * xmlrpc.inc: added a new xmlrpc_2_php_type function, to get the name of - php types corresponding to xmlrpc types; - in debug mode, when detecting base64 server debug info, print it out fine - - * server.php: cosmetic fixes - -2005-12-09 Gaetano Giunta - - * xmlrpc.inc: remove one warning emitted when received xml contains an - unknown tag; remove warnings emitted when custom error handler is set - and user calls php_xmlrpc_encode/decode without the 2nd parameter - - * xmlrpcs.inc: added a param to service(), to allow the server to parse - data other than the POST body (useful for subclassing and debugging); - reworked the implementation of server debug messages at debug level 2: - since the debug info generated has no known charset, and putting it back - into the response's xml would most likely break it, send it back to the - client as a base64 encoded comment. Clients can decode it if they need it... - Add some more javadocs - - * testsuite.php: modified the string test, to see if the server can echo - back to the client the received data without breaking the response's xml - -2005-12-05 Gaetano Giunta - - * xmlrpc.inc, xmlrpcs.inc: let server and client objects decide if they - want to use some charset encoding other than US-ASCII for serialized data: - add a new var to both objects, and lots of parameters to function calls - that took none up to now; - refactored server method service() and parseRequest(), implementing a - new parserequestHeaders() method to explicitly deal with HTTP - -2005-12-01 Gaetano Giunta - - * moved the jsonrpc implementation and the new wsdl stuff to a separate - CVS module; updated the makefile to reflect it - -2005-11-24 Gaetano Giunta - - * modified php_xmlrpc_decode() to work on xmlrpcmessages too, besides - xmlrpcvals. To achieve this, added a new method: xmlrpcmsg::kindOf() - -2005-11-22 Gaetano Giunta - - * released as 2.0 RC2 - -2005-11-21 Gaetano Giunta - - * xmlrpc.inc: fix warnings about references for PHP 4.1.X - - * Whitespace cleanup on all the lib - -2005-11-16 Gaetano Giunta - - * xmlrpc.inc: rewritten xmlrpc_encode_entitites adding two extra parameters - that specify input and output charset encodings. This corrects the bug that - prevented native UTF-8 strings to be correctly serialized (to have them - encoded the user must set $xmlrpc_internalencoing appropriately). - - * xmlrpc.inc: added new method xmlrpcmsg::parseResponseHeaders(), refactoring - parseResponse(). This makes the code more modular and eases subclassing. - - * xmlrpc.inc: set cookies and http headers to xmlrpcresp objs even when calls - to send() do not complete correctly - - * added new file: jsonrpcs.inc, to accomodate server jsonrpc objects in the future - - * jsonrpc.inc: slow progress... - -2005-11-10 Gaetano Giunta - - * xmlrpc.inc: fixed the xmlrpc_client send and sendpayloadhttps methods - to fix errors in calling https servers; - added a new xmlrpc_client->setkey method to allow usage of client-side ssl - certs in recent php builds; - added to xmlrpcresp objects a content_type var, to be used in HTTP headers - - * xmlrpcs.inc: separate generation of content-type http header and xml prologue - from the service() method, to ease subclassing - -2005-11-03 Gaetano Giunta - - * xmlrpc.inc: moved the 'text/xml' mimetype string as class var of the xmlrpcmsg - object instead of having it cabled into xmlrpc_client->send(): this allows to - create subclasses of xmlrpcmsg that use a different mimetype - - * jsonrpc.inc: added a new file, with an extremely experimental set of classes, - designed to implement a json-rpc client and server, taking advantage of the - existing xml-rpc infrastructure - -2005-10-28 Gaetano Giunta - - * xmlrpc.inc: changed constructor method for xmlrpcresp, making it smarter in - case user does not declare the type of value it is passing to it; - minor changes in serialization of xmlrpcresp with error codes, so that it - utputs LF instead of CRLF on windows boxes after an FTP transfer of the code, too - -2005-10-26 Gaetano Giunta - - * xmlrpc.inc: added a new var of class xmlrpc_client, indicating what kind of - object will be stored in the value() of xmlrpcresp's gotten from the send() - method: xmlrpxc objects, plain php variables or raw xml. This allow the coder - to make use of xmlrpc_decode for better performances if he wishes so. - Modified creator of xmlrpcresp class to allow it to distinguish between being - created out of raw xml or a plain php string (in the former case, serialization - is still possible, opening a new world of opportunity for server-side programming: - the php function implementing a web service has to provide the xml for the - return value on its own). - Modified xmlrpc_client::multicall() to suit; also added a new parameter which - allows calls to multicall without automatic fallback to many-calls in case of - error (speeding up the process of doing a failed multicall() call quite a bit) - Fixed two bugs in guess_encoding. - Audited all regexps and fixed some. - xmlrpc_client::send() does not call xmlrpcmsg::parseresponsefile() anymore. - Shuffled parseresponse() a little bit - - * testsuite.php: added a new testcase for the modifications to multicall(): - now we test the case where xmlrpc_client returns php values, too - -2005-10-24 Gaetano Giunta - - * xmlrpc.inc: fixed guess_encoding() to always return uppercase chars - - * added new file: benchmark.php. It contains a few tests used to evaluate - speed of the lib in common use cases - - * added file parse_args.php, containing common code for benchmark and - testsuite, and modified testsuite.php accordingly - - * modified makefile adding new files - - * testsuite.php: added a couple of new test cases; fixed one warning - emitted in php 5 E_STRICT mode - -2005-10-20 Gaetano Giunta - - * xmlrpc.inc: modify 3d param of ParseResponse(), allowing the function to - return the raw xml received as value of the xmlrpcresponse object. - This allows eg. to have epi-xmlrpc decode the xml for faster execution. - -2005-10-09 Gaetano Giunta - - * xmlrpc.inc: fixed error that prevented usage of HTTPS (the client - always determined that ssl support was not present) - -2005-10-03 Gaetano Giunta - - * xmlrpc.inc, xmlrpcs.inc: revert direction of stack growth during xml - parsing for faster execution time; add support for detecting charset - encoding of received xml; add support for cookies; better parsing of - javadoc when building stub code in wrap_php_function; add a lot of - javadoc comments everywhere; rewrite most error messages - - * testsuite.php: add many tests for newly introduced features - - * server.php: add a couple of new functions to support debugging new - features - - * debugger: add switches to enable all the latest lib features; minor - improvements to layout - - * synch included phpunit with latest PEAR release - - * reorganize files included in the distribution in a new hierarchy of folders - - * bump revision number to 2.0RC1 and release - -2005-8-14 Miles Lott - - * xmlrpc.inc, xmlrpcs.inc: Remove all use of eval() to avoid potential - security hole. - - * As of this release we are no longer php3-compatible. - -2005-8-10 Miles Lott - - * xmlrpc.inc, xmlrpcs.inc: Switched to using $GLOBALS instead of calling - global $varname - -2005-07-22 Miles Lott - - * Removed: bug_* files - -2005-07-14 Gaetano Giunta - - * debugger: added a workaround to disable using the debugger for attacking - older versions of the lib - - * testsuite.php: added code to test wrap_xmlrpc_method; - use different wording for failed tests - - * xmlrpcs.inc: change for() with foreach() in system.* methods implementations; - remove a possible cause of php warning; - - * xmlrpc.inc: let wrap_php_function and wrap_xmlrpc_method find suitable - function names if default function names are already in use; - correct wrap_xmlrpc_method to not set http protocol to 1.0 when not asked to; - detect curl compiles without SSL - -2005-07-14 Gaetano Giunta - - * xmlrpc.inc: more auto-fix of xmlrpc_client path: '' -> '/'; - change to the method used for detecting failed evals (php 4.0.x compatibility); - complete rework of return-by-ref functions to comply with php 4.4.0 - - * xmlrpcs.inc: change to the method used for detecting failed evals (php 4.0.x - compatibility) - - * testsuite.php: major rewrite of the multi- tests, to give better feedback on - number of failed tests; - flush html page title to screen before starting tests; - -2005-07-13 Gaetano Giunta - - * xmlrpc.inc: let xmlrpcmsg creator be forgiving of target paths that miss the - starting '/' char; - completely reworked assign-by-ref to be compliant with php 4.4.0 stricter - warnings - - * testsuite.php: added ability to be run from cli: (really dumb) separation of - html and plain text outputs + parsing of argv parameters - -2005-07-12 Gaetano Giunta - - * xmlrpc.inc: compatibility fixes with PHP versions 4.0.x (and remove some for - PHP 3) - - * xmlrpcs.inc: compatibility fixes for PHP 4.0.x versions - - * testsuite.php: better support for running with php versions 4.0.x; - do not generate runtime errors but finish tests anyway if some calls to - localhost fail; - correctly detect a localhost port different from 80 for running tests against - -2005-07-11 Gaetano Giunta - - * xmlrpc.inc: preliminary building of method signature and docs in - wrap_php_function; - fix a bug in extracting function description from javadoc block in - wrap_php_function; - small fix for better compatibility with php < 4.2.0 - - * added compat subdir with extra code, taken form PEAR package Compat, to let - the lib run fine with php 4 versions < 4.1 - -2005-07-10 Gaetano Giunta - - * xmlrpc.inc: some nazi whitespace corrections; - declared global $xmlrpcBoolean too (was the only one missing); - used @eval inside getval() to have less path disclosure security reports filed - in the future; - added new global var: $xmlrpcValue, to be used in server dispatch maps as - placeholder for a param which can be of any kind; - big chunks (but still incomplete) of javadoc parsing in wrap_php_function - + changed type of return val - now it is the complete array to be put in the - dispatch map - - * xmlrpcs.inc: let previous error handler be called by server to handle errors - even if in debug level 3; - default to compress responses if zlib installed; - added a new val useful for only checking number (not type) of params in method - calls; - let user use object methods in dispatch map using the - array($obj, 'fmethodname') format - - * server.php: Added code called by testsuite.php to exercise registration of - object methods as xmlrpc methods and auto-registration of php functions as xmlrpc - methods - - * testsuite.php: added tests to exercice server registering object methods as - xmlrpc methods and automatic registration of php functions as server methods; - added a hint to enable debug if some test goes wrong; - renamed https test for better clarity - -2005-07-07 Gaetano Giunta - - * xmlrpc.inc: added function to be used for 'guestimating' charset encoding of - received xml (not activated yet) - - * server.php: Let server compress content by default if user asks so: it allows - testsuite to check for compressed responses - - * testsuite.php: added suite of tests for compressed responses; test CURL - (http1.1) with all possible compression combinations too - -2005-07-06 Gaetano Giunta - - * xmlrpc.inc: Enable setting usage of keepalives on/off (for CURL cases); - implement compression of xmlrpc requests; enable new syntax of xmlrpclient - constructor: 1 - allow preferred http method to be set at creation time, - 2 - allow user to insert a single complete URL as only parameter and parse it; - try to detect if curl is present whether it has been compiled w. zlib to enable - automatically the reception of compressed responses - - * xmlrpcs.inc: do not add into logs the content of the request, if it was - received gzipped/deflated, to avoid breaking the xml sent back as response - (NB: might be investigated further: is the problem caused by windows chars in - the range 128-160 ?) - - * testsuite.php: run all localhost tests 2 more times, to stress request - compression; - run all localhost tests in a row using keepalives, to test keepalive - functionality - -2005-07-05 Gaetano Giunta - - * xmlrpc.inc: let CURL pass back to caller function the complete PHP headers - as it did before: it enables better logging / debugging of communication; - small change to the way CURL declares its ability to receive compressed - messages (fix for the case where zlib is compiled in PHP but not in curl); - added Keep-alive (ON BY DEFAULT) for http 1.1 and https messages (had to modify - a lot of functions for that); - always make sure a 'Connection: close' header is sent with curl connections if - keep-alive is not wanted - - * phpunit.php: switched to PEAR PHPUnit (rel 1.2.3), since it is maintained a - lot more than the old version we were using - - * added new folder with code of phpunit classes - - * testsuite.php: added a new run of tests to check for compliance of client - when using http 1.1; - switched to PEAR PHPUnit classes; - divided test for client ability to do multicall() into 2 separate tests - -2005-06-30 Gaetano Giunta - - tagged and released version 1.1.1, backporting security fixes from HEAD - -2005-06-28 Gaetano Giunta - - * xmlrpcs.inc: fix changes introuced yesterday in a rush; - do not list system.* methods for a server that has them explicitly disabled - - * bug_inject.xml: new test case used to check for code injection vulnerability - - * testsuite.php: added a test case for zero parameters method calls; - added two test cases for recently found code injection vulnerabilities - -2005-06-27 Gaetano Giunta - - * xmlrpc.inc: (tentative) fix for security problem reported by - security@gulftech.org: we were not properly php-escaping xml received for - BASE64 and NAME tags; - some more patching related to junk received in xml messages/responses: if the - PHP code built from the parsed xml is broken, catch any generated errors - without echoing it to screen but take note of the error and propagate to user - code - - * xmlrpcs.inc: some more patching related to junk received in xml messages/ - responses: if the PHP code built from the parsed xml is broken, catch any - generated errors without echoing it to screen but take note of the error and - propagate to user code - -2005-06-24 Gaetano Giunta - - * xmlrpc.inc: fixed php_xmlrpc_encode detection of php arrays (again!); - removed from wrap_php_function the part about setting a custom error handler - (it can be activated using the more general $server->setdebug(3) anyway) - - * xmlrpcs.inc: added to server the capability to trap all processing errors - during execution of user functions and add them to debug info inside responses; - return a (new) xmlrpcerr response instead of raising some obscure php execution - error if there is an undefined function in the dispatch map - - * testsuite.php: Added new testcases for recently implemented stuff - -2005-06-23 Gaetano Giunta - - * xmlrpc.inc: added new method: xmlrpcval->structmemexists, to check for - presence of a wanted struct member without having to loop through all members; - fix wrap_php_functions: correctly return false for php internal functions, - whose param list is unknown; - let addscalar fail as it should if called on struct vals; - fix addstruct: do not fail when called for adding stuff to initialized structs; - removed a warning generated when calling addscalar with inexistent type; - massive code review for speed: replaced each() loops with foreach(), removed - lots of useless assignments and duplications of data; - added 'http11' as valid method param for xmlrpclient->send: makes use of curl - for sending http 1.1 requests; - changed a couple '=' into '=&' where objects are returned; - fixed wrap_php_function() to better detect php errors while processing wrapped - function - - * xmlrpcs.inc: Fix php warnings generated when clients requested method - signature / description for a method that had none in its dispatch map; - turned server->debug into an integer value that will change the amount of - logging going as comments into xmlrpc responses - - * server.php: set default server debug level to 2 - - * testsuite.php: removed calls to deleted functions (xmlrpc_encode, - xmlrpc_decode); - added html page title describing target servers used for tests; - added an assign-by-ref - - * phpunit.php: Do not consider as failures PHP 5 E_STRICT errors (arbitrary - choice, but lib is targeted at PHP 4) - -2005-06-22 Gaetano Giunta - - * xmlrpc.inc: removed lottsa old code that had been left in commented - - * xmlrpc.inc: fixed setting of proxy port - - * xmlrpc.inc: removed one warning when trying to decompress junk sent as - deflated response - - * xmlrpc.inc: changed the error messages (but not the code) that will be found - in xmlrpcresponses when there are socket errors, to differentiate from HTTP - errors - - * xmlrpc.inc: refactored xmlrpcclient->sendpayloadHTTPS: now it calls a new - method (sendpayloadCURL) that could be used also for generating HTTP 1.1 - requests - - * xmlrpc.inc: added two new methods: wrap_php_function and wrap_xmlrpc_method: - designed to let the lazy programmer automagically convert php functions to - xmlrpc methods and vice versa. Details are in the code - - * debugger/*: added initial revision of a 'universal xmlrpc debugger' - -2005-06-20 Gaetano Giunta - - * xmlrpc.inc: replace usage of 'echo' with error_log when errors arise - in manipulation of xmlrpcval objects - - * xmlrpc.inc: replaced
      with
      in dump function - - * xmlrpc.inc: added method structsize to xmlrpcval class (alias for arraysize) - - * xmlrpc.inc: addarray() now will add extra members to an xmlrpcval object - of array type; addstruct() can be used to add members to an xmlrpcval object - of struct type - - * xmlrpcs.inc: Added member allow_system_funcs to server: controls whether the - server accepts or not calls to system.* functions - -2005-05-10 Gaetano Giunta - - * xmlrpc.inc: fix regression in php_xmlrpc_encode when encoding php hashes; - fix decompression of gzip/deflated xmlrpc responses; - set user agent string correctly in SSL mode (was forgetting lib name); - add allowed encoding http headers in requests; - do not pass http headers back from curl to parseresponse, to avoid re-decoding - compressed xml or http 100 headers - - * xmlrpcs.inc: added method setDebug; - renamed compress_output to compress_response; - do not try to set http headers if they have already been sent, because trying - to do so will raise a PHP error, and if headers have been sent something has - gone wrong already (shall we send a meaningful error response instead?) - -2005-05-08 Gaetano Giunta - - * xmlrpcs.inc, xmlrpcs.inc: reverted to usage of '=& new' for better - performance on (some) php4 installs. - NB: PHP 3 compatibility is deprecated from now on! - - * xmlrpc.inc: decode xmlrpc boolean type to native php boolean - - * xmlrpcs.inc, xmlrpcs.inc: switched $_xh[$parser] to $_xh, since indexing - an array by object will give a warning in php 5 (and we were resetting the - array of _xh elements on every call anyway) - - * xmlrpc.inc: commented unused code used originally for escaping content - - * xmlrpc.inc: commented deprecated methods xmlrpc_encode and xmlrpc_decode - - * xmlrpc.inc: php_xmlrpc_encode: encode integer-indexed php arrays as xmlrpc - arrays instead of structs; if object given to encode is an xmlrpcval return it - instead of reencoding (makes easier calling encode on an array of xmlrpcvals) - - * xmlrpcs.inc: added $debug field to server class; if false will prevent - the server from echoing debug info back to the client as xml comment - - * xmlrpcs.inc: let the server add to the debug messages the complete request - payload received and (if php installed as apache module) http headers, so that - the client in debug mode can echo a complete fingerprint of the communication - - * xmlrpcs.inc: changed API of ParseRequest method: now it cannot be called - without a 'data' parameter; added 2nd parameter (http encoding); changed the - call to this method from inside service() method - - * xmlrpc.inc, xmlrpcs.inc: enable both server and client to parse compressed xml - (if php is compiled with zlib); client should also be able to decode chunked - http encoding - - * xmlrpc.inc: add support for proxies (only basic auth supported); default port - is 8080 (if left unspecified) - - * xmlrpc.inc: use lowercase for names of http headers received (makes using - them much simpler, since servers can use any upper/lowercase combination) - - * xmlrpc.inc: bumped version number to '2.0 beta' - -2005-05-08 Gaetano Giunta - - * release of version 1.1 - -2005-04-24 Gaetano Giunta - - * xmlrpcs.inc: removed charset declaration from xml prologue of responses, - since we are now escaping all non-ascii chars in an encoding-independent way - - * bug_http.xml: modified to exercise some extra functonality of the lib - (it should now be failed by the current PEAR implementation of the lib) - - * xmlrpc.inc: bumped up rev. number to 1.1 - - * doc/xmlrpc_php.xml, doc/announce1_1.txt: documentation updates - - * Makefile: updated to reflect new xml doc source, modified filelist - -2005-04-17 Gaetano Giunta - - * client.php, agesort.php, introspect.php, introspect_demo.php, - which.php, test.pl, test.py: use as default target the server.php page hosted - on phpxmlrpc.sf.net - - * server.php: fix for register_globals off; refer to docs on phpxmlrpc.sf.net - -2005-04-15 Miles Lott - - code formatting and comments - -2005-04-03 Gaetano Giunta - - * xmlrpc.inc: make use of global var $xmlrpcName in building User_Agent HTTP - header (in conjunction with $xmlrpcVersion) - - * agesort.php, client.php, comment.php, dicuss.php, mail.php, server.php, - which.php: various janitorial fixes - + always html escape content received from xmlrpc server or from user input - + make the scripts run fine with register_globals off an register_long_arrays off - + always use the functions php_xmlrpc_en(de)code, even if the EPI extension - is not installed - + in mail.php, allow user to see script source even if support for .phps files - is not configured in the local web server - - * testsuite.php: better detection of local webserver hostname for running tests - against (if the user did not supply a webserver name) - -2005-03-21 Gaetano Giunta - - * xmlrpcs.inc: revert to a PHP3 compatible script (change '=& new' to '= new') - - * xmlrpc.inc: revert to a PHP3 compatible script (lottsa fixes) - - * testsuite.php: default to using local server as test target if no user - provided values are available instead of heddley.com server - - * testsuite.php: play nice to PHP3 in retrieving user-passed values - - * testsuite.php: fix constructor method name for a type of tests - - * phpunit.php: fix all cases of call-time-pass-by-ref - - * phpunit.php: rename Exception class to _Exception if the script is run with - PHP 5 (exception is a reserverd word) - -2005-03-19 Gaetano Giunta - - * xmlrpc.inc: fixed bug in new http header parsing code in case there is - no correct separator between response headers and body - - * xmlrpc.inc: added recognizing and stripping of HTTP/1.1 100 response headers - - * xmlrpc.inc: strip extra whitespace from response body, as well as any junk - that comes after the last tag. It allows the server code to - be put on public providers that add e.g. javascript advertising to served pages - - * xmlrpc.inc: removed unused parts of code, trailing whitespace - - * xmlrpc.inc: fix possible bug (?) in xmlrpc_ee for BOOLEAN values: true was - being handled differently than false - - * testsuite.php: added a new file-based test to stress the response parsing - modifications recently introduced; enabled debugging for file based tests - -2005-03-15 Gaetano Giunta - - * xmlrpc.inc: fixed missing declaration of global vars in xmlrpc_dh, - sendpayloadhttps and sendpayloadhttp10 - - * xmlrpc.inc: changed error message for invalid responses: 'enable debugging' - is more clear that 'enabling debugging' (the user is being encouraged to do it) - - * xmlrpc.inc: rewrote HTTP response header parsing. It should be more tolerant - of invalid headers, give more accurate error messages and be marginally faster, - too. - - * xmlrpc.inc: cosmetic whitespace fixes and remove useless one-liners - - * xmlrpc.inc: build a shorter PHP command line to be evaluated for rebuilding - values from parsed xml: use '$val =& nex xmlrpcval("value")' for string values - instead of '$val =& nex xmlrpcval("value", $xmlrpcString)' - - * xmlrpc.inc: fix change introduced 2005/01/30 moving call to curl_close() - too early: it did not work on error situations - - * testsuite.php: fix name of testAddingTest method, renamed testErrosString - into testErrorString and removed useless warning for register_globals=off case - -2005-02-27 Gaetano Giunta - - * xmlrpc.inc: do not echo XML parsing error to screen (it is already dumped - into error log) - - * xmlrpc.inc: set hdrs field into response object in case of XML parsing error - (uniform behaviour with other responses) - -2005-02-26 Gaetano Giunta - - * xmlrpc.inc: use global var $xmlrpcVersion as number for user agent string - - * xmlrpcs.inc: eliminate server side PHP warning and give back to caller - a better error msg in case the called method exists but no signature matches - the number of parameters - -2005-02-20 Gaetano Giunta - - * xmlrpc.inc: accept a + sign in front of floats / integers, since the spec - clearly mentions it - - * xmlrpc.inc, xmlrpcs.inc: renamed function XmlEntities to xmlrpc_encode_entitites, - to avoid using the same name as an array already defined - - * xmlrpc.inc: fix bug introduced with escaping of UTF8 chars in xmlrpc error - responses: correct behaviour is to escape chars inside serialize(), not when - calling the xmlrpcresp creator - - * testsuite.php: made test suite more friendly to modern PHP configs, allowing - register_globals to be off and to set in the URL all testing parameters; - added tests for newly introduced fixes; renamed existing tests acording to the - docs inside phpunit.php (e.g. no subclass of TestCase should have a name - starting with test...) - -2005-02-19 Gaetano Giunta - - * xmlrpc.inc: accept patch 683153 by mah0: if timeout is set, allow all socket - operations to timeout at the given time, not only the socket connection - -2005-02-13 Gaetano Giunta - - * xmlrpc.inc: be tolerant to double values received in exponential notation: - even though the spec forbids their usage PHP is fine with them - - * xmlrpc.inc: fix bug: new xmlrpcval('-1') was creating an empty value instead - of a string value! - - * xmlrpc.inc, xmlrpcs.inc: fix the payload encoding changes introduced by - Andres Salomon on 2004-03-17: sending named html entities inside an xml chunk - makes it invalid, and thus renders the lib absolutely non-interoperable with - any other xmlrpc implementation; moreover the current implementation only ever - worked for non-ascii requests, while breaking client-parsing of responses - containing non-ascii chars. - The principle of using entities is preserved though, because it allows the - client to send correct xml regardless of php internal charset encoding vs. - xml request charset encoding, but using 'character references' instead. - - * xmlrpc.inc: encode (non-ascii) chars into charset entities also for error - strings - - * xmlrpcs.inc: encode (non-ascii) chars into charset entities also for debug - messages - - * xmlrpcs.inc: added 'Accept-Charset' header in http request to let the server - know what kind of charset encoding we do expect to be used for responses - - * xmlrpc.inc, xmlrpcs.inc: explicitly tell the xml parser what charset the - application expects to receive content in (notably strings). A new variable, - $xmlrpc_internalencoding, (defaulting to ISO-8859-1) defines what charset the - parser will use for passing back string xmlrpcvals to the PHP application - (both server-side and client-side). - This allows transparent usage of e.g. UTF-8 for encoding xml messages between - server and client and ISO-8859-1 for internal string handling. - ISO-8859-1 is, AFAIK, PHP internal encoding for all installs except - mbstring-enabled ones. - -2005-02-12 Gaetano Giunta - - * xmlrpcs.inc: use '$var =& new(' construct to assign objects: on older versions - of PHP objects are first built then copied over if the ampersand is omitted. - Using it should make the code a little bit faster... - - * doc/xmlrpc.php: update lib version number, release date in preparation for - next release - - * makefile: update lib version number in preparation for next release - - * xmlrpc.inc: split up parsing of xmlrpc INT and DOUBLE values. This allows - finer-grained control over valid values: now the '.' char is not allowed - any more inside int values. - - * xmlrpc.inc: fix for bug #560303: ints and doubles starting with '0' chars are - no more parsed as octal values - -2005-01-30 Gaetano Giunta - - * xmlrpc.inc: Modifed last change by Miles: the functions php_xmlrpc_encode - and php_xmlrpc_decode are now always defined, regardless of the existence of - XMLRPC-EPI. This allows users to start using these functions as the 'default' - functions, and pave the way for future deprecation of xmlrpc_encode/encode - while maintaining a stable API. - - * xmlrpc.inc: use '$var =& new(' construct to assign objects: on older versions - of PHP objects are first built then copied over if the ampersand is omitted. - Using it should make the code a little bit faster... - - * xmlrpc.inc: close curl connection as soon as possible for https requests: - it could save some memory / resources. - - * xmlrpc.inc: added some extra info in the PHP error log message generated - when an invalid xmlrpc integer/float value is encountered and we try to - deserialize it. - - * xmlrpc.inc: added @ char before fsockopen to avoid echoing useless warnings - when connection to server fails; added the same to avoid echoing warnings when - deserializing data of an unknown type - - * xmlrpc.inc: reset the _xh array on each xmlrpc call: otherwise a new array - member is created for each consecutive call and never destroyed, thus making it - impossible to build an xmlrpc-client daemon beacuse of memory leaking. - - * xmlrpc.inc: declare global the variables that are used as 'constants', - so that xmlrpc.inc will work even if it is included from within a function - -2004-12-27 Miles Lott - * xmlrpc.inc: A new constant, XMLRPC_EPI_ENABLED, is defined depending on - the existence of the function, xmlrpc_decode. This function will exist in - PHP if the extension, XMLRPC-EPI (http://xmlrpc-epi.sourceforge.net), is - loaded. It defines the functions xmlrpc_encode and xmlrpc_decode, which - will conflict with functions of the same name in xmlrpc.inc. If this - extension is loaded, we instead use the names php_xmlrpc_encode and - php_xmlrpc_decode. Please look at server.php, testsuite.php, etc., for - how this should be handled if using these functions. - -2003-04-17 Andres Salomon - * xmlrpc.inc: encode strings using htmlentities() instead of - htmlspecialchars(), and add xmlrpc_html_entity_xlate(). This - should fix longstanding issues with sending weird chars (from - non-USASCII codesets like UTF-8, ISO-8859-1, etc) that caused - the xml parser to choke. Multi-byte chars are now changed to - entities before sending, so that the xmlrpc server doesn't need - to know the encoding type of the POST data. - * xmlrpcs.inc: call xmlrpc_html_entity_xlate before parsing - request packet. The parser chokes on unknown entities (the - entities created by htmlentities() are exactly that; html - entities, not xml entities), so they must be converted from - name form (é) to numerical form (é). - -2003-01-12 Andres Salomon - - * released 1.0.99.2. - * Makefile: separate doc/Makefile a bit more from Makefile, - and add clean rules. - -2003-01-10 Andres Salomon - - * xmlrpc.inc: xmlrpcresp and parseResponse cleanups; variable - name renames ('xv' to 'val', for example), type checking, and - stricter default values. - * xmlrpc.inc: fix xmlrpcresp's faultcode; return -1 for FAULT - responses from the server whose faultcodes don't reflect any - errors. - -2003-01-08 Andres Salomon - - * xmlrpc.inc: rename $_xh[$parser]['ha'] to - $_xh[$parser]['headers']. - * xmlrpc.inc: fix bugs related to $_xh[$parser]['headers]; - some places treated this as an array, others as a scalar. - Treat unconditionally as an array. Also wrap header debugging - output in PRE tags. - -2002-12-17 Andres Salomon - - * released 1.0.99. - * Makefile: changed the tarball format/dist rule to a more - conventional form, as well as normal release updates. - * xmlrpc.inc: added setSSLVerifyPeer and setSSLVerifyHost; as - of curl 7.10, various certificate checks are done (by default). - The default for CURLOPT_SSL_VERIFYHOST is to ensure the common - name on the cert matches the provided hostname. This breaks a - lot of stuff, so allow users to override it. - * doc/xmlrpc_php.sgml: updated documentation accordingly. - -2002-09-06 Geoffrey T. Dairiki - - Add support for system.multicall() to both the client - and the server. - - * testsuite.php: Add new tests 'testServerMulticall', - and 'testClientMulticall'. - - * xmlrpc.inc: Added new error messages for system.multicall(). - * xmlrpcs.inc: Added new procedure call system.multicall(). - See http://www.xmlrpc.com/discuss/msgReader$1208 for details. - - * xmlrpc.inc: Added system.multicall functionality to - xmlrpc_client. xmlrpc_client::send can now take an array of - xmlrpcmsg's as an argument. In that case it will attempt - to execute the whole array of procure calls in a single - HTTP request using system.multicall(). (If that attempt fails, - then the calls will be excuted one at a time.) The return - value will be an array of xmlrpcresp's (or 0 upon transport - failure.) - -2001-11-29 Edd Dumbill - - * xmlrpc.inc: fixed problem with processing HTTP headers that - broke any payload with more than one consecutive newline in it. - also initialise the 'ac' array member to empty string at start. - * testsuite.php: added unit test to exercise above bug - * xmlrpcs.inc: fixed uninitialized variable $plist - -2001-09-25 Edd Dumbill - - * xmlrpc.inc: applied urgent security fixes as identified by Dan - Libby - -2001-08-27 Edd Dumbill - - * xmlrpc.inc: Merged in HTTPS support from Justin Miller, with a - few additions for better traceability of failure conditions. Added - small fix from Giancarlo Pinerolo. Bumped rev to 1.0. Changed - license to BSD license. - -2001-06-15 Edd Dumbill - - * xmlrpcs.inc: Added \r into return MIME headers for server class - -2001-04-25 Edd Dumbill - - * server.php: Added interop suite of methods. - -2001-04-24 Edd Dumbill - - * testsuite.php: added in test case for string handling bug. - - * xmlrpc.inc: merged in minor fixes from G Giunta to fix - noninitialization. Created new method, getval(), which includes - experimental support for recreating nested arrays, from Giunta and - Sofer. Fixed string handling bug where characters after - but before weren't ignored. Added in support for native - boolean type into xmlrpc_encode (Giunta). - - * xmlrpcs.inc: updated copyright notice - -2001-01-15 Edd Dumbill - - * xmlrpc.inc: fixed bug with creation of booleans. Put checks in - to ensure that numbers were really numeric. Fixed bug with - non-escaping of dollar signs in strings. - - * testsuite.php: created test suite. - -2000-08-26 Edd Dumbill - - * xmlrpcs.inc: added xmlrpc_debugmsg() function which outputs - debug information in comments inside the return payload XML - - * xmlrpc.inc: merged in some changes from Dan Libby which fix up - whitespace handling. - - * xmlrpcs.inc: added Content-length header on response (bug from - Jan Varga . This means you can no longer print - during processing - - * xmlrpc.inc: changed ereg_replace to str_replace in several - places (thanks to Dan Libby for this). - - * xmlrpc.inc: added xmlrpc_encode() and xmlrpc_decode() from Dan - Libby--these helper routines make it easier to work in native PHP - data structures. - -2000-07-21 Edd Dumbill - - * xmlrpc.inc: added xmlrpc_client::setCredentials method to pass - in authorization information, and modified sendPayload* methods to - send this OK. Thanks to Grant Rauscher for the impetus to do this. - Also, made the client send empty if there are no - parameters set by the user. - - * doc/xmlrpc_php.sgml: updated documentation to reflect recent - changes - - -2000-07-18 Edd Dumbill - - * server.php: added examples.invertBooleans method to server as a - useful test method for boolean values. - - * xmlrpc.inc: rearranged the way booleans are handled to fix - outstanding problems. Fixed calling addScalar() on arrays so it - works. Finally fixed backslashification issues to remove the - problem will dollar signs disappearing. - - * booltest.php: really fixed booleans this time. - -2000-06-03 Edd Dumbill - - * xmlrpcs.inc: made signature verification more useful - now - returns what it found was wrong - - * xmlrpc.inc: fixed bug with decoding dateTimes. Also fixed a bug - which meant a PHP syntax error happened when attempting to receive - empty arrays or structs. Also fixed bug with booleans always being - interpreted as 'true'. - - * server.php: Added validator1 suite of tests to test against - validator.xmlrpc.com - - -2000-05-06 Edd Dumbill - - * released 1.0b6 - - * added test.pl and test.py, Perl and Python scripts that exercise - server.php somewhat (but not a lot) - - * added extra fault condition for a non 200 OK response from the - remote server. - - * added iso8601_encode() and iso8601_decode() to give some support - for passing dates around. They translate to and from UNIX - timestamps. Updated documentation accordingly. - - * fixed string backslashification -- was previously a little - overzealous! new behavior is '\' --> '\\' and '"' --> - '\"'. Everything else gets left alone. - -2000-04-12 Edd Dumbill - - * updated and bugfixed the documentation - - * fixed base 64 encoding to only happen at serialize() time, - rather than when a base64 value is created. This fixes the double - encoding bug reported by Nicolay Mausz - . The same approach ought to be taken with - encoding XML entities in the data - this is a TODO. - - * integrated further code from Peter Kocks: used his new code for - send(), adding a second, optional, parameter which is a timeout - parameter to fsockopen() - -1999-10-11 Edd Dumbill - - * added bug fixes from Peter Kocks - -1999-10-10 Edd Dumbill - - * updated the documentation - -1999-10-08 Edd Dumbill - - * added system.* methods and dispatcher, plus documentation - - * fixed bug which meant request::getNumParams was returning an - incorrect value - - * added signatures into the dispatch map. This BREAKS - COMPATIBILITY with previous releases of this code - -1999-08-18 Edd Dumbill - - * made entity encoding and decoding transparent now on string - passing. - - * de-globalised the globals in the parse routines, using an - associative array to hold all parser state $_xh - - * changed default input encoding to be UTF-8 to match expectation - - * separated out parseResponse into parseResponse and - parseResponseFile so that you can call parseResponse on a string - if you have one handy - -1999-07-20 Edd Dumbill - - * Moved documentation into Docbook format - -1999-07-19 Edd Dumbill - - * Added an echo server into server.php and echotest.php, a client - which will exercise the new echo routine. - - * Added test for no valid value returned: in this case will now - throw the error "invalid payload" - - * Added serialize() method to xmlrpcresp to return a string with - the response serialized as XML - - * Added automatic encoding and decoding for base64 types - - * Added setDebug() method to client to enable HTML output - debugging in the client - -1999-07-08 Edd Dumbill - - * Improved XML parse error reporting on the server side to send it - back in a faultCode packet. expat errors now begin at 100 - -1999-07-07 Edd Dumbill - - * Changed the structmem and arraymem methods of xmlrpcval to always - return xmlrpc vals whether they referred to scalars or complex - types. - - * Added the server class and demonstrations - - * Fixed bugs in the XML parsing and reworked it - - -$Id: ChangeLog,v 1.96 2009/03/16 19:39:11 ggiunta Exp $ diff --git a/include/limesurvey/admin/classes/xmlrpc/Makefile b/include/limesurvey/admin/classes/xmlrpc/Makefile deleted file mode 100644 index e71bcddb..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/Makefile +++ /dev/null @@ -1,123 +0,0 @@ -# Makefile for phpxmlrpc library -# $Id: Makefile,v 1.37 2008/03/06 22:37:19 ggiunta Exp $ - -### USER EDITABLE VARS ### - -# path to PHP executable, preferably CLI version -PHP=/usr/local/bin/php - -# path were xmlrpc lib files will be copied to -PHPINCLUDEDIR=/usr/local/lib/php - -# mkdir is a thorny beast under windows: make sure we can not use the cmd version, running eg. "make MKDIR=mkdir.exe" -MKDIR=mkdir - -#find too -FIND=find - - -#### DO NOT TOUCH FROM HERE ONWARDS ### - -# recover version number from code -# thanks to Firman Pribadi for unix command line help -# on unix shells lasts char should be \\2/g ) -export VERSION=$(shell egrep "\$GLOBALS *\[ *'xmlrpcVersion' *\] *= *'" lib/xmlrpc.inc | sed -r s/"(.*= *' *)([0-9a-zA-Z.-]+)(.*)"/\2/g ) - -LIBFILES=lib/xmlrpc.inc lib/xmlrpcs.inc lib/xmlrpc_wrappers.inc - -EXTRAFILES=extras/test.pl \ - extras/test.py \ - extras/rsakey.pem \ - extras/workspace.testPhpServer.fttb - -DEMOFILES=demo/vardemo.php \ - demo/demo1.txt \ - demo/demo2.txt \ - demo/demo3.txt - -DEMOSFILES=demo/server/discuss.php \ - demo/server/server.php \ - demo/server/proxy.php - -DEMOCFILES=demo/client/agesort.php \ - demo/client/client.php \ - demo/client/comment.php \ - demo/client/introspect.php \ - demo/client/mail.php \ - demo/client/simple_call.php \ - demo/client/which.php \ - demo/client/wrap.php \ - demo/client/zopetest.php - -TESTFILES=test/testsuite.php \ - test/benchmark.php \ - test/parse_args.php \ - test/phpunit.php \ - test/verify_compat.php \ - test/PHPUnit/*.php - -INFOFILES=Changelog \ - Makefile \ - NEWS \ - README - -DEBUGGERFILES=debugger/index.php \ - debugger/action.php \ - debugger/common.php \ - debugger/controller.php - - -all: install - -install: - cd lib && cp ${LIBFILES} ${PHPINCLUDEDIR} - @echo Lib files have been copied to ${PHPINCLUDEDIR} - cd doc && $(MAKE) install - -test: - cd test && ${PHP} -q testsuite.php - - -### the following targets are to be used for library development ### - -# make tag target: tag existing working copy as release in cvs. -# todo: convert dots in underscore in $VERSION -tag: - cvs -q tag -p release_${VERSION} - -dist: xmlrpc-${VERSION}.zip xmlrpc-${VERSION}.tar.gz - -xmlrpc-${VERSION}.zip xmlrpc-${VERSION}.tar.gz: ${LIBFILES} ${DEBUGGERFILES} ${INFOFILES} ${TESTFILES} ${EXTRAFILES} ${DEMOFILES} ${DEMOSFILES} ${DEMOCFILES} - @echo ---${VERSION}--- - rm -rf xmlrpc-${VERSION} - ${MKDIR} xmlrpc-${VERSION} - ${MKDIR} xmlrpc-${VERSION}/demo - ${MKDIR} xmlrpc-${VERSION}/demo/client - ${MKDIR} xmlrpc-${VERSION}/demo/server - ${MKDIR} xmlrpc-${VERSION}/test - ${MKDIR} xmlrpc-${VERSION}/test/PHPUnit - ${MKDIR} xmlrpc-${VERSION}/extras - ${MKDIR} xmlrpc-${VERSION}/lib - ${MKDIR} xmlrpc-${VERSION}/debugger - cp --parents ${DEMOFILES} xmlrpc-${VERSION} - cp --parents ${DEMOCFILES} xmlrpc-${VERSION} - cp --parents ${DEMOSFILES} xmlrpc-${VERSION} - cp --parents ${TESTFILES} xmlrpc-${VERSION} - cp --parents ${EXTRAFILES} xmlrpc-${VERSION} - cp --parents ${LIBFILES} xmlrpc-${VERSION} - cp --parents ${DEBUGGERFILES} xmlrpc-${VERSION} - cp ${INFOFILES} xmlrpc-${VERSION} - cd doc && $(MAKE) dist -# on unix shells last char should be \; - ${FIND} xmlrpc-${VERSION} -type f ! -name "*.fttb" ! -name "*.pdf" ! -name "*.gif" -exec dos2unix {} ; - -rm xmlrpc-${VERSION}.zip xmlrpc-${VERSION}.tar.gz - tar -cvf xmlrpc-${VERSION}.tar xmlrpc-${VERSION} - gzip xmlrpc-${VERSION}.tar - zip -r xmlrpc-${VERSION}.zip xmlrpc-${VERSION} - -doc: - cd doc && $(MAKE) doc - -clean: - rm -rf xmlrpc-${VERSION} xmlrpc-${VERSION}.zip xmlrpc-${VERSION}.tar.gz - cd doc && $(MAKE) clean diff --git a/include/limesurvey/admin/classes/xmlrpc/NEWS b/include/limesurvey/admin/classes/xmlrpc/NEWS deleted file mode 100644 index f0f761f5..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/NEWS +++ /dev/null @@ -1,333 +0,0 @@ -XML-RPC for PHP version 3.0.0 beta - 2009/09/05 - -This is the first release of the library to only support PHP 5. -Some legacy code has been removed, and support for features such as exceptions -and dateTime objects introduced. - -The "beta" tag is meant to indicate the fact that the refactoring has been more widespread -than in precedent releases and that more changes are likely to be introduced with time - -the library is still considered to be production quality. - -* improved: removed all usage of php functions deprecated in php 5.3, usage of assign-by-ref when creating new objects etc... -* improved: add support for the tag used by the apache library, both in input and output -* improved: add support for dateTime objects in both in php_xmlrpc_encode and as parameter for constructor of xmlrpcval -* improved: add support for timestamps as parameter for constructor of xmlrpcval -* improved: add option 'dates_as_objects' to php_xmlrpc_decode to return dateTime objects for xmlrpc datetimes -* improved: add new method SetCurlOptions to xmrlpc_client to allow extra flexibility in tweaking http config, such as explicitly binding to an ip address -* improved: add new method SetUserAgent to xmrlpc_client to to allow having different user-agent http headers -* improved: add a new member variable in server class to allow fine-tuning of the encoding of returned values when the server is in 'phpvals' mode -* improved: allow servers in 'xmlrpcvals' mode to also register plain php functions by defining them in the dispatch map with an added option -* improved: catch exceptions thrown during execution of php functions exposed as methods by the server -* fixed: bad encoding if same object is encoded twice using php_xmlrpc_encode - - -XML-RPC for PHP version 2.2.2 - 2009/03/16 - -This release corrects all bugs that have been reported and sucesfully reproduced since -version 2.2.1. -Regardless of the intimidating message about dropping PHP 4 support, it still does -support that ancient, broken and insecure platform. - -* fixed: php warning when receiving 'false' in a bool value -* fixed: improve robustness of the debugger when parsing weird results from non-compliant servers -* fixed: format floating point values using the correct decimal separator even when php locale is set to one that uses comma -* fixed: use feof() to test if socket connections are to be closed instead of the number of bytes read (rare bug when communicating with some servers) -* fixed: be more tolerant in detection of charset in http headers -* fixed: fix encoding of UTF8 chars outside of the BMP plane -* fixed: fix detection of zlib.output_compression -* improved: allow the add_to_map server method to add docs for single params too -* improved: added the possibility to wrap for exposure as xmlrpc methods plain php class methods, object methods and even whole classes - - -XML-RPC for PHP version 2.2.1 - 2008/03/06 - -This release corrects all bugs that have been reported and sucesfully reproduced. -It is the last release of the library that will support PHP 4. - -* fixed: work aroung bug in php 5.2.2 which broke support of HTTP_RAW_POST_DATA -* fixed: is_dir parameter of setCaCertificate() method is reversed -* fixed: a php warning in xmlrpc_client creator method -* fixed: parsing of '1e+1' as valid float -* fixed: allow errorlevel 3 to work when prev. error handler was a static method -* fixed: usage of client::setcookie() for multiple cookies in non-ssl mode -* improved: support for CP1252 charset is not part or the library but almost possible -* improved: more info when curl is enabled and debug mode is on - - -XML-RPC for PHP version 2.2 - 2007/02/25 - -This release corrects a couple of bugs and adds a few minor features. - -* fixed: debugger errors on php installs with magic_quotes_gpc on -* fixed: support for https connections via proxy -* fixed: wrap_xmlrpc_method() generated code failed to properly encode php objects -* improved: slightly faster encoding of data which is internally UTF-8 -* improved: debugger always generates a 'null' id for jsonrpc if user omits it -* new: debugger can take advantage of a graphical value builder - (it has to be downloaded separately, as part of jsxmlrpc package) -* new: support for the xmlrpc extension -* new: server support for the system.getCapabilities xmlrpc extension -* new: wrap_xmlrpc_method() accepts two new options: debug and return_on_fault - - -XML-RPC for PHP version 2.1 - 2006/08/28 - -This release corrects quite a few bugs and adds some interesting new features. -There is a minor security enhancement and overall speedup too. - -It has been tested with PHP 4.0.5 up to 4.4.4 and 5.1.5. -Please note that 404pl1 is NOT supported, and has not been since 2.0. - -*** PLASE READ CAREFULLY BELOW *** - -CHANGES THAT MIGHT AFFECT DEPLOYED APPLICATIONS: - -The wrap_php_function and wrap_xmlrpc_method functions have been moved out of -the base library file xmlrpc.inc into a file of their own: xmlrpc_wrappers.inc. -You will have to include() / require() it in your scripts if you have been using -those functions. - -For increased security, the automatic rebuilding of php object instances out of -received xmlrpc structs in wrap_xmlrpc_method() has been disabled (but it can be -optionally reenabled). - -The constructor of xmlrpcval() values has seen major changes, and it will not -throw a php warning anymore when invoked using an unknown xmlrpc type: the -error will only be written to php error log. Also new xmlrpcval('true', 'boolean') -is not supported anymore. - -MAJOR IMPROVEMENTS: - -The new function php_xmlrpc_decode_xml() will take the xml representation of -either an xmlrpc request, response or single value and return the corresponding -php-xmlrpc object instance. - -Both wrap_php_function() and wrap_xmlrpc_method() functions accept many more -options to fine tune their behaviour, including one to return the php code to -be saved and later used as standalone php script. - -A new function wrap_xmlrpc_server() has been added, to wrap all (or some) of the -methods exposed by a remote xmlrpc server into a php class. - -Lib internals have been modified to provide better support for grafting extra -functionality on top of it. Stay tuned for future releases of the EXTRAS package. - -Last but not least a new file has been added: verify_compat.php, to help users -diagnose the level of compliance of the current php install with the library. - -CHANGELOG IN DETAIL: - -* fixed bug 1311927: client not playing nice with some proxy/firewall on ports != 80 -* fixed bug 1334340: all ereg_ functions have been replaced with corresponding preg_ -* fixed bug: wrong handling of 'deflate' http encoding, both server and client side -* fixed bug: sending compressed responses when php output compression is enabled was not working -* fixed bug: addarray() and addstruct() where not returning 1 when adding data to already initialized values -* fixed bug: non-ascii chars used in struct element names where not being encoded correctly -* restored compatibility with php 4.0.5 (for those poor souls still stuck on it) -* server->service() now returns either the payload or xmlrpcresp instance -* server->add_to_map() now accepts methods with no param definitions -* added new function: php_xmlrpc_decode_xml() -* added new function: wrap_xmlrpc_server() -* major improvements and security enhancements to wrap_php_function() and wrap_xmlrpc_method() -* documentation for single parameters of exposed methods can be added to the dispatch map - (and turned into html docs in conjunction with a future release of the extras package) -* full response payload is saved into xmlrpcresp object for further debugging -* stricter parsing of incmoing xmlrpc messages: two more invalid cases are now detected - (double data element inside array and struct/array after scalar inside value element) -* debugger can now generate code that wraps a remote method into php function (works for jsonrpc, too) -* debugger has better support for being activated via a single GET call (for integration into other tools?) -* more logging of errors in a lot of situations -* javadoc documentation of lib files almost complete -* the usual amount of new testcases in the testsuite -* many performance tweaks and code cleanups -* added foundation for emulating the API of the xmlrpc extension (extras package needed) - - -XML-RPC for PHP version 2.0 - 2006/04/24 - -I'm pleased to announce XML-RPC for PHP version 2.0, final. - -With respect to the last release candidate, this release corrects a few small -bugs and adds a couple of new features: more authentication options (digest and -ntlm for servers, ntlm for proxies, and some https custom certificates stuff); -all the examples have been reviewed and some demo files added, -including a ready-made xmlrpc proxy (useful e.g. for ajax calls, when the xmlrpc -client is a browser); the server logs more warning messages for incorrect situations; -both client and server are more tolerant of commonly-found mistakes. -The debugger has been upgraded to reflect the new client capabilities. - -In greater detail: - -* fixed bug: method xmlrpcval::structmemexists($value) would not work -* fixed bug: wrap_xmlrpc_method would fail if invoked with a client object that - has return_type=phpvals -* fixed bug: in case of call to client::multicall without fallback and server error -* fixed bug: recursive serialization of xmlrpcvals loosing specified UTF8 charset -* fixed bug: serializing to ISO-8859-1 with php 5 would raise an error if non-ascii - chars where found when decoding -* new: client can use NTLM and Digest authentication methods for https and http 1.1 - connections; authentication to proxy can be set to NTLM, too -* new: server tolerates user functions returning a single xmlrpcval object instead - of an xmlrpcresp -* new: server does more checks for presence and correct return type of user - coded method handling functions, and logs inconsistencies to php error log -* new: client method SetCaCertificate($cert, $is_dir) to validate server against -* new: both server and client tolerate receiving 'true' and 'false' for bool values - (which btw are not valid according to the xmlrpc spec) - - -XML-RPC for PHP version 2.0RC3 - 2006/01/22 - -This release corrects a few bugs and adds some interesting new features. -It has been tested with PHP up to 4.4.2 and 5.1.2. - -* fixed bug: server not recognizing clients that declare support for http compression -* fixed bug: serialization of new xmlrpcval (8, 'string') when internal encoding - set to UTF-8 -* fixed bug: serialization of new xmlrpcval ('hello', 'int') would produce - invalid xml-rpc -* new: let the server accept 'class::method' syntax in the dispatch map -* new: php_xmlrpc_decode() can decode xmlrpcmessage objects -* new: both client and server can specify a charset to be used for serializing - values instead of the default 'US-ASCII+xml-entities-for-other-characters'. - Values allowed: ISO-8859-1 and UTF-8 -* new: the server object can register 'plain' php functions instead of functions - that accept a single parameter of type xmlrpcmsg. Faster, uses less memory - (but comes with minor drawbacks as well, read the manual for more details) -* new: client::setDebug(2) can be used to have the request payload printed to - screen before being sent -* new: server::service($data) lets user parse data other than POST body, for - easier testing / subclassing -* changed: framework-generated debug messages are sent back by the server base64 - encoded, to avoid any charset/xml compatibility problem -* other minor fixes - -The usual refactoring of a lot of (private) methods has taken place, with new -parameters added to some functions. -Javadoc documentation has been improved a lot. -The HTML documentation has been shuffled around a bit, hoping to give it a more -logical organization. - -The experimental support for the JSON protocol has been removed, and will be -packaged as a separate download with some extra very interesting stuff (human -readable auto-generated documentation, anyone?). - - -XML-RPC for PHP version 2.0RC2 - 2005/11/22 - -This release corrects a few bugs and adds basically one new method for better -HTTPS support: - - * fixed two bugs that prevented xmlrpc calls to take place over https - * fixed two bugs that prevented proper recognition of xml character set - when it was declared inside the xml prologue - * added xmlrpc_client::setKey($key, $keypass) method, to allow using client - side certificates for https connections - * fixed bug that prevented proper serialization of string xmlrpcvals when - $xmlrpc_internalencoding was set to UTF-8 - * fixed bug in xmlrpc_server::echoInput() (and marked method as deprecated) - * correctly set cookies/http headers into xmlrpcresp objects even when the - sned() method call fails for some reason - * added a benchmark file in the testsuite directory - -A couple of (private/protected) methods have been refactored, as well as a -couple of extra parameters added to some (private) functions - this has no -impact on the public API and should be of interest primarily to people extending -/ subclassing the lib. - -There is also new, PARTIAL support for the JSON-RPC protocol, implemented in -two files in the extras dir (more info about json-rpc at http://json-rpc.org) - - -XML-RPC for PHP version 2.0RC1 - 2005/10/03 - -I'm pleased to announce XML-RPC for PHP version 2.0, release candidate 1. - -This release introduces so many new features it is almost impossible to list them -here, making the library finally on pair with, if not more advanced than, any other -similar offer (e.g. the PEAR XMLRPC package or the Incutio IXR library). -No, really, trust me. - -The minimum supported PHP version is now 4.2 - natively - or 4.0.4pl1 - by usage of -a couple of compatibility classes (code taken from PEAR php_compat package). - -The placement of files and directories in the distribution has been deeply modified, -in the hope of making it more clear, now that the file count has increased. -I hope you find it easy. - -Support for "advanced" HTTP features such as cookies, proxies and keep-alives has -been added at last. - -It is now much easier to convert between xmlrpcval objects and php values, and -in fact php_xmlrpc_encode and php_xmlrpc_decode are now the recommended methods -for all cases, except when encoding base64 data. - -Two new (experimental) functions have been added, allowing automagic conversion -of a php function into an xmlrpc method to be exposed and vice-versa. - -PHP objects can be now automatically serialized as xmlrpc struct values and -correctly deserialized on the other end of the transmission, provided that the -same class definition is present on both sides and no object members are of -type resource. - -A lot of the existing class methods have been overloaded with extra parameters -or new functionality, and a few added ex-novo, making usage easier than ever. - -A complete debugger solution is included in the distribution. It needs a web server -to run (a freely available version of the same debugger is accessible online, it -can be found at http://phpxmlrpc.sourceforge.net). - -For a more detailed list of changes, please read carefully chapter 2 of the -included documentation, or, even better, take a look at the source code, which -is commented in javadoc style quite a bit. - - -XML-RPC for PHP version 1.2 - 2005/08/14 - -This removes all use of eval(), which is a potential security problem. -All users are encouraged to upgrade as soon as possible. -As of this release we are no longer php3-compatible. - - -XML-RPC for PHP version 1.1.1 - 2005/06/30 - -This is a security vulnerability fix release. -All users are invited to upgrade as soon as possible. - - -XML-RPC for PHP version 1.1 - 2005/05/03 - -I'm pleased to announce XML-RPC for PHP version 1.1 -It's taken two years to get to the this point, but here we are, finally. - -This is a bugfix and maintenance release. No major new features have been added. -All known bugs have been ironed out, unless fixing would have meant breaking -the API. -The code has been tested with PHP 3, 4 and 5, even tough PHP 4 is the main -development platform (and some warnings will be emitted when runnning PHP5). - -Notheworthy changes include: - - * do not clash any more with the EPI xmlrpc extension bundled with PHP 4 and 5 - * fixed the unicode/charset problems that have been plaguing the lib for years - * proper parsing of int and float values prepended with zeroes or the '+' char - * accept float values in exponential notation - * configurable http user-agent string - * use the same timeout on client socket reads as used for connecting - * more explicative error messages in xmlrpcresponse in many cases - * much more tolerant parsing of malformed http responses from xmlrpc servers - * fixed memleak that prevented the client to be used in never-ending scripts - * parse bigger xmlrpc messages without crashing (1MB in size or more) - * be tolerant to xmlrpc responses generated on public servers that add - javascript advertising at the end of hosted content - * the lib generates quite a few less PHP warnings during standard operation - -This is the last release that will support PHP 3. -The next release will include better support for PHP 5 and (possibly) a slew of -new features. - -The changelog is available at: -http://cvs.sourceforge.net/viewcvs.py/phpxmlrpc/xmlrpc/ChangeLog?view=markup - -Please report bugs to the XML-RPC PHP mailing list or to the sourceforge project -pages at http://sourceforge.net/projects/phpxmlrpc/ diff --git a/include/limesurvey/admin/classes/xmlrpc/README b/include/limesurvey/admin/classes/xmlrpc/README deleted file mode 100644 index e757a5d3..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/README +++ /dev/null @@ -1,13 +0,0 @@ -NAME: XMLRPC FOR PHP - -DESCRIPTION: A php library for building xmlrpc clients and servers - - - -HTML documentation can be found in the doc/ directory. - -Recent changes in the ChangeLog - -Use of this software is subject to the terms in doc/index.html - -The passphrase for the rsakey.pem certificate is 'test'. diff --git a/include/limesurvey/admin/classes/xmlrpc/debugger/action.php b/include/limesurvey/admin/classes/xmlrpc/debugger/action.php deleted file mode 100644 index 869fff79..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/debugger/action.php +++ /dev/null @@ -1,527 +0,0 @@ - - - - - XMLRPC Debugger - - - - - 1) - $pport = $pproxy[1]; - else - $pport = 8080; - $client->setProxy($pproxy[0], $pport, $proxyuser, $proxypwd); - } - - if ($protocol == 2) - { - $client->setSSLVerifyPeer($verifypeer); - $client->setSSLVerifyHost($verifyhost); - if ($cainfo) - { - $client->setCaCertificate($cainfo); - } - $httpprotocol = 'https'; - } - else if ($protocol == 1) - $httpprotocol = 'http11'; - else - $httpprotocol = 'http'; - - if ($username) - $client->setCredentials($username, $password, $authtype); - - $client->setDebug($debug); - - switch ($requestcompression) { - case 0: - $client->request_compression = ''; - break; - case 1: - $client->request_compression = 'gzip'; - break; - case 2: - $client->request_compression = 'deflate'; - break; - } - - switch ($responsecompression) { - case 0: - $client->accepted_compression = ''; - break; - case 1: - $client->accepted_compression = array('gzip'); - break; - case 2: - $client->accepted_compression = array('deflate'); - break; - case 3: - $client->accepted_compression = array('gzip', 'deflate'); - break; - } - - $cookies = explode(',', $clientcookies); - foreach ($cookies as $cookie) - { - if (strpos($cookie, '=')) - { - $cookie = explode('=', $cookie); - $client->setCookie(trim($cookie[0]), trim(@$cookie[1])); - } - } - - $msg = array(); - switch ($action) { - - case 'wrap': - @include('xmlrpc_wrappers.inc'); - if (!function_exists('build_remote_method_wrapper_code')) - { - die('Error: to enable creation of method stubs the xmlrpc_wrappers.inc file is needed'); - } - // fall thru intentionally - case 'describe': - case 'wrap': - $msg[0] = new $msgclass('system.methodHelp', null, $id); - $msg[0]->addparam(new xmlrpcval($method)); - $msg[1] = new $msgclass('system.methodSignature', null, $id+1); - $msg[1]->addparam(new xmlrpcval($method)); - $actionname = 'Description of method "'.$method.'"'; - break; - case 'list': - $msg[0] = new $msgclass('system.listMethods', null, $id); - $actionname = 'List of available methods'; - break; - case 'execute': - if (!payload_is_safe($payload)) - die("Tsk tsk tsk, please stop it or I will have to call in the cops!"); - $msg[0] = new $msgclass($method, null, $id); - // hack! build xml payload by hand - if ($wstype == 1) - { - $msg[0]->payload = "{\n". - '"method": "' . $method . "\",\n\"params\": [" . - $payload . - "\n],\n\"id\": "; - // fix: if user gave an empty string, use NULL, or we'll break json syntax - if ($id == "") - { - $msg[0]->payload .= "null\n}"; - } - else - { - if (is_numeric($id) || $id == 'false' || $id == 'true' || $id == 'null') - { - $msg[0]->payload .= "$id\n}"; - } - else - { - $msg[0]->payload .= "\"$id\"\n}"; - } - } - } - else - $msg[0]->payload = $msg[0]->xml_header() . - '' . $method . "\n" . - $payload . - "\n" . $msg[0]->xml_footer(); - $actionname = 'Execution of method '.$method; - break; - default: // give a warning - $actionname = '[ERROR: unknown action] "'.$action.'"'; - } - - // Before calling execute, echo out brief description of action taken + date and time ??? - // this gives good user feedback for long-running methods... - echo '

      '.htmlspecialchars($actionname).' on server '.htmlspecialchars($server)." ...

      \n"; - flush(); - - $response = null; - // execute method(s) - if ($debug) - echo '

      Debug info:

      '; /// @todo use ob_start instead - $resp = array(); - $mtime = explode(' ',microtime()); - $time = (float)$mtime[0] + (float)$mtime[1]; - foreach ($msg as $message) - { - // catch errors: for older xmlrpc libs, send does not return by ref - @$response =& $client->send($message, $timeout, $httpprotocol); - $resp[] = $response; - if (!$response || $response->faultCode()) - break; - } - $mtime = explode(' ',microtime()); - $time = (float)$mtime[0] + (float)$mtime[1] - $time; - if ($debug) - echo "
      \n"; - - if ($response) - { - - if ($response->faultCode()) - { - // call failed! echo out error msg! - //echo '

      '.htmlspecialchars($actionname).' on server '.htmlspecialchars($server).'

      '; - echo "

      $protoname call FAILED!

      \n"; - echo "

      Fault code: [" . htmlspecialchars($response->faultCode()) . - "] Reason: '" . htmlspecialchars($response->faultString()) . "'

      \n"; - echo (strftime("%d/%b/%Y:%H:%M:%S\n")); - } - else - { - // call succeeded: parse results - //echo '

      '.htmlspecialchars($actionname).' on server '.htmlspecialchars($server).'

      '; - printf ("

      %s call(s) OK (%.2f secs.)

      \n", $protoname, $time); - echo (strftime("%d/%b/%Y:%H:%M:%S\n")); - - switch ($action) - { - case 'list': - - $v = $response->value(); - if ($v->kindOf()=="array") - { - $max = $v->arraysize(); - echo "\n"; - echo "\n\n\n\n"; - for($i=0; $i < $max; $i++) - { - $rec = $v->arraymem($i); - if ($i%2) $class=' class="oddrow"'; else $class = ' class="evenrow"'; - echo ("".htmlspecialchars($rec->scalarval())."". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "scalarval()."\" />". - "". - "". - "". - ""); - //echo("\n"); - - // generate lo scheletro per il method payload per eventuali test - //$methodpayload="\n".$rec->scalarval()."\n\n\n\n"; - - /*echo ("");*/ - echo("\n"); - } - echo "\n
      MethodDescription
      ". - "". - "". - "". - "scalarval()."\" />". - "". - "". - "
      "; - } - break; - - case 'describe': - - $r1 = $resp[0]->value(); - $r2 = $resp[1]->value(); - - echo "\n"; - echo "\n\n\n\n"; - $desc = htmlspecialchars($r1->scalarval()); - if ($desc == "") - $desc = "-"; - echo "\n"; - $payload=""; - $alt_payload=""; - if ($r2->kindOf()!="array") - echo "\n"; - else - { - for($i=0; $i < $r2->arraysize(); $i++) - { - if ($i+1%2) $class=' class="oddrow"'; else $class = ' class="evenrow"'; - echo "Signature ".($i+1).""; - $x = $r2->arraymem($i); - if ($x->kindOf()=="array") - { - $ret = $x->arraymem(0); - echo "OUT: " . htmlspecialchars($ret->scalarval()) . "
      IN: ("; - if ($x->arraysize() > 1) - { - for($k = 1; $k < $x->arraysize(); $k++) - { - $y = $x->arraymem($k); - echo $y->scalarval(); - if ($wstype != 1) - { - $payload = $payload . '<'.htmlspecialchars($y->scalarval()).'>scalarval()).">\n"; - } - $alt_payload .= $y->scalarval(); - if ($k < $x->arraysize()-1) - { - $alt_payload .= ';'; - echo ", "; - } - } - } - echo ")
      "; - } - else - { - echo 'Unknown'; - } - echo ''; - //bottone per testare questo metodo - //$payload="\n$method\n\n$payload\n"; - echo "
      ". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - ""; - if ($wstype != 1) - echo ""; - echo "\n"; - - echo "
      ". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - "". - ""; - echo "
      \n"; - - } - } - echo "\n
      Method".htmlspecialchars($method)."  
      Description$desc
      SignatureUnknown 
      "; - - break; - - case 'wrap': - $r1 = $resp[0]->value(); - $r2 = $resp[1]->value(); - if ($r2->kindOf()!="array" || $r2->arraysize() <= $methodsig) - echo "Error: signature unknown\n"; - else - { - $mdesc = $r1->scalarval(); - $msig = php_xmlrpc_decode($r2); - $msig = $msig[$methodsig]; - $proto = $protocol == 2 ? 'https' : $protocol == 1 ? 'http11' : ''; - if ($proxy == '' && $username == '' && !$requestcompression && !$responsecompression && - $clientcookies == '') - { - $opts = 0; // simple client copy in stub code - } - else - { - $opts = 1; // complete client copy in stub code - } - if ($wstype == 1) - { - $prefix = 'jsonrpc'; - } - else - { - $prefix = 'xmlrpc'; - } - //$code = wrap_xmlrpc_method($client, $method, $methodsig, 0, $proto, '', $opts); - $code = build_remote_method_wrapper_code($client, $method, str_replace('.', '_', $prefix.'_'.$method), $msig, $mdesc, $timeout, $proto, $opts, $prefix); - //if ($code) - //{ - echo "
      \n"; - highlight_string("'); - echo "\n
      "; - //} - //else - //{ - // echo 'Error while building php code stub...'; - } - - break; - - case 'execute': - echo '

      Response:

      '.htmlspecialchars($response->serialize()).'
      '; - break; - - default: // give a warning - } - } // if !$response->faultCode() - } // if $response - } - else - { - // no action taken yet: give some instructions on debugger usage -?> - -

      Instructions on usage of the debugger:

      -
        -
      1. Run a 'list available methods' action against desired server
      2. -
      3. If list of methods appears, click on 'describe method' for desired method
      4. -
      5. To run method: click on 'load method synopsis' for desired method. This will load a skeleton for method call parameters in the form above. Complete all xmlrpc values with appropriate data and click 'Execute'
      6. -
      -You will need to enable the CURL extension to use the HTTPS and HTTP 1.1 transports

      \n"; - } -?> - -

      Example:

      -

      -Server Address: phpxmlrpc.sourceforge.net
      -Path: /server.php -

      - -

      Notice:

      -

      all usernames and passwords entered on the above form will be written to the web server logs of this server. Use with care.

      - -

      Changelog

      -
        -
      • 2007-02-20: add visual editor for method payload; allow strings, bools as jsonrpc msg id
      • -
      • 2006-06-26: support building php code stub for calling remote methods
      • -
      • 2006-05-25: better support for long running queries; check for no-curl installs
      • -
      • 2006-05-02: added support for JSON-RPC. Note that many interesting json-rpc features are not implemented yet, such as notifications or multicall.
      • -
      • 2006-04-22: added option for setting custom CA certs to verify peer with in SSLmode
      • -
      • 2006-03-05: added option for setting Basic/Digest/NTLM auth type
      • -
      • 2006-01-18: added option echoing to screen xmlrpc request before sending it ('More' debug)
      • -
      • 2005-10-01: added option for setting cookies to be sent to server
      • -
      • 2005-08-07: added switches for compression of requests and responses and http 1.1
      • -
      • 2005-06-27: fixed possible security breach in parsing malformed xml
      • -
      • 2005-06-24: fixed error with calling methods having parameters...
      • -
      - - - diff --git a/include/limesurvey/admin/classes/xmlrpc/debugger/common.php b/include/limesurvey/admin/classes/xmlrpc/debugger/common.php deleted file mode 100644 index 4abcfcf8..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/debugger/common.php +++ /dev/null @@ -1,135 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/debugger/controller.php b/include/limesurvey/admin/classes/xmlrpc/debugger/controller.php deleted file mode 100644 index 6a32dd24..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/debugger/controller.php +++ /dev/null @@ -1,321 +0,0 @@ - 100%... - * @todo add support for more options, such as ntlm auth to proxy, or request charset encoding - * - * @todo parse content of payload textarea to be fed to visual editor - * @todo add http no-cache headers - **/ - - include(getcwd().'/common.php'); - if ($action == '') - $action = 'list'; - - // relative path to the visual xmlrpc editing dialog - $editorpath = '../../javascript/'; -?> - - - -XMLRPC Debugger - - - - - - - - - -
      -
      - - - - - - - - -

      Target server

      Address:Port:Path:
      - - - - - - - - - -

      Action

      List available methods onclick="switchaction();" />Describe method onclick="switchaction();" />Execute method onclick="switchaction();" />Generate stub for method call onclick="switchaction();" />
      - - - - - - - - - - -

      Method

      Name:Payload:
      Msg id: -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      Client options

      Show debug info: -Timeout:Protocol:
      AUTH:Username:Pwd:Type
      SSL:Verify Host's CN:Verify Cert: />CA Cert file:
      PROXY:Server:Proxy user:Proxy pwd:
      COMPRESSION:Request:Response:
      COOKIES:Format: 'cookie1=value1, cookie2=value2'
      - -
      - - \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/debugger/index.php b/include/limesurvey/admin/classes/xmlrpc/debugger/index.php deleted file mode 100644 index 004b21a5..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/debugger/index.php +++ /dev/null @@ -1,21 +0,0 @@ - - - - -XMLRPC Debugger - - - - - - \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/agesort.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/agesort.php deleted file mode 100644 index 62a35cca..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/agesort.php +++ /dev/null @@ -1 +0,0 @@ -xmlrpc

      Agesort demo

      Send an array of 'name' => 'age' pairs to the server that will send it back sorted.

      The source code demonstrates basic lib usage, including handling of xmlrpc arrays and structs

      24, "Edd" => 45, "Joe" => 37, "Fred" => 27);reset($inAr);print "This is the input data:
      ";while (list($key, $val)=each($inAr)) {  print $key . ", " . $val . "\n";}print "
      ";// create parameters from the input array: an xmlrpc array of xmlrpc structs$p=array();foreach($inAr as $key => $val) { $p[]=new xmlrpcval(array("name" => new xmlrpcval($key), "age" => new xmlrpcval($val, "int")), "struct");}$v=new xmlrpcval($p, "array");print "Encoded into xmlrpc format it looks like this:
      \n" .  htmlentities($v->serialize()). "
      \n";// create client and message objects$f=new xmlrpcmsg('examples.sortByAge', array($v));$c=new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80);// set maximum debug level, to have the complete communication printed to screen$c->setDebug(2);// send requestprint "Now sending request (detailed debug info follows)";$r=&$c->send($f);// check response for errors, and take appropriate actionif (!$r->faultCode()) { print "The server gave me these results:
      ";  $v=$r->value();  $max=$v->arraysize();  for($i=0; $i<$max; $i++) {    $rec=$v->arraymem($i);    $n=$rec->structmem("name");    $a=$rec->structmem("age");    print htmlspecialchars($n->scalarval()) . ", " . htmlspecialchars($a->scalarval()) . "\n";  }  print "
      For nerds: I got this value back
      " .    htmlentities($r->serialize()). "

      \n";} else { print "An error occurred:
      ";  print "Code: " . htmlspecialchars($r->faultCode()) .    "\nReason: '" . htmlspecialchars($r->faultString()).'\'

      ';}?>$Id: agesort.php 2 2009-03-16 20:22:51Z ggiunta $ \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/client.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/client.php deleted file mode 100644 index afbd737b..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/client.php +++ /dev/null @@ -1,54 +0,0 @@ - -xmlrpc - -

      Getstatename demo

      -

      Send a U.S. state number to the server and get back the state name

      -

      The code demonstrates usage of the php_xmlrpc_encode function

      -Sending the following request:\n\n" . htmlentities($f->serialize()) . "\n\nDebug info of server data follows...\n\n"; - $c=new xmlrpc_client("/server.php", "phpxmlrpc.sourceforge.net", 80); - $c->setDebug(1); - $r=&$c->send($f); - if(!$r->faultCode()) - { - $v=$r->value(); - print "

      State number " . $stateno . " is " - . htmlspecialchars($v->scalarval()) . "
      "; - // print "
      I got this value back
      " .
      -			//  htmlentities($r->serialize()). "

      \n"; - } - else - { - print "An error occurred: "; - print "Code: " . htmlspecialchars($r->faultCode()) - . " Reason: '" . htmlspecialchars($r->faultString()) . "'

      XMLRPC
      -/
      JSONRPC Debugger (based on the
      PHP-XMLRPC library)


      "; - } - } - else - { - $stateno = ""; - } - - print "
      -
      -

      Enter a state number to query its name

      "; - -?> -
      -$Id: client.php 2 2009-03-16 20:22:51Z ggiunta $ - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/comment.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/comment.php deleted file mode 100644 index 87c292bd..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/comment.php +++ /dev/null @@ -1,185 +0,0 @@ -"; exit(); } -function dispatch($client, $method, $args) { - $msg=new xmlrpcmsg($method, $args); - $resp=$client->send($msg); - if (!$resp) { print "

      IO error: ".$client->errstr."

      "; bomb(); } - if ($resp->faultCode()) { - print "

      There was an error: " . $resp->faultCode() . " " . - $resp->faultString() . "

      "; - bomb(); - } - return php_xmlrpc_decode($resp->value()); -} - -// create client for discussion server -$dclient=new xmlrpc_client("${mydir}/discuss.php", - "xmlrpc.usefulinc.com", 80); - -// check if we're posting a comment, and send it if so -@$storyid=$_POST["storyid"]; -if ($storyid) { - - - // print "Returning to " . $HTTP_POST_VARS["returnto"]; - - $res=dispatch($dclient, "discuss.addComment", - array(new xmlrpcval($storyid), - new xmlrpcval(stripslashes - (@$_POST["name"])), - new xmlrpcval(stripslashes - (@$_POST["commenttext"])))); - - // send the browser back to the originating page - Header("Location: ${mydir}/comment.php?catid=" . - $_POST["catid"] . "&chanid=" . - $_POST["chanid"] . "&oc=" . - $_POST["catid"]); - exit(0); -} - -// now we've got here, we're exploring the story store - -?> -meerkat browser - -

      Meerkat integration

      - -

      Make a comment on the story

      -
      -

      Your name:

      -

      Your comment:

      - -" /> - - - -
      - new xmlrpcval($chanid, "int"), - "ids" => new xmlrpcval(1, "int"), - "descriptions" => new xmlrpcval(200, "int"), - "num_items" => new xmlrpcval(5, "int"), - "dates" => new xmlrpcval(0, "int") - ), "struct"))); - } -?> -
      -

      Subject area:
      -

      - -

      News source:
      - -

      - - - -

      - -
      - - - -

      Stories available

      - -"; - print ""; - print "\n"; - // now look for existing comments - $res=dispatch($dclient, "discuss.getComments", - array(new xmlrpcval($v['id']))); - if (sizeof($res)>0) { - print "\n"; - } - print "\n"; - } -?> -
      " . $v['title'] . "
      "; - print $v['description'] . "
      "; - print "Read full story "; - print "Comment on this story"; - print ""; - print "

      " . - "Comments on this story:

      "; - for($i=0; $iFrom: " . htmlentities($s['name']) . "
      "; - print "Comment: " . htmlentities($s['comment']) . "

      "; - } - print "

      - - -
      -

      -Meerkat powered, yeah! -$Id: comment.php 2 2009-03-16 20:22:51Z ggiunta $

      - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/introspect.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/introspect.php deleted file mode 100644 index 372add0b..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/introspect.php +++ /dev/null @@ -1,108 +0,0 @@ - -xmlrpc - -

      Introspect demo

      -

      Query server for available methods and their description

      -

      The code demonstrates usage of multicall and introspection methods

      -faultCode() - . " Reason: '" .$r->faultString()."'
      "; - } - - // 'new style' client constuctor - $c = new xmlrpc_client("http://phpxmlrpc.sourceforge.net/server.php"); - print "

      methods available at http://" . $c->server . $c->path . "

      \n"; - - $m = new xmlrpcmsg('system.listMethods'); - $r =& $c->send($m); - if($r->faultCode()) - { - display_error($r); - } - else - { - $v=$r->value(); - for($i=0; $i<$v->arraysize(); $i++) - { - $mname=$v->arraymem($i); - print "

      " . $mname->scalarval() . "

      \n"; - - // build messages first, add params later - $m1 = new xmlrpcmsg('system.methodHelp'); - $m2 = new xmlrpcmsg('system.methodSignature'); - $val = new xmlrpcval($mname->scalarval(), "string"); - $m1->addParam($val); - $m2->addParam($val); - - // send multiple messages in one pass. - // If server does not support multicall, client will fall back to 2 separate calls - $ms = array($m1, $m2); - $rs =& $c->send($ms); - - if($rs[0]->faultCode()) - { - display_error($rs[0]); - } - else - { - $val=$rs[0]->value(); - $txt=$val->scalarval(); - if($txt != "") - { - print "

      Documentation

      ${txt}

      \n"; - } - else - { - print "

      No documentation available.

      \n"; - } - } - - if($rs[1]->faultCode()) - { - display_error($rs[1]); - } - else - { - print "

      Signature

      \n"; - $val = $rs[1]->value(); - if($val->kindOf()=="array") - { - for($j=0; $j<$val->arraysize(); $j++) - { - $x = $val->arraymem($j); - $ret = $x->arraymem(0); - print "" . $ret->scalarval() . " " - . $mname->scalarval() . "("; - if($x->arraysize()>1) - { - for($k=1; $k<$x->arraysize(); $k++) - { - $y = $x->arraymem($k); - print $y->scalarval(); - if($k < $x->arraysize()-1) - { - print ", "; - } - } - } - print ")
      \n"; - } - } - else - { - print "Signature unknown\n"; - } - print "

      \n"; - } - } - } -?> -
      -$Id: introspect.php 2 2009-03-16 20:22:51Z ggiunta $ - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/mail.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/mail.php deleted file mode 100644 index 85bacbe7..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/mail.php +++ /dev/null @@ -1,71 +0,0 @@ - - -xmlrpc - -

      Mail demo

      -

      This form enables you to send mail via an XML-RPC server. For public use -only the "Userland" server will work (see Dave Winer's message). -When you press Send this page will reload, showing you the XML-RPC request sent to the host server, the XML-RPC response received and the internal evaluation done by the PHP implementation.

      -

      You can find the source to this page here: mail.php
      -And the source to a functionally identical mail-by-XML-RPC server in the file server.php included with the library (look for the 'mail_send' method)

      -addParam(new xmlrpcval($HTTP_POST_VARS["mailto"])); - $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailsub"])); - $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailmsg"])); - $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailfrom"])); - $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailcc"])); - $f->addParam(new xmlrpcval($HTTP_POST_VARS["mailbcc"])); - $f->addParam(new xmlrpcval("text/plain")); - - $c=new xmlrpc_client($XP, $XS, 80); - $c->setDebug(2); - $r=&$c->send($f); - if (!$r->faultCode()) { - print "Mail sent OK
      \n"; - } else { - print ""; - print "Mail send failed
      \n"; - print "Fault: "; - print "Code: " . htmlspecialchars($r->faultCode()) . - " Reason: '" . htmlspecialchars($r->faultString()) . "'
      "; - print "

      "; - } -} -?> -
      -Server -
      -From
      -
      -To
      -Cc
      -Bcc
      -
      -Subject -
      -Body
      - -
      -
      -$Id: mail.php 2 2009-03-16 20:22:51Z ggiunta $ - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/simple_call.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/simple_call.php deleted file mode 100644 index 62ceee81..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/simple_call.php +++ /dev/null @@ -1,59 +0,0 @@ -send(new xmlrpcmsg($remote_function_name, $xmlrpcval_array)); - } - } -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/which.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/which.php deleted file mode 100644 index ac16a038..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/which.php +++ /dev/null @@ -1,32 +0,0 @@ - -xmlrpc - -

      Which toolkit demo

      -

      Query server for toolkit information

      -

      The code demonstrates usage of the php_xmlrpc_decode function

      -send($f); - if(!$r->faultCode()) - { - $v = php_xmlrpc_decode($r->value()); - print "
      ";
      -		print "name: " . htmlspecialchars($v["toolkitName"]) . "\n";
      -		print "version: " . htmlspecialchars($v["toolkitVersion"]) . "\n";
      -		print "docs: " . htmlspecialchars($v["toolkitDocsUrl"]) . "\n";
      -		print "os: " . htmlspecialchars($v["toolkitOperatingSystem"]) . "\n";
      -		print "
      "; - } - else - { - print "An error occurred: "; - print "Code: " . htmlspecialchars($r->faultCode()) . " Reason: '" . htmlspecialchars($r->faultString()) . "'\n"; - } -?> -
      -$Id: which.php 2 2009-03-16 20:22:51Z ggiunta $ - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/wrap.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/wrap.php deleted file mode 100644 index 71ab3175..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/wrap.php +++ /dev/null @@ -1,58 +0,0 @@ - -xmlrpc - -

      Webservice wrappper demo

      -

      Wrap methods exposed by server into php functions

      -

      The code demonstrates usage of the most automagic client usage possible:
      -1) client that returns php values instead of xmlrpcval objects
      -2) wrapping of remote methods into php functions -

      -return_type = 'phpvals'; // let client give us back php values instead of xmlrpcvals - $r =& $c->send(new xmlrpcmsg('system.listMethods')); - if($r->faultCode()) - { - echo "

      Server methods list could not be retrieved: error '".htmlspecialchars($r->faultString())."'

      \n"; - } - else - { - $testcase = ''; - echo "

      Server methods list retrieved, now wrapping it up...

      \n
        \n"; - foreach($r->value() as $methodname) // $r->value is an array of strings - { - // do not wrap remote server system methods - if (strpos($methodname, 'system.') !== 0) - { - $funcname = wrap_xmlrpc_method($c, $methodname); - if($funcname) - { - echo "
      • Remote server method ".htmlspecialchars($methodname)." wrapped into php function ".$funcname."
      • \n"; - } - else - { - echo "
      • Remote server method ".htmlspecialchars($methodname)." could not be wrapped!
      • \n"; - } - if($methodname == 'examples.getStateName') - { - $testcase = $funcname; - } - } - } - echo "
      \n"; - if($testcase) - { - echo "Now testing function $testcase: remote method to convert U.S. state number into state name"; - $statenum = 25; - $statename = $testcase($statenum, 2); - echo "State number $statenum is ".htmlspecialchars($statename); - } - } -?> -
      -$Id: wrap.php 2 2009-03-16 20:22:51Z ggiunta $ - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/client/zopetest.php b/include/limesurvey/admin/classes/xmlrpc/demo/client/zopetest.php deleted file mode 100644 index defe63d5..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/client/zopetest.php +++ /dev/null @@ -1,31 +0,0 @@ - -xmlrpc - -

      Zope test demo

      -

      The code demonstrates usage of basic authentication to connect to the server

      -setCredentials("username", "password"); - $c->setDebug(2); - $r = $c->send($f); - if(!$r->faultCode()) - { - $v = $r->value(); - print "I received:" . htmlspecialchars($v->scalarval()) . "
      "; - print "
      I got this value back
      pre>" . - htmlentities($r->serialize()). "
  • \n"; - } - else - { - print "An error occurred: "; - print "Code: " . htmlspecialchars($r->faultCode()) - . " Reason: '" . ($r->faultString()) . "'
    "; - } -?> -
    -$Id: zopetest.php 2 2009-03-16 20:22:51Z ggiunta $ - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/demo1.txt b/include/limesurvey/admin/classes/xmlrpc/demo/demo1.txt deleted file mode 100644 index 2543c90a..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/demo1.txt +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - -thearray - - -ABCDEFHIJ -1234 -1 - - - -theint -23 - -thestring -foobarwhizz - -thestruct - -one -1 - -two -2 - - - - - - - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/demo2.txt b/include/limesurvey/admin/classes/xmlrpc/demo/demo2.txt deleted file mode 100644 index 28914225..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/demo2.txt +++ /dev/null @@ -1,8 +0,0 @@ - - - - - South Dakota's own - - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/demo3.txt b/include/limesurvey/admin/classes/xmlrpc/demo/demo3.txt deleted file mode 100644 index 9247fca3..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/demo3.txt +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - faultCode - 4 - - - faultString - Too many parameters. - - - - - diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/server/discuss.php b/include/limesurvey/admin/classes/xmlrpc/demo/server/discuss.php deleted file mode 100644 index 45dfe826..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/server/discuss.php +++ /dev/null @@ -1,124 +0,0 @@ -getParam(0)); - } - else - { - $msgID=php_xmlrpc_decode($m->getParam(0)); - } - $dbh=dba_open("/tmp/comments.db", "r", "db2"); - if($dbh) - { - $countID="${msgID}_count"; - if(dba_exists($countID, $dbh)) - { - $count=dba_fetch($countID, $dbh); - for($i=0; $i<$count; $i++) - { - $name=dba_fetch("${msgID}_name_${i}", $dbh); - $comment=dba_fetch("${msgID}_comment_${i}", $dbh); - // push a new struct onto the return array - $ra[] = array( - "name" => $name, - "comment" => $comment - ); - } - } - } - // if we generated an error, create an error return response - if($err) - { - return new xmlrpcresp(0, $xmlrpcerruser, $err); - } - else - { - // otherwise, we create the right response - // with the state name - return new xmlrpcresp(php_xmlrpc_encode($ra)); - } - } - - $s = new xmlrpc_server(array( - "discuss.addComment" => array( - "function" => "addcomment", - "signature" => $addcomment_sig, - "docstring" => $addcomment_doc - ), - "discuss.getComments" => array( - "function" => "getcomments", - "signature" => $getcomments_sig, - "docstring" => $getcomments_doc - ) - )); -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/server/proxy.php b/include/limesurvey/admin/classes/xmlrpc/demo/server/proxy.php deleted file mode 100644 index 4c954e2b..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/server/proxy.php +++ /dev/null @@ -1,86 +0,0 @@ -getParam(0)); - $c = new xmlrpc_client($url); - if ($m->getNumParams() > 3) - { - // we have to set some options onto the client. - // Note that if we do not untaint the received values, warnings might be generated... - $options = php_xmlrpc_decode($m->getParam(3)); - foreach($options as $key => $val) - { - switch($key) - { - case 'Cookie': - break; - case 'Credentials': - break; - case 'RequestCompression': - $c->setRequestCompression($val); - break; - case 'SSLVerifyHost': - $c->setSSLVerifyHost($val); - break; - case 'SSLVerifyPeer': - $c->setSSLVerifyPeer($val); - break; - case 'Timeout': - $timeout = (integer) $val; - break; - } // switch - } - } - - // build call for remote server - /// @todo find a weay to forward client info (such as IP) to server, either - /// - as xml comments in the payload, or - /// - using std http header conventions, such as X-forwarded-for... - $method = php_xmlrpc_decode($m->getParam(1)); - $pars = $m->getParam(2); - $m = new xmlrpcmsg($method); - for ($i = 0; $i < $pars->arraySize(); $i++) - { - $m->addParam($pars->arraymem($i)); - } - - // add debug info into response we give back to caller - xmlrpc_debugmsg("Sending to server $url the payload: ".$m->serialize()); - return $c->send($m, $timeout); - } - - // run the server - $server = new xmlrpc_server( - array( - 'xmlrpcproxy.call' => array( - 'function' => 'forward_request', - 'signature' => array( - array('mixed', 'string', 'string', 'array'), - array('mixed', 'string', 'string', 'array', 'stuct'), - ), - 'docstring' => 'forwards xmlrpc calls to remote servers. Returns remote method\'s response. Accepts params: remote server url (might include basic auth credentials), method name, array of params, and (optionally) a struct containing call options' - ) - ) - ); -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/server/server.php b/include/limesurvey/admin/classes/xmlrpc/demo/server/server.php deleted file mode 100644 index 0c5cb0aa..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/server/server.php +++ /dev/null @@ -1,853 +0,0 @@ -getParam(0); - - // param must be there and of the correct type: server object does the - // validation for us - - // extract the value of the state number - $snv=$sno->scalarval(); - // look it up in our array (zero-based) - if (isset($stateNames[$snv-1])) - { - $sname=$stateNames[$snv-1]; - } - else - { - // not, there so complain - $err="I don't have a state for the index '" . $snv . "'"; - } - - // if we generated an error, create an error return response - if ($err) - { - return new xmlrpcresp(0, $xmlrpcerruser, $err); - } - else - { - // otherwise, we create the right response - // with the state name - return new xmlrpcresp(new xmlrpcval($sname)); - } - } - - /** - * Inner code of the state-number server. - * Used to test auto-registration of PHP funcions as xmlrpc methods. - * @param integer $stateno the state number - * @return string the name of the state (or error descrption) - */ - function inner_findstate($stateno) - { - global $stateNames; - if (isset($stateNames[$stateno-1])) - { - return $stateNames[$stateno-1]; - } - else - { - // not, there so complain - return "I don't have a state for the index '" . $stateno . "'"; - } - } - $findstate2_sig = wrap_php_function('inner_findstate'); - - $findstate3_sig = wrap_php_function(array('xmlrpc_server_methods_container', 'findstate')); - - $findstate5_sig = wrap_php_function('xmlrpc_server_methods_container::findstate'); - - $obj = new xmlrpc_server_methods_container(); - $findstate4_sig = wrap_php_function(array($obj, 'findstate')); - - $addtwo_sig=array(array($xmlrpcInt, $xmlrpcInt, $xmlrpcInt)); - $addtwo_doc='Add two integers together and return the result'; - function addtwo($m) - { - $s=$m->getParam(0); - $t=$m->getParam(1); - return new xmlrpcresp(new xmlrpcval($s->scalarval()+$t->scalarval(),"int")); - } - - $addtwodouble_sig=array(array($xmlrpcDouble, $xmlrpcDouble, $xmlrpcDouble)); - $addtwodouble_doc='Add two doubles together and return the result'; - function addtwodouble($m) - { - $s=$m->getParam(0); - $t=$m->getParam(1); - return new xmlrpcresp(new xmlrpcval($s->scalarval()+$t->scalarval(),"double")); - } - - $stringecho_sig=array(array($xmlrpcString, $xmlrpcString)); - $stringecho_doc='Accepts a string parameter, returns the string.'; - function stringecho($m) - { - // just sends back a string - $s=$m->getParam(0); - $v = $s->scalarval(); - return new xmlrpcresp(new xmlrpcval($s->scalarval())); - } - - $echoback_sig=array(array($xmlrpcString, $xmlrpcString)); - $echoback_doc='Accepts a string parameter, returns the entire incoming payload'; - function echoback($m) - { - // just sends back a string with what i got - // sent to me, just escaped, that's all - // - // $m is an incoming message - $s="I got the following message:\n" . $m->serialize(); - return new xmlrpcresp(new xmlrpcval($s)); - } - - $echosixtyfour_sig=array(array($xmlrpcString, $xmlrpcBase64)); - $echosixtyfour_doc='Accepts a base64 parameter and returns it decoded as a string'; - function echosixtyfour($m) - { - // accepts an encoded value, but sends it back - // as a normal string. this is to test base64 encoding - // is working as expected - $incoming=$m->getParam(0); - return new xmlrpcresp(new xmlrpcval($incoming->scalarval(), "string")); - } - - $bitflipper_sig=array(array($xmlrpcArray, $xmlrpcArray)); - $bitflipper_doc='Accepts an array of booleans, and returns them inverted'; - function bitflipper($m) - { - global $xmlrpcArray; - - $v=$m->getParam(0); - $sz=$v->arraysize(); - $rv=new xmlrpcval(array(), $xmlrpcArray); - - for($j=0; $j<$sz; $j++) - { - $b=$v->arraymem($j); - if ($b->scalarval()) - { - $rv->addScalar(false, "boolean"); - } - else - { - $rv->addScalar(true, "boolean"); - } - } - - return new xmlrpcresp($rv); - } - - // Sorting demo - // - // send me an array of structs thus: - // - // Dave 35 - // Edd 45 - // Fred 23 - // Barney 37 - // - // and I'll return it to you in sorted order - - function agesorter_compare($a, $b) - { - global $agesorter_arr; - - // don't even ask me _why_ these come padded with - // hyphens, I couldn't tell you :p - $a=str_replace("-", "", $a); - $b=str_replace("-", "", $b); - - if ($agesorter_arr[$a]==$agesorter[$b]) - { - return 0; - } - return ($agesorter_arr[$a] > $agesorter_arr[$b]) ? -1 : 1; - } - - $agesorter_sig=array(array($xmlrpcArray, $xmlrpcArray)); - $agesorter_doc='Send this method an array of [string, int] structs, eg: -
    - Dave   35
    - Edd	45
    - Fred   23
    - Barney 37
    -
    -And the array will be returned with the entries sorted by their numbers. -'; - function agesorter($m) - { - global $agesorter_arr, $xmlrpcerruser, $s; - - xmlrpc_debugmsg("Entering 'agesorter'"); - // get the parameter - $sno=$m->getParam(0); - // error string for [if|when] things go wrong - $err=""; - // create the output value - $v=new xmlrpcval(); - $agar=array(); - - if (isset($sno) && $sno->kindOf()=="array") - { - $max=$sno->arraysize(); - // TODO: create debug method to print can work once more - // print "\n"; - for($i=0; $i<$max; $i++) - { - $rec=$sno->arraymem($i); - if ($rec->kindOf()!="struct") - { - $err="Found non-struct in array at element $i"; - break; - } - // extract name and age from struct - $n=$rec->structmem("name"); - $a=$rec->structmem("age"); - // $n and $a are xmlrpcvals, - // so get the scalarval from them - $agar[$n->scalarval()]=$a->scalarval(); - } - - $agesorter_arr=$agar; - // hack, must make global as uksort() won't - // allow us to pass any other auxilliary information - uksort($agesorter_arr, agesorter_compare); - $outAr=array(); - while (list( $key, $val ) = each( $agesorter_arr ) ) - { - // recreate each struct element - $outAr[]=new xmlrpcval(array("name" => - new xmlrpcval($key), - "age" => - new xmlrpcval($val, "int")), "struct"); - } - // add this array to the output value - $v->addArray($outAr); - } - else - { - $err="Must be one parameter, an array of structs"; - } - - if ($err) - { - return new xmlrpcresp(0, $xmlrpcerruser, $err); - } - else - { - return new xmlrpcresp($v); - } - } - - // signature and instructions, place these in the dispatch - // map - $mail_send_sig=array(array( - $xmlrpcBoolean, $xmlrpcString, $xmlrpcString, - $xmlrpcString, $xmlrpcString, $xmlrpcString, - $xmlrpcString, $xmlrpcString - )); - - $mail_send_doc='mail.send(recipient, subject, text, sender, cc, bcc, mimetype)
    -recipient, cc, and bcc are strings, comma-separated lists of email addresses, as described above.
    -subject is a string, the subject of the message.
    -sender is a string, it\'s the email address of the person sending the message. This string can not be -a comma-separated list, it must contain a single email address only.
    -text is a string, it contains the body of the message.
    -mimetype, a string, is a standard MIME type, for example, text/plain. -'; - // WARNING; this functionality depends on the sendmail -t option - // it may not work with Windows machines properly; particularly - // the Bcc option. Sneak on your friends at your own risk! - function mail_send($m) - { - global $xmlrpcerruser, $xmlrpcBoolean; - $err=""; - - $mTo=$m->getParam(0); - $mSub=$m->getParam(1); - $mBody=$m->getParam(2); - $mFrom=$m->getParam(3); - $mCc=$m->getParam(4); - $mBcc=$m->getParam(5); - $mMime=$m->getParam(6); - - if ($mTo->scalarval()=="") - { - $err="Error, no 'To' field specified"; - } - - if ($mFrom->scalarval()=="") - { - $err="Error, no 'From' field specified"; - } - - $msghdr="From: " . $mFrom->scalarval() . "\n"; - $msghdr.="To: ". $mTo->scalarval() . "\n"; - - if ($mCc->scalarval()!="") - { - $msghdr.="Cc: " . $mCc->scalarval(). "\n"; - } - if ($mBcc->scalarval()!="") - { - $msghdr.="Bcc: " . $mBcc->scalarval(). "\n"; - } - if ($mMime->scalarval()!="") - { - $msghdr.="Content-type: " . $mMime->scalarval() . "\n"; - } - $msghdr.="X-Mailer: XML-RPC for PHP mailer 1.0"; - - if ($err=="") - { - if (!mail("", - $mSub->scalarval(), - $mBody->scalarval(), - $msghdr)) - { - $err="Error, could not send the mail."; - } - } - - if ($err) - { - return new xmlrpcresp(0, $xmlrpcerruser, $err); - } - else - { - return new xmlrpcresp(new xmlrpcval("true", $xmlrpcBoolean)); - } - } - - $getallheaders_sig=array(array($xmlrpcStruct)); - $getallheaders_doc='Returns a struct containing all the HTTP headers received with the request. Provides limited functionality with IIS'; - function getallheaders_xmlrpc($m) - { - global $xmlrpcerruser; - if (function_exists('getallheaders')) - { - return new xmlrpcresp(php_xmlrpc_encode(getallheaders())); - } - else - { - $headers = array(); - // IIS: poor man's version of getallheaders - foreach ($_SERVER as $key => $val) - if (strpos($key, 'HTTP_') === 0) - { - $key = ucfirst(str_replace('_', '-', strtolower(substr($key, 5)))); - $headers[$key] = $val; - } - return new xmlrpcresp(php_xmlrpc_encode($headers)); - } - } - - $setcookies_sig=array(array($xmlrpcInt, $xmlrpcStruct)); - $setcookies_doc='Sends to client a response containing a single \'1\' digit, and sets to it http cookies as received in the request (array of structs describing a cookie)'; - function setcookies($m) - { - $m = $m->getParam(0); - while(list($name,$value) = $m->structeach()) - { - $cookiedesc = php_xmlrpc_decode($value); - setcookie($name, @$cookiedesc['value'], @$cookiedesc['expires'], @$cookiedesc['path'], @$cookiedesc['domain'], @$cookiedesc['secure']); - } - return new xmlrpcresp(new xmlrpcval(1, 'int')); - } - - $getcookies_sig=array(array($xmlrpcStruct)); - $getcookies_doc='Sends to client a response containing all http cookies as received in the request (as struct)'; - function getcookies($m) - { - return new xmlrpcresp(php_xmlrpc_encode($_COOKIE)); - } - - $v1_arrayOfStructs_sig=array(array($xmlrpcInt, $xmlrpcArray)); - $v1_arrayOfStructs_doc='This handler takes a single parameter, an array of structs, each of which contains at least three elements named moe, larry and curly, all s. Your handler must add all the struct elements named curly and return the result.'; - function v1_arrayOfStructs($m) - { - $sno=$m->getParam(0); - $numcurly=0; - for($i=0; $i<$sno->arraysize(); $i++) - { - $str=$sno->arraymem($i); - $str->structreset(); - while(list($key,$val)=$str->structeach()) - { - if ($key=="curly") - { - $numcurly+=$val->scalarval(); - } - } - } - return new xmlrpcresp(new xmlrpcval($numcurly, "int")); - } - - $v1_easyStruct_sig=array(array($xmlrpcInt, $xmlrpcStruct)); - $v1_easyStruct_doc='This handler takes a single parameter, a struct, containing at least three elements named moe, larry and curly, all <i4>s. Your handler must add the three numbers and return the result.'; - function v1_easyStruct($m) - { - $sno=$m->getParam(0); - $moe=$sno->structmem("moe"); - $larry=$sno->structmem("larry"); - $curly=$sno->structmem("curly"); - $num=$moe->scalarval() + $larry->scalarval() + $curly->scalarval(); - return new xmlrpcresp(new xmlrpcval($num, "int")); - } - - $v1_echoStruct_sig=array(array($xmlrpcStruct, $xmlrpcStruct)); - $v1_echoStruct_doc='This handler takes a single parameter, a struct. Your handler must return the struct.'; - function v1_echoStruct($m) - { - $sno=$m->getParam(0); - return new xmlrpcresp($sno); - } - - $v1_manyTypes_sig=array(array( - $xmlrpcArray, $xmlrpcInt, $xmlrpcBoolean, - $xmlrpcString, $xmlrpcDouble, $xmlrpcDateTime, - $xmlrpcBase64 - )); - $v1_manyTypes_doc='This handler takes six parameters, and returns an array containing all the parameters.'; - function v1_manyTypes($m) - { - return new xmlrpcresp(new xmlrpcval(array( - $m->getParam(0), - $m->getParam(1), - $m->getParam(2), - $m->getParam(3), - $m->getParam(4), - $m->getParam(5)), - "array" - )); - } - - $v1_moderateSizeArrayCheck_sig=array(array($xmlrpcString, $xmlrpcArray)); - $v1_moderateSizeArrayCheck_doc='This handler takes a single parameter, which is an array containing between 100 and 200 elements. Each of the items is a string, your handler must return a string containing the concatenated text of the first and last elements.'; - function v1_moderateSizeArrayCheck($m) - { - $ar=$m->getParam(0); - $sz=$ar->arraysize(); - $first=$ar->arraymem(0); - $last=$ar->arraymem($sz-1); - return new xmlrpcresp(new xmlrpcval($first->scalarval() . - $last->scalarval(), "string")); - } - - $v1_simpleStructReturn_sig=array(array($xmlrpcStruct, $xmlrpcInt)); - $v1_simpleStructReturn_doc='This handler takes one parameter, and returns a struct containing three elements, times10, times100 and times1000, the result of multiplying the number by 10, 100 and 1000.'; - function v1_simpleStructReturn($m) - { - $sno=$m->getParam(0); - $v=$sno->scalarval(); - return new xmlrpcresp(new xmlrpcval(array( - "times10" => new xmlrpcval($v*10, "int"), - "times100" => new xmlrpcval($v*100, "int"), - "times1000" => new xmlrpcval($v*1000, "int")), - "struct" - )); - } - - $v1_nestedStruct_sig=array(array($xmlrpcInt, $xmlrpcStruct)); - $v1_nestedStruct_doc='This handler takes a single parameter, a struct, that models a daily calendar. At the top level, there is one struct for each year. Each year is broken down into months, and months into days. Most of the days are empty in the struct you receive, but the entry for April 1, 2000 contains a least three elements named moe, larry and curly, all <i4>s. Your handler must add the three numbers and return the result.'; - function v1_nestedStruct($m) - { - $sno=$m->getParam(0); - - $twoK=$sno->structmem("2000"); - $april=$twoK->structmem("04"); - $fools=$april->structmem("01"); - $curly=$fools->structmem("curly"); - $larry=$fools->structmem("larry"); - $moe=$fools->structmem("moe"); - return new xmlrpcresp(new xmlrpcval($curly->scalarval() + $larry->scalarval() + $moe->scalarval(), "int")); - } - - $v1_countTheEntities_sig=array(array($xmlrpcStruct, $xmlrpcString)); - $v1_countTheEntities_doc='This handler takes a single parameter, a string, that contains any number of predefined entities, namely <, >, & \' and ".
    Your handler must return a struct that contains five fields, all numbers: ctLeftAngleBrackets, ctRightAngleBrackets, ctAmpersands, ctApostrophes, ctQuotes.'; - function v1_countTheEntities($m) - { - $sno=$m->getParam(0); - $str=$sno->scalarval(); - $gt=0; $lt=0; $ap=0; $qu=0; $amp=0; - for($i=0; $i": - $gt++; - break; - case "<": - $lt++; - break; - case "\"": - $qu++; - break; - case "'": - $ap++; - break; - case "&": - $amp++; - break; - default: - break; - } - } - return new xmlrpcresp(new xmlrpcval(array( - "ctLeftAngleBrackets" => new xmlrpcval($lt, "int"), - "ctRightAngleBrackets" => new xmlrpcval($gt, "int"), - "ctAmpersands" => new xmlrpcval($amp, "int"), - "ctApostrophes" => new xmlrpcval($ap, "int"), - "ctQuotes" => new xmlrpcval($qu, "int")), - "struct" - )); - } - - // trivial interop tests - // http://www.xmlrpc.com/stories/storyReader$1636 - - $i_echoString_sig=array(array($xmlrpcString, $xmlrpcString)); - $i_echoString_doc="Echoes string."; - - $i_echoStringArray_sig=array(array($xmlrpcArray, $xmlrpcArray)); - $i_echoStringArray_doc="Echoes string array."; - - $i_echoInteger_sig=array(array($xmlrpcInt, $xmlrpcInt)); - $i_echoInteger_doc="Echoes integer."; - - $i_echoIntegerArray_sig=array(array($xmlrpcArray, $xmlrpcArray)); - $i_echoIntegerArray_doc="Echoes integer array."; - - $i_echoFloat_sig=array(array($xmlrpcDouble, $xmlrpcDouble)); - $i_echoFloat_doc="Echoes float."; - - $i_echoFloatArray_sig=array(array($xmlrpcArray, $xmlrpcArray)); - $i_echoFloatArray_doc="Echoes float array."; - - $i_echoStruct_sig=array(array($xmlrpcStruct, $xmlrpcStruct)); - $i_echoStruct_doc="Echoes struct."; - - $i_echoStructArray_sig=array(array($xmlrpcArray, $xmlrpcArray)); - $i_echoStructArray_doc="Echoes struct array."; - - $i_echoValue_doc="Echoes any value back."; - $i_echoValue_sig=array(array($xmlrpcValue, $xmlrpcValue)); - - $i_echoBase64_sig=array(array($xmlrpcBase64, $xmlrpcBase64)); - $i_echoBase64_doc="Echoes base64."; - - $i_echoDate_sig=array(array($xmlrpcDateTime, $xmlrpcDateTime)); - $i_echoDate_doc="Echoes dateTime."; - - function i_echoParam($m) - { - $s=$m->getParam(0); - return new xmlrpcresp($s); - } - - function i_echoString($m) { return i_echoParam($m); } - function i_echoInteger($m) { return i_echoParam($m); } - function i_echoFloat($m) { return i_echoParam($m); } - function i_echoStruct($m) { return i_echoParam($m); } - function i_echoStringArray($m) { return i_echoParam($m); } - function i_echoIntegerArray($m) { return i_echoParam($m); } - function i_echoFloatArray($m) { return i_echoParam($m); } - function i_echoStructArray($m) { return i_echoParam($m); } - function i_echoValue($m) { return i_echoParam($m); } - function i_echoBase64($m) { return i_echoParam($m); } - function i_echoDate($m) { return i_echoParam($m); } - - $i_whichToolkit_sig=array(array($xmlrpcStruct)); - $i_whichToolkit_doc="Returns a struct containing the following strings: toolkitDocsUrl, toolkitName, toolkitVersion, toolkitOperatingSystem."; - - function i_whichToolkit($m) - { - global $xmlrpcName, $xmlrpcVersion,$SERVER_SOFTWARE; - $ret=array( - "toolkitDocsUrl" => "http://phpxmlrpc.sourceforge.net/", - "toolkitName" => $xmlrpcName, - "toolkitVersion" => $xmlrpcVersion, - "toolkitOperatingSystem" => isset ($SERVER_SOFTWARE) ? $SERVER_SOFTWARE : $_SERVER['SERVER_SOFTWARE'] - ); - return new xmlrpcresp ( php_xmlrpc_encode($ret)); - } - - $o=new xmlrpc_server_methods_container; - $a=array( - "examples.getStateName" => array( - "function" => "findstate", - "signature" => $findstate_sig, - "docstring" => $findstate_doc - ), - "examples.sortByAge" => array( - "function" => "agesorter", - "signature" => $agesorter_sig, - "docstring" => $agesorter_doc - ), - "examples.addtwo" => array( - "function" => "addtwo", - "signature" => $addtwo_sig, - "docstring" => $addtwo_doc - ), - "examples.addtwodouble" => array( - "function" => "addtwodouble", - "signature" => $addtwodouble_sig, - "docstring" => $addtwodouble_doc - ), - "examples.stringecho" => array( - "function" => "stringecho", - "signature" => $stringecho_sig, - "docstring" => $stringecho_doc - ), - "examples.echo" => array( - "function" => "echoback", - "signature" => $echoback_sig, - "docstring" => $echoback_doc - ), - "examples.decode64" => array( - "function" => "echosixtyfour", - "signature" => $echosixtyfour_sig, - "docstring" => $echosixtyfour_doc - ), - "examples.invertBooleans" => array( - "function" => "bitflipper", - "signature" => $bitflipper_sig, - "docstring" => $bitflipper_doc - ), - "examples.generatePHPWarning" => array( - "function" => array($o, "phpwarninggenerator") - //'function' => 'xmlrpc_server_methods_container::phpwarninggenerator' - ), - "examples.raiseException" => array( - "function" => array($o, "exceptiongenerator") - ), - "examples.getallheaders" => array( - "function" => 'getallheaders_xmlrpc', - "signature" => $getallheaders_sig, - "docstring" => $getallheaders_doc - ), - "examples.setcookies" => array( - "function" => 'setcookies', - "signature" => $setcookies_sig, - "docstring" => $setcookies_doc - ), - "examples.getcookies" => array( - "function" => 'getcookies', - "signature" => $getcookies_sig, - "docstring" => $getcookies_doc - ), - "mail.send" => array( - "function" => "mail_send", - "signature" => $mail_send_sig, - "docstring" => $mail_send_doc - ), - "validator1.arrayOfStructsTest" => array( - "function" => "v1_arrayOfStructs", - "signature" => $v1_arrayOfStructs_sig, - "docstring" => $v1_arrayOfStructs_doc - ), - "validator1.easyStructTest" => array( - "function" => "v1_easyStruct", - "signature" => $v1_easyStruct_sig, - "docstring" => $v1_easyStruct_doc - ), - "validator1.echoStructTest" => array( - "function" => "v1_echoStruct", - "signature" => $v1_echoStruct_sig, - "docstring" => $v1_echoStruct_doc - ), - "validator1.manyTypesTest" => array( - "function" => "v1_manyTypes", - "signature" => $v1_manyTypes_sig, - "docstring" => $v1_manyTypes_doc - ), - "validator1.moderateSizeArrayCheck" => array( - "function" => "v1_moderateSizeArrayCheck", - "signature" => $v1_moderateSizeArrayCheck_sig, - "docstring" => $v1_moderateSizeArrayCheck_doc - ), - "validator1.simpleStructReturnTest" => array( - "function" => "v1_simpleStructReturn", - "signature" => $v1_simpleStructReturn_sig, - "docstring" => $v1_simpleStructReturn_doc - ), - "validator1.nestedStructTest" => array( - "function" => "v1_nestedStruct", - "signature" => $v1_nestedStruct_sig, - "docstring" => $v1_nestedStruct_doc - ), - "validator1.countTheEntities" => array( - "function" => "v1_countTheEntities", - "signature" => $v1_countTheEntities_sig, - "docstring" => $v1_countTheEntities_doc - ), - "interopEchoTests.echoString" => array( - "function" => "i_echoString", - "signature" => $i_echoString_sig, - "docstring" => $i_echoString_doc - ), - "interopEchoTests.echoStringArray" => array( - "function" => "i_echoStringArray", - "signature" => $i_echoStringArray_sig, - "docstring" => $i_echoStringArray_doc - ), - "interopEchoTests.echoInteger" => array( - "function" => "i_echoInteger", - "signature" => $i_echoInteger_sig, - "docstring" => $i_echoInteger_doc - ), - "interopEchoTests.echoIntegerArray" => array( - "function" => "i_echoIntegerArray", - "signature" => $i_echoIntegerArray_sig, - "docstring" => $i_echoIntegerArray_doc - ), - "interopEchoTests.echoFloat" => array( - "function" => "i_echoFloat", - "signature" => $i_echoFloat_sig, - "docstring" => $i_echoFloat_doc - ), - "interopEchoTests.echoFloatArray" => array( - "function" => "i_echoFloatArray", - "signature" => $i_echoFloatArray_sig, - "docstring" => $i_echoFloatArray_doc - ), - "interopEchoTests.echoStruct" => array( - "function" => "i_echoStruct", - "signature" => $i_echoStruct_sig, - "docstring" => $i_echoStruct_doc - ), - "interopEchoTests.echoStructArray" => array( - "function" => "i_echoStructArray", - "signature" => $i_echoStructArray_sig, - "docstring" => $i_echoStructArray_doc - ), - "interopEchoTests.echoValue" => array( - "function" => "i_echoValue", - "signature" => $i_echoValue_sig, - "docstring" => $i_echoValue_doc - ), - "interopEchoTests.echoBase64" => array( - "function" => "i_echoBase64", - "signature" => $i_echoBase64_sig, - "docstring" => $i_echoBase64_doc - ), - "interopEchoTests.echoDate" => array( - "function" => "i_echoDate", - "signature" => $i_echoDate_sig, - "docstring" => $i_echoDate_doc - ), - "interopEchoTests.whichToolkit" => array( - "function" => "i_whichToolkit", - "signature" => $i_whichToolkit_sig, - "docstring" => $i_whichToolkit_doc - ) - ); - - if ($findstate2_sig) - $a['examples.php.getStateName'] = $findstate2_sig; - - if ($findstate3_sig) - $a['examples.php2.getStateName'] = $findstate3_sig; - - if ($findstate4_sig) - $a['examples.php3.getStateName'] = $findstate4_sig; - - if ($findstate5_sig) - $a['examples.php4.getStateName'] = $findstate5_sig; - - $s=new xmlrpc_server($a, false); - $s->setdebug(3); - $s->compress_response = true; - - // out-of-band information: let the client manipulate the server operations. - // we do this to help the testsuite script: do not reproduce in production! - if (isset($_GET['RESPONSE_ENCODING'])) - $s->response_charset_encoding = $_GET['RESPONSE_ENCODING']; - if (isset($_GET['EXCEPTION_HANDLING'])) - $s->exception_handling = $_GET['EXCEPTION_HANDLING']; - $s->service(); - // that should do all we need! -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/demo/vardemo.php b/include/limesurvey/admin/classes/xmlrpc/demo/vardemo.php deleted file mode 100644 index cb004a49..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/demo/vardemo.php +++ /dev/null @@ -1,93 +0,0 @@ - -xmlrpc - -Testing value serialization\n"; - - $v = new xmlrpcval(23, "int"); - print "
    " . htmlentities($v->serialize()) . "
    "; - $v = new xmlrpcval("What are you saying? >> << &&"); - print "
    " . htmlentities($v->serialize()) . "
    "; - - $v = new xmlrpcval(array( - new xmlrpcval("ABCDEFHIJ"), - new xmlrpcval(1234, 'int'), - new xmlrpcval(1, 'boolean')), - "array" - ); - - print "
    " . htmlentities($v->serialize()) . "
    "; - - $v = new xmlrpcval( - array( - "thearray" => new xmlrpcval( - array( - new xmlrpcval("ABCDEFHIJ"), - new xmlrpcval(1234, 'int'), - new xmlrpcval(1, 'boolean'), - new xmlrpcval(0, 'boolean'), - new xmlrpcval(true, 'boolean'), - new xmlrpcval(false, 'boolean') - ), - "array" - ), - "theint" => new xmlrpcval(23, 'int'), - "thestring" => new xmlrpcval("foobarwhizz"), - "thestruct" => new xmlrpcval( - array( - "one" => new xmlrpcval(1, 'int'), - "two" => new xmlrpcval(2, 'int') - ), - "struct" - ) - ), - "struct" - ); - - print "
    " . htmlentities($v->serialize()) . "
    "; - - $w = new xmlrpcval(array($v, new xmlrpcval("That was the struct!")), "array"); - - print "
    " . htmlentities($w->serialize()) . "
    "; - - $w = new xmlrpcval("Mary had a little lamb, -Whose fleece was white as snow, -And everywhere that Mary went -the lamb was sure to go. - -Mary had a little lamb -She tied it to a pylon -Ten thousand volts went down its back -And turned it into nylon", "base64" - ); - print "
    " . htmlentities($w->serialize()) . "
    "; - print "
    Value of base64 string is: '" . $w->scalarval() . "'
    "; - - $f->method(''); - $f->addParam(new xmlrpcval("41", "int")); - - print "

    Testing request serialization

    \n"; - $op = $f->serialize(); - print "
    " . htmlentities($op) . "
    "; - - print "

    Testing ISO date format

    \n";
    -
    -	$t = time();
    -	$date = iso8601_encode($t);
    -	print "Now is $t --> $date\n";
    -	print "Or in UTC, that is " . iso8601_encode($t, 1) . "\n";
    -	$tb = iso8601_decode($date);
    -	print "That is to say $date --> $tb\n";
    -	print "Which comes out at " . iso8601_encode($tb) . "\n";
    -	print "Which was the time in UTC at " . iso8601_decode($date, 1) . "\n";
    -
    -	print "
    \n"; -?> -
    -$Id: vardemo.php 2 2009-03-16 20:22:51Z ggiunta $ - - diff --git a/include/limesurvey/admin/classes/xmlrpc/extras/rsakey.pem b/include/limesurvey/admin/classes/xmlrpc/extras/rsakey.pem deleted file mode 100644 index 473f652a..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/extras/rsakey.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIBOgIBAAJBAM12w6/J20HMj0V9VC24xPFQG9RKSDt8vmviM+tnc1BgCrzPyF1v -3/rWGoWDjkJrE9WFOeqIjJHeEWWT4uKq2ZkCAwEAAQJAZZYJ7Nld+et9DvuHak/H -uBRGnjDYA+mKcObXitWMUzk2ZodL8UoCP1J9kKqV8Zp/l2cBZkLo0aWTN94sWkHy -rQIhAOhxWxRXSZ4kArIQqZnDG9JgtOAeaaFso/zpxIHpN6OrAiEA4klzl+rUc32/ -7SDcJYa9j5vehp1jCTnkN+n0rujTM8sCIAGwMRUovSQk5tAcRt8TB7SzdxzZm7LM -czR3DjJTW1AZAiEAlYN+svPgJ+cAdwdtLgZXHZoZb8xx8Vik6CTXHPKNCf0CIBQL -zF4Qp8/C+gjsXtEZJvhxY7i1luHn6iNwNnE932r3 ------END RSA PRIVATE KEY----- diff --git a/include/limesurvey/admin/classes/xmlrpc/extras/test.pl b/include/limesurvey/admin/classes/xmlrpc/extras/test.pl deleted file mode 100644 index 6c7df558..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/extras/test.pl +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/local/bin/perl - -use Frontier::Client; - -my $serverURL='http://phpxmlrpc.sourceforge.net/server.php'; - -# try the simplest example - -my $client = Frontier::Client->new( 'url' => $serverURL, - 'debug' => 0, 'encoding' => 'iso-8859-1' ); -my $resp = $client->call("examples.getStateName", 32); - -print "Got '${resp}'\n"; - -# now send a mail to nobody in particular - -$resp = $client->call("mail.send", ("edd", "Test", - "Bonjour. Je m'appelle Grard. Maana. ", "freddy", "", "", - 'text/plain; charset="iso-8859-1"')); - -if ($resp->value()) { - print "Mail sent OK.\n"; -} else { - print "Error sending mail.\n"; -} - -# test echoing of characters works fine - -$resp = $client->call("examples.echo", 'Three "blind" mice - ' . - "See 'how' they run"); -print $resp . "\n"; - -# test name and age example. this exercises structs and arrays - -$resp = $client->call("examples.sortByAge", - [ { 'name' => 'Dave', 'age' => 35}, - { 'name' => 'Edd', 'age' => 45 }, - { 'name' => 'Fred', 'age' => 23 }, - { 'name' => 'Barney', 'age' => 36 } ] ); - -my $e; -foreach $e (@$resp) { - print $$e{'name'} . ", " . $$e{'age'} . "\n"; -} - -# test base64 - -$resp = $client->call("examples.decode64", - $client->base64("TWFyeSBoYWQgYSBsaXR0bGUgbGFtYiBTaGUgd" . - "GllZCBpdCB0byBhIHB5bG9u")); - -print $resp . "\n"; diff --git a/include/limesurvey/admin/classes/xmlrpc/extras/test.py b/include/limesurvey/admin/classes/xmlrpc/extras/test.py deleted file mode 100644 index f554b894..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/extras/test.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/local/bin/python - -from xmlrpclib import * -import sys - -server = Server("http://phpxmlrpc.sourceforge.net/server.php") - -try: - print "Got '" + server.examples.getStateName(32) + "'" - - r = server.mail.send("edd", "Test", - "Bonjour. Je m'appelle Grard. Maana. ", "freddy", "", "", - 'text/plain; charset="iso-8859-1"') - if r: - print "Mail sent OK" - else: - print "Error sending mail" - - - r = server.examples.echo('Three "blind" mice - ' + "See 'how' they run") - print r - - # name/age example. this exercises structs and arrays - - a = [ {'name': 'Dave', 'age': 35}, {'name': 'Edd', 'age': 45 }, - {'name': 'Fred', 'age': 23}, {'name': 'Barney', 'age': 36 }] - r = server.examples.sortByAge(a) - print r - - # test base 64 - b = Binary("Mary had a little lamb She tied it to a pylon") - b.encode(sys.stdout) - r = server.examples.decode64(b) - print r - -except Error, v: - print "XML-RPC Error:",v diff --git a/include/limesurvey/admin/classes/xmlrpc/extras/workspace.testPhpServer.fttb b/include/limesurvey/admin/classes/xmlrpc/extras/workspace.testPhpServer.fttb deleted file mode 100644 index 8d507585..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/extras/workspace.testPhpServer.fttb +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpc.inc b/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpc.inc deleted file mode 100644 index b3658f0a..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpc.inc +++ /dev/null @@ -1,3776 +0,0 @@ - -// $Id: xmlrpc.inc,v 1.174 2009/03/16 19:36:38 ggiunta Exp $ - -// Copyright (c) 1999,2000,2002 Edd Dumbill. -// 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 "XML-RPC for PHP" 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 -// REGENTS 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. - - if(!function_exists('xml_parser_create')) - { - // For PHP 4 onward, XML functionality is always compiled-in on windows: - // no more need to dl-open it. It might have been compiled out on *nix... - if(strtoupper(substr(PHP_OS, 0, 3) != 'WIN')) - { - dl('xml.so'); - } - } - - // G. Giunta 2005/01/29: declare global these variables, - // so that xmlrpc.inc will work even if included from within a function - // Milosch: 2005/08/07 - explicitly request these via $GLOBALS where used. - $GLOBALS['xmlrpcI4']='i4'; - $GLOBALS['xmlrpcInt']='int'; - $GLOBALS['xmlrpcBoolean']='boolean'; - $GLOBALS['xmlrpcDouble']='double'; - $GLOBALS['xmlrpcString']='string'; - $GLOBALS['xmlrpcDateTime']='dateTime.iso8601'; - $GLOBALS['xmlrpcBase64']='base64'; - $GLOBALS['xmlrpcArray']='array'; - $GLOBALS['xmlrpcStruct']='struct'; - $GLOBALS['xmlrpcValue']='undefined'; - - $GLOBALS['xmlrpcTypes']=array( - $GLOBALS['xmlrpcI4'] => 1, - $GLOBALS['xmlrpcInt'] => 1, - $GLOBALS['xmlrpcBoolean'] => 1, - $GLOBALS['xmlrpcString'] => 1, - $GLOBALS['xmlrpcDouble'] => 1, - $GLOBALS['xmlrpcDateTime'] => 1, - $GLOBALS['xmlrpcBase64'] => 1, - $GLOBALS['xmlrpcArray'] => 2, - $GLOBALS['xmlrpcStruct'] => 3 - ); - - $GLOBALS['xmlrpc_valid_parents'] = array( - 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'), - 'BOOLEAN' => array('VALUE'), - 'I4' => array('VALUE'), - 'INT' => array('VALUE'), - 'STRING' => array('VALUE'), - 'DOUBLE' => array('VALUE'), - 'DATETIME.ISO8601' => array('VALUE'), - 'BASE64' => array('VALUE'), - 'MEMBER' => array('STRUCT'), - 'NAME' => array('MEMBER'), - 'DATA' => array('ARRAY'), - 'ARRAY' => array('VALUE'), - 'STRUCT' => array('VALUE'), - 'PARAM' => array('PARAMS'), - 'METHODNAME' => array('METHODCALL'), - 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'), - 'FAULT' => array('METHODRESPONSE'), - 'NIL' => array('VALUE'), // only used when extension activated - 'EX:NIL' => array('VALUE') // only used when extension activated - ); - - // define extra types for supporting NULL (useful for json or ) - $GLOBALS['xmlrpcNull']='null'; - $GLOBALS['xmlrpcTypes']['null']=1; - - // Not in use anymore since 2.0. Shall we remove it? - /// @deprecated - $GLOBALS['xmlEntities']=array( - 'amp' => '&', - 'quot' => '"', - 'lt' => '<', - 'gt' => '>', - 'apos' => "'" - ); - - // tables used for transcoding different charsets into us-ascii xml - - $GLOBALS['xml_iso88591_Entities']=array(); - $GLOBALS['xml_iso88591_Entities']['in'] = array(); - $GLOBALS['xml_iso88591_Entities']['out'] = array(); - for ($i = 0; $i < 32; $i++) - { - $GLOBALS['xml_iso88591_Entities']['in'][] = chr($i); - $GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';'; - } - for ($i = 160; $i < 256; $i++) - { - $GLOBALS['xml_iso88591_Entities']['in'][] = chr($i); - $GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';'; - } - - /// @todo add to iso table the characters from cp_1252 range, i.e. 128 to 159? - /// These will NOT be present in true ISO-8859-1, but will save the unwary - /// windows user from sending junk (though no luck when reciving them...) - /* - $GLOBALS['xml_cp1252_Entities']=array(); - for ($i = 128; $i < 160; $i++) - { - $GLOBALS['xml_cp1252_Entities']['in'][] = chr($i); - } - $GLOBALS['xml_cp1252_Entities']['out'] = array( - '€', '?', '‚', 'ƒ', - '„', '…', '†', '‡', - 'ˆ', '‰', 'Š', '‹', - 'Œ', '?', 'Ž', '?', - '?', '‘', '’', '“', - '”', '•', '–', '—', - '˜', '™', 'š', '›', - 'œ', '?', 'ž', 'Ÿ' - ); - */ - - $GLOBALS['xmlrpcerr'] = array( - 'unknown_method'=>1, - 'invalid_return'=>2, - 'incorrect_params'=>3, - 'introspect_unknown'=>4, - 'http_error'=>5, - 'no_data'=>6, - 'no_ssl'=>7, - 'curl_fail'=>8, - 'invalid_request'=>15, - 'no_curl'=>16, - 'server_error'=>17, - 'multicall_error'=>18, - 'multicall_notstruct'=>9, - 'multicall_nomethod'=>10, - 'multicall_notstring'=>11, - 'multicall_recursion'=>12, - 'multicall_noparams'=>13, - 'multicall_notarray'=>14, - - 'cannot_decompress'=>103, - 'decompress_fail'=>104, - 'dechunk_fail'=>105, - 'server_cannot_decompress'=>106, - 'server_decompress_fail'=>107 - ); - - $GLOBALS['xmlrpcstr'] = array( - 'unknown_method'=>'Unknown method', - 'invalid_return'=>'Invalid return payload: enable debugging to examine incoming payload', - 'incorrect_params'=>'Incorrect parameters passed to method', - 'introspect_unknown'=>"Can't introspect: method unknown", - 'http_error'=>"Didn't receive 200 OK from remote server.", - 'no_data'=>'No data received from server.', - 'no_ssl'=>'No SSL support compiled in.', - 'curl_fail'=>'CURL error', - 'invalid_request'=>'Invalid request payload', - 'no_curl'=>'No CURL support compiled in.', - 'server_error'=>'Internal server error', - 'multicall_error'=>'Received from server invalid multicall response', - 'multicall_notstruct'=>'system.multicall expected struct', - 'multicall_nomethod'=>'missing methodName', - 'multicall_notstring'=>'methodName is not a string', - 'multicall_recursion'=>'recursive system.multicall forbidden', - 'multicall_noparams'=>'missing params', - 'multicall_notarray'=>'params is not an array', - - 'cannot_decompress'=>'Received from server compressed HTTP and cannot decompress', - 'decompress_fail'=>'Received from server invalid compressed HTTP', - 'dechunk_fail'=>'Received from server invalid chunked HTTP', - 'server_cannot_decompress'=>'Received from client compressed HTTP request and cannot decompress', - 'server_decompress_fail'=>'Received from client invalid compressed HTTP request' - ); - - // The charset encoding used by the server for received messages and - // by the client for received responses when received charset cannot be determined - // or is not supported - $GLOBALS['xmlrpc_defencoding']='UTF-8'; - - // The encoding used internally by PHP. - // String values received as xml will be converted to this, and php strings will be converted to xml - // as if having been coded with this - $GLOBALS['xmlrpc_internalencoding']='ISO-8859-1'; - - $GLOBALS['xmlrpcName']='XML-RPC for PHP'; - $GLOBALS['xmlrpcVersion']='3.0.0.beta'; - - // let user errors start at 800 - $GLOBALS['xmlrpcerruser']=800; - // let XML parse errors start at 100 - $GLOBALS['xmlrpcerrxml']=100; - - // formulate backslashes for escaping regexp - // Not in use anymore since 2.0. Shall we remove it? - /// @deprecated - $GLOBALS['xmlrpc_backslash']=chr(92).chr(92); - - // set to TRUE to enable correct decoding of and values - $GLOBALS['xmlrpc_null_extension']=false; - - // set to TRUE to enable encoding of php NULL values to instead of - $GLOBALS['xmlrpc_null_apache_encoding']=false; - - // used to store state during parsing - // quick explanation of components: - // ac - used to accumulate values - // isf - used to indicate a parsing fault (2) or xmlrpcresp fault (1) - // isf_reason - used for storing xmlrpcresp fault string - // lv - used to indicate "looking for a value": implements - // the logic to allow values with no types to be strings - // params - used to store parameters in method calls - // method - used to store method name - // stack - array with genealogy of xml elements names: - // used to validate nesting of xmlrpc elements - $GLOBALS['_xh']=null; - - /** - * Convert a string to the correct XML representation in a target charset - * To help correct communication of non-ascii chars inside strings, regardless - * of the charset used when sending requests, parsing them, sending responses - * and parsing responses, an option is to convert all non-ascii chars present in the message - * into their equivalent 'charset entity'. Charset entities enumerated this way - * are independent of the charset encoding used to transmit them, and all XML - * parsers are bound to understand them. - * Note that in the std case we are not sending a charset encoding mime type - * along with http headers, so we are bound by RFC 3023 to emit strict us-ascii. - * - * @todo do a bit of basic benchmarking (strtr vs. str_replace) - * @todo make usage of iconv() or recode_string() or mb_string() where available - */ - function xmlrpc_encode_entitites($data, $src_encoding='', $dest_encoding='') - { - if ($src_encoding == '') - { - // lame, but we know no better... - $src_encoding = $GLOBALS['xmlrpc_internalencoding']; - } - - switch(strtoupper($src_encoding.'_'.$dest_encoding)) - { - case 'ISO-8859-1_': - case 'ISO-8859-1_US-ASCII': - $escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data); - $escaped_data = str_replace($GLOBALS['xml_iso88591_Entities']['in'], $GLOBALS['xml_iso88591_Entities']['out'], $escaped_data); - break; - case 'ISO-8859-1_UTF-8': - $escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data); - $escaped_data = utf8_encode($escaped_data); - break; - case 'ISO-8859-1_ISO-8859-1': - case 'US-ASCII_US-ASCII': - case 'US-ASCII_UTF-8': - case 'US-ASCII_': - case 'US-ASCII_ISO-8859-1': - case 'UTF-8_UTF-8': - //case 'CP1252_CP1252': - $escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data); - break; - case 'UTF-8_': - case 'UTF-8_US-ASCII': - case 'UTF-8_ISO-8859-1': - // NB: this will choke on invalid UTF-8, going most likely beyond EOF - $escaped_data = ''; - // be kind to users creating string xmlrpcvals out of different php types - $data = (string) $data; - $ns = strlen ($data); - for ($nn = 0; $nn < $ns; $nn++) - { - $ch = $data[$nn]; - $ii = ord($ch); - //1 7 0bbbbbbb (127) - if ($ii < 128) - { - /// @todo shall we replace this with a (supposedly) faster str_replace? - switch($ii){ - case 34: - $escaped_data .= '"'; - break; - case 38: - $escaped_data .= '&'; - break; - case 39: - $escaped_data .= '''; - break; - case 60: - $escaped_data .= '<'; - break; - case 62: - $escaped_data .= '>'; - break; - default: - $escaped_data .= $ch; - } // switch - } - //2 11 110bbbbb 10bbbbbb (2047) - else if ($ii>>5 == 6) - { - $b1 = ($ii & 31); - $ii = ord($data[$nn+1]); - $b2 = ($ii & 63); - $ii = ($b1 * 64) + $b2; - $ent = sprintf ('&#%d;', $ii); - $escaped_data .= $ent; - $nn += 1; - } - //3 16 1110bbbb 10bbbbbb 10bbbbbb - else if ($ii>>4 == 14) - { - $b1 = ($ii & 15); - $ii = ord($data[$nn+1]); - $b2 = ($ii & 63); - $ii = ord($data[$nn+2]); - $b3 = ($ii & 63); - $ii = ((($b1 * 64) + $b2) * 64) + $b3; - $ent = sprintf ('&#%d;', $ii); - $escaped_data .= $ent; - $nn += 2; - } - //4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb - else if ($ii>>3 == 30) - { - $b1 = ($ii & 7); - $ii = ord($data[$nn+1]); - $b2 = ($ii & 63); - $ii = ord($data[$nn+2]); - $b3 = ($ii & 63); - $ii = ord($data[$nn+3]); - $b4 = ($ii & 63); - $ii = ((((($b1 * 64) + $b2) * 64) + $b3) * 64) + $b4; - $ent = sprintf ('&#%d;', $ii); - $escaped_data .= $ent; - $nn += 3; - } - } - break; -/* - case 'CP1252_': - case 'CP1252_US-ASCII': - $escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data); - $escaped_data = str_replace($GLOBALS['xml_iso88591_Entities']['in'], $GLOBALS['xml_iso88591_Entities']['out'], $escaped_data); - $escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data); - break; - case 'CP1252_UTF-8': - $escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data); - /// @todo we could use real UTF8 chars here instead of xml entities... (note that utf_8 encode all allone will NOT convert them) - $escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data); - $escaped_data = utf8_encode($escaped_data); - break; - case 'CP1252_ISO-8859-1': - $escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data); - // we might as well replave all funky chars with a '?' here, but we are kind and leave it to the receiving application layer to decide what to do with these weird entities... - $escaped_data = str_replace($GLOBALS['xml_cp1252_Entities']['in'], $GLOBALS['xml_cp1252_Entities']['out'], $escaped_data); - break; -*/ - default: - $escaped_data = ''; - error_log("Converting from $src_encoding to $dest_encoding: not supported..."); - } - return $escaped_data; - } - - /// xml parser handler function for opening element tags - function xmlrpc_se($parser, $name, $attrs, $accept_single_vals=false) - { - // if invalid xmlrpc already detected, skip all processing - if ($GLOBALS['_xh']['isf'] < 2) - { - // check for correct element nesting - // top level element can only be of 2 types - /// @todo optimization creep: save this check into a bool variable, instead of using count() every time: - /// there is only a single top level element in xml anyway - if (count($GLOBALS['_xh']['stack']) == 0) - { - if ($name != 'METHODRESPONSE' && $name != 'METHODCALL' && ( - $name != 'VALUE' && !$accept_single_vals)) - { - $GLOBALS['_xh']['isf'] = 2; - $GLOBALS['_xh']['isf_reason'] = 'missing top level xmlrpc element'; - return; - } - else - { - $GLOBALS['_xh']['rt'] = strtolower($name); - $GLOBALS['_xh']['rt'] = strtolower($name); - } - } - else - { - // not top level element: see if parent is OK - $parent = end($GLOBALS['_xh']['stack']); - if (!array_key_exists($name, $GLOBALS['xmlrpc_valid_parents']) || !in_array($parent, $GLOBALS['xmlrpc_valid_parents'][$name])) - { - $GLOBALS['_xh']['isf'] = 2; - $GLOBALS['_xh']['isf_reason'] = "xmlrpc element $name cannot be child of $parent"; - return; - } - } - - switch($name) - { - // optimize for speed switch cases: most common cases first - case 'VALUE': - /// @todo we could check for 2 VALUE elements inside a MEMBER or PARAM element - $GLOBALS['_xh']['vt']='value'; // indicator: no value found yet - $GLOBALS['_xh']['ac']=''; - $GLOBALS['_xh']['lv']=1; - $GLOBALS['_xh']['php_class']=null; - break; - case 'I4': - case 'INT': - case 'STRING': - case 'BOOLEAN': - case 'DOUBLE': - case 'DATETIME.ISO8601': - case 'BASE64': - if ($GLOBALS['_xh']['vt']!='value') - { - //two data elements inside a value: an error occurred! - $GLOBALS['_xh']['isf'] = 2; - $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value"; - return; - } - $GLOBALS['_xh']['ac']=''; // reset the accumulator - break; - case 'STRUCT': - case 'ARRAY': - if ($GLOBALS['_xh']['vt']!='value') - { - //two data elements inside a value: an error occurred! - $GLOBALS['_xh']['isf'] = 2; - $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value"; - return; - } - // create an empty array to hold child values, and push it onto appropriate stack - $cur_val = array(); - $cur_val['values'] = array(); - $cur_val['type'] = $name; - // check for out-of-band information to rebuild php objs - // and in case it is found, save it - if (@isset($attrs['PHP_CLASS'])) - { - $cur_val['php_class'] = $attrs['PHP_CLASS']; - } - $GLOBALS['_xh']['valuestack'][] = $cur_val; - $GLOBALS['_xh']['vt']='data'; // be prepared for a data element next - break; - case 'DATA': - if ($GLOBALS['_xh']['vt']!='data') - { - //two data elements inside a value: an error occurred! - $GLOBALS['_xh']['isf'] = 2; - $GLOBALS['_xh']['isf_reason'] = "found two data elements inside an array element"; - return; - } - case 'METHODCALL': - case 'METHODRESPONSE': - case 'PARAMS': - // valid elements that add little to processing - break; - case 'METHODNAME': - case 'NAME': - /// @todo we could check for 2 NAME elements inside a MEMBER element - $GLOBALS['_xh']['ac']=''; - break; - case 'FAULT': - $GLOBALS['_xh']['isf']=1; - break; - case 'MEMBER': - $GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name']=''; // set member name to null, in case we do not find in the xml later on - //$GLOBALS['_xh']['ac']=''; - // Drop trough intentionally - case 'PARAM': - // clear value type, so we can check later if no value has been passed for this param/member - $GLOBALS['_xh']['vt']=null; - break; - case 'NIL': - case 'EX:NIL': - if ($GLOBALS['xmlrpc_null_extension']) - { - if ($GLOBALS['_xh']['vt']!='value') - { - //two data elements inside a value: an error occurred! - $GLOBALS['_xh']['isf'] = 2; - $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value"; - return; - } - $GLOBALS['_xh']['ac']=''; // reset the accumulator - break; - } - // we do not support the extension, so - // drop through intentionally - default: - /// INVALID ELEMENT: RAISE ISF so that it is later recognized!!! - $GLOBALS['_xh']['isf'] = 2; - $GLOBALS['_xh']['isf_reason'] = "found not-xmlrpc xml element $name"; - break; - } - - // Save current element name to stack, to validate nesting - $GLOBALS['_xh']['stack'][] = $name; - - /// @todo optimization creep: move this inside the big switch() above - if($name!='VALUE') - { - $GLOBALS['_xh']['lv']=0; - } - } - } - - /// Used in decoding xml chunks that might represent single xmlrpc values - function xmlrpc_se_any($parser, $name, $attrs) - { - xmlrpc_se($parser, $name, $attrs, true); - } - - /// xml parser handler function for close element tags - function xmlrpc_ee($parser, $name, $rebuild_xmlrpcvals = true) - { - if ($GLOBALS['_xh']['isf'] < 2) - { - // push this element name from stack - // NB: if XML validates, correct opening/closing is guaranteed and - // we do not have to check for $name == $curr_elem. - // we also checked for proper nesting at start of elements... - $curr_elem = array_pop($GLOBALS['_xh']['stack']); - - switch($name) - { - case 'VALUE': - // This if() detects if no scalar was inside - if ($GLOBALS['_xh']['vt']=='value') - { - $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac']; - $GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcString']; - } - - if ($rebuild_xmlrpcvals) - { - // build the xmlrpc val out of the data received, and substitute it - $temp = new xmlrpcval($GLOBALS['_xh']['value'], $GLOBALS['_xh']['vt']); - // in case we got info about underlying php class, save it - // in the object we're rebuilding - if (isset($GLOBALS['_xh']['php_class'])) - $temp->_php_class = $GLOBALS['_xh']['php_class']; - // check if we are inside an array or struct: - // if value just built is inside an array, let's move it into array on the stack - $vscount = count($GLOBALS['_xh']['valuestack']); - if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY') - { - $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $temp; - } - else - { - $GLOBALS['_xh']['value'] = $temp; - } - } - else - { - /// @todo this needs to treat correctly php-serialized objects, - /// since std deserializing is done by php_xmlrpc_decode, - /// which we will not be calling... - if (isset($GLOBALS['_xh']['php_class'])) - { - } - - // check if we are inside an array or struct: - // if value just built is inside an array, let's move it into array on the stack - $vscount = count($GLOBALS['_xh']['valuestack']); - if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY') - { - $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $GLOBALS['_xh']['value']; - } - } - break; - case 'BOOLEAN': - case 'I4': - case 'INT': - case 'STRING': - case 'DOUBLE': - case 'DATETIME.ISO8601': - case 'BASE64': - $GLOBALS['_xh']['vt']=strtolower($name); - /// @todo: optimization creep - remove the if/elseif cycle below - /// since the case() in which we are already did that - if ($name=='STRING') - { - $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac']; - } - elseif ($name=='DATETIME.ISO8601') - { - if (!preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $GLOBALS['_xh']['ac'])) - { - error_log('XML-RPC: invalid value received in DATETIME: '.$GLOBALS['_xh']['ac']); - } - $GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcDateTime']; - $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac']; - } - elseif ($name=='BASE64') - { - /// @todo check for failure of base64 decoding / catch warnings - $GLOBALS['_xh']['value']=base64_decode($GLOBALS['_xh']['ac']); - } - elseif ($name=='BOOLEAN') - { - // special case here: we translate boolean 1 or 0 into PHP - // constants true or false. - // Strings 'true' and 'false' are accepted, even though the - // spec never mentions them (see eg. Blogger api docs) - // NB: this simple checks helps a lot sanitizing input, ie no - // security problems around here - if ($GLOBALS['_xh']['ac']=='1' || strcasecmp($GLOBALS['_xh']['ac'], 'true') == 0) - { - $GLOBALS['_xh']['value']=true; - } - else - { - // log if receiveing something strange, even though we set the value to false anyway - if ($GLOBALS['_xh']['ac']!='0' && strcasecmp($GLOBALS['_xh']['ac'], 'false') != 0) - error_log('XML-RPC: invalid value received in BOOLEAN: '.$GLOBALS['_xh']['ac']); - $GLOBALS['_xh']['value']=false; - } - } - elseif ($name=='DOUBLE') - { - // we have a DOUBLE - // we must check that only 0123456789-. are characters here - // NOTE: regexp could be much stricter than this... - if (!preg_match('/^[+-eE0123456789 \t.]+$/', $GLOBALS['_xh']['ac'])) - { - /// @todo: find a better way of throwing an error than this! - error_log('XML-RPC: non numeric value received in DOUBLE: '.$GLOBALS['_xh']['ac']); - $GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND'; - } - else - { - // it's ok, add it on - $GLOBALS['_xh']['value']=(double)$GLOBALS['_xh']['ac']; - } - } - else - { - // we have an I4/INT - // we must check that only 0123456789- are characters here - if (!preg_match('/^[+-]?[0123456789 \t]+$/', $GLOBALS['_xh']['ac'])) - { - /// @todo find a better way of throwing an error than this! - error_log('XML-RPC: non numeric value received in INT: '.$GLOBALS['_xh']['ac']); - $GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND'; - } - else - { - // it's ok, add it on - $GLOBALS['_xh']['value']=(int)$GLOBALS['_xh']['ac']; - } - } - //$GLOBALS['_xh']['ac']=''; // is this necessary? - $GLOBALS['_xh']['lv']=3; // indicate we've found a value - break; - case 'NAME': - $GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name'] = $GLOBALS['_xh']['ac']; - break; - case 'MEMBER': - //$GLOBALS['_xh']['ac']=''; // is this necessary? - // add to array in the stack the last element built, - // unless no VALUE was found - if ($GLOBALS['_xh']['vt']) - { - $vscount = count($GLOBALS['_xh']['valuestack']); - $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][$GLOBALS['_xh']['valuestack'][$vscount-1]['name']] = $GLOBALS['_xh']['value']; - } else - error_log('XML-RPC: missing VALUE inside STRUCT in received xml'); - break; - case 'DATA': - //$GLOBALS['_xh']['ac']=''; // is this necessary? - $GLOBALS['_xh']['vt']=null; // reset this to check for 2 data elements in a row - even if they're empty - break; - case 'STRUCT': - case 'ARRAY': - // fetch out of stack array of values, and promote it to current value - $curr_val = array_pop($GLOBALS['_xh']['valuestack']); - $GLOBALS['_xh']['value'] = $curr_val['values']; - $GLOBALS['_xh']['vt']=strtolower($name); - if (isset($curr_val['php_class'])) - { - $GLOBALS['_xh']['php_class'] = $curr_val['php_class']; - } - break; - case 'PARAM': - // add to array of params the current value, - // unless no VALUE was found - if ($GLOBALS['_xh']['vt']) - { - $GLOBALS['_xh']['params'][]=$GLOBALS['_xh']['value']; - $GLOBALS['_xh']['pt'][]=$GLOBALS['_xh']['vt']; - } - else - error_log('XML-RPC: missing VALUE inside PARAM in received xml'); - break; - case 'METHODNAME': - $GLOBALS['_xh']['method']=preg_replace('/^[\n\r\t ]+/', '', $GLOBALS['_xh']['ac']); - break; - case 'NIL': - case 'EX:NIL': - if ($GLOBALS['xmlrpc_null_extension']) - { - $GLOBALS['_xh']['vt']='null'; - $GLOBALS['_xh']['value']=null; - $GLOBALS['_xh']['lv']=3; - break; - } - // drop through intentionally if nil extension not enabled - case 'PARAMS': - case 'FAULT': - case 'METHODCALL': - case 'METHORESPONSE': - break; - default: - // End of INVALID ELEMENT! - // shall we add an assert here for unreachable code??? - break; - } - } - } - - /// Used in decoding xmlrpc requests/responses without rebuilding xmlrpc values - function xmlrpc_ee_fast($parser, $name) - { - xmlrpc_ee($parser, $name, false); - } - - /// xml parser handler function for character data - function xmlrpc_cd($parser, $data) - { - // skip processing if xml fault already detected - if ($GLOBALS['_xh']['isf'] < 2) - { - // "lookforvalue==3" means that we've found an entire value - // and should discard any further character data - if($GLOBALS['_xh']['lv']!=3) - { - // G. Giunta 2006-08-23: useless change of 'lv' from 1 to 2 - //if($GLOBALS['_xh']['lv']==1) - //{ - // if we've found text and we're just in a then - // say we've found a value - //$GLOBALS['_xh']['lv']=2; - //} - // we always initialize the accumulator before starting parsing, anyway... - //if(!@isset($GLOBALS['_xh']['ac'])) - //{ - // $GLOBALS['_xh']['ac'] = ''; - //} - $GLOBALS['_xh']['ac'].=$data; - } - } - } - - /// xml parser handler function for 'other stuff', ie. not char data or - /// element start/end tag. In fact it only gets called on unknown entities... - function xmlrpc_dh($parser, $data) - { - // skip processing if xml fault already detected - if ($GLOBALS['_xh']['isf'] < 2) - { - if(substr($data, 0, 1) == '&' && substr($data, -1, 1) == ';') - { - // G. Giunta 2006-08-25: useless change of 'lv' from 1 to 2 - //if($GLOBALS['_xh']['lv']==1) - //{ - // $GLOBALS['_xh']['lv']=2; - //} - $GLOBALS['_xh']['ac'].=$data; - } - } - return true; - } - - class xmlrpc_client - { - var $path; - var $server; - var $port=0; - var $method='http'; - var $errno; - var $errstr; - var $debug=0; - var $username=''; - var $password=''; - var $authtype=1; - var $cert=''; - var $certpass=''; - var $cacert=''; - var $cacertdir=''; - var $key=''; - var $keypass=''; - var $verifypeer=true; - var $verifyhost=1; - var $no_multicall=false; - var $proxy=''; - var $proxyport=0; - var $proxy_user=''; - var $proxy_pass=''; - var $proxy_authtype=1; - var $cookies=array(); - var $extracurlopts=array(); - - /** - * List of http compression methods accepted by the client for responses. - * NB: PHP supports deflate, gzip compressions out of the box if compiled w. zlib - * - * NNB: you can set it to any non-empty array for HTTP11 and HTTPS, since - * in those cases it will be up to CURL to decide the compression methods - * it supports. You might check for the presence of 'zlib' in the output of - * curl_version() to determine wheter compression is supported or not - */ - var $accepted_compression = array(); - /** - * Name of compression scheme to be used for sending requests. - * Either null, gzip or deflate - */ - var $request_compression = ''; - /** - * CURL handle: used for keep-alive connections (PHP 4.3.8 up, see: - * http://curl.haxx.se/docs/faq.html#7.3) - */ - var $xmlrpc_curl_handle = null; - /// Wheter to use persistent connections for http 1.1 and https - var $keepalive = false; - /// Charset encodings that can be decoded without problems by the client - var $accepted_charset_encodings = array(); - /// Charset encoding to be used in serializing request. NULL = use ASCII - var $request_charset_encoding = ''; - /** - * Decides the content of xmlrpcresp objects returned by calls to send() - * valid strings are 'xmlrpcvals', 'phpvals' or 'xml' - */ - var $return_type = 'xmlrpcvals'; - /** - * Sent to servers in http headers - */ - var $user_agent; - - /** - * @param string $path either the complete server URL or the PATH part of the xmlrc server URL, e.g. /xmlrpc/server.php - * @param string $server the server name / ip address - * @param integer $port the port the server is listening on, defaults to 80 or 443 depending on protocol used - * @param string $method the http protocol variant: defaults to 'http', 'https' and 'http11' can be used if CURL is installed - */ - function xmlrpc_client($path, $server='', $port='', $method='') - { - // allow user to specify all params in $path - if($server == '' and $port == '' and $method == '') - { - $parts = parse_url($path); - $server = $parts['host']; - $path = isset($parts['path']) ? $parts['path'] : ''; - if(isset($parts['query'])) - { - $path .= '?'.$parts['query']; - } - if(isset($parts['fragment'])) - { - $path .= '#'.$parts['fragment']; - } - if(isset($parts['port'])) - { - $port = $parts['port']; - } - if(isset($parts['scheme'])) - { - $method = $parts['scheme']; - } - if(isset($parts['user'])) - { - $this->username = $parts['user']; - } - if(isset($parts['pass'])) - { - $this->password = $parts['pass']; - } - } - if($path == '' || $path[0] != '/') - { - $this->path='/'.$path; - } - else - { - $this->path=$path; - } - $this->server=$server; - if($port != '') - { - $this->port=$port; - } - if($method != '') - { - $this->method=$method; - } - - // if ZLIB is enabled, let the client by default accept compressed responses - if(function_exists('gzinflate') || ( - function_exists('curl_init') && (($info = curl_version()) && - ((is_string($info) && strpos($info, 'zlib') !== null) || isset($info['libz_version']))) - )) - { - $this->accepted_compression = array('gzip', 'deflate'); - } - - // keepalives: enabled by default - $this->keepalive = true; - - // by default the xml parser can support these 3 charset encodings - $this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII'); - - // initialize user_agent string - $this->user_agent = $GLOBALS['xmlrpcName'] . ' ' . $GLOBALS['xmlrpcVersion']; - } - - /** - * Enables/disables the echoing to screen of the xmlrpc responses received - * @param integer $debug values 0, 1 and 2 are supported (2 = echo sent msg too, before received response) - * @access public - */ - function setDebug($in) - { - $this->debug=$in; - } - - /** - * Add some http BASIC AUTH credentials, used by the client to authenticate - * @param string $u username - * @param string $p password - * @param integer $t auth type. See curl_setopt man page for supported auth types. Defaults to CURLAUTH_BASIC (basic auth) - * @access public - */ - function setCredentials($u, $p, $t=1) - { - $this->username=$u; - $this->password=$p; - $this->authtype=$t; - } - - /** - * Add a client-side https certificate - * @param string $cert - * @param string $certpass - * @access public - */ - function setCertificate($cert, $certpass) - { - $this->cert = $cert; - $this->certpass = $certpass; - } - - /** - * Add a CA certificate to verify server with (see man page about - * CURLOPT_CAINFO for more details - * @param string $cacert certificate file name (or dir holding certificates) - * @param bool $is_dir set to true to indicate cacert is a dir. defaults to false - * @access public - */ - function setCaCertificate($cacert, $is_dir=false) - { - if ($is_dir) - { - $this->cacertdir = $cacert; - } - else - { - $this->cacert = $cacert; - } - } - - /** - * Set attributes for SSL communication: private SSL key - * NB: does not work in older php/curl installs - * Thanks to Daniel Convissor - * @param string $key The name of a file containing a private SSL key - * @param string $keypass The secret password needed to use the private SSL key - * @access public - */ - function setKey($key, $keypass) - { - $this->key = $key; - $this->keypass = $keypass; - } - - /** - * Set attributes for SSL communication: verify server certificate - * @param bool $i enable/disable verification of peer certificate - * @access public - */ - function setSSLVerifyPeer($i) - { - $this->verifypeer = $i; - } - - /** - * Set attributes for SSL communication: verify match of server cert w. hostname - * @param int $i - * @access public - */ - function setSSLVerifyHost($i) - { - $this->verifyhost = $i; - } - - /** - * Set proxy info - * @param string $proxyhost - * @param string $proxyport Defaults to 8080 for HTTP and 443 for HTTPS - * @param string $proxyusername Leave blank if proxy has public access - * @param string $proxypassword Leave blank if proxy has public access - * @param int $proxyauthtype set to constant CURLAUTH_NTLM to use NTLM auth with proxy - * @access public - */ - function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '', $proxyauthtype = 1) - { - $this->proxy = $proxyhost; - $this->proxyport = $proxyport; - $this->proxy_user = $proxyusername; - $this->proxy_pass = $proxypassword; - $this->proxy_authtype = $proxyauthtype; - } - - /** - * Enables/disables reception of compressed xmlrpc responses. - * Note that enabling reception of compressed responses merely adds some standard - * http headers to xmlrpc requests. It is up to the xmlrpc server to return - * compressed responses when receiving such requests. - * @param string $compmethod either 'gzip', 'deflate', 'any' or '' - * @access public - */ - function setAcceptedCompression($compmethod) - { - if ($compmethod == 'any') - $this->accepted_compression = array('gzip', 'deflate'); - else - $this->accepted_compression = array($compmethod); - } - - /** - * Enables/disables http compression of xmlrpc request. - * Take care when sending compressed requests: servers might not support them - * (and automatic fallback to uncompressed requests is not yet implemented) - * @param string $compmethod either 'gzip', 'deflate' or '' - * @access public - */ - function setRequestCompression($compmethod) - { - $this->request_compression = $compmethod; - } - - /** - * Adds a cookie to list of cookies that will be sent to server. - * NB: setting any param but name and value will turn the cookie into a 'version 1' cookie: - * do not do it unless you know what you are doing - * @param string $name - * @param string $value - * @param string $path - * @param string $domain - * @param int $port - * @access public - * - * @todo check correctness of urlencoding cookie value (copied from php way of doing it...) - */ - function setCookie($name, $value='', $path='', $domain='', $port=null) - { - $this->cookies[$name]['value'] = urlencode($value); - if ($path || $domain || $port) - { - $this->cookies[$name]['path'] = $path; - $this->cookies[$name]['domain'] = $domain; - $this->cookies[$name]['port'] = $port; - $this->cookies[$name]['version'] = 1; - } - else - { - $this->cookies[$name]['version'] = 0; - } - } - - /** - * Directly set cURL options, for extra flexibility - * It allows eg. to bind client to a specific IP interface / address - * @param $options array - */ - function SetCurlOptions( $options ) - { - $this->extracurlopts = $options; - } - - /** - * Set user-agent string that will be used by this client instance - * in http headers sent to the server - */ - function SetUserAgent( $agentstring ) - { - $this->user_agent = $agentstring; - } - - /** - * Send an xmlrpc request - * @param mixed $msg The message object, or an array of messages for using multicall, or the complete xml representation of a request - * @param integer $timeout Connection timeout, in seconds, If unspecified, a platform specific timeout will apply - * @param string $method if left unspecified, the http protocol chosen during creation of the object will be used - * @return xmlrpcresp - * @access public - */ - function& send($msg, $timeout=0, $method='') - { - // if user deos not specify http protocol, use native method of this client - // (i.e. method set during call to constructor) - if($method == '') - { - $method = $this->method; - } - - if(is_array($msg)) - { - // $msg is an array of xmlrpcmsg's - $r = $this->multicall($msg, $timeout, $method); - return $r; - } - elseif(is_string($msg)) - { - $n = new xmlrpcmsg(''); - $n->payload = $msg; - $msg = $n; - } - - // where msg is an xmlrpcmsg - $msg->debug=$this->debug; - - if($method == 'https') - { - $r =& $this->sendPayloadHTTPS( - $msg, - $this->server, - $this->port, - $timeout, - $this->username, - $this->password, - $this->authtype, - $this->cert, - $this->certpass, - $this->cacert, - $this->cacertdir, - $this->proxy, - $this->proxyport, - $this->proxy_user, - $this->proxy_pass, - $this->proxy_authtype, - $this->keepalive, - $this->key, - $this->keypass - ); - } - elseif($method == 'http11') - { - $r =& $this->sendPayloadCURL( - $msg, - $this->server, - $this->port, - $timeout, - $this->username, - $this->password, - $this->authtype, - null, - null, - null, - null, - $this->proxy, - $this->proxyport, - $this->proxy_user, - $this->proxy_pass, - $this->proxy_authtype, - 'http', - $this->keepalive - ); - } - else - { - $r =& $this->sendPayloadHTTP10( - $msg, - $this->server, - $this->port, - $timeout, - $this->username, - $this->password, - $this->authtype, - $this->proxy, - $this->proxyport, - $this->proxy_user, - $this->proxy_pass, - $this->proxy_authtype - ); - } - - return $r; - } - - /** - * @access private - */ - function &sendPayloadHTTP10($msg, $server, $port, $timeout=0, - $username='', $password='', $authtype=1, $proxyhost='', - $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1) - { - if($port==0) - { - $port=80; - } - - // Only create the payload if it was not created previously - if(empty($msg->payload)) - { - $msg->createPayload($this->request_charset_encoding); - } - - $payload = $msg->payload; - // Deflate request body and set appropriate request headers - if(function_exists('gzdeflate') && ($this->request_compression == 'gzip' || $this->request_compression == 'deflate')) - { - if($this->request_compression == 'gzip') - { - $a = @gzencode($payload); - if($a) - { - $payload = $a; - $encoding_hdr = "Content-Encoding: gzip\r\n"; - } - } - else - { - $a = @gzcompress($payload); - if($a) - { - $payload = $a; - $encoding_hdr = "Content-Encoding: deflate\r\n"; - } - } - } - else - { - $encoding_hdr = ''; - } - - // thanks to Grant Rauscher for this - $credentials=''; - if($username!='') - { - $credentials='Authorization: Basic ' . base64_encode($username . ':' . $password) . "\r\n"; - if ($authtype != 1) - { - error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth is supported with HTTP 1.0'); - } - } - - $accepted_encoding = ''; - if(is_array($this->accepted_compression) && count($this->accepted_compression)) - { - $accepted_encoding = 'Accept-Encoding: ' . implode(', ', $this->accepted_compression) . "\r\n"; - } - - $proxy_credentials = ''; - if($proxyhost) - { - if($proxyport == 0) - { - $proxyport = 8080; - } - $connectserver = $proxyhost; - $connectport = $proxyport; - $uri = 'http://'.$server.':'.$port.$this->path; - if($proxyusername != '') - { - if ($proxyauthtype != 1) - { - error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth to proxy is supported with HTTP 1.0'); - } - $proxy_credentials = 'Proxy-Authorization: Basic ' . base64_encode($proxyusername.':'.$proxypassword) . "\r\n"; - } - } - else - { - $connectserver = $server; - $connectport = $port; - $uri = $this->path; - } - - // Cookie generation, as per rfc2965 (version 1 cookies) or - // netscape's rules (version 0 cookies) - $cookieheader=''; - if (count($this->cookies)) - { - $version = ''; - foreach ($this->cookies as $name => $cookie) - { - if ($cookie['version']) - { - $version = ' $Version="' . $cookie['version'] . '";'; - $cookieheader .= ' ' . $name . '="' . $cookie['value'] . '";'; - if ($cookie['path']) - $cookieheader .= ' $Path="' . $cookie['path'] . '";'; - if ($cookie['domain']) - $cookieheader .= ' $Domain="' . $cookie['domain'] . '";'; - if ($cookie['port']) - $cookieheader .= ' $Port="' . $cookie['port'] . '";'; - } - else - { - $cookieheader .= ' ' . $name . '=' . $cookie['value'] . ";"; - } - } - $cookieheader = 'Cookie:' . $version . substr($cookieheader, 0, -1) . "\r\n"; - } - - $op= 'POST ' . $uri. " HTTP/1.0\r\n" . - 'User-Agent: ' . $this->user_agent . "\r\n" . - 'Host: '. $server . ':' . $port . "\r\n" . - $credentials . - $proxy_credentials . - $accepted_encoding . - $encoding_hdr . - 'Accept-Charset: ' . implode(',', $this->accepted_charset_encodings) . "\r\n" . - $cookieheader . - 'Content-Type: ' . $msg->content_type . "\r\nContent-Length: " . - strlen($payload) . "\r\n\r\n" . - $payload; - - if($this->debug > 1) - { - print "
    \n---SENDING---\n" . htmlentities($op) . "\n---END---\n
    "; - // let the client see this now in case http times out... - flush(); - } - - if($timeout>0) - { - $fp=@fsockopen($connectserver, $connectport, $this->errno, $this->errstr, $timeout); - } - else - { - $fp=@fsockopen($connectserver, $connectport, $this->errno, $this->errstr); - } - if($fp) - { - if($timeout>0 && function_exists('stream_set_timeout')) - { - stream_set_timeout($fp, $timeout); - } - } - else - { - $this->errstr='Connect error: '.$this->errstr; - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr . ' (' . $this->errno . ')'); - return $r; - } - - if(!fputs($fp, $op, strlen($op))) - { - fclose($fp); - $this->errstr='Write error'; - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr); - return $r; - } - else - { - // reset errno and errstr on succesful socket connection - $this->errstr = ''; - } - // G. Giunta 2005/10/24: close socket before parsing. - // should yeld slightly better execution times, and make easier recursive calls (e.g. to follow http redirects) - $ipd=''; - do - { - // shall we check for $data === FALSE? - // as per the manual, it signals an error - $ipd.=fread($fp, 32768); - } while(!feof($fp)); - fclose($fp); - $r =& $msg->parseResponse($ipd, false, $this->return_type); - return $r; - - } - - /** - * @access private - */ - function &sendPayloadHTTPS($msg, $server, $port, $timeout=0, $username='', - $password='', $authtype=1, $cert='',$certpass='', $cacert='', $cacertdir='', - $proxyhost='', $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1, - $keepalive=false, $key='', $keypass='') - { - $r =& $this->sendPayloadCURL($msg, $server, $port, $timeout, $username, - $password, $authtype, $cert, $certpass, $cacert, $cacertdir, $proxyhost, $proxyport, - $proxyusername, $proxypassword, $proxyauthtype, 'https', $keepalive, $key, $keypass); - return $r; - } - - /** - * Contributed by Justin Miller - * Requires curl to be built into PHP - * NB: CURL versions before 7.11.10 cannot use proxy to talk to https servers! - * @access private - */ - function &sendPayloadCURL($msg, $server, $port, $timeout=0, $username='', - $password='', $authtype=1, $cert='', $certpass='', $cacert='', $cacertdir='', - $proxyhost='', $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1, $method='https', - $keepalive=false, $key='', $keypass='') - { - if(!function_exists('curl_init')) - { - $this->errstr='CURL unavailable on this install'; - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_curl'], $GLOBALS['xmlrpcstr']['no_curl']); - return $r; - } - if($method == 'https') - { - if(($info = curl_version()) && - ((is_string($info) && strpos($info, 'OpenSSL') === null) || (is_array($info) && !isset($info['ssl_version'])))) - { - $this->errstr='SSL unavailable on this install'; - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_ssl'], $GLOBALS['xmlrpcstr']['no_ssl']); - return $r; - } - } - - if($port == 0) - { - if($method == 'http') - { - $port = 80; - } - else - { - $port = 443; - } - } - - // Only create the payload if it was not created previously - if(empty($msg->payload)) - { - $msg->createPayload($this->request_charset_encoding); - } - - // Deflate request body and set appropriate request headers - $payload = $msg->payload; - if(function_exists('gzdeflate') && ($this->request_compression == 'gzip' || $this->request_compression == 'deflate')) - { - if($this->request_compression == 'gzip') - { - $a = @gzencode($payload); - if($a) - { - $payload = $a; - $encoding_hdr = 'Content-Encoding: gzip'; - } - } - else - { - $a = @gzcompress($payload); - if($a) - { - $payload = $a; - $encoding_hdr = 'Content-Encoding: deflate'; - } - } - } - else - { - $encoding_hdr = ''; - } - - if($this->debug > 1) - { - print "
    \n---SENDING---\n" . htmlentities($payload) . "\n---END---\n
    "; - // let the client see this now in case http times out... - flush(); - } - - if(!$keepalive || !$this->xmlrpc_curl_handle) - { - $curl = curl_init($method . '://' . $server . ':' . $port . $this->path); - if($keepalive) - { - $this->xmlrpc_curl_handle = $curl; - } - } - else - { - $curl = $this->xmlrpc_curl_handle; - } - - // results into variable - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - - if($this->debug) - { - curl_setopt($curl, CURLOPT_VERBOSE, 1); - } - curl_setopt($curl, CURLOPT_USERAGENT, $this->user_agent); - // required for XMLRPC: post the data - curl_setopt($curl, CURLOPT_POST, 1); - // the data - curl_setopt($curl, CURLOPT_POSTFIELDS, $payload); - - // return the header too - curl_setopt($curl, CURLOPT_HEADER, 1); - - // will only work with PHP >= 5.0 - // NB: if we set an empty string, CURL will add http header indicating - // ALL methods it is supporting. This is possibly a better option than - // letting the user tell what curl can / cannot do... - if(is_array($this->accepted_compression) && count($this->accepted_compression)) - { - //curl_setopt($curl, CURLOPT_ENCODING, implode(',', $this->accepted_compression)); - // empty string means 'any supported by CURL' (shall we catch errors in case CURLOPT_SSLKEY undefined ?) - if (count($this->accepted_compression) == 1) - { - curl_setopt($curl, CURLOPT_ENCODING, $this->accepted_compression[0]); - } - else - curl_setopt($curl, CURLOPT_ENCODING, ''); - } - // extra headers - $headers = array('Content-Type: ' . $msg->content_type , 'Accept-Charset: ' . implode(',', $this->accepted_charset_encodings)); - // if no keepalive is wanted, let the server know it in advance - if(!$keepalive) - { - $headers[] = 'Connection: close'; - } - // request compression header - if($encoding_hdr) - { - $headers[] = $encoding_hdr; - } - - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - // timeout is borked - if($timeout) - { - curl_setopt($curl, CURLOPT_TIMEOUT, $timeout == 1 ? 1 : $timeout - 1); - } - - if($username && $password) - { - curl_setopt($curl, CURLOPT_USERPWD, $username.':'.$password); - if (defined('CURLOPT_HTTPAUTH')) - { - curl_setopt($curl, CURLOPT_HTTPAUTH, $authtype); - } - else if ($authtype != 1) - { - error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth is supported by the current PHP/curl install'); - } - } - - if($method == 'https') - { - // set cert file - if($cert) - { - curl_setopt($curl, CURLOPT_SSLCERT, $cert); - } - // set cert password - if($certpass) - { - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $certpass); - } - // whether to verify remote host's cert - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verifypeer); - // set ca certificates file/dir - if($cacert) - { - curl_setopt($curl, CURLOPT_CAINFO, $cacert); - } - if($cacertdir) - { - curl_setopt($curl, CURLOPT_CAPATH, $cacertdir); - } - // set key file (shall we catch errors in case CURLOPT_SSLKEY undefined ?) - if($key) - { - curl_setopt($curl, CURLOPT_SSLKEY, $key); - } - // set key password (shall we catch errors in case CURLOPT_SSLKEY undefined ?) - if($keypass) - { - curl_setopt($curl, CURLOPT_SSLKEYPASSWD, $keypass); - } - // whether to verify cert's common name (CN); 0 for no, 1 to verify that it exists, and 2 to verify that it matches the hostname used - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $this->verifyhost); - } - - // proxy info - if($proxyhost) - { - if($proxyport == 0) - { - $proxyport = 8080; // NB: even for HTTPS, local connection is on port 8080 - } - curl_setopt($curl, CURLOPT_PROXY, $proxyhost.':'.$proxyport); - //curl_setopt($curl, CURLOPT_PROXYPORT,$proxyport); - if($proxyusername) - { - curl_setopt($curl, CURLOPT_PROXYUSERPWD, $proxyusername.':'.$proxypassword); - if (defined('CURLOPT_PROXYAUTH')) - { - curl_setopt($curl, CURLOPT_PROXYAUTH, $proxyauthtype); - } - else if ($proxyauthtype != 1) - { - error_log('XML-RPC: '.__METHOD__.': warning. Only Basic auth to proxy is supported by the current PHP/curl install'); - } - } - } - - // NB: should we build cookie http headers by hand rather than let CURL do it? - // the following code does not honour 'expires', 'path' and 'domain' cookie attributes - // set to client obj the the user... - if (count($this->cookies)) - { - $cookieheader = ''; - foreach ($this->cookies as $name => $cookie) - { - $cookieheader .= $name . '=' . $cookie['value'] . '; '; - } - curl_setopt($curl, CURLOPT_COOKIE, substr($cookieheader, 0, -2)); - } - - foreach ($this->extracurlopts as $opt => $val) - { - curl_setopt($curl, $opt, $val); - } - - $result = curl_exec($curl); - - if ($this->debug > 1) - { - print "
    \n---CURL INFO---\n";
    -				foreach(curl_getinfo($curl) as $name => $val)
    -					 print $name . ': ' . htmlentities($val). "\n";
    -				print "---END---\n
    "; - } - - if(!$result) /// @todo we should use a better check here - what if we get back '' or '0'? - { - $this->errstr='no response'; - $resp=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['curl_fail'], $GLOBALS['xmlrpcstr']['curl_fail']. ': '. curl_error($curl)); - curl_close($curl); - if($keepalive) - { - $this->xmlrpc_curl_handle = null; - } - } - else - { - if(!$keepalive) - { - curl_close($curl); - } - $resp =& $msg->parseResponse($result, true, $this->return_type); - } - return $resp; - } - - /** - * Send an array of request messages and return an array of responses. - * Unless $this->no_multicall has been set to true, it will try first - * to use one single xmlrpc call to server method system.multicall, and - * revert to sending many successive calls in case of failure. - * This failure is also stored in $this->no_multicall for subsequent calls. - * Unfortunately, there is no server error code universally used to denote - * the fact that multicall is unsupported, so there is no way to reliably - * distinguish between that and a temporary failure. - * If you are sure that server supports multicall and do not want to - * fallback to using many single calls, set the fourth parameter to FALSE. - * - * NB: trying to shoehorn extra functionality into existing syntax has resulted - * in pretty much convoluted code... - * - * @param array $msgs an array of xmlrpcmsg objects - * @param integer $timeout connection timeout (in seconds) - * @param string $method the http protocol variant to be used - * @param boolean fallback When true, upon receiveing an error during multicall, multiple single calls will be attempted - * @return array - * @access public - */ - function multicall($msgs, $timeout=0, $method='', $fallback=true) - { - if ($method == '') - { - $method = $this->method; - } - if(!$this->no_multicall) - { - $results = $this->_try_multicall($msgs, $timeout, $method); - if(is_array($results)) - { - // System.multicall succeeded - return $results; - } - else - { - // either system.multicall is unsupported by server, - // or call failed for some other reason. - if ($fallback) - { - // Don't try it next time... - $this->no_multicall = true; - } - else - { - if (is_a($results, 'xmlrpcresp')) - { - $result = $results; - } - else - { - $result = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['multicall_error'], $GLOBALS['xmlrpcstr']['multicall_error']); - } - } - } - } - else - { - // override fallback, in case careless user tries to do two - // opposite things at the same time - $fallback = true; - } - - $results = array(); - if ($fallback) - { - // system.multicall is (probably) unsupported by server: - // emulate multicall via multiple requests - foreach($msgs as $msg) - { - $results[] =& $this->send($msg, $timeout, $method); - } - } - else - { - // user does NOT want to fallback on many single calls: - // since we should always return an array of responses, - // return an array with the same error repeated n times - foreach($msgs as $msg) - { - $results[] = $result; - } - } - return $results; - } - - /** - * Attempt to boxcar $msgs via system.multicall. - * Returns either an array of xmlrpcreponses, an xmlrpc error response - * or false (when received response does not respect valid multicall syntax) - * @access private - */ - function _try_multicall($msgs, $timeout, $method) - { - // Construct multicall message - $calls = array(); - foreach($msgs as $msg) - { - $call['methodName'] = new xmlrpcval($msg->method(),'string'); - $numParams = $msg->getNumParams(); - $params = array(); - for($i = 0; $i < $numParams; $i++) - { - $params[$i] = $msg->getParam($i); - } - $call['params'] = new xmlrpcval($params, 'array'); - $calls[] = new xmlrpcval($call, 'struct'); - } - $multicall = new xmlrpcmsg('system.multicall'); - $multicall->addParam(new xmlrpcval($calls, 'array')); - - // Attempt RPC call - $result =& $this->send($multicall, $timeout, $method); - - if($result->faultCode() != 0) - { - // call to system.multicall failed - return $result; - } - - // Unpack responses. - $rets = $result->value(); - - if ($this->return_type == 'xml') - { - return $rets; - } - else if ($this->return_type == 'phpvals') - { - ///@todo test this code branch... - $rets = $result->value(); - if(!is_array($rets)) - { - return false; // bad return type from system.multicall - } - $numRets = count($rets); - if($numRets != count($msgs)) - { - return false; // wrong number of return values. - } - - $response = array(); - for($i = 0; $i < $numRets; $i++) - { - $val = $rets[$i]; - if (!is_array($val)) { - return false; - } - switch(count($val)) - { - case 1: - if(!isset($val[0])) - { - return false; // Bad value - } - // Normal return value - $response[$i] = new xmlrpcresp($val[0], 0, '', 'phpvals'); - break; - case 2: - /// @todo remove usage of @: it is apparently quite slow - $code = @$val['faultCode']; - if(!is_int($code)) - { - return false; - } - $str = @$val['faultString']; - if(!is_string($str)) - { - return false; - } - $response[$i] = new xmlrpcresp(0, $code, $str); - break; - default: - return false; - } - } - return $response; - } - else // return type == 'xmlrpcvals' - { - $rets = $result->value(); - if($rets->kindOf() != 'array') - { - return false; // bad return type from system.multicall - } - $numRets = $rets->arraysize(); - if($numRets != count($msgs)) - { - return false; // wrong number of return values. - } - - $response = array(); - for($i = 0; $i < $numRets; $i++) - { - $val = $rets->arraymem($i); - switch($val->kindOf()) - { - case 'array': - if($val->arraysize() != 1) - { - return false; // Bad value - } - // Normal return value - $response[$i] = new xmlrpcresp($val->arraymem(0)); - break; - case 'struct': - $code = $val->structmem('faultCode'); - if($code->kindOf() != 'scalar' || $code->scalartyp() != 'int') - { - return false; - } - $str = $val->structmem('faultString'); - if($str->kindOf() != 'scalar' || $str->scalartyp() != 'string') - { - return false; - } - $response[$i] = new xmlrpcresp(0, $code->scalarval(), $str->scalarval()); - break; - default: - return false; - } - } - return $response; - } - } - } // end class xmlrpc_client - - class xmlrpcresp - { - var $val = 0; - var $valtyp; - var $errno = 0; - var $errstr = ''; - var $payload; - var $hdrs = array(); - var $_cookies = array(); - var $content_type = 'text/xml'; - var $raw_data = ''; - - /** - * @param mixed $val either an xmlrpcval obj, a php value or the xml serialization of an xmlrpcval (a string) - * @param integer $fcode set it to anything but 0 to create an error response - * @param string $fstr the error string, in case of an error response - * @param string $valtyp either 'xmlrpcvals', 'phpvals' or 'xml' - * - * @todo add check that $val / $fcode / $fstr is of correct type??? - * NB: as of now we do not do it, since it might be either an xmlrpcval or a plain - * php val, or a complete xml chunk, depending on usage of xmlrpc_client::send() inside which creator is called... - */ - function xmlrpcresp($val, $fcode = 0, $fstr = '', $valtyp='') - { - if($fcode != 0) - { - // error response - $this->errno = $fcode; - $this->errstr = $fstr; - //$this->errstr = htmlspecialchars($fstr); // XXX: encoding probably shouldn't be done here; fix later. - } - else - { - // successful response - $this->val = $val; - if ($valtyp == '') - { - // user did not declare type of response value: try to guess it - if (is_object($this->val) && is_a($this->val, 'xmlrpcval')) - { - $this->valtyp = 'xmlrpcvals'; - } - else if (is_string($this->val)) - { - $this->valtyp = 'xml'; - - } - else - { - $this->valtyp = 'phpvals'; - } - } - else - { - // user declares type of resp value: believe him - $this->valtyp = $valtyp; - } - } - } - - /** - * Returns the error code of the response. - * @return integer the error code of this response (0 for not-error responses) - * @access public - */ - function faultCode() - { - return $this->errno; - } - - /** - * Returns the error code of the response. - * @return string the error string of this response ('' for not-error responses) - * @access public - */ - function faultString() - { - return $this->errstr; - } - - /** - * Returns the value received by the server. - * @return mixed the xmlrpcval object returned by the server. Might be an xml string or php value if the response has been created by specially configured xmlrpc_client objects - * @access public - */ - function value() - { - return $this->val; - } - - /** - * Returns an array with the cookies received from the server. - * Array has the form: $cookiename => array ('value' => $val, $attr1 => $val1, $attr2 = $val2, ...) - * with attributes being e.g. 'expires', 'path', domain'. - * NB: cookies sent as 'expired' by the server (i.e. with an expiry date in the past) - * are still present in the array. It is up to the user-defined code to decide - * how to use the received cookies, and wheter they have to be sent back with the next - * request to the server (using xmlrpc_client::setCookie) or not - * @return array array of cookies received from the server - * @access public - */ - function cookies() - { - return $this->_cookies; - } - - /** - * Returns xml representation of the response. XML prologue not included - * @param string $charset_encoding the charset to be used for serialization. if null, US-ASCII is assumed - * @return string the xml representation of the response - * @access public - */ - function serialize($charset_encoding='') - { - if ($charset_encoding != '') - $this->content_type = 'text/xml; charset=' . $charset_encoding; - else - $this->content_type = 'text/xml'; - $result = "\n"; - if($this->errno) - { - // G. Giunta 2005/2/13: let non-ASCII response messages be tolerated by clients - // by xml-encoding non ascii chars - $result .= "\n" . -"\nfaultCode\n" . $this->errno . -"\n\n\nfaultString\n" . -xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding) . "\n\n" . -"\n\n"; - } - else - { - if(!is_object($this->val) || !is_a($this->val, 'xmlrpcval')) - { - if (is_string($this->val) && $this->valtyp == 'xml') - { - $result .= "\n\n" . - $this->val . - "\n"; - } - else - { - /// @todo try to build something serializable? - die('cannot serialize xmlrpcresp objects whose content is native php values'); - } - } - else - { - $result .= "\n\n" . - $this->val->serialize($charset_encoding) . - "\n"; - } - } - $result .= "\n"; - $this->payload = $result; - return $result; - } - } - - class xmlrpcmsg - { - var $payload; - var $methodname; - var $params=array(); - var $debug=0; - var $content_type = 'text/xml'; - - /** - * @param string $meth the name of the method to invoke - * @param array $pars array of parameters to be paased to the method (xmlrpcval objects) - */ - function xmlrpcmsg($meth, $pars=0) - { - $this->methodname=$meth; - if(is_array($pars) && count($pars)>0) - { - for($i=0; $iaddParam($pars[$i]); - } - } - } - - /** - * @access private - */ - function xml_header($charset_encoding='') - { - if ($charset_encoding != '') - { - return "\n\n"; - } - else - { - return "\n\n"; - } - } - - /** - * @access private - */ - function xml_footer() - { - return ''; - } - - /** - * @access private - */ - function kindOf() - { - return 'msg'; - } - - /** - * @access private - */ - function createPayload($charset_encoding='') - { - if ($charset_encoding != '') - $this->content_type = 'text/xml; charset=' . $charset_encoding; - else - $this->content_type = 'text/xml'; - $this->payload=$this->xml_header($charset_encoding); - $this->payload.='' . $this->methodname . "\n"; - $this->payload.="\n"; - for($i=0; $iparams); $i++) - { - $p=$this->params[$i]; - $this->payload.="\n" . $p->serialize($charset_encoding) . - "\n"; - } - $this->payload.="\n"; - $this->payload.=$this->xml_footer(); - } - - /** - * Gets/sets the xmlrpc method to be invoked - * @param string $meth the method to be set (leave empty not to set it) - * @return string the method that will be invoked - * @access public - */ - function method($meth='') - { - if($meth!='') - { - $this->methodname=$meth; - } - return $this->methodname; - } - - /** - * Returns xml representation of the message. XML prologue included - * @return string the xml representation of the message, xml prologue included - * @access public - */ - function serialize($charset_encoding='') - { - $this->createPayload($charset_encoding); - return $this->payload; - } - - /** - * Add a parameter to the list of parameters to be used upon method invocation - * @param xmlrpcval $par - * @return boolean false on failure - * @access public - */ - function addParam($par) - { - // add check: do not add to self params which are not xmlrpcvals - if(is_object($par) && is_a($par, 'xmlrpcval')) - { - $this->params[]=$par; - return true; - } - else - { - return false; - } - } - - /** - * Returns the nth parameter in the message. The index zero-based. - * @param integer $i the index of the parameter to fetch (zero based) - * @return xmlrpcval the i-th parameter - * @access public - */ - function getParam($i) { return $this->params[$i]; } - - /** - * Returns the number of parameters in the messge. - * @return integer the number of parameters currently set - * @access public - */ - function getNumParams() { return count($this->params); } - - /** - * Given an open file handle, read all data available and parse it as axmlrpc response. - * NB: the file handle is not closed by this function. - * NNB: might have trouble in rare cases to work on network streams, as we - * check for a read of 0 bytes instead of feof($fp). - * But since checking for feof(null) returns false, we would risk an - * infinite loop in that case, because we cannot trust the caller - * to give us a valid pointer to an open file... - * @access public - * @return xmlrpcresp - * @todo add 2nd & 3rd param to be passed to ParseResponse() ??? - */ - function &parseResponseFile($fp) - { - $ipd=''; - while($data=fread($fp, 32768)) - { - $ipd.=$data; - } - //fclose($fp); - $r =& $this->parseResponse($ipd); - return $r; - } - - /** - * Parses HTTP headers and separates them from data. - * @access private - */ - function &parseResponseHeaders(&$data, $headers_processed=false) - { - // Support "web-proxy-tunelling" connections for https through proxies - if(preg_match('/^HTTP\/1\.[0-1] 200 Connection established/', $data)) - { - // Look for CR/LF or simple LF as line separator, - // (even though it is not valid http) - $pos = strpos($data,"\r\n\r\n"); - if($pos || is_int($pos)) - { - $bd = $pos+4; - } - else - { - $pos = strpos($data,"\n\n"); - if($pos || is_int($pos)) - { - $bd = $pos+2; - } - else - { - // No separation between response headers and body: fault? - $bd = 0; - } - } - if ($bd) - { - // this filters out all http headers from proxy. - // maybe we could take them into account, too? - $data = substr($data, $bd); - } - else - { - error_log('XML-RPC: '.__METHOD__.': HTTPS via proxy error, tunnel connection possibly failed'); - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (HTTPS via proxy error, tunnel connection possibly failed)'); - return $r; - } - } - - // Strip HTTP 1.1 100 Continue header if present - while(preg_match('/^HTTP\/1\.1 1[0-9]{2} /', $data)) - { - $pos = strpos($data, 'HTTP', 12); - // server sent a Continue header without any (valid) content following... - // give the client a chance to know it - if(!$pos && !is_int($pos)) // works fine in php 3, 4 and 5 - { - break; - } - $data = substr($data, $pos); - } - if(!preg_match('/^HTTP\/[0-9.]+ 200 /', $data)) - { - $errstr= substr($data, 0, strpos($data, "\n")-1); - error_log('XML-RPC: '.__METHOD__.': HTTP error, got response: ' .$errstr); - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (' . $errstr . ')'); - return $r; - } - - $GLOBALS['_xh']['headers'] = array(); - $GLOBALS['_xh']['cookies'] = array(); - - // be tolerant to usage of \n instead of \r\n to separate headers and data - // (even though it is not valid http) - $pos = strpos($data,"\r\n\r\n"); - if($pos || is_int($pos)) - { - $bd = $pos+4; - } - else - { - $pos = strpos($data,"\n\n"); - if($pos || is_int($pos)) - { - $bd = $pos+2; - } - else - { - // No separation between response headers and body: fault? - // we could take some action here instead of going on... - $bd = 0; - } - } - // be tolerant to line endings, and extra empty lines - $ar = preg_split("/\r?\n/", trim(substr($data, 0, $pos))); - while(list(,$line) = @each($ar)) - { - // take care of multi-line headers and cookies - $arr = explode(':',$line,2); - if(count($arr) > 1) - { - $header_name = strtolower(trim($arr[0])); - /// @todo some other headers (the ones that allow a CSV list of values) - /// do allow many values to be passed using multiple header lines. - /// We should add content to $GLOBALS['_xh']['headers'][$header_name] - /// instead of replacing it for those... - if ($header_name == 'set-cookie' || $header_name == 'set-cookie2') - { - if ($header_name == 'set-cookie2') - { - // version 2 cookies: - // there could be many cookies on one line, comma separated - $cookies = explode(',', $arr[1]); - } - else - { - $cookies = array($arr[1]); - } - foreach ($cookies as $cookie) - { - // glue together all received cookies, using a comma to separate them - // (same as php does with getallheaders()) - if (isset($GLOBALS['_xh']['headers'][$header_name])) - $GLOBALS['_xh']['headers'][$header_name] .= ', ' . trim($cookie); - else - $GLOBALS['_xh']['headers'][$header_name] = trim($cookie); - // parse cookie attributes, in case user wants to correctly honour them - // feature creep: only allow rfc-compliant cookie attributes? - // @todo support for server sending multiple time cookie with same name, but using different PATHs - $cookie = explode(';', $cookie); - foreach ($cookie as $pos => $val) - { - $val = explode('=', $val, 2); - $tag = trim($val[0]); - $val = trim(@$val[1]); - /// @todo with version 1 cookies, we should strip leading and trailing " chars - if ($pos == 0) - { - $cookiename = $tag; - $GLOBALS['_xh']['cookies'][$tag] = array(); - $GLOBALS['_xh']['cookies'][$cookiename]['value'] = urldecode($val); - } - else - { - if ($tag != 'value') - { - $GLOBALS['_xh']['cookies'][$cookiename][$tag] = $val; - } - } - } - } - } - else - { - $GLOBALS['_xh']['headers'][$header_name] = trim($arr[1]); - } - } - elseif(isset($header_name)) - { - /// @todo version1 cookies might span multiple lines, thus breaking the parsing above - $GLOBALS['_xh']['headers'][$header_name] .= ' ' . trim($line); - } - } - - $data = substr($data, $bd); - - if($this->debug && count($GLOBALS['_xh']['headers'])) - { - print '
    ';
    -					foreach($GLOBALS['_xh']['headers'] as $header => $value)
    -					{
    -						print htmlentities("HEADER: $header: $value\n");
    -					}
    -					foreach($GLOBALS['_xh']['cookies'] as $header => $value)
    -					{
    -						print htmlentities("COOKIE: $header={$value['value']}\n");
    -					}
    -					print "
    \n"; - } - - // if CURL was used for the call, http headers have been processed, - // and dechunking + reinflating have been carried out - if(!$headers_processed) - { - // Decode chunked encoding sent by http 1.1 servers - if(isset($GLOBALS['_xh']['headers']['transfer-encoding']) && $GLOBALS['_xh']['headers']['transfer-encoding'] == 'chunked') - { - if(!$data = decode_chunked($data)) - { - error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to rebuild the chunked data received from server'); - $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['dechunk_fail'], $GLOBALS['xmlrpcstr']['dechunk_fail']); - return $r; - } - } - - // Decode gzip-compressed stuff - // code shamelessly inspired from nusoap library by Dietrich Ayala - if(isset($GLOBALS['_xh']['headers']['content-encoding'])) - { - $GLOBALS['_xh']['headers']['content-encoding'] = str_replace('x-', '', $GLOBALS['_xh']['headers']['content-encoding']); - if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' || $GLOBALS['_xh']['headers']['content-encoding'] == 'gzip') - { - // if decoding works, use it. else assume data wasn't gzencoded - if(function_exists('gzinflate')) - { - if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) - { - $data = $degzdata; - if($this->debug) - print "
    ---INFLATED RESPONSE---[".strlen($data)." chars]---\n" . htmlentities($data) . "\n---END---
    "; - } - elseif($GLOBALS['_xh']['headers']['content-encoding'] == 'gzip' && $degzdata = @gzinflate(substr($data, 10))) - { - $data = $degzdata; - if($this->debug) - print "
    ---INFLATED RESPONSE---[".strlen($data)." chars]---\n" . htmlentities($data) . "\n---END---
    "; - } - else - { - error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to decode the deflated data received from server'); - $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['decompress_fail'], $GLOBALS['xmlrpcstr']['decompress_fail']); - return $r; - } - } - else - { - error_log('XML-RPC: '.__METHOD__.': the server sent deflated data. Your php install must have the Zlib extension compiled in to support this.'); - $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['cannot_decompress'], $GLOBALS['xmlrpcstr']['cannot_decompress']); - return $r; - } - } - } - } // end of 'if needed, de-chunk, re-inflate response' - - // real stupid hack to avoid PHP complaining about returning NULL by ref - $r = null; - $r =& $r; - return $r; - } - - /** - * Parse the xmlrpc response contained in the string $data and return an xmlrpcresp object. - * @param string $data the xmlrpc response, eventually including http headers - * @param bool $headers_processed when true prevents parsing HTTP headers for interpretation of content-encoding and consequent decoding - * @param string $return_type decides return type, i.e. content of response->value(). Either 'xmlrpcvals', 'xml' or 'phpvals' - * @return xmlrpcresp - * @access public - */ - function &parseResponse($data='', $headers_processed=false, $return_type='xmlrpcvals') - { - if($this->debug) - { - //by maHo, replaced htmlspecialchars with htmlentities - print "
    ---GOT---\n" . htmlentities($data) . "\n---END---\n
    "; - } - - if($data == '') - { - error_log('XML-RPC: '.__METHOD__.': no response received from server.'); - $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_data'], $GLOBALS['xmlrpcstr']['no_data']); - return $r; - } - - $GLOBALS['_xh']=array(); - - $raw_data = $data; - // parse the HTTP headers of the response, if present, and separate them from data - if(substr($data, 0, 4) == 'HTTP') - { - $r =& $this->parseResponseHeaders($data, $headers_processed); - if ($r) - { - // failed processing of HTTP response headers - // save into response obj the full payload received, for debugging - $r->raw_data = $data; - return $r; - } - } - else - { - $GLOBALS['_xh']['headers'] = array(); - $GLOBALS['_xh']['cookies'] = array(); - } - - if($this->debug) - { - $start = strpos($data, '', $start); - $comments = substr($data, $start, $end-$start); - print "
    ---SERVER DEBUG INFO (DECODED) ---\n\t".htmlentities(str_replace("\n", "\n\t", base64_decode($comments)))."\n---END---\n
    "; - } - } - - // be tolerant of extra whitespace in response body - $data = trim($data); - - /// @todo return an error msg if $data=='' ? - - // be tolerant of junk after methodResponse (e.g. javascript ads automatically inserted by free hosts) - // idea from Luca Mariano originally in PEARified version of the lib - $pos = strrpos($data, ''); - if($pos !== false) - { - $data = substr($data, 0, $pos+17); - } - - // if user wants back raw xml, give it to him - if ($return_type == 'xml') - { - $r = new xmlrpcresp($data, 0, '', 'xml'); - $r->hdrs = $GLOBALS['_xh']['headers']; - $r->_cookies = $GLOBALS['_xh']['cookies']; - $r->raw_data = $raw_data; - return $r; - } - - // try to 'guestimate' the character encoding of the received response - $resp_encoding = guess_encoding(@$GLOBALS['_xh']['headers']['content-type'], $data); - - $GLOBALS['_xh']['ac']=''; - //$GLOBALS['_xh']['qt']=''; //unused... - $GLOBALS['_xh']['stack'] = array(); - $GLOBALS['_xh']['valuestack'] = array(); - $GLOBALS['_xh']['isf']=0; // 0 = OK, 1 for xmlrpc fault responses, 2 = invalid xmlrpc - $GLOBALS['_xh']['isf_reason']=''; - $GLOBALS['_xh']['rt']=''; // 'methodcall or 'methodresponse' - - // if response charset encoding is not known / supported, try to use - // the default encoding and parse the xml anyway, but log a warning... - if (!in_array($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) - // the following code might be better for mb_string enabled installs, but - // makes the lib about 200% slower... - //if (!is_valid_charset($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) - { - error_log('XML-RPC: '.__METHOD__.': invalid charset encoding of received response: '.$resp_encoding); - $resp_encoding = $GLOBALS['xmlrpc_defencoding']; - } - $parser = xml_parser_create($resp_encoding); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); - // G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell - // the xml parser to give us back data in the expected charset. - // What if internal encoding is not in one of the 3 allowed? - // we use the broadest one, ie. utf8 - // This allows to send data which is native in various charset, - // by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding - if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) - { - xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); - } - else - { - xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']); - } - - if ($return_type == 'phpvals') - { - xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast'); - } - else - { - xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee'); - } - - xml_set_character_data_handler($parser, 'xmlrpc_cd'); - xml_set_default_handler($parser, 'xmlrpc_dh'); - - // first error check: xml not well formed - if(!xml_parse($parser, $data, count($data))) - { - // thanks to Peter Kocks - if((xml_get_current_line_number($parser)) == 1) - { - $errstr = 'XML error at line 1, check URL'; - } - else - { - $errstr = sprintf('XML error: %s at line %d, column %d', - xml_error_string(xml_get_error_code($parser)), - xml_get_current_line_number($parser), xml_get_current_column_number($parser)); - } - error_log($errstr); - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], $GLOBALS['xmlrpcstr']['invalid_return'].' ('.$errstr.')'); - xml_parser_free($parser); - if($this->debug) - { - print $errstr; - } - $r->hdrs = $GLOBALS['_xh']['headers']; - $r->_cookies = $GLOBALS['_xh']['cookies']; - $r->raw_data = $raw_data; - return $r; - } - xml_parser_free($parser); - // second error check: xml well formed but not xml-rpc compliant - if ($GLOBALS['_xh']['isf'] > 1) - { - if ($this->debug) - { - /// @todo echo something for user? - } - - $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], - $GLOBALS['xmlrpcstr']['invalid_return'] . ' ' . $GLOBALS['_xh']['isf_reason']); - } - // third error check: parsing of the response has somehow gone boink. - // NB: shall we omit this check, since we trust the parsing code? - elseif ($return_type == 'xmlrpcvals' && !is_object($GLOBALS['_xh']['value'])) - { - // something odd has happened - // and it's time to generate a client side error - // indicating something odd went on - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], - $GLOBALS['xmlrpcstr']['invalid_return']); - } - else - { - if ($this->debug) - { - print "
    ---PARSED---\n";
    -					// somehow htmlentities chokes on var_export, and some full html string...
    -					//print htmlentitites(var_export($GLOBALS['_xh']['value'], true));
    -					print htmlspecialchars(var_export($GLOBALS['_xh']['value'], true));
    -					print "\n---END---
    "; - } - - // note that using =& will raise an error if $GLOBALS['_xh']['st'] does not generate an object. - $v =& $GLOBALS['_xh']['value']; - - if($GLOBALS['_xh']['isf']) - { - /// @todo we should test here if server sent an int and a string, - /// and/or coerce them into such... - if ($return_type == 'xmlrpcvals') - { - $errno_v = $v->structmem('faultCode'); - $errstr_v = $v->structmem('faultString'); - $errno = $errno_v->scalarval(); - $errstr = $errstr_v->scalarval(); - } - else - { - $errno = $v['faultCode']; - $errstr = $v['faultString']; - } - - if($errno == 0) - { - // FAULT returned, errno needs to reflect that - $errno = -1; - } - - $r = new xmlrpcresp(0, $errno, $errstr); - } - else - { - $r=new xmlrpcresp($v, 0, '', $return_type); - } - } - - $r->hdrs = $GLOBALS['_xh']['headers']; - $r->_cookies = $GLOBALS['_xh']['cookies']; - $r->raw_data = $raw_data; - return $r; - } - } - - class xmlrpcval - { - var $me=array(); - var $mytype=0; - var $_php_class=null; - - /** - * @param mixed $val - * @param string $type any valid xmlrpc type name (lowercase). If null, 'string' is assumed - */ - function xmlrpcval($val=-1, $type='') - { - /// @todo: optimization creep - do not call addXX, do it all inline. - /// downside: booleans will not be coerced anymore - if($val!==-1 || $type!='') - { - // optimization creep: inlined all work done by constructor - switch($type) - { - case '': - $this->mytype=1; - $this->me['string']=$val; - break; - case 'i4': - case 'int': - case 'double': - case 'string': - case 'boolean': - case 'dateTime.iso8601': - case 'base64': - case 'null': - $this->mytype=1; - $this->me[$type]=$val; - break; - case 'array': - $this->mytype=2; - $this->me['array']=$val; - break; - case 'struct': - $this->mytype=3; - $this->me['struct']=$val; - break; - default: - error_log("XML-RPC: ".__METHOD__.": not a known type ($type)"); - } - /*if($type=='') - { - $type='string'; - } - if($GLOBALS['xmlrpcTypes'][$type]==1) - { - $this->addScalar($val,$type); - } - elseif($GLOBALS['xmlrpcTypes'][$type]==2) - { - $this->addArray($val); - } - elseif($GLOBALS['xmlrpcTypes'][$type]==3) - { - $this->addStruct($val); - }*/ - } - } - - /** - * Add a single php value to an (unitialized) xmlrpcval - * @param mixed $val - * @param string $type - * @return int 1 or 0 on failure - */ - function addScalar($val, $type='string') - { - $typeof=@$GLOBALS['xmlrpcTypes'][$type]; - if($typeof!=1) - { - error_log("XML-RPC: ".__METHOD__.": not a scalar type ($type)"); - return 0; - } - - // coerce booleans into correct values - // NB: we should either do it for datetimes, integers and doubles, too, - // or just plain remove this check, implemented on booleans only... - if($type==$GLOBALS['xmlrpcBoolean']) - { - if(strcasecmp($val,'true')==0 || $val==1 || ($val==true && strcasecmp($val,'false'))) - { - $val=true; - } - else - { - $val=false; - } - } - - switch($this->mytype) - { - case 1: - error_log('XML-RPC: '.__METHOD__.': scalar xmlrpcval can have only one value'); - return 0; - case 3: - error_log('XML-RPC: '.__METHOD__.': cannot add anonymous scalar to struct xmlrpcval'); - return 0; - case 2: - // we're adding a scalar value to an array here - //$ar=$this->me['array']; - //$ar[]=new xmlrpcval($val, $type); - //$this->me['array']=$ar; - // Faster (?) avoid all the costly array-copy-by-val done here... - $this->me['array'][]=new xmlrpcval($val, $type); - return 1; - default: - // a scalar, so set the value and remember we're scalar - $this->me[$type]=$val; - $this->mytype=$typeof; - return 1; - } - } - - /** - * Add an array of xmlrpcval objects to an xmlrpcval - * @param array $vals - * @return int 1 or 0 on failure - * @access public - * - * @todo add some checking for $vals to be an array of xmlrpcvals? - */ - function addArray($vals) - { - if($this->mytype==0) - { - $this->mytype=$GLOBALS['xmlrpcTypes']['array']; - $this->me['array']=$vals; - return 1; - } - elseif($this->mytype==2) - { - // we're adding to an array here - $this->me['array'] = array_merge($this->me['array'], $vals); - return 1; - } - else - { - error_log('XML-RPC: '.__METHOD__.': already initialized as a [' . $this->kindOf() . ']'); - return 0; - } - } - - /** - * Add an array of named xmlrpcval objects to an xmlrpcval - * @param array $vals - * @return int 1 or 0 on failure - * @access public - * - * @todo add some checking for $vals to be an array? - */ - function addStruct($vals) - { - if($this->mytype==0) - { - $this->mytype=$GLOBALS['xmlrpcTypes']['struct']; - $this->me['struct']=$vals; - return 1; - } - elseif($this->mytype==3) - { - // we're adding to a struct here - $this->me['struct'] = array_merge($this->me['struct'], $vals); - return 1; - } - else - { - error_log('XML-RPC: '.__METHOD__.': already initialized as a [' . $this->kindOf() . ']'); - return 0; - } - } - - // poor man's version of print_r ??? - // DEPRECATED! - function dump($ar) - { - foreach($ar as $key => $val) - { - echo "$key => $val
    "; - if($key == 'array') - { - while(list($key2, $val2) = each($val)) - { - echo "-- $key2 => $val2
    "; - } - } - } - } - - /** - * Returns a string containing "struct", "array" or "scalar" describing the base type of the value - * @return string - * @access public - */ - function kindOf() - { - switch($this->mytype) - { - case 3: - return 'struct'; - break; - case 2: - return 'array'; - break; - case 1: - return 'scalar'; - break; - default: - return 'undef'; - } - } - - /** - * @access private - */ - function serializedata($typ, $val, $charset_encoding='') - { - $rs=''; - switch(@$GLOBALS['xmlrpcTypes'][$typ]) - { - case 1: - switch($typ) - { - case $GLOBALS['xmlrpcBase64']: - $rs.="<${typ}>" . base64_encode($val) . ""; - break; - case $GLOBALS['xmlrpcBoolean']: - $rs.="<${typ}>" . ($val ? '1' : '0') . ""; - break; - case $GLOBALS['xmlrpcString']: - // G. Giunta 2005/2/13: do NOT use htmlentities, since - // it will produce named html entities, which are invalid xml - $rs.="<${typ}>" . xmlrpc_encode_entitites($val, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding). ""; - break; - case $GLOBALS['xmlrpcInt']: - case $GLOBALS['xmlrpcI4']: - $rs.="<${typ}>".(int)$val.""; - break; - case $GLOBALS['xmlrpcDouble']: - // avoid using standard conversion of float to string because it is locale-dependent, - // and also because the xmlrpc spec forbids exponential notation. - // sprintf('%F') could be most likely ok but it fails eg. on 2e-14. - // The code below tries its best at keeping max precision while avoiding exp notation, - // but there is of course no limit in the number of decimal places to be used... - $rs.="<${typ}>".preg_replace('/\\.?0+$/','',number_format((double)$val, 128, '.', '')).""; - break; - case $GLOBALS['xmlrpcDateTime']: - if (is_string($val)) - { - $rs.="<${typ}>${val}"; - } - else if(is_a($val, 'DateTime')) - { - $rs.="<${typ}>".$val->format('Ymd\TH:i:s').""; - } - else if(is_int($val)) - { - $rs.="<${typ}>".strftime("%Y%m%dT%H:%M:%S", $val).""; - } - else - { - // not really a good idea here: but what shall we output anyway? left for backward compat... - $rs.="<${typ}>${val}"; - } - break; - case $GLOBALS['xmlrpcNull']: - if ($GLOBALS['xmlrpc_null_apache_encoding']) - { - $rs.=""; - } - else - { - $rs.=""; - } - break; - default: - // no standard type value should arrive here, but provide a possibility - // for xmlrpcvals of unknown type... - $rs.="<${typ}>${val}"; - } - break; - case 3: - // struct - if ($this->_php_class) - { - $rs.='\n"; - } - else - { - $rs.="\n"; - } - foreach($val as $key2 => $val2) - { - $rs.=''.xmlrpc_encode_entitites($key2, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding)."\n"; - //$rs.=$this->serializeval($val2); - $rs.=$val2->serialize($charset_encoding); - $rs.="\n"; - } - $rs.=''; - break; - case 2: - // array - $rs.="\n\n"; - for($i=0; $iserializeval($val[$i]); - $rs.=$val[$i]->serialize($charset_encoding); - } - $rs.="\n"; - break; - default: - break; - } - return $rs; - } - - /** - * Returns xml representation of the value. XML prologue not included - * @param string $charset_encoding the charset to be used for serialization. if null, US-ASCII is assumed - * @return string - * @access public - */ - function serialize($charset_encoding='') - { - // add check? slower, but helps to avoid recursion in serializing broken xmlrpcvals... - //if (is_object($o) && (get_class($o) == 'xmlrpcval' || is_subclass_of($o, 'xmlrpcval'))) - //{ - reset($this->me); - list($typ, $val) = each($this->me); - return '' . $this->serializedata($typ, $val, $charset_encoding) . "\n"; - //} - } - - // DEPRECATED - function serializeval($o) - { - // add check? slower, but helps to avoid recursion in serializing broken xmlrpcvals... - //if (is_object($o) && (get_class($o) == 'xmlrpcval' || is_subclass_of($o, 'xmlrpcval'))) - //{ - $ar=$o->me; - reset($ar); - list($typ, $val) = each($ar); - return '' . $this->serializedata($typ, $val) . "\n"; - //} - } - - /** - * Checks wheter a struct member with a given name is present. - * Works only on xmlrpcvals of type struct. - * @param string $m the name of the struct member to be looked up - * @return boolean - * @access public - */ - function structmemexists($m) - { - return array_key_exists($m, $this->me['struct']); - } - - /** - * Returns the value of a given struct member (an xmlrpcval object in itself). - * Will raise a php warning if struct member of given name does not exist - * @param string $m the name of the struct member to be looked up - * @return xmlrpcval - * @access public - */ - function structmem($m) - { - return $this->me['struct'][$m]; - } - - /** - * Reset internal pointer for xmlrpcvals of type struct. - * @access public - */ - function structreset() - { - reset($this->me['struct']); - } - - /** - * Return next member element for xmlrpcvals of type struct. - * @return xmlrpcval - * @access public - */ - function structeach() - { - return each($this->me['struct']); - } - - // DEPRECATED! this code looks like it is very fragile and has not been fixed - // for a long long time. Shall we remove it for 2.0? - function getval() - { - // UNSTABLE - reset($this->me); - list($a,$b)=each($this->me); - // contributed by I Sofer, 2001-03-24 - // add support for nested arrays to scalarval - // i've created a new method here, so as to - // preserve back compatibility - - if(is_array($b)) - { - @reset($b); - while(list($id,$cont) = @each($b)) - { - $b[$id] = $cont->scalarval(); - } - } - - // add support for structures directly encoding php objects - if(is_object($b)) - { - $t = get_object_vars($b); - @reset($t); - while(list($id,$cont) = @each($t)) - { - $t[$id] = $cont->scalarval(); - } - @reset($t); - while(list($id,$cont) = @each($t)) - { - @$b->$id = $cont; - } - } - // end contrib - return $b; - } - - /** - * Returns the value of a scalar xmlrpcval - * @return mixed - * @access public - */ - function scalarval() - { - reset($this->me); - list(,$b)=each($this->me); - return $b; - } - - /** - * Returns the type of the xmlrpcval. - * For integers, 'int' is always returned in place of 'i4' - * @return string - * @access public - */ - function scalartyp() - { - reset($this->me); - list($a,)=each($this->me); - if($a==$GLOBALS['xmlrpcI4']) - { - $a=$GLOBALS['xmlrpcInt']; - } - return $a; - } - - /** - * Returns the m-th member of an xmlrpcval of struct type - * @param integer $m the index of the value to be retrieved (zero based) - * @return xmlrpcval - * @access public - */ - function arraymem($m) - { - return $this->me['array'][$m]; - } - - /** - * Returns the number of members in an xmlrpcval of array type - * @return integer - * @access public - */ - function arraysize() - { - return count($this->me['array']); - } - - /** - * Returns the number of members in an xmlrpcval of struct type - * @return integer - * @access public - */ - function structsize() - { - return count($this->me['struct']); - } - } - - - // date helpers - - /** - * Given a timestamp, return the corresponding ISO8601 encoded string. - * - * Really, timezones ought to be supported - * but the XML-RPC spec says: - * - * "Don't assume a timezone. It should be specified by the server in its - * documentation what assumptions it makes about timezones." - * - * These routines always assume localtime unless - * $utc is set to 1, in which case UTC is assumed - * and an adjustment for locale is made when encoding - * - * @param int $timet (timestamp) - * @param int $utc (0 or 1) - * @return string - */ - function iso8601_encode($timet, $utc=0) - { - if(!$utc) - { - $t=strftime("%Y%m%dT%H:%M:%S", $timet); - } - else - { - if(function_exists('gmstrftime')) - { - // gmstrftime doesn't exist in some versions - // of PHP - $t=gmstrftime("%Y%m%dT%H:%M:%S", $timet); - } - else - { - $t=strftime("%Y%m%dT%H:%M:%S", $timet-date('Z')); - } - } - return $t; - } - - /** - * Given an ISO8601 date string, return a timet in the localtime, or UTC - * @param string $idate - * @param int $utc either 0 or 1 - * @return int (datetime) - */ - function iso8601_decode($idate, $utc=0) - { - $t=0; - if(preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/', $idate, $regs)) - { - if($utc) - { - $t=gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); - } - else - { - $t=mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); - } - } - return $t; - } - - /** - * Takes an xmlrpc value in PHP xmlrpcval object format and translates it into native PHP types. - * - * Works with xmlrpc message objects as input, too. - * - * Given proper options parameter, can rebuild generic php object instances - * (provided those have been encoded to xmlrpc format using a corresponding - * option in php_xmlrpc_encode()) - * PLEASE NOTE that rebuilding php objects involves calling their constructor function. - * This means that the remote communication end can decide which php code will - * get executed on your server, leaving the door possibly open to 'php-injection' - * style of attacks (provided you have some classes defined on your server that - * might wreak havoc if instances are built outside an appropriate context). - * Make sure you trust the remote server/client before eanbling this! - * - * @author Dan Libby (dan@libby.com) - * - * @param xmlrpcval $xmlrpc_val - * @param array $options if 'decode_php_objs' is set in the options array, xmlrpc structs can be decoded into php objects; if 'dates_as_objects' is set xmlrpc datetimes are decoded as php DateTime objects (standard is - * @return mixed - */ - function php_xmlrpc_decode($xmlrpc_val, $options=array()) - { - switch($xmlrpc_val->kindOf()) - { - case 'scalar': - if (in_array('extension_api', $options)) - { - reset($xmlrpc_val->me); - list($typ,$val) = each($xmlrpc_val->me); - switch ($typ) - { - case 'dateTime.iso8601': - $xmlrpc_val->scalar = $val; - $xmlrpc_val->xmlrpc_type = 'datetime'; - $xmlrpc_val->timestamp = iso8601_decode($val); - return $xmlrpc_val; - case 'base64': - $xmlrpc_val->scalar = $val; - $xmlrpc_val->type = $typ; - return $xmlrpc_val; - default: - return $xmlrpc_val->scalarval(); - } - } - if (in_array('dates_as_objects', $options) && $xmlrpc_val->scalartyp() == 'dateTime.iso8601') - { - // we return a Datetime object instead of a string - // since now the constructor of xmlrpcval accepts safely strings, ints and datetimes, - // we cater to all 3 cases here - $out = $xmlrpc_val->scalarval(); - if (is_string($out)) - { - $out = strtotime($out); - } - if (is_int($out)) - { - $result = new Datetime(); - $result->setTimestamp($out); - return $result; - } - elseif (is_a($out, 'Datetime')) - { - return $out; - } - } - return $xmlrpc_val->scalarval(); - case 'array': - $size = $xmlrpc_val->arraysize(); - $arr = array(); - for($i = 0; $i < $size; $i++) - { - $arr[] = php_xmlrpc_decode($xmlrpc_val->arraymem($i), $options); - } - return $arr; - case 'struct': - $xmlrpc_val->structreset(); - // If user said so, try to rebuild php objects for specific struct vals. - /// @todo should we raise a warning for class not found? - // shall we check for proper subclass of xmlrpcval instead of - // presence of _php_class to detect what we can do? - if (in_array('decode_php_objs', $options) && $xmlrpc_val->_php_class != '' - && class_exists($xmlrpc_val->_php_class)) - { - $obj = @new $xmlrpc_val->_php_class; - while(list($key,$value)=$xmlrpc_val->structeach()) - { - $obj->$key = php_xmlrpc_decode($value, $options); - } - return $obj; - } - else - { - $arr = array(); - while(list($key,$value)=$xmlrpc_val->structeach()) - { - $arr[$key] = php_xmlrpc_decode($value, $options); - } - return $arr; - } - case 'msg': - $paramcount = $xmlrpc_val->getNumParams(); - $arr = array(); - for($i = 0; $i < $paramcount; $i++) - { - $arr[] = php_xmlrpc_decode($xmlrpc_val->getParam($i)); - } - return $arr; - } - } - - // This constant left here only for historical reasons... - // it was used to decide if we have to define xmlrpc_encode on our own, but - // we do not do it anymore - if(function_exists('xmlrpc_decode')) - { - define('XMLRPC_EPI_ENABLED','1'); - } - else - { - define('XMLRPC_EPI_ENABLED','0'); - } - - /** - * Takes native php types and encodes them into xmlrpc PHP object format. - * It will not re-encode xmlrpcval objects. - * - * Feature creep -- could support more types via optional type argument - * (string => datetime support has been added, ??? => base64 not yet) - * - * If given a proper options parameter, php object instances will be encoded - * into 'special' xmlrpc values, that can later be decoded into php objects - * by calling php_xmlrpc_decode() with a corresponding option - * - * @author Dan Libby (dan@libby.com) - * - * @param mixed $php_val the value to be converted into an xmlrpcval object - * @param array $options can include 'encode_php_objs', 'auto_dates', 'null_extension' or 'extension_api' - * @return xmlrpcval - */ - function php_xmlrpc_encode($php_val, $options=array()) - { - $type = gettype($php_val); - switch($type) - { - case 'string': - if (in_array('auto_dates', $options) && preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $php_val)) - $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDateTime']); - else - $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcString']); - break; - case 'integer': - $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcInt']); - break; - case 'double': - $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDouble']); - break; - // - // Add support for encoding/decoding of booleans, since they are supported in PHP - case 'boolean': - $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcBoolean']); - break; - // - case 'array': - // PHP arrays can be encoded to either xmlrpc structs or arrays, - // depending on wheter they are hashes or plain 0..n integer indexed - // A shorter one-liner would be - // $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1)); - // but execution time skyrockets! - $j = 0; - $arr = array(); - $ko = false; - foreach($php_val as $key => $val) - { - $arr[$key] = php_xmlrpc_encode($val, $options); - if(!$ko && $key !== $j) - { - $ko = true; - } - $j++; - } - if($ko) - { - $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']); - } - else - { - $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcArray']); - } - break; - case 'object': - if(is_a($php_val, 'xmlrpcval')) - { - $xmlrpc_val = $php_val; - } - else if(is_a($php_val, 'DateTime')) - { - $xmlrpc_val = new xmlrpcval($php_val->format('Ymd\TH:i:s'), $GLOBALS['xmlrpcStruct']); - } - else - { - $arr = array(); - reset($php_val); - while(list($k,$v) = each($php_val)) - { - $arr[$k] = php_xmlrpc_encode($v, $options); - } - $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']); - if (in_array('encode_php_objs', $options)) - { - // let's save original class name into xmlrpcval: - // might be useful later on... - $xmlrpc_val->_php_class = get_class($php_val); - } - } - break; - case 'NULL': - if (in_array('extension_api', $options)) - { - $xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcString']); - } - else if (in_array('null_extension', $options)) - { - $xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcNull']); - } - else - { - $xmlrpc_val = new xmlrpcval(); - } - break; - case 'resource': - if (in_array('extension_api', $options)) - { - $xmlrpc_val = new xmlrpcval((int)$php_val, $GLOBALS['xmlrpcInt']); - } - else - { - $xmlrpc_val = new xmlrpcval(); - } - // catch "user function", "unknown type" - default: - // giancarlo pinerolo - // it has to return - // an empty object in case, not a boolean. - $xmlrpc_val = new xmlrpcval(); - break; - } - return $xmlrpc_val; - } - - /** - * Convert the xml representation of a method response, method request or single - * xmlrpc value into the appropriate object (a.k.a. deserialize) - * @param string $xml_val - * @param array $options - * @return mixed false on error, or an instance of either xmlrpcval, xmlrpcmsg or xmlrpcresp - */ - function php_xmlrpc_decode_xml($xml_val, $options=array()) - { - $GLOBALS['_xh'] = array(); - $GLOBALS['_xh']['ac'] = ''; - $GLOBALS['_xh']['stack'] = array(); - $GLOBALS['_xh']['valuestack'] = array(); - $GLOBALS['_xh']['params'] = array(); - $GLOBALS['_xh']['pt'] = array(); - $GLOBALS['_xh']['isf'] = 0; - $GLOBALS['_xh']['isf_reason'] = ''; - $GLOBALS['_xh']['method'] = false; - $GLOBALS['_xh']['rt'] = ''; - /// @todo 'guestimate' encoding - $parser = xml_parser_create(); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); - // What if internal encoding is not in one of the 3 allowed? - // we use the broadest one, ie. utf8! - if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) - { - xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); - } - else - { - xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']); - } - xml_set_element_handler($parser, 'xmlrpc_se_any', 'xmlrpc_ee'); - xml_set_character_data_handler($parser, 'xmlrpc_cd'); - xml_set_default_handler($parser, 'xmlrpc_dh'); - if(!xml_parse($parser, $xml_val, 1)) - { - $errstr = sprintf('XML error: %s at line %d, column %d', - xml_error_string(xml_get_error_code($parser)), - xml_get_current_line_number($parser), xml_get_current_column_number($parser)); - error_log($errstr); - xml_parser_free($parser); - return false; - } - xml_parser_free($parser); - if ($GLOBALS['_xh']['isf'] > 1) // test that $GLOBALS['_xh']['value'] is an obj, too??? - { - error_log($GLOBALS['_xh']['isf_reason']); - return false; - } - switch ($GLOBALS['_xh']['rt']) - { - case 'methodresponse': - $v =& $GLOBALS['_xh']['value']; - if ($GLOBALS['_xh']['isf'] == 1) - { - $vc = $v->structmem('faultCode'); - $vs = $v->structmem('faultString'); - $r = new xmlrpcresp(0, $vc->scalarval(), $vs->scalarval()); - } - else - { - $r = new xmlrpcresp($v); - } - return $r; - case 'methodcall': - $m = new xmlrpcmsg($GLOBALS['_xh']['method']); - for($i=0; $i < count($GLOBALS['_xh']['params']); $i++) - { - $m->addParam($GLOBALS['_xh']['params'][$i]); - } - return $m; - case 'value': - return $GLOBALS['_xh']['value']; - default: - return false; - } - } - - /** - * decode a string that is encoded w/ "chunked" transfer encoding - * as defined in rfc2068 par. 19.4.6 - * code shamelessly stolen from nusoap library by Dietrich Ayala - * - * @param string $buffer the string to be decoded - * @return string - */ - function decode_chunked($buffer) - { - // length := 0 - $length = 0; - $new = ''; - - // read chunk-size, chunk-extension (if any) and crlf - // get the position of the linebreak - $chunkend = strpos($buffer,"\r\n") + 2; - $temp = substr($buffer,0,$chunkend); - $chunk_size = hexdec( trim($temp) ); - $chunkstart = $chunkend; - while($chunk_size > 0) - { - $chunkend = strpos($buffer, "\r\n", $chunkstart + $chunk_size); - - // just in case we got a broken connection - if($chunkend == false) - { - $chunk = substr($buffer,$chunkstart); - // append chunk-data to entity-body - $new .= $chunk; - $length += strlen($chunk); - break; - } - - // read chunk-data and crlf - $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart); - // append chunk-data to entity-body - $new .= $chunk; - // length := length + chunk-size - $length += strlen($chunk); - // read chunk-size and crlf - $chunkstart = $chunkend + 2; - - $chunkend = strpos($buffer,"\r\n",$chunkstart)+2; - if($chunkend == false) - { - break; //just in case we got a broken connection - } - $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart); - $chunk_size = hexdec( trim($temp) ); - $chunkstart = $chunkend; - } - return $new; - } - - /** - * xml charset encoding guessing helper function. - * Tries to determine the charset encoding of an XML chunk received over HTTP. - * NB: according to the spec (RFC 3023), if text/xml content-type is received over HTTP without a content-type, - * we SHOULD assume it is strictly US-ASCII. But we try to be more tolerant of unconforming (legacy?) clients/servers, - * which will be most probably using UTF-8 anyway... - * - * @param string $httpheaders the http Content-type header - * @param string $xmlchunk xml content buffer - * @param string $encoding_prefs comma separated list of character encodings to be used as default (when mb extension is enabled) - * - * @todo explore usage of mb_http_input(): does it detect http headers + post data? if so, use it instead of hand-detection!!! - */ - function guess_encoding($httpheader='', $xmlchunk='', $encoding_prefs=null) - { - // discussion: see http://www.yale.edu/pclt/encoding/ - // 1 - test if encoding is specified in HTTP HEADERS - - //Details: - // LWS: (\13\10)?( |\t)+ - // token: (any char but excluded stuff)+ - // quoted string: " (any char but double quotes and cointrol chars)* " - // header: Content-type = ...; charset=value(; ...)* - // where value is of type token, no LWS allowed between 'charset' and value - // Note: we do not check for invalid chars in VALUE: - // this had better be done using pure ereg as below - // Note 2: we might be removing whitespace/tabs that ought to be left in if - // the received charset is a quoted string. But nobody uses such charset names... - - /// @todo this test will pass if ANY header has charset specification, not only Content-Type. Fix it? - $matches = array(); - if(preg_match('/;\s*charset\s*=([^;]+)/i', $httpheader, $matches)) - { - return strtoupper(trim($matches[1], " \t\"")); - } - - // 2 - scan the first bytes of the data for a UTF-16 (or other) BOM pattern - // (source: http://www.w3.org/TR/2000/REC-xml-20001006) - // NOTE: actually, according to the spec, even if we find the BOM and determine - // an encoding, we should check if there is an encoding specified - // in the xml declaration, and verify if they match. - /// @todo implement check as described above? - /// @todo implement check for first bytes of string even without a BOM? (It sure looks harder than for cases WITH a BOM) - if(preg_match('/^(\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\x00\x00\xFF\xFE|\xFE\xFF\x00\x00)/', $xmlchunk)) - { - return 'UCS-4'; - } - elseif(preg_match('/^(\xFE\xFF|\xFF\xFE)/', $xmlchunk)) - { - return 'UTF-16'; - } - elseif(preg_match('/^(\xEF\xBB\xBF)/', $xmlchunk)) - { - return 'UTF-8'; - } - - // 3 - test if encoding is specified in the xml declaration - // Details: - // SPACE: (#x20 | #x9 | #xD | #xA)+ === [ \x9\xD\xA]+ - // EQ: SPACE?=SPACE? === [ \x9\xD\xA]*=[ \x9\xD\xA]* - if (preg_match('/^<\?xml\s+version\s*=\s*'. "((?:\"[a-zA-Z0-9_.:-]+\")|(?:'[a-zA-Z0-9_.:-]+'))". - '\s+encoding\s*=\s*' . "((?:\"[A-Za-z][A-Za-z0-9._-]*\")|(?:'[A-Za-z][A-Za-z0-9._-]*'))/", - $xmlchunk, $matches)) - { - return strtoupper(substr($matches[2], 1, -1)); - } - - // 4 - if mbstring is available, let it do the guesswork - // NB: we favour finding an encoding that is compatible with what we can process - if(extension_loaded('mbstring')) - { - if($encoding_prefs) - { - $enc = mb_detect_encoding($xmlchunk, $encoding_prefs); - } - else - { - $enc = mb_detect_encoding($xmlchunk); - } - // NB: mb_detect likes to call it ascii, xml parser likes to call it US_ASCII... - // IANA also likes better US-ASCII, so go with it - if($enc == 'ASCII') - { - $enc = 'US-'.$enc; - } - return $enc; - } - else - { - // no encoding specified: as per HTTP1.1 assume it is iso-8859-1? - // Both RFC 2616 (HTTP 1.1) and 1945 (HTTP 1.0) clearly state that for text/xxx content types - // this should be the standard. And we should be getting text/xml as request and response. - // BUT we have to be backward compatible with the lib, which always used UTF-8 as default... - return $GLOBALS['xmlrpc_defencoding']; - } - } - - /** - * Checks if a given charset encoding is present in a list of encodings or - * if it is a valid subset of any encoding in the list - * @param string $encoding charset to be tested - * @param mixed $validlist comma separated list of valid charsets (or array of charsets) - */ - function is_valid_charset($encoding, $validlist) - { - $charset_supersets = array( - 'US-ASCII' => array ('ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', - 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', - 'ISO-8859-9', 'ISO-8859-10', 'ISO-8859-11', 'ISO-8859-12', - 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'UTF-8', - 'EUC-JP', 'EUC-', 'EUC-KR', 'EUC-CN') - ); - if (is_string($validlist)) - $validlist = explode(',', $validlist); - if (@in_array(strtoupper($encoding), $validlist)) - return true; - else - { - if (array_key_exists($encoding, $charset_supersets)) - foreach ($validlist as $allowed) - if (in_array($allowed, $charset_supersets[$encoding])) - return true; - return false; - } - } - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpc_wrappers.inc b/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpc_wrappers.inc deleted file mode 100644 index 1a663f0e..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpc_wrappers.inc +++ /dev/null @@ -1,955 +0,0 @@ -' . $funcname[1]; - } - $exists = method_exists($funcname[0], $funcname[1]); - if (!$exists && version_compare(phpversion(), '5.1') < 0) - { - // workaround for php 5.0: static class methods are not seen by method_exists - $exists = is_callable( $funcname ); - } - } - else - { - $plainfuncname = $funcname; - $exists = function_exists($funcname); - } - - if(!$exists) - { - error_log('XML-RPC: function to be wrapped is not defined: '.$plainfuncname); - return false; - } - else - { - // determine name of new php function - if($newfuncname == '') - { - if(is_array($funcname)) - { - if(is_string($funcname[0])) - $xmlrpcfuncname = "{$prefix}_".implode('_', $funcname); - else - $xmlrpcfuncname = "{$prefix}_".get_class($funcname[0]) . '_' . $funcname[1]; - } - else - { - $xmlrpcfuncname = "{$prefix}_$funcname"; - } - } - else - { - $xmlrpcfuncname = $newfuncname; - } - while($buildit && function_exists($xmlrpcfuncname)) - { - $xmlrpcfuncname .= 'x'; - } - - // start to introspect PHP code - if(is_array($funcname)) - { - $func = new ReflectionMethod($funcname[0], $funcname[1]); - if($func->isPrivate()) - { - error_log('XML-RPC: method to be wrapped is private: '.$plainfuncname); - return false; - } - if($func->isProtected()) - { - error_log('XML-RPC: method to be wrapped is protected: '.$plainfuncname); - return false; - } - if($func->isConstructor()) - { - error_log('XML-RPC: method to be wrapped is the constructor: '.$plainfuncname); - return false; - } - // php 503 always says isdestructor = true... - if( version_compare(phpversion(), '5.0.3') != 0 && $func->isDestructor()) - { - error_log('XML-RPC: method to be wrapped is the destructor: '.$plainfuncname); - return false; - } - if($func->isAbstract()) - { - error_log('XML-RPC: method to be wrapped is abstract: '.$plainfuncname); - return false; - } - /// @todo add more checks for static vs. nonstatic? - } - else - { - $func = new ReflectionFunction($funcname); - } - if($func->isInternal()) - { - // Note: from PHP 5.1.0 onward, we will possibly be able to use invokeargs - // instead of getparameters to fully reflect internal php functions ? - error_log('XML-RPC: function to be wrapped is internal: '.$plainfuncname); - return false; - } - - // retrieve parameter names, types and description from javadoc comments - - // function description - $desc = ''; - // type of return val: by default 'any' - $returns = $GLOBALS['xmlrpcValue']; - // desc of return val - $returnsDocs = ''; - // type + name of function parameters - $paramDocs = array(); - - $docs = $func->getDocComment(); - if($docs != '') - { - $docs = explode("\n", $docs); - $i = 0; - foreach($docs as $doc) - { - $doc = trim($doc, " \r\t/*"); - if(strlen($doc) && strpos($doc, '@') !== 0 && !$i) - { - if($desc) - { - $desc .= "\n"; - } - $desc .= $doc; - } - elseif(strpos($doc, '@param') === 0) - { - // syntax: @param type [$name] desc - if(preg_match('/@param\s+(\S+)(\s+\$\S+)?\s+(.+)/', $doc, $matches)) - { - if(strpos($matches[1], '|')) - { - //$paramDocs[$i]['type'] = explode('|', $matches[1]); - $paramDocs[$i]['type'] = 'mixed'; - } - else - { - $paramDocs[$i]['type'] = $matches[1]; - } - $paramDocs[$i]['name'] = trim($matches[2]); - $paramDocs[$i]['doc'] = $matches[3]; - } - $i++; - } - elseif(strpos($doc, '@return') === 0) - { - // syntax: @return type desc - //$returns = preg_split('/\s+/', $doc); - if(preg_match('/@return\s+(\S+)\s+(.+)/', $doc, $matches)) - { - $returns = php_2_xmlrpc_type($matches[1]); - if(isset($matches[2])) - { - $returnsDocs = $matches[2]; - } - } - } - } - } - - // execute introspection of actual function prototype - $params = array(); - $i = 0; - foreach($func->getParameters() as $paramobj) - { - $params[$i] = array(); - $params[$i]['name'] = '$'.$paramobj->getName(); - $params[$i]['isoptional'] = $paramobj->isOptional(); - $i++; - } - - - // start building of PHP code to be eval'd - $innercode = ''; - $i = 0; - $parsvariations = array(); - $pars = array(); - $pnum = count($params); - foreach($params as $param) - { - if (isset($paramDocs[$i]['name']) && $paramDocs[$i]['name'] && strtolower($paramDocs[$i]['name']) != strtolower($param['name'])) - { - // param name from phpdoc info does not match param definition! - $paramDocs[$i]['type'] = 'mixed'; - } - - if($param['isoptional']) - { - // this particular parameter is optional. save as valid previous list of parameters - $innercode .= "if (\$paramcount > $i) {\n"; - $parsvariations[] = $pars; - } - $innercode .= "\$p$i = \$msg->getParam($i);\n"; - if ($decode_php_objects) - { - $innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i, array('decode_php_objs'));\n"; - } - else - { - $innercode .= "if (\$p{$i}->kindOf() == 'scalar') \$p$i = \$p{$i}->scalarval(); else \$p$i = php_{$prefix}_decode(\$p$i);\n"; - } - - $pars[] = "\$p$i"; - $i++; - if($param['isoptional']) - { - $innercode .= "}\n"; - } - if($i == $pnum) - { - // last allowed parameters combination - $parsvariations[] = $pars; - } - } - - $sigs = array(); - $psigs = array(); - if(count($parsvariations) == 0) - { - // only known good synopsis = no parameters - $parsvariations[] = array(); - $minpars = 0; - } - else - { - $minpars = count($parsvariations[0]); - } - - if($minpars) - { - // add to code the check for min params number - // NB: this check needs to be done BEFORE decoding param values - $innercode = "\$paramcount = \$msg->getNumParams();\n" . - "if (\$paramcount < $minpars) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}');\n" . $innercode; - } - else - { - $innercode = "\$paramcount = \$msg->getNumParams();\n" . $innercode; - } - - $innercode .= "\$np = false;\n"; - // since there are no closures in php, if we are given an object instance, - // we store a pointer to it in a global var... - if ( is_array($funcname) && is_object($funcname[0]) ) - { - $GLOBALS['xmlrpcWPFObjHolder'][$xmlrpcfuncname] =& $funcname[0]; - $innercode .= "\$obj =& \$GLOBALS['xmlrpcWPFObjHolder']['$xmlrpcfuncname'];\n"; - $realfuncname = '$obj->'.$funcname[1]; - } - else - { - $realfuncname = $plainfuncname; - } - foreach($parsvariations as $pars) - { - $innercode .= "if (\$paramcount == " . count($pars) . ") \$retval = {$catch_warnings}$realfuncname(" . implode(',', $pars) . "); else\n"; - // build a 'generic' signature (only use an appropriate return type) - $sig = array($returns); - $psig = array($returnsDocs); - for($i=0; $i < count($pars); $i++) - { - if (isset($paramDocs[$i]['type'])) - { - $sig[] = php_2_xmlrpc_type($paramDocs[$i]['type']); - } - else - { - $sig[] = $GLOBALS['xmlrpcValue']; - } - $psig[] = isset($paramDocs[$i]['doc']) ? $paramDocs[$i]['doc'] : ''; - } - $sigs[] = $sig; - $psigs[] = $psig; - } - $innercode .= "\$np = true;\n"; - $innercode .= "if (\$np) return new {$prefix}resp(0, {$GLOBALS['xmlrpcerr']['incorrect_params']}, '{$GLOBALS['xmlrpcstr']['incorrect_params']}'); else {\n"; - //$innercode .= "if (\$_xmlrpcs_error_occurred) return new xmlrpcresp(0, $GLOBALS['xmlrpcerr']user, \$_xmlrpcs_error_occurred); else\n"; - $innercode .= "if (is_a(\$retval, '{$prefix}resp')) return \$retval; else\n"; - if($returns == $GLOBALS['xmlrpcDateTime'] || $returns == $GLOBALS['xmlrpcBase64']) - { - $innercode .= "return new {$prefix}resp(new {$prefix}val(\$retval, '$returns'));"; - } - else - { - if ($encode_php_objects) - $innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval, array('encode_php_objs')));\n"; - else - $innercode .= "return new {$prefix}resp(php_{$prefix}_encode(\$retval));\n"; - } - // shall we exclude functions returning by ref? - // if($func->returnsReference()) - // return false; - $code = "function $xmlrpcfuncname(\$msg) {\n" . $innercode . "}\n}"; - //print_r($code); - if ($buildit) - { - $allOK = 0; - eval($code.'$allOK=1;'); - // alternative - //$xmlrpcfuncname = create_function('$m', $innercode); - - if(!$allOK) - { - error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap php function '.$plainfuncname); - return false; - } - } - - /// @todo examine if $paramDocs matches $parsvariations and build array for - /// usage as method signature, plus put together a nice string for docs - - $ret = array('function' => $xmlrpcfuncname, 'signature' => $sigs, 'docstring' => $desc, 'signature_docs' => $psigs, 'source' => $code); - return $ret; - } - } - - /** - * Given a user-defined PHP class or php object, map its methods onto a list of - * PHP 'wrapper' functions that can be exposed as xmlrpc methods from an xmlrpc_server - * object and called from remote clients (as well as their corresponding signature info). - * - * @param mixed $classname the name of the class whose methods are to be exposed as xmlrpc methods, or an object instance of that class - * @param array $extra_options see the docs for wrap_php_method for more options - * string method_type 'static', 'nonstatic', 'all' and 'auto' (default); the latter will switch between static and non-static depending on wheter $classname is a class name or object instance - * @return array or false on failure - * - * @todo get_class_methods will return both static and non-static methods. - * we have to differentiate the action, depending on wheter we recived a class name or object - */ - function wrap_php_class($classname, $extra_options=array()) - { - $methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : ''; - $methodtype = isset($extra_options['method_type']) ? $extra_options['method_type'] : 'auto'; - - if(version_compare(phpversion(), '5.0.3') == -1) - { - // up to php 5.0.3 some useful reflection methods were missing - error_log('XML-RPC: cannot not wrap php functions unless running php version bigger than 5.0.3'); - return false; - } - - $result = array(); - $mlist = get_class_methods($classname); - foreach($mlist as $mname) - { - if ($methodfilter == '' || preg_match($methodfilter, $mname)) - { - // echo $mlist."\n"; - $func = new ReflectionMethod($classname, $mname); - if(!$func->isPrivate() && !$func->isProtected() && !$func->isConstructor() && !$func->isDestructor() && !$func->isAbstract()) - { - if(($func->isStatic && ($methodtype == 'all' || $methodtype == 'static' || ($methodtype == 'auto' && is_string($classname)))) || - (!$func->isStatic && ($methodtype == 'all' || $methodtype == 'nonstatic' || ($methodtype == 'auto' && is_object($classname))))) - { - $methodwrap = wrap_php_function(array($classname, $mname), '', $extra_options); - if ( $methodwrap ) - { - $result[$methodwrap['function']] = $methodwrap['function']; - } - } - } - } - } - return $result; - } - - /** - * Given an xmlrpc client and a method name, register a php wrapper function - * that will call it and return results using native php types for both - * params and results. The generated php function will return an xmlrpcresp - * oject for failed xmlrpc calls - * - * Known limitations: - * - server must support system.methodsignature for the wanted xmlrpc method - * - for methods that expose many signatures, only one can be picked (we - * could in priciple check if signatures differ only by number of params - * and not by type, but it would be more complication than we can spare time) - * - nested xmlrpc params: the caller of the generated php function has to - * encode on its own the params passed to the php function if these are structs - * or arrays whose (sub)members include values of type datetime or base64 - * - * Notes: the connection properties of the given client will be copied - * and reused for the connection used during the call to the generated - * php function. - * Calling the generated php function 'might' be slow: a new xmlrpc client - * is created on every invocation and an xmlrpc-connection opened+closed. - * An extra 'debug' param is appended to param list of xmlrpc method, useful - * for debugging purposes. - * - * @param xmlrpc_client $client an xmlrpc client set up correctly to communicate with target server - * @param string $methodname the xmlrpc method to be mapped to a php function - * @param array $extra_options array of options that specify conversion details. valid ptions include - * integer signum the index of the method signature to use in mapping (if method exposes many sigs) - * integer timeout timeout (in secs) to be used when executing function/calling remote method - * string protocol 'http' (default), 'http11' or 'https' - * string new_function_name the name of php function to create. If unsepcified, lib will pick an appropriate name - * string return_source if true return php code w. function definition instead fo function name - * bool encode_php_objs let php objects be sent to server using the 'improved' xmlrpc notation, so server can deserialize them as php objects - * bool decode_php_objs --- WARNING !!! possible security hazard. only use it with trusted servers --- - * mixed return_on_fault a php value to be returned when the xmlrpc call fails/returns a fault response (by default the xmlrpcresp object is returned in this case). If a string is used, '%faultCode%' and '%faultString%' tokens will be substituted with actual error values - * bool debug set it to 1 or 2 to see debug results of querying server for method synopsis - * @return string the name of the generated php function (or false) - OR AN ARRAY... - */ - function wrap_xmlrpc_method($client, $methodname, $extra_options=0, $timeout=0, $protocol='', $newfuncname='') - { - // mind numbing: let caller use sane calling convention (as per javadoc, 3 params), - // OR the 2.0 calling convention (no options) - we really love backward compat, don't we? - if (!is_array($extra_options)) - { - $signum = $extra_options; - $extra_options = array(); - } - else - { - $signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0; - $timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0; - $protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : ''; - $newfuncname = isset($extra_options['new_function_name']) ? $extra_options['new_function_name'] : ''; - } - //$encode_php_objects = in_array('encode_php_objects', $extra_options); - //$verbatim_client_copy = in_array('simple_client_copy', $extra_options) ? 1 : - // in_array('build_class_code', $extra_options) ? 2 : 0; - - $encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false; - $decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false; - $simple_client_copy = isset($extra_options['simple_client_copy']) ? (int)($extra_options['simple_client_copy']) : 0; - $buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true; - $prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc'; - if (isset($extra_options['return_on_fault'])) - { - $decode_fault = true; - $fault_response = $extra_options['return_on_fault']; - } - else - { - $decode_fault = false; - $fault_response = ''; - } - $debug = isset($extra_options['debug']) ? ($extra_options['debug']) : 0; - - $msgclass = $prefix.'msg'; - $valclass = $prefix.'val'; - $decodefunc = 'php_'.$prefix.'_decode'; - - $msg = new $msgclass('system.methodSignature'); - $msg->addparam(new $valclass($methodname)); - $client->setDebug($debug); - $response =& $client->send($msg, $timeout, $protocol); - if($response->faultCode()) - { - error_log('XML-RPC: could not retrieve method signature from remote server for method '.$methodname); - return false; - } - else - { - $msig = $response->value(); - if ($client->return_type != 'phpvals') - { - $msig = $decodefunc($msig); - } - if(!is_array($msig) || count($msig) <= $signum) - { - error_log('XML-RPC: could not retrieve method signature nr.'.$signum.' from remote server for method '.$methodname); - return false; - } - else - { - // pick a suitable name for the new function, avoiding collisions - if($newfuncname != '') - { - $xmlrpcfuncname = $newfuncname; - } - else - { - // take care to insure that methodname is translated to valid - // php function name - $xmlrpcfuncname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'), - array('_', ''), $methodname); - } - while($buildit && function_exists($xmlrpcfuncname)) - { - $xmlrpcfuncname .= 'x'; - } - - $msig = $msig[$signum]; - $mdesc = ''; - // if in 'offline' mode, get method description too. - // in online mode, favour speed of operation - if(!$buildit) - { - $msg = new $msgclass('system.methodHelp'); - $msg->addparam(new $valclass($methodname)); - $response =& $client->send($msg, $timeout, $protocol); - if (!$response->faultCode()) - { - $mdesc = $response->value(); - if ($client->return_type != 'phpvals') - { - $mdesc = $mdesc->scalarval(); - } - } - } - - $results = build_remote_method_wrapper_code($client, $methodname, - $xmlrpcfuncname, $msig, $mdesc, $timeout, $protocol, $simple_client_copy, - $prefix, $decode_php_objects, $encode_php_objects, $decode_fault, - $fault_response); - - //print_r($code); - if ($buildit) - { - $allOK = 0; - eval($results['source'].'$allOK=1;'); - // alternative - //$xmlrpcfuncname = create_function('$m', $innercode); - if($allOK) - { - return $xmlrpcfuncname; - } - else - { - error_log('XML-RPC: could not create function '.$xmlrpcfuncname.' to wrap remote method '.$methodname); - return false; - } - } - else - { - $results['function'] = $xmlrpcfuncname; - return $results; - } - } - } - } - - /** - * Similar to wrap_xmlrpc_method, but will generate a php class that wraps - * all xmlrpc methods exposed by the remote server as own methods. - * For more details see wrap_xmlrpc_method. - * @param xmlrpc_client $client the client obj all set to query the desired server - * @param array $extra_options list of options for wrapped code - * @return mixed false on error, the name of the created class if all ok or an array with code, class name and comments (if the appropriatevoption is set in extra_options) - */ - function wrap_xmlrpc_server($client, $extra_options=array()) - { - $methodfilter = isset($extra_options['method_filter']) ? $extra_options['method_filter'] : ''; - //$signum = isset($extra_options['signum']) ? (int)$extra_options['signum'] : 0; - $timeout = isset($extra_options['timeout']) ? (int)$extra_options['timeout'] : 0; - $protocol = isset($extra_options['protocol']) ? $extra_options['protocol'] : ''; - $newclassname = isset($extra_options['new_class_name']) ? $extra_options['new_class_name'] : ''; - $encode_php_objects = isset($extra_options['encode_php_objs']) ? (bool)$extra_options['encode_php_objs'] : false; - $decode_php_objects = isset($extra_options['decode_php_objs']) ? (bool)$extra_options['decode_php_objs'] : false; - $verbatim_client_copy = isset($extra_options['simple_client_copy']) ? !($extra_options['simple_client_copy']) : true; - $buildit = isset($extra_options['return_source']) ? !($extra_options['return_source']) : true; - $prefix = isset($extra_options['prefix']) ? $extra_options['prefix'] : 'xmlrpc'; - - $msgclass = $prefix.'msg'; - //$valclass = $prefix.'val'; - $decodefunc = 'php_'.$prefix.'_decode'; - - $msg = new $msgclass('system.listMethods'); - $response =& $client->send($msg, $timeout, $protocol); - if($response->faultCode()) - { - error_log('XML-RPC: could not retrieve method list from remote server'); - return false; - } - else - { - $mlist = $response->value(); - if ($client->return_type != 'phpvals') - { - $mlist = $decodefunc($mlist); - } - if(!is_array($mlist) || !count($mlist)) - { - error_log('XML-RPC: could not retrieve meaningful method list from remote server'); - return false; - } - else - { - // pick a suitable name for the new function, avoiding collisions - if($newclassname != '') - { - $xmlrpcclassname = $newclassname; - } - else - { - $xmlrpcclassname = $prefix.'_'.preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'), - array('_', ''), $client->server).'_client'; - } - while($buildit && class_exists($xmlrpcclassname)) - { - $xmlrpcclassname .= 'x'; - } - - /// @todo add function setdebug() to new class, to enable/disable debugging - $source = "class $xmlrpcclassname\n{\nvar \$client;\n\n"; - $source .= "function $xmlrpcclassname()\n{\n"; - $source .= build_client_wrapper_code($client, $verbatim_client_copy, $prefix); - $source .= "\$this->client =& \$client;\n}\n\n"; - $opts = array('simple_client_copy' => 2, 'return_source' => true, - 'timeout' => $timeout, 'protocol' => $protocol, - 'encode_php_objs' => $encode_php_objects, 'prefix' => $prefix, - 'decode_php_objs' => $decode_php_objects - ); - /// @todo build javadoc for class definition, too - foreach($mlist as $mname) - { - if ($methodfilter == '' || preg_match($methodfilter, $mname)) - { - $opts['new_function_name'] = preg_replace(array('/\./', '/[^a-zA-Z0-9_\x7f-\xff]/'), - array('_', ''), $mname); - $methodwrap = wrap_xmlrpc_method($client, $mname, $opts); - if ($methodwrap) - { - if (!$buildit) - { - $source .= $methodwrap['docstring']; - } - $source .= $methodwrap['source']."\n"; - } - else - { - error_log('XML-RPC: will not create class method to wrap remote method '.$mname); - } - } - } - $source .= "}\n"; - if ($buildit) - { - $allOK = 0; - eval($source.'$allOK=1;'); - // alternative - //$xmlrpcfuncname = create_function('$m', $innercode); - if($allOK) - { - return $xmlrpcclassname; - } - else - { - error_log('XML-RPC: could not create class '.$xmlrpcclassname.' to wrap remote server '.$client->server); - return false; - } - } - else - { - return array('class' => $xmlrpcclassname, 'code' => $source, 'docstring' => ''); - } - } - } - } - - /** - * Given the necessary info, build php code that creates a new function to - * invoke a remote xmlrpc method. - * Take care that no full checking of input parameters is done to ensure that - * valid php code is emitted. - * Note: real spaghetti code follows... - * @access private - */ - function build_remote_method_wrapper_code($client, $methodname, $xmlrpcfuncname, - $msig, $mdesc='', $timeout=0, $protocol='', $client_copy_mode=0, $prefix='xmlrpc', - $decode_php_objects=false, $encode_php_objects=false, $decode_fault=false, - $fault_response='') - { - $code = "function $xmlrpcfuncname ("; - if ($client_copy_mode < 2) - { - // client copy mode 0 or 1 == partial / full client copy in emitted code - $innercode = build_client_wrapper_code($client, $client_copy_mode, $prefix); - $innercode .= "\$client->setDebug(\$debug);\n"; - $this_ = ''; - } - else - { - // client copy mode 2 == no client copy in emitted code - $innercode = ''; - $this_ = 'this->'; - } - $innercode .= "\$msg = new {$prefix}msg('$methodname');\n"; - - if ($mdesc != '') - { - // take care that PHP comment is not terminated unwillingly by method description - $mdesc = "/**\n* ".str_replace('*/', '* /', $mdesc)."\n"; - } - else - { - $mdesc = "/**\nFunction $xmlrpcfuncname\n"; - } - - // param parsing - $plist = array(); - $pcount = count($msig); - for($i = 1; $i < $pcount; $i++) - { - $plist[] = "\$p$i"; - $ptype = $msig[$i]; - if($ptype == 'i4' || $ptype == 'int' || $ptype == 'boolean' || $ptype == 'double' || - $ptype == 'string' || $ptype == 'dateTime.iso8601' || $ptype == 'base64' || $ptype == 'null') - { - // only build directly xmlrpcvals when type is known and scalar - $innercode .= "\$p$i = new {$prefix}val(\$p$i, '$ptype');\n"; - } - else - { - if ($encode_php_objects) - { - $innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i, array('encode_php_objs'));\n"; - } - else - { - $innercode .= "\$p$i =& php_{$prefix}_encode(\$p$i);\n"; - } - } - $innercode .= "\$msg->addparam(\$p$i);\n"; - $mdesc .= '* @param '.xmlrpc_2_php_type($ptype)." \$p$i\n"; - } - if ($client_copy_mode < 2) - { - $plist[] = '$debug=0'; - $mdesc .= "* @param int \$debug when 1 (or 2) will enable debugging of the underlying {$prefix} call (defaults to 0)\n"; - } - $plist = implode(', ', $plist); - $mdesc .= '* @return '.xmlrpc_2_php_type($msig[0])." (or an {$prefix}resp obj instance if call fails)\n*/\n"; - - $innercode .= "\$res =& \${$this_}client->send(\$msg, $timeout, '$protocol');\n"; - if ($decode_fault) - { - if (is_string($fault_response) && ((strpos($fault_response, '%faultCode%') !== false) || (strpos($fault_response, '%faultString%') !== false))) - { - $respcode = "str_replace(array('%faultCode%', '%faultString%'), array(\$res->faultCode(), \$res->faultString()), '".str_replace("'", "''", $fault_response)."')"; - } - else - { - $respcode = var_export($fault_response, true); - } - } - else - { - $respcode = '$res'; - } - if ($decode_php_objects) - { - $innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value(), array('decode_php_objs'));"; - } - else - { - $innercode .= "if (\$res->faultcode()) return $respcode; else return php_{$prefix}_decode(\$res->value());"; - } - - $code = $code . $plist. ") {\n" . $innercode . "\n}\n"; - - return array('source' => $code, 'docstring' => $mdesc); - } - - /** - * Given necessary info, generate php code that will rebuild a client object - * Take care that no full checking of input parameters is done to ensure that - * valid php code is emitted. - * @access private - */ - function build_client_wrapper_code($client, $verbatim_client_copy, $prefix='xmlrpc') - { - $code = "\$client = new {$prefix}_client('".str_replace("'", "\'", $client->path). - "', '" . str_replace("'", "\'", $client->server) . "', $client->port);\n"; - - // copy all client fields to the client that will be generated runtime - // (this provides for future expansion or subclassing of client obj) - if ($verbatim_client_copy) - { - foreach($client as $fld => $val) - { - if($fld != 'debug' && $fld != 'return_type') - { - $val = var_export($val, true); - $code .= "\$client->$fld = $val;\n"; - } - } - } - // only make sure that client always returns the correct data type - $code .= "\$client->return_type = '{$prefix}vals';\n"; - //$code .= "\$client->setDebug(\$debug);\n"; - return $code; - } -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpcs.inc b/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpcs.inc deleted file mode 100644 index 441dc3dd..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/lib/xmlrpcs.inc +++ /dev/null @@ -1,1246 +0,0 @@ - -// $Id: xmlrpcs.inc,v 1.71 2008/10/29 23:41:28 ggiunta Exp $ - -// Copyright (c) 1999,2000,2002 Edd Dumbill. -// 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 "XML-RPC for PHP" 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 -// REGENTS 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. - - // XML RPC Server class - // requires: xmlrpc.inc - - $GLOBALS['xmlrpcs_capabilities'] = array( - // xmlrpc spec: always supported - 'xmlrpc' => new xmlrpcval(array( - 'specUrl' => new xmlrpcval('http://www.xmlrpc.com/spec', 'string'), - 'specVersion' => new xmlrpcval(1, 'int') - ), 'struct'), - // if we support system.xxx functions, we always support multicall, too... - // Note that, as of 2006/09/17, the following URL does not respond anymore - 'system.multicall' => new xmlrpcval(array( - 'specUrl' => new xmlrpcval('http://www.xmlrpc.com/discuss/msgReader$1208', 'string'), - 'specVersion' => new xmlrpcval(1, 'int') - ), 'struct'), - // introspection: version 2! we support 'mixed', too - 'introspection' => new xmlrpcval(array( - 'specUrl' => new xmlrpcval('http://phpxmlrpc.sourceforge.net/doc-2/ch10.html', 'string'), - 'specVersion' => new xmlrpcval(2, 'int') - ), 'struct') - ); - - /* Functions that implement system.XXX methods of xmlrpc servers */ - $_xmlrpcs_getCapabilities_sig=array(array($GLOBALS['xmlrpcStruct'])); - $_xmlrpcs_getCapabilities_doc='This method lists all the capabilites that the XML-RPC server has: the (more or less standard) extensions to the xmlrpc spec that it adheres to'; - $_xmlrpcs_getCapabilities_sdoc=array(array('list of capabilities, described as structs with a version number and url for the spec')); - function _xmlrpcs_getCapabilities($server, $m=null) - { - $outAr = $GLOBALS['xmlrpcs_capabilities']; - // NIL extension - if ($GLOBALS['xmlrpc_null_extension']) { - $outAr['nil'] = new xmlrpcval(array( - 'specUrl' => new xmlrpcval('http://www.ontosys.com/xml-rpc/extensions.php', 'string'), - 'specVersion' => new xmlrpcval(1, 'int') - ), 'struct'); - } - return new xmlrpcresp(new xmlrpcval($outAr, 'struct')); - } - - // listMethods: signature was either a string, or nothing. - // The useless string variant has been removed - $_xmlrpcs_listMethods_sig=array(array($GLOBALS['xmlrpcArray'])); - $_xmlrpcs_listMethods_doc='This method lists all the methods that the XML-RPC server knows how to dispatch'; - $_xmlrpcs_listMethods_sdoc=array(array('list of method names')); - function _xmlrpcs_listMethods($server, $m=null) // if called in plain php values mode, second param is missing - { - - $outAr=array(); - foreach($server->dmap as $key => $val) - { - $outAr[]=new xmlrpcval($key, 'string'); - } - if($server->allow_system_funcs) - { - foreach($GLOBALS['_xmlrpcs_dmap'] as $key => $val) - { - $outAr[]=new xmlrpcval($key, 'string'); - } - } - return new xmlrpcresp(new xmlrpcval($outAr, 'array')); - } - - $_xmlrpcs_methodSignature_sig=array(array($GLOBALS['xmlrpcArray'], $GLOBALS['xmlrpcString'])); - $_xmlrpcs_methodSignature_doc='Returns an array of known signatures (an array of arrays) for the method name passed. If no signatures are known, returns a none-array (test for type != array to detect missing signature)'; - $_xmlrpcs_methodSignature_sdoc=array(array('list of known signatures, each sig being an array of xmlrpc type names', 'name of method to be described')); - function _xmlrpcs_methodSignature($server, $m) - { - // let accept as parameter both an xmlrpcval or string - if (is_object($m)) - { - $methName=$m->getParam(0); - $methName=$methName->scalarval(); - } - else - { - $methName=$m; - } - if(strpos($methName, "system.") === 0) - { - $dmap=$GLOBALS['_xmlrpcs_dmap']; $sysCall=1; - } - else - { - $dmap=$server->dmap; $sysCall=0; - } - if(isset($dmap[$methName])) - { - if(isset($dmap[$methName]['signature'])) - { - $sigs=array(); - foreach($dmap[$methName]['signature'] as $inSig) - { - $cursig=array(); - foreach($inSig as $sig) - { - $cursig[]=new xmlrpcval($sig, 'string'); - } - $sigs[]=new xmlrpcval($cursig, 'array'); - } - $r=new xmlrpcresp(new xmlrpcval($sigs, 'array')); - } - else - { - // NB: according to the official docs, we should be returning a - // "none-array" here, which means not-an-array - $r=new xmlrpcresp(new xmlrpcval('undef', 'string')); - } - } - else - { - $r=new xmlrpcresp(0,$GLOBALS['xmlrpcerr']['introspect_unknown'], $GLOBALS['xmlrpcstr']['introspect_unknown']); - } - return $r; - } - - $_xmlrpcs_methodHelp_sig=array(array($GLOBALS['xmlrpcString'], $GLOBALS['xmlrpcString'])); - $_xmlrpcs_methodHelp_doc='Returns help text if defined for the method passed, otherwise returns an empty string'; - $_xmlrpcs_methodHelp_sdoc=array(array('method description', 'name of the method to be described')); - function _xmlrpcs_methodHelp($server, $m) - { - // let accept as parameter both an xmlrpcval or string - if (is_object($m)) - { - $methName=$m->getParam(0); - $methName=$methName->scalarval(); - } - else - { - $methName=$m; - } - if(strpos($methName, "system.") === 0) - { - $dmap=$GLOBALS['_xmlrpcs_dmap']; $sysCall=1; - } - else - { - $dmap=$server->dmap; $sysCall=0; - } - if(isset($dmap[$methName])) - { - if(isset($dmap[$methName]['docstring'])) - { - $r=new xmlrpcresp(new xmlrpcval($dmap[$methName]['docstring']), 'string'); - } - else - { - $r=new xmlrpcresp(new xmlrpcval('', 'string')); - } - } - else - { - $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['introspect_unknown'], $GLOBALS['xmlrpcstr']['introspect_unknown']); - } - return $r; - } - - $_xmlrpcs_multicall_sig = array(array($GLOBALS['xmlrpcArray'], $GLOBALS['xmlrpcArray'])); - $_xmlrpcs_multicall_doc = 'Boxcar multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details'; - $_xmlrpcs_multicall_sdoc = array(array('list of response structs, where each struct has the usual members', 'list of calls, with each call being represented as a struct, with members "methodname" and "params"')); - function _xmlrpcs_multicall_error($err) - { - if(is_string($err)) - { - $str = $GLOBALS['xmlrpcstr']["multicall_${err}"]; - $code = $GLOBALS['xmlrpcerr']["multicall_${err}"]; - } - else - { - $code = $err->faultCode(); - $str = $err->faultString(); - } - $struct = array(); - $struct['faultCode'] = new xmlrpcval($code, 'int'); - $struct['faultString'] = new xmlrpcval($str, 'string'); - return new xmlrpcval($struct, 'struct'); - } - - function _xmlrpcs_multicall_do_call($server, $call) - { - if($call->kindOf() != 'struct') - { - return _xmlrpcs_multicall_error('notstruct'); - } - $methName = @$call->structmem('methodName'); - if(!$methName) - { - return _xmlrpcs_multicall_error('nomethod'); - } - if($methName->kindOf() != 'scalar' || $methName->scalartyp() != 'string') - { - return _xmlrpcs_multicall_error('notstring'); - } - if($methName->scalarval() == 'system.multicall') - { - return _xmlrpcs_multicall_error('recursion'); - } - - $params = @$call->structmem('params'); - if(!$params) - { - return _xmlrpcs_multicall_error('noparams'); - } - if($params->kindOf() != 'array') - { - return _xmlrpcs_multicall_error('notarray'); - } - $numParams = $params->arraysize(); - - $msg = new xmlrpcmsg($methName->scalarval()); - for($i = 0; $i < $numParams; $i++) - { - if(!$msg->addParam($params->arraymem($i))) - { - $i++; - return _xmlrpcs_multicall_error(new xmlrpcresp(0, - $GLOBALS['xmlrpcerr']['incorrect_params'], - $GLOBALS['xmlrpcstr']['incorrect_params'] . ": probable xml error in param " . $i)); - } - } - - $result = $server->execute($msg); - - if($result->faultCode() != 0) - { - return _xmlrpcs_multicall_error($result); // Method returned fault. - } - - return new xmlrpcval(array($result->value()), 'array'); - } - - function _xmlrpcs_multicall_do_call_phpvals($server, $call) - { - if(!is_array($call)) - { - return _xmlrpcs_multicall_error('notstruct'); - } - if(!array_key_exists('methodName', $call)) - { - return _xmlrpcs_multicall_error('nomethod'); - } - if (!is_string($call['methodName'])) - { - return _xmlrpcs_multicall_error('notstring'); - } - if($call['methodName'] == 'system.multicall') - { - return _xmlrpcs_multicall_error('recursion'); - } - if(!array_key_exists('params', $call)) - { - return _xmlrpcs_multicall_error('noparams'); - } - if(!is_array($call['params'])) - { - return _xmlrpcs_multicall_error('notarray'); - } - - // this is a real dirty and simplistic hack, since we might have received a - // base64 or datetime values, but they will be listed as strings here... - $numParams = count($call['params']); - $pt = array(); - foreach($call['params'] as $val) - $pt[] = php_2_xmlrpc_type(gettype($val)); - - $result = $server->execute($call['methodName'], $call['params'], $pt); - - if($result->faultCode() != 0) - { - return _xmlrpcs_multicall_error($result); // Method returned fault. - } - - return new xmlrpcval(array($result->value()), 'array'); - } - - function _xmlrpcs_multicall($server, $m) - { - $result = array(); - // let accept a plain list of php parameters, beside a single xmlrpc msg object - if (is_object($m)) - { - $calls = $m->getParam(0); - $numCalls = $calls->arraysize(); - for($i = 0; $i < $numCalls; $i++) - { - $call = $calls->arraymem($i); - $result[$i] = _xmlrpcs_multicall_do_call($server, $call); - } - } - else - { - $numCalls=count($m); - for($i = 0; $i < $numCalls; $i++) - { - $result[$i] = _xmlrpcs_multicall_do_call_phpvals($server, $m[$i]); - } - } - - return new xmlrpcresp(new xmlrpcval($result, 'array')); - } - - $GLOBALS['_xmlrpcs_dmap']=array( - 'system.listMethods' => array( - 'function' => '_xmlrpcs_listMethods', - 'signature' => $_xmlrpcs_listMethods_sig, - 'docstring' => $_xmlrpcs_listMethods_doc, - 'signature_docs' => $_xmlrpcs_listMethods_sdoc), - 'system.methodHelp' => array( - 'function' => '_xmlrpcs_methodHelp', - 'signature' => $_xmlrpcs_methodHelp_sig, - 'docstring' => $_xmlrpcs_methodHelp_doc, - 'signature_docs' => $_xmlrpcs_methodHelp_sdoc), - 'system.methodSignature' => array( - 'function' => '_xmlrpcs_methodSignature', - 'signature' => $_xmlrpcs_methodSignature_sig, - 'docstring' => $_xmlrpcs_methodSignature_doc, - 'signature_docs' => $_xmlrpcs_methodSignature_sdoc), - 'system.multicall' => array( - 'function' => '_xmlrpcs_multicall', - 'signature' => $_xmlrpcs_multicall_sig, - 'docstring' => $_xmlrpcs_multicall_doc, - 'signature_docs' => $_xmlrpcs_multicall_sdoc), - 'system.getCapabilities' => array( - 'function' => '_xmlrpcs_getCapabilities', - 'signature' => $_xmlrpcs_getCapabilities_sig, - 'docstring' => $_xmlrpcs_getCapabilities_doc, - 'signature_docs' => $_xmlrpcs_getCapabilities_sdoc) - ); - - $GLOBALS['_xmlrpcs_occurred_errors'] = ''; - $GLOBALS['_xmlrpcs_prev_ehandler'] = ''; - - /** - * Error handler used to track errors that occur during server-side execution of PHP code. - * This allows to report back to the client whether an internal error has occurred or not - * using an xmlrpc response object, instead of letting the client deal with the html junk - * that a PHP execution error on the server generally entails. - * - * NB: in fact a user defined error handler can only handle WARNING, NOTICE and USER_* errors. - * - */ - function _xmlrpcs_errorHandler($errcode, $errstring, $filename=null, $lineno=null, $context=null) - { - // obey the @ protocol - if (error_reporting() == 0) - return; - - //if($errcode != E_NOTICE && $errcode != E_WARNING && $errcode != E_USER_NOTICE && $errcode != E_USER_WARNING) - if($errcode != E_STRICT) - { - $GLOBALS['_xmlrpcs_occurred_errors'] = $GLOBALS['_xmlrpcs_occurred_errors'] . $errstring . "\n"; - } - // Try to avoid as much as possible disruption to the previous error handling - // mechanism in place - if($GLOBALS['_xmlrpcs_prev_ehandler'] == '') - { - // The previous error handler was the default: all we should do is log error - // to the default error log (if level high enough) - if(ini_get('log_errors') && (intval(ini_get('error_reporting')) & $errcode)) - { - error_log($errstring); - } - } - else - { - // Pass control on to previous error handler, trying to avoid loops... - if($GLOBALS['_xmlrpcs_prev_ehandler'] != '_xmlrpcs_errorHandler') - { - // NB: this code will NOT work on php < 4.0.2: only 2 params were used for error handlers - if(is_array($GLOBALS['_xmlrpcs_prev_ehandler'])) - { - // the following works both with static class methods and plain object methods as error handler - call_user_func_array($GLOBALS['_xmlrpcs_prev_ehandler'], array($errcode, $errstring, $filename, $lineno, $context)); - } - else - { - $GLOBALS['_xmlrpcs_prev_ehandler']($errcode, $errstring, $filename, $lineno, $context); - } - } - } - } - - $GLOBALS['_xmlrpc_debuginfo']=''; - - /** - * Add a string to the debug info that can be later seralized by the server - * as part of the response message. - * Note that for best compatbility, the debug string should be encoded using - * the $GLOBALS['xmlrpc_internalencoding'] character set. - * @param string $m - * @access public - */ - function xmlrpc_debugmsg($m) - { - $GLOBALS['_xmlrpc_debuginfo'] .= $m . "\n"; - } - - class xmlrpc_server - { - /** - * Array defining php functions exposed as xmlrpc methods by this server - * @access private - */ - var $dmap=array(); - /** - * Defines how functions in dmap will be invoked: either using an xmlrpc msg object - * or plain php values. - * valid strings are 'xmlrpcvals', 'phpvals' or 'epivals' - */ - var $functions_parameters_type='xmlrpcvals'; - /** - * Option used for fine-tuning the encoding the php values returned from - * functions registered in the dispatch map when the functions_parameters_types - * member is set to 'phpvals' - * @see php_xmlrpc_encode for a list of values - */ - var $phpvals_encoding_options = array( 'auto_dates' ); - /// controls wether the server is going to echo debugging messages back to the client as comments in response body. valid values: 0,1,2,3 - var $debug = 1; - /** - * Controls behaviour of server when invoked user function throws an exception: - * 0 = catch it and return an 'internal error' xmlrpc response (default) - * 1 = catch it and return an xmlrpc response with the error corresponding to the exception - * 2 = allow the exception to float to the upper layers - */ - var $exception_handling = 0; - /** - * When set to true, it will enable HTTP compression of the response, in case - * the client has declared its support for compression in the request. - */ - var $compress_response = false; - /** - * List of http compression methods accepted by the server for requests. - * NB: PHP supports deflate, gzip compressions out of the box if compiled w. zlib - */ - var $accepted_compression = array(); - /// shall we serve calls to system.* methods? - var $allow_system_funcs = true; - /// list of charset encodings natively accepted for requests - var $accepted_charset_encodings = array(); - /** - * charset encoding to be used for response. - * NB: if we can, we will convert the generated response from internal_encoding to the intended one. - * can be: a supported xml encoding (only UTF-8 and ISO-8859-1 at present, unless mbstring is enabled), - * null (leave unspecified in response, convert output stream to US_ASCII), - * 'default' (use xmlrpc library default as specified in xmlrpc.inc, convert output stream if needed), - * or 'auto' (use client-specified charset encoding or same as request if request headers do not specify it (unless request is US-ASCII: then use library default anyway). - * NB: pretty dangerous if you accept every charset and do not have mbstring enabled) - */ - var $response_charset_encoding = ''; - /** - * Storage for internal debug info - * @access private - */ - var $debug_info = ''; - /** - * Extra data passed at runtime to method handling functions. Used only by EPI layer - */ - var $user_data = null; - - /** - * @param array $dispmap the dispatch map withd efinition of exposed services - * @param boolean $servicenow set to false to prevent the server from runnung upon construction - */ - function xmlrpc_server($dispMap=null, $serviceNow=true) - { - // if ZLIB is enabled, let the server by default accept compressed requests, - // and compress responses sent to clients that support them - if(function_exists('gzinflate')) - { - $this->accepted_compression = array('gzip', 'deflate'); - $this->compress_response = true; - } - - // by default the xml parser can support these 3 charset encodings - $this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII'); - - // dispMap is a dispatch array of methods - // mapped to function names and signatures - // if a method - // doesn't appear in the map then an unknown - // method error is generated - /* milosch - changed to make passing dispMap optional. - * instead, you can use the class add_to_map() function - * to add functions manually (borrowed from SOAPX4) - */ - if($dispMap) - { - $this->dmap = $dispMap; - if($serviceNow) - { - $this->service(); - } - } - } - - /** - * Set debug level of server. - * @param integer $in debug lvl: determines info added to xmlrpc responses (as xml comments) - * 0 = no debug info, - * 1 = msgs set from user with debugmsg(), - * 2 = add complete xmlrpc request (headers and body), - * 3 = add also all processing warnings happened during method processing - * (NB: this involves setting a custom error handler, and might interfere - * with the standard processing of the php function exposed as method. In - * particular, triggering an USER_ERROR level error will not halt script - * execution anymore, but just end up logged in the xmlrpc response) - * Note that info added at elevel 2 and 3 will be base64 encoded - * @access public - */ - function setDebug($in) - { - $this->debug=$in; - } - - /** - * Return a string with the serialized representation of all debug info - * @param string $charset_encoding the target charset encoding for the serialization - * @return string an XML comment (or two) - */ - function serializeDebug($charset_encoding='') - { - // Tough encoding problem: which internal charset should we assume for debug info? - // It might contain a copy of raw data received from client, ie with unknown encoding, - // intermixed with php generated data and user generated data... - // so we split it: system debug is base 64 encoded, - // user debug info should be encoded by the end user using the INTERNAL_ENCODING - $out = ''; - if ($this->debug_info != '') - { - $out .= "\n"; - } - if($GLOBALS['_xmlrpc_debuginfo']!='') - { - - $out .= "\n"; - // NB: a better solution MIGHT be to use CDATA, but we need to insert it - // into return payload AFTER the beginning tag - //$out .= "', ']_]_>', $GLOBALS['_xmlrpc_debuginfo']) . "\n]]>\n"; - } - return $out; - } - - /** - * Execute the xmlrpc request, printing the response - * @param string $data the request body. If null, the http POST request will be examined - * @return xmlrpcresp the response object (usually not used by caller...) - * @access public - */ - function service($data=null, $return_payload=false) - { - if ($data === null) - { - // workaround for a known bug in php ver. 5.2.2 that broke $HTTP_RAW_POST_DATA - $ver = phpversion(); - if ($ver[0] >= 5) - { - $data = file_get_contents('php://input'); - } - else - { - $data = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; - } - } - $raw_data = $data; - - // reset internal debug info - $this->debug_info = ''; - - // Echo back what we received, before parsing it - if($this->debug > 1) - { - $this->debugmsg("+++GOT+++\n" . $data . "\n+++END+++"); - } - - $r = $this->parseRequestHeaders($data, $req_charset, $resp_charset, $resp_encoding); - if (!$r) - { - $r=$this->parseRequest($data, $req_charset); - } - - // save full body of request into response, for more debugging usages - $r->raw_data = $raw_data; - - if($this->debug > 2 && $GLOBALS['_xmlrpcs_occurred_errors']) - { - $this->debugmsg("+++PROCESSING ERRORS AND WARNINGS+++\n" . - $GLOBALS['_xmlrpcs_occurred_errors'] . "+++END+++"); - } - - $payload=$this->xml_header($resp_charset); - if($this->debug > 0) - { - $payload = $payload . $this->serializeDebug($resp_charset); - } - - // G. Giunta 2006-01-27: do not create response serialization if it has - // already happened. Helps building json magic - if (empty($r->payload)) - { - $r->serialize($resp_charset); - } - $payload = $payload . $r->payload; - - if ($return_payload) - { - return $payload; - } - - // if we get a warning/error that has output some text before here, then we cannot - // add a new header. We cannot say we are sending xml, either... - if(!headers_sent()) - { - header('Content-Type: '.$r->content_type); - // we do not know if client actually told us an accepted charset, but if he did - // we have to tell him what we did - header("Vary: Accept-Charset"); - - // http compression of output: only - // if we can do it, and we want to do it, and client asked us to, - // and php ini settings do not force it already - $php_no_self_compress = !ini_get('zlib.output_compression') && (ini_get('output_handler') != 'ob_gzhandler'); - if($this->compress_response && function_exists('gzencode') && $resp_encoding != '' - && $php_no_self_compress) - { - if(strpos($resp_encoding, 'gzip') !== false) - { - $payload = gzencode($payload); - header("Content-Encoding: gzip"); - header("Vary: Accept-Encoding"); - } - elseif (strpos($resp_encoding, 'deflate') !== false) - { - $payload = gzcompress($payload); - header("Content-Encoding: deflate"); - header("Vary: Accept-Encoding"); - } - } - - // do not ouput content-length header if php is compressing output for us: - // it will mess up measurements - if($php_no_self_compress) - { - header('Content-Length: ' . (int)strlen($payload)); - } - } - else - { - error_log('XML-RPC: '.__METHOD__.': http headers already sent before response is fully generated. Check for php warning or error messages'); - } - - print $payload; - - // return request, in case subclasses want it - return $r; - } - - /** - * Add a method to the dispatch map - * @param string $methodname the name with which the method will be made available - * @param string $function the php function that will get invoked - * @param array $sig the array of valid method signatures - * @param string $doc method documentation - * @param array $sigdoc the array of valid method signatures docs (one string per param, one for return type) - * @access public - */ - function add_to_map($methodname,$function,$sig=null,$doc=false,$sigdoc=false) - { - $this->dmap[$methodname] = array( - 'function' => $function, - 'docstring' => $doc - ); - if ($sig) - { - $this->dmap[$methodname]['signature'] = $sig; - } - if ($sigdoc) - { - $this->dmap[$methodname]['signature_docs'] = $sigdoc; - } - } - - /** - * Verify type and number of parameters received against a list of known signatures - * @param array $in array of either xmlrpcval objects or xmlrpc type definitions - * @param array $sig array of known signatures to match against - * @access private - */ - function verifySignature($in, $sig) - { - // check each possible signature in turn - if (is_object($in)) - { - $numParams = $in->getNumParams(); - } - else - { - $numParams = count($in); - } - foreach($sig as $cursig) - { - if(count($cursig)==$numParams+1) - { - $itsOK=1; - for($n=0; $n<$numParams; $n++) - { - if (is_object($in)) - { - $p=$in->getParam($n); - if($p->kindOf() == 'scalar') - { - $pt=$p->scalartyp(); - } - else - { - $pt=$p->kindOf(); - } - } - else - { - $pt= $in[$n] == 'i4' ? 'int' : strtolower($in[$n]); // dispatch maps never use i4... - } - - // param index is $n+1, as first member of sig is return type - if($pt != $cursig[$n+1] && $cursig[$n+1] != $GLOBALS['xmlrpcValue']) - { - $itsOK=0; - $pno=$n+1; - $wanted=$cursig[$n+1]; - $got=$pt; - break; - } - } - if($itsOK) - { - return array(1,''); - } - } - } - if(isset($wanted)) - { - return array(0, "Wanted ${wanted}, got ${got} at param ${pno}"); - } - else - { - return array(0, "No method signature matches number of parameters"); - } - } - - /** - * Parse http headers received along with xmlrpc request. If needed, inflate request - * @return null on success or an xmlrpcresp - * @access private - */ - function parseRequestHeaders(&$data, &$req_encoding, &$resp_encoding, &$resp_compression) - { - // check if $_SERVER is populated: it might have been disabled via ini file - // (this is true even when in CLI mode) - if (count($_SERVER) == 0) - { - error_log('XML-RPC: '.__METHOD__.': cannot parse request headers as $_SERVER is not populated'); - } - - if($this->debug > 1) - { - if(function_exists('getallheaders')) - { - $this->debugmsg(''); // empty line - foreach(getallheaders() as $name => $val) - { - $this->debugmsg("HEADER: $name: $val"); - } - } - - } - - if(isset($_SERVER['HTTP_CONTENT_ENCODING'])) - { - $content_encoding = str_replace('x-', '', $_SERVER['HTTP_CONTENT_ENCODING']); - } - else - { - $content_encoding = ''; - } - - // check if request body has been compressed and decompress it - if($content_encoding != '' && strlen($data)) - { - if($content_encoding == 'deflate' || $content_encoding == 'gzip') - { - // if decoding works, use it. else assume data wasn't gzencoded - if(function_exists('gzinflate') && in_array($content_encoding, $this->accepted_compression)) - { - if($content_encoding == 'deflate' && $degzdata = @gzuncompress($data)) - { - $data = $degzdata; - if($this->debug > 1) - { - $this->debugmsg("\n+++INFLATED REQUEST+++[".strlen($data)." chars]+++\n" . $data . "\n+++END+++"); - } - } - elseif($content_encoding == 'gzip' && $degzdata = @gzinflate(substr($data, 10))) - { - $data = $degzdata; - if($this->debug > 1) - $this->debugmsg("+++INFLATED REQUEST+++[".strlen($data)." chars]+++\n" . $data . "\n+++END+++"); - } - else - { - $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_decompress_fail'], $GLOBALS['xmlrpcstr']['server_decompress_fail']); - return $r; - } - } - else - { - //error_log('The server sent deflated data. Your php install must have the Zlib extension compiled in to support this.'); - $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_cannot_decompress'], $GLOBALS['xmlrpcstr']['server_cannot_decompress']); - return $r; - } - } - } - - // check if client specified accepted charsets, and if we know how to fulfill - // the request - if ($this->response_charset_encoding == 'auto') - { - $resp_encoding = ''; - if (isset($_SERVER['HTTP_ACCEPT_CHARSET'])) - { - // here we should check if we can match the client-requested encoding - // with the encodings we know we can generate. - /// @todo we should parse q=0.x preferences instead of getting first charset specified... - $client_accepted_charsets = explode(',', strtoupper($_SERVER['HTTP_ACCEPT_CHARSET'])); - // Give preference to internal encoding - $known_charsets = array($GLOBALS['xmlrpc_internalencoding'], 'UTF-8', 'ISO-8859-1', 'US-ASCII'); - foreach ($known_charsets as $charset) - { - foreach ($client_accepted_charsets as $accepted) - if (strpos($accepted, $charset) === 0) - { - $resp_encoding = $charset; - break; - } - if ($resp_encoding) - break; - } - } - } - else - { - $resp_encoding = $this->response_charset_encoding; - } - - if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) - { - $resp_compression = $_SERVER['HTTP_ACCEPT_ENCODING']; - } - else - { - $resp_compression = ''; - } - - // 'guestimate' request encoding - /// @todo check if mbstring is enabled and automagic input conversion is on: it might mingle with this check??? - $req_encoding = guess_encoding(isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '', - $data); - - return null; - } - - /** - * Parse an xml chunk containing an xmlrpc request and execute the corresponding - * php function registered with the server - * @param string $data the xml request - * @param string $req_encoding (optional) the charset encoding of the xml request - * @return xmlrpcresp - * @access private - */ - function parseRequest($data, $req_encoding='') - { - // 2005/05/07 commented and moved into caller function code - //if($data=='') - //{ - // $data=$GLOBALS['HTTP_RAW_POST_DATA']; - //} - - // G. Giunta 2005/02/13: we do NOT expect to receive html entities - // so we do not try to convert them into xml character entities - //$data = xmlrpc_html_entity_xlate($data); - - $GLOBALS['_xh']=array(); - $GLOBALS['_xh']['ac']=''; - $GLOBALS['_xh']['stack']=array(); - $GLOBALS['_xh']['valuestack'] = array(); - $GLOBALS['_xh']['params']=array(); - $GLOBALS['_xh']['pt']=array(); - $GLOBALS['_xh']['isf']=0; - $GLOBALS['_xh']['isf_reason']=''; - $GLOBALS['_xh']['method']=false; // so we can check later if we got a methodname or not - $GLOBALS['_xh']['rt']=''; - - // decompose incoming XML into request structure - if ($req_encoding != '') - { - if (!in_array($req_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) - // the following code might be better for mb_string enabled installs, but - // makes the lib about 200% slower... - //if (!is_valid_charset($req_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) - { - error_log('XML-RPC: '.__METHOD__.': invalid charset encoding of received request: '.$req_encoding); - $req_encoding = $GLOBALS['xmlrpc_defencoding']; - } - /// @BUG this will fail on PHP 5 if charset is not specified in the xml prologue, - // the encoding is not UTF8 and there are non-ascii chars in the text... - /// @todo use an ampty string for php 5 ??? - $parser = xml_parser_create($req_encoding); - } - else - { - $parser = xml_parser_create(); - } - - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); - // G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell - // the xml parser to give us back data in the expected charset - // What if internal encoding is not in one of the 3 allowed? - // we use the broadest one, ie. utf8 - // This allows to send data which is native in various charset, - // by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding - if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) - { - xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); - } - else - { - xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']); - } - - if ($this->functions_parameters_type != 'xmlrpcvals') - xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast'); - else - xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee'); - xml_set_character_data_handler($parser, 'xmlrpc_cd'); - xml_set_default_handler($parser, 'xmlrpc_dh'); - if(!xml_parse($parser, $data, 1)) - { - // return XML error as a faultCode - $r=new xmlrpcresp(0, - $GLOBALS['xmlrpcerrxml']+xml_get_error_code($parser), - sprintf('XML error: %s at line %d, column %d', - xml_error_string(xml_get_error_code($parser)), - xml_get_current_line_number($parser), xml_get_current_column_number($parser))); - xml_parser_free($parser); - } - elseif ($GLOBALS['_xh']['isf']) - { - xml_parser_free($parser); - $r=new xmlrpcresp(0, - $GLOBALS['xmlrpcerr']['invalid_request'], - $GLOBALS['xmlrpcstr']['invalid_request'] . ' ' . $GLOBALS['_xh']['isf_reason']); - } - else - { - xml_parser_free($parser); - // small layering violation in favor of speed and memory usage: - // we should allow the 'execute' method handle this, but in the - // most common scenario (xmlrpcvals type server with some methods - // registered as phpvals) that would mean a useless encode+decode pass - if ($this->functions_parameters_type != 'xmlrpcvals' || (isset($this->dmap[$GLOBALS['_xh']['method']]['parameters_type']) && ($this->dmap[$GLOBALS['_xh']['method']]['parameters_type'] == 'phpvals'))) - { - if($this->debug > 1) - { - $this->debugmsg("\n+++PARSED+++\n".var_export($GLOBALS['_xh']['params'], true)."\n+++END+++"); - } - $r = $this->execute($GLOBALS['_xh']['method'], $GLOBALS['_xh']['params'], $GLOBALS['_xh']['pt']); - } - else - { - // build an xmlrpcmsg object with data parsed from xml - $m=new xmlrpcmsg($GLOBALS['_xh']['method']); - // now add parameters in - for($i=0; $iaddParam($GLOBALS['_xh']['params'][$i]); - } - - if($this->debug > 1) - { - $this->debugmsg("\n+++PARSED+++\n".var_export($m, true)."\n+++END+++"); - } - $r = $this->execute($m); - } - } - return $r; - } - - /** - * Execute a method invoked by the client, checking parameters used - * @param mixed $m either an xmlrpcmsg obj or a method name - * @param array $params array with method parameters as php types (if m is method name only) - * @param array $paramtypes array with xmlrpc types of method parameters (if m is method name only) - * @return xmlrpcresp - * @access private - */ - function execute($m, $params=null, $paramtypes=null) - { - if (is_object($m)) - { - $methName = $m->method(); - } - else - { - $methName = $m; - } - $sysCall = $this->allow_system_funcs && (strpos($methName, "system.") === 0); - $dmap = $sysCall ? $GLOBALS['_xmlrpcs_dmap'] : $this->dmap; - - if(!isset($dmap[$methName]['function'])) - { - // No such method - return new xmlrpcresp(0, - $GLOBALS['xmlrpcerr']['unknown_method'], - $GLOBALS['xmlrpcstr']['unknown_method']); - } - - // Check signature - if(isset($dmap[$methName]['signature'])) - { - $sig = $dmap[$methName]['signature']; - if (is_object($m)) - { - list($ok, $errstr) = $this->verifySignature($m, $sig); - } - else - { - list($ok, $errstr) = $this->verifySignature($paramtypes, $sig); - } - if(!$ok) - { - // Didn't match. - return new xmlrpcresp( - 0, - $GLOBALS['xmlrpcerr']['incorrect_params'], - $GLOBALS['xmlrpcstr']['incorrect_params'] . ": ${errstr}" - ); - } - } - - $func = $dmap[$methName]['function']; - // let the 'class::function' syntax be accepted in dispatch maps - if(is_string($func) && strpos($func, '::')) - { - $func = explode('::', $func); - } - // verify that function to be invoked is in fact callable - if(!is_callable($func)) - { - error_log("XML-RPC: ".__METHOD__.": function $func registered as method handler is not callable"); - return new xmlrpcresp( - 0, - $GLOBALS['xmlrpcerr']['server_error'], - $GLOBALS['xmlrpcstr']['server_error'] . ": no function matches method" - ); - } - - // If debug level is 3, we should catch all errors generated during - // processing of user function, and log them as part of response - if($this->debug > 2) - { - $GLOBALS['_xmlrpcs_prev_ehandler'] = set_error_handler('_xmlrpcs_errorHandler'); - } - try - { - // Allow mixed-convention servers - if (is_object($m)) - { - if($sysCall) - { - $r = call_user_func($func, $this, $m); - } - else - { - $r = call_user_func($func, $m); - } - if (!is_a($r, 'xmlrpcresp')) - { - error_log("XML-RPC: ".__METHOD__.": function $func registered as method handler does not return an xmlrpcresp object"); - if (is_a($r, 'xmlrpcval')) - { - $r = new xmlrpcresp($r); - } - else - { - $r = new xmlrpcresp( - 0, - $GLOBALS['xmlrpcerr']['server_error'], - $GLOBALS['xmlrpcstr']['server_error'] . ": function does not return xmlrpcresp object" - ); - } - } - } - else - { - // call a 'plain php' function - if($sysCall) - { - array_unshift($params, $this); - $r = call_user_func_array($func, $params); - } - else - { - // 3rd API convention for method-handling functions: EPI-style - if ($this->functions_parameters_type == 'epivals') - { - $r = call_user_func_array($func, array($methName, $params, $this->user_data)); - // mimic EPI behaviour: if we get an array that looks like an error, make it - // an eror response - if (is_array($r) && array_key_exists('faultCode', $r) && array_key_exists('faultString', $r)) - { - $r = new xmlrpcresp(0, (integer)$r['faultCode'], (string)$r['faultString']); - } - else - { - // functions using EPI api should NOT return resp objects, - // so make sure we encode the return type correctly - $r = new xmlrpcresp(php_xmlrpc_encode($r, array('extension_api'))); - } - } - else - { - $r = call_user_func_array($func, $params); - } - } - // the return type can be either an xmlrpcresp object or a plain php value... - if (!is_a($r, 'xmlrpcresp')) - { - // what should we assume here about automatic encoding of datetimes - // and php classes instances??? - $r = new xmlrpcresp(php_xmlrpc_encode($r, $this->phpvals_encoding_options)); - } - } - } - catch(Exception $e) - { - // (barring errors in the lib) an uncatched exception happened - // in the called function, we wrap it in a proper error-response - switch($this->exception_handling) - { - case 2: - throw $e; - break; - case 1: - $r = new xmlrpcresp(0, $e->getCode(), $e->getMessage()); - break; - default: - $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['server_error'], $GLOBALS['xmlrpcstr']['server_error']); - } - } - if($this->debug > 2) - { - // note: restore the error handler we found before calling the - // user func, even if it has been changed inside the func itself - if($GLOBALS['_xmlrpcs_prev_ehandler']) - { - set_error_handler($GLOBALS['_xmlrpcs_prev_ehandler']); - } - else - { - restore_error_handler(); - } - } - return $r; - } - - /** - * add a string to the 'internal debug message' (separate from 'user debug message') - * @param string $strings - * @access private - */ - function debugmsg($string) - { - $this->debug_info .= $string."\n"; - } - - /** - * @access private - */ - function xml_header($charset_encoding='') - { - if ($charset_encoding != '') - { - return "\n"; - } - else - { - return "\n"; - } - } - - /** - * A debugging routine: just echoes back the input packet as a string value - * DEPRECATED! - */ - function echoInput() - { - $r=new xmlrpcresp(new xmlrpcval( "'Aha said I: '" . $GLOBALS['HTTP_RAW_POST_DATA'], 'string')); - print $r->serialize(); - } - } -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/Assert.php b/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/Assert.php deleted file mode 100644 index 6a088db1..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/Assert.php +++ /dev/null @@ -1,400 +0,0 @@ - - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: Assert.php 2 2009-03-16 20:22:51Z ggiunta $ - * @link http://pear.php.net/package/PHPUnit - * @since File available since Release 1.0.0 - */ - -/** - * A set of assert methods. - * - * @category Testing - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: @package_version@ - * @link http://pear.php.net/package/PHPUnit - * @since Class available since Release 1.0.0 - */ -class PHPUnit_Assert { - /** - * @var boolean - * @access private - */ - var $_looselyTyped = FALSE; - - /** - * Asserts that a haystack contains a needle. - * - * @param mixed - * @param mixed - * @param string - * @access public - * @since Method available since Release 1.1.0 - */ - function assertContains($needle, $haystack, $message = '') { - if (is_string($needle) && is_string($haystack)) { - $this->assertTrue(strpos($haystack, $needle) !== FALSE, $message); - } - - else if (is_array($haystack) && !is_object($needle)) { - $this->assertTrue(in_array($needle, $haystack), $message); - } - - else { - $this->fail('Unsupported parameter passed to assertContains().'); - } - } - - /** - * Asserts that a haystack does not contain a needle. - * - * @param mixed - * @param mixed - * @param string - * @access public - * @since Method available since Release 1.1.0 - */ - function assertNotContains($needle, $haystack, $message = '') { - if (is_string($needle) && is_string($haystack)) { - $this->assertFalse(strpos($haystack, $needle) !== FALSE, $message); - } - - else if (is_array($haystack) && !is_object($needle)) { - $this->assertFalse(in_array($needle, $haystack), $message); - } - - else { - $this->fail('Unsupported parameter passed to assertNotContains().'); - } - } - - /** - * Asserts that two variables are equal. - * - * @param mixed - * @param mixed - * @param string - * @param mixed - * @access public - */ - function assertEquals($expected, $actual, $message = '', $delta = 0) { - if ((is_array($actual) && is_array($expected)) || - (is_object($actual) && is_object($expected))) { - if (is_array($actual) && is_array($expected)) { - ksort($actual); - ksort($expected); - } - - if ($this->_looselyTyped) { - $actual = $this->_convertToString($actual); - $expected = $this->_convertToString($expected); - } - - $actual = serialize($actual); - $expected = serialize($expected); - - $message = sprintf( - '%sexpected %s, actual %s', - - !empty($message) ? $message . ' ' : '', - $expected, - $actual - ); - - if ($actual !== $expected) { - return $this->fail($message); - } - } - - elseif (is_numeric($actual) && is_numeric($expected)) { - $message = sprintf( - '%sexpected %s%s, actual %s', - - !empty($message) ? $message . ' ' : '', - $expected, - ($delta != 0) ? ('+/- ' . $delta) : '', - $actual - ); - - if (!($actual >= ($expected - $delta) && $actual <= ($expected + $delta))) { - return $this->fail($message); - } - } - - else { - $message = sprintf( - '%sexpected %s, actual %s', - - !empty($message) ? $message . ' ' : '', - $expected, - $actual - ); - - if ($actual !== $expected) { - return $this->fail($message); - } - } - } - - /** - * Asserts that two variables reference the same object. - * This requires the Zend Engine 2 to work. - * - * @param object - * @param object - * @param string - * @access public - * @deprecated - */ - function assertSame($expected, $actual, $message = '') { - if (!version_compare(phpversion(), '5.0.0', '>=')) { - $this->fail('assertSame() only works with PHP >= 5.0.0.'); - } - - if ((is_object($expected) || is_null($expected)) && - (is_object($actual) || is_null($actual))) { - $message = sprintf( - '%sexpected two variables to reference the same object', - - !empty($message) ? $message . ' ' : '' - ); - - if ($expected !== $actual) { - return $this->fail($message); - } - } else { - $this->fail('Unsupported parameter passed to assertSame().'); - } - } - - /** - * Asserts that two variables do not reference the same object. - * This requires the Zend Engine 2 to work. - * - * @param object - * @param object - * @param string - * @access public - * @deprecated - */ - function assertNotSame($expected, $actual, $message = '') { - if (!version_compare(phpversion(), '5.0.0', '>=')) { - $this->fail('assertNotSame() only works with PHP >= 5.0.0.'); - } - - if ((is_object($expected) || is_null($expected)) && - (is_object($actual) || is_null($actual))) { - $message = sprintf( - '%sexpected two variables to reference different objects', - - !empty($message) ? $message . ' ' : '' - ); - - if ($expected === $actual) { - return $this->fail($message); - } - } else { - $this->fail('Unsupported parameter passed to assertNotSame().'); - } - } - - /** - * Asserts that a variable is not NULL. - * - * @param mixed - * @param string - * @access public - */ - function assertNotNull($actual, $message = '') { - $message = sprintf( - '%sexpected NOT NULL, actual NULL', - - !empty($message) ? $message . ' ' : '' - ); - - if (is_null($actual)) { - return $this->fail($message); - } - } - - /** - * Asserts that a variable is NULL. - * - * @param mixed - * @param string - * @access public - */ - function assertNull($actual, $message = '') { - $message = sprintf( - '%sexpected NULL, actual NOT NULL', - - !empty($message) ? $message . ' ' : '' - ); - - if (!is_null($actual)) { - return $this->fail($message); - } - } - - /** - * Asserts that a condition is true. - * - * @param boolean - * @param string - * @access public - */ - function assertTrue($condition, $message = '') { - $message = sprintf( - '%sexpected TRUE, actual FALSE', - - !empty($message) ? $message . ' ' : '' - ); - - if (!$condition) { - return $this->fail($message); - } - } - - /** - * Asserts that a condition is false. - * - * @param boolean - * @param string - * @access public - */ - function assertFalse($condition, $message = '') { - $message = sprintf( - '%sexpected FALSE, actual TRUE', - - !empty($message) ? $message . ' ' : '' - ); - - if ($condition) { - return $this->fail($message); - } - } - - /** - * Asserts that a string matches a given regular expression. - * - * @param string - * @param string - * @param string - * @access public - */ - function assertRegExp($pattern, $string, $message = '') { - $message = sprintf( - '%s"%s" does not match pattern "%s"', - - !empty($message) ? $message . ' ' : '', - $string, - $pattern - ); - - if (!preg_match($pattern, $string)) { - return $this->fail($message); - } - } - - /** - * Asserts that a string does not match a given regular expression. - * - * @param string - * @param string - * @param string - * @access public - * @since Method available since Release 1.1.0 - */ - function assertNotRegExp($pattern, $string, $message = '') { - $message = sprintf( - '%s"%s" matches pattern "%s"', - - !empty($message) ? $message . ' ' : '', - $string, - $pattern - ); - - if (preg_match($pattern, $string)) { - return $this->fail($message); - } - } - - /** - * Asserts that a variable is of a given type. - * - * @param string $expected - * @param mixed $actual - * @param optional string $message - * @access public - */ - function assertType($expected, $actual, $message = '') { - return $this->assertEquals( - $expected, - gettype($actual), - $message - ); - } - - /** - * Converts a value to a string. - * - * @param mixed $value - * @access private - */ - function _convertToString($value) { - foreach ($value as $k => $v) { - if (is_array($v)) { - $value[$k] = $this->_convertToString($value[$k]); - } else { - settype($value[$k], 'string'); - } - } - - return $value; - } - - /** - * @param boolean $looselyTyped - * @access public - */ - function setLooselyTyped($looselyTyped) { - if (is_bool($looselyTyped)) { - $this->_looselyTyped = $looselyTyped; - } - } - - /** - * Fails a test with the given message. - * - * @param string - * @access protected - * @abstract - */ - function fail($message = '') { /* abstract */ } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestCase.php b/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestCase.php deleted file mode 100644 index 2c0ed29c..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestCase.php +++ /dev/null @@ -1,267 +0,0 @@ - - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: TestCase.php 2 2009-03-16 20:22:51Z ggiunta $ - * @link http://pear.php.net/package/PHPUnit - * @since File available since Release 1.0.0 - */ - -require_once 'PHPUnit/Assert.php'; -require_once 'PHPUnit/TestResult.php'; - -/** - * A TestCase defines the fixture to run multiple tests. - * - * To define a TestCase - * - * 1) Implement a subclass of PHPUnit_TestCase. - * 2) Define instance variables that store the state of the fixture. - * 3) Initialize the fixture state by overriding setUp(). - * 4) Clean-up after a test by overriding tearDown(). - * - * Each test runs in its own fixture so there can be no side effects - * among test runs. - * - * Here is an example: - * - * - * PHPUnit_TestCase($name); - * } - * - * function setUp() { - * $this->fValue1 = 2; - * $this->fValue2 = 3; - * } - * } - * ?> - * - * - * For each test implement a method which interacts with the fixture. - * Verify the expected results with assertions specified by calling - * assert with a boolean. - * - * - * assertTrue($this->fValue1 + $this->fValue2 == 5); - * } - * ?> - * - * - * @category Testing - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: @package_version@ - * @link http://pear.php.net/package/PHPUnit - * @since Class available since Release 1.0.0 - */ -class PHPUnit_TestCase extends PHPUnit_Assert { - /** - * @var boolean - * @access private - */ - var $_failed = FALSE; - - /** - * The name of the test case. - * - * @var string - * @access private - */ - var $_name = ''; - - /** - * PHPUnit_TestResult object - * - * @var object - * @access private - */ - var $_result; - - /** - * Constructs a test case with the given name. - * - * @param string - * @access public - */ - function PHPUnit_TestCase($name = FALSE) { - if ($name !== FALSE) { - $this->setName($name); - } - } - - /** - * Counts the number of test cases executed by run(TestResult result). - * - * @return integer - * @access public - */ - function countTestCases() { - return 1; - } - - /** - * Gets the name of a TestCase. - * - * @return string - * @access public - */ - function getName() { - return $this->_name; - } - - /** - * Runs the test case and collects the results in a given TestResult object. - * - * @param object - * @return object - * @access public - */ - function run(&$result) { - $this->_result = &$result; - $this->_result->run($this); - - return $this->_result; - } - - /** - * Runs the bare test sequence. - * - * @access public - */ - function runBare() { - $this->setUp(); - $this->runTest(); - $this->tearDown(); - $this->pass(); - } - - /** - * Override to run the test and assert its state. - * - * @access protected - */ - function runTest() { - call_user_func( - array( - &$this, - $this->_name - ) - ); - } - - /** - * Sets the name of a TestCase. - * - * @param string - * @access public - */ - function setName($name) { - $this->_name = $name; - } - - /** - * Returns a string representation of the test case. - * - * @return string - * @access public - */ - function toString() { - return ''; - } - - /** - * Creates a default TestResult object. - * - * @return object - * @access protected - */ - function &createResult() { - return new PHPUnit_TestResult; - } - - /** - * Fails a test with the given message. - * - * @param string - * @access protected - */ - function fail($message = '') { - if (function_exists('debug_backtrace')) { - $trace = debug_backtrace(); - - if (isset($trace['1']['file'])) { - $message = sprintf( - "%s in %s:%s", - - $message, - $trace['1']['file'], - $trace['1']['line'] - ); - } - } - - $this->_result->addFailure($this, $message); - $this->_failed = TRUE; - } - - /** - * Passes a test. - * - * @access protected - */ - function pass() { - if (!$this->_failed) { - $this->_result->addPassedTest($this); - } - } - - /** - * Sets up the fixture, for example, open a network connection. - * This method is called before a test is executed. - * - * @access protected - * @abstract - */ - function setUp() { /* abstract */ } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @access protected - * @abstract - */ - function tearDown() { /* abstract */ } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestDecorator.php b/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestDecorator.php deleted file mode 100644 index cb99f17d..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestDecorator.php +++ /dev/null @@ -1,130 +0,0 @@ - - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: TestDecorator.php 2 2009-03-16 20:22:51Z ggiunta $ - * @link http://pear.php.net/package/PHPUnit - * @since File available since Release 1.0.0 - */ - -require_once 'PHPUnit/TestCase.php'; -require_once 'PHPUnit/TestSuite.php'; - -if (!function_exists('is_a')) { - require_once 'PHP/Compat/Function/is_a.php'; -} - -/** - * A Decorator for Tests. - * - * Use TestDecorator as the base class for defining new - * test decorators. Test decorator subclasses can be introduced - * to add behaviour before or after a test is run. - * - * @category Testing - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: @package_version@ - * @link http://pear.php.net/package/PHPUnit - * @since Class available since Release 1.0.0 - */ -class PHPUnit_TestDecorator { - /** - * The Test to be decorated. - * - * @var object - * @access protected - */ - var $_test = NULL; - - /** - * Constructor. - * - * @param object - * @access public - */ - function PHPUnit_TestDecorator(&$test) { - if (is_object($test) && - (is_a($test, 'PHPUnit_TestCase') || - is_a($test, 'PHPUnit_TestSuite'))) { - - $this->_test = &$test; - } - } - - /** - * Runs the test and collects the - * result in a TestResult. - * - * @param object - * @access public - */ - function basicRun(&$result) { - $this->_test->run($result); - } - - /** - * Counts the number of test cases that - * will be run by this test. - * - * @return integer - * @access public - */ - function countTestCases() { - return $this->_test->countTestCases(); - } - - /** - * Returns the test to be run. - * - * @return object - * @access public - */ - function &getTest() { - return $this->_test; - } - - /** - * Runs the decorated test and collects the - * result in a TestResult. - * - * @param object - * @access public - * @abstract - */ - function run(&$result) { /* abstract */ } - - /** - * Returns a string representation of the test. - * - * @return string - * @access public - */ - function toString() { - return $this->_test->toString(); - } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestFailure.php b/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestFailure.php deleted file mode 100644 index afb65f2c..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestFailure.php +++ /dev/null @@ -1,104 +0,0 @@ - - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: TestFailure.php 2 2009-03-16 20:22:51Z ggiunta $ - * @link http://pear.php.net/package/PHPUnit - * @since File available since Release 1.0.0 - */ - -/** - * A TestFailure collects a failed test together with the caught exception. - * - * @category Testing - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: @package_version@ - * @link http://pear.php.net/package/PHPUnit - * @since Class available since Release 1.0.0 - */ -class PHPUnit_TestFailure { - /** - * @var object - * @access private - */ - var $_failedTest; - - /** - * @var string - * @access private - */ - var $_thrownException; - - /** - * Constructs a TestFailure with the given test and exception. - * - * @param object - * @param string - * @access public - */ - function PHPUnit_TestFailure(&$failedTest, &$thrownException) { - $this->_failedTest = &$failedTest; - $this->_thrownException = &$thrownException; - } - - /** - * Gets the failed test. - * - * @return object - * @access public - */ - function &failedTest() { - return $this->_failedTest; - } - - /** - * Gets the thrown exception. - * - * @return object - * @access public - */ - function &thrownException() { - return $this->_thrownException; - } - - /** - * Returns a short description of the failure. - * - * @return string - * @access public - */ - function toString() { - return sprintf( - "TestCase %s->%s() failed: %s\n", - - get_class($this->_failedTest), - $this->_failedTest->getName(), - $this->_thrownException - ); - } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestListener.php b/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestListener.php deleted file mode 100644 index a1860210..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestListener.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: TestListener.php 2 2009-03-16 20:22:51Z ggiunta $ - * @link http://pear.php.net/package/PHPUnit - * @since File available since Release 1.0.0 - */ - -/** - * A Listener for test progress. - * - * Here is an example: - * - * - * PHPUnit_TestCase($name); - * } - * - * function setUp() { - * $this->fValue1 = 2; - * $this->fValue2 = 3; - * } - * - * function testAdd() { - * $this->assertTrue($this->fValue1 + $this->fValue2 == 4); - * } - * } - * - * class MyListener extends PHPUnit_TestListener { - * function addError(&$test, &$t) { - * print "MyListener::addError() called.\n"; - * } - * - * function addFailure(&$test, &$t) { - * print "MyListener::addFailure() called.\n"; - * } - * - * function endTest(&$test) { - * print "MyListener::endTest() called.\n"; - * } - * - * function startTest(&$test) { - * print "MyListener::startTest() called.\n"; - * } - * } - * - * $suite = new PHPUnit_TestSuite; - * $suite->addTest(new MathTest('testAdd')); - * - * $result = new PHPUnit_TestResult; - * $result->addListener(new MyListener); - * - * $suite->run($result); - * print $result->toString(); - * ?> - * - * - * @category Testing - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: @package_version@ - * @link http://pear.php.net/package/PHPUnit - * @since Class available since Release 1.0.0 - */ -class PHPUnit_TestListener { - /** - * An error occurred. - * - * @param object - * @param object - * @access public - * @abstract - */ - function addError(&$test, &$t) { /*abstract */ } - - /** - * A failure occurred. - * - * @param object - * @param object - * @access public - * @abstract - */ - function addFailure(&$test, &$t) { /*abstract */ } - - /** - * A test ended. - * - * @param object - * @access public - * @abstract - */ - function endTest(&$test) { /*abstract */ } - - /** - * A test started. - * - * @param object - * @access public - * @abstract - */ - function startTest(&$test) { /*abstract */ } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestResult.php b/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestResult.php deleted file mode 100644 index cba0dd3f..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestResult.php +++ /dev/null @@ -1,321 +0,0 @@ - - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: TestResult.php 2 2009-03-16 20:22:51Z ggiunta $ - * @link http://pear.php.net/package/PHPUnit - * @since File available since Release 1.0.0 - */ - -require_once 'PHPUnit/TestFailure.php'; -require_once 'PHPUnit/TestListener.php'; - -if (!function_exists('is_a')) { - require_once 'PHP/Compat/Function/is_a.php'; -} - -/** - * A TestResult collects the results of executing a test case. - * - * @category Testing - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: @package_version@ - * @link http://pear.php.net/package/PHPUnit - * @since Class available since Release 1.0.0 - */ -class PHPUnit_TestResult { - /** - * @var array - * @access protected - */ - var $_errors = array(); - - /** - * @var array - * @access protected - */ - var $_failures = array(); - - /** - * @var array - * @access protected - */ - var $_listeners = array(); - - /** - * @var array - * @access protected - */ - var $_passedTests = array(); - - /** - * @var integer - * @access protected - */ - var $_runTests = 0; - - /** - * @var boolean - * @access private - */ - var $_stop = FALSE; - - /** - * Adds an error to the list of errors. - * The passed in exception caused the error. - * - * @param object - * @param object - * @access public - */ - function addError(&$test, &$t) { - $this->_errors[] = new PHPUnit_TestFailure($test, $t); - - for ($i = 0; $i < sizeof($this->_listeners); $i++) { - $this->_listeners[$i]->addError($test, $t); - } - } - - /** - * Adds a failure to the list of failures. - * The passed in exception caused the failure. - * - * @param object - * @param object - * @access public - */ - function addFailure(&$test, &$t) { - $this->_failures[] = new PHPUnit_TestFailure($test, $t); - - for ($i = 0; $i < sizeof($this->_listeners); $i++) { - $this->_listeners[$i]->addFailure($test, $t); - } - } - - /** - * Registers a TestListener. - * - * @param object - * @access public - */ - function addListener(&$listener) { - if (is_object($listener) && - is_a($listener, 'PHPUnit_TestListener')) { - $this->_listeners[] = &$listener; - } - } - - /** - * Adds a passed test to the list of passed tests. - * - * @param object - * @access public - */ - function addPassedTest(&$test) { - $this->_passedTests[] = &$test; - } - - /** - * Informs the result that a test was completed. - * - * @param object - * @access public - */ - function endTest(&$test) { - for ($i = 0; $i < sizeof($this->_listeners); $i++) { - $this->_listeners[$i]->endTest($test); - } - } - - /** - * Gets the number of detected errors. - * - * @return integer - * @access public - */ - function errorCount() { - return sizeof($this->_errors); - } - - /** - * Returns an Enumeration for the errors. - * - * @return array - * @access public - */ - function &errors() { - return $this->_errors; - } - - /** - * Gets the number of detected failures. - * - * @return integer - * @access public - */ - function failureCount() { - return sizeof($this->_failures); - } - - /** - * Returns an Enumeration for the failures. - * - * @return array - * @access public - */ - function &failures() { - return $this->_failures; - } - - /** - * Returns an Enumeration for the passed tests. - * - * @return array - * @access public - */ - function &passedTests() { - return $this->_passedTests; - } - - /** - * Unregisters a TestListener. - * This requires the Zend Engine 2 (to work properly). - * - * @param object - * @access public - */ - function removeListener(&$listener) { - for ($i = 0; $i < sizeof($this->_listeners); $i++) { - if ($this->_listeners[$i] === $listener) { - unset($this->_listeners[$i]); - } - } - } - - /** - * Runs a TestCase. - * - * @param object - * @access public - */ - function run(&$test) { - $this->startTest($test); - $this->_runTests++; - $test->runBare(); - $this->endTest($test); - } - - /** - * Gets the number of run tests. - * - * @return integer - * @access public - */ - function runCount() { - return $this->_runTests; - } - - /** - * Checks whether the test run should stop. - * - * @access public - */ - function shouldStop() { - return $this->_stop; - } - - /** - * Informs the result that a test will be started. - * - * @param object - * @access public - */ - function startTest(&$test) { - for ($i = 0; $i < sizeof($this->_listeners); $i++) { - $this->_listeners[$i]->startTest($test); - } - } - - /** - * Marks that the test run should stop. - * - * @access public - */ - function stop() { - $this->_stop = TRUE; - } - - /** - * Returns a HTML representation of the test result. - * - * @return string - * @access public - */ - function toHTML() { - return '
    ' . htmlspecialchars($this->toString()) . '
    '; - } - - /** - * Returns a text representation of the test result. - * - * @return string - * @access public - */ - function toString() { - $result = ''; - - foreach ($this->_passedTests as $passedTest) { - $result .= sprintf( - "TestCase %s->%s() passed\n", - - get_class($passedTest), - $passedTest->getName() - ); - } - - foreach ($this->_failures as $failedTest) { - $result .= $failedTest->toString(); - } - - return $result; - } - - /** - * Returns whether the entire test was successful or not. - * - * @return boolean - * @access public - */ - function wasSuccessful() { - if (empty($this->_errors) && empty($this->_failures)) { - return TRUE; - } else { - return FALSE; - } - } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestSuite.php b/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestSuite.php deleted file mode 100644 index 5dca5201..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/PHPUnit/TestSuite.php +++ /dev/null @@ -1,239 +0,0 @@ - - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: TestSuite.php 44 2009-08-04 21:33:50Z ggiunta $ - * @link http://pear.php.net/package/PHPUnit - * @since File available since Release 1.0.0 - */ - -require_once 'PHPUnit/TestCase.php'; - -/** - * A TestSuite is a Composite of Tests. It runs a collection of test cases. - * - * Here is an example using the dynamic test definition. - * - * - * addTest(new MathTest('testPass')); - * ?> - * - * - * Alternatively, a TestSuite can extract the tests to be run automatically. - * To do so you pass the classname of your TestCase class to the TestSuite - * constructor. - * - * - * - * - * - * This constructor creates a suite with all the methods starting with - * "test" that take no arguments. - * - * @category Testing - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: @package_version@ - * @link http://pear.php.net/package/PHPUnit - * @since Class available since Release 1.0.0 - */ -class PHPUnit_TestSuite { - /** - * The name of the test suite. - * - * @var string - * @access private - */ - var $_name = ''; - - /** - * The tests in the test suite. - * - * @var array - * @access private - */ - var $_tests = array(); - - /** - * Constructs a TestSuite. - * - * @param mixed - * @access public - */ - function PHPUnit_TestSuite($test = FALSE) { - if ($test !== FALSE) { - $this->setName($test); - $this->addTestSuite($test); - } - } - - /** - * Adds a test to the suite. - * - * @param object - * @access public - */ - function addTest(&$test) { - $this->_tests[] = &$test; - } - - /** - * Adds the tests from the given class to the suite. - * - * @param string - * @access public - */ - function addTestSuite($testClass) { - if (class_exists($testClass)) { - $methods = get_class_methods($testClass); - $parentClasses = array(strtolower($testClass)); - $parentClass = $testClass; - - while(is_string($parentClass = get_parent_class($parentClass))) { - $parentClasses[] = $parentClass; - } - - foreach ($methods as $method) { - if (substr($method, 0, 4) == 'test' && - !in_array($method, $parentClasses)) { - $this->addTest(new $testClass($method)); - } - } - } - } - - /** - * Counts the number of test cases that will be run by this test. - * - * @return integer - * @access public - */ - function countTestCases() { - $count = 0; - - foreach ($this->_tests as $test) { - $count += $test->countTestCases(); - } - - return $count; - } - - /** - * Returns the name of the suite. - * - * @return string - * @access public - */ - function getName() { - return $this->_name; - } - - /** - * Runs the tests and collects their result in a TestResult. - * - * @param object - * @access public - */ - function run(&$result, $show_progress='') { - for ($i = 0; $i < sizeof($this->_tests) && !$result->shouldStop(); $i++) { - $this->_tests[$i]->run($result); - if ($show_progress != '') { - echo $show_progress; flush(); @ob_flush(); - } - } - } - - /** - * Runs a test. - * - * @param object - * @param object - * @access public - */ - function runTest(&$test, &$result) { - $test->run($result); - } - - /** - * Sets the name of the suite. - * - * @param string - * @access public - */ - function setName($name) { - $this->_name = $name; - } - - /** - * Returns the test at the given index. - * - * @param integer - * @return object - * @access public - */ - function &testAt($index) { - if (isset($this->_tests[$index])) { - return $this->_tests[$index]; - } else { - return FALSE; - } - } - - /** - * Returns the number of tests in this suite. - * - * @return integer - * @access public - */ - function testCount() { - return sizeof($this->_tests); - } - - /** - * Returns the tests as an enumeration. - * - * @return array - * @access public - */ - function &tests() { - return $this->_tests; - } - - /** - * Returns a string representation of the test suite. - * - * @return string - * @access public - */ - function toString() { - return ''; - } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/test/benchmark.php b/include/limesurvey/admin/classes/xmlrpc/test/benchmark.php deleted file mode 100644 index a40983c2..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/benchmark.php +++ /dev/null @@ -1,301 +0,0 @@ - $data1, 'one' => $data1, 'two' => $data1, 'three' => $data1, 'four' => $data1, 'five' => $data1, 'six' => $data1, 'seven' => $data1, 'eight' => $data1, 'nine' => $data1); - $data = array($data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2); - $keys = array('zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'); - - $test_results=array(); - $xd = extension_loaded('xdebug') && ini_get('xdebug.profiler_enable'); - if ($xd) - $num_tests = 1; - else - $num_tests = 10; - - $title = 'XML-RPC Benchmark Tests'; - - if(isset($_SERVER['REQUEST_METHOD'])) - { - echo "\n\n\n$title\n\n\n

    $title

    \n
    \n";
    -	}
    -	else
    -	{
    -		echo "$title\n\n";
    -	}
    -
    -	if(isset($_SERVER['REQUEST_METHOD']))
    -	{
    -		echo "

    Using lib version: $xmlrpcVersion on PHP version: ".phpversion()."

    \n"; - if ($xd) echo "

    XDEBUG profiling enabled: skipping remote tests. Trace file is: ".htmlspecialchars(xdebug_get_profiler_filename())."

    \n"; - flush(); - ob_flush(); - } - else - { - echo "Using lib version: $xmlrpcVersion on PHP version: ".phpversion()."\n"; - if ($xd) echo "XDEBUG profiling enabled: skipping remote tests\nTrace file is: ".xdebug_get_profiler_filename()."\n"; - } - - // test 'old style' data encoding vs. 'automatic style' encoding - begin_test('Data encoding (large array)', 'manual encoding'); - for ($i = 0; $i < $num_tests; $i++) - { - $vals = array(); - for ($j = 0; $j < 10; $j++) - { - $valarray = array(); - foreach ($data[$j] as $key => $val) - { - $values = array(); - $values[] = new xmlrpcval($val[0], 'int'); - $values[] = new xmlrpcval($val[1], 'double'); - $values[] = new xmlrpcval($val[2], 'string'); - $values[] = new xmlrpcval($val[3], 'boolean'); - $values[] = new xmlrpcval($val[4], 'dateTime.iso8601'); - $values[] = new xmlrpcval($val[5], 'int'); - $values[] = new xmlrpcval($val[6], 'double'); - $values[] = new xmlrpcval($val[7], 'string'); - $values[] = new xmlrpcval($val[8], 'boolean'); - $values[] = new xmlrpcval($val[9], 'dateTime.iso8601'); - $valarray[$key] = new xmlrpcval($values, 'array'); - } - $vals[] = new xmlrpcval($valarray, 'struct'); - } - $value = new xmlrpcval($vals, 'array'); - $out = $value->serialize(); - } - end_test('Data encoding (large array)', 'manual encoding', $out); - - begin_test('Data encoding (large array)', 'automatic encoding'); - for ($i = 0; $i < $num_tests; $i++) - { - $value = php_xmlrpc_encode($data, array('auto_dates')); - $out = $value->serialize(); - } - end_test('Data encoding (large array)', 'automatic encoding', $out); - - if (function_exists('xmlrpc_set_type')) - { - begin_test('Data encoding (large array)', 'xmlrpc-epi encoding'); - for ($i = 0; $i < $num_tests; $i++) - { - for ($j = 0; $j < 10; $j++) - foreach ($keys as $k) - { - xmlrpc_set_type($data[$j][$k][4], 'datetime'); - xmlrpc_set_type($data[$j][$k][8], 'datetime'); - } - $out = xmlrpc_encode($data); - } - end_test('Data encoding (large array)', 'xmlrpc-epi encoding', $out); - } - - // test 'old style' data decoding vs. 'automatic style' decoding - $dummy = new xmlrpcmsg(''); - $out = new xmlrpcresp($value); - $in = ''."\n".$out->serialize(); - - begin_test('Data decoding (large array)', 'manual decoding'); - for ($i = 0; $i < $num_tests; $i++) - { - $response =& $dummy->ParseResponse($in, true); - $value = $response->value(); - $result = array(); - for ($k = 0; $k < $value->arraysize(); $k++) - { - $val1 = $value->arraymem($k); - $out = array(); - while (list($name, $val) = $val1->structeach()) - { - $out[$name] = array(); - for ($j = 0; $j < $val->arraysize(); $j++) - { - $data = $val->arraymem($j); - $out[$name][] = $data->scalarval(); - } - } // while - $result[] = $out; - } - } - end_test('Data decoding (large array)', 'manual decoding', $result); - - begin_test('Data decoding (large array)', 'automatic decoding'); - for ($i = 0; $i < $num_tests; $i++) - { - $response =& $dummy->ParseResponse($in, true, 'phpvals'); - $value = $response->value(); - } - end_test('Data decoding (large array)', 'automatic decoding', $value); - - if (function_exists('xmlrpc_decode')) - { - begin_test('Data decoding (large array)', 'xmlrpc-epi decoding'); - for ($i = 0; $i < $num_tests; $i++) - { - $response =& $dummy->ParseResponse($in, true, 'xml'); - $value = xmlrpc_decode($response->value()); - } - end_test('Data decoding (large array)', 'xmlrpc-epi decoding', $value); - } - - if (!$xd) { - - /// test multicall vs. many calls vs. keep-alives - $value = php_xmlrpc_encode($data1, array('auto_dates')); - $msg = new xmlrpcmsg('interopEchoTests.echoValue', array($value)); - $msgs=array(); - for ($i = 0; $i < 25; $i++) - $msgs[] = $msg; - $server = explode(':', $LOCALSERVER); - if(count($server) > 1) - { - $c = new xmlrpc_client($URI, $server[0], $server[1]); - } - else - { - $c = new xmlrpc_client($URI, $LOCALSERVER); - } - // do not interfere with http compression - $c->accepted_compression = array(); - //$c->debug=true; - - if (function_exists('gzinflate')) { - $c->accepted_compression = null; - } - begin_test('Repeated send (small array)', 'http 10'); - $response = array(); - for ($i = 0; $i < 25; $i++) - { - $resp =& $c->send($msg); - $response[] = $resp->value(); - } - end_test('Repeated send (small array)', 'http 10', $response); - - if (function_exists('curl_init')) - { - begin_test('Repeated send (small array)', 'http 11 w. keep-alive'); - $response = array(); - for ($i = 0; $i < 25; $i++) - { - $resp =& $c->send($msg, 10, 'http11'); - $response[] = $resp->value(); - } - end_test('Repeated send (small array)', 'http 11 w. keep-alive', $response); - - $c->keepalive = false; - begin_test('Repeated send (small array)', 'http 11'); - $response = array(); - for ($i = 0; $i < 25; $i++) - { - $resp =& $c->send($msg, 10, 'http11'); - $response[] = $resp->value(); - } - end_test('Repeated send (small array)', 'http 11', $response); - } - - begin_test('Repeated send (small array)', 'multicall'); - $response =& $c->send($msgs); - foreach ($response as $key =>& $val) - { - $val = $val->value(); - } - end_test('Repeated send (small array)', 'multicall', $response); - - if (function_exists('gzinflate')) - { - $c->accepted_compression = array('gzip'); - $c->request_compression = 'gzip'; - - begin_test('Repeated send (small array)', 'http 10 w. compression'); - $response = array(); - for ($i = 0; $i < 25; $i++) - { - $resp =& $c->send($msg); - $response[] = $resp->value(); - } - end_test('Repeated send (small array)', 'http 10 w. compression', $response); - - if (function_exists('curl_init')) - { - begin_test('Repeated send (small array)', 'http 11 w. keep-alive and compression'); - $response = array(); - for ($i = 0; $i < 25; $i++) - { - $resp =& $c->send($msg, 10, 'http11'); - $response[] = $resp->value(); - } - end_test('Repeated send (small array)', 'http 11 w. keep-alive and compression', $response); - - $c->keepalive = false; - begin_test('Repeated send (small array)', 'http 11 w. compression'); - $response = array(); - for ($i = 0; $i < 25; $i++) - { - $resp =& $c->send($msg, 10, 'http11'); - $response[] = $resp->value(); - } - end_test('Repeated send (small array)', 'http 11 w. compression', $response); - } - - begin_test('Repeated send (small array)', 'multicall w. compression'); - $response =& $c->send($msgs); - foreach ($response as $key =>& $val) - { - $val = $val->value(); - } - end_test('Repeated send (small array)', 'multicall w. compression', $response); - } - - } // end of 'if no xdebug profiling' - - function begin_test($test_name, $test_case) - { - global $test_results; - if (!isset($test_results[$test_name])) - $test_results[$test_name]=array(); - $test_results[$test_name][$test_case] = array(); - $test_results[$test_name][$test_case]['time'] = microtime(true); - } - - function end_test($test_name, $test_case, $test_result) - { - global $test_results; - $end = microtime(true); - if (!isset($test_results[$test_name][$test_case])) - trigger_error('ending test that was not sterted'); - $test_results[$test_name][$test_case]['time'] = $end - $test_results[$test_name][$test_case]['time']; - $test_results[$test_name][$test_case]['result'] = $test_result; - echo '.'; - flush(); - ob_flush(); - } - - - echo "\n"; - foreach($test_results as $test => $results) - { - echo "\nTEST: $test\n"; - foreach ($results as $case => $data) - echo " $case: {$data['time']} secs - Output data CRC: ".crc32(serialize($data['result']))."\n"; - } - - - if(isset($_SERVER['REQUEST_METHOD'])) - { - echo "\n
    \n\n\n"; - } -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/test/parse_args.php b/include/limesurvey/admin/classes/xmlrpc/test/parse_args.php deleted file mode 100644 index 8551a675..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/parse_args.php +++ /dev/null @@ -1,132 +0,0 @@ - 1) - { - $$param[0]=$param[1]; - } - } - } - } - elseif(!ini_get('register_globals')) - { - // play nice to 'safe' PHP installations with register globals OFF - // NB: we might as well consider using $_GET stuff later on... - extract($_GET); - extract($_POST); - } - - if(!isset($DEBUG)) - { - $DEBUG = 0; - } - else - { - $DEBUG = intval($DEBUG); - } - - if(!isset($LOCALSERVER)) - { - if(isset($HTTP_HOST)) - { - $LOCALSERVER = $HTTP_HOST; - } - elseif(isset($_SERVER['HTTP_HOST'])) - { - $LOCALSERVER = $_SERVER['HTTP_HOST']; - } - else - { - $LOCALSERVER = 'localhost'; - } - } - if(!isset($HTTPSSERVER)) - { - $HTTPSSERVER = 'xmlrpc.usefulinc.com'; - } - if(!isset($HTTPSURI)) - { - $HTTPSURI = '/server.php'; - } - if(!isset($PROXY)) - { - $PROXYSERVER = null; - } - else - { - $arr = explode(':',$PROXY); - $PROXYSERVER = $arr[0]; - if(count($arr) > 1) - { - $PROXYPORT = $arr[1]; - } - else - { - $PROXYPORT = 8080; - } - } - if(!isset($URI)) - { - // GUESTIMATE the url of local demo server - // play nice to php 3 and 4-5 in retrieving URL of server.php - /// @todo filter out query string from REQUEST_URI - if(isset($REQUEST_URI)) - { - $URI = str_replace('/test/testsuite.php', '/demo/server/server.php', $REQUEST_URI); - $URI = str_replace('/testsuite.php', '/server.php', $URI); - $URI = str_replace('/test/benchmark.php', '/demo/server/server.php', $URI); - $URI = str_replace('/benchmark.php', '/server.php', $URI); - } - elseif(isset($_SERVER['PHP_SELF']) && isset($_SERVER['REQUEST_METHOD'])) - { - $URI = str_replace('/test/testsuite.php', '/demo/server/server.php', $_SERVER['PHP_SELF']); - $URI = str_replace('/testsuite.php', '/server.php', $URI); - $URI = str_replace('/test/benchmark.php', '/demo/server/server.php', $URI); - $URI = str_replace('/benchmark.php', '/server.php', $URI); - } - else - { - $URI = '/demo/server/server.php'; - } - } - if($URI[0] != '/') - { - $URI = '/'.$URI; - } - if(!isset($LOCALPATH)) - { - $LOCALPATH = dirname(__FILE__); - } -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/test/phpunit.php b/include/limesurvey/admin/classes/xmlrpc/test/phpunit.php deleted file mode 100644 index 7c64eb34..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/phpunit.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version CVS: $Id: phpunit.php 2 2009-03-16 20:22:51Z ggiunta $ - * @link http://pear.php.net/package/PHPUnit - * @since File available since Release 1.0.0 - */ - -require_once 'PHPUnit/TestCase.php'; -require_once 'PHPUnit/TestResult.php'; -require_once 'PHPUnit/TestSuite.php'; - -/** - * PHPUnit runs a TestSuite and returns a TestResult object. - * - * Here is an example: - * - * - * PHPUnit_TestCase($name); - * } - * - * function setUp() { - * $this->fValue1 = 2; - * $this->fValue2 = 3; - * } - * - * function testAdd() { - * $this->assertTrue($this->fValue1 + $this->fValue2 == 5); - * } - * } - * - * $suite = new PHPUnit_TestSuite(); - * $suite->addTest(new MathTest('testAdd')); - * - * $result = PHPUnit::run($suite); - * print $result->toHTML(); - * ?> - * - * - * Alternatively, you can pass a class name to the PHPUnit_TestSuite() - * constructor and let it automatically add all methods of that class - * that start with 'test' to the suite: - * - * - * toHTML(); - * ?> - * - * - * @category Testing - * @package PHPUnit - * @author Sebastian Bergmann - * @copyright 2002-2005 Sebastian Bergmann - * @license http://www.php.net/license/3_0.txt PHP License 3.0 - * @version Release: @package_version@ - * @link http://pear.php.net/package/PHPUnit - * @since Class available since Release 1.0.0 - */ -class PHPUnit { - /** - * Runs a test(suite). - * - * @param mixed - * @return PHPUnit_TestResult - * @access public - */ - function &run(&$suite, $show_progress=false) { - $result = new PHPUnit_TestResult(); - $suite->run($result, $show_progress); - - return $result; - } -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * c-hanging-comment-ender-p: nil - * End: - */ -?> diff --git a/include/limesurvey/admin/classes/xmlrpc/test/testsuite.php b/include/limesurvey/admin/classes/xmlrpc/test/testsuite.php deleted file mode 100644 index 3f742f0f..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/testsuite.php +++ /dev/null @@ -1,1519 +0,0 @@ - 1) - { - $this->client=new xmlrpc_client($URI, $server[0], $server[1]); - } - else - { - $this->client=new xmlrpc_client($URI, $LOCALSERVER); - } - if($DEBUG) - { - $this->client->setDebug($DEBUG); - } - $this->client->request_compression = $this->request_compression; - $this->client->accepted_compression = $this->accepted_compression; - } - - function send($msg, $errrorcode=0, $return_response=false) - { - $r = $this->client->send($msg, $this->timeout, $this->method); - // for multicall, return directly array of responses - if(is_array($r)) - { - return $r; - } - $this->assertEquals($r->faultCode(), $errrorcode, 'Error '.$r->faultCode().' connecting to server: '.$r->faultString()); - if(!$r->faultCode()) - { - if($return_response) - return $r; - else - return $r->value(); - } - else - { - return null; - } - } - - function testString() - { - $sendstring="here are 3 \"entities\": < > &" . - "and here's a dollar sign: \$pretendvarname and a backslash too: " . chr(92) . - " - isn't that great? \\\"hackery\\\" at it's best " . - " also don't want to miss out on \$item[0]. ". - "The real weird stuff follows: CRLF here".chr(13).chr(10). - "a simple CR here".chr(13). - "a simple LF here".chr(10). - "and then LFCR".chr(10).chr(13). - "last but not least weird names: Gnter, Elne, and an xml comment closing tag: -->"; - $f=new xmlrpcmsg('examples.stringecho', array( - new xmlrpcval($sendstring, 'string') - )); - $v=$this->send($f); - if($v) - { - // when sending/receiving non-US-ASCII encoded strings, XML says cr-lf can be normalized. - // so we relax our tests... - $l1 = strlen($sendstring); - $l2 = strlen($v->scalarval()); - if ($l1 == $l2) - $this->assertEquals($sendstring, $v->scalarval()); - else - $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendstring), $v->scalarval()); - } - } - - function testAddingDoubles() - { - // note that rounding errors mean i - // keep precision to sensible levels here ;-) - $a=12.13; $b=-23.98; - $f=new xmlrpcmsg('examples.addtwodouble',array( - new xmlrpcval($a, 'double'), - new xmlrpcval($b, 'double') - )); - $v=$this->send($f); - if($v) - { - $this->assertEquals($a+$b,$v->scalarval()); - } - } - - function testAdding() - { - $f=new xmlrpcmsg('examples.addtwo',array( - new xmlrpcval(12, 'int'), - new xmlrpcval(-23, 'int') - )); - $v=$this->send($f); - if($v) - { - $this->assertEquals(12-23, $v->scalarval()); - } - } - - function testInvalidNumber() - { - $f=new xmlrpcmsg('examples.addtwo',array( - new xmlrpcval('fred', 'int'), - new xmlrpcval("\"; exec('ls')", 'int') - )); - $v=$this->send($f); - /// @todo a fault condition should be generated here - /// by the server, which we pick up on - if($v) - { - $this->assertEquals(0, $v->scalarval()); - } - } - - function testBoolean() - { - $f=new xmlrpcmsg('examples.invertBooleans', array( - new xmlrpcval(array( - new xmlrpcval(true, 'boolean'), - new xmlrpcval(false, 'boolean'), - new xmlrpcval(1, 'boolean'), - new xmlrpcval(0, 'boolean'), - //new xmlrpcval('true', 'boolean'), - //new xmlrpcval('false', 'boolean') - ), - 'array' - ))); - $answer='0101'; - $v=$this->send($f); - if($v) - { - $sz=$v->arraysize(); - $got=''; - for($i=0; $i<$sz; $i++) - { - $b=$v->arraymem($i); - if($b->scalarval()) - { - $got.='1'; - } - else - { - $got.='0'; - } - } - $this->assertEquals($answer, $got); - } - } - - function testBase64() - { - $sendstring='Mary had a little lamb, -Whose fleece was white as snow, -And everywhere that Mary went -the lamb was sure to go. - -Mary had a little lamb -She tied it to a pylon -Ten thousand volts went down its back -And turned it into nylon'; - $f=new xmlrpcmsg('examples.decode64',array( - new xmlrpcval($sendstring, 'base64') - )); - $v=$this->send($f); - if($v) - { - if (strlen($sendstring) == strlen($v->scalarval())) - $this->assertEquals($sendstring, $v->scalarval()); - else - $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendstring), $v->scalarval()); - } - } - - function testDateTime() - { - $time = time(); - $t1 = new xmlrpcval($time, 'dateTime.iso8601'); - $t2 = new xmlrpcval(iso8601_encode($time), 'dateTime.iso8601'); - $this->assertEquals($t1->serialize(), $t2->serialize()); - if (class_exists('DateTime')) - { - $datetime = new DateTime(); - $t3 = new xmlrpcval($datetime->setTimestamp($time), 'dateTime.iso8601'); - $this->assertEquals($t1->serialize(), $t3->serialize()); - } - } - - function testCountEntities() - { - $sendstring = "h'fd>onc>>l>>rw&bpu>q>esend($f); - if($v) - { - $got = ''; - $expected = '37210'; - $expect_array = array('ctLeftAngleBrackets','ctRightAngleBrackets','ctAmpersands','ctApostrophes','ctQuotes'); - while(list(,$val) = each($expect_array)) - { - $b = $v->structmem($val); - $got .= $b->me['int']; - } - $this->assertEquals($expected, $got); - } - } - - function _multicall_msg($method, $params) - { - $struct['methodName'] = new xmlrpcval($method, 'string'); - $struct['params'] = new xmlrpcval($params, 'array'); - return new xmlrpcval($struct, 'struct'); - } - - function testServerMulticall() - { - // We manually construct a system.multicall() call to ensure - // that the server supports it. - - // NB: This test will NOT pass if server does not support system.multicall. - - // Based on http://xmlrpc-c.sourceforge.net/hacks/test_multicall.py - $good1 = $this->_multicall_msg( - 'system.methodHelp', - array(php_xmlrpc_encode('system.listMethods'))); - $bad = $this->_multicall_msg( - 'test.nosuch', - array(php_xmlrpc_encode(1), php_xmlrpc_encode(2))); - $recursive = $this->_multicall_msg( - 'system.multicall', - array(new xmlrpcval(array(), 'array'))); - $good2 = $this->_multicall_msg( - 'system.methodSignature', - array(php_xmlrpc_encode('system.listMethods'))); - $arg = new xmlrpcval( - array($good1, $bad, $recursive, $good2), - 'array' - ); - - $f = new xmlrpcmsg('system.multicall', array($arg)); - $v = $this->send($f); - if($v) - { - //$this->assertTrue($r->faultCode() == 0, "fault from system.multicall"); - $this->assertTrue($v->arraysize() == 4, "bad number of return values"); - - $r1 = $v->arraymem(0); - $this->assertTrue( - $r1->kindOf() == 'array' && $r1->arraysize() == 1, - "did not get array of size 1 from good1" - ); - - $r2 = $v->arraymem(1); - $this->assertTrue( - $r2->kindOf() == 'struct', - "no fault from bad" - ); - - $r3 = $v->arraymem(2); - $this->assertTrue( - $r3->kindOf() == 'struct', - "recursive system.multicall did not fail" - ); - - $r4 = $v->arraymem(3); - $this->assertTrue( - $r4->kindOf() == 'array' && $r4->arraysize() == 1, - "did not get array of size 1 from good2" - ); - } - } - - function testClientMulticall1() - { - // NB: This test will NOT pass if server does not support system.multicall. - - $this->client->no_multicall = false; - - $good1 = new xmlrpcmsg('system.methodHelp', - array(php_xmlrpc_encode('system.listMethods'))); - $bad = new xmlrpcmsg('test.nosuch', - array(php_xmlrpc_encode(1), php_xmlrpc_encode(2))); - $recursive = new xmlrpcmsg('system.multicall', - array(new xmlrpcval(array(), 'array'))); - $good2 = new xmlrpcmsg('system.methodSignature', - array(php_xmlrpc_encode('system.listMethods')) - ); - - $r = $this->send(array($good1, $bad, $recursive, $good2)); - if($r) - { - $this->assertTrue(count($r) == 4, "wrong number of return values"); - } - - $this->assertTrue($r[0]->faultCode() == 0, "fault from good1"); - if(!$r[0]->faultCode()) - { - $val = $r[0]->value(); - $this->assertTrue( - $val->kindOf() == 'scalar' && $val->scalartyp() == 'string', - "good1 did not return string" - ); - } - $this->assertTrue($r[1]->faultCode() != 0, "no fault from bad"); - $this->assertTrue($r[2]->faultCode() != 0, "no fault from recursive system.multicall"); - $this->assertTrue($r[3]->faultCode() == 0, "fault from good2"); - if(!$r[3]->faultCode()) - { - $val = $r[3]->value(); - $this->assertTrue($val->kindOf() == 'array', "good2 did not return array"); - } - // This is the only assert in this test which should fail - // if the test server does not support system.multicall. - $this->assertTrue($this->client->no_multicall == false, - "server does not support system.multicall" - ); - } - - function testClientMulticall2() - { - // NB: This test will NOT pass if server does not support system.multicall. - - $this->client->no_multicall = true; - - $good1 = new xmlrpcmsg('system.methodHelp', - array(php_xmlrpc_encode('system.listMethods'))); - $bad = new xmlrpcmsg('test.nosuch', - array(php_xmlrpc_encode(1), php_xmlrpc_encode(2))); - $recursive = new xmlrpcmsg('system.multicall', - array(new xmlrpcval(array(), 'array'))); - $good2 = new xmlrpcmsg('system.methodSignature', - array(php_xmlrpc_encode('system.listMethods')) - ); - - $r = $this->send(array($good1, $bad, $recursive, $good2)); - if($r) - { - $this->assertTrue(count($r) == 4, "wrong number of return values"); - } - - $this->assertTrue($r[0]->faultCode() == 0, "fault from good1"); - if(!$r[0]->faultCode()) - { - $val = $r[0]->value(); - $this->assertTrue( - $val->kindOf() == 'scalar' && $val->scalartyp() == 'string', - "good1 did not return string"); - } - $this->assertTrue($r[1]->faultCode() != 0, "no fault from bad"); - $this->assertTrue($r[2]->faultCode() == 0, "fault from (non recursive) system.multicall"); - $this->assertTrue($r[3]->faultCode() == 0, "fault from good2"); - if(!$r[3]->faultCode()) - { - $val = $r[3]->value(); - $this->assertTrue($val->kindOf() == 'array', "good2 did not return array"); - } - } - - function testClientMulticall3() - { - // NB: This test will NOT pass if server does not support system.multicall. - - $this->client->return_type = 'phpvals'; - $this->client->no_multicall = false; - - $good1 = new xmlrpcmsg('system.methodHelp', - array(php_xmlrpc_encode('system.listMethods'))); - $bad = new xmlrpcmsg('test.nosuch', - array(php_xmlrpc_encode(1), php_xmlrpc_encode(2))); - $recursive = new xmlrpcmsg('system.multicall', - array(new xmlrpcval(array(), 'array'))); - $good2 = new xmlrpcmsg('system.methodSignature', - array(php_xmlrpc_encode('system.listMethods')) - ); - - $r = $this->send(array($good1, $bad, $recursive, $good2)); - if($r) - { - $this->assertTrue(count($r) == 4, "wrong number of return values"); - } - $this->assertTrue($r[0]->faultCode() == 0, "fault from good1"); - if(!$r[0]->faultCode()) - { - $val = $r[0]->value(); - $this->assertTrue( - is_string($val) , "good1 did not return string"); - } - $this->assertTrue($r[1]->faultCode() != 0, "no fault from bad"); - $this->assertTrue($r[2]->faultCode() != 0, "no fault from recursive system.multicall"); - $this->assertTrue($r[3]->faultCode() == 0, "fault from good2"); - if(!$r[3]->faultCode()) - { - $val = $r[3]->value(); - $this->assertTrue(is_array($val), "good2 did not return array"); - } - $this->client->return_type = 'xmlrpcvals'; - } - - function testCatchWarnings() - { - $f = new xmlrpcmsg('examples.generatePHPWarning', array( - new xmlrpcval('whatever', 'string') - )); - $v = $this->send($f); - if($v) - { - $this->assertEquals($v->scalarval(), true); - } - } - - function testCatchExceptions() - { - global $URI; - $f = new xmlrpcmsg('examples.raiseException', array( - new xmlrpcval('whatever', 'string') - )); - $v = $this->send($f, $GLOBALS['xmlrpcerr']['server_error']); - $this->client->path = $URI.'?EXCEPTION_HANDLING=1'; - $v = $this->send($f, 1); - $this->client->path = $URI.'?EXCEPTION_HANDLING=2'; - $v = $this->send($f, $GLOBALS['xmlrpcerr']['invalid_return']); - } - - function testZeroParams() - { - $f = new xmlrpcmsg('system.listMethods'); - $v = $this->send($f); - } - - function testCodeInjectionServerSide() - { - $f = new xmlrpcmsg('system.MethodHelp'); - $f->payload = "validator1.echoStructTest','')); echo('gotcha!'); die(); //"; - $v = $this->send($f); - //$v = $r->faultCode(); - if ($v) - { - $this->assertEquals(0, $v->structsize()); - } - } - - function testAutoRegisteredFunction() - { - $f=new xmlrpcmsg('examples.php.getStateName',array( - new xmlrpcval(23, 'int') - )); - $v=$this->send($f); - if($v) - { - $this->assertEquals('Michigan', $v->scalarval()); - } - else - { - $this->fail('Note: server can only auto register functions if running with PHP 5.0.3 and up'); - } - } - - function testAutoRegisteredClass() - { - $f=new xmlrpcmsg('examples.php2.getStateName',array( - new xmlrpcval(23, 'int') - )); - $v=$this->send($f); - if($v) - { - $this->assertEquals('Michigan', $v->scalarval()); - $f=new xmlrpcmsg('examples.php3.getStateName',array( - new xmlrpcval(23, 'int') - )); - $v=$this->send($f); - if($v) - { - $this->assertEquals('Michigan', $v->scalarval()); - } - } - else - { - $this->fail('Note: server can only auto register class methods if running with PHP 5.0.3 and up'); - } - } - - function testAutoRegisteredMethod() - { - $func=wrap_xmlrpc_method($this->client, 'examples.getStateName'); - if($func == '') - { - $this->fail('Registration of examples.getStateName failed'); - } - else - { - $v=$func(23); - $this->assertEquals('Michigan', $v); - } - } - - function testGetCookies() - { - // let server set to us some cookies we tell it - $cookies = array( - //'c1' => array(), - 'c2' => array('value' => 'c2'), - 'c3' => array('value' => 'c3', 'expires' => time()+60*60*24*30), - 'c4' => array('value' => 'c4', 'expires' => time()+60*60*24*30, 'path' => '/'), - 'c5' => array('value' => 'c5', 'expires' => time()+60*60*24*30, 'path' => '/', 'domain' => 'localhost'), - ); - $cookiesval = php_xmlrpc_encode($cookies); - $f=new xmlrpcmsg('examples.setcookies',array($cookiesval)); - $r=$this->send($f, 0, true); - if($r) - { - $v = $r->value(); - $this->assertEquals(1, $v->scalarval()); - // now check if we decoded the cookies as we had set them - $rcookies = $r->cookies(); - foreach($cookies as $c => $v) - // format for date string in cookies: 'Mon, 31 Oct 2005 13:50:56 GMT' - // but PHP versions differ on that, some use 'Mon, 31-Oct-2005 13:50:56 GMT'... - if(isset($v['expires'])) - { - if (isset($rcookies[$c]['expires']) && strpos($rcookies[$c]['expires'], '-')) - { - $cookies[$c]['expires'] = gmdate('D, d\-M\-Y H:i:s \G\M\T' ,$cookies[$c]['expires']); - } - else - { - $cookies[$c]['expires'] = gmdate('D, d M Y H:i:s \G\M\T' ,$cookies[$c]['expires']); - } - } - $this->assertEquals($cookies, $rcookies); - } - } - - function testSetCookies() - { - // let server set to us some cookies we tell it - $cookies = array( - 'c0' => null, - 'c1' => 1, - 'c2' => '2 3', - 'c3' => '!@#$%^&*()_+|}{":?><,./\';[]\\=-' - ); - $f=new xmlrpcmsg('examples.getcookies',array()); - foreach ($cookies as $cookie => $val) - { - $this->client->setCookie($cookie, $val); - $cookies[$cookie] = (string) $cookies[$cookie]; - } - $r = $this->client->send($f, $this->timeout, $this->method); - $this->assertEquals($r->faultCode(), 0, 'Error '.$r->faultCode().' connecting to server: '.$r->faultString()); - if(!$r->faultCode()) - { - $v = $r->value(); - $v = php_xmlrpc_decode($v); - // on IIS and Apache getallheaders returns something slightly different... - $this->assertEquals($v, $cookies); - } - } - - function testSendTwiceSameMsg() - { - $f=new xmlrpcmsg('examples.stringecho', array( - new xmlrpcval('hello world', 'string') - )); - $v1 = $this->send($f); - $v2 = $this->send($f); - //$v = $r->faultCode(); - if ($v1 && $v2) - { - $this->assertEquals($v2, $v1); - } - } - } - - class LocalHostMultiTests extends LocalhostTests - { - function _runtests() - { - global $failed_tests; - foreach(get_class_methods('LocalhostTests') as $meth) - { - if(strpos($meth, 'test') === 0 && $meth != 'testHttps' && $meth != 'testCatchExceptions') - { - if (!isset($failed_tests[$meth])) - $this->$meth(); - } - if ($this->_failed) - { - break; - } - } - } - - function testDeflate() - { - if(!function_exists('gzdeflate')) - { - $this->fail('Zlib missing: cannot test deflate functionality'); - return; - } - $this->client->accepted_compression = array('deflate'); - $this->client->request_compression = 'deflate'; - $this->_runtests(); - } - - function testGzip() - { - if(!function_exists('gzdeflate')) - { - $this->fail('Zlib missing: cannot test gzip functionality'); - return; - } - $this->client->accepted_compression = array('gzip'); - $this->client->request_compression = 'gzip'; - $this->_runtests(); - } - - function testKeepAlives() - { - if(!function_exists('curl_init')) - { - $this->fail('CURL missing: cannot test http 1.1'); - return; - } - $this->method = 'http11'; - $this->client->keepalive = true; - $this->_runtests(); - } - - function testProxy() - { - global $PROXYSERVER, $PROXYPORT; - if ($PROXYSERVER) - { - $this->client->setProxy($PROXYSERVER, $PROXYPORT); - $this->_runtests(); - } - else - $this->fail('PROXY definition missing: cannot test proxy'); - } - - function testHttp11() - { - if(!function_exists('curl_init')) - { - $this->fail('CURL missing: cannot test http 1.1'); - return; - } - $this->method = 'http11'; // not an error the double assignment! - $this->client->method = 'http11'; - //$this->client->verifyhost = 0; - //$this->client->verifypeer = 0; - $this->client->keepalive = false; - $this->_runtests(); - } - - function testHttp11Gzip() - { - if(!function_exists('curl_init')) - { - $this->fail('CURL missing: cannot test http 1.1'); - return; - } - $this->method = 'http11'; // not an error the double assignment! - $this->client->method = 'http11'; - $this->client->keepalive = false; - $this->client->accepted_compression = array('gzip'); - $this->client->request_compression = 'gzip'; - $this->_runtests(); - } - - function testHttp11Deflate() - { - if(!function_exists('curl_init')) - { - $this->fail('CURL missing: cannot test http 1.1'); - return; - } - $this->method = 'http11'; // not an error the double assignment! - $this->client->method = 'http11'; - $this->client->keepalive = false; - $this->client->accepted_compression = array('deflate'); - $this->client->request_compression = 'deflate'; - $this->_runtests(); - } - - function testHttp11Proxy() - { - global $PROXYSERVER, $PROXYPORT; - if(!function_exists('curl_init')) - { - $this->fail('CURL missing: cannot test http 1.1 w. proxy'); - return; - } - else if ($PROXYSERVER == '') - { - $this->fail('PROXY definition missing: cannot test proxy w. http 1.1'); - return; - } - $this->method = 'http11'; // not an error the double assignment! - $this->client->method = 'http11'; - $this->client->setProxy($PROXYSERVER, $PROXYPORT); - //$this->client->verifyhost = 0; - //$this->client->verifypeer = 0; - $this->client->keepalive = false; - $this->_runtests(); - } - - function testHttps() - { - global $HTTPSSERVER, $HTTPSURI; - if(!function_exists('curl_init')) - { - $this->fail('CURL missing: cannot test https functionality'); - return; - } - $this->client->server = $HTTPSSERVER; - $this->method = 'https'; - $this->client->method = 'https'; - $this->client->path = $HTTPSURI; - $this->_runtests(); - } - - function testHttpsProxy() - { - global $HTTPSSERVER, $HTTPSURI, $PROXYSERVER, $PROXYPORT;; - if(!function_exists('curl_init')) - { - $this->fail('CURL missing: cannot test https functionality'); - return; - } - else if ($PROXYSERVER == '') - { - $this->fail('PROXY definition missing: cannot test proxy w. http 1.1'); - return; - } - $this->client->server = $HTTPSSERVER; - $this->method = 'https'; - $this->client->method = 'https'; - $this->client->setProxy($PROXYSERVER, $PROXYPORT); - $this->client->path = $HTTPSURI; - $this->_runtests(); - } - - function testUTF8Responses() - { - global $URI; - //$this->client->path = strpos($URI, '?') === null ? $URI.'?RESPONSE_ENCODING=UTF-8' : $URI.'&RESPONSE_ENCODING=UTF-8'; - $this->client->path = $URI.'?RESPONSE_ENCODING=UTF-8'; - $this->_runtests(); - } - - function testUTF8Requests() - { - $this->client->request_charset_encoding = 'UTF-8'; - $this->_runtests(); - } - - function testISOResponses() - { - global $URI; - //$this->client->path = strpos($URI, '?') === null ? $URI.'?RESPONSE_ENCODING=UTF-8' : $URI.'&RESPONSE_ENCODING=UTF-8'; - $this->client->path = $URI.'?RESPONSE_ENCODING=ISO-8859-1'; - $this->_runtests(); - } - - function testISORequests() - { - $this->client->request_charset_encoding = 'ISO-8859-1'; - $this->_runtests(); - } - } - - class ParsingBugsTests extends PHPUnit_TestCase - { - function testMinusOneString() - { - $v=new xmlrpcval('-1'); - $u=new xmlrpcval('-1', 'string'); - $this->assertEquals($u->scalarval(), $v->scalarval()); - } - - function testUnicodeInMemberName(){ - $v = array('Gnter, Elne' => new xmlrpcval(1)); - $r = new xmlrpcresp(new xmlrpcval($v, 'struct')); - $r = $r->serialize(); - $m = new xmlrpcmsg('dummy'); - $r = $m->parseResponse($r); - $v = $r->value(); - $this->assertEquals($v->structmemexists('Gnter, Elne'), true); - } - - function testUnicodeInErrorString() - { - $response = utf8_encode( -' - - - - - - - - -faultCode -888 - - -faultString -àüè - - - - -'); - $m=new xmlrpcmsg('dummy'); - $r=$m->parseResponse($response); - $v=$r->faultString(); - $this->assertEquals('', $v); - } - - function testValidNumbers() - { - $m=new xmlrpcmsg('dummy'); - $fp= -' - - - - - - -integer1 -01 - - -float1 -01.10 - - -integer2 -+1 - - -float2 -+1.10 - - -float3 --1.10e2 - - - - - -'; - $r=$m->parseResponse($fp); - $v=$r->value(); - $s=$v->structmem('integer1'); - $t=$v->structmem('float1'); - $u=$v->structmem('integer2'); - $w=$v->structmem('float2'); - $x=$v->structmem('float3'); - $this->assertEquals(1, $s->scalarval()); - $this->assertEquals(1.1, $t->scalarval()); - $this->assertEquals(1, $u->scalarval()); - $this->assertEquals(1.1, $w->scalarval()); - $this->assertEquals(-110.0, $x->scalarval()); - } - - function testAddScalarToStruct() - { - $v=new xmlrpcval(array('a' => 'b'), 'struct'); - // use @ operator in case error_log gets on screen - $r= @$v->addscalar('c'); - $this->assertEquals(0, $r); - } - - function testAddStructToStruct() - { - $v=new xmlrpcval(array('a' => new xmlrpcval('b')), 'struct'); - $r=$v->addstruct(array('b' => new xmlrpcval('c'))); - $this->assertEquals(2, $v->structsize()); - $this->assertEquals(1, $r); - $r=$v->addstruct(array('b' => new xmlrpcval('b'))); - $this->assertEquals(2, $v->structsize()); - } - - function testAddArrayToArray() - { - $v=new xmlrpcval(array(new xmlrpcval('a'), new xmlrpcval('b')), 'array'); - $r=$v->addarray(array(new xmlrpcval('b'), new xmlrpcval('c'))); - $this->assertEquals(4, $v->arraysize()); - $this->assertEquals(1, $r); - } - - function testEncodeArray() - { - $r=range(1, 100); - $v = php_xmlrpc_encode($r); - $this->assertEquals('array', $v->kindof()); - } - - function testEncodeRecursive() - { - $v = php_xmlrpc_encode(php_xmlrpc_encode('a simple string')); - $this->assertEquals('scalar', $v->kindof()); - } - - function testBrokenRequests() - { - $s = new xmlrpc_server(); -// omitting the 'params' tag: not tolerated by the lib anymore -$f = ' - -system.methodHelp - -system.methodHelp - -'; - $r = $s->parserequest($f); - $this->assertEquals(15, $r->faultCode()); -// omitting a 'param' tag -$f = ' - -system.methodHelp - -system.methodHelp - -'; - $r = $s->parserequest($f); - $this->assertEquals(15, $r->faultCode()); -// omitting a 'value' tag -$f = ' - -system.methodHelp - -system.methodHelp - -'; - $r = $s->parserequest($f); - $this->assertEquals(15, $r->faultCode()); - } - - function testBrokenResponses() - { - $m=new xmlrpcmsg('dummy'); - //$m->debug = 1; -// omitting the 'params' tag: no more tolerated by the lib... -$f = ' - - -system.methodHelp - -'; - $r = $m->parseResponse($f); - $this->assertEquals(2, $r->faultCode()); -// omitting the 'param' tag: no more tolerated by the lib... -$f = ' - - -system.methodHelp - -'; - $r = $m->parseResponse($f); - $this->assertEquals(2, $r->faultCode()); -// omitting a 'value' tag: KO -$f = ' - - -system.methodHelp - -'; - $r = $m->parseResponse($f); - $this->assertEquals(2, $r->faultCode()); - } - - function testBuggyHttp() - { - $s = new xmlrpcmsg('dummy'); -$f = 'HTTP/1.1 100 Welcome to the jungle - -HTTP/1.0 200 OK -X-Content-Marx-Brothers: Harpo - Chico and Groucho -Content-Length: who knows? - - - - - -userid311127 -dateCreated20011126T09:17:52contenthello world. 2 newlines follow - - -and there they were.postid7414222 - - '; - $r = $s->parseResponse($f); - $v = $r->value(); - $s = $v->structmem('content'); - $this->assertEquals("hello world. 2 newlines follow\n\n\nand there they were.", $s->scalarval()); - } - - function testStringBug() - { - $s = new xmlrpcmsg('dummy'); -$f = ' - - - - - - - - -success - -1 - - - -sessionID - -S300510007I - - - - - - - '; - $r = $s->parseResponse($f); - $v = $r->value(); - $s = $v->structmem('sessionID'); - $this->assertEquals('S300510007I', $s->scalarval()); - } - - function testWhiteSpace() - { - $s = new xmlrpcmsg('dummy'); -$f = 'userid311127 -dateCreated20011126T09:17:52contenthello world. 2 newlines follow - - -and there they were.postid7414222 -'; - $r = $s->parseResponse($f); - $v = $r->value(); - $s = $v->structmem('content'); - $this->assertEquals("hello world. 2 newlines follow\n\n\nand there they were.", $s->scalarval()); - } - - function testDoubleDataInArrayTag() - { - $s = new xmlrpcmsg('dummy'); -$f = ' - - - -'; - $r = $s->parseResponse($f); - $v = $r->faultCode(); - $this->assertEquals(2, $v); -$f = ' -Hello world - - -'; - $r = $s->parseResponse($f); - $v = $r->faultCode(); - $this->assertEquals(2, $v); - } - - function testDoubleStuffInValueTag() - { - $s = new xmlrpcmsg('dummy'); -$f = ' -hello world - - -'; - $r = $s->parseResponse($f); - $v = $r->faultCode(); - $this->assertEquals(2, $v); -$f = ' -hello -world - -'; - $r = $s->parseResponse($f); - $v = $r->faultCode(); - $this->assertEquals(2, $v); -$f = ' -hello -hello>world - -'; - $r = $s->parseResponse($f); - $v = $r->faultCode(); - $this->assertEquals(2, $v); - } - - function testAutodecodeResponse() - { - $s = new xmlrpcmsg('dummy'); -$f = 'userid311127 -dateCreated20011126T09:17:52contenthello world. 2 newlines follow - - -and there they were.postid7414222 -'; - $r = $s->parseResponse($f, true, 'phpvals'); - $v = $r->value(); - $s = $v['content']; - $this->assertEquals("hello world. 2 newlines follow\n\n\nand there they were.", $s); - } - - function testNoDecodeResponse() - { - $s = new xmlrpcmsg('dummy'); -$f = 'userid311127 -dateCreated20011126T09:17:52contenthello world. 2 newlines follow - - -and there they were.postid7414222'; - $r = $s->parseResponse($f, true, 'xml'); - $v = $r->value(); - $this->assertEquals($f, $v); - } - - function testAutoCoDec() - { - $data1 = array(1, 1.0, 'hello world', true, '20051021T23:43:00', -1, 11.0, '~!@#$%^&*()_+|', false, '20051021T23:43:00'); - $data2 = array('zero' => $data1, 'one' => $data1, 'two' => $data1, 'three' => $data1, 'four' => $data1, 'five' => $data1, 'six' => $data1, 'seven' => $data1, 'eight' => $data1, 'nine' => $data1); - $data = array($data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2); - //$keys = array('zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'); - $v1 = php_xmlrpc_encode($data, array('auto_dates')); - $v2 = php_xmlrpc_decode_xml($v1->serialize()); - $this->assertEquals($v1, $v2); - $r1 = new xmlrpcresp($v1); - $r2 = php_xmlrpc_decode_xml($r1->serialize()); - $r2->serialize(); // needed to set internal member payload - $this->assertEquals($r1, $r2); - $m1 = new xmlrpcmsg('hello dolly', array($v1)); - $m2 = php_xmlrpc_decode_xml($m1->serialize()); - $m2->serialize(); // needed to set internal member payload - $this->assertEquals($m1, $m2); - } - - function testUTF8Request() - { - $sendstring='κόσμε'; // Greek word 'kosme'. NB: NOT a valid ISO8859 string! - $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8'; - $f = new xmlrpcval($sendstring, 'string'); - $v=$f->serialize(); - $this->assertEquals("κόσμε\n", $v); - $GLOBALS['xmlrpc_internalencoding'] = 'ISO-8859-1'; - } - - function testUTF8Response() - { - $s = new xmlrpcmsg('dummy'); -$f = "HTTP/1.1 200 OK\r\nContent-type: text/xml; charset=UTF-8\r\n\r\n".'userid311127 -dateCreated20011126T09:17:52content'.utf8_encode('').'postid7414222 -'; - $r = $s->parseResponse($f, false, 'phpvals'); - $v = $r->value(); - $v = $v['content']; - $this->assertEquals("", $v); -$f = 'userid311127 -dateCreated20011126T09:17:52content'.utf8_encode('').'postid7414222 -'; - $r = $s->parseResponse($f, false, 'phpvals'); - $v = $r->value(); - $v = $v['content']; - $this->assertEquals("", $v); - } - - function testUTF8IntString() - { - $v=new xmlrpcval(100, 'int'); - $s=$v->serialize('UTF-8'); - $this->assertequals("100\n", $s); - } - - function testStringInt() - { - $v=new xmlrpcval('hello world', 'int'); - $s=$v->serialize(); - $this->assertequals("0\n", $s); - } - - function testStructMemExists() - { - $v=php_xmlrpc_encode(array('hello' => 'world')); - $b=$v->structmemexists('hello'); - $this->assertequals(true, $b); - $b=$v->structmemexists('world'); - $this->assertequals(false, $b); - } - - function testNilvalue() - { - // default case: we do not accept nil values received - $v = new xmlrpcval('hello', 'null'); - $r = new xmlrpcresp($v); - $s = $r->serialize(); - $m = new xmlrpcmsg('dummy'); - $r = $m->parseresponse($s); - $this->assertequals(2, $r->faultCode()); - // enable reception of nil values - $GLOBALS['xmlrpc_null_extension'] = true; - $r = $m->parseresponse($s); - $v = $r->value(); - $this->assertequals('null', $v->scalartyp()); - // test with the apache version: EX:NIL - $GLOBALS['xmlrpc_null_apache_encoding'] = true; - // serialization - $v = new xmlrpcval('hello', 'null'); - $s = $v->serialize(); - $this->assertequals(1, preg_match( '##', $s )); - // deserialization - $r = new xmlrpcresp($v); - $s = $r->serialize(); - $r = $m->parseresponse($s); - $v = $r->value(); - $this->assertequals('null', $v->scalartyp()); - $GLOBALS['xmlrpc_null_extension'] = false; - $r = $m->parseresponse($s); - $this->assertequals(2, $r->faultCode()); - } - - function TestLocale() - { - $locale = setlocale(LC_NUMERIC,0); - if ( setlocale(LC_NUMERIC,'deu', 'de_DE@euro', 'de_DE', 'de', 'ge') !== false ) - { - $v = new xmlrpcval(1.1,'double'); - $r = $v->serialize(); - $this->assertequals(false, strpos($r,',')); - $this->assertequals(1, strpos($v->scalarval(),',')); - setlocale(LC_NUMERIC,$locale); - } - } - } - - class InvalidHostTests extends PHPUnit_TestCase - { - var $client = null; - - function setUp() - { - global $DEBUG,$LOCALSERVER; - $this->client=new xmlrpc_client('/NOTEXIST.php', $LOCALSERVER, 80); - if($DEBUG) - { - $this->client->setDebug($DEBUG); - } - } - - function test404() - { - $f = new xmlrpcmsg('examples.echo',array( - new xmlrpcval('hello', 'string') - )); - $r = $this->client->send($f, 5); - $this->assertEquals(5, $r->faultCode()); - } - - function testSrvNotFound() - { - $f = new xmlrpcmsg('examples.echo',array( - new xmlrpcval('hello', 'string') - )); - $this->client->server .= 'XXX'; - $r = $this->client->send($f, 5); - $this->assertEquals(5, $r->faultCode()); - } - - function testCurlKAErr() - { - global $LOCALSERVER, $URI; - if(!function_exists('curl_init')) - { - $this->fail('CURL missing: cannot test curl keepalive errors'); - return; - } - $f = new xmlrpcmsg('examples.stringecho',array( - new xmlrpcval('hello', 'string') - )); - // test 2 calls w. keepalive: 1st time connection ko, second time ok - $this->client->server .= 'XXX'; - $this->client->keepalive = true; - $r = $this->client->send($f, 5, 'http11'); - $this->assertEquals(8, $r->faultCode()); - - // now test a successful connection - $server = explode(':', $LOCALSERVER); - if(count($server) > 1) - { - $this->client->port = $server[1]; - } - $this->client->server = $server[0]; - $this->client->path = $URI; - - $r = $this->client->send($f, 5, 'http11'); - $ro = $r->value(); - $this->assertEquals('hello', $ro->scalarVal()); - } - } - - - $suite->addTest(new LocalhostTests('testString')); - $suite->addTest(new LocalhostTests('testAdding')); - $suite->addTest(new LocalhostTests('testAddingDoubles')); - $suite->addTest(new LocalhostTests('testInvalidNumber')); - $suite->addTest(new LocalhostTests('testBoolean')); - $suite->addTest(new LocalhostTests('testCountEntities')); - $suite->addTest(new LocalhostTests('testBase64')); - $suite->addTest(new LocalhostTests('testDateTime')); - $suite->addTest(new LocalhostTests('testServerMulticall')); - $suite->addTest(new LocalhostTests('testClientMulticall1')); - $suite->addTest(new LocalhostTests('testClientMulticall2')); - $suite->addTest(new LocalhostTests('testClientMulticall3')); - $suite->addTest(new LocalhostTests('testCatchWarnings')); - $suite->addTest(new LocalhostTests('testCatchExceptions')); - $suite->addTest(new LocalhostTests('testZeroParams')); - $suite->addTest(new LocalhostTests('testCodeInjectionServerSide')); - $suite->addTest(new LocalhostTests('testAutoRegisteredFunction')); - $suite->addTest(new LocalhostTests('testAutoRegisteredMethod')); - $suite->addTest(new LocalhostTests('testSetCookies')); - $suite->addTest(new LocalhostTests('testGetCookies')); - $suite->addTest(new LocalhostTests('testSendTwiceSameMsg')); - - $suite->addTest(new LocalhostMultiTests('testUTF8Requests')); - $suite->addTest(new LocalhostMultiTests('testUTF8Responses')); - $suite->addTest(new LocalhostMultiTests('testISORequests')); - $suite->addTest(new LocalhostMultiTests('testISOResponses')); - $suite->addTest(new LocalhostMultiTests('testGzip')); - $suite->addTest(new LocalhostMultiTests('testDeflate')); - $suite->addTest(new LocalhostMultiTests('testProxy')); - $suite->addTest(new LocalhostMultiTests('testHttp11')); - $suite->addTest(new LocalhostMultiTests('testHttp11Gzip')); - $suite->addTest(new LocalhostMultiTests('testHttp11Deflate')); - $suite->addTest(new LocalhostMultiTests('testKeepAlives')); - $suite->addTest(new LocalhostMultiTests('testHttp11Proxy')); - $suite->addTest(new LocalhostMultiTests('testHttps')); - $suite->addTest(new LocalhostMultiTests('testHttpsProxy')); - - $suite->addTest(new InvalidHostTests('test404')); - //$suite->addTest(new InvalidHostTests('testSrvNotFound')); - $suite->addTest(new InvalidHostTests('testCurlKAErr')); - - $suite->addTest(new ParsingBugsTests('testMinusOneString')); - $suite->addTest(new ParsingBugsTests('testUnicodeInMemberName')); - $suite->addTest(new ParsingBugsTests('testUnicodeInErrorString')); - $suite->addTest(new ParsingBugsTests('testValidNumbers')); - $suite->addTest(new ParsingBugsTests('testAddScalarToStruct')); - $suite->addTest(new ParsingBugsTests('testAddStructToStruct')); - $suite->addTest(new ParsingBugsTests('testAddArrayToArray')); - $suite->addTest(new ParsingBugsTests('testEncodeArray')); - $suite->addTest(new ParsingBugsTests('testEncodeRecursive')); - $suite->addTest(new ParsingBugsTests('testBrokenrequests')); - $suite->addTest(new ParsingBugsTests('testBrokenresponses')); - $suite->addTest(new ParsingBugsTests('testBuggyHttp')); - $suite->addTest(new ParsingBugsTests('testStringBug')); - $suite->addTest(new ParsingBugsTests('testWhiteSpace')); - $suite->addTest(new ParsingBugsTests('testAutodecodeResponse')); - $suite->addTest(new ParsingBugsTests('testNoDecodeResponse')); - $suite->addTest(new ParsingBugsTests('testAutoCoDec')); - $suite->addTest(new ParsingBugsTests('testUTF8Response')); - $suite->addTest(new ParsingBugsTests('testUTF8Request')); - $suite->addTest(new ParsingBugsTests('testUTF8IntString')); - $suite->addTest(new ParsingBugsTests('testStringInt')); - $suite->addTest(new ParsingBugsTests('testStructMemExists')); - $suite->addTest(new ParsingBugsTests('testDoubleDataInArrayTag')); - $suite->addTest(new ParsingBugsTests('testDoubleStuffInValueTag')); - $suite->addTest(new ParsingBugsTests('testNilValue')); - $suite->addTest(new ParsingBugsTests('testLocale')); - - $title = 'XML-RPC Unit Tests'; - - if(isset($only)) - { - $suite = new PHPUnit_TestSuite($only); - } - - if(isset($_SERVER['REQUEST_METHOD'])) - { - echo "\n\n\n$title\n\n\n

    $title

    \n"; - } - else - { - echo "$title\n\n"; - } - - if(isset($_SERVER['REQUEST_METHOD'])) - { - echo "

    Using lib version: $xmlrpcVersion on PHP version: ".phpversion()."

    \n"; - echo '

    Running '.$suite->testCount().' tests (some of which are multiple) against servers: http://'.htmlspecialchars($LOCALSERVER.$URI).' and https://'.htmlspecialchars($HTTPSSERVER.$HTTPSURI)."\n ...

    \n"; - flush(); - @ob_flush(); - } - else - { - echo "Using lib version: $xmlrpcVersion on PHP version: ".phpversion()."\n"; - echo 'Running '.$suite->testCount().' tests (some of which are multiple) against servers: http://'.$LOCALSERVER.$URI.' and https://'.$HTTPSSERVER.$HTTPSURI."\n\n"; - } - - // do some basic timing measurement - list($micro, $sec) = explode(' ', microtime()); - $start_time = $sec + $micro; - - $PHPUnit = new PHPUnit; - $result = $PHPUnit->run($suite, ($DEBUG == 0 ? '.' : '
    ')); - - list($micro, $sec) = explode(' ', microtime()); - $end_time = $sec + $micro; - - if(!isset($_SERVER['REQUEST_METHOD'])) - { - echo $result->toString()."\n"; - } - - if(isset($_SERVER['REQUEST_METHOD'])) - { - echo '

    '.$result->failureCount()." test failures

    \n"; - printf("Time spent: %.2f secs
    \n", $end_time - $start_time); - } - else - { - echo $result->failureCount()." test failures\n"; - printf("Time spent: %.2f secs\n", $end_time - $start_time); - } - - if($result->failureCount() && !$DEBUG) - { - $target = strpos($_SERVER['PHP_SELF'], '?') ? $_SERVER['PHP_SELF'].'&DEBUG=1' : $_SERVER['PHP_SELF'].'?DEBUG=1'; - $t2 = strpos($_SERVER['PHP_SELF'], '?') ? $_SERVER['PHP_SELF'].'&DEBUG=2' : $_SERVER['PHP_SELF'].'?DEBUG=2'; - if(isset($_SERVER['REQUEST_METHOD'])) - { - echo '

    Run testsuite with DEBUG=1 to have more detail about tests results. Or with DEBUG=2 for even more.

    '."\n"; - } - else - { - echo "Run testsuite with DEBUG=1 (or 2) to have more detail about tests results\n"; - } - } - - if(isset($_SERVER['REQUEST_METHOD'])) - { -?> -More options... - -toHTML()."\n\n\n"; - } -?> \ No newline at end of file diff --git a/include/limesurvey/admin/classes/xmlrpc/test/verify_compat.php b/include/limesurvey/admin/classes/xmlrpc/test/verify_compat.php deleted file mode 100644 index 0a3c4626..00000000 --- a/include/limesurvey/admin/classes/xmlrpc/test/verify_compat.php +++ /dev/null @@ -1,183 +0,0 @@ - - - - -PHP XMLRPC compatibility assessment - - - -

    PHPXMLRPC compatibility assessment with the current PHP install

    -

    For phpxmlrpc version 3.0 or later

    -

    Server usage

    - - - - - - $result) - { - echo '\n"; - } -?> - -
    TestResult
    '.htmlspecialchars($test).''.htmlspecialchars($result['description'])."
    -

    Client usage

    - - - - - - $result) - { - echo '\n"; - } -?> - -
    TestResult
    '.htmlspecialchars($test).''.htmlspecialchars($result['description'])."
    - - \ No newline at end of file diff --git a/include/limesurvey/admin/cmdline_importsurvey.php b/include/limesurvey/admin/cmdline_importsurvey.php deleted file mode 100644 index 64f0cdfc..00000000 --- a/include/limesurvey/admin/cmdline_importsurvey.php +++ /dev/null @@ -1,99 +0,0 @@ - - -This is a command line LimeSurvey Survey importer. Usage: php - - -[ - - -] - - -has to be a LimeSurvey survey dump. - -and - -are only required if the control access is active With the --help, --help, -h, or -? options, you can get this help. - - 2)? $argv[2] : ""; - $userpass = ($argc>3)? $argv[3] : ""; -} - -if (!file_exists($the_full_file_path)) { - echo "\nThe file $the_full_file_path does not exist\n"; - exit; -} - -$_SERVER['SERVER_NAME'] = ""; // just to avoid notices -$_SERVER['SERVER_SOFTWARE'] = ""; // just to avoid notices -require_once(dirname(__FILE__).'/../config-defaults.php'); -require_once(dirname(__FILE__).'/../common.php'); - -if (isset($_REQUEST['homedir'])) {die('');} -require_once($homedir."/classes/core/sha256.php"); -$adminoutput =""; // just to avoid notices -include("database.php"); -$query = "SELECT uid, password, lang FROM ".db_table_name('users')." WHERE users_name=".$connect->qstr($username); -$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; -$result = $connect->SelectLimit($query, 1) or die ($query."\n".$connect->ErrorMsg()); -if ($result->RecordCount() < 1) -{ - // wrong or unknown username and/or email - echo "\n".$clang->gT("User name invalid!")."\n"; - exit; -} -else -{ - $fields = $result->FetchRow(); - if (SHA256::hashing($userpass) == $fields['password']) - { - $_SESSION['loginID'] = intval($fields['uid']); - $clang = new limesurvey_lang($fields['lang']); - - GetSessionUserRights($_SESSION['loginID']); - if (!$_SESSION['USER_RIGHT_CREATE_SURVEY']) - { - // no permission to create survey! - echo "\n".$clang->gT("You are not allowed to import a survey!")."\n"; - exit; - } - } - else - { - // password don't match username - echo "\n".$clang->gT("User name and password do not match!")."\n"; - exit; - } -} - -echo "\n"; - -$importsurvey = ""; - -$importingfrom = "cmdline"; // "http" for the web version and "cmdline" for the command line version -include("importsurvey.php"); - -?> diff --git a/include/limesurvey/admin/conditionshandling.php b/include/limesurvey/admin/conditionshandling.php deleted file mode 100644 index 9c8659e3..00000000 --- a/include/limesurvey/admin/conditionshandling.php +++ /dev/null @@ -1,2130 +0,0 @@ - $val) - { - $p_canswers[$key]= preg_replace("/[^_.a-zA-Z0-9]@/", "", $val); - } - } -} - -// this array will be used soon, -// to explain wich conditions is used to evaluate the question -if (isset($stringcomparizonoperators) && $stringcomparizonoperators == 1) -{ - $method = array( - "<" => $clang->gT("Less than"), - "<=" => $clang->gT("Less than or equal to"), - "==" => $clang->gT("equals"), - "!=" => $clang->gT("Not equal to"), - ">=" => $clang->gT("Greater than or equal to"), - ">" => $clang->gT("Greater than"), - "RX" => $clang->gT("Regular expression"), - "a $clang->gT("Less than (Strings)"), - "a<=b" => $clang->gT("Less than or equal to (Strings)"), - "a>=b" => $clang->gT("Greater than or equal to (Strings)"), - "a>b" => $clang->gT("Greater than (Strings)") - ); -} -else -{ - $method = array( - "<" => $clang->gT("Less than"), - "<=" => $clang->gT("Less than or equal to"), - "==" => $clang->gT("equals"), - "!=" => $clang->gT("Not equal to"), - ">=" => $clang->gT("Greater than or equal to"), - ">" => $clang->gT("Greater than"), - "RX" => $clang->gT("Regular expression") - ); -} - -if (isset($_POST['method'])) -{ - if (!in_array($_POST['method'], array_keys($method))) - { - $p_method = "=="; - } - else - { - $p_method = trim ($_POST['method']); - } -} - - -if (isset($_POST['newscenarionum'])) -{ - $p_newscenarionum = sanitize_int($_POST['newscenarionum']); -} -//END Sanitizing POSTed data - -include_once("login_check.php"); -include_once("database.php"); -// Caution (lemeur): database.php uses auto_unescape on all entries in $_POST -// Take care to not use auto_unescape on $_POST variables after this - - -//MAKE SURE THAT THERE IS A SID -if (!isset($surveyid) || !$surveyid) -{ - $conditionsoutput = "
    ".$clang->gT("Conditions manager")."
    \n" - ."
    \n" - ."\t
    ".$clang->gT("Error")."

    " - .$clang->gT("You have not selected a survey")."

    " - ."
    \n" - ."
    \n"; - return; -} - -//MAKE SURE THAT THERE IS A QID -if (!isset($qid) || !$qid) -{ - $conditionsoutput = "
    ".$clang->gT("Conditions manager")."
    \n" - ."
    \n" - ."\t
    ".$clang->gT("Error")."

    " - .$clang->gT("You have not selected a question")."

    " - ."
    \n" - ."
    \n"; - return; -} - - -// If we made it this far, then lets develop the menu items -// add the conditions container table - -$extraGetParams =""; -if (isset($qid) && isset($gid)) -{ - $extraGetParams="&gid=$gid&qid=$qid"; -} - -$conditionsoutput_header = "\n" -."\n"; - -//Now display the information and forms -//BEGIN: PREPARE JAVASCRIPT TO SHOW MATCHING ANSWERS TO SELECTED QUESTION -$conditionsoutput_main_content .= "\n"; - -$conditionsoutput_main_content .= "\n"; -//END: PREPARE JAVASCRIPT TO SHOW MATCHING ANSWERS TO SELECTED QUESTION - -//BEGIN DISPLAY CONDITIONS FOR THIS QUESTION -if ($subaction=='' || -$subaction=='editconditionsform' || $subaction=='insertcondition' || -$subaction == "editthiscondition" || $subaction == "delete" || -$subaction == "updatecondition" || $subaction == "deletescenario" || -$subaction == "renumberscenarios" || $subaction == "deleteallconditions" || -$subaction == "updatescenario" || -$subaction=='copyconditionsform' || $subaction=='copyconditions') -{ - $conditionsoutput_main_content .= "\n"; -} -//END DISPLAY CONDITIONS FOR THIS QUESTION - - -// Separator -$conditionsoutput_main_content .= "\t\n"; - - -// BEGIN: DISPLAY THE COPY CONDITIONS FORM -if ($subaction == "copyconditionsform" || $subaction == "copyconditions") -{ - $conditionsoutput_main_content .= "\n"; - -} -// END: DISPLAY THE COPY CONDITIONS FORM - -if ( isset($cquestions) ) -{ - if ( count($cquestions) > 0 && count($cquestions) <=10) - { - $qcount = count($cquestions); - } - else - { - $qcount = 9; - } -} -else -{ - $qcount = 0; -} - - -//BEGIN: DISPLAY THE ADD or EDIT CONDITION FORM -if ($subaction == "editconditionsform" || $subaction == "insertcondition" || -$subaction == "updatecondition" || $subaction == "deletescenario" || -$subaction == "renumberscenarios" || $subaction == "deleteallconditions" || -$subaction == "updatescenario" || -$subaction == "editthiscondition" || $subaction == "delete") -{ - $conditionsoutput_main_content .= "\n"; -} -//END: DISPLAY THE ADD or EDIT CONDITION FORM - - -$conditionsoutput_main_content .= "
    \n"; - - -$conditionsoutput_menubar = ""; // will be defined later when we have enough information about the questions -$conditionsoutput_action_error = ""; // defined during the actions -$conditionsoutput_main_content = ""; // everything after the menubar - -$markcidarray=Array(); -if (isset($_GET['markcid'])) -{ - $markcidarray=explode("-",$_GET['markcid']); -} - - -//BEGIN PROCESS ACTIONS -// ADD NEW ENTRY IF THIS IS AN ADD -if (isset($p_subaction) && $p_subaction == "insertcondition") -{ - if ((!isset($p_canswers) && - !isset($_POST['ConditionConst']) && - !isset($_POST['prevQuestionSGQA']) && - !isset($_POST['tokenAttr']) && - !isset($_POST['ConditionRegexp'])) || - (!isset($p_cquestions) && !isset($p_csrctoken))) - { - $conditionsoutput_action_error .= "\n"; - } - else - { - if (isset($p_cquestions) && $p_cquestions != '') - { - $conditionCfieldname=$p_cquestions; - } - elseif(isset($p_csrctoken) && $p_csrctoken != '') - { - $conditionCfieldname=$p_csrctoken; - } - - if (isset($p_canswers)) - { - foreach ($p_canswers as $ca) - { - //First lets make sure there isn't already an exact replica of this condition - $query = "SELECT * FROM {$dbprefix}conditions\n" - ."WHERE qid='$qid'\n" - ."AND scenario='".$p_scenario."'\n" - ."AND cqid='".$p_cqid."'\n" - ."AND cfieldname='".$conditionCfieldname."'\n" - ."AND method='".$p_method."'\n" - ."AND value='".$ca."'"; - $result = $connect->Execute($query) or safe_die("Couldn't check for existing condition
    $query
    ".$connect->ErrorMsg()); - $count_caseinsensitivedupes = $result->RecordCount(); - - if ($count_caseinsensitivedupes == 0) - { - $query = "INSERT INTO {$dbprefix}conditions (qid, scenario, cqid, cfieldname, method, value) VALUES " - . "('{$qid}', '{$p_scenario}', '{$p_cqid}', '{$conditionCfieldname}', '{$p_method}', '$ca')"; - $result = $connect->Execute($query) or safe_die ("Couldn't insert new condition
    $query
    ".$connect->ErrorMsg()); - } - } - } - - unset($posted_condition_value); - // Please note that auto_unescape is already applied in database.php included above - // so we only need to db_quote _POST variables - if (isset($_POST['ConditionConst']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab']=="#CONST") - { - $posted_condition_value = db_quote($_POST['ConditionConst']); - } - elseif (isset($_POST['prevQuestionSGQA']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab']=="#PREVQUESTIONS") - { - $posted_condition_value = db_quote($_POST['prevQuestionSGQA']); - } - elseif (isset($_POST['tokenAttr']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab']=="#TOKENATTRS") - { - $posted_condition_value = db_quote($_POST['tokenAttr']); - } - elseif (isset($_POST['ConditionRegexp']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab']=="#REGEXP") - { - $posted_condition_value = db_quote($_POST['ConditionRegexp']); - } - - if (isset($posted_condition_value)) - { - $query = "INSERT INTO {$dbprefix}conditions (qid, scenario, cqid, cfieldname, method, value) VALUES " - . "('{$qid}', '{$p_scenario}', '{$p_cqid}', '{$conditionCfieldname}', '{$p_method}', '".$posted_condition_value."')"; - $result = $connect->Execute($query) or safe_die ("Couldn't insert new condition
    $query
    ".$connect->ErrorMsg()); - } - } - LimeExpressionManager::UpgradeConditionsToRelevance(NULL,$qid); -} - -// UPDATE ENTRY IF THIS IS AN EDIT -if (isset($p_subaction) && $p_subaction == "updatecondition") -{ - if ((!isset($p_canswers) && - !isset($_POST['ConditionConst']) && - !isset($_POST['prevQuestionSGQA']) && - !isset($_POST['tokenAttr']) && - !isset($_POST['ConditionRegexp'])) || - (!isset($p_cquestions) && !isset($p_csrctoken))) - { - $conditionsoutput_action_error .= "\n"; - } - else - { - if (isset($p_cquestions) && $p_cquestions != '') - { - $conditionCfieldname=$p_cquestions; - } - elseif(isset($p_csrctoken) && $p_csrctoken != '') - { - $conditionCfieldname=$p_csrctoken; - } - - if (isset($p_canswers)) - { - foreach ($p_canswers as $ca) - { // This is an Edit, there will only be ONE VALUE - $query = "UPDATE {$dbprefix}conditions SET qid='{$qid}', scenario='{$p_scenario}', cqid='{$p_cqid}', cfieldname='{$conditionCfieldname}', method='{$p_method}', value='$ca' " - . " WHERE cid={$p_cid}"; - $result = $connect->Execute($query) or safe_die ("Couldn't update condition
    $query
    ".$connect->ErrorMsg()); - } - } - - unset($posted_condition_value); - // Please note that auto_unescape is already applied in database.php included above - // so we only need to db_quote _POST variables - if (isset($_POST['ConditionConst']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab']=="#CONST") - { - $posted_condition_value = db_quote($_POST['ConditionConst']); - } - elseif (isset($_POST['prevQuestionSGQA']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab']=="#PREVQUESTIONS") - { - $posted_condition_value = db_quote($_POST['prevQuestionSGQA']); - } - elseif (isset($_POST['tokenAttr']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab']=="#TOKENATTRS") - { - $posted_condition_value = db_quote($_POST['tokenAttr']); - } - elseif (isset($_POST['ConditionRegexp']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab']=="#REGEXP") - { - $posted_condition_value = db_quote($_POST['ConditionRegexp']); - } - - if (isset($posted_condition_value)) - { - $query = "UPDATE {$dbprefix}conditions SET qid='{$qid}', scenario='{$p_scenario}' , cqid='{$p_cqid}', cfieldname='{$conditionCfieldname}', method='{$p_method}', value='".$posted_condition_value."' " - . " WHERE cid={$p_cid}"; - $result = $connect->Execute($query) or safe_die ("Couldn't insert new condition
    $query
    ".$connect->ErrorMsg()); - } - } - LimeExpressionManager::UpgradeConditionsToRelevance(NULL,$qid); -} - -// DELETE ENTRY IF THIS IS DELETE -if (isset($p_subaction) && $p_subaction == "delete") -{ - LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL,$qid); // in case deleted the last condition - $query = "DELETE FROM {$dbprefix}conditions WHERE cid={$p_cid}"; - $result = $connect->Execute($query) or safe_die ("Couldn't delete condition
    $query
    ".$connect->ErrorMsg()); - LimeExpressionManager::UpgradeConditionsToRelevance(NULL,$qid); -} - -// DELETE ALL CONDITIONS IN THIS SCENARIO -if (isset($p_subaction) && $p_subaction == "deletescenario") -{ - LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL,$qid); // in case deleted the last condition - $query = "DELETE FROM {$dbprefix}conditions WHERE qid={$qid} AND scenario={$p_scenario}"; - $result = $connect->Execute($query) or safe_die ("Couldn't delete scenario
    $query
    ".$connect->ErrorMsg()); - LimeExpressionManager::UpgradeConditionsToRelevance(NULL,$qid); -} - -// UPDATE SCENARIO -if (isset($p_subaction) && $p_subaction == "updatescenario" && isset($p_newscenarionum)) -{ - $query = "UPDATE {$dbprefix}conditions SET scenario=$p_newscenarionum WHERE qid={$qid} AND scenario={$p_scenario}"; - $result = $connect->Execute($query) or safe_die ("Couldn't update scenario
    $query
    ".$connect->ErrorMsg()); - LimeExpressionManager::UpgradeConditionsToRelevance(NULL,$qid); -} - -// DELETE ALL CONDITIONS FOR THIS QUESTION -if (isset($p_subaction) && $p_subaction == "deleteallconditions") -{ - LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL,$qid); - $query = "DELETE FROM {$dbprefix}conditions WHERE qid={$qid}"; - $result = $connect->Execute($query) or safe_die ("Couldn't delete scenario
    $query
    ".$connect->ErrorMsg()); -} - -// RENUMBER SCENARIOS -if (isset($p_subaction) && $p_subaction == "renumberscenarios") -{ - $query = "SELECT DISTINCT scenario FROM {$dbprefix}conditions WHERE qid={$qid} ORDER BY scenario"; - $result = $connect->Execute($query) or safe_die ("Couldn't select scenario
    $query
    ".$connect->ErrorMsg()); - $newindex=1; - while ($srow = $result->FetchRow()) - { - $query2 = "UPDATE {$dbprefix}conditions set scenario=$newindex WHERE qid={$qid} AND scenario=".$srow['scenario'].";"; - $result2 = $connect->Execute($query2) or safe_die ("Couldn't renumber scenario
    $query
    ".$connect->ErrorMsg()); - $newindex++; - } - LimeExpressionManager::UpgradeConditionsToRelevance(NULL,$qid); -} - -// COPY CONDITIONS IF THIS IS COPY -if (isset($p_subaction) && $p_subaction == "copyconditions") -{ - $qid=returnglobal('qid'); - $copyconditionsfrom=returnglobal('copyconditionsfrom'); - $copyconditionsto=returnglobal('copyconditionsto'); - if (isset($copyconditionsto) && is_array($copyconditionsto) && isset($copyconditionsfrom) && is_array($copyconditionsfrom)) - { - //Get the conditions we are going to copy - $query = "SELECT * FROM {$dbprefix}conditions\n" - ."WHERE cid in ('"; - $query .= implode("', '", $copyconditionsfrom); - $query .= "')"; - $result = db_execute_assoc($query) or safe_die("Couldn't get conditions for copy
    $query
    ".$connect->ErrorMsg()); - while($row=$result->FetchRow()) - { - $proformaconditions[]=array("scenario"=>$row['scenario'], - "cqid"=>$row['cqid'], - "cfieldname"=>$row['cfieldname'], - "method"=>$row['method'], - "value"=>$row['value']); - } // while - foreach ($copyconditionsto as $copyc) - { - list($newsid, $newgid, $newqid)=explode("X", $copyc); - foreach ($proformaconditions as $pfc) - { //TIBO - //First lets make sure there isn't already an exact replica of this condition - $query = "SELECT * FROM {$dbprefix}conditions\n" - ."WHERE qid='$newqid'\n" - ."AND scenario='".$pfc['scenario']."'\n" - ."AND cqid='".$pfc['cqid']."'\n" - ."AND cfieldname='".$pfc['cfieldname']."'\n" - ."AND method='".$pfc['method']."'\n" - ."AND value='".$pfc['value']."'"; - $result = $connect->Execute($query) or safe_die("Couldn't check for existing condition
    $query
    ".$connect->ErrorMsg()); - $count_caseinsensitivedupes = $result->RecordCount(); - - $countduplicates = 0; - if ($count_caseinsensitivedupes != 0) - { - while ($ccrow=$result->FetchRow()) - { - if ($ccrow['value'] == $pfc['value']) $countduplicates++; - } - } - - if ($countduplicates == 0) //If there is no match, add the condition. - { - $query = "INSERT INTO {$dbprefix}conditions ( qid,scenario,cqid,cfieldname,method,value) \n" - ."VALUES ( '$newqid', '".$pfc['scenario']."', '".$pfc['cqid']."'," - ."'".$pfc['cfieldname']."', '".$pfc['method']."'," - ."'".$pfc['value']."')"; - $result=$connect->Execute($query) or safe_die ("Couldn't insert query
    $query
    ".$connect->ErrorMsg()); - $conditionCopied=true; - } - else - { - $conditionDuplicated=true; - } - } - } - if (isset($conditionCopied) && $conditionCopied === true) - { - if (isset($conditionDuplicated) && $conditionDuplicated ==true) - { - $CopyConditionsMessage = "
    (".$clang->gT("Conditions successfully copied (some were skipped because they were duplicates)").")
    "; - } - else - { - $CopyConditionsMessage = "
    (".$clang->gT("Conditions successfully copied").")
    "; - } - } - else - { - $CopyConditionsMessage = "
    (".$clang->gT("No conditions could be copied (due to duplicates)").")
    "; - } - } - LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); // do for whole survey, since don't know which questions affected. -} -//END PROCESS ACTIONS - - - -$cquestions=Array(); -$canswers=Array(); - - - -//BEGIN: GATHER INFORMATION -// 1: Get information for this question -if (!isset($qid)) {$qid=returnglobal('qid');} -if (!isset($surveyid)) {$surveyid=returnglobal('sid');} -$thissurvey=getSurveyInfo($surveyid); - -$query = "SELECT * " -."FROM {$dbprefix}questions, " -."{$dbprefix}groups " -."WHERE {$dbprefix}questions.gid={$dbprefix}groups.gid " -."AND qid=$qid " -."AND parent_qid=0 " -."AND {$dbprefix}questions.language='".GetBaseLanguageFromSurveyID($surveyid)."'" ; -$result = db_execute_assoc($query) or safe_die ("Couldn't get information for question $qid
    $query
    ".$connect->ErrorMsg()); -while ($rows=$result->FetchRow()) -{ - $questiongroupname=$rows['group_name']; - $questiontitle=$rows['title']; - $questiontext=$rows['question']; - $questiontype=$rows['type']; -} - -// 2: Get all other questions that occur before this question that are pre-determined answer types - -// To avoid natural sort order issues, -// first get all questions in natural sort order -// , and find out which number in that order this question is -$qquery = "SELECT * " -."FROM {$dbprefix}questions, " -."{$dbprefix}groups " -."WHERE {$dbprefix}questions.gid={$dbprefix}groups.gid " -."AND parent_qid=0 " -."AND {$dbprefix}questions.sid=$surveyid " -."AND {$dbprefix}questions.language='".GetBaseLanguageFromSurveyID($surveyid)."' " -."AND {$dbprefix}groups.language='".GetBaseLanguageFromSurveyID($surveyid)."' " ; - -$qresult = db_execute_assoc($qquery) or safe_die ("$qquery
    ".$connect->ErrorMsg()); -$qrows = $qresult->GetRows(); -// Perform a case insensitive natural sort on group name then question title (known as "code" in the form) of a multidimensional array -usort($qrows, 'GroupOrderThenQuestionOrder'); - -$position="before"; -// Go through each question until we reach the current one -foreach ($qrows as $qrow) -{ - if ($qrow["qid"] != $qid && $position=="before") - { - // remember all previous questions - // all question types are supported. - $questionlist[]=$qrow["qid"]; - } - elseif ($qrow["qid"] == $qid) - { - break; - } -} - -// Now, using the same array which is now properly sorted by group then question -// Create an array of all the questions that appear AFTER the current one -$position = "before"; -foreach ($qrows as $qrow) //Go through each question until we reach the current one -{ - if ($qrow["qid"] == $qid) - { - $position="after"; - //break; - } - elseif ($qrow["qid"] != $qid && $position=="after") - { - $postquestionlist[]=$qrow['qid']; - } -} - -$theserows=array(); -$postrows=array(); - -if (isset($questionlist) && is_array($questionlist)) -{ - foreach ($questionlist as $ql) - { - $query = "SELECT {$dbprefix}questions.qid, " - ."{$dbprefix}questions.sid, " - ."{$dbprefix}questions.gid, " - ."{$dbprefix}questions.question, " - ."{$dbprefix}questions.type, " - ."{$dbprefix}questions.title, " - ."{$dbprefix}questions.other, " - ."{$dbprefix}questions.mandatory " - ."FROM {$dbprefix}questions, " - ."{$dbprefix}groups " - ."WHERE {$dbprefix}questions.gid={$dbprefix}groups.gid " - ."AND parent_qid=0 " - ."AND {$dbprefix}questions.qid=$ql " - ."AND {$dbprefix}questions.language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."AND {$dbprefix}groups.language='".GetBaseLanguageFromSurveyID($surveyid)."'" ; - - $result=db_execute_assoc($query) or die("Couldn't get question $qid"); - - $thiscount=$result->RecordCount(); - - // And store again these questions in this array... - while ($myrows=$result->FetchRow()) - { //key => value - $theserows[]=array("qid"=>$myrows['qid'], - "sid"=>$myrows['sid'], - "gid"=>$myrows['gid'], - "question"=>$myrows['question'], - "type"=>$myrows['type'], - "mandatory"=>$myrows['mandatory'], - "other"=>$myrows['other'], - "title"=>$myrows['title']); - } - } -} - -if (isset($postquestionlist) && is_array($postquestionlist)) -{ - foreach ($postquestionlist as $pq) - { - $query = "SELECT q.qid, " - ."q.sid, " - ."q.gid, " - ."q.question, " - ."q.type, " - ."q.title, " - ."q.other, " - ."q.mandatory " - ."FROM {$dbprefix}questions q, " - ."{$dbprefix}groups g " - ."WHERE q.gid=g.gid AND " - ."q.parent_qid=0 AND " - ."q.qid=$pq AND " - ."q.language='".GetBaseLanguageFromSurveyID($surveyid)."' AND " - ."g.language='".GetBaseLanguageFromSurveyID($surveyid)."'"; - - - $result = db_execute_assoc($query) or safe_die("Couldn't get postquestions $qid
    $query
    ".$connect->ErrorMsg()); - - $postcount=$result->RecordCount(); - - while($myrows=$result->FetchRow()) - { - $postrows[]=array("qid"=>$myrows['qid'], - "sid"=>$myrows['sid'], - "gid"=>$myrows['gid'], - "question"=>$myrows['question'], - "type"=>$myrows['type'], - "mandatory"=>$myrows['mandatory'], - "other"=>$myrows['other'], - "title"=>$myrows['title']); - } // while - } - $postquestionscount=count($postrows); -} - -$questionscount=count($theserows); - -if (isset($postquestionscount) && $postquestionscount > 0) -{ //Build the array used for the questionNav and copyTo select boxes - foreach ($postrows as $pr) - { - $pquestions[]=array("text"=>$pr['title'].": ".substr(strip_tags($pr['question']), 0, 80), - "fieldname"=>$pr['sid']."X".$pr['gid']."X".$pr['qid']); - } -} - -// Previous question parsing ==> building cquestions[] and canswers[] -if ($questionscount > 0) -{ - $X="X"; - - foreach($theserows as $rows) - { - $shortquestion=$rows['title'].": ".strip_tags($rows['question']); - - if ($rows['type'] == "A" || - $rows['type'] == "B" || - $rows['type'] == "C" || - $rows['type'] == "E" || - $rows['type'] == "F" || - $rows['type'] == "H" ) - { - $aquery="SELECT * " - ."FROM {$dbprefix}questions " - ."WHERE parent_qid={$rows['qid']} " - ."AND language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."ORDER BY question_order"; - - $aresult=db_execute_assoc($aquery) or safe_die ("Couldn't get answers to Array questions
    $aquery
    ".$connect->ErrorMsg()); - - while ($arows = $aresult->FetchRow()) - { - $shortanswer = "{$arows['title']}: [" . FlattenText($arows['question']) . "]"; - $shortquestion=$rows['title'].":$shortanswer ".FlattenText($rows['question']); - $cquestions[]=array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']); - - switch ($rows['type']) - { - case "A": //Array 5 buttons - for ($i=1; $i<=5; $i++) - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], $i, $i); - } - break; - case "B": //Array 10 buttons - for ($i=1; $i<=10; $i++) - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], $i, $i); - } - break; - case "C": //Array Y/N/NA - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], "Y", $clang->gT("Yes")); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], "U", $clang->gT("Uncertain")); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], "N", $clang->gT("No")); - break; - case "E": //Array >/=/< - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], "I", $clang->gT("Increase")); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], "S", $clang->gT("Same")); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], "D", $clang->gT("Decrease")); - break; - case "F": //Array Flexible Row - case "H": //Array Flexible Column - $fquery = "SELECT * " - ."FROM {$dbprefix}answers " - ."WHERE qid={$rows['qid']} " - ."AND language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."AND scale_id=0 " - ."ORDER BY sortorder, code "; - $fresult = db_execute_assoc($fquery); - while ($frow=$fresult->FetchRow()) - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], $frow['code'], $frow['answer']); - } - break; - } - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], "", $clang->gT("No answer")); - } - - } //while - } - elseif ($rows['type'] == ":" || $rows['type'] == ";") - { // Multiflexi - - //Get question attribute for $canswers - $qidattributes=getQuestionAttributes($rows['qid'], $rows['type']); - if (isset($qidattributes['multiflexible_max']) && trim($qidattributes['multiflexible_max'])!='') { - $maxvalue=floatval($qidattributes['multiflexible_max']); - } else { - $maxvalue=10; - } - if (isset($qidattributes['multiflexible_min']) && trim($qidattributes['multiflexible_min'])!='') { - $minvalue=floatval($qidattributes['multiflexible_min']); - } else { - $minvalue=1; - } - if (isset($qidattributes['multiflexible_step']) && trim($qidattributes['multiflexible_step'])!='') { - $stepvalue=floatval($qidattributes['multiflexible_step']); - if ($stepvalue==0) $stepvalue=1; - } else { - $stepvalue=1; - } - - if (isset($qidattributes['multiflexible_checkbox']) && $qidattributes['multiflexible_checkbox']!=0) { - $minvalue=0; - $maxvalue=1; - $stepvalue=1; - } - // Get the Y-Axis - - $fquery = "SELECT sq.*, q.other" - ." FROM ".db_table_name('questions')." sq, ".db_table_name('questions')." q" - ." WHERE sq.sid=$surveyid AND sq.parent_qid=q.qid " - . "AND q.language='".GetBaseLanguageFromSurveyID($surveyid)."'" - ." AND sq.language='".GetBaseLanguageFromSurveyID($surveyid)."'" - ." AND q.qid={$rows['qid']} - AND sq.scale_id=0 - ORDER BY sq.question_order"; - - $y_axis_db = db_execute_assoc($fquery); - - // Get the X-Axis - $aquery = "SELECT sq.* - FROM ".db_table_name('questions')." q, ".db_table_name('questions')." sq - WHERE q.sid=$surveyid - AND sq.parent_qid=q.qid - AND q.language='".GetBaseLanguageFromSurveyID($surveyid)."' - AND sq.language='".GetBaseLanguageFromSurveyID($surveyid)."' - AND q.qid=".$rows['qid']." - AND sq.scale_id=1 - ORDER BY sq.question_order"; - - $x_axis_db=db_execute_assoc($aquery) or safe_die ("Couldn't get answers to Array questions
    $aquery
    ".$connect->ErrorMsg()); - - while ($frow=$x_axis_db->FetchRow()) - { - $x_axis[$frow['title']]=$frow['question']; - } - - while ($arows = $y_axis_db->FetchRow()) - { - foreach($x_axis as $key=>$val) - { - $shortquestion=$rows['title'].":{$arows['title']}:$key: [".strip_tags($arows['question']). "][" .strip_tags($val). "] " . FlattenText($rows['question']); - $cquestions[]=array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']."_".$key); - - if ($rows['type'] == ":") - { - for($ii=$minvalue; $ii<=$maxvalue; $ii+=$stepvalue) - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']."_".$key, $ii, $ii); - } - } - } - } - unset($x_axis); - } //if A,B,C,E,F,H - elseif ($rows['type'] == "1") //Multi Scale - { - $aquery="SELECT * " - ."FROM {$dbprefix}questions " - ."WHERE parent_qid={$rows['qid']} " - ."AND language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."ORDER BY question_order"; - $aresult=db_execute_assoc($aquery) or safe_die ("Couldn't get answers to Array questions
    $aquery
    ".$connect->ErrorMsg()); - - while ($arows = $aresult->FetchRow()) - { - $attr = getQuestionAttributes($rows['qid']); - $label1 = isset($attr['dualscale_headerA']) ? $attr['dualscale_headerA'] : 'Label1'; - $label2 = isset($attr['dualscale_headerB']) ? $attr['dualscale_headerB'] : 'Label2'; - $shortanswer = "{$arows['title']}: [" . strip_tags($arows['question']) . "][$label1]"; - $shortquestion=$rows['title'].":$shortanswer ".strip_tags($rows['question']); - $cquestions[]=array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']."#0"); - - $shortanswer = "{$arows['title']}: [" . strip_tags($arows['question']) . "][$label2]"; - $shortquestion=$rows['title'].":$shortanswer ".strip_tags($rows['question']); - $cquestions[]=array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']."#1"); - - // first label - $lquery="SELECT * " - ."FROM {$dbprefix}answers " - ."WHERE qid={$rows['qid']} " - ."AND scale_id=0 " - ."AND language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."ORDER BY sortorder, answer"; - $lresult=db_execute_assoc($lquery) or safe_die ("Couldn't get labels to Array
    $lquery
    ".$connect->ErrorMsg()); - while ($lrows = $lresult->FetchRow()) - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']."#0", "{$lrows['code']}", "{$lrows['code']}"); - } - - // second label - $lquery="SELECT * " - ."FROM {$dbprefix}answers " - ."WHERE qid={$rows['qid']} " - ."AND scale_id=1 " - ."AND language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."ORDER BY sortorder, answer"; - $lresult=db_execute_assoc($lquery) or safe_die ("Couldn't get labels to Array
    $lquery
    ".$connect->ErrorMsg()); - while ($lrows = $lresult->FetchRow()) - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']."#1", "{$lrows['code']}", "{$lrows['code']}"); - } - - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']."#0", "", $clang->gT("No answer")); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']."#1", "", $clang->gT("No answer")); - } - } //while - } - elseif ($rows['type'] == "K" ||$rows['type'] == "Q") //Multi shorttext/numerical - { - $aquery="SELECT * " - ."FROM {$dbprefix}questions " - ."WHERE parent_qid={$rows['qid']} " - ."AND language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."ORDER BY question_order"; - $aresult=db_execute_assoc($aquery) or safe_die ("Couldn't get answers to Array questions
    $aquery
    ".$connect->ErrorMsg()); - - while ($arows = $aresult->FetchRow()) - { - $shortanswer = "{$arows['title']}: [" . strip_tags($arows['question']) . "]"; - $shortquestion=$rows['title'].":$shortanswer ".strip_tags($rows['question']); - $cquestions[]=array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']); - - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], "", $clang->gT("No answer")); - } - - } //while - } - elseif ($rows['type'] == "R") //Answer Ranking - { - $aquery="SELECT * " - ."FROM {$dbprefix}answers " - ."WHERE qid={$rows['qid']} " - ."AND ".db_table_name('answers').".language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."AND scale_id=0 " - ."ORDER BY sortorder, answer"; - $aresult=db_execute_assoc($aquery) or safe_die ("Couldn't get answers to Ranking question
    $aquery
    ".$connect->ErrorMsg()); - $acount=$aresult->RecordCount(); - while ($arow=$aresult->FetchRow()) - { - $theanswer = addcslashes($arow['answer'], "'"); - $quicky[]=array($arow['code'], $theanswer); - } - for ($i=1; $i<=$acount; $i++) - { - $cquestions[]=array("{$rows['title']}: [RANK $i] ".strip_tags($rows['question']), $rows['qid'], $rows['type'], $rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$i); - foreach ($quicky as $qck) - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$i, $qck[0], $qck[1]); - } - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$i, " ", $clang->gT("No answer")); - } - } - unset($quicky); - } // End if type R - elseif($rows['type'] == "M" || $rows['type'] == "P") - { - $shortanswer = " [".$clang->gT("Group of checkboxes")."]"; - $shortquestion=$rows['title'].":$shortanswer ".strip_tags($rows['question']); - $cquestions[]=array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'].$X.$rows['gid'].$X.$rows['qid']); - $aquery="SELECT * " - ."FROM {$dbprefix}questions " - ."WHERE parent_qid={$rows['qid']} " - ."AND language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."ORDER BY question_order"; - $aresult=db_execute_assoc($aquery) or safe_die ("Couldn't get answers to this question
    $aquery
    ".$connect->ErrorMsg()); - - while ($arows=$aresult->FetchRow()) - { - $theanswer = addcslashes($arows['question'], "'"); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], $arows['title'], $theanswer); - - $shortanswer = "{$arows['title']}: [" . strip_tags($arows['question']) . "]"; - $shortanswer .= "[".$clang->gT("Single checkbox")."]"; - $shortquestion=$rows['title'].":$shortanswer ".strip_tags($rows['question']); - $cquestions[]=array($shortquestion, $rows['qid'], $rows['type'], "+".$rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title']); - $canswers[]=array("+".$rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], 'Y', $clang->gT("checked")); - $canswers[]=array("+".$rows['sid'].$X.$rows['gid'].$X.$rows['qid'].$arows['title'], '', $clang->gT("not checked")); - } - } - elseif($rows['type'] == "X") //Boilerplate question - { - //Just ignore this questiontype - } - else - { - $cquestions[]=array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'].$X.$rows['gid'].$X.$rows['qid']); - switch ($rows['type']) - { - case "Y": // Y/N/NA - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], "Y", $clang->gT("Yes")); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], "N", $clang->gT("No")); - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], " ", $clang->gT("No answer")); - } - break; - case "G": //Gender - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], "F", $clang->gT("Female")); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], "M", $clang->gT("Male")); - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], " ", $clang->gT("No answer")); - } - break; - case "5": // 5 choice - for ($i=1; $i<=5; $i++) - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], $i, $i); - } - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], " ", $clang->gT("No answer")); - } - break; - - case "N": // Simple Numerical questions - - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], " ", $clang->gT("No answer")); - } - break; - - default: - $aquery="SELECT * " - ."FROM {$dbprefix}answers " - ."WHERE qid={$rows['qid']} " - ."AND language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."AND scale_id=0 " - ."ORDER BY sortorder, " - ."answer"; - // Ranking question? Replacing "Ranking" by "this" - $aresult=db_execute_assoc($aquery) or safe_die ("Couldn't get answers to this question
    $aquery
    ".$connect->ErrorMsg()); - - while ($arows=$aresult->FetchRow()) - { - $theanswer = addcslashes($arows['answer'], "'"); - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], $arows['code'], $theanswer); - } - if ($rows['type'] == "D") - { - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], " ", $clang->gT("No answer")); - } - } - elseif ($rows['type'] != "M" && - $rows['type'] != "P" && - $rows['type'] != "J" && - $rows['type'] != "I" ) - { - // For dropdown questions - // optinnaly add the 'Other' answer - if ( ($rows['type'] == "L" || - $rows['type'] == "!") && - $rows['other'] == "Y") - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], "-oth-", $clang->gT("Other")); - } - - // Only Show No-Answer if question is not mandatory - if ($rows['mandatory'] != 'Y') - { - $canswers[]=array($rows['sid'].$X.$rows['gid'].$X.$rows['qid'], " ", $clang->gT("No answer")); - } - } - break; - }//switch row type - } //else - } //foreach theserows -} //if questionscount > 0 -//END Gather Information for this question - -$conditionsoutput_main_content .= "\t
    \n"; - -// Now we have enough information, we can create the menubar and question Navigator -$conditionsoutput_menubar .= "\t\n" -."

    " -."
    \n"; - - //3: Get other conditions currently set for this question - $conditionscount=0; - $s=0; - $scenarioquery = "SELECT DISTINCT {$dbprefix}conditions.scenario " - ."FROM {$dbprefix}conditions " - ."WHERE {$dbprefix}conditions.qid=$qid\n" - ."ORDER BY {$dbprefix}conditions.scenario"; - $scenarioresult = db_execute_assoc($scenarioquery) or safe_die ("Couldn't get other (scenario) conditions for question $qid
    $query
    ".$connect->Error); - $scenariocount=$scenarioresult->RecordCount(); - - $conditionsoutput_main_content .= "\n" - ."\t\n" - ."\n"; - - if ($scenariocount > 0) - { - $js_admin_includes[]= $homeurl.'/scripts/conditions.js'; - $js_admin_includes[]= $rooturl.'/scripts/jquery/jquery.checkgroup.js'; - while ($scenarionr=$scenarioresult->FetchRow()) - { - $scenariotext = ""; - if ($s == 0 && $scenariocount > 1) - { - $scenariotext = " -------- Scenario {$scenarionr['scenario']} --------"; - } - if ($s > 0) - { - $scenariotext = " -------- ".$clang->gT("OR")." Scenario {$scenarionr['scenario']} --------"; - } - if ($subaction == "copyconditionsform" || $subaction == "copyconditions") - { - $initialCheckbox = "\n"; - } - else - { - $initialCheckbox = ""; - } - - $conditionsoutput_main_content .= "\n"; - - unset($currentfield); - - $query = "SELECT {$dbprefix}conditions.cid, " - ."{$dbprefix}conditions.scenario, " - ."{$dbprefix}conditions.cqid, " - ."{$dbprefix}conditions.cfieldname, " - ."{$dbprefix}conditions.method, " - ."{$dbprefix}conditions.value, " - ."{$dbprefix}questions.type " - ."FROM {$dbprefix}conditions, " - ."{$dbprefix}questions, " - ."{$dbprefix}groups " - ."WHERE {$dbprefix}conditions.cqid={$dbprefix}questions.qid " - ."AND {$dbprefix}questions.gid={$dbprefix}groups.gid " - ."AND {$dbprefix}questions.parent_qid=0 " - ."AND {$dbprefix}questions.language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."AND {$dbprefix}groups.language='".GetBaseLanguageFromSurveyID($surveyid)."' " - ."AND {$dbprefix}conditions.qid=$qid " - ."AND {$dbprefix}conditions.scenario={$scenarionr['scenario']}\n" - ."AND {$dbprefix}conditions.cfieldname NOT LIKE '{%' \n" // avoid catching SRCtokenAttr conditions - ."ORDER BY {$dbprefix}groups.group_order,{$dbprefix}questions.question_order, {$dbprefix}conditions.cfieldname"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get other conditions for question $qid
    $query
    ".$connect->ErrorMsg()); - $conditionscount=$result->RecordCount(); - - $querytoken = "SELECT {$dbprefix}conditions.cid, " - ."{$dbprefix}conditions.scenario, " - ."{$dbprefix}conditions.cqid, " - ."{$dbprefix}conditions.cfieldname, " - ."{$dbprefix}conditions.method, " - ."{$dbprefix}conditions.value, " - ."'' AS type " - ."FROM {$dbprefix}conditions " - ."WHERE " - ." {$dbprefix}conditions.qid=$qid " - ."AND {$dbprefix}conditions.scenario={$scenarionr['scenario']}\n" - ."AND {$dbprefix}conditions.cfieldname LIKE '{%' \n" // only catching SRCtokenAttr conditions - ."ORDER BY {$dbprefix}conditions.cfieldname"; - $resulttoken = db_execute_assoc($querytoken) or safe_die ("Couldn't get other conditions for question $qid
    $query
    ".$connect->ErrorMsg()); - $conditionscounttoken=$resulttoken->RecordCount(); - - $conditionscount=$conditionscount+$conditionscounttoken; - - if ($conditionscount > 0) - { - $aConditionsMerged=Array(); - while ($arow=$resulttoken->FetchRow()) - { - $aConditionsMerged[]=$arow; - } - while ($arow=$result->FetchRow()) - { - $aConditionsMerged[]=$arow; - } - - // while ($rows=$result->FetchRow()) - foreach ($aConditionsMerged as $rows) - { - if($rows['method'] == "") {$rows['method'] = "==";} //Fill in the empty method from previous versions - $markcidstyle=""; - if (array_search($rows['cid'], $markcidarray) === FALSE) // PHP5 - // === required cause key 0 would otherwise be interpreted as FALSE - { - $markcidstyle=""; - } - else { - // This is the style used when the condition editor is called - // in order to check which conditions prevent a question deletion - $markcidstyle="background-color: #5670A1;"; - } - if ($subaction == "editthiscondition" && isset($p_cid) && - $rows['cid'] === $p_cid) - { - // Style used when editing a condition - $markcidstyle="background-color: #FCCFFF;"; - } - - if (isset($currentfield) && $currentfield != $rows['cfieldname']) - { - $conditionsoutput_main_content .= "\n" - ."\t"; - } - elseif (isset($currentfield)) - { - $conditionsoutput_main_content .= "\n" - ."\t"; - } - $conditionsoutput_main_content .= "\t\n" - ."\t\n" - ."\t\n"; - $currentfield=$rows['cfieldname']; - } - $conditionsoutput_main_content .= "\t\n" - ."\n" - ."\t\n"; - } - else - { - $conditionsoutput_main_content .= "\t\n" - ."\n" - ."\t\n"; - } - $s++; - } - } - else - { // no condition ==> disable delete all conditions button, and display a simple comment - $conditionsoutput_main_content .= "\n"; - } - $conditionsoutput_main_content .= "" - . "
    \n"; - $showreplace="$questiontitle". showSpeaker($questiontext); - $onlyshow=str_replace("{QID}", $showreplace, $clang->gT("Only show question {QID} IF")); - - - if ($subaction== "editconditionsform" || $subaction=='insertcondition' || - $subaction == "editthiscondition" || $subaction == "delete" || - $subaction == "updatecondition" || $subaction == "deletescenario" || - $subaction == "updatescenario" || - $subaction == "renumberscenarios") - { - $conditionsoutput_main_content .= "\t\n" - ."
    $onlyshow\n" - ."
    \n" - ."\n" - ."\n" - ."\n" - ."\n"; - - - if ($scenariocount > 0) - { // show the Delete all conditions for this question button - $conditionsoutput_main_content .= "gT("Are you sure you want to delete all conditions set to the questions you have selected?","js")."')) {document.getElementById('deleteallconditions').submit();}\"" - ." title='".$clang->gTview("Delete all conditions")."' >" - ." ".$clang->gT("Delete all conditions")."\n"; - } - - if ($scenariocount > 1) - { // show the renumber scenario button for this question - $conditionsoutput_main_content .= "gT("Are you sure you want to renumber the scenarios with incremented numbers beginning from 1?","js")."')) {document.getElementById('toplevelsubaction').value='renumberscenarios'; document.getElementById('deleteallconditions').submit();}\"" - ." title='".$clang->gTview("Renumber scenario automatically")."' >" - ." ".$clang->gT("Renumber scenario automatically")."\n"; - } - } - else - { - $conditionsoutput_main_content .= "\t
    $onlyshow\n" - ."\n" - ."\n" - ."\n" - ."\n"; - } - - $conditionsoutput_main_content .= "
    \n" - ."\t
    \n" - ."" - ." 
    \n" - ."$initialCheckbox\n" - . "
    $scenariotext \n" - ."
    \n"; - - if ($scenariotext != "" && ($subaction == "editconditionsform" ||$subaction == "insertcondition" || - $subaction == "updatecondition" || $subaction == "editthiscondition" || - $subaction == "renumberscenarios" || $subaction == "updatescenario" || - $subaction == "deletescenario" || $subaction == "delete") ) - { - $conditionsoutput_main_content .= "\tgT("Are you sure you want to delete all conditions set in this scenario?","js")."')) {document.getElementById('deletescenario{$scenarionr['scenario']}').submit();}\"" - ." title='".$clang->gTview("Delete this scenario")."' >" - ." gT("Delete this scenario")." name='DeleteWholeGroup' />\n"; - - $conditionsoutput_main_content .= "\t" - ." ".$clang->gT("Edit scenario")."\n"; - - } - - $conditionsoutput_main_content .= "\t\n" - ."\t\n" - ."\t\n" - ."\t\n" - ."
    \n" - ."" - .$clang->gT("and")."
    \n" - ."" - .$clang->gT("OR")."
    \n" - ."\n" - ."\t\n"; - - if ( $subaction == "copyconditionsform" || $subaction == "copyconditions") - { - $conditionsoutput_main_content .= "" - . "\n"; - } - $conditionsoutput_main_content .= "" - ."\n" - ."\t" - .$method[trim ($rows['method'])] - ."\n" - ."\t\n" - ."\n" - ."\t\n" - ."\t\n" - ."\t\n" - ."\t
      \n" - . "\t\n" - . "\n" - ."\t\n"; - - $leftOperandType = 'unknown'; // prevquestion, tokenattr - if ($thissurvey['anonymized'] != 'Y' && preg_match('/^{TOKEN:([^}]*)}$/',$rows['cfieldname'],$extractedTokenAttr) > 0) - { - $leftOperandType = 'tokenattr'; - $aTokenAttrNames=GetTokenFieldsAndNames($surveyid); - if (count($aTokenAttrNames) != 0) - { - $thisAttrName=html_escape($aTokenAttrNames[strtolower($extractedTokenAttr[1])])." [".$clang->gT("From token table")."]"; - } - else - { - $thisAttrName=html_escape($extractedTokenAttr[1])." [".$clang->gT("Inexistant token table")."]"; - } - $conditionsoutput_main_content .= "\t$thisAttrName\n"; - // TIBO not sure this is used anymore !! - $conditionsList[]=array("cid"=>$rows['cid'], - "text"=>$thisAttrName); - } - else - { - $leftOperandType = 'prevquestion'; - foreach ($cquestions as $cqn) - { - if ($cqn[3] == $rows['cfieldname']) - { - $conditionsoutput_main_content .= "\t$cqn[0] (qid{$rows['cqid']})\n"; - $conditionsList[]=array("cid"=>$rows['cid'], - "text"=>$cqn[0]." ({$rows['value']})"); - } - else - { - //$conditionsoutput_main_content .= "\tERROR: Delete this condition. It is out of order.\n"; - } - } - } - - $conditionsoutput_main_content .= "\t\n" - ."\n" // .$clang->gT("Equals")."\n" - ."\n"; - - // let's read the condition's right operand - // determine its type and display it - $rightOperandType = 'unknown'; // predefinedAnsw,constantVal, prevQsgqa, tokenAttr, regexp - if ($rows['method'] == 'RX') - { - $rightOperandType = 'regexp'; - $conditionsoutput_main_content .= "".html_escape($rows['value'])."\n"; - } - elseif (preg_match('/^@([0-9]+X[0-9]+X[^@]*)@$/',$rows['value'],$matchedSGQA) > 0) - { // SGQA - $rightOperandType = 'prevQsgqa'; - $textfound=false; - foreach ($cquestions as $cqn) - { - if ($cqn[3] == $matchedSGQA[1]) - { - $matchedSGQAText=$cqn[0]; - $textfound=true; - break; - } - } - if ($textfound === false) - { - $matchedSGQAText=$rows['value'].' ('.$clang->gT("Not found").')'; - } - - $conditionsoutput_main_content .= "".html_escape($matchedSGQAText)."\n"; - } - elseif ($thissurvey['anonymized'] != 'Y' && preg_match('/^{TOKEN:([^}]*)}$/',$rows['value'],$extractedTokenAttr) > 0) - { - $rightOperandType = 'tokenAttr'; - $aTokenAttrNames=GetTokenFieldsAndNames($surveyid); - if (count($aTokenAttrNames) != 0) - { - $thisAttrName=html_escape($aTokenAttrNames[strtolower($extractedTokenAttr[1])])." [".$clang->gT("From token table")."]"; - } - else - { - $thisAttrName=html_escape($extractedTokenAttr[1])." [".$clang->gT("Inexistant token table")."]"; - } - $conditionsoutput_main_content .= "\t$thisAttrName\n"; - } - elseif (isset($canswers)) - { - foreach ($canswers as $can) - { - if ($can[0] == $rows['cfieldname'] && $can[1] == $rows['value']) - { - $conditionsoutput_main_content .= "$can[2] ($can[1])\n"; - $rightOperandType = 'predefinedAnsw'; - - } - } - } - // if $rightOperandType is still unkown then it is a simple constant - if ($rightOperandType == 'unknown') - { - $rightOperandType = 'constantVal'; - if ($rows['value'] == ' ' || - $rows['value'] == '') - { - $conditionsoutput_main_content .= "".$clang->gT("No answer")."\n"; - } - else - { - $conditionsoutput_main_content .= "".html_escape($rows['value'])."\n"; - } - } - - $conditionsoutput_main_content .= "\t\n"; - - if ($subaction == "editconditionsform" ||$subaction == "insertcondition" || - $subaction == "updatecondition" || $subaction == "editthiscondition" || - $subaction == "renumberscenarios" || $subaction == "deleteallconditions" || - $subaction == "updatescenario" || - $subaction == "deletescenario" || $subaction == "delete") - { // show single condition action buttons in edit mode - $conditionsoutput_main_content .= "" - ."gT("Are you sure you want to delete this condition?","js")."')) {\$('#editModeTargetVal{$rows['cid']}').remove();\$('#cquestions{$rows['cid']}').remove();document.getElementById('conditionaction{$rows['cid']}').submit();}\"" - ." title='".$clang->gTview("Delete this condition")."' >" - ." ".$clang->gT("Delete this condition")."\n" - ."" - ." ".$clang->gT("Edit this condition")."\n" - ."\t\n" - ."\t\n" - ."\t\n" - // ."\t\n" - ."\t\n" - ."\t\n" - ."\t\n" - ."\t\n"; - // now sets e corresponding hidden input field - // depending on the leftOperandType - if ($leftOperandType == 'tokenattr') - { - $conditionsoutput_main_content .= "" - ."\t\n"; - } - else - { - $conditionsoutput_main_content .= "" - ."\t\n"; - } - - // now set the corresponding hidden input field - // depending on the rightOperandType - // This is used when Editting a condition - if ($rightOperandType == 'predefinedAnsw') - { - $conditionsoutput_main_content .= "" - ."\t\n"; - } - elseif ($rightOperandType == 'prevQsgqa') - { - $conditionsoutput_main_content .= "" - ."\t\n"; - } - elseif ($rightOperandType == 'tokenAttr') - { - $conditionsoutput_main_content .= "" - ."\t\n"; - } - elseif ($rightOperandType == 'regexp') - { - $conditionsoutput_main_content .= "" - ."\t\n"; - } - else - { - $conditionsoutput_main_content .= "" - ."\t\n"; - } - } - - $conditionsoutput_main_content .= "" - ."\t
    \n" - ."\t
    \n" - ."
    \n" - ."
    ".$clang->gT("This question is always shown.")."\n" - . "
    \n"; - - $conditionsoutput_main_content .= "
    \n" - ."
    \n"; - - $conditionsoutput_main_content .= "
    ".$clang->gT("Copy conditions")."
    \n"; - - - //CopyConditionsMessage - if (isset ($CopyConditionsMessage)) - { - $conditionsoutput_main_content .= "
    \n" - ."$CopyConditionsMessage\n" - ."
    \n"; - } - - if (isset($conditionsList) && is_array($conditionsList)) - { - //TIBO - $js_admin_includes[]= $rooturl.'/scripts/jquery/jquery.multiselect.min.js'; - $css_admin_includes[] = '../scripts/jquery/css/jquery.multiselect.css'; - - $conditionsoutput_main_content .= ""; - - $conditionsoutput_main_content .= "\t
    \n" - ."\t
    ".$clang->gT("Copy the selected conditions to").":
    \n" - ."\t
    \n" - ."\t\t\n" - ."\t
    \n" - ."\t
    \n"; - - if ( !isset($pquestions) || count($pquestions) == 0) - { - $disableCopyCondition=" disabled='disabled'"; - } - else - { - $disableCopyCondition=" "; - } - - $conditionsoutput_main_content .= "\t
    \n" - // ."\t\tgT("Are you sure you want to copy these condition(s) to the questions you have selected?","js")."')){prepareCopyconditions(); return true;} else {return false;}\" $disableCopyCondition/>\n" - ."\t\t\n" - ."\n" - ."\n" - ."\n" - ."\n" - ."
    \n"; - - $conditionsoutput_main_content .= "\n"; - - } - else - { - $conditionsoutput_main_content .= "
    \n" - ."
    ".$clang->gT("This survey's questions don't use conditions")."

    \n" - ."
    \n"; - } - - $conditionsoutput_main_content .= "
    \n"; - $conditionsoutput_main_content .= "
    \n"; - if ($subaction == "editthiscondition" && isset($p_cid)) - { - $mytitle = $clang->gT("Edit condition"); - } - else - { - $mytitle = $clang->gT("Add condition"); - } - $conditionsoutput_main_content .= "
    ".$mytitle."
    \n"; - - /////////////////////////////////////////////////////////////////////////////////////////// - - // Begin "Scenario" row - if ( ( $subaction != "editthiscondition" && isset($scenariocount) && ($scenariocount == 1 || $scenariocount==0)) || - ( $subaction == "editthiscondition" && isset($scenario) && $scenario == 1) ) - { - $scenarioAddBtn = "\t" - ."".$clang->gT(\n"; - $scenarioTxt = "".$clang->gT("Default scenario").""; - $scenarioInputStyle = "style = 'display: none;'"; - } - else - { - $scenarioAddBtn = ""; - $scenarioTxt = ""; - $scenarioInputStyle = "style = ''"; - } - - $conditionsoutput_main_content .="
    \n" - ."
    $scenarioAddBtn ".$clang->gT("Scenario")."
    \n" - ."
    " - ."$scenarioTxt\n" - ."
    \n" - ."
    \n"; - - // Begin "Question" row - $conditionsoutput_main_content .="
    \n" - ."
    ".$clang->gT("Question")."
    \n" - ."
    \n" - ."\t
    \n" - ."\t\n"; - - // Previous question tab - $conditionsoutput_main_content .= "
    \n"; - foreach (GetTokenFieldsAndNames($surveyid) as $tokenattr => $tokenattrName) - { - // Check to select - if (isset($p_csrctoken) && $p_csrctoken == '{TOKEN:'.strtoupper($tokenattr).'}') - { - $selectThisSrcTokenAttr = "selected=\"selected\""; - } - else - { - $selectThisSrcTokenAttr = ""; - } - $conditionsoutput_main_content .= "\n"; - } - - $conditionsoutput_main_content .= "\n" - ."
    \n\n"; - - $conditionsoutput_main_content .= "\t
    \n"; // end conditionsource div - - $conditionsoutput_main_content .= "
    \n" - ."
    \n"; - - // Begin "Comparison operator" row - $conditionsoutput_main_content .="
    \n" - ."
    ".$clang->gT("Comparison operator")."
    \n" - ."
    \n" - ."\n" - ."
    \n" - ."
    \n"; - - // Begin "Answer" row - $conditionsoutput_main_content .="
    \n" - ."
    ".$clang->gT("Answer")."
    \n"; - - if ($subaction == "editthiscondition") - { - $multipletext = ""; - if (isset($_POST['EDITConditionConst']) && $_POST['EDITConditionConst'] != '') - { - $EDITConditionConst=html_escape($_POST['EDITConditionConst']); - } - else - { - $EDITConditionConst=""; - } - if (isset($_POST['EDITConditionRegexp']) && $_POST['EDITConditionRegexp'] != '') - { - $EDITConditionRegexp=html_escape($_POST['EDITConditionRegexp']); - } - else - { - $EDITConditionRegexp=""; - } - } - else - { - $multipletext = "multiple"; - if (isset($_POST['ConditionConst']) && $_POST['ConditionConst'] != '') - { - $EDITConditionConst=html_escape($_POST['ConditionConst']); - } - else - { - $EDITConditionConst=""; - } - if (isset($_POST['ConditionRegexp']) && $_POST['ConditionRegexp'] != '') - { - $EDITConditionRegexp=html_escape($_POST['ConditionRegexp']); - } - else - { - $EDITConditionRegexp=""; - } - } - - - $conditionsoutput_main_content .= "" - ."
    \n" - ."
    \n" - ."\t\n"; - - // Predefined answers tab - $conditionsoutput_main_content .= "\t
    \n" - ."\t\t\n" - ."\t\t
    ".$clang->gT("Predefined answer options for this question")."\n" - ."\t
    \n"; - - // Constant tab - $conditionsoutput_main_content .= "\t
    \n" - ."\t\t\n" - ."\t\t
    ".$clang->gT("Constant value")."
    \n" - ."\t
    \n"; - // Previous answers tab @SGQA@ placeholders - $conditionsoutput_main_content .= "\t
    \n" - ."\t\t\n"; - foreach (GetTokenFieldsAndNames($surveyid) as $tokenattr => $tokenattrName) - { - $conditionsoutput_main_content .= "\t\t\n"; - } - - $conditionsoutput_main_content .= "\t\t\n" - ."\t\t
    ".$clang->gT("Attributes values from the participant's token")."\n" - ."\t
    \n"; - - // Regexp Tab - $conditionsoutput_main_content .= "\t
    \n" - ."\t\t\n" - ."\t\t
    \n" - ."\t
    \n"; - - $conditionsoutput_main_content .= "
    \n"; // end conditiontarget div - - - $js_admin_includes[]= $homeurl.'/scripts/conditions.js'; - $js_admin_includes[]= $rooturl.'/scripts/jquery/lime-conditions-tabs.js'; - - if ($subaction == "editthiscondition" && isset($p_cid)) - { - $submitLabel = $clang->gT("Update condition"); - $submitSubaction = "updatecondition"; - $submitcid = sanitize_int($p_cid); - } - else - { - $submitLabel = $clang->gT("Add condition"); - $submitSubaction = "insertcondition"; - $submitcid = ""; - } - - $conditionsoutput_main_content .= "
    \n" - ."
    \n"; - - // Begin buttons row - $conditionsoutput_main_content .= "
    \n" - ."\t\n" - ."\t\n" - ."\n" - ."\n" - ."\n" - ."\n" - ."\n" - ."\n" - ."\n" // auto-select tab by jQuery when editing a condition - ."\n" // auto-select tab by jQuery when editing a condition - ."\n" // auto-select target answers by jQuery when editing a condition - ."
    \n" - ."
    \n"; - - if (!isset($js_getAnswers_onload)) - { - $js_getAnswers_onload = ''; - } - - $conditionsoutput_main_content .= "\n"; - $conditionsoutput_main_content .= "
    \n"; - -$conditionsoutput = $conditionsoutput_header -. $conditionsoutput_menubar -. $conditionsoutput_action_error -. $conditionsoutput_main_content; - - -////////////// FUNCTIONS ///////////////////////////// - -function showSpeaker($hinttext) -{ - global $clang, $imageurl, $max; - - if(!isset($max)) - { - $max = 20; - } - $htmlhinttext=str_replace("'",''',$hinttext); //the string is already HTML except for single quotes so we just replace these only - $jshinttext=javascript_escape($hinttext,true,true); - - if(strlen(html_entity_decode($hinttext,ENT_QUOTES,'UTF-8')) > ($max+3)) - { - $shortstring = FlattenText($hinttext); - - $shortstring = htmlspecialchars(mb_strcut(html_entity_decode($shortstring,ENT_QUOTES,'UTF-8'), 0, $max, 'UTF-8')); - - //output with hoover effect - $reshtml= "gT("Question","js").": $jshinttext')\" />" - ." \"$shortstring...\" " - ."$htmlhinttextgT("Question","js").": $jshinttext')\" />"; - } - else - { - $shortstring = FlattenText($hinttext); - - $reshtml= " \"$shortstring\""; - } - - return $reshtml; - -} diff --git a/include/limesurvey/admin/cronjobs/bounceprocessingcron.php b/include/limesurvey/admin/cronjobs/bounceprocessingcron.php deleted file mode 100644 index 8b1fbb7a..00000000 --- a/include/limesurvey/admin/cronjobs/bounceprocessingcron.php +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/include/limesurvey/admin/database.php b/include/limesurvey/admin/database.php deleted file mode 100644 index 32405341..00000000 --- a/include/limesurvey/admin/database.php +++ /dev/null @@ -1,1553 +0,0 @@ -FetchRow(); - return $gv['maxorder']; -} - -$databaseoutput =''; - -if(isset($surveyid)) -{ - if ($action == "insertquestiongroup" && bHasSurveyPermission($surveyid, 'surveycontent','create')) - { - $grplangs = GetAdditionalLanguagesFromSurveyID($postsid); - $baselang = GetBaseLanguageFromSurveyID($postsid); - $grplangs[] = $baselang; - $errorstring = ''; - foreach ($grplangs as $grouplang) - { - if (!$_POST['group_name_'.$grouplang]) { $errorstring.= GetLanguageNameFromCode($grouplang,false)."\\n";} - } - if ($errorstring!='') - { - $databaseoutput .= "\n"; - } - - else - { - $first=true; - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - - foreach ($grplangs as $grouplang) - { - //Clean XSS - if ($filterxsshtml) - { - $_POST['group_name_'.$grouplang]=$myFilter->process(html_entity_decode($_POST['group_name_'.$grouplang], ENT_QUOTES, "UTF-8")); - $_POST['description_'.$grouplang]=$myFilter->process(html_entity_decode($_POST['description_'.$grouplang], ENT_QUOTES, "UTF-8")); - } - else - { - $_POST['group_name_'.$grouplang] = html_entity_decode($_POST['group_name_'.$grouplang], ENT_QUOTES, "UTF-8"); - $_POST['description_'.$grouplang] = html_entity_decode($_POST['description_'.$grouplang], ENT_QUOTES, "UTF-8"); - } - - // Fix bug with FCKEditor saving strange BR types - $_POST['group_name_'.$grouplang]=fix_FCKeditor_text($_POST['group_name_'.$grouplang]); - $_POST['description_'.$grouplang]=fix_FCKeditor_text($_POST['description_'.$grouplang]); - $grelevance = (isset($_POST['grelevance']) ? $_POST['grelevance'] : 1); - - - if ($first) - { - $query = "INSERT INTO ".db_table_name('groups')." (sid, group_name, description, grelevance, group_order, language) VALUES ('".db_quote($postsid)."', '".db_quote($_POST['group_name_'.$grouplang])."', '".db_quote($_POST['description_'.$grouplang])."','".db_quote($grelevance)."',".getMaxgrouporder(returnglobal('sid')).",'{$grouplang}')"; - $result = $connect->Execute($query); // Checked - $groupid=$connect->Insert_Id(db_table_name_nq('groups'),"gid"); - $first=false; - } - else{ - db_switchIDInsert('groups',true); - $query = "INSERT INTO ".db_table_name('groups')." (gid, sid, group_name, description, grelevance, group_order, language) VALUES ('{$groupid}','".db_quote($postsid)."', '".db_quote($_POST['group_name_'.$grouplang])."', '".db_quote($_POST['description_'.$grouplang])."','".db_quote($grelevance)."',".getMaxgrouporder(returnglobal('sid')).",'{$grouplang}')"; - $result = $connect->Execute($query) or safe_die("Error
    ".$query."
    ".$connect->ErrorMsg()); // Checked - db_switchIDInsert('groups',false); - } - if (!$result) - { - $databaseoutput .= $clang->gT("Error: The database reported the following error:")."
    \n"; - $databaseoutput .= "" . htmlspecialchars($connect->ErrorMsg()) . "\n"; - $databaseoutput .= "
    ".htmlspecialchars($query)."
    \n"; - $databaseoutput .= "\n"; - exit; - } - } - // This line sets the newly inserted group as the new group - if (isset($groupid)){$gid=$groupid;} - $_SESSION['flashmessage'] = $clang->gT("New question group was saved."); - - } - } - - elseif ($action == "updategroup" && bHasSurveyPermission($surveyid, 'surveycontent','update')) - { - $grplangs = GetAdditionalLanguagesFromSurveyID($postsid); - $baselang = GetBaseLanguageFromSurveyID($postsid); - array_push($grplangs,$baselang); - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - foreach ($grplangs as $grplang) - { - if (isset($grplang) && $grplang != "") - { - if ($filterxsshtml) - { - $_POST['group_name_'.$grplang]=$myFilter->process($_POST['group_name_'.$grplang]); - $_POST['description_'.$grplang]=$myFilter->process($_POST['description_'.$grplang]); - } - else - { - $_POST['group_name_'.$grplang] = html_entity_decode($_POST['group_name_'.$grplang], ENT_QUOTES, "UTF-8"); - $_POST['description_'.$grplang] = html_entity_decode($_POST['description_'.$grplang], ENT_QUOTES, "UTF-8"); - } - - // Fix bug with FCKEditor saving strange BR types - $_POST['group_name_'.$grplang]=fix_FCKeditor_text($_POST['group_name_'.$grplang]); - $_POST['description_'.$grplang]=fix_FCKeditor_text($_POST['description_'.$grplang]); - - // don't use array_map db_quote on POST - // since this is iterated for each language - //$_POST = array_map('db_quote', $_POST); - $ugquery = "UPDATE ".db_table_name('groups')." SET group_name='".db_quote($_POST['group_name_'.$grplang])."', description='".db_quote($_POST['description_'.$grplang])."', grelevance='".db_quote($_POST['grelevance'])."' WHERE sid=".db_quote($postsid)." AND gid=".db_quote($postgid)." AND language='{$grplang}'"; - $ugresult = $connect->Execute($ugquery); // Checked - if ($ugresult) - { - $groupsummary = getgrouplist($postgid); - } - else - { - $databaseoutput .= "\n"; - exit; - } - } - } - $_SESSION['flashmessage'] = $clang->gT("Question group successfully saved."); - } - - - elseif ($action == "delgroup" && bHasSurveyPermission($surveyid, 'surveycontent','delete')) - { - LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); - - if (!isset($gid)) $gid=returnglobal('gid'); - $query = "SELECT qid FROM ".db_table_name('groups')." g, ".db_table_name('questions')." q WHERE g.gid=q.gid AND g.gid=$gid AND q.parent_qid=0 group by qid"; - if ($result = db_execute_assoc($query)) // Checked - { - while ($row=$result->FetchRow()) - { - $connect->Execute("DELETE FROM {$dbprefix}conditions WHERE qid={$row['qid']}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}question_attributes WHERE qid={$row['qid']}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}answers WHERE qid={$row['qid']}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}questions WHERE qid={$row['qid']} or parent_qid={$row['qid']}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}defaultvalues WHERE qid={$row['qid']}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}quota_members WHERE qid={$qid}"); - } - } - $query = "DELETE FROM ".db_table_name('assessments')." WHERE sid=$surveyid AND gid=$gid"; - $result = $connect->Execute($query) or safe_die($connect->ErrorMsg()); // Checked - - $query = "DELETE FROM ".db_table_name('groups')." WHERE sid=$surveyid AND gid=$gid"; - $result = $connect->Execute($query) or safe_die($connect->ErrorMsg()); // Checked - if ($result) - { - $gid = ""; - $groupselect = getgrouplist($gid); - fixSortOrderGroups($surveyid); - $_SESSION['flashmessage'] = $clang->gT("The question group was deleted."); - } - else - { - $databaseoutput .= "\n"; - } - LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); - } - - elseif ($action == "insertquestion" && bHasSurveyPermission($surveyid, 'surveycontent','create')) - { - $baselang = GetBaseLanguageFromSurveyID($postsid); - if (strlen($_POST['title']) < 1) - { - $databaseoutput .= "\n"; - } - else - { - if (!isset($_POST['lid']) || $_POST['lid'] == '') {$_POST['lid']="0";} - if (!isset($_POST['lid1']) || $_POST['lid1'] == '') {$_POST['lid1']="0";} - if(!empty($_POST['questionposition']) || $_POST['questionposition'] == '0') - { - //Bug Fix: remove +1 -> $question_order=(sanitize_int($_POST['questionposition'])+1); - $question_order=(sanitize_int($_POST['questionposition'])); - //Need to renumber all questions on or after this - $cdquery = "UPDATE ".db_table_name('questions')." SET question_order=question_order+1 WHERE gid=".$postgid." AND question_order >= ".$question_order; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); // Checked - } else { - $question_order=(getMaxquestionorder($postgid)); - $question_order++; - } - - if ($filterxsshtml) - { - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - $_POST['title']=$myFilter->process($_POST['title']); - $_POST['question_'.$baselang]=$myFilter->process($_POST['question_'.$baselang]); - $_POST['help_'.$baselang]=$myFilter->process($_POST['help_'.$baselang]); - } - else - { - $_POST['title'] = html_entity_decode($_POST['title'], ENT_QUOTES, "UTF-8"); - $_POST['question_'.$baselang] = html_entity_decode($_POST['question_'.$baselang], ENT_QUOTES, "UTF-8"); - $_POST['help_'.$baselang] = html_entity_decode($_POST['help_'.$baselang], ENT_QUOTES, "UTF-8"); - } - - // Fix bug with FCKEditor saving strange BR types - $_POST['title']=fix_FCKeditor_text($_POST['title']); - $_POST['question_'.$baselang]=fix_FCKeditor_text($_POST['question_'.$baselang]); - $_POST['help_'.$baselang]=fix_FCKeditor_text($_POST['help_'.$baselang]); - - $_POST = array_map('db_quote', $_POST); - $query = "INSERT INTO ".db_table_name('questions')." (sid, gid, type, title, question, preg, help, other, mandatory, question_order, relevance, language)" - ." VALUES ('{$postsid}', '{$postgid}', '{$_POST['type']}', '{$_POST['title']}'," - ." '{$_POST['question_'.$baselang]}', '{$_POST['preg']}', '{$_POST['help_'.$baselang]}', '{$_POST['other']}', '{$_POST['mandatory']}', $question_order,'".db_quote($_POST['relevance'])."','{$baselang}')"; - $result = $connect->Execute($query); // Checked - // Get the last inserted questionid for other languages - $qid=$connect->Insert_ID(db_table_name_nq('questions'),"qid"); - - // Add other languages - if ($result) - { - $addlangs = GetAdditionalLanguagesFromSurveyID($postsid); - foreach ($addlangs as $alang) - { - if ($alang != "") - { - db_switchIDInsert('questions',true); - $query = "INSERT INTO ".db_table_name('questions')." (qid, sid, gid, type, title, question, preg, help, other, mandatory, question_order, language)" - ." VALUES ('$qid','{$postsid}', '{$postgid}', '{$_POST['type']}', '{$_POST['title']}'," - ." '{$_POST['question_'.$alang]}', '{$_POST['preg']}', '{$_POST['help_'.$alang]}', '{$_POST['other']}', '{$_POST['mandatory']}', $question_order,'{$alang}')"; - $result2 = $connect->Execute($query); // Checked - if (!$result2) - { - $databaseoutput .= "\n"; - - } - db_switchIDInsert('questions',false); - } - } - } - - - if (!$result) - { - $databaseoutput .= "\n"; - - } - - $qattributes=questionAttributes(); - $validAttributes=$qattributes[$_POST['type']]; - foreach ($validAttributes as $validAttribute) - { - if (isset($_POST[$validAttribute['name']])) - { - if ($filterxsshtml) - { - $_POST[$validAttribute['name']]=$myFilter->process($_POST[$validAttribute['name']]); - } - $query = "INSERT into ".db_table_name('question_attributes')." - (qid, value, attribute) values ($qid,'".db_quote($_POST[$validAttribute['name']])."','{$validAttribute['name']}')"; - $result = $connect->Execute($query) or safe_die("Error updating attribute value
    ".$query."
    ".$connect->ErrorMsg()); // Checked - - } - } - - fixsortorderQuestions($postgid, $surveyid); - $_SESSION['flashmessage'] = $clang->gT("Question was successfully added."); - - //include("surveytable_functions.php"); - //surveyFixColumns($surveyid); - } - LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting - } - elseif ($action == "renumberquestions" && bHasSurveyPermission($surveyid, 'surveycontent','update')) - { - //Automatically renumbers the "question codes" so that they follow - //a methodical numbering method - $style = ((isset($_POST['style']) && $_POST['style']=="bygroup") ? 'bygroup' : 'straight'); - $question_number=1; - $group_number=0; - $gseq=0; - $gselect="SELECT a.qid, a.gid\n" - ."FROM ".db_table_name('questions')." as a, ".db_table_name('groups')."\n" - ."WHERE a.gid=".db_table_name('groups').".gid AND a.sid=$surveyid AND a.parent_qid=0 " - ."GROUP BY a.gid, a.qid, ".db_table_name('groups').".group_order, question_order\n" - ."ORDER BY ".db_table_name('groups').".group_order, question_order"; - $gresult=db_execute_assoc($gselect) or safe_die ("Error: ".$connect->ErrorMsg()); // Checked - $grows = array(); //Create an empty array in case FetchRow does not return any rows - while ($grow = $gresult->FetchRow()) {$grows[] = $grow;} // Get table output into array - foreach($grows as $grow) - { - //Go through all the questions - if ($style == 'bygroup' && (!isset($group_number) || $group_number != $grow['gid'])) - { //If we're doing this by group, restart the numbering when the group number changes - $question_number=1; - $group_number = $grow['gid']; - $gseq++; - } - $usql="UPDATE ".db_table_name('questions')."\n" - ."SET title='" - .(($style == 'bygroup') ? ('G' . $gseq . '_') : '') - ."Q".str_pad($question_number, 4, "0", STR_PAD_LEFT)."'\n" - ."WHERE qid=".$grow['qid']; - //$databaseoutput .= "[$sql]"; - $uresult=$connect->Execute($usql) or safe_die("Error: ".$connect->ErrorMsg()); // Checked - $question_number++; - $group_number=$grow['gid']; - } - $_SESSION['flashmessage'] = $clang->gT("Question codes were successfully regenerated."); - LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting - } - - - elseif ($action == "updatedefaultvalues" && bHasSurveyPermission($surveyid, 'surveycontent','update')) - { - - $questlangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($questlangs,$baselang); - - // same_default value on/off for question - $uqquery = "UPDATE ".db_table_name('questions'); - if (isset($_POST['samedefault'])) - { - $uqquery .= "SET same_default = '1' "; - } - else - { - $uqquery .= "SET same_default = '0' "; - } - $uqquery .= "WHERE sid='".$postsid."' AND qid='".$postqid."'"; - $uqresult = $connect->Execute($uqquery) or safe_die ("Error Update Question: ".$uqquery."
    ".$connect->ErrorMsg()); - if (!$uqresult) - { - $databaseoutput .= "\n"; - } - - $questiontype=$connect->GetOne("SELECT type FROM ".db_table_name('questions')." WHERE qid=$postqid"); - $qtproperties=getqtypelist('','array'); - if ($qtproperties[$questiontype]['answerscales']>0 && $qtproperties[$questiontype]['subquestions']==0) - { - for ($scale_id=0;$scale_id<$qtproperties[$questiontype]['answerscales'];$scale_id++) - { - foreach ($questlangs as $language) - { - if (isset($_POST['defaultanswerscale_'.$scale_id.'_'.$language])) - { - Updatedefaultvalues($postqid,0,$scale_id,'',$language,$_POST['defaultanswerscale_'.$scale_id.'_'.$language],true); - } - if (isset($_POST['other_'.$scale_id.'_'.$language])) - { - Updatedefaultvalues($postqid,0,$scale_id,'other',$language,$_POST['other_'.$scale_id.'_'.$language],true); - } - } - } - } - if ($qtproperties[$questiontype]['subquestions']>0) - { - - foreach ($questlangs as $language) - { - $sqquery = "SELECT * FROM ".db_table_name('questions')." WHERE sid=$surveyid AND gid=$gid AND parent_qid=$postqid and language=".db_quoteall($language)." and scale_id=0 order by question_order"; - $sqresult = db_execute_assoc($sqquery); - $sqrows = $sqresult->GetRows(); - - for ($scale_id=0;$scale_id<$qtproperties[$questiontype]['subquestions'];$scale_id++) - { - foreach ($sqrows as $aSubquestionrow) - { - if (isset($_POST['defaultanswerscale_'.$scale_id.'_'.$language.'_'.$aSubquestionrow['qid']])) - { - Updatedefaultvalues($postqid,$aSubquestionrow['qid'],$scale_id,'',$language,$_POST['defaultanswerscale_'.$scale_id.'_'.$language.'_'.$aSubquestionrow['qid']],true); - } -/* if (isset($_POST['other_'.$scale_id.'_'.$language])) - { - Updatedefaultvalues($postqid,$qid,$scale_id,'other',$language,$_POST['other_'.$scale_id.'_'.$language],true); - } */ - - } - } - } - } - if ($qtproperties[$questiontype]['answerscales']==0 && $qtproperties[$questiontype]['subquestions']==0) - { - foreach ($questlangs as $language) - { - if (isset($_POST['defaultanswerscale_0_'.$language.'_0'])) - { - Updatedefaultvalues($postqid,0,0,'',$language,$_POST['defaultanswerscale_0_'.$language.'_0'],true); - } - } - } - $_SESSION['flashmessage'] = $clang->gT("Default value settings were successfully saved."); - LimeExpressionManager::SetDirtyFlag(); - } - - - elseif ($action == "updatequestion" && bHasSurveyPermission($surveyid, 'surveycontent','update')) - { - LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); - - $cqquery = "SELECT type, gid FROM ".db_table_name('questions')." WHERE qid={$postqid}"; - $cqresult=db_execute_assoc($cqquery) or safe_die ("Couldn't get question type to check for change
    ".$cqquery."
    ".$connect->ErrorMsg()); // Checked - $cqr=$cqresult->FetchRow(); - $oldtype=$cqr['type']; - $oldgid=$cqr['gid']; - - if ($filterxsshtml) - { - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - } - - // Remove invalid question attributes on saving - $qattributes=questionAttributes(); - $attsql="delete from ".db_table_name('question_attributes')." where qid='{$postqid}' and "; - if (isset($qattributes[$_POST['type']])){ - $validAttributes=$qattributes[$_POST['type']]; - foreach ($validAttributes as $validAttribute) - { - $attsql.='attribute<>'.db_quoteall($validAttribute['name'])." and "; - } - } - $attsql.='1=1'; - db_execute_assoc($attsql) or safe_die ("Couldn't delete obsolete question attributes
    ".$attsql."
    ".$connect->ErrorMsg()); // Checked - - - //now save all valid attributes - $validAttributes=$qattributes[$_POST['type']]; - foreach ($validAttributes as $validAttribute) - { - - if (isset($_POST[$validAttribute['name']])) - { - - if ($filterxsshtml) - { - $sAttributeValue=$myFilter->process($_POST[$validAttribute['name']]); - } - else - { - $sAttributeValue=$_POST[$validAttribute['name']]; - } - if ($validAttribute['name']=='multiflexible_step' && trim($sAttributeValue)!='') { - $sAttributeValue=floatval($sAttributeValue); - if ($sAttributeValue==0) $sAttributeValue=1; - }; - $query = "select qaid from ".db_table_name('question_attributes')." - WHERE attribute='".$validAttribute['name']."' AND qid=".$qid; - $result = $connect->Execute($query) or safe_die("Error updating attribute value
    ".$query."
    ".$connect->ErrorMsg()); // Checked - if ($result->Recordcount()>0) - { - $query = "UPDATE ".db_table_name('question_attributes')." - SET value='".db_quote($sAttributeValue)."' WHERE attribute='".$validAttribute['name']."' AND qid=".$qid; - $result = $connect->Execute($query) or safe_die("Error updating attribute value
    ".$query."
    ".$connect->ErrorMsg()); // Checked - } - else - { - $query = "INSERT into ".db_table_name('question_attributes')." - (qid, value, attribute) values ($qid,'".db_quote($sAttributeValue)."','{$validAttribute['name']}')"; - $result = $connect->Execute($query) or safe_die("Error updating attribute value
    ".$query."
    ".$connect->ErrorMsg()); // Checked - } - } - } - - - $qtypes=getqtypelist('','array'); - // These are the questions types that have no answers and therefore we delete the answer in that case - $iAnswerScales = $qtypes[$_POST['type']]['answerscales']; - $iSubquestionScales = $qtypes[$_POST['type']]['subquestions']; - - // These are the questions types that have the other option therefore we set everything else to 'No Other' - if (($_POST['type']!= "L") && ($_POST['type']!= "!") && ($_POST['type']!= "P") && ($_POST['type']!="M")) - { - $_POST['other']='N'; - } - - // These are the questions types that have no validation - so zap it accordingly - if ($_POST['type']== "!" || $_POST['type']== "L" || $_POST['type']== "M" || $_POST['type']== "P" || - $_POST['type']== "F" || $_POST['type']== "H" || - $_POST['type']== "X" || $_POST['type']== "") - { - $_POST['preg']=''; - } - - // These are the questions types that have no mandatory property - so zap it accordingly - if ($_POST['type']== "X" || $_POST['type']== "|") - { - $_POST['mandatory']='N'; - } - - - if ($oldtype != $_POST['type']) - { - //Make sure there are no conditions based on this question, since we are changing the type - $ccquery = "SELECT * FROM ".db_table_name('conditions')." WHERE cqid={$postqid}"; - $ccresult = db_execute_assoc($ccquery) or safe_die ("Couldn't get list of cqids for this question
    ".$ccquery."
    ".$connect->ErrorMsg()); // Checked - $cccount=$ccresult->RecordCount(); - while ($ccr=$ccresult->FetchRow()) {$qidarray[]=$ccr['qid'];} - if (isset($qidarray) && $qidarray) {$qidlist=implode(", ", $qidarray);} - } - if (isset($cccount) && $cccount) - { - $databaseoutput .= "\n"; - } - else - { - if (isset($postgid) && $postgid != "") - { - - $questlangs = GetAdditionalLanguagesFromSurveyID($postsid); - $baselang = GetBaseLanguageFromSurveyID($postsid); - array_push($questlangs,$baselang); - if ($filterxsshtml) - { - $_POST['title']=$myFilter->process($_POST['title']); - } - else - { - $_POST['title'] = html_entity_decode($_POST['title'], ENT_QUOTES, "UTF-8"); - } - - // Fix bug with FCKEditor saving strange BR types - $_POST['title']=fix_FCKeditor_text($_POST['title']); - - foreach ($questlangs as $qlang) - { - if ($filterxsshtml) - { - $_POST['question_'.$qlang]=$myFilter->process(html_entity_decode($_POST['question_'.$qlang], ENT_QUOTES, "UTF-8")); - $_POST['help_'.$qlang]=$myFilter->process(html_entity_decode($_POST['help_'.$qlang], ENT_QUOTES, "UTF-8")); - } - else - { - $_POST['question_'.$qlang] = html_entity_decode($_POST['question_'.$qlang], ENT_QUOTES, "UTF-8"); - $_POST['help_'.$qlang] = html_entity_decode($_POST['help_'.$qlang], ENT_QUOTES, "UTF-8"); - } - // Fix bug with FCKEditor saving strange BR types - $_POST['question_'.$qlang]=fix_FCKeditor_text($_POST['question_'.$qlang]); - $_POST['help_'.$qlang]=fix_FCKeditor_text($_POST['help_'.$qlang]); - - if (isset($qlang) && $qlang != "") - { // ToDo: Sanitize the POST variables ! - $uqquery = "UPDATE ".db_table_name('questions') - . "SET type='".db_quote($_POST['type'])."', title='".db_quote($_POST['title'])."', " - . "question='".db_quote($_POST['question_'.$qlang])."', preg='".db_quote($_POST['preg'])."', help='".db_quote($_POST['help_'.$qlang])."', " - . "gid='".db_quote($postgid)."', other='".db_quote($_POST['other'])."', " - . "mandatory='".db_quote($_POST['mandatory'])."'" - . ", relevance='".db_quote($_POST['relevance'])."'";; - if ($oldgid!=$postgid) - { - if ( getGroupOrder(returnglobal('sid'),$oldgid) > getGroupOrder(returnglobal('sid'),returnglobal('gid')) ) - { - // Moving question to a 'upper' group - // insert question at the end of the destination group - // this prevent breaking conditions if the target qid is in the dest group - $insertorder = getMaxquestionorder($postgid) + 1; - $uqquery .=', question_order='.$insertorder.' '; - } - else - { - // Moving question to a 'lower' group - // insert question at the beginning of the destination group - shiftorderQuestions($postsid,$postgid,1); // makes 1 spare room for new question at top of dest group - $uqquery .=', question_order=0 '; - } - } - $uqquery.= "WHERE sid='".$postsid."' AND qid='".$postqid."' AND language='{$qlang}'"; - $uqresult = $connect->Execute($uqquery) or safe_die ("Error Update Question: ".$uqquery."
    ".$connect->ErrorMsg()); // Checked - if (!$uqresult) - { - $databaseoutput .= "\n"; - } - - } - } - // Update the group ID on subquestions, too - if ($oldgid!=$postgid) - { - $sQuery="UPDATE ".db_table_name('questions')." set gid={$postgid} where gid={$oldgid} and parent_qid>0"; - $oResult = $connect->Execute($sQuery) or safe_die ("Error updating question group ID: ".$uqquery."
    ".$connect->ErrorMsg()); // Checked - } - // if the group has changed then fix the sortorder of old and new group - if ($oldgid!=$postgid) - { - fixsortorderQuestions($oldgid, $surveyid); - fixsortorderQuestions($postgid, $surveyid); - // If some questions have conditions set on this question's answers - // then change the cfieldname accordingly - fixmovedquestionConditions($postqid, $oldgid, $postgid); - } - - $query = "DELETE FROM ".db_table_name('answers')." WHERE qid= {$postqid} and scale_id>={$iAnswerScales}"; - $result = $connect->Execute($query) or safe_die("Error: ".$connect->ErrorMsg()); // Checked - - // Remove old subquestion scales - $query = "DELETE FROM ".db_table_name('questions')." WHERE parent_qid={$postqid} and scale_id>={$iSubquestionScales}"; - $result = $connect->Execute($query) or safe_die("Error: ".$connect->ErrorMsg()); // Checked - $_SESSION['flashmessage'] = $clang->gT("Question was successfully saved."); - - - } - else - { - $databaseoutput .= "\n"; - } - } - LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); - } - - elseif ($action == "copynewquestion" && bHasSurveyPermission($surveyid, 'surveycontent','create')) - { - - if (!$_POST['title']) - { - $databaseoutput .= "\n"; - } - else - { - $questlangs = GetAdditionalLanguagesFromSurveyID($postsid); - $baselang = GetBaseLanguageFromSurveyID($postsid); - - //Get maximum order from the question group - $max=get_max_question_order($postgid)+1 ; - // Insert the base language of the question - if ($filterxsshtml) - { - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - // Prevent XSS attacks - $_POST['title']=$myFilter->process($_POST['title']); - $_POST['question_'.$baselang]=$myFilter->process($_POST['question_'.$baselang]); - $_POST['help_'.$baselang]=$myFilter->process($_POST['help_'.$baselang]); - } - else - { - $_POST['title'] = html_entity_decode($_POST['title'], ENT_QUOTES, "UTF-8"); - $_POST['question_'.$baselang] = html_entity_decode($_POST['question_'.$baselang], ENT_QUOTES, "UTF-8"); - $_POST['help_'.$baselang] = html_entity_decode($_POST['help_'.$baselang], ENT_QUOTES, "UTF-8"); - } - - - // Fix bug with FCKEditor saving strange BR types - $_POST['title']=fix_FCKeditor_text($_POST['title']); - $_POST['question_'.$baselang]=fix_FCKeditor_text($_POST['question_'.$baselang]); - $_POST['help_'.$baselang]=fix_FCKeditor_text($_POST['help_'.$baselang]); - $_POST = array_map('db_quote', $_POST); - $query = "INSERT INTO {$dbprefix}questions (sid, gid, type, title, question, preg, help, other, mandatory, relevance, question_order, language) - VALUES ({$postsid}, {$postgid}, '{$_POST['type']}', '{$_POST['title']}', '".$_POST['question_'.$baselang]."', '{$_POST['preg']}', '".$_POST['help_'.$baselang]."', '{$_POST['other']}', '{$_POST['mandatory']}', '{$_POST['relevance']}', $max,".db_quoteall($baselang).")"; - $result = $connect->Execute($query) or safe_die($connect->ErrorMsg()); // Checked - $newqid = $connect->Insert_ID("{$dbprefix}questions","qid"); - if (!$result) - { - $databaseoutput .= "\n"; - - } - - foreach ($questlangs as $qlanguage) - { - if ($filterxsshtml) - { - $_POST['question_'.$qlanguage]=$myFilter->process($_POST['question_'.$qlanguage]); - $_POST['help_'.$qlanguage]=$myFilter->process($_POST['help_'.$qlanguage]); - } - else - { - $_POST['question_'.$qlanguage] = html_entity_decode($_POST['question_'.$qlanguage], ENT_QUOTES, "UTF-8"); - $_POST['help_'.$qlanguage] = html_entity_decode($_POST['help_'.$qlanguage], ENT_QUOTES, "UTF-8"); - } - - // Fix bug with FCKEditor saving strange BR types - $_POST['question_'.$qlanguage]=fix_FCKeditor_text($_POST['question_'.$qlanguage]); - $_POST['help_'.$qlanguage]=fix_FCKeditor_text($_POST['help_'.$qlanguage]); - - db_switchIDInsert('questions',true); - $query = "INSERT INTO {$dbprefix}questions (qid, sid, gid, type, title, question, help, other, mandatory, relevance, question_order, language) - VALUES ($newqid,{$postsid}, {$postgid}, '{$_POST['type']}', '{$_POST['title']}', '".$_POST['question_'.$qlanguage]."', '".$_POST['help_'.$qlanguage]."', '{$_POST['other']}', '{$_POST['mandatory']}', '{$_POST['relevance']}', $max,".db_quoteall($qlanguage).")"; - $result = $connect->Execute($query) or safe_die($connect->ErrorMsg()); // Checked - db_switchIDInsert('questions',false); - } - if (!$result) - { - $databaseoutput .= "\n"; - - } - if (returnglobal('copysubquestions') == "Y") - { - $aSQIDMappings=array(); - $q1 = "SELECT * FROM {$dbprefix}questions WHERE parent_qid=" - . returnglobal('oldqid') - . " ORDER BY question_order"; - $r1 = db_execute_assoc($q1); // Checked - $tablename=$dbprefix.'questions'; - while ($qr1 = $r1->FetchRow()) - { - $qr1['parent_qid']=$newqid; - if (isset($aSQIDMappings[$qr1['qid']])) - { - $qr1['qid']=$aSQIDMappings[$qr1['qid']]; - db_switchIDInsert('questions',true); - } - else - { - $oldqid=$qr1['qid']; - unset($qr1['qid']); - } - $qr1['gid']=$postgid; - $sInsertSQL = $connect->GetInsertSQL($tablename,$qr1); - $ir1 = $connect->Execute($sInsertSQL); // Checked - if (isset($qr1['qid'])) - { - db_switchIDInsert('questions',false); - } - else - { - $aSQIDMappings[$oldqid]=$connect->Insert_ID($tablename,"qid"); - } - - } - } - - if (returnglobal('copyanswers') == "Y") - { - $q1 = "SELECT * FROM {$dbprefix}answers WHERE qid=" - . returnglobal('oldqid') - . " ORDER BY code"; - $r1 = db_execute_assoc($q1); // Checked - while ($qr1 = $r1->FetchRow()) - { - $qr1 = array_map('db_quote', $qr1); - $i1 = "INSERT INTO {$dbprefix}answers (qid, code, answer, sortorder, language, scale_id, assessment_value) " - . "VALUES ('$newqid', '{$qr1['code']}', " - . "'{$qr1['answer']}', " - . "'{$qr1['sortorder']}', '{$qr1['language']}', '{$qr1['scale_id']}', '{$qr1['assessment_value']}')"; - $ir1 = $connect->Execute($i1); // Checked - - } - } - if (returnglobal('copyattributes') == "Y") - { - $q1 = "SELECT * FROM {$dbprefix}question_attributes - WHERE qid=".returnglobal('oldqid')." - ORDER BY qaid"; - $r1 = db_execute_assoc($q1); // Checked - while($qr1 = $r1->FetchRow()) - { - $qr1 = array_map('db_quote', $qr1); - $i1 = "INSERT INTO {$dbprefix}question_attributes - (qid, attribute, value) - VALUES ('$newqid', - '{$qr1['attribute']}', - '{$qr1['value']}')"; - $ir1 = $connect->Execute($i1); // Checked - } // while - } - fixsortorderQuestions($postgid, $surveyid); - $gid=$postgid; //Sets the gid so that admin.php displays whatever group was chosen for this copied question - $qid=$newqid; //Sets the qid so that admin.php displays the newly created question - $_SESSION['flashmessage'] = $clang->gT("Question was successfully copied."); - - LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting - } - } - elseif ($action == "delquestion" && bHasSurveyPermission($surveyid, 'surveycontent','delete')) - { - if (!isset($qid)) {$qid=returnglobal('qid');} - //check if any other questions have conditions which rely on this question. Don't delete if there are. - LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL,$qid); - - $ccquery = "SELECT * FROM {$dbprefix}conditions WHERE cqid=$qid"; - $ccresult = db_execute_assoc($ccquery) or safe_die ("Couldn't get list of cqids for this question
    ".$ccquery."
    ".$connect->ErrorMsg()); // Checked - $cccount=$ccresult->RecordCount(); - while ($ccr=$ccresult->FetchRow()) {$qidarray[]=$ccr['qid'];} - if (isset($qidarray)) {$qidlist=implode(", ", $qidarray);} - if ($cccount) //there are conditions dependent on this question - { - $databaseoutput .= "\n"; - } - else - { - $gid = $connect->GetOne("SELECT gid FROM ".db_table_name('questions')." WHERE qid={$qid}"); // Checked - - //see if there are any conditions/attributes/answers/defaultvalues for this question, and delete them now as well - $connect->Execute("DELETE FROM {$dbprefix}conditions WHERE qid={$qid}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}question_attributes WHERE qid={$qid}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}answers WHERE qid={$qid}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}questions WHERE qid={$qid} or parent_qid={$qid}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}defaultvalues WHERE qid={$qid}"); // Checked - $connect->Execute("DELETE FROM {$dbprefix}quota_members WHERE qid={$qid}"); - fixsortorderQuestions($gid, $surveyid); - - $qid=""; - $postqid=""; - $_GET['qid']=""; - } - $_SESSION['flashmessage'] = $clang->gT("Question was successfully deleted."); - } - - elseif ($action == "updateansweroptions" && bHasSurveyPermission($surveyid, 'surveycontent','update')) - { - - $anslangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - - $alllanguages = $anslangs; - array_unshift($alllanguages,$baselang); - - - $query = "select type from ".db_table_name('questions')." where qid=$qid"; - $questiontype = $connect->GetOne($query); // Checked - $qtypes=getqtypelist('','array'); - $scalecount=$qtypes[$questiontype]['answerscales']; - - $count=0; - $invalidCode = 0; - $duplicateCode = 0; - - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - - //First delete all answers - $query = "delete from ".db_table_name('answers')." where qid=".db_quote($qid); - $result = $connect->Execute($query); // Checked - - LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); - - for ($scale_id=0;$scale_id<$scalecount;$scale_id++) - { - $maxcount=(int)$_POST['answercount_'.$scale_id]; - for ($sortorderid=1;$sortorderid<$maxcount;$sortorderid++) - { - $code=sanitize_paranoid_string($_POST['code_'.$sortorderid.'_'.$scale_id]); - if (isset($_POST['oldcode_'.$sortorderid.'_'.$scale_id])) { - $oldcode=sanitize_paranoid_string($_POST['oldcode_'.$sortorderid.'_'.$scale_id]); - if($code !== $oldcode) { - $query='UPDATE '.db_table_name('conditions').' SET value='.db_quoteall($code).' WHERE cqid='.db_quote($qid).' AND value='.db_quoteall($oldcode); - $connect->execute($query); - } - } - $assessmentvalue=(int) $_POST['assessment_'.$sortorderid.'_'.$scale_id]; - foreach ($alllanguages as $language) - { - $answer=$_POST['answer_'.$language.'_'.$sortorderid.'_'.$scale_id]; - if ($filterxsshtml) - { - //Sanitize input, strip XSS - $answer=$myFilter->process($answer); - } - else - { - $answer=html_entity_decode($answer, ENT_QUOTES, "UTF-8"); - } - // Fix bug with FCKEditor saving strange BR types - $answer=fix_FCKeditor_text($answer); - - // Now we insert the answers - $query = "INSERT INTO ".db_table_name('answers')." (code,answer,qid,sortorder,language,assessment_value, scale_id) - VALUES (".db_quoteall($code).", ". - db_quoteall($answer).", ". - db_quote($qid).", ". - db_quote($sortorderid).", ". - db_quoteall($language).", ". - db_quote($assessmentvalue).", - $scale_id)"; - if (!$result = $connect->Execute($query)) // Checked - { - $databaseoutput .= "\n"; - } - } // foreach ($alllanguages as $language) - - - } // for ($sortorderid=0;$sortorderid<$maxcount;$sortorderid++) - } // for ($scale_id=0; - - LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); - - if ($invalidCode == 1) $databaseoutput .= "\n"; - if ($duplicateCode == 1) $databaseoutput .= "\n"; - - $sortorderid--; - $_SESSION['flashmessage'] = $clang->gT("Answer options were successfully saved."); - - $action='editansweroptions'; - - } - - elseif ($action == "updatesubquestions" && bHasSurveyPermission($surveyid, 'surveycontent','update')) - { - - $anslangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($anslangs,$baselang); - - $query = "select type from ".db_table_name('questions')." where qid=$qid"; - $questiontype = $connect->GetOne($query); // Checked - $qtypes=getqtypelist('','array'); - $scalecount=$qtypes[$questiontype]['subquestions']; - - // First delete any deleted ids - $deletedqids=explode(' ', trim($_POST['deletedqids'])); - - LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); - - foreach ($deletedqids as $deletedqid) - { - $deletedqid=(int)$deletedqid; - if ($deletedqid>0) - { // don't remove undefined - $query = "DELETE FROM ".db_table_name('questions')." WHERE qid='{$deletedqid}'"; // Checked - if (!$result = $connect->Execute($query)) - { - $databaseoutput .= "\n"; - } - } - } - - //Determine ids by evaluating the hidden field - $rows=array(); - $codes=array(); - $oldcodes=array(); - foreach ($_POST as $postkey=>$postvalue) - { - $postkey=explode('_',$postkey); - if ($postkey[0]=='answer') - { - $rows[$postkey[3]][$postkey[1]][$postkey[2]]=$postvalue; - } - if ($postkey[0]=='code') - { - $codes[$postkey[2]][]=$postvalue; - } - if ($postkey[0]=='oldcode') - { - $oldcodes[$postkey[2]][]=$postvalue; - } - } - $count=0; - $invalidCode = 0; - $duplicateCode = 0; - $dupanswers = array(); - /* - for ($scale_id=0;$scale_id<$scalecount;$scale_id++) - { - - // Find duplicate codes and add these to dupanswers array - $foundCat=array_count_values($codes); - foreach($foundCat as $key=>$value){ - if($value>=2){ - $dupanswers[]=$key; - } - } - } - */ - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - - - //$insertqids=array(); //? - $insertqid = array(); - for ($scale_id=0;$scale_id<$scalecount;$scale_id++) - { - foreach ($anslangs as $language) - { - $position=0; - foreach ($rows[$scale_id][$language] as $subquestionkey=>$subquestionvalue) - { - if (substr($subquestionkey,0,3)!='new') - { - $query='Update '.db_table_name('questions').' set question_order='.($position+1).', title='.db_quoteall($codes[$scale_id][$position]).', question='.db_quoteall($subquestionvalue).', scale_id='.$scale_id.' where qid='.db_quoteall($subquestionkey).' AND language='.db_quoteall($language); - $connect->execute($query); - - if(isset($oldcodes[$scale_id][$position]) && $codes[$scale_id][$position] !== $oldcodes[$scale_id][$position]) { - $query='UPDATE '.db_table_name('conditions').' SET cfieldname="+'.$surveyid.'X'.$gid.'X'.$qid.db_quote($codes[$scale_id][$position]).'" WHERE cqid='.$qid.' AND cfieldname="+'.$surveyid.'X'.$gid.'X'.$qid.db_quote($oldcodes[$scale_id][$position]).'"'; - $connect->execute($query); - $query='UPDATE '.db_table_name('conditions').' SET value="'.db_quote($codes[$scale_id][$position]).'" WHERE cqid='.$qid.' AND cfieldname="'.$surveyid.'X'.$gid.'X'.$qid.'" AND value="'.$oldcodes[$scale_id][$position].'"'; - $connect->execute($query); - } - - } - else - { - if (!isset($insertqid[$scale_id][$position])) - { - $query='INSERT into '.db_table_name('questions').' (sid, gid, question_order, title, question, parent_qid, language, scale_id) values ('.$surveyid.','.$gid.','.($position+1).','.db_quoteall($codes[$scale_id][$position]).','.db_quoteall($subquestionvalue).','.$qid.','.db_quoteall($language).','.$scale_id.')'; - $connect->execute($query); - $insertqid[$scale_id][$position]=$connect->Insert_Id(db_table_name_nq('questions'),"qid"); - } - else - { - db_switchIDInsert('questions',true); - $query='INSERT into '.db_table_name('questions').' (qid, sid, gid, question_order, title, question, parent_qid, language, scale_id) values ('.$insertqid[$scale_id][$position].','.$surveyid.','.$gid.','.($position+1).','.db_quoteall($codes[$scale_id][$position]).','.db_quoteall($subquestionvalue).','.$qid.','.db_quoteall($language).','.$scale_id.')'; - $connect->execute($query); - db_switchIDInsert('questions',false); - } - } - $position++; - } - - } - } - LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); - - //include("surveytable_functions.php"); - //surveyFixColumns($surveyid); - $_SESSION['flashmessage'] = $clang->gT("Subquestions were successfully saved."); - - $action='editsubquestions'; - } - - - elseif (($action == "updatesurveysettingsandeditlocalesettings" || $action == "updatesurveysettings") && bHasSurveyPermission($surveyid,'surveysettings','update')) - { - - $formatdata=getDateFormatData($_SESSION['dateformat']); - if (trim($_POST['expires'])=="") - { - $_POST['expires']=null; - } - else - { - $datetimeobj = new Date_Time_Converter($_POST['expires'], $formatdata['phpdate'].' H:i'); - $_POST['expires']=$datetimeobj->convert("Y-m-d H:i:s"); - } - if (trim($_POST['startdate'])=="") - { - $_POST['startdate']=null; - } - else - { - $datetimeobj = new Date_Time_Converter($_POST['startdate'],$formatdata['phpdate'].' H:i'); - $_POST['startdate']=$datetimeobj->convert("Y-m-d H:i:s"); - } - - //make sure only numbers are passed within the $_POST variable - $_POST['tokenlength'] = (int) $_POST['tokenlength']; - - //token length has to be at least 5, otherwise set it to default (15) - if($_POST['tokenlength'] < 5) - { - $_POST['tokenlength'] = 15; - } - - CleanLanguagesFromSurvey($postsid,$_POST['languageids']); - FixLanguageConsistency($postsid,$_POST['languageids']); - - if($_SESSION['USER_RIGHT_SUPERADMIN'] != 1 && $_SESSION['USER_RIGHT_MANAGE_TEMPLATE'] != 1 && !hasTemplateManageRights($_SESSION['loginID'], $_POST['template'])) $_POST['template'] = "default"; - - $sql = "SELECT * FROM {$dbprefix}surveys WHERE sid={$postsid}"; // We are using $dbrepfix here instead of db_table_name on purpose because GetUpdateSQL doesn't work correclty on Postfres with a quoted table name - $rs = db_execute_assoc($sql); // Checked - $updatearray= array('admin'=>$_POST['admin'], - 'expires'=>$_POST['expires'], - 'adminemail'=>$_POST['adminemail'], - 'startdate'=>$_POST['startdate'], - 'bounce_email'=>$_POST['bounce_email'], - 'anonymized'=>$_POST['anonymized'], - 'faxto'=>$_POST['faxto'], - 'format'=>$_POST['format'], - 'savetimings'=>$_POST['savetimings'], - 'template'=>$_POST['template'], - 'assessments'=>$_POST['assessments'], - 'language'=>$_POST['language'], - 'additional_languages'=>$_POST['languageids'], - 'datestamp'=>$_POST['datestamp'], - 'ipaddr'=>$_POST['ipaddr'], - 'refurl'=>$_POST['refurl'], - 'publicgraphs'=>$_POST['publicgraphs'], - 'usecookie'=>$_POST['usecookie'], - 'allowregister'=>$_POST['allowregister'], - 'allowsave'=>$_POST['allowsave'], - 'navigationdelay'=>$_POST['navigationdelay'], - 'printanswers'=>$_POST['printanswers'], - 'publicstatistics'=>$_POST['publicstatistics'], - 'autoredirect'=>$_POST['autoredirect'], - 'showxquestions'=>$_POST['showxquestions'], - 'showgroupinfo'=>$_POST['showgroupinfo'], - 'showqnumcode'=>$_POST['showqnumcode'], - 'shownoanswer'=>$_POST['shownoanswer'], - 'showwelcome'=>$_POST['showwelcome'], - 'allowprev'=>$_POST['allowprev'], - 'allowjumps'=>$_POST['allowjumps'], - 'nokeyboard'=>$_POST['nokeyboard'], - 'showprogress'=>$_POST['showprogress'], - 'listpublic'=>$_POST['public'], - 'htmlemail'=>$_POST['htmlemail'], - 'tokenanswerspersistence'=>$_POST['tokenanswerspersistence'], - 'alloweditaftercompletion'=>$_POST['alloweditaftercompletion'], - 'usecaptcha'=>$_POST['usecaptcha'], - 'emailresponseto'=>trim($_POST['emailresponseto']), - 'emailnotificationto'=>trim($_POST['emailnotificationto']), - 'googleanalyticsapikey'=>trim($_POST['googleanalyticsapikey']), - 'googleanalyticsstyle'=>trim($_POST['googleanalyticsstyle']), - 'tokenlength'=>$_POST['tokenlength'] - ); - - $usquery=$connect->GetUpdateSQL($rs, $updatearray, false, get_magic_quotes_gpc()); - if ($usquery) { - $usresult = $connect->Execute($usquery) or safe_die("Error updating
    ".$usquery."

    ".$connect->ErrorMsg()); // Checked - } - $sqlstring =''; - foreach (GetAdditionalLanguagesFromSurveyID($surveyid) as $langname) - { - if ($langname) - { - $sqlstring .= "and surveyls_language <> '".$langname."' "; - } - } - // Add base language too - $sqlstring .= "and surveyls_language <> '".GetBaseLanguageFromSurveyID($surveyid)."' "; - - $usquery = "Delete from ".db_table_name('surveys_languagesettings')." where surveyls_survey_id={$postsid} ".$sqlstring; - $usresult = $connect->Execute($usquery) or safe_die("Error deleting obsolete surveysettings
    ".$usquery."

    ".$connect->ErrorMsg()); // Checked - - foreach (GetAdditionalLanguagesFromSurveyID($surveyid) as $langname) - { - if ($langname) - { - $usquery = "select * from ".db_table_name('surveys_languagesettings')." where surveyls_survey_id={$postsid} and surveyls_language='".$langname."'"; - $usresult = $connect->Execute($usquery) or safe_die("Error deleting obsolete surveysettings
    ".$usquery."

    ".$connect->ErrorMsg()); // Checked - if ($usresult->RecordCount()==0) - { - - $bplang = new limesurvey_lang($langname); - $aDefaultTexts=aTemplateDefaultTexts($bplang,'unescaped'); - if (getEmailFormat($surveyid) == "html") - { - $ishtml=true; - $aDefaultTexts['admin_detailed_notification']=$aDefaultTexts['admin_detailed_notification_css'].$aDefaultTexts['admin_detailed_notification']; - } - else - { - $ishtml=false; - } - $languagedetails=getLanguageDetails($langname); - $usquery = "INSERT INTO ".db_table_name('surveys_languagesettings') - ." (surveyls_survey_id, surveyls_language, surveyls_title, " - ." surveyls_email_invite_subj, surveyls_email_invite, " - ." surveyls_email_remind_subj, surveyls_email_remind, " - ." surveyls_email_confirm_subj, surveyls_email_confirm, " - ." surveyls_email_register_subj, surveyls_email_register, " - ." email_admin_notification_subj, email_admin_notification, " - ." email_admin_responses_subj, email_admin_responses, " - ." surveyls_dateformat) " - ." VALUES ({$postsid}, '".$langname."', ''," - .db_quoteall($aDefaultTexts['invitation_subject'])."," - .db_quoteall($aDefaultTexts['invitation'])."," - .db_quoteall($aDefaultTexts['reminder_subject'])."," - .db_quoteall($aDefaultTexts['reminder'])."," - .db_quoteall($aDefaultTexts['confirmation_subject'])."," - .db_quoteall($aDefaultTexts['confirmation'])."," - .db_quoteall($aDefaultTexts['registration_subject'])."," - .db_quoteall($aDefaultTexts['registration'])."," - .db_quoteall($aDefaultTexts['admin_notification_subject'])."," - .db_quoteall($aDefaultTexts['admin_notification'])."," - .db_quoteall($aDefaultTexts['admin_detailed_notification_subject'])."," - .db_quoteall($aDefaultTexts['admin_detailed_notification'])."," - .$languagedetails['dateformat'].")"; - unset($bplang); - $usresult = $connect->Execute($usquery) or safe_die("Error deleting obsolete surveysettings
    ".$usquery."

    ".$connect->ErrorMsg()); // Checked - } - } - } - - - - if ($usresult) - { - $surveyselect = getsurveylist(); - $_SESSION['flashmessage'] = $clang->gT("Survey settings were successfully saved."); - - } - else - { - $databaseoutput .= "\n"; - } - } - - // Save the updated email settings - elseif ($action == "updateemailtemplates" && bHasSurveyPermission($surveyid, 'surveylocale','update')) - { - $_POST = array_map('db_quote', $_POST); - $languagelist = GetAdditionalLanguagesFromSurveyID($surveyid); - $languagelist[]=GetBaseLanguageFromSurveyID($surveyid); - foreach ($languagelist as $langname) - { - if ($langname) - { - $usquery = "UPDATE ".db_table_name('surveys_languagesettings')." \n" - . "SET surveyls_email_invite_subj='".$_POST['email_invite_subj_'.$langname]."', surveyls_email_invite='".$_POST['email_invite_'.$langname]."'," - . "surveyls_email_remind_subj='".$_POST['email_remind_subj_'.$langname]."', surveyls_email_remind='".$_POST['email_remind_'.$langname]."'," - . "surveyls_email_register_subj='".$_POST['email_register_subj_'.$langname]."', surveyls_email_register='".$_POST['email_register_'.$langname]."'," - . "surveyls_email_confirm_subj='".$_POST['email_confirm_subj_'.$langname]."', surveyls_email_confirm='".$_POST['email_confirm_'.$langname]."'," - . "email_admin_notification_subj='".$_POST['email_admin_notification_subj_'.$langname]."', email_admin_notification='".$_POST['email_admin_notification_'.$langname]."'," - . "email_admin_responses_subj='".$_POST['email_admin_responses_subj_'.$langname]."', email_admin_responses='".$_POST['email_admin_responses_'.$langname]."' " - . "WHERE surveyls_survey_id=".$surveyid." and surveyls_language='".$langname."'"; - $usresult = $connect->Execute($usquery) or safe_die("Error updating
    ".$usquery."

    ".$connect->ErrorMsg()); - } - } - $_SESSION['flashmessage'] = $clang->gT("Email templates successfully saved."); - } - - elseif ($action == "delsurvey" && bHasSurveyPermission($surveyid,'survey','delete')) //can only happen if there are no groups, no questions, no answers etc. - { - $query = "DELETE FROM {$dbprefix}surveys WHERE sid=$surveyid"; - $result = $connect->Execute($query); // Checked - if ($result) - { - $surveyid = ""; - $surveyselect = getsurveylist(); - } - else - { - $databaseoutput .= "\n"; - - } - } - - - // Save the 2nd page from the survey-properties - elseif (($action == "updatesurveylocalesettings") && bHasSurveyPermission($surveyid,'surveylocale','update')) - { - $languagelist = GetAdditionalLanguagesFromSurveyID($surveyid); - $languagelist[]=GetBaseLanguageFromSurveyID($surveyid); - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - - foreach ($languagelist as $langname) - { - if ($langname) - { - - if ($_POST['url_'.$langname] == 'http://') {$_POST['url_'.$langname]="";} - - // Clean XSS attacks - if ($filterxsshtml) - { - $_POST['short_title_'.$langname]=$myFilter->process($_POST['short_title_'.$langname]); - $_POST['description_'.$langname]=$myFilter->process($_POST['description_'.$langname]); - $_POST['welcome_'.$langname]=$myFilter->process($_POST['welcome_'.$langname]); - $_POST['endtext_'.$langname]=$myFilter->process($_POST['endtext_'.$langname]); - $_POST['urldescrip_'.$langname]=$myFilter->process($_POST['urldescrip_'.$langname]); - $_POST['url_'.$langname]=$myFilter->process($_POST['url_'.$langname]); - } - else - { - $_POST['short_title_'.$langname] = html_entity_decode($_POST['short_title_'.$langname], ENT_QUOTES, "UTF-8"); - $_POST['description_'.$langname] = html_entity_decode($_POST['description_'.$langname], ENT_QUOTES, "UTF-8"); - $_POST['welcome_'.$langname] = html_entity_decode($_POST['welcome_'.$langname], ENT_QUOTES, "UTF-8"); - $_POST['endtext_'.$langname] = html_entity_decode($_POST['endtext_'.$langname], ENT_QUOTES, "UTF-8"); - $_POST['urldescrip_'.$langname] = html_entity_decode($_POST['urldescrip_'.$langname], ENT_QUOTES, "UTF-8"); - $_POST['url_'.$langname] = html_entity_decode($_POST['url_'.$langname], ENT_QUOTES, "UTF-8"); - } - - // Fix bug with FCKEditor saving strange BR types - $_POST['short_title_'.$langname]=fix_FCKeditor_text($_POST['short_title_'.$langname]); - $_POST['description_'.$langname]=fix_FCKeditor_text($_POST['description_'.$langname]); - $_POST['welcome_'.$langname]=fix_FCKeditor_text($_POST['welcome_'.$langname]); - $_POST['endtext_'.$langname]=fix_FCKeditor_text($_POST['endtext_'.$langname]); - - $usquery = "UPDATE ".db_table_name('surveys_languagesettings')." \n" - . "SET surveyls_title='".db_quote($_POST['short_title_'.$langname])."', surveyls_description='".db_quote($_POST['description_'.$langname])."',\n" - . "surveyls_welcometext='".db_quote($_POST['welcome_'.$langname])."',\n" - . "surveyls_endtext='".db_quote($_POST['endtext_'.$langname])."',\n" - . "surveyls_url='".db_quote($_POST['url_'.$langname])."',\n" - . "surveyls_urldescription='".db_quote($_POST['urldescrip_'.$langname])."',\n" - . "surveyls_dateformat='".db_quote($_POST['dateformat_'.$langname])."',\n" - . "surveyls_numberformat='".db_quote($_POST['numberformat_'.$langname])."'\n" - . "WHERE surveyls_survey_id=".$postsid." and surveyls_language='".$langname."'"; - $usresult = $connect->Execute($usquery) or safe_die("Error updating
    ".$usquery."

    ".$connect->ErrorMsg()); // Checked - } - } - $_SESSION['flashmessage'] = $clang->gT("Survey text elements successfully saved."); - } - -} - - - - -elseif ($action == "insertsurvey" && $_SESSION['USER_RIGHT_CREATE_SURVEY']) -{ - $dateformatdetails=getDateFormatData($_SESSION['dateformat']); - // $_POST['language'] - - $supportedLanguages = getLanguageData(); - $numberformatid = $supportedLanguages[$_POST['language']]['radixpoint']; - - if ($_POST['url'] == 'http://') {$_POST['url']="";} - if (!$_POST['surveyls_title']) - { - $databaseoutput .= "\n"; - } else - { - // Get random ids until one is found that is not used - do - { - $surveyid = sRandomChars(5,'123456789'); - $isquery = "SELECT sid FROM ".db_table_name('surveys')." WHERE sid=$surveyid"; - $isresult = db_execute_assoc($isquery); // Checked - } - while ($isresult->RecordCount()>0); - - if (!isset($_POST['template'])) {$_POST['template']='default';} - if($_SESSION['USER_RIGHT_SUPERADMIN'] != 1 && $_SESSION['USER_RIGHT_MANAGE_TEMPLATE'] != 1 && !hasTemplateManageRights($_SESSION['loginID'], $_POST['template'])) $_POST['template'] = "default"; - - // insert base language into surveys_language_settings - if ($filterxsshtml) - { - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - - $_POST['surveyls_title']=$myFilter->process($_POST['surveyls_title']); - $_POST['description']=$myFilter->process($_POST['description']); - $_POST['welcome']=$myFilter->process($_POST['welcome']); - $_POST['urldescrip']=$myFilter->process($_POST['urldescrip']); - } - else - { - $_POST['surveyls_title'] = html_entity_decode($_POST['surveyls_title'], ENT_QUOTES, "UTF-8"); - $_POST['description'] = html_entity_decode($_POST['description'], ENT_QUOTES, "UTF-8"); - $_POST['welcome'] = html_entity_decode($_POST['welcome'], ENT_QUOTES, "UTF-8"); - $_POST['urldescrip'] = html_entity_decode($_POST['urldescrip'], ENT_QUOTES, "UTF-8"); - } - - //make sure only numbers are passed within the $_POST variable - $_POST['dateformat'] = (int) $_POST['dateformat']; - $_POST['tokenlength'] = (int) $_POST['tokenlength']; - - - if (trim($_POST['expires'])=='') - { - $_POST['expires']=null; - } - else - { - $datetimeobj = new Date_Time_Converter($_POST['expires'] , "d.m.Y H:i"); - $browsedatafield=$datetimeobj->convert("Y-m-d H:i:s"); - $_POST['expires']=$browsedatafield; - } - - if (trim($_POST['startdate'])=='') - { - $_POST['startdate']=null; - } - else - { - $datetimeobj = new Date_Time_Converter($_POST['startdate'] , "d.m.Y H:i"); - $browsedatafield=$datetimeobj->convert("Y-m-d H:i:s"); - $_POST['startdate']=$browsedatafield; - } - - - $insertarray=array( 'sid'=>$surveyid, - 'owner_id'=>$_SESSION['loginID'], - 'admin'=>$_POST['admin'], - 'active'=>'N', - 'expires'=>$_POST['expires'], - 'startdate'=>$_POST['startdate'], - 'adminemail'=>$_POST['adminemail'], - 'bounce_email'=>$_POST['bounce_email'], - 'anonymized'=>$_POST['anonymized'], - 'faxto'=>$_POST['faxto'], - 'format'=>$_POST['format'], - 'savetimings'=>$_POST['savetimings'], - 'template'=>$_POST['template'], - 'language'=>$_POST['language'], - 'datestamp'=>$_POST['datestamp'], - 'ipaddr'=>$_POST['ipaddr'], - 'refurl'=>$_POST['refurl'], - 'usecookie'=>$_POST['usecookie'], - 'emailnotificationto'=>$_POST['emailnotificationto'], - 'allowregister'=>$_POST['allowregister'], - 'allowsave'=>$_POST['allowsave'], - 'navigationdelay'=>$_POST['navigationdelay'], - 'autoredirect'=>$_POST['autoredirect'], - 'showxquestions'=>$_POST['showxquestions'], - 'showgroupinfo'=>$_POST['showgroupinfo'], - 'showqnumcode'=>$_POST['showqnumcode'], - 'shownoanswer'=>$_POST['shownoanswer'], - 'showwelcome'=>$_POST['showwelcome'], - 'allowprev'=>$_POST['allowprev'], - 'allowjumps'=>$_POST['allowjumps'], - 'nokeyboard'=>$_POST['nokeyboard'], - 'showprogress'=>$_POST['showprogress'], - 'printanswers'=>$_POST['printanswers'], - // 'usetokens'=>$_POST['usetokens'], - 'datecreated'=>date("Y-m-d"), - 'listpublic'=>$_POST['public'], - 'htmlemail'=>$_POST['htmlemail'], - 'tokenanswerspersistence'=>$_POST['tokenanswerspersistence'], - 'alloweditaftercompletion'=>$_POST['alloweditaftercompletion'], - 'usecaptcha'=>$_POST['usecaptcha'], - 'publicstatistics'=>$_POST['publicstatistics'], - 'publicgraphs'=>$_POST['publicgraphs'], - 'assessments'=>$_POST['assessments'], - 'emailresponseto'=>$_POST['emailresponseto'], - 'tokenlength'=>$_POST['tokenlength'] - ); - $dbtablename=db_table_name_nq('surveys'); - $isquery = $connect->GetInsertSQL($dbtablename, $insertarray); - $isresult = $connect->Execute($isquery) or safe_die ($isquery."
    ".$connect->ErrorMsg()); // Checked - - - - // Fix bug with FCKEditor saving strange BR types - $_POST['surveyls_title']=fix_FCKeditor_text($_POST['surveyls_title']); - $_POST['description']=fix_FCKeditor_text($_POST['description']); - $_POST['welcome']=fix_FCKeditor_text($_POST['welcome']); - - $bplang = new limesurvey_lang($_POST['language']); - $aDefaultTexts=aTemplateDefaultTexts($bplang,'unescaped'); - $is_html_email = false; - if (isset($_POST['htmlemail']) && $_POST['htmlemail'] == "Y") - { - $is_html_email = true; - $aDefaultTexts['admin_detailed_notification']=$aDefaultTexts['admin_detailed_notification_css'].conditional_nl2br($aDefaultTexts['admin_detailed_notification'],$is_html_email,'unescaped'); - } - - $insertarray=array( 'surveyls_survey_id'=>$surveyid, - 'surveyls_language'=>$_POST['language'], - 'surveyls_title'=>$_POST['surveyls_title'], - 'surveyls_description'=>$_POST['description'], - 'surveyls_welcometext'=>$_POST['welcome'], - 'surveyls_urldescription'=>$_POST['urldescrip'], - 'surveyls_endtext'=>$_POST['endtext'], - 'surveyls_url'=>$_POST['url'], - 'surveyls_email_invite_subj'=>$aDefaultTexts['invitation_subject'], - 'surveyls_email_invite'=>conditional_nl2br($aDefaultTexts['invitation'],$is_html_email,'unescaped'), - 'surveyls_email_remind_subj'=>$aDefaultTexts['reminder_subject'], - 'surveyls_email_remind'=>conditional_nl2br($aDefaultTexts['reminder'],$is_html_email,'unescaped'), - 'surveyls_email_confirm_subj'=>$aDefaultTexts['confirmation_subject'], - 'surveyls_email_confirm'=>conditional_nl2br($aDefaultTexts['confirmation'],$is_html_email,'unescaped'), - 'surveyls_email_register_subj'=>$aDefaultTexts['registration_subject'], - 'surveyls_email_register'=>conditional_nl2br($aDefaultTexts['registration'],$is_html_email,'unescaped'), - 'email_admin_notification_subj'=>$aDefaultTexts['admin_notification_subject'], - 'email_admin_notification'=>conditional_nl2br($aDefaultTexts['admin_notification'],$is_html_email,'unescaped'), - 'email_admin_responses_subj'=>$aDefaultTexts['admin_detailed_notification_subject'], - 'email_admin_responses'=>$aDefaultTexts['admin_detailed_notification'], - 'surveyls_dateformat'=>$_POST['dateformat'], - 'surveyls_numberformat'=>$numberformatid - ); - $dbtablename=db_table_name_nq('surveys_languagesettings'); - $isquery = $connect->GetInsertSQL($dbtablename, $insertarray); - $isresult = $connect->Execute($isquery) or safe_die ($isquery."
    ".$connect->ErrorMsg()); // Checked - unset($bplang); - - $_SESSION['flashmessage'] = $clang->gT("Survey was successfully added."); - - // Update survey permissions - GiveAllSurveyPermissions($_SESSION['loginID'],$surveyid); - LimeExpressionManager::SetSurveyId($surveyid); - - $surveyselect = getsurveylist(); - - // Create initial Survey table - //include("surveytable_functions.php"); - //$creationResult = surveyCreateTable($surveyid); - // Survey table could not be created - //if ($creationResult !== true) - //{ - // safe_die ("Initial survey table could not be created, please report this as a bug."."
    ".$creationResult); - //} - } -} -elseif ($action == "savepersonalsettings") -{ - $_POST = array_map('db_quote', $_POST); - $uquery = "UPDATE {$dbprefix}users SET lang='{$_POST['lang']}', dateformat='{$_POST['dateformat']}', htmleditormode= '{$_POST['htmleditormode']}', questionselectormode= '{$_POST['questionselectormode']}', templateeditormode= '{$_POST['templateeditormode']}' - WHERE uid={$_SESSION['loginID']}"; - $uresult = $connect->Execute($uquery) or safe_die ($uquery."
    ".$connect->ErrorMsg()); // Checked - $_SESSION['adminlang']=$_POST['lang']; - $_SESSION['htmleditormode']=$_POST['htmleditormode']; - $_SESSION['questionselectormode']=$_POST['questionselectormode']; - $_SESSION['templateeditormode']=$_POST['templateeditormode']; - $_SESSION['dateformat']= $_POST['dateformat']; - $_SESSION['flashmessage'] = $clang->gT("Your personal settings were successfully saved."); -} -else -{ - include("access_denied.php"); -} - -/** -* This is a convenience function to update/delete answer default values. If the given -* $defaultvalue is empty then the entry is removed from table defaultvalues -* -* @param mixed $qid Question ID -* @param mixed $scale_id Scale ID -* @param mixed $specialtype Special type (i.e. for 'Other') -* @param mixed $language Language (defaults are language specific) -* @param mixed $defaultvalue The default value itself -* @param boolean $ispost If defaultvalue is from a $_POST set this to true to properly quote things -*/ -function Updatedefaultvalues($qid,$sqid,$scale_id,$specialtype,$language,$defaultvalue,$ispost) -{ - global $connect; - if ($defaultvalue=='') // Remove the default value if it is empty - { - $connect->execute("DELETE FROM ".db_table_name('defaultvalues')." WHERE sqid=$sqid AND qid=$qid AND specialtype='$specialtype' AND scale_id={$scale_id} AND language='{$language}'"); - } - else - { - $exists=$connect->GetOne("SELECT qid FROM ".db_table_name('defaultvalues')." WHERE sqid=$sqid AND qid=$qid AND specialtype=$specialtype'' AND scale_id={$scale_id} AND language='{$language}'"); - if ($exists===false || $exists===null) - { - $connect->execute('INSERT INTO '.db_table_name('defaultvalues')." (defaultvalue,qid,scale_id,language,specialtype,sqid) VALUES (".db_quoteall($defaultvalue,$ispost).",{$qid},{$scale_id},'{$language}','{$specialtype}',{$sqid})"); - } - else - { - $connect->execute('UPDATE '.db_table_name('defaultvalues')." set defaultvalue=".db_quoteall($defaultvalue,$ispost)." WHERE sqid={$sqid} AND qid={$qid} AND specialtype='{$specialtype}' AND scale_id={$scale_id} AND language='{$language}'"); - } - } -} - -?> diff --git a/include/limesurvey/admin/dataentry.php b/include/limesurvey/admin/dataentry.php deleted file mode 100644 index b9c57fe6..00000000 --- a/include/limesurvey/admin/dataentry.php +++ /dev/null @@ -1,3030 +0,0 @@ -gT("Data entry")); - if (!$surveyid && !$subaction) - { - $dataentryoutput .= "
    ".$clang->gT("Data entry")."
    \n"; - $dataentryoutput .= "
    \n" - ."
    ".$clang->gT("Error")."

    \n" - .$clang->gT("You have not selected a survey for data-entry.")."

    \n" - ."
    \n" - ."
    \n"; - return; - } - - if ($subaction == "insert" && bHasSurveyPermission($surveyid,'responses','create')) - { - $thissurvey=getSurveyInfo($surveyid); - $errormsg=""; - $dataentryoutput .= $surveyoptions."
    ".$clang->gT("Data entry")."
    \n" - ."\t
    \n"; - - $lastanswfortoken=''; // check if a previous answer has been submitted or saved - $rlanguage=''; - if (isset($_POST['token']) && $_POST['token']) - { - $tokencompleted = ""; - $tokentable = db_table_name("tokens_".$surveyid); - $tcquery = "SELECT completed from $tokentable WHERE token=".db_quoteall($_POST['token'],true); - $tcresult = db_execute_assoc($tcquery); - $tccount = $tcresult->RecordCount(); - while ($tcrow = $tcresult->FetchRow()) - { - $tokencompleted = $tcrow['completed']; - } - - if ($tccount < 1) - { // token doesn't exist in token table - $lastanswfortoken='UnknownToken'; - } - elseif ($thissurvey['anonymized'] == "Y") - { // token exist but survey is anonymous, check completed state - if ($tokencompleted != "" && $tokencompleted != "N") - { // token is completed - $lastanswfortoken='PrivacyProtected'; - } - } - else - { // token is valid, survey not anonymous, try to get last recorded response id - $aquery = "SELECT id,startlanguage FROM $surveytable WHERE token=".db_quoteall($_POST['token'],true); - $aresult = db_execute_assoc($aquery); - while ($arow = $aresult->FetchRow()) - { - if ($tokencompleted != "N") { $lastanswfortoken=$arow['id']; } - $rlanguage=$arow['startlanguage']; - } - } - } - - if (tableExists('tokens_'.$thissurvey['sid']) && (!isset($_POST['token']) || !$_POST['token'])) - {// First Check if the survey uses tokens and if a token has been provided - $errormsg="
    ".$clang->gT("Error")."

    ".$clang->gT("This is a closed-access survey, so you must supply a valid token. Please contact the administrator for assistance.")."

    \n"; - } - elseif (tableExists('tokens_'.$thissurvey['sid']) && $lastanswfortoken == 'UnknownToken') - { - $errormsg="
    ".$clang->gT("Error")."

    ".$clang->gT("The token you have provided is not valid or has already been used.")."

    \n"; - } - elseif (tableExists('tokens_'.$thissurvey['sid']) && $lastanswfortoken != '') - { - $errormsg="
    ".$clang->gT("Error")."

    ".$clang->gT("There is already a recorded answer for this token")."

    \n"; - if ($lastanswfortoken != 'PrivacyProtected') - { - $errormsg .= "

    ".$clang->gT("Follow the following link to update it").":\n" - . "[id:$lastanswfortoken]"; - } - else - { - $errormsg .= "

    ".$clang->gT("This surveys uses anonymized responses, so you can't update your response.")."\n"; - } - } - else - { - if (isset($_POST['save']) && $_POST['save'] == "on") - { - $saver['identifier']=returnglobal('save_identifier'); - $saver['language']=returnglobal('save_language'); - $saver['password']=returnglobal('save_password'); - $saver['passwordconfirm']=returnglobal('save_confirmpassword'); - $saver['email']=returnglobal('save_email'); - if (!returnglobal('redo')) - { - $password=md5($saver['password']); - } - else - { - $password=$saver['password']; - } - $errormsg=""; - if (!$saver['identifier']) {$errormsg .= $clang->gT("Error").": ".$clang->gT("You must supply a name for this saved session.");} - if (!$saver['password']) {$errormsg .= $clang->gT("Error").": ".$clang->gT("You must supply a password for this saved session.");} - if ($saver['password'] != $saver['passwordconfirm']) {$errormsg .= $clang->gT("Error").": ".$clang->gT("Your passwords do not match.");} - if ($errormsg) - { - $dataentryoutput .= $errormsg; - $dataentryoutput .= $clang->gT("Try again").":
    -
    - - - - - - - - - - - "; - if (isset($_POST['datestamp'])) - { - $dataentryoutput .= "\n"; - } - if (isset($_POST['ipaddr'])) - { - $dataentryoutput .= "\n"; - } - $dataentryoutput .= "
    ".$clang->gT("Identifier:")."
    ".$clang->gT("Password:")."
    ".$clang->gT("Confirm Password:")."
    ".$clang->gT("Email:")." -
    ".$clang->gT("Start Language:")."\n"; - foreach ($_POST as $key=>$val) - { - if (substr($key, 0, 4) != "save" && $key != "action" && $key !="sid" && $key != "datestamp" && $key !="ipaddr") - { - $dataentryoutput .= "\n"; - } - } - $dataentryoutput .= "
    - - - -
    \n"; - } - } - //BUILD THE SQL TO INSERT RESPONSES - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $fieldmap= createFieldMap($surveyid); - $columns=array(); - $values=array(); - $_POST['startlanguage']=$baselang; - if ($thissurvey['datestamp'] == "Y") {$_POST['startdate']=$_POST['datestamp'];} - if (isset($_POST['closerecord'])) - { - if ($thissurvey['datestamp'] == "Y") - { - $_POST['submitdate']=date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust); - } - else - { - $_POST['submitdate']=date("Y-m-d H:i:s",mktime(0,0,0,1,1,1980)); - } - } - foreach ($fieldmap as $irow) - { - $fieldname = $irow['fieldname']; - if (isset($_POST[$fieldname])) - { - if ($_POST[$fieldname] == "" && ($irow['type'] == 'D' || $irow['type'] == 'N' || $irow['type'] == 'K')) - { // can't add '' in Date column - // Do nothing - } - else if ($irow['type'] == '|') - { - if (!strpos($irow['fieldname'], "_filecount")) - { - $json = $_POST[$fieldname]; - $phparray = json_decode(stripslashes($json)); - $filecount = 0; - - for ($i = 0; $filecount < count($phparray); $i++) - { - if ($_FILES[$fieldname."_file_".$i]['error'] != 4) - { - $target = $uploaddir. "/surveys/". $thissurvey['sid'] ."/files/".sRandomChars(20); - $size = 0.001 * $_FILES[$fieldname."_file_".$i]['size']; - $name = rawurlencode($_FILES[$fieldname."_file_".$i]['name']); - - if (move_uploaded_file($_FILES[$fieldname."_file_".$i]['tmp_name'], $target)) - { - $phparray[$filecount]->filename = basename($target); - $phparray[$filecount]->name = $name; - $phparray[$filecount]->size = $size; - $pathinfo = pathinfo($_FILES[$fieldname."_file_".$i]['name']); - $phparray[$filecount]->ext = $pathinfo['extension']; - $filecount++; - } - } - } - - $columns[] .= db_quote_id($fieldname); - $values[] .= db_quoteall(ls_json_encode($phparray), true); - } - else - { - $columns[] .= db_quote_id($fieldname); - $values[] .= db_quoteall(count($phparray), true); - } - } - elseif ($irow['type'] == 'D') - { - $datetimeobj = new Date_Time_Converter($_POST[$fieldname],$dateformatdetails['phpdate']); - $columns[] .= db_quote_id($fieldname); - $values[] .= db_quoteall($datetimeobj->convert("Y-m-d H:i:s"),true); - } - else - { - $columns[] .= db_quote_id($fieldname); - $values[] .= db_quoteall($_POST[$fieldname],true); - } - } - } - - $SQL = "INSERT INTO $surveytable - (".implode(',',$columns).") - VALUES - (".implode(',',$values).")"; - - $iinsert = $connect->Execute($SQL) or safe_die ("Could not insert your data:
    $SQL
    \n" .$connect->ErrorMsg()); - - if (isset($_POST['closerecord']) && isset($_POST['token']) && $_POST['token'] != '') // submittoken - { - // get submit date - if (isset($_POST['closedate'])) - { $submitdate = $_POST['closedate']; } - else - { $submitdate = date_shift(date("Y-m-d H:i:s"), "Y-m-d", $timeadjust); } - - // check how many uses the token has left - $usesquery = "SELECT usesleft FROM {$dbprefix}tokens_$surveyid WHERE token=".db_quoteall($_POST['token'],true); - $usesresult = db_execute_assoc($usesquery); - $usesrow = $usesresult->FetchRow(); - if (isset($usesrow)) { $usesleft = $usesrow['usesleft']; } - - // query for updating tokens - $utquery = "UPDATE {$dbprefix}tokens_$surveyid\n"; - if (bIsTokenCompletedDatestamped($thissurvey)) - { - if (isset($usesleft) && $usesleft<=1) - { - $utquery .= "SET usesleft=usesleft-1, completed='$submitdate'\n"; - } - else - { - $utquery .= "SET usesleft=usesleft-1\n"; - } - } - else - { - if (isset($usesleft) && $usesleft<=1) - { - $utquery .= "SET usesleft=usesleft-1, completed='Y'\n"; - } - else - { - $utquery .= "SET usesleft=usesleft-1\n"; - } - } - $utquery .= "WHERE token=".db_quoteall($_POST['token'],true); - $utresult = $connect->Execute($utquery) or safe_die ("Couldn't update tokens table!
    \n$utquery
    \n".$connect->ErrorMsg()); - - // save submitdate into survey table - $srid = $connect->Insert_ID(); - $sdquery = "UPDATE {$dbprefix}survey_$surveyid SET submitdate=".db_quoteall($submitdate,true)." WHERE id={$srid}\n"; - $sdresult = $connect->Execute($sdquery) or safe_die ("Couldn't set submitdate response in survey table!
    \n$sdquery
    \n".$connect->ErrorMsg()); - } - if (isset($_POST['save']) && $_POST['save'] == "on") - { - $srid = $connect->Insert_ID(); - //CREATE ENTRY INTO "saved_control" - $scdata = array("sid"=>$surveyid, - "srid"=>$srid, - "identifier"=>$saver['identifier'], - "access_code"=>$password, - "email"=>$saver['email'], - "ip"=>getIPAddress(), - "refurl"=>getenv("HTTP_REFERER"), - 'saved_thisstep' => 0, - "status"=>"S", - "saved_date"=>date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust)); - - if ($connect->AutoExecute("{$dbprefix}saved_control", $scdata,'INSERT')) - { - $scid = $connect->Insert_ID("{$dbprefix}saved_control","scid"); - - $dataentryoutput .= "".$clang->gT("Your survey responses have been saved successfully. You will be sent a confirmation e-mail. Please make sure to save your password, since we will not be able to retrieve it for you.")."
    \n"; - - $tkquery = "SELECT * FROM ".db_table_name("tokens_$surveyid"); - if ($tkresult = $connect->Execute($tkquery)) //If the query fails, assume no tokens table exists - { - $tokendata = array ( - "firstname"=> $saver['identifier'], - "lastname"=> $saver['identifier'], - "email"=>$saver['email'], - "token"=>sRandomChars(15), - "language"=>$saver['language'], - "sent"=>date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i", $timeadjust), - "completed"=>"N"); - $connect->AutoExecute(db_table_name("tokens_".$surveyid), $tokendata,'INSERT'); - $dataentryoutput .= "".$clang->gT("A token entry for the saved survey has been created too.")."
    \n"; - - } - - if ($saver['email']) - { - //Send email - if (validate_email($saver['email']) && !returnglobal('redo')) - { - $subject=$clang->gT("Saved Survey Details"); - $message=$clang->gT("Thank you for saving your survey in progress. The following details can be used to return to this survey and continue where you left off. Please keep this e-mail for your reference - we cannot retrieve the password for you."); - $message.="\n\n".$thissurvey['name']."\n\n"; - $message.=$clang->gT("Name").": ".$saver['identifier']."\n"; - $message.=$clang->gT("Password").": ".$saver['password']."\n\n"; - $message.=$clang->gT("Reload your survey by clicking on the following link (or pasting it into your browser):")."\n"; - $message.=$publicurl."/index.php?sid=$surveyid&loadall=reload&scid=".$scid."&lang=".urlencode($saver['language'])."&loadname=".urlencode($saver['identifier'])."&loadpass=".urlencode($saver['password']); - if (isset($tokendata['token'])) {$message.="&token=".$tokendata['token'];} - $from = $thissurvey['adminemail']; - - if (SendEmailMessage(null, $message, $subject, $saver['email'], $from, $sitename, false, getBounceEmail($surveyid))) - { - $emailsent="Y"; - $dataentryoutput .= "".$clang->gT("An email has been sent with details about your saved survey")."
    \n"; - } - } - } - - } - else - { - safe_die("Unable to insert record into saved_control table.

    ".$connect->ErrorMsg()); - } - - } - $dataentryoutput .= "\t
    ".$clang->gT("Success")."
    \n"; - $thisid=$connect->Insert_ID(); - $dataentryoutput .= "\t".$clang->gT("The entry was assigned the following record id: ")." {$thisid}

    \n"; - } - - $dataentryoutput .= $errormsg; - $dataentryoutput .= "\t

    \n"; - $dataentryoutput .= "\t

    \n"; - if (isset($thisid)) - { - $dataentryoutput .= "\t

    \n"; - } - if (isset($_POST['save']) && $_POST['save'] == "on") - { - $dataentryoutput .= "\t

    \n"; - } - $dataentryoutput .= "
    \n"; - - } - - elseif (($subaction == "edit" || $subaction == "editsaved") && bHasSurveyPermission($surveyid,'responses','update')) - { - $dataentryoutput .= $surveyoptions; - - //FIRST LETS GET THE NAMES OF THE QUESTIONS AND MATCH THEM TO THE FIELD NAMES FOR THE DATABASE - $fnquery = "SELECT * FROM ".db_table_name("questions").", ".db_table_name("groups")." g, ".db_table_name("surveys")." WHERE - ".db_table_name("questions").".gid=g.gid AND - ".db_table_name("questions").".language = '{$sDataEntryLanguage}' AND g.language = '{$sDataEntryLanguage}' AND - ".db_table_name("questions").".sid=".db_table_name("surveys").".sid AND ".db_table_name("questions").".sid='$surveyid' - order by group_order, question_order"; - $fnresult = db_execute_assoc($fnquery); - $fncount = $fnresult->RecordCount(); - //$dataentryoutput .= "$fnquery

    \n"; - $fnrows = array(); //Create an empty array in case FetchRow does not return any rows - while ($fnrow = $fnresult->FetchRow()) - { - $fnrows[] = $fnrow; - $private=$fnrow['anonymized']; - $datestamp=$fnrow['datestamp']; - $ipaddr=$fnrow['ipaddr']; - } // Get table output into array - // Perform a case insensitive natural sort on group name then question title of a multidimensional array - // $fnames = (Field Name in Survey Table, Short Title of Question, Question Type, Field Name, Question Code, Predetermined Answers if exist) - - $fnames['completed'] = array('fieldname'=>"completed", 'question'=>$clang->gT("Completed"), 'type'=>'completed'); - - $fnames=array_merge($fnames,createFieldMap($surveyid,'full',false,false,$sDataEntryLanguage)); - $nfncount = count($fnames)-1; - - //SHOW INDIVIDUAL RECORD - - if ($subaction == "edit" && bHasSurveyPermission($surveyid,'responses','update')) - { - $idquery = "SELECT * FROM $surveytable WHERE id=$id"; - $idresult = db_execute_assoc($idquery) or safe_die ("Couldn't get individual record
    $idquery
    ".$connect->ErrorMsg()); - while ($idrow = $idresult->FetchRow()) - { - $results[]=$idrow; - } - } - elseif ($subaction == "editsaved" && bHasSurveyPermission($surveyid,'responses','update')) - { - if (isset($_GET['public']) && $_GET['public']=="true") - { - $password=md5($_GET['accesscode']); - } - else - { - $password=$_GET['accesscode']; - } - $svquery = "SELECT * FROM ".db_table_name("saved_control")." - WHERE sid=$surveyid - AND identifier='".$_GET['identifier']."' - AND access_code='".$password."'"; - $svresult=db_execute_assoc($svquery) or safe_die("Error getting save
    $svquery
    ".$connect->ErrorMsg()); - while($svrow=$svresult->FetchRow()) - { - $saver['email']=$svrow['email']; - $saver['scid']=$svrow['scid']; - $saver['ip']=$svrow['ip']; - } - $svquery = "SELECT * FROM ".db_table_name("saved_control")." WHERE scid=".$saver['scid']; - $svresult=db_execute_assoc($svquery) or safe_die("Error getting saved info
    $svquery
    ".$connect->ErrorMsg()); - while($svrow=$svresult->FetchRow()) - { - $responses[$svrow['fieldname']]=$svrow['value']; - } // while - $fieldmap = createFieldMap($surveyid); - foreach($fieldmap as $fm) - { - if (isset($responses[$fm['fieldname']])) - { - $results1[$fm['fieldname']]=$responses[$fm['fieldname']]; - } - else - { - $results1[$fm['fieldname']]=""; - } - } - $results1['id']=""; - $results1['datestamp']=date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust); - $results1['ipaddr']=$saver['ip']; - $results[]=$results1; - } - // $dataentryoutput .= "
    ";print_r($results);$dataentryoutput .= "
    "; - - $dataentryoutput.="
    ".$clang->gT("Data entry")."
    \n" - ."\t
    "; - if ($subaction=='edit') - { - $dataentryoutput .= sprintf($clang->gT("Editing response (ID %s)"),$id); - } - else - { - $dataentryoutput .= sprintf($clang->gT("Viewing response (ID %s)"),$id); - } - $dataentryoutput .="
    \n"; - - - $dataentryoutput .= "
    \n" - ."\n"; - $highlight=false; - unset($fnames['lastpage']); - - // unset timings - foreach ($fnames as $fname) - { - if ($fname['type'] == "interview_time" || $fname['type'] == "page_time" || $fname['type'] == "answer_time") - { - unset($fnames[$fname['fieldname']]); - $nfncount--; - } - } - - foreach ($results as $idrow) - { - //$dataentryoutput .= "
    "; print_r($idrow);$dataentryoutput .= "
    "; - //for ($i=0; $i<$nfncount+1; $i++) - $fname=reset($fnames); - do - { - //$dataentryoutput .= "
    "; print_r($fname);$dataentryoutput .= "
    "; - if (isset($idrow[$fname['fieldname']])) $answer = $idrow[$fname['fieldname']]; - $question=$fname['question']; - - //get survey details - $thissurvey=getSurveyInfo($surveyid); - - $dataentryoutput .= "\t" - ."\n"; - $dataentryoutput .= "\t".strip_javascript($question)."\n"; - $dataentryoutput .= "\n" - ."
    \n"; - //$dataentryoutput .= "\t-={$fname[3]}=-"; //Debugging info - switch ($fname['type']) - { - case "completed": - // First compute the submitdate - if ($private == "Y") - { - // In case of anonymized responses survey with no datestamp - // then the the answer submitdate gets a conventional timestamp - // 1st Jan 1980 - $mysubmitdate = date("Y-m-d H:i:s",mktime(0,0,0,1,1,1980)); - } - else - { - $mysubmitdate = date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust); - } - $completedate= empty($idrow['submitdate']) ? $mysubmitdate : $idrow['submitdate']; - $dataentryoutput .= " \n"; - break; - case "X": //Boilerplate question - $dataentryoutput .= ""; - break; - case "Q": - case "K": - $dataentryoutput .= "\t{$fname['subquestion']} \n"; - break; - case "id": - $dataentryoutput .= " {$idrow[$fname['fieldname']]}"; - break; - case "5": //5 POINT CHOICE radio-buttons - for ($x=1; $x<=5; $x++) - { - $dataentryoutput .= "\tconvert($dateformatdetails['phpdate']); - } - $dataentryoutput .= "\t\n"; - break; - case "G": //GENDER drop-down list - $dataentryoutput .= "\t\n"; - break; - case "L": //LIST drop-down - case "!": //List (Radio) - $qidattributes=getQuestionAttributes($fname['qid']); - if (isset($qidattributes['category_separator']) && trim($qidattributes['category_separator'])!='') - { - $optCategorySeparator = $qidattributes['category_separator']; - } - else - { - unset($optCategorySeparator); - } - - if (substr($fname['fieldname'], -5) == "other") - { - $dataentryoutput .= "\t\n"; - } - else - { - $lquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid={$fname['qid']} AND language = '{$sDataEntryLanguage}' ORDER BY sortorder, answer"; - $lresult = db_execute_assoc($lquery); - $dataentryoutput .= "\t\n"; - } - break; - case "O": //LIST WITH COMMENT drop-down/radio-button list + textarea - $lquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid={$fname['qid']} AND language = '{$sDataEntryLanguage}' ORDER BY sortorder, answer"; - $lresult = db_execute_assoc($lquery); - $dataentryoutput .= "\t\n"; - break; - case "R": //RANKING TYPE QUESTION - $thisqid=$fname['qid']; - $currentvalues=array(); - $myfname=$fname['sid'].'X'.$fname['gid'].'X'.$fname['qid']; - while (isset($fname['type']) && $fname['type'] == "R" && $fname['qid']==$thisqid) - { - //Let's get all the existing values into an array - if ($idrow[$fname['fieldname']]) - { - $currentvalues[] = $idrow[$fname['fieldname']]; - } - $fname=next($fnames); - } - $ansquery = "SELECT * FROM ".db_table_name("answers")." WHERE language = '{$sDataEntryLanguage}' AND qid=$thisqid ORDER BY sortorder, answer"; - $ansresult = db_execute_assoc($ansquery); - $anscount = $ansresult->RecordCount(); - $dataentryoutput .= "\t\n"; - while ($ansrow = $ansresult->FetchRow()) //Now we're getting the codes and answers - { - $answers[] = array($ansrow['code'], $ansrow['answer']); - } - //now find out how many existing values there are - - $chosen[]=""; //create array - if (!isset($ranklist)) {$ranklist="";} - - if (isset($currentvalues)) - { - $existing = count($currentvalues); - } - else {$existing=0;} - for ($j=1; $j<=$anscount; $j++) //go through each ranking and check for matching answer - { - $k=$j-1; - if (isset($currentvalues) && isset($currentvalues[$k]) && $currentvalues[$k]) - { - foreach ($answers as $ans) - { - if ($ans[0] == $currentvalues[$k]) - { - $thiscode=$ans[0]; - $thistext=$ans[1]; - } - } - } - $ranklist .= "$j: \n" - . "\n" - . "".$clang->gT("Remove this item")."
    \n\n"; - } - - if (!isset($choicelist)) {$choicelist="";} - $choicelist .= "\n"; - $dataentryoutput .= "\t\n" - ."\n" - ."\t\n" - ."\t\n" - ."\n" - ."\t
    \n" - ."" - .$clang->gT("Your Choices").":
    \n" - .$choicelist - ."\t
    \n" - ."" - .$clang->gT("Your Ranking").":
    \n" - .$ranklist - ."\t
    \n" - ."\t\n" - ."\t\n"; - $choicelist=""; - $ranklist=""; - unset($answers); - $fname=prev($fnames); - break; - - case "M": //Multiple choice checkbox - $qidattributes=getQuestionAttributes($fname['qid']); - if (trim($qidattributes['display_columns'])!='') - { - $dcols=$qidattributes['display_columns']; - } - else - { - $dcols=0; - } - - // while ($fname[3] == "M" && $question != "" && $question == $fname['type']) - $thisqid=$fname['qid']; - while ($fname['qid'] == $thisqid) - { - $fieldn = substr($fname['fieldname'], 0, strlen($fname['fieldname'])); - //$dataentryoutput .= substr($fname['fieldname'], strlen($fname['fieldname'])-5, 5)."
    \n"; - if (substr($fname['fieldname'], -5) == "other") - { - $dataentryoutput .= "\t\n"; - } - else - { - $dataentryoutput .= "\tgT("Please choose")."..\n"; - - foreach ($slangs as $lang) - { - $dataentryoutput.="
    '; - } - break; - - - case "N": //NUMERICAL TEXT - - //get question attributes to change some style and validation settings - $qidattributes = getQuestionAttributes($fname['qid']); - if (isset($qidattributes['prefix']) && trim($qidattributes['prefix'])!='') { - $prefix=$qidattributes['prefix']; - } - else - { - $prefix = ''; - } - if (isset($qidattributes['suffix']) && trim($qidattributes['suffix'])!='') - { - $suffix=$qidattributes['suffix']; - } - else - { - $suffix = ''; - } - - if (intval(trim($qidattributes['maximum_chars']))>0 && intval(trim($qidattributes['maximum_chars']))<20) // Limt to 20 chars for numeric - { - $maximum_chars= intval(trim($qidattributes['maximum_chars'])); - $maxlength= "maxlength='{$maximum_chars}' "; - } - else - { - $maxlength= "maxlength='20' "; - } - - if (trim($qidattributes['text_input_width'])!='') - { - $tiwidth=$qidattributes['text_input_width']; - } - else - { - $tiwidth=10; - } - - if (trim($qidattributes['num_value_int_only'])==1) - { - $acomma=""; - } - else - { - $acomma=getRadixPointData($thissurvey['surveyls_numberformat']); - $acomma = $acomma['seperator']; - - } - $sSeperator = getRadixPointData($thissurvey['surveyls_numberformat']); - - $dataentryoutput .= $prefix. "".$suffix; - break; - - case "S": //SHORT FREE TEXT - - //get question attributes to change some style and validation settings - $qidattributes = getQuestionAttributes($fname['qid']); - - if ($qidattributes['numbers_only']==1) - { - $sSeperator = getRadixPointData($thissurvey['surveyls_numberformat']); - $sSeperator = $sSeperator['seperator']; - $numbersonly = 'onkeypress="return goodchars(event,\'-0123456789'.$sSeperator.'\')"'; - } - else - { - $numbersonly = ''; - } - - if (intval(trim($qidattributes['maximum_chars']))>0) - { - // Only maxlength attribute, use textarea[maxlength] jquery selector for textarea - $maximum_chars= intval(trim($qidattributes['maximum_chars'])); - $maxlength= "maxlength='{$maximum_chars}' "; - } - else - { - $maxlength= ""; - } - - if (trim($qidattributes['text_input_width'])!='') - { - $tiwidth=$qidattributes['text_input_width']; - } - else - { - $tiwidth=50; - } - - if (isset($qidattributes['prefix']) && trim($qidattributes['prefix'])!='') - { - $prefix=$qidattributes['prefix']; - } - else - { - $prefix = ''; - } - - if (isset($qidattributes['suffix']) && trim($qidattributes['suffix'])!='') - { - $suffix=$qidattributes['suffix']; - } - else - { - $suffix = ''; - } - - if (trim($qidattributes['display_rows'])!='') - { - //question attribute "display_rows" is set -> we need a textarea to be able to show several rows - $drows=$qidattributes['display_rows']; - - //if a textarea should be displayed we make it equal width to the long text question - //this looks nicer and more continuous - if($tiwidth == 50) - { - $tiwidth=40; - } - - $dataentryoutput .= $prefix."$suffix\n"; - } - else - { - //no question attribute set, use common input text field - $dataentryoutput .= $prefix."" - .htmlspecialchars($idrow[$fname['fieldname']], ENT_QUOTES) ."$suffix\n"; - - break; - - - case "U": //HUGE FREE TEXT - - //get question attributes to change some style and validation settings - $qidattributes=getQuestionAttributes($fname['qid']); - - if (trim($qidattributes['display_rows'])!='') - { - $drows=$qidattributes['display_rows']; - } - else - { - $drows=70; - } - if (trim($qidattributes['text_input_width'])!='') - { - $tiwidth=$qidattributes['text_input_width']; - } - else - { - $tiwidth=50; - } - if (isset($qidattributes['prefix']) && trim($qidattributes['prefix'])!='') { - $prefix=$qidattributes['prefix']; - } - else - { - $prefix = ''; - } - if (isset($qidattributes['suffix']) && trim($qidattributes['suffix'])!='') { - $suffix=$qidattributes['suffix']; - } - else - { - $suffix = ''; - } - $dataentryoutput .= $prefix.'$suffix\n"; - break; - - - case "Y": //YES/NO radio-buttons - $dataentryoutput .= "\t\n"; - break; - case "A": //ARRAY (5 POINT CHOICE) radio-buttons - $dataentryoutput .= "\n"; - $thisqid=$fname['qid']; - while ($fname['qid'] == $thisqid) - { - $dataentryoutput .= "\t\n" - ."\n" - ."
    {$fname['subquestion']}\n"; - for ($j=1; $j<=5; $j++) - { - $dataentryoutput .= "\t\n"; - $fname=next($fnames); - } - $dataentryoutput .= "
    \n"; - $fname=prev($fnames); - break; - case "B": //ARRAY (10 POINT CHOICE) radio-buttons - $dataentryoutput .= "\n"; - $thisqid=$fname['qid']; - while ($fname['qid'] == $thisqid) - { - $fieldn = substr($fname['fieldname'], 0, strlen($fname['fieldname'])); - $dataentryoutput .= "\t\n" - ."\n" - ."
    {$fname['subquestion']}\n"; - for ($j=1; $j<=10; $j++) - { - $dataentryoutput .= "\t\n"; - $fname=next($fnames); - } - $fname=prev($fnames); - $dataentryoutput .= "
    \n"; - break; - case "C": //ARRAY (YES/UNCERTAIN/NO) radio-buttons - $dataentryoutput .= "\n"; - $thisqid=$fname['qid']; - while ($fname['qid'] == $thisqid) - { - $fieldn = substr($fname['fieldname'], 0, strlen($fname['fieldname'])); - $dataentryoutput .= "\t\n" - ."\n" - ."\n" - ."\t\n"; - $fname=next($fnames); - } - $fname=prev($fnames); - $dataentryoutput .= "
    {$fname['subquestion']}\n" - ."\tgT("Yes")." \n" - ."\tgT("Uncertain")." \n" - ."\tgT("No")." \n" - ."
    \n"; - break; - case "E": //ARRAY (Increase/Same/Decrease) radio-buttons - $dataentryoutput .= "\n"; - $thisqid=$fname['qid']; - while ($fname['qid'] == $thisqid) - { - $fieldn = substr($fname['fieldname'], 0, strlen($fname['fieldname'])); - $dataentryoutput .= "\t\n" - ."\n" - ."\n"; - $fname=next($fnames); - } - $fname=prev($fnames); - $dataentryoutput .= "
    {$fname['subquestion']}\n" - ."\t\n" - ."\t
    \n"; - break; - case "F": //ARRAY (Flexible Labels) - case "H": - case "1": - $dataentryoutput .= "\n"; - $thisqid=$fname['qid']; - while (isset($fname['qid']) && $fname['qid'] == $thisqid) - { - $fieldn = substr($fname['fieldname'], 0, strlen($fname['fieldname'])); - $dataentryoutput .= "\t\n" - ."\n"; - $scale_id=0; - if (isset($fname['scale_id'])) $scale_id=$fname['scale_id']; - $fquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid='{$fname['qid']}' and scale_id={$scale_id} and language='$sDataEntryLanguage' order by sortorder, answer"; - $fresult = db_execute_assoc($fquery); - $dataentryoutput .= "\n" - ."\t\n"; - $fname=next($fnames); - } - $fname=prev($fnames); - $dataentryoutput .= "
    {$fname['subquestion']}"; - if (isset($fname['scale'])) - { - $dataentryoutput .= " (".$fname['scale'].')'; - } - $dataentryoutput .="\n"; - while ($frow=$fresult->FetchRow()) - { - $dataentryoutput .= "\tgT("No answer")." \n"; - - $dataentryoutput .= "
    \n"; - break; - case ":": //ARRAY (Multi Flexi) (Numbers) - $qidattributes=getQuestionAttributes($fname['qid']); - if (trim($qidattributes['multiflexible_max'])!='' && trim($qidattributes['multiflexible_min']) ==''){ - $maxvalue=$qidattributes['multiflexible_max']; - $minvalue=1; - } - if (trim($qidattributes['multiflexible_min'])!='' && trim($qidattributes['multiflexible_max']) ==''){ - $minvalue=$qidattributes['multiflexible_min']; - $maxvalue=$qidattributes['multiflexible_min'] + 10; - } - if (trim($qidattributes['multiflexible_min'])=='' && trim($qidattributes['multiflexible_max']) ==''){ - $minvalue=1; - $maxvalue=10; - } - if (trim($qidattributes['multiflexible_min']) !='' && trim($qidattributes['multiflexible_max']) !=''){ - if($qidattributes['multiflexible_min'] < $qidattributes['multiflexible_max']){ - $minvalue=$qidattributes['multiflexible_min']; - $maxvalue=$qidattributes['multiflexible_max']; - } - } - - - if (trim($qidattributes['multiflexible_step'])!='') { - $stepvalue=$qidattributes['multiflexible_step']; - } else { - $stepvalue=1; - } - if ($qidattributes['multiflexible_checkbox']!=0) { - $minvalue=0; - $maxvalue=1; - $stepvalue=1; - } - $dataentryoutput .= "\n"; - $thisqid=$fname['qid']; - while (isset($fname['qid']) && $fname['qid'] == $thisqid) - { - $fieldn = substr($fname['fieldname'], 0, strlen($fname['fieldname'])); - $dataentryoutput .= "\t\n" - . "\n"; - $dataentryoutput .= "
    {$fname['subquestion1']}:{$fname['subquestion2']}\n"; - if ($qidattributes['input_boxes']!=0) { - $dataentryoutput .= "\t"; - } else { - $dataentryoutput .= "\t
    \n"; - break; - case ";": //ARRAY (Multi Flexi) - $dataentryoutput .= "\n"; - $thisqid=$fname['qid']; - while (isset($fname['qid']) && $fname['qid'] == $thisqid) - { - $fieldn = substr($fname['fieldname'], 0, strlen($fname['fieldname'])); - $dataentryoutput .= "\t\n" - . "\n"; - $dataentryoutput .= "
    {$fname['subquestion1']}:{$fname['subquestion2']}\n"; - $dataentryoutput .= "\t\n"; - $fname=next($fnames); - } - $fname=prev($fnames); - $dataentryoutput .= "
    \n"; - break; - default: //This really only applies to tokens for non-private surveys - $dataentryoutput .= "\t\n"; - break; - } - - $dataentryoutput .= " - \n"; - } while ($fname=next($fnames)); - } - $dataentryoutput .= "\n" - ."\n"; - if (!bHasSurveyPermission($surveyid, 'responses','update')) - { // if you are not survey owner or super admin you cannot modify responses - $dataentryoutput .= "

    \n"; - } - elseif ($subaction == "edit" && bHasSurveyPermission($surveyid,'responses','update')) - { - $dataentryoutput .= "

    - - - - -

    "; - } - elseif ($subaction == "editsaved" && bHasSurveyPermission($surveyid,'responses','update')) - { - - - $dataentryoutput .= "\n"; - $dataentryoutput .= "\n"; - $dataentryoutput .= "\t
    \n"; - $dataentryoutput .="\n"; - $dataentryoutput .= "\t
    \n"; - $dataentryoutput .= "
    \n"; - $dataentryoutput .= "
    \n" - . "
    \n" - . "
    " - . "
      \n"; - - $sSavedLanguage=$connect->GetOne("select lang from ".db_table_name('users')." where uid={$_SESSION['loginID']}"); - - // Current language - $cssummary .= "
    • \n" - . "\n" - . "\n" - . "
    • \n"; - - // Current htmleditormode - $cssummary .= "
    • \n" - . "\n" - . "\n" - . "
    • \n"; - - // Current questionselectormode - $cssummary .= "
    • \n" - . "\n" - . "\n" - . "
    • \n"; - - // Current templateeditormode - $cssummary .= "
    • \n" - . "\n" - . "\n" - . "
    • \n"; - - // Date format - $cssummary .= "
    • \n" - . "\n" - . "\n" - . "
    • \n" - . "
    \n" - . "

    "; -} - - - -if (isset($surveyid) && $surveyid && -$action!='dataentry' && $action!='browse' && $action!='exportspss' && -$action!='statistics' && $action!='importoldresponses' && $action!='exportr' && -$action!='vvimport' && $action!='vvexport' && $action!='exportresults') -{ - if(bHasSurveyPermission($surveyid,'survey','read')) - { - $js_admin_includes[]='../scripts/jquery/jquery.coookie.js'; - $js_admin_includes[]='../scripts/jquery/superfish.js'; - $js_admin_includes[]='../scripts/jquery/hoverIntent.js'; - $js_admin_includes[]='scripts/surveytoolbar.js'; - $css_admin_includes[]= $homeurl."/styles/default/superfish.css"; - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $sumquery3 = "SELECT * FROM ".db_table_name('questions')." WHERE sid={$surveyid} AND parent_qid=0 AND language='".$baselang."'"; //Getting a count of questions for this survey - $sumresult3 = $connect->Execute($sumquery3); //Checked - $sumcount3 = $sumresult3->RecordCount(); - $sumquery6 = "SELECT count(*) FROM ".db_table_name('conditions')." as c, ".db_table_name('questions')." as q WHERE c.qid = q.qid AND q.sid=$surveyid"; //Getting a count of conditions for this survey - $sumcount6 = $connect->GetOne($sumquery6); //Checked - $sumquery2 = "SELECT * FROM ".db_table_name('groups')." WHERE sid={$surveyid} AND language='".$baselang."'"; //Getting a count of groups for this survey - $sumresult2 = $connect->Execute($sumquery2); //Checked - $sumcount2 = $sumresult2->RecordCount(); - $sumquery1 = "SELECT * FROM ".db_table_name('surveys')." inner join ".db_table_name('surveys_languagesettings')." on (surveyls_survey_id=sid and surveyls_language=language) WHERE sid=$surveyid"; //Getting data for this survey - $sumresult1 = db_select_limit_assoc($sumquery1, 1) ; //Checked - if ($sumresult1->RecordCount()==0){die('Invalid survey id');} // if surveyid is invalid then die to prevent errors at a later time - // Output starts here... - $surveysummary = ""; - - $surveyinfo = $sumresult1->FetchRow(); - - $surveyinfo = array_map('FlattenText', $surveyinfo); - //$surveyinfo = array_map('htmlspecialchars', $surveyinfo); - $activated = $surveyinfo['active']; - - //////////////////////////////////////////////////////////////////////// - // SURVEY MENU BAR - //////////////////////////////////////////////////////////////////////// - - $surveysummary .= "" //"\n" - . "\n" - . "\n"; - - //SURVEY SUMMARY - if ($gid || $qid || $action=="deactivate"|| $action=="activate" || $action=="surveysecurity" - || $action=="surveyrights" || $action=="addsurveysecurity" || $action=="addusergroupsurveysecurity" - || $action=="setsurveysecurity" || $action=="setusergroupsurveysecurity" || $action=="delsurveysecurity" - || $action=="editsurveysettings"|| $action=="editsurveylocalesettings" || $action=="updatesurveysettingsandeditlocalesettings" || $action=="addgroup" || $action=="importgroup" - || $action=="ordergroups" || $action=="deletesurvey" || $action=="resetsurveylogic" - || $action=="importsurveyresources" || $action=="translate" || $action=="emailtemplates" - || $action=="exportstructure" || $action=="quotas" || $action=="copysurvey") {$showstyle="style='display: none'";} - if (!isset($showstyle)) {$showstyle="";} - $aAdditionalLanguages = GetAdditionalLanguagesFromSurveyID($surveyid); - $surveysummary .= "\n" - . "\n"; - $surveysummary2 = ""; - if ($surveyinfo['anonymized'] != "N") {$surveysummary2 .= $clang->gT("Answers to this survey are anonymized.")."
    \n";} - else {$surveysummary2 .= $clang->gT("This survey is NOT anonymous.")."
    \n";} - if ($surveyinfo['format'] == "S") {$surveysummary2 .= $clang->gT("It is presented question by question.")."
    \n";} - elseif ($surveyinfo['format'] == "G") {$surveysummary2 .= $clang->gT("It is presented group by group.")."
    \n";} - else {$surveysummary2 .= $clang->gT("It is presented on one single page.")."
    \n";} - if ($surveyinfo['allowjumps'] == "Y") - { - if ($surveyinfo['format'] == 'A') {$surveysummary2 .= $clang->gT("No question index will be shown with this format.")."
    \n";} - else {$surveysummary2 .= $clang->gT("A question index will be shown; participants will be able to jump between viewed questions.")."
    \n";} - } - if ($surveyinfo['datestamp'] == "Y") {$surveysummary2 .= $clang->gT("Responses will be date stamped.")."
    \n";} - if ($surveyinfo['ipaddr'] == "Y") {$surveysummary2 .= $clang->gT("IP Addresses will be logged")."
    \n";} - if ($surveyinfo['refurl'] == "Y") {$surveysummary2 .= $clang->gT("Referrer URL will be saved.")."
    \n";} - if ($surveyinfo['usecookie'] == "Y") {$surveysummary2 .= $clang->gT("It uses cookies for access control.")."
    \n";} - if ($surveyinfo['allowregister'] == "Y") {$surveysummary2 .= $clang->gT("If tokens are used, the public may register for this survey")."
    \n";} - if ($surveyinfo['allowsave'] == "Y" && $surveyinfo['tokenanswerspersistence'] == 'N') {$surveysummary2 .= $clang->gT("Participants can save partially finished surveys")."
    \n";} - if ($surveyinfo['emailnotificationto'] != '') - { - $surveysummary2 .= $clang->gT("Basic email notification is sent to:")." {$surveyinfo['emailnotificationto']}
    \n"; - } - if ($surveyinfo['emailresponseto'] != '') - { - $surveysummary2 .= $clang->gT("Detailed email notification with response data is sent to:")." {$surveyinfo['emailresponseto']}
    \n"; - } - - if(bHasSurveyPermission($surveyid,'surveycontent','update')) - { - $surveysummary2 .= $clang->gT("Regenerate question codes:") - . " [gT("Are you sure you want to regenerate the question codes?\n\nWARNING:\nThis is safe if you only use the Conditions editor.\n\nHOWEVER, if you manually specified any relevance equations, regenerating the question codes will break all of that survey logic.","js")."')) {".get2post("$scriptname?action=renumberquestions&sid=$surveyid&style=straight")."}\" " - . ">".$clang->gT("Straight")."] " - . " [gT("Are you sure you want to regenerate the question codes?\n\nWARNING:\nThis is safe if you only use the Conditions editor.\n\nHOWEVER, if you manually specified any relevance equations, regenerating the question codes will break all of that survey logic.","js")."')) {".get2post("$scriptname?action=renumberquestions&sid=$surveyid&style=bygroup")."}\" " - . ">".$clang->gT("By Group")."]"; - $surveysummary2 .= "\n"; - } - $surveysummary .= "" - . "\n"; - if ( $modrewrite ) { - $tmp_url = $GLOBALS['publicurl'] . '/' . $surveyinfo['sid']; - $surveysummary .= "\n" - . "\n\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n"; - if (trim($surveyinfo['faxto'])!='') - { - $surveysummary .="\n\n"; - } - $surveysummary .= "\n"; - $dateformatdetails=getDateFormatData($_SESSION['dateformat']); - if (trim($surveyinfo['startdate'])!= '') - { - $datetimeobj = new Date_Time_Converter($surveyinfo['startdate'] , "Y-m-d H:i:s"); - $startdate=$datetimeobj->convert($dateformatdetails['phpdate'].' H:i'); - } - else - { - $startdate="-"; - } - $surveysummary .= "\n" - . "\n"; - if (trim($surveyinfo['expires'])!= '') - { - $datetimeobj = new Date_Time_Converter($surveyinfo['expires'] , "Y-m-d H:i:s"); - $expdate=$datetimeobj->convert($dateformatdetails['phpdate'].' H:i'); - } - else - { - $expdate="-"; - } - $surveysummary .= "\n" - . "\n" - . "\n" - - . "\n"; - if (!$surveyinfo['language']) {$language=getLanguageNameFromCode($currentadminlang,false);} else {$language=getLanguageNameFromCode($surveyinfo['language'],false);} - $surveysummary .= "\n"; - - // get the rowspan of the Additionnal languages row - // is at least 1 even if no additionnal language is present - $additionnalLanguagesCount = count($aAdditionalLanguages); - $surveysummary .= "\n"; - $first=true; - if ($additionnalLanguagesCount == 0) - { - $surveysummary .= "\n"; - } - else - { - foreach ($aAdditionalLanguages as $langname) - { - if ($langname) - { - if (!$first) {$surveysummary .= "";} - $first=false; - $surveysummary .= "\n"; - } - } - } - if ($first) $surveysummary .= ""; - - if ($surveyinfo['surveyls_urldescription']==""){$surveyinfo['surveyls_urldescription']=htmlspecialchars($surveyinfo['surveyls_url']);} - $surveysummary .= "\n" - . "\n"; - $surveysummary .= "\n"; - $surveysummary .= "\n"; - - if ($activated == "Y") - { - $surveysummary .= "\n"; - } - $surveysummary .= "
    " - . "".$clang->gT("Title").":{$surveyinfo['surveyls_title']} " - . "(".$clang->gT("ID")." {$surveyinfo['sid']})
    " - . $clang->gT("Survey URL") ." (".getLanguageNameFromCode($surveyinfo['language'],false)."): $tmp_url/lang-".$surveyinfo['language'].""; - foreach ($aAdditionalLanguages as $langname) - { - $surveysummary .= " ".getLanguageNameFromCode($langname,false)." ".$clang->gT("Flag").""; - } - } else { - $tmp_url = $GLOBALS['publicurl'] . '/index.php?sid=' . $surveyinfo['sid']; - $surveysummary .= " $tmp_url&lang=".$surveyinfo['language'].""; - foreach ($aAdditionalLanguages as $langname) - { - $surveysummary .= " ".getLanguageNameFromCode($langname,false)." ".$clang->gT("Flag").""; - } - } - - $surveysummary .= "
    " - . $clang->gT("Description:").""; - - LimeExpressionManager::StartProcessingPage(false,$rooturl,true); // so can click on syntax highlighting to edit questions - - if (trim($surveyinfo['surveyls_description'])!='') - { - templatereplace($surveyinfo['surveyls_description']); - $surveysummary .= LimeExpressionManager::GetLastPrettyPrintExpression(); - } - $surveysummary .= "
    " - . $clang->gT("Welcome:").""; - - templatereplace($surveyinfo['surveyls_welcometext']); - $surveysummary .= LimeExpressionManager::GetLastPrettyPrintExpression(); - - if (trim($surveyinfo['surveyls_endtext'])!='') - { - $surveysummary .= "
    " - . $clang->gT("End message:").""; - - templatereplace($surveyinfo['surveyls_endtext']); - $surveysummary .= LimeExpressionManager::GetLastPrettyPrintExpression(); - } - - $surveysummary .= "
    " - . $clang->gT("Administrator:")." {$surveyinfo['admin']} ({$surveyinfo['adminemail']})
    " - . $clang->gT("Fax to:")."{$surveyinfo['faxto']}"; - $surveysummary .= "
    " - . $clang->gT("Start date/time:")."$startdate
    " - . $clang->gT("Expiry date/time:")."$expdate
    " - . $clang->gT("Template:")." {$surveyinfo['template']}
    " - . $clang->gT("Base language:")."$language
    " - . $clang->gT("Additional Languages").":-
     ".getLanguageNameFromCode($langname,false)."
    " - . $clang->gT("End URL").":"; - if ($surveyinfo['surveyls_url']!="") - { - templatereplace($surveyinfo['surveyls_url']); - $_url = htmlspecialchars(strip_tags(LimeExpressionManager::GetLastPrettyPrintExpression())); - templatereplace($surveyinfo['surveyls_urldescription']); - $_desc = LimeExpressionManager::GetLastPrettyPrintExpression(); - $surveysummary .=" {$_desc}"; - } - else - { - $surveysummary .="-"; - } - $surveysummary .="
    " - . $clang->gT("Number of questions/groups").":$sumcount3/$sumcount2
    " - . $clang->gT("Survey currently active").":"; - if ($activated == "N") - { - $surveysummary .= $clang->gT("No"); - } - else - { - $surveysummary .= $clang->gT("Yes"); - } - $surveysummary .="
    " - . $clang->gT("Survey table name").":".$dbprefix."survey_$surveyid
    " - . $clang->gT("Hints").":\n"; - - if ($activated == "N" && $sumcount3 == 0) - { - $surveysummary .= $clang->gT("Survey cannot be activated yet.")."
    \n"; - if ($sumcount2 == 0 && bHasSurveyPermission($surveyid,'surveycontent','create')) - { - $surveysummary .= "[".$clang->gT("You need to add question groups")."]
    "; - } - if ($sumcount3 == 0 && bHasSurveyPermission($surveyid,'surveycontent','create')) - { - $surveysummary .= "[".$clang->gT("You need to add questions")."]
    "; - } - } - $surveysummary .= $surveysummary2 - . "
    \n"; - } - else - { - include("access_denied.php"); - } -} - - -if (isset($surveyid) && $surveyid && $gid ) // Show the group toolbar -{ - // TODO: check that surveyid and thus baselang are always set here - $sumquery4 = "SELECT * FROM ".db_table_name('questions')." WHERE sid=$surveyid AND - gid=$gid AND language='".$baselang."'"; //Getting a count of questions for this survey - $sumresult4 = $connect->Execute($sumquery4); //Checked - $sumcount4 = $sumresult4->RecordCount(); - $grpquery ="SELECT * FROM ".db_table_name('groups')." WHERE gid=$gid AND - language='".$baselang."' ORDER BY ".db_table_name('groups').".group_order"; - $grpresult = db_execute_assoc($grpquery); //Checked - - $groupsummary = "\n"; - // $groupsummary .= "

     

    "; //CSS Firefox 2 transition fix - - if ($qid || $action=='editgroup'|| $action=='addquestion') {$gshowstyle="style='display: none'";} - else {$gshowstyle="";} - - $groupsummary .= "\n" - . "\n" - . "\n\n\n"; - - } - $groupsummary .= "\n
    " - . $clang->gT("Title").":" - . "{$grow['group_name']} ({$grow['gid']})
    " - . $clang->gT("Description:").""; - if (trim($grow['description'])!='') - { - templatereplace($grow['description']); - $groupsummary .= LimeExpressionManager::GetLastPrettyPrintExpression(); - } - if (trim($grow['grelevance'])!='') - { - $groupsummary .= "
    "; - $groupsummary .= $clang->gT("Relevance:").""; - templatereplace('{' . $grow['grelevance'] . '}'); - $groupsummary .= LimeExpressionManager::GetLastPrettyPrintExpression(); - } - $groupsummary .= "
    \n"; -} - -//////////////////////////////////////////////////////////////////////////////// -// Question toolbar -//////////////////////////////////////////////////////////////////////////////// - - -if (isset($surveyid) && $surveyid && $gid && $qid) // Show the question toolbar -{ - // TODO: check that surveyid is set and that so is $baselang - //Show Question Details - //Count answer-options for this question - $qrq = "SELECT * FROM ".db_table_name('answers')." WHERE qid=$qid AND language='".$baselang."' ORDER BY sortorder, answer"; - $qrr = $connect->Execute($qrq); //Checked - $qct = $qrr->RecordCount(); - //Count sub-questions for this question - $sqrq= "SELECT * FROM ".db_table_name('questions')." WHERE parent_qid=$qid AND language='".$baselang."'"; - $sqrr= $connect->Execute($sqrq); //Checked - $sqct = $sqrr->RecordCount(); - - $qrquery = "SELECT * FROM ".db_table_name('questions')." WHERE gid=$gid AND sid=$surveyid AND qid=$qid AND language='".$baselang."'"; - $qrresult = db_execute_assoc($qrquery) or safe_die($qrquery."
    ".$connect->ErrorMsg()); //Checked - $questionsummary = "\n"; - $questionsummary .= "

     

    "; //CSS Firefox 2 transition fix - - if ($action=='editansweroptions' || $action =="editsubquestions" || $action =="editquestion" || $action =="editdefaultvalues" || $action =="copyquestion") - { - $qshowstyle = "style='display: none'"; - } - else - { - $qshowstyle = ""; - } - $questionsummary .= "\n" - . "\n" - . "\n\n" - . "\n\n"; - if ($qrrow['preg']) - { - $questionsummary .= "\n\n"; - } - $qtypes = getqtypelist("", "array"); //qtypes = array(type code=>type description) - $questionsummary .= "\n\n"; - if ($qct == 0 && $qtypes[$qrrow['type']]['answerscales'] >0) - { - $questionsummary .= "\n"; - } - - // EDIT SUBQUESTIONS FOR THIS QUESTION BUTTON - if($sqct == 0 && $qtypes[$qrrow['type']]['subquestions'] >0) - { - $questionsummary .= "\n"; - } - - if ($qrrow['type'] == "M" or $qrrow['type'] == "P") - { - $questionsummary .= "" - . "\n" - . "\n"; - } - if (isset($qrrow['mandatory']) and ($qrrow['type'] != "X") and ($qrrow['type'] != "|")) - { - $questionsummary .= "" - . "\n" - . "\n"; - } - if (is_null($qrrow['relevance']) || trim($qrrow['relevance']) == '') - { - $rel2show = 1; - } - else - { - LimeExpressionManager::ProcessString("{" . $qrrow['relevance'] . "}", $qid); // tests Relevance equation so can pretty-print it - $rel2show = LimeExpressionManager::GetLastPrettyPrintExpression(); - $questionsummary .= "" - . "\n" - . "\n"; - } - $questionsummary .= "
    " - . $clang->gT("Code:")."{$qrrow['title']}"; - if ($qrrow['type'] != "X") - { - if ($qrrow['mandatory'] == "Y") {$questionsummary .= ": (".$clang->gT("Mandatory Question").")";} - else {$questionsummary .= ": (".$clang->gT("Optional Question").")";} - } - $questionsummary .= "
    "; - $questionsummary .= $clang->gT("Question:") . ""; - - // Color code the question, help, and relevance - - templatereplace($qrrow['question'],false,false,$qid); - $questionsummary .= FlattenText(LimeExpressionManager::GetLastPrettyPrintExpression(), false, 'UTF-8', true, true); - - $questionsummary .= "
    " - . $clang->gT("Help:").""; - if (trim($qrrow['help'])!='') - { - templatereplace($qrrow['help'],false,false,$qid); - $questionsummary .= FlattenText(LimeExpressionManager::GetLastPrettyPrintExpression(), false, 'UTF-8', true, true); - } - $questionsummary .= "
    " - . $clang->gT("Validation:")."{$qrrow['preg']}" - . "
    " - .$clang->gT("Type:")."{$qtypes[$qrrow['type']]['description']}"; - $questionsummary .="
    " - . "" - . $clang->gT("Warning").": ". $clang->gT("You need to add answer options to this question")." " - . "
    " - . "" - . $clang->gT("Warning").": ". $clang->gT("You need to add subquestions to this question")." " - . "
    " - . $clang->gT("Option 'Other':").""; - $questionsummary .= ($qrrow['other'] == "Y") ? ($clang->gT("Yes")) : ($clang->gT("No")) ; - $questionsummary .= "
    " - . $clang->gT("Mandatory:").""; - $questionsummary .= ($qrrow['mandatory'] == "Y") ? ($clang->gT("Yes")) : ($clang->gT("No")) ; - $questionsummary .= "
    " - . $clang->gT("Relevance:").""; - $questionsummary .= $rel2show; - $questionsummary .= "
    "; - } -} -LimeExpressionManager::FinishProcessingPage(); - -// ============= EDIT ANSWER OPTIONS===================================== - - -if ($action=='editansweroptions') -{ - include("editansweroptions.php"); -} - - -// ============= EDIT SUBQUESTIONS ====================================== - -if ($action=='editsubquestions') -{ - include("editsubquestions.php"); -} - - - -// ************************************************* -// Survey Rights Start **************************** -// ************************************************* - -if($action == "addsurveysecurity") -{ - $addsummary = "
    ".$clang->gT("Add User")."
    \n"; - $addsummary .= "
    \n"; - - if($postuserid > 0){ - - $isrquery = "INSERT INTO {$dbprefix}survey_permissions (sid,uid,permission,read_p) VALUES ({$surveyid},{$postuserid},'survey',1)"; - $isrresult = $connect->Execute($isrquery); //Checked - - if($isrresult) - { - $addsummary .= "
    ".$clang->gT("User added.")."
    \n"; - $addsummary .= "
    " - ."" - ."" - ."" - ."
    \n"; - } - else - { - // Username already exists. - $addsummary .= "
    ".$clang->gT("Failed to add user.")."
    \n" - . "
    " . $clang->gT("Username already exists.")."
    \n"; - $addsummary .= "
    gT("Continue")."\"/>\n"; - } - } - else - { - $addsummary .= "
    ".$clang->gT("Failed to add user.")."
    \n" - . "
    " . $clang->gT("No Username selected.")."
    \n"; - $addsummary .= "
    gT("Continue")."\"/>\n"; - } - $addsummary .= "
    \n"; -} - - -if($action == "addusergroupsurveysecurity") -{ - $addsummary = "
    ".$clang->gT("Add user group")."
    \n"; - $addsummary .= "
    \n"; - - if($postusergroupid > 0){ - $query2 = "SELECT b.uid FROM (SELECT uid FROM ".db_table_name('survey_permissions')." WHERE sid = {$surveyid}) AS c RIGHT JOIN ".db_table_name('user_in_groups')." AS b ON b.uid = c.uid WHERE c.uid IS NULL AND b.ugid = {$postusergroupid}"; - $result2 = db_execute_assoc($query2); //Checked - if($result2->RecordCount() > 0) - { - while ($row2 = $result2->FetchRow()) - { - $uid_arr[] = $row2['uid']; - $isrquery = "INSERT INTO {$dbprefix}survey_permissions (sid,uid,permission,read_p) VALUES ({$surveyid}, {$row2['uid']},'survey',1) "; - $isrresult = $connect->Execute($isrquery); //Checked - if (!$isrresult) break; - } - - if($isrresult) - { - $addsummary .= "
    ".$clang->gT("User Group added.")."
    \n"; - $_SESSION['uids'] = $uid_arr; - $addsummary .= "
    " - ."" - ."" - ."" - ."
    \n"; - } - else - { - // Error while adding user to the database - $addsummary .= "
    ".$clang->gT("Failed to add User Group.")."
    \n"; - $addsummary .= "
    gT("Continue")."\"/>\n"; - } - } - else - { - // no user to add - $addsummary .= "
    ".$clang->gT("Failed to add User Group.")."
    \n"; - $addsummary .= "
    gT("Continue")."\"/>\n"; - } - } - else - { - $addsummary .= "
    ".$clang->gT("Failed to add user.")."
    \n" - . "
    " . $clang->gT("No Username selected.")."
    \n"; - $addsummary .= "
    gT("Continue")."\"/>\n"; - } - $addsummary .= "
    \n"; -} - -if($action == "delsurveysecurity") -{ - $addsummary = "
    ".$clang->gT("Deleting User")."
    \n"; - $addsummary .= "
    \n"; - - if (isset($postuserid)) - { - $dquery="DELETE FROM".db_table_name('survey_permissions')." WHERE uid={$postuserid} AND sid={$surveyid}"; // added by Dennis - $dresult=$connect->Execute($dquery); //Checked - - $addsummary .= "
    ".$clang->gT("Username").": ".sanitize_xss_string($_POST['user'])."

    \n"; - $addsummary .= "
    ".$clang->gT("Success!")."
    \n"; - } - else - { - $addsummary .= "
    ".$clang->gT("Could not delete user. User was not supplied.")."
    \n"; - } - $addsummary .= "
    gT("Continue")."\"/>\n"; - $addsummary .= "
    \n"; -} - -if($action == "setsurveysecurity" || $action == "setusergroupsurveysecurity") -{ - $js_admin_includes[]='../scripts/jquery/jquery.tablesorter.min.js'; - $js_admin_includes[]='scripts/surveysecurity.js'; - if ($action == "setsurveysecurity") - { - $sUsername=$connect->GetOne("select users_name from ".db_table_name('users')." where uid={$postuserid}"); - $usersummary = "
    ".sprintf($clang->gT("Edit survey permissions for user %s"),"".$sUsername."")."
    "; - } - else - { - $sUsergroupName=$connect->GetOne("select name from ".db_table_name('user_groups')." where ugid={$postusergroupid}"); - $usersummary = "
    ".sprintf($clang->gT("Edit survey permissions for group %s"),"".$sUsergroupName."")."
    "; - } - $usersummary .= "
    \n" - . "\n"; - - $usersummary .= "" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n"; - - //content - - $aBasePermissions=aGetBaseSurveyPermissions(); - $oddcolumn=false; - foreach($aBasePermissions as $sPermissionKey=>$aCRUDPermissions) - { - $oddcolumn=!$oddcolumn; - $usersummary .= ""; - $usersummary .= ""; - $usersummary .= ""; - foreach ($aCRUDPermissions as $sCRUDKey=>$CRUDValue) - { - if (!in_array($sCRUDKey,array('create','read','update','delete','import','export'))) continue; - $usersummary .= "
    ".$clang->gT("Permission")."".$clang->gT("Create")."".$clang->gT("View/read")."".$clang->gT("Update")."".$clang->gT("Delete")."".$clang->gT("Import")."".$clang->gT("Export")."
    {$aCRUDPermissions['title']}"; - - if ($CRUDValue) - { - if (!($sPermissionKey=='survey' && $sCRUDKey=='read')) - { - $usersummary .= "" - ."" - .""; - - if ($action=='setsurveysecurity') - { - $usersummary .=""; - } - else - { - $usersummary .=""; - } - $usersummary .= "\n"; -} - -// This is the action to export the structure of a complete survey -if($action == "exportstructure") -{ - if(bHasSurveyPermission($surveyid,'surveycontent','export')) - { - $exportstructure = "
    \n" - ."
    " - .$clang->gT("Export Survey Structure")."\n

    \n" - ."
      \n" - ."
    • " - .$clang->gT("LimeSurvey XML survey file (*.lss)")."
    • \n"; - - $exportstructure.="
    • " - .str_replace('queXML','queXML',$clang->gT("queXML Survey XML Format (*.xml)"))." " - ."
    • \n"; - - // XXX - //include("../config.php"); - - //echo $export4lsrc; - if($export4lsrc) - { - $exportstructure.="
    • " - ."
    • "; - } - $exportstructure.="
    \n"; - - $exportstructure.="

    \n" - ."\n" - ."\n"; - $exportstructure.="

    \n"; - } -} - -// This is the action to export the structure of a group -if($action == "exportstructureGroup") -{ - if($export4lsrc === true && bHasSurveyPermission($surveyid,'survey','export')) - { - $exportstructure = "
    \n" - ."
    ".$clang->gT("Export group structure")."\n
    \n" - ."
      \n" - ."
    • \n"; - $exportstructure.="" - ."
    • \n"; - - // $exportstructure.="" - // ."\n"; - - // XXX - //include("../config.php"); - - //echo $export4lsrc; - if($export4lsrc) - { - $exportstructure.="
    • " - ."
    • \n"; - } - - $exportstructure.="
    \n" - ."

    \n" - ."\n" - ."\n" - ."\n" - ."\n"; - $exportstructure.="

    \n"; - } - else - { - include('dumpgroup.php'); - } -} - -// This is the action to export the structure of a question -if($action == "exportstructureQuestion") -{ - if($export4lsrc === true && bHasSurveyPermission($surveyid,'survey','export')) - { - $exportstructure = "
    \n" - ."
    ".$clang->gT("Export question structure")."\n
    \n" - ."
      \n" - ."
    • \n"; - $exportstructure.="" - ."
    • \n"; - - // $exportstructure.="" - // ."\n"; - - // XXX - //include("../config.php"); - - //echo $export4lsrc; - if($export4lsrc) - { - $exportstructure.="
    • " - ."
    • \n"; - } - - $exportstructure.="
    \n" - ."

    \n" - ."\n" - ."\n" - ."\n" - ."\n" - ."\n"; - $exportstructure.="

    \n"; - } - else - { - include('dumpquestion.php'); - } -} - -if($action == "surveysecurity") -{ - if(bHasSurveyPermission($surveyid,'survey','read')) - { - $aBaseSurveyPermissions=aGetBaseSurveyPermissions(); - $js_admin_includes[]='../scripts/jquery/jquery.tablesorter.min.js'; - $js_admin_includes[]='scripts/surveysecurity.js'; - - $query2 = "SELECT p.sid, p.uid, u.users_name, u.full_name FROM ".db_table_name('survey_permissions')." AS p INNER JOIN ".db_table_name('users')." AS u ON p.uid = u.uid - WHERE p.sid = {$surveyid} AND u.uid != ".$_SESSION['loginID'] ." - GROUP BY p.sid, p.uid, u.users_name, u.full_name - ORDER BY u.users_name"; - $result2 = db_execute_assoc($query2); //Checked - - $surveysecurity ="
    ".$clang->gT("Survey permissions")."
    \n" - . "" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n"; - foreach ($aBaseSurveyPermissions as $sPermission=>$aSubPermissions ) - { - $surveysecurity.="\n"; - } - $surveysecurity .= "\n"; - - // Foot first - - if (isset($usercontrolSameGroupPolicy) && - $usercontrolSameGroupPolicy == true) - { - $authorizedGroupsList=getusergrouplist('simplegidarray'); - } - - $surveysecurity .= "\n"; - if($result2->RecordCount() > 0) - { - // output users - $row = 0; - while ($PermissionRow = $result2->FetchRow()) - { - - $query3 = "SELECT a.ugid FROM ".db_table_name('user_in_groups')." AS a RIGHT OUTER JOIN ".db_table_name('users')." AS b ON a.uid = b.uid WHERE b.uid = ".$PermissionRow['uid']; - $result3 = db_execute_assoc($query3); //Checked - while ($resul3row = $result3->FetchRow()) - { - if (!isset($usercontrolSameGroupPolicy) || - $usercontrolSameGroupPolicy == false || - in_array($resul3row['ugid'],$authorizedGroupsList)) - { - $group_ids[] = $resul3row['ugid']; - } - } - - if(isset($group_ids) && $group_ids[0] != NULL) - { - $group_ids_query = implode(" OR ugid=", $group_ids); - unset($group_ids); - - $query4 = "SELECT name FROM ".db_table_name('user_groups')." WHERE ugid = ".$group_ids_query; - $result4 = db_execute_assoc($query4); //Checked - - while ($resul4row = $result4->FetchRow()) - { - $group_names[] = $resul4row['name']; - } - if(count($group_names) > 0) - $group_names_query = implode(", ", $group_names); - } - // else {break;} //TODO Commented by lemeur - $surveysecurity .= "\n"; - - $surveysecurity .= "\n"; - $surveysecurity .= "\n" - . "\n" - . "\n"; - - //Now show the permissions - foreach ($aBaseSurveyPermissions as $sPKey=>$aPDetails) { - unset($aPDetails['img']); - unset($aPDetails['description']); - unset($aPDetails['title']); - $iCount=0; - $iPermissionCount=0; - foreach ($aPDetails as $sPDetailKey=>$sPDetailValue) - { - if ($sPDetailValue && bHasSurveyPermission($surveyid,$sPKey,$sPDetailKey,$PermissionRow['uid']) && !($sPKey=='survey' && $sPDetailKey=='read')) $iCount++; - if ($sPDetailValue) $iPermissionCount++; - } - if ($sPKey=='survey') $iPermissionCount--; - if ($iCount==$iPermissionCount) { - $insert = "
     
    "; - } - elseif ($iCount>0){ - $insert = "
     
    "; - } - else - { - $insert = "
     
    "; - } - $surveysecurity .= "\n"; - } - - $surveysecurity .= "\n"; - $row++; - } - } else { - $surveysecurity .= ""; //fix error on empty table - } - $surveysecurity .= "\n" - . "
    ".$clang->gT("Action")."".$clang->gT("Username")."".$clang->gT("User Group")."".$clang->gT("Full name")."\"<span".$aSubPermissions['title']."
    ".$aSubPermissions['description']."\" />
    \n"; - if (bHasSurveyPermission($surveyid, 'surveysecurity', 'update')) - { - $surveysecurity .= "
    " - ."" - ."" - ."" - ."" - ."
    \n"; - } - if (bHasSurveyPermission($surveyid, 'surveysecurity', 'delete')) - { - $surveysecurity .= "
    " - ."" - ."" - ."" - ."" - ."
    "; - } - - - $surveysecurity .= "
    {$PermissionRow['users_name']}"; - - if(isset($group_names) > 0) - { - $surveysecurity .= $group_names_query; - } - else - { - $surveysecurity .= "---"; - } - unset($group_names); - - $surveysecurity .= "\n{$PermissionRow['full_name']}\n$insert\n
    \n"; - if (bHasSurveyPermission($surveyid, 'surveysecurity', 'delete')) - { - $surveysecurity.= "
      \n" - . "
    • \n" - . "gT("Please select a user first","js")."'); return false;}\"/>" - . "" - . "
    \n" - . "
    • \n" - . "\n" - . "gT("Please select a user group first","js")."'); return false;}\" />" - . "\n" - . "
    "; - } - - } - else - { - include("access_denied.php"); - } -} - -elseif ($action == "surveyrights") -{ - $addsummary = "
    ".$clang->gT("Edit survey permissions")."
    \n"; - $addsummary .= "
    \n"; - - if(isset($postuserid)){ - $query = "SELECT sid, owner_id FROM ".db_table_name('surveys')." WHERE sid = {$surveyid}"; - if ($_SESSION['USER_RIGHT_SUPERADMIN'] != 1) - { - $query.=" AND owner_id != {$postuserid} AND owner_id = ".$_SESSION['loginID']; - } - } - else{ - $sQuery = "SELECT owner_id FROM ".db_table_name('surveys')." WHERE sid = {$surveyid}"; - if ($_SESSION['USER_RIGHT_SUPERADMIN'] != 1) - { - $query.=" AND owner_id = ".$_SESSION['loginID']; - } - $iOwnerID=$connect->GetOne($sQuery); - } - - $aBaseSurveyPermissions=aGetBaseSurveyPermissions(); - $aPermissions=array(); - foreach ($aBaseSurveyPermissions as $sPermissionKey=>$aCRUDPermissions) - { - foreach ($aCRUDPermissions as $sCRUDKey=>$CRUDValue) - { - if (!in_array($sCRUDKey,array('create','read','update','delete','import','export'))) continue; - - if ($CRUDValue) - { - if(isset($_POST["perm_{$sPermissionKey}_{$sCRUDKey}"])){ - $aPermissions[$sPermissionKey][$sCRUDKey]=1; - } - else - { - $aPermissions[$sPermissionKey][$sCRUDKey]=0; - } - } - } - } - if (isset($postusergroupid) && $postusergroupid>0) - { - $sQuery = "SELECT uid from ".db_table_name('user_in_groups')." where ugid = {$postusergroupid} and uid<>{$_SESSION['loginID']} AND uid<>{$iOwnerID}"; - $oResult = db_execute_assoc($sQuery); //Checked - if($oResult->RecordCount() > 0) - { - while ($aRow = $oResult->FetchRow()) - { - SetSurveyPermissions($aRow['uid'], $surveyid, $aPermissions); - } - $addsummary .= "
    ".$clang->gT("Survey permissions for all users in this group were successfully updated.")."
    \n"; - } - } - else - { - if(SetSurveyPermissions($postuserid, $surveyid, $aPermissions)) - { - $addsummary .= "
    ".$clang->gT("Survey permissions were successfully updated.")."
    \n"; - } - else - { - $addsummary .= "
    ".$clang->gT("Failed to update survey permissions!")."
    \n"; - } - - } - $addsummary .= "
    gT("Continue")."\"/>\n"; - $addsummary .= "
    \n"; -} - -// ************************************************* -// Survey Rights End **************************** -// ************************************************* - -// Edit survey general settings - -if ($action == "editsurveysettings" || $action == "newsurvey") -{ - include("editsurveysettings.php"); -} - - - - -// Edit survey text elements - -if ($action == "updatesurveysettingsandeditlocalesettings" || $action == "editsurveylocalesettings") // Edit survey step 2 - editing language dependent settings -{ - include("editsurveytextelements.php"); -} - -if ($action == "translate") // Translate survey -{ - if(bHasSurveyPermission($surveyid,'translation','read')) - { - $translateoutput .="
    ".$clang->gT("Quick-translate survey")."
    \n"; - } - else - { - include("access_denied.php"); - } - -} - -if ($action == "emailtemplates") -{ - include("editemailtemplates.php"); -} - - - - -if($action == "quotas") - { - include("quota.php"); - } - -function replacenewline ($texttoreplace) -{ - $texttoreplace = str_replace( "\n", '
    ', $texttoreplace); - // $texttoreplace = htmlentities( $texttoreplace, ENT_QUOTES, UTF-8); - $new_str = ''; - - for($i = 0; $i < strlen($texttoreplace); $i++) { - $new_str .= '\x' . dechex(ord(substr($texttoreplace, $i, 1))); - } - - return $new_str; -} - -/** - * showadminmenu() function returns html text for the administration button bar - * - * @global string $homedir - * @global string $scriptname - * @global string $surveyid - * @global string $setfont - * @global string $imageurl - * @return string $adminmenu - */ -function showadminmenu() -{ - global $homedir, $scriptname, $surveyid, $setfont, $imageurl, $clang, $debug, $action, $updateavailable, $updatebuild, $updateversion, $updatelastcheck, $databasetype; - - $adminmenu = "\n"; - // $adminmenu .= "

     

    "; //CSS Firefox 2 transition fix - if (!isset($action) && !isset($surveyid) && count(getsurveylist(true))==0) - { - $adminmenu.= '
    ' - .'

    '.sprintf($clang->gT("Welcome to %s!"),'LimeSurvey').'

    ' - .'

    '.$clang->gT("Some piece-of-cake steps to create your very own first survey:").'
    ' - .'

      ' - .'
    1. '.sprintf($clang->gT('Create a new survey clicking on the %s icon in the upper right.'),"". $clang->gT("Add survey")."").'
    2. ' - .'
    3. '.$clang->gT('Create a new question group inside your survey.').'
    4. ' - .'
    5. '.$clang->gT('Create one or more questions inside the new question group.').'
    6. ' - .'
    7. '.sprintf($clang->gT('Done. Test your survey using the %s icon.'),"". $clang->gT("Test survey")."").'
    8. ' - .'


     
    '; - } - - } - return $adminmenu; -} diff --git a/include/limesurvey/admin/html_functions.php b/include/limesurvey/admin/html_functions.php deleted file mode 100644 index bcdf0b63..00000000 --- a/include/limesurvey/admin/html_functions.php +++ /dev/null @@ -1,161 +0,0 @@ -\n" - . "" - . "\n" - . "\n"; - - return $browsemenubar; -} -function getQuestionlistMode(){ - global $defaultquestionselectormode; - //TODO : put it on globalsettings $defaultquestionselectormode=getGlobalSetting('defaultquestionselectormode'); - if (isset($_SESSION['questionselectormode']) && ($_SESSION['questionselectormode']=='full' || $_SESSION['questionselectormode']=='none')) - { - return $_SESSION['questionselectormode']; - } - else - { - return $defaultquestionselectormode; - } -} diff --git a/include/limesurvey/admin/htmleditor-functions.php b/include/limesurvey/admin/htmleditor-functions.php deleted file mode 100644 index 325c1ccc..00000000 --- a/include/limesurvey/admin/htmleditor-functions.php +++ /dev/null @@ -1,238 +0,0 @@ -'de', - 'nl-formal'=>'nl'); - if (isset($aTranslationTable[$sLanguageCode])) { - $sResultCode=$aTranslationTable[$sLanguageCode]; - } - else - { - $sResultCode=$sLanguageCode; - } - return $sResultCode; - -} - - -function PrepareEditorScript() -{ - global $clang, $imageurl, $homeurl, $js_admin_includes; - global $sCKEditorURL; - - $js_admin_includes[]=$sCKEditorURL.'/ckeditor.js'; - $script = "\n"; - - return $script; -} - -function getEditor($fieldtype,$fieldname,$fieldtext, $surveyID=null,$gID=null,$qID=null,$action=null) -{ - global $defaulthtmleditormode; - //error_log("TIBO fieldtype=$fieldtype,fieldname=$fieldname,fieldtext=$fieldtext,surveyID=$surveyID,gID=$gID,qID=$qID,action=$action"); - - if (isset($_SESSION['htmleditormode']) && - $_SESSION['htmleditormode'] == 'none') - { - return ''; - } - - - if (!isset($_SESSION['htmleditormode']) || - ($_SESSION['htmleditormode'] != 'inline' && - $_SESSION['htmleditormode'] != 'popup') ) - { - $htmleditormode = $defaulthtmleditormode; - } - else - { - $htmleditormode = $_SESSION['htmleditormode']; - } - - if ( ($fieldtype == 'email-inv' || - $fieldtype == 'email-reg' || - $fieldtype == 'email-conf' || - $fieldtype == 'email-rem' ) && - getEmailFormat($surveyID) != 'html') - { - return ''; - } - - if ($htmleditormode == 'popup' || - ( $fieldtype == 'editanswer' || - $fieldtype == 'addanswer' || - $fieldtype == 'editlabel' || - $fieldtype == 'addlabel') && (preg_match("/^translate/",$action) == 0 ) ) - { - return getPopupEditor($fieldtype,$fieldname,$fieldtext, $surveyID,$gID,$qID,$action); - } - elseif ($htmleditormode == 'inline') - { - return getInlineEditor($fieldtype,$fieldname,$fieldtext, $surveyID,$gID,$qID,$action); - } - else - { - return ''; - } -} - -function getPopupEditor($fieldtype,$fieldname,$fieldtext, $surveyID=null,$gID=null,$qID=null,$action=null) -{ - global $clang, $imageurl, $homeurl; - - $htmlcode = ''; - $imgopts = ''; - $toolbarname = 'Basic'; - - if ($fieldtype == 'editanswer' || - $fieldtype == 'addanswer' || - $fieldtype == 'editlabel' || - $fieldtype == 'addlabel') - { - $imgopts = "width='16' height='16'"; - } - - $htmlcode .= "" - . "gTview("Start HTML Editor in a Popup Window")."\" class='editorLink'>\n" - . "\t\"".$clang-gT("Start HTML Editor in a Popup Window")."\" id='".$fieldname."_popupctrlena' name='".$fieldname."_popupctrlena' border='0' src='".$imageurl."/edithtmlpopup.png' $imgopts align='top' class='btneditanswerena' />\n" - . "\t\"".$clang-gT("Give focus to the HTML Editor Popup Window")."\" id='".$fieldname."_popupctrldis' name='".$fieldname."_popupctrldis' border='0' src='".$imageurl."/edithtmlpopup_disabled.png' style='display: none' $imgopts align='top' class='btneditanswerdis' />\n" - . "\n"; - - return $htmlcode; -} - -function getInlineEditor($fieldtype,$fieldname,$fieldtext, $surveyID=null,$gID=null,$qID=null,$action=null) -{ - global $clang, $imageurl, $homeurl, $rooturl, $sCKEditorURL, $ckeditexpandtoolbar, $uploadurl; - - $htmlcode = ''; - $imgopts = ''; - $toolbarname = 'inline'; - $toolbaroption=""; - $htmlformatoption=""; - $oCKeditorVarName = "oCKeditor_".str_replace("-","_",$fieldname); - - if ( ($fieldtype == 'editanswer' || - $fieldtype == 'addanswer' || - $fieldtype == 'editlabel' || - $fieldtype == 'addlabel') && (preg_match("/^translate/",$action) == 0) ) - { - $toolbaroption= ",toolbarStartupExpanded:true\n" - .",toolbar:'popup'\n" - .",toolbarCanCollapse:false\n"; - } - else - { - if (!isset($ckeditexpandtoolbar) || $ckeditexpandtoolbar == true) - { - $toolbaroption = ",toolbarStartupExpanded:true\n" - .",toolbar:'inline'\n"; - } - } - - if ( $fieldtype == 'email-inv' || - $fieldtype == 'email-reg' || - $fieldtype == 'email-conf'|| - $fieldtype == 'email-admin-notification'|| - $fieldtype == 'email-admin-resp'|| - $fieldtype == 'email-rem' ) - { - $htmlformatoption = ",fullPage:true\n"; - } - - - $htmlcode .= "" - . "'; - - return $htmlcode; -} - -?> diff --git a/include/limesurvey/admin/htmleditor-popup.php b/include/limesurvey/admin/htmleditor-popup.php deleted file mode 100644 index 8f069637..00000000 --- a/include/limesurvey/admin/htmleditor-popup.php +++ /dev/null @@ -1,195 +0,0 @@ - - - - LimeSurvey '.$clang->gT("HTML Editor").' - - -' - - . ' - -
    - LimeSurvey '.$clang->gT("HTML Editor").' -
    -
    - -

    -
    -
    -
    - - -
    - - '; -} -else { - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $oFilter = new InputFilter('','',1,1,1); - - $fieldname=$oFilter->process($_GET['fieldname']); - $fieldtext=$oFilter->process($_GET['fieldtext']); - if (get_magic_quotes_gpc()) $fieldtext = stripslashes($fieldtext); - $controlidena=$_GET['fieldname'].'_popupctrlena'; - $controliddis=$_GET['fieldname'].'_popupctrldis'; - - $sid=sanitize_int($_GET['sid']); - $gid=sanitize_int($_GET['gid']); - $qid=sanitize_int($_GET['qid']); - $fieldtype=preg_replace("/[^_.a-zA-Z0-9-]/", "",$_GET['fieldtype']); - $action=preg_replace("/[^_.a-zA-Z0-9-]/", "",$_GET['action']); - - $toolbarname='popup'; - $htmlformatoption=''; - - if ( $fieldtype == 'email-inv' || - $fieldtype == 'email-reg' || - $fieldtype == 'email-conf' || - $fieldtype == 'email-rem' ) - { - $htmlformatoption = ",fullPage:true"; - } - - $output = ' - - - - '.sprintf($clang->gT("Editing %s"), $fieldtext).' - - - - - '; - - - $output .= " - -
    - - - "; - - $output .= ""; - $output .= " -
    - - "; -} - -echo $output; - -// Yes, closing PHP tag was intentionally left out \ No newline at end of file diff --git a/include/limesurvey/admin/http_importsurvey.php b/include/limesurvey/admin/http_importsurvey.php deleted file mode 100644 index c4ee9f17..00000000 --- a/include/limesurvey/admin/http_importsurvey.php +++ /dev/null @@ -1,213 +0,0 @@ -".$clang->gT("Import survey")."\n"; - $importingfrom = "http"; -} -elseif($action == 'copysurvey') -{ - $importsurvey = "
    ".$clang->gT("Copy survey")."
    \n"; - $copyfunction= true; -} - -// Start traitment and messagebox -$importsurvey .= "
    \n"; -$importerror=false; // Put a var for continue - -if ($action == 'importsurvey') -{ - $the_full_file_path = $tempdir . "/" . sRandomChars(20).'_'.$_FILES['the_file']['name']; - if (!@move_uploaded_file($_FILES['the_file']['tmp_name'], $the_full_file_path)) - { - $importsurvey .= "
    ".$clang->gT("Error")."
    \n"; - $importsurvey .= sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir)."

    \n"; - $importsurvey .= "

    \n"; - $importerror=true; - } - else - { - $importsurvey .= "
    ".$clang->gT("Success")."
     
    \n"; - $importsurvey .= $clang->gT("File upload succeeded.")."

    \n"; - $importsurvey .= $clang->gT("Reading file..")."
    \n"; - $sFullFilepath=$the_full_file_path; - $aPathInfo = pathinfo($sFullFilepath); - if (isset($aPathInfo['extension'])) - { - $sExtension = $aPathInfo['extension']; - } - else - { - $sExtension = ""; - } - - } - if (!$importerror && (strtolower($sExtension)!='csv' && strtolower($sExtension)!='lss')) - { - $importsurvey .= "
    ".$clang->gT("Error")."
    \n"; - $importsurvey .= $clang->gT("Import failed. You specified an invalid file type.")."\n"; - $importerror=true; - } -} -elseif ($action == 'copysurvey') -{ - $surveyid = sanitize_int($_POST['copysurveylist']); - $exclude = array(); - if (get_magic_quotes_gpc()) {$sNewSurveyName = stripslashes($_POST['copysurveyname']);} - else{ - $sNewSurveyName=$_POST['copysurveyname']; - } - - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - if ($filterxsshtml) - { - $sNewSurveyName = $myFilter->process($sNewSurveyName); - } else { - $sNewSurveyName = html_entity_decode($sNewSurveyName, ENT_QUOTES, "UTF-8"); - } - if (isset($_POST['copysurveyexcludequotas']) && $_POST['copysurveyexcludequotas'] == "on") - { - $exclude['quotas'] = true; - } - if (isset($_POST['copysurveyexcludeanswers']) && $_POST['copysurveyexcludeanswers'] == "on") - { - $exclude['answers'] = true; - } - if (isset($_POST['copysurveyresetconditions']) && $_POST['copysurveyresetconditions'] == "on") - { - $exclude['conditions'] = true; - } - include("export_structure_xml.php"); - $copysurveydata = getXMLData($exclude); -} - -// Now, we have the survey : start importing -require_once('import_functions.php'); - -if ($action == 'importsurvey' && !$importerror) -{ - if (isset($sExtension) && strtolower($sExtension)=='csv') - { - $aImportResults=CSVImportSurvey($sFullFilepath); - } - elseif (isset($sExtension) && strtolower($sExtension)=='lss') - { - $aImportResults=XMLImportSurvey($sFullFilepath,null,null, null,(isset($_POST['translinksfields']))); - } - else - { - $importerror = true; - } -} -elseif ($action == 'copysurvey' && !$importerror) -{ - $aImportResults=XMLImportSurvey('',$copysurveydata,$sNewSurveyName); -} -else -{ - $importerror=true; -} - -if (isset($aImportResults['error']) && $aImportResults['error']!=false) -{ - $importsurvey .= "
    ".$clang->gT("Error")."

    \n"; - $importsurvey .= $aImportResults['error']."

    \n"; - $importsurvey .= "\n"; - $importerror = true; -} - -if (!$importerror) -{ - $importsurvey .= "
    \n
    ".$clang->gT("Success")."


    \n"; - if ($action == 'importsurvey') - { - $importsurvey .= "".$clang->gT("Survey copy summary")."
    \n"; - } - elseif($action == 'copysurvey') - { - $importsurvey .= "".$clang->gT("Survey import summary")."
    \n"; - } - - $importsurvey .= "
      \n\t
    • ".$clang->gT("Surveys").": {$aImportResults['surveys']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Languages").": {$aImportResults['languages']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Question groups").": {$aImportResults['groups']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Questions").": {$aImportResults['questions']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Answers").": {$aImportResults['answers']}
    • \n"; - if (isset($aImportResults['subquestions'])) - { - $importsurvey .= "\t
    • ".$clang->gT("Subquestions").": {$aImportResults['subquestions']}
    • \n"; - } - if (isset($aImportResults['defaultvalues'])) - { - $importsurvey .= "\t
    • ".$clang->gT("Default answers").": {$aImportResults['defaultvalues']}
    • \n"; - } - if (isset($aImportResults['conditions'])) - { - $importsurvey .= "\t
    • ".$clang->gT("Conditions").": {$aImportResults['conditions']}
    • \n"; - } - if (isset($aImportResults['labelsets'])) - { - $importsurvey .= "\t
    • ".$clang->gT("Label sets").": {$aImportResults['labelsets']}
    • \n"; - } - if (isset($aImportResults['deniedcountls']) && $aImportResults['deniedcountls']>0) - { - $importsurvey .= "\t
    • ".$clang->gT("Not imported label sets").": {$aImportResults['deniedcountls']} ".$clang->gT("(Label sets were not imported since you do not have the permission to create new label sets.)")."
    • \n"; - } - $importsurvey .= "\t
    • ".$clang->gT("Question attributes").": {$aImportResults['question_attributes']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Assessments").": {$aImportResults['assessments']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Quotas").": {$aImportResults['quota']} ({$aImportResults['quotamembers']} ".$clang->gT("quota members")." ".$clang->gT("and")." {$aImportResults['quotals']} ".$clang->gT("quota language settings").")
    • \n

    \n"; - - if (count($aImportResults['importwarnings'])>0) - { - $importsurvey .= "
    ".$clang->gT("Warnings").":
      "; - foreach ($aImportResults['importwarnings'] as $warning) - { - $importsurvey .='
    • '.$warning.'
    • '; - } - $importsurvey .= "

    \n"; - } - - if ($action == 'importsurvey') - { - $importsurvey .= "".$clang->gT("Import of Survey is completed.")."
    \n" - . "".$clang->gT("Go to survey")."
    \n"; - } - elseif($action == 'copysurvey') - { - $importsurvey .= "".$clang->gT("Copy of survey is completed.")."
    \n" - . "".$clang->gT("Go to survey")."
    \n"; - } - - if ($action == 'importsurvey') - { - unlink($sFullFilepath); - } - -} - // end of traitment an close message box - $importsurvey .= "

    \n"; -?> diff --git a/include/limesurvey/admin/import_functions.php b/include/limesurvey/admin/import_functions.php deleted file mode 100644 index 31a9de8c..00000000 --- a/include/limesurvey/admin/import_functions.php +++ /dev/null @@ -1,1617 +0,0 @@ -1.0 version file - these files carry the version information to read in line two - $importversion=substr($bigarray[1], 12, 3); - } - else // unknown file - show error message - { - $importresults['error'] = $clang->gT("This file is not a LimeSurvey survey file. Import failed.")."\n"; - return $importresults; - } - - if ((int)$importversion<112) - { - $importresults['error'] = $clang->gT("This file is too old. Only files from LimeSurvey version 1.50 (DBVersion 112) and newer are supported."); - return $importresults; - } - - // okay.. now lets drop the first 9 lines and get to the data - // This works for all versions - for ($i=0; $i<9; $i++) - { - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - - //SURVEYS - if (array_search("# GROUPS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# GROUPS TABLE\n", $bigarray); - } - elseif (array_search("# GROUPS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# GROUPS TABLE\r\n", $bigarray); - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$surveyarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //GROUPS - if (array_search("# QUESTIONS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUESTIONS TABLE\n", $bigarray); - } - elseif (array_search("# QUESTIONS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUESTIONS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$grouparray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //QUESTIONS - if (array_search("# ANSWERS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray); - } - elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) - { - $questionarray[] = $bigarray[$i]; - } - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //ANSWERS - if (array_search("# CONDITIONS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# CONDITIONS TABLE\n", $bigarray); - } - elseif (array_search("# CONDITIONS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# CONDITIONS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) - { - $answerarray[] = str_replace("`default`", "`default_value`", $bigarray[$i]); - } - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //CONDITIONS - if (array_search("# LABELSETS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray); - } - elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray); - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$conditionsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LABELSETS - if (array_search("# LABELS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\n", $bigarray); - } - elseif (array_search("# LABELS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LABELS - if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray); - } - elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //Question attributes - if (array_search("# ASSESSMENTS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# ASSESSMENTS TABLE\n", $bigarray); - } - elseif (array_search("# ASSESSMENTS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# ASSESSMENTS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$question_attributesarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - - //ASSESSMENTS - if (array_search("# SURVEYS_LANGUAGESETTINGS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# SURVEYS_LANGUAGESETTINGS TABLE\n", $bigarray); - } - elseif (array_search("# SURVEYS_LANGUAGESETTINGS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# SURVEYS_LANGUAGESETTINGS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - // if ($i<$stoppoint-2 || $i==count($bigarray)-1) - if ($i<$stoppoint-2) - { - $assessmentsarray[] = $bigarray[$i]; - } - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LANGAUGE SETTINGS - if (array_search("# QUOTA TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUOTA TABLE\n", $bigarray); - } - elseif (array_search("# QUOTA TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUOTA TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - // if ($i<$stoppoint-2 || $i==count($bigarray)-1) - //$bigarray[$i]= trim($bigarray[$i]); - if (isset($bigarray[$i]) && (trim($bigarray[$i])!='')) - { - if (strpos($bigarray[$i],"#")===0) - { - unset($bigarray[$i]); - unset($bigarray[$i+1]); - unset($bigarray[$i+2]); - break ; - } - else - { - $surveylsarray[] = $bigarray[$i]; - } - } - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //QUOTA - if (array_search("# QUOTA_MEMBERS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUOTA_MEMBERS TABLE\n", $bigarray); - } - elseif (array_search("# QUOTA_MEMBERS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUOTA_MEMBERS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - // if ($i<$stoppoint-2 || $i==count($bigarray)-1) - if ($i<$stoppoint-2) - { - $quotaarray[] = $bigarray[$i]; - } - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //QUOTA MEMBERS - if (array_search("# QUOTA_LANGUAGESETTINGS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUOTA_LANGUAGESETTINGS TABLE\n", $bigarray); - } - elseif (array_search("# QUOTA_LANGUAGESETTINGS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUOTA_LANGUAGESETTINGS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - // if ($i<$stoppoint-2 || $i==count($bigarray)-1) - if ($i<$stoppoint-2) - { - $quotamembersarray[] = $bigarray[$i]; - } - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - - //Whatever is the last table - currently - //QUOTA LANGUAGE SETTINGS - $stoppoint = count($bigarray)-1; - for ($i=0; $i<$stoppoint-1; $i++) - { - if ($i<=$stoppoint) {$quotalsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - if (isset($surveyarray)) {$importresults['surveys'] = count($surveyarray);} else {$importresults['surveys'] = 0;} - if (isset($surveylsarray)) {$importresults['languages'] = count($surveylsarray)-1;} else {$importresults['languages'] = 1;} - if (isset($grouparray)) {$importresults['groups'] = count($grouparray)-1;} else {$importresults['groups'] = 0;} - if (isset($questionarray)) {$importresults['questions'] = count($questionarray);} else {$importresults['questions']=0;} - if (isset($answerarray)) {$importresults['answers'] = count($answerarray);} else {$importresults['answers']=0;} - if (isset($conditionsarray)) {$importresults['conditions'] = count($conditionsarray);} else {$importresults['conditions']=0;} - if (isset($labelsetsarray)) {$importresults['labelsets'] = count($labelsetsarray);} else {$importresults['labelsets']=0;} - if (isset($assessmentsarray)) {$importresults['assessments']=count($assessmentsarray);} else {$importresults['assessments']=0;} - if (isset($quotaarray)) {$importresults['quota']=count($quotaarray);} else {$importresults['quota']=0;} - if (isset($quotamembersarray)) {$importresults['quotamembers']=count($quotamembersarray);} else {$importresults['quotamembers']=0;} - if (isset($quotalsarray)) {$importresults['quotals']=count($quotalsarray);} else {$importresults['quotals']=0;} - - // CREATE SURVEY - - if ($importresults['surveys']>0){$importresults['surveys']--;}; - if ($importresults['answers']>0){$importresults['answers']=($importresults['answers']-1)/$importresults['languages'];}; - if ($importresults['groups']>0){$countgroups=($importresults['groups']-1)/$importresults['languages'];}; - if ($importresults['questions']>0){$importresults['questions']=($importresults['questions']-1)/$importresults['languages'];}; - if ($importresults['assessments']>0){$importresults['assessments']--;}; - if ($importresults['conditions']>0){$importresults['conditions']--;}; - if ($importresults['labelsets']>0){$importresults['labelsets']--;}; - if ($importresults['quota']>0){$importresults['quota']--;}; - $sfieldorders =convertCSVRowToArray($surveyarray[0],',','"'); - $sfieldcontents=convertCSVRowToArray($surveyarray[1],',','"'); - $surveyrowdata=array_combine($sfieldorders,$sfieldcontents); - $oldsid=$surveyrowdata["sid"]; - - if($iDesiredSurveyId!=NULL) - $oldsid = $iDesiredSurveyId; - - if (!$oldsid) - { - if ($importingfrom == "http") - { - $importsurvey .= "
    ".$clang->gT("Error")."

    \n"; - $importsurvey .= $clang->gT("Import of this survey file failed")."
    \n"; - $importsurvey .= $clang->gT("File does not contain LimeSurvey data in the correct format.")."

    \n"; //Couldn't find the SID - cannot continue - $importsurvey .= "\n"; - $importsurvey .= "\n"; - unlink($sFullFilepath); //Delete the uploaded file - return; - } - else - { - echo $clang->gT("Import of this survey file failed")."\n".$clang->gT("File does not contain LimeSurvey data in the correct format.")."\n"; - return; - } - } - - $newsid = GetNewSurveyID($oldsid); - - $insert=$surveyarray[0]; - $sfieldorders =convertCSVRowToArray($surveyarray[0],',','"'); - $sfieldcontents=convertCSVRowToArray($surveyarray[1],',','"'); - $surveyrowdata=array_combine($sfieldorders,$sfieldcontents); - // Set new owner ID - $surveyrowdata['owner_id']=$_SESSION['loginID']; - // Set new survey ID - $surveyrowdata['sid']=$newsid; - $surveyrowdata['active']='N'; - - if (validate_templatedir($surveyrowdata['template'])!==$surveyrowdata['template']) $importresults['importwarnings'][] = sprintf($clang->gT('Template %s not found, please review when activating.'),$surveyrowdata['template']); - - if (isset($surveyrowdata['datecreated'])) {$surveyrowdata['datecreated']=$connect->BindTimeStamp($surveyrowdata['datecreated']);} - unset($surveyrowdata['expires']); - unset($surveyrowdata['attribute1']); - unset($surveyrowdata['attribute2']); - unset($surveyrowdata['usestartdate']); - unset($surveyrowdata['notification']); - unset($surveyrowdata['useexpiry']); - unset($surveyrowdata['url']); - unset($surveyrowdata['lastpage']); - if (isset($surveyrowdata['private'])){ - $surveyrowdata['anonymized']=$surveyrowdata['private']; - unset($surveyrowdata['private']); - } - if (isset($surveyrowdata['startdate'])) {unset($surveyrowdata['startdate']);} - $surveyrowdata['bounce_email']=$surveyrowdata['adminemail']; - if (!isset($surveyrowdata['datecreated']) || $surveyrowdata['datecreated']=='' || $surveyrowdata['datecreated']=='null') {$surveyrowdata['datecreated']=$connect->BindTimeStamp(date_shift(date("Y-m-d H:i:s"), "Y-m-d", $timeadjust));} - - $values=array_values($surveyrowdata); - $values=array_map(array(&$connect, "qstr"),$values); // quote everything accordingly - $insert = "INSERT INTO {$dbprefix}surveys (".implode(',',array_keys($surveyrowdata)).") VALUES (".implode(',',$values).")"; //handle db prefix - $iresult = $connect->Execute($insert) or safe_die("
    ".$clang->gT("Import of this survey file failed")."
    \n[$insert]
    {$surveyarray[0]}

    \n" . $connect->ErrorMsg()); - - // Now import the survey language settings - $fieldorders=convertCSVRowToArray($surveylsarray[0],',','"'); - unset($surveylsarray[0]); - foreach ($surveylsarray as $slsrow) { - $fieldcontents=convertCSVRowToArray($slsrow,',','"'); - $surveylsrowdata=array_combine($fieldorders,$fieldcontents); - // convert back the '\'.'n' char from the CSV file to true return char "\n" - $surveylsrowdata=array_map('convertCsvreturn2return', $surveylsrowdata); - // Convert the \n return char from welcometext to
    - - // translate internal links - $surveylsrowdata['surveyls_title']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_title']); - $surveylsrowdata['surveyls_description']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_description']); - $surveylsrowdata['surveyls_welcometext']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_welcometext']); - $surveylsrowdata['surveyls_urldescription']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_urldescription']); - $surveylsrowdata['surveyls_email_invite']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_email_invite']); - $surveylsrowdata['surveyls_email_remind']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_email_remind']); - $surveylsrowdata['surveyls_email_register']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_email_register']); - $surveylsrowdata['surveyls_email_confirm']=translink('survey', $oldsid, $newsid, $surveylsrowdata['surveyls_email_confirm']); - unset($surveylsrowdata['lastpage']); - $surveylsrowdata['surveyls_survey_id']=$newsid; - $newvalues=array_values($surveylsrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lsainsert = "INSERT INTO {$dbprefix}surveys_languagesettings (".implode(',',array_keys($surveylsrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $lsiresult=$connect->Execute($lsainsert) or safe_die("
    ".$clang->gT("Import of this survey file failed")."
    \n[$lsainsert]
    \n" . $connect->ErrorMsg() ); - } - - // The survey languagesettings are imported now - $aLanguagesSupported = array(); // this array will keep all the languages supported for the survey - - $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid); - $aLanguagesSupported[]=$sBaseLanguage; // adds the base language to the list of supported languages - $aLanguagesSupported=array_merge($aLanguagesSupported,GetAdditionalLanguagesFromSurveyID($newsid)); - - - // DO SURVEY_RIGHTS - GiveAllSurveyPermissions($_SESSION['loginID'],$newsid); - $importresults['deniedcountls'] =0; - - - $qtypes = getqtypelist("" ,"array"); - $results['labels']=0; - $results['labelsets']=0; - $results['answers']=0; - $results['subquestions']=0; - - //Do label sets - if (isset($labelsetsarray) && $labelsetsarray) - { - $csarray=buildLabelSetCheckSumArray(); // build checksums over all existing labelsets - $count=0; - foreach ($labelsetsarray as $lsa) { - $fieldorders =convertCSVRowToArray($labelsetsarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($lsa,',','"'); - if ($count==0) {$count++; continue;} - - $labelsetrowdata=array_combine($fieldorders,$fieldcontents); - - // Save old labelid - $oldlid=$labelsetrowdata['lid']; - - unset($labelsetrowdata['lid']); - $newvalues=array_values($labelsetrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lsainsert = "INSERT INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $lsiresult=$connect->Execute($lsainsert); - $results['labelsets']++; - // Get the new insert id for the labels inside this labelset - $newlid=$connect->Insert_ID("{$dbprefix}labelsets",'lid'); - - if ($labelsarray) { - $count=0; - foreach ($labelsarray as $la) { - $lfieldorders =convertCSVRowToArray($labelsarray[0],',','"'); - $lfieldcontents=convertCSVRowToArray($la,',','"'); - if ($count==0) {$count++; continue;} - - // Combine into one array with keys and values since its easier to handle - $labelrowdata=array_combine($lfieldorders,$lfieldcontents); - $labellid=$labelrowdata['lid']; - if ($importversion<=132) - { - $labelrowdata["assessment_value"]=(int)$labelrowdata["code"]; - } - if ($labellid == $oldlid) { - $labelrowdata['lid']=$newlid; - - // translate internal links - $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']); - - $newvalues=array_values($labelrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lainsert = "INSERT INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $liresult=$connect->Execute($lainsert); - if ($liresult!==false) $results['labels']++; - } - } - } - - //CHECK FOR DUPLICATE LABELSETS - $thisset=""; - - $query2 = "SELECT code, title, sortorder, language, assessment_value - FROM {$dbprefix}labels - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
    $query2
    ".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - if (isset($csarray)) - { - foreach($csarray as $key=>$val) - { - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch) || ($_SESSION['USER_RIGHT_MANAGE_LABEL'] != 1)) - { - //There is a matching labelset or the user is not allowed to edit labels - - // So, we will delete this one and refer to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labels
    $query
    ".$connect->ErrorMsg()); - $results['labels']=$results['labels']-$connect->Affected_Rows(); - - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
    $query
    ".$connect->ErrorMsg()); - $results['labelsets']=$results['labelsets']-$connect->Affected_Rows(); - $newlid=$lsmatch; - } - else - { - //There isn't a matching labelset, add this checksum to the $csarray array - $csarray[$newlid]=$newcs; - } - //END CHECK FOR DUPLICATES - $aLIDReplacements[$oldlid]=$newlid; - } - } - - // Import groups - if (isset($grouparray) && $grouparray) - { - // do GROUPS - $gafieldorders=convertCSVRowToArray($grouparray[0],',','"'); - unset($grouparray[0]); - foreach ($grouparray as $ga) - { - $gacfieldcontents=convertCSVRowToArray($ga,',','"'); - $grouprowdata=array_combine($gafieldorders,$gacfieldcontents); - - //Now an additional integrity check if there are any groups not belonging into this survey - if ($grouprowdata['sid'] != $oldsid) - { - $results['fatalerror'] = $clang->gT("A group in the CSV/SQL file is not part of the same survey. The import of the survey was stopped.")."
    \n"; - return $results; - } - $grouprowdata['sid']=$newsid; - // remember group id - $oldgid=$grouprowdata['gid']; - - //update/remove the old group id - if (isset($aGIDReplacements[$oldgid])) - $grouprowdata['gid'] = $aGIDReplacements[$oldgid]; - else - unset($grouprowdata['gid']); - - // Everything set - now insert it - $grouprowdata=array_map('convertCsvreturn2return', $grouprowdata); - - // translate internal links - $grouprowdata['group_name']=translink('survey', $oldsid, $newsid, $grouprowdata['group_name']); - $grouprowdata['description']=translink('survey', $oldsid, $newsid, $grouprowdata['description']); - - if (isset($grouprowdata['gid'])) db_switchIDInsert('groups',true); - $tablename=$dbprefix.'groups'; - $ginsert = $connect->GetinsertSQL($tablename,$grouprowdata); - $gres = $connect->Execute($ginsert) or safe_die($clang->gT('Error').": Failed to insert group
    \n$ginsert
    \n".$connect->ErrorMsg()); - if (isset($grouprowdata['gid'])) db_switchIDInsert('groups',false); - //GET NEW GID - if (!isset($grouprowdata['gid'])) {$aGIDReplacements[$oldgid]=$connect->Insert_ID("{$dbprefix}groups","gid");} - } - // Fix sortorder of the groups - if users removed groups manually from the csv file there would be gaps - fixSortOrderGroups($newsid); - } - // GROUPS is DONE - - // Import questions - if (isset($questionarray) && $questionarray) - { - $qafieldorders=convertCSVRowToArray($questionarray[0],',','"'); - unset($questionarray[0]); - foreach ($questionarray as $qa) - { - $qacfieldcontents=convertCSVRowToArray($qa,',','"'); - $questionrowdata=array_combine($qafieldorders,$qacfieldcontents); - $questionrowdata=array_map('convertCsvreturn2return', $questionrowdata); - $questionrowdata["type"]=strtoupper($questionrowdata["type"]); - - // Skip not supported languages - if (!in_array($questionrowdata['language'],$aLanguagesSupported)) - continue; - - // replace the sid - $questionrowdata["sid"] = $newsid; - // Skip if gid is invalid - if (!isset($aGIDReplacements[$questionrowdata['gid']])) continue; - $questionrowdata["gid"] = $aGIDReplacements[$questionrowdata['gid']]; - if (isset($aQIDReplacements[$questionrowdata['qid']])) - { - $questionrowdata['qid']=$aQIDReplacements[$questionrowdata['qid']]; - } - else - { - $oldqid=$questionrowdata['qid']; - unset($questionrowdata['qid']); - } - - unset($oldlid1); unset($oldlid2); - if ((isset($questionrowdata['lid']) && $questionrowdata['lid']>0)) - { - $oldlid1=$questionrowdata['lid']; - } - if ((isset($questionrowdata['lid1']) && $questionrowdata['lid1']>0)) - { - $oldlid2=$questionrowdata['lid1']; - } - unset($questionrowdata['lid']); - unset($questionrowdata['lid1']); - if ($questionrowdata['type']=='W') - { - $questionrowdata['type']='!'; - } - elseif ($questionrowdata['type']=='Z') - { - $questionrowdata['type']='L'; - $aIgnoredAnswers[]=$oldqid; - } - - if (!isset($questionrowdata["question_order"]) || $questionrowdata["question_order"]=='') {$questionrowdata["question_order"]=0;} - // translate internal links - $questionrowdata['title']=translink('survey', $oldsid, $newsid, $questionrowdata['title']); - $questionrowdata['question']=translink('survey', $oldsid, $newsid, $questionrowdata['question']); - $questionrowdata['help']=translink('survey', $oldsid, $newsid, $questionrowdata['help']); - - - if (isset($questionrowdata['qid'])) { - db_switchIDInsert('questions',true); - } - - $tablename=$dbprefix.'questions'; - $qinsert = $connect->GetInsertSQL($tablename,$questionrowdata); - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert question
    \n$qinsert
    \n".$connect->ErrorMsg()); - - if (isset($questionrowdata['qid'])) { - db_switchIDInsert('questions',false); - $saveqid=$questionrowdata['qid']; - } - else - { - $aQIDReplacements[$oldqid]=$connect->Insert_ID("{$dbprefix}questions",'qid'); - $saveqid=$aQIDReplacements[$oldqid]; - } - - - // Now we will fix up old label sets where they are used as answers - if (((isset($oldlid1) && isset($aLIDReplacements[$oldlid1])) || (isset($oldlid2) && isset($aLIDReplacements[$oldlid2]))) && ($qtypes[$questionrowdata['type']]['answerscales']>0 || $qtypes[$questionrowdata['type']]['subquestions']>1)) - { - $query="select * from ".db_table_name('labels')." where lid={$aLIDReplacements[$oldlid1]} and language='{$questionrowdata['language']}'"; - $oldlabelsresult=db_execute_assoc($query); - while($labelrow=$oldlabelsresult->FetchRow()) - { - if (in_array($labelrow['language'],$aLanguagesSupported)) - { - - if ($qtypes[$questionrowdata['type']]['subquestions']<2) - { - $qinsert = "insert INTO ".db_table_name('answers')." (qid,code,answer,sortorder,language,assessment_value) - VALUES ({$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",".db_quoteall($labelrow['assessment_value']).")"; - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert answer (lid1)
    \n$qinsert
    \n".$connect->ErrorMsg()); - } - else - { - if (isset($aSQIDReplacements[$labelrow['code'].'_'.$saveqid])){ - $fieldname='qid,'; - $data=$aSQIDReplacements[$labelrow['code'].'_'.$saveqid].','; - } - else{ - $fieldname='' ; - $data=''; - } - - $qinsert = "insert INTO ".db_table_name('questions')." ($fieldname parent_qid,title,question,question_order,language,scale_id,type, sid, gid) - VALUES ($data{$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",1,'{$questionrowdata['type']}',{$questionrowdata['sid']},{$questionrowdata['gid']})"; - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert question
    \n$qinsert
    \n".$connect->ErrorMsg()); - if ($fieldname=='') - { - $aSQIDReplacements[$labelrow['code'].'_'.$saveqid]=$connect->Insert_ID("{$dbprefix}questions","qid"); - } - } - } - } - if (isset($oldlid2) && $qtypes[$questionrowdata['type']]['answerscales']>1) - { - $query="select * from ".db_table_name('labels')." where lid={$aLIDReplacements[$oldlid2]} and language='{$questionrowdata['language']}'"; - $oldlabelsresult=db_execute_assoc($query); - while($labelrow=$oldlabelsresult->FetchRow()) - { - $qinsert = "insert INTO ".db_table_name('answers')." (qid,code,answer,sortorder,language,assessment_value,scale_id) - VALUES ({$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",".db_quoteall($labelrow['assessment_value']).",1)"; - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert answer (lid2)
    \n$qinsert
    \n".$connect->ErrorMsg()); - } - } - } - } - } - - //Do answers - if (isset($answerarray) && $answerarray) - { - $answerfieldnames = convertCSVRowToArray($answerarray[0],',','"'); - unset($answerarray[0]); - foreach ($answerarray as $aa) - { - $answerfieldcontents = convertCSVRowToArray($aa,',','"'); - $answerrowdata = array_combine($answerfieldnames,$answerfieldcontents); - if (in_array($answerrowdata['qid'],$aIgnoredAnswers)) - { - // Due to a bug in previous LS versions there may be orphaned answers with question type Z (which is now L) - // this way they are ignored - continue; - } - if ($answerrowdata===false) - { - $importquestion.='
    '.$clang->gT("Faulty line in import - fields and data don't match").":".implode(',',$answerfieldcontents); - } - // Skip not supported languages - if (!in_array($answerrowdata['language'],$aLanguagesSupported)) - continue; - - // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this answer is orphan -> error, skip this record) - if (isset($aQIDReplacements[$answerrowdata["qid"]])) - $answerrowdata["qid"] = $aQIDReplacements[$answerrowdata["qid"]]; - else - continue; // a problem with this answer record -> don't consider - - if ($importversion<=132) - { - $answerrowdata["assessment_value"]=(int)$answerrowdata["code"]; - } - // Convert default values for single select questions - $questiontemp=$connect->GetRow('select type,gid from '.db_table_name('questions').' where qid='.$answerrowdata["qid"]); - $oldquestion['newtype']=$questiontemp['type']; - $oldquestion['gid']=$questiontemp['gid']; - if ($answerrowdata['default_value']=='Y' && ($oldquestion['newtype']=='L' || $oldquestion['newtype']=='O' || $oldquestion['newtype']=='!')) - { - $insertdata=array(); - $insertdata['qid']=$newqid; - $insertdata['language']=$answerrowdata['language']; - $insertdata['defaultvalue']=$answerrowdata['answer']; - $query=$connect->GetInsertSQL($dbprefix.'defaultvalues',$insertdata); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert defaultvalue
    {$query}
    \n".$connect->ErrorMsg()); - - } - // translate internal links - $answerrowdata['answer']=translink('survey', $oldsid, $newsid, $answerrowdata['answer']); - // Everything set - now insert it - $answerrowdata = array_map('convertCsvreturn2return', $answerrowdata); - - if ($qtypes[$oldquestion['newtype']]['subquestions']>0) //hmmm.. this is really a subquestion - { - $questionrowdata=array(); - if (isset($aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']])){ - $questionrowdata['qid']=$aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']]; - } - $questionrowdata['parent_qid']=$answerrowdata['qid'];; - $questionrowdata['sid']=$newsid; - $questionrowdata['gid']=$oldquestion['gid']; - $questionrowdata['title']=$answerrowdata['code']; - $questionrowdata['question']=$answerrowdata['answer']; - $questionrowdata['question_order']=$answerrowdata['sortorder']; - $questionrowdata['language']=$answerrowdata['language']; - $questionrowdata['type']=$oldquestion['newtype']; - - $tablename=$dbprefix.'questions'; - $query=$connect->GetInsertSQL($tablename,$questionrowdata); - if (isset($questionrowdata['qid'])) db_switchIDInsert('questions',true); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert subquestion
    {$query}
    ".$connect->ErrorMsg()); - if (!isset($questionrowdata['qid'])) - { - $aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']]=$connect->Insert_ID("{$dbprefix}questions","qid"); - } - else - { - db_switchIDInsert('questions',false); - } - $results['subquestions']++; - // also convert default values subquestions for multiple choice - if ($answerrowdata['default_value']=='Y' && ($oldquestion['newtype']=='M' || $oldquestion['newtype']=='P')) - { - $insertdata=array(); - $insertdata['qid']=$newqid; - $insertdata['sqid']=$aSQIDReplacements[$answerrowdata['code']]; - $insertdata['language']=$answerrowdata['language']; - $insertdata['defaultvalue']='Y'; - $tablename=$dbprefix.'defaultvalues'; - $query=$connect->GetInsertSQL($tablename,$insertdata); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert defaultvalue
    {$query}
    \n".$connect->ErrorMsg()); - } - - } - else // insert answers - { - unset($answerrowdata['default_value']); - $tablename=$dbprefix.'answers'; - $query=$connect->GetInsertSQL($tablename,$answerrowdata); - $ares = $connect->Execute($query) or safe_die ("Error: Failed to insert answer
    {$query}
    \n".$connect->ErrorMsg()); - $results['answers']++; - } - - } - } - - // get all group ids and fix questions inside each group - $gquery = "SELECT gid FROM {$dbprefix}groups where sid=$newsid group by gid ORDER BY gid"; //Get last question added (finds new qid) - $gres = db_execute_assoc($gquery); - while ($grow = $gres->FetchRow()) - { - fixsortorderQuestions($grow['gid'], $newsid); - } - - //We've built two arrays along the way - one containing the old SID, GID and QIDs - and their NEW equivalents - //and one containing the old 'extended fieldname' and its new equivalent. These are needed to import conditions and question_attributes. - if (isset($question_attributesarray) && $question_attributesarray) {//ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES - $fieldorders =convertCSVRowToArray($question_attributesarray[0],',','"'); - unset($question_attributesarray[0]); - foreach ($question_attributesarray as $qar) { - $fieldcontents=convertCSVRowToArray($qar,',','"'); - $qarowdata=array_combine($fieldorders,$fieldcontents); - $newqid=""; - $qarowdata["qid"]=$aQIDReplacements[$qarowdata["qid"]]; - unset($qarowdata["qaid"]); - - $newvalues=array_values($qarowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $qainsert = "insert INTO {$dbprefix}question_attributes (".implode(',',array_keys($qarowdata)).") VALUES (".implode(',',$newvalues).")"; - $result=$connect->Execute($qainsert); // no safe_die since some LimeSurvey version export duplicate question attributes - these are just ignored - if ($connect->Affected_Rows()>0) {$importresults['question_attributes']++;} - } - } - - if (isset($assessmentsarray) && $assessmentsarray) {//ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUTES - $fieldorders=convertCSVRowToArray($assessmentsarray[0],',','"'); - unset($assessmentsarray[0]); - foreach ($assessmentsarray as $qar) - { - $fieldcontents=convertCSVRowToArray($qar,',','"'); - $asrowdata=array_combine($fieldorders,$fieldcontents); - if (isset($asrowdata['link'])) - { - if (trim($asrowdata['link'])!='') $asrowdata['message']=$asrowdata['message'].'
    '.$asrowdata['link'].''; - unset($asrowdata['link']); - } - if ($asrowdata["gid"]>0) - { - $asrowdata["gid"]=$aGIDReplacements[$asrowdata["gid"]]; - } - - $asrowdata["sid"]=$newsid; - unset($asrowdata["id"]); - - $tablename=$dbprefix.'assessments'; - $asinsert = $connect->GetInsertSQL($tablename,$asrowdata); - $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert assessment
    $asinsert
    ".$connect->ErrorMsg()); - - unset($newgid); - } - } - - if (isset($quotaarray) && $quotaarray) {//ONLY DO THIS IF THERE ARE QUOTAS - $fieldorders=convertCSVRowToArray($quotaarray[0],',','"'); - unset($quotaarray[0]); - foreach ($quotaarray as $qar) - { - $fieldcontents=convertCSVRowToArray($qar,',','"'); - - $asrowdata=array_combine($fieldorders,$fieldcontents); - - $oldsid=$asrowdata["sid"]; - foreach ($substitutions as $subs) { - if ($oldsid==$subs[0]) {$newsid=$subs[3];} - } - - $asrowdata["sid"]=$newsid; - $oldid = $asrowdata["id"]; - unset($asrowdata["id"]); - $quotadata[]=$asrowdata; //For use later if needed - $tablename=$dbprefix.'quota'; - $asinsert = $connect->getInsertSQL($tablename,$asrowdata); - $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert quota
    $asinsert
    ".$connect->ErrorMsg()); - $aQuotaReplacements[$oldid] = $connect->Insert_ID(db_table_name_nq('quota'),"id"); - } - } - - if (isset($quotamembersarray) && $quotamembersarray) {//ONLY DO THIS IF THERE ARE QUOTA MEMBERS - $count=0; - foreach ($quotamembersarray as $qar) { - - $fieldorders =convertCSVRowToArray($quotamembersarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($qar,',','"'); - if ($count==0) {$count++; continue;} - - $asrowdata=array_combine($fieldorders,$fieldcontents); - - $oldsid=$asrowdata["sid"]; - $newqid=""; - $newquotaid=""; - $oldqid=$asrowdata['qid']; - $oldquotaid=$asrowdata['quota_id']; - - foreach ($substitutions as $subs) { - if ($oldsid==$subs[0]) {$newsid=$subs[3];} - if ($oldqid==$subs[2]) {$newqid=$subs[5];} - } - - $newquotaid=$aQuotaReplacements[$oldquotaid]; - - $asrowdata["sid"]=$newsid; - $asrowdata["qid"]=$newqid; - $asrowdata["quota_id"]=$newquotaid; - unset($asrowdata["id"]); - - $tablename=$dbprefix.'quota_members'; - $asinsert = $connect->getInsertSQL($tablename,$asrowdata); - - $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert quota
    $asinsert
    ".$connect->ErrorMsg()); - - } - } - - if (isset($quotalsarray) && $quotalsarray) {//ONLY DO THIS IF THERE ARE QUOTA LANGUAGE SETTINGS - $count=0; - foreach ($quotalsarray as $qar) { - - $fieldorders =convertCSVRowToArray($quotalsarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($qar,',','"'); - if ($count==0) {$count++; continue;} - - $asrowdata=array_combine($fieldorders,$fieldcontents); - - $newquotaid=""; - $oldquotaid=$asrowdata['quotals_quota_id']; - - $newquotaid=$aQuotaReplacements[$oldquotaid]; - - $asrowdata["quotals_quota_id"]=$newquotaid; - unset($asrowdata["quotals_id"]); - - $tablename=$dbprefix.'quota_languagesettings'; - $asinsert = $connect->getInsertSQL($tablename,$asrowdata); - $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert quota
    $asinsert
    ".$connect->ErrorMsg()); - } - } - - //if there are quotas, but no quotals, then we need to create default dummy for each quota (this handles exports from pre-language quota surveys) - if ($importresults['quota'] > 0 && (!isset($importresults['quotals']) || $importresults['quotals'] == 0)) { - $i=0; - $defaultsurveylanguage=isset($defaultsurveylanguage) ? $defaultsurveylanguage : "en"; - foreach($aQuotaReplacements as $oldquotaid=>$newquotaid) { - $asrowdata=array("quotals_quota_id" => $newquotaid, - "quotals_language" => $defaultsurveylanguage, - "quotals_name" => $quotadata[$i]["name"], - "quotals_message" => $clang->gT("Sorry your responses have exceeded a quota on this survey."), - "quotals_url" => "", - "quotals_urldescrip" => ""); - $i++; - } - $tablename=$dbprefix.'quota_languagesettings'; - $asinsert = $connect->getInsertSQL($tablename,$asrowdata); - $result=$connect->Execute($asinsert) or safe_die ("Couldn't insert quota
    $asinsert
    ".$connect->ErrorMsg()); - $countquotals=$i; - } - - // Do conditions - if (isset($conditionsarray) && $conditionsarray) {//ONLY DO THIS IF THERE ARE CONDITIONS! - $fieldorders =convertCSVRowToArray($conditionsarray[0],',','"'); - unset($conditionsarray[0]); - // Exception for conditions based on attributes - $aQIDReplacements[0]=0; - foreach ($conditionsarray as $car) { - $fieldcontents=convertCSVRowToArray($car,',','"'); - $conditionrowdata=array_combine($fieldorders,$fieldcontents); - - unset($conditionrowdata["cid"]); - if (!isset($conditionrowdata["method"]) || trim($conditionrowdata["method"])=='') - { - $conditionrowdata["method"]='=='; - } - if (!isset($conditionrowdata["scenario"]) || trim($conditionrowdata["scenario"])=='') - { - $conditionrowdata["scenario"]=1; - } - $oldcqid=$conditionrowdata["cqid"]; - $oldgid=array_search($connect->GetOne('select gid from '.db_table_name('questions').' where qid='.$aQIDReplacements[$conditionrowdata["cqid"]]),$aGIDReplacements); - $conditionrowdata["qid"]=$aQIDReplacements[$conditionrowdata["qid"]]; - $conditionrowdata["cqid"]=$aQIDReplacements[$conditionrowdata["cqid"]]; - $oldcfieldname=$conditionrowdata["cfieldname"]; - $conditionrowdata["cfieldname"]=str_replace($oldsid.'X'.$oldgid.'X'.$oldcqid,$newsid.'X'.$aGIDReplacements[$oldgid].'X'.$conditionrowdata["cqid"],$conditionrowdata["cfieldname"]); - - $tablename=$dbprefix.'conditions'; - $conditioninsert = $connect->getInsertSQL($tablename,$conditionrowdata); - $result=$connect->Execute($conditioninsert) or safe_die ("Couldn't insert condition
    $conditioninsert
    ".$connect->ErrorMsg()); - - } - } - LimeExpressionManager::RevertUpgradeConditionsToRelevance($newsid); - LimeExpressionManager::UpgradeConditionsToRelevance($newsid); - - $importresults['importversion']=$importversion; - $importresults['newsid']=$newsid; - $importresults['oldsid']=$oldsid; - return $importresults; -} - - - -/** -* This function imports a LimeSurvey .lss survey XML file -* -* @param mixed $sFullFilepath The full filepath of the uploaded file -*/ -function XMLImportSurvey($sFullFilepath,$sXMLdata=NULL,$sNewSurveyName=NULL,$iDesiredSurveyId=NULL, $bTranslateInsertansTags=true) -{ - global $connect, $dbprefix, $clang, $timeadjust; - - $iDesiredSurveyId=intval($iDesiredSurveyId); - $results['error']=false; - if ($sXMLdata == NULL) - { - $xml = simplexml_load_file($sFullFilepath); - } else - { - $xml = simplexml_load_string($sXMLdata); - } - - if ($xml->LimeSurveyDocType!='Survey') - { - $results['error'] = $clang->gT("This is not a valid LimeSurvey survey structure XML file."); - return $results; - } - else - { - //$results['error'] = $clang->gT("This is VALID LimeSurvey survey structure XML file."); - //echo $clang->gT("This is VALID LimeSurvey survey structure XML file."); - //return $results; - } - $dbversion = (float) $xml->DBVersion; - $aQIDReplacements=array(); - $aQuotaReplacements=array(); - $results['defaultvalues']=0; - $results['answers']=0; - $results['surveys']=0; - $results['questions']=0; - $results['subquestions']=0; - $results['question_attributes']=0; - $results['groups']=0; - $results['assessments']=0; - $results['quota']=0; - $results['quotals']=0; - $results['quotamembers']=0; - $results['importwarnings']=array(); - - - $aLanguagesSupported=array(); - foreach ($xml->languages->language as $language) - { - $aLanguagesSupported[]=(string)$language; - } - $results['languages']=count($aLanguagesSupported); - - - // First get an overview of fieldnames - it's not useful for the moment but might be with newer versions - /* - $fieldnames=array(); - foreach ($xml->questions->fields->fieldname as $fieldname ) - { - $fieldnames[]=(string)$fieldname; - };*/ - - - // Import surveys table =================================================================================== - - $tablename=$dbprefix.'surveys'; - foreach ($xml->surveys->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $oldsid=$insertdata['sid']; - if($iDesiredSurveyId!=NULL) - { - $newsid=GetNewSurveyID($iDesiredSurveyId); - } - else - { - $newsid=GetNewSurveyID($oldsid); - } - if ($dbversion<=143) - { - $insertdata['anonymized']=$insertdata['private']; - unset($insertdata['private']); - unset($insertdata['notification']); - } - $insertdata['startdate']=NULL; - //Now insert the new SID and change some values - $insertdata['sid']=$newsid; - //Make sure it is not set active - $insertdata['active']='N'; - //Set current user to be the owner - $insertdata['owner_id']=$_SESSION['loginID']; - //Change creation date to import date - $insertdata['datecreated']=$connect->BindTimeStamp(date_shift(date("Y-m-d H:i:s"), "Y-m-d", $timeadjust)); - - db_switchIDInsert('surveys',true); - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['surveys']++; - db_switchIDInsert('surveys',false); - } - $results['newsid']=$newsid; - - // Import survey languagesettings table =================================================================================== - - $tablename=$dbprefix.'surveys_languagesettings'; - foreach ($xml->surveys_languagesettings->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['surveyls_survey_id']=$newsid; - if ($sNewSurveyName == NULL) - { - $insertdata['surveyls_title']=translink('survey', $oldsid, $newsid, $insertdata['surveyls_title']); - } else { - $insertdata['surveyls_title']=translink('survey', $oldsid, $newsid, $sNewSurveyName); - } - - $insertdata['surveyls_description']=translink('survey', $oldsid, $newsid, $insertdata['surveyls_description']); - $insertdata['surveyls_welcometext']=translink('survey', $oldsid, $newsid, $insertdata['surveyls_welcometext']); - $insertdata['surveyls_urldescription']=translink('survey', $oldsid, $newsid, $insertdata['surveyls_urldescription']); - $insertdata['surveyls_email_invite']=translink('survey', $oldsid, $newsid, $insertdata['surveyls_email_invite']); - $insertdata['surveyls_email_remind']=translink('survey', $oldsid, $newsid, $insertdata['surveyls_email_remind']); - $insertdata['surveyls_email_register']=translink('survey', $oldsid, $newsid, $insertdata['surveyls_email_register']); - $insertdata['surveyls_email_confirm']=translink('survey', $oldsid, $newsid, $insertdata['surveyls_email_confirm']); - - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - } - - - // Import groups table =================================================================================== - - $tablename=$dbprefix.'groups'; - foreach ($xml->groups->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $oldsid=$insertdata['sid']; - $insertdata['sid']=$newsid; - $oldgid=$insertdata['gid']; unset($insertdata['gid']); // save the old qid - - // now translate any links - $insertdata['group_name']=translink('survey', $oldsid, $newsid, $insertdata['group_name']); - $insertdata['description']=translink('survey', $oldsid, $newsid, $insertdata['description']); - // Insert the new group - if (isset($aGIDReplacements[$oldgid])) - { - db_switchIDInsert('groups',true); - $insertdata['gid']=$aGIDReplacements[$oldgid]; - } - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['groups']++; - - if (!isset($aGIDReplacements[$oldgid])) - { - $newgid=$connect->Insert_ID($tablename,"gid"); // save this for later - $aGIDReplacements[$oldgid]=$newgid; // add old and new qid to the mapping array - } - else - { - db_switchIDInsert('groups',false); - } - } - - - // Import questions table =================================================================================== - - // We have to run the question table data two times - first to find all main questions - // then for subquestions (because we need to determine the new qids for the main questions first) - if(isset($xml->questions)) // there could be surveys without a any questions - { - $tablename=$dbprefix.'questions'; - foreach ($xml->questions->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $oldsid=$insertdata['sid']; - $insertdata['sid']=$newsid; - $insertdata['gid']=$aGIDReplacements[$insertdata['gid']]; - $oldqid=$insertdata['qid']; unset($insertdata['qid']); // save the old qid - - // now translate any links - $insertdata['title']=translink('survey', $oldsid, $newsid, $insertdata['title']); - $insertdata['question']=translink('survey', $oldsid, $newsid, $insertdata['question']); - $insertdata['help']=translink('survey', $oldsid, $newsid, $insertdata['help']); - // Insert the new question - if (isset($aQIDReplacements[$oldqid])) - { - $insertdata['qid']=$aQIDReplacements[$oldqid]; - db_switchIDInsert('questions',true); - - } - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - if (!isset($aQIDReplacements[$oldqid])) - { - $newqid=$connect->Insert_ID($tablename,"qid"); // save this for later - $aQIDReplacements[$oldqid]=$newqid; // add old and new qid to the mapping array - $results['questions']++; - } - else - { - db_switchIDInsert('questions',false); - } - } - } - - // Import subquestions -------------------------------------------------------------- - if(isset($xml->subquestions)) - { - $tablename=$dbprefix.'questions'; - - foreach ($xml->subquestions->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['sid']=$newsid; - $insertdata['gid']=$aGIDReplacements[(int)$insertdata['gid']];; - $oldsqid=(int)$insertdata['qid']; unset($insertdata['qid']); // save the old qid - $insertdata['parent_qid']=$aQIDReplacements[(int)$insertdata['parent_qid']]; // remap the parent_qid - - // now translate any links - $insertdata['title']=translink('survey', $oldsid, $newsid, $insertdata['title']); - $insertdata['question']=translink('survey', $oldsid, $newsid, $insertdata['question']); - $insertdata['help']=translink('survey', $oldsid, $newsid, $insertdata['help']); - if (isset($aQIDReplacements[$oldsqid])){ - $insertdata['qid']=$aQIDReplacements[$oldsqid]; - db_switchIDInsert('questions',true); - } - - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $newsqid=$connect->Insert_ID($tablename,"qid"); // save this for later - if (!isset($insertdata['qid'])) - { - $aQIDReplacements[$oldsqid]=$newsqid; // add old and new qid to the mapping array - } - else - { - db_switchIDInsert('questions',false); - } - $results['subquestions']++; - } - } - - // Import answers -------------------------------------------------------------- - if(isset($xml->answers)) - { - $tablename=$dbprefix.'answers'; - - foreach ($xml->answers->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['qid']=$aQIDReplacements[(int)$insertdata['qid']]; // remap the parent_qid - - // now translate any links - $insertdata['answer']=translink('survey', $oldsid, $newsid, $insertdata['answer']); - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['answers']++; - } - } - - // Import questionattributes -------------------------------------------------------------- - if(isset($xml->question_attributes)) - { - $tablename=$dbprefix.'question_attributes'; - - foreach ($xml->question_attributes->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - unset($insertdata['qaid']); - $insertdata['qid']=$aQIDReplacements[(integer)$insertdata['qid']]; // remap the parent_qid - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['question_attributes']++; - } - } - - - // Import defaultvalues -------------------------------------------------------------- - if(isset($xml->defaultvalues)) - { - $tablename=$dbprefix.'defaultvalues'; - - $results['defaultvalues']=0; - foreach ($xml->defaultvalues->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['qid']=$aQIDReplacements[(int)$insertdata['qid']]; // remap the qid - if (isset($aQIDReplacements[(int)$insertdata['sqid']])) $insertdata['sqid']=$aQIDReplacements[(int)$insertdata['sqid']]; // remap the subquestion id - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['defaultvalues']++; - } - } - - $aOldNewFieldmap=aReverseTranslateFieldnames($oldsid,$newsid,$aGIDReplacements,$aQIDReplacements); - // Import conditions -------------------------------------------------------------- - if(isset($xml->conditions)) - { - $tablename=$dbprefix.'conditions'; - - $results['conditions']=0; - foreach ($xml->conditions->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record) - if (isset($aQIDReplacements[$insertdata['qid']])) - { - $insertdata['qid']=$aQIDReplacements[$insertdata['qid']]; // remap the qid - } - else continue; // a problem with this answer record -> don't consider - if ($insertdata['cqid'] != 0) - { - if (isset($aQIDReplacements[$insertdata['cqid']])) - { - $oldcqid = $insertdata['cqid']; //Save for cfield transformation - $insertdata['cqid']=$aQIDReplacements[$insertdata['cqid']]; // remap the qid - } - else continue; // a problem with this answer record -> don't consider - - list($oldcsid, $oldcgid, $oldqidanscode) = explode("X",$insertdata["cfieldname"],3); - // replace the gid for the new one in the cfieldname(if there is no new gid in the $aGIDReplacements array it means that this condition is orphan -> error, skip this record) - if (!isset($aGIDReplacements[$oldcgid])) - continue; - } - - unset($insertdata["cid"]); - - // recreate the cfieldname with the new IDs - if ($insertdata['cqid'] != 0) - { - if (preg_match("/^\+/",$oldcsid)) - { - $newcfieldname = '+'.$newsid . "X" . $aGIDReplacements[$oldcgid] . "X" . $insertdata["cqid"] .substr($oldqidanscode,strlen($oldcqid)); - } - else - { - $newcfieldname = $newsid . "X" . $aGIDReplacements[$oldcgid] . "X" . $insertdata["cqid"] .substr($oldqidanscode,strlen($oldcqid)); - } - } - else - { // The cfieldname is a not a previous question cfield but a {XXXX} replacement field - $newcfieldname = $insertdata["cfieldname"]; - } - $insertdata["cfieldname"] = $newcfieldname; - if (trim($insertdata["method"])=='') - { - $insertdata["method"]='=='; - } - - // Now process the value and replace @sgqa@ codes TIBO - if (preg_match("/^@(.*)@$/",$insertdata["value"],$cfieldnameInCondValue)) - { - if (isset($aOldNewFieldmap[$cfieldnameInCondValue[1]])) - { - $newvalue = '@'.$aOldNewFieldmap[$cfieldnameInCondValue[1]].'@'; - $insertdata["value"] = $newvalue; - } - - } - - - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['conditions']++; - } - } - - // Import assessments -------------------------------------------------------------- - if(isset($xml->assessments)) - { - $tablename=$dbprefix.'assessments'; - - foreach ($xml->assessments->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - if ($insertdata['gid']>0) - { - $insertdata['gid']=$aGIDReplacements[(int)$insertdata['gid']]; // remap the qid - } - - $insertdata['sid']=$newsid; // remap the survey id - unset($insertdata['id']); - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['assessments']++; - } - } - - // Import quota -------------------------------------------------------------- - if(isset($xml->quota)) - { - $tablename=$dbprefix.'quota'; - - foreach ($xml->quota->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['sid']=$newsid; // remap the survey id - $oldid=$insertdata['id']; - unset($insertdata['id']); - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $aQuotaReplacements[$oldid] = $connect->Insert_ID(db_table_name_nq('quota'),"id"); - $results['quota']++; - } - } - - // Import quota_members -------------------------------------------------------------- - if(isset($xml->quota_members)) - { - $tablename=$dbprefix.'quota_members'; - - foreach ($xml->quota_members->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['sid']=$newsid; // remap the survey id - $insertdata['qid']=$aQIDReplacements[(int)$insertdata['qid']]; // remap the qid - $insertdata['quota_id']=$aQuotaReplacements[(int)$insertdata['quota_id']]; // remap the qid - unset($insertdata['id']); - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['quotamembers']++; - } - } - - // Import quota_languagesettings -------------------------------------------------------------- - if(isset($xml->quota_languagesettings)) - { - $tablename=$dbprefix.'quota_languagesettings'; - - foreach ($xml->quota_languagesettings->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['quotals_quota_id']=$aQuotaReplacements[(int)$insertdata['quotals_quota_id']]; // remap the qid - unset($insertdata['quotals_id']); - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['quotals']++; - } - } - - // Set survey rights - GiveAllSurveyPermissions($_SESSION['loginID'],$newsid); - if ($bTranslateInsertansTags) - { - TranslateInsertansTags($newsid,$oldsid,$aOldNewFieldmap); - } - - LimeExpressionManager::RevertUpgradeConditionsToRelevance($newsid); - LimeExpressionManager::UpgradeConditionsToRelevance($newsid); - LimeExpressionManager::SetSurveyId($newsid); - - return $results; -} - -/** -* This function returns a new random sid if the existing one is taken, -* otherwise it returns the old one. -* -* @param mixed $oldsid -*/ -function GetNewSurveyID($oldsid) -{ - global $connect, $dbprefix; - $isresult = $connect->GetOne("SELECT sid FROM {$dbprefix}surveys WHERE sid=$oldsid"); - if (!is_null($isresult)) - { - // Get new random ids until one is found that is not used - do - { - $newsid = sRandomChars(5,'123456789'); - $isresult = $connect->GetOne("SELECT sid FROM {$dbprefix}surveys WHERE sid=$newsid"); - } - while (!is_null($isresult)); - return $newsid; - } - else - { - return $oldsid; - } -} diff --git a/include/limesurvey/admin/import_resources_zip.php b/include/limesurvey/admin/import_resources_zip.php deleted file mode 100644 index 6ec41d7a..00000000 --- a/include/limesurvey/admin/import_resources_zip.php +++ /dev/null @@ -1,618 +0,0 @@ -".$clang->gT("Import survey resources")."\n"; - $importsurveyresourcesoutput .= "
    "; - - if ($demoModeOnly === true) - { - $importsurveyresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importsurveyresourcesoutput .= $clang->gT("Demo Mode Only: Uploading file is disabled in this system.")."

    \n"; - $importsurveyresourcesoutput .= "\n"; - $importsurveyresourcesoutput .= "
    \n"; - return; - } - - require("classes/phpzip/phpzip.inc.php"); - $zipfile=$_FILES['the_file']['tmp_name']; - $z = new PHPZip(); - - // Create temporary directory - // If dangerous content is unzipped - // then no one will know the path - $extractdir=tempdir($tempdir); - $basedestdir = $uploaddir."/surveys"; - $destdir=$basedestdir."/$surveyid/"; - - if (!is_writeable($basedestdir)) - { - $importsurveyresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importsurveyresourcesoutput .= sprintf ($clang->gT("Incorrect permissions in your %s folder."),$basedestdir)."

    \n"; - $importsurveyresourcesoutput .= "\n"; - $importsurveyresourcesoutput .= "\n"; - return; - } - - if (!is_dir($destdir)) - { - mkdir($destdir); - } - - $aImportedFilesInfo=null; - $aErrorFilesInfo=null; - - - if (is_file($zipfile)) - { - $importsurveyresourcesoutput .= "
    ".$clang->gT("Success")."

    \n"; - $importsurveyresourcesoutput .= $clang->gT("File upload succeeded.")."

    \n"; - $importsurveyresourcesoutput .= $clang->gT("Reading file..")."

    \n"; - - if ($z->extract($extractdir,$zipfile) != 'OK') - { - $importsurveyresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importsurveyresourcesoutput .= $clang->gT("This file is not a valid ZIP file archive. Import failed.")."

    \n"; - $importsurveyresourcesoutput .= "\n"; - $importsurveyresourcesoutput .= "\n"; - return; - } - - // now read tempdir and copy authorized files only - $dh = opendir($extractdir); - while($direntry = readdir($dh)) - { - if (($direntry!=".")&&($direntry!="..")) - { - if (is_file($extractdir."/".$direntry)) - { // is a file - $extfile = substr(strrchr($direntry, '.'),1); - if (!(stripos(','.$allowedresourcesuploads.',',','.$extfile.',') === false)) - { //Extension allowed - if (!copy($extractdir."/".$direntry, $destdir.$direntry)) - { - $aErrorFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("Copy failed") - ); - unlink($extractdir."/".$direntry); - - } - else - { - $aImportedFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("OK") - ); - unlink($extractdir."/".$direntry); - } - } - - else - { // Extension forbidden - $aErrorFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("Error")." (".$clang->gT("Forbidden Extension").")" - ); - unlink($extractdir."/".$direntry); - } - } // end if is_file - } // end if ! . or .. - } // end while read dir - - - //Delete the temporary file - unlink($zipfile); - //Delete temporary folder - rmdir($extractdir); - - // display summary - $okfiles = 0; - $errfiles= 0; - $ErrorListHeader = ""; - $ImportListHeader = ""; - if (is_null($aErrorFilesInfo) && !is_null($aImportedFilesInfo)) - { - $status=$clang->gT("Success"); - $statusClass='successheader'; - $okfiles = count($aImportedFilesInfo); - $ImportListHeader .= "
    ".$clang->gT("Imported Files List").":
    \n"; - } - elseif (is_null($aErrorFilesInfo) && is_null($aImportedFilesInfo)) - { - $importsurveyresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importsurveyresourcesoutput .= $clang->gT("This ZIP archive contains no valid Resources files. Import failed.")."

    \n"; - $importsurveyresourcesoutput .= $clang->gT("Remember that we do not support subdirectories in ZIP archives.")."

    \n"; - $importsurveyresourcesoutput .= "\n"; - $importsurveyresourcesoutput .= "\n"; - return; - - } - elseif (!is_null($aErrorFilesInfo) && !is_null($aImportedFilesInfo)) - { - $status=$clang->gT("Partial"); - $statusClass='partialheader'; - $okfiles = count($aImportedFilesInfo); - $errfiles = count($aErrorFilesInfo); - $ErrorListHeader .= "
    ".$clang->gT("Error Files List").":
    \n"; - $ImportListHeader .= "
    ".$clang->gT("Imported Files List").":
    \n"; - } - else - { - $status=$clang->gT("Error"); - $statusClass='warningheader'; - $errfiles = count($aErrorFilesInfo); - $ErrorListHeader .= "
    ".$clang->gT("Error Files List").":
    \n"; - } - - $importsurveyresourcesoutput .= "".$clang->gT("Imported Resources for")." SID: $surveyid

    \n"; - $importsurveyresourcesoutput .= "
    ".$status."

    \n"; - $importsurveyresourcesoutput .= "".$clang->gT("Resources Import Summary")."
    \n"; - $importsurveyresourcesoutput .= "".$clang->gT("Total Imported files").": $okfiles
    \n"; - $importsurveyresourcesoutput .= "".$clang->gT("Total Errors").": $errfiles
    \n"; - $importsurveyresourcesoutput .= $ImportListHeader; - foreach ($aImportedFilesInfo as $entry) - { - $importsurveyresourcesoutput .= "\t
  • ".$clang->gT("File").": ".$entry["filename"]."
  • \n"; - } - if (!is_null($aImportedFilesInfo)) - { - $importsurveyresourcesoutput .= "\t
    \n"; - } - $importsurveyresourcesoutput .= $ErrorListHeader; - foreach ($aErrorFilesInfo as $entry) - { - $importsurveyresourcesoutput .= "\t
  • ".$clang->gT("File").": ".$entry['filename']." (".$entry['status'].")
  • \n"; - } - if (!is_null($aErrorFilesInfo)) - { - $importsurveyresourcesoutput .= "\t
    \n"; - } - } - else - { - $importsurveyresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importsurveyresourcesoutput .= sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$basedestdir)."

    \n"; - $importsurveyresourcesoutput .= "\n"; - $importsurveyresourcesoutput .= "\n"; - return; - } - $importsurveyresourcesoutput .= "\n"; - $importsurveyresourcesoutput .= "\n"; -} - - - -if ($action == "importlabelresources" && $lid) -{ - $importlabelresourcesoutput = "
    ".$clang->gT("Import Label Set")."
    \n"; - $importlabelresourcesoutput .= "
    "; - - if ($demoModeOnly === true) - { - $importlabelresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importlabelresourcesoutput .= sprintf ($clang->gT("Demo mode only: Uploading files is disabled in this system."),$basedestdir)."

    \n"; - $importlabelresourcesoutput .= "\n"; - $importlabelresourcesoutput .= "
    \n"; - return; - } - - require("classes/phpzip/phpzip.inc.php"); - //$the_full_file_path = $tempdir . "/" . $_FILES['the_file']['name']; - $zipfile=$_FILES['the_file']['tmp_name']; - $z = new PHPZip(); - // Create temporary directory - // If dangerous content is unzipped - // then no one will know the path - $extractdir=tempdir($tempdir); - $basedestdir = $publicdir."/upload/labels"; - $destdir=$basedestdir."/$lid/"; - - if (!is_writeable($basedestdir)) - { - $importlabelresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importlabelresourcesoutput .= sprintf ($clang->gT("Incorrect permissions in your %s folder."),$basedestdir)."

    \n"; - $importlabelresourcesoutput .= "\n"; - $importlabelresourcesoutput .= "\n"; - return; - } - - if (!is_dir($destdir)) - { - mkdir($destdir); - } - - $aImportedFilesInfo=null; - $aErrorFilesInfo=null; - - - if (is_file($zipfile)) - { - $importlabelresourcesoutput .= "
    ".$clang->gT("Success")."

    \n"; - $importlabelresourcesoutput .= $clang->gT("File upload succeeded.")."

    \n"; - $importlabelresourcesoutput .= $clang->gT("Reading file..")."

    \n"; - - if ($z->extract($extractdir,$zipfile) != 'OK') - { - $importlabelresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importlabelresourcesoutput .= $clang->gT("This file is not a valid ZIP file archive. Import failed.")."

    \n"; - $importlabelresourcesoutput .= "\n"; - $importlabelresourcesoutput .= "\n"; - return; - } - - // now read tempdir and copy authorized files only - $dh = opendir($extractdir); - while($direntry = readdir($dh)) - { - if (($direntry!=".")&&($direntry!="..")) - { - if (is_file($extractdir."/".$direntry)) - { // is a file - $extfile = substr(strrchr($direntry, '.'),1); - if (!(stripos(','.$allowedresourcesuploads.',',','.$extfile.',') === false)) - { //Extension allowed - if (!copy($extractdir."/".$direntry, $destdir.$direntry)) - { - $aErrorFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("Copy failed") - ); - unlink($extractdir."/".$direntry); - - } - else - { - $aImportedFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("OK") - ); - unlink($extractdir."/".$direntry); - } - } - - else - { // Extension forbidden - $aErrorFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("Error")." (".$clang->gT("Forbidden Extension").")" - ); - unlink($extractdir."/".$direntry); - } - } // end if is_file - } // end if ! . or .. - } // end while read dir - - - //Delete the temporary file - unlink($zipfile); - //Delete temporary folder - rmdir($extractdir); - - // display summary - $okfiles = 0; - $errfiles= 0; - $ErrorListHeader .= ""; - $ImportListHeader .= ""; - if (is_null($aErrorFilesInfo) && !is_null($aImportedFilesInfo)) - { - $status=$clang->gT("Success"); - $statusClass='successheader'; - $okfiles = count($aImportedFilesInfo); - $ImportListHeader .= "
    ".$clang->gT("Imported Files List").":
    \n"; - } - elseif (is_null($aErrorFilesInfo) && is_null($aImportedFilesInfo)) - { - $importlabelresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importlabelresourcesoutput .= $clang->gT("This ZIP archive contains no valid Resources files. Import failed.")."

    \n"; - $importlabelresourcesoutput .= $clang->gT("Remember that we do not support subdirectories in ZIP archives.")."

    \n"; - $importlabelresourcesoutput .= "\n"; - $importlabelresourcesoutput .= "\n"; - return; - } - elseif (!is_null($aErrorFilesInfo) && !is_null($aImportedFilesInfo)) - { - $status=$clang->gT("Partial"); - $statusClass='partialheader'; - $okfiles = count($aImportedFilesInfo); - $errfiles = count($aErrorFilesInfo); - $ErrorListHeader .= "
    ".$clang->gT("Error Files List").":
    \n"; - $ImportListHeader .= "
    ".$clang->gT("Imported Files List").":
    \n"; - } - else - { - $status=$clang->gT("Error"); - $statusClass='warningheader'; - $errfiles = count($aErrorFilesInfo); - $ErrorListHeader .= "
    ".$clang->gT("Error Files List").":
    \n"; - } - - $importlabelresourcesoutput .= "".$clang->gT("Imported Resources for")." LID: $lid

    \n"; - $importlabelresourcesoutput .= "
    ".$status."

    \n"; - $importlabelresourcesoutput .= "".$clang->gT("Resources Import Summary")."
    \n"; - $importlabelresourcesoutput .= "".$clang->gT("Total Imported files").": $okfiles
    \n"; - $importlabelresourcesoutput .= "".$clang->gT("Total Errors").": $errfiles
    \n"; - $importlabelresourcesoutput .= $ImportListHeader; - foreach ($aImportedFilesInfo as $entry) - { - $importlabelresourcesoutput .= "\t
  • ".$clang->gT("File").": ".$entry["filename"]."
  • \n"; - } - if (!is_null($aImportedFilesInfo)) - { - $importlabelresourcesoutput .= "\t
    \n"; - } - $importlabelresourcesoutput .= $ErrorListHeader; - foreach ($aErrorFilesInfo as $entry) - { - $importlabelresourcesoutput .= "\t
  • ".$clang->gT("File").": ".$entry['filename']." (".$entry['status'].")
  • \n"; - } - if (!is_null($aErrorFilesInfo)) - { - $importlabelresourcesoutput .= "\t
    \n"; - } - } - else - { - $importlabelresourcesoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importlabelresourcesoutput .= sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$basedestdir)."

    \n"; - $importlabelresourcesoutput .= "\n"; - $importlabelresourcesoutput .= "\n"; - return; - } - $importlabelresourcesoutput .= "\n"; - $importlabelresourcesoutput .= "\n"; -} - - - -if ($action == "templateupload") -{ - $importtemplateoutput = "
    ".$clang->gT("Import template")."
    \n"; - $importtemplateoutput .= "
    "; - - if ($demoModeOnly === true) - { - $importtemplateoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importtemplateoutput .= sprintf ($clang->gT("Demo mode: Uploading templates is disabled."),$basedestdir)."

    \n"; - $importtemplateoutput .= "
    gT("Template Editor")."\"/>\n"; - $importtemplateoutput .= "
    \n"; - return; - } - - require("classes/phpzip/phpzip.inc.php"); - //$the_full_file_path = $tempdir . "/" . $_FILES['the_file']['name']; - $zipfile=$_FILES['the_file']['tmp_name']; - $z = new PHPZip(); - // Create temporary directory - // If dangerous content is unzipped - // then no one will know the path - $extractdir=tempdir($tempdir); - $basedestdir = $usertemplaterootdir; - $newdir=str_replace('.','',strip_ext(sanitize_paranoid_string($_FILES['the_file']['name']))); - $destdir=$basedestdir.'/'.$newdir.'/'; - - if (!is_writeable($basedestdir)) - { - $importtemplateoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importtemplateoutput .= sprintf ($clang->gT("Incorrect permissions in your %s folder."),$basedestdir)."

    \n"; - $importtemplateoutput .= "
    gT("Template Editor")."\"/>\n"; - $importtemplateoutput .= "\n"; - return; - } - - if (!is_dir($destdir)) - { - mkdir($destdir); - } - else - { - $importtemplateoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importtemplateoutput .= sprintf ($clang->gT("Template '%s' does already exist."),$newdir)."

    \n"; - $importtemplateoutput .= "
    gT("Template Editor")."\"/>\n"; - $importtemplateoutput .= "\n"; - return; - } - - $aImportedFilesInfo=array(); - $aErrorFilesInfo=array(); - - - if (is_file($zipfile)) - { - $importtemplateoutput .= "
    ".$clang->gT("Success")."

    \n"; - $importtemplateoutput .= $clang->gT("File upload succeeded.")."

    \n"; - $importtemplateoutput .= $clang->gT("Reading file..")."

    \n"; - - if ($z->extract($extractdir,$zipfile) != 'OK') - { - $importtemplateoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importtemplateoutput .= $clang->gT("This file is not a valid ZIP file archive. Import failed.")."

    \n"; - $importtemplateoutput .= "
    gT("Template Editor")."\"/>\n"; - $importtemplateoutput .= "\n"; - return; - } - - $ErrorListHeader = ""; - $ImportListHeader = ""; - - // now read tempdir and copy authorized files only - $dh = opendir($extractdir); - while($direntry = readdir($dh)) - { - if (($direntry!=".")&&($direntry!="..")) - { - if (is_file($extractdir."/".$direntry)) - { // is a file - $extfile = substr(strrchr($direntry, '.'),1); - if (!(stripos(','.$allowedresourcesuploads.',',','.$extfile.',') === false)) - { //Extension allowed - if (!copy($extractdir."/".$direntry, $destdir.$direntry)) - { - $aErrorFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("Copy failed") - ); - unlink($extractdir."/".$direntry); - - } - else - { - $aImportedFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("OK") - ); - unlink($extractdir."/".$direntry); - } - } - - else - { // Extension forbidden - $aErrorFilesInfo[]=Array( - "filename" => $direntry, - "status" => $clang->gT("Error")." (".$clang->gT("Forbidden Extension").")" - ); - unlink($extractdir."/".$direntry); - } - } // end if is_file - } // end if ! . or .. - } // end while read dir - - - //Delete the temporary file - unlink($zipfile); - closedir($dh); - //Delete temporary folder - rmdir($extractdir); - - // display summary - $okfiles = 0; - $errfiles= 0; - if (count($aErrorFilesInfo)==0 && count($aImportedFilesInfo)>0) - { - $status=$clang->gT("Success"); - $statusClass='successheader'; - $okfiles = count($aImportedFilesInfo); - $ImportListHeader .= "
    ".$clang->gT("Imported Files List").":
    \n"; - } - elseif (count($aErrorFilesInfo)==0 && count($aImportedFilesInfo)==0) - { - $importtemplateoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importtemplateoutput .= $clang->gT("This ZIP archive contains no valid template files. Import failed.")."

    \n"; - $importtemplateoutput .= $clang->gT("Remember that we do not support subdirectories in ZIP archives.")."

    \n"; - $importtemplateoutput .= "
    gT("Template Editor")."\"/>\n"; - $importtemplateoutput .= "\n"; - return; - - } - elseif (count($aErrorFilesInfo)>0 && count($aImportedFilesInfo)>0) - { - $status=$clang->gT("Partial"); - $statusClass='partialheader'; - $okfiles = count($aImportedFilesInfo); - $errfiles = count($aErrorFilesInfo); - $ErrorListHeader .= "
    ".$clang->gT("Error Files List").":
    \n"; - $ImportListHeader .= "
    ".$clang->gT("Imported Files List").":
    \n"; - } - else - { - $status=$clang->gT("Error"); - $statusClass='warningheader'; - $errfiles = count($aErrorFilesInfo); - $ErrorListHeader .= "
    ".$clang->gT("Error Files List").":
    \n"; - } - - $importtemplateoutput .= "".$clang->gT("Imported template files for")." $lid

    \n"; - $importtemplateoutput .= "
    ".$status."

    \n"; - $importtemplateoutput .= "".$clang->gT("Resources Import Summary")."
    \n"; - $importtemplateoutput .= "".$clang->gT("Total Imported files").": $okfiles
    \n"; - $importtemplateoutput .= "".$clang->gT("Total Errors").": $errfiles
    \n"; - $importtemplateoutput .= $ImportListHeader; - foreach ($aImportedFilesInfo as $entry) - { - $importtemplateoutput .= "\t
  • ".$clang->gT("File").": ".$entry["filename"]."
  • \n"; - } - if (!is_null($aImportedFilesInfo)) - { - $importtemplateoutput .= "\t
    \n"; - } - $importtemplateoutput .= $ErrorListHeader; - foreach ($aErrorFilesInfo as $entry) - { - $importtemplateoutput .= "\t
  • ".$clang->gT("File").": ".$entry['filename']." (".$entry['status'].")
  • \n"; - } - if (!is_null($aErrorFilesInfo)) - { - $importtemplateoutput .= "\t
    \n"; - } - } - else - { - $importtemplateoutput .= "
    ".$clang->gT("Error")."

    \n"; - $importtemplateoutput .= sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$basedestdir)."

    \n"; - $importtemplateoutput .= "
    gT("Template Editor")."\"/>\n"; - $importtemplateoutput .= "\n"; - return; - } - $importtemplateoutput .= "\n"; - $importtemplateoutput .= "\n"; -} - - -//--------------------- -// Comes from http://fr2.php.net/tempnam -function tempdir($dir, $prefix='', $mode=0700) -{ - if (substr($dir, -1) != '/') $dir .= '/'; - - do - { - $path = $dir.$prefix.mt_rand(0, 9999999); - } while (!mkdir($path, $mode)); - - return $path; -} - -/** - * Strips file extension - * - * @param string $name - * @return string - */ -function strip_ext($name) -{ - $ext = strrchr($name, '.'); - if($ext !== false) - { - $name = substr($name, 0, -strlen($ext)); - } - return $name; -} - -?> diff --git a/include/limesurvey/admin/importgroup.php b/include/limesurvey/admin/importgroup.php deleted file mode 100644 index 31d677b6..00000000 --- a/include/limesurvey/admin/importgroup.php +++ /dev/null @@ -1,1197 +0,0 @@ -".$clang->gT("Import question group")."\n"; -$importgroup .= "
    \n"; - -$sFullFilepath = $tempdir . DIRECTORY_SEPARATOR . $_FILES['the_file']['name']; -$aPathInfo = pathinfo($sFullFilepath); -$sExtension = $aPathInfo['extension']; - -if (!@move_uploaded_file($_FILES['the_file']['tmp_name'], $sFullFilepath)) -{ - $fatalerror = sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir); -} - -// validate that we have a SID -if (!returnglobal('sid')) -{ - $fatalerror .= $clang->gT("No SID (Survey) has been provided. Cannot import question."); -} -else -{ - $surveyid=returnglobal('sid'); -} - -if (isset($fatalerror)) -{ - $importgroup .= "
    ".$clang->gT("Error")."

    \n"; - $importgroup .= $fatalerror."

    \n"; - $importgroup .= "

    \n"; - $importgroup .= "
    \n"; - @unlink($sFullFilepath); - return; -} - -// IF WE GOT THIS FAR, THEN THE FILE HAS BEEN UPLOADED SUCCESFULLY -$importgroup .= "
    ".$clang->gT("Success")."
     
    \n" -.$clang->gT("File upload succeeded.")."

    \n" -.$clang->gT("Reading file..")."

    \n"; -if (strtolower($sExtension)=='csv') -{ - $aImportResults=CSVImportGroup($sFullFilepath, $surveyid); -} -elseif (strtolower($sExtension)=='lsg') -{ - $aImportResults=XMLImportGroup($sFullFilepath, $surveyid); -} -else die('Unknown file extension'); -FixLanguageConsistency($surveyid); - -if (isset($aImportResults['fatalerror'])) -{ - $importgroup .= "
    ".$clang->gT("Error")."

    \n"; - $importgroup .= $aImportResults['fatalerror']."

    \n"; - $importgroup .= "\n"; - $importgroup .= "\n"; - unlink($sFullFilepath); - return; -} - -$importgroup .= "
    ".$clang->gT("Success")."

    \n" -."".$clang->gT("Question group import summary")."
    \n" -."
      \n" -."\t
    • ".$clang->gT("Groups").": ".$aImportResults['groups']."
    • \n" -."\t
    • ".$clang->gT("Questions").": ".$aImportResults['questions']."
    • \n" -."\t
    • ".$clang->gT("Subquestions").": ".$aImportResults['subquestions']."
    • \n" -."\t
    • ".$clang->gT("Answers").": ".$aImportResults['answers']."
    • \n" -."\t
    • ".$clang->gT("Conditions").": ".$aImportResults['conditions']."
    • \n"; -if (strtolower($sExtension)=='csv') { - $importgroup.="\t
    • ".$clang->gT("Label sets").": ".$aImportResults['labelsets']." (".$aImportResults['labels'].")
    • \n"; -} -$importgroup.="\t
    • ".$clang->gT("Question attributes:").$aImportResults['question_attributes']."
    • " -."
    \n"; - -$importgroup .= "".$clang->gT("Question group import is complete.")."
     \n"; -$importgroup .= "\n"; -$importgroup .= "
    \n"; - -unlink($sFullFilepath); - - -/** -* This function imports an old-school question group file (*.csv,*.sql) -* -* @param mixed $sFullFilepath Full file patch to the import file -* @param mixed $newsid Survey ID to which the question is attached -*/ -function CSVImportGroup($sFullFilepath, $newsid) -{ - global $dbprefix, $connect, $clang; - $aLIDReplacements=array(); - $aQIDReplacements = array(); // this array will have the "new qid" for the questions, the key will be the "old qid" - $aGIDReplacements = array(); - $handle = fopen($sFullFilepath, "r"); - while (!feof($handle)) - { - $buffer = fgets($handle); - $bigarray[] = $buffer; - } - fclose($handle); - - if (substr($bigarray[0], 0, 23) != "# LimeSurvey Group Dump") - { - $results['fatalerror'] = $clang->gT("This file is not a LimeSurvey question file. Import failed."); - $importversion=0; - } - else - { - $importversion=(int)trim(substr($bigarray[1],12)); - } - - if ((int)$importversion<112) - { - $results['fatalerror'] = $clang->gT("This file is too old. Only files from LimeSurvey version 1.50 (DBVersion 112) and newer are supported."); - } - - for ($i=0; $i<9; $i++) //skipping the first lines that are not needed - { - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //GROUPS - if (array_search("# QUESTIONS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUESTIONS TABLE\n", $bigarray); - } - elseif (array_search("# QUESTIONS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUESTIONS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$grouparray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //QUESTIONS - if (array_search("# ANSWERS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray); - } - elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) - { - $questionarray[] = $bigarray[$i]; - } - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //ANSWERS - if (array_search("# CONDITIONS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# CONDITIONS TABLE\n", $bigarray); - } - elseif (array_search("# CONDITIONS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# CONDITIONS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) - { - $answerarray[] = str_replace("`default`", "`default_value`", $bigarray[$i]); - } - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //CONDITIONS - if (array_search("# LABELSETS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray); - } - elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray); - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$conditionsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LABELSETS - if (array_search("# LABELS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\n", $bigarray); - } - elseif (array_search("# LABELS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LABELS - if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray); - } - elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //Question attributes - if (!isset($noconditions) || $noconditions != "Y") - { - // stoppoint is the last line number - // this is an empty line after the QA CSV lines - $stoppoint = count($bigarray)-1; - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<=$stoppoint-1) {$question_attributesarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - } - $bigarray = array_values($bigarray); - - $countgroups=0; - if (isset($questionarray)) - { - $questionfieldnames=convertCSVRowToArray($questionarray[0],',','"'); - unset($questionarray[0]); - $countquestions = 0; - } - - if (isset($answerarray)) - { - $answerfieldnames=convertCSVRowToArray($answerarray[0],',','"'); - unset($answerarray[0]); - $countanswers = count($answerarray); - } - else {$countanswers=0;} - - $aLanguagesSupported = array(); // this array will keep all the languages supported for the survey - - $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid); - $aLanguagesSupported[]=$sBaseLanguage; // adds the base language to the list of supported languages - $aLanguagesSupported=array_merge($aLanguagesSupported,GetAdditionalLanguagesFromSurveyID($newsid)); - - - - - // Let's check that imported objects support at least the survey's baselang - $langcode = GetBaseLanguageFromSurveyID($newsid); - if (isset($grouparray)) - { - $groupfieldnames = convertCSVRowToArray($grouparray[0],',','"'); - $langfieldnum = array_search("language", $groupfieldnames); - $gidfieldnum = array_search("gid", $groupfieldnames); - $groupssupportbaselang = bDoesImportarraySupportsLanguage($grouparray,Array($gidfieldnum),$langfieldnum,$sBaseLanguage,true); - if (!$groupssupportbaselang) - { - $results['fatalerror']=$clang->gT("You can't import a group which doesn't support at least the survey base language."); - return $results; - } - } - - if (isset($questionarray)) - { - $langfieldnum = array_search("language", $questionfieldnames); - $qidfieldnum = array_search("qid", $questionfieldnames); - $questionssupportbaselang = bDoesImportarraySupportsLanguage($questionarray,Array($qidfieldnum), $langfieldnum,$sBaseLanguage,true); - if (!$questionssupportbaselang) - { - $results['fatalerror']=$clang->gT("You can't import a question which doesn't support at least the survey base language."); - return $results; - } - } - - if ($countanswers > 0) - { - $langfieldnum = array_search("language", $answerfieldnames); - $answercodefilednum1 = array_search("qid", $answerfieldnames); - $answercodefilednum2 = array_search("code", $answerfieldnames); - $answercodekeysarr = Array($answercodefilednum1,$answercodefilednum2); - $answerssupportbaselang = bDoesImportarraySupportsLanguage($answerarray,$answercodekeysarr,$langfieldnum,$sBaseLanguage); - if (!$answerssupportbaselang) - { - $results['fatalerror']=$clang->gT("You can't import answers which doesn't support at least the survey base language."); - return $results; - - } - - } - - if (count($labelsetsarray) > 1) - { - $labelsetfieldname = convertCSVRowToArray($labelsetsarray[0],',','"'); - $langfieldnum = array_search("languages", $labelsetfieldname); - $lidfilednum = array_search("lid", $labelsetfieldname); - $labelsetssupportbaselang = bDoesImportarraySupportsLanguage($labelsetsarray,Array($lidfilednum),$langfieldnum,$sBaseLanguage,true); - if (!$labelsetssupportbaselang) - { - $results['fatalerror']=$clang->gT("You can't import label sets which don't support the current survey's base language"); - return $results; - } - } - // I assume that if a labelset supports the survey's baselang, - // then it's labels do support it as well - - //DO ANY LABELSETS FIRST, SO WE CAN KNOW WHAT THEIR NEW LID IS FOR THE QUESTIONS - $results['labelsets']=0; - $qtypes = getqtypelist("" ,"array"); - $results['labels']=0; - $results['labelsets']=0; - $results['answers']=0; - $results['subquestions']=0; - - //Do label sets - if (isset($labelsetsarray) && $labelsetsarray) - { - $csarray=buildLabelSetCheckSumArray(); // build checksums over all existing labelsets - $count=0; - foreach ($labelsetsarray as $lsa) { - $fieldorders =convertCSVRowToArray($labelsetsarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($lsa,',','"'); - if ($count==0) {$count++; continue;} - - $labelsetrowdata=array_combine($fieldorders,$fieldcontents); - - // Save old labelid - $oldlid=$labelsetrowdata['lid']; - - unset($labelsetrowdata['lid']); - $newvalues=array_values($labelsetrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lsainsert = "INSERT INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $lsiresult=$connect->Execute($lsainsert); - $results['labelsets']++; - // Get the new insert id for the labels inside this labelset - $newlid=$connect->Insert_ID("{$dbprefix}labelsets",'lid'); - - if ($labelsarray) { - $count=0; - foreach ($labelsarray as $la) { - $lfieldorders =convertCSVRowToArray($labelsarray[0],',','"'); - $lfieldcontents=convertCSVRowToArray($la,',','"'); - if ($count==0) {$count++; continue;} - - // Combine into one array with keys and values since its easier to handle - $labelrowdata=array_combine($lfieldorders,$lfieldcontents); - $labellid=$labelrowdata['lid']; - if ($importversion<=132) - { - $labelrowdata["assessment_value"]=(int)$labelrowdata["code"]; - } - if ($labellid == $oldlid) { - $labelrowdata['lid']=$newlid; - - // translate internal links - $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']); - - $newvalues=array_values($labelrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lainsert = "INSERT INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $liresult=$connect->Execute($lainsert); - if ($liresult!==false) $results['labels']++; - } - } - } - - //CHECK FOR DUPLICATE LABELSETS - $thisset=""; - - $query2 = "SELECT code, title, sortorder, language, assessment_value - FROM {$dbprefix}labels - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
    $query2
    ".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - if (isset($csarray)) - { - foreach($csarray as $key=>$val) - { - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch) || ($_SESSION['USER_RIGHT_MANAGE_LABEL'] != 1)) - { - //There is a matching labelset or the user is not allowed to edit labels - - // So, we will delete this one and refer to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labels
    $query
    ".$connect->ErrorMsg()); - $results['labels']=$results['labels']-$connect->Affected_Rows(); - - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
    $query
    ".$connect->ErrorMsg()); - $results['labelsets']=$results['labelsets']-$connect->Affected_Rows(); - $newlid=$lsmatch; - } - else - { - //There isn't a matching labelset, add this checksum to the $csarray array - $csarray[$newlid]=$newcs; - } - //END CHECK FOR DUPLICATES - $aLIDReplacements[$oldlid]=$newlid; - } - } - - // Import groups - if (isset($grouparray) && $grouparray) - { - // do GROUPS - $gafieldorders=convertCSVRowToArray($grouparray[0],',','"'); - unset($grouparray[0]); - $newgid = 0; - $group_order = 0; // just to initialize this variable - foreach ($grouparray as $ga) - { - $gacfieldcontents=convertCSVRowToArray($ga,',','"'); - $grouprowdata=array_combine($gafieldorders,$gacfieldcontents); - - // Skip not supported languages - if (!in_array($grouprowdata['language'],$aLanguagesSupported)) - { - $skippedlanguages[]=$grouprowdata['language']; // this is for the message in the end. - continue; - } - - // replace the sid - $oldsid=$grouprowdata['sid']; - $grouprowdata['sid']=$newsid; - - // replace the gid or remove it if needed (it also will calculate the group order if is a new group) - $oldgid=$grouprowdata['gid']; - if ($newgid == 0) - { - unset($grouprowdata['gid']); - - // find the maximum group order and use this grouporder+1 to assign it to the new group - $qmaxgo = "select max(group_order) as maxgo from ".db_table_name('groups')." where sid=$newsid"; - $gres = db_execute_assoc($qmaxgo) or safe_die ($clang->gT("Error")." Failed to find out maximum group order value
    \n$qmaxqo
    \n".$connect->ErrorMsg()); - $grow=$gres->FetchRow(); - $group_order = $grow['maxgo']+1; - } - else - $grouprowdata['gid'] = $newgid; - - $grouprowdata["group_order"]= $group_order; - - // Everything set - now insert it - $grouprowdata=array_map('convertCsvreturn2return', $grouprowdata); - - // translate internal links - $grouprowdata['group_name']=translink('survey', $oldsid, $newsid, $grouprowdata['group_name']); - $grouprowdata['description']=translink('survey', $oldsid, $newsid, $grouprowdata['description']); - - db_switchIDInsert('groups',true); - $tablename=$dbprefix.'groups'; - $ginsert = $connect->GetinsertSQL($tablename,$grouprowdata); - $gres = $connect->Execute($ginsert) or safe_die($clang->gT('Error').": Failed to insert group
    \n$ginsert
    \n".$connect->ErrorMsg()); - db_switchIDInsert('groups',false); - - //GET NEW GID .... if is not done before and we count a group if a new gid is required - if ($newgid == 0) - { - $newgid = $connect->Insert_ID("{$dbprefix}groups",'gid'); - $countgroups++; - } - } - // GROUPS is DONE - - // Import questions - if (isset($questionarray) && $questionarray) - { - foreach ($questionarray as $qa) - { - $qacfieldcontents=convertCSVRowToArray($qa,',','"'); - $questionrowdata=array_combine($questionfieldnames,$qacfieldcontents); - $questionrowdata=array_map('convertCsvreturn2return', $questionrowdata); - $questionrowdata["type"]=strtoupper($questionrowdata["type"]); - - // Skip not supported languages - if (!in_array($questionrowdata['language'],$aLanguagesSupported)) - continue; - - // replace the sid - $questionrowdata["sid"] = $newsid; - - // replace the gid (if the gid is not in the oldgid it means there is a problem with the exported record, so skip it) - if ($questionrowdata['gid'] == $oldgid) - $questionrowdata['gid'] = $newgid; - else - continue; // a problem with this question record -> don't consider - - if (isset($aQIDReplacements[$questionrowdata['qid']])) - { - $questionrowdata['qid']=$aQIDReplacements[$questionrowdata['qid']]; - } - else - { - $oldqid = $questionrowdata['qid']; - unset($questionrowdata['qid']); - } - - // Save the following values - will need them for proper conversion later if ((int)$questionrowdata['lid']>0) - unset($oldlid1); unset($oldlid2); - if ((isset($questionrowdata['lid']) && $questionrowdata['lid']>0)) - { - $oldlid1=$questionrowdata['lid']; - } - if ((isset($questionrowdata['lid1']) && $questionrowdata['lid1']>0)) - { - $oldlid2=$questionrowdata['lid1']; - } - unset($questionrowdata['lid']); - unset($questionrowdata['lid1']); - if ($questionrowdata['type']=='W') - { - $questionrowdata['type']='!'; - } - elseif ($questionrowdata['type']=='Z') - { - $questionrowdata['type']='L'; - } - - if (!isset($questionrowdata["question_order"]) || $questionrowdata["question_order"]=='') {$questionrowdata["question_order"]=0;} - - $questionrowdata=array_map('convertCsvreturn2return', $questionrowdata); - - // translate internal links - $questionrowdata['title']=translink('survey', $oldsid, $newsid, $questionrowdata['title']); - $questionrowdata['question']=translink('survey', $oldsid, $newsid, $questionrowdata['question']); - $questionrowdata['help']=translink('survey', $oldsid, $newsid, $questionrowdata['help']); - - $newvalues=array_values($questionrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - - if (isset($questionrowdata['qid'])) - { - db_switchIDInsert('questions',true); - } - - $tablename=$dbprefix.'questions'; - $qinsert = $connect->GetInsertSQL($tablename,$questionrowdata); - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert question
    \n$qinsert
    \n".$connect->ErrorMsg()); - - $results['questions']++; - - //GET NEW QID .... if is not done before and we count a question if a new qid is required - if (isset($questionrowdata['qid'])) - { - $saveqid=$questionrowdata['qid']; - } - else - { - $aQIDReplacements[$oldqid]=$connect->Insert_ID("{$dbprefix}questions",'qid'); - $saveqid=$aQIDReplacements[$oldqid]; - } - $qtypes = getqtypelist("" ,"array"); - $aSQIDReplacements=array(); - db_switchIDInsert('questions',false); - - // Now we will fix up old label sets where they are used as answers - if ((isset($oldlid1) || isset($oldlid2)) && ($qtypes[$questionrowdata['type']]['answerscales']>0 || $qtypes[$questionrowdata['type']]['subquestions']>1)) - { - $query="select * from ".db_table_name('labels')." where lid={$aLIDReplacements[$oldlid1]} and language='{$questionrowdata['language']}'"; - $oldlabelsresult=db_execute_assoc($query); - while($labelrow=$oldlabelsresult->FetchRow()) - { - if (in_array($labelrow['language'],$aLanguagesSupported)) - { - - if ($qtypes[$questionrowdata['type']]['subquestions']<2) - { - $qinsert = "insert INTO ".db_table_name('answers')." (qid,code,answer,sortorder,language,assessment_value) - VALUES ({$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",".db_quoteall($labelrow['assessment_value']).")"; - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert answer (lid1)
    \n$qinsert
    \n".$connect->ErrorMsg()); - } - else - { - if (isset($aSQIDReplacements[$labelrow['code'].'_'.$saveqid])){ - $fieldname='qid,'; - $data=$aSQIDReplacements[$labelrow['code'].'_'.$saveqid].','; - } - else - { - $fieldname='' ; - $data=''; - } - - $qinsert = "insert INTO ".db_table_name('questions')." ($fieldname parent_qid,title,question,question_order,language,scale_id,type, sid, gid) - VALUES ($data{$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",1,'{$questionrowdata['type']}',{$questionrowdata['sid']},{$questionrowdata['gid']})"; - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert question
    \n$qinsert
    \n".$connect->ErrorMsg()); - if ($fieldname=='') - { - $aSQIDReplacements[$labelrow['code'].'_'.$saveqid]=$connect->Insert_ID("{$dbprefix}questions","qid"); - } - } - } - } - if (isset($oldlid2) && $qtypes[$questionrowdata['type']]['answerscales']>1) - { - $query="select * from ".db_table_name('labels')." where lid={$aLIDReplacements[$oldlid2]} and language='{$questionrowdata['language']}'"; - $oldlabelsresult=db_execute_assoc($query); - while($labelrow=$oldlabelsresult->FetchRow()) - { - $qinsert = "insert INTO ".db_table_name('answers')." (qid,code,answer,sortorder,language,assessment_value,scale_id) - VALUES ({$aQIDReplacements[$oldqid]},".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",".db_quoteall($labelrow['assessment_value']).",1)"; - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert answer (lid2)
    \n$qinsert
    \n".$connect->ErrorMsg()); - } - } - } - } - } - - //Do answers - $results['subquestions']=0; - if (isset($answerarray) && $answerarray) - { - foreach ($answerarray as $aa) - { - $answerfieldcontents=convertCSVRowToArray($aa,',','"'); - $answerrowdata=array_combine($answerfieldnames,$answerfieldcontents); - if ($answerrowdata===false) - { - $importquestion.='
    '.$clang->gT("Faulty line in import - fields and data don't match").":".implode(',',$answerfieldcontents); - } - // Skip not supported languages - if (!in_array($answerrowdata['language'],$aLanguagesSupported)) - continue; - - // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this answer is orphan -> error, skip this record) - if (isset($aQIDReplacements[$answerrowdata["qid"]])) - $answerrowdata["qid"] = $aQIDReplacements[$answerrowdata["qid"]]; - else - continue; // a problem with this answer record -> don't consider - - if ($importversion<=132) - { - $answerrowdata["assessment_value"]=(int)$answerrowdata["code"]; - } - // Convert default values for single select questions - $questiontemp=$connect->GetRow('select type,gid from '.db_table_name('questions').' where qid='.$answerrowdata["qid"]); - $oldquestion['newtype']=$questiontemp['type']; - $oldquestion['gid']=$questiontemp['gid']; - if ($answerrowdata['default_value']=='Y' && ($oldquestion['newtype']=='L' || $oldquestion['newtype']=='O' || $oldquestion['newtype']=='!')) - { - $insertdata=array(); - $insertdata['qid']=$newqid; - $insertdata['language']=$answerrowdata['language']; - $insertdata['defaultvalue']=$answerrowdata['answer']; - $query=$connect->GetInsertSQL($dbprefix.'defaultvalues',$insertdata); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert defaultvalue
    {$query}
    \n".$connect->ErrorMsg()); - - } - // translate internal links - $answerrowdata['answer']=translink('survey', $oldsid, $newsid, $answerrowdata['answer']); - // Everything set - now insert it - $answerrowdata = array_map('convertCsvreturn2return', $answerrowdata); - - if ($qtypes[$oldquestion['newtype']]['subquestions']>0) //hmmm.. this is really a subquestion - { - $questionrowdata=array(); - if (isset($aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']])){ - $questionrowdata['qid']=$aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']]; - } - $questionrowdata['parent_qid']=$answerrowdata['qid'];; - $questionrowdata['sid']=$newsid; - $questionrowdata['gid']=$oldquestion['gid']; - $questionrowdata['title']=$answerrowdata['code']; - $questionrowdata['question']=$answerrowdata['answer']; - $questionrowdata['question_order']=$answerrowdata['sortorder']; - $questionrowdata['language']=$answerrowdata['language']; - $questionrowdata['type']=$oldquestion['newtype']; - - $tablename=$dbprefix.'questions'; - $query=$connect->GetInsertSQL($tablename,$questionrowdata); - if (isset($questionrowdata['qid'])) db_switchIDInsert('questions',true); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert subquestion
    {$query}
    ".$connect->ErrorMsg()); - if (!isset($questionrowdata['qid'])) - { - $aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']]=$connect->Insert_ID("{$dbprefix}questions","qid"); - } - else - { - db_switchIDInsert('questions',false); - } - $results['subquestions']++; - // also convert default values subquestions for multiple choice - if ($answerrowdata['default_value']=='Y' && ($oldquestion['newtype']=='M' || $oldquestion['newtype']=='P')) - { - $insertdata=array(); - $insertdata['qid']=$newqid; - $insertdata['sqid']=$aSQIDReplacements[$answerrowdata['code']]; - $insertdata['language']=$answerrowdata['language']; - $insertdata['defaultvalue']='Y'; - $tablename=$dbprefix.'defaultvalues'; - $query=$connect->GetInsertSQL($tablename,$insertdata); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert defaultvalue
    {$query}
    \n".$connect->ErrorMsg()); - } - - } - else // insert answers - { - unset($answerrowdata['default_value']); - $tablename=$dbprefix.'answers'; - $query=$connect->GetInsertSQL($tablename,$answerrowdata); - $ares = $connect->Execute($query) or safe_die ("Error: Failed to insert answer
    {$query}
    \n".$connect->ErrorMsg()); - $results['answers']++; - } - - } - } - // ANSWERS is DONE - - // Fix sortorder of the groups - if users removed groups manually from the csv file there would be gaps - fixSortOrderGroups($surveyid); - //... and for the questions inside the groups - // get all group ids and fix questions inside each group - $gquery = "SELECT gid FROM {$dbprefix}groups where sid=$newsid group by gid ORDER BY gid"; //Get last question added (finds new qid) - $gres = db_execute_assoc($gquery); - while ($grow = $gres->FetchRow()) - { - fixsortorderQuestions($grow['gid'], $newsid); - } - } - - $results['question_attributes']=0; - // Finally the question attributes - it is called just once and only if there was a question - if (isset($question_attributesarray) && $question_attributesarray) - {//ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES - $fieldorders=convertCSVRowToArray($question_attributesarray[0],',','"'); - unset($question_attributesarray[0]); - foreach ($question_attributesarray as $qar) { - $fieldcontents=convertCSVRowToArray($qar,',','"'); - $qarowdata=array_combine($fieldorders,$fieldcontents); - - // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this attribute is orphan -> error, skip this record) - if (isset($aQIDReplacements[$qarowdata["qid"]])) - $qarowdata["qid"] = $aQIDReplacements[$qarowdata["qid"]]; - else - continue; // a problem with this answer record -> don't consider - - unset($qarowdata["qaid"]); - - $tablename="{$dbprefix}question_attributes"; - $qainsert=$connect->GetInsertSQL($tablename,$qarowdata); - $result=$connect->Execute($qainsert); - if ($result!==false) $results['question_attributes']++; - } - } - // ATTRIBUTES is DONE - - - // do CONDITIONS - $results['conditions']=0; - if (isset($conditionsarray) && $conditionsarray) - { - $fieldorders=convertCSVRowToArray($conditionsarray[0],',','"'); - unset($conditionsarray[0]); - foreach ($conditionsarray as $car) { - $fieldcontents=convertCSVRowToArray($car,',','"'); - $conditionrowdata=array_combine($fieldorders,$fieldcontents); - - $oldqid = $conditionrowdata["qid"]; - $oldcqid = $conditionrowdata["cqid"]; - - // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record) - if (isset($aQIDReplacements[$oldqid])) - $conditionrowdata["qid"] = $aQIDReplacements[$oldqid]; - else - continue; // a problem with this answer record -> don't consider - - // replace the cqid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record) - if (isset($aQIDReplacements[$oldcqid])) - $conditionrowdata["cqid"] = $aQIDReplacements[$oldcqid]; - else - continue; // a problem with this answer record -> don't consider - - list($oldcsid, $oldcgid, $oldqidanscode) = explode("X",$conditionrowdata["cfieldname"],3); - - if ($oldcgid != $oldgid) // this means that the condition is in another group (so it should not have to be been exported -> skip it - continue; - - unset($conditionrowdata["cid"]); - - // recreate the cfieldname with the new IDs - if (preg_match("/^\+/",$oldcsid)) - { - $newcfieldname = '+'.$newsid . "X" . $newgid . "X" . $conditionrowdata["cqid"] .substr($oldqidanscode,strlen($oldqid)); - } - else - { - $newcfieldname = $newsid . "X" . $newgid . "X" . $conditionrowdata["cqid"] .substr($oldqidanscode,strlen($oldqid)); - } - - $conditionrowdata["cfieldname"] = $newcfieldname; - if (!isset($conditionrowdata["method"]) || trim($conditionrowdata["method"])=='') - { - $conditionrowdata["method"]='=='; - } - $newvalues=array_values($conditionrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $conditioninsert = "insert INTO {$dbprefix}conditions (".implode(',',array_keys($conditionrowdata)).") VALUES (".implode(',',$newvalues).")"; - $result=$connect->Execute($conditioninsert) or safe_die ("Couldn't insert condition
    $conditioninsert
    ".$connect->ErrorMsg()); - $results['conditions']++; - } - } - LimeExpressionManager::RevertUpgradeConditionsToRelevance($newsid); - LimeExpressionManager::UpgradeConditionsToRelevance($newsid); - - $results['groups']=1; - $results['newgid']=$newgid; - return $results; -} - - -/** -* This function imports a LimeSurvey .lsg question group XML file -* -* @param mixed $sFullFilepath The full filepath of the uploaded file -* @param mixed $newsid The new survey id - the group will always be added after the last group in the survey -*/ -function XMLImportGroup($sFullFilepath, $newsid) -{ - global $connect, $dbprefix, $clang; - $aLanguagesSupported = array(); // this array will keep all the languages supported for the survey - - $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid); - $aLanguagesSupported[]=$sBaseLanguage; // adds the base language to the list of supported languages - $aLanguagesSupported=array_merge($aLanguagesSupported,GetAdditionalLanguagesFromSurveyID($newsid)); - - $xml = @simplexml_load_file($sFullFilepath); - if ($xml==false || $xml->LimeSurveyDocType!='Group') safe_die('This is not a valid LimeSurvey group structure XML file.'); - $dbversion = (float) $xml->DBVersion; - $aQIDReplacements=array(); - $results['defaultvalues']=0; - $results['answers']=0; - $results['question_attributes']=0; - $results['subquestions']=0; - $results['conditions']=0; - $results['groups']=0; - - $importlanguages=array(); - foreach ($xml->languages->language as $language) - { - $importlanguages[]=(string)$language; - } - - if (!in_array($sBaseLanguage,$importlanguages)) - { - $results['fatalerror'] = $clang->gT("The languages of the imported group file must at least include the base language of this survey."); - return $results; - } - // First get an overview of fieldnames - it's not useful for the moment but might be with newer versions - /* - $fieldnames=array(); - foreach ($xml->questions->fields->fieldname as $fieldname ) - { - $fieldnames[]=(string)$fieldname; - };*/ - - - // Import group table =================================================================================== - - $tablename=$dbprefix.'groups'; - - $newgrouporder=$connect->GetOne("SELECT MAX(group_order) AS maxqo FROM ".db_table_name('groups')." WHERE sid=$newsid"); - if (is_null($newgrouporder)) - { - $newgrouporder=0; - } - else { - $newgrouporder++; - } - foreach ($xml->groups->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $oldsid=$insertdata['sid']; - $insertdata['sid']=$newsid; - $insertdata['group_order']=$newgrouporder; - $oldgid=$insertdata['gid']; unset($insertdata['gid']); // save the old qid - - // now translate any links - $insertdata['group_name']=translink('survey', $oldsid, $newsid, $insertdata['group_name']); - $insertdata['description']=translink('survey', $oldsid, $newsid, $insertdata['description']); - // Insert the new question - if (isset($aGIDReplacements[$oldgid])) - { - $insertdata['gid']=$aGIDReplacements[$oldgid]; - db_switchIDInsert('groups',true); - } - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['groups']++; - - if (!isset($aGIDReplacements[$oldgid])) - { - $newgid=$connect->Insert_ID($tablename,"gid"); // save this for later - $aGIDReplacements[$oldgid]=$newgid; // add old and new qid to the mapping array - } - else - { - db_switchIDInsert('groups',false); - } - } - - - // Import questions table =================================================================================== - - // We have to run the question table data two times - first to find all main questions - // then for subquestions (because we need to determine the new qids for the main questions first) - $tablename=$dbprefix.'questions'; - $results['questions']=0; - if (isset($xml->questions)) - { - foreach ($xml->questions->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $oldsid=$insertdata['sid']; - $insertdata['sid']=$newsid; - if (!isset($aGIDReplacements[$insertdata['gid']]) || trim($insertdata['title'])=='') continue; // Skip questions with invalid group id - $insertdata['gid']=$aGIDReplacements[$insertdata['gid']]; - $oldqid=$insertdata['qid']; unset($insertdata['qid']); // save the old qid - - // now translate any links - $insertdata['title']=translink('survey', $oldsid, $newsid, $insertdata['title']); - $insertdata['question']=translink('survey', $oldsid, $newsid, $insertdata['question']); - $insertdata['help']=translink('survey', $oldsid, $newsid, $insertdata['help']); - // Insert the new question - if (isset($aQIDReplacements[$oldqid])) - { - $insertdata['qid']=$aQIDReplacements[$oldqid]; - db_switchIDInsert('questions',true); - } - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - if (!isset($aQIDReplacements[$oldqid])) - { - $newqid=$connect->Insert_ID($tablename,"qid"); // save this for later - $aQIDReplacements[$oldqid]=$newqid; // add old and new qid to the mapping array - $results['questions']++; - } - else - { - db_switchIDInsert('questions',false); - } - } - } - - // Import subquestions -------------------------------------------------------------- - if (isset($xml->subquestions)) - { - - foreach ($xml->subquestions->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['sid']=$newsid; - if (!isset($aGIDReplacements[$insertdata['gid']])) continue; // Skip questions with invalid group id - $insertdata['gid']=$aGIDReplacements[(int)$insertdata['gid']];; - $oldsqid=(int)$insertdata['qid']; unset($insertdata['qid']); // save the old qid - if (!isset($aQIDReplacements[(int)$insertdata['parent_qid']])) continue; // Skip subquestions with invalid parent_qids - $insertdata['parent_qid']=$aQIDReplacements[(int)$insertdata['parent_qid']]; // remap the parent_qid - - // now translate any links - $insertdata['title']=translink('survey', $oldsid, $newsid, $insertdata['title']); - $insertdata['question']=translink('survey', $oldsid, $newsid, $insertdata['question']); - $insertdata['help']=(isset($insertdata['help']) ? translink('survey', $oldsid, $newsid, $insertdata['help']) : ''); - if (isset($aQIDReplacements[$oldsqid])){ - $insertdata['qid']=$aQIDReplacements[$oldsqid]; - db_switchIDInsert('questions',true); - } - - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $newsqid=$connect->Insert_ID($tablename,"qid"); // save this for later - if (!isset($insertdata['qid'])) - { - $aQIDReplacements[$oldsqid]=$newsqid; // add old and new qid to the mapping array - } - else - { - db_switchIDInsert('questions',false); - } - - $results['subquestions']++; - } - } - - // Import answers -------------------------------------------------------------- - if(isset($xml->answers)) - { - $tablename=$dbprefix.'answers'; - - foreach ($xml->answers->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - if (!isset($aQIDReplacements[(int)$insertdata['qid']])) continue; // Skip questions with invalid group id - - $insertdata['qid']=$aQIDReplacements[(int)$insertdata['qid']]; // remap the parent_qid - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['answers']++; - } - } - - // Import questionattributes -------------------------------------------------------------- - if(isset($xml->question_attributes)) - { - $tablename=$dbprefix.'question_attributes'; - - foreach ($xml->question_attributes->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - unset($insertdata['qaid']); - if (!isset($aQIDReplacements[(int)$insertdata['qid']])) continue; // Skip questions with invalid group id - $insertdata['qid']=$aQIDReplacements[(int)$insertdata['qid']]; // remap the parent_qid - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['question_attributes']++; - } - } - - - // Import defaultvalues -------------------------------------------------------------- - if(isset($xml->defaultvalues)) - { - $tablename=$dbprefix.'defaultvalues'; - - $results['defaultvalues']=0; - foreach ($xml->defaultvalues->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['qid']=$aQIDReplacements[(int)$insertdata['qid']]; // remap the qid - if (!isset($aQIDReplacements[(int)$insertdata['sqid']]) || is_null($aQIDReplacements[(int)$insertdata['sqid']])) - { - $insertdata['sqid'] = 0; // defaults for non-array types - } - else - { - $insertdata['sqid']=$aQIDReplacements[(int)$insertdata['sqid']]; // remap the subqeustion id - } - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    ". $query. "
    \n".$connect->ErrorMsg()); - $results['defaultvalues']++; - } - } - - // Import conditions -------------------------------------------------------------- - if(isset($xml->conditions)) - { - $tablename=$dbprefix.'conditions'; - - foreach ($xml->conditions->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record) - if (isset($aQIDReplacements[$insertdata['qid']])) - { - $insertdata['qid']=$aQIDReplacements[$insertdata['qid']]; // remap the qid - } - else continue; // a problem with this answer record -> don't consider - if (isset($aQIDReplacements[$insertdata['cqid']])) - { - $insertdata['cqid']=$aQIDReplacements[$insertdata['cqid']]; // remap the qid - } - else continue; // a problem with this answer record -> don't consider - - list($oldcsid, $oldcgid, $oldqidanscode) = explode("X",$insertdata["cfieldname"],3); - - if ($oldcgid != $oldgid) // this means that the condition is in another group (so it should not have to be been exported -> skip it - continue; - - unset($insertdata["cid"]); - - // recreate the cfieldname with the new IDs - if (preg_match("/^\+/",$oldcsid)) - { - $newcfieldname = '+'.$newsid . "X" . $newgid . "X" . $insertdata["cqid"] .substr($oldqidanscode,strlen($oldqid)); - } - else - { - $newcfieldname = $newsid . "X" . $newgid . "X" . $insertdata["cqid"] .substr($oldqidanscode,strlen($oldqid)); - } - - $insertdata["cfieldname"] = $newcfieldname; - if (trim($insertdata["method"])=='') - { - $insertdata["method"]='=='; - } - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    \$query
    \n".$connect->ErrorMsg()); - $results['conditions']++; - } - } - LimeExpressionManager::RevertUpgradeConditionsToRelevance($newsid); - LimeExpressionManager::UpgradeConditionsToRelevance($newsid); - - - $results['newgid']=$newgid; - $results['labelsets']=0; - $results['labels']=0; - return $results; -} \ No newline at end of file diff --git a/include/limesurvey/admin/importlabel.php b/include/limesurvey/admin/importlabel.php deleted file mode 100644 index 14747f04..00000000 --- a/include/limesurvey/admin/importlabel.php +++ /dev/null @@ -1,368 +0,0 @@ -".$clang->gT("Import Label Set")."\n"; - -$sFullFilepath = $tempdir . DIRECTORY_SEPARATOR . $_FILES['the_file']['name']; -$aPathInfo = pathinfo($sFullFilepath); -$sExtension = $aPathInfo['extension']; - -if (!@move_uploaded_file($_FILES['the_file']['tmp_name'], $sFullFilepath)) -{ - $importlabeloutput .= "".$clang->gT("Error")."
    \n"; - $importlabeloutput .= sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir)."

    \n"; - $importlabeloutput .= "

    \n"; - return; -} - -$importlabeloutput .= "
    ".$clang->gT("Success")."

    \n"; -$importlabeloutput .= $clang->gT("File upload succeeded.")."

    \n"; -$importlabeloutput .= $clang->gT("Reading file..")."

    \n"; -$options['checkforduplicates']='off'; -if (isset($_POST['checkforduplicates'])) -{ - $options['checkforduplicates']=$_POST['checkforduplicates']; -} - -if (strtolower($sExtension)=='csv') -{ - $aImportResults=CSVImportLabelset($sFullFilepath, $options); -} -elseif (strtolower($sExtension)=='lsl') -{ - $aImportResults=XMLImportLabelsets($sFullFilepath, $options); -} - else -{ - $importlabeloutput .= "
    \n
    ".$clang->gT("Error")."

    \n"; - $importlabeloutput .= "".$clang->gT("Label set import summary")."
    \n"; - $importlabeloutput .= $clang->gT("Uploaded label set file needs to have an .lsl extension.")."

    \n"; - $importlabeloutput .= "\n"; - $importlabeloutput .= "

    \n"; -} -unlink($sFullFilepath); - -if (isset($aImportResults)) -{ - if (isset($aImportResults['fatalerror'])) - { - $importlabeloutput .= "
    \n
    ".$clang->gT("Error")."
    -

    {$aImportResults['fatalerror']}
    "; - } - else - { - if (count($aImportResults['warnings'])>0) - { - $importlabeloutput .= "
    \n

    ".$clang->gT("Warnings")."
      \n"; - foreach ($aImportResults['warnings'] as $warning) - { - $importlabeloutput .= '
    • '.$warning.'
    • '; - } - $importlabeloutput .= "
    \n"; - } - - $importlabeloutput .= "
    \n
    ".$clang->gT("Success")."

    \n"; - $importlabeloutput .= "".$clang->gT("Label set import summary")."
    \n"; - $importlabeloutput .= "
      \n\t
    • ".$clang->gT("Label sets").": {$aImportResults['labelsets']}
    • \n"; - $importlabeloutput .= "\t
    • ".$clang->gT("Labels").": {$aImportResults['labels']}
    \n"; - $importlabeloutput .= "

    ".$clang->gT("Import of label set(s) is completed.")."

    \n"; - - } - $importlabeloutput .= "\n"; - $importlabeloutput .= "


    \n"; -} - - -// IF WE GOT THIS FAR, THEN THE FILE HAS BEEN UPLOADED SUCCESFULLY -function CSVImportLabelset($sFullFilepath, $options) -{ - global $dbprefix, $connect, $clang; - $results['labelsets']=0; - $results['labels']=0; - $results['warnings']=array(); - $csarray=buildLabelSetCheckSumArray(); - //$csarray is now a keyed array with the Checksum of each of the label sets, and the lid as the key - - $handle = fopen($sFullFilepath, "r"); - while (!feof($handle)) - { - $buffer = fgets($handle); //To allow for very long survey welcomes (up to 10k) - $bigarray[] = $buffer; - } - fclose($handle); - if (substr($bigarray[0], 0, 27) != "# LimeSurvey Label Set Dump" && substr($bigarray[0], 0, 28) != "# PHPSurveyor Label Set Dump") - { - $results['fatalerror']=$clang->gT("This file is not a LimeSurvey label set file. Import failed."); - return $results; - } - - for ($i=0; $i<9; $i++) //skipping the first lines that are not needed - { - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LABEL SETS - if (array_search("# LABELS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\n", $bigarray); - } - elseif (array_search("# LABELS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - - //LABELS - $stoppoint = count($bigarray)-1; - - for ($i=0; $i<$stoppoint; $i++) - { - // do not import empty lines - if (trim($bigarray[$i])!='') - { - $labelsarray[] = $bigarray[$i]; - } - unset($bigarray[$i]); - } - - - - $countlabelsets = count($labelsetsarray)-1; - $countlabels = count($labelsarray)-1; - - - if (isset($labelsetsarray) && $labelsetsarray) { - $count=0; - foreach ($labelsetsarray as $lsa) { - $fieldorders =convertCSVRowToArray($labelsetsarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($lsa,',','"'); - if ($count==0) {$count++; continue;} - - $labelsetrowdata=array_combine($fieldorders,$fieldcontents); - - // Save old labelid - $oldlid=$labelsetrowdata['lid']; - // set the new language - - unset($labelsetrowdata['lid']); - - $newvalues=array_values($labelsetrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lsainsert = "insert INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $lsiresult=$connect->Execute($lsainsert); - $results['labelsets']++; - - // Get the new insert id for the labels inside this labelset - $newlid=$connect->Insert_ID("{$dbprefix}labelsets",'lid'); - - if ($labelsarray) { - $count=0; - $lfieldorders=convertCSVRowToArray($labelsarray[0],',','"'); - unset($labelsarray[0]); - foreach ($labelsarray as $la) { - - $lfieldcontents=convertCSVRowToArray($la,',','"'); - // Combine into one array with keys and values since its easier to handle - $labelrowdata=array_combine($lfieldorders,$lfieldcontents); - $labellid=$labelrowdata['lid']; - - if ($labellid == $oldlid) { - $labelrowdata['lid']=$newlid; - - // translate internal links - $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']); - if (!isset($labelrowdata["assessment_value"])) - { - $labelrowdata["assessment_value"]=(int)$labelrowdata["code"]; - } - - $newvalues=array_values($labelrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lainsert = "insert INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $liresult=$connect->Execute($lainsert); - $results['labels']++; - } - } - } - - //CHECK FOR DUPLICATE LABELSETS - - if (isset($_POST['checkforduplicates'])) - { - $thisset=""; - $query2 = "SELECT code, title, sortorder, language, assessment_value - FROM ".db_table_name('labels')." - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
    $query2
    ".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - - if (isset($csarray) && $options['checkforduplicates']=='on') - { - foreach($csarray as $key=>$val) - { - // echo $val."-".$newcs."
    "; For debug purposes - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch)) - { - //There is a matching labelset. So, we will delete this one and refer - //to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labels
    $query
    ".$connect->ErrorMsg()); - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
    $query
    ".$connect->ErrorMsg()); - $newlid=$lsmatch; - $results['warnings'][]=$clang->gT("Label set was not imported because the same label set already exists.")." ".sprintf($clang->gT("Existing LID: %s"),$newlid); - - } - //END CHECK FOR DUPLICATES - } - } - } - - return $results; -} - - -function XMLImportLabelsets($sFullFilepath, $options) -{ - global $connect, $dbprefix, $clang; - - $xml = simplexml_load_file($sFullFilepath); - if ($xml->LimeSurveyDocType!='Label set') safe_die('This is not a valid LimeSurvey label set structure XML file.'); - $dbversion = (float) $xml->DBVersion; - $csarray=buildLabelSetCheckSumArray(); - $aLSIDReplacements=array(); - $results['labelsets']=0; - $results['labels']=0; - $results['warnings']=array(); - - - // Import labels table =================================================================================== - - $tablename=$dbprefix.'labelsets'; - foreach ($xml->labelsets->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $oldlsid=$insertdata['lid']; - unset($insertdata['lid']); // save the old qid - - // Insert the new question - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['labelsets']++; - - $newlsid=$connect->Insert_ID($tablename,"lid"); // save this for later - $aLSIDReplacements[$oldlsid]=$newlsid; // add old and new lsid to the mapping array - } - - - // Import labels table =================================================================================== - - $tablename=$dbprefix.'labels'; - if (isset($xml->labels->rows->row)) - foreach ($xml->labels->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['lid']=$aLSIDReplacements[$insertdata['lid']]; - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['labels']++; - } - - //CHECK FOR DUPLICATE LABELSETS - - if (isset($_POST['checkforduplicates'])) - { - foreach (array_values($aLSIDReplacements) as $newlid) - { - $thisset=""; - $query2 = "SELECT code, title, sortorder, language, assessment_value - FROM ".db_table_name('labels')." - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
    $query2
    ".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - - if (isset($csarray) && $options['checkforduplicates']=='on') - { - foreach($csarray as $key=>$val) - { - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch)) - { - //There is a matching labelset. So, we will delete this one and refer - //to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labels
    $query
    ".$connect->ErrorMsg()); - $results['labels']=$results['labels']-$connect->Affected_Rows(); - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
    $query
    ".$connect->ErrorMsg()); - $results['labelsets']--; - $newlid=$lsmatch; - $results['warnings'][]=$clang->gT("Label set was not imported because the same label set already exists.")." ".sprintf($clang->gT("Existing LID: %s"),$newlid); - - } - } - //END CHECK FOR DUPLICATES - } - return $results; -} - -// Closing PHP tag intentionall left out diff --git a/include/limesurvey/admin/importoldresponses.php b/include/limesurvey/admin/importoldresponses.php deleted file mode 100644 index 1d1c7dfc..00000000 --- a/include/limesurvey/admin/importoldresponses.php +++ /dev/null @@ -1,145 +0,0 @@ -$query
    ".$connect->ErrorMsg()); - $optionElements = ''; - $queryCheckColumnsActive = "SELECT * FROM {$dbprefix}survey_{$surveyid} "; - $resultActive = db_execute_num($queryCheckColumnsActive) or safe_die("Error:
    $query
    ".$connect->ErrorMsg()); - $countActive = $resultActive->FieldCount(); - - while ($row = $result->FetchRow()) - { - $queryCheckColumnsOld = "SELECT * FROM {$row[0]} "; - - $resultOld = db_execute_num($queryCheckColumnsOld) or safe_die("Error:
    $query
    ".$connect->ErrorMsg()); - - if($countActive== $resultOld->FieldCount()) - { - $optionElements .= "\t\t\t\n"; - } - } - - //Get the menubar - $importoldresponsesoutput = browsemenubar($clang->gT("Quick statistics")); - $importoldresponsesoutput .= " -
    - ".$clang->gT("Import responses from a deactivated survey table")." -
    -
    -
      -
    • - $surveyid -
    • -
    • - - -
    • -
    • - - -
    • -
    -

      -

    -

    ".$clang->gT("Warning").'
    '.$clang->gT("You can import all old responses with the same amount of columns as in your active survey. YOU have to make sure, that this responses corresponds to the questions in your active survey.")."
    -
    - -
    "; -} -elseif (isset($surveyid) && $surveyid && isset($oldtable)) -{ - $activetable = "{$dbprefix}survey_$surveyid"; - //Fields we don't want to import - $dontimportfields = array( - //,'otherfield' - ); - - - $aFieldsOldTable=array_values($connect->MetaColumnNames($oldtable, true)); - $aFieldsNewTable=array_values($connect->MetaColumnNames($activetable, true)); - - // Only import fields where the fieldnames are matching - $aValidFields=array_intersect($aFieldsOldTable,$aFieldsNewTable); - - // Only import fields not being in the $dontimportfields array - $aValidFields=array_diff($aValidFields,$dontimportfields); - - - $queryOldValues = "SELECT ".implode(", ",array_map("db_quote_id",$aValidFields))." FROM {$oldtable} "; - $resultOldValues = db_execute_assoc($queryOldValues) or safe_die("Error:
    $queryOldValues
    ".$connect->ErrorMsg()); - $iRecordCount=$resultOldValues->RecordCount(); - $aSRIDConversions=array(); - while ($row = $resultOldValues->FetchRow()) - { - $iOldID=$row['id']; - unset($row['id']); - - $sInsertSQL="INSERT into {$activetable} (".implode(",",array_map("db_quote_id",array_keys($row))).") VALUES (".implode(",",array_map("db_quoteall",array_values($row))).")"; - $result = $connect->Execute($sInsertSQL) or safe_die("Error:
    $sInsertSQL
    ".$connect->ErrorMsg()); - $aSRIDConversions[$iOldID]=$connect->Insert_Id($activetable,"id"); - } - - $_SESSION['flashmessage'] = sprintf($clang->gT("%s old response(s) were successfully imported."),$iRecordCount); - - $sOldTimingsTable=substr($oldtable,0,strrpos($oldtable,'_')).'_timings'.substr($oldtable,strrpos($oldtable,'_')); - $sNewTimingsTable=db_table_name_nq("survey_{$surveyid}_timings"); - if (tableExists(sStripDBPrefix($sOldTimingsTable)) && tableExists(sStripDBPrefix($sNewTimingsTable)) && returnglobal('importtimings')=='Y') - { - // Import timings - $aFieldsOldTimingTable=array_values($connect->MetaColumnNames($sOldTimingsTable, true)); - $aFieldsNewTimingTable=array_values($connect->MetaColumnNames($sNewTimingsTable, true)); - $aValidTimingFields=array_intersect($aFieldsOldTimingTable,$aFieldsNewTimingTable); - - $queryOldValues = "SELECT ".implode(", ",$aValidTimingFields)." FROM {$sOldTimingsTable} "; - $resultOldValues = db_execute_assoc($queryOldValues) or safe_die("Error:
    $queryOldValues
    ".$connect->ErrorMsg()); - $iRecordCountT=$resultOldValues->RecordCount(); - $aSRIDConversions=array(); - while ($row = $resultOldValues->FetchRow()) - { - if (isset($aSRIDConversions[$row['id']])) - { - $row['id']=$aSRIDConversions[$row['id']]; - } - $sInsertSQL="INSERT into {$sNewTimingsTable} (".implode(",",array_map("db_quote_id",array_keys($row))).") VALUES (".implode(",",array_map("db_quoteall",array_values($row))).")"; - $result = $connect->Execute($sInsertSQL) or safe_die("Error:
    $sInsertSQL
    ".$connect->ErrorMsg()); - } - $_SESSION['flashmessage'] = sprintf($clang->gT("%s old response(s) and according timings were successfully imported."),$iRecordCount,$iRecordCountT); - } - $importoldresponsesoutput = browsemenubar($clang->gT("Quick statistics")); -} - -?> diff --git a/include/limesurvey/admin/importquestion.php b/include/limesurvey/admin/importquestion.php deleted file mode 100644 index f67f2a3f..00000000 --- a/include/limesurvey/admin/importquestion.php +++ /dev/null @@ -1,904 +0,0 @@ -".$clang->gT("Import Question")."\n"; -$importquestion .= "
    \n"; - -$sFullFilepath = $tempdir . DIRECTORY_SEPARATOR . $_FILES['the_file']['name']; -$aPathInfo = pathinfo($sFullFilepath); -$sExtension = $aPathInfo['extension']; - -if (!@move_uploaded_file($_FILES['the_file']['tmp_name'], $sFullFilepath)) -{ - $fatalerror = sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir); -} - -// validate that we have a SID and GID -if (!returnglobal('sid')) -{ - $fatalerror .= $clang->gT("No SID (Survey) has been provided. Cannot import question."); -} -else -{ - $surveyid=returnglobal('sid'); -} - -if (!returnglobal('gid')) -{ - $fatalerror .= $clang->gT("No GID (Group) has been provided. Cannot import question"); - return; -} -else -{ - $postgid=returnglobal('gid'); -} - -if (isset($fatalerror)) -{ - $importquestion .= "
    ".$clang->gT("Error")."

    \n"; - $importquestion .= $fatalerror."

    \n"; - $importquestion .= "

    \n"; - $importquestion .= "
    \n"; - unlink($sFullFilepath); - return; -} - -// IF WE GOT THIS FAR, THEN THE FILE HAS BEEN UPLOADED SUCCESFULLY -$importquestion .= "
    ".$clang->gT("Success")."
     
    \n" -.$clang->gT("File upload succeeded.")."

    \n" -.$clang->gT("Reading file..")."

    \n"; -if (strtolower($sExtension)=='csv') -{ - $aImportResults=CSVImportQuestion($sFullFilepath, $surveyid, $gid); -} -elseif (strtolower($sExtension)=='lsq') -{ - $aImportResults=XMLImportQuestion($sFullFilepath, $surveyid, $gid); -} -else die('Unknown file extension'); -FixLanguageConsistency($surveyid); - -if (isset($aImportResults['fatalerror'])) -{ - $importquestion .= "
    ".$clang->gT("Error")."

    \n"; - $importquestion .= $aImportResults['fatalerror']."

    \n"; - $importquestion .= "\n"; - $importquestion .= "\n"; - unlink($sFullFilepath); - return; -} - -$importquestion .= "
    ".$clang->gT("Success")."

    \n" -."".$clang->gT("Question import summary")."
    \n" -."
      \n" -."\t
    • ".$clang->gT("Questions").": ".$aImportResults['questions']."
    • \n" -."\t
    • ".$clang->gT("Subquestions").": ".$aImportResults['subquestions']."
    • \n" -."\t
    • ".$clang->gT("Answers").": ".$aImportResults['answers']."
    • \n"; -if (strtolower($sExtension)=='csv') { - $importquestion.="\t
    • ".$clang->gT("Label sets").": ".$aImportResults['labelsets']." (".$aImportResults['labels'].")
    • \n"; -} -$importquestion.="\t
    • ".$clang->gT("Question attributes:").$aImportResults['question_attributes']."
    • " -."
    \n"; - -$importquestion .= "".$clang->gT("Question import is complete.")."
     \n"; -$importquestion .= "\n"; -$importquestion .= "
    \n"; - -unlink($sFullFilepath); - - - -/** -* This function imports an old-school question file (*.csv,*.sql) -* -* @param mixed $sFullFilepath Full file patch to the import file -* @param mixed $newsid Survey ID to which the question is attached -* @param mixed $newgid Group ID top which the question is attached -*/ -function CSVImportQuestion($sFullFilepath, $newsid, $newgid) -{ - global $dbprefix, $connect, $clang; - $aLIDReplacements=array(); - $aQIDReplacements=array(); // this array will have the "new qid" for the questions, the key will be the "old qid" - $aSQIDReplacements=array(); - $results['labelsets']=0; - $results['labels']=0; - - $handle = fopen($sFullFilepath, "r"); - while (!feof($handle)) - { - $buffer = fgets($handle); //To allow for very long survey welcomes (up to 10k) - $bigarray[] = $buffer; - } - fclose($handle); - $importversion=0; - // Now we try to determine the dataformat of the survey file. - if (substr($bigarray[1], 0, 24) == "# SURVEYOR QUESTION DUMP") - { - $importversion = 100; // version 1.0 or 0.99 file - } - elseif (substr($bigarray[0], 0, 26) == "# LimeSurvey Question Dump" || substr($bigarray[0], 0, 27) == "# PHPSurveyor Question Dump") - { // This is a >1.0 version file - these files carry the version information to read in line two - $importversion=(integer)substr($bigarray[1], 12, 3); - } - else // unknown file - show error message - { - $results['fatalerror'] = $clang->gT("This file is not a LimeSurvey question file. Import failed."); - return $results; - } - - if ((int)$importversion<112) - { - $results['fatalerror'] = $clang->gT("This file is too old. Only files from LimeSurvey version 1.50 (DBVersion 112) and newer are supported."); - return $results; - } - - for ($i=0; $i<9; $i++) //skipping the first lines that are not needed - { - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //QUESTIONS - if (array_search("# ANSWERS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray); - } - elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$questionarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //ANSWERS - if (array_search("# LABELSETS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray); - } - elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$answerarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LABELSETS - if (array_search("# LABELS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\n", $bigarray); - } - elseif (array_search("# LABELS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //LABELS - if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray); - } - elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //Question_attributes - $stoppoint = count($bigarray); - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-1) {$question_attributesarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - if (isset($questionarray)) - { - $questionfieldnames=convertCSVRowToArray($questionarray[0],',','"'); - unset($questionarray[0]); - $countquestions = count($questionarray)-1; - } - else {$countquestions=0;} - - if (isset($answerarray)) - { - $answerfieldnames=convertCSVRowToArray($answerarray[0],',','"'); - unset($answerarray[0]); - $countanswers = count($answerarray); - } - else {$countanswers=0;} - if (isset($labelsetsarray)) {$countlabelsets = count($labelsetsarray)-1;} else {$countlabelsets=0;} - if (isset($labelsarray)) {$countlabels = count($labelsarray)-1;} else {$countlabels=0;} - if (isset($question_attributesarray)) {$countquestion_attributes = count($question_attributesarray)-1;} else {$countquestion_attributes=0;} - - $aLanguagesSupported = array(); // this array will keep all the languages supported for the survey - - $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid); - $aLanguagesSupported[]=$sBaseLanguage; // adds the base language to the list of supported languages - $aLanguagesSupported=array_merge($aLanguagesSupported,GetAdditionalLanguagesFromSurveyID($newsid)); - - - // Let's check that imported objects support at least the survey's baselang - - if (isset($questionarray)) - { - $langfieldnum = array_search("language", $questionfieldnames); - $qidfieldnum = array_search("qid", $questionfieldnames); - $questionssupportbaselang = bDoesImportarraySupportsLanguage($questionarray,Array($qidfieldnum), $langfieldnum,$sBaseLanguage,true); - if (!$questionssupportbaselang) - { - $results['fatalerror']=$clang->gT("You can't import a question which doesn't support at least the survey base language."); - return $results; - } - } - - if ($countanswers > 0) - { - $langfieldnum = array_search("language", $answerfieldnames); - $answercodefilednum1 = array_search("qid", $answerfieldnames); - $answercodefilednum2 = array_search("code", $answerfieldnames); - $answercodekeysarr = Array($answercodefilednum1,$answercodefilednum2); - $answerssupportbaselang = bDoesImportarraySupportsLanguage($answerarray,$answercodekeysarr,$langfieldnum,$sBaseLanguage); - if (!$answerssupportbaselang) - { - $results['fatalerror']=$clang->gT("You can't import answers which doesn't support at least the survey base language."); - return $results; - - } - - } - - if ($countlabelsets > 0) - { - $labelsetfieldname = convertCSVRowToArray($labelsetsarray[0],',','"'); - $langfieldnum = array_search("languages", $labelsetfieldname); - $lidfilednum = array_search("lid", $labelsetfieldname); - $labelsetssupportbaselang = bDoesImportarraySupportsLanguage($labelsetsarray,Array($lidfilednum),$langfieldnum,$sBaseLanguage,true); - if (!$labelsetssupportbaselang) - { - $results['fatalerror']=$clang->gT("You can't import label sets which don't support the current survey's base language"); - return $results; - } - } - // I assume that if a labelset supports the survey's baselang, - // then it's labels do support it as well - - //DO ANY LABELSETS FIRST, SO WE CAN KNOW WHAT THEIR NEW LID IS FOR THE QUESTIONS - if (isset($labelsetsarray) && $labelsetsarray) { - $csarray=buildLabelSetCheckSumArray(); // build checksums over all existing labelsets - $count=0; - foreach ($labelsetsarray as $lsa) { - $fieldorders =convertCSVRowToArray($labelsetsarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($lsa,',','"'); - if ($count==0) {$count++; continue;} - - $results['labelsets']++; - - $labelsetrowdata=array_combine($fieldorders,$fieldcontents); - - // Save old labelid - $oldlid=$labelsetrowdata['lid']; - // set the new language - unset($labelsetrowdata['lid']); - $newvalues=array_values($labelsetrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lsainsert = "INSERT INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $lsiresult=$connect->Execute($lsainsert); - - // Get the new insert id for the labels inside this labelset - $newlid=$connect->Insert_ID("{$dbprefix}labelsets",'lid'); - - if ($labelsarray) { - $count=0; - foreach ($labelsarray as $la) { - $lfieldorders =convertCSVRowToArray($labelsarray[0],',','"'); - $lfieldcontents=convertCSVRowToArray($la,',','"'); - if ($count==0) {$count++; continue;} - - // Combine into one array with keys and values since its easier to handle - $labelrowdata=array_combine($lfieldorders,$lfieldcontents); - $labellid=$labelrowdata['lid']; - if ($importversion<=132) - { - $labelrowdata["assessment_value"]=(int)$labelrowdata["code"]; - } - - if ($labellid == $oldlid) { - $labelrowdata['lid']=$newlid; - - // translate internal links - $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']); - - $newvalues=array_values($labelrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lainsert = "INSERT INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $liresult=$connect->Execute($lainsert); - $results['labels']++; - } - } - } - - //CHECK FOR DUPLICATE LABELSETS - $thisset=""; - $query2 = "SELECT code, title, sortorder, language, assessment_value - FROM {$dbprefix}labels - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or safe_die("Died querying labelset $lid
    $query2
    ".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - if (isset($csarray)) - { - foreach($csarray as $key=>$val) - { - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch)) - { - //There is a matching labelset. So, we will delete this one and refer - //to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labels
    $query
    ".$connect->ErrorMsg()); - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or safe_die("Couldn't delete labelset
    $query
    ".$connect->ErrorMsg()); - $newlid=$lsmatch; - } - else - { - //There isn't a matching labelset, add this checksum to the $csarray array - $csarray[$newlid]=$newcs; - } - //END CHECK FOR DUPLICATES - $aLIDReplacements[$oldlid]=$newlid; - } - } - - - // Import questions - if (isset($questionarray) && $questionarray) { - - //Assuming we will only import one question at a time we will now find out the maximum question order in this group - //and save it for later - $newquestionorder = $connect->GetOne("SELECT MAX(question_order) AS maxqo FROM ".db_table_name('questions')." WHERE sid=$newsid AND gid=$newgid"); - if (is_null($newquestionorder)) - { - $newquestionorder=0; - } - else - { - $newquestionorder++; - } - - foreach ($questionarray as $qa) - { - $qacfieldcontents=convertCSVRowToArray($qa,',','"'); - $questionrowdata=array_combine($questionfieldnames,$qacfieldcontents); - - // Skip not supported languages - if (!in_array($questionrowdata['language'],$aLanguagesSupported)) - continue; - - // replace the sid - $oldqid = $questionrowdata['qid']; - $oldsid = $questionrowdata['sid']; - $oldgid = $questionrowdata['gid']; - - // Remove qid field if there is no newqid; and set it to newqid if it's set - if (!isset($newqid)) - { - unset($questionrowdata['qid']); - } - else - { - db_switchIDInsert('questions',true); - $questionrowdata['qid'] = $newqid; - } - - $questionrowdata["sid"] = $newsid; - $questionrowdata["gid"] = $newgid; - $questionrowdata["question_order"] = $newquestionorder; - - // Save the following values - will need them for proper conversion later if ((int)$questionrowdata['lid']>0) - if ((int)$questionrowdata['lid']>0) - { - $oldquestion['lid1']=(int)$questionrowdata['lid']; - } - if ((int)$questionrowdata['lid1']>0) - { - $oldquestion['lid2']=(int)$questionrowdata['lid1']; - } - $oldquestion['oldtype']=$questionrowdata['type']; - - // Unset label set IDs and convert question types - unset($questionrowdata['lid']); - unset($questionrowdata['lid1']); - if ($questionrowdata['type']=='W') - { - $questionrowdata['type']='!'; - } - elseif ($questionrowdata['type']=='Z') - { - $questionrowdata['type']='L'; - } - $oldquestion['newtype']=$questionrowdata['type']; - - $questionrowdata=array_map('convertCsvreturn2return', $questionrowdata); - - // translate internal links - $questionrowdata['title']=translink('survey', $oldsid, $newsid, $questionrowdata['title']); - $questionrowdata['question']=translink('survey', $oldsid, $newsid, $questionrowdata['question']); - $questionrowdata['help']=translink('survey', $oldsid, $newsid, $questionrowdata['help']); - - $newvalues=array_values($questionrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $qinsert = "INSERT INTO {$dbprefix}questions (".implode(',',array_keys($questionrowdata)).") VALUES (".implode(',',$newvalues).")"; - $qres = $connect->Execute($qinsert) or safe_die ("Error: Failed to insert question
    \n$qinsert
    \n".$connect->ErrorMsg()); - - // set the newqid only if is not set - if (!isset($newqid)) - { - $newqid=$connect->Insert_ID("{$dbprefix}questions","qid"); - } - else - { - db_switchIDInsert('questions',false); - } - - } - $qtypes = getqtypelist("" ,"array"); - $results['answers']=0; - $results['subquestions']=0; - - - // Now we will fix up old label sets where they are used as answers - if ((isset($oldquestion['lid1']) || isset($oldquestion['lid2'])) && ($qtypes[$oldquestion['newtype']]['answerscales']>0 || $qtypes[$oldquestion['newtype']]['subquestions']>1)) - { - $query="select * from ".db_table_name('labels')." where lid={$aLIDReplacements[$oldquestion['lid1']]} "; - $oldlabelsresult=db_execute_assoc($query); - while($labelrow=$oldlabelsresult->FetchRow()) - { - if (in_array($labelrow['language'],$aLanguagesSupported)){ - - if ($qtypes[$oldquestion['newtype']]['subquestions']<2) - { - $qinsert = "insert INTO ".db_table_name('answers')." (qid,code,answer,sortorder,language,assessment_value,scale_id) - VALUES ($newqid,".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",".db_quoteall($labelrow['assessment_value']).",0)"; - $qres = $connect->Execute($qinsert) or safe_die ("Error: Failed to insert answer
    \n$qinsert
    \n".$connect->ErrorMsg()); - $results['answers']++; - } - else - { - if (isset($aSQIDReplacements[$labelrow['code']])){ - $fieldname='qid,'; - $data=$aSQIDReplacements[$labelrow['code']].','; - db_switchIDInsert('questions',true); - } - else{ - $fieldname='' ; - $data=''; - } - - $qinsert = "insert INTO ".db_table_name('questions')." ($fieldname sid,gid,parent_qid,title,question,question_order,language,scale_id,type) - VALUES ($data $newsid,$newgid,$newqid,".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",1,".db_quoteall($oldquestion['newtype']).")"; - $qres = $connect->Execute($qinsert) or safe_die ("Error: Failed to insert subquestion
    \n$qinsert
    \n".$connect->ErrorMsg()); - if ($fieldname=='') - { - $aSQIDReplacements[$labelrow['code']]=$connect->Insert_ID("{$dbprefix}questions","qid"); - } - else - { - db_switchIDInsert('questions',false); - } - - } - } - } - - if (isset($oldquestion['lid2']) && $qtypes[$oldquestion['newtype']]['answerscales']>1) - { - $query="select * from ".db_table_name('labels')." where lid={$aLIDReplacements[$oldquestion['lid2']]}"; - $oldlabelsresult=db_execute_assoc($query); - while($labelrow=$oldlabelsresult->FetchRow()) - { - if (in_array($labelrow['language'],$aLanguagesSupported)){ - $qinsert = "insert INTO ".db_table_name('answers')." (qid,code,answer,sortorder,language,assessment_value,scale_id) - VALUES ($newqid,".db_quoteall($labelrow['code']).",".db_quoteall($labelrow['title']).",".db_quoteall($labelrow['sortorder']).",".db_quoteall($labelrow['language']).",".db_quoteall($labelrow['assessment_value']).",1)"; - $qres = $connect->Execute($qinsert) or safe_die ($clang->gT("Error").": Failed to insert answer
    \n$qinsert
    \n".$connect->ErrorMsg()); - } - } - } - } - - //Do answers - if (isset($answerarray) && $answerarray) - { - foreach ($answerarray as $aa) - { - $answerfieldcontents=convertCSVRowToArray($aa,',','"'); - $answerrowdata=array_combine($answerfieldnames,$answerfieldcontents); - if ($answerrowdata===false) - { - $importquestion.='
    '.$clang->gT("Faulty line in import - fields and data don't match").":".implode(',',$answerfieldcontents); - } - // Skip not supported languages - if (!in_array($answerrowdata['language'],$aLanguagesSupported)) - continue; - $code=$answerrowdata["code"]; - $thisqid=$answerrowdata["qid"]; - $answerrowdata["qid"]=$newqid; - - - if ($importversion<=132) - { - $answerrowdata["assessment_value"]=(int)$answerrowdata["code"]; - } - - // Convert default values for single select questions - if ($answerrowdata['default_value']=='Y' && ($oldquestion['newtype']=='L' || $oldquestion['newtype']=='O' || $oldquestion['newtype']=='!')) - { - $insertdata=array(); - $insertdata['qid']=$newqid; - $insertdata['language']=$answerrowdata['language']; - $insertdata['defaultvalue']=$answerrowdata['answer']; - $query=$connect->GetInsertSQL($dbprefix.'defaultvalues',$insertdata); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert defaultvalue
    {$query}
    \n".$connect->ErrorMsg()); - - } - // translate internal links - $answerrowdata['answer']=translink('survey', $oldsid, $newsid, $answerrowdata['answer']); - // Everything set - now insert it - $answerrowdata = array_map('convertCsvreturn2return', $answerrowdata); - - if ($qtypes[$oldquestion['newtype']]['subquestions']>0) //hmmm.. this is really a subquestion - { - $questionrowdata=array(); - if (isset($aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']])){ - $questionrowdata['qid']=$aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']]; - db_switchIDInsert('questions',true); - } - $questionrowdata['parent_qid']=$answerrowdata['qid']; - $questionrowdata['sid']=$newsid; - $questionrowdata['gid']=$newgid; - $questionrowdata['title']=$answerrowdata['code']; - $questionrowdata['question']=$answerrowdata['answer']; - $questionrowdata['question_order']=$answerrowdata['sortorder']; - $questionrowdata['language']=$answerrowdata['language']; - $questionrowdata['type']=$oldquestion['newtype']; - - $tablename=$dbprefix.'questions'; - $query=$connect->GetInsertSQL($tablename,$questionrowdata); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert question
    {$query}
    \n".$connect->ErrorMsg()); - if (!isset($questionrowdata['qid'])) - { - $aSQIDReplacements[$answerrowdata['code'].$answerrowdata['qid']]=$connect->Insert_ID("{$dbprefix}questions","qid"); - } - else - { - db_switchIDInsert('questions',false); - } - $results['subquestions']++; - // also convert default values subquestions for multiple choice - if ($answerrowdata['default_value']=='Y' && ($oldquestion['newtype']=='M' || $oldquestion['newtype']=='P')) - { - $insertdata=array(); - $insertdata['qid']=$newqid; - $insertdata['sqid']=$aSQIDReplacements[$answerrowdata['code']]; - $insertdata['language']=$answerrowdata['language']; - $insertdata['defaultvalue']='Y'; - $tablename=$dbprefix.'defaultvalues'; - $query=$connect->GetInsertSQL($tablename,$insertdata); - $qres = $connect->Execute($query) or safe_die ("Error: Failed to insert defaultvalue
    {$query}
    \n".$connect->ErrorMsg()); - } - - } - else // insert answers - { - unset($answerrowdata['default_value']); - $tablename=$dbprefix.'answers'; - $query=$connect->GetInsertSQL($tablename,$answerrowdata); - $ares = $connect->Execute($query) or safe_die ("Error: Failed to insert answer
    {$query}
    \n".$connect->ErrorMsg()); - $results['answers']++; - } - } - } - - $results['question_attributes']=0; - // Finally the question attributes - it is called just once and only if there was a question - if (isset($question_attributesarray) && $question_attributesarray) - {//ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES - $fieldorders =convertCSVRowToArray($question_attributesarray[0],',','"'); - unset($question_attributesarray[0]); - foreach ($question_attributesarray as $qar) { - $fieldcontents=convertCSVRowToArray($qar,',','"'); - $qarowdata=array_combine($fieldorders,$fieldcontents); - $qarowdata["qid"]=$newqid; - unset($qarowdata["qaid"]); - - $tablename="{$dbprefix}question_attributes"; - $qainsert=$connect->GetInsertSQL($tablename,$qarowdata); - $result=$connect->Execute($qainsert) or safe_die ("Couldn't insert question_attribute
    $qainsert
    ".$connect->ErrorMsg()); - $results['question_attributes']++; - - } - } - - } - LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting - - $results['newqid']=$newqid; - $results['questions']=1; - $results['newqid']=$newqid; - return $results; -} - - - -/** -* This function imports a LimeSurvey .lsq question XML file -* -* @param mixed $sFullFilepath The full filepath of the uploaded file -* @param mixed $newsid The new survey id -* @param mixed $newgid The new question group id -the question will always be added after the last question in the group -*/ -function XMLImportQuestion($sFullFilepath, $newsid, $newgid) -{ - global $connect, $dbprefix, $clang; - $aLanguagesSupported = array(); // this array will keep all the languages supported for the survey - - $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid); - $aLanguagesSupported[]=$sBaseLanguage; // adds the base language to the list of supported languages - $aLanguagesSupported=array_merge($aLanguagesSupported,GetAdditionalLanguagesFromSurveyID($newsid)); - - $xml = simplexml_load_file($sFullFilepath); - if ($xml->LimeSurveyDocType!='Question') safe_die('This is not a valid LimeSurvey question structure XML file.'); - $dbversion = (float) $xml->DBVersion; - $aQIDReplacements=array(); - $aSQIDReplacements=array(0=>0); - $results['defaultvalues']=0; - $results['answers']=0; - $results['question_attributes']=0; - $results['subquestions']=0; - - $importlanguages=array(); - foreach ($xml->languages->language as $language) - { - $importlanguages[]=(string)$language; - } - - if (!in_array($sBaseLanguage,$importlanguages)) - { - $results['fatalerror'] = $clang->gT("The languages of the imported question file must at least include the base language of this survey."); - return $results; - } - // First get an overview of fieldnames - it's not useful for the moment but might be with newer versions - /* - $fieldnames=array(); - foreach ($xml->questions->fields->fieldname as $fieldname ) - { - $fieldnames[]=(string)$fieldname; - };*/ - - - // Import questions table =================================================================================== - - // We have to run the question table data two times - first to find all main questions - // then for subquestions (because we need to determine the new qids for the main questions first) - $tablename=$dbprefix.'questions'; - $newquestionorder=$connect->GetOne("SELECT MAX(question_order) AS maxqo FROM ".db_table_name('questions')." WHERE sid=$newsid AND gid=$newgid")+1; - if (is_null($newquestionorder)) - { - $newquestionorder=0; - } - else { - $newquestionorder++; - } - foreach ($xml->questions->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $oldsid=$insertdata['sid']; - $insertdata['sid']=$newsid; - $insertdata['gid']=$newgid; - $insertdata['question_order']=$newquestionorder; - $oldqid=$insertdata['qid']; unset($insertdata['qid']); // save the old qid - - // now translate any links - $insertdata['title']=translink('survey', $oldsid, $newsid, $insertdata['title']); - $insertdata['question']=translink('survey', $oldsid, $newsid, $insertdata['question']); - $insertdata['help']=translink('survey', $oldsid, $newsid, $insertdata['help']); - // Insert the new question - if (isset($aQIDReplacements[$oldqid])) - { - $insertdata['qid']=$aQIDReplacements[$oldqid]; - db_switchIDInsert('questions',true); - } - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - if (!isset($aQIDReplacements[$oldqid])) - { - $newqid=$connect->Insert_ID($tablename,"qid"); // save this for later - $aQIDReplacements[$oldqid]=$newqid; // add old and new qid to the mapping array - } - else - { - db_switchIDInsert('questions',false); - } - } - - // Import subquestions -------------------------------------------------------------- - if (isset($xml->subquestions)) - { - - foreach ($xml->subquestions->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['sid']=$newsid; - $insertdata['gid']=$newgid; - $oldsqid=(int)$insertdata['qid']; unset($insertdata['qid']); // save the old qid - $insertdata['parent_qid']=$aQIDReplacements[(int)$insertdata['parent_qid']]; // remap the parent_qid - - // now translate any links - $insertdata['title']=translink('survey', $oldsid, $newsid, $insertdata['title']); - $insertdata['question']=translink('survey', $oldsid, $newsid, $insertdata['question']); - $insertdata['help']=translink('survey', $oldsid, $newsid, $insertdata['help']); - if (isset($aQIDReplacements[$oldsqid])){ - $insertdata['qid']=$aQIDReplacements[$oldsqid]; - db_switchIDInsert('questions',true); - } - - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result = $connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $newsqid=$connect->Insert_ID($tablename,"qid"); // save this for later - if (!isset($insertdata['qid'])) - { - $aQIDReplacements[$oldsqid]=$newsqid; // add old and new qid to the mapping array - } - else - { - db_switchIDInsert('questions',false); - } - $results['subquestions']++; - } - } - // Import answers -------------------------------------------------------------- - if(isset($xml->answers)) - { - $tablename=$dbprefix.'answers'; - - foreach ($xml->answers->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['qid']=$aQIDReplacements[(int)$insertdata['qid']]; // remap the parent_qid - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['answers']++; - } - } - - - // Import questionattributes -------------------------------------------------------------- - if(isset($xml->question_attributes)) - { - $tablename=$dbprefix.'question_attributes'; - - foreach ($xml->question_attributes->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - unset($insertdata['qaid']); - $insertdata['qid']=$aQIDReplacements[(integer)$insertdata['qid']]; // remap the parent_qid - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    {$query}
    \n".$connect->ErrorMsg()); - $results['question_attributes']++; - } - } - - - // Import defaultvalues -------------------------------------------------------------- - if(isset($xml->defaultvalues)) - { - $tablename=$dbprefix.'defaultvalues'; - - $results['defaultvalues']=0; - foreach ($xml->defaultvalues->rows->row as $row) - { - $insertdata=array(); - foreach ($row as $key=>$value) - { - $insertdata[(string)$key]=(string)$value; - } - $insertdata['qid']=$aQIDReplacements[(int)$insertdata['qid']]; // remap the qid - $insertdata['sqid']=$aSQIDReplacements[(int)$insertdata['sqid']]; // remap the subquestion id - - // now translate any links - $query=$connect->GetInsertSQL($tablename,$insertdata); - $result=$connect->Execute($query) or safe_die ($clang->gT("Error").": Failed to insert data
    \$query
    \n".$connect->ErrorMsg()); - $results['defaultvalues']++; - } - } - - LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting - - $results['newqid']=$newqid; - $results['questions']=1; - $results['labelsets']=0; - $results['labels']=0; - return $results; -} diff --git a/include/limesurvey/admin/importsurvey.php b/include/limesurvey/admin/importsurvey.php deleted file mode 100644 index 743dc526..00000000 --- a/include/limesurvey/admin/importsurvey.php +++ /dev/null @@ -1,155 +0,0 @@ -\n
    ".$clang->gT("Success")."


    \n"; - if (isset($copyfunction)) - { - $importsurvey .= "".$clang->gT("Survey copy summary")."
    \n"; - } else - { - $importsurvey .= "".$clang->gT("Survey import summary")."
    \n"; - } - $importsurvey .= "
      \n\t
    • ".$clang->gT("Surveys").": {$aImportResults['surveys']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Languages").": {$aImportResults['languages']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Question groups").": {$aImportResults['groups']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Questions").": {$aImportResults['questions']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Answers").": {$aImportResults['answers']}
    • \n"; - if (isset($aImportResults['subquestions'])) - { - $importsurvey .= "\t
    • ".$clang->gT("Subquestions").": {$aImportResults['subquestions']}
    • \n"; - } - if (isset($aImportResults['defaultvalues'])) - { - $importsurvey .= "\t
    • ".$clang->gT("Default answers").": {$aImportResults['defaultvalues']}
    • \n"; - } - if (isset($aImportResults['conditions'])) - { - $importsurvey .= "\t
    • ".$clang->gT("Conditions").": {$aImportResults['conditions']}
    • \n"; - } - if (isset($aImportResults['labelsets'])) - { - $importsurvey .= "\t
    • ".$clang->gT("Label sets").": {$aImportResults['labelsets']}
    • \n"; - } - if (isset($aImportResults['deniedcountls']) && $aImportResults['deniedcountls']>0) - { - $importsurvey .= "\t
    • ".$clang->gT("Not imported label sets").": {$aImportResults['deniedcountls']} ".$clang->gT("(Label sets were not imported since you do not have the permission to create new label sets.)")."
    • \n"; - } - $importsurvey .= "\t
    • ".$clang->gT("Question attributes").": {$aImportResults['question_attributes']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Assessments").": {$aImportResults['assessments']}
    • \n"; - $importsurvey .= "\t
    • ".$clang->gT("Quotas").": {$aImportResults['quota']} ({$aImportResults['quotamembers']} ".$clang->gT("quota members")." ".$clang->gT("and")." {$aImportResults['quotals']} ".$clang->gT("quota language settings").")
    • \n

    \n"; - if (count($aImportResults['importwarnings'])>0) - { - $importsurvey .= "
    ".$clang->gT("Warnings").":
      "; - foreach ($aImportResults['importwarnings'] as $warning) - { - $importsurvey .='
    • '.$warning.'
    • '; - } - $importsurvey .= "

    \n"; - } - if (isset($copyfunction)) - { - $importsurvey .= "".$clang->gT("Copy of survey is completed.")."
    \n" - . "".$clang->gT("Go to survey")."
    \n"; - } else - { - $importsurvey .= "".$clang->gT("Import of Survey is completed.")."
    \n" - . "".$clang->gT("Go to survey")."
    \n"; - } - $importsurvey .= "
    \n"; - if (!isset($copyfunction)) - { - unlink($sFullFilepath); - } -} -elseif (isset($bImportFailed) && $bImportFailed==true) -{ - echo "\n".$clang->gT("Error")."\n\n"; - echo $clang->gT("Import failed. You specified an invalid file.")."\n"; - -} -else -{ - echo "\n".$clang->gT("Success")."\n\n"; - echo $clang->gT("Survey import summary")."\n"; - echo $clang->gT("Surveys").": {$aImportResults['surveys']}\n"; - if ($aImportResults['importversion']>=111) - { - echo $clang->gT("Languages").": {$aImportResults['languages']}\n"; - } - echo $clang->gT("Groups").": {$aImportResults['groups']}\n"; - echo $clang->gT("Questions").": {$aImportResults['questions']}\n"; - echo $clang->gT("Answers").": {$aImportResults['answers']}\n"; - if (isset($aImportResults['subquestions'])) - { - echo $clang->gT("Subquestions").": {$aImportResults['subquestions']}\n"; - } - if (isset($aImportResults['defaultvalues'])) - { - echo $clang->gT("Default answers").": {$aImportResults['defaultvalues']}\n"; - } - if (isset($aImportResults['conditions'])) - { - echo $clang->gT("Conditions").": {$aImportResults['conditions']}\n"; - } - if (isset($aImportResults['labelsets'])) - { - echo $clang->gT("Label sets").": {$aImportResults['labelsets']}\n"; - } - if ($importresults['deniedcountls']>0) echo $clang->gT("Not imported label sets").": {$importresults['deniedcountls']} (".$clang->gT("(Label sets were not imported since you do not have the permission to create new label sets.)"); - echo $clang->gT("Question Attributes").": {$aImportResults['question_attributes']}\n"; - echo $clang->gT("Assessments").": {$aImportResults['assessments']}\n\n"; - - echo $clang->gT("Import of Survey is completed.")."\n"; - if ($aImportResults['importwarnings'] != "") echo "\n".$clang->gT("Warnings").":\n" . $aImportResults['importwarnings'] . "\n"; - $surveyid=$newsid; - -} - - diff --git a/include/limesurvey/admin/index.html b/include/limesurvey/admin/index.html deleted file mode 100644 index 3b37a4d6..00000000 --- a/include/limesurvey/admin/index.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/include/limesurvey/admin/integritycheck.php b/include/limesurvey/admin/integritycheck.php deleted file mode 100644 index d9f04b70..00000000 --- a/include/limesurvey/admin/integritycheck.php +++ /dev/null @@ -1,941 +0,0 @@ -" - . "
    ".$clang->gT("Data Consistency Check")."
    \n" - . "".$clang->gT("If errors are showing up you might have to execute this script repeatedly.")."
    \n" - . "
      \n"; - - /****** Plainly delete survey permissions if the survey or user does not exist ***/ - - $connect->query("delete FROM {$dbprefix}survey_permissions where sid not in (select sid from {$dbprefix}surveys)"); - $connect->query("delete FROM {$dbprefix}survey_permissions where uid not in (select uid from {$dbprefix}users)"); - - // Silently fix subquestions - fixSubquestions(); - - /***** Check for activate survey tables with missing survey entry **/ - - $sQuery = db_select_tables_like("{$dbprefix}survey\_%"); - $aResult = db_execute_num($sQuery) or safe_die("Couldn't get list of conditions from database
      $query
      ".$connect->ErrorMsg()); - while ($aRow=$aResult->FetchRow()) - { - $tablename=substr($aRow[0],strlen($dbprefix)); - if ($tablename=='survey_permissions' || $tablename=='survey_links') continue; - $iSurveyID=substr($tablename,strpos($tablename,'_')+1); - $qquery="SELECT sid FROM {$dbprefix}surveys WHERE sid='{$iSurveyID}'"; - $qresult=$connect->Execute($qquery) or safe_die ("Couldn't check questions table for qids
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if ($qcount==0) - { - $date = date('YmdHis').rand(1,1000); - $sOldTable = "survey_{$iSurveyID}"; - $sNewTable = "old_survey_{$iSurveyID}_$date"; - - $deactivatequery = db_rename_table(db_table_name_nq($sOldTable),db_table_name_nq($sNewTable)); - $deactivateresult = $connect->Execute($deactivatequery) or die ("Couldn't make backup of the survey table. Please try again. The database reported the following error:
      ".htmlspecialchars($connect->ErrorMsg())."
      "); - - if ($databasetype=='postgres') - { - // If you deactivate a postgres table you have to rename the according sequence too and alter the id field to point to the changed sequence - $deactivatequery = db_rename_table($sOldTable.'_id_seq',$sNewTable.'_id_seq'); - $deactivateresult = $connect->Execute($deactivatequery) or die ("Couldn't make backup of the survey table. Please try again. The database reported the following error:
      ".htmlspecialchars($connect->ErrorMsg())."

      Survey was not deactivated either.

      ".$clang->gT("Main Admin Screen").""); - $setsequence="ALTER TABLE $sNewTable ALTER COLUMN id SET DEFAULT nextval('{$sNewTable}_id_seq'::regclass);"; - $deactivateresult = $connect->Execute($setsequence) or die ("Couldn't make backup of the survey table. Please try again. The database reported the following error:
      ".htmlspecialchars($connect->ErrorMsg())."

      Survey was not deactivated either.

      ".$clang->gT("Main Admin Screen").""); - } - - } - } - - /***** Check for activate token tables with missing survey entry **/ - - $sQuery = db_select_tables_like("{$dbprefix}tokens\_%"); - $aResult = db_execute_num($sQuery) or safe_die("Couldn't get list of token tables from database
      $query
      ".$connect->ErrorMsg()); - while ($aRow=$aResult->FetchRow()) - { - $tablename=substr($aRow[0],strlen($dbprefix)); - $iSurveyID=substr($tablename,strpos($tablename,'_')+1); - $qquery="SELECT sid FROM {$dbprefix}surveys WHERE sid='{$iSurveyID}'"; - $qresult=$connect->Execute($qquery) or safe_die ("Couldn't check survey table for sid
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if ($qcount==0) - { - $date = date('YmdHis').rand(1,1000); - $sOldTable = "tokens_{$iSurveyID}"; - $sNewTable = "old_tokens_{$iSurveyID}_$date"; - $deactivatequery = db_rename_table( db_table_name_nq($sOldTable), db_table_name_nq($sNewTable)); - - if ($databasetype=='postgres') - { - // If you deactivate a postgres table you have to rename the according sequence too and alter the id field to point to the changed sequence - $sOldTableJur = db_table_name_nq($sOldTable); - $deactivatequery = db_rename_table(db_table_name_nq($sOldTable),db_table_name_nq($sNewTable).'_tid_seq'); - $deactivateresult = $connect->Execute($deactivatequery) or die ("oldtable : ".$sOldTable. " / oldtableJur : ". $sOldTableJur . " / ".htmlspecialchars($deactivatequery)." / Could not rename the old sequence for this token table. The database reported the following error:
      ".htmlspecialchars($connect->ErrorMsg())."

      ".$clang->gT("Main Admin Screen").""); - $setsequence="ALTER TABLE ".db_table_name_nq($sNewTable)."_tid_seq ALTER COLUMN tid SET DEFAULT nextval('".db_table_name_nq($sNewTable)."_tid_seq'::regclass);"; - $deactivateresult = $connect->Execute($setsequence) or die (htmlspecialchars($setsequence)." Could not alter the field tid to point to the new sequence name for this token table. The database reported the following error:
      ".htmlspecialchars($connect->ErrorMsg())."

      Survey was not deactivated either.

      ".$clang->gT("Main Admin Screen").""); - $setidx="ALTER INDEX ".db_table_name_nq($sOldTable)."_idx RENAME TO ".db_table_name_nq($sNewTable)."_idx;"; - $deactivateresult = $connect->Execute($setidx) or die (htmlspecialchars($setidx)." Could not alter the index for this token table. The database reported the following error:
      ".htmlspecialchars($connect->ErrorMsg())."

      Survey was not deactivated either.

      ".$clang->gT("Main Admin Screen").""); - } else { - $deactivateresult = $connect->Execute($deactivatequery) or die ("Couldn't deactivate because:
      \n".htmlspecialchars($connect->ErrorMsg())." - Query: ".htmlspecialchars($deactivatequery)."

      \nAdmin\n"); - } - - } - } - - - /**********************************************************************/ - /* CHECK CONDITIONS */ - /**********************************************************************/ - $query = "SELECT * FROM {$dbprefix}conditions ORDER BY cid"; - $result = db_execute_assoc($query) or safe_die("Couldn't get list of conditions from database
      $query
      ".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - $qquery="SELECT qid FROM {$dbprefix}questions WHERE qid='{$row['qid']}'"; - $qresult=$connect->Execute($qquery) or safe_die ("Couldn't check questions table for qids
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if (!$qcount) {$cdelete[]=array("cid"=>$row['cid'], "reason"=>"No matching qid");} - - if ($row['cqid'] != 0) - { // skip case with cqid=0 for codnitions on {TOKEN:EMAIL} for instance - $qquery = "SELECT qid FROM {$dbprefix}questions WHERE qid='{$row['cqid']}'"; - $qresult=$connect->Execute($qquery) or safe_die ("Couldn't check questions table for qids
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if (!$qcount) {$cdelete[]=array("cid"=>$row['cid'], "reason"=>$clang->gT("No matching Cqid"));} - } - if ($row['cfieldname']) //Only do this if there actually is a "cfieldname" - { - if (preg_match("/^\+{0,1}[0-9]+X[0-9]+X*$/",$row['cfieldname'])) - { // only if cfieldname isn't Tag such as {TOKEN:EMAIL} or any other token - list ($surveyid, $gid, $rest) = explode("X", $row['cfieldname']); - $qquery = "SELECT gid FROM {$dbprefix}groups WHERE gid=$gid"; - $qresult = $connect->Execute($qquery) or safe_die ("Couldn't check conditional group matches
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if ($qcount < 1) {$cdelete[]=array("cid"=>$row['cid'], "reason"=>$clang->gT("No matching CFIELDNAME Group!")." ($gid) ({$row['cfieldname']})");} - } - } - elseif (!$row['cfieldname']) - { - $cdelete[]=array("cid"=>$row['cid'], "reason"=>$clang->gT("No \"CFIELDNAME\" field set!")." ({$row['cfieldname']})"); - } - } - if (isset($cdelete) && $cdelete) - { - $integritycheck .= "
    • ".$clang->gT("The following conditions should be deleted").":

    • \n"; - foreach ($cdelete as $cd) { - $integritycheck .= "CID: {$cd['cid']} ".$clang->gT("because")." {$cd['reason']}
      \n"; - } - $integritycheck .= "
      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All conditions meet consistency standards")."
    • \n"; - } - - /**********************************************************************/ - /* CHECK QUESTION ATTRIBUTES */ - /**********************************************************************/ - $query = "SELECT * FROM {$dbprefix}question_attributes ORDER BY qid"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - $countQuestionAttributes=0; - while($row = $result->FetchRow()) - { - $aquery = "SELECT * FROM {$dbprefix}questions WHERE qid = {$row['qid']}"; - $aresult = $connect->Execute($aquery) or safe_die($connect->ErrorMsg()); - $qacount = $aresult->RecordCount(); - if (!$qacount) { - $countQuestionAttributes++; - } - } // while - if (isset($qadelete) && $qadelete) { - $integritycheck .= "
    • ".sprintf($clang->gT("There are %s orphaned question attributes."),$countQuestionAttributes)."
    • "; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All question attributes meet consistency standards")."
    • \n"; - } - - /**********************************************************************/ - /* Check default values */ - /**********************************************************************/ - $sQuery = "SELECT * FROM {$dbprefix}defaultvalues where qid not in (select qid from {$dbprefix}questions)"; - $result = db_execute_assoc($sQuery) or safe_die($connect->ErrorMsg()); - $iCountDefaultValues=$result->RecordCount(); - - if ($iCountDefaultValues>0) { - $integritycheck .= "
    • ".sprintf($clang->gT("There are %s orphaned default value entries which can be deleted."),$iCountDefaultValues)."
    • "; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All default values meet consistency standards")."
    • \n"; - } - - /**********************************************************************/ - /* Check quotas */ - /**********************************************************************/ - $sQuery = "SELECT * FROM {$dbprefix}quota where sid not in (select sid from {$dbprefix}surveys)"; - $result = db_execute_assoc($sQuery) or safe_die($connect->ErrorMsg()); - $iCountQuotas=$result->RecordCount(); - - if ($iCountQuotas>0) { - $integritycheck .= "
    • ".sprintf($clang->gT("There are %s orphaned quota entries which can be deleted."),$iCountQuotas)."
    • "; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All quotas meet consistency standards")."
    • \n"; - } - - - /**********************************************************************/ - /* Check quota languagesettings */ - /**********************************************************************/ - $sQuery = "SELECT * FROM {$dbprefix}quota_languagesettings where quotals_quota_id not in (select id from {$dbprefix}quota)"; - $result = db_execute_assoc($sQuery) or safe_die($connect->ErrorMsg()); - $iCountQuotaLanguageSettings=$result->RecordCount(); - - if ($iCountQuotaLanguageSettings>0) { - $integritycheck .= "
    • ".sprintf($clang->gT("There are %s orphaned quota language settings which can be deleted."),$iCountQuotaLanguageSettings)."
    • "; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All quota language settings meet consistency standards")."
    • \n"; - } - - /**********************************************************************/ - /* Check quota members */ - /**********************************************************************/ - $sQuery = "SELECT * FROM {$dbprefix}quota_members where quota_id not in (select id from {$dbprefix}quota) or qid not in (select qid from {$dbprefix}questions) or sid not in (select sid from {$dbprefix}surveys)"; - $result = db_execute_assoc($sQuery) or safe_die($connect->ErrorMsg()); - $iCountQuotaMembers=$result->RecordCount(); - - - if ($iCountQuotaMembers>0) { - $integritycheck .= "
    • ".sprintf($clang->gT("There are %s orphaned quota members which can be deleted."),$iCountQuotaMembers)."
    • "; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All quota members meet consistency standards")."
    • \n"; - } - - - - /**********************************************************************/ - /* CHECK ASSESSMENTS */ - /**********************************************************************/ - $query = "SELECT * FROM {$dbprefix}assessments WHERE scope='T' ORDER BY sid"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get list of assessments
      $query
      ".$connect->ErrorMsg()); - while($row = $result->FetchRow()) - { - $aquery = "SELECT * FROM {$dbprefix}surveys WHERE sid = {$row['sid']}"; - $aresult = db_execute_assoc($aquery) or safe_die("Oh dear - died in assessments surveys:".$aquery ."
      ".$connect->ErrorMsg()); - $acount = $aresult->RecordCount(); - if (!$acount) { - $assdelete[]=array("id"=>$row['id'], "assessment"=>$row['name'], "reason"=>$clang->gT("No matching survey")); - } - } // while - - $query = "SELECT * FROM {$dbprefix}assessments WHERE scope='G' ORDER BY gid"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get list of assessments
      $query
      ".$connect->ErrorMsg()); - while($row = $result->FetchRow()) - { - $aquery = "SELECT * FROM {$dbprefix}groups WHERE gid = {$row['gid']}"; - $aresult = $connect->Execute($aquery) or safe_die("Oh dear - died:".$aquery ."
      ".$connect->ErrorMsg()); - $acount = $aresult->RecordCount(); - if (!$acount) { - $asgdelete[]=array("id"=>$row['id'], "assessment"=>$row['name'], "reason"=>$clang->gT("No matching group")); - } - } - - if (isset($assdelete) && $assdelete) - { - $integritycheck .= "
    • ".$clang->gT("The following assessments should be deleted").":
    • \n"; - foreach ($assdelete as $ass) {$integritycheck .= "ID `{$ass['id']}` ASSESSMENT `{$ass['assessment']}` ".$clang->gT("because")." `{$ass['reason']}`
      \n";} - $integritycheck .= "

      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All Survey (Total) assessments meet consistency standards")."
    • \n"; - } - if (isset($asgdelete) && $asgdelete) - { - $integritycheck .= "".$clang->gT("The following assessments should be deleted").":
      \n"; - foreach ($asgdelete as $asg) {$integritycheck .= "ID `{$asg['id']}` ASSESSMENT `{$asg['assessment']}` ".$clang->gT("because")." `{$asg['reason']}`
      \n";} - $integritycheck .= "

      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All Group assessments meet consistency standards")."
    • \n"; - } - - // Check answers - $query = "SELECT * FROM {$dbprefix}answers ORDER BY qid"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get list of answers from database
      $query
      ".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - //$integritycheck .= "Checking answer {$row['code']} to qid {$row['qid']}
      \n"; - $qquery="SELECT qid FROM {$dbprefix}questions WHERE qid='{$row['qid']}'"; - $qresult=$connect->Execute($qquery) or safe_die ("Couldn't check questions table for qids from answers
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if (!$qcount) { - $adelete[]=array("qid"=>$row['qid'], "code"=>$row['code'], "reason"=>$clang->gT("No matching question")); - } - //$integritycheck .= "
      \n"; - } - if (isset($adelete) && $adelete) - { - $integritycheck .= "".$clang->gT("The following answers should be deleted").":
      \n"; - foreach ($adelete as $ad) {$integritycheck .= "QID `{$ad['qid']}` CODE `{$ad['code']}` ".$clang->gT("because")." `{$ad['reason']}`
      \n";} - $integritycheck .= "

      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All answers meet consistency standards")."
    • \n"; - } - - /**********************************************************************/ - /* CHECK SURVEYS */ - /**********************************************************************/ - $query = "SELECT * FROM {$dbprefix}surveys ORDER BY sid"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get list of answers from database
      $query
      ".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - $qquery="SELECT surveyls_survey_id FROM {$dbprefix}surveys_languagesettings WHERE surveyls_survey_id='{$row['sid']}'"; - $qresult=$connect->Execute($qquery) or safe_die ("Couldn't check languagesettings table for sids from surveys
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if (!$qcount) { - $sdelete[]=array("sid"=>$row['sid'], "reason"=>$clang->gT("Language specific settings missing")); - } - } - if (isset($sdelete) && $sdelete) - { - $integritycheck .= "".$clang->gT("The following surveys should be deleted").":
      \n"; - foreach ($sdelete as $sd) {$integritycheck .= "SID `{$sd['sid']}` ".$clang->gT("because")." `{$sd['reason']}`
      \n";} - $integritycheck .= "

      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All survey settings meet consistency standards")."
    • \n"; - } - - /**********************************************************************/ - /* CHECK SURVEY LANGUAGE SETTINGS */ - /**********************************************************************/ - $query = "SELECT surveyls_survey_id FROM {$dbprefix}surveys_languagesettings where surveyls_survey_id not in (select sid from {$dbprefix}surveys) group by surveyls_survey_id order by surveyls_survey_id"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get list of answers from database
      $query
      ".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - $sldelete[]=$row['surveyls_survey_id']; - } - if (isset($sldelete) && $sldelete) - { - $integritycheck .= "".$clang->gT("The following survey language settings should be deleted").":
      \n"; - foreach ($sldelete as $sld) { - $integritycheck .= sprintf($clang->gT("SLID `%s` because the related survey is missing."),$sld)."
      \n"; - } - $integritycheck .= "

      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All survey language settings meet consistency standards")."
    • \n"; - } - - - /**********************************************************************/ - /* CHECK QUESTIONS */ - /**********************************************************************/ - $query = "SELECT * FROM {$dbprefix}questions ORDER BY sid, gid, qid"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get list of questions from database
      $query
      ".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - //Make sure group exists - $qquery="SELECT * FROM {$dbprefix}groups WHERE gid={$row['gid']}"; - $qresult=$connect->Execute($qquery) or safe_die ("Couldn't check groups table for gids from questions
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if (!$qcount) {$qdelete[]=array("qid"=>$row['qid'], "reason"=>$clang->gT("No matching group")." ({$row['gid']})");} - //Make sure survey exists - $qquery="SELECT * FROM {$dbprefix}surveys WHERE sid={$row['sid']}"; - $qresult=$connect->Execute($qquery) or safe_die ("Couldn't check surveys table for sids from questions
      $qquery
      ".$connect->ErrorMsg()); - $qcount=$qresult->RecordCount(); - if (!$qcount) { - if (!isset($qdelete) || !in_array($row['qid'], $qdelete)) {$qdelete[]=array("qid"=>$row['qid'], "reason"=>$clang->gT("No matching survey")." ({$row['sid']})");} - } - } - if (isset($qdelete) && $qdelete) - { - $integritycheck .= "".$clang->gT("The following questions should be deleted").":
      \n"; - foreach ($qdelete as $qd) {$integritycheck .= "QID `{$qd['qid']}` ".$clang->gT("because")." `{$qd['reason']}`
      \n";} - $integritycheck .= "

      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All questions meet consistency standards")."
    • \n"; - } - /**********************************************************************/ - /* CHECK GROUPS */ - /**********************************************************************/ - $query = "SELECT gid FROM {$dbprefix}groups where sid not in (select sid from {$dbprefix}surveys) group by gid order by gid"; - $result=db_execute_assoc($query) or safe_die ("Couldn't get list of groups for checking
      $query
      ".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - $gdelete[]=$row['gid']; - } - if (isset($gdelete) && $gdelete) - { - $integritycheck .= "
    • ".$clang->gT("The following groups should be deleted").":
    • \n"; - foreach ($gdelete as $gd) {$integritycheck .= sprintf($clang->gT("GID `%s` because there is no matching survey."),$gd)."
      \n";} - $integritycheck .= "

      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All groups meet consistency standards")."
    • \n"; - } - /**********************************************************************/ - /* CHECK OLD SURVEY TABLES */ - /**********************************************************************/ - //1: Get list of "old_survey" tables and extract the survey id - //2: Check if that survey id still exists - //3: If it doesn't offer it for deletion - $tables=$connect->MetaTables(false, false, "{$dbprefix}old_survey%"); - $oldsids=array(); - $sids=array(); - foreach($tables as $table) - { - list($oldtxt, $surveytxt, $sid, $date)=explode("_", substr($table,strlen($dbprefix))); - $oldsids[]=$sid; - $fulloldsids[$sid][]=$table; - } - $oldsids=array_unique($oldsids); - $query = "SELECT sid FROM {$dbprefix}surveys ORDER BY sid"; - $result=$connect->Execute($query) or safe_die("Couldn't get unique survey ids
      $query
      "); - while ($row=$result->FetchRow()) - { - $sids[]=$row['sid']; - } - foreach($oldsids as $oldsid) - { - if(!in_array($oldsid, $sids)) - { - foreach($fulloldsids[$oldsid] as $tablename) - { - $oldsdelete[]=$tablename; - } - } else { - foreach($fulloldsids[$oldsid] as $tablename) - { - $tableParts = explode("_", substr($tablename,strlen($dbprefix))); - if (count($tableParts) == 4) { - $oldtxt = $tableParts[0]; - $surveytxt = $tableParts[1]; - $sid = $tableParts[2]; - $datetime = $tableParts[3]; - $type = $clang->gT('responses'); - } elseif (count($tableParts) == 5) { - //This is a timings table ( - $oldtxt = $tableParts[0]; - $surveytxt = $tableParts[1]; - $sid = $tableParts[2]; - $datetime = $tableParts[4]; - $type = $clang->gT('timings'); - } - $year=substr($datetime, 0,4); - $month=substr($datetime, 4,2); - $day=substr($datetime, 6, 2); - $hour=substr($datetime, 8, 2); - $minute=substr($datetime, 10, 2); - $date=date("D, d M Y h:i a", mktime($hour, $minute, 0, $month, $day, $year)); - $jq="SELECT * FROM ".$tablename; - $jqresult=$connect->execute($jq) or safe_die($query." failed"); - $jqcount=$jqresult->RecordCount(); - if($jqcount == 0) { - $oldsoptionaldelete[]=$tablename."| ".sprintf($clang->gT("Survey ID %d saved at %s (%s)"), $sid, $date, $type); - // $oldsoptionaldelete[]=$tablename."| SID ".$four. " ". $clang->gT("saved at")." $date"; - } else { - $oldsmultidelete[]=$tablename."| ".sprintf($clang->gT("Survey ID %d saved at %s containing %d record(s) (%s)"), $sid, $date, $jqcount, $type); - // $oldsmultidelete[]=$tablename."| SID ".$four." ". $clang->gT("saved at")." $date ".sprintf($clang->gT("containing %d record(s)"), $jqcount); - } - } - } - } - if (isset($oldsdelete) && $oldsdelete) - { - $integritycheck .= "
    • ".$clang->gT("The following old survey tables should be deleted because their parent survey no longer exists").":
    • \n"; - $integritycheck .= implode(", ", $oldsdelete); - $integritycheck .= "
      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All old survey tables meet consistency standards")."
    • \n"; - } - - /**********************************************************************/ - /* CHECK OLD TOKEN TABLES */ - /**********************************************************************/ - //1: Get list of "old_token" tables and extract the survey id - //2: Check if that survey id still exists - //3: If it doesn't offer it for deletion - $tables=$connect->MetaTables(false, false, "{$dbprefix}old_token%"); - $oldtsids=array(); - $tsids=array(); - $folloldtsids=array(); - - foreach($tables as $table) - { - list($oldtxt, $surveytxt, $sid, $date)=explode("_", substr($table,strlen($dbprefix))); - $oldtsids[]=$sid; - $fulloldtsids[$sid][]=$table; - } - $oldtsids=array_unique($oldtsids); - $query = "SELECT sid FROM {$dbprefix}surveys ORDER BY sid"; - $result=$connect->Execute($query) or safe_die("Couldn't get unique survey ids
      $query
      "); - while ($row=$result->FetchRow()) - { - $tsids[]=$row['sid']; - } - foreach($oldtsids as $oldtsid) - { - if(!in_array($oldtsid, $tsids)) - { - foreach($fulloldtsids[$oldtsid] as $tablename) - { - $oldtdelete[]=$tablename; - } - } else { - foreach($fulloldtsids[$oldtsid] as $tablename) - { - list($oldtxt, $tokenstxt, $sid, $datetime)=explode("_", substr($tablename,strlen($dbprefix))); - $year=substr($datetime, 0,4); - $month=substr($datetime, 4,2); - $day=substr($datetime, 6, 2); - $hour=substr($datetime, 8, 2); - $minute=substr($datetime, 10, 2); - $date=date("D, d M Y h:i a", mktime($hour, $minute, 0, $month, $day, $year)); - $jq="SELECT * FROM ".$tablename; - - $jqresult=$connect->execute($jq) or safe_die($query." failed"); - $jqcount=$jqresult->RecordCount(); - if($jqcount == 0) { - // $oldtoptionaldelete[]=$tablename."| SID ".$four. " ". $clang->gT("saved at")." $date"; - $oldtoptionaldelete[]=$tablename."| ".sprintf($clang->gT("Survey ID %d saved at %s"), $sid, $date); - } else { - $oldtmultidelete[]=$tablename."| ".sprintf($clang->gT("Survey ID %d saved at %s containing %d record(s)"), $sid, $date, $jqcount); - // $oldtmultidelete[]=$tablename."| SID ".$four." ". $clang->gT("saved at")." $date ".sprintf($clang->gT("containing %d record(s)"), $jqcount); - } - } - } - } - if (isset($oldtdelete) && $oldtdelete) - { - $integritycheck .= "
    • ".$clang->gT("The following old token tables should be deleted because their parent survey no longer exists").":
    • \n"; - $integritycheck .= implode(", ", $oldtdelete); - $integritycheck .= "
      \n"; - } - else - { - $integritycheck .= "
    • ".$clang->gT("All old token tables meet consistency standards")."
    • \n"; - } - - - //Finish the list - $integritycheck .='
    ' ; - - /**********************************************************************/ - /* CREATE FORM ELEMENTS CONTAINING PROPOSED ALTERATIONS */ - /**********************************************************************/ - if (!isset($cdelete) && !isset($adelete) && !isset($qdelete) && - !isset($gdelete) && !isset($asgdelete) && !isset($sdelete) && - !isset($assdelete) && !isset($qadelete) && !isset($oldsdelete) && - !isset($oldtdelete) && !isset($sldelete)&& $iCountDefaultValues==0 && - $iCountQuotas==0 && $iCountQuotaLanguageSettings==0 && $iCountQuotaMembers==0) { - $integritycheck .= "
    ".$clang->gT("No database action required"); - } else { - $integritycheck .= "
    ".$clang->gT("Should we proceed with the delete?")."
    \n"; - $integritycheck .= "
    \n"; - - if ($iCountQuotaMembers>0) - { - $integritycheck .= "\n"; - } - - if ($iCountQuotaLanguageSettings>0) - { - $integritycheck .= "\n"; - } - - if ($iCountQuotas>0) - { - $integritycheck .= "\n"; - } - - if ($iCountDefaultValues>0) - { - $integritycheck .= "\n"; - } - - if (isset($oldsdelete)) { - foreach($oldsdelete as $olds) { - $integritycheck .= "\n"; - } - } - if (isset($oldtdelete)) { - foreach($oldtdelete as $oldt) { - $integritycheck .= "\n"; - } - } - if (isset($cdelete)) { - foreach ($cdelete as $cd) { - $integritycheck .= "\n"; - } - } - if (isset($adelete)) { - foreach ($adelete as $ad) { - $integritycheck .= "\n"; - } - } - if (isset($qdelete)) { - foreach($qdelete as $qd) { - $integritycheck .= "\n"; - } - } - if (isset($gdelete)) { - foreach ($gdelete as $gd) { - $integritycheck .= "\n"; - } - } - if (isset($qadelete)) { - foreach ($qadelete as $qad) { - $integritycheck .= "\n"; - } - } - if (isset($assdelete)) { - foreach ($assdelete as $ass) { - $integritycheck .= "\n"; - } - } - if (isset($asgdelete)) { - foreach ($asgdelete as $asg) { - $integritycheck .= "\n"; - } - } - if (isset($sdelete)) { - foreach ($sdelete as $asg) { - $integritycheck .= "\n"; - } - } - if (isset($sldelete)) { - foreach ($sldelete as $sld) { - $integritycheck .= "\n"; - } - } - $integritycheck .= "\n" - ."\n" - ."
    \n"; - } - $integritycheck .= "
    \n"; - - $integritycheck2 = "
    " - . "
    ".$clang->gT("Data redundancy check")."
    " - . "".$clang->gT("The redundancy check looks for tables leftover after deactivating a survey. You can delete these if you no longer require them.")."\n" - . "
    \n"; - if (!isset($oldsoptionaldelete) && !isset($oldsmultidelete) && - !isset($oldtoptionaldelete) && !isset($oldtmultidelete) ) { - $integritycheck2 .= "
    ".$clang->gT("No database action required"); - } else { - - $integritycheck2 .= "
    \n" - . "
      \n"; - if(isset($oldsoptionaldelete)) { - $integritycheck2 .= "
    • ".$clang->gT("The following old survey tables contain no responses and can be deleted:")."
      \n"; - foreach($oldsoptionaldelete as $ood) { - list($tablename, $display)=explode("|", $ood); - $integritycheck2 .= "$display
      \n"; - } - $integritycheck2 .= "

    • \n"; - } - if(isset($oldsmultidelete)) { - $integritycheck2 .= "
    • ".$clang->gT("The following old survey response tables exist and may be deleted if no longer required:")."
      \n"; - foreach($oldsmultidelete as $omd) { - list($tablename, $display)=explode("|", $omd); - $integritycheck2 .= "$display
      \n"; - } - $integritycheck2 .= "

    • \n"; - } - if(isset($oldtoptionaldelete)) { - $integritycheck2 .= "
    • ".$clang->gT("The following old token tables contain no tokens and can be deleted:")."
      \n"; - foreach($oldtoptionaldelete as $ood) { - list($tablename, $display)=explode("|", $ood); - $integritycheck2 .= "$display
      \n"; - } - $integritycheck2 .= "

    • \n"; - } - if(isset($oldtmultidelete)) { - $integritycheck2 .= "
    • ".$clang->gT("The following old token list tables exist and may be deleted if no longer required:")."
      \n"; - foreach($oldtmultidelete as $omd) { - list($tablename, $display)=explode("|", $omd); - $integritycheck2 .= "$display
      \n"; - } - $integritycheck2 .= "
    • \n"; - } - $integritycheck2 .= "
    \n" - ."

    \n" - ."

    ".$clang->gT("Note that you cannot undo a delete if you proceed. The data will be gone.")."

    \n" - ."
    \n"; - - - } - $integritycheck2 .= "
    "; - - $integritycheck .= $integritycheck2; - } - elseif ($ok == "Y") - { - $integritycheck .= "
    \n" - . "\n" - . "\t\n" - . "\t\t\n" - . "\t\n" - . "\t
    \n" - . "\t\t\t".$clang->gT("Data Consistency Check")."
    ".$clang->gT("If errors are showing up you might have to execute this script repeatedly.")."
    \n" - . "\t\t
    "; - $cdelete=returnglobal('cdelete'); - $adelete=returnglobal('adelete'); - $qdelete=returnglobal('qdelete'); - $gdelete=returnglobal('gdelete'); - $assdelete=returnglobal('assdelete'); - $asgdelete=returnglobal('asgdelete'); - $qadelete=returnglobal('qadelete'); - $sdelete=returnglobal('sdelete'); - $sldelete=returnglobal('sldelete'); - $oldsdelete=returnglobal('oldsdelete'); - $oldtdelete=returnglobal('oldtdelete'); - $bDefaultValueDelete=returnglobal('defaultvalue_delete'); - $bQuotaDelete=returnglobal('quota_delete'); - $bQuotaLanguageSettingsDelete=returnglobal('quotalanguagesettings_delete'); - $bQuotaMembersDelete=returnglobal('quotamembers_delete'); - - if (isset($bDefaultValueDelete) && $bDefaultValueDelete==1) - { - $integritycheck .= $clang->gT("Deleting orphaned default values.")."
    \n"; - $sSQL = "delete FROM {$dbprefix}defaultvalues where qid not in (select qid from {$dbprefix}questions)"; - $result = $connect->Execute($sSQL) or safe_die ("Couldn't delete default values ($sSQL)
    ".$connect->ErrorMsg()); - } - - if (isset($bQuotaMembersDelete) && $bQuotaMembersDelete==1) - { - $integritycheck .= $clang->gT("Deleting orphaned quotas.")."
    \n"; - $sSQL = "delete FROM {$dbprefix}quota_members where quota_id not in (select id from {$dbprefix}quota) or qid not in (select qid from {$dbprefix}questions) or sid not in (select sid from {$dbprefix}surveys)"; - $result = $connect->Execute($sSQL) or safe_die ("Couldn't delete quota members ($sSQL)
    ".$connect->ErrorMsg()); - } - - if (isset($bQuotaDelete) && $bQuotaDelete==1) - { - $integritycheck .= $clang->gT("Deleting orphaned quotas.")."
    \n"; - $sSQL = "delete FROM {$dbprefix}quota where sid not in (select sid from {$dbprefix}surveys)"; - $result = $connect->Execute($sSQL) or safe_die ("Couldn't delete quotas ($sSQL)
    ".$connect->ErrorMsg()); - } - - - if (isset($bQuotaLanguageSettingsDelete) && $bQuotaLanguageSettingsDelete==1) - { - $integritycheck .= $clang->gT("Deleting orphaned language settings.")."
    \n"; - $sSQL = "delete FROM {$dbprefix}quota_languagesettings where quotals_quota_id not in (select id from {$dbprefix}quota)"; - $result = $connect->Execute($sSQL) or safe_die ("Couldn't delete quotas ($sSQL)
    ".$connect->ErrorMsg()); - } - - if (isset($oldsdelete)) { - $integritycheck .= $clang->gT("Deleting old survey result tables").":
    \n"; - foreach ($oldsdelete as $olds) { - $integritycheck .= $clang->gT("Deleting")." $olds
    \n"; - $sql = "DROP TABLE $olds"; - $result = $connect->Execute($sql) or safe_die ("Couldn't drop table $olds ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - - if (isset($oldtdelete)) { - $integritycheck .= $clang->gT("Deleting old survey result tables").":
    \n"; - foreach ($oldtdelete as $oldt) { - $integritycheck .= $clang->gT("Deleting")." $oldt
    \n"; - $sql = "DROP TABLE $oldt"; - $result = $connect->Execute($sql) or safe_die ("Couldn't drop table $olds ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - - if (isset($sdelete)) { - $integritycheck .= $clang->gT("Deleting Surveys").":
    \n"; - foreach ($sdelete as $ass) { - $integritycheck .= $clang->gT("Deleting Survey ID").":".$ass."
    \n"; - $sql = "DELETE FROM {$dbprefix}surveys WHERE sid=$ass"; - $result = $connect->Execute($sql) or safe_die ("Couldn't delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "
    \n"; - } - - if (isset($sldelete)) { - $integritycheck .= $clang->gT("Deleting survey language settings").":
    \n"; - foreach ($sldelete as $sld) { - $integritycheck .= $clang->gT("Deleting survey language setting").":".$sld."
    \n"; - $sql = "DELETE FROM {$dbprefix}surveys_languagesettings WHERE surveyls_survey_id=$sld"; - $result = $connect->Execute($sql) or safe_die ("Couldn't delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "
    \n"; - } - - if (isset($assdelete)) { - $integritycheck .= $clang->gT( "Deleting Assessments").":
    \n"; - foreach ($assdelete as $ass) { - $integritycheck .= $clang->gT("Deleting ID").":".$ass."
    \n"; - $sql = "DELETE FROM {$dbprefix}assessments WHERE id=$ass"; - $result = $connect->Execute($sql) or safe_die ("Couldn't delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "
    \n"; - } - - if (isset($asgdelete)) { - $integritycheck .= $clang->gT("Deleting Assessments").":
    \n"; - foreach ($asgdelete as $asg) { - $integritycheck .= $clang->gT("Deleting ID").":".$asg."
    \n"; - $sql = "DELETE FROM {$dbprefix}assessments WHERE id=$asg"; - $result = $connect->Execute($sql) or safe_die ("Couldn't delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "
    \n"; - } - - if (isset($qadelete)) { - $integritycheck .= $clang->gT("Deleting Question_Attributes").":
    \n"; - foreach ($qadelete as $qad) { - $integritycheck .= "Deleting QAID:".$qad."
    \n"; - $sql = "DELETE FROM {$dbprefix}question_attributes WHERE qaid=$qad"; - $result = $connect->Execute($sql) or safe_die ("Couldn't delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "
    \n"; - } - - if (isset($cdelete)) { - $integritycheck .= $clang->gT("Deleting Conditions").":
    \n"; - foreach ($cdelete as $cd) { - $integritycheck .= $clang->gT("Deleting cid").":".$cd."
    \n"; - $sql = "DELETE FROM {$dbprefix}conditions WHERE cid=$cd"; - $result=$connect->Execute($sql) or safe_die ("Couldn't Delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - if (isset($adelete)) { - $integritycheck .= $clang->gT("Deleting Answers").":
    \n"; - foreach ($adelete as $ad) { - list($ad1, $ad2)=explode("|", $ad); - $integritycheck .= $clang->gT("Deleting answer with qid").":".$ad1." and code: ".$ad2."
    \n"; - $sql = "DELETE FROM {$dbprefix}answers WHERE qid=$ad1 AND code='$ad2'"; - $result=$connect->Execute($sql) or safe_die ("Couldn't Delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - if (isset($qdelete)) { - $integritycheck .= $clang->gT("Deleting questions").":
    \n"; - foreach ($qdelete as $qd) { - $integritycheck .= $clang->gT("Deleting qid").":".$qd."
    \n"; - $sql = "DELETE FROM {$dbprefix}questions WHERE qid=$qd"; - $result=$connect->Execute($sql) or safe_die ("Couldn't Delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - if (isset($gdelete)) { - $integritycheck .= $clang->gT("Deleting Groups").":
    \n"; - foreach ($gdelete as $gd) { - $integritycheck .= $clang->gT("Deleting group id").":".$gd."
    \n"; - $sql = "DELETE FROM {$dbprefix}groups WHERE gid=$gd"; - $result=$connect->Execute($sql) or safe_die ("Couldn't Delete ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - $integritycheck .= $clang->gT("Check database again?")."
    \n" - ."".$clang->gT("Check Again")."
    \n" - ."

    \n"; - } elseif ($ok == "R") - { - $integritycheck .= "
    \n" - . "
    ".$clang->gT("Data redundancy check")."
    \n" - . "".$clang->gT("Deleting old token and response tables leftover from deactivation")."

    \n"; - $oldsmultidelete=returnglobal('oldsmultidelete'); - $oldtmultidelete=returnglobal('oldtmultidelete'); - $oldsoptionaldelete=returnglobal('oldsoptionaldelete'); - $oldtoptionaldelete=returnglobal('oldtoptionaldelete'); - - if (isset($oldsoptionaldelete)) { //OLD Survey Tables with zero entries - $integritycheck .= $clang->gT("Deleting old survey result tables").":
    \n"; - foreach ($oldsoptionaldelete as $olds) { - $integritycheck .= $clang->gT("Deleting")." $olds
    \n"; - $sql = "DROP TABLE $olds"; - $result = $connect->Execute($sql) or safe_die ("Couldn't drop table $olds ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - - if (isset($oldsmultidelete)) { - $integritycheck .= $clang->gT("Deleting old survey result tables").":
    \n"; - foreach ($oldsmultidelete as $olds) { - $integritycheck .= $clang->gT("Deleting")." $olds
    \n"; - $sql = "DROP TABLE $olds"; - $result = $connect->Execute($sql) or safe_die ("Couldn't drop table $olds ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - - if (isset($oldtmultidelete)) { - $integritycheck .= $clang->gT("Deleting old token tables").":
    \n"; - foreach ($oldtmultidelete as $oldt) { - $integritycheck .= $clang->gT("Deleting")." $oldt
    \n"; - $sql = "DROP TABLE $oldt"; - $result = $connect->Execute($sql) or safe_die ("Couldn't drop table $oldt ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - - if (isset($oldtoptionaldelete)) { - $integritycheck .= $clang->gT("Deleting old token tables").":
    \n"; - foreach ($oldtoptionaldelete as $oldt) { - $integritycheck .= $clang->gT("Deleting")." $oldt
    \n"; - $sql = "DROP TABLE $oldt"; - $result = $connect->Execute($sql) or safe_die ("Couldn't drop table $oldt ($sql)
    ".$connect->ErrorMsg()); - } - $integritycheck .= "

    \n"; - } - - $integritycheck .= $clang->gT("Check database again?")."
    \n" - ."".$clang->gT("Check Again")."
    \n" - ."


    \n"; - - } - - $surveyid=false; -} -else -{ - $action = "dbchecker"; - include("access_denied.php"); - include("admin.php"); -} -?> diff --git a/include/limesurvey/admin/iterate_survey.php b/include/limesurvey/admin/iterate_survey.php deleted file mode 100644 index 30e456a1..00000000 --- a/include/limesurvey/admin/iterate_survey.php +++ /dev/null @@ -1,65 +0,0 @@ -gT('Iterate survey')); -$iteratesurveyoutput .= "
    ".$clang->gT("Iterate survey")."
    \n"; -$iteratesurveyoutput .= "
    ".$clang->gT("Important instructions")."
    " -. "
    ".$clang->gT("Click on the following button if you want to").":
    \n" -. "
      " -. "
    1. ".$clang->gT("Delete all incomplete answers that correspond to a token for which a completed answers is already recorded")."
    2. " -. "
    3. ".$clang->gT("Reset the completed answers to the incomplete state")."
    4. " -. "
    5. ".$clang->gT("Reset all your tokens to the 'not used' state")."
    6. " -. "

    \n" -. "gT("Are you really sure you want to *delete* some incomplete answers and reset the completed state of both answers and tokens?","js")."')){".get2post("$scriptname?action=iteratesurvey&sid=$surveyid&subaction=unfinalizeanswers")."}\" value='".$clang->gT("Reset answers and token completed state")."' />" -. "
    "; -} - -if ($subaction=='unfinalizeanswers') -{ - $iteratesurveyoutput = browsemenubar($clang->gT('Iterate survey')); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $surveytable = db_table_name("survey_$surveyid"); - // First delete incomplete answers that correspond to a token for which a completed answers is already recorded - // subquery in delete or update are tricky things when using the same table for delete and Select - // see http://www.developpez.net/forums/d494961/bases-donnees/mysql/requetes/cant-specify-target-in-from-clause/ - $updateqr = "DELETE from $surveytable WHERE submitdate IS NULL AND token in (SELECT * FROM ( SELECT answ2.token from $surveytable AS answ2 WHERE answ2.submitdate IS NOT NULL) tmp );\n"; - // $updateqr = "DELETE from $surveytable WHERE submitdate IS NULL AND token in (SELECT b.token from $surveytable AS b WHERE b.submitdate IS NOT NULL);\n"; - //error_log("TIBO query = $updateqr"); - $updateres = $connect->Execute($updateqr) or safe_die("Delete incomplete answers with duplicate tokens failed:
    \n" . $connect->ErrorMsg() . "
    $updateqr"); - // Then set all remaining answers to incomplete state - $updateqr = "UPDATE $surveytable SET submitdate=NULL, lastpage=NULL;\n"; - $updateres = $connect->Execute($updateqr) or safe_die("UnFinilize answers failed:
    \n" . $connect->ErrorMsg() . "
    $updateqr"); - // Finally, reset the token completed and sent status - $updateqr="UPDATE ".db_table_name("tokens_$surveyid")." SET sent='N', remindersent='N', remindercount=0, completed='N', usesleft=1 where usesleft=0"; - $updateres=$connect->Execute($updateqr) or safe_die ("Couldn't reset token completed state
    $updateqr
    ".$connect->ErrorMsg()); - $iteratesurveyoutput .= "
    \n"; - $iteratesurveyoutput .= "
    ".$clang->gT("Iterate survey")."
    \n"; - $iteratesurveyoutput .= "

    \n" - . "".$clang->gT("Success")."
    \n" - . $clang->gT("Answers and tokens have been re-opened.")."
    \n" - . "

    \n"; -} diff --git a/include/limesurvey/admin/labels.php b/include/limesurvey/admin/labels.php deleted file mode 100644 index 1913c64b..00000000 --- a/include/limesurvey/admin/labels.php +++ /dev/null @@ -1,714 +0,0 @@ -\n" - ."\t\t\n" - ."\t\n"; - $newgroupoutput .= "
    \n"; - - // $newgroupoutput .="\n\t
    \n" - $newgroupoutput .="\n"; - $newgroupoutput .= "
    gT("Error: You have to enter a group title for each language.",'js')."'); return false;}\" >"; - - foreach ($grplangs as $grouplang) - { - $newgroupoutput .= '
    '; - $newgroupoutput .= "
      " - . "
    • " - . "\n" - . " ".$clang->gT("Required")."
    • \n" - . "\t
    • \n" - . "" - . getEditor("group-desc","description_".$grouplang, "[".$clang->gT("Description:", "js")."](".$grouplang.")",$surveyid,'','',$action) - . "
    • \n" - // Group-Level Relevance - . "
    • " - . "" - . "
    • " - . "
    " - . "\t

    \n" - . "

    \n"; - } - - $newgroupoutput.= "\n" - . "\n" - . "
    \n"; - - - // Import TAB - if (bHasSurveyPermission($surveyid,'surveycontent','import')) - { - $newgroupoutput .= '
    '."\n" - . "
    \n" - . "
      \n" - . "
    • \n" - . "\n" - . "
    • \n" - . "
    • \n" - . "
    \n" - . "\t

    \n" - . "\t\n" - . "\t\n" - . "\t

    \n"; - // End Import TABS - $newgroupoutput.= "
    "; - } - - - - // End of TABS - $newgroupoutput.= ""; - - -} - - -if ($action == "editgroup") -{ - $grplangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - - $grplangs[] = $baselang; - $grplangs = array_flip($grplangs); - - $egquery = "SELECT * FROM ".db_table_name('groups')." WHERE sid=$surveyid AND gid=$gid"; - $egresult = db_execute_assoc($egquery); - while ($esrow = $egresult->FetchRow()) - { - if(!array_key_exists($esrow['language'], $grplangs)) // Language Exists, BUT ITS NOT ON THE SURVEY ANYMORE. - { - $egquery = "DELETE FROM ".db_table_name('groups')." WHERE sid='{$surveyid}' AND gid='{$gid}' AND language='".$esrow['language']."'"; - $egresultD = $connect->Execute($egquery); - } else { - $grplangs[$esrow['language']] = 99; - } - if ($esrow['language'] == $baselang) $basesettings = array('group_name' => $esrow['group_name'],'description' => $esrow['description'],'group_order' => $esrow['group_order'], 'grelevance' => $esrow['grelevance']); - - } - - while (list($key,$value) = each($grplangs)) - { - if ($value != 99) - { - $egquery = "INSERT INTO ".db_table_name('groups')." (gid, sid, group_name, description,group_order, grelevance, language) VALUES ('{$gid}', '{$surveyid}', '{$basesettings['group_name']}', '{$basesettings['description']}','{$basesettings['group_order']}', '{$basesettings['grelevance']}', '{$key}')"; - $egresult = $connect->Execute($egquery); - } - } - - $egquery = "SELECT * FROM ".db_table_name('groups')." WHERE sid=$surveyid AND gid=$gid AND language='$baselang'"; - $egresult = db_execute_assoc($egquery); - $editgroup = PrepareEditorScript(); - $esrow = $egresult->FetchRow(); - $tab_title[0] = getLanguageNameFromCode($esrow['language'],false). '('.$clang->gT("Base language").')'; - $esrow = array_map('htmlspecialchars', $esrow); - $tab_content[0] = "
    \n" - . "\n" - . "\t
    \n" - . "
    \n" - . "\n" - . getEditor("group-desc","description_".$esrow['language'], "[".$clang->gT("Description:", "js")."](".$esrow['language'].")",$surveyid,$gid,'',$action) - . "
    " - . "
    \n" - . "" - . "
    " - . "\n
    "; - $egquery = "SELECT * FROM ".db_table_name('groups')." WHERE sid=$surveyid AND gid=$gid AND language!='$baselang'"; - $egresult = db_execute_assoc($egquery); - $i = 1; - while ($esrow = $egresult->FetchRow()) - { - $tab_title[$i] = getLanguageNameFromCode($esrow['language'],false); - $esrow = array_map('htmlspecialchars', $esrow); - $tab_content[$i] = "
    \n" - . "\n" - . "\t
    \n" - . "
    \n" - . "\n" - . getEditor("group-desc","description_".$esrow['language'], "[".$clang->gT("Description:", "js")."](".$esrow['language'].")",$surveyid,$gid,'',$action) - . "\t
    "; - $i++; - } - - $editgroup .= "
    ".$clang->gT("Edit Group")."
    \n" - . "
    \n
      \n"; - - - foreach ($tab_title as $i=>$eachtitle){ - $editgroup .= "\t
    • $eachtitle
    • \n"; - - } - $editgroup.="
    \n"; - - foreach ($tab_content as $i=>$eachcontent){ - $editgroup .= "\n
    $eachcontent
    "; - } - - $editgroup .= "
    \n\t

    \n" - . "\t\n" - . "\t\n" - . "\t\n" - . "\t\n" - . "\t

    \n" - . "
    \n"; - -} - - -if ($action == "ordergroups") -{ - if(bHasSurveyPermission($surveyid,'surveycontent','update')) - { - // Check if one of the up/down buttons have been clicked - if (isset($_POST['groupordermethod']) && isset($_POST['sortorder'])) - { - $postsortorder=sanitize_int($_POST['sortorder']); - switch($_POST['groupordermethod']) - { - // Pressing the Up button - case 'up': - $newsortorder=$postsortorder-1; - $oldsortorder=$postsortorder; - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=-1 WHERE sid=$surveyid AND group_order=$newsortorder"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); //Checked - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=$newsortorder WHERE sid=$surveyid AND group_order=$oldsortorder"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); //Checked - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order='$oldsortorder' WHERE sid=$surveyid AND group_order=-1"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); //Checked - break; - - // Pressing the Down button - case 'down': - $newsortorder=$postsortorder+1; - $oldsortorder=$postsortorder; - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=-1 WHERE sid=$surveyid AND group_order=$newsortorder"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg());//Checked - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order='$newsortorder' WHERE sid=$surveyid AND group_order=$oldsortorder"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg());//Checked - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=$oldsortorder WHERE sid=$surveyid AND group_order=-1"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg());//Checked - break; - } - LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting - } - // Move the question to specific position - if ((!empty($_POST['groupmovefrom']) || (isset($_POST['groupmovefrom']) && $_POST['groupmovefrom'] == '0')) && (!empty($_POST['groupmoveto']) || (isset($_POST['groupmoveto']) && $_POST['groupmoveto'] == '0'))) - { - $newpos=(int)$_POST['groupmoveto']; - $oldpos=(int)$_POST['groupmovefrom']; - if($newpos > $oldpos) - { - //Move the group we're changing out of the way - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=-1 WHERE sid=$surveyid AND group_order=$oldpos"; - $cdresult=$connect->Execute($cdquery) or safe_die($cdquery."
    ".$connect->ErrorMsg()); - //Move all question_orders that are less than the newpos down one - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=group_order-1 WHERE sid=$surveyid AND group_order > $oldpos and group_order<=$newpos"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); - //Renumber the question we're changing - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=$newpos WHERE sid=$surveyid AND group_order=-1"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); - } - if(($newpos+1) < $oldpos) - { - //echo "Newpos $newpos, Oldpos $oldpos"; - //Move the question we're changing out of the way - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=-1 WHERE sid=$surveyid AND group_order=$oldpos"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); - //Move all question_orders that are later than the newpos up one - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=group_order+1 WHERE sid=$surveyid AND group_order > $newpos AND group_order <= $oldpos"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); - //Renumber the question we're changing - $cdquery = "UPDATE ".db_table_name('groups')." SET group_order=".($newpos+1)." WHERE sid=$surveyid AND group_order=-1"; - $cdresult=$connect->Execute($cdquery) or safe_die($connect->ErrorMsg()); - } - LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting - } - - $ordergroups = "
    ".$clang->gT("Change Group Order")."

    \n"; - - $ordergroups .= "
      "; - //Get the groups from this survey - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $ogquery = "SELECT * FROM {$dbprefix}groups WHERE sid='{$surveyid}' AND language='{$s_lang}' order by group_order,group_name" ; - $ogresult = db_execute_assoc($ogquery) or safe_die($connect->ErrorMsg());//Checked - - $ogarray = $ogresult->GetArray(); - //FIX BROKEN ORDER - //Check if all group_order numbers are consecutive - $consecutive=true; - $lastnumber=-1; - foreach($ogarray as $group) - { - if(($group['group_order']-1) != $lastnumber) - { - $consecutive=false; - } - $lastnumber=$group['group_order']; - } - //Fix bad ordering - if((isset($ogarray[0]['group_order']) && $ogarray[0]['group_order'] > 0) || !$consecutive) - { - $i=0; - foreach($ogarray as $group) - { - $fixorderq = "UPDATE ".db_table_name('groups')." SET group_order=$i WHERE sid=$surveyid AND group_order = ".$group['group_order']; - $foresult = db_execute_assoc($fixorderq) or safe_die($connect->ErrorMsg()); - $ogarray[$i]['group_order']=$i; - $i++; - } - } - //END FIX BROKEN ORDER - $miniogarray=$ogarray; - $groupcount = count($ogarray); - for($i=0; $i < $groupcount ; $i++) - { - $downdisabled = ""; - $updisabled = ""; - - $ordergroups.="
    • \n" ; - - // DROP DOWN LIST // - //Move to location - //$ordergroups.="
    • \n" ; - $ordergroups.="\t\n"; - - // BUTTONS // - $ordergroups.= "\n"; - - if ($i < $groupcount-1) - { - // Fill the hidden field 'sortorder' so we know what field is moved down - $ordergroups.= "\n"; - } - $ordergroups.=$ogarray[$i]['group_name']."
    • \n" ; - - } - - $ordergroups.="
    \n" - . "\n" - . "\n" - . "\n" - . "" - . "" - . "
    " ; - $ordergroups .="
    " ; - } - else - { - include("access_denied.php"); - } -} - - -?> diff --git a/include/limesurvey/admin/questionhandling.php b/include/limesurvey/admin/questionhandling.php deleted file mode 100644 index 1cdb334b..00000000 --- a/include/limesurvey/admin/questionhandling.php +++ /dev/null @@ -1,965 +0,0 @@ -".$clang->gT("Copy Question")."\n" - . "
    gT("Error: You have to enter a question code.",'js')."');\">\n" - . '
    '; - foreach ($questlangs as $language) - { - $egquery = "SELECT * FROM ".db_table_name('questions')." WHERE sid=$surveyid AND gid=$gid AND qid=$qid and language=".db_quoteall($language); - $egresult = db_execute_assoc($egquery); - $eqrow = $egresult->FetchRow(); - $eqrow = array_map('htmlspecialchars', $eqrow); - $editquestion .= '

    '.getLanguageNameFromCode($eqrow['language'],false); - if ($eqrow['language']==GetBaseLanguageFromSurveyID($surveyid)) - { - $editquestion .= "(".$clang->gT("Base language").")

      " - . "\t
    • \n" - . " ".$clang->gT("Note: You MUST enter a new question code!")."\n" - . "\t
    • \n"; - } - else { - $editquestion .= '
        '; - } - $editquestion .= "\t
      • \n" - . "\n" - . getEditor("question-text","question_".$eqrow['language'], "[".$clang->gT("Question:", "js")."](".$eqrow['language'].")",$surveyid,$gid,$qid,$action) - . "\t
      • \n" - . "\t
      • \n" - . "\n" - . getEditor("question-help","help_".$eqrow['language'], "[".$clang->gT("Help:", "js")."](".$eqrow['language'].")",$surveyid,$gid,$qid,$action) - . "\t
      • \n"; - $editquestion .= '
    '; - } - $editquestion .= "\t
      \n" - . "
    • \n" - . "
    • \n"; - - $editquestion .= "\t
    • \n" - . "\n" - . "\n" - . "
    • \n" - - // Relevance - ."
    • " - . "" - . "" - . "
    • \n" - - . "
    • \n" - . "
    • \n"; - - $editquestion .= "\t
    • \n" - . "\n" - . "".$clang->gT("No")." \n"; - - $editquestion .= "
    • \n" - . "" - . "
    • \n"; - $editquestion .= "
    • \n" - . "" - . "
    • \n" - . "
    • \n" - . "" - . "
    \n" - . "

    \n" - . "\n" - . "\n" - . "\n" - . "\t

    \n"; - - } - - -if ($action == "editdefaultvalues") -{ - $questlangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($questlangs,$baselang); - - $questionrow=$connect->GetRow("SELECT type, other, title, question, same_default FROM ".db_table_name('questions')." WHERE sid=$surveyid AND gid=$gid AND qid=$qid AND language='$baselang'"); - $qtproperties=getqtypelist('','array'); - - $editdefvalues="
    ".$clang->gT('Edit default answer values')."
    " - . '
    ' - . "
    \n"; - foreach ($questlangs as $language) - { - $editdefvalues .= '

    '.getLanguageNameFromCode($language,false).'

    '; - $editdefvalues.="
      "; - // If there are answerscales - if ($qtproperties[$questionrow['type']]['answerscales']>0) - { - for ($scale_id=0;$scale_id<$qtproperties[$questionrow['type']]['answerscales'];$scale_id++) - { - $editdefvalues.="
    • "; - } - else - { - $editdefvalues.=sprintf($clang->gT('Default answer value:'),$scale_id).""; - } - $defaultvalue=$connect->GetOne("SELECT defaultvalue FROM ".db_table_name('defaultvalues')." WHERE qid=$qid AND specialtype='' and scale_id={$scale_id} AND language='{$language}'"); - - $editdefvalues.="
    • "; - } - } - } - - // If there are subquestions and no answerscales - if ($qtproperties[$questionrow['type']]['answerscales']==0 && $qtproperties[$questionrow['type']]['subquestions']>0) - { - for ($scale_id=0;$scale_id<$qtproperties[$questionrow['type']]['subquestions'];$scale_id++) - { - $sqquery = "SELECT * FROM ".db_table_name('questions')." WHERE sid=$surveyid AND gid=$gid AND parent_qid=$qid and language=".db_quoteall($language)." and scale_id=0 order by question_order"; - $sqresult = db_execute_assoc($sqquery); - $sqrows = $sqresult->GetRows(); - if ($qtproperties[$questionrow['type']]['subquestions']>1) - { - $editdefvalues.="
      ".sprintf($clang->gT('Default answer for scale %s:'),$scale_id)."
      "; - } - if ($questionrow['type']=='M' || $questionrow['type']=='P') - { - $options=array(''=>$clang->gT(''),'Y'=>$clang->gT('Checked')); - } - $editdefvalues.="
        "; - - switch($questionrow['type']) - { - case 'L': - case 'M': - case 'O': - case 'P': - case '!': - $inputStyle='enum'; - break; - case 'K': - case 'Q': - $inputStyle='text'; - break; - } - if ($inputStyle == 'enum') - { - foreach ($sqrows as $aSubquestion) - { - $defaultvalue=$connect->GetOne("SELECT defaultvalue FROM ".db_table_name('defaultvalues')." WHERE qid=$qid AND specialtype='' and sqid={$aSubquestion['qid']} and scale_id={$scale_id} AND language='{$language}'"); - $editdefvalues.="
      • "; - $editdefvalues.="
      • \n"; - } - } - } - } - - if ($qtproperties[$questionrow['type']]['answerscales']==0 && $qtproperties[$questionrow['type']]['subquestions']==0) - { - /* - case 'D': - case 'N': - case 'S': - case 'T': - case 'U':* - */ - $defaultvalue=$connect->GetOne("SELECT defaultvalue FROM ".db_table_name('defaultvalues')." WHERE qid=$qid AND language='{$language}'"); - $editdefvalues.="
      • "; - $editdefvalues.="
      • \n"; - } - - if ($language==$baselang && count($questlangs)>1) - { - $editdefvalues.="
      '; - } - $ajaxoutput.="
      \n"; - $ajaxoutput.="{$qa['category']}\n
        "; - $currentfieldset=$qa['category']; - } - - $ajaxoutput .= "
      • " - .""; - - if (isset($qa['readonly']) && $qa['readonly']==true && $thissurvey['active']=='Y') - { - $ajaxoutput .= "$value"; - } - else - { - switch ($qa['inputtype']){ - case 'singleselect': $ajaxoutput .=" -
      • -
      • - -
      "; - $langs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - array_push($langs,$baselang); - - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - - $quotasoutput .= ' -
      '."\n\n"; - foreach ($langs as $lang) - { - //Get this one - $langquery = "SELECT * FROM ".db_table_name('quota_languagesettings')." WHERE quotals_quota_id='{$_POST['quota_id']}' AND quotals_language = '$lang'"; - $langresult = db_execute_assoc($langquery) or safe_die($connect->ErrorMsg()); - $langquotainfo = $langresult->FetchRow(); - $quotasoutput .= ' -
      -

      '.GetLanguageNameFromCode($lang,false); - if ($lang==$baselang) {$quotasoutput .= '('.$clang->gT("Base language").')';} - $quotasoutput .= "

      "; - - $quotasoutput.=' -
        -
      • - - -
      • -
      -
      '; - }; - $quotasoutput .= ' -

      - - - - - -

      '; - } - - $totalquotas=0; - $totalcompleted=0; - $csvoutput=array(); - if (($action == "quotas" && !isset($subaction)) || isset($viewquota)) - { - - $query = "SELECT * FROM ".db_table_name('quota')." , ".db_table_name('quota_languagesettings')." - WHERE ".db_table_name('quota').".id = ".db_table_name('quota_languagesettings').".quotals_quota_id - AND sid='".$surveyid."' - AND quotals_language = '".$baselang."' - ORDER BY name"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - - //create main quota
      and headlines - $quotasoutput .='
      '.$clang->gT("Survey quotas").'
      -
      - - - - - - - - - - - '; - - //NOTE: the footer always has to be put BEFORE the tbody tag! - $quotasoutput .=' - - - - - - - - - - - '; - - //if there are quotas let's proceed - if ($result->RecordCount() > 0) - { - //loop through all quotas - while ($quotalisting = $result->FetchRow()) - { - $quotasoutput .=' - - - - - - - - - - - '; - - //headline for quota sub-parts - $quotasoutput .=' - - - - - - - - '; - - //check how many sub-elements exist for a certain quota - $query = "SELECT id,code,qid FROM ".db_table_name('quota_members')." where quota_id='".$quotalisting['id']."'"; - $result2 = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - - if ($result2->RecordCount() > 0) - { - //loop through all sub-parts - while ($quota_questions = $result2->FetchRow()) - { - $question_answers = getQuotaAnswers($quota_questions['qid'],$surveyid,$quotalisting['id']); - $quotasoutput .=' - - - - - - - - '; - } - } - - } - - } - else - { - $quotasoutput .=' - - - '; - } - - $quotasoutput .=' - - - - - - - - - -
      '.$clang->gT("Quota name").''.$clang->gT("Status").''.$clang->gT("Quota action").''.$clang->gT("Completed").''.$clang->gT("Limit").''.$clang->gT("Action").'
           
      -
      '.$quotalisting['name'].''; - if ($quotalisting['active'] == 1) - { - $quotasoutput .= ''.$clang->gT("Active").''; - } else { - $quotasoutput .= ''.$clang->gT("Not Active").''; - } - $quotasoutput .=' - '; - if ($quotalisting['action'] == 1) - { - $quotasoutput .= $clang->gT("Terminate survey"); - } elseif ($quotalisting['action'] == 2) { - $quotasoutput .= $clang->gT("Terminate survey with warning"); - } - $totalquotas+=$quotalisting['qlimit']; - $completed=get_quotaCompletedCount($surveyid, $quotalisting['id']); - $highlight=($completed >= $quotalisting['qlimit']) ? "" : "style='color: orange'"; //Incomplete quotas displayed in red - $totalcompleted=$totalcompleted+$completed; - $csvoutput[]=$quotalisting['name'].",".$quotalisting['qlimit'].",".$completed.",".($quotalisting['qlimit']-$completed)."\r\n"; - - $quotasoutput .=' - '.$completed.''.$quotalisting['qlimit'].''; - if (bHasSurveyPermission($surveyid, 'quotas','update')) - { - $quotasoutput .='
      - - - - - -
      '; - } - if (bHasSurveyPermission($surveyid, 'quotas','delete')) - { - $quotasoutput .='
      - - - - - -
      '; - } - $quotasoutput .='
       '.$clang->gT("Question").''.$clang->gT("Answer").'  '; - if (bHasSurveyPermission($surveyid, 'quotas','update')) - { - $quotasoutput .='
      - - - - - -
      '; - } - $quotasoutput .='
       '.$question_answers[$quota_questions['code']]['Title'].''.$question_answers[$quota_questions['code']]['Display'].'   -
      - - - - - - - -
      -
      '.$clang->gT("No quotas have been set for this survey").'.
         '.$totalcompleted.''.$totalquotas.''; - if (bHasSurveyPermission($surveyid, 'quotas','create')) - { - $quotasoutput .='
      - - - - -
      '; - - } - $quotasoutput .='
      '; - } - - if(isset($_GET['quickreport']) && $_GET['quickreport']) - { - header("Content-Disposition: attachment; filename=results-survey".$surveyid.".csv"); - header("Content-type: text/comma-separated-values; charset=UTF-8"); - header("Pragma: public"); - echo $clang->gT("Quota name").",".$clang->gT("Limit").",".$clang->gT("Completed").",".$clang->gT("Remaining")."\r\n"; - foreach($csvoutput as $line) - { - echo $line; - } - die; - } - if(($subaction == "new_answer" || ($subaction == "new_answer_two" && !isset($_POST['quota_qid']))) && bHasSurveyPermission($surveyid,'quotas','create')) - { - if ($subaction == "new_answer_two") $_POST['quota_id'] = $_POST['quota_id']; - - $allowed_types = "(type ='G' or type ='M' or type ='Y' or type ='A' or type ='B' or type ='I' or type = 'L' or type='O' or type='!')"; - - $query = "SELECT name FROM ".db_table_name('quota')." WHERE id='".$_POST['quota_id']."'"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - while ($quotadetails = $result->FetchRow()) - { - $quota_name=$quotadetails['name']; - } - - $query = "SELECT qid, title, question FROM ".db_table_name('questions')."q JOIN ".db_table_name('groups')."g on g.gid=q.gid WHERE {$allowed_types} AND g.sid={$surveyid} AND q.language='{$baselang}' AND g.language='{$baselang}' order by group_order, question_order"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - if ($result->RecordCount() == 0) - { - $quotasoutput .="
      ".$clang->gT("Add Answer").": ".$clang->gT("Question Selection")."

      -
      - ".$clang->gT("Sorry there are no supported question types in this survey.")." -

      gT("Continue")."\"/> -
      "; - } else - { - $quotasoutput .='
      '.$clang->gT("Survey Quota").': '.$clang->gT("Add Answer").'

      -
      -
      -
      '.sprintf($clang->gt("New Answer for Quota '%s'"), $quota_name).'
      -
        -
      • - - -
      • -
      -

      - - - - - - -

      -
      '; - } - } - - if($subaction == "new_answer_two" && isset($_POST['quota_qid']) && bHasSurveyPermission($surveyid, 'quotas','create')) - { - array_walk( $_POST, 'db_quote', true); - - $query = "SELECT name FROM ".db_table_name('quota')." WHERE id='".$_POST['quota_id']."'"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - while ($quotadetails = $result->FetchRow()) - { - $quota_name=$quotadetails['name']; - } - - $question_answers = getQuotaAnswers($_POST['quota_qid'],$surveyid,$_POST['quota_id']); - $x=0; - - foreach ($question_answers as $qacheck) - { - if (isset($qacheck['rowexists'])) $x++; - } - - reset($question_answers); - - if (count($question_answers) == $x) - { - $quotasoutput .="
      ".$clang->gT("Add Answer").": ".$clang->gT("Question Selection")."

      -
      - ".$clang->gT("All answers are already selected in this quota.")." -

      gT("Continue")."\"/> -
      "; - } else - { - $quotasoutput .='
      '.$clang->gT("Survey Quota").': '.$clang->gT("Add Answer").'

      -
      -
      -
      '.sprintf($clang->gt("New Answer for Quota '%s'"), $quota_name).'
      -
        -
      • - -
      • -
      • - - -
      • -

      - - - - - - -

      -
      '; - } - } - - if ($subaction == "new_quota" && bHasSurveyPermission($surveyid, 'quotas','create')) - { - $quotasoutput.="
      ".$clang->gT("New quota").'
      '; - $quotasoutput.='
      '; - $quotasoutput.='
        -
      • - - -
      • -
      • - - -
      • -
      - '; - - $langs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - array_push($langs,$baselang); - - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - - $thissurvey=getSurveyInfo($surveyid); - - $quotasoutput .= ' -
      '."\n\n"; - foreach ($langs as $lang) - { - $quotasoutput .= ' -
      -

      '.GetLanguageNameFromCode($lang,false); - if ($lang==$baselang) {$quotasoutput .= '('.$clang->gT("Base language").')';} - $quotasoutput .= "

      "; - $quotasoutput.=' -
        -
      • - - -
      • -
      -
      '; - }; - - $quotasoutput .= ' - - - -
      -

      -

      '; - } - } - -?> diff --git a/include/limesurvey/admin/remotecontrol.php b/include/limesurvey/admin/remotecontrol.php deleted file mode 100644 index 680a3043..00000000 --- a/include/limesurvey/admin/remotecontrol.php +++ /dev/null @@ -1,152 +0,0 @@ - array('function' => 'getSessionKey'), - 'add_response' => array('function' => 'addResponse')); - -$s=new xmlrpc_server($config); -//$s->setdebug(3); -//$s->compress_response = true; -$s->service(); - -/** -* XML-RPC routine to create a session key -* -* @param array $request Array containing username and password -*/ -function getSessionKey($request) -{ - if (!is_object($request)) die(); - //$sUserName=$request->getParam(0); - //$sPassword=$request->getParam(1); - if (_doLogin()) - { - return new xmlrpcresp(new xmlrpcval('OK')); - } - else - { - return new xmlrpcresp(0, 1, 'Login failed'); - } -} - - -/** -* XML-RPC routine to add a response to the survey table -* Returns the id of the inserted survey response -* -* @param array $request Array containing the following elements (in that order): -* - Session key (string) -* - Survey ID (integer) -* - ResponseData (array) -* -*/ -function addResponse($request) -{ - global $connect,$dbprefix; - - if (!is_object($request)) die(); - - if ($request->getNumParams() != 3) - { - return new xmlrpcresp(0, 3, 'Missing parameters'); - } - - $sSessionKey=$request->getParam(0)->scalarVal(); - $iSurveyID=(int)$request->getParam(1)->scalarVal(); - $aResponseData=php_xmlrpc_decode($request->getParam(2)); - - if (!is_array($aResponseData)) - return new xmlrpcresp(0, '14', 'Survey data is not in array form'); - - $uid = _doLogin(); - - if($uid) - { - if(bHasSurveyPermission($iSurveyID,'responses','create',$uid)) - { - $surveytable = db_table_name("survey_".$iSurveyID); - if (!db_tables_exist($dbprefix."survey_".$iSurveyID)) - { - return new xmlrpcresp(0, '12', 'No survey table'); - } - - //set required values if not set - if (!isset($aResponseData['submitdate'])) $aResponseData['submitdate'] = date("Y-m-d H:i:s"); - if (!isset($aResponseData['datestamp'])) $aResponseData['datestamp'] = date("Y-m-d H:i:s"); - if (!isset($aResponseData['startdate'])) $aResponseData['startdate'] = date("Y-m-d H:i:s"); - if (!isset($aResponseData['startlanguage'])) $aResponseData['startlanguage'] = GetBaseLanguageFromSurveyID($iSurveyID); - $SQL = "INSERT INTO $surveytable - (".implode(',',array_keys($aResponseData)).") - VALUES - (".implode(',',array_map('db_quoteall',$aResponseData)).")"; - - $iinsert = $connect->Execute($SQL); - - if ($iinsert) - { - $thisid=$connect->Insert_ID(); - return new xmlrpcresp(new xmlrpcval($thisid,'int')); - } - else - { - //Failed to insert return error - return new xmlrpcresp(0, '13', 'Unable to add response'); - } - } - else - return new xmlrpcresp(0, '2', 'No permission'); - } - die(); -} - -/** -* Tries to login using webserver auth -* -* @param string $sUsername -* @param mixed $sPassword -*/ -function _doLogin($sUsername = '', $sPassword = '') -{ - global $connect,$useWebserverAuth; - if ($useWebserverAuth !== true) //only implement webserver auth atm - return false; - - if (!isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['REMOTE_USER'])) - $_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER']; - - - // getting user name, optionnally mapped - if (isset($userArrayMap) && is_array($userArrayMap) && - isset($userArrayMap[$_SERVER['PHP_AUTH_USER']])) - { - $mappeduser=$userArrayMap[$_SERVER['PHP_AUTH_USER']]; - } - else - { - $mappeduser=$_SERVER['PHP_AUTH_USER']; - } - - $query = "SELECT uid, users_name, password, parent_id, email, lang, htmleditormode, dateformat FROM ".db_table_name('users')." WHERE users_name=".$connect->qstr($mappeduser); - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; //Checked - $result = $connect->SelectLimit($query, 1) or safe_die ($query."
      ".$connect->ErrorMsg()); - - - if ($result->RecordCount() == 1) - { - $srow = $result->FetchRow(); - return $srow['uid']; - } - - return false; -} diff --git a/include/limesurvey/admin/remotecontrol/groups/.htaccess b/include/limesurvey/admin/remotecontrol/groups/.htaccess deleted file mode 100644 index 63680658..00000000 --- a/include/limesurvey/admin/remotecontrol/groups/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ -#tims Verzeichnisschutz -order deny,allow -deny from all -allow from 127.0.0.1 diff --git a/include/limesurvey/admin/remotecontrol/groups/BIO.csv b/include/limesurvey/admin/remotecontrol/groups/BIO.csv deleted file mode 100644 index 4ad7bb8f..00000000 --- a/include/limesurvey/admin/remotecontrol/groups/BIO.csv +++ /dev/null @@ -1,41 +0,0 @@ -# LimeSurvey Group Dump -# DBVersion 130 -# This is a dumped group from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# GROUPS TABLE -# -"gid","sid","group_name","group_order","description","language" -"43","10","Student BIO","6","Fragebogen für Biologistudenten
      ","de" - -# -# QUESTIONS TABLE -# -"qid","sid","gid","type","title","question","preg","help","other","mandatory","lid","lid1","question_order","language" -"211","10","43","L","1","Tragen Sie Biolatschen?
      ","","","N","N","0","0","1","de" - -# -# ANSWERS TABLE -# -"qid","code","answer","default_value","sortorder","language" -"211","1","ja","N","1","de" -"211","2","nein","N","2","de" -"211","3","geht dich nix an!","Y","3","de" - -# -# CONDITIONS TABLE -# - -# -# LABELSETS TABLE -# - -# -# LABELS TABLE -# - -# -# QUESTION_ATTRIBUTES TABLE -# diff --git a/include/limesurvey/admin/remotecontrol/groups/BWL.csv b/include/limesurvey/admin/remotecontrol/groups/BWL.csv deleted file mode 100644 index a6052e32..00000000 --- a/include/limesurvey/admin/remotecontrol/groups/BWL.csv +++ /dev/null @@ -1,43 +0,0 @@ -# LimeSurvey Group Dump -# DBVersion 130 -# This is a dumped group from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# GROUPS TABLE -# -"gid","sid","group_name","group_order","description","language" -"41","10","Student BWL","4","Fragemodul für BWL Studenten
      ","de" - -# -# QUESTIONS TABLE -# -"qid","sid","gid","type","title","question","preg","help","other","mandatory","lid","lid1","question_order","language" -"213","10","41","L","1","Wieviel ist Ihr Auto noch wert?
      ","","","N","N","0","0","1","de" - -# -# ANSWERS TABLE -# -"qid","code","answer","default_value","sortorder","language" -"213","1","nicht mehr als 1000€","N","1","de" -"213","2","nicht mehr als 10.000€","N","2","de" -"213","3","nicht mehr als 30.000€","N","3","de" -"213","4","keine Ahnung, hab ich von Papa","N","4","de" -"213","5","das Auto gehört zum Chauffeuerdienst","N","5","de" - -# -# CONDITIONS TABLE -# - -# -# LABELSETS TABLE -# - -# -# LABELS TABLE -# - -# -# QUESTION_ATTRIBUTES TABLE -# diff --git a/include/limesurvey/admin/remotecontrol/groups/Empty.csv b/include/limesurvey/admin/remotecontrol/groups/Empty.csv deleted file mode 100644 index c4b3d992..00000000 --- a/include/limesurvey/admin/remotecontrol/groups/Empty.csv +++ /dev/null @@ -1,35 +0,0 @@ -# LimeSurvey Group Dump -# DBVersion 133 -# This is a dumped group from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# GROUPS TABLE -# -"gid","sid","group_name","group_order","description","language" -"562","666","Zusätzliche Fragen","1","","de" - -# -# QUESTIONS TABLE -# - -# -# ANSWERS TABLE -# - -# -# CONDITIONS TABLE -# - -# -# LABELSETS TABLE -# - -# -# LABELS TABLE -# - -# -# QUESTION_ATTRIBUTES TABLE -# diff --git a/include/limesurvey/admin/remotecontrol/groups/INF.csv b/include/limesurvey/admin/remotecontrol/groups/INF.csv deleted file mode 100644 index 3f8e47c7..00000000 --- a/include/limesurvey/admin/remotecontrol/groups/INF.csv +++ /dev/null @@ -1,43 +0,0 @@ -# LimeSurvey Group Dump -# DBVersion 130 -# This is a dumped group from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# GROUPS TABLE -# -"gid","sid","group_name","group_order","description","language" -"42","10","Student INF","5","Fragebogen für Informatik Studenten
      ","de" - -# -# QUESTIONS TABLE -# -"qid","sid","gid","type","title","question","preg","help","other","mandatory","lid","lid1","question_order","language" -"212","10","42","L","1","Vieviele Computer haben Sie zu Hause?
      ","","Taschenrechner und Smartphones zählen nicht mit
      ","N","N","0","0","1","de" - -# -# ANSWERS TABLE -# -"qid","code","answer","default_value","sortorder","language" -"212","1","keinen","N","1","de" -"212","2","einen","N","2","de" -"212","3","mehr als einen","N","3","de" -"212","4","mehr als 5","N","4","de" -"212","5","da muß ich erstmal zählen gehen","N","5","de" - -# -# CONDITIONS TABLE -# - -# -# LABELSETS TABLE -# - -# -# LABELS TABLE -# - -# -# QUESTION_ATTRIBUTES TABLE -# diff --git a/include/limesurvey/admin/remotecontrol/groups/index.html b/include/limesurvey/admin/remotecontrol/groups/index.html deleted file mode 100644 index e69de29b..00000000 diff --git a/include/limesurvey/admin/remotecontrol/index.html b/include/limesurvey/admin/remotecontrol/index.html deleted file mode 100644 index e69de29b..00000000 diff --git a/include/limesurvey/admin/remotecontrol/lsrc.client.php b/include/limesurvey/admin/remotecontrol/lsrc.client.php deleted file mode 100644 index 41258988..00000000 --- a/include/limesurvey/admin/remotecontrol/lsrc.client.php +++ /dev/null @@ -1,453 +0,0 @@ -path2wsdl = $this->limeUrl.$this->wsdl; - // $this->user = $user; - // $this->pass = $pass; - $this->sid = $sid; - - //print_r(get_declared_classes()); - - ini_set("allow_url_fopen", 1); - $file = fopen($this->path2wsdl,"r"); - if(class_exists('SoapClient') && $file!=FALSE) - { - try - { - $this->soapClient = new SoapClient($this->path2wsdl, array('soap_version' => SOAP_1_1, - 'trace' => 1)); - return 1; - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - } - else - { - return 0; - } - } - /** - * Used in the testclient to show if the SOAP class is available, libXML is there in the minimum version and if the wsdl can be reached - * @return HTML String - */ - public function soapCheck () - { - $soapCheck ='
      '; - if(class_exists('SoapClient')) - { - $soapCheck .= "
      - SOAP Erweiterung existiert
      "; - } - else - { - $soapCheck .= "
      - SOAP Erweiterung fehlt!
      "; - } - if(LIBXML_VERSION>=20540) - { - $soapCheck .= "
      - libXML version '".LIBXML_DOTTED_VERSION."' OK
      "; - } - else - { - $soapCheck .= "
      - libXML version '".(LIBXML_DOTTED_VERSION )."' nicht OK
      "; - } - // Check ob eine wsdl Datei gefunden werden kann - //$wsdlfile = ; - - ini_set("allow_url_fopen", 1); - if (!fopen($this->path2wsdl,"r")) - { - $soapCheck .= "
      - Der Pfad zur WSDL Datei ist nicht korrekt oder die WSDL Datei fehlt!
      "; - } - else - { - $soapCheck .= "
      - WSDL Datei konnte gefunden werden
      "; - } - $soapCheck .= "
      -
      - - -
      -
      "; - return $soapCheck; - } - /** - * Used in the testclient to show the Serverfunctions, as given in the wsdl. - * @return HTML String - */ - public function getServerFunctions() - { - $return = "Client object public functions: (As given in the wsdl file. Functions could be disabled or else on the serverside. There is no guarantee the public functions really have these Params nor that the public functions exist on the serverside.)
      "; - if (!(!fopen($this->path2wsdl,"r"))) - { - $funcs = $this->soapClient->__getFunctions(); - - foreach($funcs as $func) - { - $return .= '

      '; - $return .= $func; - $return .= '

      '; - } - } - return $return; - } - /** - * Used by testclient to show the Request and Response. This is valuable information for debugging. - * @return HTML String - */ - public function getResponse() - { - $sOutput .="

      Dumping request headers:
      "
      -        .$this->soapClient->__getLastRequestHeaders()."
      "; - - $sOutput .="Dumping request:".htmlentities($this->soapClient->__getLastRequest()).""; - - $sOutput .="


      Dumping response headers:
      "
      -        .$this->soapClient->__getLastResponseHeaders()."
      "; - $sOutput .="
      Dumping response:
      ".htmlentities($this->soapClient->__getLastResponse()).""; - return $sOutput; - - } - /** - * Used to get the available module names for other functions like importQuestion, importGroup, createSurvey and so on - * @param $mode - can be 'core'(surveys), 'mod'(groups) or 'que'(questions) - * @return modules csv - */ - public function getAvailableModules ($mode = 'mod') - { - try - { - return $this->soapClient->sAvailableModules($this->user, $this->pass, $mode); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - } - /** - * Sends a statistic of a particular survey, to the given E-Mail adress - * @param $email - E-Mail adress of the reciever - * @param $type - 'pdf', 'xls' or 'html' is possible... the Format in which the statistic is delivered. pdf and xls will be an attachment - * @param $graph - '0' or '1' ... have only an effect on pdf statistics. If '1' graphs will be embedded in the pdf, '0' will embed no images in the pdf - * @return 'PDF send', 'HTML send, 'XLS send' or throws a SoapFault - */ - public function sendStatistics ( $email, $type = 'pdf', $graph) - { - try - { - $sReturn = $this->soapClient->fSendStatistic($this->user, $this->pass, $this->sid, $email, $type, $graph); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - return $sReturn; - } - /** - * returns the fieldmap of a particular survey - * @return fieldmap as csv - */ - public function getFieldmap() - { - - try - { - $sReturn = $this->soapClient->sGetFieldmap($this->user, $this->pass, $this->sid); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - return $sReturn; - } - /** - * sends invitation, reminder or custom Mails to participants in the token list of a particular survey - * @param $type - custom, remind, invite - * @param $maxmails - set the maximum amount of mails to be send in one go. repeat until all mails are send - * @param $subject - set the subject for custom mails - * @param $message - set the message for custom mails - * @return String ('No Mails to send', 'XX Mails send', 'XX Mails send, XX Mails left to send') - */ - public function sendMail( $type, $maxmails, $subject, $message) - { - - try - { - $sReturn = $this->soapClient->sSendEmail($this->user, $this->pass, $this->sid, $type, $maxmails, $subject, $message); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - - return $sReturn; - } - /** - * deletes a particular survey - * @return String 'Survey XX deleted' or a SoapFault - */ - public function deleteSurvey() - { - try - { - $sReturn = $this->soapClient->sDeleteSurvey($this->user, $this->pass, $this->sid); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - - return $sReturn; - } - /** - * imports a Matrix 5scale question. Normally there is a "Matrix5.csv" in directory 'que' which is used for this. But you can use an own exported Matrix 5 question with any other name of course - * @param $title - Question Code - * @param $question - The Question text - * @param $help - Help Text for this question - * @param $items - Items to rate on the 5scale, Comma seperated - * @param $module - optional Parameter, if not given, he tries with Matrix5, which should be OK - * @param $mandatory - optional paramter. If not given, the question will not be mandatory. Use 'Y' to make the question mandatory - * @return String 'OK' or throws a SoapFault - */ - public function importMatrix ($title, $question, $help, $items, $module = "Matrix5", $mandatory='N' ) - { - try - { - $sReturn = $this->soapClient->sImportMatrix($this->user, $this->pass, $this->sid, $title, $question, $help, $items, $module, $mandatory); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - - return $sReturn; - } - /** - * imports a Freetext Question. Normally there is a "Freitext.csv" in the directory 'que' which is used for this. - * @param $title - Question Code - * @param $question - The Question text - * @param $help - Help Text for this question - * @param $module - optional Parameter, if not given, he tries with 'Freitext', which should be OK - * @param $mandatory - optional paramter. If not given, the question will not be mandatory. Use 'Y' to make the question mandatory - * @return String "OK" or throws SoapFault - */ - public function importFreetext ($title, $question, $help, $module = "Freitext", $mandatory='N' ) - { - try - { - $sReturn = $this->soapClient->sImportFreetext($this->user, $this->pass, $this->sid, $title, $question, $module, $mandatory); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - - return $sReturn; - } - /** - * Imports a Question in questions directory. Use getAvailableModules('que') to get all available question.csv's to import. - * @param $module - name of the question file, without the filesuffix - * @param $mandatory - optional paramter. If not given, the question will not be mandatory. Use 'Y' to make the question mandatory - * @return String "OK" or throws SoapFault - */ - public function importQuestion ($module, $mandatory='N') - { - try - { - $sReturn = $this->soapClient->sImportQuestion($this->user, $this->pass, $this->sid, $module, $mandatory); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - - $sOutput .= "

      Return: ". $sReturn; - } - /** - * Imports a Group in groups directory. Use getAvailableModules('mod') to get all available group.csv's to import. - * @param $module - name of the group file, without the filesuffix - * @param $name - name of the Group - * @param $description - description text for the group - * @return String "Import OK" or throws SoapFault - */ - public function importGroup ($module, $name, $description) - { - try - { - $sReturn = $this->soapClient->sImportGroup($this->user, $this->pass, $this->sid, $module, $name, $description); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - - return $sReturn; - } - /** - * activates a survey - * @param $start - optional, set a startdate 'YYYY-MM-DD' - * @param $end - optional, set an enddate 'YYYY-MM-DD' - * @return surveyid of the activated survey or throws a SoapFault - */ - public function activateSurvey($start = "1980-01-01", $end = "1980-01-01") - { - try - { - $sReturn = $this->soapClient->sActivateSurvey($this->user, $this->pass, $this->sid, $start, $end); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - - return $sReturn; - } - /** - * potential bad function. You can crash your whole database with this. It is not enabled by default in the server. - * You can change ALL the db tables in Limesurvey with this. Only enable and use it, if you know 100% what you are doing - * @param $table - dbtable to change (without prefix) - * @param $key - field to change - * @param $value - value to set - * @param $where - the where clause - * @param $mode - insert or update - * @return unknown_type - */ - public function changeSurvey($table, $key, $value, $where, $mode) - { - try - { - $sReturn = $this->soapClient->sChangeSurvey($this->user, $this->pass, $table, $key, $value, $where, $mode); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - - return $sReturn; - } - /** - * Function to import a survey into the database and change some Values. - * @param $title - * @param $description - * @param $welcome - * @param $endtext - * @param $email - * @param $name - * @param $url - * @param $urldesc - * @param $module - * @param $autord - optional - * @return unknown_type - */ - public function createSurvey($title, $description, $welcome, $endtext, $email, $name, $url, $urldesc, $module, $autord='N') - { - try - { - $sReturn = $this->soapClient->sCreateSurvey($this->user, $this->pass, $this->sid, $title, $description, $welcome, $endtext, $email, $name, $url, $urldesc, $module, $autord); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - return $sReturn; - } - /** - * add Tokens to the token table of a particular survey, or create a new one, if it does not exist - * @param $tokencsv - * @return unknown_type - */ - public function insertToken($tokencsv) - { - try - { - $sReturn = $this->soapClient->sInsertToken($this->user, $this->pass, $this->sid, $tokencsv ); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - return $sReturn; - } - /** - * Function to insert Participant data while auto creating token if non is supported... - * @param $participantData - (FIRSTNAME;LASTNAME;EMAIL;LANG;TOKEN;VALIDFROM;VALIDTO;attrib1,attrib2,attrib3,attrib4,attrib5::) - * @return unknown_type - */ - public function insertParticipants($participantData) - { - try - { - $sReturn = $this->soapClient->sInsertParticipants($this->user, $this->pass, $this->sid, $participantData); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - return $sReturn; - } - /** - * function to return unused Tokens as String, seperated by commas, to get the people who did not complete the Survey - * @return String unused Tokes as csv - */ - public function tokenReturn () - { - try - { - $sReturn = $this->soapClient->sTokenReturn($this->user, $this->pass, $this->sid); - } - catch (SoapFault $fault) - { - throw new SoapFault($fault->faultcode, $fault->faultstring); - } - return $sReturn; - } - -} diff --git a/include/limesurvey/admin/remotecontrol/lsrc.config.php b/include/limesurvey/admin/remotecontrol/lsrc.config.php deleted file mode 100644 index 11b1752c..00000000 --- a/include/limesurvey/admin/remotecontrol/lsrc.config.php +++ /dev/null @@ -1,78 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/admin/remotecontrol/lsrc.helper.php b/include/limesurvey/admin/remotecontrol/lsrc.helper.php deleted file mode 100644 index d728d1d5..00000000 --- a/include/limesurvey/admin/remotecontrol/lsrc.helper.php +++ /dev/null @@ -1,2463 +0,0 @@ -surveyExists($iVid)) - { - $query2num = "SELECT owner_id FROM {$dbprefix}surveys WHERE sid=".sanitize_int($iVid).""; - $rs = db_execute_assoc($query2num); - $field=$rs->FetchRow(); - return $field['owner_id']; - - }else{return false;} - } - - /** - * This function changes data in LS-DB, its very sensitive, because every table can be changed. - * - * @param unknown_type $table - * @param unknown_type $key - * @param unknown_type $value - * @param unknown_type $where - * @return String - */ - function changeTable($table, $key, $value, $where, $mode='0')//XXX - {//be aware that this function may be a security risk - - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - if($mode=='' || !isset($mode) || $mode=='0') - { - $where = str_replace("\\","",$where); - $query2num = "SELECT {$key} FROM {$dbprefix}{$table} WHERE {$where}"; - $rs = db_execute_assoc($query2num); - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", OK ($query2num)"); - - $query2update = "update ".$dbprefix.$table." set ".$key."='".$value."' where ".$where.""; - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", OK ($query2update)"); - - if($connect->Execute($query2update)){ - return $rs->RecordCount()." Rows changed"; - } - else{ - return "nothing changed"; - } - } - if($mode==1 || $mode=='1') - { - $query2insert = "INSERT INTO {$dbprefix}{$table} ({$key}) VALUES ({$value});"; - $this->debugLsrc("wir sind in Line ".__LINE__.", inserting ($query2insert)"); - if($connect->Execute($query2insert)) - { - $this->debugLsrc("wir sind in Line ".__LINE__.", inserting OK"); - return true; - - } - else - { - return false; - } - } - - - } - - /** - * - * Enter description here... - * @param $surveyid - * @param $type - * @param $maxLsrcEmails - * @return unknown_type - */ - function emailSender($surveyid, $type, $maxLsrcEmails='') //XXX - { - global $publicurl,$maxemails; - global $connect,$sitename ; - global $dbprefix ; - $surveyid = sanitize_int($surveyid); - include("lsrc.config.php"); - - - - // wenn maxmails ber den lsrc gegeben wird das nutzen, ansonsten die default werte aus der config.php - if($maxLsrcEmails!='') - $maxemails = $maxLsrcEmails; - - switch ($type){ - case "custom": - - break; - case "invite": - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START invite "); - - - - if(isset($surveyid) && getEmailFormat($surveyid) == 'html') - { - $ishtml=true; - } - else - { - $ishtml=false; - } - - //$tokenoutput .= ("Sending Invitations"); - //if (isset($tokenid)) {$tokenoutput .= " (".("Sending to Token ID").": {$tokenid})";} - //$tokenoutput .= "\n"; - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", $surveyid, $type"); - // Texte für Mails aus der Datenbank holen und in die POST Dinger schreiben. Nicht schön aber praktikabel - - $sql = "SELECT surveyls_language, surveyls_email_invite_subj, surveyls_email_invite ". - "FROM {$dbprefix}surveys_languagesettings ". - "WHERE surveyls_survey_id = ".$surveyid." "; - - //GET SURVEY DETAILS - $thissurvey=getSurveyInfo($surveyid); - - // $connect->SetFetchMode(ADODB_FETCH_ASSOC); - // $sqlResult=$connect->Execute($sql); - $sqlResult = db_execute_assoc($sql); - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite "); - - while($languageRow = $sqlResult->FetchRow()) - { - $_POST['message_'.$languageRow['surveyls_language']] = $languageRow['surveyls_email_invite']; - $_POST['subject_'.$languageRow['surveyls_language']] = $languageRow['surveyls_email_invite_subj']; - } - - // if (isset($_POST['bypassbademails']) && $_POST['bypassbademails'] == 'Y') - // { - // $SQLemailstatuscondition = " AND emailstatus = 'OK'"; - // } - // else - // { - // $SQLemailstatuscondition = ""; - // } - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite "); - $ctquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE ((completed ='N') or (completed='')) AND ((sent ='N') or (sent='')) AND emailstatus = 'OK' "; - - if (isset($tokenid)) {$ctquery .= " AND tid='{$tokenid}'";} - //$tokenoutput .= "\n"; - $ctresult = $connect->Execute($ctquery); - $ctcount = $ctresult->RecordCount(); - $ctfieldcount = $ctresult->FieldCount(); - - $emquery = "SELECT * "; - //if ($ctfieldcount > 7) {$emquery .= ", attribute_1, attribute_2";} - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite "); - - $emquery .= " FROM ".db_table_name("tokens_{$surveyid}")." WHERE ((completed ='N') or (completed='')) AND ((sent ='N') or (sent='')) AND emailstatus = 'OK' "; - - if (isset($tokenid)) {$emquery .= " and tid='{$tokenid}'";} - //$tokenoutput .= "\n\n\n\n"; - $emresult = db_select_limit_assoc($emquery,$maxemails); - $emcount = $emresult->RecordCount(); - - //$tokenoutput .= "\n" - ////."\t\n" - //."\t\t
      \n"; - - $surveylangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselanguage = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($surveylangs,$baselanguage); - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite "); - - foreach ($surveylangs as $language) - { - $_POST['message_'.$language]=auto_unescape($_POST['message_'.$language]); - $_POST['subject_'.$language]=auto_unescape($_POST['subject_'.$language]); - if ($ishtml) $_POST['message_'.$language] = html_entity_decode($_POST['message_'.$language], ENT_QUOTES, $emailcharset); - - } - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite "); - if ($emcount > 0) - { - $mailsSend = 0; - while ($emrow = $emresult->FetchRow()) - { - $c=1; - unset($fieldsarray); - $to = $emrow['email']; - $fieldsarray["{EMAIL}"]=$emrow['email']; - $fieldsarray["{FIRSTNAME}"]=$emrow['firstname']; - $fieldsarray["{LASTNAME}"]=$emrow['lastname']; - $fieldsarray["{TOKEN}"]=$emrow['token']; - $fieldsarray["{LANGUAGE}"]=$emrow['language']; - while(isset($emrow["attribute_$c"])) - { - $fieldsarray["{ATTRIBUTE_$c}"]=$emrow["attribute_$c"]; - $fieldsarray["{TOKEN:ATTRIBUTE_$c}"]=$emrow["attribute_$c"]; - ++$c; - } - $fieldsarray["{ADMINNAME}"]= $thissurvey['adminname']; - $fieldsarray["{ADMINEMAIL}"]=$thissurvey['adminemail']; - $fieldsarray["{SURVEYNAME}"]=$thissurvey['name']; - $fieldsarray["{SURVEYDESCRIPTION}"]=$thissurvey['description']; - $fieldsarray["{EXPIRY}"]=$thissurvey["expiry"]; - - $emrow['language']=trim($emrow['language']); - if ($emrow['language']=='') {$emrow['language']=$baselanguage;} //if language is not give use default - $found = array_search($emrow['language'], $surveylangs); - if ($found==false) {$emrow['language']=$baselanguage;} - - $from = $thissurvey['adminemail']; - - - if ($ishtml === false) - { - if ( $modrewrite ) - { - $fieldsarray["{SURVEYURL}"]="$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}"; - } - else - { - $fieldsarray["{SURVEYURL}"]="$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; - } - } - else - { - if ( $modrewrite ) - { - $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}").""; - } - else - { - $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}").""; - } - } - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite "); - $modsubject=Replacefields($_POST['subject_'.$emrow['language']], $fieldsarray); - $modmessage=Replacefields($_POST['message_'.$emrow['language']], $fieldsarray); - - if (SendEmailMessage($modmessage, $modsubject, $to , $from, $sitename, $ishtml, getBounceEmail($surveyid))) - { - // Put date into sent - //$timeadjust = 0; - $today = date("Y-m-d H:i"); - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite Today:".$today); - $udequery = "UPDATE ".db_table_name("tokens_{$surveyid}")."\n" - ."SET sent='$today' WHERE tid={$emrow['tid']}"; - // - $uderesult = $connect->Execute($udequery); - $mailsSend++; - //$tokenoutput .= "[".("Invitation sent to:")."{$emrow['firstname']} {$emrow['lastname']} ($to)]\n"; - } - else - { - //$tokenoutput .= ReplaceFields(("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:")." ".$maildebug."", $fieldsarray); - if($n==1) - $failedAddresses .= ",".$to; - else - { - $failedAddresses = $to; - $n=1; - } - } - } - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite "); - if ($ctcount > $emcount) - { - $lefttosend = $ctcount-$maxemails; - - }else{$lefttosend = 0;} - } - else - { - return "No Mails to send"; - } - - if($maxemails>0 && $maxemails!='') - { - $returnValue = "".$mailsSend." Mails send. ".$lefttosend." Mails left to send"; - if(isset($failedAddresses)) - $returnValue .= "\nCould not send to: ".$failedAddresses; - return $returnValue; - } - - if(isset($mailsSend)) - { - $returnValue = "".$mailsSend." Mails send. "; - if(isset($failedAddresses)) - $returnValue .= "\nCould not send to: ".$failedAddresses; - return $returnValue; - } - - - - - break; - case "remind": - // XXX: - // TODO: - // if (!isset($_POST['ok']) || !$_POST['ok']) - // { - - /* - * look if there were reminders send in the past, and if some tokens got lesser reminders than others - * - * - if so: send reminders to the unremindet participants until they got the same remindcount than the others - * - if not: send reminders normally - */ - - $remSQL = "SELECT tid, remindercount " - . "FROM ".db_table_name("tokens_{$surveyid}")." " - . "WHERE (completed = 'N' or completed = '') AND sent <> 'N' and sent <>'' AND token <>'' AND EMAIL <>'' " - . "ORDER BY remindercount desc LIMIT 1"; - - $this->debugLsrc("Executing SQL: ".$remSQL); - - $remResult = db_execute_assoc($remSQL); - $remRow = $remResult->FetchRow(); - - /* Get the reminder count from the row, if we have a row. If - * we don't have a row then we set reminderCount to 0 to prevent - * queries down below from bombing out. */ - $reminderCount = $remRow['remindercount']; - if(empty($reminderCount)) { - $this->debugLsrc("There are no reminders to send."); - $reminderCount = 0; - } - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", remind ".$remRow['tid']."; ".$reminderCount." "); - - $sendOnlySQL = "SELECT tid, remindercount " - . "FROM ".db_table_name("tokens_{$surveyid}")." " - . "WHERE (completed = 'N' or completed = '') AND sent <> 'N' and sent <>'' AND token <>'' AND EMAIL <>'' AND remindercount < ".$reminderCount." " - . "ORDER BY tid asc LIMIT 1"; - - $this->debugLsrc("Executing SQL: ".$sendOnlySQL); - - if($sendOnlyResult->RecordCount()>0) - { - $sendOnlyRow = $sendOnlyResult->FetchRow(); - $starttokenid = $sendOnlyRow['tid']; - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", remind ".$sendOnlyRow['tid']."; ".$sendOnlyRow['remindercount']." "); - } - - if(isset($surveyid) && getEmailFormat($surveyid) == 'html') - { - $ishtml=true; - } - else - { - $ishtml=false; - } - - //GET SURVEY DETAILS - $thissurvey=getSurveyInfo($surveyid); - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", $surveyid, $type"); - // Texte für Mails aus der Datenbank holen. - - $sql = "SELECT surveyls_language, surveyls_email_remind_subj, surveyls_email_remind ". - "FROM {$dbprefix}surveys_languagesettings ". - "WHERE surveyls_survey_id = ".$surveyid." "; - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", invite "); - - $sqlResult = db_execute_assoc($sql); - - while($languageRow = $sqlResult->FetchRow()) - { - $_POST['message_'.$languageRow['surveyls_language']] = $languageRow['surveyls_email_remind']; - $_POST['subject_'.$languageRow['surveyls_language']] = $languageRow['surveyls_email_remind_subj']; - } - - //$tokenoutput .= ("Sending Reminders")."\n"; - - $surveylangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselanguage = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($surveylangs,$baselanguage); - - foreach ($surveylangs as $language) - { - $_POST['message_'.$language]=auto_unescape($_POST['message_'.$language]); - $_POST['subject_'.$language]=auto_unescape($_POST['subject_'.$language]); - - } - - $SQLemailstatuscondition = " AND emailstatus = 'OK'"; - - if (isset($_POST['maxremindercount']) && - $_POST['maxremindercount'] != '' && - intval($_POST['maxremindercount']) != 0) - { - $SQLremindercountcondition = " AND remindercount < ".intval($_POST['maxremindercount']); - } - else - { - $SQLremindercountcondition = ""; - } - - if (isset($_POST['minreminderdelay']) && - $_POST['minreminderdelay'] != '' && - intval($_POST['minreminderdelay']) != 0) - { - // $_POST['minreminderdelay'] in days (86400 seconds per day) - $compareddate = date_shift(date("Y-m-d H:i:s",time() - 86400 * intval($_POST['minreminderdelay'])), - "Y-m-d H:i",$timeadjust); - $SQLreminderdelaycondition = " AND ( " - . " (remindersent = 'N' AND sent < '".$compareddate."') " - . " OR " - . " (remindersent < '".$compareddate."'))"; - } - else - { - $SQLreminderdelaycondition = ""; - } - - $ctquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE (completed ='N' or completed ='') AND sent<>'' AND sent<>'N' AND token <>'' AND email <> '' $SQLemailstatuscondition $SQLremindercountcondition $SQLreminderdelaycondition"; - - if (isset($starttokenid)) {$ctquery .= " AND tid >= '{$starttokenid}'";} - // if (isset($tokenid) && $tokenid) {$ctquery .= " AND tid = '{$tokenid}'";} - // //$tokenoutput .= "\n"; - - $ctresult = $connect->Execute($ctquery) or $this->debugLsrc ("Database error!\n" . $connect->ErrorMsg()); - $ctcount = $ctresult->RecordCount(); - $ctfieldcount = $ctresult->FieldCount(); - $emquery = "SELECT * "; - //if ($ctfieldcount > 7) {$emquery .= ", attribute_1, attribute_2";} - - // TLR change to put date into sent - $emquery .= " FROM ".db_table_name("tokens_{$surveyid}")." WHERE (completed = 'N' or completed = '') AND sent <> 'N' and sent <>'' AND token <>'' AND EMAIL <>'' $SQLemailstatuscondition $SQLremindercountcondition $SQLreminderdelaycondition"; - - if (isset($starttokenid)) {$emquery .= " AND tid >= '{$starttokenid}'";} - if (isset($tokenid) && $tokenid) {$emquery .= " AND tid = '{$tokenid}'";} - $emquery .= " ORDER BY tid "; - $emresult = db_select_limit_assoc($emquery, $maxemails); - //$emresult = db_execute_assoc($emquery); - $emcount = $emresult->RecordCount(); - - if ($emcount > 0) - { - while ($emrow = $emresult->FetchRow()) - { - $c=1; - unset($fieldsarray); - $to = $emrow['email']; - $fieldsarray["{EMAIL}"]=$emrow['email']; - $fieldsarray["{FIRSTNAME}"]=$emrow['firstname']; - $fieldsarray["{LASTNAME}"]=$emrow['lastname']; - $fieldsarray["{TOKEN}"]=$emrow['token']; - $fieldsarray["{LANGUAGE}"]=$emrow['language']; - while(isset($emrow["attribute_$c"])) - { - $fieldsarray["{ATTRIBUTE_$c}"]=$emrow["attribute_$c"]; - $fieldsarray["{TOKEN:ATTRIBUTE_$c}"]=$emrow["attribute_$c"]; - ++$c; - } - - $fieldsarray["{ADMINNAME}"]= $thissurvey['adminname']; - $fieldsarray["{ADMINEMAIL}"]=$thissurvey['adminemail']; - $fieldsarray["{SURVEYNAME}"]=$thissurvey['name']; - $fieldsarray["{SURVEYDESCRIPTION}"]=$thissurvey['description']; - $fieldsarray["{EXPIRY}"]=$thissurvey["expiry"]; - - $emrow['language']=trim($emrow['language']); - if ($emrow['language']=='') {$emrow['language']=$baselanguage;} //if language is not give use default - if(!in_array($emrow['language'], $surveylangs)) {$emrow['language']=$baselanguage;} // if given language is not available use default - $found = array_search($emrow['language'], $surveylangs); - if ($found==false) {$emrow['language']=$baselanguage;} - - $from = $thissurvey['adminemail']; - - if (getEmailFormat($surveyid) == 'html') - { - $ishtml=true; - } - else - { - $ishtml=false; - } - - if ($ishtml == false) - { - if ( $modrewrite ) - { - $fieldsarray["{SURVEYURL}"]="$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}"; - } - else - { - $fieldsarray["{SURVEYURL}"]="$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; - } - } - else - { - if ( $modrewrite ) - { - $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}").""; - } - else - { - $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}").""; - $_POST['message_'.$emrow['language']] = html_entity_decode($_POST['message_'.$emrow['language']], ENT_QUOTES, $emailcharset); - } - } - - $msgsubject=Replacefields($_POST['subject_'.$emrow['language']], $fieldsarray); - $sendmessage=Replacefields($_POST['message_'.$emrow['language']], $fieldsarray); - - if (SendEmailMessage($sendmessage, $msgsubject, $to, $from, $sitename, $ishtml, getBounceEmail($surveyid))) - { - - // Put date into remindersent - $today = date("Y-m-d H:i"); - $udequery = "UPDATE ".db_table_name("tokens_{$surveyid}")."\n" - ."SET remindersent='$today',remindercount = remindercount+1 WHERE tid={$emrow['tid']}"; - // - $uderesult = $connect->Execute($udequery) or $this->debugLsrc ("Could not update tokens$udequery".$connect->ErrorMsg()); - //orig: $tokenoutput .= "\t\t\t({$emrow['tid']})[".("Reminder sent to:")." {$emrow['firstname']} {$emrow['lastname']}]\n"; - //$tokenoutput .= "\t\t\t({$emrow['tid']}) [".("Reminder sent to:")." {$emrow['firstname']} {$emrow['lastname']} ($to)]\n"; - $mailsSend++; - } - else - { - //$tokenoutput .= ReplaceFields(("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:")." ".$maildebug."", $fieldsarray); - if($n==1) - $failedAddresses .= ",".$to; - else - { - $failedAddresses = $to; - $n=1; - } - - } - //$lasttid = $emrow['tid']; - - } - if ($ctcount > $emcount) - { - $lefttosend = $ctcount-$maxemails; - }else{$lefttosend = 0;} - } - else - { - return "No Reminders to send"; - } - - if($maxemails>0) - { - $returnValue = "".$mailsSend." Reminders send. ".$lefttosend." Reminders left to send"; - if(isset($failedAddresses)) - $returnValue .= "\nCould not send to: ".$failedAddresses; - return $returnValue; - } - - if(isset($mailsSend)) - { - $returnValue = "".$mailsSend." Reminders send. "; - if(isset($failedAddresses)) - $returnValue .= "\nCould not send to: ".$failedAddresses; - return $returnValue; - } - - - break; - default: - - break; - } - } - - /** - * loginCheck for Lsrc, checks if the user with given password exists in LS Database and - * sets the SESSION rights for this user - * @param String $sUser - * @param String $sPass - * @return boolean - */ - function checkUser($sUser, $sPass) // XXX - { - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - require(dirname(__FILE__)."/../classes/core/sha256.php"); - - $query="SELECT uid, password, lang, superadmin FROM {$dbprefix}users WHERE users_name=".$connect->qstr(sanitize_user($sUser)); - // echo $query; - $result = db_execute_assoc($query); - $gv = $result->FetchRow(); - if($result->RecordCount() < 1) - { - return false; - } - else - { - if((SHA256::hashing($sPass)==$gv['password'])) - { - $_SESSION['loginID']=$gv['uid']; - $_SESSION['lang']=$gv['lang']; - - $squery = "SELECT create_survey, configurator, create_user, delete_user, superadmin, manage_template, manage_label FROM {$dbprefix}users WHERE uid={$gv['uid']}"; - $sresult = db_execute_assoc($squery); //Checked - if ($sresult->RecordCount()>0) - { - $fields = $sresult->FetchRow(); - $_SESSION['USER_RIGHT_CREATE_SURVEY'] = $fields['create_survey']; - $_SESSION['USER_RIGHT_CONFIGURATOR'] = $fields['configurator']; - $_SESSION['USER_RIGHT_CREATE_USER'] = $fields['create_user']; - $_SESSION['USER_RIGHT_DELETE_USER'] = $fields['delete_user']; - $_SESSION['USER_RIGHT_SUPERADMIN'] = $fields['superadmin']; - $_SESSION['USER_RIGHT_MANAGE_TEMPLATE'] = $fields['manage_template']; - $_SESSION['USER_RIGHT_MANAGE_LABEL'] = $fields['manage_label']; - } - return true; - } - else - { - return false; - } - } - } - - /** - * Lsrc checks the existence of Surveys more than one time, so this makes sense to be DRY - * - * @param int $sid - * @return boolean - */ - function surveyExists($sid)//XXX - { - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - - $query="SELECT * FROM {$dbprefix}surveys WHERE sid = ".$sid; - // echo $query; - $result = db_execute_assoc($query); - if($result->RecordCount() < 1) - { - return false; - } - else - { - return true; - } - } - - /** - * function to import surveys - * - * @param $iVid - desired survey id - * @param $importFile - name of the file to import in core(survey) dir - * @return boolean - */ - function importSurvey($iVid, $importFile) - { - global $connect ; - global $dbprefix ; - global $clang; - - include("lsrc.config.php"); - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", OK "); - // HINT FOR IMPORTERS: go to Line 714 to manipulate the Survey, while it's imported - - $the_full_file_path = $coreDir.$importFile; - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",the_full_file_path ='$the_full_file_path' OK "); - - include("../import_functions.php"); - include("../admin_functions.php"); - if (!isset($copyfunction)) - { - $sFullFilepath=$the_full_file_path; - $aPathInfo = pathinfo($sFullFilepath); - $sExtension = $aPathInfo['extension']; - } - - if (isset($sExtension) && strtolower($sExtension)=='csv') - { - $aImportResults=CSVImportSurvey($sFullFilepath,$iVid); - } - elseif (isset($sExtension) && strtolower($sExtension)=='lss') - { - $aImportResults=XMLImportSurvey($sFullFilepath,NULL,NULL,$iVid); - } elseif (isset($copyfunction)) - { - $aImportResults=XMLImportSurvey('',$copysurveydata,$sNewSurveyName,$iVid); - } - - //CANNOT BE USED BY LSRC RIGHT NOW - // Translate INSERTANS codes if chosen -// if (isset($aImportResults['fieldnames']) && $sTransLinks === true) -// { -// transInsertAns($aImportResults['newsid'],$aImportResults['oldsid'],$aImportResults['fieldnames']); -// } - - return $aImportResults['newsid']; - } - - /** - * function to activate surveys based on new activate.php 5771 2008-10-13 02:28:40Z jcleeland $ - * - * @param unknown_type $surveyid - * @return boolean - */ - function activateSurvey($surveyid)//XXX activateSurvey - { - global $dbprefix, $connect, $clang, $databasetype,$databasetabletype; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - include('../admin_functions.php'); - include('../activate_functions.php'); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - $returnOutput = activateSurvey($surveyid,$surveyid,'lsrc'); - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", $returnOutput "); - - return $returnOutput; - } // end activateSurvey(); - - /** - * not used, a test, thought this could maybe enhance security, may be deleted - * - * @return Error 404 fake - */ - function fake404()// XXX - { - return ' - - - Objekt nicht gefunden! - - - - - -

      Objekt nicht gefunden!

      -

      - - - Der angeforderte URL konnte auf dem Server nicht gefunden werden. - - - - Sofern Sie den URL manuell eingegeben haben, - überprüfen Sie bitte die Schreibweise und versuchen Sie es erneut. - - - -

      -

      - Sofern Sie dies für eine Fehlfunktion des Servers halten, - informieren Sie bitte den - Webmaster - hierüber. - -

      - -

      Error 404

      -
      - - '.$_SERVER["SERVER_NAME"].' - - '.date("m/d/Y H:i:s").' - Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8i mod_autoindex_color PHP/5.2.6 mod_jk/1.2.26 -
      - - - - '; - } - - /** - * importing a group into an existing survey - * - * @param int $iVid SurveyID - * @param string $sMod Group that should be loaded into the Survey - */ - function importGroup($surveyid, $sMod) //XXX - { - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - $newsid = $surveyid; - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - - $the_full_file_path = $modDir.$sMod.".csv"; - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK $the_full_file_path "); - - $handle = fopen($the_full_file_path, "r"); - while (!feof($handle)) - { - $buffer = fgets($handle); - $bigarray[] = $buffer; - } - fclose($handle); - - if (substr($bigarray[0], 0, 23) != "# LimeSurvey Group Dump" && substr($bigarray[0], 0, 24) != "# PHPSurveyor Group Dump") - { - //$importgroup .= "".("Error")."\n"; - //$importgroup .= ("This file is not a LimeSurvey group file. Import failed.")."\n"; - //$importgroup .= "\n"; - //$importgroup .= "
      \n"; - //unlink($the_full_file_path); - return false; - } - - for ($i=0; $i<9; $i++) - { - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - - //GROUPS - if (array_search("# QUESTIONS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUESTIONS TABLE\n", $bigarray); - } - elseif (array_search("# QUESTIONS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUESTIONS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$grouparray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //QUESTIONS - if (array_search("# ANSWERS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray); - } - elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$questionarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //ANSWERS - if (array_search("# CONDITIONS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# CONDITIONS TABLE\n", $bigarray); - } - elseif (array_search("# CONDITIONS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# CONDITIONS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$answerarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //CONDITIONS - if (array_search("# LABELSETS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray); - } - elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray); - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$conditionsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //LABELSETS - if (array_search("# LABELS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\n", $bigarray); - } - elseif (array_search("# LABELS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //LABELS - if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray); - } - elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //LAST LOT (now question_attributes) - if (!isset($noconditions) || $noconditions != "Y") - { - // stoppoint is the last line number - // this is an empty line after the QA CSV lines - $stoppoint = count($bigarray)-1; - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<=$stoppoint-1) {$question_attributesarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - } - $bigarray = array_values($bigarray); - - $countgroups=0; - if (isset($questionarray)) - { - $questionfieldnames=convertCSVRowToArray($questionarray[0],',','"'); - unset($questionarray[0]); - $countquestions = 0; - } - - if (isset($answerarray)) - { - $answerfieldnames=convertCSVRowToArray($answerarray[0],',','"'); - unset($answerarray[0]); - $countanswers = 0; - } - - $countconditions = 0; - $countlabelsets=0; - $countlabels=0; - $countquestion_attributes = 0; - $countanswers = 0; - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - // first check that imported group, questions and labels support the - // current survey's baselang - $langcode = GetBaseLanguageFromSurveyID($newsid); - if (isset($grouparray)) - { - $groupfieldnames = convertCSVRowToArray($grouparray[0],',','"'); - $langfieldnum = array_search("language", $groupfieldnames); - $gidfieldnum = array_search("gid", $groupfieldnames); - $groupssupportbaselang = bDoesImportarraySupportsLanguage($grouparray,Array($gidfieldnum),$langfieldnum,$langcode,true); - if (!$groupssupportbaselang) - { - //$importgroup .= "".("Error")."\n"; - //$importgroup .= ("You can't import a group which doesn't support the current survey's base language.")."\n"; - //$importgroup .= "\n"; - //$importgroup .= "
    \n"; - //unlink($the_full_file_path); - return "Group does not support Surveys Baselanguage ($langcode)"; - } - } - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - if (isset($questionarray)) - { - $langfieldnum = array_search("language", $questionfieldnames); - $qidfieldnum = array_search("qid", $questionfieldnames); - $questionssupportbaselang = bDoesImportarraySupportsLanguage($questionarray,Array($qidfieldnum), $langfieldnum,$langcode,false); - if (!$questionssupportbaselang) - { - //$importgroup .= "".("Error")."\n"; - //$importgroup .= ("You can't import a question which doesn't support the current survey's base language.")."\n"; - //$importgroup .= "\n"; - //$importgroup .= "\n"; - //unlink($the_full_file_path); - return "Group does not support Surveys Baselanguage ($langcode)"; - } - } - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - if (isset($labelsetsarray)) - { - $labelsetfieldname = convertCSVRowToArray($labelsetsarray[0],',','"'); - $langfieldnum = array_search("languages", $labelsetfieldname); - $lidfilednum = array_search("lid", $labelsetfieldname); - $labelsetssupportbaselang = bDoesImportarraySupportsLanguage($labelsetsarray,Array($lidfilednum),$langfieldnum,$langcode,true); - if (!$labelsetssupportbaselang) - { - $importquestion .= "".("Error")."\n" - .("You can't import label sets which don't support the current survey's base language")."\n" - ."\n"; - //unlink($the_full_file_path); - return "Group does not support Surveys Baselanguage ($langcode)"; - } - } - - $newlids = array(); // this array will have the "new lid" for the label sets, the key will be the "old lid" - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //DO ANY LABELSETS FIRST, SO WE CAN KNOW WHAT THEIR NEW LID IS FOR THE QUESTIONS - if (isset($labelsetsarray) && $labelsetsarray) { - $csarray=buildLabelSetCheckSumArray(); // build checksums over all existing labelsets - $count=0; - foreach ($labelsetsarray as $lsa) { - $fieldorders =convertCSVRowToArray($labelsetsarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($lsa,',','"'); - if ($count==0) {$count++; continue;} - - $countlabelsets++; - - $labelsetrowdata=array_combine($fieldorders,$fieldcontents); - - // Save old labelid - $oldlid=$labelsetrowdata['lid']; - // set the new language - unset($labelsetrowdata['lid']); - $newvalues=array_values($labelsetrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lsainsert = "INSERT INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $lsiresult=$connect->Execute($lsainsert); - - // Get the new insert id for the labels inside this labelset - $newlid=$connect->Insert_ID("{$dbprefix}labelsets",'lid'); - - if ($labelsarray) { - $count=0; - foreach ($labelsarray as $la) { - $lfieldorders =convertCSVRowToArray($labelsarray[0],',','"'); - $lfieldcontents=convertCSVRowToArray($la,',','"'); - if ($count==0) {$count++; continue;} - - // Combine into one array with keys and values since its easier to handle - $labelrowdata=array_combine($lfieldorders,$lfieldcontents); - $labellid=$labelrowdata['lid']; - if ($labellid == $oldlid) { - $labelrowdata['lid']=$newlid; - - // translate internal links - $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']); - - $newvalues=array_values($labelrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lainsert = "INSERT INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $liresult=$connect->Execute($lainsert); - $countlabels++; - } - } - } - - //CHECK FOR DUPLICATE LABELSETS - $thisset=""; - $query2 = "SELECT code, title, sortorder, language - FROM {$dbprefix}labels - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or $this->debugLsrc("Died querying labelset $lid$query2".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - if (isset($csarray)) - { - foreach($csarray as $key=>$val) - { - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch)) - { - //There is a matching labelset. So, we will delete this one and refer - //to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or $this->debugLsrc("Couldn't delete labels$query".$connect->ErrorMsg()); - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or $this->debugLsrc("Couldn't delete labelset$query".$connect->ErrorMsg()); - $newlid=$lsmatch; - } - else - { - //There isn't a matching labelset, add this checksum to the $csarray array - $csarray[$newlid]=$newcs; - } - //END CHECK FOR DUPLICATES - $labelreplacements[]=array($oldlid, $newlid); - $newlids[$oldlid] = $newlid; - } - } - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //these arrays will aloud to insert correctly groups an questions multi languague survey imports correctly, and will eliminate the need to "searh" the imported data - //$newgids = array(); // this array will have the "new gid" for the groups, the kwy will be the "old gid" <-- not needed when importing groups - $newqids = array(); // this array will have the "new qid" for the questions, the kwy will be the "old qid" - - // DO GROUPS, QUESTIONS FOR GROUPS, THEN ANSWERS FOR QUESTIONS IN A __NOT__ NESTED FORMAT! - if (isset($grouparray) && $grouparray) - { - $surveylanguages=GetAdditionalLanguagesFromSurveyID($surveyid); - $surveylanguages[]=GetBaseLanguageFromSurveyID($surveyid); - - // do GROUPS - $gafieldorders=convertCSVRowToArray($grouparray[0],',','"'); - unset($grouparray[0]); - $newgid = 0; - $group_order = 0; // just to initialize this variable - foreach ($grouparray as $ga) - { - //GET ORDER OF FIELDS - $gacfieldcontents=convertCSVRowToArray($ga,',','"'); - $grouprowdata=array_combine($gafieldorders,$gacfieldcontents); - - // Skip not supported languages - if (!in_array($grouprowdata['language'],$surveylanguages)) - { - $skippedlanguages[]=$grouprowdata['language']; // this is for the message in the end. - continue; - } - - // replace the sid - $oldsid=$grouprowdata['sid']; - $grouprowdata['sid']=$newsid; - - // replace the gid or remove it if needed (it also will calculate the group order if is a new group) - $oldgid=$grouprowdata['gid']; - if ($newgid == 0) - { - unset($grouprowdata['gid']); - - // find the maximum group order and use this grouporder+1 to assign it to the new group - $qmaxgo = "select max(group_order) as maxgo from ".db_table_name('groups')." where sid=$newsid"; - $gres = db_execute_assoc($qmaxgo) or $this->debugLsrc (("Error")." Failed to find out maximum group order value\n$qmaxqo\n".$connect->ErrorMsg()); - $grow=$gres->FetchRow(); - $group_order = $grow['maxgo']+1; - } - else - $grouprowdata['gid'] = $newgid; - - $grouprowdata["group_order"]= $group_order; - - // Everything set - now insert it - $grouprowdata=array_map('convertCsvreturn2return', $grouprowdata); - - - // translate internal links - $grouprowdata['group_name']=translink('survey', $oldsid, $newsid, $grouprowdata['group_name']); - $grouprowdata['description']=translink('survey', $oldsid, $newsid, $grouprowdata['description']); - - $newvalues=array_values($grouprowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $ginsert = "insert INTO {$dbprefix}groups (".implode(',',array_keys($grouprowdata)).") VALUES (".implode(',',$newvalues).")"; - $gres = $connect->Execute($ginsert) or $this->debugLsrc("Error: ".": Failed to insert group\n$ginsert\n".$connect->ErrorMsg()); - - //GET NEW GID .... if is not done before and we count a group if a new gid is required - if ($newgid == 0) - { - $newgid = $connect->Insert_ID("{$dbprefix}groups",'gid'); - $countgroups++; - } - } - // GROUPS is DONE - - // do QUESTIONS - if (isset($questionarray) && $questionarray) - { - foreach ($questionarray as $qa) - { - $qacfieldcontents=convertCSVRowToArray($qa,',','"'); - $questionrowdata=array_combine($questionfieldnames,$qacfieldcontents); - - // Skip not supported languages - if (!in_array($questionrowdata['language'],$surveylanguages)) - continue; - - // replace the sid - $questionrowdata["sid"] = $newsid; - - // replace the gid (if the gid is not in the oldgid it means there is a problem with the exported record, so skip it) - if ($questionrowdata['gid'] == $oldgid) - $questionrowdata['gid'] = $newgid; - else - continue; // a problem with this question record -> don't consider - - // replace the qid or remove it if needed - $oldqid = $questionrowdata['qid']; - if (isset($newqids[$oldqid])) - $questionrowdata['qid'] = $newqids[$oldqid]; - else - unset($questionrowdata['qid']); - - // replace the lid for the new one (if there is no new lid in the $newlids array it mean that was not imported -> error, skip this record) - if (in_array($questionrowdata["type"], array("F","W","Z","H", "1", ":", ";"))) // only fot the questions that uses a label set. - if (isset($newlids[$questionrowdata["lid"]])) - { - $questionrowdata["lid"] = $newlids[$questionrowdata["lid"]]; - if(isset($newlids[$questionrowdata["lid1"]])) - { - $questionrowdata["lid1"] = $newlids[$questionrowdata["lid1"]]; - } - } - else - { - continue; // a problem with this question record -> don't consider - } - // $other = $questionrowdata["other"]; //Get 'other' field value - // $oldlid = $questionrowdata['lid']; - - // Everything set - now insert it - $questionrowdata=array_map('convertCsvreturn2return', $questionrowdata); - - // translate internal links ///XXX rakete may change question data here - // $questionrowdata['title']=translink('survey', $oldsid, $newsid, $questionrowdata['title']); - // $questionrowdata['question']=translink('survey', $oldsid, $newsid, $questionrowdata['question']); - // $questionrowdata['help']=translink('survey', $oldsid, $newsid, $questionrowdata['help']); - - $newvalues=array_values($questionrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $qinsert = "insert INTO {$dbprefix}questions (".implode(',',array_keys($questionrowdata)).") VALUES (".implode(',',$newvalues).")"; - $qres = $connect->Execute($qinsert) or $this->debugLsrc ("Error: "."Failed to insert question\n$qinsert\n".$connect->ErrorMsg()); - - //GET NEW QID .... if is not done before and we count a question if a new qid is required - if (!isset($newqids[$oldqid])) - { - $newqids[$oldqid] = $connect->Insert_ID("{$dbprefix}questions",'qid'); - $myQid=$newqids[$oldqid]; - $countquestions++; - } - else - { - $myQid=$newqids[$oldqid]; - } - } - } - // QESTIONS is DONE - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - // do ANSWERS - if (isset($answerarray) && $answerarray) - { - foreach ($answerarray as $aa) - { - $aacfieldcontents=convertCSVRowToArray($aa,',','"'); - $answerrowdata=array_combine($answerfieldnames,$aacfieldcontents); - - // Skip not supported languages - if (!in_array($answerrowdata['language'],$surveylanguages)) - continue; - - // replace the qid for the new one (if there is no new qid in the $newqids array it mean that this answer is orphan -> error, skip this record) - if (isset($newqids[$answerrowdata["qid"]])) - $answerrowdata["qid"] = $newqids[$answerrowdata["qid"]]; - else - continue; // a problem with this answer record -> don't consider - - // Everything set - now insert it - $answerrowdata = array_map('convertCsvreturn2return', $answerrowdata); - - // translate internal links - $answerrowdata['answer']=translink('survey', $oldsid, $newsid, $answerrowdata['answer']); - - $newvalues=array_values($answerrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $ainsert = "insert INTO {$dbprefix}answers (".implode(',',array_keys($answerrowdata)).") VALUES (".implode(',',$newvalues).")"; - $ares = $connect->Execute($ainsert) or $this->debugLsrc ("Error: "."Failed to insert answer\n$ainsert\n".$connect->ErrorMsg()); - $countanswers++; - } - } - // ANSWERS is DONE - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - // Fix question group sortorder - fixSortOrderGroups($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $cdresult = db_execute_assoc("SELECT gid FROM ".db_table_name('groups')." WHERE sid='{$surveyid}' AND language='{$baselang}' ORDER BY group_order, group_name"); - $position=0; - while ($cdrow=$cdresult->FetchRow()) - { - $cd2query="UPDATE ".db_table_name('groups')." SET group_order='{$position}' WHERE gid='{$cdrow['gid']}' "; - $cd2result = $connect->Execute($cd2query) or $this->debugLsrc ("Couldn't update group_order$cd2query".$connect->ErrorMsg()); //Checked - $position++; - } - - - //... and for the questions inside the groups - // get all group ids and fix questions inside each group - $gquery = "SELECT gid FROM {$dbprefix}groups where sid=$newsid group by gid ORDER BY gid"; //Get last question added (finds new qid) - $gres = db_execute_assoc($gquery); - while ($grow = $gres->FetchRow()) - { - //fixsortorderQuestions(0,$grow['gid']); - $qid=sanitize_int(0); - $gid=sanitize_int($grow['gid']); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - if ($gid == 0) - { - $result = db_execute_assoc("SELECT gid FROM ".db_table_name('questions')." WHERE qid='{$qid}' and language='{$baselang}'"); //Checked - $row=$result->FetchRow(); - $gid=$row['gid']; - } - $cdresult = db_execute_assoc("SELECT qid FROM ".db_table_name('questions')." WHERE gid='{$gid}' and language='{$baselang}' ORDER BY question_order, title ASC"); //Checked - $position=0; - while ($cdrow=$cdresult->FetchRow()) - { - $cd2query="UPDATE ".db_table_name('questions')." SET question_order='{$position}' WHERE qid='{$cdrow['qid']}' "; - $cd2result = $connect->Execute($cd2query) or $this->debugLsrc ("Couldn't update question_order$cd2query".$connect->ErrorMsg()); //Checked - $position++; - } - } - } - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - // do ATTRIBUTES - if (isset($question_attributesarray) && $question_attributesarray) - { - $fieldorders =convertCSVRowToArray($question_attributesarray[0],',','"'); - unset($question_attributesarray[0]); - foreach ($question_attributesarray as $qar) { - $fieldcontents=convertCSVRowToArray($qar,',','"'); - $qarowdata=array_combine($fieldorders,$fieldcontents); - - // replace the qid for the new one (if there is no new qid in the $newqids array it mean that this attribute is orphan -> error, skip this record) - if (isset($newqids[$qarowdata["qid"]])) - $qarowdata["qid"] = $newqids[$qarowdata["qid"]]; - else - continue; // a problem with this answer record -> don't consider - - unset($qarowdata["qaid"]); - - // Everything set - now insert it - $newvalues=array_values($qarowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $qainsert = "insert INTO {$dbprefix}question_attributes (".implode(',',array_keys($qarowdata)).") VALUES (".implode(',',$newvalues).")"; - $result=$connect->Execute($qainsert) or $this->debugLsrc ("Couldn't insert question_attribute$qainsert".$connect->ErrorMsg()); - $countquestion_attributes++; - } - } - // ATTRIBUTES is DONE - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - // do CONDITIONS - if (isset($conditionsarray) && $conditionsarray) - { - $fieldorders=convertCSVRowToArray($conditionsarray[0],',','"'); - unset($conditionsarray[0]); - foreach ($conditionsarray as $car) { - $fieldcontents=convertCSVRowToArray($car,',','"'); - $conditionrowdata=array_combine($fieldorders,$fieldcontents); - - $oldqid = $conditionrowdata["qid"]; - $oldcqid = $conditionrowdata["cqid"]; - - // replace the qid for the new one (if there is no new qid in the $newqids array it mean that this condition is orphan -> error, skip this record) - if (isset($newqids[$oldqid])) - $conditionrowdata["qid"] = $newqids[$oldqid]; - else - continue; // a problem with this answer record -> don't consider - - // replace the cqid for the new one (if there is no new qid in the $newqids array it mean that this condition is orphan -> error, skip this record) - if (isset($newqids[$oldcqid])) - $conditionrowdata["cqid"] = $newqids[$oldcqid]; - else - continue; // a problem with this answer record -> don't consider - - list($oldcsid, $oldcgid, $oldqidanscode) = explode("X",$conditionrowdata["cfieldname"],3); - - if ($oldcgid != $oldgid) // this means that the condition is in another group (so it should not have to be been exported -> skip it - continue; - - unset($conditionrowdata["cid"]); - - // recreate the cfieldname with the new IDs - $newcfieldname = $newsid . "X" . $newgid . "X" . $conditionrowdata["cqid"] .substr($oldqidanscode,strlen($oldqid)); - - $conditionrowdata["cfieldname"] = $newcfieldname; - if (!isset($conditionrowdata["method"]) || trim($conditionrowdata["method"])=='') - { - $conditionrowdata["method"]='=='; - } - $newvalues=array_values($conditionrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $conditioninsert = "insert INTO {$dbprefix}conditions (".implode(',',array_keys($conditionrowdata)).") VALUES (".implode(',',$newvalues).")"; - $result=$connect->Execute($conditioninsert) or $this->debugLsrc ("Couldn't insert condition$conditioninsert".$connect->ErrorMsg()); - $countconditions++; - } - } - $this->debugLsrc("wir sind in - ".__FUNCTION__." Line ".__LINE__.", FERTIG "); - // CONDITIONS is DONE - return array('gid'=>$newgid,'qid'=>$myQid); - //return $newgid; - } - - /** - * - * Enter description here... - * @param $surveyid - * @param $sMod - * @param $newGroup - * @return unknown_type - */ - function importQuestion($surveyid, $sMod, $newGroup=false) //XXX - { - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - $newsid = $surveyid; - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK $dbprefix "); - - //$getGidSql = "SELECT gid FROM {$dbprefix} "; - $getGidSql = "SELECT gid - FROM {$dbprefix}groups - WHERE sid=".$surveyid." AND language='".GetBaseLanguageFromSurveyID($surveyid)."' - ORDER BY gid desc "; - $getGidRs = db_execute_num($getGidSql); - $gidRow=$getGidRs->FetchRow(); - $gid = $gidRow[0]; - - if($gid=='')# - { - $this->debugLsrc("No Group for importing the question, available!"); - return "No Group for importing the question, available! Import failed."; - } - - if($newGroup===true) - ++$gid; - - $the_full_file_path = $queDir.$sMod.".csv"; - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK $the_full_file_path "); - - $handle = fopen($the_full_file_path, "r"); - while (!feof($handle)) - { - $buffer = fgets($handle, 10240); //To allow for very long survey welcomes (up to 10k) - $bigarray[] = $buffer; - } - fclose($handle); - - // Now we try to determine the dataformat of the survey file. - if ((substr($bigarray[1], 0, 24) == "# SURVEYOR QUESTION DUMP")&& (substr($bigarray[4], 0, 29) == "# http://www.phpsurveyor.org/")) - { - $importversion = 100; // version 1.0 file - } - elseif - ((substr($bigarray[1], 0, 24) == "# SURVEYOR QUESTION DUMP")&& (substr($bigarray[4], 0, 37) == "# http://phpsurveyor.sourceforge.net/")) - { - $importversion = 99; // Version 0.99 file or older - carries a different URL - } - elseif - (substr($bigarray[0], 0, 26) == "# LimeSurvey Question Dump" || substr($bigarray[0], 0, 27) == "# PHPSurveyor Question Dump") - { // Wow.. this seems to be a >1.0 version file - these files carry the version information to read in line two - $importversion=substr($bigarray[1], 12, 3); - } - else // unknown file - show error message - { - // $importquestion .= "".("Error")."\n"; - // $importquestion .= ("This file is not a LimeSurvey question file. Import failed.")."\n"; - // $importquestion .= "\n"; - // $importquestion .= "\n\n"; - // unlink($the_full_file_path); - return "This is not a Limesurvey question file. Import failed"; - } - - // if ($importversion != $dbversionnumber) - // { - //// $importquestion .= "".("Error")."\n"; - //// $importquestion .= ("Sorry, importing questions is limited to the same version. Import failed.")."\n"; - //// $importquestion .= "\n"; - //// $importquestion .= "\n\n"; - //// unlink($the_full_file_path); - // return; - // } - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - for ($i=0; $i<9; $i++) //skipping the first lines that are not needed - { - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //QUESTIONS - if (array_search("# ANSWERS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\n", $bigarray); - } - elseif (array_search("# ANSWERS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# ANSWERS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$questionarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //ANSWERS - if (array_search("# LABELSETS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\n", $bigarray); - } - elseif (array_search("# LABELSETS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELSETS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$answerarray[] = str_replace("`default`", "`default_value`", $bigarray[$i]);} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //LABELSETS - if (array_search("# LABELS TABLE\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\n", $bigarray); - } - elseif (array_search("# LABELS TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# LABELS TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsetsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //LABELS - if (array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\n", $bigarray); - } - elseif (array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray)) - { - $stoppoint = array_search("# QUESTION_ATTRIBUTES TABLE\r\n", $bigarray); - } - else - { - $stoppoint = count($bigarray)-1; - } - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-2) {$labelsarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - $bigarray = array_values($bigarray); - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //Question_attributes - if (!isset($noconditions) || $noconditions != "Y") - { - $stoppoint = count($bigarray); - for ($i=0; $i<=$stoppoint+1; $i++) - { - if ($i<$stoppoint-1) {$question_attributesarray[] = $bigarray[$i];} - unset($bigarray[$i]); - } - } - $bigarray = array_values($bigarray); - - if (isset($questionarray)) {$countquestions = count($questionarray)-1;} else {$countquestions=0;} - if (isset($answerarray)) - { - $answerfieldnames=convertCSVRowToArray($answerarray[0],',','"'); - unset($answerarray[0]); - $countanswers = count($answerarray); - } - else {$countanswers=0;} - if (isset($labelsetsarray)) {$countlabelsets = count($labelsetsarray)-1;} else {$countlabelsets=0;} - if (isset($labelsarray)) {$countlabels = count($labelsarray)-1;} else {$countlabels=0;} - if (isset($question_attributesarray)) {$countquestion_attributes = count($question_attributesarray)-1;} else {$countquestion_attributes=0;} - - $languagesSupported = array(); // this array will keep all the languages supported for the survey - - // Let's check that imported objects support at least the survey's baselang - $langcode = GetBaseLanguageFromSurveyID($surveyid); - - $languagesSupported[$langcode] = 1; // adds the base language to the list of supported languages - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - if ($countquestions > 0) - { - $questionfieldnames = convertCSVRowToArray($questionarray[0],',','"'); - $langfieldnum = array_search("language", $questionfieldnames); - $qidfieldnum = array_search("qid", $questionfieldnames); - $questionssupportbaselang = bDoesImportarraySupportsLanguage($questionarray,Array($qidfieldnum), $langfieldnum,$langcode,true); - if (!$questionssupportbaselang) - { - // $importquestion .= "".("Error")."\n" - // .("You can't import a question which doesn't support the current survey's base language")."\n" - // ."\n"; - // unlink($the_full_file_path); - return "You can't import a question which doesn't support the current survey's base language"; - } - } - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - foreach (GetAdditionalLanguagesFromSurveyID($surveyid) as $language) - { - $languagesSupported[$language] = 1; - } - - // Let's assume that if the questions do support tye baselang - // Then the answers do support it as well. - // ==> So the following section is commented for now - //if ($countanswers > 0) - //{ - // $langfieldnum = array_search("language", $answerfieldnames); - // $answercodefilednum1 = array_search("qid", $answerfieldnames); - // $answercodefilednum2 = array_search("code", $answerfieldnames); - // $answercodekeysarr = Array($answercodefilednum1,$answercodefilednum2); - // $answerssupportbaselang = bDoesImportarraySupportsLanguage($answerarray,$answercodekeysarr,$langfieldnum,$langcode); - // if (!$answerssupportbaselang) - // { - // $importquestion .= "".("Error")."\n" - // .("You can't import answers which don't support current survey's base language")."\n" - // ."\n"; - // return; - // } - // - //} - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - if ($countlabelsets > 0) - { - $labelsetfieldname = convertCSVRowToArray($labelsetsarray[0],',','"'); - $langfieldnum = array_search("languages", $labelsetfieldname); - $lidfilednum = array_search("lid", $labelsetfieldname); - $labelsetssupportbaselang = bDoesImportarraySupportsLanguage($labelsetsarray,Array($lidfilednum),$langfieldnum,$langcode,true); - if (!$labelsetssupportbaselang) - { - // $importquestion .= "".("Error")."\n" - // .("You can't import label sets which don't support the current survey's base language")."\n" - // ."\n"; - // unlink($the_full_file_path); - return "You can't import label sets which don't support the current survey's base language"; - } - } - // I assume that if a labelset supports the survey's baselang, - // then it's labels do support it as well - - // GET SURVEY AND GROUP DETAILS - //$surveyid=$postsid; - //$gid=$postgid; - $newsid=$surveyid; - $newgid=$gid; - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - - //DO ANY LABELSETS FIRST, SO WE CAN KNOW WHAT THEIR NEW LID IS FOR THE QUESTIONS - if (isset($labelsetsarray) && $labelsetsarray) { - $csarray=buildLabelSetCheckSumArray(); // build checksums over all existing labelsets - $count=0; - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - foreach ($labelsetsarray as $lsa) { - $fieldorders =convertCSVRowToArray($labelsetsarray[0],',','"'); - $fieldcontents=convertCSVRowToArray($lsa,',','"'); - if ($count==0) {$count++; continue;} - - $labelsetrowdata=array_combine($fieldorders,$fieldcontents); - - // Save old labelid - $oldlid=$labelsetrowdata['lid']; - // set the new language - unset($labelsetrowdata['lid']); - $newvalues=array_values($labelsetrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lsainsert = "INSERT INTO {$dbprefix}labelsets (".implode(',',array_keys($labelsetrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $lsiresult=$connect->Execute($lsainsert); - - // Get the new insert id for the labels inside this labelset - $newlid=$connect->Insert_ID("{$dbprefix}labelsets","lid"); - - if ($labelsarray) { - $count=0; - foreach ($labelsarray as $la) { - $lfieldorders =convertCSVRowToArray($labelsarray[0],',','"'); - $lfieldcontents=convertCSVRowToArray($la,',','"'); - if ($count==0) {$count++; continue;} - - // Combine into one array with keys and values since its easier to handle - $labelrowdata=array_combine($lfieldorders,$lfieldcontents); - $labellid=$labelrowdata['lid']; - if ($labellid == $oldlid) { - $labelrowdata['lid']=$newlid; - - // translate internal links - $labelrowdata['title']=translink('label', $oldlid, $newlid, $labelrowdata['title']); - - $newvalues=array_values($labelrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $lainsert = "INSERT INTO {$dbprefix}labels (".implode(',',array_keys($labelrowdata)).") VALUES (".implode(',',$newvalues).")"; //handle db prefix - $liresult=$connect->Execute($lainsert); - } - } - } - - //CHECK FOR DUPLICATE LABELSETS - $thisset=""; - $query2 = "SELECT code, title, sortorder, language - FROM {$dbprefix}labels - WHERE lid=".$newlid." - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or $this->debugLsrc("Died querying labelset $lid$query2".$connect->ErrorMsg()); - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $newcs=dechex(crc32($thisset)*1); - unset($lsmatch); - if (isset($csarray)) - { - foreach($csarray as $key=>$val) - { - if ($val == $newcs) - { - $lsmatch=$key; - } - } - } - if (isset($lsmatch)) - { - //There is a matching labelset. So, we will delete this one and refer - //to the matched one. - $query = "DELETE FROM {$dbprefix}labels WHERE lid=$newlid"; - $result=$connect->Execute($query) or $this->debugLsrc("Couldn't delete labels$query".$connect->ErrorMsg()); - $query = "DELETE FROM {$dbprefix}labelsets WHERE lid=$newlid"; - $result=$connect->Execute($query) or $this->debugLsrc("Couldn't delete labelset$query".$connect->ErrorMsg()); - $newlid=$lsmatch; - } - else - { - //There isn't a matching labelset, add this checksum to the $csarray array - $csarray[$newlid]=$newcs; - } - //END CHECK FOR DUPLICATES - $labelreplacements[]=array($oldlid, $newlid); - } - } - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - - // QUESTIONS, THEN ANSWERS FOR QUESTIONS IN A NESTED FORMAT! - if (isset($questionarray) && $questionarray) { - $qafieldorders=convertCSVRowToArray($questionarray[0],',','"'); - unset($questionarray[0]); - - //Assuming we will only import one question at a time we will now find out the maximum question order in this group - //and save it for later - $qmaxqo = "SELECT MAX(question_order) AS maxqo FROM ".db_table_name('questions')." WHERE sid=$newsid AND gid=$newgid"; - $qres = db_execute_assoc($qmaxqo) or $this->debugLsrc ("Error: ".": Failed to find out maximum question order value\n$qmaxqo\n".$connect->ErrorMsg()); - $qrow=$qres->FetchRow(); - $newquestionorder=$qrow['maxqo']+1; - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - - foreach ($questionarray as $qa) { - $qacfieldcontents=convertCSVRowToArray($qa,',','"'); - $newfieldcontents=$qacfieldcontents; - $questionrowdata=array_combine($qafieldorders,$qacfieldcontents); - if (isset($languagesSupported[$questionrowdata["language"]])) - { - $oldqid = $questionrowdata['qid']; - $oldsid = $questionrowdata['sid']; - $oldgid = $questionrowdata['gid']; - - // Remove qid field if there is no newqid; and set it to newqid if it's set - if (!isset($newqid)) - unset($questionrowdata['qid']); - else - $questionrowdata['qid'] = $newqid; - - $questionrowdata["sid"] = $newsid; - $questionrowdata["gid"] = $newgid; - $questionrowdata["question_order"] = $newquestionorder; - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - // Now we will fix up the label id - $type = $questionrowdata["type"]; //Get the type - if ($type == "F" || $type == "H" || $type == "1" || $type == ":" || $type == ";" ) - {//IF this is a flexible label array, update the lid entry - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - - if (isset($labelreplacements)) { - foreach ($labelreplacements as $lrp) { - if ($lrp[0] == $questionrowdata["lid"]) { - $questionrowdata["lid"]=$lrp[1]; - } - if ($lrp[0] == $questionrowdata["lid1"]) { - $questionrowdata["lid1"]=$lrp[1]; - } - } - } - } - $other = $questionrowdata["other"]; //Get 'other' field value - $oldlid = $questionrowdata["lid"]; - $questionrowdata=array_map('convertCsvreturn2return', $questionrowdata); - - // translate internal links - $questionrowdata['title']=translink('survey', $oldsid, $newsid, $questionrowdata['title']); - $questionrowdata['question']=translink('survey', $oldsid, $newsid, $questionrowdata['question']); - $questionrowdata['help']=translink('survey', $oldsid, $newsid, $questionrowdata['help']); - - $newvalues=array_values($questionrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $qinsert = "INSERT INTO {$dbprefix}questions (".implode(',',array_keys($questionrowdata)).") VALUES (".implode(',',$newvalues).")"; - $qres = $connect->Execute($qinsert) or $this->debugLsrc ("Error: ".": Failed to insert question\n$qinsert\n".$connect->ErrorMsg()); - - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - // set the newqid only if is not set - if (!isset($newqid)) - $newqid=$connect->Insert_ID("{$dbprefix}questions","qid"); - } - } - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - //NOW DO ANSWERS FOR THIS QID - Is called just once and only if there was a question - if (isset($answerarray) && $answerarray) { - foreach ($answerarray as $aa) { - $answerfieldcontents=convertCSVRowToArray($aa,',','"'); - $answerrowdata=array_combine($answerfieldnames,$answerfieldcontents); - if ($answerrowdata===false) - { - $importquestion.=''.("Faulty line in import - fields and data don't match").":".implode(',',$answerfieldcontents); - } - if (isset($languagesSupported[$answerrowdata["language"]])) - { - $code=$answerrowdata["code"]; - $thisqid=$answerrowdata["qid"]; - $answerrowdata["qid"]=$newqid; - - // translate internal links - $answerrowdata['answer']=translink('survey', $oldsid, $newsid, $answerrowdata['answer']); - - $newvalues=array_values($answerrowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $ainsert = "INSERT INTO {$dbprefix}answers (".implode(',',array_keys($answerrowdata)).") VALUES (".implode(',',$newvalues).")"; - $ares = $connect->Execute($ainsert) or $this->debugLsrc ("Error: ".": Failed to insert answer\n$ainsert\n".$connect->ErrorMsg()); - } - } - } - $this->debugLsrc("wir sind in ".__FILE__." - ".__FUNCTION__." Line ".__LINE__.", OK "); - // Finally the question attributes - Is called just once and only if there was a question - if (isset($question_attributesarray) && $question_attributesarray) {//ONLY DO THIS IF THERE ARE QUESTION_ATTRIBUES - $fieldorders =convertCSVRowToArray($question_attributesarray[0],',','"'); - unset($question_attributesarray[0]); - foreach ($question_attributesarray as $qar) { - $fieldcontents=convertCSVRowToArray($qar,',','"'); - $qarowdata=array_combine($fieldorders,$fieldcontents); - $qarowdata["qid"]=$newqid; - unset($qarowdata["qaid"]); - - $newvalues=array_values($qarowdata); - $newvalues=array_map(array(&$connect, "qstr"),$newvalues); // quote everything accordingly - $qainsert = "INSERT INTO {$dbprefix}question_attributes (".implode(',',array_keys($qarowdata)).") VALUES (".implode(',',$newvalues).")"; - $result=$connect->Execute($qainsert) or $this->debugLsrc ("Couldn't insert question_attribute$qainsert".$connect->ErrorMsg()); - } - } - - } - $this->debugLsrc("wir sind in - ".__FUNCTION__." Line ".__LINE__.", FERTIG "); - // CONDITIONS is DONE - return array('gid'=>$newgid,'qid'=>$newqid); - //return $newgid; - } - - /** - * function to delete a Survey with all questions and answersand Tokentable.... - * - * @param int $surveyid - * @return boolean - */ - function deleteSurvey($surveyid) - { - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", OK "); - - $tablelist = $connect->MetaTables(); - $dict = NewDataDictionary($connect); - - if (in_array("{$dbprefix}survey_$surveyid", $tablelist)) //delete the survey_$surveyid table - { - $dsquery = $dict->DropTableSQL("{$dbprefix}survey_$surveyid"); - //$dict->ExecuteSQLArray($sqlarray); - $dsresult = $dict->ExecuteSQLArray($dsquery); - } - - if (in_array("{$dbprefix}tokens_$surveyid", $tablelist)) //delete the tokens_$surveyid table - { - $dsquery = $dict->DropTableSQL("{$dbprefix}tokens_$surveyid"); - $dsresult = $dict->ExecuteSQLArray($dsquery) or $this->debugLsrc ("Couldn't \"$dsquery\" because ".$connect->ErrorMsg()); - } - - $dsquery = "SELECT qid FROM {$dbprefix}questions WHERE sid=$surveyid"; - $dsresult = db_execute_assoc($dsquery) or $this->debugLsrc ("Couldn't find matching survey to delete: \n $dsquery \n".$connect->ErrorMsg()); - while ($dsrow = $dsresult->FetchRow()) - { - $asdel = "DELETE FROM {$dbprefix}answers WHERE qid={$dsrow['qid']}"; - $asres = $connect->Execute($asdel); - $cddel = "DELETE FROM {$dbprefix}conditions WHERE qid={$dsrow['qid']}"; - $cdres = $connect->Execute($cddel) or die(); - $qadel = "DELETE FROM {$dbprefix}question_attributes WHERE qid={$dsrow['qid']}"; - $qares = $connect->Execute($qadel); - } - - $qdel = "DELETE FROM {$dbprefix}questions WHERE sid=$surveyid"; - $qres = $connect->Execute($qdel); - - $scdel = "DELETE FROM {$dbprefix}assessments WHERE sid=$surveyid"; - $scres = $connect->Execute($scdel); - - $gdel = "DELETE FROM {$dbprefix}groups WHERE sid=$surveyid"; - $gres = $connect->Execute($gdel); - - $slsdel = "DELETE FROM {$dbprefix}surveys_languagesettings WHERE surveyls_survey_id=$surveyid"; - $slsres = $connect->Execute($slsdel); - - $srdel = "DELETE FROM {$dbprefix}surveys_permissions WHERE sid=$surveyid"; - $srres = $connect->Execute($srdel); - - $srdel = "DELETE FROM {$dbprefix}saved_control WHERE sid=$surveyid"; - $srres = $connect->Execute($srdel); - - $sdel = "DELETE FROM {$dbprefix}surveys WHERE sid=$surveyid"; - $sres = $connect->Execute($sdel); - $surveyid=false; - - return true; - - } - - /** - * This function pulls a CSV representation of the Field map - * - * @param mixed $surveyid - the survey ID you want the Fieldmap for - * @return String $fieldmap - */ - function FieldMap2CSV($surveyid) - { - $fields=array("fieldname", "type", "sid", "gid", "qid", "aid",'title','question','group_name','lid','lid1'); - $fieldmap=createFieldMap($surveyid,'full'); - - $result='"'.implode('","',$fields).'"'."\n"; - foreach ($fieldmap as $entry) - { - - $destfieldmap=array(); - foreach ($fields as $field) - { - if (isset($entry[$field])) - { - $destfieldmap[$field]=$entry[$field]; - } - else - { - $destfieldmap[$field]=''; - } - } - $entry=array_map('CSVEscape',array_values($destfieldmap)); - $result.=implode(',',$entry)."\n"; - } - return $result; - } - - function sendStatistic($surveyid, $to, $tempFile, $html=null) - { - include("lsrc.config.php"); - global $sitename; - global $clang; - - - if($tempFile==null && isset($html)) - { - $css = ""; - - $message = sprintf($clang->gT("This is your personal statistic sheet for survey #%s"),$css."
    ".$message.$surveyid."
    ".$html."
    "); - return SendEmailMessage($message, sprintf($clang->gT("Statistics Survey #%s"),$surveyid), $to, getBounceEmail($surveyid), $sitename, true); - } - else - { - $message = sprintf($clang->gT("This is your personal statistic sheet for survey #%s"),$surveyid); - return SendEmailMessage($message, sprintf($clang->gT("Statistics Survey #%s"),$surveyid), $to , getBounceEmail($surveyid), $sitename, $ishtml, getBounceEmail($surveyid), $tempFile); - } - - } - private function getqtypelist($SelectedCode = "T", $ReturnType = "array") - { - include("lsrc.config.php"); - global $publicurl; - //global $sourcefrom, $clang; - - - $qtypes = array( - "1"=>"Array (Flexible Labels) Dual Scale", - "5"=>"5 Point Choice", - "A"=>"Array (5 Point Choice)", - "B"=>"Array (10 Point Choice)", - "C"=>"Array (Yes/No/Uncertain)", - "D"=>"Date", - "E"=>"Array (Increase, Same, Decrease)", - "F"=>"Array (Flexible Labels)", - "G"=>"Gender", - "H"=>"Array (Flexible Labels) by Column", - "I"=>"Language Switch", - "K"=>"Multiple Numerical Input", - "L"=>"List (Radio)", - "M"=>"Multiple choice", - "N"=>"Numerical Input", - "O"=>"List With Comment", - "P"=>"Multiple choice with comments", - "Q"=>"Multiple Short Text", - "R"=>"Ranking", - "S"=>"Short Free Text", - "T"=>"Long Free Text", - "U"=>"Huge Free Text", - "W"=>"List (Flexible Labels) (Dropdown)", - "X"=>"Boilerplate Question", - "Y"=>"Yes/No", - "Z"=>"List (Flexible Labels) (Radio)", - "!"=>"List (Dropdown)", - ":"=>"Array (Multi Flexible) (Numbers)", - ";"=>"Array (Multi Flexible) (Text)", - ); - asort($qtypes); - if ($ReturnType == "array") - {return $qtypes;} - - - } - /** - * This function removes the UTF-8 Byte Order Mark from a string - * - * @param string $str - * @return string - */ - private function removeBOM($str=""){ - if(substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) { - $str=substr($str, 3); - } - return $str; - } - /** - * create a token table for the given survey id - * @param $iVid - * @return unknown_type - */ - function createTokenTable($iVid, $att=0) - { - global $connect; - global $dbprefix; - - global $databasetabletype; - global $databasetype; - - global $rootdir; - - global $defaultlang; - - include("lsrc.config.php"); - - require_once($rootdir.'/classes/core/language.php'); - $clang = new limesurvey_lang($defaultlang); - // check if the Token table already exists, if not, create it... - if(!db_tables_exist("{$dbprefix}tokens_".$iVid)) - { - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", Token Table existiert nicht "); - $createtokentable = - "tid int I NOT NULL AUTO PRIMARY,\n " - . "firstname C(40) ,\n " - . "lastname C(40) ,\n "; - //MSSQL needs special treatment because of some strangeness in ADODB - if ($databasetype == 'odbc_mssql' || $databasetype == 'odbtp' || $databasetype == 'mssql_n' || $databasetype == 'mssqlnative') - { - $createtokentable.= "email text ,\n " - ."emailstatus text ,\n "; - } - else - { - $createtokentable.= "email text ,\n " - ."emailstatus text ,\n "; - } - - $createtokentable.= "token C(36) ,\n " - . "language C(25) ,\n " - . "sent C(17) DEFAULT 'N',\n " - . "remindersent C(17) DEFAULT 'N',\n " - . "remindercount int I DEFAULT 0,\n " - . "completed C(17) DEFAULT 'N',\n " - . "usesleft I DEFAULT 1,\n" - . "validfrom date ,\n " - . "validuntil date ,\n " - . "mpid I "; - - $tabname = "{$dbprefix}tokens_{$iVid}"; # not using db_table_name as it quotes the table name (as does CreateTableSQL) - $taboptarray = array('mysql' => 'ENGINE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci', - 'mysqli' => 'ENGINE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci'); - $dict = NewDataDictionary($connect); - $sqlarray = $dict->CreateTableSQL($tabname, $createtokentable, $taboptarray); - $execresult = $dict->ExecuteSQLArray($sqlarray, false); - - $createtokentableindex = $dict->CreateIndexSQL("{$tabname}_idx", $tabname, array('token')); - $dict->ExecuteSQLArray($createtokentableindex, false); - if($execresult!=0) - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", token table created "); - else - { - $this->debugLsrc("WARNING: ".__FUNCTION__." Line ".__LINE__.", token table NOT created "); - $this->debugLsrc($createtokentable); - while(list($key, $value)= each($sqlarray) ) - { - $this->debugLsrc("$key - $value"); - } - } - $n=1; - while($att>=$n) - { - $sql = "ALTER TABLE {$dbprefix}tokens_$iVid ADD COLUMN attribute_$n VARCHAR(255); "; - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", Attribute_$n anlegen ,sql: $sql"); - //modify_database("","$sql"); - $connect->Execute($sql); - ++$n; - } - } - return; - } - /** - * The new one... - * * Function to insert Participant data while auto creating token if non is supported... - * @param $sUser - * @param $sPass - * @param $iVid - * @param $sParticipantData (FIRSTNAME;LASTNAME;EMAIL;LANG;TOKEN;VALIDFROM;VALIDTO;attrib1,attrib2,attrib3,attrib4,attrib5::) - * @return unknown_type - */ - function insertParticipants($iVid, $sParticipantData) - { - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - //$this = new lsrcHelper(); - // check for appropriate rights - // if(!$this->checkUser($sUser, $sPass)) - // { - // throw new SoapFault("Authentication: ", "User or password wrong"); - // exit; - // } - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", $iVid, $sParticipantData "); - - // check if there is a $iVid, else abort - if(!isset($iVid) || $iVid=='' || $iVid==0 ) - { - return 0; - } - - // check if the Survey we want to populate with data and tokens already exists, else -> Fault - if(!$this->surveyExists($iVid)) - { - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", survey does not exist "); - return 0; - } - - $this->createTokenTable($iVid); - - //set the Seperators to default if nothing is set in the lsrc.config.php - if(!isset($sDatasetSeperator) || $sDatasetSeperator=='') - {$sDatasetSeperator = "::";} - if(!isset($sDatafieldSeperator) || $sDatafieldSeperator=='') - {$sDatafieldSeperator = ";";} - - // prepare to fill the table lime_tokens_* - // this is sensitiv, if the Seperator is not the defined one, almost everything could happen, BE AWARE OF YOUR SEPERATOR!... - $asDataset = explode($sDatasetSeperator, $sParticipantData); - // write the tokens to the token_table - $iCountParticipants = count($asDataset); - $iInsertedParticipants=0; - - foreach($asDataset as $sData) - { - //some extra sql statement comes in here later - $attributes=''; - $attributesData=''; - $validity=''; - $validityData=''; - if($sData!='') - { - $asDatafield = explode($sDatafieldSeperator, $sData); - $checkCnt=1; - - $iDataLength = count($asDatafield); - for($n=0;$n>=$iDataLength;++$n) - { - if($asDatafield[$n]=='') - { - $asDatafield[$n]=null; - } - } - - // token generieren - - - while($checkCnt>0) - { - $value = sRandomChars(10); //change sRandomChars value for different tokenlength (up to 36 chars max.) - $cQuery= "select token from ".$dbprefix."tokens_".$iVid." where token = '".$value."'; "; - $result = db_execute_assoc($cQuery); - $checkCnt = $result->RecordCount(); - } - if(!isset($asDatafield[4]) || $asDatafield[4]=='') - { - $asDatafield[4]= $value; - } - - //set session language if no language is set - if(!isset($asDatafield[3]) || $asDatafield[3]=='') - { - $asDatafield[3] = $_SESSION['lang']; - } - - //Begin to prepare our statement here. One array for the columns to insert and a parallel array with the values. - $insertColumns = array('firstname', 'lastname', 'email', 'language', 'token'); - $insertValues = array($asDatafield[0], $asDatafield[1], $asDatafield[2], $asDatafield[3], $asDatafield[4]); - - if(isset($asDatafield[5]) && $asDatafield[5]!=null) - { - //$validity .= ',validfrom'; - //$validityData .=",'$asDatafield[5]'"; - $insertColumns[] = 'validfrom'; - $insertValues[] = $asDatafield[5]; - } - if(isset($asDatafield[6]) && $asDatafield[5]!=null) - { - //$validity .= ',validuntil'; - //$validityData .=",'$asDatafield[6]'"; - $insertColumns[] = 'validuntil'; - $insertValues[] = $asDatafield[6]; - } - - if(isset($asDatafield[7]) && $asDatafield[7]!='') - { - $asAttributes = explode(",", $asDatafield[7]); - $n=0; - foreach($asAttributes as $attribute) - { - - ++$n; - //$check = "SELECT attribute_$n FROM {$dbprefix}_tokens_$iVid "; - - $sql = "ALTER TABLE {$dbprefix}tokens_$iVid ADD COLUMN attribute_$n VARCHAR(255); "; - //$attributes.=",attribute_$n"; - //$attributesData.= ",'$attribute'"; - $insertColumns[] = "attribute_$n"; - $insertValues[] = $attribute; - - $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", Attribute_$n mit $attribute anlegen ,sql: $sql"); - //modify_database("","$sql"); - $connect->Execute($sql); - - } - } - - - /*$sInsertParti = "INSERT INTO ".$dbprefix."tokens_".$iVid - ."(firstname,lastname,email,token," - ."language $validity $attributes) " - ."VALUES ('{$asDatafield[0]}', '{$asDatafield[1]}' , '{$asDatafield[2]}', '{$asDatafield[4]}' , " - ."'{$asDatafield[3]}' $validityData $attributesData) ";*/ - - $sInsertParti = "INSERT INTO {$dbprefix}tokens_$iVid (".implode(',', $insertColumns).") VALUES (".trim(str_repeat('?,', count($insertColumns)), ',').");"; - - - - $this->debugLsrc("$sInsertParti"); - - - // $sInsertParti = "INSERT INTO ".$dbprefix."tokens_".$iVid - // ."(firstname,lastname,email,emailstatus,token," - // ."language,sent,completed,attribute_1,attribute_2,mpid)" - // ."VALUES ('".$asDatafield[0]."' , - // '".$asDatafield[1]."' , '".$asDatafield[2]."' , 'OK' , '".$asDatafield[5]."', - // '".$_SESSION['lang']."', 'N', 'N', '".$asDatafield[3]."' , '".$asDatafield[4]."' , NULL); "; - // - if($connect->Execute($sInsertParti, $insertValues)) - { - ++$iInsertedParticipants; - // check participants eMail status and set it - // see http://data.iana.org/TLD/tlds-alpha-by-domain.txt - $maxrootdomainlength = 32; - if(1==preg_match("/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,".$maxrootdomainlength."}))$/ix", $asDatafield[2])) - $this->changeTable("tokens_".$iVid,"emailstatus","OK","email='{$asDatafield[2]}'"); - - // if(isset($asDatafield[7]) && $asDatafield[7]!='') - // { - // $asAttributes = explode(",", $asDatafield[7]); - // $n=0; - // foreach($asAttributes as $attribute) - // { - // - // ++$n; - // //$check = "SELECT attribute_$n FROM {$dbprefix}_tokens_$iVid "; - // - // $sql = "ALTER TABLE {$dbprefix}tokens_$iVid ADD COLUMN attribute_$n VARCHAR(255); "; - // $attributes.=",attribute_$n"; - // $attributesData.= ",'$attribute'"; - // - // $this->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", Attribute_$n mit $attribute anlegen ,sql: $sql"); - // //modify_database("","$sql"); - // $connect->Execute($sql); - // - // - // $insert = "UPDATE {$dbprefix}tokens_$iVid " - // . " SET attribute_$n='$attribute' WHERE token='$asDatafield[4]' "; - // - // $this->debugLsrc("$insert"); - // $connect->Execute($insert); - // } - // } - } - - } - - } - return "".$iCountParticipants."Datasets given, ".$iInsertedParticipants." rows inserted. "; - } -} \ No newline at end of file diff --git a/include/limesurvey/admin/remotecontrol/lsrc.server.php b/include/limesurvey/admin/remotecontrol/lsrc.server.php deleted file mode 100644 index ff871b96..00000000 --- a/include/limesurvey/admin/remotecontrol/lsrc.server.php +++ /dev/null @@ -1,1216 +0,0 @@ - array( - 'verify_peer' => false, - 'allow_self_signed' => true, - 'local_cert' => $sslCert, - 'passphrase' => 'hisuser', - 'capture_peer_cert' => true - - ) - ); - - $stream_context = stream_context_create($context); - - $server = new SoapServer($wsdl, array('soap_version' => SOAP_1_1, - 'stream_context' => $stream_context)); -} -else{ - $server = new SoapServer($wsdl, array('soap_version' => SOAP_1_1)); -} - -/** - * adds the functions to the SoapServer Object, - * - * the sChangeSurvey function should be commented out for productive Use - */ -//$server->addFunction("sChangeSurvey"); -$server->addFunction("sDeleteSurvey"); -$server->addFunction("sActivateSurvey"); -$server->addFunction("sCreateSurvey"); -$server->addFunction("sInsertToken"); -$server->addFunction("sTokenReturn"); -$server->addFunction("sInsertParticipants"); -$server->addFunction("sImportGroup"); -$server->addFunction("sAvailableModules"); -$server->addFunction("sImportQuestion"); -$server->addFunction("sImportMatrix"); -$server->addFunction("sImportFreetext"); -$server->addFunction("sSendEmail"); -$server->addFunction("sGetFieldmap"); -$server->addFunction("fSendStatistic"); -// handle the soap request! -if($enableLsrc===true) -{ - $server->handle(); -} -/** - * - * Function to change tables in Limesurvey Database, this is too sensitive for productive use, but useful for development and testing - * @param $sUser - * @param $sPass - * @param $table - * @param $key - * @param $value - * @param $where - * @param $mode - * @return unknown_type - */ -function sChangeSurvey($sUser, $sPass, $table, $key, $value, $where, $mode='0') -{ - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - // check for appropriate rights - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - //check for Surveyowner. Only owners and superadmins can change and activate surveys - if(!$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to change Databasetables"); - exit; - } - - return $lsrcHelper->changeTable($table, $key, $value, $where, $mode); -} -/** - * - * Function to send reminder, invitation or custom mails to participants of a specific survey - * @param $sUser - * @param $sPass - * @param $iVid - * @param $type - * @param $maxLsrcEmails - * @param $subject - * @param $emailText - * @return unknown_type - */ -function sSendEmail($sUser, $sPass, $iVid, $type, $maxLsrcEmails='', $subject='', $emailText='') -{ - global $sitename, $siteadminemail; - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK "); - - // wenn maxmails ber den lsrc gegeben wird das nurtzen, ansonsten die default werte aus der config.php - if($maxLsrcEmails!='') - $maxemails = $maxLsrcEmails; - - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - // Check if all mandatory parameters are present, else abort... - if(!is_int($iVid) || $iVid==0 || $type=='') - { - throw new SoapFault("Server: ", "Mandatory Parameters missing"); - exit; - } - - if($type=='custom' && $subject!='' && $emailText!='') - { - //GET SURVEY DETAILS not working here... don't know why... - //$thissurvey=getSurveyInfo($iVid); - $from = $siteadminemail; - - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", Admin Email: $from ; survey: $iVid ; dump: ".print_r($thissurvey).""); - $emquery = "SELECT firstname, lastname, email, token, tid, language"; - //if ($ctfieldcount > 7) {$emquery .= ", attribute_1, attribute_2";} - - $emquery .= " FROM ".db_table_name("tokens_{$iVid}")." WHERE email != '' "; - - if (isset($tokenid)) {$emquery .= " and tid='{$tokenid}'";} - $tokenoutput .= "\n\n\n\n"; - //$emresult = db_select_limit_assoc($emquery,$maxemails); - $emresult = db_execute_assoc($emquery); - $emcount = $emresult->RecordCount(); - - if ($emcount > 0) - { - $mailsSend = 0; - while ($emrow = $emresult->FetchRow()) - { - if (SendEmailMessage($emailText, $subject, $emrow['email'] , $from, $sitename, $ishtml=false, getBounceEmail($iVid))) - { - $mailsSend++; - } - else - { - //$tokenoutput .= ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:")." ".$maildebug."
    ", $fieldsarray); - if($n==1) - $failedAddresses .= ",".$emrow['email']; - else - { - $failedAddresses = $emrow['email']; - $n=1; - } - - } - } - - } - else - { - return "No Mails to send"; - } - // if ($ctcount > $emcount) - // { - // $lefttosend = $ctcount-$maxemails; - // - // }else{$lefttosend = 0;} - - // if($maxemails>0) - // { - // $returnValue = "".$mailsSend." Mails send. ".$lefttosend." Mails left to send"; - // if(isset($failedAddresses)) - // $returnValue .= "\nCould not send to: ".$failedAddresses; - // return $returnValue; - // } - - if(isset($mailsSend)) - { - $returnValue = "".$mailsSend." Mails send. "; - if(isset($failedAddresses)) - $returnValue .= "\nCould not send to: ".$failedAddresses; - return $returnValue; - } - } - - if($type=='invite' || $type=='remind') - { - $emailSenderReturn = $lsrcHelper->emailSender($iVid, $type, $maxLsrcEmails); - - return $emailSenderReturn; - - } - else - { - throw new SoapFault("Type: ", "Wrong send Type given. Possible types are: custom, invite or remind"); - exit; - } - -} - -/** - * - * Function to activate a survey in the database and change some Values (starttime, endtime. Required parameters are: - * @param $sUser - * @param $sPass - * @param $iVid - * @param $dStart - * @param $dEnd - * @return unknown_type - */ -function sActivateSurvey($sUser, $sPass, $iVid, $dStart, $dEnd) -{ - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK "); - // check for apropriate rights - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - // Check if all mandatory parameters are present, else abort... - if(!is_int($iVid) || $iVid==0) - { - throw new SoapFault("Server: ", "Mandatory Parameters missing"); - exit; - } - - // Check if the survey to create already exists. If not, abort with Fault. - if(!$lsrcHelper->surveyExists($iVid)) - { - throw new SoapFault("Database: ", "Survey you want to activate does not exists"); - exit; - } - - //check for Surveyowner. Only owners and superadmins can change and activate surveys - if($lsrcHelper->getSurveyOwner($iVid)!=$_SESSION['loginID'] && !$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to change Surveys from other people"); - exit; - } - $activateResult = $lsrcHelper->activateSurvey($iVid); - if($activateResult!=true) - { - throw new SoapFault("Server: ", "Import went wrong. Check lsrc.log."); - exit; - } - - if($dStart!='' && substr($dStart,0,10)!='1980-01-01') - { - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", CHANGE start "); - $lsrcHelper->changeTable('surveys','startdate',$dStart,'sid='.$iVid); - } - if($dEnd!='' && substr($dEnd,0,10)!='1980-01-01') - { - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", CHANGE end "); - $lsrcHelper->changeTable('surveys','expires',$dEnd,'sid='.$iVid); - } - - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", aktivierung OK "); - return $iVid; -} - -/** - * - * Function to import a survey into the database and change some Values. Required parameters are: - * @param $sUser - * @param $sPass - * @param $iVid - * @param $sVtit - * @param $sVbes - * @param $sVwel - * @param $sMail - * @param $sName - * @param $sUrl - * @param $sUbes - * @param $sVtyp - * @param $autoRd - * @return unknown_type - */ -function sCreateSurvey($sUser, $sPass, $iVid, $sVtit, $sVbes, $sVwel, $sVend, $sMail, $sName, $sUrl, $sUbes, $sVtyp, $autoRd='N' ) -{ - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",surveyid=$iVid START OK "); - - - if($sVwel=='') - {//if no welcometext is given, set this one - $sVwel = "Herzlich Willkommen zur Evaluation von \"".$sVtit."\""; - } - // if($sVend=='') - // {//if no endtext is given, set this one - // $sVend = "Vielen Dank für Ihre Teilnahme an der Umfrage!"; - // } - - if(!$lsrcHelper->checkUser($sUser, $sPass)) - {// check for appropriate rights - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - if((!is_int($iVid) || $iVid==0) || $sVtit=='' || $sVbes=='') - {// Check if mandatory parameters are empty, if so-> abort - throw new SoapFault("Server: ", "Mandatory Parameters missing"); - exit; - } - - if($lsrcHelper->surveyExists($iVid)) - {// Check if the survey to create already exists. If so, abort with Fault. - throw new SoapFault("Database: ", "Survey already exists"); - exit; - } - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",vor import OK "); - - - $iNewSid = $lsrcHelper->importSurvey($iVid, $sVtyp); - if($iNewSid==NULL) - { - throw new SoapFault("Server: ", "Import went wrong somehow"); - exit; - } - -// if import of survey went ok it returns true, else nothing - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",surveyid=$iNewSid nach import OK "); - - //get the optional data into db - if($sMail!='') - { - $lsrcHelper->changeTable("surveys", "adminemail", $sMail, "sid='$iNewSid'"); - $lsrcHelper->changeTable("surveys", "bounce_email", $sMail, "sid='$iNewSid'"); - } - if($sName!='') - $lsrcHelper->changeTable("surveys", "admin", $sName, "sid='$iNewSid'"); - if($sUrl!='') - $lsrcHelper->changeTable("surveys_languagesettings", "surveyls_url", $sUrl, "surveyls_survey_id='$iNewSid'"); - if($sUbes!='') - $lsrcHelper->changeTable("surveys_languagesettings", "surveyls_urldescription", $sUbes, "surveyls_survey_id='$iNewSid'"); - if($autoRd=='Y') - $lsrcHelper->changeTable("surveys", "autoredirect", "Y", "sid='$iNewSid'"); - if($sVtit!='') - $lsrcHelper->changeTable("surveys_languagesettings", "surveyls_title", $sVtit, "surveyls_survey_id='$iNewSid'"); - if($sVbes!='') - $lsrcHelper->changeTable("surveys_languagesettings", "surveyls_description", $sVbes, "surveyls_survey_id='$iNewSid'"); - if($sVwel!='') - $lsrcHelper->changeTable("surveys_languagesettings", "surveyls_welcometext", $sVwel, "surveyls_survey_id='$iNewSid'"); - if($sVend!='') - $lsrcHelper->changeTable("surveys_languagesettings", "surveyls_endtext", $sVend, "surveyls_survey_id='$iNewSid'"); - - $lsrcHelper->changeTable("surveys", "datecreated", date("Y-m-d"), "sid='$iNewSid'"); - - return $iNewSid; - -}//end of function sCreateSurvey - - -/** - * - * Function to insert Tokens to an existing Survey, makes it "closed" - * @param $sUser - * @param $sPass - * @param $iVid - * @param $sToken - * @return unknown_type - */ -function sInsertToken($sUser, $sPass, $iVid, $sToken) -{ - global $connect ; - global $dbprefix ; - //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK "); - - // check for apropriate rights - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - // check if there is a $iVid, else abort - if(!isset($iVid) || $iVid=='' || $iVid==0 ) - { - throw new SoapFault("Server: ", "No SurveyId given"); - exit; - } - - // check if the Survey we want to populate with tokens already exists, else -> Fault - if(!$lsrcHelper->surveyExists($iVid)) - { - throw new SoapFault("Database: ", "Survey does not exists"); - exit; - } - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", ckecks ueberstanden "); - - // check if the Token table already exists, if not, create it... - if(!db_tables_exist("{$dbprefix}tokens_".$iVid)) - { - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", TOken Table existiert nicht "); - $createtokentable= - "tid int I NOTNULL AUTO PRIMARY,\n " - . "firstname C(40) ,\n " - . "lastname C(40) ,\n "; - //MSSQL needs special treatment because of some strangeness in ADODB - if ($databasetype == 'odbc_mssql' || $databasetype == 'odbtp' || $databasetype == 'mssql_n' || $databasetype == 'mssqlnative') - { - $createtokentable.= "email C(320) ,\n " - ."emailstatus C(300) DEFAULT 'OK',\n "; - } - else - { - $createtokentable.= "email X(320) ,\n " - ."emailstatus X(300) DEFAULT 'OK',\n "; - } - - $createtokentable.= "token C(36) ,\n " - . "language C(25) ,\n " - . "sent C(17) DEFAULT 'N',\n " - . "remindersent C(17) DEFAULT 'N',\n " - . "remindercount int I DEFAULT 0,\n " - . "completed C(17) DEFAULT 'N',\n " - . "attribute_1 C(100) ,\n" - . "attribute_2 C(100) ,\n" - . "mpid I "; - - $tabname = "{$dbprefix}tokens_{$iVid}"; # not using db_table_name as it quotes the table name (as does CreateTableSQL) - $taboptarray = array('mysql' => 'ENGINE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci', - 'mysqli' => 'ENGINE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci'); - $dict = NewDataDictionary($connect); - $sqlarray = $dict->CreateTableSQL($tabname, $createtokentable, $taboptarray); - $execresult=$dict->ExecuteSQLArray($sqlarray, false); - - $createtokentableindex = $dict->CreateIndexSQL("{$tabname}_idx", $tabname, array('token')); - $dict->ExecuteSQLArray($createtokentableindex, false); - } - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", Token tabelle sollte erstellt sein "); - ################# - - //if the lsrcSeperator is not set, set the default seperator, a comma... - if($sLsrcSeparator=='') - { - $sLsrcSeparator = ","; - } - - // prepare to fill the table lime_tokens_* - // this is sensitiv, if the Seperator is not the defined one, almost everything could happen, BE AWARE OF YOUR SEPERATOR!... - $asTokens = explode($sLsrcSeparator, $sToken); - $givenTokenCount = count($asTokens); - // write the tokens in the token_table - $insertedTokenCount=0; - - foreach($asTokens as $value) - { - if($value!='') - { - $sInsertToken = "INSERT INTO {$dbprefix}tokens_".$iVid." - (token,language) VALUES ('".$value."' , '".$_SESSION['lang']."'); "; - if(!$connect->Execute($sInsertToken)) - { - throw new SoapFault("Server: ", "Token could not be inserted"); - exit; - } - else - { - ++$insertedTokenCount; - } - } - } - return "".$givenTokenCount." Token given, ".$insertedTokenCount." Token inserted."; - -} //end of function sInsertToken - - -/** - * The new one... - * * Function to insert Participant data while auto creating token if non is supported... - * @param $sUser - * @param $sPass - * @param $iVid - * @param $sParticipantData (FIRSTNAME;LASTNAME;EMAIL;LANG;TOKEN;VALIDFROM;VALIDTO;attrib1,attrib2,attrib3,attrib4,attrib5::) - * @return unknown_type - */ -function sInsertParticipants($sUser, $sPass, $iVid, $sParticipantData) -{ - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - - - // check for appropriate rights - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - // check if there is a $iVid, else abort - if(!isset($iVid) || $iVid=='' || $iVid==0 ) - { - throw new SoapFault("Server: ", "No SurveyId given"); - exit; - } - - // check if the Survey we want to populate with data and tokens already exists, else -> Fault - if(!$lsrcHelper->surveyExists($iVid)) - { - throw new SoapFault("Database: ", "Survey does not exists"); - exit; - } - - return $lsrcHelper->insertParticipants($iVid, $sParticipantData); - - //return "".$iCountParticipants."Datasets given, ".$iInsertedParticipants." rows inserted. "; - -} - -/** - * - * function to return unused Tokens as String, seperated by commas, to get the people who did not complete the Survey - * @param $sUser - * @param $sPass - * @param $iVid - * @return unknown_type - */ -function sTokenReturn($sUser, $sPass, $iVid) -{ - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK "); - - // check for appropriate rights - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - // check if there is a $iVid, else abort - if(!isset($iVid) || $iVid=='' || $iVid==0 ) - { - throw new SoapFault("Server: ", "No SurveyId given"); - exit; - } - - // check if the Survey exists, else -> Fault - if(!$lsrcHelper->surveyExists($iVid)) - { - throw new SoapFault("Database: ", "Survey does not exists"); - exit; - } - - // check if the token table exists, else throw fault message - if(db_tables_exist($dbprefix."tokens_".$iVid)) - { - // select all the tokens that did not complete the Survey - $query2select_token = "SELECT token from {$dbprefix}tokens_".$iVid." WHERE completed = 'N'; "; - $rs = db_execute_assoc($query2select_token); - if($rs->RecordCount()<1) - { - throw new SoapFault("Database: ", "No unused Tokens found"); - exit; - } - - $n=0; - while($row = $rs->FetchRow()) - { - if($n == 0) - { - $sReturn = $row['token']; - } - else - { - $sReturn .= ",".$row['token']; - } - $n++; - } - // return Response: array([iVid],[return]) on the client side, you get this as an Array resp. list - // the keys in the array, containing the values, are named as defined in the wsdl under the response Message, in this case: array(iVid =>$iVid, return=>$sReturn) - - return $sReturn; - exit; - } - else - { - throw new SoapFault("Database: ", "Token table for this Survey does not exists"); - exit; - } -}//end of function sTokenReturn - -/** - * - * function to import an exported group of questions into a survey - * @param $sUser - * @param $sPass - * @param $iVid - * @param $sMod - * @param $gName - * @param $gDesc - * @return unknown_type - */ -function sImportGroup($sUser, $sPass, $iVid, $sMod, $gName='', $gDesc='') -{ - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK "); - - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or Password wrong"); - exit; - } - - //check for Surveyowner - if($lsrcHelper->getSurveyOwner($iVid)!=$_SESSION['loginID'] && !$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to change Surveys from other people"); - exit; - } - - if(!is_file($modDir.$sMod.".csv")) - { - throw new SoapFault("Server: ", "Survey Module $sMod does not exist"); - exit; - } - - $checkImport = $lsrcHelper->importGroup($iVid, $sMod); - if(is_array($checkImport)) - { - if($gName!='') - $lsrcHelper->changeTable("groups", "group_name", $gName, "gid='".$checkImport['gid']."'"); - if($gDesc!='') - $lsrcHelper->changeTable("groups", "description", $gDesc, "gid='".$checkImport['gid']."'"); - - return "Import OK"; - } - else - { - throw new SoapFault("Server: ", $checkImport); - exit; - } - -} - -/** - * - * function to import a fixed question - * @param $sUser - * @param $sPass - * @param $iVid - * @param $sMod - * @param $mandatory - * @return unknown_type - */ -function sImportQuestion($sUser, $sPass, $iVid, $sMod, $mandatory='N') -{ - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK "); - - // check for appropriate rights - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - //check for Surveyowner - if($lsrcHelper->getSurveyOwner($iVid)!=$_SESSION['loginID'] && !$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to change Surveys from other people"); - exit; - } - // Check if the file to import exists - if(!is_file($queDir.$sMod.".csv")) - { - throw new SoapFault("Server: ", "Survey Module $sMod does not exist"); - exit; - } - - //import the module - $lastId = $lsrcHelper->importQuestion($iVid,$sMod); - if(is_array($lastId)) - { - // $lsrcHelper->changeTable("questions", "title", $qTitle, "qid='".$lastId['qid']."'"); - // $lsrcHelper->changeTable("questions", "question", $qText, "qid='".$lastId['qid']."'"); - // $lsrcHelper->changeTable("questions", "help", $qHelp, "qid='".$lastId['qid']."'"); - $lsrcHelper->changeTable("questions", "mandatory", $mandatory, "qid='".$lastId['qid']."'"); - return "OK"; - } - else - { - throw new SoapFault("Server: ", $lastId); - exit; - } -} - -/** - * - * function to import one freetext question and change it - * @param $sUser - * @param $sPass - * @param $iVid - * @param $qTitle - * @param $qText - * @param $qHelp - * @param $sMod - * @param $mandatory - * @return unknown_type - */ -function sImportFreetext($sUser, $sPass, $iVid, $qTitle, $qText, $qHelp, $sMod='Freitext', $mandatory='N') -{ - /* - * this var maybe added later to constructor, - * to determine if a new group should be build for the question - * or if the question should be added to the last group in survey - */ - if($sMod=='') - $sMod='Freitext'; - if($mandatory=='') - $mandatory='N'; - - $newGroup=0; - - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK "); - - // check for appropriate rights - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - //check for Surveyowner - if($lsrcHelper->getSurveyOwner($iVid)!=$_SESSION['loginID'] && !$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to change Surveys from other people"); - exit; - } - // Check if the file to import exists - if(!is_file($queDir.$sMod.".csv")) - { - throw new SoapFault("Server: ", "Survey Module $sMod does not exist"); - exit; - } - - //import the module - $lastId = $lsrcHelper->importQuestion($iVid,$sMod,0); - if(is_array($lastId)) - { - $lsrcHelper->changeTable("questions", "title", $qTitle, "qid='".$lastId['qid']."'"); - $lsrcHelper->changeTable("questions", "question", $qText, "qid='".$lastId['qid']."'"); - $lsrcHelper->changeTable("questions", "help", $qHelp, "qid='".$lastId['qid']."'"); - $lsrcHelper->changeTable("questions", "mandatory", $mandatory, "qid='".$lastId['qid']."'"); - return "OK"; - } - else - { - throw new SoapFault("Server: ", $lastId); - exit; - } -} - -/** - * - * function to import a five scale Matrix question and set 1 to n items - * @param $sUser - * @param $sPass - * @param $iVid - * @param $qTitle - * @param $qText - * @param $qHelp - * @param $sItems - * @param $sMod - * @param $mandatory - * @return unknown_type - */ -function sImportMatrix($sUser, $sPass, $iVid, $qTitle, $qText, $qHelp, $sItems, $sMod='Matrix5', $mandatory='N') -{ - /* - * this var maybe added later to constructor, - * to determine if a new group should be build for the question - * or if the question should be added to the last group in survey - */ - if($sMod=='') - $sMod='Matrix5'; - if($mandatory=='') - $mandatory='N'; - - $newGroup=0; - - global $connect ; - global $dbprefix ; - //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.", START OK"); - - // check for appropriate rights - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - //check for surveyOwner - if($lsrcHelper->getSurveyOwner($iVid)!=$_SESSION['loginID'] && !$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to change Surveys from other people"); - exit; - } - // Check if the file to import exists - if(!is_file($queDir.$sMod.".csv")) - { - throw new SoapFault("Server: ", "Survey Module $sMod does not exist"); - exit; - } - $lastId = $lsrcHelper->importQuestion($iVid,$sMod,$newGroup); - if(is_array($lastId)) - { - $lsrcHelper->changeTable("questions", "title", $qTitle, "qid='".$lastId['qid']."'"); - $lsrcHelper->changeTable("questions", "question", $qText, "qid='".$lastId['qid']."'"); - $lsrcHelper->changeTable("questions", "help", $qHelp, "qid='".$lastId['qid']."'"); - if($mandatory==''){$mandatory='N';} - $lsrcHelper->changeTable("questions", "mandatory", $mandatory, "qid='".$lastId['qid']."'"); - - $aItems = explode(",", $sItems); - $n=0; - foreach($aItems as $item) - { - ++$n; - $lsrcHelper->changeTable("answers", "qid,code,answer,default_value,sortorder,language", "'".$lastId['qid']."', '$n','$item','N','$n','".GetBaseLanguageFromSurveyID($iVid)."' " , "", 1); - } - return "OK"; - } - else - { - throw new SoapFault("Server: ", $lastId); - exit; - } - -} - -/** - * - * function to collect all available Modules and send them comma seperated to the client - * @param String $sUser - * @param String $sPass - * @param String $mode ("mod" or "core") - * @return commma seperated list of available Modules (groups) - */ -function sAvailableModules($sUser, $sPass, $mode='mod') -{ - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",mode=$mode START OK "); - - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - switch($mode){ - case ('mod'): - - $mDir = opendir($modDir); - $n=0; - while(false !== ($file = readdir($mDir))) - { - if(substr($file,-4,4)==".lss" || substr($file,-4,4)==".csv") - { - //$file = basename ($file, ".csv"); - //$file = str_replace("mod_", "", $file); - - if($n == 0) - { - $return = $file; - $n=1; - } - else - { - $return .= ",".$file; - } - } - - } - return $return; - break; - case ('core'): - - $cDir = opendir($coreDir); - $n=0; - while(false !== ($file = readdir($cDir))) - { - if(substr($file,-4,4)==".lss" || substr($file,-4,4)==".csv") - { - //$file = basename ($file, ".csv"); - //$file = str_replace("mod_", "", $file); - if($n == 0) - { - $return = $file; - $n=1; - - } - else - { - $return .= ",".$file; - } - } - } - return $return; - break; - case ('que'): - - $cDir = opendir($queDir); - $n=0; - while(false !== ($file = readdir($cDir))) - { - if(substr($file,-4,4)==".lss" || substr($file,-4,4)==".csv") - { - //$file = basename ($file, ".csv"); - //$file = str_replace("mod_", "", $file); - if($n == 0) - { - $return = $file; - $n=1; - - } - else - { - $return .= ",".$file; - } - } - } - return $return; - break; - } -} - -/** - * - * function to delete a survey - * @param unknown_type $sUser - * @param unknown_type $sPass - * @param unknown_type $iVid - */ -function sDeleteSurvey($sUser, $sPass, $iVid) -{ - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",sid=$iVid START OK "); - - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - - if($lsrcHelper->getSurveyOwner($iVid)!=$_SESSION['loginID'] && !$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to delete Surveys from other people"); - exit; - } - // check if the Survey exists, else -> Fault - if(!$lsrcHelper->surveyExists($iVid)) - { - throw new SoapFault("Database: ", "Survey $iVid does not exist"); - exit; - } - - if($lsrcHelper->deleteSurvey($iVid)) - { - return "Survey $iVid deleted"; - } - else - { - throw new SoapFault("Server: ", "Survey $iVid was not deleted"); - exit; - } - - -} -/** - * - * Enter description here... - * @param $sUser Limesurvey user - * @param $sPass Password - * @param $iVid surveyid - * @param $email e-mail adress of the recipient - * @param $docType pdf, xls or html - * @param $graph with 1 it includes graphs in pdf files - * @return "OK" or SoapFault - */ -function fSendStatistic($sUser, $sPass, $iVid, $email, $docType='pdf', $graph='0') -{ - global $connect ; - global $dbprefix ; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - - // Check if all mandatory parameters are present, else abort... - if(!is_int($iVid) || $iVid==0 || $email=='') - { - throw new SoapFault("Server: ", "Mandatory Parameters missing"); - exit; - } - - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - if($lsrcHelper->getSurveyOwner($iVid)!=$_SESSION['loginID'] && !$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to send statistics from other peoples Surveys"); - exit; - } - if(!$lsrcHelper->surveyExists($iVid)) - { - throw new SoapFault("Database: ", "Survey $iVid does not exists"); - exit; - } - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",sid=$iVid email=$email doctype=$docType graph=$graph START OK "); - - /** - * Build up the fields to generate statistics from - */ - $summarySql=" SELECT gid, lid, qid, type " - ." FROM {$dbprefix}questions " - ." WHERE sid=$surveyid "; - - $summaryRs = $connect->Execute($summarySql); - $lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",sid=$iVid OK "); - foreach($summaryRs as $field) - { - $myField = $surveyid."X".$field['gid']."X".$field['qid']; - - // Multiple choice get special treatment - if ($field['type'] == "M" || $field['type'] == "P") {$myField = "M$myField";} - //numerical input will get special treatment (arihtmetic mean, standard derivation, ...) - if ($field['type'] == "N") {$myField = "N$myField";} - - if ($field['type'] == "Q") {$myField = "Q$myField";} - // textfields get special treatment - if ($field['type'] == "S" || $field['type'] == "T" || $field['type'] == "U"){$myField = "T$myField";} - //statistics for Date questions are not implemented yet. - if ($field['type'] == "D") {$myField = "D$myField";} - if ($field['type'] == "F" || $field['type'] == "H") - { - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - //Get answers. We always use the answer code because the label might be too long elsewise - $query = "SELECT code, answer FROM ".db_table_name("answers")." WHERE qid='".$field['qid']."' AND language='{$language}' ORDER BY sortorder, answer"; - $result = $connect->Execute($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - $counter2=0; - - //check all the answers - while ($row=$result->FetchRow()) - { - $myField = "$myField{$row[0]}"; - } - //$myField = "{$surveyid}X{$flt[1]}X{$flt[0]}{$row[0]}[]"; - - - } - $summary[]=$myField; - - } - - //$lsrcHelper->debugLsrc("wir sind in ".__FUNCTION__." Line ".__LINE__.",".print_r($summary)." "); - switch ($docType) - { - case 'pdf': - $tempFile = generate_statistics($iVid,$summary,'all',$graph,$docType,'F'); - - if($lsrcHelper->sendStatistic($iVid, $email, $tempFile)) - { - unlink($tempFile); - return 'PDF send'; - } - else - { - unlink($tempFile); - throw new SoapFault("Mail System", "Mail could not be send! Check LimeSurveys E-Mail Settings."); - exit; - } - break; - case 'xls': - $tempFile = generate_statistics($iVid,$summary,'all',0,$docType, 'F'); - - if($lsrcHelper->sendStatistic($iVid, $email, $tempFile)) - { - unlink($tempFile); - return 'XLS send'; - } - else - { - unlink($tempFile); - throw new SoapFault("Mail System", "Mail could not be send! Check LimeSurveys E-Mail Settings."); - exit; - } - break; - case 'html': - $html = generate_statistics($iVid,$summary,'all',0,$docType, 'F'); - - if($lsrcHelper->sendStatistic($iVid, $email, null, $html)) - { - return 'HTML send'; - } - else - { - throw new SoapFault("Mail System", "Mail could not be send! Check LimeSurveys E-Mail Settings."); - exit; - } - break; - } - - - - -} -/** - * - * This function pulls a CSV representation of the Field map - * @param $sUser - * @param $sPass - * @param $iVid - * @return unknown_type - */ -function sGetFieldmap($sUser, $sPass, $iVid) -{ - include("lsrc.config.php"); - $lsrcHelper = new lsrcHelper(); - - if(!$lsrcHelper->checkUser($sUser, $sPass)) - { - throw new SoapFault("Authentication: ", "User or password wrong"); - exit; - } - if($lsrcHelper->getSurveyOwner($iVid)!=$_SESSION['loginID'] && !$_SESSION['USER_RIGHT_SUPERADMIN']=='1') - { - throw new SoapFault("Authentication: ", "You have no right to get fieldmaps from other peoples Surveys"); - exit; - } - if(!$lsrcHelper->surveyExists($iVid)) - { - throw new SoapFault("Database: ", "Survey $iVid does not exists"); - exit; - } - - $returnCSV = "".$lsrcHelper->FieldMap2CSV($iVid); - return $returnCSV; - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/remotecontrol/lsrc.testclient.php b/include/limesurvey/admin/remotecontrol/lsrc.testclient.php deleted file mode 100644 index 06ec128f..00000000 --- a/include/limesurvey/admin/remotecontrol/lsrc.testclient.php +++ /dev/null @@ -1,635 +0,0 @@ -prepare($_POST['sid']); -} -else -{ - $iVid=''; - $testclient->prepare(); -} -/** - * set user and password - */ -//$testclient->user = 'admin'; -//$testclient->pass = 'hisuser'; - -/** - * set the path2wsdl to what ever is set by the user - */ -//if(isset($_POST['wsdl'])) -// $testclient->path2wsdl = $_POST['wsdl']; - -$sReturn = ''; - -/** call the desired function */ -reset($_POST); -while (list($key, $value) = each($_POST)) { - switch ($key) { - case "sendStatistic": - - try { - $sReturn = $testclient->sendStatistics($_REQUEST['type'], $_REQUEST['email'], $_REQUEST['graph']); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - - break; - case "delsurvey": - try { - $sReturn = $testclient->deleteSurvey(); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - break; - case "sendMail": - - $sType = $_REQUEST['type']; - $maxemails = $_REQUEST['maxemails']; - $subject = $_REQUEST['subject']; - $mailText = $_REQUEST['mailText']; - - try { - $sReturn = $testclient->sendMail($sType, $maxemails, $subject, $mailText); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - break; - case "getField": - - try { - $sReturn = $testclient->getFieldmap(); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - break; - case "delsurvey": - - try { - $sReturn = $testclient->deleteSurvey(); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - break; - case "impMatrix": - - $qText = $_REQUEST['quest']; - $mandatory = $_REQUEST['mandatory']; - for ($n = 1; $n < 10; ++$n) { - if ($_REQUEST['item' . $n] != '') { - if ($n == 1) { - $items = $_REQUEST['item' . $n]; - } else { - $items .= "," . $_REQUEST['item' . $n]; - } - } - } - - $qHelp = $_REQUEST['help']; - - try { - - $sReturn = $testclient->importMatrix($qTitle, $qText, $qHelp, $items, "Matrix5", $mandatory); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - break; - - - case "impFree": - - $qTitle = $_REQUEST['title']; - $qText = $_REQUEST['quest']; - $qHelp = $_REQUEST['help']; - $mandatory = $_REQUEST['mandatory']; - - try { - - $sReturn = $testclient->sImportFreetext($qTitle, $qText, $qHelp, "Freitext", $mandatory); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - break; - - case "impQuest": - - $sMod = $_REQUEST['mod']; - $mandatory = $_REQUEST['mandatory']; - - try { - - $sReturn = $testclient->importQuestion($sMod, $mandatory); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - break; - - case "impGroup": - - $sMod = $_REQUEST['mod']; - $sGroupName = $_REQUEST['groupName']; - $sGroupDescription = $_REQUEST['groupDescription']; - try { - $sReturn = $client->sImportGroup($sMod, $sGroupName, $sGroupDescription); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - - break; - - case "activate": - $dStart = $_REQUEST['start']; - $dEnd = $_REQUEST['end']; - try { - $sReturn = $testclient->activateSurvey($dStart, $dEnd); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - - - break; - - case "createSurvey": - $sVbes = $_REQUEST['sdes']; - $sVtit = $_REQUEST['stit']; - $sVwel = $_REQUEST['sVwel']; - $sVend = $_REQUEST['sVend']; - $sMail = $_REQUEST['sEmail']; - $sName = $_REQUEST['sName']; - $sUrl = $_REQUEST['sUrl']; - $sUbes = $_REQUEST['sUdes']; - $sVtyp = $_REQUEST['core']; - - try { - $sReturn = $testclient->createSurvey($sVtit, $sVbes, $sVwel, $sVend, $sMail, $sName, $sUrl, $sUbes, $sVtyp); - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - $sOutput .= "

    Return: " . $sReturn; - - - break; - - case "change": - - $table = $_REQUEST['table']; - $key = $_REQUEST['key']; - $value = $_REQUEST['value']; - $where = $_REQUEST['whereKey']; - $mode = $_REQUEST['mode']; - //$whereValue = $_REQUEST['whereValue']; - - try { - $sReturn = $testclient->changeSurvey($table, $key, $value, $where, $mode); - $sOutput .= "

    Return: " . $sReturn; - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - - - break; - - case "tokens": - - $sToken = $_REQUEST['token']; - try { - $sReturn = $testclient->insertToken($sToken); - $sOutput .= "

    Return: " . $sReturn; - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - - break; - - case "tokRet": - - try { - $sReturn = $testclient->tokenReturn(); - $sOutput .= "

    Return: " . $sReturn; - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - - break; - - case "insPar": - - $sParticipantData = $_REQUEST['sParticipantData']; - try { - $sReturn = $testclient->insertParticipants($sParticipantData); - - $sOutput .= "

    Return: " . $sReturn; - } catch (SoapFault $fault) { - $sOutput .= "

    SOAP Error: " . $fault->faultcode . " : " . $fault->faultstring . ""; - } - //these are just outputs for testing - - - break; - } -} - -## -##################################################################### - -/** - * begin with output (some css first) - */ -?> - - - - - LimeSurvey RC Testclient - - - - -soapCheck(); -/** - * if there is an return, output request and response for debugging - */ -if (isset($sReturn) && $sReturn != '') { - echo $testclient->getResponse(); -} - -// we dump the client object functions (which are functions of the server defined in the wsdl) -if (!isset($sReturn) || $sReturn == '') { - echo $testclient->getServerFunctions(); -} - -if (isset($sOutput)) { - - echo '
    '; - echo '

    testing output:

    '; - if (isset($testclient->sid)) { - echo "test Survey"; - } - echo $sOutput; - echo '
    '; -} -?> -
    -

    sCreateSurvey function

    -
    ' method='post'>* VeranstaltungsTyp:
    -
    - * VeranstaltungsID / SurveyID (have to be - Integer):
    -
    - * Veranstaltungs Titel / Survey Title (used - as part of the welcome message, if welcome Message is left blank):
    -
    - * VeranstaltungsBeschreibung / - SurveyDescription (used as part of the welcome message, if welcome - Message is left blank):
    -
    - Willkommenstext / Welcome Message:
    -
    - Endtext / endtext:
    -
    - Admin Name:
    -
    - Admin Email:
    -
    - End Url:
    -
    - Url Description:
    -
    - " ?> -
    -
    - - -
    -

    sActivateSurvey function

    -
    ' method='post'>* VeranstaltungsID / SurveyID:
    -
    - Startdate (YYYY-MM-DD):
    -
    - Enddate (YYYY-MM-DD):
    -
    - " ?> -
    -
    - -
    -

    sDeleteSurvey function

    - (attention: no safetyquestion is asked!)
    -
    ' method='post'>* VeranstaltungsID / SurveyID:
    -
    - " ?> -
    -
    - -
    -

    sImportGroup function

    -
    ' method='post'>* VeranstaltungsID / SurveyID (have to be Integer): -
    -
    - * Question group to add (INF,BIO,BWL is - there for testing):
    -
    - Name of the group:
    -
    - groupDescription:
    - -
    -" ?> -
    -
    - -
    -

    sImportFreetext

    -
    ' method='post'>* VeranstaltungsID / SurveyID (have to be Integer): -
    -
    - Mandatory
    - * Question Title :
    -
    - * Question:
    -
    - Helptext:
    -
    -" ?> -
    -
    - -
    -

    sImportQuestion

    -
    ' method='post'>* VeranstaltungsID / SurveyID (have to be Integer): -
    -
    - Mandatory
    - * Question csv to import:
    -
    -" ?> -
    -
    - - -
    -

    sImportMatrix

    -
    ' method='post'>* VeranstaltungsID / SurveyID (have to be Integer): -
    -
    - Mandatory
    - * Question :
    -
    -Item {$n} :

    ", - "", - "
    "; - } -?> Helptext:
    -
    -" ?> -
    -
    - - -
    -

    sChangeSurvey function

    - ( this is not part of the lsrc, it just shows the power of it,
    - it has to be activated in server.php on line ~60 ) -
    ' method='post'> update insert
    - Table to change
    -
    - Key
    -
    - Value
    -
    - where Condition
    -
    -
    - -
    - - "; - echo "

    sInsertToken function

    "; - echo "

    Makes the Survey closed.
    Means: It's only available to people who have an unused token

    "; - echo "
    "; - echo "* VeranstaltungsID / SurveyID (have to be Integer):
    "; - echo ""; - echo "
    "; - echo "Tokens seperated by comma (,) :
    "; - echo ""; - echo "
    "; - echo ""; - echo ""; - echo "
    "; - echo "
    "; - - - echo "
    "; - echo "

    sTokenReturn function

    "; - echo "
    "; - echo "* VeranstaltungsID / SurveyID (have to be Integer):
    "; - echo "
    "; - echo ""; - echo ""; - echo "
    "; - - echo "
    "; - echo "

    sInsertParticipants function

    "; - echo "

    Makes the Survey closed. Means: It's only available to people who have an unused token

    "; - echo "
    "; - echo "* VeranstaltungsID / SurveyID (have to be Integer):
    "; - echo ""; - echo "
    "; - echo "* Data in this Format [params in square brackets are optional]:
    \"FIRSTNAME;LASTNAME;EMAIL;LANG[;TOKEN;VALIDFROM;VALIDUNTIL;attrib1,attrib2,attrib3,attrib4,attrib5] -
    ::FIRSTNAME;LASTNAME;EMAIL;LANG[;TOKEN;VALIDFROM;VALIDUNTIL;attrib1,attrib2,attrib3,attrib4,attrib5]\" and so on :

    "; - echo " "; - echo "
    "; - echo ""; - echo ""; - echo "
    "; - echo "
    "; - - echo "
    "; - echo "

    sSendEmail function

    "; - echo "

    Sends an Email to users of a specific survey. Invite, Remind and custom emails are possible

    "; - echo "
    "; - echo "* SurveyID (have to be Integer):
    "; - echo ""; - echo "
    "; - echo "* Email Type:
    "; - echo " invite"; - echo " remind"; - echo " custom
    "; - echo "Maxemails (have to be Integer):
    "; - echo ""; - echo "
    "; -//echo "* Data in this Format [params in square brackets are optional]:
    \"FIRSTNAME;LASTNAME;EMAIL[;[ATTRIB1];[ATTRIB2]]::FIRSTNAME;LASTNAME;EMAIL[;[ATTRIB1];[ATTRIB2]]\" and so on :

    "; - echo "Subject for custom cails
    "; - echo "
    "; - echo "Mailtext for custom cails
    "; - echo " "; - echo "
    "; - echo ""; - echo ""; - echo "
    "; - echo "
    "; - - echo "
    "; - echo "

    sGetFieldmap function

    "; - echo "

    Gets you the fieldmap from a survey as csv

    "; - echo "
    "; - echo "* VeranstaltungsID / SurveyID (have to be Integer):
    "; - echo "
    "; - echo ""; - echo ""; - echo "
    "; - - echo "
    "; - echo "

    fSendStatistic function

    "; - echo "

    Gets statistic from a survey and sends it to an E-Mail recipient

    "; - echo "
    "; - echo "* VeranstaltungsID / SurveyID (have to be Integer):
    "; - echo "
    "; - echo "* E-Mail Adress:
    "; - echo "
    "; - echo "Include graphs (only with pdf generation)
    "; - echo "PDF attachement"; - echo "Excel attachement"; - echo "HTML Mail
    "; - - echo ""; - echo ""; - echo "
    "; -//phpinfo(); - ?> - - - diff --git a/include/limesurvey/admin/remotecontrol/lsrc_orig.wsdl b/include/limesurvey/admin/remotecontrol/lsrc_orig.wsdl deleted file mode 100644 index a381d8db..00000000 --- a/include/limesurvey/admin/remotecontrol/lsrc_orig.wsdl +++ /dev/null @@ -1,731 +0,0 @@ - - - - - - - - - - Function to start Surveys in LimeSurvey... - - - Admin or Superadmin Account in Limesurvey needed - - - - Correct password for the Superadmin in - Limesurvey - - - - This is the "VeranstaltungsID" similar to the SurveyID... Integer expected... - - - titel of the event, put together from NR and NAME from LSF. veranstaltung - - This is the "Veranstaltungsbeschreibung", the Surveydescription. - String expected. Put together from TYP, DOZENTEN- TITLE, -NAME, - - - - - - The E-Mail Adress of the Person who to contact in matters of evaluation. Limesurvey uses this to send notifications of Surveyparticipation, if wante - The Name of the Administrator, resp. the Person whos email Adress was given - - The URL to wich will be redirected when completing the Survey - - The text for the Link, if not loaded automatically - - - - - - - - This is the return Value of sCreateSurvey, if everything went fine it's the sid(SurveyID) resp. vid(VeranstaltungsID) of the newly imported Survey - - - - - - - Admin or Superadmin Account in Limesurvey needed - - - - Correct password for the Superadmin in Limesurvey - - - - SurveyID of existing Survey, which gets the Token table - - - - String of tokens seperated by a comma (default)... You have the possibility to change the desired seperator in LimeSurveys config.php - - - - - - - - This is the return Value of InsertToken, if everything went fine it's "Token table populated successfully" - - - - - - - Admin or Superadmin Account in Limesurvey needed - - - - Correct password for the Superadmin in Limesurvey - - - - SurveyID of existing Survey, which gets the Token table - - - - Data for Participant expected in this format: [Firstname];[Lastname];[email@email.de]::[Firstname];[Lastname];[email@email.de]::[Firstname];[Lastname];[email@email.de] and so on... seperate the Datasets with :: and the Datafields in the Sets with ; - - - - - - - This is the return Value of sInsertParticipants, if everything went fine it's "Token table populated successfully" - - - - - - - Admin or Superadmin Account in Limesurvey needed - - - - Correct password for the Superadmin in Limesurvey - - - - SurveyID of existing Survey, which has a Token table - - - - - - - - - String of unused Tokens seperated by comma - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Creates (Import and activate) a Survey in LimeSurvey - - - - - - Create Token-Table and populate it for closed LimeSurvey Surveys - - - - - - Create Token-Table and populate it with personal data for closed Surveys - - - - - - Returns unused Tokens from closed LimeSurvey Surveys - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This is the LsrcService - for remote starting surveys and registering tokens in LimeSurvey. - Make sure to modify the soap:address to the current Location of the lsrcserver.php - It has to be like this: 'http://servername/[limesurveydir]/lsrcservice/lsrcserver.php' - NOTE: http for normal mode, begin the url with https for a SSL Webservice, it's just that easy. - - - - - - - \ No newline at end of file diff --git a/include/limesurvey/admin/remotecontrol/questions/.htaccess b/include/limesurvey/admin/remotecontrol/questions/.htaccess deleted file mode 100644 index 63680658..00000000 --- a/include/limesurvey/admin/remotecontrol/questions/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ -#tims Verzeichnisschutz -order deny,allow -deny from all -allow from 127.0.0.1 diff --git a/include/limesurvey/admin/remotecontrol/questions/Freitext.csv b/include/limesurvey/admin/remotecontrol/questions/Freitext.csv deleted file mode 100644 index 4e7bdf88..00000000 --- a/include/limesurvey/admin/remotecontrol/questions/Freitext.csv +++ /dev/null @@ -1,27 +0,0 @@ -# LimeSurvey Question Dump -# DBVersion 132 -# This is a dumped question from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# QUESTIONS TABLE -# -"qid","sid","gid","type","title","question","preg","help","other","mandatory","lid","lid1","question_order","language" -"2902","666","559","T","1","Placeholder","","Placeholder","N","Y","0","0","0","de" - -# -# ANSWERS TABLE -# - -# -# LABELSETS TABLE -# - -# -# LABELS TABLE -# - -# -# QUESTION_ATTRIBUTES TABLE -# diff --git a/include/limesurvey/admin/remotecontrol/questions/Matrix5.csv b/include/limesurvey/admin/remotecontrol/questions/Matrix5.csv deleted file mode 100644 index 873e6c83..00000000 --- a/include/limesurvey/admin/remotecontrol/questions/Matrix5.csv +++ /dev/null @@ -1,27 +0,0 @@ -# LimeSurvey Question Dump -# DBVersion 132 -# This is a dumped question from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# QUESTIONS TABLE -# -"qid","sid","gid","type","title","question","preg","help","other","mandatory","lid","lid1","question_order","language" -"2904","666","560","A","1","This is a question
    ","","","N","N","0","0","0","de" - -# -# ANSWERS TABLE -# - -# -# LABELSETS TABLE -# - -# -# LABELS TABLE -# - -# -# QUESTION_ATTRIBUTES TABLE -# diff --git a/include/limesurvey/admin/remotecontrol/questions/index.html b/include/limesurvey/admin/remotecontrol/questions/index.html deleted file mode 100644 index e69de29b..00000000 diff --git a/include/limesurvey/admin/remotecontrol/surveys/.htaccess b/include/limesurvey/admin/remotecontrol/surveys/.htaccess deleted file mode 100644 index 63680658..00000000 --- a/include/limesurvey/admin/remotecontrol/surveys/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ -#tims Verzeichnisschutz -order deny,allow -deny from all -allow from 127.0.0.1 diff --git a/include/limesurvey/admin/remotecontrol/surveys/Empty.csv b/include/limesurvey/admin/remotecontrol/surveys/Empty.csv deleted file mode 100644 index 9609958c..00000000 --- a/include/limesurvey/admin/remotecontrol/surveys/Empty.csv +++ /dev/null @@ -1,58 +0,0 @@ -# LimeSurvey Survey Dump -# DBVersion 138 -# This is a dumped survey from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# SURVEYS TABLE -# -"sid","owner_id","admin","active","startdate","expires","adminemail","private","faxto","format","template","language","additional_languages","datestamp","usecookie","notification","allowregister","allowsave","printanswers","autonumber_start","autoredirect","allowprev","ipaddr","refurl","datecreated","listpublic","publicstatistics","publicgraphs","htmlemail","tokenanswerspersistence","assessments","usecaptcha","bounce_email","usetokens","attributedescriptions" -"26553","1","Tim Wahrendorff","N","","","wahrendorff@localhost","Y","","G","hisinone","de","","N","N","0","N","Y","N","0","N","Y","N","N","2009-04-21","N","N","N","Y","N","N","D","wahrendorff@localhost","N","" - -# -# GROUPS TABLE -# - -# -# QUESTIONS TABLE -# - -# -# ANSWERS TABLE -# - -# -# CONDITIONS TABLE -# - -# -# LABELSETS TABLE -# - -# -# LABELS TABLE -# - -# -# QUESTION_ATTRIBUTES TABLE -# - -# -# ASSESSMENTS TABLE -# - -# -# SURVEYS_LANGUAGESETTINGS TABLE -# -"surveyls_survey_id","surveyls_language","surveyls_title","surveyls_description","surveyls_welcometext","surveyls_url","surveyls_urldescription","surveyls_endtext","surveyls_email_invite_subj","surveyls_email_invite","surveyls_email_remind_subj","surveyls_email_remind","surveyls_email_register_subj","surveyls_email_register","surveyls_email_confirm_subj","surveyls_email_confirm","surveyls_dateformat" -"26553","de","Empty","","","","","
    ","Einladung zur Teilnahme an einer Umfrage","Hallo {FIRSTNAME},

    Hiermit möchten wir Sie zu einer Umfrage einladen.

    Der Titel der Umfrage ist
    '{SURVEYNAME}'

    '{SURVEYDESCRIPTION}'

    Um an dieser Umfrage teilzunehmen, klicken Sie bitte auf den unten stehenden Link.

    Mit freundlichen Grüßen,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Klicken Sie hier um die Umfrage zu starten:
    {SURVEYURL}","Erinnerung an Teilnahme an einer Umfrage","Hallo {FIRSTNAME},

    Vor kurzem haben wir Sie zu einer Umfrage eingeladen.

    Zu unserem Bedauern haben wir bemerkt, dass Sie die Umfrage noch nicht ausgefüllt haben. Wir möchten Ihnen mitteilen, dass die Umfrage noch aktiv ist und würden uns freuen, wenn Sie teilnehmen könnten.

    Der Titel der Umfrage ist
    '{SURVEYNAME}'

    '{SURVEYDESCRIPTION}'

    Um an dieser Umfrage teilzunehmen, klicken Sie bitte auf den unten stehenden Link.

    Mit freundlichen Grüßen,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Klicken Sie hier um die Umfrage zu starten:
    {SURVEYURL}","Registrierungsbestätigung für Teilnahmeumfrage","Hallo {FIRSTNAME},

    Sie (oder jemand, der Ihre Email benutzt hat) haben sich für eine Umfrage mit dem Titel {SURVEYNAME} angemeldet.

    Um an dieser Umfrage teilzunehmen, klicken Sie bitte auf den folgenden Link.

    {SURVEYURL}

    Wenn Sie irgendwelche Fragen zu dieser Umfrage haben oder wenn Sie sich _nicht_ für diese Umfrage angemeldet haben und sie glauben, dass Ihnen diese Email irrtümlicherweise zugeschickt worden ist, kontaktieren Sie bitte {ADMINNAME} unter {ADMINEMAIL}.","Abschlussbestätigung einer Umfrage","Hallo {FIRSTNAME},

    Vielen Dank für die Teilnahme an der Umfrage mit dem Titel {SURVEYNAME}. Ihre Antworten wurden bei uns gespeichert.

    Wenn Sie irgendwelche Fragen zu dieser Email haben, kontaktieren Sie bitte {ADMINNAME} unter {ADMINEMAIL}.

    Mit freundlichen Grüßen,

    {ADMINNAME}","1" - -# -# QUOTA TABLE -# - -# -# QUOTA_MEMBERS TABLE -# - diff --git a/include/limesurvey/admin/remotecontrol/surveys/index.html b/include/limesurvey/admin/remotecontrol/surveys/index.html deleted file mode 100644 index e69de29b..00000000 diff --git a/include/limesurvey/admin/remotecontrol/surveys/template_db138.csv b/include/limesurvey/admin/remotecontrol/surveys/template_db138.csv deleted file mode 100644 index f4d630d4..00000000 --- a/include/limesurvey/admin/remotecontrol/surveys/template_db138.csv +++ /dev/null @@ -1,146 +0,0 @@ -# LimeSurvey Survey Dump -# DBVersion 138 -# This is a dumped survey from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# SURVEYS TABLE -# -"sid","owner_id","admin","active","startdate","expires","adminemail","private","faxto","format","template","language","additional_languages","datestamp","usecookie","notification","allowregister","allowsave","printanswers","autonumber_start","autoredirect","allowprev","ipaddr","refurl","datecreated","listpublic","publicstatistics","publicgraphs","htmlemail","tokenanswerspersistence","assessments","usecaptcha","bounce_email","usetokens","attributedescriptions" -"43521","1","Tim Wahrendorff","N","","","wahrendorff@his.de","Y","","G","hisinone","de","","N","N","0","N","N","N","0","N","Y","N","N","2009-06-02","N","N","N","Y","N","N","D","wahrendorff@his.de","N","" - -# -# GROUPS TABLE -# -"gid","sid","group_name","group_order","description","language" -"21","43521","Angaben zum Teilnehmer / zur Teilnehmerin","0","","de" -"22","43521","Angaben zur Lehrveranstaltung","1","","de" -"23","43521","Angaben zur Lehrperson","2","","de" -"24","43521","Abschließende Bewertung","3","","de" - -# -# QUESTIONS TABLE -# -"qid","sid","gid","type","title","question","preg","help","other","mandatory","lid","lid1","question_order","language" -"65","43521","21","G","1","Geben Sie bitte Ihr Geschlecht an.
    ","","Diese Frage dient der späteren Auswertung nach Geschlecht. Es steht Ihnen frei diese Frage nicht zu beantworten.
    ","N","N","0","0","0","de" -"66","43521","21","Z","2","In welchem Fachsemester befinden Sie sich momentan?
    ","","","N","N","3","0","1","de" -"67","43521","21","S","3","In welchem Studienfach besuchen Sie die Lehrveranstaltung?
    ","","Bitte geben Sie den offiziellen Namen des Studienfachs an, für den Sie eingeschrieben sind.
    ","N","N","0","0","2","de" -"68","43521","21","!","4","Welchen Abschluss streben Sie an?
    ","","","N","N","0","0","3","de" -"69","43521","21","F","5","Haben Sie regelmässig an der Veranstaltung teilgenommen?
    ","","","N","Y","2","0","4","de" -"70","43521","21","M","5a","Ich habe aus folgendem Grund / folgenden Gründen nicht an der Lehrveranstaltung teilgenommen:
    ","","(Mehrfachnennung möglich)
    ","Y","N","0","0","5","de" -"71","43521","21","M","6","
    Was  ist  der  vorrangige  Grund  für  den  Besuch  dieser Lehrveranstaltung?
    \n
    ","","(Mehrfachnennung möglich)","Y","N","0","0","6","de" -"72","43521","22","F","7","Die Lehrveranstaltung fiel häufig aus.
    ","","","N","Y","1","0","0","de" -"73","43521","22","F","8","Die Lehrveranstaltung hat ein erkennbares Ziel.
    ","","","N","Y","1","0","1","de" -"74","43521","22","F","9","Die Leistungsanforderungen in der Lehrveranstaltung sind zu hoch.
    ","","","N","Y","1","0","2","de" -"75","43521","22","F","10","Ich lerne viel in der Lehrveranstaltung.
    ","","","N","Y","1","0","3","de" -"76","43521","22","F","11","Diese Lehrveranstaltung ist im Studienverlauf richtig positioniert.
    ","","","N","Y","1","0","4","de" -"77","43521","23","F","12","Die Lehrperson setzt Medien angemessen ein.
    ","","","N","Y","1","0","0","de" -"78","43521","23","F","13","Die Lehrperson hat die Lehrveranstaltung regelmäßig selbst gehalten.
    ","","","N","Y","1","0","1","de" -"79","43521","23","F","14","Ich würde die Lehrperson für diese Lehrveranstaltung weiterempfehlen.
    ","","","N","Y","1","0","2","de" -"80","43521","24","F","15","Ich würde diese Lehrveranstaltung weiterempfehlen.
    ","","","N","Y","1","0","0","de" - -# -# ANSWERS TABLE -# -"qid","code","answer","default_value","sortorder","assessment_value","language" -"68","bac","Bachelor","N","3","0","de" -"68","dipl","Diplom","N","1","0","de" -"68","mag","Magister","N","4","0","de" -"68","mas","Master","N","2","0","de" -"69","1","Ich habe|an der Veranstaltung teilgenommen","N","1","1","de" -"70","1","Zeitliche Überschneidung mit anderen Kursen","N","1","1","de" -"70","2","Zu viel Kurse","N","2","2","de" -"70","3","Zulassung für andere Kurse erhalten","N","3","3","de" -"70","4","Zu hoher Arbeitsaufwand","N","4","4","de" -"70","5","Thema nicht interessant","N","5","5","de" -"71","1","Pflichtveranstaltung","N","1","1","de" -"71","2","Prüfungsrelevanz","N","2","2","de" -"71","3","Examensvorbereitung","N","3","3","de" -"71","4","Scheinerwerb","N","4","4","de" -"71","5","Interesse","N","5","5","de" -"71","6","Zeitlich günstig","N","6","6","de" -"71","7","Lehrperson","N","7","7","de" -"72","1","trifft zu|trifft nicht zu","N","1","1","de" -"73","1","trifft zu|trifft nicht zu","N","1","1","de" -"74","1","trifft zu|trifft nicht zu","N","1","1","de" -"75","1","trifft zu|trifft nicht zu","N","1","1","de" -"76","1","trifft zu|trifft nicht zu","N","1","1","de" -"77","1","trifft zu|trifft nicht zu","N","1","1","de" -"78","1","trifft zu|trifft nicht zu","N","1","1","de" -"79","1","trifft zu|trifft nicht zu","N","1","0","de" -"80","1","trifft zu|trifft nicht zu","N","1","0","de" - -# -# CONDITIONS TABLE -# -"cid","qid","scenario","cqid","cfieldname","method","value" -"5","70","1","69","43521X21X691","> ","1" - -# -# LABELSETS TABLE -# -"lid","label_name","languages" -"1","1_to_5","de en" -"2","teilgenommen nicht teilgenommen","de" -"3","Fachsemester","de" - -# -# LABELS TABLE -# -"lid","code","title","sortorder","language" -"3","1","1 bis 4","1","de" -"2","1","Immer","1","de" -"1","3","3","3","en" -"3","2","4 bis 8","2","de" -"1","3","3","3","de" -"3","4",">14","4","de" -"1","1","1","1","en" -"1","5","5","5","en" -"3","3","8 bis 14","3","de" -"1","2","2","2","de" -"1","4","4","4","en" -"2","2","Meistens","2","de" -"1","5","5","5","de" -"1","1","1","1","de" -"2","4","Nie","4","de" -"2","3","Selten","3","de" -"1","2","2","2","en" -"1","4","4","4","de" - -# -# QUESTION_ATTRIBUTES TABLE -# -"qaid","qid","attribute","value" -"53","67","text_input_width","80" -"54","68","hide_tip","1" -"55","69","answer_width","70" -"56","71","hide_tip","1" -"57","72","answer_width","70" -"58","73","answer_width","70" -"59","74","answer_width","70" -"60","75","answer_width","70" -"61","76","answer_width","70" -"62","77","answer_width","70" -"63","78","answer_width","70" -"64","79","answer_width","70" -"65","80","answer_width","70" - -# -# ASSESSMENTS TABLE -# - -# -# SURVEYS_LANGUAGESETTINGS TABLE -# -"surveyls_survey_id","surveyls_language","surveyls_title","surveyls_description","surveyls_welcometext","surveyls_url","surveyls_urldescription","surveyls_endtext","surveyls_email_invite_subj","surveyls_email_invite","surveyls_email_remind_subj","surveyls_email_remind","surveyls_email_register_subj","surveyls_email_register","surveyls_email_confirm_subj","surveyls_email_confirm","surveyls_dateformat" -"43521","de","Umfragevorlage 06.2009","Umfragevorlage Universität zu Köln 06/2009
    ","Herzlich Willkommen!
    ","http://his.de","HIS GmbH","Vieln Dank für Ihre Teilnahme an der Umfrage.
    ","Einladung zur Teilnahme an einer Umfrage","Hallo {FIRSTNAME},

    Hiermit möchten wir Sie zu einer Umfrage einladen.

    Der Titel der Umfrage ist
    '{SURVEYNAME}'

    '{SURVEYDESCRIPTION}'

    Um an dieser Umfrage teilzunehmen, klicken Sie bitte auf den unten stehenden Link.

    Mit freundlichen Grüßen,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Klicken Sie hier um die Umfrage zu starten:
    {SURVEYURL}","Erinnerung an Teilnahme an einer Umfrage","Hallo {FIRSTNAME},

    Vor kurzem haben wir Sie zu einer Umfrage eingeladen.

    Zu unserem Bedauern haben wir bemerkt, dass Sie die Umfrage noch nicht ausgefüllt haben. Wir möchten Ihnen mitteilen, dass die Umfrage noch aktiv ist und würden uns freuen, wenn Sie teilnehmen könnten.

    Der Titel der Umfrage ist
    '{SURVEYNAME}'

    '{SURVEYDESCRIPTION}'

    Um an dieser Umfrage teilzunehmen, klicken Sie bitte auf den unten stehenden Link.

    Mit freundlichen Grüßen,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Klicken Sie hier um die Umfrage zu starten:
    {SURVEYURL}","Registrierungsbestätigung für Teilnahmeumfrage","Hallo {FIRSTNAME},

    Sie (oder jemand, der Ihre Email benutzt hat) haben sich für eine Umfrage mit dem Titel {SURVEYNAME} angemeldet.

    Um an dieser Umfrage teilzunehmen, klicken Sie bitte auf den folgenden Link.

    {SURVEYURL}

    Wenn Sie irgendwelche Fragen zu dieser Umfrage haben oder wenn Sie sich _nicht_ für diese Umfrage angemeldet haben und sie glauben, dass Ihnen diese Email irrtümlicherweise zugeschickt worden ist, kontaktieren Sie bitte {ADMINNAME} unter {ADMINEMAIL}.","Abschlussbestätigung einer Umfrage","Hallo {FIRSTNAME},

    Vielen Dank für die Teilnahme an der Umfrage mit dem Titel {SURVEYNAME}. Ihre Antworten wurden bei uns gespeichert.

    Wenn Sie irgendwelche Fragen zu dieser Email haben, kontaktieren Sie bitte {ADMINNAME} unter {ADMINEMAIL}.

    Mit freundlichen Grüßen,

    {ADMINNAME}","1" - -# -# QUOTA TABLE -# - -# -# QUOTA_MEMBERS TABLE -# - diff --git a/include/limesurvey/admin/resetsurveylogic.php b/include/limesurvey/admin/resetsurveylogic.php deleted file mode 100644 index 7f5f72b5..00000000 --- a/include/limesurvey/admin/resetsurveylogic.php +++ /dev/null @@ -1,74 +0,0 @@ -\n"; -$resetsurveylogicoutput .= "\n"; -$resetsurveylogicoutput .= "\t\n"; - -if (!isset($surveyid) || !$surveyid) -{ - $resetsurveylogicoutput .= "\t
    ".$clang->gT("Reset Survey Logic")."
    \n"; - $resetsurveylogicoutput .= "
    ".$clang->gT("Error")."
    \n"; - $resetsurveylogicoutput .= $clang->gT("You have not selected a survey to delete")."

    \n"; - $resetsurveylogicoutput .= "\n"; - $resetsurveylogicoutput .= "
    \n"; - $resetsurveylogicoutput .= "\n"; - return; -} - -if (!isset($ok) || !$ok) -{ - $resetsurveylogicoutput .= "\t\n"; - $resetsurveylogicoutput .= "\t\t
    \n"; - $resetsurveylogicoutput .= "\t\t\t".$clang->gT("Warning")."
    \n"; - $resetsurveylogicoutput .= "\t\t\t".$clang->gT("You are about to delete all conditions on this survey's questions")." ($surveyid)

    \n"; - $resetsurveylogicoutput .= "\t\t\t".$clang->gT("We recommend that before you proceed, you export the entire survey from the main administration screen.")."\n"; - - $resetsurveylogicoutput .= "\t\t\n"; - $resetsurveylogicoutput .= "\t\n"; - $resetsurveylogicoutput .= "\t\n"; - $resetsurveylogicoutput .= "\t\t
    \n"; - $resetsurveylogicoutput .= "\t\t\t
    \n"; - // $resetsurveylogicoutput .= "\t\t\t\n"; - $resetsurveylogicoutput .= "\t\t\t\n"; - $resetsurveylogicoutput .= "\t\t\n"; - $resetsurveylogicoutput .= "\t\n"; - $resetsurveylogicoutput .= "\n"; -} - -else //delete conditions in the survey -{ - $dict = NewDataDictionary($connect); - LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); - - $resetlogicquery = "DELETE FROM {$dbprefix}conditions WHERE qid in (select qid from {$dbprefix}questions where sid=$surveyid)"; - $resetlogicresult = $connect->Execute($resetlogicquery) or safe_die ("Couldn't delete conditions
    $resetlogicquery
    ".$connect->ErrorMsg()); - - $resetsurveylogicoutput .= "\t\n"; - $resetsurveylogicoutput .= "\t\t
    \n"; - $resetsurveylogicoutput .= "\t\t\t".$clang->gT("All conditions in this survey have been deleted.")."

    \n"; - $resetsurveylogicoutput .= "\t\t\t\n"; - $resetsurveylogicoutput .= "\t\t
    \n"; - $resetsurveylogicoutput .= "\t\n"; - $surveyid=false; - -} -$resetsurveylogicoutput .= "
     \n"; - -?> diff --git a/include/limesurvey/admin/results.php b/include/limesurvey/admin/results.php deleted file mode 100644 index 34d830e5..00000000 --- a/include/limesurvey/admin/results.php +++ /dev/null @@ -1,530 +0,0 @@ -"FL", "1X2X35"=>"Cork") -* $responsestyle should be "full" - the alternative (which would just be the codes) is not yet coded -* -* This function will return a multi-level array. The first level is a numbered array with an -* entry for every individual response. Within that array will be a further array, with an entry -* for every possible answer to that question. Then, within each of those arrays will be -* the question title, and the answer to that question for that record. -* -* As an example, a single answer type question (like a List, or Yes/No) -* will look like this: -* Array -* ( -* [0]=> Array -* ( -* [4X6X22] => Array -* ( -* [0] => What is your Employment Type? -* [1] => Ongoing -* ) -* ) -* [1]=> Array -* ..... and so forth for each record in the responses table -* -* A multiple answer type question, such as "Multiple Choice" will look like this: -* Array -* ( -* [0]=> Array -* ( -* [2X2X7C] => Array -* ( -* [0] => Choose your favourite foods [Cheese] -* [1] => Yes -* ) -* [2X2X7I] => Array -* ( -* [0] => Choose your favourite foods [Ice Cream] -* [1] => -* ) -* ) -* -* - makeSummaryFromRawData($results) -* Feed this function the "raw results" string generated by the "giveMeRawDataFromFieldNames" -* function and you'll be returned an array containing a summary/count of results -* for every possible answer within that question. -* -* An example result for a single option question (ie: List or Yes/No) is: -* -* Array -* ( -* [4X6X22] => Array -* ( -* [question] => What is your Employment Type? -* [summary] => Array -* ( -* [Ongoing] => 429 -* [Fixed Term] => 61 -* [None] => 4 -* [Agency / Temp] => 4 -* [Casual] => 1 -* ) -* -* ) -* ) -* -* An example result for a multiple answer type question is: -* Array -* ( -* [2X2X7G] => Array -* ( -* [question] => Which of the following issues do you want addressed in negotiations for the next Enterprise Bargaining Agreement? [Accrual of Time In Lieu / Flex Time] -* [summary] => Array -* ( -* [Yes] => 10 -* [None] => 3 -* ) -* -* ) -* -* [2X2X7K] => Array -* ( -* [question] => Which of the following issues do you want addressed in negotiations for the next Enterprise Bargaining Agreement? [Allowances / Reimbursement of Expenses] -* [summary] => Array -* ( -* [Yes] => 5 -* [None] => 8 -* ) -* -* ) -* ) -* -*/ - -//THIS BIT IS JUST FOR DEBUGGING -if (!empty($_GET['debug'])) { - // $table = "survey_4"; - // //$questionfields[]="4X6X22"; - // //$questionfields[]="4X6X23"; - // $limitby=array("4X6X22"=>"A", - // "4X6X23"=>"B"); - // $sql = buildSqlFromFieldnamesArray($limitby); - // $questionfields=buildQuestionFields("4", "7", "29"); - // if (!empty($questionfields)) { - // $results = returnQuestionResults($table, $questionfields, $sql); - // echo "TOTAL RESULTS: ".count($results); - // echo "
    ";
    -    //		print_r($results);
    -    //		echo "
    "; - // } - $surveyid=$_GET['sid']; - $gid=$_GET['gid']; - $qid=$_GET['qid']; - //$results = giveMeRawDataFromFieldNames("4", "6", "22", array(), "full"); - //$results = giveMeRawDataFromFieldNames("2", "2", "7", array(), "full"); - //$results = giveMeRawDataFromFieldNames("8", "18", "66", array(), "full"); - //$results = giveMeRawDataFromFieldNames("29", "89", "559", array(), "full"); - $results = giveMeRawDataFromFieldNames($surveyid, $gid, $qid, array(), "full"); - - $summary = makeSummaryFromRawData($results); - foreach ($results as $result) { foreach ($result as $answer) {echo $answer[1];} } - echo "
    ";
    -    print_r($results);
    -    echo "
    "; - // - // foreach ($summary as $sum) { - // echo "\n"; - // echo "\n"; - // foreach ($sum['summary'] as $key=>$val) { - // echo "\n"; - // } - // echo "
    ".$sum['question']."
    $key$val

    "; - // } -} - -function makeSummaryFromRawData($results, $surveyid=null, $gid=null, $qid=null) { - - //echo "
    ";print_r($results);echo "
    "; - if (empty($results)) { - return array(); - } - if (!empty($qid)) { - $thisquestion=getQuestionInfo($qid); - } - $rowcodes=array_keys($results[0]); - // echo "
    ";print_r($rowcodes);echo "
    "; - - $summary = array(); - foreach ($results as $result) { - foreach($rowcodes as $row) { - //echo "
    ";print_r($result);echo "
    "; - - if (is_array($result[$row])) { - //echo "
    ";print_r($result);echo "
    "; - $summary[$row]['question']=$result[$row][0]; - switch($thisquestion['type']) { - case "T": - case "S": - case "H": - if ($result[$row][1] != "") { - if (!isset($summary[$row]['summary'][$clang->gT("Answered")])) { - $summary[$row]['summary'][$clang->gT("Answered")]=1; - } else { - $summary[$row]['summary'][$clang->gT("Answered")]++; - } - } - break; - default: - if (!isset($summary[$row]['summary'][$result[$row][1]])) { - $summary[$row]['summary'][$result[$row][1]]=1; - } else { - $summary[$row]['summary'][$result[$row][1]]++; - } - break; - } - } - if ($thisquestion['type'] == "N") { - ksort($summary[$row]['summary'], SORT_NUMERIC); - } - } - } - //echo "
    ";print_r($summary);echo "
    "; - //fill in the blanks from answer table and sort - if (isset($surveyid) && isset($qid) && $summary) { - //$thissurvey=getSurveyInfo($surveyid); - $rowcodes=array_keys($summary); - switch($thisquestion['type']){ - case "F": - case "H": - $answers=getLabelSet($thisquestion['lid']); - break; - case "!": - case "L": - case "O": - $answers=getAnswersSingle($surveyid, $gid, $qid); - $answers[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - break; - case "1": - $answers=getLabelSet($thisquestion['lid']); - $answers[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - break; - case "C": - $answers[]=array("code"=>"Y", "answer"=>$clang->gT("Yes")); - $answers[]=array("code"=>"U", "answer"=>$clang->gT("Uncertain")); - $answers[]=array("code"=>"N", "answer"=>$clang->gT("No")); - break; - case "E": - $answers[]=array("code"=>"I", "answer"=>$clang->gT("Increase")); - $answers[]=array("code"=>"S", "answer"=>$clang->gT("Same")); - $answers[]=array("code"=>"D", "answer"=>$clang->gT("Decrease")); - $answers[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - break; - case "M": - case "P": - $answers[]=array("code"=>"Y", "answer"=>$clang->gT("Yes")); - $answers[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - break; - case "Y": - $answers[]=array("code"=>"Y", "answer"=>$clang->gT("Yes")); - $answers[]=array("code"=>"N", "answer"=>$clang->gT("No")); - $answers[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - break; - case "G": - $answers[]=array("code"=>"M", "answer"=>$clang->gT("Male")); - $answers[]=array("code"=>"F", "answer"=>$clang->gT("Female")); - $answers[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - break; - case "T": - case "S": - case "U": - $answers[]=array("code"=>$clang->gT("Answered"), "answer"=>$clang->gT("Answered")); - $answers[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - break; - } // switch - - if (isset($answers)) { - foreach($rowcodes as $row) { - $newarray[$row]['question']=$summary[$row]['question']; - foreach($answers as $answer) { - //echo "
    ";print_r($answer);echo "
    "; - if (isset($summary[$row]['summary'][$answer['answer']])) { - $newarray[$row]['summary'][$answer['answer']]=$summary[$row]['summary'][$answer['answer']]; - } else { - $newarray[$row]['summary'][$answer['answer']]=0; - } - } - } - $summary=$newarray; - } - } - - //Fix the output for multiple - if ($thisquestion['type'] == "M" || $thisquestion['type'] == "P" || $thisquestion['type'] == "^" || $thisquestion['type'] == "1") { - if (isset($newarray)) {unset($newarray);} - $newarray[$thisquestion['sid']."X".$thisquestion['gid']."X".$thisquestion['qid']]['question']=$thisquestion['question']; - foreach ($summary as $sum) { - preg_match("/\[(.*)\]/", $sum['question'], $regs); - $newarray[$thisquestion['sid']."X".$thisquestion['gid']."X".$thisquestion['qid']]['summary'][$regs[1]]=$sum['summary'][$clang->gT("Yes")]; - } - $summary=$newarray; - } - // echo "
    ";print_r($summary);echo "
    "; - return $summary; -} - -function giveMeRawDataFromFieldNames($surveyid, $gid, $qid, $fieldlimiters=array(), $output="full") { - //Builds output data for question $surveyid$gid$qid, limiting with $fieldlimiters array - $questionfields = buildQuestionFields($surveyid, $qid); - $sql = buildSqlFromFieldnamesArray($fieldlimiters); - $tablename = "survey_".$surveyid; - $fieldmap=createFieldMap($surveyid, "full"); - //echo "
    "; print_r($answers); echo "
    "; - list($questioninfo, $results) = returnQuestionResults($surveyid, $questionfields, $sql); - //echo "
    "; print_r($questioninfo); echo "
    "; - if (count($results) < 1) { - return array(); - } - foreach ($questioninfo as $qi) { - $questiontype=$qi['type']; - } - // echo "[$questiontype]
    "; - if ($output == "full") { - GetBaseLanguageFromSurveyID($surveyid); - //echo "
    "; print_r($answers); echo "
    "; - switch($questiontype) { - case "L": - case "!": - case "O": - case "D": - case "E": - case "M": - case "P": - case "C": - case "B": - case "A": - case "F": - case "H": - case "1": - $answers = getAnswersSingle($surveyid, $gid, $qid); - break; - case "Y": - $answers[]=array("code"=>"Y", "answer"=>$clang->gT("Yes")); - $answers[]=array("code"=>"N", "answer"=>$clang->gT("No")); - break; - case "G": - $answers[]=array("code"=>"M", "answer"=>$clang->gT("Male")); - $answers[]=array("code"=>"F", "answer"=>$clang->gT("Female")); - break; - } // switch - $answers[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - $answers[]=array("code"=>"-oth-", "answer"=>$clang->gT("Other")); - - switch($questiontype) { - case "A": - for ($i=1; $i <= 5; $i++) { - $values[]=array("code"=>$i, "answer"=>$i); - } - break; - case "B": - for ($i=1; $i<=10; $i++) { - $values[]=array("code"=>$i, "answer"=>$i); - } - break; - case "E": - $values[]=array("code"=>"I", "answer"=>$clang->gT("Increase")); - $values[]=array("code"=>"S", "answer"=>$clang->gT("Same")); - $values[]=array("code"=>"D", "answer"=>$clang->gT("Decrease")); - break; - case "C": - case "M": - case "P": - $values[]=array("code"=>"Y", "answer"=>$clang->gT("Yes")); - $values[]=array("code"=>"U", "answer"=>$clang->gT("Uncertain")); - $values[]=array("code"=>"N", "answer"=>$clang->gT("No")); - break; - case "F": - case "H": - $thisquestion=getQuestionInfo($qid); - $values = getLabelSet($thisquestion['lid']); - break; - } - $values[]=array("code"=>"", "answer"=>$clang->gT("No answer")); - - switch($questiontype) { - case "L": - case "!": - case "O": - case "Y": - case "G": - case "S": - case "T": - case "H": - case "N": - case "5": - case "D": - //The first key needs to be expanded - $firstkey=array_keys($results[0]); - $firstkey=$firstkey[0]; - $questions=arraySearchByKey($firstkey, $fieldmap, "fieldname", 1); - //echo $firstkey; - $i=0; - foreach($results as $result) { - $results[$i][$firstkey]=array($questions['question'], arraySubstitute($result[$firstkey], $answers)); - $i++; - } - break; - case "A": - case "B": - case "C": - case "E": - case "F": - case "H": - case "M": - case "P": - case "Q": - case "1": - $i=0; - foreach($results as $result) { - foreach($result as $key=>$val) { - $questions=arraySearchByKey($key, $fieldmap, "fieldname", 1); - if (substr($key, -7, 7) != "comment") { - $code=substr($key, strlen($surveyid."X".$gid."X".$qid), strlen($key)-strlen($surveyid."X".$gid."X".$qid)); - //echo $code; - $results[$i][$key]=array($questions['question'], arraySubstitute($val, $values)); - } - } - $i++; - } - break; - } // switch - } - return $results; -} - -function buildSqlFromFieldnamesArray($fieldnamesarray) { - //Expects an array like this: "1x2x3"=>"FL" - //and builds SQL "where" statement out of it (without the "WHERE" at the front) - if (count($fieldnamesarray)) { - foreach ($fieldnamesarray as $key=>$val) { - if ($val == "{NULL}") { - $sql[] = "$key IS NULL"; - } else { - $sql[] = "$key = '$val'"; - } - } - if (count($sql) > 1) { - return implode(" AND\n", $sql); - } else { - return $sql[0]; - } - } -} - -function buildQuestionFields($surveyid, $qid) { - //Takes a specific question, and returns an array containing - //all the possible fieldnames for responses to that question - $fieldmap=createFieldMap($surveyid); - foreach ($fieldmap as $fields) { - if ($fields['sid'] == $surveyid && $fields['qid'] == $qid && $fields['aid'] != "comment") { - $questionfields[]=$fields['fieldname']; - } - } - if (!empty($questionfields)) { - return $questionfields; - } else { - return array("id"); - } -} - -function returnQuestionResults($surveyid, $questionfields, $sql=null) { - global $connect; - //Returns uninterpreted raw results from survey table for question(s) - //$table = survcey table name (ie: "survey_1") - //$questionfields should contain an array of the question fields that are being returned - //$sql is any additional "filtering" sql code - $details=array(); - $output=array(); - foreach($questionfields as $questionfield) { - $detailsarray=arraySearchByKey($questionfield, createFieldMap($surveyid), "fieldname"); - foreach ($detailsarray as $dt) { - $details[]=$dt; - } - } - $table="survey_".$surveyid; - - if (count($questionfields) > 1) { - $selects = "`".implode("`, `", $questionfields)."`"; - } else { - $selects = "`".$questionfields[0]."`"; - } - $query = "SELECT $selects - FROM $table"; - if (!empty($sql)) { - $query .= "\nWHERE $sql"; - } - $result = db_execute_assoc($query) or safe_diee("error getting results in returnQuestionResults
    $query
    ".$connect->ErrorMsg()); - while($row=$result->FetchRow()) { - $output[]=$row; - } // while - return array($details, $output); -} - -function getAnswersSingle($surveyid, $gid, $qid) { - global $dbprefix, $connect; - $query = "SELECT * - FROM ".db_table_name("answers")." - WHERE qid=$qid - ORDER BY sortorder, answer"; - $result = db_execute_assoc($query); - while($row = $result->FetchRow()) { - $answer[]=array("code"=>$row['code'], - "answer"=>$row['answer']); - } // while - return $answer; -} - -function getLabelSet($lid) { - global $dbprefix, $connect; - $query = "SELECT * - FROM ".db_table_name("labels")." - WHERE lid=$lid - ORDER BY sortorder"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - while($row = $result->FetchRow()) { - if ($row['title'] <> '') - { - $answer[]=array("code"=>$row['code'], - "answer"=>$row['title']); - } - } // while - return $answer; -} - -function arraySubstitute($value, $substitutes) { - foreach ($substitutes as $sub) { - if ($value == $sub['code']) { - return $sub['answer']; - } - } - return $value; -} -?> diff --git a/include/limesurvey/admin/saved.php b/include/limesurvey/admin/saved.php deleted file mode 100644 index c60ca235..00000000 --- a/include/limesurvey/admin/saved.php +++ /dev/null @@ -1,139 +0,0 @@ -Execute($query)) - { - //If we were succesful deleting the saved_control entry, - //then delete the rest - $query = "DELETE FROM {$surveytable} WHERE id={$srid}"; - $result = $connect->Execute($query) or die("Couldn't delete"); - - } - else - { - $savedsurveyoutput .= "Couldn't delete
    $query
    ".$connect->ErrorMsg(); - } -} -$js_admin_includes[]='../scripts/jquery/jquery.tablesorter.min.js'; -$js_admin_includes[]='scripts/saved.js'; - -$savedsurveyoutput .= "\n"; -$savedsurveyoutput .= "
    ".$clang->gT("Saved Responses:") . " ". getSavedCount($surveyid)."

    "; - -showSavedList($surveyid); - - - -function showSavedList($surveyid) -{ - global $dbprefix, $connect, $clang, $savedsurveyoutput, $scriptname, $imageurl, $surrows; - $query = "SELECT scid, srid, identifier, ip, saved_date, email, access_code\n" - ."FROM {$dbprefix}saved_control\n" - ."WHERE sid=$surveyid\n" - ."ORDER BY saved_date desc"; - $result = db_execute_assoc($query) or safe_die ("Couldn't summarise saved entries
    $query
    ".$connect->ErrorMsg()); - if ($result->RecordCount() > 0) - { - $savedsurveyoutput .= "\n"; - $savedsurveyoutput .= "" - ."\n"; - while($row=$result->FetchRow()) - { - $savedsurveyoutput .= " - - - - - - - - \n"; - } // while - $savedsurveyoutput .= "
    SCID" - .$clang->gT("Actions")."" - .$clang->gT("Identifier")."" - .$clang->gT("IP address")."" - .$clang->gT("Date Saved")."" - .$clang->gT("Email address")."
    ".$row['scid'].""; - - if (bHasSurveyPermission($surveyid,'responses','update')) - { - $savedsurveyoutput .=""; - } - if (bHasSurveyPermission($surveyid,'responses','delete')) - { - $savedsurveyoutput .="gT("Are you sure you want to delete this entry?","js")."')) {".get2post("{$scriptname}?action=saved&sid=$surveyid&subaction=delete&scid={$row['scid']}&srid={$row['srid']}")."}\" />"; - } - else - { - // $savedsurveyoutput .= "[".$clang->gT("View")."]"; - - } - - $savedsurveyoutput .="".$row['identifier']."".$row['ip']."".$row['saved_date']."".$row['email']."

     \n"; - } -} - -// [".$clang->gT("Remind")."] -// c_schmitz: Since its without function at the moment i removed it from the above lines - -function savedmenubar() -{ - global $surveyid, $scriptname, $imageurl, $clang; - //BROWSE MENU BAR - if (!isset($surveyoptions)) {$surveyoptions="";} - $surveyoptions .= "" . - "".$clang->gT("Return to survey administration")."\n"; - /* . "\t\t\t\n" - . "\t\t\t\n" - . "\t\t\t" . - "".$clang->gT("Show summary information")."\n" - . "\t\t\t" - . "".$clang->gT("Display Responses")."\n" - //. "\t\t\t\n" - . "\t\t\t\n";*/ - return $surveyoptions; -} -?> diff --git a/include/limesurvey/admin/scripts/admin_core.js b/include/limesurvey/admin/scripts/admin_core.js deleted file mode 100644 index f8217433..00000000 --- a/include/limesurvey/admin/scripts/admin_core.js +++ /dev/null @@ -1,716 +0,0 @@ -//$Id: admin_core.js 12275 2012-02-01 13:18:38Z ssachdeva $ - -$(document).ready(function(){ - setupAllTabs(); - if(typeof(userdateformat) !== 'undefined') - { - $(".popupdate").datepicker({ dateFormat: userdateformat, - showOn: 'button', - changeYear: true, - changeMonth: true, - duration: 'fast' - }, $.datepicker.regional[userlanguage]); - $(".popupdatetime").datepicker({ dateFormat: userdateformat+' 00:00', - showOn: 'button', - changeYear: true, - changeMonth: true, - duration: 'fast' - }, $.datepicker.regional[userlanguage]); - } - - $('button,input[type=submit],input[type=button],input[type=reset]').addClass("limebutton ui-state-default ui-corner-all"); - $('button,input[type=submit],input[type=button],input[type=reset]').hover( - function(){ - $(this).addClass("ui-state-hover"); - }, - function(){ - $(this).removeClass("ui-state-hover"); - } - ) - - - // Loads the tooltips for the toolbars except the surveybar - $('img[alt],input[src]').not('.surveybar img').each(function() { - if($(this).attr('alt') != '') - { - $(this).qtip({ - style: { name: 'cream', - tip:true, - color:'#1D2D45', - border: { - width: 1, - radius: 5, - color: '#EADF95'} - }, - position: { adjust: { - screen: true, scroll:true }, - corner: { - target: 'bottomRight'} - }, - show: {effect: { length:50}}, - hide: { when: 'mouseout' } - }); - } - }); - - - $('label[title]').each(function() { - if($(this).attr('title') != '') - { - $(this).qtip({ - style: { name: 'cream', - tip:true, - color:'#1D2D45', - border: { - width: 1, - radius: 5, - color: '#EADF95'} - }, - position: { adjust: { - screen: true, scroll:true }, - corner: { - target: 'bottomRight'} - }, - show: {effect: { length:50}} - }); - } - }); - - $('.dosurvey').qtip({ - content:{ - text:$('#dosurveylangpopup') - }, - style: { name: 'cream', - tip:true, - color:'#1D2D45', - border: { - width: 1, - radius: 5, - color: '#EADF95'} - }, - position: { adjust: { - screen: true, scroll:true }, - corner: { - target: 'bottomMiddle', - tooltip: 'topMiddle'} - }, - show: {effect: { length:50}, - when: { - event:'click' - }}, - hide: {fixed:true, - when: { - event:'unfocus' - }} - }); - - $('#previewquestion').qtip({ - content:{ - text:$('#previewquestionpopup') - }, - style: { name: 'cream', - tip:true, - color:'#111111', - border: { - width: 1, - radius: 5, - color: '#EADF95'} - }, - position: { adjust: { - screen: true, scroll:true }, - corner: { - target: 'bottomMiddle', - tooltip: 'topMiddle'} - }, - show: {effect: { length:50}, - when: { - event:'click' - }}, - hide: {fixed:true, - when: { - event:'unfocus' - }} - }); - - $('.tipme').each(function() { - if($(this).attr('alt') != '') - { - $(this).qtip({ - style: { name: 'cream', - tip:true, - color:'#111111', - border: { - width: 1, - radius: 5, - color: '#EADF95'} - }, - position: { adjust: { - screen: true, scroll:true }, - corner: { - target: 'topRight', - tooltip: 'bottomLeft' - } - }, - show: {effect: { length:100}} - - }); - } - }); - - - if ($('#showadvancedattributes').length>0) updatequestionattributes(); - - $('#showadvancedattributes').click(function(){ - $('#showadvancedattributes').hide(); - $('#hideadvancedattributes').show(); - $('#advancedquestionsettingswrapper').animate({ - "height": "toggle", "opacity": "toggle" - }); - - }) - $('#hideadvancedattributes').click(function(){ - $('#showadvancedattributes').show(); - $('#hideadvancedattributes').hide(); - $('#advancedquestionsettingswrapper').animate({ - "height": "toggle", "opacity": "toggle" - }); - - }) - $('#question_type').change(updatequestionattributes); - - $('#MinimizeGroupWindow').click(function(){ - $('#groupdetails').hide(); - }); - $('#MaximizeGroupWindow').click(function(){ - $('#groupdetails').show(); - }); - $('#tabs').tabs(); - $("#flashmessage").notify().notify('create','themeroller',{},{custom:true, - speed: 500, - expires: 5000 -}); - - var old_owner = ''; - - $(".ownername_edit").live('click',function(){ - var oldThis = this; - var ownername_edit_id = $(this).attr('id'); - var survey_id = ownername_edit_id.slice(15); - var translate_to = $(this).attr('translate_to'); - var initial_text = $(this).html(); - $.getJSON('admin.php', { - action: 'ajaxgetusers' - },function(oData) - { - old_owner = $($(oldThis).parent()).html(); - - old_owner = (old_owner.split("("))[0]; - $($(oldThis).parent()).html('' - + ''); - $(oData).each(function(key,value){ - $('#ownername_select_'+survey_id). - append($(""). - attr("value",value[0]). - text(value[1])); - }); - $("#ownername_select_"+survey_id+ " option[id=opt_"+old_owner+"]").attr("selected","selected"); - }); - }); - - $(".ownername_button").live('click',function(){ - var oldThis = this; - var initial_text = $(this).attr('initial_text'); - var ownername_select_id = $(this).attr('id'); - var survey_id = ownername_select_id.slice(17); - var newowner = $("#ownername_select_"+survey_id).val(); - var translate_to = $(this).attr('value'); - - $.getJSON('admin.php',{ - action: 'ajaxowneredit', - newowner: newowner, - survey_id : survey_id - }, function (data){ - - var objToUpdate = $($(oldThis).parent()); - - if (data.record_count>0) - $(objToUpdate).html(data.newowner); - else - $(objToUpdate).html(old_owner); - - $(objToUpdate).html($(objToUpdate).html() + '('+initial_text+')' ); - }); - }); - - if ($("#question_type:not(.none)").length > 0 && $("#question_type").attr('type')!='hidden'){ - $("#question_type").msDropDown({onInit:qTypeDropdownInit}); - - $("#question_type").change(function(event){ - var selected_value = qDescToCode[''+$("#question_type_child .selected").text()]; - OtherSelection(selected_value); - }); - } - - - -}); - -function qTypeDropdownInit() -{ - $("#question_type_child a").each(function(index,element){ - - $(element).qtip({ - style: { - margin : 15, - width: 450, - height: 'auto', - border:{ - width: 4, - radius: 2 - } - }, - content: getToolTip($(element).text()), - position: { - corner:{ - target: 'leftMiddle', - tooltip:'rightMiddle' - } - }, - show: 'mouseover', - hide: 'mouseout' - }); - - }); -} - - - - -var aToolTipData = { - -}; - -var qDescToCode; -var qCodeToInfo; - -function getToolTip(type){ - var code = qDescToCode[''+type]; - var multiple = 0; - if (code=='S') multiple = 2; - - if (code == ":") code = "COLON"; - else if(code == "|") code = "PIPE"; - else if(code == "*") code = "EQUATION"; - - if (multiple > 0){ - returnval = ''; - for(i=1;i<=multiple;i++){ - returnval = returnval + "

    "; - } - return returnval; - } - return ""; -} - -//We have form validation and other stuff.. - -function updatequestionattributes() -{ - $('.loader').show(); - $('#advancedquestionsettings').html(''); - var selected_value = qDescToCode[''+$("#question_type_child .selected").text()]; - if (selected_value==undefined) selected_value = $("#question_type").val(); - $('#advancedquestionsettings').load('admin.php?action=ajaxquestionattributes',{qid:$('#qid').val(), - question_type:selected_value, - sid:$('#sid').val() - }, function(){ - // Loads the tooltips for the toolbars - - // Loads the tooltips for the toolbars - $('.loader').hide(); - $('label[title]').qtip({ - style: { name: 'cream', - tip: true, - color:'#111111', - border: { - width: 1, - radius: 5, - color: '#EADF95'} - }, - position: { adjust: { - screen: true, scroll:true }, - corner: { - target: 'bottomRight'} - }, - show: {effect: { length:50}} - });} - ); -} - -function validatefilename (form, strmessage ) -{ - if (form.the_file.value == "") { - alert( strmessage ); - form.the_file.focus(); - return false ; - } - return true ; -} - - -// If the length of the element's string is 0 then display helper message -function isEmpty(elem, helperMsg) -{ - if($.trim(elem.value).length == 0){ - alert(helperMsg); - elem.focus(); // set the focus to this input - return false; - } - return true; -} - -function codeCheck(prefix, elementcount, helperMsg, reservedKeywordMsg) -{ - var i, j; - var X = new Array(); - - for (i=0; i<=elementcount; i++) { - j = document.getElementById(prefix+i); - if (j != undefined) - { - j.value=trim(j.value); - if (j.value == "other") - { - alert(reservedKeywordMsg); - return false; - } - X.push(j.value); - } - } - if (arrHasDupes(X)) - { - alert(helperMsg); - return false; - } - return true; -} - - -function arrHasDupes( A ) { // finds any duplicate array elements using the fewest possible comparison - var i, j, n; - n=A.length; - // to ensure the fewest possible comparisons - for (i=0; i-1) - { - var strText = document.getElementById("available_languages").options[document.getElementById("available_languages").selectedIndex].text; - var strId = document.getElementById("available_languages").options[document.getElementById("available_languages").selectedIndex].value; - AddItem(document.getElementById("additional_languages"), strText, strId); - RemoveItem(document.getElementById("available_languages"), document.getElementById("available_languages").selectedIndex); - sortSelect(document.getElementById("additional_languages")); - UpdateLanguageIDs(); - } -} - -function DoRemove(minItems,strmsg) -{ - var strText = document.getElementById("additional_languages").options[document.getElementById("additional_languages").selectedIndex].text; - var strId = document.getElementById("additional_languages").options[document.getElementById("additional_languages").selectedIndex].value; - if (document.getElementById("additional_languages").options.length>minItems) - { - AddItem(document.getElementById("available_languages"), strText, strId); - RemoveItem(document.getElementById("additional_languages"), document.getElementById("additional_languages").selectedIndex); - sortSelect(document.getElementById("available_languages")); - UpdateLanguageIDs(); - } - else - if (strmsg!=''){alert(strmsg);} -} - - - -function AddItem(objListBox, strText, strId) -{ - var newOpt; - newOpt = document.createElement("OPTION"); - newOpt = new Option(strText,strId); - newOpt.id = strId; - objListBox.options[objListBox.length]=newOpt; -} - -function RemoveItem(objListBox, strId) -{ - if (strId > -1) - objListBox.options[strId]=null; -} - -function GetItemIndex(objListBox, strId) -{ - for (var i = 0; i < objListBox.children.length; i++) - { - var strCurrentValueId = objListBox.children[i].id; - if (strId == strCurrentValueId) - { - return i; - } - } - return -1; -} - - -function UpdateLanguageIDs(mylangs,confirmtxt) -{ - document.getElementById("languageids").value = ''; - - var lbBox = document.getElementById("additional_languages"); - for (var i = 0; i < lbBox.options.length; i++) - { - document.getElementById("languageids").value = document.getElementById("languageids").value + lbBox.options[i].value+ ' '; - } - if (mylangs) - { - if (checklangs(mylangs)) - { - return true; - } else - { - return confirm(confirmtxt); - } - } -} - -function compareText (option1, option2) { - return option1.text < option2.text ? -1 : - option1.text > option2.text ? 1 : 0; -} - -function compareValue (option1, option2) { - return option1.value < option2.value ? -1 : - option1.value > option2.value ? 1 : 0; -} - -function compareTextAsFloat (option1, option2) { - var value1 = parseFloat(option1.text); - var value2 = parseFloat(option2.text); - return value1 < value2 ? -1 : - value1 > value2 ? 1 : 0; -} - -function compareValueAsFloat (option1, option2) { - var value1 = parseFloat(option1.value); - var value2 = parseFloat(option2.value); - return value1 < value2 ? -1 : - value1 > value2 ? 1 : 0; -} - -function sortSelect (select, compareFunction) { - if (!compareFunction) - compareFunction = compareText; - var options = new Array (select.options.length); - for (var i = 0; i < options.length; i++) - options[i] = - new Option ( - select.options[i].text, - select.options[i].value, - select.options[i].defaultSelected, - select.options[i].selected - ); - options.sort(compareFunction); - select.options.length = 0; - for (var i = 0; i < options.length; i++) - select.options[i] = options[i]; -} - -function checklangs(mylangs) -{ - selObject=document.getElementById("additional_languages"); - var found; - - for (x = 0; x < mylangs.length; x++) - { - found = 0; - for (i=0;i= 0; x--) { - if (foo[x].replace(/"\s+$/, '"').charAt(foo[x].length - 1) == '"') { - if ((tl = foo[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') { - foo[x] = foo[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"'); - } else if (x) { - foo.splice(x - 1, 2, [foo[x - 1], foo[x]].join(sep)); - } else foo = foo.shift().split(sep).concat(foo); - } else foo[x].replace(/""/g, '"'); - } return foo; -}; - -// This is a helper function to extract the question ID from a DOM ID element -function removechars(strtoconvert){ - return strtoconvert.replace(/[-a-zA-Z_]/g,""); -} - - -function htmlspecialchars(str) { - if (typeof(str) == "string") { - str = str.replace(/&/g, "&"); /* must do & first */ - str = str.replace(/"/g, """); - str = str.replace(/'/g, "'"); - str = str.replace(//g, ">"); - } - return str; -} - -function saveaslabelset() -{ - var lang = langs.split(";"); - - dataToSend = {}; - dataToSend['langs'] = lang; - dataToSend['codelist'] = []; - $(".answertable:first tbody tr").each(function(i,e){ - code = $(".code",e).attr('id'); - code = code.split("_"); - code = code[1]; - - dataToSend['codelist'].push(code); - var assessment_val = '0'; - if ($("#assessment_"+code+"_0").length != 0 ){ - assessment_val = $("#assessment_"+code+"_0").val(); - } - dataToSend[code] = { - code: $("#code_"+code+"_0").val(), - assessmentvalue: assessment_val - }; - $(lang).each(function(index,element){ - dataToSend[code]['text_'+element] = $("#answer_"+element+"_"+code+"_0").val(); - - }); - }); - - var label_name = prompt("Enter new label name", ""); - - var data = { - action: 'ajaxmodlabelsetanswers', - lid:'1', - dataToSend:js2php(dataToSend), - ajax:'1', - label_name:label_name, - languageids: dataToSend['langs'].join(" "), - checksessionbypost: $("[name=checksessionbypost]").val() - } - - $.ajax({ - type: 'POST', - url: 'admin.php', - data: data, - success: function(){ - alert("Label successfully created"); - } - }); -} - - -function js2php(object){ - var json = "{"; - for (property in object){ - var value = object[property]; - if (typeof(value)=="string"){ - //escape double quotes! - value = value.replace(/"/g, '\\"'); //.replace(/'/g, '\\\'') - json += '"'+property+'":"'+value+'",'; - } - else{ - if (!value[0]){ - json += '"'+property + '":'+js2php(value)+','; - } - else{ - json += '"' + property + '":['; - for (prop in value) json += '"'+value[prop]+'",'; - json = json.substr(0,json.length-1)+"],"; - } - } - } - return json.substr(0,json.length-1)+ "}"; -} - - diff --git a/include/limesurvey/admin/scripts/answers.js b/include/limesurvey/admin/scripts/answers.js deleted file mode 100644 index 248cb027..00000000 --- a/include/limesurvey/admin/scripts/answers.js +++ /dev/null @@ -1,641 +0,0 @@ -// $Id: answers.js 12442 2012-02-11 00:07:00Z shnoulle $ -var labelcache=[]; -$(document).ready(function(){ - $('.tab-page:first .answertable tbody').sortable({ containment:'parent', - update:aftermove, - distance:3}); - $('.btnaddanswer').click(addinput); - $('.btndelanswer').click(deleteinput); - $('#editanswersform').submit(code_duplicates_check) - $('#labelsetbrowser').dialog({ autoOpen: false, - modal: true, - width:800, - title: lsbrowsertitle}); - $('#quickadd').dialog({ autoOpen: false, - modal: true, - width:600, - title: quickaddtitle}); - $('.btnlsbrowser').click(lsbrowser); - $('#btncancel').click(function(){ - $('#labelsetbrowser').dialog('close'); - }); - $('#btnlsreplace').click(transferlabels); - $('#btnlsinsert').click(transferlabels); - $('#labelsets').click(lspreview); - $('#languagefilter').click(lsbrowser); - - $('#btnqacancel').click(function(){ - $('#quickadd').dialog('close'); - }); - $('#btnqareplace').click(quickaddlabels); - $('#btnqainsert').click(quickaddlabels); - $('.btnquickadd').click(quickadddialog); - - updaterowproperties(); -}); - - -function deleteinput() -{ - - // 1.) Check if there is at least one answe - - countanswers=$(this).parent().parent().parent().children().length; - if (countanswers>1) - { - // 2.) Remove the table row - var x; - classes=$(this).closest('tr').attr('class').split(' '); - for (x in classes) - { - if (classes[x].substr(0,3)=='row'){ - position=classes[x].substr(4); - } - } - info=$(this).closest('table').attr('id').split("_"); - language=info[1]; - scale_id=info[2]; - languages=langs.split(';'); - - var x; - for (x in languages) - { - tablerow=$('#tabpage_'+languages[x]).find('#answers_'+languages[x]+'_'+scale_id+' .row_'+position); - if (x==0) { - tablerow.fadeTo(400, 0, function(){ - $(this).remove(); - updaterowproperties(); - }); - } - else { - tablerow.remove(); - } - } - } - else - { - $.blockUI({message:"


    "+strCantDeleteLastAnswer+"

    "}); - setTimeout(jQuery.unblockUI,1000); - } - updaterowproperties(); -} - - -function addinput() -{ - var x; - classes=$(this).closest('tr').attr('class').split(' '); - for (x in classes) - { - if (classes[x].substr(0,3)=='row'){ - position=classes[x].substr(4); - } - } - info=$(this).closest('table').attr('id').split("_"); - language=info[1]; - scale_id=info[2]; - newposition=Number(position)+1; - languages=langs.split(';'); - - sNextCode=getNextCode($(this).parent().parent().find('.code').val()); - while ($(this).parent().parent().parent().find('input[value="'+sNextCode+'"]').length>0 && sNextCode!=$(this).parent().parent().find('.code').val()) - { - sNextCode=getNextCode(sNextCode); - } - - for (x in languages) - { - tablerow=$('#tabpage_'+languages[x]).find('#answers_'+languages[x]+'_'+scale_id+' .row_'+position); - if (assessmentvisible) - { - assessment_style=''; - assessment_type='text'; - } - else - { - assessment_style='style="display:none;"'; - assessment_type='hidden'; - } - if (x==0) { - inserthtml='' - } - else - { - inserthtml=' '+htmlspecialchars(sNextCode)+'' - } - tablerow.after(inserthtml); - tablerow.next().find('.btnaddanswer').click(addinput); - tablerow.next().find('.btndelanswer').click(deleteinput); - tablerow.next().find('.answer').focus(function(){ - if ($(this).val()==newansweroption_text) - { - $(this).val(''); - } - }); - tablerow.next().find('.code').blur(updatecodes); - } - $('.row_'+newposition).fadeIn('slow'); - $('.row_'+newposition).show(); //Workaround : IE does not show with fadeIn only - - if(languagecount>1) - { - - } - - $('.tab-page:first .answertable tbody').sortable('refresh'); - updaterowproperties(); -} - -function aftermove(event,ui) -{ - // But first we have change the sortorder in translations, too - var x; - classes=ui.item.attr('class').split(' '); - for (x in classes) - { - if (classes[x].substr(0,3)=='row'){ - oldindex=classes[x].substr(4); - } - } - - var newindex = Number($(ui.item[0]).parent().children().index(ui.item[0]))+1; - - info=$(ui.item[0]).closest('table').attr('id').split("_"); - language=info[1]; - scale_id=info[2]; - - languages=langs.split(';'); - var x; - for (x in languages) - { - if (x>0) { - tablebody=$('#tabpage_'+languages[x]).find('#answers_'+languages[x]+'_'+scale_id+' tbody'); - if (newindex option').size()>0) - { - $('#labelsets').selectOptions(remind); - lspreview(); - } - else - { - $("#labelsetpreview").html("

    "+strNoLabelSet+"

    "); - $('#btnlsreplace').addClass('ui-state-disabled'); - $('#btnlsinsert').addClass('ui-state-disabled'); - $('#btnlsreplace').attr('disabled','disabled'); - $('#btnlsinsert').attr('disabled','disabled'); - } - }); - -} - -// previews the labels in a label set after selecting it in the select box -function lspreview() -{ - if ($('#labelsets > option').size()==0) - { - return; - } - - var lsid=$('#labelsets').val(); - surveyid=$('input[name=sid]').val(); - // check if this label set is already cached - if (!isset(labelcache[lsid])) - { - $.ajax({ - url: 'admin.php?action=ajaxlabelsetdetails', - dataType: 'json', - data: {lid:lsid, sid:surveyid}, - cache: true, - success: function(json){ - $("#labelsetpreview").tabs('destroy'); - $("#labelsetpreview").empty(); - var tabindex=''; - var tabbody=''; - for ( x in json) - { - - language=json[x]; - for (y in language) - { - tabindex=tabindex+'
  • '+language[y][1]+'
  • '; - tabbody=tabbody+"
    "; - lsrows=language[y][0]; - tablerows=''; - var highlight=true; - for (z in lsrows) - { - highlight=!highlight; - tabbody=tabbody+''; - if (assessmentvisible) - { - tabbody=tabbody+''; - } - tabbody=tabbody+''; - } - tabbody=tabbody+''; - if (assessmentvisible) - { - tabbody=tabbody+''; - } - tabbody=tabbody+'
    '+lsrows[z].code+''+lsrows[z].assessment_value+''+lsrows[z].title+'
    '+strcode+''+sAssessmentValue+''+strlabel+'
    '; - } - } - $("#labelsetpreview").append('
      '+tabindex+'
    '+tabbody); - labelcache[lsid]='
      '+tabindex+'
    '+tabbody; - $("#labelsetpreview").tabs(); - }} - ); - } - else - { - $("#labelsetpreview").tabs('destroy'); - $("#labelsetpreview").empty(); - $("#labelsetpreview").append(labelcache[lsid]); - $("#labelsetpreview").tabs(); - } - - -} - -/** -* This is a debug function -* similar to var_dump in PHP -*/ -function dump(arr,level) { - var dumped_text = ""; - if(!level) level = 0; - - //The padding given at the beginning of the line. - var level_padding = ""; - for(var j=0;j \"" + value + "\"\n"; - } - } - } else { //Stings/Chars/Numbers etc. - dumped_text = "===>"+arr+"<===("+typeof(arr)+")"; - } - return dumped_text; -} - -function transferlabels() -{ - surveyid=$('input[name=sid]').val(); - if ($(this).attr('id')=='btnlsreplace') - { - var lsreplace=true; - } - else - { - var lsreplace=false; - } - var lsid=$('#labelsets').val(); - $.ajax({ - url: 'admin.php?action=ajaxlabelsetdetails', - dataType: 'json', - data: {lid:lsid, sid:surveyid}, - cache: true, - success: function(json){ - languages=langs.split(';'); - var x; - var defaultdata_labels = null; - for (x in languages) - { - lang_x_found_in_label=false; - if (assessmentvisible) - { - assessment_style=''; - assessment_type='text'; - } - else - { - assessment_style='style="display:none;"'; - assessment_type='hidden'; - } - - var tablerows=''; - var y; - for (y in json) - { - - language=json[y]; - var lsrows = new Array(); - for (z in language) - { - if (z == languages[0]) - { - defaultdata_labels=language[languages[0]]; - } - - if (z==languages[x]) - { - lang_x_found_in_label = true; - lsrows=language[z][0]; - } - - var k; - for (k in lsrows) - { - if (x==0) { - tablerows=tablerows+'' - } - else - { - tablerows=tablerows+' '+htmlspecialchars(lsrows[k].code)+'' - } - } - } - } - if (lang_x_found_in_label === false) - { - lsrows=defaultdata_labels[0]; - var k=0; - for (k in lsrows) - { - tablerows=tablerows+' '+htmlspecialchars(lsrows[k].code)+'' - } - } - if (lsreplace) { - $('#answers_'+languages[x]+'_'+scale_id+' tbody').empty(); - } - $('#answers_'+languages[x]+'_'+scale_id+' tbody').append(tablerows); - // Unbind any previous events - $('#answers_'+languages[x]+'_'+scale_id+' .btnaddanswer').unbind('click'); - $('#answers_'+languages[x]+'_'+scale_id+' .btndelanswer').unbind('click'); - $('#answers_'+languages[x]+'_'+scale_id+' .answer').unbind('focus'); - // Bind events again - $('#answers_'+languages[x]+'_'+scale_id+' .btnaddanswer').click(addinput); - $('#answers_'+languages[x]+'_'+scale_id+' .btndelanswer').click(deleteinput); - $('#answers_'+languages[x]+'_'+scale_id+' .answer').focus(function(){ - if ($(this).val()==newansweroption_text) - { - $(this).val(''); - } - }); - } - $('#labelsetbrowser').dialog('close'); - $('.tab-page:first .answertable tbody').sortable('refresh'); - updaterowproperties(); - - }} - ); - - -} - - - -function quickaddlabels() -{ - if ($(this).attr('id')=='btnqareplace') - { - var lsreplace=true; - } - else - { - var lsreplace=false; - } - - languages=langs.split(';'); - for (x in languages) - { - - if (assessmentvisible) - { - assessment_style=''; - assessment_type='text'; - } - else - { - assessment_style='style="display:none;"'; - assessment_type='hidden'; - } - - lsrows=$('#quickaddarea').val().split("\n"); - - if (lsrows[0].indexOf("\t")==-1) - { - separatorchar=';' - } - else - { - separatorchar="\t"; - } - tablerows=''; - for (k in lsrows) - { - thisrow=lsrows[k].splitCSV(separatorchar); - if (thisrow.length<=languages.length) - { - thisrow.unshift(parseInt(k)+1); - } - else - { - thisrow[0]=thisrow[0].replace(/[^A-Za-z0-9]/g, ""); - } - - if (typeof thisrow[parseInt(x)+1]=='undefined') - { - thisrow[parseInt(x)+1]=thisrow[1]; - } - if (x==0) { - tablerows=tablerows+'' - } - else - { - tablerows=tablerows+'  ' - - } - } - if (lsreplace) { - $('#answers_'+languages[x]+'_'+scale_id+' tbody').empty(); - } - $('#answers_'+languages[x]+'_'+scale_id+' tbody').append(tablerows); - // Unbind any previous events - $('#answers_'+languages[x]+'_'+scale_id+' .btnaddanswer').unbind('click'); - $('#answers_'+languages[x]+'_'+scale_id+' .btndelanswer').unbind('click'); - $('#answers_'+languages[x]+'_'+scale_id+' .answer').unbind('focus'); - $('#answers_'+languages[x]+'_'+scale_id+' .btnaddanswer').click(addinput); - $('#answers_'+languages[x]+'_'+scale_id+' .btndelanswer').click(deleteinput); - $('#answers_'+languages[x]+'_'+scale_id+' .answer').focus(function(){ - if ($(this).val()==newansweroption_text) - { - $(this).val(''); - } - }); - } - $('#quickadd').dialog('close'); - $('#quickaddarea').val(''); - $('.tab-page:first .answertable tbody').sortable('refresh'); - updaterowproperties(); -} - - - - - - - - -function quickadddialog() -{ - scale_id=removechars($(this).attr('id')); - $('#quickadd').dialog('open'); -} diff --git a/include/limesurvey/admin/scripts/assessments.js b/include/limesurvey/admin/scripts/assessments.js deleted file mode 100644 index 92394c4f..00000000 --- a/include/limesurvey/admin/scripts/assessments.js +++ /dev/null @@ -1,60 +0,0 @@ -function jquery_goodchars(e, goods) -{ - var key, keychar; - key = e.which; - if (key == null) return true; - - // get character - keychar = String.fromCharCode(key); - keychar = keychar.toLowerCase(); - goods = goods.toLowerCase(); - - // check goodkeys - if (goods.indexOf(keychar) != -1) - return true; - - // control keys - if ( key==null || key==0 || key==8 || key==9 || key==27 ) - return true; - - // else return false - return false; -} - - -$(document).ready(function(){ - $('#languagetabs').tabs(); - if ($(".assessmentlist tbody tr").size()>0) - { - $(".assessmentlist").tablesorter({sortList: [[0,0]] }); - } - $('#radiototal,#radiogroup').change( - function() - { - if ($('#radiototal').attr('checked')==true) - { - $('#gid').attr('disabled','disabled'); - } - else - { - if ($('#gid>option').length==0){ - $('#radiototal').attr('checked',true); - alert (strnogroup); - } - else - { - $('#gid').attr('disabled',false); - } - } - } - ) - $('#radiototal,#radiogroup').change(); - $('.numbersonly').keypress( - function(e){ - return jquery_goodchars(e,'1234567890-'); - } - ) - } -); - - diff --git a/include/limesurvey/admin/scripts/browse.js b/include/limesurvey/admin/scripts/browse.js deleted file mode 100644 index d5b7793d..00000000 --- a/include/limesurvey/admin/scripts/browse.js +++ /dev/null @@ -1,189 +0,0 @@ -/* -* LimeSurvey -* Copyright (C) 2007 The LimeSurvey Project Team / Carsten Schmitz -* All rights reserved. -* License: GNU/GPL License v2 or later, see LICENSE.php -* LimeSurvey is free software. This version may have been modified pursuant -* to the GNU General Public License, and as distributed it includes or -* is derivative of works licensed under the GNU General Public License or -* other free or open source software licenses. -* See COPYRIGHT.php for copyright notices and details. -* -* $Id: browse.js 11664 2011-12-16 05:19:42Z tmswhite $ -*/ - -$(document).ready(function(){ - // Delete individual file - $(".deleteresponse").click(function(){ - thisid=removechars($(this).attr('id')); - answer = confirm(strdeleteconfirm); - if (answer==true) - { - $('#deleteanswer').val(thisid); - $('.cbResponseMarker').attr('checked',false); - $('#resulttableform').submit(); - } - }); - - // Delete all marked responses - $("#imgDeleteMarkedResponses").click(function(){ - if ($('.cbResponseMarker:checked').size()>0) - { - thisid=removechars($(this).attr('id')); - answer = confirm(strDeleteAllConfirm); - if (answer==true) - { - $('#deleteanswer').val('marked'); - $('#resulttableform').submit(); - } - } - else - alert(noFilesSelectedForDeletion) - }); - - // Download individual file bundle - $(".downloadfile").click(function() { - thisid = removechars($(this).attr('id')); - $('#downloadfile').val(thisid); - $('.cbResponseMarker').attr('checked', false); - $('#resulttableform').submit(); - }); - - // Download all marked files - $("#imgDownloadMarkedFiles").click(function() { - if ($('.cbResponseMarker:checked').size() > 0) - { - $('#downloadfile').val('marked'); - $('#resulttableform').submit(); - } - else - alert(noFilesSelectedForDnld) - }); - - $("#selectall").click(function(){ - $('.cbResponseMarker').attr('checked',$(this).attr('checked')); - }); - - $('#browseresponses').qtip({ - content:{ - text:$('#browselangpopup') - }, - style: { name: 'cream', - tip:true, - color:'#111111', - border: { - width: 1, - radius: 5, - color: '#EADF95'} - }, - position: { adjust: { - screen: true, scroll:true }, - corner: { - target: 'bottomMiddle', - tooltip: 'topMiddle'} - }, - show: {effect: { length:50}, - when: { - event:'click' - }}, - hide: {fixed:true, - when: { - event:'unfocus' - }} - }); - - // Fix the heigh of the cell - $('.browsetable td').each(function(){ - if ($(this).text().length> 30){ - $(this).html(""+$(this).html()+""); - } - }); - $('.browsetable th strong').each(function(){ - if ($(this).text().length> 30){ - $(this).addClass("content"); - $(this).attr("title",$(this).text()); - } - }); - - $('.browsetable td span.content').qtip({ - hide: { - fixed: true, - delay: 500 - }, - position: { - corner: { - target: 'leftMiddle', - tooltip: 'topRight' - } - } - }); - $('.browsetable th strong.content').qtip({ - hide: { - fixed: true, - delay: 500 - }, - position: { - corner: { - target: 'leftMiddle', - tooltip: 'topRight' - } - } - }); -}); - -function htmlspecialchars (string, quote_style, charset, double_encode) { - // Convert special characters to HTML entities - // - // version: 1109.2015 - // discuss at: http://phpjs.org/functions/htmlspecialchars // + original by: Mirek Slugen - // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // + bugfixed by: Nathan - // + bugfixed by: Arno - // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfixed by: Brett Zamir (http://brett-zamir.me) - // + input by: Ratheous - // + input by: Mailfaker (http://www.weedem.fr/) - // + reimplemented by: Brett Zamir (http://brett-zamir.me) - // + input by: felix // + bugfixed by: Brett Zamir (http://brett-zamir.me) - // % note 1: charset argument not supported - // * example 1: htmlspecialchars("Test", 'ENT_QUOTES'); - // * returns 1: '<a href='test'>Test</a>' - // * example 2: htmlspecialchars("ab\"c'd", ['ENT_NOQUOTES', 'ENT_QUOTES']); // * returns 2: 'ab"c'd' - // * example 3: htmlspecialchars("my "&entity;" is still here", null, null, false); - // * returns 3: 'my "&entity;" is still here' - var optTemp = 0, - i = 0, noquotes = false; - if (typeof quote_style === 'undefined' || quote_style === null) { - quote_style = 2; - } - string = string.toString(); if (double_encode !== false) { // Put this first to avoid double-encoding - string = string.replace(/&/g, '&'); - } - string = string.replace(//g, '>'); - var OPTS = { - 'ENT_NOQUOTES': 0, - 'ENT_HTML_QUOTE_SINGLE': 1, - 'ENT_HTML_QUOTE_DOUBLE': 2, - 'ENT_COMPAT': 2, 'ENT_QUOTES': 3, - 'ENT_IGNORE': 4 - }; - if (quote_style === 0) { - noquotes = true; } - if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags - quote_style = [].concat(quote_style); - for (i = 0; i < quote_style.length; i++) { - // Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4 - if (OPTS[quote_style[i]] === 0) { - noquotes = true; - } - else if (OPTS[quote_style[i]]) { - optTemp = optTemp | OPTS[quote_style[i]]; } - } - quote_style = optTemp; - } - if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) { string = string.replace(/'/g, '''); - } - if (!noquotes) { - string = string.replace(/"/g, '"'); - } - return string; -} \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/ckeditor.36/.htaccess b/include/limesurvey/admin/scripts/ckeditor.36/.htaccess deleted file mode 100644 index 1427d97f..00000000 --- a/include/limesurvey/admin/scripts/ckeditor.36/.htaccess +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. -# For licensing, see LICENSE.html or http://ckeditor.com/license -# - -# -# On some specific Linux installations you could face problems with Firefox. -# It could give you errors when loading the editor saying that some illegal -# characters were found (three strange chars in the beginning of the file). -# This could happen if you map the .js or .css files to PHP, for example. -# -# Those characters are the Byte Order Mask (BOM) of the Unicode encoded files. -# All FCKeditor files are Unicode encoded. -# - -AddType application/x-javascript .js -AddType text/css .css - -# -# If PHP is mapped to handle XML files, you could have some issues. The -# following will disable it. -# - -AddType text/xml .xml diff --git a/include/limesurvey/admin/scripts/ckeditor.36/CHANGES.html b/include/limesurvey/admin/scripts/ckeditor.36/CHANGES.html deleted file mode 100644 index 16be7d58..00000000 --- a/include/limesurvey/admin/scripts/ckeditor.36/CHANGES.html +++ /dev/null @@ -1,1295 +0,0 @@ - - - - - Changelog — CKEditor - - - - -

    - CKEditor Changelog -

    -

    - CKEditor 3.6

    -

    - New features:

    -
      -
    • #7044 : New BBCode sample plugin that makes the editor output (one dialect of) BBCode format.
    • -
    • #5647 : Accessibility enhancements to the structure of the toolbar.
    • -
    • #5647 : The Kama skin now presents separators for the toolbar items, making it easier to group buttons and have a cleaner layout.
    • -
    • #5647 : Usability enhancements to keyboard navigation on the toolbar. The Tab key is now used to jump between toolbar groups, while the Arrow keys can be used to cycle within the group. The new toolbarGroupCycling setting can be used to change the Arrow keys behavior.
    • -
    • #1376 : It is now possible to put the editor in the "read-only" state, so that the users would not be able to introduce changes to the contents. Check out the new CKEDITOR.editor::setReadOnly method, the CKEDITOR.editor::readOnly property, the CKEDITOR.editor::readOnly event, and the readOnly setting.
    • -
    • #3582 : New presentation of anchor elements in the WYSIWYG mode.
    • -
    • #6737 : The Format drop-down list will now display the preview of its contents exactly as defined in their style configurations.
    • -
    • #6654 : A new autoParagraph configuration setting is added to disable the auto paragraphing feature.
    • -
    • #901 : New Stylesheet Parser (stylesheetparser) plugin that fills the Styles drop-down list based on the CSS classes available for the content. Check the new sample to learn how to use it.
    • -
    • #2988 : New Document Properties (docprops) plugin that sets the metadata of the page in the Full Page mode.
    • -
    • #7240 : New Developer Tools (devtools) plugin that shows information about dialog window UI elements to allow for easier customization.
    • -
    • #6841 : Pressing the Enter key at the end of a pre-formatted block will now exit from it.
    • -
    • #6850 : The About CKEditor dialog window now contains a link to CKEditor User's Guide.
    • -
    • #5745 : Extra configuration options for the iframeDialog can now be passed.
    • -
    • #6589 : The onDialogEvent function will now be used automatically in the iframeDialog contents if no callback is used on creation.
    • -
    • #7757 : Georgian localization added.
    • -
    -

    - Fixed issues:

    -
      -
    • #6774 : Internal styles are not included in the contents.css sample.
    • -
    • #6521 : Added sample for the TableResize plugin.
    • -
    • #6664 : Page break is sometimes merged into block-level elements.
    • -
    • #7594 : Toolbar keyboard navigation is not possible after recreating the editor.
    • -
    • #6657 : Allow to style the entire dialog window field when the input element is disabled.
    • -
    • Updated the following language files:
        -
      • Hebrew;
      • -
      • Polish;
      • -
    • -
    -

    - CKEditor 3.5.4

    -

    - Fixed issues:

    -
      -
    • Added protection against XSS attacks in PHP samples when displaying element names.
    • -
    • #7347 : The Enter key will no longer be caught by the dialog window covering the editor.
    • -
    • #6718 : Paste from Word command overrides the Force Paste as Plain Text configuration.
    • -
    • #6629 : Padding body is no longer needed when the last block is pre-formatted.
    • -
    • #4844 : [IE] Dialog windows fail to load if there are too many editor instances on the page.
    • -
    • #5788 : HTML parser trims empty spaces following <br> elements.
    • -
    • #7513 : Invalid markup could cause the editor to hang.
    • -
    • #6109 : Paste and Paste as Plain Text dialog windows now use the standard commitContent and setupContent methods.
    • -
    • #7588 : The editor code now has a protection system to avoid issues when including ckeditor.js more than once in the page.
    • -
    • #7322 : Text font plugin now recognizes font family names that contain quotes.
    • -
    • #7540 : Paste from Word introduces wrong spaces.
    • -
    • #7697 : Successive calls of the replace() method did not work after SCAYT context menu initialization.
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.5.3

    -

    - New features:

    -
      -
    • #4890 : Added the possibility to edit the rel attribute for links.
    • -
    • #7004 : Allow loading plugin translations even if they are not present in the plugin definition.
    • -
    • #7315 : Firing the resize event on dialog window instances is now possible.
    • -
    • #7259 : Dialog window definition allows to specify initial width and height values.
    • -
    • #7131 : List item numbering is now supported on pasting from Microsoft Word.
    • -
    -

    - Fixed issues:

    -
      -
    • #1272 : [WebKit] It is now possible to apply styles to collapsed selections in Safari and Chrome.
    • -
    • #7054 : The tooltips for special characters are now lowercased, making them more readable.
    • -
    • #7102 : "Replace DIV" sample did not work when double-clicking inside the formatted text.
    • -
    • #7088 : Loading of plugins failed on new instances of the editor after the Insert Special Character dialog window was used.
    • -
    • #6215 : Removal of inline styles now also removes overrides.
    • -
    • #6144 : Rich text drop-down lists have wrong height when toolbar is wrapped.
    • -
    • #6387 : AutoGrow may cause an error when editor instance is destroyed too quickly after a height change.
    • -
    • #6901 : Mixed direction content was not properly respected in a shared toolbar setting.
    • -
    • #4809 : Table-related tags are output in wrong order.
    • -
    • #7092 : Corrupted toolbar button state for inline style after switching to Source.
    • -
    • #6921 : Pasted text marked by SCAYT in one language is not re-checked if another spellchecking language is selected in the editor.
    • -
    • #6614 : Enhancement of the resize handle in RTL.
    • -
    • #5924 : Flash plugin now recognizes Flash content without an embed tag.
    • -
    • #4475 : Protected source in attributes and inline CSS text is not handled correctly.
    • -
    • #6984 : [FF] Trailing line breaks are lost in ENTER_BR.
    • -
    • #6987 : [IE] Text selection lost when calling editor::insertHtml from a dialog window in some situations.
    • -
    • #6865 : BiDi mirroring does not work when a text direction change is done through a dialog window.
    • -
    • #6966 : [IE] Unintended paragraph is created in an empty document in enterMode set for BR and DIV.
    • -
    • #7084 : SCAYT dialog window is now working properly with more than one editor instance in a page.
    • -
    • #6662 : [FF] List structure pasting error caused by a regression from FF3.5.x is now fixed.
    • -
    • #7300 : Link dialog window now loads numeric values correctly.
    • -
    • #7330 : New list items no longer inherit the value attribute from their sibling.
    • -
    • #7293 : The "Automatic" color button is now presented correctly without focus inside the editor.
    • -
    • #7018 : [IE] Toolbar drop-down lists did not have a border around them.
    • -
    • #7073 : Image dialog window no longer allows zero height and width value to be entered.
    • -
    • #7316 : [FF] Clicking on "Paste" button incorrectly breaks the line at the cursor position.
    • -
    • #6751 : Inline whitespaces are incorrectly stripped when pasting from Word.
    • -
    • #6236 : [IE] Fixing malformed nested list structure which was introduced by the Backspace key.
    • -
    • #6649 : [IE] Selection of the full table sometimes does not work.
    • -
    • #6946 : HTML parser is now able to fix orphan list items.
    • -
    • #6861 : Indenting a list item should retain the text direction.
    • -
    • #6938 : Outdenting a list item should retain the text direction.
    • -
    • #6849 : Correct Enter key behavior on list item.
    • -
    • #7113 : [WebKit] Undesired document scroll on click after scrolling.
    • -
    • #6491 : Undesired Image dialog window dimension lock reset on URL change.
    • -
    • #7284 : [FF Quirks] Maximize now works correctly.
    • -
    • #6609 : [IE9] Browser in high contrast mode is not properly detected.
    • -
    • #7222 : [WebKit] Impossible to apply a single style to a collapsed selection without giving the editor focus.
    • -
    • #7180 : [IE9] When using Kama skin and RTL layout dialog window buttons were not being displayed correctly.
    • -
    • #7182 : [IE9] When using Office2003/v2 skin and RTL layout dialog window shadows were corrupted.
    • -
    • #6913 : Invalid escape sequence (\b) was used in the PHP integration.
    • -
    • #5757 : [IE6] Text was not wrapping in the accessibility instructions dialog window.
    • -
    • [6604] : Xml.js and Ajax.js are now available as plugins ('xml' and 'ajax').
    • -
    • #7304 : Microsoft Word cleanup function is not always invoked when clicking on the "Paste From Word" button.
    • -
    • #6658 : [IE] Pasting text from Microsoft Word with one or more tabs between list items was failing.
    • -
    • #7433 : [IE9] ENTER_BR at the end of a block breaks due to an IE9 regression.
    • -
    • #7432 : [WebKit] Unable to create a new list in an empty document.
    • -
    • #4880 : CKEditor changes tag style inside HTML comment with cke_protected.
    • -
    • #7023 : [IE] JavaScript error when a Selection Field is inserted into a page.
    • -
    • #7034 : Inserting special characters into styled text.
    • -
    • #7132 : Paste toolbar buttons are becoming disabled.
    • -
    • #7138 : The api.html sample in Opera does not work as expected.
    • -
    • #7160 : Cannot paste the form element on top of the page.
    • -
    • #7171 : Double-clicking an image in non-editable content opens the editing dialog window.
    • -
    • #7455 : Extra line break is added automatically to the preformatted element.
    • -
    • #7467 : [Firefox] Extra br element is added in a nested list.
    • -
    • Updated the following language files:
        -
      • #7124 : Czech;
      • -
      • #7126 : French;
      • -
      • #7140 : Catalan;
      • -
      • #7215 : Faroese;
      • -
      • #7177 : Finnish;
      • -
      • #7163 : Norwegian (no and nb);
      • -
      • #7219 : Swedish;
      • -
      • #7183 : Afrikaans;
      • -
      • Hebrew;
      • -
      • Spanish;
      • -
      • Polish;
      • -
      • German;
      • -
    • -
    -

    - CKEditor 3.5.2

    -

    - Fixed issues:

    -
      -
    • #7168 : [IE9] Destroying an editor instance throws an error.
    • -
    • #7169 : [IE9] Menu item has incorrect height.
    • -
    • #7178 : [IE9] Read-only attributes do not work in IE9.
    • -
    • #7181 : [IE9] Toolbar items are not aligned in v2 and Office2003 skins.
    • -
    • #7174 : [IE9] Elements path does not load correctly when the editor is switched back from Source to WYSIWYG.
    • -
    -

    - CKEditor 3.5.1

    -

    - New features:

    -
      -
    • #6107 : It is now possible to remove block styles using Styles and Paragraph Format drop-down lists.
    • -
    • #5590 : Remove Format command works in collapsed selections.
    • -
    • #5755 : The dialog_buttonsOrder option now works in Internet Explorer.
    • -
    • #6869 : The data-cke-nostyle attribute (which was introduced for escaping the element from been influenced by the style system since 3.5) is deprecated in favor of the new data-nostyle attribute.
    • -
    • Revised sample pages with code examples and clarifications.
    • -
    -

    - Fixed issues:

    -
      -
    • #5855 : Updating a link multiple times generates wrong href attribute.
    • -
    • #6166 : Error on Maximize command, when the toolbar button is not shown.
    • -
    • #6607 : Table cell "merge down" and "merge right" commands work only once.
    • -
    • #6228 : Merge down does not work, throwing a JavasSript error.
    • -
    • #6625 : BIDI: Mixed LTR/RTL direction causes incorrect behavior.
    • -
    • #6881 : IFrame capitalization is now consistent throughout labels.
    • -
    • #6686 : BIDI: [FF] When we apply explicit language direction to a numbered/bulleted list, the corresponding language direction toolbar icon is not highlighted.
    • -
    • #6566 : It is now possible to exit a blockquote using ENTER_BR.
    • -
    • #6868 : Partial (invalid) list structure crashes the editor on load.
    • -
    • #6804 : Buggy behavior when editing the legend element inside a fieldset.
    • -
    • #6724 : [IE7] Nested list display bug on empty list item.
    • -
    • #6715 : List items do not create paragraphs after the list placed in a table cell is removed.
    • -
    • #6695 : [Webkit] Display bug after the editor is restored from the full screen mode.
    • -
    • #6661 : [IE] Pre-formatted style does not preserve applied text direction.
    • -
    • #6655 : Using the editor resize grip causes small visual offsets.
    • -
    • #6604 : The div element should be used as a formatting block in ENTER_BR.
    • -
    • #6249 : BIDI: List item bullets are off viewport with RTL text direction.
    • -
    • #6610 : BIDI: ENTER_BR change direction in one line out of multiple.
    • -
    • #6872 : [IE] Link target field is not populated properly when no target is set.
    • -
    • #6880 : Samples: Added a user-friendly message for users on servers without PHP support.
    • -
    • #6628 : Setting config.enterMode from PHP fails.
    • -
    • #6278 : Comments were moved above the br tags.
    • -
    • #6687 : Empty tag should be removed in inline-style format.
    • -
    • #6645 : Allow to configure whether " (double quotes) characters should be encoded in the contents.
    • -
    • #6336 : IE: (double)clicking an input type="submit" button submitted the form.
    • -
    • #6646 : Context menu was not working for text inputs present in the initial content.
    • -
    • #6641 : Copying and pasting links inside the editor was not working.
    • -
    • #4208 : The disableObjectResizing setting now works in IE.
    • -
    • #6242 : [IE] Editing existing links with href of a relative path mangles containing text.
    • -
    • #5930 : [IE] Style definitions are no longer lowercased.
    • -
    • #5361 : Preview window's title should reflect the title tag in full page mode.
    • -
    • #5522 : [IE] In versions < 8 or compatibility mode, type="text" was missing in text fields.
    • -
    • #6126 : [IE] Avoid problems if there are two buttons named "submit".
    • -
    • #6791 : [IE7] Editor did not show up when the name of a replaced textarea matched the name of a meta tag in the page.
    • -
    • #5684 : [FF] When forcePasteAsPlainText is used, the cursor disappears after paste.
    • -
    • #6390 : Prevent toolbar dialog window buttons from being clicked twice.
    • -
    • #6684 : [Webkit] Toolbar buttons are not wrapping correctly when the editor is displayed inside a table.
    • -
    • #6703 : [IE] editor focus event not fired in an instance, when a dialog window closes.
    • -
    • #6873 : Difficult to drag the resize grip of the spell checker dialog window.
    • -
    • #6896 : [Webkit] Unable to paste into source area when the editor is maximized.
    • -
    • #6020 : The state of the Cut, Copy, and Paste toolbar now matches the state of the context menu buttons.
    • -
    • #5256 : JavaScript error thrown when percent (%) sign is used in image URL.
    • -
    • #6577 : [FF] Selection error when an element containing the editor instance is hidden.
    • -
    • #5500 : [IE] value attribute of text input dialog window field was missing.
    • -
    • #6665 : [IE] name field of Link dialog window was missing.
    • -
    • #6639 : Line-breaks inside pasted list item from Microsoft Word break the list structure.
    • -
    • #6909 : [IE] GIF icons of toolbar button from custom plugins are not diplayed in zoom level 100%.
    • -
    • #6860 : [FF] Double-clicking the placeholder element in order to open a Placeholder dialog window throws a JavaScript error.
    • -
    • #6630 : Empty pre elements are output differently in various browsers.
    • -
    • #6568 : Insert table row/column does not work with spanning.
    • -
    • #6735 : Inaccurate read-only selection detection.
    • -
    • #6728 : BIDI: Change direction does not work with list nested inside a blockquote.
    • -
    • #6432 : Inserting a table in place of a fully selected list results in a JavaScript error.
    • -
    • #6438 : [IE] Performance enhancement when typing inside an element with many child nodes.
    • -
    • #6970 : [IE] Dialog window shadows were presented inaccurately.
    • -
    • #6672 : [IE] Unnecessary br element is no longer inserted after a form.
    • -
    • #7087 : [FF] Sometimes it was not possible to move cursor out of link at the end of block.
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.5

    -

    - New features:

    -
      -
    • #4090 : Full Adobe AIR support.
    • -
    • #5084 : Dialog windows are now resizable with a grip located in the footer.
    • -
    • #5755 : Introduced the dialog_buttonsOrder setting, making it possible to control the buttons order.
    • -
    • #4648 : Added the new iFrame plugin.
    • -
    • #6010 : The Automatic option of the font/background color panel now represents the real color.
    • -
    • #5654 : New "placeholder" plugin.
    • -
    • #6334 : CKEditor now uses HTML5's data-* attributes for its internal attributes.
    • -
    • #6103 : It's now possible to control the styling of inline read-only elements with the disableReadonlyStyling setting. It's also possible to avoid inline-styling any element by setting its "data-cke-nostyle" attribute to "1".
    • -
    • #5404 : fillEmptyBlocks configuration option of v2 is now available.
    • -
    • #5367 : New CKEDITOR.editor#insertText method (check api.html sample page for usages) is now provided to insert plain text into editor.
    • -
    • #5915 : New removeDialogTabs configuration option to hide certain dialog tabs.
    • -
    -

    - Fixed issues:

    -
      -
    • #4821 : Icons in the toolbar were distorted with IE and zoom != 100%.
    • -
    • #5587 : Visual improvements in dialogs, reinforce field label on separate line.
    • -
    • #4652 : Now it's able to disable editor context menu by simply removing the "contextmenu" plugin.
    • -
    • #5599 : Labels of "specialchar" dialog are now translated.
    • -
    • #6419 : [IE] List creation by merging problem.
    • -
    • #6502 : Removed IE6 image preloading, which was used to defect the duplicate request of background images.
    • -
    • #6822 : Added labels to fake objects.
    • -
    • #6898 : [IE6] Toolbar icons becomes invisible in RTL.
    • -
    • Updated the following language files:
        -
      • Hebrew
      • -
    • -
    -

    - CKEditor 3.4.3

    -

    - Fixed issues:

    -
      -
    • #6554 : [Webkit] cannot type after inserting Page Break.
    • -
    • #6569 : Indentation now complies with text direction of the only item.
    • -
    • #6579 : The jQuery adapter was not working properly and was turned on in incompatible environments.
    • -
    • #6644 : Restrict onmousedown handler to the toolbar area.
    • -
    • #6656 : Panelbutton's buttons became active when clicking on Source.
    • -
    • #6248 : Whitespaces (nbsp elements) were incorrectly added into empty table cells and list items.
    • -
    • #6575 : Tabs disappearing in Link dialog window after a specific sequence of actions.
    • -
    • #6510 : Margin mirroring does not respect style configuration.
    • -
    • #6471 : BIDI: Pressing Decrease Indent in an RTL bulleted list causes incorrect behaviour.
    • -
    • #6479 : BIDI: Language direction is not being preserved when pressing Enter after a Paragraph Format was applied.
    • -
    • #6670 : BIDI: Indent & List icons are not reversed when we apply RTL direction to a paragraph with any of Paragraph Formatting options.
    • -
    • #6640 : Floating panels are now being closed when switching modes.
    • -
    • #4790 : Remove list with multiple items in enterBr doesnot preserve line breaks.
    • -
    • #6297 : Floated inline elements are not taking part in behavior of blocks anymore.
    • -
    • #6171 : [Firefox] Opening rich content drop-down list scrolls host page to the top when editor has a vertical scrollbar.
    • -
    • #6330 : List markers from MS Word with Roman numbering are not preserved.
    • -
    • #6720 : Attribute protection might detect wrong elements.
    • -
    • #6580 : [IE9] Flash dialog window does not get filled up.
    • -
    • #6447 : Decreasing indentation of a list with indentClasses config does not work.
    • -
    • #5894 : Adding custom buttons at the bottom of a dialog window does not cause it to expand to include its contents.
    • -
    • #6513 : Wrong ARIA attributes created on list options of Styles drop-down list.
    • -
    • #6150 : [Safari] Color dialog window was broken.
    • -
    • #6747 : Full screen layout issue caused by page element focus outside editor.
    • -
    • #6779 : Clicking the body element on elements path turns the selection on and off immediately.
    • -
    • #6781 : [IE7] Dialog windows are broken with RTL, Office 2003 and v2 skins.
    • -
    • #6798 : [IE7] Dialog window buttons disappearing in RTL after dragging.
    • -
    • #6806 : [IE7] Dialog window buttons invisible on focus.
    • -
    • #6588 : Copy and paste adds <span> if SCAYT is enabled.
    • -
    • #6673 : IE Target combo for Image Link shown as blank even when we select <not set> as an option.
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.4.2

    -

    - New features:

    -
      -
    • #5024 : Added a sample that shows how to output HTML that is valid for Flash.
    • -
    -

    - Fixed issues:

    -
      -
    • #5237 : English text in dialogs' title was flipped when using RTL language (office2003 and v2 skins).
    • -
    • #6289 : Deleting nested table removed the parent cell.
    • -
    • #6341 : The editor contents now have the text cursor.
    • -
    • #6153 : Chrome: tab focus is wrong.
    • -
    • #6261 : Focus and infinite loop between multiple editors.
    • -
    • #6170 : Dedicated class names are removed from floating panels when opening another panel.
    • -
    • #6339 : Autogrow plugin now doesn't work on maximized editors.
    • -
    • #6237 : BIDI: Applying same language direction to all paragraphs not working.
    • -
    • #6353 : [IE] Resize was broken with office2003 and v2 skins.
    • -
    • #6375 : Avoiding errors when hiding the editor after the blur event.
    • -
    • #6133 : Styled paragraphs result on buggy list creation.
    • -
    • #5074 : Link target is not removed when changing to popup.
    • -
    • #6408 : [IE] Autogrow now works correctly on Quirks.
    • -
    • #6420 : [IE] The table properties dialog now correctly retrieves the caption text.
    • -
    • #6141 : It was impossible to outdent a list when indentOffset was set to 0.
    • -
    • #6377 : FF width and height are not shown for smiley in Image properties dialog.
    • -
    • #5399 : Lists pasted from Word do not maintain their nesting.
    • -
    • #6225 : [FF] Cannot transform several lines to list with enterMode BR.
    • -
    • #6467 : [FF] It is now possible to disable the plugin command on "mode" event.
    • -
    • #6461 : Attributes are now being kept when changing block formatting.
    • -
    • #6226 : BIDI: Language direction applied to a Paragraph is removed when we apply one of Paragraph formatting options.
    • -
    • #5395 : [Opera] Native context menu incorrectly opened after Opera 10.2.
    • -
    • #6444 : [Opera] Close panels and dialogs don't return focus to wysiwyg frame.
    • -
    • #6332 : IE: V2 skin bottom dialog's border broken.
    • -
    • #5646 : Parser incorrectly removes inline element when there's only one comment node enclosed.
    • -
    • #6189 : Minor code size reduction.
    • -
    • #5045 : uiColor behaved wrong if multiple editors were used with period in their names.
    • -
    • #5766 : Config entry "ignoreEmptyParagraph" should only remove one single empty paragraph in document.
    • -
    • #5931 : Unable to apply inline style because of nested elements with same style name.
    • -
    • #6083 : Dialog close sometimes cause collapsed editor selection before the insertion.
    • -
    • #6253 : BIDI: creating a Numbered/Bulleted list causing improper behavior on bidi.
    • -
    • #4023 : [Opera] Maximize plugin.
    • -
    • #6403 : [Opera] Font name options are not correctly marked in dropdown list.
    • -
    • #4534 : [Opera] Arrow key to navigate through combo list has side effects of window scrolling.
    • -
    • #6534 : [Opera] Menu key brings up both CKEditor and browser context menu.
    • -
    • #6534 : [Opera] Menu key brings up both CKEditor and browser context menu.
    • -
    • #6416 : [IE9] Unable to make text selection with mouse in source area.
    • -
    • #6417 : [IE9] Context menu opens at the upper-left corner always.
    • -
    • #6501 : [IE9] Context menu item layout is broken.
    • -
    • #6099 : BIDI: when we apply explicit language direction to Numbered/Bulleted List the corresponding BIDI Tool bar icon is not highlighted in the Toolbar.
    • -
    • #6100 : BIDI: when we change Table language direction indentation of text in Table cells is not applied correctly.
    • -
    • #6376 : BIDI: buttons should not toggle the base language direction.
    • -
    • #6235 : BIDI: Applying direction to multi-paragraph selection within a div.
    • -
    • #6187 : [IE6] Multi-instance loading produces 404s on background images.
    • -
    • #5446 : Setting config.filebrowserImageBrowseUrl results in displaying also Browser Server on links.
    • -
    • #5626 : CKeditor 3.2.1 : html content attached makes ckeditor crash the browser FF/IE.
    • -
    • #6508 : BiDi: Margin mirroring logic doesn't honor CSS direction.
    • -
    • #6043 : BIDI: When we apply RTL direction to a right aligned Paragraph, Paragraph is not moved to the left & Alignment of Paragraph is not changed.
    • -
    • #6485 : BIDI: When direction is applied on partial selected list, the style is been incorrectly applied to the entire list.
    • -
    • #6087 : Cursor of input fields in dialog isn't visible in RTL.
    • -
    • #5595 : Extra leading spaces added in preformatted block.
    • -
    • #6094 : Match full word option doesn't stop on block boundaries.
    • -
    • #5730 : [Safari] Continual pastes (holding paste key) breaks document contents.
    • -
    • #5850 : [IE] Inline style misbehaviors at the beginning of numbered/bulleted list.
    • -
    • Updated the following language files:
        -
      • #6427 : Ukrainian;
      • -
      • #6464 : Finnish;
      • -
      • Hebrew;
      • -
    • -
    -

    - CKEditor 3.4.1

    -

    - New features:

    - -

    - Fixed issues:

    -
      -
    • #6027 : Modifying Table Properties by selecting more than one cell caused issues.
    • -
    • #6146 : IE: Floating panels were being opened in the wrong place in RTL pages with horizontal scrollbars.
    • -
    • #6055 : The timestamp is now added only once to each loaded file.
    • -
    • #6097 : The bookmarks now use the right name.
    • -
    • #5717 : Removed the scayt_contextMenuOntop setting and the SCAYT context menu options are always on top.
    • -
    • #5956 : [FF] It was impossible to create an editor inside an hidden container.
    • -
    • #5753 : It was impossible to have a default value for the name field in the select dialog.
    • -
    • #6041 : BIDI: Direction of Increase Indent & Decrease Indent icons are not reversed after changing Lang direction to RTL.
    • -
    • #6138 : List indentation is not working.
    • -
    • #5649 : Image dialog too wide when many styles are set.
    • -
    • #5715 : Cell color picker dialog returns focus to document.
    • -
    • #6108 : Fixed div style.
    • -
    • #5336 : Remove object style.
    • -
    • #6155 : [[FF]] Modifying Table Header Properties by selecting first Row, causing several issues.
    • -
    • #6163 : Focus not going to Tabs in Image dialog when we went to Edit the Image.
    • -
    • #6177 : IE we can't start Numbered/Bulleted list on a Empty page.
    • -
    • #5413 : Browser error after pasting html table in CKEditor.
    • -
    • #6034 : Horizontal Alignment applied to Table cell is not updated correctly in the Toolbar.
    • -
    • #6112 : BIDI: Alignment set to text in Table cell is not shown in the Tool bar when we press Enter to start a new Paragraph.
    • -
    • #6117 : BIDI: Language direction is changing when we come out of Numbered/Bulleted list.
    • -
    • #6182 : Language Direction field on the Advanced tab of Table Properties dialog has a fixed pixel width.
    • -
    • #5487 : Fullpage writer problem with line-break.
    • -
    • #6197 : The CKEDITOR.loader base path auto-detection was not working with the _source folder.
    • -
    • #6240 : Font Names & Font Sizes should be shown Left Align even for RTL Languages.
    • -
    • #5975 : Page-break should have proper Alt Text instead of Unknown object. so that JAWS reads it properly.
    • -
    • #6255 : Inserting a page break as the first node triggered an error.
    • -
    • #6188 : [IE7] Automatic color button had the wrong cursor.
    • -
    • #6129 : The show blocks' labels are now shown in the right for RTL languages.
    • -
    • #5421 : &shy; entity not converted when config.entities=false.
    • -
    • #5769 : xhtml code generation problem &nbsp; instead of &#160; (htmlentities, entities,entities_additional,..., configuration).
    • -
    • #4472 : [FF3] Browser window scrolls to loaded CKEditor.
    • -
    • #6230 : Fixed invalid parameter count for setTimeout function call.
    • -
    • #5335 : Several lines' formatted data will be merged to one line when we apply Numbers/Bullets.
    • -
    • #5353 : wrong width of editor after resize() called in Firefox 3.6.
    • -
    • #5778 : [IE] Unwanted scroll on first mouse right-click.
    • -
    • #5218 : [FF] Copy/paste of an image from same domain changed URL to relative URL.
    • -
    • #6265 : Popup window properties were visible in the link dialog's target tab when nothing was selected.
    • -
    • #6075 : [FF] Newly created links didn't fill in information on edit.
    • -
    • #6183 : The toolbar panels options sometimes had the contents' link color.
    • -
    • #6192 : [WebKit] Inserting smileys was not working because of editor focus issues.
    • -
    • #6178 : [WebKit] Inserting elements by code was failing if the editor didn't receive the focus first.
    • -
    • #6179 : [WebKit] The Image dialog was not working if the editor didn't receive the focus first.
    • -
    • #4657 : [Opera] Styles where not working with collapsed selections.
    • -
    • #5839 : "Insert row after" was removing the ids of the elements from the clicked row.
    • -
    • #6315 : DIV plugin TT #2885 regression.
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.4

    -

    - Fixed issues:

    -
      -
    • #6118 : Initial focus is now set to the tabs in the table properties dialog.
    • -
    • #6135 : The dialogadvtab plugin now uses the correct label.
    • -
    • #6125 : Focus was lost after applying commands in Opera.
    • -
    • #6137 : The table dialog was missing the default width value on second opening.
    • -
    -

    - CKEditor 3.4 Beta

    -

    - New features:

    -
      -
    • #5909 : New BiDi feature, making it possible to switch the base language direction of block elements.
    • -
    • #5268 : Introducing the "tableresize" plugin, which makes it possible to resize tables columns by mouse drag. It's not enabled by default, so it must be enabled in the configurations file.
    • -
    • #979 : New enableTabKeyTools configuration to allow using the TAB key to navigate through table cells.
    • -
    • #4606 : Introduce the "autogrow" plugin, which makes the editor resize automatically, based on the contents size.
    • -
    • #5737 : Added support for the HTML5 contenteditable attribute, making it possible to define read only regions into the editor contents.
    • -
    • #5418 : New "Advanced" tab introduced on the Table Properties dialog. It's based on the new dialogadvtab plugin.
    • -
    • #6082 : Introduced the useComputedState setting, making it possible to control whether toolbar features, like alignment and direction, should reflect the "computed" selection states, even when the effective feature value is not applied.
    • -
    -

    - Fixed issues:

    -
      -
    • #5911 : BiDi: List items should support and retain correct base language direction
    • -
    • #5689 : Make it possible to run CKEditor inside of Firefox chrome.
    • -
    • #6042 : It wasn't possible to align a paragraph with the dir attribute to the opposite direction.
    • -
    • #6058 : Fixed a small style glitch with file upload fields in IE+Quirks.
    • -
    -

    - CKEditor 3.3.2

    -

    - New features:

    -
      -
    • #5882 : Introduce the dialog#selectPage event, replicating the OnDialogTabChange feature available in FCKeditor 2.
    • -
    • #5927 : The native controls in ui.dialog.elements can be styled with the controlStyle definition.
    • -
    -

    - Fixed issues:

    -
      -
    • #1644 : Removed references to cursor:hand in the stylesheets.
    • -
    • #5411 : Anchor, hidden fields and Page-Break objects can no longer be resized.
    • -
    • #5456 : Initial focus incorect in api_dialog sample page.
    • -
    • #5628 : Incorrect <pre> siblings merging.
    • -
    • #5829 : Adding validation for start number field in list style dialog.
    • -
    • #5845 : Context menu on empty list item loses selection.
    • -
    • #5860 : [IE] > in attribute values are incorrectly escaped.
    • -
    • #5905 : SCAYT is not any more enabled by default.
    • -
    • #5736 : Improved the text generated for mailto: links if no text was selected.
    • -
    • #4779 : Adjust resize_minWidth and resize_minHeight if smaller than actual dimensions.
    • -
    • #5687 : Navigation through colors is now compatible with RTL.
    • -
    • #4615 : [IE] Text fields are no longer disrupted in dialog with RTL.
    • -
    • #5887 : The number of columns in the smileys table is now configurable via the smiley_columns setting.
    • -
    • #5100 : It was possible to drag&drop some elements like context menu items or dropdown entries.
    • -
    • #5933 : Text color and background color panels don't have scrollbars anymore under office2003 and v2 skins.
    • -
    • #5943 : An error is no longer generated when using percent or pixel values in the image dialog.
    • -
    • #5951 : Avoid problems with security systems due to the usage of UniversalXPConnect.
    • -
    • #5441 : Avoid errors if the editor instance is removed from the DOM before calling its destroy() method.
    • -
    • #4997 : Provide better access to the native input in the ui.dialog.file element.
    • -
    • #5914 : Modified the Smileys dialog to make active only the images and not their borders.
    • -
    • #5565 : The scrollbar does not behaves erratically when opening a rich combo in RTL page.
    • -
    • #5843 : In CKEditor 3.3: When we set the focus in the 'instanceReady' event, FF3.6 is giving js error.
    • -
    • #5902 : paste and pastetext dialogs cannot be skinned easily.
    • -
    • #5959 : Dialog auto focus does not check for hidden tabs.
    • -
    • #5415 : Undo not working when we change the Table Properties for the table on a saved page.
    • -
    • #5435 : IE: we can't start Numbered/Bulleted list in Tables by Clicking on Insert/Remove Numbers/Bullets Icon.
    • -
    • #5832 : The JQuery adapter sample is not working properly with SSL.
    • -
    • #5728 : Text field & Upload Button in Upload Tab of Image Properties dialog are not shown Properly in Arabic.
    • -
    • #5436 : IE: Cursor goes to next Table Cell after we insert a Smiley in the Table Cell.
    • -
    • #5580 : Maximize does not work properly in the Office 2003 and V2 skins.
    • -
    • #5495 : The link dialog was breaking the undo system on some situations.
    • -
    • #5775 : Required field's label to contain a CSS class to allow it to be styled differently.
    • -
    • #5999 : Table dialog rows and columns fields are now marked as required.
    • -
    • #5693 : baseHref detection in the flash dialog now works correctly.
    • -
    • #5690 : Table cell's width attribute is now respected properly.
    • -
    • #5819 : Introducing the new removeFormatCleanup event and making sure remove format doesn't break the showborder plugin.
    • -
    • #5558 : After pasting on WebKit based browsers the editor now scrolls to the end of the pasted content.
    • -
    • #5799 : Correct plugin dependencies for the liststyle plugin with contextMenu and dialog.
    • -
    • #5436 : IE: The cursor was moving to the wrong position when inserting inline elements at the end of cells on tables.
    • -
    • #5984 : Firefox: CTRL+HOME was creating an unwanted empty paragraph at the start of the document.
    • -
    • #5634 : IE: It was needed to click twice in the editor to make it editable on some situations.
    • -
    • #5338 : Pasting from Open Office could lead on error.
    • -
    • #5224 : Some invalid markup could break the editor.
    • -
    • #5455 : It was not possible to remove formatting from pasted content on specific cases.
    • -
    • #5735 : IE: The editor was having focus issues when the previous selection got hidden by scroll operations.
    • -
    • #5563 : Firefox: The disableObjectResizing and disableNativeTableHandles settings stopped working.
    • -
    • #5781 : Firefox: Editing was not possible in an empty document.
    • -
    • #5293 : Firefox: Unwanted BR tags were being left in the editor output when it should be empty.
    • -
    • #5280 : IE: Scrollbars where reacting improperly when clicking in the bar space.
    • -
    • #5840 : Some dialog access keys are conflicting with "Ctrl + A", select all text behavior on text input.
    • -
    • #6059 : Changing list type didn't preserve the list's attributes.
    • -
    • #5193 : In Firefox, the element path options had the text cursor instead of the arrow.
    • -
    • #6073 : The list context menu was showing the wrong option when in a mixed list hierarchy.
    • -
    • #6074 : The Insert Table Column command was duplicating the selected column cells ids.
    • -
    • #6066 : The toolbar combos had the text cursor instead of the arrow.
    • -
    • #6062 : The toolbar buttons had the text cursor instead of the arrow.
    • -
    • #6068 : [IE7] A few labels were hidden in a RTL language.
    • -
    • #6000 : Safari and Chrome where scrolling the contents to the top when moving the focus to the editor.
    • -
    • #6090 : IE: Textarea with selection inside causes Link dialog issues.
    • -
    • #5079 : Page break in lists move to above the list when you switch from WYSIWYG to HTML mode and back.
    • -
    • Updated the following language files:
        -
      • Chinese Simplified;
      • -
      • Hebrew;
      • -
      • #5962 : German;
      • -
      • #5645 : Portuguese;
      • -
      • #5797 : Turkish;
      • -
    • -
    -

    - CKEditor 3.3.1

    -

    - Fixed issues:

    -
      -
    • #5780 : Text selection lost when opening some of the dialogs.
    • -
    • #5787 : Liststyle plugin wasn't packaged into the core (CKEDITOR.resourceManager.load exception).
    • -
    • #5637 : Fix wrong nesting that generated "<head> must be a child of <html>" warning in Webkit.
    • -
    • #5790 : Internal only attributes output on fullpage <html> tag.
    • -
    • #5761 : [IE] Color dialog matrix buttons are barely clickable in quirks mode.
    • -
    • #5759 : [IE] Clicking on the scrollbar and then on the host page causes error.
    • -
    • #5772 : List style dialog is missing tab page ids.
    • -
    • #5782 : [FF] Wysiwyg mode is broken by 'display' style changes on editor's parent DOM tree.
    • -
    • #5801 : [IE] contentEditable="false" doesn't apply in effect on inline-elements.
    • -
    • #5794 : Empty find matching twice results in JavaScript error.
    • -
    • #5732 : If it isn't possible to connect to the SCAYT servers the dialogs might hang in Firefox. Fix for Firefox>=3.6.
    • -
    • #5807 : [FF2] New page command results in uneditable document.
    • -
    • #5807 : [FF2] SCAYT plugin is disabled in Firefox2 due to selection interference.
    • -
    • #5772 : [IE] Some numbered list style types are not supported by IE6/7 and causes JavaScript error.
    • -
    -

    - CKEditor 3.3

    -

    - New features:

    -
      -
    • #635 : The properties dialog will now open when double clicking on objects.
    • -
    • #3893 : It's now possible to indent/outdent lists when selecting the first list item.
    • -
    • #4968 : The contentsLangDirection setting now has a default value 'ui' which inherit language direction from the editor UI language.
    • -
    • #4649 : The color picker dialog is now accessible.
    • -
    • #3593 : The editing area is now enabled by contentEditable="true" instead of designMode="on" to allow creating uneditable content elements in all browsers.
    • -
    • #4056 : Hidden fields will now be displayed as fake element just like in FCKeditor 2.
    • -
    -

    - CKEditor 3.2.2

    -

    - New features:

    -
      -
    • The SCAYT spell checker is now enabled by default through the autoStartup setting.
    • -
    • #5631 : The SCAYT context menu options can now be reorganized through the scayt_contextMenuItemsOrder setting.
    • -
    • #4231 : Introducing the resize_dir setting, to be able to restrict manual resizing of the editor to only one direction (horizontal/vertical).
    • -
    • #5479 : Introducing the classic ASP integration files and samples.
    • -
    • #5024 : Added samples (HTML and XHTML) to show how to output HTML using fonts and other attributes instead of styles.
    • -
    • #4358 : Introduced the List Properties dialog.
    • -
    • #5485 : Adding the contentsLanguage configuration option to be able to set the language for the editor contents.
    • -
    -

    - Fixed issues:

    -
      -
    • #5330 : Corrected detection of CTRL and META keys in Macs for the context menu.
    • -
    • #5434 : Fixed access denied issues with IE when accessing web sites through IPv6 IP addresses.
    • -
    • #4476 : [IE] Inaccessible empty list item contains sub list.
    • -
    • #4881 : [IE] Selection range broken because of cutting a single control type element from it.
    • -
    • #5505 : Image dialog throw JavaScript error when click close dialog before preview area is loading.
    • -
    • #5144 : [Chrome] Paste in Webkit sometimes leaves extra 'div' element.
    • -
    • #5021 : [Firefox] Typing in empty document start from second line when enterMode = CKEDITOR.ENTER_BR.
    • -
    • #5416 : [IE] Delete table throws a error when enterMode = CKEDITOR.ENTER_BR.
    • -
    • #4459 : [IE] Select element is penetrating the maximized editor in IE6.
    • -
    • #5559 : [IE] The first call to setData is affected by iframe cache when loading the wysiwyg mode.
    • -
    • #5567 : [IE] Remove inline styles in some case doesn't join identical siblings.
    • -
    • #5450 : [FireFox] Press ENTER on 'replace' button result wrong.
    • -
    • #5121 : Recognizes the <br /> tag as a separator when apply block styles and enterMode = CKEDITOR.ENTER_BR.
    • -
    • #5575 : CKEDITOR.replaceAll should consider all kind of white spaces between class names.
    • -
    • #5582 : Prevent the default behavior when click the 'x' button to close dialog box.
    • -
    • #5584 : ENTER key with forceEnterMode turns on doesn't inherit current block attributes.
    • -
    • #4797 : [Opera] Press ENTER key in dialog fields to close throws JavaScript error.
    • -
    • #5578 : Add flash fake element align property when switch mode (source to wysiwyg).
    • -
    • #5577 : Update delete column behavior when choose multiple cells in the same column.
    • -
    • #5512 : Open context menu with SHIFT+F10 doesn't get correct editor selection.
    • -
    • #5433 : English protocol text directions in Link dialog are not incorrect in 'rtl' UI languages.
    • -
    • #5553 : Paste dialog clipboard area text direction is incorrect for 'rtl' content languages.
    • -
    • #4734 : Font size resets when font name is changed in an empty numbered list.
    • -
    • #5237 : English text in dialogs' title is flipped when using RTL language.
    • -
    • #3257 : Create list doesn't keep blocks as headings.
    • -
    • #5111 : [Firefox] JAWS doesn't respect PC cursor mode (application role) on toolbar.
    • -
    • #5530 : Page break for printing can't be removed with undo.
    • -
    • #5381 : Unable to place cursor between two paragraphs in body.
    • -
    • #5568 : [IE6/7] Selecting a entire table cell changes the original range.
    • -
    • #5623 : [Firefox] Apply style that edges another inline style result incorrect.
    • -
    • #5586 : [Firefox] Maximize the second editor ruins full screen mode.
    • -
    • #5617 : HTML filter system does not allow two 'text' filter rules.
    • -
    • #5663 : General memory clean up after destroying last instance.
    • -
    • #5461 : [IE] Fix Paste from Word dialog doesn't accept imput problem.
    • -
    • #5676 : Make color buttons use RRGGBB instead of RGB for better compatibility with IE.
    • -
    • #4948 : [Safari] Select the first/last cell of table to open context menu may lead to undetected table.
    • -
    • #5591 : [Firefox] Select a list item makes selected element broken.
    • -
    • #5667 : Pasting in a RTL page content causes shows up the horizontal scrollbar.
    • -
    • #5688 : Duplicate ids are used in dialog definition.
    • -
    • #5719 : [IE] 'change' dialog event should not be triggered when dialog is already closed.
    • -
    • #5747 : [IE] Error thrown when IE input field editing mode is turned on.
    • -
    • #5516 : IE8: Toolbar buttons have higher bottom padding.
    • -
    • #5402 : SHIFT-ENTER could now be used to exit from preformat block.
    • -
    • SCAYT plugin related:
        -
      • #4836 : Using SCAYT result in fragile elements when applying inline styles.
      • -
      • #5425 : [Opera] Disable SCAYT plugin for Opera browser.
      • -
      • #5632 : SCAYT word marker is not visible on text with background-color set.
      • -
      • #4125 : Remove Format command incorrectly removes SCAYT word markers.
      • -
      • #5671 : SCAYT bootstrap script could be added multiple times unnecessarily.
      • -
      • #5573 : SCAYT move cursor position after insert element into marked word text.
      • -
      • #5546 : SCAYT interferes with undo/redo commands.
      • -
      • #5570 : [IE] First enabling SCAYT blind cursor in editor.
      • -
      • #5741 : Enable SCAYT cause error in multiple editor instances.
      • -
      • #5744 : Remove editor with SCAYT enabled in source mode throws error.
      • -
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.2.1

    -

    - New features:

    -
      -
    • #4478 : Enable the SelectAll command in source mode.
    • -
    • #5150 : Allow names in the CKEDITOR.config.colorButton_colors setting.
    • -
    • #4810 : Adding configuration option for image dialog preview area filling text.
    • -
    • #536 : Object style now could be applied on any parent element of current selection.
    • -
    • #5290 : Unified stylesSet loading removing dependencies from the styles combo. - Now the configuration entry is named 'config.stylesSet' instead of config.stylesCombo_stylesSet and the default location - is under the 'styles' plugin instead of 'stylescombo'.
    • -
    • #5352 : Allow to define the stylesSet array in the config object for the editor.
    • -
    • #5302 : Adding config option "forceEnterMode".
    • -
    • #5216 : Extend CKEDITOR.appendTo to allow a data parameter for the initial value.
    • -
    • #5024 : Added sample to show how to output XHTML and avoid deprecated tags.
    • -
    -

    - Fixed issues:

    -
      -
    • #5152 : Indentation using class attribute doesn't work properly.
    • -
    • #4682 : It wasn't possible to edit block elements in IE that had styles like width, height or float.
    • -
    • #4750 : Correcting default order of buttons layout in dialogs on Mac.
    • -
    • #4932 : Fixed collapse button not clickable on simple toolbar.
    • -
    • #5228 : Link dialog is automatically changes protocol when URLs that starts with '?'.
    • -
    • #4877 : Fixed CKEditor displays source code in one long line (IE quirks mode + office2003 skin).
    • -
    • #5132 : Apply inline style leaks into sibling words which are seperated spaces.
    • -
    • #3599 : Background color style on sized text displayed as narrow band behind.
    • -
    • #4661 : Translation missing in link dialog.
    • -
    • #5240 : Flash alignment property is not presented visually on fake element.
    • -
    • #4910 : Pasting in IE scrolls document to the end.
    • -
    • #5041 : Table summary attribute can't be removed with dialog.
    • -
    • #5124 : All inline styles cannot be applied on empty spaces.
    • -
    • #3570 : SCAYT marker shouldn't appear inside elements path bar.
    • -
    • #4553 : Dirty check result incorrect when editor document is empty.
    • -
    • #4555 : Unreleased memory when editor is created and destroyed.
    • -
    • #5118 : Arrow keys navigation in RTL languages is incorrect.
    • -
    • #4721 : Remove attribute 'value' of checkbox in IE.
    • -
    • #5278 : IE: Add validation to check for bad window names of popup window.
    • -
    • #5171 : Dialogs contains lists don't have proper voice labels.
    • -
    • #4791 : Can't place cursor inside a form that end with a checkbox/radio.
    • -
    • #4479 : StylesCombo doesn't reflect the selection state until it's first opened.
    • -
    • #4717 : 'Unlink' and 'Outdent' command buttons should be disabled on editor startup.
    • -
    • #5119 : Disabled command buttons are not being properly styled when focused.
    • -
    • #5307 : Hide dialog page cause problem when there's two tab pages remain.
    • -
    • #5343 : Active list item ARIA role is wrongly placed.
    • -
    • #3599 : Background color style applying to text with font size style has been narrowly rendered.
    • -
    • #4711 : Line break character inside preformatted text makes it unable to type text at the end of previous line.
    • -
    • #4829 : [IE] Apply style from combo has wrong result on manually created selection.
    • -
    • #4830 : Retrieving selected element isn't always right, especially selecting using keyboard (SHIFT+ARROW).
    • -
    • #5128 : Element attribute inside preformatted text is corrupted when converting to other blocks.
    • -
    • #5190 : Template list entry shouldn't gain initial focus open templates list dialog opens.
    • -
    • #5238 : Menu button doesn't display arrow icon in high-contrast mode.
    • -
    • #3576 : Non-attributed element of the same name with the applied style is incorrectly removed.
    • -
    • #5221 : Insert table into empty document cause JavaScript error thrown.
    • -
    • #5242 : Apply 'automatic' color option of text color incorrectly removes background-color style.
    • -
    • #4719 : IE does not escape attribute values properly.
    • -
    • #5170 : Firefox does not insert text into styled element properly.
    • -
    • #4026 : Office2003 skin has no toolbar button borders in High Contrast in IE7.
    • -
    • #4348 : There should have exception thrown when 'CKEDITOR_BASEPATH' couldn't be figured out automatically.
    • -
    • #5364 : Focus may not be put into dialog correctly when dialog skin file is loading slow.
    • -
    • #4016 : Justify the layout of forms select dialog in Chrome and IE7.
    • -
    • #5373 : Variable 'pathBlockElements' defines wrong items in CKEDITOR.dom.elementPath.
    • -
    • #5082 : Ctrl key should be described as Cmd key on Mac.
    • -
    • #5182 : Context menu is not been announced correctly by ATs.
    • -
    • #4898 : Can't navigate outside table under the last paragraph of document.
    • -
    • #4950 : List commands could compromise list item attribute and styles.
    • -
    • #5018 : Find result highlighting remove normal font color styles unintentionally.
    • -
    • #5376 : Unable to exit list from within a empty block under list item.
    • -
    • #5145 : Various SCAYT fixes.
    • -
    • #5319 : Match whole word doesn't work anymore after replacement has happened.
    • -
    • #5363 : 'title' attribute now presents on all editor iframes.
    • -
    • #5374 : Unable to toggle inline style when the selection starts at the linefeed of the previous paragraph.
    • -
    • #4513 : Selected link element is not always correctly detected when using keyboard arrows to perform such selection.
    • -
    • #5372 : Newly created sub list should inherit nothing from the original (parent) list, except the list type.
    • -
    • #5274 : [IE6] Templates preview image is displayed in wrong size.
    • -
    • #5292 : Preview in font size and family doesn't work with custom styles.
    • -
    • #5396 : Selection is lost when use cell properties dialog to change cell type to header.
    • -
    • #4082 : [IE+Quirks] Preview text in the image dialog is not wrapping.
    • -
    • #4197 : Fixing format combo don't hide when editor blur on Safari.
    • -
    • #5401 : The context menu break layout with Office2003 and V2 skin on IE quirks mode.
    • -
    • #4825 : Fixing browser context menu is opened when clicking right mouse button twice.
    • -
    • #5356 : The SCAYT dialog had issues with Prototype enabled pages.
    • -
    • #5266 : SCAYT was disturbing the rendering of TH elements.
    • -
    • #4688 : SCAYT was interfering on checkDirty.
    • -
    • #5429 : High Contrast mode was being mistakenly detected when loading the editor through Dojo's xhrGet.
    • -
    • #5221 : Range is mangled when making collapsed selection in an empty paragraph.
    • -
    • #5261 : Config option 'scayt_autoStartup' slow down editor loading.
    • -
    • #3846 : Google Chrome - No Img properties after inserting.
    • -
    • #5465 : ShiftEnter=DIV doesn't respect list item when pressing ENTER at end of list item.
    • -
    • #5454 : After replaced success, the popup window couldn't be closed and a js error occured.
    • -
    • #4784 : Incorrect cursor position after delete table cells.
    • -
    • #5149 : [FF] Cursor disappears after maximize when the editor has focus.
    • -
    • #5220 : DTD now shows tolerance to <style> appear inside content.
    • -
    • #5440 : Mobile browsers (iPhone, Android...) are marked as incompatible as they don't support editing features.
    • -
    • #5504 : [IE6/7] 'Paste' dialog will always get opened even when user allows the clipboard access dialog when using 'Paste' button.
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.2

    -

    - New features:

    -
      -
    • Several accessibility enhancements:
        -
      • #4502 : The editor accessibility is now totally based on WAI-ARIA.
      • -
      • #5015 : Adding accessibility help dialog plugin.
      • -
      • #5014 : Keyboard navigation compliance with screen reader suggested keys.
      • -
      • #4595 : Better accessibility in the Templates dialog.
      • -
      • #3389 : Esc/Arrow Key now works for closing sub menu.
      • -
    • -
    • #4973 : The Style field in the Div Container dialog is now loading the styles defined in the default styleset used by the Styles toolbar combo.
    • -
    -

    - Fixed issues:

    -
      -
    • #5049 : Form Field list command in JAWS incorrectly lists extra fields.
    • -
    • #5008 : Lock/Unlock ratio buttons in the Image dialog was poorly designed in High Contrast mode.
    • -
    • #3980 : All labels in dialogs now use <label> instead of <div>.
    • -
    • #5213 : Reorganization of some entries in the language files to make it more consistent.
    • -
    • #5199 : In IE, single row toolbars didn't have the bottom padding.
    • -
    -

    - CKEditor 3.1.1

    -

    - New features:

    -
      -
    • #4399 : Improved support for external file browsers by allowing executing a callback function.
    • -
    • #4612 : The text of links is now updated if it matches the URL to which it points to.
    • -
    • #4936 : New localization support for the Welsh language.
    • -
    -

    - Fixed issues:

    -
      -
    • #4272 : Kama skin toolbar was broken in IE+Quirks+RTL.
    • -
    • #4987 : Changed the url which is called by the Browser Server button in the Link tab of Image Properties dialog.
    • -
    • #5030 : The CKEDITOR.timestamp wasn't been appended to the skin.js file.
    • -
    • #4993 : Removed the float style from images when the user selects 'not set' for alignment.
    • -
    • #4944 : Fixed a bug where nested list structures with inconsequent levels were not being pasted correctly from MS Word.
    • -
    • #4637 : Table cells' 'nowrap' attribute was not being loaded by the cell property dialog. Thanks to pomu0325.
    • -
    • #4724 : Using the mouse to insert a link in IE might create incorrect results.
    • -
    • #4640 : Small optimizations for the fileBrowser plugin.
    • -
    • #4583 : The "Target Frame Name" field is now visible when target is set to 'frame' only.
    • -
    • #4863 : Fixing iframedialog's height doesn't stretch to 100% (except IE Quirks).
    • -
    • #4964 : The BACKSPACE key positioning was not correct in some cases with Firefox.
    • -
    • #4980 : Setting border, vspace and hspace of images to zero was not working.
    • -
    • #4773 : The fileBrowser plugin was overwriting onClick functions eventually defined on fileButton elements.
    • -
    • #4731 : The clipboard plugin was missing a reference to the dialog plugin.
    • -
    • #5051 : The about plugin was missing a reference to the dialog plugin.
    • -
    • #5146 : The wsc plugin was missing a reference to the dialog plugin.
    • -
    • #4632 : The print command will now properly break on the insertion point of page break for printing.
    • -
    • #4862 : The English (United Kingdom) language file has been renamed to en-gb.js.
    • -
    • #4618 : Selecting an emoticon or the lock and reset buttons in the image dialog fired the onBeforeUnload event in IE.
    • -
    • #4678 : It was not possible to set tables' width to empty value.
    • -
    • #5012 : Fixed dependency issues with the menu plugin.
    • -
    • #5040 : The editor will not properly ignore font related settings that have extra item separators (semi-colons).
    • -
    • #4046 : Justify should respect config.enterMode = CKEDITOR.ENTER_BR.
    • -
    • #4622 : Inserting tables multiple times was corrupting the undo system.
    • -
    • #4647 : [IE] Selection on an element within positioned container is lost after open context-menu then click one menu item.
    • -
    • #4683 : Double-quote character in attribute values was not escaped in the editor output.
    • -
    • #4762 : [IE] Unexpected vertical-scrolling behavior happens whenever focus is moving out of editor in source mode.
    • -
    • #4772 : Text color was not being applied properly on links.
    • -
    • #4795 : [IE] Press 'Del' key on horizontal line or table result in error.
    • -
    • #4824 : [IE] <br/> at the very first table cell breaks the editor selection.
    • -
    • #4851 : [IE] Delete table rows with context-menu may cause error.
    • -
    • #4951 : Replacing text with empty string was throwing errors.
    • -
    • #4963 : Link dialog was not opening properly for e-mail type links.
    • -
    • #5043 : Removed the possibility of having an unwanted script tag being outputted with the editor contents.
    • -
    • #3678 : There were issues when editing links inside floating divs with IE.
    • -
    • #4763 : Pressing ENTER key with text selected was not deleting the text in some situations.
    • -
    • #5096 : Simple ampersand attribute value doesn't work for more than one occurrence.
    • -
    • #3494 : Context menu is too narrow in some translations.
    • -
    • #5005 : Fixed HTML errors in PHP samples.
    • -
    • #5123 : Fixed broken XHTML in User Interface Languages sample.
    • -
    • #4893 : Editor now understands table cell inline styles.
    • -
    • #4611 : Selection around <select> in editor doesn't cause error anymore.
    • -
    • #4886 : Extra BR tags were being created in the output HTML.
    • -
    • #4933 : Empty tags with BR were being left in the DOM.
    • -
    • #5127 : There were errors when removing dialog definition pages through code.
    • -
    • #4767 : CKEditor was not working when ckeditor_source.js is loaded in the <body> .
    • -
    • #5062 : Avoided security warning message when loading the wysiwyg area in IE6 under HTTPS.
    • -
    • #5135 : The TAB key will now behave properly when in Source mode.
    • -
    • #4988 : It wasn't possible to use forcePasteAsPlainText with Safari on Mac.
    • -
    • #5095 : Safari on Mac deleted the current selection in the editor when Edit menu was clicked.
    • -
    • #5140 : In High Contrast mode, arrows were now been displayed for menus with submenus.
    • -
    • #5163 : The undo system was not working on some specific cases.
    • -
    • #5162 : The ajax sample was throwing errors when loading data.
    • -
    • #4999 : The Template dialog was not generating an undo snapshot.
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.1

    -

    - New features:

    -
      -
    • #4067 : Introduced the full page editing support (from <html> to </html>).
    • -
    • #4228 : Introduced the Shared Spaces feature.
    • -
    • #4379 : Introduced the new powerful pasting system and word cleanup procedure, including enhancements to the paste as plain text feature.
    • -
    • #2872 : Introduced the new native PHP API, the first standardized server side support.
    • -
    • #4210 : Added CKEditor plugin for jQuery.
    • -
    • #2885 : Added 'div' dialog and corresponding context menu options.
    • -
    • #4574 : Added the table merging tools and corresponding context menu options.
    • -
    • #4340 : Added the email protection option for link dialog.
    • -
    • #4463 : Added inline CSS support in all places where custom stylesheet could apply.
    • -
    • #3881 : Added color dialog for 'more color' option in color buttons.
    • -
    • #4341 : Added the 'showborder' plugin.
    • -
    • #4549 : Make the anti-cache query string configurable.
    • -
    • #4708 : Added the 'htmlEncodeOutput' config option.
    • -
    • #4342 : Introduced the bodyId and bodyClass settings to specify the id and class. to be used in the editing area at runtime.
    • -
    • #3401 : Introduced the baseHref setting so it's possible to set the URL to be used to resolve absolute and relative URLs in the contents.
    • -
    • #4729 : Added support to fake elements for comments.
    • -
    -

    - Fixed issues:

    -
      -
    • #4707 : Fixed invalid link is requested in image preview.
    • -
    • #4461 : Fixed toolbar separator line along side combo enlarging the toolbar height.
    • -
    • #4596 : Fixed image re-size lock buttons aren't accessible in high-contrast mode.
    • -
    • #4676 : Fixed editing tables using table properties dialog overwrites original style values.
    • -
    • #4714 : Fixed IE6 JavaScript error when editing flash by commit 'Flash' dialog.
    • -
    • #3905 : Fixed 'wysiwyg' mode causes unauthenticated content warnings over SSL in FF 3.5.
    • -
    • #4768 : Fixed open context menu in IE throws js error when focus is not inside document.
    • -
    • #4822 : Fixed applying 'Headers' to existing table does not work in IE.
    • -
    • #4855 : Fixed toolbar doesn't wrap well for 'v2' skin in all browsers.
    • -
    • #4882 : Fixed auto detect paste from MS-Word is not working for Safari.
    • -
    • #4882 : Fixed unexpected margin style left behind on content cleaning up from MS-Word.
    • -
    • #4896 : Fixed paste nested list from MS-Word with measurement units set to cm is broken.
    • -
    • #4899 : Fixed unable to undo pre-formatted style.
    • -
    • #4900 : Fixed ratio-lock inconsistent between browsers.
    • -
    • #4901 : Fixed unable to edit any link with popup window's features in Firefox.
    • -
    • #4904 : Fixed when paste happen from dialog, it always throw JavaScript error.
    • -
    • #4905 : Fixed paste plain text result incorrect when content from dialog.
    • -
    • #4889 : Fixed unable to undo 'New Page' command after typing inside editor.
    • -
    • #4892 : Fixed table alignment style is not properly represented by the wrapping div.
    • -
    • #4918 : Fixed switching mode when maximized is showing background page contents.
    • -
    -

    - CKEditor 3.0.2

    -

    - New features:

    -
      -
    • #4343 : Added the configuration option 'browserContextMenuOnCtrl' so it's possible to enable the default browser context menu by holding the CTRL key.
    • -
    -

    - Fixed issues:

    -
      -
    • #4552 : Fixed float panel doesn't show up since editor instanced been destroyed once.
    • -
    • #3918 : Fixed fake object is editable with Image dialog.
    • -
    • #4053 : Fixed 'Form Properties' missing from context menu when selection collapsed inside form.
    • -
    • #4401 : Fixed customized by removing 'upload' tab page from 'Link dialog' cause JavaScript error.
    • -
    • #4477 : Adding missing tag names in object style elements.
    • -
    • #4567 : Fixed IE throw error when pressing BACKSPACE in source mode.
    • -
    • #4573 : Fixed 'IgnoreEmptyPargraph' config doesn't work with the config 'entities' is set to 'false'.
    • -
    • #4614 : Fixed attribute protection fails because of line-break.
    • -
    • #4546 : Fixed UIColor plugin doesn't work when editor id contains CSS selector preserved keywords.
    • -
    • #4609 : Fixed flash object is lost when loading data from outside editor.
    • -
    • #4625 : Fixed editor stays visible in a div with style 'visibility:hidden'.
    • -
    • #4621 : Fixed clicking below table caused an empty table been generated.
    • -
    • #3373 : Fixed empty context menu when there's no menu item at all.
    • -
    • #4473 : Fixed setting rules on the same element tag name throws error.
    • -
    • #4514 : Fixed press 'Back' button breaks wysiwyg editing mode is Firefox.
    • -
    • #4542 : Fixed unable to access buttons using tab key in Safari and Opera.
    • -
    • #4577 : Fixed relative link url is broken after opening 'Link' dialog.
    • -
    • #4597 : Fixed custom style with same attribute name but different attribute value doesn't work.
    • -
    • #4651 : Fixed 'Deleted' and 'Inserted' text style is not rendering in wysiwyg mode and is wrong is source mode.
    • -
    • #4654 : Fixed 'CKEDITOR.config.font_defaultLabel(fontSize_defaultLabel)' is not working.
    • -
    • #3950 : Fixed table column insertion incorrect when selecting empty cell area.
    • -
    • #3912 : Fixed UIColor not working in IE when page has more than 30+ editors.
    • -
    • #4031 : Fixed mouse cursor on toolbar combo has more than 3 shapes.
    • -
    • #4041 : Fixed open context menu on multiple cells to remove them result in only one removed.
    • -
    • #4185 : Fixed resize handler effect doesn't affect flash object on output.
    • -
    • #4196 : Fixed 'Remove Numbered/Bulleted List' on nested list doesn't work well on nested list.
    • -
    • #4200 : Fixed unable to insert 'password' type filed with attributes.
    • -
    • #4530 : Fixed context menu couldn't open in Opera.
    • -
    • #4536 : Fixed keyboard navigation doesn't work at all in IE quirks mode.
    • -
    • #4584 : Fixed updated link Target field is not updating when updating to certain values.
    • -
    • #4603 : Fixed unable to disable submenu items in contextmenu.
    • -
    • #4672 : Fixed unable to redo the insertion of horizontal line.
    • -
    • #4677 : Fixed 'Tab' key is trapped by hidden dialog elements.
    • -
    • #4073 : Fixed insert template with replace option could result in empty document.
    • -
    • #4455 : Fixed unable to start editing when image inside document not loaded.
    • -
    • #4517 : Fixed 'dialog_backgroundCoverColor' doesn't work on IE6.
    • -
    • #3165 : Fixed enter key in empty list item before nested one result in collapsed line.
    • -
    • #4527 : Fixed checkbox generate invalid 'checked' attribute.
    • -
    • #1659 : Fixed unable to click below content to start editing in IE with 'config.docType' setting to standard compliant.
    • -
    • #3933 : Fixed extra <br> left at the end of document when the last element is a table.
    • -
    • #4736 : Fixed PAGE UP and PAGE DOWN keys in standards mode are not working.
    • -
    • #4725 : Fixed hitting 'enter' before html comment node produces a JavaScript error.
    • -
    • #4522 : Fixed unable to redo when typing after insert an image with relative url.
    • -
    • #4594 : Fixed context menu goes off-screen when mouse is at right had side of screen.
    • -
    • #4673 : Fixed undo not available straight away if shift key is used to enter first character.
    • -
    • #4690 : Fixed the parsing of nested inline elements.
    • -
    • #4450 : Fixed selecting multiple table cells before apply justify commands generates spurious paragraph in Firefox.
    • -
    • #4733 : Fixed dialog opening sometimes hang up Firefox and Safari.
    • -
    • #4498 : Fixed toolbar collapse button missing tooltip.
    • -
    • #4738 : Fixed inserting table inside bold/italic/underline generates error on ENTER_BR mode.
    • -
    • #4246 : Fixed avoid XHTML deprecated attributes for image styling.
    • -
    • #4543 : Fixed unable to move cursor between table and hr.
    • -
    • #4764 : Fixed wrong exception message when CKEDITOR.editor.append() to non-existing elements.
    • -
    • #4521 : Fixed dialog layout in IE6/7 may have scroll-bar and other weird effects.
    • -
    • #4709 : Fixed inconsistent scroll-bar behavior on IE.
    • -
    • #4776 : Fixed preview page failed to open when relative URl contains in document.
    • -
    • #4812 : Fixed 'Esc' key not working on dialogs in Opera.
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.0.1

    -

    - New features:

    -
      -
    • #4219 : Added fallback mechanism for config.language.
    • -
    • #4194 : Added support for using multiple css style sheets within the editor.
    • -
    -

    - Fixed issues:

    -
      -
    • #3898 : Added validation for URL value in Image dialog.
    • -
    • #3528 : Fixed Context Menu issue when triggered using Shift+F10.
    • -
    • #4028 : Maximize control's tool tip was wrong once it is maximized.
    • -
    • #4237 : Toolbar is chopped off in Safari browser 3.x.
    • -
    • #4241 : Float panels are left on screen while editor is destroyed.
    • -
    • #4274 : Double click event is incorrect handled in 'divreplace' sample.
    • -
    • #4354 : Fixed TAB key on toolbar to not focus disabled buttons.
    • -
    • #3856 : Fixed focus and blur events in source view mode.
    • -
    • #3438 : Floating panels are off by (-1px, 0px) in RTL mode.
    • -
    • #3370 : Refactored use of CKEDITOR.env.isCustomDomain().
    • -
    • #4230 : HC detection caused js error.
    • -
    • #3978 : Fixed setStyle float on IE7 strict.
    • -
    • #4262 : Tab and Shift+Tab was not working to cycle through CTRL+SHIFT+F10 context menu in IE.
    • -
    • #3633 : Default context menu isn't disabled in toolbar, status bar, panels...
    • -
    • #3897 : Now there is no image previews when the URL is empty in image dialog.
    • -
    • #4048 : Context submenu was lacking uiColor.
    • -
    • #3568 : Dialogs now select all text when tabbing to text inputs.
    • -
    • #3727 : Cell Properties dialog was missing color selection option.
    • -
    • #3517 : Fixed "Match cyclic" field in Find & Replace dialog.
    • -
    • #4368 : borderColor table cell attribute haven't worked for none-IE
    • -
    • #4203 : In IE quirks mode + toolbar collapsed + source mode editing block height was incorrect.
    • -
    • #4387 : Fixed: right clicking in Kama skin can lead to a javascript error.
    • -
    • #4397 : Wysiwyg mode caused the host page scroll.
    • -
    • #4385 : Fixed editor's auto adjusting on DOM structure were confusing the dirty checking mechanism.
    • -
    • #4397 : Fixed regression of [3816] where turn on design mode was causing Firefox3 to scroll the host page.
    • -
    • #4254 : Added basic API sample.
    • -
    • #4107 : Normalize css font-family style text for correct comparision.
    • -
    • #3664 : Insert block element in empty editor document should not create new paragraph.
    • -
    • #4037 : 'id' attribute is missing with Flash dialog advanced page.
    • -
    • #4047 : Delete selected control type element when 'Backspace' is pressed on it.
    • -
    • #4191 : Fixed: dialog changes confirmation on image dialog appeared even when no changes have been made.
    • -
    • #4351 : Dash and dot could appear in attribute names.
    • -
    • #4355 : 'maximize' and 'showblock' commands shouldn't take editor focus.
    • -
    • #4504 : Fixed 'Enter'/'Esc' key is not working on dialog button.
    • -
    • #4245 : 'Strange Template' now come with a style attribute for width.
    • -
    • #4512 : Fixed styles plugin incorrectly adding semicolons to style text.
    • -
    • #3855 : Fixed loading unminified _source files when ckeditor_source.js is used.
    • -
    • #3717 : Dialog settings defaults can now be overridden in-page through the CKEDITOR.config object.
    • -
    • #4481 : The 'stylesCombo_stylesSet' configuration entry didn't work for full URLs.
    • -
    • #4480 : Fixed scope attribute in th.
    • -
    • #4467 : Fixed bug to use custom icon in context menus. Thanks to george.
    • -
    • #4190 : Fixed select field dialog layout in Safari.
    • -
    • #4518 : Fixed unable to open dialog without editor focus in IE.
    • -
    • #4519 : Fixed maximize without editor focus throw error in IE.
    • -
    • Updated the following language files:
    • -
    -

    - CKEditor 3.0

    -

    - New features:

    -
      -
    • #3188 : Introduce - <pre> formatting feature when converting from other blocks.
    • -
    • #4445 : editor::setData now support an optional callback parameter.
    • -
    -

    - Fixed issues:

    -
      -
    • #2856 : Fixed problem with inches in Paste From Word plugin.
    • -
    • #3929 : Using Paste dialog, - the text is pasted into current selection
    • -
    • #3920 : Mouse cursor over characters in - Special Character dialog now is correct
    • -
    • #3882 : Fixed an issue - with PasteFromWord dialog in which default values was ignored
    • -
    • #3859 : Fixed Flash dialog layout in Webkit
    • -
    • #3852 : Disabled textarea resizing in dialogs
    • -
    • #3831 : The attempt to remove the contextmenu plugin - will not anymore break the editor
    • -
    • #3781 : Colorbutton is now disabled in 'source' mode
    • -
    • #3848 : Fixed an issue with Webkit in witch - elements in the Image and Link dialogs had wrong dimensions.
    • -
    • #3808 : Fixed UI Color Picker dialog size in example page.
    • -
    • #3658 : Editor had horizontal scrollbar in IE6.
    • -
    • #3819 : The cursor was not visible - when applying style to collapsed selections in Firefox 2.
    • -
    • #3809 : Fixed beam cursor - when mouse cursor is over text-only buttons in IE.
    • -
    • #3815 : Fixed an issue - with the form dialog in which the "enctype" attribute is outputted as "encoding".
    • -
    • #3785 : Fixed an issue - in CKEDITOR.tools.htmlEncode() which incorrectly outputs &nbsp; in IE8.
    • -
    • #3820 : Fixed an issue in - bullet list command in which a list created at the bottom of another gets merged to the top. -
    • -
    • #3830 : Table cell properties dialog - doesn't apply to all selected cells.
    • -
    • #3835 : Element path is not refreshed - after click on 'newpage'; and safari is not putting focus on document also. -
    • -
    • #3821 : Fixed an issue with JAWS in which - toolbar items are read inconsistently between virtual cursor modes.
    • -
    • #3789 : The "src" attribute - was getting duplicated in some situations.
    • -
    • #3591 : Protecting flash related elements - including '<object>', '<embed>' and '<param>'. -
    • -
    • #3759 : Fixed CKEDITOR.dom.element::scrollIntoView - logic bug which scroll even element is inside viewport. -
    • -
    • #3773 : Fixed remove list will merge lines. -
    • -
    • #3829 : Fixed remove empty link on output data.
    • -
    • #3730 : Indent is performing on the whole - block instead of selected lines in enterMode = BR.
    • -
    • #3844 : Fixed UndoManager register keydown on obsoleted document
    • -
    • #3805 : Enabled SCAYT plugin for IE.
    • -
    • #3834 : Context menu on table caption was incorrect.
    • -
    • #3812 : Fixed an issue in which the editor - may show up empty or uneditable in IE7, 8 and Firefox 3.
    • -
    • #3825 : Fixed JS error when opening spellingcheck.
    • -
    • #3862 : Fixed html parser infinite loop on certain malformed - source code.
    • -
    • #3639 : Button size was inconsistent.
    • -
    • #3874 : Paste as plain text in Safari loosing lines.
    • -
    • #3849 : Fixed IE8 crashes when applying lists and indenting.
    • -
    • #3876 : Changed dialog checkbox and radio labels to explicit labels.
    • -
    • #3843 : Fixed context submenu position in IE 6 & 7 RTL.
    • -
    • #3864 : [FF]Document is not editable after inserting element on a fresh page.
    • -
    • #3883 : Fixed removing inline style logic incorrect on Firefox2.
    • -
    • #3884 : Empty "href" attribute was duplicated on output data.
    • -
    • #3858 : Fixed the issue where toolbars - break up in IE6 and IE7 after the browser is resized.
    • -
    • #3868 : [chrome] SCAYT toolbar options was in reversed order.
    • -
    • #3875 : Fixed an issue in Safari where - table row/column/cell menus are not useable when table cells are selected.
    • -
    • #3896 : The editing area was - flashing when switching forth and back to source view.
    • -
    • #3894 : Fixed an issue where editor failed to initialize when using the on-demand loading way.
    • -
    • #3903 : Color button plugin doesn't read config entry from editor instance correctly.
    • -
    • #3801 : Comments at the start of the document was lost in IE.
    • -
    • #3871 : Unable to redo when undos to the front of snapshots stack.
    • -
    • #3909 : Move focus from editor into a text input control is broken.
    • -
    • #3870 : The empty paragraph - desappears when hitting ENTER after "New Page".
    • -
    • #3887 : Fixed an issue in which the create - list command may leak outside of a selected table cell and into the rest of document.
    • -
    • #3916 : Fixed maximize does not enlarge editor width when width is set.
    • -
    • #3879 : [webkit] Color button panel had incorrect size on first open.
    • -
    • #3839 : Update Scayt plugin to reflect the latest change from SpellChecker.net.
    • -
    • #3742 : Fixed wrong dialog layout for dialogs without tab bar in IE RTL mode .
    • -
    • #3671 : Fixed body fixing should be applied to the real type under fake elements.
    • -
    • #3836 : Fixed remove list in enterMode=BR will merge sibling text to one line.
    • -
    • #3949 : Fixed enterKey within pre-formatted text introduce wrong line-break.
    • -
    • #3878 : Whenever possible, - dialogs will not present scrollbars if the content is too big for its standard - size.
    • -
    • #3782 : Remove empty list in table cell result in collapsed cell.
    • -
    • Updated the following language files:
    • -
    • #3984 : [IE]The pre-formatted style is generating error.
    • -
    • #3946 : Fixed unable to hide contextmenu.
    • -
    • #3956 : Fixed About dialog in Source Mode for IE.
    • -
    • #3953 : Fixed keystroke for close Paste dialog.
    • -
    • #3951 : Reset size and lock ratio options were not accessible in Image dialog.
    • -
    • #3921 : Fixed Container scroll issue on IE7.
    • -
    • #3940 : Fixed list operation doesn't stop at table.
    • -
    • #3891 : [IE] Fixed 'automatic' font color doesn't work.
    • -
    • #3972 : Fixed unable to remove a single empty list in document in Firefox with enterMode=BR.
    • -
    • #3973 : Fixed list creation error at the end of document.
    • -
    • #3959 : Pasting styled text from word result in content lost.
    • -
    • #3793 : Combined images into sprites.
    • -
    • #3783 : Fixed indenting command in table cells create collapsed paragraph.
    • -
    • #3968 : About dialog layout was broken with IE+Standards+RTL.
    • -
    • #3991 : In IE quirks, text was not visible in v2 and office2003 skins.
    • -
    • #3983 : In IE, we'll now - silently ignore wrong toolbar definition settings which have extra commas being - left around.
    • -
    • Fixed the following test cases:
        -
      • #3992 : core/ckeditor2.html
      • -
      • #4138 : core/plugins.html
      • -
      • #3801 : plugins/htmldataprocessor/htmldataprocessor.html
      • -
    • -
    • #3989 : Host page horizontal scrolling a lot when on having righ-to-left direction.
    • -
    • #4001 : Create link around existing image result incorrect.
    • -
    • #3988 : Destroy editor on form submit event cause error.
    • -
    • #3994 : Insert horizontal line at end of document cause error.
    • -
    • #4074 : Indent error with 'indentClasses' config specified.
    • -
    • #4057 : Fixed anchor is lost after switch between editing modes.
    • -
    • #3644 : Image dialog was missin radio lock.
    • -
    • #4014 : Firefox2 had no dialog button backgrounds.
    • -
    • #4018 : Firefox2 had no richcombo text visible.
    • -
    • #4035 : [IE6] Paste dialog size was too small.
    • -
    • #4049 : Kama skin was too wide with config.width.
    • -
    • The following released files now doesn't require the _source folder
        -
      • #4086 : _samples/ui_languages.html
      • -
      • #4093 : _tests/core/dom/document.html
      • -
      • #4094 : Smiley plugin file
      • -
      • #4097 : No undo/redo support for fontColor and backgroundColor buttons.
      • -
    • -
    • #4085 : Paste and Paste from Word dialogs were not well styled in IE+RTL.
    • -
    • #3982 : Fixed enterKey on empty list item result in weird dom structure.
    • -
    • #4101 : Now it is possible to close dialog before gets focus.
    • -
    • #4075 : [IE6/7]Fixed apply custom inline style with "class" attribute failed.
    • -
    • #4087 : [Firefox]Fixed extra blocks created on create list when full document selected.
    • -
    • #4097 : No undo/redo support for fontColor and backgroundColor buttons.
    • -
    • #4111 : Fixed apply block style after inline style applied on full document error.
    • -
    • #3622 : Fixed shift enter with selection not deleting highlighted text.
    • -
    • #4092 : [IE6] Close button was missing for dialog without multiple tabs.
    • -
    • #4003 : Markup on the image dialog was disrupted when removing the border input.
    • -
    • #4096 : Editor content area was pushed down in IE RTL quirks.
    • -
    • #4112 : [FF] Paste dialog had scrollbars in quirks.
    • -
    • #4118 : Dialog dragging was - occasionally behaving strangely .
    • -
    • #4077 : The toolbar combos - were rendering incorrectly in some languages, like Chinese.
    • -
    • #3622 : The toolbar in the v2 - skin was wrapping improperly in some languages.
    • -
    • #4119 : Unable to edit image link with image dialog.
    • -
    • #4117 : Fixed dialog error when transforming image into button.
    • -
    • #4058 : [FF] wysiwyg mode is sometimes not been activated.
    • -
    • #4114 : [IE] RTE + IE6/IE7 Quirks = dialog mispositoned.
    • -
    • #4123 : Some dialog buttons were broken in IE7 quirks.
    • -
    • #4122 : [IE] The image dialog - was being rendered improperly when loading an image with long URL.
    • -
    • #4144 : Fixed the white-spaces at the end of <pre> is incorrectly removed.
    • -
    • #4143 : Fixed element id is lost when extracting contents from the range.
    • -
    • #4007 : [IE] Source area overflow from editor chrome.
    • -
    • #4145 : Fixed the on demand - ("basic") loading model of the editor.
    • -
    • #4139 : Fixed list plugin regression of [3903].
    • -
    • #4147 : Unify style text normalization logic when comparing styles.
    • -
    • #4150 : Fixed enlarge list result incorrect at the inner boundary of block.
    • -
    • #4164 : Now it is possible to paste text - in Source mode even if forcePasteAsPlainText = true.
    • -
    • #4129 : [FF]Unable to remove list with Ctrl-A.
    • -
    • #4172 : [Safari] The trailing - <br> was not been always added to blank lines ending with &nbsp;.
    • -
    • #4178 : It's now possible to - copy and paste Flash content among different editor instances.
    • -
    • #4193 : Automatic font color produced empty span on Firefox 3.5.
    • -
    • #4186 : [FF] Fixed First open float panel cause host page scrollbar blinking.
    • -
    • #4227 : Fixed destroy editor instance created on textarea which is not within form cause error.
    • -
    • #4240 : Fixed editor name containing hyphen break editor completely.
    • -
    • #3828 : Malformed nested list is now corrected by the parser.
    • -
    -

    - CKEditor 3.0 RC

    -

    - Changelog starts at this release.

    - - - diff --git a/include/limesurvey/admin/scripts/ckeditor.36/INSTALL.html b/include/limesurvey/admin/scripts/ckeditor.36/INSTALL.html deleted file mode 100644 index 565ed261..00000000 --- a/include/limesurvey/admin/scripts/ckeditor.36/INSTALL.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - Installation Guide - CKEditor - - - - -

    - CKEditor Installation Guide

    -

    - What's CKEditor?

    -

    - CKEditor is a text editor to be used inside web pages. It's not a replacement - for desktop text editors like Word or OpenOffice, but a component to be used as - part of web applications and web sites.

    -

    - Installation

    -

    - Installing CKEditor is an easy task. Just follow these simple steps:

    -
      -
    1. Download the latest version of the editor from our web site: http://ckeditor.com. You should have already completed - this step, but be sure you have the very latest version.
    2. -
    3. Extract (decompress) the downloaded file into the root of your - web site.
    4. -
    -

    - Note: CKEditor is by default installed in the "ckeditor" - folder. You can place the files in whichever you want though.

    -

    - Checking Your Installation -

    -

    - The editor comes with a few sample pages that can be used to verify that installation - proceeded properly. Take a look at the _samples directory.

    -

    - To test your installation, just call the following page at your web site:

    -
    -http://<your site>/<CKEditor installation path>/_samples/index.html
    -
    -For example:
    -http://www.example.com/ckeditor/_samples/index.html
    -

    - Documentation

    -

    - The full editor documentation is available online at the following address:
    - http://docs.cksource.com/ckeditor

    - - - diff --git a/include/limesurvey/admin/scripts/ckeditor.36/LICENSE.html b/include/limesurvey/admin/scripts/ckeditor.36/LICENSE.html deleted file mode 100644 index 0529c9f4..00000000 --- a/include/limesurvey/admin/scripts/ckeditor.36/LICENSE.html +++ /dev/null @@ -1,1334 +0,0 @@ - - - - - License - CKEditor - - -

    - Software License Agreement -

    -

    - CKEditor™ - The text editor for Internet™ - - http://ckeditor.com
    - Copyright © 2003-2011, CKSource - Frederico Knabben. All rights reserved. -

    -

    - Licensed under the terms of any of the following licenses at your choice: -

    - -

    - You are not required to, but if you want to explicitly declare the license you have - chosen to be bound to when using, reproducing, modifying and distributing this software, - just include a text file titled "LEGAL" in your version of this software, indicating - your license choice. In any case, your choice will not restrict any recipient of - your version of this software to use, reproduce, modify and distribute this software - under any of the above licenses. -

    -

    - Sources of Intellectual Property Included in CKEditor -

    -

    - Where not otherwise indicated, all CKEditor content is authored by CKSource engineers - and consists of CKSource-owned intellectual property. In some specific instances, - CKEditor will incorporate work done by developers outside of CKSource with their - express permission. -

    -

    - YUI Test: At _source/tests/yuitest.js - can be found part of the source code of YUI, which is licensed under the terms of - the BSD License. YUI is - Copyright © 2008, Yahoo! Inc. -

    -

    - Trademarks -

    -

    - CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product - names are trademarks, registered trademarks or service marks of their respective - holders. -

    - - diff --git a/include/limesurvey/admin/scripts/ckeditor.36/adapters/jquery.js b/include/limesurvey/admin/scripts/ckeditor.36/adapters/jquery.js deleted file mode 100644 index 5f13c756..00000000 --- a/include/limesurvey/admin/scripts/ckeditor.36/adapters/jquery.js +++ /dev/null @@ -1,6 +0,0 @@ -/* -Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.html or http://ckeditor.com/license -*/ - -(function(){CKEDITOR.config.jqueryOverrideVal=typeof CKEDITOR.config.jqueryOverrideVal=='undefined'?true:CKEDITOR.config.jqueryOverrideVal;var a=window.jQuery;if(typeof a=='undefined')return;a.extend(a.fn,{ckeditorGet:function(){var b=this.eq(0).data('ckeditorInstance');if(!b)throw 'CKEditor not yet initialized, use ckeditor() with callback.';return b;},ckeditor:function(b,c){if(!CKEDITOR.env.isCompatible)return this;if(!a.isFunction(b)){var d=c;c=b;b=d;}c=c||{};this.filter('textarea, div, p').each(function(){var e=a(this),f=e.data('ckeditorInstance'),g=e.data('_ckeditorInstanceLock'),h=this;if(f&&!g){if(b)b.apply(f,[this]);}else if(!g){if(c.autoUpdateElement||typeof c.autoUpdateElement=='undefined'&&CKEDITOR.config.autoUpdateElement)c.autoUpdateElementJquery=true;c.autoUpdateElement=false;e.data('_ckeditorInstanceLock',true);f=CKEDITOR.replace(h,c);e.data('ckeditorInstance',f);f.on('instanceReady',function(i){var j=i.editor;setTimeout(function(){if(!j.element){setTimeout(arguments.callee,100);return;}i.removeListener('instanceReady',this.callee);j.on('dataReady',function(){e.trigger('setData.ckeditor',[j]);});j.on('getData',function(l){e.trigger('getData.ckeditor',[j,l.data]);},999);j.on('destroy',function(){e.trigger('destroy.ckeditor',[j]);});if(j.config.autoUpdateElementJquery&&e.is('textarea')&&e.parents('form').length){var k=function(){e.ckeditor(function(){j.updateElement();});};e.parents('form').submit(k);e.parents('form').bind('form-pre-serialize',k);e.bind('destroy.ckeditor',function(){e.parents('form').unbind('submit',k);e.parents('form').unbind('form-pre-serialize',k);});}j.on('destroy',function(){e.data('ckeditorInstance',null);});e.data('_ckeditorInstanceLock',null);e.trigger('instanceReady.ckeditor',[j]);if(b)b.apply(j,[h]);},0);},null,null,9999);}else CKEDITOR.on('instanceReady',function(i){var j=i.editor;setTimeout(function(){if(!j.element){setTimeout(arguments.callee,100);return;}if(j.element.$==h)if(b)b.apply(j,[h]);},0);},null,null,9999);});return this;}});if(CKEDITOR.config.jqueryOverrideVal)a.fn.val=CKEDITOR.tools.override(a.fn.val,function(b){return function(c,d){var e=typeof c!='undefined',f;this.each(function(){var g=a(this),h=g.data('ckeditorInstance');if(!d&&g.is('textarea')&&h){if(e)h.setData(c);else{f=h.getData();return null;}}else if(e)b.call(g,c);else{f=b.call(g);return null;}return true;});return e?this:f;};});})(); diff --git a/include/limesurvey/admin/scripts/ckeditor.36/ckeditor.js b/include/limesurvey/admin/scripts/ckeditor.36/ckeditor.js deleted file mode 100644 index e73921b8..00000000 --- a/include/limesurvey/admin/scripts/ckeditor.36/ckeditor.js +++ /dev/null @@ -1,146 +0,0 @@ -/* -Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.html or http://ckeditor.com/license -*/ - -(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'B49E5BQ',version:'3.6',revision:'6902',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f=0?'&':'?')+'t='+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();var a=CKEDITOR;if(!a.event){a.event=function(){};a.event.implementOn=function(b){var c=a.event.prototype;for(var d in c){if(b[d]==undefined)b[d]=c[d];}};a.event.prototype=(function(){var b=function(d){var e=d.getPrivate&&d.getPrivate()||d._||(d._={});return e.events||(e.events={});},c=function(d){this.name=d;this.listeners=[];};c.prototype={getListenerIndex:function(d){for(var e=0,f=this.listeners;e=0;n--){if(k[n].priority<=h){k.splice(n+1,0,m);return;}}k.unshift(m);}},fire:(function(){var d=false,e=function(){d=true;},f=false,g=function(){f=true;};return function(h,i,j){var k=b(this)[h],l=d,m=f;d=f=false;if(k){var n=k.listeners;if(n.length){n=n.slice(0);for(var o=0;o=0)f.listeners.splice(g,1); -}},hasListeners:function(d){var e=b(this)[d];return e&&e.listeners.length>0;}};})();}if(!a.editor){a.ELEMENT_MODE_NONE=0;a.ELEMENT_MODE_REPLACE=1;a.ELEMENT_MODE_APPENDTO=2;a.editor=function(b,c,d,e){var f=this;f._={instanceConfig:b,element:c,data:e};f.elementMode=d||0;a.event.call(f);f._init();};a.editor.replace=function(b,c){var d=b;if(typeof d!='object'){d=document.getElementById(b);if(d&&d.tagName.toLowerCase() in {style:1,script:1,base:1,link:1,meta:1,title:1})d=null;if(!d){var e=0,f=document.getElementsByName(b);while((d=f[e++])&&d.tagName.toLowerCase()!='textarea'){}}if(!d)throw '[CKEDITOR.editor.replace] The element with id or name "'+b+'" was not found.';}d.style.visibility='hidden';return new a.editor(c,d,1);};a.editor.appendTo=function(b,c,d){var e=b;if(typeof e!='object'){e=document.getElementById(b);if(!e)throw '[CKEDITOR.editor.appendTo] The element with id "'+b+'" was not found.';}return new a.editor(c,e,2,d);};a.editor.prototype={_init:function(){var b=a.editor._pending||(a.editor._pending=[]);b.push(this);},fire:function(b,c){return a.event.prototype.fire.call(this,b,c,this);},fireOnce:function(b,c){return a.event.prototype.fireOnce.call(this,b,c,this);}};a.event.implementOn(a.editor.prototype,true);}if(!a.env)a.env=(function(){var b=navigator.userAgent.toLowerCase(),c=window.opera,d={ie:/*@cc_on!@*/false,opera:!!c&&c.version,webkit:b.indexOf(' applewebkit/')>-1,air:b.indexOf(' adobeair/')>-1,mac:b.indexOf('macintosh')>-1,quirks:document.compatMode=='BackCompat',mobile:b.indexOf('mobile')>-1,isCustomDomain:function(){if(!this.ie)return false;var g=document.domain,h=window.location.hostname;return g!=h&&g!='['+h+']';}};d.gecko=navigator.product=='Gecko'&&!d.webkit&&!d.opera;var e=0;if(d.ie){e=parseFloat(b.match(/msie (\d+)/)[1]);d.ie8=!!document.documentMode;d.ie8Compat=document.documentMode==8;d.ie9Compat=document.documentMode==9;d.ie7Compat=e==7&&!document.documentMode||document.documentMode==7;d.ie6Compat=e<7||d.quirks;}if(d.gecko){var f=b.match(/rv:([\d\.]+)/);if(f){f=f[1].split('.');e=f[0]*10000+(f[1]||0)*100+ +(f[2]||0);}}if(d.opera)e=parseFloat(c.version());if(d.air)e=parseFloat(b.match(/ adobeair\/(\d+)/)[1]);if(d.webkit)e=parseFloat(b.match(/ applewebkit\/(\d+)/)[1]);d.version=e;d.isCompatible=!d.mobile&&(d.ie&&e>=6||d.gecko&&e>=10801||d.opera&&e>=9.5||d.air&&e>=1||d.webkit&&e>=522||false);d.cssClass='cke_browser_'+(d.ie?'ie':d.gecko?'gecko':d.opera?'opera':d.webkit?'webkit':'unknown')+ ' cke_minimized';if(d.quirks)d.cssClass+=' cke_browser_quirks'; -if(d.ie){d.cssClass+=' cke_browser_ie'+(d.version<7?'6':d.version>=8?document.documentMode:'7');if(d.quirks)d.cssClass+=' cke_browser_iequirks';}if(d.gecko&&e<10900)d.cssClass+=' cke_browser_gecko18';if(d.air)d.cssClass+=' cke_browser_air';return d;})();var b=a.env;var c=b.ie;if(a.status=='unloaded')(function(){a.event.implementOn(a);a.loadFullCore=function(){if(a.status!='basic_ready'){a.loadFullCore._load=1;return;}delete a.loadFullCore;var e=document.createElement('script');e.type='text/javascript';e.src=a.basePath+'ckeditor.js';document.getElementsByTagName('head')[0].appendChild(e);};a.loadFullCoreTimeout=0;a.replaceClass='ckeditor';a.replaceByClassEnabled=1;var d=function(e,f,g,h){if(b.isCompatible){if(a.loadFullCore)a.loadFullCore();var i=g(e,f,h);a.add(i);return i;}return null;};a.replace=function(e,f){return d(e,f,a.editor.replace);};a.appendTo=function(e,f,g){return d(e,f,a.editor.appendTo,g);};a.add=function(e){var f=this._.pending||(this._.pending=[]);f.push(e);};a.replaceAll=function(){var e=document.getElementsByTagName('textarea');for(var f=0;f'+g+'');else h.push('');}return h.join('');},htmlEncode:function(f){var g=function(k){var l=new d.element('span');l.setText(k);return l.getHtml();},h=g('\n').toLowerCase()=='
    '?function(k){return g(k).replace(/
    /gi,'\n');}:g,i=g('>')=='>'?function(k){return h(k).replace(/>/g,'>');}:h,j=g(' ')=='  '?function(k){return i(k).replace(/ /g,' ');}:i;this.htmlEncode=j;return this.htmlEncode(f);},htmlEncodeAttr:function(f){return f.replace(/"/g,'"').replace(//g,'>');},getNextNumber:(function(){var f=0;return function(){return++f;};})(),getNextId:function(){return 'cke_'+this.getNextNumber();},override:function(f,g){return g(f);},setTimeout:function(f,g,h,i,j){if(!j)j=window;if(!h)h=j;return j.setTimeout(function(){if(i)f.apply(h,[].concat(i));else f.apply(h);},g||0);},trim:(function(){var f=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(g){return g.replace(f,'');};})(),ltrim:(function(){var f=/^[ \t\n\r]+/g;return function(g){return g.replace(f,'');};})(),rtrim:(function(){var f=/[ \t\n\r]+$/g;return function(g){return g.replace(f,'');};})(),indexOf:Array.prototype.indexOf?function(f,g){return f.indexOf(g);}:function(f,g){for(var h=0,i=f.length;h8))&&i)h=i+':'+h;return new d.nodeList(this.$.getElementsByTagName(h));},getHead:function(){var h=this.$.getElementsByTagName('head')[0];if(!h)h=this.getDocumentElement().append(new d.element('head'),true);else h=new d.element(h);return(this.getHead=function(){return h;})();},getBody:function(){var h=new d.element(this.$.body);return(this.getBody=function(){return h;})();},getDocumentElement:function(){var h=new d.element(this.$.documentElement);return(this.getDocumentElement=function(){return h;})();},getWindow:function(){var h=new d.window(this.$.parentWindow||this.$.defaultView);return(this.getWindow=function(){return h; -})();},write:function(h){var i=this;i.$.open('text/html','replace');b.isCustomDomain()&&(i.$.domain=document.domain);i.$.write(h);i.$.close();}});d.node=function(h){if(h){switch(h.nodeType){case 9:return new g(h);case 1:return new d.element(h);case 3:return new d.text(h);}d.domObject.call(this,h);}return this;};d.node.prototype=new d.domObject();a.NODE_ELEMENT=1;a.NODE_DOCUMENT=9;a.NODE_TEXT=3;a.NODE_COMMENT=8;a.NODE_DOCUMENT_FRAGMENT=11;a.POSITION_IDENTICAL=0;a.POSITION_DISCONNECTED=1;a.POSITION_FOLLOWING=2;a.POSITION_PRECEDING=4;a.POSITION_IS_CONTAINED=8;a.POSITION_CONTAINS=16;e.extend(d.node.prototype,{appendTo:function(h,i){h.append(this,i);return h;},clone:function(h,i){var j=this.$.cloneNode(h),k=function(l){if(l.nodeType!=1)return;if(!i)l.removeAttribute('id',false);l.removeAttribute('data-cke-expando',false);if(h){var m=l.childNodes;for(var n=0;n]*>/g,''):i;},getOuterHtml:function(){var j=this;if(j.$.outerHTML)return j.$.outerHTML.replace(/<\?[^>]*>/,'');var i=j.$.ownerDocument.createElement('div');i.appendChild(j.$.cloneNode(true));return i.innerHTML;},setHtml:function(i){return this.$.innerHTML=i;},setText:function(i){h.prototype.setText=this.$.innerText!=undefined?function(j){return this.$.innerText=j;}:function(j){return this.$.textContent=j;};return this.setText(i);},getAttribute:(function(){var i=function(j){return this.$.getAttribute(j,2);};if(c&&(b.ie7Compat||b.ie6Compat))return function(j){var n=this;switch(j){case 'class':j='className';break;case 'http-equiv':j='httpEquiv';break;case 'name':return n.$.name;case 'tabindex':var k=i.call(n,j);if(k!==0&&n.$.tabIndex===0)k=null;return k;break;case 'checked':var l=n.$.attributes.getNamedItem(j),m=l.specified?l.nodeValue:n.$.checked;return m?'checked':null;case 'hspace':case 'value':return n.$[j];case 'style':return n.$.style.cssText;}return i.call(n,j);};else return i;})(),getChildren:function(){return new d.nodeList(this.$.childNodes);},getComputedStyle:c?function(i){return this.$.currentStyle[e.cssStyleToDomStyle(i)];}:function(i){return this.getWindow().$.getComputedStyle(this.$,'').getPropertyValue(i);},getDtd:function(){var i=f[this.getName()];this.getDtd=function(){return i;};return i;},getElementsByTag:g.prototype.getElementsByTag,getTabIndex:c?function(){var i=this.$.tabIndex;if(i===0&&!f.$tabIndex[this.getName()]&&parseInt(this.getAttribute('tabindex'),10)!==0)i=-1;return i;}:b.webkit?function(){var i=this.$.tabIndex;if(i==undefined){i=parseInt(this.getAttribute('tabindex'),10);if(isNaN(i))i=-1;}return i;}:function(){return this.$.tabIndex;},getText:function(){return this.$.textContent||this.$.innerText||'';},getWindow:function(){return this.getDocument().getWindow();},getId:function(){return this.$.id||null;},getNameAtt:function(){return this.$.name||null;},getName:function(){var i=this.$.nodeName.toLowerCase();if(c&&!(document.documentMode>8)){var j=this.$.scopeName;if(j!='HTML')i=j.toLowerCase()+':'+i;}return(this.getName=function(){return i; -})();},getValue:function(){return this.$.value;},getFirst:function(i){var j=this.$.firstChild,k=j&&new d.node(j);if(k&&i&&!i(k))k=k.getNext(i);return k;},getLast:function(i){var j=this.$.lastChild,k=j&&new d.node(j);if(k&&i&&!i(k))k=k.getPrevious(i);return k;},getStyle:function(i){return this.$.style[e.cssStyleToDomStyle(i)];},is:function(){var i=this.getName();for(var j=0;j0&&(j>2||!k[i[0].nodeName]||j==2&&!k[i[1].nodeName]);},hasAttribute:(function(){function i(j){var k=this.$.attributes.getNamedItem(j);return!!(k&&k.specified);};return c&&b.version<8?function(j){if(j=='name')return!!this.$.name;return i.call(this,j);}:i;})(),hide:function(){this.setStyle('display','none');},moveChildren:function(i,j){var k=this.$;i=i.$;if(k==i)return;var l;if(j)while(l=k.lastChild)i.insertBefore(k.removeChild(l),i.firstChild);else while(l=k.firstChild)i.appendChild(k.removeChild(l));},mergeSiblings:(function(){function i(j,k,l){if(k&&k.type==1){var m=[]; -while(k.data('cke-bookmark')||k.isEmptyInlineRemoveable()){m.push(k);k=l?k.getNext():k.getPrevious();if(!k||k.type!=1)return;}if(j.isIdentical(k)){var n=l?j.getLast():j.getFirst();while(m.length)m.shift().move(j,!l);k.moveChildren(j,!l);k.remove();if(n&&n.type==1)n.mergeSiblings();}}};return function(j){var k=this;if(!(j===false||f.$removeEmpty[k.getName()]||k.is('a')))return;i(k,k.getNext(),true);i(k,k.getPrevious());};})(),show:function(){this.setStyles({display:'',visibility:''});},setAttribute:(function(){var i=function(j,k){this.$.setAttribute(j,k);return this;};if(c&&(b.ie7Compat||b.ie6Compat))return function(j,k){var l=this;if(j=='class')l.$.className=k;else if(j=='style')l.$.style.cssText=k;else if(j=='tabindex')l.$.tabIndex=k;else if(j=='checked')l.$.checked=k;else i.apply(l,arguments);return l;};else return i;})(),setAttributes:function(i){for(var j in i)this.setAttribute(j,i[j]);return this;},setValue:function(i){this.$.value=i;return this;},removeAttribute:(function(){var i=function(j){this.$.removeAttribute(j);};if(c&&(b.ie7Compat||b.ie6Compat))return function(j){if(j=='class')j='className';else if(j=='tabindex')j='tabIndex';i.call(this,j);};else return i;})(),removeAttributes:function(i){if(e.isArray(i))for(var j=0;j=100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+i+')');}else this.setStyle('opacity',i);},unselectable:b.gecko?function(){this.$.style.MozUserSelect='none';this.on('dragstart',function(i){i.data.preventDefault();});}:b.webkit?function(){this.$.style.KhtmlUserSelect='none';this.on('dragstart',function(i){i.data.preventDefault();});}:function(){if(c||b.opera){var i=this.$,j,k=0;i.unselectable='on';while(j=i.all[k++])switch(j.tagName.toLowerCase()){case 'iframe':case 'textarea':case 'input':case 'select':break;default:j.unselectable='on';}}},getPositionedAncestor:function(){var i=this;while(i.getName()!='html'){if(i.getComputedStyle('position')!='static')return i;i=i.getParent();}return null;},getDocumentPosition:function(i){var D=this; -var j=0,k=0,l=D.getDocument().getBody(),m=D.getDocument().$.compatMode=='BackCompat',n=D.getDocument();if(document.documentElement.getBoundingClientRect){var o=D.$.getBoundingClientRect(),p=n.$,q=p.documentElement,r=q.clientTop||l.$.clientTop||0,s=q.clientLeft||l.$.clientLeft||0,t=true;if(c){var u=n.getDocumentElement().contains(D),v=n.getBody().contains(D);t=m&&v||!m&&u;}if(t){j=o.left+(!m&&q.scrollLeft||l.$.scrollLeft);j-=s;k=o.top+(!m&&q.scrollTop||l.$.scrollTop);k-=r;}}else{var w=D,x=null,y;while(w&&!(w.getName()=='body'||w.getName()=='html')){j+=w.$.offsetLeft-w.$.scrollLeft;k+=w.$.offsetTop-w.$.scrollTop;if(!w.equals(D)){j+=w.$.clientLeft||0;k+=w.$.clientTop||0;}var z=x;while(z&&!z.equals(w)){j-=z.$.scrollLeft;k-=z.$.scrollTop;z=z.getParent();}x=w;w=(y=w.$.offsetParent)?new h(y):null;}}if(i){var A=D.getWindow(),B=i.getWindow();if(!A.equals(B)&&A.$.frameElement){var C=new h(A.$.frameElement).getDocumentPosition(i);j+=C.x;k+=C.y;}}if(!document.documentElement.getBoundingClientRect)if(b.gecko&&!m){j+=D.$.clientLeft?1:0;k+=D.$.clientTop?1:0;}return{x:j,y:k};},scrollIntoView:function(i){var o=this;var j=o.getWindow(),k=j.getViewPaneSize().height,l=k*-1;if(i)l+=k;else{l+=o.$.offsetHeight||0;l+=parseInt(o.getComputedStyle('marginBottom')||0,10)||0;}var m=o.getDocumentPosition();l+=m.y;l=l<0?0:l;var n=j.getScrollPosition().y;if(l>n||lwindow.setTimeout(function(){window.close();},50);")');}return i&&new g(i.contentWindow.document);},copyAttributes:function(i,j){var p=this;var k=p.$.attributes;j=j||{};for(var l=0;l0&&j)j=j.childNodes[i.shift()];return j?new d.node(j):null;},getChildCount:function(){return this.$.childNodes.length;},disableContextMenu:function(){this.on('contextmenu',function(i){if(!i.data.getTarget().hasClass('cke_enable_context_menu'))i.data.preventDefault();});},getDirection:function(i){return i?this.getComputedStyle('direction'):this.getStyle('direction')||this.getAttribute('dir');},data:function(i,j){i='data-'+i;if(j===undefined)return this.getAttribute(i);else if(j===false)this.removeAttribute(i);else this.setAttribute(i,j);return null;}});(function(){var i={width:['border-left-width','border-right-width','padding-left','padding-right'],height:['border-top-width','border-bottom-width','padding-top','padding-bottom']};function j(k){var l=0;for(var m=0,n=i[k].length;m',bodyId:'',bodyClass:'',fullPage:false,height:200,plugins:'about,a11yhelp,basicstyles,bidi,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,dialogadvtab,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,iframe,image,indent,justify,keystrokes,link,list,liststyle,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,showborders,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',extraPlugins:'',removePlugins:'',protectedSource:[],tabIndex:0,theme:'default',skin:'kama',width:'',baseFloatZIndex:10000}; -var i=a.config;a.focusManager=function(j){if(j.focusManager)return j.focusManager;this.hasFocus=false;this._={editor:j};return this;};a.focusManager.prototype={focus:function(){var k=this;if(k._.timer)clearTimeout(k._.timer);if(!k.hasFocus){if(a.currentInstance)a.currentInstance.focusManager.forceBlur();var j=k._.editor;j.container.getChild(1).addClass('cke_focus');k.hasFocus=true;j.fire('focus');}},blur:function(){var j=this;if(j._.timer)clearTimeout(j._.timer);j._.timer=setTimeout(function(){delete j._.timer;j.forceBlur();},100);},forceBlur:function(){if(this.hasFocus){var j=this._.editor;j.container.getChild(1).removeClass('cke_focus');this.hasFocus=false;j.fire('blur');}}};(function(){var j={};a.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,'en-au':1,'en-ca':1,'en-gb':1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,'fr-ca':1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,lt:1,lv:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,'pt-br':1,pt:1,ro:1,ru:1,sk:1,sl:1,'sr-latn':1,sr:1,sv:1,th:1,tr:1,uk:1,vi:1,'zh-cn':1,zh:1},load:function(k,l,m){if(!k||!a.lang.languages[k])k=this.detect(l,k);if(!this[k])a.scriptLoader.load(a.getUrl('lang/'+k+'.js'),function(){m(k,this[k]);},this);else m(k,this[k]);},detect:function(k,l){var m=this.languages;l=l||navigator.userLanguage||navigator.language;var n=l.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),o=n[1],p=n[2];if(m[o+'-'+p])o=o+'-'+p;else if(!m[o])o=null;a.lang.detect=o?function(){return o;}:function(q){return q;};return o||k;}};})();a.scriptLoader=(function(){var j={},k={};return{load:function(l,m,n,o){var p=typeof l=='string';if(p)l=[l];if(!n)n=a;var q=l.length,r=[],s=[],t=function(y){if(m)if(p)m.call(n,y);else m.call(n,r,s);};if(q===0){t(true);return;}var u=function(y,z){(z?r:s).push(y);if(--q<=0){o&&a.document.getDocumentElement().removeStyle('cursor');t(z);}},v=function(y,z){j[y]=1;var A=k[y];delete k[y];for(var B=0;B1)return;var A=new h('script');A.setAttributes({type:'text/javascript',src:y});if(m)if(c)A.$.onreadystatechange=function(){if(A.$.readyState=='loaded'||A.$.readyState=='complete'){A.$.onreadystatechange=null;v(y,true);}};else{A.$.onload=function(){setTimeout(function(){v(y,true);},0);};A.$.onerror=function(){v(y,false);};}A.appendTo(a.document.getHead());};o&&a.document.getDocumentElement().setStyle('cursor','wait');for(var x=0;x1)return;var w=!p.css||!p.css.length,x=!p.js||!p.js.length,y=function(){if(w&&x){p._isLoaded=1;for(var B=0;B=0?x.langCode:J[0];if(!I.langEntries||!I.langEntries[L])G.push(a.getUrl(K+'lang/'+L+'.js'));else{e.extend(x.lang,I.langEntries[L]);L=null;}}F.push(L);E.push(I);}a.scriptLoader.load(G,function(){var M=['beforeInit','init','afterInit'];for(var N=0;N]+)>)|(?:!--([\\S|\\s]*?)-->)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))",'g')};};(function(){var l=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,m={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};a.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(n){var A=this;var o,p,q=0,r;while(o=A._.htmlPartsRegex.exec(n)){var s=o.index;if(s>q){var t=n.substring(q,s);if(r)r.push(t);else A.onText(t);}q=A._.htmlPartsRegex.lastIndex;if(p=o[1]){p=p.toLowerCase();if(r&&f.$cdata[p]){A.onCDATA(r.join(''));r=null;}if(!r){A.onTagClose(p);continue;}}if(r){r.push(o[0]);continue;}if(p=o[3]){p=p.toLowerCase();if(/="/.test(p))continue;var u={},v,w=o[4],x=!!(w&&w.charAt(w.length-1)=='/');if(w)while(v=l.exec(w)){var y=v[1].toLowerCase(),z=v[2]||v[3]||v[4]||''; -if(!z&&m[y])u[y]=y;else u[y]=z;}A.onTagOpen(p,u,x);if(!r&&f.$cdata[p])r=[];continue;}if(p=o[2])A.onComment(p);}if(n.length>q)A.onText(n.substring(q,n.length));}};})();a.htmlParser.comment=function(l){this.value=l;this._={isBlockLike:false};};a.htmlParser.comment.prototype={type:8,writeHtml:function(l,m){var n=this.value;if(m){if(!(n=m.onComment(n,this)))return;if(typeof n!='string'){n.parent=this.parent;n.writeHtml(l,m);return;}}l.comment(n);}};(function(){var l=/[\t\r\n ]{2,}|[\t\r\n]/g;a.htmlParser.text=function(m){this.value=m;this._={isBlockLike:false};};a.htmlParser.text.prototype={type:3,writeHtml:function(m,n){var o=this.value;if(n&&!(o=n.onText(o,this)))return;m.text(o);}};})();(function(){a.htmlParser.cdata=function(l){this.value=l;};a.htmlParser.cdata.prototype={type:3,writeHtml:function(l){l.write(this.value);}};})();a.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false};};(function(){var l=e.extend({table:1,ul:1,ol:1,dl:1},f.table,f.ul,f.ol,f.dl),m={ol:1,ul:1},n=e.extend({},{html:1},f.html,f.body,f.head,{style:1,script:1});a.htmlParser.fragment.fromHtml=function(o,p,q){var r=new a.htmlParser(),s=q||new a.htmlParser.fragment(),t=[],u=[],v=s,w=false;function x(A){var B;if(t.length>0)for(var C=0;C=0;B--){if(A==t[B].name){t.splice(B,1);return;}}var C=[],D=[],E=v;while(E!=s&&E.name!=A){if(!E._.isBlockLike)D.unshift(E);C.push(E);E=E.returnPoint||E.parent;}if(E!=s){for(B=0;B0&&r.children[p-1]||null;if(q){if(o._.isBlockLike&&q.type==3){q.value=e.rtrim(q.value);if(q.value.length===0){r.children.pop();r.add(o);return;}}q.next=o;}o.previous=q;o.parent=r;r.children.push(o);r._.hasInlineStarted=o.type==3||o.type==1&&!o._.isBlockLike;},writeHtml:function(o,p){var q;this.filterChildren=function(){var r=new a.htmlParser.basicWriter();this.writeChildrenHtml.call(this,r,p,true);var s=r.getHtml();this.children=new a.htmlParser.fragment.fromHtml(s).children;q=1;};!this.name&&p&&p.onFragment(this);this.writeChildrenHtml(o,q?null:p);},writeChildrenHtml:function(o,p){for(var q=0;qn?1:0;};a.htmlParser.element.prototype={type:1,add:a.htmlParser.fragment.prototype.add,clone:function(){return new a.htmlParser.element(this.name,this.attributes); -},writeHtml:function(m,n){var o=this.attributes,p=this,q=p.name,r,s,t,u;p.filterChildren=function(){if(!u){var z=new a.htmlParser.basicWriter();a.htmlParser.fragment.prototype.writeChildrenHtml.call(p,z,n);p.children=new a.htmlParser.fragment.fromHtml(z.getHtml(),0,p.clone()).children;u=1;}};if(n){for(;;){if(!(q=n.onElementName(q)))return;p.name=q;if(!(p=n.onElement(p)))return;p.parent=this.parent;if(p.name==q)break;if(p.type!=1){p.writeHtml(m,n);return;}q=p.name;if(!q){this.writeChildrenHtml.call(p,m,u?null:n);return;}}o=p.attributes;}m.openTag(q,o);var v=[];for(var w=0;w<2;w++)for(r in o){s=r;t=o[r];if(w==1)v.push([r,t]);else if(n){for(;;){if(!(s=n.onAttributeName(r))){delete o[r];break;}else if(s!=r){delete o[r];r=s;continue;}else break;}if(s)if((t=n.onAttribute(p,s,t))===false)delete o[s];else o[s]=t;}}if(m.sortAttributes)v.sort(l);var x=v.length;for(w=0;w=0;u--){var x=r[u];if(x){x.pri=s;q.splice(t,0,x);}}}};function n(q,r,s){if(r)for(var t in r){var u=q[t];q[t]=o(u,r[t],s);if(!u)q.$length++;}};function o(q,r,s){if(r){r.pri=s;if(q){if(!q.splice){if(q.pri>s)q=[r,q];else q=[q,r];q.filter=p;}else m(q,r,s);return q;}else{r.filter=r;return r;}}};function p(q){var r=q.type||q instanceof a.htmlParser.fragment;for(var s=0;s');else this._.output.push('>');},attribute:function(l,m){if(typeof m=='string')m=e.htmlEncodeAttr(m);this._.output.push(' ',l,'="',m,'"');},closeTag:function(l){this._.output.push('');},text:function(l){this._.output.push(l);},comment:function(l){this._.output.push('');},write:function(l){this._.output.push(l);},reset:function(){this._.output=[];this._.indent=false;},getHtml:function(l){var m=this._.output.join('');if(l)this.reset();return m;}}});delete a.loadFullCore;a.instances={};a.document=new g(document);a.add=function(l){a.instances[l.name]=l;l.on('focus',function(){if(a.currentInstance!=l){a.currentInstance=l;a.fire('currentInstance');}});l.on('blur',function(){if(a.currentInstance==l){a.currentInstance=null;a.fire('currentInstance');}});};a.remove=function(l){delete a.instances[l.name];};a.on('instanceDestroyed',function(){if(e.isEmpty(this.instances))a.fire('reset');});a.TRISTATE_ON=1;a.TRISTATE_OFF=2;a.TRISTATE_DISABLED=0;d.comment=e.createClass({base:d.node,$:function(l,m){if(typeof l=='string')l=(m?m.$:document).createComment(l);this.base(l);},proto:{type:8,getOuterHtml:function(){return '';}}});(function(){var l={address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,dd:1,legend:1},m={body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,caption:1,form:1,fieldset:1},n=function(o){var p=o.getChildren();for(var q=0,r=p.count();q0&&C.getChild(v.startOffset-1);this._.guardRTL=function(F,G){return(!G||!C.equals(F))&&(!D||!F.equals(D))&&(F.type!=1||!G||F.getName()!='body');};}var E=s?this._.guardRTL:this._.guardLTR;if(x)w=function(F,G){if(E(F,G)===false)return false; -return x(F,G);};else w=E;if(this.current)u=this.current[z](false,y,w);else if(s){u=v.endContainer;if(v.endOffset>0){u=u.getChild(v.endOffset-1);if(w(u)===false)u=null;}else u=w(u,true)===false?null:u.getPreviousSourceNode(true,y,w);}else{u=v.startContainer;u=u.getChild(v.startOffset);if(u){if(w(u)===false)u=null;}else u=w(v.startContainer,true)===false?null:v.startContainer.getNextSourceNode(true,y,w);}while(u&&!this._.end){this.current=u;if(!this.evaluator||this.evaluator(u)!==false){if(!t)return u;}else if(t&&this.evaluator)return false;u=u[z](false,y,w);}this.end();return this.current=null;};function m(s){var t,u=null;while(t=l.call(this,s))u=t;return u;};d.walker=e.createClass({$:function(s){this.range=s;this._={};},proto:{end:function(){this._.end=1;},next:function(){return l.call(this);},previous:function(){return l.call(this,1);},checkForward:function(){return l.call(this,0,1)!==false;},checkBackward:function(){return l.call(this,1,1)!==false;},lastForward:function(){return m.call(this);},lastBackward:function(){return m.call(this,1);},reset:function(){delete this.current;this._={};}}});var n={block:1,'list-item':1,table:1,'table-row-group':1,'table-header-group':1,'table-footer-group':1,'table-row':1,'table-column-group':1,'table-column':1,'table-cell':1,'table-caption':1};h.prototype.isBlockBoundary=function(s){var t=s?e.extend({},f.$block,s||{}):f.$block;return this.getComputedStyle('float')=='none'&&n[this.getComputedStyle('display')]||t[this.getName()];};d.walker.blockBoundary=function(s){return function(t,u){return!(t.type==1&&t.isBlockBoundary(s));};};d.walker.listItemBoundary=function(){return this.blockBoundary({br:1});};d.walker.bookmark=function(s,t){function u(v){return v&&v.getName&&v.getName()=='span'&&v.data('cke-bookmark');};return function(v){var w,x;w=v&&!v.getName&&(x=v.getParent())&&u(x);w=s?w:w||u(v);return!!(t^w);};};d.walker.whitespaces=function(s){return function(t){var u=t&&t.type==3&&!e.trim(t.getText());return!!(s^u);};};d.walker.invisible=function(s){var t=d.walker.whitespaces();return function(u){var v=t(u)||u.is&&!u.$.offsetHeight;return!!(s^v);};};d.walker.nodeType=function(s,t){return function(u){return!!(t^u.type==s);};};var o=/^[\t\r\n ]*(?: |\xa0)$/,p=d.walker.whitespaces(),q=d.walker.bookmark(),r=function(s){return q(s)||p(s)||s.type==1&&s.getName() in f.$inline&&!(s.getName() in f.$empty);};h.prototype.getBogus=function(){var s=this;do s=s.getPreviousSourceNode();while(r(s));if(s&&(!c?s.is&&s.is('br'):s.getText&&o.test(s.getText())))return s; -return false;};})();d.range=function(l){var m=this;m.startContainer=null;m.startOffset=null;m.endContainer=null;m.endOffset=null;m.collapsed=true;m.document=l;};(function(){var l=function(t){t.collapsed=t.startContainer&&t.endContainer&&t.startContainer.equals(t.endContainer)&&t.startOffset==t.endOffset;},m=function(t,u,v,w){t.optimizeBookmark();var x=t.startContainer,y=t.endContainer,z=t.startOffset,A=t.endOffset,B,C;if(y.type==3)y=y.split(A);else if(y.getChildCount()>0)if(A>=y.getChildCount()){y=y.append(t.document.createText(''));C=true;}else y=y.getChild(A);if(x.type==3){x.split(z);if(x.equals(y))y=x.getNext();}else if(!z){x=x.getFirst().insertBeforeMe(t.document.createText(''));B=true;}else if(z>=x.getChildCount()){x=x.append(t.document.createText(''));B=true;}else x=x.getChild(z).getPrevious();var D=x.getParents(),E=y.getParents(),F,G,H;for(F=0;F0&&!J.equals(y))K=I.append(J.clone());if(!D[O]||J.$.parentNode!=D[O].$.parentNode){L=J.getPrevious();while(L){if(L.equals(D[O])||L.equals(x))break;M=L.getPrevious();if(u==2)I.$.insertBefore(L.$.cloneNode(true),I.$.firstChild);else{L.remove();if(u==1)I.$.insertBefore(L.$,I.$.firstChild);}L=M;}}if(I)I=K;}if(u==2){var P=t.startContainer;if(P.type==3){P.$.data+=P.$.nextSibling.data;P.$.parentNode.removeChild(P.$.nextSibling);}var Q=t.endContainer;if(Q.type==3&&Q.$.nextSibling){Q.$.data+=Q.$.nextSibling.data;Q.$.parentNode.removeChild(Q.$.nextSibling);}}else{if(G&&H&&(x.$.parentNode!=G.$.parentNode||y.$.parentNode!=H.$.parentNode)){var R=H.getIndex();if(B&&H.$.parentNode==x.$.parentNode)R--;if(w&&G.type==1){var S=h.createFromHtml(' ',t.document);S.insertAfter(G);G.mergeSiblings(false);t.moveToBookmark({startNode:S});}else t.setStart(H.getParent(),R);}t.collapse(true);}if(B)x.remove();if(C&&y.$.parentNode)y.remove();},n={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1};function o(t){var u=false,v=d.walker.bookmark(true);return function(w){if(v(w))return true;if(w.type==3){if(w.hasAscendant('pre')||e.trim(w.getText()).length)return false; -}else if(w.type==1)if(!n[w.getName()])if(!t&&!c&&w.getName()=='br'&&!u)u=true;else return false;return true;};};function p(t){return t.type!=3&&t.getName() in f.$removeEmpty||!e.trim(t.getText())||!!t.getParent().data('cke-bookmark');};var q=new d.walker.whitespaces(),r=new d.walker.bookmark();function s(t){return!q(t)&&!r(t);};d.range.prototype={clone:function(){var u=this;var t=new d.range(u.document);t.startContainer=u.startContainer;t.startOffset=u.startOffset;t.endContainer=u.endContainer;t.endOffset=u.endOffset;t.collapsed=u.collapsed;return t;},collapse:function(t){var u=this;if(t){u.endContainer=u.startContainer;u.endOffset=u.startOffset;}else{u.startContainer=u.endContainer;u.startOffset=u.endOffset;}u.collapsed=true;},cloneContents:function(){var t=new d.documentFragment(this.document);if(!this.collapsed)m(this,2,t);return t;},deleteContents:function(t){if(this.collapsed)return;m(this,0,null,t);},extractContents:function(t){var u=new d.documentFragment(this.document);if(!this.collapsed)m(this,1,u,t);return u;},createBookmark:function(t){var z=this;var u,v,w,x,y=z.collapsed;u=z.document.createElement('span');u.data('cke-bookmark',1);u.setStyle('display','none');u.setHtml(' ');if(t){w='cke_bm_'+e.getNextNumber();u.setAttribute('id',w+'S');}if(!y){v=u.clone();v.setHtml(' ');if(t)v.setAttribute('id',w+'E');x=z.clone();x.collapse();x.insertNode(v);}x=z.clone();x.collapse(true);x.insertNode(u);if(v){z.setStartAfter(u);z.setEndBefore(v);}else z.moveToPosition(u,4);return{startNode:t?w+'S':u,endNode:t?w+'E':v,serializable:t,collapsed:y};},createBookmark2:function(t){var B=this;var u=B.startContainer,v=B.endContainer,w=B.startOffset,x=B.endOffset,y=B.collapsed,z,A;if(!u||!v)return{start:0,end:0};if(t){if(u.type==1){z=u.getChild(w);if(z&&z.type==3&&w>0&&z.getPrevious().type==3){u=z;w=0;}if(z&&z.type==1)w=z.getIndex(1);}while(u.type==3&&(A=u.getPrevious())&&A.type==3){u=A;w+=A.getLength();}if(!y){if(v.type==1){z=v.getChild(x);if(z&&z.type==3&&x>0&&z.getPrevious().type==3){v=z;x=0;}if(z&&z.type==1)x=z.getIndex(1);}while(v.type==3&&(A=v.getPrevious())&&A.type==3){v=A;x+=A.getLength();}}}return{start:u.getAddress(t),end:y?null:v.getAddress(t),startOffset:w,endOffset:x,normalized:t,collapsed:y,is2:true};},moveToBookmark:function(t){var B=this;if(t.is2){var u=B.document.getByAddress(t.start,t.normalized),v=t.startOffset,w=t.end&&B.document.getByAddress(t.end,t.normalized),x=t.endOffset;B.setStart(u,v);if(w)B.setEnd(w,x);else B.collapse(true);}else{var y=t.serializable,z=y?B.document.getById(t.startNode):t.startNode,A=y?B.document.getById(t.endNode):t.endNode; -B.setStartBefore(z);z.remove();if(A){B.setEndBefore(A);A.remove();}else B.collapse(true);}},getBoundaryNodes:function(){var y=this;var t=y.startContainer,u=y.endContainer,v=y.startOffset,w=y.endOffset,x;if(t.type==1){x=t.getChildCount();if(x>v)t=t.getChild(v);else if(x<1)t=t.getPreviousSourceNode();else{t=t.$;while(t.lastChild)t=t.lastChild;t=new d.node(t);t=t.getNextSourceNode()||t;}}if(u.type==1){x=u.getChildCount();if(x>w)u=u.getChild(w).getPreviousSourceNode(true);else if(x<1)u=u.getPreviousSourceNode();else{u=u.$;while(u.lastChild)u=u.lastChild;u=new d.node(u);}}if(t.getPosition(u)&2)t=u;return{startNode:t,endNode:u};},getCommonAncestor:function(t,u){var y=this;var v=y.startContainer,w=y.endContainer,x;if(v.equals(w)){if(t&&v.type==1&&y.startOffset==y.endOffset-1)x=v.getChild(y.startOffset);else x=v;}else x=v.getCommonAncestor(w);return u&&!x.is?x.getParent():x;},optimize:function(){var v=this;var t=v.startContainer,u=v.startOffset;if(t.type!=1)if(!u)v.setStartBefore(t);else if(u>=t.getLength())v.setStartAfter(t);t=v.endContainer;u=v.endOffset;if(t.type!=1)if(!u)v.setEndBefore(t);else if(u>=t.getLength())v.setEndAfter(t);},optimizeBookmark:function(){var v=this;var t=v.startContainer,u=v.endContainer;if(t.is&&t.is('span')&&t.data('cke-bookmark'))v.setStartAt(t,3);if(u&&u.is&&u.is('span')&&u.data('cke-bookmark'))v.setEndAt(u,4);},trim:function(t,u){var B=this;var v=B.startContainer,w=B.startOffset,x=B.collapsed;if((!t||x)&&v&&v.type==3){if(!w){w=v.getIndex();v=v.getParent();}else if(w>=v.getLength()){w=v.getIndex()+1;v=v.getParent();}else{var y=v.split(w);w=v.getIndex()+1;v=v.getParent();if(B.startContainer.equals(B.endContainer))B.setEnd(y,B.endOffset-B.startOffset);else if(v.equals(B.endContainer))B.endOffset+=1;}B.setStart(v,w);if(x){B.collapse(true);return;}}var z=B.endContainer,A=B.endOffset;if(!(u||x)&&z&&z.type==3){if(!A){A=z.getIndex();z=z.getParent();}else if(A>=z.getLength()){A=z.getIndex()+1;z=z.getParent();}else{z.split(A);A=z.getIndex()+1;z=z.getParent();}B.setEnd(z,A);}},enlarge:function(t,u){switch(t){case 1:if(this.collapsed)return;var v=this.getCommonAncestor(),w=this.document.getBody(),x,y,z,A,B,C=false,D,E,F=this.startContainer,G=this.startOffset;if(F.type==3){if(G){F=!e.trim(F.substring(0,G)).length&&F;C=!!F;}if(F)if(!(A=F.getPrevious()))z=F.getParent();}else{if(G)A=F.getChild(G-1)||F.getLast();if(!A)z=F;}while(z||A){if(z&&!A){if(!B&&z.equals(v))B=true;if(!w.contains(z))break;if(!C||z.getComputedStyle('display')!='inline'){C=false;if(B)x=z; -else this.setStartBefore(z);}A=z.getPrevious();}while(A){D=false;if(A.type==3){E=A.getText();if(/[^\s\ufeff]/.test(E))A=null;D=/[\s\ufeff]$/.test(E);}else if((A.$.offsetWidth>0||u&&A.is('br'))&&!A.data('cke-bookmark'))if(C&&f.$removeEmpty[A.getName()]){E=A.getText();if(/[^\s\ufeff]/.test(E))A=null;else{var H=A.$.all||A.$.getElementsByTagName('*');for(var I=0,J;J=H[I++];){if(!f.$removeEmpty[J.nodeName.toLowerCase()]){A=null;break;}}}if(A)D=!!E.length;}else A=null;if(D)if(C){if(B)x=z;else if(z)this.setStartBefore(z);}else C=true;if(A){var K=A.getPrevious();if(!z&&!K){z=A;A=null;break;}A=K;}else z=null;}if(z)z=z.getParent();}F=this.endContainer;G=this.endOffset;z=A=null;B=C=false;if(F.type==3){F=!e.trim(F.substring(G)).length&&F;C=!(F&&F.getLength());if(F)if(!(A=F.getNext()))z=F.getParent();}else{A=F.getChild(G);if(!A)z=F;}while(z||A){if(z&&!A){if(!B&&z.equals(v))B=true;if(!w.contains(z))break;if(!C||z.getComputedStyle('display')!='inline'){C=false;if(B)y=z;else if(z)this.setEndAfter(z);}A=z.getNext();}while(A){D=false;if(A.type==3){E=A.getText();if(/[^\s\ufeff]/.test(E))A=null;D=/^[\s\ufeff]/.test(E);}else if((A.$.offsetWidth>0||u&&A.is('br'))&&!A.data('cke-bookmark'))if(C&&f.$removeEmpty[A.getName()]){E=A.getText();if(/[^\s\ufeff]/.test(E))A=null;else{H=A.$.all||A.$.getElementsByTagName('*');for(I=0;J=H[I++];){if(!f.$removeEmpty[J.nodeName.toLowerCase()]){A=null;break;}}}if(A)D=!!E.length;}else A=null;if(D)if(C)if(B)y=z;else this.setEndAfter(z);if(A){K=A.getNext();if(!z&&!K){z=A;A=null;break;}A=K;}else z=null;}if(z)z=z.getParent();}if(x&&y){v=x.contains(y)?y:x;this.setStartBefore(v);this.setEndAfter(v);}break;case 2:case 3:var L=new d.range(this.document);w=this.document.getBody();L.setStartAt(w,1);L.setEnd(this.startContainer,this.startOffset);var M=new d.walker(L),N,O,P=d.walker.blockBoundary(t==3?{br:1}:null),Q=function(S){var T=P(S);if(!T)N=S;return T;},R=function(S){var T=Q(S);if(!T&&S.is&&S.is('br'))O=S;return T;};M.guard=Q;z=M.lastBackward();N=N||w;this.setStartAt(N,!N.is('br')&&(!z&&this.checkStartOfBlock()||z&&N.contains(z))?1:4);L=this.clone();L.collapse();L.setEndAt(w,2);M=new d.walker(L);M.guard=t==3?R:Q;N=null;z=M.lastForward();N=N||w;this.setEndAt(N,!z&&this.checkEndOfBlock()||z&&N.contains(z)?2:3);if(O)this.setEndAfter(O);}},shrink:function(t,u){if(!this.collapsed){t=t||2;var v=this.clone(),w=this.startContainer,x=this.endContainer,y=this.startOffset,z=this.endOffset,A=this.collapsed,B=1,C=1;if(w&&w.type==3)if(!y)v.setStartBefore(w);else if(y>=w.getLength())v.setStartAfter(w); -else{v.setStartBefore(w);B=0;}if(x&&x.type==3)if(!z)v.setEndBefore(x);else if(z>=x.getLength())v.setEndAfter(x);else{v.setEndAfter(x);C=0;}var D=new d.walker(v),E=d.walker.bookmark();D.evaluator=function(I){return I.type==(t==1?1:3);};var F;D.guard=function(I,J){if(E(I))return true;if(t==1&&I.type==3)return false;if(J&&I.equals(F))return false;if(!J&&I.type==1)F=I;return true;};if(B){var G=D[t==1?'lastForward':'next']();G&&this.setStartAt(G,u?1:3);}if(C){D.reset();var H=D[t==1?'lastBackward':'previous']();H&&this.setEndAt(H,u?2:4);}return!!(B||C);}},insertNode:function(t){var x=this;x.optimizeBookmark();x.trim(false,true);var u=x.startContainer,v=x.startOffset,w=u.getChild(v);if(w)t.insertBefore(w);else u.append(t);if(t.getParent().equals(x.endContainer))x.endOffset++;x.setStartBefore(t);},moveToPosition:function(t,u){this.setStartAt(t,u);this.collapse(true);},selectNodeContents:function(t){this.setStart(t,0);this.setEnd(t,t.type==3?t.getLength():t.getChildCount());},setStart:function(t,u){var v=this;if(t.type==1&&f.$empty[t.getName()])u=t.getIndex(),t=t.getParent();v.startContainer=t;v.startOffset=u;if(!v.endContainer){v.endContainer=t;v.endOffset=u;}l(v);},setEnd:function(t,u){var v=this;if(t.type==1&&f.$empty[t.getName()])u=t.getIndex()+1,t=t.getParent();v.endContainer=t;v.endOffset=u;if(!v.startContainer){v.startContainer=t;v.startOffset=u;}l(v);},setStartAfter:function(t){this.setStart(t.getParent(),t.getIndex()+1);},setStartBefore:function(t){this.setStart(t.getParent(),t.getIndex());},setEndAfter:function(t){this.setEnd(t.getParent(),t.getIndex()+1);},setEndBefore:function(t){this.setEnd(t.getParent(),t.getIndex());},setStartAt:function(t,u){var v=this;switch(u){case 1:v.setStart(t,0);break;case 2:if(t.type==3)v.setStart(t,t.getLength());else v.setStart(t,t.getChildCount());break;case 3:v.setStartBefore(t);break;case 4:v.setStartAfter(t);}l(v);},setEndAt:function(t,u){var v=this;switch(u){case 1:v.setEnd(t,0);break;case 2:if(t.type==3)v.setEnd(t,t.getLength());else v.setEnd(t,t.getChildCount());break;case 3:v.setEndBefore(t);break;case 4:v.setEndAfter(t);}l(v);},fixBlock:function(t,u){var x=this;var v=x.createBookmark(),w=x.document.createElement(u);x.collapse(t);x.enlarge(2);x.extractContents().appendTo(w);w.trim();if(!c)w.appendBogus();x.insertNode(w);x.moveToBookmark(v);return w;},splitBlock:function(t){var D=this;var u=new d.elementPath(D.startContainer),v=new d.elementPath(D.endContainer),w=u.blockLimit,x=v.blockLimit,y=u.block,z=v.block,A=null; -if(!w.equals(x))return null;if(t!='br'){if(!y){y=D.fixBlock(true,t);z=new d.elementPath(D.endContainer).block;}if(!z)z=D.fixBlock(false,t);}var B=y&&D.checkStartOfBlock(),C=z&&D.checkEndOfBlock();D.deleteContents();if(y&&y.equals(z))if(C){A=new d.elementPath(D.startContainer);D.moveToPosition(z,4);z=null;}else if(B){A=new d.elementPath(D.startContainer);D.moveToPosition(y,3);y=null;}else{z=D.splitElement(y);if(!c&&!y.is('ul','ol'))y.appendBogus();}return{previousBlock:y,nextBlock:z,wasStartOfBlock:B,wasEndOfBlock:C,elementPath:A};},splitElement:function(t){var w=this;if(!w.collapsed)return null;w.setEndAt(t,2);var u=w.extractContents(),v=t.clone(false);u.appendTo(v);v.insertAfter(t);w.moveToPosition(t,4);return v;},checkBoundaryOfElement:function(t,u){var v=u==1,w=this.clone();w.collapse(v);w[v?'setStartAt':'setEndAt'](t,v?1:2);var x=new d.walker(w);x.evaluator=p;return x[v?'checkBackward':'checkForward']();},checkStartOfBlock:function(){var z=this;var t=z.startContainer,u=z.startOffset;if(u&&t.type==3){var v=e.ltrim(t.substring(0,u));if(v.length)return false;}z.trim();var w=new d.elementPath(z.startContainer),x=z.clone();x.collapse(true);x.setStartAt(w.block||w.blockLimit,1);var y=new d.walker(x);y.evaluator=o(true);return y.checkBackward();},checkEndOfBlock:function(){var z=this;var t=z.endContainer,u=z.endOffset;if(t.type==3){var v=e.rtrim(t.substring(u));if(v.length)return false;}z.trim();var w=new d.elementPath(z.endContainer),x=z.clone();x.collapse(false);x.setEndAt(w.block||w.blockLimit,2);var y=new d.walker(x);y.evaluator=o(false);return y.checkForward();},checkReadOnly:(function(){function t(u,v){while(u){if(u.type==1)if(u.getAttribute('contentEditable')=='false'&&!u.data('cke-editable'))return 0;else if(u.is('html')||u.getAttribute('contentEditable')=='true'&&(u.contains(v)||u.equals(v)))break;u=u.getParent();}return 1;};return function(){var u=this.startContainer,v=this.endContainer;return!(t(u,v)&&t(v,u));};})(),moveToElementEditablePosition:function(t,u){var v;if(f.$empty[t.getName()])return false;while(t&&t.type==1){v=t.isEditable();if(v)this.moveToPosition(t,u?2:1);else if(f.$inline[t.getName()]){this.moveToPosition(t,u?4:3);return true;}if(f.$empty[t.getName()])t=t[u?'getPrevious':'getNext'](s);else t=t[u?'getLast':'getFirst'](s);if(t&&t.type==3){this.moveToPosition(t,u?4:3);return true;}}return v;},moveToElementEditStart:function(t){return this.moveToElementEditablePosition(t);},moveToElementEditEnd:function(t){return this.moveToElementEditablePosition(t,true); -},getEnclosedNode:function(){var t=this.clone();t.optimize();if(t.startContainer.type!=1||t.endContainer.type!=1)return null;var u=new d.walker(t),v=d.walker.bookmark(true),w=d.walker.whitespaces(true),x=function(z){return w(z)&&v(z);};t.evaluator=x;var y=u.next();u.reset();return y&&y.equals(u.previous())?y:null;},getTouchedStartNode:function(){var t=this.startContainer;if(this.collapsed||t.type!=1)return t;return t.getChild(this.startOffset)||t;},getTouchedEndNode:function(){var t=this.endContainer;if(this.collapsed||t.type!=1)return t;return t.getChild(this.endOffset-1)||t;}};})();a.POSITION_AFTER_START=1;a.POSITION_BEFORE_END=2;a.POSITION_BEFORE_START=3;a.POSITION_AFTER_END=4;a.ENLARGE_ELEMENT=1;a.ENLARGE_BLOCK_CONTENTS=2;a.ENLARGE_LIST_ITEM_CONTENTS=3;a.START=1;a.END=2;a.STARTEND=3;a.SHRINK_ELEMENT=1;a.SHRINK_TEXT=2;(function(){d.rangeList=function(n){if(n instanceof d.rangeList)return n;if(!n)n=[];else if(n instanceof d.range)n=[n];return e.extend(n,l);};var l={createIterator:function(){var n=this,o=d.walker.bookmark(),p=function(s){return!(s.is&&s.is('tr'));},q=[],r;return{getNextRange:function(s){r=r==undefined?0:r+1;var t=n[r];if(t&&n.length>1){if(!r)for(var u=n.length-1;u>=0;u--)q.unshift(n[u].createBookmark(true));if(s){var v=0;while(n[r+v+1]){var w=t.document,x=0,y=w.getById(q[v].endNode),z=w.getById(q[v+1].startNode),A;while(1){A=y.getNextSourceNode(false);if(!z.equals(A)){if(o(A)||A.type==1&&A.isBlockBoundary()){y=A;continue;}}else x=1;break;}if(!x)break;v++;}}t.moveToBookmark(q.shift());while(v--){A=n[++r];A.moveToBookmark(q.shift());t.setEnd(A.endContainer,A.endOffset);}}return t;}};},createBookmarks:function(n){var s=this;var o=[],p;for(var q=0;q',a.document);l.appendTo(a.document.getHead());try{b.hc=l.getComputedStyle('border-top-color')==l.getComputedStyle('border-right-color');}catch(m){b.hc=false;}if(b.hc)b.cssClass+=' cke_hc';l.remove();})();j.load(i.corePlugins.split(','),function(){a.status='loaded';a.fire('loaded');var l=a._.pending;if(l){delete a._.pending;for(var m=0;m0){z=A.shift();while(!z.getParent().equals(D))z=z.getParent();if(!z.equals(H))E.push(z);H=z;}while(E.length>0){z=E.shift();if(z.getName()=='blockquote'){var I=new d.documentFragment(q.document);while(z.getFirst()){I.append(z.getFirst().remove());A.push(I.getLast());}I.replace(z);}else A.push(z);}var J=q.document.createElement('blockquote');J.insertBefore(A[0]);while(A.length>0){z=A.shift();J.append(z);}}else if(r==1){var K=[],L={};while(z=y.getNextParagraph()){var M=null,N=null;while(z.getParent()){if(z.getParent().getName()=='blockquote'){M=z.getParent();N=z;break;}z=z.getParent();}if(M&&N&&!N.getCustomData('blockquote_moveout')){K.push(N);h.setMarker(L,N,'blockquote_moveout',true);}}h.clearAllMarkers(L);var O=[],P=[];L={};while(K.length>0){var Q=K.shift();J=Q.getParent();if(!Q.getPrevious())Q.remove().insertBefore(J);else if(!Q.getNext())Q.remove().insertAfter(J);else{Q.breakParent(Q.getParent());P.push(Q.getNext());}if(!J.getCustomData('blockquote_processed')){P.push(J);h.setMarker(L,J,'blockquote_processed',true);}O.push(Q);}h.clearAllMarkers(L);for(F=P.length-1;F>=0;F--){J=P[F];if(o(J))J.remove();}if(q.config.enterMode==2){var R=true;while(O.length){Q=O.shift();if(Q.getName()=='div'){I=new d.documentFragment(q.document);var S=R&&Q.getPrevious()&&!(Q.getPrevious().type==1&&Q.getPrevious().isBlockBoundary());if(S)I.append(q.document.createElement('br'));var T=Q.getNext()&&!(Q.getNext().type==1&&Q.getNext().isBlockBoundary());while(Q.getFirst())Q.getFirst().remove().appendTo(I);if(T)I.append(q.document.createElement('br'));I.replace(Q);R=false;}}}}s.selectBookmarks(u);q.focus();}};j.add('blockquote',{init:function(q){q.addCommand('blockquote',p);q.ui.addButton('Blockquote',{label:q.lang.blockquote,command:'blockquote'});q.on('selectionChange',n);},requires:['domiterator']});})();j.add('button',{beforeInit:function(m){m.ui.addHandler('button',k.button.handler);}});a.UI_BUTTON='button';k.button=function(m){e.extend(this,m,{title:m.label,className:m.className||m.command&&'cke_button_'+m.command||'',click:m.click||(function(n){n.execCommand(m.command);})});this._={};};k.button.handler={create:function(m){return new k.button(m);}};(function(){k.button.prototype={render:function(m,n){var o=b,p=this._.id=e.getNextId(),q='',r=this.command,s; -this._.editor=m;var t={id:p,button:this,editor:m,focus:function(){var z=a.document.getById(p);z.focus();},execute:function(){this.button.click(m);}},u=e.addFunction(function(z){if(t.onkey){z=new d.event(z);return t.onkey(t,z.getKeystroke())!==false;}}),v=e.addFunction(function(z){var A;if(t.onfocus)A=t.onfocus(t,new d.event(z))!==false;if(b.gecko&&b.version<10900)z.preventBubble();return A;});t.clickFn=s=e.addFunction(t.execute,t);if(this.modes){var w={};function x(){var z=m.mode;if(z){var A=this.modes[z]?w[z]!=undefined?w[z]:2:0;this.setState(m.readOnly&&!this.readOnly?0:A);}};m.on('beforeModeUnload',function(){if(m.mode&&this._.state!=0)w[m.mode]=this._.state;},this);m.on('mode',x,this);!this.readOnly&&m.on('readOnly',x,this);}else if(r){r=m.getCommand(r);if(r){r.on('state',function(){this.setState(r.state);},this);q+='cke_'+(r.state==1?'on':r.state==0?'disabled':'off');}}if(!r)q+='cke_off';if(this.className)q+=' '+this.className;n.push('','=10900&&!o.hc?'':'" href="javascript:void(\''+(this.title||'').replace("'",'')+"')\"",' title="',this.title,'" tabindex="-1" hidefocus="true" role="button" aria-labelledby="'+p+'_label"'+(this.hasArrow?' aria-haspopup="true"':''));if(o.opera||o.gecko&&o.mac)n.push(' onkeypress="return false;"');if(o.gecko)n.push(' onblur="this.style.cssText = this.style.cssText;"');n.push(' onkeydown="return CKEDITOR.tools.callFunction(',u,', event);" onfocus="return CKEDITOR.tools.callFunction(',v,', event);" onclick="CKEDITOR.tools.callFunction(',s,', this); return false;"> ',this.label,'');if(this.hasArrow)n.push(''+(b.hc?'▼':' ')+'');n.push('','');if(this.onRender)this.onRender();return t;},setState:function(m){if(this._.state==m)return false;this._.state=m;var n=a.document.getById(this._.id);if(n){n.setState(m);m==0?n.setAttribute('aria-disabled',true):n.removeAttribute('aria-disabled');m==1?n.setAttribute('aria-pressed',true):n.removeAttribute('aria-pressed');return true;}else return false;}};})();k.prototype.addButton=function(m,n){this.add(m,'button',n);};(function(){var m=function(y,z){var A=y.document,B=A.getBody(),C=0,D=function(){C=1; -};B.on(z,D);(b.version>7?A.$:A.$.selection.createRange()).execCommand(z);B.removeListener(z,D);return C;},n=c?function(y,z){return m(y,z);}:function(y,z){try{return y.document.$.execCommand(z,false,null);}catch(A){return false;}},o=function(y){var z=this;z.type=y;z.canUndo=z.type=='cut';z.startDisabled=true;};o.prototype={exec:function(y,z){this.type=='cut'&&t(y);var A=n(y,this.type);if(!A)alert(y.lang.clipboard[this.type+'Error']);return A;}};var p={canUndo:false,exec:c?function(y){y.focus();if(!y.document.getBody().fire('beforepaste')&&!m(y,'paste')){y.fire('pasteDialog');return false;}}:function(y){try{if(!y.document.getBody().fire('beforepaste')&&!y.document.$.execCommand('Paste',false,null))throw 0;}catch(z){setTimeout(function(){y.fire('pasteDialog');},0);return false;}}},q=function(y){if(this.mode!='wysiwyg')return;switch(y.data.keyCode){case 1000+86:case 2000+45:var z=this.document.getBody();if(!c&&z.fire('beforepaste'))y.cancel();else if(b.opera||b.gecko&&b.version<10900)z.fire('paste');return;case 1000+88:case 2000+46:var A=this;this.fire('saveSnapshot');setTimeout(function(){A.fire('saveSnapshot');},0);}};function r(y){y.cancel();};function s(y,z,A){var B=this.document;if(B.getById('cke_pastebin'))return;if(z=='text'&&y.data&&y.data.$.clipboardData){var C=y.data.$.clipboardData.getData('text/plain');if(C){y.data.preventDefault();A(C);return;}}var D=this.getSelection(),E=new d.range(B),F=new h(z=='text'?'textarea':b.webkit?'body':'div',B);F.setAttribute('id','cke_pastebin');b.webkit&&F.append(B.createText('\xa0'));B.getBody().append(F);F.setStyles({position:'absolute',top:D.getStartElement().getDocumentPosition().y+'px',width:'1px',height:'1px',overflow:'hidden'});F.setStyle(this.config.contentsLangDirection=='ltr'?'left':'right','-1000px');var G=D.createBookmarks();this.on('selectionChange',r,null,null,0);if(z=='text')F.$.focus();else{E.setStartAt(F,1);E.setEndAt(F,2);E.select(true);}var H=this;window.setTimeout(function(){z=='text'&&b.gecko&&H.focusGrabber.focus();F.remove();H.removeListener('selectionChange',r);var I;F=b.webkit&&(I=F.getFirst())&&I.is&&I.hasClass('Apple-style-span')?I:F;D.selectBookmarks(G);A(F['get'+(z=='text'?'Value':'Html')]());},0);};function t(y){if(!c||b.quirks)return;var z=y.getSelection(),A;if(z.getType()==3&&(A=z.getSelectedElement())){var B=z.getRanges()[0],C=y.document.createText('');C.insertBefore(A);B.setStartBefore(C);B.setEndAfter(A);z.selectRanges([B]);setTimeout(function(){if(A.getParent()){C.remove();z.selectElement(A); -}},0);}};var u;function v(y,z){c&&(u=1);var A=2;try{A=z.document.$.queryCommandEnabled(y)?2:0;}catch(B){}u=0;return A;};var w;function x(){var z=this;if(z.mode!='wysiwyg')return;z.getCommand('cut').setState(w?0:v('Cut',z));z.getCommand('copy').setState(v('Copy',z));var y=w?0:b.webkit?2:v('Paste',z);z.fire('pasteState',y);};j.add('clipboard',{requires:['dialog','htmldataprocessor'],init:function(y){y.on('paste',function(A){var B=A.data;if(B.html)y.insertHtml(B.html);else if(B.text)y.insertText(B.text);setTimeout(function(){y.fire('afterPaste');},0);},null,null,1000);y.on('pasteDialog',function(A){setTimeout(function(){y.openDialog('paste');},0);});y.on('pasteState',function(A){y.getCommand('paste').setState(A.data);});function z(A,B,C,D){var E=y.lang[B];y.addCommand(B,C);y.ui.addButton(A,{label:E,command:B});if(y.addMenuItems)y.addMenuItem(B,{label:E,command:B,group:'clipboard',order:D});};z('Cut','cut',new o('cut'),1);z('Copy','copy',new o('copy'),4);z('Paste','paste',p,8);a.dialog.add('paste',a.getUrl(this.path+'dialogs/paste.js'));y.on('key',q,y);y.on('contentDom',function(){var A=y.document.getBody();A.on(b.webkit?'paste':'beforepaste',function(B){if(u)return;var C={mode:'html'};y.fire('beforePaste',C);s.call(y,B,C.mode,function(D){if(!(D=e.trim(D.replace(/]+data-cke-bookmark[^<]*?<\/span>/ig,''))))return;var E={};E[C.mode]=D;y.fire('paste',E);});});A.on('beforecut',function(){!u&&t(y);});A.on('mouseup',function(){setTimeout(function(){x.call(y);},0);},y);A.on('keyup',x,y);});y.on('selectionChange',function(A){w=A.data.selection.getRanges()[0].checkReadOnly();x.call(y);});if(y.contextMenu)y.contextMenu.addListener(function(A,B){var C=B.getRanges()[0].checkReadOnly();return{cut:!C&&v('Cut',y),copy:v('Copy',y),paste:!C&&(b.webkit?2:v('Paste',y))};});}});})();j.add('colorbutton',{requires:['panelbutton','floatpanel','styles'],init:function(m){var n=m.config,o=m.lang.colorButton,p;if(!b.hc){q('TextColor','fore',o.textColorTitle);q('BGColor','back',o.bgColorTitle);}function q(t,u,v){var w=e.getNextId()+'_colorBox';m.ui.add(t,'panelbutton',{label:v,title:v,className:'cke_button_'+t.toLowerCase(),modes:{wysiwyg:1},panel:{css:m.skin.editor.css,attributes:{role:'listbox','aria-label':o.panelTitle}},onBlock:function(x,y){y.autoSize=true;y.element.addClass('cke_colorblock');y.element.setHtml(r(x,u,w));y.element.getDocument().getBody().setStyle('overflow','hidden');k.fire('ready',this);var z=y.keys,A=m.lang.dir=='rtl';z[A?37:39]='next';z[40]='next';z[9]='next'; -z[A?39:37]='prev';z[38]='prev';z[2000+9]='prev';z[32]='click';},onOpen:function(){var x=m.getSelection(),y=x&&x.getStartElement(),z=new d.elementPath(y),A;y=z.block||z.blockLimit||m.document.getBody();do A=y&&y.getComputedStyle(u=='back'?'background-color':'color')||'transparent';while(u=='back'&&A=='transparent'&&y&&(y=y.getParent()));if(!A||A=='transparent')A='#ffffff';this._.panel._.iframe.getFrameDocument().getById(w).setStyle('background-color',A);}});};function r(t,u,v){var w=[],x=n.colorButton_colors.split(','),y=x.length+(n.colorButton_enableMore?2:1),z=e.addFunction(function(F,G){if(F=='?'){var H=arguments.callee;function I(K){this.removeListener('ok',I);this.removeListener('cancel',I);K.name=='ok'&&H(this.getContentElement('picker','selectedColor').getValue(),G);};m.openDialog('colordialog',function(){this.on('ok',I);this.on('cancel',I);});return;}m.focus();t.hide();m.fire('saveSnapshot');new a.style(n['colorButton_'+G+'Style'],{color:'inherit'}).remove(m.document);if(F){var J=n['colorButton_'+G+'Style'];J.childRule=G=='back'?function(K){return s(K);}:function(K){return K.getName()!='a'||s(K);};new a.style(J,{color:F}).apply(m.document);}m.fire('saveSnapshot');});w.push('
    ',o.auto,'
    ');for(var A=0;A');var B=x[A].split('/'),C=B[0],D=B[1]||C;if(!B[1])C='#'+C.replace(/^(.)(.)(.)$/,'$1$1$2$2$3$3');var E=m.lang.colors[D]||D;w.push('');}if(n.colorButton_enableMore===undefined||n.colorButton_enableMore)w.push(''); -w.push('
    ',o.more,'
    ');return w.join('');};function s(t){return t.getAttribute('contentEditable')=='false'||t.getAttribute('data-nostyle');};}});i.colorButton_colors='000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF';i.colorButton_foreStyle={element:'span',styles:{color:'#(color)'},overrides:[{element:'font',attributes:{color:null}}]};i.colorButton_backStyle={element:'span',styles:{'background-color':'#(color)'}};j.colordialog={init:function(m){m.addCommand('colordialog',new a.dialogCommand('colordialog'));a.dialog.add('colordialog',this.path+'dialogs/colordialog.js');}};j.add('colordialog',j.colordialog);j.add('contextmenu',{requires:['menu'],onLoad:function(){j.contextMenu=e.createClass({base:a.menu,$:function(m){this.base.call(this,m,{panel:{className:m.skinClass+' cke_contextmenu',attributes:{'aria-label':m.lang.contextmenu.options}}});},proto:{addTarget:function(m,n){if(b.opera&&!('oncontextmenu' in document.body)){var o;m.on('mousedown',function(s){s=s.data;if(s.$.button!=2){if(s.getKeystroke()==1000+1)m.fire('contextmenu',s);return;}if(n&&(b.mac?s.$.metaKey:s.$.ctrlKey))return;var t=s.getTarget();if(!o){var u=t.getDocument();o=u.createElement('input');o.$.type='button';u.getBody().append(o);}o.setAttribute('style','position:absolute;top:'+(s.$.clientY-2)+'px;left:'+(s.$.clientX-2)+'px;width:5px;height:5px;opacity:0.01');});m.on('mouseup',function(s){if(o){o.remove();o=undefined;m.fire('contextmenu',s.data);}});}m.on('contextmenu',function(s){var t=s.data;if(n&&(b.webkit?p:b.mac?t.$.metaKey:t.$.ctrlKey))return;t.preventDefault();var u=t.getTarget().getDocument().getDocumentElement(),v=t.$.clientX,w=t.$.clientY;e.setTimeout(function(){this.open(u,null,v,w);},0,this);},this);if(b.opera)m.on('keypress',function(s){var t=s.data;if(t.$.keyCode===0)t.preventDefault();});if(b.webkit){var p,q=function(s){p=b.mac?s.data.$.metaKey:s.data.$.ctrlKey;},r=function(){p=0;};m.on('keydown',q);m.on('keyup',r);m.on('contextmenu',r);}},open:function(m,n,o,p){this.editor.focus();m=m||a.document.getDocumentElement();this.show(m,n,o,p);}}});},beforeInit:function(m){m.contextMenu=new j.contextMenu(m);m.addCommand('contextMenu',{exec:function(){m.contextMenu.open(m.document.getBody());}});}});(function(){function m(o){var p=this.att,q=o&&o.hasAttribute(p)&&o.getAttribute(p)||''; -if(q!==undefined)this.setValue(q);};function n(){var o;for(var p=0;p ';j.add('elementspath',{requires:['selection'],init:function(o){var p='cke_path_'+o.name,q,r=function(){if(!q)q=a.document.getById(p);return q;},s='cke_elementspath_'+e.getNextNumber()+'_';o._.elementsPath={idBase:s,filters:[]};o.on('themeSpace',function(x){if(x.data.space=='bottom')x.data.html+=''+o.lang.elementsPath.eleLabel+''+'
    '+n+'
    ';});function t(x){o.focus();var y=o._.elementsPath.list[x];if(y.is('body')){var z=new d.range(o.document);z.selectNodeContents(y);z.select();}else o.getSelection().selectElement(y);};var u=e.addFunction(t),v=e.addFunction(function(x,y){var z=o._.elementsPath.idBase,A;y=new d.event(y);var B=o.lang.dir=='rtl';switch(y.getKeystroke()){case B?39:37:case 9:A=a.document.getById(z+(x+1));if(!A)A=a.document.getById(z+'0');A.focus();return false;case B?37:39:case 2000+9:A=a.document.getById(z+(x-1));if(!A)A=a.document.getById(z+(o._.elementsPath.list.length-1));A.focus();return false;case 27:o.focus();return false;case 13:case 32:t(x);return false;}return true;});o.on('selectionChange',function(x){var y=b,z=x.data.selection,A=z.getStartElement(),B=[],C=x.editor,D=C._.elementsPath.list=[],E=C._.elementsPath.filters;while(A){var F=0,G;if(A.data('cke-display-name'))G=A.data('cke-display-name');else if(A.data('cke-real-element-type'))G=A.data('cke-real-element-type');else G=A.getName();for(var H=0;H',G,''+L+'',''); -}if(G=='body')break;A=A.getParent();}var M=r();M.setHtml(B.join('')+n);C.fire('elementsPathUpdate',{space:M});});function w(){q&&q.setHtml(n);delete o._.elementsPath.list;};o.on('readOnly',w);o.on('contentDomUnload',w);o.addCommand('elementsPathFocus',m.toolbarFocus);}});})();(function(){j.add('enterkey',{requires:['keystrokes','indent'],init:function(t){t.addCommand('enter',{modes:{wysiwyg:1},editorFocus:false,exec:function(v){r(v);}});t.addCommand('shiftEnter',{modes:{wysiwyg:1},editorFocus:false,exec:function(v){q(v);}});var u=t.keystrokeHandler.keystrokes;u[13]='enter';u[2000+13]='shiftEnter';}});j.enterkey={enterBlock:function(t,u,v,w){v=v||s(t);if(!v)return;var x=v.document,y=v.checkStartOfBlock(),z=v.checkEndOfBlock(),A=new d.elementPath(v.startContainer),B=A.block;if(y&&z){if(B&&(B.is('li')||B.getParent().is('li'))){t.execCommand('outdent');return;}}else if(!z&&B&&B.is('pre'))n(t,u,v,w);var C=u==3?'div':'p',D=v.splitBlock(C);if(!D)return;var E=D.previousBlock,F=D.nextBlock,G=D.wasStartOfBlock,H=D.wasEndOfBlock,I;if(F){I=F.getParent();if(I.is('li')){F.breakParent(I);F.move(F.getNext(),1);}}else if(E&&(I=E.getParent())&&I.is('li')){E.breakParent(I);I=E.getNext();v.moveToElementEditStart(I);E.move(E.getPrevious());}if(!G&&!H){if(F.is('li')&&(I=F.getFirst(d.walker.invisible(true)))&&I.is&&I.is('ul','ol'))(c?x.createText('\xa0'):x.createElement('br')).insertBefore(I);if(F)v.moveToElementEditStart(F);}else{var J,K;if(E){if(E.is('li')||!(p.test(E.getName())||E.is('pre'))){J=E.clone();J.is('li')&&J.removeAttribute('value');}}else if(F)J=F.clone();if(!J){if(I&&I.is('li'))J=I;else{J=x.createElement(C);if(E&&(K=E.getDirection()))J.setAttribute('dir',K);}}else if(w&&!J.is('li'))J.renameNode(C);var L=D.elementPath;if(L)for(var M=0,N=L.elements.length;M0;v--)u[v].deleteContents();return u[0];};})();(function(){var m='nbsp,gt,lt,amp',n='quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro',o='Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml',p='Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv'; -function q(r,s){var t={},u=[],v={nbsp:'\xa0',shy:'­',gt:'>',lt:'<',amp:'&'};r=r.replace(/\b(nbsp|shy|gt|lt|amp)(?:,|$)/g,function(A,B){var C=s?'&'+B+';':v[B],D=s?v[B]:'&'+B+';';t[C]=D;u.push(C);return '';});if(!s&&r){r=r.split(',');var w=document.createElement('div'),x;w.innerHTML='&'+r.join(';&')+';';x=w.innerHTML;w=null;for(var y=0;y0;case 'checked':return!!q.$.checked;case 'value':var p=q.getAttribute('type');return p=='checkbox'||p=='radio'?q.$.value!='on':q.$.value;}return m.apply(q,arguments);};});(function(){var m={canUndo:false,exec:function(o){o.insertElement(o.document.createElement('hr'));}},n='horizontalrule';j.add(n,{init:function(o){o.addCommand(n,m);o.ui.addButton('HorizontalRule',{label:o.lang.horizontalrule,command:n});}});})();(function(){var m=/^[\t\r\n ]*(?: |\xa0)$/,n='{cke_protected}';function o(T){var U=T.children.length,V=T.children[U-1];while(V&&V.type==3&&!e.trim(V.value))V=T.children[--U];return V;};function p(T,U){var V=T.children,W=o(T);if(W){if((U||!c)&&W.type==1&&W.name=='br')V.pop();if(W.type==3&&m.test(W.value))V.pop();}};function q(T,U,V){if(!U&&(!V||typeof V=='function'&&V(T)===false))return false;if(U&&c&&(document.documentMode>7||T.name in f.tr||T.name in f.$listItem))return false;var W=o(T);return!W||W&&(W.type==1&&W.name=='br'||T.name=='form'&&W.name=='input');};function r(T,U){return function(V){p(V,!T);if(q(V,!T,U))if(T||c)V.add(new a.htmlParser.text('\xa0'));else V.add(new a.htmlParser.element('br',{}));};};var s=f,t=['caption','colgroup','col','thead','tfoot','tbody'],u=e.extend({},s.$block,s.$listItem,s.$tableContent);for(var v in u){if(!('br' in s[v]))delete u[v];}delete u.pre;var w={elements:{},attributeNames:[[/^on/,'data-cke-pa-on']]},x={elements:{}};for(v in u)x.elements[v]=r();var y={elementNames:[[/^cke:/,''],[/^\?xml:namespace$/,'']],attributeNames:[[/^data-cke-(saved|pa)-/,''],[/^data-cke-.*/,''],['hidefocus','']],elements:{$:function(T){var U=T.attributes;if(U){if(U['data-cke-temp'])return false;var V=['name','href','src'],W;for(var X=0;Xe.indexOf(t,W.name)?1:-1:0;});},embed:function(T){var U=T.parent;if(U&&U.name=='object'){var V=U.attributes.width,W=U.attributes.height;V&&(T.attributes.width=V);W&&(T.attributes.height=W);}},param:function(T){T.children=[];T.isEmpty=true;return T;},a:function(T){if(!(T.children.length||T.attributes.name||T.attributes['data-cke-saved-name']))return false;},span:function(T){if(T.attributes['class']=='Apple-style-span')delete T.name;},pre:function(T){c&&p(T);},html:function(T){delete T.attributes.contenteditable;delete T.attributes['class'];},body:function(T){delete T.attributes.spellcheck;delete T.attributes.contenteditable;},style:function(T){var U=T.children[0];U&&U.value&&(U.value=e.trim(U.value));if(!T.attributes.type)T.attributes.type='text/css';},title:function(T){var U=T.children[0];U&&(U.value=T.attributes['data-cke-title']||'');}},attributes:{'class':function(T,U){return e.ltrim(T.replace(/(?:^|\s+)cke_[^\s]*/g,''))||false;}}};if(c)y.attributes.style=function(T,U){return T.replace(/(^|;)([^\:]+)/g,function(V){return V.toLowerCase();});};function z(T){var U=T.attributes;if(U.contenteditable!='false')U['data-cke-editable']=U.contenteditable?'true':1;U.contenteditable='false';};function A(T){var U=T.attributes;switch(U['data-cke-editable']){case 'true':U.contenteditable='true';break;case '1':delete U.contenteditable;break;}};for(v in {input:1,textarea:1}){w.elements[v]=z;y.elements[v]=A;}var B=/<(a|area|img|input)\b([^>]*)>/gi,C=/\b(href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,D=/(?:])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,E=/([^<]*)<\/cke:encoded>/gi,F=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,G=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,H=/]*?)\/?>(?!\s*<\/cke:\1)/gi;function I(T){return T.replace(B,function(U,V,W){return '<'+V+W.replace(C,function(X,Y){if(W.indexOf('data-cke-saved-'+Y)==-1)return ' data-cke-saved-'+X+' '+X;return X;})+'>';});};function J(T){return T.replace(D,function(U){return ''+encodeURIComponent(U)+'';});};function K(T){return T.replace(E,function(U,V){return decodeURIComponent(V);});};function L(T){return T.replace(F,'$1cke:$2');};function M(T){return T.replace(G,'$1$2');};function N(T){return T.replace(H,'');};function O(T){return T.replace(/(]*>)(\r\n|\n)/g,'$1$2$2'); -};function P(T){return T.replace(//g,function(U){return '';});};function Q(T){return T.replace(//g,function(U,V){return decodeURIComponent(V);});};function R(T,U){var V=U._.dataStore;return T.replace(//g,function(W,X){return decodeURIComponent(X);}).replace(/\{cke_protected_(\d+)\}/g,function(W,X){return V&&V[X]||'';});};function S(T,U){var V=[],W=U.config.protectedSource,X=U._.dataStore||(U._.dataStore={id:1}),Y=/<\!--\{cke_temp(comment)?\}(\d*?)-->/g,Z=[//gi,//gi].concat(W);T=T.replace(//g,function(ab){return '';});for(var aa=0;aa';});T=T.replace(Y,function(ab,ac,ad){return '';});return T.replace(/(['"]).*?\1/g,function(ab){return ab.replace(//g,function(ac,ad){X[X.id]=decodeURIComponent(ad);return '{cke_protected_'+X.id++ +'}';});});};j.add('htmldataprocessor',{requires:['htmlwriter'],init:function(T){var U=T.dataProcessor=new a.htmlDataProcessor(T);U.writer.forceSimpleAmpersand=T.config.forceSimpleAmpersand;U.dataFilter.addRules(w);U.dataFilter.addRules(x);U.htmlFilter.addRules(y);var V={elements:{}};for(v in u)V.elements[v]=r(true,T.config.fillEmptyBlocks);U.htmlFilter.addRules(V);},onLoad:function(){!('fillEmptyBlocks' in i)&&(i.fillEmptyBlocks=1);}});a.htmlDataProcessor=function(T){var U=this;U.editor=T;U.writer=new a.htmlWriter();U.dataFilter=new a.htmlParser.filter();U.htmlFilter=new a.htmlParser.filter();};a.htmlDataProcessor.prototype={toHtml:function(T,U){T=S(T,this.editor);T=I(T);T=J(T);T=L(T);T=N(T);T=O(T);var V=new h('div');V.setHtml('a'+T);T=V.getHtml().substr(1);T=M(T);T=K(T);T=Q(T);var W=a.htmlParser.fragment.fromHtml(T,U),X=new a.htmlParser.basicWriter();W.writeHtml(X,this.dataFilter);T=X.getHtml(true);T=P(T);return T;},toDataFormat:function(T,U){var V=this.writer,W=a.htmlParser.fragment.fromHtml(T,U);V.reset();W.writeHtml(V,this.htmlFilter);var X=V.getHtml(true);X=Q(X);X=R(X,this.editor);return X;}};})();(function(){function m(n,o){var p=n.createFakeParserElement(o,'cke_iframe','iframe',true),q=p.attributes.style||'',r=o.attributes.width,s=o.attributes.height; -if(typeof r!='undefined')q+='width:'+e.cssLength(r)+';';if(typeof s!='undefined')q+='height:'+e.cssLength(s)+';';p.attributes.style=q;return p;};j.add('iframe',{requires:['dialog','fakeobjects'],init:function(n){var o='iframe',p=n.lang.iframe;a.dialog.add(o,this.path+'dialogs/iframe.js');n.addCommand(o,new a.dialogCommand(o));n.addCss('img.cke_iframe{background-image: url('+a.getUrl(this.path+'images/placeholder.png')+');'+'background-position: center center;'+'background-repeat: no-repeat;'+'border: 1px solid #a9a9a9;'+'width: 80px;'+'height: 80px;'+'}');n.ui.addButton('Iframe',{label:p.toolbar,command:o});n.on('doubleclick',function(q){var r=q.data.element;if(r.is('img')&&r.data('cke-real-element-type')=='iframe')q.data.dialog='iframe';});if(n.addMenuItems)n.addMenuItems({iframe:{label:p.title,command:'iframe',group:'image'}});if(n.contextMenu)n.contextMenu.addListener(function(q,r){if(q&&q.is('img')&&q.data('cke-real-element-type')=='iframe')return{iframe:2};});},afterInit:function(n){var o=n.dataProcessor,p=o&&o.dataFilter;if(p)p.addRules({elements:{iframe:function(q){return m(n,q);}}});}});})();j.add('image',{init:function(m){var n='image';a.dialog.add(n,this.path+'dialogs/image.js');m.addCommand(n,new a.dialogCommand(n));m.ui.addButton('Image',{label:m.lang.common.image,command:n});m.on('doubleclick',function(o){var p=o.data.element;if(p.is('img')&&!p.data('cke-realelement')&&!p.isReadOnly())o.data.dialog='image';});if(m.addMenuItems)m.addMenuItems({image:{label:m.lang.image.menu,command:'image',group:'image'}});if(m.contextMenu)m.contextMenu.addListener(function(o,p){if(!o||!o.is('img')||o.data('cke-realelement')||o.isReadOnly())return null;return{image:2};});}});i.image_removeLinkByEmptyURL=true;(function(){var m={ol:1,ul:1},n=d.walker.whitespaces(true),o=d.walker.bookmark(false,true);function p(t){var B=this;if(t.editor.readOnly)return null;var u=t.editor,v=t.data.path,w=v&&v.contains(m),x=v.block||v.blockLimit;if(w)return B.setState(2);if(!B.useIndentClasses&&B.name=='indent')return B.setState(2);if(!x)return B.setState(0);if(B.useIndentClasses){var y=x.$.className.match(B.classNameRegex),z=0;if(y){y=y[1];z=B.indentClassMap[y];}if(B.name=='outdent'&&!z||B.name=='indent'&&z==u.config.indentClasses.length)return B.setState(0);return B.setState(2);}else{var A=parseInt(x.getStyle(r(x)),10);if(isNaN(A))A=0;if(A<=0)return B.setState(0);return B.setState(2);}};function q(t,u){var w=this;w.name=u;w.useIndentClasses=t.config.indentClasses&&t.config.indentClasses.length>0; -if(w.useIndentClasses){w.classNameRegex=new RegExp('(?:^|\\s+)('+t.config.indentClasses.join('|')+')(?=$|\\s)');w.indentClassMap={};for(var v=0;vY;T++)X[T].indent+=U;var aa=j.list.arrayToList(X,v,null,t.config.enterMode,M.getDirection());if(u.name=='outdent'){var ab;if((ab=M.getParent())&&ab.is('li')){var ac=aa.listNode.getChildren(),ad=[],ae=ac.count(),af;for(T=ae-1;T>=0;T--){if((af=ac.getItem(T))&&af.is&&af.is('li'))ad.push(af);}}}if(aa)aa.listNode.replace(M);if(ad&&ad.length)for(T=0;T0)M.addClass(t.config.indentClasses[P-1]);}else{var Q=r(M,N),R=parseInt(M.getStyle(Q),10);if(isNaN(R))R=0;var S=t.config.indentOffset||40;R+=(u.name=='indent'?1:-1)*S;if(R<0)return false;R=Math.max(R,0);R=Math.ceil(R/S)*S;M.setStyle(Q,R?R+(t.config.indentUnit||'px'):''); -if(M.getAttribute('style')==='')M.removeAttribute('style');}h.setMarker(v,M,'indent_processed',1);return true;};var z=t.getSelection(),A=z.createBookmarks(1),B=z&&z.getRanges(1),C,D=B.createIterator();while(C=D.getNextRange()){var E=C.getCommonAncestor(),F=E;while(F&&!(F.type==1&&m[F.getName()]))F=F.getParent();if(!F){var G=C.getEnclosedNode();if(G&&G.type==1&&G.getName() in m){C.setStartAt(G,1);C.setEndAt(G,2);F=G;}}if(F&&C.startContainer.type==1&&C.startContainer.getName() in m){var H=new d.walker(C);H.evaluator=s;C.startContainer=H.next();}if(F&&C.endContainer.type==1&&C.endContainer.getName() in m){H=new d.walker(C);H.evaluator=s;C.endContainer=H.previous();}if(F){var I=F.getFirst(s),J=!!I.getNext(s),K=C.startContainer,L=I.equals(K)||I.contains(K);if(!(L&&(u.name=='indent'||u.useIndentClasses||parseInt(F.getStyle(r(F)),10))&&y(F,!J&&I.getDirection())))w(F);}else x();}h.clearAllMarkers(v);t.forceNextSelectionCheck();z.selectBookmarks(A);}};j.add('indent',{init:function(t){var u=t.addCommand('indent',new q(t,'indent')),v=t.addCommand('outdent',new q(t,'outdent'));t.ui.addButton('Indent',{label:t.lang.indent,command:'indent'});t.ui.addButton('Outdent',{label:t.lang.outdent,command:'outdent'});t.on('selectionChange',e.bind(p,u));t.on('selectionChange',e.bind(p,v));if(b.ie6Compat||b.ie7Compat)t.addCss('ul,ol{\tmargin-left: 0px;\tpadding-left: 40px;}');t.on('dirChanged',function(w){var x=new d.range(t.document);x.setStartBefore(w.data.node);x.setEndAfter(w.data.node);var y=new d.walker(x),z;while(z=y.next()){if(z.type==1){if(!z.equals(w.data.node)&&z.getDirection()){x.setStartAfter(z);y=new d.walker(x);continue;}var A=t.config.indentClasses;if(A){var B=w.data.dir=='ltr'?['_rtl','']:['','_rtl'];for(var C=0;C=0;A--){x=v[A].createIterator();x.enlargeBr=t!=2;while(y=x.getNextParagraph(t==1?'p':'div')){y.removeAttribute('align');y.removeStyle('text-align');var B=w&&(y.$.className=e.ltrim(y.$.className.replace(D.cssClassRegex,''))),C=D.state==2&&(!z||n(y,true)!=D.value);if(w){if(C)y.addClass(w);else if(!B)y.removeAttribute('class');}else if(C)y.setStyle('text-align',D.value);}}r.focus();r.forceNextSelectionCheck();s.selectBookmarks(u);}};j.add('justify',{init:function(r){var s=new p(r,'justifyleft','left'),t=new p(r,'justifycenter','center'),u=new p(r,'justifyright','right'),v=new p(r,'justifyblock','justify');r.addCommand('justifyleft',s);r.addCommand('justifycenter',t);r.addCommand('justifyright',u);r.addCommand('justifyblock',v);r.ui.addButton('JustifyLeft',{label:r.lang.justify.left,command:'justifyleft'});r.ui.addButton('JustifyCenter',{label:r.lang.justify.center,command:'justifycenter'});r.ui.addButton('JustifyRight',{label:r.lang.justify.right,command:'justifyright'});r.ui.addButton('JustifyBlock',{label:r.lang.justify.block,command:'justifyblock'});r.on('selectionChange',e.bind(o,s));r.on('selectionChange',e.bind(o,u));r.on('selectionChange',e.bind(o,t));r.on('selectionChange',e.bind(o,v)); -r.on('dirChanged',q);},requires:['domiterator']});})();j.add('keystrokes',{beforeInit:function(m){m.keystrokeHandler=new a.keystrokeHandler(m);m.specialKeys={};},init:function(m){var n=m.config.keystrokes,o=m.config.blockedKeystrokes,p=m.keystrokeHandler.keystrokes,q=m.keystrokeHandler.blockedKeystrokes;for(var r=0;r7))O.append(J.createText('\xa0'));O.append(V.listNode);M=V.nextIndex;}else if(R.indent==-1&&!G&&R.grandparent){if(m[R.grandparent.getName()]){O=R.element.clone(false,true);P=R.element.getDirection(1);R.grandparent.getDirection(1)!=P&&O.setAttribute('dir',P);}else if(I||R.element.hasAttributes()||H!=2){O=J.createElement(Q);R.element.copyAttributes(O,{type:1,value:1});P=R.element.getDirection()||I;P&&O.setAttribute('dir',P);if(!I&&H==2&&!O.hasAttributes())O=new d.documentFragment(J);}else O=new d.documentFragment(J);for(S=0;SH[J-1].indent+1){var N=H[J-1].indent+1-H[J].indent,O=H[J].indent;while(H[J]&&H[J].indent>=O){H[J].indent+=N;J++;}J--;}}var P=j.list.arrayToList(H,G,null,E.config.enterMode,F.root.getAttribute('dir')),Q=P.listNode,R,S;function T(U){if((R=Q[U?'getFirst':'getLast']())&&!(R.is&&R.isBlockBoundary())&&(S=F.root[U?'getPrevious':'getNext'](d.walker.whitespaces(true)))&&!(S.is&&S.isBlockBoundary({br:1})))E.document.createElement('br')[U?'insertBefore':'insertAfter'](R);};T(true);T();Q.replace(F.root);};function w(E,F){this.name=E;this.type=F;};w.prototype={exec:function(E){var F=E.document,G=E.config,H=E.getSelection(),I=H&&H.getRanges(true);if(!I||I.length<1)return;if(this.state==2){var J=F.getBody();if(!J.getFirst(q)){G.enterMode==2?J.appendBogus():I[0].fixBlock(1,G.enterMode==1?'p':'div');H.selectRanges(I);}else{var K=I.length==1&&I[0],L=K&&K.getEnclosedNode();if(L&&L.is&&this.type==L.getName())this.setState(1);}}var M=H.createBookmarks(true),N=[],O={},P=I.createIterator(),Q=0;while((K=P.getNextRange())&&++Q){var R=K.getBoundaryNodes(),S=R.startNode,T=R.endNode;if(S.type==1&&S.getName()=='td')K.setStartAt(R.startNode,1);if(T.type==1&&T.getName()=='td')K.setEndAt(R.endNode,2);var U=K.createIterator(),V;U.forceBrBreak=this.state==2;while(V=U.getNextParagraph()){if(V.getCustomData('list_block'))continue;else h.setMarker(O,V,'list_block',1);var W=new d.elementPath(V),X=W.elements,Y=X.length,Z=null,aa=0,ab=W.blockLimit,ac;for(var ad=Y-1;ad>=0&&(ac=X[ad]);ad--){if(m[ac.getName()]&&ab.contains(ac)){ab.removeCustomData('list_group_object_'+Q);var ae=ac.getCustomData('list_group_object');if(ae)ae.contents.push(V);else{ae={root:ac,contents:[V]};N.push(ae);h.setMarker(O,ac,'list_group_object',ae);}aa=1;break;}}if(aa)continue;var af=ab;if(af.getCustomData('list_group_object_'+Q))af.getCustomData('list_group_object_'+Q).contents.push(V);else{ae={root:af,contents:[V]};h.setMarker(O,af,'list_group_object_'+Q,ae);N.push(ae);}}}var ag=[];while(N.length>0){ae=N.shift();if(this.state==2){if(m[ae.root.getName()])s.call(this,E,ae,O,ag);else u.call(this,E,ae,ag);}else if(this.state==1&&m[ae.root.getName()])v.call(this,E,ae,O);}for(ad=0;ad0)for(var u=t.length-1;u>=0;u--){var v=t[u][0],w=t[u][1];if(w)v.insertBefore(w);else v.appendTo(s);}};function o(s,t){var u=m(s),v={},w=s.$;if(!t){v['class']=w.className||''; -w.className='';}v.inline=w.style.cssText||'';if(!t)w.style.cssText='position: static; overflow: visible';n(u);return v;};function p(s,t){var u=m(s),v=s.$;if('class' in t)v.className=t['class'];if('inline' in t)v.style.cssText=t.inline;n(u);};function q(s){var t=a.instances;for(var u in t){var v=t[u];if(v.mode=='wysiwyg'&&!v.readOnly){var w=v.document.getBody();w.setAttribute('contentEditable',false);w.setAttribute('contentEditable',true);}}if(s.focusManager.hasFocus){s.toolbox.focus();s.focus();}};function r(s){if(!c||b.version>6)return null;var t=h.createFromHtml('');return s.append(t,true);};j.add('maximize',{init:function(s){var t=s.lang,u=a.document,v=u.getWindow(),w,x,y,z;function A(){var C=v.getViewPaneSize();z&&z.setStyles({width:C.width+'px',height:C.height+'px'});s.resize(C.width,C.height,null,true);};var B=2;s.addCommand('maximize',{modes:{wysiwyg:1,source:1},readOnly:1,editorFocus:false,exec:function(){var C=s.container.getChild(1),D=s.getThemeSpace('contents');if(s.mode=='wysiwyg'){var E=s.getSelection();w=E&&E.getRanges();x=v.getScrollPosition();}else{var F=s.textarea.$;w=!c&&[F.selectionStart,F.selectionEnd];x=[F.scrollLeft,F.scrollTop];}if(this.state==2){v.on('resize',A);y=v.getScrollPosition();var G=s.container;while(G=G.getParent()){G.setCustomData('maximize_saved_styles',o(G));G.setStyle('z-index',s.config.baseFloatZIndex-1);}D.setCustomData('maximize_saved_styles',o(D,true));C.setCustomData('maximize_saved_styles',o(C,true));var H={overflow:b.webkit?'':'hidden',width:0,height:0};u.getDocumentElement().setStyles(H);!b.gecko&&u.getDocumentElement().setStyle('position','fixed');!(b.gecko&&b.quirks)&&u.getBody().setStyles(H);c?setTimeout(function(){v.$.scrollTo(0,0);},0):v.$.scrollTo(0,0);C.setStyle('position',b.gecko&&b.quirks?'fixed':'absolute');C.$.offsetLeft;C.setStyles({'z-index':s.config.baseFloatZIndex-1,left:'0px',top:'0px'});z=r(C);C.removeClass('cke_minimized');C.addClass('cke_maximized');A();var I=C.getDocumentPosition();C.setStyles({left:-1*I.x+'px',top:-1*I.y+'px'});b.gecko&&q(s);}else if(this.state==1){v.removeListener('resize',A);var J=[D,C];for(var K=0;K ');s.children.length=0;s.add(u);var v=s.attributes;delete v['aria-label'];delete v.contenteditable;delete v.title; -}return t;}}},5);if(p)p.addRules({elements:{div:function(r){var s=r.attributes,t=s&&s.style,u=t&&r.children.length==1&&r.children[0],v=u&&u.name=='span'&&u.attributes.style;if(v&&/page-break-after\s*:\s*always/i.test(t)&&/display\s*:\s*none/i.test(v)){s.contenteditable='false';s['class']='cke_pagebreak';s['data-cke-display-name']='pagebreak';s['aria-label']=n;s.title=n;r.children.length=0;}}}});},requires:['fakeobjects']});j.pagebreakCmd={exec:function(m){var n=m.lang.pagebreakAlt,o=h.createFromHtml('
    '+'
    '),p=m.getSelection().getRanges(true);m.fire('saveSnapshot');for(var q,r=p.length-1;r>=0;r--){q=p[r];if(r1&&n.substr(n.length-1,1)=='%')n=parseInt(window.screen.width*parseInt(n,10)/100,10);if(typeof o=='string'&&o.length>1&&o.substr(o.length-1,1)=='%')o=parseInt(window.screen.height*parseInt(o,10)/100,10);if(n<640)n=640;if(o<420)o=420;var q=parseInt((window.screen.height-o)/2,10),r=parseInt((window.screen.width-n)/2,10);p=(p||'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes')+',width='+n+',height='+o+',top='+q+',left='+r;var s=window.open('',null,p,true);if(!s)return false;try{s.moveTo(r,q);s.resizeTo(n,o);s.focus();s.location.href=m;}catch(t){s=window.open(m,null,p,true);}return true;}});(function(){var m={modes:{wysiwyg:1,source:1},canUndo:false,readOnly:1,exec:function(o){var p,q=o.config,r=q.baseHref?'':'',s=b.isCustomDomain();if(q.fullPage)p=o.getData().replace(//,'$&'+r).replace(/[^>]*(?=<\/title>)/,'$& — '+o.lang.preview);else{var t=''+''+r+''+o.lang.preview+''+e.buildStyleHtml(o.config.contentsCss)+''+t+o.getData()+'';}var v=640,w=420,x=80;try{var y=window.screen;v=Math.round(y.width*0.8);w=Math.round(y.height*0.7);x=Math.round(y.width*0.1);}catch(B){}var z='';if(s){window._cke_htmlToLoad=p;z='javascript:void( (function(){document.open();document.domain="'+document.domain+'";'+'document.write( window.opener._cke_htmlToLoad );'+'document.close();'+'window.opener._cke_htmlToLoad = null;'+'})() )';}var A=window.open(z,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+v+',height='+w+',left='+x);if(!s){A.document.open();A.document.write(p); -A.document.close();}}},n='preview';j.add(n,{init:function(o){o.addCommand(n,m);o.ui.addButton('Preview',{label:o.lang.preview,command:n});}});})();j.add('print',{init:function(m){var n='print',o=m.addCommand(n,j.print);m.ui.addButton('Print',{label:m.lang.print,command:n});}});j.print={exec:function(m){if(b.opera)return;else if(b.gecko)m.window.$.print();else m.document.$.execCommand('Print');},canUndo:false,readOnly:1,modes:{wysiwyg:!b.opera}};j.add('removeformat',{requires:['selection'],init:function(m){m.addCommand('removeFormat',j.removeformat.commands.removeformat);m.ui.addButton('RemoveFormat',{label:m.lang.removeFormat,command:'removeFormat'});m._.removeFormat={filters:[]};}});j.removeformat={commands:{removeformat:{exec:function(m){var n=m._.removeFormatRegex||(m._.removeFormatRegex=new RegExp('^(?:'+m.config.removeFormatTags.replace(/,/g,'|')+')$','i')),o=m._.removeAttributes||(m._.removeAttributes=m.config.removeFormatAttributes.split(',')),p=j.removeformat.filter,q=m.getSelection().getRanges(1),r=q.createIterator(),s;while(s=r.getNextRange()){if(!s.collapsed)s.enlarge(1);var t=s.createBookmark(),u=t.startNode,v=t.endNode,w,x=function(z){var A=new d.elementPath(z),B=A.elements;for(var C=1,D;D=B[C];C++){if(D.equals(A.block)||D.equals(A.blockLimit))break;if(n.test(D.getName())&&p(m,D))z.breakParent(D);}};x(u);if(v){x(v);w=u.getNextSourceNode(true,1);while(w){if(w.equals(v))break;var y=w.getNextSourceNode(false,1);if(!(w.getName()=='img'&&w.data('cke-realelement'))&&p(m,w))if(n.test(w.getName()))w.remove(1);else{w.removeAttributes(o);m.fire('removeFormatCleanup',w);}w=y;}}s.moveToBookmark(t);}m.getSelection().selectRanges(q);}}},filter:function(m,n){var o=m._.removeFormat.filters;for(var p=0;pr.width&&(n.resize_minWidth=r.width);n.resize_minHeight>r.height&&(n.resize_minHeight=r.height);a.document.on('mousemove',u);a.document.on('mouseup',v);if(m.document){m.document.on('mousemove',u);m.document.on('mouseup',v);}});m.on('destroy',function(){e.removeFunction(w);});m.on('themeSpace',function(x){if(x.data.space=='bottom'){var y='';if(s&&!t)y=' cke_resizer_horizontal';if(!s&&t)y=' cke_resizer_vertical';var z='
    ';o=='ltr'&&y=='ltr'?x.data.html+=z:x.data.html=z+x.data.html;}},m,null,100);}}});(function(){var m={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(o){var p=o.element.$.form;if(p)try{p.submit();}catch(q){if(p.submit.click)p.submit.click();}}},n='save';j.add(n,{init:function(o){var p=o.addCommand(n,m);p.modes={wysiwyg:!!o.element.$.form};o.ui.addButton('Save',{label:o.lang.save,command:n});}});})();(function(){var m='scaytcheck',n='';function o(t,u){var v=0,w;for(w in u){if(u[w]==t){v=1;break;}}return v;};var p=function(){var t=this,u=function(){var y=t.config,z={};z.srcNodeRef=t.document.getWindow().$.frameElement;z.assocApp='CKEDITOR.'+a.version+'@'+a.revision;z.customerid=y.scayt_customerid||'1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';z.customDictionaryIds=y.scayt_customDictionaryIds||'';z.userDictionaryName=y.scayt_userDictionaryName||'';z.sLang=y.scayt_sLang||'en_US';z.onLoad=function(){if(!(c&&b.version<8))this.addStyle(this.selectorCss(),'padding-bottom: 2px !important;');if(t.focusManager.hasFocus&&!q.isControlRestored(t))this.focus();};z.onBeforeChange=function(){if(q.getScayt(t)&&!t.checkDirty())setTimeout(function(){t.resetDirty();},0);};var A=window.scayt_custom_params;if(typeof A=='object')for(var B in A)z[B]=A[B];if(q.getControlId(t))z.id=q.getControlId(t); -var C=new window.scayt(z);C.afterMarkupRemove.push(function(E){new h(E,C.document).mergeSiblings();});var D=q.instances[t.name];if(D){C.sLang=D.sLang;C.option(D.option());C.paused=D.paused;}q.instances[t.name]=C;try{C.setDisabled(q.isPaused(t)===false);}catch(E){}t.fire('showScaytState');};t.on('contentDom',u);t.on('contentDomUnload',function(){var y=a.document.getElementsByTag('script'),z=/^dojoIoScript(\d+)$/i,A=/^https?:\/\/svc\.spellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i;for(var B=0;B=0){this.setState(0);q.loadEngine(t);}}};j.add('scayt',{requires:['menubutton'],beforeInit:function(t){var u=t.config.scayt_contextMenuItemsOrder||'suggest|moresuggest|control',v=''; -u=u.split('|');if(u&&u.length)for(var w=0;w tr > td, .%1 table.%2 > tr > th,','.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,','.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,','.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th','{','border : #d3d3d3 1px dotted','}']).join('');n=o.replace(/%2/g,m).replace(/%1/g,'cke_show_borders ');var p={preserveState:true,editorFocus:false,readOnly:1,exec:function(q){this.toggleState();this.refresh(q);},refresh:function(q){if(q.document){var r=this.state==1?'addClass':'removeClass';q.document.getBody()[r]('cke_show_borders');}}};j.add('showborders',{requires:['wysiwygarea'],modes:{wysiwyg:1},init:function(q){var r=q.addCommand('showborders',p);r.canUndo=false;if(q.config.startupShowBorders!==false)r.setState(1);q.addCss(n);q.on('mode',function(){if(r.state!=0)r.refresh(q);},null,null,100);q.on('contentDom',function(){if(r.state!=0)r.refresh(q);});q.on('removeFormatCleanup',function(s){var t=s.data;if(q.getCommand('showborders').state==1&&t.is('table')&&(!t.hasAttribute('border')||parseInt(t.getAttribute('border'),10)<=0))t.addClass(m);});},afterInit:function(q){var r=q.dataProcessor,s=r&&r.dataFilter,t=r&&r.htmlFilter;if(s)s.addRules({elements:{table:function(u){var v=u.attributes,w=v['class'],x=parseInt(v.border,10);if(!x||x<=0)v['class']=(w||'')+' '+m;}}});if(t)t.addRules({elements:{table:function(u){var v=u.attributes,w=v['class'];w&&(v['class']=w.replace(m,'').replace(/\s{2}/,' ').replace(/^\s+|\s+$/,''));}}});}});a.on('dialogDefinition',function(q){var r=q.data.name;if(r=='table'||r=='tableProperties'){var s=q.data.definition,t=s.getContents('info'),u=t.get('txtBorder'),v=u.commit;u.commit=e.override(v,function(y){return function(z,A){y.apply(this,arguments); -var B=parseInt(this.getValue(),10);A[!B||B<=0?'addClass':'removeClass'](m);};});var w=s.getContents('advanced'),x=w&&w.get('advCSSClasses');if(x){x.setup=e.override(x.setup,function(y){return function(){y.apply(this,arguments);this.setValue(this.getValue().replace(/cke_show_border/,''));};});x.commit=e.override(x.commit,function(y){return function(z,A){y.apply(this,arguments);if(!parseInt(A.getAttribute('border'),10))A.addClass('cke_show_border');};});}}});})();j.add('sourcearea',{requires:['editingblock'],init:function(m){var n=j.sourcearea,o=a.document.getWindow();m.on('editingBlockReady',function(){var p,q;m.addMode('source',{load:function(r,s){if(c&&b.version<8)r.setStyle('position','relative');m.textarea=p=new h('textarea');p.setAttributes({dir:'ltr',tabIndex:b.webkit?-1:m.tabIndex,role:'textbox','aria-label':m.lang.editorTitle.replace('%1',m.name)});p.addClass('cke_source');p.addClass('cke_enable_context_menu');m.readOnly&&p.setAttribute('readOnly','readonly');var t={width:b.ie7Compat?'99%':'100%',height:'100%',resize:'none',outline:'none','text-align':'left'};if(c){q=function(){p.hide();p.setStyle('height',r.$.clientHeight+'px');p.setStyle('width',r.$.clientWidth+'px');p.show();};m.on('resize',q);o.on('resize',q);setTimeout(q,0);}r.setHtml('');r.append(p);p.setStyles(t);m.fire('ariaWidget',p);p.on('blur',function(){m.focusManager.blur();});p.on('focus',function(){m.focusManager.focus();});m.mayBeDirty=true;this.loadData(s);var u=m.keystrokeHandler;if(u)u.attach(p);setTimeout(function(){m.mode='source';m.fire('mode');},b.gecko||b.webkit?100:0);},loadData:function(r){p.setValue(r);m.fire('dataReady');},getData:function(){return p.getValue();},getSnapshotData:function(){return p.getValue();},unload:function(r){p.clearCustomData();m.textarea=p=null;if(q){m.removeListener('resize',q);o.removeListener('resize',q);}if(c&&b.version<8)r.removeStyle('position');},focus:function(){p.focus();}});});m.on('readOnly',function(){if(m.mode=='source')if(m.readOnly)m.textarea.setAttribute('readOnly','readonly');else m.textarea.removeAttribute('readOnly');});m.addCommand('source',n.commands.source);if(m.ui.addButton)m.ui.addButton('Source',{label:m.lang.source,command:'source'});m.on('mode',function(){m.getCommand('source').setState(m.mode=='source'?1:2);});}});j.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:false,readOnly:1,exec:function(m){if(m.mode=='wysiwyg')m.fire('saveSnapshot');m.getCommand('source').setState(0);m.setMode(m.mode=='source'?'wysiwyg':'source'); -},canUndo:false}}};(function(){j.add('stylescombo',{requires:['richcombo','styles'],init:function(n){var o=n.config,p=n.lang.stylesCombo,q={},r=[],s;function t(u){n.getStylesSet(function(v){if(!r.length){var w,x;for(var y=0,z=v.length;y0)return;if(T.type==1&&m.test(T.getName())&&!T.getCustomData('selected_cell')){h.setMarker(K,T,'selected_cell',true);J.push(T);}};for(var M=0;M1&&V&&U[Y]==V[Y]){Z=U[Y];Z.rowSpan+=1;}else{Z=new h(U[Y]).clone();Z.removeAttribute('rowSpan');!c&&Z.appendBogus();X.append(Z);Z=Z.$;}Y+=Z.colSpan-1;}H?X.insertBefore(S):X.insertAfter(S);};function q(G){if(G instanceof d.selection){var H=n(G),I=H[0],J=I.getAscendant('table'),K=e.buildTableMap(J),L=H[0].getParent(),M=L.$.rowIndex,N=H[H.length-1],O=N.getParent().$.rowIndex+N.$.rowSpan-1,P=[];for(var Q=M;Q<=O;Q++){var R=K[Q],S=new h(J.$.rows[Q]);for(var T=0;T=0;Q--)q(P[Q]);return Y;}else if(G instanceof h){J=G.getAscendant('table');if(J.$.rows.length==1)J.remove();else G.remove(); -}return null;};function r(G,H){var I=G.getParent(),J=I.$.cells,K=0;for(var L=0;LI)I=K;}return I;};function t(G,H){var I=n(G),J=I[0],K=J.getAscendant('table'),L=s(I,1),M=s(I),N=H?L:M,O=e.buildTableMap(K),P=[],Q=[],R=O.length;for(var S=0;S1&&Q.length&&Q[S]==P[S]){U=P[S];U.colSpan+=1;}else{U=new h(P[S]).clone();U.removeAttribute('colSpan');!c&&U.appendBogus();U[H?'insertBefore':'insertAfter'].call(U,new h(P[S]));U=U.$;}S+=U.rowSpan-1;}};function u(G){var H=n(G),I=H[0],J=H[H.length-1],K=I.getAscendant('table'),L=e.buildTableMap(K),M,N,O=[];for(var P=0,Q=L.length;P1){L=H[J-1]+1;break;}}if(!L)L=H[0]>0?H[0]-1:H[H.length-1]+1;var N=I.$.rows;for(J=0,K=N.length;J=0;K--)x(H[K]);if(J)z(J,true);else if(I)I.remove();}else if(G instanceof h){var L=G.getParent();if(L.getChildCount()==1)L.remove();else G.remove();}};function y(G){var H=G.getBogus();H&&H.remove();G.trim();};function z(G,H){var I=new d.range(G.getDocument());if(!I['moveToElementEdit'+(H?'End':'Start')](G)){I.selectNodeContents(G);I.collapse(H?false:true);}I.select(true);};function A(G,H,I){var J=G[H];if(typeof I=='undefined')return J;for(var K=0;J&&K=Q)M.removeAttribute('rowSpan');else M.$.rowSpan=Y;if(Y>=P)M.removeAttribute('colSpan');else M.$.colSpan=Z;var ak=new d.nodeList(N.$.rows),al=ak.count();for(ac=al-1;ac>=0;ac--){var am=ak.getItem(ac);if(!am.$.cells.length){am.remove();al++;continue;}}return M;}else return Y*Z==ab;};function D(G,H){var I=n(G);if(I.length>1)return false;else if(H)return true;var J=I[0],K=J.getParent(),L=K.getAscendant('table'),M=e.buildTableMap(L),N=K.$.rowIndex,O=A(M,N,J),P=J.$.rowSpan,Q,R,S,T;if(P>1){R=Math.ceil(P/2);S=Math.floor(P/2);T=N+R;var U=new h(L.$.rows[T]),V=A(M,T),W;Q=J.clone();for(var X=0;XO){Q.insertBefore(new h(W));break;}else W=null;}if(!W)U.append(Q,true);}else{S=R=1;U=K.clone();U.insertAfter(K);U.append(Q=J.clone());var Y=A(M,N);for(var Z=0;Z1)return false;else if(H)return true;var J=I[0],K=J.getParent(),L=K.getAscendant('table'),M=e.buildTableMap(L),N=K.$.rowIndex,O=A(M,N,J),P=J.$.colSpan,Q,R,S;if(P>1){R=Math.ceil(P/2);S=Math.floor(P/2);}else{S=R=1;var T=B(M,O);for(var U=0;U0?2:0};}},tablecell_insertBefore:{label:H.cell.insertBefore,group:'tablecell',command:'cellInsertBefore',order:5},tablecell_insertAfter:{label:H.cell.insertAfter,group:'tablecell',command:'cellInsertAfter',order:10},tablecell_delete:{label:H.cell.deleteCell,group:'tablecell',command:'cellDelete',order:15},tablecell_merge:{label:H.cell.merge,group:'tablecell',command:'cellMerge',order:16},tablecell_merge_right:{label:H.cell.mergeRight,group:'tablecell',command:'cellMergeRight',order:17},tablecell_merge_down:{label:H.cell.mergeDown,group:'tablecell',command:'cellMergeDown',order:18},tablecell_split_horizontal:{label:H.cell.splitHorizontal,group:'tablecell',command:'cellHorizontalSplit',order:19},tablecell_split_vertical:{label:H.cell.splitVertical,group:'tablecell',command:'cellVerticalSplit',order:20},tablecell_properties:{label:H.cell.title,group:'tablecellproperties',command:'cellProperties',order:21},tablerow:{label:H.row.menu,group:'tablerow',order:1,getItems:function(){return{tablerow_insertBefore:2,tablerow_insertAfter:2,tablerow_delete:2}; -}},tablerow_insertBefore:{label:H.row.insertBefore,group:'tablerow',command:'rowInsertBefore',order:5},tablerow_insertAfter:{label:H.row.insertAfter,group:'tablerow',command:'rowInsertAfter',order:10},tablerow_delete:{label:H.row.deleteRow,group:'tablerow',command:'rowDelete',order:15},tablecolumn:{label:H.column.menu,group:'tablecolumn',order:1,getItems:function(){return{tablecolumn_insertBefore:2,tablecolumn_insertAfter:2,tablecolumn_delete:2};}},tablecolumn_insertBefore:{label:H.column.insertBefore,group:'tablecolumn',command:'columnInsertBefore',order:5},tablecolumn_insertAfter:{label:H.column.insertAfter,group:'tablecolumn',command:'columnInsertAfter',order:10},tablecolumn_delete:{label:H.column.deleteColumn,group:'tablecolumn',command:'columnDelete',order:15}});if(G.contextMenu)G.contextMenu.addListener(function(I,J){if(!I||I.isReadOnly())return null;while(I){if(I.getName() in F)return{tablecell:2,tablerow:2,tablecolumn:2};I=I.getParent();}return null;});},getSelectedCells:n};j.add('tabletools',j.tabletools);})();e.buildTableMap=function(m){var n=m.$.rows,o=-1,p=[];for(var q=0;qp&&(!s||!t||vt){s=v;t=u;}}else{if(q&&u==p){s=v;break;}if(ut)){s=v;t=u;}}}if(s)s.focus();};(function(){j.add('templates',{requires:['dialog'],init:function(o){a.dialog.add('templates',a.getUrl(this.path+'dialogs/templates.js'));o.addCommand('templates',new a.dialogCommand('templates'));o.ui.addButton('Templates',{label:o.lang.templates.button,command:'templates'});}});var m={},n={};a.addTemplates=function(o,p){m[o]=p;};a.getTemplates=function(o){return m[o];};a.loadTemplates=function(o,p){var q=[];for(var r=0,s=o.length;r':' style="display:none">');t.push('',o.lang.toolbars,'');var w=o.toolbox.toolbars,x=o.config.toolbar instanceof Array?o.config.toolbar:o.config['toolbar_'+o.config.toolbar];for(var y=0;y');v=0;}if(C==='/'){t.push('
    ');continue;}D=C.items||C;for(var E=0;E');B&&t.push('',B,'');t.push('');var I=w.push(A)-1;if(I>0){A.previous=w[I-1];A.previous.next=A;}}if(H){if(!v){t.push('');v=1;}}else if(v){t.push('');v=0;}var J=F.render(o,t);I=A.items.push(J)-1;if(I>0){J.previous=A.items[I-1];J.previous.next=J;}J.toolbar=A;J.onkey=q;J.onfocus=function(){if(!o.toolbox.focusCommandExecuted)o.focus();};}}if(v){t.push('');v=0;}if(A)t.push('');}t.push('');if(o.config.toolbarCanCollapse){var K=e.addFunction(function(){o.execCommand('toolbarCollapse');});o.on('destroy',function(){e.removeFunction(K);});var L=e.getNextId();o.addCommand('toolbarCollapse',{readOnly:1,exec:function(M){var N=a.document.getById(L),O=N.getPrevious(),P=M.getThemeSpace('contents'),Q=O.getParent(),R=parseInt(P.$.style.height,10),S=Q.$.offsetHeight,T=!O.isVisible();if(!T){O.hide();N.addClass('cke_toolbox_collapser_min');N.setAttribute('title',M.lang.toolbarExpand);}else{O.show();N.removeClass('cke_toolbox_collapser_min');N.setAttribute('title',M.lang.toolbarCollapse);}N.getFirst().setText(T?'▲':'◀');var U=Q.$.offsetHeight-S;P.setStyle('height',R-U+'px');M.fire('resize');},modes:{wysiwyg:1,source:1}});t.push('','','');}r.data.html+=t.join('');}});o.on('destroy',function(){var r,s=0,t,u,v;r=this.toolbox.toolbars;for(;s');return{};}};}});}});})();a.UI_SEPARATOR='separator';i.toolbarLocation='top';i.toolbar_Basic=[['Bold','Italic','-','NumberedList','BulletedList','-','Link','Unlink','-','About']];i.toolbar_Full=[{name:'document',items:['Source','-','Save','NewPage','DocProps','Preview','Print','-','Templates']},{name:'clipboard',items:['Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo']},{name:'editing',items:['Find','Replace','-','SelectAll','-','SpellChecker','Scayt']},{name:'forms',items:['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField']},'/',{name:'basicstyles',items:['Bold','Italic','Underline','Strike','Subscript','Superscript','-','RemoveFormat']},{name:'paragraph',items:['NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','CreateDiv','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','BidiLtr','BidiRtl']},{name:'links',items:['Link','Unlink','Anchor']},{name:'insert',items:['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak','Iframe']},'/',{name:'styles',items:['Styles','Format','Font','FontSize']},{name:'colors',items:['TextColor','BGColor']},{name:'tools',items:['Maximize','ShowBlocks','-','About']}];i.toolbar='Full';i.toolbarCanCollapse=true;(function(){j.add('undo',{requires:['selection','wysiwygarea'],init:function(s){var t=new o(s),u=s.addCommand('undo',{exec:function(){if(t.undo()){s.selectionChange();this.fire('afterUndo');}},state:0,canUndo:false}),v=s.addCommand('redo',{exec:function(){if(t.redo()){s.selectionChange();this.fire('afterRedo');}},state:0,canUndo:false});t.onChange=function(){u.setState(t.undoable()?2:0);v.setState(t.redoable()?2:0);};function w(x){if(t.enabled&&x.data.command.canUndo!==false)t.save();};s.on('beforeCommandExec',w);s.on('afterCommandExec',w);s.on('saveSnapshot',function(){t.save();});s.on('contentDom',function(){s.document.on('keydown',function(x){if(!x.data.$.ctrlKey&&!x.data.$.metaKey)t.type(x);});});s.on('beforeModeUnload',function(){s.mode=='wysiwyg'&&t.save(true);});s.on('mode',function(){t.enabled=s.readOnly?false:s.mode=='wysiwyg';t.onChange();});s.ui.addButton('Undo',{label:s.lang.undo,command:'undo'});s.ui.addButton('Redo',{label:s.lang.redo,command:'redo'});s.resetUndo=function(){t.reset(); -s.fire('saveSnapshot');};s.on('updateSnapshot',function(){if(t.currentImage&&new m(s).equals(t.currentImage))setTimeout(function(){t.update();},0);});}});j.undo={};var m=j.undo.Image=function(s){this.editor=s;s.fire('beforeUndoImage');var t=s.getSnapshot(),u=t&&s.getSelection();c&&t&&(t=t.replace(/\s+data-cke-expando=".*?"/g,''));this.contents=t;this.bookmarks=u&&u.createBookmarks2(true);s.fire('afterUndoImage');},n=/\b(?:href|src|name)="[^"]*?"/gi;m.prototype={equals:function(s,t){var u=this.contents,v=s.contents;if(c&&(b.ie7Compat||b.ie6Compat)){u=u.replace(n,'');v=v.replace(n,'');}if(u!=v)return false;if(t)return true;var w=this.bookmarks,x=s.bookmarks;if(w||x){if(!w||!x||w.length!=x.length)return false;for(var y=0;y25){this.save(false,null,false);this.modifiersCount=1;}}else if(!y){this.modifiersCount=0;this.typesCount++;if(this.typesCount>25){this.save(false,null,false);this.typesCount=1;}}},reset:function(){var s=this;s.lastKeystroke=0;s.snapshots=[];s.index=-1;s.limit=s.editor.config.undoStackSize||20;s.currentImage=null;s.hasUndo=false;s.hasRedo=false;s.resetType();},resetType:function(){var s=this;s.typing=false;delete s.lastKeystroke;s.typesCount=0;s.modifiersCount=0;},fireChange:function(){var s=this;s.hasUndo=!!s.getNextImage(true);s.hasRedo=!!s.getNextImage(false);s.resetType();s.onChange();},save:function(s,t,u){var w=this;var v=w.snapshots;if(!t)t=new m(w.editor);if(t.contents===false)return false;if(w.currentImage&&t.equals(w.currentImage,s))return false;v.splice(w.index+1,v.length-w.index-1);if(v.length==w.limit)v.shift(); -w.index=v.push(t)-1;w.currentImage=t;if(u!==false)w.fireChange();return true;},restoreImage:function(s){var u=this;u.editor.loadSnapshot(s.contents);if(s.bookmarks)u.editor.getSelection().selectBookmarks(s.bookmarks);else if(c){var t=u.editor.document.getBody().$.createTextRange();t.collapse(true);t.select();}u.index=s.index;u.update();u.fireChange();},getNextImage:function(s){var x=this;var t=x.snapshots,u=x.currentImage,v,w;if(u)if(s)for(w=x.index-1;w>=0;w--){v=t[w];if(!u.equals(v,true)){v.index=w;return v;}}else for(w=x.index+1;w]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:]*>| |\u00A0| )?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi,n=d.walker.whitespaces(true);function o(C){return C.isBlockBoundary()&&f.$empty[C.getName()];};function p(C){return function(D){if(this.mode=='wysiwyg'){this.focus();this.fire('saveSnapshot');C.call(this,D.data);e.setTimeout(function(){this.fire('saveSnapshot');},0,this);}};};function q(C){var I=this;if(I.dataProcessor)C=I.dataProcessor.toHtml(C);var D=I.getSelection(),E=D.getRanges()[0];if(E.checkReadOnly())return;if(c){var F=D.isLocked;if(F)D.unlock();var G=D.getNative();if(G.type=='Control')G.clear();else if(D.getType()==2){E=D.getRanges()[0];var H=E&&E.endContainer;if(H&&H.type==1&&H.getAttribute('contenteditable')=='false'&&E.checkBoundaryOfElement(H,2)){E.setEndAfter(E.endContainer);E.deleteContents();}}try{G.createRange().pasteHTML(C);}catch(J){}if(F)I.getSelection().lock();}else I.document.$.execCommand('inserthtml',false,C);if(b.webkit){D=I.getSelection();D.scrollIntoView();}};function r(C){var D=this.getSelection(),E=D.getStartElement().hasAscendant('pre',true)?2:this.config.enterMode,F=E==2,G=e.htmlEncode(C.replace(/\r\n|\r/g,'\n'));G=G.replace(/^[ \t]+|[ \t]+$/g,function(M,N,O){if(M.length==1)return ' ';else if(!N)return e.repeat(' ',M.length-1)+' ';else return ' '+e.repeat(' ',M.length-1); -});G=G.replace(/[ \t]{2,}/g,function(M){return e.repeat(' ',M.length-1)+' ';});var H=E==1?'p':'div';if(!F)G=G.replace(/(\n{2})([\s\S]*?)(?:$|\1)/g,function(M,N,O){return '<'+H+'>'+O+'';});G=G.replace(/\n/g,'
    ');if(!(F||c))G=G.replace(new RegExp('
    (?=)'),function(M){return e.repeat(M,2);});if(b.gecko||b.webkit){var I=new d.elementPath(D.getStartElement()),J=[];for(var K=0;K/));else if(L in f.$block)break;}G=J.join('')+G;}q.call(this,G);};function s(C){var D=this.getSelection(),E=D.getRanges(),F=C.getName(),G=f.$block[F],H=D.isLocked;if(H)D.unlock();var I,J,K,L;for(var M=E.length-1;M>=0;M--){I=E[M];if(!I.checkReadOnly()){I.deleteContents(1);J=!M&&C||C.clone(1);var N,O;if(G)while((N=I.getCommonAncestor(0,1))&&(O=f[N.getName()])&&!(O&&O[F])){if(N.getName() in f.span)I.splitElement(N);else if(I.checkStartOfBlock()&&I.checkEndOfBlock()){I.setStartBefore(N);I.collapse(true);N.remove();}else I.splitBlock();}I.insertNode(J);if(!K)K=J;}}if(K){I.moveToPosition(K,4);if(G){var P=K.getNext(n),Q=P&&P.type==1&&P.getName();if(Q&&f.$block[Q]&&f[Q]['#'])I.moveToElementEditStart(P);}}D.selectRanges([I]);if(H)this.getSelection().lock();};function t(C){if(!C.checkDirty())setTimeout(function(){C.resetDirty();},0);};var u=d.walker.whitespaces(true),v=d.walker.bookmark(false,true);function w(C){return u(C)&&v(C);};function x(C){return C.type==3&&e.trim(C.getText()).match(/^(?: |\xa0)$/);};function y(C){if(C.isLocked){C.unlock();setTimeout(function(){C.lock();},0);}};function z(C){return C.getOuterHtml().match(m);};u=d.walker.whitespaces(true);function A(C){var D=C.window,E=C.document,F=C.document.getBody(),G=F.getFirst(),H=F.getChildren().count();if(!H||H==1&&G.type==1&&G.hasAttribute('_moz_editor_bogus_node')){t(C);var I=C.element.getDocument(),J=I.getDocumentElement(),K=J.$.scrollTop,L=J.$.scrollLeft,M=E.$.createEvent('KeyEvents');M.initKeyEvent('keypress',true,true,D.$,false,false,false,false,0,32);E.$.dispatchEvent(M);if(K!=J.$.scrollTop||L!=J.$.scrollLeft)I.getWindow().$.scrollTo(L,K);H&&F.getFirst().remove();E.getBody().appendBogus();var N=new d.range(E);N.setStartAt(F,1);N.select();}};function B(C){var D=C.editor,E=C.data.path,F=E.blockLimit,G=C.data.selection,H=G.getRanges()[0],I=D.document.getBody(),J=D.config.enterMode;if(b.gecko){A(D);var K=E.block||E.blockLimit,L=K&&K.getLast(w);if(K&&K.isBlockBoundary()&&!(L&&L.type==1&&L.isBlockBoundary())&&!K.is('pre')&&!K.getBogus()){D.fire('updateSnapshot'); -t(D);K.appendBogus();}}if(D.config.autoParagraph!==false&&J!=2&&H.collapsed&&F.getName()=='body'&&!E.block){D.fire('updateSnapshot');t(D);c&&y(G);var M=H.fixBlock(true,D.config.enterMode==3?'div':'p');if(c){var N=M.getFirst(w);N&&x(N)&&N.remove();}if(z(M)){var O=M.getNext(u);if(O&&O.type==1&&!o(O)){H.moveToElementEditStart(O);M.remove();}else{O=M.getPrevious(u);if(O&&O.type==1&&!o(O)){H.moveToElementEditEnd(O);M.remove();}}}H.select();C.cancel();}var P=new d.range(D.document);P.moveToElementEditEnd(D.document.getBody());var Q=new d.elementPath(P.startContainer);if(!Q.blockLimit.is('body')){D.fire('updateSnapshot');t(D);c&&y(G);var R;if(J!=2)R=I.append(D.document.createElement(J==1?'p':'div'));else R=I;if(!c)R.appendBogus();}};j.add('wysiwygarea',{requires:['editingblock'],init:function(C){var D=C.config.enterMode!=2&&C.config.autoParagraph!==false?C.config.enterMode==3?'div':'p':false,E=C.lang.editorTitle.replace('%1',C.name),F;C.on('editingBlockReady',function(){var L,M,N,O,P,Q,R=b.isCustomDomain(),S=function(V){if(M)M.remove();var W='document.open();'+(R?'document.domain="'+document.domain+'";':'')+'document.close();';W=b.air?'javascript:void(0)':c?'javascript:void(function(){'+encodeURIComponent(W)+'}())':'';M=h.createFromHtml('');if(document.location.protocol=='chrome:')a.event.useCapture=true;M.on('load',function(aa){P=1;aa.removeListener();var ab=M.getFrameDocument();ab.write(V);b.air&&U(ab.getWindow().$);});if(document.location.protocol=='chrome:')a.event.useCapture=false;var X=C.element,Y=b.gecko&&!X.isVisible(),Z={};if(Y){X.show();Z={position:X.getStyle('position'),top:X.getStyle('top')};X.setStyles({position:'absolute',top:'-3000px'});}L.append(M);if(Y)setTimeout(function(){X.hide();X.setStyles(Z);},1000);};F=e.addFunction(U);var T='';function U(V){if(!P)return;P=0;C.fire('ariaWidget',M);var W=V.document,X=W.body,Y=W.getElementById('cke_actscrpt');Y&&Y.parentNode.removeChild(Y);X.spellcheck=!C.config.disableNativeSpellChecker;var Z=!C.readOnly;if(c){X.hideFocus=true;X.disabled=true;X.contentEditable=Z;X.removeAttribute('disabled');}else setTimeout(function(){if(b.gecko&&b.version>=10900||b.opera)W.$.body.contentEditable=Z; -else if(b.webkit)W.$.body.parentNode.contentEditable=Z;else W.$.designMode=Z?'off':'on';},0);Z&&b.gecko&&e.setTimeout(A,0,null,C);V=C.window=new d.window(V);W=C.document=new g(W);Z&&W.on('dblclick',function(af){var ag=af.data.getTarget(),ah={element:ag,dialog:''};C.fire('doubleclick',ah);ah.dialog&&C.openDialog(ah.dialog);});c&&W.on('click',function(af){var ag=af.data.getTarget();if(ag.is('input')){var ah=ag.getAttribute('type');if(ah=='submit'||ah=='reset')af.data.preventDefault();}});if(!(c||b.opera))W.on('mousedown',function(af){var ag=af.data.getTarget();if(ag.is('img','hr','input','textarea','select'))C.getSelection().selectElement(ag);});if(b.gecko)W.on('mouseup',function(af){if(af.data.$.button==2){var ag=af.data.getTarget();if(!ag.getOuterHtml().replace(m,'')){var ah=new d.range(W);ah.moveToElementEditStart(ag);ah.select(true);}}});W.on('click',function(af){af=af.data;if(af.getTarget().is('a')&&af.$.button!=2)af.preventDefault();});if(b.webkit){W.on('mousedown',function(){ac=1;});W.on('click',function(af){if(af.data.getTarget().is('input','select'))af.data.preventDefault();});W.on('mouseup',function(af){if(af.data.getTarget().is('input','textarea'))af.data.preventDefault();});}if(Z&&c&&W.$.compatMode=='CSS1Compat'||b.gecko||b.opera){var aa=W.getDocumentElement();aa.on('mousedown',function(af){if(af.data.getTarget().equals(aa)){if(b.gecko&&b.version>=10900)J();K.focus();}});}var ab=c?M:V;ab.on('blur',function(){C.focusManager.blur();});var ac;ab.on('focus',function(){var af=C.document;if(Z&&b.gecko&&b.version>=10900)J();else if(b.opera)af.getBody().focus();else if(b.webkit)if(!ac){C.document.getDocumentElement().focus();ac=1;}C.focusManager.focus();});var ad=C.keystrokeHandler;ad.blockedKeystrokes[8]=!Z;ad.attach(W);if(c){W.getDocumentElement().addClass(W.$.compatMode);Z&&W.on('keydown',function(af){var ag=af.data.getKeystroke();if(ag in {8:1,46:1}){var ah=C.getSelection(),ai=ah.getSelectedElement();if(ai){C.fire('saveSnapshot');var aj=ah.getRanges()[0].createBookmark();ai.remove();ah.selectBookmarks([aj]);C.fire('saveSnapshot');af.data.preventDefault();}}});if(W.$.compatMode=='CSS1Compat'){var ae={33:1,34:1};W.on('keydown',function(af){if(af.data.getKeystroke() in ae)setTimeout(function(){C.getSelection().scrollIntoView();},0);});}C.config.enterMode!=1&&W.on('selectionchange',function(){var af=W.getBody(),ag=C.getSelection().getRanges()[0];if(af.getHtml().match(/^

     <\/p>$/i)&&ag.startContainer.equals(af))setTimeout(function(){ag=C.getSelection().getRanges()[0]; -if(!ag.startContainer.equals('body')){af.getFirst().remove(1);ag.moveToElementEditEnd(af);ag.select(1);}},0);});}if(C.contextMenu)C.contextMenu.addTarget(W,C.config.browserContextMenuOnCtrl!==false);setTimeout(function(){C.fire('contentDom');if(Q){C.mode='wysiwyg';C.fire('mode');Q=false;}N=false;if(O){C.focus();O=false;}setTimeout(function(){C.fire('dataReady');},0);try{C.document.$.execCommand('enableInlineTableEditing',false,!C.config.disableNativeTableHandles);}catch(af){}if(C.config.disableObjectResizing)try{C.document.$.execCommand('enableObjectResizing',false,false);}catch(ag){C.document.getBody().on(c?'resizestart':'resize',function(ah){ah.data.preventDefault();});}if(c)setTimeout(function(){if(C.document){var ah=C.document.$.body;ah.runtimeStyle.marginBottom='0px';ah.runtimeStyle.marginBottom='';}},1000);},0);};C.addMode('wysiwyg',{load:function(V,W,X){L=V;if(c&&b.quirks)V.setStyle('position','relative');C.mayBeDirty=true;Q=true;if(X)this.loadSnapshotData(W);else this.loadData(W);},loadData:function(V){N=true;C._.dataStore={id:1};var W=C.config,X=W.fullPage,Y=W.docType,Z='';!X&&(Z=e.buildStyleHtml(C.config.contentsCss)+Z);var aa=W.baseHref?'':'';if(X)V=V.replace(/]*>/i,function(ab){C.docType=Y=ab;return '';}).replace(/<\?xml\s[^\?]*\?>/i,function(ab){C.xmlDeclaration=ab;return '';});if(C.dataProcessor)V=C.dataProcessor.toHtml(V,D);if(X){if(!/]/.test(V))V=''+V;if(!/]/.test(V))V=''+V+'';if(!/]/.test(V))V=V.replace(/]*>/,'$&');else if(!/]/.test(V))V=V.replace(/]*>/,'$&');aa&&(V=V.replace(//,'$&'+aa));V=V.replace(/<\/head\s*>/,Z+'$&');V=Y+V;}else V=W.docType+''+''+''+E+''+aa+Z+''+''+V+'';if(b.gecko)V=V.replace(/
    (?=\s*<\/(:?html|body)>)/,'$&
    ');V+=T;this.onDispose();S(V);},getData:function(){var V=C.config,W=V.fullPage,X=W&&C.docType,Y=W&&C.xmlDeclaration,Z=M.getFrameDocument(),aa=W?Z.getDocumentElement().getOuterHtml():Z.getBody().getHtml();if(b.gecko)aa=aa.replace(/
    (?=\s*(:?$|<\/body>))/,'');if(C.dataProcessor)aa=C.dataProcessor.toDataFormat(aa,D);if(V.ignoreEmptyParagraph)aa=aa.replace(m,function(ab,ac){return ac; -});if(Y)aa=Y+'\n'+aa;if(X)aa=X+'\n'+aa;return aa;},getSnapshotData:function(){return M.getFrameDocument().getBody().getHtml();},loadSnapshotData:function(V){M.getFrameDocument().getBody().setHtml(V);},onDispose:function(){if(!C.document)return;C.document.getDocumentElement().clearCustomData();C.document.getBody().clearCustomData();C.window.clearCustomData();C.document.clearCustomData();M.clearCustomData();M.remove();},unload:function(V){this.onDispose();C.window=C.document=M=L=O=null;C.fire('contentDomUnload');},focus:function(){var V=C.window;if(N)O=true;else if(b.opera&&C.document){var W=C.window.$.frameElement;W.blur(),W.focus();C.document.getBody().focus();C.selectionChange();}else if(!b.opera&&V){b.air?setTimeout(function(){V.focus();},0):V.focus();C.selectionChange();}}});C.on('insertHtml',p(q),null,null,20);C.on('insertElement',p(s),null,null,20);C.on('insertText',p(r),null,null,20);C.on('selectionChange',B,null,null,1);});var G;C.on('contentDom',function(){var L=C.document.getElementsByTag('title').getItem(0);L.data('cke-title',C.document.$.title);C.document.$.title=E;});C.on('readOnly',function(){if(C.mode=='wysiwyg'){var L=C.getMode();L.loadData(L.getData());}});if(a.document.$.documentMode>=8){C.addCss('html.CSS1Compat [contenteditable=false]{ min-height:0 !important;}');var H=[];for(var I in f.$removeEmpty)H.push('html.CSS1Compat '+I+'[contenteditable=false]');C.addCss(H.join(',')+'{ display:inline-block;}');}else if(b.gecko){C.addCss('html { height: 100% !important; }');C.addCss('img:-moz-broken { -moz-force-broken-image-icon : 1;\twidth : 24px; height : 24px; }');}C.addCss('html {\t_overflow-y: scroll; cursor: text;\t*cursor:auto;}');C.addCss('img, input, textarea { cursor: default;}');function J(L){if(C.readOnly)return;e.tryThese(function(){C.document.$.designMode='on';setTimeout(function(){C.document.$.designMode='off';if(a.currentInstance==C)C.document.getBody().focus();},50);},function(){C.document.$.designMode='off';var M=C.document.getBody();M.setAttribute('contentEditable',false);M.setAttribute('contentEditable',true);!L&&J(1);});};if(b.gecko||c||b.opera){var K;C.on('uiReady',function(){K=C.container.append(h.createFromHtml(''));K.on('focus',function(){C.focus();});C.focusGrabber=K;});C.on('destroy',function(){e.removeFunction(F);K.clearCustomData();delete C.focusGrabber;});}C.on('insertElement',function(L){var M=L.data;if(M.type==1&&(M.is('input')||M.is('textarea'))){if(!M.isReadOnly())M.data('cke-editable',M.hasAttribute('contenteditable')?'true':'1'); -M.setAttribute('contentEditable',false);}});}});if(b.gecko)(function(){var C=document.body;if(!C)window.addEventListener('load',arguments.callee,false);else{var D=C.getAttribute('onpageshow');C.setAttribute('onpageshow',(D?D+';':'')+'event.persisted && (function(){'+'var allInstances = CKEDITOR.instances, editor, doc;'+'for ( var i in allInstances )'+'{'+'\teditor = allInstances[ i ];'+'\tdoc = editor.document;'+'\tif ( doc )'+'\t{'+'\t\tdoc.$.designMode = "off";'+'\t\tdoc.$.designMode = "on";'+'\t}'+'}'+'})();');}})();})();i.disableObjectResizing=false;i.disableNativeTableHandles=true;i.disableNativeSpellChecker=true;i.ignoreEmptyParagraph=true;j.add('wsc',{requires:['dialog'],init:function(m){var n='checkspell',o=m.addCommand(n,new a.dialogCommand(n));o.modes={wysiwyg:!b.opera&&!b.air&&document.domain==window.location.hostname};m.ui.addButton('SpellChecker',{label:m.lang.spellCheck.toolbar,command:n});a.dialog.add(n,this.path+'dialogs/wsc.js');}});i.wsc_customerId=i.wsc_customerId||'1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk';i.wsc_customLoaderScript=i.wsc_customLoaderScript||null;a.DIALOG_RESIZE_NONE=0;a.DIALOG_RESIZE_WIDTH=1;a.DIALOG_RESIZE_HEIGHT=2;a.DIALOG_RESIZE_BOTH=3;(function(){var m=e.cssLength;function n(Q){return!!this._.tabs[Q][0].$.offsetHeight;};function o(){var U=this;var Q=U._.currentTabId,R=U._.tabIdList.length,S=e.indexOf(U._.tabIdList,Q)+R;for(var T=S-1;T>S-R;T--){if(n.call(U,U._.tabIdList[T%R]))return U._.tabIdList[T%R];}return null;};function p(){var U=this;var Q=U._.currentTabId,R=U._.tabIdList.length,S=e.indexOf(U._.tabIdList,Q);for(var T=S+1;T1){ad._.tabBarMode=true;ad._.tabs[ad._.currentTabId][0].focus();ah=1;}else if((aq==37||aq==39)&&ad._.tabBarMode){at=aq==(ar?39:37)?o.call(ad):p.call(ad);ad.selectPage(at);ad._.tabs[at][0].focus();ah=1;}else if((aq==13||aq==32)&&ad._.tabBarMode){au.selectPage(au._.currentTabId);au._.tabBarMode=false;au._.currentFocusIndex=-1;ag(true);ah=1;}if(ah){ap.stop();ap.data.preventDefault();}};function aj(ap){ah&&ap.data.preventDefault();};var ak=this._.element;this.on('show',function(){ak.on('keydown',ai,this,null,0);if(b.opera||b.gecko&&b.mac)ak.on('keypress',aj,this);});this.on('hide',function(){ak.removeListener('keydown',ai);if(b.opera||b.gecko&&b.mac)ak.removeListener('keypress',aj);});this.on('iframeAdded',function(ap){var aq=new g(ap.data.iframe.$.contentWindow.document);aq.on('keydown',ai,this,null,0);});this.on('show',function(){var at=this;af();if(Q.config.dialog_startupFocusTab&&ad._.pageCount>1){ad._.tabBarMode=true;ad._.tabs[ad._.currentTabId][0].focus();}else if(!at._.hasFocus){at._.currentFocusIndex=-1;if(S.onFocus){var ap=S.onFocus.call(at);ap&&ap.focus();}else ag(true);if(at._.editor.mode=='wysiwyg'&&c){var aq=Q.document.$.selection,ar=aq.createRange();if(ar)if(ar.parentElement&&ar.parentElement().ownerDocument==Q.document.$||ar.item&&ar.item(0).ownerDocument==Q.document.$){var as=document.body.createTextRange();as.moveToElementText(at.getElement().getFirst().$);as.collapse(true);as.select();}}}},this,null,4294967295);if(b.ie6Compat)this.on('load',function(ap){var aq=this.getElement(),ar=aq.getFirst();ar.remove();ar.appendTo(aq);},this);y(this);z(this);new d.text(S.title,a.document).appendTo(this.parts.title);for(var al=0;al0?S:0)+'px'};Z[V?'right':'left']=(R>0?R:0)+'px';U.setStyles(Z);T&&(aa._.moved=1);};})(),getPosition:function(){return e.extend({},this._.position);},show:function(){var Q=this._.element,R=this.definition;if(!(Q.getParent()&&Q.getParent().equals(a.document.getBody())))Q.appendTo(a.document.getBody());else Q.setStyle('display','block');if(b.gecko&&b.version<10900){var S=this.parts.dialog;S.setStyle('position','absolute');setTimeout(function(){S.setStyle('position','fixed');},0);}this.resize(this._.contentSize&&this._.contentSize.width||R.width||R.minWidth,this._.contentSize&&this._.contentSize.height||R.height||R.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);if(a.dialog._.currentZIndex===null)a.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex;this._.element.getFirst().setStyle('z-index',a.dialog._.currentZIndex+=10);if(a.dialog._.currentTop===null){a.dialog._.currentTop=this;this._.parentDialog=null;E(this._.editor);Q.on('keydown',I);Q.on(b.opera?'keypress':'keyup',J);for(var T in {keyup:1,keydown:1,keypress:1})Q.on(T,P);}else{this._.parentDialog=a.dialog._.currentTop; -var U=this._.parentDialog.getElement().getFirst();U.$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2);a.dialog._.currentTop=this;}K(this,this,'\x1b',null,function(){this.getButton('cancel')&&this.getButton('cancel').click();});this._.hasFocus=false;e.setTimeout(function(){this.layout();this.parts.dialog.setStyle('visibility','');this.fireOnce('load',{});k.fire('ready',this);this.fire('show',{});this._.editor.fire('dialogShow',this);this.foreach(function(V){V.setInitValue&&V.setInitValue();});},100,this);},layout:function(){var S=this;var Q=a.document.getWindow().getViewPaneSize(),R=S.getSize();S.move(S._.moved?S._.position.x:(Q.width-R.width)/2,S._.moved?S._.position.y:(Q.height-R.height)/2);},foreach:function(Q){var T=this;for(var R in T._.contents)for(var S in T._.contents[R])Q(T._.contents[R][S]);return T;},reset:(function(){var Q=function(R){if(R.reset)R.reset(1);};return function(){this.foreach(Q);return this;};})(),setupContent:function(){var Q=arguments;this.foreach(function(R){if(R.setup)R.setup.apply(R,Q);});},commitContent:function(){var Q=arguments;this.foreach(function(R){if(R.commit)R.commit.apply(R,Q);});},hide:function(){if(!this.parts.dialog.isVisible())return;this.fire('hide',{});this._.editor.fire('dialogHide',this);var Q=this._.element;Q.setStyle('display','none');this.parts.dialog.setStyle('visibility','hidden');L(this);while(a.dialog._.currentTop!=this)a.dialog._.currentTop.hide();if(!this._.parentDialog)F();else{var R=this._.parentDialog.getElement().getFirst();R.setStyle('z-index',parseInt(R.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2));}a.dialog._.currentTop=this._.parentDialog;if(!this._.parentDialog){a.dialog._.currentZIndex=null;Q.removeListener('keydown',I);Q.removeListener(b.opera?'keypress':'keyup',J);for(var S in {keyup:1,keydown:1,keypress:1})Q.removeListener(S,P);var T=this._.editor;T.focus();if(T.mode=='wysiwyg'&&c){var U=T.getSelection();U&&U.unlock(true);}}else a.dialog._.currentZIndex-=10;delete this._.parentDialog;this.foreach(function(V){V.resetInitValue&&V.resetInitValue();});},addPage:function(Q){var ac=this;var R=[],S=Q.label?' title="'+e.htmlEncode(Q.label)+'"':'',T=Q.elements,U=a.dialog._.uiElementBuilders.vbox.build(ac,{type:'vbox',className:'cke_dialog_page_contents',children:Q.elements,expand:!!Q.expand,padding:Q.padding,style:Q.style||'width: 100%;height:100%'},R),V=h.createFromHtml(R.join(''));V.setAttribute('role','tabpanel');var W=b,X='cke_'+Q.id+'_'+e.getNextNumber(),Y=h.createFromHtml(['0?' cke_last':'cke_first',S,!!Q.hidden?' style="display:none"':'',' id="',X,'"',W.gecko&&W.version>=10900&&!W.hc?'':' href="javascript:void(0)"',' tabIndex="-1"',' hidefocus="true"',' role="tab">',Q.label,''].join('')); -V.setAttribute('aria-labelledby',X);ac._.tabs[Q.id]=[Y,V];ac._.tabIdList.push(Q.id);!Q.hidden&&ac._.pageCount++;ac._.lastTab=Y;ac.updateStyle();var Z=ac._.contents[Q.id]={},aa,ab=U.getChild();while(aa=ab.shift()){Z[aa.id]=aa;if(typeof aa.getChild=='function')ab.push.apply(ab,aa.getChild());}V.setAttribute('name',Q.id);V.appendTo(ac.parts.contents);Y.unselectable();ac.parts.tabs.append(Y);if(Q.accessKey){K(ac,ac,'CTRL+'+Q.accessKey,N,M);ac._.accessKeyMap['CTRL+'+Q.accessKey]=Q.id;}},selectPage:function(Q){if(this._.currentTabId==Q)return;if(this.fire('selectPage',{page:Q,currentPage:this._.currentTabId})===true)return;for(var R in this._.tabs){var S=this._.tabs[R][0],T=this._.tabs[R][1];if(R!=Q){S.removeClass('cke_dialog_tab_selected');T.hide();}T.setAttribute('aria-hidden',R!=Q);}var U=this._.tabs[Q];U[0].addClass('cke_dialog_tab_selected');if(b.ie6Compat||b.ie7Compat){q(U[1]);U[1].show();setTimeout(function(){q(U[1],1);},0);}else U[1].show();this._.currentTabId=Q;this._.currentTabIndex=e.indexOf(this._.tabIdList,Q);},updateStyle:function(){this.parts.dialog[(this._.pageCount===1?'add':'remove')+'Class']('cke_single_page');},hidePage:function(Q){var S=this;var R=S._.tabs[Q]&&S._.tabs[Q][0];if(!R||S._.pageCount==1||!R.isVisible())return;else if(Q==S._.currentTabId)S.selectPage(o.call(S));R.hide();S._.pageCount--;S.updateStyle();},showPage:function(Q){var S=this;var R=S._.tabs[Q]&&S._.tabs[Q][0];if(!R)return;R.show();S._.pageCount++;S.updateStyle();},getElement:function(){return this._.element;},getName:function(){return this._.name;},getContentElement:function(Q,R){var S=this._.contents[Q];return S&&S[R];},getValueOf:function(Q,R){return this.getContentElement(Q,R).getValue();},setValueOf:function(Q,R,S){return this.getContentElement(Q,R).setValue(S);},getButton:function(Q){return this._.buttons[Q];},click:function(Q){return this._.buttons[Q].click();},disableButton:function(Q){return this._.buttons[Q].disable();},enableButton:function(Q){return this._.buttons[Q].enable();},getPageCount:function(){return this._.pageCount;},getParentEditor:function(){return this._.editor;},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement();},addFocusable:function(Q,R){var T=this;if(typeof R=='undefined'){R=T._.focusList.length;T._.focusList.push(new r(T,Q,R));}else{T._.focusList.splice(R,0,new r(T,Q,R));for(var S=R+1;Sab.width-aa.width-V)ag=ab.width-aa.width+(U.lang.dir=='rtl'?0:W[1]);else ag=S.x;if(S.y+W[0]ab.height-aa.height-V)ah=ab.height-aa.height+W[2];else ah=S.y;Q.move(ag,ah,1);Z.data.preventDefault();};function Y(Z){a.document.removeListener('mousemove',X);a.document.removeListener('mouseup',Y);if(b.ie6Compat){var aa=C.getChild(0).getFrameDocument();aa.removeListener('mousemove',X);aa.removeListener('mouseup',Y);}};Q.parts.title.on('mousedown',function(Z){R={x:Z.data.$.screenX,y:Z.data.$.screenY};a.document.on('mousemove',X);a.document.on('mouseup',Y);S=Q.getPosition();if(b.ie6Compat){var aa=C.getChild(0).getFrameDocument();aa.on('mousemove',X);aa.on('mouseup',Y);}Z.data.preventDefault();},Q);};function z(Q){var R=Q.definition,S=R.resizable;if(S==0)return;var T=Q.getParentEditor(),U,V,W,X,Y,Z,aa=e.addFunction(function(ad){Y=Q.getSize();var ae=Q.parts.contents,af=ae.$.getElementsByTagName('iframe').length;if(af){Z=h.createFromHtml('

    ');ae.append(Z);}V=Y.height-Q.parts.contents.getSize('height',!(b.gecko||b.opera||c&&b.quirks));U=Y.width-Q.parts.contents.getSize('width',1);X={x:ad.screenX,y:ad.screenY};W=a.document.getWindow().getViewPaneSize();a.document.on('mousemove',ab);a.document.on('mouseup',ac);if(b.ie6Compat){var ag=C.getChild(0).getFrameDocument();ag.on('mousemove',ab);ag.on('mouseup',ac);}ad.preventDefault&&ad.preventDefault();});Q.on('load',function(){var ad='';if(S==1)ad=' cke_resizer_horizontal';else if(S==2)ad=' cke_resizer_vertical';var ae=h.createFromHtml('
    ');Q.parts.footer.append(ae,1);});T.on('destroy',function(){e.removeFunction(aa);});function ab(ad){var ae=T.lang.dir=='rtl',af=(ad.data.$.screenX-X.x)*(ae?-1:1),ag=ad.data.$.screenY-X.y,ah=Y.width,ai=Y.height,aj=ah+af*(Q._.moved?1:2),ak=ai+ag*(Q._.moved?1:2),al=Q._.element.getFirst(),am=ae&&al.getComputedStyle('right'),an=Q.getPosition();if(an.y+ak>W.height)ak=W.height-an.y;if((ae?am:an.x)+aj>W.width)aj=W.width-(ae?am:an.x);if(S==1||S==3)ah=Math.max(R.minWidth||0,aj-U);if(S==2||S==3)ai=Math.max(R.minHeight||0,ak-V);Q.resize(ah,ai);if(!Q._.moved)Q.layout();ad.data.preventDefault();};function ac(){a.document.removeListener('mouseup',ac);a.document.removeListener('mousemove',ab); -if(Z){Z.remove();Z=null;}if(b.ie6Compat){var ad=C.getChild(0).getFrameDocument();ad.removeListener('mouseup',ac);ad.removeListener('mousemove',ab);}};};var A,B={},C;function D(Q){Q.data.preventDefault(1);};function E(Q){var R=a.document.getWindow(),S=Q.config,T=S.dialog_backgroundCoverColor||'white',U=S.dialog_backgroundCoverOpacity,V=S.baseFloatZIndex,W=e.genKey(T,U,V),X=B[W];if(!X){var Y=['
    '];if(b.ie6Compat){var Z=b.isCustomDomain(),aa="";Y.push('');}Y.push('
    ');X=h.createFromHtml(Y.join(''));X.setOpacity(U!=undefined?U:0.5);X.on('keydown',D);X.on('keypress',D);X.on('keyup',D);X.appendTo(a.document.getBody());B[W]=X;}else X.show();C=X;var ab=function(){var ae=R.getViewPaneSize();X.setStyles({width:ae.width+'px',height:ae.height+'px'});},ac=function(){var ae=R.getScrollPosition(),af=a.dialog._.currentTop;X.setStyles({left:ae.x+'px',top:ae.y+'px'});if(af)do{var ag=af.getPosition();af.move(ag.x,ag.y);}while(af=af._.parentDialog)};A=ab;R.on('resize',ab);ab();if(!(b.mac&&b.webkit))X.focus();if(b.ie6Compat){var ad=function(){ac();arguments.callee.prevScrollHandler.apply(this,arguments);};R.$.setTimeout(function(){ad.prevScrollHandler=window.onscroll||(function(){});window.onscroll=ad;},0);ac();}};function F(){if(!C)return;var Q=a.document.getWindow();C.hide();Q.removeListener('resize',A);if(b.ie6Compat)Q.$.setTimeout(function(){var R=window.onscroll&&window.onscroll.prevScrollHandler;window.onscroll=R||null;},0);A=null;};function G(){for(var Q in B)B[Q].remove();B={};};var H={},I=function(Q){var R=Q.data.$.ctrlKey||Q.data.$.metaKey,S=Q.data.$.altKey,T=Q.data.$.shiftKey,U=String.fromCharCode(Q.data.$.keyCode),V=H[(R?'CTRL+':'')+(S?'ALT+':'')+(T?'SHIFT+':'')+U];if(!V||!V.length)return;V=V[V.length-1];V.keydown&&V.keydown.call(V.uiElement,V.dialog,V.key);Q.data.preventDefault();},J=function(Q){var R=Q.data.$.ctrlKey||Q.data.$.metaKey,S=Q.data.$.altKey,T=Q.data.$.shiftKey,U=String.fromCharCode(Q.data.$.keyCode),V=H[(R?'CTRL+':'')+(S?'ALT+':'')+(T?'SHIFT+':'')+U]; -if(!V||!V.length)return;V=V[V.length-1];if(V.keyup){V.keyup.call(V.uiElement,V.dialog,V.key);Q.data.preventDefault();}},K=function(Q,R,S,T,U){var V=H[S]||(H[S]=[]);V.push({uiElement:Q,dialog:R,key:S,keyup:U||Q.accessKeyUp,keydown:T||Q.accessKeyDown});},L=function(Q){for(var R in H){var S=H[R];for(var T=S.length-1;T>=0;T--){if(S[T].dialog==Q||S[T].uiElement==Q)S.splice(T,1);}if(S.length===0)delete H[R];}},M=function(Q,R){if(Q._.accessKeyMap[R])Q.selectPage(Q._.accessKeyMap[R]);},N=function(Q,R){},O={27:1,13:1},P=function(Q){if(Q.data.getKeystroke() in O)Q.data.stopPropagation();};(function(){k.dialog={uiElement:function(Q,R,S,T,U,V,W){if(arguments.length<4)return;var X=(T.call?T(R):T)||'div',Y=['<',X,' '],Z=(U&&U.call?U(R):U)||{},aa=(V&&V.call?V(R):V)||{},ab=(W&&W.call?W.call(this,Q,R):W)||'',ac=this.domId=aa.id||e.getNextId()+'_uiElement',ad=this.id=R.id,ae;aa.id=ac;var af={};if(R.type)af['cke_dialog_ui_'+R.type]=1;if(R.className)af[R.className]=1;if(R.disabled)af.cke_disabled=1;var ag=aa['class']&&aa['class'].split?aa['class'].split(' '):[];for(ae=0;ae=0;ae--){if(ai[ae]==='')ai.splice(ae,1);}if(ai.length>0)aa.style=(aa.style?aa.style+'; ':'')+ai.join('; ');for(ae in aa)Y.push(ae+'="'+e.htmlEncode(aa[ae])+'" ');Y.push('>',ab,'');S.push(Y.join(''));(this._||(this._={})).dialog=Q;if(typeof R.isChanged=='boolean')this.isChanged=function(){return R.isChanged;};if(typeof R.isChanged=='function')this.isChanged=R.isChanged;a.event.implementOn(this);this.registerEvents(R);if(this.accessKeyUp&&this.accessKeyDown&&R.accessKey)K(this,Q,'CTRL+'+R.accessKey);var aj=this;Q.on('load',function(){if(aj.getInputElement())aj.getInputElement().on('focus',function(){Q._.tabBarMode=false;Q._.hasFocus=true;aj.fire('focus');},aj);});if(this.keyboardFocusable){this.tabIndex=R.tabIndex||0;this.focusIndex=Q._.focusList.push(this)-1;this.on('focus',function(){Q._.currentFocusIndex=aj.focusIndex;});}e.extend(this,R);},hbox:function(Q,R,S,T,U){if(arguments.length<4)return;this._||(this._={});var V=this._.children=R,W=U&&U.widths||null,X=U&&U.height||null,Y={},Z,aa=function(){var ac=[''];for(Z=0;Z0)ac.push('style="'+ae.join('; ')+'" ');ac.push('>',S[Z],'');}ac.push('');return ac.join('');},ab={role:'presentation'};U&&U.align&&(ab.align=U.align);k.dialog.uiElement.call(this,Q,U||{type:'hbox'},T,'table',Y,ab,aa);},vbox:function(Q,R,S,T,U){if(arguments.length<3)return;this._||(this._={});var V=this._.children=R,W=U&&U.width||null,X=U&&U.heights||null,Y=function(){var Z=['');for(var aa=0;aa');}Z.push('
    0)Z.push('style="',ab.join('; '),'" ');Z.push(' class="cke_dialog_ui_vbox_child">',S[aa],'
    ');return Z.join('');};k.dialog.uiElement.call(this,Q,U||{type:'vbox'},T,'div',null,{role:'presentation'},Y);}};})();k.dialog.uiElement.prototype={getElement:function(){return a.document.getById(this.domId);},getInputElement:function(){return this.getElement();},getDialog:function(){return this._.dialog;},setValue:function(Q,R){this.getInputElement().setValue(Q);!R&&this.fire('change',{value:Q});return this;},getValue:function(){return this.getInputElement().getValue();},isChanged:function(){return false;},selectParentTab:function(){var T=this;var Q=T.getInputElement(),R=Q,S;while((R=R.getParent())&&R.$.className.search('cke_dialog_page_contents')==-1){}if(!R)return T;S=R.getAttribute('name');if(T._.dialog._.currentTabId!=S)T._.dialog.selectPage(S);return T;},focus:function(){this.selectParentTab().getInputElement().focus();return this;},registerEvents:function(Q){var R=/^on([A-Z]\w+)/,S,T=function(V,W,X,Y){W.on('load',function(){V.getInputElement().on(X,Y,V);});};for(var U in Q){if(!(S=U.match(R)))continue;if(this.eventProcessors[U])this.eventProcessors[U].call(this,this._.dialog,Q[U]);else T(this,this._.dialog,S[1].toLowerCase(),Q[U]);}return this; -},eventProcessors:{onLoad:function(Q,R){Q.on('load',R,this);},onShow:function(Q,R){Q.on('show',R,this);},onHide:function(Q,R){Q.on('hide',R,this);}},accessKeyDown:function(Q,R){this.focus();},accessKeyUp:function(Q,R){},disable:function(){var Q=this.getElement();Q.setAttribute('disabled','true');Q.addClass('cke_disabled');},enable:function(){var Q=this.getElement();Q.removeAttribute('disabled');Q.removeClass('cke_disabled');},isEnabled:function(){return!this.getInputElement().getAttribute('disabled');},isVisible:function(){return this.getInputElement().isVisible();},isFocusable:function(){if(!this.isEnabled()||!this.isVisible())return false;return true;}};k.dialog.hbox.prototype=e.extend(new k.dialog.uiElement(),{getChild:function(Q){var R=this;if(arguments.length<1)return R._.children.concat();if(!Q.splice)Q=[Q];if(Q.length<2)return R._.children[Q[0]];else return R._.children[Q[0]]&&R._.children[Q[0]].getChild?R._.children[Q[0]].getChild(Q.slice(1,Q.length)):null;}},true);k.dialog.vbox.prototype=new k.dialog.hbox();(function(){var Q={build:function(R,S,T){var U=S.children,V,W=[],X=[];for(var Y=0;Y',T||U.name,'');return V.join('');}};a.style.getStyleText=function(T){var U=T._ST;if(U)return U;U=T.styles;var V=T.attributes&&T.attributes.style||'',W='';if(V.length)V=V.replace(o,';');for(var X in U){var Y=U[X],Z=(X+':'+Y).replace(o,';');if(Y=='inherit')W+=Z;else V+=Z;}if(V.length)V=P(V);V+=W;return T._ST=V;};function s(T){var U,V;while(T=T.getParent()){if(T.getName()=='body')break;if(T.getAttribute('data-nostyle'))U=T;else if(!V){var W=T.getAttribute('contentEditable');if(W=='false')U=T;else if(W=='true')V=1;}}return U;};function t(T){var ax=this;var U=T.document;if(T.collapsed){var V=J(ax,U);T.insertNode(V);T.moveToPosition(V,2);return;}var W=ax.element,X=ax._.definition,Y,Z=X.includeReadonly;if(Z==undefined)Z=U.getCustomData('cke_includeReadonly');var aa=f[W]||(Y=true,f.span);T.enlarge(1,1);T.trim();var ab=T.createBookmark(),ac=ab.startNode,ad=ab.endNode,ae=ac,af,ag=s(ac),ah=s(ad);if(ag)ae=ag.getNextSourceNode(true);if(ah)ad=ah;if(ae.getPosition(ad)==2)ae=0;while(ae){var ai=false;if(ae.equals(ad)){ae=null;ai=true;}else{var aj=ae.type,ak=aj==1?ae.getName():null,al=ak&&ae.getAttribute('contentEditable')=='false',am=ak&&ae.getAttribute('data-nostyle'); -if(ak&&ae.data('cke-bookmark')){ae=ae.getNextSourceNode(true);continue;}if(!ak||aa[ak]&&!am&&(!al||Z)&&(ae.getPosition(ad)|4|0|8)==4+0+8&&(!X.childRule||X.childRule(ae))){var an=ae.getParent();if(an&&((an.getDtd()||f.span)[W]||Y)&&(!X.parentRule||X.parentRule(an))){if(!af&&(!ak||!f.$removeEmpty[ak]||(ae.getPosition(ad)|4|0|8)==4+0+8)){af=new d.range(U);af.setStartBefore(ae);}if(aj==3||al||aj==1&&!ae.getChildCount()){var ao=ae,ap;while((ai=!ao.getNext(q))&&(ap=ao.getParent(),aa[ap.getName()])&&(ap.getPosition(ac)|2|0|8)==2+0+8&&(!X.childRule||X.childRule(ap)))ao=ap;af.setEndAfter(ao);}}else ai=true;}else ai=true;ae=ae.getNextSourceNode(am||al);}if(ai&&af&&!af.collapsed){var aq=J(ax,U),ar=aq.hasAttributes(),as=af.getCommonAncestor(),at={styles:{},attrs:{},blockedStyles:{},blockedAttrs:{}},au,av,aw;while(aq&&as){if(as.getName()==W){for(au in X.attributes){if(at.blockedAttrs[au]||!(aw=as.getAttribute(av)))continue;if(aq.getAttribute(au)==aw)at.attrs[au]=1;else at.blockedAttrs[au]=1;}for(av in X.styles){if(at.blockedStyles[av]||!(aw=as.getStyle(av)))continue;if(aq.getStyle(av)==aw)at.styles[av]=1;else at.blockedStyles[av]=1;}}as=as.getParent();}for(au in at.attrs)aq.removeAttribute(au);for(av in at.styles)aq.removeStyle(av);if(ar&&!aq.hasAttributes())aq=null;if(aq){af.extractContents().appendTo(aq);G(ax,aq);af.insertNode(aq);aq.mergeSiblings();if(!c)aq.$.normalize();}else{aq=new h('span');af.extractContents().appendTo(aq);af.insertNode(aq);G(ax,aq);aq.remove(true);}af=null;}}T.moveToBookmark(ab);T.shrink(2);};function u(T){T.enlarge(1,1);var U=T.createBookmark(),V=U.startNode;if(T.collapsed){var W=new d.elementPath(V.getParent()),X;for(var Y=0,Z;Y'+V+'
    ';else T.setHtml(V);U.remove();};function B(T){var U=/(\S\s*)\n(?:\s|(]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,V=T.getName(),W=C(T.getOuterHtml(),U,function(Y,Z,aa){return Z+''+aa+'
    ';}),X=[];W.replace(/([\s\S]*?)<\/pre>/gi,function(Y,Z){X.push(Z);});return X;};function C(T,U,V){var W='',X='';T=T.replace(/(^]+data-cke-bookmark.*?\/span>)|(]+data-cke-bookmark.*?\/span>$)/gi,function(Y,Z,aa){Z&&(W=Z);aa&&(X=aa);return '';});return W+T.replace(U,V)+X;};function D(T,U){var V;if(T.length>1)V=new d.documentFragment(U.getDocument());for(var W=0;
    -W');X=X.replace(/[ \t]{2,}/g,function(Z){return e.repeat(' ',Z.length-1)+' ';});if(V){var Y=U.clone();Y.setHtml(X);V.append(Y);}else U.setHtml(X);}return V||U;};function E(T,U){var V=T.getBogus();V&&V.remove();var W=T.getHtml();W=C(W,/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,'');W=W.replace(/[ \t\r\n]*(]*>)[ \t\r\n]*/gi,'$1');W=W.replace(/([ \t\n\r]+| )/g,' ');W=W.replace(/]*>/gi,'\n');if(c){var X=T.getDocument().createElement('div');X.append(U);U.$.outerHTML='
    '+W+'
    ';U.copyAttributes(X.getFirst());U=X.getFirst().remove();}else U.setHtml(W);return U;};function F(T,U){var V=T._.definition,W=e.extend({},V.attributes,N(T)[U.getName()]),X=V.styles,Y=e.isEmpty(W)&&e.isEmpty(X);for(var Z in W){if((Z=='class'||T._.definition.fullMatch)&&U.getAttribute(Z)!=O(Z,W[Z]))continue;Y=U.hasAttribute(Z);U.removeAttribute(Z);}for(var aa in X){if(T._.definition.fullMatch&&U.getStyle(aa)!=O(aa,X[aa],true))continue;Y=Y||!!U.getStyle(aa);U.removeStyle(aa);}if(Y)!f.$block[U.getName()]||T._.enterMode==2&&!U.hasAttributes()?I(U):U.renameNode(T._.enterMode==1?'p':'div');};function G(T,U){var V=T._.definition,W=V.attributes,X=V.styles,Y=N(T),Z=U.getElementsByTag(T.element);for(var aa=Z.count();--aa>=0;)F(T,Z.getItem(aa));for(var ab in Y){if(ab!=T.element){Z=U.getElementsByTag(ab);for(aa=Z.count()-1;aa>=0;aa--){var ac=Z.getItem(aa);H(ac,Y[ab]);}}}};function H(T,U){var V=U&&U.attributes;if(V)for(var W=0;W0)H+=(F.$.offsetWidth||0)-(F.$.clientWidth||0);H+=4;F.setStyle('width',H+'px');v.element.addClass('cke_frameLoaded');var I=v.element.$.scrollHeight;if(c&&b.quirks&&I>0)I+=(F.$.offsetHeight||0)-(F.$.clientHeight||0);F.setStyle('height',I+'px');u._.currentBlock.element.setStyle('display','none').removeStyle('display');}else F.removeStyle('height');var J=u.element,K=J.getWindow(),L=K.getScrollPosition(),M=K.getViewPaneSize(),N={height:J.$.offsetHeight,width:J.$.offsetWidth};if(A?B<0:B+N.width>M.width+L.x)B+=N.width*(A?1:-1);if(C+N.height>M.height+L.y)C-=N.height;if(c){var O=new h(w.$.offsetParent),P=O;if(P.getName()=='html')P=P.getDocument().getBody();if(P.getComputedStyle('direction')=='rtl')if(b.ie8Compat)B-=w.getDocument().getDocumentElement().$.scrollLeft*2;else B-=O.$.scrollWidth-O.$.clientWidth; -}var Q=w.getFirst(),R;if(R=Q.getCustomData('activePanel'))R.onHide&&R.onHide.call(this,1);Q.setCustomData('activePanel',this);w.setStyles({top:C+'px',left:B+'px'});w.setOpacity(1);},this);u.isLoaded?E():u.onLoad=E;e.setTimeout(function(){x.$.contentWindow.focus();this.allowBlur(true);},0,this);},b.air?200:0,this);this.visible=1;if(this.onShow)this.onShow.call(this);n=0;},hide:function(){var p=this;if(p.visible&&(!p.onHide||p.onHide.call(p)!==true)){p.hideChild();p.element.setStyle('display','none');p.visible=0;p.element.getFirst().removeCustomData('activePanel');}},allowBlur:function(p){var q=this._.panel;if(p!=undefined)q.allowBlur=p;return q.allowBlur;},showAsChild:function(p,q,r,s,t,u){if(this._.activeChild==p&&p._.panel._.offsetParentId==r.getId())return;this.hideChild();p.onHide=e.bind(function(){e.setTimeout(function(){if(!this._.focused)this.hide();},0,this);},this);this._.activeChild=p;this._.focused=false;p.showBlock(q,r,s,t,u);if(b.ie7Compat||b.ie8&&b.ie6Compat)setTimeout(function(){p.element.getChild(0).$.style.cssText+='';},100);},hideChild:function(){var p=this._.activeChild;if(p){delete p.onHide;delete this._.activeChild;p.hide();}}}});a.on('instanceDestroyed',function(){var p=e.isEmpty(a.instances);for(var q in m){var r=m[q];if(p)r.destroy();else r.element.hide();}p&&(m={});});})();j.add('menu',{beforeInit:function(m){var n=m.config.menu_groups.split(','),o=m._.menuGroups={},p=m._.menuItems={};for(var q=0;q'],B=r.length,C=B&&r[0].group;for(var D=0;D');C=E.group;}E.render(this,D,A);}A.push('');u.setHtml(A.join('')); -k.fire('ready',this);if(this.parent)this.parent._.panel.showAsChild(t,this.id,n,o,p,q);else t.showBlock(this.id,n,o,p,q);s.fire('menuShow',[t]);},addListener:function(n){this._.listeners.push(n);},hide:function(){var n=this;n._.onHide&&n._.onHide();n._.panel&&n._.panel.hide();}}});function m(n){n.sort(function(o,p){if(o.groupp.group)return 1;return o.orderp.order?1:0;});};a.menuItem=e.createClass({$:function(n,o,p){var q=this;e.extend(q,p,{order:0,className:'cke_button_'+o});q.group=n._.menuGroups[q.group];q.editor=n;q.name=o;},proto:{render:function(n,o,p){var w=this;var q=n.id+String(o),r=typeof w.state=='undefined'?2:w.state,s=' cke_'+(r==1?'on':r==0?'disabled':'off'),t=w.label;if(w.className)s+=' '+w.className;var u=w.getItems;p.push(''+''+'');if(u)p.push('','&#',w.editor.lang.dir=='rtl'?'9668':'9658',';','');p.push(t,'');}}});})();i.menu_groups='clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div';(function(){var m;j.add('editingblock',{init:function(n){if(!n.config.editingBlock)return;n.on('themeSpace',function(o){if(o.data.space=='contents')o.data.html+='
    ';});n.on('themeLoaded',function(){n.fireOnce('editingBlockReady');});n.on('uiReady',function(){n.setMode(n.config.startupMode);});n.on('afterSetData',function(){if(!m){function o(){m=true;n.getMode().loadData(n.getData());m=false;};if(n.mode)o(); -else n.on('mode',function(){if(n.mode){o();n.removeListener('mode',arguments.callee);}});}});n.on('beforeGetData',function(){if(!m&&n.mode){m=true;n.setData(n.getMode().getData(),null,1);m=false;}});n.on('getSnapshot',function(o){if(n.mode)o.data=n.getMode().getSnapshotData();});n.on('loadSnapshot',function(o){if(n.mode)n.getMode().loadSnapshotData(o.data);});n.on('mode',function(o){o.removeListener();b.webkit&&n.container.on('focus',function(){n.focus();});if(n.config.startupFocus)n.focus();setTimeout(function(){n.fireOnce('instanceReady');a.fire('instanceReady',null,n);},0);});n.on('destroy',function(){var o=this;if(o.mode)o._.modes[o.mode].unload(o.getThemeSpace('contents'));});}});a.editor.prototype.mode='';a.editor.prototype.addMode=function(n,o){o.name=n;(this._.modes||(this._.modes={}))[n]=o;};a.editor.prototype.setMode=function(n){this.fire('beforeSetMode',{newMode:n});var o,p=this.getThemeSpace('contents'),q=this.checkDirty();if(this.mode){if(n==this.mode)return;this.fire('beforeModeUnload');var r=this.getMode();o=r.getData();r.unload(p);this.mode='';}p.setHtml('');var s=this.getMode(n);if(!s)throw '[CKEDITOR.editor.setMode] Unknown mode "'+n+'".';if(!q)this.on('mode',function(){this.resetDirty();this.removeListener('mode',arguments.callee);});s.load(p,typeof o!='string'?this.getData():o);};a.editor.prototype.getMode=function(n){return this._.modes&&this._.modes[n||this.mode];};a.editor.prototype.focus=function(){this.forceNextSelectionCheck();var n=this.getMode();if(n)n.focus();};})();i.startupMode='wysiwyg';i.editingBlock=true;(function(){function m(){var B=this;try{var y=B.getSelection();if(!y||!y.document.getWindow().$)return;var z=y.getStartElement(),A=new d.elementPath(z);if(!A.compare(B._.selectionPreviousPath)){B._.selectionPreviousPath=A;B.fire('selectionChange',{selection:y,path:A,element:z});}}catch(C){}};var n,o;function p(){o=true;if(n)return;q.call(this);n=e.setTimeout(q,200,this);};function q(){n=null;if(o){e.setTimeout(m,0,this);o=false;}};function r(y){function z(C){return C&&C.type==1&&C.getName() in f.$removeEmpty;};var A=y.startContainer,B=y.startOffset;if(A.type==3)return false;return!e.trim(A.getHtml())?z(A):z(A.getChild(B-1))||z(A.getChild(B));};var s={modes:{wysiwyg:1,source:1},readOnly:c||b.webkit,exec:function(y){switch(y.mode){case 'wysiwyg':y.document.$.execCommand('SelectAll',false,null);y.forceNextSelectionCheck();y.selectionChange();break;case 'source':var z=y.textarea.$;if(c)z.createTextRange().execCommand('SelectAll'); -else{z.selectionStart=0;z.selectionEnd=z.value.length;}z.focus();}},canUndo:false};function t(y){w(y);var z=y.createText('​');y.setCustomData('cke-fillingChar',z);return z;};function u(y){return y&&y.getCustomData('cke-fillingChar');};function v(y){var z=y&&u(y);if(z)if(z.getCustomData('ready'))w(y);else z.setCustomData('ready',1);};function w(y){var z=y&&y.removeCustomData('cke-fillingChar');if(z){z.setText(z.getText().replace(/\u200B/g,''));z=0;}};j.add('selection',{init:function(y){if(b.webkit){y.on('selectionChange',function(){v(y.document);});y.on('beforeSetMode',function(){w(y.document);});y.on('key',function(D){switch(D.data.keyCode){case 13:case 2000+13:case 37:case 39:case 8:w(y.document);}},null,null,10);var z,A;function B(){var D=y.document,E=u(D);if(E){var F=D.$.defaultView.getSelection();if(F.type=='Caret'&&F.anchorNode==E.$)A=1;z=E.getText();E.setText(z.replace(/\u200B/g,''));}};function C(){var D=y.document,E=u(D);if(E){E.setText(z);if(A){D.$.defaultView.getSelection().setPosition(E.$,E.getLength());A=0;}}};y.on('beforeUndoImage',B);y.on('afterUndoImage',C);y.on('beforeGetData',B,null,null,0);y.on('getData',C);}y.on('contentDom',function(){var D=y.document,E=D.getBody(),F=D.getDocumentElement();if(c){var G,H,I=1;E.on('focusin',function(M){if(M.data.$.srcElement.nodeName!='BODY')return;if(G){if(I){try{G.select();}catch(O){}var N=D.getCustomData('cke_locked_selection');if(N){N.unlock();N.lock();}}G=null;}});E.on('focus',function(){H=1;L();});E.on('beforedeactivate',function(M){if(M.data.$.toElement)return;H=0;I=1;});if(c&&b.version<8)y.on('blur',function(M){try{y.document&&y.document.$.selection.empty();}catch(N){}});F.on('mousedown',function(){I=0;});F.on('mouseup',function(){I=1;});if(c&&(b.ie7Compat||b.version<8||b.quirks))F.on('click',function(M){if(M.data.getTarget().getName()=='html')y.getSelection().getRanges()[0].select();});var J;E.on('mousedown',function(M){if(M.data.$.button==2){var N=y.document.$.selection;if(N.type=='None')J=y.window.getScrollPosition();}K();});E.on('mouseup',function(M){if(M.data.$.button==2&&J){y.document.$.documentElement.scrollLeft=J.x;y.document.$.documentElement.scrollTop=J.y;}J=null;H=1;setTimeout(function(){L(true);},0);});E.on('keydown',K);E.on('keyup',function(){H=1;L();});D.on('selectionchange',L);function K(){H=0;};function L(M){if(H){var N=y.document,O=y.getSelection(),P=O&&O.getNative();if(M&&P&&P.type=='None')if(!N.$.queryCommandEnabled('InsertImage')){e.setTimeout(L,50,this,true);return;}var Q;if(P&&P.type&&P.type!='Control'&&(Q=P.createRange())&&(Q=Q.parentElement())&&(Q=Q.nodeName)&&Q.toLowerCase() in {input:1,textarea:1})return; -G=P&&O.getRanges()[0];p.call(y);}};}else{D.on('mouseup',p,y);D.on('keyup',p,y);}});y.on('contentDomUnload',y.forceNextSelectionCheck,y);y.addCommand('selectAll',s);y.ui.addButton('SelectAll',{label:y.lang.selectAll,command:'selectAll'});y.selectionChange=p;}});a.editor.prototype.getSelection=function(){return this.document&&this.document.getSelection();};a.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath;};g.prototype.getSelection=function(){var y=new d.selection(this);return!y||y.isInvalid?null:y;};a.SELECTION_NONE=1;a.SELECTION_TEXT=2;a.SELECTION_ELEMENT=3;d.selection=function(y){var B=this;var z=y.getCustomData('cke_locked_selection');if(z)return z;B.document=y;B.isLocked=0;B._={cache:{}};if(c){var A=B.getNative().createRange();if(!A||A.item&&A.item(0).ownerDocument!=B.document.$||A.parentElement&&A.parentElement().ownerDocument!=B.document.$)B.isInvalid=true;}return B;};var x={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};d.selection.prototype={getNative:c?function(){return this._.cache.nativeSel||(this._.cache.nativeSel=this.document.$.selection);}:function(){return this._.cache.nativeSel||(this._.cache.nativeSel=this.document.getWindow().$.getSelection());},getType:c?function(){var y=this._.cache;if(y.type)return y.type;var z=1;try{var A=this.getNative(),B=A.type;if(B=='Text')z=2;if(B=='Control')z=3;if(A.createRange().parentElement)z=2;}catch(C){}return y.type=z;}:function(){var y=this._.cache;if(y.type)return y.type;var z=2,A=this.getNative();if(!A)z=1;else if(A.rangeCount==1){var B=A.getRangeAt(0),C=B.startContainer;if(C==B.endContainer&&C.nodeType==1&&B.endOffset-B.startOffset==1&&x[C.childNodes[B.startOffset].nodeName.toLowerCase()])z=3;}return y.type=z;},getRanges:(function(){var y=c?(function(){function z(B){return new d.node(B).getIndex();};var A=function(B,C){B=B.duplicate();B.collapse(C);var D=B.parentElement(),E=D.ownerDocument;if(!D.hasChildNodes())return{container:D,offset:0};var F=D.children,G,H,I=B.duplicate(),J=0,K=F.length-1,L=-1,M,N;while(J<=K){L=Math.floor((J+K)/2);G=F[L];I.moveToElementText(G);M=I.compareEndPoints('StartToStart',B);if(M>0)K=L-1;else if(M<0)J=L+1;else if(b.ie9Compat&&G.tagName=='BR'){var O='cke_range_marker';B.execCommand('CreateBookmark',false,O);G=E.getElementsByName(O)[0];var P=z(G);D.removeChild(G);return{container:D,offset:P};}else return{container:D,offset:z(G)};}if(L==-1||L==F.length-1&&M<0){I.moveToElementText(D); -I.setEndPoint('StartToStart',B);N=I.text.replace(/(\r\n|\r)/g,'\n').length;F=D.childNodes;if(!N){G=F[F.length-1];if(G.nodeType==1)return{container:D,offset:F.length};else return{container:G,offset:G.nodeValue.length};}var Q=F.length;while(N>0)N-=F[--Q].nodeValue.length;return{container:F[Q],offset:-N};}else{I.collapse(M>0?true:false);I.setEndPoint(M>0?'StartToStart':'EndToStart',B);N=I.text.replace(/(\r\n|\r)/g,'\n').length;if(!N)return{container:D,offset:z(G)+(M>0?0:1)};while(N>0)try{H=G[M>0?'previousSibling':'nextSibling'];N-=H.nodeValue.length;G=H;}catch(R){return{container:D,offset:z(G)};}return{container:G,offset:M>0?-N:G.nodeValue.length+N};}};return function(){var L=this;var B=L.getNative(),C=B&&B.createRange(),D=L.getType(),E;if(!B)return[];if(D==2){E=new d.range(L.document);var F=A(C,true);E.setStart(new d.node(F.container),F.offset);F=A(C);E.setEnd(new d.node(F.container),F.offset);if(E.endContainer.getPosition(E.startContainer)&4&&E.endOffset<=E.startContainer.getIndex())E.collapse();return[E];}else if(D==3){var G=[];for(var H=0;H=F.getLength())J.setStartAfter(F);else J.setStartBefore(F);if(G&&G.type==3)if(!I)J.setEndBefore(G);else J.setEndAfter(G);var L=new d.walker(J);L.evaluator=function(M){if(M.type==1&&M.isReadOnly()){var N=D.clone();D.setEndBefore(M);if(D.collapsed)B.splice(C--,1);if(!(M.getPosition(J.endContainer)&16)){N.setStartAfter(M);if(!N.collapsed)B.splice(C+1,0,N);}return true;}return false;};L.next();}}return A.ranges;};})(),getStartElement:function(){var F=this;var y=F._.cache; -if(y.startElement!==undefined)return y.startElement;var z,A=F.getNative();switch(F.getType()){case 3:return F.getSelectedElement();case 2:var B=F.getRanges()[0];if(B){if(!B.collapsed){B.optimize();while(1){var C=B.startContainer,D=B.startOffset;if(D==(C.getChildCount?C.getChildCount():C.getLength())&&!C.isBlockBoundary())B.setStartAfter(C);else break;}z=B.startContainer;if(z.type!=1)return z.getParent();z=z.getChild(B.startOffset);if(!z||z.type!=1)z=B.startContainer;else{var E=z.getFirst();while(E&&E.type==1){z=E;E=E.getFirst();}}}else{z=B.startContainer;if(z.type!=1)z=z.getParent();}z=z.$;}}return y.startElement=z?new h(z):null;},getSelectedElement:function(){var y=this._.cache;if(y.selectedElement!==undefined)return y.selectedElement;var z=this,A=e.tryThese(function(){return z.getNative().createRange().item(0);},function(){var B=z.getRanges()[0],C,D;for(var E=2;E&&!((C=B.getEnclosedNode())&&C.type==1&&x[C.getName()]&&(D=C));E--)B.shrink(1);return D.$;});return y.selectedElement=A?new h(A):null;},lock:function(){var y=this;y.getRanges();y.getStartElement();y.getSelectedElement();y._.cache.nativeSel={};y.isLocked=1;y.document.setCustomData('cke_locked_selection',y);},unlock:function(y){var D=this;var z=D.document,A=z.getCustomData('cke_locked_selection');if(A){z.setCustomData('cke_locked_selection',null);if(y){var B=A.getSelectedElement(),C=!B&&A.getRanges();D.isLocked=0;D.reset();z.getBody().focus();if(B)D.selectElement(B);else D.selectRanges(C);}}if(!A||!y){D.isLocked=0;D.reset();}},reset:function(){this._.cache={};},selectElement:function(y){var A=this;if(A.isLocked){var z=new d.range(A.document);z.setStartBefore(y);z.setEndAfter(y);A._.cache.selectedElement=y;A._.cache.startElement=y;A._.cache.ranges=new d.rangeList(z);A._.cache.type=3;return;}z=new d.range(y.getDocument());z.setStartBefore(y);z.setEndAfter(y);z.select();A.document.fire('selectionchange');A.reset();},selectRanges:function(y){var M=this;if(M.isLocked){M._.cache.selectedElement=null;M._.cache.startElement=y[0]&&y[0].getTouchedStartNode();M._.cache.ranges=new d.rangeList(y);M._.cache.type=2;return;}if(c){if(y.length>1){var z=y[y.length-1];y[0].setEnd(z.endContainer,z.endOffset);y.length=1;}if(y[0])y[0].select();M.reset();}else{var A=M.getNative();if(!A)return;if(y.length){A.removeAllRanges();b.webkit&&w(M.document);}for(var B=0;B=0){H.collapse(1);I.setEnd(H.endContainer.$,H.endOffset);}else throw N;}A.addRange(I);}M.reset();}},createBookmarks:function(y){return this.getRanges().createBookmarks(y);},createBookmarks2:function(y){return this.getRanges().createBookmarks2(y);},selectBookmarks:function(y){var z=[];for(var A=0;A','','',this.label,'','=10900&&!o.hc?'':" href=\"javascript:void('"+this.label+"')\"",' role="button" aria-labelledby="',p,'_label" aria-describedby="',p,'_text" aria-haspopup="true"');if(b.opera||b.gecko&&b.mac)n.push(' onkeypress="return false;"');if(b.gecko)n.push(' onblur="this.style.cssText = this.style.cssText;"');n.push(' onkeydown="CKEDITOR.tools.callFunction( ',t,', event, this );" onclick="CKEDITOR.tools.callFunction(',q,', this); return false;">'+this.label+''+''+''+(b.hc?'▼':b.air?' ':'')+''+''+''+'');if(this.onRender)this.onRender();return r;},createPanel:function(m){if(this._.panel)return;var n=this._.panelDefinition,o=this._.panelDefinition.block,p=n.parent||a.document.getBody(),q=new k.floatPanel(m,p,n),r=q.addListBlock(this.id,o),s=this;q.onShow=function(){if(s.className)this.element.getFirst().addClass(s.className+'_panel');s.setState(1);r.focus(!s.multiSelect&&s.getValue());s._.on=1;if(s.onOpen)s.onOpen();};q.onHide=function(t){if(s.className)this.element.getFirst().removeClass(s.className+'_panel');s.setState(s.modes&&s.modes[m.mode]?2:0);s._.on=0;if(!t&&s.onClose)s.onClose();};q.onEscape=function(){q.hide();s.document.getById('cke_'+s.id).getFirst().getNext().focus();};r.onClick=function(t,u){s.document.getWindow().focus();if(s.onClick)s.onClick.call(s,t,u);if(u)s.setValue(t,s._.items[t]);else s.setValue('');q.hide();};this._.panel=q;this._.list=r;q.getBlock(this.id).onHide=function(){s._.on=0;s.setState(2);};if(this.init)this.init(); -},setValue:function(m,n){var p=this;p._.value=m;var o=p.document.getById('cke_'+p.id+'_text');if(o){if(!(m||n)){n=p.label;o.addClass('cke_inline_label');}else o.removeClass('cke_inline_label');o.setHtml(typeof n!='undefined'?n:m);}},getValue:function(){return this._.value||'';},unmarkAll:function(){this._.list.unmarkAll();},mark:function(m){this._.list.mark(m);},hideItem:function(m){this._.list.hideItem(m);},hideGroup:function(m){this._.list.hideGroup(m);},showAll:function(){this._.list.showAll();},add:function(m,n,o){this._.items[m]=o||m;this._.list.add(m,n,o);},startGroup:function(m){this._.list.startGroup(m);},commit:function(){var m=this;if(!m._.committed){m._.list.commit();m._.committed=1;k.fire('ready',m);}m._.committed=1;},setState:function(m){var n=this;if(n._.state==m)return;n.document.getById('cke_'+n.id).setState(m);n._.state=m;}}});k.prototype.addRichCombo=function(m,n){this.add(m,'richcombo',n);};j.add('htmlwriter');a.htmlWriter=e.createClass({base:a.htmlParser.basicWriter,$:function(){var o=this;o.base();o.indentationChars='\t';o.selfClosingEnd=' />';o.lineBreakChars='\n';o.forceSimpleAmpersand=0;o.sortAttributes=1;o._.indent=0;o._.indentation='';o._.inPre=0;o._.rules={};var m=f;for(var n in e.extend({},m.$nonBodyContent,m.$block,m.$listItem,m.$tableContent))o.setRules(n,{indent:1,breakBeforeOpen:1,breakAfterOpen:1,breakBeforeClose:!m[n]['#'],breakAfterClose:1});o.setRules('br',{breakAfterOpen:1});o.setRules('title',{indent:0,breakAfterOpen:0});o.setRules('style',{indent:0,breakBeforeClose:1});o.setRules('pre',{indent:0});},proto:{openTag:function(m,n){var p=this;var o=p._.rules[m];if(p._.indent)p.indentation();else if(o&&o.breakBeforeOpen){p.lineBreak();p.indentation();}p._.output.push('<',m);},openTagClose:function(m,n){var p=this;var o=p._.rules[m];if(n)p._.output.push(p.selfClosingEnd);else{p._.output.push('>');if(o&&o.indent)p._.indentation+=p.indentationChars;}if(o&&o.breakAfterOpen)p.lineBreak();m=='pre'&&(p._.inPre=1);},attribute:function(m,n){if(typeof n=='string'){this.forceSimpleAmpersand&&(n=n.replace(/&/g,'&'));n=e.htmlEncodeAttr(n);}this._.output.push(' ',m,'="',n,'"');},closeTag:function(m){var o=this;var n=o._.rules[m];if(n&&n.indent)o._.indentation=o._.indentation.substr(o.indentationChars.length);if(o._.indent)o.indentation();else if(n&&n.breakBeforeClose){o.lineBreak();o.indentation();}o._.output.push('');m=='pre'&&(o._.inPre=0);if(n&&n.breakAfterClose)o.lineBreak();},text:function(m){var n=this;if(n._.indent){n.indentation(); -!n._.inPre&&(m=e.ltrim(m));}n._.output.push(m);},comment:function(m){if(this._.indent)this.indentation();this._.output.push('');},lineBreak:function(){var m=this;if(!m._.inPre&&m._.output.length>0)m._.output.push(m.lineBreakChars);m._.indent=1;},indentation:function(){var m=this;if(!m._.inPre)m._.output.push(m._.indentation);m._.indent=0;},setRules:function(m,n){var o=this._.rules[m];if(o)e.extend(o,n,true);else this._.rules[m]=n;}}});j.add('menubutton',{requires:['button','menu'],beforeInit:function(m){m.ui.addHandler('menubutton',k.menuButton.handler);}});a.UI_MENUBUTTON='menubutton';(function(){var m=function(n){var o=this._;if(o.state===0)return;o.previousState=o.state;var p=o.menu;if(!p){p=o.menu=new a.menu(n,{panel:{className:n.skinClass+' cke_contextmenu',attributes:{'aria-label':n.lang.common.options}}});p.onHide=e.bind(function(){this.setState(this.modes&&this.modes[n.mode]?o.previousState:0);},this);if(this.onMenu)p.addListener(this.onMenu);}if(o.on){p.hide();return;}this.setState(1);p.show(a.document.getById(this._.id),4);};k.menuButton=e.createClass({base:k.button,$:function(n){var o=n.panel;delete n.panel;this.base(n);this.hasArrow=true;this.click=m;},statics:{handler:{create:function(n){return new k.menuButton(n);}}}});})();j.add('dialogui');(function(){var m=function(u){var x=this;x._||(x._={});x._['default']=x._.initValue=u['default']||'';x._.required=u.required||false;var v=[x._];for(var w=1;w',v.label,'','');else{var D={type:'hbox',widths:v.widths,padding:0,children:[{type:'html',html:'
    "; - } else { - elem.innerHTML= content; - } - height = elem.offsetHeight; - height = Math.max( 1, Math.floor( elem.offsetHeight / this.lineHeight ) ) * this.lineHeight; - return height; - }; - - /** - * Fix line height for the given lines - * @param Integer linestart - * @param Integer lineEnd End line or -1 to cover all lines - */ - EditArea.prototype.fixLinesHeight= function( textValue, lineStart,lineEnd ){ - var aText = textValue.split("\n"); - if( lineEnd == -1 ) - lineEnd = aText.length-1; - for( var i = Math.max(0, lineStart); i <= lineEnd; i++ ) - { - if( elem = _$('line_'+ ( i+1 ) ) ) - { - elem.style.height= typeof( aText[i] ) != "undefined" ? this.getTextHeight( aText[i] )+"px" : this.lineHeight; - } - } - }; - - EditArea.prototype.area_select= function(start, length){ - this.textarea.focus(); - - start = Math.max(0, Math.min(this.textarea.value.length, start)); - end = Math.max(start, Math.min(this.textarea.value.length, start+length)); - - if(this.isIE) - { - this.textarea.selectionStart = start; - this.textarea.selectionEnd = end; - this.setIESelection(); - } - else - { - // Opera bug when moving selection start and selection end - if(this.isOpera && this.isOpera < 9.6 ) - { - this.textarea.setSelectionRange(0, 0); - } - this.textarea.setSelectionRange(start, end); - } - this.check_line_selection(); - }; - - - EditArea.prototype.area_get_selection= function(){ - var text=""; - if( document.selection ){ - var range = document.selection.createRange(); - text=range.text; - }else{ - text= this.textarea.value.substring(this.textarea.selectionStart, this.textarea.selectionEnd); - } - return text; - }; \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/edit_area/reg_syntax.js b/include/limesurvey/admin/scripts/edit_area/reg_syntax.js deleted file mode 100644 index 572aff30..00000000 --- a/include/limesurvey/admin/scripts/edit_area/reg_syntax.js +++ /dev/null @@ -1,166 +0,0 @@ - EditAreaLoader.prototype.get_regexp= function(text_array){ - //res="( |=|\\n|\\r|\\[|\\(|µ|)("; - res="(\\b)("; - for(i=0; i0) - res+="|"; - //res+="("+ tab_text[i] +")"; - //res+=tab_text[i].replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\{|\})/g, "\\$1"); - res+=this.get_escaped_regexp(text_array[i]); - } - //res+=")( |\\.|:|\\{|\\(|\\)|\\[|\\]|\'|\"|\\r|\\n|\\t|$)"; - res+=")(\\b)"; - reg= new RegExp(res); - - return res; - }; - - - EditAreaLoader.prototype.get_escaped_regexp= function(str){ - return str.toString().replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\}|\{|\$|\^|\|)/g, "\\$1"); - }; - - EditAreaLoader.prototype.init_syntax_regexp= function(){ - var lang_style= {}; - for(var lang in this.load_syntax){ - if(!this.syntax[lang]) // init the regexp if not already initialized - { - this.syntax[lang]= {}; - this.syntax[lang]["keywords_reg_exp"]= {}; - this.keywords_reg_exp_nb=0; - - if(this.load_syntax[lang]['KEYWORDS']){ - param="g"; - if(this.load_syntax[lang]['KEYWORD_CASE_SENSITIVE']===false) - param+="i"; - for(var i in this.load_syntax[lang]['KEYWORDS']){ - if(typeof(this.load_syntax[lang]['KEYWORDS'][i])=="function") continue; - this.syntax[lang]["keywords_reg_exp"][i]= new RegExp(this.get_regexp( this.load_syntax[lang]['KEYWORDS'][i] ), param); - this.keywords_reg_exp_nb++; - } - } - - if(this.load_syntax[lang]['OPERATORS']){ - var str=""; - var nb=0; - for(var i in this.load_syntax[lang]['OPERATORS']){ - if(typeof(this.load_syntax[lang]['OPERATORS'][i])=="function") continue; - if(nb>0) - str+="|"; - str+=this.get_escaped_regexp(this.load_syntax[lang]['OPERATORS'][i]); - nb++; - } - if(str.length>0) - this.syntax[lang]["operators_reg_exp"]= new RegExp("("+str+")","g"); - } - - if(this.load_syntax[lang]['DELIMITERS']){ - var str=""; - var nb=0; - for(var i in this.load_syntax[lang]['DELIMITERS']){ - if(typeof(this.load_syntax[lang]['DELIMITERS'][i])=="function") continue; - if(nb>0) - str+="|"; - str+=this.get_escaped_regexp(this.load_syntax[lang]['DELIMITERS'][i]); - nb++; - } - if(str.length>0) - this.syntax[lang]["delimiters_reg_exp"]= new RegExp("("+str+")","g"); - } - - - // /(("(\\"|[^"])*"?)|('(\\'|[^'])*'?)|(//(.|\r|\t)*\n)|(/\*(.|\n|\r|\t)*\*/)|())/gi - var syntax_trace=[]; - - // /("(?:[^"\\]*(\\\\)*(\\"?)?)*("|$))/g - - this.syntax[lang]["quotes"]={}; - var quote_tab= []; - if(this.load_syntax[lang]['QUOTEMARKS']){ - for(var i in this.load_syntax[lang]['QUOTEMARKS']){ - if(typeof(this.load_syntax[lang]['QUOTEMARKS'][i])=="function") continue; - var x=this.get_escaped_regexp(this.load_syntax[lang]['QUOTEMARKS'][i]); - this.syntax[lang]["quotes"][x]=x; - //quote_tab[quote_tab.length]="("+x+"(?:\\\\"+x+"|[^"+x+"])*("+x+"|$))"; - //previous working : quote_tab[quote_tab.length]="("+x+"(?:[^"+x+"\\\\]*(\\\\\\\\)*(\\\\"+x+"?)?)*("+x+"|$))"; - quote_tab[quote_tab.length]="("+ x +"(\\\\.|[^"+ x +"])*(?:"+ x +"|$))"; - - syntax_trace.push(x); - } - } - - this.syntax[lang]["comments"]={}; - if(this.load_syntax[lang]['COMMENT_SINGLE']){ - for(var i in this.load_syntax[lang]['COMMENT_SINGLE']){ - if(typeof(this.load_syntax[lang]['COMMENT_SINGLE'][i])=="function") continue; - var x=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_SINGLE'][i]); - quote_tab[quote_tab.length]="("+x+"(.|\\r|\\t)*(\\n|$))"; - syntax_trace.push(x); - this.syntax[lang]["comments"][x]="\n"; - } - } - // (/\*(.|[\r\n])*?\*/) - if(this.load_syntax[lang]['COMMENT_MULTI']){ - for(var i in this.load_syntax[lang]['COMMENT_MULTI']){ - if(typeof(this.load_syntax[lang]['COMMENT_MULTI'][i])=="function") continue; - var start=this.get_escaped_regexp(i); - var end=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_MULTI'][i]); - quote_tab[quote_tab.length]="("+start+"(.|\\n|\\r)*?("+end+"|$))"; - syntax_trace.push(start); - syntax_trace.push(end); - this.syntax[lang]["comments"][i]=this.load_syntax[lang]['COMMENT_MULTI'][i]; - } - } - if(quote_tab.length>0) - this.syntax[lang]["comment_or_quote_reg_exp"]= new RegExp("("+quote_tab.join("|")+")","gi"); - - if(syntax_trace.length>0) // /((.|\n)*?)(\\*("|'|\/\*|\*\/|\/\/|$))/g - this.syntax[lang]["syntax_trace_regexp"]= new RegExp("((.|\n)*?)(\\\\*("+ syntax_trace.join("|") +"|$))", "gmi"); - - if(this.load_syntax[lang]['SCRIPT_DELIMITERS']){ - this.syntax[lang]["script_delimiters"]= {}; - for(var i in this.load_syntax[lang]['SCRIPT_DELIMITERS']){ - if(typeof(this.load_syntax[lang]['SCRIPT_DELIMITERS'][i])=="function") continue; - this.syntax[lang]["script_delimiters"][i]= this.load_syntax[lang]['SCRIPT_DELIMITERS']; - } - } - - this.syntax[lang]["custom_regexp"]= {}; - if(this.load_syntax[lang]['REGEXPS']){ - for(var i in this.load_syntax[lang]['REGEXPS']){ - if(typeof(this.load_syntax[lang]['REGEXPS'][i])=="function") continue; - var val= this.load_syntax[lang]['REGEXPS'][i]; - if(!this.syntax[lang]["custom_regexp"][val['execute']]) - this.syntax[lang]["custom_regexp"][val['execute']]= {}; - this.syntax[lang]["custom_regexp"][val['execute']][i]={'regexp' : new RegExp(val['search'], val['modifiers']) - , 'class' : val['class']}; - } - } - - if(this.load_syntax[lang]['STYLES']){ - lang_style[lang]= {}; - for(var i in this.load_syntax[lang]['STYLES']){ - if(typeof(this.load_syntax[lang]['STYLES'][i])=="function") continue; - if(typeof(this.load_syntax[lang]['STYLES'][i]) != "string"){ - for(var j in this.load_syntax[lang]['STYLES'][i]){ - lang_style[lang][j]= this.load_syntax[lang]['STYLES'][i][j]; - } - }else{ - lang_style[lang][i]= this.load_syntax[lang]['STYLES'][i]; - } - } - } - // build style string - var style=""; - for(var i in lang_style[lang]){ - if(lang_style[lang][i].length>0){ - style+= "."+ lang +" ."+ i.toLowerCase() +" span{"+lang_style[lang][i]+"}\n"; - style+= "."+ lang +" ."+ i.toLowerCase() +"{"+lang_style[lang][i]+"}\n"; - } - } - this.syntax[lang]["styles"]=style; - } - } - }; - - editAreaLoader.waiting_loading["reg_syntax.js"]= "loaded"; diff --git a/include/limesurvey/admin/scripts/edit_area/reg_syntax/css.js b/include/limesurvey/admin/scripts/edit_area/reg_syntax/css.js deleted file mode 100644 index cff605aa..00000000 --- a/include/limesurvey/admin/scripts/edit_area/reg_syntax/css.js +++ /dev/null @@ -1,85 +0,0 @@ -editAreaLoader.load_syntax["css"] = { - 'DISPLAY_NAME' : 'CSS' - ,'COMMENT_SINGLE' : {1 : '@'} - ,'COMMENT_MULTI' : {'/*' : '*/'} - ,'QUOTEMARKS' : ['"', "'"] - ,'KEYWORD_CASE_SENSITIVE' : false - ,'KEYWORDS' : { - 'attributes' : [ - 'aqua', 'azimuth', 'background-attachment', 'background-color', - 'background-image', 'background-position', 'background-repeat', - 'background', 'border-bottom-color', 'border-bottom-style', - 'border-bottom-width', 'border-left-color', 'border-left-style', - 'border-left-width', 'border-right', 'border-right-color', - 'border-right-style', 'border-right-width', 'border-top-color', - 'border-top-style', 'border-top-width','border-bottom', 'border-collapse', - 'border-left', 'border-width', 'border-color', 'border-spacing', - 'border-style', 'border-top', 'border', 'caption-side', - 'clear', 'clip', 'color', 'content', 'counter-increment', 'counter-reset', - 'cue-after', 'cue-before', 'cue', 'cursor', 'direction', 'display', - 'elevation', 'empty-cells', 'float', 'font-family', 'font-size', - 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', - 'font-weight', 'font', 'height', 'letter-spacing', 'line-height', - 'list-style', 'list-style-image', 'list-style-position', 'list-style-type', - 'margin-bottom', 'margin-left', 'margin-right', 'margin-top', 'margin', - 'marker-offset', 'marks', 'max-height', 'max-width', 'min-height', - 'min-width', 'opacity', 'orphans', 'outline', 'outline-color', 'outline-style', - 'outline-width', 'overflow', 'padding-bottom', 'padding-left', - 'padding-right', 'padding-top', 'padding', 'page', 'page-break-after', - 'page-break-before', 'page-break-inside', 'pause-after', 'pause-before', - 'pause', 'pitch', 'pitch-range', 'play-during', 'position', 'quotes', - 'richness', 'right', 'size', 'speak-header', 'speak-numeral', 'speak-punctuation', - 'speak', 'speech-rate', 'stress', 'table-layout', 'text-align', 'text-decoration', - 'text-indent', 'text-shadow', 'text-transform', 'top', 'unicode-bidi', - 'vertical-align', 'visibility', 'voice-family', 'volume', 'white-space', 'widows', - 'width', 'word-spacing', 'z-index', 'bottom', 'left' - ] - ,'values' : [ - 'above', 'absolute', 'always', 'armenian', 'aural', 'auto', 'avoid', - 'baseline', 'behind', 'below', 'bidi-override', 'black', 'blue', 'blink', 'block', 'bold', 'bolder', 'both', - 'capitalize', 'center-left', 'center-right', 'center', 'circle', 'cjk-ideographic', - 'close-quote', 'collapse', 'condensed', 'continuous', 'crop', 'crosshair', 'cross', 'cursive', - 'dashed', 'decimal-leading-zero', 'decimal', 'default', 'digits', 'disc', 'dotted', 'double', - 'e-resize', 'embed', 'extra-condensed', 'extra-expanded', 'expanded', - 'fantasy', 'far-left', 'far-right', 'faster', 'fast', 'fixed', 'fuchsia', - 'georgian', 'gray', 'green', 'groove', 'hebrew', 'help', 'hidden', 'hide', 'higher', - 'high', 'hiragana-iroha', 'hiragana', 'icon', 'inherit', 'inline-table', 'inline', - 'inset', 'inside', 'invert', 'italic', 'justify', 'katakana-iroha', 'katakana', - 'landscape', 'larger', 'large', 'left-side', 'leftwards', 'level', 'lighter', 'lime', 'line-through', 'list-item', 'loud', 'lower-alpha', 'lower-greek', 'lower-roman', 'lowercase', 'ltr', 'lower', 'low', - 'maroon', 'medium', 'message-box', 'middle', 'mix', 'monospace', - 'n-resize', 'narrower', 'navy', 'ne-resize', 'no-close-quote', 'no-open-quote', 'no-repeat', 'none', 'normal', 'nowrap', 'nw-resize', - 'oblique', 'olive', 'once', 'open-quote', 'outset', 'outside', 'overline', - 'pointer', 'portrait', 'purple', 'px', - 'red', 'relative', 'repeat-x', 'repeat-y', 'repeat', 'rgb', 'ridge', 'right-side', 'rightwards', - 's-resize', 'sans-serif', 'scroll', 'se-resize', 'semi-condensed', 'semi-expanded', 'separate', 'serif', 'show', 'silent', 'silver', 'slow', 'slower', 'small-caps', 'small-caption', 'smaller', 'soft', 'solid', 'spell-out', 'square', - 'static', 'status-bar', 'super', 'sw-resize', - 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row', 'table-row-group', 'teal', 'text', 'text-bottom', 'text-top', 'thick', 'thin', 'transparent', - 'ultra-condensed', 'ultra-expanded', 'underline', 'upper-alpha', 'upper-latin', 'upper-roman', 'uppercase', 'url', - 'visible', - 'w-resize', 'wait', 'white', 'wider', - 'x-fast', 'x-high', 'x-large', 'x-loud', 'x-low', 'x-small', 'x-soft', 'xx-large', 'xx-small', - 'yellow', 'yes' - ] - ,'specials' : [ - 'important' - ] - } - ,'OPERATORS' :[ - ':', ';', '!', '.', '#' - ] - ,'DELIMITERS' :[ - '{', '}' - ] - ,'STYLES' : { - 'COMMENTS': 'color: #AAAAAA;' - ,'QUOTESMARKS': 'color: #6381F8;' - ,'KEYWORDS' : { - 'attributes' : 'color: #48BDDF;' - ,'values' : 'color: #2B60FF;' - ,'specials' : 'color: #FF0000;' - } - ,'OPERATORS' : 'color: #FF00FF;' - ,'DELIMITERS' : 'color: #60CA00;' - - } -}; diff --git a/include/limesurvey/admin/scripts/edit_area/reg_syntax/html.js b/include/limesurvey/admin/scripts/edit_area/reg_syntax/html.js deleted file mode 100644 index 66490b17..00000000 --- a/include/limesurvey/admin/scripts/edit_area/reg_syntax/html.js +++ /dev/null @@ -1,51 +0,0 @@ -/* -* last update: 2006-08-24 -*/ - -editAreaLoader.load_syntax["html"] = { - 'DISPLAY_NAME' : 'HTML' - ,'COMMENT_SINGLE' : {} - ,'COMMENT_MULTI' : {''} - ,'QUOTEMARKS' : {1: "'", 2: '"'} - ,'KEYWORD_CASE_SENSITIVE' : false - ,'KEYWORDS' : { - } - ,'OPERATORS' :[ - ] - ,'DELIMITERS' :[ - ] - ,'REGEXPS' : { - 'doctype' : { - 'search' : '()(]*>)()' - ,'class' : 'doctype' - ,'modifiers' : '' - ,'execute' : 'before' // before or after - } - ,'tags' : { - 'search' : '(<)(/?[a-z][^ \r\n\t>]*)([^>]*>)' - ,'class' : 'tags' - ,'modifiers' : 'gi' - ,'execute' : 'before' // before or after - } - ,'attributes' : { - 'search' : '( |\n|\r|\t)([^ \r\n\t=]+)(=)' - ,'class' : 'attributes' - ,'modifiers' : 'g' - ,'execute' : 'before' // before or after - } - } - ,'STYLES' : { - 'COMMENTS': 'color: #AAAAAA;' - ,'QUOTESMARKS': 'color: #6381F8;' - ,'KEYWORDS' : { - } - ,'OPERATORS' : 'color: #E775F0;' - ,'DELIMITERS' : '' - ,'REGEXPS' : { - 'attributes': 'color: #B1AC41;' - ,'tags': 'color: #E62253;' - ,'doctype': 'color: #8DCFB5;' - ,'test': 'color: #00FF00;' - } - } -}; diff --git a/include/limesurvey/admin/scripts/edit_area/reg_syntax/js.js b/include/limesurvey/admin/scripts/edit_area/reg_syntax/js.js deleted file mode 100644 index 556566bd..00000000 --- a/include/limesurvey/admin/scripts/edit_area/reg_syntax/js.js +++ /dev/null @@ -1,94 +0,0 @@ -editAreaLoader.load_syntax["js"] = { - 'DISPLAY_NAME' : 'Javascript' - ,'COMMENT_SINGLE' : {1 : '//'} - ,'COMMENT_MULTI' : {'/*' : '*/'} - ,'QUOTEMARKS' : {1: "'", 2: '"'} - ,'KEYWORD_CASE_SENSITIVE' : false - ,'KEYWORDS' : { - 'statements' : [ - 'as', 'break', 'case', 'catch', 'continue', 'decodeURI', 'delete', 'do', - 'else', 'encodeURI', 'eval', 'finally', 'for', 'if', 'in', 'is', 'item', - 'instanceof', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'void', - 'while', 'write', 'with' - ] - ,'keywords' : [ - 'class', 'const', 'default', 'debugger', 'export', 'extends', 'false', - 'function', 'import', 'namespace', 'new', 'null', 'package', 'private', - 'protected', 'public', 'super', 'true', 'use', 'var', 'window', 'document', - // the list below must be sorted and checked (if it is a keywords or a function and if it is not present twice - 'Link ', 'outerHeight ', 'Anchor', 'FileUpload', - 'location', 'outerWidth', 'Select', 'Area', 'find', 'Location', 'Packages', 'self', - 'arguments', 'locationbar', 'pageXoffset', 'Form', - 'Math', 'pageYoffset', 'setTimeout', 'assign', 'Frame', 'menubar', 'parent', 'status', - 'blur', 'frames', 'MimeType', 'parseFloat', 'statusbar', 'Boolean', 'Function', 'moveBy', - 'parseInt', 'stop', 'Button', 'getClass', 'moveTo', 'Password', 'String', 'callee', 'Hidden', - 'name', 'personalbar', 'Submit', 'caller', 'history', 'NaN', 'Plugin', 'sun', 'captureEvents', - 'History', 'navigate', 'print', 'taint', 'Checkbox', 'home', 'navigator', 'prompt', 'Text', - 'Image', 'Navigator', 'prototype', 'Textarea', 'clearTimeout', 'Infinity', - 'netscape', 'Radio', 'toolbar', 'close', 'innerHeight', 'Number', 'ref', 'top', 'closed', - 'innerWidth', 'Object', 'RegExp', 'toString', 'confirm', 'isFinite', 'onBlur', 'releaseEvents', - 'unescape', 'constructor', 'isNan', 'onError', 'Reset', 'untaint', 'Date', 'java', 'onFocus', - 'resizeBy', 'unwatch', 'defaultStatus', 'JavaArray', 'onLoad', 'resizeTo', 'valueOf', 'document', - 'JavaClass', 'onUnload', 'routeEvent', 'watch', 'Document', 'JavaObject', 'open', 'scroll', 'window', - 'Element', 'JavaPackage', 'opener', 'scrollbars', 'Window', 'escape', 'length', 'Option', 'scrollBy' - ] - ,'functions' : [ - // common functions for Window object - 'alert', 'Array', 'back', 'blur', 'clearInterval', 'close', 'confirm', 'eval ', 'focus', 'forward', 'home', - 'name', 'navigate', 'onblur', 'onerror', 'onfocus', 'onload', 'onmove', - 'onresize', 'onunload', 'open', 'print', 'prompt', 'scroll', 'scrollTo', 'setInterval', 'status', - 'stop' - ] - } - ,'OPERATORS' :[ - '+', '-', '/', '*', '=', '<', '>', '%', '!' - ] - ,'DELIMITERS' :[ - '(', ')', '[', ']', '{', '}' - ] - ,'STYLES' : { - 'COMMENTS': 'color: #AAAAAA;' - ,'QUOTESMARKS': 'color: #6381F8;' - ,'KEYWORDS' : { - 'statements' : 'color: #60CA00;' - ,'keywords' : 'color: #48BDDF;' - ,'functions' : 'color: #2B60FF;' - } - ,'OPERATORS' : 'color: #FF00FF;' - ,'DELIMITERS' : 'color: #0038E1;' - - } - ,'AUTO_COMPLETION' : { - "default": { // the name of this definition group. It's posisble to have different rules inside the same definition file - "REGEXP": { "before_word": "[^a-zA-Z0-9_]|^" // \\s|\\.| - ,"possible_words_letters": "[a-zA-Z0-9_]+" - ,"letter_after_word_must_match": "[^a-zA-Z0-9_]|$" - ,"prefix_separator": "\\." - } - ,"CASE_SENSITIVE": true - ,"MAX_TEXT_LENGTH": 100 // the maximum length of the text being analyzed before the cursor position - ,"KEYWORDS": { - '': [ // the prefix of thoses items - /** - * 0 : the keyword the user is typing - * 1 : (optionnal) the string inserted in code ("{@}" being the new position of the cursor, "§" beeing the equivalent to the value the typed string indicated if the previous ) - * If empty the keyword will be displayed - * 2 : (optionnal) the text that appear in the suggestion box (if empty, the string to insert will be displayed) - */ - ['Array', '§()', ''] - ,['alert', '§({@})', 'alert(String message)'] - ,['document'] - ,['window'] - ] - ,'window' : [ - ['location'] - ,['document'] - ,['scrollTo', 'scrollTo({@})', 'scrollTo(Int x,Int y)'] - ] - ,'location' : [ - ['href'] - ] - } - } - } -}; diff --git a/include/limesurvey/admin/scripts/edit_area/regexp.js b/include/limesurvey/admin/scripts/edit_area/regexp.js deleted file mode 100644 index 90ec3b1c..00000000 --- a/include/limesurvey/admin/scripts/edit_area/regexp.js +++ /dev/null @@ -1,139 +0,0 @@ - /*EditArea.prototype.comment_or_quotes= function(v0, v1, v2, v3, v4,v5,v6,v7,v8,v9, v10){ - new_class="quotes"; - if(v6 && v6 != undefined && v6!="") - new_class="comments"; - return "µ__"+ new_class +"__µ"+v0+"µ_END_µ"; - - };*/ - -/* EditArea.prototype.htmlTag= function(v0, v1, v2, v3, v4,v5,v6,v7,v8,v9, v10){ - res=""+v2; - alert("v2: "+v2+" v3: "+v3); - tab=v3.split("="); - attributes=""; - if(tab.length>1){ - attributes=""+tab[0]+"="; - for(i=1; i"; - attributes+=""+tab[i].substr(cut)+"="; - } - attributes+=""+tab[tab.length-1]+""; - } - res+=attributes+v5+""; - return res; - };*/ - - // determine if the selected text if a comment or a quoted text - EditArea.prototype.comment_or_quote= function(){ - var new_class="", close_tag="", sy, arg, i; - sy = parent.editAreaLoader.syntax[editArea.current_code_lang]; - arg = EditArea.prototype.comment_or_quote.arguments[0]; - - for( i in sy["quotes"] ){ - if(arg.indexOf(i)==0){ - new_class="quotesmarks"; - close_tag=sy["quotes"][i]; - } - } - if(new_class.length==0) - { - for(var i in sy["comments"]){ - if( arg.indexOf(i)==0 ){ - new_class="comments"; - close_tag=sy["comments"][i]; - } - } - } - // for single line comment the \n must not be included in the span tags - if(close_tag=="\n"){ - return "µ__"+ new_class +"__µ"+ arg.replace(/(\r?\n)?$/m, "µ_END_µ$1"); - }else{ - // the closing tag must be set only if the comment or quotes is closed - reg= new RegExp(parent.editAreaLoader.get_escaped_regexp(close_tag)+"$", "m"); - if( arg.search(reg)!=-1 ) - return "µ__"+ new_class +"__µ"+ arg +"µ_END_µ"; - else - return "µ__"+ new_class +"__µ"+ arg; - } - }; - -/* - // apply special tags arround text to highlight - EditArea.prototype.custom_highlight= function(){ - res= EditArea.prototype.custom_highlight.arguments[1]+"µ__"+ editArea.reg_exp_span_tag +"__µ" + EditArea.prototype.custom_highlight.arguments[2]+"µ_END_µ"; - if(EditArea.prototype.custom_highlight.arguments.length>5) - res+= EditArea.prototype.custom_highlight.arguments[ EditArea.prototype.custom_highlight.arguments.length-3 ]; - return res; - }; - */ - - // return identication that allow to know if revalidating only the text line won't make the syntax go mad - EditArea.prototype.get_syntax_trace= function(text){ - if(this.settings["syntax"].length>0 && parent.editAreaLoader.syntax[this.settings["syntax"]]["syntax_trace_regexp"]) - return text.replace(parent.editAreaLoader.syntax[this.settings["syntax"]]["syntax_trace_regexp"], "$3"); - }; - - - EditArea.prototype.colorize_text= function(text){ - //text="
    "; - /* - if(this.isOpera){ - // opera can't use pre element tabulation cause a tab=6 chars in the textarea and 8 chars in the pre - text= this.replace_tab(text); - }*/ - - text= " "+text; // for easier regExp - - /*if(this.do_html_tags) - text= text.replace(/(<[a-z]+ [^>]*>)/gi, '[__htmlTag__]$1[_END_]');*/ - if(this.settings["syntax"].length>0) - text= this.apply_syntax(text, this.settings["syntax"]); - - // remove the first space added - return text.substr(1).replace(/&/g,"&").replace(//g,">").replace(/µ_END_µ/g,"").replace(/µ__([a-zA-Z0-9]+)__µ/g,""); - }; - - EditArea.prototype.apply_syntax= function(text, lang){ - var sy; - this.current_code_lang=lang; - - if(!parent.editAreaLoader.syntax[lang]) - return text; - - sy = parent.editAreaLoader.syntax[lang]; - if(sy["custom_regexp"]['before']){ - for( var i in sy["custom_regexp"]['before']){ - var convert="$1µ__"+ sy["custom_regexp"]['before'][i]['class'] +"__µ$2µ_END_µ$3"; - text= text.replace(sy["custom_regexp"]['before'][i]['regexp'], convert); - } - } - - if(sy["comment_or_quote_reg_exp"]){ - //setTimeout("_$('debug_area').value=editArea.comment_or_quote_reg_exp;", 500); - text= text.replace(sy["comment_or_quote_reg_exp"], this.comment_or_quote); - } - - if(sy["keywords_reg_exp"]){ - for(var i in sy["keywords_reg_exp"]){ - text= text.replace(sy["keywords_reg_exp"][i], 'µ__'+i+'__µ$2µ_END_µ'); - } - } - - if(sy["delimiters_reg_exp"]){ - text= text.replace(sy["delimiters_reg_exp"], 'µ__delimiters__µ$1µ_END_µ'); - } - - if(sy["operators_reg_exp"]){ - text= text.replace(sy["operators_reg_exp"], 'µ__operators__µ$1µ_END_µ'); - } - - if(sy["custom_regexp"]['after']){ - for( var i in sy["custom_regexp"]['after']){ - var convert="$1µ__"+ sy["custom_regexp"]['after'][i]['class'] +"__µ$2µ_END_µ$3"; - text= text.replace(sy["custom_regexp"]['after'][i]['regexp'], convert); - } - } - - return text; - }; diff --git a/include/limesurvey/admin/scripts/edit_area/resize_area.js b/include/limesurvey/admin/scripts/edit_area/resize_area.js deleted file mode 100644 index dfaad19c..00000000 --- a/include/limesurvey/admin/scripts/edit_area/resize_area.js +++ /dev/null @@ -1,73 +0,0 @@ - - EditAreaLoader.prototype.start_resize_area= function(){ - var d=document,a,div,width,height,father; - - d.onmouseup= editAreaLoader.end_resize_area; - d.onmousemove= editAreaLoader.resize_area; - editAreaLoader.toggle(editAreaLoader.resize["id"]); - - a = editAreas[editAreaLoader.resize["id"]]["textarea"]; - div = d.getElementById("edit_area_resize"); - if(!div){ - div= d.createElement("div"); - div.id="edit_area_resize"; - div.style.border="dashed #888888 1px"; - } - width = a.offsetWidth -2; - height = a.offsetHeight -2; - - div.style.display = "block"; - div.style.width = width+"px"; - div.style.height = height+"px"; - father= a.parentNode; - father.insertBefore(div, a); - - a.style.display="none"; - - editAreaLoader.resize["start_top"]= calculeOffsetTop(div); - editAreaLoader.resize["start_left"]= calculeOffsetLeft(div); - }; - - EditAreaLoader.prototype.end_resize_area= function(e){ - var d=document,div,a,width,height; - - d.onmouseup=""; - d.onmousemove=""; - - div = d.getElementById("edit_area_resize"); - a= editAreas[editAreaLoader.resize["id"]]["textarea"]; - width = Math.max(editAreas[editAreaLoader.resize["id"]]["settings"]["min_width"], div.offsetWidth-4); - height = Math.max(editAreas[editAreaLoader.resize["id"]]["settings"]["min_height"], div.offsetHeight-4); - if(editAreaLoader.isIE==6){ - width-=2; - height-=2; - } - a.style.width = width+"px"; - a.style.height = height+"px"; - div.style.display = "none"; - a.style.display = "inline"; - a.selectionStart = editAreaLoader.resize["selectionStart"]; - a.selectionEnd = editAreaLoader.resize["selectionEnd"]; - editAreaLoader.toggle(editAreaLoader.resize["id"]); - - return false; - }; - - EditAreaLoader.prototype.resize_area= function(e){ - var allow,newHeight,newWidth; - allow = editAreas[editAreaLoader.resize["id"]]["settings"]["allow_resize"]; - if(allow=="both" || allow=="y") - { - newHeight = Math.max(20, getMouseY(e)- editAreaLoader.resize["start_top"]); - document.getElementById("edit_area_resize").style.height= newHeight+"px"; - } - if(allow=="both" || allow=="x") - { - newWidth= Math.max(20, getMouseX(e)- editAreaLoader.resize["start_left"]); - document.getElementById("edit_area_resize").style.width= newWidth+"px"; - } - - return false; - }; - - editAreaLoader.waiting_loading["resize_area.js"]= "loaded"; diff --git a/include/limesurvey/admin/scripts/edit_area/search_replace.js b/include/limesurvey/admin/scripts/edit_area/search_replace.js deleted file mode 100644 index b22c541b..00000000 --- a/include/limesurvey/admin/scripts/edit_area/search_replace.js +++ /dev/null @@ -1,174 +0,0 @@ - EditArea.prototype.show_search = function(){ - if(_$("area_search_replace").style.visibility=="visible"){ - this.hidden_search(); - }else{ - this.open_inline_popup("area_search_replace"); - var text= this.area_get_selection(); - var search= text.split("\n")[0]; - _$("area_search").value= search; - _$("area_search").focus(); - } - }; - - EditArea.prototype.hidden_search= function(){ - /*_$("area_search_replace").style.visibility="hidden"; - this.textarea.focus(); - var icon= _$("search"); - setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );*/ - this.close_inline_popup("area_search_replace"); - }; - - EditArea.prototype.area_search= function(mode){ - - if(!mode) - mode="search"; - _$("area_search_msg").innerHTML=""; - var search=_$("area_search").value; - - this.textarea.focus(); - this.textarea.textareaFocused=true; - - var infos= this.get_selection_infos(); - var start= infos["selectionStart"]; - var pos=-1; - var pos_begin=-1; - var length=search.length; - - if(_$("area_search_replace").style.visibility!="visible"){ - this.show_search(); - return; - } - if(search.length==0){ - _$("area_search_msg").innerHTML=this.get_translation("search_field_empty"); - return; - } - // advance to the next occurence if no text selected - if(mode!="replace" ){ - if(_$("area_search_reg_exp").checked) - start++; - else - start+= search.length; - } - - //search - if(_$("area_search_reg_exp").checked){ - // regexp search - var opt="m"; - if(!_$("area_search_match_case").checked) - opt+="i"; - var reg= new RegExp(search, opt); - pos= infos["full_text"].substr(start).search(reg); - pos_begin= infos["full_text"].search(reg); - if(pos!=-1){ - pos+=start; - length=infos["full_text"].substr(start).match(reg)[0].length; - }else if(pos_begin!=-1){ - length=infos["full_text"].match(reg)[0].length; - } - }else{ - if(_$("area_search_match_case").checked){ - pos= infos["full_text"].indexOf(search, start); - pos_begin= infos["full_text"].indexOf(search); - }else{ - pos= infos["full_text"].toLowerCase().indexOf(search.toLowerCase(), start); - pos_begin= infos["full_text"].toLowerCase().indexOf(search.toLowerCase()); - } - } - - // interpret result - if(pos==-1 && pos_begin==-1){ - _$("area_search_msg").innerHTML=""+search+" "+this.get_translation("not_found"); - return; - }else if(pos==-1 && pos_begin != -1){ - begin= pos_begin; - _$("area_search_msg").innerHTML=this.get_translation("restart_search_at_begin"); - }else - begin= pos; - - //_$("area_search_msg").innerHTML+=""+search+" found at "+begin+" strat at "+start+" pos "+pos+" curs"+ infos["indexOfCursor"]+"."; - if(mode=="replace" && pos==infos["indexOfCursor"]){ - var replace= _$("area_replace").value; - var new_text=""; - if(_$("area_search_reg_exp").checked){ - var opt="m"; - if(!_$("area_search_match_case").checked) - opt+="i"; - var reg= new RegExp(search, opt); - new_text= infos["full_text"].substr(0, begin) + infos["full_text"].substr(start).replace(reg, replace); - }else{ - new_text= infos["full_text"].substr(0, begin) + replace + infos["full_text"].substr(begin + length); - } - this.textarea.value=new_text; - this.area_select(begin, length); - this.area_search(); - }else - this.area_select(begin, length); - }; - - - - - EditArea.prototype.area_replace= function(){ - this.area_search("replace"); - }; - - EditArea.prototype.area_replace_all= function(){ - /* this.area_select(0, 0); - _$("area_search_msg").innerHTML=""; - while(_$("area_search_msg").innerHTML==""){ - this.area_replace(); - }*/ - - var base_text= this.textarea.value; - var search= _$("area_search").value; - var replace= _$("area_replace").value; - if(search.length==0){ - _$("area_search_msg").innerHTML=this.get_translation("search_field_empty"); - return ; - } - - var new_text=""; - var nb_change=0; - if(_$("area_search_reg_exp").checked){ - // regExp - var opt="mg"; - if(!_$("area_search_match_case").checked) - opt+="i"; - var reg= new RegExp(search, opt); - nb_change= infos["full_text"].match(reg).length; - new_text= infos["full_text"].replace(reg, replace); - - }else{ - - if(_$("area_search_match_case").checked){ - var tmp_tab=base_text.split(search); - nb_change= tmp_tab.length -1 ; - new_text= tmp_tab.join(replace); - }else{ - // case insensitive - var lower_value=base_text.toLowerCase(); - var lower_search=search.toLowerCase(); - - var start=0; - var pos= lower_value.indexOf(lower_search); - while(pos!=-1){ - nb_change++; - new_text+= this.textarea.value.substring(start , pos)+replace; - start=pos+ search.length; - pos= lower_value.indexOf(lower_search, pos+1); - } - new_text+= this.textarea.value.substring(start); - } - } - if(new_text==base_text){ - _$("area_search_msg").innerHTML=""+search+" "+this.get_translation("not_found"); - }else{ - this.textarea.value= new_text; - _$("area_search_msg").innerHTML=""+nb_change+" "+this.get_translation("occurrence_replaced"); - // firefox and opera doesn't manage with the focus if it's done directly - //editArea.textarea.focus();editArea.textarea.textareaFocused=true; - setTimeout("editArea.textarea.focus();editArea.textarea.textareaFocused=true;", 100); - } - - - }; diff --git a/include/limesurvey/admin/scripts/edit_area/template.html b/include/limesurvey/admin/scripts/edit_area/template.html deleted file mode 100644 index f20ef3e1..00000000 --- a/include/limesurvey/admin/scripts/edit_area/template.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - -EditArea - - - [__CSSRULES__] - [__JSCODE__] - - -
    -
    [__TOOLBAR__]
    -
    -
    -
    -
    -
     
    -
     
    -
    -
    -
    -
    -
    - - -
    -
    -
    - - - - - - - - -
    {$position}: - {$line_abbr} 0, {$char_abbr} 0 - {$total}: - {$line_abbr} 0, {$char_abbr} 0 - - resize -
    -
    -
    -
    -
    - {$processing} -
    -
    - -
    - - - - - - - - - -
    {$search} - {$close_popup}
    -
    {$replace}{$move_popup}
    -
    - - -
    -{$find_next} - {$replace} - {$replace_all}
    -
    -
    -
    -
    -
    - {$close_popup} -
    -

    Editarea [__EA_VERSION__]


    -

    {$shortcuts}:

    -{$tab}: {$add_tab}
    -{$shift}+{$tab}: {$remove_tab}
    -{$ctrl}+f: {$search_command}
    -{$ctrl}+r: {$replace_command}
    -{$ctrl}+h: {$highlight}
    -{$ctrl}+g: {$go_to_line}
    -{$ctrl}+z: {$undo}
    -{$ctrl}+y: {$redo}
    -{$ctrl}+e: {$help}
    -{$ctrl}+q, {$esc}: {$close_popup}
    -{$accesskey} E: {$toggle}
    -
    - {$about_notice} -
    -
    -
    - - diff --git a/include/limesurvey/admin/scripts/editor.js b/include/limesurvey/admin/scripts/editor.js deleted file mode 100644 index d373f4d5..00000000 --- a/include/limesurvey/admin/scripts/editor.js +++ /dev/null @@ -1,12 +0,0 @@ -// $Id: labels.js 8649 2010-04-28 21:38:53Z c_schmitz $ - -$(document).ready(function(){ - - if (sHTMLEditorMode=='inline') { - $('textarea.fulledit').ckeditor(function() { /* callback code */ }, { toolbar : sHTMLEditorMode, - language : sEditorLanguage, - width: 660, - customConfig : 'limesurvey-config.js' }); - } - -}); diff --git a/include/limesurvey/admin/scripts/emailtemplates.js b/include/limesurvey/admin/scripts/emailtemplates.js deleted file mode 100644 index 3607b751..00000000 --- a/include/limesurvey/admin/scripts/emailtemplates.js +++ /dev/null @@ -1,41 +0,0 @@ -// $Id: saved.js 9330 2010-10-24 22:23:56Z c_schmitz $ - -$(document).ready(function(){ - handle=$('.tabsinner').tabs( - { - show: loadHTMLEditor - }); -}); - -/** -* This function loads each FCKeditor only when the tab is clicked and only if it is not already loaded -*/ -function loadHTMLEditor(event, ui) -{ - if (typeof ui.panel.selector != 'undefined') - { - sSelector=ui.panel.selector; - } - else - { - sSelector='#'+ui.panel.id; - } - if ($(sSelector+' iframe').size()==0) - { - sCKEditorInstanceName='oFCKeditor_'+$(sSelector+' textarea').attr('id').replace(/-/g, "_"); - eval("if (typeof "+sCKEditorInstanceName+" != 'undefined')"+sCKEditorInstanceName+".ReplaceTextarea();"); - } -} - -function fillin(tofield, fromfield) -{ - if (confirm(sReplaceTextConfirmation)) - { - if (document.getElementById(tofield).readOnly == false) - { - $('#'+tofield).val($('#'+fromfield).val()); - } - updateCKeditor(tofield,$('#'+fromfield).val()); - - } -} \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/globalsettings.js b/include/limesurvey/admin/scripts/globalsettings.js deleted file mode 100644 index d7d0e52c..00000000 --- a/include/limesurvey/admin/scripts/globalsettings.js +++ /dev/null @@ -1,34 +0,0 @@ -// $Id: globalsettings.js 8964 2010-07-20 20:46:47Z anishseth $ - -$(document).ready(function(){ - $("#emailmethod").change(Emailchange); - Emailchange(); - - $("#bounceaccounttype").change(Emailchanges); - Emailchanges(); -}); - -function Emailchange(ui,evt) -{ - smtp_enabled=($("#emailmethod").val()=='smtp'); - if (smtp_enabled==true) {smtp_enabled='';} - else {smtp_enabled='disabled';} - $("#emailsmtphost").attr('disabled',smtp_enabled); - $("#emailsmtpuser").attr('disabled',smtp_enabled); - $("#emailsmtppassword").attr('disabled',smtp_enabled); - $("#emailsmtpssl").attr('disabled',smtp_enabled); - $("#emailsmtpdebug").attr('disabled',smtp_enabled); - -} -function Emailchanges(ui,evt) -{ - bounce_disabled=($("#bounceaccounttype").val()=='off'); - if (bounce_disabled==true) {bounce_disabled='disabled';} - else {bounce_disabled='';} - $("#bounceaccounthost").attr('disabled',bounce_disabled); - $("#bounceaccountuser").attr('disabled',bounce_disabled); - $("#bounceaccountpass").attr('disabled',bounce_disabled); - $("#bounceencryption").attr('disabled',bounce_disabled); - $("#bounceaccountmailbox").attr('disabled',bounce_disabled); -} - diff --git a/include/limesurvey/admin/scripts/kcfinder/browse.php b/include/limesurvey/admin/scripts/kcfinder/browse.php deleted file mode 100644 index 2b93e5c2..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/browse.php +++ /dev/null @@ -1,19 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -require "core/autoload.php"; -$browser = new browser(); -$browser->action(); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/config.php b/include/limesurvey/admin/scripts/kcfinder/config.php deleted file mode 100644 index e28c734d..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/config.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -// IMPORTANT!!! Do not remove uncommented settings in this file even if -// you are using session configuration. -// See http://kcfinder.sunhater.com/install for setting descriptions - - -$_CONFIG = array( - - 'disabled' => true, - 'readonly' => false, - 'denyZipDownload' => true, - - 'theme' => "oxygen", - - 'uploadURL' => "upload", - 'uploadDir' => "", - - 'dirPerms' => 0755, - 'filePerms' => 0644, - - 'deniedExts' => "exe com msi bat php cgi pl php4 php5 sh", - - 'types' => array( - - // CKEditor & FCKEditor types - 'files' => "", - 'flash' => "", - 'images' => "", - ), - - 'mime_magic' => "", - - 'maxImageWidth' => 0, - 'maxImageHeight' => 0, - - 'thumbWidth' => 100, - 'thumbHeight' => 100, - - 'thumbsDir' => ".thumbs", - - 'jpegQuality' => 90, - - 'cookieDomain' => "", - 'cookiePath' => "", - 'cookiePrefix' => 'KCFINDER_', - - // THE FOLLOWING SETTINGS CANNOT BE OVERRIDED WITH SESSION CONFIGURATION - - '_check4htaccess' => true, - //'_tinyMCEPath' => "/tiny_mce", - - '_sessionVar' => &$_SESSION['KCFINDER'], - //'_sessionLifetime' => 30, - //'_sessionDir' => "/full/directory/path", - - //'_sessionDomain' => ".mysite.com", - //'_sessionPath' => "/my/path", -); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/core/.htaccess b/include/limesurvey/admin/scripts/kcfinder/core/.htaccess deleted file mode 100644 index d61b264c..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/core/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ - -Order allow,deny -Deny from all - diff --git a/include/limesurvey/admin/scripts/kcfinder/core/autoload.php b/include/limesurvey/admin/scripts/kcfinder/core/autoload.php deleted file mode 100644 index 850f1b2a..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/core/autoload.php +++ /dev/null @@ -1,101 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - - require_once(dirname(__FILE__).'/../../../../config-defaults.php'); - require_once(dirname(__FILE__).'/../../../../common.php'); - require_once(dirname(__FILE__).'/../../../admin_functions.php'); - - $usquery = "SELECT stg_value FROM ".db_table_name("settings_global")." where stg_name='SessionName'"; - $usresult = db_execute_assoc($usquery,'',true); - if ($usresult) - { - $usrow = $usresult->FetchRow(); - @session_name($usrow['stg_value']); - } - else - { - session_name("LimeSurveyAdmin"); - } - - session_set_cookie_params(0,$relativeurl.'/'); - - if (session_id() == "") @session_start(); - - $_SESSION['KCFINDER'] = array(); - - $sAllowedExtensions = implode(' ',array_map('trim',explode(',',$allowedresourcesuploads))); - $_SESSION['KCFINDER']['types']=array('files'=>$sAllowedExtensions, - 'flash'=>$sAllowedExtensions, - 'images'=>$sAllowedExtensions); - if ($demoModeOnly === false && - isset($_SESSION['loginID']) && - isset($_SESSION['FileManagerContext'])) - { - // disable upload at survey creation time - // because we don't know the sid yet - if (preg_match('/^(create|edit):(question|group|answer)/',$_SESSION['FileManagerContext']) != 0 || - preg_match('/^edit:survey/',$_SESSION['FileManagerContext']) !=0 || - preg_match('/^edit:assessments/',$_SESSION['FileManagerContext']) !=0 || - preg_match('/^edit:emailsettings/',$_SESSION['FileManagerContext']) != 0) - { - $contextarray=explode(':',$_SESSION['FileManagerContext'],3); - $surveyid=$contextarray[2]; - - - - if(bHasSurveyPermission($surveyid,'surveycontent','update')) - { - $_SESSION['KCFINDER']['disabled'] = false ; - if (preg_match('/^edit:emailsettings/',$_SESSION['FileManagerContext']) != 0) - { - $_SESSION['KCFINDER']['uploadURL'] = "{$rooturl}/upload/surveys/{$surveyid}/" ; - } - else - { - $_SESSION['KCFINDER']['uploadURL'] = "{$relativeurl}/upload/surveys/{$surveyid}/" ; - } - $_SESSION['KCFINDER']['uploadDir'] = $uploaddir.'/surveys/'.$surveyid; - } - - } - elseif (preg_match('/^edit:label/',$_SESSION['FileManagerContext']) != 0) - { - $contextarray=explode(':',$_SESSION['FileManagerContext'],3); - $labelid=$contextarray[2]; - // check if the user has label management right and labelid defined - if ($_SESSION['USER_RIGHT_MANAGE_LABEL']==1 && isset($labelid) && $labelid != '') - { - $_SESSION['KCFINDER']['disabled'] = false ; - $_SESSION['KCFINDER']['uploadURL'] = "{$relativeurl}/upload/labels/{$labelid}/" ; - $_SESSION['KCFINDER']['uploadDir'] = "{$uploaddir}/labels/{$labelid}" ; - } - } - - } - - - function __autoload($class) { - if ($class == "uploader") - require "core/uploader.php"; - elseif ($class == "browser") - require "core/browser.php"; - elseif (file_exists("core/types/$class.php")) - require "core/types/$class.php"; - elseif (file_exists("lib/class_$class.php")) - require "lib/class_$class.php"; - elseif (file_exists("lib/helper_$class.php")) - require "lib/helper_$class.php"; - } - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/core/browser.php b/include/limesurvey/admin/scripts/kcfinder/core/browser.php deleted file mode 100644 index 56a3fe12..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/core/browser.php +++ /dev/null @@ -1,773 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class browser extends uploader { - protected $action; - protected $thumbsDir; - protected $thumbsTypeDir; - - public function __construct() { - parent::__construct(); - - if (isset($this->post['dir'])) { - $dir = $this->checkInputDir($this->post['dir'], true, false); - if ($dir === false) unset($this->post['dir']); - $this->post['dir'] = $dir; - } - - if (isset($this->get['dir'])) { - $dir = $this->checkInputDir($this->get['dir'], true, false); - if ($dir === false) unset($this->get['dir']); - $this->get['dir'] = $dir; - } - - $thumbsDir = $this->config['uploadDir'] . "/" . $this->config['thumbsDir']; - if (( - !is_dir($thumbsDir) && - !@mkdir($thumbsDir, $this->config['dirPerms']) - ) || - - !is_readable($thumbsDir) || - !dir::isWritable($thumbsDir) || - ( - !is_dir("$thumbsDir/{$this->type}") && - !@mkdir("$thumbsDir/{$this->type}", $this->config['dirPerms']) - ) - ) - $this->errorMsg("Cannot access or create thumbnails folder."); - - $this->thumbsDir = $thumbsDir; - $this->thumbsTypeDir = "$thumbsDir/{$this->type}"; - - // Remove temporary zip downloads if exists - $files = dir::content($this->config['uploadDir'], array( - 'types' => "file", - 'pattern' => '/^.*\.zip$/i' - )); - - if (is_array($files) && count($files)) { - $time = time(); - foreach ($files as $file) - if (is_file($file) && ($time - filemtime($file) > 3600)) - unlink($file); - } - } - - public function action() { - $act = isset($this->get['act']) ? $this->get['act'] : "browser"; - if (!method_exists($this, "act_$act")) - $act = "browser"; - $this->action = $act; - $method = "act_$act"; - - if ($this->config['disabled']) { - $message = $this->label("You don't have permissions to browse server."); - if (in_array($act, array("browser", "upload")) || - (substr($act, 0, 8) == "download") - ) - $this->backMsg($message); - else { - header("Content-Type: text/xml; charset={$this->charset}"); - die($this->output(array('message' => $message), "error")); - } - } - - if (!isset($this->session['dir'])) - $this->session['dir'] = $this->type; - else { - $type = $this->getTypeFromPath($this->session['dir']); - $dir = $this->config['uploadDir'] . "/" . $this->session['dir']; - if (($type != $this->type) || !is_dir($dir) || !is_readable($dir)) - $this->session['dir'] = $this->type; - } - $this->session['dir'] = path::normalize($this->session['dir']); - - if ($act == "browser") { - header("X-UA-Compatible: chrome=1"); - header("Content-Type: text/html; charset={$this->charset}"); - } else if ( - (substr($act, 0, 8) != "download") && - !in_array($act, array("thumb", "upload")) - ) - header("Content-Type: text/xml; charset={$this->charset}"); - elseif ($act != "thumb") - header("Content-Type: text/html; charset={$this->charset}"); - - $return = $this->$method(); - echo ($return === true) - ? "" - : $return; - } - - protected function act_browser() { - if (isset($this->get['dir']) && - is_dir("{$this->typeDir}/{$this->get['dir']}") && - is_readable("{$this->typeDir}/{$this->get['dir']}") - ) - $this->session['dir'] = path::normalize("{$this->type}/{$this->get['dir']}"); - - return $this->output(); - } - - protected function act_init() { - $tree = $this->getDirInfo($this->typeDir); - $tree['dirs'] = $this->getTree($this->session['dir']); - if (!is_array($tree['dirs']) || !count($tree['dirs'])) - unset($tree['dirs']); - $tree = $this->xmlTree($tree); - $files = $this->getFiles($this->session['dir']); - $dirWritable = dir::isWritable("{$this->config['uploadDir']}/{$this->session['dir']}"); - $data = array( - 'tree' => &$tree, - 'files' => &$files, - 'dirWritable' => $dirWritable - ); - return $this->output($data); - } - - protected function act_thumb() { - if (!isset($this->get['file'])) - $this->sendDefaultThumb(); - $file = $this->get['file']; - if (basename($file) != $file) - $this->sendDefaultThumb(); - $file = "{$this->thumbsDir}/{$this->session['dir']}/$file"; - if (!is_file($file) || !is_readable($file)) { - $file = "{$this->config['uploadDir']}/{$this->session['dir']}/" . basename($file); - if (!is_file($file) || !is_readable($file)) - $this->sendDefaultThumb($file); - $image = new gd($file); - if ($image->init_error) - $this->sendDefaultThumb($file); - $browsable = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_JPEG2000, IMAGETYPE_PNG); - if (in_array($image->type, $browsable) && - ($image->get_width() <= $this->config['thumbWidth']) && - ($image->get_height() <= $this->config['thumbHeight']) - ) { - $type = - ($image->type == IMAGETYPE_GIF) ? "gif" : ( - ($image->type == IMAGETYPE_PNG) ? "png" : "jpeg"); - $type = "image/$type"; - httpCache::file($file, $type); - } else - $this->sendDefaultThumb($file); - } - httpCache::file($file, "image/jpeg"); - } - - protected function act_expand() { - return $this->output(array('dirs' => $this->getDirs($this->postDir()))); - } - - protected function act_chDir() { - $this->postDir(); // Just for existing check - $this->session['dir'] = $this->type . "/" . $this->post['dir']; - $dirWritable = dir::isWritable("{$this->config['uploadDir']}/{$this->session['dir']}"); - return $this->output(array( - 'files' => $this->getFiles($this->session['dir']), - 'dirWritable' => $dirWritable - )); - } - - protected function act_newDir() { - if ($this->config['readonly'] || - !isset($this->post['dir']) || - !isset($this->post['newDir']) || true) - $this->errorMsg("Unknown error."); - - $dir = $this->postDir(); - $newDir = trim($this->post['newDir']); - if (!strlen($newDir)) - $this->errorMsg("Please enter new folder name."); - if (preg_match('/[\/\\\\]/s', $newDir)) - $this->errorMsg("Unallowable characters in folder name."); - if (substr($newDir, 0, 1) == ".") - $this->errorMsg("Folder name shouldn't begins with '.'"); - if (file_exists("$dir/$newDir")) - $this->errorMsg("A file or folder with that name already exists."); - if (!@mkdir("$dir/$newDir", $this->config['dirPerms'])) - $this->errorMsg("Cannot create {dir} folder.", array('dir' => $newDir)); - return true; - } - - protected function act_renameDir() { - if ($this->config['readonly'] || - !isset($this->post['dir']) || - !isset($this->post['newName']) - ) - $this->errorMsg("Unknown error."); - - $dir = $this->postDir(); - $newName = trim($this->post['newName']); - if (!strlen($newName)) - $this->errorMsg("Please enter new folder name."); - if (preg_match('/[\/\\\\]/s', $newName)) - $this->errorMsg("Unallowable characters in folder name."); - if (substr($newName, 0, 1) == ".") - $this->errorMsg("Folder name shouldn't begins with '.'"); - if (!@rename($dir, dirname($dir) . "/$newName")) - $this->errorMsg("Cannot rename the folder."); - $thumbDir = "$this->thumbsTypeDir/{$this->post['dir']}"; - if (is_dir($thumbDir)) - @rename($thumbDir, dirname($thumbDir) . "/$newName"); - return $this->output(array('name' => $newName)); - } - - protected function act_deleteDir() { - if ($this->config['readonly'] || - !isset($this->post['dir']) || - !strlen(trim($this->post['dir'])) - ) - $this->errorMsg("Unknown error."); - - $dir = $this->postDir(); - - if (!dir::isWritable($dir)) - $this->errorMsg("Cannot delete the folder."); - $result = !dir::prune($dir, false); - if (is_array($result) && count($result)) - $this->errorMsg("Failed to delete {count} files/folders.", - array('count' => count($result))); - $thumbDir = "$this->thumbsTypeDir/{$this->post['dir']}"; - if (is_dir($thumbDir)) dir::prune($thumbDir); - return $this->output(); - } - - protected function act_upload() { - if ($this->config['readonly'] || !isset($this->post['dir'])) - $this->errorMsg("Unknown error."); - - $dir = $this->postDir(); - - if (!dir::isWritable($dir)) - $this->errorMsg("Cannot access or write to upload folder."); - - $message = $this->checkUploadedFile(); - - if ($message !== true) { - if (isset($this->file['tmp_name'])) - @unlink($this->file['tmp_name']); - $this->errorMsg($message); - } - - $target = "$dir/" . file::getInexistantFilename($this->file['name'], $dir); - - if (!@move_uploaded_file($this->file['tmp_name'], $target) && - !@rename($this->file['tmp_name'], $target) && - !@copy($this->file['tmp_name'], $target) - ) { - @unlink($this->file['tmp_name']); - $this->errorMsg("Cannot move uploaded file to target folder."); - } elseif (function_exists('chmod')) - chmod($target, $this->config['filePerms']); - - $this->makeThumb($target); - return "/" . basename($target); - } - - protected function act_download() { - $dir = $this->postDir(); - if (!isset($this->post['dir']) || - !isset($this->post['file']) || - (false === ($file = "$dir/{$this->post['file']}")) || - !file_exists($file) || !is_readable($file) - ) - $this->errorMsg("Unknown error."); - - header("Pragma: public"); - header("Expires: 0"); - header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); - header("Cache-Control: private", false); - header("Content-Type: application/octet-stream"); - header('Content-Disposition: attachment; filename="' . str_replace('"', "_", $this->post['file']) . '"'); - header("Content-Transfer-Encoding:­ binary"); - header("Content-Length: " . filesize($file)); - readfile($file); - die; - } - - protected function act_rename() { - $dir = $this->postDir(); - if ($this->config['readonly'] || - !isset($this->post['dir']) || - !isset($this->post['file']) || - !isset($this->post['newName']) || - (false === ($file = "$dir/{$this->post['file']}")) || - !file_exists($file) || !is_readable($file) || !file::isWritable($file) - ) - $this->errorMsg("Unknown error."); - - $newName = trim($this->post['newName']); - if (!strlen($newName)) - $this->errorMsg("Please enter new file name."); - if (preg_match('/[\/\\\\]/s', $newName)) - $this->errorMsg("Unallowable characters in file name."); - if (substr($newName, 0, 1) == ".") - $this->errorMsg("File name shouldn't begins with '.'"); - $newName = "$dir/$newName"; - if (file_exists($newName)) - $this->errorMsg("A file or folder with that name already exists."); - $ext = file::getExtension($newName); - if (!$this->validateExtension($ext, $this->type)) - $this->errorMsg("Denied file extension."); - if (!@rename($file, $newName)) - $this->errorMsg("Unknown error."); - - $thumbDir = "{$this->thumbsTypeDir}/{$this->post['dir']}"; - $thumbFile = "$thumbDir/{$this->post['file']}"; - - if (file_exists($thumbFile)) - @rename($thumbFile, "$thumbDir/" . basename($newName)); - return true; - } - - protected function act_delete() { - $dir = $this->postDir(); - if ($this->config['readonly'] || - !isset($this->post['dir']) || - !isset($this->post['file']) || - (false === ($file = "$dir/{$this->post['file']}")) || - !file_exists($file) || !is_readable($file) || !file::isWritable($file) || - !@unlink($file) - ) - $this->errorMsg("Unknown error."); - - $thumb = "{$this->thumbsTypeDir}/{$this->post['dir']}/{$this->post['file']}"; - if (file_exists($thumb)) @unlink($thumb); - return true; - } - - protected function act_cp_cbd() { - $dir = $this->postDir(); - if ($this->config['readonly'] || - !isset($this->post['dir']) || - !is_dir($dir) || !is_readable($dir) || !dir::isWritable($dir) || - !isset($this->post['files']) || !is_array($this->post['files']) || - !count($this->post['files']) - ) - $this->errorMsg("Unknown error."); - - $error = array(); - foreach($this->post['files'] as $file) { - $file = path::normalize($file); - if (substr($file, 0, 1) == ".") continue; - $type = explode("/", $file); - $type = $type[0]; - if ($type != $this->type) continue; - $path = "{$this->config['uploadDir']}/$file"; - $base = basename($file); - $replace = array('file' => $base); - $ext = file::getExtension($base); - if (!file_exists($path)) - $error[] = $this->label("The file '{file}' does not exist.", $replace); - elseif (substr($base, 0, 1) == ".") - $error[] = "$base: " . $this->label("File name shouldn't begins with '.'"); - elseif (!$this->validateExtension($ext, $type)) - $error[] = "$base: " . $this->label("Denied file extension."); - elseif (file_exists("$dir/$base")) - $error[] = "$base: " . $this->label("A file or folder with that name already exists."); - elseif (!is_readable($path) || !is_file($path)) - $error[] = $this->label("Cannot read '{file}'.", $replace); - elseif (!@copy($path, "$dir/$base")) - $error[] = $this->label("Cannot copy '{file}'.", $replace); - else { - if (function_exists("chmod")) - @chmod("$dir/$base", $this->config['filePerms']); - $fromThumb = "{$this->thumbsDir}/$file"; - if (is_file($fromThumb) && is_readable($fromThumb)) { - $toThumb = "{$this->thumbsTypeDir}/{$this->post['dir']}"; - if (!is_dir($toThumb)) - @mkdir($toThumb, $this->config['dirPerms'], true); - $toThumb .= "/$base"; - @copy($fromThumb, $toThumb); - } - } - } - if (count($error)) - return $this->output(array('message' => $error), "error"); - return true; - } - - protected function act_mv_cbd() { - $dir = $this->postDir(); - if ($this->config['readonly'] || - !isset($this->post['dir']) || - !is_dir($dir) || !is_readable($dir) || !dir::isWritable($dir) || - !isset($this->post['files']) || !is_array($this->post['files']) || - !count($this->post['files']) - ) - $this->errorMsg("Unknown error."); - - $error = array(); - foreach($this->post['files'] as $file) { - $file = path::normalize($file); - if (substr($file, 0, 1) == ".") continue; - $type = explode("/", $file); - $type = $type[0]; - if ($type != $this->type) continue; - $path = "{$this->config['uploadDir']}/$file"; - $base = basename($file); - $replace = array('file' => $base); - $ext = file::getExtension($base); - if (!file_exists($path)) - $error[] = $this->label("The file '{file}' does not exist.", $replace); - elseif (substr($base, 0, 1) == ".") - $error[] = "$base: " . $this->label("File name shouldn't begins with '.'"); - elseif (!$this->validateExtension($ext, $type)) - $error[] = "$base: " . $this->label("Denied file extension."); - elseif (file_exists("$dir/$base")) - $error[] = "$base: " . $this->label("A file or folder with that name already exists."); - elseif (!is_readable($path) || !is_file($path)) - $error[] = $this->label("Cannot read '{file}'.", $replace); - elseif (!file::isWritable($path) || !@rename($path, "$dir/$base")) - $error[] = $this->label("Cannot move '{file}'.", $replace); - else { - if (function_exists("chmod")) - @chmod("$dir/$base", $this->config['filePerms']); - $fromThumb = "{$this->thumbsDir}/$file"; - if (is_file($fromThumb) && is_readable($fromThumb)) { - $toThumb = "{$this->thumbsTypeDir}/{$this->post['dir']}"; - if (!is_dir($toThumb)) - @mkdir($toThumb, $this->config['dirPerms'], true); - $toThumb .= "/$base"; - @rename($fromThumb, $toThumb); - } - } - } - if (count($error)) - return $this->output(array('message' => $error), "error"); - return true; - } - - protected function act_rm_cbd() { - if ($this->config['readonly'] || - !isset($this->post['files']) || - !is_array($this->post['files']) || - !count($this->post['files']) - ) - $this->errorMsg("Unknown error."); - - $error = array(); - foreach($this->post['files'] as $file) { - $file = path::normalize($file); - if (substr($file, 0, 1) == ".") continue; - $type = explode("/", $file); - $type = $type[0]; - if ($type != $this->type) continue; - $path = "{$this->config['uploadDir']}/$file"; - $base = basename($file); - $replace = array('file' => $base); - if (!is_file($path)) - $error[] = $this->label("The file '{file}' does not exist.", $replace); - elseif (!@unlink($path)) - $error[] = $this->label("Cannot delete '{file}'.", $replace); - else { - $thumb = "{$this->thumbsDir}/$file"; - if (is_file($thumb)) @unlink($thumb); - } - } - if (count($error)) - return $this->output(array('message' => $error), "error"); - return true; - } - - protected function act_downloadDir() { - $dir = $this->postDir(); - if (!isset($this->post['dir']) || $this->config['denyZipDownload']) - $this->errorMsg("Unknown error."); - $filename = basename($dir) . ".zip"; - do { - $file = md5(time() . session_id()); - $file = "{$this->config['uploadDir']}/$file.zip"; - } while (file_exists($file)); - new zipFolder($file, $dir); - header("Content-Type: application/x-zip"); - header('Content-Disposition: attachment; filename="' . str_replace('"', "_", $filename) . '"'); - header("Content-Length: " . filesize($file)); - readfile($file); - unlink($file); - die; - } - - protected function act_downloadSelected() { - $dir = $this->postDir(); - if (!isset($this->post['dir']) || - !isset($this->post['files']) || - !is_array($this->post['files']) || - $this->config['denyZipDownload'] - ) - $this->errorMsg("Unknown error."); - - $zipFiles = array(); - foreach ($this->post['files'] as $file) { - $file = path::normalize($file); - if ((substr($file, 0, 1) == ".") || (strpos($file, '/') !== false)) - continue; - $file = "$dir/$file"; - if (!is_file($file) || !is_readable($file)) - continue; - $zipFiles[] = $file; - } - - do { - $file = md5(time() . session_id()); - $file = "{$this->config['uploadDir']}/$file.zip"; - } while (file_exists($file)); - - $zip = new ZipArchive(); - $res = $zip->open($file, ZipArchive::CREATE); - if ($res === TRUE) { - foreach ($zipFiles as $cfile) - $zip->addFile($cfile, basename($cfile)); - $zip->close(); - } - header("Content-Type: application/x-zip"); - header('Content-Disposition: attachment; filename="selected_files_' . basename($file) . '"'); - header("Content-Length: " . filesize($file)); - readfile($file); - unlink($file); - die; - } - - protected function act_downloadClipboard() { - if (!isset($this->post['files']) || - !is_array($this->post['files']) || - $this->config['denyZipDownload'] - ) - $this->errorMsg("Unknown error."); - - $zipFiles = array(); - foreach ($this->post['files'] as $file) { - $file = path::normalize($file); - if ((substr($file, 0, 1) == ".")) - continue; - $type = explode("/", $file); - $type = $type[0]; - if ($type != $this->type) - continue; - $file = $this->config['uploadDir'] . "/$file"; - if (!is_file($file) || !is_readable($file)) - continue; - $zipFiles[] = $file; - } - - do { - $file = md5(time() . session_id()); - $file = "{$this->config['uploadDir']}/$file.zip"; - } while (file_exists($file)); - - $zip = new ZipArchive(); - $res = $zip->open($file, ZipArchive::CREATE); - if ($res === TRUE) { - foreach ($zipFiles as $cfile) - $zip->addFile($cfile, basename($cfile)); - $zip->close(); - } - header("Content-Type: application/x-zip"); - header('Content-Disposition: attachment; filename="clipboard_' . basename($file) . '"'); - header("Content-Length: " . filesize($file)); - readfile($file); - unlink($file); - die; - } - - protected function sendDefaultThumb($file=null) { - if ($file !== null) { - $ext = file::getExtension($file); - $thumb = "themes/{$this->config['theme']}/img/files/big/$ext.png"; - } - if (!isset($thumb) || !file_exists($thumb)) - $thumb = "themes/{$this->config['theme']}/img/files/big/..png"; - header("Content-Type: image/png"); - readfile($thumb); - die; - } - - protected function getFiles($dir) { - $thumbDir = "{$this->config['uploadDir']}/{$this->config['thumbsDir']}/$dir"; - $dir = "{$this->config['uploadDir']}/$dir"; - $return = array(); - $files = dir::content($dir, array('types' => "file")); - if ($files === false) - return $return; - - foreach ($files as $file) { - $this->makeThumb($file, false); - $image = new gd($file); - $image = !$image->init_error && - ($image->get_width() <= $this->config['thumbWidth']) && - ($image->get_height() <= $this->config['thumbHeight']); - $stat = stat($file); - if ($stat === false) continue; - $name = basename($file); - $ext = file::getExtension($file); - $bigIcon = file_exists("themes/{$this->config['theme']}/img/files/big/$ext.png"); - $smallIcon = file_exists("themes/{$this->config['theme']}/img/files/small/$ext.png"); - $thumb = file_exists("$thumbDir/$name"); - $return[] = array( - 'name' => stripcslashes($name), - 'size' => $stat['size'], - 'mtime' => $stat['mtime'], - 'date' => @strftime($this->dateTimeSmall, $stat['mtime']), - 'readable' => is_readable($file), - 'writable' => file::isWritable($file), - 'bigIcon' => $bigIcon, - 'smallIcon' => $smallIcon, - 'thumb' => $thumb, - 'smallThumb' => $image - ); - } - return $return; - } - - protected function xmlTree(array $tree) { - $xml = '' . text::xmlData($tree['name']) . ''; - if (isset($tree['dirs']) && is_array($tree['dirs']) && count($tree['dirs'])) { - $xml .= ""; - foreach ($tree['dirs'] as $dir) - $xml .= $this->xmlTree($dir); - $xml .= ""; - } - $xml .= ''; - return $xml; - } - - protected function getTree($dir, $index=0) { - $path = explode("/", $dir); - - $pdir = ""; - for ($i = 0; ($i <= $index && $i < count($path)); $i++) - $pdir .= "/{$path[$i]}"; - if (strlen($pdir)) - $pdir = substr($pdir, 1); - - $fdir = "{$this->config['uploadDir']}/$pdir"; - - $dirs = $this->getDirs($fdir); - - if (is_array($dirs) && count($dirs) && ($index <= count($path) - 1)) { - - foreach ($dirs as $i => $cdir) { - if ($cdir['hasDirs'] && - ( - ($index == count($path) - 1) || - ($cdir['name'] == $path[$index + 1]) - ) - ) { - $dirs[$i]['dirs'] = $this->getTree($dir, $index + 1); - if (!is_array($dirs[$i]['dirs']) || !count($dirs[$i]['dirs'])) { - unset($dirs[$i]['dirs']); - continue; - } - } - } - } else - return false; - - return $dirs; - } - - protected function postDir($existent=true) { - $dir = $this->typeDir; - if (isset($this->post['dir'])) - $dir .= "/" . $this->post['dir']; - if ($existent && (!is_dir($dir) || !is_readable($dir))) - $this->errorMsg("Inexistant or inaccessible folder."); - return $dir; - } - - protected function getDir($existent=true) { - $dir = $this->typeDir; - if (isset($this->get['dir'])) - $dir .= "/" . $this->get['dir']; - if ($existent && (!is_dir($dir) || !is_readable($dir))) - $this->errorMsg("Inexistant or inaccessible folder."); - return $dir; - } - - protected function getDirs($dir) { - $dirs = dir::content($dir, array('types' => "dir")); - $return = array(); - if (is_array($dirs)) { - $writable = dir::isWritable($dir); - foreach ($dirs as $cdir) { - $info = $this->getDirInfo($cdir); - if ($info === false) continue; - $info['removable'] = $writable && $info['writable']; - $return[] = $info; - } - } - return $return; - } - - protected function getDirInfo($dir, $removable=false) { - if ((substr(basename($dir), 0, 1) == ".") || !is_dir($dir) || !is_readable($dir)) - return false; - $dirs = dir::content($dir, array('types' => "dir")); - if (is_array($dirs)) { - foreach ($dirs as $key => $cdir) - if (substr(basename($cdir), 0, 1) == ".") - unset($dirs[$key]); - $hasDirs = count($dirs) ? true : false; - } else - $hasDirs = false; - - $writable = dir::isWritable($dir); - $info = array( - 'name' => stripslashes(basename($dir)), - 'readable' => is_readable($dir), - 'writable' => $writable, - 'removable' => $removable && $writable && dir::isWritable(dirname($dir)), - 'hasDirs' => $hasDirs - ); - - if ($dir == "{$this->config['uploadDir']}/{$this->session['dir']}") - $info['current'] = true; - - return $info; - } - - protected function output($data=null, $template=null) { - if (!is_array($data)) $data = array(); - if ($template === null) - $template = $this->action; - - if (file_exists("tpl/tpl_$template.php")) { - ob_start(); - $eval = "unset(\$data);unset(\$template);unset(\$eval);"; - $_ = $data; - foreach (array_keys($data) as $key) - if (preg_match('/^[a-z\d_]+$/i', $key)) - $eval .= "\$$key=\$_['$key'];"; - $eval .= "unset(\$_);require \"tpl/tpl_$template.php\";"; - eval($eval); - return ob_get_clean(); - } - - return ""; - } - - protected function errorMsg($message, array $data=null) { - if (in_array($this->action, array("thumb", "upload", "download", "downloadDir"))) - die($this->label($message, $data)); - if (($this->action === null) || ($this->action == "browser")) - $this->backMsg($message, $data); - else { - $message = $this->label($message, $data); - die($this->output(array('message' => $message), 'error')); - } - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/core/types/type_img.php b/include/limesurvey/admin/scripts/kcfinder/core/types/type_img.php deleted file mode 100644 index f978a615..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/core/types/type_img.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class type_img { - - public function checkFile($file, array $config) { - $gd = new gd($file); - if ($gd->init_error) - return "Unknown image format/encoding."; - return true; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/core/types/type_mime.php b/include/limesurvey/admin/scripts/kcfinder/core/types/type_mime.php deleted file mode 100644 index 046b19f4..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/core/types/type_mime.php +++ /dev/null @@ -1,47 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class type_mime { - - public function checkFile($file, array $config) { - if (!class_exists("finfo")) - return "Fileinfo PECL extension is missing."; - - if (!isset($config['params'])) - return "Undefined MIME types."; - - $finfo = strlen($config['mime_magic']) - ? new finfo(FILEINFO_MIME, $config['mime_magic']) - : new finfo(FILEINFO_MIME); - if (!$finfo) - return "Opening fileinfo database failed."; - - $type = $finfo->file($file); - $type = substr($type, 0, strrpos($type, ";")); - - $mimes = $config['params']; - if (substr($mimes, 0, 1) == "!") { - $mimes = trim(substr($mimes, 1)); - return in_array($type , explode(" ", $mimes)) - ? "You can't upload such files." - : true; - } - - return !in_array($type , explode(" ", $mimes)) - ? "You can't upload such files." - : true; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/core/uploader.php b/include/limesurvey/admin/scripts/kcfinder/core/uploader.php deleted file mode 100644 index cde2ad4b..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/core/uploader.php +++ /dev/null @@ -1,516 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class uploader { - protected $config = array(); - protected $opener = array(); - protected $type; - protected $typeDir; - protected $typeURL; - protected $types = array(); - protected $typeSettings = array('disabled', 'theme', 'dirPerms', 'filePerms', 'denyZipDownload', 'maxImageWidth', 'maxImageHeight', 'thumbWidth', 'thumbHeight', 'jpegQuality'); - protected $charset; - protected $lang = 'en'; - protected $langInputNames = array('lang', 'langCode', 'lng', 'language', 'lang_code'); - protected $file; - protected $dateTimeFull; // Currently not used - protected $dateTimeMid; // Currently not used - protected $dateTimeSmall; - protected $labels = array(); - protected $get; - protected $post; - protected $cookie; - protected $session; - - public function __get($property) { - return property_exists($this, $property) ? $this->$property : null; - } - - public function __construct() { - - // DISABLE MAGIC QUOTES - if (function_exists('set_magic_quotes_runtime')) - @set_magic_quotes_runtime(false); - - // INPUT INIT - $input = new input(); - $this->get = &$input->get; - $this->post = &$input->post; - $this->cookie = &$input->cookie; - - // LINKING UPLOADED FILE - if (count($_FILES)) - $this->file = &$_FILES[key($_FILES)]; - - // LOAD DEFAULT CONFIGURATION - require "config.php"; - - // SETTING UP SESSION - if (isset($_CONFIG['_sessionLifetime'])) - ini_set('session.gc_maxlifetime', $_CONFIG['_sessionLifetime'] * 60); - if (isset($_CONFIG['_sessionDir'])) - ini_set('session.save_path', $_CONFIG['_sessionDir']); - if (isset($_CONFIG['_sessionDomain'])) - ini_set('session.cookie_domain', $_CONFIG['_sessionDomain']); - @session_start(); - - // RELOAD DEFAULT CONFIGURATION - require "config.php"; - $this->config = $_CONFIG; - - // LOAD SESSION CONFIGURATION IF EXISTS - if (isset($_CONFIG['_sessionVar']) && - is_array($_CONFIG['_sessionVar']) - ) { - foreach ($_CONFIG['_sessionVar'] as $key => $val) - if ((substr($key, 0, 1) != "_") && isset($_CONFIG[$key])) - $this->config[$key] = $val; - if (!isset($this->config['_sessionVar']['self'])) - $this->config['_sessionVar']['self'] = array(); - $this->session = &$this->config['_sessionVar']['self']; - } else - $this->session = &$_SESSION; - - // GET TYPE DIRECTORY - $this->types = &$this->config['types']; - $firstType = array_keys($this->types); - $firstType = $firstType[0]; - $this->type = ( - isset($this->get['type']) && - isset($this->types[$this->get['type']]) - ) - ? $this->get['type'] : $firstType; - - // LOAD DIRECTORY TYPE SPECIFIC CONFIGURATION IF EXISTS - if (is_array($this->types[$this->type])) { - foreach ($this->types[$this->type] as $key => $val) - if (in_array($key, $this->typeSettings)) - $this->config[$key] = $val; - $this->types[$this->type] = isset($this->types[$this->type]['type']) - ? $this->types[$this->type]['type'] : ""; - } - - // COOKIES INIT - if (!strlen($this->config['cookieDomain'])) - $this->config['cookieDomain'] = $_SERVER['HTTP_HOST']; - if (!strlen($this->config['cookiePath'])) - $this->config['cookiePath'] = "/"; - - // UPLOAD FOLDER INIT - - // FULL URL - if (preg_match('/^([a-z]+)\:\/\/([^\/^\:]+)(\:(\d+))?\/(.+)\/?$/', - $this->config['uploadURL'], $patt) - ) { - list($unused, $protocol, $domain, $unused, $port, $path) = $patt; - $path = path::normalize($path); - $this->config['uploadURL'] = "$protocol://$domain" . (strlen($port) ? ":$port" : "") . "/$path"; - $this->config['uploadDir'] = strlen($this->config['uploadDir']) - ? path::normalize($this->config['uploadDir']) - : path::url2fullPath("/$path"); - $this->typeDir = "{$this->config['uploadDir']}/{$this->type}"; - $this->typeURL = "{$this->config['uploadURL']}/{$this->type}"; - - // SITE ROOT - } elseif ($this->config['uploadURL'] == "/") { - $this->config['uploadDir'] = strlen($this->config['uploadDir']) - ? path::normalize($this->config['uploadDir']) - : path::normalize($_SERVER['DOCUMENT_ROOT']); - $this->typeDir = "{$this->config['uploadDir']}/{$this->type}"; - $this->typeURL = "/{$this->type}"; - - // ABSOLUTE & RELATIVE - } else { - $this->config['uploadURL'] = (substr($this->config['uploadURL'], 0, 1) === "/") - ? path::normalize($this->config['uploadURL']) - : path::rel2abs_url($this->config['uploadURL']); - $this->config['uploadDir'] = strlen($this->config['uploadDir']) - ? path::normalize($this->config['uploadDir']) - : path::url2fullPath($this->config['uploadURL']); - $this->typeDir = "{$this->config['uploadDir']}/{$this->type}"; - $this->typeURL = "{$this->config['uploadURL']}/{$this->type}"; - } - if (!is_dir($this->config['uploadDir'])) - @mkdir($this->config['uploadDir'], $this->config['dirPerms']); - - // HOST APPLICATIONS INIT - if (isset($this->get['CKEditorFuncNum'])) - $this->opener['CKEditor']['funcNum'] = $this->get['CKEditorFuncNum']; - if (isset($this->get['opener']) && - (strtolower($this->get['opener']) == "tinymce") && - isset($this->config['_tinyMCEPath']) && - strlen($this->config['_tinyMCEPath']) - ) - $this->opener['TinyMCE'] = true; - - // LOCALIZATION - foreach ($this->langInputNames as $key) - if (isset($this->get[$key]) && - preg_match('/^[a-z][a-z\._\-]*$/i', $this->get[$key]) && - file_exists("lang/" . strtolower($this->get[$key]) . ".php") - ) { - $this->lang = $this->get[$key]; - break; - } - $this->localize($this->lang); - - // CHECK & MAKE DEFAULT .htaccess - $htaccess = "{$this->config['uploadDir']}/.htaccess"; - if (isset($this->config['_check4htaccess']) && - $this->config['_check4htaccess'] - ) { - if (!file_exists($htaccess)) { - if (!@file_put_contents($htaccess, $this->get_htaccess())) - $this->backMsg("Cannot write to upload folder."); - } else { - if (false === ($data = @file_get_contents($htaccess))) - $this->backMsg("Cannot read .htaccess"); - if (($data != $this->get_htaccess()) && !@file_put_contents($htaccess, $data)) - $this->backMsg("Incorrect .htaccess file. Cannot rewrite it!"); - } - } - - // CHECK & CREATE UPLOAD FOLDER - if (!is_dir($this->typeDir)) { - if (!mkdir($this->typeDir, $this->config['dirPerms'])) - $this->backMsg("Cannot create {dir} folder.", array('dir' => $this->type)); - } elseif (!is_readable($this->typeDir)) - $this->backMsg("Cannot read upload folder."); - } - - public function upload() { - $config = &$this->config; - $file = &$this->file; - $url = $message = ""; - - if ($config['disabled'] || $config['readonly']) { - if (isset($file['tmp_name'])) @unlink($file['tmp_name']); - $message = $this->label("You don't have permissions to upload files."); - - } elseif (true === ($message = $this->checkUploadedFile())) { - $message = ""; - - $dir = "{$this->typeDir}/"; - if (isset($this->get['dir']) && - (false !== ($gdir = $this->checkInputDir($this->get['dir']))) - ) { - $udir = path::normalize("$dir$gdir"); - if (substr($udir, 0, strlen($dir)) !== $dir) - $message = $this->label("Unknown error."); - else { - $l = strlen($dir); - $dir = "$udir/"; - $udir = substr($udir, $l); - } - } - - if (!strlen($message)) { - if (!is_dir(path::normalize($dir))) - @mkdir(path::normalize($dir), $this->config['dirPerms'], true); - - $target = file::getInexistantFilename("$dir{$file['name']}"); - - if (!@move_uploaded_file($file['tmp_name'], $target) && - !@rename($file['tmp_name'], $target) && - !@copy($file['tmp_name'], $target) - ) - $message = $this->label("Cannot move uploaded file to target folder."); - else { - if (function_exists('chmod')) - @chmod($target, $this->config['filePerms']); - $this->makeThumb($target); - $url = $this->typeURL; - if (isset($udir)) $url .= "/$udir"; - $url .= "/" . basename($target); - $url = path::urlPathEncode($url); - } - } - } - - if (strlen($message) && - isset($this->file['tmp_name']) && - file_exists($this->file['tmp_name']) - ) - @unlink($this->file['tmp_name']); - - if (strlen($message) && method_exists($this, 'errorMsg')) - $this->errorMsg($message); - $this->callBack($url, $message); - } - - protected function checkUploadedFile() { - $config = &$this->config; - $file = &$this->file; - - if (!is_array($file) || !isset($file['name'])) - return $this->label("Unknown error"); - - $extension = file::getExtension($file['name']); - $typePatt = strtolower(text::clearWhitespaces($this->types[$this->type])); - - // CHECK FOR UPLOAD ERRORS - if ($file['error']) - return - ($file['error'] == UPLOAD_ERR_INI_SIZE) ? - $this->label("The uploaded file exceeds {size} bytes.", - array('size' => ini_get('upload_max_filesize'))) : ( - ($file['error'] == UPLOAD_ERR_FORM_SIZE) ? - $this->label("The uploaded file exceeds {size} bytes.", - array('size' => $this->get['MAX_FILE_SIZE'])) : ( - ($file['error'] == UPLOAD_ERR_PARTIAL) ? - $this->label("The uploaded file was only partially uploaded.") : ( - ($file['error'] == UPLOAD_ERR_NO_FILE) ? - $this->label("No file was uploaded.") : ( - ($file['error'] == UPLOAD_ERR_NO_TMP_DIR) ? - $this->label("Missing a temporary folder.") : ( - ($file['error'] == UPLOAD_ERR_CANT_WRITE) ? - $this->label("Failed to write file.") : - $this->label("Unknown error.") - ))))); - - // HIDDEN FILENAMES CHECK - elseif (substr($file['name'], 0, 1) == ".") - return $this->label("File name shouldn't begins with '.'"); - - // EXTENSION CHECK - elseif (!$this->validateExtension($extension, $this->type)) - return $this->label("Denied file extension."); - - // SPECIAL DIRECTORY TYPES CHECK (e.g. *img) - elseif (preg_match('/^\*([^ ]+)(.*)?$/s', $typePatt, $patt)) { - list($typePatt, $type, $params) = $patt; - if (class_exists("type_$type")) { - $class = "type_$type"; - $type = new $class(); - $cfg = $config; - if (strlen($params)) - $cfg['params'] = trim($params); - $response = $type->checkFile($file['tmp_name'], $cfg); - if ($response !== true) - return $this->label($response); - } else - return $this->label("Non-existing directory type."); - } - - // IMAGE RESIZE - $gd = new gd($file['tmp_name']); - if (!$gd->init_error && !$this->imageResize($gd, $file['tmp_name'])) - return $this->label("The image is too big and/or cannot be resized."); - - return true; - } - - protected function checkInputDir($dir, $inclType=true, $existing=true) { - $dir = path::normalize($dir); - if (substr($dir, 0, 1) == "/") - $dir = substr($dir, 1); - - if ((substr($dir, 0, 1) == ".") || (substr(basename($dir), 0, 1) == ".")) - return false; - - if ($inclType) { - $first = explode("/", $dir); - $first = $first[0]; - if ($first != $this->type) - return false; - $return = $this->removeTypeFromPath($dir); - } else { - $return = $dir; - $dir = "{$this->type}/$dir"; - } - - if (!$existing) - return $return; - - $path = "{$this->config['uploadDir']}/$dir"; - return (is_dir($path) && is_readable($path)) ? $return : false; - } - - protected function validateExtension($ext, $type) { - $ext = trim(strtolower($ext)); - if (!isset($this->types[$type])) - return false; - - $exts = strtolower(text::clearWhitespaces($this->config['deniedExts'])); - if (strlen($exts)) { - $exts = explode(" ", $exts); - if (in_array($ext, $exts)) - return false; - } - - $exts = trim($this->types[$type]); - if (!strlen($exts) || substr($exts, 0, 1) == "*") - return true; - - if (substr($exts, 0, 1) == "!") { - $exts = explode(" ", trim(strtolower(substr($exts, 1)))); - return !in_array($ext, $exts); - } - - $exts = explode(" ", trim(strtolower($exts))); - return in_array($ext, $exts); - } - - protected function getTypeFromPath($path) { - return preg_match('/^([^\/]*)\/.*$/', $path, $patt) - ? $patt[1] : $path; - } - - protected function removeTypeFromPath($path) { - return preg_match('/^[^\/]*\/(.*)$/', $path, $patt) - ? $patt[1] : ""; - } - - protected function imageResize($image, $file=null) { - if (!($image instanceof gd)) { - $gd = new gd($image); - if ($gd->init_error) return false; - $file = $image; - } elseif ($file === null) - return false; - else - $gd = $image; - - if ((!$this->config['maxImageWidth'] && !$this->config['maxImageHeight']) || - ( - ($gd->get_width() <= $this->config['maxImageWidth']) && - ($gd->get_height() <= $this->config['maxImageHeight']) - ) - ) - return true; - - return ( - $gd->resize_fit($this->config['maxImageWidth'], $this->config['maxImageHeight']) && - $gd->imagejpeg($file, $this->config['jpegQuality']) - ); - } - - protected function makeThumb($file, $overwrite=true) { - $gd = new gd($file); - - // Drop files which are not GD handled images - if ($gd->init_error) - return true; - - $thumb = substr($file, strlen($this->config['uploadDir'])); - $thumb = $this->config['uploadDir'] . "/" . $this->config['thumbsDir'] . "/" . $thumb; - $thumb = path::normalize($thumb); - $thumbDir = dirname($thumb); - if (!is_dir($thumbDir) && !@mkdir($thumbDir, $this->config['dirPerms'], true)) - return false; - - if (!$overwrite && is_file($thumb)) - return true; - - // Images with smaller resolutions than thumbnails - if (($gd->get_width() <= $this->config['thumbWidth']) && - ($gd->get_height() <= $this->config['thumbHeight']) - ) { - $browsable = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_JPEG2000, IMAGETYPE_PNG); - // Drop only browsable types - if (in_array($gd->type, $browsable)) - return true; - - // Resize image - } elseif (!$gd->resize_fit($this->config['thumbWidth'], $this->config['thumbHeight'])) - return false; - - // Save thumbnail - return $gd->imagejpeg($thumb, $this->config['jpegQuality']); - } - - protected function localize($langCode) { - require "lang/{$langCode}.php"; - setlocale(LC_ALL, $lang['_locale']); - $this->charset = $lang['_charset']; - $this->dateTimeFull = $lang['_dateTimeFull']; - $this->dateTimeMid = $lang['_dateTimeMid']; - $this->dateTimeSmall = $lang['_dateTimeSmall']; - unset($lang['_locale']); - unset($lang['_charset']); - unset($lang['_dateTimeFull']); - unset($lang['_dateTimeMid']); - unset($lang['_dateTimeSmall']); - $this->labels = $lang; - } - - protected function label($string, array $data=null) { - $return = isset($this->labels[$string]) ? $this->labels[$string] : $string; - if (is_array($data)) - foreach ($data as $key => $val) - $return = str_replace("{{$key}}", $val, $return); - return $return; - } - - protected function backMsg($message, array $data=null) { - $message = $this->label($message, $data); - if (isset($this->file['tmp_name']) && file_exists($this->file['tmp_name'])) - @unlink($this->file['tmp_name']); - $this->callBack("", $message); - die; - } - - protected function callBack($url, $message="") { - $message = text::jsValue($message); - $CKfuncNum = isset($this->opener['CKEditor']['funcNum']) - ? $this->opener['CKEditor']['funcNum'] : 0; - if (!$CKfuncNum) $CKfuncNum = 0; - header("Content-Type: text/html; charset={$this->charset}"); - -?> - - - - - php_value engine off - - - php_value engine off - -"; - } -} - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/css.php b/include/limesurvey/admin/scripts/kcfinder/css.php deleted file mode 100644 index c25d9d2b..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/css.php +++ /dev/null @@ -1,245 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -require "core/autoload.php"; -$mtime = @filemtime(__FILE__); -if ($mtime) httpCache::checkMTime($mtime); -$browser = new browser(); -$config = $browser->config; -ob_start(); - -?> -html, body { - overflow: hidden; -} - -body, form, th, td { - margin: 0; - padding: 0; -} - -a { - cursor:pointer; -} - -* { - font-family: Tahoma, Verdana, Arial, sans-serif; - font-size: 11px; -} - -table { - border-collapse: collapse; -} - -#all { - vvisibility: hidden; -} - -#left { - float: left; - display: block; - width: 25%; -} - -#right { - float: left; - display: block; - width: 75%; -} - -#settings { - display: none; - padding: 0; - float: left; - width: 100%; -} - -#settings > div { - float: left; -} - -#folders { - padding: 5px; - overflow: auto; -} - -#toolbar { - padding: 5px; -} - -#files { - padding: 5px; - overflow: auto; -} - -#status { - padding: 5px; - float: left; - overflow: hidden; -} - -#fileinfo { - float: left; -} - -#clipboard div { - width: 16px; - height: 16px; -} - -.folders { - margin-left: 16px; -} - -div.file { - overflow-x: hidden; - width: px; - float: left; - text-align: center; - cursor: default; - white-space: nowrap; -} - -div.file .thumb { - width: px; - height: px; - background: no-repeat center center; -} - -#files table { - width: 100%; -} - -tr.file { - cursor: default; -} - -tr.file > td { - white-space: nowrap; -} - -tr.file > td.name { - background-repeat: no-repeat; - background-position: left center; - padding-left: 20px; - width: 100%; -} - -tr.file > td.time, -tr.file > td.size { - text-align: right; -} - -#toolbar { - cursor: default; - white-space: nowrap; -} - -#toolbar a { - padding-left: 20px; - text-decoration: none; - background: no-repeat left center; -} - -#toolbar a:hover, a[href="#upload"].uploadHover { - color: #000; -} - -#upload { - position: absolute; - overflow: hidden; - opacity: 0; - filter: alpha(opacity:0); -} - -#upload input { - cursor: pointer; -} - -#uploadResponse { - display: none; -} - -span.brace { - padding-left: 11px; - cursor: default; -} - -span.brace.opened, span.brace.closed { - cursor: pointer; -} - -#shadow { - position: absolute; - top: 0; - left: 0; - display: none; - background: #fff; - z-index: 100; - opacity: 0.5; - filter: alpha(opacity:50); -} - -#dialog, #clipboard { - position: absolute; - display: none; - z-index: 101; - cursor: default; -} - -#clipboard { - z-index: 99; -} - -#loading { - display: none; - float: right; -} - -.menu { - background: #888; - white-space: nowrap; -} - -.menu a { - display: block; -} - -.menu .list { - max-height: 0; - overflow-y: auto; - overflow-x: hidden; - white-space: nowrap; -} - -.file .access, .file .hasThumb { - display: none; -} - -#dialog img { - cursor: pointer; -} - -#resizer { - position: absolute; - z-index: 98; - top: 0; - background: #000; - opacity: 0; - filter: alpha(opacity:0); -} - -Order allow,deny -Deny from all - diff --git a/include/limesurvey/admin/scripts/kcfinder/doc/Changelog b/include/limesurvey/admin/scripts/kcfinder/doc/Changelog deleted file mode 100644 index b2b1511c..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/doc/Changelog +++ /dev/null @@ -1,75 +0,0 @@ -VERSION 2.21 - 2010-11-19 -------------------------- -* Bugfixes only - - -VERSION 2.2 - 2010-07-27 ------------------------- -* Many bugfixes -* Read-only config option - - -VERSION 2.1 - 2010-07-04 ------------------------- -* Endless JavaScript loop on KCFinder disable bugfix -* New config setting whether to generate .htaccess file in upload folder -* Upload to specified folder from CKEditor & FCKeditor direct upload dialog -* Select multiple files bugfixes - - -VERSION 2.0 - 2010-07-01 ------------------------- -* Brand new core -* Ability to resize files/folders panels with mouse drag -* Select multiple files with Ctrl key -* Return list of files to custom integrating application -* Animated folder tree -* Directory Type specific configuration settings -* Download multiple files or a folder as ZIP file - - -VERSION 1.7 - 2010-06-17 ------------------------- -* Maximize toolbar button -* Clipboard for copying and moving multiple files -* Show warning if the browser is not capable to display KCFinder -* Google Chrome Frame support for old versions of Internet Explorer - - -VERSION 1.6 - 2010-06-02 ------------------------- -* Support of Windows Apache server -* Support of Fileinfo PHP extension to detect mime types (*mime directory type) -* Ability to deny globaly some dangerous extensions like exe, php, pl, cgi etc -* Check for denied file extension on file rename -* Disallow to upload hidden files (with names begins with .) -* Missing last character of filenames without extension bugfix -* Some small bugfixes - - -VERSION 1.5 - 2010-05-30 ------------------------- -* Filenames with spaces download bugfix -* FCKEditor direct upload bugfix -* Thumbnail generation bugfixes - - -VERSION 1.4 - 2010-05-24 ------------------------- -* Client-side caching bugfix -* Custom integrations - window.KCFinder.callBack() -* Security fixes - - -VERSION 1.3 - 2010-05-06 ------------------------- -* Another session bugfix. Now session configuratin works! -* Show filename by default bugfix -* Loading box on top right corner - - -VERSION 1.2 - 2010-05-03 ------------------------- -* Thumbnail generation bugfix -* Session bugfix -* other small bugfixes diff --git a/include/limesurvey/admin/scripts/kcfinder/doc/LICENSE.GPL b/include/limesurvey/admin/scripts/kcfinder/doc/LICENSE.GPL deleted file mode 100644 index c968251e..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/doc/LICENSE.GPL +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/include/limesurvey/admin/scripts/kcfinder/doc/LICENSE.LGPL b/include/limesurvey/admin/scripts/kcfinder/doc/LICENSE.LGPL deleted file mode 100644 index 9a3408f8..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/doc/LICENSE.LGPL +++ /dev/null @@ -1,167 +0,0 @@ -GNU Lesser General Public License -Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - - [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] - -Preamble - -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - -This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - -When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - -To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - -For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - -We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - -To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - -Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - -Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - -When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - -We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - -For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - -In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - -Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - -The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - -A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - -The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - -"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - -1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - - (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) - - These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - - Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. - - In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - -Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - -This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - -4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - -If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - -5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - -However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - -When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - -If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - -Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - -6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - -You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - - a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - - e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - -For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - -7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - - b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - -8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - -10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - -11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - -14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -END OF TERMS AND CONDITIONS -How to Apply These Terms to Your New Libraries -If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). - -To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - Copyright (C) - - This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - signature of Ty Coon, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/include/limesurvey/admin/scripts/kcfinder/doc/README b/include/limesurvey/admin/scripts/kcfinder/doc/README deleted file mode 100644 index 1c222593..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/doc/README +++ /dev/null @@ -1,72 +0,0 @@ -[============================< KCFinder 2.21 >===============================] -[ ] -[ Copyright 2010 KCFinder Project ] -[ http://kcfinder.sunhater.com ] -[ Pavel Tzonkov ] -[ ] -[============================================================================] - - -I. DESCRIPTION - - KCFinder is an alternative to the CKFinder Web file manager. It can be - integrated into FCKeditor, CKEditor, and TinyMCE WYSIWYG web editors or - your custom web applications to upload and manage images, flash movies, - and other files that can be embedded in an editor's generated HTML - content. Only PHP server-side scripting is supported. - - -II. FEATURES - - 1. Fully integrated Ajax engine. - - 2. Easy to integrate and configure in web applications. - - 3. Clipboard for copy and move multiple files - - 4. Select multiple files with Ctrl key - - 5. Download multiple files or a folder as ZIP file - - 6. Resize bigger uploaded images. Configurable maximum image resolution. - - 7. Configurable thumbnail resolution. - - 8. Visual themes. - - 9. Multilanguage system. - - -III. REQUIREMENTS - - 1. Web server (Apache 2 is tested only) - - 2. PHP 5.x.x. with GD extension. Safe mode should be disabled. To work - width client-side HTTP cache, the PHP must be configured as Apache - module. - - 3. PHP ZIP extension for multiple files download. If it's not available, - KCFinder will work but without this feature. - - 4. PHP Fileinfo extension if you want to check file's MIME type before - moving to upload directory. PHP versions lesser than 5.3 needs to - install Fileinfo PECL extension: http://pecl.php.net/package/Fileinfo - - 5. Modern browser (not IE6!). - - -IV. INSTALLATION - - See http://kcfinder.sunhater.com/install - - -V. USED 3RD PARTY SOFTWARE - - 1. jQuery JavaScript library v1.4.2 - http://www.jquery.com - - 2. jQuery Right-Click Plugin v1.01 - http://abeautifulsite.net/notebook/68 - - 3. jquery.event.drag Plugin v2.0.0 - http://threedubmedia.com/code/event/drag - - 4. In realization of "oxygen" theme were used icons and color schemes of - default KDE4 theme - http://www.kde.org diff --git a/include/limesurvey/admin/scripts/kcfinder/index.html b/include/limesurvey/admin/scripts/kcfinder/index.html deleted file mode 100644 index e69de29b..00000000 diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/0bject.js b/include/limesurvey/admin/scripts/kcfinder/js/browser/0bject.js deleted file mode 100644 index 17995eab..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/0bject.js +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */?> - -var browser = { - opener: {}, - support: {}, - files: [], - clipboard: [], - labels: [], - shows: [], - orders: [] -}; diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/clipboard.js b/include/limesurvey/admin/scripts/kcfinder/js/browser/clipboard.js deleted file mode 100644 index 7d6c5c73..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/clipboard.js +++ /dev/null @@ -1,245 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */?> - -browser.initClipboard = function() { - if (!this.clipboard || !this.clipboard.length) return; - var size = 0; - $.each(this.clipboard, function(i, val) { - size += parseInt(val.size); - }); - size = this.humanSize(size); - $('#clipboard').html('
    '); - var resize = function() { - $('#clipboard').css('left', $(window).width() - $('#clipboard').outerWidth() + 'px'); - $('#clipboard').css('top', $(window).height() - $('#clipboard').outerHeight() + 'px'); - }; - resize(); - $('#clipboard').css('display', 'block'); - $(window).unbind(); - $(window).resize(function() { - browser.resize(); - resize(); - }); -}; - -browser.openClipboard = function() { - if (!this.clipboard || !this.clipboard.length) return; - if ($('.menu a[href="kcact:cpcbd"]').html()) { - $('#clipboard').removeClass('selected'); - this.hideDialog(); - return; - } - var html = ''; - - setTimeout(function() { - $('#clipboard').addClass('selected'); - $('#dialog').html(html); - $('.menu a[href="kcact:download"]').click(function() { - browser.hideDialog(); - browser.downloadClipboard(); - return false; - }); - $('.menu a[href="kcact:cpcbd"]').click(function() { - if (!browser.dirWritable) return false; - browser.hideDialog(); - browser.copyClipboard(browser.dir); - return false; - }); - $('.menu a[href="kcact:mvcbd"]').click(function() { - if (!browser.dirWritable) return false; - browser.hideDialog(); - browser.moveClipboard(browser.dir); - return false; - }); - $('.menu a[href="kcact:rmcbd"]').click(function() { - browser.hideDialog(); - if (confirm(browser.label("Are you sure you want to delete all files in the Clipboard?"))) - browser.deleteClipboard(); - return false; - }); - $('.menu a[href="kcact:clrcbd"]').click(function() { - browser.hideDialog(); - browser.clearClipboard(); - return false; - }); - - var left = $(window).width() - $('#dialog').outerWidth(); - var top = $(window).height() - $('#dialog').outerHeight() - $('#clipboard').outerHeight(); - var lheight = top + _.outerTopSpace('#dialog'); - $('.menu .list').css('max-height', lheight + 'px'); - var top = $(window).height() - $('#dialog').outerHeight() - $('#clipboard').outerHeight(); - $('#dialog').css('left', (left - 4) + 'px'); - $('#dialog').css('top', top + 'px'); - $('#dialog').fadeIn(); - }, 1); -}; - -browser.removeFromClipboard = function(i) { - if (!this.clipboard || !this.clipboard[i]) return false; - if (this.clipboard.length == 1) { - this.clearClipboard(); - this.hideDialog(); - return; - } - - if (i < this.clipboard.length - 1) { - var last = this.clipboard.slice(i + 1); - this.clipboard = this.clipboard.slice(0, i); - this.clipboard = this.clipboard.concat(last); - } else - this.clipboard.pop(); - - this.initClipboard(); - this.hideDialog(); - this.openClipboard(); - return true; -}; - -browser.copyClipboard = function(dir) { - if (!this.clipboard || !this.clipboard.length) return; - var files = []; - var failed = 0; - for (i = 0; i < this.clipboard.length; i++) - if (this.clipboard[i].readable) - files[i] = this.clipboard[i].dir + "/" + this.clipboard[i].name; - else - failed++; - if (this.clipboard.length == failed) { - alert(this.label("The files in the Clipboard are not readable.")) - return; - } - if (failed && !confirm(browser.label("{count} files in the Clipboard are not readable. Do you want to copy the rest?", {count:failed}))) - return; - if (dir == browser.dir) - this.fadeFiles(); - $.ajax({ - type: 'POST', - url: browser.baseGetData('cp_cbd'), - data: {dir:dir, files:files}, - async: false, - success: function(xml) { - browser.errors(xml); - browser.clearClipboard(); - if (dir == browser.dir) - browser.refresh(); - }, - error: function(request, error) { - $('#files > div').css('opacity', ''); - $('#files > div').css('filter', ''); - alert(browser.label("Unknown error.")); - } - }); -}; - -browser.moveClipboard = function(dir) { - if (!this.clipboard || !this.clipboard.length) return; - var files = []; - var failed = 0; - for (i = 0; i < this.clipboard.length; i++) - if (this.clipboard[i].readable && this.clipboard[i].writable) - files[i] = this.clipboard[i].dir + "/" + this.clipboard[i].name; - else - failed++; - if (this.clipboard.length == failed) { - alert(this.label("The files in the Clipboard are not movable.")) - return; - } - if (failed && !confirm(browser.label("{count} files in the Clipboard are not movable. Do you want to move the rest?", {count: failed}))) - return; - this.fadeFiles(); - $.ajax({ - type: 'POST', - url: browser.baseGetData('mv_cbd'), - data: {dir:dir, files:files}, - async: false, - success: function(xml) { - browser.errors(xml); - browser.clearClipboard(); - browser.refresh(); - }, - error: function(request, error) { - $('#files > div').css('opacity', ''); - $('#files > div').css('filter', ''); - alert(browser.label("Unknown error.")); - } - }); -}; - -browser.deleteClipboard = function() { - if (!this.clipboard || !this.clipboard.length) return; - var files = []; - var failed = 0; - for (i = 0; i < this.clipboard.length; i++) - if (this.clipboard[i].readable && this.clipboard[i].writable) - files[i] = this.clipboard[i].dir + "/" + this.clipboard[i].name; - else - failed++; - if (this.clipboard.length == failed) { - alert(this.label("The files in the Clipboard are not removable.")) - return; - } - if (failed && !confirm(browser.label("{count} files in the Clipboard are not removable. Do you want to delete the rest?", {count: failed}))) - return; - this.fadeFiles(); - $.ajax({ - type: 'POST', - url: browser.baseGetData('rm_cbd'), - data: {files:files}, - async: false, - success: function(xml) { - browser.errors(xml); - browser.clearClipboard(); - browser.refresh(); - }, - error: function(request, error) { - $('#files > div').css({opacity:'', filter:''}); - alert(browser.label("Unknown error.")); - } - }); -}; - -browser.downloadClipboard = function() { - if (!this.clipboard || !this.clipboard.length) return; - var files = []; - for (i = 0; i < this.clipboard.length; i++) - if (this.clipboard[i].readable) - files[i] = this.clipboard[i].dir + "/" + this.clipboard[i].name; - if (files.length) - this.post(this.baseGetData('downloadClipboard'), {files:files}); -}; - -browser.clearClipboard = function() { - $('#clipboard').html(''); - this.clipboard = []; -}; diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/files.js b/include/limesurvey/admin/scripts/kcfinder/js/browser/files.js deleted file mode 100644 index e2cc9ee6..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/files.js +++ /dev/null @@ -1,515 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */?> - -browser.initFiles = function() { - $(document).unbind('keypress'); - $(document).keypress(function(e) { - if ((e.which == 65) || (e.which == 97)) - browser.selectAll(); - }); - $('#files').unbind(); - $('#files').scroll(function() { - browser.hideDialog(); - }); - $('.file').unbind(); - $('.file').click(function(e) { - _.unselect(); - browser.selectFile($(this), e); - }); - $('.file').rightClick(function(e) { - _.unselect(); - browser.menuFile($(this), e); - }); - $('.file').dblclick(function() { - _.unselect(); - browser.returnFile($(this)); - }); - $('.file').mouseup(function() { - _.unselect(); - }); - $('.file').mouseout(function() { - _.unselect(); - }); - $.each(this.shows, function(i, val) { - var display = (_.kuki.get('show' + val) == 'off') - ? 'none' : 'block'; - $('#files .file div.' + val).css('display', display); - }); - this.statusDir(); -}; - -browser.loadFiles = function(files) { - this.files = []; - $.each(files, function(i, file) { - browser.files[i] = { - name: browser.xmlData(file.getElementsByTagName('name')[0].childNodes), - size: file.getAttribute('size'), - mtime: file.getAttribute('mtime'), - date: file.getAttribute('date'), - readable: file.getAttribute('readable') == 'yes', - writable: file.getAttribute('writable') == 'yes', - bigIcon: file.getAttribute('bigIcon') == 'yes', - smallIcon: file.getAttribute('smallIcon') == 'yes', - thumb: file.getAttribute('thumb') == 'yes', - smallThumb: file.getAttribute('smallThumb') == 'yes' - }; - }); -}; - -browser.showFiles = function(callBack, selected) { - this.fadeFiles(); - setTimeout(function() { - var html = ''; - $.each(browser.files, function(i, file) { - if (_.kuki.get('view') == 'list') { - if (!i) html += ''; - var icon = _.getFileExtension(file.name); - if (file.thumb) - icon = ".image"; - else if (!icon.length || !file.smallIcon) - icon = "."; - icon = 'themes/' + browser.theme + '/img/files/small/' + icon + '.png'; - html += '' + - '' + - '' + - '' + - ''; - if (i == browser.files.length - 1) html += '
    ' + _.htmlData(file.name) + '' + file.date + '' + browser.humanSize(file.size) + '
    '; - } else { - if (file.thumb) - var icon = browser.baseGetData('thumb') + '&file=' + encodeURIComponent(file.name); - else if (file.smallThumb) { - var icon = browser.uploadURL + '/' + browser.dir + '/' + file.name; - icon = _.escapeDirs(icon).replace(/\'/g, "%27"); - } else { - var icon = file.bigIcon ? _.getFileExtension(file.name) : "."; - if (!icon.length) icon = "."; - icon = 'themes/' + browser.theme + '/img/files/big/' + icon + '.png'; - } - html += '
    ' + - '
    ' + - '
    ' + _.htmlData(file.name) + '
    ' + - '
    ' + file.date + '
    ' + - '
    ' + browser.humanSize(file.size) + '
    ' + - '
    '; - } - }); - $('#files').html('
    ' + html + '
    '); - $.each(browser.files, function(i, file) { - var item = $('#files .file').get(i); - $(item).data(file); - if (file.name == selected) - $(item).addClass('selected'); - }); - $('#files > div').css({opacity:'', filter:''}); - if (callBack) callBack(); - browser.initFiles(); - }, 200); -}; - -browser.selectFile = function(file, e) { - if (e.ctrlKey) { - if (file.hasClass('selected')) - file.removeClass('selected'); - else - file.addClass('selected'); - var files = $('.file.selected').get(); - var size = 0; - if (!files.length) - this.statusDir(); - else { - $.each(files, function(i, cfile) { - size += parseInt($(cfile).data('size')); - }); - size = this.humanSize(size); - if (files.length > 1) - $('#fileinfo').html(files.length + ' ' + this.label("selected files") + ' (' + size + ')'); - else { - var data = $(files[0]).data(); - $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')'); - } - } - } else { - var data = file.data(); - $('.file').removeClass('selected'); - file.addClass('selected'); - $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')'); - } -}; - -browser.selectAll = function() { - var files = $('.file').get(); - if (files.length) { - var size = 0; - $.each(files, function(i, file) { - if (!$(file).hasClass('selected')) - $(file).addClass('selected'); - size += parseInt($(file).data('size')); - }); - size = this.humanSize(size); - $('#fileinfo').html(files.length + ' ' + this.label("selected files") + ' (' + size + ')'); - } -}; - -browser.returnFile = function(file) { - - var fileURL = file.substr - ? file : browser.uploadURL + '/' + browser.dir + '/' + file.data('name'); - fileURL = _.escapeDirs(fileURL); - - if (this.opener.CKEditor) { - this.opener.CKEditor.object.tools.callFunction(this.opener.CKEditor.funcNum, fileURL, ''); - window.close(); - - } else if (this.opener.FCKeditor) { - window.opener.SetUrl(fileURL) ; - window.close() ; - - } else if (this.opener.TinyMCE) { - var win = tinyMCEPopup.getWindowArg('window'); - win.document.getElementById(tinyMCEPopup.getWindowArg('input')).value = fileURL; - if (win.getImageData) win.getImageData(); - if (typeof(win.ImageDialog) != "undefined") { - if (win.ImageDialog.getImageData) - win.ImageDialog.getImageData(); - if (win.ImageDialog.showPreviewImage) - win.ImageDialog.showPreviewImage(fileURL); - } - tinyMCEPopup.close(); - - } else if (this.opener.callBack) { - - if (window.opener && window.opener.KCFinder) { - this.opener.callBack(fileURL); - window.close(); - } - - if (window.parent && window.parent.KCFinder) { - var button = $('#toolbar a[href="kcact:maximize"]'); - if (button.hasClass('selected')) - this.maximize(button); - this.opener.callBack(fileURL); - } - - } else if (this.opener.callBackMultiple) { - if (window.opener && window.opener.KCFinder) { - this.opener.callBackMultiple([fileURL]); - window.close(); - } - - if (window.parent && window.parent.KCFinder) { - var button = $('#toolbar a[href="kcact:maximize"]'); - if (button.hasClass('selected')) - this.maximize(button); - this.opener.callBackMultiple([fileURL]); - } - - } -}; - -browser.returnFiles = function(files) { - if (this.opener.callBackMultiple && files.length) { - var rfiles = []; - $.each(files, function(i, file) { - rfiles[i] = browser.uploadURL + '/' + browser.dir + '/' + $(file).data('name'); - rfiles[i] = _.escapeDirs(rfiles[i]); - }); - this.opener.callBackMultiple(rfiles); - if (window.opener) window.close() - } -}; - -browser.returnThumbnails = function(files) { - if (this.opener.callBackMultiple) { - var rfiles = []; - var j = 0; - $.each(files, function(i, file) { - if ($(file).data('thumb')) { - rfiles[j] = browser.thumbsURL + '/' + browser.dir + '/' + $(file).data('name'); - rfiles[j] = _.escapeDirs(rfiles[j++]); - } - }); - this.opener.callBackMultiple(rfiles); - if (window.opener) window.close() - } -}; - -browser.menuFile = function(file, e) { - var data = file.data(); - var path = this.dir + '/' + data.name; - var files = $('.file.selected').get(); - var html = ''; - - if (file.hasClass('selected') && files.length && (files.length > 1)) { - var thumb = false; - var notWritable = 0; - var cdata; - $.each(files, function(i, cfile) { - cdata = $(cfile).data(); - if (cdata.thumb) thumb = true; - if (!data.writable) notWritable++; - }); - if (this.opener.callBackMultiple) { - html += '' + this.label("Select") + ''; - if (thumb) html += - '' + this.label("Select Thumbnails") + ''; - html += '
    '; - } - if (this.support.zip) html+= - '' + this.label("Download") + ''; - - if (!this.readonly) html += - '
    ' + - '' + this.label("Add to Clipboard") + '' + - '
    ' + - '' + this.label("Delete") + ''; - - if (html.length) { - html = ''; - $('#dialog').html(html); - this.showMenu(e); - } else - return; - - $('.menu a[href="kcact:pick"]').click(function() { - browser.returnFiles(files); - browser.hideDialog(); - return false; - }); - - $('.menu a[href="kcact:pick_thumb"]').click(function() { - browser.returnThumbnails(files); - browser.hideDialog(); - return false; - }); - - $('.menu a[href="kcact:download"]').click(function() { - browser.hideDialog(); - var pfiles = []; - $.each(files, function(i, cfile) { - pfiles[i] = $(cfile).data('name'); - }); - browser.post(browser.baseGetData('downloadSelected'), {dir:browser.dir, files:pfiles}); - return false; - }); - - $('.menu a[href="kcact:clpbrdadd"]').click(function() { - browser.hideDialog(); - var msg = ''; - $.each(files, function(i, cfile) { - var cdata = $(cfile).data(); - var failed = false; - for (i = 0; i < browser.clipboard.length; i++) - if ((browser.clipboard[i].name == cdata.name) && - (browser.clipboard[i].dir == browser.dir) - ) { - failed = true - msg += cdata.name + ": " + browser.label("This file is already added to the Clipboard.") + "\n"; - break; - } - - if (!failed) { - cdata.dir = browser.dir; - browser.clipboard[browser.clipboard.length] = cdata; - } - }); - browser.initClipboard(); - if (msg.length) alert(msg.substr(0, msg.length - 1)); - return false; - }); - - $('.menu a[href="kcact:rm"]').click(function() { - if ($(this).hasClass('denied')) return false; - browser.hideDialog(); - var failed = 0; - var dfiles = []; - $.each(files, function(i, cfile) { - var cdata = $(cfile).data(); - if (!cdata.writable) - failed++; - else - dfiles[dfiles.length] = browser.dir + "/" + cdata.name; - }); - if (failed == files.length) { - alert(browser.label("The selected files are not removable.")) - return false; - } - if (failed) { - if (!confirm(browser.label("{count} selected files are not removable. Do you want to delete the rest?", {count:failed}))) - return false; - } else if (!confirm(browser.label("Are you sure you want to delete all selected files?"))) - return false; - - browser.fadeFiles(); - $.ajax({ - type: 'POST', - url: browser.baseGetData('rm_cbd'), - data: {files:dfiles}, - async: false, - success: function(xml) { - browser.errors(xml); - browser.refresh(); - }, - error: function(request, error) { - $('#files > div').css('opacity', ''); - $('#files > div').css('filter', ''); - alert(browser.label("Unknown error.")); - } - }); - return false; - }); - - } else { - html += ''; - - $('#dialog').html(html); - this.showMenu(e); - - $('.menu a[href="kcact:pick"]').click(function() { - browser.returnFile(file); - browser.hideDialog(); - return false; - }); - - $('.menu a[href="kcact:pick_thumb"]').click(function() { - var path = browser.thumbsURL + "/" + browser.dir + '/' + data.name; - browser.returnFile(path); - browser.hideDialog(); - return false; - }); - - $('.menu a[href="kcact:view"]').click(function() { - browser.hideDialog(); - $('#loading').html(browser.label("Loading image...")); - $('#loading').css('display', 'inline'); - var img = new Image(); - var url = _.escapeDirs(browser.uploadURL + '/' + path); - img.src = url; - img.onload = function() { - $('#loading').css('display', 'none'); - $('#dialog').html(''); - $('#dialog img').attr('src', url); - var o_w = $('#dialog').outerWidth(); - var o_h = $('#dialog').outerHeight(); - var f_w = $(window).width() - 30; - var f_h = $(window).height() - 30; - if ((o_w > f_w) || (o_h > f_h)) { - if ((f_w / f_h) > (o_w / o_h)) - f_w = parseInt((o_w * f_h) / o_h); - else if ((f_w / f_h) < (o_w / o_h)) - f_h = parseInt((o_h * f_w) / o_w); - $('#dialog img').attr('width', f_w); - $('#dialog img').attr('height', f_h); - } - $('#dialog').click(function() { - browser.hideDialog(); - }); - browser.showDialog(); - } - return false; - }); - - $('.menu a[href="kcact:download"]').click(function() { - var html = '
    ' + - '' + - '' + - '
    '; - $('#dialog').html(html); - $('#downloadForm input').get(0).value = browser.dir; - $('#downloadForm input').get(1).value = data.name; - $('#downloadForm').submit(); - return false; - }); - - $('.menu a[href="kcact:clpbrdadd"]').click(function() { - for (i = 0; i < browser.clipboard.length; i++) - if ((browser.clipboard[i].name == data.name) && - (browser.clipboard[i].dir == browser.dir) - ) { - browser.hideDialog(); - alert(browser.label("This file is already added to the Clipboard.")); - return false; - } - var cdata = data; - cdata.dir = browser.dir; - browser.clipboard[browser.clipboard.length] = cdata; - browser.initClipboard(); - browser.hideDialog(); - return false; - }); - - $('.menu a[href="kcact:mv"]').click(function(e) { - if (!data.writable) return false; - browser.fileNameDialog( - e, {dir: browser.dir, file: data.name}, - 'newName', data.name, browser.baseGetData('rename'), { - title: "New file name:", - errEmpty: "Please enter new file name.", - errSlash: "Unallowable characters in file name.", - errDot: "File name shouldn't begins with '.'" - }, - function() { - browser.refresh(); - } - ); - return false; - }); - - $('.menu a[href="kcact:rm"]').click(function() { - if (!data.writable) return false; - browser.hideDialog(); - if (confirm(browser.label( - "Are you sure you want to delete this file?" - ))) - $.ajax({ - type: 'POST', - url: browser.baseGetData('delete'), - data: {dir:browser.dir, file:data.name}, - async: false, - success: function(xml) { - browser.clearClipboard(); - if (browser.errors(xml)) return; - browser.refresh(); - }, - error: function(request, error) { - alert(browser.label("Unknown error.")); - } - }); - return false; - }); - } -}; diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/folders.js b/include/limesurvey/admin/scripts/kcfinder/js/browser/folders.js deleted file mode 100644 index 5634afc7..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/folders.js +++ /dev/null @@ -1,359 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */?> - -browser.initFolders = function() { - $('#folders').scroll(function() { - browser.hideDialog(); - }); - $('div.folder > a').unbind(); - $('div.folder > a').bind('click', function() { - browser.hideDialog(); - return false; - }); - $('div.folder > a > span.brace').unbind(); - $('div.folder > a > span.brace').click(function() { - if ($(this).hasClass('opened') || $(this).hasClass('closed')) - browser.expandDir($(this).parent()); - }); - $('div.folder > a > span.folder').unbind(); - $('div.folder > a > span.folder').click(function() { - browser.changeDir($(this).parent()); - }); - $('div.folder > a > span.folder').rightClick(function(e) { - browser.menuDir($(this).parent(), e); - }); - - if ($.browser.msie && $.browser.version && - (parseInt($.browser.version.substr(0, 1)) < 8) - ) { - var fls = $('div.folder').get(); - var body = $('body').get(0); - var div; - $.each(fls, function(i, folder) { - div = document.createElement('div'); - div.style.display = 'inline'; - div.style.margin = div.style.border = div.style.padding = '0'; - div.innerHTML='
    ' + $(folder).html() + "
    "; - body.appendChild(div); - $(folder).css('width', $(div).innerWidth() + 'px'); - body.removeChild(div); - }); - } -}; - -browser.setTreeData = function(xml, path) { - if (!path) - path = ""; - else if (path.length && (path.substr(path.length - 1, 1) != '/')) - path += '/'; - var data = { - name: browser.xmlData(xml.getElementsByTagName('name')[0].childNodes), - readable: xml.getAttribute('readable') == 'yes', - writable: xml.getAttribute('writable') == 'yes', - removable: xml.getAttribute('removable') == 'yes', - hasDirs: xml.getAttribute('hasDirs') == 'yes', - current: xml.getAttribute('current') ? true : false - }; - path += data.name; - var selector = '#folders a[href="kcdir:/' + _.escapeDirs(path) + '"]'; - $(selector).data({ - name: data.name, - path: path, - readable: data.readable, - writable: data.writable, - removable: data.removable, - hasDirs: data.hasDirs - }); - $(selector + ' span.folder').addClass(data.current ? 'current' : 'regular'); - if (xml.getElementsByTagName('dirs').length) { - $(selector + ' span.brace').addClass('opened'); - var dirs = xml.getElementsByTagName('dirs')[0]; - $.each(dirs.childNodes, function(i, cdir) { - browser.setTreeData(cdir, path + '/'); - }); - } else if (data.hasDirs) - $(selector + ' span.brace').addClass('closed'); -}; - -browser.buildTree = function(xml, path) { - if (!path) path = ""; - var name = this.xmlData(xml.getElementsByTagName('name')[0].childNodes); - var hasDirs = xml.getAttribute('hasDirs') == 'yes'; - path += name; - var html = '
     ' + _.htmlData(name) + ''; - if (xml.getElementsByTagName('dirs').length) { - var dirs = xml.getElementsByTagName('dirs')[0]; - html += '
    '; - $.each(dirs.childNodes, function(i, cdir) { - html += browser.buildTree(cdir, path + '/'); - }); - html += '
    '; - } - html += '
    '; - return html; -}; - -browser.expandDir = function(dir, callBack) { - var path = dir.data('path'); - if (dir.children('.brace').hasClass('opened')) { - dir.parent().children('.folders').hide(500, function() { - if (path == browser.dir.substr(0, path.length)) - browser.changeDir(dir); - }); - dir.children('.brace').removeClass('opened'); - dir.children('.brace').addClass('closed'); - if (callBack) callBack(); - } else { - if (dir.parent().children('.folders').get(0)) { - dir.parent().children('.folders').show(500); - dir.children('.brace').removeClass('closed'); - dir.children('.brace').addClass('opened'); - if (callBack) callBack(); - } else if (!$('#loadingDirs').get(0)) { - dir.parent().append('
    ' + this.label("Loading folders...") + '
    '); - $('#loadingDirs').css('display', 'none'); - $('#loadingDirs').show(200, function() { - $.ajax({ - type: 'POST', - url: browser.baseGetData('expand'), - data: {dir:path}, - async: false, - success: function(xml) { - $('#loadingDirs').hide(200, function() { - $('#loadingDirs').detach(); - }); - if (browser.errors(xml)) return; - var dirs = xml.getElementsByTagName('dir'); - var html = ''; - var pth, name, hadDirs; - $.each(dirs, function(i, cdir) { - name = browser.xmlData(cdir.getElementsByTagName('name')[0].childNodes); - hasDirs = cdir.getAttribute('hasDirs') == 'yes'; - pth = path + '/' + name; - html += ''; - }); - if (html.length) { - dir.parent().append('
    ' + html + '
    '); - var folders = $(dir.parent().children('.folders').first()); - folders.css('display', 'none'); - $(folders).show(500); - $.each(dirs, function(i, cdir) { - browser.setTreeData(cdir, path, true); - }); - } - if (dirs.length) { - dir.children('.brace').removeClass('closed'); - dir.children('.brace').addClass('opened'); - } else { - dir.children('.brace').removeClass('opened'); - dir.children('.brace').removeClass('closed'); - } - - browser.initFolders(); - if (callBack) callBack(xml); - }, - error: function(request, error) { - $('#loadingDirs').detach(); - alert(browser.label("Unknown error.")); - } - }); - }); - } - } -}; - -browser.changeDir = function(dir) { - if (dir.children('span.folder').hasClass('regular')) { - $('div.folder > a > span.folder').removeClass('current'); - $('div.folder > a > span.folder').removeClass('regular'); - $('div.folder > a > span.folder').addClass('regular'); - dir.children('span.folder').removeClass('regular'); - dir.children('span.folder').addClass('current'); - $('#files').html(browser.label("Loading files...")); - $.ajax({ - type: 'POST', - url: browser.baseGetData('chDir'), - data: {dir:dir.data('path')}, - async: false, - success: function(xml) { - if (browser.errors(xml)) return; - var files = xml.getElementsByTagName('file'); - browser.loadFiles(files); - browser.orderFiles(); - browser.dir = dir.data('path'); - var dirWritable = - xml.getElementsByTagName('files')[0].getAttribute('dirWritable'); - browser.dirWritable = (dirWritable == 'yes'); - var title = "KCFinder: /" + browser.dir; - document.title = title; - if (browser.opener.TinyMCE) - tinyMCEPopup.editor.windowManager.setTitle(window, title); - browser.statusDir(); - }, - error: function(request, error) { - $('#files').html(browser.label("Unknown error.")); - } - }); - } -}; - -browser.statusDir = function() { - for (var i = 0, size = 0; i < this.files.length; i++) - size += parseInt(this.files[i].size); - size = this.humanSize(size); - $('#fileinfo').html(this.files.length + ' ' + this.label("files") + ' (' + size + ')'); -}; - -browser.menuDir = function(dir, e) { - var data = dir.data(); - var html = ''; - - $('#dialog').html(html); - this.showMenu(e); - $('div.folder > a > span.folder').removeClass('context'); - if (dir.children('span.folder').hasClass('regular')) - dir.children('span.folder').addClass('context'); - - if (this.clipboard && this.clipboard.length && data.writable) { - - $('.menu a[href="kcact:cpcbd"]').click(function() { - browser.hideDialog(); - browser.copyClipboard(data.path); - return false; - }); - - $('.menu a[href="kcact:mvcbd"]').click(function() { - browser.hideDialog(); - browser.moveClipboard(data.path); - return false; - }); - } - - $('.menu a[href="kcact:refresh"]').click(function() { - browser.hideDialog(); - browser.refreshDir(dir); - return false; - }); - - $('.menu a[href="kcact:download"]').click(function() { - browser.hideDialog(); - browser.post(browser.baseGetData('downloadDir'), {dir:data.path}); - return false; - }); - - $('.menu a[href="kcact:mkdir"]').click(function(e) { - if (!data.writable) return false; - browser.hideDialog(); - browser.fileNameDialog( - e, {dir: data.path}, - 'newDir', '', browser.baseGetData('newDir'), { - title: "New folder name:", - errEmpty: "Please enter new folder name.", - errSlash: "Unallowable characters in folder name.", - errDot: "Folder name shouldn't begins with '.'" - }, function(xml) { - browser.refreshDir(dir); - if (!data.hasDirs) { - dir.data('hasDirs', true); - dir.children('span.brace').addClass('closed'); - } - } - ); - return false; - }); - - $('.menu a[href="kcact:mvdir"]').click(function(e) { - if (!data.removable) return false; - browser.hideDialog(); - browser.fileNameDialog( - e, {dir: data.path}, - 'newName', data.name, browser.baseGetData('renameDir'), { - title: "New folder name:", - errEmpty: "Please enter new folder name.", - errSlash: "Unallowable characters in folder name.", - errDot: "Folder name shouldn't begins with '.'" - }, function(xml) { - if (!xml.getElementsByTagName('name').length) { - alert(browser.label("Unknown error.")); - return; - } - var name = browser.xmlData(xml.getElementsByTagName('name')[0].childNodes); - dir.children('span.folder').html(_.htmlData(name)); - dir.data('name', name); - dir.data('path', _.dirname(data.path) + '/' + name); - if (data.path == browser.dir) - browser.dir = dir.data('path'); - } - ); - return false; - }); - - $('.menu a[href="kcact:rmdir"]').click(function() { - if (!data.removable) return false; - browser.hideDialog(); - if (confirm(browser.label( - "Are you sure you want to delete this folder and all its content?" - ))) { - $.ajax({ - type: 'POST', - url: browser.baseGetData('deleteDir'), - data: {dir:data.path}, - async: false, - success: function(xml) { - if (browser.errors(xml)) return; - dir.parent().hide(500, function() { - var folders = dir.parent().parent(); - var pDir = folders.parent().children('a').first(); - dir.parent().detach(); - if (!folders.children('div.folder').get(0)) { - pDir.children('span.brace').first().removeClass('opened'); - pDir.children('span.brace').first().removeClass('closed'); - pDir.parent().children('.folders').detach(); - pDir.data('hasDirs', false); - } - if (pDir.data('path') == browser.dir.substr(0, pDir.data('path').length)) - browser.changeDir(pDir); - }); - }, - error: function(request, error) { - alert(browser.label("Unknown error.")); - } - }); - } - return false; - }); -}; - -browser.refreshDir = function(dir) { - var path = dir.data('path'); - if (dir.children('.brace').hasClass('opened') || dir.children('.brace').hasClass('closed')) { - dir.children('.brace').removeClass('opened'); - dir.children('.brace').addClass('closed'); - } - dir.parent().children('.folders').first().detach(); - if (path == browser.dir.substr(0, path.length)) - browser.changeDir(dir); - browser.expandDir(dir); - return true; -}; \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/init.js b/include/limesurvey/admin/scripts/kcfinder/js/browser/init.js deleted file mode 100644 index d2eb9795..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/init.js +++ /dev/null @@ -1,183 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */?> - -browser.init = function() { - if (!this.checkAgent()) return; - - $('body').click(function() { - browser.hideDialog(); - }); - $('#shadow').click(function() { - return false; - }); - $('#dialog').unbind(); - $('#dialog').click(function() { - return false; - }); - this.initOpeners(); - this.initSettings(); - this.initContent(); - this.initToolbar(); - this.initResizer(); -}; - -browser.checkAgent = function() { - if (!$.browser.version || - ($.browser.msie && (parseInt($.browser.version) < 7) && !this.support.chromeFrame) || - ($.browser.opera && (parseInt($.browser.version) < 10)) || - ($.browser.mozilla && (parseFloat($.browser.version.replace(/^(\d+(\.\d+)?)([^\d].*)?$/, "$1")) < 1.8)) - ) { - var html = '
    Your browser is not capable to display KCFinder. Please update your browser or install another one: Mozilla Firefox, Apple Safari, Google Chrome, Opera.'; - if ($.browser.msie) - html += ' You may also install Google Chrome Frame ActiveX plugin to get Internet Explorer 6 working.'; - html += '
    '; - $('body').html(html); - return false; - } - return true; -}; - -browser.initOpeners = function() { - if (this.opener.TinyMCE && (typeof(tinyMCEPopup) == 'undefined')) - this.opener.TinyMCE = null; - - if (this.opener.TinyMCE) - this.opener.callBack = true; - - if ((!this.opener.name || (this.opener.name == 'fckeditor')) && - window.opener && window.opener.SetUrl - ) { - this.opener.FCKeditor = true; - this.opener.callBack = true; - } - - if (this.opener.CKEditor) { - if (window.parent && window.parent.CKEDITOR) - this.opener.CKEditor.object = window.parent.CKEDITOR; - else if (window.opener && window.opener.CKEDITOR) { - this.opener.CKEditor.object = window.opener.CKEDITOR; - this.opener.callBack = true; - } else - this.opener.CKEditor = null; - } - - if (!this.opener.CKFinder && !this.opener.FCKEditor && !this.TinyMCE) { - if ((window.opener && window.opener.KCFinder && window.opener.KCFinder.callBack) || - (window.parent && window.parent.KCFinder && window.parent.KCFinder.callBack) - ) - this.opener.callBack = window.opener - ? window.opener.KCFinder.callBack - : window.parent.KCFinder.callBack; - - if (( - window.opener && - window.opener.KCFinder && - window.opener.KCFinder.callBackMultiple - ) || ( - window.parent && - window.parent.KCFinder && - window.parent.KCFinder.callBackMultiple - ) - ) - this.opener.callBackMultiple = window.opener - ? window.opener.KCFinder.callBackMultiple - : window.parent.KCFinder.callBackMultiple; - } -}; - -browser.initContent = function() { - $('div#folders').html(this.label("Loading folders...")); - $('div#files').html(this.label("Loading files...")); - $.ajax({ - type: 'GET', - url: browser.baseGetData('init'), - async: false, - success: function(xml) { - if (browser.errors(xml)) return; - var dirWritable = xml.getElementsByTagName('files')[0].getAttribute('dirWritable'); - browser.dirWritable = (dirWritable == 'yes'); - var tree = xml.getElementsByTagName('tree')[0].getElementsByTagName('dir')[0]; - $('#folders').html(browser.buildTree(tree)); - browser.setTreeData(tree); - browser.initFolders(); - var files = xml.getElementsByTagName('files')[0].getElementsByTagName('file'); - browser.loadFiles(files); - browser.orderFiles(); - }, - error: function(request, error) { - $('div#folders').html(browser.label("Unknown error.")); - $('div#files').html(browser.label("Unknown error.")); - } - }); -}; - -browser.initResizer = function() { - var cursor = ($.browser.opera) ? 'move' : 'col-resize'; - $('#resizer').css('cursor', cursor); - $('#resizer').drag('start', function() { - $(this).css({opacity:'0.4', filter:'alpha(opacity:40)'}); - $('#all').css('cursor', cursor); - }); - $('#resizer').drag(function(e) { - var left = e.pageX - parseInt(_.nopx($(this).css('width')) / 2); - left = (left >= 0) ? left : 0; - left = (left + _.nopx($(this).css('width')) < $(window).width()) - ? left : $(window).width() - _.nopx($(this).css('width')); - $(this).css('left', left); - }); - var end = function() { - $(this).css({opacity:'0', filter:'alpha(opacity:0)'}); - $('#all').css('cursor', ''); - var left = _.nopx($(this).css('left')) + _.nopx($(this).css('width')); - var right = $(window).width() - left; - $('#left').css('width', left + 'px'); - $('#right').css('width', right + 'px'); - _('files').style.width = $('#right').innerWidth() - _.outerHSpace('#files') + 'px'; - _('resizer').style.left = $('#left').outerWidth() - _.outerRightSpace('#folders', 'm') + 'px'; - _('resizer').style.width = _.outerRightSpace('#folders', 'm') + _.outerLeftSpace('#files', 'm') + 'px'; - browser.fixFilesHeight(); - }; - $('#resizer').drag('end', end); - $('#resizer').mouseup(end); -}; - -browser.resize = function() { - _('left').style.width = '25%'; - _('right').style.width = '75%'; - _('toolbar').style.height = $('#toolbar a').outerHeight() + "px"; - _('shadow').style.width = $(window).width() + 'px'; - _('shadow').style.height = _('resizer').style.height = $(window).height() + 'px'; - _('left').style.height = _('right').style.height = - $(window).height() - $('#status').outerHeight() + 'px'; - _('folders').style.height = - $('#left').outerHeight() - _.outerVSpace('#folders') + 'px'; - browser.fixFilesHeight(); - var width = $('#left').outerWidth() + $('#right').outerWidth(); - _('status').style.width = width + 'px'; - while ($('#status').outerWidth() > width) - _('status').style.width = _.nopx(_('status').style.width) - 1 + 'px'; - while ($('#status').outerWidth() < width) - _('status').style.width = _.nopx(_('status').style.width) + 1 + 'px'; - if ($.browser.msie && ($.browser.version.substr(0, 1) < 8)) - _('right').style.width = $(window).width() - $('#left').outerWidth() + 'px'; - _('files').style.width = $('#right').innerWidth() - _.outerHSpace('#files') + 'px'; - _('resizer').style.left = $('#left').outerWidth() - _.outerRightSpace('#folders', 'm') + 'px'; - _('resizer').style.width = _.outerRightSpace('#folders', 'm') + _.outerLeftSpace('#files', 'm') + 'px'; -}; - -browser.fixFilesHeight = function() { - _('files').style.height = - $('#left').outerHeight() - $('#toolbar').outerHeight() - _.outerVSpace('#files') - - (($('#settings').css('display') != "none") ? $('#settings').outerHeight() : 0) + 'px'; -}; diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/joiner.php b/include/limesurvey/admin/scripts/kcfinder/js/browser/joiner.php deleted file mode 100644 index 1777a28b..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/joiner.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -chdir(".."); // For compatibality -chdir(".."); -require "lib/helper_httpCache.php"; -$files = glob("js/browser/*.js"); - -foreach ($files as $file) { - $fmtime = filemtime($file); - if (!isset($mtime) || ($fmtime > $mtime)) - $mtime = $fmtime; -} - -httpCache::checkMTime($mtime); - -header("Content-Type: text/javascript"); -foreach ($files as $file) - require $file; - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/misc.js b/include/limesurvey/admin/scripts/kcfinder/js/browser/misc.js deleted file mode 100644 index e783c976..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/misc.js +++ /dev/null @@ -1,240 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */?> - -browser.showDialog = function(e) { - this.shadow(); - if (e) { - var left = e.pageX - parseInt($('#dialog').outerWidth() / 2); - var top = e.pageY - parseInt($('#dialog').outerHeight() / 2); - if (left < 15) left = 15; - if (top < 15) top = 15; - if (($('#dialog').outerWidth() + left) > $(window).width() - 30) - left = $(window).width() - $('#dialog').outerWidth() - 15; - if (($('#dialog').outerHeight() + top) > $(window).height() - 30) - top = $(window).height() - $('#dialog').outerHeight() - 15; - $('#dialog').css('left', left + "px"); - $('#dialog').css('top', top + "px"); - } else { - $('#dialog').css('left', parseInt(($(window).width() - $('#dialog').outerWidth()) / 2) + 'px'); - $('#dialog').css('top', parseInt(($(window).height() - $('#dialog').outerHeight()) / 2) + 'px'); - $('#dialog').css('display', 'block'); - } - -}; - -browser.hideDialog = function() { - this.unshadow(); - if ($('#clipboard').hasClass('selected')) - $('#clipboard').removeClass('selected'); - $('#dialog').css('display', 'none'); - $('div.folder > a > span.folder').removeClass('context'); - $('#dialog').html(''); -}; - -browser.shadow = function() { - $('#shadow').css('display', 'block'); -}; - -browser.unshadow = function() { - $('#shadow').css('display', 'none'); -}; - -browser.showMenu = function(e) { - var left = e.pageX; - var top = e.pageY; - if (($('#dialog').outerWidth() + left) > $(window).width()) - left = $(window).width() - $('#dialog').outerWidth(); - if (($('#dialog').outerHeight() + top) > $(window).height()) - top = $(window).height() - $('#dialog').outerHeight(); - $('#dialog').css('left', left + "px"); - $('#dialog').css('top', top + "px"); - $('#dialog').css('display', 'none'); - $('#dialog').fadeIn(); -}; - -browser.fileNameDialog = function(e, post, inputName, inputValue, url, labels, callBack) { - var html = '
    ' + - '
    ' + this.label(labels.title) + '
    ' + - '
    ' + - '
    ' + - '' + - '' + - '
    '; - $('#dialog').html(html); - $('#dialog').unbind(); - $('#dialog').click(function() { - return false; - }); - $('#dialog form').submit(function() { - var name = this.elements[0]; - name.value = $.trim(name.value); - if (name.value == '') { - alert(browser.label(labels.errEmpty)); - name.focus(); - return; - } else if (/[\/\\]/g.test(name.value)) { - alert(browser.label(labels.errSlash)) - name.focus(); - return; - } else if (name.value.substr(0, 1) == ".") { - alert(browser.label(labels.errDot)) - name.focus(); - return; - } - eval('post.' + inputName + ' = name.value;'); - $.ajax({ - type: 'POST', - url: url, - data: post, - async: false, - success: function(xml) { - if (browser.errors(xml)) return; - if (callBack) callBack(xml); - browser.hideDialog(); - }, - error: function(request, error) { - alert(browser.label("Unknown error.")); - } - }); - return false; - }); - browser.showDialog(e); - $('#dialog').css('display', 'block'); - $('#dialog input[type="submit"]').click(function() { - return $('#dialog form').submit(); - }); - $('#dialog input[type="text"]').get(0).focus(); - $('#dialog input[type="text"]').get(0).select(); - $('#dialog input[type="text"]').keypress(function(e) { - if (e.keyCode == 27) browser.hideDialog(); - }); -}; - -browser.orderFiles = function(callBack, selected) { - var order = _.kuki.get('order'); - var desc = (_.kuki.get('orderDesc') == 'on'); - - browser.files = browser.files.sort(function(a, b) { - var a1, b1, arr; - if (!order) order = 'name'; - - if (order == 'date') { - a1 = a.mtime; - b1 = b.mtime; - } else if (order == 'type') { - a1 = _.getFileExtension(a.name); - b1 = _.getFileExtension(b.name); - } else - eval('a1 = a.' + order + '.toLowerCase(); b1 = b.' + order + '.toLowerCase();'); - - if ((order == 'size') || (order == 'date')) { - a1 = parseInt(a1 ? a1 : ''); - b1 = parseInt(b1 ? b1 : ''); - if (a1 < b1) return desc ? 1 : -1; - if (a1 > b1) return desc ? -1 : 1; - } - - if (a1 == b1) { - a1 = a.name.toLowerCase(); - b1 = b.name.toLowerCase(); - arr = [a1, b1]; - arr = arr.sort(); - return (arr[0] == a1) ? -1 : 1; - } - - arr = [a1, b1]; - arr = arr.sort(); - if (arr[0] == a1) return desc ? 1 : -1; - return desc ? -1 : 1; - }); - - browser.showFiles(callBack, selected); - browser.initFiles(); -}; - -browser.humanSize = function(size) { - if (size < 1024) { - size = size.toString() + ' B'; - } else if (size < 1048576) { - size /= 1024; - size = parseInt(size).toString() + ' KB'; - } else if (size < 1073741824) { - size /= 1048576; - size = parseInt(size).toString() + ' MB'; - } else if (size < 1099511627776) { - size /= 1073741824; - size = parseInt(size).toString() + ' GB'; - } else { - size /= 1099511627776; - size = parseInt(size).toString() + ' TB'; - } - return size; -}; - -browser.baseGetData = function(act) { - var data = 'browse.php?type=' + encodeURIComponent(this.type) + '&lng=' + this.lang; - if (act) - data += "&act=" + act - return data; -}; - -browser.label = function(index, data) { - var label = this.labels[index] ? this.labels[index] : index; - if (data) - $.each(data, function(key, val) { - label = label.replace('{' + key + '}', val); - }); - return label; -}; - -browser.errors = function(xml) { - if (!xml.getElementsByTagName('error').length) - return false; - var alertMsg = ''; - $.each(xml.getElementsByTagName('error'), function(i, error) { - alertMsg += browser.xmlData(error.childNodes) + "\n"; - }); - alertMsg = alertMsg.substr(0, alertMsg.length - 1); - alert(alertMsg); - return true; -}; - -browser.post = function(url, data) { - var html = '
    '; - $.each(data, function(key, val) { - if ($.isArray(val)) - $.each(val, function(i, aval) { - html += ''; - }); - else - html += ''; - }); - html += '
    '; - $('#dialog').html(html); - $('#dialog').css('display', 'block'); - $('#postForm').get(0).submit(); -}; - -browser.fadeFiles = function() { - $('#files > div').css('opacity', '0.4'); - $('#files > div').css('filter', 'alpha(opacity:40)'); -}; - -browser.xmlData = function(nodes) { - var data = ''; - $.each(nodes, function(i) { - data += nodes[i].nodeValue; - }); - return data; -}; \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/settings.js b/include/limesurvey/admin/scripts/kcfinder/js/browser/settings.js deleted file mode 100644 index afeefeaa..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/settings.js +++ /dev/null @@ -1,104 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */?> - -browser.initSettings = function() { - - if (!this.shows.length) { - var showInputs = $('#show input[type="checkbox"]').toArray(); - $.each(showInputs, function (i, input) { - browser.shows[i] = input.name; - }); - } - - var shows = this.shows; - - if (!_.kuki.isSet('showname')) { - _.kuki.set('showname', 'on'); - $.each(shows, function (i, val) { - if (val != "name") _.kuki.set('show' + val, 'off'); - }); - } - - $('#show input[type="checkbox"]').click(function() { - var kuki = $(this).get(0).checked ? 'on' : 'off'; - _.kuki.set('show' + $(this).get(0).name, kuki) - if ($(this).get(0).checked) - $('#files .file div.' + $(this).get(0).name).css('display', 'block'); - else - $('#files .file div.' + $(this).get(0).name).css('display', 'none'); - }); - - $.each(shows, function(i, val) { - var checked = (_.kuki.get('show' + val) == 'on') ? 'checked' : ''; - $('#show input[name="' + val + '"]').attr('checked', checked); - }); - - if (!this.orders.length) { - var orderInputs = $('#order input[type="radio"]').toArray(); - $.each(orderInputs, function (i, input) { - browser.orders[i] = input.value; - }); - } - - var orders = this.orders; - - if (!_.kuki.isSet('order')) - _.kuki.set('order', 'name'); - - if (!_.kuki.isSet('orderDesc')) - _.kuki.set('orderDesc', 'off'); - - $('#order input[value="' + _.kuki.get('order') + '"]').attr('checked', 'checked'); - $('#order input[name="desc"]').attr('checked', - (_.kuki.get('orderDesc') == 'on') ? 'checked' : '' - ); - - $('#order input[type="radio"]').click(function() { - _.kuki.set('order', $(this).get(0).value); - browser.orderFiles(); - }); - - $('#order input[name="desc"]').click(function() { - _.kuki.set('orderDesc', $(this).get(0).checked ? "on" : "off"); - browser.orderFiles(); - }); - - if (!_.kuki.isSet('view')) - _.kuki.set('view', 'thumbs'); - - if (_.kuki.get('view') == "list") { - $('#show input').attr('checked', 'checked'); - $('#show input').attr('disabled', 'disabled'); - } - - $('#view input[value="' + _.kuki.get('view') + '"]').attr('checked', 'checked'); - - $('#view input').click(function() { - var view = $(this).attr('value'); - if (_.kuki.get('view') != view) { - _.kuki.set('view', view); - if (view == 'list') { - $('#show input').attr('checked', 'checked'); - $('#show input').attr('disabled', 'disabled'); - } else { - $.each(browser.shows, function(i, val) { - if (_.kuki.get('show' + val) != "on") - $('#show input[name="' + val + '"]').attr('checked', ''); - }); - $('#show input').attr('disabled', ''); - } - } - browser.refresh(); - }); -}; diff --git a/include/limesurvey/admin/scripts/kcfinder/js/browser/toolbar.js b/include/limesurvey/admin/scripts/kcfinder/js/browser/toolbar.js deleted file mode 100644 index e8ce0bab..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/browser/toolbar.js +++ /dev/null @@ -1,277 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */?> - -browser.initToolbar = function() { - $('#toolbar a').click(function() { - browser.hideDialog(); - }); - - if (!_.kuki.isSet('displaySettings')) - _.kuki.set('displaySettings', 'off'); - - if (_.kuki.get('displaySettings') == 'on') { - $('#toolbar a[href="kcact:settings"]').addClass('selected'); - $('#settings').css('display', 'block'); - browser.resize(); - } - - $('#toolbar a[href="kcact:settings"]').click(function () { - if ($('#settings').css('display') == 'none') { - $(this).addClass('selected'); - _.kuki.set('displaySettings', 'on'); - $('#settings').css('display', 'block'); - browser.fixFilesHeight(); - } else { - $(this).removeClass('selected'); - _.kuki.set('displaySettings', 'off'); - $('#settings').css('display', 'none'); - browser.fixFilesHeight(); - } - return false; - }); - - $('#toolbar a[href="kcact:refresh"]').click(function() { - browser.refresh(); - return false; - }); - - if (window.opener || this.opener.TinyMCE || $('iframe', window.parent.document).get(0)) - $('#toolbar a[href="kcact:maximize"]').click(function() { - browser.maximize(this); - return false; - }); - else - $('#toolbar a[href="kcact:maximize"]').css('display', 'none'); - - $('#toolbar a[href="kcact:about"]').click(function() { - var html = '
    ' + - '
    KCFinder v2.21
    ' + - '
    Licenses: GPLv2 & LGPLv2
    ' + - '
    Copyright ©2010 Pavel Tzonkov
    ' + - '' + - '
    '; - $('#dialog').html(html); - browser.showDialog(); - $('#dialog button').get(0).focus(); - var close = function() { - browser.hideDialog(); - browser.unshadow(); - } - $('#dialog button').click(close); - $('#dialog button').keypress(function(e) { - if (e.keyCode == 27) close(); - }); - $('#dialog').unbind(); - return false; - }); - - this.initUploadButton(); -}; - -browser.initUploadButton = function() { - var btn = $('#toolbar a[href="kcact:upload"]'); - if (this.readonly) { - btn.css('display', 'none'); - return; - } - var top = btn.get(0).offsetTop; - var width = btn.outerWidth(); - var height = btn.outerHeight(); - $('#toolbar').prepend('
    ' + - '
    ' + - '' + - '' + - '
    ' + - '
    '); - $('#upload input').css('margin-left', "-" + ($('#upload input').outerWidth() - width) + "px"); - $('#upload').mouseover(function() { - $('#toolbar a[href="kcact:upload"]').addClass('hover'); - }); - $('#upload').mouseout(function() { - $('#toolbar a[href="kcact:upload"]').removeClass('hover'); - }); -}; - -browser.uploadFile = function(form) { - if (!this.dirWritable) { - alert(this.label("Cannot write to upload folder.")); - $('#upload').detach(); - browser.initUploadButton(); - return; - } - form.elements[1].value = browser.dir; - $('').prependTo(document.body); - $('#loading').html(this.label("Uploading file...")); - $('#loading').css('display', 'inline'); - form.submit(); - $('#uploadResponse').load(function() { - var response = $(this).contents().find('body').html(); - $('#loading').css('display', 'none'); - if (response.length && response.substr(0, 1) != '/') - alert(response); - else - browser.refresh(response.substr(1, response.length - 1)); - $('#upload').detach(); - setTimeout(function() { - $('#uploadResponse').detach(); - }, 1); - browser.initUploadButton(); - }); -}; - -browser.maximize = function(button) { - if (window.opener) { - window.moveTo(0, 0); - width = screen.availWidth; - height = screen.availHeight; - if ($.browser.opera) - height -= 50; - window.resizeTo(width, height); - - } else if (browser.opener.TinyMCE) { - var win, ifr, id; - - $('iframe', window.parent.document).each(function() { - if (/^mce_\d+_ifr$/.test($(this).attr('id'))) { - id = parseInt($(this).attr('id').replace(/^mce_(\d+)_ifr$/, "$1")); - win = $('#mce_' + id, window.parent.document); - ifr = $('#mce_' + id + '_ifr', window.parent.document); - } - }); - - if ($(button).hasClass('selected')) { - $(button).removeClass('selected'); - win.css('left', browser.maximizeMCE.left + 'px'); - win.css('top', browser.maximizeMCE.top + 'px'); - win.css('width', browser.maximizeMCE.width + 'px'); - win.css('height', browser.maximizeMCE.height + 'px'); - ifr.css('width', browser.maximizeMCE.width - browser.maximizeMCE.Hspace + 'px'); - ifr.css('height', browser.maximizeMCE.height - browser.maximizeMCE.Vspace + 'px'); - - } else { - $(button).addClass('selected') - browser.maximizeMCE = { - width: _.nopx(win.css('width')), - height: _.nopx(win.css('height')), - left: win.position().left, - top: win.position().top, - Hspace: _.nopx(win.css('width')) - _.nopx(ifr.css('width')), - Vspace: _.nopx(win.css('height')) - _.nopx(ifr.css('height')) - }; - var width = $(window.parent).width(); - var height = $(window.parent).height(); - win.css('left', $(window.parent).scrollLeft() + 'px'); - win.css('top', $(window.parent).scrollTop() + 'px'); - win.css('width', width + 'px'); - win.css('height', height + 'px'); - ifr.css('width', width - browser.maximizeMCE.Hspace + 'px'); - ifr.css('height', height - browser.maximizeMCE.Vspace + 'px'); - } - - } else if ($('iframe', window.parent.document).get(0)) { - var ifrm = $('iframe[name="' + window.name + '"]', window.parent.document); - var parent = ifrm.parent(); - var width, height; - if ($(button).hasClass('selected')) { - $(button).removeClass('selected'); - if (browser.maximizeThread) { - clearInterval(browser.maximizeThread); - browser.maximizeThread = null; - } - if (browser.maximizeW) browser.maximizeW = null; - if (browser.maximizeH) browser.maximizeH = null; - $.each($('*', window.parent.document).get(), function(i, e) { - e.style.display = browser.maximizeDisplay[i]; - }); - ifrm.css('display', browser.maximizeCSS.display); - ifrm.css('position', browser.maximizeCSS.position); - ifrm.css('left', browser.maximizeCSS.left); - ifrm.css('top', browser.maximizeCSS.top); - ifrm.css('width', browser.maximizeCSS.width); - ifrm.css('height', browser.maximizeCSS.height); - $(window.parent).scrollLeft(browser.maximizeLest); - $(window.parent).scrollTop(browser.maximizeTop); - - } else { - $(button).addClass('selected'); - browser.maximizeCSS = { - display: ifrm.css('display'), - position: ifrm.css('position'), - left: ifrm.css('left'), - top: ifrm.css('top'), - width: ifrm.outerWidth() + 'px', - height: ifrm.outerHeight() + 'px' - }; - browser.maximizeTop = $(window.parent).scrollTop(); - browser.maximizeLeft = $(window.parent).scrollLeft(); - browser.maximizeDisplay = []; - $.each($('*', window.parent.document).get(), function(i, e) { - browser.maximizeDisplay[i] = $(e).css('display'); - $(e).css('display', 'none'); - }); - - ifrm.css('display', 'block'); - ifrm.parents().css('display', 'block'); - var resize = function() { - width = $(window.parent).width(); - height = $(window.parent).height(); - if (!browser.maximizeW || (browser.maximizeW != width) || - !browser.maximizeH || (browser.maximizeH != height) - ) { - browser.maximizeW = width; - browser.maximizeH = height; - ifrm.css('width', width + 'px'); - ifrm.css('height', height + 'px'); - browser.resize(); - } - } - ifrm.css('position', 'absolute'); - if ((ifrm.offset().left == ifrm.position().left) && - (ifrm.offset().top == ifrm.position().top) - ) { - ifrm.css('left', '0'); - ifrm.css('top', '0'); - } else { - ifrm.css('left', - ifrm.offset().left +'px'); - ifrm.css('top', - ifrm.offset().top + 'px'); - } - resize(); - browser.maximizeThread = setInterval(resize, 250); - } - } -}; - -browser.refresh = function(selected) { - this.fadeFiles(); - $.ajax({ - type: 'POST', - url: browser.baseGetData('chDir'), - data: {dir:browser.dir}, - async: false, - success: function(xml) { - if (browser.errors(xml)) return; - var files = xml.getElementsByTagName('file'); - var dirWritable = - xml.getElementsByTagName('files')[0].getAttribute('dirWritable'); - browser.dirWritable = (dirWritable == 'yes'); - browser.loadFiles(files); - browser.orderFiles(null, selected); - browser.statusDir(); - }, - error: function(request, error) { - $('#files > div').css({opacity:'', filter:''}); - $('#files').html(browser.label("Unknown error.")); - } - }); -}; diff --git a/include/limesurvey/admin/scripts/kcfinder/js/helper.js b/include/limesurvey/admin/scripts/kcfinder/js/helper.js deleted file mode 100644 index d8c6e5fe..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/helper.js +++ /dev/null @@ -1,180 +0,0 @@ -/** This file is part of KCFinder project - * - * @desc Helper object - * @package KCFinder - * @version 2.21 - * @author Pavel Tzonkov - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -var _ = function(id) { - return document.getElementById(id); -}; - -_.nopx = function(val) { - return parseInt(val.replace(/^(\d+)px$/, "$1")); -}; - -_.unselect = function() { - if (document.selection && document.selection.empty) - document.selection.empty() ; - else if (window.getSelection) { - var sel = window.getSelection(); - if (sel && sel.removeAllRanges) - sel.removeAllRanges(); - } -}; - -_.htmlValue = function(value) { - return value.replace('"', """).replace("'", "'"); -}; - -_.htmlData = function(value) { - return value.replace(/\/g, ">").replace(/\ /g, " "); -} - -_.jsValue = function(value) { - return value.replace(/\r?\n/, "\\\n").replace('"', "\\\"").replace("'", "\\'"); -}; - -_.basename = function(path) { - var expr = /^.*\/([^\/]+)\/?$/g; - return expr.test(path) - ? path.replace(expr, "$1") - : path; -}; - -_.dirname = function(path) { - var expr = /^(.*)\/[^\/]+\/?$/g; - return expr.test(path) - ? path.replace(expr, "$1") - : ''; -}; - -_.getFileExtension = function(filename, toLower) { - if (typeof(toLower) == 'undefined') toLower = true; - if (/^.*\.[^\.]*$/.test(filename)) { - var ext = filename.replace(/^.*\.([^\.]*)$/, "$1"); - return toLower ? ext.toLowerCase(ext) : ext; - } else - return ""; -}; - -_.escapeDirs = function(path) { - var fullDirExpr = /^([a-z]+)\:\/\/([^\/^\:]+)(\:(\d+))?\/(.+)$/, - prefix = ""; - if (fullDirExpr.test(path)) { - var port = path.replace(fullDirExpr, "$4"); - prefix = path.replace(fullDirExpr, "$1://$2") - if (port.length) - prefix += ":" + port; - prefix += "/"; - path = path.replace(fullDirExpr, "$5"); - } - - var dirs = path.split('/'); - var escapePath = ''; - for (var i = 0; i < dirs.length; i++) - escapePath += encodeURIComponent(dirs[i]) + '/'; - - return prefix + escapePath.substr(0, escapePath.length - 1); -}; - -_.outerSpace = function(selector, type, mbp) { - if (!mbp) mbp = "mbp"; - var r = 0; - if (/m/i.test(mbp)) { - var m = _.nopx($(selector).css('margin-' + type)); - if (m) r += m; - } - if (/b/i.test(mbp)) { - var b = _.nopx($(selector).css('border-' + type + '-width')); - if (b) r += b; - } - if (/p/i.test(mbp)) { - var p = _.nopx($(selector).css('padding-' + type)); - if (p) r += p; - } - return r; -}; - -_.outerLeftSpace = function(selector, mbp) { - return _.outerSpace(selector, 'left', mbp); -}; - -_.outerTopSpace = function(selector, mbp) { - return _.outerSpace(selector, 'top', mbp); -}; - -_.outerRightSpace = function(selector, mbp) { - return _.outerSpace(selector, 'right', mbp); -}; - -_.outerBottomSpace = function(selector, mbp) { - return _.outerSpace(selector, 'bottom', mbp); -}; - -_.outerHSpace = function(selector, mbp) { - return (_.outerLeftSpace(selector, mbp) + _.outerRightSpace(selector, mbp)); -}; - -_.outerVSpace = function(selector, mbp) { - return (_.outerTopSpace(selector, mbp) + _.outerBottomSpace(selector, mbp)); -}; - -_.kuki = { - prefix: '', - duration: 356, - domain: '', - path: '', - secure: false, - - set: function(name, value, duration, domain, path, secure) { - name = this.prefix + name; - if (duration == null) duration = this.duration; - if (secure == null) secure = this.secure; - if ((domain == null) && this.domain) domain = this.domain; - if ((path == null) && this.path) path = this.path; - secure = secure ? true : false; - - var date = new Date(); - date.setTime(date.getTime() + (duration * 86400000)); - var expires = date.toGMTString(); - - var str = name + '=' + value + '; expires=' + expires; - if (domain != null) str += '; domain=' + domain; - if (path != null) str += '; path=' + path; - if (secure) str += '; secure'; - - return (document.cookie = str) ? true : false; - }, - - get: function(name) { - name = this.prefix + name; - var nameEQ = name + '='; - var kukis = document.cookie.split(';'); - var kuki; - - for (var i = 0; i < kukis.length; i++) { - kuki = kukis[i]; - while (kuki.charAt(0) == ' ') - kuki = kuki.substring(1, kuki.length); - - if (kuki.indexOf(nameEQ) == 0) - return kuki.substring(nameEQ.length, kuki.length); - } - - return null; - }, - - del: function(name) { - return this.set(name, '', -1); - }, - - isSet: function(name) { - return (this.get(name) != null); - } -}; diff --git a/include/limesurvey/admin/scripts/kcfinder/js/jquery.drag.js b/include/limesurvey/admin/scripts/kcfinder/js/jquery.drag.js deleted file mode 100644 index 2cb7fee0..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/jquery.drag.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * jquery.event.drag - v 2.0.0 - * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com - * Open Source MIT License - http://threedubmedia.com/code/license - */ -;(function(f){f.fn.drag=function(b,a,d){var e=typeof b=="string"?b:"",k=f.isFunction(b)?b:f.isFunction(a)?a:null;if(e.indexOf("drag")!==0)e="drag"+e;d=(b==k?a:d)||{};return k?this.bind(e,d,k):this.trigger(e)};var i=f.event,h=i.special,c=h.drag={defaults:{which:1,distance:0,not:":input",handle:null,relative:false,drop:true,click:false},datakey:"dragdata",livekey:"livedrag",add:function(b){var a=f.data(this,c.datakey),d=b.data||{};a.related+=1;if(!a.live&&b.selector){a.live=true;i.add(this,"draginit."+ c.livekey,c.delegate)}f.each(c.defaults,function(e){if(d[e]!==undefined)a[e]=d[e]})},remove:function(){f.data(this,c.datakey).related-=1},setup:function(){if(!f.data(this,c.datakey)){var b=f.extend({related:0},c.defaults);f.data(this,c.datakey,b);i.add(this,"mousedown",c.init,b);this.attachEvent&&this.attachEvent("ondragstart",c.dontstart)}},teardown:function(){if(!f.data(this,c.datakey).related){f.removeData(this,c.datakey);i.remove(this,"mousedown",c.init);i.remove(this,"draginit",c.delegate);c.textselect(true); this.detachEvent&&this.detachEvent("ondragstart",c.dontstart)}},init:function(b){var a=b.data,d;if(!(a.which>0&&b.which!=a.which))if(!f(b.target).is(a.not))if(!(a.handle&&!f(b.target).closest(a.handle,b.currentTarget).length)){a.propagates=1;a.interactions=[c.interaction(this,a)];a.target=b.target;a.pageX=b.pageX;a.pageY=b.pageY;a.dragging=null;d=c.hijack(b,"draginit",a);if(a.propagates){if((d=c.flatten(d))&&d.length){a.interactions=[];f.each(d,function(){a.interactions.push(c.interaction(this,a))})}a.propagates= a.interactions.length;a.drop!==false&&h.drop&&h.drop.handler(b,a);c.textselect(false);i.add(document,"mousemove mouseup",c.handler,a);return false}}},interaction:function(b,a){return{drag:b,callback:new c.callback,droppable:[],offset:f(b)[a.relative?"position":"offset"]()||{top:0,left:0}}},handler:function(b){var a=b.data;switch(b.type){case !a.dragging&&"mousemove":if(Math.pow(b.pageX-a.pageX,2)+Math.pow(b.pageY-a.pageY,2))[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, -Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& -(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, -a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== -"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, -function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
    a"; -var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, -parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= -false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= -s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, -applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; -else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, -a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== -w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, -cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= -c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); -a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, -function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); -k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), -C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= -e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& -f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; -if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", -e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, -"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, -d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, -e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); -t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| -g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, -CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, -g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, -text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, -setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= -h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== -"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, -h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& -q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; -if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

    ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); -(function(){var g=s.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: -function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= -{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== -"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", -d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? -a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== -1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, -""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); -return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", -""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= -c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? -c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= -function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= -Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, -"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= -a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= -a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== -"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
    ").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, -serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), -function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, -global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& -e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? -"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== -false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= -false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", -c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| -d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); -g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== -1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== -"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; -if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== -"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| -c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; -this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= -this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, -e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
    "; -a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); -c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, -d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- -f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": -"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in -e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/include/limesurvey/admin/scripts/kcfinder/js/jquery.rightClick.js b/include/limesurvey/admin/scripts/kcfinder/js/jquery.rightClick.js deleted file mode 100644 index 27681bc3..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js/jquery.rightClick.js +++ /dev/null @@ -1,116 +0,0 @@ -// jQuery Right-Click Plugin -// -// Version 1.01 -// -// Cory S.N. LaViska -// A Beautiful Site (http://abeautifulsite.net/) -// 20 December 2008 -// -// Visit http://abeautifulsite.net/notebook/68 for more information -// -// Usage: -// -// // Capture right click -// $("#selector").rightClick( function(e) { -// // Do something -// }); -// -// // Capture right mouse down -// $("#selector").rightMouseDown( function(e) { -// // Do something -// }); -// -// // Capture right mouseup -// $("#selector").rightMouseUp( function(e) { -// // Do something -// }); -// -// // Disable context menu on an element -// $("#selector").noContext(); -// -// History: -// -// 1.01 - Updated (20 December 2008) -// - References to 'this' now work the same way as other jQuery plugins, thus -// the el parameter has been deprecated. Use this or $(this) instead -// - The mouse event is now passed to the callback function -// - Changed license to GNU GPL -// -// 1.00 - Released (13 May 2008) -// -// License: -// -// This plugin is dual-licensed under the GNU General Public License and the MIT License -// and is copyright 2008 A Beautiful Site, LLC. -// -if(jQuery) (function(){ - - $.extend($.fn, { - - rightClick: function(handler) { - $(this).each( function() { - $(this).mousedown( function(e) { - var evt = e; - $(this).mouseup( function() { - $(this).unbind('mouseup'); - if( evt.button == 2 ) { - handler.call( $(this), evt ); - return false; - } else { - return true; - } - }); - }); - $(this)[0].oncontextmenu = function() { - return false; - } - }); - return $(this); - }, - - rightMouseDown: function(handler) { - $(this).each( function() { - $(this).mousedown( function(e) { - if( e.button == 2 ) { - handler.call( $(this), e ); - return false; - } else { - return true; - } - }); - $(this)[0].oncontextmenu = function() { - return false; - } - }); - return $(this); - }, - - rightMouseUp: function(handler) { - $(this).each( function() { - $(this).mouseup( function(e) { - if( e.button == 2 ) { - handler.call( $(this), e ); - return false; - } else { - return true; - } - }); - $(this)[0].oncontextmenu = function() { - return false; - } - }); - return $(this); - }, - - noContext: function() { - $(this).each( function() { - $(this)[0].oncontextmenu = function() { - return false; - } - }); - return $(this); - } - - }); - -})(jQuery); \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/js_localize.php b/include/limesurvey/admin/scripts/kcfinder/js_localize.php deleted file mode 100644 index 7171aae8..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/js_localize.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -require "core/autoload.php"; - -if (function_exists('set_magic_quotes_runtime')) - @set_magic_quotes_runtime(false); - -$input = new input(); -if (!isset($input->get['lng']) || ($input->get['lng'] == 'en')) die; -$file = "lang/" . $input->get['lng'] . ".php"; -$files = glob("lang/*.php"); -if (!in_array($file, $files)) die; -$mtime = @filemtime($file); -if ($mtime) httpCache::checkMTime($mtime); -require $file; -header("Content-Type: text/javascript; charset={$lang['_charset']}"); -foreach ($lang as $english => $native) - if (substr($english, 0, 1) != "_") - echo "browser.labels['" . text::jsValue($english) . "']=\"" . text::jsValue($native) . "\";"; - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/.htaccess b/include/limesurvey/admin/scripts/kcfinder/lang/.htaccess deleted file mode 100644 index d61b264c..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ - -Order allow,deny -Deny from all - diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/bg.php b/include/limesurvey/admin/scripts/kcfinder/lang/bg.php deleted file mode 100644 index f971d3a7..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/bg.php +++ /dev/null @@ -1,238 +0,0 @@ - - */ - -$lang = array( - - '_locale' => "bg_BG.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e %B, %Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d.%m.%Y %H:%M", - - "You don't have permissions to upload files." => - "Нямате права за качване.", - - "You don't have permissions to browse server." => - "Нямате права за разглеждане на сървъра.", - - "Cannot move uploaded file to target folder." => - "Файлът не може да се премести в целевата папка.", - - "Unknown error." => - "Непозната грешка.", - - "The uploaded file exceeds {size} bytes." => - "Каченият файл надхвърля {size} байта.", - - "The uploaded file was only partially uploaded." => - "Каченият файл беше качен само частично.", - - "No file was uploaded." => - "Файлът не беше качен", - - "Missing a temporary folder." => - "Липсва временна папка.", - - "Failed to write file." => - "Грешка при записване на файла.", - - "Denied file extension." => - "Забранено файлово разширение.", - - "Unknown image format/encoding." => - "Файлът не може да бъде разпознат като изображение.", - - "The image is too big and/or cannot be resized." => - "Изображението е много голямо и/или не може да бъде преоразмерено.", - - "Cannot create {dir} folder." => - "Невъзможност да се създаде папка {dir}.", - - "Cannot rename the folder." => - "Папката не може да се преимеува.", - - "Cannot write to upload folder." => - "Не е възможно записването на файлове в папката за качване.", - - "Cannot read .htaccess" => - "Не е възможно прочитането на .htaccess", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Невалиден .htaccess файл. Не може да се презапише автоматично!", - - "Cannot read upload folder." => - "Не е възможно прочитането на папката за качване.", - - "Cannot access or create thumbnails folder." => - "Невъзможен достъп или невъзможно създаване на папката за thumbnails.", - - "Cannot access or write to upload folder." => - "Папката не може да се достъпи или не може да се записва в нея.", - - "Please enter new folder name." => - "Моля въведете име на папката.", - - "Unallowable characters in folder name." => - "Непозволени знаци в името на папката.", - - "Folder name shouldn't begins with '.'" => - "Името на папката не трябва да започва с '.'", - - "Please enter new file name." => - "Моля въведете ново име на файла", - - "Unallowable characters in file name." => - "Непозволени знаци в името на файла.", - - "File name shouldn't begins with '.'" => - "Името на файла не трябва да започва с '.'", - - "Are you sure you want to delete this file?" => - "Наистина ли искате да изтриете този файл?", - - "Are you sure you want to delete this folder and all its content?" => - "Наистина ли искате да изтриете тази папка и цялото й съдържание?", - - "Non-existing directory type." => - "Несъществуващ специален тип на папка.", - - "Undefined MIME types." => - "Не са дефинирани MIME типове.", - - "Fileinfo PECL extension is missing." => - "Липсва Fileinfo PECL разширение.", - - "Opening fileinfo database failed." => - "Грешка при отваряне на fileinfo дефиниции.", - - "You can't upload such files." => - "Не можете да качвате такива файлове.", - - "The file '{file}' does not exist." => - "Фаълът '{file}' не съществува.", - - "Cannot read '{file}'." => - "Файлът '{file}' не може да бъде прочетен.", - - "Cannot copy '{file}'." => - "Файлът '{file}' не може да бъде копиран.", - - "Cannot move '{file}'." => - "Файлът '{file}' не може да бъде преместен.", - - "Cannot delete '{file}'." => - "Файлът '{file}' не може да бъде изтрит.", - - "Cannot delete the folder." => - "Папката не може да бъде изтрита.", - - "Click to remove from the Clipboard" => - "Цъкнете за да премахнете файла от клипборда", - - "This file is already added to the Clipboard." => - "Този файл вече е добавен към клипборда.", - - "The files in the Clipboard are not readable." => - "Файловете в клипборда не могат да се прочетат.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} файла в клипборда не могат да се прочетат. Искате ли да копирате останалите?", - - "The files in the Clipboard are not movable." => - "Файловете в клипборда не могат да бъдат преместени.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} файла в клипборда не могат да бъдат преместени. Искате ли да преместите останалите?", - - "The files in the Clipboard are not removable." => - "Файловете в клипборда не могат да бъдат изтрити.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} файла в клипборда не могат да бъдат изтрити. Искате ли да изтриете останалите?", - - "The selected files are not removable." => - "Избраните файлове не могат да бъдат изтрити.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} от избраните файлове не могат да бъдат изтрити. Искате ли да изтриете останалите?", - - "Are you sure you want to delete all selected files?" => - "Наистина ли искате да изтриете всички избрани файлове?", - - "Failed to delete {count} files/folders." => - "{count} файла/папки не могат да бъдат изтрити.", - - "A file or folder with that name already exists." => - "Вече има файл или папка с такова име.", - - "Copy files here" => - "Копирай файловете тук", - - "Move files here" => - "Премести файловете тук", - - "Delete files" => - "Изтрий файловете", - - "Clear the Clipboard" => - "Изчисти клипборда", - - "Are you sure you want to delete all files in the Clipboard?" => - "Наистина ли искате да изтриете всички файлове от клипборда?", - - "Copy {count} files" => - "Копирай {count} файла", - - "Move {count} files" => - "Премести {count} файла", - - "Add to Clipboard" => - "Добави към клипборда", - - "Inexistant or inaccessible folder." => - "Несъществуваща или недостъпна папка.", - - "New folder name:" => "Име на папката:", - "New file name:" => "Ново име на файла:", - - "Upload" => "Качи", - "Refresh" => "Актуализирай", - "Settings" => "Настройки", - "Maximize" => "Разпъни", - "About" => "Информация", - "files" => "файла", - "selected files" => "избрани файла", - "View:" => "Изглед:", - "Show:" => "Покажи:", - "Order by:" => "Подреди по:", - "Thumbnails" => "Картинки", - "List" => "Списък", - "Name" => "Име", - "Type" => "Тип", - "Size" => "Размер", - "Date" => "Дата", - "Descending" => "Обратен ред", - "Uploading file..." => "Файлът се качва...", - "Loading image..." => "Изображението се зарежда...", - "Loading folders..." => "Зареждане на папките...", - "Loading files..." => "Зареждане на папката...", - "New Subfolder..." => "Нова подпапка...", - "Rename..." => "Преименуване...", - "Delete" => "Изтрий", - "OK" => "OK", - "Cancel" => "Отказ", - "Select" => "Избери", - "Select Thumbnail" => "Избери малък вариант", - "Select Thumbnails" => "Избери малки варианти", - "View" => "Преглед", - "Download" => "Свали", - "Download files" => "Свали файловете", - "Clipboard" => "Клипборд", -); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/cs.php b/include/limesurvey/admin/scripts/kcfinder/lang/cs.php deleted file mode 100644 index c0b97fc2..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/cs.php +++ /dev/null @@ -1,241 +0,0 @@ - - */ - -$lang = array( - - '_locale' => "cs_CZ.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e.%B.%Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d.%m.%Y %H:%M", - - "You don't have permissions to upload files." => - "Nemáte práva pro nahrávání souborů.", - - "You don't have permissions to browse server." => - "Nemáte práva pro prohlížení serveru.", - - "Cannot move uploaded file to target folder." => - "Nelze přesunout soubor do určeného adresáře.", - - "Unknown error." => - "Neznámá chyba.", - - "The uploaded file exceeds {size} bytes." => - "Nahraný soubor přesahuje {size} bytů.", - - "The uploaded file was only partially uploaded." => - "Nahraný soubor byl nahrán pouze částečně.", - - "No file was uploaded." => - "Žádný soubor nebyl nahrán na server.", - - "Missing a temporary folder." => - "Chybí dočasný adresář.", - - "Failed to write file." => - "Soubor se nepodařilo se uložit.", - - "Denied file extension." => - "Nepodporovaný typ souboru.", - - "Unknown image format/encoding." => - "Neznámý formát obrázku/encoding.", - - "The image is too big and/or cannot be resized." => - "Obrázek je příliš velký/nebo nemohl být zmenšen.", - - "Cannot create {dir} folder." => - "Adresář {dir} nelze vytvořit.", - - "Cannot write to upload folder." => - "Nelze ukládat do adresáře pro nahrávání.", - - "Cannot read .htaccess" => - "Není možno číst soubor .htaccess", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Chybný soubor .htaccess. Soubor nelze přepsat!", - - "Cannot read upload folder." => - "Nelze číst z adresáře pro nahrávání souborů.", - - "Cannot access or create thumbnails folder." => - "Adresář pro náhledy nelze vytvořit nebo není přístupný.", - - "Cannot access or write to upload folder." => - "Nelze přistoupit, nebo zapisovat do adresáře pro nahrávání souborů.", - - "Please enter new folder name." => - "Vložte prosím nové jméno adresáře.", - - "Unallowable characters in folder name." => - "Nepovolené znaky v názvu adresáře.", - - "Folder name shouldn't begins with '.'" => - "Jméno adresáře nesmí začínat znakem '.'", - - "Please enter new file name." => - "Vložte prosím nové jméno souboru.", - - "Unallowable characters in file name." => - "Nepovolené znaky v názvu souboru.", - - "File name shouldn't begins with '.'" => - "Název soubor nesmí začínat znakem '.'", - - "Are you sure you want to delete this file?" => - "Jste si jistý že chcete smazat tento soubor?", - - "Are you sure you want to delete this folder and all its content?" => - "Jste si jistý že chcete smazat tento adresář a celý jeho obsah?", - - "Inexistant or inaccessible folder." => - "Neexistující nebo nepřístupný adresář.", - - "Undefined MIME types." => - "Nedefinovaný MIME typ souboru.", - - "Fileinfo PECL extension is missing." => - "Rozříření PECL pro zjištění informací o souboru chybí.", - - "Opening fileinfo database failed." => - "Načtení informací o souboru selhalo.", - - "You can't upload such files." => - "Tyto soubory nemůžete nahrát na server.", - - "The file '{file}' does not exist." => - "Tento soubor '{file}' neexistuje.", - - "Cannot read '{file}'." => - "Nelze načíst '{file}'.", - - "Cannot copy '{file}'." => - "Nelze kopírovat '{file}'.", - - "Cannot move '{file}'." => - "Nelze přesunout '{file}'.", - - "Cannot delete '{file}'." => - "Nelze smazat '{file}'.", - - "Click to remove from the Clipboard" => - "Klikněte pro odstranění ze schránky", - - "This file is already added to the Clipboard." => - "Tento soubor je již ve schránce vložen.", - - "Copy files here" => - "Kopírovat soubory na toto místo", - - "Move files here" => - "Přesunout soubory na toto místo", - - "Delete files" => - "Smazat soubory", - - "Clear the Clipboard" => - "Vyčistit schránku", - - "Are you sure you want to delete all files in the Clipboard?" => - "Jste si jistý že chcete vymazat všechny soubory ze schránky?", - - "Copy {count} files" => - "Kopírovat {count} souborů", - - "Move {count} files" => - "Přesunout {count} souborů", - - "Add to Clipboard" => - "Vložit do schránky", - - "New folder name:" => "Nový název adresáře:", - "New file name:" => "Nový název souboru:", - - "Upload" => "Nahrát", - "Refresh" => "Obnovit", - "Settings" => "Nastavení", - "Maximize" => "Maxializovat", - "About" => "O aplikaci", - "files" => "soubory", - "View:" => "Zobrazit:", - "Show:" => "Ukázat:", - "Order by:" => "Řadit podle:", - "Thumbnails" => "Náhledy", - "List" => "Seznam", - "Name" => "Jméno", - "Size" => "Velikost", - "Date" => "Datum", - "Descending" => "Sestupně", - "Uploading file..." => "Nahrávání souboru...", - "Loading image..." => "Načítání obrázku...", - "Loading folders..." => "Načítání adresářů...", - "Loading files..." => "Načítání souborů...", - "New Subfolder..." => "Nový adresář...", - "Rename..." => "Přejmenovat...", - "Delete" => "Smazat", - "OK" => "OK", - "Cancel" => "Zrušit", - "Select" => "Vybrat", - "Select Thumbnail" => "Vybrat náhled", - "View" => "Zobrazit", - "Download" => "Stažení", - 'Clipboard' => "Schránka", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "Adresář nelze přejmenovat.", - - "Non-existing directory type." => - "Neexistující typ adresáře.", - - "Cannot delete the folder." => - "Adresář nelze smazat.", - - "The files in the Clipboard are not readable." => - "Soubory ve schránce nelze načíst.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} souborů ve schránce nelze načíst. Chcete zkopírovat zbylé soubory?", - - "The files in the Clipboard are not movable." => - "Soubory ve schránce nelze přesunout.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} souborů ve schránce nelze přesunout. Chcete přesunout zbylé soubory?", - - "The files in the Clipboard are not removable." => - "Soubory ve schránce nelze smazat.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} souborů ve schránce nelze smazat. Chcete smazat zbylé soubory?", - - "The selected files are not removable." => - "Označené soubory nelze smazat.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} označených souborů nelze smazat. Chcete smazat zbylé soubory?", - - "Are you sure you want to delete all selected files?" => - "Jste si jistý že chcete smazat vybrané soubory?", - - "Failed to delete {count} files/folders." => - "Nebylo smazáno {count} souborů/adresářů.", - - "A file or folder with that name already exists." => - "Soubor nebo adresář s takovým jménem již existuje.", - - "selected files" => "vybrané soubory", - "Type" => "Typ", - "Select Thumbnails" => "Vybrat náhled", - "Download files" => "Stáhnout soubory", -); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/de.php b/include/limesurvey/admin/scripts/kcfinder/lang/de.php deleted file mode 100644 index 6e3d4014..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/de.php +++ /dev/null @@ -1,241 +0,0 @@ - - */ - -$lang = array( - - '_locale' => "de_DE.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e.%B.%Y %I:%M %p", - '_dateTimeMid' => "%a %e %b %Y %I:%M %p", - '_dateTimeSmall' => "%d/%m/%Y %I:%M %p", - - "You don't have permissions to upload files." => - "Du hast keine Berechtigung Dateien hoch zu laden.", - - "You don't have permissions to browse server." => - "Fehlende Berechtigung.", - - "Cannot move uploaded file to target folder." => - "Kann hochgeladene Datei nicht in den Zielordner verschieben.", - - "Unknown error." => - "Unbekannter Fehler.", - - "The uploaded file exceeds {size} bytes." => - "Die hochgeladene Datei überschreitet die erlaubte Dateigröße von {size} bytes.", - - "The uploaded file was only partially uploaded." => - "Die Datei wurde nur teilweise hochgeladen.", - - "No file was uploaded." => - "Keine Datei hochgeladen.", - - "Missing a temporary folder." => - "Temporärer Ordner fehlt.", - - "Failed to write file." => - "Fehler beim schreiben der Datei.", - - "Denied file extension." => - "Die Dateiendung ist nicht erlaubt.", - - "Unknown image format/encoding." => - "Unbekanntes Bildformat/encoding.", - - "The image is too big and/or cannot be resized." => - "Das Bild ist zu groß und/oder kann nicht verkleinert werden.", - - "Cannot create {dir} folder." => - "Ordner {dir} kann nicht angelegt werden.", - - "Cannot write to upload folder." => - "Kann nicht in den upload Ordner schreiben.", - - "Cannot read .htaccess" => - "Kann .htaccess Datei nicht lesen", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Falsche .htaccess Datei. Die Datei kann nicht geschrieben werden", - - "Cannot read upload folder." => - "Upload Ordner kann nicht gelesen werden.", - - "Cannot access or create thumbnails folder." => - "Kann thumbnails Ordner nicht erstellen oder darauf zugreifen.", - - "Cannot access or write to upload folder." => - "Kann nicht auf den upload Ordner zugreifen oder darin schreiben.", - - "Please enter new folder name." => - "Bitte einen neuen Ordnernamen angeben.", - - "Unallowable characters in folder name." => - "Der Ordnername enthält unerlaubte Zeichen.", - - "Folder name shouldn't begins with '.'" => - "Ordnernamen sollten nicht mit '.' beginnen.", - - "Please enter new file name." => - "Bitte gib einen neuen Dateinamen an.", - - "Unallowable characters in file name." => - "Der Dateiname enthält unerlaubte Zeichen", - - "File name shouldn't begins with '.'" => - "Dateinamen sollten nicht mit '.' beginnen.", - - "Are you sure you want to delete this file?" => - "Willst Du die Datei wirklich löschen?", - - "Are you sure you want to delete this folder and all its content?" => - "Willst Du wirklich diesen Ordner und seinen gesamten Inhalt löschen?", - - "Inexistant or inaccessible folder." => - "Ordnertyp existiert nicht.", - - "Undefined MIME types." => - "Unbekannte MIME Typen.", - - "Fileinfo PECL extension is missing." => - "PECL extension für Dateiinformationen fehlt", - - "Opening fileinfo database failed." => - "Öffnen der Dateiinfo Datenbank fehlgeschlagen.", - - "You can't upload such files." => - "Du kannst solche Dateien nicht hochladen.", - - "The file '{file}' does not exist." => - "Die Datei '{file}' existiert nicht.", - - "Cannot read '{file}'." => - "Kann Datei '{file}' nicht lesen.", - - "Cannot copy '{file}'." => - "Kann Datei '{file}' nicht kopieren.", - - "Cannot move '{file}'." => - "Kann Datei '{file}' nicht verschieben.", - - "Cannot delete '{file}'." => - "Kann Datei '{file}' nicht löschen.", - - "Click to remove from the Clipboard" => - "Zum entfernen aus der Zwischenablage, hier klicken.", - - "This file is already added to the Clipboard." => - "Diese Datei wurde bereits der Zwischenablage hinzugefügt.", - - "Copy files here" => - "Kopiere Dateien hier hin.", - - "Move files here" => - "Verschiebe Dateien hier hin.", - - "Delete files" => - "Lösche Dateien.", - - "Clear the Clipboard" => - "Zwischenablage leeren", - - "Are you sure you want to delete all files in the Clipboard?" => - "Willst Du wirklich alle Dateien in der Zwischenablage löschen?", - - "Copy {count} files" => - "Kopiere {count} Dateien", - - "Move {count} files" => - "Verschiebe {count} Dateien", - - "Add to Clipboard" => - "Der Zwischenablage hinzufügen", - - "New folder name:" => "Neuer Ordnername:", - "New file name:" => "Neuer Dateiname:", - - "Upload" => "Hochladen", - "Refresh" => "Aktualisieren", - "Settings" => "Einstellungen", - "Maximize" => "Maximieren", - "About" => "Über", - "files" => "Dateien", - "View:" => "Ansicht:", - "Show:" => "Zeige:", - "Order by:" => "Ordnen nach:", - "Thumbnails" => "Miniaturansicht", - "List" => "Liste", - "Name" => "Name", - "Size" => "Größe", - "Date" => "Datum", - "Descending" => "Absteigend", - "Uploading file..." => "Lade Datei hoch...", - "Loading image..." => "Lade Bild...", - "Loading folders..." => "Lade Ordner...", - "Loading files..." => "Lade Dateien...", - "New Subfolder..." => "Neuer Unterordner...", - "Rename..." => "Umbenennen...", - "Delete" => "Löschen", - "OK" => "OK", - "Cancel" => "Abbruch", - "Select" => "Auswählen", - "Select Thumbnail" => "Wähle Miniaturansicht", - "View" => "Ansicht", - "Download" => "Download", - 'Clipboard' => "Zwischenablage", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "Der Ordner kann nicht umbenannt werden.", - - "Non-existing directory type." => - "Der Ordner Typ existiert nicht.", - - "Cannot delete the folder." => - "Der Ordner kann nicht gelöscht werden.", - - "The files in the Clipboard are not readable." => - "Die Dateien in der Zwischenablage können nicht gelesen werden.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} Dateien in der Zwischenablage sind nicht lesbar. Möchtest Du die Übrigen trotzdem kopieren?", - - "The files in the Clipboard are not movable." => - "Die Dateien in der Zwischenablage können nicht verschoben werden.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} Dateien in der Zwischenablage sind nicht verschiebbar. Möchtest Du die Übrigen trotzdem verschieben?", - - "The files in the Clipboard are not removable." => - "Die Dateien in der Zwischenablage können nicht gelöscht werden.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} Dateien in der Zwischenablage können nicht gelöscht werden. Möchtest Du die Übrigen trotzdem löschen?", - - "The selected files are not removable." => - "Die ausgewählten Dateien können nicht gelöscht werden.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} der ausgewählten Dateien können nicht gelöscht werden. Möchtest Du die Übrigen trotzdem löschen?", - - "Are you sure you want to delete all selected files?" => - "Möchtest Du wirklich alle ausgewählten Dateien löschen?", - - "Failed to delete {count} files/folders." => - "Konnte {count} Dateien/Ordner nicht löschen.", - - "A file or folder with that name already exists." => - "Eine Datei oder ein Ordner mit dem Namen existiert bereits.", - - "selected files" => "ausgewählte Dateien", - "Type" => "Typ", - "Select Thumbnails" => "Wähle Miniaturansicht", - "Download files" => "Dateien herunterladen", -); - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/en.php b/include/limesurvey/admin/scripts/kcfinder/lang/en.php deleted file mode 100644 index c768ce21..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/en.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -$lang = array( - '_locale' => "en_US.UTF-8", - '_charset' => "utf-8", - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %B %e, %Y %I:%M %p", - '_dateTimeMid' => "%a %b %e %Y %I:%M %p", - '_dateTimeSmall' => "%m/%d/%Y %I:%M %p", -); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/es.php b/include/limesurvey/admin/scripts/kcfinder/lang/es.php deleted file mode 100644 index 61223462..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/es.php +++ /dev/null @@ -1,242 +0,0 @@ - "es_ES.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e %B, %Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d.%m.%Y %H:%M", - - "You don't have permissions to upload files." => - "No tiene permisos para subir archivos.", - - "You don't have permissions to browse server." => - "No tiene permisos para vizualizar archivos.", - - "Cannot move uploaded file to target folder." => - "No puede mover archivos al directorio destino", - - "Unknown error." => - "Error desconocido.", - - "The uploaded file exceeds {size} bytes." => - "El archivo excede el tamaño permitido en bytes.", - - "The uploaded file was only partially uploaded." => - "El archivo solo fue parcialmente cargado.", - - "No file was uploaded." => - "El archivo no fue cargado", - - "Missing a temporary folder." => - "Se perdio el directorio temporal.", - - "Failed to write file." => - "Fallo la escritura de archivo.", - - "Denied file extension." => - "Extensión de archivo denegada.", - - "Unknown image format/encoding." => - "Formato de imagen desconocido.", - - "The image is too big and/or cannot be resized." => - "La imagen es muy grande o no se puede redimencionar", - - "Cannot create {dir} folder." => - "No puede crear carpeta.", - - "Cannot write to upload folder." => - "No puede escribir en directorio de carga de archivos.", - - "Cannot read .htaccess" => - "No puede leer .htaccess.", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Archvio incorrecto .htaccess. No puede reescribirlo!", - - "Cannot read upload folder." => - "No puede leer la carpeta de carga de archivos.", - - "Cannot access or create thumbnails folder." => - "No puede leer o crear carpeta de miniaturas.", - - "Cannot access or write to upload folder." => - "No puede leer o escribir en la carpeta de carga de archivos.", - - "Please enter new folder name." => - "Por favor introduzca nombre de nueva carpeta.", - - "Unallowable characters in folder name." => - "Caracteres invalidos en nombre de carpeta.", - - "Folder name shouldn't begins with '.'" => - "El nombre de carpeta no puede comenzar con punto '.'", - - "Please enter new file name." => - "Por favor introduzca el nuevo nombre del archivo ", - - "Unallowable characters in file name." => - "Caracteres invalidos en nombre de archivo.", - - "File name shouldn't begins with '.'" => - "El nombre de archivo no puede comenzar con punto '.'", - - "Are you sure you want to delete this file?" => - "Esta seguro que desea borrar este archivo?", - - "Are you sure you want to delete this folder and all its content?" => - "Esta seguro que desea borrar esta carpeta y todo su contenido?", - - "Inexistant or inaccessible folder." => - "Carpeta inexistente o inaccesible.", - - "Undefined MIME types." => - "Tipo MIME no definido.", - - "Fileinfo PECL extension is missing." => - "Archivo PECL con estructura erronea.", - - "Opening fileinfo database failed." => - "Error abriendo archivo de base de datos.", - - "You can't upload such files." => - "No puede cargar tantos archivos.", - - "The file '{file}' does not exist." => - "El archivo '{file}' no existe.", - - "Cannot read '{file}'." => - "No puede leer '{file}'.", - - "Cannot copy '{file}'." => - "No puede copiar '{file}'.", - - "Cannot move '{file}'." => - "No puede mover '{file}'.", - - "Cannot delete '{file}'." => - "No puede borrar '{file}'.", - - "Click to remove from the Clipboard" => - "Haga Clic para borrar del portapapeles", - - "This file is already added to the Clipboard." => - "Este archivo ya fue agregado al portapapeles.", - - "Copy files here" => - "Copiar archivos aquí", - - "Move files here" => - "Mover archivos aquí", - - "Delete files" => - "Borrar archivos", - - "Clear the Clipboard" => - "Limpiar el portapapeles", - - "Are you sure you want to delete all files in the Clipboard?" => - "Esta seguro que desea borrar todos los archivos del portapapeles?", - - "Copy {count} files" => - "Copiar {count} archivos", - - "Move {count} files" => - "Mover {count} archivos ", - - "Add to Clipboard" => - "Agregar al portapapeles", - - "New folder name:" => "Nuevo nombre de carpeta:", - "New file name:" => "Nuevo nombre de archivo:", - - "Upload" => "Cargar", - "Refresh" => "Refrescar", - "Settings" => "Preferencias", - "Maximize" => "Maximizar", - "About" => "Acerca de", - "files" => "Archivos", - "View:" => "Ver:", - "Show:" => "Mostrar:", - "Order by:" => "Ordenar por:", - "Thumbnails" => "Miniatura", - "List" => "Lista", - "Name" => "Nombre", - "Size" => "Tamaño", - "Date" => "Fecha", - "Descending" => "Decendente", - "Uploading file..." => "Cargando archivo...", - "Loading image..." => "Cargando imagen...", - "Loading folders..." => "Cargando carpeta...", - "Loading files..." => "Cargando archivos...", - "New Subfolder..." => "Nuevo subdirectorio...", - "Rename..." => "Renombrar...", - "Delete" => "Eliminar", - "OK" => "OK", - "Cancel" => "Cancelar", - "Select" => "Seleccionar", - "Select Thumbnail" => "Seleccionar miniatura", - "View" => "Ver", - "Download" => "Descargar", - "Clipboard" => "Portapapeles", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "No puede renombrar la carpeta.", - - "Non-existing directory type." => - "Tipo de directorio no existe.", - - "Cannot delete the folder." => - "No puede borrrar la carpeta.", - - "The files in the Clipboard are not readable." => - "Los archivos en el portapaleles no son legibles.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} archivos en el portapapeles no son legibles. Desea copiar el resto?", - - "The files in the Clipboard are not movable." => - "Los archivos en el portapapeles no se pueden mover.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} archivos en el portapapeles no se pueden mover. Desea mover el resto?", - - "The files in the Clipboard are not removable." => - "Los archivos en el portapapeles no se pueden remover.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} archivos en el portapapeles no se pueden remover. Desea borrar el resto?", - - "The selected files are not removable." => - "Los archivos seleccionados no son removibles.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} archivos seleccionados no son removibles. Desea borrar el resto?", - - "Are you sure you want to delete all selected files?" => - "Esta seguro que desea borrar todos los archivos seleccionados?", - - "Failed to delete {count} files/folders." => - "Falló al borrar {count} archivos/carpetas.", - - "A file or folder with that name already exists." => - "Existe una carpeta o archivo con el mismo nombre.", - - "selected files" => "Archivos seleccionados", - "Type" => "Tipo", - "Select Thumbnails" => "Seleccionar miniatura", - "Download files" => "Descargar archivos", -); - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/fa.php b/include/limesurvey/admin/scripts/kcfinder/lang/fa.php deleted file mode 100644 index 5d02a4ed..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/fa.php +++ /dev/null @@ -1,248 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -$lang = array( - '_locale' => "fa_IR.UTF-8", - '_charset' => "utf-8", - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %B %e, %Y %H:%M", - '_dateTimeMid' => "%a %b %e %Y %H:%M", - '_dateTimeSmall' => "%Y/%m/%d %H:%M", - - "You don't have permissions to upload files." => - ".شما فاقد مجوز برای ارسال فایل ها هستید", - - "You don't have permissions to browse server." => - ".شما فاقد مجوز برای جستجو در سرور هستید", - - "Cannot move uploaded file to target folder." => - ".برنامه نمی تواند فایل بارگذاری شده را انتقال دهد به پوشه مورد نظر", - - "Unknown error." => - ".خطای نامشخص", - - "The uploaded file exceeds {size} bytes." => - ".بایت است {size} حجم فایل بارگذاری شده بیشتر از", - - "The uploaded file was only partially uploaded." => - ".فایل ناقص بارگذاری شد", - - "No file was uploaded." => - ".فایل ارسال نشد", - - "Missing a temporary folder." => - ".پوشه تمپ پیدا نشد", - - "Failed to write file." => - ".خطا در نوشتن فایل", - - "Denied file extension." => - ".پسوند فایل غیر مجاز است", - - "Unknown image format/encoding." => - ".عکس معتبر نیست format/encoding", - - "The image is too big and/or cannot be resized." => - ".عکس انتخابی یا بزرگ است یا تغییر اندازه داده نمی شود", - - "Cannot create {dir} folder." => - ".{dir}مشکل در ساخت پوشه", - - "Cannot write to upload folder." => - ".مشکل در نوشتن اطلاعات در پوشه بارگذاری", - - "Cannot read .htaccess" => - ".htaccess خطا در خواندن فایل", - - "Incorrect .htaccess file. Cannot rewrite it!" => - ".غیرقابل بازنویسی است .htaccess فایل", - - "Cannot read upload folder." => - ".مشکل در خواندن پوشه بارگذاری", - - "Cannot access or create thumbnails folder." => - ".مشکل در دسترسی یا ساخت پوشه تام", - - "Cannot access or write to upload folder." => - ".مشکل در دسترسی برای نوشتن اطلاعات در پوشه بارگذاری", - - "Please enter new folder name." => - ".لطفا نام پوشه جدید را وارد کنید", - - "Unallowable characters in folder name." => - ".نام پوشه دارای حروف غیر مجاز است", - - "Folder name shouldn't begins with '.'" => - ".نام پوشه نباید با '.' شروع شود", - - "Please enter new file name." => - ".لطفا نام فایل جدید را وارد کنید", - - "Unallowable characters in file name." => - ".نام فایل دارای حروف غیر مجاز است", - - "File name shouldn't begins with '.'" => - ".نام فایل نباید با '.' شروع شود", - - "Are you sure you want to delete this file?" => - "آیا از حذف این فایل اطمینان دارید؟", - - "Are you sure you want to delete this folder and all its content?" => - "آیا از حذف این پوشه و تمام محتویات داخل آن اطمینان دارید؟", - - "Inexistant or inaccessible folder." => - "Tipo di cartella non esistente.", - - "Undefined MIME types." => - ".تعریف نشده اند MIME پسوند های ", - - "Fileinfo PECL extension is missing." => - "Manca estensione PECL del file.", - - "Opening fileinfo database failed." => - ".خطا در بازکردن بانک اطلاعاتی مشخصات فایل", - - "You can't upload such files." => - ".شما امکان بارگذاری این فایل ها را ندارید", - - "The file '{file}' does not exist." => - ".موجود نیست '{file}' فایل", - - "Cannot read '{file}'." => - ".'{file}' مشکل در خواندن", - - "Cannot copy '{file}'." => - ".'{file}' نمی توانید کپی کنید", - - "Cannot move '{file}'." => - ".'{file}' نمی توانید انتقال دهید", - - "Cannot delete '{file}'." => - ".'{file}'نمی توانید حذف کنید", - - "Click to remove from the Clipboard" => - ".برای حذف از کلیپ برد کلیک کنید", - - "This file is already added to the Clipboard." => - ".این فایل قبلا در حافظه کلیپ برد افزوده شده است", - - "Copy files here" => - "کپی فایل ها به اینجا", - - "Move files here" => - "انتقال فایل ها به اینجا", - - "Delete files" => - "حذف فایل ها", - - "Clear the Clipboard" => - "پاک کردن حافظه کلیپ برد", - - "Are you sure you want to delete all files in the Clipboard?" => - "آیا از حذف فایل های موجود در کلیپ برد اطمینان دارید؟", - - "Copy {count} files" => - "...تعداد {count} فایل آماده کپی به", - - "Move {count} files" => - "...تعداد {count} فایل آماده انتقال به", - - "Add to Clipboard" => - "افزودن در کلیپ برد", - - "New folder name:" => "نام پوشه جدید:", - "New file name:" => "نام فایل جدید:", - - "Upload" => "ارسال فايل", - "Refresh" => "بارگذاری مجدد", - "Settings" => "تنظيمات", - "Maximize" => "تمام صفحه", - "About" => "درباره", - "files" => "فايل ها", - "View:" => ": نمایش", - "Show:" => ": نمايش", - "Order by:" => ": مرتب کردن بر مبناي", - "Thumbnails" => "نمايش کوچک عکسها", - "List" => "ليست", - "Name" => "نام", - "Size" => "حجم", - "Date" => "تاريخ", - "Type" => "پسوند", - "Descending" => "نزولي", - "Uploading file..." => "... درحال ارسال فایل", - "Loading image..." => "... درحال بارگذاری عکس", - "Loading folders..." => "... درحال بارگذاری پوشه ها", - "Loading files..." => "... درحال بارگذاری فایل ها", - "New Subfolder..." => "...ساخت زیرپوشه جدید", - "Rename..." => "... تغییر نام", - "Delete" => "حذف", - "OK" => "ادامه", - "Cancel" => "انصراف", - "Select" => "انتخاب", - "Select Thumbnail" => "انتخاب عکس با اندازه کوچک", - "View" => "نمایش", - "Download" => "دریافت فایل", - "Clipboard" => "حافضه کلیپ برد", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - ".نام وارد شده تکراری است. پوشه ای با این نام وجود دارد. لطفا نام جدیدی انتخاب کنید", - - "Non-existing directory type." => - ".نوع فهرست وجود ندارد", - - "Cannot delete the folder." => - ".نمی توانید این پوشه را حذف کنید", - - "The files in the Clipboard are not readable." => - ".فایل های موجود در کلیپ برد قابل خواندن نیستند", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "تعداد {count} فایل موجود در کلیپ برد قابل خواندن نیستند. آیا مایلید بقیه فایل ها کپی شوند؟", - - "The files in the Clipboard are not movable." => - ".فایل های موجود در کلیپ برد غیر قابل انتقال هستند. لطفا دسترسی فایل ها را چک کنید", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "تعداد {count} فایل از فایل های موجود در کلیپ برد غیر قابل انتقال هستند. آیا مایلید بقیه فایل ها منتقل شوند؟", - - "The files in the Clipboard are not removable." => - ".فایل های موجود در کلیپ برد قابل پاک شدن نیستند. دسترسی فایل ها را چک کنید", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "تعداد {count} فایل از فایل های موجود در کلیپ برد غیر قابل حذف هستند. آیا مایلید بقیه فایل ها حذف شوند؟", - - "The selected files are not removable." => - ".فایل های انتخاب شده قابل برداشتن نیست", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "تعداد {count} فایل از فایل های انتخابی غیر قابل حذف هستند.آیا مایلید بقیه فایل ها حذف شوند؟", - - "Are you sure you want to delete all selected files?" => - "آیا از حذف تمام فایل های انتخابی اطمینان دارید؟", - - "Failed to delete {count} files/folders." => - ".فایل/پوشه {count} خطا در پاک کردن", - - "A file or folder with that name already exists." => - ".یک پوشه یا فایل با این نام وجود دارد.لطفا نام دیگری انتخاب کنید", - - "selected files" => "فایل های انتخاب شده", - "Select Thumbnails" => "انتخاب عکس های کوچک", - "Download files" => "دریافت فایل ها", -); - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/fr.php b/include/limesurvey/admin/scripts/kcfinder/lang/fr.php deleted file mode 100644 index 73dd748c..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/fr.php +++ /dev/null @@ -1,241 +0,0 @@ - "fr_FR.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e %B, %Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d.%m.%Y %H:%M", - - "You don't have permissions to upload files." => - "Vous n'avez pas les droits nécessaires pour envoyer des fichiers.", - - "You don't have permissions to browse server." => - "Vous n'avez pas les droits nécessaires pour parcourir le serveur.", - - "Cannot move uploaded file to target folder." => - "Impossible de déplacer le fichier téléchargé vers le répertoire de destination.", - - "Unknown error." => - "Erreur inconnue.", - - "The uploaded file exceeds {size} bytes." => - "Le fichier envoyé dépasse la taille maximale de {size} octects.", - - "The uploaded file was only partially uploaded." => - "Le fichier envoyé ne l'a été que partiellement.", - - "No file was uploaded." => - "Aucun fichier n'a été envoyé", - - "Missing a temporary folder." => - "Il manque un répertoire temporaire.", - - "Failed to write file." => - "Impossible de créer le fichier.", - - "Denied file extension." => - "Type d'extension de fichier interdit.", - - "Unknown image format/encoding." => - "Format/encodage d'image inconnu.", - - "The image is too big and/or cannot be resized." => - "Image trop grande et/ou impossible de la redimensionner.", - - "Cannot create {dir} folder." => - "Impossible de créer le répertoire {dir}.", - - "Cannot write to upload folder." => - "Impossible d'écrire dans le répertoire de destination.", - - "Cannot read .htaccess" => - "Impossible de lire le fichier .htaccess", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Fichier .htaccess incorrect. Réécriture du fichier impossible!", - - "Cannot read upload folder." => - "Impossible de lire le répertoire d'envoi.", - - "Cannot access or create thumbnails folder." => - "Impossible d'accéder ou de créer le répertoire des miniatures.", - - "Cannot access or write to upload folder." => - "Impossible d'accèder ou d'écrire dans le répertoire d'envoi.", - - "Please enter new folder name." => - "Merci d'entrer le nouveau nom de dossier.", - - "Unallowable characters in folder name." => - "Caractères non autorisés dans le nom du dossier.", - - "Folder name shouldn't begins with '.'" => - "Le nom du dossier ne peut pas commencer par '.'", - - "Please enter new file name." => - "Merci d'entrer le nouveau nom de fichier", - - "Unallowable characters in file name." => - "Caractères non autorisés dans le nom du fichier.", - - "File name shouldn't begins with '.'" => - "Le nom du fichier ne peut pas commencer par '.'", - - "Are you sure you want to delete this file?" => - "Êtes vous sûr du vouloir supprimer ce fichier?", - - "Are you sure you want to delete this folder and all its content?" => - "Êtes vous sûr du vouloir supprimer ce répertoire et tous les fichiers qu'il contient?", - - "Non-existing directory type." => - "Type de répertoire inexistant.", - - "Undefined MIME types." => - "MIME types non déclarés.", - - "Fileinfo PECL extension is missing." => - "L'extension' Fileinfo PECL est manquante.", - - "Opening fileinfo database failed." => - "Ouverture de la base de données fileinfo echouée.", - - "You can't upload such files." => - "Vous ne pouvez pas envoyer de tels fichiers.", - - "The file '{file}' does not exist." => - "Le fichier '{file}' n'existe pas.", - - "Cannot read '{file}'." => - "Impossible de lire le fichier '{file}'.", - - "Cannot copy '{file}'." => - "Impossible de copier le fichier '{file}'.", - - "Cannot move '{file}'." => - "Impossible de déplacer le fichier '{file}'.", - - "Cannot delete '{file}'." => - "Impossible de supprimer le fichier '{file}'.", - - "Click to remove from the Clipboard" => - "Cliquez pour enlever du presse-papier", - - "This file is already added to the Clipboard." => - "Ce fihier a déja été ajouté au presse-papier.", - - "Copy files here" => - "Copier les fichier ici", - - "Move files here" => - "Déplacer le fichiers ici", - - "Delete files" => - "Supprimer les fichiers", - - "Clear the Clipboard" => - "Vider le presse-papier", - - "Are you sure you want to delete all files in the Clipboard?" => - "Êtes vous sûr de vouloir supprimer tous les fichiers du presse-papier?", - - "Copy {count} files" => - "Copie de {count} fichiers", - - "Move {count} files" => - "Déplacement de {count} fichiers", - - "Add to Clipboard" => - "Ajouter au presse-papier", - - "New folder name:" => "Nom du nouveau dossier:", - "New file name:" => "Nom du nouveau fichier:", - - "Upload" => "Envoyer", - "Refresh" => "Rafraîchir", - "Settings" => "Paramètres", - "Maximize" => "Agrandir", - "About" => "A propos", - "files" => "fichiers", - "View:" => "Voir:", - "Show:" => "Montrer:", - "Order by:" => "Trier par:", - "Thumbnails" => "Miniatures", - "List" => "Liste", - "Name" => "Nom", - "Size" => "Taille", - "Date" => "Date", - "Descending" => "Décroissant", - "Uploading file..." => "Envoi en cours...", - "Loading image..." => "Chargement de l'image'...", - "Loading folders..." => "Chargement des dossiers...", - "Loading files..." => "Chargement des fichiers...", - "New Subfolder..." => "Nouveau sous-dossier...", - "Rename..." => "Renommer...", - "Delete" => "Supprimer", - "OK" => "OK", - "Cancel" => "Annuler", - "Select" => "Sélectionner", - "Select Thumbnail" => "Sélectionner la miniature", - "View" => "Voir", - "Download" => "Télécharger", - 'Clipboard' => "Presse-papier", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "Impossible de renommer le dossier.", - - "Cannot delete the folder." => - "Impossible de supprimer le dossier.", - - "The files in the Clipboard are not readable." => - "Les fichiers du presse-papier ne sont pas lisibles.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} fichiers dans le presse-papier ne sont pas lisibles. Voulez vous copier le reste?", - - "The files in the Clipboard are not movable." => - "Les fichiers du presse-papier ne peuvent pas être déplacés.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} fichiers du presse-papier ne peuvent pas être déplacées. Voulez vous déplacer le reste?", - - "The files in the Clipboard are not removable." => - "Les fichiers du presse-papier ne peuvent pas être enlevés.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} fichiers du presse-papier ne peuvent pas être enlevés. Vouslez vous supprimer le reste?", - - "The selected files are not removable." => - "Les fichiers sélectionnés ne peuvent pas être enlevés.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} fichier sélectionnés ne peuvent pas être enlevés. Voulez vous supprimer le reste?", - - "Are you sure you want to delete all selected files?" => - "Êtes vous sûr de vouloir supprimer tous les fichiers sélectionnés?", - - "Failed to delete {count} files/folders." => - "Supression de {count} fichiers/dossiers impossible.", - - "A file or folder with that name already exists." => - "Un fichier ou dossier ayant ce nom existe déja.", - - "Inexistant or inaccessible folder." => - "Dossier inexistant ou innacessible.", - - "selected files" => "fichiers sélectionnés", - "Type" => "Type", - "Select Thumbnails" => "Sélectionner les miniatures", - "Download files" => "Télécharger les fichiers", -); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/hu.php b/include/limesurvey/admin/scripts/kcfinder/lang/hu.php deleted file mode 100644 index 035671eb..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/hu.php +++ /dev/null @@ -1,256 +0,0 @@ - - * @copyright None. Use free as per GPL. - * @since 08/19/2010 - * @version 1.0 - * - */ - -$lang = array( - - '_locale' => "hu_HU.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e.%B.%Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d/%m/%Y %H:%M", - - "You don't have permissions to upload files." => - "Nincs jogosultsága fájlokat feltölteni.", - - "You don't have permissions to browse server." => - "Nincs jogosultsága a kiszolgálón böngészni.", - - "Cannot move uploaded file to target folder." => - "Nem lehet áthelyezni a feltöltött fájlt a célkönyvtárba.", - - "Unknown error." => - "Ismeretlen hiba.", - - "The uploaded file exceeds {size} bytes." => - "A feltöltött fájl mérete meghaladja a {size} bájtot.", - - "The uploaded file was only partially uploaded." => - "A feltöltendő fájl csak részben sikerült feltölteni.", - - "No file was uploaded." => - "Nem történt fájlfeltöltés.", - - "Missing a temporary folder." => - "Hiányzik az ideiglenes könyvtár.", - - "Failed to write file." => - "Nem sikerült a fájl írása.", - - "Denied file extension." => - "Tiltott fájlkiterjesztés.", - - "Unknown image format/encoding." => - "Ismeretlen képformátum vagy kódolás.", - - "The image is too big and/or cannot be resized." => - "A kép mérete túl nagy és/vagy nem lehet átméretezni.", - - "Cannot create {dir} folder." => - "Nem lehet létrehozni a {dir} könyvtárat.", - - "Cannot write to upload folder." => - "Nem lehet írni a feltöltési könyvtárba.", - - "Cannot read .htaccess" => - "Nem lehet olvasni a .htaccess fájlt", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Hibás .htaccess fájl. Nem lehet írni.", - - "Cannot read upload folder." => - "Nem lehet olvasni a feltöltési könyvtárat.", - - "Cannot access or create thumbnails folder." => - "Nem lehet elérni vagy létrehozni a bélyegképek könyvtárat.", - - "Cannot access or write to upload folder." => - "Nem lehet elérni vagy létrehozni a feltöltési könyvtárat.", - - "Please enter new folder name." => - "Kérem, adja meg az új könyvtár nevét.", - - "Unallowable characters in folder name." => - "Meg nem engedett karakter(ek) a könyvtár nevében.", - - "Folder name shouldn't begins with '.'" => - "Könyvtárnév nem kezdődhet '.'-tal", - - "Please enter new file name." => - "Kérem adja meg az új fájl nevét.", - - "Unallowable characters in file name." => - "Meg nem engedett karakter(ek) a fájl nevében.", - - "File name shouldn't begins with '.'" => - "Fájlnév nem kezdődhet '.'-tal", - - "Are you sure you want to delete this file?" => - "Biztos benne, hogy törölni kívánja ezt a fájlt?", - - "Are you sure you want to delete this folder and all its content?" => - "Biztos benne hogy törölni kívánja ezt a könyvtárat és minden tartalmát?", - - "Inexistant or inaccessible folder." => - "Nem létező vagy elérhetetlen könyvtár.", - - "Undefined MIME types." => - "Meghatározatlan MIME típusok.", - - "Fileinfo PECL extension is missing." => - "Hiányzó PECL Fileinfo PHP kiegészítés.", - - "Opening fileinfo database failed." => - "Nem sikerült megnyitni a Fileinfo adatbázist.", - - "You can't upload such files." => - "Nem tölthet fel ilyen fájlokat.", - - "The file '{file}' does not exist." => - "A '{file}' fájl nem létezik.", - - "Cannot read '{file}'." => - "A '{file}' fájlt nem lehet olvasni.", - - "Cannot copy '{file}'." => - "A '{file}' fájlt nem lehet másolni.", - - "Cannot move '{file}'." => - "A '{file}' fájlt nem lehet áthelyezni.", - - "Cannot delete '{file}'." => - "A '{file}' fájlt nem lehet törölni.", - - "Click to remove from the Clipboard" => - "kattintson ide, hogy eltávolítsa a vágólapról", - - "This file is already added to the Clipboard." => - "Ezt a fájlt már hozzáadta a vágólaphoz.", - - "Copy files here" => - "Fájlok másolása ide", - - "Move files here" => - "Fájlok áthelyezése ide", - - "Delete files" => - "Fájlok törlése", - - "Clear the Clipboard" => - "Vágólap ürítése", - - "Are you sure you want to delete all files in the Clipboard?" => - "Biztosan törölni kívánja a vágólapon lévő összes fájlt?", - - "Copy {count} files" => - "{count} fájl másolása", - - "Move {count} files" => - "{count} fájl áthelyezése", - - "Add to Clipboard" => - "Hozzáadás vágólaphoz", - - "New folder name:" => - "Új könyvtár neve:", - - "New file name:" => - "Új fájl neve:", - - "Upload" => "Feltöltés", - "Refresh" => "Frissítés", - "Settings" => "Beállítások", - "Maximize" => "Maximalizálás", - "About" => "Névjegy", - "files" => "fájlok", - "View:" => "Nézet:", - "Show:" => "Mutat:", - "Order by:" => "Rendezés:", - "Thumbnails" => "Bélyegképek", - "List" => "Lista", - "Name" => "Név", - "Size" => "Méret", - "Date" => "Dátum", - "Descending" => "Csökkenő", - "Uploading file..." => "Fájl feltöltése...", - "Loading image..." => "Képek betöltése...", - "Loading folders..." => "Könyvtárak betöltése...", - "Loading files..." => "Fájlok betöltése...", - "New Subfolder..." => "Új alkönyvtár...", - "Rename..." => "Átnevezés...", - "Delete" => "Törlés", - "OK" => "OK", - "Cancel" => "Mégse", - "Select" => "Kiválaszt", - "Select Thumbnail" => "Bélyegkép kiválasztása", - "View" => "Nézet", - "Download" => "Letöltés", - 'Clipboard' => "Vágólap", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "A könyvtárat nem lehet átnevezni.", - - "Non-existing directory type." => - "Nem létező könyvtártípus.", - - "Cannot delete the folder." => - "Nem lehet törölni a könyvtárat.", - - "The files in the Clipboard are not readable." => - "A vágólapon lévő fájlok nem olvashatók.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} fájl a vágólapon nem olvasható. Akarja másolni a többit?", - - "The files in the Clipboard are not movable." => - "A vágólapon lévő fájlokat nem lehet áthelyezni.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} fájlt a vágólapon nem lehet áthelyezni. Akarja áthelyezni a többit?", - - "The files in the Clipboard are not removable." => - "A vágólapon lévő fájlokat nem lehet eltávolítani.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} fájlt a vágólapon nem lehet eltávolítani. Akarja törölni a többit?", - - "The selected files are not removable." => - "A kiválasztott fájlokat nem lehet eltávolítani.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} kiválasztott fájlt nem lehet eltávolítani. Akarja törölni a többit?", - - "Are you sure you want to delete all selected files?" => - "Biztosan törölni kíván minden kijelölt fájlt?", - - "Failed to delete {count} files/folders." => - "Nem sikerült törölni {count} fájlt.", - - "A file or folder with that name already exists." => - "Egy fájl vagy könyvtár már létezik ugyan ezzel a névvel.", - - "selected files" => - "kiválasztott fájlok", - - "Type" => - "Típus", - - "Select Thumbnails" => - "Bélyegképek kiválasztása", - - "Download files" => - "Fájlok letöltése", -); - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/it.php b/include/limesurvey/admin/scripts/kcfinder/lang/it.php deleted file mode 100644 index f837639d..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/it.php +++ /dev/null @@ -1,241 +0,0 @@ - "it_IT.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e %B, %Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d.%m.%Y %H:%M", - - "You don't have permissions to upload files." => - "Non hai il permesso di caricare files.", - - "You don't have permissions to browse server." => - "Non hai il permesso di elencare i files.", - - "Cannot move uploaded file to target folder." => - "Non puoi spostare il file caricato nella cartella di destinazione", - - "Unknown error." => - "Errore sconosciuto.", - - "The uploaded file exceeds {size} bytes." => - "Il file caricato eccede {size} bytes.", - - "The uploaded file was only partially uploaded." => - "Il file è stato caricato parzialmente.", - - "No file was uploaded." => - "Nessun file è stato caricato", - - "Missing a temporary folder." => - "Cartella temporanea non trovata.", - - "Failed to write file." => - "Fallita la scrittura del file.", - - "Denied file extension." => - "Estensione del file non consentita.", - - "Unknown image format/encoding." => - "Sconosciuto format/encoding immagine.", - - "The image is too big and/or cannot be resized." => - "Immagine troppo grande e/o non può essere rimpicciolita", - - "Cannot create {dir} folder." => - "La cartella {dir} non può essere creata.", - - "Cannot write to upload folder." => - "Cartella di destinazione protetta in scrittura.", - - "Cannot read .htaccess" => - "Impossibile leggere il file .htaccess.", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Il file .htaccess è corrotto. Impossibile riscriverlo!", - - "Cannot read upload folder." => - "Impossibile leggere il contenuto della cartella di destinazione.", - - "Cannot access or create thumbnails folder." => - "Impossibile creare o accedere alla cartella delle miniature.", - - "Cannot access or write to upload folder." => - "Impossibile accedere o scrivere nella cartella di destinazione.", - - "Please enter new folder name." => - "Scrivi il nome della nuova cartella.", - - "Unallowable characters in folder name." => - "Caratteri non permessi nel nome della cartella.", - - "Folder name shouldn't begins with '.'" => - "Il nome della cartella non può iniziare con'.'", - - "Please enter new file name." => - "Inserisci il nuovo nome del file", - - "Unallowable characters in file name." => - "Caratteri non permessi nel nome del file.", - - "File name shouldn't begins with '.'" => - "Il nome del file non può iniziare con '.'", - - "Are you sure you want to delete this file?" => - "Sei sicuro che vuoi cancellare questo file?", - - "Are you sure you want to delete this folder and all its content?" => - "Sei sicuro di voler cancellare questa cartella e il suo contenuto?", - - "Inexistant or inaccessible folder." => - "Tipo di cartella non esistente.", - - "Undefined MIME types." => - "Tipo MIME non definito.", - - "Fileinfo PECL extension is missing." => - "Manca estensione PECL del file.", - - "Opening fileinfo database failed." => - "Apertura del database delle informazioni del file fallita.", - - "You can't upload such files." => - "Non è possibile caricare questi files.", - - "The file '{file}' does not exist." => - "Il file '{file}' non esiste.", - - "Cannot read '{file}'." => - "Impossibile leggere il file '{file}'.", - - "Cannot copy '{file}'." => - "Impossibile copiare il file '{file}'.", - - "Cannot move '{file}'." => - "Impossibile spostare il file '{file}'.", - - "Cannot delete '{file}'." => - "Impossibile cancellare il file '{file}'.", - - "Click to remove from the Clipboard" => - "Click per rimuoverlo dalla Clipboard", - - "This file is already added to the Clipboard." => - "Questo file è già aggiunto alla Clipboard.", - - "Copy files here" => - "Copia i files qui", - - "Move files here" => - "Sposta i files qui", - - "Delete files" => - "Cancella i files", - - "Clear the Clipboard" => - "Pulisci la Clipboard", - - "Are you sure you want to delete all files in the Clipboard?" => - "Sei sicuro che vuoi cancellare tutti i files dalla Clipboard?", - - "Copy {count} files" => - "Copio {count} files", - - "Move {count} files" => - "Sposto {count} files", - - "Add to Clipboard" => - "Aggiungi alla Clipboard", - - "New folder name:" => "Nuovo nome della cartella:", - "New file name:" => "Nuovo nome del file:", - - "Upload" => "Carica", - "Refresh" => "Aggiorna", - "Settings" => "Preferenze", - "Maximize" => "Massimizza", - "About" => "Chi siamo", - "files" => "files", - "View:" => "Vista:", - "Show:" => "Mostra:", - "Order by:" => "Ordina per:", - "Thumbnails" => "Miniature", - "List" => "Lista", - "Name" => "Nome", - "Size" => "Grandezza", - "Date" => "Data", - "Descending" => "Discendente", - "Uploading file..." => "Carico file...", - "Loading image..." => "Caricamento immagine...", - "Loading folders..." => "Caricamento cartella...", - "Loading files..." => "caricamento files...", - "New Subfolder..." => "Nuova sottocartella...", - "Rename..." => "Rinomina...", - "Delete" => "Elimina", - "OK" => "OK", - "Cancel" => "Cancella", - "Select" => "Seleziona", - "Select Thumbnail" => "Seleziona miniatura", - "View" => "Vista", - "Download" => "Scarica", - "Clipboard" => "Clipboard", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "Non è possibile rinominare la cartella.", - - "Non-existing directory type." => - "Il tipo di cartella non esiste.", - - "Cannot delete the folder." => - "Non è possibile cancellare la cartella.", - - "The files in the Clipboard are not readable." => - "I files nella clipboard non sono leggibili.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} files nella clipboard non sono leggibili. Copiare il resto?", - - "The files in the Clipboard are not movable." => - "I files nella clipboard non sono spoastabili.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} files nella clipboard non sono spoastabili. Spostare il resto?", - - "The files in the Clipboard are not removable." => - "files nella clipboard non si possono rimuovere.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} files nella clipboard non si possono rimuovere. Cancellare il resto?", - - "The selected files are not removable." => - "Il file selezionato non è rimovibile.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} i files selezionati non sono rimovibili. Cancellare il resto?", - - "Are you sure you want to delete all selected files?" => - "Sei sicuro che vuoi cancellare tutti i files selezionati?", - - "Failed to delete {count} files/folders." => - "Cancellazione fallita {count} files/cartelle.", - - "A file or folder with that name already exists." => - "Un file o cartella con questo nome già esiste.", - - "selected files" => "files selezionati", - "Type" => "Tipo", - "Select Thumbnails" => "Seleziona miniature", - "Download files" => "Scarica files", -); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/nl.php b/include/limesurvey/admin/scripts/kcfinder/lang/nl.php deleted file mode 100644 index 0eb88d32..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/nl.php +++ /dev/null @@ -1,241 +0,0 @@ - - */ - -$lang = array( - - '_locale' => "nl_NL.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e.%B.%Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d/%m/%Y %H:%M", - - "You don't have permissions to upload files." => - "U heeft geen toestemming om bestanden te uploaden.", - - "You don't have permissions to browse server." => - "U heeft geen toegang tot de server.", - - "Cannot move uploaded file to target folder." => - "Het te uploaden bestand kon niet naar de doel folder verplaatst worden.", - - "Unknown error." => - "Onbekende foutmelding.", - - "The uploaded file exceeds {size} bytes." => - "De bestandsgrootte van het bestand gaat de limiet ({size}) voorbij.", - - "The uploaded file was only partially uploaded." => - "Het te uploaden bestand is slechts gedeeltelijk ge�pload.", - - "No file was uploaded." => - "Er is geen bestand ge�pload.", - - "Missing a temporary folder." => - "Een tijdelijke folder ontbreekt.", - - "Failed to write file." => - "Poging tot schrijven van bestand is mislukt.", - - "Denied file extension." => - "De extensie van dit bestand is niet toegestaan.", - - "Unknown image format/encoding." => - "Onbekende afbeeldingsformaats/-codering.", - - "The image is too big and/or cannot be resized." => - "De afbeelding is te groot en/of de grootte kan niet aangepast worden.", - - "Cannot create {dir} folder." => - "Kan de map {dir} niet aanmaken.", - - "Cannot write to upload folder." => - "Kan niet naar de upload folder schrijven.", - - "Cannot read .htaccess" => - "Kan .htaccess niet lezen.", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Incorrect .htaccess bestand. Bestand kan niet herschreven worden!", - - "Cannot read upload folder." => - "Upload folder kan niet uitgelezen worden.", - - "Cannot access or create thumbnails folder." => - "Het is niet mogelijk om een miniatuurweergaven folder aan te maken of te benaderen.", - - "Cannot access or write to upload folder." => - "Het is niet mogelijk om in de upload folder te schrijven of deze te benaderen.", - - "Please enter new folder name." => - "Vul a.u.b. een nieuwe foldernaam in.", - - "Unallowable characters in folder name." => - "Er zijn niet toegestane karakters gebruikt in de foldernaam.", - - "Folder name shouldn't begins with '.'" => - "Een foldernaam mag niet met '.' beginnen.", - - "Please enter new file name." => - "Vul a.u.b. een nieuwe bestandsnaam in.", - - "Unallowable characters in file name." => - "Er zijn niet toegestane karakters gebruikt in de bestandsnaam.", - - "File name shouldn't begins with '.'" => - "Een bestandsnaam mag niet met '.' beginnen.", - - "Are you sure you want to delete this file?" => - "Weet u zeker dat u dit bestand wilt verwijderen?", - - "Are you sure you want to delete this folder and all its content?" => - "Weet u zeker dat u deze folder en alle inhoud ervan wilt verwijderen?", - - "Inexistant or inaccessible folder." => - "Folder bestaat niet of kon niet benaderd worden.", - - "Undefined MIME types." => - "Onbekend MIME type.", - - "Fileinfo PECL extension is missing." => - "Bestandsinformatie PECL extensie ontbreekt.", - - "Opening fileinfo database failed." => - "Openen van bestandsinformatie database is mislukt.", - - "You can't upload such files." => - "Uploaden van dergelijke bestanden is niet mogelijk.", - - "The file '{file}' does not exist." => - "Het bestand '{file}' bestaat niet.", - - "Cannot read '{file}'." => - "Kan bestand '{file}' niet lezen.", - - "Cannot copy '{file}'." => - "Kan bestand '{file}' niet kopieren.", - - "Cannot move '{file}'." => - "Kan bestand '{file}' niet verplaatsen.", - - "Cannot delete '{file}'." => - "Kan bestand '{file}' niet verwijderen.", - - "Click to remove from the Clipboard" => - "Klik om te verwijderen van het klembord.", - - "This file is already added to the Clipboard." => - "Dit bestand was reeds toegevoegd aan het klembord.", - - "Copy files here" => - "Kopieer bestanden hierheen", - - "Move files here" => - "Verplaats bestanden hierheen", - - "Delete files" => - "Verwijder bestanden", - - "Clear the Clipboard" => - "Klemborg leegmaken", - - "Are you sure you want to delete all files in the Clipboard?" => - "Weet u zeker dat u alle bestanden op het klembord wilt verwijderen?", - - "Copy {count} files" => - "Kopieer {count} bestanden", - - "Move {count} files" => - "Verplaats {count} bestanden", - - "Add to Clipboard" => - "Voeg toe aan klembord", - - "New folder name:" => "Nieuwe foldernaam:", - "New file name:" => "Nieuwe bestandsnaam:", - - "Upload" => "Upload", - "Refresh" => "Verversen", - "Settings" => "Instellingen", - "Maximize" => "Maximaliseren", - "About" => "Over", - "files" => "bestanden", - "View:" => "Beeld:", - "Show:" => "Weergeven:", - "Order by:" => "Sorteren op:", - "Thumbnails" => "Miniatuurweergaven", - "List" => "Lijst", - "Name" => "Naam", - "Size" => "Grootte", - "Date" => "Datum", - "Descending" => "Aflopend", - "Uploading file..." => "Bestand uploaden...", - "Loading image..." => "Afbeelding wordt geladen...", - "Loading folders..." => "Folders worden geladen...", - "Loading files..." => "Bestanden worden geladen ...", - "New Subfolder..." => "Nieuwe subfolder...", - "Rename..." => "Hernoemen...", - "Delete" => "Verwijderen", - "OK" => "OK", - "Cancel" => "Annuleren", - "Select" => "Selecteer", - "Select Thumbnail" => "Selecteer miniatuurweergave", - "View" => "Beeld", - "Download" => "Download", - 'Clipboard' => "Klembord", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "De folder kan niet hernoemd worden.", - - "Non-existing directory type." => - "Het folder type bestaat niet.", - - "Cannot delete the folder." => - "De folder kan niet verwijderd worden.", - - "The files in the Clipboard are not readable." => - "De bestanden op het klembord kunnen niet gelezen worden.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} bestanden op het klembord zijn niet leesbaar. Wilt u de rest toch kopi�ren?", - - "The files in the Clipboard are not movable." => - "De bestanden op het klembord kunnen niet verplaatst worden.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} bestanden op het klembord kunnen niet verplaatst worden. Wilt u de rest toch verplaatsen?", - - "The files in the Clipboard are not removable." => - "De bestanden op het klembord kunnen niet verwijderd worden.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} bestanden op het klembord kunnen niet verwijderd worden. Wilt u de rest toch verwijderen?", - - "The selected files are not removable." => - "De geselecteerde bestanden kunnen niet verwijderd worden.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} geselecteerde bestanden kunnen niet verwijderd worden. Wilt u de rest toch verwijderen?", - - "Are you sure you want to delete all selected files?" => - "Weet u zeker dat u alle geselcteerde bestanden wilt verwijderen?", - - "Failed to delete {count} files/folders." => - "{count} bestanden/folders konden niet verwijderd worden.", - - "A file or folder with that name already exists." => - "Er bestaat reeds een bestand of folder met die naam.", - - "selected files" => "geselecteerde bestanden", - "Type" => "Type", - "Select Thumbnails" => "Kies miniatuurweergaven", - "Download files" => "Bestanden downloaden", -); - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/pl.php b/include/limesurvey/admin/scripts/kcfinder/lang/pl.php deleted file mode 100644 index cf79e852..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/pl.php +++ /dev/null @@ -1,241 +0,0 @@ - "pl_PL.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e %B, %Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d.%m.%Y %H:%M", - - "You don't have permissions to upload files." => - "Nie masz zezwolenia na wysyłanie plików.", - - "You don't have permissions to browse server." => - "Nie masz zezwolenia na przeglądanie serwera.", - - "Cannot move uploaded file to target folder." => - "Nie można przenieść wysłanego pliku do folderu plików wysłanych.", - - "Unknown error." => - "Nieokreślony błąd.", - - "The uploaded file exceeds {size} bytes." => - "Wysyłany plik przekroczył rozmiar {size} bajtów", - - "The uploaded file was only partially uploaded." => - "Wysyłany plik nie został przesłany w całości.", - - "No file was uploaded." => - "Żaden plik nie został przesłany", - - "Missing a temporary folder." => - "Brak katalogu domyślnego.", - - "Failed to write file." => - "Błąd zapisu pliku.", - - "Denied file extension." => - "Niedozwolone rozszerzenie pliku.", - - "Unknown image format/encoding." => - "Nie znany format/kodowanie pliku.", - - "The image is too big and/or cannot be resized." => - "Obraz jest zbyt duży i/lub nie może zostać zmieniony jego rozmiar.", - - "Cannot create {dir} folder." => - "Nie można utworzyć katalogu {dir}.", - - "Cannot write to upload folder." => - "Nie można zapisywać do katalogu plików wysłanych.", - - "Cannot read .htaccess" => - "Nie można odczytać pliku .htaccess", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Nie prawidłowy plik .htaccess. Nie można go zapisać!", - - "Cannot read upload folder." => - "Nie można odczytać katalogu plików wysłanych.", - - "Cannot access or create thumbnails folder." => - "Nie ma dostępu lub nie można utworzyć katalogu miniatur.", - - "Cannot access or write to upload folder." => - "Nie ma dostępu lub nie można zapisywać do katalogu plików wysłanych.", - - "Please enter new folder name." => - "Proszę podać nową nazwę katalogu.", - - "Unallowable characters in folder name." => - "Niedozwolony znak w nazwie folderu.", - - "Folder name shouldn't begins with '.'" => - "Nazwa katalogu nie może zaczynać się od '.'", - - "Please enter new file name." => - "Proszę podać nową nazwę pliku", - - "Unallowable characters in file name." => - "Nie dozwolony znak w nazwie pliku.", - - "File name shouldn't begins with '.'" => - "Nazwa pliku nie powinna zaczynać się od '.'", - - "Are you sure you want to delete this file?" => - "Czy jesteś pewien, że chcesz skasować ten plik?", - - "Are you sure you want to delete this folder and all its content?" => - "Czy jesteś pewien, że chcesz skasować ten katalog i jego zawartość?", - - "Non-existing directory type." => - "Nie istniejący katalog.", - - "Undefined MIME types." => - "Niezidentyfikowany typ MIME.", - - "Fileinfo PECL extension is missing." => - "Brak rozszerzenia Fileinfo PECL.", - - "Opening fileinfo database failed." => - "Otwieranie bazy danych fileinfo nie udane.", - - "You can't upload such files." => - "Nie możesz wysyłać plików tego typu.", - - "The file '{file}' does not exist." => - "Plik {file} nie istnieje.", - - "Cannot read '{file}'." => - "Nie można odczytać pliku '{file}'.", - - "Cannot copy '{file}'." => - "Nie można skopiować pliku '{file}'.", - - "Cannot move '{file}'." => - "Nie można przenieść pliku '{file}'.", - - "Cannot delete '{file}'." => - "Nie można usunąć pliku '{file}'.", - - "Click to remove from the Clipboard" => - "Kliknij aby usunąć ze Schowka", - - "This file is already added to the Clipboard." => - "Ten plik już został dodany do Schowka.", - - "Copy files here" => - "Kopiuj pliki tutaj", - - "Move files here" => - "Przenieś pliki tutaj", - - "Delete files" => - "Usuń pliki", - - "Clear the Clipboard" => - "Wyczyść Schowek", - - "Are you sure you want to delete all files in the Clipboard?" => - "Czy jesteś pewien, że chcesz usunąć wszystkie pliki ze schowka?", - - "Copy {count} files" => - "Kopiowanie {count} plików", - - "Move {count} files" => - "Przenoszenie {count} plików", - - "Add to Clipboard" => - "Dodaj do Schowka", - - "New folder name:" => "Nazwa nowego katalogu:", - "New file name:" => "Nowa nazwa pliku:", - - "Upload" => "Wyślij", - "Refresh" => "Odśwież", - "Settings" => "Ustawienia", - "Maximize" => "Maksymalizuj", - "About" => "O...", - "files" => "pliki", - "View:" => "Widok:", - "Show:" => "Pokaż:", - "Order by:" => "Sortuj według:", - "Thumbnails" => "Miniatury", - "List" => "Lista", - "Name" => "Nazwa", - "Size" => "Rozmiar", - "Date" => "Data", - "Descending" => "Malejąco", - "Uploading file..." => "Wysyłanie pliku...", - "Loading image..." => "Ładowanie obrazu...", - "Loading folders..." => "Ładowanie katalogów...", - "Loading files..." => "Ładowanie plików...", - "New Subfolder..." => "Nowy pod-katalog...", - "Rename..." => "Zmień nazwę...", - "Delete" => "Usuń", - "OK" => "OK", - "Cancel" => "Anuluj", - "Select" => "Wybierz", - "Select Thumbnail" => "Wybierz miniaturę", - "View" => "Podgląd", - "Download" => "Pobierz", - 'Clipboard' => "Schowek", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "Nie można zmienić nazwy katalogu.", - - "Cannot delete the folder." => - "Nie można usunąć katalogu.", - - "The files in the Clipboard are not readable." => - "Pliki w Schowku nie mogą zostać odczytane.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} plik(i/ów) ze Schowka nie może zostać odczytanych. Czy chcesz skopiować pozostałe?", - - "The files in the Clipboard are not movable." => - "Pliki w Schowku nie mogą zostać przeniesione.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} plik(i/ów) ze Schowka nie może zostać przeniesionych. Czy chcesz przenieść pozostałe?", - - "The files in the Clipboard are not removable." => - "Nie można usunąć plików ze Schowka.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} plik(i/ów) ze Schowka nie może zostać usunięty(ch). Czy usunąć pozostałe?", - - "The selected files are not removable." => - "Wybrane pliki nie mogą zostać usunięte.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "{count} wybrany(ch) plików nie może zostać usunięte. Czy usunąć pozostałe?", - - "Are you sure you want to delete all selected files?" => - "Czy jesteś pewien że, chcesz usunąć wszystkie wybrane pliki?", - - "Failed to delete {count} files/folders." => - "Nie udało się usunąć {count} plik(i/ów) / folder(u/ów).", - - "A file or folder with that name already exists." => - "Plik lub katalog o tej nazwie już istnieje.", - - "Inexistant or inaccessible folder." => - "Nieistniejący lub niedostępny folder.", - - "selected files" => "wybrane pliki", - "Type" => "Typ", - "Select Thumbnails" => "Wybierz miniatury", - "Download files" => "Pobierz pliki", -); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/pt.php b/include/limesurvey/admin/scripts/kcfinder/lang/pt.php deleted file mode 100644 index f0c7f04f..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/pt.php +++ /dev/null @@ -1,243 +0,0 @@ - "pt_PT.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e %B, %Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d.%m.%Y %H:%M", - - "You don't have permissions to upload files." => - "Não tem permissão para enviar ficheiros.", - - "You don't have permissions to browse server." => - "Não tem permissão para navegar no servidor.", - - "Cannot move uploaded file to target folder." => - "Não pode mover ficheiros enviados para a pasta definida.", - - "Unknown error." => - "Erro indefinido.", - - "The uploaded file exceeds {size} bytes." => - "O ficheiro enviado tem mais que {size} bytes.", - - "The uploaded file was only partially uploaded." => - "O ficheiro foi apenas enviado parcialmente.", - - "No file was uploaded." => - "Nenhum ficheiro enviado.", - - "Missing a temporary folder." => - "Falta a pasta temporária.", - - "Failed to write file." => - "Não foi possvel guardar o ficheiro.", - - "Denied file extension." => - "Extensão do ficheiro inválida.", - - "Unknown image format/encoding." => - "Formato/codificação da imagem desconhecido.", - - "The image is too big and/or cannot be resized." => - "A imagem é muito grande e não pode ser redimensionada.", - - "Cannot create {dir} folder." => - "Não foi possvel criar a pasta '{dir}'.", - - "Cannot write to upload folder." => - "Não foi possvel guardar o ficheiro.", - - "Cannot read .htaccess" => - "Não foi possvel ler o ficheiro '.htaccess'.", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Ficheiro '.htaccess' incorrecto. Não foi possvel altera-lo.", - - "Cannot read upload folder." => - "Não foi possvel ler a pasta de upload.", - - "Cannot access or create thumbnails folder." => - "Não foi possvel aceder ou criar a pasta de miniaturas.", - - "Cannot access or write to upload folder." => - "Não foi possvel aceder ou criar a pasta de upload.", - - "Please enter new folder name." => - "Por favor insira o nome da pasta.", - - "Unallowable characters in folder name." => - "Caracteres não autorizados no nome da pasta.", - - "Folder name shouldn't begins with '.'" => - "O nome da pasta não deve comear por '.'.", - - "Please enter new file name." => - "Por favor defina o nome do ficheiro.", - - "Unallowable characters in file name." => - "Caracteres não autorizados no nome do ficheiro.", - - "File name shouldn't begins with '.'" => - "O nome do ficheiro não deve comear por '.'.", - - "Are you sure you want to delete this file?" => - "Tem a certeza que deseja apagar este ficheiro?", - - "Are you sure you want to delete this folder and all its content?" => - "Tem a certeza que deseja apagar esta pasta e todos os seus conteúdos?", - - "Inexistant or inaccessible folder." => - "Pasta inexistente ou inacessvel.", - - "Undefined MIME types." => - "Tipos MIME indefinidos.", - - "Fileinfo PECL extension is missing." => - "Falta a extensão PECL nas informações do ficheiro.", - - "Opening fileinfo database failed." => - "Erro a abrir a informação do ficheiro.", - - "You can't upload such files." => - "Não pode enviar esse tipo de ficheiros.", - - "The file '{file}' does not exist." => - "O ficheiro '{file}' não existe.", - - "Cannot read '{file}'." => - "Não pode ler '{file}'.", - - "Cannot copy '{file}'." => - "Não pode copiar '{file}'.", - - "Cannot move '{file}'." => - "Não pode mover '{file}'.", - - "Cannot delete '{file}'." => - "Não pode apagar '{file}'.", - - "Click to remove from the Clipboard" => - "Clique aqui para remover do Clipboard", - - "This file is already added to the Clipboard." => - "Este ficheiros já foi adicionado ao Clipboard.", - - "Copy files here" => - "Copiar ficheiros para aqui", - - "Move files here" => - "Mover ficheiros para aqui", - - "Delete files" => - "Apagar ficheiros", - - "Clear the Clipboard" => - "Limpar Clipboard", - - "Are you sure you want to delete all files in the Clipboard?" => - "Tem a certeza que deseja apagar todos os ficheiros que estão no Clipboard?", - - "Copy {count} files" => - "Copiar {count} ficheiros", - - "Move {count} files" => - "Mover {count} ficheiros", - - "Add to Clipboard" => - "Adicionar ao Clipboard", - - "New folder name:" => "Nome da pasta:", - "New file name:" => "Nome do ficheiro:", - - "Upload" => "Enviar", - "Refresh" => "Actualizar", - "Settings" => "Preferências", - "Maximize" => "Maximizar", - "About" => "Acerca de", - "files" => "Ficheiros", - "View:" => "Ver:", - "Show:" => "Mostrar:", - "Order by:" => "Ordenar por:", - "Thumbnails" => "Miniatura", - "List" => "Lista", - "Name" => "Nome", - "Size" => "Tamanho", - "Date" => "Data", - "Descending" => "", - "Uploading file..." => "Carregando ficheiro...", - "Loading image..." => "Carregando imagens...", - "Loading folders..." => "Carregando pastas...", - "Loading files..." => "Carregando ficheiros...", - "New Subfolder..." => "Nova pasta...", - "Rename..." => "Alterar nome...", - "Delete" => "Eliminar", - "OK" => "OK", - "Cancel" => "Cancelar", - "Select" => "Seleccionar", - "Select Thumbnail" => "Seleccionar miniatura", - "View" => "Ver", - "Download" => "Sacar", - "Clipboard" => "Clipboard", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "Não pode alterar o nome da pasta.", - - "Non-existing directory type." => - "Tipo de pasta inexistente.", - - "Cannot delete the folder." => - "Não pode apagar a pasta.", - - "The files in the Clipboard are not readable." => - "Os ficheiros que estão no Clipboard não podem ser copiados.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "{count} ficheiros do Clipboard não podem ser copiados. Pretende copiar os restantes?", - - "The files in the Clipboard are not movable." => - "Os ficheiros que estão no Clipboard não podem ser movidos.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "{count} ficheiros do Clipboard não podem ser movidos. Pretende mover os restantes?", - - "The files in the Clipboard are not removable." => - "Os ficheiros que estão no Clipboard não podem ser removidos.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} ficheiros do Clipboard não podem ser removidos. Pretende apagar os restantes?", - - "The selected files are not removable." => - "Os ficheiros seleccionados não podem ser removidos.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "Não pode remover {count} ficheiros. Pretende apagar os restantes?", - - "Are you sure you want to delete all selected files?" => - "Tem a certeza que deseja apagar os ficheiros seleccionados?", - - "Failed to delete {count} files/folders." => - "Ocorreu um erro a apagar {count} ficheiros/pastas.", - - "A file or folder with that name already exists." => - "Já existe um ficheiro ou pasta com esse nome.", - - "selected files" => "Ficheiros seleccionados", - "Type" => "Tipo", - "Select Thumbnails" => "Seleccionar miniaturas", - "Download files" => "Sacar ficheiros", -); - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/ru.php b/include/limesurvey/admin/scripts/kcfinder/lang/ru.php deleted file mode 100644 index ee102419..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/ru.php +++ /dev/null @@ -1,242 +0,0 @@ - "ru_RU.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e %B, %Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d.%m.%Y %H:%M", - - "You don't have permissions to upload files." => - "У вас нет прав для загрузки файлов.", - - "You don't have permissions to browse server." => - "У вас нет прав для просмотра содержимого на сервере.", - - "Cannot move uploaded file to target folder." => - "Невозможно переместить загруженный файл в папку назначения.", - - "Unknown error." => - "Неизвестная ошибка.", - - "The uploaded file exceeds {size} bytes." => - "Загруженный файл превышает размер {size} байт.", - - "The uploaded file was only partially uploaded." => - "Загруженный файл был загружен только частично.", - - "No file was uploaded." => - "Файл не был загружен", - - "Missing a temporary folder." => - "Временная папка не существует.", - - "Failed to write file." => - "Невозможно записать файл.", - - "Denied file extension." => - "Файлы этого типа запрещены для загрузки.", - - "Unknown image format/encoding." => - "Неизвестный формат изображения.", - - "The image is too big and/or cannot be resized." => - "Изображение слишком большое и/или не может быть уменьшено.", - - "Cannot create {dir} folder." => - "Невозможно создать папку {dir}.", - - "Cannot write to upload folder." => - "Невозможно записать в папку загрузки.", - - "Cannot read .htaccess" => - "Невозможно прочитать файл .htaccess", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Неправильный файл .htaccess. Невозможно перезаписать!", - - "Cannot read upload folder." => - "Невозможно прочитать папку загрузки.", - - "Cannot access or create thumbnails folder." => - "Нет доступа или невозможно создать папку миниатюр.", - - "Cannot access or write to upload folder." => - "Нет доступа или невозможно записать в папку загрузки.", - - "Please enter new folder name." => - "Укажите имя новой папки.", - - "Unallowable characters in folder name." => - "Недопустимые символы в имени папки.", - - "Folder name shouldn't begins with '.'" => - "Имя папки не может начинаться с '.'", - - "Please enter new file name." => - "Укажите новое имя файла", - - "Unallowable characters in file name." => - "Недопустимые символны в имени файла.", - - "File name shouldn't begins with '.'" => - "Имя файла не может начинаться с '.'", - - "Are you sure you want to delete this file?" => - "Вы уверены, что хотите удалить этот файл?", - - "Are you sure you want to delete this folder and all its content?" => - "Вы уверены, что хотите удалить эту папку и всё её содержимое?", - - "Non-existing directory type." => - "Несуществующий тип папки.", - - "Undefined MIME types." => - "Неопределённые типы MIME.", - - "Fileinfo PECL extension is missing." => - "Расширение Fileinfo PECL отсутствует.", - - "Opening fileinfo database failed." => - "Невозможно открыть базу данных fileinfo.", - - "You can't upload such files." => - "Вы не можете загружать файлы этого типа.", - - "The file '{file}' does not exist." => - "Файл '{file}' не существует.", - - "Cannot read '{file}'." => - "Невозможно прочитать файл '{file}'.", - - "Cannot copy '{file}'." => - "Невозможно скопировать файл '{file}'.", - - "Cannot move '{file}'." => - "Невозможно переместить файл '{file}'.", - - "Cannot delete '{file}'." => - "Невозможно удалить файл '{file}'.", - - "Click to remove from the Clipboard" => - "Нажмите для удаления из буфера обмена", - - "This file is already added to the Clipboard." => - "Этот файл уже добавлен в буфер обмена.", - - "Copy files here" => - "Скопировать файлы сюда", - - "Move files here" => - "Переместить файлы сюда", - - "Delete files" => - "Удалить файлы", - - "Clear the Clipboard" => - "Очистить буфер обмена", - - "Are you sure you want to delete all files in the Clipboard?" => - "Вы уверены, что хотите удалить все файлы в буфере обмена?", - - "Copy {count} files" => - "Скопировать {count} файл(ов)", - - "Move {count} files" => - "Переместить {count} файл(ов)", - - "Add to Clipboard" => - "Добавить в буфер обмена", - - "New folder name:" => "Новое имя папки:", - "New file name:" => "Новое имя файла:", - - "Upload" => "Загрузить", - "Refresh" => "Обновить", - "Settings" => "Установки", - "Maximize" => "Развернуть", - "About" => "О скрипте", - "files" => "файлы", - "View:" => "Просмотр:", - "Show:" => "Показывать:", - "Order by:" => "Упорядочить по:", - "Thumbnails" => "Миниатюры", - "List" => "Список", - "Name" => "Имя", - "Size" => "Размер", - "Date" => "Дата", - "Descending" => "По убыванию", - "Uploading file..." => "Загрузка файла...", - "Loading image..." => "Загрузка изображения...", - "Loading folders..." => "Загрузка папок...", - "Loading files..." => "Загрузка файлов...", - "New Subfolder..." => "Создать папку...", - "Rename..." => "Переименовать...", - "Delete" => "Удалить", - "OK" => "OK", - "Cancel" => "Отмена", - "Select" => "Выбрать", - "Select Thumbnail" => "Выбрать миниатюру", - "View" => "Просмотр", - "Download" => "Скачать", - 'Clipboard' => "Буфер обмена", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "Невозможно переименовать папку.", - - "Cannot delete the folder." => - "Невозможно удалить папку.", - - "The files in the Clipboard are not readable." => - "Невозможно прочитать файлы в буфере обмена.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "Невозможно прочитать {count} файл(ов) в буфере обмена. Вы хотите скопировать оставшиеся?", - - "The files in the Clipboard are not movable." => - "Невозможно переместить файлы в буфере обмена.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "Невозможно переместить {count} файл(ов) в буфере обмена. Вы хотите переместить оставшиеся?", - - "The files in the Clipboard are not removable." => - "Невозможно удалить файлы в буфере обмена.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "Невозможно удалить {count} файл(ов) в буфере обмена. Вы хотите удалить оставшиеся?", - - "The selected files are not removable." => - "Невозможно удалить выбранные файлы.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "Невозможно удалить выбранный(е) {count} файл(ы). Вы хотите удалить оставшиеся?", - - "Are you sure you want to delete all selected files?" => - "Вы уверены, что хотите удалить все выбранные файлы?", - - "Failed to delete {count} files/folders." => - "Невозможно удалить {count} файлов/папок.", - - "A file or folder with that name already exists." => - "Файл или папка с таким именем уже существуют.", - - "Inexistant or inaccessible folder." => - "Несуществующая или недоступная папка.", - - "selected files" => "выбранные файлы", - "Type" => "Тип", - "Select Thumbnails" => "Выбрать миниатюры", - "Download files" => "Скачать файлы", -); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/tr.php b/include/limesurvey/admin/scripts/kcfinder/lang/tr.php deleted file mode 100644 index 42049ec5..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/tr.php +++ /dev/null @@ -1,241 +0,0 @@ - -**/ - -$lang = array( - - '_locale' => "tr_ZA.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e.%B.%Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%d/%m/%Y %H:%M", - - "You don't have permissions to upload files." => - "Dosya yüklemek için yetkiniz yok.", - - "You don't have permissions to browse server." => - "Sunucuyu gezmek için yetkiniz yok.", - - "Cannot move uploaded file to target folder." => - "Yüklenilen dosyalar hedef klasöre taşınamıyor.", - - "Unknown error." => - "Bilinmeyen hata.", - - "The uploaded file exceeds {size} bytes." => - "Gönderilen dosya boyutu, maksimum dosya boyutu limitini ({size} byte) aşıyor.", - - "The uploaded file was only partially uploaded." => - "Dosyanın sadece bir kısmı yüklendi. Yüklemeyi tekrar deneyin.", - - "No file was uploaded." => - "Dosya yüklenmedi.", - - "Missing a temporary folder." => - "Geçici dosya klasörü bulunamıyor. Klasörü kontrol edin.", - - "Failed to write file." => - "Dosya yazılamıyor. Klasör yetkilerini kontrol edin.", - - "Denied file extension." => - "Yasaklanmış dosya türü.", - - "Unknown image format/encoding." => - "Bilinmeyen resim formatı.", - - "The image is too big and/or cannot be resized." => - "Resim çok büyük ve/veya yeniden boyutlandırılamıyor.", - - "Cannot create {dir} folder." => - "{dir} klasörü oluşturulamıyor.", - - "Cannot write to upload folder." => - "Dosya yükleme klasörüne yazılamıyor. Klasör yetkisini kontrol edin.", - - "Cannot read .htaccess" => - ".htaccess dosyası okunamıyor", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "Hatalı .htaccess dosyası. Dosyaya yeniden yazılamıyor.", - - "Cannot read upload folder." => - "Dosya yükleme klasörü okunamıyor. Klasör yetkilerini kontrol edin.", - - "Cannot access or create thumbnails folder." => - "Önizleme dosyaları klasörüne erişilemiyor yada oluşturulamıyor.", - - "Cannot access or write to upload folder." => - "Dosya yükleme klasörüne ulaşılamıyor yada oluşturulamıyor.", - - "Please enter new folder name." => - "Lütfen yeni klasör adını girin.", - - "Unallowable characters in folder name." => - "Klasör adında izin verilmeyen karakter kullandınız.", - - "Folder name shouldn't begins with '.'" => - "Klasör adı '.' ile başlayamaz.", - - "Please enter new file name." => - "Lütfen yeni dosya adını girin.", - - "Unallowable characters in file name." => - "Dosya adında izin verilmeyen karakter kullandınız.", - - "File name shouldn't begins with '.'" => - "Dosya adı '.' ile başlayamaz.", - - "Are you sure you want to delete this file?" => - "Dosyayı silmek istediğinizden emin misiniz?", - - "Are you sure you want to delete this folder and all its content?" => - "Bu klasörü ve tüm içeriğini silmek istediğinizden emin misiniz?", - - "Inexistant or inaccessible folder." => - "Klasör yok yada ulaşılamıyor.", - - "Undefined MIME types." => - "Tanımsız MIME türü.", - - "Fileinfo PECL extension is missing." => - "Dosya Bilgisi PECL uzantısı eksik.", - - "Opening fileinfo database failed." => - "Dosya Bilgisi veritabanı açılırken hata oluştu.", - - "You can't upload such files." => - "Bu tür dosyaları yükleyemezsiniz.", - - "The file '{file}' does not exist." => - "'{file}' dosyası yok.", - - "Cannot read '{file}'." => - "'{file}' dosyası okunamıyor.", - - "Cannot copy '{file}'." => - "'{file}' dosyası kopyalanamıyor.", - - "Cannot move '{file}'." => - "'{file}' dosyası taşınamıyor.", - - "Cannot delete '{file}'." => - "'{file}' dosyası silinemiyor.", - - "Click to remove from the Clipboard" => - "Panodan çıkarmak için tıklayın", - - "This file is already added to the Clipboard." => - "Bu dosya zaten panoya eklenmiş.", - - "Copy files here" => - "Dosyaları Buraya Kopyala", - - "Move files here" => - "Dosyaları Buraya Taşı", - - "Delete files" => - "Dosyaları Sil", - - "Clear the Clipboard" => - "Panoyu Temizle", - - "Are you sure you want to delete all files in the Clipboard?" => - "Panodaki tüm dosyaları silmek istediğinizden emin misiniz?", - - "Copy {count} files" => - "{count} adet dosyayı kopyala", - - "Move {count} files" => - "{count} adet dosyayı taşı", - - "Add to Clipboard" => - "Panoya Ekle", - - "New folder name:" => "Yeni Klasör Adı:", - "New file name:" => "Yeni Dosya Adı:", - - "Upload" => "Yükle", - "Refresh" => "Yenile", - "Settings" => "Ayarlar", - "Maximize" => "Pencereyi Büyüt", - "About" => "Hakkında", - "files" => "dosya", - "View:" => "Görüntüleme:", - "Show:" => "Göster:", - "Order by:" => "Sıralama:", - "Thumbnails" => "Önizleme", - "List" => "Liste", - "Name" => "Adı", - "Size" => "Boyutu", - "Date" => "Tarihi", - "Descending" => "Azalarak", - "Uploading file..." => "Dosya Gönderiliyor...", - "Loading image..." => "Resim Yükleniyor...", - "Loading folders..." => "Klasörler Yükleniyor...", - "Loading files..." => "Dosyalar Yükleniyor...", - "New Subfolder..." => "Yeni Alt Klasör...", - "Rename..." => "İsim Değiştir...", - "Delete" => "Sil", - "OK" => "Tamam", - "Cancel" => "İptal", - "Select" => "Seç", - "Select Thumbnail" => "Önizleme Resmini Seç", - "View" => "Göster", - "Download" => "İndir", - "Clipboard" => "Pano", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "Klasör adı değiştirilemiyor.", - - "Non-existing directory type." => - "Geçersiz klasör türü.", - - "Cannot delete the folder." => - "Klasör silinemiyor.", - - "The files in the Clipboard are not readable." => - "Panodaki dosyalar okunamıyor.", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "Panodaki {count} adet dosya okunamıyor. Geri kalanlarını kopyalamak istiyor musunuz?", - - "The files in the Clipboard are not movable." => - "Panodaki dosyalar taşınamıyor.", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "Panodaki {count} adet dosya taşınamıyor. Geri kalanlarını taşımak istiyor musunuz?", - - "The files in the Clipboard are not removable." => - "Dosyalar panodan çıkartılamıyor.", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "{count} adet dosya panodan çıkartılamıyor. Geri kalanları silmek istiyor musunuz?", - - "The selected files are not removable." => - "Seçilen dosyalar panodan çıkartılamıyor.", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "Seçilen dosyaların {count} adedi panodan çıkartılamıyor. Geri kalanları silmek istiyor musunuz?", - - "Are you sure you want to delete all selected files?" => - "Seçilen tüm dosyaları silmek istediğinizden emin misiniz?", - - "Failed to delete {count} files/folders." => - "{count} adet dosya/klasör silinemedi.", - - "A file or folder with that name already exists." => - "Bu isimde bir klasör yada dosya zaten var.", - - "selected files" => "dosya seçildi", - "Type" => "Tür", - "Select Thumbnails" => "Önizleme Resimlerini Seç", - "Download files" => "Dosyaları İndir", -); - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lang/zh-cn.php b/include/limesurvey/admin/scripts/kcfinder/lang/zh-cn.php deleted file mode 100644 index b19563b5..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lang/zh-cn.php +++ /dev/null @@ -1,244 +0,0 @@ - "zn_CN.UTF-8", // UNIX localization code - '_charset' => "utf-8", // Browser charset - - // Date time formats. See http://www.php.net/manual/en/function.strftime.php - '_dateTimeFull' => "%A, %e %B, %Y %H:%M", - '_dateTimeMid' => "%a %e %b %Y %H:%M", - '_dateTimeSmall' => "%Y-%m-%d %H:%M", - - "You don't have permissions to upload files." => - "您没有权限上传文件。", - - "You don't have permissions to browse server." => - "您没有权限查看服务器文件。", - - "Cannot move uploaded file to target folder." => - "无法移动上传文件到指定文件夹。", - - "Unknown error." => - "发生不可预知异常。", - - "The uploaded file exceeds {size} bytes." => - "文件大小超过{size}字节。", - - "The uploaded file was only partially uploaded." => - "文件未完全上传。", - - "No file was uploaded." => - "文件未上传。", - - "Missing a temporary folder." => - "临时文件夹不存在。", - - "Failed to write file." => - "写入文件失败。", - - "Denied file extension." => - "禁止的文件扩展名。", - - "Unknown image format/encoding." => - "无法确认图片格式。", - - "The image is too big and/or cannot be resized." => - "图片大太,且(或)无法更改大小。", - - "Cannot create {dir} folder." => - "无法创建{dir}文件夹。", - - "Cannot write to upload folder." => - "无法写入上传文件夹。", - - "Cannot read .htaccess" => - "文件.htaccess无法读取。", - - "Incorrect .htaccess file. Cannot rewrite it!" => - "文件.htaccess错误,无法重写。", - - "Cannot read upload folder." => - "无法读取上传目录。", - - "Cannot access or create thumbnails folder." => - "无法访问或创建缩略图文件夹。", - - "Cannot access or write to upload folder." => - "无法访问或写入上传文件夹。", - - "Please enter new folder name." => - "请输入文件夹名。", - - "Unallowable characters in folder name." => - "文件夹名含有禁止字符。", - - "Folder name shouldn't begins with '.'" => - "文件夹名不能以点(.)为首字符。", - - "Please enter new file name." => - "请输入新文件名。", - - "Unallowable characters in file name." => - "文件名含有禁止字符。", - - "File name shouldn't begins with '.'" => - "文件名不能以点(.)为首字符。", - - "Are you sure you want to delete this file?" => - "是否确认删除该文件?", - - "Are you sure you want to delete this folder and all its content?" => - "是否确认删除该文件夹以及其子文件和子目录?", - - "Inexistant or inaccessible folder." => - "不存在或不可访问的文件夹。", - - "Undefined MIME types." => - "未定义的MIME类型。", - - "Fileinfo PECL extension is missing." => - "文件PECL属性不存在。", - - "Opening fileinfo database failed." => - "打开文件属性数据库出错。", - - "You can't upload such files." => - "你无法上传该文件。", - - "The file '{file}' does not exist." => - "文件{file}不存在。", - - "Cannot read '{file}'." => - "无法读取文件{file}。", - - "Cannot copy '{file}'." => - "无法复制文件{file}。", - - "Cannot move '{file}'." => - "无法移动文件{file}。", - - "Cannot delete '{file}'." => - "无法删除文件{file}。", - - "Click to remove from the Clipboard" => - "点击从剪贴板删除", - - "This file is already added to the Clipboard." => - "文件已复制到剪贴板。", - - "Copy files here" => - "复制到这里", - - "Move files here" => - "移动到这里", - - "Delete files" => - "删除这些文件", - - "Clear the Clipboard" => - "清除剪贴板", - - "Are you sure you want to delete all files in the Clipboard?" => - "是否确认删除所有在剪贴板的文件?", - - "Copy {count} files" => - "复制 {count} 个文件", - - "Move {count} files" => - "移动 {count} 个文件 ", - - "Add to Clipboard" => - "添加到剪贴板", - - "New folder name:" => "新文件夹名:", - "New file name:" => "新文件夹:", - - "Upload" => "上传", - "Refresh" => "刷新", - "Settings" => "设置", - "Maximize" => "最大化", - "About" => "关于", - "files" => "文件", - "View:" => "视图:", - "Show:" => "显示:", - "Order by:" => "排序:", - "Thumbnails" => "图标", - "List" => "列表", - "Name" => "文件名", - "Size" => "大小", - "Date" => "日期", - "Descending" => "降序", - "Uploading file..." => "正在上传文件...", - "Loading image..." => "正在加载图片...", - "Loading folders..." => "正在加载文件夹...", - "Loading files..." => "正在加载文件...", - "New Subfolder..." => "新建文件夹...", - "Rename..." => "重命名...", - "Delete" => "删除", - "OK" => "OK", - "Cancel" => "取消", - "Select" => "选择", - "Select Thumbnail" => "选择缩略图", - "View" => "查看", - "Download" => "下载", - "Clipboard" => "剪贴板", - - // VERSION 2 NEW LABELS - - "Cannot rename the folder." => - "无法重命名该文件夹。", - - "Non-existing directory type." => - "不存在的目录类型。", - - "Cannot delete the folder." => - "无法删除该文件夹。", - - "The files in the Clipboard are not readable." => - "剪贴板上该文件无法读取。", - - "{count} files in the Clipboard are not readable. Do you want to copy the rest?" => - "剪贴板{count}个文件无法读取。 是否复制静态文件?", - - "The files in the Clipboard are not movable." => - "剪贴板上该文件无法移动。", - - "{count} files in the Clipboard are not movable. Do you want to move the rest?" => - "剪贴板{count}个文件无法移动。 是否移动静态文件?", - - "The files in the Clipboard are not removable." => - "剪贴板上该文件无法删除。", - - "{count} files in the Clipboard are not removable. Do you want to delete the rest?" => - "剪贴板{count}个文件无法删除。 是否删除静态文件?", - - "The selected files are not removable." => - "选中文件未删除。", - - "{count} selected files are not removable. Do you want to delete the rest?" => - "选中的{count}个文件未删除。是否删除静态文件?", - - "Are you sure you want to delete all selected files?" => - "是否确认删除选中文件?", - - "Failed to delete {count} files/folders." => - "{count}个文件或文件夹无法删除。", - - "A file or folder with that name already exists." => - "文件或文件夹已存在。", - - "selected files" => "选中的文件", - "Type" => "种类", - "Select Thumbnails" => "选择缩略图", - "Download files" => "下载文件", -); - -?> diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/.htaccess b/include/limesurvey/admin/scripts/kcfinder/lib/.htaccess deleted file mode 100644 index d61b264c..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ - -Order allow,deny -Deny from all - diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/class_gd.php b/include/limesurvey/admin/scripts/kcfinder/lib/class_gd.php deleted file mode 100644 index adfc8978..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/class_gd.php +++ /dev/null @@ -1,393 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class gd { - - /** GD resource - * @var resource */ - protected $image; - - /** Image width - * @var integer */ - protected $width; - - /** Image height - * @var integer */ - protected $height; - - /** Init error - * @var bool */ - public $init_error = false; - - /** Last builded image type constant (IMAGETYPE_XXX) - * @var integer */ - public $type; - - /** Returns an array. Element 0 - GD resource. Element 1 - width. Element 2 - height. - * Returns FALSE on failure. The only one parameter $image can be an instance of this class, - * a GD resource, an array(width, height) or path to image file. - * @param mixed $image - * @return array */ - - protected function build_image($image) { - - if ($image instanceof gd) { - $width = $image->get_width(); - $height = $image->get_height(); - $image = $image->get_image(); - - } elseif (is_resource($image) && (get_resource_type($image) == "gd")) { - $width = @imagesx($image); - $height = @imagesy($image); - - } elseif (is_array($image)) { - list($key, $width) = each($image); - list($key, $height) = each($image); - $image = imagecreatetruecolor($width, $height); - - } elseif (false !== (list($width, $height, $type) = @getimagesize($image))) { - $image = - ($type == IMAGETYPE_GIF) ? @imagecreatefromgif($image) : ( - ($type == IMAGETYPE_WBMP) ? @imagecreatefromwbmp($image) : ( - ($type == IMAGETYPE_JPEG) ? @imagecreatefromjpeg($image) : ( - ($type == IMAGETYPE_JPEG2000) ? @imagecreatefromjpeg($image) : ( - ($type == IMAGETYPE_PNG) ? imagecreatefrompng($image) : ( - ($type == IMAGETYPE_XBM) ? @imagecreatefromxbm($image) : false - ))))); - - if ($type == IMAGETYPE_PNG) - imagealphablending($image, false); - } - - $return = ( - is_resource($image) && - (get_resource_type($image) == "gd") && - isset($width) && - isset($height) && - (preg_match('/^[1-9][0-9]*$/', $width) !== false) && - (preg_match('/^[1-9][0-9]*$/', $height) !== false) - ) - ? array($image, $width, $height) - : false; - - if (($return !== false) && isset($type)) - $this->type = $type; - - return $return; - } - - /** Parameter $image can be: - * 1. An instance of this class (copy instance). - * 2. A GD resource. - * 3. An array with two elements. First - width, second - height. Create a blank image. - * 4. A filename string. Get image form file. - * The non-required parameter $bigger_size is the bigger dimension (width or height) the image - * will be resized to. The other dimension (height or width) will be calculated autamaticaly - * @param mixed $image - * @param integer $bigger_size - * @return gd */ - - public function __construct($image, $bigger_size=null) { - $this->image = $this->width = $this->height = null; - - $image_details = $this->build_image($image); - - if ($image_details !== false) - list($this->image, $this->width, $this->height) = $image_details; - else - $this->init_error = true; - - if (!is_null($this->image) && - !is_null($bigger_size) && - (preg_match('/^[1-9][0-9]*$/', $bigger_size) !== false) - ) { - $image = $this->image; - list($width, $height) = $this->get_prop_size($bigger_size); - $this->image = imagecreatetruecolor($width, $height); - if ($this->type == IMAGETYPE_PNG) { - imagealphablending($this->image, false); - imagesavealpha($this->image, true); - } - $this->width = $width; - $this->height = $height; - $this->imagecopyresampled($image); - } - } - - /** Returns the GD resource - * @return resource */ - - public function get_image() { - return $this->image; - } - - /** Returns the image width - * @return integer */ - - public function get_width() { - return $this->width; - } - - /** Returns the image height - * @return integer */ - - public function get_height() { - return $this->height; - } - - /** Returns calculated proportional width from the given height - * @param integer $resized_height - * @return integer */ - - public function get_prop_width($resized_height) { - return intval(($this->width * $resized_height) / $this->height); - } - - /** Returns calculated proportional height from the given width - * @param integer $resized_width - * @return integer */ - - public function get_prop_height($resized_width) { - return intval(($this->height * $resized_width) / $this->width); - } - - /** Returns an array with calculated proportional width & height. - * The parameter $bigger_size is the bigger dimension (width or height) of calculated sizes. - * The other dimension (height or width) will be calculated autamaticaly - * @param integer $bigger_size - * @return array */ - - public function get_prop_size($bigger_size) { - - if ($this->width > $this->height) { - $width = $bigger_size; - $height = $this->get_prop_height($width); - - } elseif ($this->height > $this->width) { - $height = $bigger_size; - $width = $this->get_prop_width($height); - - } else - $width = $height = $bigger_size; - - return array($width, $height); - } - - /** Resize image. Returns TRUE on success or FALSE on failure - * @param integer $width - * @param integer $height - * @return bool */ - - public function resize($width, $height) { - if (!$width) $width = 1; - if (!$height) $height = 1; - return ( - (false !== ($img = new gd(array($width, $height)))) && - $img->imagecopyresampled($this) && - (false !== ($this->image = $img->get_image())) && - (false !== ($this->width = $img->get_width())) && - (false !== ($this->height = $img->get_height())) - ); - } - - /** Resize the given image source (GD, gd object or image file path) to fit in the own image. - * The outside ares will be cropped out. Returns TRUE on success or FALSE on failure - * @param mixed $src - * @return bool */ - - public function resize_crop($src) { - $image_details = $this->build_image($src); - - if ($image_details !== false) { - list($src, $src_width, $src_height) = $image_details; - - if (($src_width / $src_height) > ($this->width / $this->height)) { - $src_w = $this->get_prop_width($src_height); - $src_h = $src_height; - $src_x = intval(($src_width - $src_w) / 2); - $src_y = 0; - - } else { - $src_w = $src_width; - $src_h = $this->get_prop_height($src_width); - $src_x = 0; - $src_y = intval(($src_height - $src_h) / 2); - } - - return imagecopyresampled($this->image, $src, 0, 0, $src_x, $src_y, $this->width, $this->height, $src_w, $src_h); - - } else - return false; - } - - /** Resize image to fit in given resolution. Returns TRUE on success or FALSE on failure - * @param integer $width - * @param integer $height - * @return bool */ - - public function resize_fit($width, $height) { - if ((!$width && !$height) || (($width == $this->width) && ($height == $this->height))) - return true; - if (!$width || (($width / $height) > ($this->width / $this->height))) - $width = intval(($this->width * $height) / $this->height); - elseif (!$height || (($width / $height) < ($this->width / $this->height))) - $height = intval(($this->height * $width) / $this->width); - return $this->resize($width, $height); - } - - /** Neka si predstavim vyobrazhaem pravoygylnik s razmeri $width i $height. - * Izobrazhenieto shte se preorazmeri taka che to shte izliza ot tozi pravoygylnik, - * no samo po edno (x ili y) izmerenie - * @param integer $width - * @param integer $height - * @return bool */ - - public function resize_overflow($width, $height) { - - $big = (($this->width / $this->height) > ($width / $height)) - ? ($this->width * $height) / $this->height - : ($this->height * $width) / $this->width; - $big = intval($big); - - $return = ($img = new gd($this->image, $big)); - - if ($return) { - $this->image = $img->get_image(); - $this->width = $img->get_width(); - $this->height = $img->get_height(); - } - - return $return; - } - - public function gd_color() { - $args = func_get_args(); - - $expr_rgb = '/^rgb\(\s*(\d{1,3})\s*\,\s*(\d{1,3})\s*\,\s*(\d{1,3})\s*\)$/i'; - $expr_hex1 = '/^\#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i'; - $expr_hex2 = '/^\#?([0-9a-f])([0-9a-f])([0-9a-f])$/i'; - $expr_byte = '/^([01]?\d?\d|2[0-4]\d|25[0-5])$/'; - - if (!isset($args[0])) - return false; - - if (count($args[0]) == 3) { - list($r, $g, $b) = $args[0]; - - } elseif (preg_match($expr_rgb, $args[0])) { - list($r, $g, $b) = explode(" ", preg_replace($expr_rgb, "$1 $2 $3", $args[0])); - - } elseif (preg_match($expr_hex1, $args[0])) { - list($r, $g, $b) = explode(" ", preg_replace($expr_hex1, "$1 $2 $3", $args[0])); - $r = hexdec($r); - $g = hexdec($g); - $b = hexdec($b); - - } elseif (preg_match($expr_hex2, $args[0])) { - list($r, $g, $b) = explode(" ", preg_replace($expr_hex2, "$1$1 $2$2 $3$3", $args[0])); - $r = hexdec($r); - $g = hexdec($g); - $b = hexdec($b); - - } elseif ((count($args) == 3) && - preg_match($expr_byte, $args[0]) && - preg_match($expr_byte, $args[1]) && - preg_match($expr_byte, $args[2]) - ) { - list($r, $g, $b) = $args; - - } else - return false; - - return imagecolorallocate($this->image, $r, $g, $b); - } - - public function fill_color($color) { - return $this->imagefilledrectangle(0, 0, $this->width - 1, $this->height - 1, $color); - } - - -/* G D M E T H O D S */ - - public function imagecopy( - $src, - $dst_x=0, $dst_y=0, - $src_x=0, $src_y=0, - $dst_w=null, $dst_h=null, - $src_w=null, $src_h=null - ) { - $image_details = $this->build_image($src); - - if ($image_details !== false) { - list($src, $src_width, $src_height) = $image_details; - - if (is_null($dst_w)) $dst_w = $this->width - $dst_x; - if (is_null($dst_h)) $dst_h = $this->height - $dst_y; - if (is_null($src_w)) $src_w = $src_width - $src_x; - if (is_null($src_h)) $src_h = $src_height - $src_y; - return imagecopy($this->image, $src, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h); - - } else - return false; - } - - public function imagecopyresampled( - $src, - $dst_x=0, $dst_y=0, - $src_x=0, $src_y=0, - $dst_w=null, $dst_h=null, - $src_w=null, $src_h=null - ) { - $image_details = $this->build_image($src); - - if ($image_details !== false) { - list($src, $src_width, $src_height) = $image_details; - - if (is_null($dst_w)) $dst_w = $this->width - $dst_x; - if (is_null($dst_h)) $dst_h = $this->height - $dst_y; - if (is_null($src_w)) $src_w = $src_width - $src_x; - if (is_null($src_h)) $src_h = $src_height - $src_y; - return imagecopyresampled($this->image, $src, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); - - } else - return false; - } - - public function imagefilledrectangle($x1, $y1, $x2, $y2, $color) { - $color = $this->gd_color($color); - if ($color === false) return false; - return imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $color); - } - - public function imagepng($filename=null, $quality=null, $filters=null) { - if (is_null($filename) && !headers_sent()) - header("Content-Type: image/png"); - @imagesavealpha($this->image, true); - return imagepng($this->image, $filename, $quality, $filters); - } - - public function imagejpeg($filename=null, $quality=75) { - if (is_null($filename) && !headers_sent()) - header("Content-Type: image/jpeg"); - return imagejpeg($this->image, $filename, $quality); - } - - public function imagegif($filename=null) { - if (is_null($filename) && !headers_sent()) - header("Content-Type: image/gif"); - return imagegif($this->image, $filename); - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/class_input.php b/include/limesurvey/admin/scripts/kcfinder/lib/class_input.php deleted file mode 100644 index d0545345..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/class_input.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class input { - - /** Filtered $_GET array - * @var array */ - public $get; - - /** Filtered $_POST array - * @var array */ - public $post; - - /** Filtered $_COOKIE array - * @var array */ - public $cookie; - - /** magic_quetes_gpc ini setting flag - * @var bool */ - protected $magic_quotes_gpc; - - /** magic_quetes_sybase ini setting flag - * @var bool */ - protected $magic_quotes_sybase; - - public function __construct() { - $this->magic_quotes_gpc = function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc(); - $this->magic_quotes_sybase = ini_get('magic_quotes_sybase'); - $this->magic_quotes_sybase = $this->magic_quotes_sybase - ? !in_array(strtolower(trim($this->magic_quotes_sybase)), - array('off', 'no', 'false')) - : false; - $_GET = $this->filter($_GET); - $_POST = $this->filter($_POST); - $_COOKIE = $this->filter($_COOKIE); - $this->get = &$_GET; - $this->post = &$_POST; - $this->cookie = &$_COOKIE; - } - - /** Magic method to get non-public properties like public. - * @param string $property - * @return mixed */ - - public function __get($property) { - return property_exists($this, $property) ? $this->$property : null; - } - - /** Filter the given subject. If magic_quotes_gpc and/or magic_quotes_sybase - * ini settings are turned on, the method will remove backslashes from some - * escaped characters. If the subject is an array, elements with non- - * alphanumeric keys will be removed - * @param mixed $subject - * @return mixed */ - - public function filter($subject) { - if ($this->magic_quotes_gpc) { - if (is_array($subject)) { - foreach ($subject as $key => $val) - if (!preg_match('/^[a-z\d_]+$/si', $key)) - unset($subject[$key]); - else - $subject[$key] = $this->filter($val); - } elseif (is_scalar($subject)) - $subject = $this->magic_quotes_sybase - ? str_replace("\\'", "'", $subject) - : stripslashes($subject); - - } - - return $subject; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/class_zipFolder.php b/include/limesurvey/admin/scripts/kcfinder/lib/class_zipFolder.php deleted file mode 100644 index 8cf02d94..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/class_zipFolder.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class zipFolder { - protected $zip; - protected $root; - protected $ignored; - - function __construct($file, $folder, $ignored=null) { - $this->zip = new ZipArchive(); - - $this->ignored = is_array($ignored) - ? $ignored - : ($ignored ? array($ignored) : array()); - - if ($this->zip->open($file, ZIPARCHIVE::CREATE) !== TRUE) - throw new Exception("cannot open <$file>\n"); - - $folder = rtrim($folder, '/'); - - if (strstr($folder, '/')) { - $this->root = substr($folder, 0, strrpos($folder, '/') + 1); - $folder = substr($folder, strrpos($folder, '/') + 1); - } - - $this->zip($folder); - $this->zip->close(); - } - - function zip($folder, $parent=null) { - $full_path = "{$this->root}$parent$folder"; - $zip_path = "$parent$folder"; - $this->zip->addEmptyDir($zip_path); - $dir = new DirectoryIterator($full_path); - foreach ($dir as $file) - if (!$file->isDot()) { - $filename = $file->getFilename(); - if (!in_array($filename, $this->ignored)) { - if ($file->isDir()) - $this->zip($filename, "$zip_path/"); - else - $this->zip->addFile("$full_path/$filename", "$zip_path/$filename"); - } - } - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/helper_dir.php b/include/limesurvey/admin/scripts/kcfinder/lib/helper_dir.php deleted file mode 100644 index baf85833..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/helper_dir.php +++ /dev/null @@ -1,161 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class dir { - - /** Checks if the given directory is really writable. The standard PHP - * function is_writable() does not work properly on Windows servers - * @param string $dir - * @return bool */ - - static function isWritable($dir) { - $dir = path::normalize($dir); - if (!is_dir($dir)) - return false; - $i = 0; - do { - $file = "$dir/is_writable_" . md5($i++); - } while (file_exists($file)); - if (!@touch($file)) - return false; - unlink($file); - return true; - } - - /** Recursively delete the given directory. Returns TRUE on success. - * If $firstFailExit parameter is true (default), the method returns the - * path to the first failed file or directory which cannot be deleted. - * If $firstFailExit is false, the method returns an array with failed - * files and directories which cannot be deleted. The third parameter - * $failed is used for internal use only. - * @param string $dir - * @param bool $firstFailExit - * @param array $failed - * @return mixed */ - - static function prune($dir, $firstFailExit=true, array $failed=null) { - if ($failed === null) $failed = array(); - $files = self::content($dir); - if ($files === false) { - if ($firstFailExit) - return $dir; - $failed[] = $dir; - return $failed; - } - - foreach ($files as $file) { - if (is_dir($file)) { - $failed_in = self::prune($file, $firstFailExit, $failed); - if ($failed_in !== true) { - if ($firstFailExit) - return $failed_in; - if (is_array($failed_in)) - $failed = array_merge($failed, $failed_in); - else - $failed[] = $failed_in; - } - } elseif (!@unlink($file)) { - if ($firstFailExit) - return $file; - $failed[] = $file; - } - } - - if (!@rmdir($dir)) { - if ($firstFailExit) - return $dir; - $failed[] = $dir; - } - - return count($failed) ? $failed : true; - } - - /** Get the content of the given directory. Returns an array with filenames - * or FALSE on failure - * @param string $dir - * @param array $options - * @return mixed */ - - static function content($dir, array $options=null) { - - $defaultOptions = array( - 'types' => "all", // Allowed: "all" or possible return values - // of filetype(), or an array with them - 'addPath' => true, // Whether to add directory path to filenames - 'pattern' => '/./', // Regular expression pattern for filename - 'followLinks' => true - ); - - if (!is_dir($dir) || !is_readable($dir)) - return false; - - if (strtoupper(substr(PHP_OS, 0, 3)) == "WIN") - $dir = str_replace("\\", "/", $dir); - $dir = rtrim($dir, "/"); - - $dh = @opendir($dir); - if ($dh === false) - return false; - - if ($options === null) - $options = $defaultOptions; - - foreach ($defaultOptions as $key => $val) - if (!isset($options[$key])) - $options[$key] = $val; - - $files = array(); - while (($file = @readdir($dh)) !== false) { - $type = filetype("$dir/$file"); - - if ($options['followLinks'] && ($type === "link")) { - $lfile = "$dir/$file"; - do { - $ldir = dirname($lfile); - $lfile = @readlink($lfile); - if (substr($lfile, 0, 1) != "/") - $lfile = "$ldir/$lfile"; - $type = filetype($lfile); - } while ($type == "link"); - } - - if ((($type === "dir") && (($file == ".") || ($file == ".."))) || - !preg_match($options['pattern'], $file) - ) - continue; - - if (($options['types'] === "all") || ($type === $options['types']) || - ((is_array($options['types'])) && in_array($type, $options['types'])) - ) - $files[] = $options['addPath'] ? "$dir/$file" : $file; - } - closedir($dh); - usort($files, "dir::fileSort"); - return $files; - } - - static function fileSort($a, $b) { - if (function_exists("mb_strtolower")) { - $a = mb_strtolower($a); - $b = mb_strtolower($b); - } else { - $a = strtolower($a); - $b = strtolower($b); - } - if ($a == $b) return 0; - return ($a < $b) ? -1 : 1; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/helper_file.php b/include/limesurvey/admin/scripts/kcfinder/lib/helper_file.php deleted file mode 100644 index 7facb100..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/helper_file.php +++ /dev/null @@ -1,202 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class file { - - static $MIME = array( - 'ai' => 'application/postscript', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'avi' => 'video/x-msvideo', - 'bin' => 'application/macbinary', - 'bmp' => 'image/bmp', - 'cpt' => 'application/mac-compactpro', - 'css' => 'text/css', - 'csv' => 'text/x-comma-separated-values', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'doc' => 'application/msword', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dvi' => 'application/x-dvi', - 'dxr' => 'application/x-director', - 'eml' => 'message/rfc822', - 'eps' => 'application/postscript', - 'flv' => 'video/x-flv', - 'gif' => 'image/gif', - 'gtar' => 'application/x-gtar', - 'gz' => 'application/x-gzip', - 'hqx' => 'application/mac-binhex40', - 'htm' => 'text/html', - 'html' => 'text/html', - 'jpe' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'js' => 'application/x-javascript', - 'log' => 'text/plain', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mif' => 'application/vnd.mif', - 'mov' => 'video/quicktime', - 'movie' => 'video/x-sgi-movie', - 'mp2' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mpe' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpga' => 'audio/mpeg', - 'oda' => 'application/oda', - 'pdf' => 'application/pdf', - 'php' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'php4' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'phtml' => 'application/x-httpd-php', - 'png' => 'image/png', - 'ppt' => 'application/powerpoint', - 'ps' => 'application/postscript', - 'psd' => 'application/x-photoshop', - 'qt' => 'video/quicktime', - 'ra' => 'audio/x-realaudio', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'rtf' => 'text/rtf', - 'rtx' => 'text/richtext', - 'rv' => 'video/vnd.rn-realvideo', - 'shtml' => 'text/html', - 'sit' => 'application/x-stuffit', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'swf' => 'application/x-shockwave-flash', - 'tar' => 'application/x-tar', - 'tgz' => 'application/x-tar', - 'text' => 'text/plain', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'txt' => 'text/plain', - 'wav' => 'audio/x-wav', - 'wbxml' => 'application/wbxml', - 'wmlc' => 'application/wmlc', - 'word' => 'application/msword', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'xl' => 'application/excel', - 'xls' => 'application/excel', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xml' => 'text/xml', - 'xsl' => 'text/xml', - 'zip' => 'application/x-zip' - ); - - /** Checks if the given file is really writable. The standard PHP function - * is_writable() does not work properly on Windows servers. - * @param string $dir - * @return bool */ - - static function isWritable($filename) { - $filename = path::normalize($filename); - if (!is_file($filename) || (false === ($fp = @fopen($filename, 'a+')))) - return false; - fclose($fp); - return true; - } - - /** Get the extension from filename - * @param string $file - * @param bool $toLower - * @return string */ - - static function getExtension($filename, $toLower=true) { - return preg_match('/^.*\.([^\.]*)$/s', $filename, $patt) - ? ($toLower ? strtolower($patt[1]) : $patt[1]) : ""; - } - - /** Get MIME type of the given filename. If Fileinfo PHP extension is - * available the MIME type will be fetched by the file's content. The - * second parameter is optional and defines the magic file path. If you - * skip it, the default one will be loaded. - * If Fileinfo PHP extension is not available the MIME type will be fetched - * by filename extension regarding $MIME property. If the file extension - * does not exist there, returned type will be application/octet-stream - * @param string $filename - * @param string $magic - * @return string */ - - static function getMimeType($filename, $magic=null) { - if (class_exists("finfo")) { - $finfo = ($magic === null) - ? new finfo(FILEINFO_MIME) - : new finfo(FILEINFO_MIME, $magic); - if ($finfo) { - $mime = $finfo->file($filename); - $mime = substr($mime, 0, strrpos($mime, ";")); - return $mime; - } - } - $ext = self::getExtension($filename, true); - return isset(self::$MIME[$ext]) ? self::$MIME[$ext] : "application/octet-stream"; - } - - /** Get inexistant filename based on the given filename. If you skip $dir - * parameter the directory will be fetched from $filename and returned - * value will be full filename path. The third parameter is optional and - * defines the template, the filename will be renamed to. Default template - * is {name}({sufix}){ext}. Examples: - * - * file::getInexistantFilename("/my/directory/myfile.txt"); - * If myfile.txt does not exist - returns the same path to the file - * otherwise returns "/my/directory/myfile(1).txt" - * - * file::getInexistantFilename("myfile.txt", "/my/directory"); - * returns "myfile.txt" or "myfile(1).txt" or "myfile(2).txt" etc... - * - * file::getInexistantFilename("myfile.txt", "/dir", "{name}[{sufix}]{ext}"); - * returns "myfile.txt" or "myfile[1].txt" or "myfile[2].txt" etc... - * - * @param string $filename - * @param string $dir - * @param string $tpl - * @return string */ - - static function getInexistantFilename($filename, $dir=null, $tpl=null) { - if ($tpl === null) $tpl = "{name}({sufix}){ext}"; - $fullPath = ($dir === null); - if ($fullPath) - $dir = path::normalize(dirname($filename)); - else { - $fdir = dirname($filename); - $dir = strlen($fdir) - ? path::normalize("$dir/$fdir") - : path::normalize($dir); - } - $filename = basename($filename); - $ext = self::getExtension($filename, false); - $name = strlen($ext) ? substr($filename, 0, -strlen($ext) - 1) : $filename; - $tpl = str_replace('{name}', $name, $tpl); - $tpl = str_replace('{ext}', (strlen($ext) ? ".$ext" : ""), $tpl); - $i = 1; $file = "$dir/$filename"; - while (file_exists($file)) - $file = "$dir/" . str_replace('{sufix}', $i++, $tpl); - - return $fullPath - ? $file - : (strlen($fdir) - ? "$fdir/" . basename($file) - : basename($file)); - } - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/helper_httpCache.php b/include/limesurvey/admin/scripts/kcfinder/lib/helper_httpCache.php deleted file mode 100644 index 93f76bc6..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/helper_httpCache.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class httpCache { - const DEFAULT_TYPE = "text/html"; - const DEFAULT_EXPIRE = 604800; // in seconds - - /** Cache a file. The $type parameter might define the MIME type of the file - * or path to magic file to autodetect the MIME type. If you skip $type - * parameter the method will try with the default magic file. Autodetection - * of MIME type requires Fileinfo PHP extension used in file::getMimeType() - * @param string $file - * @param string $type - * @param integer $expire - * @param array $headers */ - - static function file($file, $type=null, $expire=null, array $headers=null) { - $mtime = @filemtime($file); - if ($mtime !== false) self::checkMTime($mtime); - - if ($type === null) { - $magic = ((substr($type, 0, 1) == "/") || preg_match('/^[a-z]\:/i', $type)) - ? $type : null; - $type = file::getMimeType($file, $magic); - if (!$type) $type = null; - } - - self::content(@file_get_contents($file), $mtime, $type, $expire, $headers, false); - } - - /** Cache the given $content with $mtime modification time. - * @param binary $content - * @param integer $mtime - * @param string $type - * @param integer $expire - * @param array $headers - * @param bool $checkMTime */ - - static function content($content, $mtime, $type=null, $expire=null, array $headers=null, $checkMTime=true) { - if ($checkMTime) self::checkMTime($mtime); - if ($type === null) $type = self::DEFAULT_TYPE; - if ($expire === null) $expire = self::DEFAULT_EXPIRE; - $size = strlen($content); - $expires = gmdate("D, d M Y H:i:s", time() + $expire) . " GMT"; - header("Content-Type: $type"); - header("Expires: $expires"); - header("Cache-Control: max-age=$expire"); - header("Pragma: !invalid"); - header("Content-Length: $size"); - if ($headers !== null) foreach ($headers as $header) header($header); - echo $content; - } - - /** Check if given modification time is newer than client-side one. If not, - * the method will tell the client to get the content from its own cache. - * Afterwards the script process will be terminated. This feature requires - * the PHP to be configured as Apache module. - * @param integer $mtime */ - - static function checkMTime($mtime) { - header("Last-Modified: " . gmdate("D, d M Y H:i:s", $mtime) . " GMT"); - - $headers = function_exists("getallheaders") - ? getallheaders() - : (function_exists("apache_request_headers") - ? apache_request_headers() - : false); - - if (is_array($headers) && isset($headers['If-Modified-Since'])) { - $client_mtime = explode(';', $headers['If-Modified-Since']); - $client_mtime = strtotime($client_mtime[0]); - if ($client_mtime >= $mtime) { - header('HTTP/1.1 304 Not Modified'); - die; - } - } - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/helper_path.php b/include/limesurvey/admin/scripts/kcfinder/lib/helper_path.php deleted file mode 100644 index 851b2c13..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/helper_path.php +++ /dev/null @@ -1,144 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class path { - - /** Get the absolute URL path of the given one. Returns FALSE if the URL - * is not valid or the current directory cannot be resolved (getcwd()) - * @param string $path - * @return string */ - - static function rel2abs_url($path) { - if (substr($path, 0, 1) == "/") return $path; - $dir = @getcwd(); - - if (!isset($_SERVER['DOCUMENT_ROOT']) || ($dir === false)) - return false; - - $dir = self::normalize($dir); - $doc_root = self::normalize($_SERVER['DOCUMENT_ROOT']); - - if (substr($dir, 0, strlen($doc_root)) != $doc_root) - return false; - - $return = self::normalize(substr($dir, strlen($doc_root)) . "/$path"); - if (substr($return, 0, 1) !== "/") - $return = "/$return"; - - return $return; - } - - /** Resolve full filesystem path of given URL. Returns FALSE if the URL - * cannot be resolved - * @param string $url - * @return string */ - - static function url2fullPath($url) { - $url = self::normalize($url); - - $uri = isset($_SERVER['SCRIPT_NAME']) - ? $_SERVER['SCRIPT_NAME'] : (isset($_SERVER['PHP_SELF']) - ? $_SERVER['PHP_SELF'] - : false); - - $uri = self::normalize($uri); - - if (substr($url, 0, 1) !== "/") { - if ($uri === false) return false; - $url = dirname($uri) . "/$url"; - } - - if (isset($_SERVER['DOCUMENT_ROOT'])) { - return self::normalize($_SERVER['DOCUMENT_ROOT'] . "/$url"); - - } else { - if ($uri === false) return false; - - if (isset($_SERVER['SCRIPT_FILENAME'])) { - $scr_filename = self::normalize($_SERVER['SCRIPT_FILENAME']); - return self::normalize(substr($scr_filename, 0, -strlen($uri)) . "/$url"); - } - - $count = count(explode('/', $uri)) - 1; - for ($i = 0, $chdir = ""; $i < $count; $i++) - $chdir .= "../"; - $chdir = self::normalize($chdir); - - $dir = getcwd(); - if (($dir === false) || !@chdir($chdir)) - return false; - $rdir = getcwd(); - chdir($dir); - return ($rdir !== false) ? self::normalize($rdir . "/$url") : false; - } - } - - /** Normalize the given path. On Windows servers backslash will be replaced - * with slash. Remobes unnecessary doble slashes and double dots. Removes - * last slash if it exists. Examples: - * path::normalize("C:\\any\\path\\") returns "C:/any/path" - * path::normalize("/your/path/..//home/") returns "/your/home" - * @param string $path - * @return string */ - - static function normalize($path) { - if (strtoupper(substr(PHP_OS, 0, 3)) == "WIN") { - $path = preg_replace('/([^\\\])\\\([^\\\])/', "$1/$2", $path); - if (substr($path, -1) == "\\") $path = substr($path, 0, -1); - if (substr($path, 0, 1) == "\\") $path = "/" . substr($path, 1); - } - - $path = preg_replace('/\/+/s', "/", $path); - - $path = "/$path"; - if (substr($path, -1) != "/") - $path .= "/"; - - $expr = '/\/([^\/]{1}|[^\.\/]{2}|[^\/]{3,})\/\.\.\//s'; - while (preg_match($expr, $path)) - $path = preg_replace($expr, "/", $path); - - $path = substr($path, 0, -1); - $path = substr($path, 1); - return $path; - } - - /** Encode URL Path - * @param string $path - * @return string */ - - static function urlPathEncode($path) { - $path = self::normalize($path); - $encoded = ""; - foreach (explode("/", $path) as $dir) - $encoded .= rawurlencode($dir) . "/"; - $encoded = substr($encoded, 0, -1); - return $encoded; - } - - /** Decode URL Path - * @param string $path - * @return string */ - - static function urlPathDecode($path) { - $path = self::normalize($path); - $decoded = ""; - foreach (explode("/", $path) as $dir) - $decoded .= rawurldecode($dir) . "/"; - $decoded = substr($decoded, 0, -1); - return $decoded; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/lib/helper_text.php b/include/limesurvey/admin/scripts/kcfinder/lib/helper_text.php deleted file mode 100644 index 798d9483..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/lib/helper_text.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -class text { - - /** Replace repeated white spaces to single space - * @param string $string - * @return string */ - - static function clearWhitespaces($string) { - return trim(preg_replace('/\s+/s', " ", $string)); - } - - /** Normalize the string for HTML attribute value - * @param string $string - * @return string */ - - static function htmlValue($string) { - return str_replace('"', """, $string); - } - - /** Normalize the string for JavaScript string value - * @param string $string - * @return string */ - - static function jsValue($string) { - return preg_replace('/\r?\n/', "\\n", str_replace('"', "\\\"", str_replace("'", "\\'", $string))); - } - - /** Normalize the string for XML tag content data - * @param string $string - * @param bool $cdata */ - - static function xmlData($string, $cdata=false) { - $string = str_replace("]]>", "]]]]>", $string); - if (!$cdata) - $string = ""; - return $string; - } - - /** Returns compressed content of given CSS code - * @param string $code - * @return string */ - - static function compressCSS($code) { - $code = self::clearWhitespaces($code); - $code = preg_replace('/ ?\{ ?/', "{", $code); - $code = preg_replace('/ ?\} ?/', "}", $code); - $code = preg_replace('/ ?\; ?/', ";", $code); - $code = preg_replace('/ ?\> ?/', ">", $code); - $code = preg_replace('/ ?\, ?/', ",", $code); - $code = preg_replace('/ ?\: ?/', ":", $code); - $code = str_replace(";}", "}", $code); - return $code; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/about.txt b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/about.txt deleted file mode 100644 index 4df37220..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/about.txt +++ /dev/null @@ -1,11 +0,0 @@ -This folder contains files for designing Oxygen visual theme for KCFinder -Icons and color schemes are taken from default KDE4 visual theme -http://www.kde.org - -Theme Details: - -Project: KCFinder - http://kcfinder.sunhater.com -Version: 2.21 -Author: Pavel Tzonkov -Licenses: GPLv2 - http://www.opensource.org/licenses/gpl-2.0.php - LGPLv2 - http://www.opensource.org/licenses/lgpl-2.1.php diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/..png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/..png deleted file mode 100644 index aaff4841..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/..png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/.image.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/.image.png deleted file mode 100644 index bbe1180e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/.image.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/avi.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/avi.png deleted file mode 100644 index 28f9700f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/avi.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bat.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bat.png deleted file mode 100644 index eaa3dc93..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bat.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bmp.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bmp.png deleted file mode 100644 index bbe1180e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bmp.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bz2.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bz2.png deleted file mode 100644 index 84eaa19a..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/bz2.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ccd.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ccd.png deleted file mode 100644 index aa9f4a20..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ccd.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/cgi.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/cgi.png deleted file mode 100644 index eaa3dc93..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/cgi.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/com.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/com.png deleted file mode 100644 index 427a328b..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/com.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/csh.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/csh.png deleted file mode 100644 index eaa3dc93..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/csh.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/cue.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/cue.png deleted file mode 100644 index aa9f4a20..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/cue.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/deb.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/deb.png deleted file mode 100644 index 14ce82ff..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/deb.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/dll.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/dll.png deleted file mode 100644 index 9e03a48d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/dll.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/doc.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/doc.png deleted file mode 100644 index b544dcc8..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/doc.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/docx.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/docx.png deleted file mode 100644 index b544dcc8..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/docx.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/exe.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/exe.png deleted file mode 100644 index 427a328b..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/exe.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/fla.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/fla.png deleted file mode 100644 index 5e7c751b..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/fla.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/flv.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/flv.png deleted file mode 100644 index 28f9700f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/flv.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/fon.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/fon.png deleted file mode 100644 index 3815dac6..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/fon.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/gif.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/gif.png deleted file mode 100644 index bbe1180e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/gif.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/gz.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/gz.png deleted file mode 100644 index 84eaa19a..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/gz.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/htm.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/htm.png deleted file mode 100644 index 4995b6b2..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/htm.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/html.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/html.png deleted file mode 100644 index 4995b6b2..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/html.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ini.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ini.png deleted file mode 100644 index 02489bd8..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ini.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/iso.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/iso.png deleted file mode 100644 index aa9f4a20..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/iso.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jar.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jar.png deleted file mode 100644 index cef54cd1..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jar.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/java.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/java.png deleted file mode 100644 index 351b5db9..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/java.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jpeg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jpeg.png deleted file mode 100644 index bbe1180e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jpeg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jpg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jpg.png deleted file mode 100644 index bbe1180e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/jpg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/js.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/js.png deleted file mode 100644 index fcb1f8f4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/js.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mds.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mds.png deleted file mode 100644 index aa9f4a20..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mds.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mdx.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mdx.png deleted file mode 100644 index aa9f4a20..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mdx.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mid.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mid.png deleted file mode 100644 index 6187bc50..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mid.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/midi.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/midi.png deleted file mode 100644 index 6187bc50..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/midi.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mkv.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mkv.png deleted file mode 100644 index 28f9700f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mkv.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mov.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mov.png deleted file mode 100644 index 28f9700f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mov.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mp3.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mp3.png deleted file mode 100644 index 5f4c2065..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mp3.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mpeg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mpeg.png deleted file mode 100644 index 28f9700f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mpeg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mpg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mpg.png deleted file mode 100644 index 28f9700f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/mpg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/nfo.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/nfo.png deleted file mode 100644 index 02489bd8..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/nfo.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/nrg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/nrg.png deleted file mode 100644 index aa9f4a20..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/nrg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ogg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ogg.png deleted file mode 100644 index 5f4c2065..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ogg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pdf.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pdf.png deleted file mode 100644 index 49cf5e33..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pdf.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/php.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/php.png deleted file mode 100644 index 588bef89..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/php.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/phps.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/phps.png deleted file mode 100644 index 588bef89..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/phps.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pl.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pl.png deleted file mode 100644 index d3468a56..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pl.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pm.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pm.png deleted file mode 100644 index d3468a56..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pm.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/png.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/png.png deleted file mode 100644 index bbe1180e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/png.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ppt.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ppt.png deleted file mode 100644 index ae13c8a4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ppt.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pptx.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pptx.png deleted file mode 100644 index ae13c8a4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/pptx.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/qt.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/qt.png deleted file mode 100644 index 28f9700f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/qt.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/rpm.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/rpm.png deleted file mode 100644 index 0708eef4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/rpm.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/rtf.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/rtf.png deleted file mode 100644 index 02489bd8..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/rtf.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/sh.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/sh.png deleted file mode 100644 index eaa3dc93..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/sh.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/srt.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/srt.png deleted file mode 100644 index 02489bd8..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/srt.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/sub.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/sub.png deleted file mode 100644 index 02489bd8..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/sub.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/swf.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/swf.png deleted file mode 100644 index 45a8208d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/swf.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tgz.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tgz.png deleted file mode 100644 index d7e7b5b1..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tgz.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tif.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tif.png deleted file mode 100644 index bbe1180e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tif.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tiff.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tiff.png deleted file mode 100644 index bbe1180e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/tiff.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/torrent.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/torrent.png deleted file mode 100644 index 0bffac4b..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/torrent.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ttf.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ttf.png deleted file mode 100644 index 4f43e196..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/ttf.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/txt.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/txt.png deleted file mode 100644 index 02489bd8..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/txt.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/wav.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/wav.png deleted file mode 100644 index 5f4c2065..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/wav.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/wma.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/wma.png deleted file mode 100644 index 5f4c2065..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/wma.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/xls.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/xls.png deleted file mode 100644 index ddf069fe..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/xls.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/xlsx.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/xlsx.png deleted file mode 100644 index ddf069fe..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/xlsx.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/zip.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/zip.png deleted file mode 100644 index 84eaa19a..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/big/zip.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/..png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/..png deleted file mode 100644 index 67f4c5f4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/..png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/.image.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/.image.png deleted file mode 100644 index 638dee69..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/.image.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/avi.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/avi.png deleted file mode 100644 index bbff051d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/avi.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bat.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bat.png deleted file mode 100644 index 7b87884f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bat.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bmp.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bmp.png deleted file mode 100644 index 638dee69..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bmp.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bz2.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bz2.png deleted file mode 100644 index 305f01b4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/bz2.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ccd.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ccd.png deleted file mode 100644 index 4e8d91d6..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ccd.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/cgi.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/cgi.png deleted file mode 100644 index 7b87884f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/cgi.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/com.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/com.png deleted file mode 100644 index 2246f308..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/com.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/csh.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/csh.png deleted file mode 100644 index 7b87884f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/csh.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/cue.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/cue.png deleted file mode 100644 index 4e8d91d6..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/cue.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/deb.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/deb.png deleted file mode 100644 index 305f01b4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/deb.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/dll.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/dll.png deleted file mode 100644 index b1a2f1c4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/dll.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/doc.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/doc.png deleted file mode 100644 index 069059db..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/doc.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/docx.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/docx.png deleted file mode 100644 index 069059db..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/docx.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/exe.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/exe.png deleted file mode 100644 index 2246f308..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/exe.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/fla.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/fla.png deleted file mode 100644 index c50ec521..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/fla.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/flv.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/flv.png deleted file mode 100644 index bbff051d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/flv.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/fon.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/fon.png deleted file mode 100644 index 2303efed..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/fon.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/gif.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/gif.png deleted file mode 100644 index 638dee69..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/gif.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/gz.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/gz.png deleted file mode 100644 index 305f01b4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/gz.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/htm.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/htm.png deleted file mode 100644 index cc2f1bf9..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/htm.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/html.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/html.png deleted file mode 100644 index cc2f1bf9..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/html.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ini.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ini.png deleted file mode 100644 index d904593c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ini.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/iso.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/iso.png deleted file mode 100644 index 4e8d91d6..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/iso.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jar.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jar.png deleted file mode 100644 index 305f01b4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jar.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/java.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/java.png deleted file mode 100644 index 58fa8d0d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/java.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jpeg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jpeg.png deleted file mode 100644 index 638dee69..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jpeg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jpg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jpg.png deleted file mode 100644 index 638dee69..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/jpg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/js.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/js.png deleted file mode 100644 index db79975b..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/js.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mds.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mds.png deleted file mode 100644 index 4e8d91d6..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mds.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mdx.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mdx.png deleted file mode 100644 index 4e8d91d6..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mdx.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mid.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mid.png deleted file mode 100644 index e1ed4bd2..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mid.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/midi.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/midi.png deleted file mode 100644 index e1ed4bd2..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/midi.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mkv.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mkv.png deleted file mode 100644 index bbff051d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mkv.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mov.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mov.png deleted file mode 100644 index bbff051d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mov.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mp3.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mp3.png deleted file mode 100644 index 017b00da..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mp3.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mpeg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mpeg.png deleted file mode 100644 index bbff051d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mpeg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mpg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mpg.png deleted file mode 100644 index bbff051d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/mpg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/nfo.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/nfo.png deleted file mode 100644 index d904593c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/nfo.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/nrg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/nrg.png deleted file mode 100644 index 4e8d91d6..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/nrg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ogg.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ogg.png deleted file mode 100644 index 017b00da..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ogg.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pdf.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pdf.png deleted file mode 100644 index 9498f0ff..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pdf.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/php.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/php.png deleted file mode 100644 index d73934be..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/php.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/phps.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/phps.png deleted file mode 100644 index d73934be..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/phps.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pl.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pl.png deleted file mode 100644 index d904593c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pl.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pm.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pm.png deleted file mode 100644 index d904593c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pm.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/png.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/png.png deleted file mode 100644 index 638dee69..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/png.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ppt.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ppt.png deleted file mode 100644 index bdccbb63..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ppt.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pptx.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pptx.png deleted file mode 100644 index bdccbb63..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/pptx.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/qt.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/qt.png deleted file mode 100644 index bbff051d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/qt.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/rpm.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/rpm.png deleted file mode 100644 index 305f01b4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/rpm.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/rtf.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/rtf.png deleted file mode 100644 index d904593c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/rtf.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/sh.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/sh.png deleted file mode 100644 index 7b87884f..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/sh.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/srt.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/srt.png deleted file mode 100644 index d904593c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/srt.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/sub.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/sub.png deleted file mode 100644 index d904593c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/sub.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/swf.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/swf.png deleted file mode 100644 index 80e05a3d..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/swf.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tgz.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tgz.png deleted file mode 100644 index 305f01b4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tgz.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tif.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tif.png deleted file mode 100644 index 638dee69..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tif.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tiff.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tiff.png deleted file mode 100644 index 638dee69..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/tiff.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/torrent.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/torrent.png deleted file mode 100644 index 55c04aa9..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/torrent.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ttf.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ttf.png deleted file mode 100644 index ed3e0f64..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/ttf.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/txt.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/txt.png deleted file mode 100644 index d904593c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/txt.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/wav.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/wav.png deleted file mode 100644 index 017b00da..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/wav.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/wma.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/wma.png deleted file mode 100644 index 017b00da..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/wma.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/xls.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/xls.png deleted file mode 100644 index 573d1414..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/xls.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/xlsx.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/xlsx.png deleted file mode 100644 index 573d1414..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/xlsx.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/zip.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/zip.png deleted file mode 100644 index 305f01b4..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/files/small/zip.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/about.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/about.png deleted file mode 100644 index e1eb7972..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/about.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard-add.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard-add.png deleted file mode 100644 index 4654f2bb..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard-add.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard-clear.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard-clear.png deleted file mode 100644 index e4003606..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard-clear.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard.png deleted file mode 100644 index 9d3a8fa9..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/clipboard.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/copy.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/copy.png deleted file mode 100644 index 5cdeb5fc..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/copy.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/delete.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/delete.png deleted file mode 100644 index d04a554e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/delete.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/download.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/download.png deleted file mode 100644 index d0746f66..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/download.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/folder-new.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/folder-new.png deleted file mode 100644 index 955efbf9..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/folder-new.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/maximize.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/maximize.png deleted file mode 100644 index d41fc7e1..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/maximize.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/move.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/move.png deleted file mode 100644 index ebcc0fa9..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/move.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/refresh.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/refresh.png deleted file mode 100644 index 86b6f82c..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/refresh.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/rename.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/rename.png deleted file mode 100644 index 2323757e..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/rename.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/select.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/select.png deleted file mode 100644 index f1d290c6..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/select.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/settings.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/settings.png deleted file mode 100644 index 5ce478b1..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/settings.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/upload.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/upload.png deleted file mode 100644 index 37b1f801..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/upload.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/view.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/view.png deleted file mode 100644 index 6b7a6826..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/icons/view.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/loading.gif b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/loading.gif deleted file mode 100644 index 5f5cedca..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/loading.gif and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/denied.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/denied.png deleted file mode 100644 index 07b93c17..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/denied.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/folder.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/folder.png deleted file mode 100644 index 536da3d1..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/folder.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/folder_current.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/folder_current.png deleted file mode 100644 index 1d2f3012..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/folder_current.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/minus.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/minus.png deleted file mode 100644 index af617bbd..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/minus.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/plus.png b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/plus.png deleted file mode 100644 index 897088b1..00000000 Binary files a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/img/tree/plus.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/init.js b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/init.js deleted file mode 100644 index a5072312..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/init.js +++ /dev/null @@ -1,4 +0,0 @@ -// If this file exists in theme directory, it will be loaded in section - -var imgLoading = new Image(); -imgLoading.src = 'themes/oxygen/img/loading.gif'; diff --git a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/style.css b/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/style.css deleted file mode 100644 index cc1452aa..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/themes/oxygen/style.css +++ /dev/null @@ -1,407 +0,0 @@ -body { - background: #e0dfde; -} - -input { - margin: 0; -} - -input[type="radio"], input[type="checkbox"], label { - cursor: pointer; -} - -input[type="text"] { - border: 1px solid #a9a7a5; - background: #fff; - padding: 2px; - margin: 0; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -input[type="text"]:hover { - border-color: #2e5786; -} - -input[type="text"]:focus { - border-color: #3687e2; -} - -fieldset { - margin: 0 5px 5px 0px; - padding: 5px; - border: 1px solid #afadaa; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - cursor: default; -} - -fieldset td { - white-space: nowrap; -} - -legend { - margin: 0; - padding:0 3px; - font-weight: bold; -} - -#folders { - margin: 4px 4px 0 4px; - background: #f8f7f6; - border: 1px solid #adaba9; - border-radius: 6px; - -moz-border-radius: 6px; - -webkit-border-radius: 6px; -} - -#files { - float: left; - margin: 0 4px 0 0; - background: #f8f7f6; - border: 1px solid #adaba9; - border-radius: 6px; - -moz-border-radius: 6px; - -webkit-border-radius: 6px; -} - -#topic { - padding-left: 12px; -} - - -div.folder { - padding-top: 2px; - margin-top: 4px; - white-space: nowrap; -} - -div.folder a { - text-decoration: none; - cursor: default; - outline: none; - color: #000; -} - -span.folder { - padding: 2px 3px 2px 23px; - outline: none; - background: no-repeat 3px center; - cursor: pointer; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border: 1px solid transparent; -} - -span.brace { - width: 16px; - height: 16px; - outline: none; -} - -span.current { - background-image: url(img/tree/folder_current.png); - background-color: #5b9bda; - border-color: #2973bd; - color: #fff; -} - -span.regular { - background-image: url(img/tree/folder.png); - background-color: #f8f7f6; -} - -span.regular:hover, span.context { - background-color: #ddebf8; - border-color: #cee0f4 -} - -span.opened { - background-image: url(img/tree/minus.png); -} - -span.closed { - background-image: url(img/tree/plus.png); -} - -span.denied { - background-image: url(img/tree/denied.png); -} - -div.file { - padding: 4px; - margin: 3px; - border: 1px solid #aaa; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - background: #fff; -} - -div.file:hover { - background: #ddebf8; - border-color: #a7bed7; -} - -div.file .name { - margin-top: 4px; - font-weight: bold; -} - -div.file .time { - font-size: 10px; -} - -div.file .size { - font-size: 10px; -} - -#files div.selected, -#files div.selected:hover { - background-color: #5b9bda; - border-color: #2973bd; - color: #fff; -} - -tr.file > td { - padding: 3px 4px; - background-color: #f8f7f6 -} - -tr.file:hover > td { - background-color: #ddebf8; -} - -tr.selected > td, -tr.selected:hover > td { - background-color: #5b9bda; - color: #fff; -} - -#toolbar { - padding: 5px 0; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#toolbar a { - color: #000; - padding: 4px 4px 4px 24px; - margin-right: 5px; - border: 1px solid transparent; - background: no-repeat 2px center; - outline: none; - display: block; - float: left; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; -} - -#toolbar a:hover, -#toolbar a.hover { - background-color: #c9c7c4; - border-color: #afadaa; -} - -#toolbar a.selected { - background-color: #c9c7c4; - border-color: #3687e2; -} - -#toolbar a[href="kcact:upload"] { - background-image: url(img/icons/upload.png); -} - -#toolbar a[href="kcact:refresh"] { - background-image: url(img/icons/refresh.png); -} - -#toolbar a[href="kcact:settings"] { - background-image: url(img/icons/settings.png); -} - -#toolbar a[href="kcact:about"] { - background-image: url(img/icons/about.png); -} - -#toolbar a[href="kcact:maximize"] { - background-image: url(img/icons/maximize.png); -} - -#settings { - background: #e0dfde; -} - -.box, #loading { - padding: 4px; - border: 1px solid #3687e2; - background: #e0dfde; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - -#loading { - background-image: url(img/loading.gif); - font-weight: bold; - margin-right: 4px; -} - -.menu { - padding: 2px; - border: 1px solid #acaaa7; - background: #e4e3e2; - opacity: 0.95; -} - -.menu a { - text-decoration: none; - padding: 3px 3px 3px 22px; - background: no-repeat 2px center; - color: #000; - margin: 0; - background-color: #e4e3e2; - outline: none; - border: 1px solid transparent; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; -} - -.menu .delimiter { - border-top: 1px solid #acaaa7; - padding-bottom: 3px; - margin: 3px 2px 0 2px; -} - -.menu a:hover { - background-color: #bfbdbb; - border-color: #a9a59f; -} - -.menu a[href="kcact:refresh"] { - background-image: url(img/icons/refresh.png); -} - -.menu a[href="kcact:mkdir"] { - background-image: url(img/icons/folder-new.png); -} - -.menu a[href="kcact:mvdir"], .menu a[href="kcact:mv"] { - background-image: url(img/icons/rename.png); -} - -.menu a[href="kcact:rmdir"], .menu a[href="kcact:rm"], .menu a[href="kcact:rmcbd"] { - background-image: url(img/icons/delete.png); -} - -.menu a[href="kcact:clpbrdadd"] { - background-image: url(img/icons/clipboard-add.png); -} - -.menu a[href="kcact:pick"], .menu a[href="kcact:pick_thumb"] { - background-image: url(img/icons/select.png); -} - -.menu a[href="kcact:download"] { - background-image: url(img/icons/download.png); -} - -.menu a[href="kcact:view"] { - background-image: url(img/icons/view.png); -} - -.menu a[href="kcact:cpcbd"] { - background-image: url(img/icons/copy.png); -} - -.menu a[href="kcact:mvcbd"] { - background-image: url(img/icons/move.png); -} - -.menu a[href="kcact:clrcbd"] { - background-image: url(img/icons/clipboard-clear.png); -} - -a.denied { - color: #666; - opacity: 0.5; - filter: alpha(opacity:50); - cursor: default; -} - -a.denied:hover { - background-color: #e4e3e2; - border-color: transparent; -} - -#dialog input[type="text"] { - margin: 5px 0; - width: 200px; -} - -#dialog img { - border: 1px solid #3687e2; - background-color: #fff; -} - -#loadingDirs { - padding: 5px 0 1px 24px; -} - -.about { - text-align: center; - padding: 6px; -} - -.about div { - padding: 2px 0; -} - -.about div.title { - padding: 0 0 8px 0; - font-weight: bold; - font-size: 12px; -} - -.about a { - text-decoration: none; - color: #0055ff; -} - -.about a:hover { - text-decoration: underline; -} - -.about button { - margin-top: 8px; -} - -#clipboard { - padding: 0 4px 1px 0; -} - -#clipboard div { - background: url(img/icons/clipboard.png) no-repeat center center; - border: 1px solid transparent; - padding: 1px; - cursor: pointer; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; -} - -#clipboard div:hover { - background-color: #bfbdbb; - border-color: #a9a59f; -} - -#clipboard.selected div, #clipboard.selected div:hover { - background-color: #c9c7c4; - border-color: #3687e2; -} diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/.htaccess b/include/limesurvey/admin/scripts/kcfinder/tpl/.htaccess deleted file mode 100644 index 7484f13a..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ - -Order allow,deny -Deny from all - \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl__css.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl__css.php deleted file mode 100644 index 27fb9f1f..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl__css.php +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl__javascript.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl__javascript.php deleted file mode 100644 index e94930ee..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl__javascript.php +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - -opener['TinyMCE']) && $this->opener['TinyMCE']): ?> - - -config['theme']}/init.js")): ?> - - - diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_browser.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_browser.php deleted file mode 100644 index 674a50d4..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_browser.php +++ /dev/null @@ -1,85 +0,0 @@ - - - -KCFinder: /<?php echo $this->session['dir'] ?> - - - - - -
    -
    -
    -
    -
    -
    -
    -
    - -
     
    -
    - - diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_chDir.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_chDir.php deleted file mode 100644 index b8aa217c..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_chDir.php +++ /dev/null @@ -1,9 +0,0 @@ - -"> - -" writable="" bigIcon="" smallIcon="" thumb="" smallThumb=""> - - - - - \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_deleteDir.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_deleteDir.php deleted file mode 100644 index 60622e81..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_deleteDir.php +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_error.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_error.php deleted file mode 100644 index 3a052d4f..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_error.php +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_expand.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_expand.php deleted file mode 100644 index 9dd34efb..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_expand.php +++ /dev/null @@ -1,7 +0,0 @@ - - -" writable="" removable="" hasDirs=""> - - - - diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_init.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_init.php deleted file mode 100644 index e5272786..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_init.php +++ /dev/null @@ -1,12 +0,0 @@ - - - - -"> - -" writable="" bigIcon="" smallIcon="" thumb="" smallThumb=""> - - - - - diff --git a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_renameDir.php b/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_renameDir.php deleted file mode 100644 index 58c3e9e0..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/tpl/tpl_renameDir.php +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/include/limesurvey/admin/scripts/kcfinder/upload.php b/include/limesurvey/admin/scripts/kcfinder/upload.php deleted file mode 100644 index ac2b6df4..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/upload.php +++ /dev/null @@ -1,19 +0,0 @@ - - * @copyright 2010 KCFinder Project - * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2 - * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2 - * @link http://kcfinder.sunhater.com - */ - -require "core/autoload.php"; -$uploader = new uploader(); -$uploader->upload(); - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/kcfinder/upload/.htaccess b/include/limesurvey/admin/scripts/kcfinder/upload/.htaccess deleted file mode 100644 index 33c697e5..00000000 --- a/include/limesurvey/admin/scripts/kcfinder/upload/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ - - php_value engine off - - - php_value engine off - diff --git a/include/limesurvey/admin/scripts/labels.js b/include/limesurvey/admin/scripts/labels.js deleted file mode 100644 index 3930975a..00000000 --- a/include/limesurvey/admin/scripts/labels.js +++ /dev/null @@ -1,15 +0,0 @@ -// $Id: labels.js 8649 2010-04-28 21:38:53Z c_schmitz $ - -$(document).ready(function(){ - $('#btnDumpLabelSets').click(function(){ - if ($('#labelsets > option:selected').size()==0) - { - alert(strSelectLabelset); - return false; - } - else - { - return true; - } - }); -}); diff --git a/include/limesurvey/admin/scripts/listsurvey.js b/include/limesurvey/admin/scripts/listsurvey.js deleted file mode 100644 index d5d356c3..00000000 --- a/include/limesurvey/admin/scripts/listsurvey.js +++ /dev/null @@ -1,28 +0,0 @@ -// $Id: listsurvey.js 9692 2011-01-15 21:31:10Z c_schmitz $ - -$.tablesorter.addParser({ - // set a unique id - id: 'mydate', - is: function(s) { - // return false so this parser is not auto detected - return false; - }, - format: function(s) { - // format your data for normalization - return $.datepicker.formatDate( '@', $.datepicker.parseDate(userdateformat,s)); - }, - // set type, either numeric or text - type: 'numeric' -}); - -$(document).ready(function(){ - $(".listsurveys").tablesorter({ widgets: ['zebra'], - sortList: [[2,0]], - headers: {3:{sorter:'mydate'}, - 7:{sorter:'digit'}, // Full responses - 8:{sorter:'digit'}, // Partial Responses - 9:{sorter:'digit'} // Total Responses - } - }); - $(".listsurveys tr:eq(1) th:eq(2)").css('min-width','200px'); -}); diff --git a/include/limesurvey/admin/scripts/pngfix.js b/include/limesurvey/admin/scripts/pngfix.js deleted file mode 100644 index ac3947ff..00000000 --- a/include/limesurvey/admin/scripts/pngfix.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - -Correctly handle PNG transparency in Win IE 5.5 & 6. -http://homepage.ntlworld.com/bobosola. Updated 18-Jan-2006. - -Use in with DEFER keyword wrapped in conditional comments: - - -*/ - -var arVersion = navigator.appVersion.split("MSIE") -var version = parseFloat(arVersion[1]) - -if ((version >= 5.5) && (document.body.filters)) -{ - for(var i=0; i" - img.outerHTML = strNewHTML - i = i-1 - } - } -} diff --git a/include/limesurvey/admin/scripts/printablesurvey.js b/include/limesurvey/admin/scripts/printablesurvey.js deleted file mode 100644 index a22298b5..00000000 --- a/include/limesurvey/admin/scripts/printablesurvey.js +++ /dev/null @@ -1,10 +0,0 @@ -// $Id: printablesurvey.js 8633 2010-04-25 12:57:33Z c_schmitz $ - -$(document).ready(function(){ - $('[class^=max]').each(function(){ - var arrayOfClasses = $(this).attr('class').split(' '); - charcount=arrayOfClasses[0].substr(10); - $(this).find('div.input-text').width(charcount*2+'em'); - } - ) -}); diff --git a/include/limesurvey/admin/scripts/quotas.js b/include/limesurvey/admin/scripts/quotas.js deleted file mode 100644 index 054a1360..00000000 --- a/include/limesurvey/admin/scripts/quotas.js +++ /dev/null @@ -1,5 +0,0 @@ -// $Id: quotas.js 8633 2010-04-25 12:57:33Z c_schmitz $ - -$(document).ready(function(){ - // $("#quotalist").tablesorter({sortList: [[0,0]] }); -}); diff --git a/include/limesurvey/admin/scripts/rating/delete.gif b/include/limesurvey/admin/scripts/rating/delete.gif deleted file mode 100644 index 43c6ca87..00000000 Binary files a/include/limesurvey/admin/scripts/rating/delete.gif and /dev/null differ diff --git a/include/limesurvey/admin/scripts/rating/documentation.css b/include/limesurvey/admin/scripts/rating/documentation.css deleted file mode 100644 index 5bc5d807..00000000 --- a/include/limesurvey/admin/scripts/rating/documentation.css +++ /dev/null @@ -1,80 +0,0 @@ -*{ font-family:Arial, Helvetica, sans-serif; margin:0; padding:0; outline:none; } -form{ padding:0/*!important*/; margin:0/*!important*/; } -img{ border:0; } -ul,ol{ padding:2px 5px; margin:0 0 0 20px; } - -body{ font-size:72%; color: #333; background:#fff; margin:0px; padding:0px; } -h1{ color:#333; font-size:140%; float:left; width:auto; margin:0px 5px 0 0; } -h2{ color:#666; margin:20px 0 3px 0; } -h3{ color:#666; margin:10px 0 1px 0; } -p{ margin:10px 0; } -/*pre,code{ clear:both; display:block; }*/ -pre.code{ - background-color:#F7F7F7; - border-color:#A7A7CC; - border-style:solid; - border-width:1px 1px 1px 5px; - font-size:small; - overflow-x:auto; - padding:5px 5px 5px 15px; -} - -@media screen{ - /* LAYOUT 1 - sticky footer */ - /*ALL*/html,body,#wrap{ min-height: 100%; height: auto !important; height: 100%; } - /* FIXED HEADER/FOOTER: */ - #roof{ height:24px; position:fixed; width:100%; z-index:9999; left:0; top:0; } - #head{ height:30px; position:fixed; width:100%; z-index:9999; left:0; top:25px; } - #foot{ height:55px; position:fixed; width:100%; z-index:9999; left:0; bottom:0; } - #wrap{ padding:85px 0; } - #wrap{ padding:95px 0 !IE; } - html > body #roof{ height:14px; } -} - - -@media debug{ - #wrap{ background:#ffeeee;/*IE8*/ background:#eeffee;/*IE7*/ } - html > body #wrap{ background:#eeeeff;/*MOZ*/ } -} - -#head, #foot{ border:#AAA solid 2px; } -#head{ background:#F7F7F7 url('/jquery/project/head.png') bottom left repeat-x; } -#foot{ background:#F7F7F7 url('/jquery/project/foot.png') top left repeat-x; } -#head{ border-width:0 0 2px 0; } -#foot{ border-width:2px 0 0 0; padding:0 0 20px 0; } - -#roof{ height:14px; background:#e7e7e7; border-bottom:#AAA solid 1px; padding:5px; } -#roof{ color:#777; font-size:94%; } -#roof a{ color:#00A; } - -#body{ margin:10px; } - -#ad{ position:absolute; right:0; /*background:#090;*/ padding:5px; margin:5px 0 0 0; width:160px !important; overflow:hidden !important; } -#ad iframe{ width:160px !important; overflow:hidden !important; } -#documentation{ margin-right:170px; } - -#search{ text-align:right; padding:0; margin:5px 0; border:0; display:inline; clear:none; width:200px; } -#search *{ display:inline; float:left; clear:none; } -#search label{ color:#C00; font-weight:bold; font-size:100%; margin:2px 5px 0 0; } -#search input{ font-weight:bold; font-size:95%; } - -.license-info{ padding:10px 20px; margin:0px 50px; border:#77cc77 solid 1px; background:#f3f9f3; } -.hint{ padding:3px; background:#FFFF99; color:#000; border-bottom:#CC9900 solid 1px; margin:0 0 10px 0; } - -/* Utilities */ -.P5{ padding:5px; } -.Warning,.No,.Error{ color:red; } -.Success,.Yes,.Y{ color:green; } -.Bold,.B{ font-weight:bold; } - -/* FROM: http://roscoecreations.com/help/css/global2.css */ -.Clear:after {content: "."; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;} -.Clear {display: inline-block;} -html[xmlns] .Clear {display: block;} -* html .Clear {height: 1%;} -/* - END - */ - -/* tabs css */ -@media projection,screen{.tabs-hide{display:none}}@media print{.tabs-nav{display:none}}.tabs-nav{list-style:none;margin:0;padding:0 0 0 4px}.tabs-nav:after{display:block;clear:both;content:" "}.tabs-nav li{float:left;margin:0 0 0 1px}.tabs-nav a{display:block;position:relative;top:1px;z-index:2;padding:6px 10px 0;height:18px;color:#27537a;font-size:12px;font-weight:bold;line-height:1.2;text-align:center;text-decoration:none;background:url(/@/js/tabs/tab.png) no-repeat}.tabs-nav .tabs-selected a{padding-top:7px;color:#000}.tabs-nav .tabs-selected a,.tabs-nav a:hover,.tabs-nav a:focus,.tabs-nav a:active{background-position:0 -50px;outline:0}.tabs-nav .tabs-disabled a:hover,.tabs-nav .tabs-disabled a:focus,.tabs-nav .tabs-disabled a:active{background-position:0 0}.tabs-nav .tabs-selected a:link,.tabs-nav .tabs-selected a:visited,.tabs-nav .tabs-disabled a:link,.tabs-nav .tabs-disabled a:visited{cursor:text;cursor:default}.tabs-nav a:hover,.tabs-nav a:focus,.tabs-nav a:active{cursor:pointer;cursor:hand}.tabs-nav .tabs-disabled{opacity:.4}.tabs-container{border-top:1px solid #97a5b0;padding:1em 8px;background:#fff}.tabs-loading span{padding:0 0 0 20px;background:url(/@/js/tabs/loading.gif) no-repeat 0 50%}.tabs-nav li{margin:0px;padding:0px 4px 0px 0px}.tabs-nav a{position:relative;padding:5px 3px 0px 3px;font-size:100%;font-weight:normal;line-height:1;height:16px;border:#ccc solid;border-width:1px 1px 0px 1px;background:#f5f5f5;color:#333!important}.tabs-nav a:hover{color:#339!important;text-decoration:underline}.tabs-nav .tabs-selected a{padding-top:6px;border-width:1px 1px 0px 1px;background:#e7e7e7;color:#000!important}.tabs-nav .tabs-disabled a{border-color:#ccc;color:#555!important}.tabs-container{border-top:1px solid #e0e0e0;padding:0px 0px;background:transparent}* html .tabs-nav a{display:inline-block;height:23px}.tabs-nav li > a{} - -.tabs-nav{ font-size:110%; }.tabs-nav a{ font-weight:bold; } diff --git a/include/limesurvey/admin/scripts/rating/documentation.html b/include/limesurvey/admin/scripts/rating/documentation.html deleted file mode 100644 index 6d3cdeb9..00000000 --- a/include/limesurvey/admin/scripts/rating/documentation.html +++ /dev/null @@ -1,1169 +0,0 @@ - - - - jQuery Star Rating Plugin v3.13 (2009-03-26) - - - - - - - - - - - - - - - -
    -
    - jQuery Plugins: - Multiple File Upload, - Star Rating, - NEW: - CKEditor - (old: FCKEditor), - Codepress, - XML to JSON - - - - - - -
    - -
    - - - -
    - - - - - - - -
    -

    What is this?

    -

    - The Star Rating Plugin is a plugin - for the jQuery Javascript library that creates a non-obstrusive - star rating control based on a set of radio input boxes. -

    - -

    What does it do?

    -
      -
    • - It turns a collection of radio boxes into a neat star-rating control. -
    • -
    • - It creates the interface based on standard form elements, which means the - basic functionality will still be available even if Javascript is disabled. -
    • -
    • - NEW (12-Mar-08): - In read only mode (using the 'readOnly' option or disabled property), the plugin is a neat way of - displaying star-like values without any additional code -
    • -
    - -

    How do I use it?

    -

    - Just add the star class to your radio boxes -

    - - - - - - -
    -
    <input name="star1" type="radio" class="star"/>
    -<input name="star1" type="radio" class="star"/>
    -<input name="star1" type="radio" class="star"/>
    -<input name="star1" type="radio" class="star"/>
    -<input name="star1" type="radio" class="star"/>
    -
    » - - - - - -
    - -

    - Use the checked property to specify the initial/default value of the control -

    - - - - - - -
    -
    <input name="star2" type="radio" class="star"/>
    -<input name="star2" type="radio" class="star"/>
    -<input name="star2" type="radio" class="star" checked="checked"/>
    -<input name="star2" type="radio" class="star"/>
    -<input name="star2" type="radio" class="star"/>
    -
    » - - - - - -
    - -

    - Use the disabled property to use a control for display purposes only -

    - - - - - - -
    -
    <input name="star3" type="radio" class="star" disabled="disabled"/>
    -<input name="star3" type="radio" class="star" disabled="disabled"/>
    -<input name="star3" type="radio" class="star" disabled="disabled" checked="checked"/>
    -<input name="star3" type="radio" class="star" disabled="disabled"/>
    -<input name="star3" type="radio" class="star" disabled="disabled"/>
    -
    » - - - - - -
    - -

    What about split stars and 'half ratings'???

    -

    - Use metadata plugin to pass advanced settings to the plugin via the class property. -

    - - - - - - -
    -
    <input name="adv1" type="radio" class="star {split:4}"/>
    -<input name="adv1" type="radio" class="star {split:4}"/>
    -<input name="adv1" type="radio" class="star {split:4}"/>
    -<input name="adv1" type="radio" class="star {split:4}"/>
    -<input name="adv1" type="radio" class="star {split:4}" checked="checked"/>
    -<input name="adv1" type="radio" class="star {split:4}"/>
    -<input name="adv1" type="radio" class="star {split:4}"/>
    -<input name="adv1" type="radio" class="star {split:4}"/>
    -
    » - - - - - - - - -
    - -

    - Use custom selector -

    - - - - - - -
    - -
    $(function(){ // wait for document to load
    - $('input.wow').rating();
    -});
    -
    <input name="adv2" type="radio" class="wow {split:4}"/>
    -<input name="adv2" type="radio" class="wow {split:4}"/>
    -<input name="adv2" type="radio" class="wow {split:4}"/>
    -<input name="adv2" type="radio" class="wow {split:4}"/>
    -<input name="adv2" type="radio" class="wow {split:4}" checked="checked"/>
    -<input name="adv2" type="radio" class="wow {split:4}"/>
    -<input name="adv2" type="radio" class="wow {split:4}"/>
    -<input name="adv2" type="radio" class="wow {split:4}"/>
    -
    » - - - - - - - - -
    -
    - -
    -

    Test Suite

    - - - -
     
    -
    -Test 1 - A blank form - - - - - -
    - - - - - -
    -
    - Rating 1: - (N/M/Y) - - - -
    -
    -
    - Rating 2: - (10 - 50) - - - - - -
    -
    -
    - Rating 3: - (1 - 7) - - - - - - - -
    -
    -
    - Rating 4: - (1 - 5) - - - - - -
    -
    -
    - Rating 5: - (1 - 5) - - - - - -
    -
    -
    - Rating 6 (readonly): - (1 - 5) - - - - - -
    -
    -
      -   - Test results:

    -
    - Results will be displayed here -
    -
    -
    - -
     
     
    - -
    -Test 2 - With defaults ('checked') - - - - - -
    - - - - - -
    -
    - Rating 1: - (N/M/Y, default M) -
    -
    - - - -
    -
    - Rating 2: - (10 - 50, default 30) -
    -
    - - - - - -
    -
    - Rating 3: - (1 - 7, default 4) -
    -
    - - - - - - - -
    -
    -
    - Rating 4: - (1 - 5, default 1) -
    -
    - - - - - -
    -
    - Rating 5: - (1 - 5, default 5) -
    -
    - - - - - -
    -
    - Rating 6 (readonly): - (1 - 5, default 3) -
    -
    - - - - - -
    -
    -
      -   - Test results:

    -
    - Results will be displayed here -
    -
    -
    - -
     
     
    - -
    - -Test 3-A - With callback - - - - - -
    -
    - Rating 1: - (1 - 3, default 2) - - - -
    -
    -
    $('.auto-submit-star').rating({
    -  callback: function(value, link){
    -    alert(value);
    -  }
    -});
    -
    -
      -   - Test results:

    -
    - Results will be displayed here -
    -
    -
    - -
     
     
    - - -
    -Test 3-B - With hover effects - - - - - -
    -
    - Rating 1: - (1 - 3, default 2) -
    - - - - - - Hover tips will appear in here -
    -
    -
    -
    $('.hover-star').rating({
    -  focus: function(value, link){
    -    var tip = $('#hover-test');
    -    tip[0].data = tip[0].data || tip.html();
    -    tip.html(link.title || 'value: '+value);
    -  },
    -  blur: function(value, link){
    -    var tip = $('#hover-test');
    -    $('#hover-test').html(tip[0].data || '');
    -  }
    -});
    -
    -
      -   - Test results:

    -
    - Results will be displayed here -
    -
    -
    - -
     
     
    - -
    -Test 4 - Half Stars and Split Stars - - - - - -
    - - - - - -
    -
    - Rating 1: - (N/M/Y/?) -
    <input class="star {half:true}"
    - - - - -
    -
    -
    - Rating 2: - (10 - 60) -
    <input class="star {split:3}"
    - - - - - - -
    -
    -
    - Rating 3: - (0-5.0, default 3.5) -
    <input class="star {split:2}"
    - - - - - - - - - - -
    -
    -
    - Rating 4: - (1-6, default 5) -
    <input class="star {split:2}"
    - - - - - - -
    -
    -
    - Rating 5: - (1-20, default 11) -
    <input class="star {split:4}"
    - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - Rating 6 (readonly): - (1-20, default 13) -
    <input class="star {split:4}"
    - - - - - - - - - - - - - - - - - - - - -
    -
    -
      -   - Test results:

    -
    - Results will be displayed here -
    -
    -
    -
    - -
    -

    API

    -

    NEW to v3

    - -

    API methods can be invoked this this:

    -
    $(selector).rating(
    - 'method', // method name
    - [] // method arguments (not required)
    -);
    - -


    - -

    $().rating('select', index / value)

    -

    - Use this method to set the value (and display) of the star rating control - via javascript. It accepts the index of the star you want to select (0 based) - or its value (which must be passed as a string. -

    -

    - Example: (values A/B/C/D/E) -

    -
    - - - - - - - -
    - By index: - - - - - - eg.: $('input').rating('select',3) -
    - By value: - - - - - - eg.: $('input').rating('select','C') -
    - -


    - -

    $().rating('readOnly', true / false)

    -

    - Use this method to set the value (and display) of the star rating control - via javascript. It accepts the index of the star you want to select (0 based) - or its value (which must be passed as a string. -

    -

    - Example: (values 1,2,3...10) -

    -
    - - - - - - - - - - - - -
    - - eg.: $('input').rating('readOnly',true) -
    - - eg.: $('input').rating('readOnly',false) or simply $('input').rating('readOnly'); -
    - -


    - -

    $().rating('disable') / $().rating('enable')

    -

    - These methods bahve almost exactly as the readOnly method, however - they also control whether or not the select value is submitted with - the form. -

    -

    - Example: (values 1,2,3...10) -

    -
    - - - - - - - - - - - - -
    - - eg.: $('input').rating('disable') -
    - - eg.: $('input').rating('enable'); -
    -
    - -
    -

    Database Integration

    -

    - I'm sorry to say that for the time being, it is up to you - to create the server-side code that will - process the form submission, store it somewhere (like a database) and do stuff with it - - such as displaying averages and stop users from voting more than once. -

    -

    - However, here are a few alternatives if you don't feel - like getting down and dirty with some good old coding: -
    http://www.yvoschaap.com/index.php/weblog/css_star_rater_ajax_version/ -
    -
    and -
    part 1: http://www.komodomedia.com/blog/2005/08/creating-a-star-rater-using-css/ -
    part 2: http://slim.climaxdesigns.com/tutorial.php?section=slim&id=2 -
    part 3: http://slim.climaxdesigns.com/tutorial.php?section=slim&id=3 -
    part 4: http://slim.climaxdesigns.com/tutorial.php?section=slim&id=9 -

    -
    - -
    -

    Background Information

    -

    As far as I know, this is how it goes...

    -
      -
    • It all started with Will Stuckey's jQuery Star Rating Super Interface!
    • -
    • The original then became the inspiration for Ritesh Agrawal's Simple Star Rating System, - which allows for a GMail like star/un-star toggle.
    • -
    • This was followed by several spin-offs... (one of which is the Half-star rating plugin)
    • -
    • Then someone at PHPLetter.com modified the plugin to overcome the issues - then plugin was now based on standard form elements, meaning - the interface would still work with Javascript disabled making it beautifully downgradable.
    • -
    • Then I came along and noticed a fundamental flaw with the latter: there could only - be one star rating control per page. The rest of the story is what you will see below...
    • -
    • NEW (12-Mar-08): Then Keith Wood added some very nice functionality to the plugin: - option to disable the cancel button, option to make the plugin readOnly and ability to accept any value (other than whole numbers)
    • -
    • NEW (20-Mar-08): Now supports half-star, third-star, quater-star, etc... Not additional code required. No additional images required.
    • -
    • NEW (31-Mar-08): Two new events, hover/blur (arguments: [value, linkElement])
    • -
    -
    - -
    -

    Download

    -

    - This project (and all related files) can also be accessed via its - Google Code Project Page. -

    - - - - - - - - - - - - - - - - - -
    Full Package: - - - v3.13 - star-rating.zip - -
    -
    - Stay up-to-date! - - Major updates will be announced on - Twitter: - @fyneworks - -
    -
    Core Files: - These are the individual required files (already included in the zip package above) - -
    jQuery: - jquery-latest.js (see jQuery.com) -
    - -

    Related Downloads

    - - - - - -
    Related: - Metadata plugin - Used to retrieve inline configuration from class variable -
    - Form plugin - Used to submit forms via ajax -
    - -

    SVN Repository

    -

    - If you're a major geek or if you really really want to stay up-to-date with - with future updates of this plugin, go ahead and plug yourself to the - SVN Repository - on the official - Google Code Project Page. -

    - - - - - - - - - -
    SVN Checkout: - - SVN Checkout Instructions -
    Browse Online: - - Browse Source -
    - -

    Alternative Download - From this website

    -

    - Just in case it's the end of the world and the Google Code site becomes unavailable, - the project files can also be downloaded form this site. -
    - However, please note that this site is updated periodically whereas the Google Code - project is kept up-to-date almost instantaneously. If you'd like the very latest - version of this plugin - you are advised to use the links above and download the files from Google Code - - this will ensure the files you download have the very latest features and bug fixes. -

    - - - - - - - - - - - - - - - - - -
    Full Package: - - v3.13 - star-rating.zip -
    -
    - Stay up-to-date! - - Major updates will be announced on - Twitter: - @fyneworks - -
    -
    Core Files: - These are the individual required files (already included in the zip package above) - -
    jQuery: - jquery-latest.js (see jQuery.com) -
    - -
    - -
    - -

    Support

    -

    - Quick Support Links: Help me! - | Report a bug - | Suggest new feature - -

    -

    - Support for this plugin is available through the jQuery Mailing List. - This is a very active list to which many jQuery developers and users subscribe. -
    - Access to the jQuery Mailing List is also available through - Nabble Forums - and the - jQuery Google Group. -

    -

    - WARNING: - Support will not be provided via the jQuery Plugins - website. - If you need help, please direct your questions to the - jQuery Mailing List - or - report an issue - on the official - Google Code Project Page. -

    - -

    Official Links

    - - -

    Credit

    -
      -
    • Diego A. - Author, London SEO Consultant
    • -
    • Keith Wood - The brain behind v2.1
    • -
    • Dean Edwards - Author of JS Packer used to compress the plugin
    • -
    • Will Stuckey, Ritesh Agrawal and everyone else who worked in the previous versions of the plugin - I'm not so good with research...
    • -
    -
    - - - - - - - -
    -

    Attribute this work

    -
    - - - - - - - - - -
    Attribution link:© Fyneworks.com
    HTML Code: - -
    -
    -

    License Info

    -
    - - - - - - - - -
    - Star Rating Plugin - by Fyneworks.com - is licensed under the - MIT License and the - GPL License. - Creative Commons License
    - -
    -
    -
    -
    - -
    -
    -
    - - - - - - - - - diff --git a/include/limesurvey/admin/scripts/rating/documentation.js b/include/limesurvey/admin/scripts/rating/documentation.js deleted file mode 100644 index 7d6fb907..00000000 --- a/include/limesurvey/admin/scripts/rating/documentation.js +++ /dev/null @@ -1,15 +0,0 @@ -// chili-1.7.packed.ks -eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('8={3b:"1.6",2o:"1B.1Y,1B.23,1B.2e",2i:"",2H:1a,12:"",2C:1a,Z:"",2a:\'$$\',R:"&#F;",1j:"&#F;&#F;&#F;&#F;",1f:"&#F;<1W/>",3c:5(){9 $(y).39("1k")[0]},I:{},N:{}};(5($){$(5(){5 1J(l,a){5 2I(A,h){4 3=(1v h.3=="1h")?h.3:h.3.1w;k.1m({A:A,3:"("+3+")",u:1+(3.c(/\\\\./g,"%").c(/\\[.*?\\]/g,"%").3a(/\\((?!\\?)/g)||[]).u,z:(h.z)?h.z:8.2a})}5 2z(){4 1E=0;4 1x=x 2A;Q(4 i=0;i\';8.N[X]=1H;7($.31.34){4 W=J.1L(Y);4 $W=$(W);$("2d").1O($W)}v{$("2d").1O(Y)}}}5 1q(e,a){4 l=e&&e.1g&&e.1g[0]&&e.1g[0].37;7(!l)l="";l=l.c(/\\r\\n?/g,"\\n");4 C=1J(l,a);7(8.1j){C=C.c(/\\t/g,8.1j)}7(8.1f){C=C.c(/\\n/g,8.1f)}$(e).38(c)}5 1o(q,13){4 1l={12:8.12,2x:q+".1d",Z:8.Z,2w:q+".2u"};4 B;7(13&&1v 13=="2l")B=$.35(1l,13);v B=1l;9{a:B.12+B.2x,1p:B.Z+B.2w}}7($.2q)$.2q({36:"2l.15"});4 2n=x 1u("\\\\b"+8.2i+"\\\\b","2j");4 1e=[];$(8.2o).2D(5(){4 e=y;4 1n=$(e).3i("V");7(!1n){9}4 q=$.3u(1n.c(2n,""));7(\'\'!=q){1e.1m(e);4 f=1o(q,e.15);7(8.2H||e.15){7(!8.N[f.a]){1D{8.N[f.a]=1H;$.3v(f.a,5(M){M.f=f.a;8.I[f.a]=M;7(8.2C){2B(f.1p)}$("."+q).2D(5(){4 f=1o(q,y.15);7(M.f==f.a){1q(y,M)}})})}1I(3s){3t("a 3w Q: "+q+\'@\'+3z)}}}v{4 a=8.I[f.a];7(a){1q(e,a)}}}});7(J.1i&&J.1i.29){5 22(p){7(\'\'==p){9""}1z{4 16=(x 3A()).2k()}19(p.3x(16)>-1);p=p.c(/\\<1W[^>]*?\\>/3y,16);4 e=J.1L(\'<1k>\');e.3l=p;p=e.3m.c(x 1u(16,"g"),\'\\r\\n\');9 p}4 T="";4 18=1G;$(1e).3j().G("1k").U("2c",5(){18=y}).U("1M",5(){7(18==y)T=J.1i.29().3k});$("3n").U("3q",5(){7(\'\'!=T){2p.3r.3o(\'3p\',22(T));2V.2R=1a}}).U("2c",5(){T=""}).U("1M",5(){18=1G})}})})(1Z);8.I["1Y.1d"]={k:{2M:{3:/\\/\\*[^*]*\\*+(?:[^\\/][^*]*\\*+)*\\//},25:{3:/\\ - - - - - - - - - - - - - -
    -
    Select Style Sheet
    - -
    - -
    -
    - -

     

    - -
    - -
    -

    General

    - - - -This is text of tab 1. This is text of tab 1. This is text of tab 1. -This is text of tab 1. This is text of tab 1. This is text of tab 1. -This is text of tab 1. This is text of tab 1. This is text of tab 1.
    - -
    -

    Security

    - - - -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2.
    -
    -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2.
    - -
    -

    Privacy

    - - - -This is text of tab 3. This is text of tab 3. This is text of tab 3. -This is text of tab 3. This is text of tab 3. This is text of tab 3. -This is text of tab 3. This is text of tab 3. This is text of tab 3.
    - -
    -

    Content

    - - - -
    Content This is text of tab 4. -This is text of tab 4. This is text of tab 4. This is text of tab 4. -This is text of tab 4. This is text of tab 4. This is text of tab 4. -This is text of tab 4. This is text of tab 4.
    - -
    - -
    - - -

    Another tab below

    - - - -
    - -
    -

    General

    - -This is text of tab 1. This is text of tab 1. This is text of tab 1. -This is text of tab 1. This is text of tab 1. This is text of tab 1. -This is text of tab 1. This is text of tab 1. This is text of tab 1.
    - -
    -

    Security

    - -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2.
    -
    -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2.
    - -
    -

    Nested

    - - -
    - -
    -

    General

    - -This is text of tab 1. This is text of tab 1. This is text of tab 1. -This is text of tab 1. This is text of tab 1. This is text of tab 1. -This is text of tab 1. This is text of tab 1. This is text of tab 1.
    - -
    -

    Privacy

    - -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2. -This is text of tab 2. This is text of tab 2. This is text of tab 2.
    - -
    - -
    - -
    - - - - - - diff --git a/include/limesurvey/admin/scripts/tabpane/js/tabpane.js b/include/limesurvey/admin/scripts/tabpane/js/tabpane.js deleted file mode 100644 index 2cc445cb..00000000 --- a/include/limesurvey/admin/scripts/tabpane/js/tabpane.js +++ /dev/null @@ -1,327 +0,0 @@ -/*----------------------------------------------------------------------------\ -| Tab Pane 1.02 | -|-----------------------------------------------------------------------------| -| Created by Erik Arvidsson | -| (http://webfx.eae.net/contact.html#erik) | -| For WebFX (http://webfx.eae.net/) | -|-----------------------------------------------------------------------------| -| Copyright (c) 2002, 2003, 2006 Erik Arvidsson | -|-----------------------------------------------------------------------------| -| Licensed under the Apache License, Version 2.0 (the "License"); you may not | -| use this file except in compliance with the License. You may obtain a copy | -| of the License at http://www.apache.org/licenses/LICENSE-2.0 | -| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | -| Unless required by applicable law or agreed to in writing, software | -| distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | -| WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | -| License for the specific language governing permissions and limitations | -| under the License. | -|-----------------------------------------------------------------------------| -| 2002-01-?? | First working version | -| 2002-02-17 | Cleaned up for 1.0 public version | -| 2003-02-18 | Changed from javascript uri for anchors to return false | -| 2003-03-03 | Added dispose methods to release IE memory | -| 2006-05-28 | Changed license to Apache Software License 2.0. | -|-----------------------------------------------------------------------------| -| Dependencies: *.css a css file to define the layout | -|-----------------------------------------------------------------------------| -| Created 2002-01-?? | All changes are in the log above. | Updated 2006-05-28 | -\----------------------------------------------------------------------------*/ - -// This function is used to define if the browser supports the needed -// features -function hasSupport() { - - if (typeof hasSupport.support != "undefined") - return hasSupport.support; - - var ie55 = /msie 5\.[56789]/i.test( navigator.userAgent ); - - hasSupport.support = ( typeof document.implementation != "undefined" && - document.implementation.hasFeature( "html", "1.0" ) || ie55 ) - - // IE55 has a serious DOM1 bug... Patch it! - if ( ie55 ) { - document._getElementsByTagName = document.getElementsByTagName; - document.getElementsByTagName = function ( sTagName ) { - if ( sTagName == "*" ) - return document.all; - else - return document._getElementsByTagName( sTagName ); - }; - } - - return hasSupport.support; -} - -/////////////////////////////////////////////////////////////////////////////////// -// The constructor for tab panes -// -// el : HTMLElement The html element used to represent the tab pane -// bUseCookie : Boolean Optional. Default is true. Used to determine whether to us -// persistance using cookies or not -// -function WebFXTabPane( el, bUseCookie ) { - if ( !hasSupport() || el == null ) return; - - this.element = el; - this.element.tabPane = this; - this.pages = []; - this.selectedIndex = null; - this.useCookie = bUseCookie != null ? bUseCookie : true; - - // add class name tag to class name - this.element.className = this.classNameTag + " " + this.element.className; - - // add tab row - this.tabRow = document.createElement( "div" ); - this.tabRow.className = "tab-row"; - el.insertBefore( this.tabRow, el.firstChild ); - - var tabIndex = 0; - if ( this.useCookie ) { - tabIndex = Number( WebFXTabPane.getCookie( "webfxtab_" + this.element.id ) ); - if ( isNaN( tabIndex ) ) - tabIndex = 0; - } - this.selectedIndex = tabIndex; - - // loop through child nodes and add them - var c=this; - var b=$(el).find(".tab-page"); - jQuery.each(b, function() { - c.addTabPage( this ); - } - ); -} - -WebFXTabPane.prototype.classNameTag = "dynamic-tab-pane-control"; - -WebFXTabPane.prototype.setSelectedIndex = function ( n ) { - if (this.selectedIndex != n) { - if (this.selectedIndex != null && this.pages[ this.selectedIndex ] != null ) - this.pages[ this.selectedIndex ].hide(); - this.selectedIndex = n; - this.pages[ this.selectedIndex ].show(); - - if ( this.useCookie ) - WebFXTabPane.setCookie( "webfxtab_" + this.element.id, n ); // session cookie - } -}; - -WebFXTabPane.prototype.getSelectedIndex = function () { - return this.selectedIndex; -}; - -WebFXTabPane.prototype.addTabPage = function ( oElement ) { - if ( !hasSupport() ) return; - - if ( oElement.tabPage == this ) // already added - return oElement.tabPage; - - var n = this.pages.length; - var tp = this.pages[n] = new WebFXTabPage( oElement, this, n ); - tp.tabPane = this; - - // move the tab out of the box - this.tabRow.appendChild( tp.tab ); - - if ( n == this.selectedIndex ) - tp.show(); - else - tp.hide(); - - return tp; -}; - -WebFXTabPane.prototype.dispose = function () { - this.element.tabPane = null; - this.element = null; - this.tabRow = null; - - for (var i = 0; i < this.pages.length; i++) { - this.pages[i].dispose(); - this.pages[i] = null; - } - this.pages = null; -}; - - - -// Cookie handling -WebFXTabPane.setCookie = function ( sName, sValue, nDays ) { - var expires = ""; - if ( nDays ) { - var d = new Date(); - d.setTime( d.getTime() + nDays * 24 * 60 * 60 * 1000 ); - expires = "; expires=" + d.toGMTString(); - } - - document.cookie = sName + "=" + sValue + expires + "; path=/"; -}; - -WebFXTabPane.getCookie = function (sName) { - var re = new RegExp( "(\;|^)[^;]*(" + sName + ")\=([^;]*)(;|$)" ); - var res = re.exec( document.cookie ); - return res != null ? res[3] : null; -}; - -WebFXTabPane.removeCookie = function ( name ) { - setCookie( name, "", -1 ); -}; - - - - - - - - -/////////////////////////////////////////////////////////////////////////////////// -// The constructor for tab pages. This one should not be used. -// Use WebFXTabPage.addTabPage instead -// -// el : HTMLElement The html element used to represent the tab pane -// tabPane : WebFXTabPane The parent tab pane -// nindex : Number The index of the page in the parent pane page array -// -function WebFXTabPage( el, tabPane, nIndex ) { - if ( !hasSupport() || el == null ) return; - - this.element = el; - this.element.tabPage = this; - this.index = nIndex; - - var cs = el.childNodes; - for (var i = 0; i < cs.length; i++) { - if (cs[i].nodeType == 1 && cs[i].className == "tab") { - this.tab = cs[i]; - break; - } - } - - // insert a tag around content to support keyboard navigation - - - var a = document.createElement( "A" ); - this.aElement = a; - a.href = "#"; - a.onclick = function () { return false; }; - while ( this.tab.hasChildNodes() ) - a.appendChild( this.tab.firstChild ); - this.tab.appendChild( a ); - - - // hook up events, using DOM0 - var oThis = this; - this.tab.onclick = function () { oThis.select(); }; - this.tab.onmouseover = function () { WebFXTabPage.tabOver( oThis ); }; - this.tab.onmouseout = function () { WebFXTabPage.tabOut( oThis ); }; -} - -WebFXTabPage.prototype.show = function () { - var el = this.tab; - var s = el.className + " selected"; - s = s.replace(/ +/g, " "); - el.className = s; - - this.element.style.display = "block"; -}; - -WebFXTabPage.prototype.hide = function () { - var el = this.tab; - var s = el.className; - s = s.replace(/ selected/g, ""); - el.className = s; - - this.element.style.display = "none"; -}; - -WebFXTabPage.prototype.select = function () { - this.tabPane.setSelectedIndex( this.index ); -}; - -WebFXTabPage.prototype.dispose = function () { - this.aElement.onclick = null; - this.aElement = null; - this.element.tabPage = null; - this.tab.onclick = null; - this.tab.onmouseover = null; - this.tab.onmouseout = null; - this.tab = null; - this.tabPane = null; - this.element = null; -}; - -WebFXTabPage.tabOver = function ( tabpage ) { - var el = tabpage.tab; - var s = el.className + " hover"; - s = s.replace(/ +/g, " "); - el.className = s; -}; - -WebFXTabPage.tabOut = function ( tabpage ) { - var el = tabpage.tab; - var s = el.className; - s = s.replace(/ hover/g, ""); - el.className = s; -}; - - -// This function initializes all uninitialized tab panes and tab pages -function setupAllTabs() { - if ( !hasSupport() ) return; - - var all = document.getElementsByTagName( "*" ); - var l = all.length; - var tabPaneRe = /tab\-pane/; - var tabPageRe = /tab\-page/; - var cn, el; - var parentTabPane; - - for ( var i = 0; i < l; i++ ) { - el = all[i] - cn = el.className; - - // no className - if ( cn == "" ) continue; - - // uninitiated tab pane - if ( tabPaneRe.test( cn ) && !el.tabPane ) - new WebFXTabPane( el, true ); - - // unitiated tab page wit a valid tab pane parent - else if ( tabPageRe.test( cn ) && !el.tabPage && - tabPaneRe.test( el.parentNode.className ) ) { - el.parentNode.tabPane.addTabPage( el ); - } - } -} - -function disposeAllTabs() { - if ( !hasSupport() ) return; - - var all = document.getElementsByTagName( "*" ); - var l = all.length; - var tabPaneRe = /tab\-pane/; - var cn, el; - var tabPanes = []; - - for ( var i = 0; i < l; i++ ) { - el = all[i] - cn = el.className; - - // no className - if ( cn == "" ) continue; - - // tab pane - if ( tabPaneRe.test( cn ) && el.tabPane ) - tabPanes[tabPanes.length] = el.tabPane; - } - - for (var i = tabPanes.length - 1; i >= 0; i--) { - tabPanes[i].dispose(); - tabPanes[i] = null; - } -} - diff --git a/include/limesurvey/admin/scripts/tabpane/local/helptip.css b/include/limesurvey/admin/scripts/tabpane/local/helptip.css deleted file mode 100644 index 60ee7f57..00000000 --- a/include/limesurvey/admin/scripts/tabpane/local/helptip.css +++ /dev/null @@ -1,37 +0,0 @@ -/* - Notice that IE has a display problem if the help link is on - the last line of a container with no padding. If this is the - case increase the padding bottom to at least 1px -*/ -a.helpLink { - color: Green; - text-decoration: none; - border-bottom: 1px dashed Green; -} - -a.helpLink:hover { - color: Red; - text-decoration: none; - border-bottom: 1px dashed Red; -} - -.help-tooltip { - position: absolute; - width: 250px; - border: 1px Solid WindowFrame; - background: Infobackground; - color: InfoText; - font: StatusBar; - font: Status-Bar; - padding: 3px; - filter: progid : DXImageTransform.Microsoft.Shadow ( - color = - - "#777777", Direction = 135, Strength = 3 ); - z-index: 10000; -} - -.help-tooltip a,.help-tooltip a:hover { - color: blue !important; - background: none; -} \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/tabpane/local/helptip.js b/include/limesurvey/admin/scripts/tabpane/local/helptip.js deleted file mode 100644 index f0f83cf0..00000000 --- a/include/limesurvey/admin/scripts/tabpane/local/helptip.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This script was created by Erik Arvidsson (erik(at)eae.net) - * for WebFX (http://webfx.eae.net) - * Copyright 2001 - * - * For usage see license at http://webfx.eae.net/license.html - * - * Version: 1.0 - * Created: 2001-09-27 * Updated: 2001-11-25 Added a resize to the tooltip if the document width is too small - * - * Dependencies: helptip.css (To set up the CSS of the help-tooltip class) - * - * Usage: - * - * - * - * - * Help - * - */ - -function showHelpTip(e, s) { - // find anchor element - var el = e.target ? e.target : e.srcElement; - while (el.tagName != "A") - el = el.parentNode; - - // is there already a tooltip? If so, remove it - if (el._helpTip) { - document.body.removeChild(el._helpTip); - el._helpTip = null; - el.onblur = null; - return; - } - - // create element and insert last into the body - var d = document.createElement("DIV"); - d.className = "help-tooltip"; - document.body.appendChild(d); - d.innerHTML = s; - - // Allow clicks on A elements inside tooltip - d.onmousedown = function (e) { - if (!e) e = event; - var t = e.target ? e.target : e.srcElement; - while (t.tagName != "A" && t != d) - t = t.parentNode; - if (t == d) return; - - el._onblur = el.onblur; - el.onblur = null; - }; - d.onmouseup = function () { - el.onblur = el._onblur; - el.focus(); - }; - - // position tooltip - var dw = document.width ? document.width : document.documentElement.offsetWidth - 25; - if (d.offsetWidth >= dw) - d.style.width = dw - 10 + "px"; else - d.style.width = ""; - var scroll = getScroll(); - if (e.clientX > dw - d.offsetWidth) - d.style.left = dw - d.offsetWidth + scroll.x + "px"; - else - d.style.left = e.clientX - 2 + scroll.x + "px"; - d.style.top = e.clientY + 18 + scroll.y + "px"; - - // add a listener to the blur event. When blurred remove tooltip and restore anchor - el.onblur = function () { - document.body.removeChild(d); - el.onblur = null; - el._helpTip = null; - }; - - // store a reference to the tooltip div - el._helpTip = d; -} - -// returns the scroll left and top for the browser viewport. -function getScroll() { - if (document.all && document.body.scrollTop != undefined) { // IE model - var ieBox = document.compatMode != "CSS1Compat"; - var cont = ieBox ? document.body : document.documentElement; - return {x : cont.scrollLeft, y : cont.scrollTop}; - } - else { - return {x : window.pageXOffset, y : window.pageYOffset}; - } -} \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/tabpane/local/howto.txt b/include/limesurvey/admin/scripts/tabpane/local/howto.txt deleted file mode 100644 index 347919bc..00000000 --- a/include/limesurvey/admin/scripts/tabpane/local/howto.txt +++ /dev/null @@ -1,3 +0,0 @@ -Creata a sub folder in the zip directory and copy all these files to that dir. -Replace the include statements of webfxlayout.js and webfxapi.js to point at local/webfxlayout.js and -local/webfxapi.js \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/tabpane/local/title-background.png b/include/limesurvey/admin/scripts/tabpane/local/title-background.png deleted file mode 100644 index 93b9aada..00000000 Binary files a/include/limesurvey/admin/scripts/tabpane/local/title-background.png and /dev/null differ diff --git a/include/limesurvey/admin/scripts/tabpane/local/webfxapi.css b/include/limesurvey/admin/scripts/tabpane/local/webfxapi.css deleted file mode 100644 index 1d6b4917..00000000 --- a/include/limesurvey/admin/scripts/tabpane/local/webfxapi.css +++ /dev/null @@ -1 +0,0 @@ -/* This style sheet is used for WebFX Api pages */ a.helpLink,a.helpLink:hover { color: rgb(0, 66, 174); border-bottom-color: rgb(0, 66, 174); } .help-tooltip { width: auto; } .help-tooltip h4,.help-tooltip table,.help-tooltip p { width: auto; } .methodContainer { display: none; } .methodInfo h4,.methodInfo thead td { font-size: 13px; background: none; border-bottom: 0; } .methodInfo h4,.methodInfo p,.methodInfo table { margin: 5px; padding: 0; } td { vertical-align: top; } td code { white-space: nowrap; } code a:visited,code a:hover { color: rgb(0, 66, 174); background: transparent; } \ No newline at end of file diff --git a/include/limesurvey/admin/scripts/tabpane/local/webfxapi.js b/include/limesurvey/admin/scripts/tabpane/local/webfxapi.js deleted file mode 100644 index 32962f85..00000000 --- a/include/limesurvey/admin/scripts/tabpane/local/webfxapi.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This script is used for WebFX Api pages - * - * It defines one funtion and includes helptip.js, helptip.css and webfxapi.css - */ - -document.write( " - - - - -

    This page reloads as soon as the page is loaded... look at the -memory consuption.

    - -
    - -
    -

    General

    - - - - - -
    This is text of tab 1. This is text of tab 1. This is text of - tab 1. This is text of tab 1. This is text of tab 1. This is text of - tab 1. This is text of tab 1. This is text of tab 1. This is text of - tab 1.
    - -
    - -
    -

    Security

    - - - - - -
    This is text of tab 2. This is text of tab 2. This is text of - tab 2. This is text of tab 2. This is text of tab 2. This is text of - tab 2. This is text of tab 2. This is text of tab 2. This is text of - tab 2.
    -
    - This is text of tab 2. This is text of tab 2. This is text of tab 2. - This is text of tab 2. This is text of tab 2. This is text of tab 2. - This is text of tab 2. This is text of tab 2. This is text of tab 2.
    - -
    - -
    -

    Privacy

    - - - - - -
    This is text of tab 3. This is text of tab 3. This is text of - tab 3. This is text of tab 3. This is text of tab 3. This is text of - tab 3. This is text of tab 3. This is text of tab 3. This is text of - tab 3.
    - -
    - -
    -

    Content

    - - - - - -
    This is text of tab 4. This is text of tab 4. This is text of - tab 4. This is text of tab 4. This is text of tab 4. This is text of - tab 4. This is text of tab 4. This is text of tab 4. This is text of - tab 4.
    - -
    - -
    - - - diff --git a/include/limesurvey/admin/scripts/tabpane/tabpane.html b/include/limesurvey/admin/scripts/tabpane/tabpane.html deleted file mode 100644 index 26f540c1..00000000 --- a/include/limesurvey/admin/scripts/tabpane/tabpane.html +++ /dev/null @@ -1,1208 +0,0 @@ - - - - -Tab Pane (WebFX) - - - - - - - - - - - - - - - -
    - -

    2002-02-17: Original version posted.
    -2003-03-03: 1.02 - Fixes IE memory leakage.
    -2006-05-26: Changed license to Apache Software -License 2.0.
    -

    - - -
    -
    -

    Introduction

    - - - -

    You might remember that we used to have a pretty good tab strip -control here at WebFX a long time ago. This control was removed when we -redesigned the site with the argument that we should fix it to work in -Mozilla. Now, more than three years later we finally got down and -created a tab pane control that we think is a worthy replacement.

    - -

    This Tab Pane control is fairly similar to the tab system Tim -Scarfe created for developer-x.com -and the basic idea is the same. That idea is to be able to use a normal -XHTML document structure and if the browser supports DOM -level 1 then the structure of the elements is slightly adjusted and a -the className is changed for the tab pane container so that -the css rules specially defined for the tab are applied.

    - -

    The Tab Pane has support for persistence using cookies so that -you can navigate between pages without having to reselect the selected -tab for all your tab panes in your document. The look and feel is -entirely decided by CSS so it is fairly easy to create the look and feel -you need for your web application. As of this writing there are three -different styles available; Luna, Windows Classic and the WebFX look and -feel that this pane is currently using. See the demo -page for the look and feel of the other two.

    - -
    - -
    -

    Usage

    - - - -

    Include the Files

    - -

    To use the tab pane you should include two files. One JavaScript -file and on css file.

    - -
    -<script type="text/javascript" src="js/tabpane.js"></script>
    -<link type="text/css" rel="StyleSheet" href="css/tab.webfx.css" />
    -
    - -

    The XHTML Structure

    - -

    The basic structure for the tab pane consists of an element with -the class name tab-pane that in turn contains elements with -the class names tab-page. The tab page element should -contain one element with the class name tab. -This last one should preferably be a header of some kind in case the -browser does not support DOM1 and therefore will leave the structure -intact. The other two elements can be almost anything but a div -element is good because it usually does not change the rendering.

    - -

    Below is the code for a simple tab pane with the tab pages.

    - -
    -<div class="tab-pane" id="tab-pane-1">
    -
    -   <div class="tab-page">
    -      <h2 class="tab">General</h2>
    -
    -      This is text of tab 1. This is text of tab 1.
    -      This is text of tab 1. This is text of tab 1.
    -
    -   </div>
    -
    -   <div class="tab-page">
    -      <h2 class="tab">Privacy</h2>
    -
    -      This is text of tab 2. This is text of tab 2.
    -      This is text of tab 2. This is text of tab 2.
    -
    -   </div>
    -</div>
    -
    - -

    Notice that the id is not needed unless two or more -tab panes are present in the same document and you are using the -persistence feature.

    - -

    Initialization

    - -

    The code above is a complete working tab pane. You do not have to -add any more js code but there are a few good reasons why you would want -to do this. If no js code is added all the tab panes in the document are -initialized when the document is loaded. If you have lots of text and/or -images this will take quite some time and the layout of the page will -feel jerky. A better way is to call the function setupAllTabs -after all your XHTML has been defined. This works much better but if you -have a lot of text this is not optional either because the browser might -render some of the text before the entire tab structure is available.

    - -
    -      ...
    -   </div>
    -</div>
    -<!-- tab pane closed -->
    -
    -<script type="text/javascript">
    -setupAllTabs();
    -</script>
    -
    - -

    The best way to go is to create as much as possible as soon as -possible. This involves adding calls to js after the tab pane is opened -and as soon as every page is opened.

    - -
    -<div class="tab-pane" id="tab-pane-1">
    -
    -<script type="text/javascript">
    -var tabPane1 = new WebFXTabPane( document.getElementById( "tab-pane-1" ) );
    -</script>
    -
    -   <div class="tab-page" id="tab-page-1">
    -      <h2 class="tab">General</h2>
    -
    -      <script type="text/javascript">
    -      tabPane1.addTabPage( document.getElementById( "tab-page-1" ) );
    -      </script>
    -
    -      This is text of tab 1. This is text of tab 1.
    -      This is text of tab 1. This is text of tab 1.
    -
    -   </div>
    -
    -   <div class="tab-page" id="tab-page-2">
    -      <h2 class="tab">Privacy</h2>
    -
    -      <script type="text/javascript">
    -      tabPane1.addTabPage( document.getElementById( "tab-page-2" ) );
    -      </script>
    -
    -      This is text of tab 2. This is text of tab 2.
    -      This is text of tab 2. This is text of tab 2.
    -
    -   </div>
    -</div>
    -
    - -

    The code for this is, as you can see, not half as nice and you -should decide from time to time if you really need this. In most web -applications (especially intranet apps) this is not needed because the -amount of data inside each tab page is limited (or added later).

    - -

    One thing to note about this last method is that some browser -have trouble changing the content model during the page load (noticeably -Konqueror).

    - -
    - -
    -

    API

    - - -

    WebFXTabPane

    -

    This is the class representing a tab pane.

    -

    Syntax

    -

    new WebFXTabPane(oElement [, -bUseCookie])

    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescripton
    oElementHTMLElementThe html element that represents the tab pane
    bUseCookieBooleanOptional. If this is set to - true then the selected tab is persisted. The default value is true. -
    -

    Static Methods

    - - - - - - - - - - - - - - - - - - - - - -
    NameDescription
    setCookie -
    -
    -

    Syntax

    -

    object.setCookie(sName, sValue [, - nDays])

    -

    Arguments

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescripton
    sNameStringThe name of the cookie
    sValueStringThe value of the cookie
    nDaysNumberOptional. The number of - days to store the cookie
    -

    Return Type

    -

    void

    -
    -
    -
    Sets a cookie
    getCookie -
    -
    -

    Syntax

    -

    object.getCookie(sName)

    -

    Arguments

    - - - - - - - - - - - - - - - -
    NameTypeDescripton
    sNameStringThe name of the cookie
    -

    Return Type

    -

    String

    -
    -
    -
    Retrieves a cookie by name
    removeCookie -
    -
    -

    Syntax

    -

    object.removeCookie(sName)

    -

    Arguments

    - - - - - - - - - - - - - - - -
    NameTypeDescripton
    sNameStringThe name of the cookie to remove
    -

    Return Type

    -

    void

    -
    -
    -
    Removes a cookie by name
    -

    Static Fields

    - - - - - - - - - - - - - -
    NameTypeDescripton
    None.
    -

    Methods

    - - - - - - - - - - - - - - - - - - - - - -
    NameDescription
    addTabPage -
    -
    -

    Syntax

    -

    object.addTabPage(oElement)

    -

    Arguments

    - - - - - - - - - - - - - - - -
    NameTypeDescripton
    oElementHTMLElementThe html element that represents the tab page
    -

    Return Type

    -

    WebFXTabPage

    -
    -
    -
    Adds a tab page by passing an html element
    getSelectedIndex -
    -
    -

    Syntax

    -

    object.getSelectedIndex()

    -

    Arguments

    -

    No Arguments.

    -

    Return Type

    -

    Number

    -
    -
    -
    The index of the selected tab page
    setSelectedIndex -
    -
    -

    Syntax

    -

    object.setSelectedIndex(n)

    -

    Arguments

    - - - - - - - - - - - - - - - -
    NameTypeDescripton
    nNumberThe index of the tab page to select
    -

    Return Type

    -

    void

    -
    -
    -
    Sets the selected tab page by index
    -

    Fields

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescripton
    classNameTagStringThis string is added to the class name to tag the tab pane - as beeing created
    elementHTMLElementRead only.The html element - being that represents the tab pane
    pagesWebFXTabPages[]Read only.An array containing - the tab pages
    selectedIndexNumberRead only.The index of the - selected tab page
    tabRowHTMLElementRead only.The html element - that encloses all tabs
    useCookieBooleanIs used to decide if the selected tab page index should be - persisted using a cookie.
    -

    Remarks

    -

    None.

    -

    WebFXTabPage

    -

    This is the class representing a tab page.

    -

    Syntax

    -

    new WebFXTabPage(oElement, -oTabPane, nIndex)

    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescripton
    oElementHTMLElementThe html element that represents the tab page
    oTabPaneWebFXTabPaneThe tab pane to add the page to
    nIndexNumberThe index of the tab page
    -

    Static Methods

    - - - - - - - - - - - - -
    NameDescription
    None.
    -

    Static Fields

    - - - - - - - - - - - - - -
    NameTypeDescripton
    None.
    -

    Methods

    - - - - - - - - - - - - - - - - - - - - - -
    NameDescription
    hide -
    -
    -

    Syntax

    -

    object.hide()

    -

    Arguments

    -

    No Arguments.

    -

    Return Type

    -

    void

    -
    -
    -
    Hides the tab page
    select -
    -
    -

    Syntax

    -

    object.select()

    -

    Arguments

    -

    No Arguments.

    -

    Return Type

    -

    void

    -
    -
    -
    Selects the tab page
    show -
    -
    -

    Syntax

    -

    object.show()

    -

    Arguments

    -

    No Arguments.

    -

    Return Type

    -

    void

    -
    -
    -
    Makes the tab page visible
    -

    Fields

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescripton
    elementHTMLElementRead only.The html element - being used as the page
    indexNumberRead only. The index of the - tab page in the tab pane pages array.
    tabHTMLElementRead only.The html element - being used as the tab.
    -

    Remarks

    -

    Do not use this constructor manually. Use addTabPage of the -WebFXTabPane class instead.

    -

    Globals

    -

    Functions

    - - - - - - - - - - - - - - - - - -
    NameDescription
    hasSupport -
    -
    -

    Syntax

    -

    hasSupport()

    -

    Arguments

    -

    No Arguments.

    -

    Return Type

    -

    Boolean

    -
    -
    -
    Returns whether the browser is supported or not
    setupAllTabs -
    -
    -

    Syntax

    -

    setupAllTabs()

    -

    Arguments

    -

    No Arguments.

    -

    Return Type

    -

    void

    -
    -
    -
    Initializes all tab panes and tab pages that have not been - initialized already.
    -

    Objects

    - - - - - - - - - - - - - -
    NameTypeDescripton
    None.
    -
    - -
    -

    Implementation

    - - - -

    Check for support

    - -

    The way to check the browser whether it support a certain feature -in the DOM is to use the method document.implementation.hasFeature. -However since IE5.5 supports all the features that this script needs but -it does not support this way of checking for support we have to add a -separate check for IE55.

    - -
    -function hasSupport() {
    -
    -   if (typeof hasSupport.support != "undefined")
    -      return hasSupport.support;
    -
    -   var ie55 = /msie 5\.[56789]/i.test( navigator.userAgent );
    -
    -   hasSupport.support = ( typeof document.implementation != "undefined" &&
    -         document.implementation.hasFeature( "html", "1.0" ) || ie55 )
    -
    -   // IE55 has a serious DOM1 bug... Patch it!
    -   if ( ie55 ) {
    -      document._getElementsByTagName = document.getElementsByTagName;
    -      document.getElementsByTagName = function ( sTagName ) {
    -         if ( sTagName == "*" )
    -            return document.all;
    -         else
    -            return document._getElementsByTagName( sTagName );
    -      };
    -   }
    -
    -   return hasSupport.support;
    -}
    -
    - -

    As you can see in the code above IE55 has a bug an therefore we -also patch that. Too many people are still using IE55 to just ignore it.

    - -

    WebFXTabPane

    - -

    The constructor for the tab pane creates the tabRow -div that is used to place all the actual tabs in. It also checks the -cookie state so that the selected tab can be persisted. Besides from -this it sets up some properties needed to keep track of the states. Last -but not least it checks the childNodes of the element and -adds the found tab pages.

    - -
    -function WebFXTabPane( el, bUseCookie ) {
    -   if ( !hasSupport() || el == null ) return;
    -
    -   this.element = el;
    -   this.element.tabPane = this;
    -   this.pages = [];
    -   this.selectedIndex = null;
    -   this.useCookie = bUseCookie != null ? bUseCookie : true;
    -
    -   // add class name tag to class name
    -   this.element.className = this.classNameTag + " " + this.element.className;
    -
    -   // add tab row
    -   this.tabRow = document.createElement( "div" );
    -   this.tabRow.className = "tab-row";
    -   el.insertBefore( this.tabRow, el.firstChild );
    -
    -   var tabIndex = 0;
    -   if ( this.useCookie ) {
    -      tabIndex = Number( WebFXTabPane.getCookie( "webfxtab_" + this.element.id ) );
    -      if ( isNaN( tabIndex ) )
    -         tabIndex = 0;
    -   }
    -   this.selectedIndex = tabIndex;
    -
    -   // loop through child nodes and add them
    -   var cs = el.childNodes;
    -   var n;
    -   for (var i = 0; i < cs.length; i++) {
    -      if (cs[i].nodeType == 1 && cs[i].className == "tab-page") {
    -         this.addTabPage( cs[i] );
    -      }
    -   }
    -}
    -
    - -

    There are a few methods added to the WebFXTabPane -class and one of the more important ones is the method addTabPage. -This method takes the element that represents the tab page and uses that -to create a WebFXTabPage object that is added to the pages -array. Once the tab page has been added it also checks if this page is -the selected one and if it is it shows it.

    - -
    -WebFXTabPane.prototype = {
    -
    -   ...
    -
    -   addTabPage:   function ( oElement ) {
    -      if ( !hasSupport() ) return;
    -
    -      if ( oElement.tabPage == this )   // already added
    -         return oElement.tabPage;
    -
    -      var n = this.pages.length;
    -      var tp = this.pages[n] = new WebFXTabPage( oElement, this, n );
    -      tp.tabPane = this;
    -
    -      // move the tab out of the box
    -      this.tabRow.appendChild( tp.tab );
    -
    -      if ( n == this.selectedIndex )
    -         tp.show();
    -      else
    -         tp.hide();
    -
    -      return tp;
    -   }
    -};
    -
    - -

    WebFXTabPage

    - -

    This class is used to keep track of the actual tab page. Once -created it moves the tab element to the tabRow of the tab -pane. It also adds an anchor around the text so that the user can use -the keyboard to activate the tabs.

    - -
    -function WebFXTabPage( el, tabPane, nIndex ) {
    -   if ( !hasSupport() || el == null ) return;
    -
    -   this.element = el;
    -   this.element.tabPage = this;
    -   this.index = nIndex;
    -
    -   var cs = el.childNodes;
    -   for (var i = 0; i < cs.length; i++) {
    -      if (cs[i].nodeType == 1 && cs[i].className == "tab") {
    -         this.tab = cs[i];
    -         break;
    -      }
    -   }
    -
    -   // insert a tag around content to support keyboard navigation
    -   var a = document.createElement( "A" );
    -   a.href = "javascript:void 0;";
    -   while ( this.tab.hasChildNodes() )
    -      a.appendChild( this.tab.firstChild );
    -   this.tab.appendChild( a );
    -
    -   // hook up events, using DOM0
    -   var oThis = this;
    -   this.tab.onclick = function () { oThis.select(); };
    -   this.tab.onmouseover = function () { WebFXTabPage.tabOver( oThis ); };
    -   this.tab.onmouseout = function () { WebFXTabPage.tabOut( oThis ); };
    -}
    -
    - -

    Initialization

    - -

    The initialization uses the global function setupAllTabs -that goes through all elements and checks their class names and if the -class names match the classes used by the tab pane controls it checks -whether this element belongs to an uninitialized control and in that -case it initializes it now.

    - -
    -function setupAllTabs() {
    -   if ( !hasSupport() ) return;
    -
    -   var all = document.getElementsByTagName( "*" );
    -   var l = all.length;
    -   var tabPaneRe = /tab\-pane/;
    -   var tabPageRe = /tab\-page/;
    -   var cn, el;
    -   var parentTabPane;
    -
    -   for ( var i = 0; i < l; i++ ) {
    -      el = all[i]
    -      cn = el.className;
    -
    -      // no className
    -      if ( cn == "" ) continue;
    -
    -      // uninitiated tab pane
    -      if ( tabPaneRe.test( cn ) && !el.tabPane )
    -         new WebFXTabPane( el );
    -
    -      // unitiated tab page wit a valid tab pane parent
    -      else if ( tabPageRe.test( cn ) && !el.tabPage &&
    -               tabPaneRe.test( el.parentNode.className ) ) {
    -         el.parentNode.tabPane.addTabPage( el );
    -      }
    -   }
    -}
    -
    - -

    This function can be called manually at any time but the script -makes hooks to the load event for the window. This is done -using DOM level 2 events if available. If not we test if it supports the -IE5 way of attaching events and last we fall back on classic way of -setting events.

    - -
    -// DOM2
    -if ( typeof window.addEventListener != "undefined" )
    -   window.addEventListener( "load", setupAllTabs, false );
    -
    -// IE
    -else if ( typeof window.attachEvent != "undefined" )
    -   window.attachEvent( "onload", setupAllTabs );
    -
    -else {
    -   if ( window.onload != null ) {
    -      var oldOnload = window.onload;
    -      window.onload = function ( e ) {
    -         oldOnload( e );
    -         setupAllTabs();
    -      };
    -   }
    -   else
    -      window.onload = setupAllTabs;
    -}
    -
    - -
    -

    Look & Feel

    - - - - -

    The structure

    - -

    To be able to change the look and feel one needs to understand -the structure of the tab pane. When the original XHTML source tree is -transformed into the tab pane the class name of the element representing -the tab pane is tagged with the property classNameTag. The -default tag is dynamic-tab-pane-control and therefore all -your css rules should take this into account. If you want different look -on different tab panes in the same document this tag can be changed to -make the css rules easier to set up.

    - -
    -<div class="dynamic-tab-pane-control tab-pane" id="tab-pane-1">
    -   <div class="tab-row">
    -      <h2 class="tab selected"><a ... >General</a></h2>
    -      <h2 class="tab hover"><a ... >Privacy</a></h2>
    -   </div>
    -   <div class="tab-page">
    -
    -      This is text of tab 1. This is text of tab 1.
    -      This is text of tab 1. This is text of tab 1.
    -
    -   </div>
    -
    -   <div class="tab-page">
    -
    -      This is text of tab 2. This is text of tab 2.
    -      This is text of tab 2. This is text of tab 2.
    -
    -   </div>
    -</div>
    -
    - -

    The selected tab will have the class name tab -selected and the tab that the mouse hovers over will have the class name -tab hover. If the selected tab is hovered it will have the -class name tab selected hover. These rules allow you to -differentiate the look of tabs between the different states.

    - -

    The CSS Rules

    - -

    Here we will walk through the Windows -Classic css file. First we set the width and position of the tab pane to -prevent a few rendering bugs in IE6.

    - -
    -.dynamic-tab-pane-control.tab-pane {
    -   position:        relative;
    -   width:           100%;
    -}
    -
    -.dynamic-tab-pane-control .tab-row {
    -   z-index:         1;
    -   white-space:     nowrap;
    -}
    -
    - -

    Then we setup the css for the tab. Notice how the position is set -to relative to allow the top position to be slightly changed and to -allow the z-index property to be changed to position the tabs below the -tab pages.

    - -
    -.dynamic-tab-pane-control .tab-row .tab {
    -   font:            Menu;
    -   cursor:          Default;
    -   display:         inline;
    -   margin:          1px -2px 1px 2px;
    -   float:           left;
    -   padding:         2px 5px 3px 5px;
    -   background:      ThreeDFace;
    -   border:          1px solid;
    -   border-color:    ThreeDHighlight ThreeDDarkShadow
    -                    ThreeDDarkShadow ThreeDHighlight;
    -   border-bottom:   0;
    -   z-index:         1;
    -   position:        relative;
    -   top:             0;
    -}
    -
    - -

    For the selected tab we set the z-index to 3 to put it above the -tab pages. We also move it a little and change some other properties to -make it look more like the classic window tab control.

    - -
    -.dynamic-tab-pane-control .tab-row .tab.selected {
    -   border-bottom:   0;
    -   z-index:         3;
    -   padding:         2px 6px 5px 7px;
    -   margin:          1px -3px -2px 0px;
    -   top:             -2px;
    -}
    -
    - -

    Then we override the text properties on the tabs as well as for -the .hover rule.

    - -
    -.dynamic-tab-pane-control .tab-row .tab a {
    -   font:            Menu;
    -   color:           WindowText;
    -   text-decoration: none;
    -   cursor:          default;
    -}
    -
    -.dynamic-tab-pane-control .tab-row .hover a {
    -   color:           blue;
    -}
    -
    - -

    Then we set the z-index for the tab pages to 2 so that it will be -shown above tabs but below the selected tab. We also set the borders and -and a few other properties.

    - -
    -.dynamic-tab-pane-control .tab-page {
    -   clear:           both;
    -   border:          1px solid;
    -   border-color:    ThreeDHighlight ThreeDDarkShadow
    -                    ThreeDDarkShadow ThreeDHighlight;
    -   background:      ThreeDFace;
    -   z-index:         2;
    -   position:        relative;
    -   top:             -2px;
    -   color:           WindowText;
    -   font:            MessageBox;
    -   font:            Message-Box;
    -   padding:         10px;
    -}
    -
    -
    - - - -

    Tab Pane
    -Usage
    -API
    -Implementation
    -Look & Feel
    -Demo
    -Download

    - -

    Author: Erik Arvidsson

    - -
    - - - diff --git a/include/limesurvey/admin/scripts/templates.js b/include/limesurvey/admin/scripts/templates.js deleted file mode 100644 index 1524af14..00000000 --- a/include/limesurvey/admin/scripts/templates.js +++ /dev/null @@ -1,36 +0,0 @@ -// $Id: templates.js 12211 2012-01-26 17:02:27Z shnoulle $ -// based on TTabs from http://interface.eyecon.ro/ - -$(document).ready(function(){ - if($("#changes:not(.none)").length > 0) { - editAreaLoader.init({ - language: adminlanguage, - id : "changes" // textarea id - ,syntax: highlighter // syntax to be uses for highgliting - ,font_size: 8 - ,allow_toggle: false - ,word_wrap: true - ,start_highlight: true // to display with highlight mode on start-up - }); - } - $('#iphone').click(function(){ - $('#previewiframe').css("width", "320px"); - $('#previewiframe').css("height", "396px"); - }); - $('#x640').click(function(){ - $('#previewiframe').css("width", "640px"); - $('#previewiframe').css("height", "480px"); - }); - $('#x800').click(function(){ - $('#previewiframe').css("width", "800px"); - $('#previewiframe').css("height", "600px"); - }); - $('#x1024').click(function(){ - $('#previewiframe').css("width", "1024px"); - $('#previewiframe').css("height", "768px"); - }); - $('#full').click(function(){ - $('#previewiframe').css("width", "95%"); - $('#previewiframe').css("height", "768px"); - }); -}); diff --git a/include/limesurvey/admin/scripts/tokens.js b/include/limesurvey/admin/scripts/tokens.js deleted file mode 100644 index bc7f426a..00000000 --- a/include/limesurvey/admin/scripts/tokens.js +++ /dev/null @@ -1,71 +0,0 @@ -// $Id: tokens.js 8633 2010-04-25 12:57:33Z c_schmitz -$(document).ready(function(){ - $("#bounceprocessing").change(turnoff); - turnoff(); - $('img#bounceprocessing').bind('click',function(){ - $("#dialog-modal").dialog({ - title: "Summary", - modal: true, - autoOpen: false, - height: 200, - width: 400, - show: 'blind', - hide: 'blind' - }); - checkbounces(surveyid); - }); - $("#filterduplicatetoken").change(function(){ - if ($("#filterduplicatetoken").attr('checked')==true) - { - $("#lifilterduplicatefields").slideDown(); - } - else - { - $("#lifilterduplicatefields").slideUp(); - } - }) - //Token checkbox toggles - var tog=false; - $('#tokencheckboxtoggle').click(function() { - var selecteditems=''; - $("input[type=checkbox]").attr("checked",!tog); - $("input[type=checkbox]").each(function(index) { - if($(this).attr("name") && $(this).attr("checked")) { - selecteditems = selecteditems + "|" + $(this).attr("name"); - } - }); - $('#tokenboxeschecked').val(selecteditems); - tog=!tog; - }); - $('input[type=checkbox]').click(function() { - var selecteditems=''; - $("input[type=checkbox]").each(function(index) { - if($(this).attr("name") && $(this).attr("checked")) { - selecteditems = selecteditems + "|" + $(this).attr("name"); - } - }); - $('#tokenboxeschecked').val(selecteditems); - }); -}); - -function checkbounces(surveyid) { -$("#dialog-modal").dialog('open'); - var url = 'admin.php?action=tokens&subaction=bounceprocessing&sid='+surveyid - $('#dialog-modal').html('

    '); - $('#dialog-modal').load(url); -} - -function turnoff(ui,evt) -{ - bounce_disabled=($("#bounceprocessing").val()=='N' || $("#bounceprocessing").val()=='G'); - if (bounce_disabled==true) {bounce_disabled='disabled';} - else {bounce_disabled='';} - $("#bounceaccounttype").attr('disabled',bounce_disabled); - $("#bounceaccounthost").attr('disabled',bounce_disabled); - $("#bounceaccountuser").attr('disabled',bounce_disabled); - $("#bounceaccountpass").attr('disabled',bounce_disabled); - $("#bounceencryption").attr('disabled',bounce_disabled); - $("#bounceaccountencryption").attr('disabled',bounce_disabled); - if ($("#bounceprocessing").val()=='G') {$("#bounce_email").attr('disabled',bounce_disabled);} else {$("#bounce_email").attr('disabled','');} -} - diff --git a/include/limesurvey/admin/scripts/translation.js b/include/limesurvey/admin/scripts/translation.js deleted file mode 100644 index 7f7ba950..00000000 --- a/include/limesurvey/admin/scripts/translation.js +++ /dev/null @@ -1,344 +0,0 @@ -// $Id: tokens.js 8633 2010-04-25 12:57:33Z c_schmitz -var iRunningThreads=0; - -$(document).ready(function(){ - - intThrottlingRate = 550; // 1 request per 550 ms - $('#translationtabs').tabs(); - $('#translationtabs').show(); - $('#translationloading').hide(); - - $('input.auto-trans').live('click',function(ui) - { - var sTarget_id = $(ui.target).attr('id'); - - var sBaseLang = $("[name=baselang]").val(); - var sToLang = $("[name=tolang]").val(); - - switch (sToLang) - { - case 'he': sToLang='iw'; break; - case 'zh-Hans': sToLang='zh-CN'; break; - case 'zh-Hant-TW': sToLang='zh-TW'; break; - case 'zh-Hant-HK': sToLang='zh-TW'; break; - case 'nl-informal': sToLang='nl'; break; - case 'de-informal': sToLang='de'; break; - case 'ie': sToLang='ga'; break; - case 'it-formal': sToLang='it'; break; - case 'nb': sToLang='no'; break; - case 'nn': sToLang='no'; break; - case 'pt-BR': sToLang='pt'; break; - case 'es-MX': sToLang='es'; break; - zh-Hans - } - - $("._from_",$(ui.target).parent()).each(function(index,element) - { - var sToConvert = $(element).html(); - - var sId = ($(element).attr('id')).split('_from_').join("_newvalue_"); - - var bIgnore = false; - - if ($("textarea[name="+sId+"]").val()){ - - // fallback if the FCKEditor is not avaliable - sTargetInnerText = strip($("textarea[name="+sId+"]").val()); - - - var oMyEditor = CKEDITOR.instances[sId]; - if (oMyEditor) - { - sTargetInnerText = strip(oMyEditor.getData()); - } - - - if (!sTargetInnerText) - sTargetInnerText = "" - - if (sTargetInnerText.length > 0){ - bIgnore = true; - } - - if (sTargetInnerText == strip(sToConvert)){ - bIgnore = false; - } - } - - if (!bIgnore){ - - sToConvert = sToConvert.replace( new RegExp( "\\n", "g" ),'\\n'); - sToConvert = sToConvert.replace(/"/g,'\\"'); - setTimeout('fDoTranslateAjax("'+sBaseLang+'","'+sToLang+'","'+sToConvert+'","'+sId+'");',index*intThrottlingRate) - } - - }); - - - return false; - }); -}); -function fHideAjaxLoader(){ - iRunningThreads--; - if (iRunningThreads<=0) - { - $('.ajax-loader').css('display','none'); - } -} - -function fDoTranslateAjax(sBaseLang,sToLang,sToConvert,sId) - { - $('.ajax-loader').css('display','inline'); - iRunningThreads++; - $.ajax({ - url:'admin.php', - datatype: 'json', - async: true, - data:{ - action: 'ajaxtranslategoogleapi', - baselang:sBaseLang, - tolang:sToLang, - text:sToConvert - }, - error: function() - { - fHideAjaxLoader(); - }, - success: function(aData) - { - fHideAjaxLoader(); - - if (aData.error) - { - alert(sGoogleApiError + " " + sDetailedError + ": " + aData.error); - } - else if (!aData.error) - { - $("[name="+sId+"]").html(aData.converted); - - var oMyEditor = CKEDITOR.instances[sId]; - - if (oMyEditor) - { - oMyEditor.setData(aData.converted); - } - - } - } - }); - } - - - - -function strip(html) -{ - html = html_entity_decode(html); - var tmp = document.createElement("DIV"); - tmp.innerHTML = html; - return tmp.textContent||tmp.innerText; -} - -function html_entity_decode (string, quote_style) { - // Convert all HTML entities to their applicable characters - // - // version: 1009.2513 - // discuss at: http://phpjs.org/functions/html_entity_decode - // + original by: john (http://www.jd-tech.net) - // + input by: ger - // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // + bugfixed by: Onno Marsman - // + improved by: marc andreu - // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // + input by: Ratheous - // + bugfixed by: Brett Zamir (http://brett-zamir.me) - // + input by: Nick Kolosov (http://sammy.ru) - // + bugfixed by: Fox - // - depends on: get_html_translation_table - // * example 1: html_entity_decode('Kevin & van Zonneveld'); - // * returns 1: 'Kevin & van Zonneveld' - // * example 2: html_entity_decode('&lt;'); - // * returns 2: '<' - var hash_map = {}, symbol = '', tmp_str = '', entity = ''; - tmp_str = string.toString(); - - if (false === (hash_map = this.get_html_translation_table('HTML_ENTITIES', quote_style))) { - return false; - } - - // fix & problem - // http://phpjs.org/functions/get_html_translation_table:416#comment_97660 - delete(hash_map['&']); - hash_map['&'] = '&'; - - for (symbol in hash_map) { - entity = hash_map[symbol]; - tmp_str = tmp_str.split(entity).join(symbol); - } - tmp_str = tmp_str.split(''').join("'"); - - return tmp_str; -} - -function get_html_translation_table (table, quote_style) { - // Returns the internal translation table used by htmlspecialchars and htmlentities - // - // version: 1009.2513 - // discuss at: http://phpjs.org/functions/get_html_translation_table - // + original by: Philip Peterson - // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // + bugfixed by: noname - // + bugfixed by: Alex - // + bugfixed by: Marco - // + bugfixed by: madipta - // + improved by: KELAN - // + improved by: Brett Zamir (http://brett-zamir.me) - // + bugfixed by: Brett Zamir (http://brett-zamir.me) - // + input by: Frank Forte - // + bugfixed by: T.Wild - // + input by: Ratheous - // % note: It has been decided that we're not going to add global - // % note: dependencies to php.js, meaning the constants are not - // % note: real constants, but strings instead. Integers are also supported if someone - // % note: chooses to create the constants themselves. - // * example 1: get_html_translation_table('HTML_SPECIALCHARS'); - // * returns 1: {'"': '"', '&': '&', '<': '<', '>': '>'} - - var entities = {}, hash_map = {}, decimal = 0, symbol = ''; - var constMappingTable = {}, constMappingQuoteStyle = {}; - var useTable = {}, useQuoteStyle = {}; - - // Translate arguments - constMappingTable[0] = 'HTML_SPECIALCHARS'; - constMappingTable[1] = 'HTML_ENTITIES'; - constMappingQuoteStyle[0] = 'ENT_NOQUOTES'; - constMappingQuoteStyle[2] = 'ENT_COMPAT'; - constMappingQuoteStyle[3] = 'ENT_QUOTES'; - - useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS'; - useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT'; - - if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') { - throw new Error("Table: "+useTable+' not supported'); - // return false; - } - - entities['38'] = '&'; - if (useTable === 'HTML_ENTITIES') { - entities['160'] = ' '; - entities['161'] = '¡'; - entities['162'] = '¢'; - entities['163'] = '£'; - entities['164'] = '¤'; - entities['165'] = '¥'; - entities['166'] = '¦'; - entities['167'] = '§'; - entities['168'] = '¨'; - entities['169'] = '©'; - entities['170'] = 'ª'; - entities['171'] = '«'; - entities['172'] = '¬'; - entities['173'] = '­'; - entities['174'] = '®'; - entities['175'] = '¯'; - entities['176'] = '°'; - entities['177'] = '±'; - entities['178'] = '²'; - entities['179'] = '³'; - entities['180'] = '´'; - entities['181'] = 'µ'; - entities['182'] = '¶'; - entities['183'] = '·'; - entities['184'] = '¸'; - entities['185'] = '¹'; - entities['186'] = 'º'; - entities['187'] = '»'; - entities['188'] = '¼'; - entities['189'] = '½'; - entities['190'] = '¾'; - entities['191'] = '¿'; - entities['192'] = 'À'; - entities['193'] = 'Á'; - entities['194'] = 'Â'; - entities['195'] = 'Ã'; - entities['196'] = 'Ä'; - entities['197'] = 'Å'; - entities['198'] = 'Æ'; - entities['199'] = 'Ç'; - entities['200'] = 'È'; - entities['201'] = 'É'; - entities['202'] = 'Ê'; - entities['203'] = 'Ë'; - entities['204'] = 'Ì'; - entities['205'] = 'Í'; - entities['206'] = 'Î'; - entities['207'] = 'Ï'; - entities['208'] = 'Ð'; - entities['209'] = 'Ñ'; - entities['210'] = 'Ò'; - entities['211'] = 'Ó'; - entities['212'] = 'Ô'; - entities['213'] = 'Õ'; - entities['214'] = 'Ö'; - entities['215'] = '×'; - entities['216'] = 'Ø'; - entities['217'] = 'Ù'; - entities['218'] = 'Ú'; - entities['219'] = 'Û'; - entities['220'] = 'Ü'; - entities['221'] = 'Ý'; - entities['222'] = 'Þ'; - entities['223'] = 'ß'; - entities['224'] = 'à'; - entities['225'] = 'á'; - entities['226'] = 'â'; - entities['227'] = 'ã'; - entities['228'] = 'ä'; - entities['229'] = 'å'; - entities['230'] = 'æ'; - entities['231'] = 'ç'; - entities['232'] = 'è'; - entities['233'] = 'é'; - entities['234'] = 'ê'; - entities['235'] = 'ë'; - entities['236'] = 'ì'; - entities['237'] = 'í'; - entities['238'] = 'î'; - entities['239'] = 'ï'; - entities['240'] = 'ð'; - entities['241'] = 'ñ'; - entities['242'] = 'ò'; - entities['243'] = 'ó'; - entities['244'] = 'ô'; - entities['245'] = 'õ'; - entities['246'] = 'ö'; - entities['247'] = '÷'; - entities['248'] = 'ø'; - entities['249'] = 'ù'; - entities['250'] = 'ú'; - entities['251'] = 'û'; - entities['252'] = 'ü'; - entities['253'] = 'ý'; - entities['254'] = 'þ'; - entities['255'] = 'ÿ'; - } - - if (useQuoteStyle !== 'ENT_NOQUOTES') { - entities['34'] = '"'; - } - if (useQuoteStyle === 'ENT_QUOTES') { - entities['39'] = '''; - } - entities['60'] = '<'; - entities['62'] = '>'; - - - // ascii decimals to real symbols - for (decimal in entities) { - symbol = String.fromCharCode(decimal); - hash_map[symbol] = entities[decimal]; - } - - return hash_map; -} diff --git a/include/limesurvey/admin/scripts/updateset.js b/include/limesurvey/admin/scripts/updateset.js deleted file mode 100644 index 9ba9ed4f..00000000 --- a/include/limesurvey/admin/scripts/updateset.js +++ /dev/null @@ -1,325 +0,0 @@ -$(document).ready(function(){ - - if ($(".answertable tbody").children().length == 0) - add_label(undefined); - - - $(".btnaddanswer").live('click',add_label); - $(".btndelanswer").live('click',del_label); - - $('#neweditlblset0 .answertable tbody').sortable({ - update:sort_complete, - distance:2 - }); - - $('#quickadd').dialog({autoOpen: false, - modal: true, - width:600, - title: $("#quickadd").attr('name')}); - - $('.btnquickadd').live('click',function(){ - $('#quickadd').dialog('open'); - }); - - $('#btnqacancel').click(function(){ - $('#quickadd').dialog('close'); - }); - - - $('#btnqareplace').click(quickaddfunction); - $('#btnqainsert').click(quickaddfunction); - - - - - $("#mainform").submit(function(event,ui){ - - var dataToSend = {}; - dataToSend['langs'] = []; - dataToSend['codelist'] = []; - - $("#tabs>div").each(function(divindex,divelement){ - var div_language = $(".lslanguage",divelement).val(); - - if (typeof(div_language)!="undefined") - dataToSend['langs'].push(div_language); - }); - - $("tbody>tr",$("#tabs>div:first")).each(function(trindex,trelement){ - - var tr_code = $(trelement).attr('name'); - - - dataToSend['codelist'].push(tr_code); - dataToSend[tr_code] = { - code: $("#code_"+tr_code).val(), - assessmentvalue: $("#assessmentvalue_"+tr_code).val() - }; - - $(dataToSend['langs']).each(function(i,e){ - dataToSend[tr_code]['text_'+e] = $("[name=title_"+e+"_"+tr_code+"]").val(); - }); - }); - $("input[name=dataToSend]").remove(); - var encodedData = htmlspecialchars(js2php(dataToSend)); - $("#mainform").append(""); - }); - - fix_highlighting(); -}); - -function quickaddfunction(){ - var lsreplace = false; - if ($(this).attr('id') == 'btnqareplace'){ - lsreplace=true; - } - - if (lsreplace){ - $("#tabs>div:not(:last) tbody>tr").remove(); - } - - lsrows=$('#quickaddarea').val().split("\n"); - var seperatorchar="\t"; - if (lsrows[0].indexOf("\t")==-1){ - seperatorchar=';' - } - - - - $(lsrows).each(function(index,element){ - code = undefined; - - params = element.split(seperatorchar); - i = 0; - if (params.length > $(".lslanguage").length){ - code = params[0].replace(/[^a-zA-Z 0-9]+/g,''); - - i++; - } - - if (index!=0 || (!lsreplace && $("#tabs>div:not(:last) tbody>tr").length > 0)){ - event = {}; - event.target = $(".btnaddanswer:last"); - var retcode = add_label(event); - } - else{ - var retcode = add_label(); - } - - - - if (typeof(code)!="undefined") - $("#code_"+retcode).val(code); - - $(".lslanguage").each(function(){ - $("input[name=title_"+$(this).val()+"_"+retcode+"]").val(params[i]); - i++; - }); - - - }); - $("#quickaddarea").html(''); - $('#quickadd').dialog('close'); -} - - -function check_onsubmit(element){ - var onsub = $(element).attr('onsubmit'); - var code = onsub.substr(6,onsub.length); - - return eval(code); -} - -function sort_complete(event, ui){ - var newposition = ($(ui.item).parent().children().index($(ui.item))); - var item = ui.item; - - var position = ui.position; - var originalposition = ui.originalPosition; - - if (originalposition.top > position.top) newposition = newposition - 1; - - - $("#tabs div:not(:first) [name="+$(item).attr('name')+"]").each(function(index,element){ - var backup = ""+$(element).html()+""; - - if (newposition >= 0) - $($(element).parent().children()[newposition]).after(backup); - - else - $(element).parent().prepend(backup); - - $(element).remove(); - }); - - fix_highlighting(); -} - -function add_label(event) -{ - - if ($(this).parent().parent().find('.codeval').size()>0) - { - next_code=getNextCode($(this).parent().parent().find('.codeval').val()); - } - else - { - next_code='L001'; - } - while ($(this).parent().parent().parent().find('input[value="'+next_code+'"]').length>0 && next_code!=$(this).parent().parent().find('.codeval').val()) - { - next_code=getNextCode(next_code); - } - - var html = createNewLabelTR(true,true); - - if (typeof(event)=="undefined") - var row_id = -1; - else - var row_id = ($(event.target).parent().parent().parent().children().index($(event.target).parent().parent())); - - var randomid = 'new' + Math.floor(Math.random()*111111); - - html = str_replace("###assessmentval###",'0',html); - html = str_replace("###codeval###",next_code,html); - html = str_replace("###next###",randomid,html); - html = str_replace("###lang###",$("#tabs div:first .lslanguage").val(),html); - - - if (typeof(event) == "undefined") - $("#tabs div:first tbody").html(html); - else - $(event.target).parent().parent().after(html); - - html = createNewLabelTR(true,false); - - html = str_replace("###assessmentval###",'0',html); - html = str_replace("###codeval###",next_code,html); - html = str_replace("###next###",randomid,html); - - $("#tabs div:not(:first)").each(function(index,element){ - - var temp_html = str_replace("###lang###",$(".lslanguage",element).val(),html); - if (row_id >= 0){ - $($("tbody",element).children()[row_id]).after(temp_html); - } - else - $(".answertable tbody",$(element)).html(temp_html); - - }); - - $("tr[name="+randomid+"]").hide().fadeIn(1000); - - fix_highlighting(); - - return randomid; -} - - -function del_label(event){ - - var id = $(event.target).parent().parent().attr('name'); - - $("[name="+id+"]").remove(); - - fix_highlighting(); - - if ($(".answertable tbody").children().length == 0) - add_label(undefined); - -} - -function fix_highlighting(){ - $("tbody tr").removeClass("highlight"); - - $("tbody tr:even").addClass("highlight"); -} - -function createNewLabelTR(alternate,first){ - x = ""; - - if (!first) - x = x + "###codeval######assessmentval###"; - else - x = x + "" - + "" - + "" - + "" - + ""; - - x = x + ""+ - ""+ - "\"\""+ - "\"Give"; - - if (first) - x = x + ""; - - x = x + ""; - - return x; -} - - - -function str_replace (search, replace, subject, count) { - var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0, - f = [].concat(search), - r = [].concat(replace), - s = subject, - ra = r instanceof Array, sa = s instanceof Array; - s = [].concat(s); - if (count) { - this.window[count] = 0; - } - - for (i=0, sl=s.length; i < sl; i++) { - if (s[i] === '') { - continue; - } - for (j=0, fl=f.length; j < fl; j++) { - temp = s[i]+''; - repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0]; - s[i] = (temp).split(f[j]).join(repl); - if (count && s[i] !== temp) { - this.window[count] += (temp.length-s[i].length)/f[j].length;} - } - } - return sa ? s : s[0]; -} - -function getNextCode(sourcecode) -{ - i=1; - found=true; - foundnumber=-1; - sclength = sourcecode.length; - while (i<=sclength && found == true) - { - found=is_numeric(sourcecode.substr(sclength-i,i)); - if (found) - { - foundnumber=sourcecode.substr(sclength-i,i); - i++; - } - } - if (foundnumber==-1) - { - return(sourcecode); - } - else - { - foundnumber++; - foundnumber=foundnumber+''; - result=sourcecode.substr(0,sclength-foundnumber.length)+foundnumber; - return(result); - } - -} - -function is_numeric (mixed_var) { - return (typeof(mixed_var) === 'number' || typeof(mixed_var) === 'string') && mixed_var !== '' && !isNaN(mixed_var); -} diff --git a/include/limesurvey/admin/scripts/users.js b/include/limesurvey/admin/scripts/users.js deleted file mode 100644 index 706dc434..00000000 --- a/include/limesurvey/admin/scripts/users.js +++ /dev/null @@ -1,18 +0,0 @@ -// $Id: users.js 9330 2010-10-24 22:23:56Z c_schmitz $ - -$(document).ready(function(){ - $("#users").tablesorter({ - widgets: ['zebra'], - sortList: [[1,0]] }); - var tog=false; - $("#checkall").click(function() { - $("input[type=checkbox]").attr("checked",!tog); - tog=!tog; -}); -$('#create_survey,#configurator,#create_user,#delete_user,#manage_template,#manage_label').click(function() { - if($(this).attr('checked')==false) - { - $('#superadmin').attr('checked', false); - } -}); -}); diff --git a/include/limesurvey/admin/sessioncontrol.php b/include/limesurvey/admin/sessioncontrol.php deleted file mode 100644 index 12fe91b1..00000000 --- a/include/limesurvey/admin/sessioncontrol.php +++ /dev/null @@ -1,271 +0,0 @@ - thus we just change the login form lang: no user profile update -// if changelang is called from another form (after login) then update user lang -// when a loginlang is specified at login time, the user profile is updated in usercontrol.php -if (returnglobal('action') == "savepersonalsettings" && (!isset($login) || !$login )) -{ - $_SESSION['adminlang']=returnglobal('lang'); -} -elseif (!isset($_SESSION['adminlang']) || $_SESSION['adminlang']=='' ) -{ - $_SESSION['adminlang']=$defaultlang; -} - - -// Construct the language class, and set the language. -if (isset($_REQUEST['rootdir'])) {die('You cannot start this script directly');} -require_once($rootdir.'/classes/core/language.php'); -$clang = new limesurvey_lang($_SESSION['adminlang']); - -// get user rights -if(isset($_SESSION['loginID'])) {GetSessionUserRights($_SESSION['loginID']);} - -// check that requests that modify the DB are using POST -// and not GET requests -$dangerousActionsArray = Array -( - 'activate' => Array( - 0 => Array ('ok' => 'Y') - ), - 'adduser' => Array(), - 'addusertogroup' => Array(), - 'deleteuserfromgroup' => Array(), - 'deluser' => Array(), - 'delusergroup' => Array(), - 'editusergroupindb' => Array(), - 'mailsendusergroup' => Array(), - 'insertsurvey' => Array(), - 'importsurvey' => Array(), - 'usergroupindb' => Array(), - 'usertemplates' => Array(), - 'updatesurvey' => Array(), - 'importsurveyresources' => Array(), - 'updateemailtemplates'=>array(), - 'updatesurveysettings' => Array(), - 'updatesurveylocalesettings' => Array(), - 'deletesurvey' => Array(), - 'renumberquestions' => Array(), - 'insertquestiongroup' => Array(), - 'importgroup' => Array(), - 'updategroup' => Array(), - 'delgroup' => Array(), - 'insertquestion' => Array(), - 'importquestion' => Array(), - 'updatequestion' => Array(), - 'copynewquestion' => Array(), - 'delquestion' => Array(), - 'modanswer' => Array(), - 'moduser' => Array(), - 'resetsurveylogic' => Array(), - 'deactivate' => Array( - 0 => Array('ok' => 'Y') - ), - 'conditions' => Array( - 0 => Array('subaction' => 'insertcondition'), - 1 => Array('subaction' => 'delete'), - 2 => Array('subaction' => 'copyconditions'), - 3 => Array('subaction' => 'updatecondition'), - 4 => Array('subaction' => 'deletescenario'), - 5 => Array('subaction' => 'updatescenario'), - 6 => Array('subaction' => 'deleteallconditions'), - 7 => Array('subaction' => 'renumberscenarios') - ), - 'insertlabelset' => Array(), - 'importlabels' => Array(), - 'modlabelsetanswers' => Array(), - 'importlabelresources' => Array(), - 'deletelabelset' => Array(), - 'templatecopy' => Array(), - 'templaterename' => Array(), - 'assessmentadd' => Array(), - 'assessmentedit' => Array(), - 'assessmentdelete' => Array(), - 'iteratesurvey' => Array( - 0 => Array('subaction' => 'unfinalizeanswers') - ), - 'dataentry' => Array( - 0 => Array('subaction' => 'delete'), - 1 => Array('subaction' => 'update'), - 2 => Array('subaction' => 'insert'), - ), - 'tokens' => Array( - 0 => Array('subaction' => 'updatetoken'), - 1 => Array('subaction' => 'inserttoken'), - 2 => Array('subaction' => 'upload'), - 3 => Array('subaction' => 'uploadldap'), - 4 => Array('subaction' => 'email', 'ok' => 'absolutely'), - 5 => Array('subaction' => 'remind', 'ok' => 'absolutely'), - 6 => Array('subaction' => 'tokenify'), - 7 => Array('subaction' => 'kill'), - 8 => Array('subaction' => 'delete'), - 9 => Array('subaction' => 'clearinvites'), - 10 => Array('subaction' => 'cleartokens'), - 11 => Array('subaction' => 'deleteall'), - 12 => Array('createtable' => 'Y') - ), - 'quotas' => Array( - 0 => Array('subaction' => 'new_quota'), - 1 => Array('subaction' => 'insertquota'), - 2 => Array('subaction' => 'quota_delquota'), - 2 => Array('subaction' => 'modifyquota'), - 3 => Array('subaction' => 'new_answer_two'), - 4 => Array('subaction' => 'new_answer'), - 5 => Array('subaction' => 'insertquotaanswer'), - 6 => Array('subaction' => 'quota_delans') - ), - 'translate' => Array(), - 'ajaxmodlabelsetanswers'=>Array() -); - -if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['action']) && -isset($dangerousActionsArray[$_GET['action']])) -{ - $getauthorized=true; - if (is_array($dangerousActionsArray[$_GET['action']])) - { - foreach ($dangerousActionsArray[$_GET['action']] as $key => $arrayparams) - { - $totalparamcount=count($arrayparams); - $matchparamcount=0; - foreach ($arrayparams as $param => $val) - { - if (isset($_GET[$param]) && - $_GET[$param] == $val) - { - $matchparamcount++; - } - } - if ($matchparamcount == $totalparamcount) - { - $getauthorized=false; - break; - } - } - } - else - { // ERROR - $getauthorized=false; - } - - if ($getauthorized === false) - { - $_GET['action'] = 'FakeGET'; - $action = 'FakeGET'; - $_REQUEST['action'] = 'FakeGET'; - if (isset($_GET['subaction'])) {unset($_GET['subaction']);} - if (isset($_REQUEST['subaction'])) {unset($_REQUEST['subaction']);} - } -} - -if ($_SERVER['REQUEST_METHOD'] == 'POST' && -returnglobal('action') != 'login' && -returnglobal('action') != 'forgotpass' && -returnglobal('action') != 'ajaxquestionattributes' && -returnglobal('action') != '') -{ - if (returnglobal('checksessionbypost') != $_SESSION['checksessionpost']) - { - error_log("LimeSurvey ERROR while checking POST session- Probable CSRF attack Received=".returnglobal('checksessionbypost')." / Expected= ".$_SESSION['checksessionpost']." for action=".returnglobal('action')." ."); - $subaction=''; - if (isset($_POST['action'])) {unset($_POST['action']);} - if (isset($_REQUEST['action'])) {unset($_REQUEST['action']);} - if (isset($_POST['subaction'])) {unset($_POST['subaction']);} - if (isset($_REQUEST['subaction'])) {unset($_REQUEST['subaction']);} - $_POST['action'] = 'CSRFwarn'; - $_REQUEST['action'] = 'CSRFwarn'; - $action='CSRFwarn'; - //include("access_denied.php"); - } -} - -function GetSessionUserRights($loginID) -{ - global $dbprefix,$connect; - $squery = "SELECT create_survey, configurator, create_user, delete_user, superadmin, manage_template, manage_label FROM {$dbprefix}users WHERE uid=$loginID"; - $sresult = db_execute_assoc($squery); //Checked - if ($sresult->RecordCount()>0) - { - $fields = $sresult->FetchRow(); - $_SESSION['USER_RIGHT_CREATE_SURVEY'] = $fields['create_survey']; - $_SESSION['USER_RIGHT_CONFIGURATOR'] = $fields['configurator']; - $_SESSION['USER_RIGHT_CREATE_USER'] = $fields['create_user']; - $_SESSION['USER_RIGHT_DELETE_USER'] = $fields['delete_user']; - $_SESSION['USER_RIGHT_SUPERADMIN'] = $fields['superadmin']; - $_SESSION['USER_RIGHT_MANAGE_TEMPLATE'] = $fields['manage_template']; - $_SESSION['USER_RIGHT_MANAGE_LABEL'] = $fields['manage_label']; - } - - - - // SuperAdmins - // * original superadmin with uid=1 unless manually changed and defined - // in config-defaults.php - // * or any user having USER_RIGHT_SUPERADMIN right - - // Let's check if I am the Initial SuperAdmin - $adminquery = "SELECT uid FROM {$dbprefix}users WHERE parent_id=0"; - $adminresult = db_select_limit_assoc($adminquery, 1); - $row=$adminresult->FetchRow(); - if($row['uid'] == $_SESSION['loginID']) - { - $initialSuperadmin=true; - } - else - { - $initialSuperadmin=false; - } - - if ( $initialSuperadmin === true) - { - $_SESSION['USER_RIGHT_SUPERADMIN'] = 1; - $_SESSION['USER_RIGHT_INITIALSUPERADMIN'] = 1; - } - else - { - $_SESSION['USER_RIGHT_INITIALSUPERADMIN'] = 0; - } -} - - - -?> diff --git a/include/limesurvey/admin/statistics.php b/include/limesurvey/admin/statistics.php deleted file mode 100644 index 73411a54..00000000 --- a/include/limesurvey/admin/statistics.php +++ /dev/null @@ -1,1701 +0,0 @@ -alert("HI");'; - */ - -//split up results to extend statistics -> NOT WORKING YET! DO NOT ENABLE THIS! -$showcombinedresults = 0; - -/* - * this variable is used in the function shortencode() which cuts off a question/answer title - * after $maxchars and shows the rest as tooltip - */ -$maxchars = 50; - - - -include_once("login_check.php"); - -//some includes, the progressbar is used to show a progressbar while generating the graphs -//include_once("login_check.php"); -require_once('classes/core/class.progressbar.php'); - -//we collect all the output within this variable -$statisticsoutput =''; - -//output for chosing questions to cross query -$cr_statisticsoutput = ''; - -// This gets all the 'to be shown questions' from the POST and puts these into an array -$summary=returnglobal('summary'); -$statlang=returnglobal('statlang'); - -//if $summary isn't an array we create one -if (isset($summary) && !is_array($summary)) { - $summary = explode("+", $summary); -} - -//no survey ID? -> come and get one -if (!isset($surveyid)) {$surveyid=returnglobal('sid');} - -//still no survey ID -> error -if (!$surveyid) -{ - //need to have a survey id - $statisticsoutput .= "
    You have not selected a survey!
    "; - exit; -} - -// Set language for questions and answers to base language of this survey -$language = GetBaseLanguageFromSurveyID($surveyid); - - -//pick the best font file if font setting is 'auto' -if ($chartfontfile=='auto') -{ - $chartfontfile='vera.ttf'; - if ( $language=='ar') - { - $chartfontfile='KacstOffice.ttf'; - } - elseif ($language=='fa' ) - { - $chartfontfile='KacstFarsi.ttf'; - } - elseif ($language=='el' ) - { - $chartfontfile='DejaVuLGCSans.ttf'; - } - elseif ($language=='zh-Hant-HK' || $language=='zh-Hant-TW' || $language=='zh-Hans') - { - $chartfontfile='fireflysung.ttf'; - } - -} -//$statisticsoutput .= " -//"; - -//hide/show the filter -//filtersettings by default aren't shown when showing the results -$statisticsoutput .= ''; - -//headline with all icons for available statistic options -//Get the menubar -$statisticsoutput .= browsemenubar($clang->gT("Quick statistics")) - - -//we need a form which can pass the selected data later -."
    \n"; - -//Select public language file -$query = "SELECT datestamp FROM {$dbprefix}surveys WHERE sid=$surveyid"; -$result = db_execute_assoc($query) or safe_die("Error selecting language:
    ".$query."
    ".$connect->ErrorMsg()); - -/* - * check if there is a datestamp available for this survey - * yes -> $datestamp="Y" - * no -> $datestamp="N" - */ -while ($row=$result->FetchRow()) {$datestamp=$row['datestamp'];} - - - -// 1: Get list of questions from survey - -/* - * We want to have the following data - * a) "questions" -> all table namens, e.g. - * qid - * sid - * gid - * type - * title - * question - * preg - * help - * other - * mandatory - * lid - * lid1 - * question_order - * language - * - * b) "groups" -> group_name + group_order * - */ -$query = "SELECT questions.*, groups.group_name, groups.group_order\n" -." FROM ".db_table_name("questions") ." as questions, ".db_table_name("groups")." as groups\n" -." WHERE groups.gid=questions.gid\n" -." AND groups.language='".$language."'\n" -." AND questions.language='".$language."'\n" -." AND questions.parent_qid=0\n" -." AND questions.sid=$surveyid"; -$result = db_execute_assoc($query) or safe_die("Couldn't do it!
    $query
    ".$connect->ErrorMsg()); - -//store all the data in $rows -$rows = $result->GetRows(); - -//SORT IN NATURAL ORDER! -usort($rows, 'GroupOrderThenQuestionOrder'); - -//put the question information into the filter array -foreach ($rows as $row) -{ - //store some column names in $filters array - $filters[]=array($row['qid'], - $row['gid'], - $row['type'], - $row['title'], - $row['group_name'], - FlattenText($row['question'])); -} - -//var_dump($filters); -// SHOW ID FIELD - -$statisticsoutput .= "
    ".$clang->gT("General filters")."
    "; - - -$grapherror=''; -if (!function_exists("gd_info")) { - $grapherror.='
    '.$clang->gT('You do not have the GD Library installed. Showing charts requires the GD library to function properly.'); - $grapherror.='
    '.$clang->gT('visit http://us2.php.net/manual/en/ref.image.php for more information').'
    '; -} -elseif (!function_exists("imageftbbox")) { - $grapherror.='
    '.$clang->gT('You do not have the Freetype Library installed. Showing charts requires the Freetype library to function properly.'); - $grapherror.='
    '.$clang->gT('visit http://us2.php.net/manual/en/ref.image.php for more information').'
    '; -} -if ($grapherror!='') -{ - unset($_POST['usegraph']); -} - - -//pre-selection of filter forms -if (incompleteAnsFilterstate() == "filter") -{ - $selecthide="selected='selected'"; - $selectshow=""; - $selectinc=""; -} -elseif (incompleteAnsFilterstate() == "inc") -{ - $selecthide=""; - $selectshow=""; - $selectinc="selected='selected'"; -} -else -{ - $selecthide=""; - $selectshow="selected='selected'"; - $selectinc=""; -} -$statisticsoutput .="
    ".$clang->gT("Data selection")."
      "; -$statisticsoutput .="
    • \n"; - -$quexsfilterstate = questionnaireSampleFilterstate(); - - //queXS Addition - include_once("../quexs.php"); - $statisticsoutput .= "
    • \n"; - - -$statisticsoutput .= "
    • - gT("Count stats for each question based only on the total number of responses for which the question was displayed")."'>".$clang->gT("Subtotals based on displayed questions")." - \n"; -} - -$statisticsoutput .="
    • " -. "
    • \n"; - -$statisticsoutput.="\n
    \n"; - -$statisticsoutput .= "
    ".$clang->gT("Response ID")."
    • " -."\n" -."
    • \n" -."
    \n"; -$statisticsoutput .= ""; -$statisticsoutput .= ""; - - -//if the survey contains timestamps you can filter by timestamp, too -if (isset($datestamp) && $datestamp == "Y") { - - - $statisticsoutput .= "

    " -."\n" -."\n" -."

    "; - -//second row below options -> filter settings headline -$statisticsoutput.="
    " -."" -.$clang->gT("Response filters") -."
    \n"; - -$filterchoice_state=returnglobal('filterchoice_state'); -$statisticsoutput.="\n"; - -$statisticsoutput .="" - - //use current groupname and groupid as heading - ."$flt[4] (".$clang->gT("Question group")." $flt[1])\n\t\t" - ."\n"; -} - -//complete output -$statisticsoutput .= "\n\t\t\t\t\n"; - - - - - - -//add last lines to filter forms -$statisticsoutput .= "\t\t\t
    \n" - ."
    \n"; - - //counter which is used to adapt layout depending on counter # - $counter=0; - } - - //we don't want more than 4 questions in a row - //and we need a new row after each multiple/array question - if (isset($counter) && $counter == 4 || - ($previousquestiontype == "1" || - $previousquestiontype == "A" || - $previousquestiontype == "B" || - $previousquestiontype == "C" || - $previousquestiontype == "E" || - $previousquestiontype == "F" || - $previousquestiontype == "H" || - $previousquestiontype == "K" || - $previousquestiontype == "Q" || - $previousquestiontype == "R" || - $previousquestiontype == ":" || - $previousquestiontype == ";")) - { - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t"; $counter=0; - } - - /* - * remember: $flt is structured like this - * ['qid'], - ['gid'], - ['type'], - ['title'], - ['group_name'], - ['question'], - ['lid'], - ['lid1']); - */ - - //SGQ identifier - $myfield = "{$surveyid}X{$flt[1]}X{$flt[0]}"; - - //full question title - $niceqtext = FlattenText($flt[5]); - - /* - * Check question type: This question types will be used (all others are separated in the if clause) - * 5 - 5 Point Choice - G - Gender - I - Language Switch - L - List (Radio) - M - Multiple choice - N - Numerical Input - | - File Upload - O - List With Comment - P - Multiple choice with comments - Y - Yes/No - ! - List (Dropdown) ) - */ - if ($flt[2]=='M' || $flt[2]=='P' || $flt[2]=='N' || $flt[2]=='L' || $flt[2]=='5' - || $flt[2]=='G' || $flt[2]=='I' || $flt[2]=='O' || $flt[2]=='Y' || $flt[2]=='!') //Have to make an exception for these types! - { - - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\t\n"; - - //get answers - $query = "SELECT title as code, question as answer FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language = '{$language}' ORDER BY question_order"; - $result = db_execute_num($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - - //counter is used for layout - $counter2=0; - - //go through all the (multiple) answers - while ($row=$result->FetchRow()) - { - /* - * filter form for numerical input - * - checkbox - * - greater than - * - less than - */ - $myfield1="K".$myfield.$row[0]; - $myfield2="K{$myfield}".$row[0]."G"; - $myfield3="K{$myfield}".$row[0]."L"; - if ($counter2 == 4) {$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - - //start new TD - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - - //get subqestions - $query = "SELECT title as code, question as answer FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language='{$language}' ORDER BY question_order"; - $result = db_execute_num($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - $counter2=0; - - //loop through all answers - while ($row = $result->FetchRow()) - { - //collecting data for output, for details see above (question type "N") - - //we have one input field for each answer - $myfield2 = "Q".$myfield."$row[0]"; - if ($counter2 == 4) {$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - - $statisticsoutput .= "\t\t\t\t\n"; - $counter2++; - } - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $counter=0; - break; - - - - /* - * all "free text" types (T, U, S) get the same prefix ("T") - */ - case "T": // Long free text - case "U": // Huge free text - - $myfield2="T$myfield"; - $statisticsoutput .= "\t\t\t\t\n"; - break; - - - - case "S": // Short free text - - $myfield2="T$myfield"; - $statisticsoutput .= "\t\t\t\t\n"; - break; - - - - case "N": // Numerical - - //textfields for greater and less than X - $myfield2="{$myfield}G"; - $myfield3="{$myfield}L"; - $statisticsoutput .= "\t\t\t\t\t".$clang->gT("Number greater than").":
    \n" - ."\t\t\t\t\t
    \n" - ."\t\t\t\t\t".$clang->gT("Number less than").":
    \n" - ."\t\t\t\t\t
    \n"; - - //put field names into array - - break; - - - case "|": // File Upload - - // Number of files uploaded for greater and less than X - $myfield2 = "{$myfield}G"; - $myfield3 = "{$myfield}L"; - $statisticsoutput .= "\t\t\t\t\t".$clang->gT("Number of files greater than").":
    \n" - ."\t\t\t\t\t
    \n" - ."\t\t\t\t\t".$clang->gT("Number of files less than").":
    \n" - ."\t\t\t\t\t
    \n"; - - //put field names into array - - break; - - - /* - * DON'T show any statistics for date questions - * because there aren't any statistics implemented yet! - * - * Only filtering by date is possible. - * - * See bug report #2539 and - * feature request #2620 - */ - case "D": // Date - - /* - * - input name - * - date equals - * - date less than - * - date greater than - */ - $myfield2="D$myfield"; - $myfield3="$myfield2="; - $myfield4="$myfield2<"; - $myfield5="$myfield2>"; - $statisticsoutput .= "\t\t\t\t\n"; - break; - - - - case "Y": // Yes\No - $statisticsoutput .= "\t\t\t\t\t\n" - ."\t\t\t\t\t\n"; - break; - - - - case "I": // Language - $survlangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $survlangs[] = GetBaseLanguageFromSurveyID($surveyid); - foreach ($survlangs as $availlang) - { - $statisticsoutput .= "\t\t\t\t\t\n\t\t\t\t\n"; - - //get answers - $query = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language='{$language}' ORDER BY question_order"; - $result = db_execute_num($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - $counter2=0; - - //check all the results - while ($row=$result->FetchRow()) - { - $myfield2 = $myfield.$row[0]; - $statisticsoutput .= "\n"; - - if ($counter2 == 4) {$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - - //get answers - $query = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language='{$language}' ORDER BY question_order"; - $result = db_execute_num($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - $counter2=0; - - //loop answers - while ($row=$result->FetchRow()) - { - $myfield2 = $myfield . "$row[0]"; - $statisticsoutput .= "\n"; - - if ($counter2 == 4) {$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - - $statisticsoutput .= "\t\t\t\t\n"; - $counter2++; - - //add to array - } - - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $counter=0; - break; - - - - //similiar to the above one - case "E": // ARRAY OF Increase/Same/Decrease QUESTIONS - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $query = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language='{$language}' ORDER BY question_order"; - $result = db_execute_num($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - $counter2=0; - - while ($row=$result->FetchRow()) - { - $myfield2 = $myfield . "$row[0]"; - $statisticsoutput .= "\n"; - - if ($counter2 == 4) {$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - - $statisticsoutput .= "\t\t\t\t\n"; - $counter2++; - } - - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $counter=0; - break; - - case ";": //ARRAY (Multi Flex) (Text) - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $query = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language='{$language}' AND scale_id=0 ORDER BY question_order"; - $result = db_execute_num($query) or die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - $counter2=0; - while ($row=$result->FetchRow()) - { - $fquery = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language='{$language}' AND scale_id=1 ORDER BY question_order"; - $fresult = db_execute_assoc($fquery); - while ($frow = $fresult->FetchRow()) - { - $myfield2 = "T".$myfield . $row[0] . "_" . $frow['title']; - $statisticsoutput .= "\n"; - if ($counter2 == 4) {$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - $statisticsoutput .= "\t\t\t\t\n"; - $counter2++; - } - } - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $query = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language = '{$language}' AND scale_id=0 ORDER BY question_order"; - $result = db_execute_num($query) or die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - $counter2=0; - //Get qidattributes for this question - $qidattributes=getQuestionAttributes($flt[0]); - if (trim($qidattributes['multiflexible_max'])!='' && trim($qidattributes['multiflexible_min']) ==''){ - $maxvalue=$qidattributes['multiflexible_max']; - $minvalue=1; - } - if (trim($qidattributes['multiflexible_min'])!='' && trim($qidattributes['multiflexible_max']) ==''){ - $minvalue=$qidattributes['multiflexible_min']; - $maxvalue=$qidattributes['multiflexible_min'] + 10; - } - if (trim($qidattributes['multiflexible_min'])=='' && trim($qidattributes['multiflexible_max']) ==''){ - $minvalue=1; - $maxvalue=10; - } - if (trim($qidattributes['multiflexible_min']) !='' && trim($qidattributes['multiflexible_max']) !=''){ - if($qidattributes['multiflexible_min'] < $qidattributes['multiflexible_max']){ - $minvalue=$qidattributes['multiflexible_min']; - $maxvalue=$qidattributes['multiflexible_max']; - } - } - - if (trim($qidattributes['multiflexible_step'])!='') { - $stepvalue=$qidattributes['multiflexible_step']; - } else { - $stepvalue=1; - } - if ($qidattributes['multiflexible_checkbox']!=0) - { - $minvalue=0; - $maxvalue=1; - $stepvalue=1; - } - while ($row=$result->FetchRow()) - { - $fquery = "SELECT * FROM ".db_table_name("questions")." WHERE parent_qid={$flt[0]} AND language='{$language}' AND scale_id=1 ORDER BY question_order, title"; - $fresult = db_execute_assoc($fquery); - while ($frow = $fresult->FetchRow()) - { - $myfield2 = $myfield . $row[0] . "_" . $frow['title']; - $statisticsoutput .= "\n"; - if ($counter2 == 4) {$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $counter2=0; - } - - $statisticsoutput .= "\t\t\t\t\n"; - $counter2++; - - //add fields to main array - } - - //$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - - //get some answers - $query = "SELECT code, answer FROM ".db_table_name("answers")." WHERE qid='$flt[0]' AND language='{$language}' ORDER BY sortorder, answer"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - - //get number of answers - $count = $result->RecordCount(); - - //lets put the answer code and text into the answers array - while ($row = $result->FetchRow()) - { - $answers[]=array($row['code'], $row['answer']); - } - - $counter2=0; - - //loop through all answers. if there are 3 items to rate there will be 3 statistics - for ($i=1; $i<=$count; $i++) - { - //adjust layout depending on counter - if ($counter2 == 4) {$statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; $counter2=0;} - - //myfield is the SGQ identifier - //myfield2 is just used as comment in HTML like "R40X34X1721-1" - $myfield2 = "R" . $myfield . $i . "-" . strlen($i); - $myfield3 = $myfield . $i; - $statisticsoutput .= "\n" - ."\t\t\t\t\n\t\t\t\t\n"; - $counter=0; - unset($answers); - break; - - //Boilerplate questions are only used to put some text between other questions -> no analysis needed - case "X": //This is a boilerplate question and it has no business in this script - $statisticsoutput .= "\t\t\t\t"; - break; - - case "1": // MULTI SCALE - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - - //special dual scale counter - $counter2=0; - - //get answers - $query = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language='{$language}' ORDER BY question_order"; - $result = db_execute_num($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - - //loop through answers - while ($row=$result->FetchRow()) - { - - //----------------- LABEL 1 --------------------- - //myfield2 = answer code. - $myfield2 = $myfield . "$row[0]#0"; - - //3 lines of debugging output - $statisticsoutput .= "\n"; - - //some layout adaptions -> new line after 4 entries - if ($counter2 == 4) - { - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $counter2=0; - } - - //output checkbox and question/label text - $statisticsoutput .= "\t\t\t\t\n"; - $counter2++; - - - - - //----------------- LABEL 2 --------------------- - - //myfield2 = answer code - $myfield2 = $myfield . "$row[0]#1"; - - //3 lines of debugging output - $statisticsoutput .= "\n"; - - //some layout adaptions -> new line after 4 entries - if ($counter2 == 4) - { - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t\n"; - $counter2=0; - } - - //output checkbox and question/label text - $statisticsoutput .= "\t\t\t\t\n"; - $counter2++; - - } //end WHILE -> loop through all answers - - $statisticsoutput .= "\t\t\t\t\n"; - break; - - - /* - * This question types use the default settings: - * L - List (Radio) - O - List With Comment - P - Multiple choice with comments - ! - List (Dropdown) - */ - default: - - //get answers - $query = "SELECT code, answer FROM ".db_table_name("answers")." WHERE qid='$flt[0]' AND language='{$language}' ORDER BY sortorder, answer"; - $result = db_execute_num($query) or safe_die("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - - //loop through answers - while ($row=$result->FetchRow()) - { - $statisticsoutput .= "\t\t\t\t\t\t\n\t\t\t
    "; - - //Multiple choice: - if ($flt[2] == "M") {$myfield = "M$myfield";} - if ($flt[2] == "P") {$myfield = "P$myfield";} - - // File Upload will need special filters in future, hence the special treatment - if ($flt[2] == "|") {$myfield = "|$myfield";} - - //numerical input will get special treatment (arihtmetic mean, standard derivation, ...) - if ($flt[2] == "N") {$myfield = "N$myfield";} - $statisticsoutput .= "
    \n"; - - //numerical question type -> add some HTML to the output - //if ($flt[2] == "N") {$statisticsoutput .= "";} //removed to correct font error - if ($flt[2] != "N" && $flt[2] != "|") {$statisticsoutput .= "\t\t\t\t
    "; - - //checkbox - $statisticsoutput .= " do we want to pre-check the checkbox? - if (isset($summary) && (array_search("K{$surveyid}X{$flt[1]}X{$flt[0]}{$row[0]}", $summary) !== FALSE)) - {$statisticsoutput .= " checked='checked'";} - $statisticsoutput .= " /> "; - - //show speaker - $statisticsoutput .= showSpeaker($flt[3]." - ".FlattenText($row[1]))."
    \n"; - - //input fields - $statisticsoutput .= "\t\t\t\t\t".$clang->gT("Number greater than").":
    \n" - ."\t\t\t\t\t
    \n" - ."\t\t\t\t\t".$clang->gT("Number less than").":
    \n" - ."\t\t\t\t\t
    \n"; - - //we added 1 form -> increase counter - $counter2++; - - } - break; - - - - case "Q": // Multiple Short Text - - //new section - $statisticsoutput .= "\t\t\t\t
    "; - $statisticsoutput .= "\n" - ."\t\t\t\t\t".$clang->gT("Responses containing").":
    \n" - ."\t\t\t\t\t" - ."\t\t\t\t
    \n"; - $statisticsoutput .= "\t\t\t\t\t\n" - ."\t\t\t\t\t".$clang->gT("Responses containing").":
    \n" - ."\t\t\t\t\t\n" - ."\t\t\t\t
    "; - $statisticsoutput .= "\n" - ."\t\t\t\t\t".$clang->gT("Responses containing").":
    \n" - ."\t\t\t\t\t"; - $statisticsoutput .= "\t\t\t\t
    "; - - $statisticsoutput .= "\n" - - ."\t\t\t\t\t".$clang->gT("Date (YYYY-MM-DD) equals").":
    \n" - ."\t\t\t\t\t
    \n" - ."\t\t\t\t\t  ".$clang->gT("Date is")." >=
    \n" - ."\t\t\t\t\t
    " - .$clang->gT("AND/OR Date is")." <=
    \n"; - break; - - - - case "5": // 5 point choice - - //we need a list of 5 entries - for ($i=1; $i<=5; $i++) - { - $statisticsoutput .= "\t\t\t\t\t\n"; - $statisticsoutput .= "\t\t\t\t\t\n\t\t\t\t\n"; - $statisticsoutput .= "\t\t\t\t
    " - ."\n" - ."\t\t\t\t
    "; //heading - $statisticsoutput .= "\n" - ."\t\t\t\t
    " - ."
    \n" - ."\t\t\t\t\n\t\t\t\t
    " - ."
    \n" - ."\t\t\t\t\n\t\t\t\t
    " - ."
    \n"; - //$statisticsoutput .= $fquery; - $statisticsoutput .= "\t\t\t\t\t".$clang->gT("Responses containing").":
    \n"; - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t
    \n"; - $counter=0; - break; - - case ":": //ARRAY (Multi Flex) (Numbers) - $statisticsoutput .= "\t\t\t\t
    " - ."
    \n"; - //$statisticsoutput .= $fquery; - $statisticsoutput .= "\t\t\t\t
    " - ."
    \n"; - - /* - * when hoovering the speaker symbol we show the whole question - * - * flt[6] is the label ID - * - * table "labels" contains - * - lid - * - code - * - title - * - sortorder - * - language - */ - $fquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid={$flt[0]} AND language='{$language}' ORDER BY sortorder, code"; - $fresult = db_execute_assoc($fquery); - - //for debugging only: - //$statisticsoutput .= $fquery; - - //creating form - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t
    \n"; - $counter=0; - break; - - - - case "R": //RANKING - - $statisticsoutput .= "\t\t\t\t
    " - ."
    \n" - ."\t\t\t\t" - // ."
    "; - $statisticsoutput .= "$dshquery
    ".$connect->ErrorMsg()); - - //get header - while($dshrow=$dshresult->FetchRow()) - { - $dualscaleheadera = $dshrow[0]; - } - - if(isset($dualscaleheadera) && $dualscaleheadera != "") - { - $labeltitle = $dualscaleheadera; - } - else - { - $labeltitle=''; - } - - $statisticsoutput .= " /> " - .showSpeaker($niceqtext." [".str_replace("'", "`", $row[1])."] - ".$clang->gT("Label").": ".$labeltitle) - ."
    \n"; - - /* get labels - * table "labels" contains - * - lid - * - code - * - title - * - sortorder - * - language - */ - - $fquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid={$flt[0]} AND language='{$language}' and scale_id=0 ORDER BY sortorder, code"; - $fresult = db_execute_assoc($fquery); - - //this is for debugging only - //$statisticsoutput .= $fquery; - - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t
    "; - $statisticsoutput .= "$dshquery2
    ".$connect->ErrorMsg()); - - //get header - while($dshrow2=$dshresult2->FetchRow()) - { - $dualscaleheaderb = $dshrow2[0]; - } - - if(isset($dualscaleheaderb) && $dualscaleheaderb != "") - { - $labeltitle2 = $dualscaleheaderb; - } - else - { - //get label text - - $labeltitle2 = ''; - } - - $statisticsoutput .= " /> " - .showSpeaker($niceqtext." [".str_replace("'", "`", $row[1])."] - ".$clang->gT("Label").": ".$labeltitle2) - ."
    \n"; - - $fquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid={$flt[0]} AND language='{$language}' and scale_id=1 ORDER BY sortorder, code"; - $fresult = db_execute_assoc($fquery); - - //this is for debugging only - //$statisticsoutput .= $fquery; - - $statisticsoutput .= "\t\t\t\t\n\t\t\t\t
    \n"; - - - $counter=0; - break; - - case "P": //P - Multiple choice with comments - case "M": //M - Multiple choice - - //get answers - $query = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$flt[0]' AND language='{$language}' ORDER BY question_order"; - $result = db_execute_num($query) or safe_die("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - - //loop through answers - while ($row=$result->FetchRow()) - { - $statisticsoutput .= "\t\t\t\t\t\t
    \n" -."\t\t\n"; - - -//add line to separate the the filters from the other options -$statisticsoutput .= ""; - -$statisticsoutput .= ""; - - - - -//very last lines of output -$statisticsoutput .= "\t\t

    \n" -."\t\t\t\n" -."\t\t\t\n" -."\t\t\n" -."\t\t\n" -."\t\t

    \n" -."\t
    \n"; - -// ----------------------------------- END FILTER FORM --------------------------------------- - - -//Show Summary results -if (isset($summary) && $summary) -{ - if(isset($_POST['usegraph'])) - { - $usegraph = 1; - } - else - { - $usegraph = 0; - } - include_once("statistics_function.php"); - $outputType = $_POST['outputtype']; - switch($outputType){ - - case 'html': - $statisticsoutput .= generate_statistics($surveyid,$summary,$summary,$usegraph,$outputType,'DD',$statlang); - break; - case 'pdf': - generate_statistics($surveyid,$summary,$summary,$usegraph,$outputType,'I',$statlang); - exit; - break; - case 'xls': - generate_statistics($surveyid,$summary,$summary,$usegraph,$outputType,'DD',$statlang); - exit; - break; - default: - - break; - - } - - //print_r($summary); exit; - -} //end if -> show summary results - -function showSpeaker($hinttext) -{ - global $clang, $imageurl, $maxchars; - - if(!isset($maxchars)) - { - $maxchars = 100; - } - $htmlhinttext=str_replace("'",''',$hinttext); //the string is already HTML except for single quotes so we just replace these only - $jshinttext=javascript_escape($hinttext,true,true); - - if(strlen($hinttext) > ($maxchars)) - { - $shortstring = FlattenText($hinttext); - - $shortstring = htmlspecialchars(mb_strcut(html_entity_decode($shortstring,ENT_QUOTES,'UTF-8'), 0, $maxchars, 'UTF-8')); - - //output with hoover effect - $reshtml= "gT("Question","js").": $jshinttext')\">" - ." \"$shortstring...\" " - ."$htmlhinttextgT("Question","js").": $jshinttext')\" />"; - } - else - { - $reshtml= " \"$htmlhinttext\""; - } - return $reshtml; -} - -////simple function to square a value -//function square($number) -//{ -// if($number == 0) -// { -// $squarenumber = 0; -// } -// else -// { -// $squarenumber = $number * $number; -// } -// -// return $squarenumber; -//} - -?> diff --git a/include/limesurvey/admin/statistics_function.php b/include/limesurvey/admin/statistics_function.php deleted file mode 100644 index 1e7f82a2..00000000 --- a/include/limesurvey/admin/statistics_function.php +++ /dev/null @@ -1,3520 +0,0 @@ -alert("HI");'; - */ - - //split up results to extend statistics -> NOT WORKING YET! DO NOT ENABLE THIS! - //$showcombinedresults = 0; - - - - - - //don't call this script directly! - if (isset($_REQUEST['homedir'])) {die('You cannot start this script directly');} - - - /** - * Generates statistics - * - * @param int $surveyid The survey id - * @param mixed $allfields - * @param mixed $q2show - * @param mixed $usegraph - * @param string $outputType Optional - Can be xls, html or pdf - Defaults to pdf - * @param string $pdfOutput Sets the target for the PDF output: DD=File download , F=Save file to local disk - * @param string $statlangcode Lamguage for statistics - * @param mixed $browse Show browse buttons - * @return buffer - */ - function generate_statistics($surveyid, $allfields, $q2show='all', $usegraph=0, $outputType='pdf', $pdfOutput='I',$statlangcode=null, $browse = true) - { - //$allfields =""; - global $connect, $dbprefix, $clang, - $rooturl, $rootdir, $homedir, $homeurl, $tempdir, $tempurl, $scriptname, $imagedir, - $chartfontfile, $chartfontsize, $admintheme, $pdfdefaultfont, $pdffontsize, $showaggregateddata; - - - if (is_null($statlangcode)) - { - $statlang=GetBaseLanguageFromSurveyID($surveyid); - } - else - { - $statlang = new limesurvey_lang($statlangcode); - } - $fieldmap=createFieldMap($surveyid, "full", false, false, $statlang->langcode); - - /* - * this variable is used in the function shortencode() which cuts off a question/answer title - * after $maxchars and shows the rest as tooltip (in html mode) - */ - $maxchars = 13; - //we collect all the html-output within this variable - $statisticsoutput =''; - /** - * $outputType: html || pdf || - */ - /** - * get/set Survey Details - */ - - //no survey ID? -> come and get one - if (!isset($surveyid)) {$surveyid=returnglobal('sid');} - - //Get an array of codes of all available languages in this survey - $surveylanguagecodes = GetAdditionalLanguagesFromSurveyID($surveyid); - $surveylanguagecodes[] = GetBaseLanguageFromSurveyID($surveyid); - - // Set language for questions and answers to base language of this survey - $language=$statlangcode; - - if ($usegraph==1) - { - //for creating graphs we need some more scripts which are included here - require_once(dirname(__FILE__).'/../classes/pchart/pchart/pChart.class'); - require_once(dirname(__FILE__).'/../classes/pchart/pchart/pData.class'); - require_once(dirname(__FILE__).'/../classes/pchart/pchart/pCache.class'); - $MyCache = new pCache($tempdir.'/'); - - //pick the best font file if font setting is 'auto' - if ($chartfontfile=='auto') - { - $chartfontfile='vera.ttf'; - if ( $language=='ar') - { - $chartfontfile='KacstOffice.ttf'; - } - elseif ($language=='fa' ) - { - $chartfontfile='KacstFarsi.ttf'; - } - - } - } - - if($q2show=='all' ) - { - $summarySql=" SELECT gid, parent_qid, qid, type " - ." FROM {$dbprefix}questions WHERE parent_qid=0" - ." AND sid=$surveyid "; - - $summaryRs = db_execute_assoc($summarySql); - - foreach($summaryRs as $field) - { - $myField = $surveyid."X".$field['gid']."X".$field['qid']; - - // Multiple choice get special treatment - if ($field['type'] == "M") {$myField = "M$myField";} - if ($field['type'] == "P") {$myField = "P$myField";} - //numerical input will get special treatment (arihtmetic mean, standard derivation, ...) - if ($field['type'] == "N") {$myField = "N$myField";} - - if ($field['type'] == "|") {$myField = "|$myField";} - - if ($field['type'] == "Q") {$myField = "Q$myField";} - // textfields get special treatment - if ($field['type'] == "S" || $field['type'] == "T" || $field['type'] == "U"){$myField = "T$myField";} - //statistics for Date questions are not implemented yet. - if ($field['type'] == "D") {$myField = "D$myField";} - if ($field['type'] == "F" || $field['type'] == "H") - { - //Get answers. We always use the answer code because the label might be too long elsewise - $query = "SELECT code, answer FROM ".db_table_name("answers")." WHERE qid='".$field['qid']."' AND scale_id=0 AND language='{$language}' ORDER BY sortorder, answer"; - $result = db_execute_num($query) or safe_die ("Couldn't get answers!
    $query
    ".$connect->ErrorMsg()); - $counter2=0; - - //check all the answers - while ($row=$result->FetchRow()) - { - $myField = "$myField{$row[0]}"; - } - //$myField = "{$surveyid}X{$flt[1]}X{$flt[0]}{$row[0]}[]"; - - - } - if($q2show=='all') - $summary[]=$myField; - - //$allfields[]=$myField; - } - } - else - { - // This gets all the 'to be shown questions' from the POST and puts these into an array - if (!is_array($q2show)) - $summary=returnglobal('summary'); - else - $summary = $q2show; - - //print_r($_POST); - //if $summary isn't an array we create one - if (isset($summary) && !is_array($summary)) - { - $summary = explode("+", $summary); - } - } - - /* Some variable depend on output type, actually : only line feed */ - switch($outputType) - { - case 'xls': - $linefeed = "\n"; - break; - case 'pdf': - $linefeed = "\n"; - break; - case 'html': - $linefeed = "
    \n"; - break; - default: - - break; - } - - /** - * pdf Config - */ - if($outputType=='pdf') - { - require_once('classes/tcpdf/config/lang/eng.php'); - global $l; - $l['w_page'] = $statlang->gT("Page",'unescaped'); - require_once('classes/tcpdf/mypdf.php'); - - // create new PDF document - $pdf = new MyPDF(); - $pdf->SetFont($pdfdefaultfont,'',$pdffontsize); - - $surveyInfo = getSurveyInfo($surveyid,$language); - - // set document information - $pdf->SetCreator(PDF_CREATOR); - $pdf->SetAuthor('LimeSurvey'); - $pdf->SetTitle('Statistic survey '.$surveyid); - $pdf->SetSubject($surveyInfo['surveyls_title']); - $pdf->SetKeywords('LimeSurvey, Statistics, Survey '.$surveyid.''); - $pdf->SetDisplayMode('fullpage', 'two'); - - // set header and footer fonts - $pdf->setHeaderFont(Array($pdfdefaultfont, '', PDF_FONT_SIZE_MAIN)); - $pdf->setFooterFont(Array($pdfdefaultfont, '', PDF_FONT_SIZE_DATA)); - - // set default header data - // the path looks awkward - did not find a better solution to set the image path? - $pdf->SetHeaderData("statistics.png", 10, $statlang->gT("Quick statistics",'unescaped') , $statlang->gT("Survey")." ".$surveyid." '".FlattenText($surveyInfo['surveyls_title'],true,'UTF-8')."'"); - - - // set default monospaced font - $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); - - //set margins - $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); - $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); - $pdf->SetFooterMargin(PDF_MARGIN_FOOTER); - - //set auto page breaks - $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); - - //set image scale factor - $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); - - //set some language-dependent strings - $pdf->setLanguageArray($l); - } - if($outputType=='xls') - { - /** - * Initiate the Spreadsheet_Excel_Writer - */ - include_once(dirname(__FILE__)."/classes/pear/Spreadsheet/Excel/Writer.php"); - if($pdfOutput=='F') - $workbook = new Spreadsheet_Excel_Writer($tempdir.'/statistic-survey'.$surveyid.'.xls'); - else - $workbook = new Spreadsheet_Excel_Writer(); - - $workbook->setVersion(8); - // Inform the module that our data will arrive as UTF-8. - // Set the temporary directory to avoid PHP error messages due to open_basedir restrictions and calls to tempnam("", ...) - if (!empty($tempdir)) { - $workbook->setTempDir($tempdir); - } - if ($pdfOutput!='F') - $workbook->send('statistic-survey'.$surveyid.'.xls'); - - // Creating the first worksheet - $sheet =& $workbook->addWorksheet(utf8_decode('results-survey'.$surveyid)); - $sheet->setInputEncoding('utf-8'); - $sheet->setColumn(0,20,20); - $separator="~|"; - } - /** - * Start generating - */ - - // creates array of post variable names - for (reset($_POST); $key=key($_POST); next($_POST)) { $postvars[]=$key;} - - $aQuestionMap=array(); - foreach ($fieldmap as $field) - { - if(isset($field['qid']) && $field['qid']!='') - $aQuestionMap[]=$field['sid'].'X'.$field['gid'].'X'.$field['qid']; - } - - /* - * Iterate through postvars to create "nice" data for SQL later. - * - * Remember there might be some filters applied which have to be put into an SQL statement - */ - if(isset($postvars)) - - foreach ($postvars as $pv) - { - //Only do this if there is actually a value for the $pv - if (in_array($pv, $allfields) || in_array(substr($pv,1),$aQuestionMap) || in_array($pv,$aQuestionMap) || (($pv[0]=='D' || $pv[0]=='N' || $pv[0]=='K') && in_array(substr($pv,1,strlen($pv)-2),$aQuestionMap))) - { - $firstletter=substr($pv,0,1); - /* - * these question types WON'T be handled here: - * M = Multiple choice - * T - Long Free Text - * Q - Multiple Short Text - * D - Date - * N - Numerical Input - * | - File Upload - * K - Multiple Numerical Input - */ - if ($pv != "sid" && $pv != "display" && $firstletter != "M" && $firstletter != "P" && $firstletter != "T" && - $firstletter != "Q" && $firstletter != "D" && $firstletter != "N" && $firstletter != "K" && $firstletter != "|" && - $pv != "summary" && substr($pv, 0, 2) != "id" && substr($pv, 0, 9) != "datestamp") //pull out just the fieldnames - { - //put together some SQL here - $thisquestion = db_quote_id($pv)." IN ("; - - foreach ($_POST[$pv] as $condition) - { - $thisquestion .= "'$condition', "; - } - - $thisquestion = substr($thisquestion, 0, -2) - . ")"; - - //we collect all the to be selected data in this array - $selects[]=$thisquestion; - } - - //M - Multiple choice - //P - Multiple choice with comments - elseif ($firstletter == "M" || $firstletter == "P") - { - $mselects=array(); - //create a list out of the $pv array - list($lsid, $lgid, $lqid) = explode("X", $pv); - - $aquery="SELECT title FROM ".db_table_name("questions")." WHERE parent_qid=$lqid AND language='{$language}' and scale_id=0 ORDER BY question_order"; - $aresult=db_execute_num($aquery) or safe_die ("Couldn't get subquestions
    $aquery
    ".$connect->ErrorMsg()); - - // go through every possible answer - while ($arow=$aresult->FetchRow()) - { - // only add condition if answer has been chosen - if (in_array($arow[0], $_POST[$pv])) - { - $mselects[]=db_quote_id(substr($pv, 1, strlen($pv)).$arow[0])." = 'Y'"; - } - } - if ($mselects) - { - $thismulti=implode(" OR ", $mselects); - $selects[]="($thismulti)"; - $mselects = ""; - } - } - - - //N - Numerical Input - //K - Multiple Numerical Input - elseif ($firstletter == "N" || $firstletter == "K") - { - //value greater than - if (substr($pv, strlen($pv)-1, 1) == "G" && $_POST[$pv] != "") - { - $selects[]=db_quote_id(substr($pv, 1, -1))." > ".sanitize_int($_POST[$pv]); - } - - //value less than - if (substr($pv, strlen($pv)-1, 1) == "L" && $_POST[$pv] != "") - { - $selects[]=db_quote_id(substr($pv, 1, -1))." < ".sanitize_int($_POST[$pv]); - } - } - - //| - File Upload Question Type - else if ($firstletter == "|") - { - // no. of files greater than - if (substr($pv, strlen($pv)-1, 1) == "G" && $_POST[$pv] != "") - $selects[]=db_quote_id(substr($pv, 1, -1)."_filecount")." > ".sanitize_int($_POST[$pv]); - - // no. of files less than - if (substr($pv, strlen($pv)-1, 1) == "L" && $_POST[$pv] != "") - $selects[]=db_quote_id(substr($pv, 1, -1)."_filecount")." < ".sanitize_int($_POST[$pv]); - } - - //"id" is a built in field, the unique database id key of each response row - elseif (substr($pv, 0, 2) == "id") - { - if (substr($pv, strlen($pv)-1, 1) == "G" && $_POST[$pv] != "") - { - $selects[]=db_quote_id(substr($pv, 0, -1))." > '".$_POST[$pv]."'"; - } - if (substr($pv, strlen($pv)-1, 1) == "L" && $_POST[$pv] != "") - { - $selects[]=db_quote_id(substr($pv, 0, -1))." < '".$_POST[$pv]."'"; - } - } - - //T - Long Free Text - //Q - Multiple Short Text - elseif (($firstletter == "T" || $firstletter == "Q" ) && $_POST[$pv] != "") - { - $selectSubs = array(); - //We intepret and * and % as wildcard matches, and use ' OR ' and , as the seperators - $pvParts = explode(",",str_replace('*','%', str_replace(' OR ',',',$_POST[$pv]))); - if(is_array($pvParts) AND count($pvParts)){ - foreach($pvParts AS $pvPart){ - $selectSubs[]=db_quote_id(substr($pv, 1, strlen($pv)))." LIKE '".trim($pvPart)."'"; - } - if(count($selectSubs)){ - $selects[] = ' ('.implode(' OR ',$selectSubs).') '; - } - } - } - - //D - Date - elseif ($firstletter == "D" && $_POST[$pv] != "") - { - //Date equals - if (substr($pv, -1, 1) == "=") - { - $selects[]=db_quote_id(substr($pv, 1, strlen($pv)-2))." = '".$_POST[$pv]."'"; - } - else - { - //date less than - if (substr($pv, -1, 1) == "<") - { - $selects[]= db_quote_id(substr($pv, 1, strlen($pv)-2)) . " >= '".$_POST[$pv]."'"; - } - - //date greater than - if (substr($pv, -1, 1) == ">") - { - $selects[]= db_quote_id(substr($pv, 1, strlen($pv)-2)) . " <= '".$_POST[$pv]."'"; - } - } - } - - //check for datestamp of given answer - elseif (substr($pv, 0, 9) == "datestamp") - { - //timestamp equals - $formatdata=getDateFormatData($_SESSION['dateformat']); - if (substr($pv, -1, 1) == "E" && !empty($_POST[$pv])) - { - $datetimeobj = new Date_Time_Converter($_POST[$pv], $formatdata['phpdate'].' H:i'); - $_POST[$pv]=$datetimeobj->convert("Y-m-d"); - - $selects[] = db_quote_id('datestamp')." >= '".$_POST[$pv]." 00:00:00' and ".db_quote_id('datestamp')." <= '".$_POST[$pv]." 23:59:59'"; - } - else - { - //timestamp less than - if (substr($pv, -1, 1) == "L" && !empty($_POST[$pv])) - { - $datetimeobj = new Date_Time_Converter($_POST[$pv], $formatdata['phpdate'].' H:i'); - $_POST[$pv]=$datetimeobj->convert("Y-m-d H:i:s"); - $selects[]= db_quote_id('datestamp')." < '".$_POST[$pv]."'"; - } - - //timestamp greater than - if (substr($pv, -1, 1) == "G" && !empty($_POST[$pv])) - { - $datetimeobj = new Date_Time_Converter($_POST[$pv], $formatdata['phpdate'].' H:i'); - $_POST[$pv]=$datetimeobj->convert("Y-m-d H:i:s"); - $selects[]= db_quote_id('datestamp')." > '".$_POST[$pv]."'"; - } - } - } - } - else - { - $statisticsoutput .= ""; - } - - } //end foreach -> loop through filter options to create SQL - - //count number of answers - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid"); - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $query .= " JOIN `case` AS c ON ({$dbprefix}survey_$surveyid.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $query .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - //if incompleted answers should be filtert submitdate has to be not null - if (incompleteAnsFilterstate() == "inc") {$query .= " WHERE submitdate is null";} - elseif (incompleteAnsFilterstate() == "filter") {$query .= " WHERE submitdate is not null";} - $result = db_execute_num($query) or safe_die ("Couldn't get total
    $query
    ".$connect->ErrorMsg()); - - //$total = total number of answers - while ($row=$result->FetchRow()) {$total=$row[0];} - - //are there any filters that have to be taken care of? - if (isset($selects) && $selects) - { - //filter incomplete answers? - if (incompleteAnsFilterstate() == "filter" || incompleteAnsFilterstate() == "inc") {$query .= " AND ";} - - else {$query .= " WHERE ";} - - //add filter criteria to SQL - $query .= implode(" AND ", $selects); - } - - - //get me some data Scotty - $result=db_execute_num($query) or safe_die("Couldn't get results
    $query
    ".$connect->ErrorMsg()); - - //put all results into $results - while ($row=$result->FetchRow()) {$results=$row[0];} - - if ($total) - { - $percent=sprintf("%01.2f", ($results/$total)*100); - - } - switch($outputType) - { - case "xls": - $xlsRow = 0; - $sheet->write($xlsRow,0,$statlang->gT("Number of records in this query:",'unescaped')); - $sheet->write($xlsRow,1,$results); - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Total records in survey:",'unescaped')); - $sheet->write($xlsRow,1,$total); - - if($total) - { - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Percentage of total:",'unescaped')); - $sheet->write($xlsRow,1,$percent."%"); - } - - break; - case 'pdf': - - // add summary to pdf - $array = array(); - //$array[] = array($statlang->gT("Results"),""); - $array[] = array($statlang->gT("Number of records in this query:",'unescaped'), $results); - $array[] = array($statlang->gT("Total records in survey:",'unescaped'), $total); - - if($total) - $array[] = array($statlang->gT("Percentage of total:",'unescaped'), $percent."%"); - - $pdf->addPage('P','A4'); - - $pdf->Bookmark($pdf->delete_html($statlang->gT("Results",'unescaped')), 0, 0); - $pdf->titleintopdf($statlang->gT("Results",'unescaped'),$statlang->gT("Survey",'unescaped')." ".$surveyid); - $pdf->tableintopdf($array); - - $pdf->addPage('P','A4'); - - break; - case 'html': - - $statisticsoutput .= "
    \n\n" - ."\t\n" - ."\t' - ."\n" - ."\t' - ."\n"; - - //only calculate percentage if $total is set - if ($total) - { - $percent=sprintf("%01.2f", ($results/$total)*100); - $statisticsoutput .= "\t' - ."\n"; - } - $statisticsoutput .="
    ".$statlang->gT("Results")."
    ".$statlang->gT("Number of records in this query:").'$results
    ".$statlang->gT("Total records in survey:").'$total
    ".$statlang->gT("Percentage of total:").'$percent%
    \n"; - - break; - default: - - - break; - } - - //put everything from $selects array into a string connected by AND - if (isset ($selects) && $selects) {$sql=implode(" AND ", $selects);} - - elseif (!empty($newsql)) {$sql = $newsql;} - - if (!isset($sql) || !$sql) {$sql="NULL";} - - //only continue if we have something to output - if ($results > 0) - { - if($outputType=='html' && $browse === true) - { - $_SESSION['sql']=$sql; - //add a buttons to browse results - $statisticsoutput .= "
    \n" - ."\t\t

    " - ."\t\t\t\n" - ."\t\t\t\n" - ."\t\t\t\n" - ."\t\t

    " - ."\t\t
    \n"; - } - } //end if (results > 0) - - //Show Summary results - if (isset($summary) && $summary) - { - //let's run through the survey - $runthrough=$summary; - - //START Chop up fieldname and find matching questions - - //GET LIST OF LEGIT QIDs FOR TESTING LATER - $lq = "SELECT DISTINCT qid FROM ".db_table_name("questions")." WHERE sid=$surveyid and parent_qid=0"; - $lr = db_execute_assoc($lq); - - //loop through the IDs - while ($lw = $lr->FetchRow()) - { - //this creates an array of question id's' - $legitqids[] = $lw['qid']; - } - - //loop through all selected questions - foreach ($runthrough as $rt) - { - - $firstletter = substr($rt, 0, 1); - // 1. Get answers for question ############################################################## - - //M - Multiple choice, therefore multiple fields - if ($firstletter == "M" || $firstletter == "P") - { - //get SGQ data - list($qsid, $qgid, $qqid) = explode("X", substr($rt, 1, strlen($rt)), 3); - - //select details for this question - $nquery = "SELECT title, type, question, parent_qid, other FROM ".db_table_name("questions")." WHERE language='{$language}' AND parent_qid=0 AND qid='$qqid'"; - $nresult = db_execute_num($nquery) or safe_die ("Couldn't get question
    $nquery
    ".$connect->ErrorMsg()); - - //loop through question data - while ($nrow=$nresult->FetchRow()) - { - $qtitle=$nrow[0]; - $qtype=$nrow[1]; - $qquestion=FlattenText($nrow[2]); - $qlid=$nrow[3]; - $qother=$nrow[4]; - } - - //1. Get list of answers - $query="SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$qqid' AND language='{$language}' and scale_id=0 ORDER BY question_order"; - $result=db_execute_num($query) or safe_die("Couldn't get list of subquestions for multitype
    $query
    ".$connect->ErrorMsg()); - - //loop through multiple answers - while ($row=$result->FetchRow()) - { - $mfield=substr($rt, 1, strlen($rt))."$row[0]"; - - //create an array containing answer code, answer and fieldname(??) - $alist[]=array("$row[0]", FlattenText($row[1]), $mfield); - } - - //check "other" field. is it set? - if ($qother == "Y") - { - $mfield=substr($rt, 1, strlen($rt))."other"; - - //create an array containing answer code, answer and fieldname(??) - $alist[]=array($statlang->gT("Other"), $statlang->gT("Other"), $mfield); - } - } - - - //S - Short Free Text - //T - Long Free Text - elseif ($firstletter == "T" || $firstletter == "S") //Short and long text - { - - //search for key - $fld = substr($rt, 1, strlen($rt)); - $fielddata=$fieldmap[$fld]; - - //get SGQA IDs - $qsid=$fielddata['sid']; - $qgid=$fielddata['gid']; - $qqid=$fielddata['qid']; - - - list($qanswer, $qlid)=!empty($fielddata['aid']) ? explode("_", $fielddata['aid']) : array("", ""); - //get SGQ data - //list($qsid, $qgid, $qqid) = explode("X", substr($rt, 1, strlen($rt)), 3); - - - //get question data - $nquery = "SELECT title, type, question, other, parent_qid FROM ".db_table_name("questions")." WHERE parent_qid=0 AND qid='$qqid' AND language='{$language}'"; - $nresult = db_execute_num($nquery) or safe_die("Couldn't get text question
    $nquery
    ".$connect->ErrorMsg()); - - //loop through question data - while ($nrow=$nresult->FetchRow()) - { - $qtitle=FlattenText($nrow[0]); - $qtype=$nrow[1]; - $qquestion=FlattenText($nrow[2]); - $nlid=$nrow[4]; - } - - $mfield=substr($rt, 1, strlen($rt)); - - //Text questions either have an answer, or they don't. There's no other way of quantising the results. - // So, instead of building an array of predefined answers like we do with lists & other types, - // we instead create two "types" of possible answer - either there is a response.. or there isn't. - // This question type then can provide a % of the question answered in the summary. - $alist[]=array("Answers", $statlang->gT("Answer"), $mfield); - $alist[]=array("NoAnswer", $statlang->gT("No answer"), $mfield); - } - - - //Multiple short text - elseif ($firstletter == "Q") - { - //get SGQ data - list($qsid, $qgid, $qqid) = explode("X", substr($rt, 1, strlen($rt)), 3); - - //separating another ID - $tmpqid=substr($qqid, 0, strlen($qqid)-1); - - //check if we have legid QIDs. if not create them by substringing - while (!in_array ($tmpqid,$legitqids)) $tmpqid=substr($tmpqid, 0, strlen($tmpqid)-1); - - //length of QID - $qidlength=strlen($tmpqid); - - //we somehow get the answer code (see SQL later) from the $qqid - $qaid=substr($qqid, $qidlength, strlen($qqid)-$qidlength); - - //get some question data - $nquery = "SELECT title, type, question, other FROM ".db_table_name("questions")." WHERE qid='".substr($qqid, 0, $qidlength)."' AND parent_qid=0 AND language='{$language}'"; - $nresult = db_execute_num($nquery) or safe_die("Couldn't get text question
    $nquery
    ".$connect->ErrorMsg()); - - //more substrings - $count = substr($qqid, strlen($qqid)-1); - - //loop through question data - while ($nrow=$nresult->FetchRow()) - { - $qtitle=FlattenText($nrow[0]).'-'.$count; - $qtype=$nrow[1]; - $qquestion=FlattenText($nrow[2]); - } - - //get answers - $qquery = "SELECT title as code, question as answer FROM ".db_table_name("questions")." WHERE parent_qid='".substr($qqid, 0, $qidlength)."' AND title='$qaid' AND language='{$language}' ORDER BY question_order"; - $qresult=db_execute_num($qquery) or safe_die ("Couldn't get answer details (Array 5p Q)
    $qquery
    ".$connect->ErrorMsg()); - - //loop through answer data - while ($qrow=$qresult->FetchRow()) - { - //store each answer here - $atext=FlattenText($qrow[1]); - } - - //add this to the question title - $qtitle .= " [$atext]"; - - //even more substrings... - $mfield=substr($rt, 1, strlen($rt)); - - //Text questions either have an answer, or they don't. There's no other way of quantising the results. - // So, instead of building an array of predefined answers like we do with lists & other types, - // we instead create two "types" of possible answer - either there is a response.. or there isn't. - // This question type then can provide a % of the question answered in the summary. - $alist[]=array("Answers", $statlang->gT("Answer"), $mfield); - $alist[]=array("NoAnswer", $statlang->gT("No answer"), $mfield); - } - - - //RANKING OPTION THEREFORE CONFUSING - elseif ($firstletter == "R") - { - //getting the needed IDs somehow - $lengthofnumeral=substr($rt, strpos($rt, "-")+1, 1); - list($qsid, $qgid, $qqid) = explode("X", substr($rt, 1, strpos($rt, "-")-($lengthofnumeral+1)), 3); - - //get question data - $nquery = "SELECT title, type, question FROM ".db_table_name("questions")." WHERE parent_qid=0 AND qid='$qqid' AND language='{$language}'"; - $nresult = db_execute_num($nquery) or safe_die ("Couldn't get question
    $nquery
    ".$connect->ErrorMsg()); - - //loop through question data - while ($nrow=$nresult->FetchRow()) - { - $qtitle=FlattenText($nrow[0]). " [".substr($rt, strpos($rt, "-")-($lengthofnumeral), $lengthofnumeral)."]"; - $qtype=$nrow[1]; - $qquestion=FlattenText($nrow[2]). "[".$statlang->gT("Ranking")." ".substr($rt, strpos($rt, "-")-($lengthofnumeral), $lengthofnumeral)."]"; - } - - //get answers - $query="SELECT code, answer FROM ".db_table_name("answers")." WHERE qid='$qqid' AND scale_id=0 AND language='{$language}' ORDER BY sortorder, answer"; - $result=db_execute_num($query) or safe_die("Couldn't get list of answers for multitype
    $query
    ".$connect->ErrorMsg()); - - //loop through answers - while ($row=$result->FetchRow()) - { - //create an array containing answer code, answer and fieldname(??) - $mfield=substr($rt, 1, strpos($rt, "-")-1); - $alist[]=array("$row[0]", FlattenText($row[1]), $mfield); - } - } - - else if ($firstletter == "|") // File UPload - { - - //get SGQ data - list($qsid, $qgid, $qqid) = explode("X", substr($rt, 1, strlen($rt)), 3); - - //select details for this question - $nquery = "SELECT title, type, question, parent_qid, other FROM ".db_table_name("questions")." WHERE language='{$language}' AND parent_qid=0 AND qid='$qqid'"; - $nresult = db_execute_num($nquery) or safe_die ("Couldn't get question
    $nquery
    ".$connect->ErrorMsg()); - - //loop through question data - while ($nrow=$nresult->FetchRow()) - { - $qtitle=$nrow[0]; - $qtype=$nrow[1]; - $qquestion=FlattenText($nrow[2]); - $qlid=$nrow[3]; - $qother=$nrow[4]; - } - - /* - 4) Average size of file per respondent - 5) Average no. of files - 5) Summary/count of file types (ie: 37 jpg, 65 gif, 12 png) - 6) Total size of all files (useful if you're about to download them all) - 7) You could also add things like smallest file size, largest file size, median file size - 8) no. of files corresponding to each extension - 9) max file size - 10) min file size - */ - - // 1) Total number of files uploaded - // 2) Number of respondents who uploaded at least one file (with the inverse being the number of respondents who didnt upload any) - $fieldname=substr($rt, 1, strlen($rt)); - $query = "SELECT SUM(".db_quote_id($fieldname.'_filecount').") as sum, AVG(".db_quote_id($fieldname.'_filecount').") as avg FROM ".db_table_name("survey_$surveyid"); - $result=db_execute_assoc($query) or safe_die("Couldn't fetch the records
    $query
    ".$connect->ErrorMsg()); - - $showem = array(); - - while ($row = $result->FetchRow()) - { - $showem[]=array($statlang->gT("Total number of files"), $row['sum']); - $showem[]=array($statlang->gT("Average no. of files per respondent"), $row['avg']); - } - - - $query = "SELECT ". $fieldname ." as json FROM ".db_table_name("survey_$surveyid"); - $result=db_execute_assoc($query) or safe_die("Couldn't fetch the records
    $query
    ".$connect->ErrorMsg()); - - $responsecount = 0; - $filecount = 0; - $size = 0; - - while ($row = $result->FetchRow()) - { - - $json = $row['json']; - $phparray = json_decode($json); - - foreach ($phparray as $metadata) - { - $size += (int) $metadata->size; - $filecount++; - } - $responsecount++; - } - $showem[] = array($statlang->gT("Total size of files"), $size." KB"); - $showem[] = array($statlang->gT("Average file size"), $size/$filecount . " KB"); - $showem[] = array($statlang->gT("Average size per respondent"), $size/$responsecount . " KB"); - - /* $query="SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$qqid' AND language='{$language}' ORDER BY question_order"; - $result=db_execute_num($query) or safe_die("Couldn't get list of subquestions for multitype
    $query
    ".$connect->ErrorMsg()); - - //loop through multiple answers - while ($row=$result->FetchRow()) - { - $mfield=substr($rt, 1, strlen($rt))."$row[0]"; - - //create an array containing answer code, answer and fieldname(??) - $alist[]=array("$row[0]", FlattenText($row[1]), $mfield); - } - - */ - //outputting - switch($outputType) - { - case 'xls': - - $headXLS = array(); - $tableXLS = array(); - $footXLS = array(); - - $xlsTitle = sprintf($statlang->gT("Field summary for %s"),html_entity_decode($qtitle,ENT_QUOTES,'UTF-8')); - $xlsDesc = html_entity_decode($qquestion,ENT_QUOTES,'UTF-8'); - ++$xlsRow; - ++$xlsRow; - - ++$xlsRow; - $sheet->setCellValueByColumnAndRow(0,$xlsRow,$xlsTitle); - ++$xlsRow; - $sheet->setCellValueByColumnAndRow(0,$xlsRow,$xlsDesc); - - $headXLS[] = array($statlang->gT("Calculation"),$statlang->gT("Result")); - ++$xlsRow; - $sheet->setCellValueByColumnAndRow(0, $xlsRow,$statlang->gT("Calculation")); - $sheet->setCellValueByColumnAndRow(1, $xlsRow,$statlang->gT("Result")); - - break; - case 'pdf': - - $headPDF = array(); - $tablePDF = array(); - $footPDF = array(); - - $pdfTitle = sprintf($statlang->gT("Field summary for %s"),html_entity_decode($qtitle,ENT_QUOTES,'UTF-8')); - $titleDesc = html_entity_decode($qquestion,ENT_QUOTES,'UTF-8'); - - $headPDF[] = array($statlang->gT("Calculation"),$statlang->gT("Result")); - - break; - - case 'html': - - $statisticsoutput .= "\n\n" - ."\t\n" - ."\t\n" - ."\t\n\t\t\n" - ."\t\t\n" - ."\t\n"; - - foreach ($showem as $res) - $statisticsoutput .= ""; - break; - - default: - break; - } - } - - //N = numerical input - //K = multiple numerical input - elseif ($firstletter == "N" || $firstletter == "K") //NUMERICAL TYPE - { - //Zero handling - if (!isset($excludezeros)) //If this hasn't been set, set it to on as default: - { - $excludezeros=1; - } - //check last character, greater/less/equals don't need special treatment - if (substr($rt, -1) == "G" || substr($rt, -1) == "L" || substr($rt, -1) == "=") - { - //DO NOTHING - } - else - { - //create SGQ identifier - list($qsid, $qgid, $qqid) = explode("X", $rt, 3); - - //multiple numerical input - if($firstletter == "K") - { - // This is a multiple numerical question so we need to strip of the answer id to find the question title - $tmpqid=substr($qqid, 0, strlen($qqid)-1); - - //did we get a valid ID? - while (!in_array ($tmpqid,$legitqids)) - $tmpqid=substr($tmpqid, 0, strlen($tmpqid)-1); - - //check lenght of ID - $qidlength=strlen($tmpqid); - - //get answer ID from qid - $qaid=substr($qqid, $qidlength, strlen($qqid)-$qidlength); - - //get question details from DB - $nquery = "SELECT title, type, question, qid, parent_qid - FROM ".db_table_name("questions")." - WHERE parent_qid=0 AND qid='".substr($qqid, 0, $qidlength)."' - AND language='{$language}'"; - $nresult = db_execute_num($nquery) or safe_die("Couldn't get text question
    $nquery
    ".$connect->ErrorMsg()); - } - - //probably question type "N" = numerical input - else - { - //we can use the qqid without any editing - $nquery = "SELECT title, type, question, qid, parent_qid FROM ".db_table_name("questions")." WHERE parent_qid=0 AND qid='$qqid' AND language='{$language}'"; - $nresult = db_execute_num($nquery) or safe_die ("Couldn't get question
    $nquery
    ".$connect->ErrorMsg()); - } - - //loop through results - while ($nrow=$nresult->FetchRow()) - { - $qtitle=FlattenText($nrow[0]); //clean up title - $qtype=$nrow[1]; - $qquestion=FlattenText($nrow[2]); - $qiqid=$nrow[3]; - $qlid=$nrow[4]; - } - - //Get answer texts for multiple numerical - if(substr($rt, 0, 1) == "K") - { - //get answer data - $atext=$connect->GetOne("SELECT question FROM ".db_table_name("questions")." WHERE parent_qid='{$qiqid}' AND scale_id=0 AND title='{$qaid}' AND language='{$language}'"); - //put single items in brackets at output - $qtitle .= " [$atext]"; - } - - //outputting - switch($outputType) - { - case 'xls': - - $headXLS = array(); - $tableXLS = array(); - $footXLS = array(); - - $xlsTitle = sprintf($statlang->gT("Field summary for %s"),html_entity_decode($qtitle,ENT_QUOTES,'UTF-8')); - $xlsDesc = html_entity_decode($qquestion,ENT_QUOTES,'UTF-8'); - ++$xlsRow; - ++$xlsRow; - - ++$xlsRow; - $sheet->write($xlsRow, 0,$xlsTitle); - ++$xlsRow; - $sheet->write($xlsRow, 0,$xlsDesc); - - $headXLS[] = array($statlang->gT("Calculation"),$statlang->gT("Result")); - ++$xlsRow; - $sheet->write($xlsRow, 0,$statlang->gT("Calculation")); - $sheet->write($xlsRow, 1,$statlang->gT("Result")); - - break; - case 'pdf': - - $headPDF = array(); - $tablePDF = array(); - $footPDF = array(); - - $pdfTitle = sprintf($statlang->gT("Field summary for %s"),html_entity_decode($qtitle,ENT_QUOTES,'UTF-8')); - $titleDesc = html_entity_decode($qquestion,ENT_QUOTES,'UTF-8'); - - $headPDF[] = array($statlang->gT("Calculation"),$statlang->gT("Result")); - - break; - case 'html': - - $statisticsoutput .= "\n
    ".sprintf($statlang->gT("Field summary for %s"),$qtitle).":" - ."
    $qquestion
    " - .$statlang->gT("Calculation")."" - .$statlang->gT("Result")."
    ".$res[0]."".$res[1]."
    \n" - ."\t\n" - ."\t\n" - ."\t\n\t\t\n" - ."\t\t\n" - ."\t\n"; - - break; - default: - - - break; - } - - //this field is queried using mathematical functions - $fieldname=substr($rt, 1, strlen($rt)); - - //special treatment for MS SQL databases - if ($connect->databaseType == 'odbc_mssql' || $connect->databaseType == 'odbtp' || $connect->databaseType == 'mssql_n' || $connect->databaseType == 'mssqlnative') - { - //standard deviation - $query = "SELECT STDEVP(".db_quote_id($fieldname)."*1) as stdev"; - } - - //other databases (MySQL, Postgres) - else - { - //standard deviation - $query = "SELECT STDDEV(".db_quote_id($fieldname).") as stdev"; - } - - //sum - $query .= ", SUM(".db_quote_id($fieldname)."*1) as sum"; - - //average - $query .= ", AVG(".db_quote_id($fieldname)."*1) as average"; - - //min - $query .= ", MIN(".db_quote_id($fieldname)."*1) as minimum"; - - //max - $query .= ", MAX(".db_quote_id($fieldname)."*1) as maximum"; - //Only select responses where there is an actual number response, ignore nulls and empties (if these are included, they are treated as zeroes, and distort the deviation/mean calculations) - - $query .= " FROM ".db_table_name("survey_$surveyid"); - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $query .= " JOIN `case` AS c ON ({$dbprefix}survey_$surveyid.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $query .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - - $query .= " WHERE ".db_quote_id($fieldname)." IS NOT NULL"; - - - //special treatment for MS SQL databases - if ($connect->databaseType == 'odbc_mssql' || $connect->databaseType == 'odbtp' || $connect->databaseType == 'mssql_n' || $connect->databaseType == 'mssqlnative') - { - if(!$excludezeros) - { - //NO ZERO VALUES - $query .= " AND (".db_quote_id($fieldname)." <> 0)"; - } - } - - //other databases (MySQL, Postgres) - else - { - if(!$excludezeros) - { - //NO ZERO VALUES - $query .= " AND (".db_quote_id($fieldname)." != 0)"; - } - } - - //filter incomplete answers if set - if (incompleteAnsFilterstate() == "inc") {$query .= " AND submitdate is null";} - elseif (incompleteAnsFilterstate() == "filter") {$query .= " AND submitdate is not null";} - - //$sql was set somewhere before - if ($sql != "NULL") {$query .= " AND $sql";} - - //execute query - $result=db_execute_assoc($query) or safe_die("Couldn't do maths testing
    $query
    ".$connect->ErrorMsg()); - - //get calculated data - while ($row=$result->FetchRow()) - { - //put translation of mean and calculated data into $showem array - $showem[]=array($statlang->gT("Sum"), $row['sum']); - $showem[]=array($statlang->gT("Standard deviation"), round($row['stdev'],2)); - $showem[]=array($statlang->gT("Average"), round($row['average'],2)); - $showem[]=array($statlang->gT("Minimum"), $row['minimum']); - - //Display the maximum and minimum figures after the quartiles for neatness - $maximum=$row['maximum']; - $minimum=$row['minimum']; - } - - - - //CALCULATE QUARTILES - - //get data - $query ="SELECT ".db_quote_id($fieldname)." FROM ".db_table_name("survey_$surveyid"); - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $query .= " JOIN `case` AS c ON ({$dbprefix}survey_$surveyid.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $query .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - $query .= " WHERE ".db_quote_id($fieldname)." IS NOT null"; - - //NO ZEROES - if(!$excludezeros) - { - $query .= " AND ".db_quote_id($fieldname)." != 0"; - } - - //filtering enabled? - if (incompleteAnsFilterstate() == "inc") {$query .= " AND submitdate is null";} - elseif (incompleteAnsFilterstate() == "filter") {$query .= " AND submitdate is not null";} - - //if $sql values have been passed to the statistics script from another script, incorporate them - if ($sql != "NULL") {$query .= " AND $sql";} - - //execute query - $result=$connect->Execute($query) or safe_die("Disaster during median calculation
    $query
    ".$connect->ErrorMsg()); - - - $querystarter="SELECT ".db_quote_id($fieldname)." FROM ".db_table_name("survey_$surveyid"); - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $querystarter .= " JOIN `case` AS c ON ({$dbprefix}survey_$surveyid.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $querystarter .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - $querystarter.=" WHERE ".db_quote_id($fieldname)." IS NOT null"; - - - //No Zeroes - if(!$excludezeros) - { - $querystart .= " AND ".db_quote_id($fieldname)." != 0"; - } - //filtering enabled? - if (incompleteAnsFilterstate() == "inc") {$querystarter .= " AND submitdate is null";} - elseif (incompleteAnsFilterstate() == "filter") {$querystarter .= " AND submitdate is not null";} - - //if $sql values have been passed to the statistics script from another script, incorporate them - if ($sql != "NULL") {$querystarter .= " AND $sql";} - - //we just count the number of records returned - $medcount=$result->RecordCount(); - - //put the total number of records at the beginning of this array - array_unshift($showem, array($statlang->gT("Count"), $medcount)); - - - //no more comment from Mazi regarding the calculation - - // Calculating only makes sense with more than one result - if ($medcount>1) - { - //1ST QUARTILE (Q1) - $q1=(1/4)*($medcount+1); - $q1b=(int)((1/4)*($medcount+1)); - $q1c=$q1b-1; - $q1diff=$q1-$q1b; - $total=0; - - // fix if there are too few values to evaluate. - if ($q1c<0) {$q1c=0;} - - if ($q1 != $q1b) - { - //ODD NUMBER - $query = $querystarter . " ORDER BY ".db_quote_id($fieldname)."*1 "; - $result=db_select_limit_assoc($query, 2, $q1c) or safe_die("1st Quartile query failed
    ".$connect->ErrorMsg()); - - while ($row=$result->FetchRow()) - { - if ($total == 0) {$total=$total-$row[$fieldname];} - - else {$total=$total+$row[$fieldname];} - - $lastnumber=$row[$fieldname]; - } - - $q1total=$lastnumber-((1-$q1diff)*$total); - - if ($q1total < $minimum) {$q1total=$minimum;} - - $showem[]=array($statlang->gT("1st quartile (Q1)"), $q1total); - } - else - { - //EVEN NUMBER - $query = $querystarter . " ORDER BY ".db_quote_id($fieldname)."*1 "; - $result=db_select_limit_assoc($query,1, $q1c) or safe_die ("1st Quartile query failed
    ".$connect->ErrorMsg()); - - while ($row=$result->FetchRow()) - { - $showem[]=array($statlang->gT("1st quartile (Q1)"), $row[$fieldname]); - } - } - - $total=0; - - - //MEDIAN (Q2) - $median=(1/2)*($medcount+1); - $medianb=(int)((1/2)*($medcount+1)); - $medianc=$medianb-1; - $mediandiff=$median-$medianb; - - if ($median != $medianb) - { - //remainder - $query = $querystarter . " ORDER BY ".db_quote_id($fieldname)."*1 "; - $result=db_select_limit_assoc($query,2, $medianc) or safe_die("What a complete mess with the remainder
    $query
    ".$connect->ErrorMsg()); - - while - ( - $row=$result->FetchRow()) {$total=$total+$row[$fieldname]; - } - - $showem[]=array($statlang->gT("2nd quartile (Median)"), $total/2); - } - - else - { - //EVEN NUMBER - $query = $querystarter . " ORDER BY ".db_quote_id($fieldname)."*1 "; - $result=db_select_limit_assoc($query,1, $medianc-1) or safe_die("What a complete mess
    $query
    ".$connect->ErrorMsg()); - - while ($row=$result->FetchRow()) - { - $showem[]=array($statlang->gT("Median value"), $row[$fieldname]); - } - } - - $total=0; - - - //3RD QUARTILE (Q3) - $q3=(3/4)*($medcount+1); - $q3b=(int)((3/4)*($medcount+1)); - $q3c=$q3b-1; - $q3diff=$q3-$q3b; - - if ($q3 != $q3b) - { - $query = $querystarter . " ORDER BY ".db_quote_id($fieldname)."*1 "; - $result = db_select_limit_assoc($query,2,$q3c) or safe_die("3rd Quartile query failed
    ".$connect->ErrorMsg()); - - while ($row=$result->FetchRow()) - { - if ($total == 0) {$total=$total-$row[$fieldname];} - - else {$total=$total+$row[$fieldname];} - - $lastnumber=$row[$fieldname]; - } - $q3total=$lastnumber-((1-$q3diff)*$total); - - if ($q3total < $maximum) {$q1total=$maximum;} - - $showem[]=array($statlang->gT("3rd quartile (Q3)"), $q3total); - } - - else - { - $query = $querystarter . " ORDER BY ".db_quote_id($fieldname)."*1"; - $result = db_select_limit_assoc($query,1, $q3c) or safe_die("3rd Quartile even query failed
    ".$connect->ErrorMsg()); - - while ($row=$result->FetchRow()) - { - $showem[]=array($statlang->gT("3rd quartile (Q3)"), $row[$fieldname]); - } - } - - $total=0; - - $showem[]=array($statlang->gT("Maximum"), $maximum); - - //output results - foreach ($showem as $shw) - { - switch($outputType) - { - case 'xls': - - ++$xlsRow; - $sheet->write($xlsRow, 0,html_entity_decode($shw[0],ENT_QUOTES,'UTF-8')); - $sheet->write($xlsRow, 1,html_entity_decode($shw[1],ENT_QUOTES,'UTF-8')); - - - $tableXLS[] = array($shw[0],$shw[1]); - - break; - case 'pdf': - - $tablePDF[] = array(html_entity_decode($shw[0],ENT_QUOTES,'UTF-8'),html_entity_decode($shw[1],ENT_QUOTES,'UTF-8')); - - break; - case 'html': - - $statisticsoutput .= "\t\n" - ."\t\t\n" - ."\t\t\n" - ."\t\n"; - - break; - default: - - - break; - } - } - switch($outputType) - { - case 'xls': - - ++$xlsRow; - $sheet->write($xlsRow, 0,$statlang->gT("Null values are ignored in calculations")); - ++$xlsRow; - $sheet->write($xlsRow, 0,sprintf($statlang->gT("Q1 and Q3 calculated using %s"), $statlang->gT("minitab method"))); - - $footXLS[] = array($statlang->gT("Null values are ignored in calculations")); - $footXLS[] = array(sprintf($statlang->gT("Q1 and Q3 calculated using %s"), $statlang->gT("minitab method"))); - - break; - case 'pdf': - - $footPDF[] = array($statlang->gT("Null values are ignored in calculations")); - $footPDF[] = array(sprintf($statlang->gT("Q1 and Q3 calculated using %s"), "".$statlang->gT("minitab method")."")); - $pdf->addPage('P','A4'); - $pdf->Bookmark($pdf->delete_html($qquestion), 1, 0); - $pdf->titleintopdf($pdfTitle,$titleDesc); - - $pdf->headTable($headPDF, $tablePDF); - - $pdf->tablehead($footPDF); - - break; - case 'html': - - //footer of question type "N" - $statisticsoutput .= "\t\n" - ."\t\t\n" - ."\t\n
    ".sprintf($statlang->gT("Field summary for %s"),$qtitle).":" - ."
    $qquestion
    " - .$statlang->gT("Calculation")."" - .$statlang->gT("Result")."
    $shw[0]$shw[1]
    \n" - ."\t\t\t".$statlang->gT("Null values are ignored in calculations")."
    \n" - ."\t\t\t".sprintf($statlang->gT("Q1 and Q3 calculated using %s"), "".$statlang->gT("minitab method")."") - ."
    \n" - ."\t\t
    \n"; - - break; - default: - - - break; - } - - //clean up - unset($showem); - - } //end if (enough results?) - - //not enough (<1) results for calculation - else - { - switch($outputType) - { - case 'xls': - - $tableXLS = array(); - $tableXLS[] = array($statlang->gT("Not enough values for calculation")); - - ++$xlsRow; - $sheet->write($xlsRow, 0, $statlang->gT("Not enough values for calculation")); - - - - break; - case 'pdf': - - $tablePDF = array(); - $tablePDF[] = array($statlang->gT("Not enough values for calculation")); - $pdf->addPage('P','A4'); - $pdf->Bookmark($pdf->delete_html($qquestion), 1, 0); - $pdf->titleintopdf($pdfTitle,$titleDesc); - - $pdf->equalTable($tablePDF); - - break; - case 'html': - - //output - $statisticsoutput .= "\t\n" - ."\t\t".$statlang->gT("Not enough values for calculation")."\n" - ."\t\n
    \n"; - - break; - default: - - - break; - } - - unset($showem); - - } - - } //end else -> check last character, greater/less/equals don't need special treatment - - } //end else-if -> multiple numerical types - - //is there some "id", "datestamp" or "D" within the type? - elseif (substr($rt, 0, 2) == "id" || substr($rt, 0, 9) == "datestamp" || ($firstletter == "D")) - { - /* - * DON'T show anything for date questions - * because there aren't any statistics implemented yet! - * - * See bug report #2539 and - * feature request #2620 - */ - } - - - // NICE SIMPLE SINGLE OPTION ANSWERS - else - { - //search for key - $fielddata=$fieldmap[$rt]; - //print_r($fielddata); - //get SGQA IDs - $qsid=$fielddata['sid']; - $qgid=$fielddata['gid']; - $qqid=$fielddata['qid']; - $qanswer=$fielddata['aid']; - - //question type - $qtype=$fielddata['type']; - - //question string - $qastring=$fielddata['question']; - - //question ID - $rqid=$qqid; - - //get question data - $nquery = "SELECT title, type, question, qid, parent_qid, other FROM ".db_table_name("questions")." WHERE qid='{$rqid}' AND parent_qid=0 and language='{$language}'"; - $nresult = db_execute_num($nquery) or safe_die ("Couldn't get question
    $nquery
    ".$connect->ErrorMsg()); - - //loop though question data - while ($nrow=$nresult->FetchRow()) - { - $qtitle=FlattenText($nrow[0]); - $qtype=$nrow[1]; - $qquestion=FlattenText($nrow[2]); - $qiqid=$nrow[3]; - $qparentqid=$nrow[4]; - $qother=$nrow[5]; - } - - //check question types - switch($qtype) - { - //Array of 5 point choices (several items to rank!) - case "A": - - //get data - $qquery = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$qiqid' AND title='$qanswer' AND language='{$language}' ORDER BY question_order"; - $qresult=db_execute_num($qquery) or safe_die ("Couldn't get answer details (Array 5p Q)
    $qquery
    ".$connect->ErrorMsg()); - - //loop through results - while ($qrow=$qresult->FetchRow()) - { - //5-point array - for ($i=1; $i<=5; $i++) - { - //add data - $alist[]=array("$i", "$i"); - } - //add counter - $atext=FlattenText($qrow[1]); - } - - //list IDs and answer codes in brackets - $qquestion .= $linefeed."[".$atext."]"; - $qtitle .= "($qanswer)"; - break; - - - - //Array of 10 point choices - //same as above just with 10 items - case "B": - $qquery = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$qiqid' AND title='$qanswer' AND language='{$language}' ORDER BY question_order"; - $qresult=db_execute_num($qquery) or safe_die ("Couldn't get answer details (Array 10p Q)
    $qquery
    ".$connect->ErrorMsg()); - while ($qrow=$qresult->FetchRow()) - { - for ($i=1; $i<=10; $i++) - { - $alist[]=array("$i", "$i"); - } - $atext=FlattenText($qrow[1]); - } - - $qquestion .= $linefeed."[".$atext."]"; - $qtitle .= "($qanswer)"; - break; - - - - //Array of Yes/No/$statlang->gT("Uncertain") - case "C": - $qquery = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$qiqid' AND title='$qanswer' AND language='{$language}' ORDER BY question_order"; - $qresult=db_execute_num($qquery) or safe_die ("Couldn't get answer details
    $qquery
    ".$connect->ErrorMsg()); - - //loop thorugh results - while ($qrow=$qresult->FetchRow()) - { - //add results - $alist[]=array("Y", $statlang->gT("Yes")); - $alist[]=array("N", $statlang->gT("No")); - $alist[]=array("U", $statlang->gT("Uncertain")); - $atext=FlattenText($qrow[1]); - } - //output - $qquestion .= $linefeed."[".$atext."]"; - $qtitle .= "($qanswer)"; - break; - - - - //Array of Yes/No/$statlang->gT("Uncertain") - //same as above - case "E": - $qquery = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$qiqid' AND title='$qanswer' AND language='{$language}' ORDER BY question_order"; - $qresult=db_execute_num($qquery) or safe_die ("Couldn't get answer details
    $qquery
    ".$connect->ErrorMsg()); - while ($qrow=$qresult->FetchRow()) - { - $alist[]=array("I", $statlang->gT("Increase")); - $alist[]=array("S", $statlang->gT("Same")); - $alist[]=array("D", $statlang->gT("Decrease")); - $atext=FlattenText($qrow[1]); - } - $qquestion .= $linefeed."[".$atext."]"; - $qtitle .= "($qanswer)"; - break; - - - case ";": //Array (Multi Flexi) (Text) - list($qacode, $licode)=explode("_", $qanswer); - - $qquery = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$qiqid' AND title='$qacode' AND language='{$language}' ORDER BY question_order"; - $qresult=db_execute_num($qquery) or die ("Couldn't get answer details
    $qquery
    ".$connect->ErrorMsg()); - - while ($qrow=$qresult->FetchRow()) - { - $fquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid='{$qiqid}' AND scale_id=0 AND code = '{$licode}' AND language='{$language}'ORDER BY sortorder, code"; - $fresult = db_execute_assoc($fquery); - while ($frow=$fresult->FetchRow()) - { - $alist[]=array($frow['code'], $frow['answer']); - $ltext=$frow['answer']; - } - $atext=FlattenText($qrow[1]); - } - - $qquestion .= $linefeed."[".$atext."] [".$ltext."]"; - $qtitle .= "($qanswer)"; - break; - - - case ":": //Array (Multiple Flexi) (Numbers) - $qidattributes=getQuestionAttributes($qiqid); - if (trim($qidattributes['multiflexible_max'])!='') { - $maxvalue=$qidattributes['multiflexible_max']; - } - else { - $maxvalue=10; - } - - if (trim($qidattributes['multiflexible_min'])!='') - { - $minvalue=$qidattributes['multiflexible_min']; - } - else { - $minvalue=1; - } - - if (trim($qidattributes['multiflexible_step'])!='') - { - $stepvalue=$qidattributes['multiflexible_step']; - } - else { - $stepvalue=1; - } - - if ($qidattributes['multiflexible_checkbox']!=0) { - $minvalue=0; - $maxvalue=1; - $stepvalue=1; - } - - for($i=$minvalue; $i<=$maxvalue; $i+=$stepvalue) - { - $alist[]=array($i, $i); - } - - $qquestion .= $linefeed."[".$fielddata['subquestion1']."] [".$fielddata['subquestion2']."]"; - list($myans, $mylabel)=explode("_", $qanswer); - $qtitle .= "[$myans][$mylabel]"; - break; - - case "F": //Array of Flexible - case "H": //Array of Flexible by Column - $qquery = "SELECT title, question FROM ".db_table_name("questions")." WHERE parent_qid='$qiqid' AND title='$qanswer' AND language='{$language}' ORDER BY question_order"; - $qresult=db_execute_num($qquery) or safe_die ("Couldn't get answer details
    $qquery
    ".$connect->ErrorMsg()); - - //loop through answers - while ($qrow=$qresult->FetchRow()) - { - //this question type uses its own labels - $fquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid='{$qiqid}' AND scale_id=0 AND language='{$language}'ORDER BY sortorder, code"; - $fresult = db_execute_assoc($fquery); - - //add code and title to results for outputting them later - while ($frow=$fresult->FetchRow()) - { - $alist[]=array($frow['code'], FlattenText($frow['answer'])); - } - - //counter - $atext=FlattenText($qrow[1]); - } - - //output - $qquestion .= $linefeed."[".$atext."]"; - $qtitle .= "($qanswer)"; - break; - - - - case "G": //Gender - $alist[]=array("F", $statlang->gT("Female")); - $alist[]=array("M", $statlang->gT("Male")); - break; - - - - case "Y": //Yes\No - $alist[]=array("Y", $statlang->gT("Yes")); - $alist[]=array("N", $statlang->gT("No")); - break; - - - - case "I": //Language - // Using previously defined $surveylanguagecodes array of language codes - foreach ($surveylanguagecodes as $availlang) - { - $alist[]=array($availlang, getLanguageNameFromCode($availlang,false)); - } - break; - - - case "5": //5 Point (just 1 item to rank!) - for ($i=1; $i<=5; $i++) - { - $alist[]=array("$i", "$i"); - } - break; - - - case "1": //array (dual scale) - - $sSubquestionQuery = "SELECT question FROM ".db_table_name("questions")." WHERE parent_qid='$qiqid' AND title='$qanswer' AND language='{$language}' ORDER BY question_order"; - $sSubquestion=FlattenText($connect->GetOne($sSubquestionQuery)); - - //get question attributes - $qidattributes=getQuestionAttributes($qqid); - - //check last character -> label 1 - if (substr($rt,-1,1) == 0) - { - //get label 1 - $fquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid='{$qqid}' AND scale_id=0 AND language='{$language}' ORDER BY sortorder, code"; - - //header available? - if (trim($qidattributes['dualscale_headerA'])!='') { - //output - $labelheader= "[".$qidattributes['dualscale_headerA']."]"; - } - - //no header - else - { - $labelheader =''; - } - - //output - $labelno = sprintf($clang->gT('Label %s'),'1'); - } - - //label 2 - else - { - //get label 2 - $fquery = "SELECT * FROM ".db_table_name("answers")." WHERE qid='{$qqid}' AND scale_id=1 AND language='{$language}' ORDER BY sortorder, code"; - - //header available? - if (trim($qidattributes['dualscale_headerB'])!='') { - //output - $labelheader= "[".$qidattributes['dualscale_headerB']."]"; - } - - //no header - else - { - $labelheader =''; - } - - //output - $labelno = sprintf($clang->gT('Label %s'),'2'); - } - - //get data - $fresult = db_execute_assoc($fquery); - - //put label code and label title into array - while ($frow=$fresult->FetchRow()) - { - $alist[]=array($frow['code'], FlattenText($frow['answer'])); - } - - //adapt title and question - $qtitle = $qtitle." [".$sSubquestion."][".$labelno."]"; - $qquestion = $qastring .$labelheader; - break; - - - - - default: //default handling - - //get answer code and title - $qquery = "SELECT code, answer FROM ".db_table_name("answers")." WHERE qid='$qqid' AND scale_id=0 AND language='{$language}' ORDER BY sortorder, answer"; - $qresult = db_execute_num($qquery) or safe_die ("Couldn't get answers list
    $qquery
    ".$connect->ErrorMsg()); - - //put answer code and title into array - while ($qrow=$qresult->FetchRow()) - { - $alist[]=array("$qrow[0]", FlattenText($qrow[1])); - } - - //handling for "other" field for list radio or list drowpdown - if ((($qtype == "L" || $qtype == "!") && $qother == "Y")) - { - //add "other" - $alist[]=array($statlang->gT("Other"),$statlang->gT("Other"),$fielddata['fieldname'].'other'); - } - if ( $qtype == "O") - { - //add "comment" - $alist[]=array($statlang->gT("Comments"),$statlang->gT("Comments"),$fielddata['fieldname'].'comment'); - } - - } //end switch question type - - //moved because it's better to have "no answer" at the end of the list instead of the beginning - //put data into array - $alist[]=array("", $statlang->gT("No answer")); - - } //end else -> single option answers - - //foreach ($alist as $al) {$statisticsoutput .= "$al[0] - $al[1]
    ";} //debugging line - //foreach ($fvalues as $fv) {$statisticsoutput .= "$fv | ";} //debugging line - - - - - - //2. Collect and Display results ####################################################################### - if (isset($alist) && $alist) //Make sure there really is an answerlist, and if so: - { - - - // this will count the answers considered completed - $TotalCompleted = 0; - switch($outputType) - { - case 'xls': - - $xlsTitle = sprintf($statlang->gT("Field summary for %s"),html_entity_decode($qtitle,ENT_QUOTES,'UTF-8')); - $xlsDesc = html_entity_decode($qquestion,ENT_QUOTES,'UTF-8'); - - ++$xlsRow; - ++$xlsRow; - - ++$xlsRow; - $sheet->write($xlsRow, 0,$xlsTitle); - ++$xlsRow; - $sheet->write($xlsRow, 0,$xlsDesc); - - $tableXLS = array(); - $footXLS = array(); - - break; - case 'pdf': - - $sPDFQuestion=FlattenText($qquestion,true); - $pdfTitle = $pdf->delete_html(sprintf($statlang->gT("Field summary for %s"),html_entity_decode($qtitle,ENT_QUOTES,'UTF-8'))); - $titleDesc = $sPDFQuestion; - - $pdf->addPage('P','A4'); - $pdf->Bookmark($sPDFQuestion, 1, 0); - $pdf->titleintopdf($pdfTitle,$sPDFQuestion); - $tablePDF = array(); - $footPDF = array(); - - break; - case 'html': - //output - $statisticsoutput .= "\n" - ."\t\n" - ."\t\n" - ."\t\n\t\t\n" - ."\t\t\n" - ."\t\t\n" - ."\t\n"; - - if (isset($_POST['showtextinline'])) { - $headPDF2=array(); - $headPDF2[]=array($statlang->gt("Responses")); - $tablePDF2=array(); - $query2 = "SELECT ".db_quote_id($al[2])." FROM ".db_table_name("survey_$surveyid")." WHERE "; - $query2 .= ($connect->databaseType == "mysql")? db_quote_id($al[2])." != ''" : "NOT (".db_quote_id($al[2])." LIKE '')"; - $result2=db_execute_num($query2) or safe_die ("Couldn't do count of values
    $query
    ".$connect->ErrorMsg()); - $fnamelast = "
    \n"; - $fnamelast .= "".$clang->gT("Responses")."
    \n"; - //$fname .= $query2; - while ($row2=$result2->FetchRow()) - { - $fnamelast .= $row2[0]."
    \n"; - $tablePDF2[]=array($row2[0]); - } - $fnamelast .= "
    \n"; - - } - } - - - //check if aggregated results should be shown - elseif (isset($showaggregateddata) && $showaggregateddata == 1) - { - if(!isset($showheadline) || $showheadline != false) - { - if($qtype == "5" || $qtype == "A") - { - switch($outputType) - { - case 'xls': - - $headXLS = array(); - $headXLS[] = array($statlang->gT("Answer"),$statlang->gT("Count"),$statlang->gT("Percentage"),$statlang->gT("Sum")); - - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Answer")); - $sheet->write($xlsRow,1,$statlang->gT("Count")); - $sheet->write($xlsRow,2,$statlang->gT("Percentage")); - $sheet->write($xlsRow,3,$statlang->gT("Sum")); - - break; - case 'pdf': - - $headPDF = array(); - $headPDF[] = array($statlang->gT("Answer"),$statlang->gT("Count"),$statlang->gT("Percentage"),$statlang->gT("Sum")); - - break; - case 'html': - //four columns - $statisticsoutput .= "".$statlang->gT("Answer")."\n" - ."\t\t\n" - ."\t\t\n" - ."\t\t\n" - ."\t\n"; - break; - default: - - - break; - } - - - $showheadline = false; - } - else - { - switch($outputType) - { - case 'xls': - - $headXLS = array(); - $headXLS[] = array($statlang->gT("Answer"),$statlang->gT("Count"),$statlang->gT("Percentage")); - - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Answer")); - $sheet->write($xlsRow,1,$statlang->gT("Count")); - $sheet->write($xlsRow,2,$statlang->gT("Percentage")); - - break; - - case 'pdf': - - $headPDF = array(); - $headPDF[] = array($statlang->gT("Answer"),$statlang->gT("Count"),$statlang->gT("Percentage")); - - break; - case 'html': - //three columns - $statisticsoutput .= "".$statlang->gT("Answer")."\n" - ."\t\t\n" - ."\t\t\n" - ."\t\n"; - break; - default: - - - break; - } - - $showheadline = false; - } - - } - - //text for answer column is always needed - $fname="$al[1] ($al[0])"; - - //these question types get special treatment by $showaggregateddata - if($qtype == "5" || $qtype == "A") - { - //put non-edited data in here because $row will be edited later - $grawdata[]=$row[0]; - $showaggregated_indice=count($grawdata) - 1; - $showaggregated_indice_table[$showaggregated_indice]="aggregated"; - $showaggregated_indice=-1; - - //keep in mind that we already added data (will be checked later) - $justadded = true; - - //we need a counter because we want to sum up certain values - //reset counter if 5 items have passed - if(!isset($testcounter) || $testcounter >= 4) - { - $testcounter = 0; - } - else - { - $testcounter++; - } - - //beside the known percentage value a new aggregated value should be shown - //therefore this item is marked in a certain way - - if($testcounter == 0 ) //add 300 to original value - { - //store the original value! - $tempcount = $row[0]; - //HACK: add three times the total number of results to the value - //This way we get a 300 + X percentage which can be checked later - $row[0] += (3*$results); - } - - //the third value should be shown twice later -> mark it - if($testcounter == 2) //add 400 to original value - { - //store the original value! - $tempcount = $row[0]; - //HACK: add four times the total number of results to the value - //This way there should be a 400 + X percentage which can be checked later - $row[0] += (4*$results); - } - - //the last value aggregates the data of item 4 + item 5 later - if($testcounter == 4 ) //add 200 to original value - { - //store the original value! - $tempcount = $row[0]; - //HACK: add two times the total number of results to the value - //This way there should be a 200 + X percentage which can be checked later - $row[0] += (2*$results); - } - - } //end if -> question type = "5"/"A" - - } //end if -> show aggregated data - - //handling what's left - else - { - if(!isset($showheadline) || $showheadline != false) - { - switch($outputType) - { - case 'xls': - - $headXLS = array(); - $headXLS[] = array($statlang->gT("Answer"),$statlang->gT("Count"),$statlang->gT("Percentage")); - - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Answer")); - $sheet->write($xlsRow,1,$statlang->gT("Count")); - $sheet->write($xlsRow,2,$statlang->gT("Percentage")); - - break; - case 'pdf': - - $headPDF = array(); - $headPDF[] = array($statlang->gT("Answer"),$statlang->gT("Count"),$statlang->gT("Percentage")); - - break; - case 'html': - //three columns - $statisticsoutput .= "".$statlang->gT("Answer")."\n" - ."\t\t\n" - ."\t\t\n" - ."\t\n"; - break; - default: - - - break; - } - - $showheadline = false; - - } - //answer text - $fname="$al[1] ($al[0])"; - } - - //are there some results to play with? - if ($results > 0) - { - //calculate percentage - $gdata[] = ($row[0]/$results)*100; - } - //no results - else - { - //no data! - $gdata[] = "N/A"; - } - - //only add this if we don't handle question type "5"/"A" - if(!isset($justadded)) - { - //put absolute data into array - $grawdata[]=$row[0]; - } - else - { - //unset to handle "no answer" data correctly - unset($justadded); - } - - //put question title and code into array - $label[]=$fname; - - //put only the code into the array - $justcode[]=$al[0]; - - //edit labels and put them into antoher array - - //first check if $tempcount is > 0. If yes, $row[0] has been modified and $tempcount has the original count. - if ($tempcount > 0) - { - $lbl[] = iconv_wordwrap(FlattenText("$al[1] ($tempcount)"), 25, "\n"); // NMO 2009-03-24 - $lblrtl[] = utf8_strrev(iconv_wordwrap(FlattenText("$al[1] )$tempcount("), 25, "\n")); // NMO 2009-03-24 - } - else - { - $lbl[] = iconv_wordwrap(FlattenText("$al[1] ($row[0])"), 30, "\n"); // NMO 2009-03-24 - $lblrtl[] = utf8_strrev(iconv_wordwrap(FlattenText("$al[1] )$row[0]("), 30, "\n")); // NMO 2009-03-24 - } - - - } //end while -> loop through results - - } //end foreach -> loop through answer data - - //no filtering of incomplete answers and NO multiple option questions - //if ((incompleteAnsFilterstate() != "filter") and ($qtype != "M") and ($qtype != "P")) - //error_log("TIBO ".print_r($showaggregated_indice_table,true)); - if (($qtype != "M") and ($qtype != "P")) - { - //is the checkbox "Don't consider NON completed responses (only works when Filter incomplete answers is Disable)" checked? - //if (isset($_POST["noncompleted"]) and ($_POST["noncompleted"] == "on") && (isset($showaggregateddata) && $showaggregateddata == 0)) - // TIBO: TODO WE MUST SKIP THE FOLLOWING SECTION FOR TYPE A and 5 when - // showaggreagated data is set and set to 1 - if (isset($_POST["noncompleted"]) and ($_POST["noncompleted"] == "on") ) - { - //counter - $i=0; - - while (isset($gdata[$i])) - { - if (isset($showaggregated_indice_table[$i]) && $showaggregated_indice_table[$i]=="aggregated") - { // do nothing, we don't rewrite aggregated results - // or at least I don't know how !!! (lemeur) - } - else - { - //we want to have some "real" data here - if ($gdata[$i] != "N/A") - { - //calculate percentage - $gdata[$i] = ($grawdata[$i]/$TotalCompleted)*100; - } - } - - //increase counter - $i++; - - } //end while (data available) - - } //end if -> noncompleted checked - - //noncompleted is NOT checked - else - { - //calculate total number of incompleted records - $TotalIncomplete = $results - $TotalCompleted; - - //output - if ((incompleteAnsFilterstate() != "filter")) - { - $fname=$statlang->gT("Not completed or Not displayed"); - } - else - { - $fname=$statlang->gT("Not displayed"); - } - - //we need some data - if ($results > 0) - { - //calculate percentage - $gdata[] = ($TotalIncomplete/$results)*100; - } - - //no data :( - else - { - $gdata[] = "N/A"; - } - - //put data of incompleted records into array - $grawdata[]=$TotalIncomplete; - - //put question title ("Not completed") into array - $label[]= $fname; - - //put the code ("Not completed") into the array - $justcode[]=$fname; - - //edit labels and put them into antoher array - if ((incompleteAnsFilterstate() != "filter")) - { - $lbl[] = wordwrap(FlattenText($statlang->gT("Not completed or Not displayed")." ($TotalIncomplete)"), 20, "\n"); // NMO 2009-03-24 - } - else - { - $lbl[] = wordwrap(FlattenText($statlang->gT("Not displayed")." ($TotalIncomplete)"), 20, "\n"); // NMO 2009-03-24 - } - } //end else -> noncompleted NOT checked - - } //end if -> no filtering of incomplete answers and no multiple option questions - - - //counter - $i=0; - - //we need to know which item we are editing - $itemcounter = 1; - - //array to store items 1 - 5 of question types "5" and "A" - $stddevarray = array(); - - //loop through all available answers - while (isset($gdata[$i])) - { - //repeat header (answer, count, ...) for each new question - unset($showheadline); - - - /* - * there are 3 colums: - * - * 1 (50%) = answer (title and code in brackets) - * 2 (25%) = count (absolute) - * 3 (25%) = percentage - */ - $statisticsoutput .= "\t\n\t\t\n" - - //output absolute number of records - ."\t\t"; - - - //no data - if ($gdata[$i] == "N/A") - { - switch($outputType) - { - case 'xls': - - $label[$i]=FlattenText($label[$i]); - $tableXLS[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $gdata[$i]). "%"); - - ++$xlsRow; - $sheet->write($xlsRow,0,$label[$i]); - $sheet->write($xlsRow,1,$grawdata[$i]); - $sheet->write($xlsRow,2,sprintf("%01.2f", $gdata[$i]). "%"); - - break; - case 'pdf': - - $tablePDF[] = array(FlattenText($label[$i]),$grawdata[$i],sprintf("%01.2f", $gdata[$i]). "%", ""); - - break; - case 'html': - //output when having no data - $statisticsoutput .= "\t\t"; - } - elseif ($qtype == "S" || $qtype == "U" || $qtype == "T" || $qtype == "Q") - { - $statisticsoutput .= "\n\t\n"; - } - break; - default: - - - break; - } - - } - - //data available - else - { - //check if data should be aggregated - if(isset($showaggregateddata) && $showaggregateddata == 1 && ($qtype == "5" || $qtype == "A")) - { - //mark that we have done soemthing special here - $aggregated = true; - - //just calculate everything once. the data is there in the array - if($itemcounter == 1) - { - //there are always 5 answers - for($x = 0; $x < 5; $x++) - { - //put 5 items into array for further calculations - array_push($stddevarray, $grawdata[$x]); - } - } - - //"no answer" & items 2 / 4 - nothing special to do here, just adjust output - if($gdata[$i] <= 100) - { - if($itemcounter == 2 && $label[$i+4] == $statlang->gT("No answer")) - { - //prevent division by zero - if(($results - $grawdata[$i+4]) > 0) - { - //re-calculate percentage - $percentage = ($grawdata[$i] / ($results - $grawdata[$i+4])) * 100; - } - else - { - $percentage = 0; - } - - } - elseif($itemcounter == 4 && $label[$i+2] == $statlang->gT("No answer")) - { - //prevent division by zero - if(($results - $grawdata[$i+2]) > 0) - { - //re-calculate percentage - $percentage = ($grawdata[$i] / ($results - $grawdata[$i+2])) * 100; - } - else - { - $percentage = 0; - } - } - else - { - $percentage = $gdata[$i]; - } - switch($outputType) - { - case 'xls': - - $label[$i]=FlattenText($label[$i]); - $tableXLS[]= array($label[$i],$grawdata[$i],sprintf("%01.2f", $percentage)."%"); - - ++$xlsRow; - $sheet->write($xlsRow,0,$label[$i]); - $sheet->write($xlsRow,1,$grawdata[$i]); - $sheet->write($xlsRow,2,sprintf("%01.2f", $percentage)."%"); - - break; - case 'pdf': - $label[$i]=FlattenText($label[$i]); - $tablePDF[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $percentage)."%", ""); - - break; - case 'html': - //output - $statisticsoutput .= "\t\t"; - break; - default: - - - break; - } - - } - - //item 3 - just show results twice - //old: if($gdata[$i] >= 400) - //trying to fix bug #2583: - if($gdata[$i] >= 400 && $i != 0) - { - //remove "400" which was added before - $gdata[$i] -= 400; - - if($itemcounter == 3 && $label[$i+3] == $statlang->gT("No answer")) - { - //prevent division by zero - if(($results - $grawdata[$i+3]) > 0) - { - //re-calculate percentage - $percentage = ($grawdata[$i] / ($results - $grawdata[$i+3])) * 100; - } - else - { - $percentage = 0; - } - } - else - { - //get the original percentage - $percentage = $gdata[$i]; - } - switch($outputType) - { - case 'xls': - - $label[$i]=FlattenText($label[$i]); - $tableXLS[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $percentage)."%",sprintf("%01.2f", $percentage)."%"); - - ++$xlsRow; - $sheet->write($xlsRow,0,$label[$i]); - $sheet->write($xlsRow,1,$grawdata[$i]); - $sheet->write($xlsRow,2,sprintf("%01.2f", $percentage)."%"); - $sheet->write($xlsRow,3,sprintf("%01.2f", $percentage)."%"); - - break; - case 'pdf': - $label[$i]=FlattenText($label[$i]); - $tablePDF[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $percentage)."%",sprintf("%01.2f", $percentage)."%"); - - break; - case 'html': - //output percentage - $statisticsoutput .= "\t\t"; - - //output again (no real aggregation here) - $statisticsoutput .= "\t\t\t\t"; - break; - default: - - - break; - } - - } - - //FIRST value -> add percentage of item 1 + item 2 - //old: if($gdata[$i] >= 300 && $gdata[$i] < 400) - //trying to fix bug #2583: - if(($gdata[$i] >= 300 && $gdata[$i] < 400) || ($i == 0 && $gdata[$i] <= 400)) - { - //remove "300" which was added before - $gdata[$i] -= 300; - - if($itemcounter == 1 && $label[$i+5] == $statlang->gT("No answer")) - { - //prevent division by zero - if(($results - $grawdata[$i+5]) > 0) - { - //re-calculate percentage - $percentage = ($grawdata[$i] / ($results - $grawdata[$i+5])) * 100; - $percentage2 = ($grawdata[$i + 1] / ($results - $grawdata[$i+5])) * 100; - } - else - { - $percentage = 0; - $percentage2 = 0; - - } - } - else - { - $percentage = $gdata[$i]; - $percentage2 = $gdata[$i+1]; - } - //percentage of item 1 + item 2 - $aggregatedgdata = $percentage + $percentage2; - - - switch($outputType) - { - case 'xls': - - $label[$i]=FlattenText($label[$i]); - $tableXLS[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $percentage)."%",sprintf("%01.2f", $aggregatedgdata)."%"); - - ++$xlsRow; - $sheet->write($xlsRow,0,$label[$i]); - $sheet->write($xlsRow,1,$grawdata[$i]); - $sheet->write($xlsRow,2,sprintf("%01.2f", $percentage)."%"); - $sheet->write($xlsRow,3,sprintf("%01.2f", $aggregatedgdata)."%"); - - break; - case 'pdf': - $label[$i]=FlattenText($label[$i]); - $tablePDF[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $percentage)."%",sprintf("%01.2f", $aggregatedgdata)."%"); - - break; - case 'html': - //output percentage - $statisticsoutput .= "\t\t"; - - //output aggregated data - $statisticsoutput .= "\t\t\t\t"; - break; - default: - - - break; - } - } - - //LAST value -> add item 4 + item 5 - if($gdata[$i] > 100 && $gdata[$i] < 300) - { - //remove "200" which was added before - $gdata[$i] -= 200; - - if($itemcounter == 5 && $label[$i+1] == $statlang->gT("No answer")) - { - //prevent division by zero - if(($results - $grawdata[$i+1]) > 0) - { - //re-calculate percentage - $percentage = ($grawdata[$i] / ($results - $grawdata[$i+1])) * 100; - $percentage2 = ($grawdata[$i - 1] / ($results - $grawdata[$i+1])) * 100; - } - else - { - $percentage = 0; - $percentage2 = 0; - } - } - else - { - $percentage = $gdata[$i]; - $percentage2 = $gdata[$i-1]; - } - - //item 4 + item 5 - $aggregatedgdata = $percentage + $percentage2; - switch($outputType) - { - case 'xls': - - $label[$i]=FlattenText($label[$i]); - $tableXLS[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $percentage)."%",sprintf("%01.2f", $aggregatedgdata)."%"); - - ++$xlsRow; - $sheet->write($xlsRow,0,$label[$i]); - $sheet->write($xlsRow,1,$grawdata[$i]); - $sheet->write($xlsRow,2,sprintf("%01.2f", $percentage)."%"); - $sheet->write($xlsRow,3,sprintf("%01.2f", $aggregatedgdata)."%"); - - break; - case 'pdf': - $label[$i]=FlattenText($label[$i]); - $tablePDF[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $percentage)."%",sprintf("%01.2f", $aggregatedgdata)."%"); - - break; - case 'html': - //output percentage - $statisticsoutput .= "\t\t"; - - //output aggregated data - $statisticsoutput .= "\t\t\t\t"; - break; - default: - - - break; - } - - // create new row "sum" - //calculate sum of items 1-5 - $sumitems = $grawdata[$i] - + $grawdata[$i-1] - + $grawdata[$i-2] - + $grawdata[$i-3] - + $grawdata[$i-4]; - - //special treatment for zero values - if($sumitems > 0) - { - $sumpercentage = "100.00"; - } - else - { - $sumpercentage = "0"; - } - //special treatment for zero values - if($TotalCompleted > 0) - { - $casepercentage = "100.00"; - } - else - { - $casepercentage = "0"; - } - switch($outputType) - { - case 'xls': - - - $footXLS[] = array($statlang->gT("Sum")." (".$statlang->gT("Answers").")",$sumitems,$sumpercentage."%",$sumpercentage."%"); - $footXLS[] = array($statlang->gT("Number of cases"),$TotalCompleted,$casepercentage."%",""); - - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Sum")." (".$statlang->gT("Answers").")"); - $sheet->write($xlsRow,1,$sumitems); - $sheet->write($xlsRow,2,$sumpercentage."%"); - $sheet->write($xlsRow,3,$sumpercentage."%"); - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Number of cases")); - $sheet->write($xlsRow,1,$TotalCompleted); - $sheet->write($xlsRow,2,$casepercentage."%"); - - break; - case 'pdf': - - $footPDF[] = array($statlang->gT("Sum")." (".$statlang->gT("Answers").")",$sumitems,$sumpercentage."%",$sumpercentage."%"); - $footPDF[] = array($statlang->gT("Number of cases"),$TotalCompleted,$casepercentage."%",""); - - break; - case 'html': - $statisticsoutput .= "\t\t \n\t\n"; - $statisticsoutput .= ""; - $statisticsoutput .= ""; - $statisticsoutput .= ""; - $statisticsoutput .= ""; - $statisticsoutput .= "\t\t \n\t\n"; - - $statisticsoutput .= ""; //German: "Fallzahl" - $statisticsoutput .= ""; - $statisticsoutput .= ""; - //there has to be a whitespace within the table cell to display correctly - $statisticsoutput .= ""; - break; - default: - - - break; - } - - } - - } //end if -> show aggregated data - - //don't show aggregated data - else - { - switch($outputType) - { - case 'xls': - $label[$i]=FlattenText($label[$i]); - $tableXLS[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $gdata[$i])."%", ""); - - ++$xlsRow; - $sheet->write($xlsRow,0,$label[$i]); - $sheet->write($xlsRow,1,$grawdata[$i]); - $sheet->write($xlsRow,2,sprintf("%01.2f", $gdata[$i])."%"); - //$sheet->write($xlsRow,3,$sumpercentage."%"); - - break; - case 'pdf': - $label[$i]=FlattenText($label[$i]); - $tablePDF[] = array($label[$i],$grawdata[$i],sprintf("%01.2f", $gdata[$i])."%", ""); - - break; - case 'html': - //output percentage - $statisticsoutput .= "\t\t\n\t\n"; - break; - default: - - - break; - } - - } - - } //end else -> $gdata[$i] != "N/A" - - - - //increase counter - $i++; - - $itemcounter++; - - } //end while - if(isset($fnamelast)) { - $statisticsoutput.= "\n"; - unset($fnamelast); - } - //only show additional values when this setting is enabled - if(isset($showaggregateddata) && $showaggregateddata == 1 ) - { - //it's only useful to calculate standard deviation and arithmetic means for question types - //5 = 5 Point Scale - //A = Array (5 Point Choice) - if($qtype == "5" || $qtype == "A") - { - $stddev = 0; - $am = 0; - - //calculate arithmetic mean - if(isset($sumitems) && $sumitems > 0) - { - - - //calculate and round results - //there are always 5 items - for($x = 0; $x < 5; $x++) - { - //create product of item * value - $am += (($x+1) * $stddevarray[$x]); - } - - //prevent division by zero - if(isset($stddevarray) && array_sum($stddevarray) > 0) - { - $am = round($am / array_sum($stddevarray),2); - } - else - { - $am = 0; - } - - //calculate standard deviation -> loop through all data - /* - * four steps to calculate the standard deviation - * 1 = calculate difference between item and arithmetic mean and multiply with the number of elements - * 2 = create sqaure value of difference - * 3 = sum up square values - * 4 = multiply result with 1 / (number of items) - * 5 = get root - */ - - - - for($j = 0; $j < 5; $j++) - { - //1 = calculate difference between item and arithmetic mean - $diff = (($j+1) - $am); - - //2 = create square value of difference - $squarevalue = square($diff); - - //3 = sum up square values and multiply them with the occurence - //prevent divison by zero - if($squarevalue != 0 && $stddevarray[$j] != 0) - { - $stddev += $squarevalue * $stddevarray[$j]; - } - - } - - //4 = multiply result with 1 / (number of items (=5)) - //There are two different formulas to calculate standard derivation - //$stddev = $stddev / array_sum($stddevarray); //formula source: http://de.wikipedia.org/wiki/Standardabweichung - - //prevent division by zero - if((array_sum($stddevarray)-1) != 0 && $stddev != 0) - { - $stddev = $stddev / (array_sum($stddevarray)-1); //formula source: http://de.wikipedia.org/wiki/Empirische_Varianz - } - else - { - $stddev = 0; - } - - //5 = get root - $stddev = sqrt($stddev); - $stddev = round($stddev,2); - } - switch($outputType) - { - case 'xls': - - $tableXLS[] = array($statlang->gT("Arithmetic mean"),$am,'',''); - $tableXLS[] = array($statlang->gT("Standard deviation"),$stddev,'',''); - - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Arithmetic mean")); - $sheet->write($xlsRow,1,$am); - - ++$xlsRow; - $sheet->write($xlsRow,0,$statlang->gT("Standard deviation")); - $sheet->write($xlsRow,1,$stddev); - - break; - case 'pdf': - - $tablePDF[] = array($statlang->gT("Arithmetic mean"),$am,'',''); - $tablePDF[] = array($statlang->gT("Standard deviation"),$stddev,'',''); - - break; - case 'html': - //calculate standard deviation - $statisticsoutput .= ""; //German: "Fallzahl" - $statisticsoutput .= ""; - $statisticsoutput .= ""; //German: "Fallzahl" - $statisticsoutput .= ""; - - break; - default: - - - break; - } - } - } - - if($outputType=='pdf') //XXX TODO PDF - { - //$tablePDF = array(); - $tablePDF = array_merge_recursive($tablePDF, $footPDF); - $pdf->headTable($headPDF,$tablePDF); - if(isset($headPDF2)) { - $tablePDF = array_merge_recursive($headPDF2, $tablePDF2); - $pdf->headTable($headPDF2, $tablePDF2); - unset($headPDF2, $tablePDF2); - } - //$pdf->tableintopdf($tablePDF); - - // if(isset($footPDF)) - // foreach($footPDF as $foot) - // { - // $footA = array($foot); - // $pdf->tablehead($footA); - // } - } - - - - - //-------------------------- PCHART OUTPUT ---------------------------- - - //PCHART has to be enabled and we need some data - if ($usegraph==1 && array_sum($gdata)>0) - { - $graph = ""; - $p1 = ""; - // $statisticsoutput .= "
    ";
    -                        //                  $statisticsoutput .= "GDATA:\n";
    -                        //                  print_r($gdata);
    -                        //                  $statisticsoutput .= "GRAWDATA\n";
    -                        //                  print_r($grawdata);
    -                        //                  $statisticsoutput .= "LABEL\n";
    -                        //                  print_r($label);
    -                        //                  $statisticsoutput .= "JUSTCODE\n";
    -                        //                  print_r($justcode);
    -                        //                  $statisticsoutput .= "LBL\n";
    -                        //                  print_r($lbl);
    -                        //                  $statisticsoutput .= "
    "; - //First, lets delete any earlier graphs from the tmp directory - //$gdata and $lbl are arrays built at the end of the last section - //that contain the values, and labels for the data we are about - //to send to pchart. - - $i = 0; - foreach ($gdata as $data) - { - if ($data != 0){$i++;} - } - $totallines=$i; - if ($totallines>15) - { - $gheight=320+(6.7*($totallines-15)); - $fontsize=7; - $legendtop=0.01; - $setcentrey=0.5/(($gheight/320)); - } - else - { - $gheight=320; - $fontsize=8; - $legendtop=0.07; - $setcentrey=0.5; - } - - // Create bar chart for Multiple choice - if ($qtype == "M" || $qtype == "P") - { - //new bar chart using data from array $grawdata which contains percentage - - $DataSet = new pData; - $counter=0; - $maxyvalue=0; - foreach ($grawdata as $datapoint) - { - $DataSet->AddPoint(array($datapoint),"Serie$counter"); - $DataSet->AddSerie("Serie$counter"); - - $counter++; - if ($datapoint>$maxyvalue) $maxyvalue=$datapoint; - } - - if ($maxyvalue<10) {++$maxyvalue;} - $counter=0; - foreach ($lbl as $label) - { - $DataSet->SetSerieName(encodeAllToHTMLEntities($label),"Serie$counter"); - $counter++; - } - - if ($MyCache->IsInCache("graph".$statlang->langcode.$surveyid,$DataSet->GetData())) - { - $cachefilename=basename($MyCache->GetFileFromCache("graph".$statlang->langcode.$surveyid,$DataSet->GetData())); - } - else - { - $graph = new pChart(1,1); - - $graph->setFontProperties($rootdir."/fonts/".$chartfontfile, $chartfontsize); - $legendsize=$graph->getLegendBoxSize($DataSet->GetDataDescription()); - - if ($legendsize[1]<320) $gheight=420; else $gheight=$legendsize[1]+100; - $graph = new pChart(690+$legendsize[0],$gheight); - $graph->loadColorPalette($homedir.'/styles/'.$admintheme.'/limesurvey.pal'); - $graph->setFontProperties($rootdir."/fonts/".$chartfontfile,$chartfontsize); - $graph->setGraphArea(50,30,500,$gheight-60); - $graph->drawFilledRoundedRectangle(7,7,523+$legendsize[0],$gheight-7,5,254,255,254); - $graph->drawRoundedRectangle(5,5,525+$legendsize[0],$gheight-5,5,230,230,230); - $graph->drawGraphArea(255,255,255,TRUE); - $graph->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_START0,150,150,150,TRUE,90,0,TRUE,5,false); - $graph->drawGrid(4,TRUE,230,230,230,50); - // Draw the 0 line - $graph->setFontProperties($rootdir."/fonts/".$chartfontfile,$chartfontsize); - $graph->drawTreshold(0,143,55,72,TRUE,TRUE); - - // Draw the bar graph - $graph->drawBarGraph($DataSet->GetData(),$DataSet->GetDataDescription(),FALSE); - //$Test->setLabel($DataSet->GetData(),$DataSet->GetDataDescription(),"Serie4","1","Important point!"); - // Finish the graph - $graph->setFontProperties($rootdir."/fonts/".$chartfontfile, $chartfontsize); - $graph->drawLegend(510,30,$DataSet->GetDataDescription(),255,255,255); - - $MyCache->WriteToCache("graph".$statlang->langcode.$surveyid,$DataSet->GetData(),$graph); - $cachefilename=basename($MyCache->GetFileFromCache("graph".$statlang->langcode.$surveyid,$DataSet->GetData())); - unset($graph); - } - } //end if (bar chart) - - //Pie Chart - else - { - // this block is to remove the items with value == 0 - // and an unelegant way to remove comments from List with Comments questions - $i = 0; - while (isset ($gdata[$i])) - { - if ($gdata[$i] == 0 || ($qtype == "O" && substr($lbl[$i],0,strlen($statlang->gT("Comments")))==$statlang->gT("Comments"))) - { - array_splice ($gdata, $i, 1); - array_splice ($lbl, $i, 1); - } - else - {$i++;} - } - - $lblout=array(); - if ($language=='ar') - { - $lblout=$lbl; //reset text order to original - include_once($rootdir.'/classes/core/Arabic.php'); - $Arabic = new Arabic('ArGlyphs'); - foreach($lblout as $kkey => $kval){ - if (preg_match("^[A-Za-z]^", $kval)) { //auto detect if english - //eng - //no reversing - } - else{ - $kval = $Arabic->utf8Glyphs($kval,50,false); - $lblout[$kkey] = $kval; - } - } - } - elseif (getLanguageRTL($language)) - { - $lblout=$lblrtl; - } - else - { - $lblout=$lbl; - } - - foreach ($lblout as $key=>$value) - { - $lblout[$key]=encodeAllToHTMLEntities($value); - } - - //create new 3D pie chart - if ($usegraph==1) - { - $DataSet = new pData; - $DataSet->AddPoint($gdata,"Serie1"); - $DataSet->AddPoint($lblout,"Serie2"); - $DataSet->AddAllSeries(); - $DataSet->SetAbsciseLabelSerie("Serie2"); - - if ($MyCache->IsInCache("graph".$statlang->langcode.$surveyid,$DataSet->GetData())) - { - $cachefilename=basename($MyCache->GetFileFromCache("graph".$statlang->langcode.$surveyid,$DataSet->GetData())); - } - else - { - - $gheight=ceil($gheight); - $graph = new pChart(690,$gheight); - $graph->loadColorPalette($homedir.'/styles/'.$admintheme.'/limesurvey.pal'); - $graph->drawFilledRoundedRectangle(7,7,687,$gheight-3,5,254,255,254); - $graph->drawRoundedRectangle(5,5,689,$gheight-1,5,230,230,230); - - // Draw the pie chart - $graph->setFontProperties($rootdir."/fonts/".$chartfontfile, $chartfontsize); - $graph->drawPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),225,round($gheight/2),170,PIE_PERCENTAGE,TRUE,50,20,5); - $graph->setFontProperties($rootdir."/fonts/".$chartfontfile,$chartfontsize); - $graph->drawPieLegend(430,12,$DataSet->GetData(),$DataSet->GetDataDescription(),250,250,250); - $MyCache->WriteToCache("graph".$statlang->langcode.$surveyid,$DataSet->GetData(),$graph); - $cachefilename=basename($MyCache->GetFileFromCache("graph".$statlang->langcode.$surveyid,$DataSet->GetData())); - unset($graph); - } - //print_r($DataSet->GetData()); echo "

    "; - } - - } //end else -> pie charts - - //introduce new counter - if (!isset($ci)) {$ci=0;} - - //increase counter, start value -> 1 - $ci++; - switch($outputType) - { - case 'xls': - - /** - * No Image for Excel... - */ - - break; - case 'pdf': - - $pdf->AddPage('P','A4'); - - $pdf->titleintopdf($pdfTitle,$titleDesc); - $pdf->Image($tempdir."/".$cachefilename, 0, 70, 180, 0, '', $homeurl."/admin.php?sid=$surveyid", 'B', true, 150,'C',false,false,0,true); - - break; - case 'html': - $statisticsoutput .= ""; - - break; - default: - - - break; - } - - } - - //close table/output - if($outputType=='html') - $statisticsoutput .= "
    " - - //headline - .sprintf($statlang->gT("Field summary for %s"),$qtitle)."" - ."
    " - - //question title - .$qquestion."
    "; - break; - default: - - - break; - } - echo ''; - - $qfs = questionnaireSampleFilterstate(); - $querylimit = ""; - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $querylimit .= " JOIN `case` AS c ON ({$dbprefix}survey_$surveyid.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $querylimit .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - - //loop thorugh the array which contains all answer data - foreach ($alist as $al) - { - //picks out alist that come from the multiple list above - if (isset($al[2]) && $al[2]) - { - //handling for "other" option - - if ($al[0] == $statlang->gT("Other")) - { - if($qtype=='!' || $qtype=='L') - { - // It is better for single choice question types to filter on the number of '-oth-' entries, than to - // just count the number of 'other' values - that way with failing Javascript the statistics don't get messed up - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE ".db_quote_id(substr($al[2],0,strlen($al[2])-5))."='-oth-'"; - } - else - { - //get data - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE "; - $query .= ($connect->databaseType == "mysql")? db_quote_id($al[2])." != ''" : "NOT (".db_quote_id($al[2])." LIKE '')"; - } - } - - /* - * text questions: - * - * U = huge free text - * T = long free text - * S = short free text - * Q = multiple short text - */ - - elseif ($qtype == "U" || $qtype == "T" || $qtype == "S" || $qtype == "Q" || $qtype == ";") - { - //free text answers - if($al[0]=="Answers") - { - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE "; - $query .= ($connect->databaseType == "mysql")? db_quote_id($al[2])." != ''" : "NOT (".db_quote_id($al[2])." LIKE '')"; - } - //"no answer" handling - elseif($al[0]=="NoAnswer") - { - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE ( "; - $query .= ($connect->databaseType == "mysql")? db_quote_id($al[2])." = '')" : " (".db_quote_id($al[2])." LIKE ''))"; - } - } - elseif ($qtype == "O") - { - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE ( "; - $query .= ($connect->databaseType == "mysql")? db_quote_id($al[2])." <> '')" : " (".db_quote_id($al[2])." NOT LIKE ''))"; - // all other question types - } - else - { - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE ".db_quote_id($al[2])." ="; - - //ranking question? - if (substr($rt, 0, 1) == "R") - { - $query .= " '$al[0]'"; - } - else - { - $query .= " 'Y'"; - } - } - - } //end if -> alist set - - else - { - if ($al[0] != "") - { - //get more data - - if ($connect->databaseType == 'odbc_mssql' || $connect->databaseType == 'odbtp' || $connect->databaseType == 'mssql_n' || $connect->databaseType == 'mssqlnative') - { - // mssql cannot compare text blobs so we have to cast here - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE cast(".db_quote_id($rt)." as varchar)= '$al[0]'"; - } - else - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE ".db_quote_id($rt)." = '$al[0]'"; - } - else - { // This is for the 'NoAnswer' case - // We need to take into account several possibilities - // * NoAnswer cause the participant clicked the NoAnswer radio - // ==> in this case value is '' or ' ' - // * NoAnswer in text field - // ==> value is '' - // * NoAnswer due to conditions, or a page not displayed - // ==> value is NULL - if ($connect->databaseType == 'odbc_mssql' || $connect->databaseType == 'odbtp' || $connect->databaseType == 'mssql_n' || $connect->databaseType == 'mssqlnative') - { - // mssql cannot compare text blobs so we have to cast here - //$query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." WHERE (".db_quote_id($rt)." IS NULL " - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE ( " - // . "OR cast(".db_quote_id($rt)." as varchar) = '' " - . "cast(".db_quote_id($rt)." as varchar) = '' " - . "OR cast(".db_quote_id($rt)." as varchar) = ' ' )"; - } - else - // $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." WHERE (".db_quote_id($rt)." IS NULL " - $query = "SELECT count(*) FROM ".db_table_name("survey_$surveyid")." $querylimit WHERE ( " - // . "OR ".db_quote_id($rt)." = '' " - . " ".db_quote_id($rt)." = '' " - . "OR ".db_quote_id($rt)." = ' ') "; - } - - } - - //check filter option - if (incompleteAnsFilterstate() == "inc") {$query .= " AND submitdate is null";} - elseif (incompleteAnsFilterstate() == "filter") {$query .= " AND submitdate is not null";} - - //check for any "sql" that has been passed from another script - if ($sql != "NULL") {$query .= " AND $sql";} - - //get data - $result=db_execute_num($query) or safe_die ("Couldn't do count of values
    $query
    ".$connect->ErrorMsg()); - - // $statisticsoutput .= "\n\n\n"; - - // this just extracts the data, after we present - while ($row=$result->FetchRow()) - { - //store temporarily value of answer count of question type '5' and 'A'. - $tempcount = -1; //count can't be less han zero - - //increase counter - $TotalCompleted += $row[0]; - - //"no answer" handling - if ($al[0] === "") - {$fname=$statlang->gT("No answer");} - - //"other" handling - //"Answers" means that we show an option to list answer to "other" text field - elseif ($al[0] === $statlang->gT("Other") || $al[0] === "Answers" || ($qtype === "O" && $al[0] === $statlang->gT("Comments")) || $qtype === "P") - { - if ($qtype == "P" ) $ColumnName_RM = $al[2]."comment"; - else $ColumnName_RM = $al[2]; - if ($qtype=='O') { - $TotalCompleted -=$row[0]; - } - $fname="$al[1]"; - if (!isset($_POST['showtextinline']) && $browse===true) $fname .= " "; - if(isset($_POST['showtextinline']) && ($qtype != "S" && $qtype != "U" && $qtype != "T" && $qtype != "Q")) { - //Generate list of 'other' text entries for display - $headPDF2=array(); - $headPDF2[]=array($statlang->gt("'Other' Responses")); - $tablePDF2=array(); - $query2 = "SELECT ".db_quote_id($al[2])." FROM ".db_table_name("survey_$surveyid")." WHERE "; - $query2 .= ($connect->databaseType == "mysql")? db_quote_id($al[2])." != ''" : "NOT (".db_quote_id($al[2])." LIKE '')"; - $result2=db_execute_num($query2) or safe_die ("Couldn't do count of values
    $query
    ".$connect->ErrorMsg()); - $fnamelast = "
    \n"; - $fnamelast .= "".$clang->gT("'Other' Responses")."
    \n"; - //$fname .= $query2; - while ($row2=$result2->FetchRow()) - { - $fnamelast .= $row2[0]."
    \n"; - $tablePDF2[]=array($row2[0]); - } - $fnamelast .= "
    \n"; - } - } - - /* - * text questions: - * - * U = huge free text - * T = long free text - * S = short free text - * Q = multiple short text - */ - elseif ($qtype == "S" || $qtype == "U" || $qtype == "T" || $qtype == "Q") - { - $headPDF = array(); - $headPDF[] = array($statlang->gT("Answer"),$statlang->gT("Count"),$statlang->gT("Percentage")); - - //show free text answers - if ($al[0] == "Answers") - { - $fname= "$al[1]"; - if (!isset($_POST['showtextinline']) && $browse===true) $fname .= " "; - } - elseif ($al[0] == "NoAnswer") - { - $fname= "$al[1]"; - } - - $statisticsoutput .= "
    " - ."".$statlang->gT("Count")."" - ."".$statlang->gT("Percentage")."
    " - ."".$statlang->gT("Count")."" - ."".$statlang->gT("Percentage")."" - ."".$statlang->gT("Sum")."
    " - ."".$statlang->gT("Count")."" - ."".$statlang->gT("Percentage")."
    " - ."".$statlang->gT("Count")."" - ."".$statlang->gT("Percentage")."
    " . $label[$i] ."\n" - ."\t\t" . $grawdata[$i] . "\n"; - - //percentage = 0 - $statisticsoutput .= sprintf("%01.2f", $gdata[$i]) . "%"; - $gdata[$i] = 0; - - //check if we have to adjust ouput due to $showaggregateddata setting - if(isset($showaggregateddata) && $showaggregateddata == 1 && ($qtype == "5" || $qtype == "A")) - { - $statisticsoutput .= "\t\t
    "; - - //output percentage - $statisticsoutput .= sprintf("%01.2f", $percentage) . "%"; - - //adjust output - $statisticsoutput .= "\t\t"; - $statisticsoutput .= sprintf("%01.2f", $percentage) . "%"; - $statisticsoutput .= sprintf("%01.2f", $percentage)."%"; - $statisticsoutput .= ""; - $statisticsoutput .= sprintf("%01.2f", $percentage) . "%"; - $statisticsoutput .= sprintf("%01.2f", $aggregatedgdata)."%"; - $statisticsoutput .= ""; - $statisticsoutput .= sprintf("%01.2f", $percentage) . "%"; - $statisticsoutput .= sprintf("%01.2f", $aggregatedgdata)."%"; - $statisticsoutput .= "
    ".$statlang->gT("Sum")." (".$statlang->gT("Answers").")".$sumitems."$sumpercentage%$sumpercentage%
    ".$statlang->gT("Number of cases")."".$TotalCompleted."$casepercentage% 
    "; - $statisticsoutput .= sprintf("%01.2f", $gdata[$i]) . "%"; - $statisticsoutput .= "\t\t"; - //end output per line. there has to be a whitespace within the table cell to display correctly - $statisticsoutput .= "\t\t 
    ".$fnamelast."
    ".$statlang->gT("Arithmetic mean")."  $am 
    ".$statlang->gT("Standard deviation")." $stddev 

    \n"; - - } //end if -> collect and display results - - //delete data - unset($gdata); - unset($grawdata); - unset($label); - unset($lbl); - unset($lblrtl); - unset($lblout); - unset($justcode); - unset ($alist); - - } // end foreach -> loop through all questions - - //output - if($outputType=='html') - $statisticsoutput .= "
     \n"; - - } //end if -> show summary results - - switch($outputType) - { - case 'xls': - - //$workbook-> - $workbook->close(); - if($pdfOutput=='F') - { - return $sFileName; - } - else - { - return; - } - break; - - case 'pdf': - $pdf->lastPage(); - if($pdfOutput=='F') - { // This is only used by lsrc to send an E-Mail attachment, so it gives back the filename to send and delete afterwards - $pdf->Output($tempdir."/".$statlang->gT('Survey').'_'.$surveyid."_".$surveyInfo['surveyls_title'].'.pdf', $pdfOutput); - return $tempdir."/".$statlang->gT('Survey').'_'.$surveyid."_".$surveyInfo['surveyls_title'].'.pdf'; - } - else - return $pdf->Output($statlang->gT('Survey').'_'.$surveyid."_".$surveyInfo['surveyls_title'].'.pdf', $pdfOutput); - - break; - case 'html': - return $statisticsoutput; - - break; - default: - return $statisticsoutput; - - break; - } - - } - - ////XXXXXX***// - - //simple function to square a value - function square($number) - { - if($number == 0) - { - $squarenumber = 0; - } - else - { - $squarenumber = $number * $number; - } - - return $squarenumber; - } - -function iconv_wordwrap($string, $width = 75, $break = "\n", $cut = false, $charset = 'utf-8') -{ - $stringWidth = iconv_strlen($string, $charset); - $breakWidth = iconv_strlen($break, $charset); - - if (strlen($string) === 0) { - return ''; - } elseif ($breakWidth === null) { - throw new Zend_Text_Exception('Break string cannot be empty'); - } elseif ($width === 0 && $cut) { - throw new Zend_Text_Exception('Can\'t force cut when width is zero'); - } - - $result = ''; - $lastStart = $lastSpace = 0; - - for ($current = 0; $current < $stringWidth; $current++) { - $char = iconv_substr($string, $current, 1, $charset); - - if ($breakWidth === 1) { - $possibleBreak = $char; - } else { - $possibleBreak = iconv_substr($string, $current, $breakWidth, $charset); - } - - if ($possibleBreak === $break) { - $result .= iconv_substr($string, $lastStart, $current - $lastStart + $breakWidth, $charset); - $current += $breakWidth - 1; - $lastStart = $lastSpace = $current + 1; - } elseif ($char === ' ') { - if ($current - $lastStart >= $width) { - $result .= iconv_substr($string, $lastStart, $current - $lastStart, $charset) . $break; - $lastStart = $current + 1; - } - - $lastSpace = $current; - } elseif ($current - $lastStart >= $width && $cut && $lastStart >= $lastSpace) { - $result .= iconv_substr($string, $lastStart, $current - $lastStart, $charset) . $break; - $lastStart = $lastSpace = $current; - } elseif ($current - $lastStart >= $width && $lastStart < $lastSpace) { - $result .= iconv_substr($string, $lastStart, $lastSpace - $lastStart, $charset) . $break; - $lastStart = $lastSpace = $lastSpace + 1; - } - } - - if ($lastStart !== $current) { - $result .= iconv_substr($string, $lastStart, $current - $lastStart, $charset); - } - - return $result; -} - - function encodeAllToHTMLEntities($sString) - { - $convmap = array(0x80, 0x10ffff, 0, 0xffffff); - return mb_encode_numericentity($sString, $convmap, "UTF-8"); - } - - -?> diff --git a/include/limesurvey/admin/styles/default/adminstyle-rtl.css b/include/limesurvey/admin/styles/default/adminstyle-rtl.css deleted file mode 100644 index 8c352820..00000000 --- a/include/limesurvey/admin/styles/default/adminstyle-rtl.css +++ /dev/null @@ -1,442 +0,0 @@ -body { - font-family: verdana, arial, sans-serif; - text-align: right; - background-color: #5670A1; - margin: 0; -} - -form { - margin: 0; - padding: 0; -} - -ul,ol { - text-align: right; - font-size: 10pt; - color: #000; -} - -img { - border: 0; -} - -a:hover { - font-size: 10pt; - color: #819D26; - text-decoration: underline; -} - -th,p,div { - font-size: 10pt; -} - -table.statisticstable { - margin: 2px auto; -} - -.statisticstable td { - vertical-align: top; -} - -/* Here starts the CSS for a menubar */ -div.menubar { - background-color: #EEF6FF; - width: 99.2%; - margin-top: 3px; - margin-right: 3px; -} - -.menubar-main { - background-color: #EEF6FF; - width: 100%; - float: right; - border-color: #D2E0F2 #8195BA #8195BA #D2E0F2; - border-style: solid; - border-width: 1px; -} - -.menubar img { - vertical-align: middle; - max-height: 40px; - border: 0; - margin-right: -2px; -} - -.menubar-title { - background-color: #EEF6FF; - float: right; - width: 100%; - font-size: 11px; - text-align: right; - border-color: #D2E0F2 #8195BA #D2E0F2 #D2E0F2; - border-style: solid; - border-width: 1px; -} - -.menubar-left { - background-color: #EEF6FF; - text-align: right; - float: right; - clear: none; - margin: 0; - padding: 0; -} - -.menubar-right { - background-color: #EEF6FF; - float: left; - line-height: 1em; -} - -/* END menubar CSS */ -.outlinetable { - border: 1px solid #111; -} - -.outlinetable td { - font-size: 10pt; - border: 1px solid #483D8B; - background: #EEF6FF; -} - -.outlinetable th { - font-size: 10pt; - color: #1D2D45; - background: #CCE6FF; -} - -td { - font-size: 10pt; - color: #1D2D45; -} - -.btstyle { - font-size: 11px; -} - -.disabledbtn { - height: 20px; - color: #999; - font-size: 11px; -} - -input,select { - color: navy; - font: 10px verdana, arial, sans-serif; -} - -input[disabled],textarea[disabled],select[disabled] { - color: #999; - background: #EEE; - font: 10px verdana, arial, sans-serif; -} - -textarea { - font-size: 10px; - color: navy; - font-family: verdana, arial, sans-serif; -} - -.subtitle { - font-size: 10px; - color: #FFF; -} - -.listboxtemplates { - margin-top: 10px; - height: 20px; - color: #333; - width: 180px; -} - -.boxcaption { - font-size: 12px; - font-weight: 700; - line-height: 40px; -} - -.saveOrderbtn { - border: thin solid #00CED1; - text-decoration: none; - font-weight: 700; - color: #B5B0DD; - background: #483D8B; - border-top: 1px solid #00BFFF; - border-right: 1px solid #00BFFF; - margin: 5px; -} - -.settingentryhighlight { - color: navy; - font-weight: 700; -} - -.statusentryhighlight { - font-size: 10px; - color: #E00; -} - -.errortitle { - font-weight: 700; - color: #FF0F0F; -} - -.warningtitle { - font-weight: 700; - color: #FFA07A; -} - -.successtitle { - font-weight: 700; - color: #16B700; -} - -font.settingcaption { - vertical-align: top; - text-align: left; - font-size: 13px; - font-weight: 700; - color: #1D2D45; -} - -span.settingcaption { - float: right; - width: 350px; - text-align: left; - font-weight: 700; - clear: right; - margin-bottom: 10px; - background-color: #F8F8FF; - color: #1D2D45; -} - -.settingentry { - float: right; - width: 600px; - padding-right: 5px; - font-size: 13px; - text-align: right; - clear: left; - margin-bottom: 10px; - background-color: #F8F8FF; -} - -.settingrow { - width: 1000px; - clear: right; - margin-bottom: 20px; - background-color: #F8F8FF; -} - -#dhtmlgoodies_tooltip { - border: 1px solid #000; - position: absolute; - display: none; - z-index: 20000; - -moz-border-radius: 5px; - background: #FDFDF5; - font: 0.8em "Verdana", "Lucida Sans Unicode", Arial, sans-serif; - padding: 2px; -} - -#dhtmlgoodies_tooltipShadow { - position: absolute; - display: none; - z-index: 10000; - opacity: 0.7px; - filter: alpha(opacity = 70); - -khtml-opacity: 0.7px; - -moz-opacity: 0.7px; - -moz-border-radius: 5px; - background: #555; -} - -.movableList { - padding-right: 0; - margin-right: 0; - margin-top: 0; - padding-top: 0; - width: 60em; -} - -.movableNode { - list-style-type: none; - border: 1px solid #999; - width: 60em; - text-align: right; - margin-top: 2px; - background: #EEEFFF; - padding: 0.5em; -} - -.langpopup2 { - position: absolute; - width: 100px; - height: 110px; - top: 151px; - right: 80px; - z-index: 10000; - opacity: 0.7px; - visibility: hidden; - filter: alpha(opacity = 95); - -khtml-opacity: 0.95px; - -moz-opacity: 0.95px; - -moz-border-radius: 6px; - background: #FDFDF5; - font: 11px arial, verdana, sans-serif; - border-color: #000; - border-style: solid; - border-width: 1px; - padding: 8px; -} - -.langpopup1 { - position: absolute; - width: 100px; - height: 110px; - top: 100px; - right: 80px; - z-index: 10000; - opacity: 0.7px; - visibility: hidden; - filter: alpha(opacity = 95); - -khtml-opacity: 0.95px; - -moz-opacity: 0.95px; - -moz-border-radius: 6px; - background: #FDFDF5; - font: 11px arial, verdana, sans-serif; - border-color: #000; - border-style: solid; - border-width: 1px; - padding: 8px; -} - -.previewpopup { - position: absolute; - width: 110px; - height: 125px; - top: 287px; - right: 473px; - z-index: 10000; - opacity: 0.7px; - visibility: hidden; - filter: alpha(opacity = 95); - -khtml-opacity: 0.95px; - -moz-opacity: 0.95px; - -moz-border-radius: 6px; - background: #FDFDF5; - font: 11px arial, verdana, sans-serif; - border-color: #000; - border-style: solid; - border-width: 1px; - padding: 8px; -} - -.oddrow { - background-color: #EBF2FA; -} - -.choicelist { - width: 200px; - font-size: 10pt; -} - -.ranklist { - width: 200px; - margin-top: 3px; -} - -span.invalidemail { - font-weight: 700; - color: red; -} - -th.admincell { - background-color: #F8BDB5; -} - -p { - clear: right; -} - -form.token label { - margin-top: 1em; - width: 40%; - float: right; - text-align: left; - margin-left: 0.5em; -} - -.submit { - float: none !important; - margin: 0 auto; -} - -th,.header,.headertwo,.settingcaption { - text-align: center; - font-size: 13px; - font-weight: 700; - background-color: #D2E0F2; - color: #1D2D45; -} - -a:link,a:visited { - font-size: 10pt; - color: #819D26; - text-decoration: none; -} - -.statisticstable select,.statisticstable textarea { - width: 170px; -} - -.alertbox tr:first-child,.evenrow { - background-color: #EEF6FF; -} - -.checkboxbtn,.radiobtn { - background-color: transparent; -} - -.langpopup2td,.langpopup1td { - background: #FDFDF5; -} - -.langpopup2td:first-child,.langpopup1td:first-child { - color: #000; - font-size: 10pt; -} - -form.token select,form.token input { - margin-top: 1.5em; - float: right; -} - -table.alertbox { - width: 450px; - margin-left: auto; - margin-right: auto; - border: 1px solid; - border-color: #D2E0F2 #8195BA #8195BA #D2E0F2; - text-align: left; -} - -.menubar tr { - text-align: right; -} - -div.menubar input { - margin-right: -5px; - vertical-align: top; -} - -#surveydetails td:first-child,#groupdetails td:first-child,#questiondetails td:first-child - { - text-align: left; -} - -#surveydetails td+td,#groupdetails td+td,#questiondetails td+td { - text-align: right; -} -.labelsets-update label{display:block} -.button-list{text-align:right} diff --git a/include/limesurvey/admin/styles/default/adminstyle.css b/include/limesurvey/admin/styles/default/adminstyle.css deleted file mode 100644 index 9e8f182b..00000000 --- a/include/limesurvey/admin/styles/default/adminstyle.css +++ /dev/null @@ -1,1491 +0,0 @@ -body { - font-family: verdana, arial, sans-serif; - text-align: left; - background-color: #5670A1; - margin: 0; - font-size: 9pt; -} - -div, form { - margin: 0; - padding: 0; - -} - -ul,ol { - text-align: left; - font-size: 0.9em;/* 10pt; */ - color: #000; -} - -p { - clear: left; - text-align:center; -} - -/* Administration footer box */ -.footer { - text-align: center; - color: #9C0; - height: 30px; - background: #121a28; - margin: 0; - padding: 5px; - margin-bottom:20px; - clear:left; -} - -img { - border: 0; -} - -a { - color: #328639; - text-decoration: underline; - cursor:pointer; -} - -a:hover { - color: #819D26; - text-decoration: underline; -} - -th, p, div { - font-size: 1.1em; /* 10pt; */ -} - -fieldset { - padding:0 6px/* 0px 6px */; - margin: 5px; - border-color:#D2E0F2 #8195BA #8195BA #D2E0F2; - border-style: solid; - border-width: 1px; -} - -legend { - font-weight: bold; - color:#2D466B; -} - -.maintitle { - font-size: 14pt; - font-weight: 700; - color: #328639; - text-align: center; - background: #C4C4C4; - border-top: 2px solid #C9EF50; - border-bottom: 2px solid #6a8b03; - background-image: url(bkgmaintitle.gif); - background-repeat: repeat-x; - width:100%; -} - -table.statisticstable { - margin: 2px auto; -} - -table.statisticstable span { - font-weight:bold; -} - -span.basic { - color: #1d2d45; -} - -.statisticstable td { - vertical-align: top; -} - -/* Start menubar */ -div.menubar { - background-color: #EEF6FF; - clear:left; - padding:0; - margin:3px auto 3px auto; - width: 99.5%; - min-height: 60px; -} - -.menubar-main { - background-color: #EEF6FF; - width: 99.6%; - float: left; - border-color: #D2E0F2 #8195BA #8195BA #D2E0F2; - border-style: solid; - border-width: 1px; - padding:0 0.2%; - min-height: 43px; - -} - -.menubar img { - vertical-align: middle; - max-height:40px; - border:0; - margin:0 -2px; -} - -.menubar-title { - background-color: #EEF6FF; - float: left; - width: 99.6%; - font-size: 11px; - text-align: left; - border-color: #D2E0F2 #8195BA #D2E0F2 #D2E0F2; - border-style: solid; - border-width: 1px; - padding:0 0.2%; - min-height:14px; -} - -.menubar-title img { - margin-bottom:2px; -} - -.menubar-title-left { - float: left; - font-size:11px; -} - -.menubar-title-right { - float: right; -} - -.menubar-title-right a { - font-size:10px; - font-weight:bold; - color:#ee0000 !important; - text-decoration: underline !important; -} - -.menubar-left { - background-color: #EEF6FF; - text-align: left; - float: left; - clear: none; - margin: 0; - padding: 0; - -} - -.menubar-right { - background-color: #EEF6FF; - float: right; - line-height: 1em; - white-space: nowrap; -} - -.menubar select { - color: #333; - width: 200px; -} - -.menubar-right .arrow-wrapper { - display: inline; /* For IE */ - position: relative; - margin: 0 5px 0 5px; - width: 20px; - vertical-align: bottom; -} - -html>body .menubar-right .arrow-wrapper { /* For real browsers */ - display: inline-block; -} - -.menubar-right .arrow-wrapper a { - display: block; -} - -.menubar-right .arrow-wrapper img { - display: block; - margin: 0; -} - -/* END menubar CSS */ - -#surveydetails, #groupdetails, #questiondetails { - background-color: #FFF; - width: 100%; - border: 1px solid; - border-color: #fff #8195BA #8195BA #D2E0F2; - margin-top:-2px; - margin-bottom:4px; - padding:5px 0; - clear:left; -} - -#surveydetails td:first-child, -#groupdetails td:first-child, -#questiondetails td:first-child { - width:20%; -} - -#surveydetails td+td, -#groupdetails td+td, -#questiondetails td+td { - text-align:left; -} - -.outlinetable { - border: 1px solid #111; -} - -.outlinetable td { - font-size: 10pt; - border: 1px solid #483D8B; - background: #EEF6FF; -} - -.outlinetable th { - font-size: 10pt; - color: #1D2D45; - background: #CCE6FF; -} - -td { - font-size: 10pt; - color: #1D2D45; -} - -.btstyle { - font-size: 11px; -} - -.disabledbtn { -height:20px; -color:#999; -font-size:11px; -} - -.disabledUpDnBtn { - color: #999; - font-size: 11px; - border: none !important; - cursor: default; - KHTMLOpacity: 0.5; - MozOpacity: 0.5; - -khtml-opacity:.50; - -ms-filter:"alpha(opacity=50)"; - -moz-opacity:.50; - opacity:.50; -} - -input, select, button { - color: navy; - /* font: 10px verdana, arial, sans-serif; */ -} - -/* Uncomment these styles if you are using a system theme with a dark background -and are having difficulty seeing text in inputs, textareas and dropdown selects. */ -/* -input, -textarea { - background: #FFF; - border: 1px solid #DBDFE6; - border-top-color: #ABADB3; - border-bottom-color: #E3E9EF; - padding: 2px; -} - -select { - background: #FFF; - border: 1px solid #828790; -} -*/ - -input[disabled], textarea[disabled], select[disabled], button[disabled] { - color: #999 !important; - background: #EEE !important; - border:1px solid #ccc !important; -} - -textarea { - font-size: 10px; - color: navy; - font-family: verdana, arial, sans-serif; -} - - -.subtitle { - font-size: 10px; - color: #FFF; -} - -.listboxtemplates { - margin-top: 10px; - height: 20px; - color: #333; - width: 180px; -} - -.boxcaption { - font-size: 12px; - font-weight: 700; - line-height: 40px; - padding:0 4px; -} - -.saveOrderbtn { - border: thin solid #00CED1; - text-decoration: none; - font-weight: 700; - color: #B5B0DD; - background: #483D8B; - border-top: 1px solid #00BFFF; - border-left: 1px solid #00BFFF; - margin: 5px; -} - -.settingentryhighlight { - color: navy; - font-weight: 700; -} - -.statusentryhighlight { - font-size: 10px; - color: #E00; -} - -.annotationasterisk -{ - color: #E00; -} - -.annotation { - font-size: 10px; - color: #E00; -} - -.errortitle { - font-weight: 700; - color: #FF0F0F; -} - -.warningtitle { - font-weight: 700; - color: #ee303a; -} - -.successtitle { - font-weight: 700; - color: #16B700; -} - -font.settingcaption { - vertical-align: top; - text-align: right; - font-size: 13px; - font-weight: 700; - color: #1D2D45; -} - -span.settingcaption { - float: left; - width: 350px; - text-align: right; - font-weight: 700; - clear: left; - margin-bottom: 10px; - background-color: #F8F8FF; - color: #1D2D45; -} - -#assessmentsform span.settingcaption { - width: 15%; -} - -.settingentry { - float: left; - width: 660px; - padding-left: 5px; - font-size: 13px; - text-align: left; - clear: right; - margin-bottom: 10px; - background-color: #F8F8FF; - outline: 0 none; -} - -#assessmentsform .settingentry { - width: 80%; -} - -.settingentry span { - outline: 0 none; -} - -.settingrow { - width: 1015px; - clear: left; - margin: 0 auto 20px auto; - background-color: #F8F8FF; -} - -#assessmentsform .settingrow { - width: 100%; -} - -.settingrow .cke_skin_office2003, -.settingrow .cke_skin_office2003 .cke_wrapper{ - margin-bottom: 0; -} - -.movableList { - padding-left: 0; - width: 60em; - margin:0 auto; -} - -.movableNode { - list-style-type: none; - border: 1px solid #999; - width: 60em; - text-align: left; - margin-top: 2px; - background: #EEEFFF; - padding: 0.5em; -} - -.langpopup { - display:none; -} - -.langpopup ul { - font-size: 1em; - font-weight:bold; - padding-left:1.2em; - line-height:1.5em; - margin-top:0.5em; -} - -li.cancellink -{ - list-style-type:none; - margin-top:1em; - margin-left:-1.2em; - text-align:center; -} - - -tr.even -{ - background-color: #EFF4F9; -} -tr.odd,.oddrow { - background-color: #E3ECF5; -} - -.choicelist { - width: 200px; - font-size: 10pt; -} - -.ranklist { - width: 200px; - margin-top: 3px; -} - -th.admincell { - background-color: #F8BDB5; -} - - -.submit { - float: none !important; - margin: 0 auto; - margin-bottom: 10px; -} - -.header, .formheader, .headertwo, .settingcaption { - text-align: center; - font-size: 13px; - font-weight: 700; - background-color: #D2E0F2; - color: #1D2D45; -} - -.header_statistics { - height:21px; - padding:1px; - padding-left:42px; -} - -.btnaddanswer, -.btndelanswer, -.header_statistics img { - cursor:pointer; -} - -img.handle { - cursor:move; -} - - -.header_small { - margin-top:2px; - font-size: 11px; -} - -div.settingcaption{ - clear:both; - margin: 3px 0; -} - -.formheader -{ - width:100%; -} - -a:link, a:visited { - color: #819D26; - text-decoration: none; -} - -.statisticstable select, .statisticstable textarea { - width: 170px; -} - -.alertbox tr:first-child, .evenrow { - background-color: #EEF6FF; -} - -.checkboxbtn, .radiobtn { - background-color: transparent; -} - -table.alertbox { - width: 450px; - margin-left:auto; - margin-right:auto; - border: 1px solid; - border-color: #D2E0F2 #8195BA #8195BA #D2E0F2; - text-align: left; -} - -.menubar tr { - text-align:left; -} - -div.menubar input { - margin-left:-5px; - vertical-align:top; -} - -a.invalidemail { - font-weight: 700; - color: red; -} - -a.optoutemail { - font-weight: 700; - color: orange; -} - -/* Browse response css */ - -.browsetable { - border: 1px solid; - border-color: #D2E0F2 #8195BA #8195BA #D2E0F2; - clear:left; -} - -.browsetable tr:hover { - background-color: #C5D0F2; -} -.browsetable td span.content{ - display:block; - height:3em; - overflow:hidden; -} -.browsetable th strong.content{ - display:block; - height:4em; - overflow:hidden; -} - -.quotalist, -.addquotaanswer, -.edituser, -.users, -.assessmentlist, -.listsurveys, -.surveysecurity { - text-align:center; - margin:0 auto; -} - -.quotalist, -.addquotaanswer, -.assessmentlist { - width:90%; -} - -.users -{ - width:80%; -} - -.listsurveys -{ - width:70%; -} - -.surveysecurity -{ - width: 90%; -} - -.edituser { - width:60%; -} - -.quotalist th, -.assessmentlist th, -.edituser th, -.surveysecurity th, -.users th, -.listsurveys th { - background-color: #D2E0F2; - font-size:0.8em; - padding:2px 14px 2px 10px; -} - -.browsetable th { - background-color: #D2E0F2; - font-size:9pt; - padding:2px; - text-align: center; - min-width:80px; -} - -.browsetable td { - font-size:8pt; - padding:1px 2px; - text-align: center; -} - -.browsetable tfoot td { - text-align: left; - background-color: #D2E0F2; - padding:4px; -} - -.users td, -.surveysecurity td, -.listsurveys td { - font-size:0.8em; - padding:2px 6px; -} - -.users td input -{ - margin-left:2px; -} - -.assessmentlist td form, -#users td form { - display:inline; -} - -.browsetable th:first-child { - width:20px; - min-width: 0px; -} - -.answertable th { - font-weight:bold; - font-size: 8pt; - padding:3px; -} - -.answertable tr { - white-space: nowrap; -} - -.answertable th:first-child { - text-align:right; -} - -#languagetabs { - width:60%; - margin:0 auto; -} - -#assessmentsform #languagetabs { - min-width: 680px; - background-color: #F8F8FF; - background-image: none; -} - -.answertable tr.highlight { - background-color:#EAF2FF; -} - -.badtokenlist { - width: 400px; - background-color: #FFF; - border: 1px solid #CCC; - height: 50px; - overflow: auto; - text-align: left; - margin-bottom: 0px; - font-size: 8pt -} - -.browsetokens -{ - margin: 5px 2px; - border: 1px solid; - border-color: #D2E0F2 #8195BA #8195BA #D2E0F2; - clear: left; -} - -.browsetokens th { - white-space:nowrap; - width:auto; - padding:2px 15px 2px 5px; - font-size:12px; - background-color:#D2E0F2; - color: #1D2D45; - vertical-align:top; -} - -.browsetokens tr { - height:32px; -} - -.browsetokens th span{ - white-space:normal; -} - - -.browsetokens th img { - padding-right:4px; -} - -.browsetokens td { - padding:0 5px; - color: #1D2D45; -} - -.browsetokens td:first-child { - text-align:right; - padding-right: 3px; -} - -.tokensummary tr:first-child { - font-weight:bold; -} - -.tokensummary tr { - margin:0px; - padding:0px; -} - -.tokensummary td { - outline: 1px solid; - outline-color:#D2E0F2; -padding: 2px 5px; -} - -#addattribute label, -#sendinvitation label { - font-weight: bold; - margin-right: 0.5em; -} - -.annotation -{ - font-size:10px; -} - -table.templatecontrol { - width: 100%; - background-color: #EEF6FF; - border-color: #8195BA; - border-style: solid; - border-width: 1px; - text-align: left; -} - -table.templatecontrol select -{ - min-width:150px; -} - -.subheader { - font-size:10px; - font-weight:bold; - background-color: #EEF6FF; - text-align: left; -} - -.flashmessage -{ - font-size:10px; - font-weight:bold; -} - -.templatecontrol textarea#changes { - font-family: monospace; - font-size:0.8em; - width:95%; -} - -/* Added by evan to help usability on the user template rights form in useradmin/userrighthandling.php */ -table#user-template-rights -{ - width: 50%; - border: none; - border-collapse: collapse -} - -table#user-template-rights thead{ -} - -table#user-template-rights tr.row_odd -{ - background-color: #EBF2FA; -} -table#user-template-rights tr:hover -{ - background-color: #D1D1DF; -} - table#user-template-rights tr td -,table#user-template-rights tr th -,table#user-template-rights tfoot tr td -{ - border: none; - text-align: center; -} -table#user-template-rights tbody tr td:first-child -{ - text-align: left; -} - - -table.statisticstable, table.statisticssummary { - background-color:#EEF6FF; - border-collapse:collapse; - border-width: 0px; - border-style: none; - margin: 0 auto; - margin-bottom:20px; -} - -.statisticssummary thead th -{ - background:#D2E0F2; -} - -.statisticssummary th:first-child, -.statisticstable td:first-child { - text-align:right; -} - -.statisticssummary thead th:first-child -{ - text-align:center; -} - -.statisticssummary th, .statisticssummary td, .statisticstable td { - padding:3px 10px; - -} - -.statisticstable tr { - border-color: #fff; - border-style: solid; - border-width: 1px; -} - -.statisticstable thead th { - background:#D2E0F2; - text-align:center; - color:#1D2D45; - padding:4px 10px; -} - -.statisticstable tfoot tr { - background:#D2E0F2; - text-align:center; -} - -#personalsettings label { - float: left; - width: 20em; - margin-right: 0.5em; - text-align: right; - font-weight: bold; -} - -#personalsettings li { - list-style-type: none; - padding-bottom:5px; -} - -form#personalsettings { - width:750px; - margin:0 auto; -} - -div.messagebox { - width: 550px; - margin:10px auto; - border: 1px solid; - border-color: #D2E0F2 #8195BA #8195BA #D2E0F2; - background-color: #F8F8FF; - text-align: center; - padding:10px; -} - -div.messagebox .header{ - padding:10px; -} - -div.successheader{ - font-weight:bold; - color:#008000; - background-color: #C0FFC0; - margin: 5px 0; - padding:2px; -} -div.errorheader{ - font-weight:bold; - color:#800000; - background-color: #FFC0C0; - margin: 5px 0; - padding:2px; -} -div.warningheader{ - font-weight:bold; - color:#808000; - background-color: #FFC0C0; - margin: 5px 0; - padding:2px; -} -div.partialheader{ - font-weight:bold; - color: #CC3300; - background-color: #FF9900; - margin: 5px 0; - padding:2px; -} - -div.messagebox .warningheader { - font-weight:bold; - color:#ee0000; - background-color: #ffeeee; - margin: 5px 0; - padding:2px; -} - -/* Conditions designer interface */ - -.condition-tbl-row { - width: 100%; - float: left; - padding: 0; - margin: 0; -} - -.conditioncopy-tbl-row { - width: 100%; - height: 300px; - float: left; - padding: 0; - margin: 0; -} - -.condition-tbl-left { - width: 24%; - float: left; - padding: 10px 1% 0 0; - text-align: right; - font-weight: bold; -} - -.condition-tbl-right { - width: 74%; - float: left; - padding: 10px 0 0 0; - text-align: left; -} - -.condition-tbl-full { - width: 100%; - clear: both; - padding: 10px 0 5px 0; - text-align: center; -} - -#defaultscenariotxt { - display: block; - margin-top: 3px; -} - -.tabs-nav { - width: 80%; -} - -.tabs-nav select, -.tabs-nav textarea{ - font-family: verdana; - font-size: 10px; - width: 100%; -} - -.conditiontbl td { - text-align:left; -} - -.conditiontbl td:first-child { - text-align:right; -} - -/* Data entry interface */ - -.data-entry-small-text { - font-size: 8pt; -} - -.data-entry-tbl { - margin: 5px 0 0 0; -} - -#conditionsource, #conditiontarget{ - width: 630px; -} - -#editconditions select{ - font-size:10px; -} - -.data-entry-tbl td { - padding: 3px 5px; -} - -.data-entry-tbl .data-entry-separator td { - padding: 0; - height: 2px; - background-color: #D2E0F2; -} - -.data-entry-explanation { - background-color: #FFEEEE; -} - -/* ComfortUpdate interface */ - -.updater-background { - background-color:#f8f8ff; - padding:1% 10%; -} - -textarea.updater-changelog { - width:800px; - height:300px; - background-color:#fff; - font-family:Monospace; - font-size:11px; -} - -/*controls the width of select boxes in group order dialog*/ -.movableNode select { - max-width:200px; -} - -.form44 li label:first-child, -#exportspss li label:first-child, -#importtemplate li label:first-child, -#tokenimport li label:first-child, -#statistics_general_filter li label:first-child, -#vvexport li label:first-child, -#importlabels li label:first-child, -#exportdialog li label:first-child, -#frmeditquestion li label:first-child, -#importquestion li label:first-child, -#bouncesettings li label:first-child, -#importquestion li label:first-child { - width: 50%; - text-align: right; - margin-right: 0.5em; - float: left; - font-weight: bold; - color: #1d2d45; -} - -#loginform li label:first-child { - width: 39%; - text-align: right; - margin-right: 0.5em; - float: left; - font-weight: bold; - color: #1d2d45; -} - -.form30newtabs li label:first-child, -.form30 li label:first-child { - width: 30%; - text-align: right; - margin-right: 0.5em; - float: left; - font-weight: bold; - color: #121A28; -} - -.form30 table { - width: auto; - float: left; -} - -.form30newtabs div div div div li{ - list-style-type: none; - clear:left; - padding-bottom:5px; -} - - - -.form30 li, -.form44 li, -#exportstructureQuestion li, -#exportstructureGroup li, -#frmeditgroup li, -#usergroupform li, -#importtemplate li, -#frmcopyquestion li, -#importlabelresources li, -#loginform li, -#statistics_general_filter li, -#tokenimport li, -#vvexport li, -#exportstructure li, -#importlabels li, -#sendreminder li, -#sendinvitation li, -#edittoken li, -#exportdialog li, -#addnewsurvey li, -#newquestiongroup li, -#importsurvey li, -#importgroup li, -#addnewquotaform li, -#assessmentsform li, -#importsurveyresources li, -#labelsetform li, -#bouncesettings li, -#exportspss li{ - list-style-type: none; - clear:left; - padding-bottom:5px; -} - -#assessmentsform .ui-tabs-nav li { - clear: none; -} - -#frmeditquestion li, -#importquestion li { - list-style-type: none; - clear:left; - padding-bottom:7px; -} - -#forgotpassword input#user, #forgotpassword input#email -{ - width:18em; -} - -div.loader { - background-image: url(images/ajax-loader.gif); - background-repeat: no-repeat; - background-position: center; - width:80px; - margin:0 auto; - padding-top:75px; -} - -#wrapper { - background-color:#f8f8ff; - width:100%; - padding:1px 0px; -} - -.background { - background-color:#f8f8ff; - padding:1% 10%; -} - -#emailtemplates .ui-tabs-panel iframe, -#frmeditgroup .ui-tabs-panel iframe, -#frmcopyquestion .tab-page iframe, -#sendreminder .tab-page iframe, -#newquestiongroup .ui-tabs-panel iframe, -#sendinvitation .ui-tabs-panel iframe, -#addnewsurvey .ui-tabs-panel iframe { - -} - -#editsurvey textarea, -#editsurvey input { - -} - -#editsurvey td { - -} - - -#help -{ - float:right; -} - -thead tr .header { - background-repeat: no-repeat; - background-position: center right; - cursor: pointer; -} - -thead tr .headerSortUp { - background-image: url(images/asc.gif); -} -thead tr .headerSortDown { - background-image: url(images/desc.gif); -} - -thead tr .headerSortDown, thead tr .headerSortUp { -background-color: #8195BA; -} - -#tokensearch, #tokenrange, #browseresults{ - display:inline; - line-height:40px; - vertical-align:middle; - margin-left: 10px; -} - -#tokensearch input, #tokenrange input, #browseresults input{ - vertical-align:middle; - margin-left: 2px; -} - -.tab-page { - border-color:#D2E0F2 #8195BA #8195BA #D2E0F2 !important; -} - -.tab-pane { - margin:0 0.25%; - width:99.5% !important; -} - -#questionbottom { - clear:both; -} - -div.left -{ -float:left; -width: 49%;/* 300px; */ -} - -div.right { - float:right; - width:49%;/* 300px; */ -} - -.wrap2columns { -width:auto; /* 600px; */ -margin:0 auto; -padding:10px; -} - -#resultexport ul { - list-style-type:none; - padding:0; -} - -#resultexport ul li label { -} - - -#resultexport ul li { - line-height: 1.4em; -} - -#advancedquestionsettings fieldset { - width:600px; - margin:0 auto; - display: block; -} - -#advancedquestionsettings textarea{ - width:200px; -} - -.statistics-tbl-separator td { - background-color:#D2E0F2; - height:2px; - padding:0; -} - -#statistics_general_filter { - width:950px; - margin:0 auto; -} - -#statistics_general_filter fieldset{ -clear:both; -} - - -#statistics_general_filter #left { - width:47%; - height:131px; - float:left; - clear:left; -} - -#statistics_general_filter #right { - width:47%; - /* height:125px; */ - float:right; - clear:none; -} - -#statistics_general_filter #right li label:first-child { - width:33%; -} - -.filtertable { - background:#EEF6FF; - text-align:center; - margin:5px 15px; - border:1px #fff solid; - padding:3px 10px; -} - -.filtertable td { - padding:3px 10px 7px 10px; - border-right:1px #fff solid; - border-bottom:1px #fff solid; - vertical-align: top; - border-collapse:collapse !important; -} - -.filtertable td:last-child { - border-left:0px #D2E0F2 solid; -} - -.filtertable tr:last-child td { - border-top:0px #D2E0F2 solid; -} - -.filtertable span { - font-size:10px; - font-weight: bold; -} - -.filtertable textarea { - width:210px; -} - -.limebutton -{ - outline: 0; - margin:1px 4px 1px 0; - padding: 1px 1em; - text-decoration:none !important; - cursor:pointer; - text-align: center; - zoom: 1; -} - -#emailtemplates .ui-tabs-panel .limebutton { - margin: 3px 20% 10px 30.5%; -} - -table.limetable thead th{ - background-color: #D2E0F2; - font-size:8pt; - padding:2px 14px 2px 10px; -} - -table.limetable tbody tr.highlight { - background-color:#EAF2FF; -} - -#surveyhandleright{ - margin-right:7px; -} - -#surveyhandleleft{ - margin-left:7px; -} - -#exportstructureQuestion ul, -#exportstructureGroup ul{ - margin-left:auto; - margin-right:auto; - width:400px; -} - -.users td:first-child,.users th:first-child -{ - width:10%; -} - -thead th -{ - background-color:#E1E7EF; -} - -.usersurveypermissions th{ - padding:0 2em; -} - -#responsedetail td{ - padding:3px 5px; -} - -#frmglobalsettings table { - float:none; -} - - -.ui-notify { - width:350px; - position:fixed; - top:35px; - left:50%; - margin-left: -175px; -} - -div.translate { - margin: 2px 1px; -} - -#translateform table { - padding: 1px 0; - vertical-align: top; - width: 90%; -} - -#translateform table td{ - padding: 1px 4px; -} - - -#translateform textarea:focus{ - outline: blue solid thin; -} - -.textresponses { - text-align: center; - border: 1px solid #eee; - height: 200px; - overflow: auto; -} -.labelsets-update label{display:block} -.button-list{text-align:left} diff --git a/include/limesurvey/admin/styles/default/bkgmaintitle.gif b/include/limesurvey/admin/styles/default/bkgmaintitle.gif deleted file mode 100644 index 7522a3d4..00000000 Binary files a/include/limesurvey/admin/styles/default/bkgmaintitle.gif and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ajax-loader.gif b/include/limesurvey/admin/styles/default/images/ajax-loader.gif deleted file mode 100644 index 125ff268..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ajax-loader.gif and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/arrows.png b/include/limesurvey/admin/styles/default/images/arrows.png deleted file mode 100644 index 6f6b41a1..00000000 Binary files a/include/limesurvey/admin/styles/default/images/arrows.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/asc.gif b/include/limesurvey/admin/styles/default/images/asc.gif deleted file mode 100644 index 74157867..00000000 Binary files a/include/limesurvey/admin/styles/default/images/asc.gif and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/desc.gif b/include/limesurvey/admin/styles/default/images/desc.gif deleted file mode 100644 index 3b30b3c5..00000000 Binary files a/include/limesurvey/admin/styles/default/images/desc.gif and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/next-horizontal.png b/include/limesurvey/admin/styles/default/images/next-horizontal.png deleted file mode 100644 index 6fcd3d90..00000000 Binary files a/include/limesurvey/admin/styles/default/images/next-horizontal.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/prev-horizontal.png b/include/limesurvey/admin/styles/default/images/prev-horizontal.png deleted file mode 100644 index 36472c05..00000000 Binary files a/include/limesurvey/admin/styles/default/images/prev-horizontal.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/shadow.png b/include/limesurvey/admin/styles/default/images/shadow.png deleted file mode 100644 index c04d21b7..00000000 Binary files a/include/limesurvey/admin/styles/default/images/shadow.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-bg_flat_0_aaaaaa_40x100.png b/include/limesurvey/admin/styles/default/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index e425e6e4..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-bg_flat_75_F8F8FF_40x100.png b/include/limesurvey/admin/styles/default/images/ui-bg_flat_75_F8F8FF_40x100.png deleted file mode 100644 index 688f9f5b..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-bg_flat_75_F8F8FF_40x100.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-bg_glass_55_fbf9ee_1x400.png b/include/limesurvey/admin/styles/default/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index ad3d6346..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-bg_glass_65_ffffff_1x400.png b/include/limesurvey/admin/styles/default/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index 8569c1bc..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-bg_glass_75_EAF2FF_1x400.png b/include/limesurvey/admin/styles/default/images/ui-bg_glass_75_EAF2FF_1x400.png deleted file mode 100644 index 041e4ec5..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-bg_glass_75_EAF2FF_1x400.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-bg_glass_75_dadada_1x400.png b/include/limesurvey/admin/styles/default/images/ui-bg_glass_75_dadada_1x400.png deleted file mode 100644 index 5a46b47c..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-bg_glass_75_dadada_1x400.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-bg_highlight-soft_75_F8F8FF_1x100.png b/include/limesurvey/admin/styles/default/images/ui-bg_highlight-soft_75_F8F8FF_1x100.png deleted file mode 100644 index e55c8f46..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-bg_highlight-soft_75_F8F8FF_1x100.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-bg_inset-soft_95_fef1ec_1x100.png b/include/limesurvey/admin/styles/default/images/ui-bg_inset-soft_95_fef1ec_1x100.png deleted file mode 100644 index 0e05810f..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-bg_inset-soft_95_fef1ec_1x100.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-icons_222222_256x240.png b/include/limesurvey/admin/styles/default/images/ui-icons_222222_256x240.png deleted file mode 100644 index 969d5c30..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-icons_222222_256x240.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-icons_2e83ff_256x240.png b/include/limesurvey/admin/styles/default/images/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 011cac10..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-icons_2e83ff_256x240.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-icons_328639_256x240.png b/include/limesurvey/admin/styles/default/images/ui-icons_328639_256x240.png deleted file mode 100644 index 42cd3891..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-icons_328639_256x240.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-icons_454545_256x240.png b/include/limesurvey/admin/styles/default/images/ui-icons_454545_256x240.png deleted file mode 100644 index 2ab45ea5..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-icons_454545_256x240.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-icons_888888_256x240.png b/include/limesurvey/admin/styles/default/images/ui-icons_888888_256x240.png deleted file mode 100644 index f555959a..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-icons_888888_256x240.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/images/ui-icons_cd0a0a_256x240.png b/include/limesurvey/admin/styles/default/images/ui-icons_cd0a0a_256x240.png deleted file mode 100644 index 1b66148c..00000000 Binary files a/include/limesurvey/admin/styles/default/images/ui-icons_cd0a0a_256x240.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/limesurvey.pal b/include/limesurvey/admin/styles/default/limesurvey.pal deleted file mode 100644 index aaee82a1..00000000 --- a/include/limesurvey/admin/styles/default/limesurvey.pal +++ /dev/null @@ -1,72 +0,0 @@ -20,130,200 -232,95,51 -34,205,33 -210,211,28 -134,179,129 -201,171,131 -251,231,221 -23,169,161 -167,187,213 -211,151,213 -147,145,246 -147,39,90 -250,250,201 -201,250,250 -94,0,94 -250,125,127 -0,96,201 -201,202,250 -0,0,127 -250,0,250 -250,250,0 -0,250,250 -127,0,127 -127,0,0 -0,125,127 -0,0,250 -0,202,250 -201,250,250 -201,250,201 -250,250,151 -151,202,250 -251,149,201 -201,149,250 -250,202,151 -45,96,250 -45,202,201 -151,202,0 -250,202,0 -250,149,0 -250,96,0 -184,230,115 -102,128,64 -220,230,207 -134,191,48 -184,92,161 -128,64,112 -230,207,224 -191,48,155 -230,138,115 -128,77,64 -230,211,207 -191,77,48 -80,161,126 -64,128,100 -207,230,220 -48,191,130 -25,25,179 -18,18,125 -200,200,255 -145,145,255 -255,178,0 -179,125,0 -255,236,191 -255,217,128 -255,255,0 -179,179,0 -255,255,191 -255,255,128 -102,0,153 -71,0,107 -234,191,255 -213,128,255 \ No newline at end of file diff --git a/include/limesurvey/admin/styles/default/loading.gif b/include/limesurvey/admin/styles/default/loading.gif deleted file mode 100644 index 85b99d46..00000000 Binary files a/include/limesurvey/admin/styles/default/loading.gif and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/printablestyle.css b/include/limesurvey/admin/styles/default/printablestyle.css deleted file mode 100644 index 25bc7058..00000000 --- a/include/limesurvey/admin/styles/default/printablestyle.css +++ /dev/null @@ -1,13 +0,0 @@ -@media print { - #exportbutton { - display: none; - } -} - -.statisticstable { - page-break-after: always; -} - -td { - color: #fff; -} \ No newline at end of file diff --git a/include/limesurvey/admin/styles/default/superfish.css b/include/limesurvey/admin/styles/default/superfish.css deleted file mode 100644 index 1a909ef7..00000000 --- a/include/limesurvey/admin/styles/default/superfish.css +++ /dev/null @@ -1,158 +0,0 @@ - -/*** ESSENTIAL STYLES ***/ -.sf-menu, .sf-menu * { - margin: 0; - padding: 0; - list-style: none; -} -.sf-menu { - height:31px; - line-height: 1.0; -} -.sf-menu ul { - position: absolute; - top: -999em; - width: 18em; /* left offset of submenus need to match (see below) */ -} -.sf-menu ul li { - width: 100%; -} -.sf-menu li:hover { - visibility: inherit; /* fixes IE7 'sticky bug' */ -} -.sf-menu li { - float: left; - position: relative; - z-index: 100; /* TP - keep the dropdowns above tabbed content in IE7 */ -} -.sf-menu a { - display: block; - position: relative; -} -.sf-menu li:hover ul, -.sf-menu li.sfHover ul { - left: 0; - top: 43px; /* match top ul list item height */ - z-index: 99; -} - -.sf-menu.sf-js-enabled li:hover ul, -.sf-menu.sf-js-enabled li.sfHover ul { - top: 44px; -} - -ul.sf-menu li:hover li ul, -ul.sf-menu li.sfHover li ul { - top: -999em; -} -ul.sf-menu li li:hover ul, -ul.sf-menu li li.sfHover ul { - left: 18em; /* match ul width */ - top: 0; -} -ul.sf-menu li li:hover li ul, -ul.sf-menu li li.sfHover li ul { - top: -999em; -} -ul.sf-menu li li li:hover ul, -ul.sf-menu li li li.sfHover ul { - left: 18em; /* match ul width */ - top: 0; -} - -/*** DEMO SKIN ***/ -.sf-menu { - float: left; - margin-bottom: 1em; -} - -.menubar-main ul.sf-menu { - height: auto; - margin-bottom: 0; -} - -.sf-menu a { - padding: 0.1em 1em; - text-decoration:none; -} - -.menubar-main .sf-menu a { - padding: 1px 1em 0 1em; - height: 42px; -} - -.sf-menu a, .sf-menu a:visited { /* visited pseudo selector so IE6 applies text colour*/ - color: #13a; -} -.sf-menu li { - background: #EEF6FF; -} -.sf-menu li li { - background: #AABDE6; -} -.sf-menu li li li { - background: #9AAEDB; -} -.sf-menu li:hover, .sf-menu li.sfHover, -.sf-menu a:focus, .sf-menu a:hover, .sf-menu a:active { - background: #DBE6F4; - outline: 0; -} - -/*** arrows **/ -.sf-menu a.sf-with-ul { - padding-right: 1.7em; - min-width: 1px; /* trigger IE7 hasLayout so spans position accurately */ -} -.sf-sub-indicator { - position: absolute; - display: block; - right: .75em; - top: 1.95em; /* IE6 only */ - width: 10px; - height: 10px; - text-indent: -999em; - overflow: hidden; - background: url('images/arrows.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */ -} -a > .sf-sub-indicator { /* give all except IE6 the correct values */ - top: 2em; - background-position: 0 -100px; /* use translucent arrow for modern browsers*/ -} -/* apply hovers to modern browsers */ -a:focus > .sf-sub-indicator, -a:hover > .sf-sub-indicator, -a:active > .sf-sub-indicator, -li:hover > a > .sf-sub-indicator, -li.sfHover > a > .sf-sub-indicator { - background-position: -10px -100px; /* arrow hovers for modern browsers*/ -} - -/* point right for anchors in subs */ -.sf-menu ul .sf-sub-indicator { background-position: -10px 0; } -.sf-menu ul a > .sf-sub-indicator { - background-position: 0 0; - top: 1em; -} - -/* apply hovers to modern browsers */ -.sf-menu ul a:focus > .sf-sub-indicator, -.sf-menu ul a:hover > .sf-sub-indicator, -.sf-menu ul a:active > .sf-sub-indicator, -.sf-menu ul li:hover > a > .sf-sub-indicator, -.sf-menu ul li.sfHover > a > .sf-sub-indicator { - background-position: -10px 0; /* arrow hovers for modern browsers*/ -} - -/*** shadows for all but IE6 ***/ -.sf-shadow ul { - background: url('images/shadow.png') no-repeat bottom right; - padding: 0 8px 9px 0; - -moz-border-radius-bottomleft: 17px; - -moz-border-radius-topright: 17px; - -webkit-border-top-right-radius: 17px; - -webkit-border-bottom-left-radius: 17px; -} -.sf-shadow ul.sf-shadow-off { - background: transparent; -} diff --git a/include/limesurvey/admin/styles/default/tab.png b/include/limesurvey/admin/styles/default/tab.png deleted file mode 100644 index 161f6e05..00000000 Binary files a/include/limesurvey/admin/styles/default/tab.png and /dev/null differ diff --git a/include/limesurvey/admin/styles/default/tab.webfx.css b/include/limesurvey/admin/styles/default/tab.webfx.css deleted file mode 100644 index d1e2b971..00000000 --- a/include/limesurvey/admin/styles/default/tab.webfx.css +++ /dev/null @@ -1,80 +0,0 @@ -/* - -bright: rgb(234,242,255); -normal: rgb(120,172,255); -dark: rgb(0,66,174); - -*/ -.dynamic-tab-pane-control.tab-pane { - position: relative; - width: 100%; -} - -.dynamic-tab-pane-control .tab-row .tab { - font-family: Verdana, Helvetica, Arial; - font-size: 12px; - cursor: Default; - display: inline; - margin: 1px -5px 1px 5px; - float: left; - padding: 3px 6px 3px 6px; - background: rgb(234, 242, 255); - border: 1px solid; - border-color: rgb(210, 210, 210); - border-left: 1px; - border-bottom: 0; - border-top: 1px; - cursor: pointer; - z-index: 1; - position: relative; - top: 0; -} - -.dynamic-tab-pane-control .tab-row .tab.selected { - border: 1px solid rgb(120, 172, 255); - border-bottom: 0; - z-index: 3; - padding: 2px 6px 5px 6px; - margin: 1px -6px -2px 0px; - top: -2px; - background: white; -} - -.dynamic-tab-pane-control .tab-row .tab a { - font-family: Verdana, Helvetica, Arial; - font-size: 13px; - color: #5670A1; - text-decoration: none; - cursor: pointer; -} - -.dynamic-tab-pane-control .tab-row .hover a { - color: #328639; - text-decoration: underline; -} - -.dynamic-tab-pane-control .tab-row .tab.selected a { - font-weight: bold; - color: #328639; -} - -.dynamic-tab-pane-control .tab-page { - clear: both; - border: 1px solid #888888; - background: #F8F8FF; - z-index: 2; - position: relative; - top: -2px; - color: Black; - font-family: Verdana, Helvetica, Arial; - font-size: 13px; - padding: 10px; -} - -.dynamic-tab-pane-control .tab-row { - z-index: 1; - white-space: nowrap; - /* background: #EEEEEE; */ - height: 1.85em; - width: 100%; -} \ No newline at end of file diff --git a/include/limesurvey/admin/styles/phpsurveyor/adminstyle.css b/include/limesurvey/admin/styles/phpsurveyor/adminstyle.css deleted file mode 100644 index a1f27987..00000000 --- a/include/limesurvey/admin/styles/phpsurveyor/adminstyle.css +++ /dev/null @@ -1,303 +0,0 @@ -body { - font-family: verdana, arial, sans-serif; - margin: 0; - text-align: left; -} - -.footer { - margin: 0; - padding: 5px; - text-align: center; - color: #fff; - height: 30px; - background: #000; -} - -img { - border: 0; -} - -th,a,p,div { - font-size: 10pt; -} - -.maintitle { - font-size: 14pt; - font-weight: bold; - color: #FFF; - text-align: center; - margin: auto; - background: black; -} - -table.menubar { - width: 100%; - border-color: #555; - border-width: 1px; - border-style: solid; - border-collapse: collapse; -} - -.menubar tr:first-child { - background: #555; -} - -.menubar tr { - background: #999; -} - -.menubar td:first-child { - color: #FFF; - font-size: 8pt; -} - -.outlinetable { - border: 1px solid #111; -} - -.outlinetable td { - font-size: 10pt; - border: 1px solid #CCC; - background: #EEE; -} - -.outlinetable th { - font-size: 10pt; - color: #FFF; - background: #777; -} - -ul { - font-size: 10pt; - color: #000; -} - -td { - font-size: 10pt; - color: #000; -} - -.btstyle { - font-size: 11px; -} - -.standardbtn { - height: 20px; - color: #000; - font-size: 11px; -} - -.disabledbtn { - height: 20px; - color: #999; - font-size: 11px; -} - -input,select { - color: #000080; - background: #EEEFFF; - font: 10px verdana, arial, sans-serif; -} - -action { - text-align: left; -} - -textarea { - font-size: 10px; - color: #000080; - background: #EEEFFF; -} - -.subtitle { - font-size: 10px; - color: #FFF; -} - -.listboxsurveys { - margin-top: 10px; - height: 20px; - font-size: 10px; - color: #333; - background: SILVER; - width: 180px; -} - -.listboxgroups { - margin-top: 10px; - height: 20px; - font-size: 10px; - color: #333; - background: SILVER; - width: 180px; -} - -.listboxquestions { - margin-top: 10px; - height: 20px; - font-size: 10px; - color: #333; - background: SILVER; - width: 180px; -} - -.boxcaption { - font-size: 12px; - font-weight: bold; - vertical-align: middle; -} - -.saveOrderbtn { - border: thin solid #000; - text-decoration: none; - font-weight: bold; - color: #000; - margin: 5px; - background: #D4D0C8; -} - -.settingentryhighlight { - color: #000080; - font-weight: bold; -} - -.statusentryhighlight { - font-size: 10px; - color: #F00; -} - -.warningtitle { - font-weight: bold; - color: #F00; -} - -.successtitle { - font-weight: bold; - color: #090; -} - -font.settingcaption { - vertical-align: top; - text-align: right; - font-size: 13px; - font-weight: bold; -} - -span.settingcaption { - float: left; - width: 150px; - text-align: right; - font-size: 13px; - font-weight: bold; - clear: left; - margin-bottom: 10px; -} - -.settingentry { - float: left; - width: 450px; - padding-left: 5px; - font-size: 13px; - text-align: left; - clear: right; - margin-bottom: 10px; -} - -.settingrow { - width: 620px; - float: center; - clear: left; - margin-bottom: 20px; -} - -#dhtmlgoodies_tooltip { - border: 1px solid #000; - position: absolute; - display: none; - z-index: 20000; - padding: 2px; - -moz-border-radius: 5px; - background: #FF6; - font: 0.8em "Verdana", "Lucida Sans Unicode", Arial, sans-serif; -} - -#dhtmlgoodies_tooltipShadow { - position: absolute; - display: none; - z-index: 10000; - opacity: 0.7; - filter: alpha(opacity = 70); - -khtml-opacity: 0.7; - -moz-opacity: 0.7; - -moz-border-radius: 5px; - background: #555; -} - -.movableNodeul { - padding-left: 0; - margin-left: 0; - margin-top: 0; - padding-top: 0; - width: 50em; -} - -.movableNode { - list-style-type: none; - border: 1px solid #999; - padding: 0.5em; - width: 50em; - text-align: left; - margin-top: 2px; - background: #EEE; -} - -.testsurvpopup { - position: absolute; - width: 100px; - height: 110px; - top: 151px; - left: 80px; - border-style: solid; - border-width: 1px; - border-color: #000; - padding: 8px; - z-index: 10000; - opacity: 0.7; - visibility: hidden; - filter: alpha(opacity = 95); - -khtml-opacity: 0.95; - -moz-opacity: 0.95; - -moz-border-radius: 6px; - background: #FF6; - font: 11px arial, verdana, sans-serif; -} - -.testsurvpopup td { - background: #FF6; -} - -.testsurvpopup td:first-child { - color: #000; - font-size: 10pt; -} - -.previewpopup { - position: absolute; - width: 110px; - height: 125px; - top: 287px; - left: 473px; - border-style: solid; - border-width: 1px; - border-color: #000; - padding: 8px; - z-index: 10000; - opacity: 0.7; - visibility: hidden; - filter: alpha(opacity = 95); - -khtml-opacity: 0.95; - -moz-opacity: 0.95; - -moz-border-radius: 6px; - background: #FF6; - font: 11px arial, verdana, sans-serif; -} \ No newline at end of file diff --git a/include/limesurvey/admin/surveylist.php b/include/limesurvey/admin/surveylist.php deleted file mode 100644 index c903b09a..00000000 --- a/include/limesurvey/admin/surveylist.php +++ /dev/null @@ -1,265 +0,0 @@ -ErrorMsg()); //Checked - - if($result->RecordCount() > 0) { - $listsurveys= "
    - - - - - - - - - - - - - - - - - - - - - ". - " - "; - $gbc = "evenrow"; - $dateformatdetails=getDateFormatData($_SESSION['dateformat']); - - while($rows = $result->FetchRow()) - { - if($rows['anonymized']=="Y") - { - $privacy=$clang->gT("Yes") ; - } - else $privacy =$clang->gT("No") ; - - - if (tableExists('tokens_'.$rows['sid'])) - { - $visibility = $clang->gT("Closed"); - } - else - { - $visibility = $clang->gT("Open"); - } - - if($rows['active']=="Y") - { - if ($rows['expires']!='' && $rows['expires'] < date_shift(date("Y-m-d H:i:s"), "Y-m-d", $timeadjust)) - { - $status=$clang->gT("Expired") ; - } - elseif ($rows['startdate']!='' && $rows['startdate'] > date_shift(date("Y-m-d H:i:s"), "Y-m-d", $timeadjust)) - { - $status=$clang->gT("Not yet active") ; - } - else { - $status=$clang->gT("Active") ; - } - // Complete Survey Responses - added by DLR - $gnquery = "SELECT count(id) FROM ".db_table_name("survey_".$rows['sid'])." WHERE submitdate IS NULL"; - $gnresult = db_execute_num($gnquery); //Checked - while ($gnrow = $gnresult->FetchRow()) - { - $partial_responses=$gnrow[0]; - } - $gnquery = "SELECT count(id) FROM ".db_table_name("survey_".$rows['sid']); - $gnresult = db_execute_num($gnquery); //Checked - while ($gnrow = $gnresult->FetchRow()) - { - $responses=$gnrow[0]; - } - - } - else $status =$clang->gT("Inactive") ; - - - $datetimeobj = new Date_Time_Converter($rows['datecreated'] , "Y-m-d H:i:s"); - $datecreated=$datetimeobj->convert($dateformatdetails['phpdate']); - - if (in_array($rows['owner_id'],getuserlist('onlyuidarray'))) - { - $ownername=$rows['users_name'] ; - } - else - { - $ownername="---"; - } - - $questionsCount = 0; - $questionsCountQuery = "SELECT * FROM ".db_table_name('questions')." WHERE sid={$rows['sid']} AND language='".$rows['language']."'"; //Getting a count of questions for this survey - $questionsCountResult = $connect->Execute($questionsCountQuery); //Checked - $questionsCount = $questionsCountResult->RecordCount(); - - $listsurveys.=""; - - if ($rows['active']=="Y") - { - if ($rows['expires']!='' && $rows['expires'] < date_shift(date("Y-m-d H:i:s"), "Y-m-d", $timeadjust)) - { - $listsurveys .= ""; - } - else - { - if (bHasSurveyPermission($rows['sid'],'surveyactivation','update')) - { - $listsurveys .= "\n"; - } else - { - $listsurveys .= "\n"; - } - } - } else { - if ( $questionsCount > 0 && bHasSurveyPermission($rows['sid'],'surveyactivation','update') ) - { - $listsurveys .= "\n" ; - } else - { - $listsurveys .= "\n"; - } - } - - $listsurveys.=""; - $listsurveys.="". - "". - "". - "" . - ""; - - if ($rows['active']=="Y") - { - $complete = $responses - $partial_responses; - $listsurveys .= ""; - $listsurveys .= ""; - $listsurveys .= ""; - }else{ - $listsurveys .= ""; - $listsurveys .= ""; - $listsurveys .= ""; - } - - if ($rows['active']=="Y" && tableExists("tokens_".$rows['sid'])) - { - //get the number of tokens for each survey - $tokencountquery = "SELECT count(tid) FROM ".db_table_name("tokens_".$rows['sid']); - $tokencountresult = db_execute_num($tokencountquery); //Checked - while ($tokenrow = $tokencountresult->FetchRow()) - { - $tokencount = $tokenrow[0]; - } - - //get the number of COMLETED tokens for each survey - $tokencompletedquery = "SELECT count(tid) FROM ".db_table_name("tokens_".$rows['sid'])." WHERE completed!='N'"; - $tokencompletedresult = db_execute_num($tokencompletedquery); //Checked - while ($tokencompletedrow = $tokencompletedresult->FetchRow()) - { - $tokencompleted = $tokencompletedrow[0]; - } - - //calculate percentage - - //prevent division by zero problems - if($tokencompleted != 0 && $tokencount != 0) - { - $tokenpercentage = round(($tokencompleted / $tokencount) * 100, 1); - } - else - { - $tokenpercentage = 0; - } - - $listsurveys .= ""; - $listsurveys .= ""; - } - else - { - $listsurveys .= ""; - $listsurveys .= ""; - } - - $listsurveys .= "" ; - } - - $listsurveys.=""; - $listsurveys.="
     ".$clang->gT("Responses")." 
    ".$clang->gT("Status")."".$clang->gT("SID")."".$clang->gT("Survey")."".$clang->gT("Date created")."".$clang->gT("Owner") ."".$clang->gT("Access")."".$clang->gT("Anonymized responses")."".$clang->gT("Full")."".$clang->gT("Partial")."".$clang->gT("Total")."".$clang->gT("Tokens available")."".$clang->gT("Response rate")."
     
    gTview("This survey is active - click here to deactivate this survey.")."\" >" - . "".$clang->gT("This survey is active - click here to deactivate this survey.")."gTview("This survey is currently not active - click here to activate this survey.")."\" >" - . "".$clang->gT("This survey is currently not active - click here to activate this survey.")."".$clang->gT("This survey is currently not active.")."" - . "{$rows['sid']}{$rows['surveyls_title']}".$datecreated."".$ownername." (".$clang->gT("Edit").")".$visibility."".$privacy."".$complete."".$partial_responses."".$responses."   ".$tokencount."".$tokenpercentage."%  

    " ; - } - else $listsurveys="

    ".$clang->gT("No Surveys available - please create one.")."

    " ; -} -elseif ($action == "ajaxowneredit"){ - - header('Content-type: application/json'); - - if (isset($_REQUEST['newowner'])) {$intNewOwner=sanitize_int($_REQUEST['newowner']);} - if (isset($_REQUEST['survey_id'])) {$intSurveyId=sanitize_int($_REQUEST['survey_id']);} - $owner_id = $_SESSION['loginID']; - - header('Content-type: application/json'); - - $query = "UPDATE ".db_table_name('surveys')." SET owner_id = $intNewOwner WHERE sid=$intSurveyId"; - if (bHasGlobalPermission("USER_RIGHT_SUPERADMIN")) - $query .=";"; - else - $query .=" AND owner_id=$owner_id;"; - - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - - $query = "SELECT b.users_name FROM ".db_table_name('surveys')." as a" - ." INNER JOIN ".db_table_name('users')." as b ON a.owner_id = b.uid WHERE sid=$intSurveyId AND owner_id=$intNewOwner;"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - $intRecordCount = $result->RecordCount(); - - $aUsers = array( - 'record_count' => $intRecordCount, - ); - - if($result->RecordCount() > 0) { - while($rows = $result->FetchRow()) - $aUsers['newowner'] = $rows['users_name']; - } - $ajaxoutput = ls_json_encode($aUsers) . "\n"; - -} - -elseif ($action == "ajaxgetusers"){ - header('Content-type: application/json'); - - $aSeenUsers = getuserlist(); - - $aUsers = array(); - foreach ($aSeenUsers as $userline) { - $aUsers[] = array($userline['uid'], $userline['user']); - } - - $ajaxoutput = ls_json_encode($aUsers) . "\n"; -} - diff --git a/include/limesurvey/admin/surveytable_functions.php b/include/limesurvey/admin/surveytable_functions.php deleted file mode 100644 index 29e10580..00000000 --- a/include/limesurvey/admin/surveytable_functions.php +++ /dev/null @@ -1,390 +0,0 @@ -MetaColumns("{$dbprefix}survey_{$surveyid}"); - $sqllist = array(); - foreach ($sqlfields as $sqlfield) - { - $sqllist[]=$sqlfield->name; - } - - $missingFields = array_diff($fieldlist, $sqllist); - $removedFields = array_diff($sqllist, $fieldlist); - - die(print_r($missingFields).print_r($removedFields)); - - // Find any fields that have been removed - - // Add fields that need to be added - - // Remove fields that need to be removed -} - -/** - * Checks for duplicate column names and fixes them - * Returns true if a correction has been made and false if not - * - * @param $surveyid - The Survey Identifier - * @return bool - */ -function surveyFixDuplicateColumns($surveyid) -{ - list ($duplicates, $fieldmap) = surveyCheckUniqueColumns($surveyid); - if (!empty($duplicates)) - { - foreach ($duplicates as $dup) - { - $badquestion=arraySearchByKey($dup, $fieldmap, "fieldname", 1); - surveyFixQuestionNumbering($badquestion['qid']); - } - return true; - } - return false; -} - -/** - * Checks to see if any columns being created for the survey will - * conflict with field names. - * - * @param $surveyid - The Survey Identifier - * @return bool - */ -function surveyCheckUniqueColumns($surveyid) -{ - //CHECK THAT ALL THE CREATED FIELDS WILL BE UNIQUE - $fieldmap=createFieldMap($surveyid, "full"); - $duplicates = array(); - if (isset($fieldmap)) - { - foreach($fieldmap as $fielddata) - { - $fieldlist[]=$fielddata['fieldname']; - } - $fieldlist=array_reverse($fieldlist); //let's always change the later duplicate, not the earlier one - } - $checkKeysUniqueComparison = create_function('$value','if ($value > 1) return true;'); - @$duplicates = array_keys (array_filter (array_count_values($fieldlist), $checkKeysUniqueComparison)); - // Return the fieldmap as well, so we dont have to generate this again for fixing - return array($duplicates, $fieldmap); -} - -/** - * Fixes the question numbering of a single question inorder to - * prevent column name conflicts - * - * @param none - * @return bool - */ -function surveyFixQuestionNumbering($qid) -{ - global $dbprefix, $connect; - //Fix a question id - requires renumbering a question - LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL,$qid); - - $oldqid = $_GET['fixnumbering']; - $query = "SELECT qid FROM {$dbprefix}questions ORDER BY qid DESC"; - $result = db_select_limit_assoc($query, 1) or safe_die($query."
    ".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - $lastqid=$row['qid']; - } - $newqid=$lastqid+1; - $query = "UPDATE {$dbprefix}questions SET qid=$newqid WHERE qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
    ".$connect->ErrorMsg()); - // Update subquestions - $query = "UPDATE {$dbprefix}questions SET parent_qid=$newqid WHERE parent_qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
    ".$connect->ErrorMsg()); - //Update conditions.. firstly conditions FOR this question - $query = "UPDATE {$dbprefix}conditions SET qid=$newqid WHERE qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
    ".$connect->ErrorMsg()); - //Now conditions based upon this question - $query = "SELECT cqid, cfieldname FROM {$dbprefix}conditions WHERE cqid=$oldqid"; - $result = db_execute_assoc($query) or safe_die($query."
    ".$connect->ErrorMsg()); - while ($row=$result->FetchRow()) - { - $switcher[]=array("cqid"=>$row['cqid'], "cfieldname"=>$row['cfieldname']); - } - if (isset($switcher)) - { - foreach ($switcher as $switch) - { - $query = "UPDATE {$dbprefix}conditions - SET cqid=$newqid, - cfieldname='".str_replace("X".$oldqid, "X".$newqid, $switch['cfieldname'])."' - WHERE cqid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
    ".$connect->ErrorMsg()); - } - } - //Now question_attributes - $query = "UPDATE {$dbprefix}question_attributes SET qid=$newqid WHERE qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
    ".$connect->ErrorMsg()); - //Now answers - $query = "UPDATE {$dbprefix}answers SET qid=$newqid WHERE qid=$oldqid"; - $result = $connect->Execute($query) or safe_die($query."
    ".$connect->ErrorMsg()); - - LimeExpressionManager::UpgradeConditionsToRelevance(NULL,$qid); -} - -/** - * Check the structure of the survey to identify any problems with groups, questions, etc - * Returns an array containing error information - * @param surveyid - * @return string - */ -function surveyCheckStructure($surveyid) -{ - global $dbprefix, $connect; - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $failedcheck = array(); - - // Check for empty groups - $groupquery = "SELECT g.gid,g.group_name,count(q.qid) as count from {$dbprefix}questions as q RIGHT JOIN {$dbprefix}groups as g ON q.gid=g.gid WHERE g.sid=$surveyid AND g.language='$baselang' AND q.language='$baselang' group by g.gid,g.group_name;"; - $groupresult=db_execute_assoc($groupquery) or safe_die($groupquery."
    ".$connect->ErrorMsg()); - while ($row=$groupresult->FetchRow()) - { - if ($row['count'] == 0) - { - $failedcheck[]=array($row['gid'], $row['group_name'], ": ".$clang->gT("This group does not contain any question(s).")); - } - } - - //CHECK TO MAKE SURE ALL QUESTION TYPES THAT REQUIRE ANSWERS HAVE ACTUALLY GOT ANSWERS - //THESE QUESTION TYPES ARE: - // # "L" -> LIST - // # "O" -> LIST WITH COMMENT - // # "M" -> Multiple choice - // # "P" -> Multiple choice with comments - // # "A", "B", "C", "E", "F", "H", "^" -> Various Array Types - // # "R" -> RANKING - // # "U" -> FILE CSV MORE - // # "I" -> LANGUAGE SWITCH - // # ":" -> Array Multi Flexi Numbers - // # ";" -> Array Multi Flexi Text - // # "1" -> MULTI SCALE - - $chkquery = "SELECT qid, question, gid, type FROM {$dbprefix}questions WHERE sid={$surveyid} and parent_qid=0"; - $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't get list of questions
    $chkquery
    ".$connect->ErrorMsg()); - while ($chkrow = $chkresult->FetchRow()) - { - if ($qtypes[$chkrow['type']]['subquestions']>0) - { - $chaquery = "SELECT * FROM {$dbprefix}questions WHERE parent_qid = {$chkrow['qid']} ORDER BY question_order"; - $charesult=$connect->Execute($chaquery); - $chacount=$charesult->RecordCount(); - if ($chacount == 0) - { - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question is a subquestion type question but has no configured subquestions."), $chkrow['gid']); - } - } - if ($qtypes[$chkrow['type']]['answerscales']>0) - { - $chaquery = "SELECT * FROM {$dbprefix}answers WHERE qid = {$chkrow['qid']} ORDER BY sortorder, answer"; - $charesult=$connect->Execute($chaquery); - $chacount=$charesult->RecordCount(); - if ($chacount == 0) - { - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question is a multiple answer type question but has no answers."), $chkrow['gid']); - } - } - } - - //NOW CHECK THAT ALL QUESTIONS HAVE A 'QUESTION TYPE' FIELD SET - $chkquery = "SELECT qid, question, gid FROM {$dbprefix}questions WHERE sid={$surveyid} AND type = ''"; - $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing types
    $chkquery
    ".$connect->ErrorMsg()); - while ($chkrow = $chkresult->FetchRow()) - { - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question does not have a question 'type' set."), $chkrow['gid']); - } - - //ChECK THAT certain array question types have answers set - $chkquery = "SELECT q.qid, question, gid FROM {$dbprefix}questions as q WHERE (select count(*) from {$dbprefix}answers as a where a.qid=q.qid and scale_id=0)=0 and sid={$surveyid} AND type IN ('F', 'H', 'W', 'Z', '1')"; - $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing answers
    $chkquery
    ".$connect->ErrorMsg()); - while($chkrow = $chkresult->FetchRow()) - { - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question requires answers, but none are set."), $chkrow['gid']); - } // while - - //CHECK THAT DUAL Array has answers set - $chkquery = "SELECT q.qid, question, gid FROM {$dbprefix}questions as q WHERE (select count(*) from {$dbprefix}answers as a where a.qid=q.qid and scale_id=1)=0 and sid={$surveyid} AND type='1'"; - $chkresult = db_execute_assoc($chkquery) or safe_die ("Couldn't check questions for missing 2nd answer set
    $chkquery
    ".$connect->ErrorMsg()); - while($chkrow = $chkresult->FetchRow()) - { - $failedcheck[]=array($chkrow['qid'], $chkrow['question'], ": ".$clang->gT("This question requires a second answer set but none is set."), $chkrow['gid']); - } // while - - //CHECK THAT ALL CONDITIONS SET ARE FOR QUESTIONS THAT PRECEED THE QUESTION CONDITION - //A: Make an array of all the qids in order of appearance - // $qorderquery="SELECT * FROM {$dbprefix}questions, {$dbprefix}groups WHERE {$dbprefix}questions.gid={$dbprefix}groups.gid AND {$dbprefix}questions.sid={$surveyid} ORDER BY {$dbprefix}groups.sortorder, {$dbprefix}questions.title"; - // $qorderresult=$connect->Execute($qorderquery) or safe_die("Couldn't generate a list of questions in order
    $qorderquery
    ".$connect->ErrorMsg()); - // $qordercount=$qorderresult->RecordCount(); - // $c=0; - // while ($qorderrow=$qorderresult->FetchRow()) - // { - // $qidorder[]=array($c, $qorderrow['qid']); - // $c++; - // } - //TO AVOID NATURAL SORT ORDER ISSUES, FIRST GET ALL QUESTIONS IN NATURAL SORT ORDER, AND FIND OUT WHICH NUMBER IN THAT ORDER THIS QUESTION IS - $qorderquery = "SELECT * FROM {$dbprefix}questions WHERE sid=$surveyid AND type not in ('S', 'D', 'T', 'Q')"; - $qorderresult = db_execute_assoc($qorderquery) or safe_die ("$qorderquery
    ".$connect->ErrorMsg()); - $qrows = array(); //Create an empty array in case FetchRow does not return any rows - while ($qrow = $qorderresult->FetchRow()) - { - $qrows[] = $qrow; - } - usort($qrows, 'GroupOrderThenQuestionOrder'); // Perform a case insensitive natural sort on group name then question title of a multidimensional array - $c=0; - foreach ($qrows as $qr) - { - $qidorder[]=array($c, $qrow['qid']); - $c++; - } - $qordercount=""; - //1: Get each condition's question id - $conquery= "SELECT {$dbprefix}conditions.qid, cqid, {$dbprefix}questions.question, " - . "{$dbprefix}questions.gid " - . "FROM {$dbprefix}conditions, {$dbprefix}questions, {$dbprefix}groups " - . "WHERE {$dbprefix}conditions.qid={$dbprefix}questions.qid " - . "AND {$dbprefix}questions.gid={$dbprefix}groups.gid ORDER BY {$dbprefix}conditions.qid"; - $conresult=db_execute_assoc($conquery) or safe_die("Couldn't check conditions for relative consistency
    $conquery
    ".$connect->ErrorMsg()); - //2: Check each conditions cqid that it occurs later than the cqid - while ($conrow=$conresult->FetchRow()) - { - $cqidfound=0; - $qidfound=0; - $b=0; - while ($b<$qordercount) - { - if ($conrow['cqid'] == $qidorder[$b][1]) - { - $cqidfound = 1; - $b=$qordercount; - } - if ($conrow['qid'] == $qidorder[$b][1]) - { - $qidfound = 1; - $b=$qordercount; - } - if ($qidfound == 1) - { - $failedcheck[]=array($conrow['qid'], $conrow['question'], ": ".$clang->gT("This question has a condition set, however the condition is based on a question that appears after it."), $conrow['gid']); - } - $b++; - } - } - // End Check Survey Structure - return $failedcheck; -} - -/** - * Creates the initial survey table with columns for selected survey settings - * Returns true if successful and database error if not - * @param surveyid - * @return mixed - */ -function surveyCreateTable($surveyid) -{ - global $dbprefix, $databasetabletype, $connect; - $createsurvey=''; - - //Check for any additional fields for this survey and create necessary fields (token and datestamp) - $pquery = "SELECT anonymized, allowregister, datestamp, ipaddr, refurl FROM {$dbprefix}surveys WHERE sid={$surveyid}"; - $presult=db_execute_assoc($pquery); - $prow=$presult->FetchRow(); - - //Get list of questions for the base language - $fieldmap=createFieldMap($surveyid); - - foreach ($fieldmap as $arow) //With each question, create the appropriate field(s) - { - $createsurvey .= " `{$arow['fieldname']}`"; - switch($arow['type']) - { - case 'id': - $createsurvey .= " I NOTNULL AUTO PRIMARY"; - break; - case 'token': - $createsurvey .= " C(36)"; - break; - case 'startlanguage': - $createsurvey .= " C(20) NOTNULL"; - break; - case "startdate": - case "datestamp": - $createsurvey .= " T NOTNULL"; - break; - case "submitdate": - $createsurvey .= " T"; - break; - case "lastpage": - $createsurvey .= " I"; - break; - case "ipaddress": - if ($prow['ipaddr'] == "Y") - $createsurvey .= " X"; - break; - case "url": - if ($prow['refurl'] == "Y") - $createsurvey .= " X"; - break; - } - $createsurvey .= ",\n"; - } - - //strip trailing comma and new line feed (if any) - $createsurvey = rtrim($createsurvey, ",\n"); - - $tabname = "{$dbprefix}survey_{$surveyid}"; # not using db_table_name as it quotes the table name (as does CreateTableSQL) - - $taboptarray = array('mysql' => 'ENGINE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci', - 'mysqli'=> 'ENGINE='.$databasetabletype.' CHARACTER SET utf8 COLLATE utf8_unicode_ci'); - $dict = NewDataDictionary($connect); - $sqlarray = $dict->CreateTableSQL($tabname, $createsurvey, $taboptarray); - $execresult=$dict->ExecuteSQLArray($sqlarray,1); - if ($execresult==0 || $execresult==1) - { - return $connect->ErrorMsg(); - } elseif ($execresult != 0 && $execresult !=1) - { - // Set Auto Increment value if specified - $anquery = "SELECT autonumber_start FROM {$dbprefix}surveys WHERE sid={$surveyid}"; - if ($anresult=db_execute_assoc($anquery)) - { - //if there is an autonumber_start field, start auto numbering here - while($row=$anresult->FetchRow()) - { - if ($row['autonumber_start'] > 0) - { - $autonumberquery = "ALTER TABLE {$dbprefix}survey_{$surveyid} AUTO_INCREMENT = ".$row['autonumber_start']; - $result = $connect->Execute($autonumberquery); - } - } - } - return true; - } -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/templates.php b/include/limesurvey/admin/templates.php deleted file mode 100644 index 91ee477d..00000000 --- a/include/limesurvey/admin/templates.php +++ /dev/null @@ -1,1272 +0,0 @@ -'assessment.pstpl'); -$files[]=array('name'=>'clearall.pstpl'); -$files[]=array('name'=>'completed.pstpl'); -$files[]=array('name'=>'endgroup.pstpl'); -$files[]=array('name'=>'endpage.pstpl'); -$files[]=array('name'=>'groupdescription.pstpl'); -$files[]=array('name'=>'load.pstpl'); -$files[]=array('name'=>'navigator.pstpl'); -$files[]=array('name'=>'printanswers.pstpl'); -$files[]=array('name'=>'privacy.pstpl'); -$files[]=array('name'=>'question.pstpl'); -$files[]=array('name'=>'register.pstpl'); -$files[]=array('name'=>'save.pstpl'); -$files[]=array('name'=>'surveylist.pstpl'); -$files[]=array('name'=>'startgroup.pstpl'); -$files[]=array('name'=>'startpage.pstpl'); -$files[]=array('name'=>'survey.pstpl'); -$files[]=array('name'=>'welcome.pstpl'); -$files[]=array('name'=>'print_survey.pstpl'); -$files[]=array('name'=>'print_group.pstpl'); -$files[]=array('name'=>'print_question.pstpl'); - -//Standard CSS Files -//These files may be edited or saved -$cssfiles[]=array('name'=>'template.css'); -$cssfiles[]=array('name'=>'template-rtl.css'); -$cssfiles[]=array('name'=>'ie_fix_6.css'); -$cssfiles[]=array('name'=>'ie_fix_7.css'); -$cssfiles[]=array('name'=>'ie_fix_8.css'); -$cssfiles[]=array('name'=>'print_template.css'); -$cssfiles[]=array('name'=>'template.js'); - -//Standard Support Files -//These files may be edited or saved -$supportfiles[]=array('name'=>'print_img_radio.png'); -$supportfiles[]=array('name'=>'print_img_checkbox.png'); - -//Standard screens -//Only these may be viewed - -$screens[]=array('name'=>$clang->gT('Survey List Page'),'id'=>'surveylist'); -$screens[]=array('name'=>$clang->gT('Welcome Page'),'id'=>'welcome'); -$screens[]=array('name'=>$clang->gT('Question Page'),'id'=>'question'); -$screens[]=array('name'=>$clang->gT('Completed Page'),'id'=>'completed'); -$screens[]=array('name'=>$clang->gT('Clear All Page'),'id'=>'clearall'); -$screens[]=array('name'=>$clang->gT('Register Page'),'id'=>'register'); -$screens[]=array('name'=>$clang->gT('Load Page'),'id'=>'load'); -$screens[]=array('name'=>$clang->gT('Save Page'),'id'=>'save'); -$screens[]=array('name'=>$clang->gT('Print answers page'),'id'=>'printanswers'); -$screens[]=array('name'=>$clang->gT('Printable survey page'),'id'=>'printablesurvey'); - -//Page display blocks -$SurveyList=array('startpage.pstpl', - 'surveylist.pstpl', - 'endpage.pstpl' - ); -$Welcome=array('startpage.pstpl', - 'welcome.pstpl', - 'privacy.pstpl', - 'navigator.pstpl', - 'endpage.pstpl' - ); -$Question=array('startpage.pstpl', - 'survey.pstpl', - 'startgroup.pstpl', - 'groupdescription.pstpl', - 'question.pstpl', - 'endgroup.pstpl', - 'navigator.pstpl', - 'endpage.pstpl' - ); -$CompletedTemplate=array( - 'startpage.pstpl', - 'assessment.pstpl', - 'completed.pstpl', - 'endpage.pstpl' - ); -$Clearall=array('startpage.pstpl', - 'clearall.pstpl', - 'endpage.pstpl' - ); -$Register=array('startpage.pstpl', - 'survey.pstpl', - 'register.pstpl', - 'endpage.pstpl' - ); -$Save=array('startpage.pstpl', - 'save.pstpl', - 'endpage.pstpl' - ); -$Load=array('startpage.pstpl', - 'load.pstpl', - 'endpage.pstpl' - ); -$printtemplate=array('startpage.pstpl', - 'printanswers.pstpl', - 'endpage.pstpl' - ); -$printablesurveytemplate=array('print_survey.pstpl', - 'print_group.pstpl', - 'print_question.pstpl' - ); - - -// Set this so common.php doesn't throw notices about undefined variables -$thissurvey['active']='N'; - - -$file_version="LimeSurvey template editor ".$versionnumber; -$_SESSION['s_lang']=$_SESSION['adminlang']; - -if (!isset($templatename)) {$templatename = sanitize_paranoid_string(returnglobal('templatename'));} -if (!isset($templatedir)) {$templatedir = sanitize_paranoid_string(returnglobal('templatedir'));} -if (!isset($editfile)) {$editfile = sanitize_filename(returnglobal('editfile'));} -if (!isset($screenname)) {$screenname=auto_unescape(returnglobal('screenname'));} - -// Checks if screen name is in the list of allowed screen names -if ( isset($screenname) && (multiarray_search($screens,'id',$screenname)===false)) {die('Invalid screen name');} // Die you sneaky bastard! - - -if (!isset($action)) {$action=sanitize_paranoid_string(returnglobal('action'));} -if (!isset($subaction)) {$subaction=sanitize_paranoid_string(returnglobal('subaction'));} -if (!isset($otherfile)) {$otherfile = sanitize_filename(returnglobal('otherfile'));} -if (!isset($newname)) {$newname = sanitize_paranoid_string(returnglobal('newname'));} -if (!isset($copydir)) {$copydir = sanitize_paranoid_string(returnglobal('copydir'));} - -if(is_file($usertemplaterootdir.'/'.$templatename.'/question_start.pstpl')) -{ - $files[]=array('name'=>'question_start.pstpl'); - $Question[]='question_start.pstpl'; -} - - -$js_admin_includes[]= $homeurl."/scripts/edit_area/edit_area_loader.js"; -$js_admin_includes[]= $homeurl."/scripts/templates.js"; - -// find out language for code editor -$availableeditorlanguages=array('bg','cs','de','dk','en','eo','es','fi','fr','hr','it','ja','mk','nl','pl','pt','ru','sk','zh'); -$extension = substr(strrchr($editfile, "."), 1); -if ($extension=='css' || $extension=='js') {$highlighter=$extension;} else {$highlighter='html';}; -if(in_array($_SESSION['adminlang'],$availableeditorlanguages)) {$codelanguage=$_SESSION['adminlang'];} -else {$codelanguage='en';} - -if (isset ($_POST['changes'])) { - $changedtext=$_POST['changes']; - $changedtext=str_replace ('Execute($templatequery) or safe_die ("Couldn't update surveys with default template!
    \n$utquery
    \n".$connect->ErrorMsg()); //Checked - - $templatequery = "UPDATE {$dbprefix}surveys set template='$defaulttemplate' where template='$templatename'\n"; - $connect->Execute($templatequery) or safe_die ("Couldn't update surveys with default template!
    \n$utquery
    \n".$connect->ErrorMsg()); //Checked - - $templatequery = "delete from {$dbprefix}templates_rights where folder='$templatename'\n"; - $connect->Execute($templatequery) or safe_die ("Couldn't update template_rights
    \n$utquery
    \n".$connect->ErrorMsg()); //Checked - - $templatequery = "delete from {$dbprefix}templates where folder='$templatename'\n"; - $connect->Execute($templatequery) or safe_die ("Couldn't update templates
    \n$utquery
    \n".$connect->ErrorMsg()); //Checked - - $flashmessage=sprintf($clang->gT("Template '%s' was successfully deleted."),$templatename); - unset($templates[$templatename]); - $templatename = $defaulttemplate; - } - else - { - $flashmessage=sprintf($clang->gT("There was a problem deleting the template '%s'. Please check your directory/file permissions."),$templatename); - } -} - -if ($action == "templateupload") -{ - include("import_resources_zip.php"); -} - - -//Save Changes if necessary -if ($action=="templatesavechanges" && $changedtext) { - $changedtext=str_replace("\r\n", "\n", $changedtext); - if ($editfile) { - // Check if someone tries to submit a file other than one of the allowed filenames - if (multiarray_search($files,'name',$editfile)===false && multiarray_search($cssfiles,'name',$editfile)===false) {die('Invalid template filename');} // Die you sneaky bastard! - $savefilename=$usertemplaterootdir."/".$templatename."/".$editfile; - if (is_writable($savefilename)) { - if (!$handle = fopen($savefilename, 'w')) { - echo "Could not open file ($savefilename)"; - exit; - } - if (!fwrite($handle, $changedtext)) { - echo "Cannot write to file ($savefilename)"; - exit; - } - fclose($handle); - } else { - echo "The file $savefilename is not writable"; - } - } -} - -if ($action == "templatecopy" && isset($newname) && isset($copydir)) { - //Copies all the files from one template directory to a new one - //This is a security issue because it is allowing copying from get variables... - $newdirname=$usertemplaterootdir."/".$newname; - $copydirname=sGetTemplatePath($copydir); - $mkdirresult=mkdir_p($newdirname); - if ($mkdirresult == 1) { - $copyfiles=getListOfFiles($copydirname); - foreach ($copyfiles as $file) { - $copyfile=$copydirname."/".$file; - $newfile=$newdirname."/".$file; - if (!copy($copyfile, $newfile)) { - echo ""; - } - } - $templates[$newname]=$newdirname; - $templatename=$newname; - } elseif($mkdirresult == 2) { - echo ""; - } else { - echo ""; - } -} - -if ($action == "templaterename" && isset($newname) && isset($copydir)) -{ - $newdirname=$usertemplaterootdir."/".$newname; - $olddirname=$usertemplaterootdir."/".$copydir; - if(isStandardTemplate($newname)) - { - echo ""; - } - elseif (rename($olddirname, $newdirname)==false) - { - echo ""; - } - else - { - $templates[$newname]=$newdirname; - $templatename=$newname; - } -} - -if ($action == "templateuploadfile") -{ - - if ($demoModeOnly == true) - { - $action = ''; - - } - else - { - $the_full_file_path = $usertemplaterootdir."/".$templatename . "/" . sanitize_filename($_FILES['the_file']['name']); - if ($extfile = strrchr($_FILES['the_file']['name'], '.')) - { - if (!(stripos(','.$allowedtemplateuploads.',',','. substr($extfile,1).',') === false)) - { - //Uploads the file into the appropriate directory - if (!@move_uploaded_file($_FILES['the_file']['tmp_name'], $the_full_file_path)) { - echo "".$clang->gT("Error")."
    \n"; - echo sprintf ($clang->gT("An error occurred uploading your file. This may be caused by incorrect permissions in your %s folder."),$tempdir)."

    \n"; - echo "\n"; - echo "\n"; - echo "\n\n"; - exit; - } - } - else - { - // if we came here is because the file extention is not allowed - @unlink($_FILES['the_file']['tmp_name']); - echo "".$clang->gT("Error")."
    \n"; - echo $clang->gT("This file type is not allowed to be uploaded.")."

    \n"; - echo "\n"; - echo "\n"; - echo "\n\n"; - exit; - } - } - else - { - // if we came here is because the file extention is not allowed - @unlink($_FILES['the_file']['tmp_name']); - echo "".$clang->gT("Error")."
    \n"; - echo $clang->gT("This file type is not allowed to be uploaded.")."

    \n"; - echo "\n"; - echo "\n"; - echo "\n\n"; - exit; - } - } -} - -if ($action == "templatefiledelete") { - $the_full_file_path = $usertemplaterootdir."/".$templatename."/".$otherfile; //This is where the temp file is - unlink($the_full_file_path); -} - -if ($action == "templatezip") { - require("classes/phpzip/phpzip.inc.php"); - $z = new PHPZip(); - $templatedir=sGetTemplatePath($templatename).DIRECTORY_SEPARATOR; - - $zipfile="$tempdir/$templatename.zip"; - $z -> Zip($templatedir, $zipfile); - if (is_file($zipfile)) { - //Send the file for download! - header("Pragma: public"); - header("Expires: 0"); - header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); - - header("Content-Type: application/force-download"); - header( "Content-Disposition: attachment; filename=$templatename.zip" ); - header( "Content-Description: File Transfer"); - @readfile($zipfile); - - //Delete the temporary file - unlink($zipfile); - } -} - - -$normalfiles=array("DUMMYENTRY", ".", "..", "preview.png"); -foreach ($files as $fl) { - $normalfiles[]=$fl["name"]; -} -foreach ($cssfiles as $fl) { - $normalfiles[]=$fl["name"]; -} - -//CHECK ALL FILES EXIST, AND IF NOT - COPY IT FROM DEFAULT DIRECTORY -foreach ($files as $file) { - $thisfile=sGetTemplatePath($templatename)."/".$file['name']; - if (!is_file($thisfile)) { - $copyfile="$standardtemplaterootdir/default/".$file['name']; - $newfile=$thisfile; - if (!@copy($copyfile, $newfile)) { - echo ""; - } - } -} -//CHECK if ALL CSS & JS FILES EXIST, AND IF NOT - COPY IT FROM DEFAULT DIRECTORY -foreach ($cssfiles as $file) { - $thisfile=sGetTemplatePath($templatename)."/".$file['name']; - if (!is_file($thisfile)) { - $copyfile="$standardtemplaterootdir/default/".$file['name']; - $newfile=$thisfile; - if (!@copy($copyfile, $newfile)) { - echo ""; - } - } -} - //CHECK IF REQUIRED SUPPORT FILE EXIST, AND IF NOT - COPY IT FROM DEFAULT DIRECTORY -foreach($supportfiles as $file) { - $thisfile=sGetTemplatePath($templatename)."/".$file['name']; - if (!is_file($thisfile)) { - $copyfile="$standardtemplaterootdir/default/".$file['name']; - $newfile=$thisfile; - if (!@copy($copyfile, $newfile)) { - echo ""; - } - } -} - -if (!$screenname) {$screenname='welcome';} -if ($screenname != 'welcome') {$_SESSION['step']=1;} else {unset($_SESSION['step']);} //This helps handle the load/save buttons - - -// =========================== FAKE DATA FOR TEMPLATES -$thissurvey['name']=$clang->gT("Template Sample"); -$thissurvey['description']=$clang->gT('This is a sample survey description. It could be quite long.').'

    '.$clang->gT("But this one isn't."); -$thissurvey['welcome']=$clang->gT('Welcome to this sample survey').'
    '.$clang->gT('You should have a great time doing this').'
    '; -$thissurvey['allowsave']="Y"; -$thissurvey['active']="Y"; -$thissurvey['tokenanswerspersistence']="Y"; -$thissurvey['templatedir']=$templatename; -$thissurvey['format']="G"; -$thissurvey['surveyls_url']="http://www.limesurvey.org/"; -$thissurvey['surveyls_urldescription']=$clang->gT("Some URL description"); -$thissurvey['usecaptcha']="A"; -$percentcomplete=makegraph(6, 10); -$groupname=$clang->gT("Group 1: The first lot of questions"); -$groupdescription=$clang->gT("This group description is fairly vacuous, but quite important."); -$navigator="gT('Next').">>\" name=\"move\" />\n"; -if ($screenname != 'welcome') {$navigator = "gT('Previous')."\" name=\"move\" />\n".$navigator;} -$help=$clang->gT("This is some help text."); -$totalquestions="10"; -$surveyformat="Format"; -$completed = "
    ".$clang->gT("Thank you!")."

    " -.$clang->gT("Your survey responses have been recorded.")."

    \n"; -$notanswered="5"; -$privacy=""; -$surveyid="1295"; -$token=1234567; -$assessments="
    ".$clang->gT("Assessment heading")."
    ".$clang->gT("Assessment details")."
    ".$clang->gT("Note that this assessment section will only show if assessment rules have been set and assessment mode is activated.")."
    "; -$printoutput="".$clang->gT("Survey name (ID)")." Test survey (46962)
    - - - - - - - - - - - - - - - - - - - - - - - -
    ".$clang->gT("Question")."".$clang->gT("Your answer")."
    id12
    Date Submitted1980-01-01 00:00:00
    This is a sample question text. The user was asked to enter a date.2007-11-06
    This is another sample question text - asking for number. 666
    This is one last sample question text - asking for some free text. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
    "; -$addbr=false; -$templatedir=sGetTemplatePath($templatename); -$templateurl=sGetTemplateURL($templatename); -switch($screenname) { - case 'surveylist': - unset($files); - - $list[]="

  • Survey Number 1
  • \n"; - $list[]="
  • Survey Number 2
  • \n"; - - $surveylist=array( - "nosid"=>$clang->gT("You have not provided a survey identification number"), - "contact"=>sprintf($clang->gT("Please contact %s ( %s ) for further assistance."),$siteadminname,$siteadminemail), - "listheading"=>$clang->gT("The following surveys are available:"), - "list"=>implode("\n",$list), - ); - - $myoutput[]=""; - foreach ($SurveyList as $qs) { - $files[]=array("name"=>$qs); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/$qs")); - } - break; - - case 'question': - unset($files); - foreach ($Question as $qs) { - $files[]=array("name"=>$qs); - } - $myoutput[]="\n"; - $myoutput[]="\n"; - $myoutput[]="\n"; - $myoutput[]="\n"; - $myoutput[]="\n"; - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/startpage.pstpl")); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/survey.pstpl")); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/startgroup.pstpl")); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/groupdescription.pstpl")); - - $question = array( - 'all' => 'How many roads must a man walk down?' - ,'text' => 'How many roads must a man walk down?' - ,'code' => '1a' - ,'help' => 'helpful text' - ,'mandatory' => '' - ,'man_message' => '' - ,'valid_message' => '' - ,'file_valid_message' => '' - ,'essentials' => 'id="question1"' - ,'class' => 'list-radio' - ,'man_class' => '' - ,'input_error_class' => '' - ,'number' => '1' - ); - - $answer="
    \n"; - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/question.pstpl")); - - // $question='*'.$clang->gT("Please explain something in detail:"); - $answer=""; - $question = array( - 'all' => '*'.$clang->gT("Please explain something in detail:") - ,'text' => $clang->gT('Please explain something in detail:') - ,'code' => '2a' - ,'help' => '' - ,'mandatory' => $clang->gT('*') - ,'man_message' => '' - ,'valid_message' => '' - ,'file_valid_message' => '' - ,'essentials' => 'id="question2"' - ,'class' => 'text-long' - ,'man_class' => ' mandatory' - ,'input_error_class' => '' - ,'number' => '2' - ); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/question.pstpl")); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/endgroup.pstpl")); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/navigator.pstpl")); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/endpage.pstpl")); - break; - - case 'welcome': - unset($files); - $myoutput[]=""; - foreach ($Welcome as $qs) { - $files[]=array("name"=>$qs); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/$qs")); - } - break; - - case 'register': - unset($files); - foreach($Register as $qs) { - $files[]=array("name"=>$qs); - } - foreach(file("$templatedir/startpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/survey.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/register.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/endpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - $myoutput[]= "\n"; - break; - - case 'save': - unset($files); - foreach($Save as $qs) { - $files[]=array("name"=>$qs); - } - - foreach(file("$templatedir/startpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/save.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/endpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - $myoutput[]= "\n"; - break; - - case 'load': - unset($files); - foreach($Load as $qs) { - $files[]=array("name"=>$qs); - } - - foreach(file("$templatedir/startpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/load.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/endpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - $myoutput[]= "\n"; - break; - - case 'clearall': - unset($files); - foreach ($Clearall as $qs) { - $files[]=array("name"=>$qs); - } - - foreach(file("$templatedir/startpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/clearall.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/endpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - $myoutput[]= "\n"; - break; - - case 'completed': - unset($files); - $myoutput[]=""; - foreach ($CompletedTemplate as $qs) { - $files[]=array("name"=>$qs); - $myoutput = array_merge($myoutput, doreplacement(sGetTemplatePath($templatename)."/$qs")); - } - break; - - case 'printablesurvey': - unset($files); - foreach ($printablesurveytemplate as $qs) { - $files[]=array("name"=>$qs); - } - - $questionoutput=array(); - foreach(file("$templatedir/print_question.pstpl") as $op) - { // echo '
    line '.__LINE__.'$op = '.htmlspecialchars(print_r($op)).'
    '; - $questionoutput[]=templatereplace($op, array( - 'QUESTION_NUMBER'=>'1', - 'QUESTION_CODE'=>'Q1', - 'QUESTION_MANDATORY' => $clang->gT('*'), - 'QUESTION_SCENARIO' => 'Only answer this if certain conditions are met.', // if there are conditions on a question, list the conditions. - 'QUESTION_CLASS' => ' mandatory list-radio', - 'QUESTION_TYPE_HELP' => $clang->gT('Please choose *only one* of the following:'), - 'QUESTION_MAN_MESSAGE' => '', // (not sure if this is used) mandatory error - 'QUESTION_VALID_MESSAGE' => '', // (not sure if this is used) validation error - 'QUESTION_FILE_VALID_MESSAGE' => '', // (not sure if this is used) file validation error - 'QUESTION_TEXT'=>'This is a sample question text. The user was asked to pick an entry.', - 'QUESTIONHELP'=>'This is some help text for this question.', - 'ANSWER'=>'
      -
    • - First choiceFirst choice -
    • -
    • - Second choiceSecond choice -
    • -
    • - Third choiceThird choice -
    • -
    ' - )); - } - $groupoutput=array(); - foreach(file("$templatedir/print_group.pstpl") as $op) - { - $groupoutput[]=templatereplace($op, array('QUESTIONS'=>implode(' ',$questionoutput))); - } - foreach(file("$templatedir/print_survey.pstpl") as $op) - { - $myoutput[]=templatereplace($op, array('GROUPS'=>implode(' ',$groupoutput), - 'FAX_TO' => $clang->gT("Please fax your completed survey to:")." 000-000-000", - 'SUBMIT_TEXT'=> $clang->gT("Submit your survey."), - 'HEADELEMENTS'=>getPrintableHeader(), - 'SUBMIT_BY' => sprintf($clang->gT("Please submit by %s"), date('d.m.y')), - 'THANKS'=>$clang->gT('Thank you for completing this survey.'), - 'END'=>$clang->gT('This is the survey end message.') - )); - } - break; - - case 'printanswers': - unset($files); - foreach ($printtemplate as $qs) - { - $files[]=array("name"=>$qs); - } - foreach(file("$templatedir/startpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - foreach(file("$templatedir/printanswers.pstpl") as $op) - { - $myoutput[]=templatereplace($op,array('ANSWERTABLE'=>$printoutput)); - } - foreach(file("$templatedir/endpage.pstpl") as $op) - { - $myoutput[]=templatereplace($op); - } - $myoutput[]= "\n"; - break; -} -$myoutput[]=""; - -if (is_array($files)) { - $match=0; - foreach ($files as $f) { - if ($editfile == $f["name"]) { - $match=1; - } - } - foreach ($cssfiles as $f) { - if ($editfile == $f["name"]) { - $match=1; - } - } - if ($match == 0) { - if (count($files) > 0) { - $editfile=$files[0]["name"]; - } else { - $editfile=""; - } - } -} - -//Get list of 'otherfiles' -$otherfiles=array(); -if ($handle = opendir($templatedir)) { - while(false !== ($file = readdir($handle))) { - if (!array_search($file, $normalfiles)) { - if (!is_dir($templatedir.DIRECTORY_SEPARATOR.$file)) { - $otherfiles[]=array("name"=>$file); - } - } - } // while - closedir($handle); -} - -//**************************************************************** -//** OUTPUT STARTS HERE -//**************************************************************** -$templatesoutput = "\n"; -$templatesoutput.= "\n"; -$templatesoutput.= "\n" -."  "; //CSS Firefox 2 transition fix - - -//TEMPLATE DETAILS -$templatesoutput.= "\t\n" - ."

     

    "; //CSS Firefox 2 transition fix - - - - if ($subaction=='templateupload') - { - $ZIPimportAction = " onclick='if (validatefilename(this.form,\"".$clang->gT('Please select a file to import!','js')."\")) {this.form.submit();}'"; - if (!function_exists("zip_open")) - { - $ZIPimportAction = " onclick='alert(\"".$clang->gT("zip library not supported by PHP, Import ZIP Disabled","js")."\");'"; - } - $templatesoutput.= "
    ".$clang->gT("Uploaded template file") ."
    \n"; - - $templatesoutput.= "\t
    \n" - . "\t\n" - . "\t\n" - . "\t
      \n" - . "
    • \n" - . "
    • \n" - . "
    • \n" - . "\t
    \n"; - } - elseif (isset($importtemplateoutput)) - { - $templatesoutput.=$importtemplateoutput; - } - else - { - - //FILE CONTROL DETAILS - if (is_template_editable($templatename)==true) - { - $templatesoutput.= "\t\n" - ."\t\n" - ."\n" - ."\t\n" - ."\t" - .""; - $templatesoutput.= "\n"; - - $templatesoutput.="\n" - ."\n" - ."\n" - ."" - ."\n" - ."\t\n" - //."
    \n" - ."\t".sprintf($clang->gT("Editing template '%s' - File '%s'"),$templatename,$editfile)."\n" - ."
    " - .$clang->gT("Standard Files:")."\n" - ."
    \n" - ."\t\n" - ."\t\n" - ."\t\n" - ."\t\n" - ."
    \n"; - if (is_writable($templates[$templatename])) { - $templatesoutput.= "gT("Changes cannot be saved to a standard template.")."'"; - } - $templatesoutput.= " />"; - } - else - { - $templatesoutput.=''.$clang->gT("You can't save changes because the template directory is not writable.").''; - } - $templatesoutput.= "
    \n" - ."
    ".$clang->gT("Other Files:")."


    \n" - .$clang->gT("CSS & Javascript files:") - ."
    \n" - - ."
    " - ."\n" - . "" - ."
    " - ."
    " - ."gT("Are you sure you want to delete this file?","js")."')\""; - if (!is_template_editable($templatename)) { - $templatesoutput.= " style='color: #BBBBBB;' disabled='disabled' alt='".$clang->gT("Files in a standard template cannot be deleted.")."'"; - } - $templatesoutput.= " />\n" - ."\n" - ."\n" - ."\n" - . "
    " - ."
    \n" - ."
    \n" - .$clang->gT("Upload a file:")."

    " - ."\n" - ."\n" - ."\n" - ."\n" - ."
    \n" - ."
    \n" - //."\t\n" - //."\t" - .""; - } - - //SAMPLE ROW - $templatesoutput.= "\t
    \n" - . "\t".$clang->gT("Preview:")."\n" - . "\t\n" - . "\t\n" - . "\t\n" - . "\t\n" - . "\t\n" - . "
    \n" - ."
    \n"; - - - // The following lines are forcing the browser to refresh the templates on each save - $time=date("ymdHis"); - @$fnew=fopen("$tempdir/template_temp_$time.html", "w+"); -if(!$fnew) -{ - $templatesoutput.= "

    \n"."".sprintf($clang->gT("Please change the directory permissions of the folder %s in order to preview templates."), $tempdir)."" -."

    \n"; -} -else -{ -@fwrite ($fnew, getHeader()); -foreach ($cssfiles as $cssfile) -{ - $myoutput=str_replace($cssfile['name'],$cssfile['name']."?t=$time",$myoutput); -} - -foreach($myoutput as $line) { - @fwrite($fnew, $line); -} -@fclose($fnew); -$langdir_template="$publicurl/locale/".$_SESSION['adminlang']."/help"; -$templatesoutput.= "

    \n"."\n" -."

    \n"; -} -} - -function doreplacement($file) { //Produce sample page from template file - $output=array(); - foreach(file($file) as $op) { - $output[]=templatereplace($op); - } - return $output; -} - - - -function getListOfFiles($wh){ - //Returns an array containing all files in a directory - if ($handle = opendir($wh)) { - while (false !== ($file = readdir($handle))) { - if ($file != "." && $file != ".." && !is_dir($file)) { - if(!isset($files) || !$files) $files="$file"; - else $files="$file\n$files"; - } - } - closedir($handle); - } - $arr=explode("\n",$files); - sort($arr); - return $arr; -} - -function textarea_encode($html_code) -{ - $from = array('<', '>'); - $to = array('<', '>'); - $html_code = str_replace($from, $to, $html_code); - return $html_code; -} - - //Load this editfile -function filetext($templatename,$templatefile) { - global $templates; - $sFileName=$templates[$templatename].'/'.$templatefile; - if (file_exists($sFileName)) - { - return file_get_contents($sFileName); -} - else - { - return ''; - } -} - -function makegraph($currentstep, $total) -{ - global $thissurvey; - global $publicurl, $clang; - - $size = intval(($currentstep-1)/$total*100); - - $graph = ' - -
    - '.sprintf($clang->gT('You have completed %s%% of this survey'),$size).' -
    '; - if (getLanguageRTL($clang->langcode)) - { - $graph.='100%'; - } - else - { - $graph.='0%'; - } - - $graph.='
    -
    -
    '; - if (getLanguageRTL($clang->langcode)) - { - $graph.='0%'; - } - else - { - $graph.='100%'; - } - $graph.='
    -
    '; - - if ($size == 0) // Progress bar looks dumb if 0 - { - $graph.=' - '; - } - - return $graph; -} - -function mkdir_p($target){ - //creates a new directory - //Returns 1 for success - // 2 for "directory/file by that name exists - // 0 for other errors - if(file_exists($target) || is_dir($target)) - return 2; - if(mkdir($target,0777)){ - return 1; - } - if(mkdir_p(substr($target, 0, (strrpos($target, '/')))) == 1){ - if(mkdir_p($target) == 1) - return 1; - else - return 0; - } else { - return 0; - } -} - -function makeoptions($array, $value, $text, $selectedvalue) { - $return=''; - foreach ($array as $ar) { - $return .= "
    \n"; - - } else { - $createtokentableindex = $dict->CreateIndexSQL("{$tabname}_idx", $tabname, array('token')); - $dict->ExecuteSQLArray($createtokentableindex, false) or safe_die ("Failed to create token table index
    $createtokentableindex

    ".$connect->ErrorMsg()); - if ($connect->databaseType == 'mysql' || $connect->databaseType == 'mysqli') - { - $query = 'CREATE INDEX idx_'.$tabname.'_efl ON '.$tabname.' ( email(120), firstname, lastname )'; - $result=$connect->Execute($query) or safe_die("Failed Rename!
    ".$query."
    ".$connect->ErrorMsg()); - } - - - $tokenoutput .= "\t

    \n" - .$clang->gT("A token table has been created for this survey.")." (\"".$dbprefix."tokens_$surveyid\")

    \n" - ."\n"; - } - return; - } - elseif (returnglobal('restoretable') == "Y" && returnglobal('oldtable') && bHasSurveyPermission($surveyid, 'surveyactivation','update')) - { - $query = db_rename_table(returnglobal('oldtable') , db_table_name_nq("tokens_$surveyid")); - $result=$connect->Execute($query) or safe_die("Failed Rename!
    ".$query."
    ".$connect->ErrorMsg()); - - LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed - - $tokenoutput .= "\t

    \n" - ."
    ".$clang->gT("Import old tokens")."
    " - ."
    ".$clang->gT("A token table has been created for this survey and the old tokens were imported.")." (\"".$dbprefix."tokens_$surveyid\")

    \n" - ."\n" - ."
    \n"; - return; - } - else - { - $query=db_select_tables_like("{$dbprefix}old\_tokens\_".$surveyid."\_%"); - $result=db_execute_num($query) or safe_die("Couldn't get old table list
    ".$query."
    ".$connect->ErrorMsg()); - $tcount=$result->RecordCount(); - if ($tcount > 0) - { - while($rows=$result->FetchRow()) - { - $oldlist[]=$rows[0]; - } - } - $tokenoutput .= "\t
    \n" - ."
    ".$clang->gT("Warning")."
    \n" - ."
    ".$clang->gT("Tokens have not been initialised for this survey.")."

    \n"; - if (bHasSurveyPermission($surveyid, 'surveyactivation','update') || bHasSurveyPermission($surveyid, 'tokens','create')) - { - $tokenoutput .= $clang->gT("If you initialise tokens for this survey then this survey will only be accessible to users who provide a token either manually or by URL.") - ."

    \n"; - - $thissurvey=getSurveyInfo($surveyid); - - if ($thissurvey['anonymized'] == 'Y') - { - $tokenoutput .= "".$clang->gT("Note: If you turn on the -Anonymized responses- option for this survey then LimeSurvey will mark your completed tokens only with a 'Y' instead of date/time to ensure the anonymity of your participants.") - ."

    \n"; - } - - $tokenoutput .= $clang->gT("Do you want to create a token table for this survey?"); - $tokenoutput .= "

    \n"; - $tokenoutput .= "\n"; - $tokenoutput .= "
    \n"; - } - else - { - $tokenoutput .= $clang->gT("You don't have the permission to activate tokens."); - $tokenoutput .= "\n"; - - } - // Do not offer old postgres token tables for restore since these are having an issue with missing index - if ($tcount>0 && $databasetype!='postgres' && bHasSurveyPermission($surveyid, 'surveyactivation','update')) - { - $tokenoutput .= "
    ".$clang->gT("Restore options")."
    \n" - ."
    \n" - ."
    \n" - .$clang->gT("The following old token tables could be restored:")."

    \n" - ."

    \n" - ."\n" - ."\n" - ."\n" - ."
    \n"; - } - - return; - } - } - - - #Lookup the names of the attributes - /*$query = "SELECT attribute1, attribute2 FROM ".db_table_name('surveys')." WHERE sid=$surveyid"; - $result = db_execute_assoc($query) or safe_die("Couldn't execute query:
    $query
    ".$connect->ErrorMsg()); - $row = $result->FetchRow(); - if ($row["attribute1"]) {$attr1_name = $row["attribute1"];} else {$attr1_name=$clang->gT("Attribute 1");} - if ($row["attribute2"]) {$attr2_name = $row["attribute2"];} else {$attr2_name=$clang->gT("Attribute 2");}*/ - - // IF WE MADE IT THIS FAR, THEN THERE IS A TOKENS TABLE, SO LETS DEVELOP THE MENU ITEMS - if($subaction != 'bounceprocessing') - { - $tokenoutput .= "\t\n"; - } - // SEE HOW MANY RECORDS ARE IN THE TOKEN TABLE - $tksq = "SELECT count(tid) FROM ".db_table_name("tokens_$surveyid"); - $tksr = db_execute_num($tksq); - $tkr = $tksr->FetchRow(); - $tkcount = $tkr[0]; - - // GIVE SOME INFORMATION ABOUT THE TOKENS - if ($subaction=='') - { - $tokenoutput .= "\t
    ".$clang->gT("Token summary")."
    \n" - ."
    \n" - ."\t\n" - ."\n"; - - - - $tksq = "SELECT count(*) FROM ".db_table_name("tokens_$surveyid")." WHERE token IS NULL OR token=''"; - $tksr = db_execute_num($tksq); - while ($tkr = $tksr->FetchRow()) - {$tokenoutput .= "\n";} - - $tksq = "SELECT count(*) FROM ".db_table_name("tokens_$surveyid")." WHERE (sent!='N' and sent<>'')"; - $tksr = db_execute_num($tksq); - while ($tkr = $tksr->FetchRow()) - {$tokenoutput .= "\n";} - - $tksq = "SELECT count(*) FROM ".db_table_name("tokens_$surveyid")." WHERE emailstatus = 'OptOut'"; - $tksr = db_execute_num($tksq); - while ($tkr = $tksr->FetchRow()) - {$tokenoutput .= "\n";} - - $tksq = "SELECT count(*) FROM ".db_table_name("tokens_$surveyid")." WHERE (completed!='N' and completed<>'')"; - $tksr = db_execute_num($tksq) or safe_die ("Couldn't execute token selection query
    $abquery
    ".$connect->ErrorMsg()); - while ($tkr = $tksr->FetchRow()) - {$tokenoutput .= "\n" - ."\t\n" - ."
    \n" - .$clang->gT("Total records in this token table")." $tkcount
    ".$clang->gT("Total with no unique Token")." $tkr[0] / $tkcount
    ".$clang->gT("Total invitations sent")." $tkr[0] / $tkcount
    ".$clang->gT("Total opted out")." $tkr[0] / $tkcount
    ".$clang->gT("Total surveys completed")." $tkr[0] / $tkcount\n";} - $tokenoutput .= "

    \n"; - - } - - ############################################################################################# - // NOW FOR VARIOUS ACTIONS: - - if(isset($surveyid) && getEmailFormat($surveyid) == 'html') - { - $ishtml=true; - } - else - { - $ishtml=false; - } - - if ($subaction == "exportdialog" && bHasSurveyPermission($surveyid, 'tokens','export') )//EXPORT FEATURE SUBMITTED BY PIETERJAN HEYSE - { - $langquery = "SELECT language FROM ".db_table_name("tokens_$surveyid")." group by language"; - $langresult = db_execute_assoc($langquery); - - - $tokenoutput .= "\t
    ".$clang->gT("Token export options")."
    \n"; - $tokenoutput .= "
    \n" - ."
    • " - ."
    • " - ."
    • " - ."
    • " - ."
    • " - ."
    •  
    • " - // ."
    • " - ."
    " - ."

    " - ."" - ."" - ."" - ."

    "; - - } - - $tokenoutput .= ""; - - if($subaction=="surveysettingsave") - { - global $connect; - @$fieldvalue = array("bounceprocessing"=>$_POST['bounceprocessing'], - "bounce_email"=>$_POST['bounce_email'], - ); - - if(@$_POST['bounceprocessing']=='L') - { - $fieldvalue['bounceaccountencryption']=$_POST['bounceaccountencryption']; - $fieldvalue['bounceaccountuser']=$_POST['bounceaccountuser']; - $fieldvalue['bounceaccountpass']=$_POST['bounceaccountpass']; - $fieldvalue['bounceaccounttype']=$_POST['bounceaccounttype']; - $fieldvalue['bounceaccounthost']=$_POST['bounceaccounthost']; - } - - $connect->AutoExecute("{$dbprefix}surveys", $fieldvalue, 2,"sid=$surveyid",get_magic_quotes_gpc()); - $tokenoutput .= "
    ".$clang->gT("Bounce settings")."
    \n" - ."
    " - ."\t
    ".$clang->gT("Bounce settings have been saved.")."
    \n" - ."
    "; - - } - - if ($subaction=='bouncesettings'){ - - $settings=getSurveyInfo($surveyid); - $tokenoutput .= "\t
    ".$clang->gT("Bounce settings")."
    \n"; - $tokenoutput .= "
    \n" - ."
    " - - ."\t\n
  • \n" - ."\t\t
  • \n" - - ."\t
  • \n" - ."\t\t
  • \n" - . "\t
  • \n" - . "\t\t
  • \n" - - . "\t
  • \n" - . "\t\t\n"."".$clang->gT("Enter your hostname and port, e.g.: imap.gmail.com:995")."\n" - . "\t
  • \n" - . "\t\t
  • \n" - . "\t
  • \n" - . "\t\t
  • \n"; - $tokenoutput.= "\t
  • \n" - . "\t\t
  • \n
    ".""; - $tokenoutput .= "\t


    \n"; - - } - - - if ($subaction == "deleteall" && bHasSurveyPermission($surveyid, 'tokens', 'delete')){ - $query="DELETE FROM ".db_table_name("tokens_$surveyid"); - $result=$connect->Execute($query) or safe_die ("Couldn't update sent field
    $query
    ".$connect->ErrorMsg()); - $tokenoutput .= "
    ".$clang->gT("Delete all token entries")."
    \n" - ."
    ".$clang->gT("All token entries have been deleted.")."

    \n"; - $subaction=""; - } - - if ($subaction == "clearinvites" && bHasSurveyPermission($surveyid, 'tokens', 'update')) - { - $query="UPDATE ".db_table_name("tokens_$surveyid")." SET sent='N', remindersent='N', remindercount=0"; - $result=$connect->Execute($query) or safe_die ("Couldn't update sent field
    $query
    ".$connect->ErrorMsg()); - $tokenoutput .= "
    ".$clang->gT("Reset token invitation status")."
    \n" - ."
    ".$clang->gT("All token entries have been set to 'Not invited'.")."

    \n"; - $subaction=""; - } - - if ($subaction == "cleartokens" && bHasSurveyPermission($surveyid, 'tokens', 'update')) - { - $query="UPDATE ".db_table_name("tokens_$surveyid")." SET token=''"; - $result=$connect->Execute($query) or safe_die("Couldn't reset the tokens field
    $query
    ".$connect->ErrorMsg()); - $tokenoutput .= "
    ".$clang->gT("Remove unique token numbers")."
    \n" - ."
    ".$clang->gT("All unique token numbers have been removed.")."

    \n"; - $subaction=""; - } - - - if (!$subaction && (bHasSurveyPermission($surveyid, 'tokens', 'update') || bHasSurveyPermission($surveyid, 'tokens', 'delete'))) - { - $tokenoutput .= "\t
    ".$clang->gT("Token database administration options")."
    \n" - ."
    "; - - if (bHasSurveyPermission($surveyid, 'tokens', 'update')) - { - $tokenoutput .="
    \n"; - } - - - if ($subaction == "browse" || $subaction == "search") - { - if (!isset($limit)) {$limit = 100;} - if (!isset($start)) {$start = 0;} - - if ($limit > $tkcount) {$limit=$tkcount;} - $next=$start+$limit; - $last=$start-$limit; - $end=$tkcount-$limit; - if ($end < 0) {$end=0;} - if ($last <0) {$last=0;} - if ($next >= $tkcount) {$next=$tkcount-$limit;} - if ($end < 0) {$end=0;} - $baselanguage = GetBaseLanguageFromSurveyID($surveyid); - - //ALLOW SELECTION OF NUMBER OF RECORDS SHOWN - if($subaction != 'bounceprocessing') - { - $tokenoutput .="\t\n"; - - $tokenoutput .= "\n"; - //COLUMN HEADINGS - $tokenoutput .= "\t\n" - ."\n" //Checkbox - - ."\n" // ID - - ."\n" //Actions - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n" - - ."\n"; - - $attrfieldnames=GetTokenFieldsAndNames($surveyid,true); - foreach ($attrfieldnames as $attr_name=>$attr_translation) - { - $tokenoutput .= "\n"; - } - $tokenoutput .="\t\n"; - - $tokenfieldorder=array('tid', - 'firstname', - 'lastname', - 'email', - 'emailstatus', - 'token', - 'language', - 'sent', - 'remindersent', - 'remindercount', - 'completed', - 'usesleft', - 'validfrom', - 'validuntil'); - foreach ($attrfieldnames as $attr_name=>$attr_translation) - { - $tokenfieldorder[]=$attr_name; - } - - while ($brow = $bresult->FetchRow()) - { - $brow['token'] = trim($brow['token']); - if (trim($brow['validfrom'])!=''){ - $datetimeobj = new Date_Time_Converter($brow['validfrom'] , "Y-m-d H:i:s"); - $brow['validfrom']=$datetimeobj->convert($dateformatdetails['phpdate'].' H:i'); - }; - if (trim($brow['validuntil'])!=''){ - $datetimeobj = new Date_Time_Converter($brow['validuntil'] , "Y-m-d H:i:s"); - $brow['validuntil']=$datetimeobj->convert($dateformatdetails['phpdate'].' H:i'); - }; - - if ($bgc == "evenrow") {$bgc = "oddrow";} else {$bgc = "evenrow";} - $tokenoutput .= "\t\n"; - - $tokenoutput .= "\n"; - - foreach ($tokenfieldorder as $tokenfieldname) - { - - if ($tokenfieldname =='email' && $brow['emailstatus'] != 'OK') - { - if ($brow['emailstatus']!='OptOut') - { - $tokenoutput .= "\n"; - } - else - { - $tokenoutput .= "\n"; - } - } - - // elseif ($tokenfieldname != 'emailstatus') - else - { - if ($tokenfieldname=='tid') - { - $tokenoutput.=""; - } - else - { - $tokenoutput .= '\n"; - } - } - if ($tokenfieldname=='tid') - { - $tokenoutput .= "\n"; - } - } - $tokenoutput .= "\t\n"; - } - - // Multiple item actions - if ($bresult->rowCount() > 0) { - $tokenoutput .= "\n" - . "\n" - . "\n"; - } - //End multiple item actions - - $tokenoutput .= "
    " - ."" - .""
-        .$clang->gT("Sort by: ")
-        ."ID"."ID".$clang->gT("Actions")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("First name")
-        ."".$clang->gT("First name")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Last name")
-        ."".$clang->gT("Last name")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Email address")
-        ."".$clang->gT("Email address")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Email status")
-        ."".$clang->gT("Email status")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Token")
-        ."".$clang->gT("Token")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Language")
-        ."".$clang->gT("Language")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Invitation sent?")
-        ."".$clang->gT("Invitation sent?")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Reminder sent?")
-        ."".$clang->gT("Reminder sent?")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Reminder count")
-        ."".$clang->gT("Reminder count")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Completed?")
-        ."".$clang->gT("Completed?")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Uses left")
-        ."".$clang->gT("Uses left")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Valid from")
-        ."".$clang->gT("Valid from")."" - ."" - .""
-        .$clang->gT("Sort by: ")
-        .$clang->gT("Valid until")
-        ."".$clang->gT("Valid until")."" - ."" - ."".htmlspecialchars($attr_translation,ENT_QUOTES,'utf-8')."
    " - ."" - ."$brow[$tokenfieldname]" - ."" - ."$brow[$tokenfieldname]".$brow[$tokenfieldname]."'.htmlspecialchars($brow[$tokenfieldname])."\n"; - if (bHasSurveyPermission($surveyid, 'tokens','update')) - { - if ((($brow['completed'] == "N" || $brow['completed'] == "") && $brow['token']) || $thissurvey['alloweditaftercompletion']=='Y') - { - $toklang = ($brow['language'] == '') ? $baselanguage : $brow['language']; - $tokenoutput .= "\n"; - } - else - { - $tokenoutput .= ""; - } - $tokenoutput .=" "; - } - if (bHasSurveyPermission($surveyid, 'tokens','delete')) - { - $tokenoutput .="gT("Are you sure you want to delete this entry?","js")." (".$brow['tid'].")')) {".get2post("$scriptname?action=tokens&sid=$surveyid&subaction=delete&tid=".$brow['tid']."&limit=$limit&start=$start&order=$order")."}\" />"; - } - - if ($brow['completed'] != "N" && $brow['completed']!="" && $surveyprivate == "N" && $thissurvey['active']=='Y') - { - // Get response Id - $query="SELECT id FROM ".db_table_name('survey_'.$surveyid)." WHERE token='{$brow['token']}' ORDER BY id desc"; - $result=db_execute_num($query) or safe_die ("
    Could not find token!
    \n" .$connect->ErrorMsg()); - list($id) = $result->FetchRow(); - - // UPDATE button to the tokens display in the MPID Actions column - if ($id) - { - $tokenoutput .= "\n"; - } - } - elseif ($brow['completed'] == "N" && $brow['token'] && $brow['sent'] == "N" && trim($brow['email'])!='' && bHasSurveyPermission($surveyid, 'tokens','update')) - { - $tokenoutput .= ""; - } - elseif ($brow['completed'] == "N" && $brow['token'] && $brow['sent'] != "N" && trim($brow['email'])!='') // reminder button - { - $tokenoutput .= ""; - } - $tokenoutput .= "\n
    "; - - if (bHasSurveyPermission($surveyid, 'tokens','delete')) - { - $tokenoutput .= "" - . "gT("Are you sure you want to delete the selected entries?","js") - ."')) {".get2post("{$scriptname}?action=tokens&sid={$surveyid}&subaction=delete&tids=document.getElementById('tokenboxeschecked').value&limit={$limit}&start={$start}&order={$order}")."}}else{alert('".$clang->gT("No tokens selected",'js')."');}\" />"; - - } - - if (bHasSurveyPermission($surveyid, 'tokens','update')) - { - $tokenoutput .= " " - . "" - . " " - . ""; - } - $tokenoutput .= "\n"; - $tokenoutput .= "
    \n
    \n"; - } - - if ($subaction == "kill" && bHasSurveyPermission($surveyid, 'surveyactivation', 'update')) - { - $date = date('YmdHis'); - $tokenoutput .= "
    ".$clang->gT("Delete Tokens Table")."
    \n" - ."
    \n"; - // ToDo: Just delete it if there is no token in the table - if (!isset($_POST['ok']) || !$_POST['ok']) - { - $tokenoutput .= "
    ".$clang->gT("Warning")."

    \n" - .$clang->gT("If you delete this table tokens will no longer be required to access this survey.")."
    ".$clang->gT("A backup of this table will be made if you proceed. Your system administrator will be able to access this table.")."
    \n" - ."( \"old_tokens_{$surveyid}_$date\" )

    \n" - ."\n" - ."\n"; - } - elseif (isset($_POST['ok']) && $_POST['ok'] == "surething") - { - $oldtable = "tokens_$surveyid"; - $newtable = "old_tokens_{$surveyid}_$date"; - $deactivatequery = db_rename_table( db_table_name_nq($oldtable), db_table_name_nq($newtable)); - - if ($databasetype=='postgres') - { - // If you deactivate a postgres table you have to rename the according sequence too and alter the id field to point to the changed sequence - $oldTableJur = db_table_name_nq($oldtable); - $deactivatequery = db_rename_table(db_table_name_nq($oldtable),db_table_name_nq($newtable).'_tid_seq'); - $deactivateresult = $connect->Execute($deactivatequery) or die ("oldtable : ".$oldtable. " / oldtableJur : ". $oldTableJur . " / ".htmlspecialchars($deactivatequery)." / Could not rename the old sequence for this token table. The database reported the following error:
    ".htmlspecialchars($connect->ErrorMsg())."

    ".$clang->gT("Main Admin Screen").""); - $setsequence="ALTER TABLE ".db_table_name_nq($newtable)."_tid_seq ALTER COLUMN tid SET DEFAULT nextval('".db_table_name_nq($newtable)."_tid_seq'::regclass);"; - $deactivateresult = $connect->Execute($setsequence) or die (htmlspecialchars($setsequence)." Could not alter the field tid to point to the new sequence name for this token table. The database reported the following error:
    ".htmlspecialchars($connect->ErrorMsg())."

    Survey was not deactivated either.

    ".$clang->gT("Main Admin Screen").""); - $setidx="ALTER INDEX ".db_table_name_nq($oldtable)."_idx RENAME TO ".db_table_name_nq($newtable)."_idx;"; - $deactivateresult = $connect->Execute($setidx) or die (htmlspecialchars($setidx)." Could not alter the index for this token table. The database reported the following error:
    ".htmlspecialchars($connect->ErrorMsg())."

    Survey was not deactivated either.

    ".$clang->gT("Main Admin Screen").""); - } else { - $deactivateresult = $connect->Execute($deactivatequery) or die ("Couldn't deactivate because:
    \n".htmlspecialchars($connect->ErrorMsg())." - Query: ".htmlspecialchars($deactivatequery)."

    \nAdmin\n"); - } - LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed - - $tokenoutput .= '
    '.$clang->gT("The tokens table has now been removed and tokens are no longer required to access this survey.")."
    ".$clang->gT("A backup of this table has been made and can be accessed by your system administrator.")."
    \n" - ."(\"{$dbprefix}old_tokens_{$surveyid}_$date\")"."

    \n" - ."\n"; - } - $tokenoutput .= "
    \n"; - } - - - if ($subaction == "email" && bHasSurveyPermission($surveyid, 'tokens','update')) - { - if (getEmailFormat($surveyid) == 'html') - { - $ishtml=true; - } - else - { - $ishtml=false; - } - - $tokenoutput .= PrepareEditorScript(); - $tokenoutput .= "\t
    " - .$clang->gT("Send email invitations")."
    \n" - ."\t

    \n"; // Wrapping Div - if (!isset($_POST['ok']) || !$_POST['ok']) - { - if ($thissurvey['active']!='Y') - { - $tokenoutput .="
    ".$clang->gT('Warning!')."
    ".$clang->gT("This survey is not yet activated and so your participants won't be able to fill out the survey.")."
    "; - } - $tokenoutput .= "\n
    \n" // Tabs Div - . "\n"; - $tokenoutput .= "
    "; // Form - - - foreach ($surveylangs as $language) - { - //GET SURVEY DETAILS - $thissurvey=getSurveyInfo($surveyid,$language); - $bplang = new limesurvey_lang($language); - - if ($ishtml===true) - { - $aDefaultTexts=aTemplateDefaultTexts($bplang); - } - else - { - $aDefaultTexts=aTemplateDefaultTexts($bplang,'unescaped'); - } - if (!$thissurvey['email_invite']) - { - if ($ishtml===true) - { - $thissurvey['email_invite']=html_escape($aDefaultTexts['invitation']); - } - else - { - $thissurvey['email_invite']=$aDefaultTexts['invitation']; - } - } - if (!$thissurvey['email_invite_subj']) - { - $thissurvey['email_invite_subj']=$aDefaultTexts['invitation_subject']; - } - $fieldsarray["{ADMINNAME}"]= $thissurvey['adminname']; - $fieldsarray["{ADMINEMAIL}"]=$thissurvey['adminemail']; - $fieldsarray["{SURVEYNAME}"]=$thissurvey['name']; - $fieldsarray["{SURVEYDESCRIPTION}"]=$thissurvey['description']; - $fieldsarray["{EXPIRY}"]=$thissurvey["expiry"]; - - $subject=Replacefields($thissurvey['email_invite_subj'], $fieldsarray,false); - $textarea=Replacefields($thissurvey['email_invite'], $fieldsarray,false); - if ($ishtml!==true){$textarea=str_replace(array('',''),array(''),$textarea);} - $tokenoutput .= '
    '."\n"; // Language Tab Div - - $tokenoutput .= "\t
      \n" - ."
    • \n" - ."\" />
    • \n" - - ."
    • \n" - ."
    • \n" - - ."
    • \n" - ."\n" - . getEditor("email-inv","message_$language","[".$clang->gT("Invitation email:", "js")."](".$language.")",$surveyid,'','',$action) - ."
    • \n" - ."\t
    \n"; // End Language Tab Div - - } - //$tokenoutput .= "
    "; // TIBO: commenting this unexpected end div - /* - if (isset($tokenid)) - { - $tokenoutput .= "
  • ".$tokenid - ."
  • "; - } - if (isset($tokenids) && count($tokenids) > 0) - { - $tokenoutput .= "
  • ".implode(", ", $tokenids) - ."
  • "; - } else { - $tokenoutput .= "
  • " - .$clang->gT("All tokens who have not yet been sent an invitation") - ."
  • "; - } - */ - $tokenoutput .="\t

    \n" - ."\t

    \n" - ."\t\n" - ."\t\n" - ."\t\n" - ."\t\n"; - if (isset($tokenid)) {$tokenoutput .= "\t\n";} - if (isset($tokenids)) {$tokenoutput .= "\n\n";} - $tokenoutput .= "

    \n"; - - } - else - { - $tokenoutput .= "
    \n" - ."\t
    \n"; - $tokenoutput .= $clang->gT("Sending invitations..."); - $tokenoutput .= "\n\t
    \n"; - if (isset($tokenid)) {$tokenoutput .= " (".$clang->gT("Sending to Token ID").": {$tokenid})";} - if (isset($tokenids)) {$tokenoutput .= " (".$clang->gT("Sending to Token IDs").": ".implode(", ", $tokenids).")";} - $tokenoutput .= "
    \n"; - - if (isset($_POST['bypassbademails']) && $_POST['bypassbademails'] == 'Y') - { - $SQLemailstatuscondition = " AND emailstatus = 'OK'"; - } - else - { - $SQLemailstatuscondition = " AND emailstatus <> 'OptOut'"; - } - - $ctquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE ((completed ='N') or (completed='')) AND ((sent ='N') or (sent='')) AND token !='' AND email != '' $SQLemailstatuscondition"; - - if (isset($tokenid)) {$ctquery .= " AND tid='{$tokenid}'";} - if (isset($tokenids)) {$ctquery .= " AND tid IN ('".implode("', '", $tokenids)."')";} - $tokenoutput .= "\n"; - $ctresult = $connect->Execute($ctquery) or safe_die("Database error!
    \n" . $connect->ErrorMsg()); - $ctcount = $ctresult->RecordCount(); - $ctfieldcount = $ctresult->FieldCount(); - - $emquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE ((completed ='N') or (completed='')) AND ((sent ='N') or (sent='')) AND token !='' AND email != '' $SQLemailstatuscondition"; - - if (isset($tokenid)) {$emquery .= " and tid='{$tokenid}'";} - if (isset($tokenids)) {$emquery .= " AND tid IN ('".implode("', '", $tokenids)."')";} - $tokenoutput .= "\n\n\n\n"; - $emresult = db_select_limit_assoc($emquery,$maxemails) or safe_die ("Couldn't do query.
    \n$emquery
    \n".$connect->ErrorMsg()); - $emcount = $emresult->RecordCount(); - - $surveylangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselanguage = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($surveylangs,$baselanguage); - - foreach ($surveylangs as $language) - { - $_POST['message_'.$language]=auto_unescape($_POST['message_'.$language]); - $_POST['subject_'.$language]=auto_unescape($_POST['subject_'.$language]); - if ($ishtml) $_POST['message_'.$language] = html_entity_decode($_POST['message_'.$language], ENT_QUOTES, $emailcharset); - } - - - $attributes=GetTokenFieldsAndNames($surveyid); - if ($emcount > 0) - { - $tokenoutput .= "
      \n"; - $oMail = new PHPMailer; - while ($emrow = $emresult->FetchRow()) - { - unset($fieldsarray); - $to=array(); - $aEmailaddresses=explode(';',$emrow['email']); - foreach($aEmailaddresses as $sEmailaddress) - { - $to[]=$emrow['firstname']." ".$emrow['lastname']." <{$sEmailaddress}>"; - } - $fieldsarray["{EMAIL}"]=$emrow['email']; - $fieldsarray["{FIRSTNAME}"]=$emrow['firstname']; - $fieldsarray["{LASTNAME}"]=$emrow['lastname']; - $fieldsarray["{TOKEN}"]=$emrow['token']; - $fieldsarray["{LANGUAGE}"]=$emrow['language']; - $fieldsarray["{SID}"]=$fieldsarray["{SURVEYID}"]=$surveyid; - $fieldsarray["{SURVEYNAME}"]=$thissurvey["surveyls_title"]; - - foreach ($attributes as $attributefield=>$attributedescription) - { - $fieldsarray['{'.strtoupper($attributefield).'}']=$emrow[$attributefield]; - $fieldsarray['{TOKEN:'.strtoupper($attributefield).'}']=$emrow[$attributefield]; - } - - $emrow['language']=trim($emrow['language']); - if ($emrow['language']=='') {$emrow['language']=$baselanguage;} //if language is not given use default - $found = array_search($emrow['language'], $surveylangs); - if ($found==false) {$emrow['language']=$baselanguage;} - - $from = $_POST['from_'.$emrow['language']]; - - if ($ishtml === false) - { - $fieldsarray["{OPTOUTURL}"]="$publicurl/optout.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; - - if ( $modrewrite ) - { - $fieldsarray["{SURVEYURL}"]="$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}"; - $barebone_link=$fieldsarray["{SURVEYURL}"]; - } - else - { - $fieldsarray["{SURVEYURL}"]="$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; - $barebone_link=$fieldsarray["{SURVEYURL}"]; - } - } - else - { - $fieldsarray["{OPTOUTURL}"]="".htmlspecialchars("$publicurl/optout.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}").""; - if ( $modrewrite ) - { - $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}").""; - $barebone_link="$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}"; - } - else - { - $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}").""; - $barebone_link="$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; - } - } - $customheaders = array( '1' => "X-surveyid: ".$surveyid, - '2' => "X-tokenid: ".$fieldsarray["{TOKEN}"]); - - $modsubject=Replacefields($_POST['subject_'.$emrow['language']], $fieldsarray); - $modmessage=Replacefields($_POST['message_'.$emrow['language']], $fieldsarray); - - $modsubject = str_replace("@@SURVEYURL@@", $barebone_link, $modsubject); - $modmessage = str_replace("@@SURVEYURL@@", $barebone_link, $modmessage); - - if (trim($emrow['validfrom'])!='' && convertDateTimeFormat($emrow['validfrom'],'Y-m-d H:i:s','U')*1>date('U')*1) - { - $tokenoutput .= $emrow['tid'] ." ".ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) delayed: Token is not yet valid.")."
      ", $fieldsarray); - } - elseif (trim($emrow['validuntil'])!='' && convertDateTimeFormat($emrow['validuntil'],'Y-m-d H:i:s','U')*1gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) skipped: Token is not valid anymore.")."
      ", $fieldsarray); - } - elseif (SendEmailMessage($oMail, $modmessage, $modsubject, $to , $from, $sitename, $ishtml, getBounceEmail($surveyid),null,$customheaders)) - { - // Put date into sent - $today = date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i", $timeadjust); - $udequery = "UPDATE ".db_table_name("tokens_{$surveyid}")."\n" - ."SET sent='$today' WHERE tid={$emrow['tid']}"; - // - $uderesult = $connect->Execute($udequery) or safe_die ("Could not update tokens
      $udequery
      ".$connect->ErrorMsg()); - $tokenoutput .= $clang->gT("Invitation sent to:")." {$emrow['firstname']} {$emrow['lastname']} (".htmlspecialchars(implode(',',$to)).")
      \n"; - if ($emailsmtpdebug==2) - { - $tokenoutput .=$maildebug; - } - } - else - { - unset($oMail); - $oMail = new PHPMailer; - $tokenoutput .= '
    • '.ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:")." ".$maildebug."
      ", $fieldsarray).'
    • '; - if ($debug>0) - { - $tokenoutput .= "
      Subject : $modsubject

      ".htmlspecialchars($maildebugbody)."
      "; - } - } - } - if ($ctcount > $emcount) - { - $i = 0; - if (isset($tokenids)) - { - while($i < $maxemails) - { array_shift($tokenids); $i++; } - $tids = '|'.implode('|',$tokenids); - } - $lefttosend = $ctcount-$maxemails; - $tokenoutput .= "
    \n" - ."
    ".$clang->gT("Warning")."

    \n" - ."
    " - .$clang->gT("There are more emails pending than can be sent in one batch. Continue sending emails by clicking below.")."

    \n"; - $tokenoutput .= str_replace("{EMAILCOUNT}", "$lefttosend", $clang->gT("There are {EMAILCOUNT} emails still to be sent.")); - $tokenoutput .= "

    \n"; - $tokenoutput .= "\n" - ."\n" - ."\n" - ."\n" - ."\n" - ."\n"; - if (isset($tokenids)) - { - $tokenoutput .= "\n"; - } - foreach ($surveylangs as $language) - { - $message = html_escape($_POST['message_'.$language]); - $subject = html_escape($_POST['subject_'.$language]); - $tokenoutput .="\n" - ."\n" - ."\n"; - } - $tokenoutput .="
    \n"; - } - $oMail->SmtpClose(); - } - else - { - $tokenoutput .= "
    ".$clang->gT("Warning")."
    \n".$clang->gT("There were no eligible emails to send. This will be because none satisfied the criteria of:") - ."
     
    • ".$clang->gT("having a valid email address")."
    • " - ."
    • ".$clang->gT("not having been sent an invitation already")."
    • " - ."
    • ".$clang->gT("having already completed the survey")."
    • " - ."
    • ".$clang->gT("having a token")."
    "; - } - } - //$tokenoutput .= "
    \n\n"; - $tokenoutput .= "\n"; // TIBO only close on div, cause dialog-modal will cklose wrapper - } - - if ($subaction == "remind" && bHasSurveyPermission($surveyid, 'tokens','update')) - { - $tokenoutput .= PrepareEditorScript(); - $tokenoutput .= "\t
    " - .$clang->gT("Send email reminder")."

    \n"; - if (!isset($_POST['ok']) || !$_POST['ok']) - { - if ($thissurvey['active']!='Y') - { - $tokenoutput .="
    ".$clang->gT('Warning!')."
    ".$clang->gT("This survey is not yet activated and so your participants won't be able to fill out the survey.")."
    "; - } - //GET SURVEY DETAILS - $tokenoutput .= "
    "; - $surveylangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($surveylangs,$baselang); - - $tokenoutput .= "
    "; - foreach ($surveylangs as $language) - { - //GET SURVEY DETAILS - $thissurvey=getSurveyInfo($surveyid,$language); - if (!$thissurvey['email_remind']) {$thissurvey['email_remind']=str_replace("\n", "\r\n", $clang->gT("Dear {FIRSTNAME},\n\nRecently we invited you to participate in a survey.\n\nWe note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.\n\nThe survey is titled:\n\"{SURVEYNAME}\"\n\n\"{SURVEYDESCRIPTION}\"\n\nTo participate, please click on the link below.\n\nSincerely,\n\n{ADMINNAME} ({ADMINEMAIL})\n\n----------------------------------------------\nClick here to do the survey:\n{SURVEYURL}")."\n\n".$clang->gT("If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:\n{OPTOUTURL}"));} - $tokenoutput .= '

    '.getLanguageNameFromCode($language,false); - if ($language==$baselang) - { - $tokenoutput .= "(".$clang->gT("Base language").")"; - } - $tokenoutput .= "

      \n" - ."
    • \n" - ."\" />
    • \n" - - ."
    • \n"; - - $fieldsarray["{ADMINNAME}"]= $thissurvey['adminname']; - $fieldsarray["{ADMINEMAIL}"]=$thissurvey['adminemail']; - $fieldsarray["{SURVEYNAME}"]=$thissurvey['name']; - $fieldsarray["{SURVEYDESCRIPTION}"]=$thissurvey['description']; - $fieldsarray["{EXPIRY}"]=$thissurvey["expiry"]; - - $subject=Replacefields($thissurvey['email_remind_subj'], $fieldsarray, false); - $textarea=Replacefields($thissurvey['email_remind'], $fieldsarray, false); - if ($ishtml!==true){$textarea=str_replace(array('',''),array(''),$textarea);} - - $tokenoutput .= "
    • \n"; - - $tokenoutput .= "\t
    • \n" - ."\n" - ."\n" - . getEditor("email-rem","message_$language","[".$clang->gT("Reminder Email:", "js")."](".$language.")",$surveyid,'','',$action) - ."
    • \n" - ."
    "; - } - - $tokenoutput .= "
      \n"; - - if (isset($tokenids)) { - $tokenoutput .= "\t
    • \n" - . "\n" - . implode(", ", $tokenids)."
    • \n"; - } elseif (!isset($tokenid)) { - $tokenoutput .= "
    • " - .$clang->gT("All token entries to whom a reminder email would apply") - ."
    • "; - $tokenoutput .= "\t
    • \n" - ."\n" - ."\n" - ."\t
    • \n"; - } elseif (isset($tokenid)) { - $tokenoutput .= "\t
    • \n" - ."\n" - ."{$tokenid}
    • \n"; - } - $tokenoutput .="
    • \n" - ."
    • \n" - . "
    • \n" - ."
    • \n" - - . "
    • \n" - . "
    • \n" - . "

    \n" - ."\n" - ."\t\n" - ."\t\n" - ."\t\n"; - if (isset($tokenid)) {$tokenoutput .= "\t\n";} - if (isset($tokenids)) {$tokenoutput .= "\n\n";} - $tokenoutput .= "

    \n"; - } - else - { - - $tokenoutput .= "
    \n" - . "
    "; - $tokenoutput .= $clang->gT("Sending Reminders") - ."

    \n"; - - $surveylangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselanguage = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($surveylangs,$baselanguage); - - foreach ($surveylangs as $language) - { - $_POST['message_'.$language]=auto_unescape($_POST['message_'.$language]); - $_POST['subject_'.$language]=auto_unescape($_POST['subject_'.$language]); - - } - - if (isset($starttokenid)) {$tokenoutput .= " (".$clang->gT("From Token ID").": {$starttokenid})";} - if (isset($tokenid)) {$tokenoutput .= " (".$clang->gT("Sending to Token ID").": {$tokenid})";} - if (isset($tokenids)) {$tokenoutput .= " (".$clang->gT("Sending to Token IDs").": ".implode("|", $tokenids).")";} - - if (isset($_POST['bypassbademails']) && $_POST['bypassbademails'] == 'Y') - { - $SQLemailstatuscondition = " AND emailstatus = 'OK'"; - } - else - { - $SQLemailstatuscondition = " AND emailstatus <> 'OptOut'"; - } - - if (isset($_POST['maxremindercount']) && - $_POST['maxremindercount'] != '' && - intval($_POST['maxremindercount']) != 0) - { - $SQLremindercountcondition = " AND remindercount < ".intval($_POST['maxremindercount']); - } - else - { - $SQLremindercountcondition = ""; - } - - if (isset($_POST['minreminderdelay']) && - $_POST['minreminderdelay'] != '' && - intval($_POST['minreminderdelay']) != 0) - { - // $_POST['minreminderdelay'] in days (86400 seconds per day) - $compareddate = date_shift( - date("Y-m-d H:i:s",time() - 86400 * intval($_POST['minreminderdelay'])), - "Y-m-d H:i", - $timeadjust); - $SQLreminderdelaycondition = " AND ( " - . " (remindersent = 'N' AND sent < '".$compareddate."') " - . " OR " - . " (remindersent < '".$compareddate."'))"; - } - else - { - $SQLreminderdelaycondition = ""; - } - - $ctquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE (completed ='N' or completed ='') AND sent<>'' AND sent<>'N' AND token <>'' AND email <> '' $SQLemailstatuscondition $SQLremindercountcondition $SQLreminderdelaycondition"; - - if (isset($starttokenid)) {$ctquery .= " AND tid > '{$starttokenid}'";} - if (isset($tokenid) && $tokenid) {$ctquery .= " AND tid = '{$tokenid}'";} - if (isset($tokenids)) {$ctquery .= " AND tid IN (".implode(", ", $tokenids).")";} - $tokenoutput .= "\n"; - $ctresult = $connect->Execute($ctquery) or safe_die ("Database error!
    \n" . $connect->ErrorMsg()); - $ctcount = $ctresult->RecordCount(); - $ctfieldcount = $ctresult->FieldCount(); - $emquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE (completed = 'N' or completed = '') AND sent <> 'N' and sent <>'' AND token <>'' AND EMAIL <>'' $SQLemailstatuscondition $SQLremindercountcondition $SQLreminderdelaycondition"; - - if (isset($starttokenid)) {$emquery .= " AND tid > '{$starttokenid}'";} - if (isset($tokenid) && $tokenid) {$emquery .= " AND tid = '{$tokenid}'";} - if (isset($tokenids)) {$emquery .= " AND tid IN (".implode(", ", $tokenids).")";} - $emquery .= " ORDER BY tid "; - $emresult = db_select_limit_assoc($emquery, $maxemails) or safe_die ("Couldn't do query.
    $emquery
    ".$connect->ErrorMsg()); - $emcount = $emresult->RecordCount(); - - - $attributes=GetTokenFieldsAndNames($surveyid); - if ($emcount > 0) - { - $tokenoutput .= "\n" - ."\t\n" - ."\n" - ."\t\n" - ."\t" - ."\n" - ."\t\n" - ."\t\n" - ."\t\n" - ."\t\n" - ."\t\n"; - //Include values for constraints minreminderdelay and maxremindercount if they exist - if (isset($_POST['minreminderdelay']) && - $_POST['minreminderdelay'] != '' && - intval($_POST['minreminderdelay']) != 0) - { - $tokenoutput .= "\t\n"; - } - if (isset($_POST['maxremindercount']) && - $_POST['maxremindercount'] != '' && - intval($_POST['maxremindercount']) != 0) - { - $tokenoutput .= "\t\n"; - } - // - foreach ($surveylangs as $language) - { - $message = html_escape($_POST['message_'.$language]); - $tokenoutput .="\n" - ."\n" - ."\n"; - } - $tokenoutput.="\t\n" - ."\t\n"; - } - $tokenoutput .= "\t\n" - ."
    \n"; - $oMail = new PHPMailer; - while ($emrow = $emresult->FetchRow()) - { - unset($fieldsarray); - $to=array(); - $aEmailaddresses=explode(';',$emrow['email']); - foreach($aEmailaddresses as $sEmailaddress) - { - $to[]=$emrow['firstname']." ".$emrow['lastname']." <{$sEmailaddress}>"; - } - $fieldsarray["{EMAIL}"]=$emrow['email']; - $fieldsarray["{FIRSTNAME}"]=$emrow['firstname']; - $fieldsarray["{LASTNAME}"]=$emrow['lastname']; - $fieldsarray["{TOKEN}"]=$emrow['token']; - $fieldsarray["{LANGUAGE}"]=$emrow['language']; - $fieldsarray["{SID}"]=$fieldsarray["{SURVEYID}"]=$surveyid; - $fieldsarray["{SURVEYNAME}"]=$thissurvey["surveyls_title"]; - - foreach ($attributes as $attributefield=>$attributedescription) - { - $fieldsarray['{'.strtoupper($attributefield).'}']=$emrow[$attributefield]; - $fieldsarray['{TOKEN:'.strtoupper($attributefield).'}']=$emrow[$attributefield]; - } - - $emrow['language']=trim($emrow['language']); - if ($emrow['language']=='') {$emrow['language']=$baselanguage;} //if language is not give use default - $found = array_search($emrow['language'], $surveylangs); - if ($found==false) {$emrow['language']=$baselanguage;} - - $from = $_POST['from_'.$emrow['language']]; - - if (getEmailFormat($surveyid) == 'html') - { - $ishtml=true; - } - else - { - $ishtml=false; - } - - if ($ishtml == false) - { - $fieldsarray["{OPTOUTURL}"]="$publicurl/optout.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; - if ( $modrewrite ) - { - $fieldsarray["{SURVEYURL}"]="$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}"; - $barebone_link=$fieldsarray["{SURVEYURL}"]; - } - else - { - $fieldsarray["{SURVEYURL}"]="$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; - $barebone_link=$fieldsarray["{SURVEYURL}"]; - } - } - else - { - $fieldsarray["{OPTOUTURL}"]="".htmlspecialchars("$publicurl/optout.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}").""; - if ( $modrewrite ) - { - $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}").""; - $barebone_link="$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}"; - } - else - { - $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}").""; - $barebone_link="$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; - $_POST['message_'.$emrow['language']] = html_entity_decode($_POST['message_'.$emrow['language']], ENT_QUOTES, $emailcharset); - } - } - - $msgsubject=Replacefields($_POST['subject_'.$emrow['language']], $fieldsarray); - $sendmessage=Replacefields($_POST['message_'.$emrow['language']], $fieldsarray); - - $msgsubject = str_replace("@@SURVEYURL@@", $barebone_link, $msgsubject); - $sendmessage = str_replace("@@SURVEYURL@@", $barebone_link, $sendmessage); - - $customheaders = array( '1' => "X-surveyid: ".$surveyid, - '2' => "X-tokenid: ".$fieldsarray["{TOKEN}"]); - - if (trim($emrow['validfrom'])!='' && convertDateTimeFormat($emrow['validfrom'],'Y-m-d H:i:s','U')*1>date('U')*1) - { - $tokenoutput .= $emrow['tid'] ." ".ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) delayed: Token is not yet valid.")."
    ", $fieldsarray); - } - elseif (trim($emrow['validuntil'])!='' && convertDateTimeFormat($emrow['validuntil'],'Y-m-d H:i:s','U')*1gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) skipped: Token is not valid anymore.")."
    ", $fieldsarray); - } - elseif (SendEmailMessage($oMail, $sendmessage, $msgsubject, $to, $from, $sitename,$ishtml,getBounceEmail($surveyid),null,$customheaders)) - { - - // Put date into remindersent - $today = date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i", $timeadjust); - $udequery = "UPDATE ".db_table_name("tokens_{$surveyid}")."\n" - ."SET remindersent='$today',remindercount = remindercount+1 WHERE tid={$emrow['tid']}"; - // - $uderesult = $connect->Execute($udequery) or safe_die ("Could not update tokens
    $udequery
    ".$connect->ErrorMsg()); - //orig: $tokenoutput .= "({$emrow['tid']})[".$clang->gT("Reminder sent to:")." {$emrow['firstname']} {$emrow['lastname']}]
    \n"; - $tokenoutput .= "({$emrow['tid']}) [".$clang->gT("Reminder sent to:")." {$emrow['firstname']} {$emrow['lastname']} (".htmlspecialchars($to[0]).")]
    \n"; - } - else - { - unset($oMail); - $oMail = new PHPMailer; - $tokenoutput .= $emrow['tid'] ." ".ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:")." ".$maildebug."
    ", $fieldsarray); - if ($debug>0) - { - $tokenoutput .= "
    Subject : $msgsubject

    ".htmlspecialchars($maildebugbody)."
    "; - } - - } - $lasttid = $emrow['tid']; - } - $oMail->SmtpClose(); - if ($ctcount > $emcount) - { - $lefttosend = $ctcount-$maxemails; - $tokenoutput .= "
    \n" - ."".$clang->gT("Warning")."

    \n" - .$clang->gT("There are more emails pending than can be sent in one batch. Continue sending emails by clicking below.")."

    \n" - .str_replace("{EMAILCOUNT}", $lefttosend, $clang->gT("There are {EMAILCOUNT} emails still to be sent.")) - ."
    \n" - ."\n" - ."
    \n"; - } - else - { - $tokenoutput .= "
    ".$clang->gT("Warning")."
    \n" - .$clang->gT("There were no eligible emails to send. This will be because none satisfied the criteria of:")."\n" - ."
     
    • ".$clang->gT("having a valid email address")."
    • " - ."
    • ".$clang->gT("having a token")."
    • " - ."
    • ".$clang->gT("not having been sent an invitation already")."
    • " - ."
    • ".$clang->gT("but not having already completed the survey")."
    • " - ."

    \n"; - } - $tokenoutput .= "
    \n"; - } - } - - if ($subaction == "tokenify" && bHasSurveyPermission($surveyid, 'tokens', 'update')) - { - $tokenoutput .= "
    ".$clang->gT("Create tokens")."
    \n"; - $tokenoutput .= "
    \n"; - if (!isset($_POST['ok']) || !$_POST['ok']) - { - $tokenoutput .= "".$clang->gT("Clicking yes will generate tokens for all those in this token list that have not been issued one. Is this OK?")."

    \n" - ."\n" - .$clang->gT("Yes")."' onclick=\"".get2post("$scriptname?action=tokens&sid=$surveyid&subaction=tokenify&ok=Y")."\" />\n" - ."\n" - ."
    \n"; - } - else - { - //get token length from survey settings - $tlquery = "SELECT tokenlength FROM ".db_table_name("surveys")." WHERE sid=$surveyid"; - $tlresult = db_execute_assoc($tlquery); - while ($tlrow = $tlresult->FetchRow()) - { - $tokenlength = $tlrow['tokenlength']; - } - - //if tokenlength is not set or there are other problems use the default value (15) - if(!isset($tokenlength) || $tokenlength == '') - { - $tokenlength = 15; - } - // select all existing tokens - $ntquery = "SELECT token FROM ".db_table_name("tokens_$surveyid")." group by token"; - $ntresult = db_execute_assoc($ntquery); - while ($tkrow = $ntresult->FetchRow()) - { - $existingtokens[$tkrow['token']]=true; - } - $newtokencount = 0; - $invalidtokencount=0; - $tkquery = "SELECT tid FROM ".db_table_name("tokens_$surveyid")." WHERE token IS NULL OR token=''"; - $tkresult = db_execute_assoc($tkquery) or safe_die ("Mucked up!
    $tkquery
    ".$connect->ErrorMsg()); - while (($tkrow = $tkresult->FetchRow()) && $invalidtokencount<50) - { - $isvalidtoken = false; - while ($isvalidtoken == false && $invalidtokencount<50) - { - $newtoken = sRandomChars($tokenlength); - if (!isset($existingtokens[$newtoken])) { - $isvalidtoken = true; - $existingtokens[$newtoken]=true; - $invalidtokencount=0; - } - else - { - $invalidtokencount ++; - } - } - if(!$invalidtokencount) - { - $itquery = "UPDATE ".db_table_name("tokens_$surveyid")." SET token='$newtoken' WHERE tid={$tkrow['tid']}"; - $itresult = $connect->Execute($itquery); - $newtokencount++; - } - } - if(!$invalidtokencount){ - $tokenoutput .= "
    ".sprintf($clang->gT("%s tokens have been created."),$newtokencount)."
    \n"; - }else{ - $tokenoutput .= "\t\t
    ".$clang->gT("Error")."
    \n" - ."\t\t

    ".sprintf($clang->gT("Only %s new tokens were added after %s trials."),$newtokencount,$invalidtokencount)."\n" - ."\t\t".$clang->gT("Try with a bigger token length.")."

    \n"; - } - } - $tokenoutput .= "
    \n"; - } - - if ($subaction == "delete" && bHasSurveyPermission($surveyid, 'tokens','delete')) - { - $tokenoutput .= "
    \n" - ."\t
    " - .$clang->gT("Delete") - ."\t
    \n" - ."\t


    "; - if(isset($tokenids) && count($tokenids)>0) { - if(implode(", ", $tokenids) != "") { - $dlquery = "DELETE FROM ".db_table_name("tokens_$surveyid")." WHERE tid IN (".implode(", ", $tokenids).")"; - $dlresult = $connect->Execute($dlquery) or safe_die ("Couldn't delete record {$tokenid}
    ".$connect->ErrorMsg()."\n\n$dlquery"); - $tokenoutput .= $clang->gT("Marked tokens have been deleted."); - } else { - $tokenoutput .= $clang->gT("No tokens were selected for deletion"); - } - } elseif (isset($tokenid)) { - $dlquery = "DELETE FROM ".db_table_name("tokens_$surveyid")." WHERE tid={$tokenid}"; - $dlresult = $connect->Execute($dlquery) or safe_die ("Couldn't delete record {$tokenid}
    ".$connect->ErrorMsg()); - $tokenoutput .= $clang->gT("Token has been deleted."); - } - $tokenoutput .= "

    ".$clang->gT("Reloading Screen. Please wait.")."

    \n" - ."

    \n
    \n"; - } - - if ($subaction == "managetokenattributes" && bHasSurveyPermission($surveyid, 'tokens', 'update')) - { - $tokenoutput .= "
    ".$clang->gT("Manage token attribute fields")."
    \n"; - $tokenfields=GetTokenFieldsAndNames($surveyid,true); - $nrofattributes=0; - $tokenoutput.='
    ' - .""; - - $exampledataquery = "SELECT * FROM ".db_table_name("tokens_$surveyid"); - $exampledata = db_select_limit_assoc($exampledataquery,1) or safe_die ("Could not get example data!
    $exampledataquery
    ".$connect->ErrorMsg()); - $examplerow = $exampledata->FetchRow(); - - - foreach ($tokenfields as $tokenfield=>$tokendescription) - { - $nrofattributes++; - $tokenoutput.=""; - } - $tokenoutput.="
    ".$clang->gT("Attribute field")."".$clang->gT("Field description")."".$clang->gT("Example data")."
    $tokenfield"; - if ($examplerow!==false) - { - $tokenoutput.=htmlspecialchars($examplerow[$tokenfield]); - } - else - { - $tokenoutput.=$clang->gT(''); - } - $tokenoutput.="

    " - .'' - ."\n" - ."\n" - ."

    \n" - .'


    '; - - $tokenoutput .= "
    ".$clang->gT("Add token attributes")."

    \n"; - - $tokenoutput .=sprintf($clang->gT('There are %s user attribute fields in this token table'),$nrofattributes).'

    ' - .'
    ' - .'

    ' - .'' - .'' - .'

    ' - .'

    ' - .'' - ."" - ."" - ."" - ."

    " - .'
    ' - .'

    '; - } - - if ($subaction == "updatetokenattributedescriptions" && bHasSurveyPermission($surveyid, 'tokens', 'update')) - { - // find out the existing token attribute fieldnames - $tokenattributefieldnames=GetAttributeFieldNames($surveyid); - $fieldcontents=''; - foreach ($tokenattributefieldnames as $fieldname) - { - $fieldcontents.=$fieldname.'='.strip_tags($_POST['description_'.$fieldname])."\n"; - } - $updatequery = "update ".db_table_name('surveys').' set attributedescriptions='.db_quoteall($fieldcontents,true)." where sid=$surveyid"; - $execresult=db_execute_assoc($updatequery); - - $tokenoutput .= "\t
    ".$clang->gT("Update token attribute descriptions")."
    \n" - ."\t
    "; - if ($execresult===false) - { - $tokenoutput.="\t\t
    ".$clang->gT("Updating token attribute descriptions failed:")."".htmlspecialchars($connect->ErrorMsg())."
    " - ."\t\t
    \n"; - } - else - { - $tokenoutput.="\t\t
    ".$clang->gT("Token attribute descriptions were successfully updated.")."
    " - ."\t\t
    \n"; - } - $tokenoutput .= "\t
    "; - } - $tokenoutput .= "
    "; - if ($subaction == "updatetokenattributes" && bHasSurveyPermission($surveyid, 'tokens', 'update')) - { - $number2add=sanitize_int($_POST['addnumber'],1,100); - // find out the existing token attribute fieldnames - $tokenfieldnames = array_values($connect->MetaColumnNames("{$dbprefix}tokens_$surveyid", true)); - $tokenattributefieldnames=array_filter($tokenfieldnames,'filterforattributes'); - $i=1; - for ($b=0;$b<$number2add;$b++) - { - while (in_array('attribute_'.$i,$tokenattributefieldnames)!==false) { - $i++; - } - $tokenattributefieldnames[]='attribute_'.$i; - $fields[]=array('attribute_'.$i,'C','255'); - } - $dict = NewDataDictionary($connect); - $sqlarray = $dict->ChangeTableSQL("{$dbprefix}tokens_$surveyid", $fields); - $execresult=$dict->ExecuteSQLArray($sqlarray, false); - - $tokenoutput .= "\t
    ".$clang->gT("Update token attributes")."
    \n" - ."\t
    "; - if ($execresult==0) - { - $tokenoutput.="\t\t
    ".$clang->gT("Adding attribute fields failed:")."".htmlspecialchars($connect->ErrorMsg())."
    " - ."\t\t
    \n"; - } - else - { - $tokenoutput.="\t\t
    ".sprintf($clang->gT("%s field(s) were successfully added."),$number2add)."
    " - ."\t\t
    \n"; - } - $tokenoutput .= "\t
    "; - - LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed - } - - - if (($subaction == "edit" && bHasSurveyPermission($surveyid, 'tokens','update')) || - ($subaction == "addnew" && bHasSurveyPermission($surveyid, 'tokens','create'))) - { - if ($subaction == "edit") - { - $edquery = "SELECT * FROM ".db_table_name("tokens_$surveyid")." WHERE tid={$tokenid}"; - $edresult = db_execute_assoc($edquery); - $edfieldcount = $edresult->FieldCount(); - while($edrow = $edresult->FetchRow()) - { - //Create variables with the same names as the database column names and fill in the value - foreach ($edrow as $Key=>$Value) {$$Key = $Value;} - } - } - if ($subaction != "edit") - { - $edquery = "SELECT * FROM ".db_table_name("tokens_$surveyid"); - $edresult = db_select_limit_assoc($edquery, 1); - $edfieldcount = $edresult->FieldCount(); - } - - $tokenoutput .= "
    "; - if ($subaction == "edit") - { - $tokenoutput .=$clang->gT("Edit token entry"); - } - else - { - $tokenoutput .=$clang->gT("Add token entry"); - } - - $tokenoutput .="
    " - ."
    \n" - ."
      \n" - ."\t
    • \n"; - if ($subaction == "edit") - {$tokenoutput .=$tokenid;} else {$tokenoutput .=$clang->gT("Auto");} - $tokenoutput .= "
    • \n" - ."
    • \n" - ."
    • \n" - ."
    • \n" - ."
    • \n" - ."\t
    • \n" - ."\t
    • \n" - ."
    • \n" - ."
    • \n" - ."
    • \n" - ."\n"; - if ($subaction == "addnew") - { - $tokenoutput .= "".$clang->gT("You can leave this blank, and automatically generate tokens using 'Generate Tokens'")."\n"; - } - $tokenoutput .= "\t
    • \n" - ."
    • \n"; - if (isset($language)) {$tokenoutput .= languageDropdownClean($surveyid,$language);} - else { - $tokenoutput .= languageDropdownClean($surveyid,GetBaseLanguageFromSurveyID($surveyid)); - } - $tokenoutput .= "
    • \n" - - ."\t
    • \n" - ."\t
    • \n" - - ."\t
    • \n" - ."\t
    • \n"; - - if ($subaction == "edit") - { - $tokenoutput.="\t
    • \n" - ."\t
    • \n"; - } - - $tokenoutput.="\t
    • \n" - ."\t
    • \n" - - ."\t
    • \n" - ."\t
    • \n" - - ."\t
    • \n" - ."\tconvert($dateformatdetails['phpdate'].' H:i'); - } - $tokenoutput .= "\" />\n convert($dateformatdetails['phpdate'].' H:i'); - } - $tokenoutput .= "\" /> ".sprintf($clang->gT('Format: %s'),$dateformatdetails['dateformat'].' '.$clang->gT('hh:mm')).'' - ."
    • \n"; - - // now the attribute fieds - $attrfieldnames=GetTokenFieldsAndNames($surveyid,true); - foreach ($attrfieldnames as $attr_name=>$attr_description) - { - $tokenoutput .= "
    • " - ."\n" - ."\tgT("Update token entry")."' />\n" - ."\n" - ."\n"; - break; - case "addnew": - $tokenoutput .= "\n" - ."\n"; - break; - } - $tokenoutput .= "

      \n" - ."
    • \n"; - } - - if ($subaction == "adddummys" && bHasSurveyPermission($surveyid, 'tokens','create')) - { - //get token length from survey settings - $tlquery = "SELECT tokenlength FROM ".db_table_name("surveys")." WHERE sid=$surveyid"; - $tlresult = db_execute_assoc($tlquery); - while ($tlrow = $tlresult->FetchRow()) - { - $tokenlength = $tlrow['tokenlength']; - } - - //if tokenlength is not set or there are other problems use the default value (15) - if(!isset($tokenlength) || $tokenlength == '') - { - $tokenlength = 15; - } - - $tokenoutput .= "
      "; - $tokenoutput .=$clang->gT("Create dummy tokens"); - $tokenoutput .="
      " - ."
      \n" - ."
        \n" - ."\t
      • \n"; - $tokenoutput .=$clang->gT("Auto"); - $tokenoutput .= "
      • \n" - ."
      • \n" - ."
      • \n" - ."
      • \n" - ."
      • \n" - ."
      • \n" - ."
      • \n" - ."
      • \n" - ."
      • \n" - ."\t
      • \n" - ."\t
      • \n"; - $tokenoutput .= "\t\n" - ."
      • \n"; - $tokenoutput .= languageDropdownClean($surveyid,GetBaseLanguageFromSurveyID($surveyid)); - $tokenoutput .= "
      • \n" - ."\t
      • \n" - ."\t
      • \n" - ."\t
      • \n" - ."\tconvert($dateformatdetails['phpdate'].' H:i'); - } - $tokenoutput .= "\" />\n convert($dateformatdetails['phpdate'].' H:i'); - } - $tokenoutput .= "\" /> ".sprintf($clang->gT('Format: %s'),$dateformatdetails['dateformat'].' '.$clang->gT('hh:mm')).'' - ."
      • \n"; - - // now the attribute fieds - $attrfieldnames=GetTokenFieldsAndNames($surveyid,true); - foreach ($attrfieldnames as $attr_name=>$attr_description) - { - $tokenoutput .= "
      • " - ."\n" - ."\tgT("Add dummy tokens")."' />\n" - ."\n"; - $tokenoutput .= "

        \n" - ."
      • \n"; - } - - if ($subaction == "updatetoken" && bHasSurveyPermission($surveyid, 'tokens','update')) - { - $tokenoutput .= "\t
        ".$clang->gT("Edit token entry")."
        \n" - ."\t
        \n"; - if (trim($_POST['validfrom'])=='') { - $_POST['validfrom']=null; - } - else - { - $datetimeobj = new Date_Time_Converter(trim($_POST['validfrom']), $dateformatdetails['phpdate'].' H:i'); - $_POST['validfrom'] =$datetimeobj->convert('Y-m-d H:i:s'); - } - if (trim($_POST['validuntil'])=='') {$_POST['validuntil']=null;} - else - { - $datetimeobj = new Date_Time_Converter(trim($_POST['validuntil']), $dateformatdetails['phpdate'].' H:i'); - $_POST['validuntil'] =$datetimeobj->convert('Y-m-d H:i:s'); - } - $data = array(); - $data[] = $_POST['firstname']; - $data[] = $_POST['lastname']; - $data[] = sanitize_email($_POST['email']); - $data[] = $_POST['emailstatus']; - $santitizedtoken=sanitize_token($_POST['token']); - $data[] = $santitizedtoken; - $data[] = sanitize_languagecode($_POST['language']); - $data[] = $_POST['sent']; - $data[] = $_POST['completed']; - $data[] = $_POST['usesleft']; - // $db->DBTimeStamp("$year-$month-$day $hr:$min:$secs"); - $data[] = $_POST['validfrom']; - $data[] = $_POST['validuntil']; - $data[] = $_POST['remindersent']; - $data[] = intval($_POST['remindercount']); - - $udresult = $connect->Execute("Select * from ".db_table_name("tokens_$surveyid")." where tid<>{$tokenid} and token<>'' and token='{$santitizedtoken}'") or safe_die ("Update record {$tokenid} failed:
        \n$udquery
        \n".$connect->ErrorMsg()); - if ($udresult->RecordCount()==0) - { - $udresult = $connect->Execute("Select * from ".db_table_name("tokens_$surveyid")." where tid={$tokenid} and email='".sanitize_email($_POST['email'])."'") or safe_die ("Update record {$tokenid} failed:
        \n$udquery
        \n".$connect->ErrorMsg()); - - - // Using adodb Execute with blinding method so auto-dbquote is done - $udquery = "UPDATE ".db_table_name("tokens_$surveyid")." SET firstname=?, " - . "lastname=?, email=?, emailstatus=?, " - . "token=?, language=?, sent=?, completed=?, usesleft=?, validfrom=?, validuntil=?, remindersent=?, remindercount=?"; - $attrfieldnames=GetAttributeFieldnames($surveyid); - foreach ($attrfieldnames as $attr_name) - { - $udquery.= ", $attr_name=?"; - $data[].=$_POST[$attr_name]; - } - - $udquery .= " WHERE tid={$tokenid}"; - $udresult = $connect->Execute($udquery, $data) or safe_die ("Update record {$tokenid} failed:
        \n$udquery
        \n".$connect->ErrorMsg()); - $tokenoutput .= "\t\t
        ".$clang->gT("Success")."
        \n" - ."\t\t
        ".$clang->gT("The token entry was successfully updated.")."

        \n" - ."\t\t\n"; - } - else - { - $tokenoutput .= "\t\t
        ".$clang->gT("Failed")."
        \n" - ."\t\t
        ".$clang->gT("There is already an entry with that exact token in the table. The same token cannot be used in multiple entries.")."

        \n" - ."\t\t\n"; - } - $tokenoutput .= "\t
        "; - } - - if ($subaction == "inserttoken" && (bHasSurveyPermission($surveyid, 'tokens','create'))) - { - //Fix up dates and match to database format - if (trim($_POST['validfrom'])=='') { - $_POST['validfrom']=null; - } - else - { - $datetimeobj = new Date_Time_Converter(trim($_POST['validfrom']), $dateformatdetails['phpdate'].' H:i'); - $_POST['validfrom'] =$datetimeobj->convert('Y-m-d H:i:s'); - } - if (trim($_POST['validuntil'])=='') {$_POST['validuntil']=null;} - else - { - $datetimeobj = new Date_Time_Converter(trim($_POST['validuntil']), $dateformatdetails['phpdate'].' H:i'); - $_POST['validuntil'] =$datetimeobj->convert('Y-m-d H:i:s'); - } - - $santitizedtoken=sanitize_token($_POST['token']); - - $tokenoutput .= "\t
        ".$clang->gT("Add token entry")."
        \n" - ."\t
        \n"; - $data = array('firstname' => $_POST['firstname'], - 'lastname' => $_POST['lastname'], - 'email' => sanitize_email($_POST['email']), - 'emailstatus' => $_POST['emailstatus'], - 'token' => $santitizedtoken, - 'language' => sanitize_languagecode($_POST['language']), - 'sent' => $_POST['sent'], - 'remindersent' => $_POST['remindersent'], - 'completed' => $_POST['completed'], - 'usesleft' => $_POST['usesleft'], - 'validfrom' => $_POST['validfrom'], - 'validuntil' => $_POST['validuntil']); - // add attributes - $attrfieldnames=GetAttributeFieldnames($surveyid); - foreach ($attrfieldnames as $attr_name) - { - $data[$attr_name]=$_POST[$attr_name]; - } - $tblInsert=db_table_name('tokens_'.$surveyid); - $udresult = $connect->Execute("Select * from ".db_table_name("tokens_$surveyid")." where token<>'' and token='{$santitizedtoken}'"); - if ($udresult->RecordCount()==0) - { - // AutoExecute - $inresult = $connect->AutoExecute($tblInsert, $data, 'INSERT') or safe_die ("Add new record failed:
        \n$inquery
        \n".$connect->ErrorMsg()); - $tokenoutput .= "\t\t
        ".$clang->gT("Success")."
        \n" - ."\t\t
        ".$clang->gT("New token was added.")."

        \n" - ."\t\t
        \n" - ."\t\t
        \n"; - } - else - { - $tokenoutput .= "\t\t
        ".$clang->gT("Failed")."
        \n" - ."\t\t
        ".$clang->gT("There is already an entry with that exact token in the table. The same token cannot be used in multiple entries.")."

        \n" - ."\t\t
        \n" - ."\t\t
        \n"; - } - $tokenoutput .= "\t
        "; - } - - if ($subaction == "insertdummys" && (bHasSurveyPermission($surveyid, 'tokens','create'))) - { - //Fix up dates and match to database format - if (trim($_POST['validfrom'])=='') { - $_POST['validfrom']=null; - } - - else - { - $datetimeobj = new Date_Time_Converter(trim($_POST['validfrom']), $dateformatdetails['phpdate'].' H:i'); - $_POST['validfrom'] =$datetimeobj->convert('Y-m-d H:i:s'); - } - if (trim($_POST['validuntil'])=='') {$_POST['validuntil']=null;} - else - { - $datetimeobj = new Date_Time_Converter(trim($_POST['validuntil']), $dateformatdetails['phpdate'].' H:i'); - $_POST['validuntil'] =$datetimeobj->convert('Y-m-d H:i:s'); - } - - $santitizedtoken=''; - - $tokenoutput .= "\t
        ".$clang->gT("Add dummy tokens")."
        \n" - ."\t
        \n"; - $data = array('firstname' => $_POST['firstname'], - 'lastname' => $_POST['lastname'], - 'email' => sanitize_email($_POST['email']), - 'emailstatus' => 'OK', - 'token' => $santitizedtoken, - 'language' => sanitize_languagecode($_POST['language']), - 'sent' => 'N', - 'remindersent' => 'N', - 'completed' => 'N', - 'usesleft' => $_POST['usesleft'], - 'validfrom' => $_POST['validfrom'], - 'validuntil' => $_POST['validuntil']); - - // add attributes - $attrfieldnames=GetAttributeFieldnames($surveyid); - foreach ($attrfieldnames as $attr_name) - { - $data[$attr_name]=$_POST[$attr_name]; - } - $tblInsert=db_table_name('tokens_'.$surveyid); - $amount = sanitize_int($_POST['amount']); - $tokenlength = sanitize_int($_POST['tokenlen']); - $invalidtokencount=0; - $newdummytoken = 0; - // select all existing tokens - $ntquery = "SELECT token FROM ".db_table_name("tokens_$surveyid")." group by token"; - $ntresult = db_execute_assoc($ntquery); - $existingtokens=array(); - while ($tkrow = $ntresult->FetchRow()) - { - $existingtokens[$tkrow['token']]=true; - } - $tblInsert=db_table_name('tokens_'.$surveyid); - $amount = sanitize_int($_POST['amount']); - $tokenlength = sanitize_int($_POST['tokenlen']); - $invalidtokencount=0; - $newdummytoken = 0; - while ($newdummytoken<$amount && $invalidtokencount<50){ - $dataToInsert = $data; - $dataToInsert['firstname'] = str_replace('{TOKEN_COUNTER}',"$newdummytoken",$dataToInsert['firstname']); - $dataToInsert['lastname'] = str_replace('{TOKEN_COUNTER}',"$newdummytoken",$dataToInsert['lastname']); - $dataToInsert['email'] = str_replace('{TOKEN_COUNTER}',"$newdummytoken",$dataToInsert['email']); - $isvalidtoken = false; - $invalidtokencount=0; - while ($isvalidtoken == false && $invalidtokencount<50) - { - $newtoken = sRandomChars($tokenlength); - if (!isset($existingtokens[$newtoken])) { - $isvalidtoken = true; - $existingtokens[$newtoken]=true; - $invalidtokencount=0; - } - else - { - $invalidtokencount ++; - } - } - if(!$invalidtokencount){ - $dataToInsert['token'] = $newtoken; - $tblInsert=db_table_name('tokens_'.$surveyid); - $inresult = $connect->AutoExecute($tblInsert, $dataToInsert, 'INSERT') or safe_die ("Add new record failed:
        \n$inquery
        \n".$connect->ErrorMsg()); - $newdummytoken++; - } - } - if(!$invalidtokencount) - { - $tokenoutput .= "\t\t
        ".$clang->gT("Success")."
        \n" - ."\t\t
        ".$clang->gT("New dummy tokens were added.")."

        \n" - ."\t\t
        \n"; - $tokenoutput .= "\t
        "; - } - else - { - $tokenoutput .= "\t\t
        ".$clang->gT("Error")."
        \n" - ."\t\t

        ".sprintf($clang->gT("Only %s new dummy tokens were added after %s trials."),$newdummytoken,$invalidtokencount)."\n" - ."\t\t".$clang->gT("Try with a bigger token length.")."

        \n" - ."\t\t
        \n"; - $tokenoutput .= "\t"; - } - } - - if ($subaction == "import" && bHasSurveyPermission($surveyid, 'tokens','import')) - { - $tokenoutput .= "\t
        ".$clang->gT("Upload CSV File")."
        \n"; - form_csv_upload(); - $tokenoutput .= "
        \n" - ."
        ".$clang->gT("CSV input format")."
        \n" - ."

        ".$clang->gT("File should be a standard CSV (comma delimited) file with optional double quotes around values (default for OpenOffice and Excel). The first line must contain the field names. The fields can be in any order.").'

        '.$clang->gT("Mandatory fields:")." firstname,lastname,email
        " - .''.$clang->gT('Optional fields:')." emailstatus, token, language, validfrom, validuntil, attribute_1, attribute_2, attribute_3, usesleft, ... ." - ."
        \n"; - } - - if ($subaction == "importldap" && bHasSurveyPermission($surveyid, 'tokens','import')) - { - $tokenoutput .= "\t
        ".$clang->gT("Upload LDAP entries")."
        \n"; - formldap(); - $tokenoutput .= "
        \n" - ."\t
        ".$clang->gT("Note:")."

        \n" - .$clang->gT("LDAP queries are defined by the administrator in the config-ldap.php file")."\n" - ."
        \n"; - } - - if ($subaction == "upload" && bHasSurveyPermission($surveyid, 'tokens','import')) - { - $attrfieldnames=GetAttributeFieldnames($surveyid); - $duplicatelist=array(); - $invalidemaillist=array(); - $invalidformatlist=array(); - $tokenoutput .= "\t
        ".$clang->gT("Token file upload")."
        \n" - ."\t
        \n"; - if (!isset($tempdir)) - { - $the_path = $homedir; - } - else - { - $the_path = $tempdir; - } - $the_file_name = $_FILES['the_file']['name']; - $the_file = $_FILES['the_file']['tmp_name']; - $the_full_file_path = $the_path."/".$the_file_name; - if (!@move_uploaded_file($the_file, $the_full_file_path)) - { - $errormessage="
        ".$clang->gT("Error")."

        ".$clang->gT("Upload file not found. Check your permissions and path ({$the_full_file_path}) for the upload directory")."

        \n"; - form_csv_upload($errormessage); - } - else - { - $tokenoutput .= "
        ".$clang->gT("Uploaded CSV file successfully")."

        \n"; - $xz = 0; $recordcount = 0; $xv = 0; - // This allows to read file with MAC line endings too - @ini_set('auto_detect_line_endings', true); - // open it and trim the ednings - $tokenlistarray = file($the_full_file_path); - $baselanguage=GetBaseLanguageFromSurveyID($surveyid); - if (!isset($tokenlistarray)) - { - $tokenoutput .= "
        ".$clang->gT("Failed to open the uploaded file!")."

        \n"; - } - if (!isset($_POST['filterduplicatefields']) || (isset($_POST['filterduplicatefields']) && count($_POST['filterduplicatefields'])==0)) - { - $filterduplicatefields=array('firstname','lastname','email'); - } else { - $filterduplicatefields=$_POST['filterduplicatefields']; - } - $separator = returnglobal('separator'); - foreach ($tokenlistarray as $buffer) - { - $buffer=@mb_convert_encoding($buffer,"UTF-8",$uploadcharset); - $firstname = ""; $lastname = ""; $email = ""; $emailstatus="OK"; $token = ""; $language=""; $attribute1=""; $attribute2=""; //Clear out values from the last path, in case the next line is missing a value - if ($recordcount==0) - { - // Pick apart the first line - $buffer=removeBOM($buffer); - $allowedfieldnames=array('firstname','lastname','email','emailstatus','token','language', 'validfrom', 'validuntil', 'usesleft'); - $allowedfieldnames=array_merge($attrfieldnames,$allowedfieldnames); - - switch ($separator) { - case 'comma': - $separator = ','; - break; - case 'semicolon': - $separator = ';'; - break; - default: - $comma = substr_count($buffer,','); - $semicolon = substr_count($buffer,';'); - if ($semicolon>$comma) $separator = ';'; else $separator = ','; - } - $firstline = convertCSVRowToArray($buffer,$separator,'"'); - $firstline=array_map('trim',$firstline); - $ignoredcolumns=array(); - //now check the first line for invalid fields - foreach ($firstline as $index=>$fieldname) - { - $firstline[$index] = preg_replace("/(.*) <[^,]*>$/","$1",$fieldname); - $fieldname = $firstline[$index]; - if (!in_array($fieldname,$allowedfieldnames)) - { - $ignoredcolumns[]=$fieldname; - } - } - if (!in_array('firstname',$firstline) || !in_array('lastname',$firstline) || !in_array('email',$firstline)) - { - $tokenoutput .= "
        ".$clang->gT("Error: Your uploaded file is missing one or more of the mandatory columns: 'firstname', 'lastname' or 'email'")."

        "; - $recordcount=count($tokenlistarray); - break; - } - - } - else - { - - $line = convertCSVRowToArray($buffer,$separator,'"'); - - if (count($firstline)!=count($line)) - { - $invalidformatlist[]=$recordcount; - $recordcount++; - continue; - } - $writearray=array_combine($firstline,$line); - - //kick out ignored columns - foreach ($ignoredcolumns as $column) - { - unset($writearray[$column]); - } - $dupfound=false; - $invalidemail=false; - - if ($filterduplicatetoken!=false) - { - $dupquery = "SELECT tid from ".db_table_name("tokens_$surveyid")." where 1=1"; - foreach($filterduplicatefields as $field) - { - if (isset($writearray[$field])) { - $dupquery.=' and '.db_quote_id($field).' = '.db_quoteall($writearray[$field]); - } - } - $dupresult = $connect->Execute($dupquery) or safe_die ("Invalid field in duplicate check
        $dupquery

        ".$connect->ErrorMsg()); - if ( $dupresult->RecordCount() > 0) - { - $dupfound = true; - $duplicatelist[]=$writearray['firstname']." ".$writearray['lastname']." (".$writearray['email'].")"; - } - } - - - $writearray['email'] = trim($writearray['email']); - - //treat blank emails - if ($filterblankemail && $writearray['email']=='') - { - $invalidemail=true; - $invalidemaillist[]=$line[0]." ".$line[1]." ( )"; - } - if ($writearray['email']!='') - { - $aEmailAddresses=explode(';',$writearray['email']); - foreach ($aEmailAddresses as $sEmailaddress) - { - if (!validate_email($sEmailaddress)) - { - $invalidemail=true; - $invalidemaillist[]=$line[0]." ".$line[1]." (".$line[2].")"; - } - } - } - - if (!isset($writearray['token'])) { - $writearray['token'] = ''; - } else { - $writearray['token']=sanitize_token($writearray['token']); - } - - if (!$dupfound && !$invalidemail) - { - if (!isset($writearray['emailstatus']) || $writearray['emailstatus']=='') $writearray['emailstatus'] = "OK"; - if (!isset($writearray['usesleft']) || $writearray['usesleft']=='') $writearray['usesleft'] = 1; - if (!isset($writearray['language']) || $writearray['language'] == "") $writearray['language'] = $baselanguage; - if (isset($writearray['validfrom']) && trim($writearray['validfrom']=='')){ unset($writearray['validfrom']);} - if (isset($writearray['validuntil']) && trim($writearray['validuntil']=='')){ unset($writearray['validuntil']);} - - // sanitize it before writing into table - $sanitizedArray = array_map('db_quote',array_values($writearray)); - - $iq = "INSERT INTO ".db_table_name("tokens_$surveyid")." \n" - . "(".implode(',',array_keys($writearray)).") \n" - . "VALUES ('".implode("','",$sanitizedArray)."')"; - $ir = $connect->Execute($iq); - - if (!$ir) - { - $duplicatelist[]=$writearray['firstname']." ".$writearray['lastname']." (".$writearray['email'].")"; - } else { - $xz++; - } - } - $xv++; - } - $recordcount++; - } - $recordcount = $recordcount-1; - if ($xz != 0) - { - $tokenoutput .= "
        ".$clang->gT("Successfully created token entries")."

        \n"; - } else { - $tokenoutput .= "
        ".$clang->gT("Failed to create token entries")."
        \n"; - } - $message = '
        • '.sprintf($clang->gT("%s records in CSV"),$recordcount)."
        • \n"; - $message .= '
        • '.sprintf($clang->gT("%s records met minumum requirements"),$xv)."
        • \n"; - $message .= '
        • '.sprintf($clang->gT("%s records imported"),$xz)."
        \n"; - - - if (count($duplicatelist)>0 || count($invalidformatlist)>0 || count($invalidemaillist)>0) - { - - $message .="
        ".$clang->gT('Warnings')."
          "; - if (count($duplicatelist)>0) - { - $message .= '
        • '.sprintf($clang->gT("%s duplicate records removed"),count($duplicatelist)); - $message .= " [".$clang->gT("List")."]"; - $message .= ""; - $message .= "
        • \n"; - } - - if (count($invalidformatlist)>0) - { - $message .= '
        • '.sprintf($clang->gT("%s lines had a mismatching number of fields."),count($invalidformatlist)); - $message .= " [".$clang->gT("List")."]"; - $message .= ""; - $message .= "
          \n"; - $message .= sprintf($clang->gT("%s records with invalid email address removed"),$invalidemailcount); - $message .= " [".$clang->gT("List")."]"; - $message .= "
        • $data
        • \n"; - } - $message .= "
        "; - $message .= "
        \n"; - $tokenoutput .= "$message
        \n"; - } - else { - $errormessage="".$clang->gT("Error").": ".$clang->gT("Can't bind to the LDAP directory")."\n"; - formldap($errormessage); - } - @ldap_close($ds); - } - else { - $errormessage="".$clang->gT("Error").": ".$clang->gT("Can't connect to the LDAP directory")."\n"; - formldap($errormessage); - } - } - - // Now for the function - function form_csv_upload($error=false) - { - global $surveyid, $tokenoutput,$scriptname, $clang, $encodingsarray; - - if ($error) {$tokenoutput .= $error . "

        \n";} - asort($encodingsarray); - $charsetsout=''; - foreach ($encodingsarray as $charset=>$title) - { - $charsetsout.=""; - if ($separator == 'comma') $selected = " selected = 'selected'"; else $selected = ''; - $separatorout .= ""; - if ($separator == 'semicolon') $selected = " selected = 'selected'"; else $selected = ''; - $separatorout .= ""; - $tokenoutput .= "
          \n" - . "
        • \n" - . "
        • \n" - . "
        • \n" - . "
        • \n" - . "
        • " - . "
        • " - . " " - . "
        \n" - . "

        \n" - . "\n" - . "\n" - . "

        \n\n"; - } # END form - - function formldap($error=false) - { - global $surveyid, $tokenoutput, $ldap_queries, $clang, $scriptname; - - if ($error) {$tokenoutput .= $error . "

        \n";} - - if (!function_exists('ldap_connect')) - { - $tokenoutput .= '

        '; - $tokenoutput .= $clang->gT('Sorry, but the LDAP module is missing in your PHP configuration.'); - $tokenoutput .= '
        '; - } - - elseif (! isset($ldap_queries) || ! is_array($ldap_queries) || count($ldap_queries) == 0) { - $tokenoutput .= '
        '; - $tokenoutput .= $clang->gT('LDAP is disabled or no LDAP query defined.'); - $tokenoutput .= '


        '; - } - else { - $tokenoutput .= "

        "; - $tokenoutput .= '

        '; - $tokenoutput .= $clang->gT("Select the LDAP query you want to run:")."
        "; - $tokenoutput .= "
        "; - $tokenoutput .= '

        '; - $tokenoutput .= "

        \n" - . "

        \n"; - $tokenoutput .= ""; - $tokenoutput .= ""; - $tokenoutput .= "

        "; - $tokenoutput .= '
        '; - } - } - - function getLine($file) - { - $buffer=""; - // iterate over each character in line. - while (!feof($file)) - { - // append the character to the buffer. - $character = fgetc($file); - $buffer .= $character; - // check for end of line. - if (($character == "\n") or ($character == "\r")) - { - // checks if the next character is part of the line ending, as in - // the case of windows '\r\n' files, or not as in the case of - // mac classic '\r', and unix/os x '\n' files. - $character = fgetc($file); - if ($character == "\n") - { - // part of line ending, append to buffer. - $buffer .= $character; - } - else - { - // not part of line ending, roll back file pointer. - fseek($file, -1, SEEK_CUR); - } - // end of line, so stop reading. - break; - } - } - // return the line buffer. - return $buffer; - } - -?> diff --git a/include/limesurvey/admin/translate.php b/include/limesurvey/admin/translate.php deleted file mode 100644 index f7b19e0b..00000000 --- a/include/limesurvey/admin/translate.php +++ /dev/null @@ -1,278 +0,0 @@ -"; - $translateoutput .= showTranslateAdminmenu($surveyid, $survey_title, $tolang, $scriptname); - $translateoutput .= ""; - - $translateoutput .= "

         

        \n"; //CSS Firefox 2 transition fix - - $translateoutput .= "
        ".$clang->gT("Translate survey")."
        \n"; - -// $tab_names=array("title", "description", "welcome", "end", "group", "group_desc", "question", "question_help", "answer"); -// $tab_names=array("title", "description", "invitation", "reminder"); - $tab_names=array("title", "welcome", "group", "question", "subquestion", "answer", "emailinvite", "emailreminder", "emailconfirmation", "emailregistration"); - - - if ($tolang != "" && $actionvalue=="translateSave") - // Saves translated values to database - { - $tab_names_full = ""; - foreach($tab_names as $type) - { - $tab_names_full[] = $type; - $amTypeOptions = setupTranslateFields($surveyid, $type, $tolang, $baselang); - $type2 = $amTypeOptions["associated"]; - if ($type2 != "") - { - $tab_names_full[] = $type2; - } - } - foreach($tab_names_full as $type) - { - $size = 0; - if(isset($_POST["{$type}_size"])) - { - $size = $_POST["{$type}_size"]; - } - // start a loop in order to update each record - $i = 0; - while ($i < $size) - { - // define each variable - if (isset($_POST["{$type}_newvalue_{$i}"])) - { - $old = $_POST["{$type}_oldvalue_{$i}"]; - $new = $_POST["{$type}_newvalue_{$i}"]; - // check if the new value is different from old, and then update database - if ($new != $old) - { - $id1 = $_POST["{$type}_id1_{$i}"]; - $id2 = $_POST["{$type}_id2_{$i}"]; - $amTypeOptions = setupTranslateFields($surveyid, $type, $tolang, $baselang, $id1, $id2, $new); - $query = $amTypeOptions["queryupdate"]; - $connect->execute($query); - } - } - ++$i; - } // end while - } // end foreach - $actionvalue = ""; - } // end if - - - - if ($tolang != "") - // Display tabs with fields to translate, as well as input fields for translated values - { - - $sGoogleApiError = $clang->gT("There was an error using the Google API."); - $sDetailedError = $clang->gT("Detailed Error"); - - $translateoutput .= "

        ".$clang->gT("Loading translations")."...

        "; - - $translateoutput .= "
        \n" - ."\n" - ."\n" - ."\n" - ."\n" - ."\n" - ."\n"; - $translateoutput.=<< - sGoogleApiError = "$sGoogleApiError"; - sDetailedError = "$sDetailedError"; - -END; - // set up tabs - $translateoutput .= "" - ."
        \n" - ."\t
          \n"; - foreach($tab_names as $type) - { - $amTypeOptions = setupTranslateFields($surveyid, $type, $tolang, $baselang); - $translateoutput .= "" - ."\t\t
        • ".$amTypeOptions["description"]."
        • \n"; - } - $translateoutput .= "" - ."\t
        \n"; - - // Define content of each tab - foreach($tab_names as $type) - { - $amTypeOptions = setupTranslateFields($surveyid, $type, $tolang, $baselang); - - $type2 = $amTypeOptions["associated"]; - if ($type2 != "") - { - $associated = TRUE; - $amTypeOptions2 = setupTranslateFields($surveyid, $type2, $tolang, $baselang); - } - else - { - $associated = FALSE; - } - - // Create tab names and heading - $translateoutput .= "\t
        \n"; - $translateoutput .= PrepareEditorScript(); - // Setup form - // start a counter in order to number the input fields for each record - $i = 0; - $evenRow = FALSE; - $all_fields_empty = TRUE; - - $querybase = $amTypeOptions["querybase"]; - $resultbase = db_execute_assoc($querybase); - if ($associated) - { - $querybase2 = $amTypeOptions2["querybase"]; - $resultbase2 = db_execute_assoc($querybase2); - } - - $queryto = $amTypeOptions["queryto"]; - $resultto = db_execute_assoc($queryto); - if ($associated) - { - $queryto2 = $amTypeOptions2["queryto"]; - $resultto2 = db_execute_assoc($queryto2); - } - - $translateoutput .="
        \n"; - $translateoutput .=""; - $translateoutput .="\n"; - $translateoutput .= displayTranslateFieldsHeader($baselangdesc, $tolangdesc, $type); - while ($rowfrom = $resultbase->FetchRow()) - { - $textfrom = htmlspecialchars_decode($rowfrom[$amTypeOptions["dbColumn"]]); - - if ($associated) - { - $rowfrom2 = $resultbase2->FetchRow(); - $textfrom2 = htmlspecialchars_decode($rowfrom2[$amTypeOptions2["dbColumn"]]); - } - - $gid = NULL; - if($amTypeOptions["gid"]==TRUE) $gid = $rowfrom['gid']; - - $qid = NULL; - if($amTypeOptions["qid"]==TRUE) $qid = $rowfrom['qid']; - - $rowto = $resultto->FetchRow(); - $textto = $rowto[$amTypeOptions["dbColumn"]]; - - if ($associated) - { - $rowto2 = $resultto2->FetchRow(); - $textto2 = $rowto2[$amTypeOptions2["dbColumn"]]; - } - - if (strlen(trim((string)$textfrom)) > 0) - { - $all_fields_empty = FALSE; - $evenRow = !($evenRow); - // Display translation fields - $translateoutput .= displayTranslateFields($surveyid, $gid, $qid, $type, - $amTypeOptions, $baselangdesc, $tolangdesc, $textfrom, $textto, $i, $rowfrom, $evenRow); - if ($associated && strlen(trim((string)$textfrom2)) > 0) - { - $evenRow = !($evenRow); - $translateoutput .= displayTranslateFields($surveyid, $gid, $qid, $type2, - $amTypeOptions2, $baselangdesc, $tolangdesc, $textfrom2, $textto2, $i, $rowfrom2, $evenRow); - } - } - else - { - $translateoutput .= ""; - } - ++$i; - } // end while - $translateoutput .= displayTranslateFieldsFooter(); - $translateoutput .= "
        "; - if ($all_fields_empty) - { - $translateoutput .= "

        ".$clang->gT("Nothing to translate on this page")."


        "; - } - $translateoutput .= ""; - if ($associated) - { - $translateoutput .= ""; - } - $translateoutput .= "
        \n"; // tab-page - - } // end foreach - - // Submit button - $translateoutput .= "

        " - ."\n"; - - - $translateoutput .= "
        \n"; - $translateoutput .= "\n"; - } // end if - - - -?> \ No newline at end of file diff --git a/include/limesurvey/admin/translate_functions.php b/include/limesurvey/admin/translate_functions.php deleted file mode 100644 index 683d5446..00000000 --- a/include/limesurvey/admin/translate_functions.php +++ /dev/null @@ -1,857 +0,0 @@ -" - .""
-          .$jsMenuText."\n" - ."\n"; - return $menu; -} - -/** - * menuSeparator() creates a separator bar in the admin screen menus - * @global string $imageurl - * @return string - */ -function menuSeparator() -{ - global $imageurl; - return ("\n"); -} - -/** - * showTranslateAdminmenu() creates the main menu options for the survey translation page - * @param string $surveyid The survey ID - * @param string $survey_title - * @param string $tolang - * @param string $activated - * @param string $scriptname - * @global string $imageurl, $clang, $publicurl - * @return string - */ - function showTranslateAdminmenu($surveyid, $survey_title, $tolang, $scriptname) -{ - global $imageurl, $clang, $publicurl; - - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $supportedLanguages = getLanguageData(false); - $langs = GetAdditionalLanguagesFromSurveyID($surveyid); - - $adminmenu = "" - ."\n"; - - return($adminmenu); -} - - -/** - * setupTranslateFields() creates a customised array with database query - * information for use by survey translation - * @global $dbprefix, $clang; - * @param string $surveyid Survey id - * @param string $type Type of database field that is being translated, e.g. title, question, etc. - * @param string $baselang The source translation language code, e.g. "En" - * @param string $tolang The target translation language code, e.g. "De" - * @param string $new The new value of the translated string - * @param string $id1 An index variable used in the database select and update query - * @param string $id2 An index variable used in the database select and update query - * @return array - */ - -function setupTranslateFields($surveyid, $type, $tolang, $baselang, $id1="", $id2="", $new="") -{ - global $dbprefix, $clang; - - switch ( $type ) - { - case 'title': - $amTypeOptions = array( - "querybase" => "SELECT * " - ." FROM ".db_table_name('surveys_languagesettings') - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language=".db_quoteall($baselang,true), - "queryto" => "SELECT * " - ." FROM ".db_table_name('surveys_languagesettings') - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language=".db_quoteall($tolang,true), - "queryupdate" => "UPDATE ".db_table_name('surveys_languagesettings') - ." SET surveyls_title = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language=".db_quoteall($tolang,true), - "id1" => "", - "id2" => "", - "gid" => FALSE, - "qid" => FALSE, - "dbColumn" => 'surveyls_title', - "description" => $clang->gT("Survey title and description"), - "HTMLeditorType" => "title", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Inline", // Allowed values: Inline, Popup or None - "associated" => "description" - ); - break; - - case 'description': - $amTypeOptions = array( - "querybase" => "SELECT * " - ." FROM ".db_table_name('surveys_languagesettings') - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language='{$baselang}' ", - "queryto" => "SELECT * " - ." FROM ".db_table_name('surveys_languagesettings') - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language='{$tolang}' ", - "queryupdate" => "UPDATE ".db_table_name('surveys_languagesettings') - ." SET surveyls_description = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language='{$tolang}'", - "id1" => "", - "id2" => "", - "gid" => FALSE, - "qid" => FALSE, - "dbColumn" => 'surveyls_description', - "description" => $clang->gT("Description:"), - "HTMLeditorType" => "description", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Inline", // Allowed values: Inline, Popup or None - "associated" => "" - ); - break; - - case 'welcome': - $amTypeOptions = array( - "querybase" => "SELECT * " - ." FROM ".db_table_name('surveys_languagesettings') - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language='{$baselang}' ", - "queryto" => "SELECT * " - ." FROM ".db_table_name('surveys_languagesettings') - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language='{$tolang}' ", - "queryupdate" => "UPDATE ".db_table_name('surveys_languagesettings') - ." SET surveyls_welcometext = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ."AND surveyls_language='{$tolang}'", - "id1" => "", - "id2" => "", - "gid" => FALSE, - "qid" => FALSE, - "dbColumn" => 'surveyls_welcometext', - "description" => $clang->gT("Welcome and end text"), - "HTMLeditorType" => "welcome", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Inline", // Allowed values: Inline, Popup or None - "associated" => "end" - ); - break; - - case 'end': - $amTypeOptions = array( - "querybase" => "SELECT * " - ." FROM ".db_table_name('surveys_languagesettings') - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language='{$baselang}' ", - "queryto" => "SELECT * " - ."FROM ".db_table_name('surveys_languagesettings') - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language='{$tolang}' ", - "queryupdate" => "UPDATE ".db_table_name('surveys_languagesettings') - ." SET surveyls_endtext = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=".db_quoteall($surveyid,true) - ." AND surveyls_language='{$tolang}'", - "id1" => "", - "id2" => "", - "gid" => FALSE, - "qid" => FALSE, - "dbColumn" => 'surveyls_endtext', - "description" => $clang->gT("End message:"), - "HTMLeditorType" => "end", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Inline", // Allowed values: Inline, Popup or None - "associated" => "" - ); - break; - - case 'group': - $amTypeOptions = array( - "querybase" => "SELECT * " - ." FROM ".db_table_name('groups') - ." WHERE sid=".db_quoteall($surveyid,true) - ." AND language='{$baselang}' " - ." ORDER BY group_order ", - "queryto" => "SELECT * " - ."FROM ".db_table_name('groups') - ." WHERE sid=".db_quoteall($surveyid,true) - ." AND language=".db_quoteall($tolang,true) - ." ORDER BY group_order ", - "queryupdate" => "UPDATE ".db_table_name('groups') - ." SET group_name = ".db_quoteall($new,true) - ." WHERE gid = '{$id1}' " - ." AND sid=".db_quoteall($surveyid,true) - ." AND language='{$tolang}'", - "id1" => "gid", - "id2" => "", - "gid" => TRUE, - "qid" => FALSE, - "dbColumn" => "group_name", - "description" => $clang->gT("Question groups"), - "HTMLeditorType" => "group", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Popup", // Allowed values: Inline, Popup or None - "associated" => "group_desc" - ); - break; - - case 'group_desc': - $amTypeOptions = array( - "querybase" => "SELECT * " - ." FROM ".db_table_name('groups') - ." WHERE sid=".db_quoteall($surveyid,true) - ." AND language='{$baselang}' " - ."ORDER BY group_order ", - "queryto" => "SELECT *" - ." FROM ".db_table_name('groups') - ." WHERE sid=".db_quoteall($surveyid,true) - ."AND language=".db_quoteall($tolang,true) - ."ORDER BY group_order ", - "queryupdate" => "UPDATE ".db_table_name('groups') - ."SET description = ".db_quoteall($new,true) - ."WHERE gid = '{$id1}' " - ."AND sid=".db_quoteall($surveyid,true) - ."AND language='{$tolang}'", - "id1" => "gid", - "id2" => "", - "gid" => TRUE, - "qid" => FALSE, - "dbColumn" => "description", - "description" => $clang->gT("Group description"), - "HTMLeditorType" => "group_desc", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Popup", // Allowed values: Inline, Popup or None - "associated" => "" - ); - break; - - case 'question': - $amTypeOptions = array( - "querybase" => "SELECT q.qid as questionid, q.title, q.question, q.qid, q.gid " - ." FROM ".db_table_name('questions')." q " - ." JOIN ".db_table_name('groups')." g ON g.gid=q.gid " - ." WHERE q.sid=".db_quoteall($surveyid,true) - ." AND q.language='{$baselang}' " - ." AND g.language='{$baselang}' " - ." AND q.parent_qid=0 " - ." ORDER BY g.group_order,q.question_order, q.scale_id ", - "queryto" => "SELECT q.qid as questionid, q.title, q.question, q.qid, q.gid " - ." FROM ".db_table_name('questions')." q " - ." JOIN ".db_table_name('groups')." g ON g.gid=q.gid " - ." WHERE q.sid=".db_quoteall($surveyid,true) - ." AND q.language='{$tolang}' " - ." AND g.language='{$tolang}' " - ." AND q.parent_qid=0 " - ." ORDER BY g.group_order,q.question_order, q.scale_id ", - "queryupdate" => "UPDATE ".db_table_name('questions') - ." SET question = ".db_quoteall($new,true) - ." WHERE qid = '{$id1}' " - ." AND sid=".db_quoteall($surveyid,true) - ." AND parent_qid=0 " - ." AND language='{$tolang}'", - "dbColumn" => 'question', - "id1" => 'qid', - "id2" => "", - "gid" => TRUE, - "qid" => TRUE, - "description" => $clang->gT("Questions"), - "HTMLeditorType" => "question", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Popup", // Allowed values: Inline, Popup or "" - "associated" => "question_help" - ); - break; - - case 'question_help': - $amTypeOptions = array( - "querybase" => "SELECT q.qid as questionid, q.help, q.qid, q.title " - ." FROM ".db_table_name('questions')." q " - ." JOIN ".db_table_name('groups')." g ON g.gid=q.gid " - ." WHERE g.sid=".db_quoteall($surveyid,true) - ." AND q.language='{$baselang}' " - ." AND g.language='{$baselang}' " - ." AND parent_qid=0 " - ." ORDER BY g.group_order,q.question_order ", - "queryto" => "SELECT q.qid as questionid, q.help, q.qid, q.title " - ." FROM ".db_table_name('questions')." q " - ." JOIN ".db_table_name('groups')." g ON g.gid=q.gid " - ." WHERE g.sid=".db_quoteall($surveyid,true) - ." AND q.language='{$tolang}' " - ." AND g.language='{$tolang}' " - ." AND parent_qid=0 " - ." ORDER BY g.group_order,q.question_order ", - "queryupdate" => "UPDATE ".db_table_name('questions') - ." SET help = ".db_quoteall($new,true) - ." WHERE qid = '{$id1}' " - ." AND sid=".db_quoteall($surveyid,true) - ." AND parent_qid=0 " - ." AND language='{$tolang}'", - "dbColumn" => 'help', - "id1" => 'qid', - "id2" => "", - "gid" => TRUE, - "qid" => TRUE, - "description" => "", - "HTMLeditorType" => "question_help", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Popup", // Allowed values: Inline, Popup or "" - "associated" => "" - ); - break; - - case 'subquestion': - $amTypeOptions = array( - "querybase" => "SELECT q.qid as questionid, q.title, sq.qid, sq.question, sq.gid " - ." FROM ".db_table_name('questions')." sq " - ." JOIN ".db_table_name('questions')." q ON sq.parent_qid=q.qid " - ." JOIN ".db_table_name('groups')." g ON g.gid=q.gid " - ." WHERE sq.sid=".db_quoteall($surveyid,true) - ." AND sq.language='{$baselang}' AND q.language='{$baselang}' AND g.language='{$baselang}' AND sq.parent_qid>0 " - ." ORDER BY g.group_order, q.question_order,q.scale_id, sq.scale_id, sq.question_order ", - "queryto" => "SELECT sq.question " - ." FROM ".db_table_name('questions')." sq " - ." JOIN ".db_table_name('questions')." q ON sq.parent_qid=q.qid " - ." JOIN ".db_table_name('groups')." g ON g.gid=q.gid " - ." WHERE sq.sid=".db_quoteall($surveyid,true) - ." AND sq.language=".db_quoteall($tolang,true)." AND q.language=".db_quoteall($tolang,true)." AND g.language=".db_quoteall($tolang,true)." AND sq.parent_qid>0 " - ." ORDER BY g.group_order, q.question_order,q.scale_id, sq.scale_id, sq.question_order ", - "queryupdate" => "UPDATE ".db_table_name('questions') - ." SET question = ".db_quoteall($new,true) - ." WHERE qid = '{$id1}' " - ." AND sid=".db_quoteall($surveyid,true) - ." AND language='{$tolang}'", - "dbColumn" => 'question', - "id1" => 'qid', - "id2" => "", - "gid" => TRUE, - "qid" => TRUE, - "description" => $clang->gT("Subquestions"), - "HTMLeditorType" => "question", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Popup", // Allowed values: Inline, Popup or None - "associated" => "" - ); - break; - - case 'answer': - $amTypeOptions = array( - "querybase" => "SELECT q.qid as questionid, a.code, a.answer, q.qid, q.title " - ." FROM ".db_table_name('answers')." a " - ." JOIN ".db_table_name('questions')." q ON a.qid=q.qid " - ." JOIN ".db_table_name('groups')." g ON g.gid=q.gid " - ." WHERE q.sid ='{$surveyid}' " - ." AND q.qid = q.qid " - ." AND a.language = '{$baselang}'" - ." AND q.language = '{$baselang}'" - ." AND g.language = '{$baselang}'" - ." ORDER BY g.group_order, q.question_order, a.scale_id, a.sortorder", - "queryto" => "SELECT a.code, a.answer, q.qid, q.title " - ." FROM ".db_table_name('answers')." a " - ." JOIN ".db_table_name('questions')." q ON a.qid=q.qid " - ." JOIN ".db_table_name('groups')." g ON g.gid=q.gid " - ." WHERE q.sid ='{$surveyid}' " - ." AND q.qid = q.qid " - ." AND a.language = ".db_quoteall($tolang,true) - ." AND q.language = ".db_quoteall($tolang,true) - ." AND g.language = ".db_quoteall($tolang,true) - ." ORDER BY g.group_order, q.question_order, a.sortorder, a.scale_id", - "queryupdate" => "UPDATE ".db_table_name('answers') - ." SET answer = ".db_quoteall($new,true) - ." WHERE qid = '{$id1}' " - ." AND code='{$id2}' " - ." AND language='{$tolang}'", - "dbColumn" => 'answer', - "id1" => 'qid', - "id2" => 'code', - "gid" => FALSE, - "qid" => TRUE, - "description" => $clang->gT("Answer options"), - "HTMLeditorType" => "subquestion", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "Popup", // Allowed values: Inline, Popup or None - "associated" => "" - ); - break; - - case 'emailinvite': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_invite_subj = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_invite_subj', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => $clang->gT("Invitation email"), - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "emailinvitebody" - ); - break; - - case 'emailinvitebody': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_invite = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_invite', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => "", - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "" - ); - break; - - case 'emailreminder': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_remind_subj = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_remind_subj', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => $clang->gT("Reminder email"), - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "emailreminderbody" - ); - break; - - case 'emailreminderbody': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_remind = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_remind', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => "", - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "" - ); - break; - - case 'emailconfirmation': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_confirm_subj = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_confirm_subj', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => $clang->gT("Confirmation email"), - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "emailconfirmationbody" - ); - break; - - case 'emailconfirmationbody': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_confirm = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_confirm', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => "", - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "" - ); - break; - - case 'emailregistration': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_register_subj = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_register_subj', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => $clang->gT("Registration email"), - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "emailregistrationbody" - ); - break; - - case 'emailregistrationbody': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_register = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_register', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => "", - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "" - ); - break; - - case 'email_confirm': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_confirm_subj = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_confirm_subj', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => $clang->gT("Confirmation email"), - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "email_confirmbody" - ); - break; - - case 'email_confirmbody': - $amTypeOptions = array( - "querybase" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$baselang'" , - "queryto" => "SELECT * FROM ".db_table_name("surveys_languagesettings") - ." WHERE surveyls_survey_id=$surveyid and surveyls_language='$tolang'" , - "queryupdate" => "UPDATE ".db_table_name("surveys_languagesettings") - ." SET surveyls_email_confirm = ".db_quoteall($new,true) - ." WHERE surveyls_survey_id=$surveyid " - ." AND surveyls_language='$tolang'", - "dbColumn" => 'surveyls_email_confirm', - "id1" => '', - "id2" => '', - "gid" => FALSE, - "qid" => FALSE, - "description" => "", - "HTMLeditorType" => "email", // This value is passed to HTML editor and determines LimeReplacementFields - "HTMLeditorDisplay" => "", // Allowed values: Inline, Popup or "" - "associated" => "" - ); - break; - - } - return($amTypeOptions); -} - - -/** - * displayTranslateFieldsHeader() Formats and displays header of translation fields table - * @param string $baselangdesc The source translation language, e.g. "English" - * @param string $tolangdesc The target translation language, e.g. "German" - * @param string $type The target translation language, e.g. "German" - * @return string $translateoutput - */ - function displayTranslateFieldsHeader($baselangdesc, $tolangdesc, $type) -{ - global $clang; - $translateoutput = ''; - if ($type=='question' || $type=='subquestion' || $type=='question_help' || $type=='answer') - { - $translateoutput.=''; - } - $translateoutput.='' - . '' - . "\n"; - if ($type=='question' || $type=='subquestion' || $type=='question_help' || $type=='answer') - { - $translateoutput.="\n"; - } - $translateoutput.="\n" - . "\n" - . "\n"; - return($translateoutput); -} - - -/** - * displayTranslateFieldsFooter() Formats and displays footer of translation fields table - * @return string $translateoutput - */ -function displayTranslateFieldsFooter() -{ - $translateoutput = "" - . "
        {$clang->gT('Question code / ID')}{$baselangdesc}{$tolangdesc}
        \n"; - return($translateoutput); -} - - -/** - * displayTranslateFields() Formats and displays translation fields (base language as well as to language) - * @global $dbprefix, $clang; - * @param string $surveyid Survey id - * @param string $gid Group id - * @param string $qid Question id - * @param string $type Type of database field that is being translated, e.g. title, question, etc. - * @param array $amTypeOptions Array containing options associated with each $type - * @param string $baselangdesc The source translation language, e.g. "English" - * @param string $tolangdesc The target translation language, e.g. "German" - * @param string $textfrom The text to be translated in source language - * @param string $textto The text to be translated in target language - * @param integer $i Counter - * @param string $rowfrom Contains current row of database query - * @param boolean $evenRow True for even rows, false for odd rows - * @return string $translateoutput - */ - -function displayTranslateFields($surveyid, $gid, $qid, $type, $amTypeOptions, - $baselangdesc, $tolangdesc, $textfrom, $textto, $i, $rowfrom, $evenRow) - -{ - $translateoutput = ""; - if ($evenRow) - { - $translateoutput .= ""; - } - else - { - $translateoutput .= ""; - } - $value1 = ""; - if ($amTypeOptions["id1"] != "") $value1 = $rowfrom[$amTypeOptions["id1"]]; - $value2 = ""; - if ($amTypeOptions["id2"] != "") $value2 = $rowfrom[$amTypeOptions["id2"]]; - - - // Display text in original language - // Display text in foreign language. Save a copy in type_oldvalue_i to identify changes before db update - if ($type=='question' || $type=='subquestion' || $type=='question_help' || $type=='answer') - { - $translateoutput .= "" - . "".htmlspecialchars($rowfrom['title'])." ({$rowfrom['questionid']})\n"; - } - - $translateoutput .= "$textfrom\n" - . "\n"; - $translateoutput .= "\n"; - $translateoutput .= "\n"; - $nrows = max(calc_nrows($textfrom), calc_nrows($textto)); - $translateoutput .= "\n"; - $translateoutput .= "\n"; - - if ($amTypeOptions["HTMLeditorDisplay"]=="Inline") - { - $translateoutput .= "" - .getEditor("edit".$type , $type."_newvalue_".$i, htmlspecialchars($textto), $surveyid, $gid, $qid, "translate".$amTypeOptions["HTMLeditorType"]); - } - if ($amTypeOptions["HTMLeditorDisplay"]=="Popup") - { - $translateoutput .= "" - .getPopupEditor("edit".$type , $type."_newvalue_".$i, urlencode($amTypeOptions['description']), $surveyid, $gid, $qid, "translate".$amTypeOptions["HTMLeditorType"]); - } - $translateoutput .= "\n\n" - . "\n"; - return($translateoutput); -} - -/** - * calc_nrows($subject) calculates the vertical size of textbox for survey translation. - * The function adds the number of line breaks
        to the number of times a string wrap occurs. - * @param string $subject The text string that is being translated - * @return integer - */ -function calc_nrows( $subject ) -{ - // Determines the size of the text box - // A proxy for box sixe is string length divided by 80 - $pattern = "()"; - //$pattern = "/\n/"; - $pattern = '[()|(/\n/)]'; - $nrows_newline = preg_match_all($pattern, $subject, $matches); - - $nrows_char = ceil(strlen((string)$subject)/80); - - return $nrows_newline + $nrows_char; -} - - -?> diff --git a/include/limesurvey/admin/translate_google_api.php b/include/limesurvey/admin/translate_google_api.php deleted file mode 100644 index bafc8df4..00000000 --- a/include/limesurvey/admin/translate_google_api.php +++ /dev/null @@ -1,64 +0,0 @@ -$sProcedure($part[0]); - $convertedPart = str_replace("
        ","\r\n",$convertedPart); - $convertedPart = html_entity_decode(stripcslashes($convertedPart)); - $sparts[] = $convertedPart; - } - } - $sConverted = implode(' ', $sparts); - - $aOutput = array( - 'error' => false, - 'baselang' => $sBaselang, - 'tolang' => $sTolang, - 'converted' => $sConverted - ); - -} catch (GTranslateException $ge){ - - // Get the error message and build the ouput array - $sError = $ge->getMessage(); - $aOutput = array( - 'error' => true, - 'baselang' => $sBaselang, - 'tolang' => $sTolang, - 'error' => $sError - ); - -} - -$ajaxoutput = ls_json_encode($aOutput). "\n"; diff --git a/include/limesurvey/admin/usercontrol.php b/include/limesurvey/admin/usercontrol.php deleted file mode 100644 index b3a716df..00000000 --- a/include/limesurvey/admin/usercontrol.php +++ /dev/null @@ -1,907 +0,0 @@ -".$clang->gT("Forgot password")."
        \n"; - - if (isset($postuser) && isset($postemail)) - { - include("database.php"); - $emailaddr = $postemail; - $query = "SELECT users_name, password, uid FROM ".db_table_name('users')." WHERE users_name=".$connect->qstr($postuser)." AND email=".$connect->qstr($emailaddr); - $result = db_select_limit_assoc($query, 1) or safe_die ($query."
        ".$connect->ErrorMsg()); // Checked - - if ($result->RecordCount() < 1) - { - // wrong or unknown username and/or email - $loginsummary .= "
        ".$clang->gT("User name and/or email not found!")."
        "; - $loginsummary .= "

        ".$clang->gT("Continue")."
         \n"; - } - else - { - $fields = $result->FetchRow(); - - // send Mail - $new_pass = createPassword(); - $body = sprintf($clang->gT("Your user data for accessing %s"),$sitename). "
        \n";; - $body .= $clang->gT("Username") . ": " . $fields['users_name'] . "
        \n"; - $body .= $clang->gT("New password") . ": " . $new_pass . "
        \n"; - - $subject = $clang->gT("User data","unescaped"); - $to = $emailaddr; - $from = $siteadminemail; - - - if(SendEmailMessage(null, $body, $subject, $to, $from, $sitename, false,$siteadminbounce)) - { - $query = "UPDATE ".db_table_name('users')." SET password='".SHA256::hashing($new_pass)."' WHERE uid={$fields['uid']}"; - $connect->Execute($query); //Checked - $loginsummary .= "
        ".$clang->gT("Username").": {$fields['users_name']}
        ".$clang->gT("Email").": {$emailaddr}
        "; - $loginsummary .= "
        ".$clang->gT("An email with your login data was sent to you."); - $loginsummary .= "

        ".$clang->gT("Continue")."
         \n"; - } - else - { - $tmp = str_replace("{NAME}", "".$fields['users_name']."", $clang->gT("Email to {NAME} ({EMAIL}) failed.")); - $loginsummary .= "
        ".str_replace("{EMAIL}", $emailaddr, $tmp) . "
        "; - $loginsummary .= "

        ".$clang->gT("Continue")."
         \n"; - } - } - } - } - elseif($action == "login" && $useWebserverAuth === false) // normal login - { - $loginsummary = ''; - - if (isset($postuser) && isset($_POST['password'])) - { - include("database.php"); - - $sIp = getIPAddress(); - $query = "SELECT * FROM ".db_table_name('failed_login_attempts'). " WHERE ip='$sIp';"; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $result = $connect->query($query); - $bLoginAttempted = false; - $bCannotLogin = false; - - $intNthAttempt = 0; - if ($result!==false && $result->RecordCount() >= 1) - { - $bLoginAttempted = true; - $field = $result->FetchRow(); - $intNthAttempt = $field['number_attempts']; - if ($intNthAttempt>=$maxLoginAttempt){ - $bCannotLogin = true; - } - - $iLastAttempt = strtotime($field['last_attempt']); - - if (time() > $iLastAttempt + $timeOutTime){ - $bCannotLogin = false; - $query = "DELETE FROM ".db_table_name('failed_login_attempts'). " WHERE ip='$sIp';"; - $result = $connect->query($query) or safe_die ($query."
        ".$connect->ErrorMsg()); - - } - - } - if(!$bCannotLogin){ - $query = "SELECT * FROM ".db_table_name('users')." WHERE users_name=".$connect->qstr($postuser); - - $result = $connect->SelectLimit($query, 1) or safe_die ($query."
        ".$connect->ErrorMsg()); - if ($result->RecordCount() < 1) - { - $query = fGetLoginAttemptUpdateQry($bLoginAttempted,$sIp); - - $result = $connect->Execute($query) or safe_die ($query."
        ".$connect->ErrorMsg());; - if ($result) - { - // wrong or unknown username - $loginsummary .= "

        ".$clang->gT("Incorrect username and/or password!")."


        "; - if ($intNthAttempt+1>=$maxLoginAttempt) - $loginsummary .= sprintf($clang->gT("You have exceeded you maximum login attempts. Please wait %d minutes before trying again"),($timeOutTime/60))."
        "; - $loginsummary .= "
        ".$clang->gT("Continue")."
         \n"; - } - - - } - else - { - $fields = $result->FetchRow(); - if (SHA256::hashing($_POST['password']) == $fields['password']) - { - // Anmeldung ERFOLGREICH - if (strtolower($_POST['password'])=='password') - { - $_SESSION['pw_notify']=true; - $_SESSION['flashmessage']=$clang->gT("Warning: You are still using the default password ('password'). Please change your password and re-login again."); - } - else - { - $_SESSION['pw_notify']=false; - } // Check if the user has changed his default password - - if ($sessionhandler=='db') - { - adodb_session_regenerate_id(); - } - else - { - session_regenerate_id(); - - } - $_SESSION['loginID'] = intval($fields['uid']); - $_SESSION['user'] = $fields['users_name']; - $_SESSION['full_name'] = $fields['full_name']; - $_SESSION['htmleditormode'] = $fields['htmleditormode']; - $_SESSION['questionselectormode'] = $fields['questionselectormode']; - $_SESSION['templateeditormode'] = $fields['templateeditormode']; - $_SESSION['dateformat'] = $fields['dateformat']; - // Compute a checksession random number to test POSTs - $_SESSION['checksessionpost'] = sRandomChars(10); - if (isset($postloginlang) && $postloginlang!='default') - { - $_SESSION['adminlang'] = $postloginlang; - $clang = new limesurvey_lang($postloginlang); - $uquery = "UPDATE {$dbprefix}users " - . "SET lang='{$postloginlang}' " - . "WHERE uid={$_SESSION['loginID']}"; - $uresult = $connect->Execute($uquery); // Checked - } - else - { - - if ( $fields['lang']=='auto' && isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) ) - { - $browlang=strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ); - $browlang=str_replace(' ', '', $browlang); - $browlang=explode( ",", $browlang); - $browlang=$browlang[0]; - $browlang=explode( ";", $browlang); - $browlang=$browlang[0]; - $check=0; - $value=26; - if ($browlang!="zh-hk" && $browlang!="zh-tw" && $browlang!="es-mx" && $browlang!="pt-br") - { - $browlang=explode( "-",$browlang); - $browlang=$browlang[0]; - } - $_SESSION['adminlang']=$browlang; - } - else - { - $_SESSION['adminlang'] = $fields['lang']; - } - $clang = new limesurvey_lang($_SESSION['adminlang']); - } - $login = true; - - $loginsummary .= "
        \n"; - $loginsummary .= "
        " . $clang->gT("Logged in") . "
        "; - $loginsummary .= "
        ".sprintf($clang->gT("Welcome %s!"),$_SESSION['full_name'])."
         "; - $loginsummary .= "
        \n"; - - if (isset($_POST['refererargs']) && $_POST['refererargs'] && - strpos($_POST['refererargs'], "action=logout") === FALSE) - { - require_once("../classes/inputfilter/class.inputfilter_clean.php"); - $myFilter = new InputFilter('','',1,1,1); - // Prevent XSS attacks - $sRefererArg=$myFilter->process($_POST['refererargs']); - $_SESSION['metaHeader']=""; - $loginsummary .= "

        ".$clang->gT("Reloading screen. Please wait.")."\n"; - } - $loginsummary .= "

        \n"; - GetSessionUserRights($_SESSION['loginID']); - - //go to queXS - $loc = ""; - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - $loc = "admin"; - else - { - $utest = $connect->GetOne("SELECT username FROM client WHERE username = '" . $_SESSION['user'] . "'"); - if (!empty($utest)) - $loc = "client"; - } - header('Location: ' . QUEXS_URL . $loc); - die(); - } - else - { - $query = fGetLoginAttemptUpdateQry($bLoginAttempted,$sIp); - - $result = $connect->Execute($query) or safe_die ($query."
        ".$connect->ErrorMsg());; - if ($result) - { - // wrong or unknown username - $loginsummary .= "

        ".$clang->gT("Incorrect username and/or password!")."
        "; - if ($intNthAttempt+1>=$maxLoginAttempt) - $loginsummary .= sprintf($clang->gT("You have exceeded you maximum login attempts. Please wait %d minutes before trying again"),($timeOutTime/60))."
        "; - $loginsummary .= "
        ".$clang->gT("Continue")."
         \n"; - } - - } - } - - } - else{ - $loginsummary .= "

        ".sprintf($clang->gT("You have exceeded you maximum login attempts. Please wait %d minutes before trying again"),($timeOutTime/60))."
        "; - $loginsummary .= "
        ".$clang->gT("Continue")."
         \n"; - } - } - } - elseif($useWebserverAuth === true && !isset($_SERVER['PHP_AUTH_USER'])) // LimeSurvey expects webserver auth but it has not been achieved - { - $loginsummary .= "
        ".$clang->gT("LimeSurvey is setup to use the webserver authentication, but it seems you have not already been authenticated")."
        "; - $loginsummary .= "

        ".$clang->gT("Please contact your system administrator")."
         \n"; - } - elseif($useWebserverAuth === true && isset($_SERVER['PHP_AUTH_USER'])) // normal login through webserver authentication - { - $action = 'login'; - // we'll include database.php - // we need to unset surveyid - // that could be set if the user clicked on - // a link with all params before first auto-login - unset($surveyid); - - $loginsummary = ''; - // getting user name, optionnally mapped - if (isset($userArrayMap) && is_array($userArrayMap) && - isset($userArrayMap[$_SERVER['PHP_AUTH_USER']])) - { - $mappeduser=$userArrayMap[$_SERVER['PHP_AUTH_USER']]; - } - else - { - $mappeduser=$_SERVER['PHP_AUTH_USER']; - } - - include("database.php"); - $query = "SELECT uid, users_name, password, parent_id, email, lang, htmleditormode, questionselectormode, templateeditormode, dateformat FROM ".db_table_name('users')." WHERE users_name=".$connect->qstr($mappeduser); - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; //Checked - $result = $connect->SelectLimit($query, 1) or safe_die ($query."
        ".$connect->ErrorMsg()); - if ($result->RecordCount() < 1) - { - // In case the hook function is defined - // overrite the default auto-import profile - // by this function's result - if (function_exists("hook_get_autouserprofile")) - { - // If defined this function returns an array - // describing the defaukt profile for this user - $WebserverAuth_autouserprofile = hook_get_autouserprofile($mappeduser); - } - - if (isset($WebserverAuth_autocreateUser) && - $WebserverAuth_autocreateUser === true && - isset($WebserverAuth_autouserprofile) && - is_array ($WebserverAuth_autouserprofile) && - count($WebserverAuth_autouserprofile) > 0 ) - { // user doesn't exist but auto-create user is set - $isAuthenticated=false; - $new_pass = createPassword(); - - $uquery = "INSERT INTO {$dbprefix}users " - ."(users_name, password,full_name,parent_id,lang,email,create_survey,create_user,delete_user,superadmin,configurator,manage_template,manage_label) " - ."VALUES (" - . $connect->qstr($mappeduser).", " - . "'".SHA256::hashing($new_pass)."', " - . "'".db_quote($WebserverAuth_autouserprofile['full_name'])."', " - . getInitialAdmin_uid()." , " - . "'".$WebserverAuth_autouserprofile['lang']."', " - . "'".db_quote($WebserverAuth_autouserprofile['email'])."', " - . intval($WebserverAuth_autouserprofile['create_survey'])."," - . intval($WebserverAuth_autouserprofile['create_user'])."," - . intval($WebserverAuth_autouserprofile['delete_user'])."," - . intval($WebserverAuth_autouserprofile['superadmin'])."," - . intval($WebserverAuth_autouserprofile['configurator'])."," - . intval($WebserverAuth_autouserprofile['manage_template'])."," - . intval($WebserverAuth_autouserprofile['manage_label']) - .")"; - - $uresult = $connect->Execute($uquery); //Checked - if ($uresult) - { - $isAuthenticated=true; - $newqid = $connect->Insert_ID("{$dbprefix}users","uid"); - $arrayTemplates=explode(",",$WebserverAuth_autouserprofile['templatelist']); - foreach ($arrayTemplates as $tplname) - { - $template_query = "INSERT INTO {$dbprefix}templates_rights VALUES('$newqid','$tplname','1')"; - $connect->Execute($template_query); //Checked - } - - // read again user from newly created entry - $result = $connect->SelectLimit($query, 1) or safe_die ($query."
        ".$connect->ErrorMsg());//Checked - } - else - { - $loginsummary .= "
        ".$clang->gT("Auto-import of user failed!")."
        "; - $loginsummary .= "

        ".$clang->gT("Continue")."
         \n"; - $isAuthenticated=false; - } - - } - else - { - $query = fGetLoginAttemptUpdateQry($bLoginAttempted,$sIp); - - $result = $connect->Execute($query) or safe_die ($query."
        ".$connect->ErrorMsg());; - if ($result) - { - // wrong or unknown username - $loginsummary .= "

        ".$clang->gT("Incorrect username and/or password!")."
        "; - if ($intNthAttempt+1>=$maxLoginAttempt) - $loginsummary .= sprintf($clang->gT("You have exceeded you maximum login attempts. Please wait %d minutes before trying again"),($timeOutTime/60))."
        "; - $loginsummary .= "
        ".$clang->gT("Continue")."
         \n"; - } - $isAuthenticated=false; - } - - } - else - { // User already exists - $isAuthenticated=true; - } - - if ($isAuthenticated ===true) - { // user exists and was authenticated by webserver - $fields = $result->FetchRow(); - - $_SESSION['loginID'] = intval($fields['uid']); - $_SESSION['user'] = $fields['users_name']; - $_SESSION['adminlang'] = $fields['lang']; - $_SESSION['htmleditormode'] = $fields['htmleditormode']; - $_SESSION['questionselectormode'] = $fields['questionselectormode']; - $_SESSION['templateeditormode'] = $fields['templateeditormode']; - $_SESSION['dateformat'] = $fields['dateformat']; - $_SESSION['checksessionpost'] = sRandomChars(10); - $_SESSION['pw_notify']=false; - $clang = new limesurvey_lang($_SESSION['adminlang']); - $login = true; - - $loginsummary .= "
        " .sprintf($clang->gT("Welcome %s!"),$_SESSION['user']) . "
        "; - $loginsummary .= $clang->gT("You logged in successfully."); - - if (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] && - strpos($_SERVER['QUERY_STRING'], "action=logout") === FALSE) - { - $_SESSION['metaHeader']=""; - $loginsummary .= "

        ".$clang->gT("Reloading screen. Please wait.")."\n"; - } - $loginsummary .= "

        \n"; - GetSessionUserRights($_SESSION['loginID']); - } - } -} -elseif ($action == "logout") -{ - killSession(); - $logoutsummary = '

        '.$clang->gT("Logout successful."); -} - -elseif ($action == "adduser" && $_SESSION['USER_RIGHT_CREATE_USER']) -{ - $addsummary = "

        ".$clang->gT("Add user")."
        \n"; - - $new_user = FlattenText($postnew_user,true); - $new_email = FlattenText($postnew_email,true); - $new_full_name = FlattenText($postnew_full_name,true); - - $valid_email = true; - if(!validate_email($new_email)) - { - $valid_email = false; - $addsummary .= "
        ".$clang->gT("Failed to add user")."

        \n" . " " . $clang->gT("The email address is not valid.")."
        \n"; - } - if(empty($new_user)) - { - if($valid_email) $addsummary .= "
        ".$clang->gT("Failed to add user")."
        \n" . " "; - $addsummary .= $clang->gT("A username was not supplied or the username is invalid.")."
        \n"; - } - elseif($valid_email) - { - $new_pass = createPassword(); - $uquery = "INSERT INTO {$dbprefix}users (users_name, password,full_name,parent_id,lang,email,create_survey,create_user,delete_user,superadmin,configurator,manage_template,manage_label) - VALUES ('".db_quote($new_user)."', '".SHA256::hashing($new_pass)."', '".db_quote($new_full_name)."', {$_SESSION['loginID']}, 'auto', '".db_quote($new_email)."',0,0,0,0,0,0,0)"; - $uresult = $connect->Execute($uquery); //Checked - - if($uresult) - { - $newqid = $connect->Insert_ID("{$dbprefix}users","uid"); - - // add default template to template rights for user - $template_query = "INSERT INTO {$dbprefix}templates_rights VALUES('$newqid','default','1')"; - $connect->Execute($template_query); //Checked - - // add new user to userlist - $squery = "SELECT uid, users_name, password, parent_id, email, create_survey, configurator, create_user, delete_user, superadmin, manage_template, manage_label FROM ".db_table_name('users')." WHERE uid='{$newqid}'"; //added by Dennis - $sresult = db_execute_assoc($squery);//Checked - $srow = $sresult->FetchRow(); - $userlist = getuserlist(); - array_push($userlist, array("user"=>$srow['users_name'], "uid"=>$srow['uid'], "email"=>$srow['email'], - "password"=>$srow["password"], "parent_id"=>$srow['parent_id'], // "level"=>$level, - "create_survey"=>$srow['create_survey'], "configurator"=>$srow['configurator'], "create_user"=>$srow['create_user'], - "delete_user"=>$srow['delete_user'], "superadmin"=>$srow['superadmin'], "manage_template"=>$srow['manage_template'], - "manage_label"=>$srow['manage_label'])); - - // send Mail - $body = sprintf($clang->gT("Hello %s,",'unescaped'), $new_full_name)."

        \n"; - $body .= sprintf($clang->gT("this is an automated email to notify that a user has been created for you on the site '%s'.",'unescaped'), $sitename)."

        \n"; - $body .= $clang->gT("You can use now the following credentials to log into the site:",'unescaped')."
        \n"; - $body .= $clang->gT("Username",'unescaped') . ": " . $new_user . "
        \n"; - if ($useWebserverAuth === false) - { // authent is not delegated to web server - // send password (if authorized by config) - if ($display_user_password_in_email === true) - { - $body .= $clang->gT("Password",'unescaped') . ": " . $new_pass . "
        \n"; - } - else - { - $body .= $clang->gT("Password",'unescaped') . ": " . $clang->gT("Please ask your LimeSurvey administrator for your password.") . "
        \n"; - } - } - - $body .= "".$clang->gT("Click here to log in.",'unescaped')."

        \n"; - $body .= sprintf($clang->gT('If you have any questions regarding this mail please do not hesitate to contact the site administrator at %s. Thank you!','unescaped'),$siteadminemail)."
        \n"; - - $subject = sprintf($clang->gT("User registration at '%s'","unescaped"),$sitename); - $to = $new_user." <$new_email>"; - $from = $siteadminname." <$siteadminemail>"; - $addsummary .="
        "; - if(SendEmailMessage(null, $body, $subject, $to, $from, $sitename, true, $siteadminbounce)) - { - $addsummary .= "
        ".$clang->gT("Username").": $new_user
        ".$clang->gT("Email").": $new_email
        "; - $addsummary .= "
        ".$clang->gT("An email with a generated password was sent to the user."); - } - else - { - // has to be sent again or no other way - $tmp = str_replace("{NAME}", "".$new_user."", $clang->gT("Email to {NAME} ({EMAIL}) failed.")); - $addsummary .= "
        ".str_replace("{EMAIL}", $new_email, $tmp) . "
        "; - } - - $addsummary .= "
        \t\t\t
        " - ."" - ."" - ."" - ."" - ."
        "; - } - else{ - $addsummary .= "
        ".$clang->gT("Failed to add user")."

        \n" . " " . $clang->gT("The user name already exists.")."
        \n"; - } - } - $addsummary .= "

        gT("Continue")."\"/>

        \n"; -} - -elseif (($action == "deluser" || $action == "finaldeluser") && ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $_SESSION['USER_RIGHT_DELETE_USER'] )) -{ - $addsummary = "
        ".$clang->gT("Deleting user")."
        \n"; - $addsummary .= "
        \n"; - - // CAN'T DELETE ORIGINAL SUPERADMIN - // Initial SuperAdmin has parent_id == 0 - $adminquery = "SELECT uid FROM {$dbprefix}users WHERE parent_id=0"; - $adminresult = db_select_limit_assoc($adminquery, 1);//Checked - $row=$adminresult->FetchRow(); - - if($row['uid'] == $postuserid) // it's the original superadmin !!! - { - $addsummary .= "
        ".$clang->gT("Initial Superadmin cannot be deleted!")."
        \n"; - } - else - { - if (isset($postuserid)) - { - $sresultcount = 0;// 1 if I am parent of $postuserid - if ($_SESSION['USER_RIGHT_SUPERADMIN'] != 1) - { - $squery = "SELECT uid FROM {$dbprefix}users WHERE uid=$postuserid AND parent_id=".$_SESSION['loginID']; - $sresult = $connect->Execute($squery); //Checked - $sresultcount = $sresult->RecordCount(); - } - - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $sresultcount > 0 || $postuserid == $_SESSION['loginID']) - { - $transfer_surveys_to = 0; - $query = "SELECT users_name, uid FROM ".db_table_name('users').";"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - - $current_user = $_SESSION['loginID']; - if($result->RecordCount() == 2) { - - $action = "finaldeluser"; - while($rows = $result->FetchRow()){ - $intUid = $rows['uid']; - $selected = ''; - if ($intUid == $current_user) - $selected = " selected='selected'"; - - if ($postuserid != $intUid) - $transfer_surveys_to = $intUid; - } - } - - $query = "SELECT sid FROM ".db_table_name('surveys')." WHERE owner_id = $postuserid ;"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - if($result->RecordCount() == 0) { - $action = "finaldeluser"; - } - - if ($action=="finaldeluser") - { - if (isset($_POST['transfer_surveys_to'])) {$transfer_surveys_to=sanitize_int($_POST['transfer_surveys_to']);} - if ($transfer_surveys_to > 0){ - $query = "UPDATE ".db_table_name('surveys')." SET owner_id = $transfer_surveys_to WHERE owner_id=$postuserid"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - } - $squery = "SELECT parent_id FROM {$dbprefix}users WHERE uid=".$postuserid; - $sresult = $connect->Execute($squery); //Checked - $fields = $sresult->FetchRow($sresult); - - if (isset($fields[0])) - { - $uquery = "UPDATE ".db_table_name('users')." SET parent_id={$fields[0]} WHERE parent_id=".$postuserid; // added by Dennis - $uresult = $connect->Execute($uquery); //Checked - } - - //DELETE USER FROM TABLE - $dquery="DELETE FROM {$dbprefix}users WHERE uid=".$postuserid; // added by Dennis - $dresult=$connect->Execute($dquery); //Checked - - // Delete user rights - $dquery="DELETE FROM {$dbprefix}survey_permissions WHERE uid=".$postuserid; - $dresult=$connect->Execute($dquery); //Checked - - if($postuserid == $_SESSION['loginID']) - { - killSession(); // user deleted himself - header( "Location: " . $homeurl . "/admin.php"); - die(); - } - - $addsummary .= "
        ".$clang->gT("Username").": {$postuser}

        \n"; - $addsummary .= "
        ".$clang->gT("Success!")."
        \n"; - if ($transfer_surveys_to>0){ - $sTransferred_to = getUserNameFromUid($transfer_surveys_to); - $addsummary .= sprintf($clang->gT("All of the user's surveys were transferred to %s."),$sTransferred_to); - } - $addsummary .= "
        gT("Continue")."\"/>\n"; - } - else - { - $current_user = $_SESSION['loginID']; - $addsummary .= "
        ".$clang->gT("Transfer the user's surveys to: ")."\n"; - $addsummary .= "
        "; - $addsummary .= ""; - $addsummary .= "

        "; - $addsummary .= "
        "; - } - - } - else - { - include("access_denied.php"); - } - } - else - { - $addsummary .= "
        ".$clang->gT("Could not delete user. User was not supplied.")."
        \n"; - $addsummary .= "
        gT("Continue")."\"/>\n"; - } - } - $addsummary .= "
        \n"; -} - - - -elseif ($action == "moduser") -{ - $addsummary = "
        ".$clang->gT("Editing user")."
        \n"; - $addsummary .= "
        \n"; - - $squery = "SELECT uid FROM {$dbprefix}users WHERE uid=$postuserid AND parent_id=".$_SESSION['loginID']; - $sresult = $connect->Execute($squery); //Checked - $sresultcount = $sresult->RecordCount(); - - if(($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $postuserid == $_SESSION['loginID'] || - ($sresultcount > 0 && $_SESSION['USER_RIGHT_CREATE_USER'])) && !($demoModeOnly == true && $postuserid == 1) - ) - { - $users_name = html_entity_decode($postuser, ENT_QUOTES, 'UTF-8'); - $email = html_entity_decode($postemail,ENT_QUOTES, 'UTF-8'); - $sPassword = html_entity_decode($_POST['pass'],ENT_QUOTES, 'UTF-8'); - if ($sPassword=='%%unchanged%%') $sPassword=''; - $full_name = html_entity_decode($postfull_name,ENT_QUOTES, 'UTF-8'); - $valid_email = true; - - if(!validate_email($email)) - { - $valid_email = false; - $failed = true; - $addsummary .= "
        ".$clang->gT("Could not modify user data.")."

        \n" - . " ".$clang->gT("Email address is not valid.")."
        \n"; - } - elseif($valid_email) - { - $failed = false; - if(empty($sPassword)) - { - $uquery = "UPDATE ".db_table_name('users')." SET email='".db_quote($email)."', full_name='".db_quote($full_name)."' WHERE uid=".$postuserid; - } else { - $uquery = "UPDATE ".db_table_name('users')." SET email='".db_quote($email)."', full_name='".db_quote($full_name)."', password='".SHA256::hashing($sPassword)."' WHERE uid=".$postuserid; - } - - $uresult = $connect->Execute($uquery);//Checked - - if($uresult && empty($sPassword)) - { - $addsummary .= "
        ".$clang->gT("Username").": $users_name
        ".$clang->gT("Password").": (".$clang->gT("Unchanged").")

        \n"; - $addsummary .= "
        ".$clang->gT("Success!")."
        \n"; - } elseif($uresult && !empty($sPassword)) - { - if ($display_user_password_in_html === true) - { - $displayedPwd = $sPassword; - } - else - { - $displayedPwd = preg_replace('/./','*',$sPassword); - } - $addsummary .= "
        ".$clang->gT("Username").": $users_name
        ".$clang->gT("Password").": {$displayedPwd}

        \n"; - $addsummary .= "
        ".$clang->gT("Success!")."
        \n"; - } - else - { - // Username and/or email adress already exists. - $addsummary .= "
        ".$clang->gT("Could not modify user data.")."

        \n" - . " ".$clang->gT("Email address already exists.")."
        \n"; - } - } - if($failed) - { - $addsummary .= "
        " - ."" - ."" - ."" - ."
        "; - } - else - { - $addsummary .= "
        gT("Continue")."\"/>\n"; - } - } - else - { - include("access_denied.php"); - } - $addsummary .= "
        \n"; -} - -elseif ($action == "userrights") -{ - $addsummary = "
        ".$clang->gT("Set user permissions")."
        \n"; - $addsummary .= "
        \n"; - - // A user can't modify his own rights ;-) - if($postuserid != $_SESSION['loginID']) - { - $squery = "SELECT uid FROM {$dbprefix}users WHERE uid=$postuserid AND parent_id=".$_SESSION['loginID']; - $sresult = $connect->Execute($squery); // Checked - $sresultcount = $sresult->RecordCount(); - - if($_SESSION['USER_RIGHT_SUPERADMIN'] != 1 && $sresultcount > 0) - { // Not Admin, just a user with childs - $rights = array(); - - // Forbids Allowing more privileges than I have - if(isset($_POST['create_survey']) && $_SESSION['USER_RIGHT_CREATE_SURVEY'])$rights['create_survey']=1; else $rights['create_survey']=0; - if(isset($_POST['configurator']) && $_SESSION['USER_RIGHT_CONFIGURATOR'])$rights['configurator']=1; else $rights['configurator']=0; - if(isset($_POST['create_user']) && $_SESSION['USER_RIGHT_CREATE_USER'])$rights['create_user']=1; else $rights['create_user']=0; - if(isset($_POST['delete_user']) && $_SESSION['USER_RIGHT_DELETE_USER'])$rights['delete_user']=1; else $rights['delete_user']=0; - - $rights['superadmin']=0; // ONLY Initial Superadmin can give this right - if(isset($_POST['manage_template']) && $_SESSION['USER_RIGHT_MANAGE_TEMPLATE'])$rights['manage_template']=1; else $rights['manage_template']=0; - if(isset($_POST['manage_label']) && $_SESSION['USER_RIGHT_MANAGE_LABEL'])$rights['manage_label']=1; else $rights['manage_label']=0; - - if ($postuserid<>1) setuserrights($postuserid, $rights); - $addsummary .= "
        ".$clang->gT("User permissions were updated successfully.")."
        \n"; - $addsummary .= "
        gT("Continue")."\"/>\n"; - } - elseif ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - $rights = array(); - - if(isset($_POST['create_survey']))$rights['create_survey']=1; else $rights['create_survey']=0; - if(isset($_POST['configurator']))$rights['configurator']=1; else $rights['configurator']=0; - if(isset($_POST['create_user']))$rights['create_user']=1; else $rights['create_user']=0; - if(isset($_POST['delete_user']))$rights['delete_user']=1; else $rights['delete_user']=0; - - // Only Initial Superadmin can give this right - if(isset($_POST['superadmin'])) - { - // Am I original Superadmin ? - - // Initial SuperAdmin has parent_id == 0 - $adminquery = "SELECT uid FROM {$dbprefix}users WHERE parent_id=0"; - $adminresult = db_select_limit_assoc($adminquery, 1); - $row=$adminresult->FetchRow(); - - if($row['uid'] == $_SESSION['loginID']) // it's the original superadmin !!! - { - $rights['superadmin']=1; - } - else - { - $rights['superadmin']=0; - } - } - else - { - $rights['superadmin']=0; - } - - if(isset($_POST['manage_template']))$rights['manage_template']=1; else $rights['manage_template']=0; - if(isset($_POST['manage_label']))$rights['manage_label']=1; else $rights['manage_label']=0; - - setuserrights($postuserid, $rights); - $addsummary .= "
        ".$clang->gT("User permissions were updated successfully.")."
        \n"; - $addsummary .= "
        gT("Continue")."\"/>\n"; - } - else - { - include("access_denied.php"); - } - } - else - { - $addsummary .= "
        ".$clang->gT("You are not allowed to change your own permissions!")."
        \n"; - $addsummary .= "
        gT("Continue")."\"/>\n"; - } - $addsummary .= "
        \n"; -} - -elseif ($action == "usertemplates") -{ - $addsummary = "
        ".$clang->gT("Set template permissions")."
        \n"; - $addsummary .= "
        \n"; - - // SUPERADMINS AND MANAGE_TEMPLATE USERS CAN SET THESE RIGHTS - if( $_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $_SESSION['USER_RIGHT_MANAGE_TEMPLATE'] == 1) - { - $templaterights = array(); - $tquery = "SELECT * FROM ".$dbprefix."templates"; - $tresult = db_execute_assoc($tquery); - while ($trow = $tresult->FetchRow()) { - if (isset($_POST[$trow["folder"]."_use"])) - $templaterights[$trow["folder"]] = 1; - else - $templaterights[$trow["folder"]] = 0; - } - foreach ($templaterights as $key => $value) { - $uquery = "INSERT INTO {$dbprefix}templates_rights (uid,".db_quote_id('folder').",".db_quote_id('use').") VALUES ({$postuserid},'".$key."',$value)"; - $uresult = $connect->execute($uquery); - if (!$uresult) - { - $uquery = "UPDATE {$dbprefix}templates_rights SET ".db_quote_id('use')."=$value where ".db_quote_id('folder')."='$key' AND uid=".$postuserid; - $uresult = $connect->execute($uquery); - } - } - if ($uresult) - { - $addsummary .= "
        ".$clang->gT("Template permissions were updated successfully.")."
        \n"; - $addsummary .= "
        gT("Continue")."\"/>\n"; - } - else - { - $addsummary .= "
        ".$clang->gT("Error")."
        \n"; - $addsummary .= "
        ".$clang->gT("Error while updating usertemplates.")."
        \n"; - $addsummary .= "
        gT("Continue")."\"/>\n"; - } - } - else - { - include("access_denied.php"); - } - $addsummary .= "
        \n"; -} - - -function getInitialAdmin_uid() -{ - global $dbprefix; - // Initial SuperAdmin has parent_id == 0 - $adminquery = "SELECT uid FROM {$dbprefix}users WHERE parent_id=0"; - $adminresult = db_select_limit_assoc($adminquery, 1); - $row=$adminresult->FetchRow(); - return $row['uid']; -} - -function fGetLoginAttemptUpdateQry($la,$sIp) -{ - $timestamp = date("Y-m-d H:i:s"); - if ($la) - $query = "UPDATE ".db_table_name('failed_login_attempts') - ." SET number_attempts=number_attempts+1, last_attempt = '$timestamp' WHERE ip='$sIp'"; - else - $query = "INSERT INTO ".db_table_name('failed_login_attempts') . "(ip, number_attempts,last_attempt)" - ." VALUES('$sIp',1,'$timestamp')"; - - return $query; -} - - -function getUserNameFromUid($uid){ - $query = "SELECT users_name, uid FROM ".db_table_name('users')." WHERE uid = $uid;"; - - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - - - if($result->RecordCount() > 0) { - while($rows = $result->FetchRow()){ - return $rows['users_name']; - } - } -} diff --git a/include/limesurvey/admin/userrighthandling.php b/include/limesurvey/admin/userrighthandling.php deleted file mode 100644 index 9819cc23..00000000 --- a/include/limesurvey/admin/userrighthandling.php +++ /dev/null @@ -1,1138 +0,0 @@ -RecordCount(); - if ($grpresultcount>0) - { - $grow = array_map('htmlspecialchars', $grpresult->FetchRow()); - } - } - $usergroupsummary = "\n"; - $usergroupsummary .= "

         

        "; //CSS Firefox 2 transition fix - - -} - - -if ($action == "adduser" || $action=="deluser" ||$action=="finaldeluser" || $action == "moduser" || $action == "userrights" || $action == "usertemplates") -{ - include("usercontrol.php"); -} - -if ($action == "setusertemplates") -{ - refreshtemplates(); - $usersummary = "\n
        \n\t -
        ".$clang->gT('Edit template permissions')."
        \n - \n - \n - \t\n - \t\n - \t\n"; - - $userlist = getuserlist(); - foreach ($userlist as $usr) - { - if ($usr['uid'] == $postuserid) - { - $templaterights = array(); - $squery = 'SELECT '.db_quote_id('folder').','.db_quote_id('use')." FROM {$dbprefix}templates_rights WHERE uid={$usr['uid']}"; - $sresult = db_execute_assoc($squery) or safe_die($connect->ErrorMsg());//Checked - while ($srow = $sresult->FetchRow()) - { - $templaterights[$srow["folder"]] = array("use"=>$srow["use"]); - } - - $usersummary .= "\t\n\n\n\t\n" - ."\t\n"; - - $usersummary .= "\n" - ."\n" - ."\n" - ."\n" - ."\n"; - - $usersummary .= "\n"; - - $tquery = "SELECT * FROM ".$dbprefix."templates"; - $tresult = db_execute_assoc($tquery) or safe_die($connect->ErrorMsg()); //Checked - - $table_row_odd_even = 'odd'; - while ($trow = $tresult->FetchRow()) - { - if($table_row_odd_even == 'odd' ) - { - $row_class = ' class="row_odd"'; - $table_row_odd_even = 'even'; - } - else - { - $row_class = ' class="row_even"'; - $table_row_odd_even = 'odd'; - }; - $usersummary .= "\t\n\n"; - $usersummary .= ""; - // $vvoutput .= "'; - - //See if any fields in the import file don't exist in the active survey - $missing = array_diff($fieldnames, $realfieldnames); - if (is_array($missing) && count($missing) > 0) - { - foreach ($missing as $key=>$val) - { - $donotimport[]=$key; - unset($fieldnames[$key]); - } - } - if ($finalized == "notfinalized") - { - $donotimport[]=1; - unset($fieldnames[1]); - } - $importcount=0; - $recordcount=0; - $fieldnames=array_map('db_quote_id',$fieldnames); - - //now find out which fields are datefields, these have to be null if the imported string is empty - $fieldmap=createFieldMap($surveyid); - $datefields=array(); - $numericfields=array(); - foreach ($fieldmap as $field) - { - if ($field['type']=='D') - { - $datefields[]=$field['fieldname']; - } - if ($field['type']=='N' || $field['type']=='K') - { - $numericfields[]=$field['fieldname']; - } - } - foreach($bigarray as $row) - { - if (trim($row) != "") - { - $recordcount++; - $fieldvalues=explode("\t", str_replace("\n", "", $row), $fieldcount+1); - // Excel likes to quote fields sometimes. =( - $fieldvalues=preg_replace('/^"(.*)"$/s','\1',$fieldvalues); - // careful about the order of these arrays: - // lbrace has to be substituted *last* - $fieldvalues=str_replace(array("{newline}", - "{cr}", - "{tab}", - "{quote}", - "{lbrace}"), - array("\n", - "\r", - "\t", - "\"", - "{"), - $fieldvalues); - if (isset($donotimport)) //remove any fields which no longer exist - { - foreach ($donotimport as $not) - { - unset($fieldvalues[$not]); - } - } - // sometimes columns with nothing in them get omitted by excel - while (count($fieldnames) > count($fieldvalues)) - { - $fieldvalues[]=""; - } - // sometimes columns with nothing in them get added by excel - while (count($fieldnames) < count($fieldvalues) && - trim($fieldvalues[count($fieldvalues)-1])=="") - { - unset($fieldvalues[count($fieldvalues)-1]); - } - // make this safe for DB (*after* we undo first excel's - // and then our escaping). - $fieldvalues=array_map('db_quoteall',$fieldvalues); - $fieldvalues=str_replace(db_quoteall('{question_not_shown}'),'NULL',$fieldvalues); - $fielddata=($fieldnames===array() && $fieldvalues===array() ? array() : array_combine($fieldnames, $fieldvalues)); - - foreach ($datefields as $datefield) - { - if ($fielddata[db_quote_id($datefield)]=='') - { - unset($fielddata[db_quote_id($datefield)]); - } - } - - foreach ($numericfields as $numericfield) - { - if ($fielddata[db_quote_id($numericfield)]=='') - { - unset($fielddata[db_quote_id($numericfield)]); - } - } - if (isset($fielddata[db_quote_id('submitdate')]) && $fielddata[db_quote_id('submitdate')]=='NULL') unset ($fielddata[db_quote_id('submitdate')]); - if ($fielddata[db_quote_id('lastpage')]=='') $fielddata[db_quote_id('lastpage')]='0'; - - $recordexists=false; - if (isset($fielddata['[id]'])) - { - $result = $connect->Execute("select id from $surveytable where id=".$fielddata[db_quote_id('id')]); - $recordexists=$result->RecordCount()>0; - if ($recordexists) // record with same id exists - { - if ($insertstyle=="ignore") - { - $vvoutput .=sprintf($clang->gT("Record ID %d was skipped because of duplicate ID."), $fielddata[db_quote_id('id')]).'
        '; - continue; - } - if ($insertstyle=="replace") - { - $result = $connect->Execute("delete from $surveytable where id=".$fielddata['id']); - $recordexists=false; - } - } - } - if ($insertstyle=="renumber") - { - unset($fielddata['id']); - } - if (isset($fielddata['id'])) - { - db_switchIDInsert("survey_$surveyid",true); - } - // try again, without the 'id' field. - - $insert = "INSERT INTO $surveytable\n"; - $insert .= "(".implode(", ", array_keys($fielddata)).")\n"; - $insert .= "VALUES\n"; - $insert .= "(".implode(", ", array_values($fielddata)).")"; - $result = $connect->Execute($insert); - - if (isset($fielddata['id'])) - { - db_switchIDInsert("survey_$surveyid",false); - } - - - if (!$result) - { - $vvoutput .= "
        \n$insert" - ."
        ".sprintf($clang->gT("Import Failed on Record %d because [%s]"), $recordcount, htmlspecialchars(utf8_encode($connect->ErrorMsg()))) - ."
        \n"; - } - else - { - $importcount++; - } - - - } - } - - if ($noid == "noid" || $insertstyle == "renumber") - { - $vvoutput .= "
        ".$clang->gT("Important Note:")."
        ".$clang->gT("Do NOT refresh this page, as this will import the file again and produce duplicates")."


        "; - } - $vvoutput .= $clang->gT("Total records imported:")." ".$importcount."

        "; - $vvoutput .= "[".$clang->gT("Browse Responses")."]"; - $vvoutput .= "
         "; -} -?> diff --git a/include/limesurvey/classes/.htaccess b/include/limesurvey/classes/.htaccess deleted file mode 100644 index 45552cb6..00000000 --- a/include/limesurvey/classes/.htaccess +++ /dev/null @@ -1 +0,0 @@ -Options -Indexes \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-active-record.inc.php b/include/limesurvey/classes/adodb/adodb-active-record.inc.php deleted file mode 100644 index 5891fb56..00000000 --- a/include/limesurvey/classes/adodb/adodb-active-record.inc.php +++ /dev/null @@ -1,982 +0,0 @@ -_dbat -$_ADODB_ACTIVE_DBS = array(); -$ACTIVE_RECORD_SAFETY = true; -$ADODB_ACTIVE_DEFVALS = false; -$ADODB_ACTIVE_CACHESECS = 0; - -class ADODB_Active_DB { - var $db; // ADOConnection - var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename -} - -class ADODB_Active_Table { - var $name; // table name - var $flds; // assoc array of adofieldobjs, indexed by fieldname - var $keys; // assoc array of primary keys, indexed by fieldname - var $_created; // only used when stored as a cached file - var $_belongsTo = array(); - var $_hasMany = array(); -} - -// $db = database connection -// $index = name of index - can be associative, for an example see -// http://phplens.com/lens/lensforum/msgs.php?id=17790 -// returns index into $_ADODB_ACTIVE_DBS -function ADODB_SetDatabaseAdapter(&$db, $index=false) -{ - global $_ADODB_ACTIVE_DBS; - - foreach($_ADODB_ACTIVE_DBS as $k => $d) { - if (PHP_VERSION >= 5) { - if ($d->db === $db) return $k; - } else { - if ($d->db->_connectionID === $db->_connectionID && $db->database == $d->db->database) - return $k; - } - } - - $obj = new ADODB_Active_DB(); - $obj->db = $db; - $obj->tables = array(); - - if ($index == false) $index = sizeof($_ADODB_ACTIVE_DBS); - - - $_ADODB_ACTIVE_DBS[$index] = $obj; - - return sizeof($_ADODB_ACTIVE_DBS)-1; -} - - -class ADODB_Active_Record { - static $_changeNames = true; // dynamically pluralize table names - static $_quoteNames = false; - - static $_foreignSuffix = '_id'; // - var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat] - var $_table; // tablename, if set in class definition then use it as table name - var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat] - var $_where; // where clause set in Load() - var $_saved = false; // indicates whether data is already inserted. - var $_lasterr = false; // last error message - var $_original = false; // the original values loaded or inserted, refreshed on update - - var $foreignName; // CFR: class name when in a relationship - - static function UseDefaultValues($bool=null) - { - global $ADODB_ACTIVE_DEFVALS; - if (isset($bool)) $ADODB_ACTIVE_DEFVALS = $bool; - return $ADODB_ACTIVE_DEFVALS; - } - - // should be static - static function SetDatabaseAdapter(&$db, $index=false) - { - return ADODB_SetDatabaseAdapter($db, $index); - } - - - public function __set($name, $value) - { - $name = str_replace(' ', '_', $name); - $this->$name = $value; - } - - // php5 constructor - function __construct($table = false, $pkeyarr=false, $db=false) - { - global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS; - - if ($db == false && is_object($pkeyarr)) { - $db = $pkeyarr; - $pkeyarr = false; - } - - if (!$table) { - if (!empty($this->_table)) $table = $this->_table; - else $table = $this->_pluralize(get_class($this)); - } - $this->foreignName = strtolower(get_class($this)); // CFR: default foreign name - if ($db) { - $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db); - } else if (!isset($this->_dbat)) { - if (sizeof($_ADODB_ACTIVE_DBS) == 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor'); - end($_ADODB_ACTIVE_DBS); - $this->_dbat = key($_ADODB_ACTIVE_DBS); - } - - $this->_table = $table; - $this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future - - $this->UpdateActiveTable($pkeyarr); - } - - function __wakeup() - { - $class = get_class($this); - new $class; - } - - function _pluralize($table) - { - if (!ADODB_Active_Record::$_changeNames) return $table; - - $ut = strtoupper($table); - $len = strlen($table); - $lastc = $ut[$len-1]; - $lastc2 = substr($ut,$len-2); - switch ($lastc) { - case 'S': - return $table.'es'; - case 'Y': - return substr($table,0,$len-1).'ies'; - case 'X': - return $table.'es'; - case 'H': - if ($lastc2 == 'CH' || $lastc2 == 'SH') - return $table.'es'; - default: - return $table.'s'; - } - } - - // CFR Lamest singular inflector ever - @todo Make it real! - // Note: There is an assumption here...and it is that the argument's length >= 4 - function _singularize($tables) - { - - if (!ADODB_Active_Record::$_changeNames) return $table; - - $ut = strtoupper($tables); - $len = strlen($tables); - if($ut[$len-1] != 'S') - return $tables; // I know...forget oxen - if($ut[$len-2] != 'E') - return substr($tables, 0, $len-1); - switch($ut[$len-3]) - { - case 'S': - case 'X': - return substr($tables, 0, $len-2); - case 'I': - return substr($tables, 0, $len-3) . 'y'; - case 'H'; - if($ut[$len-4] == 'C' || $ut[$len-4] == 'S') - return substr($tables, 0, $len-2); - default: - return substr($tables, 0, $len-1); // ? - } - } - - function hasMany($foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') - { - $ar = new $foreignClass($foreignRef); - $ar->foreignName = $foreignRef; - $ar->UpdateActiveTable(); - $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix; - $table =& $this->TableInfo(); - $table->_hasMany[$foreignRef] = $ar; - # $this->$foreignRef = $this->_hasMany[$foreignRef]; // WATCHME Removed assignment by ref. to please __get() - } - - // use when you don't want ADOdb to auto-pluralize tablename - static function TableHasMany($table, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') - { - $ar = new ADODB_Active_Record($table); - $ar->hasMany($foreignRef, $foreignKey, $foreignClass); - } - - // use when you don't want ADOdb to auto-pluralize tablename - static function TableKeyHasMany($table, $tablePKey, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') - { - if (!is_array($tablePKey)) $tablePKey = array($tablePKey); - $ar = new ADODB_Active_Record($table,$tablePKey); - $ar->hasMany($foreignRef, $foreignKey, $foreignClass); - } - - - // use when you want ADOdb to auto-pluralize tablename for you. Note that the class must already be defined. - // e.g. class Person will generate relationship for table Persons - static function ClassHasMany($parentclass, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record') - { - $ar = new $parentclass(); - $ar->hasMany($foreignRef, $foreignKey, $foreignClass); - } - - - function belongsTo($foreignRef,$foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') - { - global $inflector; - - $ar = new $parentClass($this->_pluralize($foreignRef)); - $ar->foreignName = $foreignRef; - $ar->parentKey = $parentKey; - $ar->UpdateActiveTable(); - $ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix; - - $table =& $this->TableInfo(); - $table->_belongsTo[$foreignRef] = $ar; - # $this->$foreignRef = $this->_belongsTo[$foreignRef]; - } - - static function ClassBelongsTo($class, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') - { - $ar = new $class(); - $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); - } - - static function TableBelongsTo($table, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') - { - $ar = new ADOdb_Active_Record($table); - $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); - } - - static function TableKeyBelongsTo($table, $tablePKey, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record') - { - if (!is_array($tablePKey)) $tablePKey = array($tablePKey); - $ar = new ADOdb_Active_Record($table, $tablePKey); - $ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass); - } - - - /** - * __get Access properties - used for lazy loading - * - * @param mixed $name - * @access protected - * @return mixed - */ - function __get($name) - { - return $this->LoadRelations($name, '', -1, -1); - } - - /** - * @param string $name - * @param string $whereOrderBy : eg. ' AND field1 = value ORDER BY field2' - * @param offset - * @param limit - * @return mixed - */ - function LoadRelations($name, $whereOrderBy='', $offset=-1,$limit=-1) - { - $extras = array(); - $table = $this->TableInfo(); - if ($limit >= 0) $extras['limit'] = $limit; - if ($offset >= 0) $extras['offset'] = $offset; - - if (strlen($whereOrderBy)) - if (!preg_match('/^[ \n\r]*AND/i',$whereOrderBy)) - if (!preg_match('/^[ \n\r]*ORDER[ \n\r]/i',$whereOrderBy)) - $whereOrderBy = 'AND '.$whereOrderBy; - - if(!empty($table->_belongsTo[$name])) - { - $obj = $table->_belongsTo[$name]; - $columnName = $obj->foreignKey; - if(empty($this->$columnName)) - $this->$name = null; - else - { - if ($obj->parentKey) $key = $obj->parentKey; - else $key = reset($table->keys); - - $arrayOfOne = $obj->Find($key.'='.$this->$columnName.' '.$whereOrderBy,false,false,$extras); - if ($arrayOfOne) { - $this->$name = $arrayOfOne[0]; - return $arrayOfOne[0]; - } - } - } - if(!empty($table->_hasMany[$name])) - { - $obj = $table->_hasMany[$name]; - $key = reset($table->keys); - $id = @$this->$key; - if (!is_numeric($id)) { - $db = $this->DB(); - $id = $db->qstr($id); - } - $objs = $obj->Find($obj->foreignKey.'='.$id. ' '.$whereOrderBy,false,false,$extras); - if (!$objs) $objs = array(); - $this->$name = $objs; - return $objs; - } - - return array(); - } - ////////////////////////////////// - - // update metadata - function UpdateActiveTable($pkeys=false,$forceUpdate=false) - { - global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS; - global $ADODB_ACTIVE_DEFVALS,$ADODB_FETCH_MODE; - - $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; - - $table = $this->_table; - $tables = $activedb->tables; - $tableat = $this->_tableat; - if (!$forceUpdate && !empty($tables[$tableat])) { - - $tobj = $tables[$tableat]; - foreach($tobj->flds as $name => $fld) { - if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value)) - $this->$name = $fld->default_value; - else - $this->$name = null; - } - return; - } - $db = $activedb->db; - $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache'; - if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) { - $fp = fopen($fname,'r'); - @flock($fp, LOCK_SH); - $acttab = unserialize(fread($fp,100000)); - fclose($fp); - if ($acttab->_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) > time()) { - // abs(rand()) randomizes deletion, reducing contention to delete/refresh file - // ideally, you should cache at least 32 secs - $activedb->tables[$table] = $acttab; - - //if ($db->debug) ADOConnection::outp("Reading cached active record file: $fname"); - return; - } else if ($db->debug) { - ADOConnection::outp("Refreshing cached active record file: $fname"); - } - } - $activetab = new ADODB_Active_Table(); - $activetab->name = $table; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false); - - $cols = $db->MetaColumns($table); - - if (isset($savem)) $db->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if (!$cols) { - $this->Error("Invalid table name: $table",'UpdateActiveTable'); - return false; - } - $fld = reset($cols); - if (!$pkeys) { - if (isset($fld->primary_key)) { - $pkeys = array(); - foreach($cols as $name => $fld) { - if (!empty($fld->primary_key)) $pkeys[] = $name; - } - } else - $pkeys = $this->GetPrimaryKeys($db, $table); - } - if (empty($pkeys)) { - $this->Error("No primary key found for table $table",'UpdateActiveTable'); - return false; - } - - $attr = array(); - $keys = array(); - - switch($ADODB_ASSOC_CASE) { - case 0: - foreach($cols as $name => $fldobj) { - $name = strtolower($name); - if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) - $this->$name = $fldobj->default_value; - else - $this->$name = null; - $attr[$name] = $fldobj; - } - foreach($pkeys as $k => $name) { - $keys[strtolower($name)] = strtolower($name); - } - break; - - case 1: - foreach($cols as $name => $fldobj) { - $name = strtoupper($name); - - if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) - $this->$name = $fldobj->default_value; - else - $this->$name = null; - $attr[$name] = $fldobj; - } - - foreach($pkeys as $k => $name) { - $keys[strtoupper($name)] = strtoupper($name); - } - break; - default: - foreach($cols as $name => $fldobj) { - $name = ($fldobj->name); - - if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) - $this->$name = $fldobj->default_value; - else - $this->$name = null; - $attr[$name] = $fldobj; - } - foreach($pkeys as $k => $name) { - $keys[$name] = $cols[$name]->name; - } - break; - } - - $activetab->keys = $keys; - $activetab->flds = $attr; - - if ($ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR) { - $activetab->_created = time(); - $s = serialize($activetab); - if (!function_exists('adodb_write_file')) include(ADODB_DIR.'/adodb-csvlib.inc.php'); - adodb_write_file($fname,$s); - } - if (isset($activedb->tables[$table])) { - $oldtab = $activedb->tables[$table]; - - if ($oldtab) $activetab->_belongsTo = $oldtab->_belongsTo; - if ($oldtab) $activetab->_hasMany = $oldtab->_hasMany; - } - $activedb->tables[$table] = $activetab; - } - - function GetPrimaryKeys(&$db, $table) - { - return $db->MetaPrimaryKeys($table); - } - - // error handler for both PHP4+5. - function Error($err,$fn) - { - global $_ADODB_ACTIVE_DBS; - - $fn = get_class($this).'::'.$fn; - $this->_lasterr = $fn.': '.$err; - - if ($this->_dbat < 0) $db = false; - else { - $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; - $db = $activedb->db; - } - - if (function_exists('adodb_throw')) { - if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false); - else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db); - } else - if (!$db || $db->debug) ADOConnection::outp($this->_lasterr); - - } - - // return last error message - function ErrorMsg() - { - if (!function_exists('adodb_throw')) { - if ($this->_dbat < 0) $db = false; - else $db = $this->DB(); - - // last error could be database error too - if ($db && $db->ErrorMsg()) return $db->ErrorMsg(); - } - return $this->_lasterr; - } - - function ErrorNo() - { - if ($this->_dbat < 0) return -9999; // no database connection... - $db = $this->DB(); - - return (int) $db->ErrorNo(); - } - - - // retrieve ADOConnection from _ADODB_Active_DBs - function DB() - { - global $_ADODB_ACTIVE_DBS; - - if ($this->_dbat < 0) { - $false = false; - $this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB"); - return $false; - } - $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; - $db = $activedb->db; - return $db; - } - - // retrieve ADODB_Active_Table - function &TableInfo() - { - global $_ADODB_ACTIVE_DBS; - $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; - $table = $activedb->tables[$this->_tableat]; - return $table; - } - - - // I have an ON INSERT trigger on a table that sets other columns in the table. - // So, I find that for myTable, I want to reload an active record after saving it. -- Malcolm Cook - function Reload() - { - $db =& $this->DB(); if (!$db) return false; - $table =& $this->TableInfo(); - $where = $this->GenWhere($db, $table); - return($this->Load($where)); - } - - - // set a numeric array (using natural table field ordering) as object properties - function Set(&$row) - { - global $ACTIVE_RECORD_SAFETY; - - $db = $this->DB(); - - if (!$row) { - $this->_saved = false; - return false; - } - - $this->_saved = true; - - $table = $this->TableInfo(); - if ($ACTIVE_RECORD_SAFETY && sizeof($table->flds) != sizeof($row)) { - # - $bad_size = TRUE; - if (sizeof($row) == 2 * sizeof($table->flds)) { - // Only keep string keys - $keys = array_filter(array_keys($row), 'is_string'); - if (sizeof($keys) == sizeof($table->flds)) - $bad_size = FALSE; - } - if ($bad_size) { - $this->Error("Table structure of $this->_table has changed","Load"); - return false; - } - # - } - else - $keys = array_keys($row); - - # - reset($keys); - $this->_original = array(); - foreach($table->flds as $name=>$fld) { - $value = $row[current($keys)]; - $this->$name = $value; - $this->_original[] = $value; - next($keys); - } - - # - return true; - } - - // get last inserted id for INSERT - function LastInsertID(&$db,$fieldname) - { - if ($db->hasInsertID) - $val = $db->Insert_ID($this->_table,$fieldname); - else - $val = false; - - if (is_null($val) || $val === false) { - // this might not work reliably in multi-user environment - return $db->GetOne("select max(".$fieldname.") from ".$this->_table); - } - return $val; - } - - // quote data in where clause - function doquote(&$db, $val,$t) - { - switch($t) { - case 'D': - case 'T': - if (empty($val)) return 'null'; - - case 'B': - case 'N': - case 'C': - case 'X': - if (is_null($val)) return 'null'; - - if (strlen($val)>1 && - (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) { - return $db->qstr($val); - break; - } - default: - return $val; - break; - } - } - - // generate where clause for an UPDATE/SELECT - function GenWhere(&$db, &$table) - { - $keys = $table->keys; - $parr = array(); - - foreach($keys as $k) { - $f = $table->flds[$k]; - if ($f) { - $parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type)); - } - } - return implode(' and ', $parr); - } - - - function _QName($n,$db=false) - { - if (!ADODB_Active_Record::$_quoteNames) return $n; - if (!$db) $db = $this->DB(); if (!$db) return false; - return $db->nameQuote.$n.$db->nameQuote; - } - - //------------------------------------------------------------ Public functions below - - function Load($where=null,$bindarr=false) - { - global $ADODB_FETCH_MODE; - - $db = $this->DB(); if (!$db) return false; - $this->_where = $where; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false); - - $qry = "select * from ".$this->_table; - - if($where) { - $qry .= ' WHERE '.$where; - } - $row = $db->GetRow($qry,$bindarr); - - if (isset($savem)) $db->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - return $this->Set($row); - } - - # useful for multiple record inserts - # see http://phplens.com/lens/lensforum/msgs.php?id=17795 - function Reset() - { - $this->_where=null; - $this->_saved = false; - $this->_lasterr = false; - $this->_original = false; - $vars=get_object_vars($this); - foreach($vars as $k=>$v){ - if(substr($k,0,1)!=='_'){ - $this->{$k}=null; - } - } - $this->foreignName=strtolower(get_class($this)); - return true; - } - - // false on error - function Save() - { - if ($this->_saved) $ok = $this->Update(); - else $ok = $this->Insert(); - - return $ok; - } - - - // false on error - function Insert() - { - $db = $this->DB(); if (!$db) return false; - $cnt = 0; - $table = $this->TableInfo(); - - $valarr = array(); - $names = array(); - $valstr = array(); - - foreach($table->flds as $name=>$fld) { - $val = $this->$name; - if(!is_array($val) || !is_null($val) || !array_key_exists($name, $table->keys)) { - $valarr[] = $val; - $names[] = $this->_QName($name,$db); - $valstr[] = $db->Param($cnt); - $cnt += 1; - } - } - - if (empty($names)){ - foreach($table->flds as $name=>$fld) { - $valarr[] = null; - $names[] = $name; - $valstr[] = $db->Param($cnt); - $cnt += 1; - } - } - $sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')'; - $ok = $db->Execute($sql,$valarr); - - if ($ok) { - $this->_saved = true; - $autoinc = false; - foreach($table->keys as $k) { - if (is_null($this->$k)) { - $autoinc = true; - break; - } - } - if ($autoinc && sizeof($table->keys) == 1) { - $k = reset($table->keys); - $this->$k = $this->LastInsertID($db,$k); - } - } - - $this->_original = $valarr; - return !empty($ok); - } - - function Delete() - { - $db = $this->DB(); if (!$db) return false; - $table = $this->TableInfo(); - - $where = $this->GenWhere($db,$table); - $sql = 'DELETE FROM '.$this->_table.' WHERE '.$where; - $ok = $db->Execute($sql); - - return $ok ? true : false; - } - - // returns an array of active record objects - function Find($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array()) - { - $db = $this->DB(); if (!$db || empty($this->_table)) return false; - $arr = $db->GetActiveRecordsClass(get_class($this),$this->_table, $whereOrderBy,$bindarr,$pkeysArr,$extra); - return $arr; - } - - // returns 0 on error, 1 on update, 2 on insert - function Replace() - { - global $ADODB_ASSOC_CASE; - - $db = $this->DB(); if (!$db) return false; - $table = $this->TableInfo(); - - $pkey = $table->keys; - - foreach($table->flds as $name=>$fld) { - $val = $this->$name; - /* - if (is_null($val)) { - if (isset($fld->not_null) && $fld->not_null) { - if (isset($fld->default_value) && strlen($fld->default_value)) continue; - else { - $this->Error("Cannot update null into $name","Replace"); - return false; - } - } - }*/ - if (is_null($val) && !empty($fld->auto_increment)) { - continue; - } - - if (is_array($val)) continue; - - $t = $db->MetaType($fld->type); - $arr[$name] = $this->doquote($db,$val,$t); - $valarr[] = $val; - } - - if (!is_array($pkey)) $pkey = array($pkey); - - - if ($ADODB_ASSOC_CASE == 0) - foreach($pkey as $k => $v) - $pkey[$k] = strtolower($v); - elseif ($ADODB_ASSOC_CASE == 1) - foreach($pkey as $k => $v) - $pkey[$k] = strtoupper($v); - - $ok = $db->Replace($this->_table,$arr,$pkey); - if ($ok) { - $this->_saved = true; // 1= update 2=insert - if ($ok == 2) { - $autoinc = false; - foreach($table->keys as $k) { - if (is_null($this->$k)) { - $autoinc = true; - break; - } - } - if ($autoinc && sizeof($table->keys) == 1) { - $k = reset($table->keys); - $this->$k = $this->LastInsertID($db,$k); - } - } - - $this->_original = $valarr; - } - return $ok; - } - - // returns 0 on error, 1 on update, -1 if no change in data (no update) - function Update() - { - $db = $this->DB(); if (!$db) return false; - $table = $this->TableInfo(); - - $where = $this->GenWhere($db, $table); - - if (!$where) { - $this->error("Where missing for table $table", "Update"); - return false; - } - $valarr = array(); - $neworig = array(); - $pairs = array(); - $i = -1; - $cnt = 0; - foreach($table->flds as $name=>$fld) { - $i += 1; - $val = $this->$name; - $neworig[] = $val; - - if (isset($table->keys[$name]) || is_array($val)) - continue; - - if (is_null($val)) { - if (isset($fld->not_null) && $fld->not_null) { - if (isset($fld->default_value) && strlen($fld->default_value)) continue; - else { - $this->Error("Cannot set field $name to NULL","Update"); - return false; - } - } - } - - if (isset($this->_original[$i]) && $val == $this->_original[$i]) { - continue; - } - $valarr[] = $val; - $pairs[] = $this->_QName($name,$db).'='.$db->Param($cnt); - $cnt += 1; - } - - - if (!$cnt) return -1; - $sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where; - $ok = $db->Execute($sql,$valarr); - if ($ok) { - $this->_original = $neworig; - return 1; - } - return 0; - } - - function GetAttributeNames() - { - $table = $this->TableInfo(); - if (!$table) return false; - return array_keys($table->flds); - } - -}; - -function adodb_GetActiveRecordsClass(&$db, $class, $table,$whereOrderBy,$bindarr, $primkeyArr, -$extra) -{ - global $_ADODB_ACTIVE_DBS; - - - $save = $db->SetFetchMode(ADODB_FETCH_NUM); - $qry = "select * from ".$table; - - if (!empty($whereOrderBy)) - $qry .= ' WHERE '.$whereOrderBy; - if(isset($extra['limit'])) - { - $rows = false; - if(isset($extra['offset'])) { - $rs = $db->SelectLimit($qry, $extra['limit'], $extra['offset'],$bindarr); - } else { - $rs = $db->SelectLimit($qry, $extra['limit'],-1,$bindarr); - } - if ($rs) { - while (!$rs->EOF) { - $rows[] = $rs->fields; - $rs->MoveNext(); - } - } - } else - $rows = $db->GetAll($qry,$bindarr); - - $db->SetFetchMode($save); - - $false = false; - - if ($rows === false) { - return $false; - } - - - if (!class_exists($class)) { - $db->outp_throw("Unknown class $class in GetActiveRecordsClass()",'GetActiveRecordsClass'); - return $false; - } - $arr = array(); - // arrRef will be the structure that knows about our objects. - // It is an associative array. - // We will, however, return arr, preserving regular 0.. order so that - // obj[0] can be used by app developpers. - $arrRef = array(); - $bTos = array(); // Will store belongTo's indices if any - foreach($rows as $row) { - - $obj = new $class($table,$primkeyArr,$db); - if ($obj->ErrorNo()){ - $db->_errorMsg = $obj->ErrorMsg(); - return $false; - } - $obj->Set($row); - $arr[] = $obj; - } // foreach($rows as $row) - - return $arr; -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-active-recordx.inc.php b/include/limesurvey/classes/adodb/adodb-active-recordx.inc.php deleted file mode 100644 index c1994607..00000000 --- a/include/limesurvey/classes/adodb/adodb-active-recordx.inc.php +++ /dev/null @@ -1,1421 +0,0 @@ -_dbat -$_ADODB_ACTIVE_DBS = array(); -$ACTIVE_RECORD_SAFETY = true; // CFR: disabled while playing with relations -$ADODB_ACTIVE_DEFVALS = false; - -class ADODB_Active_DB { - var $db; // ADOConnection - var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename -} - -class ADODB_Active_Table { - var $name; // table name - var $flds; // assoc array of adofieldobjs, indexed by fieldname - var $keys; // assoc array of primary keys, indexed by fieldname - var $_created; // only used when stored as a cached file - var $_belongsTo = array(); - var $_hasMany = array(); - var $_colsCount; // total columns count, including relations - - function updateColsCount() - { - $this->_colsCount = sizeof($this->flds); - foreach($this->_belongsTo as $foreignTable) - $this->_colsCount += sizeof($foreignTable->TableInfo()->flds); - foreach($this->_hasMany as $foreignTable) - $this->_colsCount += sizeof($foreignTable->TableInfo()->flds); - } -} - -// returns index into $_ADODB_ACTIVE_DBS -function ADODB_SetDatabaseAdapter(&$db) -{ - global $_ADODB_ACTIVE_DBS; - - foreach($_ADODB_ACTIVE_DBS as $k => $d) { - if (PHP_VERSION >= 5) { - if ($d->db === $db) return $k; - } else { - if ($d->db->_connectionID === $db->_connectionID && $db->database == $d->db->database) - return $k; - } - } - - $obj = new ADODB_Active_DB(); - $obj->db = $db; - $obj->tables = array(); - - $_ADODB_ACTIVE_DBS[] = $obj; - - return sizeof($_ADODB_ACTIVE_DBS)-1; -} - - -class ADODB_Active_Record { - static $_changeNames = true; // dynamically pluralize table names - static $_foreignSuffix = '_id'; // - var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat] - var $_table; // tablename, if set in class definition then use it as table name - var $_sTable; // singularized table name - var $_pTable; // pluralized table name - var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat] - var $_where; // where clause set in Load() - var $_saved = false; // indicates whether data is already inserted. - var $_lasterr = false; // last error message - var $_original = false; // the original values loaded or inserted, refreshed on update - - var $foreignName; // CFR: class name when in a relationship - - static function UseDefaultValues($bool=null) - { - global $ADODB_ACTIVE_DEFVALS; - if (isset($bool)) $ADODB_ACTIVE_DEFVALS = $bool; - return $ADODB_ACTIVE_DEFVALS; - } - - // should be static - static function SetDatabaseAdapter(&$db) - { - return ADODB_SetDatabaseAdapter($db); - } - - - public function __set($name, $value) - { - $name = str_replace(' ', '_', $name); - $this->$name = $value; - } - - // php5 constructor - // Note: if $table is defined, then we will use it as our table name - // Otherwise we will use our classname... - // In our database, table names are pluralized (because there can be - // more than one row!) - // Similarly, if $table is defined here, it has to be plural form. - // - // $options is an array that allows us to tweak the constructor's behaviour - // if $options['refresh'] is true, we re-scan our metadata information - // if $options['new'] is true, we forget all relations - function __construct($table = false, $pkeyarr=false, $db=false, $options=array()) - { - global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS; - - if ($db == false && is_object($pkeyarr)) { - $db = $pkeyarr; - $pkeyarr = false; - } - - if($table) - { - // table argument exists. It is expected to be - // already plural form. - $this->_pTable = $table; - $this->_sTable = $this->_singularize($this->_pTable); - } - else - { - // We will use current classname as table name. - // We need to pluralize it for the real table name. - $this->_sTable = strtolower(get_class($this)); - $this->_pTable = $this->_pluralize($this->_sTable); - } - $this->_table = &$this->_pTable; - - $this->foreignName = $this->_sTable; // CFR: default foreign name (singular) - - if ($db) { - $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db); - } else - $this->_dbat = sizeof($_ADODB_ACTIVE_DBS)-1; - - - if ($this->_dbat < 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor'); - - $this->_tableat = $this->_table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future - - // CFR: Just added this option because UpdateActiveTable() can refresh its information - // but there was no way to ask it to do that. - $forceUpdate = (isset($options['refresh']) && true === $options['refresh']); - $this->UpdateActiveTable($pkeyarr, $forceUpdate); - if(isset($options['new']) && true === $options['new']) - { - $table =& $this->TableInfo(); - unset($table->_hasMany); - unset($table->_belongsTo); - $table->_hasMany = array(); - $table->_belongsTo = array(); - } - } - - function __wakeup() - { - $class = get_class($this); - new $class; - } - - // CFR: Constants found in Rails - static $IrregularP = array( - 'PERSON' => 'people', - 'MAN' => 'men', - 'WOMAN' => 'women', - 'CHILD' => 'children', - 'COW' => 'kine', - ); - - static $IrregularS = array( - 'PEOPLE' => 'PERSON', - 'MEN' => 'man', - 'WOMEN' => 'woman', - 'CHILDREN' => 'child', - 'KINE' => 'cow', - ); - - static $WeIsI = array( - 'EQUIPMENT' => true, - 'INFORMATION' => true, - 'RICE' => true, - 'MONEY' => true, - 'SPECIES' => true, - 'SERIES' => true, - 'FISH' => true, - 'SHEEP' => true, - ); - - function _pluralize($table) - { - if (!ADODB_Active_Record::$_changeNames) return $table; - - $ut = strtoupper($table); - if(isset(self::$WeIsI[$ut])) - { - return $table; - } - if(isset(self::$IrregularP[$ut])) - { - return self::$IrregularP[$ut]; - } - $len = strlen($table); - $lastc = $ut[$len-1]; - $lastc2 = substr($ut,$len-2); - switch ($lastc) { - case 'S': - return $table.'es'; - case 'Y': - return substr($table,0,$len-1).'ies'; - case 'X': - return $table.'es'; - case 'H': - if ($lastc2 == 'CH' || $lastc2 == 'SH') - return $table.'es'; - default: - return $table.'s'; - } - } - - // CFR Lamest singular inflector ever - @todo Make it real! - // Note: There is an assumption here...and it is that the argument's length >= 4 - function _singularize($table) - { - - if (!ADODB_Active_Record::$_changeNames) return $table; - - $ut = strtoupper($table); - if(isset(self::$WeIsI[$ut])) - { - return $table; - } - if(isset(self::$IrregularS[$ut])) - { - return self::$IrregularS[$ut]; - } - $len = strlen($table); - if($ut[$len-1] != 'S') - return $table; // I know...forget oxen - if($ut[$len-2] != 'E') - return substr($table, 0, $len-1); - switch($ut[$len-3]) - { - case 'S': - case 'X': - return substr($table, 0, $len-2); - case 'I': - return substr($table, 0, $len-3) . 'y'; - case 'H'; - if($ut[$len-4] == 'C' || $ut[$len-4] == 'S') - return substr($table, 0, $len-2); - default: - return substr($table, 0, $len-1); // ? - } - } - - /* - * ar->foreignName will contain the name of the tables associated with this table because - * these other tables' rows may also be referenced by this table using theirname_id or the provided - * foreign keys (this index name is stored in ar->foreignKey) - * - * this-table.id = other-table-#1.this-table_id - * = other-table-#2.this-table_id - */ - function hasMany($foreignRef,$foreignKey=false) - { - $ar = new ADODB_Active_Record($foreignRef); - $ar->foreignName = $foreignRef; - $ar->UpdateActiveTable(); - $ar->foreignKey = ($foreignKey) ? $foreignKey : strtolower(get_class($this)) . self::$_foreignSuffix; - - $table =& $this->TableInfo(); - if(!isset($table->_hasMany[$foreignRef])) - { - $table->_hasMany[$foreignRef] = $ar; - $table->updateColsCount(); - } - # @todo Can I make this guy be lazy? - $this->$foreignRef = $table->_hasMany[$foreignRef]; // WATCHME Removed assignment by ref. to please __get() - } - - /** - * ar->foreignName will contain the name of the tables associated with this table because - * this table's rows may also be referenced by those tables using thistable_id or the provided - * foreign keys (this index name is stored in ar->foreignKey) - * - * this-table.other-table_id = other-table.id - */ - function belongsTo($foreignRef,$foreignKey=false) - { - global $inflector; - - $ar = new ADODB_Active_Record($this->_pluralize($foreignRef)); - $ar->foreignName = $foreignRef; - $ar->UpdateActiveTable(); - $ar->foreignKey = ($foreignKey) ? $foreignKey : $ar->foreignName . self::$_foreignSuffix; - - $table =& $this->TableInfo(); - if(!isset($table->_belongsTo[$foreignRef])) - { - $table->_belongsTo[$foreignRef] = $ar; - $table->updateColsCount(); - } - $this->$foreignRef = $table->_belongsTo[$foreignRef]; - } - - /** - * __get Access properties - used for lazy loading - * - * @param mixed $name - * @access protected - * @return void - */ - function __get($name) - { - return $this->LoadRelations($name, '', -1. -1); - } - - function LoadRelations($name, $whereOrderBy, $offset=-1, $limit=-1) - { - $extras = array(); - if($offset >= 0) $extras['offset'] = $offset; - if($limit >= 0) $extras['limit'] = $limit; - $table =& $this->TableInfo(); - - if (strlen($whereOrderBy)) - if (!preg_match('/^[ \n\r]*AND/i',$whereOrderBy)) - if (!preg_match('/^[ \n\r]*ORDER[ \n\r]/i',$whereOrderBy)) - $whereOrderBy = 'AND '.$whereOrderBy; - - if(!empty($table->_belongsTo[$name])) - { - $obj = $table->_belongsTo[$name]; - $columnName = $obj->foreignKey; - if(empty($this->$columnName)) - $this->$name = null; - else - { - if(($k = reset($obj->TableInfo()->keys))) - $belongsToId = $k; - else - $belongsToId = 'id'; - - $arrayOfOne = - $obj->Find( - $belongsToId.'='.$this->$columnName.' '.$whereOrderBy, false, false, $extras); - $this->$name = $arrayOfOne[0]; - } - return $this->$name; - } - if(!empty($table->_hasMany[$name])) - { - $obj = $table->_hasMany[$name]; - if(($k = reset($table->keys))) - $hasManyId = $k; - else - $hasManyId = 'id'; - - $this->$name = - $obj->Find( - $obj->foreignKey.'='.$this->$hasManyId.' '.$whereOrderBy, false, false, $extras); - return $this->$name; - } - } - ////////////////////////////////// - - // update metadata - function UpdateActiveTable($pkeys=false,$forceUpdate=false) - { - global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS; - global $ADODB_ACTIVE_DEFVALS, $ADODB_FETCH_MODE; - - $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; - - $table = $this->_table; - $tables = $activedb->tables; - $tableat = $this->_tableat; - if (!$forceUpdate && !empty($tables[$tableat])) { - - $tobj = $tables[$tableat]; - foreach($tobj->flds as $name => $fld) { - if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value)) - $this->$name = $fld->default_value; - else - $this->$name = null; - } - return; - } - - $db = $activedb->db; - $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache'; - if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) { - $fp = fopen($fname,'r'); - @flock($fp, LOCK_SH); - $acttab = unserialize(fread($fp,100000)); - fclose($fp); - if ($acttab->_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) > time()) { - // abs(rand()) randomizes deletion, reducing contention to delete/refresh file - // ideally, you should cache at least 32 secs - $activedb->tables[$table] = $acttab; - - //if ($db->debug) ADOConnection::outp("Reading cached active record file: $fname"); - return; - } else if ($db->debug) { - ADOConnection::outp("Refreshing cached active record file: $fname"); - } - } - $activetab = new ADODB_Active_Table(); - $activetab->name = $table; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false); - - $cols = $db->MetaColumns($table); - - if (isset($savem)) $db->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if (!$cols) { - $this->Error("Invalid table name: $table",'UpdateActiveTable'); - return false; - } - $fld = reset($cols); - if (!$pkeys) { - if (isset($fld->primary_key)) { - $pkeys = array(); - foreach($cols as $name => $fld) { - if (!empty($fld->primary_key)) $pkeys[] = $name; - } - } else - $pkeys = $this->GetPrimaryKeys($db, $table); - } - if (empty($pkeys)) { - $this->Error("No primary key found for table $table",'UpdateActiveTable'); - return false; - } - - $attr = array(); - $keys = array(); - - switch($ADODB_ASSOC_CASE) { - case 0: - foreach($cols as $name => $fldobj) { - $name = strtolower($name); - if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) - $this->$name = $fldobj->default_value; - else - $this->$name = null; - $attr[$name] = $fldobj; - } - foreach($pkeys as $k => $name) { - $keys[strtolower($name)] = strtolower($name); - } - break; - - case 1: - foreach($cols as $name => $fldobj) { - $name = strtoupper($name); - - if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) - $this->$name = $fldobj->default_value; - else - $this->$name = null; - $attr[$name] = $fldobj; - } - - foreach($pkeys as $k => $name) { - $keys[strtoupper($name)] = strtoupper($name); - } - break; - default: - foreach($cols as $name => $fldobj) { - $name = ($fldobj->name); - - if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value)) - $this->$name = $fldobj->default_value; - else - $this->$name = null; - $attr[$name] = $fldobj; - } - foreach($pkeys as $k => $name) { - $keys[$name] = $cols[$name]->name; - } - break; - } - - $activetab->keys = $keys; - $activetab->flds = $attr; - $activetab->updateColsCount(); - - if ($ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR) { - $activetab->_created = time(); - $s = serialize($activetab); - if (!function_exists('adodb_write_file')) include(ADODB_DIR.'/adodb-csvlib.inc.php'); - adodb_write_file($fname,$s); - } - if (isset($activedb->tables[$table])) { - $oldtab = $activedb->tables[$table]; - - if ($oldtab) $activetab->_belongsTo = $oldtab->_belongsTo; - if ($oldtab) $activetab->_hasMany = $oldtab->_hasMany; - } - $activedb->tables[$table] = $activetab; - } - - function GetPrimaryKeys(&$db, $table) - { - return $db->MetaPrimaryKeys($table); - } - - // error handler for both PHP4+5. - function Error($err,$fn) - { - global $_ADODB_ACTIVE_DBS; - - $fn = get_class($this).'::'.$fn; - $this->_lasterr = $fn.': '.$err; - - if ($this->_dbat < 0) $db = false; - else { - $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; - $db = $activedb->db; - } - - if (function_exists('adodb_throw')) { - if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false); - else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db); - } else - if (!$db || $db->debug) ADOConnection::outp($this->_lasterr); - - } - - // return last error message - function ErrorMsg() - { - if (!function_exists('adodb_throw')) { - if ($this->_dbat < 0) $db = false; - else $db = $this->DB(); - - // last error could be database error too - if ($db && $db->ErrorMsg()) return $db->ErrorMsg(); - } - return $this->_lasterr; - } - - function ErrorNo() - { - if ($this->_dbat < 0) return -9999; // no database connection... - $db = $this->DB(); - - return (int) $db->ErrorNo(); - } - - - // retrieve ADOConnection from _ADODB_Active_DBs - function DB() - { - global $_ADODB_ACTIVE_DBS; - - if ($this->_dbat < 0) { - $false = false; - $this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB"); - return $false; - } - $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; - $db = $activedb->db; - return $db; - } - - // retrieve ADODB_Active_Table - function &TableInfo() - { - global $_ADODB_ACTIVE_DBS; - - $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; - $table = $activedb->tables[$this->_tableat]; - return $table; - } - - - // I have an ON INSERT trigger on a table that sets other columns in the table. - // So, I find that for myTable, I want to reload an active record after saving it. -- Malcolm Cook - function Reload() - { - $db =& $this->DB(); if (!$db) return false; - $table =& $this->TableInfo(); - $where = $this->GenWhere($db, $table); - return($this->Load($where)); - } - - - // set a numeric array (using natural table field ordering) as object properties - function Set(&$row) - { - global $ACTIVE_RECORD_SAFETY; - - $db = $this->DB(); - - if (!$row) { - $this->_saved = false; - return false; - } - - $this->_saved = true; - - $table = $this->TableInfo(); - $sizeofFlds = sizeof($table->flds); - $sizeofRow = sizeof($row); - if ($ACTIVE_RECORD_SAFETY && $table->_colsCount != $sizeofRow && $sizeofFlds != $sizeofRow) { - # - $bad_size = TRUE; - if($sizeofRow == 2 * $table->_colsCount || $sizeofRow == 2 * $sizeofFlds) { - // Only keep string keys - $keys = array_filter(array_keys($row), 'is_string'); - if (sizeof($keys) == sizeof($table->flds)) - $bad_size = FALSE; - } - if ($bad_size) { - $this->Error("Table structure of $this->_table has changed","Load"); - return false; - } - # - } - else - $keys = array_keys($row); - # - reset($keys); - $this->_original = array(); - foreach($table->flds as $name=>$fld) - { - $value = $row[current($keys)]; - $this->$name = $value; - $this->_original[] = $value; - if(!next($keys)) break; - } - $table =& $this->TableInfo(); - foreach($table->_belongsTo as $foreignTable) - { - $ft = $foreignTable->TableInfo(); - $propertyName = $ft->name; - foreach($ft->flds as $name=>$fld) - { - $value = $row[current($keys)]; - $foreignTable->$name = $value; - $foreignTable->_original[] = $value; - if(!next($keys)) break; - } - } - foreach($table->_hasMany as $foreignTable) - { - $ft = $foreignTable->TableInfo(); - foreach($ft->flds as $name=>$fld) - { - $value = $row[current($keys)]; - $foreignTable->$name = $value; - $foreignTable->_original[] = $value; - if(!next($keys)) break; - } - } - # - return true; - } - - // get last inserted id for INSERT - function LastInsertID(&$db,$fieldname) - { - if ($db->hasInsertID) - $val = $db->Insert_ID($this->_table,$fieldname); - else - $val = false; - - if (is_null($val) || $val === false) { - // this might not work reliably in multi-user environment - return $db->GetOne("select max(".$fieldname.") from ".$this->_table); - } - return $val; - } - - // quote data in where clause - function doquote(&$db, $val,$t) - { - switch($t) { - case 'D': - case 'T': - if (empty($val)) return 'null'; - - case 'C': - case 'X': - if (is_null($val)) return 'null'; - - if (strlen($val)>1 && - (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) { - return $db->qstr($val); - break; - } - default: - return $val; - break; - } - } - - // generate where clause for an UPDATE/SELECT - function GenWhere(&$db, &$table) - { - $keys = $table->keys; - $parr = array(); - - foreach($keys as $k) { - $f = $table->flds[$k]; - if ($f) { - $parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type)); - } - } - return implode(' and ', $parr); - } - - - //------------------------------------------------------------ Public functions below - - function Load($where=null,$bindarr=false) - { - $db = $this->DB(); if (!$db) return false; - $this->_where = $where; - - $save = $db->SetFetchMode(ADODB_FETCH_NUM); - $qry = "select * from ".$this->_table; - $table =& $this->TableInfo(); - - if(($k = reset($table->keys))) - $hasManyId = $k; - else - $hasManyId = 'id'; - - foreach($table->_belongsTo as $foreignTable) - { - if(($k = reset($foreignTable->TableInfo()->keys))) - { - $belongsToId = $k; - } - else - { - $belongsToId = 'id'; - } - $qry .= ' LEFT JOIN '.$foreignTable->_table.' ON '. - $this->_table.'.'.$foreignTable->foreignKey.'='. - $foreignTable->_table.'.'.$belongsToId; - } - foreach($table->_hasMany as $foreignTable) - { - $qry .= ' LEFT JOIN '.$foreignTable->_table.' ON '. - $this->_table.'.'.$hasManyId.'='. - $foreignTable->_table.'.'.$foreignTable->foreignKey; - } - if($where) - $qry .= ' WHERE '.$where; - - // Simple case: no relations. Load row and return. - if((count($table->_hasMany) + count($table->_belongsTo)) < 1) - { - $row = $db->GetRow($qry,$bindarr); - if(!$row) - return false; - $db->SetFetchMode($save); - return $this->Set($row); - } - - // More complex case when relations have to be collated - $rows = $db->GetAll($qry,$bindarr); - if(!$rows) - return false; - $db->SetFetchMode($save); - if(count($rows) < 1) - return false; - $class = get_class($this); - $isFirstRow = true; - - if(($k = reset($this->TableInfo()->keys))) - $myId = $k; - else - $myId = 'id'; - $index = 0; $found = false; - /** @todo Improve by storing once and for all in table metadata */ - /** @todo Also re-use info for hasManyId */ - foreach($this->TableInfo()->flds as $fld) - { - if($fld->name == $myId) - { - $found = true; - break; - } - $index++; - } - if(!$found) - $this->outp_throw("Unable to locate key $myId for $class in Load()",'Load'); - - foreach($rows as $row) - { - $rowId = intval($row[$index]); - if($rowId > 0) - { - if($isFirstRow) - { - $isFirstRow = false; - if(!$this->Set($row)) - return false; - } - $obj = new $class($table,false,$db); - $obj->Set($row); - // TODO Copy/paste code below: bad! - if(count($table->_hasMany) > 0) - { - foreach($table->_hasMany as $foreignTable) - { - $foreignName = $foreignTable->foreignName; - if(!empty($obj->$foreignName)) - { - if(!is_array($this->$foreignName)) - { - $foreignObj = $this->$foreignName; - $this->$foreignName = array(clone($foreignObj)); - } - else - { - $foreignObj = $obj->$foreignName; - array_push($this->$foreignName, clone($foreignObj)); - } - } - } - } - if(count($table->_belongsTo) > 0) - { - foreach($table->_belongsTo as $foreignTable) - { - $foreignName = $foreignTable->foreignName; - if(!empty($obj->$foreignName)) - { - if(!is_array($this->$foreignName)) - { - $foreignObj = $this->$foreignName; - $this->$foreignName = array(clone($foreignObj)); - } - else - { - $foreignObj = $obj->$foreignName; - array_push($this->$foreignName, clone($foreignObj)); - } - } - } - } - } - } - return true; - } - - // false on error - function Save() - { - if ($this->_saved) $ok = $this->Update(); - else $ok = $this->Insert(); - - return $ok; - } - - // CFR: Sometimes we may wish to consider that an object is not to be replaced but inserted. - // Sample use case: an 'undo' command object (after a delete()) - function Dirty() - { - $this->_saved = false; - } - - // false on error - function Insert() - { - $db = $this->DB(); if (!$db) return false; - $cnt = 0; - $table = $this->TableInfo(); - - $valarr = array(); - $names = array(); - $valstr = array(); - - foreach($table->flds as $name=>$fld) { - $val = $this->$name; - if(!is_null($val) || !array_key_exists($name, $table->keys)) { - $valarr[] = $val; - $names[] = $name; - $valstr[] = $db->Param($cnt); - $cnt += 1; - } - } - - if (empty($names)){ - foreach($table->flds as $name=>$fld) { - $valarr[] = null; - $names[] = $name; - $valstr[] = $db->Param($cnt); - $cnt += 1; - } - } - $sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')'; - $ok = $db->Execute($sql,$valarr); - - if ($ok) { - $this->_saved = true; - $autoinc = false; - foreach($table->keys as $k) { - if (is_null($this->$k)) { - $autoinc = true; - break; - } - } - if ($autoinc && sizeof($table->keys) == 1) { - $k = reset($table->keys); - $this->$k = $this->LastInsertID($db,$k); - } - } - - $this->_original = $valarr; - return !empty($ok); - } - - function Delete() - { - $db = $this->DB(); if (!$db) return false; - $table = $this->TableInfo(); - - $where = $this->GenWhere($db,$table); - $sql = 'DELETE FROM '.$this->_table.' WHERE '.$where; - $ok = $db->Execute($sql); - - return $ok ? true : false; - } - - // returns an array of active record objects - function Find($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array()) - { - $db = $this->DB(); if (!$db || empty($this->_table)) return false; - $table =& $this->TableInfo(); - $arr = $db->GetActiveRecordsClass(get_class($this),$this, $whereOrderBy,$bindarr,$pkeysArr,$extra, - array('foreignName'=>$this->foreignName, 'belongsTo'=>$table->_belongsTo, 'hasMany'=>$table->_hasMany)); - return $arr; - } - - // CFR: In introduced this method to ensure that inner workings are not disturbed by - // subclasses...for instance when GetActiveRecordsClass invokes Find() - // Why am I not invoking parent::Find? - // Shockingly because I want to preserve PHP4 compatibility. - function packageFind($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array()) - { - $db = $this->DB(); if (!$db || empty($this->_table)) return false; - $table =& $this->TableInfo(); - $arr = $db->GetActiveRecordsClass(get_class($this),$this, $whereOrderBy,$bindarr,$pkeysArr,$extra, - array('foreignName'=>$this->foreignName, 'belongsTo'=>$table->_belongsTo, 'hasMany'=>$table->_hasMany)); - return $arr; - } - - // returns 0 on error, 1 on update, 2 on insert - function Replace() - { - global $ADODB_ASSOC_CASE; - - $db = $this->DB(); if (!$db) return false; - $table = $this->TableInfo(); - - $pkey = $table->keys; - - foreach($table->flds as $name=>$fld) { - $val = $this->$name; - /* - if (is_null($val)) { - if (isset($fld->not_null) && $fld->not_null) { - if (isset($fld->default_value) && strlen($fld->default_value)) continue; - else { - $this->Error("Cannot update null into $name","Replace"); - return false; - } - } - }*/ - if (is_null($val) && !empty($fld->auto_increment)) { - continue; - } - $t = $db->MetaType($fld->type); - $arr[$name] = $this->doquote($db,$val,$t); - $valarr[] = $val; - } - - if (!is_array($pkey)) $pkey = array($pkey); - - - if ($ADODB_ASSOC_CASE == 0) - foreach($pkey as $k => $v) - $pkey[$k] = strtolower($v); - elseif ($ADODB_ASSOC_CASE == 1) - foreach($pkey as $k => $v) - $pkey[$k] = strtoupper($v); - - $ok = $db->Replace($this->_table,$arr,$pkey); - if ($ok) { - $this->_saved = true; // 1= update 2=insert - if ($ok == 2) { - $autoinc = false; - foreach($table->keys as $k) { - if (is_null($this->$k)) { - $autoinc = true; - break; - } - } - if ($autoinc && sizeof($table->keys) == 1) { - $k = reset($table->keys); - $this->$k = $this->LastInsertID($db,$k); - } - } - - $this->_original = $valarr; - } - return $ok; - } - - // returns 0 on error, 1 on update, -1 if no change in data (no update) - function Update() - { - $db = $this->DB(); if (!$db) return false; - $table = $this->TableInfo(); - - $where = $this->GenWhere($db, $table); - - if (!$where) { - $this->error("Where missing for table $table", "Update"); - return false; - } - $valarr = array(); - $neworig = array(); - $pairs = array(); - $i = -1; - $cnt = 0; - foreach($table->flds as $name=>$fld) { - $i += 1; - $val = $this->$name; - $neworig[] = $val; - - if (isset($table->keys[$name])) { - continue; - } - - if (is_null($val)) { - if (isset($fld->not_null) && $fld->not_null) { - if (isset($fld->default_value) && strlen($fld->default_value)) continue; - else { - $this->Error("Cannot set field $name to NULL","Update"); - return false; - } - } - } - - if (isset($this->_original[$i]) && $val == $this->_original[$i]) { - continue; - } - $valarr[] = $val; - $pairs[] = $name.'='.$db->Param($cnt); - $cnt += 1; - } - - - if (!$cnt) return -1; - $sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where; - $ok = $db->Execute($sql,$valarr); - if ($ok) { - $this->_original = $neworig; - return 1; - } - return 0; - } - - function GetAttributeNames() - { - $table = $this->TableInfo(); - if (!$table) return false; - return array_keys($table->flds); - } - -}; - -function adodb_GetActiveRecordsClass(&$db, $class, $tableObj,$whereOrderBy,$bindarr, $primkeyArr, -$extra, $relations) -{ - global $_ADODB_ACTIVE_DBS; - - if (empty($extra['loading'])) $extra['loading'] = ADODB_LAZY_AR; - - $save = $db->SetFetchMode(ADODB_FETCH_NUM); - $table = &$tableObj->_table; - $tableInfo =& $tableObj->TableInfo(); - if(($k = reset($tableInfo->keys))) - $myId = $k; - else - $myId = 'id'; - $index = 0; $found = false; - /** @todo Improve by storing once and for all in table metadata */ - /** @todo Also re-use info for hasManyId */ - foreach($tableInfo->flds as $fld) - { - if($fld->name == $myId) - { - $found = true; - break; - } - $index++; - } - if(!$found) - $db->outp_throw("Unable to locate key $myId for $class in GetActiveRecordsClass()",'GetActiveRecordsClass'); - - $qry = "select * from ".$table; - if(ADODB_JOIN_AR == $extra['loading']) - { - if(!empty($relations['belongsTo'])) - { - foreach($relations['belongsTo'] as $foreignTable) - { - if(($k = reset($foreignTable->TableInfo()->keys))) - { - $belongsToId = $k; - } - else - { - $belongsToId = 'id'; - } - - $qry .= ' LEFT JOIN '.$foreignTable->_table.' ON '. - $table.'.'.$foreignTable->foreignKey.'='. - $foreignTable->_table.'.'.$belongsToId; - } - } - if(!empty($relations['hasMany'])) - { - if(empty($relations['foreignName'])) - $db->outp_throw("Missing foreignName is relation specification in GetActiveRecordsClass()",'GetActiveRecordsClass'); - if(($k = reset($tableInfo->keys))) - $hasManyId = $k; - else - $hasManyId = 'id'; - - foreach($relations['hasMany'] as $foreignTable) - { - $qry .= ' LEFT JOIN '.$foreignTable->_table.' ON '. - $table.'.'.$hasManyId.'='. - $foreignTable->_table.'.'.$foreignTable->foreignKey; - } - } - } - if (!empty($whereOrderBy)) - $qry .= ' WHERE '.$whereOrderBy; - if(isset($extra['limit'])) - { - $rows = false; - if(isset($extra['offset'])) { - $rs = $db->SelectLimit($qry, $extra['limit'], $extra['offset']); - } else { - $rs = $db->SelectLimit($qry, $extra['limit']); - } - if ($rs) { - while (!$rs->EOF) { - $rows[] = $rs->fields; - $rs->MoveNext(); - } - } - } else - $rows = $db->GetAll($qry,$bindarr); - - $db->SetFetchMode($save); - - $false = false; - - if ($rows === false) { - return $false; - } - - - if (!isset($_ADODB_ACTIVE_DBS)) { - include(ADODB_DIR.'/adodb-active-record.inc.php'); - } - if (!class_exists($class)) { - $db->outp_throw("Unknown class $class in GetActiveRecordsClass()",'GetActiveRecordsClass'); - return $false; - } - $uniqArr = array(); // CFR Keep track of records for relations - $arr = array(); - // arrRef will be the structure that knows about our objects. - // It is an associative array. - // We will, however, return arr, preserving regular 0.. order so that - // obj[0] can be used by app developpers. - $arrRef = array(); - $bTos = array(); // Will store belongTo's indices if any - foreach($rows as $row) { - - $obj = new $class($table,$primkeyArr,$db); - if ($obj->ErrorNo()){ - $db->_errorMsg = $obj->ErrorMsg(); - return $false; - } - $obj->Set($row); - // CFR: FIXME: Insane assumption here: - // If the first column returned is an integer, then it's a 'id' field - // And to make things a bit worse, I use intval() rather than is_int() because, in fact, - // $row[0] is not an integer. - // - // So, what does this whole block do? - // When relationships are found, we perform JOINs. This is fast. But not accurate: - // instead of returning n objects with their n' associated cousins, - // we get n*n' objects. This code fixes this. - // Note: to-many relationships mess around with the 'limit' parameter - $rowId = intval($row[$index]); - - if(ADODB_WORK_AR == $extra['loading']) - { - $arrRef[$rowId] = $obj; - $arr[] = &$arrRef[$rowId]; - if(!isset($indices)) - $indices = $rowId; - else - $indices .= ','.$rowId; - if(!empty($relations['belongsTo'])) - { - foreach($relations['belongsTo'] as $foreignTable) - { - $foreignTableRef = $foreignTable->foreignKey; - // First array: list of foreign ids we are looking for - if(empty($bTos[$foreignTableRef])) - $bTos[$foreignTableRef] = array(); - // Second array: list of ids found - if(empty($obj->$foreignTableRef)) - continue; - if(empty($bTos[$foreignTableRef][$obj->$foreignTableRef])) - $bTos[$foreignTableRef][$obj->$foreignTableRef] = array(); - $bTos[$foreignTableRef][$obj->$foreignTableRef][] = $obj; - } - } - continue; - } - - if($rowId>0) - { - if(ADODB_JOIN_AR == $extra['loading']) - { - $isNewObj = !isset($uniqArr['_'.$row[0]]); - if($isNewObj) - $uniqArr['_'.$row[0]] = $obj; - - // TODO Copy/paste code below: bad! - if(!empty($relations['hasMany'])) - { - foreach($relations['hasMany'] as $foreignTable) - { - $foreignName = $foreignTable->foreignName; - if(!empty($obj->$foreignName)) - { - $masterObj = &$uniqArr['_'.$row[0]]; - // Assumption: this property exists in every object since they are instances of the same class - if(!is_array($masterObj->$foreignName)) - { - // Pluck! - $foreignObj = $masterObj->$foreignName; - $masterObj->$foreignName = array(clone($foreignObj)); - } - else - { - // Pluck pluck! - $foreignObj = $obj->$foreignName; - array_push($masterObj->$foreignName, clone($foreignObj)); - } - } - } - } - if(!empty($relations['belongsTo'])) - { - foreach($relations['belongsTo'] as $foreignTable) - { - $foreignName = $foreignTable->foreignName; - if(!empty($obj->$foreignName)) - { - $masterObj = &$uniqArr['_'.$row[0]]; - // Assumption: this property exists in every object since they are instances of the same class - if(!is_array($masterObj->$foreignName)) - { - // Pluck! - $foreignObj = $masterObj->$foreignName; - $masterObj->$foreignName = array(clone($foreignObj)); - } - else - { - // Pluck pluck! - $foreignObj = $obj->$foreignName; - array_push($masterObj->$foreignName, clone($foreignObj)); - } - } - } - } - if(!$isNewObj) - unset($obj); // We do not need this object itself anymore and do not want it re-added to the main array - } - else if(ADODB_LAZY_AR == $extra['loading']) - { - // Lazy loading: we need to give AdoDb a hint that we have not really loaded - // anything, all the while keeping enough information on what we wish to load. - // Let's do this by keeping the relevant info in our relationship arrays - // but get rid of the actual properties. - // We will then use PHP's __get to load these properties on-demand. - if(!empty($relations['hasMany'])) - { - foreach($relations['hasMany'] as $foreignTable) - { - $foreignName = $foreignTable->foreignName; - if(!empty($obj->$foreignName)) - { - unset($obj->$foreignName); - } - } - } - if(!empty($relations['belongsTo'])) - { - foreach($relations['belongsTo'] as $foreignTable) - { - $foreignName = $foreignTable->foreignName; - if(!empty($obj->$foreignName)) - { - unset($obj->$foreignName); - } - } - } - } - } - - if(isset($obj)) - $arr[] = $obj; - } - - if(ADODB_WORK_AR == $extra['loading']) - { - // The best of both worlds? - // Here, the number of queries is constant: 1 + n*relationship. - // The second query will allow us to perform a good join - // while preserving LIMIT etc. - if(!empty($relations['hasMany'])) - { - foreach($relations['hasMany'] as $foreignTable) - { - $foreignName = $foreignTable->foreignName; - $className = ucfirst($foreignTable->_singularize($foreignName)); - $obj = new $className(); - $dbClassRef = $foreignTable->foreignKey; - $objs = $obj->packageFind($dbClassRef.' IN ('.$indices.')'); - foreach($objs as $obj) - { - if(!is_array($arrRef[$obj->$dbClassRef]->$foreignName)) - $arrRef[$obj->$dbClassRef]->$foreignName = array(); - array_push($arrRef[$obj->$dbClassRef]->$foreignName, $obj); - } - } - - } - if(!empty($relations['belongsTo'])) - { - foreach($relations['belongsTo'] as $foreignTable) - { - $foreignTableRef = $foreignTable->foreignKey; - if(empty($bTos[$foreignTableRef])) - continue; - if(($k = reset($foreignTable->TableInfo()->keys))) - { - $belongsToId = $k; - } - else - { - $belongsToId = 'id'; - } - $origObjsArr = $bTos[$foreignTableRef]; - $bTosString = implode(',', array_keys($bTos[$foreignTableRef])); - $foreignName = $foreignTable->foreignName; - $className = ucfirst($foreignTable->_singularize($foreignName)); - $obj = new $className(); - $objs = $obj->packageFind($belongsToId.' IN ('.$bTosString.')'); - foreach($objs as $obj) - { - foreach($origObjsArr[$obj->$belongsToId] as $idx=>$origObj) - { - $origObj->$foreignName = $obj; - } - } - } - } - } - - return $arr; -} -?> diff --git a/include/limesurvey/classes/adodb/adodb-csvlib.inc.php b/include/limesurvey/classes/adodb/adodb-csvlib.inc.php deleted file mode 100644 index f9bc328d..00000000 --- a/include/limesurvey/classes/adodb/adodb-csvlib.inc.php +++ /dev/null @@ -1,318 +0,0 @@ -FieldCount() : 0; - - if ($sql) $sql = urlencode($sql); - // metadata setup - - if ($max <= 0 || $rs->dataProvider == 'empty') { // is insert/update/delete - if (is_object($conn)) { - $sql .= ','.$conn->Affected_Rows(); - $sql .= ','.$conn->Insert_ID(); - } else - $sql .= ',,'; - - $text = "====-1,0,$sql\n"; - return $text; - } - $tt = ($rs->timeCreated) ? $rs->timeCreated : time(); - - ## changed format from ====0 to ====1 - $line = "====1,$tt,$sql\n"; - - if ($rs->databaseType == 'array') { - $rows = $rs->_array; - } else { - $rows = array(); - while (!$rs->EOF) { - $rows[] = $rs->fields; - $rs->MoveNext(); - } - } - - for($i=0; $i < $max; $i++) { - $o = $rs->FetchField($i); - $flds[] = $o; - } - - $savefetch = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode; - $class = $rs->connection->arrayClass; - $rs2 = new $class(); - $rs2->timeCreated = $rs->timeCreated; # memcache fix - $rs2->sql = $rs->sql; - $rs2->oldProvider = $rs->dataProvider; - $rs2->InitArrayFields($rows,$flds); - $rs2->fetchMode = $savefetch; - return $line.serialize($rs2); -} - - -/** - * Open CSV file and convert it into Data. - * - * @param url file/ftp/http url - * @param err returns the error message - * @param timeout dispose if recordset has been alive for $timeout secs - * - * @return recordset, or false if error occured. If no - * error occurred in sql INSERT/UPDATE/DELETE, - * empty recordset is returned - */ -function csv2rs($url,&$err,$timeout=0, $rsclass='ADORecordSet_array') -{ - $false = false; - $err = false; - $fp = @fopen($url,'rb'); - if (!$fp) { - $err = $url.' file/URL not found'; - return $false; - } - @flock($fp, LOCK_SH); - $arr = array(); - $ttl = 0; - - if ($meta = fgetcsv($fp, 32000, ",")) { - // check if error message - if (strncmp($meta[0],'****',4) === 0) { - $err = trim(substr($meta[0],4,1024)); - fclose($fp); - return $false; - } - // check for meta data - // $meta[0] is -1 means return an empty recordset - // $meta[1] contains a time - - if (strncmp($meta[0], '====',4) === 0) { - - if ($meta[0] == "====-1") { - if (sizeof($meta) < 5) { - $err = "Corrupt first line for format -1"; - fclose($fp); - return $false; - } - fclose($fp); - - if ($timeout > 0) { - $err = " Illegal Timeout $timeout "; - return $false; - } - - $rs = new $rsclass($val=true); - $rs->fields = array(); - $rs->timeCreated = $meta[1]; - $rs->EOF = true; - $rs->_numOfFields = 0; - $rs->sql = urldecode($meta[2]); - $rs->affectedrows = (integer)$meta[3]; - $rs->insertid = $meta[4]; - return $rs; - } - # Under high volume loads, we want only 1 thread/process to _write_file - # so that we don't have 50 processes queueing to write the same data. - # We use probabilistic timeout, ahead of time. - # - # -4 sec before timeout, give processes 1/32 chance of timing out - # -2 sec before timeout, give processes 1/16 chance of timing out - # -1 sec after timeout give processes 1/4 chance of timing out - # +0 sec after timeout, give processes 100% chance of timing out - if (sizeof($meta) > 1) { - if($timeout >0){ - $tdiff = (integer)( $meta[1]+$timeout - time()); - if ($tdiff <= 2) { - switch($tdiff) { - case 4: - case 3: - if ((rand() & 31) == 0) { - fclose($fp); - $err = "Timeout 3"; - return $false; - } - break; - case 2: - if ((rand() & 15) == 0) { - fclose($fp); - $err = "Timeout 2"; - return $false; - } - break; - case 1: - if ((rand() & 3) == 0) { - fclose($fp); - $err = "Timeout 1"; - return $false; - } - break; - default: - fclose($fp); - $err = "Timeout 0"; - return $false; - } // switch - - } // if check flush cache - }// (timeout>0) - $ttl = $meta[1]; - } - //================================================ - // new cache format - use serialize extensively... - if ($meta[0] === '====1') { - // slurp in the data - $MAXSIZE = 128000; - - $text = fread($fp,$MAXSIZE); - if (strlen($text)) { - while ($txt = fread($fp,$MAXSIZE)) { - $text .= $txt; - } - } - fclose($fp); - $rs = unserialize($text); - if (is_object($rs)) $rs->timeCreated = $ttl; - else { - $err = "Unable to unserialize recordset"; - //echo htmlspecialchars($text),' !--END--!

        '; - } - return $rs; - } - - $meta = false; - $meta = fgetcsv($fp, 32000, ","); - if (!$meta) { - fclose($fp); - $err = "Unexpected EOF 1"; - return $false; - } - } - - // Get Column definitions - $flds = array(); - foreach($meta as $o) { - $o2 = explode(':',$o); - if (sizeof($o2)!=3) { - $arr[] = $meta; - $flds = false; - break; - } - $fld = new ADOFieldObject(); - $fld->name = urldecode($o2[0]); - $fld->type = $o2[1]; - $fld->max_length = $o2[2]; - $flds[] = $fld; - } - } else { - fclose($fp); - $err = "Recordset had unexpected EOF 2"; - return $false; - } - - // slurp in the data - $MAXSIZE = 128000; - - $text = ''; - while ($txt = fread($fp,$MAXSIZE)) { - $text .= $txt; - } - - fclose($fp); - @$arr = unserialize($text); - //var_dump($arr); - if (!is_array($arr)) { - $err = "Recordset had unexpected EOF (in serialized recordset)"; - if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!"; - return $false; - } - $rs = new $rsclass(); - $rs->timeCreated = $ttl; - $rs->InitArrayFields($arr,$flds); - return $rs; -} - - -/** - * Save a file $filename and its $contents (normally for caching) with file locking - * Returns true if ok, false if fopen/fwrite error, 0 if rename error (eg. file is locked) - */ -function adodb_write_file($filename, $contents,$debug=false) -{ - # http://www.php.net/bugs.php?id=9203 Bug that flock fails on Windows - # So to simulate locking, we assume that rename is an atomic operation. - # First we delete $filename, then we create a $tempfile write to it and - # rename to the desired $filename. If the rename works, then we successfully - # modified the file exclusively. - # What a stupid need - having to simulate locking. - # Risks: - # 1. $tempfile name is not unique -- very very low - # 2. unlink($filename) fails -- ok, rename will fail - # 3. adodb reads stale file because unlink fails -- ok, $rs timeout occurs - # 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated - if (strncmp(PHP_OS,'WIN',3) === 0) { - // skip the decimal place - $mtime = substr(str_replace(' ','_',microtime()),2); - // getmypid() actually returns 0 on Win98 - never mind! - $tmpname = $filename.uniqid($mtime).getmypid(); - if (!($fd = @fopen($tmpname,'w'))) return false; - if (fwrite($fd,$contents)) $ok = true; - else $ok = false; - fclose($fd); - - if ($ok) { - @chmod($tmpname,0644); - // the tricky moment - @unlink($filename); - if (!@rename($tmpname,$filename)) { - unlink($tmpname); - $ok = 0; - } - if (!$ok) { - if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed')); - } - } - return $ok; - } - if (!($fd = @fopen($filename, 'a'))) return false; - if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) { - if (fwrite( $fd, $contents )) $ok = true; - else $ok = false; - fclose($fd); - @chmod($filename,0644); - }else { - fclose($fd); - if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename
        \n"); - $ok = false; - } - - return $ok; -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-datadict.inc.php b/include/limesurvey/classes/adodb/adodb-datadict.inc.php deleted file mode 100644 index 3d75d75b..00000000 --- a/include/limesurvey/classes/adodb/adodb-datadict.inc.php +++ /dev/null @@ -1,1008 +0,0 @@ -$str

        "; - $a= Lens_ParseArgs($str); - print "
        ";
        -    print_r($a);
        -    print "
        "; -} - - -if (!function_exists('ctype_alnum')) { - function ctype_alnum($text) { - return preg_match('/^[a-z0-9]*$/i', $text); - } -} - -//Lens_ParseTest(); - -/** - Parse arguments, treat "text" (text) and 'text' as quotation marks. - To escape, use "" or '' or )) - - Will read in "abc def" sans quotes, as: abc def - Same with 'abc def'. - However if `abc def`, then will read in as `abc def` - - @param endstmtchar Character that indicates end of statement - @param tokenchars Include the following characters in tokens apart from A-Z and 0-9 - @returns 2 dimensional array containing parsed tokens. - */ -function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-') -{ - $pos = 0; - $intoken = false; - $stmtno = 0; - $endquote = false; - $tokens = array(); - $tokens[$stmtno] = array(); - $max = strlen($args); - $quoted = false; - $tokarr = array(); - - while ($pos < $max) { - $ch = substr($args,$pos,1); - switch($ch) { - case ' ': - case "\t": - case "\n": - case "\r": - if (!$quoted) { - if ($intoken) { - $intoken = false; - $tokens[$stmtno][] = implode('',$tokarr); - } - break; - } - - $tokarr[] = $ch; - break; - - case '`': - if ($intoken) $tokarr[] = $ch; - case '(': - case ')': - case '"': - case "'": - - if ($intoken) { - if (empty($endquote)) { - $tokens[$stmtno][] = implode('',$tokarr); - if ($ch == '(') $endquote = ')'; - else $endquote = $ch; - $quoted = true; - $intoken = true; - $tokarr = array(); - } else if ($endquote == $ch) { - $ch2 = substr($args,$pos+1,1); - if ($ch2 == $endquote) { - $pos += 1; - $tokarr[] = $ch2; - } else { - $quoted = false; - $intoken = false; - $tokens[$stmtno][] = implode('',$tokarr); - $endquote = ''; - } - } else - $tokarr[] = $ch; - - }else { - - if ($ch == '(') $endquote = ')'; - else $endquote = $ch; - $quoted = true; - $intoken = true; - $tokarr = array(); - if ($ch == '`') $tokarr[] = '`'; - } - break; - - default: - - if (!$intoken) { - if ($ch == $endstmtchar) { - $stmtno += 1; - $tokens[$stmtno] = array(); - break; - } - - $intoken = true; - $quoted = false; - $endquote = false; - $tokarr = array(); - - } - - if ($quoted) $tokarr[] = $ch; - else if (ctype_alnum($ch) || strpos($tokenchars,$ch) !== false) $tokarr[] = $ch; - else { - if ($ch == $endstmtchar) { - $tokens[$stmtno][] = implode('',$tokarr); - $stmtno += 1; - $tokens[$stmtno] = array(); - $intoken = false; - $tokarr = array(); - break; - } - $tokens[$stmtno][] = implode('',$tokarr); - $tokens[$stmtno][] = $ch; - $intoken = false; - } - } - $pos += 1; - } - if ($intoken) $tokens[$stmtno][] = implode('',$tokarr); - - return $tokens; -} - - -class ADODB_DataDict { - var $connection; - var $debug = false; - var $dropTable = 'DROP TABLE %s'; - var $renameTable = 'RENAME TABLE %s TO %s'; - var $dropIndex = 'DROP INDEX %s'; - var $addCol = ' ADD'; - var $alterCol = ' ALTER COLUMN'; - var $dropCol = ' DROP COLUMN'; - var $renameColumn = 'ALTER TABLE %s RENAME COLUMN %s TO %s'; // table, old-column, new-column, column-definitions (not used by default) - var $nameRegex = '\w'; - var $nameRegexBrackets = 'a-zA-Z0-9_\(\)'; - var $schema = false; - var $serverInfo = array(); - var $autoIncrement = false; - var $dataProvider; - var $invalidResizeTypes4 = array('CLOB','BLOB','TEXT','DATE','TIME'); // for changetablesql - var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob - /// in other words, we use a text area for editting. - - function GetCommentSQL($table,$col) - { - return false; - } - - function SetCommentSQL($table,$col,$cmt) - { - return false; - } - - function MetaTables() - { - if (!$this->connection->IsConnected()) return array(); - return $this->connection->MetaTables(); - } - - function MetaColumns($tab, $upper=true, $schema=false) - { - if (!$this->connection->IsConnected()) return array(); - return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema); - } - - function MetaPrimaryKeys($tab,$owner=false,$intkey=false) - { - if (!$this->connection->IsConnected()) return array(); - return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey); - } - - function MetaIndexes($table, $primary = false, $owner = false) - { - if (!$this->connection->IsConnected()) return array(); - return $this->connection->MetaIndexes($this->TableName($table), $primary, $owner); - } - - function MetaType($t,$len=-1,$fieldobj=false) - { - static $typeMap = array( - 'VARCHAR' => 'C', - 'VARCHAR2' => 'C', - 'CHAR' => 'C', - 'C' => 'C', - 'STRING' => 'C', - 'NCHAR' => 'C', - 'NVARCHAR' => 'C', - 'VARYING' => 'C', - 'BPCHAR' => 'C', - 'CHARACTER' => 'C', - 'INTERVAL' => 'C', # Postgres - 'MACADDR' => 'C', # postgres - 'VAR_STRING' => 'C', # mysql - ## - 'LONGCHAR' => 'X', - 'TEXT' => 'X', - 'NTEXT' => 'X', - 'M' => 'X', - 'X' => 'X', - 'CLOB' => 'X', - 'NCLOB' => 'X', - 'LVARCHAR' => 'X', - ## - 'BLOB' => 'B', - 'IMAGE' => 'B', - 'BINARY' => 'B', - 'VARBINARY' => 'B', - 'LONGBINARY' => 'B', - 'B' => 'B', - ## - 'YEAR' => 'D', // mysql - 'DATE' => 'D', - 'D' => 'D', - ## - 'UNIQUEIDENTIFIER' => 'C', # MS SQL Server - ## - 'TIME' => 'T', - 'TIMESTAMP' => 'T', - 'DATETIME' => 'T', - 'TIMESTAMPTZ' => 'T', - 'SMALLDATETIME' => 'T', - 'T' => 'T', - 'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql - ## - 'BOOL' => 'L', - 'BOOLEAN' => 'L', - 'BIT' => 'L', - 'L' => 'L', - ## - 'COUNTER' => 'R', - 'R' => 'R', - 'SERIAL' => 'R', // ifx - 'INT IDENTITY' => 'R', - ## - 'INT' => 'I', - 'INT2' => 'I', - 'INT4' => 'I', - 'INT8' => 'I', - 'INTEGER' => 'I', - 'INTEGER UNSIGNED' => 'I', - 'SHORT' => 'I', - 'TINYINT' => 'I', - 'SMALLINT' => 'I', - 'I' => 'I', - ## - 'LONG' => 'N', // interbase is numeric, oci8 is blob - 'BIGINT' => 'N', // this is bigger than PHP 32-bit integers - 'DECIMAL' => 'N', - 'DEC' => 'N', - 'REAL' => 'N', - 'DOUBLE' => 'N', - 'DOUBLE PRECISION' => 'N', - 'SMALLFLOAT' => 'N', - 'FLOAT' => 'N', - 'NUMBER' => 'N', - 'NUM' => 'N', - 'NUMERIC' => 'N', - 'MONEY' => 'N', - - ## informix 9.2 - 'SQLINT' => 'I', - 'SQLSERIAL' => 'I', - 'SQLSMINT' => 'I', - 'SQLSMFLOAT' => 'N', - 'SQLFLOAT' => 'N', - 'SQLMONEY' => 'N', - 'SQLDECIMAL' => 'N', - 'SQLDATE' => 'D', - 'SQLVCHAR' => 'C', - 'SQLCHAR' => 'C', - 'SQLDTIME' => 'T', - 'SQLINTERVAL' => 'N', - 'SQLBYTES' => 'B', - 'SQLTEXT' => 'X', - ## informix 10 - "SQLINT8" => 'I8', - "SQLSERIAL8" => 'I8', - "SQLNCHAR" => 'C', - "SQLNVCHAR" => 'C', - "SQLLVARCHAR" => 'X', - "SQLBOOL" => 'L' - ); - - if (!$this->connection->IsConnected()) { - $t = strtoupper($t); - if (isset($typeMap[$t])) return $typeMap[$t]; - return 'N'; - } - return $this->connection->MetaType($t,$len,$fieldobj); - } - - function NameQuote($name = NULL,$allowBrackets=false) - { - if (!is_string($name)) { - return FALSE; - } - - $name = trim($name); - - if ( !is_object($this->connection) ) { - return $name; - } - - $quote = $this->connection->nameQuote; - - // if name is of the form `name`, quote it - if ( preg_match('/^`(.+)`$/', $name, $matches) ) { - return $quote . $matches[1] . $quote; - } - - // if name contains special characters, quote it - $regex = ($allowBrackets) ? $this->nameRegexBrackets : $this->nameRegex; - - if ( !preg_match('/^[' . $regex . ']+$/', $name) ) { - return $quote . $name . $quote; - } - - return $name; - } - - function TableName($name) - { - if ( $this->schema ) { - return $this->NameQuote($this->schema) .'.'. $this->NameQuote($name); - } - return $this->NameQuote($name); - } - - // Executes the sql array returned by GetTableSQL and GetIndexSQL - function ExecuteSQLArray($sql, $continueOnError = true) - { - $rez = 2; - $conn = $this->connection; - $saved = $conn->debug; - foreach($sql as $line) { - - if ($this->debug) $conn->debug = true; - $ok = $conn->Execute($line); - $conn->debug = $saved; - if (!$ok) { - if ($this->debug) ADOConnection::outp($conn->ErrorMsg()); - if (!$continueOnError) return 0; - $rez = 1; - } - } - return $rez; - } - - /** - Returns the actual type given a character code. - - C: varchar - X: CLOB (character large object) or largest varchar size if CLOB is not supported - C2: Multibyte varchar - X2: Multibyte CLOB - - B: BLOB (binary large object) - - D: Date - T: Date-time - L: Integer field suitable for storing booleans (0 or 1) - I: Integer - F: Floating point number - N: Numeric or decimal number - */ - - function ActualType($meta) - { - return $meta; - } - - function CreateDatabase($dbname,$options=false) - { - $options = $this->_Options($options); - $sql = array(); - - $s = 'CREATE DATABASE ' . $this->NameQuote($dbname); - if (isset($options[$this->upperName])) - $s .= ' '.$options[$this->upperName]; - - $sql[] = $s; - return $sql; - } - - /* - Generates the SQL to create index. Returns an array of sql strings. - */ - function CreateIndexSQL($idxname, $tabname, $flds, $idxoptions = false) - { - if (!is_array($flds)) { - $flds = explode(',',$flds); - } - - foreach($flds as $key => $fld) { - # some indexes can use partial fields, eg. index first 32 chars of "name" with NAME(32) - $flds[$key] = $this->NameQuote($fld,$allowBrackets=true); - } - - return $this->_IndexSQL($this->NameQuote($idxname), $this->TableName($tabname), $flds, $this->_Options($idxoptions)); - } - - function DropIndexSQL ($idxname, $tabname = NULL) - { - return array(sprintf($this->dropIndex, $this->NameQuote($idxname), $this->TableName($tabname))); - } - - function SetSchema($schema) - { - $this->schema = $schema; - } - - function AddColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $sql = array(); - list($lines,$pkey,$idxs) = $this->_GenFields($flds); - // genfields can return FALSE at times - if ($lines == null) $lines = array(); - $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' '; - foreach($lines as $v) { - $sql[] = $alter . $v; - } - if (is_array($idxs)) { - foreach($idxs as $idx => $idxdef) { - $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); - $sql = array_merge($sql, $sql_idxs); - } - } - return $sql; - } - - /** - * Change the definition of one column - * - * As some DBM's can't do that on there own, you need to supply the complete defintion of the new table, - * to allow, recreating the table and copying the content over to the new table - * @param string $tabname table-name - * @param string $flds column-name and type for the changed column - * @param string $tableflds='' complete defintion of the new table, eg. for postgres, default '' - * @param array/string $tableoptions='' options for the new table see CreateTableSQL, default '' - * @return array with SQL strings - */ - function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') - { - $tabname = $this->TableName ($tabname); - $sql = array(); - list($lines,$pkey,$idxs) = $this->_GenFields($flds); - // genfields can return FALSE at times - if ($lines == null) $lines = array(); - $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' '; - foreach($lines as $v) { - $sql[] = $alter . $v; - } - if (is_array($idxs)) { - foreach($idxs as $idx => $idxdef) { - $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); - $sql = array_merge($sql, $sql_idxs); - } - - } - return $sql; - } - - /** - * Rename one column - * - * Some DBM's can only do this together with changeing the type of the column (even if that stays the same, eg. mysql) - * @param string $tabname table-name - * @param string $oldcolumn column-name to be renamed - * @param string $newcolumn new column-name - * @param string $flds='' complete column-defintion-string like for AddColumnSQL, only used by mysql atm., default='' - * @return array with SQL strings - */ - function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='') - { - $tabname = $this->TableName ($tabname); - if ($flds) { - list($lines,$pkey,$idxs) = $this->_GenFields($flds); - // genfields can return FALSE at times - if ($lines == null) $lines = array(); - list(,$first) = each($lines); - list(,$column_def) = preg_split("/[\t ]+/",$first,2); - } - return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def)); - } - - /** - * Drop one column - * - * Some DBM's can't do that on there own, you need to supply the complete defintion of the new table, - * to allow, recreating the table and copying the content over to the new table - * @param string $tabname table-name - * @param string $flds column-name and type for the changed column - * @param string $tableflds='' complete defintion of the new table, eg. for postgres, default '' - * @param array/string $tableoptions='' options for the new table see CreateTableSQL, default '' - * @return array with SQL strings - */ - function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') - { - $tabname = $this->TableName ($tabname); - if (!is_array($flds)) $flds = explode(',',$flds); - $sql = array(); - $alter = 'ALTER TABLE ' . $tabname . $this->dropCol . ' '; - foreach($flds as $v) { - $sql[] = $alter . $this->NameQuote($v); - } - return $sql; - } - - function DropTableSQL($tabname) - { - return array (sprintf($this->dropTable, $this->TableName($tabname))); - } - - function RenameTableSQL($tabname,$newname) - { - return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname))); - } - - /** - Generate the SQL to create table. Returns an array of sql strings. - */ - function CreateTableSQL($tabname, $flds, $tableoptions=array()) - { - list($lines,$pkey,$idxs) = $this->_GenFields($flds, true); - // genfields can return FALSE at times - if ($lines == null) $lines = array(); - - $taboptions = $this->_Options($tableoptions); - $tabname = $this->TableName ($tabname); - $sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions); - - // ggiunta - 2006/10/12 - KLUDGE: - // if we are on autoincrement, and table options includes REPLACE, the - // autoincrement sequence has already been dropped on table creation sql, so - // we avoid passing REPLACE to trigger creation code. This prevents - // creating sql that double-drops the sequence - if ($this->autoIncrement && isset($taboptions['REPLACE'])) - unset($taboptions['REPLACE']); - $tsql = $this->_Triggers($tabname,$taboptions); - foreach($tsql as $s) $sql[] = $s; - - if (is_array($idxs)) { - foreach($idxs as $idx => $idxdef) { - $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); - $sql = array_merge($sql, $sql_idxs); - } - } - - return $sql; - } - - function _GenFields($flds,$widespacing=false) - { - if (is_string($flds)) { - $padding = ' '; - $txt = $flds.$padding; - $flds = array(); - $flds0 = Lens_ParseArgs($txt,','); - $hasparam = false; - foreach($flds0 as $f0) { - $f1 = array(); - foreach($f0 as $token) { - switch (strtoupper($token)) { - case 'INDEX': - $f1['INDEX'] = ''; - // fall through intentionally - case 'CONSTRAINT': - case 'DEFAULT': - $hasparam = $token; - break; - default: - if ($hasparam) $f1[$hasparam] = $token; - else $f1[] = $token; - $hasparam = false; - break; - } - } - // 'index' token without a name means single column index: name it after column - if (array_key_exists('INDEX', $f1) && $f1['INDEX'] == '') { - $f1['INDEX'] = isset($f0['NAME']) ? $f0['NAME'] : $f0[0]; - // check if column name used to create an index name was quoted - if (($f1['INDEX'][0] == '"' || $f1['INDEX'][0] == "'" || $f1['INDEX'][0] == "`") && - ($f1['INDEX'][0] == substr($f1['INDEX'], -1))) { - $f1['INDEX'] = $f1['INDEX'][0].'idx_'.substr($f1['INDEX'], 1, -1).$f1['INDEX'][0]; - } - else - $f1['INDEX'] = 'idx_'.$f1['INDEX']; - } - // reset it, so we don't get next field 1st token as INDEX... - $hasparam = false; - - $flds[] = $f1; - - } - } - $this->autoIncrement = false; - $lines = array(); - $pkey = array(); - $idxs = array(); - foreach($flds as $fld) { - $fld = _array_change_key_case($fld); - - $fname = false; - $fdefault = false; - $fautoinc = false; - $ftype = false; - $fsize = false; - $fprec = false; - $fprimary = false; - $fnoquote = false; - $fdefts = false; - $fdefdate = false; - $fconstraint = false; - $fnotnull = false; - $funsigned = false; - $findex = ''; - $funiqueindex = false; - - //----------------- - // Parse attributes - foreach($fld as $attr => $v) { - if ($attr == 2 && is_numeric($v)) $attr = 'SIZE'; - else if (is_numeric($attr) && $attr > 1 && !is_numeric($v)) $attr = strtoupper($v); - - switch($attr) { - case '0': - case 'NAME': $fname = $v; break; - case '1': - case 'TYPE': $ty = $v; $ftype = $this->ActualType(strtoupper($v)); break; - - case 'SIZE': - $dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,','); - if ($dotat === false) $fsize = $v; - else { - $fsize = substr($v,0,$dotat); - $fprec = substr($v,$dotat+1); - } - break; - case 'UNSIGNED': $funsigned = true; break; - case 'AUTOINCREMENT': - case 'AUTO': $fautoinc = true; $fnotnull = true; break; - case 'KEY': - // a primary key col can be non unique in itself (if key spans many cols...) - case 'PRIMARY': $fprimary = $v; $fnotnull = true; /*$funiqueindex = true;*/ break; - case 'DEF': - case 'DEFAULT': $fdefault = $v; break; - case 'NOTNULL': $fnotnull = $v; break; - case 'NOQUOTE': $fnoquote = $v; break; - case 'DEFDATE': $fdefdate = $v; break; - case 'DEFTIMESTAMP': $fdefts = $v; break; - case 'CONSTRAINT': $fconstraint = $v; break; - // let INDEX keyword create a 'very standard' index on column - case 'INDEX': $findex = $v; break; - case 'UNIQUE': $funiqueindex = true; break; - } //switch - } // foreach $fld - - //-------------------- - // VALIDATE FIELD INFO - if (!strlen($fname)) { - if ($this->debug) ADOConnection::outp("Undefined NAME"); - return false; - } - - $fid = strtoupper(preg_replace('/^`(.+)`$/', '$1', $fname)); - $fname = $this->NameQuote($fname); - - if (!strlen($ftype)) { - if ($this->debug) ADOConnection::outp("Undefined TYPE for field '$fname'"); - return false; - } else { - $ftype = strtoupper($ftype); - } - - $ftype = $this->_GetSize($ftype, $ty, $fsize, $fprec); - - if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls - - if ($fprimary) $pkey[] = $fname; - - // some databases do not allow blobs to have defaults - if ($ty == 'X') $fdefault = false; - - // build list of indexes - if ($findex != '') { - if (array_key_exists($findex, $idxs)) { - $idxs[$findex]['cols'][] = ($fname); - if (in_array('UNIQUE', $idxs[$findex]['opts']) != $funiqueindex) { - if ($this->debug) ADOConnection::outp("Index $findex defined once UNIQUE and once not"); - } - if ($funiqueindex && !in_array('UNIQUE', $idxs[$findex]['opts'])) - $idxs[$findex]['opts'][] = 'UNIQUE'; - } - else - { - $idxs[$findex] = array(); - $idxs[$findex]['cols'] = array($fname); - if ($funiqueindex) - $idxs[$findex]['opts'] = array('UNIQUE'); - else - $idxs[$findex]['opts'] = array(); - } - } - - //-------------------- - // CONSTRUCT FIELD SQL - if ($fdefts) { - if (substr($this->connection->databaseType,0,5) == 'mysql') { - $ftype = 'TIMESTAMP'; - } else { - $fdefault = $this->connection->sysTimeStamp; - } - } else if ($fdefdate) { - if (substr($this->connection->databaseType,0,5) == 'mysql') { - $ftype = 'TIMESTAMP'; - } else { - $fdefault = $this->connection->sysDate; - } - } else if ($fdefault !== false && !$fnoquote) { - if ($ty == 'C' or $ty == 'X' or - ( substr($fdefault,0,1) != "'" && !is_numeric($fdefault))) { - - if (($ty == 'D' || $ty == 'T') && strtolower($fdefault) != 'null') { - // convert default date into database-aware code - if ($ty == 'T') - { - $fdefault = $this->connection->DBTimeStamp($fdefault); - } - else - { - $fdefault = $this->connection->DBDate($fdefault); - } - } - else - if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ') - $fdefault = trim($fdefault); - else if (strtolower($fdefault) != 'null') - $fdefault = $this->connection->qstr($fdefault); - } - } - $suffix = $this->_CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned); - - // add index creation - if ($widespacing) $fname = str_pad($fname,24); - - // check for field names appearing twice - if (array_key_exists($fid, $lines)) { - ADOConnection::outp("Field '$fname' defined twice"); - } - - $lines[$fid] = $fname.' '.$ftype.$suffix; - - if ($fautoinc) $this->autoIncrement = true; - } // foreach $flds - - return array($lines,$pkey,$idxs); - } - - /** - GENERATE THE SIZE PART OF THE DATATYPE - $ftype is the actual type - $ty is the type defined originally in the DDL - */ - function _GetSize($ftype, $ty, $fsize, $fprec) - { - if (strlen($fsize) && $ty != 'X' && $ty != 'B' && strpos($ftype,'(') === false) { - $ftype .= "(".$fsize; - if (strlen($fprec)) $ftype .= ",".$fprec; - $ftype .= ')'; - } - return $ftype; - } - - - // return string must begin with space - function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - $suffix = ''; - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fnotnull) $suffix .= ' NOT NULL'; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - - function _IndexSQL($idxname, $tabname, $flds, $idxoptions) - { - $sql = array(); - - if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { - $sql[] = sprintf ($this->dropIndex, $idxname); - if ( isset($idxoptions['DROP']) ) - return $sql; - } - - if ( empty ($flds) ) { - return $sql; - } - - $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; - - $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' '; - - if ( isset($idxoptions[$this->upperName]) ) - $s .= $idxoptions[$this->upperName]; - - if ( is_array($flds) ) - $flds = implode(', ',$flds); - $s .= '(' . $flds . ')'; - $sql[] = $s; - - return $sql; - } - - function _DropAutoIncrement($tabname) - { - return false; - } - - function _TableSQL($tabname,$lines,$pkey,$tableoptions) - { - $sql = array(); - - if (isset($tableoptions['REPLACE']) || isset ($tableoptions['DROP'])) { - $sql[] = sprintf($this->dropTable,$tabname); - if ($this->autoIncrement) { - $sInc = $this->_DropAutoIncrement($tabname); - if ($sInc) $sql[] = $sInc; - } - if ( isset ($tableoptions['DROP']) ) { - return $sql; - } - } - $s = "CREATE TABLE $tabname (\n"; - $s .= implode(",\n", $lines); - if (sizeof($pkey)>0) { - $s .= ",\n PRIMARY KEY ("; - $s .= implode(", ",$pkey).")"; - } - if (isset($tableoptions['CONSTRAINTS'])) - $s .= "\n".$tableoptions['CONSTRAINTS']; - - if (isset($tableoptions[$this->upperName.'_CONSTRAINTS'])) - $s .= "\n".$tableoptions[$this->upperName.'_CONSTRAINTS']; - - $s .= "\n)"; - if (isset($tableoptions[$this->upperName])) $s .= $tableoptions[$this->upperName]; - $sql[] = $s; - - return $sql; - } - - /** - GENERATE TRIGGERS IF NEEDED - used when table has auto-incrementing field that is emulated using triggers - */ - function _Triggers($tabname,$taboptions) - { - return array(); - } - - /** - Sanitize options, so that array elements with no keys are promoted to keys - */ - function _Options($opts) - { - if (!is_array($opts)) return array(); - $newopts = array(); - foreach($opts as $k => $v) { - if (is_numeric($k)) $newopts[strtoupper($v)] = $v; - else $newopts[strtoupper($k)] = $v; - } - return $newopts; - } - - /** - "Florian Buzin [ easywe ]" - - This function changes/adds new fields to your table. You don't - have to know if the col is new or not. It will check on its own. - */ - function ChangeTableSQL($tablename, $flds, $tableoptions = false, $dropOldFlds=false) - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - if ($this->connection->fetchMode !== false) $savem = $this->connection->SetFetchMode(false); - - // check table exists - $save_handler = $this->connection->raiseErrorFn; - $this->connection->raiseErrorFn = ''; - $cols = $this->MetaColumns($tablename); - $this->connection->raiseErrorFn = $save_handler; - - if (isset($savem)) $this->connection->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if ( empty($cols)) { - return $this->CreateTableSQL($tablename, $flds, $tableoptions); - } - - if (is_array($flds)) { - // Cycle through the update fields, comparing - // existing fields to fields to update. - // if the Metatype and size is exactly the - // same, ignore - by Mark Newham - $holdflds = array(); - foreach($flds as $k=>$v) { - if ( isset($cols[$k]) && is_object($cols[$k]) ) { - // If already not allowing nulls, then don't change - $obj = $cols[$k]; - if (isset($obj->not_null) && $obj->not_null) - $v = str_replace('NOT NULL','',$v); - if (isset($obj->auto_increment) && $obj->auto_increment && empty($v['AUTOINCREMENT'])) - $v = str_replace('AUTOINCREMENT','',$v); - - $c = $cols[$k]; - $ml = $c->max_length; - $mt = $this->MetaType($c->type,$ml); - if ($ml == -1) $ml = ''; - if ($mt == 'X') $ml = $v['SIZE']; - if (($mt != $v['TYPE']) || $ml != $v['SIZE'] || (isset($v['AUTOINCREMENT']) && $v['AUTOINCREMENT'] != $obj->auto_increment)) { - $holdflds[$k] = $v; - } - } else { - $holdflds[$k] = $v; - } - } - $flds = $holdflds; - } - - - // already exists, alter table instead - list($lines,$pkey,$idxs) = $this->_GenFields($flds); - // genfields can return FALSE at times - if ($lines == null) $lines = array(); - $alter = 'ALTER TABLE ' . $this->TableName($tablename); - $sql = array(); - - foreach ( $lines as $id => $v ) { - if ( isset($cols[$id]) && is_object($cols[$id]) ) { - - $flds = Lens_ParseArgs($v,','); - - // We are trying to change the size of the field, if not allowed, simply ignore the request. - // $flds[1] holds the type, $flds[2] holds the size -postnuke addition - if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4) - && (isset($flds[0][2]) && is_numeric($flds[0][2]))) { - if ($this->debug) ADOConnection::outp(sprintf("

        %s cannot be changed to %s currently

        ", $flds[0][0], $flds[0][1])); - #echo "

        $this->alterCol cannot be changed to $flds currently

        "; - continue; - } - $sql[] = $alter . $this->alterCol . ' ' . $v; - } else { - $sql[] = $alter . $this->addCol . ' ' . $v; - } - } - - if ($dropOldFlds) { - foreach ( $cols as $id => $v ) - if ( !isset($lines[$id]) ) - $sql[] = $alter . $this->dropCol . ' ' . $v->name; - } - return $sql; - } -} // class -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-error.inc.php b/include/limesurvey/classes/adodb/adodb-error.inc.php deleted file mode 100644 index 806dd568..00000000 --- a/include/limesurvey/classes/adodb/adodb-error.inc.php +++ /dev/null @@ -1,258 +0,0 @@ - DB_ERROR_NOSUCHTABLE, - '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/i' => DB_ERROR_ALREADY_EXISTS, - '/divide by zero$/i' => DB_ERROR_DIVZERO, - '/pg_atoi: error in .*: can\'t parse /i' => DB_ERROR_INVALID_NUMBER, - '/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/i' => DB_ERROR_NOSUCHFIELD, - '/parser: parse error at or near \"/i' => DB_ERROR_SYNTAX, - '/referential integrity violation/i' => DB_ERROR_CONSTRAINT, - '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/i' - => DB_ERROR_ALREADY_EXISTS - ); - reset($error_regexps); - while (list($regexp,$code) = each($error_regexps)) { - if (preg_match($regexp, $errormsg)) { - return $code; - } - } - // Fall back to DB_ERROR if there was no mapping. - return DB_ERROR; -} - -function adodb_error_odbc() -{ - static $MAP = array( - '01004' => DB_ERROR_TRUNCATED, - '07001' => DB_ERROR_MISMATCH, - '21S01' => DB_ERROR_MISMATCH, - '21S02' => DB_ERROR_MISMATCH, - '22003' => DB_ERROR_INVALID_NUMBER, - '22008' => DB_ERROR_INVALID_DATE, - '22012' => DB_ERROR_DIVZERO, - '23000' => DB_ERROR_CONSTRAINT, - '24000' => DB_ERROR_INVALID, - '34000' => DB_ERROR_INVALID, - '37000' => DB_ERROR_SYNTAX, - '42000' => DB_ERROR_SYNTAX, - 'IM001' => DB_ERROR_UNSUPPORTED, - 'S0000' => DB_ERROR_NOSUCHTABLE, - 'S0001' => DB_ERROR_NOT_FOUND, - 'S0002' => DB_ERROR_NOSUCHTABLE, - 'S0011' => DB_ERROR_ALREADY_EXISTS, - 'S0012' => DB_ERROR_NOT_FOUND, - 'S0021' => DB_ERROR_ALREADY_EXISTS, - 'S0022' => DB_ERROR_NOT_FOUND, - 'S1000' => DB_ERROR_NOSUCHTABLE, - 'S1009' => DB_ERROR_INVALID, - 'S1090' => DB_ERROR_INVALID, - 'S1C00' => DB_ERROR_NOT_CAPABLE - ); - return $MAP; -} - -function adodb_error_ibase() -{ - static $MAP = array( - -104 => DB_ERROR_SYNTAX, - -150 => DB_ERROR_ACCESS_VIOLATION, - -151 => DB_ERROR_ACCESS_VIOLATION, - -155 => DB_ERROR_NOSUCHTABLE, - -157 => DB_ERROR_NOSUCHFIELD, - -158 => DB_ERROR_VALUE_COUNT_ON_ROW, - -170 => DB_ERROR_MISMATCH, - -171 => DB_ERROR_MISMATCH, - -172 => DB_ERROR_INVALID, - -204 => DB_ERROR_INVALID, - -205 => DB_ERROR_NOSUCHFIELD, - -206 => DB_ERROR_NOSUCHFIELD, - -208 => DB_ERROR_INVALID, - -219 => DB_ERROR_NOSUCHTABLE, - -297 => DB_ERROR_CONSTRAINT, - -530 => DB_ERROR_CONSTRAINT, - -803 => DB_ERROR_CONSTRAINT, - -551 => DB_ERROR_ACCESS_VIOLATION, - -552 => DB_ERROR_ACCESS_VIOLATION, - -922 => DB_ERROR_NOSUCHDB, - -923 => DB_ERROR_CONNECT_FAILED, - -924 => DB_ERROR_CONNECT_FAILED - ); - - return $MAP; -} - -function adodb_error_ifx() -{ - static $MAP = array( - '-201' => DB_ERROR_SYNTAX, - '-206' => DB_ERROR_NOSUCHTABLE, - '-217' => DB_ERROR_NOSUCHFIELD, - '-329' => DB_ERROR_NODBSELECTED, - '-1204' => DB_ERROR_INVALID_DATE, - '-1205' => DB_ERROR_INVALID_DATE, - '-1206' => DB_ERROR_INVALID_DATE, - '-1209' => DB_ERROR_INVALID_DATE, - '-1210' => DB_ERROR_INVALID_DATE, - '-1212' => DB_ERROR_INVALID_DATE - ); - - return $MAP; -} - -function adodb_error_oci8() -{ - static $MAP = array( - 1 => DB_ERROR_ALREADY_EXISTS, - 900 => DB_ERROR_SYNTAX, - 904 => DB_ERROR_NOSUCHFIELD, - 923 => DB_ERROR_SYNTAX, - 942 => DB_ERROR_NOSUCHTABLE, - 955 => DB_ERROR_ALREADY_EXISTS, - 1476 => DB_ERROR_DIVZERO, - 1722 => DB_ERROR_INVALID_NUMBER, - 2289 => DB_ERROR_NOSUCHTABLE, - 2291 => DB_ERROR_CONSTRAINT, - 2449 => DB_ERROR_CONSTRAINT - ); - - return $MAP; -} - -function adodb_error_mssql() -{ - static $MAP = array( - 208 => DB_ERROR_NOSUCHTABLE, - 2601 => DB_ERROR_ALREADY_EXISTS - ); - - return $MAP; -} - -function adodb_error_sqlite() -{ - static $MAP = array( - 1 => DB_ERROR_SYNTAX - ); - - return $MAP; -} - -function adodb_error_mysql() -{ - static $MAP = array( - 1004 => DB_ERROR_CANNOT_CREATE, - 1005 => DB_ERROR_CANNOT_CREATE, - 1006 => DB_ERROR_CANNOT_CREATE, - 1007 => DB_ERROR_ALREADY_EXISTS, - 1008 => DB_ERROR_CANNOT_DROP, - 1045 => DB_ERROR_ACCESS_VIOLATION, - 1046 => DB_ERROR_NODBSELECTED, - 1049 => DB_ERROR_NOSUCHDB, - 1050 => DB_ERROR_ALREADY_EXISTS, - 1051 => DB_ERROR_NOSUCHTABLE, - 1054 => DB_ERROR_NOSUCHFIELD, - 1062 => DB_ERROR_ALREADY_EXISTS, - 1064 => DB_ERROR_SYNTAX, - 1100 => DB_ERROR_NOT_LOCKED, - 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, - 1146 => DB_ERROR_NOSUCHTABLE, - 1048 => DB_ERROR_CONSTRAINT, - 2002 => DB_ERROR_CONNECT_FAILED, - 2005 => DB_ERROR_CONNECT_FAILED - ); - - return $MAP; -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-errorhandler.inc.php b/include/limesurvey/classes/adodb/adodb-errorhandler.inc.php deleted file mode 100644 index 0e2b33bc..00000000 --- a/include/limesurvey/classes/adodb/adodb-errorhandler.inc.php +++ /dev/null @@ -1,79 +0,0 @@ -$s

        "; - trigger_error($s,ADODB_ERROR_HANDLER_TYPE); -} -?> diff --git a/include/limesurvey/classes/adodb/adodb-errorpear.inc.php b/include/limesurvey/classes/adodb/adodb-errorpear.inc.php deleted file mode 100644 index c5276642..00000000 --- a/include/limesurvey/classes/adodb/adodb-errorpear.inc.php +++ /dev/null @@ -1,88 +0,0 @@ -!$s

        "; -} - -/** - * Returns last PEAR_Error object. This error might be for an error that - * occured several sql statements ago. - */ -function ADODB_PEAR_Error() -{ - global $ADODB_Last_PEAR_Error; - - return $ADODB_Last_PEAR_Error; -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-exceptions.inc.php b/include/limesurvey/classes/adodb/adodb-exceptions.inc.php deleted file mode 100644 index af673794..00000000 --- a/include/limesurvey/classes/adodb/adodb-exceptions.inc.php +++ /dev/null @@ -1,82 +0,0 @@ -sql = $p1; - $this->params = $p2; - $s = "$dbms error: [$errno: $errmsg] in $fn(\"$p1\")\n"; - break; - - case 'PCONNECT': - case 'CONNECT': - $user = $thisConnection->user; - $s = "$dbms error: [$errno: $errmsg] in $fn($p1, '$user', '****', $p2)\n"; - break; - default: - $s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n"; - break; - } - - $this->dbms = $dbms; - if ($thisConnection) { - $this->host = $thisConnection->host; - $this->database = $thisConnection->database; - } - $this->fn = $fn; - $this->msg = $errmsg; - - if (!is_numeric($errno)) $errno = -1; - parent::__construct($s,$errno); - } -} - -/** - * Default Error Handler. This will be called with the following params - * - * @param $dbms the RDBMS you are connecting to - * @param $fn the name of the calling function (in uppercase) - * @param $errno the native error number from the database - * @param $errmsg the native error msg from the database - * @param $p1 $fn specific parameter - see below - * @param $P2 $fn specific parameter - see below - */ - -function adodb_throw($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection) -{ - global $ADODB_EXCEPTION; - - if (error_reporting() == 0) return; // obey @ protocol - if (is_string($ADODB_EXCEPTION)) $errfn = $ADODB_EXCEPTION; - else $errfn = 'ADODB_EXCEPTION'; - throw new $errfn($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection); -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-iterator.inc.php b/include/limesurvey/classes/adodb/adodb-iterator.inc.php deleted file mode 100644 index 7d20ffbf..00000000 --- a/include/limesurvey/classes/adodb/adodb-iterator.inc.php +++ /dev/null @@ -1,30 +0,0 @@ -Execute("select * from adoxyz"); - foreach($rs as $k => $v) { - echo $k; print_r($v); echo "
        "; - } - - - Iterator code based on http://cvs.php.net/cvs.php/php-src/ext/spl/examples/cachingiterator.inc?login=2 - - - Moved to adodb.inc.php to improve performance. - */ - - - - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-lib.inc.php b/include/limesurvey/classes/adodb/adodb-lib.inc.php deleted file mode 100644 index 2f652485..00000000 --- a/include/limesurvey/classes/adodb/adodb-lib.inc.php +++ /dev/null @@ -1,1193 +0,0 @@ - sizeof($array)) $max = sizeof($array); - else $max = $probe; - - - for ($j=0;$j < $max; $j++) { - $row = $array[$j]; - if (!$row) break; - $i = -1; - foreach($row as $v) { - $i += 1; - - if (isset($types[$i]) && $types[$i]=='C') continue; - - //print " ($i ".$types[$i]. "$v) "; - $v = trim($v); - - if (!preg_match('/^[+-]{0,1}[0-9\.]+$/',$v)) { - $types[$i] = 'C'; // once C, always C - - continue; - } - if ($j == 0) { - // If empty string, we presume is character - // test for integer for 1st row only - // after that it is up to testing other rows to prove - // that it is not an integer - if (strlen($v) == 0) $types[$i] = 'C'; - if (strpos($v,'.') !== false) $types[$i] = 'N'; - else $types[$i] = 'I'; - continue; - } - - if (strpos($v,'.') !== false) $types[$i] = 'N'; - - } - } - -} - -function adodb_transpose(&$arr, &$newarr, &$hdr, &$fobjs) -{ - $oldX = sizeof(reset($arr)); - $oldY = sizeof($arr); - - if ($hdr) { - $startx = 1; - $hdr = array('Fields'); - for ($y = 0; $y < $oldY; $y++) { - $hdr[] = $arr[$y][0]; - } - } else - $startx = 0; - - for ($x = $startx; $x < $oldX; $x++) { - if ($fobjs) { - $o = $fobjs[$x]; - $newarr[] = array($o->name); - } else - $newarr[] = array(); - - for ($y = 0; $y < $oldY; $y++) { - $newarr[$x-$startx][] = $arr[$y][$x]; - } - } -} - -// Force key to upper. -// See also http://www.php.net/manual/en/function.array-change-key-case.php -function _array_change_key_case($an_array) -{ - if (is_array($an_array)) { - $new_array = array(); - foreach($an_array as $key=>$value) - $new_array[strtoupper($key)] = $value; - - return $new_array; - } - - return $an_array; -} - -function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc) -{ - if (count($fieldArray) == 0) return 0; - $first = true; - $uSet = ''; - - if (!is_array($keyCol)) { - $keyCol = array($keyCol); - } - foreach($fieldArray as $k => $v) { - if ($v === null) { - $v = 'NULL'; - $fieldArray[$k] = $v; - } else if ($autoQuote && /*!is_numeric($v) /*and strncmp($v,"'",1) !== 0 -- sql injection risk*/ strcasecmp($v,$zthis->null2null)!=0) { - $v = $zthis->qstr($v); - $fieldArray[$k] = $v; - } - if (in_array($k,$keyCol)) continue; // skip UPDATE if is key - - if ($first) { - $first = false; - $uSet = "$k=$v"; - } else - $uSet .= ",$k=$v"; - } - - $where = false; - foreach ($keyCol as $v) { - if (isset($fieldArray[$v])) { - if ($where) $where .= ' and '.$v.'='.$fieldArray[$v]; - else $where = $v.'='.$fieldArray[$v]; - } - } - - if ($uSet && $where) { - $update = "UPDATE $table SET $uSet WHERE $where"; - - $rs = $zthis->Execute($update); - - - if ($rs) { - if ($zthis->poorAffectedRows) { - /* - The Select count(*) wipes out any errors that the update would have returned. - http://phplens.com/lens/lensforum/msgs.php?id=5696 - */ - if ($zthis->ErrorNo()<>0) return 0; - - # affected_rows == 0 if update field values identical to old values - # for mysql - which is silly. - - $cnt = $zthis->GetOne("select count(*) from $table where $where"); - if ($cnt > 0) return 1; // record already exists - } else { - if (($zthis->Affected_Rows()>0)) return 1; - } - } else - return 0; - } - - // print "

        Error=".$this->ErrorNo().'

        '; - $first = true; - foreach($fieldArray as $k => $v) { - if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col - - if ($first) { - $first = false; - $iCols = "$k"; - $iVals = "$v"; - } else { - $iCols .= ",$k"; - $iVals .= ",$v"; - } - } - $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)"; - $rs = $zthis->Execute($insert); - return ($rs) ? 2 : 0; -} - -// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM -function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false, -$size=0, $selectAttr='',$compareFields0=true) -{ - $hasvalue = false; - - if ($multiple or is_array($defstr)) { - if ($size==0) $size=5; - $attr = ' multiple size="'.$size.'"'; - if (!strpos($name,'[]')) $name .= '[]'; - } else if ($size) $attr = ' size="'.$size.'"'; - else $attr =''; - - $s = '\n"; -} - -// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM -function _adodb_getmenu_gp(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false, -$size=0, $selectAttr='',$compareFields0=true) -{ - $hasvalue = false; - - if ($multiple or is_array($defstr)) { - if ($size==0) $size=5; - $attr = ' multiple size="'.$size.'"'; - if (!strpos($name,'[]')) $name .= '[]'; - } else if ($size) $attr = ' size="'.$size.'"'; - else $attr =''; - - $s = '\n"; -} - - -/* - Count the number of records this sql statement will return by using - query rewriting heuristics... - - Does not work with UNIONs, except with postgresql and oracle. - - Usage: - - $conn->Connect(...); - $cnt = _adodb_getcount($conn, $sql); - - */ -function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0) -{ - $qryRecs = 0; - - if (!empty($zthis->_nestedSQL) || preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) || - preg_match('/\s+GROUP\s+BY\s+/is',$sql) || - preg_match('/\s+UNION\s+/is',$sql)) { - - $rewritesql = adodb_strip_order_by($sql); - - // ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias - // but this is only supported by oracle and postgresql... - if ($zthis->dataProvider == 'oci8') { - // Allow Oracle hints to be used for query optimization, Chris Wrye - if (preg_match('#/\\*+.*?\\*\\/#', $sql, $hint)) { - $rewritesql = "SELECT ".$hint[0]." COUNT(*) FROM (".$rewritesql.")"; - } else - $rewritesql = "SELECT COUNT(*) FROM (".$rewritesql.")"; - - } else if (strncmp($zthis->databaseType,'postgres',8) == 0 || strncmp($zthis->databaseType,'mysql',5) == 0) { - $rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_"; - } else { - $rewritesql = "SELECT COUNT(*) FROM ($rewritesql)"; - } - } else { - // now replace SELECT ... FROM with SELECT COUNT(*) FROM - $rewritesql = preg_replace( - '/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql); - // fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails - // with mssql, access and postgresql. Also a good speedup optimization - skips sorting! - // also see http://phplens.com/lens/lensforum/msgs.php?id=12752 - $rewritesql = adodb_strip_order_by($rewritesql); - } - - if (isset($rewritesql) && $rewritesql != $sql) { - if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0]; - - if ($secs2cache) { - // we only use half the time of secs2cache because the count can quickly - // become inaccurate if new records are added - $qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr); - - } else { - $qryRecs = $zthis->GetOne($rewritesql,$inputarr); - } - if ($qryRecs !== false) return $qryRecs; - } - //-------------------------------------------- - // query rewrite failed - so try slower way... - - - // strip off unneeded ORDER BY if no UNION - if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql; - else $rewritesql = $rewritesql = adodb_strip_order_by($sql); - - if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0]; - - $rstest = $zthis->Execute($rewritesql,$inputarr); - if (!$rstest) $rstest = $zthis->Execute($sql,$inputarr); - - if ($rstest) { - $qryRecs = $rstest->RecordCount(); - if ($qryRecs == -1) { - global $ADODB_EXTENSION; - // some databases will return -1 on MoveLast() - change to MoveNext() - if ($ADODB_EXTENSION) { - while(!$rstest->EOF) { - adodb_movenext($rstest); - } - } else { - while(!$rstest->EOF) { - $rstest->MoveNext(); - } - } - $qryRecs = $rstest->_currentRow; - } - $rstest->Close(); - if ($qryRecs == -1) return 0; - } - return $qryRecs; -} - -/* - Code originally from "Cornel G" - - This code might not work with SQL that has UNION in it - - Also if you are using CachePageExecute(), there is a strong possibility that - data will get out of synch. use CachePageExecute() only with tables that - rarely change. - */ -function _adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page, -$inputarr=false, $secs2cache=0) -{ - $atfirstpage = false; - $atlastpage = false; - $lastpageno=1; - - // If an invalid nrows is supplied, - // we assume a default value of 10 rows per page - if (!isset($nrows) || $nrows <= 0) $nrows = 10; - - $qryRecs = false; //count records for no offset - - $qryRecs = _adodb_getcount($zthis,$sql,$inputarr,$secs2cache); - $lastpageno = (int) ceil($qryRecs / $nrows); - $zthis->_maxRecordCount = $qryRecs; - - - - // ***** Here we check whether $page is the last page or - // whether we are trying to retrieve - // a page number greater than the last page number. - if ($page >= $lastpageno) { - $page = $lastpageno; - $atlastpage = true; - } - - // If page number <= 1, then we are at the first page - if (empty($page) || $page <= 1) { - $page = 1; - $atfirstpage = true; - } - - // We get the data we want - $offset = $nrows * ($page-1); - if ($secs2cache > 0) - $rsreturn = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); - else - $rsreturn = $zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); - - - // Before returning the RecordSet, we set the pagination properties we need - if ($rsreturn) { - $rsreturn->_maxRecordCount = $qryRecs; - $rsreturn->rowsPerPage = $nrows; - $rsreturn->AbsolutePage($page); - $rsreturn->AtFirstPage($atfirstpage); - $rsreturn->AtLastPage($atlastpage); - $rsreturn->LastPageNo($lastpageno); - } - return $rsreturn; -} - -// Iv�n Oliva version -function _adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0) -{ - - $atfirstpage = false; - $atlastpage = false; - - if (!isset($page) || $page <= 1) { // If page number <= 1, then we are at the first page - $page = 1; - $atfirstpage = true; - } - if ($nrows <= 0) $nrows = 10; // If an invalid nrows is supplied, we assume a default value of 10 rows per page - - // ***** Here we check whether $page is the last page or whether we are trying to retrieve a page number greater than - // the last page number. - $pagecounter = $page + 1; - $pagecounteroffset = ($pagecounter * $nrows) - $nrows; - if ($secs2cache>0) $rstest = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); - else $rstest = $zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); - if ($rstest) { - while ($rstest && $rstest->EOF && $pagecounter>0) { - $atlastpage = true; - $pagecounter--; - $pagecounteroffset = $nrows * ($pagecounter - 1); - $rstest->Close(); - if ($secs2cache>0) $rstest = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); - else $rstest = $zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); - } - if ($rstest) $rstest->Close(); - } - if ($atlastpage) { // If we are at the last page or beyond it, we are going to retrieve it - $page = $pagecounter; - if ($page == 1) $atfirstpage = true; // We have to do this again in case the last page is the same as the first - //... page, that is, the recordset has only 1 page. - } - - // We get the data we want - $offset = $nrows * ($page-1); - if ($secs2cache > 0) $rsreturn = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); - else $rsreturn = $zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); - - // Before returning the RecordSet, we set the pagination properties we need - if ($rsreturn) { - $rsreturn->rowsPerPage = $nrows; - $rsreturn->AbsolutePage($page); - $rsreturn->AtFirstPage($atfirstpage); - $rsreturn->AtLastPage($atlastpage); - } - return $rsreturn; -} - -function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=2) -{ - global $ADODB_QUOTE_FIELDNAMES; - - if (!$rs) { - printf(ADODB_BAD_RS,'GetUpdateSQL'); - return false; - } - - $fieldUpdatedCount = 0; - $arrFields = _array_change_key_case($arrFields); - - $hasnumeric = isset($rs->fields[0]); - $setFields = ''; - - // Loop through all of the fields in the recordset - for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { - // Get the field from the recordset - $field = $rs->FetchField($i); - - // If the recordset field is one - // of the fields passed in then process. - $upperfname = strtoupper($field->name); - if (adodb_key_exists($upperfname,$arrFields,$force)) { - - // If the existing field value in the recordset - // is different from the value passed in then - // go ahead and append the field name and new value to - // the update query. - - if ($hasnumeric) $val = $rs->fields[$i]; - else if (isset($rs->fields[$upperfname])) $val = $rs->fields[$upperfname]; - else if (isset($rs->fields[$field->name])) $val = $rs->fields[$field->name]; - else if (isset($rs->fields[strtolower($upperfname)])) $val = $rs->fields[strtolower($upperfname)]; - else $val = ''; - - - if ($forceUpdate || strcmp($val, $arrFields[$upperfname])) { - // Set the counter for the number of fields that will be updated. - $fieldUpdatedCount++; - - // Based on the datatype of the field - // Format the value properly for the database - $type = $rs->MetaType($field->type); - - - if ($type == 'null') { - $type = 'C'; - } - - if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) - $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; - else - $fnameq = $upperfname; - - - // is_null requires php 4.0.4 - //********************************************************// - if (is_null($arrFields[$upperfname]) - || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0) - || $arrFields[$upperfname] === $zthis->null2null - ) - { - switch ($force) { - - //case 0: - // //Ignore empty values. This is allready handled in "adodb_key_exists" function. - //break; - - case 1: - //Set null - $setFields .= $field->name . " = null, "; - break; - - case 2: - //Set empty - $arrFields[$upperfname] = ""; - $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq); - break; - default: - case 3: - //Set the value that was given in array, so you can give both null and empty values - if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) { - $setFields .= $field->name . " = null, "; - } else { - $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq); - } - break; - } - //********************************************************// - } else { - //we do this so each driver can customize the sql for - //DB specific column types. - //Oracle needs BLOB types to be handled with a returning clause - //postgres has special needs as well - $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq, - $arrFields, $magicq); - } - } - } - } - - // If there were any modified fields then build the rest of the update query. - if ($fieldUpdatedCount > 0 || $forceUpdate) { - // Get the table name from the existing query. - if (!empty($rs->tableName)) $tableName = $rs->tableName; - else { - preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName); - $tableName = $tableName[1]; - } - // Get the full where clause excluding the word "WHERE" from - // the existing query. - preg_match('/\sWHERE\s(.*)/is', $rs->sql, $whereClause); - - $discard = false; - // not a good hack, improvements? - if ($whereClause) { - #var_dump($whereClause); - if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard)); - else if (preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard)); - else if (preg_match('/\s(FOR UPDATE.*)/is', $whereClause[1], $discard)); - else preg_match('/\s.*(\) WHERE .*)/is', $whereClause[1], $discard); # see http://sourceforge.net/tracker/index.php?func=detail&aid=1379638&group_id=42718&atid=433976 - } else - $whereClause = array(false,false); - - if ($discard) - $whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1])); - - $sql = 'UPDATE '.$tableName.' SET '.substr($setFields, 0, -2); - if (strlen($whereClause[1]) > 0) - $sql .= ' WHERE '.$whereClause[1]; - - return $sql; - - } else { - return false; - } -} - -function adodb_key_exists($key, &$arr,$force=2) -{ - if ($force<=0) { - // the following is the old behaviour where null or empty fields are ignored - return (!empty($arr[$key])) || (isset($arr[$key]) && strlen($arr[$key])>0); - } - - if (isset($arr[$key])) return true; - ## null check below - if (ADODB_PHPVER >= 0x4010) return array_key_exists($key,$arr); - return false; -} - -/** - * There is a special case of this function for the oci8 driver. - * The proper way to handle an insert w/ a blob in oracle requires - * a returning clause with bind variables and a descriptor blob. - * - * - */ -function _adodb_getinsertsql(&$zthis,&$rs,$arrFields,$magicq=false,$force=2) -{ - static $cacheRS = false; - static $cacheSig = 0; - static $cacheCols; - global $ADODB_QUOTE_FIELDNAMES; - - $tableName = ''; - $values = ''; - $fields = ''; - $recordSet = null; - $arrFields = _array_change_key_case($arrFields); - $fieldInsertedCount = 0; - - if (is_string($rs)) { - //ok we have a table name - //try and get the column info ourself. - $tableName = $rs; - - //we need an object for the recordSet - //because we have to call MetaType. - //php can't do a $rsclass::MetaType() - $rsclass = $zthis->rsPrefix.$zthis->databaseType; - $recordSet = new $rsclass(-1,$zthis->fetchMode); - $recordSet->connection = $zthis; - - if (is_string($cacheRS) && $cacheRS == $rs) { - $columns = $cacheCols; - } else { - $columns = $zthis->MetaColumns( $tableName ); - $cacheRS = $tableName; - $cacheCols = $columns; - } - } else if (is_subclass_of($rs, 'adorecordset')) { - if (isset($rs->insertSig) && is_integer($cacheRS) && $cacheRS == $rs->insertSig) { - $columns = $cacheCols; - } else { - for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) - $columns[] = $rs->FetchField($i); - $cacheRS = $cacheSig; - $cacheCols = $columns; - $rs->insertSig = $cacheSig++; - } - $recordSet = $rs; - - } else { - printf(ADODB_BAD_RS,'GetInsertSQL'); - return false; - } - - // Loop through all of the fields in the recordset - foreach( $columns as $field ) { - $upperfname = strtoupper($field->name); - if (adodb_key_exists($upperfname,$arrFields,$force)) { - $bad = false; - if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) - $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; - else - $fnameq = $upperfname; - - $type = $recordSet->MetaType($field->type); - - /********************************************************/ - if (is_null($arrFields[$upperfname]) - || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0) - || $arrFields[$upperfname] === $zthis->null2null - ) - { - switch ($force) { - - case 0: // we must always set null if missing - $bad = true; - break; - - case 1: - $values .= "null, "; - break; - - case 2: - //Set empty - $arrFields[$upperfname] = ""; - $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq,$arrFields, $magicq); - break; - - default: - case 3: - //Set the value that was given in array, so you can give both null and empty values - if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) { - $values .= "null, "; - } else { - $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, $arrFields, $magicq); - } - break; - } // switch - - /*********************************************************/ - } else { - //we do this so each driver can customize the sql for - //DB specific column types. - //Oracle needs BLOB types to be handled with a returning clause - //postgres has special needs as well - $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, - $arrFields, $magicq); - } - - if ($bad) continue; - // Set the counter for the number of fields that will be inserted. - $fieldInsertedCount++; - - - // Get the name of the fields to insert - $fields .= $fnameq . ", "; - } - } - - - // If there were any inserted fields then build the rest of the insert query. - if ($fieldInsertedCount <= 0) return false; - - // Get the table name from the existing query. - if (!$tableName) { - if (!empty($rs->tableName)) $tableName = $rs->tableName; - else if (preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName)) - $tableName = $tableName[1]; - else - return false; - } - - // Strip off the comma and space on the end of both the fields - // and their values. - $fields = substr($fields, 0, -2); - $values = substr($values, 0, -2); - - // Append the fields and their values to the insert query. - return 'INSERT INTO '.$tableName.' ( '.$fields.' ) VALUES ( '.$values.' )'; -} - - -/** - * This private method is used to help construct - * the update/sql which is generated by GetInsertSQL and GetUpdateSQL. - * It handles the string construction of 1 column -> sql string based on - * the column type. We want to do 'safe' handling of BLOBs - * - * @param string the type of sql we are trying to create - * 'I' or 'U'. - * @param string column data type from the db::MetaType() method - * @param string the column name - * @param array the column value - * - * @return string - * - */ -function _adodb_column_sql_oci8(&$zthis,$action, $type, $fname, $fnameq, $arrFields, $magicq) -{ - $sql = ''; - - // Based on the datatype of the field - // Format the value properly for the database - switch($type) { - case 'B': - //in order to handle Blobs correctly, we need - //to do some magic for Oracle - - //we need to create a new descriptor to handle - //this properly - if (!empty($zthis->hasReturningInto)) { - if ($action == 'I') { - $sql = 'empty_blob(), '; - } else { - $sql = $fnameq. '=empty_blob(), '; - } - //add the variable to the returning clause array - //so the user can build this later in - //case they want to add more to it - $zthis->_returningArray[$fname] = ':xx'.$fname.'xx'; - } else if (empty($arrFields[$fname])){ - if ($action == 'I') { - $sql = 'empty_blob(), '; - } else { - $sql = $fnameq. '=empty_blob(), '; - } - } else { - //this is to maintain compatibility - //with older adodb versions. - $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); - } - break; - - case "X": - //we need to do some more magic here for long variables - //to handle these correctly in oracle. - - //create a safe bind var name - //to avoid conflicts w/ dupes. - if (!empty($zthis->hasReturningInto)) { - if ($action == 'I') { - $sql = ':xx'.$fname.'xx, '; - } else { - $sql = $fnameq.'=:xx'.$fname.'xx, '; - } - //add the variable to the returning clause array - //so the user can build this later in - //case they want to add more to it - $zthis->_returningArray[$fname] = ':xx'.$fname.'xx'; - } else { - //this is to maintain compatibility - //with older adodb versions. - $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); - } - break; - - default: - $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); - break; - } - - return $sql; -} - -function _adodb_column_sql(&$zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq, $recurse=true) -{ - - if ($recurse) { - switch($zthis->dataProvider) { - case 'postgres': - if ($type == 'L') $type = 'C'; - break; - case 'oci8': - return _adodb_column_sql_oci8($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq); - - } - } - - switch($type) { - case "C": - case "X": - case 'B': - $val = $zthis->qstr($arrFields[$fname],$magicq); - break; - - case "D": - $val = $zthis->DBDate($arrFields[$fname]); - break; - - case "T": - $val = $zthis->DBTimeStamp($arrFields[$fname]); - break; - - case "N": - $val = $arrFields[$fname]; - if (!is_numeric($val)) $val = str_replace(',', '.', (float)$val); - break; - - case "I": - case "R": - $val = $arrFields[$fname]; - if (!is_numeric($val)) $val = (integer) $val; - break; - - default: - $val = str_replace(array("'"," ","("),"",$arrFields[$fname]); // basic sql injection defence - if (empty($val)) $val = '0'; - break; - } - - if ($action == 'I') return $val . ", "; - - - return $fnameq . "=" . $val . ", "; - -} - - - -function _adodb_debug_execute(&$zthis, $sql, $inputarr) -{ - $ss = ''; - if ($inputarr) { - foreach($inputarr as $kk=>$vv) { - if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...'; - if (is_null($vv)) $ss .= "($kk=>null) "; - else $ss .= "($kk=>'$vv') "; - } - $ss = "[ $ss ]"; - } - $sqlTxt = is_array($sql) ? $sql[0] : $sql; - /*str_replace(', ','##1#__^LF',is_array($sql) ? $sql[0] : $sql); - $sqlTxt = str_replace(',',', ',$sqlTxt); - $sqlTxt = str_replace('##1#__^LF', ', ' ,$sqlTxt); - */ - // check if running from browser or command-line - $inBrowser = isset($_SERVER['HTTP_USER_AGENT']); - - $dbt = $zthis->databaseType; - if (isset($zthis->dsnType)) $dbt .= '-'.$zthis->dsnType; - if ($inBrowser) { - if ($ss) { - $ss = ''.htmlspecialchars($ss).''; - } - if ($zthis->debug === -1) - ADOConnection::outp( "
        \n($dbt): ".htmlspecialchars($sqlTxt)."   $ss\n
        \n",false); - else if ($zthis->debug !== -99) - ADOConnection::outp( "


        \n($dbt): ".htmlspecialchars($sqlTxt)."   $ss\n
        \n",false); - } else { - $ss = "\n ".$ss; - if ($zthis->debug !== -99) - ADOConnection::outp("-----
        \n($dbt): ".$sqlTxt." $ss\n-----
        \n",false); - } - - $qID = $zthis->_query($sql,$inputarr); - - /* - Alexios Fakios notes that ErrorMsg() must be called before ErrorNo() for mssql - because ErrorNo() calls Execute('SELECT @ERROR'), causing recursion - */ - if ($zthis->databaseType == 'mssql') { - // ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6 - - if($emsg = $zthis->ErrorMsg()) { - if ($err = $zthis->ErrorNo()) { - if ($zthis->debug === -99) - ADOConnection::outp( "
        \n($dbt): ".htmlspecialchars($sqlTxt)."   $ss\n
        \n",false); - - ADOConnection::outp($err.': '.$emsg); - } - } - } else if (!$qID) { - - if ($zthis->debug === -99) - if ($inBrowser) ADOConnection::outp( "
        \n($dbt): ".htmlspecialchars($sqlTxt)."   $ss\n
        \n",false); - else ADOConnection::outp("-----
        \n($dbt): ".$sqlTxt."$ss\n-----
        \n",false); - - ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg()); - } - - if ($zthis->debug === 99) _adodb_backtrace(true,9999,2); - return $qID; -} - -# pretty print the debug_backtrace function -function _adodb_backtrace($printOrArr=true,$levels=9999,$skippy=0,$ishtml=null) -{ - if (!function_exists('debug_backtrace')) return ''; - - if ($ishtml === null) $html = (isset($_SERVER['HTTP_USER_AGENT'])); - else $html = $ishtml; - - $fmt = ($html) ? " %% line %4d, file: %s" : "%% line %4d, file: %s"; - - $MAXSTRLEN = 128; - - $s = ($html) ? '
        ' : '';
        -
        -    if (is_array($printOrArr)) $traceArr = $printOrArr;
        -    else $traceArr = debug_backtrace();
        -    array_shift($traceArr);
        -    array_shift($traceArr);
        -    $tabs = sizeof($traceArr)-2;
        -
        -    foreach ($traceArr as $arr) {
        -        if ($skippy) {$skippy -= 1; continue;}
        -        $levels -= 1;
        -        if ($levels < 0) break;
        -
        -        $args = array();
        -        for ($i=0; $i < $tabs; $i++) $s .=  ($html) ? '   ' : "\t";
        -        $tabs -= 1;
        -        if ($html) $s .= '';
        -        if (isset($arr['class'])) $s .= $arr['class'].'.';
        -        if (isset($arr['args']))
        -        foreach($arr['args'] as $v) {
        -            if (is_null($v)) $args[] = 'null';
        -            else if (is_array($v)) $args[] = 'Array['.sizeof($v).']';
        -            else if (is_object($v)) $args[] = 'Object:'.get_class($v);
        -            else if (is_bool($v)) $args[] = $v ? 'true' : 'false';
        -            else {
        -                $v = (string) @$v;
        -                $str = htmlspecialchars(str_replace(array("\r","\n"),' ',substr($v,0,$MAXSTRLEN)));
        -                if (strlen($v) > $MAXSTRLEN) $str .= '...';
        -                $args[] = $str;
        -            }
        -        }
        -        $s .= $arr['function'].'('.implode(', ',$args).')';
        -
        -
        -        $s .= @sprintf($fmt, $arr['line'],$arr['file'],basename($arr['file']));
        -         
        -        $s .= "\n";
        -    }
        -    if ($html) $s .= '
        '; - if ($printOrArr) print $s; - - return $s; -} -/* - function _adodb_find_from($sql) - { - - $sql = str_replace(array("\n","\r"), ' ', $sql); - $charCount = strlen($sql); - - $inString = false; - $quote = ''; - $parentheseCount = 0; - $prevChars = ''; - $nextChars = ''; - - - for($i = 0; $i < $charCount; $i++) { - - $char = substr($sql,$i,1); - $prevChars = substr($sql,0,$i); - $nextChars = substr($sql,$i+1); - - if((($char == "'" || $char == '"' || $char == '`') && substr($prevChars,-1,1) != '\\') && $inString === false) { - $quote = $char; - $inString = true; - } - - elseif((($char == "'" || $char == '"' || $char == '`') && substr($prevChars,-1,1) != '\\') && $inString === true && $quote == $char) { - $quote = ""; - $inString = false; - } - - elseif($char == "(" && $inString === false) - $parentheseCount++; - - elseif($char == ")" && $inString === false && $parentheseCount > 0) - $parentheseCount--; - - elseif($parentheseCount <= 0 && $inString === false && $char == " " && strtoupper(substr($prevChars,-5,5)) == " FROM") - return $i; - - } - } - */ - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-memcache.lib.inc.php b/include/limesurvey/classes/adodb/adodb-memcache.lib.inc.php deleted file mode 100644 index 63e002cf..00000000 --- a/include/limesurvey/classes/adodb/adodb-memcache.lib.inc.php +++ /dev/null @@ -1,190 +0,0 @@ -memCache = true; /// should we use memCache instead of caching in files -$db->memCacheHost = array($ip1, $ip2, $ip3); -$db->memCachePort = 11211; /// this is default memCache port -$db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib) - -$db->Connect(...); -$db->CacheExecute($sql); - -Note the memcache class is shared by all connections, is created during the first call to Connect/PConnect. - -Class instance is stored in $ADODB_CACHE -*/ - -class ADODB_Cache_MemCache { - var $createdir = false; // create caching directory structure? - - //----------------------------- - // memcache specific variables - - var $hosts; // array of hosts - var $port = 11211; - var $compress = false; // memcache compression with zlib - - var $_connected = false; - var $_memcache = false; - - function ADODB_Cache_MemCache(&$obj) - { - $this->hosts = $obj->memCacheHost; - $this->port = $obj->memCachePort; - $this->compress = $obj->memCacheCompress; - } - - // implement as lazy connection. The connection only occurs on CacheExecute call - function connect(&$err) - { - if (!function_exists('memcache_pconnect')) { - $err = 'Memcache module PECL extension not found!'; - return false; - } - - $memcache = new MemCache; - - if (!is_array($this->hosts)) $this->hosts = array($this->hosts); - - $failcnt = 0; - foreach($this->hosts as $host) { - if (!@$memcache->addServer($host,$this->port,true)) { - $failcnt += 1; - } - } - if ($failcnt == sizeof($this->hosts)) { - $err = 'Can\'t connect to any memcache server'; - return false; - } - $this->_connected = true; - $this->_memcache = $memcache; - return true; - } - - // returns true or false. true if successful save - function writecache($filename, $contents, $debug, $secs2cache) - { - if (!$this->_connected) { - $err = ''; - if (!$this->connect($err) && $debug) ADOConnection::outp($err); - } - if (!$this->_memcache) return false; - - if (!$this->_memcache->set($filename, $contents, $this->compress, $secs2cache)) { - if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!
        \n"); - return false; - } - - return true; - } - - // returns a recordset - function readcache($filename, &$err, $secs2cache, $rsClass) - { - $false = false; - if (!$this->_connected) $this->connect($err); - if (!$this->_memcache) return $false; - - $rs = $this->_memcache->get($filename); - if (!$rs) { - $err = 'Item with such key doesn\'t exists on the memcached server.'; - return $false; - } - - // hack, should actually use _csv2rs - $rs = explode("\n", $rs); - unset($rs[0]); - $rs = join("\n", $rs); - $rs = unserialize($rs); - if (! is_object($rs)) { - $err = 'Unable to unserialize $rs'; - return $false; - } - if ($rs->timeCreated == 0) return $rs; // apparently have been reports that timeCreated was set to 0 somewhere - - $tdiff = intval($rs->timeCreated+$secs2cache - time()); - if ($tdiff <= 2) { - switch($tdiff) { - case 2: - if ((rand() & 15) == 0) { - $err = "Timeout 2"; - return $false; - } - break; - case 1: - if ((rand() & 3) == 0) { - $err = "Timeout 1"; - return $false; - } - break; - default: - $err = "Timeout 0"; - return $false; - } - } - return $rs; - } - - function flushall($debug=false) - { - if (!$this->_connected) { - $err = ''; - if (!$this->connect($err) && $debug) ADOConnection::outp($err); - } - if (!$this->_memcache) return false; - - $del = $this->_memcache->flush(); - - if ($debug) - if (!$del) ADOConnection::outp("flushall: failed!
        \n"); - else ADOConnection::outp("flushall: succeeded!
        \n"); - - return $del; - } - - function flushcache($filename, $debug=false) - { - if (!$this->_connected) { - $err = ''; - if (!$this->connect($err) && $debug) ADOConnection::outp($err); - } - if (!$this->_memcache) return false; - - $del = $this->_memcache->delete($filename); - - if ($debug) - if (!$del) ADOConnection::outp("flushcache: $key entry doesn't exist on memcached server!
        \n"); - else ADOConnection::outp("flushcache: $key entry flushed from memcached server!
        \n"); - - return $del; - } - - // not used for memcache - function createdir($dir, $hash) - { - return true; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-pager.inc.php b/include/limesurvey/classes/adodb/adodb-pager.inc.php deleted file mode 100644 index 392b56ce..00000000 --- a/include/limesurvey/classes/adodb/adodb-pager.inc.php +++ /dev/null @@ -1,297 +0,0 @@ - implemented Render_PageLinks(). - - Please note, this class is entirely unsupported, - and no free support requests except for bug reports - will be entertained by the author. - - */ -class ADODB_Pager { - var $id; // unique id for pager (defaults to 'adodb') - var $db; // ADODB connection object - var $sql; // sql used - var $rs; // recordset generated - var $curr_page; // current page number before Render() called, calculated in constructor - var $rows; // number of rows per page - var $linksPerPage=10; // number of links per page in navigation bar - var $showPageLinks; - - var $gridAttributes = 'width=100% border=1 bgcolor=white'; - - // Localize text strings here - var $first = '|<'; - var $prev = '<<'; - var $next = '>>'; - var $last = '>|'; - var $moreLinks = '...'; - var $startLinks = '...'; - var $gridHeader = false; - var $htmlSpecialChars = true; - var $page = 'Page'; - var $linkSelectedColor = 'red'; - var $cache = 0; #secs to cache with CachePageExecute() - - //---------------------------------------------- - // constructor - // - // $db adodb connection object - // $sql sql statement - // $id optional id to identify which pager, - // if you have multiple on 1 page. - // $id should be only be [a-z0-9]* - // - function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false) - { - global $PHP_SELF; - - $curr_page = $id.'_curr_page'; - if (!empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks - - $this->sql = $sql; - $this->id = $id; - $this->db = $db; - $this->showPageLinks = $showPageLinks; - - $next_page = $id.'_next_page'; - - if (isset($_GET[$next_page])) { - $_SESSION[$curr_page] = (integer) $_GET[$next_page]; - } - if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page - - $this->curr_page = $_SESSION[$curr_page]; - - } - - //--------------------------- - // Display link to first page - function Render_First($anchor=true) - { - global $PHP_SELF; - if ($anchor) { - ?> -first;?> -  - first   "; - } - } - - //-------------------------- - // Display link to next page - function render_next($anchor=true) - { - global $PHP_SELF; - - if ($anchor) { - ?> -next;?> -  - next   "; - } - } - - //------------------ - // Link to last page - // - // for better performance with large recordsets, you can set - // $this->db->pageExecuteCountRows = false, which disables - // last page counting. - function render_last($anchor=true) - { - global $PHP_SELF; - - if (!$this->db->pageExecuteCountRows) return; - - if ($anchor) { - ?> -last;?> -  - last   "; - } - } - - //--------------------------------------------------- - // original code by "Pablo Costa" - function render_pagelinks() - { - global $PHP_SELF; - $pages = $this->rs->LastPageNo(); - $linksperpage = $this->linksPerPage ? $this->linksPerPage : $pages; - for($i=1; $i <= $pages; $i+=$linksperpage) - { - if($this->rs->AbsolutePage() >= $i) - { - $start = $i; - } - } - $numbers = ''; - $end = $start+$linksperpage-1; - $link = $this->id . "_next_page"; - if($end > $pages) $end = $pages; - - - if ($this->startLinks && $start > 1) { - $pos = $start - 1; - $numbers .= "$this->startLinks "; - } - - for($i=$start; $i <= $end; $i++) { - if ($this->rs->AbsolutePage() == $i) - $numbers .= "linkSelectedColor>$i "; - else - $numbers .= "$i "; - - } - if ($this->moreLinks && $end < $pages) - $numbers .= "$this->moreLinks "; - print $numbers . '   '; - } - // Link to previous page - function render_prev($anchor=true) - { - global $PHP_SELF; - if ($anchor) { - ?> -prev;?> -  - prev   "; - } - } - - //-------------------------------------------------------- - // Simply rendering of grid. You should override this for - // better control over the format of the grid - // - // We use output buffering to keep code clean and readable. - function RenderGrid() - { - global $gSQLBlockRows; // used by rs2html to indicate how many rows to display - include_once(ADODB_DIR.'/tohtml.inc.php'); - ob_start(); - $gSQLBlockRows = $this->rows; - rs2html($this->rs,$this->gridAttributes,$this->gridHeader,$this->htmlSpecialChars); - $s = ob_get_contents(); - ob_end_clean(); - return $s; - } - - //------------------------------------------------------- - // Navigation bar - // - // we use output buffering to keep the code easy to read. - function RenderNav() - { - ob_start(); - if (!$this->rs->AtFirstPage()) { - $this->Render_First(); - $this->Render_Prev(); - } else { - $this->Render_First(false); - $this->Render_Prev(false); - } - if ($this->showPageLinks){ - $this->Render_PageLinks(); - } - if (!$this->rs->AtLastPage()) { - $this->Render_Next(); - $this->Render_Last(); - } else { - $this->Render_Next(false); - $this->Render_Last(false); - } - $s = ob_get_contents(); - ob_end_clean(); - return $s; - } - - //------------------- - // This is the footer - function RenderPageCount() - { - if (!$this->db->pageExecuteCountRows) return ''; - $lastPage = $this->rs->LastPageNo(); - if ($lastPage == -1) $lastPage = 1; // check for empty rs. - if ($this->curr_page > $lastPage) $this->curr_page = 1; - return "$this->page ".$this->curr_page."/".$lastPage.""; - } - - //----------------------------------- - // Call this class to draw everything. - function Render($rows=10) - { - global $ADODB_COUNTRECS; - - $this->rows = $rows; - - if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL; - - $savec = $ADODB_COUNTRECS; - if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true; - if ($this->cache) - $rs = $this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page); - else - $rs = $this->db->PageExecute($this->sql,$rows,$this->curr_page); - $ADODB_COUNTRECS = $savec; - - $this->rs = $rs; - if (!$rs) { - print "

        Query failed: $this->sql

        "; - return; - } - - if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage())) - $header = $this->RenderNav(); - else - $header = " "; - - $grid = $this->RenderGrid(); - $footer = $this->RenderPageCount(); - - $this->RenderLayout($header,$grid,$footer); - - $rs->Close(); - $this->rs = false; - } - - //------------------------------------------------------ - // override this to control overall layout and formating - function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige') - { - echo "
        \n" - . $clang->gT('Set templates that this user may access').': '.$_POST['user']."
        " - .$clang->gT('Template name') - ."
         
        " - .$clang->gT('Allowed') - ."
        " - ."
        \n" - ."\tgT('Save settings')."\" />\n" - ."\t\n" - ."\t\n" - ."
        {$trow["folder"]}\n" - ."\n"; - - continue; - } - } -} - - -if ($action == "modifyuser") -{ - if (isset($postuserid) && $postuserid) - { - $squery = "SELECT uid FROM {$dbprefix}users WHERE uid=$postuserid AND parent_id=".$_SESSION['loginID']; // added by Dennis - $sresult = $connect->Execute($squery);//Checked - $sresultcount = $sresult->RecordCount(); - } - else - { - include("access_denied.php"); - } - - // RELIABLY CHECK MY RIGHTS - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $_SESSION['loginID'] == $postuserid || - ( $_SESSION['USER_RIGHT_CREATE_USER'] && - $sresultcount > 0 - ) ) - { - $usersummary = "
        \n".$clang->gT("Editing user")."

        \n" - ."
        \n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n"; - $muq = "SELECT a.users_name, a.full_name, a.email, a.uid, b.users_name AS parent FROM ".db_table_name('users')." AS a LEFT JOIN ".db_table_name('users')." AS b ON a.parent_id = b.uid WHERE a.uid='{$postuserid}'"; // added by Dennis - //echo($muq); - - $mur = db_select_limit_assoc($muq, 1); - $usersummary .= ""; - while ($mrw = $mur->FetchRow()) - { - $mrw = array_map('htmlspecialchars', $mrw); - $usersummary .= "\n" - . "\n" - . "\n"; - $usersummary .= "\n"; - } - $usersummary .= "\n" - . "\n" - . "
        ".$clang->gT("Username")."".$clang->gT("Email")."".$clang->gT("Full name")."".$clang->gT("Password")."
        {$mrw['users_name']}\n\n\n" - . "\n" - . "\n
        \n" - . "

        \n" - . "\n" - . "\n" - . "

        \n" - . "
        \n"; - } - else - { - include("access_denied.php"); - } -} - -if ($action == "setuserrights") -{ - if (isset($postuserid) && $postuserid) - { - $squery = "SELECT uid FROM {$dbprefix}users WHERE uid=$postuserid AND parent_id=".$_SESSION['loginID']; // added by Dennis - $sresult = $connect->Execute($squery);//Checked - $sresultcount = $sresult->RecordCount(); - } - else - { - include("access_denied.php"); - } - - // RELIABLY CHECK MY RIGHTS - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || - ( $_SESSION['USER_RIGHT_CREATE_USER'] && - $sresultcount > 0 && - $_SESSION['loginID'] != $postuserid - ) ) - // if($_SESSION['loginID'] != $postuserid) - { - - $usersummary ="
        "; - - $usersummary .="\n" - ."\n" - ."\n" - ."\n"; - - // HERE WE LIST FOR USER RIGHTS YOU CAN SET TO a USER - // YOU CAN ONLY SET AT MOST THE RIGHTS YOU have yourself - $userlist = getuserlist(); - foreach ($userlist as $usr) - { - if ($usr['uid'] == $postuserid) - { - $squery = "SELECT create_survey, configurator, create_user, delete_user, superadmin, manage_template, manage_label FROM {$dbprefix}users WHERE uid={$_SESSION['loginID']}"; // added by Dennis - $sresult = $connect->Execute($squery); //Checked - $parent = $sresult->FetchRow(); - - // Initial SuperAdmin has parent_id == 0 - $adminquery = "SELECT uid FROM {$dbprefix}users WHERE parent_id=0"; - $adminresult = db_select_limit_assoc($adminquery, 1); - $row=$adminresult->FetchRow(); - - $usersummary .="\n"; - - // Only Initial SuperAdmin can give SuperAdmin rights - if($row['uid'] == $_SESSION['loginID']) - { // RENAMED AS SUPERADMIN - $usersummary .= "\n"; - } - if($parent['create_survey']) { - $usersummary .= "\n"; - } - if($parent['configurator']) { - $usersummary .= "\n"; - } - if($parent['create_user']) { - $usersummary .= "\n"; - } - if($parent['delete_user']) { - $usersummary .= "\n"; - } - if($parent['manage_template']) { - $usersummary .= "\n"; - } - if($parent['manage_label']) { - $usersummary .= "\n"; - } - - $usersummary .="\n" - ."\n"; - - // Only Initial SuperAdmmin can give SuperAdmin right - if($row['uid'] == $_SESSION['loginID']) { - $usersummary .= "\n" - ."\n" - ."
        " - ."".$clang->gT("Set User Rights").": ".htmlspecialchars(sanitize_user($_POST['user']))."" - ."
        ".$clang->gT("SuperAdministrator")."".$clang->gT("Create Survey")."".$clang->gT("Configurator")."".$clang->gT("Create User")."".$clang->gT("Delete User")."".$clang->gT("Use all/manage templates")."".$clang->gT("Manage Labels")."
        " - ."" - ."" - ."" - ."
        \n" - ."
        \n"; - continue; - } // if - } // foreach - } // if - else - { - include("access_denied.php"); - } -} // if - - -if($subaction == "setasadminchild") -{ - // Set user as child of ADMIN FOR - // MORE RIGHT MANAGEMENT POSSIBILITIES - // DON'T TOUCH user CHILDS, they remain his childs - - if($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - $query = "UPDATE ".db_table_name('users')." SET parent_id =1 WHERE uid = ".$postuserid; - $connect->Execute($query) or safe_die($connect->ErrorMsg()." ".$query); //Checked - $_SESSION['flashmessage']=$clang->gT("Ownership was successfully changed."); - } - else - { - include("access_denied.php"); - } -} - -if ($action == "editusers") -{ - $usersummary = "
        ".$clang->gT("User control")."

        " - . "\n" - . "\n" - . "\n" - . "\n"; - - - $usersummary .= "\n" - . "\n" - . "\n"; - if($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - $usersummary .= "\n"; - } - $usersummary .= "\n" - . "\n"; - - $userlist = getuserlist(); - - $ui = count($userlist); - $usrhimself = $userlist[0]; - $usrhimself =array_map('htmlspecialchars',$usrhimself); - unset($userlist[0]); - - // output users - // output admin user only if the user logged in has user management rights - $usersummary .= "\n"; - - // Action colum first - $usersummary .= "\n"; - - $usersummary .= "\n" - . "\n" - . "\n"; - if($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - $noofsurveys=$connect->GetOne('Select count(*) from '.db_table_name('surveys').' where owner_id='.$usrhimself['uid']); - $usersummary .= "\n"; - } - - if(isset($usrhimself['parent_id']) && $usrhimself['parent_id']!=0) { - $uquery = "SELECT users_name FROM ".db_table_name('users')." WHERE uid=".$usrhimself['parent_id']; - $uresult = db_execute_assoc($uquery); //Checked - $srow = $uresult->FetchRow(); - $usersummary .= "\n"; - } - else - { - $usersummary .= "\n"; - } - - $usersummary.="\n"; - - // other users - $row = 0; - $usr_arr = $userlist; - $noofsurveyslist = array( ); - - //This loops through for each user and checks the amount of surveys against them. - for($i=1;$i<=count($usr_arr);$i++) - { - $noofsurveyslist[$i]=$connect->GetOne('Select count(*) from '.db_table_name('surveys').' where owner_id='.$usr_arr[$i]['uid']); - } - - for($i=1; $i<=count($usr_arr); $i++) - { - - $usr = $usr_arr[$i]; - $usr =array_map('htmlspecialchars',$usr); - - $usersummary .= "\n"; - - $usersummary .= "\n"; - $usersummary .= "\n" - . "\n" - . "\n"; - - $usersummary .= "\n"; - - // Get Parent's User Name - $uquery = "SELECT users_name FROM ".db_table_name('users')." WHERE uid=".$usr['parent_id']; - $uresult = db_execute_assoc($uquery); //Checked - $userlist = array(); - $srow = $uresult->FetchRow(); - $usr['parent'] = $srow['users_name']; - - //TODO: Find out why parent isn't set - // ==> because it is parent_id ;-) - if (isset($usr['parent_id'])) - { - $usersummary .= "\n"; - } else - { - $usersummary .= "\n"; - } - - - $usersummary .= "\n"; - $row++; - } - $usersummary .= "
        ".$clang->gT("Action")."".$clang->gT("Username")."".$clang->gT("Email")."".$clang->gT("Full name")."".$clang->gT("No of surveys")."".$clang->gT("Created by")."
        \n"; - - - $usersummary .= "
        " - ."" - ."" - ."" - ."
        "; - if ($usrhimself['parent_id'] != 0 && $_SESSION['USER_RIGHT_DELETE_USER'] == 1 ) - { - $usersummary .= "
        " - ."" - ."" - ."" - ."" - ."
        "; - } - - $usersummary .= "
        {$usrhimself['user']}{$usrhimself['email']}{$usrhimself['full_name']}{$noofsurveys}{$srow['users_name']}---
        \n"; - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $usr['uid'] == $_SESSION['loginID'] || ($_SESSION['USER_RIGHT_CREATE_USER'] == 1 && $usr['parent_id'] == $_SESSION['loginID'])) - { - $usersummary .= "
        " - ."" - ."" - ."" - ."
        "; - } - - if ( (($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 && - $usr['uid'] != $_SESSION['loginID'] ) || - ($_SESSION['USER_RIGHT_CREATE_USER'] == 1 && - $usr['parent_id'] == $_SESSION['loginID'])) && $usr['uid']!=1) - { - $usersummary .= "
        " - ."" - ."" - ."" - ."" - ."
        "; - } - if ($_SESSION['loginID'] == "1" && $usr['parent_id'] !=1 ) - { - $usersummary .= "
        " - ."" - ."" - ."" - ."" - ."" - ."
        "; - } - if (($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $_SESSION['USER_RIGHT_MANAGE_TEMPLATE'] == 1) && $usr['uid']!=1) - { - $usersummary .= "
        " - ."" - ."" - ."" - ."" - ."
        "; - } - - // users are allowed to delete all successor users (but the admin not himself) - if (($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || ($_SESSION['USER_RIGHT_DELETE_USER'] == 1 && $usr['parent_id'] == $_SESSION['loginID']))&& $usr['uid']!=1) - { - $usersummary .= "
        " - ."" - ."" - ."" - ."" - ."
        "; - } - - - $usersummary .= "
        {$usr['user']}{$usr['email']}{$usr['full_name']}{$noofsurveyslist[$i]}{$usr['parent']}-----

        "; - - if($_SESSION['USER_RIGHT_SUPERADMIN'] == 1 || $_SESSION['USER_RIGHT_CREATE_USER']) - { - $usersummary .= "
        \n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "
        ".$clang->gT("Add user:")." " - . "

        \n"; - } - -} - -if ($action == "addusergroup") -{ - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) // only admins may do that - { - $usersummary ="
        ".$clang->gT("Add User Group")."
        \n" - . "
        " - . "
          \n" - . "
        • \n" - . " ".$clang->gT("Required")."
        • \n" - . "
        • \n" - . "
        • \n" - . "

        \n" - . "\n" - . "

        \n"; - } -} - -if ($action == "editusergroup") -{ - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - $query = "SELECT * FROM ".db_table_name('user_groups')." WHERE ugid = ".$ugid." AND owner_id = ".$_SESSION['loginID']; - $result = db_select_limit_assoc($query, 1); - $esrow = $result->FetchRow(); - $usersummary = "
        ".sprintf($clang->gT("Editing user group (Owner: %s)"),$_SESSION['user'])."
        " - ."
        " - . "
          \n" - . "
        • \n" - . "
        • \n" - . "
        • \n" - . "
        • \n" - . "

            \n" - . "\n" - . "\n" - . "\n" - . "

            \n"; - } -} - -if ($action == "mailusergroup") -{ - $query = "SELECT a.ugid, a.name, a.owner_id, b.uid FROM ".db_table_name('user_groups') ." AS a LEFT JOIN ".db_table_name('user_in_groups') ." AS b ON a.ugid = b.ugid WHERE a.ugid = {$ugid} AND uid = {$_SESSION['loginID']} ORDER BY name"; - $result = db_execute_assoc($query); //Checked - $crow = $result->FetchRow(); - - $usersummary = "
            ".$clang->gT("Mail to all Members")."
            " - . "
              " - . "
            • \n" - . "
            • \n" - . "
            • \n" - . "
            • \n" - . "
            • \n" - . "
            • \n" - . "

            \n" - . "
            " - . "\n" - . "\n" - . "

            \n"; -} - -if ($action == "delusergroup") -{ - $usersummary = "
            ".$clang->gT("Deleting User Group")."...
            \n"; - $usersummary .= "
            \n"; - - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - - if(!empty($postusergroupid) && ($postusergroupid > -1)) - { - $query = "SELECT ugid, name, owner_id FROM ".db_table_name('user_groups')." WHERE ugid = {$postusergroupid} AND owner_id = ".$_SESSION['loginID']; - $result = db_select_limit_assoc($query, 1); - if($result->RecordCount() > 0) - { - $row = $result->FetchRow(); - - $remquery = "DELETE FROM ".db_table_name('user_groups')." WHERE ugid = {$postusergroupid} AND owner_id = {$_SESSION['loginID']}"; - if($connect->Execute($remquery)) //Checked - { - $usersummary .= "
            ".$clang->gT("Group Name").": {$row['name']}

            \n"; - $usersummary .= "
            ".$clang->gT("Success!")."
            \n"; - } - else - { - $usersummary .= "
            ".$clang->gT("Could not delete user group.")."
            \n"; - } - $usersummary .= "
            gT("Continue")."\"/>\n"; - } - else - { - include("access_denied.php"); - } - } - else - { - $usersummary .= "
            ".$clang->gT("Could not delete user group. No group selected.")."
            \n"; - $usersummary .= "
            gT("Continue")."\"/>\n"; - } - } - $usersummary .= "
            \n"; -} - -if ($action == "usergroupindb") -{ - $usersummary = "
            ".$clang->gT("Adding User Group")."...
            \n"; - $usersummary .= "
            \n"; - - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - - $db_group_name = db_quote($_POST['group_name']); - $db_group_description = db_quote($_POST['group_description']); - $html_group_name = htmlspecialchars($_POST['group_name']); - $html_group_description = htmlspecialchars($_POST['group_description']); - - if(isset($db_group_name) && strlen($db_group_name) > 0) - { - $ugid = addUserGroupInDB($db_group_name, $db_group_description); - if($ugid > 0) - { - $usersummary .= "
            ".$clang->gT("Group Name").": ".$html_group_name."

            \n"; - - if(isset($db_group_description) && strlen($db_group_description) > 0) - { - $usersummary .= $clang->gT("Description: ").$html_group_description."

            \n"; - } - - $usersummary .= "
            ".$clang->gT("User group successfully added!")."
            \n"; - $usersummary .= "
            gT("Continue")."\"/>\n"; - } - else - { - $usersummary .= "
            ".$clang->gT("Failed to add Group!")."
            \n" - . "
            " . $clang->gT("Group already exists!")."
            \n"; - $usersummary .= "
            gT("Continue")."\"/>\n"; - } - } - else - { - $usersummary .= "
            ".$clang->gT("Failed to add Group!")."
            \n" - . "
            " . $clang->gT("Group name was not supplied!")."
            \n"; - $usersummary .= "
            gT("Continue")."\"/>\n"; - } - } - else - { - include("access_denied.php"); - } - $usersummary .= "
            \n"; -} - -if ($action == "mailsendusergroup") -{ - $usersummary = "
            ".$clang->gT("Mail to all Members")."
            \n"; - $usersummary .= "
            \n"; - - // user must be in user group - // or superadmin - $query = "SELECT uid FROM ".db_table_name('user_in_groups') ." WHERE ugid = {$ugid} AND uid = {$_SESSION['loginID']}"; - $result = db_execute_assoc($query); //Checked - - if($result->RecordCount() > 0 || - $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - - $eguquery = "SELECT * FROM ".db_table_name("user_in_groups")." AS a INNER JOIN ".db_table_name("users")." AS b ON a.uid = b.uid WHERE ugid = " . $ugid . " AND b.uid != {$_SESSION['loginID']} ORDER BY b.users_name"; - $eguresult = db_execute_assoc($eguquery); //Checked - $addressee = ''; - $to = ''; - while ($egurow = $eguresult->FetchRow()) - { - $to .= $egurow['users_name']. ' <'.$egurow['email'].'>'. '; ' ; - $addressee .= $egurow['users_name'].', '; - } - $to = substr("$to", 0, -2); - $addressee = substr("$addressee", 0, -2); - - $from_user = "SELECT email, users_name, full_name FROM ".db_table_name("users")." WHERE uid = " .$_SESSION['loginID']; - $from_user_result = db_execute_assoc($from_user); //Checked - $from_user_row = $from_user_result->FetchRow(); - if ($from_user_row['full_name']) - { - $from = $from_user_row['full_name'].' <'.$from_user_row['email'].'> '; - } - else - { - $from = $from_user_row['users_name'].' <'.$from_user_row['email'].'> '; - } - - $ugid = $postusergroupid; - $body = $_POST['body']; - $subject = $_POST['subject']; - - if(isset($_POST['copymail']) && $_POST['copymail'] == 1) - { - $to .= ", " . $from; - } - - $body = str_replace("\n.", "\n..", $body); - $body = wordwrap($body, 70); - - - //echo $body . '-'.$subject .'-'.'
            '.htmlspecialchars($to).'
            '.'-'.$from; - if (SendEmailMessage(null, $body, $subject, $to, $from,'')) - { - $usersummary = "
            \n"; - $usersummary .= "
            ".$clang->gT("Message(s) sent successfully!")."
            \n" - . "
            ".$clang->gT("To:")."". $addressee."
            \n" - . "
            gT("Continue")."\"/>\n"; - } - else - { - $usersummary = "
            \n"; - $usersummary .= "
            ".sprintf($clang->gT("Email to %s failed. Error Message:"),$to)." ".$maildebug."
            "; - if ($debug>0) - { - $usersummary .= "
            Subject : $subject

            ".htmlspecialchars($maildebugbody)."
            "; - } - - $usersummary .= "
            gT("Continue")."\"/>\n"; - } - } - else - { - include("access_denied.php"); - } - $usersummary .= "
            \n"; -} - -if ($action == "editusergroupindb") -{ - - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - $ugid = $postusergroupid; - - $db_name = db_quote($_POST['name']); - $db_description = db_quote($_POST['description']); - $html_name = html_escape($_POST['name']); - $html_description = html_escape($_POST['description']); - - $usersummary = "
            \n"; - if(updateusergroup($db_name, $db_description, $ugid)) - { - - $usersummary .= "
            ".$clang->gT("Edit User Group Successfully!")."
            \n" - . "
            ".$clang->gT("Name").": {$html_name}
            \n" - . $clang->gT("Description: ").$html_description."
            \n" - . "
            ".$clang->gT("Continue")."
             \n"; - } - else - { - $usersummary .= "
            ".$clang->gT("Failed to update!")."
            \n" - . "
            ".$clang->gT("Continue")."
             \n"; - } - $usersummary .= "
            \n"; - } - else - { - include("access_denied.php"); - } - -} - -if ($action == "editusergroups" ) -{ - // REMOVING CONDITION ON loginID == 1 - // editusergroups is only to display groups - // a user is in - //if ( $_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - if ( isset($_SESSION['loginID'])) - { - if(isset($_GET['ugid'])) - { - $ugid = sanitize_int($_GET['ugid']); - - $query = "SELECT a.ugid, a.name, a.owner_id, a.description, b.uid FROM ".db_table_name('user_groups') ." AS a LEFT JOIN ".db_table_name('user_in_groups') ." AS b ON a.ugid = b.ugid WHERE a.ugid = {$ugid} AND uid = {$_SESSION['loginID']} ORDER BY name"; - $result = db_execute_assoc($query); //Checked - $crow = $result->FetchRow(); - - if($result->RecordCount() > 0) - { - - if(!empty($crow['description'])) - { - $usergroupsummary .= "\n" - . "\n" - . "
            " - . "".$clang->gT("Description: ")."" - . "{$crow['description']}
            "; - } - - - $eguquery = "SELECT * FROM ".db_table_name("user_in_groups")." AS a INNER JOIN ".db_table_name("users")." AS b ON a.uid = b.uid WHERE ugid = " . $ugid . " ORDER BY b.users_name"; - $eguresult = db_execute_assoc($eguquery); //Checked - $usergroupsummary .= "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n"; - - $query2 = "SELECT ugid FROM ".db_table_name('user_groups')." WHERE ugid = ".$ugid." AND owner_id = ".$_SESSION['loginID']; - $result2 = db_select_limit_assoc($query2, 1); - $row2 = $result2->FetchRow(); - - $row = 1; - $usergroupentries=''; - while ($egurow = $eguresult->FetchRow()) - { - if (!isset($bgcc)) {$bgcc="evenrow";} - else - { - if ($bgcc == "evenrow") {$bgcc = "oddrow";} - else {$bgcc = "evenrow";} - } - - if($egurow['uid'] == $crow['owner_id']) - { - $usergroupowner = "\n" - . "\n" - . "\n" - . "\n" - . ""; - continue; - } - - // output users - - $usergroupentries .= "\n" - . "\n"; - $usergroupentries .= "\n" - . "\n" - . "\n"; - $row++; - } - $usergroupsummary .= $usergroupowner; - if (isset($usergroupentries)) {$usergroupsummary .= $usergroupentries;}; - $usergroupsummary .= '
            ".$clang->gT("Action")."".$clang->gT("Username")."".$clang->gT("Email")."
             {$egurow['users_name']}{$egurow['email']}
            \n"; - - if($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - $usergroupentries .= "
            " - ." " - ." " - ." " - ." "; - } - $usergroupentries .= "
            " - . "
            {$egurow['users_name']}{$egurow['email']}
            '; - - if(isset($row2['ugid'])) - { - $usergroupsummary .= "
            \n" - . "\n" - . "" - . "\n" - . "
              \n" - . "\n" - . "
            \n" - . "
            \n"; - } - } - else - { - include("access_denied.php"); - } - } - } - else - { - include("access_denied.php"); - } -} - -if($action == "deleteuserfromgroup") -{ - - $usersummary = "
            ".$clang->gT("Delete User")."
            \n"; - $usersummary .= "
            \n"; - - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - $ugid = $postusergroupid; - $uid = $postuserid; - - $query = "SELECT ugid, owner_id FROM ".db_table_name('user_groups')." WHERE ugid = ".$ugid." AND ((owner_id = ".$_SESSION['loginID']." AND owner_id != ".$uid.") OR (owner_id != ".$_SESSION['loginID']." AND $uid = ".$_SESSION['loginID']."))"; - $result = db_execute_assoc($query); //Checked - if($result->RecordCount() > 0) - { - $remquery = "DELETE FROM ".db_table_name('user_in_groups')." WHERE ugid = {$ugid} AND uid = {$uid}"; - if($connect->Execute($remquery)) //Checked - { - $usersummary .= "
            ".$clang->gT("Username").": ".sanitize_xss_string(strip_tags($_POST['user']))."

            \n"; - $usersummary .= "
            ".$clang->gT("Success!")."
            \n"; - } - else - { - $usersummary .= "
            ".$clang->gT("Could not delete user. User was not supplied.")."
            \n"; - } - } - else - { - include("access_denied.php"); - } - if($_SESSION['loginID'] != $postuserid) - { - $usersummary .= "
            gT("Continue")."\"/>\n"; - } - else - { - $usersummary .= "
            gT("Continue")."\"/>\n"; - } - } - else - { - include("access_denied.php"); - } - $usersummary .= "
            \n"; -} - - - - -if($action == "addusertogroup") -{ - $ugid=returnglobal('ugid'); - - $addsummary = "
            ".$clang->gT("Adding User to group")."...
            \n"; - $addsummary .= "
            \n"; - - if ($_SESSION['USER_RIGHT_SUPERADMIN'] == 1) - { - - $query = "SELECT ugid, owner_id FROM ".db_table_name('user_groups')." WHERE ugid = {$ugid} AND owner_id = ".$_SESSION['loginID']." AND owner_id != ".$postuserid; - $result = db_execute_assoc($query); //Checked - if($result->RecordCount() > 0) - { - if($postuserid > 0) - { - $isrquery = "INSERT INTO {$dbprefix}user_in_groups VALUES({$ugid},{$postuserid})"; - $isrresult = $connect->Execute($isrquery); //Checked - - if($isrresult) - { - $addsummary .= "
            ".$clang->gT("User added.")."
            \n"; - } - else // ToDo: for this to happen the keys on the table must still be set accordingly - { - // Username already exists. - $addsummary .= "
            ".$clang->gT("Failed to add user.")."
            \n" - . "
            " . $clang->gT("Username already exists.")."
            \n"; - } - } - else - { - $addsummary .= "
            ".$clang->gT("Failed to add user.")."
            \n" - . "
            " . $clang->gT("No Username selected.")."
            \n"; - } - $addsummary .= "
            gT("Continue")."\"/>\n"; - } - else - { - include("access_denied.php"); - } - } - else - { - include("access_denied.php"); - } - $addsummary .= "
            \n"; -} - - -function updateusergroup($name, $description, $ugid) -{ - global $dbprefix, $scriptname, $connect; - - $uquery = "UPDATE ".db_table_name('user_groups')." SET name = '$name', description = '$description' WHERE ugid =$ugid"; - // TODO - return $connect->Execute($uquery) or safe_die($connect->ErrorMsg()) ; //Checked -} - -function refreshtemplates() { - global $connect ; - global $dbprefix ; - - $template_a = gettemplatelist(); - foreach ($template_a as $tp=>$fullpath) { - // check for each folder if there is already an entry in the database - // if not create it with current user as creator (user with rights "create user" can assign template rights) - $query = "SELECT * FROM ".$dbprefix."templates WHERE folder LIKE '".$tp."'"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - - if ($result->RecordCount() == 0) { - $query2 = "INSERT INTO ".$dbprefix."templates (".db_quote_id('folder').",".db_quote_id('creator').") VALUES ('".$tp."', ".$_SESSION['loginID'].')' ; - $connect->Execute($query2) or safe_die($connect->ErrorMsg()); //Checked - } - } - return true; -} - -// adds Usergroups in Database by Moses -function addUserGroupInDB($group_name, $group_description) { - global $connect; - $iquery = "INSERT INTO ".db_table_name('user_groups')." (name, description, owner_id) VALUES('{$group_name}', '{$group_description}', '{$_SESSION['loginID']}')"; - if($connect->Execute($iquery)) { //Checked - $id = $connect->Insert_Id(db_table_name_nq('user_groups'),'ugid'); - if($id > 0) { - $iquery = "INSERT INTO ".db_table_name('user_in_groups')." VALUES($id, '{$_SESSION['loginID']}')"; - $connect->Execute($iquery ) or safe_die($connect->ErrorMsg()); //Checked - } - return $id; - } else { - return -1; - } -} - -?> diff --git a/include/limesurvey/admin/vvexport.php b/include/limesurvey/admin/vvexport.php deleted file mode 100644 index cb46e246..00000000 --- a/include/limesurvey/admin/vvexport.php +++ /dev/null @@ -1,191 +0,0 @@ -gT("Export VV file")). - "
            " - ."
            ".$clang->gT("Export a VV survey file")."
            " - ."
              " - ."
            • " - ."" - ."" - ."
            • \n" - ."
            • \n" - ." " - ." \n" - ."
            • \n"; - -$quexsfilterstate = questionnaireSampleFilterstate(); - - //queXS Addition - include_once("../quexs.php"); - $vvoutput .= "
            • \n"; - - $vvoutput .= - - "
            • \n" - ." \n" - ." *\n" - ."
            • \n" - ."
            \n" - ."

             " - ."" - ."

            " - - ."

            * ".$clang->gT("For easy opening in MS Excel, change the extension to 'tab' or 'txt'")."
            \n"; -} -elseif (isset($surveyid) && $surveyid) -{ - //Export is happening - $extension=sanitize_paranoid_string(returnglobal('extension')); - header("Content-Disposition: attachment; filename=vvexport_$surveyid.".$extension); - header("Content-type: text/comma-separated-values; charset=UTF-8"); - header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); - header("Pragma: cache"); - $s="\t"; - - $fieldmap=createFieldMap($surveyid, "full"); - $surveytable = "{$dbprefix}survey_$surveyid"; - - GetBaseLanguageFromSurveyID($surveyid); - - $fieldnames = array_values($connect->MetaColumnNames($surveytable, true)); - - //Create the human friendly first line - $firstline=""; - $secondline=""; - foreach ($fieldnames as $field) - { - $fielddata=arraySearchByKey($field, $fieldmap, "fieldname", 1); - //$vvoutput .= "

            ";print_r($fielddata);$vvoutput .= "
            "; - if (count($fielddata) < 1) {$firstline.=$field;} - else - //{$firstline.=str_replace("\n", " ", str_replace("\t", " ", strip_tags($fielddata['question'])));} - {$firstline.=preg_replace('/\s+/',' ',strip_tags($fielddata['question']));} - $firstline .= $s; - $secondline .= $field.$s; - } - $vvoutput = $firstline."\n"; - $vvoutput .= $secondline."\n"; - $query = "SELECT * FROM $surveytable"; - - $qfs = questionnaireSampleFilterstate(); - if ($qfs != false) - { - //Limit responses by questionnaire and/or sample - $query .= " JOIN `case` AS c ON ({$dbprefix}survey_$surveyid.token = c.token AND c.questionnaire_id = '{$qfs[0]}') "; - if ($qfs[1] != 0) //if a sample is selected - $query .= " JOIN `sample` AS s ON (s.sample_id = c.sample_id AND s.import_id = '{$qfs[1]}') "; - } - - if (incompleteAnsFilterstate() == "inc") - { - $query .= " WHERE submitdate IS NULL "; - } - elseif (incompleteAnsFilterstate() == "filter") - { - $query .= " WHERE submitdate >= ".$connect->DBDate('1980-01-01'). " "; - } - $result = db_execute_assoc($query) or safe_die("Error:
            $query
            ".$connect->ErrorMsg()); //Checked - - while ($row=$result->FetchRow()) - { - foreach ($fieldnames as $field) - { - if (is_null($row[$field])) - { - $value='{question_not_shown}'; - } - else - { - $value=trim($row[$field]); - // sunscreen for the value. necessary for the beach. - // careful about the order of these arrays: - // lbrace has to be substituted *first* - $value=str_replace(array("{", - "\n", - "\r", - "\t"), - array("{lbrace}", - "{newline}", - "{cr}", - "{tab}"), - $value); - } - // one last tweak: excel likes to quote values when it - // exports as tab-delimited (esp if value contains a comma, - // oddly enough). So we're going to encode a leading quote, - // if it occurs, so that we can tell the difference between - // strings that "really are" quoted, and those that excel quotes - // for us. - $value=preg_replace('/^"/','{quote}',$value); - // yay! that nasty soab won't hurt us now! - if($field == "submitdate" && !$value) {$value = "NULL";} - $sun[]=$value; - } - $beach=implode($s, $sun); - $vvoutput .= $beach; - unset($sun); - $vvoutput .= "\n"; - } - echo $vvoutput; - exit; - - //$vvoutput .= "
            $firstline
            "; - //$vvoutput .= "
            $secondline
            "; - //$vvoutput .= "
            "; print_r($fieldnames); $vvoutput .= "
            "; - //$vvoutput .= "
            "; print_r($fieldmap); $vvoutput .= "
            "; - -} - -?> diff --git a/include/limesurvey/admin/vvimport.php b/include/limesurvey/admin/vvimport.php deleted file mode 100644 index 801ca5ab..00000000 --- a/include/limesurvey/admin/vvimport.php +++ /dev/null @@ -1,323 +0,0 @@ -$clang->gT("ARMSCII-8 Armenian") -,"ascii"=>$clang->gT("US ASCII") -,"auto"=>$clang->gT("Automatic") -,"big5"=>$clang->gT("Big5 Traditional Chinese") -,"binary"=>$clang->gT("Binary pseudo charset") -,"cp1250"=>$clang->gT("Windows Central European") -,"cp1251"=>$clang->gT("Windows Cyrillic") -,"cp1256"=>$clang->gT("Windows Arabic") -,"cp1257"=>$clang->gT("Windows Baltic") -,"cp850"=>$clang->gT("DOS West European") -,"cp852"=>$clang->gT("DOS Central European") -,"cp866"=>$clang->gT("DOS Russian") -,"cp932"=>$clang->gT("SJIS for Windows Japanese") -,"dec8"=>$clang->gT("DEC West European") -,"eucjpms"=>$clang->gT("UJIS for Windows Japanese") -,"euckr"=>$clang->gT("EUC-KR Korean") -,"gb2312"=>$clang->gT("GB2312 Simplified Chinese") -,"gbk"=>$clang->gT("GBK Simplified Chinese") -,"geostd8"=>$clang->gT("GEOSTD8 Georgian") -,"greek"=>$clang->gT("ISO 8859-7 Greek") -,"hebrew"=>$clang->gT("ISO 8859-8 Hebrew") -,"hp8"=>$clang->gT("HP West European") -,"keybcs2"=>$clang->gT("DOS Kamenicky Czech-Slovak") -,"koi8r"=>$clang->gT("KOI8-R Relcom Russian") -,"koi8u"=>$clang->gT("KOI8-U Ukrainian") -,"latin1"=>$clang->gT("cp1252 West European") -,"latin2"=>$clang->gT("ISO 8859-2 Central European") -,"latin5"=>$clang->gT("ISO 8859-9 Turkish") -,"latin7"=>$clang->gT("ISO 8859-13 Baltic") -,"macce"=>$clang->gT("Mac Central European") -,"macroman"=>$clang->gT("Mac West European") -,"sjis"=>$clang->gT("Shift-JIS Japanese") -,"swe7"=>$clang->gT("7bit Swedish") -,"tis620"=>$clang->gT("TIS620 Thai") -,"ucs2"=>$clang->gT("UCS-2 Unicode") -,"ujis"=>$clang->gT("EUC-JP Japanese") -,"utf8"=>$clang->gT("UTF-8 Unicode")); -if (isset($_POST['vvcharset']) && $_POST['vvcharset']) //sanitize charset - if encoding is not found sanitize to 'utf8' which is the default for vvexport -{ - $uploadcharset=$_POST['vvcharset']; - if (!array_key_exists($uploadcharset,$encodingsarray)) {$uploadcharset='utf8';} -} - -if ($subaction != "upload") -{ - asort($encodingsarray); - $charsetsout=''; - foreach ($encodingsarray as $charset=>$title) - { - $charsetsout.="
        Import Fields:
        "; print_r($fieldnames); $vvoutput .= "
        Actual Fields:
        "; print_r($realfieldnames); $vvoutput .= '
        ", - $header, - "
        ", - $grid, - "
        ", - $footer, - "
        "; - } -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-pear.inc.php b/include/limesurvey/classes/adodb/adodb-pear.inc.php deleted file mode 100644 index e65b0361..00000000 --- a/include/limesurvey/classes/adodb/adodb-pear.inc.php +++ /dev/null @@ -1,374 +0,0 @@ - | - * and Tomas V.V.Cox . Portions (c)1997-2002 The PHP Group. - */ - -/* - We support: - - DB_Common - --------- - query - returns PEAR_Error on error - limitQuery - return PEAR_Error on error - prepare - does not return PEAR_Error on error - execute - does not return PEAR_Error on error - setFetchMode - supports ASSOC and ORDERED - errorNative - quote - nextID - disconnect - - getOne - getAssoc - getRow - getCol - getAll - - DB_Result - --------- - numRows - returns -1 if not supported - numCols - fetchInto - does not support passing of fetchmode - fetchRows - does not support passing of fetchmode - free - */ - -define('ADODB_PEAR',dirname(__FILE__)); -include_once "PEAR.php"; -include_once ADODB_PEAR."/adodb-errorpear.inc.php"; -include_once ADODB_PEAR."/adodb.inc.php"; - -if (!defined('DB_OK')) { - define("DB_OK", 1); - define("DB_ERROR",-1); - - // autoExecute constants - define('DB_AUTOQUERY_INSERT', 1); - define('DB_AUTOQUERY_UPDATE', 2); - - /** - * This is a special constant that tells DB the user hasn't specified - * any particular get mode, so the default should be used. - */ - - define('DB_FETCHMODE_DEFAULT', 0); - - /** - * Column data indexed by numbers, ordered from 0 and up - */ - - define('DB_FETCHMODE_ORDERED', 1); - - /** - * Column data indexed by column names - */ - - define('DB_FETCHMODE_ASSOC', 2); - - /* for compatibility */ - - define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); - define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); - - /** - * these are constants for the tableInfo-function - * they are bitwised or'ed. so if there are more constants to be defined - * in the future, adjust DB_TABLEINFO_FULL accordingly - */ - - define('DB_TABLEINFO_ORDER', 1); - define('DB_TABLEINFO_ORDERTABLE', 2); - define('DB_TABLEINFO_FULL', 3); -} - -/** - * The main "DB" class is simply a container class with some static - * methods for creating DB objects as well as some utility functions - * common to all parts of DB. - * - */ - -class DB -{ - /** - * Create a new DB object for the specified database type - * - * @param $type string database type, for example "mysql" - * - * @return object a newly created DB object, or a DB error code on - * error - */ - - function factory($type) - { - include_once(ADODB_DIR."/drivers/adodb-$type.inc.php"); - $obj = NewADOConnection($type); - if (!is_object($obj)) $obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); - return $obj; - } - - /** - * Create a new DB object and connect to the specified database - * - * @param $dsn mixed "data source name", see the DB::parseDSN - * method for a description of the dsn format. Can also be - * specified as an array of the format returned by DB::parseDSN. - * - * @param $options mixed if boolean (or scalar), tells whether - * this connection should be persistent (for backends that support - * this). This parameter can also be an array of options, see - * DB_common::setOption for more information on connection - * options. - * - * @return object a newly created DB connection object, or a DB - * error object on error - * - * @see DB::parseDSN - * @see DB::isError - */ - function connect($dsn, $options = false) - { - if (is_array($dsn)) { - $dsninfo = $dsn; - } else { - $dsninfo = DB::parseDSN($dsn); - } - switch ($dsninfo["phptype"]) { - case 'pgsql': $type = 'postgres7'; break; - case 'ifx': $type = 'informix9'; break; - default: $type = $dsninfo["phptype"]; break; - } - - if (is_array($options) && isset($options["debug"]) && - $options["debug"] >= 2) { - // expose php errors with sufficient debug level - @include_once("adodb-$type.inc.php"); - } else { - @include_once("adodb-$type.inc.php"); - } - - @$obj = NewADOConnection($type); - if (!is_object($obj)) { - $obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); - return $obj; - } - if (is_array($options)) { - foreach($options as $k => $v) { - switch(strtolower($k)) { - case 'persist': - case 'persistent': $persist = $v; break; - #ibase - case 'dialect': $obj->dialect = $v; break; - case 'charset': $obj->charset = $v; break; - case 'buffers': $obj->buffers = $v; break; - #ado - case 'charpage': $obj->charPage = $v; break; - #mysql - case 'clientflags': $obj->clientFlags = $v; break; - } - } - } else { - $persist = false; - } - - if (isset($dsninfo['socket'])) $dsninfo['hostspec'] .= ':'.$dsninfo['socket']; - else if (isset($dsninfo['port'])) $dsninfo['hostspec'] .= ':'.$dsninfo['port']; - - if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); - else $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); - - if (!$ok) $obj = ADODB_PEAR_Error(); - return $obj; - } - - /** - * Return the DB API version - * - * @return int the DB API version number - */ - function apiVersion() - { - return 2; - } - - /** - * Tell whether a result code from a DB method is an error - * - * @param $value int result code - * - * @return bool whether $value is an error - */ - function isError($value) - { - if (!is_object($value)) return false; - $class = strtolower(get_class($value)); - return $class == 'pear_error' || is_subclass_of($value, 'pear_error') || - $class == 'db_error' || is_subclass_of($value, 'db_error'); - } - - - /** - * Tell whether a result code from a DB method is a warning. - * Warnings differ from errors in that they are generated by DB, - * and are not fatal. - * - * @param $value mixed result value - * - * @return bool whether $value is a warning - */ - function isWarning($value) - { - return false; - /* - return is_object($value) && - (get_class( $value ) == "db_warning" || - is_subclass_of($value, "db_warning"));*/ - } - - /** - * Parse a data source name - * - * @param $dsn string Data Source Name to be parsed - * - * @return array an associative array with the following keys: - * - * phptype: Database backend used in PHP (mysql, odbc etc.) - * dbsyntax: Database used with regards to SQL syntax etc. - * protocol: Communication protocol to use (tcp, unix etc.) - * hostspec: Host specification (hostname[:port]) - * database: Database to use on the DBMS server - * username: User name for login - * password: Password for login - * - * The format of the supplied DSN is in its fullest form: - * - * phptype(dbsyntax)://username:password@protocol+hostspec/database - * - * Most variations are allowed: - * - * phptype://username:password@protocol+hostspec:110//usr/db_file.db - * phptype://username:password@hostspec/database_name - * phptype://username:password@hostspec - * phptype://username@hostspec - * phptype://hostspec/database - * phptype://hostspec - * phptype(dbsyntax) - * phptype - * - * @author Tomas V.V.Cox - */ - function parseDSN($dsn) - { - if (is_array($dsn)) { - return $dsn; - } - - $parsed = array( - 'phptype' => false, - 'dbsyntax' => false, - 'protocol' => false, - 'hostspec' => false, - 'database' => false, - 'username' => false, - 'password' => false - ); - - // Find phptype and dbsyntax - if (($pos = strpos($dsn, '://')) !== false) { - $str = substr($dsn, 0, $pos); - $dsn = substr($dsn, $pos + 3); - } else { - $str = $dsn; - $dsn = NULL; - } - - // Get phptype and dbsyntax - // $str => phptype(dbsyntax) - if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { - $parsed['phptype'] = $arr[1]; - $parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2]; - } else { - $parsed['phptype'] = $str; - $parsed['dbsyntax'] = $str; - } - - if (empty($dsn)) { - return $parsed; - } - - // Get (if found): username and password - // $dsn => username:password@protocol+hostspec/database - if (($at = strpos($dsn,'@')) !== false) { - $str = substr($dsn, 0, $at); - $dsn = substr($dsn, $at + 1); - if (($pos = strpos($str, ':')) !== false) { - $parsed['username'] = urldecode(substr($str, 0, $pos)); - $parsed['password'] = urldecode(substr($str, $pos + 1)); - } else { - $parsed['username'] = urldecode($str); - } - } - - // Find protocol and hostspec - // $dsn => protocol+hostspec/database - if (($pos=strpos($dsn, '/')) !== false) { - $str = substr($dsn, 0, $pos); - $dsn = substr($dsn, $pos + 1); - } else { - $str = $dsn; - $dsn = NULL; - } - - // Get protocol + hostspec - // $str => protocol+hostspec - if (($pos=strpos($str, '+')) !== false) { - $parsed['protocol'] = substr($str, 0, $pos); - $parsed['hostspec'] = urldecode(substr($str, $pos + 1)); - } else { - $parsed['hostspec'] = urldecode($str); - } - - // Get dabase if any - // $dsn => database - if (!empty($dsn)) { - $parsed['database'] = $dsn; - } - - return $parsed; - } - - /** - * Load a PHP database extension if it is not loaded already. - * - * @access public - * - * @param $name the base name of the extension (without the .so or - * .dll suffix) - * - * @return bool true if the extension was already or successfully - * loaded, false if it could not be loaded - */ - function assertExtension($name) - { - if (!extension_loaded($name)) { - $dlext = (strncmp(PHP_OS,'WIN',3) === 0) ? '.dll' : '.so'; - @dl($name . $dlext); - } - if (!extension_loaded($name)) { - return false; - } - return true; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-perf.inc.php b/include/limesurvey/classes/adodb/adodb-perf.inc.php deleted file mode 100644 index d66a8e77..00000000 --- a/include/limesurvey/classes/adodb/adodb-perf.inc.php +++ /dev/null @@ -1,1100 +0,0 @@ -= minimum number of secs to run - - -// returns in K the memory of current process, or 0 if not known -function adodb_getmem() -{ - if (function_exists('memory_get_usage')) - return (integer) ((memory_get_usage()+512)/1024); - - $pid = getmypid(); - - if ( strncmp(strtoupper(PHP_OS),'WIN',3)==0) { - $output = array(); - - exec('tasklist /FI "PID eq ' . $pid. '" /FO LIST', $output); - return substr($output[5], strpos($output[5], ':') + 1); - } - - /* Hopefully UNIX */ - exec("ps --pid $pid --no-headers -o%mem,size", $output); - if (sizeof($output) == 0) return 0; - - $memarr = explode(' ',$output[0]); - if (sizeof($memarr)>=2) return (integer) $memarr[1]; - - return 0; -} - -// avoids localization problems where , is used instead of . -function adodb_round($n,$prec) -{ - return number_format($n, $prec, '.', ''); -} - -/* obsolete: return microtime value as a float. Retained for backward compat */ -function adodb_microtime() -{ - return microtime(true); -} - -/* sql code timing */ -function adodb_log_sql(&$connx,$sql,$inputarr) -{ - $perf_table = adodb_perf::table(); - $connx->fnExecute = false; - $a0 = microtime(true); - $rs = $connx->Execute($sql,$inputarr); - $a1 = microtime(true); - - if (!empty($connx->_logsql) && (empty($connx->_logsqlErrors) || !$rs)) { - global $ADODB_LOG_CONN; - - if (!empty($ADODB_LOG_CONN)) { - $conn = $ADODB_LOG_CONN; - if ($conn->databaseType != $connx->databaseType) - $prefix = '/*dbx='.$connx->databaseType .'*/ '; - else - $prefix = ''; - } else { - $conn = $connx; - $prefix = ''; - } - - $conn->_logsql = false; // disable logsql error simulation - $dbT = $conn->databaseType; - - $time = $a1 - $a0; - - if (!$rs) { - $errM = $connx->ErrorMsg(); - $errN = $connx->ErrorNo(); - $conn->lastInsID = 0; - $tracer = substr('ERROR: '.htmlspecialchars($errM),0,250); - } else { - $tracer = ''; - $errM = ''; - $errN = 0; - $dbg = $conn->debug; - $conn->debug = false; - if (!is_object($rs) || $rs->dataProvider == 'empty') - $conn->_affected = $conn->affected_rows(true); - $conn->lastInsID = @$conn->Insert_ID(); - $conn->debug = $dbg; - } - if (isset($_SERVER['HTTP_HOST'])) { - $tracer .= '
        '.$_SERVER['HTTP_HOST']; - if (isset($_SERVER['PHP_SELF'])) $tracer .= htmlspecialchars($_SERVER['PHP_SELF']); - } else - if (isset($_SERVER['PHP_SELF'])) $tracer .= '
        '.htmlspecialchars($_SERVER['PHP_SELF']); - //$tracer .= (string) adodb_backtrace(false); - - $tracer = (string) substr($tracer,0,500); - - if (is_array($inputarr)) { - if (is_array(reset($inputarr))) $params = 'Array sizeof='.sizeof($inputarr); - else { - // Quote string parameters so we can see them in the - // performance stats. This helps spot disabled indexes. - $xar_params = $inputarr; - foreach ($xar_params as $xar_param_key => $xar_param) { - if (gettype($xar_param) == 'string') - $xar_params[$xar_param_key] = '"' . $xar_param . '"'; - } - $params = implode(', ', $xar_params); - if (strlen($params) >= 3000) $params = substr($params, 0, 3000); - } - } else { - $params = ''; - } - - if (is_array($sql)) $sql = $sql[0]; - if ($prefix) $sql = $prefix.$sql; - $arr = array('b'=>strlen($sql).'.'.crc32($sql), - 'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>adodb_round($time,6)); - //var_dump($arr); - $saved = $conn->debug; - $conn->debug = 0; - - $d = $conn->sysTimeStamp; - if (empty($d)) $d = date("'Y-m-d H:i:s'"); - if ($conn->dataProvider == 'oci8' && $dbT != 'oci8po') { - $isql = "insert into $perf_table values($d,:b,:c,:d,:e,:f)"; - } else if ($dbT == 'odbc_mssql' || $dbT == 'informix' || strncmp($dbT,'odbtp',4)==0) { - $timer = $arr['f']; - if ($dbT == 'informix') $sql2 = substr($sql2,0,230); - - $sql1 = $conn->qstr($arr['b']); - $sql2 = $conn->qstr($arr['c']); - $params = $conn->qstr($arr['d']); - $tracer = $conn->qstr($arr['e']); - - $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values($d,$sql1,$sql2,$params,$tracer,$timer)"; - if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql); - $arr = false; - } else { - if ($dbT == 'db2') $arr['f'] = (float) $arr['f']; - $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $d,?,?,?,?,?)"; - } - - global $ADODB_PERF_MIN; - if ($errN != 0 || $time >= $ADODB_PERF_MIN) { - $ok = $conn->Execute($isql,$arr); - } else - $ok = true; - - $conn->debug = $saved; - - if ($ok) { - $conn->_logsql = true; - } else { - $err2 = $conn->ErrorMsg(); - $conn->_logsql = true; // enable logsql error simulation - $perf = NewPerfMonitor($conn); - if ($perf) { - if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr); - } else { - $ok = $conn->Execute("create table $perf_table ( - created varchar(50), - sql0 varchar(250), - sql1 varchar(4000), - params varchar(3000), - tracer varchar(500), - timer decimal(16,6))"); - } - if (!$ok) { - ADOConnection::outp( "

        LOGSQL Insert Failed: $isql
        $err2

        "); - $conn->_logsql = false; - } - } - $connx->_errorMsg = $errM; - $connx->_errorCode = $errN; - } - $connx->fnExecute = 'adodb_log_sql'; - return $rs; -} - - -/* - The settings data structure is an associative array that database parameter per element. - - Each database parameter element in the array is itself an array consisting of: - - 0: category code, used to group related db parameters - 1: either - a. sql string to retrieve value, eg. "select value from v\$parameter where name='db_block_size'", - b. array holding sql string and field to look for, e.g. array('show variables','table_cache'), - c. a string prefixed by =, then a PHP method of the class is invoked, - e.g. to invoke $this->GetIndexValue(), set this array element to '=GetIndexValue', - 2: description of the database parameter - */ - -class adodb_perf { - var $conn; - var $color = '#F0F0F0'; - var $table = ''; - var $titles = ''; - var $warnRatio = 90; - var $tablesSQL = false; - var $cliFormat = "%32s => %s \r\n"; - var $sql1 = 'sql1'; // used for casting sql1 to text for mssql - var $explain = true; - var $helpurl = "LogSQL help"; - var $createTableSQL = false; - var $maxLength = 2000; - - // Sets the tablename to be used - static function table($newtable = false) - { - static $_table; - - if (!empty($newtable)) $_table = $newtable; - if (empty($_table)) $_table = 'adodb_logsql'; - return $_table; - } - - // returns array with info to calculate CPU Load - function _CPULoad() - { - /* - - cpu 524152 2662 2515228 336057010 - cpu0 264339 1408 1257951 168025827 - cpu1 259813 1254 1257277 168031181 - page 622307 25475680 - swap 24 1891 - intr 890153570 868093576 6 0 4 4 0 6 1 2 0 0 0 124 0 8098760 2 13961053 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - disk_io: (3,0):(3144904,54369,610378,3090535,50936192) (3,1):(3630212,54097,633016,3576115,50951320) - ctxt 66155838 - btime 1062315585 - processes 69293 - - */ - // Algorithm is taken from - // http://social.technet.microsoft.com/Forums/en-US/winservergen/thread/414b0e1b-499c-411e-8a02-6a12e339c0f1/ - if (strncmp(PHP_OS,'WIN',3)==0) { - if (PHP_VERSION == '5.0.0') return false; - if (PHP_VERSION == '5.0.1') return false; - if (PHP_VERSION == '5.0.2') return false; - if (PHP_VERSION == '5.0.3') return false; - if (PHP_VERSION == '4.3.10') return false; # see http://bugs.php.net/bug.php?id=31737 - - static $FAIL = false; - if ($FAIL) return false; - - $objName = "winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\CIMV2"; - $myQuery = "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name = '_Total'"; - - try { - @$objWMIService = new COM($objName); - if (!$objWMIService) { - $FAIL = true; - return false; - } - - $info[0] = -1; - $info[1] = 0; - $info[2] = 0; - $info[3] = 0; - foreach($objWMIService->ExecQuery($myQuery) as $objItem) { - $info[0] = $objItem->PercentProcessorTime(); - } - - } catch(Exception $e) { - $FAIL = true; - echo $e->getMessage(); - return false; - } - - return $info; - } - - // Algorithm - Steve Blinch (BlitzAffe Online, http://www.blitzaffe.com) - $statfile = '/proc/stat'; - if (!file_exists($statfile)) return false; - - $fd = fopen($statfile,"r"); - if (!$fd) return false; - - $statinfo = explode("\n",fgets($fd, 1024)); - fclose($fd); - foreach($statinfo as $line) { - $info = explode(" ",$line); - if($info[0]=="cpu") { - array_shift($info); // pop off "cpu" - if(!$info[0]) array_shift($info); // pop off blank space (if any) - return $info; - } - } - - return false; - - } - - /* NOT IMPLEMENTED */ - function MemInfo() - { - /* - - total: used: free: shared: buffers: cached: - Mem: 1055289344 917299200 137990144 0 165437440 599773184 - Swap: 2146775040 11055104 2135719936 - MemTotal: 1030556 kB - MemFree: 134756 kB - MemShared: 0 kB - Buffers: 161560 kB - Cached: 581384 kB - SwapCached: 4332 kB - Active: 494468 kB - Inact_dirty: 322856 kB - Inact_clean: 24256 kB - Inact_target: 168316 kB - HighTotal: 131064 kB - HighFree: 1024 kB - LowTotal: 899492 kB - LowFree: 133732 kB - SwapTotal: 2096460 kB - SwapFree: 2085664 kB - Committed_AS: 348732 kB - */ - } - - - /* - Remember that this is client load, not db server load! - */ - var $_lastLoad; - function CPULoad() - { - $info = $this->_CPULoad(); - if (!$info) return false; - - if (strncmp(PHP_OS,'WIN',3)==0) { - return (integer) $info[0]; - }else { - if (empty($this->_lastLoad)) { - sleep(1); - $this->_lastLoad = $info; - $info = $this->_CPULoad(); - } - - $last = $this->_lastLoad; - $this->_lastLoad = $info; - - $d_user = $info[0] - $last[0]; - $d_nice = $info[1] - $last[1]; - $d_system = $info[2] - $last[2]; - $d_idle = $info[3] - $last[3]; - - //printf("Delta - User: %f Nice: %f System: %f Idle: %f
        ",$d_user,$d_nice,$d_system,$d_idle); - - $total=$d_user+$d_nice+$d_system+$d_idle; - if ($total<1) $total=1; - return 100*($d_user+$d_nice+$d_system)/$total; - } - } - - function Tracer($sql) - { - $perf_table = adodb_perf::table(); - $saveE = $this->conn->fnExecute; - $this->conn->fnExecute = false; - - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $sqlq = $this->conn->qstr($sql); - $arr = $this->conn->GetArray( -"select count(*),tracer - from $perf_table where sql1=$sqlq - group by tracer - order by 1 desc"); - $s = ''; - if ($arr) { - $s .= '

        Scripts Affected

        '; - foreach($arr as $k) { - $s .= sprintf("%4d",$k[0]).'   '.strip_tags($k[1]).'
        '; - } - } - - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_CACHE_MODE = $save; - $this->conn->fnExecute = $saveE; - return $s; - } - - /* - Explain Plan for $sql. - If only a snippet of the $sql is passed in, then $partial will hold the crc32 of the - actual sql. - */ - function Explain($sql,$partial=false) - { - return false; - } - - function InvalidSQL($numsql = 10) - { - - if (isset($_GET['sql'])) return; - $s = '

        Invalid SQL

        '; - $saveE = $this->conn->fnExecute; - $this->conn->fnExecute = false; - $perf_table = adodb_perf::table(); - $rs = $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql); - $this->conn->fnExecute = $saveE; - if ($rs) { - $s .= rs2html($rs,false,false,false,false); - } else - return "

        $this->helpurl. ".$this->conn->ErrorMsg()."

        "; - - return $s; - } - - - /* - This script identifies the longest running SQL - */ - function _SuspiciousSQL($numsql = 10) - { - global $ADODB_FETCH_MODE; - - $perf_table = adodb_perf::table(); - $saveE = $this->conn->fnExecute; - $this->conn->fnExecute = false; - - if (isset($_GET['exps']) && isset($_GET['sql'])) { - $partial = !empty($_GET['part']); - echo "".$this->Explain($_GET['sql'],$partial)."\n"; - } - - if (isset($_GET['sql'])) return; - $sql1 = $this->sql1; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - //$this->conn->debug=1; - $rs = $this->conn->SelectLimit( - "select avg(timer) as avg_timer,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer - from $perf_table - where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT') - and (tracer is null or tracer not like 'ERROR:%') - group by sql1 - order by 1 desc",$numsql); - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - $this->conn->fnExecute = $saveE; - - if (!$rs) return "

        $this->helpurl. ".$this->conn->ErrorMsg()."

        "; - $s = "

        Suspicious SQL

        -The following SQL have high average execution times
        -
        ParameterValueDescription
        \n"; - $max = $this->maxLength; - while (!$rs->EOF) { - $sql = $rs->fields[1]; - $raw = urlencode($sql); - if (strlen($raw)>$max-100) { - $sql2 = substr($sql,0,$max-500); - $raw = urlencode($sql2).'&part='.crc32($sql); - } - $prefix = ""; - $suffix = ""; - if ($this->explain == false || strlen($prefix)>$max) { - $suffix = ' ... String too long for GET parameter: '.strlen($prefix).''; - $prefix = ''; - } - $s .= ""; - $rs->MoveNext(); - } - return $s."
        Avg TimeCountSQLMaxMin
        ".adodb_round($rs->fields[0],6)."".$rs->fields[2]."".$prefix.htmlspecialchars($sql).$suffix."". - "".$rs->fields[3]."".$rs->fields[4]."
        "; - - } - - function CheckMemory() - { - return ''; - } - - - function SuspiciousSQL($numsql=10) - { - return adodb_perf::_SuspiciousSQL($numsql); - } - - function ExpensiveSQL($numsql=10) - { - return adodb_perf::_ExpensiveSQL($numsql); - } - - - /* - This reports the percentage of load on the instance due to the most - expensive few SQL statements. Tuning these statements can often - make huge improvements in overall system performance. - */ - function _ExpensiveSQL($numsql = 10) - { - global $ADODB_FETCH_MODE; - - $perf_table = adodb_perf::table(); - $saveE = $this->conn->fnExecute; - $this->conn->fnExecute = false; - - if (isset($_GET['expe']) && isset($_GET['sql'])) { - $partial = !empty($_GET['part']); - echo "".$this->Explain($_GET['sql'],$partial)."\n"; - } - - if (isset($_GET['sql'])) return; - - $sql1 = $this->sql1; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $rs = $this->conn->SelectLimit( - "select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer - from $perf_table - where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT') - and (tracer is null or tracer not like 'ERROR:%') - group by sql1 - having count(*)>1 - order by 1 desc",$numsql); - if (isset($savem)) $this->conn->SetFetchMode($savem); - $this->conn->fnExecute = $saveE; - $ADODB_FETCH_MODE = $save; - if (!$rs) return "

        $this->helpurl. ".$this->conn->ErrorMsg()."

        "; - $s = "

        Expensive SQL

        -Tuning the following SQL could reduce the server load substantially
        -\n"; - $max = $this->maxLength; - while (!$rs->EOF) { - $sql = $rs->fields[1]; - $raw = urlencode($sql); - if (strlen($raw)>$max-100) { - $sql2 = substr($sql,0,$max-500); - $raw = urlencode($sql2).'&part='.crc32($sql); - } - $prefix = ""; - $suffix = ""; - if($this->explain == false || strlen($prefix>$max)) { - $prefix = ''; - $suffix = ''; - } - $s .= ""; - $rs->MoveNext(); - } - return $s."
        LoadCountSQLMaxMin
        ".adodb_round($rs->fields[0],6)."".$rs->fields[2]."".$prefix.htmlspecialchars($sql).$suffix."". - "".$rs->fields[3]."".$rs->fields[4]."
        "; - } - - /* - Raw function to return parameter value from $settings. - */ - function DBParameter($param) - { - if (empty($this->settings[$param])) return false; - $sql = $this->settings[$param][1]; - return $this->_DBParameter($sql); - } - - /* - Raw function returning array of poll paramters - */ - function PollParameters() - { - $arr[0] = (float)$this->DBParameter('data cache hit ratio'); - $arr[1] = (float)$this->DBParameter('data reads'); - $arr[2] = (float)$this->DBParameter('data writes'); - $arr[3] = (integer) $this->DBParameter('current connections'); - return $arr; - } - - /* - Low-level Get Database Parameter - */ - function _DBParameter($sql) - { - $savelog = $this->conn->LogSQL(false); - if (is_array($sql)) { - global $ADODB_FETCH_MODE; - - $sql1 = $sql[0]; - $key = $sql[1]; - if (sizeof($sql)>2) $pos = $sql[2]; - else $pos = 1; - if (sizeof($sql)>3) $coef = $sql[3]; - else $coef = false; - $ret = false; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $rs = $this->conn->Execute($sql1); - - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - if ($rs) { - while (!$rs->EOF) { - $keyf = reset($rs->fields); - if (trim($keyf) == $key) { - $ret = $rs->fields[$pos]; - if ($coef) $ret *= $coef; - break; - } - $rs->MoveNext(); - } - $rs->Close(); - } - $this->conn->LogSQL($savelog); - return $ret; - } else { - if (strncmp($sql,'=',1) == 0) { - $fn = substr($sql,1); - return $this->$fn(); - } - $sql = str_replace('$DATABASE',$this->conn->database,$sql); - $ret = $this->conn->GetOne($sql); - $this->conn->LogSQL($savelog); - - return $ret; - } - } - - /* - Warn if cache ratio falls below threshold. Displayed in "Description" column. - */ - function WarnCacheRatio($val) - { - if ($val < $this->warnRatio) - return 'Cache ratio should be at least '.$this->warnRatio.'%'; - else return ''; - } - - function clearsql() - { - $perf_table = adodb_perf::table(); - $this->conn->Execute("delete from $perf_table where created<".$this->conn->sysTimeStamp); - } - /***********************************************************************************************/ - // HIGH LEVEL UI FUNCTIONS - /***********************************************************************************************/ - - - function UI($pollsecs=5) - { - global $ADODB_LOG_CONN; - - $perf_table = adodb_perf::table(); - $conn = $this->conn; - - $app = $conn->host; - if ($conn->host && $conn->database) $app .= ', db='; - $app .= $conn->database; - - if ($app) $app .= ', '; - $savelog = $this->conn->LogSQL(false); - $info = $conn->ServerInfo(); - if (isset($_GET['clearsql'])) { - $this->clearsql(); - } - $this->conn->LogSQL($savelog); - - // magic quotes - - if (isset($_GET['sql']) && get_magic_quotes_gpc()) { - $_GET['sql'] = $_GET['sql'] = str_replace(array("\\'",'\"'),array("'",'"'),$_GET['sql']); - } - - if (!isset($_SESSION['ADODB_PERF_SQL'])) $nsql = $_SESSION['ADODB_PERF_SQL'] = 10; - else $nsql = $_SESSION['ADODB_PERF_SQL']; - - $app .= $info['description']; - - - if (isset($_GET['do'])) $do = $_GET['do']; - else if (isset($_POST['do'])) $do = $_POST['do']; - else if (isset($_GET['sql'])) $do = 'viewsql'; - else $do = 'stats'; - - if (isset($_GET['nsql'])) { - if ($_GET['nsql'] > 0) $nsql = $_SESSION['ADODB_PERF_SQL'] = (integer) $_GET['nsql']; - } - echo "ADOdb Performance Monitor on $app"; - if ($do == 'viewsql') $form = "
        # SQL:
        "; - else $form = " "; - - $allowsql = !defined('ADODB_PERF_NO_RUN_SQL'); - global $ADODB_PERF_MIN; - $app .= " (Min sql timing \$ADODB_PERF_MIN=$ADODB_PERF_MIN secs)"; - - if (empty($_GET['hidem'])) - echo "
        - ADOdb Performance Monitor for $app
        - Performance Stats   View SQL -   View Tables   Poll Stats", - $allowsql ? '   Run SQL' : '', - "$form", - "
        "; - - - switch ($do) { - default: - case 'stats': - if (empty($ADODB_LOG_CONN)) - echo "

          Clear SQL Log
        "; - echo $this->HealthCheck(); - //$this->conn->debug=1; - echo $this->CheckMemory(); - break; - case 'poll': - $self = htmlspecialchars($_SERVER['PHP_SELF']); - echo ""; - break; - case 'poll2': - echo "

        ";
        -                $this->Poll($pollsecs);
        -                break;
        -
        -            case 'dosql':
        -                if (!$allowsql) break;
        -                 
        -                $this->DoSQLForm();
        -                break;
        -            case 'viewsql':
        -                if (empty($_GET['hidem']))
        -                echo "  Clear SQL Log
        "; - echo($this->SuspiciousSQL($nsql)); - echo($this->ExpensiveSQL($nsql)); - echo($this->InvalidSQL($nsql)); - break; - case 'tables': - echo $this->Tables(); break; - } - global $ADODB_vers; - echo "

        $ADODB_vers Sponsored by phpLens
        "; - } - - /* - Runs in infinite loop, returning real-time statistics - */ - function Poll($secs=5) - { - $this->conn->fnExecute = false; - //$this->conn->debug=1; - if ($secs <= 1) $secs = 1; - echo "Accumulating statistics, every $secs seconds...\n";flush(); - $arro = $this->PollParameters(); - $cnt = 0; - set_time_limit(0); - sleep($secs); - while (1) { - - $arr = $this->PollParameters(); - - $hits = sprintf('%2.2f',$arr[0]); - $reads = sprintf('%12.4f',($arr[1]-$arro[1])/$secs); - $writes = sprintf('%12.4f',($arr[2]-$arro[2])/$secs); - $sess = sprintf('%5d',$arr[3]); - - $load = $this->CPULoad(); - if ($load !== false) { - $oslabel = 'WS-CPU%'; - $osval = sprintf(" %2.1f ",(float) $load); - }else { - $oslabel = ''; - $osval = ''; - } - if ($cnt % 10 == 0) echo " Time ".$oslabel." Hit% Sess Reads/s Writes/s\n"; - $cnt += 1; - echo date('H:i:s').' '.$osval."$hits $sess $reads $writes\n"; - flush(); - - if (connection_aborted()) return; - - sleep($secs); - $arro = $arr; - } - } - - /* - Returns basic health check in a command line interface - */ - function HealthCheckCLI() - { - return $this->HealthCheck(true); - } - - - /* - Returns basic health check as HTML - */ - function HealthCheck($cli=false) - { - $saveE = $this->conn->fnExecute; - $this->conn->fnExecute = false; - if ($cli) $html = ''; - else $html = $this->table.'

        '.$this->conn->databaseType.'

        '.$this->titles; - - $oldc = false; - $bgc = ''; - foreach($this->settings as $name => $arr) { - if ($arr === false) break; - - if (!is_string($name)) { - if ($cli) $html .= " -- $arr -- \n"; - else $html .= "color>$arr  "; - continue; - } - - if (!is_array($arr)) break; - $category = $arr[0]; - $how = $arr[1]; - if (sizeof($arr)>2) $desc = $arr[2]; - else $desc = '   '; - - - if ($category == 'HIDE') continue; - - $val = $this->_DBParameter($how); - - if ($desc && strncmp($desc,"=",1) === 0) { - $fn = substr($desc,1); - $desc = $this->$fn($val); - } - - if ($val === false) { - $m = $this->conn->ErrorMsg(); - $val = "Error: $m"; - } else { - if (is_numeric($val) && $val >= 256*1024) { - if ($val % (1024*1024) == 0) { - $val /= (1024*1024); - $val .= 'M'; - } else if ($val % 1024 == 0) { - $val /= 1024; - $val .= 'K'; - } - //$val = htmlspecialchars($val); - } - } - if ($category != $oldc) { - $oldc = $category; - //$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color; - } - if (strlen($desc)==0) $desc = ' '; - if (strlen($val)==0) $val = ' '; - if ($cli) { - $html .= str_replace(' ','',sprintf($this->cliFormat,strip_tags($name),strip_tags($val),strip_tags($desc))); - - }else { - $html .= "".$name.''.$val.''.$desc."\n"; - } - } - - if (!$cli) $html .= "\n"; - $this->conn->fnExecute = $saveE; - - return $html; - } - - function Tables($orderby='1') - { - if (!$this->tablesSQL) return false; - - $savelog = $this->conn->LogSQL(false); - $rs = $this->conn->Execute($this->tablesSQL.' order by '.$orderby); - $this->conn->LogSQL($savelog); - $html = rs2html($rs,false,false,false,false); - return $html; - } - - - function CreateLogTable() - { - if (!$this->createTableSQL) return false; - - $table = $this->table(); - $sql = str_replace('adodb_logsql',$table,$this->createTableSQL); - $savelog = $this->conn->LogSQL(false); - $ok = $this->conn->Execute($sql); - $this->conn->LogSQL($savelog); - return ($ok) ? true : false; - } - - function DoSQLForm() - { - - - $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); - $sql = isset($_REQUEST['sql']) ? $_REQUEST['sql'] : ''; - - if (isset($_SESSION['phplens_sqlrows'])) $rows = $_SESSION['phplens_sqlrows']; - else $rows = 3; - - if (isset($_REQUEST['SMALLER'])) { - $rows /= 2; - if ($rows < 3) $rows = 3; - $_SESSION['phplens_sqlrows'] = $rows; - } - if (isset($_REQUEST['BIGGER'])) { - $rows *= 2; - $_SESSION['phplens_sqlrows'] = $rows; - } - - ?> - -
        - - - - - - - - -
        Form size:
        -
        - - undomq(trim($sql)); - if (substr($sql,strlen($sql)-1) === ';') { - $print = true; - $sqla = $this->SplitSQL($sql); - } else { - $print = false; - $sqla = array($sql); - } - foreach($sqla as $sqls) { - - if (!$sqls) continue; - - if ($print) { - print "

        ".htmlspecialchars($sqls)."

        "; - flush(); - } - $savelog = $this->conn->LogSQL(false); - $rs = $this->conn->Execute($sqls); - $this->conn->LogSQL($savelog); - if ($rs && is_object($rs) && !$rs->EOF) { - rs2html($rs); - while ($rs->NextRecordSet()) { - print "
         
        "; - rs2html($rs); - } - } else { - $e1 = (integer) $this->conn->ErrorNo(); - $e2 = $this->conn->ErrorMsg(); - if (($e1) || ($e2)) { - if (empty($e1)) $e1 = '-1'; // postgresql fix - print '   '.$e1.': '.$e2; - } else { - print "

        No Recordset returned

        "; - } - } - } // foreach - } - - function SplitSQL($sql) - { - $arr = explode(';',$sql); - return $arr; - } - - function undomq($m) - { - if (get_magic_quotes_gpc()) { - // undo the damage - $m = str_replace('\\\\','\\',$m); - $m = str_replace('\"','"',$m); - $m = str_replace('\\\'','\'',$m); - } - return $m; - } - - - /************************************************************************/ - - /** - * Reorganise multiple table-indices/statistics/.. - * OptimizeMode could be given by last Parameter - * - * @example - *
        -     *          optimizeTables( 'tableA');
        -     *      
        - *
        -     *          optimizeTables( 'tableA', 'tableB', 'tableC');
        -     *      
        - *
        -     *          optimizeTables( 'tableA', 'tableB', ADODB_OPT_LOW);
        -     *      
        - * - * @param string table name of the table to optimize - * @param int mode optimization-mode - * ADODB_OPT_HIGH for full optimization - * ADODB_OPT_LOW for CPU-less optimization - * Default is LOW ADODB_OPT_LOW - * @author Markus Staab - * @return Returns true on success and false on error - */ - function OptimizeTables() - { - $args = func_get_args(); - $numArgs = func_num_args(); - - if ( $numArgs == 0) return false; - - $mode = ADODB_OPT_LOW; - $lastArg = $args[ $numArgs - 1]; - if ( !is_string($lastArg)) { - $mode = $lastArg; - unset( $args[ $numArgs - 1]); - } - - foreach( $args as $table) { - $this->optimizeTable( $table, $mode); - } - } - - /** - * Reorganise the table-indices/statistics/.. depending on the given mode. - * Default Implementation throws an error. - * - * @param string table name of the table to optimize - * @param int mode optimization-mode - * ADODB_OPT_HIGH for full optimization - * ADODB_OPT_LOW for CPU-less optimization - * Default is LOW ADODB_OPT_LOW - * @author Markus Staab - * @return Returns true on success and false on error - */ - function OptimizeTable( $table, $mode = ADODB_OPT_LOW) - { - ADOConnection::outp( sprintf( "

        %s: '%s' not implemented for driver '%s'

        ", __CLASS__, __FUNCTION__, $this->conn->databaseType)); - return false; - } - - /** - * Reorganise current database. - * Default implementation loops over all MetaTables() and - * optimize each using optmizeTable() - * - * @author Markus Staab - * @return Returns true on success and false on error - */ - function optimizeDatabase() - { - $conn = $this->conn; - if ( !$conn) return false; - - $tables = $conn->MetaTables( 'TABLES'); - if ( !$tables ) return false; - - foreach( $tables as $table) { - if ( !$this->optimizeTable( $table)) { - return false; - } - } - - return true; - } - // end hack -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-php4.inc.php b/include/limesurvey/classes/adodb/adodb-php4.inc.php deleted file mode 100644 index 9c3b7e1f..00000000 --- a/include/limesurvey/classes/adodb/adodb-php4.inc.php +++ /dev/null @@ -1,16 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-time.inc.php b/include/limesurvey/classes/adodb/adodb-time.inc.php deleted file mode 100644 index fb27149a..00000000 --- a/include/limesurvey/classes/adodb/adodb-time.inc.php +++ /dev/null @@ -1,1426 +0,0 @@ - 4 digit year conversion. The maximum is billions of years in the - future, but this is a theoretical limit as the computation of that year - would take too long with the current implementation of adodb_mktime(). - - This library replaces native functions as follows: - -
        - getdate()  with  adodb_getdate()
        - date()     with  adodb_date()
        - gmdate()   with  adodb_gmdate()
        - mktime()   with  adodb_mktime()
        - gmmktime() with  adodb_gmmktime()
        - strftime() with  adodb_strftime()
        - strftime() with  adodb_gmstrftime()
        - 
        - - The parameters are identical, except that adodb_date() accepts a subset - of date()'s field formats. Mktime() will convert from local time to GMT, - and date() will convert from GMT to local time, but daylight savings is - not handled currently. - - This library is independant of the rest of ADOdb, and can be used - as standalone code. - - PERFORMANCE - - For high speed, this library uses the native date functions where - possible, and only switches to PHP code when the dates fall outside - the 32-bit signed integer range. - - GREGORIAN CORRECTION - - Pope Gregory shortened October of A.D. 1582 by ten days. Thursday, - October 4, 1582 (Julian) was followed immediately by Friday, October 15, - 1582 (Gregorian). - - Since 0.06, we handle this correctly, so: - - adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582) - == 24 * 3600 (1 day) - - ============================================================================= - - COPYRIGHT - - (c) 2003-2005 John Lim and released under BSD-style license except for code by - jackbbs, which includes adodb_mktime, adodb_get_gmt_diff, adodb_is_leap_year - and originally found at http://www.php.net/manual/en/function.mktime.php - - ============================================================================= - - BUG REPORTS - - These should be posted to the ADOdb forums at - - http://phplens.com/lens/lensforum/topics.php?id=4 - - ============================================================================= - - FUNCTION DESCRIPTIONS - - - ** FUNCTION adodb_getdate($date=false) - - Returns an array containing date information, as getdate(), but supports - dates greater than 1901 to 2038. The local date/time format is derived from a - heuristic the first time adodb_getdate is called. - - - ** FUNCTION adodb_date($fmt, $timestamp = false) - - Convert a timestamp to a formatted local date. If $timestamp is not defined, the - current timestamp is used. Unlike the function date(), it supports dates - outside the 1901 to 2038 range. - - The format fields that adodb_date supports: - -
        - a - "am" or "pm"
        - A - "AM" or "PM"
        - d - day of the month, 2 digits with leading zeros; i.e. "01" to "31"
        - D - day of the week, textual, 3 letters; e.g. "Fri"
        - F - month, textual, long; e.g. "January"
        - g - hour, 12-hour format without leading zeros; i.e. "1" to "12"
        - G - hour, 24-hour format without leading zeros; i.e. "0" to "23"
        - h - hour, 12-hour format; i.e. "01" to "12"
        - H - hour, 24-hour format; i.e. "00" to "23"
        - i - minutes; i.e. "00" to "59"
        - j - day of the month without leading zeros; i.e. "1" to "31"
        - l (lowercase 'L') - day of the week, textual, long; e.g. "Friday"
        - L - boolean for whether it is a leap year; i.e. "0" or "1"
        - m - month; i.e. "01" to "12"
        - M - month, textual, 3 letters; e.g. "Jan"
        - n - month without leading zeros; i.e. "1" to "12"
        - O - Difference to Greenwich time in hours; e.g. "+0200"
        - Q - Quarter, as in 1, 2, 3, 4
        - r - RFC 2822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200"
        - s - seconds; i.e. "00" to "59"
        - S - English ordinal suffix for the day of the month, 2 characters;
        - i.e. "st", "nd", "rd" or "th"
        - t - number of days in the given month; i.e. "28" to "31"
        - T - Timezone setting of this machine; e.g. "EST" or "MDT"
        - U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
        - w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday)
        - Y - year, 4 digits; e.g. "1999"
        - y - year, 2 digits; e.g. "99"
        - z - day of the year; i.e. "0" to "365"
        - Z - timezone offset in seconds (i.e. "-43200" to "43200").
        - The offset for timezones west of UTC is always negative,
        - and for those east of UTC is always positive.
        - 
        - - Unsupported: -
        - B - Swatch Internet time
        - I (capital i) - "1" if Daylight Savings Time, "0" otherwise.
        - W - ISO-8601 week number of year, weeks starting on Monday
        -
        - 
        - - - ** FUNCTION adodb_date2($fmt, $isoDateString = false) - Same as adodb_date, but 2nd parameter accepts iso date, eg. - - adodb_date2('d-M-Y H:i','2003-12-25 13:01:34'); - - - ** FUNCTION adodb_gmdate($fmt, $timestamp = false) - - Convert a timestamp to a formatted GMT date. If $timestamp is not defined, the - current timestamp is used. Unlike the function date(), it supports dates - outside the 1901 to 2038 range. - - - ** FUNCTION adodb_mktime($hr, $min, $sec[, $month, $day, $year]) - - Converts a local date to a unix timestamp. Unlike the function mktime(), it supports - dates outside the 1901 to 2038 range. All parameters are optional. - - - ** FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year]) - - Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports - dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters - are currently compulsory. - - ** FUNCTION adodb_gmstrftime($fmt, $timestamp = false) - Convert a timestamp to a formatted GMT date. - - ** FUNCTION adodb_strftime($fmt, $timestamp = false) - - Convert a timestamp to a formatted local date. Internally converts $fmt into - adodb_date format, then echo result. - - For best results, you can define the local date format yourself. Define a global - variable $ADODB_DATE_LOCALE which is an array, 1st element is date format using - adodb_date syntax, and 2nd element is the time format, also in adodb_date syntax. - - eg. $ADODB_DATE_LOCALE = array('d/m/Y','H:i:s'); - - Supported format codes: - -
        - %a - abbreviated weekday name according to the current locale
        - %A - full weekday name according to the current locale
        - %b - abbreviated month name according to the current locale
        - %B - full month name according to the current locale
        - %c - preferred date and time representation for the current locale
        - %d - day of the month as a decimal number (range 01 to 31)
        - %D - same as %m/%d/%y
        - %e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31')
        - %h - same as %b
        - %H - hour as a decimal number using a 24-hour clock (range 00 to 23)
        - %I - hour as a decimal number using a 12-hour clock (range 01 to 12)
        - %m - month as a decimal number (range 01 to 12)
        - %M - minute as a decimal number
        - %n - newline character
        - %p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale
        - %r - time in a.m. and p.m. notation
        - %R - time in 24 hour notation
        - %S - second as a decimal number
        - %t - tab character
        - %T - current time, equal to %H:%M:%S
        - %x - preferred date representation for the current locale without the time
        - %X - preferred time representation for the current locale without the date
        - %y - year as a decimal number without a century (range 00 to 99)
        - %Y - year as a decimal number including the century
        - %Z - time zone or name or abbreviation
        - %% - a literal `%' character
        - 
        - - Unsupported codes: -
        - %C - century number (the year divided by 100 and truncated to an integer, range 00 to 99)
        - %g - like %G, but without the century.
        - %G - The 4-digit year corresponding to the ISO week number (see %V).
        - This has the same format and value as %Y, except that if the ISO week number belongs
        - to the previous or next year, that year is used instead.
        - %j - day of the year as a decimal number (range 001 to 366)
        - %u - weekday as a decimal number [1,7], with 1 representing Monday
        - %U - week number of the current year as a decimal number, starting
        - with the first Sunday as the first day of the first week
        - %V - The ISO 8601:1988 week number of the current year as a decimal number,
        - range 01 to 53, where week 1 is the first week that has at least 4 days in the
        - current year, and with Monday as the first day of the week. (Use %G or %g for
        - the year component that corresponds to the week number for the specified timestamp.)
        - %w - day of the week as a decimal, Sunday being 0
        - %W - week number of the current year as a decimal number, starting with the
        - first Monday as the first day of the first week
        - 
        - - ============================================================================= - - NOTES - - Useful url for generating test timestamps: - http://www.4webhelp.net/us/timestamp.php - - Possible future optimizations include - - a. Using an algorithm similar to Plauger's in "The Standard C Library" - (page 428, xttotm.c _Ttotm() function). Plauger's algorithm will not - work outside 32-bit signed range, so i decided not to implement it. - - b. Implement daylight savings, which looks awfully complicated, see - http://webexhibits.org/daylightsaving/ - - - CHANGELOG - - - 11 Feb 2008 0.33 - * Bug in 0.32 fix for hour handling. Fixed. - - - 1 Feb 2008 0.32 - * Now adodb_mktime(0,0,0,12+$m,20,2040) works properly. - - - 10 Jan 2008 0.31 - * Now adodb_mktime(0,0,0,24,1,2037) works correctly. - - - 15 July 2007 0.30 - Added PHP 5.2.0 compatability fixes. - * gmtime behaviour for 1970 has changed. We use the actual date if it is between 1970 to 2038 to get the - * timezone, otherwise we use the current year as the baseline to retrieve the timezone. - * Also the timezone's in php 5.2.* support historical data better, eg. if timezone today was +8, but - in 1970 it was +7:30, then php 5.2 return +7:30, while this library will use +8. - * - - - 19 March 2006 0.24 - Changed strftime() locale detection, because some locales prepend the day of week to the date when %c is used. - - - 10 Feb 2006 0.23 - PHP5 compat: when we detect PHP5, the RFC2822 format for gmt 0000hrs is changed from -0000 to +0000. - In PHP4, we will still use -0000 for 100% compat with PHP4. - - - 08 Sept 2005 0.22 - In adodb_date2(), $is_gmt not supported properly. Fixed. - - - 18 July 2005 0.21 - In PHP 4.3.11, the 'r' format has changed. Leading 0 in day is added. Changed for compat. - Added support for negative months in adodb_mktime(). - - - 24 Feb 2005 0.20 - Added limited strftime/gmstrftime support. x10 improvement in performance of adodb_date(). - - - 21 Dec 2004 0.17 - In adodb_getdate(), the timestamp was accidentally converted to gmt when $is_gmt is false. - Also adodb_mktime(0,0,0) did not work properly. Both fixed thx Mauro. - - - 17 Nov 2004 0.16 - Removed intval typecast in adodb_mktime() for secs, allowing: - adodb_mktime(0,0,0 + 2236672153,1,1,1934); - Suggested by Ryan. - - - 18 July 2004 0.15 - All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory. - This brings it more in line with mktime (still not identical). - - - 23 June 2004 0.14 - - Allow you to define your own daylights savings function, adodb_daylight_sv. - If the function is defined (somewhere in an include), then you can correct for daylights savings. - - In this example, we apply daylights savings in June or July, adding one hour. This is extremely - unrealistic as it does not take into account time-zone, geographic location, current year. - - function adodb_daylight_sv(&$arr, $is_gmt) - { - if ($is_gmt) return; - $m = $arr['mon']; - if ($m == 6 || $m == 7) $arr['hours'] += 1; - } - - This is only called by adodb_date() and not by adodb_mktime(). - - The format of $arr is - Array ( - [seconds] => 0 - [minutes] => 0 - [hours] => 0 - [mday] => 1 # day of month, eg 1st day of the month - [mon] => 2 # month (eg. Feb) - [year] => 2102 - [yday] => 31 # days in current year - [leap] => # true if leap year - [ndays] => 28 # no of days in current month - ) - - - - 28 Apr 2004 0.13 - Fixed adodb_date to properly support $is_gmt. Thx to Dimitar Angelov. - - - 20 Mar 2004 0.12 - Fixed month calculation error in adodb_date. 2102-June-01 appeared as 2102-May-32. - - - 26 Oct 2003 0.11 - Because of daylight savings problems (some systems apply daylight savings to - January!!!), changed adodb_get_gmt_diff() to ignore daylight savings. - - - 9 Aug 2003 0.10 - Fixed bug with dates after 2038. - See http://phplens.com/lens/lensforum/msgs.php?id=6980 - - - 1 July 2003 0.09 - Added support for Q (Quarter). - Added adodb_date2(), which accepts ISO date in 2nd param - - - 3 March 2003 0.08 - Added support for 'S' adodb_date() format char. Added constant ADODB_ALLOW_NEGATIVE_TS - if you want PHP to handle negative timestamps between 1901 to 1969. - - - 27 Feb 2003 0.07 - All negative numbers handled by adodb now because of RH 7.3+ problems. - See http://bugs.php.net/bug.php?id=20048&edit=2 - - - 4 Feb 2003 0.06 - Fixed a typo, 1852 changed to 1582! This means that pre-1852 dates - are now correctly handled. - - - 29 Jan 2003 0.05 - - Leap year checking differs under Julian calendar (pre 1582). Also - leap year code optimized by checking for most common case first. - - We also handle month overflow correctly in mktime (eg month set to 13). - - Day overflow for less than one month's days is supported. - - - 28 Jan 2003 0.04 - - Gregorian correction handled. In PHP5, we might throw an error if - mktime uses invalid dates around 5-14 Oct 1582. Released with ADOdb 3.10. - Added limbo 5-14 Oct 1582 check, when we set to 15 Oct 1582. - - - 27 Jan 2003 0.03 - - Fixed some more month problems due to gmt issues. Added constant ADODB_DATE_VERSION. - Fixed calculation of days since start of year for <1970. - - - 27 Jan 2003 0.02 - - Changed _adodb_getdate() to inline leap year checking for better performance. - Fixed problem with time-zones west of GMT +0000. - - - 24 Jan 2003 0.01 - - First implementation. - */ - - -/* Initialization */ - -/* - Version Number - */ -define('ADODB_DATE_VERSION',0.33); - -$ADODB_DATETIME_CLASS = (PHP_VERSION >= 5.2); - -/* - This code was originally for windows. But apparently this problem happens - also with Linux, RH 7.3 and later! - - glibc-2.2.5-34 and greater has been changed to return -1 for dates < - 1970. This used to work. The problem exists with RedHat 7.3 and 8.0 - echo (mktime(0, 0, 0, 1, 1, 1960)); // prints -1 - - References: - http://bugs.php.net/bug.php?id=20048&edit=2 - http://lists.debian.org/debian-glibc/2002/debian-glibc-200205/msg00010.html - */ - -if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1); - -function adodb_date_test_date($y1,$m,$d=13) -{ - $h = round(rand()% 24); - $t = adodb_mktime($h,0,0,$m,$d,$y1); - $rez = adodb_date('Y-n-j H:i:s',$t); - if ($h == 0) $h = '00'; - else if ($h < 10) $h = '0'.$h; - if ("$y1-$m-$d $h:00:00" != $rez) { - print "$y1 error, expected=$y1-$m-$d $h:00:00, adodb=$rez
        "; - return false; - } - return true; -} - -function adodb_date_test_strftime($fmt) -{ - $s1 = strftime($fmt); - $s2 = adodb_strftime($fmt); - - if ($s1 == $s2) return true; - - echo "error for $fmt, strftime=$s1, adodb=$s2
        "; - return false; -} - -/** - Test Suite - */ -function adodb_date_test() -{ - - for ($m=-24; $m<=24; $m++) - echo "$m :",adodb_date('d-m-Y',adodb_mktime(0,0,0,1+$m,20,2040)),"
        "; - - error_reporting(E_ALL); - print "

        Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.' PHP='.PHP_VERSION."

        "; - @set_time_limit(0); - $fail = false; - - // This flag disables calling of PHP native functions, so we can properly test the code - if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1); - - $t = time(); - - - $fmt = 'Y-m-d H:i:s'; - echo '
        ';
        -    echo 'adodb: ',adodb_date($fmt,$t),'
        '; - echo 'php : ',date($fmt,$t),'
        '; - echo '
        '; - - adodb_date_test_strftime('%Y %m %x %X'); - adodb_date_test_strftime("%A %d %B %Y"); - adodb_date_test_strftime("%H %M S"); - - $t = adodb_mktime(0,0,0); - if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).'
        '; - - $t = adodb_mktime(0,0,0,6,1,2102); - if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'
        '; - - $t = adodb_mktime(0,0,0,2,1,2102); - if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).'
        '; - - - print "

        Testing gregorian <=> julian conversion

        "; - $t = adodb_mktime(0,0,0,10,11,1492); - //http://www.holidayorigins.com/html/columbus_day.html - Friday check - if (!(adodb_date('D Y-m-d',$t) == 'Fri 1492-10-11')) print 'Error in Columbus landing
        '; - - $t = adodb_mktime(0,0,0,2,29,1500); - if (!(adodb_date('Y-m-d',$t) == '1500-02-29')) print 'Error in julian leap years
        '; - - $t = adodb_mktime(0,0,0,2,29,1700); - if (!(adodb_date('Y-m-d',$t) == '1700-03-01')) print 'Error in gregorian leap years
        '; - - print adodb_mktime(0,0,0,10,4,1582).' '; - print adodb_mktime(0,0,0,10,15,1582); - $diff = (adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582)); - if ($diff != 3600*24) print " Error in gregorian correction = ".($diff/3600/24)." days
        "; - - print " 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ? 'Fri' : 'Error')."
        "; - print " 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ? 'Thu' : 'Error')."
        "; - - print "

        Testing overflow

        "; - - $t = adodb_mktime(0,0,0,3,33,1965); - if (!(adodb_date('Y-m-d',$t) == '1965-04-02')) print 'Error in day overflow 1
        '; - $t = adodb_mktime(0,0,0,4,33,1971); - if (!(adodb_date('Y-m-d',$t) == '1971-05-03')) print 'Error in day overflow 2
        '; - $t = adodb_mktime(0,0,0,1,60,1965); - if (!(adodb_date('Y-m-d',$t) == '1965-03-01')) print 'Error in day overflow 3 '.adodb_date('Y-m-d',$t).'
        '; - $t = adodb_mktime(0,0,0,12,32,1965); - if (!(adodb_date('Y-m-d',$t) == '1966-01-01')) print 'Error in day overflow 4 '.adodb_date('Y-m-d',$t).'
        '; - $t = adodb_mktime(0,0,0,12,63,1965); - if (!(adodb_date('Y-m-d',$t) == '1966-02-01')) print 'Error in day overflow 5 '.adodb_date('Y-m-d',$t).'
        '; - $t = adodb_mktime(0,0,0,13,3,1965); - if (!(adodb_date('Y-m-d',$t) == '1966-01-03')) print 'Error in mth overflow 1
        '; - - print "Testing 2-digit => 4-digit year conversion

        "; - if (adodb_year_digit_check(00) != 2000) print "Err 2-digit 2000
        "; - if (adodb_year_digit_check(10) != 2010) print "Err 2-digit 2010
        "; - if (adodb_year_digit_check(20) != 2020) print "Err 2-digit 2020
        "; - if (adodb_year_digit_check(30) != 2030) print "Err 2-digit 2030
        "; - if (adodb_year_digit_check(40) != 1940) print "Err 2-digit 1940
        "; - if (adodb_year_digit_check(50) != 1950) print "Err 2-digit 1950
        "; - if (adodb_year_digit_check(90) != 1990) print "Err 2-digit 1990
        "; - - // Test string formating - print "

        Testing date formating

        "; - - $fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003'; - $s1 = date($fmt,0); - $s2 = adodb_date($fmt,0); - if ($s1 != $s2) { - print " date() 0 failed
        $s1
        $s2
        "; - } - flush(); - for ($i=100; --$i > 0; ) { - - $ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000); - $s1 = date($fmt,$ts); - $s2 = adodb_date($fmt,$ts); - //print "$s1
        $s2

        "; - $pos = strcmp($s1,$s2); - - if (($s1) != ($s2)) { - for ($j=0,$k=strlen($s1); $j < $k; $j++) { - if ($s1[$j] != $s2[$j]) { - print substr($s1,$j).' '; - break; - } - } - print "Error date(): $ts

        -  \"$s1\" (date len=".strlen($s1).")
        -  \"$s2\" (adodb_date len=".strlen($s2).")

        "; - $fail = true; - } - - $a1 = getdate($ts); - $a2 = adodb_getdate($ts); - $rez = array_diff($a1,$a2); - if (sizeof($rez)>0) { - print "Error getdate() $ts
        "; - print_r($a1); - print "
        "; - print_r($a2); - print "

        "; - $fail = true; - } - } - - // Test generation of dates outside 1901-2038 - print "

        Testing random dates between 100 and 4000

        "; - adodb_date_test_date(100,1); - for ($i=100; --$i >= 0;) { - $y1 = 100+rand(0,1970-100); - $m = rand(1,12); - adodb_date_test_date($y1,$m); - - $y1 = 3000-rand(0,3000-1970); - adodb_date_test_date($y1,$m); - } - print '

        '; - $start = 1960+rand(0,10); - $yrs = 12; - $i = 365.25*86400*($start-1970); - $offset = 36000+rand(10000,60000); - $max = 365*$yrs*86400; - $lastyear = 0; - - // we generate a timestamp, convert it to a date, and convert it back to a timestamp - // and check if the roundtrip broke the original timestamp value. - print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: "; - $cnt = 0; - for ($max += $i; $i < $max; $i += $offset) { - $ret = adodb_date('m,d,Y,H,i,s',$i); - $arr = explode(',',$ret); - if ($lastyear != $arr[2]) { - $lastyear = $arr[2]; - print " $lastyear "; - flush(); - } - $newi = adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]); - if ($i != $newi) { - print "Error at $i, adodb_mktime returned $newi ($ret)"; - $fail = true; - break; - } - $cnt += 1; - } - echo "Tested $cnt dates
        "; - if (!$fail) print "

        Passed !

        "; - else print "

        Failed :-(

        "; -} - -/** - Returns day of week, 0 = Sunday,... 6=Saturday. - Algorithm from PEAR::Date_Calc - */ -function adodb_dow($year, $month, $day) -{ - /* - Pope Gregory removed 10 days - October 5 to October 14 - from the year 1582 and - proclaimed that from that time onwards 3 days would be dropped from the calendar - every 400 years. - - Thursday, October 4, 1582 (Julian) was followed immediately by Friday, October 15, 1582 (Gregorian). - */ - if ($year <= 1582) { - if ($year < 1582 || - ($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3; - else - $greg_correction = 0; - } else - $greg_correction = 0; - - if($month > 2) - $month -= 2; - else { - $month += 10; - $year--; - } - - $day = floor((13 * $month - 1) / 5) + - $day + ($year % 100) + - floor(($year % 100) / 4) + - floor(($year / 100) / 4) - 2 * - floor($year / 100) + 77 + $greg_correction; - - return $day - 7 * floor($day / 7); -} - - -/** - Checks for leap year, returns true if it is. No 2-digit year check. Also - handles julian calendar correctly. - */ -function _adodb_is_leap_year($year) -{ - if ($year % 4 != 0) return false; - - if ($year % 400 == 0) { - return true; - // if gregorian calendar (>1582), century not-divisible by 400 is not leap - } else if ($year > 1582 && $year % 100 == 0 ) { - return false; - } - - return true; -} - - -/** - checks for leap year, returns true if it is. Has 2-digit year check - */ -function adodb_is_leap_year($year) -{ - return _adodb_is_leap_year(adodb_year_digit_check($year)); -} - -/** - Fix 2-digit years. Works for any century. - Assumes that if 2-digit is more than 30 years in future, then previous century. - */ -function adodb_year_digit_check($y) -{ - if ($y < 100) { - - $yr = (integer) date("Y"); - $century = (integer) ($yr /100); - - if ($yr%100 > 50) { - $c1 = $century + 1; - $c0 = $century; - } else { - $c1 = $century; - $c0 = $century - 1; - } - $c1 *= 100; - // if 2-digit year is less than 30 years in future, set it to this century - // otherwise if more than 30 years in future, then we set 2-digit year to the prev century. - if (($y + $c1) < $yr+30) $y = $y + $c1; - else $y = $y + $c0*100; - } - return $y; -} - -function adodb_get_gmt_diff_ts($ts) -{ - if (0 <= $ts && $ts <= 0x7FFFFFFF) { // check if number in 32-bit signed range) { - $arr = getdate($ts); - $y = $arr['year']; - $m = $arr['mon']; - $d = $arr['mday']; - return adodb_get_gmt_diff($y,$m,$d); - } else { - return adodb_get_gmt_diff(false,false,false); - } - -} - -/** - get local time zone offset from GMT. Does not handle historical timezones before 1970. - */ -function adodb_get_gmt_diff($y,$m,$d) -{ - static $TZ,$tzo; - global $ADODB_DATETIME_CLASS; - - if (!defined('ADODB_TEST_DATES')) $y = false; - else if ($y < 1970 || $y >= 2038) $y = false; - - if ($ADODB_DATETIME_CLASS && $y !== false) { - $dt = new DateTime(); - $dt->setISODate($y,$m,$d); - if (empty($tzo)) { - $tzo = new DateTimeZone(date_default_timezone_get()); - # $tzt = timezone_transitions_get( $tzo ); - } - return -$tzo->getOffset($dt); - } else { - if (isset($TZ)) return $TZ; - $y = date('Y'); - $TZ = @mktime(0,0,0,12,2,$y,0) - @gmmktime(0,0,0,12,2,$y,0); - } - - return $TZ; -} - -/** - Returns an array with date info. - */ -function adodb_getdate($d=false,$fast=false) -{ - if ($d === false) return getdate(); - if (!defined('ADODB_TEST_DATES')) { - if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range - if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer - return @getdate($d); - } - } - return _adodb_getdate($d); -} - -/* - // generate $YRS table for _adodb_getdate() - function adodb_date_gentable($out=true) - { - - for ($i=1970; $i >= 1600; $i-=10) { - $s = adodb_gmmktime(0,0,0,1,1,$i); - echo "$i => $s,
        "; - } - } - adodb_date_gentable(); - - for ($i=1970; $i > 1500; $i--) { - - echo "
        $i "; - adodb_date_test_date($i,1,1); - } - - */ - - -$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); -$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); - -function adodb_validdate($y,$m,$d) -{ - global $_month_table_normal,$_month_table_leaf; - - if (_adodb_is_leap_year($y)) $marr = $_month_table_leaf; - else $marr = $_month_table_normal; - - if ($m > 12 || $m < 1) return false; - - if ($d > 31 || $d < 1) return false; - - if ($marr[$m] < $d) return false; - - if ($y < 1000 && $y > 3000) return false; - - return true; -} - -/** - Low-level function that returns the getdate() array. We have a special - $fast flag, which if set to true, will return fewer array values, - and is much faster as it does not calculate dow, etc. - */ -function _adodb_getdate($origd=false,$fast=false,$is_gmt=false) -{ - static $YRS; - global $_month_table_normal,$_month_table_leaf; - - $d = $origd - ($is_gmt ? 0 : adodb_get_gmt_diff_ts($origd)); - $_day_power = 86400; - $_hour_power = 3600; - $_min_power = 60; - - if ($d < -12219321600) $d -= 86400*10; // if 15 Oct 1582 or earlier, gregorian correction - - $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); - $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); - - $d366 = $_day_power * 366; - $d365 = $_day_power * 365; - - if ($d < 0) { - - if (empty($YRS)) $YRS = array( - 1970 => 0, - 1960 => -315619200, - 1950 => -631152000, - 1940 => -946771200, - 1930 => -1262304000, - 1920 => -1577923200, - 1910 => -1893456000, - 1900 => -2208988800, - 1890 => -2524521600, - 1880 => -2840140800, - 1870 => -3155673600, - 1860 => -3471292800, - 1850 => -3786825600, - 1840 => -4102444800, - 1830 => -4417977600, - 1820 => -4733596800, - 1810 => -5049129600, - 1800 => -5364662400, - 1790 => -5680195200, - 1780 => -5995814400, - 1770 => -6311347200, - 1760 => -6626966400, - 1750 => -6942499200, - 1740 => -7258118400, - 1730 => -7573651200, - 1720 => -7889270400, - 1710 => -8204803200, - 1700 => -8520336000, - 1690 => -8835868800, - 1680 => -9151488000, - 1670 => -9467020800, - 1660 => -9782640000, - 1650 => -10098172800, - 1640 => -10413792000, - 1630 => -10729324800, - 1620 => -11044944000, - 1610 => -11360476800, - 1600 => -11676096000); - - if ($is_gmt) $origd = $d; - // The valid range of a 32bit signed timestamp is typically from - // Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT - // - - # old algorithm iterates through all years. new algorithm does it in - # 10 year blocks - - /* - # old algo - for ($a = 1970 ; --$a >= 0;) { - $lastd = $d; - - if ($leaf = _adodb_is_leap_year($a)) $d += $d366; - else $d += $d365; - - if ($d >= 0) { - $year = $a; - break; - } - } - */ - - $lastsecs = 0; - $lastyear = 1970; - foreach($YRS as $year => $secs) { - if ($d >= $secs) { - $a = $lastyear; - break; - } - $lastsecs = $secs; - $lastyear = $year; - } - - $d -= $lastsecs; - if (!isset($a)) $a = $lastyear; - - //echo ' yr=',$a,' ', $d,'.'; - - for (; --$a >= 0;) { - $lastd = $d; - - if ($leaf = _adodb_is_leap_year($a)) $d += $d366; - else $d += $d365; - - if ($d >= 0) { - $year = $a; - break; - } - } - /**/ - - $secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd; - - $d = $lastd; - $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal; - for ($a = 13 ; --$a > 0;) { - $lastd = $d; - $d += $mtab[$a] * $_day_power; - if ($d >= 0) { - $month = $a; - $ndays = $mtab[$a]; - break; - } - } - - $d = $lastd; - $day = $ndays + ceil(($d+1) / ($_day_power)); - - $d += ($ndays - $day+1)* $_day_power; - $hour = floor($d/$_hour_power); - - } else { - for ($a = 1970 ;; $a++) { - $lastd = $d; - - if ($leaf = _adodb_is_leap_year($a)) $d -= $d366; - else $d -= $d365; - if ($d < 0) { - $year = $a; - break; - } - } - $secsInYear = $lastd; - $d = $lastd; - $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal; - for ($a = 1 ; $a <= 12; $a++) { - $lastd = $d; - $d -= $mtab[$a] * $_day_power; - if ($d < 0) { - $month = $a; - $ndays = $mtab[$a]; - break; - } - } - $d = $lastd; - $day = ceil(($d+1) / $_day_power); - $d = $d - ($day-1) * $_day_power; - $hour = floor($d /$_hour_power); - } - - $d -= $hour * $_hour_power; - $min = floor($d/$_min_power); - $secs = $d - $min * $_min_power; - if ($fast) { - return array( - 'seconds' => $secs, - 'minutes' => $min, - 'hours' => $hour, - 'mday' => $day, - 'mon' => $month, - 'year' => $year, - 'yday' => floor($secsInYear/$_day_power), - 'leap' => $leaf, - 'ndays' => $ndays - ); - } - - - $dow = adodb_dow($year,$month,$day); - - return array( - 'seconds' => $secs, - 'minutes' => $min, - 'hours' => $hour, - 'mday' => $day, - 'wday' => $dow, - 'mon' => $month, - 'year' => $year, - 'yday' => floor($secsInYear/$_day_power), - 'weekday' => gmdate('l',$_day_power*(3+$dow)), - 'month' => gmdate('F',mktime(0,0,0,$month,2,1971)), - 0 => $origd - ); -} -/* - if ($isphp5) - $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36); - else - $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36); - break;*/ -function adodb_tz_offset($gmt,$isphp5) -{ - $zhrs = abs($gmt)/3600; - $hrs = floor($zhrs); - if ($isphp5) - return sprintf('%s%02d%02d',($gmt<=0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60); - else - return sprintf('%s%02d%02d',($gmt<0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60); -} - - -function adodb_gmdate($fmt,$d=false) -{ - return adodb_date($fmt,$d,true); -} - -// accepts unix timestamp and iso date format in $d -function adodb_date2($fmt, $d=false, $is_gmt=false) -{ - if ($d !== false) { - if (!preg_match( - "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", - ($d), $rr)) return adodb_date($fmt,false,$is_gmt); - - if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt); - - // h-m-s-MM-DD-YY - if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],false,$is_gmt); - else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],false,$is_gmt); - } - - return adodb_date($fmt,$d,$is_gmt); -} - - -/** - Return formatted date based on timestamp $d - */ -function adodb_date($fmt,$d=false,$is_gmt=false) -{ - static $daylight; - global $ADODB_DATETIME_CLASS; - - if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt); - if (!defined('ADODB_TEST_DATES')) { - if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range - if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer - return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d); - - } - } - $_day_power = 86400; - - $arr = _adodb_getdate($d,true,$is_gmt); - - if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv'); - if ($daylight) adodb_daylight_sv($arr, $is_gmt); - - $year = $arr['year']; - $month = $arr['mon']; - $day = $arr['mday']; - $hour = $arr['hours']; - $min = $arr['minutes']; - $secs = $arr['seconds']; - - $max = strlen($fmt); - $dates = ''; - - $isphp5 = PHP_VERSION >= 5; - - /* - at this point, we have the following integer vars to manipulate: - $year, $month, $day, $hour, $min, $secs - */ - for ($i=0; $i < $max; $i++) { - switch($fmt[$i]) { - case 'T': - if ($ADODB_DATETIME_CLASS) { - $dt = new DateTime(); - $dt->SetDate($year,$month,$day); - $dates .= $dt->Format('T'); - } else - $dates .= date('T'); - break; - // YEAR - case 'L': $dates .= $arr['leap'] ? '1' : '0'; break; - case 'r': // Thu, 21 Dec 2000 16:01:07 +0200 - - // 4.3.11 uses '04 Jun 2004' - // 4.3.8 uses ' 4 Jun 2004' - $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', ' - . ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' '; - - if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour; - - if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min; - - if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs; - - $gmt = adodb_get_gmt_diff($year,$month,$day); - - $dates .= ' '.adodb_tz_offset($gmt,$isphp5); - break; - - case 'Y': $dates .= $year; break; - case 'y': $dates .= substr($year,strlen($year)-2,2); break; - // MONTH - case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break; - case 'Q': $dates .= ($month+3)>>2; break; - case 'n': $dates .= $month; break; - case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break; - case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break; - // DAY - case 't': $dates .= $arr['ndays']; break; - case 'z': $dates .= $arr['yday']; break; - case 'w': $dates .= adodb_dow($year,$month,$day); break; - case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break; - case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break; - case 'j': $dates .= $day; break; - case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break; - case 'S': - $d10 = $day % 10; - if ($d10 == 1) $dates .= 'st'; - else if ($d10 == 2 && $day != 12) $dates .= 'nd'; - else if ($d10 == 3) $dates .= 'rd'; - else $dates .= 'th'; - break; - - // HOUR - case 'Z': - $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff($year,$month,$day); break; - case 'O': - $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$month,$day); - - $dates .= adodb_tz_offset($gmt,$isphp5); - break; - - case 'H': - if ($hour < 10) $dates .= '0'.$hour; - else $dates .= $hour; - break; - case 'h': - if ($hour > 12) $hh = $hour - 12; - else { - if ($hour == 0) $hh = '12'; - else $hh = $hour; - } - - if ($hh < 10) $dates .= '0'.$hh; - else $dates .= $hh; - break; - - case 'G': - $dates .= $hour; - break; - - case 'g': - if ($hour > 12) $hh = $hour - 12; - else { - if ($hour == 0) $hh = '12'; - else $hh = $hour; - } - $dates .= $hh; - break; - // MINUTES - case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break; - // SECONDS - case 'U': $dates .= $d; break; - case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break; - // AM/PM - // Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM - case 'a': - if ($hour>=12) $dates .= 'pm'; - else $dates .= 'am'; - break; - case 'A': - if ($hour>=12) $dates .= 'PM'; - else $dates .= 'AM'; - break; - default: - $dates .= $fmt[$i]; break; - // ESCAPE - case "\\": - $i++; - if ($i < $max) $dates .= $fmt[$i]; - break; - } - } - return $dates; -} - -/** - Returns a timestamp given a GMT/UTC time. - Note that $is_dst is not implemented and is ignored. - */ -function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false) -{ - return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true); -} - -/** - Return a timestamp given a local time. Originally by jackbbs. - Note that $is_dst is not implemented and is ignored. - - Not a very fast algorithm - O(n) operation. Could be optimized to O(1). - */ -function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false) -{ - if (!defined('ADODB_TEST_DATES')) { - - if ($mon === false) { - return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec); - } - - // for windows, we don't check 1970 because with timezone differences, - // 1 Jan 1970 could generate negative timestamp, which is illegal - $usephpfns = (1970 < $year && $year < 2038 - || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038) - ); - - - if ($usephpfns && ($year + $mon/12+$day/365.25+$hr/(24*365.25) >= 2038)) $usephpfns = false; - - if ($usephpfns) { - return $is_gmt ? - @gmmktime($hr,$min,$sec,$mon,$day,$year): - @mktime($hr,$min,$sec,$mon,$day,$year); - } - } - - $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$mon,$day); - - /* - # disabled because some people place large values in $sec. - # however we need it for $mon because we use an array... - $hr = intval($hr); - $min = intval($min); - $sec = intval($sec); - */ - $mon = intval($mon); - $day = intval($day); - $year = intval($year); - - - $year = adodb_year_digit_check($year); - - if ($mon > 12) { - $y = floor(($mon-1)/ 12); - $year += $y; - $mon -= $y*12; - } else if ($mon < 1) { - $y = ceil((1-$mon) / 12); - $year -= $y; - $mon += $y*12; - } - - $_day_power = 86400; - $_hour_power = 3600; - $_min_power = 60; - - $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); - $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); - - $_total_date = 0; - if ($year >= 1970) { - for ($a = 1970 ; $a <= $year; $a++) { - $leaf = _adodb_is_leap_year($a); - if ($leaf == true) { - $loop_table = $_month_table_leaf; - $_add_date = 366; - } else { - $loop_table = $_month_table_normal; - $_add_date = 365; - } - if ($a < $year) { - $_total_date += $_add_date; - } else { - for($b=1;$b<$mon;$b++) { - $_total_date += $loop_table[$b]; - } - } - } - $_total_date +=$day-1; - $ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different; - - } else { - for ($a = 1969 ; $a >= $year; $a--) { - $leaf = _adodb_is_leap_year($a); - if ($leaf == true) { - $loop_table = $_month_table_leaf; - $_add_date = 366; - } else { - $loop_table = $_month_table_normal; - $_add_date = 365; - } - if ($a > $year) { $_total_date += $_add_date; - } else { - for($b=12;$b>$mon;$b--) { - $_total_date += $loop_table[$b]; - } - } - } - $_total_date += $loop_table[$mon] - $day; - - $_day_time = $hr * $_hour_power + $min * $_min_power + $sec; - $_day_time = $_day_power - $_day_time; - $ret = -( $_total_date * $_day_power + $_day_time - $gmt_different); - if ($ret < -12220185600) $ret += 10*86400; // if earlier than 5 Oct 1582 - gregorian correction - else if ($ret < -12219321600) $ret = -12219321600; // if in limbo, reset to 15 Oct 1582. - } - //print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret; - return $ret; -} - -function adodb_gmstrftime($fmt, $ts=false) -{ - return adodb_strftime($fmt,$ts,true); -} - -// hack - convert to adodb_date -function adodb_strftime($fmt, $ts=false,$is_gmt=false) -{ - global $ADODB_DATE_LOCALE; - - if (!defined('ADODB_TEST_DATES')) { - if ((abs($ts) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range - if (!defined('ADODB_NO_NEGATIVE_TS') || $ts >= 0) // if windows, must be +ve integer - return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts); - - } - } - - if (empty($ADODB_DATE_LOCALE)) { - /* - $tstr = strtoupper(gmstrftime('%c',31366800)); // 30 Dec 1970, 1 am - $sep = substr($tstr,2,1); - $hasAM = strrpos($tstr,'M') !== false; - */ - # see http://phplens.com/lens/lensforum/msgs.php?id=14865 for reasoning, and changelog for version 0.24 - $dstr = gmstrftime('%x',31366800); // 30 Dec 1970, 1 am - $sep = substr($dstr,2,1); - $tstr = strtoupper(gmstrftime('%X',31366800)); // 30 Dec 1970, 1 am - $hasAM = strrpos($tstr,'M') !== false; - - $ADODB_DATE_LOCALE = array(); - $ADODB_DATE_LOCALE[] = strncmp($tstr,'30',2) == 0 ? 'd'.$sep.'m'.$sep.'y' : 'm'.$sep.'d'.$sep.'y'; - $ADODB_DATE_LOCALE[] = ($hasAM) ? 'h:i:s a' : 'H:i:s'; - - } - $inpct = false; - $fmtdate = ''; - for ($i=0,$max = strlen($fmt); $i < $max; $i++) { - $ch = $fmt[$i]; - if ($ch == '%') { - if ($inpct) { - $fmtdate .= '%'; - $inpct = false; - } else - $inpct = true; - } else if ($inpct) { - - $inpct = false; - switch($ch) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'E': - case 'O': - /* ignore format modifiers */ - $inpct = true; - break; - - case 'a': $fmtdate .= 'D'; break; - case 'A': $fmtdate .= 'l'; break; - case 'h': - case 'b': $fmtdate .= 'M'; break; - case 'B': $fmtdate .= 'F'; break; - case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1]; break; - case 'C': $fmtdate .= '\C?'; break; // century - case 'd': $fmtdate .= 'd'; break; - case 'D': $fmtdate .= 'm/d/y'; break; - case 'e': $fmtdate .= 'j'; break; - case 'g': $fmtdate .= '\g?'; break; //? - case 'G': $fmtdate .= '\G?'; break; //? - case 'H': $fmtdate .= 'H'; break; - case 'I': $fmtdate .= 'h'; break; - case 'j': $fmtdate .= '?z'; $parsej = true; break; // wrong as j=1-based, z=0-basd - case 'm': $fmtdate .= 'm'; break; - case 'M': $fmtdate .= 'i'; break; - case 'n': $fmtdate .= "\n"; break; - case 'p': $fmtdate .= 'a'; break; - case 'r': $fmtdate .= 'h:i:s a'; break; - case 'R': $fmtdate .= 'H:i:s'; break; - case 'S': $fmtdate .= 's'; break; - case 't': $fmtdate .= "\t"; break; - case 'T': $fmtdate .= 'H:i:s'; break; - case 'u': $fmtdate .= '?u'; $parseu = true; break; // wrong strftime=1-based, date=0-based - case 'U': $fmtdate .= '?U'; $parseU = true; break;// wrong strftime=1-based, date=0-based - case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0]; break; - case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1]; break; - case 'w': $fmtdate .= '?w'; $parseu = true; break; // wrong strftime=1-based, date=0-based - case 'W': $fmtdate .= '?W'; $parseU = true; break;// wrong strftime=1-based, date=0-based - case 'y': $fmtdate .= 'y'; break; - case 'Y': $fmtdate .= 'Y'; break; - case 'Z': $fmtdate .= 'T'; break; - } - } else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' )) - $fmtdate .= "\\".$ch; - else - $fmtdate .= $ch; - } - //echo "fmt=",$fmtdate,"
        "; - if ($ts === false) $ts = time(); - $ret = adodb_date($fmtdate, $ts, $is_gmt); - return $ret; -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-xmlschema.inc.php b/include/limesurvey/classes/adodb/adodb-xmlschema.inc.php deleted file mode 100644 index 92036946..00000000 --- a/include/limesurvey/classes/adodb/adodb-xmlschema.inc.php +++ /dev/null @@ -1,2223 +0,0 @@ -parent = $parent; - } - - /** - * XML Callback to process start elements - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - - } - - /** - * XML Callback to process CDATA elements - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - - } - - function create() { - return array(); - } - - /** - * Destroys the object - */ - function destroy() { - unset( $this ); - } - - /** - * Checks whether the specified RDBMS is supported by the current - * database object or its ranking ancestor. - * - * @param string $platform RDBMS platform name (from ADODB platform list). - * @return boolean TRUE if RDBMS is supported; otherwise returns FALSE. - */ - function supportedPlatform( $platform = NULL ) { - return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE; - } - - /** - * Returns the prefix set by the ranking ancestor of the database object. - * - * @param string $name Prefix string. - * @return string Prefix. - */ - function prefix( $name = '' ) { - return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name; - } - - /** - * Extracts a field ID from the specified field. - * - * @param string $field Field. - * @return string Field ID. - */ - function FieldID( $field ) { - return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) ); - } -} - -/** - * Creates a table object in ADOdb's datadict format - * - * This class stores information about a database table. As charactaristics - * of the table are loaded from the external source, methods and properties - * of this class are used to build up the table description in ADOdb's - * datadict format. - * - * @package axmls - * @access private - */ -class dbTable extends dbObject { - - /** - * @var string Table name - */ - var $name; - - /** - * @var array Field specifier: Meta-information about each field - */ - var $fields = array(); - - /** - * @var array List of table indexes. - */ - var $indexes = array(); - - /** - * @var array Table options: Table-level options - */ - var $opts = array(); - - /** - * @var string Field index: Keeps track of which field is currently being processed - */ - var $current_field; - - /** - * @var boolean Mark table for destruction - * @access private - */ - var $drop_table; - - /** - * @var boolean Mark field for destruction (not yet implemented) - * @access private - */ - var $drop_field = array(); - - /** - * Iniitializes a new table object. - * - * @param string $prefix DB Object prefix - * @param array $attributes Array of table attributes. - */ - function dbTable( &$parent, $attributes = NULL ) { - $this->parent = $parent; - $this->name = $this->prefix($attributes['NAME']); - } - - /** - * XML Callback to process start elements. Elements currently - * processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT. - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - $this->currentElement = strtoupper( $tag ); - - switch( $this->currentElement ) { - case 'INDEX': - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - xml_set_object( $parser, $this->addIndex( $attributes ) ); - } - break; - case 'DATA': - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - xml_set_object( $parser, $this->addData( $attributes ) ); - } - break; - case 'DROP': - $this->drop(); - break; - case 'FIELD': - // Add a field - $fieldName = $attributes['NAME']; - $fieldType = $attributes['TYPE']; - $fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL; - $fieldOpts = isset( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL; - - $this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts ); - break; - case 'KEY': - case 'NOTNULL': - case 'AUTOINCREMENT': - // Add a field option - $this->addFieldOpt( $this->current_field, $this->currentElement ); - break; - case 'DEFAULT': - // Add a field option to the table object - - // Work around ADOdb datadict issue that misinterprets empty strings. - if( $attributes['VALUE'] == '' ) { - $attributes['VALUE'] = " '' "; - } - - $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] ); - break; - case 'DEFDATE': - case 'DEFTIMESTAMP': - // Add a field option to the table object - $this->addFieldOpt( $this->current_field, $this->currentElement ); - break; - default: - // print_r( array( $tag, $attributes ) ); - } - } - - /** - * XML Callback to process CDATA elements - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - switch( $this->currentElement ) { - // Table constraint - case 'CONSTRAINT': - if( isset( $this->current_field ) ) { - $this->addFieldOpt( $this->current_field, $this->currentElement, $cdata ); - } else { - $this->addTableOpt( $cdata ); - } - break; - // Table option - case 'OPT': - $this->addTableOpt( $cdata ); - break; - default: - - } - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - $this->currentElement = ''; - - switch( strtoupper( $tag ) ) { - case 'TABLE': - $this->parent->addSQL( $this->create( $this->parent ) ); - xml_set_object( $parser, $this->parent ); - $this->destroy(); - break; - case 'FIELD': - unset($this->current_field); - break; - - } - } - - /** - * Adds an index to a table object - * - * @param array $attributes Index attributes - * @return object dbIndex object - */ - function addIndex( $attributes ) { - $name = strtoupper( $attributes['NAME'] ); - $this->indexes[$name] = new dbIndex( $this, $attributes ); - return $this->indexes[$name]; - } - - /** - * Adds data to a table object - * - * @param array $attributes Data attributes - * @return object dbData object - */ - function addData( $attributes ) { - if( !isset( $this->data ) ) { - $this->data = new dbData( $this, $attributes ); - } - return $this->data; - } - - /** - * Adds a field to a table object - * - * $name is the name of the table to which the field should be added. - * $type is an ADODB datadict field type. The following field types - * are supported as of ADODB 3.40: - * - C: varchar - * - X: CLOB (character large object) or largest varchar size - * if CLOB is not supported - * - C2: Multibyte varchar - * - X2: Multibyte CLOB - * - B: BLOB (binary large object) - * - D: Date (some databases do not support this, and we return a datetime type) - * - T: Datetime or Timestamp - * - L: Integer field suitable for storing booleans (0 or 1) - * - I: Integer (mapped to I4) - * - I1: 1-byte integer - * - I2: 2-byte integer - * - I4: 4-byte integer - * - I8: 8-byte integer - * - F: Floating point number - * - N: Numeric or decimal number - * - * @param string $name Name of the table to which the field will be added. - * @param string $type ADODB datadict field type. - * @param string $size Field size - * @param array $opts Field options array - * @return array Field specifier array - */ - function addField( $name, $type, $size = NULL, $opts = NULL ) { - $field_id = $this->FieldID( $name ); - - // Set the field index so we know where we are - $this->current_field = $field_id; - - // Set the field name (required) - $this->fields[$field_id]['NAME'] = $name; - - // Set the field type (required) - $this->fields[$field_id]['TYPE'] = $type; - - // Set the field size (optional) - if( isset( $size ) ) { - $this->fields[$field_id]['SIZE'] = $size; - } - - // Set the field options - if( isset( $opts ) ) { - $this->fields[$field_id]['OPTS'][] = $opts; - } - } - - /** - * Adds a field option to the current field specifier - * - * This method adds a field option allowed by the ADOdb datadict - * and appends it to the given field. - * - * @param string $field Field name - * @param string $opt ADOdb field option - * @param mixed $value Field option value - * @return array Field specifier array - */ - function addFieldOpt( $field, $opt, $value = NULL ) { - if( !isset( $value ) ) { - $this->fields[$this->FieldID( $field )]['OPTS'][] = $opt; - // Add the option and value - } else { - $this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value ); - } - } - - /** - * Adds an option to the table - * - * This method takes a comma-separated list of table-level options - * and appends them to the table object. - * - * @param string $opt Table option - * @return array Options - */ - function addTableOpt( $opt ) { - if(isset($this->currentPlatform)) { - $this->opts[$this->parent->db->databaseType] = $opt; - } - return $this->opts; - } - - - /** - * Generates the SQL that will create the table in the database - * - * @param object $xmls adoSchema object - * @return array Array containing table creation SQL - */ - function create( &$xmls ) { - $sql = array(); - - // drop any existing indexes - if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) { - foreach( $legacy_indexes as $index => $index_details ) { - $sql[] = $xmls->dict->DropIndexSQL( $index, $this->name ); - } - } - - // remove fields to be dropped from table object - foreach( $this->drop_field as $field ) { - unset( $this->fields[$field] ); - } - - // if table exists - if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) { - // drop table - if( $this->drop_table ) { - $sql[] = $xmls->dict->DropTableSQL( $this->name ); - - return $sql; - } - - // drop any existing fields not in schema - foreach( $legacy_fields as $field_id => $field ) { - if( !isset( $this->fields[$field_id] ) ) { - $sql[] = $xmls->dict->DropColumnSQL( $this->name, '`'.$field->name.'`' ); - } - } - // if table doesn't exist - } else { - if( $this->drop_table ) { - return $sql; - } - - $legacy_fields = array(); - } - - // Loop through the field specifier array, building the associative array for the field options - $fldarray = array(); - - foreach( $this->fields as $field_id => $finfo ) { - // Set an empty size if it isn't supplied - if( !isset( $finfo['SIZE'] ) ) { - $finfo['SIZE'] = ''; - } - - // Initialize the field array with the type and size - $fldarray[$field_id] = array( - 'NAME' => $finfo['NAME'], - 'TYPE' => $finfo['TYPE'], - 'SIZE' => $finfo['SIZE'] - ); - - // Loop through the options array and add the field options. - if( isset( $finfo['OPTS'] ) ) { - foreach( $finfo['OPTS'] as $opt ) { - // Option has an argument. - if( is_array( $opt ) ) { - $key = key( $opt ); - $value = $opt[key( $opt )]; - @$fldarray[$field_id][$key] .= $value; - // Option doesn't have arguments - } else { - $fldarray[$field_id][$opt] = $opt; - } - } - } - } - - if( empty( $legacy_fields ) ) { - // Create the new table - $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); - logMsg( end( $sql ), 'Generated CreateTableSQL' ); - } else { - // Upgrade an existing table - logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" ); - switch( $xmls->upgrade ) { - // Use ChangeTableSQL - case 'ALTER': - logMsg( 'Generated ChangeTableSQL (ALTERing table)' ); - $sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts ); - break; - case 'REPLACE': - logMsg( 'Doing upgrade REPLACE (testing)' ); - $sql[] = $xmls->dict->DropTableSQL( $this->name ); - $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); - break; - // ignore table - default: - return array(); - } - } - - foreach( $this->indexes as $index ) { - $sql[] = $index->create( $xmls ); - } - - if( isset( $this->data ) ) { - $sql[] = $this->data->create( $xmls ); - } - - return $sql; - } - - /** - * Marks a field or table for destruction - */ - function drop() { - if( isset( $this->current_field ) ) { - // Drop the current field - logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" ); - // $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field ); - $this->drop_field[$this->current_field] = $this->current_field; - } else { - // Drop the current table - logMsg( "Dropping table '{$this->name}'" ); - // $this->drop_table = $xmls->dict->DropTableSQL( $this->name ); - $this->drop_table = TRUE; - } - } -} - -/** - * Creates an index object in ADOdb's datadict format - * - * This class stores information about a database index. As charactaristics - * of the index are loaded from the external source, methods and properties - * of this class are used to build up the index description in ADOdb's - * datadict format. - * - * @package axmls - * @access private - */ -class dbIndex extends dbObject { - - /** - * @var string Index name - */ - var $name; - - /** - * @var array Index options: Index-level options - */ - var $opts = array(); - - /** - * @var array Indexed fields: Table columns included in this index - */ - var $columns = array(); - - /** - * @var boolean Mark index for destruction - * @access private - */ - var $drop = FALSE; - - /** - * Initializes the new dbIndex object. - * - * @param object $parent Parent object - * @param array $attributes Attributes - * - * @internal - */ - function dbIndex( &$parent, $attributes = NULL ) { - $this->parent = $parent; - - $this->name = $this->prefix ($attributes['NAME']); - } - - /** - * XML Callback to process start elements - * - * Processes XML opening tags. - * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - $this->currentElement = strtoupper( $tag ); - - switch( $this->currentElement ) { - case 'DROP': - $this->drop(); - break; - case 'CLUSTERED': - case 'BITMAP': - case 'UNIQUE': - case 'FULLTEXT': - case 'HASH': - // Add index Option - $this->addIndexOpt( $this->currentElement ); - break; - default: - // print_r( array( $tag, $attributes ) ); - } - } - - /** - * XML Callback to process CDATA elements - * - * Processes XML cdata. - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - switch( $this->currentElement ) { - // Index field name - case 'COL': - $this->addField( $cdata ); - break; - default: - - } - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - $this->currentElement = ''; - - switch( strtoupper( $tag ) ) { - case 'INDEX': - xml_set_object( $parser, $this->parent ); - break; - } - } - - /** - * Adds a field to the index - * - * @param string $name Field name - * @return string Field list - */ - function addField( $name ) { - $this->columns[$this->FieldID( $name )] = $name; - - // Return the field list - return $this->columns; - } - - /** - * Adds options to the index - * - * @param string $opt Comma-separated list of index options. - * @return string Option list - */ - function addIndexOpt( $opt ) { - $this->opts[] = $opt; - - // Return the options list - return $this->opts; - } - - /** - * Generates the SQL that will create the index in the database - * - * @param object $xmls adoSchema object - * @return array Array containing index creation SQL - */ - function create( &$xmls ) { - if( $this->drop ) { - return NULL; - } - - // eliminate any columns that aren't in the table - foreach( $this->columns as $id => $col ) { - if( !isset( $this->parent->fields[$id] ) ) { - unset( $this->columns[$id] ); - } - } - - return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts ); - } - - /** - * Marks an index for destruction - */ - function drop() { - $this->drop = TRUE; - } -} - -/** - * Creates a data object in ADOdb's datadict format - * - * This class stores information about table data. - * - * @package axmls - * @access private - */ -class dbData extends dbObject { - - var $data = array(); - - var $row; - - /** - * Initializes the new dbIndex object. - * - * @param object $parent Parent object - * @param array $attributes Attributes - * - * @internal - */ - function dbData( &$parent, $attributes = NULL ) { - $this->parent = $parent; - } - - /** - * XML Callback to process start elements - * - * Processes XML opening tags. - * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - $this->currentElement = strtoupper( $tag ); - - switch( $this->currentElement ) { - case 'ROW': - $this->row = count( $this->data ); - $this->data[$this->row] = array(); - break; - case 'F': - $this->addField($attributes); - default: - // print_r( array( $tag, $attributes ) ); - } - } - - /** - * XML Callback to process CDATA elements - * - * Processes XML cdata. - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - switch( $this->currentElement ) { - // Index field name - case 'F': - $this->addData( $cdata ); - break; - default: - - } - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - $this->currentElement = ''; - - switch( strtoupper( $tag ) ) { - case 'DATA': - xml_set_object( $parser, $this->parent ); - break; - } - } - - /** - * Adds a field to the index - * - * @param string $name Field name - * @return string Field list - */ - function addField( $attributes ) { - if( isset( $attributes['NAME'] ) ) { - $name = $attributes['NAME']; - } else { - $name = count($this->data[$this->row]); - } - - // Set the field index so we know where we are - $this->current_field = $this->FieldID( $name ); - } - - /** - * Adds options to the index - * - * @param string $opt Comma-separated list of index options. - * @return string Option list - */ - function addData( $cdata ) { - if( !isset( $this->data[$this->row] ) ) { - $this->data[$this->row] = array(); - } - - if( !isset( $this->data[$this->row][$this->current_field] ) ) { - $this->data[$this->row][$this->current_field] = ''; - } - - $this->data[$this->row][$this->current_field] .= $cdata; - } - - /** - * Generates the SQL that will create the index in the database - * - * @param object $xmls adoSchema object - * @return array Array containing index creation SQL - */ - function create( &$xmls ) { - $table = $xmls->dict->TableName($this->parent->name); - $table_field_count = count($this->parent->fields); - $sql = array(); - - // eliminate any columns that aren't in the table - foreach( $this->data as $row ) { - $table_fields = $this->parent->fields; - $fields = array(); - - foreach( $row as $field_id => $field_data ) { - if( !array_key_exists( $field_id, $table_fields ) ) { - if( is_numeric( $field_id ) ) { - $field_id = reset( array_keys( $table_fields ) ); - } else { - continue; - } - } - - $name = $table_fields[$field_id]['NAME']; - - switch( $table_fields[$field_id]['TYPE'] ) { - case 'C': - case 'C2': - case 'X': - case 'X2': - $fields[$name] = $xmls->db->qstr( $field_data ); - break; - case 'I': - case 'I1': - case 'I2': - case 'I4': - case 'I8': - $fields[$name] = intval($field_data); - break; - default: - $fields[$name] = $field_data; - } - - unset($table_fields[$field_id]); - } - - // check that at least 1 column is specified - if( empty( $fields ) ) { - continue; - } - - // check that no required columns are missing - if( count( $fields ) < $table_field_count ) { - foreach( $table_fields as $field ) { - if (isset( $field['OPTS'] )) - if( ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) { - continue(2); - } - } - } - - $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; - } - - return $sql; - } -} - -/** - * Creates the SQL to execute a list of provided SQL queries - * - * @package axmls - * @access private - */ -class dbQuerySet extends dbObject { - - /** - * @var array List of SQL queries - */ - var $queries = array(); - - /** - * @var string String used to build of a query line by line - */ - var $query; - - /** - * @var string Query prefix key - */ - var $prefixKey = ''; - - /** - * @var boolean Auto prefix enable (TRUE) - */ - var $prefixMethod = 'AUTO'; - - /** - * Initializes the query set. - * - * @param object $parent Parent object - * @param array $attributes Attributes - */ - function dbQuerySet( &$parent, $attributes = NULL ) { - $this->parent = $parent; - - // Overrides the manual prefix key - if( isset( $attributes['KEY'] ) ) { - $this->prefixKey = $attributes['KEY']; - } - - $prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : ''; - - // Enables or disables automatic prefix prepending - switch( $prefixMethod ) { - case 'AUTO': - $this->prefixMethod = 'AUTO'; - break; - case 'MANUAL': - $this->prefixMethod = 'MANUAL'; - break; - case 'NONE': - $this->prefixMethod = 'NONE'; - break; - } - } - - /** - * XML Callback to process start elements. Elements currently - * processed are: QUERY. - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - $this->currentElement = strtoupper( $tag ); - - switch( $this->currentElement ) { - case 'QUERY': - // Create a new query in a SQL queryset. - // Ignore this query set if a platform is specified and it's different than the - // current connection platform. - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - $this->newQuery(); - } else { - $this->discardQuery(); - } - break; - default: - // print_r( array( $tag, $attributes ) ); - } - } - - /** - * XML Callback to process CDATA elements - */ - function _tag_cdata( &$parser, $cdata ) { - switch( $this->currentElement ) { - // Line of queryset SQL data - case 'QUERY': - $this->buildQuery( $cdata ); - break; - default: - - } - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - $this->currentElement = ''; - - switch( strtoupper( $tag ) ) { - case 'QUERY': - // Add the finished query to the open query set. - $this->addQuery(); - break; - case 'SQL': - $this->parent->addSQL( $this->create( $this->parent ) ); - xml_set_object( $parser, $this->parent ); - $this->destroy(); - break; - default: - - } - } - - /** - * Re-initializes the query. - * - * @return boolean TRUE - */ - function newQuery() { - $this->query = ''; - - return TRUE; - } - - /** - * Discards the existing query. - * - * @return boolean TRUE - */ - function discardQuery() { - unset( $this->query ); - - return TRUE; - } - - /** - * Appends a line to a query that is being built line by line - * - * @param string $data Line of SQL data or NULL to initialize a new query - * @return string SQL query string. - */ - function buildQuery( $sql = NULL ) { - if( !isset( $this->query ) OR empty( $sql ) ) { - return FALSE; - } - - $this->query .= $sql; - - return $this->query; - } - - /** - * Adds a completed query to the query list - * - * @return string SQL of added query - */ - function addQuery() { - if( !isset( $this->query ) ) { - return FALSE; - } - - $this->queries[] = $return = trim($this->query); - - unset( $this->query ); - - return $return; - } - - /** - * Creates and returns the current query set - * - * @param object $xmls adoSchema object - * @return array Query set - */ - function create( &$xmls ) { - foreach( $this->queries as $id => $query ) { - switch( $this->prefixMethod ) { - case 'AUTO': - // Enable auto prefix replacement - - // Process object prefix. - // Evaluate SQL statements to prepend prefix to objects - $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); - $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); - $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); - - // SELECT statements aren't working yet - #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data ); - - case 'MANUAL': - // If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX. - // If prefixKey is not set, we use the default constant XMLS_PREFIX - if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) { - // Enable prefix override - $query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query ); - } else { - // Use default replacement - $query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query ); - } - } - - $this->queries[$id] = trim( $query ); - } - - // Return the query set array - return $this->queries; - } - - /** - * Rebuilds the query with the prefix attached to any objects - * - * @param string $regex Regex used to add prefix - * @param string $query SQL query string - * @param string $prefix Prefix to be appended to tables, indices, etc. - * @return string Prefixed SQL query string. - */ - function prefixQuery( $regex, $query, $prefix = NULL ) { - if( !isset( $prefix ) ) { - return $query; - } - - if( preg_match( $regex, $query, $match ) ) { - $preamble = $match[1]; - $postamble = $match[5]; - $objectList = explode( ',', $match[3] ); - // $prefix = $prefix . '_'; - - $prefixedList = ''; - - foreach( $objectList as $object ) { - if( $prefixedList !== '' ) { - $prefixedList .= ', '; - } - - $prefixedList .= $prefix . trim( $object ); - } - - $query = $preamble . ' ' . $prefixedList . ' ' . $postamble; - } - - return $query; - } -} - -/** - * Loads and parses an XML file, creating an array of "ready-to-run" SQL statements - * - * This class is used to load and parse the XML file, to create an array of SQL statements - * that can be used to build a database, and to build the database using the SQL array. - * - * @tutorial getting_started.pkg - * - * @author Richard Tango-Lowy & Dan Cech - * @version $Revision: 1.12 $ - * - * @package axmls - */ -class adoSchema { - - /** - * @var array Array containing SQL queries to generate all objects - * @access private - */ - var $sqlArray; - - /** - * @var object ADOdb connection object - * @access private - */ - var $db; - - /** - * @var object ADOdb Data Dictionary - * @access private - */ - var $dict; - - /** - * @var string Current XML element - * @access private - */ - var $currentElement = ''; - - /** - * @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database - * @access private - */ - var $upgrade = ''; - - /** - * @var string Optional object prefix - * @access private - */ - var $objectPrefix = ''; - - /** - * @var long Original Magic Quotes Runtime value - * @access private - */ - var $mgq; - - /** - * @var long System debug - * @access private - */ - var $debug; - - /** - * @var string Regular expression to find schema version - * @access private - */ - var $versionRegex = '//'; - - /** - * @var string Current schema version - * @access private - */ - var $schemaVersion; - - /** - * @var int Success of last Schema execution - */ - var $success; - - /** - * @var bool Execute SQL inline as it is generated - */ - var $executeInline; - - /** - * @var bool Continue SQL execution if errors occur - */ - var $continueOnError; - - /** - * Creates an adoSchema object - * - * Creating an adoSchema object is the first step in processing an XML schema. - * The only parameter is an ADOdb database connection object, which must already - * have been created. - * - * @param object $db ADOdb database connection object. - */ - function adoSchema( &$db ) { - // Initialize the environment - $this->mgq = get_magic_quotes_runtime(); - @set_magic_quotes_runtime(0); - - $this->db = $db; - $this->debug = $this->db->debug; - $this->dict = NewDataDictionary( $this->db ); - $this->sqlArray = array(); - $this->schemaVersion = XMLS_SCHEMA_VERSION; - $this->executeInline( XMLS_EXECUTE_INLINE ); - $this->continueOnError( XMLS_CONTINUE_ON_ERROR ); - $this->setUpgradeMethod(); - } - - /** - * Sets the method to be used for upgrading an existing database - * - * Use this method to specify how existing database objects should be upgraded. - * The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to - * alter each database object directly, REPLACE attempts to rebuild each object - * from scratch, BEST attempts to determine the best upgrade method for each - * object, and NONE disables upgrading. - * - * This method is not yet used by AXMLS, but exists for backward compatibility. - * The ALTER method is automatically assumed when the adoSchema object is - * instantiated; other upgrade methods are not currently supported. - * - * @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE) - * @returns string Upgrade method used - */ - function SetUpgradeMethod( $method = '' ) { - if( !is_string( $method ) ) { - return FALSE; - } - - $method = strtoupper( $method ); - - // Handle the upgrade methods - switch( $method ) { - case 'ALTER': - $this->upgrade = $method; - break; - case 'REPLACE': - $this->upgrade = $method; - break; - case 'BEST': - $this->upgrade = 'ALTER'; - break; - case 'NONE': - $this->upgrade = 'NONE'; - break; - default: - // Use default if no legitimate method is passed. - $this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD; - } - - return $this->upgrade; - } - - /** - * Enables/disables inline SQL execution. - * - * Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution), - * AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode - * is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema() - * to apply the schema to the database. - * - * @param bool $mode execute - * @return bool current execution mode - * - * @see ParseSchema(), ExecuteSchema() - */ - function ExecuteInline( $mode = NULL ) { - if( is_bool( $mode ) ) { - $this->executeInline = $mode; - } - - return $this->executeInline; - } - - /** - * Enables/disables SQL continue on error. - * - * Call this method to enable or disable continuation of SQL execution if an error occurs. - * If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs. - * If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing - * of the schema will continue. - * - * @param bool $mode execute - * @return bool current continueOnError mode - * - * @see addSQL(), ExecuteSchema() - */ - function ContinueOnError( $mode = NULL ) { - if( is_bool( $mode ) ) { - $this->continueOnError = $mode; - } - - return $this->continueOnError; - } - - /** - * Loads an XML schema from a file and converts it to SQL. - * - * Call this method to load the specified schema (see the DTD for the proper format) from - * the filesystem and generate the SQL necessary to create the database described. - * @see ParseSchemaString() - * - * @param string $file Name of XML schema file. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute - */ - function ParseSchema( $filename, $returnSchema = FALSE ) { - return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); - } - - /** - * Loads an XML schema from a file and converts it to SQL. - * - * Call this method to load the specified schema from a file (see the DTD for the proper format) - * and generate the SQL necessary to create the database described by the schema. - * - * @param string $file Name of XML schema file. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute. - * - * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString() - * @see ParseSchema(), ParseSchemaString() - */ - function ParseSchemaFile( $filename, $returnSchema = FALSE ) { - // Open the file - if( !($fp = fopen( $filename, 'r' )) ) { - // die( 'Unable to open file' ); - return FALSE; - } - - // do version detection here - if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) { - return FALSE; - } - - if ( $returnSchema ) - { - $xmlstring = ''; - while( $data = fread( $fp, 100000 ) ) { - $xmlstring .= $data; - } - return $xmlstring; - } - - $this->success = 2; - - $xmlParser = $this->create_parser(); - - // Process the file - while( $data = fread( $fp, 4096 ) ) { - if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) { - die( sprintf( - "XML error: %s at line %d", - xml_error_string( xml_get_error_code( $xmlParser) ), - xml_get_current_line_number( $xmlParser) - ) ); - } - } - - xml_parser_free( $xmlParser ); - - return $this->sqlArray; - } - - /** - * Converts an XML schema string to SQL. - * - * Call this method to parse a string containing an XML schema (see the DTD for the proper format) - * and generate the SQL necessary to create the database described by the schema. - * @see ParseSchema() - * - * @param string $xmlstring XML schema string. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute. - */ - function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) { - if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { - return FALSE; - } - - // do version detection here - if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) { - return FALSE; - } - - if ( $returnSchema ) - { - return $xmlstring; - } - - $this->success = 2; - - $xmlParser = $this->create_parser(); - - if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) { - die( sprintf( - "XML error: %s at line %d", - xml_error_string( xml_get_error_code( $xmlParser) ), - xml_get_current_line_number( $xmlParser) - ) ); - } - - xml_parser_free( $xmlParser ); - - return $this->sqlArray; - } - - /** - * Loads an XML schema from a file and converts it to uninstallation SQL. - * - * Call this method to load the specified schema (see the DTD for the proper format) from - * the filesystem and generate the SQL necessary to remove the database described. - * @see RemoveSchemaString() - * - * @param string $file Name of XML schema file. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute - */ - function RemoveSchema( $filename, $returnSchema = FALSE ) { - return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); - } - - /** - * Converts an XML schema string to uninstallation SQL. - * - * Call this method to parse a string containing an XML schema (see the DTD for the proper format) - * and generate the SQL necessary to uninstall the database described by the schema. - * @see RemoveSchema() - * - * @param string $schema XML schema string. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute. - */ - function RemoveSchemaString( $schema, $returnSchema = FALSE ) { - - // grab current version - if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { - return FALSE; - } - - return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema ); - } - - /** - * Applies the current XML schema to the database (post execution). - * - * Call this method to apply the current schema (generally created by calling - * ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes, - * and executing other SQL specified in the schema) after parsing. - * @see ParseSchema(), ParseSchemaString(), ExecuteInline() - * - * @param array $sqlArray Array of SQL statements that will be applied rather than - * the current schema. - * @param boolean $continueOnErr Continue to apply the schema even if an error occurs. - * @returns integer 0 if failure, 1 if errors, 2 if successful. - */ - function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) { - if( !is_bool( $continueOnErr ) ) { - $continueOnErr = $this->ContinueOnError(); - } - - if( !isset( $sqlArray ) ) { - $sqlArray = $this->sqlArray; - } - - if( !is_array( $sqlArray ) ) { - $this->success = 0; - } else { - $this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr ); - } - - return $this->success; - } - - /** - * Returns the current SQL array. - * - * Call this method to fetch the array of SQL queries resulting from - * ParseSchema() or ParseSchemaString(). - * - * @param string $format Format: HTML, TEXT, or NONE (PHP array) - * @return array Array of SQL statements or FALSE if an error occurs - */ - function PrintSQL( $format = 'NONE' ) { - $sqlArray = null; - return $this->getSQL( $format, $sqlArray ); - } - - /** - * Saves the current SQL array to the local filesystem as a list of SQL queries. - * - * Call this method to save the array of SQL queries (generally resulting from a - * parsed XML schema) to the filesystem. - * - * @param string $filename Path and name where the file should be saved. - * @return boolean TRUE if save is successful, else FALSE. - */ - function SaveSQL( $filename = './schema.sql' ) { - - if( !isset( $sqlArray ) ) { - $sqlArray = $this->sqlArray; - } - if( !isset( $sqlArray ) ) { - return FALSE; - } - - $fp = fopen( $filename, "w" ); - - foreach( $sqlArray as $key => $query ) { - fwrite( $fp, $query . ";\n" ); - } - fclose( $fp ); - } - - /** - * Create an xml parser - * - * @return object PHP XML parser object - * - * @access private - */ - function create_parser() { - // Create the parser - $xmlParser = xml_parser_create(); - xml_set_object( $xmlParser, $this ); - - // Initialize the XML callback functions - xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' ); - xml_set_character_data_handler( $xmlParser, '_tag_cdata' ); - - return $xmlParser; - } - - /** - * XML Callback to process start elements - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - switch( strtoupper( $tag ) ) { - case 'TABLE': - $this->obj = new dbTable( $this, $attributes ); - xml_set_object( $parser, $this->obj ); - break; - case 'SQL': - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - $this->obj = new dbQuerySet( $this, $attributes ); - xml_set_object( $parser, $this->obj ); - } - break; - default: - // print_r( array( $tag, $attributes ) ); - } - - } - - /** - * XML Callback to process CDATA elements - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - } - - /** - * XML Callback to process end elements - * - * @access private - * @internal - */ - function _tag_close( &$parser, $tag ) { - - } - - /** - * Converts an XML schema string to the specified DTD version. - * - * Call this method to convert a string containing an XML schema to a different AXMLS - * DTD version. For instance, to convert a schema created for an pre-1.0 version for - * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version - * parameter is specified, the schema will be converted to the current DTD version. - * If the newFile parameter is provided, the converted schema will be written to the specified - * file. - * @see ConvertSchemaFile() - * - * @param string $schema String containing XML schema that will be converted. - * @param string $newVersion DTD version to convert to. - * @param string $newFile File name of (converted) output file. - * @return string Converted XML schema or FALSE if an error occurs. - */ - function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) { - - // grab current version - if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { - return FALSE; - } - - if( !isset ($newVersion) ) { - $newVersion = $this->schemaVersion; - } - - if( $version == $newVersion ) { - $result = $schema; - } else { - $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion); - } - - if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { - fwrite( $fp, $result ); - fclose( $fp ); - } - - return $result; - } - - // compat for pre-4.3 - jlim - function _file_get_contents($path) - { - if (function_exists('file_get_contents')) return file_get_contents($path); - return join('',file($path)); - } - - /** - * Converts an XML schema file to the specified DTD version. - * - * Call this method to convert the specified XML schema file to a different AXMLS - * DTD version. For instance, to convert a schema created for an pre-1.0 version for - * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version - * parameter is specified, the schema will be converted to the current DTD version. - * If the newFile parameter is provided, the converted schema will be written to the specified - * file. - * @see ConvertSchemaString() - * - * @param string $filename Name of XML schema file that will be converted. - * @param string $newVersion DTD version to convert to. - * @param string $newFile File name of (converted) output file. - * @return string Converted XML schema or FALSE if an error occurs. - */ - function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) { - - // grab current version - if( !( $version = $this->SchemaFileVersion( $filename ) ) ) { - return FALSE; - } - - if( !isset ($newVersion) ) { - $newVersion = $this->schemaVersion; - } - - if( $version == $newVersion ) { - $result = _file_get_contents( $filename ); - - // remove unicode BOM if present - if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) { - $result = substr( $result, 3 ); - } - } else { - $result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' ); - } - - if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { - fwrite( $fp, $result ); - fclose( $fp ); - } - - return $result; - } - - function TransformSchema( $schema, $xsl, $schematype='string' ) - { - // Fail if XSLT extension is not available - if( ! function_exists( 'xslt_create' ) ) { - return FALSE; - } - - $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl'; - - // look for xsl - if( !is_readable( $xsl_file ) ) { - return FALSE; - } - - switch( $schematype ) - { - case 'file': - if( !is_readable( $schema ) ) { - return FALSE; - } - - $schema = _file_get_contents( $schema ); - break; - case 'string': - default: - if( !is_string( $schema ) ) { - return FALSE; - } - } - - $arguments = array ( - '/_xml' => $schema, - '/_xsl' => _file_get_contents( $xsl_file ) - ); - - // create an XSLT processor - $xh = xslt_create (); - - // set error handler - xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler')); - - // process the schema - $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); - - xslt_free ($xh); - - return $result; - } - - /** - * Processes XSLT transformation errors - * - * @param object $parser XML parser object - * @param integer $errno Error number - * @param integer $level Error level - * @param array $fields Error information fields - * - * @access private - */ - function xslt_error_handler( $parser, $errno, $level, $fields ) { - if( is_array( $fields ) ) { - $msg = array( - 'Message Type' => ucfirst( $fields['msgtype'] ), - 'Message Code' => $fields['code'], - 'Message' => $fields['msg'], - 'Error Number' => $errno, - 'Level' => $level - ); - - switch( $fields['URI'] ) { - case 'arg:/_xml': - $msg['Input'] = 'XML'; - break; - case 'arg:/_xsl': - $msg['Input'] = 'XSL'; - break; - default: - $msg['Input'] = $fields['URI']; - } - - $msg['Line'] = $fields['line']; - } else { - $msg = array( - 'Message Type' => 'Error', - 'Error Number' => $errno, - 'Level' => $level, - 'Fields' => var_export( $fields, TRUE ) - ); - } - - $error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n" - . '' . "\n"; - - foreach( $msg as $label => $details ) { - $error_details .= '' . "\n"; - } - - $error_details .= '
        ' . $label . ': ' . htmlentities( $details ) . '
        '; - - trigger_error( $error_details, E_USER_ERROR ); - } - - /** - * Returns the AXMLS Schema Version of the requested XML schema file. - * - * Call this method to obtain the AXMLS DTD version of the requested XML schema file. - * @see SchemaStringVersion() - * - * @param string $filename AXMLS schema file - * @return string Schema version number or FALSE on error - */ - function SchemaFileVersion( $filename ) { - // Open the file - if( !($fp = fopen( $filename, 'r' )) ) { - // die( 'Unable to open file' ); - return FALSE; - } - - // Process the file - while( $data = fread( $fp, 4096 ) ) { - if( preg_match( $this->versionRegex, $data, $matches ) ) { - return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; - } - } - - return FALSE; - } - - /** - * Returns the AXMLS Schema Version of the provided XML schema string. - * - * Call this method to obtain the AXMLS DTD version of the provided XML schema string. - * @see SchemaFileVersion() - * - * @param string $xmlstring XML schema string - * @return string Schema version number or FALSE on error - */ - function SchemaStringVersion( $xmlstring ) { - if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { - return FALSE; - } - - if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) { - return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; - } - - return FALSE; - } - - /** - * Extracts an XML schema from an existing database. - * - * Call this method to create an XML schema string from an existing database. - * If the data parameter is set to TRUE, AXMLS will include the data from the database - * in the schema. - * - * @param boolean $data Include data in schema dump - * @return string Generated XML schema - */ - function ExtractSchema( $data = FALSE ) { - $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM ); - - $schema = '' . "\n" - . '' . "\n"; - - if( is_array( $tables = $this->db->MetaTables( 'TABLES' ) ) ) { - foreach( $tables as $table ) { - $schema .= ' ' . "\n"; - - // grab details from database - $rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE 1=1' ); - $fields = $this->db->MetaColumns( $table ); - $indexes = $this->db->MetaIndexes( $table ); - - if( is_array( $fields ) ) { - foreach( $fields as $details ) { - $extra = ''; - $content = array(); - - if( $details->max_length > 0 ) { - $extra .= ' size="' . $details->max_length . '"'; - } - - if( $details->primary_key ) { - $content[] = ''; - } elseif( $details->not_null ) { - $content[] = ''; - } - - if( $details->has_default ) { - $content[] = ''; - } - - if( $details->auto_increment ) { - $content[] = ''; - } - - // this stops the creation of 'R' columns, - // AUTOINCREMENT is used to create auto columns - $details->primary_key = 0; - $type = $rs->MetaType( $details ); - - $schema .= ' '; - - if( !empty( $content ) ) { - $schema .= "\n " . implode( "\n ", $content ) . "\n "; - } - - $schema .= '' . "\n"; - } - } - - if( is_array( $indexes ) ) { - foreach( $indexes as $index => $details ) { - $schema .= ' ' . "\n"; - - if( $details['unique'] ) { - $schema .= ' ' . "\n"; - } - - foreach( $details['columns'] as $column ) { - $schema .= ' ' . $column . '' . "\n"; - } - - $schema .= ' ' . "\n"; - } - } - - if( $data ) { - $rs = $this->db->Execute( 'SELECT * FROM ' . $table ); - - if( is_object( $rs ) ) { - $schema .= ' ' . "\n"; - - while( $row = $rs->FetchRow() ) { - foreach( $row as $key => $val ) { - $row[$key] = htmlentities($val); - } - - $schema .= ' ' . implode( '', $row ) . '' . "\n"; - } - - $schema .= ' ' . "\n"; - } - } - - $schema .= '
        ' . "\n"; - } - } - - $this->db->SetFetchMode( $old_mode ); - - $schema .= '
        '; - return $schema; - } - - /** - * Sets a prefix for database objects - * - * Call this method to set a standard prefix that will be prepended to all database tables - * and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix. - * - * @param string $prefix Prefix that will be prepended. - * @param boolean $underscore If TRUE, automatically append an underscore character to the prefix. - * @return boolean TRUE if successful, else FALSE - */ - function SetPrefix( $prefix = '', $underscore = TRUE ) { - switch( TRUE ) { - // clear prefix - case empty( $prefix ): - logMsg( 'Cleared prefix' ); - $this->objectPrefix = ''; - return TRUE; - // prefix too long - case strlen( $prefix ) > XMLS_PREFIX_MAXLEN: - // prefix contains invalid characters - case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ): - logMsg( 'Invalid prefix: ' . $prefix ); - return FALSE; - } - - if( $underscore AND substr( $prefix, -1 ) != '_' ) { - $prefix .= '_'; - } - - // prefix valid - logMsg( 'Set prefix: ' . $prefix ); - $this->objectPrefix = $prefix; - return TRUE; - } - - /** - * Returns an object name with the current prefix prepended. - * - * @param string $name Name - * @return string Prefixed name - * - * @access private - */ - function prefix( $name = '' ) { - // if prefix is set - if( !empty( $this->objectPrefix ) ) { - // Prepend the object prefix to the table name - // prepend after quote if used - return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name ); - } - - // No prefix set. Use name provided. - return $name; - } - - /** - * Checks if element references a specific platform - * - * @param string $platform Requested platform - * @returns boolean TRUE if platform check succeeds - * - * @access private - */ - function supportedPlatform( $platform = NULL ) { - $regex = '/^(\w*\|)*' . $this->db->databaseType . '(\|\w*)*$/'; - - if( !isset( $platform ) OR preg_match( $regex, $platform ) ) { - logMsg( "Platform $platform is supported" ); - return TRUE; - } else { - logMsg( "Platform $platform is NOT supported" ); - return FALSE; - } - } - - /** - * Clears the array of generated SQL. - * - * @access private - */ - function clearSQL() { - $this->sqlArray = array(); - } - - /** - * Adds SQL into the SQL array. - * - * @param mixed $sql SQL to Add - * @return boolean TRUE if successful, else FALSE. - * - * @access private - */ - function addSQL( $sql = NULL ) { - if( is_array( $sql ) ) { - foreach( $sql as $line ) { - $this->addSQL( $line ); - } - - return TRUE; - } - - if( is_string( $sql ) ) { - $this->sqlArray[] = $sql; - - // if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL. - if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) { - $saved = $this->db->debug; - $this->db->debug = $this->debug; - $ok = $this->db->Execute( $sql ); - $this->db->debug = $saved; - - if( !$ok ) { - if( $this->debug ) { - ADOConnection::outp( $this->db->ErrorMsg() ); - } - - $this->success = 1; - } - } - - return TRUE; - } - - return FALSE; - } - - /** - * Gets the SQL array in the specified format. - * - * @param string $format Format - * @return mixed SQL - * - * @access private - */ - function getSQL( $format = NULL, $sqlArray = NULL ) { - if( !is_array( $sqlArray ) ) { - $sqlArray = $this->sqlArray; - } - - if( !is_array( $sqlArray ) ) { - return FALSE; - } - - switch( strtolower( $format ) ) { - case 'string': - case 'text': - return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : ''; - case'html': - return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : ''; - } - - return $this->sqlArray; - } - - /** - * Destroys an adoSchema object. - * - * Call this method to clean up after an adoSchema object that is no longer in use. - * @deprecated adoSchema now cleans up automatically. - */ - function Destroy() { - @set_magic_quotes_runtime( $this->mgq ); - unset( $this ); - } -} - -/** - * Message logging function - * - * @access private - */ -function logMsg( $msg, $title = NULL, $force = FALSE ) { - if( XMLS_DEBUG or $force ) { - echo '
        ';
        -
        -        if( isset( $title ) ) {
        -            echo '

        ' . htmlentities( $title ) . '

        '; - } - - if( is_object( $this ) ) { - echo '[' . get_class( $this ) . '] '; - } - - print_r( $msg ); - - echo '
        '; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb-xmlschema03.inc.php b/include/limesurvey/classes/adodb/adodb-xmlschema03.inc.php deleted file mode 100644 index e92b0c0b..00000000 --- a/include/limesurvey/classes/adodb/adodb-xmlschema03.inc.php +++ /dev/null @@ -1,2404 +0,0 @@ -parent = $parent; - } - - /** - * XML Callback to process start elements - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - - } - - /** - * XML Callback to process CDATA elements - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - - } - - function create() { - return array(); - } - - /** - * Destroys the object - */ - function destroy() { - unset( $this ); - } - - /** - * Checks whether the specified RDBMS is supported by the current - * database object or its ranking ancestor. - * - * @param string $platform RDBMS platform name (from ADODB platform list). - * @return boolean TRUE if RDBMS is supported; otherwise returns FALSE. - */ - function supportedPlatform( $platform = NULL ) { - return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE; - } - - /** - * Returns the prefix set by the ranking ancestor of the database object. - * - * @param string $name Prefix string. - * @return string Prefix. - */ - function prefix( $name = '' ) { - return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name; - } - - /** - * Extracts a field ID from the specified field. - * - * @param string $field Field. - * @return string Field ID. - */ - function FieldID( $field ) { - return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) ); - } -} - -/** - * Creates a table object in ADOdb's datadict format - * - * This class stores information about a database table. As charactaristics - * of the table are loaded from the external source, methods and properties - * of this class are used to build up the table description in ADOdb's - * datadict format. - * - * @package axmls - * @access private - */ -class dbTable extends dbObject { - - /** - * @var string Table name - */ - var $name; - - /** - * @var array Field specifier: Meta-information about each field - */ - var $fields = array(); - - /** - * @var array List of table indexes. - */ - var $indexes = array(); - - /** - * @var array Table options: Table-level options - */ - var $opts = array(); - - /** - * @var string Field index: Keeps track of which field is currently being processed - */ - var $current_field; - - /** - * @var boolean Mark table for destruction - * @access private - */ - var $drop_table; - - /** - * @var boolean Mark field for destruction (not yet implemented) - * @access private - */ - var $drop_field = array(); - - /** - * @var array Platform-specific options - * @access private - */ - var $currentPlatform = true; - - - /** - * Iniitializes a new table object. - * - * @param string $prefix DB Object prefix - * @param array $attributes Array of table attributes. - */ - function dbTable( &$parent, $attributes = NULL ) { - $this->parent = $parent; - $this->name = $this->prefix($attributes['NAME']); - } - - /** - * XML Callback to process start elements. Elements currently - * processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT. - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - $this->currentElement = strtoupper( $tag ); - - switch( $this->currentElement ) { - case 'INDEX': - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - xml_set_object( $parser, $this->addIndex( $attributes ) ); - } - break; - case 'DATA': - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - xml_set_object( $parser, $this->addData( $attributes ) ); - } - break; - case 'DROP': - $this->drop(); - break; - case 'FIELD': - // Add a field - $fieldName = $attributes['NAME']; - $fieldType = $attributes['TYPE']; - $fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL; - $fieldOpts = !empty( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL; - - $this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts ); - break; - case 'KEY': - case 'NOTNULL': - case 'AUTOINCREMENT': - case 'DEFDATE': - case 'DEFTIMESTAMP': - case 'UNSIGNED': - // Add a field option - $this->addFieldOpt( $this->current_field, $this->currentElement ); - break; - case 'DEFAULT': - // Add a field option to the table object - - // Work around ADOdb datadict issue that misinterprets empty strings. - if( $attributes['VALUE'] == '' ) { - $attributes['VALUE'] = " '' "; - } - - $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] ); - break; - case 'OPT': - case 'CONSTRAINT': - // Accept platform-specific options - $this->currentPlatform = ( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ); - break; - default: - // print_r( array( $tag, $attributes ) ); - } - } - - /** - * XML Callback to process CDATA elements - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - switch( $this->currentElement ) { - // Table/field constraint - case 'CONSTRAINT': - if( isset( $this->current_field ) ) { - $this->addFieldOpt( $this->current_field, $this->currentElement, $cdata ); - } else { - $this->addTableOpt( $cdata ); - } - break; - // Table/field option - case 'OPT': - if( isset( $this->current_field ) ) { - $this->addFieldOpt( $this->current_field, $cdata ); - } else { - $this->addTableOpt( $cdata ); - } - break; - default: - - } - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - $this->currentElement = ''; - - switch( strtoupper( $tag ) ) { - case 'TABLE': - $this->parent->addSQL( $this->create( $this->parent ) ); - xml_set_object( $parser, $this->parent ); - $this->destroy(); - break; - case 'FIELD': - unset($this->current_field); - break; - case 'OPT': - case 'CONSTRAINT': - $this->currentPlatform = true; - break; - default: - - } - } - - /** - * Adds an index to a table object - * - * @param array $attributes Index attributes - * @return object dbIndex object - */ - function addIndex( $attributes ) { - $name = strtoupper( $attributes['NAME'] ); - $this->indexes[$name] = new dbIndex( $this, $attributes ); - return $this->indexes[$name]; - } - - /** - * Adds data to a table object - * - * @param array $attributes Data attributes - * @return object dbData object - */ - function addData( $attributes ) { - if( !isset( $this->data ) ) { - $this->data = new dbData( $this, $attributes ); - } - return $this->data; - } - - /** - * Adds a field to a table object - * - * $name is the name of the table to which the field should be added. - * $type is an ADODB datadict field type. The following field types - * are supported as of ADODB 3.40: - * - C: varchar - * - X: CLOB (character large object) or largest varchar size - * if CLOB is not supported - * - C2: Multibyte varchar - * - X2: Multibyte CLOB - * - B: BLOB (binary large object) - * - D: Date (some databases do not support this, and we return a datetime type) - * - T: Datetime or Timestamp - * - L: Integer field suitable for storing booleans (0 or 1) - * - I: Integer (mapped to I4) - * - I1: 1-byte integer - * - I2: 2-byte integer - * - I4: 4-byte integer - * - I8: 8-byte integer - * - F: Floating point number - * - N: Numeric or decimal number - * - * @param string $name Name of the table to which the field will be added. - * @param string $type ADODB datadict field type. - * @param string $size Field size - * @param array $opts Field options array - * @return array Field specifier array - */ - function addField( $name, $type, $size = NULL, $opts = NULL ) { - $field_id = $this->FieldID( $name ); - - // Set the field index so we know where we are - $this->current_field = $field_id; - - // Set the field name (required) - $this->fields[$field_id]['NAME'] = $name; - - // Set the field type (required) - $this->fields[$field_id]['TYPE'] = $type; - - // Set the field size (optional) - if( isset( $size ) ) { - $this->fields[$field_id]['SIZE'] = $size; - } - - // Set the field options - if( isset( $opts ) ) { - $this->fields[$field_id]['OPTS'] = array($opts); - } else { - $this->fields[$field_id]['OPTS'] = array(); - } - } - - /** - * Adds a field option to the current field specifier - * - * This method adds a field option allowed by the ADOdb datadict - * and appends it to the given field. - * - * @param string $field Field name - * @param string $opt ADOdb field option - * @param mixed $value Field option value - * @return array Field specifier array - */ - function addFieldOpt( $field, $opt, $value = NULL ) { - if( $this->currentPlatform ) { - if( !isset( $value ) ) { - $this->fields[$this->FieldID( $field )]['OPTS'][] = $opt; - // Add the option and value - } else { - $this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value ); - } - } - } - - /** - * Adds an option to the table - * - * This method takes a comma-separated list of table-level options - * and appends them to the table object. - * - * @param string $opt Table option - * @return array Options - */ - function addTableOpt( $opt ) { - if(isset($this->currentPlatform)) { - $this->opts[$this->parent->db->databaseType] = $opt; - } - return $this->opts; - } - - - /** - * Generates the SQL that will create the table in the database - * - * @param object $xmls adoSchema object - * @return array Array containing table creation SQL - */ - function create( &$xmls ) { - $sql = array(); - - // drop any existing indexes - if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) { - foreach( $legacy_indexes as $index => $index_details ) { - $sql[] = $xmls->dict->DropIndexSQL( $index, $this->name ); - } - } - - // remove fields to be dropped from table object - foreach( $this->drop_field as $field ) { - unset( $this->fields[$field] ); - } - - // if table exists - if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) { - // drop table - if( $this->drop_table ) { - $sql[] = $xmls->dict->DropTableSQL( $this->name ); - - return $sql; - } - - // drop any existing fields not in schema - foreach( $legacy_fields as $field_id => $field ) { - if( !isset( $this->fields[$field_id] ) ) { - $sql[] = $xmls->dict->DropColumnSQL( $this->name, $field->name ); - } - } - // if table doesn't exist - } else { - if( $this->drop_table ) { - return $sql; - } - - $legacy_fields = array(); - } - - // Loop through the field specifier array, building the associative array for the field options - $fldarray = array(); - - foreach( $this->fields as $field_id => $finfo ) { - // Set an empty size if it isn't supplied - if( !isset( $finfo['SIZE'] ) ) { - $finfo['SIZE'] = ''; - } - - // Initialize the field array with the type and size - $fldarray[$field_id] = array( - 'NAME' => $finfo['NAME'], - 'TYPE' => $finfo['TYPE'], - 'SIZE' => $finfo['SIZE'] - ); - - // Loop through the options array and add the field options. - if( isset( $finfo['OPTS'] ) ) { - foreach( $finfo['OPTS'] as $opt ) { - // Option has an argument. - if( is_array( $opt ) ) { - $key = key( $opt ); - $value = $opt[key( $opt )]; - @$fldarray[$field_id][$key] .= $value; - // Option doesn't have arguments - } else { - $fldarray[$field_id][$opt] = $opt; - } - } - } - } - - if( empty( $legacy_fields ) ) { - // Create the new table - $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); - logMsg( end( $sql ), 'Generated CreateTableSQL' ); - } else { - // Upgrade an existing table - logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" ); - switch( $xmls->upgrade ) { - // Use ChangeTableSQL - case 'ALTER': - logMsg( 'Generated ChangeTableSQL (ALTERing table)' ); - $sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts ); - break; - case 'REPLACE': - logMsg( 'Doing upgrade REPLACE (testing)' ); - $sql[] = $xmls->dict->DropTableSQL( $this->name ); - $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts ); - break; - // ignore table - default: - return array(); - } - } - - foreach( $this->indexes as $index ) { - $sql[] = $index->create( $xmls ); - } - - if( isset( $this->data ) ) { - $sql[] = $this->data->create( $xmls ); - } - - return $sql; - } - - /** - * Marks a field or table for destruction - */ - function drop() { - if( isset( $this->current_field ) ) { - // Drop the current field - logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" ); - // $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field ); - $this->drop_field[$this->current_field] = $this->current_field; - } else { - // Drop the current table - logMsg( "Dropping table '{$this->name}'" ); - // $this->drop_table = $xmls->dict->DropTableSQL( $this->name ); - $this->drop_table = TRUE; - } - } -} - -/** - * Creates an index object in ADOdb's datadict format - * - * This class stores information about a database index. As charactaristics - * of the index are loaded from the external source, methods and properties - * of this class are used to build up the index description in ADOdb's - * datadict format. - * - * @package axmls - * @access private - */ -class dbIndex extends dbObject { - - /** - * @var string Index name - */ - var $name; - - /** - * @var array Index options: Index-level options - */ - var $opts = array(); - - /** - * @var array Indexed fields: Table columns included in this index - */ - var $columns = array(); - - /** - * @var boolean Mark index for destruction - * @access private - */ - var $drop = FALSE; - - /** - * Initializes the new dbIndex object. - * - * @param object $parent Parent object - * @param array $attributes Attributes - * - * @internal - */ - function dbIndex( &$parent, $attributes = NULL ) { - $this->parent = $parent; - - $this->name = $this->prefix ($attributes['NAME']); - } - - /** - * XML Callback to process start elements - * - * Processes XML opening tags. - * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH. - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - $this->currentElement = strtoupper( $tag ); - - switch( $this->currentElement ) { - case 'DROP': - $this->drop(); - break; - case 'CLUSTERED': - case 'BITMAP': - case 'UNIQUE': - case 'FULLTEXT': - case 'HASH': - // Add index Option - $this->addIndexOpt( $this->currentElement ); - break; - default: - // print_r( array( $tag, $attributes ) ); - } - } - - /** - * XML Callback to process CDATA elements - * - * Processes XML cdata. - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - switch( $this->currentElement ) { - // Index field name - case 'COL': - $this->addField( $cdata ); - break; - default: - - } - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - $this->currentElement = ''; - - switch( strtoupper( $tag ) ) { - case 'INDEX': - xml_set_object( $parser, $this->parent ); - break; - } - } - - /** - * Adds a field to the index - * - * @param string $name Field name - * @return string Field list - */ - function addField( $name ) { - $this->columns[$this->FieldID( $name )] = $name; - - // Return the field list - return $this->columns; - } - - /** - * Adds options to the index - * - * @param string $opt Comma-separated list of index options. - * @return string Option list - */ - function addIndexOpt( $opt ) { - $this->opts[] = $opt; - - // Return the options list - return $this->opts; - } - - /** - * Generates the SQL that will create the index in the database - * - * @param object $xmls adoSchema object - * @return array Array containing index creation SQL - */ - function create( &$xmls ) { - if( $this->drop ) { - return NULL; - } - - // eliminate any columns that aren't in the table - foreach( $this->columns as $id => $col ) { - if( !isset( $this->parent->fields[$id] ) ) { - unset( $this->columns[$id] ); - } - } - - return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts ); - } - - /** - * Marks an index for destruction - */ - function drop() { - $this->drop = TRUE; - } -} - -/** - * Creates a data object in ADOdb's datadict format - * - * This class stores information about table data, and is called - * when we need to load field data into a table. - * - * @package axmls - * @access private - */ -class dbData extends dbObject { - - var $data = array(); - - var $row; - - /** - * Initializes the new dbData object. - * - * @param object $parent Parent object - * @param array $attributes Attributes - * - * @internal - */ - function dbData( &$parent, $attributes = NULL ) { - $this->parent = $parent; - } - - /** - * XML Callback to process start elements - * - * Processes XML opening tags. - * Elements currently processed are: ROW and F (field). - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - $this->currentElement = strtoupper( $tag ); - - switch( $this->currentElement ) { - case 'ROW': - $this->row = count( $this->data ); - $this->data[$this->row] = array(); - break; - case 'F': - $this->addField($attributes); - default: - // print_r( array( $tag, $attributes ) ); - } - } - - /** - * XML Callback to process CDATA elements - * - * Processes XML cdata. - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - switch( $this->currentElement ) { - // Index field name - case 'F': - $this->addData( $cdata ); - break; - default: - - } - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - $this->currentElement = ''; - - switch( strtoupper( $tag ) ) { - case 'DATA': - xml_set_object( $parser, $this->parent ); - break; - } - } - - /** - * Adds a field to the insert - * - * @param string $name Field name - * @return string Field list - */ - function addField( $attributes ) { - // check we're in a valid row - if( !isset( $this->row ) || !isset( $this->data[$this->row] ) ) { - return; - } - - // Set the field index so we know where we are - if( isset( $attributes['NAME'] ) ) { - $this->current_field = $this->FieldID( $attributes['NAME'] ); - } else { - $this->current_field = count( $this->data[$this->row] ); - } - - // initialise data - if( !isset( $this->data[$this->row][$this->current_field] ) ) { - $this->data[$this->row][$this->current_field] = ''; - } - } - - /** - * Adds options to the index - * - * @param string $opt Comma-separated list of index options. - * @return string Option list - */ - function addData( $cdata ) { - // check we're in a valid field - if ( isset( $this->data[$this->row][$this->current_field] ) ) { - // add data to field - $this->data[$this->row][$this->current_field] .= $cdata; - } - } - - /** - * Generates the SQL that will add/update the data in the database - * - * @param object $xmls adoSchema object - * @return array Array containing index creation SQL - */ - function create( &$xmls ) { - $table = $xmls->dict->TableName($this->parent->name); - $table_field_count = count($this->parent->fields); - $tables = $xmls->db->MetaTables(); - $sql = array(); - - $ukeys = $xmls->db->MetaPrimaryKeys( $table ); - if( !empty( $this->parent->indexes ) and !empty( $ukeys ) ) { - foreach( $this->parent->indexes as $indexObj ) { - if( !in_array( $indexObj->name, $ukeys ) ) $ukeys[] = $indexObj->name; - } - } - - // eliminate any columns that aren't in the table - foreach( $this->data as $row ) { - $table_fields = $this->parent->fields; - $fields = array(); - $rawfields = array(); // Need to keep some of the unprocessed data on hand. - - foreach( $row as $field_id => $field_data ) { - if( !array_key_exists( $field_id, $table_fields ) ) { - if( is_numeric( $field_id ) ) { - $field_id = reset( array_keys( $table_fields ) ); - } else { - continue; - } - } - - $name = $table_fields[$field_id]['NAME']; - - switch( $table_fields[$field_id]['TYPE'] ) { - case 'I': - case 'I1': - case 'I2': - case 'I4': - case 'I8': - $fields[$name] = intval($field_data); - break; - case 'C': - case 'C2': - case 'X': - case 'X2': - default: - $fields[$name] = $xmls->db->qstr( $field_data ); - $rawfields[$name] = $field_data; - } - - unset($table_fields[$field_id]); - - } - - // check that at least 1 column is specified - if( empty( $fields ) ) { - continue; - } - - // check that no required columns are missing - if( count( $fields ) < $table_field_count ) { - foreach( $table_fields as $field ) { - if( isset( $field['OPTS'] ) and ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) { - continue(2); - } - } - } - - // The rest of this method deals with updating existing data records. - - if( !in_array( $table, $tables ) or ( $mode = $xmls->existingData() ) == XMLS_MODE_INSERT ) { - // Table doesn't yet exist, so it's safe to insert. - logMsg( "$table doesn't exist, inserting or mode is INSERT" ); - $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; - continue; - } - - // Prepare to test for potential violations. Get primary keys and unique indexes - $mfields = array_merge( $fields, $rawfields ); - $keyFields = array_intersect( $ukeys, array_keys( $mfields ) ); - - if( empty( $ukeys ) or count( $keyFields ) == 0 ) { - // No unique keys in schema, so safe to insert - logMsg( "Either schema or data has no unique keys, so safe to insert" ); - $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')'; - continue; - } - - // Select record containing matching unique keys. - $where = ''; - foreach( $ukeys as $key ) { - if( isset( $mfields[$key] ) and $mfields[$key] ) { - if( $where ) $where .= ' AND '; - $where .= $key . ' = ' . $xmls->db->qstr( $mfields[$key] ); - } - } - $records = $xmls->db->Execute( 'SELECT * FROM ' . $table . ' WHERE ' . $where ); - switch( $records->RecordCount() ) { - case 0: - // No matching record, so safe to insert. - logMsg( "No matching records. Inserting new row with unique data" ); - $sql[] = $xmls->db->GetInsertSQL( $records, $mfields ); - break; - case 1: - // Exactly one matching record, so we can update if the mode permits. - logMsg( "One matching record..." ); - if( $mode == XMLS_MODE_UPDATE ) { - logMsg( "...Updating existing row from unique data" ); - $sql[] = $xmls->db->GetUpdateSQL( $records, $mfields ); - } - break; - default: - // More than one matching record; the result is ambiguous, so we must ignore the row. - logMsg( "More than one matching record. Ignoring row." ); - } - } - return $sql; - } -} - -/** - * Creates the SQL to execute a list of provided SQL queries - * - * @package axmls - * @access private - */ -class dbQuerySet extends dbObject { - - /** - * @var array List of SQL queries - */ - var $queries = array(); - - /** - * @var string String used to build of a query line by line - */ - var $query; - - /** - * @var string Query prefix key - */ - var $prefixKey = ''; - - /** - * @var boolean Auto prefix enable (TRUE) - */ - var $prefixMethod = 'AUTO'; - - /** - * Initializes the query set. - * - * @param object $parent Parent object - * @param array $attributes Attributes - */ - function dbQuerySet( &$parent, $attributes = NULL ) { - $this->parent = $parent; - - // Overrides the manual prefix key - if( isset( $attributes['KEY'] ) ) { - $this->prefixKey = $attributes['KEY']; - } - - $prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : ''; - - // Enables or disables automatic prefix prepending - switch( $prefixMethod ) { - case 'AUTO': - $this->prefixMethod = 'AUTO'; - break; - case 'MANUAL': - $this->prefixMethod = 'MANUAL'; - break; - case 'NONE': - $this->prefixMethod = 'NONE'; - break; - } - } - - /** - * XML Callback to process start elements. Elements currently - * processed are: QUERY. - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - $this->currentElement = strtoupper( $tag ); - - switch( $this->currentElement ) { - case 'QUERY': - // Create a new query in a SQL queryset. - // Ignore this query set if a platform is specified and it's different than the - // current connection platform. - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - $this->newQuery(); - } else { - $this->discardQuery(); - } - break; - default: - // print_r( array( $tag, $attributes ) ); - } - } - - /** - * XML Callback to process CDATA elements - */ - function _tag_cdata( &$parser, $cdata ) { - switch( $this->currentElement ) { - // Line of queryset SQL data - case 'QUERY': - $this->buildQuery( $cdata ); - break; - default: - - } - } - - /** - * XML Callback to process end elements - * - * @access private - */ - function _tag_close( &$parser, $tag ) { - $this->currentElement = ''; - - switch( strtoupper( $tag ) ) { - case 'QUERY': - // Add the finished query to the open query set. - $this->addQuery(); - break; - case 'SQL': - $this->parent->addSQL( $this->create( $this->parent ) ); - xml_set_object( $parser, $this->parent ); - $this->destroy(); - break; - default: - - } - } - - /** - * Re-initializes the query. - * - * @return boolean TRUE - */ - function newQuery() { - $this->query = ''; - - return TRUE; - } - - /** - * Discards the existing query. - * - * @return boolean TRUE - */ - function discardQuery() { - unset( $this->query ); - - return TRUE; - } - - /** - * Appends a line to a query that is being built line by line - * - * @param string $data Line of SQL data or NULL to initialize a new query - * @return string SQL query string. - */ - function buildQuery( $sql = NULL ) { - if( !isset( $this->query ) OR empty( $sql ) ) { - return FALSE; - } - - $this->query .= $sql; - - return $this->query; - } - - /** - * Adds a completed query to the query list - * - * @return string SQL of added query - */ - function addQuery() { - if( !isset( $this->query ) ) { - return FALSE; - } - - $this->queries[] = $return = trim($this->query); - - unset( $this->query ); - - return $return; - } - - /** - * Creates and returns the current query set - * - * @param object $xmls adoSchema object - * @return array Query set - */ - function create( &$xmls ) { - foreach( $this->queries as $id => $query ) { - switch( $this->prefixMethod ) { - case 'AUTO': - // Enable auto prefix replacement - - // Process object prefix. - // Evaluate SQL statements to prepend prefix to objects - $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); - $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); - $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix ); - - // SELECT statements aren't working yet - #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data ); - - case 'MANUAL': - // If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX. - // If prefixKey is not set, we use the default constant XMLS_PREFIX - if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) { - // Enable prefix override - $query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query ); - } else { - // Use default replacement - $query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query ); - } - } - - $this->queries[$id] = trim( $query ); - } - - // Return the query set array - return $this->queries; - } - - /** - * Rebuilds the query with the prefix attached to any objects - * - * @param string $regex Regex used to add prefix - * @param string $query SQL query string - * @param string $prefix Prefix to be appended to tables, indices, etc. - * @return string Prefixed SQL query string. - */ - function prefixQuery( $regex, $query, $prefix = NULL ) { - if( !isset( $prefix ) ) { - return $query; - } - - if( preg_match( $regex, $query, $match ) ) { - $preamble = $match[1]; - $postamble = $match[5]; - $objectList = explode( ',', $match[3] ); - // $prefix = $prefix . '_'; - - $prefixedList = ''; - - foreach( $objectList as $object ) { - if( $prefixedList !== '' ) { - $prefixedList .= ', '; - } - - $prefixedList .= $prefix . trim( $object ); - } - - $query = $preamble . ' ' . $prefixedList . ' ' . $postamble; - } - - return $query; - } -} - -/** - * Loads and parses an XML file, creating an array of "ready-to-run" SQL statements - * - * This class is used to load and parse the XML file, to create an array of SQL statements - * that can be used to build a database, and to build the database using the SQL array. - * - * @tutorial getting_started.pkg - * - * @author Richard Tango-Lowy & Dan Cech - * @version $Revision: 1.62 $ - * - * @package axmls - */ -class adoSchema { - - /** - * @var array Array containing SQL queries to generate all objects - * @access private - */ - var $sqlArray; - - /** - * @var object ADOdb connection object - * @access private - */ - var $db; - - /** - * @var object ADOdb Data Dictionary - * @access private - */ - var $dict; - - /** - * @var string Current XML element - * @access private - */ - var $currentElement = ''; - - /** - * @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database - * @access private - */ - var $upgrade = ''; - - /** - * @var string Optional object prefix - * @access private - */ - var $objectPrefix = ''; - - /** - * @var long Original Magic Quotes Runtime value - * @access private - */ - var $mgq; - - /** - * @var long System debug - * @access private - */ - var $debug; - - /** - * @var string Regular expression to find schema version - * @access private - */ - var $versionRegex = '//'; - - /** - * @var string Current schema version - * @access private - */ - var $schemaVersion; - - /** - * @var int Success of last Schema execution - */ - var $success; - - /** - * @var bool Execute SQL inline as it is generated - */ - var $executeInline; - - /** - * @var bool Continue SQL execution if errors occur - */ - var $continueOnError; - - /** - * @var int How to handle existing data rows (insert, update, or ignore) - */ - var $existingData; - - /** - * Creates an adoSchema object - * - * Creating an adoSchema object is the first step in processing an XML schema. - * The only parameter is an ADOdb database connection object, which must already - * have been created. - * - * @param object $db ADOdb database connection object. - */ - function adoSchema( &$db ) { - // Initialize the environment - $this->mgq = get_magic_quotes_runtime(); - @set_magic_quotes_runtime(0); - - $this->db = $db; - $this->debug = $this->db->debug; - $this->dict = NewDataDictionary( $this->db ); - $this->sqlArray = array(); - $this->schemaVersion = XMLS_SCHEMA_VERSION; - $this->executeInline( XMLS_EXECUTE_INLINE ); - $this->continueOnError( XMLS_CONTINUE_ON_ERROR ); - $this->existingData( XMLS_EXISTING_DATA ); - $this->setUpgradeMethod(); - } - - /** - * Sets the method to be used for upgrading an existing database - * - * Use this method to specify how existing database objects should be upgraded. - * The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to - * alter each database object directly, REPLACE attempts to rebuild each object - * from scratch, BEST attempts to determine the best upgrade method for each - * object, and NONE disables upgrading. - * - * This method is not yet used by AXMLS, but exists for backward compatibility. - * The ALTER method is automatically assumed when the adoSchema object is - * instantiated; other upgrade methods are not currently supported. - * - * @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE) - * @returns string Upgrade method used - */ - function SetUpgradeMethod( $method = '' ) { - if( !is_string( $method ) ) { - return FALSE; - } - - $method = strtoupper( $method ); - - // Handle the upgrade methods - switch( $method ) { - case 'ALTER': - $this->upgrade = $method; - break; - case 'REPLACE': - $this->upgrade = $method; - break; - case 'BEST': - $this->upgrade = 'ALTER'; - break; - case 'NONE': - $this->upgrade = 'NONE'; - break; - default: - // Use default if no legitimate method is passed. - $this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD; - } - - return $this->upgrade; - } - - /** - * Specifies how to handle existing data row when there is a unique key conflict. - * - * The existingData setting specifies how the parser should handle existing rows - * when a unique key violation occurs during the insert. This can happen when inserting - * data into an existing table with one or more primary keys or unique indexes. - * The existingData method takes one of three options: XMLS_MODE_INSERT attempts - * to always insert the data as a new row. In the event of a unique key violation, - * the database will generate an error. XMLS_MODE_UPDATE attempts to update the - * any existing rows with the new data based upon primary or unique key fields in - * the schema. If the data row in the schema specifies no unique fields, the row - * data will be inserted as a new row. XMLS_MODE_IGNORE specifies that any data rows - * that would result in a unique key violation be ignored; no inserts or updates will - * take place. For backward compatibility, the default setting is XMLS_MODE_INSERT, - * but XMLS_MODE_UPDATE will generally be the most appropriate setting. - * - * @param int $mode XMLS_MODE_INSERT, XMLS_MODE_UPDATE, or XMLS_MODE_IGNORE - * @return int current mode - */ - function ExistingData( $mode = NULL ) { - if( is_int( $mode ) ) { - switch( $mode ) { - case XMLS_MODE_UPDATE: - $mode = XMLS_MODE_UPDATE; - break; - case XMLS_MODE_IGNORE: - $mode = XMLS_MODE_IGNORE; - break; - case XMLS_MODE_INSERT: - $mode = XMLS_MODE_INSERT; - break; - default: - $mode = XMLS_EXISTING_DATA; - break; - } - $this->existingData = $mode; - } - - return $this->existingData; - } - - /** - * Enables/disables inline SQL execution. - * - * Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution), - * AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode - * is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema() - * to apply the schema to the database. - * - * @param bool $mode execute - * @return bool current execution mode - * - * @see ParseSchema(), ExecuteSchema() - */ - function ExecuteInline( $mode = NULL ) { - if( is_bool( $mode ) ) { - $this->executeInline = $mode; - } - - return $this->executeInline; - } - - /** - * Enables/disables SQL continue on error. - * - * Call this method to enable or disable continuation of SQL execution if an error occurs. - * If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs. - * If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing - * of the schema will continue. - * - * @param bool $mode execute - * @return bool current continueOnError mode - * - * @see addSQL(), ExecuteSchema() - */ - function ContinueOnError( $mode = NULL ) { - if( is_bool( $mode ) ) { - $this->continueOnError = $mode; - } - - return $this->continueOnError; - } - - /** - * Loads an XML schema from a file and converts it to SQL. - * - * Call this method to load the specified schema (see the DTD for the proper format) from - * the filesystem and generate the SQL necessary to create the database - * described. This method automatically converts the schema to the latest - * axmls schema version. - * @see ParseSchemaString() - * - * @param string $file Name of XML schema file. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute - */ - function ParseSchema( $filename, $returnSchema = FALSE ) { - return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); - } - - /** - * Loads an XML schema from a file and converts it to SQL. - * - * Call this method to load the specified schema directly from a file (see - * the DTD for the proper format) and generate the SQL necessary to create - * the database described by the schema. Use this method when you are dealing - * with large schema files. Otherwise, ParseSchema() is faster. - * This method does not automatically convert the schema to the latest axmls - * schema version. You must convert the schema manually using either the - * ConvertSchemaFile() or ConvertSchemaString() method. - * @see ParseSchema() - * @see ConvertSchemaFile() - * @see ConvertSchemaString() - * - * @param string $file Name of XML schema file. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute. - * - * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString() - * @see ParseSchema(), ParseSchemaString() - */ - function ParseSchemaFile( $filename, $returnSchema = FALSE ) { - // Open the file - if( !($fp = fopen( $filename, 'r' )) ) { - logMsg( 'Unable to open file' ); - return FALSE; - } - - // do version detection here - if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) { - logMsg( 'Invalid Schema Version' ); - return FALSE; - } - - if( $returnSchema ) { - $xmlstring = ''; - while( $data = fread( $fp, 4096 ) ) { - $xmlstring .= $data . "\n"; - } - return $xmlstring; - } - - $this->success = 2; - - $xmlParser = $this->create_parser(); - - // Process the file - while( $data = fread( $fp, 4096 ) ) { - if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) { - die( sprintf( - "XML error: %s at line %d", - xml_error_string( xml_get_error_code( $xmlParser) ), - xml_get_current_line_number( $xmlParser) - ) ); - } - } - - xml_parser_free( $xmlParser ); - - return $this->sqlArray; - } - - /** - * Converts an XML schema string to SQL. - * - * Call this method to parse a string containing an XML schema (see the DTD for the proper format) - * and generate the SQL necessary to create the database described by the schema. - * @see ParseSchema() - * - * @param string $xmlstring XML schema string. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute. - */ - function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) { - if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { - logMsg( 'Empty or Invalid Schema' ); - return FALSE; - } - - // do version detection here - if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) { - logMsg( 'Invalid Schema Version' ); - return FALSE; - } - - if( $returnSchema ) { - return $xmlstring; - } - - $this->success = 2; - - $xmlParser = $this->create_parser(); - - if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) { - die( sprintf( - "XML error: %s at line %d", - xml_error_string( xml_get_error_code( $xmlParser) ), - xml_get_current_line_number( $xmlParser) - ) ); - } - - xml_parser_free( $xmlParser ); - - return $this->sqlArray; - } - - /** - * Loads an XML schema from a file and converts it to uninstallation SQL. - * - * Call this method to load the specified schema (see the DTD for the proper format) from - * the filesystem and generate the SQL necessary to remove the database described. - * @see RemoveSchemaString() - * - * @param string $file Name of XML schema file. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute - */ - function RemoveSchema( $filename, $returnSchema = FALSE ) { - return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema ); - } - - /** - * Converts an XML schema string to uninstallation SQL. - * - * Call this method to parse a string containing an XML schema (see the DTD for the proper format) - * and generate the SQL necessary to uninstall the database described by the schema. - * @see RemoveSchema() - * - * @param string $schema XML schema string. - * @param bool $returnSchema Return schema rather than parsing. - * @return array Array of SQL queries, ready to execute. - */ - function RemoveSchemaString( $schema, $returnSchema = FALSE ) { - - // grab current version - if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { - return FALSE; - } - - return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema ); - } - - /** - * Applies the current XML schema to the database (post execution). - * - * Call this method to apply the current schema (generally created by calling - * ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes, - * and executing other SQL specified in the schema) after parsing. - * @see ParseSchema(), ParseSchemaString(), ExecuteInline() - * - * @param array $sqlArray Array of SQL statements that will be applied rather than - * the current schema. - * @param boolean $continueOnErr Continue to apply the schema even if an error occurs. - * @returns integer 0 if failure, 1 if errors, 2 if successful. - */ - function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) { - if( !is_bool( $continueOnErr ) ) { - $continueOnErr = $this->ContinueOnError(); - } - - if( !isset( $sqlArray ) ) { - $sqlArray = $this->sqlArray; - } - - if( !is_array( $sqlArray ) ) { - $this->success = 0; - } else { - $this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr ); - } - - return $this->success; - } - - /** - * Returns the current SQL array. - * - * Call this method to fetch the array of SQL queries resulting from - * ParseSchema() or ParseSchemaString(). - * - * @param string $format Format: HTML, TEXT, or NONE (PHP array) - * @return array Array of SQL statements or FALSE if an error occurs - */ - function PrintSQL( $format = 'NONE' ) { - $sqlArray = null; - return $this->getSQL( $format, $sqlArray ); - } - - /** - * Saves the current SQL array to the local filesystem as a list of SQL queries. - * - * Call this method to save the array of SQL queries (generally resulting from a - * parsed XML schema) to the filesystem. - * - * @param string $filename Path and name where the file should be saved. - * @return boolean TRUE if save is successful, else FALSE. - */ - function SaveSQL( $filename = './schema.sql' ) { - - if( !isset( $sqlArray ) ) { - $sqlArray = $this->sqlArray; - } - if( !isset( $sqlArray ) ) { - return FALSE; - } - - $fp = fopen( $filename, "w" ); - - foreach( $sqlArray as $key => $query ) { - fwrite( $fp, $query . ";\n" ); - } - fclose( $fp ); - } - - /** - * Create an xml parser - * - * @return object PHP XML parser object - * - * @access private - */ - function create_parser() { - // Create the parser - $xmlParser = xml_parser_create(); - xml_set_object( $xmlParser, $this ); - - // Initialize the XML callback functions - xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' ); - xml_set_character_data_handler( $xmlParser, '_tag_cdata' ); - - return $xmlParser; - } - - /** - * XML Callback to process start elements - * - * @access private - */ - function _tag_open( &$parser, $tag, $attributes ) { - switch( strtoupper( $tag ) ) { - case 'TABLE': - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - $this->obj = new dbTable( $this, $attributes ); - xml_set_object( $parser, $this->obj ); - } - break; - case 'SQL': - if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) { - $this->obj = new dbQuerySet( $this, $attributes ); - xml_set_object( $parser, $this->obj ); - } - break; - default: - // print_r( array( $tag, $attributes ) ); - } - - } - - /** - * XML Callback to process CDATA elements - * - * @access private - */ - function _tag_cdata( &$parser, $cdata ) { - } - - /** - * XML Callback to process end elements - * - * @access private - * @internal - */ - function _tag_close( &$parser, $tag ) { - - } - - /** - * Converts an XML schema string to the specified DTD version. - * - * Call this method to convert a string containing an XML schema to a different AXMLS - * DTD version. For instance, to convert a schema created for an pre-1.0 version for - * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version - * parameter is specified, the schema will be converted to the current DTD version. - * If the newFile parameter is provided, the converted schema will be written to the specified - * file. - * @see ConvertSchemaFile() - * - * @param string $schema String containing XML schema that will be converted. - * @param string $newVersion DTD version to convert to. - * @param string $newFile File name of (converted) output file. - * @return string Converted XML schema or FALSE if an error occurs. - */ - function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) { - - // grab current version - if( !( $version = $this->SchemaStringVersion( $schema ) ) ) { - return FALSE; - } - - if( !isset ($newVersion) ) { - $newVersion = $this->schemaVersion; - } - - if( $version == $newVersion ) { - $result = $schema; - } else { - $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion); - } - - if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { - fwrite( $fp, $result ); - fclose( $fp ); - } - - return $result; - } - - /* - // compat for pre-4.3 - jlim - function _file_get_contents($path) - { - if (function_exists('file_get_contents')) return file_get_contents($path); - return join('',file($path)); - }*/ - - /** - * Converts an XML schema file to the specified DTD version. - * - * Call this method to convert the specified XML schema file to a different AXMLS - * DTD version. For instance, to convert a schema created for an pre-1.0 version for - * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version - * parameter is specified, the schema will be converted to the current DTD version. - * If the newFile parameter is provided, the converted schema will be written to the specified - * file. - * @see ConvertSchemaString() - * - * @param string $filename Name of XML schema file that will be converted. - * @param string $newVersion DTD version to convert to. - * @param string $newFile File name of (converted) output file. - * @return string Converted XML schema or FALSE if an error occurs. - */ - function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) { - - // grab current version - if( !( $version = $this->SchemaFileVersion( $filename ) ) ) { - return FALSE; - } - - if( !isset ($newVersion) ) { - $newVersion = $this->schemaVersion; - } - - if( $version == $newVersion ) { - $result = _file_get_contents( $filename ); - - // remove unicode BOM if present - if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) { - $result = substr( $result, 3 ); - } - } else { - $result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' ); - } - - if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) { - fwrite( $fp, $result ); - fclose( $fp ); - } - - return $result; - } - - function TransformSchema( $schema, $xsl, $schematype='string' ) - { - // Fail if XSLT extension is not available - if( ! function_exists( 'xslt_create' ) ) { - return FALSE; - } - - $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl'; - - // look for xsl - if( !is_readable( $xsl_file ) ) { - return FALSE; - } - - switch( $schematype ) - { - case 'file': - if( !is_readable( $schema ) ) { - return FALSE; - } - - $schema = _file_get_contents( $schema ); - break; - case 'string': - default: - if( !is_string( $schema ) ) { - return FALSE; - } - } - - $arguments = array ( - '/_xml' => $schema, - '/_xsl' => _file_get_contents( $xsl_file ) - ); - - // create an XSLT processor - $xh = xslt_create (); - - // set error handler - xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler')); - - // process the schema - $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); - - xslt_free ($xh); - - return $result; - } - - /** - * Processes XSLT transformation errors - * - * @param object $parser XML parser object - * @param integer $errno Error number - * @param integer $level Error level - * @param array $fields Error information fields - * - * @access private - */ - function xslt_error_handler( $parser, $errno, $level, $fields ) { - if( is_array( $fields ) ) { - $msg = array( - 'Message Type' => ucfirst( $fields['msgtype'] ), - 'Message Code' => $fields['code'], - 'Message' => $fields['msg'], - 'Error Number' => $errno, - 'Level' => $level - ); - - switch( $fields['URI'] ) { - case 'arg:/_xml': - $msg['Input'] = 'XML'; - break; - case 'arg:/_xsl': - $msg['Input'] = 'XSL'; - break; - default: - $msg['Input'] = $fields['URI']; - } - - $msg['Line'] = $fields['line']; - } else { - $msg = array( - 'Message Type' => 'Error', - 'Error Number' => $errno, - 'Level' => $level, - 'Fields' => var_export( $fields, TRUE ) - ); - } - - $error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n" - . '' . "\n"; - - foreach( $msg as $label => $details ) { - $error_details .= '' . "\n"; - } - - $error_details .= '
        ' . $label . ': ' . htmlentities( $details ) . '
        '; - - trigger_error( $error_details, E_USER_ERROR ); - } - - /** - * Returns the AXMLS Schema Version of the requested XML schema file. - * - * Call this method to obtain the AXMLS DTD version of the requested XML schema file. - * @see SchemaStringVersion() - * - * @param string $filename AXMLS schema file - * @return string Schema version number or FALSE on error - */ - function SchemaFileVersion( $filename ) { - // Open the file - if( !($fp = fopen( $filename, 'r' )) ) { - // die( 'Unable to open file' ); - return FALSE; - } - - // Process the file - while( $data = fread( $fp, 4096 ) ) { - if( preg_match( $this->versionRegex, $data, $matches ) ) { - return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; - } - } - - return FALSE; - } - - /** - * Returns the AXMLS Schema Version of the provided XML schema string. - * - * Call this method to obtain the AXMLS DTD version of the provided XML schema string. - * @see SchemaFileVersion() - * - * @param string $xmlstring XML schema string - * @return string Schema version number or FALSE on error - */ - function SchemaStringVersion( $xmlstring ) { - if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { - return FALSE; - } - - if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) { - return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION; - } - - return FALSE; - } - - /** - * Extracts an XML schema from an existing database. - * - * Call this method to create an XML schema string from an existing database. - * If the data parameter is set to TRUE, AXMLS will include the data from the database - * in the schema. - * - * @param boolean $data Include data in schema dump - * @indent string indentation to use - * @prefix string extract only tables with given prefix - * @stripprefix strip prefix string when storing in XML schema - * @return string Generated XML schema - */ - function ExtractSchema( $data = FALSE, $indent = ' ', $prefix = '' , $stripprefix=false) { - $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM ); - - $schema = '' . "\n" - . '' . "\n"; - - if( is_array( $tables = $this->db->MetaTables( 'TABLES' , ($prefix) ? $prefix.'%' : '') ) ) { - foreach( $tables as $table ) { - if ($stripprefix) $table = str_replace(str_replace('\\_', '_', $pfx ), '', $table); - $schema .= $indent . '' . "\n"; - - // grab details from database - $rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE -1' ); - $fields = $this->db->MetaColumns( $table ); - $indexes = $this->db->MetaIndexes( $table ); - - if( is_array( $fields ) ) { - foreach( $fields as $details ) { - $extra = ''; - $content = array(); - - if( isset($details->max_length) && $details->max_length > 0 ) { - $extra .= ' size="' . $details->max_length . '"'; - } - - if( isset($details->primary_key) && $details->primary_key ) { - $content[] = ''; - } elseif( isset($details->not_null) && $details->not_null ) { - $content[] = ''; - } - - if( isset($details->has_default) && $details->has_default ) { - $content[] = ''; - } - - if( isset($details->auto_increment) && $details->auto_increment ) { - $content[] = ''; - } - - if( isset($details->unsigned) && $details->unsigned ) { - $content[] = ''; - } - - // this stops the creation of 'R' columns, - // AUTOINCREMENT is used to create auto columns - $details->primary_key = 0; - $type = $rs->MetaType( $details ); - - $schema .= str_repeat( $indent, 2 ) . '' . "\n"; - } else { - $schema .= "/>\n"; - } - } - } - - if( is_array( $indexes ) ) { - foreach( $indexes as $index => $details ) { - $schema .= str_repeat( $indent, 2 ) . '' . "\n"; - - if( $details['unique'] ) { - $schema .= str_repeat( $indent, 3 ) . '' . "\n"; - } - - foreach( $details['columns'] as $column ) { - $schema .= str_repeat( $indent, 3 ) . '' . htmlentities( $column ) . '' . "\n"; - } - - $schema .= str_repeat( $indent, 2 ) . '' . "\n"; - } - } - - if( $data ) { - $rs = $this->db->Execute( 'SELECT * FROM ' . $table ); - - if( is_object( $rs ) && !$rs->EOF ) { - $schema .= str_repeat( $indent, 2 ) . "\n"; - - while( $row = $rs->FetchRow() ) { - foreach( $row as $key => $val ) { - if ( $val != htmlentities( $val ) ) { - $row[$key] = ''; - } - } - - $schema .= str_repeat( $indent, 3 ) . '' . implode( '', $row ) . "\n"; - } - - $schema .= str_repeat( $indent, 2 ) . "\n"; - } - } - - $schema .= $indent . "
        \n"; - } - } - - $this->db->SetFetchMode( $old_mode ); - - $schema .= '
        '; - return $schema; - } - - /** - * Sets a prefix for database objects - * - * Call this method to set a standard prefix that will be prepended to all database tables - * and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix. - * - * @param string $prefix Prefix that will be prepended. - * @param boolean $underscore If TRUE, automatically append an underscore character to the prefix. - * @return boolean TRUE if successful, else FALSE - */ - function SetPrefix( $prefix = '', $underscore = TRUE ) { - switch( TRUE ) { - // clear prefix - case empty( $prefix ): - logMsg( 'Cleared prefix' ); - $this->objectPrefix = ''; - return TRUE; - // prefix too long - case strlen( $prefix ) > XMLS_PREFIX_MAXLEN: - // prefix contains invalid characters - case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ): - logMsg( 'Invalid prefix: ' . $prefix ); - return FALSE; - } - - if( $underscore AND substr( $prefix, -1 ) != '_' ) { - $prefix .= '_'; - } - - // prefix valid - logMsg( 'Set prefix: ' . $prefix ); - $this->objectPrefix = $prefix; - return TRUE; - } - - /** - * Returns an object name with the current prefix prepended. - * - * @param string $name Name - * @return string Prefixed name - * - * @access private - */ - function prefix( $name = '' ) { - // if prefix is set - if( !empty( $this->objectPrefix ) ) { - // Prepend the object prefix to the table name - // prepend after quote if used - return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name ); - } - - // No prefix set. Use name provided. - return $name; - } - - /** - * Checks if element references a specific platform - * - * @param string $platform Requested platform - * @returns boolean TRUE if platform check succeeds - * - * @access private - */ - function supportedPlatform( $platform = NULL ) { - if( !empty( $platform ) ) { - $regex = '/(^|\|)' . $this->db->databaseType . '(\||$)/i'; - - if( preg_match( '/^- /', $platform ) ) { - if (preg_match ( $regex, substr( $platform, 2 ) ) ) { - logMsg( 'Platform ' . $platform . ' is NOT supported' ); - return FALSE; - } - } else { - if( !preg_match ( $regex, $platform ) ) { - logMsg( 'Platform ' . $platform . ' is NOT supported' ); - return FALSE; - } - } - } - - logMsg( 'Platform ' . $platform . ' is supported' ); - return TRUE; - } - - /** - * Clears the array of generated SQL. - * - * @access private - */ - function clearSQL() { - $this->sqlArray = array(); - } - - /** - * Adds SQL into the SQL array. - * - * @param mixed $sql SQL to Add - * @return boolean TRUE if successful, else FALSE. - * - * @access private - */ - function addSQL( $sql = NULL ) { - if( is_array( $sql ) ) { - foreach( $sql as $line ) { - $this->addSQL( $line ); - } - - return TRUE; - } - - if( is_string( $sql ) ) { - $this->sqlArray[] = $sql; - - // if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL. - if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) { - $saved = $this->db->debug; - $this->db->debug = $this->debug; - $ok = $this->db->Execute( $sql ); - $this->db->debug = $saved; - - if( !$ok ) { - if( $this->debug ) { - ADOConnection::outp( $this->db->ErrorMsg() ); - } - - $this->success = 1; - } - } - - return TRUE; - } - - return FALSE; - } - - /** - * Gets the SQL array in the specified format. - * - * @param string $format Format - * @return mixed SQL - * - * @access private - */ - function getSQL( $format = NULL, $sqlArray = NULL ) { - if( !is_array( $sqlArray ) ) { - $sqlArray = $this->sqlArray; - } - - if( !is_array( $sqlArray ) ) { - return FALSE; - } - - switch( strtolower( $format ) ) { - case 'string': - case 'text': - return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : ''; - case'html': - return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : ''; - } - - return $this->sqlArray; - } - - /** - * Destroys an adoSchema object. - * - * Call this method to clean up after an adoSchema object that is no longer in use. - * @deprecated adoSchema now cleans up automatically. - */ - function Destroy() { - @set_magic_quotes_runtime( $this->mgq ); - unset( $this ); - } -} - -/** - * Message logging function - * - * @access private - */ -function logMsg( $msg, $title = NULL, $force = FALSE ) { - if( XMLS_DEBUG or $force ) { - echo '
        ';
        -
        -        if( isset( $title ) ) {
        -            echo '

        ' . htmlentities( $title ) . '

        '; - } - - if( @is_object( $this ) ) { - echo '[' . get_class( $this ) . '] '; - } - - print_r( $msg ); - - echo '
        '; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/adodb.inc.php b/include/limesurvey/classes/adodb/adodb.inc.php deleted file mode 100644 index a600d0d3..00000000 --- a/include/limesurvey/classes/adodb/adodb.inc.php +++ /dev/null @@ -1,4399 +0,0 @@ -fields is available on EOF - $ADODB_FETCH_MODE, // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default... - $ADODB_GETONE_EOF, - $ADODB_QUOTE_FIELDNAMES; // Allows you to force quotes (backticks) around field names in queries generated by getinsertsql and getupdatesql. - - //============================================================================================== - // GLOBAL SETUP - //============================================================================================== - - $ADODB_EXTENSION = defined('ADODB_EXTENSION'); - - //********************************************************// - /* - Controls $ADODB_FORCE_TYPE mode. Default is ADODB_FORCE_VALUE (3). - Used in GetUpdateSql and GetInsertSql functions. Thx to Niko, nuko#mbnet.fi - - 0 = ignore empty fields. All empty fields in array are ignored. - 1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values. - 2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values. - 3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and empty fields '' are set to empty '' sql values. - */ - define('ADODB_FORCE_IGNORE',0); - define('ADODB_FORCE_NULL',1); - define('ADODB_FORCE_EMPTY',2); - define('ADODB_FORCE_VALUE',3); - //********************************************************// - - - if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) { - - define('ADODB_BAD_RS','

        Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;

        '); - - // allow [ ] @ ` " and . in table names - define('ADODB_TABLE_REGEX','([]0-9a-z_\:\"\`\.\@\[-]*)'); - - // prefetching used by oracle - if (!defined('ADODB_PREFETCH_ROWS')) define('ADODB_PREFETCH_ROWS',10); - - - /* - Controls ADODB_FETCH_ASSOC field-name case. Default is 2, use native case-names. - This currently works only with mssql, odbc, oci8po and ibase derived drivers. - - 0 = assoc lowercase field names. $rs->fields['orderid'] - 1 = assoc uppercase field names. $rs->fields['ORDERID'] - 2 = use native-case field names. $rs->fields['OrderID'] - */ - - define('ADODB_FETCH_DEFAULT',0); - define('ADODB_FETCH_NUM',1); - define('ADODB_FETCH_ASSOC',2); - define('ADODB_FETCH_BOTH',3); - - if (!defined('TIMESTAMP_FIRST_YEAR')) define('TIMESTAMP_FIRST_YEAR',100); - - // PHP's version scheme makes converting to numbers difficult - workaround - $_adodb_ver = (float) PHP_VERSION; - if ($_adodb_ver >= 5.2) { - define('ADODB_PHPVER',0x5200); - } else if ($_adodb_ver >= 5.0) { - define('ADODB_PHPVER',0x5000); - } else - die("PHP5 or later required. You are running ".PHP_VERSION); - } - - - //if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); - - - /** - Accepts $src and $dest arrays, replacing string $data - */ - function ADODB_str_replace($src, $dest, $data) - { - if (ADODB_PHPVER >= 0x4050) return str_replace($src,$dest,$data); - - $s = reset($src); - $d = reset($dest); - while ($s !== false) { - $data = str_replace($s,$d,$data); - $s = next($src); - $d = next($dest); - } - return $data; - } - - function ADODB_Setup() - { - GLOBAL - $ADODB_vers, // database version - $ADODB_COUNTRECS, // count number of records returned - slows down query - $ADODB_CACHE_DIR, // directory to cache recordsets - $ADODB_FETCH_MODE, - $ADODB_CACHE, - $ADODB_CACHE_CLASS, - $ADODB_FORCE_TYPE, - $ADODB_GETONE_EOF, - $ADODB_QUOTE_FIELDNAMES; - - if (empty($ADODB_CACHE_CLASS)) $ADODB_CACHE_CLASS = 'ADODB_Cache_File' ; - $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT; - $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE; - $ADODB_GETONE_EOF = null; - - if (!isset($ADODB_CACHE_DIR)) { - $ADODB_CACHE_DIR = '/tmp'; //(isset($_ENV['TMP'])) ? $_ENV['TMP'] : '/tmp'; - } else { - // do not accept url based paths, eg. http:/ or ftp:/ - if (strpos($ADODB_CACHE_DIR,'://') !== false) - die("Illegal path http:// or ftp://"); - } - - - // Initialize random number generator for randomizing cache flushes - // -- note Since PHP 4.2.0, the seed becomes optional and defaults to a random value if omitted. - srand(((double)microtime())*1000000); - - /** - * ADODB version as a string. - */ - $ADODB_vers = 'V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved. Released BSD & LGPL.'; - - /** - * Determines whether recordset->RecordCount() is used. - * Set to false for highest performance -- RecordCount() will always return -1 then - * for databases that provide "virtual" recordcounts... - */ - if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS = true; - } - - - //============================================================================================== - // CHANGE NOTHING BELOW UNLESS YOU ARE DESIGNING ADODB - //============================================================================================== - - ADODB_Setup(); - - //============================================================================================== - // CLASS ADOFieldObject - //============================================================================================== - /** - * Helper class for FetchFields -- holds info on a column - */ - class ADOFieldObject { - var $name = ''; - var $max_length=0; - var $type=""; - /* - // additional fields by dannym... (danny_milo@yahoo.com) - var $not_null = false; - // actually, this has already been built-in in the postgres, fbsql AND mysql module? ^-^ - // so we can as well make not_null standard (leaving it at "false" does not harm anyways) - - var $has_default = false; // this one I have done only in mysql and postgres for now ... - // others to come (dannym) - var $default_value; // default, if any, and supported. Check has_default first. - */ - } - - // for transaction handling - - function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection) - { - //print "Errorno ($fn errno=$errno m=$errmsg) "; - $thisConnection->_transOK = false; - if ($thisConnection->_oldRaiseFn) { - $fn = $thisConnection->_oldRaiseFn; - $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection); - } - } - - //------------------ - // class for caching - class ADODB_Cache_File { - - var $createdir = true; // requires creation of temp dirs - - function ADODB_Cache_File() - { - global $ADODB_INCLUDED_CSV; - if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php'); - } - - // write serialised recordset to cache item/file - function writecache($filename, $contents, $debug, $secs2cache) - { - return adodb_write_file($filename, $contents,$debug); - } - - // load serialised recordset and unserialise it - function &readcache($filename, &$err, $secs2cache, $rsClass) - { - $rs = csv2rs($filename,$err,$secs2cache,$rsClass); - return $rs; - } - - // flush all items in cache - function flushall($debug=false) - { - global $ADODB_CACHE_DIR; - - $rez = false; - - if (strlen($ADODB_CACHE_DIR) > 1) { - $rez = $this->_dirFlush($ADODB_CACHE_DIR); - if ($debug) ADOConnection::outp( "flushall: $dir
        \n". $rez."
        "); - } - return $rez; - } - - // flush one file in cache - function flushcache($f, $debug=false) - { - if (!@unlink($f)) { - if ($debug) ADOConnection::outp( "flushcache: failed for $f"); - } - } - - function getdirname($hash) - { - global $ADODB_CACHE_DIR; - if (!isset($this->notSafeMode)) $this->notSafeMode = !@ini_get('safe_mode'); - return ($this->notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($hash,0,2) : $ADODB_CACHE_DIR; - } - - // create temp directories - function createdir($hash, $debug) - { - $dir = $this->getdirname($hash); - if ($this->notSafeMode && !file_exists($dir)) { - $oldu = umask(0); - if (!@mkdir($dir,0771)) if(!is_dir($dir) && $debug) ADOConnection::outp("Cannot create $dir"); - umask($oldu); - } - - return $dir; - } - - /** - * Private function to erase all of the files and subdirectories in a directory. - * - * Just specify the directory, and tell it if you want to delete the directory or just clear it out. - * Note: $kill_top_level is used internally in the function to flush subdirectories. - */ - function _dirFlush($dir, $kill_top_level = false) - { - if(!$dh = @opendir($dir)) return; - - while (($obj = readdir($dh))) { - if($obj=='.' || $obj=='..') continue; - $f = $dir.'/'.$obj; - - if (strpos($obj,'.cache')) @unlink($f); - if (is_dir($f)) $this->_dirFlush($f, true); - } - if ($kill_top_level === true) @rmdir($dir); - return true; - } - } - - //============================================================================================== - // CLASS ADOConnection - //============================================================================================== - - /** - * Connection object. For connecting to databases, and executing queries. - */ - class ADOConnection { - // - // PUBLIC VARS - // - var $dataProvider = 'native'; - var $databaseType = ''; /// RDBMS currently in use, eg. odbc, mysql, mssql - var $database = ''; /// Name of database to be used. - var $host = ''; /// The hostname of the database server - var $user = ''; /// The username which is used to connect to the database server. - var $password = ''; /// Password for the username. For security, we no longer store it. - var $debug = false; /// if set to true will output sql statements - var $maxblobsize = 262144; /// maximum size of blobs or large text fields (262144 = 256K)-- some db's die otherwise like foxpro - var $concat_operator = '+'; /// default concat operator -- change to || for Oracle/Interbase - var $substr = 'substr'; /// substring operator - var $length = 'length'; /// string length ofperator - var $random = 'rand()'; /// random function - var $upperCase = 'upper'; /// uppercase function - var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database - var $fmtTimeStamp = "'Y-m-d, h:i:s A'"; /// used by DBTimeStamp as the default timestamp fmt. - var $true = '1'; /// string that represents TRUE for a database - var $false = '0'; /// string that represents FALSE for a database - var $replaceQuote = "\\'"; /// string to use to replace quotes - var $nameQuote = '"'; /// string to use to quote identifiers and names - var $charSet=false; /// character set to use - only for interbase, postgres and oci8 - var $metaDatabasesSQL = ''; - var $metaTablesSQL = ''; - var $uniqueOrderBy = false; /// All order by columns have to be unique - var $emptyDate = ' '; - var $emptyTimeStamp = ' '; - var $lastInsID = false; - //-- - var $hasInsertID = false; /// supports autoincrement ID? - var $hasAffectedRows = false; /// supports affected rows for update/delete? - var $hasTop = false; /// support mssql/access SELECT TOP 10 * FROM TABLE - var $hasLimit = false; /// support pgsql/mysql SELECT * FROM TABLE LIMIT 10 - var $readOnly = false; /// this is a readonly database - used by phpLens - var $hasMoveFirst = false; /// has ability to run MoveFirst(), scrolling backwards - var $hasGenID = false; /// can generate sequences using GenID(); - var $hasTransactions = true; /// has transactions - //-- - var $genID = 0; /// sequence id used by GenID(); - var $raiseErrorFn = false; /// error function to call - var $isoDates = false; /// accepts dates in ISO format - var $cacheSecs = 3600; /// cache for 1 hour - - // memcache - var $memCache = false; /// should we use memCache instead of caching in files - var $memCacheHost; /// memCache host - var $memCachePort = 11211; /// memCache port - var $memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib) - - var $sysDate = false; /// name of function that returns the current date - var $sysTimeStamp = false; /// name of function that returns the current timestamp - var $sysUTimeStamp = false; // name of function that returns the current timestamp accurate to the microsecond or nearest fraction - var $arrayClass = 'ADORecordSet_array'; /// name of class used to generate array recordsets, which are pre-downloaded recordsets - - var $noNullStrings = false; /// oracle specific stuff - if true ensures that '' is converted to ' ' - var $numCacheHits = 0; - var $numCacheMisses = 0; - var $pageExecuteCountRows = true; - var $uniqueSort = false; /// indicates that all fields in order by must be unique - var $leftOuter = false; /// operator to use for left outer join in WHERE clause - var $rightOuter = false; /// operator to use for right outer join in WHERE clause - var $ansiOuter = false; /// whether ansi outer join syntax supported - var $autoRollback = false; // autoRollback on PConnect(). - var $poorAffectedRows = false; // affectedRows not working or unreliable - - var $fnExecute = false; - var $fnCacheExecute = false; - var $blobEncodeType = false; // false=not required, 'I'=encode to integer, 'C'=encode to char - var $rsPrefix = "ADORecordSet_"; - - var $autoCommit = true; /// do not modify this yourself - actually private - var $transOff = 0; /// temporarily disable transactions - var $transCnt = 0; /// count of nested transactions - - var $fetchMode=false; - - var $null2null = 'null'; // in autoexecute/getinsertsql/getupdatesql, this value will be converted to a null - // - // PRIVATE VARS - // - var $_oldRaiseFn = false; - var $_transOK = null; - var $_connectionID = false; /// The returned link identifier whenever a successful database connection is made. - var $_errorMsg = false; /// A variable which was used to keep the returned last error message. The value will - /// then returned by the errorMsg() function - var $_errorCode = false; /// Last error code, not guaranteed to be used - only by oci8 - var $_queryID = false; /// This variable keeps the last created result link identifier - - var $_isPersistentConnection = false; /// A boolean variable to state whether its a persistent connection or normal connection. */ - var $_bindInputArray = false; /// set to true if ADOConnection.Execute() permits binding of array parameters. - var $_evalAll = false; - var $_affected = false; - var $_logsql = false; - var $_transmode = ''; // transaction mode - - - - /** - * Constructor - */ - function ADOConnection() - { - die('Virtual Class -- cannot instantiate'); - } - - static function Version() - { - global $ADODB_vers; - - return (float) substr($ADODB_vers,1); - } - - /** - Get server version info... - - @returns An array with 2 elements: $arr['string'] is the description string, - and $arr[version] is the version (also a string). - */ - function ServerInfo() - { - return array('description' => '', 'version' => ''); - } - - function IsConnected() - { - return !empty($this->_connectionID); - } - - function _findvers($str) - { - if (preg_match('/([0-9]+\.([0-9\.])+)/',$str, $arr)) return $arr[1]; - else return ''; - } - - /** - * All error messages go through this bottleneck function. - * You can define your own handler by defining the function name in ADODB_OUTP. - */ - static function outp($msg,$newline=true) - { - global $ADODB_FLUSH,$ADODB_OUTP; - - if (defined('ADODB_OUTP')) { - $fn = ADODB_OUTP; - $fn($msg,$newline); - return; - } else if (isset($ADODB_OUTP)) { - $fn = $ADODB_OUTP; - $fn($msg,$newline); - return; - } - - if ($newline) $msg .= "
        \n"; - - if (isset($_SERVER['HTTP_USER_AGENT']) || !$newline) echo $msg; - else echo strip_tags($msg); - - - if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // do not flush if output buffering enabled - useless - thx to Jesse Mullan - - } - - function Time() - { - $rs = $this->_Execute("select $this->sysTimeStamp"); - if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); - - return false; - } - - /** - * Connect to database - * - * @param [argHostname] Host to connect to - * @param [argUsername] Userid to login - * @param [argPassword] Associated password - * @param [argDatabaseName] database - * @param [forceNew] force new connection - * - * @return true or false - */ - function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false) - { - if ($argHostname != "") $this->host = $argHostname; - if ($argUsername != "") $this->user = $argUsername; - if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons - if ($argDatabaseName != "") $this->database = $argDatabaseName; - - $this->_isPersistentConnection = false; - - if ($forceNew) { - if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true; - } else { - if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true; - } - if (isset($rez)) { - $err = $this->ErrorMsg(); - if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'"; - $ret = false; - } else { - $err = "Missing extension for ".$this->dataProvider; - $ret = 0; - } - if ($fn = $this->raiseErrorFn) - $fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this); - - - $this->_connectionID = false; - if ($this->debug) ADOConnection::outp( $this->host.': '.$err); - return $ret; - } - - function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName); - } - - - /** - * Always force a new connection to database - currently only works with oracle - * - * @param [argHostname] Host to connect to - * @param [argUsername] Userid to login - * @param [argPassword] Associated password - * @param [argDatabaseName] database - * - * @return true or false - */ - function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") - { - return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true); - } - - /** - * Establish persistent connect to database - * - * @param [argHostname] Host to connect to - * @param [argUsername] Userid to login - * @param [argPassword] Associated password - * @param [argDatabaseName] database - * - * @return return true or false - */ - function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") - { - - if (defined('ADODB_NEVER_PERSIST')) - return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName); - - if ($argHostname != "") $this->host = $argHostname; - if ($argUsername != "") $this->user = $argUsername; - if ($argPassword != "") $this->password = $argPassword; - if ($argDatabaseName != "") $this->database = $argDatabaseName; - - $this->_isPersistentConnection = true; - - if ($rez = $this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true; - if (isset($rez)) { - $err = $this->ErrorMsg(); - if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'"; - $ret = false; - } else { - $err = "Missing extension for ".$this->dataProvider; - $ret = 0; - } - if ($fn = $this->raiseErrorFn) { - $fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this); - } - - $this->_connectionID = false; - if ($this->debug) ADOConnection::outp( $this->host.': '.$err); - return $ret; - } - - function outp_throw($msg,$src='WARN',$sql='') - { - if (defined('ADODB_ERROR_HANDLER') && ADODB_ERROR_HANDLER == 'adodb_throw') { - adodb_throw($this->databaseType,$src,-9999,$msg,$sql,false,$this); - return; - } - ADOConnection::outp($msg); - } - - // create cache class. Code is backward compat with old memcache implementation - function _CreateCache() - { - global $ADODB_CACHE, $ADODB_CACHE_CLASS; - - if ($this->memCache) { - global $ADODB_INCLUDED_MEMCACHE; - - if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); - $ADODB_CACHE = new ADODB_Cache_MemCache($this); - } else - $ADODB_CACHE = new $ADODB_CACHE_CLASS($this); - - } - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysDate; - return $col; // child class implement - } - - /** - * Should prepare the sql statement and return the stmt resource. - * For databases that do not support this, we return the $sql. To ensure - * compatibility with databases that do not support prepare: - * - * $stmt = $db->Prepare("insert into table (id, name) values (?,?)"); - * $db->Execute($stmt,array(1,'Jill')) or die('insert failed'); - * $db->Execute($stmt,array(2,'Joe')) or die('insert failed'); - * - * @param sql SQL to send to database - * - * @return return FALSE, or the prepared statement, or the original sql if - * if the database does not support prepare. - * - */ - function Prepare($sql) - { - return $sql; - } - - /** - * Some databases, eg. mssql require a different function for preparing - * stored procedures. So we cannot use Prepare(). - * - * Should prepare the stored procedure and return the stmt resource. - * For databases that do not support this, we return the $sql. To ensure - * compatibility with databases that do not support prepare: - * - * @param sql SQL to send to database - * - * @return return FALSE, or the prepared statement, or the original sql if - * if the database does not support prepare. - * - */ - function PrepareSP($sql,$param=true) - { - return $this->Prepare($sql,$param); - } - - /** - * PEAR DB Compat - */ - function Quote($s) - { - return $this->qstr($s,false); - } - - /** - Requested by "Karsten Dambekalns" - */ - function QMagic($s) - { - return $this->qstr($s,get_magic_quotes_gpc()); - } - - function q(&$s) - { - #if (!empty($this->qNull)) if ($s == 'null') return $s; - $s = $this->qstr($s,false); - } - - /** - * PEAR DB Compat - do not use internally. - */ - function ErrorNative() - { - return $this->ErrorNo(); - } - - - /** - * PEAR DB Compat - do not use internally. - */ - function nextId($seq_name) - { - return $this->GenID($seq_name); - } - - /** - * Lock a row, will escalate and lock the table if row locking not supported - * will normally free the lock at the end of the transaction - * - * @param $table name of table to lock - * @param $where where clause to use, eg: "WHERE row=12". If left empty, will escalate to table lock - */ - function RowLock($table,$where,$col='1 as ignore') - { - return false; - } - - function CommitLock($table) - { - return $this->CommitTrans(); - } - - function RollbackLock($table) - { - return $this->RollbackTrans(); - } - - /** - * PEAR DB Compat - do not use internally. - * - * The fetch modes for NUMERIC and ASSOC for PEAR DB and ADODB are identical - * for easy porting :-) - * - * @param mode The fetchmode ADODB_FETCH_ASSOC or ADODB_FETCH_NUM - * @returns The previous fetch mode - */ - function SetFetchMode($mode) - { - $old = $this->fetchMode; - $this->fetchMode = $mode; - - if ($old === false) { - global $ADODB_FETCH_MODE; - return $ADODB_FETCH_MODE; - } - return $old; - } - - - /** - * PEAR DB Compat - do not use internally. - */ - function Query($sql, $inputarr=false) - { - $rs = $this->Execute($sql, $inputarr); - if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); - return $rs; - } - - - /** - * PEAR DB Compat - do not use internally - */ - function LimitQuery($sql, $offset, $count, $params=false) - { - $rs = $this->SelectLimit($sql, $count, $offset, $params); - if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); - return $rs; - } - - - /** - * PEAR DB Compat - do not use internally - */ - function Disconnect() - { - return $this->Close(); - } - - /* - Returns placeholder for parameter, eg. - $DB->Param('a') - - will return ':a' for Oracle, and '?' for most other databases... - - For databases that require positioned params, eg $1, $2, $3 for postgresql, - pass in Param(false) before setting the first parameter. - */ - function Param($name,$type='C') - { - return '?'; - } - - /* - InParameter and OutParameter are self-documenting versions of Parameter(). - */ - function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) - { - return $this->Parameter($stmt,$var,$name,false,$maxLen,$type); - } - - /* - */ - function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) - { - return $this->Parameter($stmt,$var,$name,true,$maxLen,$type); - - } - - - /* - Usage in oracle - $stmt = $db->Prepare('select * from table where id =:myid and group=:group'); - $db->Parameter($stmt,$id,'myid'); - $db->Parameter($stmt,$group,'group',64); - $db->Execute(); - - @param $stmt Statement returned by Prepare() or PrepareSP(). - @param $var PHP variable to bind to - @param $name Name of stored procedure variable name to bind to. - @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. - @param [$maxLen] Holds an maximum length of the variable. - @param [$type] The data type of $var. Legal values depend on driver. - - */ - function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false) - { - return false; - } - - - function IgnoreErrors($saveErrs=false) - { - if (!$saveErrs) { - $saveErrs = array($this->raiseErrorFn,$this->_transOK); - $this->raiseErrorFn = false; - return $saveErrs; - } else { - $this->raiseErrorFn = $saveErrs[0]; - $this->_transOK = $saveErrs[1]; - } - } - - /** - Improved method of initiating a transaction. Used together with CompleteTrans(). - Advantages include: - - a. StartTrans/CompleteTrans is nestable, unlike BeginTrans/CommitTrans/RollbackTrans. - Only the outermost block is treated as a transaction.
        - b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.
        - c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block - are disabled, making it backward compatible. - */ - function StartTrans($errfn = 'ADODB_TransMonitor') - { - if ($this->transOff > 0) { - $this->transOff += 1; - return true; - } - - $this->_oldRaiseFn = $this->raiseErrorFn; - $this->raiseErrorFn = $errfn; - $this->_transOK = true; - - if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans"); - $ok = $this->BeginTrans(); - $this->transOff = 1; - return $ok; - } - - - /** - Used together with StartTrans() to end a transaction. Monitors connection - for sql errors, and will commit or rollback as appropriate. - - @autoComplete if true, monitor sql errors and commit and rollback as appropriate, - and if set to false force rollback even if no SQL error detected. - @returns true on commit, false on rollback. - */ - function CompleteTrans($autoComplete = true) - { - if ($this->transOff > 1) { - $this->transOff -= 1; - return true; - } - $this->raiseErrorFn = $this->_oldRaiseFn; - - $this->transOff = 0; - if ($this->_transOK && $autoComplete) { - if (!$this->CommitTrans()) { - $this->_transOK = false; - if ($this->debug) ADOConnection::outp("Smart Commit failed"); - } else - if ($this->debug) ADOConnection::outp("Smart Commit occurred"); - } else { - $this->_transOK = false; - $this->RollbackTrans(); - if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred"); - } - - return $this->_transOK; - } - - /* - At the end of a StartTrans/CompleteTrans block, perform a rollback. - */ - function FailTrans() - { - if ($this->debug) - if ($this->transOff == 0) { - ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans"); - } else { - ADOConnection::outp("FailTrans was called"); - adodb_backtrace(); - } - $this->_transOK = false; - } - - /** - Check if transaction has failed, only for Smart Transactions. - */ - function HasFailedTrans() - { - if ($this->transOff > 0) return $this->_transOK == false; - return false; - } - - /** - * Execute SQL - * - * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text) - * @param [inputarr] holds the input data to bind to. Null elements will be set to null. - * @return RecordSet or false - */ - function Execute($sql,$inputarr=false) - { - if ($this->fnExecute) { - $fn = $this->fnExecute; - $ret = $fn($this,$sql,$inputarr); - if (isset($ret)) return $ret; - } - if ($inputarr) { - if (!is_array($inputarr)) $inputarr = array($inputarr); - - $element0 = reset($inputarr); - # is_object check because oci8 descriptors can be passed in - $array_2d = is_array($element0) && !is_object(reset($element0)); - //remove extra memory copy of input -mikefedyk - unset($element0); - - if (!is_array($sql) && !$this->_bindInputArray) { - $sqlarr = explode('?',$sql); - $nparams = sizeof($sqlarr)-1; - if (!$array_2d) $inputarr = array($inputarr); - foreach($inputarr as $arr) { - $sql = ''; $i = 0; - //Use each() instead of foreach to reduce memory usage -mikefedyk - while(list(, $v) = each($arr)) { - $sql .= $sqlarr[$i]; - // from Ron Baldwin - // Only quote string types - $typ = gettype($v); - if ($typ == 'string') - //New memory copy of input created here -mikefedyk - $sql .= $this->qstr($v); - else if ($typ == 'double') - $sql .= str_replace(',','.',$v); // locales fix so 1.1 does not get converted to 1,1 - else if ($typ == 'boolean') - $sql .= $v ? $this->true : $this->false; - else if ($typ == 'object') { - if (method_exists($v, '__toString')) $sql .= $this->qstr($v->__toString()); - else $sql .= $this->qstr((string) $v); - } else if ($v === null) - $sql .= 'NULL'; - else - $sql .= $v; - $i += 1; - - if ($i == $nparams) break; - } // while - if (isset($sqlarr[$i])) { - $sql .= $sqlarr[$i]; - if ($i+1 != sizeof($sqlarr)) $this->outp_throw( "Input Array does not match ?: ".htmlspecialchars($sql),'Execute'); - } else if ($i != sizeof($sqlarr)) - $this->outp_throw( "Input array does not match ?: ".htmlspecialchars($sql),'Execute'); - - $ret = $this->_Execute($sql); - if (!$ret) return $ret; - } - } else { - if ($array_2d) { - if (is_string($sql)) - $stmt = $this->Prepare($sql); - else - $stmt = $sql; - - foreach($inputarr as $arr) { - $ret = $this->_Execute($stmt,$arr); - if (!$ret) return $ret; - } - } else { - $ret = $this->_Execute($sql,$inputarr); - } - } - } else { - $ret = $this->_Execute($sql,false); - } - - return $ret; - } - - - function _Execute($sql,$inputarr=false) - { - if ($this->debug) { - global $ADODB_INCLUDED_LIB; - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr); - } else { - $this->_queryID = @$this->_query($sql,$inputarr); - } - - /************************ - // OK, query executed - *************************/ - - if ($this->_queryID === false) { // error handling if query fails - if ($this->debug == 99) adodb_backtrace(true,5); - $fn = $this->raiseErrorFn; - if ($fn) { - $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this); - } - $false = false; - return $false; - } - - if ($this->_queryID === true) { // return simplified recordset for inserts/updates/deletes with lower overhead - $rsclass = $this->rsPrefix.'empty'; - $rs = (class_exists($rsclass)) ? new $rsclass(): new ADORecordSet_empty(); - - return $rs; - } - - // return real recordset from select statement - $rsclass = $this->rsPrefix.$this->databaseType; - $rs = new $rsclass($this->_queryID,$this->fetchMode); - $rs->connection = $this; // Pablo suggestion - $rs->Init(); - if (is_array($sql)) $rs->sql = $sql[0]; - else $rs->sql = $sql; - if ($rs->_numOfRows <= 0) { - global $ADODB_COUNTRECS; - if ($ADODB_COUNTRECS) { - if (!$rs->EOF) { - $rs = $this->_rs2rs($rs,-1,-1,!is_array($sql)); - $rs->_queryID = $this->_queryID; - } else - $rs->_numOfRows = 0; - } - } - return $rs; - } - - function CreateSequence($seqname='adodbseq',$startID=1) - { - if (empty($this->_genSeqSQL)) return false; - return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID)); - } - - function DropSequence($seqname='adodbseq') - { - if (empty($this->_dropSeqSQL)) return false; - return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); - } - - /** - * Generates a sequence id and stores it in $this->genID; - * GenID is only available if $this->hasGenID = true; - * - * @param seqname name of sequence to use - * @param startID if sequence does not exist, start at this ID - * @return 0 if not supported, otherwise a sequence id - */ - function GenID($seqname='adodbseq',$startID=1) - { - if (!$this->hasGenID) { - return 0; // formerly returns false pre 1.60 - } - - $getnext = sprintf($this->_genIDSQL,$seqname); - - $holdtransOK = $this->_transOK; - - $save_handler = $this->raiseErrorFn; - $this->raiseErrorFn = ''; - @($rs = $this->Execute($getnext)); - $this->raiseErrorFn = $save_handler; - - if (!$rs) { - $this->_transOK = $holdtransOK; //if the status was ok before reset - $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID)); - $rs = $this->Execute($getnext); - } - if ($rs && !$rs->EOF) $this->genID = reset($rs->fields); - else $this->genID = 0; // false - - if ($rs) $rs->Close(); - - return $this->genID; - } - - /** - * @param $table string name of the table, not needed by all databases (eg. mysql), default '' - * @param $column string name of the column, not needed by all databases (eg. mysql), default '' - * @return the last inserted ID. Not all databases support this. - */ - function Insert_ID($table='',$column='') - { - if ($this->_logsql && $this->lastInsID) return $this->lastInsID; - if ($this->hasInsertID) return $this->_insertid($table,$column); - if ($this->debug) { - ADOConnection::outp( '

        Insert_ID error

        '); - adodb_backtrace(); - } - return false; - } - - - /** - * Portable Insert ID. Pablo Roca - * - * @return the last inserted ID. All databases support this. But aware possible - * problems in multiuser environments. Heavy test this before deploying. - */ - function PO_Insert_ID($table="", $id="") - { - if ($this->hasInsertID){ - return $this->Insert_ID($table,$id); - } else { - return $this->GetOne("SELECT MAX($id) FROM $table"); - } - } - - /** - * @return # rows affected by UPDATE/DELETE - */ - function Affected_Rows() - { - if ($this->hasAffectedRows) { - if ($this->fnExecute === 'adodb_log_sql') { - if ($this->_logsql && $this->_affected !== false) return $this->_affected; - } - $val = $this->_affectedrows(); - return ($val < 0) ? false : $val; - } - - if ($this->debug) ADOConnection::outp( '

        Affected_Rows error

        ',false); - return false; - } - - - /** - * @return the last error message - */ - function ErrorMsg() - { - if ($this->_errorMsg) return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg; - else return ''; - } - - - /** - * @return the last error number. Normally 0 means no error. - */ - function ErrorNo() - { - return ($this->_errorMsg) ? -1 : 0; - } - - function MetaError($err=false) - { - include_once(ADODB_DIR."/adodb-error.inc.php"); - if ($err === false) $err = $this->ErrorNo(); - return adodb_error($this->dataProvider,$this->databaseType,$err); - } - - function MetaErrorMsg($errno) - { - include_once(ADODB_DIR."/adodb-error.inc.php"); - return adodb_errormsg($errno); - } - - /** - * @returns an array with the primary key columns in it. - */ - function MetaPrimaryKeys($table, $owner=false) - { - // owner not used in base class - see oci8 - $p = array(); - $objs = $this->MetaColumns($table); - if ($objs) { - foreach($objs as $v) { - if (!empty($v->primary_key)) - $p[] = $v->name; - } - } - if (sizeof($p)) return $p; - if (function_exists('ADODB_VIEW_PRIMARYKEYS')) - return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner); - return false; - } - - /** - * @returns assoc array where keys are tables, and values are foreign keys - */ - function MetaForeignKeys($table, $owner=false, $upper=false) - { - return false; - } - /** - * Choose a database to connect to. Many databases do not support this. - * - * @param dbName is the name of the database to select - * @return true or false - */ - function SelectDB($dbName) - {return false;} - - - /** - * Will select, getting rows from $offset (1-based), for $nrows. - * This simulates the MySQL "select * from table limit $offset,$nrows" , and - * the PostgreSQL "select * from table limit $nrows offset $offset". Note that - * MySQL and PostgreSQL parameter ordering is the opposite of the other. - * eg. - * SelectLimit('select * from table',3); will return rows 1 to 3 (1-based) - * SelectLimit('select * from table',3,2); will return rows 3 to 5 (1-based) - * - * Uses SELECT TOP for Microsoft databases (when $this->hasTop is set) - * BUG: Currently SelectLimit fails with $sql with LIMIT or TOP clause already set - * - * @param sql - * @param [offset] is the row to start calculations from (1-based) - * @param [nrows] is the number of rows to get - * @param [inputarr] array of bind variables - * @param [secs2cache] is a private parameter only used by jlim - * @return the recordset ($rs->databaseType == 'array') - */ - function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) - { - if ($this->hasTop && $nrows > 0) { - // suggested by Reinhard Balling. Access requires top after distinct - // Informix requires first before distinct - F Riosa - $ismssql = (strpos($this->databaseType,'mssql') !== false); - if ($ismssql) $isaccess = false; - else $isaccess = (strpos($this->databaseType,'access') !== false); - - if ($offset <= 0) { - - // access includes ties in result - if ($isaccess) { - $sql = preg_replace( - '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); - - if ($secs2cache != 0) { - $ret = $this->CacheExecute($secs2cache, $sql,$inputarr); - } else { - $ret = $this->Execute($sql,$inputarr); - } - return $ret; // PHP5 fix - } else if ($ismssql){ - $sql = preg_replace( - '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); - } else { - $sql = preg_replace( - '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); - } - } else { - $nn = $nrows + $offset; - if ($isaccess || $ismssql) { - $sql = preg_replace( - '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql); - } else { - $sql = preg_replace( - '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql); - } - } - } - - // if $offset>0, we want to skip rows, and $ADODB_COUNTRECS is set, we buffer rows - // 0 to offset-1 which will be discarded anyway. So we disable $ADODB_COUNTRECS. - global $ADODB_COUNTRECS; - - $savec = $ADODB_COUNTRECS; - $ADODB_COUNTRECS = false; - - - if ($secs2cache != 0) $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); - else $rs = $this->Execute($sql,$inputarr); - - $ADODB_COUNTRECS = $savec; - if ($rs && !$rs->EOF) { - $rs = $this->_rs2rs($rs,$nrows,$offset); - } - //print_r($rs); - return $rs; - } - - /** - * Create serializable recordset. Breaks rs link to connection. - * - * @param rs the recordset to serialize - */ - function SerializableRS(&$rs) - { - $rs2 = $this->_rs2rs($rs); - $ignore = false; - $rs2->connection = $ignore; - - return $rs2; - } - - /** - * Convert database recordset to an array recordset - * input recordset's cursor should be at beginning, and - * old $rs will be closed. - * - * @param rs the recordset to copy - * @param [nrows] number of rows to retrieve (optional) - * @param [offset] offset by number of rows (optional) - * @return the new recordset - */ - function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true) - { - if (! $rs) { - $false = false; - return $false; - } - $dbtype = $rs->databaseType; - if (!$dbtype) { - $rs = $rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ? - return $rs; - } - if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) { - $rs->MoveFirst(); - $rs = $rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ? - return $rs; - } - $flds = array(); - for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { - $flds[] = $rs->FetchField($i); - } - - $arr = $rs->GetArrayLimit($nrows,$offset); - //print_r($arr); - if ($close) $rs->Close(); - - $arrayClass = $this->arrayClass; - - $rs2 = new $arrayClass(); - $rs2->connection = $this; - $rs2->sql = $rs->sql; - $rs2->dataProvider = $this->dataProvider; - $rs2->InitArrayFields($arr,$flds); - $rs2->fetchMode = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode; - return $rs2; - } - - /* - * Return all rows. Compat with PEAR DB - */ - function GetAll($sql, $inputarr=false) - { - $arr = $this->GetArray($sql,$inputarr); - return $arr; - } - - function GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false) - { - $rs = $this->Execute($sql, $inputarr); - if (!$rs) { - $false = false; - return $false; - } - $arr = $rs->GetAssoc($force_array,$first2cols); - return $arr; - } - - function CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false) - { - if (!is_numeric($secs2cache)) { - $first2cols = $force_array; - $force_array = $inputarr; - } - $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); - if (!$rs) { - $false = false; - return $false; - } - $arr = $rs->GetAssoc($force_array,$first2cols); - return $arr; - } - - /** - * Return first element of first row of sql statement. Recordset is disposed - * for you. - * - * @param sql SQL statement - * @param [inputarr] input bind array - */ - function GetOne($sql,$inputarr=false) - { - global $ADODB_COUNTRECS,$ADODB_GETONE_EOF; - $crecs = $ADODB_COUNTRECS; - $ADODB_COUNTRECS = false; - - $ret = false; - $rs = $this->Execute($sql,$inputarr); - if ($rs) { - if ($rs->EOF) $ret = $ADODB_GETONE_EOF; - else $ret = reset($rs->fields); - - $rs->Close(); - } - $ADODB_COUNTRECS = $crecs; - return $ret; - } - - // $where should include 'WHERE fld=value' - function GetMedian($table, $field,$where = '') - { - $total = $this->GetOne("select count(*) from $table $where"); - if (!$total) return false; - - $midrow = (integer) ($total/2); - $rs = $this->SelectLimit("select $field from $table $where order by 1",1,$midrow); - if ($rs && !$rs->EOF) return reset($rs->fields); - return false; - } - - - function CacheGetOne($secs2cache,$sql=false,$inputarr=false) - { - global $ADODB_GETONE_EOF; - $ret = false; - $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); - if ($rs) { - if ($rs->EOF) $ret = $ADODB_GETONE_EOF; - else $ret = reset($rs->fields); - $rs->Close(); - } - - return $ret; - } - - function GetCol($sql, $inputarr = false, $trim = false) - { - - $rs = $this->Execute($sql, $inputarr); - if ($rs) { - $rv = array(); - if ($trim) { - while (!$rs->EOF) { - $rv[] = trim(reset($rs->fields)); - $rs->MoveNext(); - } - } else { - while (!$rs->EOF) { - $rv[] = reset($rs->fields); - $rs->MoveNext(); - } - } - $rs->Close(); - } else - $rv = false; - return $rv; - } - - function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false) - { - $rs = $this->CacheExecute($secs, $sql, $inputarr); - if ($rs) { - $rv = array(); - if ($trim) { - while (!$rs->EOF) { - $rv[] = trim(reset($rs->fields)); - $rs->MoveNext(); - } - } else { - while (!$rs->EOF) { - $rv[] = reset($rs->fields); - $rs->MoveNext(); - } - } - $rs->Close(); - } else - $rv = false; - - return $rv; - } - - function Transpose(&$rs,$addfieldnames=true) - { - $rs2 = $this->_rs2rs($rs); - $false = false; - if (!$rs2) return $false; - - $rs2->_transpose($addfieldnames); - return $rs2; - } - - /* - Calculate the offset of a date for a particular database and generate - appropriate SQL. Useful for calculating future/past dates and storing - in a database. - - If dayFraction=1.5 means 1.5 days from now, 1.0/24 for 1 hour. - */ - function OffsetDate($dayFraction,$date=false) - { - if (!$date) $date = $this->sysDate; - return '('.$date.'+'.$dayFraction.')'; - } - - - /** - * - * @param sql SQL statement - * @param [inputarr] input bind array - */ - function GetArray($sql,$inputarr=false) - { - global $ADODB_COUNTRECS; - - $savec = $ADODB_COUNTRECS; - $ADODB_COUNTRECS = false; - $rs = $this->Execute($sql,$inputarr); - $ADODB_COUNTRECS = $savec; - if (!$rs) - if (defined('ADODB_PEAR')) { - $cls = ADODB_PEAR_Error(); - return $cls; - } else { - $false = false; - return $false; - } - $arr = $rs->GetArray(); - $rs->Close(); - return $arr; - } - - function CacheGetAll($secs2cache,$sql=false,$inputarr=false) - { - $arr = $this->CacheGetArray($secs2cache,$sql,$inputarr); - return $arr; - } - - function CacheGetArray($secs2cache,$sql=false,$inputarr=false) - { - global $ADODB_COUNTRECS; - - $savec = $ADODB_COUNTRECS; - $ADODB_COUNTRECS = false; - $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); - $ADODB_COUNTRECS = $savec; - - if (!$rs) - if (defined('ADODB_PEAR')) { - $cls = ADODB_PEAR_Error(); - return $cls; - } else { - $false = false; - return $false; - } - $arr = $rs->GetArray(); - $rs->Close(); - return $arr; - } - - function GetRandRow($sql, $arr= false) - { - $rezarr = $this->GetAll($sql, $arr); - $sz = sizeof($rezarr); - return $rezarr[abs(rand()) % $sz]; - } - - /** - * Return one row of sql statement. Recordset is disposed for you. - * - * @param sql SQL statement - * @param [inputarr] input bind array - */ - function GetRow($sql,$inputarr=false) - { - global $ADODB_COUNTRECS; - $crecs = $ADODB_COUNTRECS; - $ADODB_COUNTRECS = false; - - $rs = $this->Execute($sql,$inputarr); - - $ADODB_COUNTRECS = $crecs; - if ($rs) { - if (!$rs->EOF) $arr = $rs->fields; - else $arr = array(); - $rs->Close(); - return $arr; - } - - $false = false; - return $false; - } - - function CacheGetRow($secs2cache,$sql=false,$inputarr=false) - { - $rs = $this->CacheExecute($secs2cache,$sql,$inputarr); - if ($rs) { - if (!$rs->EOF) $arr = $rs->fields; - else $arr = array(); - - $rs->Close(); - return $arr; - } - $false = false; - return $false; - } - - /** - * Insert or replace a single record. Note: this is not the same as MySQL's replace. - * ADOdb's Replace() uses update-insert semantics, not insert-delete-duplicates of MySQL. - * Also note that no table locking is done currently, so it is possible that the - * record be inserted twice by two programs... - * - * $this->Replace('products', array('prodname' =>"'Nails'","price" => 3.99), 'prodname'); - * - * $table table name - * $fieldArray associative array of data (you must quote strings yourself). - * $keyCol the primary key field name or if compound key, array of field names - * autoQuote set to true to use a hueristic to quote strings. Works with nulls and numbers - * but does not work with dates nor SQL functions. - * has_autoinc the primary key is an auto-inc field, so skip in insert. - * - * Currently blob replace not supported - * - * returns 0 = fail, 1 = update, 2 = insert - */ - - function Replace($table, $fieldArray, $keyCol, $autoQuote=false, $has_autoinc=false) - { - global $ADODB_INCLUDED_LIB; - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - - return _adodb_replace($this, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc); - } - - - /** - * Will select, getting rows from $offset (1-based), for $nrows. - * This simulates the MySQL "select * from table limit $offset,$nrows" , and - * the PostgreSQL "select * from table limit $nrows offset $offset". Note that - * MySQL and PostgreSQL parameter ordering is the opposite of the other. - * eg. - * CacheSelectLimit(15,'select * from table',3); will return rows 1 to 3 (1-based) - * CacheSelectLimit(15,'select * from table',3,2); will return rows 3 to 5 (1-based) - * - * BUG: Currently CacheSelectLimit fails with $sql with LIMIT or TOP clause already set - * - * @param [secs2cache] seconds to cache data, set to 0 to force query. This is optional - * @param sql - * @param [offset] is the row to start calculations from (1-based) - * @param [nrows] is the number of rows to get - * @param [inputarr] array of bind variables - * @return the recordset ($rs->databaseType == 'array') - */ - function CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false) - { - if (!is_numeric($secs2cache)) { - if ($sql === false) $sql = -1; - if ($offset == -1) $offset = false; - // sql, nrows, offset,inputarr - $rs = $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs); - } else { - if ($sql === false) $this->outp_throw("Warning: \$sql missing from CacheSelectLimit()",'CacheSelectLimit'); - $rs = $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - } - return $rs; - } - - - /** - * Flush cached recordsets that match a particular $sql statement. - * If $sql == false, then we purge all files in the cache. - */ - - /** - * Flush cached recordsets that match a particular $sql statement. - * If $sql == false, then we purge all files in the cache. - */ - function CacheFlush($sql=false,$inputarr=false) - { - global $ADODB_CACHE_DIR, $ADODB_CACHE; - - if (empty($ADODB_CACHE)) return false; - - if (!$sql) { - $ADODB_CACHE->flushall($this->debug); - return; - } - - $f = $this->_gencachename($sql.serialize($inputarr),false); - return $ADODB_CACHE->flushcache($f, $this->debug); - } - - - /** - * Private function to generate filename for caching. - * Filename is generated based on: - * - * - sql statement - * - database type (oci8, ibase, ifx, etc) - * - database name - * - userid - * - setFetchMode (adodb 4.23) - * - * When not in safe mode, we create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR). - * Assuming that we can have 50,000 files per directory with good performance, - * then we can scale to 12.8 million unique cached recordsets. Wow! - */ - function _gencachename($sql,$createdir) - { - global $ADODB_CACHE, $ADODB_CACHE_DIR; - - if ($this->fetchMode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } else { - $mode = $this->fetchMode; - } - $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode); - if (!$ADODB_CACHE->createdir) return $m; - if (!$createdir) $dir = $ADODB_CACHE->getdirname($m); - else $dir = $ADODB_CACHE->createdir($m, $this->debug); - - return $dir.'/adodb_'.$m.'.cache'; - } - - - /** - * Execute SQL, caching recordsets. - * - * @param [secs2cache] seconds to cache data, set to 0 to force query. - * This is an optional parameter. - * @param sql SQL statement to execute - * @param [inputarr] holds the input data to bind to - * @return RecordSet or false - */ - function CacheExecute($secs2cache,$sql=false,$inputarr=false) - { - global $ADODB_CACHE; - - if (empty($ADODB_CACHE)) $this->_CreateCache(); - - if (!is_numeric($secs2cache)) { - $inputarr = $sql; - $sql = $secs2cache; - $secs2cache = $this->cacheSecs; - } - - if (is_array($sql)) { - $sqlparam = $sql; - $sql = $sql[0]; - } else - $sqlparam = $sql; - - - $md5file = $this->_gencachename($sql.serialize($inputarr),true); - $err = ''; - - if ($secs2cache > 0){ - $rs = $ADODB_CACHE->readcache($md5file,$err,$secs2cache,$this->arrayClass); - $this->numCacheHits += 1; - } else { - $err='Timeout 1'; - $rs = false; - $this->numCacheMisses += 1; - } - - if (!$rs) { - // no cached rs found - if ($this->debug) { - if (get_magic_quotes_runtime() && !$this->memCache) { - ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :("); - } - if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)"); - } - - $rs = $this->Execute($sqlparam,$inputarr); - - if ($rs) { - - $eof = $rs->EOF; - $rs = $this->_rs2rs($rs); // read entire recordset into memory immediately - $rs->timeCreated = time(); // used by caching - $txt = _rs2serialize($rs,false,$sql); // serialize - - $ok = $ADODB_CACHE->writecache($md5file,$txt,$this->debug, $secs2cache); - if (!$ok) { - if ($ok === false) { - $em = 'Cache write error'; - $en = -32000; - - if ($fn = $this->raiseErrorFn) { - $fn($this->databaseType,'CacheExecute', $en, $em, $md5file,$sql,$this); - } - } else { - $em = 'Cache file locked warning'; - $en = -32001; - // do not call error handling for just a warning - } - - if ($this->debug) ADOConnection::outp( " ".$em); - } - if ($rs->EOF && !$eof) { - $rs->MoveFirst(); - //$rs = csv2rs($md5file,$err); - $rs->connection = $this; // Pablo suggestion - } - - } else if (!$this->memCache) - $ADODB_CACHE->flushcache($md5file); - } else { - $this->_errorMsg = ''; - $this->_errorCode = 0; - - if ($this->fnCacheExecute) { - $fn = $this->fnCacheExecute; - $fn($this, $secs2cache, $sql, $inputarr); - } - // ok, set cached object found - $rs->connection = $this; // Pablo suggestion - if ($this->debug){ - if ($this->debug == 99) adodb_backtrace(); - $inBrowser = isset($_SERVER['HTTP_USER_AGENT']); - $ttl = $rs->timeCreated + $secs2cache - time(); - $s = is_array($sql) ? $sql[0] : $sql; - if ($inBrowser) $s = ''.htmlspecialchars($s).''; - - ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]"); - } - } - return $rs; - } - - - /* - Similar to PEAR DB's autoExecute(), except that - $mode can be 'INSERT' or 'UPDATE' or DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE - If $mode == 'UPDATE', then $where is compulsory as a safety measure. - - $forceUpdate means that even if the data has not changed, perform update. - */ - function AutoExecute($table, $fields_values, $mode = 'INSERT', $where = FALSE, $forceUpdate=true, $magicq=false) - { - $false = false; - $sql = 'SELECT * FROM '.$table; - if ($where!==FALSE) $sql .= ' WHERE '.$where; - else if ($mode == 'UPDATE' || $mode == 2 /* DB_AUTOQUERY_UPDATE */) { - $this->outp_throw('AutoExecute: Illegal mode=UPDATE with empty WHERE clause','AutoExecute'); - return $false; - } - - $rs = $this->SelectLimit($sql,1); - if (!$rs) return $false; // table does not exist - $rs->tableName = $table; - $rs->sql = $sql; - - switch((string) $mode) { - case 'UPDATE': - case '2': - $sql = $this->GetUpdateSQL($rs, $fields_values, $forceUpdate, $magicq); - break; - case 'INSERT': - case '1': - $sql = $this->GetInsertSQL($rs, $fields_values, $magicq); - break; - default: - $this->outp_throw("AutoExecute: Unknown mode=$mode",'AutoExecute'); - return $false; - } - $ret = false; - if ($sql) $ret = $this->Execute($sql); - if ($ret) $ret = true; - return $ret; - } - - - /** - * Generates an Update Query based on an existing recordset. - * $arrFields is an associative array of fields with the value - * that should be assigned. - * - * Note: This function should only be used on a recordset - * that is run against a single table and sql should only - * be a simple select stmt with no groupby/orderby/limit - * - * "Jonathan Younger" - */ - function GetUpdateSQL(&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=null) - { - global $ADODB_INCLUDED_LIB; - - //********************************************************// - //This is here to maintain compatibility - //with older adodb versions. Sets force type to force nulls if $forcenulls is set. - if (!isset($force)) { - global $ADODB_FORCE_TYPE; - $force = $ADODB_FORCE_TYPE; - } - //********************************************************// - - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - return _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq,$force); - } - - /** - * Generates an Insert Query based on an existing recordset. - * $arrFields is an associative array of fields with the value - * that should be assigned. - * - * Note: This function should only be used on a recordset - * that is run against a single table. - */ - function GetInsertSQL(&$rs, $arrFields,$magicq=false,$force=null) - { - global $ADODB_INCLUDED_LIB; - if (!isset($force)) { - global $ADODB_FORCE_TYPE; - $force = $ADODB_FORCE_TYPE; - - } - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - return _adodb_getinsertsql($this,$rs,$arrFields,$magicq,$force); - } - - - /** - * Update a blob column, given a where clause. There are more sophisticated - * blob handling functions that we could have implemented, but all require - * a very complex API. Instead we have chosen something that is extremely - * simple to understand and use. - * - * Note: $blobtype supports 'BLOB' and 'CLOB', default is BLOB of course. - * - * Usage to update a $blobvalue which has a primary key blob_id=1 into a - * field blobtable.blobcolumn: - * - * UpdateBlob('blobtable', 'blobcolumn', $blobvalue, 'blob_id=1'); - * - * Insert example: - * - * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - * $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; - } - - /** - * Usage: - * UpdateBlob('TABLE', 'COLUMN', '/path/to/file', 'ID=1'); - * - * $blobtype supports 'BLOB' and 'CLOB' - * - * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - * $conn->UpdateBlob('blobtable','blobcol',$blobpath,'id=1'); - */ - function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') - { - $fd = fopen($path,'rb'); - if ($fd === false) return false; - $val = fread($fd,filesize($path)); - fclose($fd); - return $this->UpdateBlob($table,$column,$val,$where,$blobtype); - } - - function BlobDecode($blob) - { - return $blob; - } - - function BlobEncode($blob) - { - return $blob; - } - - function SetCharSet($charset) - { - return false; - } - - function IfNull( $field, $ifNull ) - { - return " CASE WHEN $field is null THEN $ifNull ELSE $field END "; - } - - function LogSQL($enable=true) - { - include_once(ADODB_DIR.'/adodb-perf.inc.php'); - - if ($enable) $this->fnExecute = 'adodb_log_sql'; - else $this->fnExecute = false; - - $old = $this->_logsql; - $this->_logsql = $enable; - if ($enable && !$old) $this->_affected = false; - return $old; - } - - function GetCharSet() - { - return false; - } - - /** - * Usage: - * UpdateClob('TABLE', 'COLUMN', $var, 'ID=1', 'CLOB'); - * - * $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)'); - * $conn->UpdateClob('clobtable','clobcol',$clob,'id=1'); - */ - function UpdateClob($table,$column,$val,$where) - { - return $this->UpdateBlob($table,$column,$val,$where,'CLOB'); - } - - // not the fastest implementation - quick and dirty - jlim - // for best performance, use the actual $rs->MetaType(). - function MetaType($t,$len=-1,$fieldobj=false) - { - - if (empty($this->_metars)) { - $rsclass = $this->rsPrefix.$this->databaseType; - $this->_metars = new $rsclass(false,$this->fetchMode); - $this->_metars->connection = $this; - } - return $this->_metars->MetaType($t,$len,$fieldobj); - } - - - /** - * Change the SQL connection locale to a specified locale. - * This is used to get the date formats written depending on the client locale. - */ - function SetDateLocale($locale = 'En') - { - $this->locale = $locale; - switch (strtoupper($locale)) - { - case 'EN': - $this->fmtDate="'Y-m-d'"; - $this->fmtTimeStamp = "'Y-m-d H:i:s'"; - break; - - case 'US': - $this->fmtDate = "'m-d-Y'"; - $this->fmtTimeStamp = "'m-d-Y H:i:s'"; - break; - - case 'PT_BR': - case 'NL': - case 'FR': - case 'RO': - case 'IT': - $this->fmtDate="'d-m-Y'"; - $this->fmtTimeStamp = "'d-m-Y H:i:s'"; - break; - - case 'GE': - $this->fmtDate="'d.m.Y'"; - $this->fmtTimeStamp = "'d.m.Y H:i:s'"; - break; - - default: - $this->fmtDate="'Y-m-d'"; - $this->fmtTimeStamp = "'Y-m-d H:i:s'"; - break; - } - } - - /** - * GetActiveRecordsClass Performs an 'ALL' query - * - * @param mixed $class This string represents the class of the current active record - * @param mixed $table Table used by the active record object - * @param mixed $whereOrderBy Where, order, by clauses - * @param mixed $bindarr - * @param mixed $primkeyArr - * @param array $extra Query extras: limit, offset... - * @param mixed $relations Associative array: table's foreign name, "hasMany", "belongsTo" - * @access public - * @return void - */ - function GetActiveRecordsClass( - $class, $table,$whereOrderBy=false,$bindarr=false, $primkeyArr=false, - $extra=array(), - $relations=array()) - { - global $_ADODB_ACTIVE_DBS; - ## reduce overhead of adodb.inc.php -- moved to adodb-active-record.inc.php - ## if adodb-active-recordx is loaded -- should be no issue as they will probably use Find() - if (!isset($_ADODB_ACTIVE_DBS))include_once(ADODB_DIR.'/adodb-active-record.inc.php'); - return adodb_GetActiveRecordsClass($this, $class, $table, $whereOrderBy, $bindarr, $primkeyArr, $extra, $relations); - } - - function GetActiveRecords($table,$where=false,$bindarr=false,$primkeyArr=false) - { - $arr = $this->GetActiveRecordsClass('ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr); - return $arr; - } - - /** - * Close Connection - */ - function Close() - { - $rez = $this->_close(); - $this->_connectionID = false; - return $rez; - } - - /** - * Begin a Transaction. Must be followed by CommitTrans() or RollbackTrans(). - * - * @return true if succeeded or false if database does not support transactions - */ - function BeginTrans() - { - if ($this->debug) ADOConnection::outp("BeginTrans: Transactions not supported for this driver"); - return false; - } - - /* set transaction mode */ - function SetTransactionMode( $transaction_mode ) - { - $transaction_mode = $this->MetaTransaction($transaction_mode, $this->dataProvider); - $this->_transmode = $transaction_mode; - } - /* - http://msdn2.microsoft.com/en-US/ms173763.aspx - http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-isolation.html - http://www.postgresql.org/docs/8.1/interactive/sql-set-transaction.html - http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm - */ - function MetaTransaction($mode,$db) - { - $mode = strtoupper($mode); - $mode = str_replace('ISOLATION LEVEL ','',$mode); - - switch($mode) { - - case 'READ UNCOMMITTED': - switch($db) { - case 'oci8': - case 'oracle': - return 'ISOLATION LEVEL READ COMMITTED'; - default: - return 'ISOLATION LEVEL READ UNCOMMITTED'; - } - break; - - case 'READ COMMITTED': - return 'ISOLATION LEVEL READ COMMITTED'; - break; - - case 'REPEATABLE READ': - switch($db) { - case 'oci8': - case 'oracle': - return 'ISOLATION LEVEL SERIALIZABLE'; - default: - return 'ISOLATION LEVEL REPEATABLE READ'; - } - break; - - case 'SERIALIZABLE': - return 'ISOLATION LEVEL SERIALIZABLE'; - break; - - default: - return $mode; - } - } - - /** - * If database does not support transactions, always return true as data always commited - * - * @param $ok set to false to rollback transaction, true to commit - * - * @return true/false. - */ - function CommitTrans($ok=true) - { return true;} - - - /** - * If database does not support transactions, rollbacks always fail, so return false - * - * @return true/false. - */ - function RollbackTrans() - { return false;} - - - /** - * return the databases that the driver can connect to. - * Some databases will return an empty array. - * - * @return an array of database names. - */ - function MetaDatabases() - { - global $ADODB_FETCH_MODE; - - if ($this->metaDatabasesSQL) { - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - - $arr = $this->GetCol($this->metaDatabasesSQL); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - return $arr; - } - - return false; - } - - - /** - * @param ttype can either be 'VIEW' or 'TABLE' or false. - * If false, both views and tables are returned. - * "VIEW" returns only views - * "TABLE" returns only tables - * @param showSchema returns the schema/user with the table name, eg. USER.TABLE - * @param mask is the input mask - only supported by oci8 and postgresql - * - * @return array of tables for current database. - */ - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - global $ADODB_FETCH_MODE; - - - $false = false; - if ($mask) { - return $false; - } - if ($this->metaTablesSQL) { - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - - $rs = $this->Execute($this->metaTablesSQL); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if ($rs === false) return $false; - $arr = $rs->GetArray(); - $arr2 = array(); - - if ($hast = ($ttype && isset($arr[0][1]))) { - $showt = strncmp($ttype,'T',1); - } - - for ($i=0; $i < sizeof($arr); $i++) { - if ($hast) { - if ($showt == 0) { - if (strncmp($arr[$i][1],'T',1) == 0) $arr2[] = trim($arr[$i][0]); - } else { - if (strncmp($arr[$i][1],'V',1) == 0) $arr2[] = trim($arr[$i][0]); - } - } else - $arr2[] = trim($arr[$i][0]); - } - $rs->Close(); - return $arr2; - } - return $false; - } - - - function _findschema(&$table,&$schema) - { - if (!$schema && ($at = strpos($table,'.')) !== false) { - $schema = substr($table,0,$at); - $table = substr($table,$at+1); - } - } - - /** - * List columns in a database as an array of ADOFieldObjects. - * See top of file for definition of object. - * - * @param $table table name to query - * @param $normalize makes table name case-insensitive (required by some databases) - * @schema is optional database schema to use - not supported by all databases. - * - * @return array of ADOFieldObjects for current table. - */ - function MetaColumns($table,$normalize=true) - { - global $ADODB_FETCH_MODE; - - $false = false; - - if (!empty($this->metaColumnsSQL)) { - - $schema = false; - $this->_findschema($table,$schema); - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - $rs = $this->Execute(sprintf($this->metaColumnsSQL,($normalize)?strtoupper($table):$table)); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - if ($rs === false || $rs->EOF) return $false; - - $retarr = array(); - while (!$rs->EOF) { //print_r($rs->fields); - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $fld->type = $rs->fields[1]; - if (isset($rs->fields[3]) && $rs->fields[3]) { - if ($rs->fields[3]>0) $fld->max_length = $rs->fields[3]; - $fld->scale = $rs->fields[4]; - if ($fld->scale>0) $fld->max_length += 1; - } else - $fld->max_length = $rs->fields[2]; - - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[strtoupper($fld->name)] = $fld; - $rs->MoveNext(); - } - $rs->Close(); - return $retarr; - } - return $false; - } - - /** - * List indexes on a table as an array. - * @param table table name to query - * @param primary true to only show primary keys. Not actually used for most databases - * - * @return array of indexes on current table. Each element represents an index, and is itself an associative array. - - Array ( - [name_of_index] => Array - ( - [unique] => true or false - [columns] => Array - ( - [0] => firstname - [1] => lastname - ) - ) - */ - function MetaIndexes($table, $primary = false, $owner = false) - { - $false = false; - return $false; - } - - /** - * List columns names in a table as an array. - * @param table table name to query - * - * @return array of column names for current table. - */ - function MetaColumnNames($table, $numIndexes=false,$useattnum=false /* only for postgres */) - { - $objarr = $this->MetaColumns($table); - if (!is_array($objarr)) { - $false = false; - return $false; - } - $arr = array(); - if ($numIndexes) { - $i = 0; - if ($useattnum) { - foreach($objarr as $v) - $arr[$v->attnum] = $v->name; - - } else - foreach($objarr as $v) $arr[$i++] = $v->name; - } else - foreach($objarr as $v) $arr[strtoupper($v->name)] = $v->name; - - return $arr; - } - - /** - * Different SQL databases used different methods to combine strings together. - * This function provides a wrapper. - * - * param s variable number of string parameters - * - * Usage: $db->Concat($str1,$str2); - * - * @return concatenated string - */ - function Concat() - { - $arr = func_get_args(); - return implode($this->concat_operator, $arr); - } - - - /** - * Converts a date "d" to a string that the database can understand. - * - * @param d a date in Unix date time format. - * - * @return date string in database date format - */ - function DBDate($d, $isfld=false) - { - if (empty($d) && $d !== 0) return 'null'; - if ($isfld) return $d; - - if (is_object($d)) return $d->format($this->fmtDate); - - - if (is_string($d) && !is_numeric($d)) { - if ($d === 'null' || strncmp($d,"'",1) === 0) return $d; - if ($this->isoDates) return "'$d'"; - $d = ADOConnection::UnixDate($d); - } - - return adodb_date($this->fmtDate,$d); - } - - function BindDate($d) - { - $d = $this->DBDate($d); - if (strncmp($d,"'",1)) return $d; - - return substr($d,1,strlen($d)-2); - } - - function BindTimeStamp($d) - { - $d = $this->DBTimeStamp($d); - if (strncmp($d,"'",1)) return $d; - - return substr($d,1,strlen($d)-2); - } - - - /** - * Converts a timestamp "ts" to a string that the database can understand. - * - * @param ts a timestamp in Unix date time format. - * - * @return timestamp string in database timestamp format - */ - function DBTimeStamp($ts,$isfld=false) - { - if (empty($ts) && $ts !== 0) return 'null'; - if ($isfld) return $ts; - if (is_object($ts)) return $ts->format($this->fmtTimeStamp); - - # strlen(14) allows YYYYMMDDHHMMSS format - if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14)) - return adodb_date($this->fmtTimeStamp,$ts); - - if ($ts === 'null') return $ts; - if ($this->isoDates && strlen($ts) !== 14) return "'$ts'"; - - $ts = ADOConnection::UnixTimeStamp($ts); - return adodb_date($this->fmtTimeStamp,$ts); - } - - /** - * Also in ADORecordSet. - * @param $v is a date string in YYYY-MM-DD format - * - * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format - */ - static function UnixDate($v) - { - if (is_object($v)) { - // odbtp support - //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 ) - return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year); - } - - if (is_numeric($v) && strlen($v) !== 8) return $v; - if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|", - ($v), $rr)) return false; - - if ($rr[1] <= TIMESTAMP_FIRST_YEAR) return 0; - // h-m-s-MM-DD-YY - return @adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); - } - - - /** - * Also in ADORecordSet. - * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format - * - * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format - */ - static function UnixTimeStamp($v) - { - if (is_object($v)) { - // odbtp support - //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 ) - return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year); - } - - if (!preg_match( - "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ ,-]*(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", - ($v), $rr)) return false; - - if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1) return 0; - - // h-m-s-MM-DD-YY - if (!isset($rr[5])) return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); - return @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]); - } - - /** - * Also in ADORecordSet. - * - * Format database date based on user defined format. - * - * @param v is the character date in YYYY-MM-DD format, returned by database - * @param fmt is the format to apply to it, using date() - * - * @return a date formated as user desires - */ - - function UserDate($v,$fmt='Y-m-d',$gmt=false) - { - $tt = $this->UnixDate($v); - - // $tt == -1 if pre TIMESTAMP_FIRST_YEAR - if (($tt === false || $tt == -1) && $v != false) return $v; - else if ($tt == 0) return $this->emptyDate; - else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR - } - - return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt); - - } - - /** - * - * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format - * @param fmt is the format to apply to it, using date() - * - * @return a timestamp formated as user desires - */ - function UserTimeStamp($v,$fmt='Y-m-d H:i:s',$gmt=false) - { - if (!isset($v)) return $this->emptyTimeStamp; - # strlen(14) allows YYYYMMDDHHMMSS format - if (is_numeric($v) && strlen($v)<14) return ($gmt) ? adodb_gmdate($fmt,$v) : adodb_date($fmt,$v); - $tt = $this->UnixTimeStamp($v); - // $tt == -1 if pre TIMESTAMP_FIRST_YEAR - if (($tt === false || $tt == -1) && $v != false) return $v; - if ($tt == 0) return $this->emptyTimeStamp; - return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt); - } - - function escape($s,$magic_quotes=false) - { - return $this->addq($s,$magic_quotes); - } - - /** - * Quotes a string, without prefixing nor appending quotes. - */ - function addq($s,$magic_quotes=false) - { - if (!$magic_quotes) { - - if ($this->replaceQuote[0] == '\\'){ - // only since php 4.0.5 - $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); - //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s)); - } - return str_replace("'",$this->replaceQuote,$s); - } - - // undo magic quotes for " - $s = str_replace('\\"','"',$s); - - if ($this->replaceQuote == "\\'" || @ini_get('magic_quotes_sybase')) // ' already quoted, no need to change anything - return $s; - else {// change \' to '' for sybase/mssql - $s = str_replace('\\\\','\\',$s); - return str_replace("\\'",$this->replaceQuote,$s); - } - } - - /** - * Correctly quotes a string so that all strings are escaped. We prefix and append - * to the string single-quotes. - * An example is $db->qstr("Don't bother",magic_quotes_runtime()); - * - * @param s the string to quote - * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). - * This undoes the stupidity of magic quotes for GPC. - * - * @return quoted string to be sent back to database - */ - function qstr($s,$magic_quotes=false) - { - if (!$magic_quotes) { - - if ($this->replaceQuote[0] == '\\'){ - // only since php 4.0.5 - $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); - //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s)); - } - return "'".str_replace("'",$this->replaceQuote,$s)."'"; - } - - // undo magic quotes for " - $s = str_replace('\\"','"',$s); - - if ($this->replaceQuote == "\\'" || @ini_get('magic_quotes_sybase')) // ' already quoted, no need to change anything - return "'$s'"; - else {// change \' to '' for sybase/mssql - $s = str_replace('\\\\','\\',$s); - return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; - } - } - - - /** - * Will select the supplied $page number from a recordset, given that it is paginated in pages of - * $nrows rows per page. It also saves two boolean values saying if the given page is the first - * and/or last one of the recordset. Added by Iv�n Oliva to provide recordset pagination. - * - * See readme.htm#ex8 for an example of usage. - * - * @param sql - * @param nrows is the number of rows per page to get - * @param page is the page number to get (1-based) - * @param [inputarr] array of bind variables - * @param [secs2cache] is a private parameter only used by jlim - * @return the recordset ($rs->databaseType == 'array') - * - * NOTE: phpLens uses a different algorithm and does not use PageExecute(). - * - */ - function PageExecute($sql, $nrows, $page, $inputarr=false, $secs2cache=0) - { - global $ADODB_INCLUDED_LIB; - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - if ($this->pageExecuteCountRows) $rs = _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $secs2cache); - else $rs = _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $secs2cache); - return $rs; - } - - - /** - * Will select the supplied $page number from a recordset, given that it is paginated in pages of - * $nrows rows per page. It also saves two boolean values saying if the given page is the first - * and/or last one of the recordset. Added by Iv�n Oliva to provide recordset pagination. - * - * @param secs2cache seconds to cache data, set to 0 to force query - * @param sql - * @param nrows is the number of rows per page to get - * @param page is the page number to get (1-based) - * @param [inputarr] array of bind variables - * @return the recordset ($rs->databaseType == 'array') - */ - function CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false) - { - /*switch($this->dataProvider) { - case 'postgres': - case 'mysql': - break; - default: $secs2cache = 0; break; - }*/ - $rs = $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache); - return $rs; - } - - } // end class ADOConnection - - - - //============================================================================================== - // CLASS ADOFetchObj - //============================================================================================== - - /** - * Internal placeholder for record objects. Used by ADORecordSet->FetchObj(). - */ - class ADOFetchObj { - }; - - //============================================================================================== - // CLASS ADORecordSet_empty - //============================================================================================== - - class ADODB_Iterator_empty implements Iterator { - - private $rs; - - function __construct($rs) - { - $this->rs = $rs; - } - function rewind() - { - } - - function valid() - { - return !$this->rs->EOF; - } - - function key() - { - return false; - } - - function current() - { - return false; - } - - function next() - { - } - - function __call($func, $params) - { - return call_user_func_array(array($this->rs, $func), $params); - } - - function hasMore() - { - return false; - } - - } - - - /** - * Lightweight recordset when there are no records to be returned - */ - class ADORecordSet_empty implements IteratorAggregate - { - var $dataProvider = 'empty'; - var $databaseType = false; - var $EOF = true; - var $_numOfRows = 0; - var $fields = false; - var $connection = false; - function RowCount() {return 0;} - function RecordCount() {return 0;} - function PO_RecordCount(){return 0;} - function Close(){return true;} - function FetchRow() {return false;} - function FieldCount(){ return 0;} - function Init() {} - function getIterator() {return new ADODB_Iterator_empty($this);} - } - - //============================================================================================== - // DATE AND TIME FUNCTIONS - //============================================================================================== - if (!defined('ADODB_DATE_VERSION')) include(ADODB_DIR.'/adodb-time.inc.php'); - - //============================================================================================== - // CLASS ADORecordSet - //============================================================================================== - - class ADODB_Iterator implements Iterator { - - private $rs; - - function __construct($rs) - { - $this->rs = $rs; - } - function rewind() - { - $this->rs->MoveFirst(); - } - - function valid() - { - return !$this->rs->EOF; - } - - function key() - { - return $this->rs->_currentRow; - } - - function current() - { - return $this->rs->fields; - } - - function next() - { - $this->rs->MoveNext(); - } - - function __call($func, $params) - { - return call_user_func_array(array($this->rs, $func), $params); - } - - - function hasMore() - { - return !$this->rs->EOF; - } - - } - - - - /** - * RecordSet class that represents the dataset returned by the database. - * To keep memory overhead low, this class holds only the current row in memory. - * No prefetching of data is done, so the RecordCount() can return -1 ( which - * means recordcount not known). - */ - class ADORecordSet implements IteratorAggregate { - /* - * public variables - */ - var $dataProvider = "native"; - var $fields = false; /// holds the current row data - var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob - /// in other words, we use a text area for editing. - var $canSeek = false; /// indicates that seek is supported - var $sql; /// sql text - var $EOF = false; /// Indicates that the current record position is after the last record in a Recordset object. - - var $emptyTimeStamp = ' '; /// what to display when $time==0 - var $emptyDate = ' '; /// what to display when $time==0 - var $debug = false; - var $timeCreated=0; /// datetime in Unix format rs created -- for cached recordsets - - var $bind = false; /// used by Fields() to hold array - should be private? - var $fetchMode; /// default fetch mode - var $connection = false; /// the parent connection - /* - * private variables - */ - var $_numOfRows = -1; /** number of rows, or -1 */ - var $_numOfFields = -1; /** number of fields in recordset */ - var $_queryID = -1; /** This variable keeps the result link identifier. */ - var $_currentRow = -1; /** This variable keeps the current row in the Recordset. */ - var $_closed = false; /** has recordset been closed */ - var $_inited = false; /** Init() should only be called once */ - var $_obj; /** Used by FetchObj */ - var $_names; /** Used by FetchObj */ - - var $_currentPage = -1; /** Added by Iv�n Oliva to implement recordset pagination * - var $_atFirstPage = false; /** Added by Iv�n Oliva to implement recordset pagination * - var $_atLastPage = false; /** Added by Iv�n Oliva to implement recordset pagination * - var $_lastPageNo = -1; - var $_maxRecordCount = 0; - var $datetime = false; - - /** - * Constructor - * - * @param queryID this is the queryID returned by ADOConnection->_query() - * - */ - function ADORecordSet($queryID) - { - $this->_queryID = $queryID; - } - - function getIterator() - { - return new ADODB_Iterator($this); - } - - /* this is experimental - i don't really know what to return... */ - function __toString() - { - include_once(ADODB_DIR.'/toexport.inc.php'); - return _adodb_export($this,',',',',false,true); - } - - - function Init() - { - if ($this->_inited) return; - $this->_inited = true; - if ($this->_queryID) @$this->_initrs(); - else { - $this->_numOfRows = 0; - $this->_numOfFields = 0; - } - if ($this->_numOfRows != 0 && $this->_numOfFields && $this->_currentRow == -1) { - - $this->_currentRow = 0; - if ($this->EOF = ($this->_fetch() === false)) { - $this->_numOfRows = 0; // _numOfRows could be -1 - } - } else { - $this->EOF = true; - } - } - - - /** - * Generate a SELECT tag string from a recordset, and return the string. - * If the recordset has 2 cols, we treat the 1st col as the containing - * the text to display to the user, and 2nd col as the return value. Default - * strings are compared with the FIRST column. - * - * @param name name of SELECT tag - * @param [defstr] the value to hilite. Use an array for multiple hilites for listbox. - * @param [blank1stItem] true to leave the 1st item in list empty - * @param [multiple] true for listbox, false for popup - * @param [size] #rows to show for listbox. not used by popup - * @param [selectAttr] additional attributes to defined for SELECT tag. - * useful for holding javascript onChange='...' handlers. - & @param [compareFields0] when we have 2 cols in recordset, we compare the defstr with - * column 0 (1st col) if this is true. This is not documented. - * - * @return HTML - * - * changes by glen.davies@cce.ac.nz to support multiple hilited items - */ - function GetMenu($name,$defstr='',$blank1stItem=true,$multiple=false, - $size=0, $selectAttr='',$compareFields0=true) - { - global $ADODB_INCLUDED_LIB; - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple, - $size, $selectAttr,$compareFields0); - } - - - - /** - * Generate a SELECT tag string from a recordset, and return the string. - * If the recordset has 2 cols, we treat the 1st col as the containing - * the text to display to the user, and 2nd col as the return value. Default - * strings are compared with the SECOND column. - * - */ - function GetMenu2($name,$defstr='',$blank1stItem=true,$multiple=false,$size=0, $selectAttr='') - { - return $this->GetMenu($name,$defstr,$blank1stItem,$multiple, - $size, $selectAttr,false); - } - - /* - Grouped Menu - */ - function GetMenu3($name,$defstr='',$blank1stItem=true,$multiple=false, - $size=0, $selectAttr='') - { - global $ADODB_INCLUDED_LIB; - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - return _adodb_getmenu_gp($this, $name,$defstr,$blank1stItem,$multiple, - $size, $selectAttr,false); - } - - /** - * return recordset as a 2-dimensional array. - * - * @param [nRows] is the number of rows to return. -1 means every row. - * - * @return an array indexed by the rows (0-based) from the recordset - */ - function GetArray($nRows = -1) - { - global $ADODB_EXTENSION; if ($ADODB_EXTENSION) { - $results = adodb_getall($this,$nRows); - return $results; - } - $results = array(); - $cnt = 0; - while (!$this->EOF && $nRows != $cnt) { - $results[] = $this->fields; - $this->MoveNext(); - $cnt++; - } - return $results; - } - - function GetAll($nRows = -1) - { - $arr = $this->GetArray($nRows); - return $arr; - } - - /* - * Some databases allow multiple recordsets to be returned. This function - * will return true if there is a next recordset, or false if no more. - */ - function NextRecordSet() - { - return false; - } - - /** - * return recordset as a 2-dimensional array. - * Helper function for ADOConnection->SelectLimit() - * - * @param offset is the row to start calculations from (1-based) - * @param [nrows] is the number of rows to return - * - * @return an array indexed by the rows (0-based) from the recordset - */ - function GetArrayLimit($nrows,$offset=-1) - { - if ($offset <= 0) { - $arr = $this->GetArray($nrows); - return $arr; - } - - $this->Move($offset); - - $results = array(); - $cnt = 0; - while (!$this->EOF && $nrows != $cnt) { - $results[$cnt++] = $this->fields; - $this->MoveNext(); - } - - return $results; - } - - - /** - * Synonym for GetArray() for compatibility with ADO. - * - * @param [nRows] is the number of rows to return. -1 means every row. - * - * @return an array indexed by the rows (0-based) from the recordset - */ - function GetRows($nRows = -1) - { - $arr = $this->GetArray($nRows); - return $arr; - } - - /** - * return whole recordset as a 2-dimensional associative array if there are more than 2 columns. - * The first column is treated as the key and is not included in the array. - * If there is only 2 columns, it will return a 1 dimensional array of key-value pairs unless - * $force_array == true. - * - * @param [force_array] has only meaning if we have 2 data columns. If false, a 1 dimensional - * array is returned, otherwise a 2 dimensional array is returned. If this sounds confusing, - * read the source. - * - * @param [first2cols] means if there are more than 2 cols, ignore the remaining cols and - * instead of returning array[col0] => array(remaining cols), return array[col0] => col1 - * - * @return an associative array indexed by the first column of the array, - * or false if the data has less than 2 cols. - */ - function GetAssoc($force_array = false, $first2cols = false) - { - global $ADODB_EXTENSION; - - $cols = $this->_numOfFields; - if ($cols < 2) { - $false = false; - return $false; - } - $numIndex = isset($this->fields[0]); - $results = array(); - - if (!$first2cols && ($cols > 2 || $force_array)) { - if ($ADODB_EXTENSION) { - if ($numIndex) { - while (!$this->EOF) { - $results[trim($this->fields[0])] = array_slice($this->fields, 1); - adodb_movenext($this); - } - } else { - while (!$this->EOF) { - // Fix for array_slice re-numbering numeric associative keys - $keys = array_slice(array_keys($this->fields), 1); - $sliced_array = array(); - - foreach($keys as $key) { - $sliced_array[$key] = $this->fields[$key]; - } - - $results[trim(reset($this->fields))] = $sliced_array; - adodb_movenext($this); - } - } - } else { - if ($numIndex) { - while (!$this->EOF) { - $results[trim($this->fields[0])] = array_slice($this->fields, 1); - $this->MoveNext(); - } - } else { - while (!$this->EOF) { - // Fix for array_slice re-numbering numeric associative keys - $keys = array_slice(array_keys($this->fields), 1); - $sliced_array = array(); - - foreach($keys as $key) { - $sliced_array[$key] = $this->fields[$key]; - } - - $results[trim(reset($this->fields))] = $sliced_array; - $this->MoveNext(); - } - } - } - } else { - if ($ADODB_EXTENSION) { - // return scalar values - if ($numIndex) { - while (!$this->EOF) { - // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string - $results[trim(($this->fields[0]))] = $this->fields[1]; - adodb_movenext($this); - } - } else { - while (!$this->EOF) { - // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string - $v1 = trim(reset($this->fields)); - $v2 = ''.next($this->fields); - $results[$v1] = $v2; - adodb_movenext($this); - } - } - } else { - if ($numIndex) { - while (!$this->EOF) { - // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string - $results[trim(($this->fields[0]))] = $this->fields[1]; - $this->MoveNext(); - } - } else { - while (!$this->EOF) { - // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string - $v1 = trim(reset($this->fields)); - $v2 = ''.next($this->fields); - $results[$v1] = $v2; - $this->MoveNext(); - } - } - } - } - - $ref = $results; # workaround accelerator incompat with PHP 4.4 :( - return $ref; - } - - - /** - * - * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format - * @param fmt is the format to apply to it, using date() - * - * @return a timestamp formated as user desires - */ - function UserTimeStamp($v,$fmt='Y-m-d H:i:s') - { - if (is_numeric($v) && strlen($v)<14) return adodb_date($fmt,$v); - $tt = $this->UnixTimeStamp($v); - // $tt == -1 if pre TIMESTAMP_FIRST_YEAR - if (($tt === false || $tt == -1) && $v != false) return $v; - if ($tt === 0) return $this->emptyTimeStamp; - return adodb_date($fmt,$tt); - } - - - /** - * @param v is the character date in YYYY-MM-DD format, returned by database - * @param fmt is the format to apply to it, using date() - * - * @return a date formated as user desires - */ - function UserDate($v,$fmt='Y-m-d') - { - $tt = $this->UnixDate($v); - // $tt == -1 if pre TIMESTAMP_FIRST_YEAR - if (($tt === false || $tt == -1) && $v != false) return $v; - else if ($tt == 0) return $this->emptyDate; - else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR - } - return adodb_date($fmt,$tt); - } - - - /** - * @param $v is a date string in YYYY-MM-DD format - * - * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format - */ - static function UnixDate($v) - { - return ADOConnection::UnixDate($v); - } - - - /** - * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format - * - * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format - */ - static function UnixTimeStamp($v) - { - return ADOConnection::UnixTimeStamp($v); - } - - - /** - * PEAR DB Compat - do not use internally - */ - function Free() - { - return $this->Close(); - } - - - /** - * PEAR DB compat, number of rows - */ - function NumRows() - { - return $this->_numOfRows; - } - - - /** - * PEAR DB compat, number of cols - */ - function NumCols() - { - return $this->_numOfFields; - } - - /** - * Fetch a row, returning false if no more rows. - * This is PEAR DB compat mode. - * - * @return false or array containing the current record - */ - function FetchRow() - { - if ($this->EOF) { - $false = false; - return $false; - } - $arr = $this->fields; - $this->_currentRow++; - if (!$this->_fetch()) $this->EOF = true; - return $arr; - } - - - /** - * Fetch a row, returning PEAR_Error if no more rows. - * This is PEAR DB compat mode. - * - * @return DB_OK or error object - */ - function FetchInto(&$arr) - { - if ($this->EOF) return (defined('PEAR_ERROR_RETURN')) ? new PEAR_Error('EOF',-1): false; - $arr = $this->fields; - $this->MoveNext(); - return 1; // DB_OK - } - - - /** - * Move to the first row in the recordset. Many databases do NOT support this. - * - * @return true or false - */ - function MoveFirst() - { - if ($this->_currentRow == 0) return true; - return $this->Move(0); - } - - - /** - * Move to the last row in the recordset. - * - * @return true or false - */ - function MoveLast() - { - if ($this->_numOfRows >= 0) return $this->Move($this->_numOfRows-1); - if ($this->EOF) return false; - while (!$this->EOF) { - $f = $this->fields; - $this->MoveNext(); - } - $this->fields = $f; - $this->EOF = false; - return true; - } - - - /** - * Move to next record in the recordset. - * - * @return true if there still rows available, or false if there are no more rows (EOF). - */ - function MoveNext() - { - if (!$this->EOF) { - $this->_currentRow++; - if ($this->_fetch()) return true; - } - $this->EOF = true; - /* -- tested error handling when scrolling cursor -- seems useless. - $conn = $this->connection; - if ($conn && $conn->raiseErrorFn && ($errno = $conn->ErrorNo())) { - $fn = $conn->raiseErrorFn; - $fn($conn->databaseType,'MOVENEXT',$errno,$conn->ErrorMsg().' ('.$this->sql.')',$conn->host,$conn->database); - } - */ - return false; - } - - - /** - * Random access to a specific row in the recordset. Some databases do not support - * access to previous rows in the databases (no scrolling backwards). - * - * @param rowNumber is the row to move to (0-based) - * - * @return true if there still rows available, or false if there are no more rows (EOF). - */ - function Move($rowNumber = 0) - { - $this->EOF = false; - if ($rowNumber == $this->_currentRow) return true; - if ($rowNumber >= $this->_numOfRows) - if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2; - - if ($this->canSeek) { - - if ($this->_seek($rowNumber)) { - $this->_currentRow = $rowNumber; - if ($this->_fetch()) { - return true; - } - } else { - $this->EOF = true; - return false; - } - } else { - if ($rowNumber < $this->_currentRow) return false; - global $ADODB_EXTENSION; - if ($ADODB_EXTENSION) { - while (!$this->EOF && $this->_currentRow < $rowNumber) { - adodb_movenext($this); - } - } else { - - while (! $this->EOF && $this->_currentRow < $rowNumber) { - $this->_currentRow++; - - if (!$this->_fetch()) $this->EOF = true; - } - } - return !($this->EOF); - } - - $this->fields = false; - $this->EOF = true; - return false; - } - - - /** - * Get the value of a field in the current row by column name. - * Will not work if ADODB_FETCH_MODE is set to ADODB_FETCH_NUM. - * - * @param colname is the field to access - * - * @return the value of $colname column - */ - function Fields($colname) - { - return $this->fields[$colname]; - } - - function GetAssocKeys($upper=true) - { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - if ($upper === 2) $this->bind[$o->name] = $i; - else $this->bind[($upper) ? strtoupper($o->name) : strtolower($o->name)] = $i; - } - } - - /** - * Use associative array to get fields array for databases that do not support - * associative arrays. Submitted by Paolo S. Asioli paolo.asioli#libero.it - * - * If you don't want uppercase cols, set $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC - * before you execute your SQL statement, and access $rs->fields['col'] directly. - * - * $upper 0 = lowercase, 1 = uppercase, 2 = whatever is returned by FetchField - */ - function GetRowAssoc($upper=1) - { - $record = array(); - // if (!$this->fields) return $record; - - if (!$this->bind) { - $this->GetAssocKeys($upper); - } - - foreach($this->bind as $k => $v) { - $record[$k] = $this->fields[$v]; - } - - return $record; - } - - - /** - * Clean up recordset - * - * @return true or false - */ - function Close() - { - // free connection object - this seems to globally free the object - // and not merely the reference, so don't do this... - // $this->connection = false; - if (!$this->_closed) { - $this->_closed = true; - return $this->_close(); - } else - return true; - } - - /** - * synonyms RecordCount and RowCount - * - * @return the number of rows or -1 if this is not supported - */ - function RecordCount() {return $this->_numOfRows;} - - - /* - * If we are using PageExecute(), this will return the maximum possible rows - * that can be returned when paging a recordset. - */ - function MaxRecordCount() - { - return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount(); - } - - /** - * synonyms RecordCount and RowCount - * - * @return the number of rows or -1 if this is not supported - */ - function RowCount() {return $this->_numOfRows;} - - - /** - * Portable RecordCount. Pablo Roca - * - * @return the number of records from a previous SELECT. All databases support this. - * - * But aware possible problems in multiuser environments. For better speed the table - * must be indexed by the condition. Heavy test this before deploying. - */ - function PO_RecordCount($table="", $condition="") { - - $lnumrows = $this->_numOfRows; - // the database doesn't support native recordcount, so we do a workaround - if ($lnumrows == -1 && $this->connection) { - IF ($table) { - if ($condition) $condition = " WHERE " . $condition; - $resultrows = $this->connection->Execute("SELECT COUNT(*) FROM $table $condition"); - if ($resultrows) $lnumrows = reset($resultrows->fields); - } - } - return $lnumrows; - } - - - /** - * @return the current row in the recordset. If at EOF, will return the last row. 0-based. - */ - function CurrentRow() {return $this->_currentRow;} - - /** - * synonym for CurrentRow -- for ADO compat - * - * @return the current row in the recordset. If at EOF, will return the last row. 0-based. - */ - function AbsolutePosition() {return $this->_currentRow;} - - /** - * @return the number of columns in the recordset. Some databases will set this to 0 - * if no records are returned, others will return the number of columns in the query. - */ - function FieldCount() {return $this->_numOfFields;} - - - /** - * Get the ADOFieldObject of a specific column. - * - * @param fieldoffset is the column position to access(0-based). - * - * @return the ADOFieldObject for that column, or false. - */ - function FetchField($fieldoffset = -1) - { - // must be defined by child class - - $false = false; - return $false; - } - - /** - * Get the ADOFieldObjects of all columns in an array. - * - */ - function FieldTypesArray() - { - $arr = array(); - for ($i=0, $max=$this->_numOfFields; $i < $max; $i++) - $arr[] = $this->FetchField($i); - return $arr; - } - - /** - * Return the fields array of the current row as an object for convenience. - * The default case is lowercase field names. - * - * @return the object with the properties set to the fields of the current row - */ - function FetchObj() - { - $o = $this->FetchObject(false); - return $o; - } - - /** - * Return the fields array of the current row as an object for convenience. - * The default case is uppercase. - * - * @param $isupper to set the object property names to uppercase - * - * @return the object with the properties set to the fields of the current row - */ - function FetchObject($isupper=true) - { - if (empty($this->_obj)) { - $this->_obj = new ADOFetchObj(); - $this->_names = array(); - for ($i=0; $i <$this->_numOfFields; $i++) { - $f = $this->FetchField($i); - $this->_names[] = $f->name; - } - } - $i = 0; - if (PHP_VERSION >= 5) $o = clone($this->_obj); - else $o = $this->_obj; - - for ($i=0; $i <$this->_numOfFields; $i++) { - $name = $this->_names[$i]; - if ($isupper) $n = strtoupper($name); - else $n = $name; - - $o->$n = $this->Fields($name); - } - return $o; - } - - /** - * Return the fields array of the current row as an object for convenience. - * The default is lower-case field names. - * - * @return the object with the properties set to the fields of the current row, - * or false if EOF - * - * Fixed bug reported by tim@orotech.net - */ - function FetchNextObj() - { - $o = $this->FetchNextObject(false); - return $o; - } - - - /** - * Return the fields array of the current row as an object for convenience. - * The default is upper case field names. - * - * @param $isupper to set the object property names to uppercase - * - * @return the object with the properties set to the fields of the current row, - * or false if EOF - * - * Fixed bug reported by tim@orotech.net - */ - function FetchNextObject($isupper=true) - { - $o = false; - if ($this->_numOfRows != 0 && !$this->EOF) { - $o = $this->FetchObject($isupper); - $this->_currentRow++; - if ($this->_fetch()) return $o; - } - $this->EOF = true; - return $o; - } - - /** - * Get the metatype of the column. This is used for formatting. This is because - * many databases use different names for the same type, so we transform the original - * type to our standardised version which uses 1 character codes: - * - * @param t is the type passed in. Normally is ADOFieldObject->type. - * @param len is the maximum length of that field. This is because we treat character - * fields bigger than a certain size as a 'B' (blob). - * @param fieldobj is the field object returned by the database driver. Can hold - * additional info (eg. primary_key for mysql). - * - * @return the general type of the data: - * C for character < 250 chars - * X for teXt (>= 250 chars) - * B for Binary - * N for numeric or floating point - * D for date - * T for timestamp - * L for logical/Boolean - * I for integer - * R for autoincrement counter/integer - * - * - */ - function MetaType($t,$len=-1,$fieldobj=false) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - // changed in 2.32 to hashing instead of switch stmt for speed... - static $typeMap = array( - 'VARCHAR' => 'C', - 'VARCHAR2' => 'C', - 'CHAR' => 'C', - 'C' => 'C', - 'STRING' => 'C', - 'NCHAR' => 'C', - 'NVARCHAR' => 'C', - 'VARYING' => 'C', - 'BPCHAR' => 'C', - 'CHARACTER' => 'C', - 'INTERVAL' => 'C', # Postgres - 'MACADDR' => 'C', # postgres - 'VAR_STRING' => 'C', # mysql - ## - 'LONGCHAR' => 'X', - 'TEXT' => 'X', - 'NTEXT' => 'X', - 'M' => 'X', - 'X' => 'X', - 'CLOB' => 'X', - 'NCLOB' => 'X', - 'LVARCHAR' => 'X', - ## - 'BLOB' => 'B', - 'IMAGE' => 'B', - 'BINARY' => 'B', - 'VARBINARY' => 'B', - 'LONGBINARY' => 'B', - 'B' => 'B', - ## - 'YEAR' => 'D', // mysql - 'DATE' => 'D', - 'D' => 'D', - ## - 'UNIQUEIDENTIFIER' => 'C', # MS SQL Server - ## - 'SMALLDATETIME' => 'T', - 'TIME' => 'T', - 'TIMESTAMP' => 'T', - 'DATETIME' => 'T', - 'TIMESTAMPTZ' => 'T', - 'T' => 'T', - 'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql - ## - 'BOOL' => 'L', - 'BOOLEAN' => 'L', - 'BIT' => 'L', - 'L' => 'L', - ## - 'COUNTER' => 'R', - 'R' => 'R', - 'SERIAL' => 'R', // ifx - 'INT IDENTITY' => 'R', - ## - 'INT' => 'I', - 'INT2' => 'I', - 'INT4' => 'I', - 'INT8' => 'I', - 'INTEGER' => 'I', - 'INTEGER UNSIGNED' => 'I', - 'SHORT' => 'I', - 'TINYINT' => 'I', - 'SMALLINT' => 'I', - 'I' => 'I', - ## - 'LONG' => 'N', // interbase is numeric, oci8 is blob - 'BIGINT' => 'N', // this is bigger than PHP 32-bit integers - 'DECIMAL' => 'N', - 'DEC' => 'N', - 'REAL' => 'N', - 'DOUBLE' => 'N', - 'DOUBLE PRECISION' => 'N', - 'SMALLFLOAT' => 'N', - 'FLOAT' => 'N', - 'NUMBER' => 'N', - 'NUM' => 'N', - 'NUMERIC' => 'N', - 'MONEY' => 'N', - - ## informix 9.2 - 'SQLINT' => 'I', - 'SQLSERIAL' => 'I', - 'SQLSMINT' => 'I', - 'SQLSMFLOAT' => 'N', - 'SQLFLOAT' => 'N', - 'SQLMONEY' => 'N', - 'SQLDECIMAL' => 'N', - 'SQLDATE' => 'D', - 'SQLVCHAR' => 'C', - 'SQLCHAR' => 'C', - 'SQLDTIME' => 'T', - 'SQLINTERVAL' => 'N', - 'SQLBYTES' => 'B', - 'SQLTEXT' => 'X', - ## informix 10 - "SQLINT8" => 'I8', - "SQLSERIAL8" => 'I8', - "SQLNCHAR" => 'C', - "SQLNVCHAR" => 'C', - "SQLLVARCHAR" => 'X', - "SQLBOOL" => 'L' - ); - - $tmap = false; - $t = strtoupper($t); - $tmap = (isset($typeMap[$t])) ? $typeMap[$t] : 'N'; - switch ($tmap) { - case 'C': - - // is the char field is too long, return as text field... - if ($this->blobSize >= 0) { - if ($len > $this->blobSize) return 'X'; - } else if ($len > 250) { - return 'X'; - } - return 'C'; - - case 'I': - if (!empty($fieldobj->primary_key)) return 'R'; - return 'I'; - - case false: - return 'N'; - - case 'B': - if (isset($fieldobj->binary)) - return ($fieldobj->binary) ? 'B' : 'X'; - return 'B'; - - case 'D': - if (!empty($this->connection) && !empty($this->connection->datetime)) return 'T'; - return 'D'; - - default: - if ($t == 'LONG' && $this->dataProvider == 'oci8') return 'B'; - return $tmap; - } - } - - - function _close() {} - - /** - * set/returns the current recordset page when paginating - */ - function AbsolutePage($page=-1) - { - if ($page != -1) $this->_currentPage = $page; - return $this->_currentPage; - } - - /** - * set/returns the status of the atFirstPage flag when paginating - */ - function AtFirstPage($status=false) - { - if ($status != false) $this->_atFirstPage = $status; - return $this->_atFirstPage; - } - - function LastPageNo($page = false) - { - if ($page != false) $this->_lastPageNo = $page; - return $this->_lastPageNo; - } - - /** - * set/returns the status of the atLastPage flag when paginating - */ - function AtLastPage($status=false) - { - if ($status != false) $this->_atLastPage = $status; - return $this->_atLastPage; - } - - } // end class ADORecordSet - - //============================================================================================== - // CLASS ADORecordSet_array - //============================================================================================== - - /** - * This class encapsulates the concept of a recordset created in memory - * as an array. This is useful for the creation of cached recordsets. - * - * Note that the constructor is different from the standard ADORecordSet - */ - - class ADORecordSet_array extends ADORecordSet - { - var $databaseType = 'array'; - - var $_array; // holds the 2-dimensional data array - var $_types; // the array of types of each column (C B I L M) - var $_colnames; // names of each column in array - var $_skiprow1; // skip 1st row because it holds column names - var $_fieldobjects; // holds array of field objects - var $canSeek = true; - var $affectedrows = false; - var $insertid = false; - var $sql = ''; - var $compat = false; - /** - * Constructor - * - */ - function ADORecordSet_array($fakeid=1) - { - global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH; - - // fetch() on EOF does not delete $this->fields - $this->compat = !empty($ADODB_COMPAT_FETCH); - $this->ADORecordSet($fakeid); // fake queryID - $this->fetchMode = $ADODB_FETCH_MODE; - } - - function _transpose($addfieldnames=true) - { - global $ADODB_INCLUDED_LIB; - - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - $hdr = true; - - $fobjs = $addfieldnames ? $this->_fieldobjects : false; - adodb_transpose($this->_array, $newarr, $hdr, $fobjs); - //adodb_pr($newarr); - - $this->_skiprow1 = false; - $this->_array = $newarr; - $this->_colnames = $hdr; - - adodb_probetypes($newarr,$this->_types); - - $this->_fieldobjects = array(); - - foreach($hdr as $k => $name) { - $f = new ADOFieldObject(); - $f->name = $name; - $f->type = $this->_types[$k]; - $f->max_length = -1; - $this->_fieldobjects[] = $f; - } - $this->fields = reset($this->_array); - - $this->_initrs(); - - } - - /** - * Setup the array. - * - * @param array is a 2-dimensional array holding the data. - * The first row should hold the column names - * unless paramter $colnames is used. - * @param typearr holds an array of types. These are the same types - * used in MetaTypes (C,B,L,I,N). - * @param [colnames] array of column names. If set, then the first row of - * $array should not hold the column names. - */ - function InitArray($array,$typearr,$colnames=false) - { - $this->_array = $array; - $this->_types = $typearr; - if ($colnames) { - $this->_skiprow1 = false; - $this->_colnames = $colnames; - } else { - $this->_skiprow1 = true; - $this->_colnames = $array[0]; - } - $this->Init(); - } - /** - * Setup the Array and datatype file objects - * - * @param array is a 2-dimensional array holding the data. - * The first row should hold the column names - * unless paramter $colnames is used. - * @param fieldarr holds an array of ADOFieldObject's. - */ - function InitArrayFields(&$array,&$fieldarr) - { - $this->_array = $array; - $this->_skiprow1= false; - if ($fieldarr) { - $this->_fieldobjects = $fieldarr; - } - $this->Init(); - } - - function GetArray($nRows=-1) - { - if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) { - return $this->_array; - } else { - $arr = ADORecordSet::GetArray($nRows); - return $arr; - } - } - - function _initrs() - { - $this->_numOfRows = sizeof($this->_array); - if ($this->_skiprow1) $this->_numOfRows -= 1; - - $this->_numOfFields =(isset($this->_fieldobjects)) ? - sizeof($this->_fieldobjects):sizeof($this->_types); - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - $mode = isset($this->adodbFetchMode) ? $this->adodbFetchMode : $this->fetchMode; - - if ($mode & ADODB_FETCH_ASSOC) { - if (!isset($this->fields[$colname]) && !is_null($this->fields[$colname])) $colname = strtolower($colname); - return $this->fields[$colname]; - } - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - function FetchField($fieldOffset = -1) - { - if (isset($this->_fieldobjects)) { - return $this->_fieldobjects[$fieldOffset]; - } - $o = new ADOFieldObject(); - $o->name = $this->_colnames[$fieldOffset]; - $o->type = $this->_types[$fieldOffset]; - $o->max_length = -1; // length not known - - return $o; - } - - function _seek($row) - { - if (sizeof($this->_array) && 0 <= $row && $row < $this->_numOfRows) { - $this->_currentRow = $row; - if ($this->_skiprow1) $row += 1; - $this->fields = $this->_array[$row]; - return true; - } - return false; - } - - function MoveNext() - { - if (!$this->EOF) { - $this->_currentRow++; - - $pos = $this->_currentRow; - - if ($this->_numOfRows <= $pos) { - if (!$this->compat) $this->fields = false; - } else { - if ($this->_skiprow1) $pos += 1; - $this->fields = $this->_array[$pos]; - return true; - } - $this->EOF = true; - } - - return false; - } - - function _fetch() - { - $pos = $this->_currentRow; - - if ($this->_numOfRows <= $pos) { - if (!$this->compat) $this->fields = false; - return false; - } - if ($this->_skiprow1) $pos += 1; - $this->fields = $this->_array[$pos]; - return true; - } - - function _close() - { - return true; - } - - } // ADORecordSet_array - - //============================================================================================== - // HELPER FUNCTIONS - //============================================================================================== - - /** - * Synonym for ADOLoadCode. Private function. Do not use. - * - * @deprecated - */ - function ADOLoadDB($dbType) - { - return ADOLoadCode($dbType); - } - - /** - * Load the code for a specific database driver. Private function. Do not use. - */ - function ADOLoadCode($dbType) - { - global $ADODB_LASTDB; - - if (!$dbType) return false; - $db = strtolower($dbType); - switch ($db) { - case 'ado': - if (PHP_VERSION >= 5) $db = 'ado5'; - $class = 'ado'; - break; - case 'ifx': - case 'maxsql': $class = $db = 'mysqlt'; break; - case 'postgres': - case 'postgres8': - case 'pgsql': $class = $db = 'postgres7'; break; - default: - $class = $db; break; - } - - $file = ADODB_DIR."/drivers/adodb-".$db.".inc.php"; - @include_once($file); - $ADODB_LASTDB = $class; - if (class_exists("ADODB_" . $class)) return $class; - - //ADOConnection::outp(adodb_pr(get_declared_classes(),true)); - if (!file_exists($file)) ADOConnection::outp("Missing file: $file"); - else ADOConnection::outp("Syntax error in file: $file"); - return false; - } - - /** - * synonym for ADONewConnection for people like me who cannot remember the correct name - */ - function NewADOConnection($db='') - { - $tmp = ADONewConnection($db); - return $tmp; - } - - /** - * Instantiate a new Connection class for a specific database driver. - * - * @param [db] is the database Connection object to create. If undefined, - * use the last database driver that was loaded by ADOLoadCode(). - * - * @return the freshly created instance of the Connection class. - */ - function ADONewConnection($db='') - { - GLOBAL $ADODB_NEWCONNECTION, $ADODB_LASTDB; - - if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); - $errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false; - $false = false; - if (($at = strpos($db,'://')) !== FALSE) { - $origdsn = $db; - $fakedsn = 'fake'.substr($origdsn,$at); - if (($at2 = strpos($origdsn,'@/')) !== FALSE) { - // special handling of oracle, which might not have host - $fakedsn = str_replace('@/','@adodb-fakehost/',$fakedsn); - } - $dsna = @parse_url($fakedsn); - if (!$dsna) { - return $false; - } - $dsna['scheme'] = substr($origdsn,0,$at); - if ($at2 !== FALSE) { - $dsna['host'] = ''; - } - - if (strncmp($origdsn,'pdo',3) == 0) { - $sch = explode('_',$dsna['scheme']); - if (sizeof($sch)>1) { - - $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : ''; - if ($sch[1] == 'sqlite') - $dsna['host'] = rawurlencode($sch[1].':'.rawurldecode($dsna['host'])); - else - $dsna['host'] = rawurlencode($sch[1].':host='.rawurldecode($dsna['host'])); - $dsna['scheme'] = 'pdo'; - } - } - - $db = @$dsna['scheme']; - if (!$db) return $false; - $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : ''; - $dsna['user'] = isset($dsna['user']) ? rawurldecode($dsna['user']) : ''; - $dsna['pass'] = isset($dsna['pass']) ? rawurldecode($dsna['pass']) : ''; - $dsna['path'] = isset($dsna['path']) ? rawurldecode(substr($dsna['path'],1)) : ''; # strip off initial / - - if (isset($dsna['query'])) { - $opt1 = explode('&',$dsna['query']); - foreach($opt1 as $k => $v) { - $arr = explode('=',$v); - $opt[$arr[0]] = isset($arr[1]) ? rawurldecode($arr[1]) : 1; - } - } else $opt = array(); - } - /* - * phptype: Database backend used in PHP (mysql, odbc etc.) - * dbsyntax: Database used with regards to SQL syntax etc. - * protocol: Communication protocol to use (tcp, unix etc.) - * hostspec: Host specification (hostname[:port]) - * database: Database to use on the DBMS server - * username: User name for login - * password: Password for login - */ - if (!empty($ADODB_NEWCONNECTION)) { - $obj = $ADODB_NEWCONNECTION($db); - - } - - if(empty($obj)) { - - if (!isset($ADODB_LASTDB)) $ADODB_LASTDB = ''; - if (empty($db)) $db = $ADODB_LASTDB; - - if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db); - - if (!$db) { - if (isset($origdsn)) $db = $origdsn; - if ($errorfn) { - // raise an error - $ignore = false; - $errorfn('ADONewConnection', 'ADONewConnection', -998, - "could not load the database driver for '$db'", - $db,false,$ignore); - } else - ADOConnection::outp( "

        ADONewConnection: Unable to load database driver '$db'

        ",false); - - return $false; - } - - $cls = 'ADODB_'.$db; - if (!class_exists($cls)) { - adodb_backtrace(); - return $false; - } - - $obj = new $cls(); - } - - # constructor should not fail - if ($obj) { - if ($errorfn) $obj->raiseErrorFn = $errorfn; - if (isset($dsna)) { - if (isset($dsna['port'])) $obj->port = $dsna['port']; - foreach($opt as $k => $v) { - switch(strtolower($k)) { - case 'new': - $nconnect = true; $persist = true; break; - case 'persist': - case 'persistent': $persist = $v; break; - case 'debug': $obj->debug = (integer) $v; break; - #ibase - case 'role': $obj->role = $v; break; - case 'dialect': $obj->dialect = (integer) $v; break; - case 'charset': $obj->charset = $v; $obj->charSet=$v; break; - case 'buffers': $obj->buffers = $v; break; - case 'fetchmode': $obj->SetFetchMode($v); break; - #ado - case 'charpage': $obj->charPage = $v; break; - #mysql, mysqli - case 'clientflags': $obj->clientFlags = $v; break; - #mysql, mysqli, postgres - case 'port': $obj->port = $v; break; - #mysqli - case 'socket': $obj->socket = $v; break; - #oci8 - case 'nls_date_format': $obj->NLS_DATE_FORMAT = $v; break; - case 'cachesecs': $obj->cacheSecs = $v; break; - case 'memcache': - $varr = explode(':',$v); - $vlen = sizeof($varr); - if ($vlen == 0) break; - $obj->memCache = true; - $obj->memCacheHost = explode(',',$varr[0]); - if ($vlen == 1) break; - $obj->memCachePort = $varr[1]; - if ($vlen == 2) break; - $obj->memCacheCompress = $varr[2] ? true : false; - break; - } - } - if (empty($persist)) - $ok = $obj->Connect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); - else if (empty($nconnect)) - $ok = $obj->PConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); - else - $ok = $obj->NConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); - - if (!$ok) return $false; - } - } - return $obj; - } - - - - // $perf == true means called by NewPerfMonitor(), otherwise for data dictionary - function _adodb_getdriver($provider,$drivername,$perf=false) - { - switch ($provider) { - case 'odbtp': if (strncmp('odbtp_',$drivername,6)==0) return substr($drivername,6); - case 'odbc' : if (strncmp('odbc_',$drivername,5)==0) return substr($drivername,5); - case 'ado' : if (strncmp('ado_',$drivername,4)==0) return substr($drivername,4); - case 'native': break; - default: - return $provider; - } - - switch($drivername) { - case 'mysqlt': - case 'mysqli': - $drivername='mysql'; - break; - case 'postgres7': - case 'postgres8': - $drivername = 'postgres'; - break; - case 'firebird15': $drivername = 'firebird'; break; - case 'oracle': $drivername = 'oci8'; break; - case 'access': if ($perf) $drivername = ''; break; - case 'db2' : break; - case 'sapdb' : break; - default: - $drivername = 'generic'; - break; - } - return $drivername; - } - - function NewPerfMonitor(&$conn) - { - $false = false; - $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType,true); - if (!$drivername || $drivername == 'generic') return $false; - include_once(ADODB_DIR.'/adodb-perf.inc.php'); - @include_once(ADODB_DIR."/perf/perf-$drivername.inc.php"); - $class = "Perf_$drivername"; - if (!class_exists($class)) return $false; - $perf = new $class($conn); - - return $perf; - } - - function NewDataDictionary(&$conn,$drivername=false) - { - $false = false; - if (!$drivername) $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType); - - include_once(ADODB_DIR.'/adodb-lib.inc.php'); - include_once(ADODB_DIR.'/adodb-datadict.inc.php'); - $path = ADODB_DIR."/datadict/datadict-$drivername.inc.php"; - - if (!file_exists($path)) { - ADOConnection::outp("Dictionary driver '$path' not available"); - return $false; - } - include_once($path); - $class = "ADODB2_$drivername"; - $dict = new $class(); - $dict->dataProvider = $conn->dataProvider; - $dict->connection = $conn; - $dict->upperName = strtoupper($drivername); - $dict->quote = $conn->nameQuote; - if (!empty($conn->_connectionID)) - $dict->serverInfo = $conn->ServerInfo(); - - return $dict; - } - - - - /* - Perform a print_r, with pre tags for better formatting. - */ - function adodb_pr($var,$as_string=false) - { - if ($as_string) ob_start(); - - if (isset($_SERVER['HTTP_USER_AGENT'])) { - echo "
        \n";print_r($var);echo "
        \n"; - } else - print_r($var); - - if ($as_string) { - $s = ob_get_contents(); - ob_end_clean(); - return $s; - } - } - - /* - Perform a stack-crawl and pretty print it. - - @param printOrArr Pass in a boolean to indicate print, or an $exception->trace array (assumes that print is true then). - @param levels Number of levels to display - */ - function adodb_backtrace($printOrArr=true,$levels=9999,$ishtml=null) - { - global $ADODB_INCLUDED_LIB; - if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); - return _adodb_backtrace($printOrArr,$levels,0,$ishtml); - } - - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/contrib/toxmlrpc.inc.php b/include/limesurvey/classes/adodb/contrib/toxmlrpc.inc.php deleted file mode 100644 index 95557c19..00000000 --- a/include/limesurvey/classes/adodb/contrib/toxmlrpc.inc.php +++ /dev/null @@ -1,183 +0,0 @@ -GetArray()) would work with: - * - ADODB_FETCH_BOTH - * - null values - */ - -/** - * Include the main libraries - */ -@require_once('xmlrpc.inc') OR die(); -if (!defined('ADODB_DIR')) require_once('adodb.inc.php'); - -/** - * Builds an xmlrpc struct value out of an AdoDB recordset - */ -function rs2xmlrpcval(&$adodbrs) { - - $header = rs2xmlrpcval_header($adodbrs); - $body = rs2xmlrpcval_body($adodbrs); - - // put it all together and build final xmlrpc struct - $xmlrpcrs = new xmlrpcval ( array( - "header" => $header, - "body" => $body, - ), "struct"); - - return $xmlrpcrs; - -} - -/** - * Builds an xmlrpc struct value describing an AdoDB recordset - */ -function rs2xmlrpcval_header($adodbrs) -{ - $numfields = $adodbrs->FieldCount(); - $numrecords = $adodbrs->RecordCount(); - - // build structure holding recordset information - $fieldstruct = array(); - for ($i = 0; $i < $numfields; $i++) { - $fld = $adodbrs->FetchField($i); - $fieldarray = array(); - if (isset($fld->name)) - $fieldarray["name"] = new xmlrpcval ($fld->name); - if (isset($fld->type)) - $fieldarray["type"] = new xmlrpcval ($fld->type); - if (isset($fld->max_length)) - $fieldarray["max_length"] = new xmlrpcval ($fld->max_length, "int"); - if (isset($fld->not_null)) - $fieldarray["not_null"] = new xmlrpcval ($fld->not_null, "boolean"); - if (isset($fld->has_default)) - $fieldarray["has_default"] = new xmlrpcval ($fld->has_default, "boolean"); - if (isset($fld->default_value)) - $fieldarray["default_value"] = new xmlrpcval ($fld->default_value); - $fieldstruct[$i] = new xmlrpcval ($fieldarray, "struct"); - } - $fieldcount = new xmlrpcval ($numfields, "int"); - $recordcount = new xmlrpcval ($numrecords, "int"); - $sql = new xmlrpcval ($adodbrs->sql); - $fieldinfo = new xmlrpcval ($fieldstruct, "array"); - - $header = new xmlrpcval ( array( - "fieldcount" => $fieldcount, - "recordcount" => $recordcount, - "sql" => $sql, - "fieldinfo" => $fieldinfo - ), "struct"); - - return $header; -} - -/** - * Builds an xmlrpc struct value out of an AdoDB recordset - * (data values only, no data definition) - */ -function rs2xmlrpcval_body($adodbrs) -{ - $numfields = $adodbrs->FieldCount(); - - // build structure containing recordset data - $adodbrs->MoveFirst(); - $rows = array(); - while (!$adodbrs->EOF) { - $columns = array(); - // This should work on all cases of fetch mode: assoc, num, both or default - if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount()) - for ($i = 0; $i < $numfields; $i++) - if ($adodbrs->fields[$i] === null) - $columns[$i] = new xmlrpcval (''); - else - $columns[$i] = xmlrpc_encode ($adodbrs->fields[$i]); - else - foreach ($adodbrs->fields as $val) - if ($val === null) - $columns[] = new xmlrpcval (''); - else - $columns[] = xmlrpc_encode ($val); - - $rows[] = new xmlrpcval ($columns, "array"); - - $adodbrs->MoveNext(); - } - $body = new xmlrpcval ($rows, "array"); - - return $body; -} - -/** - * Returns an xmlrpc struct value as string out of an AdoDB recordset - */ -function rs2xmlrpcstring (&$adodbrs) { - $xmlrpc = rs2xmlrpcval ($adodbrs); - if ($xmlrpc) - return $xmlrpc->serialize(); - else - return null; -} - -/** - * Given a well-formed xmlrpc struct object returns an AdoDB object - * - * @todo add some error checking on the input value - */ -function xmlrpcval2rs (&$xmlrpcval) { - - $fields_array = array(); - $data_array = array(); - - // rebuild column information - $header = $xmlrpcval->structmem('header'); - - $numfields = $header->structmem('fieldcount'); - $numfields = $numfields->scalarval(); - $numrecords = $header->structmem('recordcount'); - $numrecords = $numrecords->scalarval(); - $sqlstring = $header->structmem('sql'); - $sqlstring = $sqlstring->scalarval(); - - $fieldinfo = $header->structmem('fieldinfo'); - for ($i = 0; $i < $numfields; $i++) { - $temp = $fieldinfo->arraymem($i); - $fld = new ADOFieldObject(); - while (list($key,$value) = $temp->structeach()) { - if ($key == "name") $fld->name = $value->scalarval(); - if ($key == "type") $fld->type = $value->scalarval(); - if ($key == "max_length") $fld->max_length = $value->scalarval(); - if ($key == "not_null") $fld->not_null = $value->scalarval(); - if ($key == "has_default") $fld->has_default = $value->scalarval(); - if ($key == "default_value") $fld->default_value = $value->scalarval(); - } // while - $fields_array[] = $fld; - } // for - - // fetch recordset information into php array - $body = $xmlrpcval->structmem('body'); - for ($i = 0; $i < $numrecords; $i++) { - $data_array[$i]= array(); - $xmlrpcrs_row = $body->arraymem($i); - for ($j = 0; $j < $numfields; $j++) { - $temp = $xmlrpcrs_row->arraymem($j); - $data_array[$i][$j] = $temp->scalarval(); - } // for j - } // for i - - // finally build in-memory recordset object and return it - $rs = new ADORecordSet_array(); - $rs->InitArrayFields($data_array,$fields_array); - return $rs; - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-access.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-access.inc.php deleted file mode 100644 index eb0b0201..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-access.inc.php +++ /dev/null @@ -1,96 +0,0 @@ -debug) ADOConnection::outp("Warning: Access does not supported DEFAULT values (field $fname)"); - } - if ($fnotnull) $suffix .= ' NOT NULL'; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - - function CreateDatabase($dbname,$options=false) - { - return array(); - } - - - function SetSchema($schema) - { - } - - function AlterColumnSQL($tabname, $flds) - { - if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported"); - return array(); - } - - - function DropColumnSQL($tabname, $flds) - { - if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); - return array(); - } - -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-db2.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-db2.inc.php deleted file mode 100644 index 6491c998..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-db2.inc.php +++ /dev/null @@ -1,144 +0,0 @@ -debug) ADOConnection::outp("AlterColumnSQL not supported"); - return array(); - } - - - function DropColumnSQL($tabname, $flds) - { - if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); - return array(); - } - - - function ChangeTableSQL($tablename, $flds, $tableoptions = false) - { - - /** - Allow basic table changes to DB2 databases - DB2 will fatally reject changes to non character columns - - */ - - $validTypes = array("CHAR","VARC"); - $invalidTypes = array("BIGI","BLOB","CLOB","DATE", "DECI","DOUB", "INTE", "REAL","SMAL", "TIME"); - // check table exists - $cols = $this->MetaColumns($tablename); - if ( empty($cols)) { - return $this->CreateTableSQL($tablename, $flds, $tableoptions); - } - - // already exists, alter table instead - list($lines,$pkey) = $this->_GenFields($flds); - $alter = 'ALTER TABLE ' . $this->TableName($tablename); - $sql = array(); - - foreach ( $lines as $id => $v ) { - if ( isset($cols[$id]) && is_object($cols[$id]) ) { - /** - If the first field of $v is the fieldname, and - the second is the field type/size, we assume its an - attempt to modify the column size, so check that it is allowed - $v can have an indeterminate number of blanks between the - fields, so account for that too - */ - $vargs = explode(' ' , $v); - // assume that $vargs[0] is the field name. - $i=0; - // Find the next non-blank value; - for ($i=1;$ialterCol . ' ' . $v; - } else { - $sql[] = $alter . $this->addCol . ' ' . $v; - } - } - - return $sql; - } - -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-firebird.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-firebird.inc.php deleted file mode 100644 index de502bba..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-firebird.inc.php +++ /dev/null @@ -1,155 +0,0 @@ -connection) ) { - return $name; - } - - $quote = $this->connection->nameQuote; - - // if name is of the form `name`, quote it - if ( preg_match('/^`(.+)`$/', $name, $matches) ) { - return $quote . $matches[1] . $quote; - } - - // if name contains special characters, quote it - if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) { - return $quote . $name . $quote; - } - - return $quote . $name . $quote; - } - - function CreateDatabase($dbname, $options=false) - { - $options = $this->_Options($options); - $sql = array(); - - $sql[] = "DECLARE EXTERNAL FUNCTION LOWER CSTRING(80) RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf'"; - - return $sql; - } - - function _DropAutoIncrement($t) - { - if (strpos($t,'.') !== false) { - $tarr = explode('.',$t); - return 'DROP GENERATOR '.$tarr[0].'."gen_'.$tarr[1].'"'; - } - return 'DROP GENERATOR "GEN_'.$t; - } - - - function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - $suffix = ''; - - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fnotnull) $suffix .= ' NOT NULL'; - if ($fautoinc) $this->seqField = $fname; - if ($fconstraint) $suffix .= ' '.$fconstraint; - - return $suffix; - } - - /* - CREATE or replace TRIGGER jaddress_insert - before insert on jaddress - for each row - begin - IF ( NEW."seqField" IS NULL OR NEW."seqField" = 0 ) THEN - NEW."seqField" = GEN_ID("GEN_tabname", 1); - end; - */ - function _Triggers($tabname,$tableoptions) - { - if (!$this->seqField) return array(); - - $tab1 = preg_replace( '/"/', '', $tabname ); - if ($this->schema) { - $t = strpos($tab1,'.'); - if ($t !== false) $tab = substr($tab1,$t+1); - else $tab = $tab1; - $seqField = $this->seqField; - $seqname = $this->schema.'.'.$this->seqPrefix.$tab; - $trigname = $this->schema.'.trig_'.$this->seqPrefix.$tab; - } else { - $seqField = $this->seqField; - $seqname = $this->seqPrefix.$tab1; - $trigname = 'trig_'.$seqname; - } - if (isset($tableoptions['REPLACE'])) - { $sql[] = "DROP GENERATOR \"$seqname\""; - $sql[] = "CREATE GENERATOR \"$seqname\""; - $sql[] = "ALTER TRIGGER \"$trigname\" BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END"; - } - else - { $sql[] = "CREATE GENERATOR \"$seqname\""; - $sql[] = "CREATE TRIGGER \"$trigname\" FOR $tabname BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END"; - } - - $this->seqField = false; - return $sql; - } - -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-generic.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-generic.inc.php deleted file mode 100644 index ac1c6aa9..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-generic.inc.php +++ /dev/null @@ -1,126 +0,0 @@ -debug) ADOConnection::outp("AlterColumnSQL not supported"); - return array(); - } - - - function DropColumnSQL($tabname, $flds) - { - if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); - return array(); - } - -} - -/* - //db2 - function ActualType($meta) - { - switch($meta) { - case 'C': return 'VARCHAR'; - case 'X': return 'VARCHAR'; - - case 'C2': return 'VARCHAR'; // up to 32K - case 'X2': return 'VARCHAR'; - - case 'B': return 'BLOB'; - - case 'D': return 'DATE'; - case 'T': return 'TIMESTAMP'; - - case 'L': return 'SMALLINT'; - case 'I': return 'INTEGER'; - case 'I1': return 'SMALLINT'; - case 'I2': return 'SMALLINT'; - case 'I4': return 'INTEGER'; - case 'I8': return 'BIGINT'; - - case 'F': return 'DOUBLE'; - case 'N': return 'DECIMAL'; - default: - return $meta; - } - } - - // ifx - function ActualType($meta) - { - switch($meta) { - case 'C': return 'VARCHAR';// 255 - case 'X': return 'TEXT'; - - case 'C2': return 'NVARCHAR'; - case 'X2': return 'TEXT'; - - case 'B': return 'BLOB'; - - case 'D': return 'DATE'; - case 'T': return 'DATETIME'; - - case 'L': return 'SMALLINT'; - case 'I': return 'INTEGER'; - case 'I1': return 'SMALLINT'; - case 'I2': return 'SMALLINT'; - case 'I4': return 'INTEGER'; - case 'I8': return 'DECIMAL(20)'; - - case 'F': return 'FLOAT'; - case 'N': return 'DECIMAL'; - default: - return $meta; - } - } - */ -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-ibase.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-ibase.inc.php deleted file mode 100644 index 29f5b293..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-ibase.inc.php +++ /dev/null @@ -1,68 +0,0 @@ -debug) ADOConnection::outp("AlterColumnSQL not supported"); - return array(); - } - - - function DropColumnSQL($tabname, $flds) - { - if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); - return array(); - } - -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-informix.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-informix.inc.php deleted file mode 100644 index c603a613..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-informix.inc.php +++ /dev/null @@ -1,81 +0,0 @@ -debug) ADOConnection::outp("AlterColumnSQL not supported"); - return array(); - } - - - function DropColumnSQL($tabname, $flds) - { - if ($this->debug) ADOConnection::outp("DropColumnSQL not supported"); - return array(); - } - - // return string must begin with space - function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - if ($fautoinc) { - $ftype = 'SERIAL'; - return ''; - } - $suffix = ''; - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fnotnull) $suffix .= ' NOT NULL'; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-mssql.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-mssql.inc.php deleted file mode 100644 index 81bbfcac..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-mssql.inc.php +++ /dev/null @@ -1,284 +0,0 @@ -type; - $len = $fieldobj->max_length; - } - - $len = -1; // mysql max_length is not accurate - switch (strtoupper($t)) { - case 'R': - case 'INT': - case 'INTEGER': return 'I'; - case 'BIT': - case 'TINYINT': return 'I1'; - case 'SMALLINT': return 'I2'; - case 'BIGINT': return 'I8'; - case 'SMALLDATETIME': return 'T'; - case 'REAL': - case 'FLOAT': return 'F'; - default: return parent::MetaType($t,$len,$fieldobj); - } - } - - function ActualType($meta) - { - switch(strtoupper($meta)) { - - case 'C': return 'VARCHAR'; - case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT'; - case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle - case 'C2': return 'NVARCHAR'; - case 'X2': return 'NTEXT'; - - case 'B': return 'IMAGE'; - - case 'D': return 'DATE'; - - case 'TS': - case 'T': return 'DATETIME'; - case 'L': return 'BIT'; - - case 'R': - case 'I': return 'INT'; - case 'I1': return 'TINYINT'; - case 'I2': return 'SMALLINT'; - case 'I4': return 'INT'; - case 'I8': return 'BIGINT'; - - case 'F': return 'REAL'; - case 'N': return 'NUMERIC'; - default: - return $meta; - } - } - - - function AddColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $f = array(); - list($lines,$pkey) = $this->_GenFields($flds); - $s = "ALTER TABLE $tabname $this->addCol"; - foreach($lines as $v) { - $f[] = "\n $v"; - } - $s .= implode(', ',$f); - $sql[] = $s; - return $sql; - } - - /* - function AlterColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $sql = array(); - list($lines,$pkey) = $this->_GenFields($flds); - foreach($lines as $v) { - $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; - } - - return $sql; - } - */ - - function DropColumnSQL($tabname, $flds, $tableflds='', $tableoptions='') - { - $tabname = $this->TableName ($tabname); - if (!is_array($flds)) - $flds = explode(',',$flds); - $f = array(); - $s = 'ALTER TABLE ' . $tabname; - foreach($flds as $v) { - $f[] = "\n$this->dropCol ".$this->NameQuote($v); - } - $s .= implode(', ',$f); - $sql[] = $s; - return $sql; - } - - // return string must begin with space - function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - $suffix = ''; - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fautoinc) $suffix .= ' IDENTITY(1,1)'; - if ($fnotnull) $suffix .= ' NOT NULL'; - else if ($suffix == '') $suffix .= ' NULL'; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - - /* - CREATE TABLE - [ database_name.[ owner ] . | owner. ] table_name - ( { < column_definition > - | column_name AS computed_column_expression - | < table_constraint > ::= [ CONSTRAINT constraint_name ] } - - | [ { PRIMARY KEY | UNIQUE } [ ,...n ] - ) - - [ ON { filegroup | DEFAULT } ] - [ TEXTIMAGE_ON { filegroup | DEFAULT } ] - - < column_definition > ::= { column_name data_type } - [ COLLATE < collation_name > ] - [ [ DEFAULT constant_expression ] - | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] - ] - [ ROWGUIDCOL] - [ < column_constraint > ] [ ...n ] - - < column_constraint > ::= [ CONSTRAINT constraint_name ] - { [ NULL | NOT NULL ] - | [ { PRIMARY KEY | UNIQUE } - [ CLUSTERED | NONCLUSTERED ] - [ WITH FILLFACTOR = fillfactor ] - [ON {filegroup | DEFAULT} ] ] - ] - | [ [ FOREIGN KEY ] - REFERENCES ref_table [ ( ref_column ) ] - [ ON DELETE { CASCADE | NO ACTION } ] - [ ON UPDATE { CASCADE | NO ACTION } ] - [ NOT FOR REPLICATION ] - ] - | CHECK [ NOT FOR REPLICATION ] - ( logical_expression ) - } - - < table_constraint > ::= [ CONSTRAINT constraint_name ] - { [ { PRIMARY KEY | UNIQUE } - [ CLUSTERED | NONCLUSTERED ] - { ( column [ ASC | DESC ] [ ,...n ] ) } - [ WITH FILLFACTOR = fillfactor ] - [ ON { filegroup | DEFAULT } ] - ] - | FOREIGN KEY - [ ( column [ ,...n ] ) ] - REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] - [ ON DELETE { CASCADE | NO ACTION } ] - [ ON UPDATE { CASCADE | NO ACTION } ] - [ NOT FOR REPLICATION ] - | CHECK [ NOT FOR REPLICATION ] - ( search_conditions ) - } - - - */ - - /* - CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name - ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) - [ WITH < index_option > [ ,...n] ] - [ ON filegroup ] - < index_option > :: = - { PAD_INDEX | - FILLFACTOR = fillfactor | - IGNORE_DUP_KEY | - DROP_EXISTING | - STATISTICS_NORECOMPUTE | - SORT_IN_TEMPDB - } - */ - function _IndexSQL($idxname, $tabname, $flds, $idxoptions) - { - $sql = array(); - - if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { - $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); - if ( isset($idxoptions['DROP']) ) - return $sql; - } - - if ( empty ($flds) ) { - return $sql; - } - - $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; - $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; - - if ( is_array($flds) ) - $flds = implode(', ',$flds); - $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; - - if ( isset($idxoptions[$this->upperName]) ) - $s .= $idxoptions[$this->upperName]; - - - $sql[] = $s; - - return $sql; - } - - - function _GetSize($ftype, $ty, $fsize, $fprec) - { - switch ($ftype) { - case 'INT': - case 'SMALLINT': - case 'TINYINT': - case 'BIGINT': - return $ftype; - } - if ($ty == 'T') return $ftype; - return parent::_GetSize($ftype, $ty, $fsize, $fprec); - - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-mssqlnative.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-mssqlnative.inc.php deleted file mode 100644 index c2504678..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-mssqlnative.inc.php +++ /dev/null @@ -1,282 +0,0 @@ -type; - $len = $fieldobj->max_length; - } - - $len = -1; // mysql max_length is not accurate - switch (strtoupper($t)) { - case 'R': - case 'INT': - case 'INTEGER': return 'I'; - case 'BIT': - case 'TINYINT': return 'I1'; - case 'SMALLINT': return 'I2'; - case 'BIGINT': return 'I8'; - - case 'REAL': - case 'FLOAT': return 'F'; - default: return parent::MetaType($t,$len,$fieldobj); - } - } - - function ActualType($meta) - { - switch(strtoupper($meta)) { - - case 'C': return 'VARCHAR'; - case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT'; - case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle - case 'C2': return 'NVARCHAR'; - case 'X2': return 'NTEXT'; - - case 'B': return 'IMAGE'; - - case 'D': return 'DATE'; - case 'T': return 'DATETIME'; - case 'L': return 'BIT'; - - case 'R': - case 'I': return 'INT'; - case 'I1': return 'TINYINT'; - case 'I2': return 'SMALLINT'; - case 'I4': return 'INT'; - case 'I8': return 'BIGINT'; - - case 'F': return 'REAL'; - case 'N': return 'NUMERIC'; - default: - return $meta; - } - } - - - function AddColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $f = array(); - list($lines,$pkey) = $this->_GenFields($flds); - $s = "ALTER TABLE $tabname $this->addCol"; - foreach($lines as $v) { - $f[] = "\n $v"; - } - $s .= implode(', ',$f); - $sql[] = $s; - return $sql; - } - - /* - function AlterColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $sql = array(); - list($lines,$pkey) = $this->_GenFields($flds); - foreach($lines as $v) { - $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; - } - - return $sql; - } - */ - - function DropColumnSQL($tabname, $flds, $tableflds='', $tableoptions='') - { - $tabname = $this->TableName ($tabname); - if (!is_array($flds)) - $flds = explode(',',$flds); - $f = array(); - $s = 'ALTER TABLE ' . $tabname; - foreach($flds as $v) { - $f[] = "\n$this->dropCol ".$this->NameQuote($v); - } - $s .= implode(', ',$f); - $sql[] = $s; - return $sql; - } - - // return string must begin with space - function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - $suffix = ''; - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fautoinc) $suffix .= ' IDENTITY(1,1)'; - if ($fnotnull) $suffix .= ' NOT NULL'; - else if ($suffix == '') $suffix .= ' NULL'; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - - /* - CREATE TABLE - [ database_name.[ owner ] . | owner. ] table_name - ( { < column_definition > - | column_name AS computed_column_expression - | < table_constraint > ::= [ CONSTRAINT constraint_name ] } - - | [ { PRIMARY KEY | UNIQUE } [ ,...n ] - ) - - [ ON { filegroup | DEFAULT } ] - [ TEXTIMAGE_ON { filegroup | DEFAULT } ] - - < column_definition > ::= { column_name data_type } - [ COLLATE < collation_name > ] - [ [ DEFAULT constant_expression ] - | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] - ] - [ ROWGUIDCOL] - [ < column_constraint > ] [ ...n ] - - < column_constraint > ::= [ CONSTRAINT constraint_name ] - { [ NULL | NOT NULL ] - | [ { PRIMARY KEY | UNIQUE } - [ CLUSTERED | NONCLUSTERED ] - [ WITH FILLFACTOR = fillfactor ] - [ON {filegroup | DEFAULT} ] ] - ] - | [ [ FOREIGN KEY ] - REFERENCES ref_table [ ( ref_column ) ] - [ ON DELETE { CASCADE | NO ACTION } ] - [ ON UPDATE { CASCADE | NO ACTION } ] - [ NOT FOR REPLICATION ] - ] - | CHECK [ NOT FOR REPLICATION ] - ( logical_expression ) - } - - < table_constraint > ::= [ CONSTRAINT constraint_name ] - { [ { PRIMARY KEY | UNIQUE } - [ CLUSTERED | NONCLUSTERED ] - { ( column [ ASC | DESC ] [ ,...n ] ) } - [ WITH FILLFACTOR = fillfactor ] - [ ON { filegroup | DEFAULT } ] - ] - | FOREIGN KEY - [ ( column [ ,...n ] ) ] - REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] - [ ON DELETE { CASCADE | NO ACTION } ] - [ ON UPDATE { CASCADE | NO ACTION } ] - [ NOT FOR REPLICATION ] - | CHECK [ NOT FOR REPLICATION ] - ( search_conditions ) - } - - - */ - - /* - CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name - ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) - [ WITH < index_option > [ ,...n] ] - [ ON filegroup ] - < index_option > :: = - { PAD_INDEX | - FILLFACTOR = fillfactor | - IGNORE_DUP_KEY | - DROP_EXISTING | - STATISTICS_NORECOMPUTE | - SORT_IN_TEMPDB - } - */ - function _IndexSQL($idxname, $tabname, $flds, $idxoptions) - { - $sql = array(); - - if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { - $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); - if ( isset($idxoptions['DROP']) ) - return $sql; - } - - if ( empty ($flds) ) { - return $sql; - } - - $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; - $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; - - if ( is_array($flds) ) - $flds = implode(', ',$flds); - $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; - - if ( isset($idxoptions[$this->upperName]) ) - $s .= $idxoptions[$this->upperName]; - - - $sql[] = $s; - - return $sql; - } - - - function _GetSize($ftype, $ty, $fsize, $fprec) - { - switch ($ftype) { - case 'INT': - case 'SMALLINT': - case 'TINYINT': - case 'BIGINT': - return $ftype; - } - if ($ty == 'T') return $ftype; - return parent::_GetSize($ftype, $ty, $fsize, $fprec); - - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-mysql.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-mysql.inc.php deleted file mode 100644 index 0ffef606..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-mysql.inc.php +++ /dev/null @@ -1,182 +0,0 @@ -type; - $len = $fieldobj->max_length; - } - $is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->auto_increment; - - $len = -1; // mysql max_length is not accurate - switch (strtoupper($t)) { - case 'STRING': - case 'CHAR': - case 'VARCHAR': - case 'TINYBLOB': - case 'TINYTEXT': - case 'ENUM': - case 'SET': - if ($len <= $this->blobSize) return 'C'; - - case 'TEXT': - case 'LONGTEXT': - case 'MEDIUMTEXT': - return 'X'; - - // php_mysql extension always returns 'blob' even if 'text' - // so we have to check whether binary... - case 'IMAGE': - case 'LONGBLOB': - case 'BLOB': - case 'MEDIUMBLOB': - return !empty($fieldobj->binary) ? 'B' : 'X'; - - case 'YEAR': - case 'DATE': return 'D'; - - case 'TIME': - case 'DATETIME': - case 'TIMESTAMP': return 'T'; - - case 'FLOAT': - case 'DOUBLE': - return 'F'; - - case 'INT': - case 'INTEGER': return $is_serial ? 'R' : 'I'; - case 'TINYINT': return $is_serial ? 'R' : 'I1'; - case 'SMALLINT': return $is_serial ? 'R' : 'I2'; - case 'MEDIUMINT': return $is_serial ? 'R' : 'I4'; - case 'BIGINT': return $is_serial ? 'R' : 'I8'; - default: return 'N'; - } - } - - function ActualType($meta) - { - switch(strtoupper($meta)) { - case 'C': return 'VARCHAR'; - case 'XL':return 'LONGTEXT'; - case 'X': return 'TEXT'; - - case 'C2': return 'VARCHAR'; - case 'X2': return 'LONGTEXT'; - - case 'B': return 'LONGBLOB'; - - case 'D': return 'DATE'; - case 'TS': - case 'T': return 'DATETIME'; - case 'L': return 'TINYINT'; - - case 'R': - case 'I4': - case 'I': return 'INTEGER'; - case 'I1': return 'TINYINT'; - case 'I2': return 'SMALLINT'; - case 'I8': return 'BIGINT'; - - case 'F': return 'DOUBLE'; - case 'N': return 'NUMERIC'; - default: - return $meta; - } - } - - // return string must begin with space - function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - $suffix = ''; - if ($funsigned) $suffix .= ' UNSIGNED'; - if ($fnotnull) $suffix .= ' NOT NULL'; - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fautoinc) $suffix .= ' AUTO_INCREMENT'; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - - /* - CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] - [table_options] [select_statement] - create_definition: - col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] - [PRIMARY KEY] [reference_definition] - or PRIMARY KEY (index_col_name,...) - or KEY [index_name] (index_col_name,...) - or INDEX [index_name] (index_col_name,...) - or UNIQUE [INDEX] [index_name] (index_col_name,...) - or FULLTEXT [INDEX] [index_name] (index_col_name,...) - or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) - [reference_definition] - or CHECK (expr) - */ - - /* - CREATE [UNIQUE|FULLTEXT] INDEX index_name - ON tbl_name (col_name[(length)],... ) - */ - - function _IndexSQL($idxname, $tabname, $flds, $idxoptions) - { - $sql = array(); - - if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { - if ($this->alterTableAddIndex) $sql[] = "ALTER TABLE $tabname DROP INDEX $idxname"; - else $sql[] = sprintf($this->dropIndex, $idxname, $tabname); - - if ( isset($idxoptions['DROP']) ) - return $sql; - } - - if ( empty ($flds) ) { - return $sql; - } - - if (isset($idxoptions['FULLTEXT'])) { - $unique = ' FULLTEXT'; - } elseif (isset($idxoptions['UNIQUE'])) { - $unique = ' UNIQUE'; - } else { - $unique = ''; - } - - if ( is_array($flds) ) $flds = implode(', ',$flds); - - if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname "; - else $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname; - - $s .= ' (' . $flds . ')'; - - if ( isset($idxoptions[$this->upperName]) ) - $s .= $idxoptions[$this->upperName]; - - $sql[] = $s; - - return $sql; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-oci8.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-oci8.inc.php deleted file mode 100644 index 1999a021..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-oci8.inc.php +++ /dev/null @@ -1,297 +0,0 @@ -type; - $len = $fieldobj->max_length; - } - switch (strtoupper($t)) { - case 'VARCHAR': - case 'VARCHAR2': - case 'CHAR': - case 'VARBINARY': - case 'BINARY': - if (isset($this) && $len <= $this->blobSize) return 'C'; - return 'X'; - - case 'NCHAR': - case 'NVARCHAR2': - case 'NVARCHAR': - if (isset($this) && $len <= $this->blobSize) return 'C2'; - return 'X2'; - - case 'NCLOB': - case 'CLOB': - return 'XL'; - - case 'LONG RAW': - case 'LONG VARBINARY': - case 'BLOB': - return 'B'; - - case 'TIMESTAMP': - return 'TS'; - - case 'DATE': - return 'T'; - - case 'INT': - case 'SMALLINT': - case 'INTEGER': - return 'I'; - - default: - return 'N'; - } - } - - function ActualType($meta) - { - switch($meta) { - case 'C': return 'VARCHAR'; - case 'X': return $this->typeX; - case 'XL': return $this->typeXL; - - case 'C2': return 'NVARCHAR2'; - case 'X2': return 'NVARCHAR2(4000)'; - - case 'B': return 'BLOB'; - - case 'TS': - return 'TIMESTAMP'; - - case 'D': - case 'T': return 'DATE'; - case 'L': return 'NUMBER(1)'; - case 'I1': return 'NUMBER(3)'; - case 'I2': return 'NUMBER(5)'; - case 'I': - case 'I4': return 'NUMBER(10)'; - - case 'I8': return 'NUMBER(20)'; - case 'F': return 'NUMBER'; - case 'N': return 'NUMBER'; - case 'R': return 'NUMBER(20)'; - default: - return $meta; - } - } - - function CreateDatabase($dbname, $options=false) - { - $options = $this->_Options($options); - $password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger'; - $tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : ''; - $sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace; - $sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname"; - - return $sql; - } - - function AddColumnSQL($tabname, $flds) - { - $f = array(); - list($lines,$pkey) = $this->_GenFields($flds); - $s = "ALTER TABLE $tabname ADD ("; - foreach($lines as $v) { - $f[] = "\n $v"; - } - - $s .= implode(', ',$f).')'; - $sql[] = $s; - return $sql; - } - - function AlterColumnSQL($tabname, $flds) - { - $f = array(); - list($lines,$pkey) = $this->_GenFields($flds); - $s = "ALTER TABLE $tabname MODIFY("; - foreach($lines as $v) { - $f[] = "\n $v"; - } - $s .= implode(', ',$f).')'; - $sql[] = $s; - return $sql; - } - - function DropColumnSQL($tabname, $flds) - { - if (!is_array($flds)) $flds = explode(',',$flds); - foreach ($flds as $k => $v) $flds[$k] = $this->NameQuote($v); - - $sql = array(); - $s = "ALTER TABLE $tabname DROP("; - $s .= implode(', ',$flds).') CASCADE CONSTRAINTS'; - $sql[] = $s; - return $sql; - } - - function _DropAutoIncrement($t) - { - if (strpos($t,'.') !== false) { - $tarr = explode('.',$t); - return "drop sequence ".$tarr[0].".seq_".$tarr[1]; - } - return "drop sequence seq_".$t; - } - - // return string must begin with space - function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - $suffix = ''; - - if ($fdefault == "''" && $fnotnull) {// this is null in oracle - $fnotnull = false; - if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle"); - } - - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fnotnull) $suffix .= ' NOT NULL'; - - if ($fautoinc) $this->seqField = $fname; - if ($fconstraint) $suffix .= ' '.$fconstraint; - - return $suffix; - } - - /* - CREATE or replace TRIGGER jaddress_insert - before insert on jaddress - for each row - begin - select seqaddress.nextval into :new.A_ID from dual; - end; - */ - function _Triggers($tabname,$tableoptions) - { - if (!$this->seqField) return array(); - - if ($this->schema) { - $t = strpos($tabname,'.'); - if ($t !== false) $tab = substr($tabname,$t+1); - else $tab = $tabname; - $seqname = $this->schema.'.'.$this->seqPrefix.$tab; - $trigname = $this->schema.'.'.$this->trigPrefix.$this->seqPrefix.$tab; - } else { - $seqname = $this->seqPrefix.$tabname; - $trigname = $this->trigPrefix.$seqname; - } - - if (strlen($seqname) > 30) { - $seqname = $this->seqPrefix.uniqid(''); - } // end if - if (strlen($trigname) > 30) { - $trigname = $this->trigPrefix.uniqid(''); - } // end if - - if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname"; - $seqCache = ''; - if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];} - $seqIncr = ''; - if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];} - $seqStart = ''; - if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];} - $sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache"; - $sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;"; - - $this->seqField = false; - return $sql; - } - - /* - CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] - [table_options] [select_statement] - create_definition: - col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] - [PRIMARY KEY] [reference_definition] - or PRIMARY KEY (index_col_name,...) - or KEY [index_name] (index_col_name,...) - or INDEX [index_name] (index_col_name,...) - or UNIQUE [INDEX] [index_name] (index_col_name,...) - or FULLTEXT [INDEX] [index_name] (index_col_name,...) - or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) - [reference_definition] - or CHECK (expr) - */ - - - - function _IndexSQL($idxname, $tabname, $flds,$idxoptions) - { - $sql = array(); - - if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { - $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); - if ( isset($idxoptions['DROP']) ) - return $sql; - } - - if ( empty ($flds) ) { - return $sql; - } - - if (isset($idxoptions['BITMAP'])) { - $unique = ' BITMAP'; - } elseif (isset($idxoptions['UNIQUE'])) { - $unique = ' UNIQUE'; - } else { - $unique = ''; - } - - if ( is_array($flds) ) - $flds = implode(', ',$flds); - $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; - - if ( isset($idxoptions[$this->upperName]) ) - $s .= $idxoptions[$this->upperName]; - - if (isset($idxoptions['oci8'])) - $s .= $idxoptions['oci8']; - - - $sql[] = $s; - - return $sql; - } - - function GetCommentSQL($table,$col) - { - $table = $this->connection->qstr($table); - $col = $this->connection->qstr($col); - return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col"; - } - - function SetCommentSQL($table,$col,$cmt) - { - $cmt = $this->connection->qstr($cmt); - return "COMMENT ON COLUMN $table.$col IS $cmt"; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-postgres.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-postgres.inc.php deleted file mode 100644 index 154374f1..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-postgres.inc.php +++ /dev/null @@ -1,448 +0,0 @@ -type; - $len = $fieldobj->max_length; - } - $is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->unique && - $fieldobj->has_default && substr($fieldobj->default_value,0,8) == 'nextval('; - - switch (strtoupper($t)) { - case 'INTERVAL': - case 'CHAR': - case 'CHARACTER': - case 'VARCHAR': - case 'NAME': - case 'BPCHAR': - if ($len <= $this->blobSize) return 'C'; - - case 'TEXT': - return 'X'; - - case 'IMAGE': // user defined type - case 'BLOB': // user defined type - case 'BIT': // This is a bit string, not a single bit, so don't return 'L' - case 'VARBIT': - case 'BYTEA': - return 'B'; - - case 'BOOL': - case 'BOOLEAN': - return 'L'; - - case 'DATE': - return 'D'; - - case 'TIME': - case 'DATETIME': - case 'TIMESTAMP': - case 'TIMESTAMPTZ': - return 'T'; - - case 'INTEGER': return !$is_serial ? 'I' : 'R'; - case 'SMALLINT': - case 'INT2': return !$is_serial ? 'I2' : 'R'; - case 'INT4': return !$is_serial ? 'I4' : 'R'; - case 'BIGINT': - case 'INT8': return !$is_serial ? 'I8' : 'R'; - - case 'OID': - case 'SERIAL': - return 'R'; - - case 'FLOAT4': - case 'FLOAT8': - case 'DOUBLE PRECISION': - case 'REAL': - return 'F'; - - default: - return 'N'; - } - } - - function ActualType($meta) - { - switch($meta) { - case 'C': return 'VARCHAR'; - case 'XL': - case 'X': return 'TEXT'; - - case 'C2': return 'VARCHAR'; - case 'X2': return 'TEXT'; - - case 'B': return 'BYTEA'; - - case 'D': return 'DATE'; - case 'TS': - case 'T': return 'TIMESTAMP'; - - case 'L': return 'BOOLEAN'; - case 'I': return 'INTEGER'; - case 'I1': return 'SMALLINT'; - case 'I2': return 'INT2'; - case 'I4': return 'INT4'; - case 'I8': return 'INT8'; - - case 'F': return 'FLOAT8'; - case 'N': return 'NUMERIC'; - default: - return $meta; - } - } - - /** - * Adding a new Column - * - * reimplementation of the default function as postgres does NOT allow to set the default in the same statement - * - * @param string $tabname table-name - * @param string $flds column-names and types for the changed columns - * @return array with SQL strings - */ - function AddColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $sql = array(); - list($lines,$pkey) = $this->_GenFields($flds); - $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' '; - foreach($lines as $v) { - if (($not_null = preg_match('/NOT NULL/i',$v))) { - $v = preg_replace('/NOT NULL/i','',$v); - } - if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) { - list(,$colname,$default) = $matches; - $sql[] = $alter . str_replace('DEFAULT '.$default,'',$v); - $sql[] = 'UPDATE '.$tabname.' SET '.$colname.'='.$default; - $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default; - } else { - $sql[] = $alter . $v; - } - if ($not_null) { - list($colname) = explode(' ',$v); - $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL'; - } - } - return $sql; - } - - - function DropIndexSQL ($idxname, $tabname = NULL) - { - return array(sprintf($this->dropIndex, $this->TableName($idxname), $this->TableName($tabname))); - } - - /** - * Change the definition of one column - * - * Postgres can't do that on it's own, you need to supply the complete defintion of the new table, - * to allow, recreating the table and copying the content over to the new table - * @param string $tabname table-name - * @param string $flds column-name and type for the changed column - * @param string $tableflds complete defintion of the new table, eg. for postgres, default '' - * @param array/ $tableoptions options for the new table see CreateTableSQL, default '' - * @return array with SQL strings - */ - /* - function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') - { - if (!$tableflds) { - if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL"); - return array(); - } - return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions); - }*/ - - function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') - { - // Check if alter single column datatype available - works with 8.0+ - $has_alter_column = 8.0 <= (float) @$this->serverInfo['version']; - - if ($has_alter_column) { - $tabname = $this->TableName($tabname); - $sql = array(); - list($lines,$pkey) = $this->_GenFields($flds); - $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' '; - foreach($lines as $v) { - if ($not_null = preg_match('/NOT NULL/i',$v)) { - $v = preg_replace('/NOT NULL/i','',$v); - } - // this next block doesn't work - there is no way that I can see to - // explicitly ask a column to be null using $flds - else if ($set_null = preg_match('/NULL/i',$v)) { - // if they didn't specify not null, see if they explicitely asked for null - $v = preg_replace('/\sNULL/i','',$v); - } - - if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) { - list(,$colname,$default) = $matches; - $v = preg_replace('/^' . preg_quote($colname) . '\s/', '', $v); - $sql[] = $alter . $colname . ' TYPE ' . str_replace('DEFAULT '.$default,'',$v); - $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default; - } - else { - // drop default? - preg_match ('/^\s*(\S+)\s+(.*)$/',$v,$matches); - list (,$colname,$rest) = $matches; - $sql[] = $alter . $colname . ' TYPE ' . $rest; - } - - list($colname) = explode(' ',$v); - if ($not_null) { - // this does not error out if the column is already not null - $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL'; - } - if ($set_null) { - // this does not error out if the column is already null - $sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' DROP NOT NULL'; - } - } - return $sql; - } - - // does not have alter column - if (!$tableflds) { - if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL"); - return array(); - } - return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions); - } - - /** - * Drop one column - * - * Postgres < 7.3 can't do that on it's own, you need to supply the complete defintion of the new table, - * to allow, recreating the table and copying the content over to the new table - * @param string $tabname table-name - * @param string $flds column-name and type for the changed column - * @param string $tableflds complete defintion of the new table, eg. for postgres, default '' - * @param array/ $tableoptions options for the new table see CreateTableSQL, default '' - * @return array with SQL strings - */ - function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') - { - $has_drop_column = 7.3 <= (float) @$this->serverInfo['version']; - if (!$has_drop_column && !$tableflds) { - if ($this->debug) ADOConnection::outp("DropColumnSQL needs complete table-definiton for PostgreSQL < 7.3"); - return array(); - } - if ($has_drop_column) { - return ADODB_DataDict::DropColumnSQL($tabname, $flds); - } - return $this->_recreate_copy_table($tabname,$flds,$tableflds,$tableoptions); - } - - /** - * Save the content into a temp. table, drop and recreate the original table and copy the content back in - * - * We also take care to set the values of the sequenz and recreate the indexes. - * All this is done in a transaction, to not loose the content of the table, if something went wrong! - * @internal - * @param string $tabname table-name - * @param string $dropflds column-names to drop - * @param string $tableflds complete defintion of the new table, eg. for postgres - * @param array/string $tableoptions options for the new table see CreateTableSQL, default '' - * @return array with SQL strings - */ - function _recreate_copy_table($tabname,$dropflds,$tableflds,$tableoptions='') - { - if ($dropflds && !is_array($dropflds)) $dropflds = explode(',',$dropflds); - $copyflds = array(); - foreach($this->MetaColumns($tabname) as $fld) { - if (!$dropflds || !in_array($fld->name,$dropflds)) { - // we need to explicit convert varchar to a number to be able to do an AlterColumn of a char column to a nummeric one - if (preg_match('/'.$fld->name.' (I|I2|I4|I8|N|F)/i',$tableflds,$matches) && - in_array($fld->type,array('varchar','char','text','bytea'))) { - $copyflds[] = "to_number($fld->name,'S9999999999999D99')"; - } else { - $copyflds[] = $fld->name; - } - // identify the sequence name and the fld its on - if ($fld->primary_key && $fld->has_default && - preg_match("/nextval\('([^']+)'::text\)/",$fld->default_value,$matches)) { - $seq_name = $matches[1]; - $seq_fld = $fld->name; - } - } - } - $copyflds = implode(', ',$copyflds); - - $tempname = $tabname.'_tmp'; - $aSql[] = 'BEGIN'; // we use a transaction, to make sure not to loose the content of the table - $aSql[] = "SELECT * INTO TEMPORARY TABLE $tempname FROM $tabname"; - $aSql = array_merge($aSql,$this->DropTableSQL($tabname)); - $aSql = array_merge($aSql,$this->CreateTableSQL($tabname,$tableflds,$tableoptions)); - $aSql[] = "INSERT INTO $tabname SELECT $copyflds FROM $tempname"; - if ($seq_name && $seq_fld) { // if we have a sequence we need to set it again - $seq_name = $tabname.'_'.$seq_fld.'_seq'; // has to be the name of the new implicit sequence - $aSql[] = "SELECT setval('$seq_name',MAX($seq_fld)) FROM $tabname"; - } - $aSql[] = "DROP TABLE $tempname"; - // recreate the indexes, if they not contain one of the droped columns - foreach($this->MetaIndexes($tabname) as $idx_name => $idx_data) - { - if (substr($idx_name,-5) != '_pkey' && (!$dropflds || !count(array_intersect($dropflds,$idx_data['columns'])))) { - $aSql = array_merge($aSql,$this->CreateIndexSQL($idx_name,$tabname,$idx_data['columns'], - $idx_data['unique'] ? array('UNIQUE') : False)); - } - } - $aSql[] = 'COMMIT'; - return $aSql; - } - - function DropTableSQL($tabname) - { - $sql = ADODB_DataDict::DropTableSQL($tabname); - - $drop_seq = $this->_DropAutoIncrement($tabname); - if ($drop_seq) $sql[] = $drop_seq; - - return $sql; - } - - // return string must begin with space - function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - if ($fautoinc) { - $ftype = 'SERIAL'; - return ''; - } - $suffix = ''; - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fnotnull) $suffix .= ' NOT NULL'; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - - // search for a sequece for the given table (asumes the seqence-name contains the table-name!) - // if yes return sql to drop it - // this is still necessary if postgres < 7.3 or the SERIAL was created on an earlier version!!! - function _DropAutoIncrement($tabname) - { - $tabname = $this->connection->quote('%'.$tabname.'%'); - - $seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'"); - - // check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly - if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.relfilenode=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) { - return False; - } - return "DROP SEQUENCE ".$seq; - } - - function RenameTableSQL($tabname,$newname) - { - if (!empty($this->schema)) { - $rename_from = $this->TableName($tabname); - $schema_save = $this->schema; - $this->schema = false; - $rename_to = $this->TableName($newname); - $this->schema = $schema_save; - return array (sprintf($this->renameTable, $rename_from, $rename_to)); - } - - return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname))); - } - - /* - CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( - { column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ] - | table_constraint } [, ... ] - ) - [ INHERITS ( parent_table [, ... ] ) ] - [ WITH OIDS | WITHOUT OIDS ] - where column_constraint is: - [ CONSTRAINT constraint_name ] - { NOT NULL | NULL | UNIQUE | PRIMARY KEY | - CHECK (expression) | - REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ] - [ ON DELETE action ] [ ON UPDATE action ] } - [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] - and table_constraint is: - [ CONSTRAINT constraint_name ] - { UNIQUE ( column_name [, ... ] ) | - PRIMARY KEY ( column_name [, ... ] ) | - CHECK ( expression ) | - FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] - [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] } - [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] - */ - - - /* - CREATE [ UNIQUE ] INDEX index_name ON table - [ USING acc_method ] ( column [ ops_name ] [, ...] ) - [ WHERE predicate ] - CREATE [ UNIQUE ] INDEX index_name ON table - [ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] ) - [ WHERE predicate ] - */ - function _IndexSQL($idxname, $tabname, $flds, $idxoptions) - { - $sql = array(); - - if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { - $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); - if ( isset($idxoptions['DROP']) ) - return $sql; - } - - if ( empty ($flds) ) { - return $sql; - } - - $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; - - $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' '; - - if (isset($idxoptions['HASH'])) - $s .= 'USING HASH '; - - if ( isset($idxoptions[$this->upperName]) ) - $s .= $idxoptions[$this->upperName]; - - if ( is_array($flds) ) - $flds = implode(', ',$flds); - $s .= '(' . $flds . ')'; - $sql[] = $s; - - return $sql; - } - - function _GetSize($ftype, $ty, $fsize, $fprec) - { - if (strlen($fsize) && $ty != 'X' && $ty != 'B' && $ty != 'I' && strpos($ftype,'(') === false) { - $ftype .= "(".$fsize; - if (strlen($fprec)) $ftype .= ",".$fprec; - $ftype .= ')'; - } - return $ftype; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-sapdb.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-sapdb.inc.php deleted file mode 100644 index 7cc216e5..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-sapdb.inc.php +++ /dev/null @@ -1,122 +0,0 @@ -type; - $len = $fieldobj->max_length; - } - static $maxdb_type2adodb = array( - 'VARCHAR' => 'C', - 'CHARACTER' => 'C', - 'LONG' => 'X', // no way to differ between 'X' and 'B' :-( - 'DATE' => 'D', - 'TIMESTAMP' => 'T', - 'BOOLEAN' => 'L', - 'INTEGER' => 'I4', - 'SMALLINT' => 'I2', - 'FLOAT' => 'F', - 'FIXED' => 'N', - ); - $type = isset($maxdb_type2adodb[$t]) ? $maxdb_type2adodb[$t] : 'C'; - - // convert integer-types simulated with fixed back to integer - if ($t == 'FIXED' && !$fieldobj->scale && ($len == 20 || $len == 3)) { - $type = $len == 20 ? 'I8' : 'I1'; - } - if ($fieldobj->auto_increment) $type = 'R'; - - return $type; - } - - // return string must begin with space - function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - $suffix = ''; - if ($funsigned) $suffix .= ' UNSIGNED'; - if ($fnotnull) $suffix .= ' NOT NULL'; - if ($fautoinc) $suffix .= ' DEFAULT SERIAL'; - elseif (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - - function AddColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $sql = array(); - list($lines,$pkey) = $this->_GenFields($flds); - return array( 'ALTER TABLE ' . $tabname . ' ADD (' . implode(', ',$lines) . ')' ); - } - - function AlterColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $sql = array(); - list($lines,$pkey) = $this->_GenFields($flds); - return array( 'ALTER TABLE ' . $tabname . ' MODIFY (' . implode(', ',$lines) . ')' ); - } - - function DropColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - if (!is_array($flds)) $flds = explode(',',$flds); - foreach($flds as $k => $v) { - $flds[$k] = $this->NameQuote($v); - } - return array( 'ALTER TABLE ' . $tabname . ' DROP (' . implode(', ',$flds) . ')' ); - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/datadict/datadict-sybase.inc.php b/include/limesurvey/classes/adodb/datadict/datadict-sybase.inc.php deleted file mode 100644 index d191205b..00000000 --- a/include/limesurvey/classes/adodb/datadict/datadict-sybase.inc.php +++ /dev/null @@ -1,229 +0,0 @@ -type; - $len = $fieldobj->max_length; - } - - $len = -1; // mysql max_length is not accurate - switch (strtoupper($t)) { - - case 'INT': - case 'INTEGER': return 'I'; - case 'BIT': - case 'TINYINT': return 'I1'; - case 'SMALLINT': return 'I2'; - case 'BIGINT': return 'I8'; - - case 'REAL': - case 'FLOAT': return 'F'; - default: return parent::MetaType($t,$len,$fieldobj); - } - } - - function ActualType($meta) - { - switch(strtoupper($meta)) { - case 'C': return 'VARCHAR'; - case 'XL': - case 'X': return 'TEXT'; - - case 'C2': return 'NVARCHAR'; - case 'X2': return 'NTEXT'; - - case 'B': return 'IMAGE'; - - case 'D': return 'DATETIME'; - case 'TS': - case 'T': return 'DATETIME'; - case 'L': return 'BIT'; - - case 'I': return 'INT'; - case 'I1': return 'TINYINT'; - case 'I2': return 'SMALLINT'; - case 'I4': return 'INT'; - case 'I8': return 'BIGINT'; - - case 'F': return 'REAL'; - case 'N': return 'NUMERIC'; - default: - return $meta; - } - } - - - function AddColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $f = array(); - list($lines,$pkey) = $this->_GenFields($flds); - $s = "ALTER TABLE $tabname $this->addCol"; - foreach($lines as $v) { - $f[] = "\n $v"; - } - $s .= implode(', ',$f); - $sql[] = $s; - return $sql; - } - - function AlterColumnSQL($tabname, $flds) - { - $tabname = $this->TableName ($tabname); - $sql = array(); - list($lines,$pkey) = $this->_GenFields($flds); - foreach($lines as $v) { - $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; - } - - return $sql; - } - - function DropColumnSQL($tabname, $flds) - { - $tabname = $this->TableName($tabname); - if (!is_array($flds)) $flds = explode(',',$flds); - $f = array(); - $s = "ALTER TABLE $tabname"; - foreach($flds as $v) { - $f[] = "\n$this->dropCol ".$this->NameQuote($v); - } - $s .= implode(', ',$f); - $sql[] = $s; - return $sql; - } - - // return string must begin with space - function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned) - { - $suffix = ''; - if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; - if ($fautoinc) $suffix .= ' DEFAULT AUTOINCREMENT'; - if ($fnotnull) $suffix .= ' NOT NULL'; - else if ($suffix == '') $suffix .= ' NULL'; - if ($fconstraint) $suffix .= ' '.$fconstraint; - return $suffix; - } - - /* - CREATE TABLE - [ database_name.[ owner ] . | owner. ] table_name - ( { < column_definition > - | column_name AS computed_column_expression - | < table_constraint > ::= [ CONSTRAINT constraint_name ] } - - | [ { PRIMARY KEY | UNIQUE } [ ,...n ] - ) - - [ ON { filegroup | DEFAULT } ] - [ TEXTIMAGE_ON { filegroup | DEFAULT } ] - - < column_definition > ::= { column_name data_type } - [ COLLATE < collation_name > ] - [ [ DEFAULT constant_expression ] - | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] - ] - [ ROWGUIDCOL] - [ < column_constraint > ] [ ...n ] - - < column_constraint > ::= [ CONSTRAINT constraint_name ] - { [ NULL | NOT NULL ] - | [ { PRIMARY KEY | UNIQUE } - [ CLUSTERED | NONCLUSTERED ] - [ WITH FILLFACTOR = fillfactor ] - [ON {filegroup | DEFAULT} ] ] - ] - | [ [ FOREIGN KEY ] - REFERENCES ref_table [ ( ref_column ) ] - [ ON DELETE { CASCADE | NO ACTION } ] - [ ON UPDATE { CASCADE | NO ACTION } ] - [ NOT FOR REPLICATION ] - ] - | CHECK [ NOT FOR REPLICATION ] - ( logical_expression ) - } - - < table_constraint > ::= [ CONSTRAINT constraint_name ] - { [ { PRIMARY KEY | UNIQUE } - [ CLUSTERED | NONCLUSTERED ] - { ( column [ ASC | DESC ] [ ,...n ] ) } - [ WITH FILLFACTOR = fillfactor ] - [ ON { filegroup | DEFAULT } ] - ] - | FOREIGN KEY - [ ( column [ ,...n ] ) ] - REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] - [ ON DELETE { CASCADE | NO ACTION } ] - [ ON UPDATE { CASCADE | NO ACTION } ] - [ NOT FOR REPLICATION ] - | CHECK [ NOT FOR REPLICATION ] - ( search_conditions ) - } - - - */ - - /* - CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name - ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) - [ WITH < index_option > [ ,...n] ] - [ ON filegroup ] - < index_option > :: = - { PAD_INDEX | - FILLFACTOR = fillfactor | - IGNORE_DUP_KEY | - DROP_EXISTING | - STATISTICS_NORECOMPUTE | - SORT_IN_TEMPDB - } - */ - function _IndexSQL($idxname, $tabname, $flds, $idxoptions) - { - $sql = array(); - - if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { - $sql[] = sprintf ($this->dropIndex, $idxname, $tabname); - if ( isset($idxoptions['DROP']) ) - return $sql; - } - - if ( empty ($flds) ) { - return $sql; - } - - $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; - $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : ''; - - if ( is_array($flds) ) - $flds = implode(', ',$flds); - $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')'; - - if ( isset($idxoptions[$this->upperName]) ) - $s .= $idxoptions[$this->upperName]; - - $sql[] = $s; - - return $sql; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-access.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-access.inc.php deleted file mode 100644 index ba1e1481..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-access.inc.php +++ /dev/null @@ -1,87 +0,0 @@ -ADODB_odbc(); - } - - function Time() - { - return time(); - } - - function BeginTrans() { return false;} - - function IfNull( $field, $ifNull ) - { - return " IIF(IsNull($field), $ifNull, $field) "; // if Access - } - /* - function MetaTables() - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = odbc_tables($this->_connectionID); - $rs = new ADORecordSet_odbc($qid); - $ADODB_FETCH_MODE = $savem; - if (!$rs) return false; - - $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; - - $arr = $rs->GetArray(); - //print_pre($arr); - $arr2 = array(); - for ($i=0; $i < sizeof($arr); $i++) { - if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE') - $arr2[] = $arr[$i][2]; - } - return $arr2; - }*/ - } - - - class ADORecordSet_access extends ADORecordSet_odbc { - - var $databaseType = "access"; - - function ADORecordSet_access($id,$mode=false) - { - return $this->ADORecordSet_odbc($id,$mode); - } - }// class -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-ado.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-ado.inc.php deleted file mode 100644 index 9898cca5..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-ado.inc.php +++ /dev/null @@ -1,660 +0,0 @@ -_affectedRows = new VARIANT; - } - - function ServerInfo() - { - if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider; - return array('description' => $desc, 'version' => ''); - } - - function _affectedrows() - { - if (PHP_VERSION >= 5) return $this->_affectedRows; - - return $this->_affectedRows->value; - } - - // you can also pass a connection string like this: - // - // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB'); - function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL') - { - $u = 'UID'; - $p = 'PWD'; - - if (!empty($this->charPage)) - $dbc = new COM('ADODB.Connection',null,$this->charPage); - else - $dbc = new COM('ADODB.Connection'); - - if (! $dbc) return false; - - /* special support if provider is mssql or access */ - if ($argProvider=='mssql') { - $u = 'User Id'; //User parameter name for OLEDB - $p = 'Password'; - $argProvider = "SQLOLEDB"; // SQL Server Provider - - // not yet - //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename"; - - //use trusted conection for SQL if username not specified - if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes"; - } else if ($argProvider=='access') - $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider - - if ($argProvider) $dbc->Provider = $argProvider; - - if ($argUsername) $argHostname .= ";$u=$argUsername"; - if ($argPassword)$argHostname .= ";$p=$argPassword"; - - if ($this->debug) ADOConnection::outp( "Host=".$argHostname."
        \n version=$dbc->version"); - // @ added below for php 4.0.1 and earlier - @$dbc->Open((string) $argHostname); - - $this->_connectionID = $dbc; - - $dbc->CursorLocation = $this->_cursor_location; - return $dbc->State > 0; - } - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') - { - return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider); - } - - /* - adSchemaCatalogs = 1, - adSchemaCharacterSets = 2, - adSchemaCollations = 3, - adSchemaColumns = 4, - adSchemaCheckConstraints = 5, - adSchemaConstraintColumnUsage = 6, - adSchemaConstraintTableUsage = 7, - adSchemaKeyColumnUsage = 8, - adSchemaReferentialContraints = 9, - adSchemaTableConstraints = 10, - adSchemaColumnsDomainUsage = 11, - adSchemaIndexes = 12, - adSchemaColumnPrivileges = 13, - adSchemaTablePrivileges = 14, - adSchemaUsagePrivileges = 15, - adSchemaProcedures = 16, - adSchemaSchemata = 17, - adSchemaSQLLanguages = 18, - adSchemaStatistics = 19, - adSchemaTables = 20, - adSchemaTranslations = 21, - adSchemaProviderTypes = 22, - adSchemaViews = 23, - adSchemaViewColumnUsage = 24, - adSchemaViewTableUsage = 25, - adSchemaProcedureParameters = 26, - adSchemaForeignKeys = 27, - adSchemaPrimaryKeys = 28, - adSchemaProcedureColumns = 29, - adSchemaDBInfoKeywords = 30, - adSchemaDBInfoLiterals = 31, - adSchemaCubes = 32, - adSchemaDimensions = 33, - adSchemaHierarchies = 34, - adSchemaLevels = 35, - adSchemaMeasures = 36, - adSchemaProperties = 37, - adSchemaMembers = 38 - - */ - - function MetaTables() - { - $arr= array(); - $dbc = $this->_connectionID; - - $adors=@$dbc->OpenSchema(20);//tables - if ($adors){ - $f = $adors->Fields(2);//table/view name - $t = $adors->Fields(3);//table type - while (!$adors->EOF){ - $tt=substr($t->value,0,6); - if ($tt!='SYSTEM' && $tt !='ACCESS') - $arr[]=$f->value; - //print $f->value . ' ' . $t->value.'
        '; - $adors->MoveNext(); - } - $adors->Close(); - } - - return $arr; - } - - function MetaColumns($table, $normalize=true) - { - $table = strtoupper($table); - $arr = array(); - $dbc = $this->_connectionID; - - $adors=@$dbc->OpenSchema(4);//tables - - if ($adors){ - $t = $adors->Fields(2);//table/view name - while (!$adors->EOF){ - - - if (strtoupper($t->Value) == $table) { - - $fld = new ADOFieldObject(); - $c = $adors->Fields(3); - $fld->name = $c->Value; - $fld->type = 'CHAR'; // cannot discover type in ADO! - $fld->max_length = -1; - $arr[strtoupper($fld->name)]=$fld; - } - - $adors->MoveNext(); - } - $adors->Close(); - } - $false = false; - return empty($arr) ? $false : $arr; - } - - - - - /* returns queryID or false */ - function _query($sql,$inputarr=false) - { - - $dbc = $this->_connectionID; - $false = false; - - // return rs - if ($inputarr) { - - if (!empty($this->charPage)) - $oCmd = new COM('ADODB.Command',null,$this->charPage); - else - $oCmd = new COM('ADODB.Command'); - $oCmd->ActiveConnection = $dbc; - $oCmd->CommandText = $sql; - $oCmd->CommandType = 1; - - // Map by http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthcreateparam.asp - // Check issue http://bugs.php.net/bug.php?id=40664 !!! - while(list(, $val) = each($inputarr)) { - $type = gettype($val); - $len=strlen($val); - if ($type == 'boolean') - $this->adoParameterType = 11; - else if ($type == 'integer') - $this->adoParameterType = 3; - else if ($type == 'double') - $this->adoParameterType = 5; - elseif ($type == 'string') - $this->adoParameterType = 202; - else if (($val === null) || (!defined($val))) - $len=1; - else - $this->adoParameterType = 130; - - // name, type, direction 1 = input, len, - $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val); - - $oCmd->Parameters->Append($p); - } - $p = false; - $rs = $oCmd->Execute(); - $e = $dbc->Errors; - if ($dbc->Errors->Count > 0) return $false; - return $rs; - } - - $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option); - - if ($dbc->Errors->Count > 0) return $false; - if (! $rs) return $false; - - if ($rs->State == 0) { - $true = true; - return $true; // 0 = adStateClosed means no records returned - } - return $rs; - } - - - function BeginTrans() - { - if ($this->transOff) return true; - - if (isset($this->_thisTransactions)) - if (!$this->_thisTransactions) return false; - else { - $o = $this->_connectionID->Properties("Transaction DDL"); - $this->_thisTransactions = $o ? true : false; - if (!$o) return false; - } - @$this->_connectionID->BeginTrans(); - $this->transCnt += 1; - return true; - } - - function CommitTrans($ok=true) - { - if (!$ok) return $this->RollbackTrans(); - if ($this->transOff) return true; - - @$this->_connectionID->CommitTrans(); - if ($this->transCnt) @$this->transCnt -= 1; - return true; - } - function RollbackTrans() { - if ($this->transOff) return true; - @$this->_connectionID->RollbackTrans(); - if ($this->transCnt) @$this->transCnt -= 1; - return true; - } - - /* Returns: the last error message from previous database operation */ - - function ErrorMsg() - { - if (!$this->_connectionID) return "No connection established"; - $errc = $this->_connectionID->Errors; - if (!$errc) return "No Errors object found"; - if ($errc->Count == 0) return ''; - $err = $errc->Item($errc->Count-1); - return $err->Description; - } - - function ErrorNo() - { - $errc = $this->_connectionID->Errors; - if ($errc->Count == 0) return 0; - $err = $errc->Item($errc->Count-1); - return $err->NativeError; - } - - // returns true or false - function _close() - { - if ($this->_connectionID) $this->_connectionID->Close(); - $this->_connectionID = false; - return true; - } - - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_ado extends ADORecordSet { - - var $bind = false; - var $databaseType = "ado"; - var $dataProvider = "ado"; - var $_tarr = false; // caches the types - var $_flds; // and field objects - var $canSeek = true; - var $hideErrors = true; - - function ADORecordSet_ado($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - return $this->ADORecordSet($id,$mode); - } - - - // returns the field object - function FetchField($fieldOffset = -1) { - $off=$fieldOffset+1; // offsets begin at 1 - - $o= new ADOFieldObject(); - $rs = $this->_queryID; - $f = $rs->Fields($fieldOffset); - $o->name = $f->Name; - $t = $f->Type; - $o->type = $this->MetaType($t); - $o->max_length = $f->DefinedSize; - $o->ado_type = $t; - - //print "off=$off name=$o->name type=$o->type len=$o->max_length
        "; - return $o; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - - function _initrs() - { - $rs = $this->_queryID; - $this->_numOfRows = $rs->RecordCount; - - $f = $rs->Fields; - $this->_numOfFields = $f->Count; - } - - - // should only be used to move forward as we normally use forward-only cursors - function _seek($row) - { - $rs = $this->_queryID; - // absoluteposition doesn't work -- my maths is wrong ? - // $rs->AbsolutePosition->$row-2; - // return true; - if ($this->_currentRow > $row) return false; - @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst - return true; - } - - /* - OLEDB types - - enum DBTYPEENUM - { DBTYPE_EMPTY = 0, - DBTYPE_NULL = 1, - DBTYPE_I2 = 2, - DBTYPE_I4 = 3, - DBTYPE_R4 = 4, - DBTYPE_R8 = 5, - DBTYPE_CY = 6, - DBTYPE_DATE = 7, - DBTYPE_BSTR = 8, - DBTYPE_IDISPATCH = 9, - DBTYPE_ERROR = 10, - DBTYPE_BOOL = 11, - DBTYPE_VARIANT = 12, - DBTYPE_IUNKNOWN = 13, - DBTYPE_DECIMAL = 14, - DBTYPE_UI1 = 17, - DBTYPE_ARRAY = 0x2000, - DBTYPE_BYREF = 0x4000, - DBTYPE_I1 = 16, - DBTYPE_UI2 = 18, - DBTYPE_UI4 = 19, - DBTYPE_I8 = 20, - DBTYPE_UI8 = 21, - DBTYPE_GUID = 72, - DBTYPE_VECTOR = 0x1000, - DBTYPE_RESERVED = 0x8000, - DBTYPE_BYTES = 128, - DBTYPE_STR = 129, - DBTYPE_WSTR = 130, - DBTYPE_NUMERIC = 131, - DBTYPE_UDT = 132, - DBTYPE_DBDATE = 133, - DBTYPE_DBTIME = 134, - DBTYPE_DBTIMESTAMP = 135 - - ADO Types - - adEmpty = 0, - adTinyInt = 16, - adSmallInt = 2, - adInteger = 3, - adBigInt = 20, - adUnsignedTinyInt = 17, - adUnsignedSmallInt = 18, - adUnsignedInt = 19, - adUnsignedBigInt = 21, - adSingle = 4, - adDouble = 5, - adCurrency = 6, - adDecimal = 14, - adNumeric = 131, - adBoolean = 11, - adError = 10, - adUserDefined = 132, - adVariant = 12, - adIDispatch = 9, - adIUnknown = 13, - adGUID = 72, - adDate = 7, - adDBDate = 133, - adDBTime = 134, - adDBTimeStamp = 135, - adBSTR = 8, - adChar = 129, - adVarChar = 200, - adLongVarChar = 201, - adWChar = 130, - adVarWChar = 202, - adLongVarWChar = 203, - adBinary = 128, - adVarBinary = 204, - adLongVarBinary = 205, - adChapter = 136, - adFileTime = 64, - adDBFileTime = 137, - adPropVariant = 138, - adVarNumeric = 139 - */ - function MetaType($t,$len=-1,$fieldobj=false) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - - if (!is_numeric($t)) return $t; - - switch ($t) { - case 0: - case 12: // variant - case 8: // bstr - case 129: //char - case 130: //wc - case 200: // varc - case 202:// varWC - case 128: // bin - case 204: // varBin - case 72: // guid - if ($len <= $this->blobSize) return 'C'; - - case 201: - case 203: - return 'X'; - case 128: - case 204: - case 205: - return 'B'; - case 7: - case 133: return 'D'; - - case 134: - case 135: return 'T'; - - case 11: return 'L'; - - case 16:// adTinyInt = 16, - case 2://adSmallInt = 2, - case 3://adInteger = 3, - case 4://adBigInt = 20, - case 17://adUnsignedTinyInt = 17, - case 18://adUnsignedSmallInt = 18, - case 19://adUnsignedInt = 19, - case 20://adUnsignedBigInt = 21, - return 'I'; - default: return 'N'; - } - } - - // time stamp not supported yet - function _fetch() - { - $rs = $this->_queryID; - if (!$rs or $rs->EOF) { - $this->fields = false; - return false; - } - $this->fields = array(); - - if (!$this->_tarr) { - $tarr = array(); - $flds = array(); - for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { - $f = $rs->Fields($i); - $flds[] = $f; - $tarr[] = $f->Type; - } - // bind types and flds only once - $this->_tarr = $tarr; - $this->_flds = $flds; - } - $t = reset($this->_tarr); - $f = reset($this->_flds); - - if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null - for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { - //echo "

        ",$t,' ';var_dump($f->value); echo '

        '; - switch($t) { - case 135: // timestamp - if (!strlen((string)$f->value)) $this->fields[] = false; - else { - if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value); - // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00 - $val=(float) variant_cast($f->value,VT_R8)*3600*24-2209161600; - else - $val = $f->value; - $this->fields[] = adodb_date('Y-m-d H:i:s',$val); - } - break; - case 133:// A date value (yyyymmdd) - if ($val = $f->value) { - $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2); - } else - $this->fields[] = false; - break; - case 7: // adDate - if (!strlen((string)$f->value)) $this->fields[] = false; - else { - if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value); - else $val = $f->value; - - if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val); - else $this->fields[] = adodb_date('Y-m-d H:i:s',$val); - } - break; - case 1: // null - $this->fields[] = false; - break; - case 6: // currency is not supported properly; - ADOConnection::outp( ''.$f->Name.': currency type not supported by PHP'); - $this->fields[] = (float) $f->value; - break; - case 11: //BIT; - $val = ""; - if(is_bool($f->value)) { - if($f->value==true) $val = 1; - else $val = 0; - } - if(is_null($f->value)) $val = null; - - $this->fields[] = $val; - break; - default: - $this->fields[] = $f->value; - break; - } - //print " $f->value $t, "; - $f = next($this->_flds); - $t = next($this->_tarr); - } // for - if ($this->hideErrors) error_reporting($olde); - @$rs->MoveNext(); // @ needed for some versions of PHP! - - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - - function NextRecordSet() - { - $rs = $this->_queryID; - $this->_queryID = $rs->NextRecordSet(); - //$this->_queryID = $this->_QueryId->NextRecordSet(); - if ($this->_queryID == null) return false; - - $this->_currentRow = -1; - $this->_currentPage = -1; - $this->bind = false; - $this->fields = false; - $this->_flds = false; - $this->_tarr = false; - - $this->_inited = false; - $this->Init(); - return true; - } - - function _close() { - $this->_flds = false; - @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk) - $this->_queryID = false; - } - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-ado5.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-ado5.inc.php deleted file mode 100644 index 082c84aa..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-ado5.inc.php +++ /dev/null @@ -1,708 +0,0 @@ -_affectedRows = new VARIANT; - } - - function ServerInfo() - { - if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider; - return array('description' => $desc, 'version' => ''); - } - - function _affectedrows() - { - if (PHP_VERSION >= 5) return $this->_affectedRows; - - return $this->_affectedRows->value; - } - - // you can also pass a connection string like this: - // - // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB'); - function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '') - { - // two modes - // - if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat - // - if $argProvider is not empty, then $argDBorProvider holds db - - - if ($argProvider) { - $argDatabasename = $argDBorProvider; - } else { - $argDatabasename = ''; - if ($argDBorProvider) $argProvider = $argDBorProvider; - else if (stripos($argHostname,'PROVIDER') === false) /* full conn string is not in $argHostname */ - $argProvider = 'MSDASQL'; - } - - - try { - $u = 'UID'; - $p = 'PWD'; - - if (!empty($this->charPage)) - $dbc = new COM('ADODB.Connection',null,$this->charPage); - else - $dbc = new COM('ADODB.Connection'); - - if (! $dbc) return false; - - /* special support if provider is mssql or access */ - if ($argProvider=='mssql') { - $u = 'User Id'; //User parameter name for OLEDB - $p = 'Password'; - $argProvider = "SQLOLEDB"; // SQL Server Provider - - // not yet - //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename"; - - //use trusted conection for SQL if username not specified - if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes"; - } else if ($argProvider=='access') - $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider - - if ($argProvider) $dbc->Provider = $argProvider; - - if ($argProvider) $argHostname = "PROVIDER=$argProvider;DRIVER={SQL Server};SERVER=$argHostname"; - - - if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename"; - if ($argUsername) $argHostname .= ";$u=$argUsername"; - if ($argPassword)$argHostname .= ";$p=$argPassword"; - - if ($this->debug) ADOConnection::outp( "Host=".$argHostname."
        \n version=$dbc->version"); - // @ added below for php 4.0.1 and earlier - @$dbc->Open((string) $argHostname); - - $this->_connectionID = $dbc; - - $dbc->CursorLocation = $this->_cursor_location; - return $dbc->State > 0; - } catch (exception $e) { - if ($this->debug);echo "
        ",$argHostname,"\n",$e,"
        \n"; - } - - return false; - } - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') - { - return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider); - } - - /* - adSchemaCatalogs = 1, - adSchemaCharacterSets = 2, - adSchemaCollations = 3, - adSchemaColumns = 4, - adSchemaCheckConstraints = 5, - adSchemaConstraintColumnUsage = 6, - adSchemaConstraintTableUsage = 7, - adSchemaKeyColumnUsage = 8, - adSchemaReferentialContraints = 9, - adSchemaTableConstraints = 10, - adSchemaColumnsDomainUsage = 11, - adSchemaIndexes = 12, - adSchemaColumnPrivileges = 13, - adSchemaTablePrivileges = 14, - adSchemaUsagePrivileges = 15, - adSchemaProcedures = 16, - adSchemaSchemata = 17, - adSchemaSQLLanguages = 18, - adSchemaStatistics = 19, - adSchemaTables = 20, - adSchemaTranslations = 21, - adSchemaProviderTypes = 22, - adSchemaViews = 23, - adSchemaViewColumnUsage = 24, - adSchemaViewTableUsage = 25, - adSchemaProcedureParameters = 26, - adSchemaForeignKeys = 27, - adSchemaPrimaryKeys = 28, - adSchemaProcedureColumns = 29, - adSchemaDBInfoKeywords = 30, - adSchemaDBInfoLiterals = 31, - adSchemaCubes = 32, - adSchemaDimensions = 33, - adSchemaHierarchies = 34, - adSchemaLevels = 35, - adSchemaMeasures = 36, - adSchemaProperties = 37, - adSchemaMembers = 38 - - */ - - function MetaTables() - { - $arr= array(); - $dbc = $this->_connectionID; - - $adors=@$dbc->OpenSchema(20);//tables - if ($adors){ - $f = $adors->Fields(2);//table/view name - $t = $adors->Fields(3);//table type - while (!$adors->EOF){ - $tt=substr($t->value,0,6); - if ($tt!='SYSTEM' && $tt !='ACCESS') - $arr[]=$f->value; - //print $f->value . ' ' . $t->value.'
        '; - $adors->MoveNext(); - } - $adors->Close(); - } - - return $arr; - } - - function MetaColumns($table, $normalize=true) - { - $table = strtoupper($table); - $arr= array(); - $dbc = $this->_connectionID; - - $adors=@$dbc->OpenSchema(4);//tables - - if ($adors){ - $t = $adors->Fields(2);//table/view name - while (!$adors->EOF){ - - - if (strtoupper($t->Value) == $table) { - - $fld = new ADOFieldObject(); - $c = $adors->Fields(3); - $fld->name = $c->Value; - $fld->type = 'CHAR'; // cannot discover type in ADO! - $fld->max_length = -1; - $arr[strtoupper($fld->name)]=$fld; - } - - $adors->MoveNext(); - } - $adors->Close(); - } - - return $arr; - } - - /* returns queryID or false */ - function _query($sql,$inputarr=false) - { - try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour... - - $dbc = $this->_connectionID; - - // return rs - - $false = false; - - if ($inputarr) { - - if (!empty($this->charPage)) - $oCmd = new COM('ADODB.Command',null,$this->charPage); - else - $oCmd = new COM('ADODB.Command'); - $oCmd->ActiveConnection = $dbc; - $oCmd->CommandText = $sql; - $oCmd->CommandType = 1; - - while(list(, $val) = each($inputarr)) { - $type = gettype($val); - $len=strlen($val); - if ($type == 'boolean') - $this->adoParameterType = 11; - else if ($type == 'integer') - $this->adoParameterType = 3; - else if ($type == 'double') - $this->adoParameterType = 5; - elseif ($type == 'string') - $this->adoParameterType = 202; - else if (($val === null) || (!defined($val))) - $len=1; - else - $this->adoParameterType = 130; - - // name, type, direction 1 = input, len, - $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val); - - $oCmd->Parameters->Append($p); - } - - $p = false; - $rs = $oCmd->Execute(); - $e = $dbc->Errors; - if ($dbc->Errors->Count > 0) return $false; - return $rs; - } - - $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option); - - if ($dbc->Errors->Count > 0) return $false; - if (! $rs) return $false; - - if ($rs->State == 0) { - $true = true; - return $true; // 0 = adStateClosed means no records returned - } - return $rs; - - } catch (exception $e) { - - } - return $false; - } - - - function BeginTrans() - { - if ($this->transOff) return true; - - if (isset($this->_thisTransactions)) - if (!$this->_thisTransactions) return false; - else { - $o = $this->_connectionID->Properties("Transaction DDL"); - $this->_thisTransactions = $o ? true : false; - if (!$o) return false; - } - @$this->_connectionID->BeginTrans(); - $this->transCnt += 1; - return true; - } - function CommitTrans($ok=true) - { - if (!$ok) return $this->RollbackTrans(); - if ($this->transOff) return true; - - @$this->_connectionID->CommitTrans(); - if ($this->transCnt) @$this->transCnt -= 1; - return true; - } - function RollbackTrans() { - if ($this->transOff) return true; - @$this->_connectionID->RollbackTrans(); - if ($this->transCnt) @$this->transCnt -= 1; - return true; - } - - /* Returns: the last error message from previous database operation */ - - function ErrorMsg() - { - if (!$this->_connectionID) return "No connection established"; - $errmsg = ''; - - try { - $errc = $this->_connectionID->Errors; - if (!$errc) return "No Errors object found"; - if ($errc->Count == 0) return ''; - $err = $errc->Item($errc->Count-1); - $errmsg = $err->Description; - }catch(exception $e) { - } - return $errmsg; - } - - function ErrorNo() - { - $errc = $this->_connectionID->Errors; - if ($errc->Count == 0) return 0; - $err = $errc->Item($errc->Count-1); - return $err->NativeError; - } - - // returns true or false - function _close() - { - if ($this->_connectionID) $this->_connectionID->Close(); - $this->_connectionID = false; - return true; - } - - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_ado extends ADORecordSet { - - var $bind = false; - var $databaseType = "ado"; - var $dataProvider = "ado"; - var $_tarr = false; // caches the types - var $_flds; // and field objects - var $canSeek = true; - var $hideErrors = true; - - function ADORecordSet_ado($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - return $this->ADORecordSet($id,$mode); - } - - - // returns the field object - function FetchField($fieldOffset = -1) { - $off=$fieldOffset+1; // offsets begin at 1 - - $o= new ADOFieldObject(); - $rs = $this->_queryID; - if (!$rs) return false; - - $f = $rs->Fields($fieldOffset); - $o->name = $f->Name; - $t = $f->Type; - $o->type = $this->MetaType($t); - $o->max_length = $f->DefinedSize; - $o->ado_type = $t; - - - //print "off=$off name=$o->name type=$o->type len=$o->max_length
        "; - return $o; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - - function _initrs() - { - $rs = $this->_queryID; - - try { - $this->_numOfRows = $rs->RecordCount; - } catch (Exception $e) { - $this->_numOfRows = -1; - } - $f = $rs->Fields; - $this->_numOfFields = $f->Count; - } - - - // should only be used to move forward as we normally use forward-only cursors - function _seek($row) - { - $rs = $this->_queryID; - // absoluteposition doesn't work -- my maths is wrong ? - // $rs->AbsolutePosition->$row-2; - // return true; - if ($this->_currentRow > $row) return false; - @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst - return true; - } - - /* - OLEDB types - - enum DBTYPEENUM - { DBTYPE_EMPTY = 0, - DBTYPE_NULL = 1, - DBTYPE_I2 = 2, - DBTYPE_I4 = 3, - DBTYPE_R4 = 4, - DBTYPE_R8 = 5, - DBTYPE_CY = 6, - DBTYPE_DATE = 7, - DBTYPE_BSTR = 8, - DBTYPE_IDISPATCH = 9, - DBTYPE_ERROR = 10, - DBTYPE_BOOL = 11, - DBTYPE_VARIANT = 12, - DBTYPE_IUNKNOWN = 13, - DBTYPE_DECIMAL = 14, - DBTYPE_UI1 = 17, - DBTYPE_ARRAY = 0x2000, - DBTYPE_BYREF = 0x4000, - DBTYPE_I1 = 16, - DBTYPE_UI2 = 18, - DBTYPE_UI4 = 19, - DBTYPE_I8 = 20, - DBTYPE_UI8 = 21, - DBTYPE_GUID = 72, - DBTYPE_VECTOR = 0x1000, - DBTYPE_RESERVED = 0x8000, - DBTYPE_BYTES = 128, - DBTYPE_STR = 129, - DBTYPE_WSTR = 130, - DBTYPE_NUMERIC = 131, - DBTYPE_UDT = 132, - DBTYPE_DBDATE = 133, - DBTYPE_DBTIME = 134, - DBTYPE_DBTIMESTAMP = 135 - - ADO Types - - adEmpty = 0, - adTinyInt = 16, - adSmallInt = 2, - adInteger = 3, - adBigInt = 20, - adUnsignedTinyInt = 17, - adUnsignedSmallInt = 18, - adUnsignedInt = 19, - adUnsignedBigInt = 21, - adSingle = 4, - adDouble = 5, - adCurrency = 6, - adDecimal = 14, - adNumeric = 131, - adBoolean = 11, - adError = 10, - adUserDefined = 132, - adVariant = 12, - adIDispatch = 9, - adIUnknown = 13, - adGUID = 72, - adDate = 7, - adDBDate = 133, - adDBTime = 134, - adDBTimeStamp = 135, - adBSTR = 8, - adChar = 129, - adVarChar = 200, - adLongVarChar = 201, - adWChar = 130, - adVarWChar = 202, - adLongVarWChar = 203, - adBinary = 128, - adVarBinary = 204, - adLongVarBinary = 205, - adChapter = 136, - adFileTime = 64, - adDBFileTime = 137, - adPropVariant = 138, - adVarNumeric = 139 - */ - function MetaType($t,$len=-1,$fieldobj=false) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - - if (!is_numeric($t)) return $t; - - switch ($t) { - case 0: - case 12: // variant - case 8: // bstr - case 129: //char - case 130: //wc - case 200: // varc - case 202:// varWC - case 128: // bin - case 204: // varBin - case 72: // guid - if ($len <= $this->blobSize) return 'C'; - - case 201: - case 203: - return 'X'; - case 128: - case 204: - case 205: - return 'B'; - case 7: - case 133: return 'D'; - - case 134: - case 135: return 'T'; - - case 11: return 'L'; - - case 16:// adTinyInt = 16, - case 2://adSmallInt = 2, - case 3://adInteger = 3, - case 4://adBigInt = 20, - case 17://adUnsignedTinyInt = 17, - case 18://adUnsignedSmallInt = 18, - case 19://adUnsignedInt = 19, - case 20://adUnsignedBigInt = 21, - return 'I'; - default: return 'N'; - } - } - - // time stamp not supported yet - function _fetch() - { - $rs = $this->_queryID; - if (!$rs or $rs->EOF) { - $this->fields = false; - return false; - } - $this->fields = array(); - - if (!$this->_tarr) { - $tarr = array(); - $flds = array(); - for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { - $f = $rs->Fields($i); - $flds[] = $f; - $tarr[] = $f->Type; - } - // bind types and flds only once - $this->_tarr = $tarr; - $this->_flds = $flds; - } - $t = reset($this->_tarr); - $f = reset($this->_flds); - - if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null - for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { - //echo "

        ",$t,' ';var_dump($f->value); echo '

        '; - switch($t) { - case 135: // timestamp - if (!strlen((string)$f->value)) $this->fields[] = false; - else { - if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value); - // VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00 - $val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600; - else - $val = $f->value; - $this->fields[] = adodb_date('Y-m-d H:i:s',$val); - } - break; - case 133:// A date value (yyyymmdd) - if ($val = $f->value) { - $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2); - } else - $this->fields[] = false; - break; - case 7: // adDate - if (!strlen((string)$f->value)) $this->fields[] = false; - else { - if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value); - else $val = $f->value; - - if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val); - else $this->fields[] = adodb_date('Y-m-d H:i:s',$val); - } - break; - case 1: // null - $this->fields[] = false; - break; - case 20: - case 21: // bigint (64 bit) - $this->fields[] = (float) $f->value; // if 64 bit PHP, could use (int) - break; - case 6: // currency is not supported properly; - ADOConnection::outp( ''.$f->Name.': currency type not supported by PHP'); - $this->fields[] = (float) $f->value; - break; - case 11: //BIT; - $val = ""; - if(is_bool($f->value)) { - if($f->value==true) $val = 1; - else $val = 0; - } - if(is_null($f->value)) $val = null; - - $this->fields[] = $val; - break; - default: - $this->fields[] = $f->value; - break; - } - //print " $f->value $t, "; - $f = next($this->_flds); - $t = next($this->_tarr); - } // for - if ($this->hideErrors) error_reporting($olde); - @$rs->MoveNext(); // @ needed for some versions of PHP! - - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - - function NextRecordSet() - { - $rs = $this->_queryID; - $this->_queryID = $rs->NextRecordSet(); - //$this->_queryID = $this->_QueryId->NextRecordSet(); - if ($this->_queryID == null) return false; - - $this->_currentRow = -1; - $this->_currentPage = -1; - $this->bind = false; - $this->fields = false; - $this->_flds = false; - $this->_tarr = false; - - $this->_inited = false; - $this->Init(); - return true; - } - - function _close() { - $this->_flds = false; - try { - @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk) - } catch (Exception $e) { - } - $this->_queryID = false; - } - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-ado_access.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-ado_access.inc.php deleted file mode 100644 index 3ef649fb..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-ado_access.inc.php +++ /dev/null @@ -1,54 +0,0 @@ -= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php"); - else include(ADODB_DIR."/drivers/adodb-ado.inc.php"); -} - -class ADODB_ado_access extends ADODB_ado { - var $databaseType = 'ado_access'; - var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE - var $fmtDate = "#Y-m-d#"; - var $fmtTimeStamp = "#Y-m-d h:i:sA#";// note no comma - var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; - var $sysTimeStamp = 'NOW'; - var $upperCase = 'ucase'; - - function ADODB_ado_access() - { - $this->ADODB_ado(); - } - - /*function BeginTrans() { return false;} - - function CommitTrans() { return false;} - - function RollbackTrans() { return false;}*/ - -} - - -class ADORecordSet_ado_access extends ADORecordSet_ado { - - var $databaseType = "ado_access"; - - function ADORecordSet_ado_access($id,$mode=false) - { - return $this->ADORecordSet_ado($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-ado_mssql.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-ado_mssql.inc.php deleted file mode 100644 index 6288c2df..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-ado_mssql.inc.php +++ /dev/null @@ -1,154 +0,0 @@ -= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php"); - else include(ADODB_DIR."/drivers/adodb-ado.inc.php"); -} - - -class ADODB_ado_mssql extends ADODB_ado { - var $databaseType = 'ado_mssql'; - var $hasTop = 'top'; - var $hasInsertID = true; - var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; - var $sysTimeStamp = 'GetDate()'; - var $leftOuter = '*='; - var $rightOuter = '=*'; - var $ansiOuter = true; // for mssql7 or later - var $substr = "substring"; - var $length = 'len'; - var $_dropSeqSQL = "drop table %s"; - - //var $_inTransaction = 1; // always open recordsets, so no transaction problems. - - function ADODB_ado_mssql() - { - $this->ADODB_ado(); - } - - function _insertid() - { - return $this->GetOne('select SCOPE_IDENTITY()'); - } - - function _affectedrows() - { - return $this->GetOne('select @@rowcount'); - } - - function SetTransactionMode( $transaction_mode ) - { - $this->_transmode = $transaction_mode; - if (empty($transaction_mode)) { - $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); - return; - } - if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; - $this->Execute("SET TRANSACTION ".$transaction_mode); - } - - function qstr($s,$magic_quotes=false) - { - $s = ADOConnection::qstr($s, $magic_quotes); - return str_replace("\0", "\\\\000", $s); - } - - function MetaColumns($table, $normalize=true) - { - $table = strtoupper($table); - $arr= array(); - $dbc = $this->_connectionID; - - $osoptions = array(); - $osoptions[0] = null; - $osoptions[1] = null; - $osoptions[2] = $table; - $osoptions[3] = null; - - $adors=@$dbc->OpenSchema(4, $osoptions);//tables - - if ($adors){ - while (!$adors->EOF){ - $fld = new ADOFieldObject(); - $c = $adors->Fields(3); - $fld->name = $c->Value; - $fld->type = 'CHAR'; // cannot discover type in ADO! - $fld->max_length = -1; - $arr[strtoupper($fld->name)]=$fld; - - $adors->MoveNext(); - } - $adors->Close(); - } - $false = false; - return empty($arr) ? $false : $arr; - } - - function CreateSequence($seq='adodbseq',$start=1) - { - - $this->Execute('BEGIN TRANSACTION adodbseq'); - $start -= 1; - $this->Execute("create table $seq (id float(53))"); - $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); - if (!$ok) { - $this->Execute('ROLLBACK TRANSACTION adodbseq'); - return false; - } - $this->Execute('COMMIT TRANSACTION adodbseq'); - return true; - } - - function GenID($seq='adodbseq',$start=1) - { - //$this->debug=1; - $this->Execute('BEGIN TRANSACTION adodbseq'); - $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); - if (!$ok) { - $this->Execute("create table $seq (id float(53))"); - $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); - if (!$ok) { - $this->Execute('ROLLBACK TRANSACTION adodbseq'); - return false; - } - $this->Execute('COMMIT TRANSACTION adodbseq'); - return $start; - } - $num = $this->GetOne("select id from $seq"); - $this->Execute('COMMIT TRANSACTION adodbseq'); - return $num; - - // in old implementation, pre 1.90, we returned GUID... - //return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'"); - } - -} // end class - -class ADORecordSet_ado_mssql extends ADORecordSet_ado { - - var $databaseType = 'ado_mssql'; - - function ADORecordSet_ado_mssql($id,$mode=false) - { - return $this->ADORecordSet_ado($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-ads.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-ads.inc.php deleted file mode 100644 index 10f95ebd..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-ads.inc.php +++ /dev/null @@ -1,796 +0,0 @@ -_haserrorfunctions = ADODB_PHPVER >= 0x4050; - $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; - } - - // returns true or false - function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - if (!function_exists('ads_connect')) return null; - - if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') { - ADOConnection::outp("For Advantage Connect(), $argDatabasename is not used. Place dsn in 1st parameter."); - } - if (isset($php_errormsg)) $php_errormsg = ''; - if ($this->curmode === false) $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword); - else $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword,$this->curmode); - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - if (isset($this->connectStmt)) $this->Execute($this->connectStmt); - - return $this->_connectionID != false; - } - - // returns true or false - function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - if (!function_exists('ads_connect')) return null; - - if (isset($php_errormsg)) $php_errormsg = ''; - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - if ($this->debug && $argDatabasename) { - ADOConnection::outp("For PConnect(), $argDatabasename is not used. Place dsn in 1st parameter."); - } - // print "dsn=$argDSN u=$argUsername p=$argPassword
        "; flush(); - if ($this->curmode === false) $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword); - else $this->_connectionID = ads_pconnect($argDSN,$argUsername,$argPassword,$this->curmode); - - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - if ($this->_connectionID && $this->autoRollback) @ads_rollback($this->_connectionID); - if (isset($this->connectStmt)) $this->Execute($this->connectStmt); - - return $this->_connectionID != false; - } - - // returns the Server version and Description - function ServerInfo() - { - - if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { - $stmt = $this->Prepare('EXECUTE PROCEDURE sp_mgGetInstallInfo()'); - $res = $this->Execute($stmt); - if(!$res) - print $this->ErrorMsg(); - else{ - $ret["version"]= $res->fields[3]; - $ret["description"]="Advantage Database Server"; - return $ret; - } - } - else { - return ADOConnection::ServerInfo(); - } - } - - - // returns true or false - function CreateSequence( $seqname,$start=1) - { - $res = $this->Execute("CREATE TABLE $seqname ( ID autoinc( 1 ) ) IN DATABASE"); - if(!$res){ - print $this->ErrorMsg(); - return false; - } - else - return true; - - } - - // returns true or false - function DropSequence($seqname) - { - $res = $this->Execute("DROP TABLE $seqname"); - if(!$res){ - print $this->ErrorMsg(); - return false; - } - else - return true; - } - - - // returns the generated ID or false - // checks if the table already exists, else creates the table and inserts a record into the table - // and gets the ID number of the last inserted record. - function GenID($seqname,$start=1) - { - $go = $this->Execute("select * from $seqname"); - if (!$go){ - $res = $this->Execute("CREATE TABLE $seqname ( ID autoinc( 1 ) ) IN DATABASE"); - if(!res){ - print $this->ErrorMsg(); - return false; - } - } - $res = $this->Execute("INSERT INTO $seqname VALUES( DEFAULT )"); - if(!$res){ - print $this->ErrorMsg(); - return false; - } - else{ - $gen = $this->Execute("SELECT LastAutoInc( STATEMENT ) FROM system.iota"); - $ret = $gen->fields[0]; - return $ret; - } - - } - - - - - function ErrorMsg() - { - if ($this->_haserrorfunctions) { - if ($this->_errorMsg !== false) return $this->_errorMsg; - if (empty($this->_connectionID)) return @ads_errormsg(); - return @ads_errormsg($this->_connectionID); - } else return ADOConnection::ErrorMsg(); - } - - - function ErrorNo() - { - - if ($this->_haserrorfunctions) { - if ($this->_errorCode !== false) { - // bug in 4.0.6, error number can be corrupted string (should be 6 digits) - return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; - } - - if (empty($this->_connectionID)) $e = @ads_error(); - else $e = @ads_error($this->_connectionID); - - // bug in 4.0.6, error number can be corrupted string (should be 6 digits) - // so we check and patch - if (strlen($e)<=2) return 0; - return $e; - } else return ADOConnection::ErrorNo(); - } - - - - function BeginTrans() - { - if (!$this->hasTransactions) return false; - if ($this->transOff) return true; - $this->transCnt += 1; - $this->_autocommit = false; - return ads_autocommit($this->_connectionID,false); - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - $ret = ads_commit($this->_connectionID); - ads_autocommit($this->_connectionID,true); - return $ret; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - $ret = ads_rollback($this->_connectionID); - ads_autocommit($this->_connectionID,true); - return $ret; - } - - - // Returns tables,Views or both on succesfull execution. Returns - // tables by default on succesfull execustion. - function &MetaTables($ttype) - { - $recordSet1 = $this->Execute("select * from system.tables"); - if(!$recordSet1){ - print $this->ErrorMsg(); - return false; - } - $recordSet2 = $this->Execute("select * from system.views"); - if(!$recordSet2){ - print $this->ErrorMsg(); - return false; - } - $i=0; - while (!$recordSet1->EOF){ - $arr["$i"] = $recordSet1->fields[0]; - $recordSet1->MoveNext(); - $i=$i+1; - } - if($ttype=='FALSE'){ - while (!$recordSet2->EOF){ - $arr["$i"] = $recordSet2->fields[0]; - $recordSet2->MoveNext(); - $i=$i+1; - } - return $arr; - } - elseif($ttype=='VIEWS'){ - while (!$recordSet2->EOF){ - $arrV["$i"] = $recordSet2->fields[0]; - $recordSet2->MoveNext(); - $i=$i+1; - } - return $arrV; - } - else{ - return $arr; - } - - } - - function &MetaPrimaryKeys($table) - { - $recordSet = $this->Execute("select table_primary_key from system.tables where name='$table'"); - if(!$recordSet){ - print $this->ErrorMsg(); - return false; - } - $i=0; - while (!$recordSet->EOF){ - $arr["$i"] = $recordSet->fields[0]; - $recordSet->MoveNext(); - $i=$i+1; - } - return $arr; - } - - /* - See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp - / SQL data type codes / - #define SQL_UNKNOWN_TYPE 0 - #define SQL_CHAR 1 - #define SQL_NUMERIC 2 - #define SQL_DECIMAL 3 - #define SQL_INTEGER 4 - #define SQL_SMALLINT 5 - #define SQL_FLOAT 6 - #define SQL_REAL 7 - #define SQL_DOUBLE 8 - #if (ODBCVER >= 0x0300) - #define SQL_DATETIME 9 - #endif - #define SQL_VARCHAR 12 - - - / One-parameter shortcuts for date/time data types / - #if (ODBCVER >= 0x0300) - #define SQL_TYPE_DATE 91 - #define SQL_TYPE_TIME 92 - #define SQL_TYPE_TIMESTAMP 93 - - #define SQL_UNICODE (-95) - #define SQL_UNICODE_VARCHAR (-96) - #define SQL_UNICODE_LONGVARCHAR (-97) - */ - function ODBCTypes($t) - { - switch ((integer)$t) { - case 1: - case 12: - case 0: - case -95: - case -96: - return 'C'; - case -97: - case -1: //text - return 'X'; - case -4: //image - return 'B'; - - case 9: - case 91: - return 'D'; - - case 10: - case 11: - case 92: - case 93: - return 'T'; - - case 4: - case 5: - case -6: - return 'I'; - - case -11: // uniqidentifier - return 'R'; - case -7: //bit - return 'L'; - - default: - return 'N'; - } - } - - function &MetaColumns($table) - { - global $ADODB_FETCH_MODE; - - $false = false; - if ($this->uCaseTables) $table = strtoupper($table); - $schema = ''; - $this->_findschema($table,$schema); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - /*if (false) { // after testing, confirmed that the following does not work becoz of a bug - $qid2 = ads_tables($this->_connectionID); - $rs = new ADORecordSet_ads($qid2); - $ADODB_FETCH_MODE = $savem; - if (!$rs) return false; - $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; - $rs->_fetch(); - - while (!$rs->EOF) { - if ($table == strtoupper($rs->fields[2])) { - $q = $rs->fields[0]; - $o = $rs->fields[1]; - break; - } - $rs->MoveNext(); - } - $rs->Close(); - - $qid = ads_columns($this->_connectionID,$q,$o,strtoupper($table),'%'); - } */ - - switch ($this->databaseType) { - case 'access': - case 'vfp': - $qid = ads_columns($this->_connectionID);#,'%','',strtoupper($table),'%'); - break; - - - case 'db2': - $colname = "%"; - $qid = ads_columns($this->_connectionID, "", $schema, $table, $colname); - break; - - default: - $qid = @ads_columns($this->_connectionID,'%','%',strtoupper($table),'%'); - if (empty($qid)) $qid = ads_columns($this->_connectionID); - break; - } - if (empty($qid)) return $false; - - $rs = new ADORecordSet_ads($qid); - $ADODB_FETCH_MODE = $savem; - - if (!$rs) return $false; - $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; - $rs->_fetch(); - - $retarr = array(); - - /* - $rs->fields indices - 0 TABLE_QUALIFIER - 1 TABLE_SCHEM - 2 TABLE_NAME - 3 COLUMN_NAME - 4 DATA_TYPE - 5 TYPE_NAME - 6 PRECISION - 7 LENGTH - 8 SCALE - 9 RADIX - 10 NULLABLE - 11 REMARKS - */ - while (!$rs->EOF) { - // adodb_pr($rs->fields); - if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[3]; - $fld->type = $this->ODBCTypes($rs->fields[4]); - - // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp - // access uses precision to store length for char/varchar - if ($fld->type == 'C' or $fld->type == 'X') { - if ($this->databaseType == 'access') - $fld->max_length = $rs->fields[6]; - else if ($rs->fields[4] <= -95) // UNICODE - $fld->max_length = $rs->fields[7]/2; - else - $fld->max_length = $rs->fields[7]; - } else - $fld->max_length = $rs->fields[7]; - $fld->not_null = !empty($rs->fields[10]); - $fld->scale = $rs->fields[8]; - $retarr[strtoupper($fld->name)] = $fld; - } else if (sizeof($retarr)>0) - break; - $rs->MoveNext(); - } - $rs->Close(); //-- crashes 4.03pl1 -- why? - - if (empty($retarr)) $retarr = false; - return $retarr; - } - - // Returns an array of columns names for a given table - function &MetaColumnNames($table) - { - $recordSet = $this->Execute("select name from system.columns where parent='$table'"); - if(!$recordSet){ - print $this->ErrorMsg(); - return false; - } - else{ - $i=0; - while (!$recordSet->EOF){ - $arr["FIELD$i"] = $recordSet->fields[0]; - $recordSet->MoveNext(); - $i=$i+1; - } - return $arr; - } - } - - - function Prepare($sql) - { - if (! $this->_bindInputArray) return $sql; // no binding - $stmt = ads_prepare($this->_connectionID,$sql); - if (!$stmt) { - // we don't know whether odbc driver is parsing prepared stmts, so just return sql - return $sql; - } - return array($sql,$stmt,false); - } - - /* returns queryID or false */ - function _query($sql,$inputarr=false) - { - GLOBAL $php_errormsg; - if (isset($php_errormsg)) $php_errormsg = ''; - $this->_error = ''; - - if ($inputarr) { - if (is_array($sql)) { - $stmtid = $sql[1]; - } else { - $stmtid = ads_prepare($this->_connectionID,$sql); - - if ($stmtid == false) { - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - return false; - } - } - - if (! ads_execute($stmtid,$inputarr)) { - //@ads_free_result($stmtid); - if ($this->_haserrorfunctions) { - $this->_errorMsg = ads_errormsg(); - $this->_errorCode = ads_error(); - } - return false; - } - - } else if (is_array($sql)) { - $stmtid = $sql[1]; - if (!ads_execute($stmtid)) { - //@ads_free_result($stmtid); - if ($this->_haserrorfunctions) { - $this->_errorMsg = ads_errormsg(); - $this->_errorCode = ads_error(); - } - return false; - } - } else - { - - $stmtid = ads_exec($this->_connectionID,$sql); - - } - - $this->_lastAffectedRows = 0; - - if ($stmtid) - { - - if (@ads_num_fields($stmtid) == 0) { - $this->_lastAffectedRows = ads_num_rows($stmtid); - $stmtid = true; - - } else { - - $this->_lastAffectedRows = 0; - ads_binmode($stmtid,$this->binmode); - ads_longreadlen($stmtid,$this->maxblobsize); - - } - - if ($this->_haserrorfunctions) - { - - $this->_errorMsg = ''; - $this->_errorCode = 0; - } - else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - } - else - { - if ($this->_haserrorfunctions) { - $this->_errorMsg = ads_errormsg(); - $this->_errorCode = ads_error(); - } else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - } - - return $stmtid; - - } - - /* - Insert a null into the blob field of the table first. - Then use UpdateBlob to store the blob. - - Usage: - - $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - $sql = "UPDATE $table SET $column=? WHERE $where"; - $stmtid = ads_prepare($this->_connectionID,$sql); - if ($stmtid == false){ - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - return false; - } - if (! ads_execute($stmtid,array($val),array(SQL_BINARY) )){ - if ($this->_haserrorfunctions){ - $this->_errorMsg = ads_errormsg(); - $this->_errorCode = ads_error(); - } - return false; - } - return TRUE; - } - - // returns true or false - function _close() - { - $ret = @ads_close($this->_connectionID); - $this->_connectionID = false; - return $ret; - } - - function _affectedrows() - { - return $this->_lastAffectedRows; - } - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_ads extends ADORecordSet { - - var $bind = false; - var $databaseType = "ads"; - var $dataProvider = "ads"; - var $useFetchArray; - var $_has_stupid_odbc_fetch_api_change; - - function ADORecordSet_ads($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - - $this->_queryID = $id; - - // the following is required for mysql odbc driver in 4.3.1 -- why? - $this->EOF = false; - $this->_currentRow = -1; - //$this->ADORecordSet($id); - } - - - // returns the field object - function &FetchField($fieldOffset = -1) - { - - $off=$fieldOffset+1; // offsets begin at 1 - - $o= new ADOFieldObject(); - $o->name = @ads_field_name($this->_queryID,$off); - $o->type = @ads_field_type($this->_queryID,$off); - $o->max_length = @ads_field_len($this->_queryID,$off); - if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); - else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); - return $o; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - - function _initrs() - { - global $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS) ? @ads_num_rows($this->_queryID) : -1; - $this->_numOfFields = @ads_num_fields($this->_queryID); - // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 - if ($this->_numOfRows == 0) $this->_numOfRows = -1; - //$this->useFetchArray = $this->connection->useFetchArray; - $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; - } - - function _seek($row) - { - return false; - } - - // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated - function &GetArrayLimit($nrows,$offset=-1) - { - if ($offset <= 0) { - $rs =& $this->GetArray($nrows); - return $rs; - } - $savem = $this->fetchMode; - $this->fetchMode = ADODB_FETCH_NUM; - $this->Move($offset); - $this->fetchMode = $savem; - - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - - $results = array(); - $cnt = 0; - while (!$this->EOF && $nrows != $cnt) { - $results[$cnt++] = $this->fields; - $this->MoveNext(); - } - - return $results; - } - - - function MoveNext() - { - if ($this->_numOfRows != 0 && !$this->EOF) { - $this->_currentRow++; - - if ($this->_has_stupid_odbc_fetch_api_change) - $rez = @ads_fetch_into($this->_queryID,$this->fields); - else { - $row = 0; - $rez = @ads_fetch_into($this->_queryID,$row,$this->fields); - } - if ($rez) { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - } - $this->fields = false; - $this->EOF = true; - return false; - } - - function _fetch() - { - - if ($this->_has_stupid_odbc_fetch_api_change) - $rez = @ads_fetch_into($this->_queryID,$this->fields); - else { - $row = 0; - $rez = @ads_fetch_into($this->_queryID,$row,$this->fields); - } - if ($rez) { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - $this->fields = false; - return false; - } - - function _close() - { - return @ads_free_result($this->_queryID); - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-borland_ibase.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-borland_ibase.inc.php deleted file mode 100644 index 8c1de340..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-borland_ibase.inc.php +++ /dev/null @@ -1,92 +0,0 @@ -ADODB_ibase(); - } - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - $this->autoCommit = false; - $this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID); - return $this->_transactionID; - } - - function ServerInfo() - { - $arr['dialect'] = $this->dialect; - switch($arr['dialect']) { - case '': - case '1': $s = 'Interbase 6.5, Dialect 1'; break; - case '2': $s = 'Interbase 6.5, Dialect 2'; break; - default: - case '3': $s = 'Interbase 6.5, Dialect 3'; break; - } - $arr['version'] = '6.5'; - $arr['description'] = $s; - return $arr; - } - - // Note that Interbase 6.5 uses ROWS instead - don't you love forking wars! - // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows - // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2 - // Firebird uses - // SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - if ($nrows > 0) { - if ($offset <= 0) $str = " ROWS $nrows "; - else { - $a = $offset+1; - $b = $offset+$nrows; - $str = " ROWS $a TO $b"; - } - } else { - // ok, skip - $a = $offset + 1; - $str = " ROWS $a TO 999999999"; // 999 million - } - $sql .= $str; - - return ($secs2cache) ? - $this->CacheExecute($secs2cache,$sql,$inputarr) - : - $this->Execute($sql,$inputarr); - } - -}; - - -class ADORecordSet_borland_ibase extends ADORecordSet_ibase { - - var $databaseType = "borland_ibase"; - - function ADORecordSet_borland_ibase($id,$mode=false) - { - $this->ADORecordSet_ibase($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-csv.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-csv.inc.php deleted file mode 100644 index bbe92457..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-csv.inc.php +++ /dev/null @@ -1,207 +0,0 @@ -_insertid; - } - - function _affectedrows() - { - return $this->_affectedrows; - } - - function MetaDatabases() - { - return false; - } - - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (strtolower(substr($argHostname,0,7)) !== 'http://') return false; - $this->_url = $argHostname; - return true; - } - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (strtolower(substr($argHostname,0,7)) !== 'http://') return false; - $this->_url = $argHostname; - return true; - } - - function MetaColumns($table, $normalize=true) - { - return false; - } - - - // parameters use PostgreSQL convention, not MySQL - function SelectLimit($sql,$nrows=-1,$offset=-1) - { - global $ADODB_FETCH_MODE; - - $url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=". - (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE). - "&offset=$offset"; - $err = false; - $rs = csv2rs($url,$err,false); - - if ($this->debug) print "$url
        $err
        "; - - $at = strpos($err,'::::'); - if ($at === false) { - $this->_errorMsg = $err; - $this->_errorNo = (integer)$err; - } else { - $this->_errorMsg = substr($err,$at+4,1024); - $this->_errorNo = -9999; - } - if ($this->_errorNo) - if ($fn = $this->raiseErrorFn) { - $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,''); - } - - if (is_object($rs)) { - - $rs->databaseType='csv'; - $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE; - $rs->connection = $this; - } - return $rs; - } - - // returns queryID or false - function _Execute($sql,$inputarr=false) - { - global $ADODB_FETCH_MODE; - - if (!$this->_bindInputArray && $inputarr) { - $sqlarr = explode('?',$sql); - $sql = ''; - $i = 0; - foreach($inputarr as $v) { - - $sql .= $sqlarr[$i]; - if (gettype($v) == 'string') - $sql .= $this->qstr($v); - else if ($v === null) - $sql .= 'NULL'; - else - $sql .= $v; - $i += 1; - - } - $sql .= $sqlarr[$i]; - if ($i+1 != sizeof($sqlarr)) - print "Input Array does not match ?: ".htmlspecialchars($sql); - $inputarr = false; - } - - $url = $this->_url.'?sql='.urlencode($sql)."&fetch=". - (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE); - $err = false; - - - $rs = csv2rs($url,$err,false); - if ($this->debug) print urldecode($url)."
        $err
        "; - $at = strpos($err,'::::'); - if ($at === false) { - $this->_errorMsg = $err; - $this->_errorNo = (integer)$err; - } else { - $this->_errorMsg = substr($err,$at+4,1024); - $this->_errorNo = -9999; - } - - if ($this->_errorNo) - if ($fn = $this->raiseErrorFn) { - $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr); - } - if (is_object($rs)) { - $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE; - - $this->_affectedrows = $rs->affectedrows; - $this->_insertid = $rs->insertid; - $rs->databaseType='csv'; - $rs->connection = $this; - } - return $rs; - } - - /* Returns: the last error message from previous database operation */ - function ErrorMsg() - { - return $this->_errorMsg; - } - - /* Returns: the last error number from previous database operation */ - function ErrorNo() - { - return $this->_errorNo; - } - - // returns true or false - function _close() - { - return true; - } - } // class - - class ADORecordset_csv extends ADORecordset { - function ADORecordset_csv($id,$mode=false) - { - $this->ADORecordset($id,$mode); - } - - function _close() - { - return true; - } - } - -} // define - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-db2.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-db2.inc.php deleted file mode 100644 index ab2fec2b..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-db2.inc.php +++ /dev/null @@ -1,860 +0,0 @@ -_haserrorfunctions = ADODB_PHPVER >= 0x4050; - } - - // returns true or false - function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - if (!function_exists('db2_connect')) { - ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension which is not installed."); - return null; - } - // This needs to be set before the connect(). - // Replaces the odbc_binmode() call that was in Execute() - ini_set('ibm_db2.binmode', $this->binmode); - - if ($argDatabasename && empty($argDSN)) { - - if (stripos($argDatabasename,'UID=') && stripos($argDatabasename,'PWD=')) $this->_connectionID = db2_connect($argDatabasename,null,null); - else $this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword); - } else { - if ($argDatabasename) $schema = $argDatabasename; - if (stripos($argDSN,'UID=') && stripos($argDSN,'PWD=')) $this->_connectionID = db2_connect($argDSN,null,null); - else $this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword); - } - if (isset($php_errormsg)) $php_errormsg = ''; - - // For db2_connect(), there is an optional 4th arg. If present, it must be - // an array of valid options. So far, we don't use them. - - $this->_errorMsg = @db2_conn_errormsg(); - if (isset($this->connectStmt)) $this->Execute($this->connectStmt); - - if ($this->_connectionID && isset($schema)) $this->Execute("SET SCHEMA=$schema"); - return $this->_connectionID != false; - } - - // returns true or false - function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - if (!function_exists('db2_connect')) return null; - - // This needs to be set before the connect(). - // Replaces the odbc_binmode() call that was in Execute() - ini_set('ibm_db2.binmode', $this->binmode); - - if (isset($php_errormsg)) $php_errormsg = ''; - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - - if ($argDatabasename && empty($argDSN)) { - - if (stripos($argDatabasename,'UID=') && stripos($argDatabasename,'PWD=')) $this->_connectionID = db2_pconnect($argDatabasename,null,null); - else $this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword); - } else { - if ($argDatabasename) $schema = $argDatabasename; - if (stripos($argDSN,'UID=') && stripos($argDSN,'PWD=')) $this->_connectionID = db2_pconnect($argDSN,null,null); - else $this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword); - } - if (isset($php_errormsg)) $php_errormsg = ''; - - $this->_errorMsg = @db2_conn_errormsg(); - if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID); - if (isset($this->connectStmt)) $this->Execute($this->connectStmt); - - if ($this->_connectionID && isset($schema)) $this->Execute("SET SCHEMA=$schema"); - return $this->_connectionID != false; - } - - // format and return date string in database timestamp format - function DBTimeStamp($ts) - { - if (empty($ts) && $ts !== 0) return 'null'; - if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); - return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'YYYY-MM-DD HH24:MI:SS')"; - } - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - // use right() and replace() ? - if (!$col) $col = $this->sysDate; - - /* use TO_CHAR() if $fmt is TO_CHAR() allowed fmt */ - if ($fmt== 'Y-m-d H:i:s') - return 'TO_CHAR('.$col.", 'YYYY-MM-DD HH24:MI:SS')"; - - $s = ''; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - if ($s) $s .= $this->concat_operator; - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - if ($len==1) return "year($col)"; - $s .= "char(year($col))"; - break; - case 'M': - if ($len==1) return "monthname($col)"; - $s .= "substr(monthname($col),1,3)"; - break; - case 'm': - if ($len==1) return "month($col)"; - $s .= "right(digits(month($col)),2)"; - break; - case 'D': - case 'd': - if ($len==1) return "day($col)"; - $s .= "right(digits(day($col)),2)"; - break; - case 'H': - case 'h': - if ($len==1) return "hour($col)"; - if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)"; - else $s .= "''"; - break; - case 'i': - case 'I': - if ($len==1) return "minute($col)"; - if ($col != $this->sysDate) - $s .= "right(digits(minute($col)),2)"; - else $s .= "''"; - break; - case 'S': - case 's': - if ($len==1) return "second($col)"; - if ($col != $this->sysDate) - $s .= "right(digits(second($col)),2)"; - else $s .= "''"; - break; - default: - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - $s .= $this->qstr($ch); - } - } - return $s; - } - - - function ServerInfo() - { - - if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { - $dsn = strtoupper($this->host); - $first = true; - $found = false; - - if (!function_exists('db2_data_source')) return false; - - while(true) { - - $rez = @db2_data_source($this->_connectionID, - $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT); - $first = false; - if (!is_array($rez)) break; - if (strtoupper($rez['server']) == $dsn) { - $found = true; - break; - } - } - if (!$found) return ADOConnection::ServerInfo(); - if (!isset($rez['version'])) $rez['version'] = ''; - return $rez; - } else { - return ADOConnection::ServerInfo(); - } - } - - function CreateSequence($seqname='adodbseq',$start=1) - { - if (empty($this->_genSeqSQL)) return false; - $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$start)); - if (!$ok) return false; - return true; - } - - function DropSequence($seqname) - { - if (empty($this->_dropSeqSQL)) return false; - return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); - } - - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false) - { - $nrows = (integer) $nrows; - if ($offset <= 0) { - // could also use " OPTIMIZE FOR $nrows ROWS " - if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY "; - $rs = $this->Execute($sql,$inputArr); - } else { - if ($offset > 0 && $nrows < 0); - else { - $nrows += $offset; - $sql .= " FETCH FIRST $nrows ROWS ONLY "; - } - $rs = ADOConnection::SelectLimit($sql,-1,$offset,$inputArr); - } - - return $rs; - } - - /* - This algorithm is not very efficient, but works even if table locking - is not available. - - Will return false if unable to generate an ID after $MAXLOOPS attempts. - */ - function GenID($seq='adodbseq',$start=1) - { - // if you have to modify the parameter below, your database is overloaded, - // or you need to implement generation of id's yourself! - $num = $this->GetOne("VALUES NEXTVAL FOR $seq"); - return $num; - } - - - function ErrorMsg() - { - if ($this->_haserrorfunctions) { - if ($this->_errorMsg !== false) return $this->_errorMsg; - if (empty($this->_connectionID)) return @db2_conn_errormsg(); - return @db2_conn_errormsg($this->_connectionID); - } else return ADOConnection::ErrorMsg(); - } - - function ErrorNo() - { - - if ($this->_haserrorfunctions) { - if ($this->_errorCode !== false) { - // bug in 4.0.6, error number can be corrupted string (should be 6 digits) - return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; - } - - if (empty($this->_connectionID)) $e = @db2_conn_error(); - else $e = @db2_conn_error($this->_connectionID); - - // bug in 4.0.6, error number can be corrupted string (should be 6 digits) - // so we check and patch - if (strlen($e)<=2) return 0; - return $e; - } else return ADOConnection::ErrorNo(); - } - - - - function BeginTrans() - { - if (!$this->hasTransactions) return false; - if ($this->transOff) return true; - $this->transCnt += 1; - $this->_autocommit = false; - return db2_autocommit($this->_connectionID,false); - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - $ret = db2_commit($this->_connectionID); - db2_autocommit($this->_connectionID,true); - return $ret; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - $ret = db2_rollback($this->_connectionID); - db2_autocommit($this->_connectionID,true); - return $ret; - } - - function MetaPrimaryKeys($table) - { - global $ADODB_FETCH_MODE; - - if ($this->uCaseTables) $table = strtoupper($table); - $schema = ''; - $this->_findschema($table,$schema); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = @db2_primarykeys($this->_connectionID,'',$schema,$table); - - if (!$qid) { - $ADODB_FETCH_MODE = $savem; - return false; - } - $rs = new ADORecordSet_db2($qid); - $ADODB_FETCH_MODE = $savem; - - if (!$rs) return false; - - $arr = $rs->GetArray(); - $rs->Close(); - $arr2 = array(); - for ($i=0; $i < sizeof($arr); $i++) { - if ($arr[$i][3]) $arr2[] = $arr[$i][3]; - } - return $arr2; - } - - function MetaForeignKeys($table, $owner = FALSE, $upper = FALSE, $asociative = FALSE ) - { - global $ADODB_FETCH_MODE; - - if ($this->uCaseTables) $table = strtoupper($table); - $schema = ''; - $this->_findschema($table,$schema); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = @db2_foreign_keys($this->_connectionID,'',$schema,$table); - if (!$qid) { - $ADODB_FETCH_MODE = $savem; - return false; - } - $rs = new ADORecordSet_db2($qid); - - $ADODB_FETCH_MODE = $savem; - /* - $rs->fields indices - 0 PKTABLE_CAT - 1 PKTABLE_SCHEM - 2 PKTABLE_NAME - 3 PKCOLUMN_NAME - 4 FKTABLE_CAT - 5 FKTABLE_SCHEM - 6 FKTABLE_NAME - 7 FKCOLUMN_NAME - */ - if (!$rs) return false; - - $foreign_keys = array(); - while (!$rs->EOF) { - if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { - if (!is_array($foreign_keys[$rs->fields[5].'.'.$rs->fields[6]])) - $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]] = array(); - $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]][$rs->fields[7]] = $rs->fields[3]; - } - $rs->MoveNext(); - } - - $rs->Close(); - return $foreign_key; - } - - - function MetaTables($ttype=false,$schema=false) - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = db2_tables($this->_connectionID); - - $rs = new ADORecordSet_db2($qid); - - $ADODB_FETCH_MODE = $savem; - if (!$rs) { - $false = false; - return $false; - } - - $arr = $rs->GetArray(); - $rs->Close(); - $arr2 = array(); - - if ($ttype) { - $isview = strncmp($ttype,'V',1) === 0; - } - for ($i=0; $i < sizeof($arr); $i++) { - if (!$arr[$i][2]) continue; - $type = $arr[$i][3]; - $owner = $arr[$i][1]; - $schemaval = ($schema) ? $arr[$i][1].'.' : ''; - if ($ttype) { - if ($isview) { - if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2]; - } else if (strncmp($owner,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2]; - } else if (strncmp($owner,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2]; - } - return $arr2; - } - - /* - See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2datetime_data_type_changes.asp - / SQL data type codes / - #define SQL_UNKNOWN_TYPE 0 - #define SQL_CHAR 1 - #define SQL_NUMERIC 2 - #define SQL_DECIMAL 3 - #define SQL_INTEGER 4 - #define SQL_SMALLINT 5 - #define SQL_FLOAT 6 - #define SQL_REAL 7 - #define SQL_DOUBLE 8 - #if (DB2VER >= 0x0300) - #define SQL_DATETIME 9 - #endif - #define SQL_VARCHAR 12 - - - / One-parameter shortcuts for date/time data types / - #if (DB2VER >= 0x0300) - #define SQL_TYPE_DATE 91 - #define SQL_TYPE_TIME 92 - #define SQL_TYPE_TIMESTAMP 93 - - #define SQL_UNICODE (-95) - #define SQL_UNICODE_VARCHAR (-96) - #define SQL_UNICODE_LONGVARCHAR (-97) - */ - function DB2Types($t) - { - switch ((integer)$t) { - case 1: - case 12: - case 0: - case -95: - case -96: - return 'C'; - case -97: - case -1: //text - return 'X'; - case -4: //image - return 'B'; - - case 9: - case 91: - return 'D'; - - case 10: - case 11: - case 92: - case 93: - return 'T'; - - case 4: - case 5: - case -6: - return 'I'; - - case -11: // uniqidentifier - return 'R'; - case -7: //bit - return 'L'; - - default: - return 'N'; - } - } - - function MetaColumns($table, $normalize=true) - { - global $ADODB_FETCH_MODE; - - $false = false; - if ($this->uCaseTables) $table = strtoupper($table); - $schema = ''; - $this->_findschema($table,$schema); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - $colname = "%"; - $qid = db2_columns($this->_connectionID, "", $schema, $table, $colname); - if (empty($qid)) return $false; - - $rs = new ADORecordSet_db2($qid); - $ADODB_FETCH_MODE = $savem; - - if (!$rs) return $false; - $rs->_fetch(); - - $retarr = array(); - - /* - $rs->fields indices - 0 TABLE_QUALIFIER - 1 TABLE_SCHEM - 2 TABLE_NAME - 3 COLUMN_NAME - 4 DATA_TYPE - 5 TYPE_NAME - 6 PRECISION - 7 LENGTH - 8 SCALE - 9 RADIX - 10 NULLABLE - 11 REMARKS - */ - while (!$rs->EOF) { - if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[3]; - $fld->type = $this->DB2Types($rs->fields[4]); - - // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp - // access uses precision to store length for char/varchar - if ($fld->type == 'C' or $fld->type == 'X') { - if ($rs->fields[4] <= -95) // UNICODE - $fld->max_length = $rs->fields[7]/2; - else - $fld->max_length = $rs->fields[7]; - } else - $fld->max_length = $rs->fields[7]; - $fld->not_null = !empty($rs->fields[10]); - $fld->scale = $rs->fields[8]; - $fld->primary_key = false; - $retarr[strtoupper($fld->name)] = $fld; - } else if (sizeof($retarr)>0) - break; - $rs->MoveNext(); - } - $rs->Close(); - if (empty($retarr)) $retarr = false; - - $qid = db2_primary_keys($this->_connectionID, "", $schema, $table); - if (empty($qid)) return $false; - - $rs = new ADORecordSet_db2($qid); - $ADODB_FETCH_MODE = $savem; - - if (!$rs) return $retarr; - $rs->_fetch(); - - /* - $rs->fields indices - 0 TABLE_CAT - 1 TABLE_SCHEM - 2 TABLE_NAME - 3 COLUMN_NAME - 4 KEY_SEQ - 5 PK_NAME - */ - while (!$rs->EOF) { - if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { - $retarr[strtoupper($rs->fields[3])]->primary_key = true; - } else if (sizeof($retarr)>0) - break; - $rs->MoveNext(); - } - $rs->Close(); - - if (empty($retarr)) $retarr = false; - return $retarr; - } - - - function Prepare($sql) - { - if (! $this->_bindInputArray) return $sql; // no binding - $stmt = db2_prepare($this->_connectionID,$sql); - if (!$stmt) { - // we don't know whether db2 driver is parsing prepared stmts, so just return sql - return $sql; - } - return array($sql,$stmt,false); - } - - /* returns queryID or false */ - function _query($sql,$inputarr=false) - { - GLOBAL $php_errormsg; - if (isset($php_errormsg)) $php_errormsg = ''; - $this->_error = ''; - - if ($inputarr) { - if (is_array($sql)) { - $stmtid = $sql[1]; - } else { - $stmtid = db2_prepare($this->_connectionID,$sql); - - if ($stmtid == false) { - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - return false; - } - } - - if (! db2_execute($stmtid,$inputarr)) { - if ($this->_haserrorfunctions) { - $this->_errorMsg = db2_stmt_errormsg(); - $this->_errorCode = db2_stmt_error(); - } - return false; - } - - } else if (is_array($sql)) { - $stmtid = $sql[1]; - if (!db2_execute($stmtid)) { - if ($this->_haserrorfunctions) { - $this->_errorMsg = db2_stmt_errormsg(); - $this->_errorCode = db2_stmt_error(); - } - return false; - } - } else - $stmtid = @db2_exec($this->_connectionID,$sql); - - $this->_lastAffectedRows = 0; - if ($stmtid) { - if (@db2_num_fields($stmtid) == 0) { - $this->_lastAffectedRows = db2_num_rows($stmtid); - $stmtid = true; - } else { - $this->_lastAffectedRows = 0; - } - - if ($this->_haserrorfunctions) { - $this->_errorMsg = ''; - $this->_errorCode = 0; - } else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - } else { - if ($this->_haserrorfunctions) { - $this->_errorMsg = db2_stmt_errormsg(); - $this->_errorCode = db2_stmt_error(); - } else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - - } - return $stmtid; - } - - /* - Insert a null into the blob field of the table first. - Then use UpdateBlob to store the blob. - - Usage: - - $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; - } - - // returns true or false - function _close() - { - $ret = @db2_close($this->_connectionID); - $this->_connectionID = false; - return $ret; - } - - function _affectedrows() - { - return $this->_lastAffectedRows; - } - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_db2 extends ADORecordSet { - - var $bind = false; - var $databaseType = "db2"; - var $dataProvider = "db2"; - var $useFetchArray; - - function ADORecordSet_db2($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - - $this->_queryID = $id; - } - - - // returns the field object - function FetchField($offset = -1) - { - $o= new ADOFieldObject(); - $o->name = @db2_field_name($this->_queryID,$offset); - $o->type = @db2_field_type($this->_queryID,$offset); - $o->max_length = db2_field_width($this->_queryID,$offset); - if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); - else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); - return $o; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - - function _initrs() - { - global $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1; - $this->_numOfFields = @db2_num_fields($this->_queryID); - // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 - if ($this->_numOfRows == 0) $this->_numOfRows = -1; - } - - function _seek($row) - { - return false; - } - - // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated - function GetArrayLimit($nrows,$offset=-1) - { - if ($offset <= 0) { - $rs = $this->GetArray($nrows); - return $rs; - } - $savem = $this->fetchMode; - $this->fetchMode = ADODB_FETCH_NUM; - $this->Move($offset); - $this->fetchMode = $savem; - - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - - $results = array(); - $cnt = 0; - while (!$this->EOF && $nrows != $cnt) { - $results[$cnt++] = $this->fields; - $this->MoveNext(); - } - - return $results; - } - - - function MoveNext() - { - if ($this->_numOfRows != 0 && !$this->EOF) { - $this->_currentRow++; - - $this->fields = @db2_fetch_array($this->_queryID); - if ($this->fields) { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - } - $this->fields = false; - $this->EOF = true; - return false; - } - - function _fetch() - { - - $this->fields = db2_fetch_array($this->_queryID); - if ($this->fields) { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - $this->fields = false; - return false; - } - - function _close() - { - return @db2_free_result($this->_queryID); - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-db2oci.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-db2oci.inc.php deleted file mode 100644 index 3a652679..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-db2oci.inc.php +++ /dev/null @@ -1,230 +0,0 @@ - $_COLONSZ) return $p; - $_COLONARR[] = $v; - return '?'; - } - - // smart remapping of :0, :1 bind vars to ? ? - function _colonscope($sql,$arr) - { - global $_COLONARR,$_COLONSZ; - - $_COLONARR = array(); - $_COLONSZ = sizeof($arr); - - $sql2 = preg_replace("/(:[0-9]+)/e","_colontrack('\\1')",$sql); - - if (empty($_COLONARR)) return array($sql,$arr); - - foreach($_COLONARR as $k => $v) { - $arr2[] = $arr[$v]; - } - - return array($sql2,$arr2); - } - */ - - /* - Smart remapping of :0, :1 bind vars to ? ? - - Handles colons in comments -- and / * * / and in quoted strings. - */ - - function _colonparser($sql,$arr) - { - $lensql = strlen($sql); - $arrsize = sizeof($arr); - $state = 'NORM'; - $at = 1; - $ch = $sql[0]; - $ch2 = @$sql[1]; - $sql2 = ''; - $arr2 = array(); - $nprev = 0; - - - while (strlen($ch)) { - - switch($ch) { - case '/': - if ($state == 'NORM' && $ch2 == '*') { - $state = 'COMMENT'; - - $at += 1; - $ch = $ch2; - $ch2 = $at < $lensql ? $sql[$at] : ''; - } - break; - - case '*': - if ($state == 'COMMENT' && $ch2 == '/') { - $state = 'NORM'; - - $at += 1; - $ch = $ch2; - $ch2 = $at < $lensql ? $sql[$at] : ''; - } - break; - - case "\n": - case "\r": - if ($state == 'COMMENT2') $state = 'NORM'; - break; - - case "'": - do { - $at += 1; - $ch = $ch2; - $ch2 = $at < $lensql ? $sql[$at] : ''; - } while ($ch !== "'"); - break; - - case ':': - if ($state == 'COMMENT' || $state == 'COMMENT2') break; - - //echo "$at=$ch $ch2, "; - if ('0' <= $ch2 && $ch2 <= '9') { - $n = ''; - $nat = $at; - do { - $at += 1; - $ch = $ch2; - $n .= $ch; - $ch2 = $at < $lensql ? $sql[$at] : ''; - } while ('0' <= $ch && $ch <= '9'); - #echo "$n $arrsize ] "; - $n = (integer) $n; - if ($n < $arrsize) { - $sql2 .= substr($sql,$nprev,$nat-$nprev-1).'?'; - $nprev = $at-1; - $arr2[] = $arr[$n]; - } - } - break; - - case '-': - if ($state == 'NORM') { - if ($ch2 == '-') $state = 'COMMENT2'; - $at += 1; - $ch = $ch2; - $ch2 = $at < $lensql ? $sql[$at] : ''; - } - break; - } - - $at += 1; - $ch = $ch2; - $ch2 = $at < $lensql ? $sql[$at] : ''; - } - - if ($nprev == 0) { - $sql2 = $sql; - } else { - $sql2 .= substr($sql,$nprev); - } - - return array($sql2,$arr2); - } - - class ADODB_db2oci extends ADODB_db2 { - var $databaseType = "db2oci"; - var $sysTimeStamp = 'sysdate'; - var $sysDate = 'trunc(sysdate)'; - var $_bindInputArray = true; - - function ADODB_db2oci() - { - parent::ADODB_db2(); - } - - function Param($name,$type=false) - { - return ':'.$name; - } - - - function MetaTables($ttype=false,$schema=false) - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = db2_tables($this->_connectionID); - - $rs = new ADORecordSet_db2($qid); - - $ADODB_FETCH_MODE = $savem; - if (!$rs) { - $false = false; - return $false; - } - - $arr = $rs->GetArray(); - $rs->Close(); - $arr2 = array(); - // adodb_pr($arr); - if ($ttype) { - $isview = strncmp($ttype,'V',1) === 0; - } - for ($i=0; $i < sizeof($arr); $i++) { - if (!$arr[$i][2]) continue; - $type = $arr[$i][3]; - $schemaval = ($schema) ? $arr[$i][1].'.' : ''; - $name = $schemaval.$arr[$i][2]; - $owner = $arr[$i][1]; - if (substr($name,0,8) == 'EXPLAIN_') continue; - if ($ttype) { - if ($isview) { - if (strncmp($type,'V',1) === 0) $arr2[] = $name; - } else if (strncmp($type,'T',1) === 0 && strncmp($owner,'SYS',3) !== 0) $arr2[] = $name; - } else if (strncmp($type,'T',1) === 0 && strncmp($owner,'SYS',3) !== 0) $arr2[] = $name; - } - return $arr2; - } - - function _Execute($sql, $inputarr=false ) - { - if ($inputarr) list($sql,$inputarr) = _colonparser($sql, $inputarr); - return parent::_Execute($sql, $inputarr); - } - }; - - - class ADORecordSet_db2oci extends ADORecordSet_db2 { - - var $databaseType = "db2oci"; - - function ADORecordSet_db2oci($id,$mode=false) - { - return $this->ADORecordSet_db2($id,$mode); - } - } - -} //define -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-fbsql.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-fbsql.inc.php deleted file mode 100644 index bf77dfd2..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-fbsql.inc.php +++ /dev/null @@ -1,266 +0,0 @@ -. - Set tabs to 8. - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -if (! defined("_ADODB_FBSQL_LAYER")) { - define("_ADODB_FBSQL_LAYER", 1 ); - - class ADODB_fbsql extends ADOConnection { - var $databaseType = 'fbsql'; - var $hasInsertID = true; - var $hasAffectedRows = true; - var $metaTablesSQL = "SHOW TABLES"; - var $metaColumnsSQL = "SHOW COLUMNS FROM %s"; - var $fmtTimeStamp = "'Y-m-d H:i:s'"; - var $hasLimit = false; - - function ADODB_fbsql() - { - } - - function _insertid() - { - return fbsql_insert_id($this->_connectionID); - } - - function _affectedrows() - { - return fbsql_affected_rows($this->_connectionID); - } - - function MetaDatabases() - { - $qid = fbsql_list_dbs($this->_connectionID); - $arr = array(); - $i = 0; - $max = fbsql_num_rows($qid); - while ($i < $max) { - $arr[] = fbsql_tablename($qid,$i); - $i += 1; - } - return $arr; - } - - // returns concatenated string - function Concat() - { - $s = ""; - $arr = func_get_args(); - $first = true; - - $s = implode(',',$arr); - if (sizeof($arr) > 0) return "CONCAT($s)"; - else return ''; - } - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - $this->_connectionID = fbsql_connect($argHostname,$argUsername,$argPassword); - if ($this->_connectionID === false) return false; - if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - $this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword); - if ($this->_connectionID === false) return false; - if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - - function MetaColumns($table, $normalize=true) - { - if ($this->metaColumnsSQL) { - - $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); - - if ($rs === false) return false; - - $retarr = array(); - while (!$rs->EOF){ - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $fld->type = $rs->fields[1]; - - // split type into type(length): - if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) { - $fld->type = $query_array[1]; - $fld->max_length = $query_array[2]; - } else { - $fld->max_length = -1; - } - $fld->not_null = ($rs->fields[2] != 'YES'); - $fld->primary_key = ($rs->fields[3] == 'PRI'); - $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); - $fld->binary = (strpos($fld->type,'blob') !== false); - - $retarr[strtoupper($fld->name)] = $fld; - $rs->MoveNext(); - } - $rs->Close(); - return $retarr; - } - return false; - } - - // returns true or false - function SelectDB($dbName) - { - $this->database = $dbName; - if ($this->_connectionID) { - return @fbsql_select_db($dbName,$this->_connectionID); - } - else return false; - } - - - // returns queryID or false - function _query($sql,$inputarr=false) - { - return fbsql_query("$sql;",$this->_connectionID); - } - - /* Returns: the last error message from previous database operation */ - function ErrorMsg() - { - $this->_errorMsg = @fbsql_error($this->_connectionID); - return $this->_errorMsg; - } - - /* Returns: the last error number from previous database operation */ - function ErrorNo() - { - return @fbsql_errno($this->_connectionID); - } - - // returns true or false - function _close() - { - return @fbsql_close($this->_connectionID); - } - - } - - /*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - - class ADORecordSet_fbsql extends ADORecordSet{ - - var $databaseType = "fbsql"; - var $canSeek = true; - - function ADORecordSet_fbsql($queryID,$mode=false) - { - if (!$mode) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) { - case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break; - case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break; - case ADODB_FETCH_BOTH: - default: - $this->fetchMode = FBSQL_BOTH; break; - } - return $this->ADORecordSet($queryID); - } - - function _initrs() - { - GLOBAL $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1; - $this->_numOfFields = @fbsql_num_fields($this->_queryID); - } - - - - function FetchField($fieldOffset = -1) { - if ($fieldOffset != -1) { - $o = @fbsql_fetch_field($this->_queryID, $fieldOffset); - //$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable - $f = @fbsql_field_flags($this->_queryID,$fieldOffset); - $o->binary = (strpos($f,'binary')!== false); - } - else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ - $o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable - //$o->max_length = -1; - } - - return $o; - } - - function _seek($row) - { - return @fbsql_data_seek($this->_queryID,$row); - } - - function _fetch($ignore_fields=false) - { - $this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode); - return ($this->fields == true); - } - - function _close() { - return @fbsql_free_result($this->_queryID); - } - - function MetaType($t,$len=-1,$fieldobj=false) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - $len = -1; // fbsql max_length is not accurate - switch (strtoupper($t)) { - case 'CHARACTER': - case 'CHARACTER VARYING': - case 'BLOB': - case 'CLOB': - case 'BIT': - case 'BIT VARYING': - if ($len <= $this->blobSize) return 'C'; - - // so we have to check whether binary... - case 'IMAGE': - case 'LONGBLOB': - case 'BLOB': - case 'MEDIUMBLOB': - return !empty($fieldobj->binary) ? 'B' : 'X'; - - case 'DATE': return 'D'; - - case 'TIME': - case 'TIME WITH TIME ZONE': - case 'TIMESTAMP': - case 'TIMESTAMP WITH TIME ZONE': return 'T'; - - case 'PRIMARY_KEY': - return 'R'; - case 'INTEGER': - case 'SMALLINT': - case 'BOOLEAN': - - if (!empty($fieldobj->primary_key)) return 'R'; - else return 'I'; - - default: return 'N'; - } - } - - } //class -} // defined -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-firebird.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-firebird.inc.php deleted file mode 100644 index 1075834a..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-firebird.inc.php +++ /dev/null @@ -1,77 +0,0 @@ -ADODB_ibase(); - } - - function ServerInfo() - { - $arr['dialect'] = $this->dialect; - switch($arr['dialect']) { - case '': - case '1': $s = 'Firebird Dialect 1'; break; - case '2': $s = 'Firebird Dialect 2'; break; - default: - case '3': $s = 'Firebird Dialect 3'; break; - } - $arr['version'] = ADOConnection::_findvers($s); - $arr['description'] = $s; - return $arr; - } - - // Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars! - // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows - // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2 - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0) - { - $nrows = (integer) $nrows; - $offset = (integer) $offset; - $str = 'SELECT '; - if ($nrows >= 0) $str .= "FIRST $nrows "; - $str .=($offset>=0) ? "SKIP $offset " : ''; - - $sql = preg_replace('/^[ \t]*select/i',$str,$sql); - if ($secs) - $rs = $this->CacheExecute($secs,$sql,$inputarr); - else - $rs = $this->Execute($sql,$inputarr); - - return $rs; - } - - -}; - - -class ADORecordSet_firebird extends ADORecordSet_ibase { - - var $databaseType = "firebird"; - - function ADORecordSet_firebird($id,$mode=false) - { - $this->ADORecordSet_ibase($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-ibase.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-ibase.inc.php deleted file mode 100644 index 5d265845..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-ibase.inc.php +++ /dev/null @@ -1,887 +0,0 @@ - - changed transaction handling and added experimental blob stuff - - Docs to interbase at the website - http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html - - To use gen_id(), see - http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen - - $rs = $conn->Execute('select gen_id(adodb,1) from rdb$database'); - $id = $rs->fields[0]; - $conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)"); - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -class ADODB_ibase extends ADOConnection { - var $databaseType = "ibase"; - var $dataProvider = "ibase"; - var $replaceQuote = "''"; // string to use to replace quotes - var $ibase_datefmt = '%Y-%m-%d'; // For hours,mins,secs change to '%Y-%m-%d %H:%M:%S'; - var $fmtDate = "'Y-m-d'"; - var $ibase_timestampfmt = "%Y-%m-%d %H:%M:%S"; - var $ibase_timefmt = "%H:%M:%S"; - var $fmtTimeStamp = "'Y-m-d, H:i:s'"; - var $concat_operator='||'; - var $_transactionID; - var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'"; - //OPN STUFF start - var $metaColumnsSQL = "select a.rdb\$field_name, a.rdb\$null_flag, a.rdb\$default_source, b.rdb\$field_length, b.rdb\$field_scale, b.rdb\$field_sub_type, b.rdb\$field_precision, b.rdb\$field_type from rdb\$relation_fields a, rdb\$fields b where a.rdb\$field_source = b.rdb\$field_name and a.rdb\$relation_name = '%s' order by a.rdb\$field_position asc"; - //OPN STUFF end - var $ibasetrans; - var $hasGenID = true; - var $_bindInputArray = true; - var $buffers = 0; - var $dialect = 1; - var $sysDate = "cast('TODAY' as timestamp)"; - var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)"; - var $ansiOuter = true; - var $hasAffectedRows = false; - var $poorAffectedRows = true; - var $blobEncodeType = 'C'; - var $role = false; - - function ADODB_ibase() - { - if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT; - } - - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false) - { - if (!function_exists('ibase_pconnect')) return null; - if ($argDatabasename) $argHostname .= ':'.$argDatabasename; - $fn = ($persist) ? 'ibase_pconnect':'ibase_connect'; - if ($this->role) - $this->_connectionID = $fn($argHostname,$argUsername,$argPassword, - $this->charSet,$this->buffers,$this->dialect,$this->role); - else - $this->_connectionID = $fn($argHostname,$argUsername,$argPassword, - $this->charSet,$this->buffers,$this->dialect); - - if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html - $this->replaceQuote = "''"; - } - if ($this->_connectionID === false) { - $this->_handleerror(); - return false; - } - - // PHP5 change. - if (function_exists('ibase_timefmt')) { - ibase_timefmt($this->ibase_datefmt,IBASE_DATE ); - if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP ); - else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP ); - ibase_timefmt($this->ibase_timefmt,IBASE_TIME ); - - } else { - ini_set("ibase.timestampformat", $this->ibase_timestampfmt); - ini_set("ibase.dateformat", $this->ibase_datefmt); - ini_set("ibase.timeformat", $this->ibase_timefmt); - } - return true; - } - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true); - } - - - function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false) - { - if ($internalKey) return array('RDB$DB_KEY'); - - $table = strtoupper($table); - - $sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME - FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME - WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\' - ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION'; - - $a = $this->GetCol($sql,false,true); - if ($a && sizeof($a)>0) return $a; - return false; - } - - function ServerInfo() - { - $arr['dialect'] = $this->dialect; - switch($arr['dialect']) { - case '': - case '1': $s = 'Interbase 5.5 or earlier'; break; - case '2': $s = 'Interbase 5.6'; break; - default: - case '3': $s = 'Interbase 6.0'; break; - } - $arr['version'] = ADOConnection::_findvers($s); - $arr['description'] = $s; - return $arr; - } - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - $this->autoCommit = false; - $this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID); - return $this->_transactionID; - } - - function CommitTrans($ok=true) - { - if (!$ok) return $this->RollbackTrans(); - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $ret = false; - $this->autoCommit = true; - if ($this->_transactionID) { - //print ' commit '; - $ret = ibase_commit($this->_transactionID); - } - $this->_transactionID = false; - return $ret; - } - - // there are some compat problems with ADODB_COUNTRECS=false and $this->_logsql currently. - // it appears that ibase extension cannot support multiple concurrent queryid's - function _Execute($sql,$inputarr=false) - { - global $ADODB_COUNTRECS; - - if ($this->_logsql) { - $savecrecs = $ADODB_COUNTRECS; - $ADODB_COUNTRECS = true; // force countrecs - $ret = ADOConnection::_Execute($sql,$inputarr); - $ADODB_COUNTRECS = $savecrecs; - } else { - $ret = ADOConnection::_Execute($sql,$inputarr); - } - return $ret; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $ret = false; - $this->autoCommit = true; - if ($this->_transactionID) - $ret = ibase_rollback($this->_transactionID); - $this->_transactionID = false; - - return $ret; - } - - function MetaIndexes ($table, $primary = FALSE, $owner=false) - { - // save old fetch mode - global $ADODB_FETCH_MODE; - $false = false; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - $table = strtoupper($table); - $sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'"; - if (!$primary) { - $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'"; - } else { - $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'"; - } - // get index details - $rs = $this->Execute($sql); - if (!is_object($rs)) { - // restore fetchmode - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - return $false; - } - - $indexes = array(); - while ($row = $rs->FetchRow()) { - $index = $row[0]; - if (!isset($indexes[$index])) { - if (is_null($row[3])) {$row[3] = 0;} - $indexes[$index] = array( - 'unique' => ($row[3] == 1), - 'columns' => array() - ); - } - $sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$index."' ORDER BY RDB\$FIELD_POSITION ASC"; - $rs1 = $this->Execute($sql); - while ($row1 = $rs1->FetchRow()) { - $indexes[$index]['columns'][$row1[2]] = $row1[1]; - } - } - // restore fetchmode - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - return $indexes; - } - - - // See http://community.borland.com/article/0,1410,25844,00.html - function RowLock($tables,$where,$col=false) - { - if ($this->autoCommit) $this->BeginTrans(); - $this->Execute("UPDATE $table SET $col=$col WHERE $where "); // is this correct - jlim? - return 1; - } - - - function CreateSequence($seqname,$startID=1) - { - $ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" )); - if (!$ok) return false; - return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';'); - } - - function DropSequence($seqname) - { - $seqname = strtoupper($seqname); - $this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'"); - } - - function GenID($seqname='adodbseq',$startID=1) - { - $getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE"); - $rs = @$this->Execute($getnext); - if (!$rs) { - $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" )); - $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';'); - $rs = $this->Execute($getnext); - } - if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields); - else $this->genID = 0; // false - - if ($rs) $rs->Close(); - - return $this->genID; - } - - function SelectDB($dbName) - { - return false; - } - - function _handleerror() - { - $this->_errorMsg = ibase_errmsg(); - } - - function ErrorNo() - { - if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1]; - else return 0; - } - - function ErrorMsg() - { - return $this->_errorMsg; - } - - function Prepare($sql) - { - $stmt = ibase_prepare($this->_connectionID,$sql); - if (!$stmt) return false; - return array($sql,$stmt); - } - - // returns query ID if successful, otherwise false - // there have been reports of problems with nested queries - the code is probably not re-entrant? - function _query($sql,$iarr=false) - { - - if (!$this->autoCommit && $this->_transactionID) { - $conn = $this->_transactionID; - $docommit = false; - } else { - $conn = $this->_connectionID; - $docommit = true; - } - if (is_array($sql)) { - $fn = 'ibase_execute'; - $sql = $sql[1]; - if (is_array($iarr)) { - if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4 - if ( !isset($iarr[0]) ) $iarr[0] = ''; // PHP5 compat hack - $fnarr = array_merge( array($sql) , $iarr); - $ret = call_user_func_array($fn,$fnarr); - } else { - switch(sizeof($iarr)) { - case 1: $ret = $fn($sql,$iarr[0]); break; - case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break; - case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break; - case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break; - case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break; - case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break; - case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break; - default: ADOConnection::outp( "Too many parameters to ibase query $sql"); - case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break; - } - } - } else $ret = $fn($sql); - } else { - $fn = 'ibase_query'; - - if (is_array($iarr)) { - if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4 - if (sizeof($iarr) == 0) $iarr[0] = ''; // PHP5 compat hack - $fnarr = array_merge( array($conn,$sql) , $iarr); - $ret = call_user_func_array($fn,$fnarr); - } else { - switch(sizeof($iarr)) { - case 1: $ret = $fn($conn,$sql,$iarr[0]); break; - case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break; - case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break; - case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break; - case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break; - case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break; - case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break; - default: ADOConnection::outp( "Too many parameters to ibase query $sql"); - case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break; - } - } - } else $ret = $fn($conn,$sql); - } - if ($docommit && $ret === true) ibase_commit($this->_connectionID); - - $this->_handleerror(); - return $ret; - } - - // returns true or false - function _close() - { - if (!$this->autoCommit) @ibase_rollback($this->_connectionID); - return @ibase_close($this->_connectionID); - } - - //OPN STUFF start - function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $dialect3) - { - $fscale = abs($fscale); - $fld->max_length = $flen; - $fld->scale = null; - switch($ftype){ - case 7: - case 8: - if ($dialect3) { - switch($fsubtype){ - case 0: - $fld->type = ($ftype == 7 ? 'smallint' : 'integer'); - break; - case 1: - $fld->type = 'numeric'; - $fld->max_length = $fprecision; - $fld->scale = $fscale; - break; - case 2: - $fld->type = 'decimal'; - $fld->max_length = $fprecision; - $fld->scale = $fscale; - break; - } // switch - } else { - if ($fscale !=0) { - $fld->type = 'decimal'; - $fld->scale = $fscale; - $fld->max_length = ($ftype == 7 ? 4 : 9); - } else { - $fld->type = ($ftype == 7 ? 'smallint' : 'integer'); - } - } - break; - case 16: - if ($dialect3) { - switch($fsubtype){ - case 0: - $fld->type = 'decimal'; - $fld->max_length = 18; - $fld->scale = 0; - break; - case 1: - $fld->type = 'numeric'; - $fld->max_length = $fprecision; - $fld->scale = $fscale; - break; - case 2: - $fld->type = 'decimal'; - $fld->max_length = $fprecision; - $fld->scale = $fscale; - break; - } // switch - } - break; - case 10: - $fld->type = 'float'; - break; - case 14: - $fld->type = 'char'; - break; - case 27: - if ($fscale !=0) { - $fld->type = 'decimal'; - $fld->max_length = 15; - $fld->scale = 5; - } else { - $fld->type = 'double'; - } - break; - case 35: - if ($dialect3) { - $fld->type = 'timestamp'; - } else { - $fld->type = 'date'; - } - break; - case 12: - $fld->type = 'date'; - break; - case 13: - $fld->type = 'time'; - break; - case 37: - $fld->type = 'varchar'; - break; - case 40: - $fld->type = 'cstring'; - break; - case 261: - $fld->type = 'blob'; - $fld->max_length = -1; - break; - } // switch - } - //OPN STUFF end - // returns array of ADOFieldObjects for current table - function MetaColumns($table, $normalize=true) - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); - - $ADODB_FETCH_MODE = $save; - $false = false; - if ($rs === false) { - return $false; - } - - $retarr = array(); - //OPN STUFF start - $dialect3 = ($this->dialect==3 ? true : false); - //OPN STUFF end - while (!$rs->EOF) { //print_r($rs->fields); - $fld = new ADOFieldObject(); - $fld->name = trim($rs->fields[0]); - //OPN STUFF start - $this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $dialect3); - if (isset($rs->fields[1]) && $rs->fields[1]) { - $fld->not_null = true; - } - if (isset($rs->fields[2])) { - - $fld->has_default = true; - $d = substr($rs->fields[2],strlen('default ')); - switch ($fld->type) - { - case 'smallint': - case 'integer': $fld->default_value = (int) $d; break; - case 'char': - case 'blob': - case 'text': - case 'varchar': $fld->default_value = (string) substr($d,1,strlen($d)-2); break; - case 'double': - case 'float': $fld->default_value = (float) $d; break; - default: $fld->default_value = $d; break; - } - // case 35:$tt = 'TIMESTAMP'; break; - } - if ((isset($rs->fields[5])) && ($fld->type == 'blob')) { - $fld->sub_type = $rs->fields[5]; - } else { - $fld->sub_type = null; - } - //OPN STUFF end - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[strtoupper($fld->name)] = $fld; - - $rs->MoveNext(); - } - $rs->Close(); - if ( empty($retarr)) return $false; - else return $retarr; - } - - function BlobEncode( $blob ) - { - $blobid = ibase_blob_create( $this->_connectionID); - ibase_blob_add( $blobid, $blob ); - return ibase_blob_close( $blobid ); - } - - // since we auto-decode all blob's since 2.42, - // BlobDecode should not do any transforms - function BlobDecode($blob) - { - return $blob; - } - - - - - // old blobdecode function - // still used to auto-decode all blob's - function _BlobDecode_old( $blob ) - { - $blobid = ibase_blob_open($this->_connectionID, $blob ); - $realblob = ibase_blob_get( $blobid,$this->maxblobsize); // 2nd param is max size of blob -- Kevin Boillet - while($string = ibase_blob_get($blobid, 8192)){ - $realblob .= $string; - } - ibase_blob_close( $blobid ); - - return( $realblob ); - } - - function _BlobDecode( $blob ) - { - if (ADODB_PHPVER >= 0x5000) { - $blob_data = ibase_blob_info($this->_connectionID, $blob ); - $blobid = ibase_blob_open($this->_connectionID, $blob ); - } else { - - $blob_data = ibase_blob_info( $blob ); - $blobid = ibase_blob_open( $blob ); - } - - if( $blob_data[0] > $this->maxblobsize ) { - - $realblob = ibase_blob_get($blobid, $this->maxblobsize); - - while($string = ibase_blob_get($blobid, 8192)){ - $realblob .= $string; - } - } else { - $realblob = ibase_blob_get($blobid, $blob_data[0]); - } - - ibase_blob_close( $blobid ); - return( $realblob ); - } - - function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') - { - $fd = fopen($path,'rb'); - if ($fd === false) return false; - $blob_id = ibase_blob_create($this->_connectionID); - - /* fill with data */ - - while ($val = fread($fd,32768)){ - ibase_blob_add($blob_id, $val); - } - - /* close and get $blob_id_str for inserting into table */ - $blob_id_str = ibase_blob_close($blob_id); - - fclose($fd); - return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; - } - - /* - Insert a null into the blob field of the table first. - Then use UpdateBlob to store the blob. - - Usage: - - $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - $blob_id = ibase_blob_create($this->_connectionID); - - // ibase_blob_add($blob_id, $val); - - // replacement that solves the problem by which only the first modulus 64K / - // of $val are stored at the blob field //////////////////////////////////// - // Thx Abel Berenstein aberenstein#afip.gov.ar - $len = strlen($val); - $chunk_size = 32768; - $tail_size = $len % $chunk_size; - $n_chunks = ($len - $tail_size) / $chunk_size; - - for ($n = 0; $n < $n_chunks; $n++) { - $start = $n * $chunk_size; - $data = substr($val, $start, $chunk_size); - ibase_blob_add($blob_id, $data); - } - - if ($tail_size) { - $start = $n_chunks * $chunk_size; - $data = substr($val, $start, $tail_size); - ibase_blob_add($blob_id, $data); - } - // end replacement ///////////////////////////////////////////////////////// - - $blob_id_str = ibase_blob_close($blob_id); - - return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; - - } - - - function OldUpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - $blob_id = ibase_blob_create($this->_connectionID); - ibase_blob_add($blob_id, $val); - $blob_id_str = ibase_blob_close($blob_id); - return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false; - } - - // Format date column in sql string given an input format that understands Y M D - // Only since Interbase 6.0 - uses EXTRACT - // problem - does not zero-fill the day and month yet - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysDate; - $s = ''; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - if ($s) $s .= '||'; - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= "extract(year from $col)"; - break; - case 'M': - case 'm': - $s .= "extract(month from $col)"; - break; - case 'Q': - case 'q': - $s .= "cast(((extract(month from $col)+2) / 3) as integer)"; - break; - case 'D': - case 'd': - $s .= "(extract(day from $col))"; - break; - case 'H': - case 'h': - $s .= "(extract(hour from $col))"; - break; - case 'I': - case 'i': - $s .= "(extract(minute from $col))"; - break; - case 'S': - case 's': - $s .= "CAST((extract(second from $col)) AS INTEGER)"; - break; - - default: - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - $s .= $this->qstr($ch); - break; - } - } - return $s; - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_ibase extends ADORecordSet -{ - - var $databaseType = "ibase"; - var $bind=false; - var $_cacheType; - - function ADORecordset_ibase($id,$mode=false) - { - global $ADODB_FETCH_MODE; - - $this->fetchMode = ($mode === false) ? $ADODB_FETCH_MODE : $mode; - $this->ADORecordSet($id); - } - - /* Returns: an object containing field information. - Get column information in the Recordset object. fetchField() can be used in order to obtain information about - fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by - fetchField() is retrieved. */ - - function FetchField($fieldOffset = -1) - { - $fld = new ADOFieldObject; - $ibf = ibase_field_info($this->_queryID,$fieldOffset); - switch (ADODB_ASSOC_CASE) { - case 2: // the default - $fld->name = ($ibf['alias']); - if (empty($fld->name)) $fld->name = ($ibf['name']); - break; - case 0: - $fld->name = strtoupper($ibf['alias']); - if (empty($fld->name)) $fld->name = strtoupper($ibf['name']); - break; - case 1: - $fld->name = strtolower($ibf['alias']); - if (empty($fld->name)) $fld->name = strtolower($ibf['name']); - break; - } - - $fld->type = $ibf['type']; - $fld->max_length = $ibf['length']; - - /* This needs to be populated from the metadata */ - $fld->not_null = false; - $fld->has_default = false; - $fld->default_value = 'null'; - return $fld; - } - - function _initrs() - { - $this->_numOfRows = -1; - $this->_numOfFields = @ibase_num_fields($this->_queryID); - - // cache types for blob decode check - for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { - $f1 = $this->FetchField($i); - $this->_cacheType[] = $f1->type; - } - } - - function _seek($row) - { - return false; - } - - function _fetch() - { - $f = @ibase_fetch_row($this->_queryID); - if ($f === false) { - $this->fields = false; - return false; - } - // OPN stuff start - optimized - // fix missing nulls and decode blobs automatically - - global $ADODB_ANSI_PADDING_OFF; - //$ADODB_ANSI_PADDING_OFF=1; - $rtrim = !empty($ADODB_ANSI_PADDING_OFF); - - for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { - if ($this->_cacheType[$i]=="BLOB") { - if (isset($f[$i])) { - $f[$i] = $this->connection->_BlobDecode($f[$i]); - } else { - $f[$i] = null; - } - } else { - if (!isset($f[$i])) { - $f[$i] = null; - } else if ($rtrim && is_string($f[$i])) { - $f[$i] = rtrim($f[$i]); - } - } - } - // OPN stuff end - - $this->fields = $f; - if ($this->fetchMode == ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } else if ($this->fetchMode == ADODB_FETCH_BOTH) { - $this->fields = array_merge($this->fields,$this->GetRowAssoc(ADODB_ASSOC_CASE)); - } - return true; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - - } - - - function _close() - { - return @ibase_free_result($this->_queryID); - } - - function MetaType($t,$len=-1,$fieldobj=false) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - switch (strtoupper($t)) { - case 'CHAR': - return 'C'; - - case 'TEXT': - case 'VARCHAR': - case 'VARYING': - if ($len <= $this->blobSize) return 'C'; - return 'X'; - case 'BLOB': - return 'B'; - - case 'TIMESTAMP': - case 'DATE': return 'D'; - case 'TIME': return 'T'; - //case 'T': return 'T'; - - //case 'L': return 'L'; - case 'INT': - case 'SHORT': - case 'INTEGER': return 'I'; - default: return 'N'; - } - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-informix.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-informix.inc.php deleted file mode 100644 index 88c1051d..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-informix.inc.php +++ /dev/null @@ -1,40 +0,0 @@ -ADORecordset_informix72($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-informix72.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-informix72.inc.php deleted file mode 100644 index 0dc9f4ce..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-informix72.inc.php +++ /dev/null @@ -1,475 +0,0 @@ - - - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -if (!defined('IFX_SCROLL')) define('IFX_SCROLL',1); - -class ADODB_informix72 extends ADOConnection { - var $databaseType = "informix72"; - var $dataProvider = "informix"; - var $replaceQuote = "''"; // string to use to replace quotes - var $fmtDate = "'Y-m-d'"; - var $fmtTimeStamp = "'Y-m-d H:i:s'"; - var $hasInsertID = true; - var $hasAffectedRows = true; - var $substr = 'substr'; - var $metaTablesSQL="select tabname,tabtype from systables where tabtype in ('T','V') and owner!='informix'"; //Don't get informix tables and pseudo-tables - - - var $metaColumnsSQL = - "select c.colname, c.coltype, c.collength, d.default,c.colno - from syscolumns c, systables t,outer sysdefaults d - where c.tabid=t.tabid and d.tabid=t.tabid and d.colno=c.colno - and tabname='%s' order by c.colno"; - - var $metaPrimaryKeySQL = - "select part1,part2,part3,part4,part5,part6,part7,part8 from - systables t,sysconstraints s,sysindexes i where t.tabname='%s' - and s.tabid=t.tabid and s.constrtype='P' - and i.idxname=s.idxname"; - - var $concat_operator = '||'; - - var $lastQuery = false; - var $has_insertid = true; - - var $_autocommit = true; - var $_bindInputArray = true; // set to true if ADOConnection.Execute() permits binding of array parameters. - var $sysDate = 'TODAY'; - var $sysTimeStamp = 'CURRENT'; - var $cursorType = IFX_SCROLL; // IFX_SCROLL or IFX_HOLD or 0 - - function ADODB_informix72() - { - // alternatively, use older method: - //putenv("DBDATE=Y4MD-"); - - // force ISO date format - putenv('GL_DATE=%Y-%m-%d'); - - if (function_exists('ifx_byteasvarchar')) { - ifx_byteasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content. - ifx_textasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content. - ifx_blobinfile_mode(0); // Mode "0" means save Byte-Blobs in memory, and mode "1" means save Byte-Blobs in a file. - } - } - - function ServerInfo() - { - if (isset($this->version)) return $this->version; - - $arr['description'] = $this->GetOne("select DBINFO('version','full') from systables where tabid = 1"); - $arr['version'] = $this->GetOne("select DBINFO('version','major') || DBINFO('version','minor') from systables where tabid = 1"); - $this->version = $arr; - return $arr; - } - - - - function _insertid() - { - $sqlca =ifx_getsqlca($this->lastQuery); - return @$sqlca["sqlerrd1"]; - } - - function _affectedrows() - { - if ($this->lastQuery) { - return @ifx_affected_rows ($this->lastQuery); - } - return 0; - } - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - $this->Execute('BEGIN'); - $this->_autocommit = false; - return true; - } - - function CommitTrans($ok=true) - { - if (!$ok) return $this->RollbackTrans(); - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->Execute('COMMIT'); - $this->_autocommit = true; - return true; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->Execute('ROLLBACK'); - $this->_autocommit = true; - return true; - } - - function RowLock($tables,$where,$col='1 as ignore') - { - if ($this->_autocommit) $this->BeginTrans(); - return $this->GetOne("select $col from $tables where $where for update"); - } - - /* Returns: the last error message from previous database operation - Note: This function is NOT available for Microsoft SQL Server. */ - - function ErrorMsg() - { - if (!empty($this->_logsql)) return $this->_errorMsg; - $this->_errorMsg = ifx_errormsg(); - return $this->_errorMsg; - } - - function ErrorNo() - { - preg_match("/.*SQLCODE=([^\]]*)/",ifx_error(),$parse); - if (is_array($parse) && isset($parse[1])) return (int)$parse[1]; - return 0; - } - - - function MetaColumns($table, $normalize=true) - { - global $ADODB_FETCH_MODE; - - $false = false; - if (!empty($this->metaColumnsSQL)) { - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - if ($rs === false) return $false; - $rspkey = $this->Execute(sprintf($this->metaPrimaryKeySQL,$table)); //Added to get primary key colno items - - $retarr = array(); - while (!$rs->EOF) { //print_r($rs->fields); - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - /* //!eos. - $rs->fields[1] is not the correct adodb type - $rs->fields[2] is not correct max_length, because can include not-null bit - - $fld->type = $rs->fields[1]; - $fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); //Added to set primary key flag - $fld->max_length = $rs->fields[2];*/ - $pr=ifx_props($rs->fields[1],$rs->fields[2]); //!eos - $fld->type = $pr[0] ;//!eos - $fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); - $fld->max_length = $pr[1]; //!eos - $fld->precision = $pr[2] ;//!eos - $fld->not_null = $pr[3]=="N"; //!eos - - if (trim($rs->fields[3]) != "AAAAAA 0") { - $fld->has_default = 1; - $fld->default_value = $rs->fields[3]; - } else { - $fld->has_default = 0; - } - - $retarr[strtolower($fld->name)] = $fld; - $rs->MoveNext(); - } - - $rs->Close(); - $rspkey->Close(); //!eos - return $retarr; - } - - return $false; - } - - function xMetaColumns($table) - { - return ADOConnection::MetaColumns($table,false); - } - - function MetaForeignKeys($table, $owner=false, $upper=false) //!Eos - { - $sql = " - select tr.tabname,updrule,delrule, - i.part1 o1,i2.part1 d1,i.part2 o2,i2.part2 d2,i.part3 o3,i2.part3 d3,i.part4 o4,i2.part4 d4, - i.part5 o5,i2.part5 d5,i.part6 o6,i2.part6 d6,i.part7 o7,i2.part7 d7,i.part8 o8,i2.part8 d8 - from systables t,sysconstraints s,sysindexes i, - sysreferences r,systables tr,sysconstraints s2,sysindexes i2 - where t.tabname='$table' - and s.tabid=t.tabid and s.constrtype='R' and r.constrid=s.constrid - and i.idxname=s.idxname and tr.tabid=r.ptabid - and s2.constrid=r.primary and i2.idxname=s2.idxname"; - - $rs = $this->Execute($sql); - if (!$rs || $rs->EOF) return false; - $arr = $rs->GetArray(); - $a = array(); - foreach($arr as $v) { - $coldest=$this->metaColumnNames($v["tabname"]); - $colorig=$this->metaColumnNames($table); - $colnames=array(); - for($i=1;$i<=8 && $v["o$i"] ;$i++) { - $colnames[]=$coldest[$v["d$i"]-1]."=".$colorig[$v["o$i"]-1]; - } - if($upper) - $a[strtoupper($v["tabname"])] = $colnames; - else - $a[$v["tabname"]] = $colnames; - } - return $a; - } - - function UpdateBlob($table, $column, $val, $where, $blobtype = 'BLOB') - { - $type = ($blobtype == 'TEXT') ? 1 : 0; - $blobid = ifx_create_blob($type,0,$val); - return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blobid)); - } - - function BlobDecode($blobid) - { - return function_exists('ifx_byteasvarchar') ? $blobid : @ifx_get_blob($blobid); - } - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('ifx_connect')) return null; - - $dbs = $argDatabasename . "@" . $argHostname; - if ($argHostname) putenv("INFORMIXSERVER=$argHostname"); - putenv("INFORMIXSERVER=".trim($argHostname)); - $this->_connectionID = ifx_connect($dbs,$argUsername,$argPassword); - if ($this->_connectionID === false) return false; - #if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('ifx_connect')) return null; - - $dbs = $argDatabasename . "@" . $argHostname; - putenv("INFORMIXSERVER=".trim($argHostname)); - $this->_connectionID = ifx_pconnect($dbs,$argUsername,$argPassword); - if ($this->_connectionID === false) return false; - #if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - /* - // ifx_do does not accept bind parameters - weird ??? - function Prepare($sql) - { - $stmt = ifx_prepare($sql); - if (!$stmt) return $sql; - else return array($sql,$stmt); - } - */ - // returns query ID if successful, otherwise false - function _query($sql,$inputarr=false) - { - global $ADODB_COUNTRECS; - - // String parameters have to be converted using ifx_create_char - if ($inputarr) { - foreach($inputarr as $v) { - if (gettype($v) == 'string') { - $tab[] = ifx_create_char($v); - } - else { - $tab[] = $v; - } - } - } - - // In case of select statement, we use a scroll cursor in order - // to be able to call "move", or "movefirst" statements - if (!$ADODB_COUNTRECS && preg_match("/^\s*select/is", $sql)) { - if ($inputarr) { - $this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType, $tab); - } - else { - $this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType); - } - } - else { - if ($inputarr) { - $this->lastQuery = ifx_query($sql,$this->_connectionID, $tab); - } - else { - $this->lastQuery = ifx_query($sql,$this->_connectionID); - } - } - - // Following line have been commented because autocommit mode is - // not supported by informix SE 7.2 - - //if ($this->_autocommit) ifx_query('COMMIT',$this->_connectionID); - - return $this->lastQuery; - } - - // returns true or false - function _close() - { - $this->lastQuery = false; - return ifx_close($this->_connectionID); - } -} - - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_informix72 extends ADORecordSet { - - var $databaseType = "informix72"; - var $canSeek = true; - var $_fieldprops = false; - - function ADORecordset_informix72($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - return $this->ADORecordSet($id); - } - - - - /* Returns: an object containing field information. - Get column information in the Recordset object. fetchField() can be used in order to obtain information about - fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by - fetchField() is retrieved. */ - function FetchField($fieldOffset = -1) - { - if (empty($this->_fieldprops)) { - $fp = ifx_fieldproperties($this->_queryID); - foreach($fp as $k => $v) { - $o = new ADOFieldObject; - $o->name = $k; - $arr = explode(';',$v); //"SQLTYPE;length;precision;scale;ISNULLABLE" - $o->type = $arr[0]; - $o->max_length = $arr[1]; - $this->_fieldprops[] = $o; - $o->not_null = $arr[4]=="N"; - } - } - $ret = $this->_fieldprops[$fieldOffset]; - return $ret; - } - - function _initrs() - { - $this->_numOfRows = -1; // ifx_affected_rows not reliable, only returns estimate -- ($ADODB_COUNTRECS)? ifx_affected_rows($this->_queryID):-1; - $this->_numOfFields = ifx_num_fields($this->_queryID); - } - - function _seek($row) - { - return @ifx_fetch_row($this->_queryID, (int) $row); - } - - function MoveLast() - { - $this->fields = @ifx_fetch_row($this->_queryID, "LAST"); - if ($this->fields) $this->EOF = false; - $this->_currentRow = -1; - - if ($this->fetchMode == ADODB_FETCH_NUM) { - foreach($this->fields as $v) { - $arr[] = $v; - } - $this->fields = $arr; - } - - return true; - } - - function MoveFirst() - { - $this->fields = @ifx_fetch_row($this->_queryID, "FIRST"); - if ($this->fields) $this->EOF = false; - $this->_currentRow = 0; - - if ($this->fetchMode == ADODB_FETCH_NUM) { - foreach($this->fields as $v) { - $arr[] = $v; - } - $this->fields = $arr; - } - - return true; - } - - function _fetch($ignore_fields=false) - { - - $this->fields = @ifx_fetch_row($this->_queryID); - - if (!is_array($this->fields)) return false; - - if ($this->fetchMode == ADODB_FETCH_NUM) { - foreach($this->fields as $v) { - $arr[] = $v; - } - $this->fields = $arr; - } - return true; - } - - /* close() only needs to be called if you are worried about using too much memory while your script - is running. All associated result memory for the specified result identifier will automatically be freed. */ - function _close() - { - return ifx_free_result($this->_queryID); - } - -} -/** !Eos - * Auxiliar function to Parse coltype,collength. Used by Metacolumns - * return: array ($mtype,$length,$precision,$nullable) (similar to ifx_fieldpropierties) - */ -function ifx_props($coltype,$collength){ - $itype=fmod($coltype+1,256); - $nullable=floor(($coltype+1) /256) ?"N":"Y"; - $mtype=substr(" CIIFFNNDN TBXCC ",$itype,1); - switch ($itype){ - case 2: - $length=4; - case 6: - case 9: - case 14: - $length=floor($collength/256); - $precision=fmod($collength,256); - break; - default: - $precision=0; - $length=$collength; - } - return array($mtype,$length,$precision,$nullable); -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-ldap.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-ldap.inc.php deleted file mode 100644 index 87c2eaf4..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-ldap.inc.php +++ /dev/null @@ -1,423 +0,0 @@ -_connectionID = @ldap_connect($host); - } else { - $conn_info = array( $host,$this->port); - - if ( strstr( $host, ':' ) ) { - $conn_info = explode( ':', $host ); - } - - $this->_connectionID = @ldap_connect( $conn_info[0], $conn_info[1] ); - } - if (!$this->_connectionID) { - $e = 'Could not connect to ' . $conn_info[0]; - $this->_errorMsg = $e; - if ($this->debug) ADOConnection::outp($e); - return false; - } - if( count( $LDAP_CONNECT_OPTIONS ) > 0 ) { - $this->_inject_bind_options( $LDAP_CONNECT_OPTIONS ); - } - - if ($username) { - $bind = @ldap_bind( $this->_connectionID, $username, $password ); - } else { - $username = 'anonymous'; - $bind = @ldap_bind( $this->_connectionID ); - } - - if (!$bind) { - $e = sprintf($this->_bind_errmsg,ldap_error($this->_connectionID)); - $this->_errorMsg = $e; - if ($this->debug) ADOConnection::outp($e); - return false; - } - $this->_errorMsg = ''; - $this->database = $ldapbase; - return $this->_connectionID; - } - - /* - Valid Domain Values for LDAP Options: - - LDAP_OPT_DEREF (integer) - LDAP_OPT_SIZELIMIT (integer) - LDAP_OPT_TIMELIMIT (integer) - LDAP_OPT_PROTOCOL_VERSION (integer) - LDAP_OPT_ERROR_NUMBER (integer) - LDAP_OPT_REFERRALS (boolean) - LDAP_OPT_RESTART (boolean) - LDAP_OPT_HOST_NAME (string) - LDAP_OPT_ERROR_STRING (string) - LDAP_OPT_MATCHED_DN (string) - LDAP_OPT_SERVER_CONTROLS (array) - LDAP_OPT_CLIENT_CONTROLS (array) - - Make sure to set this BEFORE calling Connect() - - Example: - - $LDAP_CONNECT_OPTIONS = Array( - Array ( - "OPTION_NAME"=>LDAP_OPT_DEREF, - "OPTION_VALUE"=>2 - ), - Array ( - "OPTION_NAME"=>LDAP_OPT_SIZELIMIT, - "OPTION_VALUE"=>100 - ), - Array ( - "OPTION_NAME"=>LDAP_OPT_TIMELIMIT, - "OPTION_VALUE"=>30 - ), - Array ( - "OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION, - "OPTION_VALUE"=>3 - ), - Array ( - "OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER, - "OPTION_VALUE"=>13 - ), - Array ( - "OPTION_NAME"=>LDAP_OPT_REFERRALS, - "OPTION_VALUE"=>FALSE - ), - Array ( - "OPTION_NAME"=>LDAP_OPT_RESTART, - "OPTION_VALUE"=>FALSE - ) - ); - */ - - function _inject_bind_options( $options ) { - foreach( $options as $option ) { - ldap_set_option( $this->_connectionID, $option["OPTION_NAME"], $option["OPTION_VALUE"] ) - or die( "Unable to set server option: " . $option["OPTION_NAME"] ); - } - } - - /* returns _queryID or false */ - function _query($sql,$inputarr=false) - { - $rs = @ldap_search( $this->_connectionID, $this->database, $sql ); - $this->_errorMsg = ($rs) ? '' : 'Search error on '.$sql.': '.ldap_error($this->_connectionID); - return $rs; - } - - function ErrorMsg() - { - return $this->_errorMsg; - } - - function ErrorNo() - { - return @ldap_errno($this->_connectionID); - } - - /* closes the LDAP connection */ - function _close() - { - @ldap_close( $this->_connectionID ); - $this->_connectionID = false; - } - - function SelectDB($db) { - $this->database = $db; - return true; - } // SelectDB - - function ServerInfo() - { - if( !empty( $this->version ) ) return $this->version; - $version = array(); - /* - Determines how aliases are handled during search. - LDAP_DEREF_NEVER (0x00) - LDAP_DEREF_SEARCHING (0x01) - LDAP_DEREF_FINDING (0x02) - LDAP_DEREF_ALWAYS (0x03) - The LDAP_DEREF_SEARCHING value means aliases are dereferenced during the search but - not when locating the base object of the search. The LDAP_DEREF_FINDING value means - aliases are dereferenced when locating the base object but not during the search. - Default: LDAP_DEREF_NEVER - */ - ldap_get_option( $this->_connectionID, LDAP_OPT_DEREF, $version['LDAP_OPT_DEREF'] ) ; - switch ( $version['LDAP_OPT_DEREF'] ) { - case 0: - $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_NEVER'; - case 1: - $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_SEARCHING'; - case 2: - $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_FINDING'; - case 3: - $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_ALWAYS'; - } - - /* - A limit on the number of entries to return from a search. - LDAP_NO_LIMIT (0) means no limit. - Default: LDAP_NO_LIMIT - */ - ldap_get_option( $this->_connectionID, LDAP_OPT_SIZELIMIT, $version['LDAP_OPT_SIZELIMIT'] ); - if ( $version['LDAP_OPT_SIZELIMIT'] == 0 ) { - $version['LDAP_OPT_SIZELIMIT'] = 'LDAP_NO_LIMIT'; - } - - /* - A limit on the number of seconds to spend on a search. - LDAP_NO_LIMIT (0) means no limit. - Default: LDAP_NO_LIMIT - */ - ldap_get_option( $this->_connectionID, LDAP_OPT_TIMELIMIT, $version['LDAP_OPT_TIMELIMIT'] ); - if ( $version['LDAP_OPT_TIMELIMIT'] == 0 ) { - $version['LDAP_OPT_TIMELIMIT'] = 'LDAP_NO_LIMIT'; - } - - /* - Determines whether the LDAP library automatically follows referrals returned by LDAP servers or not. - LDAP_OPT_ON - LDAP_OPT_OFF - Default: ON - */ - ldap_get_option( $this->_connectionID, LDAP_OPT_REFERRALS, $version['LDAP_OPT_REFERRALS'] ); - if ( $version['LDAP_OPT_REFERRALS'] == 0 ) { - $version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_OFF'; - } else { - $version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_ON'; - - } - /* - Determines whether LDAP I/O operations are automatically restarted if they abort prematurely. - LDAP_OPT_ON - LDAP_OPT_OFF - Default: OFF - */ - ldap_get_option( $this->_connectionID, LDAP_OPT_RESTART, $version['LDAP_OPT_RESTART'] ); - if ( $version['LDAP_OPT_RESTART'] == 0 ) { - $version['LDAP_OPT_RESTART'] = 'LDAP_OPT_OFF'; - } else { - $version['LDAP_OPT_RESTART'] = 'LDAP_OPT_ON'; - - } - /* - This option indicates the version of the LDAP protocol used when communicating with the primary LDAP server. - LDAP_VERSION2 (2) - LDAP_VERSION3 (3) - Default: LDAP_VERSION2 (2) - */ - ldap_get_option( $this->_connectionID, LDAP_OPT_PROTOCOL_VERSION, $version['LDAP_OPT_PROTOCOL_VERSION'] ); - if ( $version['LDAP_OPT_PROTOCOL_VERSION'] == 2 ) { - $version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION2'; - } else { - $version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION3'; - - } - /* The host name (or list of hosts) for the primary LDAP server. */ - ldap_get_option( $this->_connectionID, LDAP_OPT_HOST_NAME, $version['LDAP_OPT_HOST_NAME'] ); - ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_NUMBER, $version['LDAP_OPT_ERROR_NUMBER'] ); - ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_STRING, $version['LDAP_OPT_ERROR_STRING'] ); - ldap_get_option( $this->_connectionID, LDAP_OPT_MATCHED_DN, $version['LDAP_OPT_MATCHED_DN'] ); - - return $this->version = $version; - - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_ldap extends ADORecordSet{ - - var $databaseType = "ldap"; - var $canSeek = false; - var $_entryID; /* keeps track of the entry resource identifier */ - - function ADORecordSet_ldap($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_NUM: - $this->fetchMode = LDAP_NUM; - break; - case ADODB_FETCH_ASSOC: - $this->fetchMode = LDAP_ASSOC; - break; - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH: - default: - $this->fetchMode = LDAP_BOTH; - break; - } - - $this->ADORecordSet($queryID); - } - - function _initrs() - { - /* - This could be teaked to respect the $COUNTRECS directive from ADODB - It's currently being used in the _fetch() function and the - GetAssoc() function - */ - $this->_numOfRows = ldap_count_entries( $this->connection->_connectionID, $this->_queryID ); - - } - - /* - Return whole recordset as a multi-dimensional associative array - */ - function GetAssoc($force_array = false, $first2cols = false) - { - $records = $this->_numOfRows; - $results = array(); - for ( $i=0; $i < $records; $i++ ) { - foreach ( $this->fields as $k=>$v ) { - if ( is_array( $v ) ) { - if ( $v['count'] == 1 ) { - $results[$i][$k] = $v[0]; - } else { - array_shift( $v ); - $results[$i][$k] = $v; - } - } - } - } - - return $results; - } - - function GetRowAssoc() - { - $results = array(); - foreach ( $this->fields as $k=>$v ) { - if ( is_array( $v ) ) { - if ( $v['count'] == 1 ) { - $results[$k] = $v[0]; - } else { - array_shift( $v ); - $results[$k] = $v; - } - } - } - - return $results; - } - - function GetRowNums() - { - $results = array(); - foreach ( $this->fields as $k=>$v ) { - static $i = 0; - if (is_array( $v )) { - if ( $v['count'] == 1 ) { - $results[$i] = $v[0]; - } else { - array_shift( $v ); - $results[$i] = $v; - } - $i++; - } - } - return $results; - } - - function _fetch() - { - if ( $this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0 ) - return false; - - if ( $this->_currentRow == 0 ) { - $this->_entryID = ldap_first_entry( $this->connection->_connectionID, $this->_queryID ); - } else { - $this->_entryID = ldap_next_entry( $this->connection->_connectionID, $this->_entryID ); - } - - $this->fields = ldap_get_attributes( $this->connection->_connectionID, $this->_entryID ); - $this->_numOfFields = $this->fields['count']; - switch ( $this->fetchMode ) { - - case LDAP_ASSOC: - $this->fields = $this->GetRowAssoc(); - break; - - case LDAP_NUM: - $this->fields = array_merge($this->GetRowNums(),$this->GetRowAssoc()); - break; - - case LDAP_BOTH: - default: - $this->fields = $this->GetRowNums(); - break; - } - return ( is_array( $this->fields ) ); - } - - function _close() { - @ldap_free_result( $this->_queryID ); - $this->_queryID = false; - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-mssql.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-mssql.inc.php deleted file mode 100644 index 3dced824..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-mssql.inc.php +++ /dev/null @@ -1,1099 +0,0 @@ -= 0x4300) { - // docs say 4.2.0, but testing shows only since 4.3.0 does it work! - ini_set('mssql.datetimeconvert',0); -} else { - global $ADODB_mssql_mths; // array, months must be upper-case - - - $ADODB_mssql_date_order = 'mdy'; - $ADODB_mssql_mths = array( - 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, - 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); -} - -//--------------------------------------------------------------------------- -// Call this to autoset $ADODB_mssql_date_order at the beginning of your code, -// just after you connect to the database. Supports mdy and dmy only. -// Not required for PHP 4.2.0 and above. -function AutoDetect_MSSQL_Date_Order($conn) -{ - global $ADODB_mssql_date_order; - $adate = $conn->GetOne('select getdate()'); - if ($adate) { - $anum = (int) $adate; - if ($anum > 0) { - if ($anum > 31) { - //ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently"); - } else - $ADODB_mssql_date_order = 'dmy'; - } else - $ADODB_mssql_date_order = 'mdy'; - } -} - -class ADODB_mssql extends ADOConnection { - var $databaseType = "mssql"; - var $dataProvider = "mssql"; - var $replaceQuote = "''"; // string to use to replace quotes - var $fmtDate = "'Y-m-d'"; - var $fmtTimeStamp = "'Y-m-d H:i:s'"; - var $hasInsertID = true; - var $substr = "substring"; - var $length = 'len'; - var $hasAffectedRows = true; - var $metaDatabasesSQL = "select name from sysdatabases where name <> 'master'"; - var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))"; - var $metaColumnsSQL = # xtype==61 is datetime -"select c.name,t.name,c.length, - (case when c.xusertype=61 then 0 else c.xprec end), - (case when c.xusertype=61 then 0 else c.xscale end) - from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; - var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE - var $hasGenID = true; - var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; - var $sysTimeStamp = 'GetDate()'; - var $_has_mssql_init; - var $maxParameterLen = 4000; - var $arrayClass = 'ADORecordSet_array_mssql'; - var $uniqueSort = true; - var $leftOuter = '*='; - var $rightOuter = '=*'; - var $ansiOuter = true; // for mssql7 or later - var $poorAffectedRows = true; - var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 - var $uniqueOrderBy = true; - var $_bindInputArray = true; - var $forceNewConnect = false; - - function ADODB_mssql() - { - $this->_has_mssql_init = (strnatcmp(PHP_VERSION,'4.1.0')>=0); - } - - function ServerInfo() - { - global $ADODB_FETCH_MODE; - - - if ($this->fetchMode === false) { - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - } else - $savem = $this->SetFetchMode(ADODB_FETCH_NUM); - - if (0) { - $stmt = $this->PrepareSP('sp_server_info'); - $val = 2; - $this->Parameter($stmt,$val,'attribute_id'); - $row = $this->GetRow($stmt); - } - - $row = $this->GetRow("execute sp_server_info 2"); - - - if ($this->fetchMode === false) { - $ADODB_FETCH_MODE = $savem; - } else - $this->SetFetchMode($savem); - - $arr['description'] = $row[2]; - $arr['version'] = ADOConnection::_findvers($arr['description']); - return $arr; - } - - function IfNull( $field, $ifNull ) - { - return " ISNULL($field, $ifNull) "; // if MS SQL Server - } - - function _insertid() - { - // SCOPE_IDENTITY() - // Returns the last IDENTITY value inserted into an IDENTITY column in - // the same scope. A scope is a module -- a stored procedure, trigger, - // function, or batch. Thus, two statements are in the same scope if - // they are in the same stored procedure, function, or batch. - if ($this->lastInsID !== false) { - return $this->lastInsID; // InsID from sp_executesql call - } else { - return $this->GetOne($this->identitySQL); - } - } - - - - /** - * Correctly quotes a string so that all strings are escaped. We prefix and append - * to the string single-quotes. - * An example is $db->qstr("Don't bother",magic_quotes_runtime()); - * - * @param s the string to quote - * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). - * This undoes the stupidity of magic quotes for GPC. - * - * @return quoted string to be sent back to database - */ - function qstr($s,$magic_quotes=false) - { - if (!$magic_quotes) { - return "'".str_replace("'",$this->replaceQuote,$s)."'"; - } - - // undo magic quotes for " unless sybase is on - $sybase = @ini_get('magic_quotes_sybase'); - if (!$sybase) { - $s = str_replace('\\"','"',$s); - if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything - return "'$s'"; - else {// change \' to '' for sybase/mssql - $s = str_replace('\\\\','\\',$s); - return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; - } - } else { - return "'".$s."'"; - } - } - // moodle change end - see readme_moodle.txt - - function _affectedrows() - { - return $this->GetOne('select @@rowcount'); - } - - var $_dropSeqSQL = "drop table %s"; - - function CreateSequence($seq='adodbseq',$start=1) - { - - $this->Execute('BEGIN TRANSACTION adodbseq'); - $start -= 1; - $this->Execute("create table $seq (id float(53))"); - $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); - if (!$ok) { - $this->Execute('ROLLBACK TRANSACTION adodbseq'); - return false; - } - $this->Execute('COMMIT TRANSACTION adodbseq'); - return true; - } - - function GenID($seq='adodbseq',$start=1) - { - //$this->debug=1; - $this->Execute('BEGIN TRANSACTION adodbseq'); - $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); - if (!$ok) { - $this->Execute("create table $seq (id float(53))"); - $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); - if (!$ok) { - $this->Execute('ROLLBACK TRANSACTION adodbseq'); - return false; - } - $this->Execute('COMMIT TRANSACTION adodbseq'); - return $start; - } - $num = $this->GetOne("select id from $seq"); - $this->Execute('COMMIT TRANSACTION adodbseq'); - return $num; - - // in old implementation, pre 1.90, we returned GUID... - //return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'"); - } - - - function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) - { - if ($nrows > 0 && $offset <= 0) { - $sql = preg_replace( - '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql); - - if ($secs2cache) - $rs = $this->CacheExecute($secs2cache, $sql, $inputarr); - else - $rs = $this->Execute($sql,$inputarr); - } else - $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - - return $rs; - } - - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysTimeStamp; - $s = ''; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - if ($s) $s .= '+'; - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= "datename(yyyy,$col)"; - break; - case 'M': - $s .= "convert(char(3),$col,0)"; - break; - case 'm': - $s .= "replace(str(month($col),2),' ','0')"; - break; - case 'Q': - case 'q': - $s .= "datename(quarter,$col)"; - break; - case 'D': - case 'd': - $s .= "replace(str(day($col),2),' ','0')"; - break; - case 'h': - $s .= "substring(convert(char(14),$col,0),13,2)"; - break; - - case 'H': - $s .= "replace(str(datepart(hh,$col),2),' ','0')"; - break; - - case 'i': - $s .= "replace(str(datepart(mi,$col),2),' ','0')"; - break; - case 's': - $s .= "replace(str(datepart(ss,$col),2),' ','0')"; - break; - case 'a': - case 'A': - $s .= "substring(convert(char(19),$col,0),18,2)"; - break; - - default: - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - $s .= $this->qstr($ch); - break; - } - } - return $s; - } - - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - $ok = $this->Execute('BEGIN TRAN'); - return $ok; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - if ($this->transCnt) $this->transCnt -= 1; - $ok = $this->Execute('COMMIT TRAN'); - return $ok; - } - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $ok = $this->Execute('ROLLBACK TRAN'); - return $ok; - } - - function SetTransactionMode( $transaction_mode ) - { - $this->_transmode = $transaction_mode; - if (empty($transaction_mode)) { - $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); - return; - } - if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; - $this->Execute("SET TRANSACTION ".$transaction_mode); - } - - /* - Usage: - - $this->BeginTrans(); - $this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables - - # some operation on both tables table1 and table2 - - $this->CommitTrans(); - - See http://www.swynk.com/friends/achigrik/SQL70Locks.asp - */ - function RowLock($tables,$where,$col='top 1 null as ignore') - { - if (!$this->transCnt) $this->BeginTrans(); - return $this->GetOne("select $col from $tables with (ROWLOCK,HOLDLOCK) where $where"); - } - - - function MetaIndexes($table,$primary=false, $owner=false) - { - $table = $this->qstr($table); - - $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, - CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, - CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique - FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id - INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid - INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid - WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table - ORDER BY O.name, I.Name, K.keyno"; - - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - $rs = $this->Execute($sql); - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - if (!is_object($rs)) { - return FALSE; - } - - $indexes = array(); - while ($row = $rs->FetchRow()) { - if ($primary && !$row[5]) continue; - - $indexes[$row[0]]['unique'] = $row[6]; - $indexes[$row[0]]['columns'][] = $row[1]; - } - return $indexes; - } - - function MetaForeignKeys($table, $owner=false, $upper=false) - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $table = $this->qstr(strtoupper($table)); - - $sql = -"select object_name(constid) as constraint_name, - col_name(fkeyid, fkey) as column_name, - object_name(rkeyid) as referenced_table_name, - col_name(rkeyid, rkey) as referenced_column_name -from sysforeignkeys -where upper(object_name(fkeyid)) = $table -order by constraint_name, referenced_table_name, keyno"; - - $constraints = $this->GetArray($sql); - - $ADODB_FETCH_MODE = $save; - - $arr = false; - foreach($constraints as $constr) { - //print_r($constr); - $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; - } - if (!$arr) return false; - - $arr2 = false; - - foreach($arr as $k => $v) { - foreach($v as $a => $b) { - if ($upper) $a = strtoupper($a); - $arr2[$a] = $b; - } - } - return $arr2; - } - - //From: Fernando Moreira - function MetaDatabases() - { - if(@mssql_select_db("master")) { - $qry=$this->metaDatabasesSQL; - if($rs=@mssql_query($qry,$this->_connectionID)){ - $tmpAr=$ar=array(); - while($tmpAr=@mssql_fetch_row($rs)) - $ar[]=$tmpAr[0]; - @mssql_select_db($this->database); - if(sizeof($ar)) - return($ar); - else - return(false); - } else { - @mssql_select_db($this->database); - return(false); - } - } - return(false); - } - - // "Stein-Aksel Basma" - // tested with MSSQL 2000 - function MetaPrimaryKeys($table) - { - global $ADODB_FETCH_MODE; - - $schema = ''; - $this->_findschema($table,$schema); - if (!$schema) $schema = $this->database; - if ($schema) $schema = "and k.table_catalog like '$schema%'"; - - $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, - information_schema.table_constraints tc - where tc.constraint_name = k.constraint_name and tc.constraint_type = - 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $a = $this->GetCol($sql); - $ADODB_FETCH_MODE = $savem; - - if ($a && sizeof($a)>0) return $a; - $false = false; - return $false; - } - - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr(($mask)); - $this->metaTablesSQL .= " AND name like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } - - function SelectDB($dbName) - { - $this->database = $dbName; - $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions - if ($this->_connectionID) { - return @mssql_select_db($dbName); - } - else return false; - } - - function ErrorMsg() - { - if (empty($this->_errorMsg)){ - $this->_errorMsg = mssql_get_last_message(); - } - return $this->_errorMsg; - } - - function ErrorNo() - { - if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode; - if (empty($this->_errorMsg)) { - $this->_errorMsg = mssql_get_last_message(); - } - $id = @mssql_query("select @@ERROR",$this->_connectionID); - if (!$id) return false; - $arr = mssql_fetch_array($id); - @mssql_free_result($id); - if (is_array($arr)) return $arr[0]; - else return -1; - } - - // returns true or false, newconnect supported since php 5.1.0. - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$newconnect=false) - { - if (!function_exists('mssql_pconnect')) return null; - $this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword,$newconnect); - if ($this->_connectionID === false) return false; - if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('mssql_pconnect')) return null; - $this->_connectionID = mssql_pconnect($argHostname,$argUsername,$argPassword); - if ($this->_connectionID === false) return false; - - // persistent connections can forget to rollback on crash, so we do it here. - if ($this->autoRollback) { - $cnt = $this->GetOne('select @@TRANCOUNT'); - while (--$cnt >= 0) $this->Execute('ROLLBACK TRAN'); - } - if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - - function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true); - } - - function Prepare($sql) - { - $sqlarr = explode('?',$sql); - if (sizeof($sqlarr) <= 1) return $sql; - $sql2 = $sqlarr[0]; - for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) { - $sql2 .= '@P'.($i-1) . $sqlarr[$i]; - } - return array($sql,$this->qstr($sql2),$max,$sql2); - } - - function PrepareSP($sql) - { - if (!$this->_has_mssql_init) { - ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0"); - return $sql; - } - $stmt = mssql_init($sql,$this->_connectionID); - if (!$stmt) return $sql; - return array($sql,$stmt); - } - - // returns concatenated string - // MSSQL requires integers to be cast as strings - // automatically cast every datatype to VARCHAR(255) - // @author David Rogers (introspectshun) - function Concat() - { - $s = ""; - $arr = func_get_args(); - - // Split single record on commas, if possible - if (sizeof($arr) == 1) { - foreach ($arr as $arg) { - $args = explode(',', $arg); - } - $arr = $args; - } - - array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";')); - $s = implode('+',$arr); - if (sizeof($arr) > 0) return "$s"; - - return ''; - } - - /* - Usage: - $stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group - - # note that the parameter does not have @ in front! - $db->Parameter($stmt,$id,'myid'); - $db->Parameter($stmt,$group,'group',false,64); - $db->Execute($stmt); - - @param $stmt Statement returned by Prepare() or PrepareSP(). - @param $var PHP variable to bind to. Can set to null (for isNull support). - @param $name Name of stored procedure variable name to bind to. - @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. - @param [$maxLen] Holds an maximum length of the variable. - @param [$type] The data type of $var. Legal values depend on driver. - - See mssql_bind documentation at php.net. - */ - function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=4000, $type=false) - { - if (!$this->_has_mssql_init) { - ADOConnection::outp( "Parameter: mssql_bind only available since PHP 4.1.0"); - return false; - } - - $isNull = is_null($var); // php 4.0.4 and above... - - if ($type === false) - switch(gettype($var)) { - default: - case 'string': $type = SQLVARCHAR; break; - case 'double': $type = SQLFLT8; break; - case 'integer': $type = SQLINT4; break; - case 'boolean': $type = SQLINT1; break; # SQLBIT not supported in 4.1.0 - } - - if ($this->debug) { - $prefix = ($isOutput) ? 'Out' : 'In'; - $ztype = (empty($type)) ? 'false' : $type; - ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);"); - } - /* - See http://phplens.com/lens/lensforum/msgs.php?id=7231 - - RETVAL is HARD CODED into php_mssql extension: - The return value (a long integer value) is treated like a special OUTPUT parameter, - called "RETVAL" (without the @). See the example at mssql_execute to - see how it works. - type: one of this new supported PHP constants. - SQLTEXT, SQLVARCHAR,SQLCHAR, SQLINT1,SQLINT2, SQLINT4, SQLBIT,SQLFLT8 - */ - if ($name !== 'RETVAL') $name = '@'.$name; - return mssql_bind($stmt[1], $name, $var, $type, $isOutput, $isNull, $maxLen); - } - - /* - Unfortunately, it appears that mssql cannot handle varbinary > 255 chars - So all your blobs must be of type "image". - - Remember to set in php.ini the following... - - ; Valid range 0 - 2147483647. Default = 4096. - mssql.textlimit = 0 ; zero to pass through - - ; Valid range 0 - 2147483647. Default = 4096. - mssql.textsize = 0 ; zero to pass through - */ - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - - if (strtoupper($blobtype) == 'CLOB') { - $sql = "UPDATE $table SET $column='" . $val . "' WHERE $where"; - return $this->Execute($sql) != false; - } - $sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where"; - return $this->Execute($sql) != false; - } - - // returns query ID if successful, otherwise false - function _query($sql,$inputarr=false) - { - $this->_errorMsg = false; - if (is_array($inputarr)) { - - # bind input params with sp_executesql: - # see http://www.quest-pipelines.com/newsletter-v3/0402_F.htm - # works only with sql server 7 and newer - $getIdentity = false; - if (!is_array($sql) && preg_match('/^\\s*insert/i', $sql)) { - $getIdentity = true; - $sql .= (preg_match('/;\\s*$/i', $sql) ? ' ' : '; ') . $this->identitySQL; - } - if (!is_array($sql)) $sql = $this->Prepare($sql); - $params = ''; - $decl = ''; - $i = 0; - foreach($inputarr as $v) { - if ($decl) { - $decl .= ', '; - $params .= ', '; - } - if (is_string($v)) { - $len = strlen($v); - if ($len == 0) $len = 1; - - if ($len > 4000 ) { - // NVARCHAR is max 4000 chars. Let's use NTEXT - $decl .= "@P$i NTEXT"; - } else { - $decl .= "@P$i NVARCHAR($len)"; - } - - $params .= "@P$i=N". (strncmp($v,"'",1)==0? $v : $this->qstr($v)); - } else if (is_integer($v)) { - $decl .= "@P$i INT"; - $params .= "@P$i=".$v; - } else if (is_float($v)) { - $decl .= "@P$i FLOAT"; - $params .= "@P$i=".$v; - } else if (is_bool($v)) { - $decl .= "@P$i INT"; # Used INT just in case BIT in not supported on the user's MSSQL version. It will cast appropriately. - $params .= "@P$i=".(($v)?'1':'0'); # True == 1 in MSSQL BIT fields and acceptable for storing logical true in an int field - } else { - $decl .= "@P$i CHAR"; # Used char because a type is required even when the value is to be NULL. - $params .= "@P$i=NULL"; - } - $i += 1; - } - $decl = $this->qstr($decl); - if ($this->debug) ADOConnection::outp("sp_executesql N{$sql[1]},N$decl,$params"); - $rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params", $this->_connectionID); - if ($getIdentity) { - $arr = @mssql_fetch_row($rez); - $this->lastInsID = isset($arr[0]) ? $arr[0] : false; - @mssql_data_seek($rez, 0); - } - - } else if (is_array($sql)) { - # PrepareSP() - $rez = mssql_execute($sql[1]); - $this->lastInsID = false; - - } else { - $rez = mssql_query($sql,$this->_connectionID); - $this->lastInsID = false; - } - return $rez; - } - - // returns true or false - function _close() - { - if ($this->transCnt) $this->RollbackTrans(); - $rez = @mssql_close($this->_connectionID); - $this->_connectionID = false; - return $rez; - } - - // mssql uses a default date like Dec 30 2000 12:00AM - static function UnixDate($v) - { - return ADORecordSet_array_mssql::UnixDate($v); - } - - static function UnixTimeStamp($v) - { - return ADORecordSet_array_mssql::UnixTimeStamp($v); - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_mssql extends ADORecordSet { - - var $databaseType = "mssql"; - var $canSeek = true; - var $hasFetchAssoc; // see http://phplens.com/lens/lensforum/msgs.php?id=6083 - // _mths works only in non-localised system - - function ADORecordset_mssql($id,$mode=false) - { - // freedts check... - $this->hasFetchAssoc = function_exists('mssql_fetch_assoc'); - - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - - } - $this->fetchMode = $mode; - return $this->ADORecordSet($id,$mode); - } - - - function _initrs() - { - GLOBAL $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS)? @mssql_num_rows($this->_queryID):-1; - $this->_numOfFields = @mssql_num_fields($this->_queryID); - } - - - //Contributed by "Sven Axelsson" - // get next resultset - requires PHP 4.0.5 or later - function NextRecordSet() - { - if (!mssql_next_result($this->_queryID)) return false; - $this->_inited = false; - $this->bind = false; - $this->_currentRow = -1; - $this->Init(); - return true; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode != ADODB_FETCH_NUM) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - /* Returns: an object containing field information. - Get column information in the Recordset object. fetchField() can be used in order to obtain information about - fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by - fetchField() is retrieved. */ - - function FetchField($fieldOffset = -1) - { - if ($fieldOffset != -1) { - $f = @mssql_fetch_field($this->_queryID, $fieldOffset); - } - else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ - $f = @mssql_fetch_field($this->_queryID); - } - $false = false; - if (empty($f)) return $false; - return $f; - } - - function _seek($row) - { - return @mssql_data_seek($this->_queryID, $row); - } - - // speedup - function MoveNext() - { - if ($this->EOF) return false; - - $this->_currentRow++; - - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - if ($this->fetchMode & ADODB_FETCH_NUM) { - //ADODB_FETCH_BOTH mode - $this->fields = @mssql_fetch_array($this->_queryID); - } - else { - if ($this->hasFetchAssoc) {// only for PHP 4.2.0 or later - $this->fields = @mssql_fetch_assoc($this->_queryID); - } else { - $flds = @mssql_fetch_array($this->_queryID); - if (is_array($flds)) { - $fassoc = array(); - foreach($flds as $k => $v) { - if (is_numeric($k)) continue; - $fassoc[$k] = $v; - } - $this->fields = $fassoc; - } else - $this->fields = false; - } - } - - if (is_array($this->fields)) { - if (ADODB_ASSOC_CASE == 0) { - foreach($this->fields as $k=>$v) { - $this->fields[strtolower($k)] = $v; - } - } else if (ADODB_ASSOC_CASE == 1) { - foreach($this->fields as $k=>$v) { - $this->fields[strtoupper($k)] = $v; - } - } - } - } else { - $this->fields = @mssql_fetch_row($this->_queryID); - } - if ($this->fields) return true; - $this->EOF = true; - - return false; - } - - - // INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4 - // also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot! - function _fetch($ignore_fields=false) - { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - if ($this->fetchMode & ADODB_FETCH_NUM) { - //ADODB_FETCH_BOTH mode - $this->fields = @mssql_fetch_array($this->_queryID); - } else { - if ($this->hasFetchAssoc) // only for PHP 4.2.0 or later - $this->fields = @mssql_fetch_assoc($this->_queryID); - else { - $this->fields = @mssql_fetch_array($this->_queryID); - if (@is_array($$this->fields)) { - $fassoc = array(); - foreach($$this->fields as $k => $v) { - if (is_integer($k)) continue; - $fassoc[$k] = $v; - } - $this->fields = $fassoc; - } - } - } - - if (!$this->fields) { - } else if (ADODB_ASSOC_CASE == 0) { - foreach($this->fields as $k=>$v) { - $this->fields[strtolower($k)] = $v; - } - } else if (ADODB_ASSOC_CASE == 1) { - foreach($this->fields as $k=>$v) { - $this->fields[strtoupper($k)] = $v; - } - } - } else { - $this->fields = @mssql_fetch_row($this->_queryID); - } - return $this->fields; - } - - /* close() only needs to be called if you are worried about using too much memory while your script - is running. All associated result memory for the specified result identifier will automatically be freed. */ - - function _close() - { - $rez = mssql_free_result($this->_queryID); - $this->_queryID = false; - return $rez; - } - // mssql uses a default date like Dec 30 2000 12:00AM - static function UnixDate($v) - { - return ADORecordSet_array_mssql::UnixDate($v); - } - - static function UnixTimeStamp($v) - { - return ADORecordSet_array_mssql::UnixTimeStamp($v); - } - -} - - -class ADORecordSet_array_mssql extends ADORecordSet_array { - function ADORecordSet_array_mssql($id=-1,$mode=false) - { - $this->ADORecordSet_array($id,$mode); - } - - // mssql uses a default date like Dec 30 2000 12:00AM - static function UnixDate($v) - { - - if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v); - - global $ADODB_mssql_mths,$ADODB_mssql_date_order; - - //Dec 30 2000 12:00AM - if ($ADODB_mssql_date_order == 'dmy') { - if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) { - return parent::UnixDate($v); - } - if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; - - $theday = $rr[1]; - $themth = substr(strtoupper($rr[2]),0,3); - } else { - if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) { - return parent::UnixDate($v); - } - if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; - - $theday = $rr[2]; - $themth = substr(strtoupper($rr[1]),0,3); - } - $themth = $ADODB_mssql_mths[$themth]; - if ($themth <= 0) return false; - // h-m-s-MM-DD-YY - return mktime(0,0,0,$themth,$theday,$rr[3]); - } - - static function UnixTimeStamp($v) - { - - if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v); - - global $ADODB_mssql_mths,$ADODB_mssql_date_order; - - //Dec 30 2000 12:00AM - if ($ADODB_mssql_date_order == 'dmy') { - if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|" - ,$v, $rr)) return parent::UnixTimeStamp($v); - if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; - - $theday = $rr[1]; - $themth = substr(strtoupper($rr[2]),0,3); - } else { - if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|" - ,$v, $rr)) return parent::UnixTimeStamp($v); - if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; - - $theday = $rr[2]; - $themth = substr(strtoupper($rr[1]),0,3); - } - - $themth = $ADODB_mssql_mths[$themth]; - if ($themth <= 0) return false; - - switch (strtoupper($rr[6])) { - case 'P': - if ($rr[4]<12) $rr[4] += 12; - break; - case 'A': - if ($rr[4]==12) $rr[4] = 0; - break; - default: - break; - } - // h-m-s-MM-DD-YY - return mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]); - } -} - -/* - Code Example 1: - - select object_name(constid) as constraint_name, - object_name(fkeyid) as table_name, - col_name(fkeyid, fkey) as column_name, - object_name(rkeyid) as referenced_table_name, - col_name(rkeyid, rkey) as referenced_column_name - from sysforeignkeys - where object_name(fkeyid) = x - order by constraint_name, table_name, referenced_table_name, keyno - - Code Example 2: - select constraint_name, - column_name, - ordinal_position - from information_schema.key_column_usage - where constraint_catalog = db_name() - and table_name = x - order by constraint_name, ordinal_position - - http://www.databasejournal.com/scripts/article.php/1440551 - */ - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-mssql_n.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-mssql_n.inc.php deleted file mode 100644 index 02d8d44f..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-mssql_n.inc.php +++ /dev/null @@ -1,171 +0,0 @@ -_appendN($sql); - return ADODB_mssql::_query($sql,$inputarr); - } - - /** - * This function will intercept all the literals used in the SQL, prepending the "N" char to them - * in order to allow mssql to store properly data sent in the correct UCS-2 encoding (by freeTDS - * and ODBTP) keeping SQL compatibility at ADOdb level (instead of hacking every project to add - * the "N" notation when working against MSSQL. - * - * Note that this hack only must be used if ALL the char-based columns in your DB are of type nchar, - * nvarchar and ntext - */ - function _appendN($sql) { - - $result = $sql; - - /// Check we have some single quote in the query. Exit ok. - if (strpos($sql, SINGLEQUOTE) === false) { - return $sql; - } - - /// Check we haven't an odd number of single quotes (this can cause problems below - /// and should be considered one wrong SQL). Exit with debug info. - if ((substr_count($sql, SINGLEQUOTE) & 1)) { - if ($this->debug) { - ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Wrong number of quotes (odd)"); - } - return $sql; - } - - /// Check we haven't any backslash + single quote combination. It should mean wrong - /// backslashes use (bad magic_quotes_sybase?). Exit with debug info. - $regexp = '/(\\\\' . SINGLEQUOTE . '[^' . SINGLEQUOTE . '])/'; - if (preg_match($regexp, $sql)) { - if ($this->debug) { - ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Found bad use of backslash + single quote"); - } - return $sql; - } - - /// Remove pairs of single-quotes - $pairs = array(); - $regexp = '/(' . SINGLEQUOTE . SINGLEQUOTE . ')/'; - preg_match_all($regexp, $result, $list_of_pairs); - if ($list_of_pairs) { - foreach (array_unique($list_of_pairs[0]) as $key=>$value) { - $pairs['<@#@#@PAIR-'.$key.'@#@#@>'] = $value; - } - if (!empty($pairs)) { - $result = str_replace($pairs, array_keys($pairs), $result); - } - } - - /// Remove the rest of literals present in the query - $literals = array(); - $regexp = '/(N?' . SINGLEQUOTE . '.*?' . SINGLEQUOTE . ')/is'; - preg_match_all($regexp, $result, $list_of_literals); - if ($list_of_literals) { - foreach (array_unique($list_of_literals[0]) as $key=>$value) { - $literals['<#@#@#LITERAL-'.$key.'#@#@#>'] = $value; - } - if (!empty($literals)) { - $result = str_replace($literals, array_keys($literals), $result); - } - } - - - /// Analyse literals to prepend the N char to them if their contents aren't numeric - if (!empty($literals)) { - foreach ($literals as $key=>$value) { - if (!is_numeric(trim($value, SINGLEQUOTE))) { - /// Non numeric string, prepend our dear N - $literals[$key] = 'N' . trim($value, 'N'); //Trimming potentially existing previous "N" - } - } - } - - /// Re-apply literals to the text - if (!empty($literals)) { - $result = str_replace(array_keys($literals), $literals, $result); - } - - /// Any pairs followed by N' must be switched to N' followed by those pairs - /// (or strings beginning with single quotes will fail) - $result = preg_replace("/((<@#@#@PAIR-(\d+)@#@#@>)+)N'/", "N'$1", $result); - - /// Re-apply pairs of single-quotes to the text - if (!empty($pairs)) { - $result = str_replace(array_keys($pairs), $pairs, $result); - } - - /// Print transformation if debug = on - if ($result != $sql && $this->debug) { - ADOConnection::outp("{$this->databaseType} internal transformation:
        {$sql}
        to
        {$result}"); - } - - return $result; - } -} - -class ADORecordset_mssql_n extends ADORecordset_mssql { - var $databaseType = "mssql_n"; - function ADORecordset_mssql_n($id,$mode=false) - { - $this->ADORecordset_mssql($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-mssqlnative.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-mssqlnative.inc.php deleted file mode 100644 index 7ed196a8..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-mssqlnative.inc.php +++ /dev/null @@ -1,975 +0,0 @@ -= 0x4300) { - // docs say 4.2.0, but testing shows only since 4.3.0 does it work! - ini_set('mssql.datetimeconvert',0); -} else { - global $ADODB_mssql_mths; // array, months must be upper-case - $ADODB_mssql_date_order = 'mdy'; - $ADODB_mssql_mths = array( - 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, - 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); -} - -//--------------------------------------------------------------------------- -// Call this to autoset $ADODB_mssql_date_order at the beginning of your code, -// just after you connect to the database. Supports mdy and dmy only. -// Not required for PHP 4.2.0 and above. -function AutoDetect_MSSQL_Date_Order($conn) -{ - global $ADODB_mssql_date_order; - $adate = $conn->GetOne('select getdate()'); - if ($adate) { - $anum = (int) $adate; - if ($anum > 0) { - if ($anum > 31) { - //ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently"); - } else - $ADODB_mssql_date_order = 'dmy'; - } else - $ADODB_mssql_date_order = 'mdy'; - } -} - -class ADODB_mssqlnative extends ADOConnection { - var $databaseType = "mssqlnative"; - var $dataProvider = "mssqlnative"; - var $replaceQuote = "''"; // string to use to replace quotes - var $fmtDate = "'Y-m-d'"; - var $fmtTimeStamp = "'Y-m-d H:i:s'"; - var $hasInsertID = true; - var $substr = "substring"; - var $length = 'len'; - var $hasAffectedRows = true; - var $poorAffectedRows = false; - var $metaDatabasesSQL = "select name from sys.sysdatabases where name <> 'master'"; - var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))"; - var $metaColumnsSQL = # xtype==61 is datetime - "select c.name,t.name,c.length, - (case when c.xusertype=61 then 0 else c.xprec end), - (case when c.xusertype=61 then 0 else c.xscale end) - from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'"; - var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE - var $hasGenID = true; - var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; - var $sysTimeStamp = 'GetDate()'; - var $maxParameterLen = 4000; - var $arrayClass = 'ADORecordSet_array_mssqlnative'; - var $uniqueSort = true; - var $leftOuter = '*='; - var $rightOuter = '=*'; - var $ansiOuter = true; // for mssql7 or later - var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000 - var $uniqueOrderBy = true; - var $_bindInputArray = true; - var $_dropSeqSQL = "drop table %s"; - - function ADODB_mssqlnative() - { - if ($this->debug) { - error_log("
        ");
        -            sqlsrv_set_error_handling( SQLSRV_ERRORS_LOG_ALL );
        -            sqlsrv_log_set_severity( SQLSRV_LOG_SEVERITY_ALL );
        -            sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL);
        -            sqlsrv_configure('warnings_return_as_errors', 0);
        -        } else {
        -            sqlsrv_set_error_handling(0);
        -            sqlsrv_log_set_severity(0);
        -            sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL);
        -            sqlsrv_configure('warnings_return_as_errors', 0);
        -        }
        -    }
        -
        -    function ServerInfo()
        -    {
        -        global $ADODB_FETCH_MODE;
        -        if ($this->fetchMode === false) {
        -            $savem = $ADODB_FETCH_MODE;
        -            $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        -        } else
        -        $savem = $this->SetFetchMode(ADODB_FETCH_NUM);
        -        $arrServerInfo = sqlsrv_server_info($this->_connectionID);
        -        $arr['description'] = $arrServerInfo['SQLServerName'].' connected to '.$arrServerInfo['CurrentDatabase'];
        -        $arr['version'] = $arrServerInfo['SQLServerVersion'];//ADOConnection::_findvers($arr['description']);
        -        return $arr;
        -    }
        -
        -    function IfNull( $field, $ifNull )
        -    {
        -        return " ISNULL($field, $ifNull) "; // if MS SQL Server
        -    }
        -
        -    function _insertid()
        -    {
        -        // SCOPE_IDENTITY()
        -        // Returns the last IDENTITY value inserted into an IDENTITY column in
        -        // the same scope. A scope is a module -- a stored procedure, trigger,
        -        // function, or batch. Thus, two statements are in the same scope if
        -        // they are in the same stored procedure, function, or batch.
        -        return $this->GetOne($this->identitySQL);
        -    }
        -
        -    function _affectedrows()
        -    {
        -        return @sqlsrv_rows_affected($this->_queryID);
        -    }
        -
        -    function CreateSequence($seq='adodbseq',$start=1)
        -    {
        -        if($this->debug) error_log("
        CreateSequence($seq,$start)"); - sqlsrv_begin_transaction($this->_connectionID); - $start -= 1; - $this->Execute("create table $seq (id int)");//was float(53) - $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); - if (!$ok) { - if($this->debug) error_log("
        Error: ROLLBACK"); - sqlsrv_rollback($this->_connectionID); - return false; - } - sqlsrv_commit($this->_connectionID); - return true; - } - - function GenID($seq='adodbseq',$start=1) - { - if($this->debug) error_log("
        GenID($seq,$start)"); - sqlsrv_begin_transaction($this->_connectionID); - $ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1"); - if (!$ok) { - $this->Execute("create table $seq (id int)"); - $ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)"); - if (!$ok) { - if($this->debug) error_log("
        Error: ROLLBACK"); - sqlsrv_rollback($this->_connectionID); - return false; - } - sqlsrv_commit($this->_connectionID); - return $start; - } - $num = $this->GetOne("select id from $seq"); - sqlsrv_commit($this->_connectionID); - if($this->debug) error_log(" Returning: $num"); - return $num; - } - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysTimeStamp; - $s = ''; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - if ($s) $s .= '+'; - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= "datename(yyyy,$col)"; - break; - case 'M': - $s .= "convert(char(3),$col,0)"; - break; - case 'm': - $s .= "replace(str(month($col),2),' ','0')"; - break; - case 'Q': - case 'q': - $s .= "datename(quarter,$col)"; - break; - case 'D': - case 'd': - $s .= "replace(str(day($col),2),' ','0')"; - break; - case 'h': - $s .= "substring(convert(char(14),$col,0),13,2)"; - break; - - case 'H': - $s .= "replace(str(datepart(hh,$col),2),' ','0')"; - break; - - case 'i': - $s .= "replace(str(datepart(mi,$col),2),' ','0')"; - break; - case 's': - $s .= "replace(str(datepart(ss,$col),2),' ','0')"; - break; - case 'a': - case 'A': - $s .= "substring(convert(char(19),$col,0),18,2)"; - break; - - default: - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - $s .= $this->qstr($ch); - break; - } - } - return $s; - } - - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - if ($this->debug) error_log('
        begin transaction'); - sqlsrv_begin_transaction($this->_connectionID); - return true; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if ($this->debug) error_log('
        commit transaction'); - if (!$ok) return $this->RollbackTrans(); - if ($this->transCnt) $this->transCnt -= 1; - sqlsrv_commit($this->_connectionID); - return true; - } - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->debug) error_log('
        rollback transaction'); - if ($this->transCnt) $this->transCnt -= 1; - sqlsrv_rollback($this->_connectionID); - return true; - } - - function SetTransactionMode( $transaction_mode ) - { - $this->_transmode = $transaction_mode; - if (empty($transaction_mode)) { - $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); - return; - } - if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; - $this->Execute("SET TRANSACTION ".$transaction_mode); - } - - /* - Usage: - - $this->BeginTrans(); - $this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables - - # some operation on both tables table1 and table2 - - $this->CommitTrans(); - - See http://www.swynk.com/friends/achigrik/SQL70Locks.asp - */ - function RowLock($tables,$where,$col='1 as adodbignore') - { - if ($col == '1 as adodbignore') $col = 'top 1 null as ignore'; - if (!$this->transCnt) $this->BeginTrans(); - return $this->GetOne("select $col from $tables with (ROWLOCK,HOLDLOCK) where $where"); - } - - function SelectDB($dbName) - { - $this->database = $dbName; - $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions - if ($this->_connectionID) { - $rs = $this->Execute('USE '.$dbName); - if($rs) { - return true; - } else return false; - } - else return false; - } - - function ErrorMsg() - { - $retErrors = sqlsrv_errors(SQLSRV_ERR_ALL); - if($retErrors != null) { - foreach($retErrors as $arrError) { - $this->_errorMsg .= "SQLState: ".$arrError[ 'SQLSTATE']."\n"; - $this->_errorMsg .= "Error Code: ".$arrError[ 'code']."\n"; - $this->_errorMsg .= "Message: ".$arrError[ 'message']."\n"; - } - } else { - $this->_errorMsg = "No errors found"; - } - return $this->_errorMsg; - } - - function ErrorNo() - { - if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode; - $err = sqlsrv_errors(SQLSRV_ERR_ALL); - if($err[0]) return $err[0]['code']; - else return -1; - } - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('sqlsrv_connect')) return null; - $connectionInfo = array("Database"=>$argDatabasename,'UID'=>$argUsername,'PWD'=>$argPassword); - if ($this->debug) error_log("
        connecting... hostname: $argHostname params: ".var_export($connectionInfo,true)); - //if ($this->debug) error_log("
        _connectionID before: ".serialize($this->_connectionID)); - if(!($this->_connectionID = sqlsrv_connect($argHostname,$connectionInfo))) { - if ($this->debug) error_log( "
        errors: ".print_r( sqlsrv_errors(), true)); - return false; - } - //if ($this->debug) error_log(" _connectionID after: ".serialize($this->_connectionID)); - //if ($this->debug) error_log("
        defined functions:
        ".var_export(get_defined_functions(),true)."
        "); - return true; - } - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - //return null;//not implemented. NOTE: Persistent connections have no effect if PHP is used as a CGI program. (FastCGI!) - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename); - } - - function Prepare($sql) - { - $stmt = sqlsrv_prepare( $this->_connectionID, $sql); - if (!$stmt) return $sql; - return array($sql,$stmt); - } - - // returns concatenated string - // MSSQL requires integers to be cast as strings - // automatically cast every datatype to VARCHAR(255) - // @author David Rogers (introspectshun) - function Concat() - { - $s = ""; - $arr = func_get_args(); - - // Split single record on commas, if possible - if (sizeof($arr) == 1) { - foreach ($arr as $arg) { - $args = explode(',', $arg); - } - $arr = $args; - } - - array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";')); - $s = implode('+',$arr); - if (sizeof($arr) > 0) return "$s"; - - return ''; - } - - /* - Unfortunately, it appears that mssql cannot handle varbinary > 255 chars - So all your blobs must be of type "image". - - Remember to set in php.ini the following... - - ; Valid range 0 - 2147483647. Default = 4096. - mssql.textlimit = 0 ; zero to pass through - - ; Valid range 0 - 2147483647. Default = 4096. - mssql.textsize = 0 ; zero to pass through - */ - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - - if (strtoupper($blobtype) == 'CLOB') { - $sql = "UPDATE $table SET $column='" . $val . "' WHERE $where"; - return $this->Execute($sql) != false; - } - $sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where"; - return $this->Execute($sql) != false; - } - - // returns query ID if successful, otherwise false - function _query($sql,$inputarr=false) - { - $this->_errorMsg = false; - if (is_array($inputarr)) { - $rez = sqlsrv_query($this->_connectionID,$sql,$inputarr); - } else if (is_array($sql)) { - $rez = sqlsrv_query($this->_connectionID,$sql[1],$inputarr); - } else { - $rez = sqlsrv_query($this->_connectionID,$sql); - } - if ($this->debug) error_log("
        running query: ".var_export($sql,true)."
        input array: ".var_export($inputarr,true)."
        result: ".var_export($rez,true));//"
        connection: ".serialize($this->_connectionID) - //fix for returning true on anything besides select statements - if (is_array($sql)) $sql = $sql[1]; - $sql = ltrim($sql); - if(stripos($sql, 'SELECT') !== 0 && $rez !== false) { - if ($this->debug) error_log(" isn't a select query, returning boolean true"); - return true; - } - //end fix - if(!$rez) $rez = false; - return $rez; - } - - // returns true or false - function _close() - { - if ($this->transCnt) $this->RollbackTrans(); - $rez = @sqlsrv_close($this->_connectionID); - $this->_connectionID = false; - return $rez; - } - - // mssql uses a default date like Dec 30 2000 12:00AM - static function UnixDate($v) - { - return ADORecordSet_array_mssql::UnixDate($v); - } - - static function UnixTimeStamp($v) - { - return ADORecordSet_array_mssql::UnixTimeStamp($v); - } - - function &MetaIndexes($table,$primary=false) - { - $table = $this->qstr($table); - - $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, - CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, - CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique - FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id - INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid - INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid - WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table - ORDER BY O.name, I.Name, K.keyno"; - - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - $rs = $this->Execute($sql); - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - if (!is_object($rs)) { - return FALSE; - } - - $indexes = array(); - while ($row = $rs->FetchRow()) { - if (!$primary && $row[5]) continue; - - $indexes[$row[0]]['unique'] = $row[6]; - $indexes[$row[0]]['columns'][] = $row[1]; - } - return $indexes; - } - - function MetaForeignKeys($table, $owner=false, $upper=false) - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $table = $this->qstr(strtoupper($table)); - - $sql = - "select object_name(constid) as constraint_name, - col_name(fkeyid, fkey) as column_name, - object_name(rkeyid) as referenced_table_name, - col_name(rkeyid, rkey) as referenced_column_name - from sysforeignkeys - where upper(object_name(fkeyid)) = $table - order by constraint_name, referenced_table_name, keyno"; - - $constraints =& $this->GetArray($sql); - - $ADODB_FETCH_MODE = $save; - - $arr = false; - foreach($constraints as $constr) { - //print_r($constr); - $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; - } - if (!$arr) return false; - - $arr2 = false; - - foreach($arr as $k => $v) { - foreach($v as $a => $b) { - if ($upper) $a = strtoupper($a); - $arr2[$a] = $b; - } - } - return $arr2; - } - - //From: Fernando Moreira - function MetaDatabases() - { - $this->SelectDB("master"); - $rs =& $this->Execute($this->metaDatabasesSQL); - $rows = $rs->GetRows(); - $ret = array(); - for($i=0;$iSelectDB($this->database); - if($ret) - return $ret; - else - return false; - } - - // "Stein-Aksel Basma" - // tested with MSSQL 2000 - function &MetaPrimaryKeys($table) - { - global $ADODB_FETCH_MODE; - - $schema = ''; - $this->_findschema($table,$schema); - if (!$schema) $schema = $this->database; - if ($schema) $schema = "and k.table_catalog like '$schema%'"; - - $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, - information_schema.table_constraints tc - where tc.constraint_name = k.constraint_name and tc.constraint_type = - 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $a = $this->GetCol($sql); - $ADODB_FETCH_MODE = $savem; - - if ($a && sizeof($a)>0) return $a; - $false = false; - return $false; - } - - - function &MetaTables($ttype=false,$showSchema=false,$mask=false) - { - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr(($mask)); - $this->metaTablesSQL .= " AND name like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_mssqlnative extends ADORecordSet { - - var $databaseType = "mssqlnative"; - var $canSeek = false; - var $fieldOffset = 0; - // _mths works only in non-localised system - - function ADORecordset_mssqlnative($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - - } - $this->fetchMode = $mode; - return $this->ADORecordSet($id,$mode); - } - - - function _initrs() - { - global $ADODB_COUNTRECS; - if ($this->connection->debug) error_log("(before) ADODB_COUNTRECS: {$ADODB_COUNTRECS} _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}"); - /*$retRowsAff = sqlsrv_rows_affected($this->_queryID);//"If you need to determine the number of rows a query will return before retrieving the actual results, appending a SELECT COUNT ... query would let you get that information, and then a call to next_result would move you to the "real" results." - error_log("rowsaff: ".serialize($retRowsAff)); - $this->_numOfRows = ($ADODB_COUNTRECS)? $retRowsAff:-1;*/ - $this->_numOfRows = -1;//not supported - $fieldmeta = sqlsrv_field_metadata($this->_queryID); - $this->_numOfFields = ($fieldmeta)? count($fieldmeta):-1; - if ($this->connection->debug) error_log("(after) _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}"); - } - - - //Contributed by "Sven Axelsson" - // get next resultset - requires PHP 4.0.5 or later - function NextRecordSet() - { - if (!sqlsrv_next_result($this->_queryID)) return false; - $this->_inited = false; - $this->bind = false; - $this->_currentRow = -1; - $this->Init(); - return true; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode != ADODB_FETCH_NUM) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - /* Returns: an object containing field information. - Get column information in the Recordset object. fetchField() can be used in order to obtain information about - fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by - fetchField() is retrieved. */ - - function &FetchField($fieldOffset = -1) - { - $_typeConversion = array( - -155 => 'datetimeoffset', - -154 => 'time', - -152 => 'xml', - -151 => 'udt', - -11 => 'uniqueidentifier', - -10 => 'ntext', - -9 => 'nvarchar', - -8 => 'nchar', - -7 => 'bit', - -6 => 'tinyint', - -5 => 'bigint', - -4 => 'image', - -3 => 'varbinary', - -2 => 'timestamp', - -1 => 'text', - 1 => 'char', - 2 => 'numeric', - 3 => 'decimal', - 4 => 'int', - 5 => 'smallint', - 6 => 'float', - 7 => 'real', - 12 => 'varchar', - 91 => 'date', - 93 => 'datetime' - ); - - $fa = @sqlsrv_field_metadata($this->_queryID); - if ($fieldOffset != -1) { - $fa = $fa[$fieldOffset]; - } - $false = false; - if (empty($fa)) { - $f = false;//PHP Notice: Only variable references should be returned by reference - } - else - { - // Convert to an object - $fa = array_change_key_case($fa, CASE_LOWER); - $fb = array(); - if ($fieldOffset != -1) - { - $fb = array( - 'name' => $fa['name'], - 'max_length' => $fa['size'], - 'column_source' => $fa['name'], - 'type' => $_typeConversion[$fa['type']] - ); - } - else - { - foreach ($fa as $key => $value) - { - $fb[] = array( - 'name' => $value['name'], - 'max_length' => $value['size'], - 'column_source' => $value['name'], - 'type' => $_typeConversion[$value['type']] - ); - } - } - $f = (object) $fb; - } - return $f; - } - - - function _seek($row) - { - return false;//There is no support for cursors in the driver at this time. All data is returned via forward-only streams. - } - - // speedup - function MoveNext() - { - if ($this->connection->debug) error_log("movenext()"); - //if ($this->connection->debug) error_log("eof (beginning): ".$this->EOF); - if ($this->EOF) return false; - - $this->_currentRow++; - if ($this->connection->debug) error_log("_currentRow: ".$this->_currentRow); - - if ($this->_fetch()) return true; - $this->EOF = true; - //if ($this->connection->debug) error_log("eof (end): ".$this->EOF); - - return false; - } - - - // INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4 - // also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot! - function _fetch($ignore_fields=false) - { - if ($this->connection->debug) error_log("_fetch()"); - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - if ($this->fetchMode & ADODB_FETCH_NUM) { - if ($this->connection->debug) error_log("fetch mode: both"); - $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_BOTH); - } else { - if ($this->connection->debug) error_log("fetch mode: assoc"); - $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_ASSOC); - } - - if (ADODB_ASSOC_CASE == 0) { - foreach($this->fields as $k=>$v) { - $this->fields[strtolower($k)] = $v; - } - } else if (ADODB_ASSOC_CASE == 1) { - foreach($this->fields as $k=>$v) { - $this->fields[strtoupper($k)] = $v; - } - } - } else { - if ($this->connection->debug) error_log("fetch mode: num"); - $this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_NUMERIC); - } - if(is_array($this->fields) && array_key_exists(1,$this->fields) && !array_key_exists(0,$this->fields)) {//fix fetch numeric keys since they're not 0 based - $arrFixed = array(); - foreach($this->fields as $key=>$value) { - if(is_numeric($key)) { - $arrFixed[$key-1] = $value; - } else { - $arrFixed[$key] = $value; - } - } - //if($this->connection->debug) error_log("
        fixing non 0 based return array, old: ".print_r($this->fields,true)." new: ".print_r($arrFixed,true)); - $this->fields = $arrFixed; - } - if(is_array($this->fields)) { - foreach($this->fields as $key=>$value) { - if (is_object($value) && method_exists($value, 'format')) {//is DateTime object - $this->fields[$key] = $value->format("Y-m-d H:i:s"); - } - } - } - if($this->fields === null) $this->fields = false; - if ($this->connection->debug) error_log("
        after _fetch, fields:
        ".print_r($this->fields,true)." backtrace: ".adodb_backtrace(false));
        -        return $this->fields;
        -    }
        -
        -    /*	close() only needs to be called if you are worried about using too much memory while your script
        -     is running. All associated result memory for the specified result identifier will automatically be freed.	*/
        -    function _close()
        -    {
        -        $rez = sqlsrv_free_stmt($this->_queryID);
        -        $this->_queryID = false;
        -        return $rez;
        -    }
        -
        -    // mssql uses a default date like Dec 30 2000 12:00AM
        -    static function UnixDate($v)
        -    {
        -        return ADORecordSet_array_mssqlnative::UnixDate($v);
        -    }
        -
        -    static function UnixTimeStamp($v)
        -    {
        -        return ADORecordSet_array_mssqlnative::UnixTimeStamp($v);
        -    }
        -}
        -
        -
        -class ADORecordSet_array_mssqlnative extends ADORecordSet_array {
        -    function ADORecordSet_array_mssqlnative($id=-1,$mode=false)
        -    {
        -        $this->ADORecordSet_array($id,$mode);
        -    }
        -
        -    // mssql uses a default date like Dec 30 2000 12:00AM
        -    static function UnixDate($v)
        -    {
        -
        -        if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v);
        -
        -        global $ADODB_mssql_mths,$ADODB_mssql_date_order;
        -
        -        //Dec 30 2000 12:00AM
        -        if ($ADODB_mssql_date_order == 'dmy') {
        -            if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
        -                return parent::UnixDate($v);
        -            }
        -            if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
        -
        -            $theday = $rr[1];
        -            $themth =  substr(strtoupper($rr[2]),0,3);
        -        } else {
        -            if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
        -                return parent::UnixDate($v);
        -            }
        -            if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
        -
        -            $theday = $rr[2];
        -            $themth = substr(strtoupper($rr[1]),0,3);
        -        }
        -        $themth = $ADODB_mssql_mths[$themth];
        -        if ($themth <= 0) return false;
        -        // h-m-s-MM-DD-YY
        -        return  mktime(0,0,0,$themth,$theday,$rr[3]);
        -    }
        -
        -    static function UnixTimeStamp($v)
        -    {
        -
        -        if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v);
        -
        -        global $ADODB_mssql_mths,$ADODB_mssql_date_order;
        -
        -        //Dec 30 2000 12:00AM
        -        if ($ADODB_mssql_date_order == 'dmy') {
        -            if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
        -            ,$v, $rr)) return parent::UnixTimeStamp($v);
        -            if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
        -
        -            $theday = $rr[1];
        -            $themth =  substr(strtoupper($rr[2]),0,3);
        -        } else {
        -            if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
        -            ,$v, $rr)) return parent::UnixTimeStamp($v);
        -            if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
        -
        -            $theday = $rr[2];
        -            $themth = substr(strtoupper($rr[1]),0,3);
        -        }
        -
        -        $themth = $ADODB_mssql_mths[$themth];
        -        if ($themth <= 0) return false;
        -
        -        switch (strtoupper($rr[6])) {
        -            case 'P':
        -                if ($rr[4]<12) $rr[4] += 12;
        -                break;
        -            case 'A':
        -                if ($rr[4]==12) $rr[4] = 0;
        -                break;
        -            default:
        -                break;
        -        }
        -        // h-m-s-MM-DD-YY
        -        return  mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]);
        -    }
        -}
        -
        -/*
        - Code Example 1:
        -
        - select 	object_name(constid) as constraint_name,
        - object_name(fkeyid) as table_name,
        - col_name(fkeyid, fkey) as column_name,
        - object_name(rkeyid) as referenced_table_name,
        - col_name(rkeyid, rkey) as referenced_column_name
        - from sysforeignkeys
        - where object_name(fkeyid) = x
        - order by constraint_name, table_name, referenced_table_name,  keyno
        -
        - Code Example 2:
        - select 	constraint_name,
        - column_name,
        - ordinal_position
        - from information_schema.key_column_usage
        - where constraint_catalog = db_name()
        - and table_name = x
        - order by constraint_name, ordinal_position
        -
        - http://www.databasejournal.com/scripts/article.php/1440551
        - */
        -
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/drivers/adodb-mssqlpo.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-mssqlpo.inc.php
        deleted file mode 100644
        index 69176e04..00000000
        --- a/include/limesurvey/classes/adodb/drivers/adodb-mssqlpo.inc.php
        +++ /dev/null
        @@ -1,62 +0,0 @@
        -_has_mssql_init) {
        -            ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0");
        -            return $sql;
        -        }
        -        if (is_string($sql)) $sql = str_replace('||','+',$sql);
        -        $stmt = mssql_init($sql,$this->_connectionID);
        -        if (!$stmt)  return $sql;
        -        return array($sql,$stmt);
        -    }
        -
        -    function _query($sql,$inputarr=false)
        -    {
        -        if (is_string($sql)) $sql = str_replace('||','+',$sql);
        -        return ADODB_mssql::_query($sql,$inputarr);
        -    }
        -}
        -
        -class ADORecordset_mssqlpo extends ADORecordset_mssql {
        -    var $databaseType = "mssqlpo";
        -    function ADORecordset_mssqlpo($id,$mode=false)
        -    {
        -        $this->ADORecordset_mssql($id,$mode);
        -    }
        -}
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/drivers/adodb-mysql.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-mysql.inc.php
        deleted file mode 100644
        index d4b00bbb..00000000
        --- a/include/limesurvey/classes/adodb/drivers/adodb-mysql.inc.php
        +++ /dev/null
        @@ -1,794 +0,0 @@
        -rsPrefix .= 'ext_';
        -        }
        -
        -        function ServerInfo()
        -        {
        -            $arr['description'] = ADOConnection::GetOne("select version()");
        -            $arr['version'] = ADOConnection::_findvers($arr['description']);
        -            return $arr;
        -        }
        -
        -        function IfNull( $field, $ifNull )
        -        {
        -            return " IFNULL($field, $ifNull) "; // if MySQL
        -        }
        -
        -
        -        function MetaTables($ttype=false,$showSchema=false,$mask=false)
        -        {
        -            $save = $this->metaTablesSQL;
        -            if ($showSchema && is_string($showSchema)) {
        -                $this->metaTablesSQL .= " from $showSchema";
        -            }
        -
        -            if ($mask) {
        -                $mask = $this->qstr($mask);
        -                $this->metaTablesSQL .= " like $mask";
        -            }
        -            $ret = ADOConnection::MetaTables($ttype,$showSchema);
        -
        -            $this->metaTablesSQL = $save;
        -            return $ret;
        -        }
        -
        -
        -        function MetaIndexes ($table, $primary = FALSE, $owner=false)
        -        {
        -            // save old fetch mode
        -            global $ADODB_FETCH_MODE;
        -
        -            $false = false;
        -            $save = $ADODB_FETCH_MODE;
        -            $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        -            if ($this->fetchMode !== FALSE) {
        -                $savem = $this->SetFetchMode(FALSE);
        -            }
        -
        -            // get index details
        -            $rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table));
        -
        -            // restore fetchmode
        -            if (isset($savem)) {
        -                $this->SetFetchMode($savem);
        -            }
        -            $ADODB_FETCH_MODE = $save;
        -
        -            if (!is_object($rs)) {
        -                return $false;
        -            }
        -
        -            $indexes = array ();
        -
        -            // parse index data into array
        -            while ($row = $rs->FetchRow()) {
        -                if ($primary == FALSE AND $row[2] == 'PRIMARY') {
        -                    continue;
        -                }
        -
        -                if (!isset($indexes[$row[2]])) {
        -                    $indexes[$row[2]] = array(
        -                                'unique' => ($row[1] == 0),
        -                                'columns' => array()
        -                    );
        -                }
        -
        -                $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
        -            }
        -
        -            // sort columns by order in the index
        -            foreach ( array_keys ($indexes) as $index )
        -            {
        -                ksort ($indexes[$index]['columns']);
        -            }
        -
        -            return $indexes;
        -        }
        -
        -
        -        // if magic quotes disabled, use mysql_real_escape_string()
        -        function qstr($s,$magic_quotes=false)
        -        {
        -            if (is_null($s)) return 'NULL';
        -            if (!$magic_quotes) {
        -
        -                if (ADODB_PHPVER >= 0x4300) {
        -                    if (is_resource($this->_connectionID))
        -                    return "'".mysql_real_escape_string($s,$this->_connectionID)."'";
        -                }
        -                if ($this->replaceQuote[0] == '\\'){
        -                    $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
        -                }
        -                return  "'".str_replace("'",$this->replaceQuote,$s)."'";
        -            }
        -
        -            // undo magic quotes for "
        -            $s = str_replace('\\"','"',$s);
        -            return "'$s'";
        -        }
        -
        -        function _insertid()
        -        {
        -            return ADOConnection::GetOne('SELECT LAST_INSERT_ID()');
        -            //return mysql_insert_id($this->_connectionID);
        -        }
        -
        -        function GetOne($sql,$inputarr=false)
        -        {
        -            if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) {
        -                $rs = $this->SelectLimit($sql,1,-1,$inputarr);
        -                if ($rs) {
        -                    $rs->Close();
        -                    if ($rs->EOF) return null;
        -                    return reset($rs->fields);
        -                }
        -            } else {
        -                return ADOConnection::GetOne($sql,$inputarr);
        -            }
        -            return false;
        -        }
        -
        -        function BeginTrans()
        -        {
        -            if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
        -        }
        -
        -        function _affectedrows()
        -        {
        -            return mysql_affected_rows($this->_connectionID);
        -        }
        -
        -        // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
        -        // Reference on Last_Insert_ID on the recommended way to simulate sequences
        -        var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
        -        var $_genSeqSQL = "create table %s (id int not null)";
        -        var $_genSeqCountSQL = "select count(*) from %s";
        -        var $_genSeq2SQL = "insert into %s values (%s)";
        -        var $_dropSeqSQL = "drop table %s";
        -
        -        function CreateSequence($seqname='adodbseq',$startID=1)
        -        {
        -            if (empty($this->_genSeqSQL)) return false;
        -            $u = strtoupper($seqname);
        -
        -            $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
        -            if (!$ok) return false;
        -            return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
        -        }
        -
        -
        -        function GenID($seqname='adodbseq',$startID=1)
        -        {
        -            // post-nuke sets hasGenID to false
        -            if (!$this->hasGenID) return false;
        -
        -            $savelog = $this->_logsql;
        -            $this->_logsql = false;
        -            $getnext = sprintf($this->_genIDSQL,$seqname);
        -            $holdtransOK = $this->_transOK; // save the current status
        -            $rs = @$this->Execute($getnext);
        -            if (!$rs) {
        -                if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
        -                $u = strtoupper($seqname);
        -                $this->Execute(sprintf($this->_genSeqSQL,$seqname));
        -                $cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname));
        -                if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
        -                $rs = $this->Execute($getnext);
        -            }
        -
        -            if ($rs) {
        -                $this->genID = mysql_insert_id($this->_connectionID);
        -                $rs->Close();
        -            } else
        -            $this->genID = 0;
        -
        -            $this->_logsql = $savelog;
        -            return $this->genID;
        -        }
        -
        -        function MetaDatabases()
        -        {
        -            $qid = mysql_list_dbs($this->_connectionID);
        -            $arr = array();
        -            $i = 0;
        -            $max = mysql_num_rows($qid);
        -            while ($i < $max) {
        -                $db = mysql_tablename($qid,$i);
        -                if ($db != 'mysql') $arr[] = $db;
        -                $i += 1;
        -            }
        -            return $arr;
        -        }
        -
        -
        -        // Format date column in sql string given an input format that understands Y M D
        -        function SQLDate($fmt, $col=false)
        -        {
        -            if (!$col) $col = $this->sysTimeStamp;
        -            $s = 'DATE_FORMAT('.$col.",'";
        -            $concat = false;
        -            $len = strlen($fmt);
        -            for ($i=0; $i < $len; $i++) {
        -                $ch = $fmt[$i];
        -                switch($ch) {
        -
        -                    default:
        -                        if ($ch == '\\') {
        -                            $i++;
        -                            $ch = substr($fmt,$i,1);
        -                        }
        -                        /** FALL THROUGH */
        -                    case '-':
        -                    case '/':
        -                        $s .= $ch;
        -                        break;
        -
        -                    case 'Y':
        -                    case 'y':
        -                        $s .= '%Y';
        -                        break;
        -                    case 'M':
        -                        $s .= '%b';
        -                        break;
        -
        -                    case 'm':
        -                        $s .= '%m';
        -                        break;
        -                    case 'D':
        -                    case 'd':
        -                        $s .= '%d';
        -                        break;
        -                         
        -                    case 'Q':
        -                    case 'q':
        -                        $s .= "'),Quarter($col)";
        -
        -                        if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
        -                        else $s .= ",('";
        -                        $concat = true;
        -                        break;
        -                         
        -                    case 'H':
        -                        $s .= '%H';
        -                        break;
        -
        -                    case 'h':
        -                        $s .= '%I';
        -                        break;
        -
        -                    case 'i':
        -                        $s .= '%i';
        -                        break;
        -
        -                    case 's':
        -                        $s .= '%s';
        -                        break;
        -
        -                    case 'a':
        -                    case 'A':
        -                        $s .= '%p';
        -                        break;
        -
        -                    case 'w':
        -                        $s .= '%w';
        -                        break;
        -
        -                    case 'W':
        -                        $s .= '%U';
        -                        break;
        -
        -                    case 'l':
        -                        $s .= '%W';
        -                        break;
        -                }
        -            }
        -            $s.="')";
        -            if ($concat) $s = "CONCAT($s)";
        -            return $s;
        -        }
        -
        -
        -        // returns concatenated string
        -        // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
        -        function Concat()
        -        {
        -            $s = "";
        -            $arr = func_get_args();
        -
        -            // suggestion by andrew005@mnogo.ru
        -            $s = implode(',',$arr);
        -            if (strlen($s) > 0) return "CONCAT($s)";
        -            else return '';
        -        }
        -
        -        function OffsetDate($dayFraction,$date=false)
        -        {
        -            if (!$date) $date = $this->sysDate;
        -
        -            $fraction = $dayFraction * 24 * 3600;
        -            return '('. $date . ' + INTERVAL ' .	 $fraction.' SECOND)';
        -
        -            //		return "from_unixtime(unix_timestamp($date)+$fraction)";
        -        }
        -
        -        // returns true or false
        -        function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
        -        {
        -            if (!empty($this->port)) $argHostname .= ":".$this->port;
        -
        -            if (ADODB_PHPVER >= 0x4300)
        -            $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
        -            $this->forceNewConnect,$this->clientFlags);
        -            else if (ADODB_PHPVER >= 0x4200)
        -            $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
        -            $this->forceNewConnect);
        -            else
        -            $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword);
        -
        -            if ($this->_connectionID === false) return false;
        -            if ($argDatabasename) return $this->SelectDB($argDatabasename);
        -            return true;
        -        }
        -
        -        // returns true or false
        -        function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
        -        {
        -            if (!empty($this->port)) $argHostname .= ":".$this->port;
        -
        -            if (ADODB_PHPVER >= 0x4300)
        -            $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);
        -            else
        -            $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword);
        -            if ($this->_connectionID === false) return false;
        -            if ($this->autoRollback) $this->RollbackTrans();
        -            if ($argDatabasename) return $this->SelectDB($argDatabasename);
        -            return true;
        -        }
        -
        -        function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
        -        {
        -            $this->forceNewConnect = true;
        -            return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
        -        }
        -
        -        function MetaColumns($table, $normalize=true)
        -        {
        -            $this->_findschema($table,$schema);
        -            if ($schema) {
        -                $dbName = $this->database;
        -                $this->SelectDB($schema);
        -            }
        -            global $ADODB_FETCH_MODE;
        -            $save = $ADODB_FETCH_MODE;
        -            $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        -
        -            if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
        -            $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
        -
        -            if ($schema) {
        -                $this->SelectDB($dbName);
        -            }
        -
        -            if (isset($savem)) $this->SetFetchMode($savem);
        -            $ADODB_FETCH_MODE = $save;
        -            if (!is_object($rs)) {
        -                $false = false;
        -                return $false;
        -            }
        -
        -            $retarr = array();
        -            while (!$rs->EOF){
        -                $fld = new ADOFieldObject();
        -                $fld->name = $rs->fields[0];
        -                $type = $rs->fields[1];
        -                 
        -                // split type into type(length):
        -                $fld->scale = null;
        -                if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
        -                    $fld->type = $query_array[1];
        -                    $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
        -                    $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
        -                } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
        -                    $fld->type = $query_array[1];
        -                    $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
        -                } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
        -                    $fld->type = $query_array[1];
        -                    $arr = explode(",",$query_array[2]);
        -                    $fld->enums = $arr;
        -                    $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
        -                    $fld->max_length = ($zlen > 0) ? $zlen : 1;
        -                } else {
        -                    $fld->type = $type;
        -                    $fld->max_length = -1;
        -                }
        -                $fld->not_null = ($rs->fields[2] != 'YES');
        -                $fld->primary_key = ($rs->fields[3] == 'PRI');
        -                $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
        -                $fld->binary = (strpos($type,'blob') !== false || strpos($type,'binary') !== false);
        -                $fld->unsigned = (strpos($type,'unsigned') !== false);
        -                $fld->zerofill = (strpos($type,'zerofill') !== false);
        -
        -                if (!$fld->binary) {
        -                    $d = $rs->fields[4];
        -                    if ($d != '' && $d != 'NULL') {
        -                        $fld->has_default = true;
        -                        $fld->default_value = $d;
        -                    } else {
        -                        $fld->has_default = false;
        -                    }
        -                }
        -                 
        -                if ($save == ADODB_FETCH_NUM) {
        -                    $retarr[] = $fld;
        -                } else {
        -                    $retarr[strtoupper($fld->name)] = $fld;
        -                }
        -                $rs->MoveNext();
        -            }
        -
        -            $rs->Close();
        -            return $retarr;
        -        }
        -
        -        // returns true or false
        -        function SelectDB($dbName)
        -        {
        -            $this->database = $dbName;
        -            $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
        -            if ($this->_connectionID) {
        -                return @mysql_select_db($dbName,$this->_connectionID);
        -            }
        -            else return false;
        -        }
        -
        -        // parameters use PostgreSQL convention, not MySQL
        -        function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
        -        {
        -            $offsetStr =($offset>=0) ? ((integer)$offset)."," : '';
        -            // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
        -            if ($nrows < 0) $nrows = '18446744073709551615';
        -
        -            if ($secs)
        -            $rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
        -            else
        -            $rs = $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
        -            return $rs;
        -        }
        -
        -        // returns queryID or false
        -        function _query($sql,$inputarr=false)
        -        {
        -            //global $ADODB_COUNTRECS;
        -            //if($ADODB_COUNTRECS)
        -            return mysql_query($sql,$this->_connectionID);
        -            //else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6
        -        }
        -
        -        /*	Returns: the last error message from previous database operation	*/
        -        function ErrorMsg()
        -        {
        -
        -            if ($this->_logsql) return $this->_errorMsg;
        -            if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error();
        -            else $this->_errorMsg = @mysql_error($this->_connectionID);
        -            return $this->_errorMsg;
        -        }
        -
        -        /*	Returns: the last error number from previous database operation	*/
        -        function ErrorNo()
        -        {
        -            if ($this->_logsql) return $this->_errorCode;
        -            if (empty($this->_connectionID))  return @mysql_errno();
        -            else return @mysql_errno($this->_connectionID);
        -        }
        -
        -        // returns true or false
        -        function _close()
        -        {
        -            @mysql_close($this->_connectionID);
        -            $this->_connectionID = false;
        -        }
        -
        -
        -        /*
        -         * Maximum size of C field
        -         */
        -        function CharMax()
        -        {
        -            return 255;
        -        }
        -
        -        /*
        -         * Maximum size of X field
        -         */
        -        function TextMax()
        -        {
        -            return 4294967295;
        -        }
        -
        -        // "Innox - Juan Carlos Gonzalez" 
        -        function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
        -        {
        -            global $ADODB_FETCH_MODE;
        -            if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true;
        -
        -            if ( !empty($owner) ) {
        -                $table = "$owner.$table";
        -            }
        -            $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
        -            if ($associative) {
        -                $create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"];
        -            } else $create_sql  = $a_create_table[1];
        -
        -            $matches = array();
        -
        -            if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
        -            $foreign_keys = array();
        -            $num_keys = count($matches[0]);
        -            for ( $i = 0;  $i < $num_keys;  $i ++ ) {
        -                $my_field  = explode('`, `', $matches[1][$i]);
        -                $ref_table = $matches[2][$i];
        -                $ref_field = explode('`, `', $matches[3][$i]);
        -
        -                if ( $upper ) {
        -                    $ref_table = strtoupper($ref_table);
        -                }
        -
        -                // see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976
        -                if (!isset($foreign_keys[$ref_table])) {
        -                    $foreign_keys[$ref_table] = array();
        -                }
        -                $num_fields = count($my_field);
        -                for ( $j = 0;  $j < $num_fields;  $j ++ ) {
        -                    if ( $associative ) {
        -                        $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
        -                    } else {
        -                        $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
        -                    }
        -                }
        -            }
        -
        -            return  $foreign_keys;
        -        }
        -
        -
        -    }
        -
        -    /*--------------------------------------------------------------------------------------
        -     Class Name: Recordset
        -     --------------------------------------------------------------------------------------*/
        -
        -
        -    class ADORecordSet_mysql extends ADORecordSet{
        -
        -        var $databaseType = "mysql";
        -        var $canSeek = true;
        -
        -        function ADORecordSet_mysql($queryID,$mode=false)
        -        {
        -            if ($mode === false) {
        -                global $ADODB_FETCH_MODE;
        -                $mode = $ADODB_FETCH_MODE;
        -            }
        -            switch ($mode)
        -            {
        -                case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
        -                case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
        -                case ADODB_FETCH_DEFAULT:
        -                case ADODB_FETCH_BOTH:
        -                default:
        -                    $this->fetchMode = MYSQL_BOTH; break;
        -            }
        -            $this->adodbFetchMode = $mode;
        -            $this->ADORecordSet($queryID);
        -        }
        -
        -        function _initrs()
        -        {
        -            //GLOBAL $ADODB_COUNTRECS;
        -            //	$this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1;
        -            $this->_numOfRows = @mysql_num_rows($this->_queryID);
        -            $this->_numOfFields = @mysql_num_fields($this->_queryID);
        -        }
        -
        -        function FetchField($fieldOffset = -1)
        -        {
        -            if ($fieldOffset != -1) {
        -                $o = @mysql_fetch_field($this->_queryID, $fieldOffset);
        -                $f = @mysql_field_flags($this->_queryID,$fieldOffset);
        -                if ($o) $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com)
        -                //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
        -                if ($o) $o->binary = (strpos($f,'binary')!== false);
        -            }
        -            else if ($fieldOffset == -1) {	/*	The $fieldOffset argument is not provided thus its -1 	*/
        -                $o = @mysql_fetch_field($this->_queryID);
        -                if ($o) $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com)
        -                //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
        -            }
        -
        -            return $o;
        -        }
        -
        -        function GetRowAssoc($upper=true)
        -        {
        -            if ($this->fetchMode == MYSQL_ASSOC && !$upper) $row = $this->fields;
        -            else $row = ADORecordSet::GetRowAssoc($upper);
        -            return $row;
        -        }
        -
        -        /* Use associative array to get fields array */
        -        function Fields($colname)
        -        {
        -            // added @ by "Michael William Miller" 
        -            if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname];
        -
        -            if (!$this->bind) {
        -                $this->bind = array();
        -                for ($i=0; $i < $this->_numOfFields; $i++) {
        -                    $o = $this->FetchField($i);
        -                    $this->bind[strtoupper($o->name)] = $i;
        -                }
        -            }
        -            return $this->fields[$this->bind[strtoupper($colname)]];
        -        }
        -
        -        function _seek($row)
        -        {
        -            if ($this->_numOfRows == 0) return false;
        -            return @mysql_data_seek($this->_queryID,$row);
        -        }
        -
        -        function MoveNext()
        -        {
        -            //return adodb_movenext($this);
        -            //if (defined('ADODB_EXTENSION')) return adodb_movenext($this);
        -            if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
        -                $this->_currentRow += 1;
        -                return true;
        -            }
        -            if (!$this->EOF) {
        -                $this->_currentRow += 1;
        -                $this->EOF = true;
        -            }
        -            return false;
        -        }
        -
        -        function _fetch()
        -        {
        -            $this->fields =  @mysql_fetch_array($this->_queryID,$this->fetchMode);
        -            return is_array($this->fields);
        -        }
        -
        -        function _close() {
        -            @mysql_free_result($this->_queryID);
        -            $this->_queryID = false;
        -        }
        -
        -        function MetaType($t,$len=-1,$fieldobj=false)
        -        {
        -            if (is_object($t)) {
        -                $fieldobj = $t;
        -                $t = $fieldobj->type;
        -                $len = $fieldobj->max_length;
        -            }
        -
        -            $len = -1; // mysql max_length is not accurate
        -            switch (strtoupper($t)) {
        -                case 'STRING':
        -                case 'CHAR':
        -                case 'VARCHAR':
        -                case 'TINYBLOB':
        -                case 'TINYTEXT':
        -                case 'ENUM':
        -                case 'SET':
        -                    if ($len <= $this->blobSize) return 'C';
        -
        -                case 'TEXT':
        -                case 'LONGTEXT':
        -                case 'MEDIUMTEXT':
        -                    return 'X';
        -
        -                    // php_mysql extension always returns 'blob' even if 'text'
        -                    // so we have to check whether binary...
        -                case 'IMAGE':
        -                case 'LONGBLOB':
        -                case 'BLOB':
        -                case 'MEDIUMBLOB':
        -                case 'BINARY':
        -                    return !empty($fieldobj->binary) ? 'B' : 'X';
        -
        -                case 'YEAR':
        -                case 'DATE': return 'D';
        -
        -                case 'TIME':
        -                case 'DATETIME':
        -                case 'TIMESTAMP': return 'T';
        -
        -                case 'INT':
        -                case 'INTEGER':
        -                case 'BIGINT':
        -                case 'TINYINT':
        -                case 'MEDIUMINT':
        -                case 'SMALLINT':
        -
        -                    if (!empty($fieldobj->primary_key)) return 'R';
        -                    else return 'I';
        -
        -                default: return 'N';
        -            }
        -        }
        -
        -    }
        -
        -    class ADORecordSet_ext_mysql extends ADORecordSet_mysql {
        -        function ADORecordSet_ext_mysql($queryID,$mode=false)
        -        {
        -            if ($mode === false) {
        -                global $ADODB_FETCH_MODE;
        -                $mode = $ADODB_FETCH_MODE;
        -            }
        -            switch ($mode)
        -            {
        -                case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
        -                case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
        -                case ADODB_FETCH_DEFAULT:
        -                case ADODB_FETCH_BOTH:
        -                default:
        -                    $this->fetchMode = MYSQL_BOTH; break;
        -            }
        -            $this->adodbFetchMode = $mode;
        -            $this->ADORecordSet($queryID);
        -        }
        -
        -        function MoveNext()
        -        {
        -            return @adodb_movenext($this);
        -        }
        -    }
        -
        -
        -}
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/drivers/adodb-mysqli.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-mysqli.inc.php
        deleted file mode 100644
        index 4e00abca..00000000
        --- a/include/limesurvey/classes/adodb/drivers/adodb-mysqli.inc.php
        +++ /dev/null
        @@ -1,1211 +0,0 @@
        -_transmode  = $transaction_mode;
        -            if (empty($transaction_mode)) {
        -                $this->Execute('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ');
        -                return;
        -            }
        -            if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
        -            $this->Execute("SET SESSION TRANSACTION ".$transaction_mode);
        -        }
        -
        -        // returns true or false
        -        // To add: parameter int $port,
        -        //         parameter string $socket
        -        function _connect($argHostname = NULL,
        -        $argUsername = NULL,
        -        $argPassword = NULL,
        -        $argDatabasename = NULL, $persist=false)
        -        {
        -            if(!extension_loaded("mysqli")) {
        -                return null;
        -            }
        -            $this->_connectionID = @mysqli_init();
        -
        -            if (is_null($this->_connectionID)) {
        -                // mysqli_init only fails if insufficient memory
        -                if ($this->debug)
        -                ADOConnection::outp("mysqli_init() failed : "  . $this->ErrorMsg());
        -                return false;
        -            }
        -            /*
        -             I suggest a simple fix which would enable adodb and mysqli driver to
        -             read connection options from the standard mysql configuration file
        -             /etc/my.cnf - "Bastien Duclaux" 
        -             */
        -            foreach($this->optionFlags as $arr) {
        -                mysqli_options($this->_connectionID,$arr[0],$arr[1]);
        -            }
        -
        -            #if (!empty($this->port)) $argHostname .= ":".$this->port;
        -            $ok = mysqli_real_connect($this->_connectionID,
        -            $argHostname,
        -            $argUsername,
        -            $argPassword,
        -            $argDatabasename,
        -            $this->port,
        -            $this->socket,
        -            $this->clientFlags);
        -
        -            if ($ok) {
        -                if ($argDatabasename)  return $this->SelectDB($argDatabasename);
        -                return true;
        -            } else {
        -                if ($this->debug)
        -                ADOConnection::outp("Could't connect : "  . $this->ErrorMsg());
        -                $this->_connectionID = null;
        -                return false;
        -            }
        -        }
        -
        -        // returns true or false
        -        // How to force a persistent connection
        -        function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
        -        {
        -            return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true);
        -
        -        }
        -
        -        // When is this used? Close old connection first?
        -        // In _connect(), check $this->forceNewConnect?
        -        function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
        -        {
        -            $this->forceNewConnect = true;
        -            return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
        -        }
        -
        -        function IfNull( $field, $ifNull )
        -        {
        -            return " IFNULL($field, $ifNull) "; // if MySQL
        -        }
        -
        -        // do not use $ADODB_COUNTRECS
        -        function GetOne($sql,$inputarr=false)
        -        {
        -            global $ADODB_GETONE_EOF;
        -            $ret = false;
        -            $rs = $this->Execute($sql,$inputarr);
        -            if ($rs) {
        -                $rs->Close();
        -                if ($rs->EOF) return $ADODB_GETONE_EOF;
        -                return reset($rs->fields);
        -            }
        -            return $ret;
        -        }
        -
        -        function ServerInfo()
        -        {
        -            $arr['description'] = $this->GetOne("select version()");
        -            $arr['version'] = ADOConnection::_findvers($arr['description']);
        -            return $arr;
        -        }
        -
        -
        -        function BeginTrans()
        -        {
        -            if ($this->transOff) return true;
        -            $this->transCnt += 1;
        -
        -            //$this->Execute('SET AUTOCOMMIT=0');
        -            mysqli_autocommit($this->_connectionID, false);
        -            $this->Execute('BEGIN');
        -            return true;
        -        }
        -
        -        function CommitTrans($ok=true)
        -        {
        -            if ($this->transOff) return true;
        -            if (!$ok) return $this->RollbackTrans();
        -
        -            if ($this->transCnt) $this->transCnt -= 1;
        -            $this->Execute('COMMIT');
        -
        -            //$this->Execute('SET AUTOCOMMIT=1');
        -            mysqli_autocommit($this->_connectionID, true);
        -            return true;
        -        }
        -
        -        function RollbackTrans()
        -        {
        -            if ($this->transOff) return true;
        -            if ($this->transCnt) $this->transCnt -= 1;
        -            $this->Execute('ROLLBACK');
        -            //$this->Execute('SET AUTOCOMMIT=1');
        -            mysqli_autocommit($this->_connectionID, true);
        -            return true;
        -        }
        -
        -        function RowLock($tables,$where='',$col='1 as adodb_ignore')
        -        {
        -            if ($this->transCnt==0) $this->BeginTrans();
        -            if ($where) $where = ' where '.$where;
        -            $rs = $this->Execute("select $col from $tables $where for update");
        -            return !empty($rs);
        -        }
        -
        -        // if magic quotes disabled, use mysql_real_escape_string()
        -        // From readme.htm:
        -        // Quotes a string to be sent to the database. The $magic_quotes_enabled
        -        // parameter may look funny, but the idea is if you are quoting a
        -        // string extracted from a POST/GET variable, then
        -        // pass get_magic_quotes_gpc() as the second parameter. This will
        -        // ensure that the variable is not quoted twice, once by qstr and once
        -        // by the magic_quotes_gpc.
        -        //
        -        //Eg. $s = $db->qstr(_GET['name'],get_magic_quotes_gpc());
        -        function qstr($s, $magic_quotes = false)
        -        {
        -            if (is_null($s)) return 'NULL';
        -            if (!$magic_quotes) {
        -                if (PHP_VERSION >= 5)
        -                return "'" . mysqli_real_escape_string($this->_connectionID, $s) . "'";
        -                 
        -                if ($this->replaceQuote[0] == '\\')
        -                $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
        -                return  "'".str_replace("'",$this->replaceQuote,$s)."'";
        -            }
        -            // undo magic quotes for "
        -            $s = str_replace('\\"','"',$s);
        -            return "'$s'";
        -        }
        -
        -        function _insertid()
        -        {
        -            $result = @mysqli_insert_id($this->_connectionID);
        -            if ($result == -1){
        -                if ($this->debug) ADOConnection::outp("mysqli_insert_id() failed : "  . $this->ErrorMsg());
        -            }
        -            return $result;
        -        }
        -
        -        // Only works for INSERT, UPDATE and DELETE query's
        -        function _affectedrows()
        -        {
        -            $result =  @mysqli_affected_rows($this->_connectionID);
        -            if ($result == -1) {
        -                if ($this->debug) ADOConnection::outp("mysqli_affected_rows() failed : "  . $this->ErrorMsg());
        -            }
        -            return $result;
        -        }
        -
        -        // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
        -        // Reference on Last_Insert_ID on the recommended way to simulate sequences
        -        var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
        -        var $_genSeqSQL = "create table %s (id int not null)";
        -        var $_genSeqCountSQL = "select count(*) from %s";
        -        var $_genSeq2SQL = "insert into %s values (%s)";
        -        var $_dropSeqSQL = "drop table %s";
        -
        -        function CreateSequence($seqname='adodbseq',$startID=1)
        -        {
        -            if (empty($this->_genSeqSQL)) return false;
        -            $u = strtoupper($seqname);
        -
        -            $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
        -            if (!$ok) return false;
        -            return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
        -        }
        -
        -        function GenID($seqname='adodbseq',$startID=1)
        -        {
        -            // post-nuke sets hasGenID to false
        -            if (!$this->hasGenID) return false;
        -
        -            $getnext = sprintf($this->_genIDSQL,$seqname);
        -            $holdtransOK = $this->_transOK; // save the current status
        -            $rs = @$this->Execute($getnext);
        -            if (!$rs) {
        -                if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
        -                $u = strtoupper($seqname);
        -                $this->Execute(sprintf($this->_genSeqSQL,$seqname));
        -                $cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname));
        -                if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
        -                $rs = $this->Execute($getnext);
        -            }
        -
        -            if ($rs) {
        -                $this->genID = mysqli_insert_id($this->_connectionID);
        -                $rs->Close();
        -            } else
        -            $this->genID = 0;
        -
        -            return $this->genID;
        -        }
        -
        -        function MetaDatabases()
        -        {
        -            $query = "SHOW DATABASES";
        -            $ret = $this->Execute($query);
        -            if ($ret && is_object($ret)){
        -                $arr = array();
        -                while (!$ret->EOF){
        -                    $db = $ret->Fields('Database');
        -                    if ($db != 'mysql') $arr[] = $db;
        -                    $ret->MoveNext();
        -                }
        -                return $arr;
        -            }
        -            return $ret;
        -        }
        -
        -         
        -        function MetaIndexes ($table, $primary = FALSE)
        -        {
        -            // save old fetch mode
        -            global $ADODB_FETCH_MODE;
        -
        -            $false = false;
        -            $save = $ADODB_FETCH_MODE;
        -            $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        -            if ($this->fetchMode !== FALSE) {
        -                $savem = $this->SetFetchMode(FALSE);
        -            }
        -
        -            // get index details
        -            $rs = $this->Execute(sprintf('SHOW INDEXES FROM %s',$table));
        -
        -            // restore fetchmode
        -            if (isset($savem)) {
        -                $this->SetFetchMode($savem);
        -            }
        -            $ADODB_FETCH_MODE = $save;
        -
        -            if (!is_object($rs)) {
        -                return $false;
        -            }
        -
        -            $indexes = array ();
        -
        -            // parse index data into array
        -            while ($row = $rs->FetchRow()) {
        -                if ($primary == FALSE AND $row[2] == 'PRIMARY') {
        -                    continue;
        -                }
        -
        -                if (!isset($indexes[$row[2]])) {
        -                    $indexes[$row[2]] = array(
        -		                        'unique' => ($row[1] == 0),
        -		                        'columns' => array()
        -                    );
        -                }
        -
        -                $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
        -            }
        -
        -            // sort columns by order in the index
        -            foreach ( array_keys ($indexes) as $index )
        -            {
        -                ksort ($indexes[$index]['columns']);
        -            }
        -
        -            return $indexes;
        -        }
        -
        -
        -        // Format date column in sql string given an input format that understands Y M D
        -        function SQLDate($fmt, $col=false)
        -        {
        -            if (!$col) $col = $this->sysTimeStamp;
        -            $s = 'DATE_FORMAT('.$col.",'";
        -            $concat = false;
        -            $len = strlen($fmt);
        -            for ($i=0; $i < $len; $i++) {
        -                $ch = $fmt[$i];
        -                switch($ch) {
        -                    case 'Y':
        -                    case 'y':
        -                        $s .= '%Y';
        -                        break;
        -                    case 'Q':
        -                    case 'q':
        -                        $s .= "'),Quarter($col)";
        -
        -                        if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
        -                        else $s .= ",('";
        -                        $concat = true;
        -                        break;
        -                    case 'M':
        -                        $s .= '%b';
        -                        break;
        -
        -                    case 'm':
        -                        $s .= '%m';
        -                        break;
        -                    case 'D':
        -                    case 'd':
        -                        $s .= '%d';
        -                        break;
        -                         
        -                    case 'H':
        -                        $s .= '%H';
        -                        break;
        -
        -                    case 'h':
        -                        $s .= '%I';
        -                        break;
        -
        -                    case 'i':
        -                        $s .= '%i';
        -                        break;
        -
        -                    case 's':
        -                        $s .= '%s';
        -                        break;
        -
        -                    case 'a':
        -                    case 'A':
        -                        $s .= '%p';
        -                        break;
        -                         
        -                    case 'w':
        -                        $s .= '%w';
        -                        break;
        -
        -                    case 'l':
        -                        $s .= '%W';
        -                        break;
        -
        -                    default:
        -
        -                        if ($ch == '\\') {
        -                            $i++;
        -                            $ch = substr($fmt,$i,1);
        -                        }
        -                        $s .= $ch;
        -                        break;
        -                }
        -            }
        -            $s.="')";
        -            if ($concat) $s = "CONCAT($s)";
        -            return $s;
        -        }
        -
        -        // returns concatenated string
        -        // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
        -        function Concat()
        -        {
        -            $s = "";
        -            $arr = func_get_args();
        -
        -            // suggestion by andrew005@mnogo.ru
        -            $s = implode(',',$arr);
        -            if (strlen($s) > 0) return "CONCAT($s)";
        -            else return '';
        -        }
        -
        -        // dayFraction is a day in floating point
        -        function OffsetDate($dayFraction,$date=false)
        -        {
        -            if (!$date) $date = $this->sysDate;
        -
        -            $fraction = $dayFraction * 24 * 3600;
        -            return $date . ' + INTERVAL ' .	 $fraction.' SECOND';
        -
        -            //		return "from_unixtime(unix_timestamp($date)+$fraction)";
        -        }
        -
        -        function MetaTables($ttype=false,$showSchema=false,$mask=false)
        -        {
        -            $save = $this->metaTablesSQL;
        -            if ($showSchema && is_string($showSchema)) {
        -                $this->metaTablesSQL .= " from $showSchema";
        -            }
        -
        -            if ($mask) {
        -                $mask = $this->qstr($mask);
        -                $this->metaTablesSQL .= " like $mask";
        -            }
        -            $ret = ADOConnection::MetaTables($ttype,$showSchema);
        -
        -            $this->metaTablesSQL = $save;
        -            return $ret;
        -        }
        -
        -        // "Innox - Juan Carlos Gonzalez" 
        -        function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
        -        {
        -            global $ADODB_FETCH_MODE;
        -
        -            if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true;
        -
        -            if ( !empty($owner) ) {
        -                $table = "$owner.$table";
        -            }
        -            $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
        -            if ($associative) {
        -                $create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"];
        -            } else $create_sql  = $a_create_table[1];
        -
        -            $matches = array();
        -
        -            if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
        -            $foreign_keys = array();
        -            $num_keys = count($matches[0]);
        -            for ( $i = 0;  $i < $num_keys;  $i ++ ) {
        -                $my_field  = explode('`, `', $matches[1][$i]);
        -                $ref_table = $matches[2][$i];
        -                $ref_field = explode('`, `', $matches[3][$i]);
        -
        -                if ( $upper ) {
        -                    $ref_table = strtoupper($ref_table);
        -                }
        -
        -                // see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976
        -                if (!isset($foreign_keys[$ref_table])) {
        -                    $foreign_keys[$ref_table] = array();
        -                }
        -                $num_fields = count($my_field);
        -                for ( $j = 0;  $j < $num_fields;  $j ++ ) {
        -                    if ( $associative ) {
        -                        $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
        -                    } else {
        -                        $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
        -                    }
        -                }
        -            }
        -
        -            return  $foreign_keys;
        -        }
        -
        -        function MetaColumns($table, $normalize=true)
        -        {
        -            $false = false;
        -            if (!$this->metaColumnsSQL)
        -            return $false;
        -
        -            global $ADODB_FETCH_MODE;
        -            $save = $ADODB_FETCH_MODE;
        -            $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
        -            if ($this->fetchMode !== false)
        -            $savem = $this->SetFetchMode(false);
        -            $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
        -            if (isset($savem)) $this->SetFetchMode($savem);
        -            $ADODB_FETCH_MODE = $save;
        -            if (!is_object($rs))
        -            return $false;
        -
        -            $retarr = array();
        -            while (!$rs->EOF) {
        -                $fld = new ADOFieldObject();
        -                $fld->name = $rs->fields[0];
        -                $type = $rs->fields[1];
        -                 
        -                // split type into type(length):
        -                $fld->scale = null;
        -                if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
        -                    $fld->type = $query_array[1];
        -                    $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
        -                    $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
        -                } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
        -                    $fld->type = $query_array[1];
        -                    $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
        -                } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
        -                    $fld->type = $query_array[1];
        -                    $arr = explode(",",$query_array[2]);
        -                    $fld->enums = $arr;
        -                    $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
        -                    $fld->max_length = ($zlen > 0) ? $zlen : 1;
        -                } else {
        -                    $fld->type = $type;
        -                    $fld->max_length = -1;
        -                }
        -                $fld->not_null = ($rs->fields[2] != 'YES');
        -                $fld->primary_key = ($rs->fields[3] == 'PRI');
        -                $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
        -                $fld->binary = (strpos($type,'blob') !== false);
        -                $fld->unsigned = (strpos($type,'unsigned') !== false);
        -                $fld->zerofill = (strpos($type,'zerofill') !== false);
        -
        -                if (!$fld->binary) {
        -                    $d = $rs->fields[4];
        -                    if ($d != '' && $d != 'NULL') {
        -                        $fld->has_default = true;
        -                        $fld->default_value = $d;
        -                    } else {
        -                        $fld->has_default = false;
        -                    }
        -                }
        -                 
        -                if ($save == ADODB_FETCH_NUM) {
        -                    $retarr[] = $fld;
        -                } else {
        -                    $retarr[strtoupper($fld->name)] = $fld;
        -                }
        -                $rs->MoveNext();
        -            }
        -
        -            $rs->Close();
        -            return $retarr;
        -        }
        -
        -        // returns true or false
        -        function SelectDB($dbName)
        -        {
        -            //	    $this->_connectionID = $this->mysqli_resolve_link($this->_connectionID);
        -            $this->database = $dbName;
        -            $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
        -
        -            if ($this->_connectionID) {
        -                $result = @mysqli_select_db($this->_connectionID, $dbName);
        -                if (!$result) {
        -                    ADOConnection::outp("Select of database " . $dbName . " failed. " . $this->ErrorMsg());
        -                }
        -                return $result;
        -            }
        -            return false;
        -        }
        -
        -        // parameters use PostgreSQL convention, not MySQL
        -        function SelectLimit($sql,
        -        $nrows = -1,
        -        $offset = -1,
        -        $inputarr = false,
        -        $secs = 0)
        -        {
        -            $offsetStr = ($offset >= 0) ? "$offset," : '';
        -            if ($nrows < 0) $nrows = '18446744073709551615';
        -
        -            if ($secs)
        -            $rs = $this->CacheExecute($secs, $sql . " LIMIT $offsetStr$nrows" , $inputarr );
        -            else
        -            $rs = $this->Execute($sql . " LIMIT $offsetStr$nrows" , $inputarr );
        -
        -            return $rs;
        -        }
        -
        -
        -        function Prepare($sql)
        -        {
        -            return $sql;
        -            $stmt = $this->_connectionID->prepare($sql);
        -            if (!$stmt) {
        -                echo $this->ErrorMsg();
        -                return $sql;
        -            }
        -            return array($sql,$stmt);
        -        }
        -
        -
        -        // returns queryID or false
        -        function _query($sql, $inputarr)
        -        {
        -            global $ADODB_COUNTRECS;
        -            // Move to the next recordset, or return false if there is none. In a stored proc
        -            // call, mysqli_next_result returns true for the last "recordset", but mysqli_store_result
        -            // returns false. I think this is because the last "recordset" is actually just the
        -            // return value of the stored proc (ie the number of rows affected).
        -            // Commented out for reasons of performance. You should retrieve every recordset yourself.
        -            //	if (!mysqli_next_result($this->connection->_connectionID))	return false;
        -
        -            if (is_array($sql)) {
        -
        -                // Prepare() not supported because mysqli_stmt_execute does not return a recordset, but
        -                // returns as bound variables.
        -
        -                $stmt = $sql[1];
        -                $a = '';
        -                foreach($inputarr as $k => $v) {
        -                    if (is_string($v)) $a .= 's';
        -                    else if (is_integer($v)) $a .= 'i';
        -                    else $a .= 'd';
        -                }
        -                 
        -                $fnarr = array_merge( array($stmt,$a) , $inputarr);
        -                $ret = call_user_func_array('mysqli_stmt_bind_param',$fnarr);
        -                $ret = mysqli_stmt_execute($stmt);
        -                return $ret;
        -            }
        -
        -            /*
        -             if (!$mysql_res =  mysqli_query($this->_connectionID, $sql, ($ADODB_COUNTRECS) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT)) {
        -             if ($this->debug) ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg());
        -             return false;
        -             }
        -
        -             return $mysql_res;
        -             */
        -
        -            if ($this->multiQuery) {
        -                $rs = mysqli_multi_query($this->_connectionID, $sql.';');
        -                if ($rs) {
        -                    $rs = ($ADODB_COUNTRECS) ? @mysqli_store_result( $this->_connectionID ) : @mysqli_use_result( $this->_connectionID );
        -                    return $rs ? $rs : true; // mysqli_more_results( $this->_connectionID )
        -                }
        -            } else {
        -                $rs = mysqli_query($this->_connectionID, $sql, $ADODB_COUNTRECS ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT);
        -
        -                if ($rs) return $rs;
        -            }
        -
        -            if($this->debug)
        -            ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg());
        -
        -            return false;
        -
        -        }
        -
        -        /*	Returns: the last error message from previous database operation	*/
        -        function ErrorMsg()
        -        {
        -            if (empty($this->_connectionID))
        -            $this->_errorMsg = @mysqli_connect_error();
        -            else
        -            $this->_errorMsg = @mysqli_error($this->_connectionID);
        -            return $this->_errorMsg;
        -        }
        -
        -        /*	Returns: the last error number from previous database operation	*/
        -        function ErrorNo()
        -        {
        -            if (empty($this->_connectionID))
        -            return @mysqli_connect_errno();
        -            else
        -            return @mysqli_errno($this->_connectionID);
        -        }
        -
        -        // returns true or false
        -        function _close()
        -        {
        -            @mysqli_close($this->_connectionID);
        -            $this->_connectionID = false;
        -        }
        -
        -        /*
        -         * Maximum size of C field
        -         */
        -        function CharMax()
        -        {
        -            return 255;
        -        }
        -
        -        /*
        -         * Maximum size of X field
        -         */
        -        function TextMax()
        -        {
        -            return 4294967295;
        -        }
        -
        -
        -
        -        // this is a set of functions for managing client encoding - very important if the encodings
        -        // of your database and your output target (i.e. HTML) don't match
        -        // for instance, you may have UTF8 database and server it on-site as latin1 etc.
        -        // GetCharSet - get the name of the character set the client is using now
        -        // Under Windows, the functions should work with MySQL 4.1.11 and above, the set of charsets supported
        -        // depends on compile flags of mysql distribution
        -
        -        function GetCharSet()
        -        {
        -            //we will use ADO's builtin property charSet
        -            if (!method_exists($this->_connectionID,'character_set_name'))
        -            return false;
        -
        -            $this->charSet = @$this->_connectionID->character_set_name();
        -            if (!$this->charSet) {
        -                return false;
        -            } else {
        -                return $this->charSet;
        -            }
        -        }
        -
        -        // SetCharSet - switch the client encoding
        -        function SetCharSet($charset_name)
        -        {
        -            if (!method_exists($this->_connectionID,'set_charset'))
        -            return false;
        -
        -            if ($this->charSet !== $charset_name) {
        -                $if = @$this->_connectionID->set_charset($charset_name);
        -                if ($if == "0" & $this->GetCharSet() == $charset_name) {
        -                    return true;
        -                } else return false;
        -            } else return true;
        -        }
        -
        -
        -
        -
        -    }
        -
        -    /*--------------------------------------------------------------------------------------
        -     Class Name: Recordset
        -     --------------------------------------------------------------------------------------*/
        -
        -    class ADORecordSet_mysqli extends ADORecordSet{
        -
        -        var $databaseType = "mysqli";
        -        var $canSeek = true;
        -
        -        function ADORecordSet_mysqli($queryID, $mode = false)
        -        {
        -            if ($mode === false)
        -            {
        -                global $ADODB_FETCH_MODE;
        -                $mode = $ADODB_FETCH_MODE;
        -            }
        -
        -            switch ($mode)
        -            {
        -                case ADODB_FETCH_NUM:
        -                    $this->fetchMode = MYSQLI_NUM;
        -                    break;
        -                case ADODB_FETCH_ASSOC:
        -                    $this->fetchMode = MYSQLI_ASSOC;
        -                    break;
        -                case ADODB_FETCH_DEFAULT:
        -                case ADODB_FETCH_BOTH:
        -                default:
        -                    $this->fetchMode = MYSQLI_BOTH;
        -                    break;
        -            }
        -            $this->adodbFetchMode = $mode;
        -            $this->ADORecordSet($queryID);
        -        }
        -
        -        function _initrs()
        -        {
        -            global $ADODB_COUNTRECS;
        -
        -            $this->_numOfRows = $ADODB_COUNTRECS ? @mysqli_num_rows($this->_queryID) : -1;
        -            $this->_numOfFields = @mysqli_num_fields($this->_queryID);
        -        }
        -
        -        /*
        -         1      = MYSQLI_NOT_NULL_FLAG
        -         2      = MYSQLI_PRI_KEY_FLAG
        -         4      = MYSQLI_UNIQUE_KEY_FLAG
        -         8      = MYSQLI_MULTIPLE_KEY_FLAG
        -         16     = MYSQLI_BLOB_FLAG
        -         32     = MYSQLI_UNSIGNED_FLAG
        -         64     = MYSQLI_ZEROFILL_FLAG
        -         128    = MYSQLI_BINARY_FLAG
        -         256    = MYSQLI_ENUM_FLAG
        -         512    = MYSQLI_AUTO_INCREMENT_FLAG
        -         1024   = MYSQLI_TIMESTAMP_FLAG
        -         2048   = MYSQLI_SET_FLAG
        -         32768  = MYSQLI_NUM_FLAG
        -         16384  = MYSQLI_PART_KEY_FLAG
        -         32768  = MYSQLI_GROUP_FLAG
        -         65536  = MYSQLI_UNIQUE_FLAG
        -         131072 = MYSQLI_BINCMP_FLAG
        -         */
        -
        -        function FetchField($fieldOffset = -1)
        -        {
        -            $fieldnr = $fieldOffset;
        -            if ($fieldOffset != -1) {
        -                $fieldOffset = @mysqli_field_seek($this->_queryID, $fieldnr);
        -            }
        -            $o = @mysqli_fetch_field($this->_queryID);
        -            if (!$o) return false;
        -            /* Properties of an ADOFieldObject as set by MetaColumns */
        -            $o->primary_key = $o->flags & MYSQLI_PRI_KEY_FLAG;
        -            $o->not_null = $o->flags & MYSQLI_NOT_NULL_FLAG;
        -            $o->auto_increment = $o->flags & MYSQLI_AUTO_INCREMENT_FLAG;
        -            $o->binary = $o->flags & MYSQLI_BINARY_FLAG;
        -            // $o->blob = $o->flags & MYSQLI_BLOB_FLAG; /* not returned by MetaColumns */
        -            $o->unsigned = $o->flags & MYSQLI_UNSIGNED_FLAG;
        -
        -            return $o;
        -        }
        -
        -        function GetRowAssoc($upper = true)
        -        {
        -            if ($this->fetchMode == MYSQLI_ASSOC && !$upper)
        -            return $this->fields;
        -            $row = ADORecordSet::GetRowAssoc($upper);
        -            return $row;
        -        }
        -
        -        /* Use associative array to get fields array */
        -        function Fields($colname)
        -        {
        -            if ($this->fetchMode != MYSQLI_NUM)
        -            return @$this->fields[$colname];
        -
        -            if (!$this->bind) {
        -                $this->bind = array();
        -                for ($i = 0; $i < $this->_numOfFields; $i++) {
        -                    $o = $this->FetchField($i);
        -                    $this->bind[strtoupper($o->name)] = $i;
        -                }
        -            }
        -            return $this->fields[$this->bind[strtoupper($colname)]];
        -        }
        -
        -        function _seek($row)
        -        {
        -            if ($this->_numOfRows == 0)
        -            return false;
        -
        -            if ($row < 0)
        -            return false;
        -
        -            mysqli_data_seek($this->_queryID, $row);
        -            $this->EOF = false;
        -            return true;
        -        }
        -
        -
        -        function NextRecordSet()
        -        {
        -            global $ADODB_COUNTRECS;
        -
        -            mysqli_free_result($this->_queryID);
        -            $this->_queryID = -1;
        -            // Move to the next recordset, or return false if there is none. In a stored proc
        -            // call, mysqli_next_result returns true for the last "recordset", but mysqli_store_result
        -            // returns false. I think this is because the last "recordset" is actually just the
        -            // return value of the stored proc (ie the number of rows affected).
        -            if(!mysqli_next_result($this->connection->_connectionID)) {
        -                return false;
        -            }
        -            // CD: There is no $this->_connectionID variable, at least in the ADO version I'm using
        -            $this->_queryID = ($ADODB_COUNTRECS) ? @mysqli_store_result( $this->connection->_connectionID )
        -            : @mysqli_use_result( $this->connection->_connectionID );
        -            if(!$this->_queryID) {
        -                return false;
        -            }
        -            $this->_inited = false;
        -            $this->bind = false;
        -            $this->_currentRow = -1;
        -            $this->Init();
        -            return true;
        -        }
        -
        -        // 10% speedup to move MoveNext to child class
        -        // This is the only implementation that works now (23-10-2003).
        -        // Other functions return no or the wrong results.
        -        function MoveNext()
        -        {
        -            if ($this->EOF) return false;
        -            $this->_currentRow++;
        -            $this->fields = @mysqli_fetch_array($this->_queryID,$this->fetchMode);
        -
        -            if (is_array($this->fields)) return true;
        -            $this->EOF = true;
        -            return false;
        -        }
        -
        -        function _fetch()
        -        {
        -            $this->fields = mysqli_fetch_array($this->_queryID,$this->fetchMode);
        -            return is_array($this->fields);
        -        }
        -
        -        function _close()
        -        {
        -            //if results are attached to this pointer from Stored Proceedure calls, the next standard query will die 2014
        -            //only a problem with persistant connections
        -
        -            //mysqli_next_result($this->connection->_connectionID); trashes the DB side attached results.
        -
        -            while(mysqli_more_results($this->connection->_connectionID)){
        -                @mysqli_next_result($this->connection->_connectionID);
        -            }
        -
        -            //Because you can have one attached result, without tripping mysqli_more_results
        -            @mysqli_next_result($this->connection->_connectionID);
        -
        -
        -            mysqli_free_result($this->_queryID);
        -            $this->_queryID = false;
        -        }
        -
        -        /*
        -
        -        0 = MYSQLI_TYPE_DECIMAL
        -        1 = MYSQLI_TYPE_CHAR
        -        1 = MYSQLI_TYPE_TINY
        -        2 = MYSQLI_TYPE_SHORT
        -        3 = MYSQLI_TYPE_LONG
        -        4 = MYSQLI_TYPE_FLOAT
        -        5 = MYSQLI_TYPE_DOUBLE
        -        6 = MYSQLI_TYPE_NULL
        -        7 = MYSQLI_TYPE_TIMESTAMP
        -        8 = MYSQLI_TYPE_LONGLONG
        -        9 = MYSQLI_TYPE_INT24
        -        10 = MYSQLI_TYPE_DATE
        -        11 = MYSQLI_TYPE_TIME
        -        12 = MYSQLI_TYPE_DATETIME
        -        13 = MYSQLI_TYPE_YEAR
        -        14 = MYSQLI_TYPE_NEWDATE
        -        247 = MYSQLI_TYPE_ENUM
        -        248 = MYSQLI_TYPE_SET
        -        249 = MYSQLI_TYPE_TINY_BLOB
        -        250 = MYSQLI_TYPE_MEDIUM_BLOB
        -        251 = MYSQLI_TYPE_LONG_BLOB
        -        252 = MYSQLI_TYPE_BLOB
        -        253 = MYSQLI_TYPE_VAR_STRING
        -        254 = MYSQLI_TYPE_STRING
        -        255 = MYSQLI_TYPE_GEOMETRY
        -        */
        -
        -        function MetaType($t, $len = -1, $fieldobj = false)
        -        {
        -            if (is_object($t)) {
        -                $fieldobj = $t;
        -                $t = $fieldobj->type;
        -                $len = $fieldobj->max_length;
        -            }
        -
        -
        -            $len = -1; // mysql max_length is not accurate
        -            switch (strtoupper($t)) {
        -                case 'STRING':
        -                case 'CHAR':
        -                case 'VARCHAR':
        -                case 'TINYBLOB':
        -                case 'TINYTEXT':
        -                case 'ENUM':
        -                case 'SET':
        -
        -                case MYSQLI_TYPE_TINY_BLOB :
        -                    #case MYSQLI_TYPE_CHAR :
        -                case MYSQLI_TYPE_STRING :
        -                case MYSQLI_TYPE_ENUM :
        -                case MYSQLI_TYPE_SET :
        -                case 253 :
        -                    if ($len <= $this->blobSize) return 'C';
        -
        -                case 'TEXT':
        -                case 'LONGTEXT':
        -                case 'MEDIUMTEXT':
        -                    return 'X';
        -
        -
        -                    // php_mysql extension always returns 'blob' even if 'text'
        -                    // so we have to check whether binary...
        -                case 'IMAGE':
        -                case 'LONGBLOB':
        -                case 'BLOB':
        -                case 'MEDIUMBLOB':
        -
        -                case MYSQLI_TYPE_BLOB :
        -                case MYSQLI_TYPE_LONG_BLOB :
        -                case MYSQLI_TYPE_MEDIUM_BLOB :
        -
        -                    return !empty($fieldobj->binary) ? 'B' : 'X';
        -                case 'YEAR':
        -                case 'DATE':
        -                case MYSQLI_TYPE_DATE :
        -                case MYSQLI_TYPE_YEAR :
        -
        -                    return 'D';
        -
        -                case 'TIME':
        -                case 'DATETIME':
        -                case 'TIMESTAMP':
        -
        -                case MYSQLI_TYPE_DATETIME :
        -                case MYSQLI_TYPE_NEWDATE :
        -                case MYSQLI_TYPE_TIME :
        -                case MYSQLI_TYPE_TIMESTAMP :
        -
        -                    return 'T';
        -
        -                case 'INT':
        -                case 'INTEGER':
        -                case 'BIGINT':
        -                case 'TINYINT':
        -                case 'MEDIUMINT':
        -                case 'SMALLINT':
        -
        -                case MYSQLI_TYPE_INT24 :
        -                case MYSQLI_TYPE_LONG :
        -                case MYSQLI_TYPE_LONGLONG :
        -                case MYSQLI_TYPE_SHORT :
        -                case MYSQLI_TYPE_TINY :
        -
        -                    if (!empty($fieldobj->primary_key)) return 'R';
        -
        -                    return 'I';
        -
        -
        -                    // Added floating-point types
        -                    // Maybe not necessery.
        -                case 'FLOAT':
        -                case 'DOUBLE':
        -                    //		case 'DOUBLE PRECISION':
        -                case 'DECIMAL':
        -                case 'DEC':
        -                case 'FIXED':
        -                default:
        -                    //if (!is_numeric($t)) echo "

        --- Error in type matching $t -----

        "; - return 'N'; - } - } // function - - - } // rs class - -} - -class ADORecordSet_array_mysqli extends ADORecordSet_array { - - function ADORecordSet_array_mysqli($id=-1,$mode=false) - { - $this->ADORecordSet_array($id,$mode); - } - - function MetaType($t, $len = -1, $fieldobj = false) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - - - $len = -1; // mysql max_length is not accurate - switch (strtoupper($t)) { - case 'STRING': - case 'CHAR': - case 'VARCHAR': - case 'TINYBLOB': - case 'TINYTEXT': - case 'ENUM': - case 'SET': - - case MYSQLI_TYPE_TINY_BLOB : - #case MYSQLI_TYPE_CHAR : - case MYSQLI_TYPE_STRING : - case MYSQLI_TYPE_ENUM : - case MYSQLI_TYPE_SET : - case 253 : - if ($len <= $this->blobSize) return 'C'; - - case 'TEXT': - case 'LONGTEXT': - case 'MEDIUMTEXT': - return 'X'; - - - // php_mysql extension always returns 'blob' even if 'text' - // so we have to check whether binary... - case 'IMAGE': - case 'LONGBLOB': - case 'BLOB': - case 'MEDIUMBLOB': - - case MYSQLI_TYPE_BLOB : - case MYSQLI_TYPE_LONG_BLOB : - case MYSQLI_TYPE_MEDIUM_BLOB : - - return !empty($fieldobj->binary) ? 'B' : 'X'; - case 'YEAR': - case 'DATE': - case MYSQLI_TYPE_DATE : - case MYSQLI_TYPE_YEAR : - - return 'D'; - - case 'TIME': - case 'DATETIME': - case 'TIMESTAMP': - - case MYSQLI_TYPE_DATETIME : - case MYSQLI_TYPE_NEWDATE : - case MYSQLI_TYPE_TIME : - case MYSQLI_TYPE_TIMESTAMP : - - return 'T'; - - case 'INT': - case 'INTEGER': - case 'BIGINT': - case 'TINYINT': - case 'MEDIUMINT': - case 'SMALLINT': - - case MYSQLI_TYPE_INT24 : - case MYSQLI_TYPE_LONG : - case MYSQLI_TYPE_LONGLONG : - case MYSQLI_TYPE_SHORT : - case MYSQLI_TYPE_TINY : - - if (!empty($fieldobj->primary_key)) return 'R'; - - return 'I'; - - - // Added floating-point types - // Maybe not necessery. - case 'FLOAT': - case 'DOUBLE': - // case 'DOUBLE PRECISION': - case 'DECIMAL': - case 'DEC': - case 'FIXED': - default: - //if (!is_numeric($t)) echo "

        --- Error in type matching $t -----

        "; - return 'N'; - } - } // function - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-mysqlpo.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-mysqlpo.inc.php deleted file mode 100644 index 4b41ffb9..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-mysqlpo.inc.php +++ /dev/null @@ -1,138 +0,0 @@ - - - Requires mysql client. Works on Windows and Unix. - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php"); - - -class ADODB_mysqlt extends ADODB_mysql { - var $databaseType = 'mysqlt'; - var $ansiOuter = true; // for Version 3.23.17 or later - var $hasTransactions = true; - var $autoRollback = true; // apparently mysql does not autorollback properly - - function ADODB_mysqlt() - { - global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_'; - } - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - $this->Execute('SET AUTOCOMMIT=0'); - $this->Execute('BEGIN'); - return true; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - - if ($this->transCnt) $this->transCnt -= 1; - $this->Execute('COMMIT'); - $this->Execute('SET AUTOCOMMIT=1'); - return true; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->Execute('ROLLBACK'); - $this->Execute('SET AUTOCOMMIT=1'); - return true; - } - - function RowLock($tables,$where='',$col='1 as adodb_ignore') - { - if ($this->transCnt==0) $this->BeginTrans(); - if ($where) $where = ' where '.$where; - $rs = $this->Execute("select $col from $tables $where for update"); - return !empty($rs); - } - -} - -class ADORecordSet_mysqlt extends ADORecordSet_mysql{ - var $databaseType = "mysqlt"; - - function ADORecordSet_mysqlt($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - - switch ($mode) - { - case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; - case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; - - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH: - default: $this->fetchMode = MYSQL_BOTH; break; - } - - $this->adodbFetchMode = $mode; - $this->ADORecordSet($queryID); - } - - function MoveNext() - { - if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { - $this->_currentRow += 1; - return true; - } - if (!$this->EOF) { - $this->_currentRow += 1; - $this->EOF = true; - } - return false; - } -} - -class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt { - - function ADORecordSet_ext_mysqlt($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; - case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; - - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH: - default: - $this->fetchMode = MYSQL_BOTH; break; - } - $this->adodbFetchMode = $mode; - $this->ADORecordSet($queryID); - } - - function MoveNext() - { - return adodb_movenext($this); - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-mysqlt.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-mysqlt.inc.php deleted file mode 100644 index 1d1fc628..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-mysqlt.inc.php +++ /dev/null @@ -1,155 +0,0 @@ - - - Requires mysql client. Works on Windows and Unix. - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php"); - - -class ADODB_mysqlt extends ADODB_mysql { - var $databaseType = 'mysqlt'; - var $ansiOuter = true; // for Version 3.23.17 or later - var $hasTransactions = true; - var $autoRollback = true; // apparently mysql does not autorollback properly - - function ADODB_mysqlt() - { - global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_'; - } - - /* set transaction mode - - SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL - { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } - - */ - function SetTransactionMode( $transaction_mode ) - { - $this->_transmode = $transaction_mode; - if (empty($transaction_mode)) { - $this->Execute('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ'); - return; - } - if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; - $this->Execute("SET SESSION TRANSACTION ".$transaction_mode); - } - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - $this->Execute('SET AUTOCOMMIT=0'); - $this->Execute('BEGIN'); - return true; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - - if ($this->transCnt) $this->transCnt -= 1; - $ok = $this->Execute('COMMIT'); - $this->Execute('SET AUTOCOMMIT=1'); - return $ok ? true : false; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $ok = $this->Execute('ROLLBACK'); - $this->Execute('SET AUTOCOMMIT=1'); - return $ok ? true : false; - } - - function RowLock($tables,$where='',$col='1 as adodb_ignore') - { - if ($this->transCnt==0) $this->BeginTrans(); - if ($where) $where = ' where '.$where; - $rs = $this->Execute("select $col from $tables $where for update"); - return !empty($rs); - } - -} - -class ADORecordSet_mysqlt extends ADORecordSet_mysql{ - var $databaseType = "mysqlt"; - - function ADORecordSet_mysqlt($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - - switch ($mode) - { - case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; - case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; - - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH: - default: $this->fetchMode = MYSQL_BOTH; break; - } - - $this->adodbFetchMode = $mode; - $this->ADORecordSet($queryID); - } - - function MoveNext() - { - if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { - $this->_currentRow += 1; - return true; - } - if (!$this->EOF) { - $this->_currentRow += 1; - $this->EOF = true; - } - return false; - } -} - -class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt { - - function ADORecordSet_ext_mysqlt($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; - case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; - - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH: - default: - $this->fetchMode = MYSQL_BOTH; break; - } - $this->adodbFetchMode = $mode; - $this->ADORecordSet($queryID); - } - - function MoveNext() - { - return adodb_movenext($this); - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-netezza.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-netezza.inc.php deleted file mode 100644 index ed8828ce..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-netezza.inc.php +++ /dev/null @@ -1,170 +0,0 @@ - 0 ORDER BY attnum"; - var $metaColumnsSQL1 = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum"; - // netezza doesn't have keys. it does have distributions, so maybe this is - // something that can be pulled from the system tables - var $metaKeySQL = ""; - var $hasAffectedRows = true; - var $hasLimit = true; - var $true = 't'; // string that represents TRUE for a database - var $false = 'f'; // string that represents FALSE for a database - var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database - var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt. - var $ansiOuter = true; - var $autoRollback = true; // apparently pgsql does not autorollback properly before 4.3.4 - // http://bugs.php.net/bug.php?id=25404 - - - function ADODB_netezza() - { - - } - - function MetaColumns($table,$upper=true) - { - - // Changed this function to support Netezza which has no concept of keys - // could posisbly work on other things from the system table later. - - global $ADODB_FETCH_MODE; - - $table = strtolower($table); - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - - $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if ($rs === false) return false; - - $retarr = array(); - while (!$rs->EOF) { - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - - // since we're returning type and length as one string, - // split them out here. - - if ($first = strstr($rs->fields[1], "(")) { - $fld->max_length = trim($first, "()"); - } else { - $fld->max_length = -1; - } - - if ($first = strpos($rs->fields[1], "(")) { - $fld->type = substr($rs->fields[1], 0, $first); - } else { - $fld->type = $rs->fields[1]; - } - - switch ($fld->type) { - case "byteint": - case "boolean": - $fld->max_length = 1; - break; - case "smallint": - $fld->max_length = 2; - break; - case "integer": - case "numeric": - case "date": - $fld->max_length = 4; - break; - case "bigint": - case "time": - case "timestamp": - $fld->max_length = 8; - break; - case "timetz": - case "time with time zone": - $fld->max_length = 12; - break; - } - - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[($upper) ? strtoupper($fld->name) : $fld->name] = $fld; - - $rs->MoveNext(); - } - $rs->Close(); - return $retarr; - - } - - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_netezza extends ADORecordSet_postgres64 -{ - var $databaseType = "netezza"; - var $canSeek = true; - - function ADORecordSet_netezza($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break; - case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break; - - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH: - default: $this->fetchMode = PGSQL_BOTH; break; - } - $this->adodbFetchMode = $mode; - $this->ADORecordSet($queryID); - } - - // _initrs modified to disable blob handling - function _initrs() - { - global $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($this->_queryID):-1; - $this->_numOfFields = @pg_numfields($this->_queryID); - } - -} -?> diff --git a/include/limesurvey/classes/adodb/drivers/adodb-oci8.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-oci8.inc.php deleted file mode 100644 index 8fd28a60..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-oci8.inc.php +++ /dev/null @@ -1,1616 +0,0 @@ - - -13 Nov 2000 jlim - removed all ora_* references. -*/ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -/* - NLS_Date_Format - Allows you to use a date format other than the Oracle Lite default. When a literal - character string appears where a date value is expected, the Oracle Lite database - tests the string to see if it matches the formats of Oracle, SQL-92, or the value - specified for this parameter in the POLITE.INI file. Setting this parameter also - defines the default format used in the TO_CHAR or TO_DATE functions when no - other format string is supplied. - - For Oracle the default is dd-mon-yy or dd-mon-yyyy, and for SQL-92 the default is - yy-mm-dd or yyyy-mm-dd. - - Using 'RR' in the format forces two-digit years less than or equal to 49 to be - interpreted as years in the 21st century (2000�2049), and years over 50 as years i - the 20th century (1950�1999). Setting the RR format as the default for all two-digit - year entries allows you to become year-2000 compliant. For example: - NLS_DATE_FORMAT='RR-MM-DD' - - You can also modify the date format using the ALTER SESSION command. - */ - -# define the LOB descriptor type for the given type -# returns false if no LOB descriptor -function oci_lob_desc($type) { - switch ($type) { - case OCI_B_BFILE: $result = OCI_D_FILE; break; - case OCI_B_CFILEE: $result = OCI_D_FILE; break; - case OCI_B_CLOB: $result = OCI_D_LOB; break; - case OCI_B_BLOB: $result = OCI_D_LOB; break; - case OCI_B_ROWID: $result = OCI_D_ROWID; break; - default: $result = false; break; - } - return $result; -} - -class ADODB_oci8 extends ADOConnection { - var $databaseType = 'oci8'; - var $dataProvider = 'oci8'; - var $replaceQuote = "''"; // string to use to replace quotes - var $concat_operator='||'; - var $sysDate = "TRUNC(SYSDATE)"; - var $sysTimeStamp = 'SYSDATE'; // requires oracle 9 or later, otherwise use SYSDATE - var $metaDatabasesSQL = "SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN') ORDER BY 1"; - var $_stmt; - var $_commit = OCI_COMMIT_ON_SUCCESS; - var $_initdate = true; // init date to YYYY-MM-DD - var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW') and table_name not like 'BIN\$%'"; // bin$ tables are recycle bin tables - var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net - var $_bindInputArray = true; - var $hasGenID = true; - var $_genIDSQL = "SELECT (%s.nextval) FROM DUAL"; - var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s"; - var $_dropSeqSQL = "DROP SEQUENCE %s"; - var $hasAffectedRows = true; - var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)"; - var $noNullStrings = false; - var $connectSID = false; - var $_bind = false; - var $_nestedSQL = true; - var $_hasOCIFetchStatement = false; - var $_getarray = false; // currently not working - var $leftOuter = ''; // oracle wierdness, $col = $value (+) for LEFT OUTER, $col (+)= $value for RIGHT OUTER - var $session_sharing_force_blob = false; // alter session on updateblob if set to true - var $firstrows = true; // enable first rows optimization on SelectLimit() - var $selectOffsetAlg1 = 1000; // when to use 1st algorithm of selectlimit. - var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS' - var $dateformat = 'YYYY-MM-DD'; // DBDate format - var $useDBDateFormatForTextInput=false; - var $datetime = false; // MetaType('DATE') returns 'D' (datetime==false) or 'T' (datetime == true) - var $_refLOBs = array(); - - // var $ansiOuter = true; // if oracle9 - - function ADODB_oci8() - { - $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200; - if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_'; - } - - /* function MetaColumns($table, $normalize=true) added by smondino@users.sourceforge.net*/ - function MetaColumns($table, $normalize=true) - { - global $ADODB_FETCH_MODE; - - $false = false; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - - $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); - - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - if (!$rs) { - return $false; - } - $retarr = array(); - while (!$rs->EOF) { //print_r($rs->fields); - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $fld->type = $rs->fields[1]; - $fld->max_length = $rs->fields[2]; - $fld->scale = $rs->fields[3]; - if ($rs->fields[1] == 'NUMBER') { - if ($rs->fields[3] == 0) $fld->type = 'INT'; - $fld->max_length = $rs->fields[4]; - } - $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0); - $fld->binary = (strpos($fld->type,'BLOB') !== false); - $fld->default_value = $rs->fields[6]; - - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[strtoupper($fld->name)] = $fld; - $rs->MoveNext(); - } - $rs->Close(); - if (empty($retarr)) - return $false; - else - return $retarr; - } - - function Time() - { - $rs = $this->Execute("select TO_CHAR($this->sysTimeStamp,'YYYY-MM-DD HH24:MI:SS') from dual"); - if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); - - return false; - } - - /* - - Multiple modes of connection are supported: - - a. Local Database - $conn->Connect(false,'scott','tiger'); - - b. From tnsnames.ora - $conn->Connect(false,'scott','tiger',$tnsname); - $conn->Connect($tnsname,'scott','tiger'); - - c. Server + service name - $conn->Connect($serveraddress,'scott,'tiger',$service_name); - - d. Server + SID - $conn->connectSID = true; - $conn->Connect($serveraddress,'scott,'tiger',$SID); - - - Example TNSName: - --------------- - NATSOFT.DOMAIN = - (DESCRIPTION = - (ADDRESS_LIST = - (ADDRESS = (PROTOCOL = TCP)(HOST = kermit)(PORT = 1523)) - ) - (CONNECT_DATA = - (SERVICE_NAME = natsoft.domain) - ) - ) - - There are 3 connection modes, 0 = non-persistent, 1 = persistent, 2 = force new connection - - */ - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$mode=0) - { - if (!function_exists('OCIPLogon')) return null; - #adodb_backtrace(); - - $this->_errorMsg = false; - $this->_errorCode = false; - - if($argHostname) { // added by Jorma Tuomainen - if (empty($argDatabasename)) $argDatabasename = $argHostname; - else { - if(strpos($argHostname,":")) { - $argHostinfo=explode(":",$argHostname); - $argHostname=$argHostinfo[0]; - $argHostport=$argHostinfo[1]; - } else { - $argHostport = empty($this->port)? "1521" : $this->port; - } - - if (strncasecmp($argDatabasename,'SID=',4) == 0) { - $argDatabasename = substr($argDatabasename,4); - $this->connectSID = true; - } - - if ($this->connectSID) { - $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname - .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))"; - } else - $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname - .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))"; - } - } - - //if ($argHostname) print "

        Connect: 1st argument should be left blank for $this->databaseType

        "; - if ($mode==1) { - $this->_connectionID = ($this->charSet) ? - OCIPLogon($argUsername,$argPassword, $argDatabasename,$this->charSet) - : - OCIPLogon($argUsername,$argPassword, $argDatabasename) - ; - if ($this->_connectionID && $this->autoRollback) OCIrollback($this->_connectionID); - } else if ($mode==2) { - $this->_connectionID = ($this->charSet) ? - OCINLogon($argUsername,$argPassword, $argDatabasename,$this->charSet) - : - OCINLogon($argUsername,$argPassword, $argDatabasename); - - } else { - $this->_connectionID = ($this->charSet) ? - OCILogon($argUsername,$argPassword, $argDatabasename,$this->charSet) - : - OCILogon($argUsername,$argPassword, $argDatabasename); - } - if (!$this->_connectionID) return false; - if ($this->_initdate) { - $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'"); - } - - // looks like: - // Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production - // $vers = OCIServerVersion($this->_connectionID); - // if (strpos($vers,'8i') !== false) $this->ansiOuter = true; - return true; - } - - function ServerInfo() - { - $arr['compat'] = $this->GetOne('select value from sys.database_compatible_level'); - $arr['description'] = @OCIServerVersion($this->_connectionID); - $arr['version'] = ADOConnection::_findvers($arr['description']); - return $arr; - } - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,1); - } - - // returns true or false - function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,2); - } - - function _affectedrows() - { - if (is_resource($this->_stmt)) return @OCIRowCount($this->_stmt); - return 0; - } - - function IfNull( $field, $ifNull ) - { - return " NVL($field, $ifNull) "; // if Oracle - } - - // format and return date string in database date format - function DBDate($d,$isfld=false) - { - if (empty($d) && $d !== 0) return 'null'; - if ($isfld) return 'TO_DATE('.$d.",'".$this->dateformat."')"; - - if (is_string($d)) $d = ADORecordSet::UnixDate($d); - - if (is_object($d)) $ds = $d->format($this->fmtDate); - else $ds = adodb_date($this->fmtDate,$d); - - return "TO_DATE(".$ds.",'".$this->dateformat."')"; - } - - function BindDate($d) - { - $d = ADOConnection::DBDate($d); - if (strncmp($d,"'",1)) return $d; - - return substr($d,1,strlen($d)-2); - } - - function BindTimeStamp($ts) - { - if (empty($ts) && $ts !== 0) return 'null'; - if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); - - if (is_object($ts)) $tss = $ts->format("'Y-m-d H:i:s'"); - else $tss = adodb_date("'Y-m-d H:i:s'",$ts); - - return $tss; - } - - // format and return date string in database timestamp format - function DBTimeStamp($ts,$isfld=false) - { - if (empty($ts) && $ts !== 0) return 'null'; - if ($isfld) return 'TO_DATE(substr('.$ts.",1,19),'RRRR-MM-DD, HH24:MI:SS')"; - if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); - - if (is_object($ts)) $tss = $ts->format("'Y-m-d H:i:s'"); - else $tss = adodb_date("'Y-m-d H:i:s'",$ts); - - return 'TO_DATE('.$tss.",'RRRR-MM-DD, HH24:MI:SS')"; - } - - function RowLock($tables,$where,$col='1 as ignore') - { - if ($this->autoCommit) $this->BeginTrans(); - return $this->GetOne("select $col from $tables where $where for update"); - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr(strtoupper($mask)); - $this->metaTablesSQL .= " AND upper(table_name) like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } - - // Mark Newnham - function MetaIndexes ($table, $primary = FALSE, $owner=false) - { - // save old fetch mode - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - // get index details - $table = strtoupper($table); - - // get Primary index - $primary_key = ''; - - $false = false; - $rs = $this->Execute(sprintf("SELECT * FROM ALL_CONSTRAINTS WHERE UPPER(TABLE_NAME)='%s' AND CONSTRAINT_TYPE='P'",$table)); - if ($row = $rs->FetchRow()) - $primary_key = $row[1]; //constraint_name - - if ($primary==TRUE && $primary_key=='') { - if (isset($savem)) - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - return $false; //There is no primary key - } - - $rs = $this->Execute(sprintf("SELECT ALL_INDEXES.INDEX_NAME, ALL_INDEXES.UNIQUENESS, ALL_IND_COLUMNS.COLUMN_POSITION, ALL_IND_COLUMNS.COLUMN_NAME FROM ALL_INDEXES,ALL_IND_COLUMNS WHERE UPPER(ALL_INDEXES.TABLE_NAME)='%s' AND ALL_IND_COLUMNS.INDEX_NAME=ALL_INDEXES.INDEX_NAME",$table)); - - - if (!is_object($rs)) { - if (isset($savem)) - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - return $false; - } - - $indexes = array (); - // parse index data into array - - while ($row = $rs->FetchRow()) { - if ($primary && $row[0] != $primary_key) continue; - if (!isset($indexes[$row[0]])) { - $indexes[$row[0]] = array( - 'unique' => ($row[1] == 'UNIQUE'), - 'columns' => array() - ); - } - $indexes[$row[0]]['columns'][$row[2] - 1] = $row[3]; - } - - // sort columns by order in the index - foreach ( array_keys ($indexes) as $index ) { - ksort ($indexes[$index]['columns']); - } - - if (isset($savem)) { - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - } - return $indexes; - } - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - $this->autoCommit = false; - $this->_commit = OCI_DEFAULT; - - if ($this->_transmode) $ok = $this->Execute("SET TRANSACTION ".$this->_transmode); - else $ok = true; - - return $ok ? true : false; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - - if ($this->transCnt) $this->transCnt -= 1; - $ret = OCIcommit($this->_connectionID); - $this->_commit = OCI_COMMIT_ON_SUCCESS; - $this->autoCommit = true; - return $ret; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $ret = OCIrollback($this->_connectionID); - $this->_commit = OCI_COMMIT_ON_SUCCESS; - $this->autoCommit = true; - return $ret; - } - - - function SelectDB($dbName) - { - return false; - } - - function ErrorMsg() - { - if ($this->_errorMsg !== false) return $this->_errorMsg; - - if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt); - if (empty($arr)) { - if (is_resource($this->_connectionID)) $arr = @OCIError($this->_connectionID); - else $arr = @OCIError(); - if ($arr === false) return ''; - } - $this->_errorMsg = $arr['message']; - $this->_errorCode = $arr['code']; - return $this->_errorMsg; - } - - function ErrorNo() - { - if ($this->_errorCode !== false) return $this->_errorCode; - - if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt); - if (empty($arr)) { - $arr = @OCIError($this->_connectionID); - if ($arr == false) $arr = @OCIError(); - if ($arr == false) return ''; - } - - $this->_errorMsg = $arr['message']; - $this->_errorCode = $arr['code']; - - return $arr['code']; - } - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysTimeStamp; - $s = 'TO_CHAR('.$col.",'"; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= 'YYYY'; - break; - case 'Q': - case 'q': - $s .= 'Q'; - break; - - case 'M': - $s .= 'Mon'; - break; - - case 'm': - $s .= 'MM'; - break; - case 'D': - case 'd': - $s .= 'DD'; - break; - - case 'H': - $s.= 'HH24'; - break; - - case 'h': - $s .= 'HH'; - break; - - case 'i': - $s .= 'MI'; - break; - - case 's': - $s .= 'SS'; - break; - - case 'a': - case 'A': - $s .= 'AM'; - break; - - case 'w': - $s .= 'D'; - break; - - case 'l': - $s .= 'DAY'; - break; - - case 'W': - $s .= 'WW'; - break; - - default: - // handle escape characters... - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - if (strpos('-/.:;, ',$ch) !== false) $s .= $ch; - else $s .= '"'.$ch.'"'; - - } - } - return $s. "')"; - } - - function GetRandRow($sql, $arr = false) - { - $sql = "SELECT * FROM ($sql ORDER BY dbms_random.value) WHERE rownum = 1"; - - return $this->GetRow($sql,$arr); - } - - /* - This algorithm makes use of - - a. FIRST_ROWS hint - The FIRST_ROWS hint explicitly chooses the approach to optimize response time, - that is, minimum resource usage to return the first row. Results will be returned - as soon as they are identified. - - b. Uses rownum tricks to obtain only the required rows from a given offset. - As this uses complicated sql statements, we only use this if the $offset >= 100. - This idea by Tomas V V Cox. - - This implementation does not appear to work with oracle 8.0.5 or earlier. Comment - out this function then, and the slower SelectLimit() in the base class will be used. - */ - function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) - { - // seems that oracle only supports 1 hint comment in 8i - if ($this->firstrows) { - if (strpos($sql,'/*+') !== false) - $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql); - else - $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql); - } - - if ($offset == -1 || ($offset < $this->selectOffsetAlg1 && 0 < $nrows && $nrows < 1000)) { - if ($nrows > 0) { - if ($offset > 0) $nrows += $offset; - //$inputarr['adodb_rownum'] = $nrows; - if ($this->databaseType == 'oci8po') { - $sql = "select * from (".$sql.") where rownum <= ?"; - } else { - $sql = "select * from (".$sql.") where rownum <= :adodb_offset"; - } - $inputarr['adodb_offset'] = $nrows; - $nrows = -1; - } - // note that $nrows = 0 still has to work ==> no rows returned - - $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - return $rs; - - } else { - // Algorithm by Tomas V V Cox, from PEAR DB oci8.php - - // Let Oracle return the name of the columns - $q_fields = "SELECT * FROM (".$sql.") WHERE NULL = NULL"; - - $false = false; - if (! $stmt_arr = $this->Prepare($q_fields)) { - return $false; - } - $stmt = $stmt_arr[1]; - - if (is_array($inputarr)) { - foreach($inputarr as $k => $v) { - if (is_array($v)) { - if (sizeof($v) == 2) // suggested by g.giunta@libero. - OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]); - else - OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]); - } else { - $len = -1; - if ($v === ' ') $len = 1; - if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again - $bindarr[$k] = $v; - } else { // dynamic sql, so rebind every time - OCIBindByName($stmt,":$k",$inputarr[$k],$len); - - } - } - } - } - - if (!OCIExecute($stmt, OCI_DEFAULT)) { - OCIFreeStatement($stmt); - return $false; - } - - $ncols = OCINumCols($stmt); - for ( $i = 1; $i <= $ncols; $i++ ) { - $cols[] = '"'.OCIColumnName($stmt, $i).'"'; - } - $result = false; - - OCIFreeStatement($stmt); - $fields = implode(',', $cols); - if ($nrows <= 0) $nrows = 999999999999; - else $nrows += $offset; - $offset += 1; // in Oracle rownum starts at 1 - - if ($this->databaseType == 'oci8po') { - $sql = "SELECT /*+ FIRST_ROWS */ $fields FROM". - "(SELECT rownum as adodb_rownum, $fields FROM". - " ($sql) WHERE rownum <= ?". - ") WHERE adodb_rownum >= ?"; - } else { - $sql = "SELECT /*+ FIRST_ROWS */ $fields FROM". - "(SELECT rownum as adodb_rownum, $fields FROM". - " ($sql) WHERE rownum <= :adodb_nrows". - ") WHERE adodb_rownum >= :adodb_offset"; - } - $inputarr['adodb_nrows'] = $nrows; - $inputarr['adodb_offset'] = $offset; - - if ($secs2cache>0) $rs = $this->CacheExecute($secs2cache, $sql,$inputarr); - else $rs = $this->Execute($sql,$inputarr); - return $rs; - } - - } - - /** - * Usage: - * Store BLOBs and CLOBs - * - * Example: to store $var in a blob - * - * $conn->Execute('insert into TABLE (id,ablob) values(12,empty_blob())'); - * $conn->UpdateBlob('TABLE', 'ablob', $varHoldingBlob, 'ID=12', 'BLOB'); - * - * $blobtype supports 'BLOB' and 'CLOB', but you need to change to 'empty_clob()'. - * - * to get length of LOB: - * select DBMS_LOB.GETLENGTH(ablob) from TABLE - * - * If you are using CURSOR_SHARING = force, it appears this will case a segfault - * under oracle 8.1.7.0. Run: - * $db->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); - * before UpdateBlob() then... - */ - - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - - //if (strlen($val) < 4000) return $this->Execute("UPDATE $table SET $column=:blob WHERE $where",array('blob'=>$val)) != false; - - switch(strtoupper($blobtype)) { - default: ADOConnection::outp("UpdateBlob: Unknown blobtype=$blobtype"); return false; - case 'BLOB': $type = OCI_B_BLOB; break; - case 'CLOB': $type = OCI_B_CLOB; break; - } - - if ($this->databaseType == 'oci8po') - $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?"; - else - $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob"; - - $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB); - $arr['blob'] = array($desc,-1,$type); - if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); - $commit = $this->autoCommit; - if ($commit) $this->BeginTrans(); - $rs = $this->_Execute($sql,$arr); - if ($rez = !empty($rs)) $desc->save($val); - $desc->free(); - if ($commit) $this->CommitTrans(); - if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=FORCE'); - - if ($rez) $rs->Close(); - return $rez; - } - - /** - * Usage: store file pointed to by $val in a blob - */ - function UpdateBlobFile($table,$column,$val,$where,$blobtype='BLOB') - { - switch(strtoupper($blobtype)) { - default: ADOConnection::outp( "UpdateBlob: Unknown blobtype=$blobtype"); return false; - case 'BLOB': $type = OCI_B_BLOB; break; - case 'CLOB': $type = OCI_B_CLOB; break; - } - - if ($this->databaseType == 'oci8po') - $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?"; - else - $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob"; - - $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB); - $arr['blob'] = array($desc,-1,$type); - - $this->BeginTrans(); - $rs = ADODB_oci8::Execute($sql,$arr); - if ($rez = !empty($rs)) $desc->savefile($val); - $desc->free(); - $this->CommitTrans(); - - if ($rez) $rs->Close(); - return $rez; - } - - /** - * Execute SQL - * - * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text) - * @param [inputarr] holds the input data to bind to. Null elements will be set to null. - * @return RecordSet or false - */ - function Execute($sql,$inputarr=false) - { - if ($this->fnExecute) { - $fn = $this->fnExecute; - $ret = $fn($this,$sql,$inputarr); - if (isset($ret)) return $ret; - } - if ($inputarr) { - #if (!is_array($inputarr)) $inputarr = array($inputarr); - - $element0 = reset($inputarr); - - if (!$this->_bindInputArray) { - # is_object check because oci8 descriptors can be passed in - if (is_array($element0) && !is_object(reset($element0))) { - if (is_string($sql)) - $stmt = $this->Prepare($sql); - else - $stmt = $sql; - - foreach($inputarr as $arr) { - $ret = $this->_Execute($stmt,$arr); - if (!$ret) return $ret; - } - } else { - $sqlarr = explode(':',$sql); - $sql = ''; - $lastnomatch = -2; - #var_dump($sqlarr);echo "
        ";var_dump($inputarr);echo"
        "; - foreach($sqlarr as $k => $str) { - if ($k == 0) { $sql = $str; continue; } - // we need $lastnomatch because of the following datetime, - // eg. '10:10:01', which causes code to think that there is bind param :10 and :1 - $ok = preg_match('/^([0-9]*)/', $str, $arr); - - if (!$ok) $sql .= $str; - else { - $at = $arr[1]; - if (isset($inputarr[$at]) || is_null($inputarr[$at])) { - if ((strlen($at) == strlen($str) && $k < sizeof($arr)-1)) { - $sql .= ':'.$str; - $lastnomatch = $k; - } else if ($lastnomatch == $k-1) { - $sql .= ':'.$str; - } else { - if (is_null($inputarr[$at])) $sql .= 'null'; - else $sql .= $this->qstr($inputarr[$at]); - $sql .= substr($str, strlen($at)); - } - } else { - $sql .= ':'.$str; - } - - } - } - $inputarr = false; - } - } - $ret = $this->_Execute($sql,$inputarr); - - - } else { - $ret = $this->_Execute($sql,false); - } - - return $ret; - } - - /* - Example of usage: - - $stmt = $this->Prepare('insert into emp (empno, ename) values (:empno, :ename)'); - */ - function Prepare($sql,$cursor=false) - { - static $BINDNUM = 0; - - $stmt = OCIParse($this->_connectionID,$sql); - - if (!$stmt) { - $this->_errorMsg = false; - $this->_errorCode = false; - $arr = @OCIError($this->_connectionID); - if ($arr === false) return false; - - $this->_errorMsg = $arr['message']; - $this->_errorCode = $arr['code']; - return false; - } - - $BINDNUM += 1; - - $sttype = @OCIStatementType($stmt); - if ($sttype == 'BEGIN' || $sttype == 'DECLARE') { - return array($sql,$stmt,0,$BINDNUM, ($cursor) ? OCINewCursor($this->_connectionID) : false); - } - return array($sql,$stmt,0,$BINDNUM); - } - - /* - Call an oracle stored procedure and returns a cursor variable as a recordset. - Concept by Robert Tuttle robert@ud.com - - Example: - Note: we return a cursor variable in :RS2 - $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS2); END;",'RS2'); - - $rs = $db->ExecuteCursor( - "BEGIN :RS2 = adodb.getdata(:VAR1); END;", - 'RS2', - array('VAR1' => 'Mr Bean')); - - */ - function ExecuteCursor($sql,$cursorName='rs',$params=false) - { - if (is_array($sql)) $stmt = $sql; - else $stmt = ADODB_oci8::Prepare($sql,true); # true to allocate OCINewCursor - - if (is_array($stmt) && sizeof($stmt) >= 5) { - $hasref = true; - $ignoreCur = false; - $this->Parameter($stmt, $ignoreCur, $cursorName, false, -1, OCI_B_CURSOR); - if ($params) { - foreach($params as $k => $v) { - $this->Parameter($stmt,$params[$k], $k); - } - } - } else - $hasref = false; - - $rs = $this->Execute($stmt); - if ($rs) { - if ($rs->databaseType == 'array') OCIFreeCursor($stmt[4]); - else if ($hasref) $rs->_refcursor = $stmt[4]; - } - return $rs; - } - - /* - Bind a variable -- very, very fast for executing repeated statements in oracle. - Better than using - for ($i = 0; $i < $max; $i++) { - $p1 = ?; $p2 = ?; $p3 = ?; - $this->Execute("insert into table (col0, col1, col2) values (:0, :1, :2)", - array($p1,$p2,$p3)); - } - - Usage: - $stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)"); - $DB->Bind($stmt, $p1); - $DB->Bind($stmt, $p2); - $DB->Bind($stmt, $p3); - for ($i = 0; $i < $max; $i++) { - $p1 = ?; $p2 = ?; $p3 = ?; - $DB->Execute($stmt); - } - - Some timings: - ** Test table has 3 cols, and 1 index. Test to insert 1000 records - Time 0.6081s (1644.60 inserts/sec) with direct OCIParse/OCIExecute - Time 0.6341s (1577.16 inserts/sec) with ADOdb Prepare/Bind/Execute - Time 1.5533s ( 643.77 inserts/sec) with pure SQL using Execute - - Now if PHP only had batch/bulk updating like Java or PL/SQL... - - Note that the order of parameters differs from OCIBindByName, - because we default the names to :0, :1, :2 - */ - function Bind(&$stmt,&$var,$size=4000,$type=false,$name=false,$isOutput=false) - { - - if (!is_array($stmt)) return false; - - if (($type == OCI_B_CURSOR) && sizeof($stmt) >= 5) { - return OCIBindByName($stmt[1],":".$name,$stmt[4],$size,$type); - } - - if ($name == false) { - if ($type !== false) $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size,$type); - else $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size); // +1 byte for null terminator - $stmt[2] += 1; - } else if (oci_lob_desc($type)) { - if ($this->debug) { - ADOConnection::outp("Bind: name = $name"); - } - //we have to create a new Descriptor here - $numlob = count($this->_refLOBs); - $this->_refLOBs[$numlob]['LOB'] = OCINewDescriptor($this->_connectionID, oci_lob_desc($type)); - $this->_refLOBs[$numlob]['TYPE'] = $isOutput; - - $tmp = $this->_refLOBs[$numlob]['LOB']; - $rez = OCIBindByName($stmt[1], ":".$name, $tmp, -1, $type); - if ($this->debug) { - ADOConnection::outp("Bind: descriptor has been allocated, var (".$name.") binded"); - } - - // if type is input then write data to lob now - if ($isOutput == false) { - $var = $this->BlobEncode($var); - $tmp->WriteTemporary($var); - $this->_refLOBs[$numlob]['VAR'] = &$var; - if ($this->debug) { - ADOConnection::outp("Bind: LOB has been written to temp"); - } - } else { - $this->_refLOBs[$numlob]['VAR'] = $var; - } - $rez = $tmp; - } else { - if ($this->debug) - ADOConnection::outp("Bind: name = $name"); - - if ($type !== false) $rez = OCIBindByName($stmt[1],":".$name,$var,$size,$type); - else $rez = OCIBindByName($stmt[1],":".$name,$var,$size); // +1 byte for null terminator - } - - return $rez; - } - - function Param($name,$type=false) - { - return ':'.$name; - } - - /* - Usage: - $stmt = $db->Prepare('select * from table where id =:myid and group=:group'); - $db->Parameter($stmt,$id,'myid'); - $db->Parameter($stmt,$group,'group'); - $db->Execute($stmt); - - @param $stmt Statement returned by Prepare() or PrepareSP(). - @param $var PHP variable to bind to - @param $name Name of stored procedure variable name to bind to. - @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. - @param [$maxLen] Holds an maximum length of the variable. - @param [$type] The data type of $var. Legal values depend on driver. - - See OCIBindByName documentation at php.net. - */ - function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false) - { - if ($this->debug) { - $prefix = ($isOutput) ? 'Out' : 'In'; - $ztype = (empty($type)) ? 'false' : $type; - ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);"); - } - return $this->Bind($stmt,$var,$maxLen,$type,$name,$isOutput); - } - - /* - returns query ID if successful, otherwise false - this version supports: - - 1. $db->execute('select * from table'); - - 2. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)'); - $db->execute($prepared_statement, array(1,2,3)); - - 3. $db->execute('insert into table (a,b,c) values (:a,:b,:c)',array('a'=>1,'b'=>2,'c'=>3)); - - 4. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)'); - $db->bind($stmt,1); $db->bind($stmt,2); $db->bind($stmt,3); - $db->execute($stmt); - */ - function _query($sql,$inputarr=false) - { - if (is_array($sql)) { // is prepared sql - $stmt = $sql[1]; - - // we try to bind to permanent array, so that OCIBindByName is persistent - // and carried out once only - note that max array element size is 4000 chars - if (is_array($inputarr)) { - $bindpos = $sql[3]; - if (isset($this->_bind[$bindpos])) { - // all tied up already - $bindarr = $this->_bind[$bindpos]; - } else { - // one statement to bind them all - $bindarr = array(); - foreach($inputarr as $k => $v) { - $bindarr[$k] = $v; - OCIBindByName($stmt,":$k",$bindarr[$k],is_string($v) && strlen($v)>4000 ? -1 : 4000); - } - $this->_bind[$bindpos] = $bindarr; - } - } - } else { - $stmt=OCIParse($this->_connectionID,$sql); - } - - $this->_stmt = $stmt; - if (!$stmt) return false; - - if (defined('ADODB_PREFETCH_ROWS')) @OCISetPrefetch($stmt,ADODB_PREFETCH_ROWS); - - if (is_array($inputarr)) { - foreach($inputarr as $k => $v) { - if (is_array($v)) { - if (sizeof($v) == 2) // suggested by g.giunta@libero. - OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]); - else - OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]); - - if ($this->debug==99) { - if (is_object($v[0])) - echo "name=:$k",' len='.$v[1],' type='.$v[2],'
        '; - else - echo "name=:$k",' var='.$inputarr[$k][0],' len='.$v[1],' type='.$v[2],'
        '; - - } - } else { - $len = -1; - if ($v === ' ') $len = 1; - if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again - $bindarr[$k] = $v; - } else { // dynamic sql, so rebind every time - OCIBindByName($stmt,":$k",$inputarr[$k],$len); - } - } - } - } - - $this->_errorMsg = false; - $this->_errorCode = false; - if (OCIExecute($stmt,$this->_commit)) { - //OCIInternalDebug(1); - if (count($this -> _refLOBs) > 0) { - - foreach ($this -> _refLOBs as $key => $value) { - if ($this -> _refLOBs[$key]['TYPE'] == true) { - $tmp = $this -> _refLOBs[$key]['LOB'] -> load(); - if ($this -> debug) { - ADOConnection::outp("OUT LOB: LOB has been loaded.
        "); - } - //$_GLOBALS[$this -> _refLOBs[$key]['VAR']] = $tmp; - $this -> _refLOBs[$key]['VAR'] = $tmp; - } else { - $this->_refLOBs[$key]['LOB']->save($this->_refLOBs[$key]['VAR']); - $this -> _refLOBs[$key]['LOB']->free(); - unset($this -> _refLOBs[$key]); - if ($this->debug) { - ADOConnection::outp("IN LOB: LOB has been saved.
        "); - } - } - } - } - - switch (@OCIStatementType($stmt)) { - case "SELECT": - return $stmt; - - case 'DECLARE': - case "BEGIN": - if (is_array($sql) && !empty($sql[4])) { - $cursor = $sql[4]; - if (is_resource($cursor)) { - $ok = OCIExecute($cursor); - return $cursor; - } - return $stmt; - } else { - if (is_resource($stmt)) { - OCIFreeStatement($stmt); - return true; - } - return $stmt; - } - break; - default : - // ociclose -- no because it could be used in a LOB? - return true; - } - } - return false; - } - - // From Oracle Whitepaper: PHP Scalability and High Availability - function IsConnectionError($err) - { - switch($err) { - case 378: /* buffer pool param incorrect */ - case 602: /* core dump */ - case 603: /* fatal error */ - case 609: /* attach failed */ - case 1012: /* not logged in */ - case 1033: /* init or shutdown in progress */ - case 1043: /* Oracle not available */ - case 1089: /* immediate shutdown in progress */ - case 1090: /* shutdown in progress */ - case 1092: /* instance terminated */ - case 3113: /* disconnect */ - case 3114: /* not connected */ - case 3122: /* closing window */ - case 3135: /* lost contact */ - case 12153: /* TNS: not connected */ - case 27146: /* fatal or instance terminated */ - case 28511: /* Lost RPC */ - return true; - } - return false; - } - - // returns true or false - function _close() - { - if (!$this->_connectionID) return; - - if (!$this->autoCommit) OCIRollback($this->_connectionID); - if (count($this->_refLOBs) > 0) { - foreach ($this ->_refLOBs as $key => $value) { - $this->_refLOBs[$key]['LOB']->free(); - unset($this->_refLOBs[$key]); - } - } - OCILogoff($this->_connectionID); - - $this->_stmt = false; - $this->_connectionID = false; - } - - function MetaPrimaryKeys($table, $owner=false,$internalKey=false) - { - if ($internalKey) return array('ROWID'); - - // tested with oracle 8.1.7 - $table = strtoupper($table); - if ($owner) { - $owner_clause = "AND ((a.OWNER = b.OWNER) AND (a.OWNER = UPPER('$owner')))"; - $ptab = 'ALL_'; - } else { - $owner_clause = ''; - $ptab = 'USER_'; - } - $sql = " -SELECT /*+ RULE */ distinct b.column_name - FROM {$ptab}CONSTRAINTS a - , {$ptab}CONS_COLUMNS b - WHERE ( UPPER(b.table_name) = ('$table')) - AND (UPPER(a.table_name) = ('$table') and a.constraint_type = 'P') - $owner_clause - AND (a.constraint_name = b.constraint_name)"; - - $rs = $this->Execute($sql); - if ($rs && !$rs->EOF) { - $arr = $rs->GetArray(); - $a = array(); - foreach($arr as $v) { - $a[] = reset($v); - } - return $a; - } - else return false; - } - - // http://gis.mit.edu/classes/11.521/sqlnotes/referential_integrity.html - function MetaForeignKeys($table, $owner=false) - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $table = $this->qstr(strtoupper($table)); - if (!$owner) { - $owner = $this->user; - $tabp = 'user_'; - } else - $tabp = 'all_'; - - $owner = ' and owner='.$this->qstr(strtoupper($owner)); - - $sql = -"select constraint_name,r_owner,r_constraint_name - from {$tabp}constraints - where constraint_type = 'R' and table_name = $table $owner"; - - $constraints = $this->GetArray($sql); - $arr = false; - foreach($constraints as $constr) { - $cons = $this->qstr($constr[0]); - $rowner = $this->qstr($constr[1]); - $rcons = $this->qstr($constr[2]); - $cols = $this->GetArray("select column_name from {$tabp}cons_columns where constraint_name=$cons $owner order by position"); - $tabcol = $this->GetArray("select table_name,column_name from {$tabp}cons_columns where owner=$rowner and constraint_name=$rcons order by position"); - - if ($cols && $tabcol) - for ($i=0, $max=sizeof($cols); $i < $max; $i++) { - $arr[$tabcol[$i][0]] = $cols[$i][0].'='.$tabcol[$i][1]; - } - } - $ADODB_FETCH_MODE = $save; - - return $arr; - } - - - function CharMax() - { - return 4000; - } - - function TextMax() - { - return 4000; - } - - /** - * Quotes a string. - * An example is $db->qstr("Don't bother",magic_quotes_runtime()); - * - * @param s the string to quote - * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). - * This undoes the stupidity of magic quotes for GPC. - * - * @return quoted string to be sent back to database - */ - function qstr($s,$magic_quotes=false) - { - //$nofixquotes=false; - - if ($this->noNullStrings && strlen($s)==0)$s = ' '; - if (!$magic_quotes) { - if ($this->replaceQuote[0] == '\\'){ - $s = str_replace('\\','\\\\',$s); - } - return "'".str_replace("'",$this->replaceQuote,$s)."'"; - } - - // undo magic quotes for " unless sybase is on - if (!@ini_get('magic_quotes_sybase')) { - $s = str_replace('\\"','"',$s); - $s = str_replace('\\\\','\\',$s); - return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; - } else { - return "'".$s."'"; - } - } - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_oci8 extends ADORecordSet { - - var $databaseType = 'oci8'; - var $bind=false; - var $_fieldobjs; - - //var $_arr = false; - - function ADORecordset_oci8($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - case ADODB_FETCH_NUM: - default: - $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - } - - $this->adodbFetchMode = $mode; - $this->_queryID = $queryID; - } - - - function Init() - { - if ($this->_inited) return; - - $this->_inited = true; - if ($this->_queryID) { - - $this->_currentRow = 0; - @$this->_initrs(); - $this->EOF = !$this->_fetch(); - - /* - // based on idea by Gaetano Giunta to detect unusual oracle errors - // see http://phplens.com/lens/lensforum/msgs.php?id=6771 - $err = OCIError($this->_queryID); - if ($err && $this->connection->debug) ADOConnection::outp($err); - */ - - if (!is_array($this->fields)) { - $this->_numOfRows = 0; - $this->fields = array(); - } - } else { - $this->fields = array(); - $this->_numOfRows = 0; - $this->_numOfFields = 0; - $this->EOF = true; - } - } - - function _initrs() - { - $this->_numOfRows = -1; - $this->_numOfFields = OCInumcols($this->_queryID); - if ($this->_numOfFields>0) { - $this->_fieldobjs = array(); - $max = $this->_numOfFields; - for ($i=0;$i<$max; $i++) $this->_fieldobjs[] = $this->_FetchField($i); - } - } - - /* Returns: an object containing field information. - Get column information in the Recordset object. fetchField() can be used in order to obtain information about - fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by - fetchField() is retrieved. */ - - function _FetchField($fieldOffset = -1) - { - $fld = new ADOFieldObject; - $fieldOffset += 1; - $fld->name =OCIcolumnname($this->_queryID, $fieldOffset); - $fld->type = OCIcolumntype($this->_queryID, $fieldOffset); - $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset); - switch($fld->type) { - case 'NUMBER': - $p = OCIColumnPrecision($this->_queryID, $fieldOffset); - $sc = OCIColumnScale($this->_queryID, $fieldOffset); - if ($p != 0 && $sc == 0) $fld->type = 'INT'; - break; - - case 'CLOB': - case 'NCLOB': - case 'BLOB': - $fld->max_length = -1; - break; - } - return $fld; - } - - /* For some reason, OCIcolumnname fails when called after _initrs() so we cache it */ - function FetchField($fieldOffset = -1) - { - return $this->_fieldobjs[$fieldOffset]; - } - - - /* - // 10% speedup to move MoveNext to child class - function _MoveNext() - { - //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this); - - if ($this->EOF) return false; - - $this->_currentRow++; - if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) - return true; - $this->EOF = true; - - return false; - } */ - - - function MoveNext() - { - if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { - $this->_currentRow += 1; - return true; - } - if (!$this->EOF) { - $this->_currentRow += 1; - $this->EOF = true; - } - return false; - } - - /* - # does not work as first record is retrieved in _initrs(), so is not included in GetArray() - function GetArray($nRows = -1) - { - global $ADODB_OCI8_GETARRAY; - - if (true || !empty($ADODB_OCI8_GETARRAY)) { - # does not support $ADODB_ANSI_PADDING_OFF - - //OCI_RETURN_NULLS and OCI_RETURN_LOBS is set by OCIfetchstatement - switch($this->adodbFetchMode) { - case ADODB_FETCH_NUM: - - $ncols = @OCIfetchstatement($this->_queryID, $results, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW+OCI_NUM); - $results = array_merge(array($this->fields),$results); - return $results; - - case ADODB_FETCH_ASSOC: - if (ADODB_ASSOC_CASE != 2 || $this->databaseType != 'oci8') break; - - $ncols = @OCIfetchstatement($this->_queryID, $assoc, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW); - $results = array_merge(array($this->fields),$assoc); - return $results; - - default: - break; - } - } - - $results = ADORecordSet::GetArray($nRows); - return $results; - - } */ - - /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */ - function GetArrayLimit($nrows,$offset=-1) - { - if ($offset <= 0) { - $arr = $this->GetArray($nrows); - return $arr; - } - $arr = array(); - for ($i=1; $i < $offset; $i++) - if (!@OCIFetch($this->_queryID)) return $arr; - - if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return $arr;; - $results = array(); - $cnt = 0; - while (!$this->EOF && $nrows != $cnt) { - $results[$cnt++] = $this->fields; - $this->MoveNext(); - } - - return $results; - } - - - /* Use associative array to get fields array */ - function Fields($colname) - { - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - - - function _seek($row) - { - return false; - } - - function _fetch() - { - return @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode); - } - - /* close() only needs to be called if you are worried about using too much memory while your script - is running. All associated result memory for the specified result identifier will automatically be freed. */ - - function _close() - { - if ($this->connection->_stmt === $this->_queryID) $this->connection->_stmt = false; - if (!empty($this->_refcursor)) { - OCIFreeCursor($this->_refcursor); - $this->_refcursor = false; - } - @OCIFreeStatement($this->_queryID); - $this->_queryID = false; - - } - - function MetaType($t,$len=-1) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - switch (strtoupper($t)) { - case 'VARCHAR': - case 'VARCHAR2': - case 'CHAR': - case 'VARBINARY': - case 'BINARY': - case 'NCHAR': - case 'NVARCHAR': - case 'NVARCHAR2': - if ($len <= $this->blobSize) return 'C'; - - case 'NCLOB': - case 'LONG': - case 'LONG VARCHAR': - case 'CLOB': - return 'X'; - - case 'LONG RAW': - case 'LONG VARBINARY': - case 'BLOB': - return 'B'; - - case 'DATE': - return ($this->connection->datetime) ? 'T' : 'D'; - - - case 'TIMESTAMP': return 'T'; - - case 'INT': - case 'SMALLINT': - case 'INTEGER': - return 'I'; - - default: return 'N'; - } - } -} - -class ADORecordSet_ext_oci8 extends ADORecordSet_oci8 { - function ADORecordSet_ext_oci8($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - case ADODB_FETCH_NUM: - default: $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - } - $this->adodbFetchMode = $mode; - $this->_queryID = $queryID; - } - - function MoveNext() - { - return adodb_movenext($this); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-oci8.old.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-oci8.old.inc.php deleted file mode 100644 index 3ed4b76c..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-oci8.old.inc.php +++ /dev/null @@ -1,1532 +0,0 @@ - - -13 Nov 2000 jlim - removed all ora_* references. -*/ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -/* - NLS_Date_Format - Allows you to use a date format other than the Oracle Lite default. When a literal - character string appears where a date value is expected, the Oracle Lite database - tests the string to see if it matches the formats of Oracle, SQL-92, or the value - specified for this parameter in the POLITE.INI file. Setting this parameter also - defines the default format used in the TO_CHAR or TO_DATE functions when no - other format string is supplied. - - For Oracle the default is dd-mon-yy or dd-mon-yyyy, and for SQL-92 the default is - yy-mm-dd or yyyy-mm-dd. - - Using 'RR' in the format forces two-digit years less than or equal to 49 to be - interpreted as years in the 21st century (2000�2049), and years over 50 as years i - the 20th century (1950�1999). Setting the RR format as the default for all two-digit - year entries allows you to become year-2000 compliant. For example: - NLS_DATE_FORMAT='RR-MM-DD' - - You can also modify the date format using the ALTER SESSION command. - */ - -# define the LOB descriptor type for the given type -# returns false if no LOB descriptor -function oci_lob_desc($type) { - switch ($type) { - case OCI_B_BFILE: $result = OCI_D_FILE; break; - case OCI_B_CFILEE: $result = OCI_D_FILE; break; - case OCI_B_CLOB: $result = OCI_D_LOB; break; - case OCI_B_BLOB: $result = OCI_D_LOB; break; - case OCI_B_ROWID: $result = OCI_D_ROWID; break; - default: $result = false; break; - } - return $result; -} - -class ADODB_oci8 extends ADOConnection { - var $databaseType = 'oci8'; - var $dataProvider = 'oci8'; - var $replaceQuote = "''"; // string to use to replace quotes - var $concat_operator='||'; - var $sysDate = "TRUNC(SYSDATE)"; - var $sysTimeStamp = 'SYSDATE'; - var $metaDatabasesSQL = "SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN') ORDER BY 1"; - var $_stmt; - var $_commit = OCI_COMMIT_ON_SUCCESS; - var $_initdate = true; // init date to YYYY-MM-DD - var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW') and table_name not like 'BIN\$%'"; // bin$ tables are recycle bin tables - var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net - var $_bindInputArray = true; - var $hasGenID = true; - var $_genIDSQL = "SELECT (%s.nextval) FROM DUAL"; - var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s"; - var $_dropSeqSQL = "DROP SEQUENCE %s"; - var $hasAffectedRows = true; - var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)"; - var $noNullStrings = false; - var $connectSID = false; - var $_bind = false; - var $_nestedSQL = true; - var $_hasOCIFetchStatement = false; - var $_getarray = false; // currently not working - var $leftOuter = ''; // oracle wierdness, $col = $value (+) for LEFT OUTER, $col (+)= $value for RIGHT OUTER - var $session_sharing_force_blob = false; // alter session on updateblob if set to true - var $firstrows = true; // enable first rows optimization on SelectLimit() - var $selectOffsetAlg1 = 100; // when to use 1st algorithm of selectlimit. - var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS' - var $dateformat = 'YYYY-MM-DD'; // DBDate format - var $useDBDateFormatForTextInput=false; - var $datetime = false; // MetaType('DATE') returns 'D' (datetime==false) or 'T' (datetime == true) - var $_refLOBs = array(); - - // var $ansiOuter = true; // if oracle9 - - function ADODB_oci8() - { - $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200; - if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_'; - } - - /* function MetaColumns($table) added by smondino@users.sourceforge.net*/ - function MetaColumns($table) - { - global $ADODB_FETCH_MODE; - - $false = false; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - - $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); - - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - if (!$rs) { - return $false; - } - $retarr = array(); - while (!$rs->EOF) { //print_r($rs->fields); - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $fld->type = $rs->fields[1]; - $fld->max_length = $rs->fields[2]; - $fld->scale = $rs->fields[3]; - if ($rs->fields[1] == 'NUMBER') { - if ($rs->fields[3] == 0) $fld->type = 'INT'; - $fld->max_length = $rs->fields[4]; - } - $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0); - $fld->binary = (strpos($fld->type,'BLOB') !== false); - $fld->default_value = $rs->fields[6]; - - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[strtoupper($fld->name)] = $fld; - $rs->MoveNext(); - } - $rs->Close(); - if (empty($retarr)) - return $false; - else - return $retarr; - } - - function Time() - { - $rs = $this->Execute("select TO_CHAR($this->sysTimeStamp,'YYYY-MM-DD HH24:MI:SS') from dual"); - if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); - - return false; - } - - /* - - Multiple modes of connection are supported: - - a. Local Database - $conn->Connect(false,'scott','tiger'); - - b. From tnsnames.ora - $conn->Connect(false,'scott','tiger',$tnsname); - $conn->Connect($tnsname,'scott','tiger'); - - c. Server + service name - $conn->Connect($serveraddress,'scott,'tiger',$service_name); - - d. Server + SID - $conn->connectSID = true; - $conn->Connect($serveraddress,'scott,'tiger',$SID); - - - Example TNSName: - --------------- - NATSOFT.DOMAIN = - (DESCRIPTION = - (ADDRESS_LIST = - (ADDRESS = (PROTOCOL = TCP)(HOST = kermit)(PORT = 1523)) - ) - (CONNECT_DATA = - (SERVICE_NAME = natsoft.domain) - ) - ) - - There are 3 connection modes, 0 = non-persistent, 1 = persistent, 2 = force new connection - - */ - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$mode=0) - { - if (!function_exists('OCIPLogon')) return null; - - - $this->_errorMsg = false; - $this->_errorCode = false; - - if($argHostname) { // added by Jorma Tuomainen - if (empty($argDatabasename)) $argDatabasename = $argHostname; - else { - if(strpos($argHostname,":")) { - $argHostinfo=explode(":",$argHostname); - $argHostname=$argHostinfo[0]; - $argHostport=$argHostinfo[1]; - } else { - $argHostport = empty($this->port)? "1521" : $this->port; - } - - if ($this->connectSID) { - $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname - .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))"; - } else - $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname - .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))"; - } - } - - //if ($argHostname) print "

        Connect: 1st argument should be left blank for $this->databaseType

        "; - if ($mode==1) { - $this->_connectionID = ($this->charSet) ? - OCIPLogon($argUsername,$argPassword, $argDatabasename,$this->charSet) - : - OCIPLogon($argUsername,$argPassword, $argDatabasename) - ; - if ($this->_connectionID && $this->autoRollback) OCIrollback($this->_connectionID); - } else if ($mode==2) { - $this->_connectionID = ($this->charSet) ? - OCINLogon($argUsername,$argPassword, $argDatabasename,$this->charSet) - : - OCINLogon($argUsername,$argPassword, $argDatabasename); - - } else { - $this->_connectionID = ($this->charSet) ? - OCILogon($argUsername,$argPassword, $argDatabasename,$this->charSet) - : - OCILogon($argUsername,$argPassword, $argDatabasename); - } - if (!$this->_connectionID) return false; - if ($this->_initdate) { - $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'"); - } - - // looks like: - // Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production - // $vers = OCIServerVersion($this->_connectionID); - // if (strpos($vers,'8i') !== false) $this->ansiOuter = true; - return true; - } - - function ServerInfo() - { - $arr['compat'] = $this->GetOne('select value from sys.database_compatible_level'); - $arr['description'] = @OCIServerVersion($this->_connectionID); - $arr['version'] = ADOConnection::_findvers($arr['description']); - return $arr; - } - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,1); - } - - // returns true or false - function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,2); - } - - function _affectedrows() - { - if (is_resource($this->_stmt)) return @OCIRowCount($this->_stmt); - return 0; - } - - function IfNull( $field, $ifNull ) - { - return " NVL($field, $ifNull) "; // if Oracle - } - - // format and return date string in database date format - function DBDate($d) - { - if (empty($d) && $d !== 0) return 'null'; - - if (is_string($d)) $d = ADORecordSet::UnixDate($d); - return "TO_DATE(".adodb_date($this->fmtDate,$d).",'".$this->dateformat."')"; - } - - function BindDate($d) - { - $d = ADOConnection::DBDate($d); - if (strncmp($d,"'",1)) return $d; - - return substr($d,1,strlen($d)-2); - } - - function BindTimeStamp($d) - { - $d = ADOConnection::DBTimeStamp($d); - if (strncmp($d,"'",1)) return $d; - - return substr($d,1,strlen($d)-2); - } - - // format and return date string in database timestamp format - function DBTimeStamp($ts) - { - if (empty($ts) && $ts !== 0) return 'null'; - if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); - return 'TO_DATE('.adodb_date("'Y-m-d H:i:s'",$ts).",'RRRR-MM-DD, HH24:MI:SS')"; - } - - function RowLock($tables,$where,$flds='1 as ignore') - { - if ($this->autoCommit) $this->BeginTrans(); - return $this->GetOne("select $flds from $tables where $where for update"); - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr(strtoupper($mask)); - $this->metaTablesSQL .= " AND upper(table_name) like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } - - // Mark Newnham - function MetaIndexes ($table, $primary = FALSE, $owner=false) - { - // save old fetch mode - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - // get index details - $table = strtoupper($table); - - // get Primary index - $primary_key = ''; - - $false = false; - $rs = $this->Execute(sprintf("SELECT * FROM ALL_CONSTRAINTS WHERE UPPER(TABLE_NAME)='%s' AND CONSTRAINT_TYPE='P'",$table)); - if ($row = $rs->FetchRow()) - $primary_key = $row[1]; //constraint_name - - if ($primary==TRUE && $primary_key=='') { - if (isset($savem)) - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - return $false; //There is no primary key - } - - $rs = $this->Execute(sprintf("SELECT ALL_INDEXES.INDEX_NAME, ALL_INDEXES.UNIQUENESS, ALL_IND_COLUMNS.COLUMN_POSITION, ALL_IND_COLUMNS.COLUMN_NAME FROM ALL_INDEXES,ALL_IND_COLUMNS WHERE UPPER(ALL_INDEXES.TABLE_NAME)='%s' AND ALL_IND_COLUMNS.INDEX_NAME=ALL_INDEXES.INDEX_NAME",$table)); - - - if (!is_object($rs)) { - if (isset($savem)) - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - return $false; - } - - $indexes = array (); - // parse index data into array - - while ($row = $rs->FetchRow()) { - if ($primary && $row[0] != $primary_key) continue; - if (!isset($indexes[$row[0]])) { - $indexes[$row[0]] = array( - 'unique' => ($row[1] == 'UNIQUE'), - 'columns' => array() - ); - } - $indexes[$row[0]]['columns'][$row[2] - 1] = $row[3]; - } - - // sort columns by order in the index - foreach ( array_keys ($indexes) as $index ) { - ksort ($indexes[$index]['columns']); - } - - if (isset($savem)) { - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - } - return $indexes; - } - - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - $this->autoCommit = false; - $this->_commit = OCI_DEFAULT; - - if ($this->_transmode) $this->Execute("SET TRANSACTION ".$this->_transmode); - return true; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - - if ($this->transCnt) $this->transCnt -= 1; - $ret = OCIcommit($this->_connectionID); - $this->_commit = OCI_COMMIT_ON_SUCCESS; - $this->autoCommit = true; - return $ret; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $ret = OCIrollback($this->_connectionID); - $this->_commit = OCI_COMMIT_ON_SUCCESS; - $this->autoCommit = true; - return $ret; - } - - - function SelectDB($dbName) - { - return false; - } - - function ErrorMsg() - { - if ($this->_errorMsg !== false) return $this->_errorMsg; - - if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt); - if (empty($arr)) { - if (is_resource($this->_connectionID)) $arr = @OCIError($this->_connectionID); - else $arr = @OCIError(); - if ($arr === false) return ''; - } - $this->_errorMsg = $arr['message']; - $this->_errorCode = $arr['code']; - return $this->_errorMsg; - } - - function ErrorNo() - { - if ($this->_errorCode !== false) return $this->_errorCode; - - if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt); - if (empty($arr)) { - $arr = @OCIError($this->_connectionID); - if ($arr == false) $arr = @OCIError(); - if ($arr == false) return ''; - } - - $this->_errorMsg = $arr['message']; - $this->_errorCode = $arr['code']; - - return $arr['code']; - } - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysTimeStamp; - $s = 'TO_CHAR('.$col.",'"; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= 'YYYY'; - break; - case 'Q': - case 'q': - $s .= 'Q'; - break; - - case 'M': - $s .= 'Mon'; - break; - - case 'm': - $s .= 'MM'; - break; - case 'D': - case 'd': - $s .= 'DD'; - break; - - case 'H': - $s.= 'HH24'; - break; - - case 'h': - $s .= 'HH'; - break; - - case 'i': - $s .= 'MI'; - break; - - case 's': - $s .= 'SS'; - break; - - case 'a': - case 'A': - $s .= 'AM'; - break; - - case 'w': - $s .= 'D'; - break; - - case 'l': - $s .= 'DAY'; - break; - - case 'W': - $s .= 'WW'; - break; - - default: - // handle escape characters... - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - if (strpos('-/.:;, ',$ch) !== false) $s .= $ch; - else $s .= '"'.$ch.'"'; - - } - } - return $s. "')"; - } - - function GetRandRow($sql, $arr = false) - { - $sql = "SELECT * FROM ($sql ORDER BY dbms_random.value) WHERE rownum = 1"; - - return $this->GetRow($sql,$arr); - } - - /* - This algorithm makes use of - - a. FIRST_ROWS hint - The FIRST_ROWS hint explicitly chooses the approach to optimize response time, - that is, minimum resource usage to return the first row. Results will be returned - as soon as they are identified. - - b. Uses rownum tricks to obtain only the required rows from a given offset. - As this uses complicated sql statements, we only use this if the $offset >= 100. - This idea by Tomas V V Cox. - - This implementation does not appear to work with oracle 8.0.5 or earlier. Comment - out this function then, and the slower SelectLimit() in the base class will be used. - */ - function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) - { - // seems that oracle only supports 1 hint comment in 8i - if ($this->firstrows) { - if (strpos($sql,'/*+') !== false) - $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql); - else - $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql); - } - - if ($offset < $this->selectOffsetAlg1 && 0 < $nrows && $nrows < 1000) { - if ($nrows > 0) { - if ($offset > 0) $nrows += $offset; - //$inputarr['adodb_rownum'] = $nrows; - if ($this->databaseType == 'oci8po') { - $sql = "select * from (".$sql.") where rownum <= ?"; - } else { - $sql = "select * from (".$sql.") where rownum <= :adodb_offset"; - } - $inputarr['adodb_offset'] = $nrows; - $nrows = -1; - } - // note that $nrows = 0 still has to work ==> no rows returned - - $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - return $rs; - - } else { - // Algorithm by Tomas V V Cox, from PEAR DB oci8.php - - // Let Oracle return the name of the columns - $q_fields = "SELECT * FROM (".$sql.") WHERE NULL = NULL"; - - $false = false; - if (! $stmt_arr = $this->Prepare($q_fields)) { - return $false; - } - $stmt = $stmt_arr[1]; - - if (is_array($inputarr)) { - foreach($inputarr as $k => $v) { - if (is_array($v)) { - if (sizeof($v) == 2) // suggested by g.giunta@libero. - OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]); - else - OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]); - } else { - $len = -1; - if ($v === ' ') $len = 1; - if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again - $bindarr[$k] = $v; - } else { // dynamic sql, so rebind every time - OCIBindByName($stmt,":$k",$inputarr[$k],$len); - } - } - } - } - - if (!OCIExecute($stmt, OCI_DEFAULT)) { - OCIFreeStatement($stmt); - return $false; - } - - $ncols = OCINumCols($stmt); - for ( $i = 1; $i <= $ncols; $i++ ) { - $cols[] = '"'.OCIColumnName($stmt, $i).'"'; - } - $result = false; - - OCIFreeStatement($stmt); - $fields = implode(',', $cols); - $nrows += $offset; - $offset += 1; // in Oracle rownum starts at 1 - - if ($this->databaseType == 'oci8po') { - $sql = "SELECT $fields FROM". - "(SELECT rownum as adodb_rownum, $fields FROM". - " ($sql) WHERE rownum <= ?". - ") WHERE adodb_rownum >= ?"; - } else { - $sql = "SELECT $fields FROM". - "(SELECT rownum as adodb_rownum, $fields FROM". - " ($sql) WHERE rownum <= :adodb_nrows". - ") WHERE adodb_rownum >= :adodb_offset"; - } - $inputarr['adodb_nrows'] = $nrows; - $inputarr['adodb_offset'] = $offset; - - if ($secs2cache>0) $rs = $this->CacheExecute($secs2cache, $sql,$inputarr); - else $rs = $this->Execute($sql,$inputarr); - return $rs; - } - - } - - /** - * Usage: - * Store BLOBs and CLOBs - * - * Example: to store $var in a blob - * - * $conn->Execute('insert into TABLE (id,ablob) values(12,empty_blob())'); - * $conn->UpdateBlob('TABLE', 'ablob', $varHoldingBlob, 'ID=12', 'BLOB'); - * - * $blobtype supports 'BLOB' and 'CLOB', but you need to change to 'empty_clob()'. - * - * to get length of LOB: - * select DBMS_LOB.GETLENGTH(ablob) from TABLE - * - * If you are using CURSOR_SHARING = force, it appears this will case a segfault - * under oracle 8.1.7.0. Run: - * $db->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); - * before UpdateBlob() then... - */ - - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - - //if (strlen($val) < 4000) return $this->Execute("UPDATE $table SET $column=:blob WHERE $where",array('blob'=>$val)) != false; - - switch(strtoupper($blobtype)) { - default: ADOConnection::outp("UpdateBlob: Unknown blobtype=$blobtype"); return false; - case 'BLOB': $type = OCI_B_BLOB; break; - case 'CLOB': $type = OCI_B_CLOB; break; - } - - if ($this->databaseType == 'oci8po') - $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?"; - else - $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob"; - - $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB); - $arr['blob'] = array($desc,-1,$type); - if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); - $commit = $this->autoCommit; - if ($commit) $this->BeginTrans(); - $rs = $this->_Execute($sql,$arr); - if ($rez = !empty($rs)) $desc->save($val); - $desc->free(); - if ($commit) $this->CommitTrans(); - if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=FORCE'); - - if ($rez) $rs->Close(); - return $rez; - } - - /** - * Usage: store file pointed to by $var in a blob - */ - function UpdateBlobFile($table,$column,$val,$where,$blobtype='BLOB') - { - switch(strtoupper($blobtype)) { - default: ADOConnection::outp( "UpdateBlob: Unknown blobtype=$blobtype"); return false; - case 'BLOB': $type = OCI_B_BLOB; break; - case 'CLOB': $type = OCI_B_CLOB; break; - } - - if ($this->databaseType == 'oci8po') - $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?"; - else - $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob"; - - $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB); - $arr['blob'] = array($desc,-1,$type); - - $this->BeginTrans(); - $rs = ADODB_oci8::Execute($sql,$arr); - if ($rez = !empty($rs)) $desc->savefile($val); - $desc->free(); - $this->CommitTrans(); - - if ($rez) $rs->Close(); - return $rez; - } - - /** - * Execute SQL - * - * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text) - * @param [inputarr] holds the input data to bind to. Null elements will be set to null. - * @return RecordSet or false - */ - function Execute($sql,$inputarr=false) - { - if ($this->fnExecute) { - $fn = $this->fnExecute; - $ret = $fn($this,$sql,$inputarr); - if (isset($ret)) return $ret; - } - if ($inputarr) { - #if (!is_array($inputarr)) $inputarr = array($inputarr); - - $element0 = reset($inputarr); - - # is_object check because oci8 descriptors can be passed in - if (is_array($element0) && !is_object(reset($element0))) { - if (is_string($sql)) - $stmt = $this->Prepare($sql); - else - $stmt = $sql; - - foreach($inputarr as $arr) { - $ret = $this->_Execute($stmt,$arr); - if (!$ret) return $ret; - } - } else { - $ret = $this->_Execute($sql,$inputarr); - } - - } else { - $ret = $this->_Execute($sql,false); - } - - return $ret; - } - - /* - Example of usage: - - $stmt = $this->Prepare('insert into emp (empno, ename) values (:empno, :ename)'); - */ - function Prepare($sql,$cursor=false) - { - static $BINDNUM = 0; - - $stmt = OCIParse($this->_connectionID,$sql); - - if (!$stmt) { - $this->_errorMsg = false; - $this->_errorCode = false; - $arr = @OCIError($this->_connectionID); - if ($arr === false) return false; - - $this->_errorMsg = $arr['message']; - $this->_errorCode = $arr['code']; - return false; - } - - $BINDNUM += 1; - - $sttype = @OCIStatementType($stmt); - if ($sttype == 'BEGIN' || $sttype == 'DECLARE') { - return array($sql,$stmt,0,$BINDNUM, ($cursor) ? OCINewCursor($this->_connectionID) : false); - } - return array($sql,$stmt,0,$BINDNUM); - } - - /* - Call an oracle stored procedure and returns a cursor variable as a recordset. - Concept by Robert Tuttle robert@ud.com - - Example: - Note: we return a cursor variable in :RS2 - $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS2); END;",'RS2'); - - $rs = $db->ExecuteCursor( - "BEGIN :RS2 = adodb.getdata(:VAR1); END;", - 'RS2', - array('VAR1' => 'Mr Bean')); - - */ - function ExecuteCursor($sql,$cursorName='rs',$params=false) - { - if (is_array($sql)) $stmt = $sql; - else $stmt = ADODB_oci8::Prepare($sql,true); # true to allocate OCINewCursor - - if (is_array($stmt) && sizeof($stmt) >= 5) { - $hasref = true; - $ignoreCur = false; - $this->Parameter($stmt, $ignoreCur, $cursorName, false, -1, OCI_B_CURSOR); - if ($params) { - foreach($params as $k => $v) { - $this->Parameter($stmt,$params[$k], $k); - } - } - } else - $hasref = false; - - $rs = $this->Execute($stmt); - if ($rs) { - if ($rs->databaseType == 'array') OCIFreeCursor($stmt[4]); - else if ($hasref) $rs->_refcursor = $stmt[4]; - } - return $rs; - } - - /* - Bind a variable -- very, very fast for executing repeated statements in oracle. - Better than using - for ($i = 0; $i < $max; $i++) { - $p1 = ?; $p2 = ?; $p3 = ?; - $this->Execute("insert into table (col0, col1, col2) values (:0, :1, :2)", - array($p1,$p2,$p3)); - } - - Usage: - $stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)"); - $DB->Bind($stmt, $p1); - $DB->Bind($stmt, $p2); - $DB->Bind($stmt, $p3); - for ($i = 0; $i < $max; $i++) { - $p1 = ?; $p2 = ?; $p3 = ?; - $DB->Execute($stmt); - } - - Some timings: - ** Test table has 3 cols, and 1 index. Test to insert 1000 records - Time 0.6081s (1644.60 inserts/sec) with direct OCIParse/OCIExecute - Time 0.6341s (1577.16 inserts/sec) with ADOdb Prepare/Bind/Execute - Time 1.5533s ( 643.77 inserts/sec) with pure SQL using Execute - - Now if PHP only had batch/bulk updating like Java or PL/SQL... - - Note that the order of parameters differs from OCIBindByName, - because we default the names to :0, :1, :2 - */ - function Bind(&$stmt,&$var,$size=4000,$type=false,$name=false,$isOutput=false) - { - - if (!is_array($stmt)) return false; - - if (($type == OCI_B_CURSOR) && sizeof($stmt) >= 5) { - return OCIBindByName($stmt[1],":".$name,$stmt[4],$size,$type); - } - - if ($name == false) { - if ($type !== false) $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size,$type); - else $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size); // +1 byte for null terminator - $stmt[2] += 1; - } else if (oci_lob_desc($type)) { - if ($this->debug) { - ADOConnection::outp("Bind: name = $name"); - } - //we have to create a new Descriptor here - $numlob = count($this->_refLOBs); - $this->_refLOBs[$numlob]['LOB'] = OCINewDescriptor($this->_connectionID, oci_lob_desc($type)); - $this->_refLOBs[$numlob]['TYPE'] = $isOutput; - - $tmp = $this->_refLOBs[$numlob]['LOB']; - $rez = OCIBindByName($stmt[1], ":".$name, $tmp, -1, $type); - if ($this->debug) { - ADOConnection::outp("Bind: descriptor has been allocated, var (".$name.") binded"); - } - - // if type is input then write data to lob now - if ($isOutput == false) { - $var = $this->BlobEncode($var); - $tmp->WriteTemporary($var); - $this->_refLOBs[$numlob]['VAR'] = $var; - if ($this->debug) { - ADOConnection::outp("Bind: LOB has been written to temp"); - } - } else { - $this->_refLOBs[$numlob]['VAR'] = $var; - } - $rez = $tmp; - } else { - if ($this->debug) - ADOConnection::outp("Bind: name = $name"); - - if ($type !== false) $rez = OCIBindByName($stmt[1],":".$name,$var,$size,$type); - else $rez = OCIBindByName($stmt[1],":".$name,$var,$size); // +1 byte for null terminator - } - - return $rez; - } - - function Param($name,$type=false) - { - return ':'.$name; - } - - /* - Usage: - $stmt = $db->Prepare('select * from table where id =:myid and group=:group'); - $db->Parameter($stmt,$id,'myid'); - $db->Parameter($stmt,$group,'group'); - $db->Execute($stmt); - - @param $stmt Statement returned by Prepare() or PrepareSP(). - @param $var PHP variable to bind to - @param $name Name of stored procedure variable name to bind to. - @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. - @param [$maxLen] Holds an maximum length of the variable. - @param [$type] The data type of $var. Legal values depend on driver. - - See OCIBindByName documentation at php.net. - */ - function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false) - { - if ($this->debug) { - $prefix = ($isOutput) ? 'Out' : 'In'; - $ztype = (empty($type)) ? 'false' : $type; - ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);"); - } - return $this->Bind($stmt,$var,$maxLen,$type,$name,$isOutput); - } - - /* - returns query ID if successful, otherwise false - this version supports: - - 1. $db->execute('select * from table'); - - 2. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)'); - $db->execute($prepared_statement, array(1,2,3)); - - 3. $db->execute('insert into table (a,b,c) values (:a,:b,:c)',array('a'=>1,'b'=>2,'c'=>3)); - - 4. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)'); - $db->bind($stmt,1); $db->bind($stmt,2); $db->bind($stmt,3); - $db->execute($stmt); - */ - function _query($sql,$inputarr) - { - if (is_array($sql)) { // is prepared sql - $stmt = $sql[1]; - - // we try to bind to permanent array, so that OCIBindByName is persistent - // and carried out once only - note that max array element size is 4000 chars - if (is_array($inputarr)) { - $bindpos = $sql[3]; - if (isset($this->_bind[$bindpos])) { - // all tied up already - $bindarr = $this->_bind[$bindpos]; - } else { - // one statement to bind them all - $bindarr = array(); - foreach($inputarr as $k => $v) { - $bindarr[$k] = $v; - OCIBindByName($stmt,":$k",$bindarr[$k],is_string($v) && strlen($v)>4000 ? -1 : 4000); - } - $this->_bind[$bindpos] = $bindarr; - } - } - } else { - $stmt=OCIParse($this->_connectionID,$sql); - } - - $this->_stmt = $stmt; - if (!$stmt) return false; - - if (defined('ADODB_PREFETCH_ROWS')) @OCISetPrefetch($stmt,ADODB_PREFETCH_ROWS); - - if (is_array($inputarr)) { - foreach($inputarr as $k => $v) { - if (is_array($v)) { - if (sizeof($v) == 2) // suggested by g.giunta@libero. - OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]); - else - OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]); - - if ($this->debug==99) { - if (is_object($v[0])) - echo "name=:$k",' len='.$v[1],' type='.$v[2],'
        '; - else - echo "name=:$k",' var='.$inputarr[$k][0],' len='.$v[1],' type='.$v[2],'
        '; - - } - } else { - $len = -1; - if ($v === ' ') $len = 1; - if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again - $bindarr[$k] = $v; - } else { // dynamic sql, so rebind every time - OCIBindByName($stmt,":$k",$inputarr[$k],$len); - } - } - } - } - - $this->_errorMsg = false; - $this->_errorCode = false; - if (OCIExecute($stmt,$this->_commit)) { - //OCIInternalDebug(1); - if (count($this -> _refLOBs) > 0) { - - foreach ($this -> _refLOBs as $key => $value) { - if ($this -> _refLOBs[$key]['TYPE'] == true) { - $tmp = $this -> _refLOBs[$key]['LOB'] -> load(); - if ($this -> debug) { - ADOConnection::outp("OUT LOB: LOB has been loaded.
        "); - } - //$_GLOBALS[$this -> _refLOBs[$key]['VAR']] = $tmp; - $this -> _refLOBs[$key]['VAR'] = $tmp; - } else { - $this->_refLOBs[$key]['LOB']->save($this->_refLOBs[$key]['VAR']); - $this -> _refLOBs[$key]['LOB']->free(); - unset($this -> _refLOBs[$key]); - if ($this->debug) { - ADOConnection::outp("IN LOB: LOB has been saved.
        "); - } - } - } - } - - switch (@OCIStatementType($stmt)) { - case "SELECT": - return $stmt; - - case 'DECLARE': - case "BEGIN": - if (is_array($sql) && !empty($sql[4])) { - $cursor = $sql[4]; - if (is_resource($cursor)) { - $ok = OCIExecute($cursor); - return $cursor; - } - return $stmt; - } else { - if (is_resource($stmt)) { - OCIFreeStatement($stmt); - return true; - } - return $stmt; - } - break; - default : - // ociclose -- no because it could be used in a LOB? - return true; - } - } - return false; - } - - // returns true or false - function _close() - { - if (!$this->_connectionID) return; - - if (!$this->autoCommit) OCIRollback($this->_connectionID); - if (count($this->_refLOBs) > 0) { - foreach ($this ->_refLOBs as $key => $value) { - $this->_refLOBs[$key]['LOB']->free(); - unset($this->_refLOBs[$key]); - } - } - OCILogoff($this->_connectionID); - - $this->_stmt = false; - $this->_connectionID = false; - } - - function MetaPrimaryKeys($table, $owner=false,$internalKey=false) - { - if ($internalKey) return array('ROWID'); - - // tested with oracle 8.1.7 - $table = strtoupper($table); - if ($owner) { - $owner_clause = "AND ((a.OWNER = b.OWNER) AND (a.OWNER = UPPER('$owner')))"; - $ptab = 'ALL_'; - } else { - $owner_clause = ''; - $ptab = 'USER_'; - } - $sql = " -SELECT /*+ RULE */ distinct b.column_name - FROM {$ptab}CONSTRAINTS a - , {$ptab}CONS_COLUMNS b - WHERE ( UPPER(b.table_name) = ('$table')) - AND (UPPER(a.table_name) = ('$table') and a.constraint_type = 'P') - $owner_clause - AND (a.constraint_name = b.constraint_name)"; - - $rs = $this->Execute($sql); - if ($rs && !$rs->EOF) { - $arr = $rs->GetArray(); - $a = array(); - foreach($arr as $v) { - $a[] = reset($v); - } - return $a; - } - else return false; - } - - // http://gis.mit.edu/classes/11.521/sqlnotes/referential_integrity.html - function MetaForeignKeys($table, $owner=false) - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $table = $this->qstr(strtoupper($table)); - if (!$owner) { - $owner = $this->user; - $tabp = 'user_'; - } else - $tabp = 'all_'; - - $owner = ' and owner='.$this->qstr(strtoupper($owner)); - - $sql = -"select constraint_name,r_owner,r_constraint_name - from {$tabp}constraints - where constraint_type = 'R' and table_name = $table $owner"; - - $constraints = $this->GetArray($sql); - $arr = false; - foreach($constraints as $constr) { - $cons = $this->qstr($constr[0]); - $rowner = $this->qstr($constr[1]); - $rcons = $this->qstr($constr[2]); - $cols = $this->GetArray("select column_name from {$tabp}cons_columns where constraint_name=$cons $owner order by position"); - $tabcol = $this->GetArray("select table_name,column_name from {$tabp}cons_columns where owner=$rowner and constraint_name=$rcons order by position"); - - if ($cols && $tabcol) - for ($i=0, $max=sizeof($cols); $i < $max; $i++) { - $arr[$tabcol[$i][0]] = $cols[$i][0].'='.$tabcol[$i][1]; - } - } - $ADODB_FETCH_MODE = $save; - - return $arr; - } - - - function CharMax() - { - return 4000; - } - - function TextMax() - { - return 4000; - } - - /** - * Quotes a string. - * An example is $db->qstr("Don't bother",magic_quotes_runtime()); - * - * @param s the string to quote - * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). - * This undoes the stupidity of magic quotes for GPC. - * - * @return quoted string to be sent back to database - */ - function qstr($s,$magic_quotes=false) - { - //$nofixquotes=false; - - if ($this->noNullStrings && strlen($s)==0)$s = ' '; - if (!$magic_quotes) { - if ($this->replaceQuote[0] == '\\'){ - $s = str_replace('\\','\\\\',$s); - } - return "'".str_replace("'",$this->replaceQuote,$s)."'"; - } - - // undo magic quotes for " - $s = str_replace('\\"','"',$s); - - $s = str_replace('\\\\','\\',$s); - return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; - - } - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_oci8 extends ADORecordSet { - - var $databaseType = 'oci8'; - var $bind=false; - var $_fieldobjs; - - //var $_arr = false; - - function ADORecordset_oci8($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - case ADODB_FETCH_NUM: - default: - $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - } - - $this->adodbFetchMode = $mode; - $this->_queryID = $queryID; - } - - - function Init() - { - if ($this->_inited) return; - - $this->_inited = true; - if ($this->_queryID) { - - $this->_currentRow = 0; - @$this->_initrs(); - $this->EOF = !$this->_fetch(); - - /* - // based on idea by Gaetano Giunta to detect unusual oracle errors - // see http://phplens.com/lens/lensforum/msgs.php?id=6771 - $err = OCIError($this->_queryID); - if ($err && $this->connection->debug) ADOConnection::outp($err); - */ - - if (!is_array($this->fields)) { - $this->_numOfRows = 0; - $this->fields = array(); - } - } else { - $this->fields = array(); - $this->_numOfRows = 0; - $this->_numOfFields = 0; - $this->EOF = true; - } - } - - function _initrs() - { - $this->_numOfRows = -1; - $this->_numOfFields = OCInumcols($this->_queryID); - if ($this->_numOfFields>0) { - $this->_fieldobjs = array(); - $max = $this->_numOfFields; - for ($i=0;$i<$max; $i++) $this->_fieldobjs[] = $this->_FetchField($i); - } - } - - /* Returns: an object containing field information. - Get column information in the Recordset object. fetchField() can be used in order to obtain information about - fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by - fetchField() is retrieved. */ - - function _FetchField($fieldOffset = -1) - { - $fld = new ADOFieldObject; - $fieldOffset += 1; - $fld->name =OCIcolumnname($this->_queryID, $fieldOffset); - $fld->type = OCIcolumntype($this->_queryID, $fieldOffset); - $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset); - switch($fld->type) { - case 'NUMBER': - $p = OCIColumnPrecision($this->_queryID, $fieldOffset); - $sc = OCIColumnScale($this->_queryID, $fieldOffset); - if ($p != 0 && $sc == 0) $fld->type = 'INT'; - break; - - case 'CLOB': - case 'NCLOB': - case 'BLOB': - $fld->max_length = -1; - break; - } - return $fld; - } - - /* For some reason, OCIcolumnname fails when called after _initrs() so we cache it */ - function FetchField($fieldOffset = -1) - { - return $this->_fieldobjs[$fieldOffset]; - } - - - /* - // 10% speedup to move MoveNext to child class - function _MoveNext() - { - //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this); - - if ($this->EOF) return false; - - $this->_currentRow++; - if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) - return true; - $this->EOF = true; - - return false; - } */ - - - function MoveNext() - { - if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { - $this->_currentRow += 1; - return true; - } - if (!$this->EOF) { - $this->_currentRow += 1; - $this->EOF = true; - } - return false; - } - - /* - # does not work as first record is retrieved in _initrs(), so is not included in GetArray() - function GetArray($nRows = -1) - { - global $ADODB_OCI8_GETARRAY; - - if (true || !empty($ADODB_OCI8_GETARRAY)) { - # does not support $ADODB_ANSI_PADDING_OFF - - //OCI_RETURN_NULLS and OCI_RETURN_LOBS is set by OCIfetchstatement - switch($this->adodbFetchMode) { - case ADODB_FETCH_NUM: - - $ncols = @OCIfetchstatement($this->_queryID, $results, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW+OCI_NUM); - $results = array_merge(array($this->fields),$results); - return $results; - - case ADODB_FETCH_ASSOC: - if (ADODB_ASSOC_CASE != 2 || $this->databaseType != 'oci8') break; - - $ncols = @OCIfetchstatement($this->_queryID, $assoc, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW); - $results = array_merge(array($this->fields),$assoc); - return $results; - - default: - break; - } - } - - $results = ADORecordSet::GetArray($nRows); - return $results; - - } */ - - /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */ - function GetArrayLimit($nrows,$offset=-1) - { - if ($offset <= 0) { - $arr = $this->GetArray($nrows); - return $arr; - } - $arr = array(); - for ($i=1; $i < $offset; $i++) - if (!@OCIFetch($this->_queryID)) return $arr; - - if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return $arr;; - $results = array(); - $cnt = 0; - while (!$this->EOF && $nrows != $cnt) { - $results[$cnt++] = $this->fields; - $this->MoveNext(); - } - - return $results; - } - - - /* Use associative array to get fields array */ - function Fields($colname) - { - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - - - function _seek($row) - { - return false; - } - - function _fetch() - { - return @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode); - } - - /* close() only needs to be called if you are worried about using too much memory while your script - is running. All associated result memory for the specified result identifier will automatically be freed. */ - - function _close() - { - if ($this->connection->_stmt === $this->_queryID) $this->connection->_stmt = false; - if (!empty($this->_refcursor)) { - OCIFreeCursor($this->_refcursor); - $this->_refcursor = false; - } - @OCIFreeStatement($this->_queryID); - $this->_queryID = false; - - } - - function MetaType($t,$len=-1) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - switch (strtoupper($t)) { - case 'VARCHAR': - case 'VARCHAR2': - case 'CHAR': - case 'VARBINARY': - case 'BINARY': - case 'NCHAR': - case 'NVARCHAR': - case 'NVARCHAR2': - if (isset($this) && $len <= $this->blobSize) return 'C'; - - case 'NCLOB': - case 'LONG': - case 'LONG VARCHAR': - case 'CLOB': - return 'X'; - - case 'LONG RAW': - case 'LONG VARBINARY': - case 'BLOB': - return 'B'; - - case 'DATE': - return ($this->connection->datetime) ? 'T' : 'D'; - - - case 'TIMESTAMP': return 'T'; - - case 'INT': - case 'SMALLINT': - case 'INTEGER': - return 'I'; - - default: return 'N'; - } - } -} - -class ADORecordSet_ext_oci8 extends ADORecordSet_oci8 { - function ADORecordSet_ext_oci8($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - case ADODB_FETCH_NUM: - default: $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break; - } - $this->adodbFetchMode = $mode; - $this->_queryID = $queryID; - } - - function MoveNext() - { - return adodb_movenext($this); - } -} -?> diff --git a/include/limesurvey/classes/adodb/drivers/adodb-oci805.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-oci805.inc.php deleted file mode 100644 index 5bac52bf..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-oci805.inc.php +++ /dev/null @@ -1,59 +0,0 @@ -ADODB_oci8(); - } - - function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) - { - // seems that oracle only supports 1 hint comment in 8i - if (strpos($sql,'/*+') !== false) - $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql); - else - $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql); - - /* - The following is only available from 8.1.5 because order by in inline views not - available before then... - http://www.jlcomp.demon.co.uk/faq/top_sql.html - if ($nrows > 0) { - if ($offset > 0) $nrows += $offset; - $sql = "select * from ($sql) where rownum <= $nrows"; - $nrows = -1; - } - */ - - return ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - } -} - -class ADORecordset_oci805 extends ADORecordset_oci8 { - var $databaseType = "oci805"; - function ADORecordset_oci805($id,$mode=false) - { - $this->ADORecordset_oci8($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-oci8po.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-oci8po.inc.php deleted file mode 100644 index abe2667f..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-oci8po.inc.php +++ /dev/null @@ -1,218 +0,0 @@ - - - Should some emulation of RecordCount() be implemented? - - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php'); - -class ADODB_oci8po extends ADODB_oci8 { - var $databaseType = 'oci8po'; - var $dataProvider = 'oci8'; - var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net - var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')"; - - function ADODB_oci8po() - { - $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200; - # oci8po does not support adodb extension: adodb_movenext() - } - - function Param($name) - { - return '?'; - } - - function Prepare($sql,$cursor=false) - { - $sqlarr = explode('?',$sql); - $sql = $sqlarr[0]; - for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) { - $sql .= ':'.($i-1) . $sqlarr[$i]; - } - return ADODB_oci8::Prepare($sql,$cursor); - } - - // emulate handling of parameters ? ?, replacing with :bind0 :bind1 - function _query($sql,$inputarr=false) - { - if (is_array($inputarr)) { - $i = 0; - if (is_array($sql)) { - foreach($inputarr as $v) { - $arr['bind'.$i++] = $v; - } - } else { - $sqlarr = explode('?',$sql); - $sql = $sqlarr[0]; - foreach($inputarr as $k => $v) { - $sql .= ":$k" . $sqlarr[++$i]; - } - } - } - return ADODB_oci8::_query($sql,$inputarr); - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_oci8po extends ADORecordset_oci8 { - - var $databaseType = 'oci8po'; - - function ADORecordset_oci8po($queryID,$mode=false) - { - $this->ADORecordset_oci8($queryID,$mode); - } - - function Fields($colname) - { - if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname]; - - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - // lowercase field names... - function _FetchField($fieldOffset = -1) - { - $fld = new ADOFieldObject; - $fieldOffset += 1; - $fld->name = OCIcolumnname($this->_queryID, $fieldOffset); - if (ADODB_ASSOC_CASE == 0) $fld->name = strtolower($fld->name); - $fld->type = OCIcolumntype($this->_queryID, $fieldOffset); - $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset); - if ($fld->type == 'NUMBER') { - //$p = OCIColumnPrecision($this->_queryID, $fieldOffset); - $sc = OCIColumnScale($this->_queryID, $fieldOffset); - if ($sc == 0) $fld->type = 'INT'; - } - return $fld; - } - /* - function MoveNext() - { - if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { - $this->_currentRow += 1; - return true; - } - if (!$this->EOF) { - $this->_currentRow += 1; - $this->EOF = true; - } - return false; - }*/ - - // 10% speedup to move MoveNext to child class - function MoveNext() - { - if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { - global $ADODB_ANSI_PADDING_OFF; - $this->_currentRow++; - - if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); - if (!empty($ADODB_ANSI_PADDING_OFF)) { - foreach($this->fields as $k => $v) { - if (is_string($v)) $this->fields[$k] = rtrim($v); - } - } - return true; - } - if (!$this->EOF) { - $this->EOF = true; - $this->_currentRow++; - } - return false; - } - - /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */ - function GetArrayLimit($nrows,$offset=-1) - { - if ($offset <= 0) { - $arr = $this->GetArray($nrows); - return $arr; - } - for ($i=1; $i < $offset; $i++) - if (!@OCIFetch($this->_queryID)) { - $arr = array(); - return $arr; - } - if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { - $arr = array(); - return $arr; - } - if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); - $results = array(); - $cnt = 0; - while (!$this->EOF && $nrows != $cnt) { - $results[$cnt++] = $this->fields; - $this->MoveNext(); - } - - return $results; - } - - // Create associative array - function _updatefields() - { - if (ADODB_ASSOC_CASE == 2) return; // native - - $arr = array(); - $lowercase = (ADODB_ASSOC_CASE == 0); - - foreach($this->fields as $k => $v) { - if (is_integer($k)) $arr[$k] = $v; - else { - if ($lowercase) - $arr[strtolower($k)] = $v; - else - $arr[strtoupper($k)] = $v; - } - } - $this->fields = $arr; - } - - function _fetch() - { - $ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode); - if ($ret) { - global $ADODB_ANSI_PADDING_OFF; - - if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); - if (!empty($ADODB_ANSI_PADDING_OFF)) { - foreach($this->fields as $k => $v) { - if (is_string($v)) $this->fields[$k] = rtrim($v); - } - } - } - return $ret; - } - -} - - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-odbc.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-odbc.inc.php deleted file mode 100644 index c3dbcaee..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-odbc.inc.php +++ /dev/null @@ -1,738 +0,0 @@ -_haserrorfunctions = ADODB_PHPVER >= 0x4050; - $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; - } - - // returns true or false - function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - if (!function_exists('odbc_connect')) return null; - - if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') { - ADOConnection::outp("For odbc Connect(), $argDatabasename is not used. Place dsn in 1st parameter."); - } - if (isset($php_errormsg)) $php_errormsg = ''; - if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword); - else $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,$this->curmode); - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - if (isset($this->connectStmt)) $this->Execute($this->connectStmt); - - return $this->_connectionID != false; - } - - // returns true or false - function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - if (!function_exists('odbc_connect')) return null; - - if (isset($php_errormsg)) $php_errormsg = ''; - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - if ($this->debug && $argDatabasename) { - ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter."); - } - // print "dsn=$argDSN u=$argUsername p=$argPassword
        "; flush(); - if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword); - else $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,$this->curmode); - - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - if ($this->_connectionID && $this->autoRollback) @odbc_rollback($this->_connectionID); - if (isset($this->connectStmt)) $this->Execute($this->connectStmt); - - return $this->_connectionID != false; - } - - - function ServerInfo() - { - - if (!empty($this->host) && ADODB_PHPVER >= 0x4300) { - $dsn = strtoupper($this->host); - $first = true; - $found = false; - - if (!function_exists('odbc_data_source')) return false; - - while(true) { - - $rez = @odbc_data_source($this->_connectionID, - $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT); - $first = false; - if (!is_array($rez)) break; - if (strtoupper($rez['server']) == $dsn) { - $found = true; - break; - } - } - if (!$found) return ADOConnection::ServerInfo(); - if (!isset($rez['version'])) $rez['version'] = ''; - return $rez; - } else { - return ADOConnection::ServerInfo(); - } - } - - - function CreateSequence($seqname='adodbseq',$start=1) - { - if (empty($this->_genSeqSQL)) return false; - $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); - if (!$ok) return false; - $start -= 1; - return $this->Execute("insert into $seqname values($start)"); - } - - var $_dropSeqSQL = 'drop table %s'; - function DropSequence($seqname) - { - if (empty($this->_dropSeqSQL)) return false; - return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); - } - - /* - This algorithm is not very efficient, but works even if table locking - is not available. - - Will return false if unable to generate an ID after $MAXLOOPS attempts. - */ - function GenID($seq='adodbseq',$start=1) - { - // if you have to modify the parameter below, your database is overloaded, - // or you need to implement generation of id's yourself! - $MAXLOOPS = 100; - //$this->debug=1; - while (--$MAXLOOPS>=0) { - $num = $this->GetOne("select id from $seq"); - if ($num === false) { - $this->Execute(sprintf($this->_genSeqSQL ,$seq)); - $start -= 1; - $num = '0'; - $ok = $this->Execute("insert into $seq values($start)"); - if (!$ok) return false; - } - $this->Execute("update $seq set id=id+1 where id=$num"); - - if ($this->affected_rows() > 0) { - $num += 1; - $this->genID = $num; - return $num; - } - } - if ($fn = $this->raiseErrorFn) { - $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); - } - return false; - } - - - function ErrorMsg() - { - if ($this->_haserrorfunctions) { - if ($this->_errorMsg !== false) return $this->_errorMsg; - if (empty($this->_connectionID)) return @odbc_errormsg(); - return @odbc_errormsg($this->_connectionID); - } else return ADOConnection::ErrorMsg(); - } - - function ErrorNo() - { - - if ($this->_haserrorfunctions) { - if ($this->_errorCode !== false) { - // bug in 4.0.6, error number can be corrupted string (should be 6 digits) - return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode; - } - - if (empty($this->_connectionID)) $e = @odbc_error(); - else $e = @odbc_error($this->_connectionID); - - // bug in 4.0.6, error number can be corrupted string (should be 6 digits) - // so we check and patch - if (strlen($e)<=2) return 0; - return $e; - } else return ADOConnection::ErrorNo(); - } - - - - function BeginTrans() - { - if (!$this->hasTransactions) return false; - if ($this->transOff) return true; - $this->transCnt += 1; - $this->_autocommit = false; - return odbc_autocommit($this->_connectionID,false); - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - $ret = odbc_commit($this->_connectionID); - odbc_autocommit($this->_connectionID,true); - return $ret; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - $ret = odbc_rollback($this->_connectionID); - odbc_autocommit($this->_connectionID,true); - return $ret; - } - - function MetaPrimaryKeys($table) - { - global $ADODB_FETCH_MODE; - - if ($this->uCaseTables) $table = strtoupper($table); - $schema = ''; - $this->_findschema($table,$schema); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = @odbc_primarykeys($this->_connectionID,'',$schema,$table); - - if (!$qid) { - $ADODB_FETCH_MODE = $savem; - return false; - } - $rs = new ADORecordSet_odbc($qid); - $ADODB_FETCH_MODE = $savem; - - if (!$rs) return false; - $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; - - $arr = $rs->GetArray(); - $rs->Close(); - //print_r($arr); - $arr2 = array(); - for ($i=0; $i < sizeof($arr); $i++) { - if ($arr[$i][3]) $arr2[] = $arr[$i][3]; - } - return $arr2; - } - - - - function MetaTables($ttype=false) - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = odbc_tables($this->_connectionID); - - $rs = new ADORecordSet_odbc($qid); - - $ADODB_FETCH_MODE = $savem; - if (!$rs) { - $false = false; - return $false; - } - $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; - - $arr = $rs->GetArray(); - //print_r($arr); - - $rs->Close(); - $arr2 = array(); - - if ($ttype) { - $isview = strncmp($ttype,'V',1) === 0; - } - for ($i=0; $i < sizeof($arr); $i++) { - if (!$arr[$i][2]) continue; - $type = $arr[$i][3]; - if ($ttype) { - if ($isview) { - if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2]; - } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2]; - } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2]; - } - return $arr2; - } - - /* - See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp - / SQL data type codes / - #define SQL_UNKNOWN_TYPE 0 - #define SQL_CHAR 1 - #define SQL_NUMERIC 2 - #define SQL_DECIMAL 3 - #define SQL_INTEGER 4 - #define SQL_SMALLINT 5 - #define SQL_FLOAT 6 - #define SQL_REAL 7 - #define SQL_DOUBLE 8 - #if (ODBCVER >= 0x0300) - #define SQL_DATETIME 9 - #endif - #define SQL_VARCHAR 12 - - - / One-parameter shortcuts for date/time data types / - #if (ODBCVER >= 0x0300) - #define SQL_TYPE_DATE 91 - #define SQL_TYPE_TIME 92 - #define SQL_TYPE_TIMESTAMP 93 - - #define SQL_UNICODE (-95) - #define SQL_UNICODE_VARCHAR (-96) - #define SQL_UNICODE_LONGVARCHAR (-97) - */ - function ODBCTypes($t) - { - switch ((integer)$t) { - case 1: - case 12: - case 0: - case -95: - case -96: - return 'C'; - case -97: - case -1: //text - return 'X'; - case -4: //image - return 'B'; - - case 9: - case 91: - return 'D'; - - case 10: - case 11: - case 92: - case 93: - return 'T'; - - case 4: - case 5: - case -6: - return 'I'; - - case -11: // uniqidentifier - return 'R'; - case -7: //bit - return 'L'; - - default: - return 'N'; - } - } - - function MetaColumns($table, $normalize=true) - { - global $ADODB_FETCH_MODE; - - $false = false; - if ($this->uCaseTables) $table = strtoupper($table); - $schema = ''; - $this->_findschema($table,$schema); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - /*if (false) { // after testing, confirmed that the following does not work becoz of a bug - $qid2 = odbc_tables($this->_connectionID); - $rs = new ADORecordSet_odbc($qid2); - $ADODB_FETCH_MODE = $savem; - if (!$rs) return false; - $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; - $rs->_fetch(); - - while (!$rs->EOF) { - if ($table == strtoupper($rs->fields[2])) { - $q = $rs->fields[0]; - $o = $rs->fields[1]; - break; - } - $rs->MoveNext(); - } - $rs->Close(); - - $qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%'); - } */ - - switch ($this->databaseType) { - case 'access': - case 'vfp': - $qid = odbc_columns($this->_connectionID);#,'%','',strtoupper($table),'%'); - break; - - - case 'db2': - $colname = "%"; - $qid = odbc_columns($this->_connectionID, "", $schema, $table, $colname); - break; - - default: - $qid = @odbc_columns($this->_connectionID,'%','%',strtoupper($table),'%'); - if (empty($qid)) $qid = odbc_columns($this->_connectionID); - break; - } - if (empty($qid)) return $false; - - $rs = new ADORecordSet_odbc($qid); - $ADODB_FETCH_MODE = $savem; - - if (!$rs) return $false; - $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; - $rs->_fetch(); - - $retarr = array(); - - /* - $rs->fields indices - 0 TABLE_QUALIFIER - 1 TABLE_SCHEM - 2 TABLE_NAME - 3 COLUMN_NAME - 4 DATA_TYPE - 5 TYPE_NAME - 6 PRECISION - 7 LENGTH - 8 SCALE - 9 RADIX - 10 NULLABLE - 11 REMARKS - */ - while (!$rs->EOF) { - // adodb_pr($rs->fields); - if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) { - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[3]; - $fld->type = $this->ODBCTypes($rs->fields[4]); - - // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp - // access uses precision to store length for char/varchar - if ($fld->type == 'C' or $fld->type == 'X') { - if ($this->databaseType == 'access') - $fld->max_length = $rs->fields[6]; - else if ($rs->fields[4] <= -95) // UNICODE - $fld->max_length = $rs->fields[7]/2; - else - $fld->max_length = $rs->fields[7]; - } else - $fld->max_length = $rs->fields[7]; - $fld->not_null = !empty($rs->fields[10]); - $fld->scale = $rs->fields[8]; - $retarr[strtoupper($fld->name)] = $fld; - } else if (sizeof($retarr)>0) - break; - $rs->MoveNext(); - } - $rs->Close(); //-- crashes 4.03pl1 -- why? - - if (empty($retarr)) $retarr = false; - return $retarr; - } - - function Prepare($sql) - { - if (! $this->_bindInputArray) return $sql; // no binding - $stmt = odbc_prepare($this->_connectionID,$sql); - if (!$stmt) { - // we don't know whether odbc driver is parsing prepared stmts, so just return sql - return $sql; - } - return array($sql,$stmt,false); - } - - /* returns queryID or false */ - function _query($sql,$inputarr=false) - { - GLOBAL $php_errormsg; - if (isset($php_errormsg)) $php_errormsg = ''; - $this->_error = ''; - - if ($inputarr) { - if (is_array($sql)) { - $stmtid = $sql[1]; - } else { - $stmtid = odbc_prepare($this->_connectionID,$sql); - - if ($stmtid == false) { - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - return false; - } - } - - if (! odbc_execute($stmtid,$inputarr)) { - //@odbc_free_result($stmtid); - if ($this->_haserrorfunctions) { - $this->_errorMsg = odbc_errormsg(); - $this->_errorCode = odbc_error(); - } - return false; - } - - } else if (is_array($sql)) { - $stmtid = $sql[1]; - if (!odbc_execute($stmtid)) { - //@odbc_free_result($stmtid); - if ($this->_haserrorfunctions) { - $this->_errorMsg = odbc_errormsg(); - $this->_errorCode = odbc_error(); - } - return false; - } - } else - $stmtid = odbc_exec($this->_connectionID,$sql); - - $this->_lastAffectedRows = 0; - if ($stmtid) { - if (@odbc_num_fields($stmtid) == 0) { - $this->_lastAffectedRows = odbc_num_rows($stmtid); - $stmtid = true; - } else { - $this->_lastAffectedRows = 0; - odbc_binmode($stmtid,$this->binmode); - odbc_longreadlen($stmtid,$this->maxblobsize); - } - - if ($this->_haserrorfunctions) { - $this->_errorMsg = ''; - $this->_errorCode = 0; - } else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - } else { - if ($this->_haserrorfunctions) { - $this->_errorMsg = odbc_errormsg(); - $this->_errorCode = odbc_error(); - } else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : ''; - } - return $stmtid; - } - - /* - Insert a null into the blob field of the table first. - Then use UpdateBlob to store the blob. - - Usage: - - $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; - } - - // returns true or false - function _close() - { - $ret = @odbc_close($this->_connectionID); - $this->_connectionID = false; - return $ret; - } - - function _affectedrows() - { - return $this->_lastAffectedRows; - } - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_odbc extends ADORecordSet { - - var $bind = false; - var $databaseType = "odbc"; - var $dataProvider = "odbc"; - var $useFetchArray; - var $_has_stupid_odbc_fetch_api_change; - - function ADORecordSet_odbc($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - - $this->_queryID = $id; - - // the following is required for mysql odbc driver in 4.3.1 -- why? - $this->EOF = false; - $this->_currentRow = -1; - //$this->ADORecordSet($id); - } - - - // returns the field object - function FetchField($fieldOffset = -1) - { - - $off=$fieldOffset+1; // offsets begin at 1 - - $o= new ADOFieldObject(); - $o->name = @odbc_field_name($this->_queryID,$off); - $o->type = @odbc_field_type($this->_queryID,$off); - $o->max_length = @odbc_field_len($this->_queryID,$off); - if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); - else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); - return $o; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - - function _initrs() - { - global $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS) ? @odbc_num_rows($this->_queryID) : -1; - $this->_numOfFields = @odbc_num_fields($this->_queryID); - // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0 - if ($this->_numOfRows == 0) $this->_numOfRows = -1; - //$this->useFetchArray = $this->connection->useFetchArray; - $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200; - } - - function _seek($row) - { - return false; - } - - // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated - function GetArrayLimit($nrows,$offset=-1) - { - if ($offset <= 0) { - $rs = $this->GetArray($nrows); - return $rs; - } - $savem = $this->fetchMode; - $this->fetchMode = ADODB_FETCH_NUM; - $this->Move($offset); - $this->fetchMode = $savem; - - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - - $results = array(); - $cnt = 0; - while (!$this->EOF && $nrows != $cnt) { - $results[$cnt++] = $this->fields; - $this->MoveNext(); - } - - return $results; - } - - - function MoveNext() - { - if ($this->_numOfRows != 0 && !$this->EOF) { - $this->_currentRow++; - - if ($this->_has_stupid_odbc_fetch_api_change) - $rez = @odbc_fetch_into($this->_queryID,$this->fields); - else { - $row = 0; - $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields); - } - if ($rez) { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - } - $this->fields = false; - $this->EOF = true; - return false; - } - - function _fetch() - { - - if ($this->_has_stupid_odbc_fetch_api_change) - $rez = @odbc_fetch_into($this->_queryID,$this->fields); - else { - $row = 0; - $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields); - } - if ($rez) { - if ($this->fetchMode & ADODB_FETCH_ASSOC) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - } - return true; - } - $this->fields = false; - return false; - } - - function _close() - { - return @odbc_free_result($this->_queryID); - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-odbc_db2.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-odbc_db2.inc.php deleted file mode 100644 index 52f91d2b..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-odbc_db2.inc.php +++ /dev/null @@ -1,368 +0,0 @@ -curMode = SQL_CUR_USE_ODBC; - $db->Connect($dsn, $userid, $pwd); - - - - USING CLI INTERFACE - =================== - - I have had reports that the $host and $database params have to be reversed in - Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu: - - > The symptom is that if I change the database engine from postgres or any other to DB2 then the following - > connection command becomes wrong despite being described this version to be correct in the docs. - > - > $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME ) - > - > In case of DB2 I had to swap the first and last arguments in order to connect properly. - - - System Error 5 - ============== - IF you get a System Error 5 when trying to Connect/Load, it could be a permission problem. Give the user connecting - to DB2 full rights to the DB2 SQLLIB directory, and place the user in the DBUSERS group. - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -if (!defined('_ADODB_ODBC_LAYER')) { - include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); -} -if (!defined('ADODB_ODBC_DB2')){ - define('ADODB_ODBC_DB2',1); - - class ADODB_ODBC_DB2 extends ADODB_odbc { - var $databaseType = "db2"; - var $concat_operator = '||'; - var $sysTime = 'CURRENT TIME'; - var $sysDate = 'CURRENT DATE'; - var $sysTimeStamp = 'CURRENT TIMESTAMP'; - // The complete string representation of a timestamp has the form - // yyyy-mm-dd-hh.mm.ss.nnnnnn. - var $fmtTimeStamp = "'Y-m-d-H.i.s'"; - var $ansiOuter = true; - var $identitySQL = 'values IDENTITY_VAL_LOCAL()'; - var $_bindInputArray = true; - var $hasInsertID = true; - var $rsPrefix = 'ADORecordset_odbc_'; - - function ADODB_DB2() - { - if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC; - $this->ADODB_odbc(); - } - - function IfNull( $field, $ifNull ) - { - return " COALESCE($field, $ifNull) "; // if DB2 UDB - } - - function ServerInfo() - { - //odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/); - $vers = $this->GetOne('select versionnumber from sysibm.sysversions'); - //odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/); - return array('description'=>'DB2 ODBC driver', 'version'=>$vers); - } - - function _insertid() - { - return $this->GetOne($this->identitySQL); - } - - function RowLock($tables,$where,$col='1 as ignore') - { - if ($this->_autocommit) $this->BeginTrans(); - return $this->GetOne("select $col from $tables where $where for update"); - } - - function MetaTables($ttype=false,$showSchema=false, $qtable="%", $qschema="%") - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $qid = odbc_tables($this->_connectionID, "", $qschema, $qtable, ""); - - $rs = new ADORecordSet_odbc($qid); - - $ADODB_FETCH_MODE = $savem; - if (!$rs) { - $false = false; - return $false; - } - $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change; - - $arr = $rs->GetArray(); - //print_r($arr); - - $rs->Close(); - $arr2 = array(); - - if ($ttype) { - $isview = strncmp($ttype,'V',1) === 0; - } - for ($i=0; $i < sizeof($arr); $i++) { - - if (!$arr[$i][2]) continue; - if (strncmp($arr[$i][1],'SYS',3) === 0) continue; - - $type = $arr[$i][3]; - - if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2]; - - if ($ttype) { - if ($isview) { - if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2]; - } else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2]; - } else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2]; - } - return $arr2; - } - - function MetaIndexes ($table, $primary = FALSE, $owner=false) - { - // save old fetch mode - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - $false = false; - // get index details - $table = strtoupper($table); - $SQL="SELECT NAME, UNIQUERULE, COLNAMES FROM SYSIBM.SYSINDEXES WHERE TBNAME='$table'"; - if ($primary) - $SQL.= " AND UNIQUERULE='P'"; - $rs = $this->Execute($SQL); - if (!is_object($rs)) { - if (isset($savem)) - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - return $false; - } - $indexes = array (); - // parse index data into array - while ($row = $rs->FetchRow()) { - $indexes[$row[0]] = array( - 'unique' => ($row[1] == 'U' || $row[1] == 'P'), - 'columns' => array() - ); - $cols = ltrim($row[2],'+'); - $indexes[$row[0]]['columns'] = explode('+', $cols); - } - if (isset($savem)) { - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - } - return $indexes; - } - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - // use right() and replace() ? - if (!$col) $col = $this->sysDate; - $s = ''; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - if ($s) $s .= '||'; - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= "char(year($col))"; - break; - case 'M': - $s .= "substr(monthname($col),1,3)"; - break; - case 'm': - $s .= "right(digits(month($col)),2)"; - break; - case 'D': - case 'd': - $s .= "right(digits(day($col)),2)"; - break; - case 'H': - case 'h': - if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)"; - else $s .= "''"; - break; - case 'i': - case 'I': - if ($col != $this->sysDate) - $s .= "right(digits(minute($col)),2)"; - else $s .= "''"; - break; - case 'S': - case 's': - if ($col != $this->sysDate) - $s .= "right(digits(second($col)),2)"; - else $s .= "''"; - break; - default: - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - $s .= $this->qstr($ch); - } - } - return $s; - } - - - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false) - { - $nrows = (integer) $nrows; - if ($offset <= 0) { - // could also use " OPTIMIZE FOR $nrows ROWS " - if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY "; - $rs = $this->Execute($sql,$inputArr); - } else { - if ($offset > 0 && $nrows < 0); - else { - $nrows += $offset; - $sql .= " FETCH FIRST $nrows ROWS ONLY "; - } - $rs = ADOConnection::SelectLimit($sql,-1,$offset,$inputArr); - } - - return $rs; - } - - }; - - - class ADORecordSet_odbc_db2 extends ADORecordSet_odbc { - - var $databaseType = "db2"; - - function ADORecordSet_db2($id,$mode=false) - { - $this->ADORecordSet_odbc($id,$mode); - } - - function MetaType($t,$len=-1,$fieldobj=false) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - - switch (strtoupper($t)) { - case 'VARCHAR': - case 'CHAR': - case 'CHARACTER': - case 'C': - if ($len <= $this->blobSize) return 'C'; - - case 'LONGCHAR': - case 'TEXT': - case 'CLOB': - case 'DBCLOB': // double-byte - case 'X': - return 'X'; - - case 'BLOB': - case 'GRAPHIC': - case 'VARGRAPHIC': - return 'B'; - - case 'DATE': - case 'D': - return 'D'; - - case 'TIME': - case 'TIMESTAMP': - case 'T': - return 'T'; - - //case 'BOOLEAN': - //case 'BIT': - // return 'L'; - - //case 'COUNTER': - // return 'R'; - - case 'INT': - case 'INTEGER': - case 'BIGINT': - case 'SMALLINT': - case 'I': - return 'I'; - - default: return 'N'; - } - } - } - -} //define -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-odbc_mssql.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-odbc_mssql.inc.php deleted file mode 100644 index 3b6aa7f8..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-odbc_mssql.inc.php +++ /dev/null @@ -1,305 +0,0 @@ -ADODB_odbc(); - //$this->curmode = SQL_CUR_USE_ODBC; - } - - // crashes php... - function ServerInfo() - { - global $ADODB_FETCH_MODE; - $save=$this->SetFetchMode(ADODB_FETCH_NUM); - $row = $this->GetRow("execute sp_server_info 2"); - $this->SetFetchMode($save); - if (!is_array($row)) return false; - $arr['description'] = $row[2]; - $arr['version'] = ADOConnection::_findvers($arr['description']); - return $arr; - } - - function IfNull( $field, $ifNull ) - { - return " ISNULL($field, $ifNull) "; // if MS SQL Server - } - - function _insertid() - { - // SCOPE_IDENTITY() - // Returns the last IDENTITY value inserted into an IDENTITY column in - // the same scope. A scope is a module -- a stored procedure, trigger, - // function, or batch. Thus, two statements are in the same scope if - // they are in the same stored procedure, function, or batch. - return $this->GetOne($this->identitySQL); - } - - - function MetaForeignKeys($table, $owner=false, $upper=false) - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $table = $this->qstr(strtoupper($table)); - - $sql = -"select object_name(constid) as constraint_name, - col_name(fkeyid, fkey) as column_name, - object_name(rkeyid) as referenced_table_name, - col_name(rkeyid, rkey) as referenced_column_name -from sysforeignkeys -where upper(object_name(fkeyid)) = $table -order by constraint_name, referenced_table_name, keyno"; - - $constraints = $this->GetArray($sql); - - $ADODB_FETCH_MODE = $save; - - $arr = false; - foreach($constraints as $constr) { - //print_r($constr); - $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3]; - } - if (!$arr) return false; - - $arr2 = false; - - foreach($arr as $k => $v) { - foreach($v as $a => $b) { - if ($upper) $a = strtoupper($a); - $arr2[$a] = $b; - } - } - return $arr2; - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr($mask); - $this->metaTablesSQL .= " AND name like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } - - function MetaColumns($table, $normalize=true) - { - $arr = ADOConnection::MetaColumns($table); - return $arr; - } - - - function MetaIndexes($table,$primary=false, $owner=false) - { - $table = $this->qstr($table); - - $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, - CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, - CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique - FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id - INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid - INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid - WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table - ORDER BY O.name, I.Name, K.keyno"; - - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - $rs = $this->Execute($sql); - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - if (!is_object($rs)) { - return FALSE; - } - - $indexes = array(); - while ($row = $rs->FetchRow()) { - if (!$primary && $row[5]) continue; - - $indexes[$row[0]]['unique'] = $row[6]; - $indexes[$row[0]]['columns'][] = $row[1]; - } - return $indexes; - } - - function _query($sql,$inputarr=false) - { - if (is_string($sql)) $sql = str_replace('||','+',$sql); - return ADODB_odbc::_query($sql,$inputarr); - } - - function SetTransactionMode( $transaction_mode ) - { - $this->_transmode = $transaction_mode; - if (empty($transaction_mode)) { - $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); - return; - } - if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; - $this->Execute("SET TRANSACTION ".$transaction_mode); - } - - // "Stein-Aksel Basma" - // tested with MSSQL 2000 - function MetaPrimaryKeys($table) - { - global $ADODB_FETCH_MODE; - - $schema = ''; - $this->_findschema($table,$schema); - //if (!$schema) $schema = $this->database; - if ($schema) $schema = "and k.table_catalog like '$schema%'"; - - $sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k, - information_schema.table_constraints tc - where tc.constraint_name = k.constraint_name and tc.constraint_type = - 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position "; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $a = $this->GetCol($sql); - $ADODB_FETCH_MODE = $savem; - - if ($a && sizeof($a)>0) return $a; - $false = false; - return $false; - } - - function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) - { - if ($nrows > 0 && $offset <= 0) { - $sql = preg_replace( - '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql); - $rs = $this->Execute($sql,$inputarr); - } else - $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - - return $rs; - } - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysTimeStamp; - $s = ''; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - if ($s) $s .= '+'; - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= "datename(yyyy,$col)"; - break; - case 'M': - $s .= "convert(char(3),$col,0)"; - break; - case 'm': - $s .= "replace(str(month($col),2),' ','0')"; - break; - case 'Q': - case 'q': - $s .= "datename(quarter,$col)"; - break; - case 'D': - case 'd': - $s .= "replace(str(day($col),2),' ','0')"; - break; - case 'h': - $s .= "substring(convert(char(14),$col,0),13,2)"; - break; - - case 'H': - $s .= "replace(str(datepart(hh,$col),2),' ','0')"; - break; - - case 'i': - $s .= "replace(str(datepart(mi,$col),2),' ','0')"; - break; - case 's': - $s .= "replace(str(datepart(ss,$col),2),' ','0')"; - break; - case 'a': - case 'A': - $s .= "substring(convert(char(19),$col,0),18,2)"; - break; - - default: - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - $s .= $this->qstr($ch); - break; - } - } - return $s; - } - -} - -class ADORecordSet_odbc_mssql extends ADORecordSet_odbc { - - var $databaseType = 'odbc_mssql'; - - function ADORecordSet_odbc_mssql($id,$mode=false) - { - return $this->ADORecordSet_odbc($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-odbc_oracle.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-odbc_oracle.inc.php deleted file mode 100644 index bf648d4a..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-odbc_oracle.inc.php +++ /dev/null @@ -1,115 +0,0 @@ -ADODB_odbc(); - } - - function MetaTables() - { - $false = false; - $rs = $this->Execute($this->metaTablesSQL); - if ($rs === false) return $false; - $arr = $rs->GetArray(); - $arr2 = array(); - for ($i=0; $i < sizeof($arr); $i++) { - $arr2[] = $arr[$i][0]; - } - $rs->Close(); - return $arr2; - } - - function MetaColumns($table, $normalize=true) - { - global $ADODB_FETCH_MODE; - - $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); - if ($rs === false) { - $false = false; - return $false; - } - $retarr = array(); - while (!$rs->EOF) { //print_r($rs->fields); - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $fld->type = $rs->fields[1]; - $fld->max_length = $rs->fields[2]; - - - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[strtoupper($fld->name)] = $fld; - - $rs->MoveNext(); - } - $rs->Close(); - return $retarr; - } - - // returns true or false - function _connect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - - $php_errormsg = ''; - $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC ); - $this->_errorMsg = $php_errormsg; - - $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); - //if ($this->_connectionID) odbc_autocommit($this->_connectionID,true); - return $this->_connectionID != false; - } - // returns true or false - function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - global $php_errormsg; - $php_errormsg = ''; - $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC ); - $this->_errorMsg = $php_errormsg; - - $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); - //if ($this->_connectionID) odbc_autocommit($this->_connectionID,true); - return $this->_connectionID != false; - } -} - -class ADORecordSet_odbc_oracle extends ADORecordSet_odbc { - - var $databaseType = 'odbc_oracle'; - - function ADORecordSet_odbc_oracle($id,$mode=false) - { - return $this->ADORecordSet_odbc($id,$mode); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-odbtp.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-odbtp.inc.php deleted file mode 100644 index 33cefa77..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-odbtp.inc.php +++ /dev/null @@ -1,836 +0,0 @@ - - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -define("_ADODB_ODBTP_LAYER", 2 ); - -class ADODB_odbtp extends ADOConnection{ - var $databaseType = "odbtp"; - var $dataProvider = "odbtp"; - var $fmtDate = "'Y-m-d'"; - var $fmtTimeStamp = "'Y-m-d, h:i:sA'"; - var $replaceQuote = "''"; // string to use to replace quotes - var $odbc_driver = 0; - var $hasAffectedRows = true; - var $hasInsertID = false; - var $hasGenID = true; - var $hasMoveFirst = true; - - var $_genSeqSQL = "create table %s (seq_name char(30) not null unique , seq_value integer not null)"; - var $_dropSeqSQL = "delete from adodb_seq where seq_name = '%s'"; - var $_bindInputArray = false; - var $_useUnicodeSQL = false; - var $_canPrepareSP = false; - var $_dontPoolDBC = true; - - function ADODB_odbtp() - { - } - - function ServerInfo() - { - return array('description' => @odbtp_get_attr( ODB_ATTR_DBMSNAME, $this->_connectionID), - 'version' => @odbtp_get_attr( ODB_ATTR_DBMSVER, $this->_connectionID)); - } - - function ErrorMsg() - { - if ($this->_errorMsg !== false) return $this->_errorMsg; - if (empty($this->_connectionID)) return @odbtp_last_error(); - return @odbtp_last_error($this->_connectionID); - } - - function ErrorNo() - { - if ($this->_errorCode !== false) return $this->_errorCode; - if (empty($this->_connectionID)) return @odbtp_last_error_state(); - return @odbtp_last_error_state($this->_connectionID); - } - /* - function DBDate($d,$isfld=false) - { - if (empty($d) && $d !== 0) return 'null'; - if ($isfld) return "convert(date, $d, 120)"; - - if (is_string($d)) $d = ADORecordSet::UnixDate($d); - $d = adodb_date($this->fmtDate,$d); - return "convert(date, $d, 120)"; - } - - function DBTimeStamp($d,$isfld=false) - { - if (empty($d) && $d !== 0) return 'null'; - if ($isfld) return "convert(datetime, $d, 120)"; - - if (is_string($d)) $d = ADORecordSet::UnixDate($d); - $d = adodb_date($this->fmtDate,$d); - return "convert(datetime, $d, 120)"; - } - */ - - function _insertid() - { - // SCOPE_IDENTITY() - // Returns the last IDENTITY value inserted into an IDENTITY column in - // the same scope. A scope is a module -- a stored procedure, trigger, - // function, or batch. Thus, two statements are in the same scope if - // they are in the same stored procedure, function, or batch. - return $this->GetOne($this->identitySQL); - } - - function _affectedrows() - { - if ($this->_queryID) { - return @odbtp_affected_rows ($this->_queryID); - } else - return 0; - } - - function CreateSequence($seqname='adodbseq',$start=1) - { - //verify existence - $num = $this->GetOne("select seq_value from adodb_seq"); - $seqtab='adodb_seq'; - if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) { - $path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID ); - //if using vfp dbc file - if( !strcasecmp(strrchr($path, '.'), '.dbc') ) - $path = substr($path,0,strrpos($path,'\/')); - $seqtab = $path . '/' . $seqtab; - } - if($num == false) { - if (empty($this->_genSeqSQL)) return false; - $ok = $this->Execute(sprintf($this->_genSeqSQL ,$seqtab)); - } - $num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seqname'"); - if ($num) { - return false; - } - $start -= 1; - return $this->Execute("insert into adodb_seq values('$seqname',$start)"); - } - - function DropSequence($seqname) - { - if (empty($this->_dropSeqSQL)) return false; - return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); - } - - function GenID($seq='adodbseq',$start=1) - { - $seqtab='adodb_seq'; - if( $this->odbc_driver == ODB_DRIVER_FOXPRO) { - $path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID ); - //if using vfp dbc file - if( !strcasecmp(strrchr($path, '.'), '.dbc') ) - $path = substr($path,0,strrpos($path,'\/')); - $seqtab = $path . '/' . $seqtab; - } - $MAXLOOPS = 100; - while (--$MAXLOOPS>=0) { - $num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seq'"); - if ($num === false) { - //verify if abodb_seq table exist - $ok = $this->GetOne("select seq_value from adodb_seq "); - if(!$ok) { - //creating the sequence table adodb_seq - $this->Execute(sprintf($this->_genSeqSQL ,$seqtab)); - } - $start -= 1; - $num = '0'; - $ok = $this->Execute("insert into adodb_seq values('$seq',$start)"); - if (!$ok) return false; - } - $ok = $this->Execute("update adodb_seq set seq_value=seq_value+1 where seq_name='$seq'"); - if($ok) { - $num += 1; - $this->genID = $num; - return $num; - } - } - if ($fn = $this->raiseErrorFn) { - $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); - } - return false; - } - - //example for $UserOrDSN - //for visual fox : DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBF;SOURCEDB=c:\YourDbfFileDir;EXCLUSIVE=NO; - //for visual fox dbc: DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBC;SOURCEDB=c:\YourDbcFileDir\mydb.dbc;EXCLUSIVE=NO; - //for access : DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\path_to_access_db\base_test.mdb;UID=root;PWD=; - //for mssql : DRIVER={SQL Server};SERVER=myserver;UID=myuid;PWD=mypwd;DATABASE=OdbtpTest; - //if uid & pwd can be separate - function _connect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='') - { - $this->_connectionID = odbtp_connect($HostOrInterface,$UserOrDSN,$argPassword,$argDatabase); - if ($this->_connectionID === false) { - $this->_errorMsg = $this->ErrorMsg() ; - return false; - } - - odbtp_convert_datetime($this->_connectionID,true); - - if ($this->_dontPoolDBC) { - if (function_exists('odbtp_dont_pool_dbc')) - @odbtp_dont_pool_dbc($this->_connectionID); - } - else { - $this->_dontPoolDBC = true; - } - $this->odbc_driver = @odbtp_get_attr(ODB_ATTR_DRIVER, $this->_connectionID); - $dbms = strtolower(@odbtp_get_attr(ODB_ATTR_DBMSNAME, $this->_connectionID)); - $this->odbc_name = $dbms; - - // Account for inconsistent DBMS names - if( $this->odbc_driver == ODB_DRIVER_ORACLE ) - $dbms = 'oracle'; - else if( $this->odbc_driver == ODB_DRIVER_SYBASE ) - $dbms = 'sybase'; - - // Set DBMS specific attributes - switch( $dbms ) { - case 'microsoft sql server': - $this->databaseType = 'odbtp_mssql'; - $this->fmtDate = "'Y-m-d'"; - $this->fmtTimeStamp = "'Y-m-d h:i:sA'"; - $this->sysDate = 'convert(datetime,convert(char,GetDate(),102),102)'; - $this->sysTimeStamp = 'GetDate()'; - $this->ansiOuter = true; - $this->leftOuter = '*='; - $this->rightOuter = '=*'; - $this->hasTop = 'top'; - $this->hasInsertID = true; - $this->hasTransactions = true; - $this->_bindInputArray = true; - $this->_canSelectDb = true; - $this->substr = "substring"; - $this->length = 'len'; - $this->identitySQL = 'select SCOPE_IDENTITY()'; - $this->metaDatabasesSQL = "select name from master..sysdatabases where name <> 'master'"; - $this->_canPrepareSP = true; - break; - case 'access': - $this->databaseType = 'odbtp_access'; - $this->fmtDate = "#Y-m-d#"; - $this->fmtTimeStamp = "#Y-m-d h:i:sA#"; - $this->sysDate = "FORMAT(NOW,'yyyy-mm-dd')"; - $this->sysTimeStamp = 'NOW'; - $this->hasTop = 'top'; - $this->hasTransactions = false; - $this->_canPrepareSP = true; // For MS Access only. - break; - case 'visual foxpro': - $this->databaseType = 'odbtp_vfp'; - $this->fmtDate = "{^Y-m-d}"; - $this->fmtTimeStamp = "{^Y-m-d, h:i:sA}"; - $this->sysDate = 'date()'; - $this->sysTimeStamp = 'datetime()'; - $this->ansiOuter = true; - $this->hasTop = 'top'; - $this->hasTransactions = false; - $this->replaceQuote = "'+chr(39)+'"; - $this->true = '.T.'; - $this->false = '.F.'; - - break; - case 'oracle': - $this->databaseType = 'odbtp_oci8'; - $this->fmtDate = "'Y-m-d 00:00:00'"; - $this->fmtTimeStamp = "'Y-m-d h:i:sA'"; - $this->sysDate = 'TRUNC(SYSDATE)'; - $this->sysTimeStamp = 'SYSDATE'; - $this->hasTransactions = true; - $this->_bindInputArray = true; - $this->concat_operator = '||'; - break; - case 'sybase': - $this->databaseType = 'odbtp_sybase'; - $this->fmtDate = "'Y-m-d'"; - $this->fmtTimeStamp = "'Y-m-d H:i:s'"; - $this->sysDate = 'GetDate()'; - $this->sysTimeStamp = 'GetDate()'; - $this->leftOuter = '*='; - $this->rightOuter = '=*'; - $this->hasInsertID = true; - $this->hasTransactions = true; - $this->identitySQL = 'select SCOPE_IDENTITY()'; - break; - default: - $this->databaseType = 'odbtp'; - if( @odbtp_get_attr(ODB_ATTR_TXNCAPABLE, $this->_connectionID) ) - $this->hasTransactions = true; - else - $this->hasTransactions = false; - } - @odbtp_set_attr(ODB_ATTR_FULLCOLINFO, TRUE, $this->_connectionID ); - - if ($this->_useUnicodeSQL ) - @odbtp_set_attr(ODB_ATTR_UNICODESQL, TRUE, $this->_connectionID); - - return true; - } - - function _pconnect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='') - { - $this->_dontPoolDBC = false; - return $this->_connect($HostOrInterface, $UserOrDSN, $argPassword, $argDatabase); - } - - function SelectDB($dbName) - { - if (!@odbtp_select_db($dbName, $this->_connectionID)) { - return false; - } - $this->database = $dbName; - $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions - return true; - } - - function MetaTables($ttype='',$showSchema=false,$mask=false) - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false); - - $arr = $this->GetArray("||SQLTables||||$ttype"); - - if (isset($savefm)) $this->SetFetchMode($savefm); - $ADODB_FETCH_MODE = $savem; - - $arr2 = array(); - for ($i=0; $i < sizeof($arr); $i++) { - if ($arr[$i][3] == 'SYSTEM TABLE' ) continue; - if ($arr[$i][2]) - $arr2[] = $showSchema && $arr[$i][1]? $arr[$i][1].'.'.$arr[$i][2] : $arr[$i][2]; - } - return $arr2; - } - - function MetaColumns($table,$upper=true) - { - global $ADODB_FETCH_MODE; - - $schema = false; - $this->_findschema($table,$schema); - if ($upper) $table = strtoupper($table); - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false); - - $rs = $this->Execute( "||SQLColumns||$schema|$table" ); - - if (isset($savefm)) $this->SetFetchMode($savefm); - $ADODB_FETCH_MODE = $savem; - - if (!$rs || $rs->EOF) { - $false = false; - return $false; - } - $retarr = array(); - while (!$rs->EOF) { - //print_r($rs->fields); - if (strtoupper($rs->fields[2]) == $table) { - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[3]; - $fld->type = $rs->fields[5]; - $fld->max_length = $rs->fields[6]; - $fld->not_null = !empty($rs->fields[9]); - $fld->scale = $rs->fields[7]; - if (isset($rs->fields[12])) // vfp does not have field 12 - if (!is_null($rs->fields[12])) { - $fld->has_default = true; - $fld->default_value = $rs->fields[12]; - } - $retarr[strtoupper($fld->name)] = $fld; - } else if (!empty($retarr)) - break; - $rs->MoveNext(); - } - $rs->Close(); - - return $retarr; - } - - function MetaPrimaryKeys($table, $owner='') - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $arr = $this->GetArray("||SQLPrimaryKeys||$owner|$table"); - $ADODB_FETCH_MODE = $savem; - - //print_r($arr); - $arr2 = array(); - for ($i=0; $i < sizeof($arr); $i++) { - if ($arr[$i][3]) $arr2[] = $arr[$i][3]; - } - return $arr2; - } - - function MetaForeignKeys($table, $owner='', $upper=false) - { - global $ADODB_FETCH_MODE; - - $savem = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $constraints = $this->GetArray("||SQLForeignKeys|||||$owner|$table"); - $ADODB_FETCH_MODE = $savem; - - $arr = false; - foreach($constraints as $constr) { - //print_r($constr); - $arr[$constr[11]][$constr[2]][] = $constr[7].'='.$constr[3]; - } - if (!$arr) { - $false = false; - return $false; - } - - $arr2 = array(); - - foreach($arr as $k => $v) { - foreach($v as $a => $b) { - if ($upper) $a = strtoupper($a); - $arr2[$a] = $b; - } - } - return $arr2; - } - - function BeginTrans() - { - if (!$this->hasTransactions) return false; - if ($this->transOff) return true; - $this->transCnt += 1; - $this->autoCommit = false; - if (defined('ODB_TXN_DEFAULT')) - $txn = ODB_TXN_DEFAULT; - else - $txn = ODB_TXN_READUNCOMMITTED; - $rs = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS,$txn,$this->_connectionID); - if(!$rs) return false; - return true; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - if ($this->transCnt) $this->transCnt -= 1; - $this->autoCommit = true; - if( ($ret = @odbtp_commit($this->_connectionID)) ) - $ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off - return $ret; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->autoCommit = true; - if( ($ret = @odbtp_rollback($this->_connectionID)) ) - $ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off - return $ret; - } - - function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) - { - // TOP requires ORDER BY for Visual FoxPro - if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) { - if (!preg_match('/ORDER[ \t\r\n]+BY/is',$sql)) $sql .= ' ORDER BY 1'; - } - $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - return $ret; - } - - function Prepare($sql) - { - if (! $this->_bindInputArray) return $sql; // no binding - - $this->_errorMsg = false; - $this->_errorCode = false; - - $stmt = @odbtp_prepare($sql,$this->_connectionID); - if (!$stmt) { - // print "Prepare Error for ($sql) ".$this->ErrorMsg()."
        "; - return $sql; - } - return array($sql,$stmt,false); - } - - function PrepareSP($sql) - { - if (!$this->_canPrepareSP) return $sql; // Can't prepare procedures - - $this->_errorMsg = false; - $this->_errorCode = false; - - $stmt = @odbtp_prepare_proc($sql,$this->_connectionID); - if (!$stmt) return false; - return array($sql,$stmt); - } - - /* - Usage: - $stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group - - # note that the parameter does not have @ in front! - $db->Parameter($stmt,$id,'myid'); - $db->Parameter($stmt,$group,'group',false,64); - $db->Parameter($stmt,$group,'photo',false,100000,ODB_BINARY); - $db->Execute($stmt); - - @param $stmt Statement returned by Prepare() or PrepareSP(). - @param $var PHP variable to bind to. Can set to null (for isNull support). - @param $name Name of stored procedure variable name to bind to. - @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in odbtp. - @param [$maxLen] Holds an maximum length of the variable. - @param [$type] The data type of $var. Legal values depend on driver. - - See odbtp_attach_param documentation at http://odbtp.sourceforge.net. - */ - function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=0, $type=0) - { - if ( $this->odbc_driver == ODB_DRIVER_JET ) { - $name = '['.$name.']'; - if( !$type && $this->_useUnicodeSQL - && @odbtp_param_bindtype($stmt[1], $name) == ODB_CHAR ) - { - $type = ODB_WCHAR; - } - } - else { - $name = '@'.$name; - } - return @odbtp_attach_param($stmt[1], $name, $var, $type, $maxLen); - } - - /* - Insert a null into the blob field of the table first. - Then use UpdateBlob to store the blob. - - Usage: - - $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - - function UpdateBlob($table,$column,$val,$where,$blobtype='image') - { - $sql = "UPDATE $table SET $column = ? WHERE $where"; - if( !($stmt = @odbtp_prepare($sql, $this->_connectionID)) ) - return false; - if( !@odbtp_input( $stmt, 1, ODB_BINARY, 1000000, $blobtype ) ) - return false; - if( !@odbtp_set( $stmt, 1, $val ) ) - return false; - return @odbtp_execute( $stmt ) != false; - } - - function MetaIndexes($table,$primary=false, $owner=false) - { - switch ( $this->odbc_driver) { - case ODB_DRIVER_MSSQL: - return $this->MetaIndexes_mssql($table, $primary); - default: - return array(); - } - } - - function MetaIndexes_mssql($table,$primary=false) - { - $table = strtolower($this->qstr($table)); - - $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, - CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK, - CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique - FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id - INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid - INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid - WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND lower(O.Name) = $table - ORDER BY O.name, I.Name, K.keyno"; - - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - $rs = $this->Execute($sql); - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - if (!is_object($rs)) { - return FALSE; - } - - $indexes = array(); - while ($row = $rs->FetchRow()) { - if ($primary && !$row[5]) continue; - - $indexes[$row[0]]['unique'] = $row[6]; - $indexes[$row[0]]['columns'][] = $row[1]; - } - return $indexes; - } - - function IfNull( $field, $ifNull ) - { - switch( $this->odbc_driver ) { - case ODB_DRIVER_MSSQL: - return " ISNULL($field, $ifNull) "; - case ODB_DRIVER_JET: - return " IIF(IsNull($field), $ifNull, $field) "; - } - return " CASE WHEN $field is null THEN $ifNull ELSE $field END "; - } - - function _query($sql,$inputarr=false) - { - global $php_errormsg; - - $this->_errorMsg = false; - $this->_errorCode = false; - - if ($inputarr) { - if (is_array($sql)) { - $stmtid = $sql[1]; - } else { - $stmtid = @odbtp_prepare($sql,$this->_connectionID); - if ($stmtid == false) { - $this->_errorMsg = $php_errormsg; - return false; - } - } - $num_params = @odbtp_num_params( $stmtid ); - /* - for( $param = 1; $param <= $num_params; $param++ ) { - @odbtp_input( $stmtid, $param ); - @odbtp_set( $stmtid, $param, $inputarr[$param-1] ); - }*/ - - $param = 1; - foreach($inputarr as $v) { - @odbtp_input( $stmtid, $param ); - @odbtp_set( $stmtid, $param, $v ); - $param += 1; - if ($param > $num_params) break; - } - - if (!@odbtp_execute($stmtid) ) { - return false; - } - } else if (is_array($sql)) { - $stmtid = $sql[1]; - if (!@odbtp_execute($stmtid)) { - return false; - } - } else { - $stmtid = odbtp_query($sql,$this->_connectionID); - } - $this->_lastAffectedRows = 0; - if ($stmtid) { - $this->_lastAffectedRows = @odbtp_affected_rows($stmtid); - } - return $stmtid; - } - - function _close() - { - $ret = @odbtp_close($this->_connectionID); - $this->_connectionID = false; - return $ret; - } -} - -class ADORecordSet_odbtp extends ADORecordSet { - - var $databaseType = 'odbtp'; - var $canSeek = true; - - function ADORecordSet_odbtp($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - $this->ADORecordSet($queryID); - } - - function _initrs() - { - $this->_numOfFields = @odbtp_num_fields($this->_queryID); - if (!($this->_numOfRows = @odbtp_num_rows($this->_queryID))) - $this->_numOfRows = -1; - - if (!$this->connection->_useUnicodeSQL) return; - - if ($this->connection->odbc_driver == ODB_DRIVER_JET) { - if (!@odbtp_get_attr(ODB_ATTR_MAPCHARTOWCHAR, - $this->connection->_connectionID)) - { - for ($f = 0; $f < $this->_numOfFields; $f++) { - if (@odbtp_field_bindtype($this->_queryID, $f) == ODB_CHAR) - @odbtp_bind_field($this->_queryID, $f, ODB_WCHAR); - } - } - } - } - - function FetchField($fieldOffset = 0) - { - $off=$fieldOffset; // offsets begin at 0 - $o= new ADOFieldObject(); - $o->name = @odbtp_field_name($this->_queryID,$off); - $o->type = @odbtp_field_type($this->_queryID,$off); - $o->max_length = @odbtp_field_length($this->_queryID,$off); - if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); - else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); - return $o; - } - - function _seek($row) - { - return @odbtp_data_seek($this->_queryID, $row); - } - - function fields($colname) - { - if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname]; - - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $name = @odbtp_field_name( $this->_queryID, $i ); - $this->bind[strtoupper($name)] = $i; - } - } - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - function _fetch_odbtp($type=0) - { - switch ($this->fetchMode) { - case ADODB_FETCH_NUM: - $this->fields = @odbtp_fetch_row($this->_queryID, $type); - break; - case ADODB_FETCH_ASSOC: - $this->fields = @odbtp_fetch_assoc($this->_queryID, $type); - break; - default: - $this->fields = @odbtp_fetch_array($this->_queryID, $type); - } - if ($this->databaseType = 'odbtp_vfp') { - if ($this->fields) - foreach($this->fields as $k => $v) { - if (strncmp($v,'1899-12-30',10) == 0) $this->fields[$k] = ''; - } - } - return is_array($this->fields); - } - - function _fetch() - { - return $this->_fetch_odbtp(); - } - - function MoveFirst() - { - if (!$this->_fetch_odbtp(ODB_FETCH_FIRST)) return false; - $this->EOF = false; - $this->_currentRow = 0; - return true; - } - - function MoveLast() - { - if (!$this->_fetch_odbtp(ODB_FETCH_LAST)) return false; - $this->EOF = false; - $this->_currentRow = $this->_numOfRows - 1; - return true; - } - - function NextRecordSet() - { - if (!@odbtp_next_result($this->_queryID)) return false; - $this->_inited = false; - $this->bind = false; - $this->_currentRow = -1; - $this->Init(); - return true; - } - - function _close() - { - return @odbtp_free_query($this->_queryID); - } -} - -class ADORecordSet_odbtp_mssql extends ADORecordSet_odbtp { - - var $databaseType = 'odbtp_mssql'; - - function ADORecordSet_odbtp_mssql($id,$mode=false) - { - return $this->ADORecordSet_odbtp($id,$mode); - } -} - -class ADORecordSet_odbtp_access extends ADORecordSet_odbtp { - - var $databaseType = 'odbtp_access'; - - function ADORecordSet_odbtp_access($id,$mode=false) - { - return $this->ADORecordSet_odbtp($id,$mode); - } -} - -class ADORecordSet_odbtp_vfp extends ADORecordSet_odbtp { - - var $databaseType = 'odbtp_vfp'; - - function ADORecordSet_odbtp_vfp($id,$mode=false) - { - return $this->ADORecordSet_odbtp($id,$mode); - } -} - -class ADORecordSet_odbtp_oci8 extends ADORecordSet_odbtp { - - var $databaseType = 'odbtp_oci8'; - - function ADORecordSet_odbtp_oci8($id,$mode=false) - { - return $this->ADORecordSet_odbtp($id,$mode); - } -} - -class ADORecordSet_odbtp_sybase extends ADORecordSet_odbtp { - - var $databaseType = 'odbtp_sybase'; - - function ADORecordSet_odbtp_sybase($id,$mode=false) - { - return $this->ADORecordSet_odbtp($id,$mode); - } -} -?> diff --git a/include/limesurvey/classes/adodb/drivers/adodb-odbtp_unicode.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-odbtp_unicode.inc.php deleted file mode 100644 index 1c74f560..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-odbtp_unicode.inc.php +++ /dev/null @@ -1,39 +0,0 @@ - - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -/* - Because the ODBTP server sends and reads UNICODE text data using UTF-8 - encoding, the following HTML meta tag must be included within the HTML - head section of every HTML form and script page: - - - - Also, all SQL query strings must be submitted as UTF-8 encoded text. - */ - -if (!defined('_ADODB_ODBTP_LAYER')) { - include(ADODB_DIR."/drivers/adodb-odbtp.inc.php"); -} - -class ADODB_odbtp_unicode extends ADODB_odbtp { - var $databaseType = 'odbtp'; - var $_useUnicodeSQL = true; - - function ADODB_odbtp_unicode() - { - $this->ADODB_odbtp(); - } -} -?> diff --git a/include/limesurvey/classes/adodb/drivers/adodb-oracle.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-oracle.inc.php deleted file mode 100644 index 73a82481..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-oracle.inc.php +++ /dev/null @@ -1,342 +0,0 @@ -format($this->fmtDate); - else $ds = adodb_date($this->fmtDate,$d); - return 'TO_DATE('.$ds.",'YYYY-MM-DD')"; - } - - // format and return date string in database timestamp format - function DBTimeStamp($ts) - { - - if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts); - if (is_object($ts)) $ds = $ts->format($this->fmtDate); - else $ds = adodb_date($this->fmtTimeStamp,$ts); - return 'TO_DATE('.$ds.",'RRRR-MM-DD, HH:MI:SS AM')"; - } - - - function BindDate($d) - { - $d = ADOConnection::DBDate($d); - if (strncmp($d,"'",1)) return $d; - - return substr($d,1,strlen($d)-2); - } - - function BindTimeStamp($d) - { - $d = ADOConnection::DBTimeStamp($d); - if (strncmp($d,"'",1)) return $d; - - return substr($d,1,strlen($d)-2); - } - - - - function BeginTrans() - { - $this->autoCommit = false; - ora_commitoff($this->_connectionID); - return true; - } - - - function CommitTrans($ok=true) - { - if (!$ok) return $this->RollbackTrans(); - $ret = ora_commit($this->_connectionID); - ora_commiton($this->_connectionID); - return $ret; - } - - - function RollbackTrans() - { - $ret = ora_rollback($this->_connectionID); - ora_commiton($this->_connectionID); - return $ret; - } - - - /* there seems to be a bug in the oracle extension -- always returns ORA-00000 - no error */ - function ErrorMsg() - { - if ($this->_errorMsg !== false) return $this->_errorMsg; - - if (is_resource($this->_curs)) $this->_errorMsg = @ora_error($this->_curs); - if (empty($this->_errorMsg)) $this->_errorMsg = @ora_error($this->_connectionID); - return $this->_errorMsg; - } - - - function ErrorNo() - { - if ($this->_errorCode !== false) return $this->_errorCode; - - if (is_resource($this->_curs)) $this->_errorCode = @ora_errorcode($this->_curs); - if (empty($this->_errorCode)) $this->_errorCode = @ora_errorcode($this->_connectionID); - return $this->_errorCode; - } - - - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0) - { - if (!function_exists('ora_plogon')) return null; - - // Reset error messages before connecting - $this->_errorMsg = false; - $this->_errorCode = false; - - // G. Giunta 2003/08/13 - This looks danegrously suspicious: why should we want to set - // the oracle home to the host name of remote DB? - // if ($argHostname) putenv("ORACLE_HOME=$argHostname"); - - if($argHostname) { // code copied from version submitted for oci8 by Jorma Tuomainen - if (empty($argDatabasename)) $argDatabasename = $argHostname; - else { - if(strpos($argHostname,":")) { - $argHostinfo=explode(":",$argHostname); - $argHostname=$argHostinfo[0]; - $argHostport=$argHostinfo[1]; - } else { - $argHostport="1521"; - } - - - if ($this->connectSID) { - $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname - .")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))"; - } else - $argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname - .")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))"; - } - - } - - if ($argDatabasename) $argUsername .= "@$argDatabasename"; - - //if ($argHostname) print "

        Connect: 1st argument should be left blank for $this->databaseType

        "; - if ($mode == 1) - $this->_connectionID = ora_plogon($argUsername,$argPassword); - else - $this->_connectionID = ora_logon($argUsername,$argPassword); - if ($this->_connectionID === false) return false; - if ($this->autoCommit) ora_commiton($this->_connectionID); - if ($this->_initdate) { - $rs = $this->_query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'"); - if ($rs) ora_close($rs); - } - - return true; - } - - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, 1); - } - - - // returns query ID if successful, otherwise false - function _query($sql,$inputarr=false) - { - // Reset error messages before executing - $this->_errorMsg = false; - $this->_errorCode = false; - - $curs = ora_open($this->_connectionID); - - if ($curs === false) return false; - $this->_curs = $curs; - if (!ora_parse($curs,$sql)) return false; - if (ora_exec($curs)) return $curs; - // before we close the cursor, we have to store the error message - // that we can obtain ONLY from the cursor (and not from the connection) - $this->_errorCode = @ora_errorcode($curs); - $this->_errorMsg = @ora_error($curs); - // - @ora_close($curs); - return false; - } - - - // returns true or false - function _close() - { - return @ora_logoff($this->_connectionID); - } - - - -} - - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_oracle extends ADORecordSet { - - var $databaseType = "oracle"; - var $bind = false; - - function ADORecordset_oracle($queryID,$mode=false) - { - - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->fetchMode = $mode; - - $this->_queryID = $queryID; - - $this->_inited = true; - $this->fields = array(); - if ($queryID) { - $this->_currentRow = 0; - $this->EOF = !$this->_fetch(); - @$this->_initrs(); - } else { - $this->_numOfRows = 0; - $this->_numOfFields = 0; - $this->EOF = true; - } - - return $this->_queryID; - } - - - - /* Returns: an object containing field information. - Get column information in the Recordset object. fetchField() can be used in order to obtain information about - fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by - fetchField() is retrieved. */ - - function FetchField($fieldOffset = -1) - { - $fld = new ADOFieldObject; - $fld->name = ora_columnname($this->_queryID, $fieldOffset); - $fld->type = ora_columntype($this->_queryID, $fieldOffset); - $fld->max_length = ora_columnsize($this->_queryID, $fieldOffset); - return $fld; - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - function _initrs() - { - $this->_numOfRows = -1; - $this->_numOfFields = @ora_numcols($this->_queryID); - } - - - function _seek($row) - { - return false; - } - - function _fetch($ignore_fields=false) { - // should remove call by reference, but ora_fetch_into requires it in 4.0.3pl1 - if ($this->fetchMode & ADODB_FETCH_ASSOC) - return @ora_fetch_into($this->_queryID,$this->fields,ORA_FETCHINTO_NULLS|ORA_FETCHINTO_ASSOC); - else - return @ora_fetch_into($this->_queryID,$this->fields,ORA_FETCHINTO_NULLS); - } - - /* close() only needs to be called if you are worried about using too much memory while your script - is running. All associated result memory for the specified result identifier will automatically be freed. */ - - function _close() - { - return @ora_close($this->_queryID); - } - - function MetaType($t,$len=-1) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - - switch (strtoupper($t)) { - case 'VARCHAR': - case 'VARCHAR2': - case 'CHAR': - case 'VARBINARY': - case 'BINARY': - if ($len <= $this->blobSize) return 'C'; - case 'LONG': - case 'LONG VARCHAR': - case 'CLOB': - return 'X'; - case 'LONG RAW': - case 'LONG VARBINARY': - case 'BLOB': - return 'B'; - - case 'DATE': return 'D'; - - //case 'T': return 'T'; - - case 'BIT': return 'L'; - case 'INT': - case 'SMALLINT': - case 'INTEGER': return 'I'; - default: return 'N'; - } - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-pdo.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-pdo.inc.php deleted file mode 100644 index 34ee101d..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-pdo.inc.php +++ /dev/null @@ -1,626 +0,0 @@ -_driver; - $this->fmtDate = $d->fmtDate; - $this->fmtTimeStamp = $d->fmtTimeStamp; - $this->replaceQuote = $d->replaceQuote; - $this->sysDate = $d->sysDate; - $this->sysTimeStamp = $d->sysTimeStamp; - $this->random = $d->random; - $this->concat_operator = $d->concat_operator; - $this->nameQuote = $d->nameQuote; - - $this->hasGenID = $d->hasGenID; - $this->_genIDSQL = $d->_genIDSQL; - $this->_genSeqSQL = $d->_genSeqSQL; - $this->_dropSeqSQL = $d->_dropSeqSQL; - - $d->_init($this); - } - - function Time() - { - if (!empty($this->_driver->_hasdual)) $sql = "select $this->sysTimeStamp from dual"; - else $sql = "select $this->sysTimeStamp"; - - $rs = $this->_Execute($sql); - if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); - - return false; - } - - // returns true or false - function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false) - { - $at = strpos($argDSN,':'); - $this->dsnType = substr($argDSN,0,$at); - - if ($argDatabasename) { - $argDSN .= ';dbname='.$argDatabasename; - } - try { - $this->_connectionID = new PDO($argDSN, $argUsername, $argPassword); - } catch (Exception $e) { - $this->_connectionID = false; - $this->_errorno = -1; - //var_dump($e); - $this->_errormsg = 'Connection attempt failed: '.$e->getMessage(); - return false; - } - - if ($this->_connectionID) { - switch(ADODB_ASSOC_CASE){ - case 0: $m = PDO::CASE_LOWER; break; - case 1: $m = PDO::CASE_UPPER; break; - default: - case 2: $m = PDO::CASE_NATURAL; break; - } - - //$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT ); - $this->_connectionID->setAttribute(PDO::ATTR_CASE,$m); - - $class = 'ADODB_pdo_'.$this->dsnType; - //$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); - switch($this->dsnType) { - case 'oci': - case 'mysql': - case 'pgsql': - case 'mssql': - case 'sqlite': - include_once(ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php'); - break; - } - if (class_exists($class)) - $this->_driver = new $class(); - else - $this->_driver = new ADODB_pdo_base(); - - $this->_driver->_connectionID = $this->_connectionID; - $this->_UpdatePDO(); - return true; - } - $this->_driver = new ADODB_pdo_base(); - return false; - } - - function Concat() - { - $args = func_get_args(); - if(method_exists($this->_driver, 'Concat')) - return call_user_func_array(array($this->_driver, 'Concat'), $args); - - return call_user_func_array(array($this,'parent::Concat'), $args); - } - - // returns true or false - function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) - { - return $this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true); - } - - /*------------------------------------------------------------------------------*/ - - - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - $save = $this->_driver->fetchMode; - $this->_driver->fetchMode = $this->fetchMode; - $this->_driver->debug = $this->debug; - $ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - $this->_driver->fetchMode = $save; - return $ret; - } - - - function ServerInfo() - { - return $this->_driver->ServerInfo(); - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - return $this->_driver->MetaTables($ttype,$showSchema,$mask); - } - - function MetaColumns($table,$normalize=true) - { - return $this->_driver->MetaColumns($table,$normalize); - } - - function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) - { - $obj = $stmt[1]; - if ($type) $obj->bindParam($name,$var,$type,$maxLen); - else $obj->bindParam($name, $var); - } - - function OffsetDate($dayFraction,$date=false) - { - return $this->_driver->OffsetDate($dayFraction,$date); - } - - function ErrorMsg() - { - if ($this->_errormsg !== false) return $this->_errormsg; - if (!empty($this->_stmt)) $arr = $this->_stmt->errorInfo(); - else if (!empty($this->_connectionID)) $arr = $this->_connectionID->errorInfo(); - else return 'No Connection Established'; - - - if ($arr) { - if (sizeof($arr)<2) return ''; - if ((integer)$arr[1]) return $arr[2]; - else return ''; - } else return '-1'; - } - - - function ErrorNo() - { - if ($this->_errorno !== false) return $this->_errorno; - if (!empty($this->_stmt)) $err = $this->_stmt->errorCode(); - else if (!empty($this->_connectionID)) { - $arr = $this->_connectionID->errorInfo(); - if (isset($arr[0])) $err = $arr[0]; - else $err = -1; - } else - return 0; - - if ($err == '00000') return 0; // allows empty check - return $err; - } - - function SetTransactionMode($transaction_mode) - { - if(method_exists($this->_driver, 'SetTransactionMode')) - return $this->_driver->SetTransactionMode($transaction_mode); - - return parent::SetTransactionMode($seqname); - } - - function BeginTrans() - { - if(method_exists($this->_driver, 'BeginTrans')) - return $this->_driver->BeginTrans(); - - if (!$this->hasTransactions) return false; - if ($this->transOff) return true; - $this->transCnt += 1; - $this->_autocommit = false; - $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,false); - return $this->_connectionID->beginTransaction(); - } - - function CommitTrans($ok=true) - { - if(method_exists($this->_driver, 'CommitTrans')) - return $this->_driver->CommitTrans($ok); - - if (!$this->hasTransactions) return false; - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - - $ret = $this->_connectionID->commit(); - $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); - return $ret; - } - - function RollbackTrans() - { - if(method_exists($this->_driver, 'RollbackTrans')) - return $this->_driver->RollbackTrans(); - - if (!$this->hasTransactions) return false; - if ($this->transOff) return true; - if ($this->transCnt) $this->transCnt -= 1; - $this->_autocommit = true; - - $ret = $this->_connectionID->rollback(); - $this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true); - return $ret; - } - - function Prepare($sql) - { - $this->_stmt = $this->_connectionID->prepare($sql); - if ($this->_stmt) return array($sql,$this->_stmt); - - return false; - } - - function PrepareStmt($sql) - { - $stmt = $this->_connectionID->prepare($sql); - if (!$stmt) return false; - $obj = new ADOPDOStatement($stmt,$this); - return $obj; - } - - function CreateSequence($seqname='adodbseq',$startID=1) - { - if(method_exists($this->_driver, 'CreateSequence')) - return $this->_driver->CreateSequence($seqname, $startID); - - return parent::CreateSequence($seqname, $startID); - } - - function DropSequence($seqname='adodbseq') - { - if(method_exists($this->_driver, 'DropSequence')) - return $this->_driver->DropSequence($seqname); - - return parent::DropSequence($seqname); - } - - function GenID($seqname='adodbseq',$startID=1) - { - if(method_exists($this->_driver, 'GenID')) - return $this->_driver->GenID($seqname, $startID); - - return parent::GenID($seqname, $startID); - } - - - /* returns queryID or false */ - function _query($sql,$inputarr=false) - { - if (is_array($sql)) { - $stmt = $sql[1]; - } else { - $stmt = $this->_connectionID->prepare($sql); - } - #adodb_backtrace(); - #var_dump($this->_bindInputArray); - if ($stmt) { - $this->_driver->debug = $this->debug; - if ($inputarr) $ok = $stmt->execute($inputarr); - else $ok = $stmt->execute(); - } - - - $this->_errormsg = false; - $this->_errorno = false; - - if ($ok) { - $this->_stmt = $stmt; - return $stmt; - } - - if ($stmt) { - - $arr = $stmt->errorinfo(); - if ((integer)$arr[1]) { - $this->_errormsg = $arr[2]; - $this->_errorno = $arr[1]; - } - - } else { - $this->_errormsg = false; - $this->_errorno = false; - } - return false; - } - - // returns true or false - function _close() - { - $this->_stmt = false; - return true; - } - - function _affectedrows() - { - return ($this->_stmt) ? $this->_stmt->rowCount() : 0; - } - - function _insertid() - { - return ($this->_connectionID) ? $this->_connectionID->lastInsertId() : 0; - } -} - -class ADODB_pdo_base extends ADODB_pdo { - - var $sysDate = "'?'"; - var $sysTimeStamp = "'?'"; - - - function _init($parentDriver) - { - $parentDriver->_bindInputArray = true; - #$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true); - } - - function ServerInfo() - { - return ADOConnection::ServerInfo(); - } - - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - return $ret; - } - - function MetaTables() - { - return false; - } - - function MetaColumns() - { - return false; - } -} - -class ADOPDOStatement { - - var $databaseType = "pdo"; - var $dataProvider = "pdo"; - var $_stmt; - var $_connectionID; - - function ADOPDOStatement($stmt,$connection) - { - $this->_stmt = $stmt; - $this->_connectionID = $connection; - } - - function Execute($inputArr=false) - { - $savestmt = $this->_connectionID->_stmt; - $rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr); - $this->_connectionID->_stmt = $savestmt; - return $rs; - } - - function InParameter(&$var,$name,$maxLen=4000,$type=false) - { - - if ($type) $this->_stmt->bindParam($name,$var,$type,$maxLen); - else $this->_stmt->bindParam($name, $var); - } - - function Affected_Rows() - { - return ($this->_stmt) ? $this->_stmt->rowCount() : 0; - } - - function ErrorMsg() - { - if ($this->_stmt) $arr = $this->_stmt->errorInfo(); - else $arr = $this->_connectionID->errorInfo(); - - if (is_array($arr)) { - if ((integer) $arr[0] && isset($arr[2])) return $arr[2]; - else return ''; - } else return '-1'; - } - - function NumCols() - { - return ($this->_stmt) ? $this->_stmt->columnCount() : 0; - } - - function ErrorNo() - { - if ($this->_stmt) return $this->_stmt->errorCode(); - else return $this->_connectionID->errorInfo(); - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_pdo extends ADORecordSet { - - var $bind = false; - var $databaseType = "pdo"; - var $dataProvider = "pdo"; - - function ADORecordSet_pdo($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - $this->adodbFetchMode = $mode; - switch($mode) { - case ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break; - case ADODB_FETCH_ASSOC: $mode = PDO::FETCH_ASSOC; break; - - case ADODB_FETCH_BOTH: - default: $mode = PDO::FETCH_BOTH; break; - } - $this->fetchMode = $mode; - - $this->_queryID = $id; - $this->ADORecordSet($id); - } - - - function Init() - { - if ($this->_inited) return; - $this->_inited = true; - if ($this->_queryID) @$this->_initrs(); - else { - $this->_numOfRows = 0; - $this->_numOfFields = 0; - } - if ($this->_numOfRows != 0 && $this->_currentRow == -1) { - $this->_currentRow = 0; - if ($this->EOF = ($this->_fetch() === false)) { - $this->_numOfRows = 0; // _numOfRows could be -1 - } - } else { - $this->EOF = true; - } - } - - function _initrs() - { - global $ADODB_COUNTRECS; - - $this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1; - if (!$this->_numOfRows) $this->_numOfRows = -1; - $this->_numOfFields = $this->_queryID->columnCount(); - } - - // returns the field object - function FetchField($fieldOffset = -1) - { - $off=$fieldOffset+1; // offsets begin at 1 - - $o= new ADOFieldObject(); - $arr = @$this->_queryID->getColumnMeta($fieldOffset); - if (!$arr) { - $o->name = 'bad getColumnMeta()'; - $o->max_length = -1; - $o->type = 'VARCHAR'; - $o->precision = 0; - # $false = false; - return $o; - } - //adodb_pr($arr); - $o->name = $arr['name']; - if (isset($arr['native_type']) && $arr['native_type'] <> "null") $o->type = $arr['native_type']; - else $o->type = adodb_pdo_type($arr['pdo_type']); - $o->max_length = $arr['len']; - $o->precision = $arr['precision']; - - if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name); - else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name); - return $o; - } - - function _seek($row) - { - return false; - } - - function _fetch() - { - if (!$this->_queryID) return false; - - $this->fields = $this->_queryID->fetch($this->fetchMode); - return !empty($this->fields); - } - - function _close() - { - $this->_queryID = false; - } - - function Fields($colname) - { - if ($this->adodbFetchMode != ADODB_FETCH_NUM) return @$this->fields[$colname]; - - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - return $this->fields[$this->bind[strtoupper($colname)]]; - } - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-pdo_mssql.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-pdo_mssql.inc.php deleted file mode 100644 index f9f7e58a..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-pdo_mssql.inc.php +++ /dev/null @@ -1,61 +0,0 @@ -hasTransactions = false; ## <<< BUG IN PDO mssql driver - $parentDriver->_bindInputArray = false; - $parentDriver->hasInsertID = true; - } - - function ServerInfo() - { - return ADOConnection::ServerInfo(); - } - - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - return $ret; - } - - function SetTransactionMode( $transaction_mode ) - { - $this->_transmode = $transaction_mode; - if (empty($transaction_mode)) { - $this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); - return; - } - if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; - $this->Execute("SET TRANSACTION ".$transaction_mode); - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - return false; - } - - function MetaColumns($table,$normalize=true) - { - return false; - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-pdo_mysql.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-pdo_mysql.inc.php deleted file mode 100644 index f86ee7bb..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-pdo_mysql.inc.php +++ /dev/null @@ -1,182 +0,0 @@ -hasTransactions = false; - #$parentDriver->_bindInputArray = false; - $parentDriver->hasInsertID = true; - $parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true); - } - - // dayFraction is a day in floating point - function OffsetDate($dayFraction,$date=false) - { - if (!$date) $date = $this->sysDate; - - $fraction = $dayFraction * 24 * 3600; - return $date . ' + INTERVAL ' . $fraction.' SECOND'; - - // return "from_unixtime(unix_timestamp($date)+$fraction)"; - } - - function Concat() - { - $s = ""; - $arr = func_get_args(); - - // suggestion by andrew005#mnogo.ru - $s = implode(',',$arr); - if (strlen($s) > 0) return "CONCAT($s)"; return ''; - } - - function ServerInfo() - { - $arr['description'] = ADOConnection::GetOne("select version()"); - $arr['version'] = ADOConnection::_findvers($arr['description']); - return $arr; - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - $save = $this->metaTablesSQL; - if ($showSchema && is_string($showSchema)) { - $this->metaTablesSQL .= " from $showSchema"; - } - - if ($mask) { - $mask = $this->qstr($mask); - $this->metaTablesSQL .= " like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - $this->metaTablesSQL = $save; - return $ret; - } - - function SetTransactionMode( $transaction_mode ) - { - $this->_transmode = $transaction_mode; - if (empty($transaction_mode)) { - $this->Execute('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ'); - return; - } - if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode; - $this->Execute("SET SESSION TRANSACTION ".$transaction_mode); - } - - function MetaColumns($table,$normalize=true) - { - $this->_findschema($table,$schema); - if ($schema) { - $dbName = $this->database; - $this->SelectDB($schema); - } - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); - - if ($schema) { - $this->SelectDB($dbName); - } - - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - if (!is_object($rs)) { - $false = false; - return $false; - } - - $retarr = array(); - while (!$rs->EOF){ - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $type = $rs->fields[1]; - - // split type into type(length): - $fld->scale = null; - if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) { - $fld->type = $query_array[1]; - $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; - $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1; - } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) { - $fld->type = $query_array[1]; - $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; - } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) { - $fld->type = $query_array[1]; - $arr = explode(",",$query_array[2]); - $fld->enums = $arr; - $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6 - $fld->max_length = ($zlen > 0) ? $zlen : 1; - } else { - $fld->type = $type; - $fld->max_length = -1; - } - $fld->not_null = ($rs->fields[2] != 'YES'); - $fld->primary_key = ($rs->fields[3] == 'PRI'); - $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); - $fld->binary = (strpos($type,'blob') !== false); - $fld->unsigned = (strpos($type,'unsigned') !== false); - - if (!$fld->binary) { - $d = $rs->fields[4]; - if ($d != '' && $d != 'NULL') { - $fld->has_default = true; - $fld->default_value = $d; - } else { - $fld->has_default = false; - } - } - - if ($save == ADODB_FETCH_NUM) { - $retarr[] = $fld; - } else { - $retarr[strtoupper($fld->name)] = $fld; - } - $rs->MoveNext(); - } - - $rs->Close(); - return $retarr; - } - - - // parameters use PostgreSQL convention, not MySQL - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0) - { - $offsetStr =($offset>=0) ? "$offset," : ''; - // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220 - if ($nrows < 0) $nrows = '18446744073709551615'; - - if ($secs) - $rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr); - else - $rs = $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr); - return $rs; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-pdo_oci.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-pdo_oci.inc.php deleted file mode 100644 index 31125338..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-pdo_oci.inc.php +++ /dev/null @@ -1,93 +0,0 @@ -_bindInputArray = true; - $parentDriver->_nestedSQL = true; - if ($this->_initdate) { - $parentDriver->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'"); - } - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr(strtoupper($mask)); - $this->metaTablesSQL .= " AND table_name like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } - - function MetaColumns($table,$normalize=true) - { - global $ADODB_FETCH_MODE; - - $false = false; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - - $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table))); - - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - if (!$rs) { - return $false; - } - $retarr = array(); - while (!$rs->EOF) { //print_r($rs->fields); - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $fld->type = $rs->fields[1]; - $fld->max_length = $rs->fields[2]; - $fld->scale = $rs->fields[3]; - if ($rs->fields[1] == 'NUMBER' && $rs->fields[3] == 0) { - $fld->type ='INT'; - $fld->max_length = $rs->fields[4]; - } - $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0); - $fld->binary = (strpos($fld->type,'BLOB') !== false); - $fld->default_value = $rs->fields[6]; - - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[strtoupper($fld->name)] = $fld; - $rs->MoveNext(); - } - $rs->Close(); - if (empty($retarr)) - return $false; - else - return $retarr; - } -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-pdo_pgsql.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-pdo_pgsql.inc.php deleted file mode 100644 index f7720df8..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-pdo_pgsql.inc.php +++ /dev/null @@ -1,230 +0,0 @@ - 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; - - // used when schema defined - var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum -FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n -WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) - and c.relnamespace=n.oid and n.nspname='%s' - and a.attname not like '....%%' AND a.attnum > 0 - AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; - - // get primary key etc -- from Freek Dijkstra - var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key - FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'"; - - var $hasAffectedRows = true; - var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10 - // below suggested by Freek Dijkstra - var $true = 't'; // string that represents TRUE for a database - var $false = 'f'; // string that represents FALSE for a database - var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database - var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt. - var $hasMoveFirst = true; - var $hasGenID = true; - var $_genIDSQL = "SELECT NEXTVAL('%s')"; - var $_genSeqSQL = "CREATE SEQUENCE %s START %s"; - var $_dropSeqSQL = "DROP SEQUENCE %s"; - var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum"; - var $random = 'random()'; /// random function - var $concat_operator='||'; - - function _init($parentDriver) - { - - $parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver - $parentDriver->hasInsertID = true; - $parentDriver->_nestedSQL = true; - } - - function ServerInfo() - { - $arr['description'] = ADOConnection::GetOne("select version()"); - $arr['version'] = ADOConnection::_findvers($arr['description']); - return $arr; - } - - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; - $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ''; - if ($secs2cache) - $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); - else - $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); - - return $rs; - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - $info = $this->ServerInfo(); - if ($info['version'] >= 7.3) { - $this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%' - and schemaname not in ( 'pg_catalog','information_schema') - union - select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') "; - } - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr(strtolower($mask)); - if ($info['version']>=7.3) - $this->metaTablesSQL = " -select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema') - union -select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') "; - else - $this->metaTablesSQL = " -select tablename,'T' from pg_tables where tablename like $mask - union -select viewname,'V' from pg_views where viewname like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } - - function MetaColumns($table,$normalize=true) - { - global $ADODB_FETCH_MODE; - - $schema = false; - $this->_findschema($table,$schema); - - if ($normalize) $table = strtolower($table); - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - - if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema)); - else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if ($rs === false) { - $false = false; - return $false; - } - if (!empty($this->metaKeySQL)) { - // If we want the primary keys, we have to issue a separate query - // Of course, a modified version of the metaColumnsSQL query using a - // LEFT JOIN would have been much more elegant, but postgres does - // not support OUTER JOINS. So here is the clumsy way. - - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - - $rskey = $this->Execute(sprintf($this->metaKeySQL,($table))); - // fetch all result in once for performance. - $keys = $rskey->GetArray(); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - $rskey->Close(); - unset($rskey); - } - - $rsdefa = array(); - if (!empty($this->metaDefaultsSQL)) { - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $sql = sprintf($this->metaDefaultsSQL, ($table)); - $rsdef = $this->Execute($sql); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if ($rsdef) { - while (!$rsdef->EOF) { - $num = $rsdef->fields['num']; - $s = $rsdef->fields['def']; - if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */ - $s = substr($s, 1); - $s = substr($s, 0, strlen($s) - 1); - } - - $rsdefa[$num] = $s; - $rsdef->MoveNext(); - } - } else { - ADOConnection::outp( "==> SQL => " . $sql); - } - unset($rsdef); - } - - $retarr = array(); - while (!$rs->EOF) { - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $fld->type = $rs->fields[1]; - $fld->max_length = $rs->fields[2]; - if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4; - if ($fld->max_length <= 0) $fld->max_length = -1; - if ($fld->type == 'numeric') { - $fld->scale = $fld->max_length & 0xFFFF; - $fld->max_length >>= 16; - } - // dannym - // 5 hasdefault; 6 num-of-column - $fld->has_default = ($rs->fields[5] == 't'); - if ($fld->has_default) { - $fld->default_value = $rsdefa[$rs->fields[6]]; - } - - //Freek - if ($rs->fields[4] == $this->true) { - $fld->not_null = true; - } - - // Freek - if (is_array($keys)) { - foreach($keys as $key) { - if ($fld->name == $key['column_name'] AND $key['primary_key'] == $this->true) - $fld->primary_key = true; - if ($fld->name == $key['column_name'] AND $key['unique_key'] == $this->true) - $fld->unique = true; // What name is more compatible? - } - } - - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld; - - $rs->MoveNext(); - } - $rs->Close(); - if (empty($retarr)) { - $false = false; - return $false; - } else return $retarr; - - } - -} - -?> diff --git a/include/limesurvey/classes/adodb/drivers/adodb-pdo_sqlite.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-pdo_sqlite.inc.php deleted file mode 100644 index 7d514745..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-pdo_sqlite.inc.php +++ /dev/null @@ -1,204 +0,0 @@ -pdoDriver = $parentDriver; - $parentDriver->_bindInputArray = true; - $parentDriver->hasTransactions = false; // // should be set to false because of PDO SQLite driver not supporting changing autocommit mode - $parentDriver->hasInsertID = true; - } - - function ServerInfo() - { - $parent = $this->pdoDriver; - @($ver = array_pop($parent->GetCol("SELECT sqlite_version()"))); - @($enc = array_pop($parent->GetCol("PRAGMA encoding"))); - - $arr['version'] = $ver; - $arr['description'] = 'SQLite '; - $arr['encoding'] = $enc; - - return $arr; - } - - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - $parent = $this->pdoDriver; - $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; - $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : ''); - if ($secs2cache) - $rs = $parent->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); - else - $rs = $parent->Execute($sql."$limitStr$offsetStr",$inputarr); - - return $rs; - } - - function GenID($seq='adodbseq',$start=1) - { - $parent = $this->pdoDriver; - // if you have to modify the parameter below, your database is overloaded, - // or you need to implement generation of id's yourself! - $MAXLOOPS = 100; - while (--$MAXLOOPS>=0) { - @($num = array_pop($parent->GetCol("SELECT id FROM {$seq}"))); - if ($num === false || !is_numeric($num)) { - @$parent->Execute(sprintf($this->_genSeqSQL ,$seq)); - $start -= 1; - $num = '0'; - $cnt = $parent->GetOne(sprintf($this->_genSeqCountSQL,$seq)); - if (!$cnt) { - $ok = $parent->Execute(sprintf($this->_genSeq2SQL,$seq,$start)); - } - if (!$ok) return false; - } - $parent->Execute(sprintf($this->_genIDSQL,$seq,$num)); - - if ($parent->affected_rows() > 0) { - $num += 1; - $parent->genID = intval($num); - return intval($num); - } - } - if ($fn = $parent->raiseErrorFn) { - $fn($parent->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); - } - return false; - } - - function CreateSequence($seqname='adodbseq',$start=1) - { - $parent = $this->pdoDriver; - $ok = $parent->Execute(sprintf($this->_genSeqSQL,$seqname)); - if (!$ok) return false; - $start -= 1; - return $parent->Execute("insert into $seqname values($start)"); - } - - function SetTransactionMode($transaction_mode) - { - $parent = $this->pdoDriver; - $parent->_transmode = strtoupper($transaction_mode); - } - - function BeginTrans() - { - $parent = $this->pdoDriver; - if ($parent->transOff) return true; - $parent->transCnt += 1; - $parent->_autocommit = false; - return $parent->Execute("BEGIN {$parent->_transmode}"); - } - - function CommitTrans($ok=true) - { - $parent = $this->pdoDriver; - if ($parent->transOff) return true; - if (!$ok) return $parent->RollbackTrans(); - if ($parent->transCnt) $parent->transCnt -= 1; - $parent->_autocommit = true; - - $ret = $parent->Execute('COMMIT'); - return $ret; - } - - function RollbackTrans() - { - $parent = $this->pdoDriver; - if ($parent->transOff) return true; - if ($parent->transCnt) $parent->transCnt -= 1; - $parent->_autocommit = true; - - $ret = $parent->Execute('ROLLBACK'); - return $ret; - } - - - // mark newnham - function MetaColumns($tab,$normalize=true) - { - global $ADODB_FETCH_MODE; - - $parent = $this->pdoDriver; - $false = false; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - if ($parent->fetchMode !== false) $savem = $parent->SetFetchMode(false); - $rs = $parent->Execute("PRAGMA table_info('$tab')"); - if (isset($savem)) $parent->SetFetchMode($savem); - if (!$rs) { - $ADODB_FETCH_MODE = $save; - return $false; - } - $arr = array(); - while ($r = $rs->FetchRow()) { - $type = explode('(',$r['type']); - $size = ''; - if (sizeof($type)==2) - $size = trim($type[1],')'); - $fn = strtoupper($r['name']); - $fld = new ADOFieldObject; - $fld->name = $r['name']; - $fld->type = $type[0]; - $fld->max_length = $size; - $fld->not_null = $r['notnull']; - $fld->primary_key = $r['pk']; - $fld->default_value = $r['dflt_value']; - $fld->scale = 0; - if ($save == ADODB_FETCH_NUM) $arr[] = $fld; - else $arr[strtoupper($fld->name)] = $fld; - } - $rs->Close(); - $ADODB_FETCH_MODE = $save; - return $arr; - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - $parent = $this->pdoDriver; - - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr(strtoupper($mask)); - $this->metaTablesSQL .= " AND name LIKE $mask"; - } - - $ret = $parent->GetCol($this->metaTablesSQL); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-postgres.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-postgres.inc.php deleted file mode 100644 index 1e229056..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-postgres.inc.php +++ /dev/null @@ -1,14 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-postgres64.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-postgres64.inc.php deleted file mode 100644 index 76ac8d73..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-postgres64.inc.php +++ /dev/null @@ -1,1071 +0,0 @@ - - jlim - changed concat operator to || and data types to MetaType to match documented pgsql types - see http://www.postgresql.org/devel-corner/docs/postgres/datatype.htm - 22 Nov 2000 jlim - added changes to FetchField() and MetaTables() contributed by "raser" - 27 Nov 2000 jlim - added changes to _connect/_pconnect from ideas by "Lennie" - 15 Dec 2000 jlim - added changes suggested by Additional code changes by "Eric G. Werk" egw@netguide.dk. - 31 Jan 2002 jlim - finally installed postgresql. testing - 01 Mar 2001 jlim - Freek Dijkstra changes, also support for text type - - See http://www.varlena.com/varlena/GeneralBits/47.php - - -- What indexes are on my table? - select * from pg_indexes where tablename = 'tablename'; - - -- What triggers are on my table? - select c.relname as "Table", t.tgname as "Trigger Name", - t.tgconstrname as "Constraint Name", t.tgenabled as "Enabled", - t.tgisconstraint as "Is Constraint", cc.relname as "Referenced Table", - p.proname as "Function Name" - from pg_trigger t, pg_class c, pg_class cc, pg_proc p - where t.tgfoid = p.oid and t.tgrelid = c.oid - and t.tgconstrrelid = cc.oid - and c.relname = 'tablename'; - - -- What constraints are on my table? - select r.relname as "Table", c.conname as "Constraint Name", - contype as "Constraint Type", conkey as "Key Columns", - confkey as "Foreign Columns", consrc as "Source" - from pg_class r, pg_constraint c - where r.oid = c.conrelid - and relname = 'tablename'; - - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -function adodb_addslashes($s) -{ - $len = strlen($s); - if ($len == 0) return "''"; - if (strncmp($s,"'",1) === 0 && substr($s,$len-1) == "'") return $s; // already quoted - - return "'".addslashes($s)."'"; -} - -class ADODB_postgres64 extends ADOConnection{ - var $databaseType = 'postgres64'; - var $dataProvider = 'postgres'; - var $hasInsertID = true; - var $_resultid = false; - var $concat_operator='||'; - var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1"; - var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg_%' - and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages', - 'sql_packages', 'sql_sizing', 'sql_sizing_profiles') - union - select viewname,'V' from pg_views where viewname not like 'pg_%'"; - //"select tablename from pg_tables where tablename not like 'pg_%' order by 1"; - var $isoDates = true; // accepts dates in ISO format - var $sysDate = "CURRENT_DATE"; - var $sysTimeStamp = "CURRENT_TIMESTAMP"; - var $blobEncodeType = 'C'; - var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum - FROM pg_class c, pg_attribute a,pg_type t - WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%' -AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; - - // used when schema defined - var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum -FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n -WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) - and c.relnamespace=n.oid and n.nspname='%s' - and a.attname not like '....%%' AND a.attnum > 0 - AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum"; - - // get primary key etc -- from Freek Dijkstra - var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key - FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'"; - - var $hasAffectedRows = true; - var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10 - // below suggested by Freek Dijkstra - var $true = 'TRUE'; // string that represents TRUE for a database - var $false = 'FALSE'; // string that represents FALSE for a database - var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database - var $fmtTimeStamp = "'Y-m-d H:i:s'"; // used by DBTimeStamp as the default timestamp fmt. - var $hasMoveFirst = true; - var $hasGenID = true; - var $_genIDSQL = "SELECT NEXTVAL('%s')"; - var $_genSeqSQL = "CREATE SEQUENCE %s START %s"; - var $_dropSeqSQL = "DROP SEQUENCE %s"; - var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum"; - var $random = 'random()'; /// random function - var $autoRollback = true; // apparently pgsql does not autorollback properly before php 4.3.4 - // http://bugs.php.net/bug.php?id=25404 - - var $uniqueIisR = true; - var $_bindInputArray = false; // requires postgresql 7.3+ and ability to modify database - var $disableBlobs = false; // set to true to disable blob checking, resulting in 2-5% improvement in performance. - - // The last (fmtTimeStamp is not entirely correct: - // PostgreSQL also has support for time zones, - // and writes these time in this format: "2001-03-01 18:59:26+02". - // There is no code for the "+02" time zone information, so I just left that out. - // I'm not familiar enough with both ADODB as well as Postgres - // to know what the concequences are. The other values are correct (wheren't in 0.94) - // -- Freek Dijkstra - - function ADODB_postgres64() - { - // changes the metaColumnsSQL, adds columns: attnum[6] - } - - function ServerInfo() - { - if (isset($this->version)) return $this->version; - - $arr['description'] = $this->GetOne("select version()"); - $arr['version'] = ADOConnection::_findvers($arr['description']); - $this->version = $arr; - return $arr; - } - - function IfNull( $field, $ifNull ) - { - return " coalesce($field, $ifNull) "; - } - - // get the last id - never tested - function pg_insert_id($tablename,$fieldname) - { - $result=pg_exec($this->_connectionID, "SELECT last_value FROM ${tablename}_${fieldname}_seq"); - if ($result) { - $arr = @pg_fetch_row($result,0); - pg_freeresult($result); - if (isset($arr[0])) return $arr[0]; - } - return false; - } - - /* Warning from http://www.php.net/manual/function.pg-getlastoid.php: - Using a OID as a unique identifier is not generally wise. - Unless you are very careful, you might end up with a tuple having - a different OID if a database must be reloaded. */ - function _insertid($table,$column) - { - if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false; - $oid = pg_getlastoid($this->_resultid); - // to really return the id, we need the table and column-name, else we can only return the oid != id - return empty($table) || empty($column) ? $oid : $this->GetOne("SELECT CURRVAL('".$table."_".$column."_seq')"); - } - - // I get this error with PHP before 4.0.6 - jlim - // Warning: This compilation does not support pg_cmdtuples() in adodb-postgres.inc.php on line 44 - function _affectedrows() - { - if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false; - return pg_cmdtuples($this->_resultid); - } - - - // returns true/false - function BeginTrans() - { - if ($this->transOff) return true; - $this->transCnt += 1; - return @pg_Exec($this->_connectionID, "begin ".$this->_transmode); - } - - function RowLock($tables,$where,$col='1 as ignore') - { - if (!$this->transCnt) $this->BeginTrans(); - return $this->GetOne("select $col from $tables where $where for update"); - } - - // returns true/false. - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - - $this->transCnt -= 1; - return @pg_Exec($this->_connectionID, "commit"); - } - - // returns true/false - function RollbackTrans() - { - if ($this->transOff) return true; - $this->transCnt -= 1; - return @pg_Exec($this->_connectionID, "rollback"); - } - - function MetaTables($ttype=false,$showSchema=false,$mask=false) - { - $info = $this->ServerInfo(); - if ($info['version'] >= 7.3) { - $this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg_%' - and schemaname not in ( 'pg_catalog','information_schema') - union - select viewname,'V' from pg_views where viewname not like 'pg_%' and schemaname not in ( 'pg_catalog','information_schema') "; - } - if ($mask) { - $save = $this->metaTablesSQL; - $mask = $this->qstr(strtolower($mask)); - if ($info['version']>=7.3) - $this->metaTablesSQL = " -select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema') - union -select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') "; - else - $this->metaTablesSQL = " -select tablename,'T' from pg_tables where tablename like $mask - union -select viewname,'V' from pg_views where viewname like $mask"; - } - $ret = ADOConnection::MetaTables($ttype,$showSchema); - - if ($mask) { - $this->metaTablesSQL = $save; - } - return $ret; - } - - - // if magic quotes disabled, use pg_escape_string() - function qstr($s,$magic_quotes=false) - { - if (is_bool($s)) return $s ? 'true' : 'false'; - - if (!$magic_quotes) { - if (ADODB_PHPVER >= 0x5200) { - return "'".pg_escape_string($this->_connectionID,$s)."'"; - } - if (ADODB_PHPVER >= 0x4200) { - return "'".pg_escape_string($s)."'"; - } - if ($this->replaceQuote[0] == '\\'){ - $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\\000"),$s); - } - return "'".str_replace("'",$this->replaceQuote,$s)."'"; - } - - // undo magic quotes for " - $s = str_replace('\\"','"',$s); - return "'$s'"; - } - - - - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysTimeStamp; - $s = 'TO_CHAR('.$col.",'"; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= 'YYYY'; - break; - case 'Q': - case 'q': - $s .= 'Q'; - break; - - case 'M': - $s .= 'Mon'; - break; - - case 'm': - $s .= 'MM'; - break; - case 'D': - case 'd': - $s .= 'DD'; - break; - - case 'H': - $s.= 'HH24'; - break; - - case 'h': - $s .= 'HH'; - break; - - case 'i': - $s .= 'MI'; - break; - - case 's': - $s .= 'SS'; - break; - - case 'a': - case 'A': - $s .= 'AM'; - break; - - case 'w': - $s .= 'D'; - break; - - case 'l': - $s .= 'DAY'; - break; - - case 'W': - $s .= 'WW'; - break; - - default: - // handle escape characters... - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - if (strpos('-/.:;, ',$ch) !== false) $s .= $ch; - else $s .= '"'.$ch.'"'; - - } - } - return $s. "')"; - } - - - - /* - * Load a Large Object from a file - * - the procedure stores the object id in the table and imports the object using - * postgres proprietary blob handling routines - * - * contributed by Mattia Rossi mattia@technologist.com - * modified for safe mode by juraj chlebec - */ - function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') - { - pg_exec ($this->_connectionID, "begin"); - - $fd = fopen($path,'r'); - $contents = fread($fd,filesize($path)); - fclose($fd); - - $oid = pg_lo_create($this->_connectionID); - $handle = pg_lo_open($this->_connectionID, $oid, 'w'); - pg_lo_write($handle, $contents); - pg_lo_close($handle); - - // $oid = pg_lo_import ($path); - pg_exec($this->_connectionID, "commit"); - $rs = ADOConnection::UpdateBlob($table,$column,$oid,$where,$blobtype); - $rez = !empty($rs); - return $rez; - } - - /* - * Deletes/Unlinks a Blob from the database, otherwise it - * will be left behind - * - * Returns TRUE on success or FALSE on failure. - * - * contributed by Todd Rogers todd#windfox.net - */ - function BlobDelete( $blob ) - { - pg_exec ($this->_connectionID, "begin"); - $result = @pg_lo_unlink($blob); - pg_exec ($this->_connectionID, "commit"); - return( $result ); - } - - /* - Hueristic - not guaranteed to work. - */ - function GuessOID($oid) - { - if (strlen($oid)>16) return false; - return is_numeric($oid); - } - - /* - * If an OID is detected, then we use pg_lo_* to open the oid file and read the - * real blob from the db using the oid supplied as a parameter. If you are storing - * blobs using bytea, we autodetect and process it so this function is not needed. - * - * contributed by Mattia Rossi mattia@technologist.com - * - * see http://www.postgresql.org/idocs/index.php?largeobjects.html - * - * Since adodb 4.54, this returns the blob, instead of sending it to stdout. Also - * added maxsize parameter, which defaults to $db->maxblobsize if not defined. - */ - function BlobDecode($blob,$maxsize=false,$hastrans=true) - { - if (!$this->GuessOID($blob)) return $blob; - - if ($hastrans) @pg_exec($this->_connectionID,"begin"); - $fd = @pg_lo_open($this->_connectionID,$blob,"r"); - if ($fd === false) { - if ($hastrans) @pg_exec($this->_connectionID,"commit"); - return $blob; - } - if (!$maxsize) $maxsize = $this->maxblobsize; - $realblob = @pg_loread($fd,$maxsize); - @pg_loclose($fd); - if ($hastrans) @pg_exec($this->_connectionID,"commit"); - return $realblob; - } - - /* - See http://www.postgresql.org/idocs/index.php?datatype-binary.html - - NOTE: SQL string literals (input strings) must be preceded with two backslashes - due to the fact that they must pass through two parsers in the PostgreSQL - backend. - */ - function BlobEncode($blob) - { - if (ADODB_PHPVER >= 0x5200) return pg_escape_bytea($this->_connectionID, $blob); - if (ADODB_PHPVER >= 0x4200) return pg_escape_bytea($blob); - - /*92=backslash, 0=null, 39=single-quote*/ - $badch = array(chr(92),chr(0),chr(39)); # \ null ' - $fixch = array('\\\\134','\\\\000','\\\\047'); - return adodb_str_replace($badch,$fixch,$blob); - - // note that there is a pg_escape_bytea function only for php 4.2.0 or later - } - - // assumes bytea for blob, and varchar for clob - function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') - { - - if ($blobtype == 'CLOB') { - return $this->Execute("UPDATE $table SET $column=" . $this->qstr($val) . " WHERE $where"); - } - // do not use bind params which uses qstr(), as blobencode() already quotes data - return $this->Execute("UPDATE $table SET $column='".$this->BlobEncode($val)."'::bytea WHERE $where"); - } - - function OffsetDate($dayFraction,$date=false) - { - if (!$date) $date = $this->sysDate; - else if (strncmp($date,"'",1) == 0) { - $len = strlen($date); - if (10 <= $len && $len <= 12) $date = 'date '.$date; - else $date = 'timestamp '.$date; - } - - - return "($date+interval'".($dayFraction * 1440)." minutes')"; - #return "($date+interval'$dayFraction days')"; - } - - - // for schema support, pass in the $table param "$schema.$tabname". - // converts field names to lowercase, $upper is ignored - // see http://phplens.com/lens/lensforum/msgs.php?id=14018 for more info - function MetaColumns($table,$normalize=true) - { - global $ADODB_FETCH_MODE; - - $schema = false; - $false = false; - $this->_findschema($table,$schema); - - if ($normalize) $table = strtolower($table); - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - - if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema)); - else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table)); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if ($rs === false) { - return $false; - } - if (!empty($this->metaKeySQL)) { - // If we want the primary keys, we have to issue a separate query - // Of course, a modified version of the metaColumnsSQL query using a - // LEFT JOIN would have been much more elegant, but postgres does - // not support OUTER JOINS. So here is the clumsy way. - - $this->fetchMode = ADODB_FETCH_ASSOC; - - $rskey = $this->Execute(sprintf($this->metaKeySQL,($table))); - // fetch all result in once for performance. - $keys = $rskey->GetArray(); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - $rskey->Close(); - unset($rskey); - } - - $rsdefa = array(); - if (!empty($this->metaDefaultsSQL)) { - $this->fetchMode = ADODB_FETCH_ASSOC; - $sql = sprintf($this->metaDefaultsSQL, ($table)); - $rsdef = $this->Execute($sql); - if (isset($savem)) $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if ($rsdef) { - while (!$rsdef->EOF) { - $num = $rsdef->fields['num']; - $s = $rsdef->fields['def']; - if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */ - $s = substr($s, 1); - $s = substr($s, 0, strlen($s) - 1); - } - - $rsdefa[$num] = $s; - $rsdef->MoveNext(); - } - } else { - ADOConnection::outp( "==> SQL => " . $sql); - } - unset($rsdef); - } - - $retarr = array(); - while (!$rs->EOF) { - $fld = new ADOFieldObject(); - $fld->name = $rs->fields[0]; - $fld->type = $rs->fields[1]; - $fld->max_length = $rs->fields[2]; - $fld->attnum = $rs->fields[6]; - - if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4; - if ($fld->max_length <= 0) $fld->max_length = -1; - if ($fld->type == 'numeric') { - $fld->scale = $fld->max_length & 0xFFFF; - $fld->max_length >>= 16; - } - // dannym - // 5 hasdefault; 6 num-of-column - $fld->has_default = ($rs->fields[5] == 't'); - if ($fld->has_default) { - $fld->default_value = $rsdefa[$rs->fields[6]]; - } - - //Freek - $fld->not_null = $rs->fields[4] == 't'; - - - // Freek - if (is_array($keys)) { - foreach($keys as $key) { - if ($fld->name == $key['column_name'] AND $key['primary_key'] == 't') - $fld->primary_key = true; - if ($fld->name == $key['column_name'] AND $key['unique_key'] == 't') - $fld->unique = true; // What name is more compatible? - } - } - - if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; - else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld; - - $rs->MoveNext(); - } - $rs->Close(); - if (empty($retarr)) - return $false; - else - return $retarr; - - } - - function MetaIndexes ($table, $primary = FALSE) - { - global $ADODB_FETCH_MODE; - - $schema = false; - $this->_findschema($table,$schema); - - if ($schema) { // requires pgsql 7.3+ - pg_namespace used. - $sql = ' -SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns" -FROM pg_catalog.pg_class c -JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid -JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid - ,pg_namespace n -WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\')) and c.relnamespace=c2.relnamespace and c.relnamespace=n.oid and n.nspname=\'%s\''; - } else { - $sql = ' -SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns" -FROM pg_catalog.pg_class c -JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid -JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid -WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\'))'; - } - - if ($primary == FALSE) { - $sql .= ' AND i.indisprimary=false;'; - } - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - $rs = $this->Execute(sprintf($sql,$table,$table,$schema)); - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - if (!is_object($rs)) { - $false = false; - return $false; - } - - $col_names = $this->MetaColumnNames($table,true,true); - //3rd param is use attnum, - // see http://sourceforge.net/tracker/index.php?func=detail&aid=1451245&group_id=42718&atid=433976 - $indexes = array(); - while ($row = $rs->FetchRow()) { - $columns = array(); - foreach (explode(' ', $row[2]) as $col) { - $columns[] = $col_names[$col]; - } - - $indexes[$row[0]] = array( - 'unique' => ($row[1] == 't'), - 'columns' => $columns - ); - } - return $indexes; - } - - // returns true or false - // - // examples: - // $db->Connect("host=host1 user=user1 password=secret port=4341"); - // $db->Connect('host1','user1','secret'); - function _connect($str,$user='',$pwd='',$db='',$ctype=0) - { - - if (!function_exists('pg_connect')) return null; - - $this->_errorMsg = false; - - if ($user || $pwd || $db) { - $user = adodb_addslashes($user); - $pwd = adodb_addslashes($pwd); - if (strlen($db) == 0) $db = 'template1'; - $db = adodb_addslashes($db); - if ($str) { - $host = explode(":", $str); - if ($host[0]) $str = "host=".adodb_addslashes($host[0]); - else $str = ''; - if (isset($host[1])) $str .= " port=$host[1]"; - else if (!empty($this->port)) $str .= " port=".$this->port; - } - if ($user) $str .= " user=".$user; - if ($pwd) $str .= " password=".$pwd; - if ($db) $str .= " dbname=".$db; - } - - //if ($user) $linea = "user=$user host=$linea password=$pwd dbname=$db port=5432"; - - if ($ctype === 1) { // persistent - $this->_connectionID = pg_pconnect($str); - } else { - if ($ctype === -1) { // nconnect, we trick pgsql ext by changing the connection str - static $ncnt; - - if (empty($ncnt)) $ncnt = 1; - else $ncnt += 1; - - $str .= str_repeat(' ',$ncnt); - } - $this->_connectionID = pg_connect($str); - } - if ($this->_connectionID === false) return false; - $this->Execute("set datestyle='ISO'"); - - $info = $this->ServerInfo(); - $this->pgVersion = (float) substr($info['version'],0,3); - if ($this->pgVersion >= 7.1) { // good till version 999 - $this->_nestedSQL = true; - } - return true; - } - - function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName) - { - return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName,-1); - } - - // returns true or false - // - // examples: - // $db->PConnect("host=host1 user=user1 password=secret port=4341"); - // $db->PConnect('host1','user1','secret'); - function _pconnect($str,$user='',$pwd='',$db='') - { - return $this->_connect($str,$user,$pwd,$db,1); - } - - - // returns queryID or false - function _query($sql,$inputarr=false) - { - $this->_errorMsg = false; - if ($inputarr) { - /* - It appears that PREPARE/EXECUTE is slower for many queries. - - For query executed 1000 times: - "select id,firstname,lastname from adoxyz - where firstname not like ? and lastname not like ? and id = ?" - - with plan = 1.51861286163 secs - no plan = 1.26903700829 secs - - - - */ - $plan = 'P'.md5($sql); - - $execp = ''; - foreach($inputarr as $v) { - if ($execp) $execp .= ','; - if (is_string($v)) { - if (strncmp($v,"'",1) !== 0) $execp .= $this->qstr($v); - } else { - $execp .= $v; - } - } - - if ($execp) $exsql = "EXECUTE $plan ($execp)"; - else $exsql = "EXECUTE $plan"; - - - $rez = @pg_exec($this->_connectionID,$exsql); - if (!$rez) { - # Perhaps plan does not exist? Prepare/compile plan. - $params = ''; - foreach($inputarr as $v) { - if ($params) $params .= ','; - if (is_string($v)) { - $params .= 'VARCHAR'; - } else if (is_integer($v)) { - $params .= 'INTEGER'; - } else { - $params .= "REAL"; - } - } - $sqlarr = explode('?',$sql); - //print_r($sqlarr); - $sql = ''; - $i = 1; - foreach($sqlarr as $v) { - $sql .= $v.' $'.$i; - $i++; - } - $s = "PREPARE $plan ($params) AS ".substr($sql,0,strlen($sql)-2); - //adodb_pr($s); - $rez = pg_exec($this->_connectionID,$s); - //echo $this->ErrorMsg(); - } - if ($rez) - $rez = pg_exec($this->_connectionID,$exsql); - } else { - //adodb_backtrace(); - $rez = pg_exec($this->_connectionID,$sql); - } - // check if no data returned, then no need to create real recordset - if ($rez && pg_numfields($rez) <= 0) { - if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') { - pg_freeresult($this->_resultid); - } - $this->_resultid = $rez; - return true; - } - - return $rez; - } - - function _errconnect() - { - if (defined('DB_ERROR_CONNECT_FAILED')) return DB_ERROR_CONNECT_FAILED; - else return 'Database connection failed'; - } - - /* Returns: the last error message from previous database operation */ - function ErrorMsg() - { - if ($this->_errorMsg !== false) return $this->_errorMsg; - if (ADODB_PHPVER >= 0x4300) { - if (!empty($this->_resultid)) { - $this->_errorMsg = @pg_result_error($this->_resultid); - if ($this->_errorMsg) return $this->_errorMsg; - } - - if (!empty($this->_connectionID)) { - $this->_errorMsg = @pg_last_error($this->_connectionID); - } else $this->_errorMsg = $this->_errconnect(); - } else { - if (empty($this->_connectionID)) $this->_errconnect(); - else $this->_errorMsg = @pg_errormessage($this->_connectionID); - } - return $this->_errorMsg; - } - - function ErrorNo() - { - $e = $this->ErrorMsg(); - if (strlen($e)) { - return ADOConnection::MetaError($e); - } - return 0; - } - - // returns true or false - function _close() - { - if ($this->transCnt) $this->RollbackTrans(); - if ($this->_resultid) { - @pg_freeresult($this->_resultid); - $this->_resultid = false; - } - @pg_close($this->_connectionID); - $this->_connectionID = false; - return true; - } - - - /* - * Maximum size of C field - */ - function CharMax() - { - return 1000000000; // should be 1 Gb? - } - - /* - * Maximum size of X field - */ - function TextMax() - { - return 1000000000; // should be 1 Gb? - } - - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_postgres64 extends ADORecordSet{ - var $_blobArr; - var $databaseType = "postgres64"; - var $canSeek = true; - function ADORecordSet_postgres64($queryID,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch ($mode) - { - case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break; - case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break; - - case ADODB_FETCH_DEFAULT: - case ADODB_FETCH_BOTH: - default: $this->fetchMode = PGSQL_BOTH; break; - } - $this->adodbFetchMode = $mode; - $this->ADORecordSet($queryID); - } - - function GetRowAssoc($upper=true) - { - if ($this->fetchMode == PGSQL_ASSOC && !$upper) return $this->fields; - $row = ADORecordSet::GetRowAssoc($upper); - return $row; - } - - function _initrs() - { - global $ADODB_COUNTRECS; - $qid = $this->_queryID; - $this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($qid):-1; - $this->_numOfFields = @pg_numfields($qid); - - // cache types for blob decode check - // apparently pg_fieldtype actually performs an sql query on the database to get the type. - if (empty($this->connection->noBlobs)) - for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { - if (pg_fieldtype($qid,$i) == 'bytea') { - $this->_blobArr[$i] = pg_fieldname($qid,$i); - } - } - } - - /* Use associative array to get fields array */ - function Fields($colname) - { - if ($this->fetchMode != PGSQL_NUM) return @$this->fields[$colname]; - - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - function FetchField($off = 0) - { - // offsets begin at 0 - - $o= new ADOFieldObject(); - $o->name = @pg_fieldname($this->_queryID,$off); - $o->type = @pg_fieldtype($this->_queryID,$off); - $o->max_length = @pg_fieldsize($this->_queryID,$off); - return $o; - } - - function _seek($row) - { - return @pg_fetch_row($this->_queryID,$row); - } - - function _decode($blob) - { - if ($blob === NULL) return NULL; - eval('$realblob="'.adodb_str_replace(array('"','$'),array('\"','\$'),$blob).'";'); - return $realblob; - } - - function _fixblobs() - { - if ($this->fetchMode == PGSQL_NUM || $this->fetchMode == PGSQL_BOTH) { - foreach($this->_blobArr as $k => $v) { - $this->fields[$k] = ADORecordSet_postgres64::_decode($this->fields[$k]); - } - } - if ($this->fetchMode == PGSQL_ASSOC || $this->fetchMode == PGSQL_BOTH) { - foreach($this->_blobArr as $k => $v) { - $this->fields[$v] = ADORecordSet_postgres64::_decode($this->fields[$v]); - } - } - } - - // 10% speedup to move MoveNext to child class - function MoveNext() - { - if (!$this->EOF) { - $this->_currentRow++; - if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { - $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); - if (is_array($this->fields) && $this->fields) { - if (isset($this->_blobArr)) $this->_fixblobs(); - return true; - } - } - $this->fields = false; - $this->EOF = true; - } - return false; - } - - function _fetch() - { - - if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0) - return false; - - $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); - - if ($this->fields && isset($this->_blobArr)) $this->_fixblobs(); - - return (is_array($this->fields)); - } - - function _close() - { - return @pg_freeresult($this->_queryID); - } - - function MetaType($t,$len=-1,$fieldobj=false) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - switch (strtoupper($t)) { - case 'MONEY': // stupid, postgres expects money to be a string - case 'INTERVAL': - case 'CHAR': - case 'CHARACTER': - case 'VARCHAR': - case 'NAME': - case 'BPCHAR': - case '_VARCHAR': - case 'INET': - case 'MACADDR': - if ($len <= $this->blobSize) return 'C'; - - case 'TEXT': - return 'X'; - - case 'IMAGE': // user defined type - case 'BLOB': // user defined type - case 'BIT': // This is a bit string, not a single bit, so don't return 'L' - case 'VARBIT': - case 'BYTEA': - return 'B'; - - case 'BOOL': - case 'BOOLEAN': - return 'L'; - - case 'DATE': - return 'D'; - - - case 'TIMESTAMP WITHOUT TIME ZONE': - case 'TIME': - case 'DATETIME': - case 'TIMESTAMP': - case 'TIMESTAMPTZ': - return 'T'; - - case 'SMALLINT': - case 'BIGINT': - case 'INTEGER': - case 'INT8': - case 'INT4': - case 'INT2': - if (isset($fieldobj) && - empty($fieldobj->primary_key) && (!$this->connection->uniqueIisR || empty($fieldobj->unique))) return 'I'; - - case 'OID': - case 'SERIAL': - return 'R'; - - default: - return 'N'; - } - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-postgres7.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-postgres7.inc.php deleted file mode 100644 index f5cb27ff..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-postgres7.inc.php +++ /dev/null @@ -1,313 +0,0 @@ -ADODB_postgres64(); - if (ADODB_ASSOC_CASE !== 2) { - $this->rsPrefix .= 'assoc_'; - } - $this->_bindInputArray = PHP_VERSION >= 5.1; - } - - - // the following should be compat with postgresql 7.2, - // which makes obsolete the LIMIT limit,offset syntax - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - $offsetStr = ($offset >= 0) ? " OFFSET ".((integer)$offset) : ''; - $limitStr = ($nrows >= 0) ? " LIMIT ".((integer)$nrows) : ''; - if ($secs2cache) - $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); - else - $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); - - return $rs; - } - /* - function Prepare($sql) - { - $info = $this->ServerInfo(); - if ($info['version']>=7.3) { - return array($sql,false); - } - return $sql; - } - */ - - /* - I discovered that the MetaForeignKeys method no longer worked for Postgres 8.3. - I went ahead and modified it to work for both 8.2 and 8.3. - Please feel free to include this change in your next release of adodb. - William Kolodny [William.Kolodny#gt-t.net] - */ - function MetaForeignKeys($table, $owner=false, $upper=false) - { - $sql=" - SELECT fum.ftblname AS lookup_table, split_part(fum.rf, ')'::text, 1) AS lookup_field, - fum.ltable AS dep_table, split_part(fum.lf, ')'::text, 1) AS dep_field - FROM ( - SELECT fee.ltable, fee.ftblname, fee.consrc, split_part(fee.consrc,'('::text, 2) AS lf, - split_part(fee.consrc, '('::text, 3) AS rf - FROM ( - SELECT foo.relname AS ltable, foo.ftblname, - pg_get_constraintdef(foo.oid) AS consrc - FROM ( - SELECT c.oid, c.conname AS name, t.relname, ft.relname AS ftblname - FROM pg_constraint c - JOIN pg_class t ON (t.oid = c.conrelid) - JOIN pg_class ft ON (ft.oid = c.confrelid) - JOIN pg_namespace nft ON (nft.oid = ft.relnamespace) - LEFT JOIN pg_description ds ON (ds.objoid = c.oid) - JOIN pg_namespace n ON (n.oid = t.relnamespace) - WHERE c.contype = 'f'::\"char\" - ORDER BY t.relname, n.nspname, c.conname, c.oid - ) foo - ) fee) fum - WHERE fum.ltable='".strtolower($table)."' - ORDER BY fum.ftblname, fum.ltable, split_part(fum.lf, ')'::text, 1) - "; - $rs = $this->Execute($sql); - - if (!$rs || $rs->EOF) return false; - - $a = array(); - while (!$rs->EOF) { - if ($upper) { - $a[strtoupper($rs->Fields('lookup_table'))][] = strtoupper(str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field'))); - } else { - $a[$rs->Fields('lookup_table')][] = str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field')); - } - $rs->MoveNext(); - } - - return $a; - - } - - // from Edward Jaramilla, improved version - works on pg 7.4 - function _old_MetaForeignKeys($table, $owner=false, $upper=false) - { - $sql = 'SELECT t.tgargs as args - FROM - pg_trigger t,pg_class c,pg_proc p - WHERE - t.tgenabled AND - t.tgrelid = c.oid AND - t.tgfoid = p.oid AND - p.proname = \'RI_FKey_check_ins\' AND - c.relname = \''.strtolower($table).'\' - ORDER BY - t.tgrelid'; - - $rs = $this->Execute($sql); - - if (!$rs || $rs->EOF) return false; - - $arr = $rs->GetArray(); - $a = array(); - foreach($arr as $v) { - $data = explode(chr(0), $v['args']); - $size = count($data)-1; //-1 because the last node is empty - for($i = 4; $i < $size; $i++) { - if ($upper) - $a[strtoupper($data[2])][] = strtoupper($data[$i].'='.$data[++$i]); - else - $a[$data[2]][] = $data[$i].'='.$data[++$i]; - } - } - return $a; - } - - function _query($sql,$inputarr=false) - { - if (! $this->_bindInputArray) { - // We don't have native support for parameterized queries, so let's emulate it at the parent - return ADODB_postgres64::_query($sql, $inputarr); - } - $this->_errorMsg = false; - // -- added Cristiano da Cunha Duarte - if ($inputarr) { - $sqlarr = explode('?',trim($sql)); - $sql = ''; - $i = 1; - $last = sizeof($sqlarr)-1; - foreach($sqlarr as $v) { - if ($last < $i) $sql .= $v; - else $sql .= $v.' $'.$i; - $i++; - } - - $rez = pg_query_params($this->_connectionID,$sql, $inputarr); - } else { - $rez = pg_query($this->_connectionID,$sql); - } - // check if no data returned, then no need to create real recordset - if ($rez && pg_numfields($rez) <= 0) { - if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') { - pg_freeresult($this->_resultid); - } - $this->_resultid = $rez; - return true; - } - return $rez; - } - - // this is a set of functions for managing client encoding - very important if the encodings - // of your database and your output target (i.e. HTML) don't match - //for instance, you may have UNICODE database and server it on-site as WIN1251 etc. - // GetCharSet - get the name of the character set the client is using now - // the functions should work with Postgres 7.0 and above, the set of charsets supported - // depends on compile flags of postgres distribution - if no charsets were compiled into the server - // it will return 'SQL_ANSI' always - function GetCharSet() - { - //we will use ADO's builtin property charSet - $this->charSet = @pg_client_encoding($this->_connectionID); - if (!$this->charSet) { - return false; - } else { - return $this->charSet; - } - } - - // SetCharSet - switch the client encoding - function SetCharSet($charset_name) - { - $this->GetCharSet(); - if ($this->charSet !== $charset_name) { - $if = pg_set_client_encoding($this->_connectionID, $charset_name); - if ($if == "0" & $this->GetCharSet() == $charset_name) { - return true; - } else return false; - } else return true; - } - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordSet_postgres7 extends ADORecordSet_postgres64{ - - var $databaseType = "postgres7"; - - - function ADORecordSet_postgres7($queryID,$mode=false) - { - $this->ADORecordSet_postgres64($queryID,$mode); - } - - // 10% speedup to move MoveNext to child class - function MoveNext() - { - if (!$this->EOF) { - $this->_currentRow++; - if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { - $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); - - if (is_array($this->fields)) { - if ($this->fields && isset($this->_blobArr)) $this->_fixblobs(); - return true; - } - } - $this->fields = false; - $this->EOF = true; - } - return false; - } - -} - -class ADORecordSet_assoc_postgres7 extends ADORecordSet_postgres64{ - - var $databaseType = "postgres7"; - - - function ADORecordSet_assoc_postgres7($queryID,$mode=false) - { - $this->ADORecordSet_postgres64($queryID,$mode); - } - - function _fetch() - { - if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0) - return false; - - $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); - - if ($this->fields) { - if (isset($this->_blobArr)) $this->_fixblobs(); - $this->_updatefields(); - } - - return (is_array($this->fields)); - } - - // Create associative array - function _updatefields() - { - if (ADODB_ASSOC_CASE == 2) return; // native - - $arr = array(); - $lowercase = (ADODB_ASSOC_CASE == 0); - - foreach($this->fields as $k => $v) { - if (is_integer($k)) $arr[$k] = $v; - else { - if ($lowercase) - $arr[strtolower($k)] = $v; - else - $arr[strtoupper($k)] = $v; - } - } - $this->fields = $arr; - } - - function MoveNext() - { - if (!$this->EOF) { - $this->_currentRow++; - if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { - $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); - - if (is_array($this->fields)) { - if ($this->fields) { - if (isset($this->_blobArr)) $this->_fixblobs(); - - $this->_updatefields(); - } - return true; - } - } - - - $this->fields = false; - $this->EOF = true; - } - return false; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-postgres8.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-postgres8.inc.php deleted file mode 100644 index da76df3c..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-postgres8.inc.php +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-proxy.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-proxy.inc.php deleted file mode 100644 index 2f16a7de..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-proxy.inc.php +++ /dev/null @@ -1,33 +0,0 @@ -ADORecordset($id,$mode); - } - }; -} // define - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-sapdb.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-sapdb.inc.php deleted file mode 100644 index ed4a9944..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-sapdb.inc.php +++ /dev/null @@ -1,184 +0,0 @@ -curmode = SQL_CUR_USE_ODBC; - $this->ADODB_odbc(); - } - - function ServerInfo() - { - $info = ADODB_odbc::ServerInfo(); - if (!$info['version'] && preg_match('/([0-9.]+)/',$info['description'],$matches)) { - $info['version'] = $matches[1]; - } - return $info; - } - - function MetaPrimaryKeys($table) - { - $table = $this->Quote(strtoupper($table)); - - return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"); - } - - function MetaIndexes ($table, $primary = FALSE) - { - $table = $this->Quote(strtoupper($table)); - - $sql = "SELECT INDEXNAME,TYPE,COLUMNNAME FROM INDEXCOLUMNS ". - " WHERE TABLENAME=$table". - " ORDER BY INDEXNAME,COLUMNNO"; - - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - - $rs = $this->Execute($sql); - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - if (!is_object($rs)) { - return FALSE; - } - - $indexes = array(); - while ($row = $rs->FetchRow()) { - $indexes[$row[0]]['unique'] = $row[1] == 'UNIQUE'; - $indexes[$row[0]]['columns'][] = $row[2]; - } - if ($primary) { - $indexes['SYSPRIMARYKEYINDEX'] = array( - 'unique' => True, // by definition - 'columns' => $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"), - ); - } - return $indexes; - } - - function MetaColumns ($table) - { - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - $table = $this->Quote(strtoupper($table)); - - $retarr = array(); - foreach($this->GetAll("SELECT COLUMNNAME,DATATYPE,LEN,DEC,NULLABLE,MODE,\"DEFAULT\",CASE WHEN \"DEFAULT\" IS NULL THEN 0 ELSE 1 END AS HAS_DEFAULT FROM COLUMNS WHERE tablename=$table ORDER BY pos") as $column) - { - $fld = new ADOFieldObject(); - $fld->name = $column[0]; - $fld->type = $column[1]; - $fld->max_length = $fld->type == 'LONG' ? 2147483647 : $column[2]; - $fld->scale = $column[3]; - $fld->not_null = $column[4] == 'NO'; - $fld->primary_key = $column[5] == 'KEY'; - if ($fld->has_default = $column[7]) { - if ($fld->primary_key && $column[6] == 'DEFAULT SERIAL (1)') { - $fld->auto_increment = true; - $fld->has_default = false; - } else { - $fld->default_value = $column[6]; - switch($fld->type) { - case 'VARCHAR': - case 'CHARACTER': - case 'LONG': - $fld->default_value = $column[6]; - break; - default: - $fld->default_value = trim($column[6]); - break; - } - } - } - $retarr[$fld->name] = $fld; - } - if (isset($savem)) { - $this->SetFetchMode($savem); - } - $ADODB_FETCH_MODE = $save; - - return $retarr; - } - - function MetaColumnNames($table) - { - $table = $this->Quote(strtoupper($table)); - - return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table ORDER BY pos"); - } - - // unlike it seems, this depends on the db-session and works in a multiuser environment - function _insertid($table,$column) - { - return empty($table) ? False : $this->GetOne("SELECT $table.CURRVAL FROM DUAL"); - } - - /* - SelectLimit implementation problems: - - The following will return random 10 rows as order by performed after "WHERE rowno<10" - which is not ideal... - - select * from table where rowno < 10 order by 1 - - This means that we have to use the adoconnection base class SelectLimit when - there is an "order by". - - See http://listserv.sap.com/pipermail/sapdb.general/2002-January/010405.html - */ - - }; - - - class ADORecordSet_sapdb extends ADORecordSet_odbc { - - var $databaseType = "sapdb"; - - function ADORecordSet_sapdb($id,$mode=false) - { - $this->ADORecordSet_odbc($id,$mode); - } - } - -} //define -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-sqlanywhere.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-sqlanywhere.inc.php deleted file mode 100644 index 9cf132dd..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-sqlanywhere.inc.php +++ /dev/null @@ -1,169 +0,0 @@ -create_blobvar($blobVarName); - - b) load blob var from file. $filename must be complete path - - $dbcon->load_blobvar_from_file($blobVarName, $filename); - - c) Use the $blobVarName in SQL insert or update statement in the values - clause: - - $recordSet = $dbconn->Execute('INSERT INTO tabname (idcol, blobcol) ' - . - 'VALUES (\'test\', ' . $blobVarName . ')'); - - instead of loading blob from a file, you can also load from - an unformatted (raw) blob variable: - $dbcon->load_blobvar_from_var($blobVarName, $varName); - - d) drop blob variable on db server to free up resources: - $dbconn->drop_blobvar($blobVarName); - - Sybase_SQLAnywhere data driver. Requires ODBC. - - */ - -// security - hide paths -if (!defined('ADODB_DIR')) die(); - -if (!defined('_ADODB_ODBC_LAYER')) { - include(ADODB_DIR."/drivers/adodb-odbc.inc.php"); -} - -if (!defined('ADODB_SYBASE_SQLANYWHERE')){ - - define('ADODB_SYBASE_SQLANYWHERE',1); - - class ADODB_sqlanywhere extends ADODB_odbc { - var $databaseType = "sqlanywhere"; - var $hasInsertID = true; - - function ADODB_sqlanywhere() - { - $this->ADODB_odbc(); - } - - function _insertid() { - return $this->GetOne('select @@identity'); - } - - function create_blobvar($blobVarName) { - $this->Execute("create variable $blobVarName long binary"); - return; - } - - function drop_blobvar($blobVarName) { - $this->Execute("drop variable $blobVarName"); - return; - } - - function load_blobvar_from_file($blobVarName, $filename) { - $chunk_size = 1000; - - $fd = fopen ($filename, "rb"); - - $integer_chunks = (integer)filesize($filename) / $chunk_size; - $modulus = filesize($filename) % $chunk_size; - if ($modulus != 0){ - $integer_chunks += 1; - } - - for($loop=1;$loop<=$integer_chunks;$loop++){ - $contents = fread ($fd, $chunk_size); - $contents = bin2hex($contents); - - $hexstring = ''; - - for($loop2=0;$loop2qstr($hexstring); - - $this->Execute("set $blobVarName = $blobVarName || " . $hexstring); - } - - fclose ($fd); - return; - } - - function load_blobvar_from_var($blobVarName, &$varName) { - $chunk_size = 1000; - - $integer_chunks = (integer)strlen($varName) / $chunk_size; - $modulus = strlen($varName) % $chunk_size; - if ($modulus != 0){ - $integer_chunks += 1; - } - - for($loop=1;$loop<=$integer_chunks;$loop++){ - $contents = substr ($varName, (($loop - 1) * $chunk_size), $chunk_size); - $contents = bin2hex($contents); - - $hexstring = ''; - - for($loop2=0;$loop2qstr($hexstring); - - $this->Execute("set $blobVarName = $blobVarName || " . $hexstring); - } - - return; - } - - /* - Insert a null into the blob field of the table first. - Then use UpdateBlob to store the blob. - - Usage: - - $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); - $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); - */ - function UpdateBlob($table,$column,&$val,$where,$blobtype='BLOB') - { - $blobVarName = 'hold_blob'; - $this->create_blobvar($blobVarName); - $this->load_blobvar_from_var($blobVarName, $val); - $this->Execute("UPDATE $table SET $column=$blobVarName WHERE $where"); - $this->drop_blobvar($blobVarName); - return true; - } - }; //class - - class ADORecordSet_sqlanywhere extends ADORecordSet_odbc { - - var $databaseType = "sqlanywhere"; - - function ADORecordSet_sqlanywhere($id,$mode=false) - { - $this->ADORecordSet_odbc($id,$mode); - } - - - }; //class - - -} //define -?> diff --git a/include/limesurvey/classes/adodb/drivers/adodb-sqlite.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-sqlite.inc.php deleted file mode 100644 index a2829397..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-sqlite.inc.php +++ /dev/null @@ -1,398 +0,0 @@ -fmtDate)."'"; - case 'sysTimeStamp' : return "'".date($this->sysTimeStamp)."'"; - } - }*/ - - function ServerInfo() - { - $arr['version'] = sqlite_libversion(); - $arr['description'] = 'SQLite '; - $arr['encoding'] = sqlite_libencoding(); - return $arr; - } - - function BeginTrans() - { - if ($this->transOff) return true; - $ret = $this->Execute("BEGIN TRANSACTION"); - $this->transCnt += 1; - return true; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - if (!$ok) return $this->RollbackTrans(); - $ret = $this->Execute("COMMIT"); - if ($this->transCnt>0)$this->transCnt -= 1; - return !empty($ret); - } - - function RollbackTrans() - { - if ($this->transOff) return true; - $ret = $this->Execute("ROLLBACK"); - if ($this->transCnt>0)$this->transCnt -= 1; - return !empty($ret); - } - - // mark newnham - function MetaColumns($table, $normalize=true) - { - global $ADODB_FETCH_MODE; - $false = false; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); - $rs = $this->Execute("PRAGMA table_info('$table')"); - if (isset($savem)) $this->SetFetchMode($savem); - if (!$rs) { - $ADODB_FETCH_MODE = $save; - return $false; - } - $arr = array(); - while ($r = $rs->FetchRow()) { - $type = explode('(',$r['type']); - $size = ''; - if (sizeof($type)==2) - $size = trim($type[1],')'); - $fn = strtoupper($r['name']); - $fld = new ADOFieldObject; - $fld->name = $r['name']; - $fld->type = $type[0]; - $fld->max_length = $size; - $fld->not_null = $r['notnull']; - $fld->default_value = $r['dflt_value']; - $fld->scale = 0; - if ($save == ADODB_FETCH_NUM) $arr[] = $fld; - else $arr[strtoupper($fld->name)] = $fld; - } - $rs->Close(); - $ADODB_FETCH_MODE = $save; - return $arr; - } - - function _init($parentDriver) - { - - $parentDriver->hasTransactions = false; - $parentDriver->hasInsertID = true; - } - - function _insertid() - { - return sqlite_last_insert_rowid($this->_connectionID); - } - - function _affectedrows() - { - return sqlite_changes($this->_connectionID); - } - - function ErrorMsg() - { - if ($this->_logsql) return $this->_errorMsg; - return ($this->_errorNo) ? sqlite_error_string($this->_errorNo) : ''; - } - - function ErrorNo() - { - return $this->_errorNo; - } - - function SQLDate($fmt, $col=false) - { - $fmt = $this->qstr($fmt); - return ($col) ? "adodb_date2($fmt,$col)" : "adodb_date($fmt)"; - } - - - function _createFunctions() - { - @sqlite_create_function($this->_connectionID, 'adodb_date', 'adodb_date', 1); - @sqlite_create_function($this->_connectionID, 'adodb_date2', 'adodb_date2', 2); - } - - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('sqlite_open')) return null; - if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename; - - $this->_connectionID = sqlite_open($argHostname); - if ($this->_connectionID === false) return false; - $this->_createFunctions(); - return true; - } - - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('sqlite_open')) return null; - if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename; - - $this->_connectionID = sqlite_popen($argHostname); - if ($this->_connectionID === false) return false; - $this->_createFunctions(); - return true; - } - - // returns query ID if successful, otherwise false - function _query($sql,$inputarr=false) - { - $rez = sqlite_query($sql,$this->_connectionID); - if (!$rez) { - $this->_errorNo = sqlite_last_error($this->_connectionID); - } - - return $rez; - } - - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - $offsetStr = ($offset >= 0) ? " OFFSET $offset" : ''; - $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : ''); - if ($secs2cache) - $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr); - else - $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr); - - return $rs; - } - - /* - This algorithm is not very efficient, but works even if table locking - is not available. - - Will return false if unable to generate an ID after $MAXLOOPS attempts. - */ - var $_genSeqSQL = "create table %s (id integer)"; - - function GenID($seq='adodbseq',$start=1) - { - // if you have to modify the parameter below, your database is overloaded, - // or you need to implement generation of id's yourself! - $MAXLOOPS = 100; - //$this->debug=1; - while (--$MAXLOOPS>=0) { - @($num = $this->GetOne("select id from $seq")); - if ($num === false) { - $this->Execute(sprintf($this->_genSeqSQL ,$seq)); - $start -= 1; - $num = '0'; - $ok = $this->Execute("insert into $seq values($start)"); - if (!$ok) return false; - } - $this->Execute("update $seq set id=id+1 where id=$num"); - - if ($this->affected_rows() > 0) { - $num += 1; - $this->genID = $num; - return $num; - } - } - if ($fn = $this->raiseErrorFn) { - $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num); - } - return false; - } - - function CreateSequence($seqname='adodbseq',$start=1) - { - if (empty($this->_genSeqSQL)) return false; - $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); - if (!$ok) return false; - $start -= 1; - return $this->Execute("insert into $seqname values($start)"); - } - - var $_dropSeqSQL = 'drop table %s'; - function DropSequence($seqname) - { - if (empty($this->_dropSeqSQL)) return false; - return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); - } - - // returns true or false - function _close() - { - return @sqlite_close($this->_connectionID); - } - - function MetaIndexes($table, $primary = FALSE, $owner=false) - { - $false = false; - // save old fetch mode - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->fetchMode !== FALSE) { - $savem = $this->SetFetchMode(FALSE); - } - $SQL=sprintf("SELECT name,sql FROM sqlite_master WHERE type='index' AND tbl_name='%s'", strtolower($table)); - $rs = $this->Execute($SQL); - if (!is_object($rs)) { - if (isset($savem)) - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - return $false; - } - - $indexes = array (); - while ($row = $rs->FetchRow()) { - if ($primary && preg_match("/primary/i",$row[1]) == 0) continue; - if (!isset($indexes[$row[0]])) { - - $indexes[$row[0]] = array( - 'unique' => preg_match("/unique/i",$row[1]), - 'columns' => array()); - } - /** - * There must be a more elegant way of doing this, - * the index elements appear in the SQL statement - * in cols[1] between parentheses - * e.g CREATE UNIQUE INDEX ware_0 ON warehouse (org,warehouse) - */ - $cols = explode("(",$row[1]); - $cols = explode(")",$cols[1]); - array_pop($cols); - $indexes[$row[0]]['columns'] = $cols; - } - if (isset($savem)) { - $this->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - } - return $indexes; - } - -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_sqlite extends ADORecordSet { - - var $databaseType = "sqlite"; - var $bind = false; - - function ADORecordset_sqlite($queryID,$mode=false) - { - - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - switch($mode) { - case ADODB_FETCH_NUM: $this->fetchMode = SQLITE_NUM; break; - case ADODB_FETCH_ASSOC: $this->fetchMode = SQLITE_ASSOC; break; - default: $this->fetchMode = SQLITE_BOTH; break; - } - $this->adodbFetchMode = $mode; - - $this->_queryID = $queryID; - - $this->_inited = true; - $this->fields = array(); - if ($queryID) { - $this->_currentRow = 0; - $this->EOF = !$this->_fetch(); - @$this->_initrs(); - } else { - $this->_numOfRows = 0; - $this->_numOfFields = 0; - $this->EOF = true; - } - - return $this->_queryID; - } - - - function FetchField($fieldOffset = -1) - { - $fld = new ADOFieldObject; - $fld->name = sqlite_field_name($this->_queryID, $fieldOffset); - $fld->type = 'VARCHAR'; - $fld->max_length = -1; - return $fld; - } - - function _initrs() - { - $this->_numOfRows = @sqlite_num_rows($this->_queryID); - $this->_numOfFields = @sqlite_num_fields($this->_queryID); - } - - function Fields($colname) - { - if ($this->fetchMode != SQLITE_NUM) return $this->fields[$colname]; - if (!$this->bind) { - $this->bind = array(); - for ($i=0; $i < $this->_numOfFields; $i++) { - $o = $this->FetchField($i); - $this->bind[strtoupper($o->name)] = $i; - } - } - - return $this->fields[$this->bind[strtoupper($colname)]]; - } - - function _seek($row) - { - return sqlite_seek($this->_queryID, $row); - } - - function _fetch($ignore_fields=false) - { - $this->fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode); - return !empty($this->fields); - } - - function _close() - { - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-sqlitepo.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-sqlitepo.inc.php deleted file mode 100644 index 01ac395d..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-sqlitepo.inc.php +++ /dev/null @@ -1,62 +0,0 @@ -ADODB_sqlite(); - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ - -class ADORecordset_sqlitepo extends ADORecordset_sqlite { - - var $databaseType = 'sqlitepo'; - - function ADORecordset_sqlitepo($queryID,$mode=false) - { - $this->ADORecordset_sqlite($queryID,$mode); - } - - // Modified to strip table names from returned fields - function _fetch($ignore_fields=false) - { - $this->fields = array(); - $fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode); - if(is_array($fields)) - foreach($fields as $n => $v) - { - if(($p = strpos($n, ".")) !== false) - $n = substr($n, $p+1); - $this->fields[$n] = $v; - } - - return !empty($this->fields); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/drivers/adodb-sybase.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-sybase.inc.php deleted file mode 100644 index 1ed5ed91..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-sybase.inc.php +++ /dev/null @@ -1,428 +0,0 @@ -GetOne('select @@identity'); - } - // might require begintrans -- committrans - function _affectedrows() - { - return $this->GetOne('select @@rowcount'); - } - - - function BeginTrans() - { - - if ($this->transOff) return true; - $this->transCnt += 1; - - $this->Execute('BEGIN TRAN'); - return true; - } - - function CommitTrans($ok=true) - { - if ($this->transOff) return true; - - if (!$ok) return $this->RollbackTrans(); - - $this->transCnt -= 1; - $this->Execute('COMMIT TRAN'); - return true; - } - - function RollbackTrans() - { - if ($this->transOff) return true; - $this->transCnt -= 1; - $this->Execute('ROLLBACK TRAN'); - return true; - } - - // http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4 - function RowLock($tables,$where,$col='top 1 null as ignore') - { - if (!$this->_hastrans) $this->BeginTrans(); - $tables = str_replace(',',' HOLDLOCK,',$tables); - return $this->GetOne("select $col from $tables HOLDLOCK where $where"); - - } - - function SelectDB($dbName) - { - $this->database = $dbName; - $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions - if ($this->_connectionID) { - return @sybase_select_db($dbName); - } - else return false; - } - - /* Returns: the last error message from previous database operation - Note: This function is NOT available for Microsoft SQL Server. */ - - - function ErrorMsg() - { - if ($this->_logsql) return $this->_errorMsg; - if (function_exists('sybase_get_last_message')) - $this->_errorMsg = sybase_get_last_message(); - else - $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform'; - return $this->_errorMsg; - } - - // returns true or false - function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('sybase_connect')) return null; - - if ($this->charSet) { - $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword, $this->charSet); - } else { - $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword); - } - - $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword); - if ($this->_connectionID === false) return false; - if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - // returns true or false - function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) - { - if (!function_exists('sybase_connect')) return null; - - if ($this->charSet) { - $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword, $this->charSet); - } else { - $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword); - } - if ($this->_connectionID === false) return false; - if ($argDatabasename) return $this->SelectDB($argDatabasename); - return true; - } - - // returns query ID if successful, otherwise false - function _query($sql,$inputarr=false) - { - global $ADODB_COUNTRECS; - - if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300) - return sybase_unbuffered_query($sql,$this->_connectionID); - else - return sybase_query($sql,$this->_connectionID); - } - - // See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12 - function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0) - { - if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset - $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - return $rs; - } - - $nrows = (integer) $nrows; - $offset = (integer) $offset; - - $cnt = ($nrows >= 0) ? $nrows : 999999999; - if ($offset > 0 && $cnt) $cnt += $offset; - - $this->Execute("set rowcount $cnt"); - $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0); - $this->Execute("set rowcount 0"); - - return $rs; - } - - // returns true or false - function _close() - { - return @sybase_close($this->_connectionID); - } - - static function UnixDate($v) - { - return ADORecordSet_array_sybase::UnixDate($v); - } - - static function UnixTimeStamp($v) - { - return ADORecordSet_array_sybase::UnixTimeStamp($v); - } - - - - # Added 2003-10-05 by Chris Phillipson - # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25 - # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version - // Format date column in sql string given an input format that understands Y M D - function SQLDate($fmt, $col=false) - { - if (!$col) $col = $this->sysTimeStamp; - $s = ''; - - $len = strlen($fmt); - for ($i=0; $i < $len; $i++) { - if ($s) $s .= '+'; - $ch = $fmt[$i]; - switch($ch) { - case 'Y': - case 'y': - $s .= "datename(yy,$col)"; - break; - case 'M': - $s .= "convert(char(3),$col,0)"; - break; - case 'm': - $s .= "str_replace(str(month($col),2),' ','0')"; - break; - case 'Q': - case 'q': - $s .= "datename(qq,$col)"; - break; - case 'D': - case 'd': - $s .= "str_replace(str(datepart(dd,$col),2),' ','0')"; - break; - case 'h': - $s .= "substring(convert(char(14),$col,0),13,2)"; - break; - - case 'H': - $s .= "str_replace(str(datepart(hh,$col),2),' ','0')"; - break; - - case 'i': - $s .= "str_replace(str(datepart(mi,$col),2),' ','0')"; - break; - case 's': - $s .= "str_replace(str(datepart(ss,$col),2),' ','0')"; - break; - case 'a': - case 'A': - $s .= "substring(convert(char(19),$col,0),18,2)"; - break; - - default: - if ($ch == '\\') { - $i++; - $ch = substr($fmt,$i,1); - } - $s .= $this->qstr($ch); - break; - } - } - return $s; - } - - # Added 2003-10-07 by Chris Phillipson - # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8 - # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version - function MetaPrimaryKeys($table) - { - $sql = "SELECT c.column_name " . - "FROM syscolumn c, systable t " . - "WHERE t.table_name='$table' AND c.table_id=t.table_id " . - "AND t.table_type='BASE' " . - "AND c.pkey = 'Y' " . - "ORDER BY c.column_id"; - - $a = $this->GetCol($sql); - if ($a && sizeof($a)>0) return $a; - return false; - } -} - -/*-------------------------------------------------------------------------------------- - Class Name: Recordset - --------------------------------------------------------------------------------------*/ -global $ADODB_sybase_mths; -$ADODB_sybase_mths = array( - 'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6, - 'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); - -class ADORecordset_sybase extends ADORecordSet { - - var $databaseType = "sybase"; - var $canSeek = true; - // _mths works only in non-localised system - var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12); - - function ADORecordset_sybase($id,$mode=false) - { - if ($mode === false) { - global $ADODB_FETCH_MODE; - $mode = $ADODB_FETCH_MODE; - } - if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC; - else $this->fetchMode = $mode; - $this->ADORecordSet($id,$mode); - } - - /* Returns: an object containing field information. - Get column information in the Recordset object. fetchField() can be used in order to obtain information about - fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by - fetchField() is retrieved. */ - function FetchField($fieldOffset = -1) - { - if ($fieldOffset != -1) { - $o = @sybase_fetch_field($this->_queryID, $fieldOffset); - } - else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ - $o = @sybase_fetch_field($this->_queryID); - } - // older versions of PHP did not support type, only numeric - if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar'; - return $o; - } - - function _initrs() - { - global $ADODB_COUNTRECS; - $this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1; - $this->_numOfFields = @sybase_num_fields($this->_queryID); - } - - function _seek($row) - { - return @sybase_data_seek($this->_queryID, $row); - } - - function _fetch($ignore_fields=false) - { - if ($this->fetchMode == ADODB_FETCH_NUM) { - $this->fields = @sybase_fetch_row($this->_queryID); - } else if ($this->fetchMode == ADODB_FETCH_ASSOC) { - $this->fields = @sybase_fetch_row($this->_queryID); - if (is_array($this->fields)) { - $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE); - return true; - } - return false; - } else { - $this->fields = @sybase_fetch_array($this->_queryID); - } - if ( is_array($this->fields)) { - return true; - } - - return false; - } - - /* close() only needs to be called if you are worried about using too much memory while your script - is running. All associated result memory for the specified result identifier will automatically be freed. */ - function _close() { - return @sybase_free_result($this->_queryID); - } - - // sybase/mssql uses a default date like Dec 30 2000 12:00AM - static function UnixDate($v) - { - return ADORecordSet_array_sybase::UnixDate($v); - } - - static function UnixTimeStamp($v) - { - return ADORecordSet_array_sybase::UnixTimeStamp($v); - } -} - -class ADORecordSet_array_sybase extends ADORecordSet_array { - function ADORecordSet_array_sybase($id=-1) - { - $this->ADORecordSet_array($id); - } - - // sybase/mssql uses a default date like Dec 30 2000 12:00AM - static function UnixDate($v) - { - global $ADODB_sybase_mths; - - //Dec 30 2000 12:00AM - if (!preg_match( "/([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})/" - ,$v, $rr)) return parent::UnixDate($v); - - if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; - - $themth = substr(strtoupper($rr[1]),0,3); - $themth = $ADODB_sybase_mths[$themth]; - if ($themth <= 0) return false; - // h-m-s-MM-DD-YY - return mktime(0,0,0,$themth,$rr[2],$rr[3]); - } - - static function UnixTimeStamp($v) - { - global $ADODB_sybase_mths; - //11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com - //Changed [0-9] to [0-9 ] in day conversion - if (!preg_match( "/([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})/" - ,$v, $rr)) return parent::UnixTimeStamp($v); - if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0; - - $themth = substr(strtoupper($rr[1]),0,3); - $themth = $ADODB_sybase_mths[$themth]; - if ($themth <= 0) return false; - - switch (strtoupper($rr[6])) { - case 'P': - if ($rr[4]<12) $rr[4] += 12; - break; - case 'A': - if ($rr[4]==12) $rr[4] = 0; - break; - default: - break; - } - // h-m-s-MM-DD-YY - return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]); - } -} -?> diff --git a/include/limesurvey/classes/adodb/drivers/adodb-sybase_ase.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-sybase_ase.inc.php deleted file mode 100644 index 016bbb8c..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-sybase_ase.inc.php +++ /dev/null @@ -1,120 +0,0 @@ -metaTablesSQL) { - // complicated state saving by the need for backward compat - - if ($ttype == 'VIEWS'){ - $sql = str_replace('U', 'V', $this->metaTablesSQL); - }elseif (false === $ttype){ - $sql = str_replace('U',"U' OR type='V", $this->metaTablesSQL); - }else{ // TABLES OR ANY OTHER - $sql = $this->metaTablesSQL; - } - $rs = $this->Execute($sql); - - if ($rs === false || !method_exists($rs, 'GetArray')){ - return $false; - } - $arr = $rs->GetArray(); - - $arr2 = array(); - foreach($arr as $key=>$value){ - $arr2[] = trim($value['name']); - } - return $arr2; - } - return $false; - } - - function MetaDatabases() - { - $arr = array(); - if ($this->metaDatabasesSQL!='') { - $rs = $this->Execute($this->metaDatabasesSQL); - if ($rs && !$rs->EOF){ - while (!$rs->EOF){ - $arr[] = $rs->Fields('name'); - $rs->MoveNext(); - } - return $arr; - } - } - return false; - } - - // fix a bug which prevent the metaColumns query to be executed for Sybase ASE - function MetaColumns($table,$upper=false) - { - $false = false; - if (!empty($this->metaColumnsSQL)) { - - $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); - if ($rs === false) return $false; - - $retarr = array(); - while (!$rs->EOF) { - $fld = new ADOFieldObject(); - $fld->name = $rs->Fields('field_name'); - $fld->type = $rs->Fields('type'); - $fld->max_length = $rs->Fields('width'); - $retarr[strtoupper($fld->name)] = $fld; - $rs->MoveNext(); - } - $rs->Close(); - return $retarr; - } - return $false; - } - - function getProcedureList($schema) - { - return false; - } - - function ErrorMsg() - { - if (!function_exists('sybase_connect')){ - return 'Your PHP doesn\'t contain the Sybase connection module!'; - } - return parent::ErrorMsg(); - } -} - -class adorecordset_sybase_ase extends ADORecordset_sybase { - var $databaseType = "sybase_ase"; - function ADORecordset_sybase_ase($id,$mode=false) - { - $this->ADORecordSet_sybase($id,$mode); - } - -} -?> diff --git a/include/limesurvey/classes/adodb/drivers/adodb-vfp.inc.php b/include/limesurvey/classes/adodb/drivers/adodb-vfp.inc.php deleted file mode 100644 index 863e334b..00000000 --- a/include/limesurvey/classes/adodb/drivers/adodb-vfp.inc.php +++ /dev/null @@ -1,107 +0,0 @@ -ADODB_odbc(); - } - - function Time() - { - return time(); - } - - function BeginTrans() { return false;} - - // quote string to be sent back to database - function qstr($s,$nofixquotes=false) - { - if (!$nofixquotes) return "'".str_replace("\r\n","'+chr(13)+'",str_replace("'",$this->replaceQuote,$s))."'"; - return "'".$s."'"; - } - - - // TOP requires ORDER BY for VFP - function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) - { - $this->hasTop = preg_match('/ORDER[ \t\r\n]+BY/is',$sql) ? 'top' : false; - $ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); - return $ret; - } - - - - }; - - - class ADORecordSet_vfp extends ADORecordSet_odbc { - - var $databaseType = "vfp"; - - - function ADORecordSet_vfp($id,$mode=false) - { - return $this->ADORecordSet_odbc($id,$mode); - } - - function MetaType($t,$len=-1) - { - if (is_object($t)) { - $fieldobj = $t; - $t = $fieldobj->type; - $len = $fieldobj->max_length; - } - switch (strtoupper($t)) { - case 'C': - if ($len <= $this->blobSize) return 'C'; - case 'M': - return 'X'; - - case 'D': return 'D'; - - case 'T': return 'T'; - - case 'L': return 'L'; - - case 'I': return 'I'; - - default: return 'N'; - } - } - } - -} //define -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-ar.inc.php b/include/limesurvey/classes/adodb/lang/adodb-ar.inc.php deleted file mode 100644 index 8279714c..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-ar.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'ar', -DB_ERROR => '��� ��� ����', -DB_ERROR_ALREADY_EXISTS => '����� �����', -DB_ERROR_CANNOT_CREATE => '�� ���� �����', -DB_ERROR_CANNOT_DELETE => '�� ���� ���', -DB_ERROR_CANNOT_DROP => '�� ���� ���', -DB_ERROR_CONSTRAINT => '����� ����� ������', -DB_ERROR_DIVZERO => '����� ������� ��� ���', -DB_ERROR_INVALID => '��� ����', -DB_ERROR_INVALID_DATE => '���� ��� �� ����� ��� �����', -DB_ERROR_INVALID_NUMBER => '���� ��� ��� �����', -DB_ERROR_MISMATCH => '��� ������', -DB_ERROR_NODBSELECTED => '�� ��� ������ ����� �������� ���', -DB_ERROR_NOSUCHFIELD => '��� ����� ��� ���� �����', -DB_ERROR_NOSUCHTABLE => '��� ����� ���� ���� �����', -DB_ERROR_NOT_CAPABLE => '����� �������� ������� ��� ��� �����', -DB_ERROR_NOT_FOUND => '�� ��� ������', -DB_ERROR_NOT_LOCKED => '��� �����', -DB_ERROR_SYNTAX => '��� �� ������', -DB_ERROR_UNSUPPORTED => '��� �����', -DB_ERROR_VALUE_COUNT_ON_ROW => '��� ����� �� �����', -DB_ERROR_INVALID_DSN => 'DSN ��� ����', -DB_ERROR_CONNECT_FAILED => '��� ����� �������', -0 => '��� ����� �����', // DB_O -DB_ERROR_NEED_MORE_DATA => '�������� ������� ��� �����', -DB_ERROR_EXTENSION_NOT_FOUND=> '�� ��� ����� ������� ��������', -DB_ERROR_NOSUCHDB => '��� ����� ����� ������ ���� �����', -DB_ERROR_ACCESS_VIOLATION => '������� ��� �����' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-bg.inc.php b/include/limesurvey/classes/adodb/lang/adodb-bg.inc.php deleted file mode 100644 index d1f32902..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-bg.inc.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'bg', -DB_ERROR => '���������� ������', -DB_ERROR_ALREADY_EXISTS => '���� ����������', -DB_ERROR_CANNOT_CREATE => '�� ���� �� ���� ���������', -DB_ERROR_CANNOT_DELETE => '�� ���� �� ���� �������', -DB_ERROR_CANNOT_DROP => '�� ���� �� ���� ���������', -DB_ERROR_CONSTRAINT => '�������� �������', -DB_ERROR_DIVZERO => '������� �� ����', -DB_ERROR_INVALID => '����������', -DB_ERROR_INVALID_DATE => '���������� ���� ��� ���', -DB_ERROR_INVALID_NUMBER => '��������� �����', -DB_ERROR_MISMATCH => '�������� ��������', -DB_ERROR_NODBSELECTED => '�� � ������� ���� �����', -DB_ERROR_NOSUCHFIELD => '�������������� ����', -DB_ERROR_NOSUCHTABLE => '�������������� �������', -DB_ERROR_NOT_CAPABLE => 'DB backend not capable', -DB_ERROR_NOT_FOUND => '�� � ��������', -DB_ERROR_NOT_LOCKED => '�� � ���������', -DB_ERROR_SYNTAX => '������ ���������', -DB_ERROR_UNSUPPORTED => '�� �� ��������', -DB_ERROR_VALUE_COUNT_ON_ROW => '���������� ���� ������ � ����', -DB_ERROR_INVALID_DSN => '��������� DSN', -DB_ERROR_CONNECT_FAILED => '�������� �� ���� �� ���� �����������', -0 => '���� ������', // DB_OK -DB_ERROR_NEED_MORE_DATA => '�������������� ����� �� ������������', -DB_ERROR_EXTENSION_NOT_FOUND=> '������������ �� � ��������', -DB_ERROR_NOSUCHDB => '�������������� ���� �����', -DB_ERROR_ACCESS_VIOLATION => '������ ���������� �����' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-bgutf8.inc.php b/include/limesurvey/classes/adodb/lang/adodb-bgutf8.inc.php deleted file mode 100644 index 6e5bcd56..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-bgutf8.inc.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'bgutf8', -DB_ERROR => 'неизвестна грешка', -DB_ERROR_ALREADY_EXISTS => 'вече съществува', -DB_ERROR_CANNOT_CREATE => 'не може да бъде създадена', -DB_ERROR_CANNOT_DELETE => 'не може да бъде изтрита', -DB_ERROR_CANNOT_DROP => 'не може да бъде унищожена', -DB_ERROR_CONSTRAINT => 'нарушено условие', -DB_ERROR_DIVZERO => 'деление на нула', -DB_ERROR_INVALID => 'неправилно', -DB_ERROR_INVALID_DATE => 'некоректна дата или час', -DB_ERROR_INVALID_NUMBER => 'невалиден номер', -DB_ERROR_MISMATCH => 'погрешна употреба', -DB_ERROR_NODBSELECTED => 'не е избрана база данни', -DB_ERROR_NOSUCHFIELD => 'несъществуващо поле', -DB_ERROR_NOSUCHTABLE => 'несъществуваща таблица', -DB_ERROR_NOT_CAPABLE => 'DB backend not capable', -DB_ERROR_NOT_FOUND => 'не е намерена', -DB_ERROR_NOT_LOCKED => 'не е заключена', -DB_ERROR_SYNTAX => 'грешен синтаксис', -DB_ERROR_UNSUPPORTED => 'не се поддържа', -DB_ERROR_VALUE_COUNT_ON_ROW => 'некоректен брой колони в реда', -DB_ERROR_INVALID_DSN => 'невалиден DSN', -DB_ERROR_CONNECT_FAILED => 'връзката не може да бъде осъществена', -0 => 'няма грешки', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'предоставените данни са недостатъчни', -DB_ERROR_EXTENSION_NOT_FOUND=> 'разширението не е намерено', -DB_ERROR_NOSUCHDB => 'несъществуваща база данни', -DB_ERROR_ACCESS_VIOLATION => 'нямате достатъчно права' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-ca.inc.php b/include/limesurvey/classes/adodb/lang/adodb-ca.inc.php deleted file mode 100644 index 953987e0..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-ca.inc.php +++ /dev/null @@ -1,34 +0,0 @@ - 'ca', -DB_ERROR => 'error desconegut', -DB_ERROR_ALREADY_EXISTS => 'ja existeix', -DB_ERROR_CANNOT_CREATE => 'no es pot crear', -DB_ERROR_CANNOT_DELETE => 'no es pot esborrar', -DB_ERROR_CANNOT_DROP => 'no es pot eliminar', -DB_ERROR_CONSTRAINT => 'violaci� de constraint', -DB_ERROR_DIVZERO => 'divisi� per zero', -DB_ERROR_INVALID => 'no �s v�lid', -DB_ERROR_INVALID_DATE => 'la data o l\'hora no s�n v�lides', -DB_ERROR_INVALID_NUMBER => 'el nombre no �s v�lid', -DB_ERROR_MISMATCH => 'no hi ha coincid�ncia', -DB_ERROR_NODBSELECTED => 'cap base de dades seleccionada', -DB_ERROR_NOSUCHFIELD => 'camp inexistent', -DB_ERROR_NOSUCHTABLE => 'taula inexistent', -DB_ERROR_NOT_CAPABLE => 'l\'execuci� secund�ria de DB no pot', -DB_ERROR_NOT_FOUND => 'no trobat', -DB_ERROR_NOT_LOCKED => 'no blocat', -DB_ERROR_SYNTAX => 'error de sintaxi', -DB_ERROR_UNSUPPORTED => 'no suportat', -DB_ERROR_VALUE_COUNT_ON_ROW => 'el nombre de columnes no coincideix amb el nombre de valors en la fila', -DB_ERROR_INVALID_DSN => 'el DSN no �s v�lid', -DB_ERROR_CONNECT_FAILED => 'connexi� fallida', -0 => 'cap error', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'les dades subministrades s�n insuficients', -DB_ERROR_EXTENSION_NOT_FOUND=> 'extensi� no trobada', -DB_ERROR_NOSUCHDB => 'base de dades inexistent', -DB_ERROR_ACCESS_VIOLATION => 'permisos insuficients' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-cn.inc.php b/include/limesurvey/classes/adodb/lang/adodb-cn.inc.php deleted file mode 100644 index 7ba4f20a..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-cn.inc.php +++ /dev/null @@ -1,35 +0,0 @@ - 'cn', -DB_ERROR => 'δ֪����', -DB_ERROR_ALREADY_EXISTS => '�Ѿ�����', -DB_ERROR_CANNOT_CREATE => '���ܴ���', -DB_ERROR_CANNOT_DELETE => '����ɾ��', -DB_ERROR_CANNOT_DROP => '���ܶ���', -DB_ERROR_CONSTRAINT => 'Լ������', -DB_ERROR_DIVZERO => '��0��', -DB_ERROR_INVALID => '��Ч', -DB_ERROR_INVALID_DATE => '��Ч�����ڻ���ʱ��', -DB_ERROR_INVALID_NUMBER => '��Ч������', -DB_ERROR_MISMATCH => '��ƥ��', -DB_ERROR_NODBSELECTED => 'û����ݿⱻѡ��', -DB_ERROR_NOSUCHFIELD => 'û����Ӧ���ֶ�', -DB_ERROR_NOSUCHTABLE => 'û����Ӧ�ı�', -DB_ERROR_NOT_CAPABLE => '��ݿ��̨������', -DB_ERROR_NOT_FOUND => 'û�з���', -DB_ERROR_NOT_LOCKED => 'û�б���', -DB_ERROR_SYNTAX => '�﷨����', -DB_ERROR_UNSUPPORTED => '��֧��', -DB_ERROR_VALUE_COUNT_ON_ROW => '�������ۼ�ֵ', -DB_ERROR_INVALID_DSN => '��Ч�����Դ (DSN)', -DB_ERROR_CONNECT_FAILED => '����ʧ��', -0 => 'û�д���', // DB_OK -DB_ERROR_NEED_MORE_DATA => '�ṩ����ݲ��ܷ��Ҫ��', -DB_ERROR_EXTENSION_NOT_FOUND=> '��չû�б�����', -DB_ERROR_NOSUCHDB => 'û����Ӧ����ݿ�', -DB_ERROR_ACCESS_VIOLATION => 'û�к��ʵ�Ȩ��' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-cz.inc.php b/include/limesurvey/classes/adodb/lang/adodb-cz.inc.php deleted file mode 100644 index c388e9c0..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-cz.inc.php +++ /dev/null @@ -1,40 +0,0 @@ - - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'cz', -DB_ERROR => 'nezn�m� chyba', -DB_ERROR_ALREADY_EXISTS => 'ji? existuje', -DB_ERROR_CANNOT_CREATE => 'nelze vytvo?it', -DB_ERROR_CANNOT_DELETE => 'nelze smazat', -DB_ERROR_CANNOT_DROP => 'nelze odstranit', -DB_ERROR_CONSTRAINT => 'poru?en� omezuj�c� podm�nky', -DB_ERROR_DIVZERO => 'd?len� nulou', -DB_ERROR_INVALID => 'neplatn�', -DB_ERROR_INVALID_DATE => 'neplatn� datum nebo ?as', -DB_ERROR_INVALID_NUMBER => 'neplatn� ?�slo', -DB_ERROR_MISMATCH => 'nesouhlas�', -DB_ERROR_NODBSELECTED => '?�dn� datab�ze nen� vybr�na', -DB_ERROR_NOSUCHFIELD => 'pole nenalezeno', -DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena', -DB_ERROR_NOT_CAPABLE => 'nepodporov�no', -DB_ERROR_NOT_FOUND => 'nenalezeno', -DB_ERROR_NOT_LOCKED => 'nezam?eno', -DB_ERROR_SYNTAX => 'syntaktick� chyba', -DB_ERROR_UNSUPPORTED => 'nepodporov�no', -DB_ERROR_VALUE_COUNT_ON_ROW => '', -DB_ERROR_INVALID_DSN => 'neplatn� DSN', -DB_ERROR_CONNECT_FAILED => 'p?ipojen� selhalo', -0 => 'bez chyb', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'm�lo zdrojov�ch dat', -DB_ERROR_EXTENSION_NOT_FOUND=> 'roz?�?en� nenalezeno', -DB_ERROR_NOSUCHDB => 'datab�ze neexistuje', -DB_ERROR_ACCESS_VIOLATION => 'nedostate?n� pr�va' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-da.inc.php b/include/limesurvey/classes/adodb/lang/adodb-da.inc.php deleted file mode 100644 index 47380112..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-da.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - 'da', -DB_ERROR => 'ukendt fejl', -DB_ERROR_ALREADY_EXISTS => 'eksisterer allerede', -DB_ERROR_CANNOT_CREATE => 'kan ikke oprette', -DB_ERROR_CANNOT_DELETE => 'kan ikke slette', -DB_ERROR_CANNOT_DROP => 'kan ikke droppe', -DB_ERROR_CONSTRAINT => 'begrænsning krænket', -DB_ERROR_DIVZERO => 'division med nul', -DB_ERROR_INVALID => 'ugyldig', -DB_ERROR_INVALID_DATE => 'ugyldig dato eller klokkeslet', -DB_ERROR_INVALID_NUMBER => 'ugyldigt tal', -DB_ERROR_MISMATCH => 'mismatch', -DB_ERROR_NODBSELECTED => 'ingen database valgt', -DB_ERROR_NOSUCHFIELD => 'felt findes ikke', -DB_ERROR_NOSUCHTABLE => 'tabel findes ikke', -DB_ERROR_NOT_CAPABLE => 'DB backend opgav', -DB_ERROR_NOT_FOUND => 'ikke fundet', -DB_ERROR_NOT_LOCKED => 'ikke låst', -DB_ERROR_SYNTAX => 'syntaksfejl', -DB_ERROR_UNSUPPORTED => 'ikke understøttet', -DB_ERROR_VALUE_COUNT_ON_ROW => 'resulterende antal felter svarer ikke til forespørgslens antal felter', -DB_ERROR_INVALID_DSN => 'ugyldig DSN', -DB_ERROR_CONNECT_FAILED => 'tilslutning mislykkedes', -0 => 'ingen fejl', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'utilstrækkelige data angivet', -DB_ERROR_EXTENSION_NOT_FOUND=> 'udvidelse ikke fundet', -DB_ERROR_NOSUCHDB => 'database ikke fundet', -DB_ERROR_ACCESS_VIOLATION => 'utilstrækkelige rettigheder' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-de.inc.php b/include/limesurvey/classes/adodb/lang/adodb-de.inc.php deleted file mode 100644 index 81b45133..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-de.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'de', -DB_ERROR => 'Unbekannter Fehler', -DB_ERROR_ALREADY_EXISTS => 'existiert bereits', -DB_ERROR_CANNOT_CREATE => 'kann nicht erstellen', -DB_ERROR_CANNOT_DELETE => 'kann nicht löschen', -DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gelöscht werden', -DB_ERROR_CONSTRAINT => 'Constraint Verletzung', -DB_ERROR_DIVZERO => 'Division durch Null', -DB_ERROR_INVALID => 'ung¨ltig', -DB_ERROR_INVALID_DATE => 'ung¨ltiges Datum oder Zeit', -DB_ERROR_INVALID_NUMBER => 'ung¨ltige Zahl', -DB_ERROR_MISMATCH => 'Unverträglichkeit', -DB_ERROR_NODBSELECTED => 'keine Dantebank ausgewählt', -DB_ERROR_NOSUCHFIELD => 'Feld nicht vorhanden', -DB_ERROR_NOSUCHTABLE => 'Tabelle nicht vorhanden', -DB_ERROR_NOT_CAPABLE => 'Funktion nicht installiert', -DB_ERROR_NOT_FOUND => 'nicht gefunden', -DB_ERROR_NOT_LOCKED => 'nicht gesperrt', -DB_ERROR_SYNTAX => 'Syntaxfehler', -DB_ERROR_UNSUPPORTED => 'nicht Unterst¨tzt', -DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur¨ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage', -DB_ERROR_INVALID_DSN => 'ung¨ltiger DSN', -DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden', -0 => 'kein Fehler', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'Nicht gen¨gend Daten geliefert', -DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden', -DB_ERROR_NOSUCHDB => 'keine Datenbank', -DB_ERROR_ACCESS_VIOLATION => 'ungen¨gende Rechte' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-en.inc.php b/include/limesurvey/classes/adodb/lang/adodb-en.inc.php deleted file mode 100644 index cdf8f1f9..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-en.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - 'en', -DB_ERROR => 'unknown error', -DB_ERROR_ALREADY_EXISTS => 'already exists', -DB_ERROR_CANNOT_CREATE => 'can not create', -DB_ERROR_CANNOT_DELETE => 'can not delete', -DB_ERROR_CANNOT_DROP => 'can not drop', -DB_ERROR_CONSTRAINT => 'constraint violation', -DB_ERROR_DIVZERO => 'division by zero', -DB_ERROR_INVALID => 'invalid', -DB_ERROR_INVALID_DATE => 'invalid date or time', -DB_ERROR_INVALID_NUMBER => 'invalid number', -DB_ERROR_MISMATCH => 'mismatch', -DB_ERROR_NODBSELECTED => 'no database selected', -DB_ERROR_NOSUCHFIELD => 'no such field', -DB_ERROR_NOSUCHTABLE => 'no such table', -DB_ERROR_NOT_CAPABLE => 'DB backend not capable', -DB_ERROR_NOT_FOUND => 'not found', -DB_ERROR_NOT_LOCKED => 'not locked', -DB_ERROR_SYNTAX => 'syntax error', -DB_ERROR_UNSUPPORTED => 'not supported', -DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', -DB_ERROR_INVALID_DSN => 'invalid DSN', -DB_ERROR_CONNECT_FAILED => 'connect failed', -0 => 'no error', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied', -DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', -DB_ERROR_NOSUCHDB => 'no such database', -DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-es.inc.php b/include/limesurvey/classes/adodb/lang/adodb-es.inc.php deleted file mode 100644 index 522601af..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-es.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'es', -DB_ERROR => 'error desconocido', -DB_ERROR_ALREADY_EXISTS => 'ya existe', -DB_ERROR_CANNOT_CREATE => 'imposible crear', -DB_ERROR_CANNOT_DELETE => 'imposible borrar', -DB_ERROR_CANNOT_DROP => 'imposible hacer drop', -DB_ERROR_CONSTRAINT => 'violacion de constraint', -DB_ERROR_DIVZERO => 'division por cero', -DB_ERROR_INVALID => 'invalido', -DB_ERROR_INVALID_DATE => 'fecha u hora invalida', -DB_ERROR_INVALID_NUMBER => 'numero invalido', -DB_ERROR_MISMATCH => 'error', -DB_ERROR_NODBSELECTED => 'no hay base de datos seleccionada', -DB_ERROR_NOSUCHFIELD => 'campo invalido', -DB_ERROR_NOSUCHTABLE => 'tabla no existe', -DB_ERROR_NOT_CAPABLE => 'capacidad invalida para esta DB', -DB_ERROR_NOT_FOUND => 'no encontrado', -DB_ERROR_NOT_LOCKED => 'no bloqueado', -DB_ERROR_SYNTAX => 'error de sintaxis', -DB_ERROR_UNSUPPORTED => 'no soportado', -DB_ERROR_VALUE_COUNT_ON_ROW => 'la cantidad de columnas no corresponden a la cantidad de valores', -DB_ERROR_INVALID_DSN => 'DSN invalido', -DB_ERROR_CONNECT_FAILED => 'fallo la conexion', -0 => 'sin error', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'insuficientes datos', -DB_ERROR_EXTENSION_NOT_FOUND=> 'extension no encontrada', -DB_ERROR_NOSUCHDB => 'base de datos no encontrada', -DB_ERROR_ACCESS_VIOLATION => 'permisos insuficientes' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-esperanto.inc.php b/include/limesurvey/classes/adodb/lang/adodb-esperanto.inc.php deleted file mode 100644 index cff6137d..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-esperanto.inc.php +++ /dev/null @@ -1,35 +0,0 @@ - 'eo', -DB_ERROR => 'nekonata eraro', -DB_ERROR_ALREADY_EXISTS => 'jam ekzistas', -DB_ERROR_CANNOT_CREATE => 'maleblas krei', -DB_ERROR_CANNOT_DELETE => 'maleblas elimini', -DB_ERROR_CANNOT_DROP => 'maleblas elimini (drop)', -DB_ERROR_CONSTRAINT => 'rompo de kondicxoj de provo', -DB_ERROR_DIVZERO => 'divido per 0 (nul)', -DB_ERROR_INVALID => 'malregule', -DB_ERROR_INVALID_DATE => 'malregula dato kaj tempo', -DB_ERROR_INVALID_NUMBER => 'malregula nombro', -DB_ERROR_MISMATCH => 'eraro', -DB_ERROR_NODBSELECTED => 'datumbazo ne elektita', -DB_ERROR_NOSUCHFIELD => 'ne ekzistas kampo', -DB_ERROR_NOSUCHTABLE => 'ne ekzistas tabelo', -DB_ERROR_NOT_CAPABLE => 'DBMS ne povas', -DB_ERROR_NOT_FOUND => 'ne trovita', -DB_ERROR_NOT_LOCKED => 'ne blokita', -DB_ERROR_SYNTAX => 'sintaksa eraro', -DB_ERROR_UNSUPPORTED => 'ne apogata', -DB_ERROR_VALUE_COUNT_ON_ROW => 'nombrilo de valoroj en linio', -DB_ERROR_INVALID_DSN => 'malregula DSN-o', -DB_ERROR_CONNECT_FAILED => 'konekto malsukcesa', -0 => 'cxio bone', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'ne suficxe da datumo', -DB_ERROR_EXTENSION_NOT_FOUND=> 'etendo ne trovita', -DB_ERROR_NOSUCHDB => 'datumbazo ne ekzistas', -DB_ERROR_ACCESS_VIOLATION => 'ne suficxe da rajto por atingo' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-fa.inc.php b/include/limesurvey/classes/adodb/lang/adodb-fa.inc.php deleted file mode 100644 index 3107c645..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-fa.inc.php +++ /dev/null @@ -1,35 +0,0 @@ - */ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'fa', -DB_ERROR => 'خطای ناشناخته', -DB_ERROR_ALREADY_EXISTS => 'وجود دارد', -DB_ERROR_CANNOT_CREATE => 'امکان create وجود ندارد', -DB_ERROR_CANNOT_DELETE => 'امکان حذف وجود ندارد', -DB_ERROR_CANNOT_DROP => 'امکان drop وجود ندارد', -DB_ERROR_CONSTRAINT => 'نقض شرط', -DB_ERROR_DIVZERO => 'تقسیم بر صفر', -DB_ERROR_INVALID => 'نامعتبر', -DB_ERROR_INVALID_DATE => 'زمان یا تاریخ نامعتبر', -DB_ERROR_INVALID_NUMBER => 'عدد نامعتبر', -DB_ERROR_MISMATCH => 'عدم مطابقت', -DB_ERROR_NODBSELECTED => 'بانک اطلاعاتی انتخاب نشده است', -DB_ERROR_NOSUCHFIELD => 'چنین ستونی وجود ندارد', -DB_ERROR_NOSUCHTABLE => 'چنین جدولی وجود ندارد', -DB_ERROR_NOT_CAPABLE => 'backend بانک اطلاعاتی قادر نیست', -DB_ERROR_NOT_FOUND => 'پیدا نشد', -DB_ERROR_NOT_LOCKED => 'قفل نشده', -DB_ERROR_SYNTAX => 'خطای دستوری', -DB_ERROR_UNSUPPORTED => 'پشتیبانی نمی شود', -DB_ERROR_VALUE_COUNT_ON_ROW => 'شمارش مقادیر روی ردیف', -DB_ERROR_INVALID_DSN => 'DSN نامعتبر', -DB_ERROR_CONNECT_FAILED => 'ارتباط برقرار نشد', -0 => 'بدون خطا', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'داده ناکافی است', -DB_ERROR_EXTENSION_NOT_FOUND=> 'extension پیدا نشد', -DB_ERROR_NOSUCHDB => 'چنین بانک اطلاعاتی وجود ندارد', -DB_ERROR_ACCESS_VIOLATION => 'حق دسترسی ناکافی' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-fr.inc.php b/include/limesurvey/classes/adodb/lang/adodb-fr.inc.php deleted file mode 100644 index 119f0db7..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-fr.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - 'fr', -DB_ERROR => 'erreur inconnue', -DB_ERROR_ALREADY_EXISTS => 'existe déjà', -DB_ERROR_CANNOT_CREATE => 'crétion impossible', -DB_ERROR_CANNOT_DELETE => 'effacement impossible', -DB_ERROR_CANNOT_DROP => 'suppression impossible', -DB_ERROR_CONSTRAINT => 'violation de contrainte', -DB_ERROR_DIVZERO => 'division par zéro', -DB_ERROR_INVALID => 'invalide', -DB_ERROR_INVALID_DATE => 'date ou heure invalide', -DB_ERROR_INVALID_NUMBER => 'nombre invalide', -DB_ERROR_MISMATCH => 'erreur de concordance', -DB_ERROR_NODBSELECTED => 'pas de base de donnéessélectionnée', -DB_ERROR_NOSUCHFIELD => 'nom de colonne invalide', -DB_ERROR_NOSUCHTABLE => 'table ou vue inexistante', -DB_ERROR_NOT_CAPABLE => 'fonction optionnelle non installée', -DB_ERROR_NOT_FOUND => 'pas trouvé', -DB_ERROR_NOT_LOCKED => 'non verrouillé', -DB_ERROR_SYNTAX => 'erreur de syntaxe', -DB_ERROR_UNSUPPORTED => 'non supporté', -DB_ERROR_VALUE_COUNT_ON_ROW => 'valeur insérée trop grande pour colonne', -DB_ERROR_INVALID_DSN => 'DSN invalide', -DB_ERROR_CONNECT_FAILED => 'échec à la connexion', -0 => "pas d'erreur", // DB_OK -DB_ERROR_NEED_MORE_DATA => 'données fournies insuffisantes', -DB_ERROR_EXTENSION_NOT_FOUND=> 'extension non trouvée', -DB_ERROR_NOSUCHDB => 'base de données inconnue', -DB_ERROR_ACCESS_VIOLATION => 'droits insuffisants' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-hu.inc.php b/include/limesurvey/classes/adodb/lang/adodb-hu.inc.php deleted file mode 100644 index 96141450..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-hu.inc.php +++ /dev/null @@ -1,34 +0,0 @@ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'hu', -DB_ERROR => 'ismeretlen hiba', -DB_ERROR_ALREADY_EXISTS => 'm�r l�tezik', -DB_ERROR_CANNOT_CREATE => 'nem siker�lt l�trehozni', -DB_ERROR_CANNOT_DELETE => 'nem siker�lt t�r�lni', -DB_ERROR_CANNOT_DROP => 'nem siker�lt eldobni', -DB_ERROR_CONSTRAINT => 'szab�lyok megszeg�se', -DB_ERROR_DIVZERO => 'oszt�s null�val', -DB_ERROR_INVALID => '�rv�nytelen', -DB_ERROR_INVALID_DATE => '�rv�nytelen d�tum vagy id�', -DB_ERROR_INVALID_NUMBER => '�rv�nytelen sz�m', -DB_ERROR_MISMATCH => 'nem megfelel�', -DB_ERROR_NODBSELECTED => 'nincs kiv�lasztott adatb�zis', -DB_ERROR_NOSUCHFIELD => 'nincs ilyen mez�', -DB_ERROR_NOSUCHTABLE => 'nincs ilyen t�bla', -DB_ERROR_NOT_CAPABLE => 'DB backend nem t�mogatja', -DB_ERROR_NOT_FOUND => 'nem tal�lhat�', -DB_ERROR_NOT_LOCKED => 'nincs lez�rva', -DB_ERROR_SYNTAX => 'szintaktikai hiba', -DB_ERROR_UNSUPPORTED => 'nem t�mogatott', -DB_ERROR_VALUE_COUNT_ON_ROW => 'soron v�gzett �rt�k sz�ml�l�s', -DB_ERROR_INVALID_DSN => 'hib�s DSN', -DB_ERROR_CONNECT_FAILED => 'sikertelen csatlakoz�s', -0 => 'nincs hiba', // DB_OK -DB_ERROR_NEED_MORE_DATA => 't�l kev�s az adat', -DB_ERROR_EXTENSION_NOT_FOUND=> 'b�v�tm�ny nem tal�lhat�', -DB_ERROR_NOSUCHDB => 'nincs ilyen adatb�zis', -DB_ERROR_ACCESS_VIOLATION => 'nincs jogosults�g' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-it.inc.php b/include/limesurvey/classes/adodb/lang/adodb-it.inc.php deleted file mode 100644 index c403af7b..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-it.inc.php +++ /dev/null @@ -1,34 +0,0 @@ - 'it', -DB_ERROR => 'errore sconosciuto', -DB_ERROR_ALREADY_EXISTS => 'esiste già', -DB_ERROR_CANNOT_CREATE => 'non posso creare', -DB_ERROR_CANNOT_DELETE => 'non posso cancellare', -DB_ERROR_CANNOT_DROP => 'non posso eliminare', -DB_ERROR_CONSTRAINT => 'violazione constraint', -DB_ERROR_DIVZERO => 'divisione per zero', -DB_ERROR_INVALID => 'non valido', -DB_ERROR_INVALID_DATE => 'data od ora non valida', -DB_ERROR_INVALID_NUMBER => 'numero non valido', -DB_ERROR_MISMATCH => 'diversi', -DB_ERROR_NODBSELECTED => 'nessun database selezionato', -DB_ERROR_NOSUCHFIELD => 'nessun campo trovato', -DB_ERROR_NOSUCHTABLE => 'nessuna tabella trovata', -DB_ERROR_NOT_CAPABLE => 'DB backend non abilitato', -DB_ERROR_NOT_FOUND => 'non trovato', -DB_ERROR_NOT_LOCKED => 'non bloccato', -DB_ERROR_SYNTAX => 'errore di sintassi', -DB_ERROR_UNSUPPORTED => 'non supportato', -DB_ERROR_VALUE_COUNT_ON_ROW => 'valore inserito troppo grande per una colonna', -DB_ERROR_INVALID_DSN => 'DSN non valido', -DB_ERROR_CONNECT_FAILED => 'connessione fallita', -0 => 'nessun errore', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'dati inseriti insufficienti', -DB_ERROR_EXTENSION_NOT_FOUND=> 'estensione non trovata', -DB_ERROR_NOSUCHDB => 'database non trovato', -DB_ERROR_ACCESS_VIOLATION => 'permessi insufficienti' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-nl.inc.php b/include/limesurvey/classes/adodb/lang/adodb-nl.inc.php deleted file mode 100644 index f00d931d..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-nl.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - 'nl', -DB_ERROR => 'onbekende fout', -DB_ERROR_ALREADY_EXISTS => 'bestaat al', -DB_ERROR_CANNOT_CREATE => 'kan niet aanmaken', -DB_ERROR_CANNOT_DELETE => 'kan niet wissen', -DB_ERROR_CANNOT_DROP => 'kan niet verwijderen', -DB_ERROR_CONSTRAINT => 'constraint overtreding', -DB_ERROR_DIVZERO => 'poging tot delen door nul', -DB_ERROR_INVALID => 'ongeldig', -DB_ERROR_INVALID_DATE => 'ongeldige datum of tijd', -DB_ERROR_INVALID_NUMBER => 'ongeldig nummer', -DB_ERROR_MISMATCH => 'is incorrect', -DB_ERROR_NODBSELECTED => 'geen database geselecteerd', -DB_ERROR_NOSUCHFIELD => 'onbekend veld', -DB_ERROR_NOSUCHTABLE => 'onbekende tabel', -DB_ERROR_NOT_CAPABLE => 'database systeem is niet tot uitvoer in staat', -DB_ERROR_NOT_FOUND => 'niet gevonden', -DB_ERROR_NOT_LOCKED => 'niet vergrendeld', -DB_ERROR_SYNTAX => 'syntaxis fout', -DB_ERROR_UNSUPPORTED => 'niet ondersteund', -DB_ERROR_VALUE_COUNT_ON_ROW => 'waarde telling op rij', -DB_ERROR_INVALID_DSN => 'ongeldige DSN', -DB_ERROR_CONNECT_FAILED => 'connectie mislukt', -0 => 'geen fout', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'onvoldoende data gegeven', -DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie niet gevonden', -DB_ERROR_NOSUCHDB => 'onbekende database', -DB_ERROR_ACCESS_VIOLATION => 'onvoldoende rechten' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-pl.inc.php b/include/limesurvey/classes/adodb/lang/adodb-pl.inc.php deleted file mode 100644 index 5ca099b1..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-pl.inc.php +++ /dev/null @@ -1,35 +0,0 @@ - - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'pl', -DB_ERROR => 'niezidentyfikowany b��d', -DB_ERROR_ALREADY_EXISTS => 'ju� istniej�', -DB_ERROR_CANNOT_CREATE => 'nie mo�na stworzy�', -DB_ERROR_CANNOT_DELETE => 'nie mo�na usun��', -DB_ERROR_CANNOT_DROP => 'nie mo�na porzuci�', -DB_ERROR_CONSTRAINT => 'pogwa�cenie uprawnie�', -DB_ERROR_DIVZERO => 'dzielenie przez zero', -DB_ERROR_INVALID => 'b��dny', -DB_ERROR_INVALID_DATE => 'b��dna godzina lub data', -DB_ERROR_INVALID_NUMBER => 'b��dny numer', -DB_ERROR_MISMATCH => 'niedopasowanie', -DB_ERROR_NODBSELECTED => 'baza danych nie zosta�a wybrana', -DB_ERROR_NOSUCHFIELD => 'nie znaleziono pola', -DB_ERROR_NOSUCHTABLE => 'nie znaleziono tabeli', -DB_ERROR_NOT_CAPABLE => 'nie zdolny', -DB_ERROR_NOT_FOUND => 'nie znaleziono', -DB_ERROR_NOT_LOCKED => 'nie zakmni�ty', -DB_ERROR_SYNTAX => 'b��d sk�adni', -DB_ERROR_UNSUPPORTED => 'nie obs�uguje', -DB_ERROR_VALUE_COUNT_ON_ROW => 'warto�� liczona w szeregu', -DB_ERROR_INVALID_DSN => 'b��dny DSN', -DB_ERROR_CONNECT_FAILED => 'po��czenie nie zosta�o zrealizowane', -0 => 'brak b��d�w', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'niedostateczna ilo�� informacji', -DB_ERROR_EXTENSION_NOT_FOUND=> 'nie znaleziono rozszerzenia', -DB_ERROR_NOSUCHDB => 'nie znaleziono bazy', -DB_ERROR_ACCESS_VIOLATION => 'niedostateczne uprawnienia' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-pt-br.inc.php b/include/limesurvey/classes/adodb/lang/adodb-pt-br.inc.php deleted file mode 100644 index 2e0d12e4..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-pt-br.inc.php +++ /dev/null @@ -1,35 +0,0 @@ - 'pt-br', -DB_ERROR => 'erro desconhecido', -DB_ERROR_ALREADY_EXISTS => 'j� existe', -DB_ERROR_CANNOT_CREATE => 'imposs�vel criar', -DB_ERROR_CANNOT_DELETE => 'imposs�vel exclu�r', -DB_ERROR_CANNOT_DROP => 'imposs�vel remover', -DB_ERROR_CONSTRAINT => 'viola��o do confinamente', -DB_ERROR_DIVZERO => 'divis�o por zero', -DB_ERROR_INVALID => 'inv�lido', -DB_ERROR_INVALID_DATE => 'data ou hora inv�lida', -DB_ERROR_INVALID_NUMBER => 'n�mero inv�lido', -DB_ERROR_MISMATCH => 'erro', -DB_ERROR_NODBSELECTED => 'nenhum banco de dados selecionado', -DB_ERROR_NOSUCHFIELD => 'campo inv�lido', -DB_ERROR_NOSUCHTABLE => 'tabela inexistente', -DB_ERROR_NOT_CAPABLE => 'capacidade inv�lida para este BD', -DB_ERROR_NOT_FOUND => 'n�o encontrado', -DB_ERROR_NOT_LOCKED => 'n�o bloqueado', -DB_ERROR_SYNTAX => 'erro de sintaxe', -DB_ERROR_UNSUPPORTED => -'n�o suportado', -DB_ERROR_VALUE_COUNT_ON_ROW => 'a quantidade de colunas n�o corresponde ao de valores', -DB_ERROR_INVALID_DSN => 'DSN inv�lido', -DB_ERROR_CONNECT_FAILED => 'falha na conex�o', -0 => 'sem erro', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'dados insuficientes', -DB_ERROR_EXTENSION_NOT_FOUND=> 'extens�o n�o encontrada', -DB_ERROR_NOSUCHDB => 'banco de dados n�o encontrado', -DB_ERROR_ACCESS_VIOLATION => 'permiss�o insuficiente' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-ro.inc.php b/include/limesurvey/classes/adodb/lang/adodb-ro.inc.php deleted file mode 100644 index bed11810..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-ro.inc.php +++ /dev/null @@ -1,35 +0,0 @@ - */ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'ro', -DB_ERROR => 'eroare necunoscuta', -DB_ERROR_ALREADY_EXISTS => 'deja exista', -DB_ERROR_CANNOT_CREATE => 'nu se poate creea', -DB_ERROR_CANNOT_DELETE => 'nu se poate sterge', -DB_ERROR_CANNOT_DROP => 'nu se poate executa drop', -DB_ERROR_CONSTRAINT => 'violare de constrain', -DB_ERROR_DIVZERO => 'se divide la zero', -DB_ERROR_INVALID => 'invalid', -DB_ERROR_INVALID_DATE => 'data sau timp invalide', -DB_ERROR_INVALID_NUMBER => 'numar invalid', -DB_ERROR_MISMATCH => 'nepotrivire-mismatch', -DB_ERROR_NODBSELECTED => 'nu exista baza de date selectata', -DB_ERROR_NOSUCHFIELD => 'camp inexistent', -DB_ERROR_NOSUCHTABLE => 'tabela inexistenta', -DB_ERROR_NOT_CAPABLE => 'functie optionala neinstalata', -DB_ERROR_NOT_FOUND => 'negasit', -DB_ERROR_NOT_LOCKED => 'neblocat', -DB_ERROR_SYNTAX => 'eroare de sintaxa', -DB_ERROR_UNSUPPORTED => 'nu e suportat', -DB_ERROR_VALUE_COUNT_ON_ROW => 'valoare prea mare pentru coloana', -DB_ERROR_INVALID_DSN => 'DSN invalid', -DB_ERROR_CONNECT_FAILED => 'conectare esuata', -0 => 'fara eroare', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'data introduse insuficiente', -DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie negasita', -DB_ERROR_NOSUCHDB => 'nu exista baza de date', -DB_ERROR_ACCESS_VIOLATION => 'permisiuni insuficiente' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-ru1251.inc.php b/include/limesurvey/classes/adodb/lang/adodb-ru1251.inc.php deleted file mode 100644 index 0d349480..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-ru1251.inc.php +++ /dev/null @@ -1,35 +0,0 @@ - 'ru1251', - DB_ERROR => 'неизвестная ошибка', - DB_ERROR_ALREADY_EXISTS => 'уже существует', - DB_ERROR_CANNOT_CREATE => 'невозможно создать', - DB_ERROR_CANNOT_DELETE => 'невозможно удалить', - DB_ERROR_CANNOT_DROP => 'невозможно удалить (drop)', - DB_ERROR_CONSTRAINT => 'нарушение условий проверки', - DB_ERROR_DIVZERO => 'деление на 0', - DB_ERROR_INVALID => 'неправильно', - DB_ERROR_INVALID_DATE => 'некорректная дата или время', - DB_ERROR_INVALID_NUMBER => 'некорректное число', - DB_ERROR_MISMATCH => 'ошибка', - DB_ERROR_NODBSELECTED => 'БД не выбрана', - DB_ERROR_NOSUCHFIELD => 'не существует поле', - DB_ERROR_NOSUCHTABLE => 'не существует таблица', - DB_ERROR_NOT_CAPABLE => 'СУБД не в состоянии', - DB_ERROR_NOT_FOUND => 'не найдено', - DB_ERROR_NOT_LOCKED => 'не заблокировано', - DB_ERROR_SYNTAX => 'синтаксическая ошибка', - DB_ERROR_UNSUPPORTED => 'не поддерживается', - DB_ERROR_VALUE_COUNT_ON_ROW => 'счетчик значений в строке', - DB_ERROR_INVALID_DSN => 'неправильная DSN', - DB_ERROR_CONNECT_FAILED => 'соединение неуспешно', - 0 => 'нет ошибки', // DB_OK - DB_ERROR_NEED_MORE_DATA => 'предоставлено недостаточно данных', - DB_ERROR_EXTENSION_NOT_FOUND=> 'расширение не найдено', - DB_ERROR_NOSUCHDB => 'не существует БД', - DB_ERROR_ACCESS_VIOLATION => 'недостаточно прав доступа' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-sv.inc.php b/include/limesurvey/classes/adodb/lang/adodb-sv.inc.php deleted file mode 100644 index 937bd4c2..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-sv.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - 'en', -DB_ERROR => 'Ok�nt fel', -DB_ERROR_ALREADY_EXISTS => 'finns redan', -DB_ERROR_CANNOT_CREATE => 'kan inte skapa', -DB_ERROR_CANNOT_DELETE => 'kan inte ta bort', -DB_ERROR_CANNOT_DROP => 'kan inte sl�ppa', -DB_ERROR_CONSTRAINT => 'begr�nsning kr�nkt', -DB_ERROR_DIVZERO => 'division med noll', -DB_ERROR_INVALID => 'ogiltig', -DB_ERROR_INVALID_DATE => 'ogiltigt datum eller tid', -DB_ERROR_INVALID_NUMBER => 'ogiltigt tal', -DB_ERROR_MISMATCH => 'felaktig matchning', -DB_ERROR_NODBSELECTED => 'ingen databas vald', -DB_ERROR_NOSUCHFIELD => 'inget s�dant f�lt', -DB_ERROR_NOSUCHTABLE => 'ingen s�dan tabell', -DB_ERROR_NOT_CAPABLE => 'DB backend klarar det inte', -DB_ERROR_NOT_FOUND => 'finns inte', -DB_ERROR_NOT_LOCKED => 'inte l�st', -DB_ERROR_SYNTAX => 'syntaxfel', -DB_ERROR_UNSUPPORTED => 'st�ds ej', -DB_ERROR_VALUE_COUNT_ON_ROW => 'v�rde r�knat p� rad', -DB_ERROR_INVALID_DSN => 'ogiltig DSN', -DB_ERROR_CONNECT_FAILED => 'anslutning misslyckades', -0 => 'inget fel', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'otillr�ckligt med data angivet', -DB_ERROR_EXTENSION_NOT_FOUND=> 'ut�kning hittades ej', -DB_ERROR_NOSUCHDB => 'ingen s�dan databas', -DB_ERROR_ACCESS_VIOLATION => 'otillr�ckliga r�ttigheter' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb-uk1251.inc.php b/include/limesurvey/classes/adodb/lang/adodb-uk1251.inc.php deleted file mode 100644 index 1f1fcf36..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb-uk1251.inc.php +++ /dev/null @@ -1,35 +0,0 @@ - 'uk1251', -DB_ERROR => '������� �������', -DB_ERROR_ALREADY_EXISTS => '��� ����', -DB_ERROR_CANNOT_CREATE => '��������� ��������', -DB_ERROR_CANNOT_DELETE => '��������� ��������', -DB_ERROR_CANNOT_DROP => '��������� ������� (drop)', -DB_ERROR_CONSTRAINT => '��������� ���� ��������', -DB_ERROR_DIVZERO => '������ �� 0', -DB_ERROR_INVALID => '�����������', -DB_ERROR_INVALID_DATE => '����������� ���� �� ���', -DB_ERROR_INVALID_NUMBER => '����������� �����', -DB_ERROR_MISMATCH => '�������', -DB_ERROR_NODBSELECTED => '�� ������� ��', -DB_ERROR_NOSUCHFIELD => '�� ���� ����', -DB_ERROR_NOSUCHTABLE => '�� ���� �������', -DB_ERROR_NOT_CAPABLE => '���� �� � ����', -DB_ERROR_NOT_FOUND => '�� ��������', -DB_ERROR_NOT_LOCKED => '�� �����������', -DB_ERROR_SYNTAX => '����������� �������', -DB_ERROR_UNSUPPORTED => '�� �����������', -DB_ERROR_VALUE_COUNT_ON_ROW => '�������� ������� � ������', -DB_ERROR_INVALID_DSN => '����������� DSN', -DB_ERROR_CONNECT_FAILED => '�\'������� ��������', -0 => '��� ������', // DB_OK -DB_ERROR_NEED_MORE_DATA => '������ ����������� �����', -DB_ERROR_EXTENSION_NOT_FOUND=> '���������� �� ��������', -DB_ERROR_NOSUCHDB => '�� ���� ��', -DB_ERROR_ACCESS_VIOLATION => '����������� ���� �������' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/lang/adodb_th.inc.php b/include/limesurvey/classes/adodb/lang/adodb_th.inc.php deleted file mode 100644 index 9f34b614..00000000 --- a/include/limesurvey/classes/adodb/lang/adodb_th.inc.php +++ /dev/null @@ -1,33 +0,0 @@ - -$ADODB_LANG_ARRAY = array ( - 'LANG' => 'th', -DB_ERROR => 'error ไม่รู้สาเหตุ', -DB_ERROR_ALREADY_EXISTS => 'มี�?ล้ว', -DB_ERROR_CANNOT_CREATE => 'สร้างไม่ได้', -DB_ERROR_CANNOT_DELETE => 'ลบไม่ได้', -DB_ERROR_CANNOT_DROP => 'drop ไม่ได้', -DB_ERROR_CONSTRAINT => 'constraint violation', -DB_ERROR_DIVZERO => 'หา�?ด้วยสู�?', -DB_ERROR_INVALID => 'ไม่ valid', -DB_ERROR_INVALID_DATE => 'วันที่ เวลา ไม่ valid', -DB_ERROR_INVALID_NUMBER => 'เลขไม่ valid', -DB_ERROR_MISMATCH => 'mismatch', -DB_ERROR_NODBSELECTED => 'ไม่ได้เลือ�?�?านข้อมูล', -DB_ERROR_NOSUCHFIELD => 'ไม่มีฟีลด์นี้', -DB_ERROR_NOSUCHTABLE => 'ไม่มีตารางนี้', -DB_ERROR_NOT_CAPABLE => 'DB backend not capable', -DB_ERROR_NOT_FOUND => 'ไม่พบ', -DB_ERROR_NOT_LOCKED => 'ไม่ได้ล๊อ�?', -DB_ERROR_SYNTAX => 'ผิด syntax', -DB_ERROR_UNSUPPORTED => 'ไม่ support', -DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', -DB_ERROR_INVALID_DSN => 'invalid DSN', -DB_ERROR_CONNECT_FAILED => 'ไม่สามารถ connect', -0 => 'no error', // DB_OK -DB_ERROR_NEED_MORE_DATA => 'ข้อมูลไม่เพียงพอ', -DB_ERROR_EXTENSION_NOT_FOUND=> 'ไม่พบ extension', -DB_ERROR_NOSUCHDB => 'ไม่มีข้อมูลนี้', -DB_ERROR_ACCESS_VIOLATION => 'permissions ไม่พอ' -); -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/license.txt b/include/limesurvey/classes/adodb/license.txt deleted file mode 100644 index 9821fcb7..00000000 --- a/include/limesurvey/classes/adodb/license.txt +++ /dev/null @@ -1,182 +0,0 @@ -ADOdb is dual licensed using BSD and LGPL. - -In plain English, you do not need to distribute your application in source code form, nor do you need to distribute ADOdb source code, provided you follow the rest of terms of the BSD license. - -For more info about ADOdb, visit http://adodb.sourceforge.net/ - -BSD Style-License -================= - -Copyright (c) 2000, 2001, 2002, 2003, 2004 John Lim -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 John Lim nor the names of its contributors may be used to -endorse or promote products derived from this software without specific prior written -permission. - -DISCLAIMER: -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 -JOHN LIM 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. - -========================================================== -GNU LESSER GENERAL PUBLIC LICENSE -Version 2.1, February 1999 - -Copyright (C) 1991, 1999 Free Software Foundation, Inc. -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - -Preamble -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - -This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - -When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - -To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - -For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - -We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - -To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - -Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - -Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - -When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - -We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - -For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - -In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - -Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - -The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - -A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - -The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - -"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - -1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - - -a) The modified work must itself be a software library. -b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. -c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. -d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. -(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - -Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - -This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - -4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - -If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - -5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - -However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - -When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - -If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - -Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - -6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - -You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - - -a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) -b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. -c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. -d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. -e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. -For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - -7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - - -a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. -b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. -8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - -10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - -11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - -14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/perf/perf-db2.inc.php b/include/limesurvey/classes/adodb/perf/perf-db2.inc.php deleted file mode 100644 index 8eaf8f03..00000000 --- a/include/limesurvey/classes/adodb/perf/perf-db2.inc.php +++ /dev/null @@ -1,102 +0,0 @@ - array('RATIO', - "SELECT - case when sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)=0 then 0 - else 100*(1-sum(POOL_DATA_P_READS+POOL_INDEX_P_READS)/sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)) end - FROM TABLE(SNAPSHOT_APPL('',-2)) as t", - '=WarnCacheRatio'), - - 'Data Cache', - 'data cache buffers' => array('DATAC', - 'select sum(npages) from SYSCAT.BUFFERPOOLS', - 'See tuning reference.' ), - 'cache blocksize' => array('DATAC', - 'select avg(pagesize) from SYSCAT.BUFFERPOOLS', - '' ), - 'data cache size' => array('DATAC', - 'select sum(npages*pagesize) from SYSCAT.BUFFERPOOLS', - '' ), - 'Connections', - 'current connections' => array('SESS', - "SELECT count(*) FROM TABLE(SNAPSHOT_APPL_INFO('',-2)) as t", - ''), - - false - ); - - - function perf_db2(&$conn) - { - $this->conn = $conn; - } - - function Explain($sql,$partial=false) - { - $save = $this->conn->LogSQL(false); - if ($partial) { - $sqlq = $this->conn->qstr($sql.'%'); - $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); - if ($arr) { - foreach($arr as $row) { - $sql = reset($row); - if (crc32($sql) == $partial) break; - } - } - } - $qno = rand(); - $ok = $this->conn->Execute("EXPLAIN PLAN SET QUERYNO=$qno FOR $sql"); - ob_start(); - if (!$ok) echo "

        Have EXPLAIN tables been created?

        "; - else { - $rs = $this->conn->Execute("select * from explain_statement where queryno=$qno"); - if ($rs) rs2html($rs); - } - $s = ob_get_contents(); - ob_end_clean(); - $this->conn->LogSQL($save); - - $s .= $this->Tracer($sql); - return $s; - } - - - function Tables() - { - $rs = $this->conn->Execute("select tabschema,tabname,card as rows, - npages pages_used,fpages pages_allocated, tbspace tablespace - from syscat.tables where tabschema not in ('SYSCAT','SYSIBM','SYSSTAT') order by 1,2"); - return rs2html($rs,false,false,false,false); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/perf/perf-informix.inc.php b/include/limesurvey/classes/adodb/perf/perf-informix.inc.php deleted file mode 100644 index ae799b53..00000000 --- a/include/limesurvey/classes/adodb/perf/perf-informix.inc.php +++ /dev/null @@ -1,70 +0,0 @@ - array('RATIOH', - "select round((1-(wt.value / (rd.value + wr.value)))*100,2) - from sysmaster:sysprofile wr, sysmaster:sysprofile rd, sysmaster:sysprofile wt - where rd.name = 'pagreads' and - wr.name = 'pagwrites' and - wt.name = 'buffwts'", - '=WarnCacheRatio'), - 'IO', - 'data reads' => array('IO', - "select value from sysmaster:sysprofile where name='pagreads'", - 'Page reads'), - - 'data writes' => array('IO', - "select value from sysmaster:sysprofile where name='pagwrites'", - 'Page writes'), - - 'Connections', - 'current connections' => array('SESS', - 'select count(*) from sysmaster:syssessions', - 'Number of sessions'), - - false - - ); - - function perf_informix(&$conn) - { - $this->conn = $conn; - } - -} -?> diff --git a/include/limesurvey/classes/adodb/perf/perf-mssql.inc.php b/include/limesurvey/classes/adodb/perf/perf-mssql.inc.php deleted file mode 100644 index 3f20296b..00000000 --- a/include/limesurvey/classes/adodb/perf/perf-mssql.inc.php +++ /dev/null @@ -1,164 +0,0 @@ - array('RATIO', - "select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'", - '=WarnCacheRatio'), - 'prepared sql hit ratio' => array('RATIO', - array('dbcc cachestats','Prepared',1,100), - ''), - 'adhoc sql hit ratio' => array('RATIO', - array('dbcc cachestats','Adhoc',1,100), - ''), - 'IO', - 'data reads' => array('IO', - "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"), - 'data writes' => array('IO', - "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"), - - 'Data Cache', - 'data cache size' => array('DATAC', - "select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'", - '' ), - 'data cache blocksize' => array('DATAC', - "select 8192",'page size'), - 'Connections', - 'current connections' => array('SESS', - '=sp_who', - ''), - 'max connections' => array('SESS', - "SELECT @@MAX_CONNECTIONS", - ''), - - false - ); - - - function perf_mssql(&$conn) - { - if ($conn->dataProvider == 'odbc') { - $this->sql1 = 'sql1'; - //$this->explain = false; - } - $this->conn = $conn; - } - - function Explain($sql,$partial=false) - { - - $save = $this->conn->LogSQL(false); - if ($partial) { - $sqlq = $this->conn->qstr($sql.'%'); - $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); - if ($arr) { - foreach($arr as $row) { - $sql = reset($row); - if (crc32($sql) == $partial) break; - } - } - } - - $s = '

        Explain: '.htmlspecialchars($sql).'

        '; - $this->conn->Execute("SET SHOWPLAN_ALL ON;"); - $sql = str_replace('?',"''",$sql); - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $rs = $this->conn->Execute($sql); - //adodb_printr($rs); - $ADODB_FETCH_MODE = $save; - if ($rs) { - $rs->MoveNext(); - $s .= ''; - while (!$rs->EOF) { - $s .= '\n"; ## NOTE CORRUPT tag is intentional!!!! - $rs->MoveNext(); - } - $s .= '
        Rows IO CPU     Plan
        '.round($rs->fields[8],1).''.round($rs->fields[9],3).''.round($rs->fields[10],3).'
        '.htmlspecialchars($rs->fields[0])."
        '; - - $rs->NextRecordSet(); - } - - $this->conn->Execute("SET SHOWPLAN_ALL OFF;"); - $this->conn->LogSQL($save); - $s .= $this->Tracer($sql); - return $s; - } - - function Tables() - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - //$this->conn->debug=1; - $s = ''; - $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'"); - if ($rs1) { - while (!$rs1->EOF) { - $tab = $rs1->fields[0]; - $tabq = $this->conn->qstr($tab); - $rs2 = $this->conn->Execute("sp_spaceused $tabq"); - if ($rs2) { - $s .= ''; - $rs2->Close(); - } - $rs1->MoveNext(); - } - $rs1->Close(); - } - $ADODB_FETCH_MODE = $save; - return $s.'
        tablenamesize_in_kindex sizereserved size
        '.$tab.''.$rs2->fields[3].''.$rs2->fields[4].''.$rs2->fields[2].'
        '; - } - - function sp_who() - { - $arr = $this->conn->GetArray('sp_who'); - return sizeof($arr); - } - - function HealthCheck($cli=false) - { - - $this->conn->Execute('dbcc traceon(3604)'); - $html = adodb_perf::HealthCheck($cli); - $this->conn->Execute('dbcc traceoff(3604)'); - return $html; - } - - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/perf/perf-mssqlnative.inc.php b/include/limesurvey/classes/adodb/perf/perf-mssqlnative.inc.php deleted file mode 100644 index 6ace23a0..00000000 --- a/include/limesurvey/classes/adodb/perf/perf-mssqlnative.inc.php +++ /dev/null @@ -1,164 +0,0 @@ - array('RATIO', - "select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'", - '=WarnCacheRatio'), - 'prepared sql hit ratio' => array('RATIO', - array('dbcc cachestats','Prepared',1,100), - ''), - 'adhoc sql hit ratio' => array('RATIO', - array('dbcc cachestats','Adhoc',1,100), - ''), - 'IO', - 'data reads' => array('IO', - "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"), - 'data writes' => array('IO', - "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"), - - 'Data Cache', - 'data cache size' => array('DATAC', - "select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'", - '' ), - 'data cache blocksize' => array('DATAC', - "select 8192",'page size'), - 'Connections', - 'current connections' => array('SESS', - '=sp_who', - ''), - 'max connections' => array('SESS', - "SELECT @@MAX_CONNECTIONS", - ''), - - false - ); - - - function perf_mssqlnative(&$conn) - { - if ($conn->dataProvider == 'odbc') { - $this->sql1 = 'sql1'; - //$this->explain = false; - } - $this->conn =& $conn; - } - - function Explain($sql,$partial=false) - { - - $save = $this->conn->LogSQL(false); - if ($partial) { - $sqlq = $this->conn->qstr($sql.'%'); - $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); - if ($arr) { - foreach($arr as $row) { - $sql = reset($row); - if (crc32($sql) == $partial) break; - } - } - } - - $s = '

        Explain: '.htmlspecialchars($sql).'

        '; - $this->conn->Execute("SET SHOWPLAN_ALL ON;"); - $sql = str_replace('?',"''",$sql); - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $rs =& $this->conn->Execute($sql); - //adodb_printr($rs); - $ADODB_FETCH_MODE = $save; - if ($rs) { - $rs->MoveNext(); - $s .= ''; - while (!$rs->EOF) { - $s .= '\n"; ## NOTE CORRUPT tag is intentional!!!! - $rs->MoveNext(); - } - $s .= '
        Rows IO CPU     Plan
        '.round($rs->fields[8],1).''.round($rs->fields[9],3).''.round($rs->fields[10],3).'
        '.htmlspecialchars($rs->fields[0])."
        '; - - $rs->NextRecordSet(); - } - - $this->conn->Execute("SET SHOWPLAN_ALL OFF;"); - $this->conn->LogSQL($save); - $s .= $this->Tracer($sql); - return $s; - } - - function Tables() - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - //$this->conn->debug=1; - $s = ''; - $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'"); - if ($rs1) { - while (!$rs1->EOF) { - $tab = $rs1->fields[0]; - $tabq = $this->conn->qstr($tab); - $rs2 = $this->conn->Execute("sp_spaceused $tabq"); - if ($rs2) { - $s .= ''; - $rs2->Close(); - } - $rs1->MoveNext(); - } - $rs1->Close(); - } - $ADODB_FETCH_MODE = $save; - return $s.'
        tablenamesize_in_kindex sizereserved size
        '.$tab.''.$rs2->fields[3].''.$rs2->fields[4].''.$rs2->fields[2].'
        '; - } - - function sp_who() - { - $arr = $this->conn->GetArray('sp_who'); - return sizeof($arr); - } - - function HealthCheck($cli=false) - { - - $this->conn->Execute('dbcc traceon(3604)'); - $html = adodb_perf::HealthCheck($cli); - $this->conn->Execute('dbcc traceoff(3604)'); - return $html; - } - - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/perf/perf-mysql.inc.php b/include/limesurvey/classes/adodb/perf/perf-mysql.inc.php deleted file mode 100644 index c7b4edfc..00000000 --- a/include/limesurvey/classes/adodb/perf/perf-mysql.inc.php +++ /dev/null @@ -1,315 +0,0 @@ - array('RATIO', - '=GetKeyHitRatio', - '=WarnCacheRatio'), - 'InnoDB cache hit ratio' => array('RATIO', - '=GetInnoDBHitRatio', - '=WarnCacheRatio'), - 'data cache hit ratio' => array('HIDE', # only if called - '=FindDBHitRatio', - '=WarnCacheRatio'), - 'sql cache hit ratio' => array('RATIO', - '=GetQHitRatio', - ''), - 'IO', - 'data reads' => array('IO', - '=GetReads', - 'Number of selects (Key_reads is not accurate)'), - 'data writes' => array('IO', - '=GetWrites', - 'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'), - - 'Data Cache', - 'MyISAM data cache size' => array('DATAC', - array("show variables", 'key_buffer_size'), - '' ), - 'BDB data cache size' => array('DATAC', - array("show variables", 'bdb_cache_size'), - '' ), - 'InnoDB data cache size' => array('DATAC', - array("show variables", 'innodb_buffer_pool_size'), - '' ), - 'Memory Usage', - 'read buffer size' => array('CACHE', - array("show variables", 'read_buffer_size'), - '(per session)'), - 'sort buffer size' => array('CACHE', - array("show variables", 'sort_buffer_size'), - 'Size of sort buffer (per session)' ), - 'table cache' => array('CACHE', - array("show variables", 'table_cache'), - 'Number of tables to keep open'), - 'Connections', - 'current connections' => array('SESS', - array('show status','Threads_connected'), - ''), - 'max connections' => array( 'SESS', - array("show variables",'max_connections'), - ''), - - false - ); - - function perf_mysql(&$conn) - { - $this->conn = $conn; - } - - function Explain($sql,$partial=false) - { - - if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return '

        Unable to EXPLAIN non-select statement

        '; - $save = $this->conn->LogSQL(false); - if ($partial) { - $sqlq = $this->conn->qstr($sql.'%'); - $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); - if ($arr) { - foreach($arr as $row) { - $sql = reset($row); - if (crc32($sql) == $partial) break; - } - } - } - $sql = str_replace('?',"''",$sql); - - if ($partial) { - $sqlq = $this->conn->qstr($sql.'%'); - $sql = $this->conn->GetOne("select sql1 from adodb_logsql where sql1 like $sqlq"); - } - - $s = '

        Explain: '.htmlspecialchars($sql).'

        '; - $rs = $this->conn->Execute('EXPLAIN '.$sql); - $s .= rs2html($rs,false,false,false,false); - $this->conn->LogSQL($save); - $s .= $this->Tracer($sql); - return $s; - } - - function Tables() - { - if (!$this->tablesSQL) return false; - - $rs = $this->conn->Execute($this->tablesSQL); - if (!$rs) return false; - - $html = rs2html($rs,false,false,false,false); - return $html; - } - - function GetReads() - { - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $rs = $this->conn->Execute('show status'); - - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if (!$rs) return 0; - $val = 0; - while (!$rs->EOF) { - switch($rs->fields[0]) { - case 'Com_select': - $val = $rs->fields[1]; - $rs->Close(); - return $val; - } - $rs->MoveNext(); - } - - $rs->Close(); - - return $val; - } - - function GetWrites() - { - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $rs = $this->conn->Execute('show status'); - - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if (!$rs) return 0; - $val = 0.0; - while (!$rs->EOF) { - switch($rs->fields[0]) { - case 'Com_insert': - $val += $rs->fields[1]; break; - case 'Com_delete': - $val += $rs->fields[1]; break; - case 'Com_update': - $val += $rs->fields[1]/2; - $rs->Close(); - return $val; - } - $rs->MoveNext(); - } - - $rs->Close(); - - return $val; - } - - function FindDBHitRatio() - { - // first find out type of table - //$this->conn->debug=1; - - global $ADODB_FETCH_MODE; - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $rs = $this->conn->Execute('show table status'); - - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if (!$rs) return ''; - $type = strtoupper($rs->fields[1]); - $rs->Close(); - switch($type){ - case 'MYISAM': - case 'ISAM': - return $this->DBParameter('MyISAM cache hit ratio').' (MyISAM)'; - case 'INNODB': - return $this->DBParameter('InnoDB cache hit ratio').' (InnoDB)'; - default: - return $type.' not supported'; - } - - } - - function GetQHitRatio() - { - //Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached - $hits = $this->_DBParameter(array("show status","Qcache_hits")); - $total = $this->_DBParameter(array("show status","Qcache_inserts")); - $total += $this->_DBParameter(array("show status","Qcache_not_cached")); - - $total += $hits; - if ($total) return round(($hits*100)/$total,2); - return 0; - } - - /* - Use session variable to store Hit percentage, because MySQL - does not remember last value of SHOW INNODB STATUS hit ratio - - # 1st query to SHOW INNODB STATUS - 0.00 reads/s, 0.00 creates/s, 0.00 writes/s - Buffer pool hit rate 1000 / 1000 - - # 2nd query to SHOW INNODB STATUS - 0.00 reads/s, 0.00 creates/s, 0.00 writes/s - No buffer pool activity since the last printout - */ - function GetInnoDBHitRatio() - { - global $ADODB_FETCH_MODE; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $rs = $this->conn->Execute('show innodb status'); - - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_FETCH_MODE = $save; - - if (!$rs || $rs->EOF) return 0; - $stat = $rs->fields[0]; - $rs->Close(); - $at = strpos($stat,'Buffer pool hit rate'); - $stat = substr($stat,$at,200); - if (preg_match('!Buffer pool hit rate\s*([0-9]*) / ([0-9]*)!',$stat,$arr)) { - $val = 100*$arr[1]/$arr[2]; - $_SESSION['INNODB_HIT_PCT'] = $val; - return round($val,2); - } else { - if (isset($_SESSION['INNODB_HIT_PCT'])) return $_SESSION['INNODB_HIT_PCT']; - return 0; - } - return 0; - } - - function GetKeyHitRatio() - { - $hits = $this->_DBParameter(array("show status","Key_read_requests")); - $reqs = $this->_DBParameter(array("show status","Key_reads")); - if ($reqs == 0) return 0; - - return round(($hits/($reqs+$hits))*100,2); - } - - // start hack - var $optimizeTableLow = 'CHECK TABLE %s FAST QUICK'; - var $optimizeTableHigh = 'OPTIMIZE TABLE %s'; - - /** - * @see adodb_perf#optimizeTable - */ - function optimizeTable( $table, $mode = ADODB_OPT_LOW) - { - if ( !is_string( $table)) return false; - - $conn = $this->conn; - if ( !$conn) return false; - - $sql = ''; - switch( $mode) { - case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break; - case ADODB_OPT_HIGH : $sql = $this->optimizeTableHigh; break; - default : - { - // May dont use __FUNCTION__ constant for BC (__FUNCTION__ Added in PHP 4.3.0) - ADOConnection::outp( sprintf( "

        %s: '%s' using of undefined mode '%s'

        ", __CLASS__, __FUNCTION__, $mode)); - return false; - } - } - $sql = sprintf( $sql, $table); - - return $conn->Execute( $sql) !== false; - } - // end hack -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/perf/perf-oci8.inc.php b/include/limesurvey/classes/adodb/perf/perf-oci8.inc.php deleted file mode 100644 index c3aa9d23..00000000 --- a/include/limesurvey/classes/adodb/perf/perf-oci8.inc.php +++ /dev/null @@ -1,570 +0,0 @@ - array('RATIOH', - "select round((1-(phy.value / (cur.value + con.value)))*100,2) - from v\$sysstat cur, v\$sysstat con, v\$sysstat phy - where cur.name = 'db block gets' and - con.name = 'consistent gets' and - phy.name = 'physical reads'", - '=WarnCacheRatio'), - - 'sql cache hit ratio' => array( 'RATIOH', - 'select round(100*(sum(pins)-sum(reloads))/sum(pins),2) from v$librarycache', - 'increase shared_pool_size if too ratio low'), - - 'datadict cache hit ratio' => array('RATIOH', - "select - round((1 - (sum(getmisses) / (sum(gets) + - sum(getmisses))))*100,2) - from v\$rowcache", - 'increase shared_pool_size if too ratio low'), - - 'memory sort ratio' => array('RATIOH', - "SELECT ROUND((100 * b.VALUE) /DECODE ((a.VALUE + b.VALUE), - 0,1,(a.VALUE + b.VALUE)),2) -FROM v\$sysstat a, - v\$sysstat b -WHERE a.name = 'sorts (disk)' -AND b.name = 'sorts (memory)'", - "% of memory sorts compared to disk sorts - should be over 95%"), - - 'IO', - 'data reads' => array('IO', - "select value from v\$sysstat where name='physical reads'"), - - 'data writes' => array('IO', - "select value from v\$sysstat where name='physical writes'"), - - 'Data Cache', - - 'data cache buffers' => array( 'DATAC', - "select a.value/b.value from v\$parameter a, v\$parameter b - where a.name = 'db_cache_size' and b.name= 'db_block_size'", - 'Number of cache buffers. Tune db_cache_size if the data cache hit ratio is too low.'), - 'data cache blocksize' => array('DATAC', - "select value from v\$parameter where name='db_block_size'", - '' ), - - 'Memory Pools', - 'SGA Max Size' => array( 'DATAC', - "select value from v\$parameter where name = 'sga_max_size'", - 'The sga_max_size is the maximum value to which sga_target can be set.' ), - 'SGA target' => array( 'DATAC', - "select value from v\$parameter where name = 'sga_target'", - 'If sga_target is defined then data cache, shared, java and large pool size can be 0. This is because all these pools are consolidated into one sga_target.' ), - 'data cache size' => array('DATAC', - "select value from v\$parameter where name = 'db_cache_size'", - 'db_cache_size' ), - 'shared pool size' => array('DATAC', - "select value from v\$parameter where name = 'shared_pool_size'", - 'shared_pool_size, which holds shared sql, stored procedures, dict cache and similar shared structs' ), - 'java pool size' => array('DATAJ', - "select value from v\$parameter where name = 'java_pool_size'", - 'java_pool_size' ), - 'large pool buffer size' => array('CACHE', - "select value from v\$parameter where name='large_pool_size'", - 'this pool is for large mem allocations (not because it is larger than shared pool), for MTS sessions, parallel queries, io buffers (large_pool_size) ' ), - - 'pga buffer size' => array('CACHE', - "select value from v\$parameter where name='pga_aggregate_target'", - 'program global area is private memory for sorting, and hash and bitmap merges - since oracle 9i (pga_aggregate_target)' ), - - - 'Connections', - 'current connections' => array('SESS', - 'select count(*) from sys.v_$session where username is not null', - ''), - 'max connections' => array( 'SESS', - "select value from v\$parameter where name='sessions'", - ''), - - 'Memory Utilization', - 'data cache utilization ratio' => array('RATIOU', - "select round((1-bytes/sgasize)*100, 2) - from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f - where name = 'free memory' and pool = 'shared pool'", - 'Percentage of data cache actually in use - should be over 85%'), - - 'shared pool utilization ratio' => array('RATIOU', - 'select round((sga.bytes/case when p.value=0 then sga.bytes else to_number(p.value) end)*100,2) - from v$sgastat sga, v$parameter p - where sga.name = \'free memory\' and sga.pool = \'shared pool\' - and p.name = \'shared_pool_size\'', - 'Percentage of shared pool actually used - too low is bad, too high is worse'), - - 'large pool utilization ratio' => array('RATIOU', - "select round((1-bytes/sgasize)*100, 2) - from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f - where name = 'free memory' and pool = 'large pool'", - 'Percentage of large_pool actually in use - too low is bad, too high is worse'), - 'sort buffer size' => array('CACHE', - "select value from v\$parameter where name='sort_area_size'", - 'max in-mem sort_area_size (per query), uses memory in pga' ), - - 'pga usage at peak' => array('RATIOU', - '=PGA','Mb utilization at peak transactions (requires Oracle 9i+)'), - 'Transactions', - 'rollback segments' => array('ROLLBACK', - "select count(*) from sys.v_\$rollstat", - ''), - - 'peak transactions' => array('ROLLBACK', - "select max_utilization tx_hwm - from sys.v_\$resource_limit - where resource_name = 'transactions'", - 'Taken from high-water-mark'), - 'max transactions' => array('ROLLBACK', - "select value from v\$parameter where name = 'transactions'", - 'max transactions / rollback segments < 3.5 (or transactions_per_rollback_segment)'), - 'Parameters', - 'cursor sharing' => array('CURSOR', - "select value from v\$parameter where name = 'cursor_sharing'", - 'Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR (9i+). See cursor_sharing.'), - /* - 'cursor reuse' => array('CURSOR', - "select count(*) from (select sql_text_wo_constants, count(*) - from t1 - group by sql_text_wo_constants - having count(*) > 100)",'These are sql statements that should be using bind variables'),*/ - 'index cache cost' => array('COST', - "select value from v\$parameter where name = 'optimizer_index_caching'", - '=WarnIndexCost'), - 'random page cost' => array('COST', - "select value from v\$parameter where name = 'optimizer_index_cost_adj'", - '=WarnPageCost'), - - 'Backup', - 'Achivelog Mode' => array('BACKUP', 'select log_mode from v$database', 'To turn on archivelog:
        -
        -        SQLPLUS> connect sys as sysdba;
        -        SQLPLUS> shutdown immediate;
        -
        -        SQLPLUS> startup mount exclusive;
        -        SQLPLUS> alter database archivelog;
        -        SQLPLUS> archive log start;
        -        SQLPLUS> alter database open;
        -
        '), - - 'DBID' => array('BACKUP','select dbid from v$database','Primary key of database, used for recovery with an RMAN Recovery Catalog'), - 'Archive Log Dest' => array('BACKUP', "SELECT NVL(v1.value,v2.value) -FROM v\$parameter v1, v\$parameter v2 WHERE v1.name='log_archive_dest' AND v2.name='log_archive_dest_10'", ''), - - 'Flashback Area' => array('BACKUP', "select nvl(value,'Flashback Area not used') from v\$parameter where name=lower('DB_RECOVERY_FILE_DEST')", 'Flashback area is a folder where all backup data and logs can be stored and managed by Oracle. If Error: message displayed, then it is not in use.'), - 'Control File Keep Time' => array('BACKUP', "select value from v\$parameter where name='control_file_record_keep_time'",'No of days to keep RMAN info in control file. I recommend it be set to x2 or x3 times the frequency of your full backup.'), - false - - ); - - - function perf_oci8(&$conn) - { - $savelog = $conn->LogSQL(false); - $this->version = $conn->ServerInfo(); - $conn->LogSQL($savelog); - $this->conn = $conn; - } - - function WarnPageCost($val) - { - if ($val == 100) $s = 'Too High. '; - else $s = ''; - - return $s.'Recommended is 20-50 for TP, and 50 for data warehouses. Default is 100. See optimizer_index_cost_adj. '; - } - - function WarnIndexCost($val) - { - if ($val == 0) $s = 'Too Low. '; - else $s = ''; - - return $s.'Percentage of indexed data blocks expected in the cache. - Recommended is 20 (fast disk array) to 30 (slower hard disks). Default is 0. - See optimizer_index_caching.'; - } - - function PGA() - { - if ($this->version['version'] < 9) return 'Oracle 9i or later required'; - - $rs = $this->conn->Execute("select a.mb,a.targ as pga_size_pct,a.pct from - (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb, - pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r - from v\$pga_target_advice) a left join - (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb, - pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r - from v\$pga_target_advice) b on - a.r = b.r+1 where - b.pct < 100"); - if (!$rs) return "Only in 9i or later"; - $rs->Close(); - if ($rs->EOF) return "PGA could be too big"; - - return reset($rs->fields); - } - - function Explain($sql,$partial=false) - { - $savelog = $this->conn->LogSQL(false); - $rs = $this->conn->SelectLimit("select ID FROM PLAN_TABLE"); - if (!$rs) { - echo "

        Missing PLAN_TABLE

        -
        -CREATE TABLE PLAN_TABLE (
        -  STATEMENT_ID                    VARCHAR2(30),
        -  TIMESTAMP                       DATE,
        -  REMARKS                         VARCHAR2(80),
        -  OPERATION                       VARCHAR2(30),
        -  OPTIONS                         VARCHAR2(30),
        -  OBJECT_NODE                     VARCHAR2(128),
        -  OBJECT_OWNER                    VARCHAR2(30),
        -  OBJECT_NAME                     VARCHAR2(30),
        -  OBJECT_INSTANCE                 NUMBER(38),
        -  OBJECT_TYPE                     VARCHAR2(30),
        -  OPTIMIZER                       VARCHAR2(255),
        -  SEARCH_COLUMNS                  NUMBER,
        -  ID                              NUMBER(38),
        -  PARENT_ID                       NUMBER(38),
        -  POSITION                        NUMBER(38),
        -  COST                            NUMBER(38),
        -  CARDINALITY                     NUMBER(38),
        -  BYTES                           NUMBER(38),
        -  OTHER_TAG                       VARCHAR2(255),
        -  PARTITION_START                 VARCHAR2(255),
        -  PARTITION_STOP                  VARCHAR2(255),
        -  PARTITION_ID                    NUMBER(38),
        -  OTHER                           LONG,
        -  DISTRIBUTION                    VARCHAR2(30)
        -);
        -
        "; - return false; - } - - $rs->Close(); - // $this->conn->debug=1; - - if ($partial) { - $sqlq = $this->conn->qstr($sql.'%'); - $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq"); - if ($arr) { - foreach($arr as $row) { - $sql = reset($row); - if (crc32($sql) == $partial) break; - } - } - } - - $s = "

        Explain: ".htmlspecialchars($sql)."

        "; - - $this->conn->BeginTrans(); - $id = "ADODB ".microtime(); - - $rs = $this->conn->Execute("EXPLAIN PLAN SET STATEMENT_ID='$id' FOR $sql"); - $m = $this->conn->ErrorMsg(); - if ($m) { - $this->conn->RollbackTrans(); - $this->conn->LogSQL($savelog); - $s .= "

        $m

        "; - return $s; - } - $rs = $this->conn->Execute(" - select - '
        '||lpad('--', (level-1)*2,'-') || trim(operation) || ' ' || trim(options)||'
        ' as Operation, - object_name,COST,CARDINALITY,bytes - FROM plan_table -START WITH id = 0 and STATEMENT_ID='$id' -CONNECT BY prior id=parent_id and statement_id='$id'"); - - $s .= rs2html($rs,false,false,false,false); - $this->conn->RollbackTrans(); - $this->conn->LogSQL($savelog); - $s .= $this->Tracer($sql,$partial); - return $s; - } - - - function CheckMemory() - { - if ($this->version['version'] < 9) return 'Oracle 9i or later required'; - - $rs = $this->conn->Execute(" -select a.size_for_estimate as cache_mb_estimate, - case when a.size_factor=1 then - '<<= current' - when a.estd_physical_read_factor-b.estd_physical_read_factor > 0 and a.estd_physical_read_factor<1 then - '- BETTER - ' - else ' ' end as currsize, - a.estd_physical_read_factor-b.estd_physical_read_factor as best_when_0 - from (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) a , - (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) b where a.r = b.r-1"); - if (!$rs) return false; - - /* - The v$db_cache_advice utility show the marginal changes in physical data block reads for different sizes of db_cache_size - */ - $s = "

        Data Cache Estimate

        "; - if ($rs->EOF) { - $s .= "

        Cache that is 50% of current size is still too big

        "; - } else { - $s .= "Ideal size of Data Cache is when \"best_when_0\" changes from a positive number and becomes zero."; - $s .= rs2html($rs,false,false,false,false); - } - return $s; - } - - /* - Generate html for suspicious/expensive sql - */ - function tohtml(&$rs,$type) - { - $o1 = $rs->FetchField(0); - $o2 = $rs->FetchField(1); - $o3 = $rs->FetchField(2); - if ($rs->EOF) return '

        None found

        '; - $check = ''; - $sql = ''; - $s = "\n\n'; - while (!$rs->EOF) { - if ($check != $rs->fields[0].'::'.$rs->fields[1]) { - if ($check) { - $carr = explode('::',$check); - $prefix = "'; - $suffix = ''; - if (strlen($prefix)>2000) { - $prefix = ''; - $suffix = ''; - } - - $s .= "\n'; - } - $sql = $rs->fields[2]; - $check = $rs->fields[0].'::'.$rs->fields[1]; - } else - $sql .= $rs->fields[2]; - if (substr($sql,strlen($sql)-1) == "\0") $sql = substr($sql,0,strlen($sql)-1); - $rs->MoveNext(); - } - $rs->Close(); - - $carr = explode('::',$check); - $prefix = "'; - $suffix = ''; - if (strlen($prefix)>2000) { - $prefix = ''; - $suffix = ''; - } - $s .= "\n'; - - return $s."
        ".$o1->name.''.$o2->name.''.$o3->name.'
        ".$carr[0].''.$carr[1].''.$prefix.$sql.$suffix.'
        ".$carr[0].''.$carr[1].''.$prefix.$sql.$suffix.'
        \n\n"; - } - - // code thanks to Ixora. - // http://www.ixora.com.au/scripts/query_opt.htm - // requires oracle 8.1.7 or later - function SuspiciousSQL($numsql=10) - { - $sql = " -select - substr(to_char(s.pct, '99.00'), 2) || '%' load, - s.executions executes, - p.sql_text -from - ( - select - address, - buffer_gets, - executions, - pct, - rank() over (order by buffer_gets desc) ranking - from - ( - select - address, - buffer_gets, - executions, - 100 * ratio_to_report(buffer_gets) over () pct - from - sys.v_\$sql - where - command_type != 47 and module != 'T.O.A.D.' - ) - where - buffer_gets > 50 * executions - ) s, - sys.v_\$sqltext p -where - s.ranking <= $numsql and - p.address = s.address -order by - 1 desc, s.address, p.piece"; - - global $ADODB_CACHE_MODE; - if (isset($_GET['expsixora']) && isset($_GET['sql'])) { - $partial = empty($_GET['part']); - echo "".$this->Explain($_GET['sql'],$partial)."\n"; - } - - if (isset($_GET['sql'])) return $this->_SuspiciousSQL($numsql); - - $s = ''; - $timer = time(); - $s .= $this->_SuspiciousSQL($numsql); - $timer = time() - $timer; - - if ($timer > $this->noShowIxora) return $s; - $s .= '

        '; - - $save = $ADODB_CACHE_MODE; - $ADODB_CACHE_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $savelog = $this->conn->LogSQL(false); - $rs = $this->conn->SelectLimit($sql); - $this->conn->LogSQL($savelog); - - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_CACHE_MODE = $save; - if ($rs) { - $s .= "\n

        Ixora Suspicious SQL

        "; - $s .= $this->tohtml($rs,'expsixora'); - } - - return $s; - } - - // code thanks to Ixora. - // http://www.ixora.com.au/scripts/query_opt.htm - // requires oracle 8.1.7 or later - function ExpensiveSQL($numsql = 10) - { - $sql = " -select - substr(to_char(s.pct, '99.00'), 2) || '%' load, - s.executions executes, - p.sql_text -from - ( - select - address, - disk_reads, - executions, - pct, - rank() over (order by disk_reads desc) ranking - from - ( - select - address, - disk_reads, - executions, - 100 * ratio_to_report(disk_reads) over () pct - from - sys.v_\$sql - where - command_type != 47 and module != 'T.O.A.D.' - ) - where - disk_reads > 50 * executions - ) s, - sys.v_\$sqltext p -where - s.ranking <= $numsql and - p.address = s.address -order by - 1 desc, s.address, p.piece -"; - global $ADODB_CACHE_MODE; - if (isset($_GET['expeixora']) && isset($_GET['sql'])) { - $partial = empty($_GET['part']); - echo "".$this->Explain($_GET['sql'],$partial)."\n"; - } - if (isset($_GET['sql'])) { - $var = $this->_ExpensiveSQL($numsql); - return $var; - } - - $s = ''; - $timer = time(); - $s .= $this->_ExpensiveSQL($numsql); - $timer = time() - $timer; - if ($timer > $this->noShowIxora) return $s; - - $s .= '

        '; - $save = $ADODB_CACHE_MODE; - $ADODB_CACHE_MODE = ADODB_FETCH_NUM; - if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); - - $savelog = $this->conn->LogSQL(false); - $rs = $this->conn->Execute($sql); - $this->conn->LogSQL($savelog); - - if (isset($savem)) $this->conn->SetFetchMode($savem); - $ADODB_CACHE_MODE = $save; - - if ($rs) { - $s .= "\n

        Ixora Expensive SQL

        "; - $s .= $this->tohtml($rs,'expeixora'); - } - - return $s; - } - - function clearsql() - { - $perf_table = adodb_perf::table(); - // using the naive "delete from $perf_table where created<".$this->conn->sysTimeStamp will cause the table to lock, possibly - // for a long time - $sql = -"DECLARE cnt pls_integer; -BEGIN - cnt := 0; - FOR rec IN (SELECT ROWID AS rr FROM $perf_table WHERE createdconn->Execute($sql); - } - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/perf/perf-postgres.inc.php b/include/limesurvey/classes/adodb/perf/perf-postgres.inc.php deleted file mode 100644 index 8322b55d..00000000 --- a/include/limesurvey/classes/adodb/perf/perf-postgres.inc.php +++ /dev/null @@ -1,153 +0,0 @@ - array('RATIO', - "select case when count(*)=3 then 'TRUE' else 'FALSE' end from pg_settings where (name='stats_block_level' or name='stats_row_level' or name='stats_start_collector') and setting='on' ", - 'Value must be TRUE to enable hit ratio statistics (stats_start_collector,stats_row_level and stats_block_level must be set to true in postgresql.conf)'), - 'data cache hit ratio' => array('RATIO', - "select case when blks_hit=0 then 0 else round( ((1-blks_read::float/blks_hit)*100)::numeric, 2) end from pg_stat_database where datname='\$DATABASE'", - '=WarnCacheRatio'), - 'IO', - 'data reads' => array('IO', - 'select sum(heap_blks_read+toast_blks_read) from pg_statio_user_tables', - ), - 'data writes' => array('IO', - 'select round((sum(n_tup_ins/4.0+n_tup_upd/8.0+n_tup_del/4.0)/16)::numeric,2) from pg_stat_user_tables', - 'Count of inserts/updates/deletes * coef'), - - 'Data Cache', - 'data cache buffers' => array('DATAC', - "select setting from pg_settings where name='shared_buffers'", - 'Number of cache buffers. Tuning'), - 'cache blocksize' => array('DATAC', - 'select 8192', - '(estimate)' ), - 'data cache size' => array( 'DATAC', - "select setting::integer*8192 from pg_settings where name='shared_buffers'", - '' ), - 'operating system cache size' => array( 'DATA', - "select setting::integer*8192 from pg_settings where name='effective_cache_size'", - '(effective cache size)' ), - 'Memory Usage', - # Postgres 7.5 changelog: Rename server parameters SortMem and VacuumMem to work_mem and maintenance_work_mem; - 'sort/work buffer size' => array('CACHE', - "select setting::integer*1024 from pg_settings where name='sort_mem' or name = 'work_mem' order by name", - 'Size of sort buffer (per query)' ), - 'Connections', - 'current connections' => array('SESS', - 'select count(*) from pg_stat_activity', - ''), - 'max connections' => array('SESS', - "select setting from pg_settings where name='max_connections'", - ''), - 'Parameters', - 'rollback buffers' => array('COST', - "select setting from pg_settings where name='wal_buffers'", - 'WAL buffers'), - 'random page cost' => array('COST', - "select setting from pg_settings where name='random_page_cost'", - 'Cost of doing a seek (default=4). See random_page_cost'), - false - ); - - function perf_postgres(&$conn) - { - $this->conn = $conn; - } - - var $optimizeTableLow = 'VACUUM %s'; - var $optimizeTableHigh = 'VACUUM ANALYZE %s'; - - /** - * @see adodb_perf#optimizeTable - */ - - function optimizeTable($table, $mode = ADODB_OPT_LOW) - { - if(! is_string($table)) return false; - - $conn = $this->conn; - if (! $conn) return false; - - $sql = ''; - switch($mode) { - case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break; - case ADODB_OPT_HIGH: $sql = $this->optimizeTableHigh; break; - default : - { - ADOConnection::outp(sprintf("

        %s: '%s' using of undefined mode '%s'

        ", __CLASS__, 'optimizeTable', $mode)); - return false; - } - } - $sql = sprintf($sql, $table); - - return $conn->Execute($sql) !== false; - } - - function Explain($sql,$partial=false) - { - $save = $this->conn->LogSQL(false); - - if ($partial) { - $sqlq = $this->conn->qstr($sql.'%'); - $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq"); - if ($arr) { - foreach($arr as $row) { - $sql = reset($row); - if (crc32($sql) == $partial) break; - } - } - } - $sql = str_replace('?',"''",$sql); - $s = '

        Explain: '.htmlspecialchars($sql).'

        '; - $rs = $this->conn->Execute('EXPLAIN '.$sql); - $this->conn->LogSQL($save); - $s .= '
        ';
        -        if ($rs)
        -        while (!$rs->EOF) {
        -            $s .= reset($rs->fields)."\n";
        -            $rs->MoveNext();
        -        }
        -        $s .= '
        '; - $s .= $this->Tracer($sql,$partial); - return $s; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/pivottable.inc.php b/include/limesurvey/classes/adodb/pivottable.inc.php deleted file mode 100644 index 701a801e..00000000 --- a/include/limesurvey/classes/adodb/pivottable.inc.php +++ /dev/null @@ -1,187 +0,0 @@ -databaseType,'access') !== false; - // note - vfp 6 still doesn' work even with IIF enabled || $db->databaseType == 'vfp'; - - //$hidecnt = false; - - if ($where) $where = "\nWHERE $where"; - if (!is_array($colfield)) $colarr = $db->GetCol("select distinct $colfield from $tables $where order by 1"); - if (!$aggfield) $hidecnt = false; - - $sel = "$rowfields, "; - if (is_array($colfield)) { - foreach ($colfield as $k => $v) { - $k = trim($k); - if (!$hidecnt) { - $sel .= $iif ? - "\n\t$aggfn(IIF($v,1,0)) AS \"$k\", " - : - "\n\t$aggfn(CASE WHEN $v THEN 1 ELSE 0 END) AS \"$k\", "; - } - if ($aggfield) { - $sel .= $iif ? - "\n\t$aggfn(IIF($v,$aggfield,0)) AS \"$sumlabel$k\", " - : - "\n\t$aggfn(CASE WHEN $v THEN $aggfield ELSE 0 END) AS \"$sumlabel$k\", "; - } - } - } else { - foreach ($colarr as $v) { - if (!is_numeric($v)) $vq = $db->qstr($v); - else $vq = $v; - $v = trim($v); - if (strlen($v) == 0 ) $v = 'null'; - if (!$hidecnt) { - $sel .= $iif ? - "\n\t$aggfn(IIF($colfield=$vq,1,0)) AS \"$v\", " - : - "\n\t$aggfn(CASE WHEN $colfield=$vq THEN 1 ELSE 0 END) AS \"$v\", "; - } - if ($aggfield) { - if ($hidecnt) $label = $v; - else $label = "{$v}_$aggfield"; - $sel .= $iif ? - "\n\t$aggfn(IIF($colfield=$vq,$aggfield,0)) AS \"$label\", " - : - "\n\t$aggfn(CASE WHEN $colfield=$vq THEN $aggfield ELSE 0 END) AS \"$label\", "; - } - } - } - if ($aggfield && $aggfield != '1'){ - $agg = "$aggfn($aggfield)"; - $sel .= "\n\t$agg as \"$sumlabel$aggfield\", "; - } - - if ($showcount) - $sel .= "\n\tSUM(1) as Total"; - else - $sel = substr($sel,0,strlen($sel)-2); - - - // Strip aliases - $rowfields = preg_replace('/ AS (\w+)/i', '', $rowfields); - - $sql = "SELECT $sel \nFROM $tables $where \nGROUP BY $rowfields"; - - return $sql; -} - -/* EXAMPLES USING MS NORTHWIND DATABASE */ -if (0) { - - # example1 - # - # Query the main "product" table - # Set the rows to CompanyName and QuantityPerUnit - # and the columns to the Categories - # and define the joins to link to lookup tables - # "categories" and "suppliers" - # - - $sql = PivotTableSQL( - $gDB, # adodb connection - 'products p ,categories c ,suppliers s', # tables - 'CompanyName,QuantityPerUnit', # row fields - 'CategoryName', # column fields - 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where - ); - print "
        $sql";
        -    $rs = $gDB->Execute($sql);
        -    rs2html($rs);
        -
        -    /*
        -     Generated SQL:
        -
        -     SELECT CompanyName,QuantityPerUnit,
        -     SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
        -     SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
        -     SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
        -     SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products",
        -     SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals",
        -     SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry",
        -     SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
        -     SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
        -     SUM(1) as Total
        -     FROM products p ,categories c ,suppliers s  WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
        -     GROUP BY CompanyName,QuantityPerUnit
        -     */
        -    //=====================================================================
        -
        -    # example2
        -    #
        -    # Query the main "product" table
        -    # Set the rows to CompanyName and QuantityPerUnit
        -    # and the columns to the UnitsInStock for diiferent ranges
        -    # and define the joins to link to lookup tables
        -    # "categories" and "suppliers"
        -    #
        -    $sql = PivotTableSQL(
        -    $gDB,										# adodb connection
        - 	'products p ,categories c ,suppliers s',	# tables
        -	'CompanyName,QuantityPerUnit',				# row fields
        -    # column ranges
        -    array(
        -' 0 ' => 'UnitsInStock <= 0',
        -"1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5',
        -"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10',
        -"11 to 15"  => '10 < UnitsInStock and UnitsInStock <= 15',
        -"16+" =>'15 < UnitsInStock'
        -),
        -	' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
        -	'UnitsInStock', 							# sum this field
        -	'Sum'										# sum label prefix
        -);
        -print "
        $sql";
        -$rs = $gDB->Execute($sql);
        -rs2html($rs);
        -/*
        - Generated SQL:
        -
        - SELECT CompanyName,QuantityPerUnit,
        - SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum  0 ",
        - SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5",
        - SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10",
        - SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15",
        - SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
        - SUM(UnitsInStock) AS "Sum UnitsInStock",
        - SUM(1) as Total
        - FROM products p ,categories c ,suppliers s  WHERE  p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
        - GROUP BY CompanyName,QuantityPerUnit
        - */
        -}
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/readme.txt b/include/limesurvey/classes/adodb/readme.txt
        deleted file mode 100644
        index 009b94c5..00000000
        --- a/include/limesurvey/classes/adodb/readme.txt
        +++ /dev/null
        @@ -1,62 +0,0 @@
        ->> ADODB Library for PHP4
        -
        -(c) 2000-2004 John Lim (jlim@natsoft.com.my)
        -
        -Released under both BSD and GNU Lesser GPL library license. 
        -This means you can use it in proprietary products.
        - 
        - 
        ->> Introduction
        -
        -PHP's database access functions are not standardised. This creates a 
        -need for a database class library to hide the differences between the 
        -different databases (encapsulate the differences) so we can easily 
        -switch databases.
        -
        -We currently support MySQL, Interbase, Sybase, PostgreSQL, Oracle, 
        -Microsoft SQL server,  Foxpro ODBC, Access ODBC, Informix, DB2,
        -Sybase SQL Anywhere, generic ODBC and Microsoft's ADO. 
        -
        -We hope more people will contribute drivers to support other databases.
        -
        -
        ->> Documentation and Examples
        -
        -Refer to the adodb/docs directory for full documentation and examples. 
        -There is also a  tutorial tute.htm that contrasts ADODB code with 
        -mysql code.
        -
        -
        ->>> Files
        -Adodb.inc.php is the main file. You need to include only this file.
        -
        -Adodb-*.inc.php are the database specific driver code.
        -
        -Test.php contains a list of test commands to exercise the class library.
        -
        -Adodb-session.php is the PHP4 session handling code.
        -
        -Testdatabases.inc.php contains the list of databases to apply the tests on.
        -
        -Benchmark.php is a simple benchmark to test the throughput of a simple SELECT 
        -statement for databases described in testdatabases.inc.php. The benchmark
        -tables are created in test.php.
        -
        -readme.htm is the main documentation.
        -
        -tute.htm is the tutorial.
        -
        -
        ->> More Info
        -
        -For more information, including installation see readme.htm
        -or visit
        -           http://adodb.sourceforge.net/
        -
        -
        ->> Feature Requests and Bug Reports
        -
        -Email to jlim@natsoft.com.my 
        -
        -
        - 
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/rsfilter.inc.php b/include/limesurvey/classes/adodb/rsfilter.inc.php
        deleted file mode 100644
        index c8660ade..00000000
        --- a/include/limesurvey/classes/adodb/rsfilter.inc.php
        +++ /dev/null
        @@ -1,61 +0,0 @@
        - $v) {
        - $arr[$k] = ucwords($v);
        - }
        - }
        - $rs = RSFilter($rs,'do_ucwords');
        - */
        -function RSFilter($rs,$fn)
        -{
        -    if ($rs->databaseType != 'array') {
        -        if (!$rs->connection) return false;
        -
        -        $rs = $rs->connection->_rs2rs($rs);
        -    }
        -    $rows = $rs->RecordCount();
        -    for ($i=0; $i < $rows; $i++) {
        -        if (is_array ($fn)) {
        -            $obj = $fn[0];
        -            $method = $fn[1];
        -            $obj->$method ($rs->_array[$i],$rs);
        -        } else {
        -            $fn($rs->_array[$i],$rs);
        -        }
        -         
        -    }
        -    if (!$rs->EOF) {
        -        $rs->_currentRow = 0;
        -        $rs->fields = $rs->_array[0];
        -    }
        -
        -    return $rs;
        -}
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/server.php b/include/limesurvey/classes/adodb/server.php
        deleted file mode 100644
        index 334858b9..00000000
        --- a/include/limesurvey/classes/adodb/server.php
        +++ /dev/null
        @@ -1,100 +0,0 @@
        -Connect($host,$uid,$pwd,$database)) err($conn->ErrorNo(). $sep . $conn->ErrorMsg());
        -$sql = undomq($_REQUEST['sql']);
        -
        -if (isset($_REQUEST['fetch']))
        -$ADODB_FETCH_MODE = $_REQUEST['fetch'];
        -
        -if (isset($_REQUEST['nrows'])) {
        -    $nrows = $_REQUEST['nrows'];
        -    $offset = isset($_REQUEST['offset']) ? $_REQUEST['offset'] : -1;
        -    $rs = $conn->SelectLimit($sql,$nrows,$offset);
        -} else
        -$rs = $conn->Execute($sql);
        -if ($rs){
        -    //$rs->timeToLive = 1;
        -    echo _rs2serialize($rs,$conn,$sql);
        -    $rs->Close();
        -} else
        -err($conn->ErrorNo(). $sep .$conn->ErrorMsg());
        -
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/session/adodb-compress-bzip2.php b/include/limesurvey/classes/adodb/session/adodb-compress-bzip2.php
        deleted file mode 100644
        index c3c0d4a1..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-compress-bzip2.php
        +++ /dev/null
        @@ -1,118 +0,0 @@
        -_block_size;
        -    }
        -
        -    /**
        -     */
        -    function setBlockSize($block_size) {
        -        assert('$block_size >= 1');
        -        assert('$block_size <= 9');
        -        $this->_block_size = (int) $block_size;
        -    }
        -
        -    /**
        -     */
        -    function getWorkLevel() {
        -        return $this->_work_level;
        -    }
        -
        -    /**
        -     */
        -    function setWorkLevel($work_level) {
        -        assert('$work_level >= 0');
        -        assert('$work_level <= 250');
        -        $this->_work_level = (int) $work_level;
        -    }
        -
        -    /**
        -     */
        -    function getMinLength() {
        -        return $this->_min_length;
        -    }
        -
        -    /**
        -     */
        -    function setMinLength($min_length) {
        -        assert('$min_length >= 0');
        -        $this->_min_length = (int) $min_length;
        -    }
        -
        -    /**
        -     */
        -    function ADODB_Compress_Bzip2($block_size = null, $work_level = null, $min_length = null) {
        -        if (!is_null($block_size)) {
        -            $this->setBlockSize($block_size);
        -        }
        -
        -        if (!is_null($work_level)) {
        -            $this->setWorkLevel($work_level);
        -        }
        -
        -        if (!is_null($min_length)) {
        -            $this->setMinLength($min_length);
        -        }
        -    }
        -
        -    /**
        -     */
        -    function write($data, $key) {
        -        if (strlen($data) < $this->_min_length) {
        -            return $data;
        -        }
        -
        -        if (!is_null($this->_block_size)) {
        -            if (!is_null($this->_work_level)) {
        -                return bzcompress($data, $this->_block_size, $this->_work_level);
        -            } else {
        -                return bzcompress($data, $this->_block_size);
        -            }
        -        }
        -
        -        return bzcompress($data);
        -    }
        -
        -    /**
        -     */
        -    function read($data, $key) {
        -        return $data ? bzdecompress($data) : $data;
        -    }
        -
        -}
        -
        -return 1;
        -
        -?>
        diff --git a/include/limesurvey/classes/adodb/session/adodb-compress-gzip.php b/include/limesurvey/classes/adodb/session/adodb-compress-gzip.php
        deleted file mode 100644
        index b763667a..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-compress-gzip.php
        +++ /dev/null
        @@ -1,93 +0,0 @@
        -_level;
        -    }
        -
        -    /**
        -     */
        -    function setLevel($level) {
        -        assert('$level >= 0');
        -        assert('$level <= 9');
        -        $this->_level = (int) $level;
        -    }
        -
        -    /**
        -     */
        -    function getMinLength() {
        -        return $this->_min_length;
        -    }
        -
        -    /**
        -     */
        -    function setMinLength($min_length) {
        -        assert('$min_length >= 0');
        -        $this->_min_length = (int) $min_length;
        -    }
        -
        -    /**
        -     */
        -    function ADODB_Compress_Gzip($level = null, $min_length = null) {
        -        if (!is_null($level)) {
        -            $this->setLevel($level);
        -        }
        -
        -        if (!is_null($min_length)) {
        -            $this->setMinLength($min_length);
        -        }
        -    }
        -
        -    /**
        -     */
        -    function write($data, $key) {
        -        if (strlen($data) < $this->_min_length) {
        -            return $data;
        -        }
        -
        -        if (!is_null($this->_level)) {
        -            return gzcompress($data, $this->_level);
        -        } else {
        -            return gzcompress($data);
        -        }
        -    }
        -
        -    /**
        -     */
        -    function read($data, $key) {
        -        return $data ? gzuncompress($data) : $data;
        -    }
        -
        -}
        -
        -return 1;
        -
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/session/adodb-cryptsession.php b/include/limesurvey/classes/adodb/session/adodb-cryptsession.php
        deleted file mode 100644
        index 418929f9..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-cryptsession.php
        +++ /dev/null
        @@ -1,27 +0,0 @@
        -
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/session/adodb-cryptsession2.php b/include/limesurvey/classes/adodb/session/adodb-cryptsession2.php
        deleted file mode 100644
        index d39d946e..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-cryptsession2.php
        +++ /dev/null
        @@ -1,27 +0,0 @@
        -
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/session/adodb-encrypt-mcrypt.php b/include/limesurvey/classes/adodb/session/adodb-encrypt-mcrypt.php
        deleted file mode 100644
        index bece7f7c..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-encrypt-mcrypt.php
        +++ /dev/null
        @@ -1,109 +0,0 @@
        -_cipher;
        -    }
        -
        -    /**
        -     */
        -    function setCipher($cipher) {
        -        $this->_cipher = $cipher;
        -    }
        -
        -    /**
        -     */
        -    function getMode() {
        -        return $this->_mode;
        -    }
        -
        -    /**
        -     */
        -    function setMode($mode) {
        -        $this->_mode = $mode;
        -    }
        -
        -    /**
        -     */
        -    function getSource() {
        -        return $this->_source;
        -    }
        -
        -    /**
        -     */
        -    function setSource($source) {
        -        $this->_source = $source;
        -    }
        -
        -    /**
        -     */
        -    function ADODB_Encrypt_MCrypt($cipher = null, $mode = null, $source = null) {
        -        if (!$cipher) {
        -            $cipher = MCRYPT_RIJNDAEL_256;
        -        }
        -        if (!$mode) {
        -            $mode = MCRYPT_MODE_ECB;
        -        }
        -        if (!$source) {
        -            $source = MCRYPT_RAND;
        -        }
        -
        -        $this->_cipher = $cipher;
        -        $this->_mode = $mode;
        -        $this->_source = $source;
        -    }
        -
        -    /**
        -     */
        -    function write($data, $key) {
        -        $iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode);
        -        $iv = mcrypt_create_iv($iv_size, $this->_source);
        -        return mcrypt_encrypt($this->_cipher, $key, $data, $this->_mode, $iv);
        -    }
        -
        -    /**
        -     */
        -    function read($data, $key) {
        -        $iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode);
        -        $iv = mcrypt_create_iv($iv_size, $this->_source);
        -        $rv = mcrypt_decrypt($this->_cipher, $key, $data, $this->_mode, $iv);
        -        return rtrim($rv, "\0");
        -    }
        -
        -}
        -
        -return 1;
        -
        -?>
        diff --git a/include/limesurvey/classes/adodb/session/adodb-encrypt-md5.php b/include/limesurvey/classes/adodb/session/adodb-encrypt-md5.php
        deleted file mode 100644
        index 279f1e78..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-encrypt-md5.php
        +++ /dev/null
        @@ -1,39 +0,0 @@
        -encrypt($data, $key);
        -    }
        -
        -    /**
        -     */
        -    function read($data, $key) {
        -        $md5crypt = new MD5Crypt();
        -        return $md5crypt->decrypt($data, $key);
        -    }
        -
        -}
        -
        -return 1;
        -
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/session/adodb-encrypt-secret.php b/include/limesurvey/classes/adodb/session/adodb-encrypt-secret.php
        deleted file mode 100644
        index 5b9c88bc..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-encrypt-secret.php
        +++ /dev/null
        @@ -1,48 +0,0 @@
        -
        diff --git a/include/limesurvey/classes/adodb/session/adodb-encrypt-sha1.php b/include/limesurvey/classes/adodb/session/adodb-encrypt-sha1.php
        deleted file mode 100644
        index 34e30a49..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-encrypt-sha1.php
        +++ /dev/null
        @@ -1,32 +0,0 @@
        -encrypt($data, $key);
        -
        -    }
        -
        -
        -    function read($data, $key)
        -    {
        -        $sha1crypt = new SHA1Crypt();
        -        return $sha1crypt->decrypt($data, $key);
        -
        -    }
        -}
        -
        -
        -
        -return 1;
        -?>
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/session/adodb-sess.txt b/include/limesurvey/classes/adodb/session/adodb-sess.txt
        deleted file mode 100644
        index c6c76858..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-sess.txt
        +++ /dev/null
        @@ -1,131 +0,0 @@
        -John,
        -
        -I have been an extremely satisfied ADODB user for several years now.
        -
        -To give you something back for all your hard work, I've spent the last 3
        -days rewriting the adodb-session.php code.
        -
        -----------
        -What's New
        -----------
        -
        -Here's a list of the new code's benefits:
        -
        -* Combines the functionality of the three files:
        -
        -adodb-session.php
        -adodb-session-clob.php
        -adodb-cryptsession.php
        -
        -each with very similar functionality, into a single file adodb-session.php.
        -This will ease maintenance and support issues.
        -
        -* Supports multiple encryption and compression schemes.
        -  Currently, we support:
        -
        -  MD5Crypt (crypt.inc.php)
        -  MCrypt
        -  Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)
        -  GZip
        -  BZip2
        -
        -These can be stacked, so if you want to compress and then encrypt your
        -session data, it's easy.
        -Also, the built-in MCrypt functions will be *much* faster, and more secure,
        -than the MD5Crypt code.
        -
        -* adodb-session.php contains a single class ADODB_Session that encapsulates
        -all functionality.
        -  This eliminates the use of global vars and defines (though they are
        -supported for backwards compatibility).
        -
        -* All user defined parameters are now static functions in the ADODB_Session
        -class.
        -
        -New parameters include:
        -
        -* encryptionKey(): Define the encryption key used to encrypt the session.
        -Originally, it was a hard coded string.
        -
        -* persist(): Define if the database will be opened in persistent mode.
        -Originally, the user had to call adodb_sess_open().
        -
        -* dataFieldName(): Define the field name used to store the session data, as
        -'DATA' appears to be a reserved word in the following cases:
        -	ANSI SQL
        -	IBM DB2
        -	MS SQL Server
        -	Postgres
        -	SAP
        -
        -* filter(): Used to support multiple, simulataneous encryption/compression
        -schemes.
        -
        -* Debug support is improved thru _rsdump() function, which is called after
        -every database call.
        -
        -------------
        -What's Fixed
        -------------
        -
        -The new code includes several bug fixes and enhancements:
        -
        -* sesskey is compared in BINARY mode for MySQL, to avoid problems with
        -session keys that differ only by case.
        -  Of course, the user should define the sesskey field as BINARY, to
        -correctly fix this problem, otherwise performance will suffer.
        -
        -* In ADODB_Session::gc(), if $expire_notify is true, the multiple DELETES in
        -the original code have been optimized to a single DELETE.
        -
        -* In ADODB_Session::destroy(), since "SELECT expireref, sesskey FROM $table
        -WHERE sesskey = $qkey" will only return a single value, we don't loop on the
        -result, we simply process the row, if any.
        -
        -* We close $rs after every use.
        -
        ----------------
        -What's the Same
        ----------------
        -
        -I know backwards compatibility is *very* important to you.  Therefore, the
        -new code is 100% backwards compatible.
        -
        -If you like my code, but don't "trust" it's backwards compatible, maybe we
        -offer it as beta code, in a new directory for a release or two?
        -
        -------------
        -What's To Do
        -------------
        -
        -I've vascillated over whether to use a single function to get/set
        -parameters:
        -
        -$user = ADODB_Session::user(); 	// get
        -ADODB_Session::user($user);		// set
        -
        -or to use separate functions (which is the PEAR/Java way):
        -
        -$user = ADODB_Session::getUser();
        -ADODB_Session::setUser($user);
        -
        -I've chosen the former as it's makes for a simpler API, and reduces the
        -amount of code, but I'd be happy to change it to the latter.
        -
        -Also, do you think the class should be a singleton class, versus a static
        -class?
        -
        -Let me know if you find this code useful, and will be including it in the
        -next release of ADODB.
        -
        -If so, I will modify the current documentation to detail the new
        -functionality.  To that end, what file(s) contain the documentation?  Please
        -send them to me if they are not publically available.
        -
        -Also, if there is *anything* in the code that you like to see changed, let
        -me know.
        -
        -Thanks,
        -
        -Ross
        -
        diff --git a/include/limesurvey/classes/adodb/session/adodb-session-clob.php b/include/limesurvey/classes/adodb/session/adodb-session-clob.php
        deleted file mode 100644
        index ea038a17..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-session-clob.php
        +++ /dev/null
        @@ -1,24 +0,0 @@
        -
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/session/adodb-session-clob2.php b/include/limesurvey/classes/adodb/session/adodb-session-clob2.php
        deleted file mode 100644
        index ece1ec67..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-session-clob2.php
        +++ /dev/null
        @@ -1,24 +0,0 @@
        -
        \ No newline at end of file
        diff --git a/include/limesurvey/classes/adodb/session/adodb-session.php b/include/limesurvey/classes/adodb/session/adodb-session.php
        deleted file mode 100644
        index c8182a2b..00000000
        --- a/include/limesurvey/classes/adodb/session/adodb-session.php
        +++ /dev/null
        @@ -1,934 +0,0 @@
        -Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
        -
        -    /* it is possible that the update statement fails due to a collision */
        -    if (!$ok) {
        -        session_id($old_id);
        -        if (empty($ck)) $ck = session_get_cookie_params();
        -        setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
        -        return false;
        -    }
        -
        -    return true;
        -}
        -
        -/*
        - Generate database table for session data
        - @see http://phplens.com/lens/lensforum/msgs.php?id=12280
        - @return 0 if failure, 1 if errors, 2 if successful.
        - @author Markus Staab http://www.public-4u.de
        - */
        -function adodb_session_create_table($schemaFile=null,$conn = null)
        -{
        -    // set default values
        -    if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema.xml';
        -    if ($conn===null) $conn = ADODB_Session::_conn();
        -
        -    if (!$conn) return 0;
        -
        -    $schema = new adoSchema($conn);
        -    $schema->ParseSchema($schemaFile);
        -    return $schema->ExecuteSchema();
        -}
        -
        -/*!
        - \static
        - */
        -class ADODB_Session {
        -    /////////////////////
        -    // getter/setter methods
        -    /////////////////////
        -
        -    /*
        -
        -    function Lock($lock=null)
        -    {
        -    static $_lock = false;
        -
        -    if (!is_null($lock)) $_lock = $lock;
        -    return $lock;
        -    }
        -    */
        -    /*!
        -     */
        -    function driver($driver = null) {
        -        static $_driver = 'mysql';
        -        static $set = false;
        -
        -        if (!is_null($driver)) {
        -            $_driver = trim($driver);
        -            $set = true;
        -        } elseif (!$set) {
        -            // backwards compatibility
        -            if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
        -                return $GLOBALS['ADODB_SESSION_DRIVER'];
        -            }
        -        }
        -
        -        return $_driver;
        -    }
        -
        -    /*!
        -     */
        -    function host($host = null) {
        -        static $_host = 'localhost';
        -        static $set = false;
        -
        -        if (!is_null($host)) {
        -            $_host = trim($host);
        -            $set = true;
        -        } elseif (!$set) {
        -            // backwards compatibility
        -            if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
        -                return $GLOBALS['ADODB_SESSION_CONNECT'];
        -            }
        -        }
        -
        -        return $_host;
        -    }
        -
        -    /*!
        -     */
        -    function user($user = null) {
        -        static $_user = 'root';
        -        static $set = false;
        -
        -        if (!is_null($user)) {
        -            $_user = trim($user);
        -            $set = true;
        -        } elseif (!$set) {
        -            // backwards compatibility
        -            if (isset($GLOBALS['ADODB_SESSION_USER'])) {
        -                return $GLOBALS['ADODB_SESSION_USER'];
        -            }
        -        }
        -
        -        return $_user;
        -    }
        -
        -    /*!
        -     */
        -    function password($password = null) {
        -        static $_password = '';
        -        static $set = false;
        -
        -        if (!is_null($password)) {
        -            $_password = $password;
        -            $set = true;
        -        } elseif (!$set) {
        -            // backwards compatibility
        -            if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
        -                return $GLOBALS['ADODB_SESSION_PWD'];
        -            }
        -        }
        -
        -        return $_password;
        -    }
        -
        -    /*!
        -     */
        -    function database($database = null) {
        -        static $_database = 'xphplens_2';
        -        static $set = false;
        -
        -        if (!is_null($database)) {
        -            $_database = trim($database);
        -            $set = true;
        -        } elseif (!$set) {
        -            // backwards compatibility
        -            if (isset($GLOBALS['ADODB_SESSION_DB'])) {
        -                return $GLOBALS['ADODB_SESSION_DB'];
        -            }
        -        }
        -
        -        return $_database;
        -    }
        -
        -    /*!
        -     */
        -    function persist($persist = null)
        -    {
        -        static $_persist = true;
        -
        -        if (!is_null($persist)) {
        -            $_persist = trim($persist);
        -        }
        -
        -        return $_persist;
        -    }
        -
        -    /*!
        -     */
        -    function lifetime($lifetime = null) {
        -        static $_lifetime;
        -        static $set = false;
        -
        -        if (!is_null($lifetime)) {
        -            $_lifetime = (int) $lifetime;
        -            $set = true;
        -        } elseif (!$set) {
        -            // backwards compatibility
        -            if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
        -                return $GLOBALS['ADODB_SESS_LIFE'];
        -            }
        -        }
        -        if (!$_lifetime) {
        -            $_lifetime = ini_get('session.gc_maxlifetime');
        -            if ($_lifetime <= 1) {
        -                // bug in PHP 4.0.3 pl 1  -- how about other versions?
        -                //print "

        Session Error: PHP.INI setting session.gc_maxlifetimenot set: $lifetime

        "; - $_lifetime = 1440; - } - } - - return $_lifetime; - } - - /*! - */ - function debug($debug = null) { - static $_debug = false; - static $set = false; - - if (!is_null($debug)) { - $_debug = (bool) $debug; - - $conn = ADODB_Session::_conn(); - if ($conn) { - $conn->debug = $_debug; - } - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESS_DEBUG'])) { - return $GLOBALS['ADODB_SESS_DEBUG']; - } - } - - return $_debug; - } - - /*! - */ - function expireNotify($expire_notify = null) { - static $_expire_notify; - static $set = false; - - if (!is_null($expire_notify)) { - $_expire_notify = $expire_notify; - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) { - return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY']; - } - } - - return $_expire_notify; - } - - /*! - */ - function table($table = null) { - static $_table = 'sessions'; - static $set = false; - - if (!is_null($table)) { - $_table = trim($table); - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_TBL'])) { - return $GLOBALS['ADODB_SESSION_TBL']; - } - } - - return $_table; - } - - /*! - */ - function optimize($optimize = null) { - static $_optimize = false; - static $set = false; - - if (!is_null($optimize)) { - $_optimize = (bool) $optimize; - $set = true; - } elseif (!$set) { - // backwards compatibility - if (defined('ADODB_SESSION_OPTIMIZE')) { - return true; - } - } - - return $_optimize; - } - - /*! - */ - function syncSeconds($sync_seconds = null) { - static $_sync_seconds = 60; - static $set = false; - - if (!is_null($sync_seconds)) { - $_sync_seconds = (int) $sync_seconds; - $set = true; - } elseif (!$set) { - // backwards compatibility - if (defined('ADODB_SESSION_SYNCH_SECS')) { - return ADODB_SESSION_SYNCH_SECS; - } - } - - return $_sync_seconds; - } - - /*! - */ - function clob($clob = null) { - static $_clob = false; - static $set = false; - - if (!is_null($clob)) { - $_clob = strtolower(trim($clob)); - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) { - return $GLOBALS['ADODB_SESSION_USE_LOBS']; - } - } - - return $_clob; - } - - /*! - */ - function dataFieldName($data_field_name = null) { - static $_data_field_name = 'data'; - - if (!is_null($data_field_name)) { - $_data_field_name = trim($data_field_name); - } - - return $_data_field_name; - } - - /*! - */ - function filter($filter = null) { - static $_filter = array(); - - if (!is_null($filter)) { - if (!is_array($filter)) { - $filter = array($filter); - } - $_filter = $filter; - } - - return $_filter; - } - - /*! - */ - function encryptionKey($encryption_key = null) { - static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!'; - - if (!is_null($encryption_key)) { - $_encryption_key = $encryption_key; - } - - return $_encryption_key; - } - - ///////////////////// - // private methods - ///////////////////// - - /*! - */ - function _conn($conn=null) { - return $GLOBALS['ADODB_SESS_CONN']; - } - - /*! - */ - function _crc($crc = null) { - static $_crc = false; - - if (!is_null($crc)) { - $_crc = $crc; - } - - return $_crc; - } - - /*! - */ - function _init() { - session_module_name('user'); - session_set_save_handler( - array('ADODB_Session', 'open'), - array('ADODB_Session', 'close'), - array('ADODB_Session', 'read'), - array('ADODB_Session', 'write'), - array('ADODB_Session', 'destroy'), - array('ADODB_Session', 'gc') - ); - } - - - /*! - */ - function _sessionKey() { - // use this function to create the encryption key for crypted sessions - // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt - return crypt(ADODB_Session::encryptionKey(), session_id()); - } - - /*! - */ - function _dumprs($rs) { - $conn = ADODB_Session::_conn(); - $debug = ADODB_Session::debug(); - - if (!$conn) { - return; - } - - if (!$debug) { - return; - } - - if (!$rs) { - echo "
        \$rs is null or false
        \n"; - return; - } - - //echo "
        \nAffected_Rows=",$conn->Affected_Rows(),"
        \n"; - - if (!is_object($rs)) { - return; - } - - require_once ADODB_SESSION.'/../tohtml.inc.php'; - rs2html($rs); - } - - ///////////////////// - // public methods - ///////////////////// - - function config($driver, $host, $user, $password, $database=false,$options=false) - { - ADODB_Session::driver($driver); - ADODB_Session::host($host); - ADODB_Session::user($user); - ADODB_Session::password($password); - ADODB_Session::database($database); - - if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB'; - - if (isset($options['table'])) ADODB_Session::table($options['table']); - if (isset($options['lob'])) ADODB_Session::clob($options['lob']); - if (isset($options['debug'])) ADODB_Session::debug($options['debug']); - } - - /*! - Create the connection to the database. - - If $conn already exists, reuse that connection - */ - function open($save_path, $session_name, $persist = null) - { - $conn = ADODB_Session::_conn(); - - if ($conn) { - return true; - } - - $database = ADODB_Session::database(); - $debug = ADODB_Session::debug(); - $driver = ADODB_Session::driver(); - $host = ADODB_Session::host(); - $password = ADODB_Session::password(); - $user = ADODB_Session::user(); - - if (!is_null($persist)) { - ADODB_Session::persist($persist); - } else { - $persist = ADODB_Session::persist(); - } - - # these can all be defaulted to in php.ini - # assert('$database'); - # assert('$driver'); - # assert('$host'); - - $conn = ADONewConnection($driver); - - if ($debug) { - $conn->debug = true; - // ADOConnection::outp( " driver=$driver user=$user pwd=$password db=$database "); - } - - if ($persist) { - switch($persist) { - default: - case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break; - case 'C': $ok = $conn->Connect($host, $user, $password, $database); break; - case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break; - } - } else { - $ok = $conn->Connect($host, $user, $password, $database); - } - - if ($ok) $GLOBALS['ADODB_SESS_CONN'] = $conn; - else - ADOConnection::outp('

        Session: connection failed

        ', false); - - - return $ok; - } - - /*! - Close the connection - */ - function close() - { - /* - $conn = ADODB_Session::_conn(); - if ($conn) $conn->Close(); - */ - return true; - } - - /* - Slurp in the session variables and return the serialized string - */ - function read($key) - { - $conn = ADODB_Session::_conn(); - $data = ADODB_Session::dataFieldName(); - $filter = ADODB_Session::filter(); - $table = ADODB_Session::table(); - - if (!$conn) { - return ''; - } - - //assert('$table'); - - $qkey = $conn->quote($key); - $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; - - $sql = "SELECT $data FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . time(); - /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if - developer has commited elsewhere... :( - */ - #if (ADODB_Session::Lock()) - # $rs = $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), $data); - #else - - $rs = $conn->Execute($sql); - //ADODB_Session::_dumprs($rs); - if ($rs) { - if ($rs->EOF) { - $v = ''; - } else { - $v = reset($rs->fields); - $filter = array_reverse($filter); - foreach ($filter as $f) { - if (is_object($f)) { - $v = $f->read($v, ADODB_Session::_sessionKey()); - } - } - $v = rawurldecode($v); - } - - $rs->Close(); - - ADODB_Session::_crc(strlen($v) . crc32($v)); - return $v; - } - - return ''; - } - - /*! - Write the serialized data to a database. - - If the data has not been modified since the last read(), we do not write. - */ - function write($key, $val) - { - global $ADODB_SESSION_READONLY; - - if (!empty($ADODB_SESSION_READONLY)) return; - - $clob = ADODB_Session::clob(); - $conn = ADODB_Session::_conn(); - $crc = ADODB_Session::_crc(); - $data = ADODB_Session::dataFieldName(); - $debug = ADODB_Session::debug(); - $driver = ADODB_Session::driver(); - $expire_notify = ADODB_Session::expireNotify(); - $filter = ADODB_Session::filter(); - $lifetime = ADODB_Session::lifetime(); - $table = ADODB_Session::table(); - - if (!$conn) { - return false; - } - $qkey = $conn->qstr($key); - - //assert('$table'); - - $expiry = time() + $lifetime; - - $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; - - // crc32 optimization since adodb 2.1 - // now we only update expiry date, thx to sebastian thom in adodb 2.32 - if ($crc !== false && $crc == (strlen($val) . crc32($val))) { - if ($debug) { - ADOConnection::outp( '

        Session: Only updating date - crc32 not changed

        '); - } - - $expirevar = ''; - if ($expire_notify) { - $var = reset($expire_notify); - global $$var; - if (isset($$var)) { - $expirevar = $$var; - } - } - - - $sql = "UPDATE $table SET expiry = ".$conn->Param('0').",expireref=".$conn->Param('1')." WHERE $binary sesskey = ".$conn->Param('2')." AND expiry >= ".$conn->Param('3'); - $rs = $conn->Execute($sql,array($expiry,$expirevar,$key,time())); - return true; - } - $val = rawurlencode($val); - foreach ($filter as $f) { - if (is_object($f)) { - $val = $f->write($val, ADODB_Session::_sessionKey()); - } - } - - $arr = array('sesskey' => $key, 'expiry' => $expiry, $data => $val, 'expireref' => ''); - if ($expire_notify) { - $var = reset($expire_notify); - global $$var; - if (isset($$var)) { - $arr['expireref'] = $$var; - } - } - - if (!$clob) { // no lobs, simply use replace() - $arr[$data] = $val; - $rs = $conn->Replace($table, $arr, 'sesskey', $autoQuote = true); - - } else { - // what value shall we insert/update for lob row? - switch ($driver) { - // empty_clob or empty_lob for oracle dbs - case 'oracle': - case 'oci8': - case 'oci8po': - case 'oci805': - $lob_value = sprintf('empty_%s()', strtolower($clob)); - break; - - // null for all other - default: - $lob_value = 'null'; - break; - } - - $conn->StartTrans(); - $expiryref = $conn->qstr($arr['expireref']); - // do we insert or update? => as for sesskey - $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey"); - if ($rs && reset($rs->fields) > 0) { - $sql = "UPDATE $table SET expiry = $expiry, $data = $lob_value, expireref=$expiryref WHERE sesskey = $qkey"; - } else { - $sql = "INSERT INTO $table (expiry, $data, sesskey,expireref) VALUES ($expiry, $lob_value, $qkey,$expiryref)"; - } - if ($rs)$rs->Close(); - - - $err = ''; - $rs1 = $conn->Execute($sql); - if (!$rs1) $err = $conn->ErrorMsg()."\n"; - - $rs2 = $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob)); - if (!$rs2) $err .= $conn->ErrorMsg()."\n"; - - $rs = ($rs && $rs2) ? true : false; - $conn->CompleteTrans(); - } - - if (!$rs) { - ADOConnection::outp('

        Session Replace: ' . $conn->ErrorMsg() . '

        ', false); - return false; - } else { - // bug in access driver (could be odbc?) means that info is not committed - // properly unless select statement executed in Win2000 - if ($conn->databaseType == 'access') { - $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey"; - $rs = $conn->Execute($sql); - ADODB_Session::_dumprs($rs); - if ($rs) { - $rs->Close(); - } - } - }/* - if (ADODB_Session::Lock()) { - $conn->CommitTrans(); - }*/ - return $rs ? true : false; - } - - /*! - */ - function destroy($key) { - $conn = ADODB_Session::_conn(); - $table = ADODB_Session::table(); - $expire_notify = ADODB_Session::expireNotify(); - - if (!$conn) { - return false; - } - - //assert('$table'); - - $qkey = $conn->quote($key); - $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; - - if ($expire_notify) { - reset($expire_notify); - $fn = next($expire_notify); - $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); - $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey"; - $rs = $conn->Execute($sql); - ADODB_Session::_dumprs($rs); - $conn->SetFetchMode($savem); - if (!$rs) { - return false; - } - if (!$rs->EOF) { - $ref = $rs->fields[0]; - $key = $rs->fields[1]; - //assert('$ref'); - //assert('$key'); - $fn($ref, $key); - } - $rs->Close(); - } - - $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey"; - $rs = $conn->Execute($sql); - ADODB_Session::_dumprs($rs); - - return $rs ? true : false; - } - - /*! - */ - function gc($maxlifetime) - { - $conn = ADODB_Session::_conn(); - $debug = ADODB_Session::debug(); - $expire_notify = ADODB_Session::expireNotify(); - $optimize = ADODB_Session::optimize(); - $sync_seconds = ADODB_Session::syncSeconds(); - $table = ADODB_Session::table(); - - if (!$conn) { - return false; - } - - - $time = time(); - $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; - - if ($expire_notify) { - reset($expire_notify); - $fn = next($expire_notify); - $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); - $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time"; - $rs = $conn->Execute($sql); - ADODB_Session::_dumprs($rs); - $conn->SetFetchMode($savem); - if ($rs) { - $conn->StartTrans(); - $keys = array(); - while (!$rs->EOF) { - $ref = $rs->fields[0]; - $key = $rs->fields[1]; - $fn($ref, $key); - $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key)); - $rs->MoveNext(); - } - $rs->Close(); - - $conn->CompleteTrans(); - } - } else { - - if (1) { - $sql = "SELECT sesskey FROM $table WHERE expiry < $time"; - $arr = $conn->GetAll($sql); - foreach ($arr as $row) { - $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0'); - $conn->Execute($sql2,array(reset($row))); - } - } else { - $sql = "DELETE FROM $table WHERE expiry < $time"; - $rs = $conn->Execute($sql); - ADODB_Session::_dumprs($rs); - if ($rs) $rs->Close(); - } - if ($debug) { - ADOConnection::outp("

        Garbage Collection: $sql

        "); - } - } - - // suggested by Cameron, "GaM3R" - if ($optimize) { - $driver = ADODB_Session::driver(); - - if (preg_match('/mysql/i', $driver)) { - $sql = "OPTIMIZE TABLE $table"; - } - if (preg_match('/postgres/i', $driver)) { - $sql = "VACUUM $table"; - } - if (!empty($sql)) { - $conn->Execute($sql); - } - } - - if ($sync_seconds) { - $sql = 'SELECT '; - if ($conn->dataProvider === 'oci8') { - $sql .= "TO_CHAR({$conn->sysTimeStamp}, 'RRRR-MM-DD HH24:MI:SS')"; - } else { - $sql .= $conn->sysTimeStamp; - } - $sql .= " FROM $table"; - - $rs = $conn->SelectLimit($sql, 1); - if ($rs && !$rs->EOF) { - $dbts = reset($rs->fields); - $rs->Close(); - $dbt = $conn->UnixTimeStamp($dbts); - $t = time(); - - if (abs($dbt - $t) >= $sync_seconds) { - $msg = __FILE__ . - ": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: " . - " database=$dbt ($dbts), webserver=$t (diff=". (abs($dbt - $t) / 60) . ' minutes)'; - error_log($msg); - if ($debug) { - ADOConnection::outp("

        $msg

        "); - } - } - } - } - - return true; - } -} - -ADODB_Session::_init(); -if (empty($ADODB_SESSION_READONLY)) -register_shutdown_function('session_write_close'); - -// for backwards compatability only -function adodb_sess_open($save_path, $session_name, $persist = true) { - return ADODB_Session::open($save_path, $session_name, $persist); -} - -// for backwards compatability only -function adodb_sess_gc($t) -{ - return ADODB_Session::gc($t); -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/session/adodb-session2.php b/include/limesurvey/classes/adodb/session/adodb-session2.php deleted file mode 100644 index 622c053b..00000000 --- a/include/limesurvey/classes/adodb/session/adodb-session2.php +++ /dev/null @@ -1,945 +0,0 @@ -Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id)); - - /* it is possible that the update statement fails due to a collision */ - if (!$ok) { - session_id($old_id); - if (empty($ck)) $ck = session_get_cookie_params(); - setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']); - return false; - } - - return true; -} - -/* - Generate database table for session data - @see http://phplens.com/lens/lensforum/msgs.php?id=12280 - @return 0 if failure, 1 if errors, 2 if successful. - @author Markus Staab http://www.public-4u.de - */ -function adodb_session_create_table($schemaFile=null,$conn = null) -{ - // set default values - if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema2.xml'; - if ($conn===null) $conn = ADODB_Session::_conn(); - - if (!$conn) return 0; - - $schema = new adoSchema($conn); - $schema->ParseSchema($schemaFile); - return $schema->ExecuteSchema(); -} - -/*! - \static - */ -class ADODB_Session { - ///////////////////// - // getter/setter methods - ///////////////////// - - /* - - function Lock($lock=null) - { - static $_lock = false; - - if (!is_null($lock)) $_lock = $lock; - return $lock; - } - */ - /*! - */ - static function driver($driver = null) - { - static $_driver = 'mysql'; - static $set = false; - - if (!is_null($driver)) { - $_driver = trim($driver); - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) { - return $GLOBALS['ADODB_SESSION_DRIVER']; - } - } - - return $_driver; - } - - /*! - */ - static function host($host = null) { - static $_host = 'localhost'; - static $set = false; - - if (!is_null($host)) { - $_host = trim($host); - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) { - return $GLOBALS['ADODB_SESSION_CONNECT']; - } - } - - return $_host; - } - - /*! - */ - static function user($user = null) - { - static $_user = 'root'; - static $set = false; - - if (!is_null($user)) { - $_user = trim($user); - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_USER'])) { - return $GLOBALS['ADODB_SESSION_USER']; - } - } - - return $_user; - } - - /*! - */ - static function password($password = null) - { - static $_password = ''; - static $set = false; - - if (!is_null($password)) { - $_password = $password; - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_PWD'])) { - return $GLOBALS['ADODB_SESSION_PWD']; - } - } - - return $_password; - } - - /*! - */ - static function database($database = null) - { - static $_database = ''; - static $set = false; - - if (!is_null($database)) { - $_database = trim($database); - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_DB'])) { - return $GLOBALS['ADODB_SESSION_DB']; - } - } - return $_database; - } - - /*! - */ - static function persist($persist = null) - { - static $_persist = true; - - if (!is_null($persist)) { - $_persist = trim($persist); - } - - return $_persist; - } - - /*! - */ - static function lifetime($lifetime = null) - { - static $_lifetime; - static $set = false; - - if (!is_null($lifetime)) { - $_lifetime = (int) $lifetime; - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESS_LIFE'])) { - return $GLOBALS['ADODB_SESS_LIFE']; - } - } - if (!$_lifetime) { - $_lifetime = ini_get('session.gc_maxlifetime'); - if ($_lifetime <= 1) { - // bug in PHP 4.0.3 pl 1 -- how about other versions? - //print "

        Session Error: PHP.INI setting session.gc_maxlifetimenot set: $lifetime

        "; - $_lifetime = 1440; - } - } - - return $_lifetime; - } - - /*! - */ - static function debug($debug = null) - { - static $_debug = false; - static $set = false; - - if (!is_null($debug)) { - $_debug = (bool) $debug; - - $conn = ADODB_Session::_conn(); - if ($conn) { - #$conn->debug = $_debug; - } - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESS_DEBUG'])) { - return $GLOBALS['ADODB_SESS_DEBUG']; - } - } - - return $_debug; - } - - /*! - */ - static function expireNotify($expire_notify = null) - { - static $_expire_notify; - static $set = false; - - if (!is_null($expire_notify)) { - $_expire_notify = $expire_notify; - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) { - return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY']; - } - } - - return $_expire_notify; - } - - /*! - */ - static function table($table = null) - { - static $_table = 'sessions2'; - static $set = false; - - if (!is_null($table)) { - $_table = trim($table); - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_TBL'])) { - return $GLOBALS['ADODB_SESSION_TBL']; - } - } - - return $_table; - } - - /*! - */ - static function optimize($optimize = null) - { - static $_optimize = false; - static $set = false; - - if (!is_null($optimize)) { - $_optimize = (bool) $optimize; - $set = true; - } elseif (!$set) { - // backwards compatibility - if (defined('ADODB_SESSION_OPTIMIZE')) { - return true; - } - } - - return $_optimize; - } - - /*! - */ - static function syncSeconds($sync_seconds = null) { - //echo ("

        WARNING: ADODB_SESSION::syncSeconds is longer used, please remove this function for your code

        "); - - return 0; - } - - /*! - */ - static function clob($clob = null) { - static $_clob = false; - static $set = false; - - if (!is_null($clob)) { - $_clob = strtolower(trim($clob)); - $set = true; - } elseif (!$set) { - // backwards compatibility - if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) { - return $GLOBALS['ADODB_SESSION_USE_LOBS']; - } - } - - return $_clob; - } - - /*! - */ - static function dataFieldName($data_field_name = null) { - //echo ("

        WARNING: ADODB_SESSION::dataFieldName() is longer used, please remove this function for your code

        "); - return ''; - } - - /*! - */ - static function filter($filter = null) { - static $_filter = array(); - - if (!is_null($filter)) { - if (!is_array($filter)) { - $filter = array($filter); - } - $_filter = $filter; - } - - return $_filter; - } - - /*! - */ - static function encryptionKey($encryption_key = null) { - static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!'; - - if (!is_null($encryption_key)) { - $_encryption_key = $encryption_key; - } - - return $_encryption_key; - } - - ///////////////////// - // private methods - ///////////////////// - - /*! - */ - static function _conn($conn=null) { - return isset($GLOBALS['ADODB_SESS_CONN']) ? $GLOBALS['ADODB_SESS_CONN'] : false; - } - - /*! - */ - static function _crc($crc = null) { - static $_crc = false; - - if (!is_null($crc)) { - $_crc = $crc; - } - - return $_crc; - } - - /*! - */ - static function _init() { - session_module_name('user'); - session_set_save_handler( - array('ADODB_Session', 'open'), - array('ADODB_Session', 'close'), - array('ADODB_Session', 'read'), - array('ADODB_Session', 'write'), - array('ADODB_Session', 'destroy'), - array('ADODB_Session', 'gc') - ); - } - - - /*! - */ - static function _sessionKey() { - // use this function to create the encryption key for crypted sessions - // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt - return crypt(ADODB_Session::encryptionKey(), session_id()); - } - - /*! - */ - static function _dumprs(&$rs) { - $conn = ADODB_Session::_conn(); - $debug = ADODB_Session::debug(); - - if (!$conn) { - return; - } - - if (!$debug) { - return; - } - - if (!$rs) { - echo "
        \$rs is null or false
        \n"; - return; - } - - //echo "
        \nAffected_Rows=",$conn->Affected_Rows(),"
        \n"; - - if (!is_object($rs)) { - return; - } - $rs = $conn->_rs2rs($rs); - - require_once ADODB_SESSION.'/../tohtml.inc.php'; - rs2html($rs); - $rs->MoveFirst(); - } - - ///////////////////// - // public methods - ///////////////////// - - static function config($driver, $host, $user, $password, $database=false,$options=false) - { - ADODB_Session::driver($driver); - ADODB_Session::host($host); - ADODB_Session::user($user); - ADODB_Session::password($password); - ADODB_Session::database($database); - - if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB'; - - if (isset($options['table'])) ADODB_Session::table($options['table']); - if (isset($options['lob'])) ADODB_Session::clob($options['lob']); - if (isset($options['debug'])) ADODB_Session::debug($options['debug']); - } - - /*! - Create the connection to the database. - - If $conn already exists, reuse that connection - */ - static function open($save_path, $session_name, $persist = null) - { - $conn = ADODB_Session::_conn(); - - if ($conn) { - return true; - } - - $database = ADODB_Session::database(); - $debug = ADODB_Session::debug(); - $driver = ADODB_Session::driver(); - $host = ADODB_Session::host(); - $password = ADODB_Session::password(); - $user = ADODB_Session::user(); - - if (!is_null($persist)) { - ADODB_Session::persist($persist); - } else { - $persist = ADODB_Session::persist(); - } - - # these can all be defaulted to in php.ini - # assert('$database'); - # assert('$driver'); - # assert('$host'); - - $conn = ADONewConnection($driver); - - if ($debug) { - $conn->debug = true; - ADOConnection::outp( " driver=$driver user=$user db=$database "); - } - - if ($persist) { - switch($persist) { - default: - case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break; - case 'C': $ok = $conn->Connect($host, $user, $password, $database); break; - case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break; - } - } else { - $ok = $conn->Connect($host, $user, $password, $database); - } - - if ($ok) $GLOBALS['ADODB_SESS_CONN'] = $conn; - else - ADOConnection::outp('

        Session: connection failed

        ', false); - - - return $ok; - } - - /*! - Close the connection - */ - static function close() - { - /* - $conn = ADODB_Session::_conn(); - if ($conn) $conn->Close(); - */ - return true; - } - - /* - Slurp in the session variables and return the serialized string - */ - static function read($key) - { - $conn = ADODB_Session::_conn(); - $filter = ADODB_Session::filter(); - $table = ADODB_Session::table(); - - if (!$conn) { - return ''; - } - - //assert('$table'); - - $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; - - $sql = "SELECT sessdata FROM $table WHERE sesskey = $binary ".$conn->Param(0)." AND expiry >= " . $conn->sysTimeStamp; - /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if - developer has commited elsewhere... :( - */ - #if (ADODB_Session::Lock()) - # $rs = $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata); - #else - $rs = $conn->Execute($sql, array($key)); - //ADODB_Session::_dumprs($rs); - if ($rs) { - if ($rs->EOF) { - $v = ''; - } else { - $v = reset($rs->fields); - $filter = array_reverse($filter); - foreach ($filter as $f) { - if (is_object($f)) { - $v = $f->read($v, ADODB_Session::_sessionKey()); - } - } - $v = rawurldecode($v); - } - - $rs->Close(); - - ADODB_Session::_crc(strlen($v) . crc32($v)); - return $v; - } - - return ''; - } - - /*! - Write the serialized data to a database. - - If the data has not been modified since the last read(), we do not write. - */ - static function write($key, $oval) - { - global $ADODB_SESSION_READONLY; - - if (!empty($ADODB_SESSION_READONLY)) return; - - $clob = ADODB_Session::clob(); - $conn = ADODB_Session::_conn(); - $crc = ADODB_Session::_crc(); - $debug = ADODB_Session::debug(); - $driver = ADODB_Session::driver(); - $expire_notify = ADODB_Session::expireNotify(); - $filter = ADODB_Session::filter(); - $lifetime = ADODB_Session::lifetime(); - $table = ADODB_Session::table(); - - if (!$conn) { - return false; - } - if ($debug) $conn->debug = 1; - $sysTimeStamp = $conn->sysTimeStamp; - - //assert('$table'); - - $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp); - - $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; - - // crc32 optimization since adodb 2.1 - // now we only update expiry date, thx to sebastian thom in adodb 2.32 - if ($crc !== false && $crc == (strlen($oval) . crc32($oval))) { - if ($debug) { - echo '

        Session: Only updating date - crc32 not changed

        '; - } - - $expirevar = ''; - if ($expire_notify) { - $var = reset($expire_notify); - global $$var; - if (isset($$var)) { - $expirevar = $$var; - } - } - - - $sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp"; - $rs = $conn->Execute($sql,array($expirevar,$key)); - return true; - } - $val = rawurlencode($oval); - foreach ($filter as $f) { - if (is_object($f)) { - $val = $f->write($val, ADODB_Session::_sessionKey()); - } - } - - $expireref = ''; - if ($expire_notify) { - $var = reset($expire_notify); - global $$var; - if (isset($$var)) { - $expireref = $$var; - } - } - - if (!$clob) { // no lobs, simply use replace() - $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key)); - if ($rs) $rs->Close(); - - if ($rs && reset($rs->fields) > 0) { - $sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('2'); - - } else { - $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) - VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)"; - } - - - $rs = $conn->Execute($sql,array($val,$expireref,$key)); - - } else { - // what value shall we insert/update for lob row? - switch ($driver) { - // empty_clob or empty_lob for oracle dbs - case 'oracle': - case 'oci8': - case 'oci8po': - case 'oci805': - $lob_value = sprintf('empty_%s()', strtolower($clob)); - break; - - // null for all other - default: - $lob_value = 'null'; - break; - } - - $conn->StartTrans(); - - $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key)); - if ($rs) $rs->Close(); - - if ($rs && reset($rs->fields) > 0) { - $sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1'); - - } else { - $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) - VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)"; - } - - $rs = $conn->Execute($sql,array($expireref,$key)); - - $qkey = $conn->qstr($key); - $rs2 = $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob)); - if ($debug) echo "
        ",htmlspecialchars($oval), "
        "; - $rs = @$conn->CompleteTrans(); - - - } - - if (!$rs) { - ADOConnection::outp('

        Session Replace: ' . $conn->ErrorMsg() . '

        ', false); - return false; - } else { - // bug in access driver (could be odbc?) means that info is not committed - // properly unless select statement executed in Win2000 - if ($conn->databaseType == 'access') { - $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey"; - $rs = $conn->Execute($sql); - ADODB_Session::_dumprs($rs); - if ($rs) { - $rs->Close(); - } - } - }/* - if (ADODB_Session::Lock()) { - $conn->CommitTrans(); - }*/ - return $rs ? true : false; - } - - /*! - */ - static function destroy($key) { - $conn = ADODB_Session::_conn(); - $table = ADODB_Session::table(); - $expire_notify = ADODB_Session::expireNotify(); - - if (!$conn) { - return false; - } - $debug = ADODB_Session::debug(); - if ($debug) $conn->debug = 1; - //assert('$table'); - - $qkey = $conn->quote($key); - $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; - - if ($expire_notify) { - reset($expire_notify); - $fn = next($expire_notify); - $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); - $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey"; - $rs = $conn->Execute($sql); - ADODB_Session::_dumprs($rs); - $conn->SetFetchMode($savem); - if (!$rs) { - return false; - } - if (!$rs->EOF) { - $ref = $rs->fields[0]; - $key = $rs->fields[1]; - //assert('$ref'); - //assert('$key'); - $fn($ref, $key); - } - $rs->Close(); - } - - $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey"; - $rs = $conn->Execute($sql); - if ($rs) { - $rs->Close(); - } - - return $rs ? true : false; - } - - /*! - */ - static function gc($maxlifetime) - { - $conn = ADODB_Session::_conn(); - $debug = ADODB_Session::debug(); - $expire_notify = ADODB_Session::expireNotify(); - $optimize = ADODB_Session::optimize(); - $table = ADODB_Session::table(); - - if (!$conn) { - return false; - } - - - $debug = ADODB_Session::debug(); - if ($debug) { - $conn->debug = 1; - $COMMITNUM = 2; - } else { - $COMMITNUM = 20; - } - - //assert('$table'); - - $time = $conn->OffsetDate(-$maxlifetime/24/3600,$conn->sysTimeStamp); - $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; - - if ($expire_notify) { - reset($expire_notify); - $fn = next($expire_notify); - } else { - $fn = false; - } - - $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); - $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time ORDER BY 2"; # add order by to prevent deadlock - $rs = $conn->SelectLimit($sql,1000); - ADODB_Session::_dumprs($rs); - if ($debug) $conn->SetFetchMode($savem); - if ($rs) { - $tr = $conn->hasTransactions; - if ($tr) $conn->BeginTrans(); - $keys = array(); - $ccnt = 0; - while (!$rs->EOF) { - $ref = $rs->fields[0]; - $key = $rs->fields[1]; - if ($fn) $fn($ref, $key); - $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key)); - $rs->MoveNext(); - $ccnt += 1; - if ($tr && $ccnt % $COMMITNUM == 0) { - if ($debug) echo "Commit
        \n"; - $conn->CommitTrans(); - $conn->BeginTrans(); - } - } - $rs->Close(); - - if ($tr) $conn->CommitTrans(); - } - - - // suggested by Cameron, "GaM3R" - if ($optimize) { - $driver = ADODB_Session::driver(); - - if (preg_match('/mysql/i', $driver)) { - $sql = "OPTIMIZE TABLE $table"; - } - if (preg_match('/postgres/i', $driver)) { - $sql = "VACUUM $table"; - } - if (!empty($sql)) { - $conn->Execute($sql); - } - } - - - return true; - } -} - -ADODB_Session::_init(); -if (empty($ADODB_SESSION_READONLY)) -register_shutdown_function('session_write_close'); - -// for backwards compatability only -function adodb_sess_open($save_path, $session_name, $persist = true) { - return ADODB_Session::open($save_path, $session_name, $persist); -} - -// for backwards compatability only -function adodb_sess_gc($t) -{ - return ADODB_Session::gc($t); -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/session/adodb-sessions.mysql.sql b/include/limesurvey/classes/adodb/session/adodb-sessions.mysql.sql deleted file mode 100644 index f90de449..00000000 --- a/include/limesurvey/classes/adodb/session/adodb-sessions.mysql.sql +++ /dev/null @@ -1,16 +0,0 @@ --- $CVSHeader$ - -CREATE DATABASE /*! IF NOT EXISTS */ adodb_sessions; - -USE adodb_sessions; - -DROP TABLE /*! IF EXISTS */ sessions; - -CREATE TABLE /*! IF NOT EXISTS */ sessions ( - sesskey CHAR(32) /*! BINARY */ NOT NULL DEFAULT '', - expiry INT(11) /*! UNSIGNED */ NOT NULL DEFAULT 0, - expireref VARCHAR(64) DEFAULT '', - data LONGTEXT DEFAULT '', - PRIMARY KEY (sesskey), - INDEX expiry (expiry) -); diff --git a/include/limesurvey/classes/adodb/session/adodb-sessions.oracle.clob.sql b/include/limesurvey/classes/adodb/session/adodb-sessions.oracle.clob.sql deleted file mode 100644 index c5c4f2d0..00000000 --- a/include/limesurvey/classes/adodb/session/adodb-sessions.oracle.clob.sql +++ /dev/null @@ -1,15 +0,0 @@ --- $CVSHeader$ - -DROP TABLE adodb_sessions; - -CREATE TABLE sessions ( - sesskey CHAR(32) DEFAULT '' NOT NULL, - expiry INT DEFAULT 0 NOT NULL, - expireref VARCHAR(64) DEFAULT '', - data CLOB DEFAULT '', - PRIMARY KEY (sesskey) -); - -CREATE INDEX ix_expiry ON sessions (expiry); - -QUIT; diff --git a/include/limesurvey/classes/adodb/session/adodb-sessions.oracle.sql b/include/limesurvey/classes/adodb/session/adodb-sessions.oracle.sql deleted file mode 100644 index 8fd5a342..00000000 --- a/include/limesurvey/classes/adodb/session/adodb-sessions.oracle.sql +++ /dev/null @@ -1,16 +0,0 @@ --- $CVSHeader$ - -DROP TABLE adodb_sessions; - -CREATE TABLE sessions ( - sesskey CHAR(32) DEFAULT '' NOT NULL, - expiry INT DEFAULT 0 NOT NULL, - expireref VARCHAR(64) DEFAULT '', - data VARCHAR(4000) DEFAULT '', - PRIMARY KEY (sesskey), - INDEX expiry (expiry) -); - -CREATE INDEX ix_expiry ON sessions (expiry); - -QUIT; diff --git a/include/limesurvey/classes/adodb/session/crypt.inc.php b/include/limesurvey/classes/adodb/session/crypt.inc.php deleted file mode 100644 index 218e18d4..00000000 --- a/include/limesurvey/classes/adodb/session/crypt.inc.php +++ /dev/null @@ -1,161 +0,0 @@ - -class MD5Crypt{ - function keyED($txt,$encrypt_key) - { - $encrypt_key = md5($encrypt_key); - $ctr=0; - $tmp = ""; - for ($i=0;$ikeyED($tmp,$key)); - } - - function Decrypt($txt,$key) - { - $txt = $this->keyED(base64_decode($txt),$key); - $tmp = ""; - for ($i=0;$i= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96)) - { - $randnumber = rand(48,120); - } - - $randomPassword .= chr($randnumber); - } - return $randomPassword; - } - -} - - -class SHA1Crypt{ - - function keyED($txt,$encrypt_key) - { - - $encrypt_key = sha1($encrypt_key); - $ctr=0; - $tmp = ""; - - for ($i=0;$ikeyED($tmp,$key)); - - } - - - - function Decrypt($txt,$key) - { - - $txt = $this->keyED(base64_decode($txt),$key); - - $tmp = ""; - - for ($i=0;$i= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96)) - { - $randnumber = rand(48,120); - } - - $randomPassword .= chr($randnumber); - } - - return $randomPassword; - - } - - - -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/session/session_schema.xml b/include/limesurvey/classes/adodb/session/session_schema.xml deleted file mode 100644 index 9a783023..00000000 --- a/include/limesurvey/classes/adodb/session/session_schema.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - table for ADOdb session-management - - - session key - - - - - - - - - - - - - - - - - -
        -
        diff --git a/include/limesurvey/classes/adodb/session/session_schema2.xml b/include/limesurvey/classes/adodb/session/session_schema2.xml deleted file mode 100644 index a05077ff..00000000 --- a/include/limesurvey/classes/adodb/session/session_schema2.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - table for ADOdb session-management - - - session key - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
        diff --git a/include/limesurvey/classes/adodb/toexport.inc.php b/include/limesurvey/classes/adodb/toexport.inc.php deleted file mode 100644 index b5eb912f..00000000 --- a/include/limesurvey/classes/adodb/toexport.inc.php +++ /dev/null @@ -1,134 +0,0 @@ -FieldTypesArray(); - reset($fieldTypes); - $i = 0; - while(list(,$o) = each($fieldTypes)) { - - $v = ($o) ? $o->name : 'Field'.($i++); - if ($escquote) $v = str_replace($quote,$escquotequote,$v); - $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); - $elements[] = $v; - - } - $s .= implode($sep, $elements).$NEWLINE; - } - $hasNumIndex = isset($rs->fields[0]); - - $line = 0; - $max = $rs->FieldCount(); - - while (!$rs->EOF) { - $elements = array(); - $i = 0; - - if ($hasNumIndex) { - for ($j=0; $j < $max; $j++) { - $v = $rs->fields[$j]; - if (!is_object($v)) $v = trim($v); - else $v = 'Object'; - if ($escquote) $v = str_replace($quote,$escquotequote,$v); - $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); - - if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; - else $elements[] = $v; - } - } else { // ASSOCIATIVE ARRAY - foreach($rs->fields as $v) { - if ($escquote) $v = str_replace($quote,$escquotequote,trim($v)); - $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v)))); - - if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; - else $elements[] = $v; - } - } - $s .= implode($sep, $elements).$NEWLINE; - $rs->MoveNext(); - $line += 1; - if ($fp && ($line % $BUFLINES) == 0) { - if ($fp === true) echo $s; - else fwrite($fp,$s); - $s = ''; - } - } - - if ($fp) { - if ($fp === true) echo $s; - else fwrite($fp,$s); - $s = ''; - } - - return $s; -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/tohtml.inc.php b/include/limesurvey/classes/adodb/tohtml.inc.php deleted file mode 100644 index 2b2fffe0..00000000 --- a/include/limesurvey/classes/adodb/tohtml.inc.php +++ /dev/null @@ -1,201 +0,0 @@ - - */ - -// specific code for tohtml -GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND; - -$ADODB_ROUND=4; // rounding -$gSQLMaxRows = 1000; // max no of rows to download -$gSQLBlockRows=20; // max no of rows per table block - -// RecordSet to HTML Table -//------------------------------------------------------------ -// Convert a recordset to a html table. Multiple tables are generated -// if the number of rows is > $gSQLBlockRows. This is because -// web browsers normally require the whole table to be downloaded -// before it can be rendered, so we break the output into several -// smaller faster rendering tables. -// -// $rs: the recordset -// $ztabhtml: the table tag attributes (optional) -// $zheaderarray: contains the replacement strings for the headers (optional) -// -// USAGE: -// include('adodb.inc.php'); -// $db = ADONewConnection('mysql'); -// $db->Connect('mysql','userid','password','database'); -// $rs = $db->Execute('select col1,col2,col3 from table'); -// rs2html($rs, 'BORDER=2', array('Title1', 'Title2', 'Title3')); -// $rs->Close(); -// -// RETURNS: number of rows displayed - - -function rs2html(&$rs,$ztabhtml=false,$zheaderarray=false,$htmlspecialchars=true,$echo = true) -{ - $s ='';$rows=0;$docnt = false; - GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND; - - if (!$rs) { - printf(ADODB_BAD_RS,'rs2html'); - return false; - } - - if (! $ztabhtml) $ztabhtml = "BORDER='1' WIDTH='98%'"; - //else $docnt = true; - $typearr = array(); - $ncols = $rs->FieldCount(); - $hdr = "\n\n"; - for ($i=0; $i < $ncols; $i++) { - $field = $rs->FetchField($i); - if ($field) { - if ($zheaderarray) $fname = $zheaderarray[$i]; - else $fname = htmlspecialchars($field->name); - $typearr[$i] = $rs->MetaType($field->type,$field->max_length); - //print " $field->name $field->type $typearr[$i] "; - } else { - $fname = 'Field '.($i+1); - $typearr[$i] = 'C'; - } - if (strlen($fname)==0) $fname = ' '; - $hdr .= ""; - } - $hdr .= "\n"; - if ($echo) print $hdr."\n\n"; - else $html = $hdr; - - // smart algorithm - handles ADODB_FETCH_MODE's correctly by probing... - $numoffset = isset($rs->fields[0]) ||isset($rs->fields[1]) || isset($rs->fields[2]); - while (!$rs->EOF) { - - $s .= "\n"; - - for ($i=0; $i < $ncols; $i++) { - if ($i===0) $v=($numoffset) ? $rs->fields[0] : reset($rs->fields); - else $v = ($numoffset) ? $rs->fields[$i] : next($rs->fields); - - $type = $typearr[$i]; - switch($type) { - case 'D': - if (strpos($v,':') !== false); - else { - if (empty($v)) { - $s .= "\n"; - } else { - $s .= " \n"; - } - break; - } - case 'T': - if (empty($v)) $s .= "\n"; - else $s .= " \n"; - break; - - case 'N': - if (abs(abs($v) - round($v,0)) < 0.00000001) - $v = round($v); - else - $v = round($v,$ADODB_ROUND); - case 'I': - $vv = stripslashes((trim($v))); - if (strlen($vv) == 0) $vv .= ' '; - $s .= " \n"; - - break; - /* - case 'B': - if (substr($v,8,2)=="BM" ) $v = substr($v,8); - $mtime = substr(str_replace(' ','_',microtime()),2); - $tmpname = "tmp/".uniqid($mtime).getmypid(); - $fd = @fopen($tmpname,'a'); - @ftruncate($fd,0); - @fwrite($fd,$v); - @fclose($fd); - if (!function_exists ("mime_content_type")) { - function mime_content_type ($file) { - return exec("file -bi ".escapeshellarg($file)); - } - } - $t = mime_content_type($tmpname); - $s .= (substr($t,0,5)=="image") ? " \\n" : " \\n"; - break; - */ - - default: - if ($htmlspecialchars) $v = htmlspecialchars(trim($v)); - $v = trim($v); - if (strlen($v) == 0) $v = ' '; - $s .= " \n"; - - } - } // for - $s .= "\n\n"; - - $rows += 1; - if ($rows >= $gSQLMaxRows) { - $rows = "

        Truncated at $gSQLMaxRows

        "; - break; - } // switch - - $rs->MoveNext(); - - // additional EOF check to prevent a widow header - if (!$rs->EOF && $rows % $gSQLBlockRows == 0) { - - //if (connection_aborted()) break;// not needed as PHP aborts script, unlike ASP - if ($echo) print $s . "
        $fname
          ".$rs->UserDate($v,"D d, M Y") ."   ".$rs->UserTimeStamp($v,"D d, M Y, H:i:s") ."".$vv ."$t$t". str_replace("\n",'
        ',stripslashes($v)) ."
        \n\n"; - else $html .= $s ."\n\n"; - $s = $hdr; - } - } // while - - if ($echo) print $s."\n\n"; - else $html .= $s."\n\n"; - - if ($docnt) if ($echo) print "

        ".$rows." Rows

        "; - - return ($echo) ? $rows : $html; -} - -// pass in 2 dimensional array -function arr2html(&$arr,$ztabhtml='',$zheaderarray='') -{ - if (!$ztabhtml) $ztabhtml = 'BORDER=1'; - - $s = "";//';print_r($arr); - - if ($zheaderarray) { - $s .= ''; - for ($i=0; $i\n"; - } else $s .= " \n"; - $s .= "\n\n"; - } - $s .= '
         
        '; - print $s; -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/xmlschema.dtd b/include/limesurvey/classes/adodb/xmlschema.dtd deleted file mode 100644 index 4a055da4..00000000 --- a/include/limesurvey/classes/adodb/xmlschema.dtd +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -] > \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/xmlschema03.dtd b/include/limesurvey/classes/adodb/xmlschema03.dtd deleted file mode 100644 index 97850bc7..00000000 --- a/include/limesurvey/classes/adodb/xmlschema03.dtd +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/xsl/convert-0.1-0.2.xsl b/include/limesurvey/classes/adodb/xsl/convert-0.1-0.2.xsl deleted file mode 100644 index 6cd9e5bf..00000000 --- a/include/limesurvey/classes/adodb/xsl/convert-0.1-0.2.xsl +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - -ADODB XMLSchema -http://adodb-xmlschema.sourceforge.net - - - - 0.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/xsl/convert-0.1-0.3.xsl b/include/limesurvey/classes/adodb/xsl/convert-0.1-0.3.xsl deleted file mode 100644 index 381aa4fe..00000000 --- a/include/limesurvey/classes/adodb/xsl/convert-0.1-0.3.xsl +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - -ADODB XMLSchema -http://adodb-xmlschema.sourceforge.net - - - - 0.3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/xsl/convert-0.2-0.1.xsl b/include/limesurvey/classes/adodb/xsl/convert-0.2-0.1.xsl deleted file mode 100644 index 61841b48..00000000 --- a/include/limesurvey/classes/adodb/xsl/convert-0.2-0.1.xsl +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - -ADODB XMLSchema -http://adodb-xmlschema.sourceforge.net - - - - 0.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/xsl/convert-0.2-0.3.xsl b/include/limesurvey/classes/adodb/xsl/convert-0.2-0.3.xsl deleted file mode 100644 index 26bd9e9a..00000000 --- a/include/limesurvey/classes/adodb/xsl/convert-0.2-0.3.xsl +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - - -ADODB XMLSchema -http://adodb-xmlschema.sourceforge.net - - - - 0.3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/xsl/remove-0.2.xsl b/include/limesurvey/classes/adodb/xsl/remove-0.2.xsl deleted file mode 100644 index 9b10a528..00000000 --- a/include/limesurvey/classes/adodb/xsl/remove-0.2.xsl +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -ADODB XMLSchema -http://adodb-xmlschema.sourceforge.net - - - -Uninstallation Schema - - - - 0.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/include/limesurvey/classes/adodb/xsl/remove-0.3.xsl b/include/limesurvey/classes/adodb/xsl/remove-0.3.xsl deleted file mode 100644 index 768e092b..00000000 --- a/include/limesurvey/classes/adodb/xsl/remove-0.3.xsl +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -ADODB XMLSchema -http://adodb-xmlschema.sourceforge.net - - - -Uninstallation Schema - - - - 0.3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/include/limesurvey/classes/core/ArGlyphs.class.php b/include/limesurvey/classes/core/ArGlyphs.class.php deleted file mode 100644 index 55d65dfd..00000000 --- a/include/limesurvey/classes/core/ArGlyphs.class.php +++ /dev/null @@ -1,506 +0,0 @@ -. - * - * ---------------------------------------------------------------------- - * - * Class Name: Arabic Glyphs is a simple class to render Arabic text - * - * Filename: ArGlyphs.class.php - * - * Original Author(s): Khaled Al-Sham'aa - * - * Purpose: This class takes Arabic text (encoded in Windows-1256 character - * set) as input and performs Arabic glyph joining on it and outputs - * a UTF-8 hexadecimals stream that is no longer logically arranged - * but in a visual order which gives readable results when formatted - * with a simple Unicode rendering just like GD and UFPDF libraries - * that does not handle basic connecting glyphs of Arabic language - * yet but simply outputs all stand alone glyphs in left-to-right - * order. - * - * ---------------------------------------------------------------------- - * - * Arabic Glyphs is class to render Arabic text - * - * PHP class to render Arabic text by performs Arabic glyph joining on it, - * then output a UTF-8 hexadecimals stream gives readable results on PHP - * libraries supports UTF-8. - * - * Example: - * - * include('./Arabic.php'); - * $Arabic = new Arabic('ArGlyphs'); - * - * $text = $Arabic->utf8Glyphs($text); - * - * imagettftext($im, 20, 0, 200, 100, $black, $font, $text); - * - * - * @category Text - * @package Arabic - * @author Khaled Al-Shamaa - * @copyright 2009 Khaled Al-Shamaa - * - * @license LGPL - * @link http://www.ar-php.org - */ - -// New in PHP V5.3: Namespaces -// namespace Arabic/ArGlyphs; - -/** - * This PHP class render Arabic text by performs Arabic glyph joining on it - * - * @category Text - * @package Arabic - * @author Khaled Al-Shamaa - * @copyright 2009 Khaled Al-Shamaa - * - * @license LGPL - * @link http://www.ar-php.org - */ -class ArGlyphs -{ - protected $_glyphs = null; - protected $_hex = null; - protected $_prevLink; - protected $_nextLink; - - /** - * Loads initialize values - */ - public function __construct() - { - $this->_prevLink = '���������������������������'; - $this->_nextLink = '������������������������������������'; - $this->vowel = '��������'; - - /* - $this->_glyphs['�'] = array('FE70','FE71'); - $this->_glyphs['�'] = array('FE72','FE72'); - $this->_glyphs['�'] = array('FE74','FE74'); - $this->_glyphs['�'] = array('FE76','FE77'); - $this->_glyphs['�'] = array('FE78','FE79'); - $this->_glyphs['�'] = array('FE7A','FE7B'); - $this->_glyphs['�'] = array('FE7C','FE7D'); - $this->_glyphs['�'] = array('FE7E','FE7E'); - */ - $this->_glyphs = '��������'; - $this->_hex = '064B064B064B064B064C064C064C064C064D064D064D064D064E064E064E064E064F064F064F064F065006500650065006510651065106510652065206520652'; - - $this->_glyphs .= '��������'; - $this->_hex .= 'FE80FE80FE80FE80FE81FE82FE81FE82FE83FE84FE83FE84FE85FE86FE85FE86FE87FE88FE87FE88FE89FE8AFE8BFE8CFE8DFE8EFE8DFE8EFE8FFE90FE91FE92'; - - $this->_glyphs .= '��������'; - $this->_hex .= 'FE93FE94FE93FE94FE95FE96FE97FE98FE99FE9AFE9BFE9CFE9DFE9EFE9FFEA0FEA1FEA2FEA3FEA4FEA5FEA6FEA7FEA8FEA9FEAAFEA9FEAAFEABFEACFEABFEAC'; - - $this->_glyphs .= '��������'; - $this->_hex .= 'FEADFEAEFEADFEAEFEAFFEB0FEAFFEB0FEB1FEB2FEB3FEB4FEB5FEB6FEB7FEB8FEB9FEBAFEBBFEBCFEBDFEBEFEBFFEC0FEC1FEC2FEC3FEC4FEC5FEC6FEC7FEC8'; - - $this->_glyphs .= '��������'; - $this->_hex .= 'FEC9FECAFECBFECCFECDFECEFECFFED0FED1FED2FED3FED4FED5FED6FED7FED8FED9FEDAFEDBFEDCFEDDFEDEFEDFFEE0FEE1FEE2FEE3FEE4FEE5FEE6FEE7FEE8'; - - $this->_glyphs .= '����ܡ��'; - $this->_hex .= 'FEE9FEEAFEEBFEECFEEDFEEEFEEDFEEEFEEFFEF0FEEFFEF0FEF1FEF2FEF3FEF40640064006400640060C060C060C060C061F061F061F061F061B061B061B061B'; - - $this->_glyphs .= '��������'; - $this->_hex .= 'FEF5FEF6FEF5FEF6FEF7FEF8FEF7FEF8FEF9FEFAFEF9FEFAFEFBFEFCFEFBFEFC'; - } - - /** - * Get glyphs - * - * @param string $char Char - * @param integer $type Type - * - * @return string - */ - protected function _getGlyphs($char, $type) - { - $pos = strpos($this->_glyphs, $char); - - if ($pos > 48) { - $pos = ($pos-48)/2 + 48; - } - - $pos = $pos*16 + $type*4; - - return substr($this->_hex, $pos, 4); - } - - /** - * Convert Arabic Windows-1256 charset string into glyph joining in UTF-8 - * hexadecimals stream - * - * @param string $str Arabic string in Windows-1256 charset - * - * @return string Arabic glyph joining in UTF-8 hexadecimals stream - * @author Khaled Al-Shamaa - */ - protected function _preConvert($str) - { - $crntChar = null; - $prevChar = null; - $nextChar = null; - $output = ''; - - $chars = preg_split('//', $str); - $max = count($chars); - - for ($i = $max - 1; $i >= 0; $i--) { - $crntChar = $chars[$i]; - if ($i > 0) { - $prevChar = $chars[$i - 1]; - } else { - $prevChar = null; - } - - if ($prevChar && strpos($this->vowel, $prevChar) !== false) { - $prevChar = $chars[$i - 2]; - if ($prevChar && strpos($this->vowel, $prevChar) !== false) { - $prevChar = $chars[$i - 3]; - } - } - - $Reversed = false; - $flip_arr = ')]>}'; - $ReversedChr = '([<{'; - - if ($crntChar && strpos($flip_arr, $crntChar) !== false) { - $crntChar = substr($ReversedChr, strpos($flip_arr, $crntChar), 1); - $Reversed = true; - } else { - $Reversed = false; - } - - if ($crntChar && (strpos($ReversedChr, $crntChar) !== false) && !$Reversed) { - $crntChar = substr($flip_arr, strpos($ReversedChr, $crntChar), 1); - } - - if ($crntChar && strpos($this->vowel, $crntChar) !== false) { - if ((strpos($this->_nextLink, $chars[$i + 1]) !== false) && (strpos($this->_prevLink, $prevChar) !== false)) { - $output .= '&#x' . $this->_getGlyphs($crntChar, 1) . ';'; - } else { - $output .= '&#x' . $this->_getGlyphs($crntChar, 0) . ';'; - } - continue; - } - - if (isset($chars[$i + 1]) && in_array($chars[$i + 1], array('�', '�', '�', '�')) && $crntChar == '�') { - continue; - } - - if (ord($crntChar) < 128) { - $output .= $crntChar; - $nextChar = $crntChar; - continue; - } - - $form = 0; - - if (in_array($crntChar, array('�', '�', '�', '�')) && $prevChar == '�') { - if (strpos($this->_prevLink, $chars[$i - 2]) !== false) { - $form++; - } - - $output .= '&#x' . $this->_getGlyphs($prevChar . $crntChar, $form) . ';'; - $nextChar = $prevChar; - continue; - } - - if ($prevChar && strpos($this->_prevLink, $prevChar) !== false) { - $form++; - } - if ($nextChar && strpos($this->_nextLink, $nextChar) !== false) { - $form += 2; - } - - $output .= '&#x' . $this->_getGlyphs($crntChar, $form) . ';'; - $nextChar = $crntChar; - } - - $output = $this->_decodeEntities($output, $exclude = array('&')); - return $output; - } - - /** - * Regression analysis calculate roughly the max number of character fit in - * one A4 page line for a given font size. - * - * @param integer $font Font size - * - * @return integer Maximum number of characters per line - * @author Khaled Al-Shamaa - */ - public function a4_max_chars($font) - { - $x = 381.6 - 31.57 * $font + 1.182 * pow($font, 2) - 0.02052 * pow($font, 3) + 0.0001342 * pow($font, 4); - return floor($x - 2); - } - - /** - * Calculate the lines number of given Arabic text and font size that will - * fit in A4 page size - * - * @param string $str Arabic string you would like to split it into lines - * @param integer $font Font size - * @param string $inputCharset (optional) Input charset [utf-8|windows-1256|iso-8859-6] - * default value is NULL (use set input charset) - * @param object $main Main Ar-PHP object to access charset converter options - * - * @return integer Number of lines for a given Arabic string in A4 page size - * @author Khaled Al-Shamaa - */ - public function a4_lines($str, $font, $inputCharset = null, $main = null) - { - if ($main) { - if ($inputCharset == null) $inputCharset = $main->getInputCharset(); - $str = $main->coreConvert($str, $inputCharset, 'windows-1256'); - } - - $str = str_replace(array("\r\n", "\n", "\r"), "\n", $str); - - $lines = 0; - $chars = 0; - $words = explode(' ', $str); - $w_count = count($words); - $max_chars = $this->a4_max_chars($font); - - for ($i = 0; $i < $w_count; $i++) { - $w_len = strlen($words[$i]) + 1; - - if ($chars + $w_len < $max_chars) { - if (preg_match("/\n/i", $words[$i])) { - $words_nl = split("\n", $words[$i]); - - $nl_num = count($words_nl) - 1; - for ($j = 1; $j < $nl_num; $j++) { - $lines++; - } - - $chars = strlen($words_nl[$nl_num]) + 1; - } else { - $chars += $w_len; - } - } else { - $lines++; - $chars = $w_len; - } - } - $lines++; - - return $lines; - } - - /** - * Convert Arabic Windows-1256 charset string into glyph joining in UTF-8 - * hexadecimals stream (take care of whole the document including English - * sections as well as numbers and arcs etc...) - * - * @param string $str Arabic string in Windows-1256 charset - * @param integer $max_chars Max number of chars you can fit in one line - * @param boolean $hindo If true use Hindo digits else use Arabic digits - * @param string $inputCharset (optional) Input charset [utf-8|windows-1256|iso-8859-6] - * default value is NULL (use set input charset) - * @param object $main Main Ar-PHP object to access charset converter options - * - * @return string Arabic glyph joining in UTF-8 hexadecimals stream (take - * care of whole document including English sections as well - * as numbers and arcs etc...) - * @author Khaled Al-Shamaa - */ - public function utf8Glyphs($str, $max_chars = 50, $hindo = true, $inputCharset = null, $main = null) - { - if ($main) { - if ($inputCharset == null) $inputCharset = $main->getInputCharset(); - $str = $main->coreConvert($str, $inputCharset, 'windows-1256'); - } - - $str = str_replace(array("\r\n", "\n", "\r"), "\n", $str); - - $lines = array(); - $words = explode(' ', $str); - $w_count = count($words); - $c_chars = 0; - $c_words = array(); - - $english = array(); - $en_index = -1; - - for ($i = 0; $i < $w_count; $i++) { - if (preg_match("/^[a-z\d\\/\@\#\$\%\^\&\*\(\)\_\~\"\'\[\]\{\}\;\,\|]*([\.\:\+\=\-\!��]?)$/i", $words[$i], $matches)) { - if ($matches[1]) $words[$i] = $matches[1].substr($words[$i], 0, -1); - $words[$i] = strrev($words[$i]); - array_push($english, $words[$i]); - if ($en_index == -1) { - $en_index = $i; - } - } elseif ($en_index != -1) { - $en_count = count($english); - - for ($j = 0; $j < $en_count; $j++) { - $words[$en_index + $j] = $english[$en_count - 1 - $j]; - } - - $en_index = -1; - $english = array(); - } - - $en_count = count($english); - - for ($j = 0; $j < $en_count; $j++) { - $words[$en_index + $j] = $english[$en_count - 1 - $j]; - } - } - - for ($i = 0; $i < $w_count; $i++) { - $w_len = strlen($words[$i]) + 1; - - - if ($c_chars + $w_len < $max_chars) { - if (preg_match("/\n/i", $words[$i])) { - $words_nl = explode("\n", $words[$i]); - - array_push($c_words, $words_nl[0]); - array_push($lines, implode(' ', $c_words)); - - $nl_num = count($words_nl) - 1; - for ($j = 1; $j < $nl_num; $j++) { - array_push($lines, $words_nl[$j]); - } - - $c_words = array($words_nl[$nl_num]); - $c_chars = strlen($words_nl[$nl_num]) + 1; - } else { - array_push($c_words, $words[$i]); - $c_chars += $w_len; - } - } else { - array_push($lines, implode(' ', $c_words)); - $c_words = array($words[$i]); - $c_chars = $w_len; - } - } - array_push($lines, implode(' ', $c_words)); - - $max_line = count($lines); - $output = ''; - for ($j = $max_line - 1; $j >= 0; $j--) { - $output .= $lines[$j] . "\n"; - } - - $output = rtrim($output); - - $output = $this->_preConvert($output); - if ($hindo) { - $Nums = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); - $arNums = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); - $output = str_replace($Nums, $arNums, $output); - } - - return $output; - } - - /** - * Decode all HTML entities (including numerical ones) to regular UTF-8 bytes. - * Double-escaped entities will only be decoded once ("&lt;" becomes "<", not "<"). - * - * @param string $text The text to decode entities in. - * @param array $exclude An array of characters which should not be decoded. - * For example, array('<', '&', '"'). This affects - * both named and numerical entities. - * - * @return string - */ - protected function _decodeEntities($text, $exclude = array()) - { - static $table; - - // We store named entities in a table for quick processing. - if (!isset($table)) { - // Get all named HTML entities. - $table = array_flip(get_html_translation_table(HTML_ENTITIES)); - - // PHP gives us ISO-8859-1 data, we need UTF-8. - $table = array_map('utf8_encode', $table); - - // Add apostrophe (XML) - $table['''] = "'"; - } - $newtable = array_diff($table, $exclude); - - // Use a regexp to select all entities in one pass, to avoid decoding - // double-escaped entities twice. - return preg_replace('/&(#x?)?([A-Za-z0-9]+);/e', '$this - ->_decodeEntities2("$1", "$2", "$0", $newtable, $exclude)', $text); - } - - /** - * Helper function for _decodeEntities - * - * @param string $prefix Prefix - * @param string $codepoint Codepoint - * @param string $original Original - * @param array &$table Store named entities in a table - * @param array &$exclude An array of characters which should not be decoded - * - * @return string - */ - protected function _decodeEntities2($prefix, $codepoint, $original, &$table, &$exclude) - { - // Named entity - if (!$prefix) { - if (isset($table[$original])) { - return $table[$original]; - } else { - return $original; - } - } - - // Hexadecimal numerical entity - if ($prefix == '#x') { - $codepoint = base_convert($codepoint, 16, 10); - } - - // Encode codepoint as UTF-8 bytes - if ($codepoint < 0x80) { - $str = chr($codepoint); - } elseif ($codepoint < 0x800) { - $str = chr(0xC0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3F)); - } elseif ($codepoint < 0x10000) { - $str = chr(0xE0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3F)) . chr(0x80 | ($codepoint & 0x3F)); - } elseif ($codepoint < 0x200000) { - $str = chr(0xF0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3F)) . chr(0x80 | (($codepoint >> 6) & 0x3F)) . chr(0x80 | ($codepoint & 0x3F)); - } - - // Check for excluded characters - if (in_array($str, $exclude)) { - return $original; - } else { - return $str; - } - } -} -?> diff --git a/include/limesurvey/classes/core/arabic.php b/include/limesurvey/classes/core/arabic.php deleted file mode 100644 index 7a63e5c7..00000000 --- a/include/limesurvey/classes/core/arabic.php +++ /dev/null @@ -1,340 +0,0 @@ -. - * - * ---------------------------------------------------------------------- - * - * Class Name: PHP and Arabic Language - * - * Filename: Arabic.php - * - * Original Author(s): Khaled Al-Sham'aa - * - * Purpose: Set of PHP classes developed to enhance Arabic web - * applications by providing set of tools includes stem-based searching, - * translitiration, soundex, Hijri calendar, charset detection and - * converter, spell numbers, keyboard language, Muslim prayer time, - * auto-summarization, and more... - * - * ---------------------------------------------------------------------- - * - * @desc Set of PHP classes developed to enhance Arabic web - * applications by providing set of tools includes stem-based searching, - * translitiration, soundex, Hijri calendar, charset detection and - * converter, spell numbers, keyboard language, Muslim prayer time, - * auto-summarization, and more... - * @category Text - * @package Arabic - * @author Khaled Al-Shamaa - * @copyright 2009 Khaled Al-Shamaa - * - * @license LGPL - * @version 2.5.2 released in Sep 16, 2009 - * @link http://www.ar-php.org - */ - -// New in PHP V5.3: Namespaces -// namespace Arabic; - -//error_reporting(E_STRICT); -$use_exception = false; -$use_autoload = false; - -/** - * Error handler function - * - * @param int $errno The level of the error raised - * @param string $errstr The error message - * @param string $errfile The filename that the error was raised in - * @param int $errline The line number the error was raised at - * - * @return boolean FALSE - */ -function myErrorHandler($errno, $errstr, $errfile, $errline) -{ - if ($errfile == __FILE__ || file_exists(dirname(__FILE__).'/'.basename($errfile))) { - $msg = 'Arabic Class Exception: '; - $msg .= $errstr; - $msg .= " in $errfile"; - $msg .= " on line $errline
        "; - - throw new ArabicException($msg, $errno); - } - - // If the function returns false then the normal error handler continues - return false; -} - -if ($use_exception) { - set_error_handler('myErrorHandler'); -} - -/** - * Core PHP and Arabic language class - * - * @category Text - * @package Arabic - * @author Khaled Al-Shamaa - * @copyright 2009 Khaled Al-Shamaa - * - * @license LGPL - * @link http://www.ar-php.org - */ -class Arabic -{ - protected $_inputCharset = 'utf-8'; - protected $_outputCharset = 'utf-8'; - protected $_path; - - public $myObject; - public $myClass; - - /** - * Load selected library/sub class you would like to use its functionality - * - * @param string $library [ArAutoSummarize|ArCharsetC|ArCharsetD|ArDate| - * ArGender|ArGlyphs|ArIdentifier|ArKeySwap|ArMktime|ArNumbers| - * ArQuery|ArSoundex|ArStrToTime|ArTransliteration|ArWordTag| - * EnTransliteration|Salat|ArCompressStr|ArStandard|ArStemmer] - * - * @desc Load selected library/sub class you would like to use its functionality - * @author Khaled Al-Shamaa - */ - public function __construct($library) - { - if($library) $this->load($library); - } - - public function load($library) - { - global $use_autoload; - - $this->myClass = $library; - - if (!$use_autoload) { - $this->_path = strtr(__FILE__, '\\', '/'); - $this->_path = substr($this->_path, 0, strrpos($this->_path, '/')); - - include_once $this->_path.'/'.$this->myClass.'.class.php'; - } - - $this->myObject = new $library(); - $this->{$library} = &$this->myObject; - } - - /** - * The magic method __call() allows to capture invocation of non existing methods. - * That way __call() can be used to implement user defined method handling that - * depends on the name of the actual method being called. - * - * @param string $methodName Method name - * @param array $arguments Array of arguments - * - * @return The value returned from the __call() method will be returned to - * the caller of the method. - * @author Khaled Al-Shamaa - */ - public function __call($methodName, $arguments) - { - // Create an instance of the ReflectionMethod class - $method = new ReflectionMethod($this->myClass, $methodName); - - $params = array(); - $parameters = $method->getParameters(); - - foreach ($parameters as $parameter) { - $name = $parameter->getName(); - $value = array_shift($arguments); - if (is_null($value) && $parameter->isDefaultValueAvailable()) $value = $parameter->getDefaultValue(); - if ($name == 'main') $value = $this; - $params[$name] = $value; - } - - return call_user_func_array(array(&$this->myObject, $methodName), $params); - } - - /** - * Garbage collection, release child objects directly - * - * @author Khaled Al-Shamaa - */ - public function __destruct() - { - $this->_inputCharset = null; - $this->_outputCharset = null; - $this->_path = null; - $this->myObject = null; - $this->myClass = null; - } - - /** - * Set charset used in class input Arabic strings - * - * @param string $charset Input charset [utf-8|windows-1256|iso-8859-6] - * - * @return TRUE if success, or FALSE if fail - * @author Khaled Al-Shamaa - */ - public function setInputCharset($charset) - { - $flag = true; - - $charset = strtolower($charset); - - if (in_array($charset, array('utf-8', 'windows-1256', 'iso-8859-6'))) { - $this->_inputCharset = $charset; - } else { - $flag = false; - } - - return $flag; - } - - /** - * Set charset used in class output Arabic strings - * - * @param string $charset Output charset [utf-8|windows-1256|iso-8859-6] - * - * @return boolean TRUE if success, or FALSE if fail - * @author Khaled Al-Shamaa - */ - public function setOutputCharset($charset) - { - $flag = true; - - $charset = strtolower($charset); - - if (in_array($charset, array('utf-8', 'windows-1256', 'iso-8859-6'))) { - $this->_outputCharset = $charset; - } else { - $flag = false; - } - - return $flag; - } - - /** - * Get the charset used in the input Arabic strings - * - * @return string return current setting for class input Arabic charset - * @author Khaled Al-Shamaa - */ - public function getInputCharset() - { - return $this->_inputCharset; - } - - /** - * Get the charset used in the output Arabic strings - * - * @return string return current setting for class output Arabic charset - * @author Khaled Al-Shamaa - */ - public function getOutputCharset() - { - return $this->_outputCharset; - } - - /** - * Convert Arabic string from one charset to another - * - * @param string $str Original Arabic string that you wouldliketo convert - * @param string $inputCharset Input charset - * @param string $outputCharset Output charset - * - * @return string Converted Arabic string in defined charset - * @author Khaled Al-Shamaa - */ - public function coreConvert($str, $inputCharset, $outputCharset) - { - if ($inputCharset != $outputCharset) { - if ($inputCharset == 'windows-1256') $inputCharset = 'cp1256'; - if ($outputCharset == 'windows-1256') $outputCharset = 'cp1256'; - $conv_str = iconv($inputCharset, "$outputCharset//TRANSLIT", $str); - - if($conv_str == '' && $str != '') { - include_once($this->_path.'/ArCharsetC.class.php'); - $c = ArCharsetC::singleton(); - - if ($inputCharset == 'cp1256') { - $conv_str = $c->win2utf($str); - } else { - $conv_str = $c->utf2win($str); - } - } - } else { - $conv_str = $str; - } - - return $conv_str; - } - - /** - * Convert Arabic string from one format to another - * - * @param string $str Arabic string in the format set by setInputCharset - * @param string $inputCharset (optional) Input charset [utf-8|windows-1256|iso-8859-6] - * default value is NULL (use set input charset) - * @param string $outputCharset (optional) Output charset [utf-8|windows-1256|iso-8859-6] - * default value is NULL (use set output charset) - * - * @return string Arabic string in the format set by method setOutputCharset - * @author Khaled Al-Shamaa - */ - public function convert($str, $inputCharset = null, $outputCharset = null) - { - if ($inputCharset == null) $inputCharset = $this->_inputCharset; - if ($outputCharset == null) $outputCharset = $this->_outputCharset; - - $str = $this->coreConvert($str, $inputCharset, $outputCharset); - - return $str; - } -} - -/** - * Arabic Exception class defined by extending the built-in Exception class. - * - * @category Text - * @package Arabic - * @author Khaled Al-Shamaa - * @copyright 2009 Khaled Al-Shamaa - * - * @license LGPL - * @link http://www.ar-php.org - */ -class ArabicException extends Exception -{ - /** - * Make sure everything is assigned properly - * - * @param string $message Exception message - * @param int $code User defined exception code - */ - public function __construct($message, $code=0) - { - parent::__construct($message, $code); - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/core/language.php b/include/limesurvey/classes/core/language.php deleted file mode 100644 index 3078eab9..00000000 --- a/include/limesurvey/classes/core/language.php +++ /dev/null @@ -1,159 +0,0 @@ -getTranslation("Hello World!"); - */ - -if (!isset($rootdir) || isset($_REQUEST['rootdir'])) {die("Cannot run this script directly");} - -require_once($rootdir.'/classes/php-gettext/gettext.php'); -require_once($rootdir.'/classes/php-gettext/streams.php'); - -class limesurvey_lang { - - var $gettextclass; - var $langcode; - - function limesurvey_lang($langcode){ - global $rootdir; - $langcode=sanitize_languagecode($langcode); - $streamer = new FileReader($rootdir.'/locale/'.$langcode.'/LC_MESSAGES/'.$langcode.'.mo'); - $this->gettextclass = new gettext_reader($streamer); - $this->langcode = $langcode; - } - - function getlangcode() - { - return $this->langcode; - } - - function gTview($string, $escapemode = 'html') - { - global $addTitleToLinks; - if ( $addTitleToLinks === true) - { - return $this->gT($string, $escapemode = 'html'); - } - else - { - return ''; - } - } - - - /** - * This function translates plural strings to their according language - * - * @param $single $string The single form of the string to translate - * @param $plural $string The plural form to translate - * @param $number $integer Depending on the number of items the right plural form is taken - * @param mixed $escapemode Different uses require the string to be escaped accordinlgy. Possible values are 'html'(default),'js' and 'unescaped' - * @return string Translated string - */ - function ngT($single, $plural, $number, $escapemode = 'html') - { - if ($this->gettextclass) - { - $basestring=str_replace('‘','\'',$this->gettextclass->ngettext($single, $plural, $number)); - switch ($escapemode) - { - case 'html': - return html_escape($basestring); - break; - case 'js': - return javascript_escape($basestring); - break; - case 'unescaped': - return $basestring; - break; - default: - return "Unsupported EscapeMode in gT method"; - break; - } - } else { - switch ($escapemode) - { - case 'html': - return html_escape($string); - break; - case 'js': - return javascript_escape($string); - break; - case 'unescaped': - return $string; - break; - default: - return "Unsupported EscapeMode in gT method"; - break; - } - } - } - - - - /** - * This function translates strings to their according language - * - * @param string $string The string to translate - * @param mixed $escapemode Different uses require the string to be escaped accordinlgy. Possible values are 'html'(default),'js' and 'unescaped' - * @return string Translated string - */ - function gT($string, $escapemode = 'html') - { - if ($this->gettextclass) - { - $basestring=str_replace('‘','\'',$this->gettextclass->translate($string)); - switch ($escapemode) - { - case 'html': - return html_escape($basestring); - break; - case 'js': - return javascript_escape($basestring); - break; - case 'unescaped': - return $basestring; - break; - default: - return "Unsupported EscapeMode in gT method"; - break; - } - } else { - switch ($escapemode) - { - case 'html': - return html_escape($string); - break; - case 'js': - return javascript_escape($string); - break; - case 'unescaped': - return $string; - break; - default: - return "Unsupported EscapeMode in gT method"; - break; - } - } - } - -} - -?> diff --git a/include/limesurvey/classes/core/sanitize.php b/include/limesurvey/classes/core/sanitize.php deleted file mode 100644 index 40be7f88..00000000 --- a/include/limesurvey/classes/core/sanitize.php +++ /dev/null @@ -1,377 +0,0 @@ -", "/", "?"); - $lastdot=strrpos($string, "."); - $clean = trim(str_replace($strip, "_", strip_tags($string))); - $clean = preg_replace('/\s+/', "-", $clean); - $clean = ($alphanumeric) ? preg_replace("/[^a-zA-Z0-9]/", "", $clean) : $clean ; - if ($lastdot !== false) { - $clean= substr_replace ( $clean , '.' , $lastdot , 1 ); - } - return ($force_lowercase) ? - (function_exists('mb_strtolower')) ? - mb_strtolower($clean, 'UTF-8') : - strtolower($clean) : - $clean; -} - - -// paranoid sanitization -- only let the alphanumeric set through -function sanitize_paranoid_string($string, $min='', $max='') -{ - if (isset($string)) - { - $string = preg_replace("/[^_.a-zA-Z0-9]/", "", $string); - $len = strlen($string); - if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) - return FALSE; - return $string; - } -} - -function sanitize_cquestions($string, $min='', $max='') -{ - if (isset($string)) - { - $string = preg_replace("/[^_.a-zA-Z0-9+#]/", "", $string); - $len = strlen($string); - if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) - return FALSE; - return $string; - } -} - -function sanitize_email($email) { - // Handles now emails separated with a semikolon - $emailarray=explode(';',$email); - for ($i = 0; $i <= count($emailarray)-1; $i++) - { - $emailarray[$i]=preg_replace("/[^`'a-zA-Z0-9;+_=|.$%&#!{*~?}^@-]/i", "", $emailarray[$i]); - } - return implode(';',$emailarray); -} - -// sanitize a string in prep for passing a single argument to system() (or similar) -function sanitize_system_string($string, $min='', $max='') -{ - if (isset($string)) - { - $pattern = '/(;|\||`|>|<|&|^|"|'."\n|\r|'".'|{|}|[|]|\)|\()/i'; // no piping, passing possible environment variables ($), - // seperate commands, nested execution, file redirection, - // background processing, special commands (backspace, etc.), quotes - // newlines, or some other special characters - $string = preg_replace($pattern, '', $string); - $string = '"'.preg_replace('/\$/', '\\\$', $string).'"'; //make sure this is only interpretted as ONE argument - $len = strlen($string); - if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return FALSE; - return $string; - } -} - -function sanitize_xss_string($string) -{ - if (isset($string)) - { - $bad = array ('*','^','&','\'','-',';','\"','(',')','%','$','?'); - return str_replace($bad, '',$string); - } -} - - - -// sanitize a string for SQL input (simple slash out quotes and slashes) -function sanitize_sql_db_tablename($string) -{ - $bad = array ('*','^','&','\'','-',';','\"','(',')','%','$','?'); - return str_replace($bad, "",$string); -} - -// sanitize a string for SQL input (simple slash out quotes and slashes) -function sanitize_ldap_string($string, $min='', $max='') -{ - $pattern = '/(\)|\(|\||&)/'; - $len = strlen($string); - if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) - return FALSE; - return preg_replace($pattern, '', $string); -} - - -// sanitize a string for HTML (make sure nothing gets interpretted!) -function sanitize_html_string($string) -{ - $pattern[0] = '/\&/'; - $pattern[1] = '//"; - $pattern[3] = '/\n/'; - $pattern[4] = '/"/'; - $pattern[5] = "/'/"; - $pattern[6] = "/%/"; - $pattern[7] = '/\(/'; - $pattern[8] = '/\)/'; - $pattern[9] = '/\+/'; - $pattern[10] = '/-/'; - $replacement[0] = '&'; - $replacement[1] = '<'; - $replacement[2] = '>'; - $replacement[3] = '
        '; - $replacement[4] = '"'; - $replacement[5] = '''; - $replacement[6] = '%'; - $replacement[7] = '('; - $replacement[8] = ')'; - $replacement[9] = '+'; - $replacement[10] = '-'; - return preg_replace($pattern, $replacement, $string); -} - -// make int int! -function sanitize_int($integer, $min='', $max='') -{ - $int = preg_replace("#[^0-9]#", "", $integer); - if((($min != '') && ($int < $min)) || (($max != '') && ($int > $max))) - { - return FALSE; - } - if ($int=='') - { - return null; - } - return $int; -} - -// sanitize a username -// TODO: define the exact format of the username -// allow for instance 0-9a-zA-Z@_-. -function sanitize_user($string) -{ - $username_length=64; - $string=mb_substr($string,0,$username_length); - return $string; -} - -// sanitize a username -// TODO: define the exact format of the username -// allow for instance 0-9a-zA-Z@_-. -function sanitize_userfullname($string) -{ - $username_length=50; - $string=mb_substr($string,0,$username_length); - return $string; -} - -function sanitize_labelname($string) -{ - $labelname_length=100; - $string=mb_substr($string,0,$labelname_length); - return $string; -} - -// make float float! -function sanitize_float($float, $min='', $max='') -{ - $float = str_replace(',','.',$float); - $float = floatval($float); - if((($min != '') && ($float < $min)) || (($max != '') && ($float > $max))) - return FALSE; - return $float; -} - -// glue together all the other functions -function sanitize($input, $flags, $min='', $max='') -{ - if($flags & PARANOID) $input = sanitize_paranoid_string($input, $min, $max); - if($flags & INT) $input = sanitize_int($input, $min, $max); - if($flags & FLOAT) $input = sanitize_float($input, $min, $max); - if($flags & HTML) $input = sanitize_html_string($input, $min, $max); - if($flags & LDAP) $input = sanitize_ldap_string($input, $min, $max); - if($flags & SYSTEM) $input = sanitize_system_string($input, $min, $max); - return $input; -} - -function check_paranoid_string($input, $min='', $max='') -{ - if($input != sanitize_paranoid_string($input, $min, $max)) - return FALSE; - return TRUE; -} - -function check_int($input, $min='', $max='') -{ - if($input != sanitize_int($input, $min, $max)) - return FALSE; - return TRUE; -} - -function check_float($input, $min='', $max='') -{ - if($input != sanitize_float($input, $min, $max)) - return FALSE; - return TRUE; -} - -function check_html_string($input, $min='', $max='') -{ - if($input != sanitize_html_string($input, $min, $max)) - return FALSE; - return TRUE; -} - - -function check_ldap_string($input, $min='', $max='') -{ - if($input != sanitize_string($input, $min, $max)) - return FALSE; - return TRUE; -} - -function check_system_string($input, $min='', $max='') -{ - if($input != sanitize_system_string($input, $min, $max, TRUE)) - return FALSE; - return TRUE; -} - -// glue together all the other functions -function check($input, $flags, $min='', $max='') -{ - $oldput = $input; - if($flags & UTF8) $input = my_utf8_decode($input); - if($flags & PARANOID) $input = sanitize_paranoid_string($input, $min, $max); - if($flags & INT) $input = sanitize_int($input, $min, $max); - if($flags & FLOAT) $input = sanitize_float($input, $min, $max); - if($flags & HTML) $input = sanitize_html_string($input, $min, $max); - if($flags & LDAP) $input = sanitize_ldap_string($input, $min, $max); - if($flags & SYSTEM) $input = sanitize_system_string($input, $min, $max, TRUE); - if($input != $oldput) - return FALSE; - return TRUE; -} - -function sanitize_languagecode($codetosanitize) { - return preg_replace('/[^a-z0-9-]/i', '', $codetosanitize); -} - -function sanitize_languagecodeS($codestringtosanitize) { - $codearray=explode(" ",trim($codestringtosanitize)); - $codearray=array_map("sanitize_languagecode",$codearray); - return implode(" ",$codearray); -} - -function sanitize_token($codetosanitize) { - return preg_replace('/[^_a-z0-9]/i', '', $codetosanitize); -} - -function sanitize_signedint($integer, $min='', $max='') -{ - $int = (int) $integer; - - if((($min != '') && ($int < $min)) || (($max != '') && ($int > $max))) - { - return FALSE; // Oops! Outside limits. - } - - return $int; -}; diff --git a/include/limesurvey/classes/core/startup.php b/include/limesurvey/classes/core/startup.php deleted file mode 100644 index f34e924b..00000000 --- a/include/limesurvey/classes/core/startup.php +++ /dev/null @@ -1,97 +0,0 @@ - true, - '_GET' => true, - '_POST' => true, - '_COOKIE' => true, - '_REQUEST' => true, - '_SERVER' => true, - '_SESSION' => true, - '_ENV' => true, - '_FILES' => true - ); - - // Not only will array_merge and array_keys give a warning if - // a parameter is not an array, array_merge will actually fail. - // So we check if _SESSION has been initialised. - if (!isset($_SESSION) || !is_array($_SESSION)) - { - $_SESSION = array(); - } - - // Merge all into one extremely huge array; unset this later - $input = array_merge( - array_keys($_GET), - array_keys($_POST), - array_keys($_COOKIE), - array_keys($_SERVER), - array_keys($_SESSION), - array_keys($_ENV), - array_keys($_FILES) - ); - - foreach ($input as $varname) - { - if (isset($not_unset[$varname])) - { - // Hacking attempt. No point in continuing. - exit; - } - - unset($GLOBALS[$varname]); - } - - unset($input); -} - -/** - * This function converts a standard # array to a PHP array without having to resort to JSON_decode which is available from 5.2x and up only - * - * @param string $json String with JSON data - * @return array - */ -if ( !function_exists('json_decode') ){ - function json_decode($content, $assoc=false){ - global $homedir; - require_once($homedir."/classes/json/JSON.php"); - if ( $assoc ){ - $json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); - } else { - $json = new Services_JSON; - } - return $json->decode($content); - } -} - -if ( !function_exists('json_encode') ){ - function json_encode($content){ - global $homedir; - require_once($homedir."/classes/json/JSON.php"); - $json = new Services_JSON; - return $json->encode($content); - } -} - - -?> diff --git a/include/limesurvey/classes/core/surveytranslator.php b/include/limesurvey/classes/core/surveytranslator.php deleted file mode 100644 index 1b9d5970..00000000 --- a/include/limesurvey/classes/core/surveytranslator.php +++ /dev/null @@ -1,672 +0,0 @@ - array ('phpdate' => 'd.m.Y', 'jsdate' => 'dd.mm.yy', 'dateformat' => 'dd.mm.yyyy'), - 2=> array ('phpdate' => 'd-m-Y', 'jsdate' => 'dd-mm-yy', 'dateformat' => 'dd-mm-yyyy'), - 5=> array ('phpdate' => 'd/m/Y', 'jsdate' => 'dd/mm/yy', 'dateformat' => 'dd/mm/yyyy'), - 3=> array ('phpdate' => 'Y.m.d', 'jsdate' => 'yy.mm.dd', 'dateformat' => 'yyyy.mm.dd'), - 6=> array ('phpdate' => 'Y-m-d', 'jsdate' => 'yy-mm-dd', 'dateformat' => 'yyyy-mm-dd'), - 7=> array ('phpdate' => 'Y/m/d', 'jsdate' => 'yy/mm/dd', 'dateformat' => 'yyyy/mm/dd'), - 4=> array ('phpdate' => 'j.n.Y', 'jsdate' => 'd.m.yy', 'dateformat' => 'd.m.yyyy'), - 12=>array ('phpdate' => 'j-n-Y', 'jsdate' => 'd-m-yy', 'dateformat' => 'd-m-yyyy'), - 8=> array ('phpdate' => 'j/n/Y', 'jsdate' => 'd/m/yy', 'dateformat' => 'd/m/yyyy'), - 9=> array ('phpdate' => 'm-d-Y', 'jsdate' => 'mm-dd-yy', 'dateformat' => 'mm-dd-yyyy'), - 10=>array ('phpdate' => 'm.d.Y', 'jsdate' => 'mm.dd.yy', 'dateformat' => 'mm.dd.yyyy'), - 11=>array ('phpdate' => 'm/d/Y', 'jsdate' => 'mm/dd/yy', 'dateformat' => 'mm/dd/yyyy') - ); - - if ($format >0) - { - return $dateformats[$format]; - } - else - return $dateformats; - -} - -/** - * Returns avaliable formats for Radix Points (Decimal Seperators) or returns - * radix point info about a specific format. - * - * @param int $format Format ID/Number [optional] - */ - -function getRadixPointData($format=-1) -{ - global $clang; - $aRadixFormats = array ( - 0=>array('seperator'=> '.', 'desc'=> $clang->gT('Dot (.)')), - 1=>array('seperator'=> ',', 'desc'=> $clang->gT('Comma (,)')) - ); - - if ($format >= 0) - return $aRadixFormats[$format]; - else - return $aRadixFormats; -} - - -function getLanguageCodefromLanguage($languagetosearch) -{ - $detaillanguages = getLanguageData(); - foreach ($detaillanguages as $key2=>$languagename) - { - if ($languagetosearch==$languagename['description']) - { - return $key2; - } - } - // else return default en code - return "en"; -} - - - - -function getLanguageNameFromCode($codetosearch, $withnative=true) -{ - $detaillanguages = getLanguageData(); - if (isset($detaillanguages[$codetosearch]['description'])) - { - if ($withnative) { - return $detaillanguages[$codetosearch]['description'].' - '.$detaillanguages[$codetosearch]['nativedescription']; - } - else { return $detaillanguages[$codetosearch]['description'];} - } - else - // else return default en code - return false; -} - - -function getLanguageRTL($codetosearch) -{ - $detaillanguages = getLanguageData(); - if (isset($detaillanguages[$codetosearch]['rtl'])) - { - return $detaillanguages[$codetosearch]['rtl']; - } - else - { - return false; - } -} - -/** - * Returns the locale settings for a certain language code - * - * @param string $codetosearch - * @return array Array with locale details - * - */ -function getLanguageDetails($codetosearch) -{ - $detaillanguages = getLanguageData(); - if (isset($detaillanguages[$codetosearch])) - { - return $detaillanguages[$codetosearch]; - } - else - { - return $detaillanguages['en']; - } -} - -function getLanguageData($orderbynative=false) { - global $clang; - static $supportedLanguages; - static $result = array(); - - if (isset($result[$orderbynative])) return $result[$orderbynative]; - - if (!isset($supportedLanguages)) { - - // Afrikaans - $supportedLanguages['af']['description'] = $clang->gT('Afrikaans'); - $supportedLanguages['af']['nativedescription'] = 'Afrikaans'; - $supportedLanguages['af']['rtl'] = false; - $supportedLanguages['af']['dateformat'] = 2; - $supportedLanguages['af']['radixpoint'] = 1; - - // Amharic - $supportedLanguages['am']['description'] = $clang->gT('Amharic'); - $supportedLanguages['am']['nativedescription'] = 'አማርኛ'; - $supportedLanguages['am']['rtl'] = false; - $supportedLanguages['am']['dateformat'] = 2; - $supportedLanguages['am']['radixpoint'] = 1; - - // Albanian - $supportedLanguages['sq']['description'] = $clang->gT('Albanian'); - $supportedLanguages['sq']['nativedescription'] = 'Shqipe'; - $supportedLanguages['sq']['rtl'] = false; - $supportedLanguages['sq']['dateformat'] = 1; - $supportedLanguages['sq']['radixpoint'] = 1; - - // Arabic - $supportedLanguages['ar']['description'] = $clang->gT('Arabic'); - $supportedLanguages['ar']['nativedescription'] = 'عَرَبيْ'; - $supportedLanguages['ar']['rtl'] = true; - $supportedLanguages['ar']['dateformat'] = 2; - $supportedLanguages['ar']['radixpoint'] = 0; - - // Basque - $supportedLanguages['eu']['description'] = $clang->gT('Basque'); - $supportedLanguages['eu']['nativedescription'] = 'Euskara'; - $supportedLanguages['eu']['rtl'] = false; - $supportedLanguages['eu']['dateformat'] = 3; - $supportedLanguages['eu']['radixpoint'] = 1; - - // Belarusian - $supportedLanguages['be']['description'] = $clang->gT('Belarusian'); - $supportedLanguages['be']['nativedescription'] = 'Беларускі'; - $supportedLanguages['be']['rtl'] = false; - $supportedLanguages['be']['dateformat'] = 1; - $supportedLanguages['be']['radixpoint'] = 1; - - // Bosnian - $supportedLanguages['bs']['description'] = $clang->gT('Bosnian'); - $supportedLanguages['bs']['nativedescription'] = 'Bosanski'; - $supportedLanguages['bs']['rtl'] = false; - $supportedLanguages['bs']['dateformat'] = 4; - $supportedLanguages['bs']['radixpoint'] = 0; - - // Bulgarian - $supportedLanguages['bg']['description'] = $clang->gT('Bulgarian'); - $supportedLanguages['bg']['nativedescription'] = 'Български'; - $supportedLanguages['bg']['rtl'] = false; - $supportedLanguages['bg']['dateformat'] = 1; - $supportedLanguages['bg']['radixpoint'] = 0; - - // Catalan - $supportedLanguages['ca']['description'] = $clang->gT('Catalan'); - $supportedLanguages['ca']['nativedescription'] = 'Catalά'; - $supportedLanguages['ca']['rtl'] = false; - $supportedLanguages['ca']['dateformat'] = 1; - $supportedLanguages['ca']['radixpoint'] = 1; - - // Welsh - $supportedLanguages['cy']['description'] = $clang->gT('Welsh'); - $supportedLanguages['cy']['nativedescription'] = 'Cymraeg'; - $supportedLanguages['cy']['rtl'] = false; - $supportedLanguages['cy']['dateformat'] = 5; - $supportedLanguages['cy']['radixpoint'] = 0; - - // Chinese (Simplified) - $supportedLanguages['zh-Hans']['description'] = $clang->gT('Chinese (Simplified)'); - $supportedLanguages['zh-Hans']['nativedescription'] = '简体中文'; - $supportedLanguages['zh-Hans']['rtl'] = false; - $supportedLanguages['zh-Hans']['dateformat'] = 6; - $supportedLanguages['zh-Hans']['radixpoint'] = 0; - - // Chinese (Traditional - Hong Kong) - $supportedLanguages['zh-Hant-HK']['description'] = $clang->gT('Chinese (Traditional - Hong Kong)'); - $supportedLanguages['zh-Hant-HK']['nativedescription'] = '繁體中文語系'; - $supportedLanguages['zh-Hant-HK']['rtl'] = false; - $supportedLanguages['zh-Hant-HK']['dateformat'] = 6; - $supportedLanguages['zh-Hant-HK']['radixpoint'] = 0; - - // Chinese (Traditional - Taiwan) - $supportedLanguages['zh-Hant-TW']['description'] = $clang->gT('Chinese (Traditional - Taiwan)'); - $supportedLanguages['zh-Hant-TW']['nativedescription'] = 'Chinese (Traditional - Taiwan)'; - $supportedLanguages['zh-Hant-TW']['rtl'] = false; - $supportedLanguages['zh-Hant-TW']['dateformat'] = 6; - $supportedLanguages['zh-Hant-TW']['radixpoint'] = 0; - - // Croatian - $supportedLanguages['hr']['description'] = $clang->gT('Croatian'); - $supportedLanguages['hr']['nativedescription'] = 'Hrvatski'; - $supportedLanguages['hr']['rtl'] = false; - $supportedLanguages['hr']['dateformat'] = 4; - $supportedLanguages['hr']['radixpoint'] = 1; - - // Czech - $supportedLanguages['cs']['description'] = $clang->gT('Czech'); - $supportedLanguages['cs']['nativedescription'] = 'Česky'; - $supportedLanguages['cs']['rtl'] = false; - $supportedLanguages['cs']['dateformat'] = 4; - $supportedLanguages['cs']['radixpoint'] = 1; - - // Danish - $supportedLanguages['da']['description'] = $clang->gT('Danish'); - $supportedLanguages['da']['nativedescription'] = 'Dansk'; - $supportedLanguages['da']['rtl'] = false; - $supportedLanguages['da']['dateformat'] = 2; - $supportedLanguages['da']['radixpoint'] = 1; - - // Dutch - $supportedLanguages['nl']['description'] = $clang->gT('Dutch'); - $supportedLanguages['nl']['nativedescription'] = 'Nederlands'; - $supportedLanguages['nl']['rtl'] = false; - $supportedLanguages['nl']['dateformat'] = 2; - $supportedLanguages['nl']['radixpoint'] = 1; - - // Dutch - $supportedLanguages['nl-informal']['description'] = $clang->gT('Dutch Informal'); - $supportedLanguages['nl-informal']['nativedescription'] = 'Nederlands (informeel)'; - $supportedLanguages['nl-informal']['rtl'] = false; - $supportedLanguages['nl-informal']['dateformat'] = 2; - $supportedLanguages['nl-informal']['radixpoint'] = 1; - - // English - $supportedLanguages['en']['description'] = $clang->gT('English'); - $supportedLanguages['en']['nativedescription'] = 'English'; - $supportedLanguages['en']['rtl'] = false; - $supportedLanguages['en']['dateformat'] = 9; - $supportedLanguages['en']['radixpoint'] = 0; - - // Estonian - $supportedLanguages['et']['description'] = $clang->gT('Estonian'); - $supportedLanguages['et']['nativedescription'] = 'Eesti'; - $supportedLanguages['et']['rtl'] = false; - $supportedLanguages['et']['dateformat'] = 4; - $supportedLanguages['et']['radixpoint'] = 1; - - // Finnish - $supportedLanguages['fi']['description'] = $clang->gT('Finnish'); - $supportedLanguages['fi']['nativedescription'] = 'Suomi'; - $supportedLanguages['fi']['rtl'] = false; - $supportedLanguages['fi']['dateformat'] = 4; - $supportedLanguages['fi']['radixpoint'] = 1; - - // French - $supportedLanguages['fr']['description'] = $clang->gT('French'); - $supportedLanguages['fr']['nativedescription'] = 'Français'; - $supportedLanguages['fr']['rtl'] = false; - $supportedLanguages['fr']['dateformat'] = 2; - $supportedLanguages['fr']['radixpoint'] = 1; - - // Galician - $supportedLanguages['gl']['description'] = $clang->gT('Galician'); - $supportedLanguages['gl']['nativedescription'] = 'Galego'; - $supportedLanguages['gl']['rtl'] = false; - $supportedLanguages['gl']['dateformat'] = 5; - $supportedLanguages['gl']['radixpoint'] = 1; - - // German - $supportedLanguages['de']['description'] = $clang->gT('German'); - $supportedLanguages['de']['nativedescription'] = 'Deutsch'; - $supportedLanguages['de']['rtl'] = false; - $supportedLanguages['de']['dateformat'] = 1; - $supportedLanguages['de']['radixpoint'] = 1; - - // German informal - $supportedLanguages['de-informal']['description'] = $clang->gT('German informal'); - $supportedLanguages['de-informal']['nativedescription'] = 'Deutsch (Du)'; - $supportedLanguages['de-informal']['rtl'] = false; - $supportedLanguages['de-informal']['dateformat'] = 1; - $supportedLanguages['de-informal']['radixpoint'] = 1; - - // Greek - $supportedLanguages['el']['description'] = $clang->gT('Greek'); - $supportedLanguages['el']['nativedescription'] = 'ελληνικά'; - $supportedLanguages['el']['rtl'] = false; - $supportedLanguages['el']['dateformat'] = 8; - $supportedLanguages['el']['radixpoint'] = 1; - - // Hindi - $supportedLanguages['hi']['description'] = $clang->gT('Hindi'); - $supportedLanguages['hi']['nativedescription'] = 'हिन्दी'; - $supportedLanguages['hi']['rtl'] = false; - $supportedLanguages['hi']['dateformat'] = 2; - $supportedLanguages['hi']['radixpoint'] = 0; - - // Hebrew - $supportedLanguages['he']['description'] = $clang->gT('Hebrew'); - $supportedLanguages['he']['nativedescription'] = ' עברית'; - $supportedLanguages['he']['rtl'] = true; - $supportedLanguages['he']['dateformat'] = 5; - $supportedLanguages['he']['radixpoint'] = 0; - - // Hungarian - $supportedLanguages['hu']['description'] = $clang->gT('Hungarian'); - $supportedLanguages['hu']['nativedescription'] = 'Magyar'; - $supportedLanguages['hu']['rtl'] = false; - $supportedLanguages['hu']['dateformat'] = 6; - $supportedLanguages['hu']['radixpoint'] = 1; - - // Icelandic - $supportedLanguages['is']['description'] = $clang->gT('Icelandic'); - $supportedLanguages['is']['nativedescription'] = 'íslenska'; - $supportedLanguages['is']['rtl'] = false; - $supportedLanguages['is']['dateformat'] = 1; - $supportedLanguages['is']['radixpoint'] = 1; - - // Indonesian - $supportedLanguages['id']['description'] = $clang->gT('Indonesian'); - $supportedLanguages['id']['nativedescription'] = 'Bahasa Indonesia'; - $supportedLanguages['id']['rtl'] = false; - $supportedLanguages['id']['dateformat'] = 5; - $supportedLanguages['id']['radixpoint'] = 1; - - // Irish - $supportedLanguages['ie']['description'] = $clang->gT('Irish'); - $supportedLanguages['ie']['nativedescription'] = 'Gaeilge'; - $supportedLanguages['ie']['rtl'] = false; - $supportedLanguages['ie']['dateformat'] = 2; - $supportedLanguages['ie']['radixpoint'] = 0; - - // Italian - $supportedLanguages['it']['description'] = $clang->gT('Italian'); - $supportedLanguages['it']['nativedescription'] = 'Italiano'; - $supportedLanguages['it']['rtl'] = false; - $supportedLanguages['it']['dateformat'] = 5; - $supportedLanguages['it']['radixpoint'] = 1; - - // Italian-Formal - $supportedLanguages['it-formal']['description'] = $clang->gT('Italian (formal)'); - $supportedLanguages['it-formal']['nativedescription'] = 'Formale Italiano'; - $supportedLanguages['it-formal']['rtl'] = false; - $supportedLanguages['it-formal']['dateformat'] = 5; - $supportedLanguages['it-formal']['radixpoint'] = 1; - - // Japanese - $supportedLanguages['ja']['description'] = $clang->gT('Japanese'); - $supportedLanguages['ja']['nativedescription'] = '日本語'; - $supportedLanguages['ja']['rtl'] = false; - $supportedLanguages['ja']['dateformat'] = 6; - $supportedLanguages['ja']['radixpoint'] = 0; - - // Korean - $supportedLanguages['ko']['description'] = $clang->gT('Korean'); - $supportedLanguages['ko']['nativedescription'] = '한국어'; - $supportedLanguages['ko']['rtl'] = false; - $supportedLanguages['ko']['dateformat'] = 7; - $supportedLanguages['ko']['radixpoint'] = 0; - - // Lithuanian - $supportedLanguages['lt']['description'] = $clang->gT('Lithuanian'); - $supportedLanguages['lt']['nativedescription'] = 'Lietuvių'; - $supportedLanguages['lt']['rtl'] = false; - $supportedLanguages['lt']['dateformat'] = 6; - $supportedLanguages['lt']['radixpoint'] = 1; - - // Latvian - $supportedLanguages['lv']['description'] = $clang->gT('Latvian'); - $supportedLanguages['lv']['nativedescription'] = 'Latviešu'; - $supportedLanguages['lv']['rtl'] = false; - $supportedLanguages['lv']['dateformat'] = 6; - $supportedLanguages['lv']['radixpoint'] = 1; - - // Macedonian - $supportedLanguages['mk']['description'] = $clang->gT('Macedonian'); - $supportedLanguages['mk']['nativedescription'] = 'Македонски'; - $supportedLanguages['mk']['rtl'] = false; - $supportedLanguages['mk']['dateformat'] = 1; - $supportedLanguages['mk']['radixpoint'] = 1; - - // Malay - $supportedLanguages['ms']['description'] = $clang->gT('Malay'); - $supportedLanguages['ms']['nativedescription'] = 'Bahasa Melayu'; - $supportedLanguages['ms']['rtl'] = false; - $supportedLanguages['ms']['dateformat'] = 1; - $supportedLanguages['ms']['radixpoint'] = 0; - - // Maltese - $supportedLanguages['mt']['description'] = $clang->gT('Maltese'); - $supportedLanguages['mt']['nativedescription'] = 'Malti'; - $supportedLanguages['mt']['rtl'] = false; - $supportedLanguages['mt']['dateformat'] = 1; - $supportedLanguages['mt']['radixpoint'] = 0; - - // Norwegian Bokmal - $supportedLanguages['nb']['description'] = $clang->gT('Norwegian (Bokmal)'); - $supportedLanguages['nb']['nativedescription'] = 'Norsk Bokmål'; - $supportedLanguages['nb']['rtl'] = false; - $supportedLanguages['nb']['dateformat'] = 4; - $supportedLanguages['nb']['radixpoint'] = 1; - - // Norwegian Nynorsk - $supportedLanguages['nn']['description'] = $clang->gT('Norwegian (Nynorsk)'); - $supportedLanguages['nn']['nativedescription'] = 'Norsk Nynorsk'; - $supportedLanguages['nn']['rtl'] = false; - $supportedLanguages['nn']['dateformat'] = 4; - $supportedLanguages['nn']['radixpoint'] = 1; - - // Persian - $supportedLanguages['fa']['description'] = $clang->gT('Persian'); - $supportedLanguages['fa']['nativedescription'] = 'فارسی'; - $supportedLanguages['fa']['rtl'] = true; - $supportedLanguages['fa']['dateformat'] = 6; - $supportedLanguages['fa']['radixpoint'] = 0; - - // Polish - $supportedLanguages['pl']['description'] = $clang->gT('Polish'); - $supportedLanguages['pl']['nativedescription'] = 'Polski'; - $supportedLanguages['pl']['rtl'] = false; - $supportedLanguages['pl']['dateformat'] = 1; - $supportedLanguages['pl']['radixpoint'] = 1; - - // Portuguese - $supportedLanguages['pt']['description'] = $clang->gT('Portuguese'); - $supportedLanguages['pt']['nativedescription'] = 'Português'; - $supportedLanguages['pt']['rtl'] = false; - $supportedLanguages['pt']['dateformat'] = 5; - $supportedLanguages['pt']['radixpoint'] = 1; - - // Brazilian Portuguese - $supportedLanguages['pt-BR']['description'] = $clang->gT('Portuguese (Brazilian)'); - $supportedLanguages['pt-BR']['nativedescription'] = 'Português do Brasil'; - $supportedLanguages['pt-BR']['rtl'] = false; - $supportedLanguages['pt-BR']['dateformat'] = 5; - $supportedLanguages['pt-BR']['radixpoint'] = 1; - - // Punjabi - $supportedLanguages['pa']['description'] = $clang->gT('Punjabi'); - $supportedLanguages['pa']['nativedescription'] = 'ਪੰਜਾਬੀ'; - $supportedLanguages['pa']['rtl'] = false; - $supportedLanguages['pa']['dateformat'] = 2; - $supportedLanguages['pa']['radixpoint'] = 0; - - // Russian - $supportedLanguages['ru']['description'] = $clang->gT('Russian'); - $supportedLanguages['ru']['nativedescription'] = 'Русский'; - $supportedLanguages['ru']['rtl'] = false; - $supportedLanguages['ru']['dateformat'] = 1; - $supportedLanguages['ru']['radixpoint'] = 1; - - // Romanian - $supportedLanguages['ro']['description'] = $clang->gT('Romanian'); - $supportedLanguages['ro']['nativedescription'] = 'Românesc'; - $supportedLanguages['ro']['rtl'] = false; - $supportedLanguages['ro']['dateformat'] = 1; - $supportedLanguages['ro']['radixpoint'] = 1; - - // Slovak - $supportedLanguages['sk']['description'] = $clang->gT('Slovak'); - $supportedLanguages['sk']['nativedescription'] = 'Slovák'; - $supportedLanguages['sk']['rtl'] = false; - $supportedLanguages['sk']['dateformat'] = 4; - $supportedLanguages['sk']['radixpoint'] = 1; - - // Sinhala - $supportedLanguages['si']['description'] = $clang->gT('Sinhala'); - $supportedLanguages['si']['nativedescription'] = 'සිංහල'; - $supportedLanguages['si']['rtl'] = false; - $supportedLanguages['si']['dateformat'] = 5; - $supportedLanguages['si']['radixpoint'] = 0; - - // Slovenian - $supportedLanguages['sl']['description'] = $clang->gT('Slovenian'); - $supportedLanguages['sl']['nativedescription'] = 'Slovenščina'; - $supportedLanguages['sl']['rtl'] = false; - $supportedLanguages['sl']['dateformat'] = 4; - $supportedLanguages['sl']['radixpoint'] = 1; - - // Serbian - $supportedLanguages['sr']['description'] = $clang->gT('Serbian'); - $supportedLanguages['sr']['nativedescription'] = 'Srpski'; - $supportedLanguages['sr']['rtl'] = false; - $supportedLanguages['sr']['dateformat'] = 4; - $supportedLanguages['sr']['radixpoint'] = 1; - - // Spanish - $supportedLanguages['es']['description'] = $clang->gT('Spanish'); - $supportedLanguages['es']['nativedescription'] = 'Español'; - $supportedLanguages['es']['rtl'] = false; - $supportedLanguages['es']['dateformat'] = 5; - $supportedLanguages['es']['radixpoint'] = 1; - - // Spanish (Chile) - $supportedLanguages['es-CL']['description'] = $clang->gT('Spanish (Chile)'); - $supportedLanguages['es-CL']['nativedescription'] = 'Español chileno'; - $supportedLanguages['es-CL']['rtl'] = false; - $supportedLanguages['es-CL']['dateformat'] = 5; - $supportedLanguages['es-CL']['radixpoint'] = 0; - - // Spanish (Mexico) - $supportedLanguages['es-MX']['description'] = $clang->gT('Spanish (Mexico)'); - $supportedLanguages['es-MX']['nativedescription'] = 'Español mejicano'; - $supportedLanguages['es-MX']['rtl'] = false; - $supportedLanguages['es-MX']['dateformat'] = 5; - $supportedLanguages['es-MX']['radixpoint'] = 0; - - // Swedish - $supportedLanguages['sv']['description'] = $clang->gT('Swedish'); - $supportedLanguages['sv']['nativedescription'] = 'Svenska'; - $supportedLanguages['sv']['rtl'] = false; - $supportedLanguages['sv']['dateformat'] = 6; - $supportedLanguages['sv']['radixpoint'] = 1; - - // Turkish - $supportedLanguages['tr']['description'] = $clang->gT('Turkish'); - $supportedLanguages['tr']['nativedescription'] = 'Türkçe'; - $supportedLanguages['tr']['rtl'] = false; - $supportedLanguages['tr']['dateformat'] = 5; - $supportedLanguages['tr']['radixpoint'] = 1; - - // Thai - $supportedLanguages['th']['description'] = $clang->gT('Thai'); - $supportedLanguages['th']['nativedescription'] = 'ภาษาไทย'; - $supportedLanguages['th']['rtl'] = false; - $supportedLanguages['th']['dateformat'] = 5; - $supportedLanguages['th']['radixpoint'] = 0; - - - //Urdu - $supportedLanguages['ur']['description'] = $clang->gT('Urdu'); - $supportedLanguages['ur']['nativedescription'] = 'اردو'; - $supportedLanguages['ur']['rtl'] = true; - $supportedLanguages['ur']['dateformat'] = 2; - $supportedLanguages['ur']['radixpoint'] = 0; - - // Vietnamese - $supportedLanguages['vi']['description'] = $clang->gT('Vietnamese'); - $supportedLanguages['vi']['nativedescription'] = 'Tiếng Việt'; - $supportedLanguages['vi']['rtl'] = false; - $supportedLanguages['vi']['dateformat'] = 5; - $supportedLanguages['vi']['radixpoint'] = 1; - } - - if ($orderbynative) - { - uasort($supportedLanguages,"user_sort_native"); - } - else - { - uasort($supportedLanguages,"user_sort"); - } - - $result[$orderbynative] = $supportedLanguages; - - Return $supportedLanguages; -} - -function user_sort($a, $b) { - - // smarts is all-important, so sort it first - if($a['description'] >$b['description']) { - return 1; - } - else { - return -1; - } -} - -function user_sort_native($a, $b) { - - // smarts is all-important, so sort it first - if($a['nativedescription'] >$b['nativedescription']) { - return 1; - } - else { - return -1; - } -} - - -/* // future languages - // Afrikaans - $supportedLanguages['za']['nativedescription'] = 'Afrikaans'; - // Irish - $supportedLanguages['ie']['nativedescription'] = 'Gaeilge'; - // Serbian - $supportedLanguages['yu']['nativedescription'] = 'Srpski'; - */ - - -/** - * This function support the ability NOT to reverse numbers (for example when you output - * a phrase as a parameter for a SWF file that can't handle RTL languages itself, but - * obviously any numbers should remain the same as in the original phrase). - * Note that it can be used just as well for UTF-8 usages if you want the numbers to remain intact - * - * @param string $str - * @param boolean $reverse_numbers - * @return string - */ -function utf8_strrev($str, $reverse_numbers=false) { - preg_match_all('/./us', $str, $ar); - if ($reverse_numbers) - return join('',array_reverse($ar[0])); - else { - $temp = array(); - foreach ($ar[0] as $value) { - if (is_numeric($value) && !empty($temp[0]) && is_numeric($temp[0])) { - foreach ($temp as $key => $value2) { - if (is_numeric($value2)) - $pos = ($key + 1); - else - break; - } - $temp2 = array_splice($temp, $pos); - $temp = array_merge($temp, array($value), $temp2); - } else - array_unshift($temp, $value); - } - return implode('', $temp); - } -} - -?> diff --git a/include/limesurvey/classes/datetimeconverter/class.datetimeconverter.php b/include/limesurvey/classes/datetimeconverter/class.datetimeconverter.php deleted file mode 100644 index 0539ebbd..00000000 --- a/include/limesurvey/classes/datetimeconverter/class.datetimeconverter.php +++ /dev/null @@ -1,400 +0,0 @@ -_default_date_time_units(); //set date&time units to default values - $this->date_time = $start_date_time; - $this->date_time_mask = $mask; - - //convert date to timestamp - $this->date_time_stamp = $this->_date_to_timestamp($start_date_time, $mask); - } - - - public function __destruct() { - unset($this->date_time_stamp); - unset($this->date_time); - unset($this->date_time_mask); - unset($this->seconds); - unset($this->minutes); - unset($this->hours); - unset($this->days); - unset($this->months); - unset($this->years); - unset($this->ampm); - } - - - - - - - - /* PRIVATE FUNCTIONS */ - - /** Private Function. Resets date and time unit variables to default - */ - private function _default_date_time_units() { - $this->seconds = '00'; - $this->minutes = '00'; - $this->hours = '12'; - $this->days = '01'; - $this->months = '01'; - $this->years = date("Y"); - $this->ampm = 'am'; - } - - - /** Private Function. Converts a textual month into a digit. Accepts almost any - * textual format of a month including abbreviations. - * Example: _month_num("jan"); //returns '1' Example2: _month_num("january", true); //returns '01' - */ - private function _month_num($themonth, $return_two_digit=false) { - - switch (strtolower($themonth)) { - case 'jan': - case 'jan.'; - case 'january': - return ($return_two_digit == true ? '01': '1'); - break; - case 'feb': - case 'feb.': - case 'february': - case 'febuary': - return ($return_two_digit == true ? '02': '2'); - break; - case 'mar': - case 'mar.': - case 'march': - return ($return_two_digit == true ? '03': '3'); - break; - case 'apr': - case 'apr.': - case 'april': - return ($return_two_digit == true ? '04': '4'); - break; - case 'may': - case 'may.': - return ($return_two_digit == true ? '05': '5'); - break; - case 'jun': - case 'jun.': - case 'june': - return ($return_two_digit == true ? '06': '6'); - break; - case 'jul': - case 'jul.': - case 'july': - return ($return_two_digit == true ? '07': '7'); - break; - case 'aug': - case 'aug.': - case 'august': - return ($return_two_digit == true ? '08': '8'); - break; - case 'sep': - case 'sep.': - case 'sept': - case 'sept.': - case 'september': - return ($return_two_digit == true ? '09': '9'); - break; - case 'oct': - case 'oct.': - case 'october': - return '10'; - break; - case 'nov': - case 'nov.': - case 'november': - return '11'; - break; - case 'dec': - case 'dec.': - case 'december': - return '12'; - break; - default: - return false; - break; - } - } - - - - - - - - - - - /** Private Function. Converts a date into a timestamp. Accepts almost any - * format of date as long as you supply the correct mask. DOES accept dates - * without leading zeros (n,j,g,G) as long as they aren't bunched together. - * ie: ("1152008", "njY") wont work; ("1/15/2008", "n/j/2008") will work - */ - private function _date_to_timestamp($thedate, $mask) { - - $mask_orig = $mask; - // define the valid values that we will use to check - // value => length - $all = array( - - //time - 's' => 'ss', // Seconds, with leading zeros - 'i' => 'ii', // Minutes with leading zeros - 'H' => 'HH', // 24-hour format of an hour with leading zeros - 'h' => 'hh', // 12-hour format of an hour with leading zeros - 'G' => 'GG', // 24-hour format of an hour without leading zeros - 'g' => 'gg', // 12-hour format of an hour without leading zeros - 'A' => 'AA', // Uppercase Ante meridiem and Post meridiem - 'a' => 'aa', // Lowercase Ante meridiem and Post meridiem - - //year - 'y' => 'yy', // A full numeric representation of a year, 4 digits - 'Y' => 'YYYY', // A two digit representation of a year - - //month - 'm' => 'mm', // A numeric representation of a month with leading zeros. - 'M' => 'MMM', // A textual representation of a month. 3 letters. ex: Jan, Feb, Mar, Apr... - 'n' => 'nn', // Numeric representation of a month, without leading zeros - - //days - 'd' => 'dd', // Day of the month, 2 digits with leading zeros - 'j' => 'jj', // Day of the month without leading zeros - 'S' => 'SS', // English ordinal suffix for the day of the month, 2 characters (st, nd, rd, or th. works well with j) - 'D' => 'DDD' // Textual representation of day of the week (Sun, Mon, Tue, Wed) - - ); - - // this will give us a mask with full length fields - $mask = str_replace(array_keys($all), $all, $mask); - - $vals = array(); - - //loop through each character of $mask starting at the beginning - for ($i=0; $i 12 || $val < 1) { //month must be between 1-12 - $val = substr($thedate, $pos, strlen($chars)-1); - $mask = str_replace($chars, $type, $mask); - } - break; - case "j": - if ($val > 31 || $val < 1) { //day must be between 1-31 - $val = substr($thedate, $pos, strlen($chars)-1); - $mask = str_replace($chars, $type, $mask); - } - break; - case "g": - if ($val > 12 || $val < 1) { //day must be between 1-12 - $val = substr($thedate, $pos, strlen($chars)-1); - $mask = str_replace($chars, $type, $mask); - } - break; - case "G": - if ($val > 24 || $val < 1) { //day must be between 1-24 - $val = substr($thedate, $pos, strlen($chars)-1); - $mask = str_replace($chars, $type, $mask); - } - break; - } - } - } - - /* END FIX FOR UNITS WITHOUT LEADING ZEROS */ - - //save this value - $vals[$type] = $val; - } - } - - foreach($vals as $type => $val) { - - switch($type) { - case 's' : - $this->seconds = $val; - break; - case 'i' : - $this->minutes = $val; - break; - case 'H': - case 'h': - $this->hours = $val; - break; - case 'A': - case 'a': - $this->ampm = $val; - break; - case 'y': - $this->years = '20'.$val; - break; - case 'Y': - $this->years = $val; - break; - case 'm': - $this->months = $val; - break; - case 'M': - $this->months = $this->_month_num($val, true); - break; - case 'd': - $this->days = $val; - break; - //ones without leading zeros: - case 'n': - $this->months = $val; - break; - case 'j': - $this->days = $val; - break; - case 'g': - $this->hours = $val; - break; - case 'G': - $this->hours = $val; - break; - } - } - - if (strtolower($this->ampm) == "pm") {$this->hours = $this->hours + 12;} //if its pm, add 12 hours - - $make_stamp = adodb_mktime( (int)ltrim($this->hours, "0"), (int)ltrim($this->minutes, "0"), - (int)ltrim($this->seconds, "0"), (int)ltrim($this->months, "0"), - (int)ltrim($this->days, "0"), (int)ltrim($this->years, "0")); - - return $make_stamp; - - } - - - - - - - - - - - /** PUBLIC FUNCTIONS */ - - - - - - /** Sets a new format/mask for the date using the php date() style formatting - * Example: $obj->convert("M j Y H:i:s A"); - */ - public function convert($new_mask, $save=true) { - $newdate = adodb_date($new_mask, $this->date_time_stamp); - //if they want to save and apply this new mask to $this->date_time, save it - if ($save == true) { - $this->date_time_mask = $new_mask; - $this->date_time = $newdate; - } - return $newdate; - } - - - - - - - /** Changes the date to a new one. - * Example: $obj->set_date_time('11/20/2005 07:40:00 AM', 'm/d/Y H:i:s A'); - */ - public function set_date_time($start_date_time, $mask) { - $this->__construct($start_date_time, $mask); - } - - - - - - - - } - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/datetimeconverter/docs/date_time_formats.html b/include/limesurvey/classes/datetimeconverter/docs/date_time_formats.html deleted file mode 100644 index 72ac0f83..00000000 --- a/include/limesurvey/classes/datetimeconverter/docs/date_time_formats.html +++ /dev/null @@ -1,292 +0,0 @@ - - - -Date and Time Converter - Currently Supported & Coming -Soon Date/Time Formats - - - - - -This is a list of PHP date() style -date/time formats that the "Date and Time Converter" class currently -supports and also formats that I plan on implementing in the near -future. This table was copied from the PHP manual and modified. php.net/date -
        -

        Currently Supported Date/Time -Formats

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        format characterDescriptionExample returned values
        Day------
        dDay of the month, 2 digits with leading - zeros01 to 31
        jDay of the month without leading zeros1 to 31
        SEnglish ordinal suffix for the day of the - month, 2 charactersst, nd, rd or th. Works well with j
        DA textual representation of a day, three - lettersMon through Sun
        Month------
        mNumeric representation of a month, with - leading zeros01 through 12
        MA short textual representation of a month, - three lettersJan through Dec
        nNumeric representation of a month, without - leading zeros1 through 12
        Year------
        oISO-8601 year number. This has the same - value as Y, except that if the ISO week number (W) belongs to the - previous or next year, that year is used instead. (added in PHP - 5.1.0)Examples: 1999 or 2003
        YA full numeric representation of a year, 4 - digitsExamples: 1999 or 2003
        yA two digit representation of a yearExamples: 99 or 03
        Time------
        aLowercase Ante meridiem and Post meridiemam or pm
        AUppercase Ante meridiem and Post meridiemAM or PM
        g12-hour format of an hour without leading - zeros1 through 12
        G24-hour format of an hour without leading - zeros0 through 23
        h12-hour format of an hour with leading zeros01 through 12
        H24-hour format of an hour with leading zeros00 through 23
        iMinutes with leading zeros00 to 59
        sSeconds, with leading zeros00 through 59
        -

        -
        -
        -
        -Date/Time Formats Coming Soon!
        -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        format characterDescriptionExample returned values
        uMilliseconds (added in PHP 5.2.2)Example: 54321
        ODifference to Greenwich time (GMT) in hoursExample: +0200
        PDifference to Greenwich time (GMT) with - colon between hours and minutes (added in PHP 5.1.3)Example: +02:00
        cISO 8601 date (added in PHP 5)2004-02-12T15:19:21+00:00
        r» RFC 2822 formatted dateExample: Thu, 21 Dec 2000 16:01:07 +0200
        USeconds since the Unix Epoch (January 1 1970 - 00:00:00 GMT)See also time()
        l (lowercase 'L')A full textual representation of the day of - the weekSunday through Saturday
        NISO-8601 numeric representation of the day - of the week (added in PHP 5.1.0)1 (for Monday) through 7 (for Sunday)
        wNumeric representation of the day of the - week0 (for Sunday) through 6 (for Saturday)
        zThe day of the year (starting from 0)0 through 365
        WISO-8601 week number of year, weeks starting - on Monday (added in PHP 4.1.0)Example: 42 (the 42nd week in the year)
        FA full textual representation of a month, - such as January or MarchJanuary through December
        tNumber of days in the given month28 through 31
        -
        -
        - - - diff --git a/include/limesurvey/classes/datetimeconverter/docs/example.html b/include/limesurvey/classes/datetimeconverter/docs/example.html deleted file mode 100644 index 98921b31..00000000 --- a/include/limesurvey/classes/datetimeconverter/docs/example.html +++ /dev/null @@ -1,308 +0,0 @@ - - - -Date and Time Converter - Examples, Usage, and Syntax - - - - -

        Date/Time Converter Class -Usage/Examples
        -
        -
        -Remember, you can convert almost any form -of date/time. It also accepts date/times -that don't have leading zeros (such as n/j/y). It works fine as long as -the numbers aren't bunched together like: 11908 (njy), (not even a human -can read that), but 11 9 08 or 11/9/08 or 11/9 08 will work.

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        Original Date Original MaskNew Mask OutputSyntax
        11/1/2008 - 17:40:00n/j/Y - H:i:sm/d/y - G:i 11/01/08 - 17:40 - - $obj = new Date_Time_Converter("11/1/2008 17:40:00", "n/j/Y H:i:s");
        - echo $obj->convert("m/d/y G:i");     //you - may echo the return value of convert()
        -
        11/20/2005 - 07:40:00 PMm/d/Y - h:i:s AM - jS, Y g:ia Nov - 20th, 2005 7:40pm - - $obj = new Date_Time_Converter("11/20/2005 07:40:00 PM", "m/d/Y h:i:s A");
        - $obj->convert("M jS, Y g:ia", - true);
        - echo $obj->date_time;   //or if - you set the 2nd argument in convert() to true, you can retreive the - value from the public $date_time variable
        219njm/d02/19 - - $obj = new Date_Time_Converter("219", "nj");   //its - smart... it knows there's no such month as 21, so it must be 2
        - echo $obj->convert("m/d");
        119njm-d11-09 - - $obj = new Date_Time_Converter("119", "nj");    //this - defaults to November 9th, not January 19th.
        - echo $obj->convert("m-d");
        11 20 2005 07:40:25 PMm/d/Y - h:i:s A -

        F jS 'y, g:i:sa

        -
        November - 20th '05, 7:40:25pm - - $obj = new Date_Time_Converter("11 20 2005 07:40:25 PM", "m/d/Y h:i:s A");
        - echo $obj->convert("F jS 'y, g:i:sa");
        Fri, - Feb 9th, 2007D, M jS, YY-m-d2007-02-09$obj = - new Date_Time_Converter("Fri, Feb 9th, 2007", "D, M jS, Y");
        - echo $obj->convert("Y-m-d");       //you may also provide the day of the week in - "D" format (Sun, Mon, Tue)
        11:20 - AMg:i Ag:i a11:20 am -

        $obj = new Date_Time_Converter("11:20 - AM", "g:i A");     -   //time only
        - echo $obj->convert("g:i a");

        -
        - - - -
        -
        -
        -
        - - - - - diff --git a/include/limesurvey/classes/expressions/ExpressionManager.php b/include/limesurvey/classes/expressions/ExpressionManager.php deleted file mode 100644 index a4f0988d..00000000 --- a/include/limesurvey/classes/expressions/ExpressionManager.php +++ /dev/null @@ -1,3489 +0,0 @@ -=|>|==|!=|\ble\b|\blt\b|\bge\b|\bgt\b|\beq\b|\bne\b'; - $RDP_regex_assign = '='; // '=|\+=|-=|\*=|/='; - $RDP_regex_sgqa = '(?:INSERTANS:)?[0-9]+X[0-9]+X[0-9]+[A-Z0-9_]*\#?[01]?(?:\.(?:' . ExpressionManager::$RDP_regex_var_attr . '))?'; - $RDP_regex_word = '(?:TOKEN:|SAMPLE:|OPERATOR:|RESPONDENT:)?(?:[A-Z][A-Z0-9_]*)?(?:\.(?:[A-Z][A-Z0-9_]*))*(?:\.(?:' . ExpressionManager::$RDP_regex_var_attr . '))?'; - $RDP_regex_number = '[0-9]+\.?[0-9]*|\.[0-9]+'; - $RDP_regex_andor = '\band\b|\bor\b|&&|\|\|'; - $RDP_regex_lcb = '{'; - $RDP_regex_rcb = '}'; - $RDP_regex_sq = '\''; - $RDP_regex_dq= '"'; - $RDP_regex_bs = '\\\\'; - - $RDP_StringSplitRegex = array( - $RDP_regex_lcb, - $RDP_regex_rcb, - $RDP_regex_sq, - $RDP_regex_dq, - $RDP_regex_bs, - ); - - // RDP_ExpressionRegex is the regular expression that splits apart strings that contain curly braces in order to find expressions - $this->RDP_ExpressionRegex = '#(' . implode('|',$RDP_StringSplitRegex) . ')#i'; - - // asTokenRegex and RDP_TokenType must be kept in sync (same number and order) - $RDP_TokenRegex = array( - $RDP_regex_dq_string, - $RDP_regex_sq_string, - $RDP_regex_whitespace, - $RDP_regex_lparen, - $RDP_regex_rparen, - $RDP_regex_comma, - $RDP_regex_andor, - $RDP_regex_compare, - $RDP_regex_sgqa, - $RDP_regex_word, - $RDP_regex_number, - $RDP_regex_not, - $RDP_regex_inc_dec, - $RDP_regex_assign, - $RDP_regex_binary, - ); - - $this->RDP_TokenType = array( - 'DQ_STRING', - 'SQ_STRING', - 'SPACE', - 'LP', - 'RP', - 'COMMA', - 'AND_OR', - 'COMPARE', - 'SGQA', - 'WORD', - 'NUMBER', - 'NOT', - 'OTHER', - 'ASSIGN', - 'BINARYOP', - ); - - // $RDP_TokenizerRegex - a single regex used to split and equation into tokens - $this->RDP_TokenizerRegex = '#(' . implode('|',$RDP_TokenRegex) . ')#i'; - - // $RDP_CategorizeTokensRegex - an array of patterns so can categorize the type of token found - would be nice if could get this from preg_split - // Adding ability to capture 'OTHER' type, which indicates an error - unsupported syntax element - $this->RDP_CategorizeTokensRegex = preg_replace("#^(.*)$#","#^$1$#i",$RDP_TokenRegex); - $this->RDP_CategorizeTokensRegex[] = '/.+/'; - $this->RDP_TokenType[] = 'OTHER'; - - // Each allowed function is a mapping from local name to external name + number of arguments - // Functions can have a list of serveral allowable #s of arguments. - // If the value is -1, the function must have a least one argument but can have an unlimited number of them - // -2 means that at least one argument is required. -3 means at least two arguments are required, etc. - $this->RDP_ValidFunctions = array( -'abs' => array('abs', 'Math.abs', $this->gT('Absolute value'), 'number abs(number)', 'http://www.php.net/manual/en/function.checkdate.php', 1), -'acos' => array('acos', 'Math.acos', $this->gT('Arc cosine'), 'number acos(number)', 'http://www.php.net/manual/en/function.acos.php', 1), -'addslashes' => array('addslashes', $this->gT('addslashes'), 'Quote string with slashes', 'string addslashes(string)', 'http://www.php.net/manual/en/function.addslashes.php', 1), -'asin' => array('asin', 'Math.asin', $this->gT('Arc sine'), 'number asin(number)', 'http://www.php.net/manual/en/function.asin.php', 1), -'atan' => array('atan', 'Math.atan', $this->gT('Arc tangent'), 'number atan(number)', 'http://www.php.net/manual/en/function.atan.php', 1), -'atan2' => array('atan2', 'Math.atan2', $this->gT('Arc tangent of two variables'), 'number atan2(number, number)', 'http://www.php.net/manual/en/function.atan2.php', 2), -'ceil' => array('ceil', 'Math.ceil', $this->gT('Round fractions up'), 'number ceil(number)', 'http://www.php.net/manual/en/function.ceil.php', 1), -'checkdate' => array('checkdate', 'checkdate', $this->gT('Returns true(1) if it is a valid date in gregorian calendar'), 'bool checkdate(month,day,year)', 'http://www.php.net/manual/en/function.checkdate.php', 3), -'cos' => array('cos', 'Math.cos', $this->gT('Cosine'), 'number cos(number)', 'http://www.php.net/manual/en/function.cos.php', 1), -'count' => array('exprmgr_count', 'LEMcount', $this->gT('Count the number of answered questions in the list'), 'number count(arg1, arg2, ... argN)', '', -1), -'countif' => array('exprmgr_countif', 'LEMcountif', $this->gT('Count the number of answered questions in the list equal the first argument'), 'number countif(matches, arg1, arg2, ... argN)', '', -2), -'countifop' => array('exprmgr_countifop', 'LEMcountifop', $this->gT('Count the number of answered questions in the list which pass the criteria (arg op value)'), 'number countifop(op, value, arg1, arg2, ... argN)', '', -3), -'date' => array('date', 'date', $this->gT('Format a local date/time'), 'string date(format [, timestamp=time()])', 'http://www.php.net/manual/en/function.date.php', 1,2), -'exp' => array('exp', 'Math.exp', $this->gT('Calculates the exponent of e'), 'number exp(number)', 'http://www.php.net/manual/en/function.exp.php', 1), -'fixnum' => array('exprmgr_fixnum', 'LEMfixnum', $this->gT('Display numbers with comma as radix separator, if needed'), 'string fixnum(number)', '', 1), -'floor' => array('floor', 'Math.floor', $this->gT('Round fractions down'), 'number floor(number)', 'http://www.php.net/manual/en/function.floor.php', 1), -'gmdate' => array('gmdate', 'gmdate', $this->gT('Format a GMT date/time'), 'string gmdate(format [, timestamp=time()])', 'http://www.php.net/manual/en/function.gmdate.php', 1,2), -'html_entity_decode' => array('html_entity_decode', 'html_entity_decode', $this->gT('Convert all HTML entities to their applicable characters (always uses ENT_QUOTES and UTF-8)'), 'string html_entity_decode(string)', 'http://www.php.net/manual/en/function.html-entity-decode.php', 1), -'htmlentities' => array('htmlentities', 'htmlentities', $this->gT('Convert all applicable characters to HTML entities (always uses ENT_QUOTES and UTF-8)'), 'string htmlentities(string)', 'http://www.php.net/manual/en/function.htmlentities.php', 1), -'htmlspecialchars' => array('expr_mgr_htmlspecialchars', 'htmlspecialchars', $this->gT('Convert special characters to HTML entities (always uses ENT_QUOTES and UTF-8)'), 'string htmlspecialchars(string)', 'http://www.php.net/manual/en/function.htmlspecialchars.php', 1), -'htmlspecialchars_decode' => array('expr_mgr_htmlspecialchars_decode', 'htmlspecialchars_decode', $this->gT('Convert special HTML entities back to characters (always uses ENT_QUOTES and UTF-8)'), 'string htmlspecialchars_decode(string)', 'http://www.php.net/manual/en/function.htmlspecialchars-decode.php', 1), -'idate' => array('idate', 'idate', $this->gT('Format a local time/date as integer'), 'string idate(string [, timestamp=time()])', 'http://www.php.net/manual/en/function.idate.php', 1,2), -'if' => array('exprmgr_if', 'LEMif', $this->gT('Conditional processing'), 'if(test,result_if_true,result_if_false)', '', 3), -'implode' => array('exprmgr_implode', 'LEMimplode', $this->gT('Join array elements with a string'), 'string implode(glue,arg1,arg2,...,argN)', 'http://www.php.net/manual/en/function.implode.php', -2), -'intval' => array('intval', 'LEMintval', $this->gT('Get the integer value of a variable'), 'int intval(number [, base=10])', 'http://www.php.net/manual/en/function.intval.php', 1,2), -'is_empty' => array('exprmgr_empty', 'LEMempty', $this->gT('Determine whether a variable is considered to be empty'), 'bool is_empty(var)', 'http://www.php.net/manual/en/function.empty.php', 1), -'is_float' => array('is_float', 'LEMis_float', $this->gT('Finds whether the type of a variable is float'), 'bool is_float(var)', 'http://www.php.net/manual/en/function.is-float.php', 1), -'is_int' => array('is_int', 'LEMis_int', $this->gT('Find whether the type of a variable is integer'), 'bool is_int(var)', 'http://www.php.net/manual/en/function.is-int.php', 1), -'is_nan' => array('is_nan', 'isNaN', $this->gT('Finds whether a value is not a number'), 'bool is_nan(var)', 'http://www.php.net/manual/en/function.is-nan.php', 1), -'is_null' => array('is_null', 'LEMis_null', $this->gT('Finds whether a variable is NULL'), 'bool is_null(var)', 'http://www.php.net/manual/en/function.is-null.php', 1), -'is_numeric' => array('is_numeric', 'LEMis_numeric', $this->gT('Finds whether a variable is a number or a numeric string'), 'bool is_numeric(var)', 'http://www.php.net/manual/en/function.is-numeric.php', 1), -'is_string' => array('is_string', 'LEMis_string', $this->gT('Find whether the type of a variable is string'), 'bool is_string(var)', 'http://www.php.net/manual/en/function.is-string.php', 1), -'list' => array('exprmgr_list', 'LEMlist', $this->gT('Return comma-separated list of values'), 'string list(arg1, arg2, ... argN)', '', -2), -'log' => array('log', 'Math.log', $this->gT('Natural logarithm'), 'number log(number)', 'http://www.php.net/manual/en/function.log.php', 1), -'ltrim' => array('ltrim', 'ltrim', $this->gT('Strip whitespace (or other characters) from the beginning of a string'), 'string ltrim(string [, charlist])', 'http://www.php.net/manual/en/function.ltrim.php', 1,2), -'max' => array('max', 'Math.max', $this->gT('Find highest value'), 'number max(arg1, arg2, ... argN)', 'http://www.php.net/manual/en/function.max.php', -2), -'min' => array('min', 'Math.min', $this->gT('Find lowest value'), 'number min(arg1, arg2, ... argN)', 'http://www.php.net/manual/en/function.min.php', -2), -'mktime' => array('mktime', 'mktime', $this->gT('Get UNIX timestamp for a date (each of the 6 arguments are optional)'), 'number mktime([hour [, minute [, second [, month [, day [, year ]]]]]])', 'http://www.php.net/manual/en/function.mktime.php', 0,1,2,3,4,5,6), -'nl2br' => array('nl2br', 'nl2br', $this->gT('Inserts HTML line breaks before all newlines in a string'), 'string nl2br(string)', 'http://www.php.net/manual/en/function.nl2br.php', 1,1), -'number_format' => array('number_format', 'number_format', $this->gT('Format a number with grouped thousands'), 'string number_format(number)', 'http://www.php.net/manual/en/function.number-format.php', 1), -'pi' => array('pi', 'LEMpi', $this->gT('Get value of pi'), 'number pi()', '', 0), -'pow' => array('pow', 'Math.pow', $this->gT('Exponential expression'), 'number pow(base, exp)', 'http://www.php.net/manual/en/function.pow.php', 2), -'quoted_printable_decode' => array('quoted_printable_decode', 'quoted_printable_decode', $this->gT('Convert a quoted-printable string to an 8 bit string'), 'string quoted_printable_decode(string)', 'http://www.php.net/manual/en/function.quoted-printable-decode.php', 1), -'quoted_printable_encode' => array('quoted_printable_encode', 'quoted_printable_encode', $this->gT('Convert a 8 bit string to a quoted-printable string'), 'string quoted_printable_encode(string)', 'http://www.php.net/manual/en/function.quoted-printable-encode.php', 1), -'quotemeta' => array('quotemeta', 'quotemeta', $this->gT('Quote meta characters'), 'string quotemeta(string)', 'http://www.php.net/manual/en/function.quotemeta.php', 1), -'rand' => array('rand', 'rand', $this->gT('Generate a random integer'), 'int rand() OR int rand(min, max)', 'http://www.php.net/manual/en/function.rand.php', 0,2), -'regexMatch' => array('exprmgr_regexMatch', 'LEMregexMatch', $this->gT('Compare a string to a regular expression pattern'), 'bool regexMatch(pattern,input)', '', 2), -'round' => array('round', 'round', $this->gT('Rounds a number to an optional precision'), 'number round(val [, precision])', 'http://www.php.net/manual/en/function.round.php', 1,2), -'rtrim' => array('rtrim', 'rtrim', $this->gT('Strip whitespace (or other characters) from the end of a string'), 'string rtrim(string [, charlist])', 'http://www.php.net/manual/en/function.rtrim.php', 1,2), -'sin' => array('sin', 'Math.sin', $this->gT('Sine'), 'number sin(arg)', 'http://www.php.net/manual/en/function.sin.php', 1), -'sprintf' => array('sprintf', 'sprintf', $this->gT('Return a formatted string'), 'string sprintf(format, arg1, arg2, ... argN)', 'http://www.php.net/manual/en/function.sprintf.php', -2), -'sqrt' => array('sqrt', 'Math.sqrt', $this->gT('Square root'), 'number sqrt(arg)', 'http://www.php.net/manual/en/function.sqrt.php', 1), -'stddev' => array('exprmgr_stddev', 'LEMstddev', $this->gT('Calculate the Sample Standard Deviation for the list of numbers'), 'number stddev(arg1, arg2, ... argN)', '', -2), -'str_pad' => array('str_pad', 'str_pad', $this->gT('Pad a string to a certain length with another string'), 'string str_pad(input, pad_length [, pad_string])', 'http://www.php.net/manual/en/function.str-pad.php', 2,3), -'str_repeat' => array('str_repeat', 'str_repeat', $this->gT('Repeat a string'), 'string str_repeat(input, multiplier)', 'http://www.php.net/manual/en/function.str-repeat.php', 2), -'str_replace' => array('str_replace', 'LEMstr_replace', $this->gT('Replace all occurrences of the search string with the replacement string'), 'string str_replace(search, replace, subject)', 'http://www.php.net/manual/en/function.str-replace.php', 3), -'strcasecmp' => array('strcasecmp', 'strcasecmp', $this->gT('Binary safe case-insensitive string comparison'), 'int strcasecmp(str1, str2)', 'http://www.php.net/manual/en/function.strcasecmp.php', 2), -'strcmp' => array('strcmp', 'strcmp', $this->gT('Binary safe string comparison'), 'int strcmp(str1, str2)', 'http://www.php.net/manual/en/function.strcmp.php', 2), -'strip_tags' => array('strip_tags', 'strip_tags', $this->gT('Strip HTML and PHP tags from a string'), 'string strip_tags(str, allowable_tags)', 'http://www.php.net/manual/en/function.strip-tags.php', 1,2), -'stripos' => array('stripos', 'stripos', $this->gT('Find position of first occurrence of a case-insensitive string'), 'int stripos(haystack, needle [, offset=0])', 'http://www.php.net/manual/en/function.stripos.php', 2,3), -'stripslashes' => array('stripslashes', 'stripslashes', $this->gT('Un-quotes a quoted string'), 'string stripslashes(string)', 'http://www.php.net/manual/en/function.stripslashes.php', 1), -'stristr' => array('stristr', 'stristr', $this->gT('Case-insensitive strstr'), 'string stristr(haystack, needle [, before_needle=false])', 'http://www.php.net/manual/en/function.stristr.php', 2,3), -'strlen' => array('strlen', 'LEMstrlen', $this->gT('Get string length'), 'int strlen(string)', 'http://www.php.net/manual/en/function.strlen.php', 1), -'strpos' => array('strpos', 'LEMstrpos', $this->gT('Find position of first occurrence of a string'), 'int strpos(haystack, needle [ offset=0])', 'http://www.php.net/manual/en/function.strpos.php', 2,3), -'strrev' => array('strrev', 'strrev', $this->gT('Reverse a string'), 'string strrev(string)', 'http://www.php.net/manual/en/function.strrev.php', 1), -'strstr' => array('strstr', 'strstr', $this->gT('Find first occurrence of a string'), 'string strstr(haystack, needle)', 'http://www.php.net/manual/en/function.strstr.php', 2), -'strtolower' => array('strtolower', 'LEMstrtolower', $this->gT('Make a string lowercase'), 'string strtolower(string)', 'http://www.php.net/manual/en/function.strtolower.php', 1), -'strtoupper' => array('strtoupper', 'LEMstrtoupper', $this->gT('Make a string uppercase'), 'string strtoupper(string)', 'http://www.php.net/manual/en/function.strtoupper.php', 1), -'substr' => array('substr', 'substr', $this->gT('Return part of a string'), 'string substr(string, start [, length])', 'http://www.php.net/manual/en/function.substr.php', 2,3), -'sum' => array('array_sum', 'LEMsum', $this->gT('Calculate the sum of values in an array'), 'number sum(arg1, arg2, ... argN)', '', -2), -'sumifop' => array('exprmgr_sumifop', 'LEMsumifop', $this->gT('Sum the values of answered questions in the list which pass the criteria (arg op value)'), 'number sumifop(op, value, arg1, arg2, ... argN)', '', -3), -'tan' => array('tan', 'Math.tan', $this->gT('Tangent'), 'number tan(arg)', 'http://www.php.net/manual/en/function.tan.php', 1), -'time' => array('time', 'time', $this->gT('Return current UNIX timestamp'), 'number time()', 'http://www.php.net/manual/en/function.time.php', 0), -'trim' => array('trim', 'trim', $this->gT('Strip whitespace (or other characters) from the beginning and end of a string'), 'string trim(string [, charlist])', 'http://www.php.net/manual/en/function.trim.php', 1,2), -'ucwords' => array('ucwords', 'ucwords', $this->gT('Uppercase the first character of each word in a string'), 'string ucwords(string)', 'http://www.php.net/manual/en/function.ucwords.php', 1), -'unique' => array('exprmgr_unique', 'LEMunique', $this->gT('Returns true if all non-empty responses are unique'), 'boolean unique(arg1, ..., argN)', '', -1), - ); - - } - - /** - * Add an error to the error log - * - * @param $errMsg - * @param $token - */ - private function RDP_AddError($errMsg, $token) - { - $this->RDP_errs[] = array($errMsg, $token); - } - - /** - * RDP_EvaluateBinary() computes binary expressions, such as (a or b), (c * d), popping the top two entries off the - * stack and pushing the result back onto the stack. - * - * @param array $token - * @return boolean - false if there is any error, else true - */ - - private function RDP_EvaluateBinary(array $token) - { - if (count($this->RDP_stack) < 2) - { - $this->RDP_AddError($this->gT("Unable to evaluate binary operator - fewer than 2 entries on stack"), $token); - return false; - } - $arg2 = $this->RDP_StackPop(); - $arg1 = $this->RDP_StackPop(); - if (is_null($arg1) or is_null($arg2)) - { - $this->RDP_AddError($this->gT("Invalid value(s) on the stack"), $token); - return false; - } - // TODO: try to determine datatype? - $bNumericArg1 = is_numeric($arg1[0]) || $arg1[0] == ''; - $bNumericArg2 = is_numeric($arg2[0]) || $arg2[0] == ''; - $bStringArg1 = !$bNumericArg1 || $arg1[0] == ''; - $bStringArg2 = !$bNumericArg2 || $arg2[0] == ''; - $bBothNumeric = ($bNumericArg1 && $bNumericArg2); - $bBothString = ($bStringArg1 && $bStringArg2); - $bMismatchType = (!$bBothNumeric && !$bBothString); - switch(strtolower($token[0])) - { - case 'or': - case '||': - $result = array(($arg1[0] or $arg2[0]),$token[1],'NUMBER'); - break; - case 'and': - case '&&': - $result = array(($arg1[0] and $arg2[0]),$token[1],'NUMBER'); - break; - case '==': - case 'eq': - $result = array(($arg1[0] == $arg2[0]),$token[1],'NUMBER'); - break; - case '!=': - case 'ne': - $result = array(($arg1[0] != $arg2[0]),$token[1],'NUMBER'); - break; - case '<': - case 'lt': - if ($bMismatchType) { - $result = array(false,$token[1],'NUMBER'); - } - else { - $result = array(($arg1[0] < $arg2[0]),$token[1],'NUMBER'); - } - break; - case '<='; - case 'le': - if ($bMismatchType) { - $result = array(false,$token[1],'NUMBER'); - } - else { - // Need this explicit comparison in order to be in agreement with JavaScript - if (($arg1[0] == '0' && $arg2[0] == '') || ($arg1[0] == '' && $arg2[0] == '0')) { - $result = array(true,$token[1],'NUMBER'); - } - else { - $result = array(($arg1[0] <= $arg2[0]),$token[1],'NUMBER'); - } - } - break; - case '>': - case 'gt': - if ($bMismatchType) { - $result = array(false,$token[1],'NUMBER'); - } - else { - // Need this explicit comparison in order to be in agreement with JavaScript - if (($arg1[0] == '0' && $arg2[0] == '') || ($arg1[0] == '' && $arg2[0] == '0')) { - $result = array(false,$token[1],'NUMBER'); - } - else { - $result = array(($arg1[0] > $arg2[0]),$token[1],'NUMBER'); - } - } - break; - case '>='; - case 'ge': - if ($bMismatchType) { - $result = array(false,$token[1],'NUMBER'); - } - else { - $result = array(($arg1[0] >= $arg2[0]),$token[1],'NUMBER'); - - } - break; - case '+': - if ($bBothNumeric) { - $result = array(($arg1[0] + $arg2[0]),$token[1],'NUMBER'); - } - else if ($bBothString) { - $result = array($arg1[0] . $arg2[0],$token[1],'STRING'); - } - else { - $result = array(NAN,$token[1],'NUMBER'); - } - break; - case '-': - if ($bBothNumeric) { - $result = array(($arg1[0] - $arg2[0]),$token[1],'NUMBER'); - } - else { - $result = array(NAN,$token[1],'NUMBER'); - } - break; - case '*': - if ($bBothNumeric) { - $result = array(($arg1[0] * $arg2[0]),$token[1],'NUMBER'); - } - else { - $result = array(NAN,$token[1],'NUMBER'); - } - break; - case '/'; - if ($bBothNumeric) { - if ($arg2[0] == 0) { - $result = array(NAN,$token[1],'NUMBER'); - } - else { - $result = array(($arg1[0] / $arg2[0]),$token[1],'NUMBER'); - } - } - else { - $result = array(NAN,$token[1],'NUMBER'); - } - break; - } - $this->RDP_StackPush($result); - return true; - } - - /** - * Processes operations like +a, -b, !c - * @param array $token - * @return boolean - true if success, false if any error occurred - */ - - private function RDP_EvaluateUnary(array $token) - { - if (count($this->RDP_stack) < 1) - { - $this->RDP_AddError($this->gT("Unable to evaluate unary operator - no entries on stack"), $token); - return false; - } - $arg1 = $this->RDP_StackPop(); - if (is_null($arg1)) - { - $this->RDP_AddError($this->gT("Invalid value(s) on the stack"), $token); - return false; - } - // TODO: try to determine datatype? - switch($token[0]) - { - case '+': - $result = array((+$arg1[0]),$token[1],'NUMBER'); - break; - case '-': - $result = array((-$arg1[0]),$token[1],'NUMBER'); - break; - case '!'; - $result = array((!$arg1[0]),$token[1],'NUMBER'); - break; - } - $this->RDP_StackPush($result); - return true; - } - - - /** - * Main entry function - * @param $expr - * @param $onlyparse - if true, then validate the syntax without computing an answer - * @return boolean - true if success, false if any error occurred - */ - - public function RDP_Evaluate($expr, $onlyparse=false) - { - $this->RDP_expr = $expr; - $this->RDP_tokens = $this->RDP_Tokenize($expr); - $this->RDP_count = count($this->RDP_tokens); - $this->RDP_pos = -1; // starting position within array (first act will be to increment it) - $this->RDP_errs = array(); - $this->RDP_onlyparse = $onlyparse; - $this->RDP_stack = array(); - $this->RDP_evalStatus = false; - $this->RDP_result = NULL; - $this->varsUsed = array(); - $this->jsExpression = NULL; - - if ($this->HasSyntaxErrors()) { - return false; - } - elseif ($this->RDP_EvaluateExpressions()) - { - if ($this->RDP_pos < $this->RDP_count) - { - $this->RDP_AddError($this->gT("Extra tokens found"), $this->RDP_tokens[$this->RDP_pos]); - return false; - } - $this->RDP_result = $this->RDP_StackPop(); - if (is_null($this->RDP_result)) - { - return false; - } - if (count($this->RDP_stack) == 0) - { - $this->RDP_evalStatus = true; - return true; - } - else - { - $this-RDP_AddError($this->gT("Unbalanced equation - values left on stack"),NULL); - return false; - } - } - else - { - $this->RDP_AddError($this->gT("Not a valid expression"),NULL); - return false; - } - } - - - /** - * Process "a op b" where op in (+,-,concatenate) - * @return boolean - true if success, false if any error occurred - */ - private function RDP_EvaluateAdditiveExpression() - { - if (!$this->RDP_EvaluateMultiplicativeExpression()) - { - return false; - } - while (($this->RDP_pos + 1) < $this->RDP_count) - { - $token = $this->RDP_tokens[++$this->RDP_pos]; - if ($token[2] == 'BINARYOP') - { - switch ($token[0]) - { - case '+': - case '-'; - if ($this->RDP_EvaluateMultiplicativeExpression()) - { - if (!$this->RDP_EvaluateBinary($token)) - { - return false; - } - // else continue; - } - else - { - return false; - } - break; - default: - --$this->RDP_pos; - return true; - } - } - else - { - --$this->RDP_pos; - return true; - } - } - return true; - } - - /** - * Process a Constant (number of string), retrieve the value of a known variable, or process a function, returning result on the stack. - * @return boolean - true if success, false if any error occurred - */ - - private function RDP_EvaluateConstantVarOrFunction() - { - if ($this->RDP_pos + 1 >= $this->RDP_count) - { - $this->RDP_AddError($this->gT("Poorly terminated expression - expected a constant or variable"), NULL); - return false; - } - $token = $this->RDP_tokens[++$this->RDP_pos]; - switch ($token[2]) - { - case 'NUMBER': - case 'DQ_STRING': - case 'SQ_STRING': - $this->RDP_StackPush($token); - return true; - break; - case 'WORD': - case 'SGQA': - if (($this->RDP_pos + 1) < $this->RDP_count and $this->RDP_tokens[($this->RDP_pos + 1)][2] == 'LP') - { - return $this->RDP_EvaluateFunction(); - } - else - { - if ($this->RDP_isValidVariable($token[0])) - { - $this->varsUsed[] = $token[0]; // add this variable to list of those used in this equation - if (preg_match("/\.(gid|grelevance|gseq|jsName|mandatory|qid|qseq|question|readWrite|relevance|rowdivid|sgqa|type)$/",$token[0])) - { - $relStatus=1; // static, so always relevant - } - else - { - $relStatus = $this->GetVarAttribute($token[0],'relevanceStatus',1); - } - if ($relStatus==1) - { - $result = array($this->GetVarAttribute($token[0],NULL,''),$token[1],'NUMBER'); - } - else - { - $result = array(NULL,$token[1],'NUMBER'); // was 0 instead of NULL - } - $this->RDP_StackPush($result); - - // TODO - currently, will try to process value anyway, but want to show a potential error. Should it be a definitive error (e.g. prevent this behavior)? - $groupSeq = $this->GetVarAttribute($token[0],'gseq',-1); - if (($groupSeq != -1 && $this->groupSeq != -1) && ($groupSeq > $this->groupSeq)) - { - $this->RDP_AddError($this->gT("This variable is not declared until a later page"),$token); - return false; - } - return true; - } - else - { - $this->RDP_AddError($this->gT("Undefined variable"), $token); - return false; - } - } - break; - case 'COMMA': - --$this->RDP_pos; - $this->RDP_AddError($this->gT("Should never get to this line?"),$token); - return false; - default: - return false; - break; - } - } - - /** - * Process "a == b", "a eq b", "a != b", "a ne b" - * @return boolean - true if success, false if any error occurred - */ - private function RDP_EvaluateEqualityExpression() - { - if (!$this->RDP_EvaluateRelationExpression()) - { - return false; - } - while (($this->RDP_pos + 1) < $this->RDP_count) - { - $token = $this->RDP_tokens[++$this->RDP_pos]; - switch (strtolower($token[0])) - { - case '==': - case 'eq': - case '!=': - case 'ne': - if ($this->RDP_EvaluateRelationExpression()) - { - if (!$this->RDP_EvaluateBinary($token)) - { - return false; - } - // else continue; - } - else - { - return false; - } - break; - default: - --$this->RDP_pos; - return true; - } - } - return true; - } - - /** - * Process a single expression (e.g. without commas) - * @return boolean - true if success, false if any error occurred - */ - - private function RDP_EvaluateExpression() - { - if ($this->RDP_pos + 2 < $this->RDP_count) - { - $token1 = $this->RDP_tokens[++$this->RDP_pos]; - $token2 = $this->RDP_tokens[++$this->RDP_pos]; - if ($token2[2] == 'ASSIGN') - { - if ($this->RDP_isValidVariable($token1[0])) - { - $this->varsUsed[] = $token1[0]; // add this variable to list of those used in this equation - if ($this->RDP_isWritableVariable($token1[0])) - { - $evalStatus = $this->RDP_EvaluateLogicalOrExpression(); - if ($evalStatus) - { - $result = $this->RDP_StackPop(); - if (!is_null($result)) - { - $newResult = $token2; - $newResult[2] = 'NUMBER'; - $newResult[0] = $this->RDP_SetVariableValue($token2[0], $token1[0], $result[0]); - $this->RDP_StackPush($newResult); - } - else - { - $evalStatus = false; - } - } - return $evalStatus; - } - else - { - $this->RDP_AddError($this->gT('The value of this variable can not be changed'), $token1); - return false; - } - } - else - { - $this->RDP_AddError($this->gT('Only variables can be assigned values'), $token1); - return false; - } - } - else - { - // not an assignment expression, so try something else - $this->RDP_pos -= 2; - return $this->RDP_EvaluateLogicalOrExpression(); - } - } - else - { - return $this->RDP_EvaluateLogicalOrExpression(); - } - } - - /** - * Process "expression [, expression]* - * @return boolean - true if success, false if any error occurred - */ - - private function RDP_EvaluateExpressions() - { - $evalStatus = $this->RDP_EvaluateExpression(); - if (!$evalStatus) - { - return false; - } - - while (++$this->RDP_pos < $this->RDP_count) { - $token = $this->RDP_tokens[$this->RDP_pos]; - if ($token[2] == 'RP') - { - return true; // presumbably the end of an expression - } - elseif ($token[2] == 'COMMA') - { - if ($this->RDP_EvaluateExpression()) - { - $secondResult = $this->RDP_StackPop(); - $firstResult = $this->RDP_StackPop(); - if (is_null($firstResult)) - { - return false; - } - $this->RDP_StackPush($secondResult); - $evalStatus = true; - } - else - { - return false; // an error must have occurred - } - } - else - { - $this->RDP_AddError($this->gT("Expected expressions separated by commas"),$token); - $evalStatus = false; - break; - } - } - while (++$this->RDP_pos < $this->RDP_count) - { - $token = $this->RDP_tokens[$this->RDP_pos]; - $this->RDP_AddError($this->gT("Extra token found after Expressions"),$token); - $evalStatus = false; - } - return $evalStatus; - } - - /** - * Process a function call - * @return boolean - true if success, false if any error occurred - */ - private function RDP_EvaluateFunction() - { - $funcNameToken = $this->RDP_tokens[$this->RDP_pos]; // note that don't need to increment position for functions - $funcName = $funcNameToken[0]; - if (!$this->RDP_isValidFunction($funcName)) - { - $this->RDP_AddError($this->gT("Undefined Function"), $funcNameToken); - return false; - } - $token2 = $this->RDP_tokens[++$this->RDP_pos]; - if ($token2[2] != 'LP') - { - $this->RDP_AddError($this->gT("Expected left parentheses after function name"), $funcNameToken); - } - $params = array(); // will just store array of values, not tokens - while ($this->RDP_pos + 1 < $this->RDP_count) - { - $token3 = $this->RDP_tokens[$this->RDP_pos + 1]; - if (count($params) > 0) - { - // should have COMMA or RP - if ($token3[2] == 'COMMA') - { - ++$this->RDP_pos; // consume the token so can process next clause - if ($this->RDP_EvaluateExpression()) - { - $value = $this->RDP_StackPop(); - if (is_null($value)) - { - return false; - } - $params[] = $value[0]; - continue; - } - else - { - $this->RDP_AddError($this->gT("Extra comma found in function"), $token3); - return false; - } - } - } - if ($token3[2] == 'RP') - { - ++$this->RDP_pos; // consume the token so can process next clause - return $this->RDP_RunFunction($funcNameToken,$params); - } - else - { - if ($this->RDP_EvaluateExpression()) - { - $value = $this->RDP_StackPop(); - if (is_null($value)) - { - return false; - } - $params[] = $value[0]; - continue; - } - else - { - return false; - } - } - } - } - - /** - * Process "a && b" or "a and b" - * @return boolean - true if success, false if any error occurred - */ - - private function RDP_EvaluateLogicalAndExpression() - { - if (!$this->RDP_EvaluateEqualityExpression()) - { - return false; - } - while (($this->RDP_pos + 1) < $this->RDP_count) - { - $token = $this->RDP_tokens[++$this->RDP_pos]; - switch (strtolower($token[0])) - { - case '&&': - case 'and': - if ($this->RDP_EvaluateEqualityExpression()) - { - if (!$this->RDP_EvaluateBinary($token)) - { - return false; - } - // else continue - } - else - { - return false; // an error must have occurred - } - break; - default: - --$this->RDP_pos; - return true; - } - } - return true; - } - - /** - * Process "a || b" or "a or b" - * @return boolean - true if success, false if any error occurred - */ - private function RDP_EvaluateLogicalOrExpression() - { - if (!$this->RDP_EvaluateLogicalAndExpression()) - { - return false; - } - while (($this->RDP_pos + 1) < $this->RDP_count) - { - $token = $this->RDP_tokens[++$this->RDP_pos]; - switch (strtolower($token[0])) - { - case '||': - case 'or': - if ($this->RDP_EvaluateLogicalAndExpression()) - { - if (!$this->RDP_EvaluateBinary($token)) - { - return false; - } - // else continue - } - else - { - // an error must have occurred - return false; - } - break; - default: - // no more expressions being ORed together, so continue parsing - --$this->RDP_pos; - return true; - } - } - // no more tokens to parse - return true; - } - - /** - * Process "a op b" where op in (*,/) - * @return boolean - true if success, false if any error occurred - */ - - private function RDP_EvaluateMultiplicativeExpression() - { - if (!$this->RDP_EvaluateUnaryExpression()) - { - return false; - } - while (($this->RDP_pos + 1) < $this->RDP_count) - { - $token = $this->RDP_tokens[++$this->RDP_pos]; - if ($token[2] == 'BINARYOP') - { - switch ($token[0]) - { - case '*': - case '/'; - if ($this->RDP_EvaluateUnaryExpression()) - { - if (!$this->RDP_EvaluateBinary($token)) - { - return false; - } - // else continue - } - else - { - // an error must have occurred - return false; - } - break; - break; - default: - --$this->RDP_pos; - return true; - } - } - else - { - --$this->RDP_pos; - return true; - } - } - return true; - } - - /** - * Process expressions including functions and parenthesized blocks - * @return boolean - true if success, false if any error occurred - */ - - private function RDP_EvaluatePrimaryExpression() - { - if (($this->RDP_pos + 1) >= $this->RDP_count) { - $this->RDP_AddError($this->gT("Poorly terminated expression - expected a constant or variable"), NULL); - return false; - } - $token = $this->RDP_tokens[++$this->RDP_pos]; - if ($token[2] == 'LP') - { - if (!$this->RDP_EvaluateExpressions()) - { - return false; - } - $token = $this->RDP_tokens[$this->RDP_pos]; - if ($token[2] == 'RP') - { - return true; - } - else - { - $this->RDP_AddError($this->gT("Expected right parentheses"), $token); - return false; - } - } - else - { - --$this->RDP_pos; - return $this->RDP_EvaluateConstantVarOrFunction(); - } - } - - /** - * Process "a op b" where op in (lt, gt, le, ge, <, >, <=, >=) - * @return boolean - true if success, false if any error occurred - */ - private function RDP_EvaluateRelationExpression() - { - if (!$this->RDP_EvaluateAdditiveExpression()) - { - return false; - } - while (($this->RDP_pos + 1) < $this->RDP_count) - { - $token = $this->RDP_tokens[++$this->RDP_pos]; - switch (strtolower($token[0])) - { - case '<': - case 'lt': - case '<='; - case 'le': - case '>': - case 'gt': - case '>='; - case 'ge': - if ($this->RDP_EvaluateAdditiveExpression()) - { - if (!$this->RDP_EvaluateBinary($token)) - { - return false; - } - // else continue - } - else - { - // an error must have occurred - return false; - } - break; - default: - --$this->RDP_pos; - return true; - } - } - return true; - } - - /** - * Process "op a" where op in (+,-,!) - * @return boolean - true if success, false if any error occurred - */ - - private function RDP_EvaluateUnaryExpression() - { - if (($this->RDP_pos + 1) >= $this->RDP_count) { - $this->RDP_AddError($this->gT("Poorly terminated expression - expected a constant or variable"), NULL); - return false; - } - $token = $this->RDP_tokens[++$this->RDP_pos]; - if ($token[2] == 'NOT' || $token[2] == 'BINARYOP') - { - switch ($token[0]) - { - case '+': - case '-': - case '!': - if (!$this->RDP_EvaluatePrimaryExpression()) - { - return false; - } - return $this->RDP_EvaluateUnary($token); - break; - default: - --$this->RDP_pos; - return $this->RDP_EvaluatePrimaryExpression(); - } - } - else - { - --$this->RDP_pos; - return $this->RDP_EvaluatePrimaryExpression(); - } - } - - /** - * Returns array of all JavaScript-equivalent variable names used when parsing a string via sProcessStringContainingExpressions - * @return - */ - public function GetAllJsVarsUsed() - { - if (is_null($this->allVarsUsed)){ - return array(); - } - $names = array_unique($this->allVarsUsed); - if (is_null($names)) { - return array(); - } - $jsNames = array(); - foreach ($names as $name) - { - if (preg_match("/\.(gid|grelevance|gseq|jsName|mandatory|qid|qseq|question|readWrite|relevance|rowdivid|sgqa|type)$/",$name)) - { - continue; - } - $val = $this->GetVarAttribute($name,'jsName',''); - if ($val != '') { - $jsNames[] = $val; - } - } - return array_unique($jsNames); - } - - /** - * Return the list of all of the JavaScript variables used by the most recent expression - only those that are set on the current page - * This is used to control static vs dynamic substitution. If an expression is entirely made up of off-page changes, it can be statically replaced. - * @return - */ - public function GetOnPageJsVarsUsed() - { - if (is_null($this->varsUsed)){ - return array(); - } - if ($this->surveyMode=='survey') - { - return $this->GetJsVarsUsed(); - } - $names = array_unique($this->varsUsed); - if (is_null($names)) { - return array(); - } - $jsNames = array(); - foreach ($names as $name) - { - if (preg_match("/\.(gid|grelevance|gseq|jsName|mandatory|qid|qseq|question|readWrite|relevance|rowdivid|sgqa|type)$/",$name)) - { - continue; - } - $val = $this->GetVarAttribute($name,'jsName',''); - switch ($this->surveyMode) - { - case 'group': - $gseq = $this->GetVarAttribute($name,'gseq',''); - $onpage = ($gseq == $this->groupSeq); - break; - case 'question': - $qseq = $this->GetVarAttribute($name,'qseq',''); - $onpage = ($qseq == $this->questionSeq); - break; - case 'survey': - $onpage = true; - break; - } - if ($val != '' && $onpage) { - $jsNames[] = $val; - } - } - return array_unique($jsNames); - } - - /** - * Return the list of all of the JavaScript variables used by the most recent expression - * @return - */ - public function GetJsVarsUsed() - { - if (is_null($this->varsUsed)){ - return array(); - } - $names = array_unique($this->varsUsed); - if (is_null($names)) { - return array(); - } - $jsNames = array(); - foreach ($names as $name) - { - if (preg_match("/\.(gid|grelevance|gseq|jsName|mandatory|qid|qseq|question|readWrite|relevance|rowdivid|sgqa|type)$/",$name)) - { - continue; - } - $val = $this->GetVarAttribute($name,'jsName',''); - if ($val != '') { - $jsNames[] = $val; - } - } - return array_unique($jsNames); - } - - /** - * Return the JavaScript variable name for a named variable - * @param $name - * @return - */ - public function GetJsVarFor($name) - { - return $this->GetVarAttribute($name,'jsName',''); - } - - /** - * Returns array of all variables used when parsing a string via sProcessStringContainingExpressions - * @return - */ - public function GetAllVarsUsed() - { - return array_unique($this->allVarsUsed); - } - - /** - * Return the result of evaluating the equation - NULL if error - * @return mixed - */ - public function GetResult() - { - return $this->RDP_result[0]; - } - - /** - * Return an array of errors - * @return array - */ - public function GetErrors() - { - return $this->RDP_errs; - } - - /** - * Converts the most recent expression into a valid JavaScript expression, mapping function and variable names and operators as needed. - * @return the JavaScript expresssion - */ - public function GetJavaScriptEquivalentOfExpression() - { - if (!is_null($this->jsExpression)) - { - return $this->jsExpression; - } - if ($this->HasErrors()) - { - $this->jsExpression = ''; - return ''; - } - $tokens = $this->RDP_tokens; - $stringParts=array(); - $numTokens = count($tokens); - for ($i=0;$i<$numTokens;++$i) - { - $token = $tokens[$i]; - // When do these need to be quoted? - - switch ($token[2]) - { - case 'DQ_STRING': - $stringParts[] = '"' . addcslashes($token[0],'\"') . '"'; // htmlspecialchars($token[0],ENT_QUOTES,'UTF-8',false) . "'"; - break; - case 'SQ_STRING': - $stringParts[] = "'" . addcslashes($token[0],"\'") . "'"; // htmlspecialchars($token[0],ENT_QUOTES,'UTF-8',false) . "'"; - break; - case 'SGQA': - case 'WORD': - if ($i+1<$numTokens && $tokens[$i+1][2] == 'LP') - { - // then word is a function name - $funcInfo = $this->RDP_ValidFunctions[$token[0]]; - if ($funcInfo[1] == 'NA') - { - return ''; // to indicate that this is trying to use a undefined function. Need more graceful solution - } - $stringParts[] = $funcInfo[1]; // the PHP function name - } - elseif ($i+1<$numTokens && $tokens[$i+1][2] == 'ASSIGN') - { - $jsName = $this->GetVarAttribute($token[0],'jsName',''); - $stringParts[] = "document.getElementById('" . $jsName . "').value"; - if ($tokens[$i+1][0] == '+=') - { - // Javascript does concatenation unless both left and right side are numbers, so refactor the equation - $varName = $this->GetVarAttribute($token[0],'varName',$token[0]); - $stringParts[] = " = LEMval('" . $varName . "') + "; - ++$i; - } - } - else - { - $jsName = $this->GetVarAttribute($token[0],'jsName',''); - $code = $this->GetVarAttribute($token[0],'code',''); - if ($jsName != '') - { - $varName = $this->GetVarAttribute($token[0],'varName',$token[0]); - $stringParts[] = "LEMval('" . $varName . "') "; - } - else - { - $stringParts[] = is_numeric($code) ? $code : ("'" . addcslashes($code,"'") . "'"); // htmlspecialchars($code,ENT_QUOTES,'UTF-8',false) . "'"); - } - } - break; - case 'LP': - case 'RP': - $stringParts[] = $token[0]; - break; - case 'NUMBER': - $stringParts[] = is_numeric($token[0]) ? $token[0] : ("'" . $token[0] . "'"); - break; - case 'COMMA': - $stringParts[] = $token[0] . ' '; - break; - default: - // don't need to check type of $token[2] here since already handling SQ_STRING and DQ_STRING above - switch (strtolower($token[0])) - { - case 'and': $stringParts[] = ' && '; break; - case 'or': $stringParts[] = ' || '; break; - case 'lt': $stringParts[] = ' < '; break; - case 'le': $stringParts[] = ' <= '; break; - case 'gt': $stringParts[] = ' > '; break; - case 'ge': $stringParts[] = ' >= '; break; - case 'eq': case '==': $stringParts[] = ' == '; break; - case 'ne': case '!=': $stringParts[] = ' != '; break; - default: $stringParts[] = ' ' . $token[0] . ' '; break; - } - break; - } - } - // for each variable that does not have a default value, add clause to throw error if any of them are NA - $nonNAvarsUsed = array(); - foreach ($this->GetVarsUsed() as $var) // this function wants to see the NAOK suffix - { - if (!preg_match("/^.*\.(NAOK|relevanceStatus)$/", $var)) - { - if ($this->GetVarAttribute($var,'jsName','') != '') - { - $nonNAvarsUsed[] = $var; - } - } - } - $mainClause = implode('', $stringParts); - $varsUsed = implode("', '", $nonNAvarsUsed); - if ($varsUsed != '') - { - $this->jsExpression = "LEMif(LEManyNA('" . $varsUsed . "'),'',(" . $mainClause . "))"; - } - else - { - $this->jsExpression = '(' . $mainClause . ')'; - } - return $this->jsExpression; - } - - /** - * JavaScript Test function - simply writes the result of the current JavaScriptEquivalentFunction to the output buffer. - * @return - */ - public function GetJavascriptTestforExpression($expected,$num) - { - // assumes that the hidden variables have already been declared - $expr = $this->GetJavaScriptEquivalentOfExpression(); - if (is_null($expr) || $expr == '') { - $expr = "'NULL'"; - } - $jsmultiline_expr = str_replace("\n","\\\n",$expr); - $jsmultiline_expected = str_replace("\n","\\\n",addslashes($expected)); - $jsParts = array(); - $jsParts[] = "val = " . $jsmultiline_expr . ";\n"; - $jsParts[] = "klass = (LEMeq(addslashes(val),'" . $jsmultiline_expected . "')) ? 'ok' : 'error';\n"; - $jsParts[] = "document.getElementById('test_" . $num . "').innerHTML=(val);\n"; - $jsParts[] = "document.getElementById('test_" . $num . "').className=klass;\n"; - return implode('',$jsParts); - - } - - /** - * Generate the function needed to dynamically change the value of a section - * @param $name - the ID name for the function - * @return - */ - public function GetJavaScriptFunctionForReplacement($questionNum, $name,$eqn) - { - $jsParts = array(); - $jsParts[] = " try{\n"; - $jsParts[] = " document.getElementById('" . $name . "').innerHTML=LEMfixnum(\n "; - $jsParts[] = $this->GetJavaScriptEquivalentOfExpression(); - $jsParts[] = ");\n"; - $jsParts[] = " } catch (e) { }\n"; - return implode('',$jsParts); - } - - /** - * Returns the most recent PrettyPrint string generated by sProcessStringContainingExpressions - */ - public function GetLastPrettyPrintExpression() - { - return $this->prettyPrintSource; - } - - /** - * This is only used when there are no needed substitutions - * @param $expr - */ - public function SetPrettyPrintSource($expr) - { - $this->prettyPrintSource = $expr; - } - - /** - * Color-codes Expressions (using HTML tags), showing variable types and values. - * @return - */ - public function GetPrettyPrintString() - { - // color code the equation, showing not only errors, but also variable attributes - $errs = $this->RDP_errs; - $tokens = $this->RDP_tokens; - $errCount = count($errs); - $errIndex = 0; - if ($errCount > 0) - { - usort($errs,"cmpErrorTokens"); - } - $errSpecificStyle= "style='border-style: solid; border-width: 2px; border-color: red;'"; - $stringParts=array(); - $numTokens = count($tokens); - $globalErrs=array(); - while ($errIndex < $errCount) - { - if ($errs[$errIndex++][1][1]==0) - { - // General message, associated with position 0 - $globalErrs[] = $errs[$errIndex-1][0]; - } - else - { - --$errIndex; - break; - } - } - for ($i=0;$i<$numTokens;++$i) - { - $token = $tokens[$i]; - $messages=array(); - $thisTokenHasError=false; - if ($i==0 && count($globalErrs) > 0) - { - $messages = array_merge($messages,$globalErrs); - $thisTokenHasError=true; - } - if ($errIndex < $errCount && $token[1] == $errs[$errIndex][1][1]) - { - $messages[] = $errs[$errIndex][0]; - $thisTokenHasError=true; - } - if ($thisTokenHasError) - { - $stringParts[] = ""; - } - switch ($token[2]) - { - case 'DQ_STRING': - $stringParts[] = "\""; - $stringParts[] = $token[0]; // htmlspecialchars($token[0],ENT_QUOTES,'UTF-8',false); - $stringParts[] = "\""; - break; - case 'SQ_STRING': - $stringParts[] = "'"; - $stringParts[] = $token[0]; // htmlspecialchars($token[0],ENT_QUOTES,'UTF-8',false); - $stringParts[] = "'"; - break; - case 'SGQA': - case 'WORD': - if ($i+1<$numTokens && $tokens[$i+1][2] == 'LP') - { - // then word is a function name - if ($this->RDP_isValidFunction($token[0])) { - $funcInfo = $this->RDP_ValidFunctions[$token[0]]; - $messages[] = $funcInfo[2]; - $messages[] = $funcInfo[3]; - } - $stringParts[] = ""; - $stringParts[] = $token[0]; - $stringParts[] = ""; - } - else - { - if (!$this->RDP_isValidVariable($token[0])) - { - $color = 'red'; - $displayName = $token[0]; - } - else - { - $jsName = $this->GetVarAttribute($token[0],'jsName',''); - $code = $this->GetVarAttribute($token[0],'code',''); - $question = $this->GetVarAttribute($token[0], 'question', ''); - $qcode= $this->GetVarAttribute($token[0],'qcode',''); - $questionSeq = $this->GetVarAttribute($token[0],'qseq',-1); - $groupSeq = $this->GetVarAttribute($token[0],'gseq',-1); - $ansList = $this->GetVarAttribute($token[0],'ansList',''); - $gid = $this->GetVarAttribute($token[0],'gid',-1); - $qid = $this->GetVarAttribute($token[0],'qid',-1); - - if ($jsName != '') { - $descriptor = '[' . $jsName . ']'; - } - else { - $descriptor = ''; - } - // Show variable name instead of SGQA code, if available - if ($qcode != '') { - if (preg_match('/^INSERTANS:/',$token[0])) { - $displayName = $qcode . '.shown'; - $descriptor = '[' . $token[0] . ']'; - } - else { - $args = explode('.',$token[0]); - if (count($args) == 2) { - $displayName = $qcode . '.' . $args[1]; - } - else { - $displayName = $qcode; - } - } - } - else { - $displayName = $token[0]; - } - if ($questionSeq != -1) { - $descriptor .= '[G:' . $groupSeq . ']'; - } - if ($groupSeq != -1) { - $descriptor .= '[Q:' . $questionSeq . ']'; - } - if (strlen($descriptor) > 0) { - $descriptor .= ': '; - } - - if (version_compare(phpversion(), "5.2.3")>=0) - { - // 4th parameter to htmlspecialchars only became available in PHP version 5.2.3 - $messages[] = $descriptor . htmlspecialchars($question,ENT_QUOTES,'UTF-8',false); - if ($ansList != '') - { - $messages[] = htmlspecialchars($ansList,ENT_QUOTES,'UTF-8',false); - } - if ($code != '') { - if ($token[2] == 'SGQA' && preg_match('/^INSERTANS:/',$token[0])) { - $shown = $this->GetVarAttribute($token[0], 'shown', ''); - $messages[] = 'value=[' . htmlspecialchars($code,ENT_QUOTES,'UTF-8',false) . '] ' - . htmlspecialchars($shown,ENT_QUOTES,'UTF-8',false); - } - else { - $messages[] = 'value=' . htmlspecialchars($code,ENT_QUOTES,'UTF-8',false); - } - } - } - else - { - $messages[] = $descriptor . htmlspecialchars($question,ENT_QUOTES,'UTF-8'); - if ($ansList != '') - { - $messages[] = htmlspecialchars($ansList,ENT_QUOTES,'UTF-8'); - } - if ($code != '') { - if ($token[2] == 'SGQA' && preg_match('/^INSERTANS:/',$token[0])) { - $shown = $this->GetVarAttribute($token[0], 'shown', ''); - $messages[] = 'value=[' . htmlspecialchars($code,ENT_QUOTES,'UTF-8') . '] ' - . htmlspecialchars($shown,ENT_QUOTES,'UTF-8'); - } - else { - $messages[] = 'value=' . htmlspecialchars($code,ENT_QUOTES,'UTF-8'); - } - } - } - if ($this->groupSeq == -1 || $groupSeq == -1 || $questionSeq == -1 || $this->questionSeq == -1) { - $color = '#996600'; // tan - } - else if ($groupSeq > $this->groupSeq) { - $color = '#FF00FF '; // pink a likely error - } - else if ($groupSeq < $this->groupSeq) { - $color = 'green'; - } - else if ($questionSeq > $this->questionSeq) { - $color = 'maroon'; // #228b22 - warning - } - else { - $color = '#4C88BE'; // cyan that goes well with the background color - } - } - // prevent EM prcessing of messages within span - $message = implode('; ',$messages); - $message = str_replace(array('{','}'), array('{ ', ' }'), $message); - - $stringParts[] = "hyperlinkSyntaxHighlighting && isset($gid) && isset($qid)) { - // Modify this link to utilize a different framework - $editlink = $this->rooturl . '/admin/admin.php?sid=' . $this->sid . '&gid=' . $gid . '&qid=' . $qid; - $stringParts[] = " onclick='window.open(\"" . $editlink . "\");'"; - } - $stringParts[] = ">"; - if ($this->sgqaNaming) - { - $sgqa = substr($jsName,4); - $nameParts = explode('.',$displayName); - if (count($nameParts)==2) - { - $sgqa .= '.' . $nameParts[1]; - } - $stringParts[] = $sgqa; - } - else - { - $stringParts[] = $displayName; - } - $stringParts[] = ""; - } - break; - case 'ASSIGN': - $messages[] = 'Assigning a new value to a variable'; - $stringParts[] = ""; - $stringParts[] = $token[0]; - $stringParts[] = ""; - break; - case 'COMMA': - $stringParts[] = $token[0] . ' '; - break; - case 'LP': - case 'RP': - case 'NUMBER': - $stringParts[] = $token[0]; - break; - default: - $stringParts[] = ' ' . $token[0] . ' '; - break; - } - if ($thisTokenHasError) - { - $stringParts[] = ""; - ++$errIndex; - } - } - return "" . implode('', $stringParts) . ""; - } - - /** - * Get information about the variable, including JavaScript name, read-write status, and whether set on current page. - * @param $varname - * @return - */ - private function GetVarAttribute($name,$attr,$default) - { - return LimeExpressionManager::GetVarAttribute($name,$attr,$default,$this->groupSeq,$this->questionSeq); - } - - /** - * Return array of the list of variables used in the equation - * @return array - */ - public function GetVarsUsed() - { - return array_unique($this->varsUsed); - } - - /** - * Return true if there were syntax or processing errors - * @return boolean - */ - public function HasErrors() - { - return (count($this->RDP_errs) > 0); - } - - /** - * Return true if there are syntax errors - * @return boolean - */ - private function HasSyntaxErrors() - { - // check for bad tokens - // check for unmatched parentheses - // check for undefined variables - // check for undefined functions (but can't easily check allowable # elements?) - - $nesting = 0; - - for ($i=0;$i<$this->RDP_count;++$i) - { - $token = $this->RDP_tokens[$i]; - switch ($token[2]) - { - case 'LP': - ++$nesting; - break; - case 'RP': - --$nesting; - if ($nesting < 0) - { - $this->RDP_AddError($this->gT("Extra right parentheses detected"), $token); - } - break; - case 'WORD': - case 'SGQA': - if ($i+1 < $this->RDP_count and $this->RDP_tokens[$i+1][2] == 'LP') - { - if (!$this->RDP_isValidFunction($token[0])) - { - $this->RDP_AddError($this->gT("Undefined function"), $token); - } - } - else - { - if (!($this->RDP_isValidVariable($token[0]))) - { - $this->RDP_AddError($this->gT("Undefined variable"), $token); - } - } - break; - case 'OTHER': - $this->RDP_AddError($this->gT("Unsupported syntax"), $token); - break; - default: - break; - } - } - if ($nesting != 0) - { - $this->RDP_AddError(sprintf($this->gT("Missing %s closing right parentheses"),$nesting),NULL); - } - return (count($this->RDP_errs) > 0); - } - - /** - * Return true if the function name is registered - * @param $name - * @return boolean - */ - - private function RDP_isValidFunction($name) - { - return array_key_exists($name,$this->RDP_ValidFunctions); - } - - /** - * Return true if the variable name is registered - * @param $name - * @return boolean - */ - private function RDP_isValidVariable($name) - { - $varName = preg_replace("/^(?:INSERTANS:)?(.*?)(?:\.(?:" . ExpressionManager::$RDP_regex_var_attr . "))?$/", "$1", $name); - return LimeExpressionManager::isValidVariable($varName); - } - - /** - * Return true if the variable name is writable - * @param $name - * @return - */ - private function RDP_isWritableVariable($name) - { - return ($this->GetVarAttribute($name, 'readWrite', 'N') == 'Y'); - } - - /** - * Process an expression and return its boolean value - * @param $expr - * @param $groupSeq - needed to determine whether using variables before they are declared - * @param $questionSeq - needed to determine whether using variables before they are declared - * @return - */ - public function ProcessBooleanExpression($expr,$groupSeq=-1,$questionSeq=-1) - { - $this->groupSeq = $groupSeq; - $this->questionSeq = $questionSeq; - - $expr = $this->ExpandThisVar($expr); - $status = $this->RDP_Evaluate($expr); - if (!$status) { - return false; // if there are errors in the expression, hide it? - } - $result = $this->GetResult(); - if (is_null($result)) { - return false; // if there are errors in the expression, hide it? - } - - // Check whether any variables are irrelevant - making this comparable to JavaScript which uses LEManyNA(varlist) to do the same thing - foreach ($this->GetVarsUsed() as $var) // this function wants to see the NAOK suffix - { - if (!preg_match("/^.*\.(NAOK|relevanceStatus)$/", $var)) - { - if (!LimeExpressionManager::GetVarAttribute($var,'relevanceStatus',false,$groupSeq,$questionSeq)) - { - return false; - } - } - } - return (boolean) $result; - } - - /** - * Start processing a group of substitions - will be incrementally numbered - * - * @param int $sid - * @param string $rooturl - * @param boolean $hyperlinkSyntaxHighlighting - * @param string $surveyMode survey|group|question - */ - public function StartProcessingGroup($sid=NULL,$rooturl='',$hyperlinkSyntaxHighlighting=false) - { - $this->substitutionNum=0; - $this->substitutionInfo=array(); // array of JavaScripts for managing each substitution - $this->sid=$sid; - $this->rooturl=$rooturl; - $this->hyperlinkSyntaxHighlighting=$hyperlinkSyntaxHighlighting; - } - - /** - * Clear cache of tailoring content. - * When re-displaying same page, need to avoid generating double the amount of tailoring content. - */ - public function ClearSubstitutionInfo() - { - $this->substitutionNum=0; - $this->substitutionInfo=array(); // array of JavaScripts for managing each substitution - } - - /** - * Process multiple substitution iterations of a full string, containing multiple expressions delimited by {}, return a consolidated string - * @param $src - * @param $questionNum - * @param $numRecursionLevels - number of levels of recursive substitution to perform - * @param $whichPrettyPrintIteration - if recursing, specify which pretty-print iteration is desired - * @param $groupSeq - needed to determine whether using variables before they are declared - * @param $questionSeq - needed to determine whether using variables before they are declared - * @return - */ - - public function sProcessStringContainingExpressions($src, $questionNum=0, $numRecursionLevels=1, $whichPrettyPrintIteration=1, $groupSeq=-1, $questionSeq=-1, $staticReplacement=false) - { - // tokenize string by the {} pattern, properly dealing with strings in quotations, and escaped curly brace values - $this->allVarsUsed = array(); - $this->questionSeq = $questionSeq; - $this->groupSeq = $groupSeq; - $result = $src; - $prettyPrint = ''; - $errors = array(); - - for($i=1;$i<=$numRecursionLevels;++$i) - { - // TODO - Since want to use for dynamic substitution, what if there are recursive substititons? - $result = $this->sProcessStringContainingExpressionsHelper($result,$questionNum, $staticReplacement); - if ($i == $whichPrettyPrintIteration) - { - $prettyPrint = $this->prettyPrintSource; - } - $errors = array_merge($errors, $this->RDP_errs); - } - $this->prettyPrintSource = $prettyPrint; // ensure that if doing recursive substition, can get original source to pretty print - $result = str_replace(array('\{', '\}',), array('{', '}'), $result); - $this->RDP_errs = $errors; - return $result; - } - - /** - * Process one substitution iteration of a full string, containing multiple expressions delimited by {}, return a consolidated string - * @param $src - * @param $questionNum - used to generate substitution s that indicate to which question they belong - * @return - */ - - public function sProcessStringContainingExpressionsHelper($src, $questionNum, $staticReplacement=false) - { - // tokenize string by the {} pattern, properly dealing with strings in quotations, and escaped curly brace values - $stringParts = $this->asSplitStringOnExpressions($src); - - $resolvedParts = array(); - $prettyPrintParts = array(); - $allErrors=array(); - - foreach ($stringParts as $stringPart) - { - if ($stringPart[2] == 'STRING') { - $resolvedParts[] = $stringPart[0]; - $prettyPrintParts[] = $stringPart[0]; - } - else { - ++$this->substitutionNum; - $expr = $this->ExpandThisVar(substr($stringPart[0],1,-1)); - if ($this->RDP_Evaluate($expr)) - { - $resolvedPart = $this->GetResult(); - } - else - { - // show original and errors in-line - $resolvedPart = $this->GetPrettyPrintString(); - $allErrors[] = $this->GetErrors(); - } - $onpageJsVarsUsed = $this->GetOnPageJsVarsUsed(); - $jsVarsUsed = $this->GetJsVarsUsed(); - $prettyPrintParts[] = $this->GetPrettyPrintString(); - $this->allVarsUsed = array_merge($this->allVarsUsed,$this->GetVarsUsed()); - - if (count($onpageJsVarsUsed) > 0 && !$staticReplacement) - { - $idName = "LEMtailor_Q_" . $questionNum . "_" . $this->substitutionNum; - $resolvedParts[] = "" . $resolvedPart . ""; - $this->substitutionVars[$idName] = 1; - $this->substitutionInfo[] = array( - 'questionNum' => $questionNum, - 'num' => $this->substitutionNum, - 'id' => $idName, - 'raw' => $stringPart[0], - 'result' => $resolvedPart, - 'vars' => implode('|',$jsVarsUsed), - 'js' => $this->GetJavaScriptFunctionForReplacement($questionNum, $idName, $expr), - ); - } - else - { - $resolvedParts[] = $resolvedPart; - } - } - } - $result = implode('',$this->flatten_array($resolvedParts)); - $this->prettyPrintSource = implode('',$this->flatten_array($prettyPrintParts)); - $this->RDP_errs = $allErrors; // so that has all errors from this string - return $result; // recurse in case there are nested ones, avoiding infinite loops? - } - - /** - * If the equation contains refernece to this, expand to comma separated list if needed. - * @param type $eqn - */ - function ExpandThisVar($src) - { - $splitter = '(?:\b(?:self|that))(?:\.(?:[A-Z0-9_]+))*'; - $parts = preg_split("/(" . $splitter . ")/i",$src,-1,(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)); - $result = ''; - foreach ($parts as $part) - { - if (preg_match("/" . $splitter . "/",$part)) - { - $result .= LimeExpressionManager::GetAllVarNamesForQ($this->questionSeq,$part); - } - else - { - $result .= $part; - } - } - - return $result; - } - - /** - * Get info about all elements needed for dynamic tailoring - * @return - */ - public function GetCurrentSubstitutionInfo() - { - return $this->substitutionInfo; - } - - /** - * Flatten out an array, keeping it in the proper order - * @param array $a - * @return array - */ - - private function flatten_array(array $a) { - $i = 0; - while ($i < count($a)) { - if (is_array($a[$i])) { - array_splice($a, $i, 1, $a[$i]); - } else { - $i++; - } - } - return $a; - } - - - /** - * Run a registered function - * Some PHP functions require specific data types - those can be cast here. - * @param $funcNameToken - * @param $params - * @return boolean - */ - private function RDP_RunFunction($funcNameToken,$params) - { - $name = $funcNameToken[0]; - if (!$this->RDP_isValidFunction($name)) - { - return false; - } - $func = $this->RDP_ValidFunctions[$name]; - $funcName = $func[0]; - $numArgs = count($params); - $result=1; // default value for $this->RDP_onlyparse - - if (function_exists($funcName)) { - $numArgsAllowed = array_slice($func, 5); // get array of allowable argument counts from end of $func - $argsPassed = is_array($params) ? count($params) : 0; - - // for unlimited # parameters (any value less than 0). - try - { - if ($numArgsAllowed[0] < 0) { - $minArgs = abs($numArgsAllowed[0] + 1); // so if value is -2, means that requires at least one argument - if ($argsPassed < $minArgs) - { - $this->RDP_AddError(sprintf($this->gT("Function must have at least %s argument(s)"), $minArgs), $funcNameToken); - return false; - } - if (!$this->RDP_onlyparse) { - switch($funcName) { - case 'sprintf': - // PHP doesn't let you pass array of parameters to sprintf, so must use call_user_func_array - $result = call_user_func_array('sprintf',$params); - break; - default: - $result = $funcName($params); - break; - } - } - // Call function with the params passed - } elseif (in_array($argsPassed, $numArgsAllowed)) { - - switch ($argsPassed) { - case 0: - if (!$this->RDP_onlyparse) { - $result = $funcName(); - } - break; - case 1: - if (!$this->RDP_onlyparse) { - switch($funcName) { - case 'acos': - case 'asin': - case 'atan': - case 'cos': - case 'exp': - case 'is_nan': - case 'log': - case 'sin': - case 'sqrt': - case 'tan': - if (is_numeric($params[0])) - { - $result = $funcName(floatval($params[0])); - } - else - { - $result = NAN; - } - break; - default: - $result = $funcName($params[0]); - break; - } - } - break; - case 2: - if (!$this->RDP_onlyparse) { - switch($funcName) { - case 'atan2': - if (is_numeric($params[0]) && is_numeric($params[1])) - { - $result = $funcName(floatval($params[0]),floatval($params[1])); - } - else - { - $result = NAN; - } - break; - case 'mktime': - if (is_numeric($params[0]) && is_numeric($params[1])) - { - $result = $funcName(intval($params[0]),intval($params[1])); - } - else - { - $result = NAN; - } - break; - default: - $result = $funcName($params[0], $params[1]); - break; - } - } - break; - case 3: - if (!$this->RDP_onlyparse) { - $result = $funcName($params[0], $params[1], $params[2]); - } - break; - case 4: - if (!$this->RDP_onlyparse) { - $result = $funcName($params[0], $params[1], $params[2], $params[3]); - } - break; - case 5: - if (!$this->RDP_onlyparse) { - $result = $funcName($params[0], $params[1], $params[2], $params[3], $params[4]); - } - break; - case 6: - if (!$this->RDP_onlyparse) { - $result = $funcName($params[0], $params[1], $params[2], $params[3], $params[4], $params[5]); - } - break; - default: - $this->RDP_AddError(sprintf($this->gT("Unsupported number of arguments: %s", $argsPassed)), $funcNameToken); - return false; - } - - } else { - $this->RDP_AddError(sprintf($this->gT("Function does not support %s arguments. "), $argsPassed) - . sprintf($this->gT("Function supports this many arguments, where -1=unlimited: %s."), implode(',', $numArgsAllowed)), $funcNameToken); - return false; - } - } - catch (Exception $e) - { - $this->RDP_AddError($e->getMessage(),$funcNameToken); - return false; - } - $token = array($result,$funcNameToken[1],'NUMBER'); - $this->RDP_StackPush($token); - return true; - } - } - - /** - * Add user functions to array of allowable functions within the equation. - * $functions is an array of key to value mappings like this: - * See $this->RDP_ValidFunctions for examples of the syntax - * @param array $functions - */ - - public function RegisterFunctions(array $functions) { - $this->RDP_ValidFunctions= array_merge($this->RDP_ValidFunctions, $functions); - } - - /** - * Set the value of a registered variable - * @param $op - the operator (=,*=,/=,+=,-=) - * @param $name - * @param $value - */ - private function RDP_SetVariableValue($op,$name,$value) - { - if ($this->RDP_onlyparse) - { - return 1; - } - return LimeExpressionManager::SetVariableValue($op, $name, $value); - } - - /** - * Split a soure string into STRING vs. EXPRESSION, where the latter is surrounded by unescaped curly braces. - * This verson properly handles nested curly braces and curly braces within strings within curly braces - both of which are needed to better support JavaScript - * Users still need to add a space or carriage return after opening braces (and ideally before closing braces too) to avoid having them treated as expressions. - * @param $src - * @return string - */ - public function asSplitStringOnExpressions($src) - { - $parts = preg_split($this->RDP_ExpressionRegex,$src,-1,(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)); - $count = count($parts); - $tokens = array(); - $inSQString=false; - $inDQString=false; - $curlyDepth=0; - $thistoken=array(); - $offset=0; - for ($j=0;$j<$count;++$j) - { - switch($parts[$j]) - { - case '{': - if ($j < ($count-1) && preg_match('/\s|\n|\r/',substr($parts[$j+1],0,1))) - { - // don't count this as an expression if the opening brace is followed by whitespace - $thistoken[] = '{'; - $thistoken[] = $parts[++$j]; - } - else if ($inDQString || $inSQString) - { - // just push the curly brace - $thistoken[] = '{'; - } - else if ($curlyDepth>0) - { - // a nested curly brace - just push it - $thistoken[] = '{'; - ++$curlyDepth; - } - else - { - // then starting an expression - save the out-of-expression string - if (count($thistoken) > 0) - { - $_token = implode('',$thistoken); - $tokens[] = array( - $_token, - $offset, - 'STRING' - ); - $offset += strlen($_token); - } - $curlyDepth=1; - $thistoken = array(); - $thistoken[] = '{'; - } - break; - case '}': - // don't count this as an expression if the closing brace is preceded by whitespace - if ($j > 0 && preg_match('/\s|\n|\r/',substr($parts[$j-1],-1,1))) - { - $thistoken[] = '}'; - } - else if ($curlyDepth==0) - { - // just push the token - $thistoken[] = '}'; - } - else - { - if ($inSQString || $inDQString) - { - // just push the token - $thistoken[] = '}'; - } - else - { - --$curlyDepth; - if ($curlyDepth==0) - { - // then closing expression - $thistoken[] = '}'; - $_token = implode('',$thistoken); - $tokens[] = array( - $_token, - $offset, - 'EXPRESSION' - ); - $offset += strlen($_token); - $thistoken=array(); - } - else - { - // just push the token - $thistoken[] = '}'; - } - } - } - break; - case '\'': - $thistoken[] = '\''; - if ($curlyDepth==0) - { - // only counts as part of a string if it is already within an expression - } - else - { - if ($inDQString) - { - // then just push the single quote - } - else - { - if ($inSQString) { - $inSQString=false; // finishing a single-quoted string - } - else { - $inSQString=true; // starting a single-quoted string - } - } - } - break; - case '"': - $thistoken[] = '"'; - if ($curlyDepth==0) - { - // only counts as part of a string if it is already within an expression - } - else - { - if ($inSQString) - { - // then just push the double quote - } - else - { - if ($inDQString) { - $inDQString=false; // finishing a double-quoted string - } - else { - $inDQString=true; // starting a double-quoted string - } - } - } - break; - case '\\': - if ($j < ($count-1)) { - $thistoken[] = $parts[$j++]; - $thistoken[] = $parts[$j]; - } - break; - default: - $thistoken[] = $parts[$j]; - break; - } - } - if (count($thistoken) > 0) - { - $tokens[] = array( - implode('',$thistoken), - $offset, - 'STRING', - ); - } - return $tokens; - } - - /** - * Specify the survey mode for this survey. Options are 'survey', 'group', and 'question' - * @param type $mode - */ - public function SetSurveyMode($mode) - { - if (preg_match('/^group|question|survey$/',$mode)) - { - $this->surveyMode = $mode; - } - } - - /** - * Pop a value token off of the stack - * @return token - */ - - private function RDP_StackPop() - { - if (count($this->RDP_stack) > 0) - { - return array_pop($this->RDP_stack); - } - else - { - $this->RDP_AddError($this->gT("Tried to pop value off of empty stack"), NULL); - return NULL; - } - } - - /** - * Stack only holds values (number, string), not operators - * @param array $token - */ - - private function RDP_StackPush(array $token) - { - if ($this->RDP_onlyparse) - { - // If only parsing, still want to validate syntax, so use "1" for all variables - switch($token[2]) - { - case 'DQ_STRING': - case 'SQ_STRING': - $this->RDP_stack[] = array(1,$token[1],$token[2]); - break; - case 'NUMBER': - default: - $this->RDP_stack[] = array(1,$token[1],'NUMBER'); - break; - } - } - else - { - $this->RDP_stack[] = $token; - } - } - - /** - * Split the source string into tokens, removing whitespace, and categorizing them by type. - * - * @param $src - * @return array - */ - - private function RDP_Tokenize($src) - { - // $tokens0 = array of tokens from equation, showing value and offset position. Will include SPACE, which should be removed - $tokens0 = preg_split($this->RDP_TokenizerRegex,$src,-1,(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE)); - - // $tokens = array of tokens from equation, showing value, offsete position, and type. Will not contain SPACE, but will contain OTHER - $tokens = array(); - // Add token_type to $tokens: For each token, test each categorization in order - first match will be the best. - for ($j=0;$jRDP_CategorizeTokensRegex);++$i) - { - $token = $tokens0[$j][0]; - if (preg_match($this->RDP_CategorizeTokensRegex[$i],$token)) - { - if ($this->RDP_TokenType[$i] !== 'SPACE') { - $tokens0[$j][2] = $this->RDP_TokenType[$i]; - if ($this->RDP_TokenType[$i] == 'DQ_STRING' || $this->RDP_TokenType[$i] == 'SQ_STRING') - { - // remove outside quotes - $unquotedToken = str_replace(array('\"',"\'","\\\\"),array('"',"'",'\\'),substr($token,1,-1)); - $tokens0[$j][0] = $unquotedToken; - } - $tokens[] = $tokens0[$j]; // get first matching non-SPACE token type and push onto $tokens array - } - break; // only get first matching token type - } - } - } - return $tokens; - } - - /** - * Unit test the asSplitStringOnExpressions() function to ensure that accurately parses out all expressions - * surrounded by curly braces, allowing for strings and escaped curly braces. - */ - - static function UnitTestStringSplitter() - { - $tests = << INSERT61764X1X4),'children','pets')} than you do {if((INSERT61764X1X3 > INSERT61764X1X4),'pets','children')}, do you feel that the {if((INSERT61764X1X3 > INSERT61764X1X4),'pets','children')} are at a disadvantage? -Here is a String that failed to parse prior to fixing the preg_split() command to avoid recursive search of sub-strings: [{((617167X9X3241 == "Y" or 617167X9X3242 == "Y" or 617167X9X3243 == "Y" or 617167X9X3244 == "Y" or 617167X9X3245 == "Y" or 617167X9X3246 == "Y" or 617167X9X3247 == "Y" or 617167X9X3248 == "Y" or 617167X9X3249 == "Y") and (617167X9X3301 == "Y" or 617167X9X3302 == "Y" or 617167X9X3303 == "Y" or 617167X9X3304 == "Y" or 617167X9X3305 == "Y" or 617167X9X3306 == "Y" or 617167X9X3307 == "Y" or 617167X9X3308 == "Y" or 617167X9X3309 == "Y"))}] Here is the question. -EOD; - - $em = new ExpressionManager(); - - foreach(explode("\n",$tests) as $test) - { - $tokens = $em->asSplitStringOnExpressions($test); - print '' . $test . '
        '; - print ''; - print implode("
        \n",explode("\n",print_r($tokens,TRUE))); - print '

        '; - } - } - - /** - * Unit test the Tokenizer - Tokenize and generate a HTML-compatible print-out of a comprehensive set of test cases - */ - - static function UnitTestTokenizer() - { - // Comprehensive test cases for tokenizing - $tests = << >= < <= == != gt ge lt le eq ne (target large gents built agile less equal) - Assign: = += -= *= /= - SGQA: 1X6X12 1X6X12ber1 1X6X12ber1_lab1 3583X84X249 12X3X5lab1_ber#1 1X6X12.NAOK 1X6X12ber1.NAOK 1X6X12ber1_lab1.NAOK 3583X84X249.NAOK 12X3X5lab1_ber#1.NAOK - Errors: Apt # 10C; (2 > 0) ? 'hi' : 'there'; array[30]; >>> <<< /* this is not a comment */ // neither is this - Words: q5pointChoice q5pointChoice.bogus q5pointChoice.code q5pointChoice.mandatory q5pointChoice.NAOK q5pointChoice.qid q5pointChoice.question q5pointChoice.relevance q5pointChoice.shown q5pointChoice.type -EOD; - - $em = new ExpressionManager(); - - $atests = explode("\n",$tests); - array_push($atests,'"hi\nthere\nhow\nare\nyou?\n"'); - - foreach($atests as $test) - { - $tokens = $em->RDP_Tokenize($test); - print '' . $test . '
        '; - print ''; - print implode("
        \n",explode("\n",print_r($tokens,TRUE))); - print '

        '; - } - } - - /** - * Show a table of allowable Expression Manager functions - * @return string - */ - - static function ShowAllowableFunctions() - { - $em = new ExpressionManager(); - $output = "

        Functions Available within Expression Manager

        \n"; - $output .= "\n"; - foreach ($em->RDP_ValidFunctions as $name => $func) { - $output .= "\n"; - } - $output .= "
        FunctionMeaningSyntaxReference
        " . $name . "" . $func[2] . "" . $func[3] . "" . $func[4] . " 
        \n"; - return $output; - } - - /** - * Unit test the Evaluator, allowing for passing in of extra functions, variables, and tests - */ - - static function UnitTestEvaluator() - { - // Some test cases for Evaluator - $vars = array( -'one' => array('sgqa'=>'one', 'code'=>1, 'jsName'=>'java_one', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>4), -'two' => array('sgqa'=>'two', 'code'=>2, 'jsName'=>'java_two', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>4), -'three' => array('sgqa'=>'three', 'code'=>3, 'jsName'=>'java_three', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>4), -'four' => array('sgqa'=>'four', 'code'=>4, 'jsName'=>'java_four', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>1), -'five' => array('sgqa'=>'five', 'code'=>5, 'jsName'=>'java_five', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>1), -'six' => array('sgqa'=>'six', 'code'=>6, 'jsName'=>'java_six', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>1), -'seven' => array('sgqa'=>'seven', 'code'=>7, 'jsName'=>'java_seven', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>5), -'eight' => array('sgqa'=>'eight', 'code'=>8, 'jsName'=>'java_eight', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>5), -'nine' => array('sgqa'=>'nine', 'code'=>9, 'jsName'=>'java_nine', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>5), -'ten' => array('sgqa'=>'ten', 'code'=>10, 'jsName'=>'java_ten', 'readWrite'=>'Y', 'gseq'=>1,'qseq'=>1), -'half' => array('sgqa'=>'half', 'code'=>.5, 'jsName'=>'java_half', 'readWrite'=>'Y', 'gseq'=>1,'qseq'=>1), -'hi' => array('sgqa'=>'hi', 'code'=>'there', 'jsName'=>'java_hi', 'readWrite'=>'Y', 'gseq'=>1,'qseq'=>1), -'hello' => array('sgqa'=>'hello', 'code'=>"Tom", 'jsName'=>'java_hello', 'readWrite'=>'Y', 'gseq'=>1,'qseq'=>1), -'a' => array('sgqa'=>'a', 'code'=>0, 'jsName'=>'java_a', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>2), -'b' => array('sgqa'=>'b', 'code'=>0, 'jsName'=>'java_b', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>2), -'c' => array('sgqa'=>'c', 'code'=>0, 'jsName'=>'java_c', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>2), -'d' => array('sgqa'=>'d', 'code'=>0, 'jsName'=>'java_d', 'readWrite'=>'Y', 'gseq'=>2,'qseq'=>2), -'eleven' => array('sgqa'=>'eleven', 'code'=>11, 'jsName'=>'java_eleven', 'readWrite'=>'Y', 'gseq'=>1,'qseq'=>1), -'twelve' => array('sgqa'=>'twelve', 'code'=>12, 'jsName'=>'java_twelve', 'readWrite'=>'Y', 'gseq'=>1,'qseq'=>1), -// Constants -'ASSESSMENT_HEADING' => array('sgqa'=>'ASSESSMENT_HEADING', 'code'=>'"Can strings contain embedded \"quoted passages\" (and parentheses + other characters?)?"', 'jsName'=>'', 'readWrite'=>'N'), -'QID' => array('sgqa'=>'QID', 'code'=>'value for {QID}', 'jsName'=>'', 'readWrite'=>'N'), -'QUESTIONHELP' => array('sgqa'=>'QUESTIONHELP', 'code'=>'"can single quoted strings" . \'contain nested \'quoted sections\'?', 'jsName'=>'', 'readWrite'=>'N'), -'QUESTION_HELP' => array('sgqa'=>'QUESTION_HELP', 'code'=>'Can strings have embedded like , or even unbalanced "quotes or entities without terminal semicolons like & and <?', 'jsName'=>'', 'readWrite'=>'N'), -'NUMBEROFQUESTIONS' => array('sgqa'=>'NUMBEROFQUESTIONS', 'code'=>'value for {NUMBEROFQUESTIONS}', 'jsName'=>'', 'readWrite'=>'N'), -'THEREAREXQUESTIONS' => array('sgqa'=>'THEREAREXQUESTIONS', 'code'=>'value for {THEREAREXQUESTIONS}', 'jsName'=>'', 'readWrite'=>'N'), -'TOKEN:FIRSTNAME' => array('sgqa'=>'TOKEN:FIRSTNAME', 'code' => 'value for {TOKEN:FIRSTNAME}', 'jsName' => '', 'readWrite' => 'N'), -'WELCOME' => array('sgqa'=>'WELCOME', 'code'=>'value for {WELCOME}', 'jsName'=>'', 'readWrite'=>'N'), -// also include SGQA values and read-only variable attributes -'12X34X56' => array('sgqa'=>'12X34X56', 'code'=>5, 'jsName'=>'', 'readWrite'=>'N', 'gseq'=>1,'qseq'=>1), -'12X3X5lab1_ber' => array('sgqa'=>'12X3X5lab1_ber', 'code'=>10, 'jsName'=>'', 'readWrite'=>'N', 'gseq'=>1,'qseq'=>1), -'q5pointChoice' => array('sgqa'=>'q5pointChoice', 'code'=>3, 'jsName'=>'java_q5pointChoice', 'readWrite'=>'N','shown'=>'Father', 'relevance'=>1, 'type'=>'5', 'question'=>'(question for q5pointChoice)', 'qid'=>14,'gseq'=>2,'qseq'=>14), -'qArrayNumbers_ls1_min' => array('sgqa'=>'qArrayNumbers_ls1_min', 'code'=> 7, 'jsName'=>'java_qArrayNumbers_ls1_min', 'readWrite'=>'N','shown'=> 'I love LimeSurvey', 'relevance'=>1, 'type'=>'A', 'question'=>'(question for qArrayNumbers)', 'qid'=>6,'gseq'=>2,'qseq'=>6), -'12X3X5lab1_ber#1' => array('sgqa'=>'12X3X5lab1_ber#1', 'code'=> 15, 'jsName'=>'', 'readWrite'=>'N', 'gseq'=>1,'qseq'=>1), -'zero' => array('sgqa'=>'zero', 'code'=>0, 'jsName'=>'java_zero', 'gseq'=>0,'qseq'=>0), -'empty' => array('sgqa'=>'empty', 'code'=>'', 'jsName'=>'java_empty', 'gseq'=>0,'qseq'=>0), -'BREAKS' => array('sgqa'=>'BREAKS', 'code'=>"1\n2\n3", 'jsName'=>'', 'readWrite'=>'N'), - ); - - // Syntax for $tests is - // expectedResult~expression - // if the expected result is an error, use NULL for the expected result - $tests = <<Empty Vs. Empty~"Empty Vs. Empty" -1~'' == '' -0~'' != '' -0~'' > '' -1~'' >= '' -0~'' < '' -1~'' <= '' -1~!'' -~('' and '') -~('' or '') -Empty Vs. Zero~"Empty Vs. Zero" -0~'' == 0 -1~'' != 0 -0~'' > 0 -0~'' >= 0 -0~'' < 0 -0~'' <= 0 -1~!'' -1~!0 -0~('' and 0) -0~('' or 0) -Empty Vs. Constant~"Empty Vs. Constant" -0~'' == 3 -1~'' != 3 -0~'' > 3 -0~'' >= 3 -0~'' < 3 -0~'' <= 3 -1~!'' -0~!3 -0~('' and 3) -1~('' or 3) -Empty Vs. Empty_Var~"Empty Vs. Empty_Var" -1~'' == empty -0~'' != empty -0~'' > empty -1~'' >= empty -0~'' < empty -1~'' <= empty -1~!'' -1~!empty -~('' and empty) -~('' or empty) -Empty_Var Vs. Zero~"Empty_Var Vs. Zero" -0~empty == 0 -1~empty != 0 -0~empty > 0 -0~empty >= 0 -0~empty < 0 -0~empty <= 0 -1~!empty -1~!0 -0~(empty and 0) -0~(empty or 0) -Empty_Var Vs. Zero~"Empty_Var Vs. Zero" -0~empty == zero -1~empty != zero -0~empty > zero -0~empty >= zero -0~empty < zero -0~empty <= zero -1~!empty -1~!zero -0~(empty and zero) -0~(empty or zero) -Empty_Var Vs. Constant~"Empty_Var Vs. Constant" -0~empty == 3 -1~empty != 3 -0~empty > 3 -0~empty >= 3 -0~empty < 3 -0~empty <= 3 -1~!empty -0~!3 -0~(empty and 3) -1~(empty or 3) -Solution: Empty_Var Vs. Zero~"Solution: Empty_Var Vs. Zero" -0~!is_empty(empty) && (empty == 0) -0~!is_empty(five) && (five == 0) -1~!is_empty(zero) && (zero == 0) -0~!is_empty(empty) && (empty > 0) -0~!is_empty(empty) && (empty >= 0) -0~!is_empty(empty) && (empty < 0) -0~!is_empty(empty) && (empty <= 0) -0~!is_empty(empty) && ((empty and 0)) -0~!is_empty(empty) && ((empty or 0)) -Solution: Empty_Var Vs. Zero~"Solution: Empty_Var Vs. Zero" -0~!is_empty(empty) && (empty == zero) -0~!is_empty(five) && (five == zero) -1~!is_empty(zero) && (zero == zero) -0~!is_empty(empty) && (empty > zero) -0~!is_empty(empty) && (empty >= zero) -0~!is_empty(empty) && (empty < zero) -0~!is_empty(empty) && (empty <= zero) -0~!is_empty(empty) && ((empty and zero)) -0~!is_empty(empty) && ((empty or zero)) -Solution: Empty_Var Vs. Constant~"Solution: Empty_Var Vs. Constant" -0~!is_empty(empty) && (empty < 3) -0~!is_empty(empty) && (empty <= 3) -Solution: Empty_Var Vs. Variable~"Solution: Empty_Var Vs. Variable" -0~!is_empty(empty) && (empty < five) -0~!is_empty(empty) && (empty <= five) -Solution: The Hard One is Empty_Var != 0~"Solution: The Hard One is Empty_Var != 0" -1~(empty != 0) -1~!is_empty(empty) && (empty != 0) -1~is_empty(empty) || (empty != 0) -1~is_empty(empty) || (empty != zero) -0~is_empty(zero) || (zero != 0) -1~is_empty(five) || (five != 0) -SETUP~'SETUP' -"Can strings contain embedded \"quoted passages\" (and parentheses + other characters?)?"~a=htmlspecialchars(ASSESSMENT_HEADING) -"can single quoted strings" . 'contain nested 'quoted sections'?~b=htmlspecialchars(QUESTIONHELP) -Can strings have embedded <tags> like <html>, or even unbalanced "quotes or entities without terminal semicolons like &amp and &lt?~c=htmlspecialchars(QUESTION_HELP) -Hi there!~d='Hi there!' -FUNCTIONS~'FUNCTIONS' -5~abs(five) -5~abs(-five) -0.2~acos(cos(0.2)) -0~acos(cos(pi()))-pi() -"Can strings contain embedded \\"quoted passages\\" (and parentheses + other characters?)?"~addslashes(a) -"can single quoted strings" . 'contain nested 'quoted sections'?~addslashes(b) -Can strings have embedded <tags> like <html>, or even unbalanced "quotes or entities without terminal semicolons like &amp and &lt?~addslashes(c) -0.2~asin(sin(0.2)) -0.2~atan(tan(0.2)) -0~atan2(0,1) -1~ceil(0.3) -1~ceil(0.7) -0~ceil(-0.3) -0~ceil(-0.7) -10~ceil(9.1) -1~checkdate(1,29,1967) -0~checkdate(2,29,1967) -0.2~cos(acos(0.2)) -5~count(1,2,3,4,5) -0~count() -5~count(one,two,three,four,five) -2~count(a,'',c) -NULL~date('F j, Y, g:i a',time()) -April 5, 2006, 1:02 am~date('F j, Y, g:i a',mktime(1,2,3,4,5,6)) -20~floor(exp(3)) -0~floor(asin(sin(pi()))) -9~floor(9.9) -3~floor(pi()) -January 12, 2012, 5:27 pm~date('F j, Y, g:i a',1326410867) -January 12, 2012, 11:27 pm~gmdate('F j, Y, g:i a',1326410867) -"Can strings contain embedded \"quoted passages\" (and parentheses + other characters?)?"~html_entity_decode(a) -"can single quoted strings" . 'contain nested 'quoted sections'?~html_entity_decode(b) -Can strings have embedded like , or even unbalanced "quotes or entities without terminal semicolons like & and <?~html_entity_decode(c) -"Can strings contain embedded \"quoted passages\" (and parentheses + other characters?)?"~htmlentities(a) -"can single quoted strings" . 'contain nested 'quoted sections'?~htmlentities(b) -Can strings have embedded <tags> like <html>, or even unbalanced "quotes or entities without terminal semicolons like &amp and &lt?~htmlentities(c) -1~c==htmlspecialchars(htmlspecialchars_decode(c)) -1~b==htmlspecialchars(htmlspecialchars_decode(b)) -1~a==htmlspecialchars(htmlspecialchars_decode(a)) -"Can strings contain embedded \"quoted passages\" (and parentheses + other characters?)?"~htmlspecialchars_decode(a) -"can single quoted strings" . 'contain nested 'quoted sections'?~htmlspecialchars_decode(b) -Can strings have embedded like , or even unbalanced "quotes or entities without terminal semicolons like & and like , or even unbalanced "quotes or entities without terminal semicolons like & and <?~htmlspecialchars(c) -9~idate('B',1326410867) -0~if('0',1,0) -0~if(0,1,0) -1~if(!0,1,0) -0~if(!(!0),1,0) -1~if('true',1,0) -1~if('false',1,0) -1~if('00',1,0) -0~if('',1,0) -1~if('A',1,0) -0~if(empty,1,0) -4~if(5 > 7,2,4) -1~if(' ',1,0) -there~if((one > two),'hi','there') -64~if((one < two),pow(2,6),pow(6,2)) -H e l l o~implode(' ','H','e','l','l','o') -1|2|3|4|5~implode('|',one,two,three,four,five) -4~intval('4') -4~intval('100',2) -5~intval(5.7) -0~is_empty(four) -1~is_empty(empty) -1~is_empty('') -0~is_empty(0) -0~is_empty('0') -0~is_empty('false') -0~is_empty('NULL') -0~is_empty(1) -1~is_empty(one==two) -0~!is_empty(one==two) -1~is_float(half) -0~is_float(one) -1~is_float(pi()) -0~is_float(5) -0~is_int(half) -1~is_int(one) -0~is_nan(half) -1~is_nan(WELCOME) -1~is_null(sdfjskdfj) -0~is_null(four) -0~is_numeric(empty) -1~is_numeric('1') -1~is_numeric(four) -0~is_numeric('hi') -1~is_numeric(five) -0~is_numeric(hi) -0~is_string(four) -1~is_string('hi') -1~is_string(hi) -1, 2, 3, 4, 5~list(one,two,three,min(four,five,six),max(three,four,five)) -11, 12~list(eleven,twelve) -0, 1, 3, 5~list(0,one,'',three,'',five) -1~log(exp(1)) -2~log(exp(2)) -I was trimmed ~ltrim(' I was trimmed ') -10~max(5,6,10,-20) -6~max(five,(one + (two * four)- three)) -6~max((one + (two * four)- three)) -212~5 + max(1,(2+3),(4 + (5 + 6)),((7 + 8) + 9),((10 + 11), 12),(13 + (14 * 15) - 16)) -29~five + max(one, (two + three), (four + (five + six)),((seven + eight) + nine),((ten + eleven), twelve),(one + (two * three) - four)) -1024~max(one,(two*three),pow(four,five),six) -2~max(one,two) -5~max(one,two,three,four,five) --5~min(-5,10,15,12,-3) -1~min(five,four,one,two,three) -1344765967~mktime(5,6,7,8) -1144191723~mktime(1,2,3,4,5,6) -1,000~number_format(1000) -1,000.23~number_format(1000.23) -1,234,567~number_format(1234567) -315~ceil(100*pi()) -1~pi() == pi() * 2 - pi() -4~pow(2,2) -27~pow(3,3) -=~quoted_printable_decode(quoted_printable_encode('=')) -\\$~quotemeta('$') -IGNORE THIS ERROR~rand(3,5) -0~(a=rand())-a -1~regexMatch('/embedded/',c) -1~regexMatch('/^.*embedded.*$/',c) -0~regexMatch('/joe/',c) -1~regexMatch('/(?:dog|cat)food/','catfood stinks') -1~regexMatch('/(?:dog|cat)food/','catfood stinks') -1~regexMatch('/[0-9]{3}-[0-9]{2}-[0-9]{4}/','123-45-6789') -1~regexMatch('/\d{3}-\d{2}-\d{4}/','123-45-6789') -1~regexMatch('/(?:\(\d{3}\))\s*\d{3}-\d{4}/','(212) 555-1212') -0~round(0.2) -1~round(.8) -0.07~0.01 + 0.06 -0.07~round(0.01 + 0.06,10) - I was trimmed~rtrim(' I was trimmed ') -0.2~sin(asin(0.2)) -1~sin(pi()/2) -1~sin(pi()/2) == sin(.5 * pi()) -1~sin(0.5 * pi()) -hello,5~sprintf('%s,%d','hello',5) -2~sqrt(4) -158~round(stddev(4,5,6,7,8)*100) -hello-----~str_pad('hello',10,'-') -hello ~str_pad('hello',10) -hello~str_pad('hello',3) -testtesttest~str_repeat('test',3) -I am awesome~str_replace('You are','I am','You are awesome') -I love LimeSurvey~str_replace('like','love','I like LimeSurvey') -1~0==strcasecmp('Hello','hello') -0~0==strcasecmp('Hello','hi') -1~0==strcmp('Hello','Hello') -0~0==strcmp('Hello','hi') -Hi there!~c=strip_tags(d) -hello~strip_tags('hello') -5~stripos('ABCDEFGHI','f') -hi~stripslashes('\\h\\i') -FGHI~stristr('ABCDEFGHI','fg') -5~strlen('12345') -5~strlen(hi) -0~strpos('ABCDEFGHI','f') -5~strpos('ABCDEFGHI','F') -2~strpos('I like LimeSurvey','like') -54321~strrev('12345') -0~strstr('ABCDEFGHI','fg') -FGHI~strstr('ABCDEFGHI','FG') -hi there!~strtolower(c) -HI THERE!~strtoupper(c) -678~substr('1234567890',5,3) -15~sum(1,2,3,4,5) -15~sum(one,two,three,four,five) -0.2~tan(atan(0.2)) -IGNORE THIS ERROR~time() -I was trimmed~trim(' I was trimmed ') -Hi There You~ucwords('hi there you') -EXPRESSIONS~'EXPRESSIONS' -1~!'0' -1~0 eq '0' -0~0 ne '0' -0~0 eq empty -1~0 ne empty -0~0 eq '' -1~0 ne '' -0~'' < 10 -0~0 < empty -1~0 <= empty -0~0 > empty -1~0 >= empty -0~'0' eq empty -1~'0' ne empty -0~'0' < empty -1~'0' <= empty -0~'0' > empty -1~'0' >= empty -1~empty eq empty -0~empty ne empty -0~'' > 0 -0~' ' > 0 -1~!0 -0~!' ' -0~!'A' -0~!1 -0~!'1' -1~!'' -1~!empty -1~'0'==0 -0~'A'>0 -0~'A'<0 -0~'A'==0 -0~'A'>=0 -0~'A'<=0 -0~0>'A' -0~0>='B' -0~0=='C' -0~0<'D' -0~0<='E' -1~0!='F' -1~'A' or 'B' -1~'A' and 'B' -0~'A' eq 'B' -1~'A' ne 'B' -1~'A' < 'B' -1~'A' <= 'B' -0~'A' > 'B' -0~'A' >= 'B' -AB~'A' + 'B' -NAN~'A' - 'B' -NAN~'A' * 'B' -NAN~'A' / 'B' -1~'A' or empty -0~'A' and empty -0~'A' eq empty -1~'A' ne empty -0~'A' < empty -0~'A' <= empty -1~'A' > empty -1~'A' >= empty -A~'A' + empty -NAN~'A' - empty -NAN~'A' * empty -NAN~'A' / empty -0~0 or empty -0~0 and empty -0~0 + empty -0~0 - empty -0~0 * empty -NAN~0 / empty -0~(-1 > 0) -0~zero -~empty -1~five > zero -1~five > empty -1~empty < 16 -1~zero == empty -3~q5pointChoice.code -5~q5pointChoice.type -(question for q5pointChoice)~q5pointChoice.question -1~q5pointChoice.relevance -4~q5pointChoice.NAOK + 1 -NULL~q5pointChoice.bogus -14~q5pointChoice.qid -7~qArrayNumbers_ls1_min.code -1~(one * (two + (three - four) + five) / six) -2.4~(one * two) + (three * four) / (five * six) -50~12X34X56 * 12X3X5lab1_ber -1~c == 'Hi there!' -1~c == "Hi there!" -3~a=three -3~c=a -12~c*=four -15~c+=a -5~c/=a --1~c-=six -24~one * two * three * four --4~five - four - three - two -0~two * three - two - two - two -4~two * three - two -105~5 + 1, 7 * 15 -7~7 -15~10 + 5 -24~12 * 2 -10~13 - 3 -3.5~14 / 4 -5~3 + 1 * 2 -1~one -there~hi -6.25~one * two - three / four + five -1~one + hi -1~two > one -1~two gt one -1~three >= two -1~three ge two -0~four < three -0~four lt three -0~four <= three -0~four le three -0~four == three -0~four eq three -1~four != three -0~four ne four -NAN~one * hi -0~a='hello',b='',c=0 -hello~a -0~c -0~one && 0 -0~two and 0 -1~five && 6 -1~seven && eight -1~one or 0 -1~one || 0 -1~(one and 0) || (two and three) -value for {QID}~QID -"Can strings contain embedded \"quoted passages\" (and parentheses + other characters?)?"~ASSESSMENT_HEADING -"can single quoted strings" . 'contain nested 'quoted sections'?~QUESTIONHELP -Can strings have embedded like , or even unbalanced "quotes or entities without terminal semicolons like & and <?~QUESTION_HELP -value for {TOKEN:FIRSTNAME}~TOKEN:FIRSTNAME -value for {THEREAREXQUESTIONS}~THEREAREXQUESTIONS -15~12X3X5lab1_ber#1 -1~three == three -1~three == 3 -11~eleven -144~twelve * twelve -0~!three -8~five + + three -2~five + - three -SYNTAX ERRORS~'SYNTAX ERRORS' -NULL~* -NULL~three + -NULL~four * / seven -NULL~(five - three -NULL~five + three) -NULL~seven + = four -NULL~> -NULL~five > > three -NULL~seven > = four -NULL~seven >= -NULL~three && -NULL~three || -NULL~three + -NULL~three >= -NULL~three += -NULL~three ! -NULL~three * -NULL~five ! three -NULL~(5 + 7) = 8 -NULL~&& four -NULL~min( -NULL~max three, four, five) -NULL~three four -NULL~max(three,four,five) six -NULL~WELCOME='Good morning' -NULL~TOKEN:FIRSTNAME='Tom' -NULL~NUMBEROFQUESTIONS+=3 -NULL~NUMBEROFQUESTIONS*=4 -NULL~NUMBEROFQUESTIONS/=5 -NULL~NUMBEROFQUESTIONS-=6 -NULL~'Tom'='tired' -NULL~max() -EOD; - - $atests = explode("\n",$tests); - $atests[] = "1\n2\n3~BREAKS"; - $atests[] = "1
        \n2
        \n3~nl2br(BREAKS)"; - $atests[] = "hi
        \nthere
        \nhow
        \nare
        \nyou?~nl2br('hi\\nthere\\nhow\\nare\\nyou?')"; - $atests[] = "hi
        \nthere,
        \nuser!~nl2br(implode('\\n','hi','there,','user!'))"; - - $LEM =& LimeExpressionManager::singleton(); - $em = new ExpressionManager(); - $LEM->setTempVars($vars); - - // manually set relevance status - $_SESSION['relevanceStatus'] = array(); - foreach ($vars as $var) { - if (isset($var['qseq'])) { - $_SESSION['relevanceStatus'][$var['qseq']] = 1; - } - } - - $allJsVarnamesUsed = array(); - $body = ''; - $body .= ''; - $i=0; - $javaScript = array(); - foreach($atests as $test) - { - ++$i; - $values = explode("~",$test); - $expectedResult = array_shift($values); - $expr = implode("~",$values); - $resultStatus = 'ok'; - $em->groupSeq=2; - $em->questionSeq=3; - $status = $em->RDP_Evaluate($expr); - if ($status) - { - $allJsVarnamesUsed = array_merge($allJsVarnamesUsed,$em->GetJsVarsUsed()); - } - $result = $em->GetResult(); - $valToShow = $result; // htmlspecialchars($result,ENT_QUOTES,'UTF-8',false); - $expectedToShow = $expectedResult; // htmlspecialchars($expectedResult,ENT_QUOTES,'UTF-8',false); - $body .= ""; - $body .= "\n"; - if (is_null($result)) { - $valToShow = "NULL"; - } - if ($valToShow != $expectedToShow) - { - $resultStatus = 'error'; - } - $body .= "\n"; - $body .= '\n"; - $javaScript[] = $em->GetJavascriptTestforExpression($expectedToShow, $i); - $body .= "\n"; - $varsUsed = $em->GetVarsUsed(); - if (is_array($varsUsed) and count($varsUsed) > 0) { - $varDesc = array(); - foreach ($varsUsed as $v) { - $varDesc[] = $v; - } - $body .= '\n"; - } - else { - $body .= "\n"; - } - $jsEqn = $em->GetJavaScriptEquivalentOfExpression(); - if ($jsEqn == '') - { - $body .= "\n"; - } - else - { - $body .= '\n"; - } - $body .= ''; - } - $body .= '
        ExpressionPHP ResultExpectedJavaScript ResultVarNamesJavaScript Eqn
        " . $em->GetPrettyPrintString() . "" . $valToShow . "' . $expectedToShow . " ' . implode(',
        ', $varDesc) . "
          ' . $jsEqn . "
        '; - $body .= "\n"; - - $allJsVarnamesUsed = array_unique($allJsVarnamesUsed); - asort($allJsVarnamesUsed); - $pre = ''; - $pre .= "

        Change some Relevance values to 0 to see how it affects computations

        \n"; - $pre .= ''; - $i=0; - $LEMvarNameAttr=array(); - $LEMalias2varName=array(); - foreach ($allJsVarnamesUsed as $jsVarName) - { - ++$i; - $pre .= "\n"; - $LEMalias2varName[] = "'" . substr($jsVarName,5) . "':'" . $jsVarName . "'"; - $LEMalias2varName[] = "'" . $jsVarName . "':'" . $jsVarName . "'"; - $attrInfo = "'" . $jsVarName . "': {'jsName':'" . $jsVarName . "'"; - - $varInfo = $vars[substr($jsVarName,5)]; - foreach ($varInfo as $k=>$v) { - if ($k == 'code') { - continue; // will access it from hidden node - } - if ($k == 'shown') { - $k = 'shown'; - $v = htmlspecialchars(preg_replace("/[[:space:]]/",' ',$v),ENT_QUOTES); - } - if ($k == 'jsName') { - continue; // since already set - } - $attrInfo .= ", '" . $k . "':'" . $v . "'"; - - } - $attrInfo .= ",'qid':" . $i . "}"; - $LEMvarNameAttr[] = $attrInfo; - } - $pre .= "
        #JsVarnameStarting ValueRelevance
        " . $i . "" . $jsVarName; - foreach($vars as $k => $v) { - if ($v['jsName'] == $jsVarName) - { - $value = $v['code']; - } - } - $pre .= "" . $value . "\n"; - $pre .= "\n"; - $pre .= "
        \n"; - - $pre .= "\n"; - - print $pre; - print $body; - } - - /** - * Stub to access LimeSurvey's functions for internationalizing strings - * @param $string - * @return - */ - function gT($string) - { - // ultimately should call i8n functiouns - global $clang; - if (isset($clang)) { - return $clang->gT($string); - } - else { - return $string; - } - } -} - -/** - * Used by usort() to order Error tokens by their position within the string - * This must be outside of the class in order to work in PHP 5.2 - * @param $a - * @param $b - * @return - */ -function cmpErrorTokens($a, $b) -{ - if (is_null($a[1])) { - if (is_null($b[1])) { - return 0; - } - return 1; - } - if (is_null($b[1])) { - return -1; - } - if ($a[1][1] == $b[1][1]) { - return 0; - } - return ($a[1][1] < $b[1][1]) ? -1 : 1; -} - -/** - * Count the number of answered questions (non-empty) - * @param $args - * @return int - */ -function exprmgr_count($args) -{ - $j=0; // keep track of how many non-null values seen - foreach ($args as $arg) - { - if ($arg != '') { - ++$j; - } - } - return $j; -} - -/** - * Count the number of answered questions (non-empty) which match the first argument - * @param $args - * @return int - */ -function exprmgr_countif($args) -{ - $j=0; // keep track of how many non-null values seen - $match = array_shift($args); - foreach ($args as $arg) - { - if ($arg == $match) { - ++$j; - } - } - return $j; -} - -/** - * Count the number of answered questions (non-empty) which meet the criteria (arg op value) - * @param $args - * @return int - */ -function exprmgr_countifop($args) -{ - $j=0; - $op = array_shift($args); - $value = array_shift($args); - foreach ($args as $arg) - { - switch($op) - { - case '==': case 'eq': if ($arg == $value) { ++$j; } break; - case '>=': case 'ge': if ($arg >= $value) { ++$j; } break; - case '>': case 'gt': if ($arg > $value) { ++$j; } break; - case '<=': case 'le': if ($arg <= $value) { ++$j; } break; - case '<': case 'lt': if ($arg < $value) { ++$j; } break; - case '!=': case 'ne': if ($arg != $value) { ++$j; } break; - case 'RX': - try { - if (@preg_match($value, $arg)) - { - ++$j; - } - } - catch (Exception $e) { } - break; - } - } - return $j; -} - -/** - * Sum of values of answered questions which meet the criteria (arg op value) - * @param $args - * @return int - */ -function exprmgr_sumifop($args) -{ - $result=0; - $op = array_shift($args); - $value = array_shift($args); - foreach ($args as $arg) - { - switch($op) - { - case '==': case 'eq': if ($arg == $value) { $result += $arg; } break; - case '>=': case 'ge': if ($arg >= $value) { $result += $arg; } break; - case '>': case 'gt': if ($arg > $value) { $result += $arg; } break; - case '<=': case 'le': if ($arg <= $value) { $result += $arg; } break; - case '<': case 'lt': if ($arg < $value) { $result += $arg; } break; - case '!=': case 'ne': if ($arg != $value) { $result += $arg; } break; - case 'RX': - try { - if (@preg_match($value, $arg)) - { - $result += $arg; - } - } - catch (Exception $e) { } - break; - } - } - return $result; -} - -/** - * If $test is true, return $ok, else return $error - * @param $test - * @param $ok - * @param $error - * @return - */ -function exprmgr_if($test,$ok,$error) -{ - if ($test) - { - return $ok; - } - else - { - return $error; - } -} - -/** - * Join together $args[0-N] with ', ' - * @param $args - * @return - */ -function exprmgr_list($args) -{ - $result=""; - $j=1; // keep track of how many non-null values seen - foreach ($args as $arg) - { - if ($arg != '') { - if ($j > 1) { - $result .= ', ' . $arg; - } - else { - $result .= $arg; - } - ++$j; - } - } - return $result; -} - -/** - * Join together $args[1-N] with $arg[0] - * @param $args - * @return - */ -function exprmgr_implode($args) -{ - if (count($args) <= 1) - { - return ""; - } - $joiner = array_shift($args); - return implode($joiner,$args); -} - -/** - * Return true if the variable is NULL or blank. - * @param $arg - * @return - */ -function exprmgr_empty($arg) -{ - if ($arg === NULL || $arg === "" || $arg === false) { - return true; - } - return false; -} - -/** - * Compute the Sample Standard Deviation of a set of numbers ($args[0-N]) - * @param $args - * @return - */ -function exprmgr_stddev($args) -{ - $vals = array(); - foreach ($args as $arg) - { - if (is_numeric($arg)) { - $vals[] = $arg; - } - } - $count = count($vals); - if ($count <= 1) { - return 0; // what should default value be? - } - $sum = 0; - foreach ($vals as $val) { - $sum += $val; - } - $mean = $sum / $count; - - $sumsqmeans = 0; - foreach ($vals as $val) - { - $sumsqmeans += ($val - $mean) * ($val - $mean); - } - $stddev = sqrt($sumsqmeans / ($count-1)); - return $stddev; -} - -/** - * Javascript equivalent does not cope well with ENT_QUOTES and related PHP constants, so set default to ENT_QUOTES - * @param $string - * @return - */ -function expr_mgr_htmlspecialchars($string) -{ - return htmlspecialchars($string,ENT_QUOTES); -} - -/** - * Javascript equivalent does not cope well with ENT_QUOTES and related PHP constants, so set default to ENT_QUOTES - * @param $string - * @return - */ -function expr_mgr_htmlspecialchars_decode($string) -{ - return htmlspecialchars_decode($string,ENT_QUOTES); -} - -/** - * Return true of $input matches the regular expression $pattern - * @param $pattern - * @param $input - * @return - */ -function exprmgr_regexMatch($pattern, $input) -{ - try { - $result = @preg_match($pattern, $input); - } catch (Exception $e) { - $result = false; - // How should errors be logged? - echo sprintf($this->gT('Invalid PERL Regular Expression: %s'), htmlspecialchars($pattern)); - } - return $result; -} - -/** - * Display number with comma as radix separator, if needed - * @param type $value - * @return type - */ -function exprmgr_fixnum($value) -{ - if (LimeExpressionManager::usingCommaAsRadix()) - { - $newval = implode(',',explode('.',$value)); - return $newval; - } - return $value; -} - -/** - * Returns true if all non-empty values are unique - * @param type $args - */ -function exprmgr_unique($args) -{ - $uniqs = array(); - foreach ($args as $arg) - { - if (trim($arg)=='') - { - continue; // ignore blank answers - } - if (isset($uniqs[$arg])) - { - return false; - } - $uniqs[$arg]=1; - } - return true; -} -?> diff --git a/include/limesurvey/classes/expressions/LimeExpressionManager.php b/include/limesurvey/classes/expressions/LimeExpressionManager.php deleted file mode 100644 index 4e55d0a0..00000000 --- a/include/limesurvey/classes/expressions/LimeExpressionManager.php +++ /dev/null @@ -1,8682 +0,0 @@ - // the name of the javascript variable if it is defined on the current page - often 'answerSGQA' - * 'jsName' => // the name of the javascript variable when referenced on different pages - usually 'javaSGQA' - * 'readWrite' => // 'Y' for yes, 'N' for no - currently not used - * 'hidden' => // 1 if the question attribute 'hidden' is true, otherwise 0 - * 'question' => // the text of the question (or sub-question) - * 'qid' => // the numeric question id - e.g. the Q part of the SGQA name - * 'gid' => // the numeric group id - e.g. the G part of the SGQA name - * 'grelevance' => // the group level relevance string - * 'relevance' => // the question level relevance string - * 'qcode' => // the qcode-style variable name for this question (or sub-question) - * 'qseq' => // the 0-based index of the question within the survey - * 'gseq' => // the 0-based index of the group within the survey - * 'type' => // the single character type code for the question - * 'sgqa' => // the SGQA name for the variable - * 'ansList' => // ansArray converted to a JavaScript fragment - e.g. ",'answers':{ 'M':'Male','F':'Female'}" - * 'ansArray' => // PHP array of answer strings, keyed on the answer code = e.g. array['M']='Male'; - * 'scale_id' => // '0' for most answers. '1' for second scale within dual-scale questions - * 'rootVarName' => // the root code / name / title for the question, without any sub-question or answer-level suffix. This is from the title column in the questions table - * 'subqtext' => // the sub-question text - * 'rowdivid' => // the JavaScript ID of the row identifier for a question. This is used to show/hide entire question rows - * 'onlynum' => // 1 if only numbers are allowed for this variable. If so, then extra processing is needed to ensure that can use comma as a decimal separator - * ); - * - * Reserved variables (e.g. TOKEN:xxxx) are stored with this structure: - * $knownVars[$token] = array( - * 'code' => // the static value for the variable - * 'type' => // '' - * 'jsName_on' => // '' - * 'jsName' => // '' - * 'readWrite' => // 'N' - since these are always read-only variables - * ); - * - * @var type - */ - private $knownVars; - /** - * maps qcode varname to SGQA code - * - * @example ['gender'] = '38612X10X145' - * @var type - */ - private $qcode2sgqa; - /** - * variables temporarily set for substitution purposes - * - * These are typically the LimeReplacement Fields passed in via templatereplace() - * Each has the following structure: array( - * 'code' => // the static value of the variable - * 'jsName_on' => // '' - * 'jsName' => // '' - * 'readWrite' => // 'N' - * ); - * - * @var type - */ - private $tempVars; - /** - * Array of relevance information for each page (gseq), indexed by gseq. - * Within a page, it contains a sequential list of the results of each relevance equation processed - * array( - * 'qid' => // question id -- e.g. 154 - * 'gseq' => // 0-based group sequence -- e.g. 2 - * 'eqn' => // the raw relevance equation parsed -- e.g. "!is_empty(p2_sex)" - * 'result' => // the Boolean result of parsing that equation in the current context -- e.g. 0 - * 'numJsVars' => // the number of dynamic JavaScript variables used in that equation -- e.g. 1 - * 'relevancejs' => // the actual JavaScript to insert for that relevance equation -- e.g. "LEMif(LEManyNA('p2_sex'),'',( ! LEMempty(LEMval('p2_sex') )))" - * 'relevanceVars' => // a pipe-delimited list of JavaScript variables upon which that equation depends -- e.g. "java38612X12X153" - * 'jsResultVar' => // the JavaScript variable in which that result will be stored -- e.g. "java38612X12X154" - * 'type' => // the single character type of the question -- e.g. 'S' - * 'hidden' => // 1 if the question should always be hidden - * 'hasErrors' => // 1 if there were parsing errors processing that relevance equation - * @var type - */ - private $pageRelevanceInfo; - /** - * - * @var type - */ - private $pageTailorInfo; - /** - * internally set to true (1) for survey.php so get group-specific logging but keep javascript variable namings consistent on the page. - * @var type - */ - private $allOnOnePage=false; - /** - * survey mode. One of 'survey', 'group', or 'question' - * @var string - */ - private $surveyMode='group'; - /** - * a set of global survey options passed from LimeSurvey - * - * For example, array( - * 'rooturl' => // URL prefix needed to be able to click on a syntax-highlighted variable name and have it open the needed editting window - * 'hyperlinkSyntaxHighlighting' => // true if should be able to click on variables to edit them - * 'active' => // 0 for inactive, 1 for active survey - * 'allowsave' => // 0 for do not allow save; 1 for allow save - * 'anonymized' => // 1 for anonymous - * 'assessments' => // 1 for use assessments - * 'datestamp' => // 1 for use date stamps - * 'ipaddr' => // 1 for capture IP address - * 'radix' => // '.' for use period as decimal separator; ',' for use comma as decimal separator - * 'savetimings' => // "Y" if should save survey timings - * 'startlanguage' => // the starting language -- e.g. 'en' - * 'surveyls_dateformat' => // the index of the language specific date format -- e.g. 1 - * 'tablename' => // the name of the table storing the survey data, if active -- e.g. lime_survey_38612 - * 'target' => // the path for uploading files -- e.g. '/temp/files/' - * 'timeadjust' => // the time offset -- e.g. 0 - * 'tempdir' => // the temporary directory for uploading files -- e.g. '/temp/' - * ); - * - * @var type - */ - private $surveyOptions=array(); - /** - * array of mappings of Question # (qid) to pipe-delimited list of SGQA codes used within it - * - * @example [150] = "38612X11X150|38612X11X150other" - * @var type - */ - private $qid2code; - /** - * array of mappings of JavaScript Variable names to Question number (qid) - * - * @example ['java38612X13X161other'] = '161' - * @var type - */ - private $jsVar2qid; - /** - * maps name of the variable to the SGQ name (without the A suffix) - * - * @example ['p1_sex'] = "38612X10X147" - * @example ['afDS_sq1_1'] = "26626X37X705sq1#1" - * @var type - */ - private $qcode2sgq; - /** - * array of mappings of knownVar aliases to the JavaScript variable names. - * This maps both the SGQA and qcode alias names to the same 2 dimensional array - * - * @example ['p1_sex'] = array( - * 'jsName' => // the JavaScript variable name used by EM -- e.g. "java38612X11X147" - * 'jsPart' => // the JavaScript fragment used in EM's ____ array -- e.g. "'p1_sex':'java38612X11X147'" - * ); - * @example ['afDS_sq1_1] = array( - * 'jsName' => "java26626X37X705sq1#1" - * 'jsPart' => "'afDS_sq1_1':'java26626X37X705sq1#1'" - * ); - * @var type - */ - private $alias2varName; - /** - * JavaScript array of mappings of canonical JavaScript variable name to key attributes. - * These fragments are used to create the JavaScript varNameAttr array. - * - * @example ['java38612X11X147'] = "'java38612X11X147':{ 'jsName':'java38612X11X147','jsName_on':'java38612X11X147','sgqa':'38612X11X147','qid':147,'gid':11,'type':'G','default':'','rowdivid':'','onlynum':'','gseq':1,'answers':{ 'M':'Male','F':'Female'}}" - * @example ['java26626X37X705sq1#1'] = "'java26626X37X705sq1#1':{ 'jsName':'java26626X37X705sq1#1','jsName_on':'java26626X37X705sq1#1','sgqa':'26626X37X705sq1#1','qid':705,'gid':37,'type':'1','default':'','rowdivid':'26626X37X705sq1','onlynum':'','gseq':1,'answers':{ '0~1':'1|Low','0~2':'2|Medium','0~3':'3|High','1~1':'1|Never','1~2':'2|Sometimes','1~3':'3|Always'}}" - * - * @var type - */ - private $varNameAttr; - - /** - * array of enumerated answer lists indexed by qid - * These use a tilde syntax to indicate which scale the answer is part of. - * - * @example ['0~4'] = "4|Child" // this means that code 4 in scale 0 has a coded value of 4 and a display value of 'Child' - * @example (for [705]): ['1~2'] = '2|Sometimes' // this means that the second scale for this question uses the coded value of 2 to represent 'Sometimes' - * @example // TODO - add example from survey using assessments - * - * @var type - */ - private $qans; - /** - * map of gid to 0-based sequence number of groups - * - * @example [10] = 0 // means that the first group (gseq=0) has gid=10 - * - * @var type - */ - private $groupId2groupSeq; - /** - * map question # to an incremental count of question order across the whole survey - * - * @example [157] = 13 // means that that 14th question in the survey has qid=157 - * - * @var type - */ - private $questionId2questionSeq; - /** - * map question # to the group it is within, using an incremental count of group order - * - * @example [157] = 2 // means that qid 157 is in the 3rd page of questions (gseq = 2) - * - * @var type - */ - private $questionId2groupSeq; - /** - * array of info about each Group, indexed by GroupSeq - * - * @example [2] = array( - * 'qstart' => 9 // the first qseq within that group - * 'qend' => 13 //the last qseq within that group - * ); - * - * @var type - */ - private $groupSeqInfo; - - /** - * tracks which groups have at least one relevant, non-hidden question - * - * @example [2] = 0 // means that the third group (gseq==2) is currently irrelevant - * - * @var type - */ - private $gseq2relevanceStatus; - /** - * maps question # to the validation equation(s) for that question. - * These are grouped by qid then validation type, such as 'value_range', and 'num_answers' - * - * @example [703] = array( - * 'eqn' => array( - * 'value_range' = "((is_empty(26626X34X703.NAOK) || 26626X34X703.NAOK >= (0)) and (is_empty(26626X34X703.NAOK) || 26626X34X703.NAOK <= (5)))" - * ), - * 'tips' => array( - * 'value_range' = "Each answer must be between {fixnum(0)} and {fixnum(5)}" - * ), - * 'subqValidEqns' = array( - * [] = array( - * 'subqValidSelector' => '' // - * 'subqValidEqn' => "(is_empty(26626X34X703.NAOK) || 26626X34X703.NAOK >= (0)) && (is_empty(26626X34X703.NAOK) || 26626X34X703.NAOK <= (5))" - * ), - * 'sumEqn' => '' // the equation to compute the current sum of the responses - * 'sumRemainingEqn' => '' // the equation to how much is left (for the question attribute that lets you specify the exact value of the sum of the answers) - * ); - * - * @var type - */ - private $qid2validationEqn; - - /** - * keeps relevance in proper sequence so can minimize relevance processing to see what should be see on page and in indexes - * Array is indexed on qseq - * - * @example [3] = array( - * 'relevance' => "!is_empty(num)" // the question-level relevance equation - * 'grelevance' => "" // the group-level relevance equation - * 'qid' => "699" // the question id - * 'qseq' => 3 // the 0-index question sequence - * 'gseq' => 0 // the 0-index group sequence - * 'jsResultVar_on' => 'answer26626X34X699' // the javascript variable holding the input value - * 'jsResultVar' => 'java26226X34X699' // the javascript variable (often hidden) holding the value to be submitted - * 'type' => 'N' // the one character question type - * 'hidden' => 0 // 1 if it should be always_hidden - * 'gid' => "34" // group id - * 'mandatory' => 'N' // 'Y' if mandatory - * 'eqn' => "" // TODO ?? - * 'help' => "" // the help text - * 'qtext' => "Enter a larger number than {num}" // the question text - * 'code' => 'afDS_sq5_1' // the full variable name - * 'other' => 'N' // whether the question supports the 'other' option - 'Y' if true - * 'rootVarName' => 'afDS' // the root variable name - * 'rowdivid' => '2626X37X705sq5' // the javascript id for the row - in this case, the 5th sub-question - * 'aid' => 'sq5' // the answer id - * 'sqid' => '791' // the sub-question's qid (only populated for some question types) - * ); - * - * @var type - */ - private $questionSeq2relevance; - /** - * current Group sequence (0-based index) - * @example 1 - * @var integer - */ - private $currentGroupSeq; - /** - * for Question-by-Question mode, the 0-based index - * @example 3 - * @var integer - */ - private $currentQuestionSeq; - /** - * used in Question-by-Question mode - * @var integer - */ - private $currentQID; - /** - * set of the current set of questions to be displayed, indexed by QID - at least one must be relevant - * - * The array has N entries, where N is the number if qids in the Qset. Each has the following contents: - * @example [705] = array( - * 'info' => array() // this is an exact copy of $questionSeq2relevance[$qseq] -- TODO - remove redundancy - * 'relevant' => 1 // 1 if the question is currently relevant - * 'hidden' => 0 // 1 if the question is always hidden - * 'relEqn' => '' // the relevance equation -- TODO - how different from ['info']['relevance']? - * 'sgqa' => // pipe-separated list of SGQA codes for this question -- e.g. "26626X37X705sq1#0|26626X37X705sq1#1|26626X37X705sq2#0|26626X37X705sq2#1|26626X37X705sq3#0|26626X37X705sq3#1|26626X37X705sq4#0|26626X37X705sq4#1|26626X37X705sq5#0|26626X37X705sq5#1" - * 'unansweredSQs' => // pipe-separated list of currently unanswered SGQA codes for this question -- e.g. "26626X37X705sq1#0|26626X37X705sq1#1|26626X37X705sq3#0|26626X37X705sq3#1|26626X37X705sq5#0|26626X37X705sq5#1" - * 'valid' => 0 // 1 if the current answers pass all of the validation criteria for the question - * 'validEqn' => // the auto-generated validation criteria, based upon advanced question attributes -- e.g. "((count(if(count(26626X37X705sq1#0.NAOK,26626X37X705sq1#1.NAOK)==2,1,''), if(count(26626X37X705sq2#0.NAOK,26626X37X705sq2#1.NAOK)==2,1,''), if(count(26626X37X705sq3#0.NAOK,26626X37X705sq3#1.NAOK)==2,1,''), if(count(26626X37X705sq4#0.NAOK,26626X37X705sq4#1.NAOK)==2,1,''), if(count(26626X37X705sq5#0.NAOK,26626X37X705sq5#1.NAOK)==2,1,'')) >= (minSelect)) and (count(if(count(26626X37X705sq1#0.NAOK,26626X37X705sq1#1.NAOK)==2,1,''), if(count(26626X37X705sq2#0.NAOK,26626X37X705sq2#1.NAOK)==2,1,''), if(count(26626X37X705sq3#0.NAOK,26626X37X705sq3#1.NAOK)==2,1,''), if(count(26626X37X705sq4#0.NAOK,26626X37X705sq4#1.NAOK)==2,1,''), if(count(26626X37X705sq5#0.NAOK,26626X37X705sq5#1.NAOK)==2,1,'')) <= (maxSelect)))" - * 'prettyValidEqn' => // syntax-highlighted version of validEqn, only showing syntax errors - * 'validTip' => // html fragment to insert for the validation tip -- e.g. "
        Please select between 1 and 3 answer(s)
        " - * 'prettyValidTip' => // version of validTip that can be parsed by EM to create dynmamic validation -- e.g. "
        Please select between {fixnum(minSelect)} and {fixnum(maxSelect)} answer(s)
        " - * 'validJS' => // JavaScript fragment that can perform validation. This is the result of parsing validEqn -- e.g. "LEMif(LEManyNA('minSelect', 'maxSelect'),'',(((LEMcount(LEMif(LEMcount(LEMval('26626X37X705sq1#0.NAOK') , LEMval('26626X37X705sq1#1.NAOK') ) == 2, 1, ''), LEMif(LEMcount(LEMval('26626X37X705sq2#0.NAOK') , LEMval('26626X37X705sq2#1.NAOK') ) == 2, 1, ''), LEMif(LEMcount(LEMval('26626X37X705sq3#0.NAOK') , LEMval('26626X37X705sq3#1.NAOK') ) == 2, 1, ''), LEMif(LEMcount(LEMval('26626X37X705sq4#0.NAOK') , LEMval('26626X37X705sq4#1.NAOK') ) == 2, 1, ''), LEMif(LEMcount(LEMval('26626X37X705sq5#0.NAOK') , LEMval('26626X37X705sq5#1.NAOK') ) == 2, 1, '')) >= (LEMval('minSelect') )) && (LEMcount(LEMif(LEMcount(LEMval('26626X37X705sq1#0.NAOK') , LEMval('26626X37X705sq1#1.NAOK') ) == 2, 1, ''), LEMif(LEMcount(LEMval('26626X37X705sq2#0.NAOK') , LEMval('26626X37X705sq2#1.NAOK') ) == 2, 1, ''), LEMif(LEMcount(LEMval('26626X37X705sq3#0.NAOK') , LEMval('26626X37X705sq3#1.NAOK') ) == 2, 1, ''), LEMif(LEMcount(LEMval('26626X37X705sq4#0.NAOK') , LEMval('26626X37X705sq4#1.NAOK') ) == 2, 1, ''), LEMif(LEMcount(LEMval('26626X37X705sq5#0.NAOK') , LEMval('26626X37X705sq5#1.NAOK') ) == 2, 1, '')) <= (LEMval('maxSelect') )))))" - * 'invalidSQs' => // current list of subquestions that fail validation criteria -- e.g. "26626X37X705sq1#0|26626X37X705sq1#1|26626X37X705sq2#0|26626X37X705sq2#1|26626X37X705sq3#0|26626X37X705sq3#1|26626X37X705sq4#0|26626X37X705sq4#1|26626X37X705sq5#0|26626X37X705sq5#1" - * 'relevantSQs' => // current list of subquestions that are relevant -- e.g. "26626X37X705sq1#0|26626X37X705sq1#1|26626X37X705sq2#0|26626X37X705sq2#1|26626X37X705sq3#0|26626X37X705sq3#1|26626X37X705sq4#0|26626X37X705sq4#1|26626X37X705sq5#0|26626X37X705sq5#1" - * 'irrelevantSQs' => // current list of subquestions that are irrelevant -- e.g. "26626X37X705sq2#0|26626X37X705sq2#1|26626X37X705sq4#0|26626X37X705sq4#1" - * 'subQrelEqn' => // TODO - ?? - * 'mandViolation' => 0 // 1 if the question is mandatory and fails the mandatory criteria - * 'anyUnanswered' => 1 // 1 if any parts of the question are unanswered - * 'mandTip' => '' // message to display if the question fails mandatory criteria - * 'message' => '' // TODO ?? - * 'updatedValues' => // array of values that should be updated for this question, as [$sgqa] = $value - * 'sumEqn' => '' // - * 'sumRemainingEqn' => '' // - * ); - * - * @var type - */ - private $currentQset=NULL; - /** - * last result of NavigateForwards, NavigateBackwards, or JumpTo - * Array of status information about last movement, whether at question, group, or survey level - * - * @example = array( - * 'finished' => 0 // 1 if the survey has been completed and needs to be finalized - * 'message' => '' // any error message that needs to be displayed - * 'seq' => 1 // the sequence count, using gseq, or qseq units if in 'group' or 'question' mode, respectively - * 'mandViolation' => 0 // whether there was any violation of mandatory constraints in the last movement - * 'valid' => 0 // 1 if the last movement passed all validation constraints. 0 if there were any validation errors - * 'unansweredSQs' => // pipe-separated list of any sub-questions that were not answered - * 'invalidSQs' => // pipe-separated list of any sub-questions that failed validation constraints - * ); - * - * @var type - */ - private $lastMoveResult=NULL; - /** - * array of information needed to generate navigation index in question-by-question mode - * One entry for each question, indexed by qseq - * - * @example [4] = array( - * 'qid' => "700" // the question id - * 'qtext' => 'How old are you?' // the question text - * 'qcode' => 'age' // the variable name - * 'qhelp' => '' // the help text - * 'anyUnanswered' => 0 // 1 if there are any sub-questions answered. Used for index display - * 'anyErrors' => 0 // 1 if there are any errors among the sub-questions. Could be used for index display - * 'show' => 1 // 1 if there are any relevant, non-hidden sub-questions. Only if so, then display the index entry - * 'gseq' => 0 // the group sequence - * 'gtext' => // text description for the group - * 'gname' => 'G1' // the group title - * 'gid' => "34" // the group id - * 'mandViolation' => 0 // 1 if the question as a whole fails the mandatory criteria - * 'valid' => 1 // 0 if any part of the question fails validation criteria. - * ); - * - * @var type - */ - private $indexQseq; - /** - * array of information needed to generate navigation index in group-by-group mode - * One entry for each group, indexed by gseq - * - * @example [0] = array( - * 'gtext' => // the description for the group - * 'gname' => 'G1' // the group title - * 'gid' => '34' // the group id - * 'anyUnanswered' => 0 // 1 if any questions within the group are unanswered - * 'anyErrors' => 0 // 1 if any of the questions within the group fail either validity or mandatory constraints - * 'valid' => 1 // 1 if at least question in the group is relevant and non-hidden - * 'mandViolation' => 0 // 1 if at least one relevant, non-hidden question in the group fails mandatory constraints - * 'show' => 1 // 1 if there is at least one relevant, non-hidden question within the group - * ); - * - * @var type - */ - private $indexGseq; - /** - * array of group sequence number to static info - * One entry per group, indexed on gseq - * - * @example [0] = array( - * 'group_order' => 0 // gseq - * 'gid' => "34" // group id - * 'group_name' => 'G2' // the group title - * 'description' => // the description of the group (e.g. gtitle) - * 'grelevance' => '' // the group-level relevance - * ); - * - * @var type - */ - private $gseq2info; - - /** - * the maximum groupSeq reached - this is needed for Index - * @var type - */ - private $maxGroupSeq; - /** - * mapping of questions to information about their subquestions. - * One entry per question, indexed on qid - * - * @example [702] = array( - * 'qid' => 702 // the question id - * 'qseq' => 6 // the question sequence - * 'gseq' => 0 // the group sequence - * 'sgqa' => '26626X34X702' // the root of the SGQA code (reallly just the SGQ) - * 'varName' => 'afSrcFilter_sq1' // the full qcode variable name - note, if there are sub-questions, don't use this one. - * 'type' => 'M' // the one-letter question type - * 'fieldname' => '26626X34X702sq1' // the fieldname (used as JavaScript variable name, and also as database column name - * 'rootVarName' => 'afDS' // the root variable name - * 'preg' => '/[A-Z]+/' // regular expression validation equation, if any - * 'subqs' => array() of sub-questions, where each contains: - * 'rowdivid' => '26626X34X702sq1' // the javascript id identifying the question row (so array_filter can hide rows) - * 'varName' => 'afSrcFilter_sq1' // the full variable name for the sub-question - * 'jsVarName_on' => 'java26626X34X702sq1' // the JavaScript variable name if the variable is defined on the current page - * 'jsVarName' => 'java26626X34X702sq1' // the JavaScript variable name to use if the variable is defined on a different page - * 'csuffix' => 'sq1' // the SGQ suffix to use for a fieldname - * 'sqsuffix' => '_sq1' // the suffix to use for a qcode variable name - * ); - * - * @var type - */ - private $q2subqInfo; - /** - * array of advanced question attributes for each question - * Indexed by qid; available for all quetions - * - * @example [784] = array( - * 'array_filter_exclude' => 'afSrcFilter' - * 'exclude_all_others' => 'sq5' - * 'max_answers' => '3' - * 'min_answers' => '1' - * 'other_replace_text' => '{afSrcFilter_other}' - * ); - * - * @var type - */ - private $qattr; - /** - * list of needed sub-question relevance (e.g. array_filter) - * Indexed by qid then sgqa; only generated for current group of questions - * - * @example [708][26626X37X708sq2] = array( - * 'qid' => '708' // the question id - * 'eqn' => "((26626X34X702sq2 != ''))" // the auto-generated sub-question-level relevance equation - * 'prettyPrintEqn' => '' // only generated if there errors - shows syntax highlighting of them - * 'result' => 0 // result of processing the sub-question-level relevance equation in the current context - * 'numJsVars' => 1 // the number of on-page javascript variables in 'eqn' - * 'relevancejs' => // the generated javascript from 'eqn' -- e.g. "LEMif(LEManyNA('26626X34X702sq2'),'',(((LEMval('26626X34X702sq2') != ""))))" - * 'relevanceVars' => "java26626X34X702sq2" // the pipe-separated list of on-page javascript variables in 'eqn' - * 'rowdivid' => "26626X37X708sq2" // the javascript id of the question row (so can apply array_filter) - * 'type' => 'array_filter' // semicolon delimited list of types of subquestion relevance filters applied - * 'qtype' => 'A' // the single character question type - * 'sgqa' => "26626X37X708" // the SGQ portion of the fieldname - * 'hasErrors' => 0 // 1 if there are any parse errors in the sub-question validation equations - * ); - * - * @var type - */ - private $subQrelInfo=array(); - /** - * array of Group-level relevance status - * Indexed by gseq; only shows groups that have been visited - * - * @example [1] = array( - * 'gseq' => 1 // group sequence - * 'eqn' => '' // the group-level relevance - * 'result' => 1 // result of processing the group-level relevance - * 'numJsVars' => 0 // the number of on-page javascript variables in the group-level relevance equation - * 'relevancejs' => '' // the javascript version of the relevance equation - * 'relevanceVars' => '' // the pipe-delimited list of on-page javascript variable names used within the group-level relevance equation - * 'prettyPrint' => '' // a pretty-print version of the group-level relevance equation, only if there are errors - * ); - * - * @var type - */ - private $gRelInfo=array(); - - /** - * Array of timing information to debug how long it takes for portions of LEM to run. - * Array of timing information (in seconds) for EM to help with debugging - * - * @example [1] = array( - * [0]="LimeExpressionManager::NavigateForwards" - * [1]=1.7079849243164 - * ); - * - * @var type - */ - private $runtimeTimings=array(); - /** - * True (1) if calling LimeExpressionManager functions between StartSurvey and FinishProcessingPage - * Used (mostly deprecated) to detect calls to LEM which happen outside of the normal processing scope - * @var Boolean - */ - private $initialized=false; - /** - * True (1) if have already processed the relevance equations (so don't need to do it again) - * - * @var Boolean - */ - private $processedRelevance=false; - /** - * Message generated to show debug timing values, if debugLevel includes LEM_DEBUG_TIMING - * @var type - */ - private $debugTimingMsg=''; - /** - * temporary variable to reduce need to parse same equation multiple times. Used for relevance and validation - * Array, indexed on equation, providing the following information: - * - * @example ['!is_empty(num)'] = array( - * 'result' => 1 // result of processing the equation in the current scope - * 'prettyPrint' => '' // syntax-highlighted version of equation if there are any errors - * 'hasErrors' => 0 // 1 if there are any syntax errors - * ); - * - * @var type - */ - private $ParseResultCache; - /** - * array of 2nd scale answer lists for types ':' and ';' -- needed for convenient print of logic file - * Indexed on qid; available for all questions - * - * @example [706] = array( - * '1~1' => '1|Never', - * '1~2' => '2|Sometimes', - * '1~3' => '3|Always' - * ); - * - * @var type - */ - private $multiflexiAnswers; - - /** - * used to specify whether to generate equations using SGQA codes or qcodes - * Default is to convert all qcode naming to sgqa naming when generating javascript, as that provides the greatest backwards compatibility - * Excel export of survey structure sets this to false so as to force use of qcode naming - * - * @var Boolean - */ - private $sgqaNaming = true; - /** - * Number of groups in survey (number of possible pages to display) - * @var integer - */ - private $numGroups=0; - /** - * Numer of questions in survey (counting display-only ones?) - * @var integer - */ - private $numQuestions=0; - /** - * Linked list of array filters - * @var array - */ - private $qrootVarName2arrayFilter = array(); - /** - * Array, keyed on qid, to JavaScript and list of variables needed to implement exclude_all_others_auto - * @var type - */ - private $qid2exclusiveAuto = array(); - /** - * Array of values to be updated - * @var type - */ - private $updatedValues = array(); - - - /** - * A private constructor; prevents direct creation of object - */ - private function __construct() - { - self::$instance =& $this; - $this->em = new ExpressionManager(); - if (!isset($_SESSION['LEMlang'])) { - $_SESSION['LEMlang'] = 'en'; // so that there is a default - } - } - - /** - * Ensures there is only one instances of LEM. Note, if switch between surveys, have to clear this cache - * @return LimeExpressionManager - */ - public static function &singleton() - { - $now = microtime(true); - if (isset($_SESSION['LEMdirtyFlag'])) { - $c = __CLASS__; - self::$instance = new $c; - unset($_SESSION['LEMdirtyFlag']); - } - else if (!isset(self::$instance)) { - if (isset($_SESSION['LEMsingleton'])) { - self::$instance = unserialize($_SESSION['LEMsingleton']); - } - else { - $c = __CLASS__; - self::$instance = new $c; - } - } - else { - // does exist, and OK to cache - return self::$instance; - } - // only record duration if have to create new (or unserialize) an instance - self::$instance->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - return self::$instance; - } - - /** - * Prevent users to clone the instance - */ - public function __clone() - { - trigger_error('Clone is not allowed.', E_USER_ERROR); - } - - /** - * Tells Expression Manager that something has changed enough that needs to eliminate internal caching - */ - public static function SetDirtyFlag() - { - $_SESSION['LEMdirtyFlag'] = true; - $_SESSION['LEMforceRefresh'] = true; - } - - /** - * Set the SurveyId - really checks whether the survey you're about to work with is new, and if so, clears the LEM cache - * @param $sid - */ - public static function SetSurveyId($sid=NULL) - { - if (!is_null($sid)) { - if (isset($_SESSION['LEMsid']) && $sid != $_SESSION['LEMsid']) { - // then trying to use a new survey - so clear the LEM cache - $_SESSION['LEMdirtyFlag'] = true; - } - $_SESSION['LEMsid'] = $sid; - } - } - - /** - * Sets the language for Expression Manager. If the language has changed, then EM cache must be invalidated and refreshed - * @param $lang - */ - public static function SetEMLanguage($lang=NULL) - { - if (is_null($lang)) { - return; // should never happen - } - if (!isset($_SESSION['LEMlang'])) { - $_SESSION['LEMlang'] = $lang; - } - if ($_SESSION['LEMlang'] != $lang) { - // then changing languages, so clear cache - // $_SESSION['LEMdirtyFlag'] = true; - $_SESSION['LEMforceRefresh'] = true; - } - $_SESSION['LEMlang'] = $lang; - } - - /** - * Do bulk-update/save of Conditions to Relevance - * @param $surveyId - if NULL, processes the entire database, otherwise just the specified survey - * @param $qid - if specified, just updates that one question - * @return array of query strings - */ - public static function UpgradeConditionsToRelevance($surveyId=NULL, $qid=NULL) - { - LimeExpressionManager::SetDirtyFlag(); // set dirty flag even if not conditions, since must have had a DB change - // Cheat and upgrade question attributes here too. - self::UpgradeQuestionAttributes(true,$surveyId,$qid); - - $releqns = self::ConvertConditionsToRelevance($surveyId,$qid); - $num = count($releqns); - if ($num == 0) { - return NULL; - } - - $queries = array(); - foreach ($releqns as $key=>$value) { - $query = "UPDATE ".db_table_name('questions')." SET relevance=".db_quoteall($value)." WHERE qid=".$key; - db_execute_assoc($query); - $queries[] = $query; - } - LimeExpressionManager::SetDirtyFlag(); - return $queries; - } - - /** - * This reverses UpgradeConditionsToRelevance(). It removes Relevance for questions that have Conditions - * @param $surveyId - * @param $qid - */ - public static function RevertUpgradeConditionsToRelevance($surveyId=NULL, $qid=NULL) - { - LimeExpressionManager::SetDirtyFlag(); // set dirty flag even if not conditions, since must have had a DB change - $releqns = self::ConvertConditionsToRelevance($surveyId,$qid); - $num = count($releqns); - if ($num == 0) { - return NULL; - } - - foreach ($releqns as $key=>$value) { - $query = "UPDATE ".db_table_name('questions')." SET relevance='1' WHERE qid=".$key; - db_execute_assoc($query); - } - return count($releqns); - } - - /** - * If $qid is set, returns the relevance equation generated from conditions (or NULL if there are no conditions for that $qid) - * If $qid is NULL, returns an array of relevance equations generated from Conditions, keyed on the question ID - * @param $surveyId - * @param $qid - if passed, only generates relevance equation for that question - otherwise genereates for all questions with conditions - * @return array of generated relevance strings, indexed by $qid - */ - public static function ConvertConditionsToRelevance($surveyId=NULL, $qid=NULL) - { - $query = LimeExpressionManager::getConditionsForEM($surveyId,$qid); - - $_qid = -1; - $relevanceEqns = array(); - $scenarios = array(); - $relAndList = array(); - $relOrList = array(); - foreach($query->GetRows() as $row) - { - $row['method']=trim($row['method']); //For Postgres - if ($row['qid'] != $_qid) - { - // output the values for prior question is there was one - if ($_qid != -1) - { - if (count($relOrList) > 0) - { - $relAndList[] = '(' . implode(' or ', $relOrList) . ')'; - } - if (count($relAndList) > 0) - { - $scenarios[] = '(' . implode(' and ', $relAndList) . ')'; - } - $relevanceEqn = implode(' or ', $scenarios); - $relevanceEqns[$_qid] = $relevanceEqn; - } - - // clear for next question - $_qid = $row['qid']; - $_scenario = $row['scenario']; - $_cqid = $row['cqid']; - $_subqid = -1; - $relAndList = array(); - $relOrList = array(); - $scenarios = array(); - $releqn = ''; - } - if ($row['scenario'] != $_scenario) - { - if (count($relOrList) > 0) - { - $relAndList[] = '(' . implode(' or ', $relOrList) . ')'; - } - $scenarios[] = '(' . implode(' and ', $relAndList) . ')'; - $relAndList = array(); - $relOrList = array(); - $_scenario = $row['scenario']; - $_cqid = $row['cqid']; - $_subqid = -1; - } - if ($row['cqid'] != $_cqid) - { - $relAndList[] = '(' . implode(' or ', $relOrList) . ')'; - $relOrList = array(); - $_cqid = $row['cqid']; - $_subqid = -1; - } - - // fix fieldnames - if ($row['type'] == '' && preg_match('/^{.+}$/',$row['cfieldname'])) { - $fieldname = substr($row['cfieldname'],1,-1); // {TOKEN:xxxx} - $subqid = $fieldname; - $value = $row['value']; - } - else if ($row['type'] == 'M' || $row['type'] == 'P') { - if (substr($row['cfieldname'],0,1) == '+') { - // if prefixed with +, then a fully resolved name - $fieldname = substr($row['cfieldname'],1) . '.NAOK'; - $subqid = $fieldname; - $value = $row['value']; - } - else { - // else create name by concatenating two parts together - $fieldname = $row['cfieldname'] . $row['value'] . '.NAOK'; - $subqid = $row['cfieldname']; - $value = 'Y'; - } - } - else { - $fieldname = $row['cfieldname'] . '.NAOK'; - $subqid = $fieldname; - $value = $row['value']; - } - if ($_subqid != -1 && $_subqid != $subqid) - { - $relAndList[] = '(' . implode(' or ', $relOrList) . ')'; - $relOrList = array(); - } - $_subqid = $subqid; - - // fix values - if (preg_match('/^@\d+X\d+X\d+.*@$/',$value)) { - $value = substr($value,1,-1); - } - else if (preg_match('/^{.+}$/',$value)) { - $value = substr($value,1,-1); - } - else if ($row['method'] == 'RX') { - if (!preg_match('#^/.*/$#',$value)) - { - $value = '"/' . $value . '/"'; // if not surrounded by slashes, add them. - } - } - else { - $value = '"' . $value . '"'; - } - - // add equation - if ($row['method'] == 'RX') - { - $relOrList[] = "regexMatch(" . $value . "," . $fieldname . ")"; - } - else - { - // Conditions uses ' ' to mean not answered, but internally it is really stored as ''. Fix this - if ($value === '" "' || $value == '""') { - if ($row['method'] == '==') - { - $relOrList[] = "is_empty(" . $fieldname . ")"; - } - else if ($row['method'] == '!=') - { - $relOrList[] = "!is_empty(" . $fieldname . ")"; - } - else - { - $relOrList[] = $fieldname . " " . $row['method'] . " " . $value; - } - } - else - { - if ($value == '"0"' || !preg_match('/^".+"$/',$value)) - { - switch ($row['method']) - { - case '==': - case '<': - case '<=': - case '>=': - $relOrList[] = '(!is_empty(' . $fieldname . ') && (' . $fieldname . " " . $row['method'] . " " . $value . '))'; - break; - case '!=': - $relOrList[] = '(is_empty(' . $fieldname . ') || (' . $fieldname . " != " . $value . '))'; - break; - default: - $relOrList[] = $fieldname . " " . $row['method'] . " " . $value; - break; - } - } - else - { - switch ($row['method']) - { - case '<': - case '<=': - $relOrList[] = '(!is_empty(' . $fieldname . ') && (' . $fieldname . " " . $row['method'] . " " . $value . '))'; - break; - default: - $relOrList[] = $fieldname . " " . $row['method'] . " " . $value; - break; - } - } - } - } - - if ($row['cqid'] == 0 || substr($row['cfieldname'],0,1) == '+') { - $_cqid = -1; // forces this statement to be ANDed instead of being part of a cqid OR group - } - } - // output last one - if ($_qid != -1) - { - if (count($relOrList) > 0) - { - $relAndList[] = '(' . implode(' or ', $relOrList) . ')'; - } - if (count($relAndList) > 0) - { - $scenarios[] = '(' . implode(' and ', $relAndList) . ')'; - } - $relevanceEqn = implode(' or ', $scenarios); - $relevanceEqns[$_qid] = $relevanceEqn; - } - if (is_null($qid)) { - return $relevanceEqns; - } - else { - if (isset($relevanceEqns[$qid])) - { - $result = array(); - $result[$qid] = $relevanceEqns[$qid]; - return $result; - } - else - { - return NULL; - } - } - } - - /** - * Return list of relevance equations generated from conditions - * @param $surveyId - * @param $qid - * @return array of relevance equations, indexed by $qid - */ - public static function UnitTestConvertConditionsToRelevance($surveyId=NULL, $qid=NULL) - { - $LEM =& LimeExpressionManager::singleton(); - return $LEM->ConvertConditionsToRelevance($surveyId, $qid); - } - - /** - * Process all question attributes that apply to EM - * (1) Sub-question-level relevance: e.g. array_filter, array_filter_exclude - * (2) Validations: e.g. min/max number of answers; min/max/eq sum of answers - * @param $onlyThisQseq - only process these attributes for the specified question - */ - public function _CreateSubQLevelRelevanceAndValidationEqns($onlyThisQseq=NULL) - { - // $now = microtime(true); - $this->subQrelInfo=array(); // reset it each time this is called - $subQrels = array(); // array of sub-question-level relevance equations - $validationEqn = array(); - $validationTips = array(); // array of visible tips for validation criteria, indexed by $qid - - // Associate these with $qid so that can be nested under appropriate question-level relevance - foreach ($this->q2subqInfo as $qinfo) - { - if (!is_null($onlyThisQseq) && $onlyThisQseq != $qinfo['qseq']) { - continue; - } - else if (!$this->allOnOnePage && $this->currentGroupSeq != $qinfo['gseq']) { - continue; // only need subq relevance for current page. - } - $questionNum = $qinfo['qid']; - $type = $qinfo['type']; - $hasSubqs = (isset($qinfo['subqs']) && count($qinfo['subqs'] > 0)); - $qattr = isset($this->qattr[$questionNum]) ? $this->qattr[$questionNum] : array(); - - if (isset($qattr['input_boxes']) && $qattr['input_boxes'] == '1') - { - $input_boxes='1'; - } - else - { - $input_boxes=''; - } - - if (isset($qattr['value_range_allows_missing']) && $qattr['value_range_allows_missing'] == '1') - { - $value_range_allows_missing = true; - } - else - { - $value_range_allows_missing = false; - } - - // array_filter - // If want to filter question Q2 on Q1, where each have subquestions SQ1-SQ3, this is equivalent to relevance equations of: - // relevance for Q2_SQ1 is Q1_SQ1!='' - $array_filter = NULL; - if (isset($qattr['array_filter']) && trim($qattr['array_filter']) != '') - { - $array_filter = $qattr['array_filter']; - $this->qrootVarName2arrayFilter[$qinfo['rootVarName']]['array_filter'] = $array_filter; - } - - // array_filter_exclude - // If want to filter question Q2 on Q1, where each have subquestions SQ1-SQ3, this is equivalent to relevance equations of: - // relevance for Q2_SQ1 is Q1_SQ1=='' - $array_filter_exclude = NULL; - if (isset($qattr['array_filter_exclude']) && trim($qattr['array_filter_exclude']) != '') - { - $array_filter_exclude = $qattr['array_filter_exclude']; - $this->qrootVarName2arrayFilter[$qinfo['rootVarName']]['array_filter_exclude'] = $array_filter_exclude; - } - - // array_filter and array_filter_exclude get processed together - if (!is_null($array_filter) || !is_null($array_filter_exclude)) - { - if ($hasSubqs) { - $cascadedAF = array(); - $cascadedAFE = array(); - - list($cascadedAF, $cascadedAFE) = $this->_recursivelyFindAntecdentArrayFilters($qinfo['rootVarName'],array(),array()); - - $cascadedAF = array_reverse($cascadedAF); - $cascadedAFE = array_reverse($cascadedAFE); - - $subqs = $qinfo['subqs']; - if ($type == 'R') { - $subqs = array(); - foreach ($this->qans[$qinfo['qid']] as $k=>$v) - { - $_code = explode('~',$k); - $subqs[] = array( - 'rowdivid'=>$qinfo['sgqa'] . $_code[1], - 'sqsuffix'=>'_' . $_code[1], - ); - } - } - $last_rowdivid = '--'; - foreach ($subqs as $sq) { - if ($sq['rowdivid'] == $last_rowdivid) - { - continue; - } - $last_rowdivid = $sq['rowdivid']; - $af_names = array(); - $afe_names = array(); - switch ($type) - { - case '1': //Array (Flexible Labels) dual scale - case ':': //ARRAY (Multi Flexi) 1 to 10 - case ';': //ARRAY (Multi Flexi) Text - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': //ARRAY (Flexible) - Row Format - case 'L': //LIST drop-down/radio-button list - case 'M': //Multiple choice checkbox - case 'P': //Multiple choice with comments checkbox + text - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT -// case 'R': //Ranking -// if ($this->sgqaNaming) -// { - foreach ($cascadedAF as $_caf) - { - $sgq = ((isset($this->qcode2sgq[$_caf])) ? $this->qcode2sgq[$_caf] : $_caf); - $fqid = explode('X',$sgq); - if (!isset($fqid[2])) - { - continue; - } - $fqid = $fqid[2]; - if ($this->q2subqInfo[$fqid]['type'] == 'R') - { - $rankables = array(); - foreach ($this->qans[$fqid] as $k=>$v) - { - $rankable = explode('~',$k); - $rankables[] = '_' . $rankable[1]; - } - if (array_search($sq['sqsuffix'],$rankables) === false) - { - continue; - } - } - $fsqs = array(); - foreach ($this->q2subqInfo[$fqid]['subqs'] as $fsq) - { - if ($this->q2subqInfo[$fqid]['type'] == 'R') - { - // we know the suffix exists - $fsqs[] = '(' . $sgq . $fsq['csuffix'] . ".NAOK == '" . substr($sq['sqsuffix'],1) . "')"; - } - else if ($this->q2subqInfo[$fqid]['type'] == ':' && isset($this->qattr[$fqid]['multiflexible_checkbox']) && $this->qattr[$fqid]['multiflexible_checkbox']=='1') - { - if ($fsq['sqsuffix'] == $sq['sqsuffix']) - { - $fsqs[] = $sgq . $fsq['csuffix'] . '.NAOK=="1"'; - } - } - else - { - if ($fsq['sqsuffix'] == $sq['sqsuffix']) - { - $fsqs[] = '!is_empty(' . $sgq . $fsq['csuffix'] . '.NAOK)'; - } - } - } - if (count($fsqs) > 0) - { - $af_names[] = '(' . implode(' or ', $fsqs) . ')'; - } - } - foreach ($cascadedAFE as $_cafe) - { - $sgq = ((isset($this->qcode2sgq[$_cafe])) ? $this->qcode2sgq[$_cafe] : $_cafe); - $fqid = explode('X',$sgq); - if (!isset($fqid[2])) - { - continue; - } - $fqid = $fqid[2]; - if ($this->q2subqInfo[$fqid]['type'] == 'R') - { - $rankables = array(); - foreach ($this->qans[$fqid] as $k=>$v) - { - $rankable = explode('~',$k); - $rankables[] = '_' . $rankable[1]; - } - if (array_search($sq['sqsuffix'],$rankables) === false) - { - continue; - } - } - $fsqs = array(); - foreach ($this->q2subqInfo[$fqid]['subqs'] as $fsq) - { - if ($this->q2subqInfo[$fqid]['type'] == 'R') - { - // we know the suffix exists - $fsqs[] = '(' . $sgq . $fsq['csuffix'] . ".NAOK != '" . substr($sq['sqsuffix'],1) . "')"; - } - else if ($this->q2subqInfo[$fqid]['type'] == ':' && isset($this->qattr[$fqid]['multiflexible_checkbox']) && $this->qattr[$fqid]['multiflexible_checkbox']=='1') - { - if ($fsq['sqsuffix'] == $sq['sqsuffix']) - { - $fsqs[] = $sgq . $fsq['csuffix'] . '.NAOK!="1"'; - } - } - else - { - if ($fsq['sqsuffix'] == $sq['sqsuffix']) - { - $fsqs[] = 'is_empty(' . $sgq . $fsq['csuffix'] . '.NAOK)'; - } - } - } - if (count($fsqs) > 0) - { - $afe_names[] = '(' . implode(' and ', $fsqs) . ')'; - } - } -// } -// else // TODO - implement qcode naming for this -// { -// foreach ($cascadedAF as $_caf) -// { -// $sgq = $_caf . $sq['sqsuffix']; -// if (isset($this->knownVars[$sgq])) -// { -// $af_names[] = $sgq . '.NAOK'; -// } -// } -// foreach ($cascadedAFE as $_cafe) -// { -// $sgq = $_cafe . $sq['sqsuffix']; -// if (isset($this->knownVars[$sgq])) -// { -// $afe_names[] = $sgq . '.NAOK'; -// } -// } -// } - break; - default: - break; - } - $af_names = array_unique($af_names); - $afe_names= array_unique($afe_names); - - if (count($af_names) > 0 || count($afe_names) > 0) { - $afs_eqn = ''; - if (count($af_names) > 0) - { - $afs_eqn .= implode(' && ', $af_names); - } - if (count($afe_names) > 0) - { - if ($afs_eqn != '') - { - $afs_eqn .= ' && '; - } - $afs_eqn .= implode(' && ', $afe_names); - } - - $subQrels[] = array( - 'qtype' => $type, - 'type' => 'array_filter', - 'rowdivid' => $sq['rowdivid'], - 'eqn' => '(' . $afs_eqn . ')', - 'qid' => $questionNum, - 'sgqa' => $qinfo['sgqa'], - ); - } - } - } - } - - // code_filter: WZ - // This can be skipped, since question types 'W' (list-dropdown-flexible) and 'Z'(list-radio-flexible) are no longer supported - - // equals_num_value - // Validation:= sum(sq1,...,sqN) == value (which could be an expression). - if (isset($qattr['equals_num_value']) && trim($qattr['equals_num_value']) != '') - { - $equals_num_value = $qattr['equals_num_value']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - if ($this->sgqaNaming) - { - $sq_name = $sq['rowdivid'] . '.NAOK'; - } - else - { - $sq_name = $sq['varName'] . '.NAOK'; - } - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - // sumEqn and sumRemainingEqn may need to be rounded if using sliders - $precision=LEM_DEFAULT_PRECISION; // default is not to round - if (isset($qattr['slider_layout']) && $qattr['slider_layout']=='1') - { - $precision=0; // default is to round to whole numbers - if (isset($qattr['slider_accuracy']) && trim($qattr['slider_accuracy'])!='') - { - $slider_accuracy = $qattr['slider_accuracy']; - $_parts = explode('.',$slider_accuracy); - if (isset($_parts[1])) - { - $precision = strlen($_parts[1]); // number of digits after mantissa - } - } - } - $sumEqn = 'sum(' . implode(', ', $sq_names) . ')'; - $sumRemainingEqn = '(' . $equals_num_value . ' - sum(' . implode(', ', $sq_names) . '))'; - $mainEqn = 'sum(' . implode(', ', $sq_names) . ')'; - - if (!is_null($precision)) - { - $sumEqn = 'round(' . $sumEqn . ', ' . $precision . ')'; - $sumRemainingEqn = 'round(' . $sumRemainingEqn . ', ' . $precision . ')'; - $mainEqn = 'round(' . $mainEqn . ', ' . $precision . ')'; - } - - $noanswer_option = ''; - if ($value_range_allows_missing) - { - $noanswer_option = ' || count(' . implode(', ', $sq_names) . ') == 0'; - } - - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'equals_num_value', - 'class' => 'sum_range', - // Different script for mandatory or non-mandatory question - 'eqn' => ($qinfo['mandatory']=='Y')?'(' . $mainEqn . ' == (' . $equals_num_value . '))':'(' . $mainEqn . ' == (' . $equals_num_value . ')' . $noanswer_option . ')', - 'qid' => $questionNum, - 'sumEqn' => $sumEqn, - 'sumRemainingEqn' => $sumRemainingEqn, - ); - } - } - } - else - { - $equals_num_value=''; - } - - // exclude_all_others - // If any excluded options are true (and relevant), then disable all other input elements for that question - if (isset($qattr['exclude_all_others']) && trim($qattr['exclude_all_others']) != '') - { - $exclusive_options = explode(';',$qattr['exclude_all_others']); - if ($hasSubqs) { - foreach ($exclusive_options as $exclusive_option) - { - $exclusive_option = trim($exclusive_option); - if ($exclusive_option == '') { - continue; - } - $subqs = $qinfo['subqs']; - $sq_names = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - if ($sq['csuffix'] == $exclusive_option) - { - continue; // so don't make the excluded option irrelevant - } - switch ($type) - { - case ':': //ARRAY (Multi Flexi) 1 to 10 - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': //ARRAY (Flexible) - Row Format - case 'M': //Multiple choice checkbox - case 'P': //Multiple choice with comments checkbox + text - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - if ($this->sgqaNaming) - { - $sq_name = $qinfo['sgqa'] . trim($exclusive_option) . '.NAOK'; - } - else - { - $sq_name = $qinfo['sgqa'] . trim($exclusive_option) . '.NAOK'; - } - break; - default: - break; - } - if (!is_null($sq_name)) { - $subQrels[] = array( - 'qtype' => $type, - 'type' => 'exclude_all_others', - 'rowdivid' => $sq['rowdivid'], - 'eqn' => 'is_empty(' . $sq_name . ')', - 'qid' => $questionNum, - 'sgqa' => $qinfo['sgqa'], - ); - } - } - } - } - } - else - { - $exclusive_option = ''; - } - - // exclude_all_others_auto - // if (count(this.relevanceStatus) == count(this)) { set exclusive option value to "Y" and call checkconditions() } - // However, note that would need to blank the values, not use relevance, otherwise can't unclick the _auto option without having it re-enable itself - if (isset($qattr['exclude_all_others_auto']) && trim($qattr['exclude_all_others_auto']) == '1' - && isset($qattr['exclude_all_others']) && trim($qattr['exclude_all_others']) != '' && count(explode(';',trim($qattr['exclude_all_others']))) == 1) - { - $exclusive_option = trim($qattr['exclude_all_others']); - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case 'M': //Multiple choice checkbox - case 'P': //Multiple choice with comments checkbox + text - if ($this->sgqaNaming) - { - $sq_name = substr($sq['jsVarName'],4); - } - else - { - $sq_name = $sq['varName']; - } - break; - default: - break; - } - if (!is_null($sq_name)) - { - if ($sq['csuffix'] == $exclusive_option) - { - $eoVarName = substr($sq['jsVarName'],4); - } - else - { - $sq_names[] = $sq_name; - } - } - } - if (count($sq_names) > 0) { - $relpart = "sum(" . implode(".relevanceStatus, ", $sq_names) . ".relevanceStatus)"; - $checkedpart = "count(" . implode(".NAOK, ", $sq_names) . ".NAOK)"; - $eoRelevantAndUnchecked = "(" . $eoVarName . ".relevanceStatus && is_empty(" . $eoVarName . "))"; - $eoEqn = "(" . $eoRelevantAndUnchecked . " && (" . $relpart . " == " . $checkedpart . "))"; - - $this->em->ProcessBooleanExpression($eoEqn, $qinfo['gseq'], $qinfo['qseq']); - - $relevanceVars = implode('|',$this->em->GetJSVarsUsed()); - $relevanceJS = $this->em->GetJavaScriptEquivalentOfExpression(); - - // Unset all checkboxes and hidden values for this question (irregardless of whether they are array filtered) - $eosaJS = "if (" . $relevanceJS . ") {\n"; - $eosaJS .=" $('#question" . $questionNum . " [type=checkbox]').attr('checked',false);\n"; - $eosaJS .=" $('#java" . $qinfo['sgqa'] . "other').val('');\n"; - $eosaJS .=" $('#answer" . $qinfo['sgqa'] . "other').val('');\n"; - $eosaJS .=" $('[id^=java" . $qinfo['sgqa'] . "]').val('');\n"; - $eosaJS .=" $('#answer" . $eoVarName . "').attr('checked',true);\n"; - $eosaJS .=" $('#java" . $eoVarName . "').val('Y');\n"; - $eosaJS .=" LEMrel" . $questionNum . "();\n"; - $eosaJS .=" relChange" . $questionNum ."=true;\n"; - $eosaJS .="}\n"; - - $this->qid2exclusiveAuto[$questionNum] = array( - 'js'=>$eosaJS, - 'relevanceVars'=>$relevanceVars, // so that EM knows which variables to declare - 'rowdivid'=>$eoVarName, // to ensure that EM creates a hidden relevanceSGQA input for the exclusive option - ); - } - } - } - - // min_answers - // Validation:= count(sq1,...,sqN) >= value (which could be an expression). - if (isset($qattr['min_answers']) && trim($qattr['min_answers']) != '') - { - $min_answers = $qattr['min_answers']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case '1': //Array (Flexible Labels) dual scale - if (substr($sq['varName'],-1,1) == '0') - { - if ($this->sgqaNaming) - { - $base = substr(substr($sq['jsVarName'],4),0,-1); - $sq_name = "if(count(" . $base . "0.NAOK," . $base . "1.NAOK)==2,1,'')"; - } - else - { - $base = substr($sq['varName'],0,-1); - $sq_name = "if(count(" . $base . "0.NAOK," . $base . "1.NAOK)==2,1,'')"; - } - } - break; - case ':': //ARRAY (Multi Flexi) 1 to 10 - case ';': //ARRAY (Multi Flexi) Text - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': //ARRAY (Flexible) - Row Format - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case 'M': //Multiple choice checkbox - case 'R': //RANKING STYLE - if ($this->sgqaNaming) - { - $sq_name = substr($sq['jsVarName'],4) . '.NAOK'; - } - else - { - $sq_name = $sq['varName'] . '.NAOK'; - } - break; - case 'P': //Multiple choice with comments checkbox + text - if (!preg_match('/comment$/',$sq['varName'])) { - if ($this->sgqaNaming) - { - $sq_name = $sq['rowdivid'] . '.NAOK'; - } - else - { - $sq_name = $sq['rowdivid'] . '.NAOK'; - } - } - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'min_answers', - 'class' => 'num_answers', - 'eqn' => 'if(is_empty('.$min_answers.'),1,(count(' . implode(', ', $sq_names) . ') >= (' . $min_answers . ')))', - 'qid' => $questionNum, - ); - } - } - } - else - { - $min_answers=''; - } - - // max_answers - // Validation:= count(sq1,...,sqN) <= value (which could be an expression). - if (isset($qattr['max_answers']) && trim($qattr['max_answers']) != '') - { - $max_answers = $qattr['max_answers']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case '1': //Array (Flexible Labels) dual scale - if (substr($sq['varName'],-1,1) == '0') - { - if ($this->sgqaNaming) - { - $base = substr(substr($sq['jsVarName'],4),0,-1); - $sq_name = "if(count(" . $base . "0.NAOK," . $base . "1.NAOK)==2,1,'')"; - } - else - { - $base = substr($sq['varName'],0,-1); - $sq_name = "if(count(" . $base . "0.NAOK," . $base . "1.NAOK)==2,1,'')"; - } - } - break; - case ':': //ARRAY (Multi Flexi) 1 to 10 - case ';': //ARRAY (Multi Flexi) Text - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': //ARRAY (Flexible) - Row Format - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case 'M': //Multiple choice checkbox - case 'R': //RANKING STYLE - if ($this->sgqaNaming) - { - $sq_name = substr($sq['jsVarName'],4) . '.NAOK'; - } - else - { - $sq_name = $sq['varName'] . '.NAOK'; - } - break; - case 'P': //Multiple choice with comments checkbox + text - if (!preg_match('/comment$/',$sq['varName'])) { - if ($this->sgqaNaming) - { - $sq_name = $sq['rowdivid'] . '.NAOK'; - } - else - { - $sq_name = $sq['varName'] . '.NAOK'; - } - } - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'max_answers', - 'class' => 'num_answers', - 'eqn' => '(if(is_empty('.$max_answers.'),1,count(' . implode(', ', $sq_names) . ') <= (' . $max_answers . ')))', - 'qid' => $questionNum, - ); - } - } - } - else - { - $max_answers=''; - } - - // min_num_value_n - // Validation:= N >= value (which could be an expression). - if (isset($qattr['min_num_value_n']) && trim($qattr['min_num_value_n']) != '') - { - $min_num_value_n = $qattr['min_num_value_n']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - $subqValidEqns = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - if ($this->sgqaNaming) - { - if(($qinfo['mandatory']=='Y')){ - $sq_name = '('. $sq['rowdivid'] . '.NAOK >= (' . $min_num_value_n . '))'; - }else{ - $sq_name = '(is_empty(' . $sq['rowdivid'] . '.NAOK) || '. $sq['rowdivid'] . '.NAOK >= (' . $min_num_value_n . '))'; - } - } - else - { - if(($qinfo['mandatory']=='Y')){ - $sq_name = '('. $sq['varName'] . '.NAOK >= (' . $min_num_value_n . '))'; - }else{ - $sq_name = '(is_empty(' . $sq['varName'] . '.NAOK) || '. $sq['varName'] . '.NAOK >= (' . $min_num_value_n . '))'; - } - } - $subqValidSelector = $sq['jsVarName_on']; - break; - case 'N': //NUMERICAL QUESTION TYPE - if ($this->sgqaNaming) - { - if(($qinfo['mandatory']=='Y')){ - $sq_name = '('. $sq['rowdivid'] . '.NAOK >= (' . $min_num_value_n . '))'; - }else{ - $sq_name = '(is_empty(' . $sq['rowdivid'] . '.NAOK) || '. $sq['rowdivid'] . '.NAOK >= (' . $min_num_value_n . '))'; - } - } - else - { - if(($qinfo['mandatory']=='Y')){ - $sq_name = '('. $sq['varName'] . '.NAOK >= (' . $min_num_value_n . '))'; - }else{ - $sq_name = '(is_empty(' . $sq['varName'] . '.NAOK) || '. $sq['varName'] . '.NAOK >= (' . $min_num_value_n . '))'; - } - } - $subqValidSelector = ''; - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - $subqValidEqns[$subqValidSelector] = array( - 'subqValidEqn' => $sq_name, - 'subqValidSelector' => $subqValidSelector, - ); - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'min_num_value_n', - 'class' => 'value_range', - 'eqn' => implode(' && ', $sq_names), - 'qid' => $questionNum, - 'subqValidEqns' => $subqValidEqns, - ); - } - } - } - else - { - $min_num_value_n=''; - } - - // max_num_value_n - // Validation:= N <= value (which could be an expression). - if (isset($qattr['max_num_value_n']) && trim($qattr['max_num_value_n']) != '') - { - $max_num_value_n = $qattr['max_num_value_n']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - $subqValidEqns = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - if ($this->sgqaNaming) - { - $sq_name = '(is_empty(' . $sq['rowdivid'] . '.NAOK) || '. $sq['rowdivid'] . '.NAOK <= (' . $max_num_value_n . '))'; - } - else - { - $sq_name = '(is_empty(' . $sq['varName'] . '.NAOK) || '. $sq['varName'] . '.NAOK <= (' . $max_num_value_n . '))'; - } - $subqValidSelector = $sq['jsVarName_on']; - break; - case 'N': //NUMERICAL QUESTION TYPE - if ($this->sgqaNaming) - { - $sq_name = '(is_empty(' . $sq['rowdivid'] . '.NAOK) || '. $sq['rowdivid'] . '.NAOK <= (' . $max_num_value_n . '))'; - } - else - { - $sq_name = '(is_empty(' . $sq['varName'] . '.NAOK) || '. $sq['varName'] . '.NAOK <= (' . $max_num_value_n . '))'; - } - $subqValidSelector = ''; - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - $subqValidEqns[$subqValidSelector] = array( - 'subqValidEqn' => $sq_name, - 'subqValidSelector' => $subqValidSelector, - ); - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'max_num_value_n', - 'class' => 'value_range', - 'eqn' => implode(' && ', $sq_names), - 'qid' => $questionNum, - 'subqValidEqns' => $subqValidEqns, - ); - } - } - } - else - { - $max_num_value_n=''; - } - - // min_num_value - // Validation:= sum(sq1,...,sqN) >= value (which could be an expression). - if (isset($qattr['min_num_value']) && trim($qattr['min_num_value']) != '') - { - $min_num_value = $qattr['min_num_value']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - if ($this->sgqaNaming) - { - $sq_name = $sq['rowdivid'] . '.NAOK'; - } - else - { - $sq_name = $sq['varName'] . '.NAOK'; - } - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - - $sumEqn = 'sum(' . implode(', ', $sq_names) . ')'; - $precision = LEM_DEFAULT_PRECISION; - if (!is_null($precision)) - { - $sumEqn = 'round(' . $sumEqn . ', ' . $precision . ')'; - } - - $noanswer_option = ''; - if ($value_range_allows_missing) - { - $noanswer_option = ' || count(' . implode(', ', $sq_names) . ') == 0'; - } - - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'min_num_value', - 'class' => 'sum_range', - 'eqn' => '(sum(' . implode(', ', $sq_names) . ') >= (' . $min_num_value . ')' . $noanswer_option . ')', - 'qid' => $questionNum, - 'sumEqn' => $sumEqn, - ); - } - } - } - else - { - $min_num_value=''; - } - - // max_num_value - // Validation:= sum(sq1,...,sqN) <= value (which could be an expression). - if (isset($qattr['max_num_value']) && trim($qattr['max_num_value']) != '') - { - $max_num_value = $qattr['max_num_value']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - if ($this->sgqaNaming) - { - $sq_name = $sq['rowdivid'] . '.NAOK'; - } - else - { - $sq_name = $sq['varName'] . '.NAOK'; - } - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $sumEqn = 'sum(' . implode(', ', $sq_names) . ')'; - $precision = LEM_DEFAULT_PRECISION; - if (!is_null($precision)) - { - $sumEqn = 'round(' . $sumEqn . ', ' . $precision . ')'; - } - - $noanswer_option = ''; - if ($value_range_allows_missing) - { - $noanswer_option = ' || count(' . implode(', ', $sq_names) . ') == 0'; - } - - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'max_num_value', - 'class' => 'sum_range', - 'eqn' => '(sum(' . implode(', ', $sq_names) . ') <= (' . $max_num_value . ')' . $noanswer_option . ')', - 'qid' => $questionNum, - 'sumEqn' => $sumEqn, - ); - } - } - } - else - { - $max_num_value=''; - } - - // multiflexible_min - // Validation:= sqN >= value (which could be an expression). - if (isset($qattr['multiflexible_min']) && trim($qattr['multiflexible_min']) != '' && $input_boxes=='1') - { - $multiflexible_min = $qattr['multiflexible_min']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - $subqValidEqns = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case ':': //MULTIPLE NUMERICAL QUESTION - if ($this->sgqaNaming) - { - $sgqa = substr($sq['jsVarName'],4); - $sq_name = '(is_empty(' . $sgqa . '.NAOK) || ' . $sgqa . '.NAOK >= (' . $multiflexible_min . '))'; - } - else - { - $sq_name = '(is_empty(' . $sq['varName'] . '.NAOK) || ' . $sq['varName'] . '.NAOK >= (' . $multiflexible_min . '))'; - } - $subqValidSelector = $sq['jsVarName_on']; - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - $subqValidEqns[$subqValidSelector] = array( - 'subqValidEqn' => $sq_name, - 'subqValidSelector' => $subqValidSelector, - ); - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'multiflexible_min', - 'class' => 'value_range', - 'eqn' => implode(' && ', $sq_names), - 'qid' => $questionNum, - 'subqValidEqns' => $subqValidEqns, - ); - } - } - } - else - { - $multiflexible_min=''; - } - - // multiflexible_max - // Validation:= sqN <= value (which could be an expression). - if (isset($qattr['multiflexible_max']) && trim($qattr['multiflexible_max']) != '' && $input_boxes=='1') - { - $multiflexible_max = $qattr['multiflexible_max']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - $subqValidEqns = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case ':': //MULTIPLE NUMERICAL QUESTION - if ($this->sgqaNaming) - { - $sgqa = substr($sq['jsVarName'],4); - $sq_name = '(is_empty(' . $sgqa . '.NAOK) || ' . $sgqa . '.NAOK <= (' . $multiflexible_max . '))'; - } - else - { - $sq_name = '(is_empty(' . $sq['varName'] . '.NAOK) || ' . $sq['varName'] . '.NAOK <= (' . $multiflexible_max . '))'; - } - $subqValidSelector = $sq['jsVarName_on']; - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - $subqValidEqns[$subqValidSelector] = array( - 'subqValidEqn' => $sq_name, - 'subqValidSelector' => $subqValidSelector, - ); - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'multiflexible_max', - 'class' => 'value_range', - 'eqn' => implode(' && ', $sq_names), - 'qid' => $questionNum, - 'subqValidEqns' => $subqValidEqns, - ); - } - } - } - else - { - $multiflexible_max=''; - } - - // min_num_of_files - // Validation:= sq_filecount >= value (which could be an expression). - if (isset($qattr['min_num_of_files']) && trim($qattr['min_num_of_files']) != '') - { - $min_num_of_files = $qattr['min_num_of_files']; - $eqn=''; - $sgqa = $qinfo['sgqa']; - switch ($type) - { - case '|': //List - dropdown - $eqn = "(" . $sgqa . "_filecount >= (" . $min_num_of_files . "))"; - break; - default: - break; - } - if ($eqn != '') - { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'min_num_of_files', - 'class' => 'num_answers', - 'eqn' => $eqn, - 'qid' => $questionNum, - ); - } - } - else - { - $min_num_of_files = ''; - } - - // max_num_of_files - // Validation:= sq_filecount <= value (which could be an expression). - if (isset($qattr['max_num_of_files']) && trim($qattr['max_num_of_files']) != '') - { - $max_num_of_files = $qattr['max_num_of_files']; - $eqn=''; - $sgqa = $qinfo['sgqa']; - switch ($type) - { - case '|': //List - dropdown - $eqn = "(" . $sgqa . "_filecount <= (" . $max_num_of_files . "))"; - break; - default: - break; - } - if ($eqn != '') - { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'max_num_of_files', - 'class' => 'num_answers', - 'eqn' => $eqn, - 'qid' => $questionNum, - ); - } - } - else - { - $max_num_of_files = ''; - } - - // other_comment_mandatory - // Validation:= sqN <= value (which could be an expression). - if (isset($qattr['other_comment_mandatory']) && trim($qattr['other_comment_mandatory']) == '1') - { - $other_comment_mandatory = $qattr['other_comment_mandatory']; - $eqn=''; - if ($other_comment_mandatory == '1' && $this->questionSeq2relevance[$qinfo['qseq']]['other'] == 'Y') - { - $sgqa = $qinfo['sgqa']; - switch ($type) - { - case '!': //List - dropdown - case 'L': //LIST drop-down/radio-button list - $eqn = "(" . $sgqa . ".NAOK!='-oth-' || (" . $sgqa . ".NAOK=='-oth-' && !is_empty(trim(" . $sgqa . "other.NAOK))))"; - break; - case 'P': //Multiple choice with comments checkbox + text - $eqn = "(is_empty(trim(" . $sgqa . "other.NAOK)) || (!is_empty(trim(" . $sgqa . "other.NAOK)) && !is_empty(trim(" . $sgqa . "othercomment.NAOK))))"; - break; - default: - break; - } - } - if ($eqn != '') - { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'other_comment_mandatory', - 'class' => 'other_comment_mandatory', - 'eqn' => $eqn, - 'qid' => $questionNum, - ); - } - } - else - { - $other_comment_mandatory = ''; - } - - - // show_totals - // TODO - create equations for these? - - // assessment_value - // TODO? How does it work? - // The assessment value (referenced how?) = count(sq1,...,sqN) * assessment_value - // Since there are easy work-arounds to this, skipping it for now - - // preg - a PHP Regular Expression to validate text input fields - if (isset($qinfo['preg']) && !is_null($qinfo['preg'])) - { - $preg = $qinfo['preg']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - $subqValidEqns = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - $sgqa = substr($sq['jsVarName'],4); - switch ($type) - { - case 'N': //NUMERICAL QUESTION TYPE - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case ';': //ARRAY (Multi Flexi) Text - case ':': //ARRAY (Multi Flexi) 1 to 10 - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - if ($this->sgqaNaming) - { - $sq_name = '(if(is_empty('.$sgqa.'.NAOK),0,!regexMatch("' . $preg . '", ' . $sgqa . '.NAOK)))'; - } - else - { - $sq_name = '(if(is_empty('.$sq['varName'].'.NAOK),0,!regexMatch("' . $preg . '", ' . $sq['varName'] . '.NAOK)))'; - } - break; - default: - break; - } - switch ($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case ';': //ARRAY (Multi Flexi) Text - case ':': //ARRAY (Multi Flexi) 1 to 10 - if ($this->sgqaNaming) - { - $subqValidEqn = '(is_empty('.$sgqa.'.NAOK) || regexMatch("' . $preg . '", ' . $sgqa . '.NAOK))'; - } - else - { - $subqValidEqn = '(is_empty('.$sq['varName'].'.NAOK) || regexMatch("' . $preg . '", ' . $sq['varName'] . '.NAOK))'; - } - $subqValidSelector = $sq['jsVarName_on']; - break; - case 'N': //NUMERICAL QUESTION TYPE - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - // $subqValidEqn = '(strlen('.$sq['varName'].'.NAOK)==0 || regexMatch("' . $preg . '", ' . $sq['varName'] . '.NAOK))'; - // $subqValidSelector = 'question' . $questionNum . ' :input'; - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - if (isset($subqValidSelector)) { - $subqValidEqns[$subqValidSelector] = array( - 'subqValidEqn' => $subqValidEqn, - 'subqValidSelector' => $subqValidSelector, - ); - } - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'preg', - 'class' => 'regex_validation', - 'eqn' => '(sum(' . implode(', ', $sq_names) . ') == 0)', - 'qid' => $questionNum, - 'subqValidEqns' => $subqValidEqns, - ); - } - } - } - else - { - $preg=''; - } - - // em_validation_q_tip - a description of the EM validation equation that must be satisfied for the whole question. - if (isset($qattr['em_validation_q_tip']) && !is_null($qattr['em_validation_q_tip']) && trim($qattr['em_validation_q_tip']) != '') - { - $em_validation_q_tip = trim($qattr['em_validation_q_tip']); - } - else - { - $em_validation_q_tip = ''; - } - - - // em_validation_q - an EM validation equation that must be satisfied for the whole question. Uses 'this' in the equation - if (isset($qattr['em_validation_q']) && !is_null($qattr['em_validation_q']) && trim($qattr['em_validation_q']) != '') - { - $em_validation_q = $qattr['em_validation_q']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': //ARRAY (Flexible) - Row Format - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case ';': //ARRAY (Multi Flexi) Text - case ':': //ARRAY (Multi Flexi) 1 to 10 - case 'M': //Multiple choice checkbox - case 'N': //NUMERICAL QUESTION TYPE - case 'P': //Multiple choice with comments checkbox + text - case 'R': //RANKING STYLE - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - if ($this->sgqaNaming) - { - $sq_name = '!(' . preg_replace('/\bthis\b/',substr($sq['jsVarName'],4), $em_validation_q) . ')'; - } - else - { - $sq_name = '!(' . preg_replace('/\bthis\b/',$sq['varName'], $em_validation_q) . ')'; - } - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'em_validation_q', - 'class' => 'q_fn_validation', - 'eqn' => '(sum(' . implode(', ', array_unique($sq_names)) . ') == 0)', - 'qid' => $questionNum, - ); - } - } - } - else - { - $em_validation_q=''; - } - - // em_validation_sq_tip - a description of the EM validation equation that must be satisfied for each subquestion. - if (isset($qattr['em_validation_sq_tip']) && !is_null($qattr['em_validation_sq_tip']) && trim($qattr['em_validation_sq']) != '') - { - $em_validation_sq_tip = trim($qattr['em_validation_sq_tip']); - } - else - { - $em_validation_sq_tip = ''; - } - - - // em_validation_sq - an EM validation equation that must be satisfied for each subquestion. Uses 'this' in the equation - if (isset($qattr['em_validation_sq']) && !is_null($qattr['em_validation_sq']) && trim($qattr['em_validation_sq']) != '') - { - $em_validation_sq = $qattr['em_validation_sq']; - if ($hasSubqs) { - $subqs = $qinfo['subqs']; - $sq_names = array(); - $subqValidEqns = array(); - foreach ($subqs as $sq) { - $sq_name = NULL; - switch ($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case ';': //ARRAY (Multi Flexi) Text - case ':': //ARRAY (Multi Flexi) 1 to 10 - case 'N': //NUMERICAL QUESTION TYPE - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - if ($this->sgqaNaming) - { - $sq_name = '!(' . preg_replace('/\bthis\b/',substr($sq['jsVarName'],4), $em_validation_sq) . ')'; - } - else - { - $sq_name = '!(' . preg_replace('/\bthis\b/',$sq['varName'], $em_validation_sq) . ')'; - } - break; - default: - break; - } - switch ($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case ';': //ARRAY (Multi Flexi) Text - case ':': //ARRAY (Multi Flexi) 1 to 10 - case 'N': //NUMERICAL QUESTION TYPE - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - if ($this->sgqaNaming) - { - $subqValidEqn = '(' . preg_replace('/\bthis\b/',substr($sq['jsVarName'],4), $em_validation_sq) . ')'; - } - else - { - $subqValidEqn = '(' . preg_replace('/\bthis\b/',$sq['varName'], $em_validation_sq) . ')'; - } - $subqValidSelector = $sq['jsVarName_on']; - break; - default: - break; - } - if (!is_null($sq_name)) { - $sq_names[] = $sq_name; - if (isset($subqValidSelector)) { - $subqValidEqns[$subqValidSelector] = array( - 'subqValidEqn' => $subqValidEqn, - 'subqValidSelector' => $subqValidSelector, - ); - } - } - } - if (count($sq_names) > 0) { - if (!isset($validationEqn[$questionNum])) - { - $validationEqn[$questionNum] = array(); - } - $validationEqn[$questionNum][] = array( - 'qtype' => $type, - 'type' => 'em_validation_sq', - 'class' => 'sq_fn_validation', - 'eqn' => '(sum(' . implode(', ', $sq_names) . ') == 0)', - 'qid' => $questionNum, - 'subqValidEqns' => $subqValidEqns, - ); - } - } - } - else - { - $em_validation_sq=''; - } - - //////////////////////////////////////////// - // COMPOSE USER FRIENDLY MIN/MAX MESSAGES // - //////////////////////////////////////////// - - // Put these in the order you with them to appear in messages. - $qtips=array(); - - // min/max answers - if ($min_answers!='' || $max_answers!='') - { - $_minA = (($min_answers == '') ? "''" : $min_answers); - $_maxA = (($max_answers == '') ? "''" : $max_answers ); - $qtips['num_answers']= - "{if((is_empty($_minA) && is_empty($_maxA)),". - "'',". - "if(is_empty($_maxA),". - "if(($_minA)==1,". - "'".$this->gT("Please select at least one answer")."',". - "sprintf('".$this->gT("Please select at least %s answers")."',fixnum($_minA))". - "),". - "if(is_empty($_minA),". - "if(($_maxA)==1,". - "'".$this->gT("Please select at most one answer")."',". - "sprintf('".$this->gT("Please select at most %s answers")."',fixnum($_maxA))". - "),". - "if(($_minA)==($_maxA),". - "if(($_minA)==1,". - "'".$this->gT("Please select one answer")."',". - "sprintf('".$this->gT("Please select %s answers")."',fixnum($_minA))". - "),". - "sprintf('".$this->gT("Please select between %s and %s answers")."',fixnum($_minA),fixnum($_maxA))". - ")". - ")". - ")". - ")}"; - } - - // min/max value for each numeric entry - if ($min_num_value_n!='' || $max_num_value_n!='') - { - $_minV = (($min_num_value_n == '') ? "''" : $min_num_value_n); - $_maxV = (($max_num_value_n == '') ? "''" : $max_num_value_n); - $qtips['value_range']= - "{if((is_empty($_minV) && is_empty($_maxV)),". - "'',". - "if(is_empty($_maxV),". - "sprintf('".$this->gT("Each answer must be at least %s")."',fixnum($_minV)),". - "if(is_empty($_minV),". - "sprintf('".$this->gT("Each answer must be at most %s")."',fixnum($_maxV)),". - "if(($_minV)==($_maxV),". - "sprintf('".$this->gT("Each answer must be %s")."',fixnum($_minV)),". - "sprintf('".$this->gT("Each answer must be between %s and %s")."',fixnum($_minV),fixnum($_maxV))". - ")". - ")". - ")". - ")}"; - } - - // min/max value for each numeric entry - for multi-flexible question type - if ($multiflexible_min!='' || $multiflexible_max!='') - { - $_minV = (($multiflexible_min == '') ? "''" : $multiflexible_min); - $_maxV = (($multiflexible_max == '') ? "''" : $multiflexible_max); - $qtips['value_range']= - "{if((is_empty($_minV) && is_empty($_maxV)),". - "'',". - "if(is_empty($_maxV),". - "sprintf('".$this->gT("Each answer must be at least %s")."',fixnum($_minV)),". - "if(is_empty($_minV),". - "sprintf('".$this->gT("Each answer must be at most %s")."',fixnum($_maxV)),". - "if(($_minV)==($_maxV),". - "sprintf('".$this->gT("Each answer must be %s")."',fixnum($_minV)),". - "sprintf('".$this->gT("Each answer must be between %s and %s")."',fixnum($_minV),fixnum($_maxV))". - ")". - ")". - ")". - ")}"; - } - - // min/max sum value - if ($min_num_value!='' || $max_num_value!='') - { - $_minV = (($min_num_value == '') ? "''" : $min_num_value); - $_maxV = (($max_num_value == '') ? "''" : $max_num_value); - $qtips['sum_range']= - "{if((is_empty($_minV) && is_empty($_maxV)),". - "'',". - "if(is_empty($_maxV),". - "sprintf('".$this->gT("The sum must be at least %s")."',fixnum($_minV)),". - "if(is_empty($_minV),". - "sprintf('".$this->gT("The sum must be at most %s")."',fixnum($_maxV)),". - "if(($_minV)==($_maxV),". - "sprintf('".$this->gT("The sum must equal %s")."',fixnum($_minV)),". - "sprintf('".$this->gT("The sum must be between %s and %s")."',fixnum($_minV),fixnum($_maxV))". - ")". - ")". - ")". - ")}"; - } - - // min/max num files - if ($min_num_of_files !='' || $max_num_of_files !='') - { - $_minA = (($min_num_of_files == '') ? "''" : $min_num_of_files); - $_maxA = (($max_num_of_files == '') ? "''" : $max_num_of_files ); - // TODO - create em_num_files class so can sepately style num_files vs. num_answers - $qtips['num_answers']= - "{if((is_empty($_minA) && is_empty($_maxA)),". - "'',". - "if(is_empty($_maxA),". - "if(($_minA)==1,". - "'".$this->gT("Please upload at least one file")."',". - "sprintf('".$this->gT("Please upload at least %s files")."',fixnum($_minA))". - "),". - "if(is_empty($_minA),". - "if(($_maxA)==1,". - "'".$this->gT("Please upload at most one file")."',". - "sprintf('".$this->gT("Please upload at most %s files")."',fixnum($_maxA))". - "),". - "if(($_minA)==($_maxA),". - "if(($_minA)==1,". - "'".$this->gT("Please upload one file")."',". - "sprintf('".$this->gT("Please upload %s files")."',fixnum($_minA))". - "),". - "sprintf('".$this->gT("Please upload between %s and %s files")."',fixnum($_minA),fixnum($_maxA))". - ")". - ")". - ")". - ")}"; - } - - // equals_num_value - if ($equals_num_value!='') - { - $qtips['sum_range']=sprintf($this->gT("The sum must equal %s"),'{fixnum('.$equals_num_value.')}'); - } - - // other comment mandatory - if ($other_comment_mandatory!='') - { - $qtips['other_comment_mandatory']=$this->gT('Please also fill in the "other comment" field.'); - } - - // regular expression validation - if ($preg!='') - { - // do string replacement here so that curly braces within the regular expression don't trigger an EM error - // $qtips['regex_validation']=sprintf($this->gT('Each answer must conform to this regular expression: %s'), str_replace(array('{','}'),array('{ ',' }'), $preg)); - $qtips['regex_validation']=$this->gT('Please check the format of your answer.'); - } - - if ($em_validation_sq!='') - { - if ($em_validation_sq_tip =='') - { - // $stringToParse = htmlspecialchars_decode($em_validation_sq,ENT_QUOTES); - // $gseq = $this->questionId2groupSeq[$qinfo['qid']]; - // $result = $this->em->ProcessBooleanExpression($stringToParse,$gseq, $qinfo['qseq']); - // $_validation_tip = $this->em->GetPrettyPrintString(); - // $qtips['sq_fn_validation']=sprintf($this->gT('Each answer must conform to this expression: %s'),$_validation_tip); - } - else - { - $qtips['sq_fn_validation']=$em_validation_sq_tip; - } - - } - - // em_validation_q - whole-question validation equation - if ($em_validation_q!='') - { - if ($em_validation_q_tip =='') - { - // $stringToParse = htmlspecialchars_decode($em_validation_q,ENT_QUOTES); - // $gseq = $this->questionId2groupSeq[$qinfo['qid']]; - // $result = $this->em->ProcessBooleanExpression($stringToParse,$gseq, $qinfo['qseq']); - // $_validation_tip = $this->em->GetPrettyPrintString(); - // $qtips['q_fn_validation']=sprintf($this->gT('The question must conform to this expression: %s'), $_validation_tip); - } - else - { - $qtips['q_fn_validation']=$em_validation_q_tip; - } - } - - if (count($qtips) > 0) - { - $validationTips[$questionNum] = $qtips; - } - } - - // Consolidate logic across array filters - $rowdivids = array(); - $order=0; - foreach ($subQrels as $sq) - { - $oldeqn = (isset($rowdivids[$sq['rowdivid']]['eqns']) ? $rowdivids[$sq['rowdivid']]['eqns'] : array()); - $oldtype = (isset($rowdivids[$sq['rowdivid']]['type']) ? $rowdivids[$sq['rowdivid']]['type'] : ''); - $neweqn = (($sq['type'] == 'exclude_all_others') ? array() : array($sq['eqn'])); - $oldeo = (isset($rowdivids[$sq['rowdivid']]['exclusive_options']) ? $rowdivids[$sq['rowdivid']]['exclusive_options'] : array()); - $neweo = (($sq['type'] == 'exclude_all_others') ? array($sq['eqn']) : array()); - $rowdivids[$sq['rowdivid']] = array( - 'order'=>$order++, - 'qid'=>$sq['qid'], - 'rowdivid'=>$sq['rowdivid'], - 'type'=>$sq['type'] . ';' . $oldtype, - 'qtype'=>$sq['qtype'], - 'sgqa'=>$sq['sgqa'], - 'eqns'=>array_merge($oldeqn, $neweqn), - 'exclusive_options'=>array_merge($oldeo, $neweo), - ); - } - - foreach ($rowdivids as $sq) - { - $sq['eqn'] = implode(' and ', array_unique(array_merge($sq['eqns'],$sq['exclusive_options']))); // without array_unique, get duplicate of filters for question types 1, :, and ; - $eos = array_unique($sq['exclusive_options']); - $isExclusive = ''; - $irrelevantAndExclusive = ''; - if (count($eos) > 0) - { - $isExclusive = '!(' . implode(' and ', $eos) . ')'; - $noneos = array_unique($sq['eqns']); - if (count($noneos) > 0) - { - $irrelevantAndExclusive = '(' . implode(' and ', $noneos) . ') and ' . $isExclusive; - } - } - $this->_ProcessSubQRelevance($sq['eqn'], $sq['qid'], $sq['rowdivid'], $sq['type'], $sq['qtype'], $sq['sgqa'], $isExclusive, $irrelevantAndExclusive); - } - - foreach ($validationEqn as $qid=>$eqns) - { - $parts = array(); - $tips = (isset($validationTips[$qid]) ? $validationTips[$qid] : array()); - $subqValidEqns = array(); - $sumEqn = ''; - $sumRemainingEqn = ''; - foreach ($eqns as $v) { - if (!isset($parts[$v['class']])) - { - $parts[$v['class']] = array(); - } - $parts[$v['class']][] = $v['eqn']; - // even if there are min/max/preg, the count or total will always be the same - $sumEqn = (isset($v['sumEqn'])) ? $v['sumEqn'] : $sumEqn; - $sumRemainingEqn = (isset($v['sumRemainingEqn'])) ? $v['sumRemainingEqn'] : $sumRemainingEqn; - if (isset($v['subqValidEqns'])) { - $subqValidEqns[] = $v['subqValidEqns']; - } - } - // combine the sub-question level validation equations into a single validation equation per sub-question - $subqValidComposite = array(); - foreach ($subqValidEqns as $sqs) { - foreach ($sqs as $sq) - { - if (!isset($subqValidComposite[$sq['subqValidSelector']])) - { - $subqValidComposite[$sq['subqValidSelector']] = array( - 'subqValidSelector' => $sq['subqValidSelector'], - 'subqValidEqns' => array(), - ); - } - $subqValidComposite[$sq['subqValidSelector']]['subqValidEqns'][] = $sq['subqValidEqn']; - } - } - $csubqValidEqns = array(); - foreach ($subqValidComposite as $csq) - { - $csubqValidEqns[$csq['subqValidSelector']] = array( - 'subqValidSelector' => $csq['subqValidSelector'], - 'subqValidEqn' => implode(' && ', $csq['subqValidEqns']), - ); - } - // now combine all classes of validation equations - $veqns = array(); - foreach ($parts as $vclass=>$eqns) - { - $veqns[$vclass] = '(' . implode(' and ', $eqns) . ')'; - } - $this->qid2validationEqn[$qid] = array( - 'eqn' => $veqns, - 'tips' => $tips, - 'subqValidEqns' => $csubqValidEqns, - 'sumEqn' => $sumEqn, - 'sumRemainingEqn' => $sumRemainingEqn, - ); - } - - // $this->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - } - - /** - * Recursively find all questions that logically preceded the current array_filter or array_filter_exclude request - * Note, must support: - * (a) semicolon-separated list of $qroot codes for either array_filter or array_filter_exclude - * (b) mixed history of array_filter and array_filter_exclude values - * @param type $qroot - the question root variable name - * @param type $aflist - the list of array_filter $qroot codes - * @param type $afelist - the list of array_filter_exclude $qroot codes - * @return type - */ - private function _recursivelyFindAntecdentArrayFilters($qroot, $aflist, $afelist) - { - if (isset($this->qrootVarName2arrayFilter[$qroot])) - { - if (isset($this->qrootVarName2arrayFilter[$qroot]['array_filter'])) - { - $_afs = explode(';',$this->qrootVarName2arrayFilter[$qroot]['array_filter']); - foreach ($_afs as $_af) - { - if (in_array($_af,$aflist)) - { - continue; - } - $aflist[] = $_af; - list($aflist, $afelist) = $this->_recursivelyFindAntecdentArrayFilters($_af, $aflist, $afelist); - } - } - if (isset($this->qrootVarName2arrayFilter[$qroot]['array_filter_exclude'])) - { - $_afes = explode(';',$this->qrootVarName2arrayFilter[$qroot]['array_filter_exclude']); - foreach ($_afes as $_afe) - { - if (in_array($_afe,$afelist)) - { - continue; - } - $afelist[] = $_afe; - list($aflist, $afelist) = $this->_recursivelyFindAntecdentArrayFilters($_afe, $aflist, $afelist); - } - } - } - return array($aflist, $afelist); - } - - /** - * Create the arrays needed by ExpressionManager to process LimeSurvey strings. - * The long part of this function should only be called once per page display (e.g. only if $fieldMap changes) - * - * @param $surveyid - * @param $forceRefresh - * @param $anonymized - * @param $allOnOnePage - if true (like for survey_format), uses certain optimizations - * @return boolean - true if $fieldmap had been re-created, so ExpressionManager variables need to be re-set - */ - - private function setVariableAndTokenMappingsForExpressionManager($surveyid,$forceRefresh=false,$anonymized=false,$allOnOnePage=false) - { - if (isset($_SESSION['LEMforceRefresh'])) { - unset($_SESSION['LEMforceRefresh']); - $forceRefresh=true; - } - else if (!$forceRefresh && isset($this->knownVars)) { - return false; // means that those variables have been cached and no changes needed - } - $now = microtime(true); - $this->em->SetSurveyMode($this->surveyMode); - - // TODO - do I need to force refresh, or trust that createFieldMap will cache langauges properly? - $fieldmap=createFieldMap($surveyid,$style='full',$forceRefresh,false,$_SESSION['LEMlang']); - $this->sid= $surveyid; - - $this->runtimeTimings[] = array(__METHOD__ . '.createFieldMap',(microtime(true) - $now)); - // LimeExpressionManager::ShowStackTrace(); - - $now = microtime(true); - - if (!isset($fieldmap)) { - return false; // implies an error occurred - } - - $this->knownVars = array(); // mapping of VarName to Value - $this->qcode2sgqa = array(); - $this->tempVars = array(); - $this->qid2code = array(); // List of codes for each question - needed to know which to NULL if a question is irrelevant - $this->jsVar2qid = array(); - $this->qcode2sgq = array(); - $this->alias2varName = array(); - $this->varNameAttr = array(); - $this->questionId2questionSeq = array(); - $this->questionId2groupSeq = array(); - $this->questionSeq2relevance = array(); - $this->groupId2groupSeq = array(); - $this->qid2validationEqn = array(); - $this->groupSeqInfo = array(); - $this->gseq2relevanceStatus = array(); - - // Since building array of allowable answers, need to know preset values for certain question types - $presets = array(); - $presets['G'] = array( //GENDER drop-down list - 'M' => $this->gT("Male"), - 'F' => $this->gT("Female"), - ); - $presets['Y'] = array( //YES/NO radio-buttons - 'Y' => $this->gT("Yes"), - 'N' => $this->gT("No"), - ); - $presets['C'] = array( //ARRAY (YES/UNCERTAIN/NO) radio-buttons - 'Y' => $this->gT("Yes"), - 'N' => $this->gT("No"), - 'U' => $this->gT("Uncertain"), - ); - $presets['E'] = array( //ARRAY (Increase/Same/Decrease) radio-buttons - 'I' => $this->gT("Increase"), - 'S' => $this->gT("Same"), - 'D' => $this->gT("Decrease"), - ); - - $this->gseq2info = $this->getGroupInfoForEM($surveyid,$_SESSION['LEMlang']); - for ($i=0;$igseq2info);++$i) - { - $gseq = $this->gseq2info[$i]; - $this->groupId2groupSeq[$gseq['gid']] = $i; // Only used for preview group - } - - $qattr = $this->getQuestionAttributesForEM($surveyid,NULL,$_SESSION['LEMlang']); - - $this->qattr = $qattr; - - $this->runtimeTimings[] = array(__METHOD__ . ' - question_attributes_model->getQuestionAttributesForEM',(microtime(true) - $now)); - $now = microtime(true); - - $this->qans = $this->getAnswerSetsForEM($surveyid,NULL,$_SESSION['LEMlang']); - - $this->runtimeTimings[] = array(__METHOD__ . ' - answers_model->getAnswerSetsForEM',(microtime(true) - $now)); - $now = microtime(true); - - $q2subqInfo = array(); - - $this->multiflexiAnswers=array(); - - foreach($fieldmap as $fielddata) - { - if (!isset($fielddata['fieldname']) || !preg_match('#^\d+X\d+X\d+#',$fielddata['fieldname'])) - { - continue; // not an SGQA value - } - $sgqa = $fielddata['fieldname']; - $type = $fielddata['type']; - $mandatory = $fielddata['mandatory']; - $fieldNameParts = explode('X',$sgqa); - $groupNum = $fieldNameParts[1]; - $aid = (isset($fielddata['aid']) ? $fielddata['aid'] : ''); - $sqid = (isset($fielddata['sqid']) ? $fielddata['sqid'] : ''); - - $questionId = $fieldNameParts[2]; - $questionNum = $fielddata['qid']; - $relevance = (isset($fielddata['relevance'])) ? $fielddata['relevance'] : 1; - $grelevance = (isset($fielddata['grelevance'])) ? $fielddata['grelevance'] : 1; - $hidden = (isset($qattr[$questionNum]['hidden'])) ? ($qattr[$questionNum]['hidden'] == '1') : false; - $scale_id = (isset($fielddata['scale_id'])) ? $fielddata['scale_id'] : '0'; - $preg = (isset($fielddata['preg'])) ? $fielddata['preg'] : NULL; // a perl regular exrpession validation function - $defaultValue = (isset($fielddata['defaultvalue']) ? $fielddata['defaultvalue'] : NULL); - if (trim($preg) == '') { - $preg = NULL; - } - $help = (isset($fielddata['help'])) ? $fielddata['help']: ''; - $other = (isset($fielddata['other'])) ? $fielddata['other'] : ''; - - if (isset($this->questionId2groupSeq[$questionNum])) { - $groupSeq = $this->questionId2groupSeq[$questionNum]; - } - else { - $groupSeq = (isset($fielddata['groupSeq'])) ? $fielddata['groupSeq'] : -1; - $this->questionId2groupSeq[$questionNum] = $groupSeq; - } - - if (isset($this->questionId2questionSeq[$questionNum])) { - $questionSeq = $this->questionId2questionSeq[$questionNum]; - } - else { - $questionSeq = (isset($fielddata['questionSeq'])) ? $fielddata['questionSeq'] : -1; - $this->questionId2questionSeq[$questionNum] = $questionSeq; - } - - if (!isset($this->groupSeqInfo[$groupSeq])) { - $this->groupSeqInfo[$groupSeq] = array( - 'qstart' => $questionSeq, - 'qend' => $questionSeq, - ); - } - else { - $this->groupSeqInfo[$groupSeq]['qend'] = $questionSeq; // with each question, update so know ending value - } - - - // Create list of codes associated with each question - $codeList = (isset($this->qid2code[$questionNum]) ? $this->qid2code[$questionNum] : ''); - if ($codeList == '') - { - $codeList = $sgqa; - } - else - { - $codeList .= '|' . $sgqa; - } - $this->qid2code[$questionNum] = $codeList; - - $readWrite = 'Y'; - - // Set $ansArray - switch($type) - { - case '!': //List - dropdown - case 'L': //LIST drop-down/radio-button list - case 'O': //LIST WITH COMMENT drop-down/radio-button list + textarea - case '1': //Array (Flexible Labels) dual scale // need scale - case 'H': //ARRAY (Flexible) - Column Format - case 'F': //ARRAY (Flexible) - Row Format - case 'R': //RANKING STYLE - $ansArray = (isset($this->qans[$questionNum]) ? $this->qans[$questionNum] : NULL); - if ($other == 'Y' && ($type == 'L' || $type == '!')) - { - if (preg_match('/other$/',$sgqa)) - { - $ansArray = NULL; // since the other variable doesn't need it - } - else - { - $_qattr = isset($qattr[$questionNum]) ? $qattr[$questionNum] : array(); - if (isset($_qattr['other_replace_text']) && trim($_qattr['other_replace_text']) != '') { - $othertext = trim($_qattr['other_replace_text']); - } - else { - $othertext = $this->gT('Other:'); - } - $ansArray['0~-oth-'] = '0|' . $othertext; - } - } - break; - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case ':': //ARRAY (Multi Flexi) 1 to 10 - case '5': //5 POINT CHOICE radio-buttons - $ansArray=NULL; - break; - case 'N': //NUMERICAL QUESTION TYPE - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case ';': //ARRAY (Multi Flexi) Text - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - case 'M': //Multiple choice checkbox - case 'P': //Multiple choice with comments checkbox + text - case 'D': //DATE - case '*': //Equation - case 'I': //Language Question - case '|': //File Upload - case 'X': //BOILERPLATE QUESTION - $ansArray = NULL; - break; - case 'G': //GENDER drop-down list - case 'Y': //YES/NO radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - $ansArray = $presets[$type]; - break; - } - - // set $subqtext text - for display of primary sub-question - $subqtext = ''; - switch ($type) - { - default: - $subqtext = (isset($fielddata['subquestion']) ? $fielddata['subquestion'] : ''); - break; - case ':': //ARRAY (Multi Flexi) 1 to 10 - case ';': //ARRAY (Multi Flexi) Text - $subqtext = (isset($fielddata['subquestion1']) ? $fielddata['subquestion1'] : ''); - $ansList = array(); - if (isset($fielddata['answerList'])) - { - foreach ($fielddata['answerList'] as $ans) { - $ansList['1~' . $ans['code']] = $ans['code'] . '|' . $ans['answer']; - } - $this->multiflexiAnswers[$questionNum] = $ansList; - } - break; - } - - - // Set $varName (question code / questions.title), $rowdivid, $csuffix, $sqsuffix, and $question - $rowdivid=NULL; // so that blank for types not needing it. - $sqsuffix=''; - switch($type) - { - case '!': //List - dropdown - case '5': //5 POINT CHOICE radio-buttons - case 'D': //DATE - case 'G': //GENDER drop-down list - case 'I': //Language Question - case 'L': //LIST drop-down/radio-button list - case 'N': //NUMERICAL QUESTION TYPE - case 'O': //LIST WITH COMMENT drop-down/radio-button list + textarea - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - case 'X': //BOILERPLATE QUESTION - case 'Y': //YES/NO radio-buttons - case '|': //File Upload - case '*': //Equation - $csuffix = ''; - $sqsuffix = ''; - $varName = $fielddata['title']; - if ($fielddata['aid'] != '') { - $varName .= '_' . $fielddata['aid']; - } - $question = $fielddata['question']; - break; - case '1': //Array (Flexible Labels) dual scale - $csuffix = $fielddata['aid'] . '#' . $fielddata['scale_id']; - $sqsuffix = '_' . $fielddata['aid']; - $varName = $fielddata['title'] . '_' . $fielddata['aid'] . '_' . $fielddata['scale_id'];; - $question = $fielddata['subquestion'] . '[' . $fielddata['scale'] . ']'; - // $question = $fielddata['question'] . ': ' . $fielddata['subquestion'] . '[' . $fielddata['scale'] . ']'; - $rowdivid = substr($sgqa,0,-2); - break; - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': //ARRAY (Flexible) - Row Format - case 'H': //ARRAY (Flexible) - Column Format // note does not have javatbd equivalent - so array filters don't work on it - case 'K': //MULTIPLE NUMERICAL QUESTION // note does not have javatbd equivalent - so array filters don't work on it, but need rowdivid to process validations - case 'M': //Multiple choice checkbox - case 'P': //Multiple choice with comments checkbox + text - case 'Q': //MULTIPLE SHORT TEXT // note does not have javatbd equivalent - so array filters don't work on it - case 'R': //RANKING STYLE // note does not have javatbd equivalent - so array filters don't work on it - $csuffix = $fielddata['aid']; - $varName = $fielddata['title'] . '_' . $fielddata['aid']; - $question = $fielddata['subquestion']; - // $question = $fielddata['question'] . ': ' . $fielddata['subquestion']; - if ($type != 'H') { - if ($type == 'P' && preg_match("/comment$/", $sgqa)) { - // $rowdivid = substr($sgqa,0,-7); - } - else { - $sqsuffix = '_' . $fielddata['aid']; - $rowdivid = $sgqa; - } - } - break; - case ':': //ARRAY (Multi Flexi) 1 to 10 - case ';': //ARRAY (Multi Flexi) Text - $csuffix = $fielddata['aid']; - $sqsuffix = '_' . substr($fielddata['aid'],0,strpos($fielddata['aid'],'_')); - $varName = $fielddata['title'] . '_' . $fielddata['aid']; - $question = $fielddata['subquestion1'] . '[' . $fielddata['subquestion2'] . ']'; - // $question = $fielddata['question'] . ': ' . $fielddata['subquestion1'] . '[' . $fielddata['subquestion2'] . ']'; - $rowdivid = substr($sgqa,0,strpos($sgqa,'_')); - break; - } - - // $onlynum - $onlynum=false; // the default - switch($type) - { - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'N': //NUMERICAL QUESTION TYPE - case ':': //ARRAY (Multi Flexi) 1 to 10 - $onlynum=true; - break; - case '*': // Equation - case ';': //ARRAY (Multi Flexi) Text - case 'Q': //MULTIPLE SHORT TEXT - case 'S': //SHORT FREE TEXT - if (isset($qattr[$questionNum]['numbers_only']) && $qattr[$questionNum]['numbers_only']=='1') - { - $onlynum=true; - } - break; - case 'L': //LIST drop-down/radio-button list - case 'M': //Multiple choice checkbox - case 'P': //Multiple choice with comments checkbox + text - if (isset($qattr[$questionNum]['other_numbers_only']) && $qattr[$questionNum]['other_numbers_only']=='1' && preg_match('/other$/',$sgqa)) - { - $onlynum=true; - } - break; - default: - break; - } - - // Set $jsVarName_on (for on-page variables - e.g. answerSGQA) and $jsVarName (for off-page variables; the primary name - e.g. javaSGQA) - switch($type) - { - case 'R': //RANKING STYLE - $jsVarName_on = 'fvalue_' . $fieldNameParts[2]; - $jsVarName = 'java' . $sgqa; - break; - case 'D': //DATE - case 'N': //NUMERICAL QUESTION TYPE - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - case 'Q': //MULTIPLE SHORT TEXT - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'X': //BOILERPLATE QUESTION - $jsVarName_on = 'answer' . $sgqa; - $jsVarName = 'java' . $sgqa; - break; - case '!': //List - dropdown - if (preg_match("/other$/",$sgqa)) - { - $jsVarName = 'java' . $sgqa; - $jsVarName_on = 'othertext' . substr($sgqa,0,-5); - } - else - { - $jsVarName = 'java' . $sgqa; - $jsVarName_on = $jsVarName; - } - break; - case 'L': //LIST drop-down/radio-button list - if (preg_match("/other$/",$sgqa)) - { - $jsVarName = 'java' . $sgqa; - $jsVarName_on = 'answer' . $sgqa . "text"; - } - else - { - $jsVarName = 'java' . $sgqa; - $jsVarName_on = $jsVarName; - } - break; - case '5': //5 POINT CHOICE radio-buttons - case 'G': //GENDER drop-down list - case 'I': //Language Question - case 'Y': //YES/NO radio-buttons - case '*': //Equation - case '1': //Array (Flexible Labels) dual scale - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': //ARRAY (Flexible) - Row Format - case 'H': //ARRAY (Flexible) - Column Format - case 'M': //Multiple choice checkbox - case 'O': //LIST WITH COMMENT drop-down/radio-button list + textarea - if ($type == 'O' && preg_match('/_comment$/', $varName)) - { - $jsVarName_on = 'answer' . $sgqa; - } - else - { - $jsVarName_on = 'java' . $sgqa; - } - $jsVarName = 'java' . $sgqa; - break; - case ':': //ARRAY (Multi Flexi) 1 to 10 - case ';': //ARRAY (Multi Flexi) Text - $jsVarName = 'java' . $sgqa; - $jsVarName_on = 'answer' . $sgqa;; - break; - case '|': //File Upload - // Only want the use the one that ends in '_filecount' - // $goodcode = preg_replace("/^(.*?)(_filecount)?$/","$1",$sgqa); - // $jsVarName = $goodcode . '_filecount'; - $jsVarName = $sgqa; - $jsVarName_on = $jsVarName; - break; - case 'P': //Multiple choice with comments checkbox + text - if (preg_match("/(other|comment)$/",$sgqa)) - { - $jsVarName_on = 'answer' . $sgqa; // is this true for survey.php and not for group.php? - $jsVarName = 'java' . $sgqa; - } - else - { - $jsVarName = 'java' . $sgqa; - $jsVarName_on = $jsVarName; - } - break; - } - if (!is_null($rowdivid) || $type == 'L' || $type == 'N' || $type == '!' || !is_null($preg) - || $type == 'S' || $type == 'T' || $type == 'U' || $type == '|') { - if (!isset($q2subqInfo[$questionNum])) { - $q2subqInfo[$questionNum] = array( - 'qid' => $questionNum, - 'qseq' => $questionSeq, - 'gseq' => $groupSeq, - 'sgqa' => $surveyid . 'X' . $groupNum . 'X' . $questionNum, - 'mandatory'=>$mandatory, - 'varName' => $varName, - 'type' => $type, - 'fieldname' => $sgqa, - 'preg' => $preg, - 'rootVarName' => $fielddata['title'], - ); - } - if (!isset($q2subqInfo[$questionNum]['subqs'])) { - $q2subqInfo[$questionNum]['subqs'] = array(); - } - if ($type == 'L' || $type == '!') - { - if (!is_null($ansArray)) - { - foreach (array_keys($ansArray) as $key) - { - $parts = explode('~',$key); - if ($parts[1] == '-oth-') { - $parts[1] = 'other'; - } - $q2subqInfo[$questionNum]['subqs'][] = array( - 'rowdivid' => $surveyid . 'X' . $groupNum . 'X' . $questionNum . $parts[1], - 'varName' => $varName, - 'sqsuffix' => '_' . $parts[1], - ); - } - } - } - else if ($type == 'N' - || $type == 'S' || $type == 'T' || $type == 'U') // for $preg - { - $q2subqInfo[$questionNum]['subqs'][] = array( - 'varName' => $varName, - 'rowdivid' => $surveyid . 'X' . $groupNum . 'X' . $questionNum, - 'jsVarName' => 'java' . $surveyid . 'X' . $groupNum . 'X' . $questionNum, - 'jsVarName_on' => $jsVarName_on, - ); - } - else - { - $q2subqInfo[$questionNum]['subqs'][] = array( - 'rowdivid' => $rowdivid, - 'varName' => $varName, - 'jsVarName_on' => $jsVarName_on, - 'jsVarName' => $jsVarName, - 'csuffix' => $csuffix, - 'sqsuffix' => $sqsuffix, - ); - } - } - - $ansList = ''; - if (isset($ansArray) && !is_null($ansArray)) { - $answers = array(); - foreach ($ansArray as $key => $value) { - $answers[] = "'" . $key . "':'" . htmlspecialchars(preg_replace('/[[:space:]]/',' ',$value),ENT_QUOTES) . "'"; - } - $ansList = ",'answers':{ " . implode(",",$answers) . "}"; - } - - // Set mappings of variable names to needed attributes - $varInfo_Code = array( - 'jsName_on'=>$jsVarName_on, - 'jsName'=>$jsVarName, - 'readWrite'=>$readWrite, - 'hidden'=>$hidden, - 'question'=>$question, - 'qid'=>$questionNum, - 'gid'=>$groupNum, - 'grelevance'=>$grelevance, - 'relevance'=>$relevance, - 'qcode'=>$varName, - 'qseq'=>$questionSeq, - 'gseq'=>$groupSeq, - 'type'=>$type, - 'sgqa'=>$sgqa, - 'ansList'=>$ansList, - 'ansArray'=>$ansArray, - 'scale_id'=>$scale_id, - 'default'=>$defaultValue, - 'rootVarName'=>$fielddata['title'], - 'subqtext'=>$subqtext, - 'rowdivid'=>(is_null($rowdivid) ? '' : $rowdivid), - 'onlynum'=>$onlynum, - ); - - $this->questionSeq2relevance[$questionSeq] = array( - 'relevance'=>$relevance, - 'grelevance'=>$grelevance, - 'qid'=>$questionNum, - 'qseq'=>$questionSeq, - 'gseq'=>$groupSeq, - 'jsResultVar_on'=>$jsVarName_on, - 'jsResultVar'=>$jsVarName, - 'type'=>$type, - 'hidden'=>$hidden, - 'gid'=>$groupNum, - 'mandatory'=>$mandatory, - 'eqn'=>(($type == '*') ? $question : ''), - 'help'=>$help, - 'qtext'=>$fielddata['question'], // $question, - 'code'=>$varName, - 'other'=>$other, - 'default'=>$defaultValue, - 'rootVarName'=>$fielddata['title'], - 'rowdivid'=>(is_null($rowdivid) ? '' : $rowdivid), - 'aid'=>$aid, - 'sqid'=>$sqid, - ); - - $this->knownVars[$sgqa] = $varInfo_Code; - $this->qcode2sgqa[$varName]=$sgqa; - - $this->jsVar2qid[$jsVarName] = $questionNum; - $this->qcode2sgq[$fielddata['title']] = $surveyid . 'X' . $groupNum . 'X' . $questionNum; - - // Create JavaScript arrays - $this->alias2varName[$varName] = array('jsName'=>$jsVarName, 'jsPart' => "'" . $varName . "':'" . $jsVarName . "'"); - $this->alias2varName[$sgqa] = array('jsName'=>$jsVarName, 'jsPart' => "'" . $sgqa . "':'" . $jsVarName . "'"); - - $this->varNameAttr[$jsVarName] = "'" . $jsVarName . "':{ " - . "'jsName':'" . $jsVarName - . "','jsName_on':'" . $jsVarName_on - . "','sgqa':'" . $sgqa - . "','qid':" . $questionNum - . ",'gid':" . $groupNum - // . ",'mandatory':'" . $mandatory - // . "','question':'" . htmlspecialchars(preg_replace('/[[:space:]]/',' ',$question),ENT_QUOTES) - . ",'type':'" . $type - // . "','relevance':'" . (($relevance != '') ? htmlspecialchars(preg_replace('/[[:space:]]/',' ',$relevance),ENT_QUOTES) : 1) - // . "','readWrite':'" . $readWrite - // . "','grelevance':'" . (($grelevance != '') ? htmlspecialchars(preg_replace('/[[:space:]]/',' ',$grelevance),ENT_QUOTES) : 1) - . "','default':'" . (is_null($defaultValue) ? '' : $defaultValue) - . "','rowdivid':'" . (is_null($rowdivid) ? '' : $rowdivid) - . "','onlynum':'" . ($onlynum ? '1' : '') - . "','gseq':" . $groupSeq - // . ",'qseq':" . $questionSeq - .$ansList; - - if ($type == 'M' || $type == 'P') - { - $this->varNameAttr[$jsVarName] .= ",'question':'" . htmlspecialchars(preg_replace('/[[:space:]]/',' ',$question),ENT_QUOTES) . "'"; - } - $this->varNameAttr[$jsVarName] .= "}"; - - } - - $this->q2subqInfo = $q2subqInfo; - - // Now set tokens - if (isset($_SESSION['token']) && $_SESSION['token'] != '') - { - //Gather survey data for tokenised surveys, for use in presenting questions - $_SESSION['thistoken']=getTokenData($surveyid, $_SESSION['token']); - $this->knownVars['TOKEN:TOKEN'] = array( - 'code'=>$_SESSION['token'], - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - //queXS Addition - $this->knownVars['TOKEN:CASEID'] = array( - 'code'=>$_SESSION['token'], - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - } - else - { - //queXS Addition - $this->knownVars['TOKEN:CASEID'] = array( - 'code'=>0, - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - } - if (isset($_SESSION['thistoken'])) - { - foreach (array_keys($_SESSION['thistoken']) as $tokenkey) - { - if ($anonymized) - { - $val = ""; - } - else - { - $val = $_SESSION['thistoken'][$tokenkey]; - } - $key = "TOKEN:" . strtoupper($tokenkey); - $this->knownVars[$key] = array( - 'code'=>$val, - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - } - - //queXS Addition - //Add all sample variables for this case - global $connect; - - $use_call = true; - if (strlen($_SESSION['token']) == 15) - $use_call = false; - - if ($use_call) - { - $sql = "SELECT sivr.var,sv.val - FROM sample_var as sv, `case` as c, `call` as cl, `sample_import_var_restrict` as sivr - WHERE c.sample_id = sv.sample_id - AND c.case_id = cl.case_id - AND sv.var_id = sivr.var_id - AND cl.call_id = '{$_SESSION['token']}'"; - } - else - { - $sql = "SELECT sivr.var,sv.val - FROM sample_var as sv, `case` as c, `sample_import_var_restrict` as sivr - WHERE c.sample_id = sv.sample_id - AND sv.var_id = sivr.var_id - AND c.token = '{$_SESSION['token']}'"; - } - - $queXSrs = $connect->GetAssoc($sql); - - foreach($queXSrs as $samplekey => $val) - { - $key = "SAMPLE:" . strtoupper($samplekey); - $this->knownVars[$key] = array( - 'code'=>$val, - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - } - - if ($use_call) - { - $osql = "FROM operator as o, `call` as cl - WHERE o.operator_id = cl.operator_id - AND cl.call_id = '{$_SESSION['token']}'"; - - $rsql = "FROM respondent as r, `call` as cl - WHERE cl.call_id = '{$_SESSION['token']}' - AND r.respondent_id = cl.respondent_id"; - } - else - { - $osql = "FROM operator as o, `case` as c - WHERE c.token = '{$_SESSION['token']}' - AND o.operator_id = c.current_operator_id"; - - $rsql = "FROM respondent as r, `case` as c, call_attempt as ca - WHERE c.token = '{$_SESSION['token']}' - AND ca.case_id = c.case_id - AND ca.end IS NULL - AND r.respondent_id = ca.respondent_id"; - } - - //add operator and respondent details - $this->knownVars["OPERATOR:FIRSTNAME"] = - array('code' => $connect->GetOne(" SELECT o.firstName " . $osql - ), - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - $this->knownVars["OPERATOR:LASTNAME"] = - array('code' => $connect->GetOne(" SELECT o.lastName " . $osql - ), - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - $this->knownVars["RESPONDENT:FIRSTNAME"] = - array('code' => $connect->GetOne(" SELECT r.firstName " . $rsql - ), - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - $this->knownVars["RESPONDENT:LASTNAME"] = - array('code' => $connect->GetOne(" SELECT r.lastName " . $rsql - ), - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - } - else - { - // Read list of available tokens from the tokens table so that preview and error checking works correctly - $attrs = GetAttributeFieldNames($surveyid,false); - - $blankVal = array( - 'code'=>'', - 'type'=>'', - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - - foreach ($attrs as $key) - { - if (preg_match('/^(firstname|lastname|email|usesleft|token|attribute_\d+)$/',$key)) - { - $this->knownVars['TOKEN:' . strtoupper($key)] = $blankVal; - } - } - - //queXS Addition - //Add all sample variables for this questionnaire - global $connect; - - $sql = "SELECT sivr.var,sv.val - FROM `questionnaire` as q, questionnaire_sample as qs, sample_var as sv, `sample_import_var_restrict` as sivr - WHERE q.lime_sid = $surveyid - AND qs.questionnaire_id = q.questionnaire_id - AND sivr.sample_import_id = qs.sample_import_id - AND sv.var_id = sivr.var_id - GROUP BY qs.sample_import_id,sivr.var"; - - $queXSrs = $connect->GetAssoc($sql); - - foreach($queXSrs as $samplekey => $val) - { - $key = "SAMPLE:" . strtoupper($samplekey); - $this->knownVars[$key] = array( - 'code'=>$val, - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - } - - $oa= array("OPERATOR:FIRSTNAME","OPERATOR:LASTNAME","RESPONDENT:FIRSTNAME","RESPONDENT:LASTNAME"); - foreach ($oa as $o) - { - $this->knownVars[$o] = array( - 'code'=>"", - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - } - - - } - // set default value for reserved 'this' variable - $this->knownVars['this'] = array( - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'', - 'hidden'=>'', - 'question'=>'this', - 'qid'=>'', - 'gid'=>'', - 'grelevance'=>'', - 'relevance'=>'', - 'qcode'=>'this', - 'qseq'=>'', - 'gseq'=>'', - 'type'=>'', - 'sgqa'=>'', - 'rowdivid'=>'', - 'ansList'=>'', - 'ansArray'=>array(), - 'scale_id'=>'', - 'default'=>'', - 'rootVarName'=>'this', - 'subqtext'=>'', - 'rowdivid'=>'', - ); - - $this->runtimeTimings[] = array(__METHOD__ . ' - process fieldMap',(microtime(true) - $now)); - - usort($this->questionSeq2relevance,'cmpQuestionSeq'); - $this->numQuestions = count($this->questionSeq2relevance); - $this->numGroups = count($this->groupSeqInfo); - - return true; - } - - /** - * Return whether a sub-question is relevant - * @param $sgqa - * @return - */ - static function SubQuestionIsRelevant($sgqa) - { - $LEM =& LimeExpressionManager::singleton(); - if (!isset($LEM->knownVars[$sgqa])) - { - return false; - } - $var = $LEM->knownVars[$sgqa]; - $sqrel=1; - if (isset($var['rowdivid']) && $var['rowdivid'] != '') - { - $sqrel = (isset($_SESSION['relevanceStatus'][$var['rowdivid']]) ? $_SESSION['relevanceStatus'][$var['rowdivid']] : 1); - } - $qid = $var['qid']; - $qrel = (isset($_SESSION['relevanceStatus'][$qid]) ? $_SESSION['relevanceStatus'][$qid] : 1); - $gseq = $var['gseq']; - $grel = (isset($_SESSION['relevanceStatus']['G' . $gseq]) ? $_SESSION['relevanceStatus']['G' . $gseq] : 1); // group-level relevance based upon grelevance equation - return ($grel && $qrel && $sqrel); - } - - /** - * Return whether question $qid is relevanct - * @param $qid - * @return boolean - */ - static function QuestionIsRelevant($qid) - { - $LEM =& LimeExpressionManager::singleton(); - $qrel = (isset($_SESSION['relevanceStatus'][$qid]) ? $_SESSION['relevanceStatus'][$qid] : 1); - $gseq = (isset($LEM->questionId2groupSeq[$qid]) ? $LEM->questionId2groupSeq[$qid] : -1); - $grel = (isset($_SESSION['relevanceStatus']['G' . $gseq]) ? $_SESSION['relevanceStatus']['G' . $gseq] : 1); // group-level relevance based upon grelevance equation - return ($grel && $qrel); - } - - /** - * Return whether group $gseq is relevant - * @param $gseq - * @return boolean - */ - static function GroupIsIrrelevantOrHidden($gseq) - { - $LEM =& LimeExpressionManager::singleton(); - $grel = (isset($_SESSION['relevanceStatus']['G' . $gseq]) ? $_SESSION['relevanceStatus']['G' . $gseq] : 1); // group-level relevance based upon grelevance equation - $gshow = (isset($LEM->indexGseq[$gseq]['show']) ? $LEM->indexGseq[$gseq]['show'] : true); // default to true? - return !($grel && $gshow); - } - - /** - * Check the relevance status of all questions on or before the current group. - * This generates needed JavaScript for dynamic relevance, and sets flags about which questions and groups are relevant - */ - function ProcessAllNeededRelevance($onlyThisQseq=NULL) - { - // TODO - in a running survey, only need to process the current Group. For Admin mode, do we need to process all prior questions or not? - // $now = microtime(true); - - $grelComputed=array(); // so only process it once per group - foreach($this->questionSeq2relevance as $rel) - { - if (!is_null($onlyThisQseq) && $onlyThisQseq!=$rel['qseq']) { - continue; - } - $qid = $rel['qid']; - $gseq = $rel['gseq']; - if ($this->allOnOnePage) { - ; // process relevance for all questions - } - else if ($gseq != $this->currentGroupSeq) { - continue; - } - $result = $this->_ProcessRelevance(htmlspecialchars_decode($rel['relevance'],ENT_QUOTES), - $qid, - $gseq, - $rel['jsResultVar'], - $rel['type'], - $rel['hidden'] - ); - $_SESSION['relevanceStatus'][$qid] = $result; - - if (!isset($grelComputed[$gseq])) { - $this->_ProcessGroupRelevance($gseq); - $grelComputed[$gseq]=true; - } - } - // $this->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - } - - /** - * Translate all Expressions, Macros, registered variables, etc. in $string - * @param $string - the string to be replaced - * @param $questionNum - the $qid of question being replaced - needed for properly alignment of question-level relevance and tailoring - * @param $replacementFields - optional replacement values - * @param $debug - if true,write translations for this page to html-formatted log file - * @param $numRecursionLevels - the number of times to recursively subtitute values in this string - * @param $whichPrettyPrintIteration - if want to pretty-print the source string, which recursion level should be pretty-printed - * @param $noReplacements - true if we already know that no replacements are needed (e.g. there are no curly braces) - * @return - the original $string with all replacements done. - */ - - static function ProcessString($string, $questionNum=NULL, $replacementFields=array(), $debug=false, $numRecursionLevels=1, $whichPrettyPrintIteration=1, $noReplacements=false, $timeit=true, $staticReplacement=false) - { - $now = microtime(true); - $LEM =& LimeExpressionManager::singleton(); - - if ($noReplacements) { - $LEM->em->SetPrettyPrintSource($string); - return $string; - } - - if (isset($replacementFields) && is_array($replacementFields) && count($replacementFields) > 0) - { - $replaceArray = array(); - foreach ($replacementFields as $key => $value) { - $replaceArray[$key] = array( - 'code'=>$value, - 'jsName_on'=>'', - 'jsName'=>'', - 'readWrite'=>'N', - ); - } - $LEM->tempVars = $replaceArray; - } - $questionSeq = -1; - $groupSeq = -1; - if (!is_null($questionNum)) { - $questionSeq = isset($LEM->questionId2questionSeq[$questionNum]) ? $LEM->questionId2questionSeq[$questionNum] : -1; - $groupSeq = isset($LEM->questionId2groupSeq[$questionNum]) ? $LEM->questionId2groupSeq[$questionNum] : -1; - } - $stringToParse = $string; // decode called later htmlspecialchars_decode($string,ENT_QUOTES); - $qnum = is_null($questionNum) ? 0 : $questionNum; - $result = $LEM->em->sProcessStringContainingExpressions($stringToParse,$qnum, $numRecursionLevels, $whichPrettyPrintIteration, $groupSeq, $questionSeq, $staticReplacement); - $hasErrors = $LEM->em->HasErrors(); - - if ($timeit) { - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - } - - - return $result; - } - - - /** - * Compute Relevance, processing $eqn to get a boolean value. If there are syntax errors, return false. - * @param $eqn - the relevance equation - * @param $questionNum - needed to align question-level relevance and tailoring - * @param $jsResultVar - this variable determines whether irrelevant questions are hidden - * @param $type - question type - * @param $hidden - whether question should always be hidden - * @return - */ - static function ProcessRelevance($eqn,$questionNum=NULL,$jsResultVar=NULL,$type=NULL,$hidden=0) - { - $LEM =& LimeExpressionManager::singleton(); - return $LEM->_ProcessRelevance($eqn,$questionNum,NULL,$jsResultVar,$type,$hidden); - } - - /** - * Compute Relevance, processing $eqn to get a boolean value. If there are syntax errors, return false. - * @param $eqn - the relevance equation - * @param $questionNum - needed to align question-level relevance and tailoring - * @param $jsResultVar - this variable determines whether irrelevant questions are hidden - * @param $type - question type - * @param $hidden - whether question should always be hidden - * @return - */ - private function _ProcessRelevance($eqn,$questionNum=NULL,$gseq=NULL,$jsResultVar=NULL,$type=NULL,$hidden=0) - { - // These will be called in the order that questions are supposed to be asked - // TODO - cache results and generated JavaScript equations? - if (!isset($eqn) || trim($eqn=='') || trim($eqn)=='1') - { - $this->groupRelevanceInfo[] = array( - 'qid' => $questionNum, - 'gseq' => $gseq, - 'eqn' => $eqn, - 'result' => true, - 'numJsVars' => 0, - 'relevancejs' => '', - 'relevanceVars' => '', - 'jsResultVar'=> $jsResultVar, - 'type'=>$type, - 'hidden'=>$hidden, - 'hasErrors'=>false, - ); - return true; - } - $questionSeq = -1; - $groupSeq = -1; - if (!is_null($questionNum)) { - $questionSeq = isset($this->questionId2questionSeq[$questionNum]) ? $this->questionId2questionSeq[$questionNum] : -1; - $groupSeq = isset($this->questionId2groupSeq[$questionNum]) ? $this->questionId2groupSeq[$questionNum] : -1; - } - - $stringToParse = htmlspecialchars_decode($eqn,ENT_QUOTES); - $result = $this->em->ProcessBooleanExpression($stringToParse,$groupSeq, $questionSeq); - $hasErrors = $this->em->HasErrors(); - - if (!is_null($questionNum) && !is_null($jsResultVar)) { // so if missing either, don't generate JavaScript for this - means off-page relevance. - $jsVars = $this->em->GetJSVarsUsed(); - $relevanceVars = implode('|',$this->em->GetJSVarsUsed()); - $relevanceJS = $this->em->GetJavaScriptEquivalentOfExpression(); - $this->groupRelevanceInfo[] = array( - 'qid' => $questionNum, - 'gseq' => $gseq, - 'eqn' => $eqn, - 'result' => $result, - 'numJsVars' => count($jsVars), - 'relevancejs' => $relevanceJS, - 'relevanceVars' => $relevanceVars, - 'jsResultVar' => $jsResultVar, - 'type'=>$type, - 'hidden'=>$hidden, - 'hasErrors'=>$hasErrors, - ); - } - return $result; - } - - /** - * Create JavaScript needed to process sub-question-level relevance (e.g. for array_filter and _exclude) - * @param $eqn - the equation to parse - * @param $questionNum - the question number - needed to align relavance and tailoring blocks - * @param $rowdivid - the javascript ID that needs to be shown/hidden in order to control array_filter visibility - * @param $type - the type of sub-question relevance (e.g. 'array_filter', 'array_filter_exclude') - * @return - */ - private function _ProcessSubQRelevance($eqn,$questionNum=NULL,$rowdivid=NULL, $type=NULL, $qtype=NULL, $sgqa=NULL, $isExclusive='', $irrelevantAndExclusive='') - { - // These will be called in the order that questions are supposed to be asked - if (!isset($eqn) || trim($eqn=='') || trim($eqn)=='1') - { - return true; - } - $questionSeq = -1; - $groupSeq = -1; - if (!is_null($questionNum)) { - $questionSeq = isset($this->questionId2questionSeq[$questionNum]) ? $this->questionId2questionSeq[$questionNum] : -1; - $groupSeq = isset($this->questionId2groupSeq[$questionNum]) ? $this->questionId2groupSeq[$questionNum] : -1; - } - - $stringToParse = htmlspecialchars_decode($eqn,ENT_QUOTES); - $result = $this->em->ProcessBooleanExpression($stringToParse,$groupSeq, $questionSeq); - $hasErrors = $this->em->HasErrors(); - $prettyPrint = ''; - if (($this->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) { - $prettyPrint= $this->em->GetPrettyPrintString(); - } - - if (!is_null($questionNum)) { - $jsVars = $this->em->GetJSVarsUsed(); - $relevanceVars = implode('|',$this->em->GetJSVarsUsed()); - $relevanceJS = $this->em->GetJavaScriptEquivalentOfExpression(); - - $isExclusiveJS=''; - $irrelevantAndExclusiveJS=''; - // Only need to extract JS, since will already have Vars and error counts from main equation - if ($isExclusive != '') - { - $this->em->ProcessBooleanExpression($isExclusive,$groupSeq, $questionSeq); - $isExclusiveJS = $this->em->GetJavaScriptEquivalentOfExpression(); - } - if ($irrelevantAndExclusive != '') - { - $this->em->ProcessBooleanExpression($irrelevantAndExclusive,$groupSeq, $questionSeq); - $irrelevantAndExclusiveJS = $this->em->GetJavaScriptEquivalentOfExpression(); - } - - if (!isset($this->subQrelInfo[$questionNum])) { - $this->subQrelInfo[$questionNum] = array(); - } - $this->subQrelInfo[$questionNum][$rowdivid] = array( - 'qid' => $questionNum, - 'eqn' => $eqn, - 'prettyPrintEqn' => $prettyPrint, - 'result' => $result, - 'numJsVars' => count($jsVars), - 'relevancejs' => $relevanceJS, - 'relevanceVars' => $relevanceVars, - 'rowdivid' => $rowdivid, - 'type'=>$type, - 'qtype'=>$qtype, - 'sgqa'=>$sgqa, - 'hasErrors'=>$hasErrors, - 'isExclusiveJS'=>$isExclusiveJS, - 'irrelevantAndExclusiveJS'=>$irrelevantAndExclusiveJS, - ); - } - return $result; - } - - private function _ProcessGroupRelevance($groupSeq) - { - // These will be called in the order that questions are supposed to be asked - if ($groupSeq == -1) { - return; // invalid group, so ignore - } - - $eqn = (isset($this->gseq2info[$groupSeq]['grelevance']) ? $this->gseq2info[$groupSeq]['grelevance'] : 1); - if (is_null($eqn) || trim($eqn=='') || trim($eqn)=='1') - { - $this->gRelInfo[$groupSeq] = array( - 'gseq' => $groupSeq, - 'eqn' => '', - 'result' => 1, - 'numJsVars' => 0, - 'relevancejs' => '', - 'relevanceVars' => '', - 'prettyPrint'=> '', - ); - return; - } - $stringToParse = htmlspecialchars_decode($eqn,ENT_QUOTES); - $result = $this->em->ProcessBooleanExpression($stringToParse,$groupSeq); - $hasErrors = $this->em->HasErrors(); - - $jsVars = $this->em->GetJSVarsUsed(); - $relevanceVars = implode('|',$this->em->GetJSVarsUsed()); - $relevanceJS = $this->em->GetJavaScriptEquivalentOfExpression(); - $prettyPrint = $this->em->GetPrettyPrintString(); - - $this->gRelInfo[$groupSeq] = array( - 'gseq' => $groupSeq, - 'eqn' => $stringToParse, - 'result' => $result, - 'numJsVars' => count($jsVars), - 'relevancejs' => $relevanceJS, - 'relevanceVars' => $relevanceVars, - 'prettyPrint'=> $prettyPrint, - 'hasErrors' => $hasErrors, - ); - $_SESSION['relevanceStatus']['G' . $groupSeq] = $result; - } - - /** - * Used to show potential syntax errors of processing Relevance or Equations. - * @return - */ - static function GetLastPrettyPrintExpression() - { - $LEM =& LimeExpressionManager::singleton(); - return $LEM->em->GetLastPrettyPrintExpression(); - } - - /** - * Expand "self.suffix" and "that.qcode.suffix" into canonical list of variable names - * @param type $qseq - * @param type $varname - */ - static function GetAllVarNamesForQ($qseq,$varname) - { - $LEM =& LimeExpressionManager::singleton(); - - $parts = explode('.',$varname); - $qroot = ''; - $suffix = ''; - $sqpatts = array(); - $nosqpatts = array(); - $sqpatt = ''; - $nosqpatt = ''; - $comments = ''; - - if ($parts[0] == 'self') - { - $type = 'self'; - } - else - { - $type = 'that'; - array_shift($parts); - if (isset($parts[0])) - { - $qroot = $parts[0]; - } - else - { - return $varname; - } - } - array_shift($parts); - - if (count($parts) > 0) - { - if (preg_match('/^' . ExpressionManager::$RDP_regex_var_attr . '$/',$parts[count($parts)-1])) - { - $suffix = '.' . $parts[count($parts)-1]; - array_pop($parts); - } - } - - foreach($parts as $part) - { - if ($part == 'nocomments') - { - $comments = 'N'; - } - else if ($part == 'comments') - { - $comments = 'Y'; - } - else if (preg_match('/^sq_.+$/',$part)) - { - $sqpatts[] = substr($part,3); - } - else if (preg_match('/^nosq_.+$/',$part)) - { - $nosqpatts[] = substr($part,5); - } - else - { - return $varname; // invalid - } - } - $sqpatt = implode('|',$sqpatts); - $nosqpatt = implode('|',$nosqpatts); - $vars = array(); - - foreach ($LEM->knownVars as $kv) - { - if ($type == 'self') - { - if (!isset($kv['qseq']) || $kv['qseq'] != $qseq || trim($kv['sgqa']) == '') - { - continue; - } - } - else - { - if (!isset($kv['rootVarName']) || $kv['rootVarName'] != $qroot) - { - continue; - } - } - if ($comments != '') - { - if ($comments == 'Y' && !preg_match('/comment$/',$kv['sgqa'])) - { - continue; - } - if ($comments == 'N' && preg_match('/comment$/',$kv['sgqa'])) - { - continue; - } - } - $sgq = $LEM->sid . 'X' . $kv['gid'] . 'X' . $kv['qid']; - $ext = substr($kv['sgqa'],strlen($sgq)); - - if ($sqpatt != '') - { - if (!preg_match('/'.$sqpatt.'/',$ext)) - { - continue; - } - } - if ($nosqpatt != '') - { - if (preg_match('/'.$nosqpatt.'/',$ext)) - { - continue; - } - } - - $vars[] = $kv['sgqa'] . $suffix; - } - if (count($vars) > 0) - { - return implode(',',$vars); - } - return $varname; // invalid - } - - /** - * Should be first function called on each page - sets/clears internally needed variables - * @param $allOnOnePage - true if StartProcessingGroup will be called multiple times on this page - does some optimizatinos - * @param $rooturl - if set, this tells LEM to enable hyperlinking of syntax highlighting to ease editing of questions - * @param $initializeVars - if true, initializes the replacement variables to enable syntax highlighting on admin pages - */ - static function StartProcessingPage($allOnOnePage=false,$rooturl=NULL, $initializeVars=false) - { - // $now = microtime(true); - $LEM =& LimeExpressionManager::singleton(); - $LEM->pageRelevanceInfo=array(); - $LEM->pageTailorInfo=array(); - $LEM->allOnOnePage=$allOnOnePage; - $LEM->processedRelevance=false; - if (!is_null($rooturl)) { - $LEM->surveyOptions['rooturl'] = $rooturl; - $LEM->surveyOptions['hyperlinkSyntaxHighlighting']=true; // this will be temporary - should be reset in running survey - } - $LEM->qid2exclusiveAuto=array(); - - // TODO - should really pass this in as a variable - global $surveyinfo; - if (isset($surveyinfo['assessments']) && $surveyinfo['assessments']=='Y') - { - $LEM->surveyOptions['assessments']=true; - } - - // $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - - $LEM->initialized=true; - - if ($initializeVars) - { - $LEM->em->StartProcessingGroup( - isset($_SESSION['LEMsid']) ? $_SESSION['LEMsid'] : NULL, - isset($LEM->surveyOptions['rooturl']) ? $LEM->surveyOptions['rooturl'] : '', - true - ); - $LEM->setVariableAndTokenMappingsForExpressionManager($_SESSION['LEMsid']); - } - } - - /** - * Initialize a survey so can use EM to manage navigation - * @param $surveyid - * @param $surveyMode - * @param $anonymized - * @param $forceRefresh - */ - - static function StartSurvey($surveyid,$surveyMode='group',$options=NULL,$forceRefresh=false,$debugLevel=0) - { - $LEM =& LimeExpressionManager::singleton(); - $LEM->sid=sanitize_int($surveyid); - - if (is_null($options)) { - $options = array(); - } - $LEM->surveyOptions['active'] = (isset($options['active']) ? $options['active'] : false); - $LEM->surveyOptions['allowsave'] = (isset($options['allowsave']) ? $options['allowsave'] : false); - $LEM->surveyOptions['anonymized'] = (isset($options['anonymized']) ? $options['anonymized'] : false); - $LEM->surveyOptions['assessments'] = (isset($options['assessments']) ? $options['assessments'] : false); - $LEM->surveyOptions['datestamp'] = (isset($options['datestamp']) ? $options['datestamp'] : false); - $LEM->surveyOptions['deletenonvalues'] = (isset($options['deletenonvalues']) ? ($options['deletenonvalues']=='1') : true); - $LEM->surveyOptions['hyperlinkSyntaxHighlighting'] = (isset($options['hyperlinkSyntaxHighlighting']) ? $options['hyperlinkSyntaxHighlighting'] : false); - $LEM->surveyOptions['ipaddr'] = (isset($options['ipaddr']) ? $options['ipaddr'] : false); - $LEM->surveyOptions['radix'] = (isset($options['radix']) ? $options['radix'] : '.'); - $LEM->surveyOptions['refurl'] = (isset($options['refurl']) ? $options['refurl'] : NULL); - $LEM->surveyOptions['rooturl'] = (isset($options['rooturl']) ? $options['rooturl'] : ''); - $LEM->surveyOptions['savetimings'] = (isset($options['savetimings']) ? $options['savetimings'] : ''); - $LEM->sgqaNaming = (isset($options['sgqaNaming']) ? ($options['sgqaNaming']=="Y") : true); // TODO default should eventually be false - $LEM->surveyOptions['startlanguage'] = (isset($options['startlanguage']) ? $options['startlanguage'] : 'en'); - $LEM->surveyOptions['surveyls_dateformat'] = (isset($options['surveyls_dateformat']) ? $options['surveyls_dateformat'] : 1); - $LEM->surveyOptions['tablename'] = (isset($options['tablename']) ? $options['tablename'] : db_table_name_nq('survey_' . $LEM->sid)); - $LEM->surveyOptions['tablename_timings'] = ((isset($options['savetimings']) && $options['savetimings'] == 'Y') ? db_table_name('survey_' . $LEM->sid . '_timings') : ''); - $LEM->surveyOptions['target'] = (isset($options['target']) ? $options['target'] : '/temp/files/'); - $LEM->surveyOptions['timeadjust'] = (isset($options['timeadjust']) ? $options['timeadjust'] : 0); - $LEM->surveyOptions['tempdir'] = (isset($options['tempdir']) ? $options['tempdir'] : '/temp/'); - $LEM->surveyOptions['token'] = (isset($options['token']) ? $options['token'] : NULL); - - $LEM->debugLevel=$debugLevel; - $_SESSION['LEMdebugLevel']=$debugLevel; // need acces to SESSSION to decide whether to cache serialized instance of $LEM - switch ($surveyMode) { - case 'survey': - $LEM->allOnOnePage=true; - $LEM->surveyMode = 'survey'; - break; - case 'question': - $LEM->allOnOnePage=false; - $LEM->surveyMode = 'question'; - break; - default: - case 'group': - $LEM->allOnOnePage=false; - $LEM->surveyMode = 'group'; - break; - } - - $LEM->setVariableAndTokenMappingsForExpressionManager($surveyid,$forceRefresh,$LEM->surveyOptions['anonymized'],$LEM->allOnOnePage); - $LEM->currentGroupSeq=-1; - $LEM->currentQuestionSeq=-1; // for question-by-question mode - $LEM->indexGseq=array(); - $LEM->indexQseq=array(); - $LEM->qrootVarName2arrayFilter=array(); - - if (isset($_SESSION['startingValues']) && is_array($_SESSION['startingValues']) && count($_SESSION['startingValues']) > 0) - { - $startingValues = array(); - foreach ($_SESSION['startingValues'] as $k=>$value) - { - if (isset($LEM->knownVars[$k])) - { - $knownVar = $LEM->knownVars[$k]; - } - else if (isset($LEM->qcode2sgqa[$k])) - { - $knownVar = $LEM->knownVars[$LEM->qcode2sgqa[$k]]; - } - else if (isset($LEM->tempVars[$k])) - { - $knownVar = $LEM->tempVar[$k]; - } - else - { - continue; - } - if (!isset($knownVar['jsName'])) - { - continue; - } - switch ($knownVar['type']) - { - case 'D': //DATE - if (trim($value)=="") - { - $value = NULL; - } - else - { - $dateformatdatat=getDateFormatData($LEM->surveyOptions['surveyls_dateformat']); - $datetimeobj = new Date_Time_Converter($value, $dateformatdatat['phpdate']); - $value=$datetimeobj->convert("Y-m-d"); - } - break; - case 'N': //NUMERICAL QUESTION TYPE - case 'K': //MULTIPLE NUMERICAL QUESTION - if (trim($value)=="") { - $value = NULL; - } - else { - $value = sanitize_float($value); - } - break; - case '|': //File Upload - $value=NULL; // can't upload a file via GET - break; - } - $_SESSION[$knownVar['sgqa']] = $value; - $LEM->updatedValues[$knownVar['sgqa']]=array( - 'type'=>$knownVar['type'], - 'value'=>$value, - ); - - } - $LEM->_UpdateValuesInDatabase(NULL); - } - - return array( - 'hasNext'=>true, - 'hasPrevious'=>false, - ); - } - - static function NavigateBackwards() - { - $now = microtime(true); - $LEM =& LimeExpressionManager::singleton(); - - $LEM->ParseResultCache=array(); // to avoid running same test more than once for a given group - $LEM->updatedValues = array(); - - switch ($LEM->surveyMode) - { - case 'survey': - // should never be called? - break; - case 'group': - // First validate the current group - $LEM->StartProcessingPage(); - $updatedValues=$LEM->ProcessCurrentResponses(); - $message = ''; - while (true) - { - $LEM->currentQset = array(); // reset active list of questions - if (--$LEM->currentGroupSeq < 0) - { - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'at_start'=>true, - 'finished'=>false, - 'message'=>$message, - 'unansweredSQs'=>(isset($result['unansweredSQs']) ? $result['unansweredSQs'] : ''), - 'invalidSQs'=>(isset($result['invalidSQs']) ? $result['invalidSQs'] : ''), - ); - return $LEM->lastMoveResult; - } - - $result = $LEM->_ValidateGroup($LEM->currentGroupSeq); - if (is_null($result)) { - continue; // this is an invalid group - skip it - } - $message .= $result['message']; - if (!$result['relevant'] || $result['hidden']) - { - // then skip this group - assume already saved? - continue; - } - else - { - // display new group - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'at_start'=>false, - 'finished'=>false, - 'message'=>$message, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentGroupSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - break; - case 'question': - $LEM->StartProcessingPage(); - $updatedValues=$LEM->ProcessCurrentResponses(); - $message = ''; - while (true) - { - $LEM->currentQset = array(); // reset active list of questions - if (--$LEM->currentQuestionSeq < 0) - { - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'at_start'=>true, - 'finished'=>false, - 'message'=>$message, - 'unansweredSQs'=>(isset($result['unansweredSQs']) ? $result['unansweredSQs'] : ''), - 'invalidSQs'=>(isset($result['invalidSQs']) ? $result['invalidSQs'] : ''), - ); - return $LEM->lastMoveResult; - } - - // Set certain variables normally set by StartProcessingGroup() - $LEM->groupRelevanceInfo=array(); - $qInfo = $LEM->questionSeq2relevance[$LEM->currentQuestionSeq]; - $LEM->currentQID=$qInfo['qid']; - $LEM->currentGroupSeq=$qInfo['gseq']; - if ($LEM->currentGroupSeq > $LEM->maxGroupSeq) { - $LEM->maxGroupSeq = $LEM->currentGroupSeq; - } - - $LEM->ProcessAllNeededRelevance($LEM->currentQuestionSeq); - $LEM->_CreateSubQLevelRelevanceAndValidationEqns($LEM->currentQuestionSeq); - $result = $LEM->_ValidateQuestion($LEM->currentQuestionSeq); - $message .= $result['message']; - $gRelInfo = $LEM->gRelInfo[$LEM->currentGroupSeq]; - $grel = $gRelInfo['result']; - - if (!$grel || !$result['relevant'] || $result['hidden']) - { - // then skip this question - assume already saved? - continue; - } - else - { - // display new question - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'at_start'=>false, - 'finished'=>false, - 'message'=>$message, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentQuestionSeq, - 'qseq'=>$LEM->currentQuestionSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - break; - } - } - - /** - * - * @param $force - if true, continue to go forward even if there are violations to the mandatory and/or validity rules - */ - static function NavigateForwards($force=false) { - $now = microtime(true); - $LEM =& LimeExpressionManager::singleton(); - - $LEM->ParseResultCache=array(); // to avoid running same test more than once for a given group - $LEM->updatedValues = array(); - - switch ($LEM->surveyMode) - { - case 'survey': - $startingGroup = $LEM->currentGroupSeq; - $LEM->StartProcessingPage(true); - $updatedValues=$LEM->ProcessCurrentResponses(); - $message = ''; - - $LEM->currentQset = array(); // reset active list of questions - $result = $LEM->_ValidateSurvey(); - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - if (!$force && !is_null($result) && ($result['mandViolation'] || !$result['valid'] || $startingGroup == -1)) - { - $finished=false; - } - else - { - $finished = true; - } - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,$finished); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>$finished, - 'message'=>$message, - 'gseq'=>1, - 'seq'=>1, - 'mandViolation'=>$result['mandViolation'], - 'valid'=>$result['valid'], - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - break; - case 'group': - // First validate the current group - $LEM->StartProcessingPage(); - $updatedValues=$LEM->ProcessCurrentResponses(); - $message = ''; - if (!$force && $LEM->currentGroupSeq != -1) - { - $result = $LEM->_ValidateGroup($LEM->currentGroupSeq); - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - if (!is_null($result) && ($result['mandViolation'] || !$result['valid'])) - { - // redisplay the current group - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>false, - 'message'=>$message, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentGroupSeq, - 'mandViolation'=>$result['mandViolation'], - 'valid'=>$result['valid'], - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - while (true) - { - $LEM->currentQset = array(); // reset active list of questions - if (++$LEM->currentGroupSeq >= $LEM->numGroups) - { - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,true); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>true, - 'message'=>$message, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentGroupSeq, - 'mandViolation'=>(isset($result['mandViolation']) ? $result['mandViolation'] : false), - 'valid'=>(isset($result['valid']) ? $result['valid'] : false), - 'unansweredSQs'=>(isset($result['unansweredSQs']) ? $result['unansweredSQs'] : ''), - 'invalidSQs'=>(isset($result['invalidSQs']) ? $result['invalidSQs'] : ''), - ); - return $LEM->lastMoveResult; - } - - $result = $LEM->_ValidateGroup($LEM->currentGroupSeq); - if (is_null($result)) { - continue; // this is an invalid group - skip it - } - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - if (!$result['relevant'] || $result['hidden']) - { - // then skip this group - continue; - } - else - { - // display new group - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>false, - 'message'=>$message, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentGroupSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - break; - case 'question': - $LEM->StartProcessingPage(); - $updatedValues=$LEM->ProcessCurrentResponses(); - $message = ''; - if (!$force && $LEM->currentQuestionSeq != -1) - { - $result = $LEM->_ValidateQuestion($LEM->currentQuestionSeq); - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - $gRelInfo = $LEM->gRelInfo[$LEM->currentGroupSeq]; - $grel = $gRelInfo['result']; - - if ($grel && !is_null($result) && ($result['mandViolation'] || !$result['valid'])) - { - // redisplay the current question - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>false, - 'message'=>$message, - 'qseq'=>$LEM->currentQuestionSeq, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentQuestionSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - while (true) - { - $LEM->currentQset = array(); // reset active list of questions - if (++$LEM->currentQuestionSeq >= $LEM->numQuestions) - { - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,true); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>true, - 'message'=>$message, - 'qseq'=>$LEM->currentQuestionSeq, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentQuestionSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>(isset($result['unansweredSQs']) ? $result['unansweredSQs'] : ''), - 'invalidSQs'=>(isset($result['invalidSQs']) ? $result['invalidSQs'] : ''), - ); - return $LEM->lastMoveResult; - } - - // Set certain variables normally set by StartProcessingGroup() - $LEM->groupRelevanceInfo=array(); - $qInfo = $LEM->questionSeq2relevance[$LEM->currentQuestionSeq]; - $LEM->currentQID=$qInfo['qid']; - $LEM->currentGroupSeq=$qInfo['gseq']; - if ($LEM->currentGroupSeq > $LEM->maxGroupSeq) { - $LEM->maxGroupSeq = $LEM->currentGroupSeq; - } - - $LEM->ProcessAllNeededRelevance($LEM->currentQuestionSeq); - $LEM->_CreateSubQLevelRelevanceAndValidationEqns($LEM->currentQuestionSeq); - $result = $LEM->_ValidateQuestion($LEM->currentQuestionSeq); - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - $gRelInfo = $LEM->gRelInfo[$LEM->currentGroupSeq]; - $grel = $gRelInfo['result']; - - if (!$grel || !$result['relevant'] || $result['hidden']) - { - // then skip this question - assume already saved? - continue; - } - else - { - // display new question - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>false, - 'message'=>$message, - 'qseq'=>$LEM->currentQuestionSeq, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentQuestionSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - break; - } - } - - /** - * Write values to database. - * @param $updatedValues - * @param $finished - true if the survey needs to be finalized - */ - private function _UpdateValuesInDatabase($updatedValues, $finished=false,$setSubmitDate=false) - { - // Update these values in the database - global $connect; - - // TODO - now that using $this->updatedValues, may be able to remove local copies of it (unless needed by other sub-systems) - $updatedValues = $this->updatedValues; - - if (!$this->surveyOptions['deletenonvalues']) - { - $nonNullValues = array(); - foreach($updatedValues as $key=>$value) - { - if (!is_null($value)) - { - if (isset($value['value']) && !is_null($value['value'])) - { - $nonNullValues[$key] = $value; - } - } - } - $updatedValues = $nonNullValues; - } - - $message = ''; - if($this->surveyOptions['datestamp'] == true && $this->surveyOptions['anonymized']== true) - { - // On anonymous datestamped surveys, set the datestamp to 1-1-1980 - $datestamp=date("Y-m-d H:i:s",mktime(0,0,0,1,1,1980)); - } - else - { - // Otherwise, use the real date/time, it will only be saved when the table holds a - // datestamp field - $datestamp=date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $this->surveyOptions['timeadjust']); - } - $_SESSION['datestamp']=$datestamp; - if ($this->surveyOptions['active'] && !isset($_SESSION['srid'])) - { - // Create initial insert row for this record - $sdata = array( - "datestamp"=>$datestamp, - "ipaddr"=>(($this->surveyOptions['ipaddr']) ? getIPAddress() : ''), - "startlanguage"=>$this->surveyOptions['startlanguage'], - "token"=>($this->surveyOptions['token']), - "refurl"=>(($this->surveyOptions['refurl']) ? getenv("HTTP_REFERER") : NULL), - "startdate"=>$datestamp, - ); - //One of the strengths of ADOdb's AutoExecute() is that only valid field names for $table are updated - if ($connect->AutoExecute($this->surveyOptions['tablename'], $sdata,'INSERT')) // Checked - { - $srid = $connect->Insert_ID($this->surveyOptions['tablename'],"id"); - $_SESSION['srid'] = $srid; - } - else - { - $message .= $this->gT("Unable to insert record into survey table: ") .$connect->ErrorMsg() . "
        "; - $_SESSION['flashmessage'] = $message; - echo $message; - } - //Insert Row for Timings, if needed - if ($this->surveyOptions['savetimings']) { - $tdata = array( - 'id'=>$srid, - 'interviewtime'=>0 - ); - if ($connect->AutoExecute($this->surveyOptions['tablename_timings'], $tdata,'INSERT')) // Checked - { - $trid = $connect->Insert_ID($this->surveyOptions['tablename_timings'],"sid"); - } - else - { - $message .= $this->gT("Unable to insert record into timings table "). $connect->ErrorMsg() . "
        "; - $_SESSION['flashmessage'] = $message; - echo $message; - } - } - } - - if (count($updatedValues) > 0 || $finished) - { - $query = 'UPDATE '.$this->surveyOptions['tablename'] . " SET "; - $setter = array(); - switch ($this->surveyMode) - { - case 'question': - $thisstep = $this->currentQuestionSeq; - break; - case 'group': - $thisstep = $this->currentGroupSeq; - break; - case 'survey': - $thisstep = 1; - break; - } - $setter[] = db_quote_id('lastpage') . "=" . db_quoteall($thisstep); - - if ($this->surveyOptions['datestamp'] && isset($_SESSION['datestamp'])) { - $setter[] = db_quote_id('datestamp') . "=" . db_quoteall($_SESSION['datestamp']); - } - if ($this->surveyOptions['ipaddr']) { - $setter[] = db_quote_id('ipaddr') . "=" . db_quoteall(getIPAddress()); - } - - foreach ($updatedValues as $key=>$value) - { - if (!empty($key)) //queXS Addition - { - $val = (is_null($value) ? NULL : $value['value']); - $type = (is_null($value) ? NULL : $value['type']); - - // Clean up the values to cope with database storage requirements - switch($type) - { - case 'D': //DATE - if (trim($val)=='') { - $val=NULL; // since some databases can't store blanks in date fields - } - // otherwise will already be in yyyy-mm-dd format after ProcessCurrentResponses() - break; - case '|': //File upload - // This block can be removed once we require 5.3 or later - if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { - $val=addslashes($val); - } - break; - case 'N': //NUMERICAL QUESTION TYPE - case 'K': //MULTIPLE NUMERICAL QUESTION - if (trim($val)=='') { - $val=NULL; // since some databases can't store blanks in numerical inputs - } - break; - default: - break; - } - - if (is_null($val)) - { - $setter[] = db_quote_id($key) . "=NULL"; - } - else - { - $setter[] = db_quote_id($key) . "=" . db_quoteall($val,true); - } - } - } - $query .= implode(', ', $setter); - $query .= " WHERE ID="; - - if (isset($_SESSION['srid']) && $this->surveyOptions['active']) - { - $query .= $_SESSION['srid']; - - if (!db_execute_assoc($query)) - { - echo submitfailed($connect->ErrorMsg()); - - if (($this->debugLevel & LEM_DEBUG_VALIDATION_SUMMARY) == LEM_DEBUG_VALIDATION_SUMMARY) { - $message .= 'Error in SQL update: '. $connect->ErrorMsg() . '
        '; - } - } - // Save Timings if needed - if ($this->surveyOptions['savetimings']) { - set_answer_time(); - } - - if ($finished) - { - // Delete the save control record if successfully finalize the submission - $query = "DELETE FROM ".db_table_name("saved_control")." where srid=".$_SESSION['srid'].' and sid='.$this->sid; - $connect->Execute($query); // Checked - - if (($this->debugLevel & LEM_DEBUG_VALIDATION_SUMMARY) == LEM_DEBUG_VALIDATION_SUMMARY) { - $message .= ';
        '.$query; - } - } - elseif ($this->surveyOptions['allowsave'] && isset($_SESSION['scid'])) - { - $connect->Execute("UPDATE " . db_table_name("saved_control") . " SET saved_thisstep=" . db_quoteall($thisstep) . " where scid=" . $_SESSION['scid']); // Checked - } - // Check quotas whenever results are saved - $bQuotaMatched = false; - $aQuotas = check_quota('return', $this->sid); - if ($aQuotas !== false) - { - if ($aQuotas != false) - { - foreach ($aQuotas as $aQuota) - { - if (isset($aQuota['status']) && $aQuota['status'] == 'matched') { - $bQuotaMatched = true; - } - } - } - } - if ($bQuotaMatched) - { - check_quota('enforce',$this->sid); // will create a page and quit. - } - else - { - if ($finished) { - $sQuery = 'UPDATE '.$this->surveyOptions['tablename'] . " SET " - .db_quote_id('submitdate') . "=" . db_quoteall($datestamp) - ." WHERE ID=".$_SESSION['srid']; - $connect->Execute($sQuery); // Checked - } - } - } - if (($this->debugLevel & LEM_DEBUG_VALIDATION_SUMMARY) == LEM_DEBUG_VALIDATION_SUMMARY) { - $message .= $query; - } - } - return $message; - } - - /** - * Get last move information, optionally clearing the substitution cache - * @param type $clearSubstitutionInfo - * @return type - */ - static function GetLastMoveResult($clearSubstitutionInfo=false) - { - $LEM =& LimeExpressionManager::singleton(); - if ($clearSubstitutionInfo) - { - $LEM->em->ClearSubstitutionInfo(); // need to avoid double-generation of tailoring info - } - return (isset($LEM->lastMoveResult) ? $LEM->lastMoveResult : NULL); - } - - /** - * Jump to a specific question or group sequence. If jumping forward, it re-validates everything in between - * @param $seq - * @param $force - if true, then skip validation of current group (e.g. will jump even if there are errors) - * @param $preview - if true, then treat this group/question as relevant, even if it is not, so that it can be displayed - * @return - */ - static function JumpTo($seq,$preview=false,$processPOST=true,$force=false,$changeLang=false,$setSubmitDate=false) { - $now = microtime(true); - $LEM =& LimeExpressionManager::singleton(); - - if ($changeLang) - { - $LEM->setVariableAndTokenMappingsForExpressionManager($LEM->sid,true,$LEM->surveyOptions['anonymized'],$LEM->allOnOnePage); - } - - $LEM->ParseResultCache=array(); // to avoid running same test more than once for a given group - $LEM->updatedValues = array(); - --$seq; // convert to 0-based numbering - - switch ($LEM->surveyMode) - { - case 'survey': - // This only happens if saving data so far, so don't want to submit it, just validate and return - $startingGroup = $LEM->currentGroupSeq; - $LEM->StartProcessingPage(true); - if ($processPOST) { - $updatedValues=$LEM->ProcessCurrentResponses(); - } - else { - $updatedValues = array(); - } - $message = ''; - - $LEM->currentQset = array(); // reset active list of questions - $result = $LEM->_ValidateSurvey(); - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - $finished=false; - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,$finished,$setSubmitDate); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>$finished, - 'message'=>$message, - 'gseq'=>1, - 'seq'=>1, - 'mandViolation'=>$result['mandViolation'], - 'valid'=>$result['valid'], - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - break; - case 'group': - // First validate the current group - $LEM->StartProcessingPage(); - if ($processPOST) { - $updatedValues=$LEM->ProcessCurrentResponses(); - } - else { - $updatedValues = array(); - } - $message = ''; - if (!$force && $LEM->currentGroupSeq != -1 && $seq > $LEM->currentGroupSeq) // only re-validate if jumping forward - { - $result = $LEM->_ValidateGroup($LEM->currentGroupSeq); - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - if (!is_null($result) && ($result['mandViolation'] || !$result['valid'])) - { - // redisplay the current group - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false,$setSubmitDate); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>false, - 'message'=>$message, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentGroupSeq, - 'mandViolation'=>$result['mandViolation'], - 'valid'=>$result['valid'], - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - if ($seq <= $LEM->currentGroupSeq || $preview) { - $LEM->currentGroupSeq = $seq-1; // Try to jump to the requested group, but navigate to next if needed - } - while (true) - { - $LEM->currentQset = array(); // reset active list of questions - if (++$LEM->currentGroupSeq >= $LEM->numGroups) - { - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,true,$setSubmitDate); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>true, - 'message'=>$message, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentGroupSeq, - 'mandViolation'=>(isset($result['mandViolation']) ? $result['mandViolation'] : false), - 'valid'=>(isset($result['valid']) ? $result['valid'] : false), - 'unansweredSQs'=>(isset($result['unansweredSQs']) ? $result['unansweredSQs'] : ''), - 'invalidSQs'=>(isset($result['invalidSQs']) ? $result['invalidSQs'] : ''), - ); - return $LEM->lastMoveResult; - } - - $result = $LEM->_ValidateGroup($LEM->currentGroupSeq); - if (is_null($result)) { - return NULL; // invalid group - either bad number, or no questions within it - } - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - if (!$preview && (!$result['relevant'] || $result['hidden'])) - { - // then skip this group - assume already saved? - continue; - } - else if (!($result['mandViolation'] || !$result['valid']) && $LEM->currentGroupSeq < $seq) { - // if there is a violation while moving forward, need to stop and ask that set of questions - // if there are no violations, can skip this group as long as changed values are saved. - continue; - } - else - { - // display new group - if(!$preview){ // Save only if not in preview mode - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false,$setSubmitDate); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - } - $LEM->lastMoveResult = array( - 'finished'=>false, - 'message'=>$message, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentGroupSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - break; - case 'question': - $LEM->StartProcessingPage(); - if ($processPOST) { - $updatedValues=$LEM->ProcessCurrentResponses(); - } - else { - $updatedValues = array(); - } - $message = ''; - if (!$force && $LEM->currentQuestionSeq != -1 && $seq > $LEM->currentQuestionSeq) - { - $result = $LEM->_ValidateQuestion($LEM->currentQuestionSeq); - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - $gRelInfo = $LEM->gRelInfo[$LEM->currentGroupSeq]; - $grel = $gRelInfo['result']; - if ($grel && ($result['mandViolation'] || !$result['valid'])) - { - // redisplay the current question - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false,$setSubmitDate); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>false, - 'message'=>$message, - 'qseq'=>$LEM->currentQuestionSeq, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentQuestionSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - if ($seq <= $LEM->currentQuestionSeq || $preview) { - $LEM->currentQuestionSeq = $seq-1; // Try to jump to the requested group, but navigate to next if needed - } - while (true) - { - $LEM->currentQset = array(); // reset active list of questions - if (++$LEM->currentQuestionSeq >= $LEM->numQuestions) - { - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,true,$setSubmitDate); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>true, - 'message'=>$message, - 'qseq'=>$LEM->currentQuestionSeq, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentQuestionSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>(isset($result['unansweredSQs']) ? $result['unansweredSQs'] : ''), - 'invalidSQs'=>(isset($result['invalidSQs']) ? $result['invalidSQs'] : ''), - ); - return $LEM->lastMoveResult; - } - - // Set certain variables normally set by StartProcessingGroup() - $LEM->groupRelevanceInfo=array(); - if (!isset($LEM->questionSeq2relevance[$LEM->currentQuestionSeq])) { - return NULL; // means an invalid question - probably no sub-quetions - } - $qInfo = $LEM->questionSeq2relevance[$LEM->currentQuestionSeq]; - $LEM->currentQID=$qInfo['qid']; - $LEM->currentGroupSeq=$qInfo['gseq']; - if ($LEM->currentGroupSeq > $LEM->maxGroupSeq) { - $LEM->maxGroupSeq = $LEM->currentGroupSeq; - } - - $LEM->ProcessAllNeededRelevance($LEM->currentQuestionSeq); - $LEM->_CreateSubQLevelRelevanceAndValidationEqns($LEM->currentQuestionSeq); - $result = $LEM->_ValidateQuestion($LEM->currentQuestionSeq); - $message .= $result['message']; - $updatedValues = array_merge($updatedValues,$result['updatedValues']); - $gRelInfo = $LEM->gRelInfo[$LEM->currentGroupSeq]; - $grel = $gRelInfo['result']; - - if (!$preview && (!$grel || !$result['relevant'] || $result['hidden'])) - { - // then skip this question - continue; - } - else if (!$preview && !$grel) - { - continue; - } - else if (!$preview && !($result['mandViolation'] || !$result['valid']) && $LEM->currentQuestionSeq < $seq) - { - // if there is a violation while moving forward, need to stop and ask that set of questions - // if there are no violations, can skip this group as long as changed values are saved. - continue; - } - else - { - // display new question - $message .= $LEM->_UpdateValuesInDatabase($updatedValues,false,$setSubmitDate); - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - $LEM->lastMoveResult = array( - 'finished'=>false, - 'message'=>$message, - 'qseq'=>$LEM->currentQuestionSeq, - 'gseq'=>$LEM->currentGroupSeq, - 'seq'=>$LEM->currentQuestionSeq, - 'mandViolation'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['mandViolation'] : false), - 'valid'=> (($LEM->maxGroupSeq > $LEM->currentGroupSeq) ? $result['valid'] : false), - 'unansweredSQs'=>$result['unansweredSQs'], - 'invalidSQs'=>$result['invalidSQs'], - ); - return $LEM->lastMoveResult; - } - } - break; - } - } - - /** - * Check the entire survey - * @return - */ - private function _ValidateSurvey() - { - $LEM =& $this; - - $message = ''; - $srel=false; - $shidden=true; - $smandViolation=false; - $svalid=true; - $unansweredSQs = array(); - $invalidSQs = array(); - $updatedValues = array(); - $sanyUnanswered = false; - - /////////////////////////////////////////////////////// - // CHECK EACH GROUP, AND SET SURVEY-LEVEL PROPERTIES // - /////////////////////////////////////////////////////// - for ($i=0;$i<$LEM->numGroups;++$i) { - $LEM->currentGroupSeq=$i; - $gStatus = $LEM->_ValidateGroup($i); - if (is_null($gStatus)) { - continue; // invalid group, so skip it - } - $message .= $gStatus['message']; - - if ($gStatus['relevant']) { - $srel = true; - } - if ($gStatus['relevant'] && !$gStatus['hidden']) { - $shidden=false; - } - if ($gStatus['relevant'] && !$gStatus['hidden'] && $gStatus['mandViolation']) { - $smandViolation = true; - } - if ($gStatus['relevant'] && !$gStatus['hidden'] && !$gStatus['valid']) { - $svalid=false; - } - if ($gStatus['anyUnanswered']) { - $sanyUnanswered = true; - } - - if (strlen($gStatus['unansweredSQs']) > 0) { - $unansweredSQs = array_merge($unansweredSQs, explode('|',$gStatus['unansweredSQs'])); - } - if (strlen($gStatus['invalidSQs']) > 0) { - $invalidSQs = array_merge($invalidSQs, explode('|',$gStatus['invalidSQs'])); - } - $updatedValues = array_merge($updatedValues, $gStatus['updatedValues']); - // array_merge destroys the key, so do it manually - foreach ($gStatus['qset'] as $key=>$value) { - $LEM->currentQset[$key] = $value; - } - - $LEM->FinishProcessingGroup(); - } - return array( - 'relevant' => $srel, - 'hidden' => $shidden, - 'mandViolation' => $smandViolation, - 'valid' => $svalid, - 'anyUnanswered' => $sanyUnanswered, - 'message' => $message, - 'unansweredSQs' => implode('|',$unansweredSQs), - 'invalidSQs' => implode('|',$invalidSQs), - 'updatedValues' => $updatedValues, - 'seq'=>1, - ); - } - - /** - * Check a group and all of the questions it contains - * @param $groupSeq - the index-0 sequence number for this group - * @return - detailed information about this group - */ - function _ValidateGroup($groupSeq) - { - $LEM =& $this; - - if ($groupSeq < 0 || $groupSeq >= $LEM->numGroups) { - return NULL; // TODO - what is desired behavior? - } - $groupSeqInfo = (isset($LEM->groupSeqInfo[$groupSeq]) ? $LEM->groupSeqInfo[$groupSeq] : NULL); - if (is_null($groupSeqInfo)) { - // then there are no questions in this group - return NULL; - } - $qInfo = $LEM->questionSeq2relevance[$groupSeqInfo['qstart']]; - $gseq = $qInfo['gseq']; - $gid = $qInfo['gid']; - $LEM->StartProcessingGroup($gseq, $LEM->surveyOptions['anonymized'], $LEM->sid); // analyze the data we have about this group - - $grel=false; // assume irrelevant until find a relevant question - $ghidden=true; // assume hidden until find a non-hidden question. If there are no relevant questions on this page, $ghidden will stay true - $gmandViolation=false; // assume that the group contains no manditory questions that have not been fully answered - $gvalid=true; // assume valid until discover otherwise - $debug_message = ''; - $messages = array(); - $currentQset = array(); - $unansweredSQs = array(); - $invalidSQs = array(); - $updatedValues = array(); - $ganyUnanswered = false; - - $gRelInfo = $LEM->gRelInfo[$groupSeq]; - - ///////////////////////////////////////////////////////// - // CHECK EACH QUESTION, AND SET GROUP-LEVEL PROPERTIES // - ///////////////////////////////////////////////////////// - for ($i=$groupSeqInfo['qstart'];$i<=$groupSeqInfo['qend']; ++$i) - { - $qStatus = $LEM->_ValidateQuestion($i); - - $updatedValues = array_merge($updatedValues,$qStatus['updatedValues']); - - if ($gRelInfo['result']==true && $qStatus['relevant']==true) { - $grel = $gRelInfo['result']; // true; // at least one question relevant - } - if ($qStatus['hidden']==false && $qStatus['relevant'] == true) { - $ghidden=false; // at least one question is visible - } - if ($qStatus['relevant']==true && $qStatus['hidden']==false && $qStatus['mandViolation']==true) { - $gmandViolation=true; // at least one relevant question fails mandatory test - } - if ($qStatus['anyUnanswered']==true) { - $ganyUnanswered=true; - } - if ($qStatus['relevant']==true && $qStatus['hidden']==false && $qStatus['valid']==false) { - $gvalid=false; // at least one question fails validity constraints - } - $currentQset[$qStatus['info']['qid']] = $qStatus; - $messages[] = $qStatus['message']; - if (strlen($qStatus['unansweredSQs']) > 0) { - $unansweredSQs[] = $qStatus['unansweredSQs']; - } - if (strlen($qStatus['invalidSQs']) > 0) { - $invalidSQs[] = $qStatus['invalidSQs']; - } - } - $unansweredSQList = implode('|',$unansweredSQs); - $invalidSQList = implode('|',$invalidSQs); - - ///////////////////////////////////////////////////////// - // OPTIONALLY DISPLAY (DETAILED) DEBUGGING INFORMATION // - ///////////////////////////////////////////////////////// - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_SUMMARY) == LEM_DEBUG_VALIDATION_SUMMARY) - { - $debug_message .= '
        [G#' . $LEM->currentGroupSeq . ']' - . '[' . $groupSeqInfo['qstart'] . '-' . $groupSeqInfo['qend'] . ']' - . "[" - . 'GID:' . $gid . "]: " - . ($grel ? 'relevant ' : " irrelevant ") - . (($gRelInfo['eqn'] != '') ? $gRelInfo['prettyPrint'] : '') - . (($ghidden && $grel) ? " always-hidden " : ' ') - . ($gmandViolation ? " (missing a relevant mandatory) " : ' ') - . ($gvalid ? '' : " (fails at least one validation rule) ") - . "
        \n" - . implode('', $messages); - - if ($grel == true) - { - if (!$gvalid) - { - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_DETAIL) == LEM_DEBUG_VALIDATION_DETAIL) - { - $debug_message .= "**At least one relevant question was invalid, so re-show this group
        \n"; - $debug_message .= "**Validity Violators: " . implode(', ', explode('|',$invalidSQList)) . "
        \n"; - } - } - if ($gmandViolation) - { - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_DETAIL) == LEM_DEBUG_VALIDATION_DETAIL) - { - $debug_message .= "**At least one relevant question was mandatory but unanswered, so re-show this group
        \n"; - $debug_message .= '**Mandatory Violators: ' . implode(', ', explode('|',$unansweredSQList)). "
        \n"; - } - } - - if ($ghidden == true) - { - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_DETAIL) == LEM_DEBUG_VALIDATION_DETAIL) - { - $debug_message .= '** Page is relevant but hidden, so NULL irrelevant values and save relevant Equation results:
        '; - } - } - } - else - { - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_DETAIL) == LEM_DEBUG_VALIDATION_DETAIL) - { - $debug_message .= '** Page is irrelevant, so NULL all questions in this group
        '; - } - } - } - - ////////////////////////////////////////////////////////////////////////// - // STORE METADATA NEEDED FOR SUBSEQUENT PROCESSING AND DISPLAY PURPOSES // - ////////////////////////////////////////////////////////////////////////// - $currentGroupInfo = array( - 'gseq' => $groupSeq, - 'message' => $debug_message, - 'relevant' => $grel, - 'hidden' => $ghidden, - 'mandViolation' => $gmandViolation, - 'valid' => $gvalid, - 'qset' => $currentQset, - 'unansweredSQs' => $unansweredSQList, - 'anyUnanswered' => $ganyUnanswered, - 'invalidSQs' => $invalidSQList, - 'updatedValues' => $updatedValues, - ); - - //////////////////////////////////////////////////////// - // STORE METADATA NEEDED TO GENERATE NAVIGATION INDEX // - //////////////////////////////////////////////////////// - $LEM->indexGseq[$groupSeq] = array( - 'gtext' => $LEM->gseq2info[$groupSeq]['description'], - 'gname' => $LEM->gseq2info[$groupSeq]['group_name'], - 'gid' => $LEM->gseq2info[$groupSeq]['gid'], // TODO how used if random? - 'anyUnanswered' => $ganyUnanswered, - 'anyErrors' => (($gmandViolation || !$gvalid) ? true : false), - 'valid' => $gvalid, - 'mandViolation' => $gmandViolation, - 'show' => (($grel && !$ghidden) ? true : false), - ); - - $LEM->gseq2relevanceStatus[$gseq] = $grel; - - return $currentGroupInfo; - } - - - - /** - * For the current set of questions (whether in survey, gtoup, or question-by-question mode), assesses the following: - * (a) mandatory - if so, then all relevant sub-questions must be answered (e.g. pay attention to array_filter and array_filter_exclude) - * (b) always-hidden - * (c) relevance status - including sub-question-level relevance - * (d) answered - if $_SESSION[sgqa]=='' or NULL, then it is not answered - * (e) validity - whether relevant questions pass their validity tests - * @param $questionSeq - the 0-index sequence number for this question - * @return of information about this question and its sub-questions - */ - - function _ValidateQuestion($questionSeq) - { - $LEM =& $this; - $qInfo = $LEM->questionSeq2relevance[$questionSeq]; // this array is by group and question sequence - $qrel=true; // assume relevant unless discover otherwise - $prettyPrintRelEqn=''; // assume no relevance eqn by default - $qid=$qInfo['qid']; - $gseq=$qInfo['gseq']; - $gid=$qInfo['gid']; - $qhidden = $qInfo['hidden']; - $debug_qmessage=''; - - $gRelInfo = $LEM->gRelInfo[$qInfo['gseq']]; - $grel = $gRelInfo['result']; - - /////////////////////////// - // IS QUESTION RELEVANT? // - /////////////////////////// - if (!isset($qInfo['relevance']) || $qInfo['relevance'] == '') - { - $relevanceEqn = 1; - } - else - { - $relevanceEqn = $qInfo['relevance']; - } - - // cache results - $relevanceEqn = htmlspecialchars_decode($relevanceEqn,ENT_QUOTES); // TODO is this needed? - if (isset($LEM->ParseResultCache[$relevanceEqn])) - { - $qrel = $LEM->ParseResultCache[$relevanceEqn]['result']; - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintRelEqn = $LEM->ParseResultCache[$relevanceEqn]['prettyPrint']; - } - } - else - { - $qrel = $LEM->em->ProcessBooleanExpression($relevanceEqn,$qInfo['gseq'], $qInfo['qseq']); // assumes safer to re-process relevance and not trust POST values - $hasErrors = $LEM->em->HasErrors(); - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintRelEqn = $LEM->em->GetPrettyPrintString(); - } - $LEM->ParseResultCache[$relevanceEqn] = array( - 'result'=>$qrel, - 'prettyPrint'=>$prettyPrintRelEqn, - 'hasErrors'=>$hasErrors, - ); - } - - ////////////////////////////////////// - // ARE ANY SUB-QUESTION IRRELEVANT? // - ////////////////////////////////////// - // identify the relevant subquestions (array_filter and array_filter_exclude may make some irrelevant) - $relevantSQs=array(); - $irrelevantSQs=array(); - $prettyPrintSQRelEqns=array(); - $prettyPrintSQRelEqn=''; - $prettyPrintValidTip=''; - $anyUnanswered = false; - if (!$qrel) - { - // All sub-questions are irrelevant - $irrelevantSQs = explode('|', $LEM->qid2code[$qid]); - } - else - { - // Check filter status to determine which subquestions are relevant - if ($qInfo['type'] == 'X') { - $sgqas = array(); // Boilerplate questions can be ignored - } - else { - $sgqas = explode('|',$LEM->qid2code[$qid]); - } - foreach ($sgqas as $sgqa) - { - // for each subq, see if it is part of an array_filter or array_filter_exclude - if (!isset($LEM->subQrelInfo[$qid])) - { - $relevantSQs[] = $sgqa; - continue; - } - $foundSQrelevance=false; - foreach ($LEM->subQrelInfo[$qid] as $sq) - { - switch ($sq['qtype']) - { - case '1': //Array (Flexible Labels) dual scale - if ($sgqa == ($sq['rowdivid'] . '#0') || $sgqa == ($sq['rowdivid'] . '#1')) { - $foundSQrelevance=true; - if (isset($LEM->ParseResultCache[$sq['eqn']])) - { - $sqrel = $LEM->ParseResultCache[$sq['eqn']]['result']; - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintSQRelEqns[$sq['rowdivid']] = $LEM->ParseResultCache[$sq['eqn']]['prettyPrint']; - } - } - else - { - $stringToParse = htmlspecialchars_decode($sq['eqn'],ENT_QUOTES); // TODO is this needed? - $sqrel = $LEM->em->ProcessBooleanExpression($stringToParse,$qInfo['gseq'], $qInfo['qseq']); - $hasErrors = $LEM->em->HasErrors(); - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintSQRelEqn = $LEM->em->GetPrettyPrintString(); - $prettyPrintSQRelEqns[$sq['rowdivid']] = $prettyPrintSQRelEqn; - } - $LEM->ParseResultCache[$sq['eqn']] = array( - 'result'=>$sqrel, - 'prettyPrint'=>$prettyPrintSQRelEqn, - 'hasErrors'=>$hasErrors, - ); - } - if ($sqrel) - { - $relevantSQs[] = $sgqa; - $_SESSION['relevanceStatus'][$sq['rowdivid']]=true; - } - else - { - $irrelevantSQs[] = $sgqa; - $_SESSION['relevanceStatus'][$sq['rowdivid']]=false; - } - } - break; - case ':': //ARRAY (Multi Flexi) 1 to 10 - case ';': //ARRAY (Multi Flexi) Text - if (preg_match('/^' . $sq['rowdivid'] . '_/', $sgqa)) - { - $foundSQrelevance=true; - if (isset($LEM->ParseResultCache[$sq['eqn']])) - { - $sqrel = $LEM->ParseResultCache[$sq['eqn']]['result']; - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintSQRelEqns[$sq['rowdivid']] = $LEM->ParseResultCache[$sq['eqn']]['prettyPrint']; - } - } - else - { - $stringToParse = htmlspecialchars_decode($sq['eqn'],ENT_QUOTES); // TODO is this needed? - $sqrel = $LEM->em->ProcessBooleanExpression($stringToParse,$qInfo['gseq'], $qInfo['qseq']); - $hasErrors = $LEM->em->HasErrors(); - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintSQRelEqn = $LEM->em->GetPrettyPrintString(); - $prettyPrintSQRelEqns[$sq['rowdivid']] = $prettyPrintSQRelEqn; - } - $LEM->ParseResultCache[$sq['eqn']] = array( - 'result'=>$sqrel, - 'prettyPrint'=>$prettyPrintSQRelEqn, - 'hasErrors'=>$hasErrors, - ); - } - if ($sqrel) - { - $relevantSQs[] = $sgqa; - $_SESSION['relevanceStatus'][$sq['rowdivid']]=true; - } - else - { - $irrelevantSQs[] = $sgqa; - $_SESSION['relevanceStatus'][$sq['rowdivid']]=false; - } - } - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': //ARRAY (Flexible) - Row Format - case 'M': //Multiple choice checkbox - case 'P': //Multiple choice with comments checkbox + text - // Note, for M and P, Mandatory should mean that at least one answer was picked - not that all were checked - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - if ($sgqa == $sq['rowdivid'] || $sgqa == ($sq['rowdivid'] . 'comment')) // to catch case 'P' - { - $foundSQrelevance=true; - if (isset($LEM->ParseResultCache[$sq['eqn']])) - { - $sqrel = $LEM->ParseResultCache[$sq['eqn']]['result']; - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintSQRelEqns[$sq['rowdivid']] = $LEM->ParseResultCache[$sq['eqn']]['prettyPrint']; - } - } - else - { - $stringToParse = htmlspecialchars_decode($sq['eqn'],ENT_QUOTES); // TODO is this needed? - $sqrel = $LEM->em->ProcessBooleanExpression($stringToParse,$qInfo['gseq'], $qInfo['qseq']); - $hasErrors = $LEM->em->HasErrors(); - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintSQRelEqn = $LEM->em->GetPrettyPrintString(); - $prettyPrintSQRelEqns[$sq['rowdivid']] = $prettyPrintSQRelEqn; - } - $LEM->ParseResultCache[$sq['eqn']] = array( - 'result'=>$sqrel, - 'prettyPrint'=>$prettyPrintSQRelEqn, - 'hasErrors'=>$hasErrors, - ); - } - if ($sqrel) - { - $relevantSQs[] = $sgqa; - $_SESSION['relevanceStatus'][$sq['rowdivid']]=true; - } - else - { - $irrelevantSQs[] = $sgqa; - $_SESSION['relevanceStatus'][$sq['rowdivid']]=false; - } - } - break; - case 'L': //LIST drop-down/radio-button list - if ($sgqa == ($sq['sgqa'] . 'other') && $sgqa == $sq['rowdivid']) // don't do sub-q level validition to main question, just to other option - { - $foundSQrelevance=true; - if (isset($LEM->ParseResultCache[$sq['eqn']])) - { - $sqrel = $LEM->ParseResultCache[$sq['eqn']]['result']; - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintSQRelEqns[$sq['rowdivid']] = $LEM->ParseResultCache[$sq['eqn']]['prettyPrint']; - } - } - else - { - $stringToParse = htmlspecialchars_decode($sq['eqn'],ENT_QUOTES); // TODO is this needed? - $sqrel = $LEM->em->ProcessBooleanExpression($stringToParse,$qInfo['gseq'], $qInfo['qseq']); - $hasErrors = $LEM->em->HasErrors(); - if (($LEM->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX) - { - $prettyPrintSQRelEqn = $LEM->em->GetPrettyPrintString(); - $prettyPrintSQRelEqns[$sq['rowdivid']] = $prettyPrintSQRelEqn; - } - $LEM->ParseResultCache[$sq['eqn']] = array( - 'result'=>$sqrel, - 'prettyPrint'=>$prettyPrintSQRelEqn, - 'hasErrors'=>$hasErrors, - ); - } - if ($sqrel) - { - $relevantSQs[] = $sgqa; - } - else - { - $irrelevantSQs[] = $sgqa; - } - } - break; - default: - break; - } - } // end foreach($LEM->subQrelInfo) [checking array-filters] - if (!$foundSQrelevance) - { - // then this question is relevant - $relevantSQs[] = $sgqa; - } - } - } // end of processing relevant question for sub-questions - - // These array_unique only apply to array_filter of type L (list) - $relevantSQs = array_unique($relevantSQs); - $irrelevantSQs = array_unique($irrelevantSQs); - - //////////////////////////////////////////////////////////////////// - // WHICH RELEVANT, VISIBLE (SUB)-QUESTIONS HAVEN'T BEEN ANSWERED? // - //////////////////////////////////////////////////////////////////// - // check that all mandatories have been fully answered (but don't require answers for sub-questions that are irrelevant - $unansweredSQs = array(); // list of sub-questions that weren't answered - foreach ($relevantSQs as $sgqa) - { - if (($qInfo['type'] != '*') && (!isset($_SESSION[$sgqa]) || ($_SESSION[$sgqa] === '' || is_null($_SESSION[$sgqa])))) - { - // then a relevant, visible, mandatory question hasn't been answered - // Equations are ignored, since set automatically - $unansweredSQs[] = $sgqa; - } - } - - ////////////////////////////////////////////// - // DETECT ANY VIOLATIONS OF MANDATORY RULES // - ////////////////////////////////////////////// - $qmandViolation = false; // assume there is no mandatory violation until discover otherwise - $mandatoryTip = ''; - if ($qrel && !$qhidden && ($qInfo['mandatory'] == 'Y')) - { - $mandatoryTip = "
        ".$LEM->gT('This question is mandatory').'. '; - switch ($qInfo['type']) - { - case 'M': - case 'P': - case '!': //List - dropdown - case 'L': //LIST drop-down/radio-button list - // If at least one checkbox is checked, we're OK - if (count($relevantSQs) > 0 && (count($relevantSQs) == count($unansweredSQs))) - { - $qmandViolation = true; - } - if (!($qInfo['type'] == '!' || $qInfo['type'] == 'L')) - { - $mandatoryTip .= $LEM->gT('Please check at least one item.'); - } - if ($qInfo['other']=='Y') - { - $qattr = isset($LEM->qattr[$qid]) ? $LEM->qattr[$qid] : array(); - if (isset($qattr['other_replace_text']) && trim($qattr['other_replace_text']) != '') { - $othertext = trim($qattr['other_replace_text']); - } - else { - $othertext = $LEM->gT('Other:'); - } - $mandatoryTip .= "
        \n".sprintf($LEM->gT("If you choose '%s' you must provide a description."), $othertext); - } - break; - case 'X': // Boilerplate can never be mandatory - case '*': // Equation is auto-computed, so can't violate mandatory rules - break; - case 'A': - case 'B': - case 'C': - case 'Q': - case 'K': - case 'E': - case 'F': - case 'J': - case 'H': - case ';': - case '1': - // In general, if any relevant questions aren't answered, then it violates the mandatory rule - if (count($unansweredSQs) > 0) - { - $qmandViolation = true; // TODO - what about 'other'? - } - $mandatoryTip .= $LEM->gT('Please complete all parts').'.'; - break; - case ':': - $qattr = isset($LEM->qattr[$qid]) ? $LEM->qattr[$qid] : array(); - if (isset($qattr['multiflexible_checkbox']) && $qattr['multiflexible_checkbox'] == 1) - { - // Need to check whether there is at least one checked box per row - foreach ($LEM->q2subqInfo[$qid]['subqs'] as $sq) - { - if (!isset($_SESSION['relevanceStatus'][$sq['rowdivid']]) || $_SESSION['relevanceStatus'][$sq['rowdivid']]) - { - $rowCount=0; - $numUnanswered=0; - foreach ($sgqas as $s) - { - if (strpos($s, $sq['rowdivid']) !== false) - { - ++$rowCount; - if (array_search($s,$unansweredSQs) !== false) { - ++$numUnanswered; - } - } - } - if ($rowCount > 0 && $rowCount == $numUnanswered) - { - $qmandViolation = true; - } - } - } - $mandatoryTip .= $LEM->gT('Please check at least one box per row').'.'; - } - else - { - if (count($unansweredSQs) > 0) - { - $qmandViolation = true; // TODO - what about 'other'? - } - $mandatoryTip .= $LEM->gT('Please complete all parts').'.'; - } - break; - case 'R': - if (count($unansweredSQs) > 0) - { - $qmandViolation = true; // TODO - what about 'other'? - } - $mandatoryTip .= $LEM->gT('Please rank all items').'.'; - break; - case 'O': //LIST WITH COMMENT drop-down/radio-button list + textarea - $_count=0; - for ($i=0;$i 0) - { - $qmandViolation = true; - } - break; - default: - if (count($unansweredSQs) > 0) - { - $qmandViolation = true; - } - break; - } - $mandatoryTip .= "
        \n"; - } - - ///////////////////////////////////////////////////////////// - // DETECT WHETHER QUESTION SHOULD BE FLAGGED AS UNANSWERED // - ///////////////////////////////////////////////////////////// - - if ($qrel && !$qhidden) - { - switch ($qInfo['type']) - { - case 'M': - case 'P': - case '!': //List - dropdown - case 'L': //LIST drop-down/radio-button list - // If at least one checkbox is checked, we're OK - if (count($relevantSQs) > 0 && (count($relevantSQs) == count($unansweredSQs))) - { - $anyUnanswered = true; - } - // what about optional vs. mandatory comment and 'other' fields? - break; - default: - $anyUnanswered = (count($unansweredSQs) > 0); - break; - } - } - - /////////////////////////////////////////////// - // DETECT ANY VIOLATIONS OF VALIDATION RULES // - /////////////////////////////////////////////// - $qvalid=true; // assume valid unless discover otherwise - $hasValidationEqn=false; - $prettyPrintValidEqn=''; // assume no validation eqn by default - $validationEqn=''; - $validationJS=''; // assume can't generate JavaScript to validate equation - $validTip=''; // default is none - if (isset($LEM->qid2validationEqn[$qid])) - { - $hasValidationEqn=true; - if (!$qhidden) // do this even is starts irrelevant, else will never show this information. - { - $validationEqns = $LEM->qid2validationEqn[$qid]['eqn']; - $validationEqn = implode(' and ', $validationEqns); - $qvalid = $LEM->em->ProcessBooleanExpression($validationEqn,$qInfo['gseq'], $qInfo['qseq']); - $hasErrors = $LEM->em->HasErrors(); - if (!$hasErrors) - { - $validationJS = $LEM->em->GetJavaScriptEquivalentOfExpression(); - } - $prettyPrintValidEqn = $validationEqn; - if ((($this->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX)) - { - $prettyPrintValidEqn = $LEM->em->GetPrettyPrintString(); - } - - $stringToParse = ''; - foreach ($LEM->qid2validationEqn[$qid]['tips'] as $vclass=>$vtip) - { - $stringToParse .= "
        " . $vtip . "
        \n"; - } - $prettyPrintValidTip = $stringToParse; - $validTip = $LEM->ProcessString($stringToParse, $qid,NULL,false,1,1,false,false); - // TODO check for errors? - if ((($this->debugLevel & LEM_PRETTY_PRINT_ALL_SYNTAX) == LEM_PRETTY_PRINT_ALL_SYNTAX)) - { - $prettyPrintValidTip = $LEM->GetLastPrettyPrintExpression(); - } - $sumEqn = $LEM->qid2validationEqn[$qid]['sumEqn']; - $sumRemainingEqn = $LEM->qid2validationEqn[$qid]['sumRemainingEqn']; - // $countEqn = $LEM->qid2validationEqn[$qid]['countEqn']; - // $countRemainingEqn = $LEM->qid2validationEqn[$qid]['countRemainingEqn']; - - } - else - { - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_DETAIL) == LEM_DEBUG_VALIDATION_DETAIL) - { - $prettyPrintValidEqn = 'Question is Irrelevant, so no need to further validate it'; - } - } - } - if (!$qvalid) - { - $invalidSQs = $LEM->qid2code[$qid]; // TODO - currently invalidates all - should only invalidate those that truly fail validation rules. - } - - ///////////////////////////////////////////////////////// - // OPTIONALLY DISPLAY (DETAILED) DEBUGGING INFORMATION // - ///////////////////////////////////////////////////////// - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_SUMMARY) == LEM_DEBUG_VALIDATION_SUMMARY) - { - $debug_qmessage .= '--[Q#' . $qInfo['qseq'] . ']' - . "[" - . 'QID:'. $qid . '][' . $qInfo['type'] . ']: ' - . ($qrel ? 'relevant' : " irrelevant ") - . ($qhidden ? " always-hidden " : ' ') - . (($qInfo['mandatory'] == 'Y')? ' mandatory' : ' ') - . (($hasValidationEqn) ? (!$qvalid ? " (fails validation rule) " : ' valid') : '') - . ($qmandViolation ? " (missing a relevant mandatory) " : ' ') - . $prettyPrintRelEqn - . "
        \n"; - - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_DETAIL) == LEM_DEBUG_VALIDATION_DETAIL) - { - if ($mandatoryTip != '') - { - $debug_qmessage .= '----Mandatory Tip: ' . FlattenText($mandatoryTip) . "
        \n"; - } - - if ($prettyPrintValidTip != '') - { - $debug_qmessage .= '----Pretty Validation Tip:
        ' . $prettyPrintValidTip . "
        \n"; - } - if ($validTip != '') - { - $debug_qmessage .= '----Validation Tip:
        ' . $validTip . "
        \n"; - } - - if ($prettyPrintValidEqn != '') - { - $debug_qmessage .= '----Validation Eqn: ' . $prettyPrintValidEqn . "
        \n"; - } - if ($validationJS != '') - { - $debug_qmessage .= '----Validation JavaScript: ' . $validationJS . "
        \n"; - } - - // what are the database question codes for this question? - $subQList = '{' . implode('}, {', explode('|',$LEM->qid2code[$qid])) . '}'; - // pretty-print them - $LEM->ProcessString($subQList, $qid,NULL,false,1,1,false,false); - $prettyPrintSubQList = $LEM->GetLastPrettyPrintExpression(); - $debug_qmessage .= '----SubQs=> ' . $prettyPrintSubQList . "
        \n"; - - if (count($prettyPrintSQRelEqns) > 0) - { - $debug_qmessage .= "----Array Filters Applied:
        \n"; - foreach ($prettyPrintSQRelEqns as $key => $value) - { - $debug_qmessage .= '------' . $key . ': ' . $value . "
        \n"; - } - $debug_qmessage .= "
        \n"; - } - - if (count($relevantSQs) > 0) - { - $subQList = '{' . implode('}, {', $relevantSQs) . '}'; - // pretty-print them - $LEM->ProcessString($subQList, $qid,NULL,false,1,1,false,false); - $prettyPrintSubQList = $LEM->GetLastPrettyPrintExpression(); - $debug_qmessage .= '----Relevant SubQs: ' . $prettyPrintSubQList . "
        \n"; - } - - if (count($irrelevantSQs) > 0) - { - $subQList = '{' . implode('}, {', $irrelevantSQs) . '}'; - // pretty-print them - $LEM->ProcessString($subQList, $qid,NULL,false,1,1,false,false); - $prettyPrintSubQList = $LEM->GetLastPrettyPrintExpression(); - $debug_qmessage .= '----Irrelevant SubQs: ' . $prettyPrintSubQList . "
        \n"; - } - - // show which relevant subQs were not answered - if (count($unansweredSQs) > 0) - { - $subQList = '{' . implode('}, {', $unansweredSQs) . '}'; - // pretty-print them - $LEM->ProcessString($subQList, $qid,NULL,false,1,1,false,false); - $prettyPrintSubQList = $LEM->GetLastPrettyPrintExpression(); - $debug_qmessage .= '----Unanswered Relevant SubQs: ' . $prettyPrintSubQList . "
        \n"; - } - } - } - - ///////////////////////////////////////////////////////////// - // CREATE ARRAY OF VALUES THAT NEED TO BE SILENTLY UPDATED // - ///////////////////////////////////////////////////////////// - $updatedValues=array(); - if (!$qrel || !$grel) - { - // If not relevant, then always NULL it in the database - $sgqas = explode('|',$LEM->qid2code[$qid]); - foreach ($sgqas as $sgqa) - { - $_SESSION[$sgqa] = NULL; - $updatedValues[$sgqa] = NULL; - $LEM->updatedValues[$sgqa] = NULL; - } - } - else if ($qInfo['type'] == '*') - { - // Process relevant equations, even if hidden, and write the result to the database - $result = FlattenText($LEM->ProcessString($qInfo['eqn'], $qInfo['qid'],NULL,false,1,1,false,false)); - $sgqa = $LEM->qid2code[$qid]; // there will be only one, since Equation - // Store the result of the Equation in the SESSION - $_SESSION[$sgqa] = $result; - $_update = array( - 'type'=>'*', - 'value'=>$result, - ); - $updatedValues[$sgqa] = $_update; - $LEM->updatedValues[$sgqa] = $_update; - if (($LEM->debugLevel & LEM_DEBUG_VALIDATION_DETAIL) == LEM_DEBUG_VALIDATION_DETAIL) - { - $prettyPrintEqn = $LEM->em->GetPrettyPrintString(); - $debug_qmessage .= '** Process Hidden but Relevant Equation [' . $sgqa . '](' . $prettyPrintEqn . ') => ' . $result . "
        \n"; - } - } - foreach ($irrelevantSQs as $sq) - { - // NULL irrelevant sub-questions - $_SESSION[$sq] = NULL; - $updatedValues[$sq] = NULL; - $LEM->updatedValues[$sq]= NULL; - } - - // Regardless of whether relevant or hidden, if there is a default value and $_SESSION[$sgqa] is NULL, then use the default value in $_SESSION, but don't write to database - // Also, set this AFTER testing relevance - $sgqas = explode('|',$LEM->qid2code[$qid]); - foreach ($sgqas as $sgqa) - { - if (!is_null($LEM->knownVars[$sgqa]['default']) && !isset($_SESSION[$sgqa])) { - // add support for replacements - $defaultVal = $LEM->ProcessString($LEM->knownVars[$sgqa]['default'], NULL, NULL, false, 1, 1, false, false, true); - $_SESSION[$sgqa] = $defaultVal; - } - } - - ////////////////////////////////////////////////////////////////////////// - // STORE METADATA NEEDED FOR SUBSEQUENT PROCESSING AND DISPLAY PURPOSES // - ////////////////////////////////////////////////////////////////////////// - - $qStatus = array( - 'info' => $qInfo, // collect all questions within the group - includes mandatory and always-hiddden status - 'relevant' => $qrel, - 'hidden' => $qInfo['hidden'], - 'relEqn' => $prettyPrintRelEqn, - 'sgqa' => $LEM->qid2code[$qid], - 'unansweredSQs' => implode('|',$unansweredSQs), - 'valid' => $qvalid, - 'validEqn' => $validationEqn, - 'prettyValidEqn' => $prettyPrintValidEqn, - 'validTip' => $validTip, - 'prettyValidTip' => $prettyPrintValidTip, - 'validJS' => $validationJS, - 'invalidSQs' => (isset($invalidSQs) ? $invalidSQs : ''), - 'relevantSQs' => implode('|',$relevantSQs), - 'irrelevantSQs' => implode('|',$irrelevantSQs), - 'subQrelEqn' => implode('
        ',$prettyPrintSQRelEqns), - 'mandViolation' => $qmandViolation, - 'anyUnanswered' => $anyUnanswered, - 'mandTip' => $mandatoryTip, - 'message' => $debug_qmessage, - 'updatedValues' => $updatedValues, - 'sumEqn' => (isset($sumEqn) ? $sumEqn : ''), - 'sumRemainingEqn' => (isset($sumRemainingEqn) ? $sumRemainingEqn : ''), - // 'countEqn' => (isset($countEqn) ? $countEqn : ''), - // 'countRemainingEqn' => (isset($countRemainingEqn) ? $countRemainingEqn : ''), - - ); - - $LEM->currentQset[$qid] = $qStatus; - - //////////////////////////////////////////////////////// - // STORE METADATA NEEDED TO GENERATE NAVIGATION INDEX // - //////////////////////////////////////////////////////// - - $groupSeq = $qInfo['gseq']; - $LEM->indexQseq[$questionSeq] = array( - 'qid' => $qInfo['qid'], - 'qtext' => $qInfo['qtext'], - 'qcode' => $qInfo['code'], - 'qhelp' => $qInfo['help'], - 'anyUnanswered' => $anyUnanswered, - 'anyErrors' => (($qmandViolation || !$qvalid) ? true : false), - 'show' => (($qrel && !$qInfo['hidden']) ? true : false), - 'gseq' => $groupSeq, - 'gtext' => $LEM->gseq2info[$groupSeq]['description'], - 'gname' => $LEM->gseq2info[$groupSeq]['group_name'], - 'gid' => $LEM->gseq2info[$groupSeq]['gid'], // TODO may not be right if using randomization? - 'mandViolation' => $qmandViolation, - 'valid' => $qvalid, - ); - - $_SESSION['relevanceStatus'][$qid] = $qrel; - - return $qStatus; - } - - static function GetQuestionStatus($qid) - { - $LEM =& LimeExpressionManager::singleton(); - if (isset($LEM->currentQset[$qid])) - { - return $LEM->currentQset[$qid]; - } - return NULL; - } - - /** - * Get array of info needed to display the Group Index - * @return - */ - static function GetGroupIndexInfo($gseq=NULL) - { - $LEM =& LimeExpressionManager::singleton(); - if (is_null($gseq)) { - return $LEM->indexGseq; - } - else { - return $LEM->indexGseq[$gseq]; - } - } - - /** - * Translate GID to 0-index Group Sequence number. Only used by Preview Group - * @param $gid - * @return - */ - static function GetGroupSeq($gid) - { - $LEM =& LimeExpressionManager::singleton(); - return (isset($LEM->groupId2groupSeq[$gid]) ? $LEM->groupId2groupSeq[$gid] : -1); - } - - /** - * Get question sequence number from QID - * @param $qid - * @return - */ - static function GetQuestionSeq($qid) - { - $LEM =& LimeExpressionManager::singleton(); - return (isset($LEM->questionId2questionSeq[$qid]) ? $LEM->questionId2questionSeq[$qid] : -1); - } - - /** - * Get array of info needed to display the Question Index - * @return - */ - static function GetQuestionIndexInfo() - { - $LEM =& LimeExpressionManager::singleton(); - return $LEM->indexQseq; - } - - /** - * Return entries needed to build the navigation index - * @param $step - if specified, return a single value, otherwise return entire array - * @return - will be either question or group-level, depending upon $surveyMode - */ - static function GetStepIndexInfo($step=NULL) - { - $LEM =& LimeExpressionManager::singleton(); - switch ($LEM->surveyMode) - { - case 'survey': - return $LEM->lastMoveResult; - break; - case 'group': - if (is_null($step)) { - return $LEM->indexGseq; - } - return $LEM->indexGseq[$step]; - break; - case 'question': - if (is_null($step)) { - return $LEM->indexQseq; - } - return $LEM->indexQseq[$step]; - break; - } - } - - /** - * This should be called each time a new group is started, whether on same or different pages. Sets/Clears needed internal parameters. - * @param $gseq - the group sequence - * @param $anonymized - whether anonymized - * @param $surveyid - the surveyId - * @param $forceRefresh - whether to force refresh of setting variable and token mappings (should be done rarely) - */ - static function StartProcessingGroup($gseq=NULL,$anonymized=false,$surveyid=NULL,$forceRefresh=false) - { - $LEM =& LimeExpressionManager::singleton(); - $LEM->em->StartProcessingGroup( - isset($surveyid) ? $surveyid : NULL, - isset($LEM->surveyOptions['rooturl']) ? $LEM->surveyOptions['rooturl'] : '', - isset($LEM->surveyOptions['hyperlinkSyntaxHighlighting']) ? $LEM->surveyOptions['hyperlinkSyntaxHighlighting'] : false - ); - $LEM->groupRelevanceInfo = array(); - if (!is_null($gseq)) - { - $LEM->currentGroupSeq = $gseq; - - if (!is_null($surveyid)) - { - $LEM->setVariableAndTokenMappingsForExpressionManager($surveyid,$forceRefresh,$anonymized,$LEM->allOnOnePage); - if ($gseq > $LEM->maxGroupSeq) { - $LEM->maxGroupSeq = $gseq; - } - - if (!$LEM->allOnOnePage || ($LEM->allOnOnePage && !$LEM->processedRelevance)) { - $LEM->ProcessAllNeededRelevance(); // TODO - what if this is called using Survey or Data Entry format? - $LEM->_CreateSubQLevelRelevanceAndValidationEqns(); - $LEM->processedRelevance=true; - } - } - } - } - - /** - * Should be called after each group finishes - */ - static function FinishProcessingGroup($skipReprocessing=false) - { - // $now = microtime(true); - $LEM =& LimeExpressionManager::singleton(); - if ($skipReprocessing && $LEM->surveyMode != 'survey') - { - $LEM->pageTailorInfo=array(); - $LEM->pageRelevanceInfo=array(); - } - $LEM->pageTailorInfo[] = $LEM->em->GetCurrentSubstitutionInfo(); - $LEM->pageRelevanceInfo[] = $LEM->groupRelevanceInfo; - // $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - - } - - /** - * Returns an array of string parts, splitting out expressions - * @param type $src - * @return type - */ - static function SplitStringOnExpressions($src) - { - $LEM =& LimeExpressionManager::singleton(); - return $LEM->em->asSplitStringOnExpressions($src); - } - - /** - * Return a formatted table showing how much time each part of EM consumed - * @return - */ - static function GetDebugTimingMessage() - { - $LEM =& LimeExpressionManager::singleton(); - return $LEM->debugTimingMsg; - } - - /** - * Should be called at end of each page - */ - static function FinishProcessingPage() - { - $LEM =& LimeExpressionManager::singleton(); - - $totalTime = 0.; - if ((($LEM->debugLevel & LEM_DEBUG_TIMING) == LEM_DEBUG_TIMING) && count($LEM->runtimeTimings)>0) { - $LEM->debugTimingMsg=''; - foreach($LEM->runtimeTimings as $unit) { - $totalTime += $unit[1]; - } - $LEM->debugTimingMsg .= "\n"; - foreach ($LEM->runtimeTimings as $t) - { - $LEM->debugTimingMsg .= "\n"; - } - $LEM->debugTimingMsg .= "
        Total time attributable to EM = " . $totalTime . "
        " . $t[0] . "" . $t[1] . "
        \n"; - } - // log_message('debug','Total time attributable to EM = ' . $totalTime); - // log_message('debug',print_r($LEM->runtimeTimings,true)); - - $LEM->runtimeTimings = array(); // reset them - - $LEM->initialized=false; // so detect calls after done - $LEM->ParseResultCache=array(); // don't need to persist it in session - $_SESSION['LEMsingleton']=serialize($LEM); - } - - /* - * Generate JavaScript needed to do dynamic relevance and tailoring - * Also create list of variables that need to be declared - */ - static function GetRelevanceAndTailoringJavaScript() - { - global $rooturl; - $now = microtime(true); - $LEM =& LimeExpressionManager::singleton(); - - $jsParts=array(); - $allJsVarsUsed=array(); - $rowdividList=array(); // list of subquestions needing relevance entries - $jsParts[] = ''; - $jsParts[] = "\n\n"; - - // Now figure out which variables have not been declared (those not on the current page) - $undeclaredJsVars = array(); - $undeclaredVal = array(); - if (!$LEM->allOnOnePage) - { - foreach ($LEM->knownVars as $key=>$knownVar) - { - if (!is_numeric($key[0])) { - continue; - } - if ($knownVar['jsName'] == '') { - continue; - } - foreach ($allJsVarsUsed as $jsVar) - { - if ($jsVar == $knownVar['jsName']) - { - if ($LEM->surveyMode=='group' && $knownVar['gseq'] == $LEM->currentGroupSeq) { - if ($knownVar['hidden'] && $knownVar['type'] != '*') { - ; // need to declare a hidden variable for non-equation hidden variables so can do dynamic lookup. - } - else { - continue; - } - } - if ($LEM->surveyMode=='question' && $knownVar['qid'] == $LEM->currentQID) { - continue; - } - $undeclaredJsVars[] = $jsVar; - $sgqa = $knownVar['sgqa']; - $codeValue = (isset($_SESSION[$sgqa])) ? $_SESSION[$sgqa] : ''; - $undeclaredVal[$jsVar] = $codeValue; - - if (isset($LEM->jsVar2qid[$jsVar])) { - $qidList[$LEM->jsVar2qid[$jsVar]] = $LEM->jsVar2qid[$jsVar]; - } - } - } - } - $undeclaredJsVars = array_unique($undeclaredJsVars); - foreach ($undeclaredJsVars as $jsVar) - { - // TODO - is different type needed for text? Or process value to striphtml? - if ($jsVar == '') continue; - $jsParts[] = "\n"; - } - } - else - { - // For all-in-one mode, declare the always-hidden variables, since qanda will not be called for them. - foreach ($LEM->knownVars as $key=>$knownVar) - { - if (!is_numeric($key[0])) { - continue; - } - if ($knownVar['jsName'] == '') { - continue; - } - if ($knownVar['hidden']) - { - $jsVar = $knownVar['jsName']; - $undeclaredJsVars[] = $jsVar; - $sgqa = $knownVar['sgqa']; - $codeValue = (isset($_SESSION[$sgqa])) ? $_SESSION[$sgqa] : ''; - $undeclaredVal[$jsVar] = $codeValue; - } - } - - $undeclaredJsVars = array_unique($undeclaredJsVars); - foreach ($undeclaredJsVars as $jsVar) - { - if ($jsVar == '') continue; - $jsParts[] = "\n"; - } - } - foreach ($qidList as $qid) - { - if (isset($_SESSION['relevanceStatus'])) { - $relStatus = (isset($_SESSION['relevanceStatus'][$qid]) ? $_SESSION['relevanceStatus'][$qid] : 1); - } - else { - $relStatus = 1; - } - $jsParts[] = "\n"; - } - - foreach ($gseqList as $gseq) - { - if (isset($_SESSION['relevanceStatus'])) { - $relStatus = (isset($_SESSION['relevanceStatus']['G' . $gseq]) ? $_SESSION['relevanceStatus']['G' . $gseq] : 1); - } - else { - $relStatus = 1; - } - $jsParts[] = "\n"; - } - foreach ($rowdividList as $key=>$val) - { - $jsParts[] = "\n"; - } - $LEM->runtimeTimings[] = array(__METHOD__,(microtime(true) - $now)); - - return implode('',$jsParts); - } - - static function setTempVars($vars) - { - $LEM =& LimeExpressionManager::singleton(); - $LEM->tempVars = $vars; - } - - /** - * Unit test strings containing expressions - */ - static function UnitTestProcessStringContainingExpressions() - { - $vars = array( - 'name' => array('sgqa'=>'name', 'code'=>'Peter', 'jsName'=>'java61764X1X1', 'readWrite'=>'N', 'type'=>'X', 'question'=>'What is your first/given name?', 'qseq'=>10, 'gseq'=>1), - 'surname' => array('sgqa'=>'surname', 'code'=>'Smith', 'jsName'=>'java61764X1X1', 'readWrite'=>'Y', 'type'=>'X', 'question'=>'What is your last/surname?', 'qseq'=>20, 'gseq'=>1), - 'age' => array('sgqa'=>'age', 'code'=>45, 'jsName'=>'java61764X1X2', 'readWrite'=>'Y', 'type'=>'X', 'question'=>'How old are you?', 'qseq'=>30, 'gseq'=>2), - 'numKids' => array('sgqa'=>'numKids', 'code'=>2, 'jsName'=>'java61764X1X3', 'readWrite'=>'Y', 'type'=>'X', 'question'=>'How many kids do you have?', 'relevance'=>'1', 'qid'=>'40','qseq'=>40, 'gseq'=>2), - 'numPets' => array('sgqa'=>'numPets', 'code'=>1, 'jsName'=>'java61764X1X4', 'readWrite'=>'Y', 'type'=>'X','question'=>'How many pets do you have?', 'qseq'=>50, 'gseq'=>2), - 'gender' => array('sgqa'=>'gender', 'code'=>'M', 'jsName'=>'java61764X1X5', 'readWrite'=>'Y', 'type'=>'X', 'shown'=>'Male','question'=>'What is your gender (male/female)?', 'qseq'=>110, 'gseq'=>2), - 'notSetYet' => array('sgqa'=>'notSetYet', 'code'=>'?', 'jsName'=>'java61764X3X6', 'readWrite'=>'Y', 'type'=>'X', 'shown'=>'Unknown','question'=>'Who will win the next election?', 'qseq'=>200, 'gseq'=>3), - // Constants - '61764X1X1' => array('sgqa'=>'61764X1X1', 'code'=> '', 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X', 'qseq'=>70, 'gseq'=>2), - '61764X1X2' => array('sgqa'=>'61764X1X2', 'code'=> 45, 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X', 'qseq'=>80, 'gseq'=>2), - '61764X1X3' => array('sgqa'=>'61764X1X3', 'code'=> 2, 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X', 'qseq'=>15, 'gseq'=>1), - '61764X1X4' => array('sgqa'=>'61764X1X4', 'code'=> 1, 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X', 'qseq'=>100, 'gseq'=>2), - 'TOKEN:ATTRIBUTE_1' => array('code'=> 'worker', 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X'), - ); - - $tests = <<This example shows escaping of the curly braces

        \{\{test\}\} {if(1==1,'{{test}}', '1 is not 1?')} should not throw any errors. -Here is an example of OK syntax with tooltips
        Hello {if(gender=='M','Mr.','Mrs.')} {surname}, it is now {date('g:i a',time())}. Do you know where your {sum(numPets,numKids)} chidren and pets are? -Here are common errors so you can see the tooltips
        Variables used before they are declared: {notSetYet}
        Unknown Function: {iff(numPets>numKids,1,2)}
        Unknown Variable: {sum(age,num_pets,numKids)}
        Wrong # parameters: {sprintf()},{if(1,2)},{date()}
        Assign read-only-vars:{TOKEN:ATTRIBUTE_1+=10},{name='Sally'}
        Unbalanced parentheses: {pow(3,4},{(pow(3,4)},{pow(3,4))} -Here is some of the unsupported syntax
        No support for '++', '--', '%',';': {min(++age, --age,age % 2);}
        Nor '|', '&', '^': {(sum(2 | 3,3 & 4,5 ^ 6)}}
        Nor arrays: {name[2], name['mine']} -Inline JavaScipt that forgot to add spaces after curly brace
        [script type="text/javascript" language="Javascript"] var job='{TOKEN:ATTRIBUTE_1}'; if (job=='worker') {document.write('BOSSES');}[/script] -Unknown/Misspelled Variables, Functions, and Operators
        {if(sex=='M','Mr.','Mrs.')} {surname}, next year you will be {age++} years old. -Warns if use = instead of == or perform value assignments
        Hello, {if(gender='M','Mr.','Mrs.')} {surname}, next year you will be {age+=1} years old. -Wrong number of arguments for functions:
        {if(gender=='M','Mr.','Mrs.','Other')} {surname}, sum(age,numKids,numPets)={sum(age,numKids,numPets,)} -Mismatched parentheses
        pow(3,4)={pow(3,4)}
        but these are wrong: {pow(3,4}, {(((pow(3,4)}, {pow(3,4))} -Unsupported syntax
        No support for '++', '--', '%',';': {min(++age, --age, age % 2);}
        Nor '|', '&', '^': {(sum(2 | 3, 3 & 4, 5 ^ 6)}}
        Nor arrays: {name[2], name['mine']} -Invalid assignments
        Assign values to equations or strings: {(3 + 4)=5}, {'hi'='there'}
        Assign read-only vars: {TOKEN:ATTRIBUTE_1='boss'}, {name='Sally'} -Values:
        name={name}; surname={surname}
        gender={gender}; age={age}; numPets={numPets}
        numKids=INSERTANS:61764X1X3={numKids}={INSERTANS:61764X1X3}
        TOKEN:ATTRIBUTE_1={TOKEN:ATTRIBUTE_1} -Question Attributes:
        numKids.question={numKids.question}; Question#={numKids.qid}; .relevance={numKids.relevance} -Math:
        5+7={5+7}; 2*pi={2*pi()}; sin(pi/2)={sin(pi()/2)}; max(age,numKids,numPets)={max(age,numKids,numPets)} -Text Processing:
        {str_replace('like','love','I like LimeSurvey')}
        {ucwords('hi there')}, {name}
        {implode('--',name,'this is','a convenient way','way to','concatenate strings')} -Dates:
        {name}, the current date/time is: {date('F j, Y, g:i a',time())} -Conditional:
        Hello, {if(gender=='M','Mr.','Mrs.')} {surname}, may I call you {name}? -Tailored Paragraph:
        {name}, you said that you are {age} years old, and that you have {numKids} {if((numKids==1),'child','children')} and {numPets} {if((numPets==1),'pet','pets')} running around the house. So, you have {numKids + numPets} wild {if((numKids + numPets ==1),'beast','beasts')} to chase around every day.

        Since you have more {if((numKids > numPets),'children','pets')} than you do {if((numKids > numPets),'pets','children')}, do you feel that the {if((numKids > numPets),'pets','children')} are at a disadvantage?

        -EM processes within strings:
        Here is your picture [img src='images/users_{name}_{surname}.jpg' alt='{if(gender=='M','Mr.','Mrs.')} {name} {surname}'/]; -EM doesn't process curly braces like these:
        {name}, { this is not an expression}
        {nor is this }, { nor this }
        \{nor this\},{this\},\{or this } -{INSERTANS:61764X1X1}, you said that you are {INSERTANS:61764X1X2} years old, and that you have {INSERTANS:61764X1X3} {if((INSERTANS:61764X1X3==1),'child','children')} and {INSERTANS:61764X1X4} {if((INSERTANS:61764X1X4==1),'pet','pets')} running around the house. So, you have {INSERTANS:61764X1X3 + INSERTANS:61764X1X4} wild {if((INSERTANS:61764X1X3 + INSERTANS:61764X1X4 ==1),'beast','beasts')} to chase around every day. -Since you have more {if((INSERTANS:61764X1X3 > INSERTANS:61764X1X4),'children','pets')} than you do {if((INSERTANS:61764X1X3 > INSERTANS:61764X1X4),'pets','children')}, do you feel that the {if((INSERTANS:61764X1X3 > INSERTANS:61764X1X4),'pets','children')} are at a disadvantage? -{INSERTANS:61764X1X1}, you said that you are {INSERTANS:61764X1X2} years old, and that you have {INSERTANS:61764X1X3} {if((INSERTANS:61764X1X3==1),'child','children','kiddies')} and {INSERTANS:61764X1X4} {if((INSERTANS:61764X1X4==1),'pet','pets')} running around the house. So, you have {INSERTANS:61764X1X3 + INSERTANS:61764X1X4} wild {if((INSERTANS:61764X1X3 + INSERTANS:61764X1X4 ==1),'beast','beasts')} to chase around every day. -This line should throw errors since the curly-brace enclosed functions do not have linefeeds after them (and before the closing curly brace): var job='{TOKEN:ATTRIBUTE_1}'; if (job=='worker') { document.write('BOSSES') } else { document.write('WORKERS') } -This line has a script section, but if you look at the source, you will see that it has errors: . -Substitions that begin or end with a space should be ignored: { name} {age } -EOD; - $alltests = explode("\n",$tests); - - $javascript1 = <<'; - $alltests[] = 'This line has a hidden script: '; - - LimeExpressionManager::StartProcessingPage(); - LimeExpressionManager::StartProcessingGroup(1); - - $LEM =& LimeExpressionManager::singleton(); - $LEM->tempVars = $vars; - - $LEM->questionId2questionSeq = array(); - $LEM->questionId2groupSeq = array(); - $_SESSION['relevanceStatus'] = array(); - foreach ($vars as $var) { - if (isset($var['qseq'])) { - $LEM->questionId2questionSeq[$var['qseq']] = $var['qseq']; - $LEM->questionId2groupSeq[$var['qseq']] = $var['gseq']; - $_SESSION['relevanceStatus'][$var['qseq']] = 1; - } - } - - print "

        Note, if the Vars Used column is red, then at least one error was found in the Source. In such cases, the Vars Used list may be missing names of variables from sub-expressions containing errors

        "; - print ''; - for ($i=0;$iem->GetAllVarsUsed(); - if (count($varsUsed) > 0) { - sort($varsUsed); - $varList = implode(',
        ', $varsUsed); - } - else { - $varList = ' '; - } - - print "
        \n"; - print "\n"; - print "\n"; - if ($LEM->em->HasErrors()) { - print "\n"; - print "\n"; - } - print '
        SourcePretty PrintResultVars Used
        " . htmlspecialchars($test,ENT_QUOTES) . "" . $prettyPrint . "" . $result . ""; - } - else { - print ""; - } - print $varList . "
        '; - LimeExpressionManager::FinishProcessingGroup(); - LimeExpressionManager::FinishProcessingPage(); - } - - /** - * Unit test Relevance using a simplified syntax to represent questions. - */ - static function UnitTestRelevance() - { - // Tests: varName~relevance~inputType~message - $tests = <<80))} -agestop~!is_empty(age) && ((age<16) || (age>80))~message~Sorry, {name}, you are too {if((age<16),'young',if((age>80),'old','middle-aged'))} for this test. -kids~!((age<16) || (age>80))~yesno~Do you have children (Y/N)? -kidsO~!is_empty(kids) && !(kids=='Y' or kids=='N')~message~Please answer the question about whether you have children with 'Y' or 'N'. -wantsKids~kids=='N'~yesno~Do you hope to have kids some day (Y/N)? -wantsKidsY~wantsKids=='Y'~message~{name}, I hope you are able to have children some day! -wantsKidsN~wantsKids=='N'~message~{name}, I hope you have a wonderfully fulfilling life! -wantsKidsO~!is_empty(wantsKids) && !(wantsKids=='Y' or wantsKids=='N')~message~Please answer the question about whether you want children with 'Y' or 'N'. -parents~1~expr~{parents = (!badage && kids=='Y')} -numKids~kids=='Y'~text~How many children do you have? -numKidsValidation~parents and strlen(numKids) > 0 and numKids <= 0~message~{name}, please check your entries. You said you do have children, {numKids} of them, which makes no sense. -kid1~numKids >= 1~text~How old is your first child? -kid2~numKids >= 2~text~How old is your second child? -kid3~numKids >= 3~text~How old is your third child? -kid4~numKids >= 4~text~How old is your fourth child? -kid5~numKids >= 5~text~How old is your fifth child? -sumage~1~expr~{sumage=sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} -report~numKids > 0~message~{name}, you said you are {age} and that you have {numKids} kids. The sum of ages of your first {min(numKids,5)} kids is {sumage}. -EOT; - - $vars = array(); - $varsNAOK = array(); - $varSeq = array(); - $testArgs = array(); - $argInfo = array(); - - LimeExpressionManager::SetDirtyFlag(); - $LEM =& LimeExpressionManager::singleton(); - - - LimeExpressionManager::StartProcessingPage(true); - LimeExpressionManager::StartProcessingGroup(1); // pretending this is group 1 - - // collect variables - $i=0; - foreach(explode("\n",$tests) as $test) - { - $args = explode("~",$test); - $type = (($args[1]=='expr') ? '*' : ($args[1]=='message') ? 'X' : 'S'); - $vars[$args[0]] = array('sgqa'=>$args[0], 'code'=>'', 'jsName'=>'java' . $args[0], 'jsName_on'=>'java' . $args[0], 'readWrite'=>'Y', 'type'=>$type, 'relevanceStatus'=>'1', 'gid'=>1, 'gseq'=>1, 'qseq'=>$i, 'qid'=>$i); - $varSeq[] = $args[0]; - $testArgs[] = $args; - $LEM->questionId2questionSeq[$i] = $i; - $LEM->questionId2groupSeq[$i] = 1; - $LEM->questionSeq2relevance[$i] = array( - 'relevance'=>htmlspecialchars(preg_replace('/[[:space:]]/',' ',$args[1]),ENT_QUOTES), - 'qid'=>$i, - 'qseq'=>$i, - 'gseq'=>1, - 'jsResultVar'=>'java' . $args[0], - 'type'=>$type, - 'hidden'=>false, - 'gid'=>1, // ($i % 3), - ); - ++$i; - } - - $LEM->knownVars = $vars; // this overwrites local values, so must set dirty flag when done with this function - $LEM->gRelInfo[1] = array( - 'gid' => 1, - 'gseq' => 1, - 'eqn' => '', - 'result' => 1, - 'numJsVars' => 0, - 'relevancejs' => '', - 'relevanceVars' => '', - 'prettyPrint'=> '', - ); - $LEM->ProcessAllNeededRelevance(); - - // collect relevance - $alias2varName = array(); - $varNameAttr = array(); - for ($i=0;$i $i, - 'name' => $jsVarName, - 'sgqa' => $testArg[0], - 'type' => $testArg[2], - 'question' => $question, - 'relevance' => $testArg[1], - 'relevanceStatus' => $rel - ); - $alias2varName[$var] = array('jsName'=>$jsVarName, 'jsPart' => "'" . $var . "':'" . $jsVarName . "'"); - $alias2varName[$jsVarName] = array('jsName'=>$jsVarName, 'jsPart' => "'" . $jsVarName . "':'" . $jsVarName . "'"); - $varNameAttr[$jsVarName] = "'" . $jsVarName . "':{" - . "'jsName':'" . $jsVarName - . "','jsName_on':'" . $jsVarName - . "','sgqa':'" . substr($jsVarName,4) - . "','qid':" . $i - . ",'gid':". 1 // ($i % 3) // so have 3 possible group numbers - . "}"; - } - $LEM->alias2varName = $alias2varName; - $LEM->varNameAttr = $varNameAttr; - LimeExpressionManager::FinishProcessingGroup(); - LimeExpressionManager::FinishProcessingPage(); - - print <<< EOD - -EOD; - - print LimeExpressionManager::GetRelevanceAndTailoringJavaScript(); - - // Print Table of questions - print "

        This is a test of dynamic relevance.

        "; - print "Enter your name and age, and try all the permutations of answers to whether you have or want children.
        \n"; - print "Note how the text and sum of ages changes dynamically; that prior answers are remembered; and that irrelevant values are not included in the sum of ages.
        "; - print "
        "; - foreach ($argInfo as $arg) - { - $rel = LimeExpressionManager::QuestionIsRelevant($arg['num']); - print "
        "; - LimeExpressionManager::SetDirtyFlag(); // so subsequent tests don't try to access these variables - } - - /** - * Set the 'this' variable as an alias for SGQA within the code. - * @param $sgqa - */ - public static function SetThisAsAliasForSGQA($sgqa) - { - $LEM =& LimeExpressionManager::singleton(); - if (isset($LEM->knownVars[$sgqa])) - { - $LEM->qcode2sgqa['this']=$sgqa; - } - } - - public static function ShowStackTrace(&$msg=NULL,&$args=NULL) - { - $LEM =& LimeExpressionManager::singleton(); - - $msg = array("**Stack Trace**" . (is_null($msg) ? '' : ' - ' . $msg)); - - $count = 0; - foreach (debug_backtrace(false) as $log) - { - if ($count++ == 0){ - continue; // skip this call - } - $LEM->debugStack = array(); - - $subargs=array(); - if (!is_null($args) && $log['function'] == 'templatereplace') { - foreach ($args as $arg) - { - if (isset($log['args'][2][$arg])) { - $subargs[$arg] = $log['args'][2][$arg]; - } - } - if (count($subargs) > 0) { - $arglist = print_r($subargs,true); - } - else { - $arglist = ''; - } - } - else { - $arglist = ''; - } - $msg[] = ' ' - . (isset($log['file']) ? '[' . basename($log['file']) . ']': '') - . (isset($log['class']) ? $log['class'] : '') - . (isset($log['type']) ? $log['type'] : '') - . (isset($log['function']) ? $log['function'] : '') - . (isset($log['line']) ? '[' . $log['line'] . ']' : '') - . $arglist; - } - } - - private function gT($string) - { - // eventually replace this with i8n - global $clang; - if (isset($clang)) { - return htmlspecialchars($clang->gT($string),ENT_QUOTES); - } - else { - return $string; - } - } - - /** - * Returns true if the survey is using comma as the radix - * @return type - */ - public static function usingCommaAsRadix() - { - $LEM =& LimeExpressionManager::singleton(); - $usingCommaAsRadix = (($LEM->surveyOptions['radix']==',') ? true : false); - return $usingCommaAsRadix; - } - - private static function getConditionsForEM($surveyid=NULL, $qid=NULL) - { - global $databasetype; - - if (!is_null($qid)) { - $where = " c.qid = ".$qid." and "; - } - else if (!is_null($surveyid)) { - $where = " c.qid in (select qid from ".db_table_name('questions')." where sid = ".$surveyid.") and "; - } - else { - $where = ""; - } - - $query = "select distinct c.*" - .", q.sid, q.type" - ." from ".db_table_name('conditions')." as c" - .", ".db_table_name('questions')." as q" - ." where " . $where - ." c.cqid=q.qid" - ." union " - ." select c.*, q.sid, '' as type" - ." from ".db_table_name('conditions')." as c" - .", ".db_table_name('questions')." as q" - ." where ". $where - ." c.cqid = 0 and c.qid = q.qid"; - - if ($databasetype == 'odbc_mssql' || $databasetype == 'odbtp' || $databasetype == 'mssql_n' || $databasetype =='mssqlnative') - { - $query .= " order by sid, c.qid, scenario, cqid, cfieldname, value"; - - } - else - { - $query .= " order by sid, qid, scenario, cqid, cfieldname, value"; - - } - - $data = db_execute_assoc($query); - - return $data; - } - - /** - * Deprecate obsolete question attributes. - * @param boolean $changedb - if true, updates parameters and deletes old ones - * @param type $surveyid - if set, then only for that survey - * @param type $onlythisqid - if set, then only for this question ID - */ - public static function UpgradeQuestionAttributes($changeDB=false,$surveyid=NULL,$onlythisqid=NULL) - { - $LEM =& LimeExpressionManager::singleton(); - $qattrs = $LEM->getQuestionAttributesForEM($surveyid,$onlythisqid); - - $qupdates = array(); - - $attibutemap = array( - 'max_num_value_sgqa' => 'max_num_value', - 'min_num_value_sgqa' => 'min_num_value', - 'num_value_equals_sgqa' => 'equals_num_value', - ); - $reverseAttributeMap = array_flip($attibutemap); - foreach ($qattrs as $qid => $qattr) - { - $updates = array(); - foreach ($attibutemap as $src=>$target) - { - if (isset($qattr[$src]) && trim($qattr[$src]) != '') - { - $updates[$target] = $qattr[$src]; - } - } - if (count($updates) > 0) - { - $qupdates[$qid] = $updates; - } - } - if ($changeDB) - { - $queries = array(); - foreach ($qupdates as $qid=>$updates) - { - foreach ($updates as $key=>$value) - { - $query = "UPDATE ".db_table_name('question_attributes')." SET value=".db_quoteall($value)." WHERE qid=".$qid." and attribute=".db_quoteall($key); - $queries[] = $query; - $query = "DELETE FROM ".db_table_name('question_attributes')." WHERE qid=".$qid." and attribute=".db_quoteall($reverseAttributeMap[$key]); - $queries[] = $query; - - } - } - foreach ($queries as $query) - { - db_execute_assoc($query); - } - return $queries; - } - else - { - return $qupdates; - } - } - - private function getQuestionAttributesForEM($surveyid=NULL,$qid=NULL, $lang=NULL) - { - if (!is_null($qid)) { - $where = " a.qid = ".$qid." and a.qid=b.qid"; - } - else if (!is_null($surveyid)) { - $where = " a.qid=b.qid and b.sid=".$surveyid; - } - else { - $where = " a.qid=b.qid"; - } - if (!is_null($lang)) { - $lang = " and a.language='".$lang."' and b.language='".$lang."'"; - } - global $databasetype; - if ($databasetype == 'odbc_mssql' || $databasetype == 'odbtp' || $databasetype == 'mssql_n' || $databasetype =='mssqlnative') - { - $query = "select distinct a.qid, a.attribute, CAST(a.value as varchar(4000)) as value"; - } - else - { - $query = "select distinct a.qid, a.attribute, a.value"; - } - - $query .= " from ".db_table_name('question_attributes')." as a, ".db_table_name('questions')." as b" - ." where " . $where - .$lang - ." order by a.qid, a.attribute"; - - $data = db_execute_assoc($query); - $qattr = array(); - - foreach($data->GetRows() as $row) { - $qattr[$row['qid']][$row['attribute']] = $row['value']; - } - - if (!is_null($lang)) - { - // Then get non-language specific first, and overwrite with language-specific - $qattr2 = $qattr; - $qattr = $this->getQuestionAttributesForEM($surveyid,$qid); - foreach ($qattr2 as $q => $qattrs) { - if (is_array($qattrs)) { - foreach ($qattrs as $attr=>$value) { - $qattr[$q][$attr] = $value; - } - } - } - } - - return $qattr; - } - - /** - * Return array of language-specific answer codes - * @param $surveyid - * @param $qid - * @return - */ - - function getAnswerSetsForEM($surveyid=NULL,$qid=NULL,$lang=NULL) - { - if (!is_null($qid)) { - $where = "a.qid = ".$qid; - } - else if (!is_null($surveyid)) { - $where = "a.qid = q.qid and q.sid = ".$surveyid; - } - else { - $where = "1"; - } - if (!is_null($lang)) { - $lang = " and a.language='".$lang."' and q.language='".$lang."'"; - } - - $query = "SELECT a.qid, a.code, a.answer, a.scale_id, a.assessment_value" - ." FROM ".db_table_name('answers')." AS a, ".db_table_name('questions')." as q" - ." WHERE ".$where - .$lang - ." ORDER BY a.qid, a.scale_id, a.sortorder"; - - $data = db_execute_assoc($query); - - $qans = array(); - - $useAssessments = ((isset($this->surveyOptions['assessments'])) ? $this->surveyOptions['assessments'] : false); - - foreach($data->GetRows() as $row) { - if (!isset($qans[$row['qid']])) { - $qans[$row['qid']] = array(); - } - $qans[$row['qid']][$row['scale_id'].'~'.$row['code']] = ($useAssessments ? $row['assessment_value'] : $row['code']) . '|' . $row['answer']; - } - - return $qans; - } - - /** - * Returns group info needed for indexes - * @param $surveyid - * @param string $lang - * @return - */ - - function getGroupInfoForEM($surveyid,$lang=NULL) - { - if (!is_null($lang)) { - $lang = " and a.language='".$lang."'"; - } - - $query = "SELECT a.group_name, a.description, a.gid, a.group_order, a.grelevance" - ." FROM ".db_table_name('groups')." AS a" - ." WHERE a.sid=".$surveyid - .$lang - ." ORDER BY group_order"; - - $data = db_execute_assoc($query); - - $qinfo = array(); - $_order=0; - foreach ($data as $d) - { - $qinfo[$_order] = array( - 'group_order' => $_order, - 'gid' => $d['gid'], - 'group_name' => $d['group_name'], - 'description' => $d['description'], - 'grelevance' => $d['grelevance'], - ); - ++$_order; - } - - return $qinfo; - } - - /** - * Cleanse the $_POSTed data and update $_SESSION variables accordingly - */ - static function ProcessCurrentResponses() - { - $LEM =& LimeExpressionManager::singleton(); - if (!isset($LEM->currentQset)) { - return array(); - } - $updatedValues=array(); - $radixchange = (($LEM->surveyOptions['radix']==',') ? true : false); - foreach ($LEM->currentQset as $qinfo) - { - $relevant=false; - $qid = $qinfo['info']['qid']; - $gseq = $qinfo['info']['gseq']; - $relevant = (isset($_POST['relevance' . $qid]) ? ($_POST['relevance' . $qid] == 1) : false); - $grelevant = (isset($_POST['relevanceG' . $gseq]) ? ($_POST['relevanceG' . $gseq] == 1) : false); - $_SESSION['relevanceStatus'][$qid] = $relevant; - $_SESSION['relevanceStatus']['G' . $gseq] = $grelevant; - foreach (explode('|',$qinfo['sgqa']) as $sq) - { - $sqrelevant=true; - if (isset($LEM->subQrelInfo[$qid][$sq]['rowdivid'])) - { - $rowdivid = $LEM->subQrelInfo[$qid][$sq]['rowdivid']; - if ($rowdivid!='' && isset($_POST['relevance' . $rowdivid])) - { - $sqrelevant = ($_POST['relevance' . $rowdivid] == 1); - $_SESSION['relevanceStatus'][$rowdivid] = $sqrelevant; - } - } - $type = $qinfo['info']['type']; - if ($relevant && $grelevant && $sqrelevant) - { - if ($qinfo['info']['hidden'] && !isset($_POST[$sq])) - { - $value = (isset($_SESSION[$sq]) ? $_SESSION[$sq] : ''); // if always hidden, use the default value, if any, unless value was changed via POST - } - else - { - $value = (isset($_POST[$sq]) ? $_POST[$sq] : ''); - } - if ($radixchange && isset($LEM->knownVars[$sq]['onlynum']) && $LEM->knownVars[$sq]['onlynum']=='1') - { - // convert from comma back to decimal - $value = implode('.',explode(',',$value)); - } - switch($type) - { - case 'D': //DATE - if (trim($value)=="") - { - $value = ""; - } - else - { - $dateformatdatat=getDateFormatData($LEM->surveyOptions['surveyls_dateformat']); - $datetimeobj = new Date_Time_Converter($value, $dateformatdatat['phpdate']); - $value=$datetimeobj->convert("Y-m-d"); - } - break; - case 'N': //NUMERICAL QUESTION TYPE - case 'K': //MULTIPLE NUMERICAL QUESTION - if (trim($value)=="") { - $value = ""; - } - else { - $value = sanitize_float($value); - } - break; - case '|': //File Upload - if (!preg_match('/_filecount$/', $sq)) - { - $json = $value; - $phparray = json_decode(stripslashes($json)); - - // if the files have not been saved already, - // move the files from tmp to the files folder - - $tmp = $LEM->surveyOptions['tempdir'] . '/upload/'; - if (!is_null($phparray) && count($phparray) > 0) - { - // Move the (unmoved, temp) files from temp to files directory. - // Check all possible file uploads - for ($i = 0; $i < count($phparray); $i++) - { - if (file_exists($tmp . $phparray[$i]->filename)) - { - $sDestinationFileName = 'fu_' . sRandomChars(15); - if (!is_dir($LEM->surveyOptions['target'])) - { - mkdir($LEM->surveyOptions['target'], 0777, true); - } - if (!rename($tmp . $phparray[$i]->filename, $LEM->surveyOptions['target'] . $sDestinationFileName)) - { - echo "Error moving file to target destination"; - } - $phparray[$i]->filename = $sDestinationFileName; - } - } - $value = ls_json_encode($phparray); // so that EM doesn't try to parse it. - } - } - break; - } - $_SESSION[$sq] = $value; - $_update = array ( - 'type'=>$type, - 'value'=>$value, - ); - $updatedValues[$sq] = $_update; - $LEM->updatedValues[$sq] = $_update; - } - else { // irrelevant, so database will be NULLed separately - // Must unset the value, rather than setting to '', so that EM can re-use the default value as needed. - unset($_SESSION[$sq]); - $_update = array ( - 'type'=>$type, - 'value'=>NULL, - ); - $updatedValues[$sq] = $_update; - $LEM->updatedValues[$sq] = $_update; - } - } - } - if (isset($_POST['timerquestion'])) - { - $_SESSION[$_POST['timerquestion']]=sanitize_float($_POST[$_POST['timerquestion']]); - } - return $updatedValues; - } - - static public function isValidVariable($varName) - { - $LEM =& LimeExpressionManager::singleton(); - - if (isset($LEM->knownVars[$varName])) - { - return true; - } - else if (isset($LEM->qcode2sgqa[$varName])) - { - return true; - } - else if (isset($LEM->tempVars[$varName])) - { - return true; - } - return false; - } - - static public function GetVarAttribute($name,$attr,$default,$gseq,$qseq) - { - $LEM =& LimeExpressionManager::singleton(); - return $LEM->_GetVarAttribute($name,$attr,$default,$gseq,$qseq); - } - - private function _GetVarAttribute($name,$attr,$default,$gseq,$qseq) - { - $args = explode(".", $name); - $varName = $args[0]; - $varName = preg_replace("/^(?:INSERTANS:)?(.*?)$/", "$1", $varName); - - if (isset($this->knownVars[$varName])) - { - $var = $this->knownVars[$varName]; - } - else if (isset($this->qcode2sgqa[$varName])) - { - $var = $this->knownVars[$this->qcode2sgqa[$varName]]; - } - else if (isset($this->tempVars[$varName])) - { - $var = $this->tempVars[$varName]; - } - else - { - return '{' . $name . '}'; - } - $sgqa = isset($var['sgqa']) ? $var['sgqa'] : NULL; - if (is_null($attr)) - { - // then use the requested attribute, if any - $_attr = 'code'; - if (preg_match("/INSERTANS:/",$args[0])) - { - $_attr = 'shown'; - } - $attr = (count($args)==2) ? $args[1] : $_attr; - } - - // Like JavaScript, if an answer is irrelevant, always return '' - if (preg_match('/^code|NAOK|shown|valueNAOK|value$/',$attr) && isset($var['qid']) && $var['qid']!='') - { - if (!$this->_GetVarAttribute($varName,'relevanceStatus',false,$gseq,$qseq)) - { - return ''; - } - } - switch ($attr) - { - case 'varName': - return $name; - case 'code': - case 'NAOK': - if (isset($var['code'])) { - return $var['code']; // for static values like TOKEN - } - else { - if (isset($_SESSION[$sgqa])) { - return $_SESSION[$sgqa]; - } - if (isset($var['default']) && !is_null($var['default'])) { - return $var['default']; - } - return $default; - } - case 'value': - case 'valueNAOK': - { - $type = $var['type']; - $code = $this->_GetVarAttribute($name,'code',$default,$gseq,$qseq); - switch($type) - { - case '!': //List - dropdown - case 'L': //LIST drop-down/radio-button list - case 'O': //LIST WITH COMMENT drop-down/radio-button list + textarea - case '1': //Array (Flexible Labels) dual scale // need scale - case 'H': //ARRAY (Flexible) - Column Format - case 'F': //ARRAY (Flexible) - Row Format - case 'R': //RANKING STYLE - if ($type == 'O' && preg_match('/comment\.value/',$name)) - { - $value = $code; - } - else if (($type == 'L' || $type == '!') && preg_match('/_other\.value/',$name)) - { - $value = $code; - } - else - { - $scale_id = $this->_GetVarAttribute($name,'scale_id','0',$gseq,$qseq); - $which_ans = $scale_id . '~' . $code; - $ansArray = $var['ansArray']; - if (is_null($ansArray)) - { - $value = $default; - } - else - { - if (isset($ansArray[$which_ans])) { - $answerInfo = explode('|',$ansArray[$which_ans]); - $answer = $answerInfo[0]; - } - else { - $answer = $default; - } - $value = $answer; - } - } - break; - default: - $value = $code; - break; - } - return $value; - } - break; - case 'jsName': - if ($this->surveyMode=='survey' - || ($this->surveyMode=='group' && $gseq != -1 && isset($var['gseq']) && $gseq == $var['gseq']) - || ($this->surveyMode=='question' && $qseq != -1 && isset($var['qseq']) && $qseq == $var['qseq'])) - { - return (isset($var['jsName_on']) ? $var['jsName_on'] : (isset($var['jsName'])) ? $var['jsName'] : $default); - } - else { - return (isset($var['jsName']) ? $var['jsName'] : $default); - } - break; - case 'sgqa': - case 'mandatory': - case 'qid': - case 'gid': - case 'grelevance': - case 'question': - case 'readWrite': - case 'relevance': - case 'rowdivid': - case 'type': - case 'qcode': - case 'gseq': - case 'qseq': - case 'ansList': - case 'scale_id': - return (isset($var[$attr])) ? $var[$attr] : $default; - case 'shown': - if (isset($var['shown'])) - { - return $var['shown']; // for static values like TOKEN - } - else - { - $type = $var['type']; - $code = $this->_GetVarAttribute($name,'code',$default,$gseq,$qseq); - switch($type) - { - case '!': //List - dropdown - case 'L': //LIST drop-down/radio-button list - case 'O': //LIST WITH COMMENT drop-down/radio-button list + textarea - case '1': //Array (Flexible Labels) dual scale // need scale - case 'H': //ARRAY (Flexible) - Column Format - case 'F': //ARRAY (Flexible) - Row Format - case 'R': //RANKING STYLE - if ($type == 'O' && preg_match('/comment$/',$name)) - { - $shown = $code; - } - else if (($type == 'L' || $type == '!') && preg_match('/_other$/',$name)) - { - $shown = $code; - } - else - { - $scale_id = $this->_GetVarAttribute($name,'scale_id','0',$gseq,$qseq); - $which_ans = $scale_id . '~' . $code; - $ansArray = $var['ansArray']; - if (is_null($ansArray)) - { - $shown=$code; - } - else - { - if (isset($ansArray[$which_ans])) { - $answerInfo = explode('|',$ansArray[$which_ans]); - array_shift($answerInfo); - $answer = join('|',$answerInfo); - } - else { - $answer = $code; - } - $shown = $answer; - } - } - break; - case 'A': //ARRAY (5 POINT CHOICE) radio-buttons - case 'B': //ARRAY (10 POINT CHOICE) radio-buttons - case ':': //ARRAY (Multi Flexi) 1 to 10 - case '5': //5 POINT CHOICE radio-buttons - $shown = $code; - break; - case 'N': //NUMERICAL QUESTION TYPE - case 'K': //MULTIPLE NUMERICAL QUESTION - case 'Q': //MULTIPLE SHORT TEXT - case ';': //ARRAY (Multi Flexi) Text - case 'S': //SHORT FREE TEXT - case 'T': //LONG FREE TEXT - case 'U': //HUGE FREE TEXT - case 'D': //DATE - case '*': //Equation - case 'I': //Language Question - case '|': //File Upload - case 'X': //BOILERPLATE QUESTION - $shown = $code; - break; - case 'M': //Multiple choice checkbox - case 'P': //Multiple choice with comments checkbox + text - if ($code == 'Y' && isset($var['question']) && !preg_match('/comment$/',$sgqa)) - { - $shown = $var['question']; - } - elseif (preg_match('/comment$/',$sgqa) && isset($_SESSION[$sgqa])) { - $shown = $_SESSION[$sgqa]; - } - else - { - $shown = $default; - } - break; - case 'G': //GENDER drop-down list - case 'Y': //YES/NO radio-buttons - case 'C': //ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': //ARRAY (Increase/Same/Decrease) radio-buttons - $ansArray = $var['ansArray']; - if (is_null($ansArray)) - { - $shown=$default; - } - else - { - if (isset($ansArray[$code])) { - $answer = $ansArray[$code]; - } - else { - $answer = $default; - } - $shown = $answer; - } - break; - } - return $shown; - } - case 'relevanceStatus': - $gseq = (isset($var['gseq'])) ? $var['gseq'] : -1; - $qid = (isset($var['qid'])) ? $var['qid'] : -1; - $rowdivid = (isset($var['rowdivid']) && $var['rowdivid']!='') ? $var['rowdivid'] : -1; - if ($qid == -1 || $gseq == -1) { - return 1; - } - if (isset($args[1]) && $args[1]=='NAOK') { - return 1; - } - $grel = (isset($_SESSION['relevanceStatus']['G'.$gseq]) ? $_SESSION['relevanceStatus']['G'.$gseq] : 1); // true by default - $qrel = (isset($_SESSION['relevanceStatus'][$qid]) ? $_SESSION['relevanceStatus'][$qid] : 0); - $sqrel = (isset($_SESSION['relevanceStatus'][$rowdivid]) ? $_SESSION['relevanceStatus'][$rowdivid] : 1); // true by default - only want false if a subquestion is irrelevant - return ($grel && $qrel && $sqrel); - default: - print 'UNDEFINED ATTRIBUTE: ' . $attr . "
        \n"; - return $default; - } - return $default; // and throw and error? - } - - public static function SetVariableValue($op,$name,$value) - { - $LEM =& LimeExpressionManager::singleton(); - - if (isset($LEM->tempVars[$name])) - { - switch($op) - { - case '=': - $LEM->tempVars[$name]['code'] = $value; - break; - case '*=': - $LEM->tempVars[$name]['code'] *= $value; - break; - case '/=': - $LEM->tempVars[$name]['code'] /= $value; - break; - case '+=': - $LEM->tempVars[$name]['code'] += $value; - break; - case '-=': - $LEM->tempVars[$name]['code'] -= $value; - break; - } - $_result = $LEM->tempVars[$name]['code']; - $_SESSION[$name] = $_result; - $LEM->updatedValues[$name] = array( - 'type'=>'*', - 'value'=>$_result, - ); - return $_result; - } - else - { - if (!isset($LEM->knownVars[$name])) - { - if (isset($LEM->qcode2sgqa[$name])) - { - $name = $LEM->qcode2sgqa[$name]; - } - else - { - return ''; // shouldn't happen - } - } - - if (isset($_SESSION[$name])) - { - $_result = $_SESSION[$name]; - } - else - { - $_result = (isset($LEM->knownVars[$name]['default']) ? $LEM->knownVars[$name]['default'] : 0); - } - - switch($op) - { - case '=': - $_result = $value; - break; - case '*=': - $_result *= $value; - break; - case '/=': - $_result /= $value; - break; - case '+=': - $_result += $value; - break; - case '-=': - $_result -= $value; - break; - } - $_SESSION[$name] = $_result; - $_type = $LEM->knownVars[$name]['type']; - $LEM->updatedValues[$name] = array( - 'type'=>$_type, - 'value'=>$_result, - ); - return $_result; - } - } - - /** - * Create HTML view of the survey, showing everything that uses EM - * @param $sid - * @param $gid - * @param $qid - */ - static public function ShowSurveyLogicFile($sid, $gid=NULL, $qid=NULL,$LEMdebugLevel=0,$assessments=false) - { - // Title - // Welcome - // G1, name, relevance, text - // *Q1, name [type], relevance [validation], text, help, default, help_msg - // SQ1, name [scale], relevance [validation], text - // A1, code, assessment_value, text - // End Message - global $rooturl; - - $LEM =& LimeExpressionManager::singleton(); - - $allErrors = array(); - $warnings=0; - - $surveyOptions = array( - 'assessments'=>$assessments, - 'hyperlinkSyntaxHighlighting'=>true, - 'rooturl'=>$rooturl, - ); - - $varNamesUsed = array(); // keeps track of whether variables have been declared - - if (!is_null($qid)) - { - $surveyMode='question'; - LimeExpressionManager::StartSurvey($sid, 'question', $surveyOptions, false,$LEMdebugLevel); - $qseq = LimeExpressionManager::GetQuestionSeq($qid); - $moveResult = LimeExpressionManager::JumpTo($qseq+1,true,false,true); - } - else if (!is_null($gid)) - { - $surveyMode='group'; - LimeExpressionManager::StartSurvey($sid, 'group', $surveyOptions, false,$LEMdebugLevel); - $gseq = LimeExpressionManager::GetGroupSeq($gid); - $moveResult = LimeExpressionManager::JumpTo($gseq+1,true,false,true); - } - else - { - $surveyMode='survey'; - LimeExpressionManager::StartSurvey($sid, 'survey', $surveyOptions, false,$LEMdebugLevel); - $moveResult = LimeExpressionManager::NavigateForwards(); - } - - $qtypes=getqtypelist('','array'); - - if (is_null($moveResult) || is_null($LEM->currentQset) || count($LEM->currentQset) == 0) { - return array( - 'errors'=>1, - 'html'=>$LEM->gT('Invalid question - probably missing sub-questions or language-specific settings for language ') . $_SESSION['LEMlang'], - ); - } - - $surveyname = templatereplace('{SURVEYNAME}'); - - $out = '

        ' . $LEM->gT('Logic File for Survey # ') . '[' . $LEM->sid . "]: $surveyname

        \n"; - $out .= ""; - - if (is_null($gid) && is_null($qid)) - { - $description = templatereplace('{SURVEYDESCRIPTION}'); - $errClass = ($LEM->em->HasErrors() ? 'LEMerror' : ''); - if ($description != '') - { - $out .= ""; - } - - $welcome = templatereplace('{WELCOME}'); - $errClass = ($LEM->em->HasErrors() ? 'LEMerror' : ''); - if ($welcome != '') - { - $out .= ""; - } - - $endmsg = templatereplace('{ENDTEXT}'); - $errClass = ($LEM->em->HasErrors() ? 'LEMerror' : ''); - if ($endmsg != '') - { - $out .= ""; - } - - $_linkreplace = templatereplace('{URL}'); - $errClass = ($LEM->em->HasErrors() ? 'LEMerror' : ''); - if ($_linkreplace != '') - { - $out .= ""; - } - } - - $out .= "\n"; - - $_gseq=-1; - foreach ($LEM->currentQset as $q) { - $gseq = $q['info']['gseq']; - $gid = $q['info']['gid']; - $qid = $q['info']['qid']; - $qseq = $q['info']['qseq']; - - $errorCount=0; - - ////// - // SHOW GROUP-LEVEL INFO - ////// - if ($gseq != $_gseq) { - $LEM->ParseResultCache=array(); // reset for each group so get proper color coding? - $_gseq = $gseq; - $ginfo = $LEM->gseq2info[$gseq]; - - $grelevance = '{' . (($ginfo['grelevance']=='') ? 1 : $ginfo['grelevance']) . '}'; - $gtext = ((trim($ginfo['description']) == '') ? ' ' : $ginfo['description']); - - $groupRow = "" - . "" - . "" - . "" - . "" - . "\n"; - - $LEM->ProcessString($groupRow, $qid,NULL,false,1,1,false,false); - $out .= $LEM->GetLastPrettyPrintExpression(); - if ($LEM->em->HasErrors()) { - ++$errorCount; - } - } - - ////// - // SHOW QUESTION-LEVEL INFO - ////// - $mandatory = (($q['info']['mandatory']=='Y') ? "*" : ''); - $type = $q['info']['type']; - $typedesc = $qtypes[$type]['description']; - - $sgqas = explode('|',$q['sgqa']); - if (count($sgqas) == 1 && !is_null($q['info']['default'])) - { - $LEM->ProcessString($q['info']['default'], $qid,NULL,false,1,1,false,false); - $_default = $LEM->GetLastPrettyPrintExpression(); - if ($LEM->em->HasErrors()) { - ++$errorCount; - } - $default = '
        (' . $LEM->gT('DEFAULT:') . ' ' . $_default . ')'; - } - else - { - $default = ''; - } - - $qtext = (($q['info']['qtext'] != '') ? $q['info']['qtext'] : ' '); - $help = (($q['info']['help'] != '') ? '
        [' . $LEM->gT("HELP:") . ' ' . $q['info']['help'] . ']': ''); - $prettyValidTip = (($q['prettyValidTip'] == '') ? '' : '
        (' . $LEM->gT("TIP:") . ' ' . $q['prettyValidTip'] . ')'); - - ////// - // SHOW QUESTION ATTRIBUTES THAT ARE PROCESSED BY EM - ////// - $attrTable = ''; - - $attrs = (isset($LEM->qattr[$qid]) ? $LEM->qattr[$qid] : array()); - if (isset($LEM->q2subqInfo[$qid]['preg'])) - { - $attrs['regex_validation'] = $LEM->q2subqInfo[$qid]['preg']; - } - if (isset($LEM->questionSeq2relevance[$qseq]['other'])) - { - $attrs['other'] = $LEM->questionSeq2relevance[$qseq]['other']; - } - if (count($attrs) > 0) { - $attrTable = "
        " . $LEM->gT("Description:") . "" . $description . "
        " . $LEM->gT("Welcome:") . "" . $welcome . "
        " . $LEM->gT("End message:") . "" . $endmsg . "
        " . $LEM->gT("End URL") . ":" . $_linkreplace . "
        #".$LEM->gT('Name [ID]')."".$LEM->gT('Relevance [Validation] (Default)')."".$LEM->gT('Text [Help] (Tip)')."
        G-$gseq".$ginfo['group_name']."
        [GID ".$gid."]
        ".$grelevance."".$gtext."
        \n"; - $count=0; - foreach ($attrs as $key=>$value) { - if (is_null($value) || trim($value) == '') { - continue; - } - switch ($key) - { - default: - case 'exclude_all_others': - case 'exclude_all_others_auto': - case 'hidden': - if ($value == false || $value == '0') { - $value = NULL; // so can skip this one - just using continue here doesn't work. - } - break; - case 'relevance': - $value = NULL; // means an outdate database structure - break; - case 'array_filter': - case 'array_filter_exclude': - case 'code_filter': - case 'em_validation_q_tip': - case 'em_validation_sq_tip': - break; - case 'equals_num_value': - case 'em_validation_q': - case 'em_validation_sq': - case 'max_answers': - case 'max_num_value': - case 'max_num_value_n': - case 'min_answers': - case 'min_num_value': - case 'min_num_value_n': - case 'min_num_of_files': - case 'max_num_of_files': - case 'multiflexible_max': - case 'multiflexible_min': - $value = '{' . $value . '}'; - break; - case 'other_replace_text': - case 'show_totals': - case 'regex_validation': - break; - case 'other': - if ($value == 'N') { - $value = NULL; // so can skip this one - } - break; - } - if (is_null($value)) { - continue; // since continuing from within a switch statement doesn't work - } - ++$count; - $attrTable .= "\n"; - } - $attrTable .= "
        " . $LEM->gT("Question Attribute") . "" . $LEM->gT("Value"). "
        $key$value
        \n"; - if ($count == 0) { - $attrTable = ''; - } - } - - $LEM->ProcessString($qtext . $help . $prettyValidTip . $attrTable, $qid,NULL,false,1,1,false,false); - $qdetails = $LEM->GetLastPrettyPrintExpression(); - if ($LEM->em->HasErrors()) { - ++$errorCount; - } - - ////// - // SHOW RELEVANCE - ////// - // Must parse Relevance this way, otherwise if try to first split expressions, regex equations won't work - $relevanceEqn = (($q['info']['relevance'] == '') ? 1 : $q['info']['relevance']); - if (!isset($LEM->ParseResultCache[$relevanceEqn])) - { - $result = $LEM->em->ProcessBooleanExpression($relevanceEqn, $gseq, $qseq); - $prettyPrint = $LEM->em->GetPrettyPrintString(); - $hasErrors = $LEM->em->HasErrors(); - $LEM->ParseResultCache[$relevanceEqn] = array( - 'result' => $result, - 'prettyPrint' => $prettyPrint, - 'hasErrors' => $hasErrors, - ); - } - $relevance = $LEM->ParseResultCache[$relevanceEqn]['prettyPrint']; - if ($LEM->ParseResultCache[$relevanceEqn]['hasErrors']) { - ++$errorCount; - } - - ////// - // SHOW VALIDATION EQUATION - ////// - // Must parse Validation this way so that regex (preg) works - $prettyValidEqn = ''; - if ($q['prettyValidEqn'] != '') { - $validationEqn = $q['validEqn']; - if (!isset($LEM->ParseResultCache[$validationEqn])) - { - $result = $LEM->em->ProcessBooleanExpression($validationEqn, $gseq, $qseq); - $prettyPrint = $LEM->em->GetPrettyPrintString(); - $hasErrors = $LEM->em->HasErrors(); - $LEM->ParseResultCache[$validationEqn] = array( - 'result' => $result, - 'prettyPrint' => $prettyPrint, - 'hasErrors' => $hasErrors, - ); - } - $prettyValidEqn = '
        (' . $LEM->gT("VALIDATION:") . ' ' . $LEM->ParseResultCache[$validationEqn]['prettyPrint'] . ')'; - if ($LEM->ParseResultCache[$validationEqn]['hasErrors']) { - ++$errorCount; - } - } - - ////// - // TEST VALIDITY OF ROOT VARIABLE NAME AND WHETHER HAS BEEN USED - ////// - $rootVarName = $q['info']['rootVarName']; - $varNameErrorMsg = ''; - $varNameError = NULL; - if (isset($varNamesUsed[$rootVarName])) - { - $varNameErrorMsg .= $LEM->gT('This variable name has already been used.'); - } - else - { - $varNamesUsed[$rootVarName] = array( - 'gseq'=>$gseq, - 'qid'=>$qid - ); - } - - if (!preg_match('/^[_a-zA-Z][_0-9a-zA-Z]*$/', $rootVarName)) - { - $varNameErrorMsg .= $LEM->gT('Starting in 1.92, variable names should only contain letters, numbers, and underscores; and may not start with a number. This variable name is deprecated.'); - } - if ($varNameErrorMsg != '') - { - $varNameError = array ( - 'message' => $varNameErrorMsg, - 'gseq' => $varNamesUsed[$rootVarName]['gseq'], - 'qid' => $varNamesUsed[$rootVarName]['qid'], - 'gid' => $gid, - ); - if (!$LEM->sgqaNaming) - { - ++$errorCount; - } - else - { - ++$warnings; - } - } - - ////// - // SHOW ALL SUB-QUESTIONS - ////// - $sqRows=''; - $i=0; - $sawThis = array(); // array of rowdivids already seen so only show them once - foreach ($sgqas as $sgqa) - { - if ($LEM->knownVars[$sgqa]['qcode'] == $rootVarName) { - continue; // so don't show the main question as a sub-question too - } - $rowdivid=$sgqa; - $varName=$LEM->knownVars[$sgqa]['qcode']; - switch ($q['info']['type']) - { - case '1': - if (preg_match('/#1$/',$sgqa)) { - $rowdivid = NULL; // so that doesn't show same message for second scale - } - else { - $rowdivid = substr($sgqa,0,-2); // strip suffix - $varName = substr($LEM->knownVars[$sgqa]['qcode'],0,-2); - } - break; - case 'P': - if (preg_match('/comment$/',$sgqa)) { - $rowdivid = NULL; - } - break; - case ':': - case ';': - $_rowdivid = $LEM->knownVars[$sgqa]['rowdivid']; - if (isset($sawThis[$qid . '~' . $_rowdivid])) { - $rowdivid = NULL; // so don't show again - } - else { - $sawThis[$qid . '~' . $_rowdivid] = true; - $rowdivid = $_rowdivid; - $sgqa_len = strlen($sid . 'X'. $gid . 'X' . $qid); - $varName = $rootVarName . '_' . substr($_rowdivid,$sgqa_len); - } - break; - } - if (is_null($rowdivid)) { - continue; - } - ++$i; - $subQeqn = ' '; - if (isset($LEM->subQrelInfo[$qid][$rowdivid])) - { - $sq = $LEM->subQrelInfo[$qid][$rowdivid]; - $subQeqn = $sq['prettyPrintEqn']; // {' . $sq['eqn'] . '}'; // $sq['prettyPrintEqn']; - if ($sq['hasErrors']) { - ++$errorCount; - } - } - - $sgqaInfo = $LEM->knownVars[$sgqa]; - $subqText = $sgqaInfo['subqtext']; - - if (isset($sgqaInfo['default']) && $sgqaInfo['default'] !== '') - { - $LEM->ProcessString($sgqaInfo['default'], $qid,NULL,false,1,1,false,false); - $_default = $LEM->GetLastPrettyPrintExpression(); - if ($LEM->em->HasErrors()) { - ++$errorCount; - } - $subQeqn .= '
        (' . $LEM->gT('DEFAULT:') . ' ' . $_default . ')'; - } - - $sqRows .= "" - . "SQ-$i" - . "" . $varName . "" - . "$subQeqn" - . "" .$subqText . "" - . ""; - } - $LEM->ProcessString($sqRows, $qid,NULL,false,1,1,false,false); - $sqRows = $LEM->GetLastPrettyPrintExpression(); - if ($LEM->em->HasErrors()) { - ++$errorCount; - } - - ////// - // SHOW ANSWER OPTIONS FOR ENUMERATED LISTS, AND FOR MULTIFLEXI - ////// - $answerRows=''; - if (isset($LEM->qans[$qid]) || isset($LEM->multiflexiAnswers[$qid])) - { - $_scale=-1; - if (isset($LEM->multiflexiAnswers[$qid])) { - $ansList = $LEM->multiflexiAnswers[$qid]; - } - else { - $ansList = $LEM->qans[$qid]; - } - foreach ($ansList as $ans=>$value) - { - $ansInfo = explode('~',$ans); - $valParts = explode('|',$value); - $valInfo[0] = array_shift($valParts); - $valInfo[1] = implode('|',$valParts); - if ($_scale != $ansInfo[0]) { - $i=1; - $_scale = $ansInfo[0]; - } - - $subQeqn = ''; - $rowdivid = $sgqas[0] . $ansInfo[1]; - if ($q['info']['type'] == 'R') - { - $rowdivid = $LEM->sid . 'X' . $gid . 'X' . $qid . $ansInfo[1]; - } - if (isset($LEM->subQrelInfo[$qid][$rowdivid])) - { - $sq = $LEM->subQrelInfo[$qid][$rowdivid]; - $subQeqn = ' ' . $sq['prettyPrintEqn']; - if ($sq['hasErrors']) { - ++$errorCount; - } - } - - $answerRows .= "" - . "A[" . $ansInfo[0] . "]-" . $i++ . "" - . "" . $ansInfo[1]. "" - . "[VALUE: " . $valInfo[0] . "]".$subQeqn."" - . "" . $valInfo[1] . "" - . "\n"; - } - $LEM->ProcessString($answerRows, $qid,NULL,false,1,1,false,false); - $answerRows = $LEM->GetLastPrettyPrintExpression(); - if ($LEM->em->HasErrors()) { - ++$errorCount; - } - } - - ////// - // FINALLY, SHOW THE QUESTION ROW(S), COLOR-CODING QUESTIONS THAT CONTAIN ERRORS - ////// - $errclass = ($errorCount > 0) ? "class='LEMerror' title='" . sprintf($LEM->gT("This question has at least %s error(s)"), $errorCount) . "'" : ''; - - $questionRow = "" - . "Q-" . $q['info']['qseq'] . "" - . "" . $mandatory; - - if ($varNameErrorMsg == '') - { - $questionRow .= $rootVarName; - } - else - { - $editlink = $LEM->surveyOptions['rooturl'] . '/admin/admin.php?sid=' . $LEM->sid . '&gid=' . $varNameError['gid'] . '&qid=' . $varNameError['qid']; - $questionRow .= "" - . $rootVarName . ""; - } - - $questionRow .= "
        [QID $qid]
        $typedesc [$type]" - . "" . $relevance . $prettyValidEqn . $default . "" - . "" . $qdetails . "" - . "\n"; - - $out .= $questionRow; - $out .= $sqRows; - $out .= $answerRows; - - if ($errorCount > 0) { - $allErrors[$gid . '~' . $qid] = $errorCount; - } - } - $out .= ""; - - LimeExpressionManager::FinishProcessingPage(); - if (($LEMdebugLevel & LEM_DEBUG_TIMING) == LEM_DEBUG_TIMING) { - $out .= LimeExpressionManager::GetDebugTimingMessage(); - } - - if (count($allErrors) > 0) { - $out = "

        ". sprintf($LEM->gT("%s question(s) contain errors that need to be corrected"), count($allErrors)) . "

        \n" . $out; - } - else { - switch ($surveyMode) - { - case 'survey': - $message = $LEM->gT('No syntax errors detected in this survey'); - break; - case 'group': - $message = $LEM->gT('This group, by itself, does not contain any syntax errors'); - break; - case 'question': - $message = $LEM->gT('This question, by itself, does not contain any syntax errors'); - break; - } - $out = "

        $message

        \n" . $out; - } - - return array( - 'errors'=>$allErrors, - 'html'=>$out - ); - } - } - - /** - * Used by usort() to order $this->questionSeq2relevance in proper order - * @param $a - * @param $b - * @return - */ - function cmpQuestionSeq($a, $b) - { - if (is_null($a['qseq'])) { - if (is_null($b['qseq'])) { - return 0; - } - return 1; - } - if (is_null($b['qseq'])) { - return -1; - } - if ($a['qseq'] == $b['qseq']) { - return 0; - } - return ($a['qseq'] < $b['qseq']) ? -1 : 1; - } -?> diff --git a/include/limesurvey/classes/expressions/test/conditions2relevance.php b/include/limesurvey/classes/expressions/test/conditions2relevance.php deleted file mode 100644 index bb4208bc..00000000 --- a/include/limesurvey/classes/expressions/test/conditions2relevance.php +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - LimeExpressionManager: Preview Conditions to Relevance - - - "; - echo "
        ";
        -            print_r($data);
        -            echo "
        "; - ?> - - diff --git a/include/limesurvey/classes/expressions/test/functions.php b/include/limesurvey/classes/expressions/test/functions.php deleted file mode 100644 index afd60794..00000000 --- a/include/limesurvey/classes/expressions/test/functions.php +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - ExpressionManager: Available Functions - - - - - diff --git a/include/limesurvey/classes/expressions/test/navigation_test.php b/include/limesurvey/classes/expressions/test/navigation_test.php deleted file mode 100644 index 852a8e43..00000000 --- a/include/limesurvey/classes/expressions/test/navigation_test.php +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - LEM Navigation Test - - - GetRows() as $row) { - $surveyList .= "\n"; - } - - $form = <<< EOD -
        -

        Enter the following variables to test navigation for a survey using different styles

        - - - - - - - - - - -
        ParameterValue
        Survey ID (SID)
        Navigation Style
        Debug Log Level -Specify which debugging features to use -
          -
        • Detailed Timing
        • -
        • Validation Summary
        • -
        • Validation Detail (Validation Summary must also be checked to see detail)
        • -
        • Pretty Print Syntax
        • -
        • Delete Non-Values
        • -
        -
        -EOD; - echo $form; - } - else { - include_once('../LimeExpressionManager.php'); - require_once('../../../classes/core/startup.php'); - require_once('../../../config-defaults.php'); - require_once('../../../common.php'); - require_once('../../../classes/core/language.php'); - - $clang = new limesurvey_lang("en"); - - $surveyInfo = explode('|',$_POST['sid']); - $surveyid = $surveyInfo[0]; - $assessments = ($surveyInfo[1] == 'Y'); - $surveyMode = $_POST['surveyMode']; - $LEMdebugLevel = ( - ((isset($_POST['LEM_DEBUG_TIMING']) && $_POST['LEM_DEBUG_TIMING'] == 'Y') ? LEM_DEBUG_TIMING : 0) + - ((isset($_POST['LEM_DEBUG_VALIDATION_SUMMARY']) && $_POST['LEM_DEBUG_VALIDATION_SUMMARY'] == 'Y') ? LEM_DEBUG_VALIDATION_SUMMARY : 0) + - ((isset($_POST['LEM_DEBUG_VALIDATION_DETAIL']) && $_POST['LEM_DEBUG_VALIDATION_DETAIL'] == 'Y') ? LEM_DEBUG_VALIDATION_DETAIL : 0) + - ((isset($_POST['LEM_PRETTY_PRINT_ALL_SYNTAX']) && $_POST['LEM_PRETTY_PRINT_ALL_SYNTAX'] == 'Y') ? LEM_PRETTY_PRINT_ALL_SYNTAX : 0) - ); - $deletenonvalues = ((isset($_POST['deletenonvalues']) && $_POST['deletenonvalues']=='Y') ? 1 : 0); - - $surveyOptions = array( - 'active'=>false, - 'allowsave'=>true, - 'anonymized'=>false, - 'assessments'=>$assessments, - 'datestamp'=>true, - 'deletenonvalues'=>$deletenonvalues, - 'hyperlinkSyntaxHighlighting'=>true, - 'ipaddr'=>true, - 'rooturl'=>'../../..', - ); - - print '

        Starting survey ' . $surveyid . " using Survey Mode '". $surveyMode . (($assessments) ? "' [Uses Assessments]" : "'") . "

        "; - $now = microtime(true); - LimeExpressionManager::StartSurvey($surveyid, $surveyMode, $surveyOptions, true,$LEMdebugLevel); - print '[StartSurvey() took ' . (microtime(true) - $now) . ' seconds]
        '; - - while(true) { - $now = microtime(true); - $result = LimeExpressionManager::NavigateForwards(true); - print $result['message'] . "
        "; - LimeExpressionManager::FinishProcessingPage(); - // print LimeExpressionManager::GetRelevanceAndTailoringJavaScript(); - if (($LEMdebugLevel & LEM_DEBUG_TIMING) == LEM_DEBUG_TIMING) { - print LimeExpressionManager::GetDebugTimingMessage(); - } - print '[NavigateForwards() took ' . (microtime(true) - $now) . ' seconds]
        '; - if (is_null($result) || $result['finished'] == true) { - break; - } - } - print "

        Finished survey " . $surveyid . "

        "; - } - ?> - - diff --git a/include/limesurvey/classes/expressions/test/relevance.php b/include/limesurvey/classes/expressions/test/relevance.php deleted file mode 100644 index f98af705..00000000 --- a/include/limesurvey/classes/expressions/test/relevance.php +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - ExpressionManager: Unit Test Relevance - - - - - - - - diff --git a/include/limesurvey/classes/expressions/test/strings_with_expressions.php b/include/limesurvey/classes/expressions/test/strings_with_expressions.php deleted file mode 100644 index 0cbf47c1..00000000 --- a/include/limesurvey/classes/expressions/test/strings_with_expressions.php +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - ExpressionManager: Test Evaluation of Strings Containing Expressions - - - - - diff --git a/include/limesurvey/classes/expressions/test/stringsplit.php b/include/limesurvey/classes/expressions/test/stringsplit.php deleted file mode 100644 index b0de0871..00000000 --- a/include/limesurvey/classes/expressions/test/stringsplit.php +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - ExpressionManager: Unit Test String Splitter - - - - - diff --git a/include/limesurvey/classes/expressions/test/survey_logic_file.php b/include/limesurvey/classes/expressions/test/survey_logic_file.php deleted file mode 100644 index 43130eba..00000000 --- a/include/limesurvey/classes/expressions/test/survey_logic_file.php +++ /dev/null @@ -1,146 +0,0 @@ - - - - 0) { - foreach ($_GET as $key=>$val) { - if ($key == 'sid') { - $val = $val . '|N'; // hack to pretend this is not an assessment - } - $_POST[$key] = $val; - } - } - if ((isset($subaction) && $subaction == 'survey_logic_file') || $_POST['LEMcalledFromAdmin']=='Y') { - $rootpath = $rootdir; - } - else { - $rootpath = '../../..'; - } - include_once($rootpath . '/classes/expressions/LimeExpressionManager.php'); - require_once($rootpath . '/classes/core/startup.php'); - require_once($rootpath . '/config-defaults.php'); - require_once($rootpath . '/common.php'); - require_once($rootpath . '/classes/core/language.php'); - - $clang = new limesurvey_lang("en"); - - if ((isset($subaction) && $subaction == 'survey_logic_file')) // || count($_POST) == 0) { - { - $query = "select a.surveyls_survey_id as sid, a.surveyls_title as title, b.datecreated, b.assessments " - . "from " . db_table_name('surveys_languagesettings') . " as a join ". db_table_name('surveys') . " as b on a.surveyls_survey_id = b.sid" - . " where a.surveyls_language='en' order by a.surveyls_title, b.datecreated"; - $data = db_execute_assoc($query); - $surveyList=''; - foreach($data->GetRows() as $row) { - $surveyList .= "\n"; - } - - $form = <<< EOD - - -Survey Logic File - - -
        -

        Generate a logic file for the survey

        - - - - - - - - - - -
        ParameterValue
        Survey ID (SID)
        Navigation Style
        Debug Log Level -Specify which debugging features to use -
          -
        • Detailed Timing
        • -
        • Validation Summary
        • -
        • Validation Detail (Validation Summary must also be checked to see detail)
        • -
        • Pretty Print Syntax
        • -
        -
        - -EOD; - echo $form; - } - else { - $surveyInfo = explode('|',$_POST['sid']); - $surveyid = $surveyInfo[0]; - if (isset($_POST['assessments'])) - { - $assessments = ($_POST['assessments'] == 'Y'); - } - else - { - $assessments = ($surveyInfo[1] == 'Y'); - } - $surveyMode = $_POST['surveyMode']; - $LEMdebugLevel = ( - ((isset($_POST['LEM_DEBUG_TIMING']) && $_POST['LEM_DEBUG_TIMING'] == 'Y') ? LEM_DEBUG_TIMING : 0) + - ((isset($_POST['LEM_DEBUG_VALIDATION_SUMMARY']) && $_POST['LEM_DEBUG_VALIDATION_SUMMARY'] == 'Y') ? LEM_DEBUG_VALIDATION_SUMMARY : 0) + - ((isset($_POST['LEM_DEBUG_VALIDATION_DETAIL']) && $_POST['LEM_DEBUG_VALIDATION_DETAIL'] == 'Y') ? LEM_DEBUG_VALIDATION_DETAIL : 0) + - ((isset($_POST['LEM_PRETTY_PRINT_ALL_SYNTAX']) && $_POST['LEM_PRETTY_PRINT_ALL_SYNTAX'] == 'Y') ? LEM_PRETTY_PRINT_ALL_SYNTAX : 0) - ); - - $language = (isset($_POST['lang']) ? sanitize_languagecode($_POST['lang']) : NULL); - $gid = (isset($_POST['gid']) ? sanitize_int($_POST['gid']) : NULL); - $qid = (isset($_POST['qid']) ? sanitize_int($_POST['qid']) : NULL); - - print <<< EOD - - - Logic File - Survey #$surveyid - - - -EOD; - - - SetSurveyLanguage($surveyid, $language); - - $result = LimeExpressionManager::ShowSurveyLogicFile($surveyid, $gid, $qid,$LEMdebugLevel,$assessments); - print $result['html']; - - print <<< EOD - -EOD; - } - ?> - \ No newline at end of file diff --git a/include/limesurvey/classes/expressions/test/test.php b/include/limesurvey/classes/expressions/test/test.php deleted file mode 100644 index b4427976..00000000 --- a/include/limesurvey/classes/expressions/test/test.php +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Test Suite for Expression Manager - - -

        Test Suite for Expression Manager

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        TestDescription
        Available FunctionsShow the list of functions available within Expression Manager.
        String SplitterUnit test of String Splitter to ensure splits source into Strings vs. Expressions. Expressions are surrounded by un-escaped curly braces
        TokenizerDemonstrates that Expression Manager properly detects and categorizes tokens (e.g. variables, string, functions, operators)
        Unit Tests of Isolated ExpressionsUnit tests of each of Expression Manager's features (e.g. all operators and functions). Color coding shows whether any tests fail. Syntax highlighting shows cases where Expression Manager properly detects bad syntax.
        Unit Tests of Expressions Within StringsTest how Expression Manager can process strings containing one or more variable, token, or expression replacements surrounded by curly braces.
        Unit Test Dynamic Relevance ProcessingQuestions and substitutions should dynamically change based upon values entered.
        Preview Conversion of Conditions to RelevanceShows Relevance equations for all conditions in the database, grouped by question id (and not pretty-printed)
        Bulk Convert Conditions to RelevanceConvert conditions to relevance for entire database
        Test NavigationTests whether navigation properly handles relevant and irrelevant groups
        Show Survey Logic FileShows the logic for the survey (e.g. relevance, validation), and all tailoring
        - - diff --git a/include/limesurvey/classes/expressions/test/tokenizer.php b/include/limesurvey/classes/expressions/test/tokenizer.php deleted file mode 100644 index cbe7172e..00000000 --- a/include/limesurvey/classes/expressions/test/tokenizer.php +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - ExpressionManager: Unit Test Tokenizer - - - - - diff --git a/include/limesurvey/classes/expressions/test/unit.php b/include/limesurvey/classes/expressions/test/unit.php deleted file mode 100644 index f7bfa578..00000000 --- a/include/limesurvey/classes/expressions/test/unit.php +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - ExpressionManager: Unit Test Core Evaluator - - - - - - diff --git a/include/limesurvey/classes/expressions/test/upgrade_conditions2relevance.php b/include/limesurvey/classes/expressions/test/upgrade_conditions2relevance.php deleted file mode 100644 index 4fff3f24..00000000 --- a/include/limesurvey/classes/expressions/test/upgrade_conditions2relevance.php +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - LimeExpressionManager: Upgrade Conditions to Relevance - - - "; - echo "
        ";
        -                print_r($data);
        -                echo "
        "; - } - ?> - - diff --git a/include/limesurvey/classes/inputfilter/class.inputfilter_clean.php b/include/limesurvey/classes/inputfilter/class.inputfilter_clean.php deleted file mode 100644 index d981cabf..00000000 --- a/include/limesurvey/classes/inputfilter/class.inputfilter_clean.php +++ /dev/null @@ -1,166 +0,0 @@ - - * @license GNU General Public License (GPL) - * @link http://www.phpclasses.org/package/2189 - */ -class InputFilter -{ - function process( $value ) - { - // No need to filter really simple values - if( ctype_alnum( $value ) ) - return $value; - else - return $this->RemoveXSS( $value ); - } - - /* RemoveXSS initially developped by kallahar - quickwired.com, - * modified for TikiWiki Original code can be found here: - * http://quickwired.com/smallprojects/php_xss_filter_function.php - * Straightly borrowed from TikiWiki by the LimeSurvey project - */ - function RemoveXSS($val) { - static $ra_as_tag_only = NULL; - static $ra_as_attribute = NULL; - static $ra_as_content = NULL; - static $ra_javascript = NULL; - - // now the only remaining whitespace attacks are \t, \n, and \r - if ( $ra_as_tag_only == NULL ) { - $ra_as_tag_only = array('style', 'script', 'embed', 'object', 'applet', 'meta', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'base', 'xml', 'import', 'link'); - $ra_as_attribute = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload','ondragdrop', 'dynsrc', 'lowsrc', 'codebase', 'xmlns'); - $ra_as_content = array('vbscript', 'expression', 'blink', 'mocha', 'livescript', 'url', 'alert'); - $ra_javascript = array('javascript'); - /// $ra_style = array('style'); // Commented as it has been considered as a bit too aggressive - } - - // keep replacing as long as the previous round replaced something - while ( $this->RemoveXSSchars($val) - || $this->RemoveXSSregexp($ra_as_tag_only, $val, '(\<|\[\\\\xC0\]\[\\\\xBC\])\??') - || $this->RemoveXSSregexp($ra_as_attribute, $val) - || $this->RemoveXSSregexp($ra_as_content, $val, '[\.\\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\|\:;\-\/`#"\']', '(?!\s*[a-z0-9])', true) - || $this->RemoveXSSregexp($ra_javascript, $val, '', ':', true) - /// || RemoveXSSregexp($ra_style, $val, '[^a-z0-9]', '=') // Commented as it has been considered as a bit too aggressive - ); - - return $val; - } - - function RemoveXSSchars(&$val) { - static $patterns = NULL; - static $replacements = NULL; - $val_before = $val; - $found = true; - - if ( $patterns == NULL ) { - $patterns = array(); - $replacements = array(); - - // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are - // allowed this prevents some character re-spacing such as - // note that you have to handle splits with \n, \r, and \t later since they - // *are* allowed in some inputs - $patterns[] = '/([\x00-\x08\x0b-\x0c\x0e-\x19])/'; - $replacements[] = ''; - - // straight replacements, the user should never need these since they're - // normal characters this prevents like - // - // Calculate the search and replace patterns only once - $search = 'abcdefghijklmnopqrstuvwxyz'; - $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $search .= '1234567890!@#$%^&*()'; - $search .= '~`";:?+/={}[]-_|\'\\'; - for ($i = 0; $i < strlen($search); $i++) { - // ;? matches the ;, which is optional - // 0{0,8} matches any padded zeros, - // which are optional and go up to 8 chars - // @ @ search for the hex values - $patterns[] = '/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i'; - $replacements[] = $search[$i]; - // @ @ 0{0,8} matches '0' zero to eight times - // with a ; - $patterns[] = '/(�{0,8}'.ord($search[$i]).';?)/'; - $replacements[] = $search[$i]; - } - } - $val = preg_replace($patterns, $replacements, $val); - if ($val_before == $val) { - // no replacements were made, so exit the loop - $found = false; - } - return $found; - } - - function RemoveXSSregexp(&$ra, &$val, $prefix = '', $suffix = '', $allow_spaces = false) { - $val_before = $val; - $found = true; - $patterns = array(); - $replacements = array(); - - $pattern_sep = '(' - .'&#[xX]0{0,8}[9ab];?' - .'|�{0,8}(9|10|13);?' - .'|(?ms)(\/\*.*?\*\/|\<\!\-\-.*?\-\-\>)' - .'|(\<\!\[CDATA\[|\]\]\>)' - .'|\\\\?' - .( $allow_spaces ? '|\s' : '' ) - .')*'; - - $pattern_start = '/'; - if ( $prefix != '' ) { - $pattern_start .= '(' . $prefix . '\s*' . $pattern_sep . ')'; - } - - $pattern_end = '/i'; - if ( $suffix != '' ) { - if ( $suffix == '=' || $suffix == ':' ) { - $replacement_end = $suffix; - $pattern_end = '(' . $pattern_sep . '\s*' . $suffix . ')' . $pattern_end; - } else { - $replacement_end = ''; - $pattern_end = $suffix . $pattern_end; - } - } else { - $replacement_end = ''; - } - - for ($i = 0; $i < sizeof($ra); $i++) { - $pattern = $pattern_start; - for ($j = 0; $j < strlen($ra[$i]); $j++) { - if ($j > 0) { - $pattern .= $pattern_sep; - } - $pattern .= $ra[$i][$j]; - } - $pattern .= $pattern_end; - $replacement = ( $prefix != '' ) ? '\\1' : ''; - // add in <> to nerf the tag - $replacement .= substr($ra[$i], 0, 2).''.substr($ra[$i], 2); - $patterns[] = $pattern; - $replacements[] = $replacement.$replacement_end; - } - // filter out the hex tags - $val = preg_replace($patterns, $replacements, $val); - if ($val_before == $val) { - // no replacements were made, so exit the loop - $found = false; - } - - return $found; - } -} - -?> diff --git a/include/limesurvey/classes/inputfilter/readme.txt b/include/limesurvey/classes/inputfilter/readme.txt deleted file mode 100644 index 4c374b92..00000000 --- a/include/limesurvey/classes/inputfilter/readme.txt +++ /dev/null @@ -1,212 +0,0 @@ - - - -In Brief ------------------------------------------------------------------------------------------- -Any website that has html forms should really use some sort of `cleaning` process -to filter out malicious code, or simply unwanted html tags for style reasons. - -This class can filter input of stray or malicious PHP, Javascript or HTML tags. -It can be used to prevent cross-site scripting (XSS) attacks. -It should be used to filter input supplied by the user, such as an HTML code -entered in form fields. You would create the filter object, configure it with your -own settings, then call its process method to clean the form input values. - - -Background ------------------------------------------------------------------------------------------- -Initially this class was developed to allow developers such as myself to strip certain tags from user input, -for stylistic reasons. I'm not a big fan of BBTags such as [url]. The scope of this tool was expanded however -to allow automated and extensive filtering of input with anti-XSS capabilities. - - -XSS related reading ------------------------------------------------------------------------------------------- -Unfortunately, php's inbuilt strip_tags($) doesn't filter out unwanted attributes. -This can allow XSS (Cross Site Scripting) attacks to launch malicious javascript or code. - -Introduction to XSS: -http://blog.bitflux.ch/wiki/XSS_Prevention -http://www.globodigital.net/Documentation/Security_Articles/The_Cross_Site_Scripting_FAQ/ -http://www.sandsprite.com/Sleuth/papers/RealWorld_XSS_1.html - -XSS Cheat Sheet (Required reference reading!): -http://www.shocking.com/~rsnake/xss.html - -This class's XSS blacklist page: -http://cyberai.com/inputfilter/blacklist.php - - -Instructions ------------------------------------------------------------------------------------------- -Using the inputFilter class is simple, and described below; - - -0) Include Class-File -------------------------------------- -Goes somewhat without saying to move the version of the classfile -you would like to use into your website's classfiles directory and include it. - - -1) User-Defined Arrays -------------------------------------- -Setup either just a tags array, or additionally an attributes array. - -Eg.. $tags = array("em", "strong"); - - -2) New Object -------------------------------------- -(If you do not enter any parameters, problem-tag stripping will still take place) - -Instantiate the class with your settings. -1st (tags array): Optional (since 1.2.0) -2nd (attr array): Optional -3rd (tags method): 0 = remove ALL BUT these tags (default) - 1 = remove ONLY these tags -4th (attr method): 0 = remove ALL BUT these attributes (default) - 1 = remove ONLY these attributes -5th (xss autostrip): 1 = remove all identified problem tags (default) - 0 = turn this feature off - -Eg.. $myFilter = new InputFilter($tags, $attributes, 0, 0); - - -3) Process inputs -------------------------------------- -Process as many input variables as you like. -The example.php file shows you working examples. -You can pass a string variable or an array-of-strings. - -Another real-world example could be to `clean` a submitted HTML form -reading for processing. You would simply setup the filter and call... - -$_POST = $myFilter->process($_POST); -$_GET["name"] = $myFilter->process($_GET["name"]); - -...simple! - -(If you don't implement a secure cookie method, running the filter could prove wise!) - - -SQL Injection (Experimental) ------------------------------------------------------------------------------------------- -This feature is new, for more info, go here: http://cyberai.com/inputfilter/examples/sql-inject.php - -Methods of use... -- $connection is valid MySQL-Resource variable. -- $source is some string containing SQL injection attack(s). - - -0) Similar to standard usage -------------------------------------- -$myFilter = new InputFilter(); -$source = $myFilter->safeSQL($source, $connection); - - -1) Alongside standard usage -------------------------------------- -$myFilter = new InputFilter(); -$source = $myFilter->safeSQL($myFilter->process($source), $connection); - - -2) As class method -------------------------------------- -$source = InputFilter::safeSQL($source, $connection); - - -3) Perform on array-of-strings -------------------------------------- -$_POST = InputFilter::safeSQL($_POST, $connection); - - -Advanced Features In Brief ------------------------------------------------------------------------------------------- - -1) XHTML ---------------------- - -single tags: - Before:
        - - After:
        - -single attributes: - Before: - - After: - -2) XSS ------------------------ - -customisation: - You have control over which tags and attributes to allow. - -Automation: - Auto-strip tags whose tagnames contain non-alpha characters (g>messageg> - - After: test message - - -Alternatives ------------------------------------------------------------------------------------------- -It has come to my attention that there is indeed a PEAR package to format bad html and XSS. -http://pear.php.net/pepr/pepr-proposal-show.php?id=199 - -I do feel they take a different approach to me, and do not offer customisible tag-stripping. -They do however offer more substantial XHTML reconstructing, and a stable alternative to this tool. -I have included the link so you can judge for yourself. :-) - - -Request For Comments ------------------------------------------------------------------------------------------- -I'd love to know if you're using the InputFilter class, and what you think of it. -Please feel free to email me: dan@rootcube.com - - -Patch Contributors ------------------------------------------------------------------------------------------- -Gianpaolo Racca, Ghislain Picard, Marco Wandschneider, Chris Tobin and Andrew Eddie. - -Many Thanks to everyone else who has emailed! - - -ChangeLog ------------------------------------------------------------------------------------------- -(Line numbers reference the commented php4/php5 version of classfile) - -1.2.2 - Improved nested tag detection. - - Patch accepted: Ghislain Picard. Changed eregi() to preg_match(), - and well as allowing for numeric characters in tags on line 133. - - Patch accepted: Marco Wandschneider - Wrote PHP5 version that does not cause any E_STRICT warnings. - - Patch accepted: Chris Tobin - SQL Injection attack code (Lines 259-312 added.) - - Patch accepted: Andrew Eddie - Added explicit cast to array for user-specified - array parameters in constructor (Lines 37-38 changed.) - - Requested feature: Lukas Slansky - converted to - allowing for incorrect input to conform to XHTML standards. (Lines 213-215 added.) - - Bugfix: Fixed a really dumb bug that was causing arrays to not be parsed. - (Changed for() loop to a foreach() on line 52.) - - Bugfix: Parser was mistaking attribute values "0" for a null value. (Lines 234-235 added.) - -1.2.1 - Patch accepted: Gianpaolo Racca - Added trim() to line 195. - -1.2.0 - Updated example-factory page - looks nicer, added "inject sample data" feature. - - Many more XSS blocking features. - - Rewrote some of the parser code over to be more efficient. - - Have stopped producing seperate classfiles for php4 and php5. The current classfile will work with either! - (If anyone would like be to continue making seperate files for each, drop me an email.) - -1.1.2 - All tag and attribute names with non-alpha characters in are automatically stripped from now on - (This applies to all programming tags, html comments and doctype tags too.) - - User-defined arrays are converted to lowercase at object creation. A somewhat obvious problem I initially missed! - (Had caused tag and attr matching to fail if Capitals used in arrays) - -1.1.1 - Bugfix: to do with spaces in between attr name and value. - - Bugfix: to do with single attributes. - -1.1.0 - Support for array as input. - - PHP5 version of class available. - -1.0.1 - Bugfix: involved ignored tag attribute values with spaces in. - -1.0.0 - Release version. diff --git a/include/limesurvey/classes/pchart/pchart/pCache.class b/include/limesurvey/classes/pchart/pchart/pCache.class deleted file mode 100644 index 717b0390..00000000 --- a/include/limesurvey/classes/pchart/pchart/pCache.class +++ /dev/null @@ -1,133 +0,0 @@ -. - - Class initialisation : - pCache($CacheFolder="Cache/") - Cache management : - IsInCache($Data) - GetFromCache($ID,$Data) - WriteToCache($ID,$Data,$Picture) - DeleteFromCache($ID,$Data) - ClearCache() - Inner functions : - GetHash($ID,$Data) - */ - - /* pCache class definition */ - class pCache - { - var $HashKey = ""; - var $CacheFolder = "Cache/"; - - /* Create the pCache object */ - function pCache($CacheFolder="Cache/") - { - $this->CacheFolder = $CacheFolder; - } - - /* This function is clearing the cache folder */ - function ClearCache() - { - if ($handle = opendir($this->CacheFolder)) - { - while (false !== ($file = readdir($handle))) - { - if ( $file != "." && $file != ".." ) - unlink($this->CacheFolder.$file); - } - closedir($handle); - } - } - - /* This function is checking if we have an offline version of this chart */ - function IsInCache($ID,$Data,$Hash="") - { - if ( $Hash == "" ) - $Hash = $this->GetHash($ID,$Data); - - if ( file_exists($this->CacheFolder.$Hash) ) - return(TRUE); - else - return(FALSE); - } - - /* This function is making a copy of drawn chart in the cache folder */ - function WriteToCache($ID,$Data,$Picture) - { - $Hash = $this->GetHash($ID,$Data); - $FileName = $this->CacheFolder.$Hash; - - imagepng($Picture->Picture,$FileName); - } - - /* This function is removing any cached copy of this chart */ - function DeleteFromCache($ID,$Data) - { - $Hash = $this->GetHash($ID,$Data); - $FileName = $this->CacheFolder.$Hash; - - if ( file_exists($FileName ) ) - unlink($FileName); - } - - /* This function is retrieving the cached picture if applicable */ - function GetFromCache($ID,$Data) - { - $Hash = $this->GetHash($ID,$Data); - if ( $this->IsInCache("","",$Hash ) ) - { - $FileName = $this->CacheFolder.$Hash; - - header('Content-type: image/png'); - @readfile($FileName); - exit(); - } - } - - - /* This function is retrieving the cached picture if applicable */ - function GetFileFromCache($ID,$Data) - { - $Hash = $this->GetHash($ID,$Data); - if ( $this->IsInCache("","",$Hash ) ) - { - $FileName = $this->CacheFolder.$Hash; - - return $FileName; - exit(); - } - } - - /* This function is building the graph unique hash key */ - function GetHash($ID,$Data) - { - $mKey = "$ID"; - foreach($Data as $key => $Values) - { - $tKey = ""; - foreach($Values as $Serie => $Value) - $tKey = $tKey.$Serie.$Value; - $mKey = $mKey.md5($tKey); - } - return(md5($mKey).'.png'); - } - } -?> \ No newline at end of file diff --git a/include/limesurvey/classes/pchart/pchart/pChart.class b/include/limesurvey/classes/pchart/pchart/pChart.class deleted file mode 100644 index ea841755..00000000 --- a/include/limesurvey/classes/pchart/pchart/pChart.class +++ /dev/null @@ -1,3486 +0,0 @@ -. - - Class initialisation : - pChart($XSize,$YSize) - Draw methods : - drawBackground($R,$G,$B) - drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B) - drawFilledRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B,$DrawBorder=TRUE,$Alpha=100) - drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) - drawFilledRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) - drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) - drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) - drawEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) - drawFilledEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) - drawLine($X1,$Y1,$X2,$Y2,$R,$G,$B,$GraphFunction=FALSE) - drawDottedLine($X1,$Y1,$X2,$Y2,$DotSize,$R,$G,$B) - drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B) - drawFromPNG($FileName,$X,$Y,$Alpha=100) - drawFromGIF($FileName,$X,$Y,$Alpha=100) - drawFromJPG($FileName,$X,$Y,$Alpha=100) - Graph setup methods : - addBorder($Width=3,$R=0,$G=0,$B=0) - clearScale() - clearShadow() - createColorGradientPalette($R1,$G1,$B1,$R2,$G2,$B2,$Shades) - drawGraphArea($R,$G,$B,$Stripe=FALSE) - drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1,$RightScale=FALSE) - drawRightScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1) - drawXYScale($Data,$DataDescription,$YSerieName,$XSerieName,$R,$G,$B,$WithMargin=0,$Angle=0,$Decimals=1) - drawGrid($LineWidth,$Mosaic=TRUE,$R=220,$G=220,$B=220,$Alpha=100) - drawLegend($XPos,$YPos,$DataDescription,$R,$G,$B,$Rs=-1,$Gs=-1,$Bs=-1,$Rt=0,$Gt=0,$Bt=0,$Border=FALSE) - drawPieLegend($XPos,$YPos,$Data,$DataDescription,$R,$G,$B) - drawTitle($XPos,$YPos,$Value,$R,$G,$B,$XPos2=-1,$YPos2=-1,$Shadow=FALSE) - drawTreshold($Value,$R,$G,$B,$ShowLabel=FALSE,$ShowOnRight=FALSE,$TickWidth=4,$FreeText=NULL) - drawArea($Data,$Serie1,$Serie2,$R,$G,$B,$Alpha = 50) - drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1) - drawGraphAreaGradient($R,$G,$B,$Decay,$Target=TARGET_GRAPHAREA) - drawTextBox($X1,$Y1,$X2,$Y2,$Text,$Angle=0,$R=255,$G=255,$B=255,$Align=ALIGN_LEFT,$Shadow=TRUE,$BgR=-1,$BgG=-1,$BgB=-1,$Alpha=100) - getLegendBoxSize($DataDescription) - loadColorPalette($FileName,$Delimiter=",") - reportWarnings($Interface="CLI") - setGraphArea($X1,$Y1,$X2,$Y2) - setLabel($Data,$DataDescription,$SerieName,$ValueName,$Caption,$R=210,$G=210,$B=210) - setColorPalette($ID,$R,$G,$B) - setCurrency($Currency) - setDateFormat($Format) - setFontProperties($FontName,$FontSize) - setLineStyle($Width=1,$DotSize=0) - setFixedScale($VMin,$VMax,$Divisions=5,$VXMin=0,$VXMin=0,$XDivisions=5) - setShadowProperties($XDistance=1,$YDistance=1,$R=60,$G=60,$B=60,$Alpha) - writeValues($Data,$DataDescription,$Series) - Graphs methods : - drawPlotGraph($Data,$DataDescription,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=FALSE) - drawXYPlotGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1) - drawLineGraph($Data,$DataDescription,$SerieName="") - drawXYGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0) - drawFilledLineGraph($Data,$DataDescription,$Alpha=100,$AroundZero=FALSE) - drawCubicCurve($Data,$DataDescription,$Accuracy=.1,$SerieName="") - drawFilledCubicCurve($Data,$DataDescription,$Accuracy=.1,$Alpha=100,$AroundZero=FALSE) - drawOverlayBarGraph($Data,$DataDescription,$Alpha=50) - drawBarGraph($Data,$DataDescription,$Shadow=FALSE) - drawStackedBarGraph($Data,$DataDescription,$Alpha=50,$Contiguous=FALSE) - drawLimitsGraph($Data,$DataDescription,$R=0,$G=0,$B=0) - drawRadar($Data,$DataDescription,$BorderOffset=10,$MaxValue=-1) - drawFilledRadar($Data,$DataDescription,$Alpha=50,$BorderOffset=10,$MaxValue=-1) - drawBasicPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$R=255,$G=255,$B=255,$Decimals=0) - drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals = 0) - drawFlatPieGraphWithShadow($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals = 0) - drawPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$EnhanceColors=TRUE,$Skew=60,$SpliceHeight=20,$SpliceDistance=0,$Decimals=0) - Other methods : - setImageMap($Mode=TRUE,$GraphID="MyGraph") - getImageMap($MapName,$Flush=TRUE) - Render($FileName) - Stroke() - */ - - /* Declare some script wide constants */ - define("SCALE_NORMAL",1); - define("SCALE_ADDALL",2); - define("SCALE_START0",3); - define("SCALE_ADDALLSTART0",4); - define("PIE_PERCENTAGE", 1); - define("PIE_LABELS",2); - define("PIE_NOLABEL",3); - define("PIE_PERCENTAGE_LABEL", 4); - define("TARGET_GRAPHAREA",1); - define("TARGET_BACKGROUND",2); - define("ALIGN_TOP_LEFT",1); - define("ALIGN_TOP_CENTER",2); - define("ALIGN_TOP_RIGHT",3); - define("ALIGN_LEFT",4); - define("ALIGN_CENTER",5); - define("ALIGN_RIGHT",6); - define("ALIGN_BOTTOM_LEFT",7); - define("ALIGN_BOTTOM_CENTER",8); - define("ALIGN_BOTTOM_RIGHT",9); - - /* pChart class definition */ - class pChart - { - /* Palettes definition */ - var $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46), - "1"=>array("R"=>224,"G"=>100,"B"=>46), - "2"=>array("R"=>224,"G"=>214,"B"=>46), - "3"=>array("R"=>46,"G"=>151,"B"=>224), - "4"=>array("R"=>176,"G"=>46,"B"=>224), - "5"=>array("R"=>224,"G"=>46,"B"=>117), - "6"=>array("R"=>92,"G"=>224,"B"=>46), - "7"=>array("R"=>224,"G"=>176,"B"=>46)); - - /* Some static vars used in the class */ - var $XSize = NULL; - var $YSize = NULL; - var $Picture = NULL; - var $ImageMap = NULL; - - /* Error management */ - var $ErrorReporting = FALSE; - var $ErrorInterface = "CLI"; - var $Errors = NULL; - var $ErrorFontName = "Fonts/pf_arma_five.ttf"; - var $ErrorFontSize = 6; - - /* vars related to the graphing area */ - var $GArea_X1 = NULL; - var $GArea_Y1 = NULL; - var $GArea_X2 = NULL; - var $GArea_Y2 = NULL; - var $GAreaXOffset = NULL; - var $VMax = NULL; - var $VMin = NULL; - var $VXMax = NULL; - var $VXMin = NULL; - var $Divisions = NULL; - var $XDivisions = NULL; - var $DivisionHeight = NULL; - var $XDivisionHeight = NULL; - var $DivisionCount = NULL; - var $XDivisionCount = NULL; - var $DivisionRatio = NULL; - var $XDivisionRatio = NULL; - var $DivisionWidth = NULL; - var $DataCount = NULL; - var $Currency = "\$"; - - /* Text format related vars */ - var $FontName = NULL; - var $FontSize = NULL; - var $DateFormat = "d/m/Y"; - - /* Lines format related vars */ - var $LineWidth = 1; - var $LineDotSize = 0; - - /* Layer related vars */ - var $Layers = NULL; - - /* Set antialias quality : 0 is maximum, 100 minimum*/ - var $AntialiasQuality = 0; - - /* Shadow settings */ - var $ShadowActive = FALSE; - var $ShadowXDistance = 1; - var $ShadowYDistance = 1; - var $ShadowRColor = 60; - var $ShadowGColor = 60; - var $ShadowBColor = 60; - var $ShadowAlpha = 50; - var $ShadowBlur = 0; - - /* Image Map settings */ - var $BuildMap = FALSE; - var $MapFunction = NULL; - var $tmpFolder = "tmp/"; - var $MapID = NULL; - - /* This function create the background picture */ - function pChart($XSize,$YSize) - { - $this->XSize = $XSize; - $this->YSize = $YSize; - - if (function_exists('imagecreatetruecolor')) { - $this->Picture = imagecreatetruecolor($XSize,$YSize); - } - else - { - $this->Picture = imagecreate($XSize,$YSize); - } - - $C_White =$this->AllocateColor($this->Picture,255,255,255); - imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White); - imagecolortransparent($this->Picture,$C_White); - - $this->setFontProperties("tahoma.ttf",8); - } - - /* Set if warnings should be reported */ - function reportWarnings($Interface="CLI") - { - $this->ErrorReporting = TRUE; - $this->ErrorInterface = $Interface; - } - - /* Set the font properties */ - function setFontProperties($FontName,$FontSize) - { - $this->FontName = $FontName; - $this->FontSize = $FontSize; - } - - /* Set the shadow properties */ - function setShadowProperties($XDistance=1,$YDistance=1,$R=60,$G=60,$B=60,$Alpha=50,$Blur=0) - { - $this->ShadowActive = TRUE; - $this->ShadowXDistance = $XDistance; - $this->ShadowYDistance = $YDistance; - $this->ShadowRColor = $R; - $this->ShadowGColor = $G; - $this->ShadowBColor = $B; - $this->ShadowAlpha = $Alpha; - $this->ShadowBlur = $Blur; - } - - /* Remove shadow option */ - function clearShadow() - { - $this->ShadowActive = FALSE; - } - - /* Set Palette color */ - function setColorPalette($ID,$R,$G,$B) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $this->Palette[$ID]["R"] = $R; - $this->Palette[$ID]["G"] = $G; - $this->Palette[$ID]["B"] = $B; - } - - /* Create a color palette shading from one color to another */ - function createColorGradientPalette($R1,$G1,$B1,$R2,$G2,$B2,$Shades) - { - $RFactor = ($R2-$R1)/$Shades; - $GFactor = ($G2-$G1)/$Shades; - $BFactor = ($B2-$B1)/$Shades; - - for($i=0;$i<=$Shades-1;$i++) - { - $this->Palette[$i]["R"] = $R1+$RFactor*$i; - $this->Palette[$i]["G"] = $G1+$GFactor*$i; - $this->Palette[$i]["B"] = $B1+$BFactor*$i; - } - } - - /* Load Color Palette from file */ - function loadColorPalette($FileName,$Delimiter=",") - { - $handle = @fopen($FileName,"r"); - $ColorID = 0; - if ($handle) - { - while (!feof($handle)) - { - $buffer = fgets($handle, 4096); - $buffer = str_replace(chr(10),"",$buffer); - $buffer = str_replace(chr(13),"",$buffer); - $Values = explode($Delimiter,$buffer); - if ( count($Values) == 3 ) - { - $this->Palette[$ColorID]["R"] = $Values[0]; - $this->Palette[$ColorID]["G"] = $Values[1]; - $this->Palette[$ColorID]["B"] = $Values[2]; - $ColorID++; - } - } - } - } - - /* Set line style */ - function setLineStyle($Width=1,$DotSize=0) - { - $this->LineWidth = $Width; - $this->LineDotSize = $DotSize; - } - - /* Set currency symbol */ - function setCurrency($Currency) - { - $this->Currency = $Currency; - } - - /* Set the graph area location */ - function setGraphArea($X1,$Y1,$X2,$Y2) - { - $this->GArea_X1 = $X1; - $this->GArea_Y1 = $Y1; - $this->GArea_X2 = $X2; - $this->GArea_Y2 = $Y2; - } - - /* Prepare the graph area */ - function drawGraphArea($R,$G,$B,$Stripe=FALSE) - { - $this->drawFilledRectangle($this->GArea_X1,$this->GArea_Y1,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B,FALSE); - $this->drawRectangle($this->GArea_X1,$this->GArea_Y1,$this->GArea_X2,$this->GArea_Y2,$R-40,$G-40,$B-40); - - if ( $Stripe ) - { - $R2 = $R-15; if ( $R2 < 0 ) { $R2 = 0; } - $G2 = $R-15; if ( $G2 < 0 ) { $G2 = 0; } - $B2 = $R-15; if ( $B2 < 0 ) { $B2 = 0; } - - $LineColor =$this->AllocateColor($this->Picture,$R2,$G2,$B2); - $SkewWidth = $this->GArea_Y2-$this->GArea_Y1-1; - - for($i=$this->GArea_X1-$SkewWidth;$i<=$this->GArea_X2;$i=$i+4) - { - $X1 = $i; $Y1 = $this->GArea_Y2; - $X2 = $i+$SkewWidth; $Y2 = $this->GArea_Y1; - - - if ( $X1 < $this->GArea_X1 ) - { $X1 = $this->GArea_X1; $Y1 = $this->GArea_Y1 + $X2 - $this->GArea_X1 + 1; } - - if ( $X2 >= $this->GArea_X2 ) - { $Y2 = $this->GArea_Y1 + $X2 - $this->GArea_X2 +1; $X2 = $this->GArea_X2 - 1; } -// * Fixed in 1.27 * { $X2 = $this->GArea_X2 - 1; $Y2 = $this->GArea_Y2 - ($this->GArea_X2 - $X1); } - - imageline($this->Picture,$X1,$Y1,$X2,$Y2+1,$LineColor); - } - } - } - - /* Allow you to clear the scale : used if drawing multiple charts */ - function clearScale() - { - $this->VMin = NULL; - $this->VMax = NULL; - $this->VXMin = NULL; - $this->VXMax = NULL; - $this->Divisions = NULL; - $this->XDivisions = NULL; } - - /* Allow you to fix the scale, use this to bypass the automatic scaling */ - function setFixedScale($VMin,$VMax,$Divisions=5,$VXMin=0,$VXMax=0,$XDivisions=5) - { - $this->VMin = $VMin; - $this->VMax = $VMax; - $this->Divisions = $Divisions; - - if ( !$VXMin == 0 ) - { - $this->VXMin = $VXMin; - $this->VXMax = $VXMax; - $this->XDivisions = $XDivisions; - } - } - - /* Wrapper to the drawScale() function allowing a second scale to be drawn */ - function drawRightScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1) - { - $this->drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks,$Angle,$Decimals,$WithMargin,$SkipLabels,TRUE); - } - - /* Compute and draw the scale */ - function drawScale($Data,$DataDescription,$ScaleMode,$R,$G,$B,$DrawTicks=TRUE,$Angle=0,$Decimals=1,$WithMargin=FALSE,$SkipLabels=1,$RightScale=FALSE) - { - /* Validate the Data and DataDescription array */ - $this->validateData("drawScale",$Data); - - $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); - - $this->drawLine($this->GArea_X1,$this->GArea_Y1,$this->GArea_X1,$this->GArea_Y2,$R,$G,$B); - $this->drawLine($this->GArea_X1,$this->GArea_Y2,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B); - - if ( $this->VMin == NULL && $this->VMax == NULL) - { - if (isset($DataDescription["Values"][0])) - { - $this->VMin = $Data[0][$DataDescription["Values"][0]]; - $this->VMax = $Data[0][$DataDescription["Values"][0]]; - } - else { $this->VMin = 2147483647; $this->VMax = -2147483647; } - - /* Compute Min and Max values */ - if ( $ScaleMode == SCALE_NORMAL || $ScaleMode == SCALE_START0 ) - { - if ( $ScaleMode == SCALE_START0 ) { $this->VMin = 0; } - - foreach ( $Data as $Key => $Values ) - { - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - if (isset($Data[$Key][$ColName])) - { - $Value = $Data[$Key][$ColName]; - - if ( is_numeric($Value) ) - { - if ( $this->VMax < $Value) { $this->VMax = $Value; } - if ( $this->VMin > $Value) { $this->VMin = $Value; } - } - } - } - } - } - elseif ( $ScaleMode == SCALE_ADDALL || $ScaleMode == SCALE_ADDALLSTART0 ) /* Experimental */ - { - if ( $ScaleMode == SCALE_ADDALLSTART0 ) { $this->VMin = 0; } - - foreach ( $Data as $Key => $Values ) - { - $Sum = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - if (isset($Data[$Key][$ColName])) - { - $Value = $Data[$Key][$ColName]; - if ( is_numeric($Value) ) - $Sum += $Value; - } - } - if ( $this->VMax < $Sum) { $this->VMax = $Sum; } - if ( $this->VMin > $Sum) { $this->VMin = $Sum; } - } - } - - /* If all values are the same */ - if ( $this->VMax == $this->VMin ) - { - if ( $this->VMax >= 0 ) { $this->VMax++; } - else { $this->VMin--; } - } - if ($this->VMax==1) {$this->VMax++;} - $DataRange = $this->VMax - $this->VMin; - if ( $DataRange == 0 ) { $DataRange = .1; } - - /* Compute automatic scaling */ - $ScaleOk = FALSE; $Factor = 1; - $MinDivHeight = 25; $MaxDivs = ($this->GArea_Y2 - $this->GArea_Y1) / $MinDivHeight; - - if ( $this->VMin == 0 && $this->VMax == 0 ) - { $this->VMin = 0; $this->VMax = 2; $Scale = 1; $Divisions = 2;} - elseif ($MaxDivs > 1) - { - while(!$ScaleOk) - { - $Scale1 = ( $this->VMax - $this->VMin ) / $Factor; - $Scale2 = ( $this->VMax - $this->VMin ) / $Factor / 2; - $Scale4 = ( $this->VMax - $this->VMin ) / $Factor / 4; - - if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale1); $Scale = 1;} - if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale2); $Scale = 2;} - if (!$ScaleOk) - { - if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } - if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } - } - } - - if ( floor($this->VMax / $Scale / $Factor) != $this->VMax / $Scale / $Factor) - { - $GridID = floor ( $this->VMax / $Scale / $Factor) + 1; - $this->VMax = $GridID * $Scale * $Factor; - $Divisions++; - } - - if ( floor($this->VMin / $Scale / $Factor) != $this->VMin / $Scale / $Factor) - { - $GridID = floor( $this->VMin / $Scale / $Factor); - $this->VMin = $GridID * $Scale * $Factor; - $Divisions++; - } - } - else /* Can occurs for small graphs */ - $Scale = 1; - - if ( !isset($Divisions) ) - $Divisions = 2; - - if ($Scale == 1 && $Divisions%2 == 1) - $Divisions--; - } - else - $Divisions = $this->Divisions; - - $this->DivisionCount = $Divisions; - - $DataRange = $this->VMax - $this->VMin; - if ( $DataRange == 0 ) { $DataRange = .1; } - - $this->DivisionHeight = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $Divisions; - $this->DivisionRatio = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $DataRange; - - $this->GAreaXOffset = 0; - if ( count($Data) > 1 ) - { - if ( $WithMargin == FALSE ) - $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / (count($Data)-1); - else - { - $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / (count($Data)); - $this->GAreaXOffset = $this->DivisionWidth / 2; - } - } - else - { - $this->DivisionWidth = $this->GArea_X2 - $this->GArea_X1; - $this->GAreaXOffset = $this->DivisionWidth / 2; - } - - $this->DataCount = count($Data); - - if ( $DrawTicks == FALSE ) - return(0); - - $YPos = $this->GArea_Y2; $XMin = NULL; - for($i=1;$i<=$Divisions+1;$i++) - { - if ( $RightScale ) - $this->drawLine($this->GArea_X2,$YPos,$this->GArea_X2+5,$YPos,$R,$G,$B); - else - $this->drawLine($this->GArea_X1,$YPos,$this->GArea_X1-5,$YPos,$R,$G,$B); - - $Value = $this->VMin + ($i-1) * (( $this->VMax - $this->VMin ) / $Divisions); - $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); - if ( $DataDescription["Format"]["Y"] == "number" ) - $Value = $Value.$DataDescription["Unit"]["Y"]; - if ( $DataDescription["Format"]["Y"] == "time" ) - $Value = $this->ToTime($Value); - if ( $DataDescription["Format"]["Y"] == "date" ) - $Value = $this->ToDate($Value); - if ( $DataDescription["Format"]["Y"] == "metric" ) - $Value = $this->ToMetric($Value); - if ( $DataDescription["Format"]["Y"] == "currency" ) - $Value = $this->ToCurrency($Value); - - $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); - $TextWidth = $Position[2]-$Position[0]; - - if ( $RightScale ) - { - imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X2+10,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); - if ( $XMin < $this->GArea_X2+15+$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X2+15+$TextWidth; } - } - else - { - imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1-10-$TextWidth,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); - if ( $XMin > $this->GArea_X1-10-$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X1-10-$TextWidth; } - } - - $YPos = $YPos - $this->DivisionHeight; - } - - /* Write the Y Axis caption if set */ - if ( isset($DataDescription["Axis"]["Y"]) ) - { - $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["Y"]); - $TextHeight = abs($Position[1])+abs($Position[3]); - $TextTop = (($this->GArea_Y2 - $this->GArea_Y1) / 2) + $this->GArea_Y1 + ($TextHeight/2); - - if ( $RightScale ) - imagettftext($this->Picture,$this->FontSize,90,$XMin+$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); - else - imagettftext($this->Picture,$this->FontSize,90,$XMin-$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); - } - - /* Horizontal Axis */ - $XPos = $this->GArea_X1 + $this->GAreaXOffset; - $ID = 1; $YMax = NULL; - foreach ( $Data as $Key => $Values ) - { - if ( $ID % $SkipLabels == 0 ) - { - $this->drawLine(floor($XPos),$this->GArea_Y2,floor($XPos),$this->GArea_Y2+5,$R,$G,$B); - $Value = $Data[$Key][$DataDescription["Position"]]; - if ( $DataDescription["Format"]["X"] == "number" ) - $Value = $Value.$DataDescription["Unit"]["X"]; - if ( $DataDescription["Format"]["X"] == "time" ) - $Value = $this->ToTime($Value); - if ( $DataDescription["Format"]["X"] == "date" ) - $Value = $this->ToDate($Value); - if ( $DataDescription["Format"]["X"] == "metric" ) - $Value = $this->ToMetric($Value); - if ( $DataDescription["Format"]["X"] == "currency" ) - $Value = $this->ToCurrency($Value); - - $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Value); - $TextWidth = abs($Position[2])+abs($Position[0]); - $TextHeight = abs($Position[1])+abs($Position[3]); - - if ( $Angle == 0 ) - { - $YPos = $this->GArea_Y2+18; - imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-floor($TextWidth/2),$YPos,$C_TextColor,$this->FontName,$Value); - } - else - { - $YPos = $this->GArea_Y2+10+$TextHeight; - if ( $Angle <= 90 ) - imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); - else - imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)+$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); - } - if ( $YMax < $YPos || $YMax == NULL ) { $YMax = $YPos; } - } - - $XPos = $XPos + $this->DivisionWidth; - $ID++; - } - - /* Write the X Axis caption if set */ - if ( isset($DataDescription["Axis"]["X"]) ) - { - $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["X"]); - $TextWidth = abs($Position[2])+abs($Position[0]); - $TextLeft = (($this->GArea_X2 - $this->GArea_X1) / 2) + $this->GArea_X1 + ($TextWidth/2); - imagettftext($this->Picture,$this->FontSize,0,$TextLeft,$YMax+$this->FontSize+5,$C_TextColor,$this->FontName,$DataDescription["Axis"]["X"]); - } - } - - /* Compute and draw the scale for X/Y charts */ - function drawXYScale($Data,$DataDescription,$YSerieName,$XSerieName,$R,$G,$B,$WithMargin=0,$Angle=0,$Decimals=1) - { - /* Validate the Data and DataDescription array */ - $this->validateData("drawScale",$Data); - - $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); - - $this->drawLine($this->GArea_X1,$this->GArea_Y1,$this->GArea_X1,$this->GArea_Y2,$R,$G,$B); - $this->drawLine($this->GArea_X1,$this->GArea_Y2,$this->GArea_X2,$this->GArea_Y2,$R,$G,$B); - - /* Process Y scale */ - if ( $this->VMin == NULL && $this->VMax == NULL) - { - $this->VMin = $Data[0][$YSerieName]; - $this->VMax = $Data[0][$YSerieName]; - - foreach ( $Data as $Key => $Values ) - { - if (isset($Data[$Key][$YSerieName])) - { - $Value = round($Data[$Key][$YSerieName]); - if ( $this->VMax < $Value) { $this->VMax = $Value; } - if ( $this->VMin > $Value) { $this->VMin = $Value; } - } - } - - $DataRange = $this->VMax - $this->VMin; - if ( $DataRange == 0 ) { $DataRange = .1; } - - /* Compute automatic scaling */ - $ScaleOk = FALSE; $Factor = 1; - $MinDivHeight = 25; $MaxDivs = ($this->GArea_Y2 - $this->GArea_Y1) / $MinDivHeight; - - if ( $this->VMin == 0 && $this->VMax == 0 ) - { $this->VMin = 0; $this->VMax = 2; $Scale = 1; $Divisions = 2;} - elseif ($MaxDivs > 1) - { - while(!$ScaleOk) - { - $Scale1 = ( $this->VMax - $this->VMin ) / $Factor; - $Scale2 = ( $this->VMax - $this->VMin ) / $Factor / 2; - $Scale4 = ( $this->VMax - $this->VMin ) / $Factor / 4; - - if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale1); $Scale = 1;} - if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $Divisions = floor($Scale2); $Scale = 2;} - if (!$ScaleOk) - { - if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } - if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } - } - } - - if ( floor($this->VMax / $Scale / $Factor) != $this->VMax / $Scale / $Factor) - { - $GridID = floor ( $this->VMax / $Scale / $Factor) + 1; - $this->VMax = $GridID * $Scale * $Factor; - $Divisions++; - } - - if ( floor($this->VMin / $Scale / $Factor) != $this->VMin / $Scale / $Factor) - { - $GridID = floor( $this->VMin / $Scale / $Factor); - $this->VMin = $GridID * $Scale * $Factor; - $Divisions++; - } - } - else /* Can occurs for small graphs */ - $Scale = 1; - - if ( !isset($Divisions) ) - $Divisions = 2; - - if ( $this->isRealInt(($this->VMax-$this->VMin)/($Divisions-1))) - $Divisions--; - elseif ( $this->isRealInt(($this->VMax-$this->VMin)/($Divisions+1))) - $Divisions++; - } - else - $Divisions = $this->Divisions; - - $this->DivisionCount = $Divisions; - - $DataRange = $this->VMax - $this->VMin; - if ( $DataRange == 0 ) { $DataRange = .1; } - - $this->DivisionHeight = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $Divisions; - $this->DivisionRatio = ( $this->GArea_Y2 - $this->GArea_Y1 ) / $DataRange; - - $YPos = $this->GArea_Y2; $XMin = NULL; - for($i=1;$i<=$Divisions+1;$i++) - { - $this->drawLine($this->GArea_X1,$YPos,$this->GArea_X1-5,$YPos,$R,$G,$B); - $Value = $this->VMin + ($i-1) * (( $this->VMax - $this->VMin ) / $Divisions); - $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); - if ( $DataDescription["Format"]["Y"] == "number" ) - $Value = $Value.$DataDescription["Unit"]["Y"]; - if ( $DataDescription["Format"]["Y"] == "time" ) - $Value = $this->ToTime($Value); - if ( $DataDescription["Format"]["Y"] == "date" ) - $Value = $this->ToDate($Value); - if ( $DataDescription["Format"]["Y"] == "metric" ) - $Value = $this->ToMetric($Value); - if ( $DataDescription["Format"]["Y"] == "currency" ) - $Value = $this->ToCurrency($Value); - - $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); - $TextWidth = $Position[2]-$Position[0]; - imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1-10-$TextWidth,$YPos+($this->FontSize/2),$C_TextColor,$this->FontName,$Value); - - if ( $XMin > $this->GArea_X1-10-$TextWidth || $XMin == NULL ) { $XMin = $this->GArea_X1-10-$TextWidth; } - - $YPos = $YPos - $this->DivisionHeight; - } - - /* Process X scale */ - if ( $this->VXMin == NULL && $this->VXMax == NULL) - { - $this->VXMin = $Data[0][$XSerieName]; - $this->VXMax = $Data[0][$XSerieName]; - - foreach ( $Data as $Key => $Values ) - { - if (isset($Data[$Key][$XSerieName])) - { - $Value = round($Data[$Key][$XSerieName]); - if ( $this->VXMax < $Value) { $this->VXMax = $Value; } - if ( $this->VXMin > $Value) { $this->VXMin = $Value; } - } - } - - $DataRange = $this->VMax - $this->VMin; - if ( $DataRange == 0 ) { $DataRange = .1; } - - /* Compute automatic scaling */ - $ScaleOk = FALSE; $Factor = 1; - $MinDivWidth = 25; $MaxDivs = ($this->GArea_X2 - $this->GArea_X1) / $MinDivWidth; - - if ( $this->VXMin == 0 && $this->VXMax == 0 ) - { $this->VXMin = 0; $this->VXMax = 2; $Scale = 1; $XDivisions = 2;} - elseif ($MaxDivs > 1) - { - while(!$ScaleOk) - { - $Scale1 = ( $this->VXMax - $this->VXMin ) / $Factor; - $Scale2 = ( $this->VXMax - $this->VXMin ) / $Factor / 2; - $Scale4 = ( $this->VXMax - $this->VXMin ) / $Factor / 4; - - if ( $Scale1 > 1 && $Scale1 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $XDivisions = floor($Scale1); $Scale = 1;} - if ( $Scale2 > 1 && $Scale2 <= $MaxDivs && !$ScaleOk) { $ScaleOk = TRUE; $XDivisions = floor($Scale2); $Scale = 2;} - if (!$ScaleOk) - { - if ( $Scale2 > 1 ) { $Factor = $Factor * 10; } - if ( $Scale2 < 1 ) { $Factor = $Factor / 10; } - } - } - - if ( floor($this->VXMax / $Scale / $Factor) != $this->VXMax / $Scale / $Factor) - { - $GridID = floor ( $this->VXMax / $Scale / $Factor) + 1; - $this->VXMax = $GridID * $Scale * $Factor; - $XDivisions++; - } - - if ( floor($this->VXMin / $Scale / $Factor) != $this->VXMin / $Scale / $Factor) - { - $GridID = floor( $this->VXMin / $Scale / $Factor); - $this->VXMin = $GridID * $Scale * $Factor; - $XDivisions++; - } - } - else /* Can occurs for small graphs */ - $Scale = 1; - - if ( !isset($XDivisions) ) - $XDivisions = 2; - - if ( $this->isRealInt(($this->VXMax-$this->VXMin)/($XDivisions-1))) - $XDivisions--; - elseif ( $this->isRealInt(($this->VXMax-$this->VXMin)/($XDivisions+1))) - $XDivisions++; - } - else - $XDivisions = $this->XDivisions; - - $this->XDivisionCount = $Divisions; - $this->DataCount = $Divisions + 2; - - $XDataRange = $this->VXMax - $this->VXMin; - if ( $XDataRange == 0 ) { $XDataRange = .1; } - - $this->DivisionWidth = ( $this->GArea_X2 - $this->GArea_X1 ) / $XDivisions; - $this->XDivisionRatio = ( $this->GArea_X2 - $this->GArea_X1 ) / $XDataRange; - - $XPos = $this->GArea_X1; $YMax = NULL; - for($i=1;$i<=$XDivisions+1;$i++) - { - $this->drawLine($XPos,$this->GArea_Y2,$XPos,$this->GArea_Y2+5,$R,$G,$B); - - $Value = $this->VXMin + ($i-1) * (( $this->VXMax - $this->VXMin ) / $XDivisions); - $Value = round($Value * pow(10,$Decimals)) / pow(10,$Decimals); - if ( $DataDescription["Format"]["Y"] == "number" ) - $Value = $Value.$DataDescription["Unit"]["Y"]; - if ( $DataDescription["Format"]["Y"] == "time" ) - $Value = $this->ToTime($Value); - if ( $DataDescription["Format"]["Y"] == "date" ) - $Value = $this->ToDate($Value); - if ( $DataDescription["Format"]["Y"] == "metric" ) - $Value = $this->ToMetric($Value); - if ( $DataDescription["Format"]["Y"] == "currency" ) - $Value = $this->ToCurrency($Value); - - $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Value); - $TextWidth = abs($Position[2])+abs($Position[0]); - $TextHeight = abs($Position[1])+abs($Position[3]); - - if ( $Angle == 0 ) - { - $YPos = $this->GArea_Y2+18; - imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-floor($TextWidth/2),$YPos,$C_TextColor,$this->FontName,$Value); - } - else - { - $YPos = $this->GArea_Y2+10+$TextHeight; - if ( $Angle <= 90 ) - imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)-$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); - else - imagettftext($this->Picture,$this->FontSize,$Angle,floor($XPos)+$TextWidth+5,$YPos,$C_TextColor,$this->FontName,$Value); - } - - if ( $YMax < $YPos || $YMax == NULL ) { $YMax = $YPos; } - - $XPos = $XPos + $this->DivisionWidth; - } - - /* Write the Y Axis caption if set */ - if ( isset($DataDescription["Axis"]["Y"]) ) - { - $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["Y"]); - $TextHeight = abs($Position[1])+abs($Position[3]); - $TextTop = (($this->GArea_Y2 - $this->GArea_Y1) / 2) + $this->GArea_Y1 + ($TextHeight/2); - imagettftext($this->Picture,$this->FontSize,90,$XMin-$this->FontSize,$TextTop,$C_TextColor,$this->FontName,$DataDescription["Axis"]["Y"]); - } - - /* Write the X Axis caption if set */ - if ( isset($DataDescription["Axis"]["X"]) ) - { - $Position = imageftbbox($this->FontSize,90,$this->FontName,$DataDescription["Axis"]["X"]); - $TextWidth = abs($Position[2])+abs($Position[0]); - $TextLeft = (($this->GArea_X2 - $this->GArea_X1) / 2) + $this->GArea_X1 + ($TextWidth/2); - imagettftext($this->Picture,$this->FontSize,0,$TextLeft,$YMax+$this->FontSize+5,$C_TextColor,$this->FontName,$DataDescription["Axis"]["X"]); - } - } - - /* Compute and draw the scale */ - function drawGrid($LineWidth,$Mosaic=TRUE,$R=220,$G=220,$B=220,$Alpha=100) - { - /* Draw mosaic */ - if ( $Mosaic ) - { - $LayerWidth = $this->GArea_X2-$this->GArea_X1; - $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; - - $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); - $C_White =$this->AllocateColor($this->Layers[0],255,255,255); - imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); - imagecolortransparent($this->Layers[0],$C_White); - - $C_Rectangle =$this->AllocateColor($this->Layers[0],250,250,250); - - $YPos = $LayerHeight; //$this->GArea_Y2-1; - $LastY = $YPos; - for($i=0;$i<=$this->DivisionCount;$i++) - { - $LastY = $YPos; - $YPos = $YPos - $this->DivisionHeight; - - if ( $YPos <= 0 ) { $YPos = 1; } - - if ( $i % 2 == 0 ) - { - imagefilledrectangle($this->Layers[0],1,$YPos,$LayerWidth-1,$LastY,$C_Rectangle); - } - } - imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); - imagedestroy($this->Layers[0]); - } - - /* Horizontal lines */ - $YPos = $this->GArea_Y2 - $this->DivisionHeight; - for($i=1;$i<=$this->DivisionCount;$i++) - { - if ( $YPos > $this->GArea_Y1 && $YPos < $this->GArea_Y2 ) - $this->drawDottedLine($this->GArea_X1,$YPos,$this->GArea_X2,$YPos,$LineWidth,$R,$G,$B); - - $YPos = $YPos - $this->DivisionHeight; - } - - /* Vertical lines */ - if ( $this->GAreaXOffset == 0 ) - { $XPos = $this->GArea_X1 + $this->DivisionWidth + $this->GAreaXOffset; $ColCount = $this->DataCount-2; } - else - { $XPos = $this->GArea_X1 + $this->GAreaXOffset; $ColCount = floor( ($this->GArea_X2 - $this->GArea_X1) / $this->DivisionWidth ); } - - for($i=1;$i<=$ColCount;$i++) - { - if ( $XPos > $this->GArea_X1 && $XPos < $this->GArea_X2 ) - $this->drawDottedLine(floor($XPos),$this->GArea_Y1,floor($XPos),$this->GArea_Y2,$LineWidth,$R,$G,$B); - $XPos = $XPos + $this->DivisionWidth; - } - } - - /* retrieve the legends size */ - function getLegendBoxSize($DataDescription) - { - if ( !isset($DataDescription["Description"]) ) - return(-1); - - /* <-10->[8]<-4->Text<-10-> */ - $MaxWidth = 0; $MaxHeight = 8; - foreach($DataDescription["Description"] as $Key => $Value) - { - $Position = @imageftbbox($this->FontSize,0,$this->FontName,$Value); - $TextWidth = $Position[2]-$Position[0]; - $TextHeight = $Position[1]-$Position[7]; - if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } - $MaxHeight = $MaxHeight + $TextHeight + 4; - } - $MaxHeight = $MaxHeight - 3; - $MaxWidth = $MaxWidth + 32; - - return(array($MaxWidth,$MaxHeight)); - } - - /* Draw the data legends */ - function drawLegend($XPos,$YPos,$DataDescription,$R,$G,$B,$Rs=-1,$Gs=-1,$Bs=-1,$Rt=0,$Gt=0,$Bt=0,$Border=TRUE) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawLegend",$DataDescription); - - if ( !isset($DataDescription["Description"]) ) - return(-1); - - $C_TextColor =$this->AllocateColor($this->Picture,$Rt,$Gt,$Bt); - - /* <-10->[8]<-4->Text<-10-> */ - $MaxWidth = 0; $MaxHeight = 8; - foreach($DataDescription["Description"] as $Key => $Value) - { - $Position = @imageftbbox($this->FontSize,0,$this->FontName,$Value); - $TextWidth = $Position[2]-$Position[0]; - $TextHeight = $Position[1]-$Position[7]; - if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } - $MaxHeight = $MaxHeight + $TextHeight + 4; - } - $MaxHeight = $MaxHeight - 5; - $MaxWidth = $MaxWidth + 32; - - if ( $Rs == -1 || $Gs == -1 || $Bs == -1 ) - { $Rs = $R-30; $Gs = $G-30; $Bs = $B-30; } - - if ( $Border ) - { - $this->drawFilledRoundedRectangle($XPos+1,$YPos+1,$XPos+$MaxWidth+1,$YPos+$MaxHeight+1,5,$Rs,$Gs,$Bs); - $this->drawFilledRoundedRectangle($XPos,$YPos,$XPos+$MaxWidth,$YPos+$MaxHeight,5,$R,$G,$B); - } - - $YOffset = 4 + $this->FontSize; $ID = 0; - foreach($DataDescription["Description"] as $Key => $Value) - { - $this->drawFilledRoundedRectangle($XPos+10,$YPos+$YOffset-4,$XPos+14,$YPos+$YOffset-4,2,$this->Palette[$ID]["R"],$this->Palette[$ID]["G"],$this->Palette[$ID]["B"]); - @imagettftext($this->Picture,$this->FontSize,0,$XPos+22,$YPos+$YOffset,$C_TextColor,$this->FontName,$Value); - - $Position = @imageftbbox($this->FontSize,0,$this->FontName,$Value); - $TextHeight = $Position[1]-$Position[7]; - - $YOffset = $YOffset + $TextHeight + 4; - $ID++; - } - } - - /* Draw the data legends */ - function drawPieLegend($XPos,$YPos,$Data,$DataDescription,$R,$G,$B) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawPieLegend",$DataDescription,FALSE); - $this->validateData("drawPieLegend",$Data); - - if ( !isset($DataDescription["Position"]) ) - return(-1); - - $C_TextColor =$this->AllocateColor($this->Picture,1,1,1); - - /* <-10->[8]<-4->Text<-10-> */ - $MaxWidth = 0; $MaxHeight = 8; - foreach($Data as $Key => $Value) - { - $Value2 = $Value[$DataDescription["Position"]]; - $Position = @imageftbbox($this->FontSize,0,$this->FontName,$Value2); - $TextWidth = $Position[2]-$Position[0]; - $TextHeight = $Position[1]-$Position[7]; - if ( $TextWidth > $MaxWidth) { $MaxWidth = $TextWidth; } - - $MaxHeight = $MaxHeight + $TextHeight + 4; - } - $MaxHeight = $MaxHeight - 3; - $MaxWidth = $MaxWidth + 32; - - $this->drawFilledRoundedRectangle($XPos+1,$YPos+1,$XPos+$MaxWidth+1,$YPos+$MaxHeight+1,5,$R-30,$G-30,$B-30); - $this->drawFilledRoundedRectangle($XPos,$YPos,$XPos+$MaxWidth,$YPos+$MaxHeight,5,$R,$G,$B); - - $YOffset = 4 + $this->FontSize; $ID = 0; - foreach($Data as $Key => $Value) - { - $Value2 = $Value[$DataDescription["Position"]]; - $Position = @imageftbbox($this->FontSize,0,$this->FontName,$Value2); - $TextHeight = $Position[1]-$Position[7]; - $this->drawFilledRectangle($XPos+10,$YPos+$YOffset-6,$XPos+14,$YPos+$YOffset-2,$this->Palette[$ID]["R"],$this->Palette[$ID]["G"],$this->Palette[$ID]["B"]); - - @imagettftext($this->Picture,$this->FontSize,0,$XPos+22,$YPos+$YOffset,$C_TextColor,$this->FontName,$Value2); - $YOffset = $YOffset + $TextHeight + 4; - $ID++; - } - } - - /* Draw the graph title */ - function drawTitle($XPos,$YPos,$Value,$R,$G,$B,$XPos2=-1,$YPos2=-1,$Shadow=FALSE) - { - $C_TextColor = $this->AllocateColor($this->Picture,$R,$G,$B); - - if ( $XPos2 != -1 ) - { - $Position = @imageftbbox($this->FontSize,0,$this->FontName,$Value); - $TextWidth = $Position[2]-$Position[0]; - $XPos = floor(( $XPos2 - $XPos - $TextWidth ) / 2 ) + $XPos; - } - - if ( $YPos2 != -1 ) - { - $Position = imageftbbox($this->FontSize,0,$this->FontName,$Value); - $TextHeight = $Position[5]-$Position[3]; - $YPos = floor(( $YPos2 - $YPos - $TextHeight ) / 2 ) + $YPos; - } - - if ( $Shadow ) - { - $C_ShadowColor = $this->AllocateColor($this->Picture,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor); - imagettftext($this->Picture,$this->FontSize,0,$XPos+$this->ShadowXDistance,$YPos+$this->ShadowYDistance,$C_ShadowColor,$this->FontName,$Value); - } - - imagettftext($this->Picture,$this->FontSize,0,$XPos,$YPos,$C_TextColor,$this->FontName,$Value); - } - - /* Draw a text box with text align & alpha properties */ - function drawTextBox($X1,$Y1,$X2,$Y2,$Text,$Angle=0,$R=255,$G=255,$B=255,$Align=ALIGN_LEFT,$Shadow=TRUE,$BgR=-1,$BgG=-1,$BgB=-1,$Alpha=100) - { - $Position = imageftbbox($this->FontSize,$Angle,$this->FontName,$Text); - $TextWidth = $Position[2]-$Position[0]; - $TextHeight = $Position[5]-$Position[3]; - $AreaWidth = $X2 - $X1; - $AreaHeight = $Y2 - $Y1; - - if ( $BgR != -1 && $BgG != -1 && $BgB != -1 ) - $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$BgR,$BgG,$BgB,FALSE,$Alpha); - - if ( $Align == ALIGN_TOP_LEFT ) { $X = $X1+1; $Y = $Y1+$this->FontSize+1; } - if ( $Align == ALIGN_TOP_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y1+$this->FontSize+1; } - if ( $Align == ALIGN_TOP_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y1+$this->FontSize+1; } - if ( $Align == ALIGN_LEFT ) { $X = $X1+1; $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } - if ( $Align == ALIGN_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } - if ( $Align == ALIGN_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y1+($AreaHeight/2)-($TextHeight/2); } - if ( $Align == ALIGN_BOTTOM_LEFT ) { $X = $X1+1; $Y = $Y2-1; } - if ( $Align == ALIGN_BOTTOM_CENTER ) { $X = $X1+($AreaWidth/2)-($TextWidth/2); $Y = $Y2-1; } - if ( $Align == ALIGN_BOTTOM_RIGHT ) { $X = $X2-$TextWidth-1; $Y = $Y2-1; } - - $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); - $C_ShadowColor =$this->AllocateColor($this->Picture,0,0,0); - if ( $Shadow ) - imagettftext($this->Picture,$this->FontSize,$Angle,$X+1,$Y+1,$C_ShadowColor,$this->FontName,$Text); - - imagettftext($this->Picture,$this->FontSize,$Angle,$X,$Y,$C_TextColor,$this->FontName,$Text); - } - - /* Compute and draw the scale */ - function drawTreshold($Value,$R,$G,$B,$ShowLabel=FALSE,$ShowOnRight=FALSE,$TickWidth=4,$FreeText=NULL) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $C_TextColor =$this->AllocateColor($this->Picture,$R,$G,$B); - $Y = $this->GArea_Y2 - ($Value - $this->VMin) * $this->DivisionRatio; - - if ( $Y <= $this->GArea_Y1 || $Y >= $this->GArea_Y2 ) - return(-1); - - if ( $TickWidth == 0 ) - $this->drawLine($this->GArea_X1,$Y,$this->GArea_X2,$Y,$R,$G,$B); - else - $this->drawDottedLine($this->GArea_X1,$Y,$this->GArea_X2,$Y,$TickWidth,$R,$G,$B); - - if ( $ShowLabel ) - { - if ( $FreeText == NULL ) - { $Label = $Value; } else { $Label = $FreeText; } - - if ( $ShowOnRight ) - imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X2+2,$Y+($this->FontSize/2),$C_TextColor,$this->FontName,$Label); - else - imagettftext($this->Picture,$this->FontSize,0,$this->GArea_X1+2,$Y-($this->FontSize/2),$C_TextColor,$this->FontName,$Label); - } - } - - /* This function put a label on a specific point */ - function setLabel($Data,$DataDescription,$SerieName,$ValueName,$Caption,$R=210,$G=210,$B=210) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("setLabel",$DataDescription); - $this->validateData("setLabel",$Data); - $ShadowFactor = 100; - $C_Label =$this->AllocateColor($this->Picture,$R,$G,$B); - $C_Shadow =$this->AllocateColor($this->Picture,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); - $C_TextColor =$this->AllocateColor($this->Picture,0,0,0); - - $Cp = 0; $Found = FALSE; - foreach ( $Data as $Key => $Value ) - { - if ( $Data[$Key][$DataDescription["Position"]] == $ValueName ) - { $NumericalValue = $Data[$Key][$SerieName]; $Found = TRUE; } - if ( !$Found ) - $Cp++; - } - - $XPos = $this->GArea_X1 + $this->GAreaXOffset + ( $this->DivisionWidth * $Cp ) + 2; - $YPos = $this->GArea_Y2 - ($NumericalValue - $this->VMin) * $this->DivisionRatio; - - $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); - $TextHeight = $Position[3] - $Position[5]; - $TextWidth = $Position[2]-$Position[0] + 2; - $TextOffset = floor($TextHeight/2); - - // Shadow - $Poly = array($XPos+1,$YPos+1,$XPos + 9,$YPos - $TextOffset,$XPos + 8,$YPos + $TextOffset + 2); - imagefilledpolygon($this->Picture,$Poly,3,$C_Shadow); - $this->drawLine($XPos,$YPos+1,$XPos + 9,$YPos - $TextOffset - .2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); - $this->drawLine($XPos,$YPos+1,$XPos + 9,$YPos + $TextOffset + 2.2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); - $this->drawFilledRectangle($XPos + 9,$YPos - $TextOffset-.2,$XPos + 13 + $TextWidth,$YPos + $TextOffset + 2.2,$R-$ShadowFactor,$G-$ShadowFactor,$B-$ShadowFactor); - - // Label background - $Poly = array($XPos,$YPos,$XPos + 8,$YPos - $TextOffset - 1,$XPos + 8,$YPos + $TextOffset + 1); - imagefilledpolygon($this->Picture,$Poly,3,$C_Label); - $this->drawLine($XPos-1,$YPos,$XPos + 8,$YPos - $TextOffset - 1.2,$R,$G,$B); - $this->drawLine($XPos-1,$YPos,$XPos + 8,$YPos + $TextOffset + 1.2,$R,$G,$B); - $this->drawFilledRectangle($XPos + 8,$YPos - $TextOffset - 1.2,$XPos + 12 + $TextWidth,$YPos + $TextOffset + 1.2,$R,$G,$B); - - imagettftext($this->Picture,$this->FontSize,0,$XPos + 10,$YPos + $TextOffset,$C_TextColor,$this->FontName,$Caption); - } - - /* This function draw a plot graph */ - function drawPlotGraph($Data,$DataDescription,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=FALSE) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawPlotGraph",$DataDescription); - $this->validateData("drawPlotGraph",$Data); - - $GraphID = 0; - $Ro = $R2; $Go = $G2; $Bo = $B2; - - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $R = $this->Palette[$ColorID]["R"]; - $G = $this->Palette[$ColorID]["G"]; - $B = $this->Palette[$ColorID]["B"]; - $R2 = $Ro; $G2 = $Go; $B2 = $Bo; - - if ( isset($DataDescription["Symbol"][$ColName]) ) - { - $Is_Alpha = ((ord ( file_get_contents ($DataDescription["Symbol"][$ColName], false, null, 25, 1)) & 6) & 4) == 4; - - $Infos = getimagesize($DataDescription["Symbol"][$ColName]); - $ImageWidth = $Infos[0]; - $ImageHeight = $Infos[1]; - $Symbol = imagecreatefromgif($DataDescription["Symbol"][$ColName]); - } - - $XPos = $this->GArea_X1 + $this->GAreaXOffset; - $Hsize = round($BigRadius/2); - $R3 = -1; $G3 = -1; $B3 = -1; - foreach ( $Data as $Key => $Values ) - { - $Value = $Data[$Key][$ColName]; - $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); - - /* Save point into the image map if option activated */ - if ( $this->BuildMap ) - $this->addToImageMap($XPos-$Hsize,$YPos-$Hsize,$XPos+1+$Hsize,$YPos+$Hsize+1,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Plot"); - - if ( is_numeric($Value) ) - { - if ( !isset($DataDescription["Symbol"][$ColName]) ) - { - - if ( $Shadow ) - { - if ( $R3 !=-1 && $G3 !=-1 && $B3 !=-1 ) - $this->drawFilledCircle($XPos+2,$YPos+2,$BigRadius,$R3,$G3,$B3); - else - { - $R3 = $this->Palette[$ColorID]["R"]-20; if ( $R3 < 0 ) { $R3 = 0; } - $G3 = $this->Palette[$ColorID]["G"]-20; if ( $G3 < 0 ) { $G3 = 0; } - $B3 = $this->Palette[$ColorID]["B"]-20; if ( $B3 < 0 ) { $B3 = 0; } - $this->drawFilledCircle($XPos+2,$YPos+2,$BigRadius,$R3,$G3,$B3); - } - } - - $this->drawFilledCircle($XPos+1,$YPos+1,$BigRadius,$R,$G,$B); - - if ( $SmallRadius != 0 ) - { - if ( $R2 !=-1 && $G2 !=-1 && $B2 !=-1 ) - $this->drawFilledCircle($XPos+1,$YPos+1,$SmallRadius,$R2,$G2,$B2); - else - { - $R2 = $this->Palette[$ColorID]["R"]-15; if ( $R2 < 0 ) { $R2 = 0; } - $G2 = $this->Palette[$ColorID]["G"]-15; if ( $G2 < 0 ) { $G2 = 0; } - $B2 = $this->Palette[$ColorID]["B"]-15; if ( $B2 < 0 ) { $B2 = 0; } - - $this->drawFilledCircle($XPos+1,$YPos+1,$SmallRadius,$R2,$G2,$B2); - } - } - } - else - { - imagecopymerge($this->Picture,$Symbol,$XPos+1-$ImageWidth/2,$YPos+1-$ImageHeight/2,0,0,$ImageWidth,$ImageHeight,100); - } - } - - $XPos = $XPos + $this->DivisionWidth; - } - $GraphID++; - } - } - - /* This function draw a plot graph in an X/Y space */ - function drawXYPlotGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0,$BigRadius=5,$SmallRadius=2,$R2=-1,$G2=-1,$B2=-1,$Shadow=TRUE) - { - $R = $this->Palette[$PaletteID]["R"]; - $G = $this->Palette[$PaletteID]["G"]; - $B = $this->Palette[$PaletteID]["B"]; - $R3 = -1; $G3 = -1; $B3 = -1; - - $YLast = -1; $XLast = -1; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$YSerieName]) && isset($Data[$Key][$XSerieName]) ) - { - $X = $Data[$Key][$XSerieName]; - $Y = $Data[$Key][$YSerieName]; - - $Y = $this->GArea_Y2 - (($Y-$this->VMin) * $this->DivisionRatio); - $X = $this->GArea_X1 + (($X-$this->VMin) * $this->XDivisionRatio); - - if ( $Shadow ) - { - if ( $R3 !=-1 && $G3 !=-1 && $B3 !=-1 ) - $this->drawFilledCircle($X+2,$Y+2,$BigRadius,$R3,$G3,$B3); - else - { - $R3 = $this->Palette[$PaletteID]["R"]-20; if ( $R < 0 ) { $R = 0; } - $G3 = $this->Palette[$PaletteID]["G"]-20; if ( $G < 0 ) { $G = 0; } - $B3 = $this->Palette[$PaletteID]["B"]-20; if ( $B < 0 ) { $B = 0; } - $this->drawFilledCircle($X+2,$Y+2,$BigRadius,$R3,$G3,$B3); - } - } - - $this->drawFilledCircle($X+1,$Y+1,$BigRadius,$R,$G,$B); - - if ( $R2 !=-1 && $G2 !=-1 && $B2 !=-1 ) - $this->drawFilledCircle($X+1,$Y+1,$SmallRadius,$R2,$G2,$B2); - else - { - $R2 = $this->Palette[$PaletteID]["R"]+20; if ( $R > 255 ) { $R = 255; } - $G2 = $this->Palette[$PaletteID]["G"]+20; if ( $G > 255 ) { $G = 255; } - $B2 = $this->Palette[$PaletteID]["B"]+20; if ( $B > 255 ) { $B = 255; } - $this->drawFilledCircle($X+1,$Y+1,$SmallRadius,$R2,$G2,$B2); - } - } - } - - } - - /* This function draw an area between two series */ - function drawArea($Data,$Serie1,$Serie2,$R,$G,$B,$Alpha = 50) - { - /* Validate the Data and DataDescription array */ - $this->validateData("drawArea",$Data); - - $LayerWidth = $this->GArea_X2-$this->GArea_X1; - $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; - - $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); - $C_White =$this->AllocateColor($this->Layers[0],255,255,255); - imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); - imagecolortransparent($this->Layers[0],$C_White); - - $C_Graph =$this->AllocateColor($this->Layers[0],$R,$G,$B); - - $XPos = $this->GAreaXOffset; - $LastXPos = -1; - foreach ( $Data as $Key => $Values ) - { - $Value1 = $Data[$Key][$Serie1]; - $Value2 = $Data[$Key][$Serie2]; - $YPos1 = $LayerHeight - (($Value1-$this->VMin) * $this->DivisionRatio); - $YPos2 = $LayerHeight - (($Value2-$this->VMin) * $this->DivisionRatio); - - if ( $LastXPos != -1 ) - { - $Points = ""; - $Points[] = $LastXPos; $Points[] = $LastYPos1; - $Points[] = $LastXPos; $Points[] = $LastYPos2; - $Points[] = $XPos; $Points[] = $YPos2; - $Points[] = $XPos; $Points[] = $YPos1; - - imagefilledpolygon($this->Layers[0],$Points,4,$C_Graph); - } - - $LastYPos1 = $YPos1; - $LastYPos2 = $YPos2; - $LastXPos = $XPos; - - $XPos = $XPos + $this->DivisionWidth; - } - - imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); - imagedestroy($this->Layers[0]); - } - - - /* This function write the values of the specified series */ - function writeValues($Data,$DataDescription,$Series) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("writeValues",$DataDescription); - $this->validateData("writeValues",$Data); - - if ( !is_array($Series) ) { $Series = array($Series); } - - foreach($Series as $Key => $Serie) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $Serie ) { $ColorID = $ID; }; $ID++; } - - $XPos = $this->GArea_X1 + $this->GAreaXOffset; - $XLast = -1; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$Serie]) && is_numeric($Data[$Key][$Serie])) - { - $Value = $Data[$Key][$Serie]; - $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); - - $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$Value); - $Width = $Positions[2] - $Positions[6]; $XOffset = $XPos - ($Width/2); - $Height = $Positions[3] - $Positions[7]; $YOffset = $YPos - 4; - - $C_TextColor =$this->AllocateColor($this->Picture,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - imagettftext($this->Picture,$this->FontSize,0,$XOffset,$YOffset,$C_TextColor,$this->FontName,$Value); - } - $XPos = $XPos + $this->DivisionWidth; - } - - } - } - - /* This function draw a line graph */ - function drawLineGraph($Data,$DataDescription,$SerieName="") - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawLineGraph",$DataDescription); - $this->validateData("drawLineGraph",$Data); - - $GraphID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - if ( $SerieName == "" || $SerieName == $ColName ) - { - $XPos = $this->GArea_X1 + $this->GAreaXOffset; - $XLast = -1; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - { - $Value = $Data[$Key][$ColName]; - $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); - - /* Save point into the image map if option activated */ - if ( $this->BuildMap ) - $this->addToImageMap($XPos-3,$YPos-3,$XPos+3,$YPos+3,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Line"); - - if (!is_numeric($Value)) { $XLast = -1; } - if ( $XLast != -1 ) - $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); - - $XLast = $XPos; - $YLast = $YPos; - if (!is_numeric($Value)) { $XLast = -1; } - } - $XPos = $XPos + $this->DivisionWidth; - } - $GraphID++; - } - } - } - - /* This function draw a line graph */ - function drawXYGraph($Data,$DataDescription,$YSerieName,$XSerieName,$PaletteID=0) - { - $YLast = -1; $XLast = -1; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$YSerieName]) && isset($Data[$Key][$XSerieName]) ) - { - $X = $Data[$Key][$XSerieName]; - $Y = $Data[$Key][$YSerieName]; - - $Y = $this->GArea_Y2 - (($Y-$this->VMin) * $this->DivisionRatio); - $X = $this->GArea_X1 + (($X-$this->VXMin) * $this->XDivisionRatio); - - if ($XLast != -1 && $YLast != -1) - { - $this->drawLine($XLast,$YLast,$X,$Y,$this->Palette[$PaletteID]["R"],$this->Palette[$PaletteID]["G"],$this->Palette[$PaletteID]["B"],TRUE); - } - - $XLast = $X; - $YLast = $Y; - } - } - } - - /* This function draw a cubic curve */ - function drawCubicCurve($Data,$DataDescription,$Accuracy=.1,$SerieName="") - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawCubicCurve",$DataDescription); - $this->validateData("drawCubicCurve",$Data); - - $GraphID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - if ( $SerieName == "" || $SerieName == $ColName ) - { - $XIn = ""; $Yin = ""; $Yt = ""; $U = ""; - $XIn[0] = 0; $YIn[0] = 0; - - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $Index = 1; - $XLast = -1; $Missing = ""; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName]) ) - { - $Value = $Data[$Key][$ColName]; - $XIn[$Index] = $Index; - $YIn[$Index] = $Value; - if ( !is_numeric($Value) ) { $Missing[$Index] = TRUE; } - $Index++; - } - } - $Index--; - - $Yt[0] = 0; - $Yt[1] = 0; - $U[1] = 0; - for($i=2;$i<=$Index-1;$i++) - { - $Sig = ($XIn[$i] - $XIn[$i-1]) / ($XIn[$i+1] - $XIn[$i-1]); - $p = $Sig * $Yt[$i-1] + 2; - $Yt[$i] = ($Sig - 1) / $p; - $U[$i] = ($YIn[$i+1] - $YIn[$i]) / ($XIn[$i+1] - $XIn[$i]) - ($YIn[$i] - $YIn[$i-1]) / ($XIn[$i] - $XIn[$i-1]); - $U[$i] = (6 * $U[$i] / ($XIn[$i+1] - $XIn[$i-1]) - $Sig * $U[$i-1]) / $p; - } - - $qn = 0; - $un = 0; - $Yt[$Index] = ($un - $qn * $U[$Index-1]) / ($qn * $Yt[$Index-1] + 1); - - for($k=$Index-1;$k>=1;$k--) - $Yt[$k] = $Yt[$k] * $Yt[$k+1] + $U[$k]; - - $XPos = $this->GArea_X1 + $this->GAreaXOffset; - for($X=1;$X<=$Index;$X=$X+$Accuracy) - { - $klo = 1; - $khi = $Index; - $k = $khi - $klo; - while($k > 1) - { - $k = $khi - $klo; - If ( $XIn[$k] >= $X ) - $khi = $k; - else - $klo = $k; - } - $klo = $khi - 1; - - $h = $XIn[$khi] - $XIn[$klo]; - $a = ($XIn[$khi] - $X) / $h; - $b = ($X - $XIn[$klo]) / $h; - $Value = $a * $YIn[$klo] + $b * $YIn[$khi] + (($a*$a*$a - $a) * $Yt[$klo] + ($b*$b*$b - $b) * $Yt[$khi]) * ($h*$h) / 6; - - $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); - - if ( $XLast != -1 && !isset($Missing[floor($X)]) && !isset($Missing[floor($X+1)]) ) - $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); - - $XLast = $XPos; - $YLast = $YPos; - $XPos = $XPos + $this->DivisionWidth * $Accuracy; - } - - // Add potentialy missing values - $XPos = $XPos - $this->DivisionWidth * $Accuracy; - if ( $XPos < ($this->GArea_X2 - $this->GAreaXOffset) ) - { - $YPos = $this->GArea_Y2 - (($YIn[$Index]-$this->VMin) * $this->DivisionRatio); - $this->drawLine($XLast,$YLast,$this->GArea_X2-$this->GAreaXOffset,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); - } - - $GraphID++; - } - } - } - - /* This function draw a filled cubic curve */ - function drawFilledCubicCurve($Data,$DataDescription,$Accuracy=.1,$Alpha=100,$AroundZero=FALSE) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawFilledCubicCurve",$DataDescription); - $this->validateData("drawFilledCubicCurve",$Data); - - $LayerWidth = $this->GArea_X2-$this->GArea_X1; - $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; - $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); - if ( $YZero > $LayerHeight ) { $YZero = $LayerHeight; } - - $GraphID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $XIn = ""; $Yin = ""; $Yt = ""; $U = ""; - $XIn[0] = 0; $YIn[0] = 0; - - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $Index = 1; - $XLast = -1; $Missing = ""; - foreach ( $Data as $Key => $Values ) - { - $Value = $Data[$Key][$ColName]; - $XIn[$Index] = $Index; - $YIn[$Index] = $Value; - if ( !is_numeric($Value) ) { $Missing[$Index] = TRUE; } - $Index++; - } - $Index--; - - $Yt[0] = 0; - $Yt[1] = 0; - $U[1] = 0; - for($i=2;$i<=$Index-1;$i++) - { - $Sig = ($XIn[$i] - $XIn[$i-1]) / ($XIn[$i+1] - $XIn[$i-1]); - $p = $Sig * $Yt[$i-1] + 2; - $Yt[$i] = ($Sig - 1) / $p; - $U[$i] = ($YIn[$i+1] - $YIn[$i]) / ($XIn[$i+1] - $XIn[$i]) - ($YIn[$i] - $YIn[$i-1]) / ($XIn[$i] - $XIn[$i-1]); - $U[$i] = (6 * $U[$i] / ($XIn[$i+1] - $XIn[$i-1]) - $Sig * $U[$i-1]) / $p; - } - - $qn = 0; - $un = 0; - $Yt[$Index] = ($un - $qn * $U[$Index-1]) / ($qn * $Yt[$Index-1] + 1); - - for($k=$Index-1;$k>=1;$k--) - $Yt[$k] = $Yt[$k] * $Yt[$k+1] + $U[$k]; - - $Points = ""; - $Points[] = $this->GAreaXOffset; - $Points[] = $LayerHeight; - - $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); - $C_White =$this->AllocateColor($this->Layers[0],255,255,255); - imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); - imagecolortransparent($this->Layers[0],$C_White); - - $YLast = NULL; - $XPos = $this->GAreaXOffset; $PointsCount = 2; - for($X=1;$X<=$Index;$X=$X+$Accuracy) - { - $klo = 1; - $khi = $Index; - $k = $khi - $klo; - while($k > 1) - { - $k = $khi - $klo; - If ( $XIn[$k] >= $X ) - $khi = $k; - else - $klo = $k; - } - $klo = $khi - 1; - - $h = $XIn[$khi] - $XIn[$klo]; - $a = ($XIn[$khi] - $X) / $h; - $b = ($X - $XIn[$klo]) / $h; - $Value = $a * $YIn[$klo] + $b * $YIn[$khi] + (($a*$a*$a - $a) * $Yt[$klo] + ($b*$b*$b - $b) * $Yt[$khi]) * ($h*$h) / 6; - - $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); - - if ( $YLast != NULL && $AroundZero && !isset($Missing[floor($X)]) && !isset($Missing[floor($X+1)])) - { - $aPoints = ""; - $aPoints[] = $XLast; - $aPoints[] = $YLast; - $aPoints[] = $XPos; - $aPoints[] = $YPos; - $aPoints[] = $XPos; - $aPoints[] = $YZero; - $aPoints[] = $XLast; - $aPoints[] = $YZero; - - $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - imagefilledpolygon($this->Layers[0],$aPoints,4,$C_Graph); - } - - if ( !isset($Missing[floor($X)]) || $YLast == NULL ) - { - $PointsCount++; - $Points[] = $XPos; - $Points[] = $YPos; - } - else - { - $PointsCount++; $Points[] = $XLast; $Points[] = $LayerHeight; - } - - $YLast = $YPos; $XLast = $XPos; - $XPos = $XPos + $this->DivisionWidth * $Accuracy; - } - - // Add potentialy missing values - $XPos = $XPos - $this->DivisionWidth * $Accuracy; - if ( $XPos < ($LayerWidth-$this->GAreaXOffset) ) - { - $YPos = $LayerHeight - (($YIn[$Index]-$this->VMin) * $this->DivisionRatio); - - if ( $YLast != NULL && $AroundZero ) - { - $aPoints = ""; - $aPoints[] = $XLast; - $aPoints[] = $YLast; - $aPoints[] = $LayerWidth-$this->GAreaXOffset; - $aPoints[] = $YPos; - $aPoints[] = $LayerWidth-$this->GAreaXOffset; - $aPoints[] = $YZero; - $aPoints[] = $XLast; - $aPoints[] = $YZero; - - $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - imagefilledpolygon($this->Layers[0],$aPoints,4,$C_Graph); - } - - if ( $YIn[$klo] != "" && $YIn[$khi] != "" || $YLast == NULL ) - { - $PointsCount++; - $Points[] = $LayerWidth-$this->GAreaXOffset; - $Points[] = $YPos; - } - } - - $Points[] = $LayerWidth-$this->GAreaXOffset; - $Points[] = $LayerHeight; - - if ( !$AroundZero ) - { - $C_Graph =$this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - imagefilledpolygon($this->Layers[0],$Points,$PointsCount,$C_Graph); - } - - imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); - imagedestroy($this->Layers[0]); - - $this->drawCubicCurve($Data,$DataDescription,$Accuracy,$ColName); - - $GraphID++; - } - } - - /* This function draw a filled line graph */ - function drawFilledLineGraph($Data,$DataDescription,$Alpha=100,$AroundZero=FALSE) - { - $Empty = -2147483647; - - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawFilledLineGraph",$DataDescription); - $this->validateData("drawFilledLineGraph",$Data); - - $LayerWidth = $this->GArea_X2-$this->GArea_X1; - $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; - - $GraphID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $aPoints = ""; - $aPoints[] = $this->GAreaXOffset; - $aPoints[] = $LayerHeight; - - $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); - $C_White = $this->AllocateColor($this->Layers[0],255,255,255); - imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); - imagecolortransparent($this->Layers[0],$C_White); - - $XPos = $this->GAreaXOffset; - $XLast = -1; $PointsCount = 2; - $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); - if ( $YZero > $LayerHeight ) { $YZero = $LayerHeight; } - - $YLast = $Empty; - foreach ( $Data as $Key => $Values ) - { - $Value = $Data[$Key][$ColName]; - $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); - - /* Save point into the image map if option activated */ - if ( $this->BuildMap ) - $this->addToImageMap($XPos-3,$YPos-3,$XPos+3,$YPos+3,$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"FLine"); - - if ( !is_numeric($Value) ) - { - $PointsCount++; - $aPoints[] = $XLast; - $aPoints[] = $LayerHeight; - - $YLast = $Empty; - } - else - { - $PointsCount++; - if ( $YLast <> $Empty ) - { $aPoints[] = $XPos; $aPoints[] = $YPos; } - else - { $PointsCount++; $aPoints[] = $XPos; $aPoints[] = $LayerHeight; $aPoints[] = $XPos; $aPoints[] = $YPos; } - - if ($YLast <> $Empty && $AroundZero) - { - $Points = ""; - $Points[] = $XLast; $Points[] = $YLast; - $Points[] = $XPos; - $Points[] = $YPos; - $Points[] = $XPos; - $Points[] = $YZero; - $Points[] = $XLast; - $Points[] = $YZero; - - $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - imagefilledpolygon($this->Layers[0],$Points,4,$C_Graph); - } - $YLast = $YPos; - } - - $XLast = $XPos; - $XPos = $XPos + $this->DivisionWidth; - } - $aPoints[] = $LayerWidth - $this->GAreaXOffset; - $aPoints[] = $LayerHeight; - - if ( $AroundZero == FALSE ) - { - $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - imagefilledpolygon($this->Layers[0],$aPoints,$PointsCount,$C_Graph); - } - - imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); - imagedestroy($this->Layers[0]); - $GraphID++; - $this->drawLineGraph($Data,$DataDescription,$ColName); - } - } - - /* This function draw a bar graph */ - function drawOverlayBarGraph($Data,$DataDescription,$Alpha=50) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawOverlayBarGraph",$DataDescription); - $this->validateData("drawOverlayBarGraph",$Data); - - $LayerWidth = $this->GArea_X2-$this->GArea_X1; - $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; - - $GraphID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $this->Layers[$GraphID] = imagecreatetruecolor($LayerWidth,$LayerHeight); - $C_White = $this->AllocateColor($this->Layers[$GraphID],255,255,255); - $C_Graph = $this->AllocateColor($this->Layers[$GraphID],$this->Palette[$GraphID]["R"],$this->Palette[$GraphID]["G"],$this->Palette[$GraphID]["B"]); - imagefilledrectangle($this->Layers[$GraphID],0,0,$LayerWidth,$LayerHeight,$C_White); - imagecolortransparent($this->Layers[$GraphID],$C_White); - - $XWidth = $this->DivisionWidth / 4; - $XPos = $this->GAreaXOffset; - $YZero = $LayerHeight - ((0-$this->VMin) * $this->DivisionRatio); - $XLast = -1; $PointsCount = 2; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName]) ) - { - $Value = $Data[$Key][$ColName]; - if ( is_numeric($Value) ) - { - $YPos = $LayerHeight - (($Value-$this->VMin) * $this->DivisionRatio); - - imagefilledrectangle($this->Layers[$GraphID],$XPos-$XWidth,$YPos,$XPos+$XWidth,$YZero,$C_Graph); - - $X1 = floor($XPos - $XWidth + $this->GArea_X1); $Y1 = floor($YPos+$this->GArea_Y1) + .2; - $X2 = floor($XPos + $XWidth + $this->GArea_X1); $Y2 = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); - if ( $X1 <= $this->GArea_X1 ) { $X1 = $this->GArea_X1 + 1; } - if ( $X2 >= $this->GArea_X2 ) { $X2 = $this->GArea_X2 - 1; } - - /* Save point into the image map if option activated */ - if ( $this->BuildMap ) - $this->addToImageMap($X1,min($Y1,$Y2),$X2,max($Y1,$Y2),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"oBar"); - - $this->drawLine($X1,$Y1,$X2,$Y1,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE); - } - } - $XPos = $XPos + $this->DivisionWidth; - } - - $GraphID++; - } - - for($i=0;$i<=($GraphID-1);$i++) - { - imagecopymerge($this->Picture,$this->Layers[$i],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); - imagedestroy($this->Layers[$i]); - } - } - - /* This function draw a bar graph */ - function drawBarGraph($Data,$DataDescription,$Shadow=FALSE,$Alpha=100) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawBarGraph",$DataDescription); - $this->validateData("drawBarGraph",$Data); - - $GraphID = 0; - $Series = count($DataDescription["Values"]); - $SeriesWidth = $this->DivisionWidth / ($Series+1); - $SerieXOffset = $this->DivisionWidth / 2 - $SeriesWidth / 2; - - $YZero = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); - if ( $YZero > $this->GArea_Y2 ) { $YZero = $this->GArea_Y2; } - - $SerieID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $XPos = $this->GArea_X1 + $this->GAreaXOffset - $SerieXOffset + $SeriesWidth * $SerieID; - $XLast = -1; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - { - if ( is_numeric($Data[$Key][$ColName]) ) - { - $Value = $Data[$Key][$ColName]; - $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); - - /* Save point into the image map if option activated */ - if ( $this->BuildMap ) - { - $this->addToImageMap($XPos+1,min($YZero,$YPos),$XPos+$SeriesWidth-1,max($YZero,$YPos),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"Bar"); - } - - if ( $Shadow && $Alpha == 100 ) - $this->drawRectangle($XPos+1,$YZero,$XPos+$SeriesWidth-1,$YPos,25,25,25,TRUE,$Alpha); - - $this->drawFilledRectangle($XPos+1,$YZero,$XPos+$SeriesWidth-1,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE,$Alpha); - } - } - $XPos = $XPos + $this->DivisionWidth; - } - $SerieID++; - } - } - - /* This function draw a stacked bar graph */ - function drawStackedBarGraph($Data,$DataDescription,$Alpha=50,$Contiguous=FALSE) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawBarGraph",$DataDescription); - $this->validateData("drawBarGraph",$Data); - - $GraphID = 0; - $Series = count($DataDescription["Values"]); - if ( $Contiguous ) - $SeriesWidth = $this->DivisionWidth; - else - $SeriesWidth = $this->DivisionWidth * .8; - - $YZero = $this->GArea_Y2 - ((0-$this->VMin) * $this->DivisionRatio); - if ( $YZero > $this->GArea_Y2 ) { $YZero = $this->GArea_Y2; } - - $SerieID = 0; $LastValue = ""; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $XPos = $this->GArea_X1 + $this->GAreaXOffset - $SeriesWidth / 2; - $XLast = -1; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - { - if ( is_numeric($Data[$Key][$ColName]) ) - { - $Value = $Data[$Key][$ColName]; - - if ( isset($LastValue[$Key]) ) - { - $YPos = $this->GArea_Y2 - ((($Value+$LastValue[$Key])-$this->VMin) * $this->DivisionRatio); - $YBottom = $this->GArea_Y2 - (($LastValue[$Key]-$this->VMin) * $this->DivisionRatio); - $LastValue[$Key] += $Value; - } - else - { - $YPos = $this->GArea_Y2 - (($Value-$this->VMin) * $this->DivisionRatio); - $YBottom = $YZero; - $LastValue[$Key] = $Value; - } - - /* Save point into the image map if option activated */ - if ( $this->BuildMap ) - $this->addToImageMap($XPos+1,min($YBottom,$YPos),$XPos+$SeriesWidth-1,max($YBottom,$YPos),$DataDescription["Description"][$ColName],$Data[$Key][$ColName].$DataDescription["Unit"]["Y"],"sBar"); - - $this->drawFilledRectangle($XPos+1,$YBottom,$XPos+$SeriesWidth-1,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"],TRUE,$Alpha); - } - } - $XPos = $XPos + $this->DivisionWidth; - } - $SerieID++; - } - } - - /* This function draw a limits bar graphs */ - function drawLimitsGraph($Data,$DataDescription,$R=0,$G=0,$B=0) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawLimitsGraph",$DataDescription); - $this->validateData("drawLimitsGraph",$Data); - - $XWidth = $this->DivisionWidth / 4; - $XPos = $this->GArea_X1 + $this->GAreaXOffset; - - foreach ( $Data as $Key => $Values ) - { - $Min = $Data[$Key][$DataDescription["Values"][0]]; - $Max = $Data[$Key][$DataDescription["Values"][0]]; - $GraphID = 0; $MaxID = 0; $MinID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - if ( isset($Data[$Key][$ColName]) ) - { - if ( $Data[$Key][$ColName] > $Max && is_numeric($Data[$Key][$ColName])) - { $Max = $Data[$Key][$ColName]; $MaxID = $GraphID; } - } - if ( isset($Data[$Key][$ColName]) && is_numeric($Data[$Key][$ColName])) - { - if ( $Data[$Key][$ColName] < $Min ) - { $Min = $Data[$Key][$ColName]; $MinID = $GraphID; } - $GraphID++; - } - } - - $YPos = $this->GArea_Y2 - (($Max-$this->VMin) * $this->DivisionRatio); - $X1 = floor($XPos - $XWidth); $Y1 = floor($YPos) - .2; - $X2 = floor($XPos + $XWidth); - if ( $X1 <= $this->GArea_X1 ) { $X1 = $this->GArea_X1 + 1; } - if ( $X2 >= $this->GArea_X2 ) { $X2 = $this->GArea_X2 - 1; } - - $YPos = $this->GArea_Y2 - (($Min-$this->VMin) * $this->DivisionRatio); - $Y2 = floor($YPos) + .2; - - $this->drawLine(floor($XPos)-.2,$Y1+1,floor($XPos)-.2,$Y2-1,$R,$G,$B,TRUE); - $this->drawLine(floor($XPos)+.2,$Y1+1,floor($XPos)+.2,$Y2-1,$R,$G,$B,TRUE); - $this->drawLine($X1,$Y1,$X2,$Y1,$this->Palette[$MaxID]["R"],$this->Palette[$MaxID]["G"],$this->Palette[$MaxID]["B"],FALSE); - $this->drawLine($X1,$Y2,$X2,$Y2,$this->Palette[$MinID]["R"],$this->Palette[$MinID]["G"],$this->Palette[$MinID]["B"],FALSE); - - $XPos = $XPos + $this->DivisionWidth; - } - } - - /* This function draw radar axis centered on the graph area */ - function drawRadarAxis($Data,$DataDescription,$Mosaic=TRUE,$BorderOffset=10,$A_R=60,$A_G=60,$A_B=60,$S_R=200,$S_G=200,$S_B=200,$MaxValue=-1) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawRadarAxis",$DataDescription); - $this->validateData("drawRadarAxis",$Data); - - $C_TextColor = $this->AllocateColor($this->Picture,$A_R,$A_G,$A_B); - - /* Draw radar axis */ - $Points = count($Data); - $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; - $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2 + $this->GArea_X1; - $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 + $this->GArea_Y1; - - /* Search for the max value */ - if ( $MaxValue == -1 ) - { - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - if ( $Data[$Key][$ColName] > $MaxValue ) { $MaxValue = $Data[$Key][$ColName]; } - } - } - } - - /* Draw the mosaic */ - if ( $Mosaic ) - { - $RadiusScale = $Radius / $MaxValue; - for ( $t=1; $t<=$MaxValue-1; $t++) - { - $TRadius = $RadiusScale * $t; - $LastX1 = -1; - - for ( $i=0; $i<=$Points; $i++) - { - $Angle = -90 + $i * 360/$Points; - $X1 = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; - $Y1 = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; - $X2 = cos($Angle * 3.1418 / 180 ) * ($TRadius+$RadiusScale) + $XCenter; - $Y2 = sin($Angle * 3.1418 / 180 ) * ($TRadius+$RadiusScale) + $YCenter; - - if ( $t % 2 == 1 && $LastX1 != -1) - { - $Plots = ""; - $Plots[] = $X1; $Plots[] = $Y1; - $Plots[] = $X2; $Plots[] = $Y2; - $Plots[] = $LastX2; $Plots[] = $LastY2; - $Plots[] = $LastX1; $Plots[] = $LastY1; - - $C_Graph = $this->AllocateColor($this->Picture,250,250,250); - imagefilledpolygon($this->Picture,$Plots,(count($Plots)+1)/2,$C_Graph); - } - - $LastX1 = $X1; $LastY1= $Y1; - $LastX2 = $X2; $LastY2= $Y2; - } - } - } - - - /* Draw the spider web */ - for ( $t=1; $t<=$MaxValue; $t++) - { - $TRadius = ( $Radius / $MaxValue ) * $t; - $LastX = -1; - - for ( $i=0; $i<=$Points; $i++) - { - $Angle = -90 + $i * 360/$Points; - $X = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; - $Y = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; - - if ( $LastX != -1 ) - $this->drawDottedLine($LastX,$LastY,$X,$Y,4,$S_R,$S_G,$S_B); - - $LastX = $X; $LastY= $Y; - } - } - - /* Draw the axis */ - for ( $i=0; $i<=$Points; $i++) - { - $Angle = -90 + $i * 360/$Points; - $X = cos($Angle * 3.1418 / 180 ) * $Radius + $XCenter; - $Y = sin($Angle * 3.1418 / 180 ) * $Radius + $YCenter; - - $this->drawLine($XCenter,$YCenter,$X,$Y,$A_R,$A_G,$A_B); - - $XOffset = 0; $YOffset = 0; - if (isset($Data[$i][$DataDescription["Position"]])) - { - $Label = $Data[$i][$DataDescription["Position"]]; - - $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$Label); - $Width = $Positions[2] - $Positions[6]; - $Height = $Positions[3] - $Positions[7]; - - if ( $Angle >= 0 && $Angle <= 90 ) - $YOffset = $Height; - - if ( $Angle > 90 && $Angle <= 180 ) - { $YOffset = $Height; $XOffset = -$Width; } - - if ( $Angle > 180 && $Angle <= 270 ) - { $XOffset = -$Width; } - - imagettftext($this->Picture,$this->FontSize,0,$X+$XOffset,$Y+$YOffset,$C_TextColor,$this->FontName,$Label); - } - } - - /* Write the values */ - for ( $t=1; $t<=$MaxValue; $t++) - { - $TRadius = ( $Radius / $MaxValue ) * $t; - - $Angle = -90 + 360 / $Points; - $X1 = $XCenter; - $Y1 = $YCenter - $TRadius; - $X2 = cos($Angle * 3.1418 / 180 ) * $TRadius + $XCenter; - $Y2 = sin($Angle * 3.1418 / 180 ) * $TRadius + $YCenter; - - $XPos = floor(($X2-$X1)/2) + $X1; - $YPos = floor(($Y2-$Y1)/2) + $Y1; - - $Positions = imagettfbbox($this->FontSize,0,$this->FontName,$t); - $X = $XPos - ( $X+$Positions[2] - $X+$Positions[6] ) / 2; - $Y = $YPos + $this->FontSize; - - $this->drawFilledRoundedRectangle($X+$Positions[6]-2,$Y+$Positions[7]-1,$X+$Positions[2]+4,$Y+$Positions[3]+1,2,240,240,240); - $this->drawRoundedRectangle($X+$Positions[6]-2,$Y+$Positions[7]-1,$X+$Positions[2]+4,$Y+$Positions[3]+1,2,220,220,220); - imagettftext($this->Picture,$this->FontSize,0,$X,$Y,$C_TextColor,$this->FontName,$t); - } - } - - /* This function draw a radar graph centered on the graph area */ - function drawRadar($Data,$DataDescription,$BorderOffset=10,$MaxValue=-1) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawRadar",$DataDescription); - $this->validateData("drawRadar",$Data); - - $Points = count($Data); - $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; - $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2 + $this->GArea_X1; - $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 + $this->GArea_Y1; - - /* Search for the max value */ - if ( $MaxValue == -1 ) - { - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - if ( $Data[$Key][$ColName] > $MaxValue ) { $MaxValue = $Data[$Key][$ColName]; } - } - } - } - - $GraphID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $Angle = -90; - $XLast = -1; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - { - $Value = $Data[$Key][$ColName]; - $Strength = ( $Radius / $MaxValue ) * $Value; - - $XPos = cos($Angle * 3.1418 / 180 ) * $Strength + $XCenter; - $YPos = sin($Angle * 3.1418 / 180 ) * $Strength + $YCenter; - - if ( $XLast != -1 ) - $this->drawLine($XLast,$YLast,$XPos,$YPos,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - - if ( $XLast == -1 ) - { $FirstX = $XPos; $FirstY = $YPos; } - - $Angle = $Angle + (360/$Points); - $XLast = $XPos; - $YLast = $YPos; - } - } - $this->drawLine($XPos,$YPos,$FirstX,$FirstY,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - $GraphID++; - } - } - - /* This function draw a radar graph centered on the graph area */ - function drawFilledRadar($Data,$DataDescription,$Alpha=50,$BorderOffset=10,$MaxValue=-1) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawFilledRadar",$DataDescription); - $this->validateData("drawFilledRadar",$Data); - - $Points = count($Data); - $LayerWidth = $this->GArea_X2-$this->GArea_X1; - $LayerHeight = $this->GArea_Y2-$this->GArea_Y1; - $Radius = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2 - $BorderOffset; - $XCenter = ( $this->GArea_X2 - $this->GArea_X1 ) / 2; - $YCenter = ( $this->GArea_Y2 - $this->GArea_Y1 ) / 2; - - /* Search for the max value */ - if ( $MaxValue == -1 ) - { - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - if ( $Data[$Key][$ColName] > $MaxValue && is_numeric($Data[$Key][$ColName])) { $MaxValue = $Data[$Key][$ColName]; } - } - } - } - - $GraphID = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - $ID = 0; - foreach ( $DataDescription["Description"] as $keyI => $ValueI ) - { if ( $keyI == $ColName ) { $ColorID = $ID; }; $ID++; } - - $Angle = -90; - $XLast = -1; - $Plots = ""; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - { - $Value = $Data[$Key][$ColName]; - if ( !is_numeric($Value) ) { $Value = 0; } - $Strength = ( $Radius / $MaxValue ) * $Value; - - $XPos = cos($Angle * 3.1418 / 180 ) * $Strength + $XCenter; - $YPos = sin($Angle * 3.1418 / 180 ) * $Strength + $YCenter; - - $Plots[] = $XPos; - $Plots[] = $YPos; - - $Angle = $Angle + (360/$Points); - $XLast = $XPos; - $YLast = $YPos; - } - } - - if (isset($Plots[0])) - { - $Plots[] = $Plots[0]; - $Plots[] = $Plots[1]; - - $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); - $C_White = $this->AllocateColor($this->Layers[0],255,255,255); - imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); - imagecolortransparent($this->Layers[0],$C_White); - - $C_Graph = $this->AllocateColor($this->Layers[0],$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - imagefilledpolygon($this->Layers[0],$Plots,(count($Plots)+1)/2,$C_Graph); - - imagecopymerge($this->Picture,$this->Layers[0],$this->GArea_X1,$this->GArea_Y1,0,0,$LayerWidth,$LayerHeight,$Alpha); - imagedestroy($this->Layers[0]); - - for($i=0;$i<=count($Plots)-4;$i=$i+2) - $this->drawLine($Plots[$i]+$this->GArea_X1,$Plots[$i+1]+$this->GArea_Y1,$Plots[$i+2]+$this->GArea_X1,$Plots[$i+3]+$this->GArea_Y1,$this->Palette[$ColorID]["R"],$this->Palette[$ColorID]["G"],$this->Palette[$ColorID]["B"]); - } - - $GraphID++; - } - } - - /* This function draw a flat pie chart */ - function drawBasicPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$R=255,$G=255,$B=255,$Decimals=0) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawBasicPieGraph",$DataDescription,FALSE); - $this->validateData("drawBasicPieGraph",$Data); - - /* Determine pie sum */ - $Series = 0; $PieSum = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - if ( $ColName != $DataDescription["Position"] ) - { - $Series++; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - $PieSum = $PieSum + $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; - } - } - } - - /* Validate serie */ - if ( $Series != 1 ) - RaiseFatal("Pie chart can only accept one serie of data."); - - $SpliceRatio = 360 / $PieSum; - $SplicePercent = 100 / $PieSum; - - /* Calculate all polygons */ - $Angle = 0; $TopPlots = ""; - foreach($iValues as $Key => $Value) - { - $TopPlots[$Key][] = $XPos; - $TopPlots[$Key][] = $YPos; - - /* Process labels position & size */ - $Caption = ""; - if ( !($DrawLabels == PIE_NOLABEL) ) - { - $TAngle = $Angle+($Value*$SpliceRatio/2); - if ($DrawLabels == PIE_PERCENTAGE) - $Caption = (round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; - elseif ($DrawLabels == PIE_LABELS) - $Caption = $iLabels[$Key]; - elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) - $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; - elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) - $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; - - $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); - $TextWidth = $Position[2]-$Position[0]; - $TextHeight = abs($Position[1])+abs($Position[3]); - - $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius+10) + $XPos; - - if ( $TAngle > 0 && $TAngle < 180 ) - $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+10) + $YPos + 4; - else - $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+4) + $YPos - ($TextHeight/2); - - if ( $TAngle > 90 && $TAngle < 270 ) - $TX = $TX - $TextWidth; - - $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); - imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); - } - - /* Process pie slices */ - for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) - { - $TopX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos; - $TopY = sin($iAngle * 3.1418 / 180 ) * $Radius + $YPos; - - $TopPlots[$Key][] = $TopX; - $TopPlots[$Key][] = $TopY; - } - - $TopPlots[$Key][] = $XPos; - $TopPlots[$Key][] = $YPos; - - $Angle = $iAngle; - } - $PolyPlots = $TopPlots; - - /* Set array values type to float --- PHP Bug with imagefilledpolygon casting to integer */ - foreach ($TopPlots as $Key => $Value) - { foreach ($TopPlots[$Key] as $Key2 => $Value2) { settype($TopPlots[$Key][$Key2],"float"); } } - - /* Draw Top polygons */ - foreach ($PolyPlots as $Key => $Value) - { - $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); - imagefilledpolygon($this->Picture,$PolyPlots[$Key],(count($PolyPlots[$Key])+1)/2,$C_GraphLo); - } - - $this->drawCircle($XPos-.5,$YPos-.5,$Radius,$R,$G,$B); - $this->drawCircle($XPos-.5,$YPos-.5,$Radius+.5,$R,$G,$B); - - /* Draw Top polygons */ - foreach ($TopPlots as $Key => $Value) - { - for($j=0;$j<=count($TopPlots[$Key])-4;$j=$j+2) - $this->drawLine($TopPlots[$Key][$j],$TopPlots[$Key][$j+1],$TopPlots[$Key][$j+2],$TopPlots[$Key][$j+3],$R,$G,$B); - } - } - - function drawFlatPieGraphWithShadow($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals=0) - { - $this->drawFlatPieGraph($Data,$DataDescription,$XPos+$this->ShadowXDistance,$YPos+$this->ShadowYDistance,$Radius,PIE_NOLABEL,$SpliceDistance,$Decimals,TRUE); - $this->drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius,$DrawLabels,$SpliceDistance,$Decimals,FALSE); - } - - /* This function draw a flat pie chart */ - function drawFlatPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$SpliceDistance=0,$Decimals=0,$AllBlack=FALSE) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawFlatPieGraph",$DataDescription,FALSE); - $this->validateData("drawFlatPieGraph",$Data); - - $ShadowStatus = $this->ShadowActive ; $this->ShadowActive = FALSE; - - /* Determine pie sum */ - $Series = 0; $PieSum = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - if ( $ColName != $DataDescription["Position"] ) - { - $Series++; - foreach ( $Data as $Key => $Values ) - { - if ( isset($Data[$Key][$ColName])) - $PieSum = $PieSum + $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; - } - } - } - - /* Validate serie */ - if ( $Series != 1 ) - { - RaiseFatal("Pie chart can only accept one serie of data."); - return(0); - } - - $SpliceRatio = 360 / $PieSum; - $SplicePercent = 100 / $PieSum; - - /* Calculate all polygons */ - $Angle = 0; $TopPlots = ""; - foreach($iValues as $Key => $Value) - { - $XOffset = cos(($Angle+($Value/2*$SpliceRatio)) * 3.1418 / 180 ) * $SpliceDistance; - $YOffset = sin(($Angle+($Value/2*$SpliceRatio)) * 3.1418 / 180 ) * $SpliceDistance; - - $TopPlots[$Key][] = round($XPos + $XOffset); - $TopPlots[$Key][] = round($YPos + $YOffset); - - if ( $AllBlack ) - { $Rc = $this->ShadowRColor; $Gc = $this->ShadowGColor; $Bc = $this->ShadowBColor; } - else - { $Rc = $this->Palette[$Key]["R"]; $Gc = $this->Palette[$Key]["G"]; $Bc = $this->Palette[$Key]["B"]; } - - $XLineLast = ""; $YLineLast = ""; - - /* Process labels position & size */ - $Caption = ""; - if ( !($DrawLabels == PIE_NOLABEL) ) - { - $TAngle = $Angle+($Value*$SpliceRatio/2); - if ($DrawLabels == PIE_PERCENTAGE) - $Caption = (round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; - elseif ($DrawLabels == PIE_LABELS) - $Caption = $iLabels[$Key]; - elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) - $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; - elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) - $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; - - $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); - $TextWidth = $Position[2]-$Position[0]; - $TextHeight = abs($Position[1])+abs($Position[3]); - - $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius+10+$SpliceDistance) + $XPos; - - if ( $TAngle > 0 && $TAngle < 180 ) - $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+10+$SpliceDistance) + $YPos + 4; - else - $TY = sin(($TAngle) * 3.1418 / 180 ) * ($Radius+$SpliceDistance+4) + $YPos - ($TextHeight/2); - - if ( $TAngle > 90 && $TAngle < 270 ) - $TX = $TX - $TextWidth; - - $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); - imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); - } - - /* Process pie slices */ - if ( !$AllBlack ) - $LineColor = $this->AllocateColor($this->Picture,$Rc,$Gc,$Bc); - else - $LineColor = $this->AllocateColor($this->Picture,$Rc,$Gc,$Bc); - - $XLineLast = ""; $YLineLast = ""; - for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) - { - $PosX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos + $XOffset; - $PosY = sin($iAngle * 3.1418 / 180 ) * $Radius + $YPos + $YOffset; - - $TopPlots[$Key][] = round($PosX); $TopPlots[$Key][] = round($PosY); - - if ( $iAngle == $Angle || $iAngle == $Angle+$Value*$SpliceRatio || $iAngle +.5 > $Angle+$Value*$SpliceRatio) - $this->drawLine($XPos+$XOffset,$YPos+$YOffset,$PosX,$PosY,$Rc,$Gc,$Bc); - - if ( $XLineLast != "" ) - $this->drawLine($XLineLast,$YLineLast,$PosX,$PosY,$Rc,$Gc,$Bc); - - $XLineLast = $PosX; $YLineLast = $PosY; - } - - $TopPlots[$Key][] = round($XPos + $XOffset); $TopPlots[$Key][] = round($YPos + $YOffset); - - $Angle = $iAngle; - } - $PolyPlots = $TopPlots; - - /* Draw Top polygons */ - foreach ($PolyPlots as $Key => $Value) - { - if ( !$AllBlack ) - $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); - else - $C_GraphLo = $this->AllocateColor($this->Picture,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor); - - imagefilledpolygon($this->Picture,$PolyPlots[$Key],(count($PolyPlots[$Key])+1)/2,$C_GraphLo); - } - $this->ShadowActive = $ShadowStatus; - } - - /* This function draw a pseudo-3D pie chart */ - function drawPieGraph($Data,$DataDescription,$XPos,$YPos,$Radius=100,$DrawLabels=PIE_NOLABEL,$EnhanceColors=TRUE,$Skew=60,$SpliceHeight=20,$SpliceDistance=0,$Decimals=0) - { - /* Validate the Data and DataDescription array */ - $this->validateDataDescription("drawPieGraph",$DataDescription,FALSE); - $this->validateData("drawPieGraph",$Data); - - /* Determine pie sum */ - $Series = 0; $PieSum = 0; $rPieSum = 0; - foreach ( $DataDescription["Values"] as $Key2 => $ColName ) - { - if ( $ColName != $DataDescription["Position"] ) - { - $Series++; - foreach ( $Data as $Key => $Values ) - if ( isset($Data[$Key][$ColName])) - { - if ( $Data[$Key][$ColName] == 0 ) - { $iValues[] = 0; $rValues[] = 0; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; } - // Removed : $PieSum++; $rValues[] = 1; - else - { $PieSum += $Data[$Key][$ColName]; $iValues[] = $Data[$Key][$ColName]; $iLabels[] = $Data[$Key][$DataDescription["Position"]]; $rValues[] = $Data[$Key][$ColName]; $rPieSum += $Data[$Key][$ColName];} - } - } - } - - /* Validate serie */ - if ( $Series != 1 ) - RaiseFatal("Pie chart can only accept one serie of data."); - - $SpliceDistanceRatio = $SpliceDistance; - $SkewHeight = ($Radius * $Skew) / 100; - $SpliceRatio = (360 - $SpliceDistanceRatio * count($iValues) ) / $PieSum; - $SplicePercent = 100 / $PieSum; - $rSplicePercent = 100 / $rPieSum; - - /* Calculate all polygons */ - $Angle = 0; $CDev = 5; - $TopPlots = ""; $BotPlots = ""; - $aTopPlots = ""; $aBotPlots = ""; - foreach($iValues as $Key => $Value) - { - $XCenterPos = cos(($Angle-$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $XPos; - $YCenterPos = sin(($Angle-$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $YPos; - $XCenterPos2 = cos(($Angle+$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $XPos; - $YCenterPos2 = sin(($Angle+$CDev+($Value*$SpliceRatio+$SpliceDistanceRatio)/2) * 3.1418 / 180 ) * $SpliceDistance + $YPos; - - $TopPlots[$Key][] = round($XCenterPos); $BotPlots[$Key][] = round($XCenterPos); - $TopPlots[$Key][] = round($YCenterPos); $BotPlots[$Key][] = round($YCenterPos + $SpliceHeight); - $aTopPlots[$Key][] = $XCenterPos; $aBotPlots[$Key][] = $XCenterPos; - $aTopPlots[$Key][] = $YCenterPos; $aBotPlots[$Key][] = $YCenterPos + $SpliceHeight; - - /* Process labels position & size */ - $Caption = ""; - if ( !($DrawLabels == PIE_NOLABEL) ) - { - $TAngle = $Angle+($Value*$SpliceRatio/2); - if ($DrawLabels == PIE_PERCENTAGE) - $Caption = (round($rValues[$Key] * pow(10,$Decimals) * $rSplicePercent)/pow(10,$Decimals))."%"; - elseif ($DrawLabels == PIE_LABELS) - $Caption = $iLabels[$Key]; - elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) - $Caption = $iLabels[$Key]."\r\n".(round($Value * pow(10,$Decimals) * $SplicePercent)/pow(10,$Decimals))."%"; - - $Position = imageftbbox($this->FontSize,0,$this->FontName,$Caption); - $TextWidth = $Position[2]-$Position[0]; - $TextHeight = abs($Position[1])+abs($Position[3]); - - $TX = cos(($TAngle) * 3.1418 / 180 ) * ($Radius + 10)+ $XPos; - - if ( $TAngle > 0 && $TAngle < 180 ) - $TY = sin(($TAngle) * 3.1418 / 180 ) * ($SkewHeight + 10) + $YPos + $SpliceHeight + 4; - else - $TY = sin(($TAngle) * 3.1418 / 180 ) * ($SkewHeight + 4) + $YPos - ($TextHeight/2); - - if ( $TAngle > 90 && $TAngle < 270 ) - $TX = $TX - $TextWidth; - - $C_TextColor = $this->AllocateColor($this->Picture,70,70,70); - imagettftext($this->Picture,$this->FontSize,0,$TX,$TY,$C_TextColor,$this->FontName,$Caption); - } - - /* Process pie slices */ - for($iAngle=$Angle;$iAngle<=$Angle+$Value*$SpliceRatio;$iAngle=$iAngle+.5) - { - $TopX = cos($iAngle * 3.1418 / 180 ) * $Radius + $XPos; - $TopY = sin($iAngle * 3.1418 / 180 ) * $SkewHeight + $YPos; - - $TopPlots[$Key][] = round($TopX); $BotPlots[$Key][] = round($TopX); - $TopPlots[$Key][] = round($TopY); $BotPlots[$Key][] = round($TopY + $SpliceHeight); - $aTopPlots[$Key][] = $TopX; $aBotPlots[$Key][] = $TopX; - $aTopPlots[$Key][] = $TopY; $aBotPlots[$Key][] = $TopY + $SpliceHeight; - } - - $TopPlots[$Key][] = round($XCenterPos2); $BotPlots[$Key][] = round($XCenterPos2); - $TopPlots[$Key][] = round($YCenterPos2); $BotPlots[$Key][] = round($YCenterPos2 + $SpliceHeight); - $aTopPlots[$Key][] = $XCenterPos2; $aBotPlots[$Key][] = $XCenterPos2; - $aTopPlots[$Key][] = $YCenterPos2; $aBotPlots[$Key][] = $YCenterPos2 + $SpliceHeight; - - $Angle = $iAngle + $SpliceDistanceRatio; - } - - /* Draw Bottom polygons */ - foreach($iValues as $Key => $Value) - { - $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"],-20); - imagefilledpolygon($this->Picture,$BotPlots[$Key],(count($BotPlots[$Key])+1)/2,$C_GraphLo); - - if ( $EnhanceColors ) { $En = -10; } else { $En = 0; } - - for($j=0;$j<=count($aBotPlots[$Key])-4;$j=$j+2) - $this->drawLine($aBotPlots[$Key][$j],$aBotPlots[$Key][$j+1],$aBotPlots[$Key][$j+2],$aBotPlots[$Key][$j+3],$this->Palette[$Key]["R"]+$En,$this->Palette[$Key]["G"]+$En,$this->Palette[$Key]["B"]+$En); - } - - /* Draw pie layers */ - if ( $EnhanceColors ) { $ColorRatio = 30 / $SpliceHeight; } else { $ColorRatio = 25 / $SpliceHeight; } - for($i=$SpliceHeight-1;$i>=1;$i--) - { - foreach($iValues as $Key => $Value) - { - $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"],-10); - $Plots = ""; $Plot = 0; - foreach($TopPlots[$Key] as $Key2 => $Value2) - { - $Plot++; - if ( $Plot % 2 == 1 ) - $Plots[] = $Value2; - else - $Plots[] = $Value2+$i; - } - imagefilledpolygon($this->Picture,$Plots,(count($Plots)+1)/2,$C_GraphLo); - - $Index = count($Plots); - if ($EnhanceColors ) {$ColorFactor = -20 + ($SpliceHeight - $i) * $ColorRatio; } else { $ColorFactor = 0; } - - $this->drawAntialiasPixel($Plots[0],$Plots[1],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); - $this->drawAntialiasPixel($Plots[2],$Plots[3],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); - $this->drawAntialiasPixel($Plots[$Index-4],$Plots[$Index-3],$this->Palette[$Key]["R"]+$ColorFactor,$this->Palette[$Key]["G"]+$ColorFactor,$this->Palette[$Key]["B"]+$ColorFactor); - } - } - - /* Draw Top polygons */ - for($Key=count($iValues)-1;$Key>=0;$Key--) - { - $C_GraphLo = $this->AllocateColor($this->Picture,$this->Palette[$Key]["R"],$this->Palette[$Key]["G"],$this->Palette[$Key]["B"]); - imagefilledpolygon($this->Picture,$TopPlots[$Key],(count($TopPlots[$Key])+1)/2,$C_GraphLo); - - if ( $EnhanceColors ) { $En = 10; } else { $En = 0; } - for($j=0;$j<=count($aTopPlots[$Key])-4;$j=$j+2) - $this->drawLine($aTopPlots[$Key][$j],$aTopPlots[$Key][$j+1],$aTopPlots[$Key][$j+2],$aTopPlots[$Key][$j+3],$this->Palette[$Key]["R"]+$En,$this->Palette[$Key]["G"]+$En,$this->Palette[$Key]["B"]+$En); - } - } - - /* This function can be used to set the background color */ - function drawBackground($R,$G,$B) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); - imagefilledrectangle($this->Picture,0,0,$this->XSize,$this->YSize,$C_Background); - } - - /* This function can be used to set the background color */ - function drawGraphAreaGradient($R,$G,$B,$Decay,$Target=TARGET_GRAPHAREA) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - if ( $Target == TARGET_GRAPHAREA ) { $X1 = $this->GArea_X1+1; $X2 = $this->GArea_X2-1; $Y1 = $this->GArea_Y1+1; $Y2 = $this->GArea_Y2; } - if ( $Target == TARGET_BACKGROUND ) { $X1 = 0; $X2 = $this->XSize; $Y1 = 0; $Y2 = $this->YSize; } - - /* Positive gradient */ - if ( $Decay > 0 ) - { - $YStep = ($Y2 - $Y1 - 2) / $Decay; - for($i=0;$i<=$Decay;$i++) - { - $R-=1;$G-=1;$B-=1; - $Yi1 = $Y1 + ( $i * $YStep ); - $Yi2 = ceil( $Yi1 + ( $i * $YStep ) + $YStep ); - if ( $Yi2 >= $Yi2 ) { $Yi2 = $Y2-1; } - - $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); - imagefilledrectangle($this->Picture,$X1,$Yi1,$X2,$Yi2,$C_Background); - } - } - - /* Negative gradient */ - if ( $Decay < 0 ) - { - $YStep = ($Y2 - $Y1 - 2) / -$Decay; - $Yi1 = $Y1; $Yi2 = $Y1+$YStep; - for($i=-$Decay;$i>=0;$i--) - { - $R+=1;$G+=1;$B+=1; - $C_Background = $this->AllocateColor($this->Picture,$R,$G,$B); - imagefilledrectangle($this->Picture,$X1,$Yi1,$X2,$Yi2,$C_Background); - - $Yi1+= $YStep; - $Yi2+= $YStep; - if ( $Yi2 >= $Yi2 ) { $Yi2 = $Y2-1; } - } - } - } - - /* This function create a rectangle with antialias */ - function drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); - - $X1=$X1-.2;$Y1=$Y1-.2; - $X2=$X2+.2;$Y2=$Y2+.2; - $this->drawLine($X1,$Y1,$X2,$Y1,$R,$G,$B); - $this->drawLine($X2,$Y1,$X2,$Y2,$R,$G,$B); - $this->drawLine($X2,$Y2,$X1,$Y2,$R,$G,$B); - $this->drawLine($X1,$Y2,$X1,$Y1,$R,$G,$B); - } - - /* This function create a filled rectangle with antialias */ - function drawFilledRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B,$DrawBorder=TRUE,$Alpha=100,$NoFallBack=FALSE) - { - if ( $X2 < $X1 ) { list($X1, $X2) = array($X2, $X1); } - if ( $Y2 < $Y1 ) { list($Y1, $Y2) = array($Y2, $Y1); } - - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - if ( $Alpha == 100 ) - { - /* Process shadows */ - if ( $this->ShadowActive && !$NoFallBack ) - { - $this->drawFilledRectangle($X1+$this->ShadowXDistance,$Y1+$this->ShadowYDistance,$X2+$this->ShadowXDistance,$Y2+$this->ShadowYDistance,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha,TRUE); - if ( $this->ShadowBlur != 0 ) - { - $AlphaDecay = ($this->ShadowAlpha / $this->ShadowBlur); - - for($i=1; $i<=$this->ShadowBlur; $i++) - $this->drawFilledRectangle($X1+$this->ShadowXDistance-$i/2,$Y1+$this->ShadowYDistance-$i/2,$X2+$this->ShadowXDistance-$i/2,$Y2+$this->ShadowYDistance-$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); - for($i=1; $i<=$this->ShadowBlur; $i++) - $this->drawFilledRectangle($X1+$this->ShadowXDistance+$i/2,$Y1+$this->ShadowYDistance+$i/2,$X2+$this->ShadowXDistance+$i/2,$Y2+$this->ShadowYDistance+$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,FALSE,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); - } - } - - $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); - imagefilledrectangle($this->Picture,round($X1),round($Y1),round($X2),round($Y2),$C_Rectangle); - } - else - { - $LayerWidth = abs($X2-$X1)+2; - $LayerHeight = abs($Y2-$Y1)+2; - - $this->Layers[0] = imagecreatetruecolor($LayerWidth,$LayerHeight); - $C_White = $this->AllocateColor($this->Layers[0],255,255,255); - imagefilledrectangle($this->Layers[0],0,0,$LayerWidth,$LayerHeight,$C_White); - imagecolortransparent($this->Layers[0],$C_White); - - $C_Rectangle = $this->AllocateColor($this->Layers[0],$R,$G,$B); - imagefilledrectangle($this->Layers[0],round(1),round(1),round($LayerWidth-1),round($LayerHeight-1),$C_Rectangle); - - imagecopymerge($this->Picture,$this->Layers[0],round(min($X1,$X2)-1),round(min($Y1,$Y2)-1),0,0,$LayerWidth,$LayerHeight,$Alpha); - imagedestroy($this->Layers[0]); - } - - if ( $DrawBorder ) - { - $ShadowSettings = $this->ShadowActive; $this->ShadowActive = FALSE; - $this->drawRectangle($X1,$Y1,$X2,$Y2,$R,$G,$B); - $this->ShadowActive = $ShadowSettings; - } - } - - /* This function create a rectangle with rounded corners and antialias */ - function drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); - - $Step = 90 / ((3.1418 * $Radius)/2); - - for($i=0;$i<=90;$i=$i+$Step) - { - $X = cos(($i+180)*3.1418/180) * $Radius + $X1 + $Radius; - $Y = sin(($i+180)*3.1418/180) * $Radius + $Y1 + $Radius; - $this->drawAntialiasPixel($X,$Y,$R,$G,$B); - - $X = cos(($i-90)*3.1418/180) * $Radius + $X2 - $Radius; - $Y = sin(($i-90)*3.1418/180) * $Radius + $Y1 + $Radius; - $this->drawAntialiasPixel($X,$Y,$R,$G,$B); - - $X = cos(($i)*3.1418/180) * $Radius + $X2 - $Radius; - $Y = sin(($i)*3.1418/180) * $Radius + $Y2 - $Radius; - $this->drawAntialiasPixel($X,$Y,$R,$G,$B); - - $X = cos(($i+90)*3.1418/180) * $Radius + $X1 + $Radius; - $Y = sin(($i+90)*3.1418/180) * $Radius + $Y2 - $Radius; - $this->drawAntialiasPixel($X,$Y,$R,$G,$B); - } - - $X1=$X1-.2;$Y1=$Y1-.2; - $X2=$X2+.2;$Y2=$Y2+.2; - $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$R,$G,$B); - $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$R,$G,$B); - $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$R,$G,$B); - $this->drawLine($X1,$Y2-$Radius,$X1,$Y1+$Radius,$R,$G,$B); - } - - /* This function create a filled rectangle with rounded corners and antialias */ - function drawFilledRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$R,$G,$B) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $C_Rectangle = $this->AllocateColor($this->Picture,$R,$G,$B); - - $Step = 90 / ((3.1418 * $Radius)/2); - - for($i=0;$i<=90;$i=$i+$Step) - { - $Xi1 = cos(($i+180)*3.1418/180) * $Radius + $X1 + $Radius; - $Yi1 = sin(($i+180)*3.1418/180) * $Radius + $Y1 + $Radius; - - $Xi2 = cos(($i-90)*3.1418/180) * $Radius + $X2 - $Radius; - $Yi2 = sin(($i-90)*3.1418/180) * $Radius + $Y1 + $Radius; - - $Xi3 = cos(($i)*3.1418/180) * $Radius + $X2 - $Radius; - $Yi3 = sin(($i)*3.1418/180) * $Radius + $Y2 - $Radius; - - $Xi4 = cos(($i+90)*3.1418/180) * $Radius + $X1 + $Radius; - $Yi4 = sin(($i+90)*3.1418/180) * $Radius + $Y2 - $Radius; - - imageline($this->Picture,$Xi1,$Yi1,$X1+$Radius,$Yi1,$C_Rectangle); - imageline($this->Picture,$X2-$Radius,$Yi2,$Xi2,$Yi2,$C_Rectangle); - imageline($this->Picture,$X2-$Radius,$Yi3,$Xi3,$Yi3,$C_Rectangle); - imageline($this->Picture,$Xi4,$Yi4,$X1+$Radius,$Yi4,$C_Rectangle); - - $this->drawAntialiasPixel($Xi1,$Yi1,$R,$G,$B); - $this->drawAntialiasPixel($Xi2,$Yi2,$R,$G,$B); - $this->drawAntialiasPixel($Xi3,$Yi3,$R,$G,$B); - $this->drawAntialiasPixel($Xi4,$Yi4,$R,$G,$B); - } - - imagefilledrectangle($this->Picture,$X1,$Y1+$Radius,$X2,$Y2-$Radius,$C_Rectangle); - imagefilledrectangle($this->Picture,$X1+$Radius,$Y1,$X2-$Radius,$Y2,$C_Rectangle); - - $X1=$X1-.2;$Y1=$Y1-.2; - $X2=$X2+.2;$Y2=$Y2+.2; - $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$R,$G,$B); - $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$R,$G,$B); - $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$R,$G,$B); - $this->drawLine($X1,$Y2-$Radius,$X1,$Y1+$Radius,$R,$G,$B); - } - - /* This function create a circle with antialias */ - function drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) - { - if ( $Width == 0 ) { $Width = $Height; } - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $C_Circle = $this->AllocateColor($this->Picture,$R,$G,$B); - $Step = 360 / (2 * 3.1418 * max($Width,$Height)); - - for($i=0;$i<=360;$i=$i+$Step) - { - $X = cos($i*3.1418/180) * $Height + $Xc; - $Y = sin($i*3.1418/180) * $Width + $Yc; - $this->drawAntialiasPixel($X,$Y,$R,$G,$B); - } - } - - /* This function create a filled circle/ellipse with antialias */ - function drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width=0) - { - if ( $Width == 0 ) { $Width = $Height; } - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $C_Circle = $this->AllocateColor($this->Picture,$R,$G,$B); - $Step = 360 / (2 * 3.1418 * max($Width,$Height)); - - for($i=90;$i<=270;$i=$i+$Step) - { - $X1 = cos($i*3.1418/180) * $Height + $Xc; - $Y1 = sin($i*3.1418/180) * $Width + $Yc; - $X2 = cos((180-$i)*3.1418/180) * $Height + $Xc; - $Y2 = sin((180-$i)*3.1418/180) * $Width + $Yc; - - $this->drawAntialiasPixel($X1-1,$Y1-1,$R,$G,$B); - $this->drawAntialiasPixel($X2-1,$Y2-1,$R,$G,$B); - - if ( ($Y1-1) > $Yc - max($Width,$Height) ) - imageline($this->Picture,$X1,$Y1-1,$X2-1,$Y2-1,$C_Circle); - } - } - - /* This function will draw a filled ellipse */ - function drawEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) - { $this->drawCircle($Xc,$Yc,$Height,$R,$G,$B,$Width); } - - /* This function will draw an ellipse */ - function drawFilledEllipse($Xc,$Yc,$Height,$Width,$R,$G,$B) - { $this->drawFilledCircle($Xc,$Yc,$Height,$R,$G,$B,$Width); } - - /* This function create a line with antialias */ - function drawLine($X1,$Y1,$X2,$Y2,$R,$G,$B,$GraphFunction=FALSE) - { - if ( $this->LineDotSize > 1 ) { $this->drawDottedLine($X1,$Y1,$X2,$Y2,$this->LineDotSize,$R,$G,$B,$GraphFunction); return(0); } - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1)); - if ( $Distance == 0 ) - return(-1); - $XStep = ($X2-$X1) / $Distance; - $YStep = ($Y2-$Y1) / $Distance; - - for($i=0;$i<=$Distance;$i++) - { - $X = $i * $XStep + $X1; - $Y = $i * $YStep + $Y1; - - if ( ($X >= $this->GArea_X1 && $X <= $this->GArea_X2 && $Y >= $this->GArea_Y1 && $Y <= $this->GArea_Y2) || !$GraphFunction ) - { - if ( $this->LineWidth == 1 ) - $this->drawAntialiasPixel($X,$Y,$R,$G,$B); - else - { - $StartOffset = -($this->LineWidth/2); $EndOffset = ($this->LineWidth/2); - for($j=$StartOffset;$j<=$EndOffset;$j++) - $this->drawAntialiasPixel($X+$j,$Y+$j,$R,$G,$B); - } - } - } - } - - /* This function create a line with antialias */ - function drawDottedLine($X1,$Y1,$X2,$Y2,$DotSize,$R,$G,$B,$GraphFunction=FALSE) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1)); - - $XStep = ($X2-$X1) / $Distance; - $YStep = ($Y2-$Y1) / $Distance; - - $DotIndex = 0; - for($i=0;$i<=$Distance;$i++) - { - $X = $i * $XStep + $X1; - $Y = $i * $YStep + $Y1; - - if ( $DotIndex <= $DotSize) - { - if ( ($X >= $this->GArea_X1 && $X <= $this->GArea_X2 && $Y >= $this->GArea_Y1 && $Y <= $this->GArea_Y2) || !$GraphFunction ) - { - if ( $this->LineWidth == 1 ) - $this->drawAntialiasPixel($X,$Y,$R,$G,$B); - else - { - $StartOffset = -($this->LineWidth/2); $EndOffset = ($this->LineWidth/2); - for($j=$StartOffset;$j<=$EndOffset;$j++) - $this->drawAntialiasPixel($X+$j,$Y+$j,$R,$G,$B); - } - } - } - - $DotIndex++; - if ( $DotIndex == $DotSize * 2 ) - $DotIndex = 0; - } - } - - /* Load a PNG file and draw it over the chart */ - function drawFromPNG($FileName,$X,$Y,$Alpha=100) - { $this->drawFromPicture(1,$FileName,$X,$Y,$Alpha); } - - /* Load a GIF file and draw it over the chart */ - function drawFromGIF($FileName,$X,$Y,$Alpha=100) - { $this->drawFromPicture(2,$FileName,$X,$Y,$Alpha); } - - /* Load a JPEG file and draw it over the chart */ - function drawFromJPG($FileName,$X,$Y,$Alpha=100) - { $this->drawFromPicture(3,$FileName,$X,$Y,$Alpha); } - - /* Generic loader function for external pictures */ - function drawFromPicture($PicType,$FileName,$X,$Y,$Alpha=100) - { - if ( file_exists($FileName)) - { - $Infos = getimagesize($FileName); - $Width = $Infos[0]; - $Height = $Infos[1]; - if ( $PicType == 1 ) { $Raster = imagecreatefrompng($FileName); } - if ( $PicType == 2 ) { $Raster = imagecreatefromgif($FileName); } - if ( $PicType == 3 ) { $Raster = imagecreatefromjpeg($FileName); } - - imagecopymerge($this->Picture,$Raster,$X,$Y,0,0,$Width,$Height,$Alpha); - imagedestroy($Raster); - } - } - - /* Draw an alpha pixel */ - function drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize ) - return(-1); - - $RGB2 = imagecolorat($this->Picture, $X, $Y); - $R2 = ($RGB2 >> 16) & 0xFF; - $G2 = ($RGB2 >> 8) & 0xFF; - $B2 = $RGB2 & 0xFF; - - $iAlpha = (100 - $Alpha)/100; - $Alpha = $Alpha / 100; - - $Ra = floor($R*$Alpha+$R2*$iAlpha); - $Ga = floor($G*$Alpha+$G2*$iAlpha); - $Ba = floor($B*$Alpha+$B2*$iAlpha); - - $C_Aliased = $this->AllocateColor($this->Picture,$Ra,$Ga,$Ba); - imagesetpixel($this->Picture,$X,$Y,$C_Aliased); - } - - /* Color helper */ - function AllocateColor($Picture,$R,$G,$B,$Factor=0) - { - $R = $R + $Factor; - $G = $G + $Factor; - $B = $B + $Factor; - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - return(imagecolorallocate($Picture,$R,$G,$B)); - } - - /* Add a border to the picture */ - function addBorder($Size=3,$R=0,$G=0,$B=0) - { - $Width = $this->XSize+2*$Size; - $Height = $this->YSize+2*$Size; - - $Resampled = imagecreatetruecolor($Width,$Height); - $C_Background = $this->AllocateColor($Resampled,$R,$G,$B); - imagefilledrectangle($Resampled,0,0,$Width,$Height,$C_Background); - - imagecopy($Resampled,$this->Picture,$Size,$Size,0,0,$this->XSize,$this->YSize); - imagedestroy($this->Picture); - - $this->XSize = $Width; - $this->YSize = $Height; - - $this->Picture = imagecreatetruecolor($this->XSize,$this->YSize); - $C_White = $this->AllocateColor($this->Picture,255,255,255); - imagefilledrectangle($this->Picture,0,0,$this->XSize,$this->YSize,$C_White); - imagecolortransparent($this->Picture,$C_White); - imagecopy($this->Picture,$Resampled,0,0,0,0,$this->XSize,$this->YSize); - } - - /* Render the current picture to a file */ - function Render($FileName) - { - if ( $this->ErrorReporting ) - $this->printErrors($this->ErrorInterface); - - /* Save image map if requested */ - if ( $this->BuildMap ) - $this->SaveImageMap(); - - imagepng($this->Picture,$FileName); - } - - /* Render the current picture to STDOUT */ - function Stroke() - { - if ( $this->ErrorReporting ) - $this->printErrors("GD"); - - /* Save image map if requested */ - if ( $this->BuildMap ) - $this->SaveImageMap(); - - header('Content-type: image/png'); - imagepng($this->Picture); - } - - /* Private functions for internal processing */ - function drawAntialiasPixel($X,$Y,$R,$G,$B,$Alpha=100,$NoFallBack=FALSE) - { - /* Process shadows */ - if ( $this->ShadowActive && !$NoFallBack ) - { - $this->drawAntialiasPixel($X+$this->ShadowXDistance,$Y+$this->ShadowYDistance,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha,TRUE); - if ( $this->ShadowBlur != 0 ) - { - $AlphaDecay = ($this->ShadowAlpha / $this->ShadowBlur); - - for($i=1; $i<=$this->ShadowBlur; $i++) - $this->drawAntialiasPixel($X+$this->ShadowXDistance-$i/2,$Y+$this->ShadowYDistance-$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); - for($i=1; $i<=$this->ShadowBlur; $i++) - $this->drawAntialiasPixel($X+$this->ShadowXDistance+$i/2,$Y+$this->ShadowYDistance+$i/2,$this->ShadowRColor,$this->ShadowGColor,$this->ShadowBColor,$this->ShadowAlpha-$AlphaDecay*$i,TRUE); - } - } - - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $Plot = ""; - $Xi = floor($X); - $Yi = floor($Y); - - if ( $Xi == $X && $Yi == $Y) - { - if ( $Alpha == 100 ) - { - $C_Aliased = $this->AllocateColor($this->Picture,$R,$G,$B); - imagesetpixel($this->Picture,$X,$Y,$C_Aliased); - } - else - $this->drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B); - } - else - { - $Alpha1 = (((1 - ($X - floor($X))) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha; - if ( $Alpha1 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi,$Alpha1,$R,$G,$B); } - - $Alpha2 = ((($X - floor($X)) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha; - if ( $Alpha2 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi,$Alpha2,$R,$G,$B); } - - $Alpha3 = (((1 - ($X - floor($X))) * ($Y - floor($Y)) * 100) / 100) * $Alpha; - if ( $Alpha3 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi+1,$Alpha3,$R,$G,$B); } - - $Alpha4 = ((($X - floor($X)) * ($Y - floor($Y)) * 100) / 100) * $Alpha; - if ( $Alpha4 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi+1,$Alpha4,$R,$G,$B); } - } - } - - /* Validate data contained in the description array */ - function validateDataDescription($FunctionName,&$DataDescription,$DescriptionRequired=TRUE) - { - if (!isset($DataDescription["Position"])) - { - $this->Errors[] = "[Warning] ".$FunctionName." - Y Labels are not set."; - $DataDescription["Position"] = "Name"; - } - - if ( $DescriptionRequired ) - { - if (!isset($DataDescription["Description"])) - { - $this->Errors[] = "[Warning] ".$FunctionName." - Series descriptions are not set."; - foreach($DataDescription["Values"] as $key => $Value) - { - $DataDescription["Description"][$Value] = $Value; - } - } - - if (count($DataDescription["Description"]) < count($DataDescription["Values"])) - { - $this->Errors[] = "[Warning] ".$FunctionName." - Some series descriptions are not set."; - foreach($DataDescription["Values"] as $key => $Value) - { - if ( !isset($DataDescription["Description"][$Value])) - $DataDescription["Description"][$Value] = $Value; - } - } - } - } - - /* Validate data contained in the data array */ - function validateData($FunctionName,&$Data) - { - $DataSummary = array(); - - foreach($Data as $key => $Values) - { - foreach($Values as $key2 => $Value) - { - if (!isset($DataSummary[$key2])) - $DataSummary[$key2] = 1; - else - $DataSummary[$key2]++; - } - } - - if ( max($DataSummary) == 0 ) - $this->Errors[] = "[Warning] ".$FunctionName." - No data set."; - - foreach($DataSummary as $key => $Value) - { - if ($Value < max($DataSummary)) - { - $this->Errors[] = "[Warning] ".$FunctionName." - Missing data in serie ".$key."."; - } - } - } - - /* Print all error messages on the CLI or graphically */ - function printErrors($Mode="CLI") - { - if (count($this->Errors) == 0) - return(0); - - if ( $Mode == "CLI" ) - { - foreach($this->Errors as $key => $Value) - echo $Value."\r\n"; - } - elseif ( $Mode == "GD" ) - { - $this->setLineStyle($Width=1); - $MaxWidth = 0; - foreach($this->Errors as $key => $Value) - { - $Position = imageftbbox($this->ErrorFontSize,0,$this->ErrorFontName,$Value); - $TextWidth = $Position[2]-$Position[0]; - if ( $TextWidth > $MaxWidth ) { $MaxWidth = $TextWidth; } - } - $this->drawFilledRoundedRectangle($this->XSize-($MaxWidth+20),$this->YSize-(20+(($this->ErrorFontSize+4)*count($this->Errors))),$this->XSize-10,$this->YSize-10,6,233,185,185); - $this->drawRoundedRectangle($this->XSize-($MaxWidth+20),$this->YSize-(20+(($this->ErrorFontSize+4)*count($this->Errors))),$this->XSize-10,$this->YSize-10,6,193,145,145); - - $C_TextColor = $this->AllocateColor($this->Picture,133,85,85); - $YPos = $this->YSize - (18 + (count($this->Errors)-1) * ($this->ErrorFontSize + 4)); - foreach($this->Errors as $key => $Value) - { - imagettftext($this->Picture,$this->ErrorFontSize,0,$this->XSize-($MaxWidth+15),$YPos,$C_TextColor,$this->ErrorFontName,$Value); - $YPos = $YPos + ($this->ErrorFontSize + 4); - } - } - } - - /* Activate the image map creation process */ - function setImageMap($Mode=TRUE,$GraphID="MyGraph") - { - $this->BuildMap = $Mode; - $this->MapID = $GraphID; - } - - /* Add a box into the image map */ - function addToImageMap($X1,$Y1,$X2,$Y2,$SerieName,$Value,$CallerFunction) - { - if ( $this->MapFunction == NULL || $this->MapFunction == $CallerFunction ) - { - $this->ImageMap[] = round($X1).",".round($Y1).",".round($X2).",".round($Y2).",".$SerieName.",".$Value; - $this->MapFunction = $CallerFunction; - } - } - - /* Load and cleanup the image map from disk */ - function getImageMap($MapName,$Flush=TRUE) - { - /* Strip HTML query strings */ - $Values = $this->tmpFolder.$MapName; - $Value = split("\?",$Values); - $FileName = $Value[0]; - - if ( file_exists($FileName) ) - { - $Handle = fopen($FileName, "r"); - $MapContent = fread($Handle, filesize($FileName)); - fclose($Handle); - echo $MapContent; - - if ( $Flush ) - unlink($FileName); - - exit(); - } - else - { - header("HTTP/1.0 404 Not Found"); - exit(); - } - } - - /* Save the image map to the disk */ - function SaveImageMap() - { - if ( !$this->BuildMap ) { return(-1); } - - if ( $this->ImageMap == NULL ) - { - $this->Errors[] = "[Warning] SaveImageMap - Image map is empty."; - return(-1); - } - - $Handle = fopen($this->tmpFolder.$this->MapID, 'w'); - if ( !$Handle ) - { - $this->Errors[] = "[Warning] SaveImageMap - Cannot save the image map."; - return(-1); - } - else - { - foreach($this->ImageMap as $Key => $Value) - fwrite($Handle, htmlentities($Value)."\r"); - } - fclose ($Handle); - } - - /* Convert seconds to a time format string */ - function ToTime($Value) - { - $Hour = floor($Value/3600); - $Minute = floor(($Value - $Hour*3600)/60); - $Second = floor($Value - $Hour*3600 - $Minute*60); - - if (strlen($Hour) == 1 ) { $Hour = "0".$Hour; } - if (strlen($Minute) == 1 ) { $Minute = "0".$Minute; } - if (strlen($Second) == 1 ) { $Second = "0".$Second; } - - return($Hour.":".$Minute.":".$Second); - } - - /* Convert to metric system */ - function ToMetric($Value) - { - $Go = floor($Value/1000000000); - $Mo = floor(($Value - $Go*1000000000)/1000000); - $Ko = floor(($Value - $Go*1000000000 - $Mo*1000000)/1000); - $o = floor($Value - $Go*1000000000 - $Mo*1000000 - $Ko*1000); - - if ($Go != 0) { return($Go.".".$Mo."g"); } - if ($Mo != 0) { return($Mo.".".$ko."m"); } - if ($Ko != 0) { return($Ko.".".$o)."k"; } - return($o); - } - - /* Convert to curency */ - function ToCurrency($Value) - { - $Go = floor($Value/1000000000); - $Mo = floor(($Value - $Go*1000000000)/1000000); - $Ko = floor(($Value - $Go*1000000000 - $Mo*1000000)/1000); - $o = floor($Value - $Go*1000000000 - $Mo*1000000 - $Ko*1000); - - if ( strlen($o) == 1 ) { $o = "00".$o; } - if ( strlen($o) == 2 ) { $o = "0".$o; } - - $ResultString = $o; - if ( $Ko != 0 ) { $ResultString = $Ko.".".$ResultString; } - if ( $Mo != 0 ) { $ResultString = $Mo.".".$ResultString; } - if ( $Go != 0 ) { $ResultString = $Go.".".$ResultString; } - - $ResultString = $this->Currency.$ResultString; - return($ResultString); - } - - /* Set date format for axis labels */ - function setDateFormat($Format) - { - $this->DateFormat = $Format; - } - - /* Convert TS to a date format string */ - function ToDate($Value) - { - return(date($this->DateFormat,$Value)); - } - - /* Check if a number is a full integer (for scaling) */ - function isRealInt($Value) - { - if ($Value == floor($Value)) - return(TRUE); - return(FALSE); - } - } - - function RaiseFatal($Message) - { - echo "[FATAL] ".$Message."\r\n"; - exit(); - } -?> \ No newline at end of file diff --git a/include/limesurvey/classes/pchart/pchart/pData.class b/include/limesurvey/classes/pchart/pchart/pData.class deleted file mode 100644 index 28300a84..00000000 --- a/include/limesurvey/classes/pchart/pchart/pData.class +++ /dev/null @@ -1,260 +0,0 @@ -. - - Class initialisation : - pData() - Data populating methods : - ImportFromCSV($FileName,$Delimiter=",",$DataColumns=-1,$HasHeader=FALSE,$DataName=-1) - AddPoint($Value,$Serie="Serie1",$Description="") - Series manipulation methods : - AddSerie($SerieName="Serie1") - AddAllSeries() - RemoveSerie($SerieName="Serie1") - SetAbsciseLabelSerie($SerieName = "Name") - SetSerieName($Name,$SerieName="Serie1") - + SetSerieSymbol($Name,$Symbol) - SetXAxisName($Name="X Axis") - SetYAxisName($Name="Y Axis") - SetXAxisFormat($Format="number") - SetYAxisFormat($Format="number") - SetXAxisUnit($Unit="") - SetYAxisUnit($Unit="") - removeSerieName($SerieName) - removeAllSeries() - Data retrieval methods : - GetData() - GetDataDescription() - */ - - /* pData class definition */ - class pData - { - var $Data; - var $DataDescription; - - function pData() - { - $this->Data = ""; - $this->DataDescription = ""; - $this->DataDescription["Position"] = "Name"; - $this->DataDescription["Format"]["X"] = "number"; - $this->DataDescription["Format"]["Y"] = "number"; - $this->DataDescription["Unit"]["X"] = NULL; - $this->DataDescription["Unit"]["Y"] = NULL; - } - - function ImportFromCSV($FileName,$Delimiter=",",$DataColumns=-1,$HasHeader=FALSE,$DataName=-1) - { - $handle = @fopen($FileName,"r"); - if ($handle) - { - $HeaderParsed = FALSE; - while (!feof($handle)) - { - $buffer = fgets($handle, 4096); - $buffer = str_replace(chr(10),"",$buffer); - $buffer = str_replace(chr(13),"",$buffer); - $Values = split($Delimiter,$buffer); - - if ( $buffer != "" ) - { - if ( $HasHeader == TRUE && $HeaderParsed == FALSE ) - { - if ( $DataColumns == -1 ) - { - $ID = 1; - foreach($Values as $key => $Value) - { $this->SetSerieName($Value,"Serie".$ID); $ID++; } - } - else - { - $SerieName = ""; - - foreach($DataColumns as $key => $Value) - $this->SetSerieName($Values[$Value],"Serie".$Value); - } - $HeaderParsed = TRUE; - } - else - { - if ( $DataColumns == -1 ) - { - $ID = 1; - foreach($Values as $key => $Value) - { $this->AddPoint(intval($Value),"Serie".$ID); $ID++; } - } - else - { - $SerieName = ""; - if ( $DataName != -1 ) - $SerieName = $Values[$DataName]; - - foreach($DataColumns as $key => $Value) - $this->AddPoint($Values[$Value],"Serie".$Value,$SerieName); - } - } - } - } - fclose($handle); - } - } - - function AddPoint($Value,$Serie="Serie1",$Description="") - { - if (is_array($Value) && count($Value) == 1) - $Value = $Value[0]; - - $ID = 0; - for($i=0;$i<=count($this->Data);$i++) - { if( isset($this->Data[$i]) && isset($this->Data[$i][$Serie])) { $ID = $i+1; } } - - if ( count($Value) == 1 ) - { - $this->Data[$ID][$Serie] = $Value; - if ( $Description != "" ) - $this->Data[$ID]["Name"] = $Description; - elseif (!isset($this->Data[$ID]["Name"])) - $this->Data[$ID]["Name"] = $ID; - } - else - { - foreach($Value as $key => $Val) - { - $this->Data[$ID][$Serie] = $Val; - if (!isset($this->Data[$ID]["Name"])) - $this->Data[$ID]["Name"] = $ID; - $ID++; - } - } - } - - function AddSerie($SerieName="Serie1") - { - if ( !isset($this->DataDescription["Values"]) ) - { - $this->DataDescription["Values"][] = $SerieName; - } - else - { - $Found = FALSE; - foreach($this->DataDescription["Values"] as $key => $Value ) - if ( $Value == $SerieName ) { $Found = TRUE; } - - if ( !$Found ) - $this->DataDescription["Values"][] = $SerieName; - } - } - - function AddAllSeries() - { - unset($this->DataDescription["Values"]); - - if ( isset($this->Data[0]) ) - { - foreach($this->Data[0] as $Key => $Value) - { - if ( $Key != "Name" ) - $this->DataDescription["Values"][] = $Key; - } - } - } - - function RemoveSerie($SerieName="Serie1") - { - if ( !isset($this->DataDescription["Values"]) ) - return(0); - - $Found = FALSE; - foreach($this->DataDescription["Values"] as $key => $Value ) - { - if ( $Value == $SerieName ) - unset($this->DataDescription["Values"][$key]); - } - } - - function SetAbsciseLabelSerie($SerieName = "Name") - { - $this->DataDescription["Position"] = $SerieName; - } - - function SetSerieName($Name,$SerieName="Serie1") - { - $this->DataDescription["Description"][$SerieName] = $Name; - } - - function SetXAxisName($Name="X Axis") - { - $this->DataDescription["Axis"]["X"] = $Name; - } - - function SetYAxisName($Name="Y Axis") - { - $this->DataDescription["Axis"]["Y"] = $Name; - } - - function SetXAxisFormat($Format="number") - { - $this->DataDescription["Format"]["X"] = $Format; - } - - function SetYAxisFormat($Format="number") - { - $this->DataDescription["Format"]["Y"] = $Format; - } - - function SetXAxisUnit($Unit="") - { - $this->DataDescription["Unit"]["X"] = $Unit; - } - - function SetYAxisUnit($Unit="") - { - $this->DataDescription["Unit"]["Y"] = $Unit; - } - - function SetSerieSymbol($Name,$Symbol) - { - $this->DataDescription["Symbol"][$Name] = $Symbol; - } - - function removeSerieName($SerieName) - { - if ( isset($this->DataDescription["Description"][$SerieName]) ) - unset($this->DataDescription["Description"][$SerieName]); - } - - function removeAllSeries() - { - foreach($this->DataDescription["Values"] as $Key => $Value) - unset($this->DataDescription["Values"][$Key]); - } - - function GetData() - { - return($this->Data); - } - - function GetDataDescription() - { - return($this->DataDescription); - } - } -?> \ No newline at end of file diff --git a/include/limesurvey/classes/php-gettext/AUTHORS b/include/limesurvey/classes/php-gettext/AUTHORS deleted file mode 100644 index da6ade7b..00000000 --- a/include/limesurvey/classes/php-gettext/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -Danilo Segan -Nico Kaiser (contributed most changes between 1.0.2 and 1.0.3, bugfix for 1.0.5) -Steven Armstrong (gettext.inc, leading to 1.0.6) diff --git a/include/limesurvey/classes/php-gettext/COPYING b/include/limesurvey/classes/php-gettext/COPYING deleted file mode 100644 index 5b6e7c66..00000000 --- a/include/limesurvey/classes/php-gettext/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/include/limesurvey/classes/php-gettext/README b/include/limesurvey/classes/php-gettext/README deleted file mode 100644 index bca4f916..00000000 --- a/include/limesurvey/classes/php-gettext/README +++ /dev/null @@ -1,161 +0,0 @@ -PHP-gettext 1.0 (https://launchpad.net/php-gettext) - -Copyright 2003, 2006, 2009 -- Danilo "angry with PHP[1]" Segan -Licensed under GPLv2 (or any later version, see COPYING) - -[1] PHP is actually cyrillic, and translates roughly to - "works-doesn't-work" (UTF-8: Ради-Не-Ради) - - -Introduction - - How many times did you look for a good translation tool, and - found out that gettext is best for the job? Many times. - - How many times did you try to use gettext in PHP, but failed - miserably, because either your hosting provider didn't support - it, or the server didn't have adequate locale? Many times. - - Well, this is a solution to your needs. It allows using gettext - tools for managing translations, yet it doesn't require gettext - library at all. It parses generated MO files directly, and thus - might be a bit slower than the (maybe provided) gettext library. - - PHP-gettext is a simple reader for GNU gettext MO files. Those - are binary containers for translations, produced by GNU msgfmt. - -Why? - - I got used to having gettext work even without gettext - library. It's there in my favourite language Python, so I was - surprised that I couldn't find it in PHP. I even Googled for it, - but to no avail. - - So, I said, what the heck, I'm going to write it for this - disguisting language of PHP, because I'm often constrained to it. - -Features - - o Support for simple translations - Just define a simple alias for translate() function (suggested - use of _() or gettext(); see provided example). - - o Support for ngettext calls (plural forms, see a note under bugs) - You may also use plural forms. Translations in MO files need to - provide this, and they must also provide "plural-forms" header. - Please see 'info gettext' for more details. - - o Support for reading straight files, or strings (!!!) - Since I can imagine many different backends for reading in the MO - file data, I used imaginary abstract class StreamReader to do all - the input (check streams.php). For your convenience, I've already - provided two classes for reading files: FileReader and - StringReader (CachedFileReader is a combination of the two: it - loads entire file contents into a string, and then works on that). - See example below for usage. You can for instance use StringReader - when you read in data from a database, or you can create your own - derivative of StreamReader for anything you like. - - -Bugs - - Report them on https://bugs.launchpad.net/php-gettext - -Usage - - Put files streams.php and gettext.php somewhere you can load them - from, and require 'em in where you want to use them. - - Then, create one 'stream reader' (a class that provides functions - like read(), seekto(), currentpos() and length()) which will - provide data for the 'gettext_reader', with eg. - $streamer = new FileStream('data.mo'); - - Then, use that as a parameter to gettext_reader constructor: - $wohoo = new gettext_reader($streamer); - - If you want to disable pre-loading of entire message catalog in - memory (if, for example, you have a multi-thousand message catalog - which you'll use only occasionally), use "false" for second - parameter to gettext_reader constructor: - $wohoo = new gettext_reader($streamer, false); - - From now on, you have all the benefits of gettext data at your - disposal, so may run: - print $wohoo->translate("This is a test"); - print $wohoo->ngettext("%d bird", "%d birds", $birds); - - You might need to pass parameter "-k" to xgettext to make it - extract all the strings. In above example, try with - xgettext -ktranslate -kngettext:1,2 file.php - what should create messages.po which contains two messages for - translation. - - I suggest creating simple aliases for these functions (see - example/pigs.php for how do I do it, which means it's probably a - bad way). - - -Usage with gettext.inc (standard gettext interfaces emulation) - - Check example in examples/pig_dropin.php, basically you include - gettext.inc and use all the standard gettext interfaces as - documented on: - - http://www.php.net/gettext - - The only catch is that you can check return value of setlocale() - to see if your locale is system supported or not. - - -Example - - See in examples/ subdirectory. There are a couple of files. - pigs.php is an example, serbian.po is a translation to Serbian - language, and serbian.mo is generated with - msgfmt -o serbian.mo serbian.po - There is also simple "update" script that can be used to generate - POT file and to update the translation using msgmerge. - -TODO: - - o Improve speed to be even more comparable to the native gettext - implementation. - - o Try to use hash tables in MO files: with pre-loading, would it - be useful at all? - -Never-asked-questions: - - o Why did you mark this as version 1.0 when this is the first code - release? - - Well, it's quite simple. I consider that the first released thing - should be labeled "version 1" (first, right?). Zero is there to - indicate that there's zero improvement and/or change compared to - "version 1". - - I plan to use version numbers 1.0.* for small bugfixes, and to - release 1.1 as "first stable release of version 1". - - This may trick someone that this is actually useful software, but - as with any other free software, I take NO RESPONSIBILITY for - creating such a masterpiece that will smoke crack, trash your - hard disk, and make lasers in your CD device dance to the tune of - Mozart's 40th Symphony (there is one like that, right?). - - o Can I...? - - Yes, you can. This is free software (as in freedom, free speech), - and you might do whatever you wish with it, provided you do not - limit freedom of others (GPL). - - I'm considering licensing this under LGPL, but I *do* want - *every* PHP-gettext user to contribute and respect ideas of free - software, so don't count on it happening anytime soon. - - I'm sorry that I'm taking away your freedom of taking others' - freedom away, but I believe that's neglible as compared to what - freedoms you could take away. ;-) - - Uhm, whatever. diff --git a/include/limesurvey/classes/php-gettext/gettext.inc b/include/limesurvey/classes/php-gettext/gettext.inc deleted file mode 100644 index 00b96669..00000000 --- a/include/limesurvey/classes/php-gettext/gettext.inc +++ /dev/null @@ -1,536 +0,0 @@ - - Copyright (c) 2009 Danilo Segan - - Drop in replacement for native gettext. - - This file is part of PHP-gettext. - - PHP-gettext is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - PHP-gettext is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with PHP-gettext; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ -/* -LC_CTYPE 0 -LC_NUMERIC 1 -LC_TIME 2 -LC_COLLATE 3 -LC_MONETARY 4 -LC_MESSAGES 5 -LC_ALL 6 -*/ - -// LC_MESSAGES is not available if php-gettext is not loaded -// while the other constants are already available from session extension. -if (!defined('LC_MESSAGES')) { - define('LC_MESSAGES', 5); -} - -require('streams.php'); -require('gettext.php'); - - -// Variables - -global $text_domains, $default_domain, $LC_CATEGORIES, $EMULATEGETTEXT, $CURRENTLOCALE; -$text_domains = array(); -$default_domain = 'messages'; -$LC_CATEGORIES = array('LC_CTYPE', 'LC_NUMERIC', 'LC_TIME', 'LC_COLLATE', 'LC_MONETARY', 'LC_MESSAGES', 'LC_ALL'); -$EMULATEGETTEXT = 0; -$CURRENTLOCALE = ''; - -/* Class to hold a single domain included in $text_domains. */ -class domain { - var $l10n; - var $path; - var $codeset; -} - -// Utility functions - -/** - * Return a list of locales to try for any POSIX-style locale specification. - */ -function get_list_of_locales($locale) { - /* Figure out all possible locale names and start with the most - * specific ones. I.e. for sr_CS.UTF-8@latin, look through all of - * sr_CS.UTF-8@latin, sr_CS@latin, sr@latin, sr_CS.UTF-8, sr_CS, sr. - */ - $locale_names = array(); - $lang = NULL; - $country = NULL; - $charset = NULL; - $modifier = NULL; - if ($locale) { - if (preg_match("/^(?P[a-z]{2,3})" // language code - ."(?:_(?P[A-Z]{2}))?" // country code - ."(?:\.(?P[-A-Za-z0-9_]+))?" // charset - ."(?:@(?P[-A-Za-z0-9_]+))?$/", // @ modifier - $locale, $matches)) { - - if (isset($matches["lang"])) $lang = $matches["lang"]; - if (isset($matches["country"])) $country = $matches["country"]; - if (isset($matches["charset"])) $charset = $matches["charset"]; - if (isset($matches["modifier"])) $modifier = $matches["modifier"]; - - if ($modifier) { - if ($country) { - if ($charset) - array_push($locale_names, "${lang}_$country.$charset@$modifier"); - array_push($locale_names, "${lang}_$country@$modifier"); - } elseif ($charset) - array_push($locale_names, "${lang}.$charset@$modifier"); - array_push($locale_names, "$lang@$modifier"); - } - if ($country) { - if ($charset) - array_push($locale_names, "${lang}_$country.$charset"); - array_push($locale_names, "${lang}_$country"); - } elseif ($charset) - array_push($locale_names, "${lang}.$charset"); - array_push($locale_names, $lang); - } - - // If the locale name doesn't match POSIX style, just include it as-is. - if (!in_array($locale, $locale_names)) - array_push($locale_names, $locale); - } - return $locale_names; -} - -/** - * Utility function to get a StreamReader for the given text domain. - */ -function _get_reader($domain=null, $category=5, $enable_cache=true) { - global $text_domains, $default_domain, $LC_CATEGORIES; - if (!isset($domain)) $domain = $default_domain; - if (!isset($text_domains[$domain]->l10n)) { - // get the current locale - $locale = _setlocale(LC_MESSAGES, 0); - $bound_path = isset($text_domains[$domain]->path) ? - $text_domains[$domain]->path : './'; - $subpath = $LC_CATEGORIES[$category] ."/$domain.mo"; - - $locale_names = get_list_of_locales($locale); - $input = null; - foreach ($locale_names as $locale) { - $full_path = $bound_path . $locale . "/" . $subpath; - if (file_exists($full_path)) { - $input = new FileReader($full_path); - break; - } - } - - if (!array_key_exists($domain, $text_domains)) { - // Initialize an empty domain object. - $text_domains[$domain] = new domain(); - } - $text_domains[$domain]->l10n = new gettext_reader($input, - $enable_cache); - } - return $text_domains[$domain]->l10n; -} - -/** - * Returns whether we are using our emulated gettext API or PHP built-in one. - */ -function locale_emulation() { - global $EMULATEGETTEXT; - return $EMULATEGETTEXT; -} - -/** - * Checks if the current locale is supported on this system. - */ -function _check_locale_and_function($function=false) { - global $EMULATEGETTEXT; - if ($function and !function_exists($function)) - return false; - return !$EMULATEGETTEXT; -} - -/** - * Get the codeset for the given domain. - */ -function _get_codeset($domain=null) { - global $text_domains, $default_domain, $LC_CATEGORIES; - if (!isset($domain)) $domain = $default_domain; - return (isset($text_domains[$domain]->codeset))? $text_domains[$domain]->codeset : ini_get('mbstring.internal_encoding'); -} - -/** - * Convert the given string to the encoding set by bind_textdomain_codeset. - */ -function _encode($text) { - $source_encoding = mb_detect_encoding($text); - $target_encoding = _get_codeset(); - if ($source_encoding != $target_encoding) { - return mb_convert_encoding($text, $target_encoding, $source_encoding); - } - else { - return $text; - } -} - - -// Custom implementation of the standard gettext related functions - -/** - * Returns passed in $locale, or environment variable $LANG if $locale == ''. - */ -function _get_default_locale($locale) { - if ($locale == '') // emulate variable support - return getenv('LANG'); - else - return $locale; -} - -/** - * Sets a requested locale, if needed emulates it. - */ -function _setlocale($category, $locale) { - global $CURRENTLOCALE, $EMULATEGETTEXT; - if ($locale === 0) { // use === to differentiate between string "0" - if ($CURRENTLOCALE != '') - return $CURRENTLOCALE; - else - // obey LANG variable, maybe extend to support all of LC_* vars - // even if we tried to read locale without setting it first - return _setlocale($category, $CURRENTLOCALE); - } else { - if (function_exists('setlocale')) { - $ret = setlocale($category, $locale); - if (($locale == '' and !$ret) or // failed setting it by env - ($locale != '' and $ret != $locale)) { // failed setting it - // Failed setting it according to environment. - $CURRENTLOCALE = _get_default_locale($locale); - $EMULATEGETTEXT = 1; - } else { - $CURRENTLOCALE = $ret; - $EMULATEGETTEXT = 0; - } - } else { - // No function setlocale(), emulate it all. - $CURRENTLOCALE = _get_default_locale($locale); - $EMULATEGETTEXT = 1; - } - // Allow locale to be changed on the go for one translation domain. - global $text_domains, $default_domain; - if (array_key_exists($default_domain, $text_domains)) { - unset($text_domains[$default_domain]->l10n); - } - return $CURRENTLOCALE; - } -} - -/** - * Sets the path for a domain. - */ -function _bindtextdomain($domain, $path) { - global $text_domains; - // ensure $path ends with a slash ('/' should work for both, but lets still play nice) - if (substr(php_uname(), 0, 7) == "Windows") { - if ($path[strlen($path)-1] != '\\' and $path[strlen($path)-1] != '/') - $path .= '\\'; - } else { - if ($path[strlen($path)-1] != '/') - $path .= '/'; - } - if (!array_key_exists($domain, $text_domains)) { - // Initialize an empty domain object. - $text_domains[$domain] = new domain(); - } - $text_domains[$domain]->path = $path; -} - -/** - * Specify the character encoding in which the messages from the DOMAIN message catalog will be returned. - */ -function _bind_textdomain_codeset($domain, $codeset) { - global $text_domains; - $text_domains[$domain]->codeset = $codeset; -} - -/** - * Sets the default domain. - */ -function _textdomain($domain) { - global $default_domain; - $default_domain = $domain; -} - -/** - * Lookup a message in the current domain. - */ -function _gettext($msgid) { - $l10n = _get_reader(); - return _encode($l10n->translate($msgid)); -} - -/** - * Alias for gettext. - */ -function __($msgid) { - return _gettext($msgid); -} - -/** - * Plural version of gettext. - */ -function _ngettext($singular, $plural, $number) { - $l10n = _get_reader(); - return _encode($l10n->ngettext($singular, $plural, $number)); -} - -/** - * Override the current domain. - */ -function _dgettext($domain, $msgid) { - $l10n = _get_reader($domain); - return _encode($l10n->translate($msgid)); -} - -/** - * Plural version of dgettext. - */ -function _dngettext($domain, $singular, $plural, $number) { - $l10n = _get_reader($domain); - return _encode($l10n->ngettext($singular, $plural, $number)); -} - -/** - * Overrides the domain and category for a single lookup. - */ -function _dcgettext($domain, $msgid, $category) { - $l10n = _get_reader($domain, $category); - return _encode($l10n->translate($msgid)); -} -/** - * Plural version of dcgettext. - */ -function _dcngettext($domain, $singular, $plural, $number, $category) { - $l10n = _get_reader($domain, $category); - return _encode($l10n->ngettext($singular, $plural, $number)); -} - -/** - * Context version of gettext. - */ -function _pgettext($context, $msgid) { - $l10n = _get_reader(); - return _encode($l10n->pgettext($context, $msgid)); -} - -/** - * Override the current domain in a context gettext call. - */ -function _dpgettext($domain, $context, $msgid) { - $l10n = _get_reader($domain); - return _encode($l10n->pgettext($context, $msgid)); -} - -/** - * Overrides the domain and category for a single context-based lookup. - */ -function _dcpgettext($domain, $context, $msgid, $category) { - $l10n = _get_reader($domain, $category); - return _encode($l10n->pgettext($context, $msgid)); -} - -/** - * Context version of ngettext. - */ -function _npgettext($context, $singular, $plural) { - $l10n = _get_reader(); - return _encode($l10n->npgettext($context, $singular, $plural)); -} - -/** - * Override the current domain in a context ngettext call. - */ -function _dnpgettext($domain, $context, $singular, $plural) { - $l10n = _get_reader($domain); - return _encode($l10n->npgettext($context, $singular, $plural)); -} - -/** - * Overrides the domain and category for a plural context-based lookup. - */ -function _dcnpgettext($domain, $context, $singular, $plural, $category) { - $l10n = _get_reader($domain, $category); - return _encode($l10n->npgettext($context, $singular, $plural)); -} - - - -// Wrappers to use if the standard gettext functions are available, -// but the current locale is not supported by the system. -// Use the standard impl if the current locale is supported, use the -// custom impl otherwise. - -function T_setlocale($category, $locale) { - return _setlocale($category, $locale); -} - -function T_bindtextdomain($domain, $path) { - if (_check_locale_and_function()) return bindtextdomain($domain, $path); - else return _bindtextdomain($domain, $path); -} -function T_bind_textdomain_codeset($domain, $codeset) { - // bind_textdomain_codeset is available only in PHP 4.2.0+ - if (_check_locale_and_function('bind_textdomain_codeset')) - return bind_textdomain_codeset($domain, $codeset); - else return _bind_textdomain_codeset($domain, $codeset); -} -function T_textdomain($domain) { - if (_check_locale_and_function()) return textdomain($domain); - else return _textdomain($domain); -} -function T_gettext($msgid) { - if (_check_locale_and_function()) return gettext($msgid); - else return _gettext($msgid); -} -function T_($msgid) { - if (_check_locale_and_function()) return _($msgid); - return __($msgid); -} -function T_ngettext($singular, $plural, $number) { - if (_check_locale_and_function()) - return ngettext($singular, $plural, $number); - else return _ngettext($singular, $plural, $number); -} -function T_dgettext($domain, $msgid) { - if (_check_locale_and_function()) return dgettext($domain, $msgid); - else return _dgettext($domain, $msgid); -} -function T_dngettext($domain, $singular, $plural, $number) { - if (_check_locale_and_function()) - return dngettext($domain, $singular, $plural, $number); - else return _dngettext($domain, $singular, $plural, $number); -} -function T_dcgettext($domain, $msgid, $category) { - if (_check_locale_and_function()) - return dcgettext($domain, $msgid, $category); - else return _dcgettext($domain, $msgid, $category); -} -function T_dcngettext($domain, $singular, $plural, $number, $category) { - if (_check_locale_and_function()) - return dcngettext($domain, $singular, $plural, $number, $category); - else return _dcngettext($domain, $singular, $plural, $number, $category); -} - -function T_pgettext($context, $msgid) { - if (_check_locale_and_function('pgettext')) - return pgettext($context, $msgid); - else - return _pgettext($context, $msgid); -} - -function T_dpgettext($domain, $context, $msgid) { - if (_check_locale_and_function('dpgettext')) - return dpgettext($domain, $context, $msgid); - else - return _dpgettext($domain, $context, $msgid); -} - -function T_dcpgettext($domain, $context, $msgid, $category) { - if (_check_locale_and_function('dcpgettext')) - return dcpgettext($domain, $context, $msgid, $category); - else - return _dcpgettext($domain, $context, $msgid, $category); -} - -function T_npgettext($context, $singular, $plural, $number) { - if (_check_locale_and_function('npgettext')) - return npgettext($context, $singular, $plural, $number); - else - return _npgettext($context, $singular, $plural, $number); -} - -function T_dnpgettext($domain, $context, $singular, $plural, $number) { - if (_check_locale_and_function('dnpgettext')) - return dnpgettext($domain, $context, $singular, $plural, $number); - else - return _dnpgettext($domain, $context, $singular, $plural, $number); -} - -function T_dcnpgettext($domain, $context, $singular, $plural, - $number, $category) { - if (_check_locale_and_function('dcnpgettext')) - return dcnpgettext($domain, $context, $singular, - $plural, $number, $category); - else - return _dcnpgettext($domain, $context, $singular, - $plural, $number, $category); -} - - - -// Wrappers used as a drop in replacement for the standard gettext functions - -if (!function_exists('gettext')) { - function bindtextdomain($domain, $path) { - return _bindtextdomain($domain, $path); - } - function bind_textdomain_codeset($domain, $codeset) { - return _bind_textdomain_codeset($domain, $codeset); - } - function textdomain($domain) { - return _textdomain($domain); - } - function gettext($msgid) { - return _gettext($msgid); - } - function _($msgid) { - return __($msgid); - } - function ngettext($singular, $plural, $number) { - return _ngettext($singular, $plural, $number); - } - function dgettext($domain, $msgid) { - return _dgettext($domain, $msgid); - } - function dngettext($domain, $singular, $plural, $number) { - return _dngettext($domain, $singular, $plural, $number); - } - function dcgettext($domain, $msgid, $category) { - return _dcgettext($domain, $msgid, $category); - } - function dcngettext($domain, $singular, $plural, $number, $category) { - return _dcngettext($domain, $singular, $plural, $number, $category); - } - function pgettext($context, $msgid) { - return _pgettext($context, $msgid); - } - function npgettext($context, $singular, $plural, $number) { - return _npgettext($context, $singular, $plural, $number); - } - function dpgettext($domain, $context, $msgid) { - return _dpgettext($domain, $context, $msgid); - } - function dnpgettext($domain, $context, $singular, $plural, $number) { - return _dnpgettext($domain, $context, $singular, $plural, $number); - } - function dcpgettext($domain, $context, $msgid, $category) { - return _dcpgettext($domain, $context, $msgid, $category); - } - function dcnpgettext($domain, $context, $singular, $plural, - $number, $category) { - return _dcnpgettext($domain, $context, $singular, $plural, - $number, $category); - } -} - -?> diff --git a/include/limesurvey/classes/php-gettext/gettext.php b/include/limesurvey/classes/php-gettext/gettext.php deleted file mode 100644 index 5064047c..00000000 --- a/include/limesurvey/classes/php-gettext/gettext.php +++ /dev/null @@ -1,432 +0,0 @@ -. - Copyright (c) 2005 Nico Kaiser - - This file is part of PHP-gettext. - - PHP-gettext is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - PHP-gettext is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with PHP-gettext; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -/** - * Provides a simple gettext replacement that works independently from - * the system's gettext abilities. - * It can read MO files and use them for translating strings. - * The files are passed to gettext_reader as a Stream (see streams.php) - * - * This version has the ability to cache all strings and translations to - * speed up the string lookup. - * While the cache is enabled by default, it can be switched off with the - * second parameter in the constructor (e.g. whenusing very large MO files - * that you don't want to keep in memory) - */ -class gettext_reader { - //public: - var $error = 0; // public variable that holds error code (0 if no error) - - //private: - var $BYTEORDER = 0; // 0: low endian, 1: big endian - var $STREAM = NULL; - var $short_circuit = false; - var $enable_cache = false; - var $originals = NULL; // offset of original table - var $translations = NULL; // offset of translation table - var $pluralheader = NULL; // cache header field for plural forms - var $total = 0; // total string count - var $table_originals = NULL; // table for original strings (offsets) - var $table_translations = NULL; // table for translated strings (offsets) - var $cache_translations = NULL; // original -> translation mapping - - - /* Methods */ - - - /** - * Reads a 32bit Integer from the Stream - * - * @access private - * @return Integer from the Stream - */ - function readint() { - if ($this->BYTEORDER == 0) { - // low endian - $input=unpack('V', $this->STREAM->read(4)); - return array_shift($input); - } else { - // big endian - $input=unpack('N', $this->STREAM->read(4)); - return array_shift($input); - } - } - - function read($bytes) { - return $this->STREAM->read($bytes); - } - - /** - * Reads an array of Integers from the Stream - * - * @param int count How many elements should be read - * @return Array of Integers - */ - function readintarray($count) { - if ($this->BYTEORDER == 0) { - // low endian - return unpack('V'.$count, $this->STREAM->read(4 * $count)); - } else { - // big endian - return unpack('N'.$count, $this->STREAM->read(4 * $count)); - } - } - - /** - * Constructor - * - * @param object Reader the StreamReader object - * @param boolean enable_cache Enable or disable caching of strings (default on) - */ - function gettext_reader($Reader, $enable_cache = true) { - // If there isn't a StreamReader, turn on short circuit mode. - if (! $Reader || isset($Reader->error) ) { - $this->short_circuit = true; - return; - } - - // Caching can be turned off - $this->enable_cache = $enable_cache; - - $MAGIC1 = "\x95\x04\x12\xde"; - $MAGIC2 = "\xde\x12\x04\x95"; - - $this->STREAM = $Reader; - $magic = $this->read(4); - if ($magic == $MAGIC1) { - $this->BYTEORDER = 1; - } elseif ($magic == $MAGIC2) { - $this->BYTEORDER = 0; - } else { - $this->error = 1; // not MO file - return false; - } - - // FIXME: Do we care about revision? We should. - $revision = $this->readint(); - - $this->total = $this->readint(); - $this->originals = $this->readint(); - $this->translations = $this->readint(); - } - - /** - * Loads the translation tables from the MO file into the cache - * If caching is enabled, also loads all strings into a cache - * to speed up translation lookups - * - * @access private - */ - function load_tables() { - if (is_array($this->cache_translations) && - is_array($this->table_originals) && - is_array($this->table_translations)) - return; - - /* get original and translations tables */ - if (!is_array($this->table_originals)) { - $this->STREAM->seekto($this->originals); - $this->table_originals = $this->readintarray($this->total * 2); - } - if (!is_array($this->table_translations)) { - $this->STREAM->seekto($this->translations); - $this->table_translations = $this->readintarray($this->total * 2); - } - - if ($this->enable_cache) { - $this->cache_translations = array (); - /* read all strings in the cache */ - for ($i = 0; $i < $this->total; $i++) { - $this->STREAM->seekto($this->table_originals[$i * 2 + 2]); - $original = $this->STREAM->read($this->table_originals[$i * 2 + 1]); - $this->STREAM->seekto($this->table_translations[$i * 2 + 2]); - $translation = $this->STREAM->read($this->table_translations[$i * 2 + 1]); - $this->cache_translations[$original] = $translation; - } - } - } - - /** - * Returns a string from the "originals" table - * - * @access private - * @param int num Offset number of original string - * @return string Requested string if found, otherwise '' - */ - function get_original_string($num) { - $length = $this->table_originals[$num * 2 + 1]; - $offset = $this->table_originals[$num * 2 + 2]; - if (! $length) - return ''; - $this->STREAM->seekto($offset); - $data = $this->STREAM->read($length); - return (string)$data; - } - - /** - * Returns a string from the "translations" table - * - * @access private - * @param int num Offset number of original string - * @return string Requested string if found, otherwise '' - */ - function get_translation_string($num) { - $length = $this->table_translations[$num * 2 + 1]; - $offset = $this->table_translations[$num * 2 + 2]; - if (! $length) - return ''; - $this->STREAM->seekto($offset); - $data = $this->STREAM->read($length); - return (string)$data; - } - - /** - * Binary search for string - * - * @access private - * @param string string - * @param int start (internally used in recursive function) - * @param int end (internally used in recursive function) - * @return int string number (offset in originals table) - */ - function find_string($string, $start = -1, $end = -1) { - if (($start == -1) or ($end == -1)) { - // find_string is called with only one parameter, set start end end - $start = 0; - $end = $this->total; - } - if (abs($start - $end) <= 1) { - // We're done, now we either found the string, or it doesn't exist - $txt = $this->get_original_string($start); - if ($string == $txt) - return $start; - else - return -1; - } else if ($start > $end) { - // start > end -> turn around and start over - return $this->find_string($string, $end, $start); - } else { - // Divide table in two parts - $half = (int)(($start + $end) / 2); - $cmp = strcmp($string, $this->get_original_string($half)); - if ($cmp == 0) - // string is exactly in the middle => return it - return $half; - else if ($cmp < 0) - // The string is in the upper half - return $this->find_string($string, $start, $half); - else - // The string is in the lower half - return $this->find_string($string, $half, $end); - } - } - - /** - * Translates a string - * - * @access public - * @param string string to be translated - * @return string translated string (or original, if not found) - */ - function translate($string) { - if ($this->short_circuit) - return $string; - $this->load_tables(); - - if ($this->enable_cache) { - // Caching enabled, get translated string from cache - if (array_key_exists($string, $this->cache_translations)) - return $this->cache_translations[$string]; - else - return $string; - } else { - // Caching not enabled, try to find string - $num = $this->find_string($string); - if ($num == -1) - return $string; - else - return $this->get_translation_string($num); - } - } - - /** - * Sanitize plural form expression for use in PHP eval call. - * - * @access private - * @return string sanitized plural form expression - */ - function sanitize_plural_expression($expr) { - // Get rid of disallowed characters. - $expr = preg_replace('@[^a-zA-Z0-9_:;\(\)\?\|\&=!<>+*/\%-]@', '', $expr); - - // Add parenthesis for tertiary '?' operator. - $expr .= ';'; - $res = ''; - $p = 0; - for ($i = 0; $i < strlen($expr); $i++) { - $ch = $expr[$i]; - switch ($ch) { - case '?': - $res .= ' ? ('; - $p++; - break; - case ':': - $res .= ') : ('; - break; - case ';': - $res .= str_repeat( ')', $p) . ';'; - $p = 0; - break; - default: - $res .= $ch; - } - } - return $res; - } - - /** - * Parse full PO header and extract only plural forms line. - * - * @access private - * @return string verbatim plural form header field - */ - function extract_plural_forms_header_from_po_header($header) { - if (preg_match("/(^|\n)plural-forms: ([^\n]*)\n/i", $header, $regs)) - $expr = $regs[2]; - else - $expr = "nplurals=2; plural=n == 1 ? 0 : 1;"; - return $expr; - } - - /** - * Get possible plural forms from MO header - * - * @access private - * @return string plural form header - */ - function get_plural_forms() { - // lets assume message number 0 is header - // this is true, right? - $this->load_tables(); - - // cache header field for plural forms - if (! is_string($this->pluralheader)) { - if ($this->enable_cache) { - $header = $this->cache_translations[""]; - } else { - $header = $this->get_translation_string(0); - } - $expr = $this->extract_plural_forms_header_from_po_header($header); - $this->pluralheader = $this->sanitize_plural_expression($expr); - } - return $this->pluralheader; - } - - /** - * Detects which plural form to take - * - * @access private - * @param n count - * @return int array index of the right plural form - */ - function select_string($n) { - $string = $this->get_plural_forms(); - $string = str_replace('nplurals',"\$total",$string); - $string = str_replace("n",$n,$string); - $string = str_replace('plural',"\$plural",$string); - - $total = 0; - $plural = 0; - - eval("$string"); - if ($plural >= $total) $plural = $total - 1; - return $plural; - } - - /** - * Plural version of gettext - * - * @access public - * @param string single - * @param string plural - * @param string number - * @return translated plural form - */ - function ngettext($single, $plural, $number) { - if ($this->short_circuit) { - if ($number != 1) - return $plural; - else - return $single; - } - - // find out the appropriate form - $select = $this->select_string($number); - - // this should contains all strings separated by NULLs - $key = $single . chr(0) . $plural; - - - if ($this->enable_cache) { - if (! array_key_exists($key, $this->cache_translations)) { - return ($number != 1) ? $plural : $single; - } else { - $result = $this->cache_translations[$key]; - $list = explode(chr(0), $result); - return $list[$select]; - } - } else { - $num = $this->find_string($key); - if ($num == -1) { - return ($number != 1) ? $plural : $single; - } else { - $result = $this->get_translation_string($num); - $list = explode(chr(0), $result); - return $list[$select]; - } - } - } - - function pgettext($context, $msgid) { - $key = $context . chr(4) . $msgid; - $ret = $this->translate($key); - if (strpos($ret, "\004") !== FALSE) { - return $msgid; - } else { - return $ret; - } - } - - function npgettext($context, $singular, $plural, $number) { - $key = $context . chr(4) . $singular; - $ret = $this->ngettext($key, $plural, $number); - if (strpos($ret, "\004") !== FALSE) { - return $singular; - } else { - return $ret; - } - - } -} - -?> diff --git a/include/limesurvey/classes/php-gettext/streams.php b/include/limesurvey/classes/php-gettext/streams.php deleted file mode 100644 index 3cdc1584..00000000 --- a/include/limesurvey/classes/php-gettext/streams.php +++ /dev/null @@ -1,167 +0,0 @@ -. - - This file is part of PHP-gettext. - - PHP-gettext is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - PHP-gettext is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with PHP-gettext; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - - - // Simple class to wrap file streams, string streams, etc. - // seek is essential, and it should be byte stream -class StreamReader { - // should return a string [FIXME: perhaps return array of bytes?] - function read($bytes) { - return false; - } - - // should return new position - function seekto($position) { - return false; - } - - // returns current position - function currentpos() { - return false; - } - - // returns length of entire stream (limit for seekto()s) - function length() { - return false; - } -}; - -class StringReader { - var $_pos; - var $_str; - - function StringReader($str='') { - $this->_str = $str; - $this->_pos = 0; - } - - function read($bytes) { - $data = substr($this->_str, $this->_pos, $bytes); - $this->_pos += $bytes; - if (strlen($this->_str)<$this->_pos) - $this->_pos = strlen($this->_str); - - return $data; - } - - function seekto($pos) { - $this->_pos = $pos; - if (strlen($this->_str)<$this->_pos) - $this->_pos = strlen($this->_str); - return $this->_pos; - } - - function currentpos() { - return $this->_pos; - } - - function length() { - return strlen($this->_str); - } - -}; - - -class FileReader { - var $_pos; - var $_fd; - var $_length; - - function FileReader($filename) { - if (file_exists($filename)) { - - $this->_length=filesize($filename); - $this->_pos = 0; - $this->_fd = fopen($filename,'rb'); - if (!$this->_fd) { - $this->error = 3; // Cannot read file, probably permissions - return false; - } - } else { - $this->error = 2; // File doesn't exist - return false; - } - } - - function read($bytes) { - if ($bytes) { - fseek($this->_fd, $this->_pos); - - // PHP 5.1.1 does not read more than 8192 bytes in one fread() - // the discussions at PHP Bugs suggest it's the intended behaviour - $data = ''; - while ($bytes > 0) { - $chunk = fread($this->_fd, $bytes); - $data .= $chunk; - $bytes -= strlen($chunk); - } - $this->_pos = ftell($this->_fd); - - return $data; - } else return ''; - } - - function seekto($pos) { - fseek($this->_fd, $pos); - $this->_pos = ftell($this->_fd); - return $this->_pos; - } - - function currentpos() { - return $this->_pos; - } - - function length() { - return $this->_length; - } - - function close() { - fclose($this->_fd); - } - -}; - -// Preloads entire file in memory first, then creates a StringReader -// over it (it assumes knowledge of StringReader internals) -class CachedFileReader extends StringReader { - function CachedFileReader($filename) { - if (file_exists($filename)) { - - $length=filesize($filename); - $fd = fopen($filename,'rb'); - - if (!$fd) { - $this->error = 3; // Cannot read file, probably permissions - return false; - } - $this->_str = fread($fd, $length); - fclose($fd); - - } else { - $this->error = 2; // File doesn't exist - return false; - } - } -}; - - -?> diff --git a/include/limesurvey/classes/phpmailer/LICENSE b/include/limesurvey/classes/phpmailer/LICENSE deleted file mode 100644 index f3f1b3b6..00000000 --- a/include/limesurvey/classes/phpmailer/LICENSE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/include/limesurvey/classes/phpmailer/README.php b/include/limesurvey/classes/phpmailer/README.php deleted file mode 100644 index aca3940a..00000000 --- a/include/limesurvey/classes/phpmailer/README.php +++ /dev/null @@ -1,151 +0,0 @@ - -/******************************************************************* * -The http://phpmailer.codeworxtech.com/ website now carries a few * * -advertisements through the Google Adsense network. Please visit * * the -advertiser sites and help us offset some of our costs. * * Thanks .... * -********************************************************************/ - -PHPMailer Full Featured Email Transfer Class for PHP -========================================== Version 5.1.0 (11/11/2009) - -With the release of this version, we are initiating a new version -numbering system to differentiate from the PHP4 version of PHPMailer. - -Most notable in this release is fully object oriented code. We now have -available the PHPDocumentor (phpdocs) documentation. This is separate -from the regular download to keep file sizes down. Please see the -download area of http://phpmailer.codeworxtech.com. We also have created -a new test script (see /test_script) that you can use right out of the -box. Copy the /test_script folder directly to your server (in the same -structure ... with class.phpmailer.php and class.smtp.php in the folder -above it. Then launch the test script with: -http://www.yourdomain.com/phpmailer/test_script/index.php from this one -script, you can test your server settings for mail(), sendmail (or -qmail), and SMTP. This will email you a sample email (using -contents.html for the email body) and two attachments. One of the -attachments is used as an inline image to demonstrate how PHPMailer will -automatically detect if attachments are the same source as inline -graphics and only include one version. Once you click the Submit button, -the results will be displayed including any SMTP debug information and -send status. We will also display a version of the script that you can -cut and paste to include in your projects. Enjoy! Version 2.3 (November -08, 2008) We have removed the /phpdoc from the downloads. All -documentation is now on the http://phpmailer.codeworxtech.com website. - -The phpunit.php has been updated to support PHP5. For all other changes -and notes, please see the changelog. Donations are accepted at PayPal -with our id "paypal@worxteam.com". Version 2.2 (July 15 2008) - see the -changelog. Version 2.1 (June 04 2008) With this release, we are -announcing that the development of PHPMailer for PHP5 will be our focus -from this date on. We have implemented all the enhancements and fixes -from the latest release of PHPMailer for PHP4. Far more important, -though, is that this release of PHPMailer (v2.1) is fully tested with -E_STRICT error checking enabled. ** NOTE: WE HAVE A NEW LANGUAGE -VARIABLE FOR DIGITALLY SIGNED S/MIME EMAILS. IF YOU CAN HELP WITH -LANGUAGES OTHER THAN ENGLISH AND SPANISH, IT WOULD BE APPRECIATED. We -have now added S/MIME functionality (ability to digitally sign emails). -BIG THANKS TO "sergiocambra" for posting this patch back in November -2007. The "Signed Emails" functionality adds the Sign method to pass the -private key filename and the password to read it, and then email will be -sent with content-type multipart/signed and with the digital signature -attached. A quick note on E_STRICT: - In about half the test -environments the development version was subjected to, an error was -thrown for the date() functions (used at line 1565 and 1569). This is -NOT a PHPMailer error, it is the result of an incorrectly configured -PHP5 installation. The fix is to modify your 'php.ini' file and include -the date.timezone = America/New York directive, (for your own server -timezone) - If you do get this error, and are unable to access your -php.ini file, there is a workaround. In your PHP script, add -date_default_timezone_set('America/Toronto'); * do NOT try to use $myVar -= date_default_timezone_get(); as a test, it will throw an error. We -have also included more example files to show the use of "sendmail", -"mail()", "smtp", and "gmail". We are also looking for more programmers -to join the volunteer development team. If you have an interest in this, -please let us know. Enjoy! Version 2.1.0beta1 & beta2 please note, this -is BETA software ** DO NOT USE THIS IN PRODUCTION OR LIVE PROJECTS -INTENDED STRICTLY FOR TESTING ** NOTE: As of November 2007, PHPMailer -has a new project team headed by industry veteran Andy Prevost -(codeworxtech). The first release in more than two years will focus on -fixes, adding ease-of-use enhancements, provide basic compatibility with -PHP4 and PHP5 using PHP5 backwards compatibility features. A new release -is planned before year-end 2007 that will provide full compatiblity with -PHP4 and PHP5, as well as more bug fixes. We are looking for project -developers to assist in restoring PHPMailer to its leadership position. -Our goals are to simplify use of PHPMailer, provide good documentation -and examples, and retain backward compatibility to level 1.7.3 -standards. If you are interested in helping out, visit -http://sourceforge.net/projects/phpmailer and indicate your interest. ** - -http://phpmailer.sourceforge.net/ This software is licenced under the -LGPL. Please read LICENSE for information on the software availability -and distribution. Class Features: - Send emails with multiple TOs, CCs, -BCCs and REPLY-TOs - Redundant SMTP servers - Multipart/alternative -emails for mail clients that do not read HTML email - Support for 8bit, -base64, binary, and quoted-printable encoding - Uses the same methods as -the very popular AspEmail active server (COM) component - SMTP -authentication - Native language support - Word wrap, and more! Why you -might need it: Many PHP developers utilize email in their code. The only -PHP function that supports this is the mail() function. However, it does -not expose any of the popular features that many email clients use -nowadays like HTML-based emails and attachments. There are two -proprietary development tools out there that have all the functionality -built into easy to use classes: AspEmail(tm) and AspMail. Both of these -programs are COM components only available on Windows. They are also a -little pricey for smaller projects. Since I do Linux development I�ve -missed these tools for my PHP coding. So I built a version myself that -implements the same methods (object calls) that the Windows-based -components do. It is open source and the LGPL license allows you to -place the class in your proprietary PHP projects. Installation: Copy -class.phpmailer.php into your php.ini include_path. If you are using the -SMTP mailer then place class.smtp.php in your path as well. In the -language directory you will find several files like -phpmailer.lang-en.php. If you look right before the .php extension that -there are two letters. These represent the language type of the -translation file. For instance "en" is the English file and "br" is the -Portuguese file. Chose the file that best fits with your language and -place it in the PHP include path. If your language is English then you -have nothing more to do. If it is a different language then you must -point PHPMailer to the correct translation. To do this, call the -PHPMailer SetLanguage method like so: // To load the Portuguese version -$mail->SetLanguage("br", "/optional/path/to/language/directory/"); - -That's it. You should now be ready to use PHPMailer! A Simple Example: - -IsSMTP(); // set mailer to use SMTP -$mail->Host = "smtp1.example.com;smtp2.example.com"; // specify main and backup server -$mail->SMTPAuth = true; // turn on SMTP authentication -$mail->Username = "jswan"; // SMTP username -$mail->Password = "secret"; // SMTP password - -$mail->From = "from@example.com"; -$mail->FromName = "Mailer"; -$mail->AddAddress("josh@example.net", "Josh Adams"); -$mail->AddAddress("ellen@example.com"); // name is optional -$mail->AddReplyTo("info@example.com", "Information"); - -$mail->WordWrap = 50; // set word wrap to 50 characters -$mail->AddAttachment("/var/tmp/file.tar.gz"); // add attachments -$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // optional name -$mail->IsHTML(true); // set email format to HTML - -$mail->Subject = "Here is the subject"; -$mail->Body = "This is the HTML message body in bold!"; -$mail->AltBody = "This is the body in plain text for non-HTML mail clients"; - -if(!$mail->Send()) -{ - echo "Message could not be sent.

        "; - echo "Mailer Error: " . $mail->ErrorInfo; - exit; -} - -echo "Message has been sent"; -?> - -CHANGELOG See ChangeLog.txt Download: -http://sourceforge.net/project/showfiles.php?group_id=26031 Andy Prevost diff --git a/include/limesurvey/classes/phpmailer/class.phpmailer.php b/include/limesurvey/classes/phpmailer/class.phpmailer.php deleted file mode 100644 index 144892c8..00000000 --- a/include/limesurvey/classes/phpmailer/class.phpmailer.php +++ /dev/null @@ -1,2319 +0,0 @@ -exceptions = ($exceptions == true); - } - - /** - * Sets message type to HTML. - * @param bool $ishtml - * @return void - */ - public function IsHTML($ishtml = true) { - if ($ishtml) { - $this->ContentType = 'text/html'; - } else { - $this->ContentType = 'text/plain'; - } - } - - /** - * Sets Mailer to send message using SMTP. - * @return void - */ - public function IsSMTP() { - $this->Mailer = 'smtp'; - } - - /** - * Sets Mailer to send message using PHP mail() function. - * @return void - */ - public function IsMail() { - $this->Mailer = 'mail'; - } - - /** - * Sets Mailer to send message using the $Sendmail program. - * @return void - */ - public function IsSendmail() { - if (!stristr(ini_get('sendmail_path'), 'sendmail')) { - $this->Sendmail = '/var/qmail/bin/sendmail'; - } - $this->Mailer = 'sendmail'; - } - - /** - * Sets Mailer to send message using the qmail MTA. - * @return void - */ - public function IsQmail() { - if (stristr(ini_get('sendmail_path'), 'qmail')) { - $this->Sendmail = '/var/qmail/bin/sendmail'; - } - $this->Mailer = 'sendmail'; - } - - ///////////////////////////////////////////////// - // METHODS, RECIPIENTS - ///////////////////////////////////////////////// - - /** - * Adds a "To" address. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function AddAddress($address, $name = '') { - return $this->AddAnAddress('to', $address, $name); - } - - /** - * Adds a "Cc" address. - * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function AddCC($address, $name = '') { - return $this->AddAnAddress('cc', $address, $name); - } - - /** - * Adds a "Bcc" address. - * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer. - * @param string $address - * @param string $name - * @return boolean true on success, false if address already used - */ - public function AddBCC($address, $name = '') { - return $this->AddAnAddress('bcc', $address, $name); - } - - /** - * Adds a "Reply-to" address. - * @param string $address - * @param string $name - * @return boolean - */ - public function AddReplyTo($address, $name = '') { - return $this->AddAnAddress('ReplyTo', $address, $name); - } - - /** - * Adds an address to one of the recipient arrays - * Addresses that have been added already return false, but do not throw exceptions - * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo' - * @param string $address The email address to send to - * @param string $name - * @return boolean true on success, false if address already used or invalid in some way - * @access private - */ - private function AddAnAddress($kind, $address, $name = '') { - if (!preg_match('/^(to|cc|bcc|ReplyTo)$/', $kind)) { - echo 'Invalid recipient array: ' . kind; - return false; - } - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - if (!self::ValidateAddress($address)) { - $this->SetError($this->Lang('invalid_address').': '. $address); - if ($this->exceptions) { - throw new phpmailerException($this->Lang('invalid_address').': '.$address); - } - echo $this->Lang('invalid_address').': '.$address; - return false; - } - if ($kind != 'ReplyTo') { - if (!isset($this->all_recipients[strtolower($address)])) { - array_push($this->$kind, array($address, $name)); - $this->all_recipients[strtolower($address)] = true; - return true; - } - } else { - if (!array_key_exists(strtolower($address), $this->ReplyTo)) { - $this->ReplyTo[strtolower($address)] = array($address, $name); - return true; - } - } - return false; - } - - /** - * Set the From and FromName properties - * @param string $address - * @param string $name - * @return boolean - */ - public function SetFrom($address, $name = '',$auto=1) { - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - if (!self::ValidateAddress($address)) { - $this->SetError($this->Lang('invalid_address').': '. $address); - if ($this->exceptions) { - throw new phpmailerException($this->Lang('invalid_address').': '.$address); - } - echo $this->Lang('invalid_address').': '.$address; - return false; - } - $this->From = $address; - $this->FromName = $name; - if ($auto) { - if (empty($this->ReplyTo)) { - $this->AddAnAddress('ReplyTo', $address, $name); - } - if (empty($this->Sender)) { - $this->Sender = $address; - } - } - return true; - } - - /** - * Check that a string looks roughly like an email address should - * Static so it can be used without instantiation - * Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator - * Conforms approximately to RFC2822 - * @link http://www.hexillion.com/samples/#Regex Original pattern found here - * @param string $address The email address to check - * @return boolean - * @static - * @access public - */ - public static function ValidateAddress($address) { - if (function_exists('filter_var')) { //Introduced in PHP 5.2 - if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) { - return false; - } else { - return true; - } - } else { - return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address); - } - } - - ///////////////////////////////////////////////// - // METHODS, MAIL SENDING - ///////////////////////////////////////////////// - - /** - * Creates message and assigns Mailer. If the message is - * not sent successfully then it returns false. Use the ErrorInfo - * variable to view description of the error. - * @return bool - */ - public function Send() { - try { - if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { - throw new phpmailerException($this->Lang('provide_address'), self::STOP_CRITICAL); - } - - // Set whether the message is multipart/alternative - if(!empty($this->AltBody)) { - $this->ContentType = 'multipart/alternative'; - } - - $this->error_count = 0; // reset errors - $this->SetMessageType(); - $header = $this->CreateHeader(); - $body = $this->CreateBody(); - - if (empty($this->Body)) { - throw new phpmailerException($this->Lang('empty_message'), self::STOP_CRITICAL); - } - - // digitally sign with DKIM if enabled - if ($this->DKIM_domain && $this->DKIM_private) { - $header_dkim = $this->DKIM_Add($header,$this->Subject,$body); - $header = str_replace("\r\n","\n",$header_dkim) . $header; - } - - // Choose the mailer and send through it - switch($this->Mailer) { - case 'sendmail': - return $this->SendmailSend($header, $body); - case 'smtp': - return $this->SmtpSend($header, $body); - default: - return $this->MailSend($header, $body); - } - - } catch (phpmailerException $e) { - $this->SetError($e->getMessage()); - if ($this->exceptions) { - throw $e; - } - return false; - } - } - - /** - * Sends mail using the $Sendmail program. - * @param string $header The message headers - * @param string $body The message body - * @access protected - * @return bool - */ - protected function SendmailSend($header, $body) { - if ($this->Sender != '') { - $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); - } else { - $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail)); - } - if ($this->SingleTo === true) { - foreach ($this->SingleToArray as $key => $val) { - if(!@$mail = popen($sendmail, 'w')) { - throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - fputs($mail, "To: " . $val . "\n"); - fputs($mail, $header); - fputs($mail, $body); - $result = pclose($mail); - // implement call back function if it exists - $isSent = ($result == 0) ? 1 : 0; - $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); - if($result != 0) { - throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - } - } else { - if(!@$mail = popen($sendmail, 'w')) { - throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - fputs($mail, $header); - fputs($mail, $body); - $result = pclose($mail); - // implement call back function if it exists - $isSent = ($result == 0) ? 1 : 0; - $this->doCallback($isSent,$this->to,$this->cc,$this->bcc,$this->Subject,$body); - if($result != 0) { - throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - } - return true; - } - - /** - * Sends mail using the PHP mail() function. - * @param string $header The message headers - * @param string $body The message body - * @access protected - * @return bool - */ - protected function MailSend($header, $body) { - $toArr = array(); - foreach($this->to as $t) { - $toArr[] = $this->AddrFormat($t); - } - $to = implode(', ', $toArr); - - $params = sprintf("-oi -f %s", $this->Sender); - if ($this->Sender != '' && strlen(@ini_get('safe_mode'))< 1) { - $old_from = ini_get('sendmail_from'); - ini_set('sendmail_from', $this->Sender); - if ($this->SingleTo === true && count($toArr) > 1) { - foreach ($toArr as $key => $val) { - $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); - // implement call back function if it exists - $isSent = ($rt == 1) ? 1 : 0; - $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); - } - } else { - $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); - // implement call back function if it exists - $isSent = ($rt == 1) ? 1 : 0; - $this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body); - } - } else { - if ($this->SingleTo === true && count($toArr) > 1) { - foreach ($toArr as $key => $val) { - $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); - // implement call back function if it exists - $isSent = ($rt == 1) ? 1 : 0; - $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); - } - } else { - $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header); - // implement call back function if it exists - $isSent = ($rt == 1) ? 1 : 0; - $this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body); - } - } - if (isset($old_from)) { - ini_set('sendmail_from', $old_from); - } - if(!$rt) { - throw new phpmailerException($this->Lang('instantiate'), self::STOP_CRITICAL); - } - return true; - } - - /** - * Sends mail via SMTP using PhpSMTP - * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. - * @param string $header The message headers - * @param string $body The message body - * @uses SMTP - * @access protected - * @return bool - */ - protected function SmtpSend($header, $body) { - require_once $this->PluginDir . 'class.smtp.php'; - $bad_rcpt = array(); - - if(!$this->SmtpConnect()) { - throw new phpmailerException($this->Lang('smtp_connect_failed'), self::STOP_CRITICAL); - } - $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender; - if(!$this->smtp->Mail($smtp_from)) { - throw new phpmailerException($this->Lang('from_failed') . $smtp_from, self::STOP_CRITICAL); - } - - // Attempt to send attach all recipients - foreach($this->to as $to) { - if (!$this->smtp->Recipient($to[0])) { - $bad_rcpt[] = $to[0]; - // implement call back function if it exists - $isSent = 0; - $this->doCallback($isSent,$to[0],'','',$this->Subject,$body); - } else { - // implement call back function if it exists - $isSent = 1; - $this->doCallback($isSent,$to[0],'','',$this->Subject,$body); - } - } - foreach($this->cc as $cc) { - if (!$this->smtp->Recipient($cc[0])) { - $bad_rcpt[] = $cc[0]; - // implement call back function if it exists - $isSent = 0; - $this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body); - } else { - // implement call back function if it exists - $isSent = 1; - $this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body); - } - } - foreach($this->bcc as $bcc) { - if (!$this->smtp->Recipient($bcc[0])) { - $bad_rcpt[] = $bcc[0]; - // implement call back function if it exists - $isSent = 0; - $this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body); - } else { - // implement call back function if it exists - $isSent = 1; - $this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body); - } - } - - - if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses - $badaddresses = implode(', ', $bad_rcpt); - throw new phpmailerException($this->Lang('recipients_failed') . $badaddresses); - } - if(!$this->smtp->Data($header . $body)) { - throw new phpmailerException($this->Lang('data_not_accepted'), self::STOP_CRITICAL); - } - if($this->SMTPKeepAlive == true) { - $this->smtp->Reset(); - } - return true; - } - - /** - * Initiates a connection to an SMTP server. - * Returns false if the operation failed. - * @uses SMTP - * @access public - * @return bool - */ - public function SmtpConnect() { - if(is_null($this->smtp)) { - $this->smtp = new SMTP(); - } - - $this->smtp->do_debug = $this->SMTPDebug; - $hosts = explode(';', $this->Host); - $index = 0; - $connection = $this->smtp->Connected(); - - // Retry while there is no connection - try { - while($index < count($hosts) && !$connection) { - $hostinfo = array(); - if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) { - $host = $hostinfo[1]; - $port = $hostinfo[2]; - } else { - $host = $hosts[$index]; - $port = $this->Port; - } - - $tls = ($this->SMTPSecure == 'tls'); - $ssl = ($this->SMTPSecure == 'ssl'); - - if ($this->smtp->Connect(($ssl ? 'ssl://':'').$host, $port, $this->Timeout)) { - - $hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname()); - $this->smtp->Hello($hello); - - if ($tls) { - if (!$this->smtp->StartTLS()) { - throw new phpmailerException($this->Lang('tls')); - } - - //We must resend HELO after tls negotiation - $this->smtp->Hello($hello); - } - - $connection = true; - if ($this->SMTPAuth) { - if (!$this->smtp->Authenticate($this->Username, $this->Password)) { - throw new phpmailerException($this->Lang('authenticate')); - } - } - } - $index++; - if (!$connection) { - throw new phpmailerException($this->Lang('connect_host')); - } - } - } catch (phpmailerException $e) { - $this->smtp->Reset(); - throw $e; - } - return true; - } - - /** - * Closes the active SMTP session if one exists. - * @return void - */ - public function SmtpClose() { - if(!is_null($this->smtp)) { - if($this->smtp->Connected()) { - $this->smtp->Quit(); - $this->smtp->Close(); - } - } - } - - /** - * Sets the language for all class error messages. - * Returns false if it cannot load the language file. The default language is English. - * @param string $langcode ISO 639-1 2-character language code (e.g. Portuguese: "br") - * @param string $lang_path Path to the language file directory - * @access public - */ - function SetLanguage($langcode = 'en', $lang_path = 'language/') { - //Define full set of translatable strings - $PHPMAILER_LANG = array( - 'provide_address' => 'You must provide at least one recipient email address.', - 'mailer_not_supported' => ' mailer is not supported.', - 'execute' => 'Could not execute: ', - 'instantiate' => 'Could not instantiate mail function.', - 'authenticate' => 'SMTP Error: Could not authenticate.', - 'from_failed' => 'The following From address failed: ', - 'recipients_failed' => 'SMTP Error: The following recipients failed: ', - 'data_not_accepted' => 'SMTP Error: Data not accepted.', - 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', - 'file_access' => 'Could not access file: ', - 'file_open' => 'File Error: Could not open file: ', - 'encoding' => 'Unknown encoding: ', - 'signing' => 'Signing Error: ', - 'smtp_error' => 'SMTP server error: ', - 'empty_message' => 'Message body empty', - 'invalid_address' => 'Invalid address', - 'variable_set' => 'Cannot set or reset variable: ' - ); - //Overwrite language-specific strings. This way we'll never have missing translations - no more "language string failed to load"! - $l = true; - if ($langcode != 'en') { //There is no English translation file - $l = @include $lang_path.'phpmailer.lang-'.$langcode.'.php'; - } - $this->language = $PHPMAILER_LANG; - return ($l == true); //Returns false if language not found - } - - /** - * Return the current array of language strings - * @return array - */ - public function GetTranslations() { - return $this->language; - } - - ///////////////////////////////////////////////// - // METHODS, MESSAGE CREATION - ///////////////////////////////////////////////// - - /** - * Creates recipient headers. - * @access public - * @return string - */ - public function AddrAppend($type, $addr) { - $addr_str = $type . ': '; - $addresses = array(); - foreach ($addr as $a) { - $addresses[] = $this->AddrFormat($a); - } - $addr_str .= implode(', ', $addresses); - $addr_str .= $this->LE; - - return $addr_str; - } - - /** - * Formats an address correctly. - * @access public - * @return string - */ - public function AddrFormat($addr) { - if (empty($addr[1])) { - return $this->SecureHeader($addr[0]); - } else { - return $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">"; - } - } - - /** - * Wraps message for use with mailers that do not - * automatically perform wrapping and for quoted-printable. - * Original written by philippe. - * @param string $message The message to wrap - * @param integer $length The line length to wrap to - * @param boolean $qp_mode Whether to run in Quoted-Printable mode - * @access public - * @return string - */ - public function WrapText($message, $length, $qp_mode = false) { - $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE; - // If utf-8 encoding is used, we will need to make sure we don't - // split multibyte characters when we wrap - $is_utf8 = (strtolower($this->CharSet) == "utf-8"); - - $message = $this->FixEOL($message); - if (substr($message, -1) == $this->LE) { - $message = substr($message, 0, -1); - } - - $line = explode($this->LE, $message); - $message = ''; - for ($i=0 ;$i < count($line); $i++) { - $line_part = explode(' ', $line[$i]); - $buf = ''; - for ($e = 0; $e $length)) { - $space_left = $length - strlen($buf) - 1; - if ($e != 0) { - if ($space_left > 20) { - $len = $space_left; - if ($is_utf8) { - $len = $this->UTF8CharBoundary($word, $len); - } elseif (substr($word, $len - 1, 1) == "=") { - $len--; - } elseif (substr($word, $len - 2, 1) == "=") { - $len -= 2; - } - $part = substr($word, 0, $len); - $word = substr($word, $len); - $buf .= ' ' . $part; - $message .= $buf . sprintf("=%s", $this->LE); - } else { - $message .= $buf . $soft_break; - } - $buf = ''; - } - while (strlen($word) > 0) { - $len = $length; - if ($is_utf8) { - $len = $this->UTF8CharBoundary($word, $len); - } elseif (substr($word, $len - 1, 1) == "=") { - $len--; - } elseif (substr($word, $len - 2, 1) == "=") { - $len -= 2; - } - $part = substr($word, 0, $len); - $word = substr($word, $len); - - if (strlen($word) > 0) { - $message .= $part . sprintf("=%s", $this->LE); - } else { - $buf = $part; - } - } - } else { - $buf_o = $buf; - $buf .= ($e == 0) ? $word : (' ' . $word); - - if (strlen($buf) > $length and $buf_o != '') { - $message .= $buf_o . $soft_break; - $buf = $word; - } - } - } - $message .= $buf . $this->LE; - } - - return $message; - } - - /** - * Finds last character boundary prior to maxLength in a utf-8 - * quoted (printable) encoded string. - * Original written by Colin Brown. - * @access public - * @param string $encodedText utf-8 QP text - * @param int $maxLength find last character boundary prior to this length - * @return int - */ - public function UTF8CharBoundary($encodedText, $maxLength) { - $foundSplitPos = false; - $lookBack = 3; - while (!$foundSplitPos) { - $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); - $encodedCharPos = strpos($lastChunk, "="); - if ($encodedCharPos !== false) { - // Found start of encoded character byte within $lookBack block. - // Check the encoded byte value (the 2 chars after the '=') - $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); - $dec = hexdec($hex); - if ($dec < 128) { // Single byte character. - // If the encoded char was found at pos 0, it will fit - // otherwise reduce maxLength to start of the encoded char - $maxLength = ($encodedCharPos == 0) ? $maxLength : - $maxLength - ($lookBack - $encodedCharPos); - $foundSplitPos = true; - } elseif ($dec >= 192) { // First byte of a multi byte character - // Reduce maxLength to split at start of character - $maxLength = $maxLength - ($lookBack - $encodedCharPos); - $foundSplitPos = true; - } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back - $lookBack += 3; - } - } else { - // No encoded character found - $foundSplitPos = true; - } - } - return $maxLength; - } - - - /** - * Set the body wrapping. - * @access public - * @return void - */ - public function SetWordWrap() { - if($this->WordWrap < 1) { - return; - } - - switch($this->message_type) { - case 'alt': - case 'alt_attachments': - $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap); - break; - default: - $this->Body = $this->WrapText($this->Body, $this->WordWrap); - break; - } - } - - /** - * Assembles message header. - * @access public - * @return string The assembled header - */ - public function CreateHeader() { - $result = ''; - - // Set the boundaries - $uniq_id = md5(uniqid(time())); - $this->boundary[1] = 'b1_' . $uniq_id; - $this->boundary[2] = 'b2_' . $uniq_id; - - $result .= $this->HeaderLine('Date', self::RFCDate()); - if($this->Sender == '') { - $result .= $this->HeaderLine('Return-Path', trim($this->From)); - } else { - $result .= $this->HeaderLine('Return-Path', trim($this->Sender)); - } - - // To be created automatically by mail() - if($this->Mailer != 'mail') { - if ($this->SingleTo === true) { - foreach($this->to as $t) { - $this->SingleToArray[] = $this->AddrFormat($t); - } - } else { - if(count($this->to) > 0) { - $result .= $this->AddrAppend('To', $this->to); - } elseif (count($this->cc) == 0) { - $result .= $this->HeaderLine('To', 'undisclosed-recipients:;'); - } - } - } - - $from = array(); - $from[0][0] = trim($this->From); - $from[0][1] = $this->FromName; - $result .= $this->AddrAppend('From', $from); - - // sendmail and mail() extract Cc from the header before sending - if(count($this->cc) > 0) { - $result .= $this->AddrAppend('Cc', $this->cc); - } - - // sendmail and mail() extract Bcc from the header before sending - if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) { - $result .= $this->AddrAppend('Bcc', $this->bcc); - } - - if(count($this->ReplyTo) > 0) { - $result .= $this->AddrAppend('Reply-to', $this->ReplyTo); - } - - // mail() sets the subject itself - if($this->Mailer != 'mail') { - $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject))); - } - - if($this->MessageID != '') { - $result .= $this->HeaderLine('Message-ID',$this->MessageID); - } else { - $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); - } - $result .= $this->HeaderLine('X-Priority', $this->Priority); - $result .= $this->HeaderLine('X-Mailer', 'PHPMailer '.$this->Version.' (phpmailer.sourceforge.net)'); - - if($this->ConfirmReadingTo != '') { - $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>'); - } - - // Add custom headers - for($index = 0; $index < count($this->CustomHeader); $index++) { - $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1]))); - } - if (!$this->sign_key_file) { - $result .= $this->HeaderLine('MIME-Version', '1.0'); - $result .= $this->GetMailMIME(); - } - - return $result; - } - - /** - * Returns the message MIME. - * @access public - * @return string - */ - public function GetMailMIME() { - $result = ''; - switch($this->message_type) { - case 'plain': - $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding); - $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet); - break; - case 'attachments': - case 'alt_attachments': - if($this->InlineImageExists()){ - $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE); - } else { - $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;'); - $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); - } - break; - case 'alt': - $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;'); - $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - } - - if($this->Mailer != 'mail') { - $result .= $this->LE.$this->LE; - } - - return $result; - } - - /** - * Assembles the message body. Returns an empty string on failure. - * @access public - * @return string The assembled message body - */ - public function CreateBody() { - $body = ''; - - if ($this->sign_key_file) { - $body .= $this->GetMailMIME(); - } - - $this->SetWordWrap(); - - switch($this->message_type) { - case 'alt': - $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', ''); - $body .= $this->EncodeString($this->AltBody, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->GetBoundary($this->boundary[1], '', 'text/html', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->EndBoundary($this->boundary[1]); - break; - case 'plain': - $body .= $this->EncodeString($this->Body, $this->Encoding); - break; - case 'attachments': - $body .= $this->GetBoundary($this->boundary[1], '', '', ''); - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE; - $body .= $this->AttachAll(); - break; - case 'alt_attachments': - $body .= sprintf("--%s%s", $this->boundary[1], $this->LE); - $body .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE); - $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body - $body .= $this->EncodeString($this->AltBody, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body - $body .= $this->EncodeString($this->Body, $this->Encoding); - $body .= $this->LE.$this->LE; - $body .= $this->EndBoundary($this->boundary[2]); - $body .= $this->AttachAll(); - break; - } - - if ($this->IsError()) { - $body = ''; - } elseif ($this->sign_key_file) { - try { - $file = tempnam('', 'mail'); - file_put_contents($file, $body); //TODO check this worked - $signed = tempnam("", "signed"); - if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), NULL)) { - @unlink($file); - @unlink($signed); - $body = file_get_contents($signed); - } else { - @unlink($file); - @unlink($signed); - throw new phpmailerException($this->Lang("signing").openssl_error_string()); - } - } catch (phpmailerException $e) { - $body = ''; - if ($this->exceptions) { - throw $e; - } - } - } - - return $body; - } - - /** - * Returns the start of a message boundary. - * @access private - */ - private function GetBoundary($boundary, $charSet, $contentType, $encoding) { - $result = ''; - if($charSet == '') { - $charSet = $this->CharSet; - } - if($contentType == '') { - $contentType = $this->ContentType; - } - if($encoding == '') { - $encoding = $this->Encoding; - } - $result .= $this->TextLine('--' . $boundary); - $result .= sprintf("Content-Type: %s; charset=\"%s\"", $contentType, $charSet); - $result .= $this->LE; - $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding); - $result .= $this->LE; - - return $result; - } - - /** - * Returns the end of a message boundary. - * @access private - */ - private function EndBoundary($boundary) { - return $this->LE . '--' . $boundary . '--' . $this->LE; - } - - /** - * Sets the message type. - * @access private - * @return void - */ - private function SetMessageType() { - if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) { - $this->message_type = 'plain'; - } else { - if(count($this->attachment) > 0) { - $this->message_type = 'attachments'; - } - if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) { - $this->message_type = 'alt'; - } - if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) { - $this->message_type = 'alt_attachments'; - } - } - } - - /** - * Returns a formatted header line. - * @access public - * @return string - */ - public function HeaderLine($name, $value) { - return $name . ': ' . $value . $this->LE; - } - - /** - * Returns a formatted mail line. - * @access public - * @return string - */ - public function TextLine($value) { - return $value . $this->LE; - } - - ///////////////////////////////////////////////// - // CLASS METHODS, ATTACHMENTS - ///////////////////////////////////////////////// - - /** - * Adds an attachment from a path on the filesystem. - * Returns false if the file could not be found - * or accessed. - * @param string $path Path to the attachment. - * @param string $name Overrides the attachment name. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @return bool - */ - public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { - try { - if ( !@is_file($path) ) { - throw new phpmailerException($this->Lang('file_access') . $path, self::STOP_CONTINUE); - } - $filename = basename($path); - if ( $name == '' ) { - $name = $filename; - } - - $this->attachment[] = array( - 0 => $path, - 1 => $filename, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => false, // isStringAttachment - 6 => 'attachment', - 7 => 0 - ); - - } catch (phpmailerException $e) { - $this->SetError($e->getMessage()); - if ($this->exceptions) { - throw $e; - } - echo $e->getMessage()."\n"; - if ( $e->getCode() == self::STOP_CRITICAL ) { - return false; - } - } - return true; - } - - /** - * Return the current array of attachments - * @return array - */ - public function GetAttachments() { - return $this->attachment; - } - - /** - * Attaches all fs, string, and binary attachments to the message. - * Returns an empty string on failure. - * @access private - * @return string - */ - private function AttachAll() { - // Return text of body - $mime = array(); - $cidUniq = array(); - $incl = array(); - - // Add all attachments - foreach ($this->attachment as $attachment) { - // Check for string attachment - $bString = $attachment[5]; - if ($bString) { - $string = $attachment[0]; - } else { - $path = $attachment[0]; - } - - if (in_array($attachment[0], $incl)) { continue; } - $filename = $attachment[1]; - $name = $attachment[2]; - $encoding = $attachment[3]; - $type = $attachment[4]; - $disposition = $attachment[6]; - $cid = $attachment[7]; - $incl[] = $attachment[0]; - if ( $disposition == 'inline' && isset($cidUniq[$cid]) ) { continue; } - $cidUniq[$cid] = true; - - $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE); - $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE); - $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE); - - if($disposition == 'inline') { - $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE); - } - - $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$this->LE); - - // Encode as string attachment - if($bString) { - $mime[] = $this->EncodeString($string, $encoding); - if($this->IsError()) { - return ''; - } - $mime[] = $this->LE.$this->LE; - } else { - $mime[] = $this->EncodeFile($path, $encoding); - if($this->IsError()) { - return ''; - } - $mime[] = $this->LE.$this->LE; - } - } - - $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE); - - return join('', $mime); - } - - /** - * Encodes attachment in requested format. - * Returns an empty string on failure. - * @param string $path The full path to the file - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * @see EncodeFile() - * @access private - * @return string - */ - private function EncodeFile($path, $encoding = 'base64') { - try { - if (!is_readable($path)) { - throw new phpmailerException($this->Lang('file_open') . $path, self::STOP_CONTINUE); - } - if (function_exists('get_magic_quotes')) { - function get_magic_quotes() { - return false; - } - } - if (PHP_VERSION < 6) { - $magic_quotes = get_magic_quotes_runtime(); - @set_magic_quotes_runtime(0); - } - $file_buffer = file_get_contents($path); - $file_buffer = $this->EncodeString($file_buffer, $encoding); - if (PHP_VERSION < 6) { @set_magic_quotes_runtime($magic_quotes); } - return $file_buffer; - } catch (Exception $e) { - $this->SetError($e->getMessage()); - return ''; - } - } - - /** - * Encodes string to requested format. - * Returns an empty string on failure. - * @param string $str The text to encode - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * @access public - * @return string - */ - public function EncodeString ($str, $encoding = 'base64') { - $encoded = ''; - switch(strtolower($encoding)) { - case 'base64': - $encoded = chunk_split(base64_encode($str), 76, $this->LE); - break; - case '7bit': - case '8bit': - $encoded = $this->FixEOL($str); - //Make sure it ends with a line break - if (substr($encoded, -(strlen($this->LE))) != $this->LE) - $encoded .= $this->LE; - break; - case 'binary': - $encoded = $str; - break; - case 'quoted-printable': - $encoded = $this->EncodeQP($str); - break; - default: - $this->SetError($this->Lang('encoding') . $encoding); - break; - } - return $encoded; - } - - /** - * Encode a header string to best (shortest) of Q, B, quoted or none. - * @access public - * @return string - */ - public function EncodeHeader($str, $position = 'text') { - $x = 0; - - switch (strtolower($position)) { - case 'phrase': - if (!preg_match('/[\200-\377]/', $str)) { - // Can't use addslashes as we don't know what value has magic_quotes_sybase - $encoded = addcslashes($str, "\0..\37\177\\\""); - if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { - return ($encoded); - } else { - return ("\"$encoded\""); - } - } - $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); - break; - case 'comment': - $x = preg_match_all('/[()"]/', $str, $matches); - // Fall-through - case 'text': - default: - $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); - break; - } - - if ($x == 0) { - return ($str); - } - - $maxlen = 75 - 7 - strlen($this->CharSet); - // Try to select the encoding which should produce the shortest output - if (strlen($str)/3 < $x) { - $encoding = 'B'; - if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) { - // Use a custom function which correctly encodes and wraps long - // multibyte strings without breaking lines within a character - $encoded = $this->Base64EncodeWrapMB($str); - } else { - $encoded = base64_encode($str); - $maxlen -= $maxlen % 4; - $encoded = trim(chunk_split($encoded, $maxlen, "\n")); - } - } else { - $encoding = 'Q'; - $encoded = $this->EncodeQ($str, $position); - $encoded = $this->WrapText($encoded, $maxlen, true); - $encoded = str_replace('='.$this->LE, "\n", trim($encoded)); - } - - $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded); - $encoded = trim(str_replace("\n", $this->LE, $encoded)); - - return $encoded; - } - - /** - * Checks if a string contains multibyte characters. - * @access public - * @param string $str multi-byte text to wrap encode - * @return bool - */ - public function HasMultiBytes($str) { - if (function_exists('mb_strlen')) { - return (strlen($str) > mb_strlen($str, $this->CharSet)); - } else { // Assume no multibytes (we can't handle without mbstring functions anyway) - return false; - } - } - - /** - * Correctly encodes and wraps long multibyte strings for mail headers - * without breaking lines within a character. - * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php - * @access public - * @param string $str multi-byte text to wrap encode - * @return string - */ - public function Base64EncodeWrapMB($str) { - $start = "=?".$this->CharSet."?B?"; - $end = "?="; - $encoded = ""; - - $mb_length = mb_strlen($str, $this->CharSet); - // Each line must have length <= 75, including $start and $end - $length = 75 - strlen($start) - strlen($end); - // Average multi-byte ratio - $ratio = $mb_length / strlen($str); - // Base64 has a 4:3 ratio - $offset = $avgLength = floor($length * $ratio * .75); - - for ($i = 0; $i < $mb_length; $i += $offset) { - $lookBack = 0; - - do { - $offset = $avgLength - $lookBack; - $chunk = mb_substr($str, $i, $offset, $this->CharSet); - $chunk = base64_encode($chunk); - $lookBack++; - } - while (strlen($chunk) > $length); - - $encoded .= $chunk . $this->LE; - } - - // Chomp the last linefeed - $encoded = substr($encoded, 0, -strlen($this->LE)); - return $encoded; - } - - /** - * Encode string to quoted-printable. - * Only uses standard PHP, slow, but will always work - * @access public - * @param string $string the text to encode - * @param integer $line_max Number of chars allowed on a line before wrapping - * @return string - */ - public function EncodeQPphp( $input = '', $line_max = 76, $space_conv = false) { - $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); - $lines = preg_split('/(?:\r\n|\r|\n)/', $input); - $eol = "\r\n"; - $escape = '='; - $output = ''; - while( list(, $line) = each($lines) ) { - $linlen = strlen($line); - $newline = ''; - for($i = 0; $i < $linlen; $i++) { - $c = substr( $line, $i, 1 ); - $dec = ord( $c ); - if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E - $c = '=2E'; - } - if ( $dec == 32 ) { - if ( $i == ( $linlen - 1 ) ) { // convert space at eol only - $c = '=20'; - } else if ( $space_conv ) { - $c = '=20'; - } - } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required - $h2 = floor($dec/16); - $h1 = floor($dec%16); - $c = $escape.$hex[$h2].$hex[$h1]; - } - if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted - $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay - $newline = ''; - // check if newline first character will be point or not - if ( $dec == 46 ) { - $c = '=2E'; - } - } - $newline .= $c; - } // end of for - $output .= $newline.$eol; - } // end of while - return $output; - } - - /** - * Encode string to RFC2045 (6.7) quoted-printable format - * Uses a PHP5 stream filter to do the encoding about 64x faster than the old version - * Also results in same content as you started with after decoding - * @see EncodeQPphp() - * @access public - * @param string $string the text to encode - * @param integer $line_max Number of chars allowed on a line before wrapping - * @param boolean $space_conv Dummy param for compatibility with existing EncodeQP function - * @return string - * @author Marcus Bointon - */ - public function EncodeQP($string, $line_max = 76, $space_conv = false) { - if (function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3) - return quoted_printable_encode($string); - } - $filters = stream_get_filters(); - if (!in_array('convert.*', $filters)) { //Got convert stream filter? - return $this->EncodeQPphp($string, $line_max, $space_conv); //Fall back to old implementation - } - $fp = fopen('php://temp/', 'r+'); - $string = preg_replace('/\r\n?/', $this->LE, $string); //Normalise line breaks - $params = array('line-length' => $line_max, 'line-break-chars' => $this->LE); - $s = stream_filter_append($fp, 'convert.quoted-printable-encode', STREAM_FILTER_READ, $params); - fputs($fp, $string); - rewind($fp); - $out = stream_get_contents($fp); - stream_filter_remove($s); - $out = preg_replace('/^\./m', '=2E', $out); //Encode . if it is first char on a line, workaround for bug in Exchange - fclose($fp); - return $out; - } - - /** - * Encode string to q encoding. - * @link http://tools.ietf.org/html/rfc2047 - * @param string $str the text to encode - * @param string $position Where the text is going to be used, see the RFC for what that means - * @access public - * @return string - */ - public function EncodeQ ($str, $position = 'text') { - // There should not be any EOL in the string - $encoded = preg_replace('/[\r\n]*/', '', $str); - - switch (strtolower($position)) { - case 'phrase': - $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); - break; - case 'comment': - $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); - case 'text': - default: - // Replace every high ascii, control =, ? and _ characters - //TODO using /e (equivalent to eval()) is probably not a good idea - $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e', - "'='.sprintf('%02X', ord('\\1'))", $encoded); - break; - } - - // Replace every spaces to _ (more readable than =20) - $encoded = str_replace(' ', '_', $encoded); - - return $encoded; - } - - /** - * Adds a string or binary attachment (non-filesystem) to the list. - * This method can be used to attach ascii or binary data, - * such as a BLOB record from a database. - * @param string $string String attachment data. - * @param string $filename Name of the attachment. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @return void - */ - public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') { - // Append to $attachment array - $this->attachment[] = array( - 0 => $string, - 1 => $filename, - 2 => basename($filename), - 3 => $encoding, - 4 => $type, - 5 => true, // isStringAttachment - 6 => 'attachment', - 7 => 0 - ); - } - - /** - * Adds an embedded attachment. This can include images, sounds, and - * just about any other document. Make sure to set the $type to an - * image type. For JPEG images use "image/jpeg" and for GIF images - * use "image/gif". - * @param string $path Path to the attachment. - * @param string $cid Content ID of the attachment. Use this to identify - * the Id for accessing the image in an HTML form. - * @param string $name Overrides the attachment name. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @return bool - */ - public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { - - if ( !@is_file($path) ) { - $this->SetError($this->Lang('file_access') . $path); - return false; - } - - $filename = basename($path); - if ( $name == '' ) { - $name = $filename; - } - - // Append to $attachment array - $this->attachment[] = array( - 0 => $path, - 1 => $filename, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => false, // isStringAttachment - 6 => 'inline', - 7 => $cid - ); - - return true; - } - - /** - * Returns true if an inline attachment is present. - * @access public - * @return bool - */ - public function InlineImageExists() { - foreach($this->attachment as $attachment) { - if ($attachment[6] == 'inline') { - return true; - } - } - return false; - } - - ///////////////////////////////////////////////// - // CLASS METHODS, MESSAGE RESET - ///////////////////////////////////////////////// - - /** - * Clears all recipients assigned in the TO array. Returns void. - * @return void - */ - public function ClearAddresses() { - foreach($this->to as $to) { - unset($this->all_recipients[strtolower($to[0])]); - } - $this->to = array(); - } - - /** - * Clears all recipients assigned in the CC array. Returns void. - * @return void - */ - public function ClearCCs() { - foreach($this->cc as $cc) { - unset($this->all_recipients[strtolower($cc[0])]); - } - $this->cc = array(); - } - - /** - * Clears all recipients assigned in the BCC array. Returns void. - * @return void - */ - public function ClearBCCs() { - foreach($this->bcc as $bcc) { - unset($this->all_recipients[strtolower($bcc[0])]); - } - $this->bcc = array(); - } - - /** - * Clears all recipients assigned in the ReplyTo array. Returns void. - * @return void - */ - public function ClearReplyTos() { - $this->ReplyTo = array(); - } - - /** - * Clears all recipients assigned in the TO, CC and BCC - * array. Returns void. - * @return void - */ - public function ClearAllRecipients() { - $this->to = array(); - $this->cc = array(); - $this->bcc = array(); - $this->all_recipients = array(); - } - - /** - * Clears all previously set filesystem, string, and binary - * attachments. Returns void. - * @return void - */ - public function ClearAttachments() { - $this->attachment = array(); - } - - /** - * Clears all custom headers. Returns void. - * @return void - */ - public function ClearCustomHeaders() { - $this->CustomHeader = array(); - } - - ///////////////////////////////////////////////// - // CLASS METHODS, MISCELLANEOUS - ///////////////////////////////////////////////// - - /** - * Adds the error message to the error container. - * @access protected - * @return void - */ - protected function SetError($msg) { - $this->error_count++; - if ($this->Mailer == 'smtp' and !is_null($this->smtp)) { - $lasterror = $this->smtp->getError(); - if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) { - $msg .= '

        ' . $this->Lang('smtp_error') . $lasterror['smtp_msg'] . "

        \n"; - } - } - $this->ErrorInfo = $msg; - } - - /** - * Returns the proper RFC 822 formatted date. - * @access public - * @return string - * @static - */ - public static function RFCDate() { - $tz = date('Z'); - $tzs = ($tz < 0) ? '-' : '+'; - $tz = abs($tz); - $tz = (int)($tz/3600)*100 + ($tz%3600)/60; - $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz); - - return $result; - } - - /** - * Returns the server hostname or 'localhost.localdomain' if unknown. - * @access private - * @return string - */ - private function ServerHostname() { - if (!empty($this->Hostname)) { - $result = $this->Hostname; - } elseif (isset($_SERVER['SERVER_NAME'])) { - $result = $_SERVER['SERVER_NAME']; - } else { - $result = 'localhost.localdomain'; - } - - return $result; - } - - /** - * Returns a message in the appropriate language. - * @access private - * @return string - */ - private function Lang($key) { - if(count($this->language) < 1) { - $this->SetLanguage('en'); // set the default language - } - - if(isset($this->language[$key])) { - return $this->language[$key]; - } else { - return 'Language string failed to load: ' . $key; - } - } - - /** - * Returns true if an error occurred. - * @access public - * @return bool - */ - public function IsError() { - return ($this->error_count > 0); - } - - /** - * Changes every end of line from CR or LF to CRLF. - * @access private - * @return string - */ - private function FixEOL($str) { - $str = str_replace("\r\n", "\n", $str); - $str = str_replace("\r", "\n", $str); - $str = str_replace("\n", $this->LE, $str); - return $str; - } - - /** - * Adds a custom header. - * @access public - * @return void - */ - public function AddCustomHeader($custom_header) { - $this->CustomHeader[] = explode(':', $custom_header, 2); - } - - /** - * Evaluates the message and returns modifications for inline images and backgrounds - * @access public - * @return $message - */ - public function MsgHTML($message, $basedir = '') { - preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images); - if(isset($images[2])) { - foreach($images[2] as $i => $url) { - // do not change urls for absolute images (thanks to corvuscorax) - if (!preg_match('#^[A-z]+://#',$url)) { - $filename = basename($url); - $directory = dirname($url); - ($directory == '.')?$directory='':''; - $cid = 'cid:' . md5($filename); - $ext = pathinfo($filename, PATHINFO_EXTENSION); - $mimeType = self::_mime_types($ext); - if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; } - if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; } - if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) { - $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message); - } - } - } - } - $this->IsHTML(true); - $this->Body = $message; - $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message))); - if (!empty($textMsg) && empty($this->AltBody)) { - $this->AltBody = html_entity_decode($textMsg); - } - if (empty($this->AltBody)) { - $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n"; - } - } - - /** - * Gets the MIME type of the embedded or inline image - * @param string File extension - * @access public - * @return string MIME type of ext - * @static - */ - public static function _mime_types($ext = '') { - $mimes = array( - 'hqx' => 'application/mac-binhex40', - 'cpt' => 'application/mac-compactpro', - 'doc' => 'application/msword', - 'bin' => 'application/macbinary', - 'dms' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'exe' => 'application/octet-stream', - 'class' => 'application/octet-stream', - 'psd' => 'application/octet-stream', - 'so' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'dll' => 'application/octet-stream', - 'oda' => 'application/oda', - 'pdf' => 'application/pdf', - 'ai' => 'application/postscript', - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'mif' => 'application/vnd.mif', - 'xls' => 'application/vnd.ms-excel', - 'ppt' => 'application/vnd.ms-powerpoint', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', - 'dvi' => 'application/x-dvi', - 'gtar' => 'application/x-gtar', - 'php' => 'application/x-httpd-php', - 'php4' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'js' => 'application/x-javascript', - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => 'application/x-tar', - 'xhtml' => 'application/xhtml+xml', - 'xht' => 'application/xhtml+xml', - 'zip' => 'application/zip', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mpga' => 'audio/mpeg', - 'mp2' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'aif' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', - 'rv' => 'video/vnd.rn-realvideo', - 'wav' => 'audio/x-wav', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'jpe' => 'image/jpeg', - 'png' => 'image/png', - 'tiff' => 'image/tiff', - 'tif' => 'image/tiff', - 'css' => 'text/css', - 'html' => 'text/html', - 'htm' => 'text/html', - 'shtml' => 'text/html', - 'txt' => 'text/plain', - 'text' => 'text/plain', - 'log' => 'text/plain', - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'xml' => 'text/xml', - 'xsl' => 'text/xml', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'qt' => 'video/quicktime', - 'mov' => 'video/quicktime', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie', - 'doc' => 'application/msword', - 'word' => 'application/msword', - 'xl' => 'application/excel', - 'eml' => 'message/rfc822' - ); - return (!isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)]; - } - - /** - * Set (or reset) Class Objects (variables) - * - * Usage Example: - * $page->set('X-Priority', '3'); - * - * @access public - * @param string $name Parameter Name - * @param mixed $value Parameter Value - * NOTE: will not work with arrays, there are no arrays to set/reset - * @todo Should this not be using __set() magic function? - */ - public function set($name, $value = '') { - try { - if (isset($this->$name) ) { - $this->$name = $value; - } else { - throw new phpmailerException($this->Lang('variable_set') . $name, self::STOP_CRITICAL); - } - } catch (Exception $e) { - $this->SetError($e->getMessage()); - if ($e->getCode() == self::STOP_CRITICAL) { - return false; - } - } - return true; - } - - /** - * Strips newlines to prevent header injection. - * @access public - * @param string $str String - * @return string - */ - public function SecureHeader($str) { - $str = str_replace("\r", '', $str); - $str = str_replace("\n", '', $str); - return trim($str); - } - - /** - * Set the private key file and password to sign the message. - * - * @access public - * @param string $key_filename Parameter File Name - * @param string $key_pass Password for private key - */ - public function Sign($cert_filename, $key_filename, $key_pass) { - $this->sign_cert_file = $cert_filename; - $this->sign_key_file = $key_filename; - $this->sign_key_pass = $key_pass; - } - - /** - * Set the private key file and password to sign the message. - * - * @access public - * @param string $key_filename Parameter File Name - * @param string $key_pass Password for private key - */ - public function DKIM_QP($txt) { - $tmp=""; - $line=""; - for ($i=0;$iDKIM_private); - if ($this->DKIM_passphrase!='') { - $privKey = openssl_pkey_get_private($privKeyStr,$this->DKIM_passphrase); - } else { - $privKey = $privKeyStr; - } - if (openssl_sign($s, $signature, $privKey)) { - return base64_encode($signature); - } - } - - /** - * Generate DKIM Canonicalization Header - * - * @access public - * @param string $s Header - */ - public function DKIM_HeaderC($s) { - $s=preg_replace("/\r\n\s+/"," ",$s); - $lines=explode("\r\n",$s); - foreach ($lines as $key=>$line) { - list($heading,$value)=explode(":",$line,2); - $heading=strtolower($heading); - $value=preg_replace("/\s+/"," ",$value) ; // Compress useless spaces - $lines[$key]=$heading.":".trim($value) ; // Don't forget to remove WSP around the value - } - $s=implode("\r\n",$lines); - return $s; - } - - /** - * Generate DKIM Canonicalization Body - * - * @access public - * @param string $body Message Body - */ - public function DKIM_BodyC($body) { - if ($body == '') return "\r\n"; - // stabilize line endings - $body=str_replace("\r\n","\n",$body); - $body=str_replace("\n","\r\n",$body); - // END stabilize line endings - while (substr($body,strlen($body)-4,4) == "\r\n\r\n") { - $body=substr($body,0,strlen($body)-2); - } - return $body; - } - - /** - * Create the DKIM header, body, as new header - * - * @access public - * @param string $headers_line Header lines - * @param string $subject Subject - * @param string $body Body - */ - public function DKIM_Add($headers_line,$subject,$body) { - $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms - $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body - $DKIMquery = 'dns/txt'; // Query method - $DKIMtime = time() ; // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone) - $subject_header = "Subject: $subject"; - $headers = explode("\r\n",$headers_line); - foreach($headers as $header) { - if (strpos($header,'From:') === 0) { - $from_header=$header; - } elseif (strpos($header,'To:') === 0) { - $to_header=$header; - } - } - $from = str_replace('|','=7C',$this->DKIM_QP($from_header)); - $to = str_replace('|','=7C',$this->DKIM_QP($to_header)); - $subject = str_replace('|','=7C',$this->DKIM_QP($subject_header)) ; // Copied header fields (dkim-quoted-printable - $body = $this->DKIM_BodyC($body); - $DKIMlen = strlen($body) ; // Length of body - $DKIMb64 = base64_encode(pack("H*", sha1($body))) ; // Base64 of packed binary SHA-1 hash of body - $ident = ($this->DKIM_identity == '')? '' : " i=" . $this->DKIM_identity . ";"; - $dkimhdrs = "DKIM-Signature: v=1; a=" . $DKIMsignatureType . "; q=" . $DKIMquery . "; l=" . $DKIMlen . "; s=" . $this->DKIM_selector . ";\r\n". - "\tt=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\r\n". - "\th=From:To:Subject;\r\n". - "\td=" . $this->DKIM_domain . ";" . $ident . "\r\n". - "\tz=$from\r\n". - "\t|$to\r\n". - "\t|$subject;\r\n". - "\tbh=" . $DKIMb64 . ";\r\n". - "\tb="; - $toSign = $this->DKIM_HeaderC($from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs); - $signed = $this->DKIM_Sign($toSign); - return "X-PHPMAILER-DKIM: phpmailer.worxware.com\r\n".$dkimhdrs.$signed."\r\n"; - } - - protected function doCallback($isSent,$to,$cc,$bcc,$subject,$body) { - if (!empty($this->action_function) && function_exists($this->action_function)) { - $params = array($isSent,$to,$cc,$bcc,$subject,$body); - call_user_func_array($this->action_function,$params); - } - } -} - -class phpmailerException extends Exception { - public function errorMessage() { - $errorMsg = '' . $this->getMessage() . "
        \n"; - return $errorMsg; - } -} -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/class.smtp.php b/include/limesurvey/classes/phpmailer/class.smtp.php deleted file mode 100644 index 7ccefa80..00000000 --- a/include/limesurvey/classes/phpmailer/class.smtp.php +++ /dev/null @@ -1,818 +0,0 @@ -smtp_conn = 0; - $this->error = null; - $this->helo_rply = null; - - $this->do_debug = 0; - } - - ///////////////////////////////////////////////// - // CONNECTION FUNCTIONS - ///////////////////////////////////////////////// - - /** - * Connect to the server specified on the port specified. - * If the port is not specified use the default SMTP_PORT. - * If tval is specified then a connection will try and be - * established with the server for that number of seconds. - * If tval is not specified the default is 30 seconds to - * try on the connection. - * - * SMTP CODE SUCCESS: 220 - * SMTP CODE FAILURE: 421 - * @access public - * @return bool - */ - public function Connect($host, $port = 0, $tval = 30) { - // set the error val to null so there is no confusion - $this->error = null; - - // make sure we are __not__ connected - if($this->connected()) { - // already connected, generate error - $this->error = array("error" => "Already connected to a server"); - return false; - } - - if(empty($port)) { - $port = $this->SMTP_PORT; - } - - // connect to the smtp server - $this->smtp_conn = @fsockopen($host, // the host of the server - $port, // the port to use - $errno, // error number if any - $errstr, // error message if any - $tval); // give up after ? secs - // verify we connected properly - if(empty($this->smtp_conn)) { - $this->error = array("error" => "Failed to connect to server", - "errno" => $errno, - "errstr" => $errstr); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '
        '; - } - return false; - } - - // SMTP server can take longer to respond, give longer timeout for first read - // Windows does not have support for this timeout function - if(substr(PHP_OS, 0, 3) != "WIN") - socket_set_timeout($this->smtp_conn, $tval, 0); - - // get any announcement - $announce = $this->get_lines(); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '
        '; - } - - return true; - } - - /** - * Initiate a TLS communication with the server. - * - * SMTP CODE 220 Ready to start TLS - * SMTP CODE 501 Syntax error (no parameters allowed) - * SMTP CODE 454 TLS not available due to temporary reason - * @access public - * @return bool success - */ - public function StartTLS() { - $this->error = null; # to avoid confusion - - if(!$this->connected()) { - $this->error = array("error" => "Called StartTLS() without being connected"); - return false; - } - - fputs($this->smtp_conn,"STARTTLS" . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
        '; - } - - if($code != 220) { - $this->error = - array("error" => "STARTTLS not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - - // Begin encrypted connection - if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { - return false; - } - - return true; - } - - /** - * Performs SMTP authentication. Must be run after running the - * Hello() method. Returns true if successfully authenticated. - * @access public - * @return bool - */ - public function Authenticate($username, $password) { - // Start authentication - fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($code != 334) { - $this->error = - array("error" => "AUTH not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - - // Send encoded username - fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($code != 334) { - $this->error = - array("error" => "Username not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - - // Send encoded password - fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($code != 235) { - $this->error = - array("error" => "Password not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - - return true; - } - - /** - * Returns true if connected to a server otherwise false - * @access public - * @return bool - */ - public function Connected() { - if(!empty($this->smtp_conn)) { - $sock_status = socket_get_status($this->smtp_conn); - if($sock_status["eof"]) { - // the socket is valid but we are not connected - if($this->do_debug >= 1) { - echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected"; - } - $this->Close(); - return false; - } - return true; // everything looks good - } - return false; - } - - /** - * Closes the socket and cleans up the state of the class. - * It is not considered good to use this function without - * first trying to use QUIT. - * @access public - * @return void - */ - public function Close() { - $this->error = null; // so there is no confusion - $this->helo_rply = null; - if(!empty($this->smtp_conn)) { - // close the connection and cleanup - fclose($this->smtp_conn); - $this->smtp_conn = 0; - } - } - - ///////////////////////////////////////////////// - // SMTP COMMANDS - ///////////////////////////////////////////////// - - /** - * Issues a data command and sends the msg_data to the server - * finializing the mail transaction. $msg_data is the message - * that is to be send with the headers. Each header needs to be - * on a single line followed by a with the message headers - * and the message body being seperated by and additional . - * - * Implements rfc 821: DATA - * - * SMTP CODE INTERMEDIATE: 354 - * [data] - * . - * SMTP CODE SUCCESS: 250 - * SMTP CODE FAILURE: 552,554,451,452 - * SMTP CODE FAILURE: 451,554 - * SMTP CODE ERROR : 500,501,503,421 - * @access public - * @return bool - */ - public function Data($msg_data) { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - "error" => "Called Data() without being connected"); - return false; - } - - fputs($this->smtp_conn,"DATA" . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
        '; - } - - if($code == 250) { - $rply = $this->get_lines(); - $code = substr($rply,0,3); - } - if($code != 354) { - $this->error = - array("error" => "DATA command not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - - /* the server is ready to accept data! - * according to rfc 821 we should not send more than 1000 - * including the CRLF - * characters on a single line so we will break the data up - * into lines by \r and/or \n then if needed we will break - * each of those into smaller lines to fit within the limit. - * in addition we will be looking for lines that start with - * a period '.' and append and additional period '.' to that - * line. NOTE: this does not count towards limit. - */ - - // normalize the line breaks so we know the explode works - $msg_data = str_replace("\r\n","\n",$msg_data); - $msg_data = str_replace("\r","\n",$msg_data); - $lines = explode("\n",$msg_data); - - /* we need to find a good way to determine is headers are - * in the msg_data or if it is a straight msg body - * currently I am assuming rfc 822 definitions of msg headers - * and if the first field of the first line (':' sperated) - * does not contain a space then it _should_ be a header - * and we can process all lines before a blank "" line as - * headers. - */ - - $field = substr($lines[0],0,strpos($lines[0],":")); - $in_headers = false; - if(!empty($field) && !strstr($field," ")) { - $in_headers = true; - } - - $max_line_length = 998; // used below; set here for ease in change - - while(list(,$line) = @each($lines)) { - $lines_out = null; - if($line == "" && $in_headers) { - $in_headers = false; - } - // ok we need to break this line up into several smaller lines - while(strlen($line) > $max_line_length) { - $pos = strrpos(substr($line,0,$max_line_length)," "); - - // Patch to fix DOS attack - if(!$pos) { - $pos = $max_line_length - 1; - $lines_out[] = substr($line,0,$pos); - $line = substr($line,$pos); - } else { - $lines_out[] = substr($line,0,$pos); - $line = substr($line,$pos + 1); - } - - /* if processing headers add a LWSP-char to the front of new line - * rfc 822 on long msg headers - */ - if($in_headers) { - $line = "\t" . $line; - } - } - $lines_out[] = $line; - - // send the lines to the server - while(list(,$line_out) = @each($lines_out)) { - if(strlen($line_out) > 0) - { - if(substr($line_out, 0, 1) == ".") { - $line_out = "." . $line_out; - } - } - fputs($this->smtp_conn,$line_out . $this->CRLF); - } - } - - // message data has been sent - fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
        '; - } - - if($code != 250) { - $this->error = - array("error" => "DATA not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - return true; - } - - /** - * Sends the HELO command to the smtp server. - * This makes sure that we and the server are in - * the same known state. - * - * Implements from rfc 821: HELO - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE ERROR : 500, 501, 504, 421 - * @access public - * @return bool - */ - public function Hello($host = '') { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - "error" => "Called Hello() without being connected"); - return false; - } - - // if hostname for HELO was not specified send default - if(empty($host)) { - // determine appropriate default to send to server - $host = "localhost"; - } - - // Send extended hello first (RFC 2821) - if(!$this->SendHello("EHLO", $host)) { - if(!$this->SendHello("HELO", $host)) { - return false; - } - } - - return true; - } - - /** - * Sends a HELO/EHLO command. - * @access private - * @return bool - */ - private function SendHello($hello, $host) { - fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '
        '; - } - - if($code != 250) { - $this->error = - array("error" => $hello . " not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - - $this->helo_rply = $rply; - - return true; - } - - /** - * Starts a mail transaction from the email address specified in - * $from. Returns true if successful or false otherwise. If True - * the mail transaction is started and then one or more Recipient - * commands may be called followed by a Data command. - * - * Implements rfc 821: MAIL FROM: - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE SUCCESS: 552,451,452 - * SMTP CODE SUCCESS: 500,501,421 - * @access public - * @return bool - */ - public function Mail($from) { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - "error" => "Called Mail() without being connected"); - return false; - } - - $useVerp = ($this->do_verp ? "XVERP" : ""); - fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
        '; - } - - if($code != 250) { - $this->error = - array("error" => "MAIL not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - return true; - } - - /** - * Sends the quit command to the server and then closes the socket - * if there is no error or the $close_on_error argument is true. - * - * Implements from rfc 821: QUIT - * - * SMTP CODE SUCCESS: 221 - * SMTP CODE ERROR : 500 - * @access public - * @return bool - */ - public function Quit($close_on_error = true) { - $this->error = null; // so there is no confusion - - if(!$this->connected()) { - $this->error = array( - "error" => "Called Quit() without being connected"); - return false; - } - - // send the quit command to the server - fputs($this->smtp_conn,"quit" . $this->CRLF); - - // get any good-bye messages - $byemsg = $this->get_lines(); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '
        '; - } - - $rval = true; - $e = null; - - $code = substr($byemsg,0,3); - if($code != 221) { - // use e as a tmp var cause Close will overwrite $this->error - $e = array("error" => "SMTP server rejected quit command", - "smtp_code" => $code, - "smtp_rply" => substr($byemsg,4)); - $rval = false; - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '
        '; - } - } - - if(empty($e) || $close_on_error) { - $this->Close(); - } - - return $rval; - } - - /** - * Sends the command RCPT to the SMTP server with the TO: argument of $to. - * Returns true if the recipient was accepted false if it was rejected. - * - * Implements from rfc 821: RCPT TO: - * - * SMTP CODE SUCCESS: 250,251 - * SMTP CODE FAILURE: 550,551,552,553,450,451,452 - * SMTP CODE ERROR : 500,501,503,421 - * @access public - * @return bool - */ - public function Recipient($to) { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - "error" => "Called Recipient() without being connected"); - return false; - } - - fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
        '; - } - - if($code != 250 && $code != 251) { - $this->error = - array("error" => "RCPT not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - return true; - } - - /** - * Sends the RSET command to abort and transaction that is - * currently in progress. Returns true if successful false - * otherwise. - * - * Implements rfc 821: RSET - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE ERROR : 500,501,504,421 - * @access public - * @return bool - */ - public function Reset() { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - "error" => "Called Reset() without being connected"); - return false; - } - - fputs($this->smtp_conn,"RSET" . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
        '; - } - - if($code != 250) { - $this->error = - array("error" => "RSET failed", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - - return true; - } - - /** - * Starts a mail transaction from the email address specified in - * $from. Returns true if successful or false otherwise. If True - * the mail transaction is started and then one or more Recipient - * commands may be called followed by a Data command. This command - * will send the message to the users terminal if they are logged - * in and send them an email. - * - * Implements rfc 821: SAML FROM: - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE SUCCESS: 552,451,452 - * SMTP CODE SUCCESS: 500,501,502,421 - * @access public - * @return bool - */ - public function SendAndMail($from) { - $this->error = null; // so no confusion is caused - - if(!$this->connected()) { - $this->error = array( - "error" => "Called SendAndMail() without being connected"); - return false; - } - - fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); - - $rply = $this->get_lines(); - $code = substr($rply,0,3); - - if($this->do_debug >= 2) { - echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
        '; - } - - if($code != 250) { - $this->error = - array("error" => "SAML not accepted from server", - "smtp_code" => $code, - "smtp_msg" => substr($rply,4)); - if($this->do_debug >= 1) { - echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
        '; - } - return false; - } - return true; - } - - /** - * This is an optional command for SMTP that this class does not - * support. This method is here to make the RFC821 Definition - * complete for this class and __may__ be implimented in the future - * - * Implements from rfc 821: TURN - * - * SMTP CODE SUCCESS: 250 - * SMTP CODE FAILURE: 502 - * SMTP CODE ERROR : 500, 503 - * @access public - * @return bool - */ - public function Turn() { - $this->error = array("error" => "This method, TURN, of the SMTP ". - "is not implemented"); - if($this->do_debug >= 1) { - echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '
        '; - } - return false; - } - - /** - * Get the current error - * @access public - * @return array - */ - public function getError() { - return $this->error; - } - - ///////////////////////////////////////////////// - // INTERNAL FUNCTIONS - ///////////////////////////////////////////////// - - /** - * Read in as many lines as possible - * either before eof or socket timeout occurs on the operation. - * With SMTP we can tell if we have more lines to read if the - * 4th character is '-' symbol. If it is a space then we don't - * need to read anything else. - * @access private - * @return string - */ - private function get_lines() { - $data = ""; - while($str = @fgets($this->smtp_conn,515)) { - if($this->do_debug >= 4) { - echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '
        '; - echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '
        '; - } - $data .= $str; - if($this->do_debug >= 4) { - echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '
        '; - } - // if 4th character is a space, we are done reading, break the loop - if(substr($str,3,1) == " ") { break; } - } - return $data; - } - -} - -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ar.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ar.php deleted file mode 100644 index 69cd36f8..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ar.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'SMTP Error: لم نستطع تأكيد الهوية.'; -$PHPMAILER_LANG['connect_host'] = 'SMTP Error: لم نستطع الاتصال بمخدم SMTP.'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: لم يتم قبول المعلومات .'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = 'ترميز غير معروف: '; -$PHPMAILER_LANG['execute'] = 'لم أستطع تنفيذ : '; -$PHPMAILER_LANG['file_access'] = 'لم نستطع الوصول للملف: '; -$PHPMAILER_LANG['file_open'] = 'File Error: لم نستطع فتح الملف: '; -$PHPMAILER_LANG['from_failed'] = 'البريد التالي لم نستطع ارسال البريد له : '; -$PHPMAILER_LANG['instantiate'] = 'لم نستطع توفير خدمة البريد.'; -//$PHPMAILER_LANG['invalid_email'] = 'Not sending, email address is invalid: '; -$PHPMAILER_LANG['mailer_not_supported'] = ' mailer غير مدعوم.'; -//$PHPMAILER_LANG['provide_address'] = 'You must provide at least one recipient email address.'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: الأخطاء التالية ' . - 'فشل في الارسال لكل من : '; -$PHPMAILER_LANG['signing'] = 'خطأ في التوقيع: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-br.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-br.php deleted file mode 100644 index 81e0004a..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-br.php +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ca.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ca.php deleted file mode 100644 index b7bbfd57..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ca.php +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ch.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ch.php deleted file mode 100644 index aef10563..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ch.php +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-cz.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-cz.php deleted file mode 100644 index 6e475191..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-cz.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-de.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-de.php deleted file mode 100644 index b858edfe..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-de.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-dk.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-dk.php deleted file mode 100644 index cd0e872a..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-dk.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'SMTP fejl: Kunne ikke logge på.'; -$PHPMAILER_LANG['connect_host'] = 'SMTP fejl: Kunne ikke tilslutte SMTP serveren.'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data kunne ikke accepteres.'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = 'Ukendt encode-format: '; -$PHPMAILER_LANG['execute'] = 'Kunne ikke køre: '; -$PHPMAILER_LANG['file_access'] = 'Ingen adgang til fil: '; -$PHPMAILER_LANG['file_open'] = 'Fil fejl: Kunne ikke åbne filen: '; -$PHPMAILER_LANG['from_failed'] = 'Følgende afsenderadresse er forkert: '; -$PHPMAILER_LANG['instantiate'] = 'Kunne ikke initialisere email funktionen.'; -//$PHPMAILER_LANG['invalid_email'] = 'Not sending, email address is invalid: '; -$PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.'; -$PHPMAILER_LANG['provide_address'] = 'Du skal indtaste mindst en modtagers emailadresse.'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: Følgende modtagere er forkerte: '; -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-en.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-en.php deleted file mode 100644 index f0e7be3f..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-en.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-es.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-es.php deleted file mode 100644 index 7b5e6086..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-es.php +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-et.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-et.php deleted file mode 100644 index 46f35c06..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-et.php +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fi.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fi.php deleted file mode 100644 index 1717625f..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fi.php +++ /dev/null @@ -1,27 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fo.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fo.php deleted file mode 100644 index 9878dc2b..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fo.php +++ /dev/null @@ -1,27 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fr.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fr.php deleted file mode 100644 index bef569b6..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-fr.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-hu.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-hu.php deleted file mode 100644 index e8ef92cf..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-hu.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-it.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-it.php deleted file mode 100644 index b0510bc4..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-it.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Impossibile autenticarsi.'; -$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Impossibile connettersi all\'host SMTP.'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Data non accettati dal server.'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = 'Encoding set dei caratteri sconosciuto: '; -$PHPMAILER_LANG['execute'] = 'Impossibile eseguire l\'operazione: '; -$PHPMAILER_LANG['file_access'] = 'Impossibile accedere al file: '; -$PHPMAILER_LANG['file_open'] = 'File Error: Impossibile aprire il file: '; -$PHPMAILER_LANG['from_failed'] = 'I seguenti indirizzi mittenti hanno generato errore: '; -$PHPMAILER_LANG['instantiate'] = 'Impossibile istanziare la funzione mail'; -//$PHPMAILER_LANG['invalid_email'] = 'Not sending, email address is invalid: '; -$PHPMAILER_LANG['provide_address'] = 'Deve essere fornito almeno un indirizzo ricevente'; -$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: I seguenti indirizzi destinatari hanno generato errore: '; -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ja.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ja.php deleted file mode 100644 index 1928e31f..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ja.php +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-nl.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-nl.php deleted file mode 100644 index 05780409..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-nl.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-no.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-no.php deleted file mode 100644 index ddf24ecf..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-no.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-pl.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-pl.php deleted file mode 100644 index 858078f8..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-pl.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ro.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ro.php deleted file mode 100644 index 925d842b..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ro.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'Eroare SMTP: Nu a functionat autentificarea.'; -$PHPMAILER_LANG['connect_host'] = 'Eroare SMTP: Nu m-am putut conecta la adresa SMTP.'; -$PHPMAILER_LANG['data_not_accepted'] = 'Eroare SMTP: Continutul mailului nu a fost acceptat.'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = 'Encodare necunoscuta: '; -$PHPMAILER_LANG['execute'] = 'Nu pot executa: '; -$PHPMAILER_LANG['file_access'] = 'Nu pot accesa fisierul: '; -$PHPMAILER_LANG['file_open'] = 'Eroare de fisier: Nu pot deschide fisierul: '; -$PHPMAILER_LANG['from_failed'] = 'Urmatoarele adrese From au dat eroare: '; -$PHPMAILER_LANG['instantiate'] = 'Nu am putut instantia functia mail.'; -//$PHPMAILER_LANG['invalid_email'] = 'Not sending, email address is invalid: '; -$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nu este suportat.'; -$PHPMAILER_LANG['provide_address'] = 'Trebuie sa adaugati cel putin un recipient (adresa de mail).'; -$PHPMAILER_LANG['recipients_failed'] = 'Eroare SMTP: Urmatoarele adrese de mail au dat eroare: '; -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ru.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ru.php deleted file mode 100644 index b5073746..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-ru.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'Ошибка SMTP: ошибка авторизации.'; -$PHPMAILER_LANG['connect_host'] = 'Ошибка SMTP: не удается подключиться к серверу SMTP.'; -$PHPMAILER_LANG['data_not_accepted'] = 'Ошибка SMTP: данные не приняты.'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = 'Неизвестный вид кодировки: '; -$PHPMAILER_LANG['execute'] = 'Невозможно выполнить команду: '; -$PHPMAILER_LANG['file_access'] = 'Нет доступа к файлу: '; -$PHPMAILER_LANG['file_open'] = 'Файловая ошибка: не удается открыть файл: '; -$PHPMAILER_LANG['from_failed'] = 'Неверный адрес отправителя: '; -$PHPMAILER_LANG['instantiate'] = 'Невозможно запустить функцию mail.'; -//$PHPMAILER_LANG['invalid_email'] = 'Not sending, email address is invalid: '; -$PHPMAILER_LANG['provide_address'] = 'Пожалуйста, введите хотя бы один адрес e-mail получателя.'; -$PHPMAILER_LANG['mailer_not_supported'] = ' - почтовый сервер не поддерживается.'; -$PHPMAILER_LANG['recipients_failed'] = 'Ошибка SMTP: отправка по следующим адресам получателей не удалась: '; -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-se.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-se.php deleted file mode 100644 index 0b6268ae..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-se.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'SMTP fel: Kunde inte autentisera.'; -$PHPMAILER_LANG['connect_host'] = 'SMTP fel: Kunde inte ansluta till SMTP-server.'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fel: Data accepterades inte.'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = 'Okänt encode-format: '; -$PHPMAILER_LANG['execute'] = 'Kunde inte köra: '; -$PHPMAILER_LANG['file_access'] = 'Ingen åtkomst till fil: '; -$PHPMAILER_LANG['file_open'] = 'Fil fel: Kunde inte öppna fil: '; -$PHPMAILER_LANG['from_failed'] = 'Följande avsändaradress är felaktig: '; -$PHPMAILER_LANG['instantiate'] = 'Kunde inte initiera e-postfunktion.'; -//$PHPMAILER_LANG['invalid_email'] = 'Not sending, email address is invalid: '; -$PHPMAILER_LANG['provide_address'] = 'Du måste ange minst en mottagares e-postadress.'; -$PHPMAILER_LANG['mailer_not_supported'] = ' mailer stöds inte.'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP fel: Följande mottagare är felaktig: ' -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-tr.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-tr.php deleted file mode 100644 index 23cad1ef..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-tr.php +++ /dev/null @@ -1,27 +0,0 @@ - \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-zh.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-zh.php deleted file mode 100644 index 071aa16d..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-zh.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'SMTP 錯誤:登錄失敗。'; -$PHPMAILER_LANG['connect_host'] = 'SMTP 錯誤:無法連接到 SMTP 主機。'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 錯誤:數據不被接受。'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = '未知編碼: '; -$PHPMAILER_LANG['file_access'] = '無法訪問文件:'; -$PHPMAILER_LANG['file_open'] = '文件錯誤:無法打開文件:'; -$PHPMAILER_LANG['from_failed'] = '發送地址錯誤:'; -$PHPMAILER_LANG['execute'] = '無法執行:'; -$PHPMAILER_LANG['instantiate'] = '未知函數調用。'; -//$PHPMAILER_LANG['invalid_email'] = 'Not sending, email address is invalid: '; -$PHPMAILER_LANG['provide_address'] = '必須提供至少一個收件人地址。'; -$PHPMAILER_LANG['mailer_not_supported'] = '發信客戶端不被支持。'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP 錯誤:收件人地址錯誤:'; -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -?> \ No newline at end of file diff --git a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-zh_cn.php b/include/limesurvey/classes/phpmailer/language/phpmailer.lang-zh_cn.php deleted file mode 100644 index 218f43e3..00000000 --- a/include/limesurvey/classes/phpmailer/language/phpmailer.lang-zh_cn.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - -$PHPMAILER_LANG['authenticate'] = 'SMTP 错误:登录失败。'; -$PHPMAILER_LANG['connect_host'] = 'SMTP 错误:无法连接到 SMTP 主机。'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 错误:数据不被接受。'; -//$P$PHPMAILER_LANG['empty_message'] = 'Message body empty'; -$PHPMAILER_LANG['encoding'] = '未知编码: '; -$PHPMAILER_LANG['execute'] = '无法执行:'; -$PHPMAILER_LANG['file_access'] = '无法访问文件:'; -$PHPMAILER_LANG['file_open'] = '文件错误:无法打开文件:'; -$PHPMAILER_LANG['from_failed'] = '发送地址错误:'; -$PHPMAILER_LANG['instantiate'] = '未知函数调用。'; -//$PHPMAILER_LANG['invalid_email'] = 'Not sending, email address is invalid: '; -$PHPMAILER_LANG['mailer_not_supported'] = '发信客户端不被支持。'; -$PHPMAILER_LANG['provide_address'] = '必须提供至少一个收件人地址。'; -$PHPMAILER_LANG['recipients_failed'] = 'SMTP 错误:收件人地址错误:'; -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -?> \ No newline at end of file diff --git a/include/limesurvey/common.php b/include/limesurvey/common.php deleted file mode 100644 index 206be404..00000000 --- a/include/limesurvey/common.php +++ /dev/null @@ -1,342 +0,0 @@ -'; -} -if (!function_exists('mb_convert_encoding')) -{ - $dieoutput .= "This script needs the PHP Multibyte String Functions library installed: See FAQ and PHP documentation
        "; -} -if ($dieoutput!='') die($dieoutput); - -if (!isset($debug)) {$debug=0;} // for some older config.php's - -if ($debug>0) {//For debug purposes - switch on in config.php - @ini_set("display_errors", 1); - error_reporting(E_ALL); -} - -if ($debug>2) {//For debug purposes - switch on in config.php - error_reporting(E_ALL | E_STRICT); -} - -if (ini_get("max_execution_time")<1200) @set_time_limit(1200); // Maximum execution time - works only if safe_mode is off -//@ini_set("memory_limit",$memorylimit); // Set Memory Limit for big surveys - -$maildebug=''; - - -// The following function (when called) includes FireBug Lite if true -define('FIREBUG' , $use_firebug_lite); - -define('ADODB_ASSOC_CASE', 2); // needed to set proper upper/lower casing for mssql - -################################################################################## - -require_once ($rootdir.'/classes/adodb/adodb.inc.php'); -require_once ($rootdir.'/classes/datetimeconverter/class.datetimeconverter.php'); -require_once ($rootdir.'/classes/phpmailer/class.phpmailer.php'); -require_once ($rootdir.'/classes/php-gettext/gettext.inc'); -require_once ($rootdir.'/classes/core/surveytranslator.php'); -require_once ($rootdir.'/classes/core/sanitize.php'); - -// DB session handling -if ($sessionhandler=='db') -{ - require_once($rootdir."/classes/adodb/session/adodb-session2.php"); - $sessionoptions['table'] = $dbprefix.'sessions'; - ADOdb_Session::config($databasetype, $databaselocation, $databaseuser, $databasepass, $databasename, $sessionoptions); -} - - -$dbprefix=strtolower($dbprefix); -define("_PHPVERSION", phpversion()); // This is the same as the server defined 'PHP_VERSION' - - -// Deal with server systems having not set a default time zone -if(function_exists("date_default_timezone_set") and function_exists("date_default_timezone_get")) -@date_default_timezone_set(@date_default_timezone_get()); - - -//Every 50th time clean up the temp directory of old files (older than 1 day) -//depending on the load the probability might be set higher or lower -if (rand(1,50)==25) -{ - cleanTempDirectory(); -} - -// Array of JS and CSS scripts to include in client header -$js_header_includes = array(); -$css_header_includes = array(); - -// JS scripts and CSS to include in admin header -// updated by admin scripts -$js_admin_includes = array(); -$css_admin_includes = array(); - -/* - * $sourcefrom variable checks the location of the current script against - * the administration directory, and if the current script is running - * in the administration directory, it is set to "admin". Otherwise it is set - * to "public". When $sourcefrom is "admin" certain administration only functions - * are loaded. - */ - -$scriptlocation=realpath("."); -$slashlesspath=str_replace(array("\\", "/"), "", $scriptlocation); -$slashlesshome=str_replace(array("\\", "/"), "", $homedir); - -// Uncomment the following line for debug purposes -// echo $slashlesspath." - ".$slashlesshome; - -// Detect command line usage -if (!empty($argc) && basename($argv[0]) == "cmdline_importsurvey.php") { - $sourcefrom="admin"; -} else if (strcasecmp($slashlesshome, $slashlesspath) == 0) { - if (strcasecmp($slashlesshome."install", $slashlesspath) != 0) - { - $sourcefrom="admin"; - } - else - { - $sourcefrom="install"; - } -} else { - $sourcefrom="public"; -} - -// Set path for captcha verification.php -if ($sourcefrom == "admin") -{ - $captchapath='../'; -} -else -{ - $captchapath=$rooturl.'/'; -} - -//check if databasename is set in config file -if (!$databasename) -{ - die("Database Information not provided. If you try to install LimeSurvey please refer to the installation docs and/or contact the system administrator of this webpage."); -} - -//BEFORE SESSIONCONTOL BECAUSE OF THE CONNECTION -//CACHE DATA -$connect=ADONewConnection($databasetype); -$database_exists = FALSE; -switch ($databasetype) -{ - case "postgres": - case "mysqli": - case "mysql": if ($databaseport!="default") {$dbhost="$databaselocation:$databaseport";} - else {$dbhost=$databaselocation;} - break; - case "mssql_n": - case "mssqlnative": - case "odbtp": if ($databaseport!="default") {$dbhost="$databaselocation,$databaseport";} - else {$dbhost=$databaselocation;} - break; - case "odbc_mssql": $dbhost="Driver={SQL Server};Server=$databaselocation;Database=".$databasename; - break; - - default: safe_die("Unknown database type"); -} -// Now try connecting to the database -if ($databasepersistent==true) -{ - if (@$connect->PConnect($dbhost, $databaseuser, $databasepass, $databasename)) - { - $database_exists = TRUE; - } - else { - // If that doesnt work try connection without database-name - $connect->database = ''; - if (!@$connect->PConnect($dbhost, $databaseuser, $databasepass)) - { - safe_die("Can't connect to LimeSurvey database. Reason: ".$connect->ErrorMsg()); - } - } -} -else -{ - if (@$connect->Connect($dbhost, $databaseuser, $databasepass, $databasename)) - { - $database_exists = TRUE; - } - else { - // If that doesnt work try connection without database-name - $connect->database = ''; - if (!@$connect->Connect($dbhost, $databaseuser, $databasepass)) - { - safe_die("Can't connect to LimeSurvey database. Reason: ".$connect->ErrorMsg()); - } - } -} - -// AdoDB seems to be defaulting to ADODB_FETCH_NUM and we want to be sure that the right default mode is set - -$connect->SetFetchMode(ADODB_FETCH_ASSOC); - -$dbexistsbutempty=($database_exists && !tableExists('surveys')); - - - -if ($databasetype=='mysql' || $databasetype=='mysqli') { - if ($debug>1) { @$connect->Execute("SET SESSION SQL_MODE='STRICT_ALL_TABLES,ANSI'"); } //for development - use mysql in the strictest mode //Checked - $infoarray=$connect->ServerInfo(); - if (version_compare ($infoarray['version'],'4.1','<')) - { - safe_die ("
        Error: You need at least MySQL version 4.1 to run LimeSurvey. Your version:".$infoarray['version']); - } - @$connect->Execute("SET CHARACTER SET 'utf8'"); //Checked - @$connect->Execute("SET NAMES 'utf8'"); //Checked -} - -// Setting dateformat for mssql driver. It seems if you don't do that the in- and output format could be different -if ($databasetype=='odbc_mssql' || $databasetype=='odbtp' || $databasetype=='mssql_n' || $databasetype=='mssqlnative') { - @$connect->Execute('SET DATEFORMAT ymd;'); //Checked - @$connect->Execute('SET QUOTED_IDENTIFIER ON;'); //Checked -} - - -//check if database exist and access is not via install script -if (!$database_exists && !$cmd_install && (strcasecmp($slashlesspath,str_replace(array("\\", "/"), "", $homedir."install")) != 0)) { - die ("
        The queXS/LimeSurvey database does not exist. Please read the README.md file for details of how to create the necessary database."); -} - - // Check if the DB is up to date and access is not via install script -if ($dbexistsbutempty && !$cmd_install && (strcasecmp($slashlesspath,str_replace(array("\\", "/"), "", $homedir."install")) != 0)) { - die ("
        The queXS/LimeSurvey database does exist but it seems to be empty. Please read the README.md to create the necessary tables."); -} - -// Default global values that should not appear in config-defaults.php -$updateavailable=0; -$updatebuild=''; -$updateversion=''; -$updatelastcheck=''; -$updatekey=''; -$updatekeyvaliduntil=''; - -require ($homedir.'/globalsettings.php'); -SSL_mode();// This really should be at the top but for it to utilise getGlobalSetting() it has to be here - -$showxquestions = getGlobalSetting('showxquestions'); -$showgroupinfo = getGlobalSetting('showgroupinfo'); -$showqnumcode = getGlobalSetting('showqnumcode'); - -if ($sourcefrom == "admin") -{ - require_once($homedir.'/admin_functions.php'); -} - -// Check if the DB is up to date -// not for queXS -//if (!$dbexistsbutempty && $sourcefrom=='admin') -//{ -// $usrow = getGlobalSetting('DBVersion'); -// if (floatval($usrow)<$dbversionnumber) -// { -// $action=''; -// require_once($rootdir.'/classes/core/language.php'); -// $clang = new limesurvey_lang($defaultlang); -// include_once($homedir.'/update/updater.php'); -// if(isset($_GET['continue']) && $_GET['continue']==1) -// { -// echo getAdminHeader(); -// CheckForDBUpgrades(); -// echo "
        ".$clang->gT("Back to main menu")."
        "; -// //updatecheck(); -// echo getAdminFooter("http://docs.limesurvey.org", $clang->gT("LimeSurvey online manual")); -// } -// else -// { -// echo getAdminHeader(), -// '
        ',CheckForDBUpgrades(),'
        ', -// getAdminFooter("http://docs.limesurvey.org", $clang->gT("LimeSurvey online manual")) -// ; -// } -// die; -// } -// -// if (is_dir($homedir."/install") && $debug<2) -// { -// die ("

        Congratulations

        Your installation is now complete. The final step is to remove or rename the LimeSurvey installation directory (admin/install) on your server since it may be a security risk.

        Once this directory has been removed or renamed you will be able to log in to your new LimeSurvey Installation.

        Try again

        "); -// } -//} - -//Admin menus and standards -//IF THIS IS AN ADMIN SCRIPT, RUN THE SESSIONCONTROL SCRIPT -if ($sourcefrom == "admin") -{ - include($homedir."/sessioncontrol.php"); - /** - * @param string $htmlheader - * This is the html header text for all administration pages - * - */ - $htmlheader = getAdminHeader(); -} - -//SET LANGUAGE DIRECTORY -if ($sourcefrom == "admin") -{ - $langdir="$publicurl/locale/".$_SESSION['adminlang']."/help"; - $langdirlocal="$rootdir/locale/".$_SESSION['adminlang']."/help"; - - if (!is_dir($langdirlocal)) // is_dir only works on local dirs - { - $langdir="$publicurl/locale/en/help"; //default to english if there is no matching language dir - } -} - -if ($sourcefrom == "admin" && $buildnumber != "" && $updatecheckperiod>0 && $updatelastcheckarray('create'=>true,'read'=>true,'update'=>true,'delete'=>true,'import'=>false,'export'=>false,'title'=>$clang->gT("Assessments"),'description'=>$clang->gT("Permission to create/view/update/delete assessments rules for a survey"),'img'=>'assessments'), // Checked - 'quotas'=>array('create'=>true,'read'=>true,'update'=>true,'delete'=>true,'import'=>false,'export'=>false,'title'=>$clang->gT("Quotas"),'description'=>$clang->gT("Permission to create/view/update/delete quota rules for a survey"),'img'=>'quota'), // Checked - 'responses'=>array('create'=>true,'read'=>true,'update'=>true,'delete'=>true,'import'=>true,'export'=>true,'title'=>$clang->gT("Responses"),'description'=>$clang->gT("Permission to create(data entry)/view/update/delete/import/export responses"),'img'=>'browse'), - 'statistics'=>array('create'=>false,'read'=>true,'update'=>false,'delete'=>false,'import'=>false,'export'=>false,'title'=>$clang->gT("Statistics"),'description'=>$clang->gT("Permission to view statistics"),'img'=>'statistics'), //Checked - 'survey'=>array('create'=>false,'read'=>true,'update'=>false,'delete'=>true,'import'=>false,'export'=>false,'title'=>$clang->gT("Survey deletion"),'description'=>$clang->gT("Permission to delete a survey"),'img'=>'delete'), //Checked - 'surveyactivation'=>array('create'=>false,'read'=>false,'update'=>true,'delete'=>false,'import'=>false,'export'=>false,'title'=>$clang->gT("Survey activation"),'description'=>$clang->gT("Permission to activate/deactivate a survey"),'img'=>'activate_deactivate'), //Checked - 'surveycontent'=>array('create'=>true,'read'=>true,'update'=>true,'delete'=>true,'import'=>true,'export'=>true,'title'=>$clang->gT("Survey content"),'description'=>$clang->gT("Permission to create/view/update/delete/import/export the questions, groups, answers & conditions of a survey"),'img'=>'add'), - 'surveylocale'=>array('create'=>false,'read'=>true,'update'=>true,'delete'=>false,'import'=>false,'export'=>false,'title'=>$clang->gT("Survey locale settings"),'description'=>$clang->gT("Permission to view/update the survey locale settings"),'img'=>'edit'), - 'surveysecurity'=>array('create'=>true,'read'=>true,'update'=>true,'delete'=>true,'import'=>false,'export'=>false,'title'=>$clang->gT("Survey security"),'description'=>$clang->gT("Permission to modify survey security settings"),'img'=>'survey_security'), - 'surveysettings'=>array('create'=>false,'read'=>true,'update'=>true,'delete'=>false,'import'=>false,'export'=>false,'title'=>$clang->gT("Survey settings"),'description'=>$clang->gT("Permission to view/update the survey settings including token table creation"),'img'=>'survey_settings'), - 'tokens'=>array('create'=>true,'read'=>true,'update'=>true,'delete'=>true,'import'=>true,'export'=>true,'title'=>$clang->gT("Tokens"),'description'=>$clang->gT("Permission to create/update/delete/import/export token entries"),'img'=>'tokens'), - 'translations'=>array('create'=>false,'read'=>true,'update'=>true,'delete'=>false,'import'=>false,'export'=>false,'title'=>$clang->gT("Quick translation"),'description'=>$clang->gT("Permission to view & update the translations using the quick-translation feature"),'img'=>'translate') - ); - uasort($aPermissions,"aComparePermission"); - return $aPermissions; -} - -/** -* Simple function to sort the permissions by title -* -* @param mixed $aPermissionA Permission A to compare -* @param mixed $aPermissionB Permission B to compare -*/ -function aComparePermission($aPermissionA,$aPermissionB) -{ - if($aPermissionA['title'] >$aPermissionB['title']) { - return 1; - } - else { - return -1; - } -} - -/** -* getqtypelist() Returns list of question types available in LimeSurvey. Edit this if you are adding a new -* question type -* -* @global string $publicurl -* @global string $sourcefrom -* -* @param string $SelectedCode Value of the Question Type (defaults to "T") -* @param string $ReturnType Type of output from this function (defaults to selector) -* -* @return depending on $ReturnType param, returns a straight "array" of question types, or an list -* -* Explanation of questiontype array: -* -* description : Question description -* subquestions : 0= Does not support subquestions x=Number of subquestion scales -* answerscales : 0= Does not need answers x=Number of answer scales (usually 1, but e.g. for dual scale question set to 2) -* assessable : 0=Does not support assessment values when editing answerd 1=Support assessment values -*/ -function getqtypelist($SelectedCode = "T", $ReturnType = "selector") -{ - global $publicurl; - global $sourcefrom, $clang; - - if (!isset($clang)) - { - $clang = new limesurvey_lang("en"); - } - $group['Arrays'] = $clang->gT('Arrays'); - $group['MaskQuestions'] = $clang->gT("Mask questions"); - $group['SinChoiceQues'] = $clang->gT("Single choice questions"); - $group['MulChoiceQues'] = $clang->gT("Multiple choice questions"); - $group['TextQuestions'] = $clang->gT("Text questions"); - - - $qtypes = array( - "1"=>array('description'=>$clang->gT("Array dual scale"), - 'group'=>$group['Arrays'], - 'subquestions'=>1, - 'assessable'=>1, - 'hasdefaultvalues'=>0, - 'answerscales'=>2), - "5"=>array('description'=>$clang->gT("5 Point Choice"), - 'group'=>$group['SinChoiceQues'], - 'subquestions'=>0, - 'hasdefaultvalues'=>0, - 'assessable'=>0, - 'answerscales'=>0), - "A"=>array('description'=>$clang->gT("Array (5 Point Choice)"), - 'group'=>$group['Arrays'], - 'subquestions'=>1, - 'hasdefaultvalues'=>0, - 'assessable'=>1, - 'answerscales'=>0), - "B"=>array('description'=>$clang->gT("Array (10 Point Choice)"), - 'group'=>$group['Arrays'], - 'subquestions'=>1, - 'hasdefaultvalues'=>0, - 'assessable'=>1, - 'answerscales'=>0), - "C"=>array('description'=>$clang->gT("Array (Yes/No/Uncertain)"), - 'group'=>$group['Arrays'], - 'subquestions'=>1, - 'hasdefaultvalues'=>0, - 'assessable'=>1, - 'answerscales'=>0), - "D"=>array('description'=>$clang->gT("Date"), - 'group'=>$group['MaskQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>1, - 'assessable'=>0, - 'answerscales'=>0), - "E"=>array('description'=>$clang->gT("Array (Increase/Same/Decrease)"), - 'group'=>$group['Arrays'], - 'subquestions'=>1, - 'hasdefaultvalues'=>0, - 'assessable'=>1, - 'answerscales'=>0), - "F"=>array('description'=>$clang->gT("Array"), - 'group'=>$group['Arrays'], - 'subquestions'=>1, - 'hasdefaultvalues'=>0, - 'assessable'=>1, - 'answerscales'=>1), - "G"=>array('description'=>$clang->gT("Gender"), - 'group'=>$group['MaskQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>0, - 'assessable'=>0, - 'answerscales'=>0), - "H"=>array('description'=>$clang->gT("Array by column"), - 'group'=>$group['Arrays'], - 'hasdefaultvalues'=>0, - 'subquestions'=>1, - 'assessable'=>1, - 'answerscales'=>1), - "I"=>array('description'=>$clang->gT("Language Switch"), - 'group'=>$group['MaskQuestions'], - 'hasdefaultvalues'=>0, - 'subquestions'=>0, - 'assessable'=>0, - 'answerscales'=>0), - "K"=>array('description'=>$clang->gT("Multiple Numerical Input"), - 'group'=>$group['MaskQuestions'], - 'hasdefaultvalues'=>1, - 'subquestions'=>1, - 'assessable'=>1, - 'answerscales'=>0), - "L"=>array('description'=>$clang->gT("List (Radio)"), - 'group'=>$group['SinChoiceQues'], - 'subquestions'=>0, - 'hasdefaultvalues'=>1, - 'assessable'=>1, - 'answerscales'=>1), - "M"=>array('description'=>$clang->gT("Multiple choice"), - 'group'=>$group['MulChoiceQues'], - 'subquestions'=>1, - 'hasdefaultvalues'=>1, - 'assessable'=>1, - 'answerscales'=>0), - "N"=>array('description'=>$clang->gT("Numerical Input"), - 'group'=>$group['MaskQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>1, - 'assessable'=>0, - 'answerscales'=>0), - "O"=>array('description'=>$clang->gT("List with comment"), - 'group'=>$group['SinChoiceQues'], - 'subquestions'=>0, - 'hasdefaultvalues'=>1, - 'assessable'=>1, - 'answerscales'=>1), - "P"=>array('description'=>$clang->gT("Multiple choice with comments"), - 'group'=>$group['MulChoiceQues'], - 'subquestions'=>1, - 'hasdefaultvalues'=>1, - 'assessable'=>1, - 'answerscales'=>0), - "Q"=>array('description'=>$clang->gT("Multiple Short Text"), - 'group'=>$group['TextQuestions'], - 'subquestions'=>1, - 'hasdefaultvalues'=>1, - 'assessable'=>0, - 'answerscales'=>0), - "R"=>array('description'=>$clang->gT("Ranking"), - 'group'=>$group['MaskQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>0, - 'assessable'=>1, - 'answerscales'=>1), - "S"=>array('description'=>$clang->gT("Short Free Text"), - 'group'=>$group['TextQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>1, - 'assessable'=>0, - 'answerscales'=>0), - "T"=>array('description'=>$clang->gT("Long Free Text"), - 'group'=>$group['TextQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>1, - 'assessable'=>0, - 'answerscales'=>0), - "U"=>array('description'=>$clang->gT("Huge Free Text"), - 'group'=>$group['TextQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>1, - 'assessable'=>0, - 'answerscales'=>0), - "X"=>array('description'=>$clang->gT("Text display"), - 'group'=>$group['MaskQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>0, - 'assessable'=>0, - 'answerscales'=>0), - "Y"=>array('description'=>$clang->gT("Yes/No"), - 'group'=>$group['MaskQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>0, - 'assessable'=>0, - 'answerscales'=>0), - "!"=>array('description'=>$clang->gT("List (Dropdown)"), - 'group'=>$group['SinChoiceQues'], - 'subquestions'=>0, - 'hasdefaultvalues'=>1, - 'assessable'=>1, - 'answerscales'=>1), - ":"=>array('description'=>$clang->gT("Array (Numbers)"), - 'group'=>$group['Arrays'], - 'subquestions'=>2, - 'hasdefaultvalues'=>0, - 'assessable'=>1, - 'answerscales'=>0), - ";"=>array('description'=>$clang->gT("Array (Texts)"), - 'group'=>$group['Arrays'], - 'subquestions'=>2, - 'hasdefaultvalues'=>0, - 'assessable'=>0, - 'answerscales'=>0), - "|"=>array('description'=>$clang->gT("File upload"), - 'group'=>$group['MaskQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>0, - 'assessable'=>0, - 'answerscales'=>0), - "*"=>array('description'=>$clang->gT("Equation"), - 'group'=>$group['MaskQuestions'], - 'subquestions'=>0, - 'hasdefaultvalues'=>0, - 'assessable'=>0, - 'answerscales'=>0), - ); - asort($qtypes); - if ($ReturnType == "array") {return $qtypes;} - if ($ReturnType == "group"){ - foreach($qtypes as $qkey=>$qtype){ - $newqType[$qtype['group']][$qkey] = $qtype; - } - - - $qtypeselecter = ""; - foreach($newqType as $group=>$members) - { - $qtypeselecter .= ''; - foreach($members as $TypeCode=>$TypeProperties){ - $qtypeselecter .= " formatted list of existing surveys -* -*/ -function getsurveylist($returnarray=false,$returnwithouturl=false) -{ - global $surveyid, $dbprefix, $scriptname, $connect, $clang, $timeadjust; - static $cached = null; - - if(is_null($cached)) { - $surveyidquery = " SELECT a.*, surveyls_title, surveyls_description, surveyls_welcometext, surveyls_url " - ." FROM ".db_table_name('surveys')." AS a " - . "INNER JOIN ".db_table_name('surveys_languagesettings')." on (surveyls_survey_id=a.sid and surveyls_language=a.language) "; - - if (!bHasGlobalPermission('USER_RIGHT_SUPERADMIN')) - { - $surveyidquery .= "WHERE a.sid in (select sid from ".db_table_name('survey_permissions')." where uid={$_SESSION['loginID']} and permission='survey' and read_p=1) "; - } - - $surveyidquery .= " order by active DESC, surveyls_title"; - $surveyidresult = db_execute_assoc($surveyidquery); //Checked - if (!$surveyidresult) {return "Database Error";} - $surveynames = $surveyidresult->GetRows(); - $cached=$surveynames; - } else { - $surveynames = $cached; - } - $surveyselecter = ""; - if ($returnarray===true) return $surveynames; - $activesurveys=''; - $inactivesurveys=''; - $expiredsurveys=''; - if ($surveynames) - { - foreach($surveynames as $sv) - { - - $surveylstitle=FlattenText($sv['surveyls_title']); - if (strlen($surveylstitle)>45) - { - $surveylstitle = htmlspecialchars(mb_strcut(html_entity_decode($surveylstitle,ENT_QUOTES,'UTF-8'), 0, 45, 'UTF-8'))."..."; - } - - if($sv['active']!='Y') - { - $inactivesurveys .= ""; - } - if ($expiredsurveys!='') - { - $surveyselecter .= "\n"; - $surveyselecter .= $expiredsurveys . ""; - } - if ($inactivesurveys!='') - { - $surveyselecter .= "\n"; - $surveyselecter .= $inactivesurveys . ""; - } - if (!isset($svexist)) - { - $surveyselecter = "\n".$surveyselecter; - } else - { - if ($returnwithouturl===false) - { - $surveyselecter = "\n".$surveyselecter; - } else - { - $surveyselecter = "\n".$surveyselecter; - } - } - return $surveyselecter; -} - -/** -* getQuestions() queries the database for an list of all questions matching the current survey and group id -* -* @global string $surveyid -* @global string $gid -* @global string $selectedqid -* -* @return This string is returned containing formatted list of questions in the current survey and group -*/ -function getQuestions($surveyid,$gid,$selectedqid) -{ - global $scriptname, $clang; - - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $qquery = 'SELECT * FROM '.db_table_name('questions')." WHERE sid=$surveyid AND gid=$gid AND language='{$s_lang}' and parent_qid=0 order by question_order"; - $qresult = db_execute_assoc($qquery); //checked - $qrows = $qresult->GetRows(); - - if (!isset($questionselecter)) {$questionselecter="";} - foreach ($qrows as $qrow) - { - $qrow['title'] = strip_tags($qrow['title']); - $questionselecter .= "\n".$questionselecter; - } - return $questionselecter; -} - -/** -* getGidPrevious() returns the Gid of the group prior to the current active group -* -* @param string $surveyid -* @param string $gid -* -* @return The Gid of the previous group -*/ -function getGidPrevious($surveyid, $gid) -{ - global $scriptname, $clang; - - if (!$surveyid) {$surveyid=returnglobal('sid');} - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $gquery = "SELECT gid FROM ".db_table_name('groups')." WHERE sid=$surveyid AND language='{$s_lang}' ORDER BY group_order"; - $qresult = db_execute_assoc($gquery); //checked - $qrows = $qresult->GetRows(); - - $i = 0; - $iPrev = -1; - foreach ($qrows as $qrow) - { - if ($gid == $qrow['gid']) {$iPrev = $i - 1;} - $i += 1; - } - if ($iPrev >= 0) {$GidPrev = $qrows[$iPrev]['gid'];} - else {$GidPrev = "";} - return $GidPrev; -} - -/** -* getQidPrevious() returns the Qid of the question prior to the current active question -* -* @param string $surveyid -* @param string $gid -* @param string $qid -* -* @return This Qid of the previous question -*/ -function getQidPrevious($surveyid, $gid, $qid) -{ - global $scriptname, $clang; - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $qquery = 'SELECT * FROM '.db_table_name('questions')." WHERE sid=$surveyid AND gid=$gid AND language='{$s_lang}' and parent_qid=0 order by question_order"; - $qresult = db_execute_assoc($qquery); //checked - $qrows = $qresult->GetRows(); - - $i = 0; - $iPrev = -1; - foreach ($qrows as $qrow) - { - if ($qid == $qrow['qid']) {$iPrev = $i - 1;} - $i += 1; - } - if ($iPrev >= 0) {$QidPrev = $qrows[$iPrev]['qid'];} - else {$QidPrev = "";} - return $QidPrev; -} - -/** -* getGidNext() returns the Gid of the group next to the current active group -* -* @param string $surveyid -* @param string $gid -* -* @return The Gid of the next group -*/ -function getGidNext($surveyid, $gid) -{ - global $scriptname, $clang; - - if (!$surveyid) {$surveyid=returnglobal('sid');} - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $gquery = "SELECT gid FROM ".db_table_name('groups')." WHERE sid=$surveyid AND language='{$s_lang}' ORDER BY group_order"; - $qresult = db_execute_assoc($gquery); //checked - $qrows = $qresult->GetRows(); - - $GidNext=""; - $i = 0; - $iNext = 1; - foreach ($qrows as $qrow) - { - if ($gid == $qrow['gid']) {$iNext = $i + 1;} - $i += 1; - } - if ($iNext < count($qrows)) {$GidNext = $qrows[$iNext]['gid'];} - else {$GidNext = "";} - return $GidNext; -} - -/** -* getQidNext() returns the Qid of the question prior to the current active question -* -* @param string $surveyid -* @param string $gid -* @param string $qid -* -* @return This Qid of the previous question -*/ -function getQidNext($surveyid, $gid, $qid) -{ - global $scriptname, $clang; - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $qquery = 'SELECT qid FROM '.db_table_name('questions')." WHERE sid=$surveyid AND gid=$gid AND language='{$s_lang}' and parent_qid=0 order by question_order"; - $qresult = db_execute_assoc($qquery); //checked - $qrows = $qresult->GetRows(); - - $i = 0; - $iNext = 1; - foreach ($qrows as $qrow) - { - if ($qid == $qrow['qid']) {$iNext = $i + 1;} - $i += 1; - } - if ($iNext < count($qrows)) {$QidNext = $qrows[$iNext]['qid'];} - else {$QidNext = "";} - return $QidNext; -} - -/** -* This function calculates how much space is actually used by all files uploaded -* using the File Upload question type -* -* @returns integer Actual space used in MB -*/ -function fCalculateTotalFileUploadUsage(){ - global $uploaddir; - $sQuery="select sid from ".db_table_name('surveys'); - $oResult = db_execute_assoc($sQuery); //checked - $aRows = $oResult->GetRows(); - $iTotalSize=0.0; - foreach ($aRows as $aRow) - { - $sFilesPath=$uploaddir.'/surveys/'.$aRow['sid'].'/files'; - if (file_exists($sFilesPath)) - { - $iTotalSize+=(float)iGetDirectorySize($sFilesPath); - } - } - return (float)$iTotalSize/1024/1024; -} - -function iGetDirectorySize($directory) { - $size = 0; - foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){ - $size+=$file->getSize(); - } - return $size; -} - -/** -* Gets number of groups inside a particular survey -* -* @param string $surveyid -* @param mixed $lang -*/ -function getGroupSum($surveyid, $lang) -{ - global $surveyid,$dbprefix ; - $sumquery3 = "SELECT * FROM ".db_table_name('groups')." WHERE sid=$surveyid AND language='".$lang."'"; //Getting a count of questions for this survey - - $sumresult3 = db_execute_assoc($sumquery3); //Checked - $groupscount = $sumresult3->RecordCount(); - - return $groupscount ; -} - - -/** -* Gets number of questions inside a particular group -* -* @param string $surveyid -* @param mixed $groupid -*/ -function getQuestionSum($surveyid, $groupid) -{ - global $surveyid,$dbprefix ; - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $sumquery3 = "SELECT * FROM ".db_table_name('questions')." WHERE gid=$groupid and sid=$surveyid AND language='{$s_lang}'"; //Getting a count of questions for this survey - $sumresult3 = db_execute_assoc($sumquery3); //Checked - $questionscount = $sumresult3->RecordCount(); - return $questionscount ; -} - - -/** -* getMaxgrouporder($surveyid) queries the database for the maximum sortorder of a group and returns the next higher one. -* -* @param mixed $surveyid -* @global string $surveyid -*/ -function getMaxgrouporder($surveyid) -{ - global $surveyid, $connect ; - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $max_sql = "SELECT max( group_order ) AS max FROM ".db_table_name('groups')." WHERE sid =$surveyid AND language='{$s_lang}'" ; - $current_max = $connect->GetOne($max_sql) ; - if(is_null($current_max)) - { - return "0" ; - } - else return ++$current_max ; -} - - -/** -* getGroupOrder($surveyid,$gid) queries the database for the sortorder of a group. -* -* @param mixed $surveyid -* @param mixed $gid -* @return mixed -*/ -function getGroupOrder($surveyid,$gid) -{ - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $grporder_sql = "SELECT group_order FROM ".db_table_name('groups')." WHERE sid =$surveyid AND language='{$s_lang}' AND gid=$gid" ; - $grporder_result =db_execute_assoc($grporder_sql); //Checked - $grporder_row = $grporder_result->FetchRow() ; - $group_order = $grporder_row['group_order']; - if($group_order=="") - { - return "0" ; - } - else return $group_order ; -} - -/** -* getMaxquestionorder($gid) queries the database for the maximum sortorder of a question. -* -* @global string $surveyid -*/ -function getMaxquestionorder($gid) -{ - global $surveyid ; - $gid=sanitize_int($gid); - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $max_sql = "SELECT max( question_order ) AS max FROM ".db_table_name('questions')." WHERE gid='$gid' AND language='$s_lang'"; - - $max_result =db_execute_assoc($max_sql) ; //Checked - $maxrow = $max_result->FetchRow() ; - $current_max = $maxrow['max']; - if($current_max=="") - { - return "0" ; - } - else return $current_max ; -} - -/** -* question_class() returns a class name for a given question type to allow custom styling for each question type. -* -* @param string $input containing unique character representing each question type. -* @return string containing the class name for a given question type. -*/ -function question_class($input) -{ - - switch($input) - { // I think this is a bad solution to adding classes to question - // DIVs but I can't think of a better solution. (eric_t_cruiser) - - case 'X': return 'boilerplate'; // BOILERPLATE QUESTION - case '5': return 'choice-5-pt-radio'; // 5 POINT CHOICE radio-buttons - case 'D': return 'date'; // DATE -// case 'Z': return 'list-radio-flexible'; // LIST Flexible radio-button - case 'L': return 'list-radio'; // LIST radio-button -// case 'W': return 'list-dropdown-flexible'; // LIST drop-down (flexible label) - case '!': return 'list-dropdown'; // List - dropdown - case 'O': return 'list-with-comment'; // LIST radio-button + textarea - case 'R': return 'ranking'; // RANKING STYLE - case 'M': return 'multiple-opt'; // Multiple choice checkbox - case 'I': return 'language'; // Language Question - case 'P': return 'multiple-opt-comments'; // Multiple choice with comments checkbox + text - case 'Q': return 'multiple-short-txt'; // TEXT - case 'K': return 'numeric-multi'; // MULTIPLE NUMERICAL QUESTION - case 'N': return 'numeric'; // NUMERICAL QUESTION TYPE - case 'S': return 'text-short'; // SHORT FREE TEXT - case 'T': return 'text-long'; // LONG FREE TEXT - case 'U': return 'text-huge'; // HUGE FREE TEXT - case 'Y': return 'yes-no'; // YES/NO radio-buttons - case 'G': return 'gender'; // GENDER drop-down list - case 'A': return 'array-5-pt'; // ARRAY (5 POINT CHOICE) radio-buttons - case 'B': return 'array-10-pt'; // ARRAY (10 POINT CHOICE) radio-buttons - case 'C': return 'array-yes-uncertain-no'; // ARRAY (YES/UNCERTAIN/NO) radio-buttons - case 'E': return 'array-increase-same-decrease'; // ARRAY (Increase/Same/Decrease) radio-buttons - case 'F': return 'array-flexible-row'; // ARRAY (Flexible) - Row Format - case 'H': return 'array-flexible-column'; // ARRAY (Flexible) - Column Format - // case '^': return 'slider'; // SLIDER CONTROL - case ':': return 'array-multi-flexi'; // ARRAY (Multi Flexi) 1 to 10 - case ";": return 'array-multi-flexi-text'; - case "1": return 'array-flexible-duel-scale'; // Array dual scale - case "*": return 'equation'; // Equation - default: return 'generic_question'; // Should have a default fallback - }; -}; - -function setup_columns($columns, $answer_count) -{ - /** - * setup_columns() defines all the html tags to be wrapped around - * various list type answers. - * - * @param integer $columns - the number of columns, usually supplied by $dcols - * @param integer $answer_count - the number of answers to a question, usually supplied by $anscount - * @return array with all the various opening and closing tags to generate a set of columns. - * - * It returns an array with the following items: - * $wrapper['whole-start'] = Opening wrapper for the whole list - * $wrapper['whole-end'] = closing wrapper for the whole list - * $wrapper['col-devide'] = normal column devider - * $wrapper['col-devide-last'] = the last column devider (to allow - * for different styling of the last - * column - * $wrapper['item-start'] = opening wrapper tag for individual - * option - * $wrapper['item-start-other'] = opening wrapper tag for other - * option - * $wrapper['item-end'] = closing wrapper tag for individual - * option - * $wrapper['maxrows'] = maximum number of rows in each - * column - * $wrapper['cols'] = Number of columns to be inserted - * (and checked against) - * - * It also expect the global parameter $column_style - * initialised at the end of config-defaults.php or from within config.php - * - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Columns are a problem. - * Really there is no perfect solution to columns at the moment. - * - * - Using Tables is problematic semanticly. - * - Using inline or float to create columns, causes the answers - * flows horizontally, not vertically which is not ideal visually. - * - Using CSS3 columns is also a problem because of browser support - * and also because if you have answeres split across two or more - * lines, and those answeres happen to fall at the bottom of a - * column, the answer might be split across columns as well as - * lines. - * - Using nested unordered list with the first level of
      • s - * floated is the same as using tables and so is bad semantically - * for the same reason tables are bad. - * - Breaking the unordered lists into consecutive floated unordered - * lists is not great semantically but probably not as bad as - * using tables. - * - * Because I haven't been able to decide which option is the least - * bad, I have handed over that responsibility to the admin who sets - * LimeSurvey up on their server. - * - * There are four options: - * 'css' using one of the various CSS only methods for - * rendering columns. - * (Check the CSS file for your chosen template to see - * how columns are defined.) - * 'ul' using multiple floated unordered lists. (DEFAULT) - * 'table' using conventional tables based layout. - * NULL blocks the use of columns - * - * 'ul' is the default because it's the best possible compromise - * between semantic markup and visual layout. - */ - - - global $column_style; - if ( !in_array($column_style,array('css','ul','table')) && !is_null($column_style) ) - { - $column_style = 'ul'; - }; - - /* - if(defined('PRINT_TEMPLATE')) // This forces tables based columns for printablesurvey - { - $colstyle = 'table'; - }; - */ - if($columns < 2) - { - $column_style = null; - $columns = 1; - } - - if(($columns > $answer_count) && $answer_count>0) - { - $columns = $answer_count; - }; - - if ($answer_count>0 && $columns>0) - { - $columns = ceil($answer_count/ceil($answer_count/$columns)); // # of columns is # of answers divided by # of rows (all rounded up) - } - - $class_first = ''; - if($columns > 1 && !is_null($column_style)) - { - if($column_style == 'ul') - { - $ul = '-ul'; - } - else - { - $ul = ''; - } - $class_first = ' class="cols-'.$columns . $ul.' first"'; - $class = ' class="cols-'.$columns . $ul.'"'; - $class_last_ul = ' class="cols-'.$columns . $ul.' last"'; - $class_last_table = ' class="cols-'.$columns.' last"'; - } - else - { - $class = ''; - $class_last_ul = ''; - $class_last_table = ''; - }; - - $wrapper = array( - 'whole-start' => "\n\n" - ,'whole-end' => "
      \n" - ,'col-devide' => '' - ,'col-devide-last' => '' - ,'item-start' => "\t
    • \n" - ,'item-start-other' => "\t
    • \n" - ,'item-end' => "\t
    • \n" - ,'maxrows' => ceil($answer_count/$columns) //Always rounds up to nearest whole number - ,'cols' => $columns - ); - - switch($column_style) - { - case 'ul': if($columns > 1) - { - $wrapper['col-devide'] = "\n
    \n\n\n"; - $wrapper['col-devide-last'] = "\n\n\n\n"; - } - break; - - case 'table': $table_cols = ''; - for($cols = $columns ; $cols > 0 ; --$cols) - { - switch($cols) - { - case $columns: $table_cols .= "\t\n"; - break; - case 1: $table_cols .= "\t\n"; - break; - default: $table_cols .= "\t\n"; - }; - }; - - if($columns > 1) - { - $wrapper['col-devide'] = "\t\n\n\n\n\t
      \n"; - $wrapper['col-devide-last'] = "\t
    \n\n\n\n\t
      \n"; - }; - $wrapper['whole-start'] = "\n\n$table_cols\n\t\n\n\n\t
        \n"; - $wrapper['whole-end'] = "\t
      \n\n\n\t\n\n"; - $wrapper['item-start'] = "
    • \n"; - $wrapper['item-end'] = "
    • \n"; - }; - - return $wrapper; -}; - -function alternation($alternate = '' , $type = 'col') -{ - /** - * alternation() Returns a class identifyer for alternating between - * two options. Used to style alternate elements differently. creates - * or alternates between the odd string and the even string used in - * as column and row classes for array type questions. - * - * @param string $alternate = '' (empty) (default) , 'array2' , 'array1' , 'odd' , 'even' - * @param string $type = 'col' (default) or 'row' - * - * @return string representing either the first alternation or the opposite alternation to the one supplied.. - */ - /* - // The following allows type to be left blank for row in subsequent - // function calls. - // It has been left out because 'row' must be defined the first time - // alternation() is called. Since it is only ever written once for each - // while statement within a function, 'row' is always defined. - if(!empty($alternate) && $type != 'row') - { if($alternate == ('array2' || 'array1')) - { - $type = 'row'; - }; - }; - // It has been left in case it becomes useful but probably should be - // removed. - */ - if($type == 'row') - { - $odd = 'array2'; // should be row_odd - $even = 'array1'; // should be row_even - } - else - { - $odd = 'odd'; // should be col_odd - $even = 'even'; // should be col_even - }; - if($alternate == $odd) - { - $alternate = $even; - } - else - { - $alternate = $odd; - }; - return $alternate; -} - - -/** -* longest_string() returns the length of the longest string past to it. -* @peram string $new_string -* @peram integer $longest_length length of the (previously) longest string passed to it. -* @return integer representing the length of the longest string passed (updated if $new_string was longer than $longest_length) -* -* usage should look like this: $longest_length = longest_string( $new_string , $longest_length ); -* -*/ -function longest_string( $new_string , $longest_length ) -{ - if($longest_length < strlen(trim(strip_tags($new_string)))) - { - $longest_length = strlen(trim(strip_tags($new_string))); - }; - return $longest_length; -}; - - - -/** -* getNotificationlist() returns different options for notifications -* -* @param string $notificationcode - the currently selected one -* -* @return This string is returned containing formatted list of notification methods for current survey -*/ -function getNotificationlist($notificationcode) -{ - global $clang; - $ntypes = array( - "0"=>$clang->gT("No email notification"), - "1"=>$clang->gT("Basic email notification"), - "2"=>$clang->gT("Detailed email notification with result codes") - ); - if (!isset($ntypeselector)) {$ntypeselector="";} - foreach($ntypes as $ntcode=>$ntdescription) - { - $ntypeselector .= " formatted list of groups to current survey -*/ -function getgrouplist($gid) -{ - global $surveyid, $dbprefix, $scriptname, $connect, $clang; - $groupselecter=""; - $gid=sanitize_int($gid); - $surveyid=sanitize_int($surveyid); - if (!$surveyid) {$surveyid=returnglobal('sid');} - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $gidquery = "SELECT gid, group_name FROM ".db_table_name('groups')." WHERE sid='{$surveyid}' AND language='{$s_lang}' ORDER BY group_order"; - $gidresult = db_execute_num($gidquery) or safe_die("Couldn't get group list in common.php
      $gidquery
      ".$connect->ErrorMsg()); //Checked - while($gv = $gidresult->FetchRow()) - { - $groupselecter .= "\n"; - } - if ($groupselecter) - { - if (!isset($gvexist)) {$groupselecter = "\n".$groupselecter;} - else {$groupselecter .= "\n";} - } - return $groupselecter; -} - - -function getgrouplist2($gid) -{ - global $surveyid, $dbprefix, $connect, $clang; - $groupselecter = ""; - if (!$surveyid) {$surveyid=returnglobal('sid');} - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $gidquery = "SELECT gid, group_name FROM ".db_table_name('groups')." WHERE sid=$surveyid AND language='{$s_lang}' ORDER BY group_order"; - - - $gidresult = db_execute_num($gidquery) or safe_die("Plain old did not work!"); //Checked - while ($gv = $gidresult->FetchRow()) - { - $groupselecter .= "\n"; - } - if ($groupselecter) - { - if (!$gvexist) {$groupselecter = "\n".$groupselecter;} - else {$groupselecter .= "\n";} - } - return $groupselecter; -} - - -function getgrouplist3($gid) -{ - global $surveyid, $dbprefix; - if (!$surveyid) {$surveyid=returnglobal('sid');} - $groupselecter = ""; - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $gidquery = "SELECT gid, group_name FROM ".db_table_name('groups')." WHERE sid=$surveyid AND language='{$s_lang}' ORDER BY group_order"; - - - $gidresult = db_execute_num($gidquery) or safe_die("Plain old did not work!"); //Checked - while ($gv = $gidresult->FetchRow()) - { - $groupselecter .= "\n"; - } - return $groupselecter; -} - -/** -* Gives back the name of a group for a certaing group id -* -* @param integer $gid Group ID -*/ -function getgroupname($gid) -{ - global $surveyid; - if (!$surveyid) {$surveyid=returnglobal('sid');} - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - $gidquery = "SELECT group_name FROM ".db_table_name('groups')." WHERE sid=$surveyid AND language='{$s_lang}' and gid=$gid"; - - $gidresult = db_execute_num($gidquery) or safe_die("Group name could not be fetched (getgroupname)."); //Checked - while ($gv = $gidresult->FetchRow()) - { - $groupname = htmlspecialchars($gv[0]); - } - return $groupname; -} - -/** -* put your comment there... -* -* @param mixed $gid -* @param mixed $language -*/ -function getgrouplistlang($gid, $language) -{ - global $surveyid, $scriptname, $connect, $clang; - - $groupselecter=""; - if (!$surveyid) {$surveyid=returnglobal('sid');} - $gidquery = "SELECT gid, group_name FROM ".db_table_name('groups')." WHERE sid=$surveyid AND language='".$language."' ORDER BY group_order"; - $gidresult = db_execute_num($gidquery) or safe_die("Couldn't get group list in common.php
      $gidquery
      ".$connect->ErrorMsg()); //Checked - while($gv = $gidresult->FetchRow()) - { - $groupselecter .= "gT("Please choose...")."\n".$groupselecter;} - else {$groupselecter .= "\n";} - } - return $groupselecter; -} - - -function getuserlist($outputformat='fullinfoarray') -{ - global $dbprefix, $connect, $databasetype; - global $usercontrolSameGroupPolicy; - - if (isset($_SESSION['loginID'])) - { - $myuid=sanitize_int($_SESSION['loginID']); - } - - if ($_SESSION['USER_RIGHT_SUPERADMIN'] != 1 && isset($usercontrolSameGroupPolicy) && - $usercontrolSameGroupPolicy == true) - { - if (isset($myuid)) - { - // List users from same group as me + all my childs - // a subselect is used here because MSSQL does not like to group by text - // also Postgres does like this one better - $uquery = " SELECT * FROM ".db_table_name('users')." where uid in - (SELECT u.uid FROM ".db_table_name('users')." AS u, - ".db_table_name('user_in_groups')." AS ga ,".db_table_name('user_in_groups')." AS gb - WHERE u.uid=$myuid - OR (ga.ugid=gb.ugid AND ( (gb.uid=$myuid AND u.uid=ga.uid) OR (u.parent_id=$myuid) ) ) - GROUP BY u.uid)"; - } - else - { - return Array(); // Or die maybe - } - - } - else - { - $uquery = "SELECT * FROM ".db_table_name('users')." ORDER BY uid"; - } - - $uresult = db_execute_assoc($uquery); //Checked - - if ($uresult->RecordCount()==0) - //user is not in a group and usercontrolSameGroupPolicy is activated - at least show his own userinfo - { - $uquery = "SELECT u.* FROM ".db_table_name('users')." AS u WHERE u.uid=".$myuid; - $uresult = db_execute_assoc($uquery);//Checked - } - - $userlist = array(); - $userlist[0] = "Reserved for logged in user"; - while ($srow = $uresult->FetchRow()) - { - if ($outputformat != 'onlyuidarray') - { - if ($srow['uid'] != $_SESSION['loginID']) - { - $userlist[] = array("user"=>$srow['users_name'], "uid"=>$srow['uid'], "email"=>$srow['email'], "password"=>$srow['password'], "full_name"=>$srow['full_name'], "parent_id"=>$srow['parent_id'], "create_survey"=>$srow['create_survey'], "configurator"=>$srow['configurator'], "create_user"=>$srow['create_user'], "delete_user"=>$srow['delete_user'], "superadmin"=>$srow['superadmin'], "manage_template"=>$srow['manage_template'], "manage_label"=>$srow['manage_label']); //added by Dennis modified by Moses - } - else - { - $userlist[0] = array("user"=>$srow['users_name'], "uid"=>$srow['uid'], "email"=>$srow['email'], "password"=>$srow['password'], "full_name"=>$srow['full_name'], "parent_id"=>$srow['parent_id'], "create_survey"=>$srow['create_survey'], "configurator"=>$srow['configurator'], "create_user"=>$srow['create_user'], "delete_user"=>$srow['delete_user'], "superadmin"=>$srow['superadmin'], "manage_template"=>$srow['manage_template'], "manage_label"=>$srow['manage_label']); - } - } - else - { - if ($srow['uid'] != $_SESSION['loginID']) - { - $userlist[] = $srow['uid']; - } - else - { - $userlist[0] = $srow['uid']; - } - } - - } - return $userlist; -} - - -/** -* Gets all survey infos in one big array including the language specific settings -* -* @param string $surveyid The survey ID -* @param string $languagecode The language code - if not given the base language of the particular survey is used -* @return array Returns array with survey info or false, if survey does not exist -*/ -function getSurveyInfo($surveyid, $languagecode='') -{ - global $dbprefix, $siteadminname, $siteadminemail, $connect, $languagechanger; - $surveyid=sanitize_int($surveyid); - $languagecode=sanitize_languagecode($languagecode); - $thissurvey=false; - // if no language code is set then get the base language one - if (!isset($languagecode) || $languagecode=='') - { - $languagecode=GetBaseLanguageFromSurveyID($surveyid);; - } - $query="SELECT * FROM ".db_table_name('surveys').",".db_table_name('surveys_languagesettings')." WHERE sid=$surveyid and surveyls_survey_id=$surveyid and surveyls_language='$languagecode'"; - $result=db_execute_assoc($query) or safe_die ("Couldn't access survey settings
      $query
      ".$connect->ErrorMsg()); //Checked - while ($row=$result->FetchRow()) - { - $thissurvey=$row; - // now create some stupid array translations - needed for backward compatibility - // Newly added surveysettings don't have to be added specifically - these will be available by field name automatically - $thissurvey['name']=$thissurvey['surveyls_title']; - $thissurvey['description']=$thissurvey['surveyls_description']; - $thissurvey['welcome']=$thissurvey['surveyls_welcometext']; - $thissurvey['templatedir']=$thissurvey['template']; - $thissurvey['adminname']=$thissurvey['admin']; - $thissurvey['tablename']=$dbprefix.'survey_'.$thissurvey['sid']; - $thissurvey['urldescrip']=$thissurvey['surveyls_urldescription']; - $thissurvey['url']=$thissurvey['surveyls_url']; - $thissurvey['expiry']=$thissurvey['expires']; - $thissurvey['email_invite_subj']=$thissurvey['surveyls_email_invite_subj']; - $thissurvey['email_invite']=$thissurvey['surveyls_email_invite']; - $thissurvey['email_remind_subj']=$thissurvey['surveyls_email_remind_subj']; - $thissurvey['email_remind']=$thissurvey['surveyls_email_remind']; - $thissurvey['email_confirm_subj']=$thissurvey['surveyls_email_confirm_subj']; - $thissurvey['email_confirm']=$thissurvey['surveyls_email_confirm']; - $thissurvey['email_register_subj']=$thissurvey['surveyls_email_register_subj']; - $thissurvey['email_register']=$thissurvey['surveyls_email_register']; - if (!isset($thissurvey['adminname'])) {$thissurvey['adminname']=$siteadminname;} - if (!isset($thissurvey['adminemail'])) {$thissurvey['adminemail']=$siteadminemail;} - if (!isset($thissurvey['urldescrip']) || - $thissurvey['urldescrip'] == '' ) {$thissurvey['urldescrip']=$thissurvey['surveyls_url'];} - $thissurvey['passthrulabel']=isset($_SESSION['passthrulabel']) ? $_SESSION['passthrulabel'] : ""; - $thissurvey['passthruvalue']=isset($_SESSION['passthruvalue']) ? $_SESSION['passthruvalue'] : ""; - } - - if (!(isset($languagechanger) && strlen($languagechanger) > 0) && function_exists('makelanguagechanger')) { - $languagechanger = makelanguagechanger(); - } - return $thissurvey; -} - - -function getlabelsets($languages=null) -// Returns a list with label sets -// if the $languages paramter is provided then only labelset containing all of the languages in the paramter are provided -{ - global $dbprefix, $connect, $surveyid; - if ($languages){ - $languages=sanitize_languagecodeS($languages); - $languagesarray=explode(' ',trim($languages)); - } - $query = "SELECT ".db_table_name('labelsets').".lid as lid, label_name FROM ".db_table_name('labelsets'); - if ($languages){ - $query .=" where "; - foreach ($languagesarray as $item) - { - $query .=" ((languages like '% $item %') or (languages='$item') or (languages like '% $item') or (languages like '$item %')) and "; - } - $query .=" 1=1 "; - } - $query .=" order by label_name"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get list of label sets
      $query
      ".$connect->ErrorMsg()); //Checked - $labelsets=array(); - while ($row=$result->FetchRow()) - { - $labelsets[] = array($row['lid'], $row['label_name']); - } - return $labelsets; -} - -/** -* Compares two elements from an array (passed by the usort function) -* and returns -1, 0 or 1 depending on the result of the comparison of -* the sort order of the group_order and question_order field -* -* @param mixed $a -* @param mixed $b -* @return int -*/ -function GroupOrderThenQuestionOrder($a, $b) -{ - if (isset($a['group_order']) && isset($b['group_order'])) - { - $GroupResult = strnatcasecmp($a['group_order'], $b['group_order']); - } - else - { - $GroupResult = ""; - } - if ($GroupResult == 0) - { - $TitleResult = strnatcasecmp($a["question_order"], $b["question_order"]); - return $TitleResult; - } - return $GroupResult; -} - - -function StandardSort($a, $b) -{ - return strnatcasecmp($a, $b); -} - - -function fixsortorderAnswers($qid) //Function rewrites the sortorder for a group of answers -{ - global $dbprefix, $connect, $surveyid; - $qid=sanitize_int($qid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - - $cdresult = db_execute_num("SELECT qid, code, sortorder FROM ".db_table_name('answers')." WHERE qid={$qid} and language='{$baselang}' ORDER BY sortorder"); //Checked - $position=0; - while ($cdrow=$cdresult->FetchRow()) - { - $cd2query="UPDATE ".db_table_name('answers')." SET sortorder={$position} WHERE qid={$cdrow[0]} AND code='{$cdrow[1]}' AND sortorder={$cdrow[2]} "; - $cd2result=$connect->Execute($cd2query) or safe_die ("Couldn't update sortorder
      $cd2query
      ".$connect->ErrorMsg()); //Checked - $position++; - } -} - -/** -* This function rewrites the sortorder for questions inside the named group -* -* @param integer $groupid the group id -* @param integer $surveyid the survey id -*/ -function fixsortorderQuestions($groupid, $surveyid) //Function rewrites the sortorder for questions -{ - global $connect; - $gid = sanitize_int($groupid); - $surveyid = sanitize_int($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $cdresult = db_execute_assoc("SELECT qid FROM ".db_table_name('questions')." WHERE gid='{$gid}' and language='{$baselang}' ORDER BY question_order, title ASC"); //Checked - $position=0; - while ($cdrow=$cdresult->FetchRow()) - { - $cd2query="UPDATE ".db_table_name('questions')." SET question_order='{$position}' WHERE qid='{$cdrow['qid']}' "; - $cd2result = $connect->Execute($cd2query) or safe_die ("Couldn't update question_order
      $cd2query
      ".$connect->ErrorMsg()); //Checked - $position++; - } -} - - -function shiftorderQuestions($sid,$gid,$shiftvalue) //Function shifts the sortorder for questions -{ - global $dbprefix, $connect, $surveyid; - $sid=sanitize_int($sid); - $gid=sanitize_int($gid); - $shiftvalue=sanitize_int($shiftvalue); - - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $cdresult = db_execute_assoc("SELECT qid FROM ".db_table_name('questions')." WHERE gid='{$gid}' and language='{$baselang}' ORDER BY question_order, title ASC"); //Checked - $position=$shiftvalue; - while ($cdrow=$cdresult->FetchRow()) - { - $cd2query="UPDATE ".db_table_name('questions')." SET question_order='{$position}' WHERE qid='{$cdrow['qid']}' "; - $cd2result = $connect->Execute($cd2query) or safe_die ("Couldn't update question_order
      $cd2query
      ".$connect->ErrorMsg()); //Checked - $position++; - } -} - -function fixSortOrderGroups($surveyid) //Function rewrites the sortorder for groups -{ - global $dbprefix, $connect; - $baselang = GetBaseLanguageFromSurveyID($surveyid); - $cdresult = db_execute_assoc("SELECT gid FROM ".db_table_name('groups')." WHERE sid='{$surveyid}' AND language='{$baselang}' ORDER BY group_order, group_name"); - $position=0; - while ($cdrow=$cdresult->FetchRow()) - { - $cd2query="UPDATE ".db_table_name('groups')." SET group_order='{$position}' WHERE gid='{$cdrow['gid']}' "; - $cd2result = $connect->Execute($cd2query) or safe_die ("Couldn't update group_order
      $cd2query
      ".$connect->ErrorMsg()); //Checked - $position++; - } -} - -function fixmovedquestionConditions($qid,$oldgid,$newgid) //Function rewrites the cfieldname for a question after group change -{ - global $dbprefix, $connect, $surveyid; - $qid=sanitize_int($qid); - $oldgid=sanitize_int($oldgid); - $newgid=sanitize_int($newgid); - - $cresult = db_execute_assoc("SELECT cid, cfieldname FROM ".db_table_name('conditions')." WHERE cqid={$qid}"); //Checked - while ($crow=$cresult->FetchRow()) - { - - $mycid=$crow['cid']; - $mycfieldname=$crow['cfieldname']; - $cfnregs=""; - - if (preg_match('/'.$surveyid."X".$oldgid."X".$qid."(.*)/", $mycfieldname, $cfnregs) > 0) - { - $newcfn=$surveyid."X".$newgid."X".$qid.$cfnregs[1]; - $c2query="UPDATE ".db_table_name('conditions') - ." SET cfieldname='{$newcfn}' WHERE cid={$mycid}"; - - $c2result=$connect->Execute($c2query) //Checked - or safe_die ("Couldn't update conditions
      $c2query
      ".$connect->ErrorMsg()); - } - } -} - - -/** -* This function returns GET/POST/REQUEST vars, for some vars like SID and others they are also sanitized -* -* @param mixed $stringname -*/ -function returnglobal($stringname) -{ - global $useWebserverAuth; - if ((isset($useWebserverAuth) && $useWebserverAuth === true) || $stringname=='sid') // don't read SID from a Cookie - { - if (isset($_GET[$stringname])) $urlParam = $_GET[$stringname]; - if (isset($_POST[$stringname])) $urlParam = $_POST[$stringname]; - } - elseif (isset($_REQUEST[$stringname])) - { - $urlParam = $_REQUEST[$stringname]; - } - - if (isset($urlParam)) - { - if ($stringname == 'sid' || $stringname == "gid" || $stringname == "oldqid" || - $stringname == "qid" || $stringname == "tid" || - $stringname == "lid" || $stringname == "ugid"|| - $stringname == "thisstep" || $stringname == "scenario" || - $stringname == "cqid" || $stringname == "cid" || - $stringname == "qaid" || $stringname == "scid" || - $stringname == "loadsecurity") - { - return sanitize_int($urlParam); - } - elseif ($stringname =="lang" || $stringname =="adminlang") - { - return sanitize_languagecode($urlParam); - } - elseif ($stringname =="htmleditormode" || - $stringname =="subaction" || - $stringname =="questionselectormode" || - $stringname =="templateeditormode" - ) - { - return sanitize_paranoid_string($urlParam); - } - elseif ( $stringname =="cquestions") - { - return sanitize_cquestions($urlParam); - } - return $urlParam; - } - else - { - return NULL; - } -} - - -function sendcacheheaders() -{ - global $embedded; - if ( $embedded ) return; - if (!headers_sent()) - { - header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // this line lets IE7 run LimeSurvey in an iframe - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified - header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1 - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - header('Content-Type: text/html; charset=utf-8'); - } -} - -function getsidgidqidaidtype($fieldcode) -{ - // use simple parsing to get {sid}, {gid} - // and what may be {qid} or {qid}{aid} combination - list($fsid, $fgid, $fqid) = explode('X', $fieldcode); - $fsid=sanitize_int($fsid); - $fgid=sanitize_int($fgid); - if (!$fqid) {$fqid=0;} - $fqid=sanitize_int($fqid); - // try a true parsing of fieldcode (can separate qid from aid) - // but fails for type M and type P multiple choice - // questions because the SESSION fieldcode is combined - // and we want here to pass only the sidXgidXqid for type M and P - $fields=arraySearchByKey($fieldcode, createFieldMap($fsid), "fieldname", 1); - - if (count($fields) != 0) - { - $aRef['sid']=$fields['sid']; - $aRef['gid']=$fields['gid']; - $aRef['qid']=$fields['qid']; - $aRef['aid']=$fields['aid']; - $aRef['type']=$fields['type']; - } - else - { - // either the fielcode doesn't match a question - // or it is a type M or P question - $aRef['sid']=$fsid; - $aRef['gid']=$fgid; - $aRef['qid']=sanitize_int($fqid); - - $s_lang = GetBaseLanguageFromSurveyID($fsid); - $query = "SELECT type FROM ".db_table_name('questions')." WHERE qid=".$fqid." AND language='".$s_lang."'"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get question type - getsidgidqidaidtype() in common.php
      ".$connect->ErrorMsg()); //Checked - if ( $result->RecordCount() == 0 ) - { // question doesn't exist - return Array(); - } - else - { // certainly is type M or P - while($row=$result->FetchRow()) - { - $aRef['type']=$row['type']; - } - } - - } - - //return array('sid'=>$fsid, "gid"=>$fgid, "qid"=>$fqid); - return $aRef; -} - -/** -* put your comment there... -* -* @param mixed $fieldcode -* @param mixed $value -* @param mixed $format -* @param mixed $dateformatid -* @return string -*/ -function getextendedanswer($fieldcode, $value, $format='', $dateformatphp='d.m.Y') -{ - - global $dbprefix, $surveyid, $connect, $clang, $action; - - // use Survey base language if s_lang isn't set in _SESSION (when browsing answers) - $s_lang = GetBaseLanguageFromSurveyID($surveyid); - if (!isset($action) || (isset($action) && $action!='browse') ) - { - if (isset($_SESSION['s_lang'])) $s_lang = $_SESSION['s_lang']; //This one does not work in admin mode when you browse a particular answer - } - - //Fieldcode used to determine question, $value used to match against answer code - //Returns NULL if question type does not suit - if (substr_count($fieldcode, "X") > 1) //Only check if it looks like a real fieldcode - { - $fieldmap = createFieldMap($surveyid); - if (isset($fieldmap[$fieldcode])) - $fields = $fieldmap[$fieldcode]; - else - return false; - //Find out the question type - $this_type = $fields['type']; - switch($this_type) - { - case 'D': if (trim($value)!='') - { - $datetimeobj = new Date_Time_Converter($value , "Y-m-d H:i:s"); - $value=$datetimeobj->convert($dateformatphp); - } - break; - case "L": - case "!": - case "O": - case "^": - case "I": - case "R": - $query = "SELECT code, answer FROM ".db_table_name('answers')." WHERE qid={$fields['qid']} AND code='".$connect->escape($value)."' AND scale_id=0 AND language='".$s_lang."'"; - $result = db_execute_assoc($query) or safe_die ("Couldn't get answer type L - getextendedanswer() in common.php
      $query
      ".$connect->ErrorMsg()); //Checked - while($row=$result->FetchRow()) - { - $this_answer=$row['answer']; - } // while - if ($value == "-oth-") - { - $this_answer=$clang->gT("Other"); - } - break; - case "M": - case "J": - case "P": - switch($value) - { - case "Y": $this_answer=$clang->gT("Yes"); break; - } - break; - case "Y": - switch($value) - { - case "Y": $this_answer=$clang->gT("Yes"); break; - case "N": $this_answer=$clang->gT("No"); break; - default: $this_answer=$clang->gT("No answer"); - } - break; - case "G": - switch($value) - { - case "M": $this_answer=$clang->gT("Male"); break; - case "F": $this_answer=$clang->gT("Female"); break; - default: $this_answer=$clang->gT("No answer"); - } - break; - case "C": - switch($value) - { - case "Y": $this_answer=$clang->gT("Yes"); break; - case "N": $this_answer=$clang->gT("No"); break; - case "U": $this_answer=$clang->gT("Uncertain"); break; - } - break; - case "E": - switch($value) - { - case "I": $this_answer=$clang->gT("Increase"); break; - case "D": $this_answer=$clang->gT("Decrease"); break; - case "S": $this_answer=$clang->gT("Same"); break; - } - break; - case "F": - case "H": - case "1": - $query = "SELECT answer FROM ".db_table_name('answers')." WHERE qid={$fields['qid']} AND code='".$connect->escape($value)."' AND language='".$s_lang."'"; - if (isset($fields['scale_id'])) - { - $query.=" AND scale_id={$fields['scale_id']}"; - } - $result = db_execute_assoc($query) or safe_die ("Couldn't get answer type F/H - getextendedanswer() in common.php"); //Checked - while($row=$result->FetchRow()) - { - $this_answer=$row['answer']; - } // while - if ($value == "-oth-") - { - $this_answer=$clang->gT("Other"); - } - break; - case "|": //File upload - if (substr($fieldcode, -9) == 'filecount') { - $this_answer = $clang->gT("File count"); - } else { - //Show the filename, size, title and comment -- no link! - $files = json_decode($value); - $value = ''; - if (is_array($files)) { - foreach ($files as $file) { - $value .= $file->name . - ' (' . $file->size . 'KB) ' . - strip_tags($file->title) . - ' - ' . strip_tags($file->comment) . "
      "; - } - } - } - break; - default: - ; - } // switch - } - if (isset($this_answer)) - { - if ($format != 'INSERTANS') - { - return $this_answer." [$value]"; - } - else - { - if (strip_tags($this_answer) == "") - { - switch ($this_type) - {// for questions with answers beeing - // answer code, it is safe to return the - // code instead of the blank stripped answer - case "A": - case "B": - case "C": - case "E": - case "F": - case "H": - case "1": - case "M": - case "P": - case "!": - case "5": - case "L": - case "O": - return $value; - break; - default: - return strip_tags($this_answer); - break; - } - } - else - { - return strip_tags($this_answer); - } - } - } - else - { - return $value; - } -} - -/*function validate_email($email) -{ -// Create the syntactical validation regular expression -// Validate the syntax - -// see http://data.iana.org/TLD/tlds-alpha-by-domain.txt -$maxrootdomainlength = 6; -return ( ! preg_match("/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,".$maxrootdomainlength."}))$/ix", $email)) ? FALSE : TRUE; -}*/ - -function validate_email($email){ - - - $no_ws_ctl = "[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]"; - $alpha = "[\\x41-\\x5a\\x61-\\x7a]"; - $digit = "[\\x30-\\x39]"; - $cr = "\\x0d"; - $lf = "\\x0a"; - $crlf = "(?:$cr$lf)"; - - - $obs_char = "[\\x00-\\x09\\x0b\\x0c\\x0e-\\x7f]"; - $obs_text = "(?:$lf*$cr*(?:$obs_char$lf*$cr*)*)"; - $text = "(?:[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f]|$obs_text)"; - - - $text = "(?:$lf*$cr*$obs_char$lf*$cr*)"; - $obs_qp = "(?:\\x5c[\\x00-\\x7f])"; - $quoted_pair = "(?:\\x5c$text|$obs_qp)"; - - - $wsp = "[\\x20\\x09]"; - $obs_fws = "(?:$wsp+(?:$crlf$wsp+)*)"; - $fws = "(?:(?:(?:$wsp*$crlf)?$wsp+)|$obs_fws)"; - $ctext = "(?:$no_ws_ctl|[\\x21-\\x27\\x2A-\\x5b\\x5d-\\x7e])"; - $ccontent = "(?:$ctext|$quoted_pair)"; - $comment = "(?:\\x28(?:$fws?$ccontent)*$fws?\\x29)"; - $cfws = "(?:(?:$fws?$comment)*(?:$fws?$comment|$fws))"; - - - $outer_ccontent_dull = "(?:$fws?$ctext|$quoted_pair)"; - $outer_ccontent_nest = "(?:$fws?$comment)"; - $outer_comment = "(?:\\x28$outer_ccontent_dull*(?:$outer_ccontent_nest$outer_ccontent_dull*)+$fws?\\x29)"; - - - - $atext = "(?:$alpha|$digit|[\\x21\\x23-\\x27\\x2a\\x2b\\x2d\\x2f\\x3d\\x3f\\x5e\\x5f\\x60\\x7b-\\x7e])"; - $atext_domain = "(?:$alpha|$digit|[\\x2b\\x2d\\x5f])"; - - $atom = "(?:$cfws?(?:$atext)+$cfws?)"; - $atom_domain = "(?:$cfws?(?:$atext_domain)+$cfws?)"; - - - $qtext = "(?:$no_ws_ctl|[\\x21\\x23-\\x5b\\x5d-\\x7e])"; - $qcontent = "(?:$qtext|$quoted_pair)"; - $quoted_string = "(?:$cfws?\\x22(?:$fws?$qcontent)*$fws?\\x22$cfws?)"; - - - $quoted_string = "(?:$cfws?\\x22(?:$fws?$qcontent)+$fws?\\x22$cfws?)"; - $word = "(?:$atom|$quoted_string)"; - - - $obs_local_part = "(?:$word(?:\\x2e$word)*)"; - - - $obs_domain = "(?:$atom_domain(?:\\x2e$atom_domain)*)"; - - $dot_atom_text = "(?:$atext+(?:\\x2e$atext+)*)"; - $dot_atom_text_domain = "(?:$atext_domain+(?:\\x2e$atext_domain+)*)"; - - - $dot_atom = "(?:$cfws?$dot_atom_text$cfws?)"; - $dot_atom_domain = "(?:$cfws?$dot_atom_text_domain$cfws?)"; - - - $dtext = "(?:$no_ws_ctl|[\\x21-\\x5a\\x5e-\\x7e])"; - $dcontent = "(?:$dtext|$quoted_pair)"; - $domain_literal = "(?:$cfws?\\x5b(?:$fws?$dcontent)*$fws?\\x5d$cfws?)"; - - - $local_part = "(($dot_atom)|($quoted_string)|($obs_local_part))"; - $domain = "(($dot_atom_domain)|($domain_literal)|($obs_domain))"; - $addr_spec = "$local_part\\x40$domain"; - - - if (strlen($email) > 256) return FALSE; - - - $email = strip_comments($outer_comment, $email, "(x)"); - - - - if (!preg_match("!^$addr_spec$!", $email, $m)){ - - return FALSE; - } - - $bits = array( - 'local' => isset($m[1]) ? $m[1] : '', - 'local-atom' => isset($m[2]) ? $m[2] : '', - 'local-quoted' => isset($m[3]) ? $m[3] : '', - 'local-obs' => isset($m[4]) ? $m[4] : '', - 'domain' => isset($m[5]) ? $m[5] : '', - 'domain-atom' => isset($m[6]) ? $m[6] : '', - 'domain-literal' => isset($m[7]) ? $m[7] : '', - 'domain-obs' => isset($m[8]) ? $m[8] : '', - ); - - - - $bits['local'] = strip_comments($comment, $bits['local']); - $bits['domain'] = strip_comments($comment, $bits['domain']); - - - - - if (strlen($bits['local']) > 64) return FALSE; - if (strlen($bits['domain']) > 255) return FALSE; - - - - if (strlen($bits['domain-literal'])){ - - $Snum = "(\d{1,3})"; - $IPv4_address_literal = "$Snum\.$Snum\.$Snum\.$Snum"; - - $IPv6_hex = "(?:[0-9a-fA-F]{1,4})"; - - $IPv6_full = "IPv6\:$IPv6_hex(:?\:$IPv6_hex){7}"; - - $IPv6_comp_part = "(?:$IPv6_hex(?:\:$IPv6_hex){0,5})?"; - $IPv6_comp = "IPv6\:($IPv6_comp_part\:\:$IPv6_comp_part)"; - - $IPv6v4_full = "IPv6\:$IPv6_hex(?:\:$IPv6_hex){5}\:$IPv4_address_literal"; - - $IPv6v4_comp_part = "$IPv6_hex(?:\:$IPv6_hex){0,3}"; - $IPv6v4_comp = "IPv6\:((?:$IPv6v4_comp_part)?\:\:(?:$IPv6v4_comp_part\:)?)$IPv4_address_literal"; - - - - if (preg_match("!^\[$IPv4_address_literal\]$!", $bits['domain'], $m)){ - - if (intval($m[1]) > 255) return FALSE; - if (intval($m[2]) > 255) return FALSE; - if (intval($m[3]) > 255) return FALSE; - if (intval($m[4]) > 255) return FALSE; - - }else{ - - - while (1){ - - if (preg_match("!^\[$IPv6_full\]$!", $bits['domain'])){ - break; - } - - if (preg_match("!^\[$IPv6_comp\]$!", $bits['domain'], $m)){ - list($a, $b) = explode('::', $m[1]); - $folded = (strlen($a) && strlen($b)) ? "$a:$b" : "$a$b"; - $groups = explode(':', $folded); - if (count($groups) > 6) return FALSE; - break; - } - - if (preg_match("!^\[$IPv6v4_full\]$!", $bits['domain'], $m)){ - - if (intval($m[1]) > 255) return FALSE; - if (intval($m[2]) > 255) return FALSE; - if (intval($m[3]) > 255) return FALSE; - if (intval($m[4]) > 255) return FALSE; - break; - } - - if (preg_match("!^\[$IPv6v4_comp\]$!", $bits['domain'], $m)){ - list($a, $b) = explode('::', $m[1]); - $b = substr($b, 0, -1); # remove the trailing colon before the IPv4 address - $folded = (strlen($a) && strlen($b)) ? "$a:$b" : "$a$b"; - $groups = explode(':', $folded); - if (count($groups) > 4) return FALSE; - break; - } - - return FALSE; - } - } - }else{ - - - $labels = explode('.', $bits['domain']); - - - if (count($labels) == 1) return FALSE; - - - foreach ($labels as $label){ - - if (strlen($label) > 63) return FALSE; - if (substr($label, 0, 1) == '-') return FALSE; - if (substr($label, -1) == '-') return FALSE; - } - - if (preg_match('!^[0-9]+$!', array_pop($labels))) return FALSE; - } - - - return TRUE; -} - -################################################################################## - -function strip_comments($comment, $email, $replace=''){ - - while (1){ - $new = preg_replace("!$comment!", $replace, $email); - if (strlen($new) == strlen($email)){ - return $email; - } - $email = $new; - } -} - - -function validate_templatedir($templatename) -{ - global $usertemplaterootdir, $defaulttemplate; - if (isStandardTemplate($templatename)) - { - return $templatename; - } - elseif (is_dir("$usertemplaterootdir/{$templatename}/")) - { - return $templatename; - } - elseif (isStandardTemplate($defaulttemplate)) - { - return $defaulttemplate; - } - elseif (is_dir("$usertemplaterootdir/{$defaulttemplate}/")) - { - return $defaulttemplate; - } - else - { - return 'default'; - } -} - - -/** -* This function generates an array containing the fieldcode, and matching data in the same order as the activate script -* -* @param string $surveyid The Survey ID -* @param mixed $style 'short' (default) or 'full' - full creates extra information like default values -* @param mixed $force_refresh - Forces to really refresh the array, not just take the session copy -* @param int $questionid Limit to a certain qid only (for question preview) - default is false -* @return array -*/ -function createFieldMap($surveyid, $style='full', $force_refresh=false, $questionid=false, $sQuestionLanguage=null) { - - global $dbprefix, $connect, $clang, $aDuplicateQIDs; - $surveyid=sanitize_int($surveyid); - - //Get list of questions - if (is_null($sQuestionLanguage)) - { - if (isset($_SESSION['s_lang'])&& in_array($_SESSION['s_lang'],GetAdditionalLanguagesFromSurveyID($surveyid)) ) { - $sQuestionLanguage = $_SESSION['s_lang']; - } - else { - $sQuestionLanguage = GetBaseLanguageFromSurveyID($surveyid); - } - } - $sQuestionLanguage = sanitize_languagecode($sQuestionLanguage); - if ($clang->langcode != $sQuestionLanguage) { - SetSurveyLanguage($surveyid, $sQuestionLanguage); - } - $s_lang = $clang->langcode; - - //checks to see if fieldmap has already been built for this page. - if (isset($_SESSION['fieldmap-' . $surveyid . $s_lang]) && !$force_refresh && $questionid == false) { - if (isset($_SESSION['adminlang']) && $clang->langcode != $_SESSION['adminlang']) { - $clang = new limesurvey_lang($_SESSION['adminlang']); - } - return $_SESSION['fieldmap-' . $surveyid . $s_lang]; - } - - $fieldmap["id"]=array("fieldname"=>"id", 'sid'=>$surveyid, 'type'=>"id", "gid"=>"", "qid"=>"", "aid"=>""); - if ($style == "full") - { - $fieldmap["id"]['title']=""; - $fieldmap["id"]['question']=$clang->gT("Response ID"); - $fieldmap["id"]['group_name']=""; - } - - $fieldmap["submitdate"]=array("fieldname"=>"submitdate", 'type'=>"submitdate", 'sid'=>$surveyid, "gid"=>"", "qid"=>"", "aid"=>""); - if ($style == "full") - { - $fieldmap["submitdate"]['title']=""; - $fieldmap["submitdate"]['question']=$clang->gT("Date submitted"); - $fieldmap["submitdate"]['group_name']=""; - } - - $fieldmap["lastpage"]=array("fieldname"=>"lastpage", 'sid'=>$surveyid, 'type'=>"lastpage", "gid"=>"", "qid"=>"", "aid"=>""); - if ($style == "full") - { - $fieldmap["lastpage"]['title']=""; - $fieldmap["lastpage"]['question']=$clang->gT("Last page"); - $fieldmap["lastpage"]['group_name']=""; - } - - $fieldmap["startlanguage"]=array("fieldname"=>"startlanguage", 'sid'=>$surveyid, 'type'=>"startlanguage", "gid"=>"", "qid"=>"", "aid"=>""); - if ($style == "full") - { - $fieldmap["startlanguage"]['title']=""; - $fieldmap["startlanguage"]['question']=$clang->gT("Start language"); - $fieldmap["startlanguage"]['group_name']=""; - } - - - //Check for any additional fields for this survey and create necessary fields (token and datestamp and ipaddr) - $pquery = "SELECT anonymized, datestamp, ipaddr, refurl FROM ".db_table_name('surveys')." WHERE sid=$surveyid"; - $presult=db_execute_assoc($pquery); //Checked - while($prow=$presult->FetchRow()) - { - if ($prow['anonymized'] == "N") - { - $fieldmap["token"]=array("fieldname"=>"token", 'sid'=>$surveyid, 'type'=>"token", "gid"=>"", "qid"=>"", "aid"=>""); - if ($style == "full") - { - $fieldmap["token"]['title']=""; - $fieldmap["token"]['question']=$clang->gT("Token"); - $fieldmap["token"]['group_name']=""; - } - } - if ($prow['datestamp'] == "Y") - { - $fieldmap["datestamp"]=array("fieldname"=>"datestamp", - 'type'=>"datestamp", - 'sid'=>$surveyid, - "gid"=>"", - "qid"=>"", - "aid"=>""); - if ($style == "full") - { - $fieldmap["datestamp"]['title']=""; - $fieldmap["datestamp"]['question']=$clang->gT("Date last action"); - $fieldmap["datestamp"]['group_name']=""; - } - $fieldmap["startdate"]=array("fieldname"=>"startdate", - 'type'=>"startdate", - 'sid'=>$surveyid, - "gid"=>"", - "qid"=>"", - "aid"=>""); - if ($style == "full") - { - $fieldmap["startdate"]['title']=""; - $fieldmap["startdate"]['question']=$clang->gT("Date started"); - $fieldmap["startdate"]['group_name']=""; - } - - } - if ($prow['ipaddr'] == "Y") - { - $fieldmap["ipaddr"]=array("fieldname"=>"ipaddr", - 'type'=>"ipaddress", - 'sid'=>$surveyid, - "gid"=>"", - "qid"=>"", - "aid"=>""); - if ($style == "full") - { - $fieldmap["ipaddr"]['title']=""; - $fieldmap["ipaddr"]['question']=$clang->gT("IP address"); - $fieldmap["ipaddr"]['group_name']=""; - } - } - // Add 'refurl' to fieldmap. - if ($prow['refurl'] == "Y") - { - $fieldmap["refurl"]=array("fieldname"=>"refurl", 'type'=>"url", 'sid'=>$surveyid, "gid"=>"", "qid"=>"", "aid"=>""); - if ($style == "full") - { - $fieldmap["refurl"]['title']=""; - $fieldmap["refurl"]['question']=$clang->gT("Referrer URL"); - $fieldmap["refurl"]['group_name']=""; - } - } - } - - // Collect all default values once so don't need separate query for each question with defaults - // First collect language specific defaults - $defaultsQuery = "SELECT a.qid, a.sqid, a.scale_id, a.specialtype, a.defaultvalue" - . " FROM ".db_table_name('defaultvalues')." as a, ".db_table_name('questions')." as b" - . " WHERE a.qid = b.qid" - . " AND a.language = b.language" - . " AND a.language = '$s_lang'" - . " AND b.same_default=0" - . " AND b.sid = ".$surveyid; - $defaultResults = db_execute_assoc($defaultsQuery) or safe_die ("Couldn't get list of default values in createFieldMap.
      $defaultsQuery
      ".$conect->ErrorMsg()); - - $defaultValues = array(); // indexed by question then subquestion - foreach($defaultResults as $dv) - { - if ($dv['specialtype'] != '') { - $sq = $dv['specialtype']; - } - else { - $sq = $dv['sqid']; - } - $defaultValues[$dv['qid'].'~'.$sq] = $dv['defaultvalue']; - } - - // Now overwrite language-specific defaults (if any) base language values for each question that uses same_defaults=1 - $baseLanguage = GetBaseLanguageFromSurveyID($surveyid); - $defaultsQuery = "SELECT a.qid, a.sqid, a.scale_id, a.specialtype, a.defaultvalue" - . " FROM ".db_table_name('defaultvalues')." as a, ".db_table_name('questions')." as b" - . " WHERE a.qid = b.qid" - . " AND a.language = b.language" - . " AND a.language = '$baseLanguage'" - . " AND b.same_default=1" - . " AND b.sid = ".$surveyid; - $defaultResults = db_execute_assoc($defaultsQuery) or safe_die ("Couldn't get list of default values in createFieldMap.
      $defaultsQuery
      ".$conect->ErrorMsg()); - - foreach($defaultResults as $dv) - { - if ($dv['specialtype'] != '') { - $sq = $dv['specialtype']; - } - else { - $sq = $dv['sqid']; - } - $defaultValues[$dv['qid'].'~'.$sq] = $dv['defaultvalue']; - } - - $qtypes=getqtypelist('','array'); - $aquery = "SELECT * " - ." FROM ".db_table_name('questions')." as questions, ".db_table_name('groups')." as groups" - ." WHERE questions.gid=groups.gid AND " - ." questions.sid=$surveyid AND " - ." questions.language='{$s_lang}' AND " - ." questions.parent_qid=0 AND " - ." groups.language='{$s_lang}' "; - if ($questionid!==false) - { - $aquery.=" and questions.qid={$questionid} "; - } - $aquery.=" ORDER BY group_order, question_order"; - $aresult = db_execute_assoc($aquery) or safe_die ("Couldn't get list of questions in createFieldMap function.
      $query
      ".$connect->ErrorMsg()); //Checked - - $questionSeq=-1; // this is incremental question sequence across all groups - $groupSeq=-1; - $_groupOrder=-1; - - while ($arow=$aresult->FetchRow()) //With each question, create the appropriate field(s) - { - ++$questionSeq; - - // fix fact taht group_order may have gaps - if ($_groupOrder != $arow['group_order']) { - $_groupOrder = $arow['group_order']; - ++$groupSeq; - } - - // Conditions indicators are obsolete with EM. However, they are so tightly coupled into LS code that easider to just set values to 'N' for now and refactor later. - $conditions = 'N'; - $usedinconditions = 'N'; - - // Field identifier - // GXQXSXA - // G=Group Q=Question S=Subquestion A=Answer Option - // If S or A don't exist then set it to 0 - // Implicit (subqestion intermal to a question type ) or explicit qubquestions/answer count starts at 1 - - // Types "L", "!" , "O", "D", "G", "N", "X", "Y", "5","S","T","U","*" - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}"; - - if ($qtypes[$arow['type']]['subquestions']==0 && $arow['type'] != "R" && $arow['type'] != "|") - { - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>"{$arow['type']}", 'sid'=>$surveyid, "gid"=>$arow['gid'], "qid"=>$arow['qid'], "aid"=>""); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - if (isset($defaultValues[$arow['qid'].'~0'])) { - $fieldmap[$fieldname]['defaultvalue'] = $defaultValues[$arow['qid'].'~0']; - } - } - switch($arow['type']) - { - case "L": //RADIO LIST - case "!": //DROPDOWN LIST - $fieldmap[$fieldname]['other']=$arow['other']; // so that base variable knows whether has other value - if ($arow['other'] == "Y") - { - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}other"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, - 'type'=>$arow['type'], - 'sid'=>$surveyid, - "gid"=>$arow['gid'], - "qid"=>$arow['qid'], - "aid"=>"other"); - // dgk bug fix line above. aid should be set to "other" for export to append to the field name in the header line. - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=$clang->gT("Other"); - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - $fieldmap[$fieldname]['other']=$arow['other']; - if (isset($defaultValues[$arow['qid'].'~other'])) { - $fieldmap[$fieldname]['defaultvalue'] = $defaultValues[$arow['qid'].'~other']; - } - } - } - break; - case "O": //DROPDOWN LIST WITH COMMENT - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}comment"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, - 'type'=>$arow['type'], - 'sid'=>$surveyid, - "gid"=>$arow['gid'], - "qid"=>$arow['qid'], - "aid"=>"comment"); - // dgk bug fix line below. aid should be set to "comment" for export to append to the field name in the header line. Also needed set the type element correctly. - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=$clang->gT("Comment"); - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - } - break; - } - } - // For Multi flexi question types - elseif ($qtypes[$arow['type']]['subquestions']==2 && $qtypes[$arow['type']]['answerscales']==0) - { - //MULTI FLEXI - $abrows = getSubQuestions($surveyid,$arow['qid'],$s_lang); - //Now first process scale=1 - $answerset=array(); - $answerList = array(); - foreach ($abrows as $key=>$abrow) - { - if($abrow['scale_id']==1) { - $answerset[]=$abrow; - $answerList[] = array( - 'code'=>$abrow['title'], - 'answer'=>$abrow['question'], - ); - unset($abrows[$key]); - } - } - reset($abrows); - foreach ($abrows as $abrow) - { - foreach($answerset as $answer) - { - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}_{$answer['title']}"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, - 'type'=>$arow['type'], - 'sid'=>$surveyid, - "gid"=>$arow['gid'], - "qid"=>$arow['qid'], - "aid"=>$abrow['title']."_".$answer['title'], - "sqid"=>$abrow['qid']); - if ($abrow['other']=="Y") {$alsoother="Y";} - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion1']=$abrow['question']; - $fieldmap[$fieldname]['subquestion2']=$answer['question']; - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - $fieldmap[$fieldname]['preg']=$arow['preg']; - $fieldmap[$fieldname]['answerList']=$answerList; - } - } - } - unset($answerset); - } - elseif ($arow['type'] == "1") - { - $abrows = getSubQuestions($surveyid,$arow['qid'],$s_lang); - foreach ($abrows as $abrow) - { - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}#0"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>$arow['type'], 'sid'=>$surveyid, "gid"=>$arow['gid'], "qid"=>$arow['qid'], "aid"=>$abrow['title'], "scale_id"=>0); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=$abrow['question']; - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['scale']=$clang->gT('Scale 1'); - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - } - - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}#1"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>$arow['type'], 'sid'=>$surveyid, "gid"=>$arow['gid'], "qid"=>$arow['qid'], "aid"=>$abrow['title'], "scale_id"=>1); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=$abrow['question']; - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['scale']=$clang->gT('Scale 2'); - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - } - } - } - - elseif ($arow['type'] == "R") - { - //MULTI ENTRY - $slots=$connect->GetOne("select count(code) from ".db_table_name('answers')." where qid={$arow['qid']} and language='{$s_lang}'"); - for ($i=1; $i<=$slots; $i++) - { - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}$i"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>$arow['type'], 'sid'=>$surveyid, "gid"=>$arow['gid'], "qid"=>$arow['qid'], "aid"=>$i); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=sprintf($clang->gT('Rank %s'),$i); - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - } - } - } - elseif ($arow['type'] == "|") - { - $abquery = "SELECT value FROM ".db_table_name('question_attributes') - ." WHERE attribute='max_num_of_files' AND qid=".$arow['qid']; - $abresult = db_execute_assoc($abquery) or safe_die ("Couldn't get maximum - number of files that can be uploaded
      $abquery
      ".$connect->ErrorMsg()); - $abrow = $abresult->FetchRow(); - - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}"; - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, - 'type'=>$arow['type'], - 'sid'=>$surveyid, - "gid"=>$arow['gid'], - "qid"=>$arow['qid'], - "aid"=>'' - ); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['max_files']=$abrow['value']; - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - } - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}"."_filecount"; - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, - 'type'=>$arow['type'], - 'sid'=>$surveyid, - "gid"=>$arow['gid'], - "qid"=>$arow['qid'], - "aid"=>"filecount" - ); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']="filecount - ".$arow['question']; - //$fieldmap[$fieldname]['subquestion']=$clang->gT("Comment"); - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - } - } - else // Question types with subquestions and one answer per subquestion (M/A/B/C/E/F/H/P) - { - //MULTI ENTRY - $abrows = getSubQuestions($surveyid,$arow['qid'],$s_lang); - foreach ($abrows as $abrow) - { - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, - 'type'=>$arow['type'], - 'sid'=>$surveyid, - 'gid'=>$arow['gid'], - 'qid'=>$arow['qid'], - 'aid'=>$abrow['title'], - 'sqid'=>$abrow['qid']); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=$abrow['question']; - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - $fieldmap[$fieldname]['preg']=$arow['preg']; - if (isset($defaultValues[$arow['qid'].'~'.$abrow['qid']])) { - $fieldmap[$fieldname]['defaultvalue'] = $defaultValues[$arow['qid'].'~'.$abrow['qid']]; - } - } - if ($arow['type'] == "P") - { - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}comment"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>$arow['type'], 'sid'=>$surveyid, "gid"=>$arow['gid'], "qid"=>$arow['qid'], "aid"=>$abrow['title']."comment"); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=$clang->gT('Comment'); - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - } - } - } - if ($arow['other']=="Y" && ($arow['type']=="M" || $arow['type']=="P")) - { - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}other"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>$arow['type'], 'sid'=>$surveyid, "gid"=>$arow['gid'], "qid"=>$arow['qid'], "aid"=>"other"); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=$clang->gT('Other'); - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - $fieldmap[$fieldname]['other']=$arow['other']; - } - if ($arow['type']=="P") - { - $fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}othercomment"; - if (isset($fieldmap[$fieldname])) $aDuplicateQIDs[$arow['qid']]=array('fieldname'=>$fieldname,'question'=>$arow['question'],'gid'=>$arow['gid']); - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>$arow['type'], 'sid'=>$surveyid, "gid"=>$arow['gid'], "qid"=>$arow['qid'], "aid"=>"othercomment"); - if ($style == "full") - { - $fieldmap[$fieldname]['title']=$arow['title']; - $fieldmap[$fieldname]['question']=$arow['question']; - $fieldmap[$fieldname]['subquestion']=$clang->gT('Other comment'); - $fieldmap[$fieldname]['group_name']=$arow['group_name']; - $fieldmap[$fieldname]['mandatory']=$arow['mandatory']; - $fieldmap[$fieldname]['hasconditions']=$conditions; - $fieldmap[$fieldname]['usedinconditions']=$usedinconditions; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - $fieldmap[$fieldname]['other']=$arow['other']; - } - } - } - } - if (isset($fieldmap[$fieldname])) // only add these fields if there is actually a valid field - { - $fieldmap[$fieldname]['relevance']=$arow['relevance']; - $fieldmap[$fieldname]['grelevance']=$arow['grelevance']; - $fieldmap[$fieldname]['questionSeq']=$questionSeq; - $fieldmap[$fieldname]['groupSeq']=$groupSeq; - $fieldmap[$fieldname]['preg']=$arow['preg']; - $fieldmap[$fieldname]['other']=$arow['other']; - $fieldmap[$fieldname]['help']=$arow['help']; - } - else - { - --$questionSeq; // didn't generate a valid $fieldmap entry, so decrement the question counter to ensure they are sequential - } - } - if (isset($fieldmap)) { - if ($questionid == false) - { - // If the fieldmap was randomized, the master will contain the proper order. Copy that fieldmap with the new language settings. - if (isset($_SESSION['fieldmap-' . $surveyid . '-randMaster'])) - { - $masterFieldmap = $_SESSION['fieldmap-' . $surveyid . '-randMaster']; - $mfieldmap = $_SESSION[$masterFieldmap]; - - foreach ($mfieldmap as $fieldname => $mf) - { - if (isset($fieldmap[$fieldname])) - { - $f = $fieldmap[$fieldname]; - if (isset($f['question'])) - { - $mf['question'] = $f['question']; - } - if (isset($f['subquestion'])) - { - $mf['subquestion'] = $f['subquestion']; - } - if (isset($f['subquestion1'])) - { - $mf['subquestion1'] = $f['subquestion1']; - } - if (isset($f['subquestion2'])) - { - $mf['subquestion2'] = $f['subquestion2']; - } - if (isset($f['group_name'])) - { - $mf['group_name'] = $f['group_name']; - } - if (isset($f['answerList'])) - { - $mf['answerList'] = $f['answerList']; - } - if (isset($f['defaultvalue'])) - { - $mf['defaultvalue'] = $f['defaultvalue']; - } - if (isset($f['help'])) - { - $mf['help'] = $f['help']; - } - } - $mfieldmap[$fieldname] = $mf; - } - $fieldmap = $mfieldmap; - } - - $_SESSION['fieldmap-' . $surveyid . $clang->langcode]=$fieldmap; - } - - if (isset($_SESSION['adminlang']) && $clang->langcode != $_SESSION['adminlang']) { - $clang = new limesurvey_lang($_SESSION['adminlang']); - } - return $fieldmap; - } -} - - -/** -* This function generates an array containing the fieldcode, and matching data in the same order as the activate script -* -* @param string $surveyid The Survey ID -* @param mixed $style 'short' (default) or 'full' - full creates extra information like default values -* @param mixed $force_refresh - Forces to really refresh the array, not just take the session copy -* @param int $questionid Limit to a certain qid only (for question preview) - default is false -* @return array -*/ -function createTimingsFieldMap($surveyid, $style='full', $force_refresh=false, $questionid=false, $sQuestionLanguage=null) { - - global $dbprefix, $connect, $clang, $aDuplicateQIDs; - static $timingsFieldMap; - - $surveyid=sanitize_int($surveyid); - //checks to see if fieldmap has already been built for this page. - if (isset($timingsFieldMap[$surveyid][$style][$clang->langcode]) && $force_refresh==false) { - return $timingsFieldMap[$surveyid][$style][$clang->langcode]; - } - - //do something - $fields = createFieldMap($surveyid, $style, $force_refresh, $questionid, $sQuestionLanguage); - $fieldmap['interviewtime']=array('fieldname'=>'interviewtime','type'=>'interview_time','sid'=>$surveyid, 'gid'=>'', 'qid'=>'', 'aid'=>'', 'question'=>$clang->gT('Total time'), 'title'=>'interviewtime'); - foreach ($fields as $field) { - if (!empty($field['gid'])) { - // field for time spent on page - $fieldname="{$field['sid']}X{$field['gid']}time"; - if (!isset($fieldmap[$fieldname])) - { - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>"page_time", 'sid'=>$surveyid, "gid"=>$field['gid'], "group_name"=>$field['group_name'], "qid"=>'', 'aid'=>'', 'title'=>'groupTime'.$field['gid'], 'question'=>$clang->gT('Group time').": ".$field['group_name']); - } - - // field for time spent on answering a question - $fieldname="{$field['sid']}X{$field['gid']}X{$field['qid']}time"; - if (!isset($fieldmap[$fieldname])) - { - $fieldmap[$fieldname]=array("fieldname"=>$fieldname, 'type'=>"answer_time", 'sid'=>$surveyid, "gid"=>$field['gid'], "group_name"=>$field['group_name'], "qid"=>$field['qid'], 'aid'=>'', "title"=>$field['title'].'Time', "question"=>$clang->gT('Question time').": ".$field['title']); - } - } - } - - $timingsFieldMap[$surveyid][$style][$clang->langcode] = $fieldmap; - return $timingsFieldMap[$surveyid][$style][$clang->langcode]; -} - -/** -* put your comment there... -* -* @param mixed $needle -* @param mixed $haystack -* @param mixed $keyname -* @param mixed $maxanswers -*/ -function arraySearchByKey($needle, $haystack, $keyname, $maxanswers="") { - $output=array(); - foreach($haystack as $hay) { - if (array_key_exists($keyname, $hay)) { - if ($hay[$keyname] == $needle) { - if ($maxanswers == 1) { - return $hay; - } else { - $output[]=$hay; - } - } - } - } - return $output; -} - - -/** -* This function returns a count of the number of saved responses to a survey -* -* @param mixed $surveyid Survey ID -*/ -function getSavedCount($surveyid) -{ - global $dbprefix, $connect; - $surveyid=(int)$surveyid; - - $query = "SELECT COUNT(*) FROM ".db_table_name('saved_control')." WHERE sid=$surveyid"; - $count=$connect->getOne($query); - return $count; -} - -function GetBaseLanguageFromSurveyID($surveyid) -{ - static $cache = array(); - global $connect,$defaultlang; - $surveyid=(int)($surveyid); - if (!isset($cache[$surveyid])) { - $query = "SELECT language FROM ".db_table_name('surveys')." WHERE sid=$surveyid"; - $surveylanguage = $connect->GetOne($query); //Checked - if (is_null($surveylanguage)) - { - $surveylanguage=$defaultlang; - } - $cache[$surveyid] = $surveylanguage; - } else { - $surveylanguage = $cache[$surveyid]; - } - return $surveylanguage; -} - - -function GetAdditionalLanguagesFromSurveyID($surveyid) -{ - static $cache = array(); - global $connect; - $surveyid=sanitize_int($surveyid); - if (!isset($cache[$surveyid])) { - $query = "SELECT additional_languages FROM ".db_table_name('surveys')." WHERE sid=$surveyid"; - $additional_languages = $connect->GetOne($query); - if (trim($additional_languages)=='') - { - $additional_languages = array(); - } - else - { - $additional_languages = explode(" ", trim($additional_languages)); - } - $cache[$surveyid] = $additional_languages; - } else { - $additional_languages = $cache[$surveyid]; - } - return $additional_languages; -} - - - -//For multilanguage surveys -// If null or 0 is given for $surveyid then the default language from config-defaults.php is returned -function SetSurveyLanguage($surveyid, $language) -{ - global $rootdir, $defaultlang, $clang; - $surveyid=sanitize_int($surveyid); - require_once($rootdir.'/classes/core/language.php'); - if (isset($surveyid) && $surveyid>0) - { - // see if language actually is present in survey -# $query = "SELECT language, additional_languages FROM ".db_table_name('surveys')." WHERE sid=$surveyid"; -# $result = db_execute_assoc($query); //Checked -# while ($result && ($row=$result->FetchRow())) { -# $additional_languages = $row['additional_languages']; -# $default_language = $row['language']; -# } - $default_language=GetBaseLanguageFromSurveyID($surveyid); - $additional_languages=GetAdditionalLanguagesFromSurveyID($surveyid); - if ( !isset($language) || ($language=='') - || !( in_array($language,$additional_languages) || $language==$default_language) - ) - { - // Language not supported, fall back to survey's default language - $_SESSION['s_lang'] = $default_language; - } - else - { - $_SESSION['s_lang'] = $language; - } - $clang = new limesurvey_lang($_SESSION['s_lang']); - } - else { - $clang = new limesurvey_lang($defaultlang); - } - - $thissurvey=getSurveyInfo($surveyid, $_SESSION['s_lang']); - $_SESSION['dateformats'] = getDateFormatData($thissurvey['surveyls_dateformat']); - - LimeExpressionManager::SetEMLanguage($_SESSION['s_lang']); - return $clang; -} - - -function buildLabelSetCheckSumArray() -{ - global $connect; - // BUILD CHECKSUMS FOR ALL EXISTING LABEL SETS - $query = "SELECT lid - FROM ".db_table_name('labelsets')." - ORDER BY lid"; - $result = db_execute_assoc($query) or safe_die("safe_died collecting labelset ids
      $query
      ".$connect->ErrorMsg()); //Checked - $csarray=array(); - while ($row=$result->FetchRow()) - { - $thisset=""; - $query2 = "SELECT code, title, sortorder, language, assessment_value - FROM ".db_table_name('labels')." - WHERE lid={$row['lid']} - ORDER BY language, sortorder, code"; - $result2 = db_execute_num($query2) or safe_die("safe_died querying labelset $lid
      $query2
      ".$connect->ErrorMsg()); //Checked - while($row2=$result2->FetchRow()) - { - $thisset .= implode('.', $row2); - } // while - $csarray[$row['lid']]=dechex(crc32($thisset)*1); - } - return $csarray; -} - - -/** -* -* Returns a flat array with all question attributes for the question only (and the qid we gave it)! -* @author: c_schmitz -* @param $qid The question ID -* @param $type optional The question type - saves a DB query if you provide it -* @return array{attribute=>value , attribute=>value} or false if the question ID does not exist (anymore) -*/ -function getQuestionAttributes($qid, $type='') -{ - static $cache = array(); - static $availableattributesarr = null; - - if (isset($cache[$qid])) { - return $cache[$qid]; - } - if ($type=='') // If type is not given find it out - { - $query = "SELECT type FROM ".db_table_name('questions')." WHERE qid=$qid and parent_qid=0 group by type"; - $result = db_execute_assoc($query) or safe_die("Error finding question attributes"); //Checked - $row=$result->FetchRow(); - if ($row===false) // Question was deleted while running the survey - { - $cache[$qid]=false; - return false; - } - $type=$row['type']; - } - - //Now read available attributes, make sure we do this only once per request to save - //processing cycles and memory - if (is_null($availableattributesarr)) $availableattributesarr=questionAttributes(); - if (isset($availableattributesarr[$type])) - { - $availableattributes=$availableattributesarr[$type]; - } - else - { - $cache[$qid]=array(); - return array(); - } - - foreach($availableattributes as $attribute){ - $defaultattributes[$attribute['name']]=$attribute['default']; - } - $setattributes=array(); - $qid=sanitize_int($qid); - $query = "SELECT attribute, value FROM ".db_table_name('question_attributes')." WHERE qid=$qid"; - $result = db_execute_assoc($query) or safe_die("Error finding question attributes"); //Checked - $setattributes=array(); - while ($row=$result->FetchRow()) - { - $setattributes[$row['attribute']]=$row['value']; - } - //echo "
      ";print_r($qid_attributes);echo "
      "; - $qid_attributes=array_merge($defaultattributes,$setattributes); - $cache[$qid]=$qid_attributes; - return $qid_attributes; -} - -/** -* -* Returns the questionAttribtue value set or '' if not set -* @author: lemeur -* @param $questionAttributeArray -* @param $attributeName -* @return string -*/ -function getQuestionAttributeValue($questionAttributeArray, $attributeName) -{ - if (isset($questionAttributeArray[$attributeName])) - { - return $questionAttributeArray[$attributeName]; - } - else - { - return ''; - } -} - -/** -* Returns array of question type chars with attributes -* -* @param mixed $returnByName If set to true the array will be by attribute name -*/ -function questionAttributes($returnByName=false) -{ - global $clang; - //For each question attribute include a key: - // name - the display name - // types - a string with one character representing each question typy to which the attribute applies - // help - a short explanation - - // If you insert a new attribute please do it in correct alphabetical order! - - $qattributes["alphasort"]=array( - "types"=>"!LO", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT("Sort the answer options alphabetically"), - "caption"=>$clang->gT('Sort answers alphabetically')); - - $qattributes["answer_width"]=array( - "types"=>"ABCEF1:;", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'integer', - 'min'=>'1', - 'max'=>'100', - "help"=>$clang->gT('Set the percentage width of the answer column (1-100)'), - "caption"=>$clang->gT('Answer width')); - - $qattributes["array_filter"]=array( - "types"=>"1ABCEF:;MPLKQ", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT("Enter the code(s) of Multiple choice question(s) (separated by semicolons) to only show the matching answer options in this question."), - "caption"=>$clang->gT('Array filter')); - - $qattributes["array_filter_exclude"]=array( - "types"=>"1ABCEF:;MPLKQ", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT("Enter the code(s) of Multiple choice question(s) (separated by semicolons) to exclude the matching answer options in this question."), - "caption"=>$clang->gT('Array filter exclusion')); - - $qattributes["array_filter_style"]=array( - "types"=>"1ABCEF:;MPLKQ", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('Hidden'), - 1=>$clang->gT('Disabled')), - 'default'=>0, - "help"=>$clang->gT("Specify how array-filtered sub-questions should be displayed"), - "caption"=>$clang->gT('Array filter style')); - - $qattributes["assessment_value"]=array( - "types"=>"MP", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>100, - 'default'=>'1', - 'inputtype'=>'integer', - "help"=>$clang->gT("If one of the subquestions is marked then for each marked subquestion this value is added as assessment."), - "caption"=>$clang->gT('Assessment value')); - - $qattributes["category_separator"]=array( - "types"=>"!", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Category separator'), - "caption"=>$clang->gT('Category separator')); - - $qattributes["display_columns"]=array( - "types"=>"LM", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'integer', - 'default'=>'1', - 'min'=>'1', - 'max'=>'100', - "help"=>$clang->gT('The answer options will be distributed across the number of columns set here'), - "caption"=>$clang->gT('Display columns')); - - $qattributes["display_rows"]=array( - "types"=>"QSTU", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('How many rows to display'), - "caption"=>$clang->gT('Display rows')); - - $qattributes["dropdown_dates"]=array( - "types"=>"D", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Use accessible dropdown boxes instead of calendar popup'), - "caption"=>$clang->gT('Display dropdown boxes')); - - $qattributes["dropdown_dates_year_min"]=array( - "types"=>"D", - 'category'=>$clang->gT('Display'), - 'sortorder'=>110, - 'inputtype'=>'text', - "help"=>$clang->gT('Minimum year value in calendar'), - "caption"=>$clang->gT('Minimum year')); - - $qattributes["dropdown_dates_year_max"]=array( - "types"=>"D", - 'category'=>$clang->gT('Display'), - 'sortorder'=>111, - 'inputtype'=>'text', - "help"=>$clang->gT('Maximum year value for calendar'), - "caption"=>$clang->gT('Maximum year')); - - $qattributes["dropdown_prepostfix"]=array( - "types"=>"1", - 'category'=>$clang->gT('Display'), - 'sortorder'=>112, - 'inputtype'=>'text', - "help"=>$clang->gT('Prefix|Suffix for dropdown lists'), - "caption"=>$clang->gT('Dropdown prefix/suffix')); - - $qattributes["dropdown_separators"]=array( - "types"=>"1", - 'category'=>$clang->gT('Display'), - 'sortorder'=>120, - 'inputtype'=>'text', - "help"=>$clang->gT('Post-Answer-Separator|Inter-Dropdownlist-Separator for dropdown lists'), - "caption"=>$clang->gT('Dropdown separator')); - - $qattributes["dualscale_headerA"]=array( - "types"=>"1", - 'category'=>$clang->gT('Display'), - 'sortorder'=>110, - 'inputtype'=>'text', - "help"=>$clang->gT('Enter a header text for the first scale'), - "caption"=>$clang->gT('Header for first scale')); - - $qattributes["dualscale_headerB"]=array( - "types"=>"1", - 'category'=>$clang->gT('Display'), - 'sortorder'=>111, - 'inputtype'=>'text', - "help"=>$clang->gT('Enter a header text for the second scale'), - "caption"=>$clang->gT('Header for second scale')); - - $qattributes["equals_num_value"]=array( - "types"=>"K", - 'category'=>$clang->gT('Input'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Multiple numeric inputs sum must equal this value'), - "caption"=>$clang->gT('Equals sum value')); - - $qattributes["em_validation_q"]=array( - "types"=>":;ABCEFKMNPQRSTU", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>200, - 'inputtype'=>'textarea', - "help"=>$clang->gT('Boolean equation to validate the whole question.'), - "caption"=>$clang->gT('Question validation equation')); - - $qattributes["em_validation_q_tip"]=array( - "types"=>":;ABCEFKMNPQRSTU", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>210, - 'inputtype'=>'textarea', - "help"=>$clang->gT('Tip to show user describing the question validation equation.'), - "caption"=>$clang->gT('Question validation tip')); - - $qattributes["em_validation_sq"]=array( - "types"=>";:KQSTUN", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>220, - 'inputtype'=>'textarea', - "help"=>$clang->gT('Boolean equation to validate each sub-question.'), - "caption"=>$clang->gT('Sub-question validation equation')); - - $qattributes["em_validation_sq_tip"]=array( - "types"=>";:KQSTUN", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>230, - 'inputtype'=>'textarea', - "help"=>$clang->gT('Tip to show user describing the sub-question validation equation.'), - "caption"=>$clang->gT('Sub-question validation tip')); - - $qattributes["exclude_all_others"]=array( - "types"=>":ABCEFMPKQ", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>130, - 'inputtype'=>'text', - "help"=>$clang->gT('Excludes all other options if a certain answer is selected - just enter the answer code(s) seperated with a semikolon.'), - "caption"=>$clang->gT('Exclusive option')); - - $qattributes["exclude_all_others_auto"]=array( - "types"=>"MP", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>131, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('If the participant marks all options, uncheck all and check the option set in the "Exclusive option" setting'), - "caption"=>$clang->gT('Auto-check exclusive option if all others are checked')); - - // Map Options - - $qattributes["location_city"]=array( - "types"=>"S", - 'readonly_when_active'=>true, - 'category'=>$clang->gT('Location'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('Yes'), - 1=>$clang->gT('No')), - "help"=>$clang->gT("Store the city?"), - "caption"=>$clang->gT("Save city")); - - $qattributes["location_state"]=array( - "types"=>"S", - 'readonly_when_active'=>true, - 'category'=>$clang->gT('Location'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('Yes'), - 1=>$clang->gT('No')), - "help"=>$clang->gT("Store the state?"), - "caption"=>$clang->gT("Save state")); - - $qattributes["location_postal"]=array( - "types"=>"S", - 'readonly_when_active'=>true, - 'category'=>$clang->gT('Location'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('Yes'), - 1=>$clang->gT('No')), - "help"=>$clang->gT("Store the postal code?"), - "caption"=>$clang->gT("Save postal code")); - - $qattributes["location_country"]=array( - "types"=>"S", - 'readonly_when_active'=>true, - 'category'=>$clang->gT('Location'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('Yes'), - 1=>$clang->gT('No')), - "help"=>$clang->gT("Store the country?"), - "caption"=>$clang->gT("Save country")); - - $qattributes["location_mapservice"]=array( - "types"=>"S", - 'category'=>$clang->gT('Location'), - 'sortorder'=>90, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('Off'), - 1=>$clang->gT('Google Maps')), - "help"=>$clang->gT("Activate this to show a map above the input field where the user can select a location"), - "caption"=>$clang->gT("Use mapping service")); - - $qattributes["location_mapwidth"]=array( - "types"=>"S", - 'category'=>$clang->gT('Location'), - 'sortorder'=>102, - 'inputtype'=>'text', - 'default'=>'500', - "help"=>$clang->gT("Width of the map in pixel"), - "caption"=>$clang->gT("Map width")); - - $qattributes["location_mapheight"]=array( - "types"=>"S", - 'category'=>$clang->gT('Location'), - 'sortorder'=>103, - 'inputtype'=>'text', - 'default'=>'300', - "help"=>$clang->gT("Height of the map in pixel"), - "caption"=>$clang->gT("Map height")); - - $qattributes["location_nodefaultfromip"]=array( - "types"=>"S", - 'category'=>$clang->gT('Location'), - 'sortorder'=>91, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('Yes'), - 1=>$clang->gT('No')), - "help"=>$clang->gT("Get the default location using the user's IP address?"), - "caption"=>$clang->gT("IP as default location")); - - $qattributes["location_defaultcoordinates"]=array( - "types"=>"S", - 'category'=>$clang->gT('Location'), - 'sortorder'=>101, - 'inputtype'=>'text', - "help"=>$clang->gT('Default coordinates of the map when the page first loads. Format: latitude [space] longtitude'), - "caption"=>$clang->gT('Default position')); - - $qattributes["location_mapzoom"]=array( - "types"=>"S", - 'category'=>$clang->gT('Location'), - 'sortorder'=>101, - 'inputtype'=>'text', - 'default'=>'11', - "help"=>$clang->gT("Map zoom level"), - "caption"=>$clang->gT("Zoom level")); - - // End Map Options - - $qattributes["hide_tip"]=array( - "types"=>"15ABCDEFGHIKLMNOPQRSTUXY!:;|", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Hide the tip that is normally shown with a question'), - "caption"=>$clang->gT('Hide tip')); - - $qattributes['hidden']=array( - 'types'=>'15ABCDEFGHIKLMNOPQRSTUXY!:;|*', - 'category'=>$clang->gT('Display'), - 'sortorder'=>101, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - 'help'=>$clang->gT('Hide this question at any time. This is useful for including data using answer prefilling.'), - 'caption'=>$clang->gT('Always hide this question')); - - $qattributes["max_answers"]=array( - "types"=>"MPR1:;ABCEFKQ", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>11, - 'inputtype'=>'integer', - "help"=>$clang->gT('Limit the number of possible answers'), - "caption"=>$clang->gT('Maximum answers')); - - $qattributes["max_num_value"]=array( - "types"=>"K", - 'category'=>$clang->gT('Input'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Maximum sum value of multiple numeric input'), - "caption"=>$clang->gT('Maximum sum value')); - - $qattributes["max_num_value_n"]=array( - "types"=>"NK", - 'category'=>$clang->gT('Input'), - 'sortorder'=>110, - 'inputtype'=>'integer', - "help"=>$clang->gT('Maximum value of the numeric input'), - "caption"=>$clang->gT('Maximum value')); - - $qattributes["maximum_chars"]=array( - "types"=>"STUNQK:;", - 'category'=>$clang->gT('Input'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Maximum characters allowed'), - "caption"=>$clang->gT('Maximum characters')); - - $qattributes["min_answers"]=array( - "types"=>"MPR1:;ABCEFKQ", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>10, - 'inputtype'=>'integer', - "help"=>$clang->gT('Ensure a minimum number of possible answers (0=No limit)'), - "caption"=>$clang->gT('Minimum answers')); - - $qattributes["min_num_value"]=array( - "types"=>"K", - 'category'=>$clang->gT('Input'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('The sum of the multiple numeric inputs must be greater than this value'), - "caption"=>$clang->gT('Minimum sum value')); - - $qattributes["min_num_value_n"]=array( - "types"=>"NK", - 'category'=>$clang->gT('Input'), - 'sortorder'=>100, - 'inputtype'=>'integer', - "help"=>$clang->gT('Minimum value of the numeric input'), - "caption"=>$clang->gT('Minimum value')); - - $qattributes["multiflexible_max"]=array( - "types"=>":", - 'category'=>$clang->gT('Display'), - 'sortorder'=>112, - 'inputtype'=>'text', - "help"=>$clang->gT('Maximum value for array(mult-flexible) question type'), - "caption"=>$clang->gT('Maximum value')); - - $qattributes["multiflexible_min"]=array( - "types"=>":", - 'category'=>$clang->gT('Display'), - 'sortorder'=>110, - 'inputtype'=>'text', - "help"=>$clang->gT('Minimum value for array(multi-flexible) question type'), - "caption"=>$clang->gT('Minimum value')); - - $qattributes["multiflexible_step"]=array( - "types"=>":", - 'category'=>$clang->gT('Display'), - 'sortorder'=>111, - 'inputtype'=>'text', - "help"=>$clang->gT('Step value'), - "caption"=>$clang->gT('Step value')); - - $qattributes["multiflexible_checkbox"]=array( - "types"=>":", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Use checkbox layout'), - "caption"=>$clang->gT('Checkbox layout')); - - $qattributes["reverse"]=array( - "types"=>"D:", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Present answer options in reverse order'), - "caption"=>$clang->gT('Reverse answer order')); - - $qattributes["num_value_int_only"]=array( - "types"=>"N", - 'category'=>$clang->gT('Input'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array( - 0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Restrict input to integer values'), - "caption"=>$clang->gT('Integer only')); - - $qattributes["numbers_only"]=array( - "types"=>"Q;S*", - 'category'=>$clang->gT('Other'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array( - 0=>$clang->gT('No'), - 1=>$clang->gT('Yes') - ), - 'default'=>0, - "help"=>$clang->gT('Allow only numerical input'), - "caption"=>$clang->gT('Numbers only') - ); - - $qattributes['show_totals'] = array( - 'types' => ';', - 'category' => $clang->gT('Other'), - 'sortorder' => 100, - 'inputtype' => 'singleselect', - 'options' => array( - 'X' => $clang->gT('Off'), - 'R' => $clang->gT('Rows'), - 'C' => $clang->gT('Columns'), - 'B' => $clang->gT('Both rows and columns') - ), - 'default' => 'X', - 'help' => $clang->gT('Show totals for either rows, columns or both rows and columns'), - 'caption' => $clang->gT('Show totals for') - ); - - $qattributes['show_grand_total'] = array( - 'types' => ';', - 'category' => $clang->gT('Other'), - 'sortorder' => 100, - 'inputtype' => 'singleselect', - 'options' => array( - 0 => $clang->gT('No'), - 1 => $clang->gT('Yes') - ), - 'default' => 0, - 'help' => $clang->gT('Show grand total for either columns or rows'), - 'caption' => $clang->gT('Show grand total') - ); - - $qattributes["input_boxes"]=array( - "types"=>":", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT("Present as text input boxes instead of dropdown lists"), - "caption"=>$clang->gT("Text inputs")); - - $qattributes["other_comment_mandatory"]=array( - "types"=>"PL!", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT("Make the 'Other:' comment field mandatory when the 'Other:' option is active"), - "caption"=>$clang->gT("'Other:' comment mandatory")); - - $qattributes["other_numbers_only"]=array( - "types"=>"LMP", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT("Allow only numerical input for 'Other' text"), - "caption"=>$clang->gT("Numbers only for 'Other'")); - - $qattributes["other_replace_text"]=array( - "types"=>"LMP!", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT("Replaces the label of the 'Other:' answer option with a custom text"), - "caption"=>$clang->gT("Label for 'Other:' option")); - - $qattributes["page_break"]=array( - "types"=>"15ABCDEFGHKLMNOPQRSTUXY!:;|*", - 'category'=>$clang->gT('Other'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Insert a page break before this question in printable view by setting this to Yes.'), - "caption"=>$clang->gT('Insert page break in printable view')); - - $qattributes["prefix"]=array( - "types"=>"KNQS", - 'category'=>$clang->gT('Display'), - 'sortorder'=>10, - 'inputtype'=>'text', - "help"=>$clang->gT('Add a prefix to the answer field'), - "caption"=>$clang->gT('Answer prefix')); - - $qattributes["public_statistics"]=array( - "types"=>"15ABCEFGHKLMNOPRY!:*", - 'category'=>$clang->gT('Other'), - 'sortorder'=>80, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Show statistics of this question in the public statistics page'), - "caption"=>$clang->gT('Show in public statistics')); - - $qattributes["random_order"]=array( - "types"=>"!ABCEFHKLMOPQR1:;", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Present answers in random order'), - "caption"=>$clang->gT('Random answer order')); - - $qattributes["slider_layout"]=array( - "types"=>"K", - 'category'=>$clang->gT('Slider'), - 'sortorder'=>1, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Use slider layout'), - "caption"=>$clang->gT('Use slider layout')); - - $qattributes["slider_min"]=array( - "types"=>"K", - 'category'=>$clang->gT('Slider'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Slider minimum value'), - "caption"=>$clang->gT('Slider minimum value')); - - $qattributes["slider_max"]=array( - "types"=>"K", - 'category'=>$clang->gT('Slider'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Slider maximum value'), - "caption"=>$clang->gT('Slider maximum value')); - - $qattributes["slider_accuracy"]=array( - "types"=>"K", - 'category'=>$clang->gT('Slider'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Slider accuracy'), - "caption"=>$clang->gT('Slider accuracy')); - - $qattributes["slider_default"]=array( - "types"=>"K", - 'category'=>$clang->gT('Slider'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Slider initial value'), - "caption"=>$clang->gT('Slider initial value')); - - $qattributes["slider_middlestart"]=array( - "types"=>"K", - 'category'=>$clang->gT('Slider'), - 'sortorder'=>10, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('The handle is displayed at the middle of the slider (this will not set the initial value)'), - "caption"=>$clang->gT('Slider starts at the middle position')); - - $qattributes["slider_rating"]=array( - "types"=>"5", - 'category'=>$clang->gT('Display'), - 'sortorder'=>90, - 'inputtype'=>'singleselect', - 'options'=>array( - 0=>$clang->gT('No'), - 1=>$clang->gT('Yes - stars'), - 2=>$clang->gT('Yes - slider with emoticon'), - ), - 'default'=>0, - "help"=>$clang->gT('Use slider layout'), - "caption"=>$clang->gT('Use slider layout')); - - - $qattributes["slider_showminmax"]=array( - "types"=>"K", - 'category'=>$clang->gT('Slider'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Display min and max value under the slider'), - "caption"=>$clang->gT('Display slider min and max value')); - - $qattributes["slider_separator"]=array( - "types"=>"K", - 'category'=>$clang->gT('Slider'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Answer|Left-slider-text|Right-slider-text separator character'), - "caption"=>$clang->gT('Slider left/right text separator')); - - $qattributes["suffix"]=array( - "types"=>"KNQS", - 'category'=>$clang->gT('Display'), - 'sortorder'=>11, - 'inputtype'=>'text', - "help"=>$clang->gT('Add a suffix to the answer field'), - "caption"=>$clang->gT('Answer suffix')); - - $qattributes["text_input_width"]=array( - "types"=>"KNSTUQ;", - 'category'=>$clang->gT('Display'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT('Width of text input box'), - "caption"=>$clang->gT('Input box width')); - - $qattributes["use_dropdown"]=array( - "types"=>"1F", - 'category'=>$clang->gT('Display'), - 'sortorder'=>112, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>0, - "help"=>$clang->gT('Use dropdown boxes instead of list of radio buttons'), - "caption"=>$clang->gT('Use dropdown boxes')); - - $qattributes["dropdown_size"]=array( - "types"=>"!", // TODO add these later? "1F", - 'category'=>$clang->gT('Display'), - 'sortorder'=>200, - 'inputtype'=>'text', - 'default'=>0, - "help"=>$clang->gT('For list dropdown boxes, show up to this many rows'), - "caption"=>$clang->gT('Height of dropdown')); - - $qattributes["dropdown_prefix"]=array( - "types"=>"!", // TODO add these later? "1F", - 'category'=>$clang->gT('Display'), - 'sortorder'=>201, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('None'), - 1=>$clang->gT('Order'), - ), - 'default'=>0, - "help"=>$clang->gT('Accelerator keys for list items'), - "caption"=>$clang->gT('Prefix for list items')); - - $qattributes["scale_export"]=array( - "types"=>"CEFGHLMOPY1!:*", - 'category'=>$clang->gT('Other'), - 'sortorder'=>100, - 'inputtype'=>'singleselect', - 'options'=>array(0=>$clang->gT('Default'), - 1=>$clang->gT('Nominal'), - 2=>$clang->gT('Ordinal'), - 3=>$clang->gT('Scale')), - 'default'=>0, - "help"=>$clang->gT("Set a specific SPSS export scale type for this question"), - "caption"=>$clang->gT('SPSS export scale type')); - - //Timer attributes - $qattributes["time_limit"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>90, - "inputtype"=>"integer", - "help"=>$clang->gT("Limit time to answer question (in seconds)"), - "caption"=>$clang->gT("Time limit")); - - $qattributes["time_limit_action"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>92, - 'inputtype'=>'singleselect', - 'options'=>array(1=>$clang->gT('Warn and move on'), - 2=>$clang->gT('Move on without warning'), - 3=>$clang->gT('Disable only')), - "help"=>$clang->gT("Action to perform when time limit is up"), - "caption"=>$clang->gT("Time limit action")); - - $qattributes["time_limit_disable_next"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>94, - "inputtype"=>"singleselect", - 'default'=>0, - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - "help"=>$clang->gT("Disable the next button until time limit expires"), - "caption"=>$clang->gT("Time limit disable next")); - - $qattributes["time_limit_disable_prev"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>96, - "inputtype"=>"singleselect", - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - "help"=>$clang->gT("Disable the prev button until the time limit expires"), - "caption"=>$clang->gT("Time limit disable prev")); - - $qattributes["time_limit_countdown_message"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>98, - "inputtype"=>"textarea", - "help"=>$clang->gT("The text message that displays in the countdown timer during the countdown"), - "caption"=>$clang->gT("Time limit countdown message")); - - $qattributes["time_limit_timer_style"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>100, - "inputtype"=>"textarea", - "help"=>$clang->gT("CSS Style for the message that displays in the countdown timer during the countdown"), - "caption"=>$clang->gT("Time limit timer CSS style")); - - $qattributes["time_limit_message_delay"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>102, - "inputtype"=>"integer", - "help"=>$clang->gT("Display the 'time limit expiry message' for this many seconds before performing the 'time limit action' (defaults to 1 second if left blank)"), - "caption"=>$clang->gT("Time limit expiry message display time")); - - $qattributes["time_limit_message"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>104, - "inputtype"=>"textarea", - "help"=>$clang->gT("The message to display when the time limit has expired (a default message will display if this setting is left blank)"), - "caption"=>$clang->gT("Time limit expiry message")); - - $qattributes["time_limit_message_style"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>106, - "inputtype"=>"textarea", - "help"=>$clang->gT("CSS style for the 'time limit expiry message'"), - "caption"=>$clang->gT("Time limit message CSS style")); - - $qattributes["time_limit_warning"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>108, - "inputtype"=>"integer", - "help"=>$clang->gT("Display a 'time limit warning' when there are this many seconds remaining in the countdown (warning will not display if left blank)"), - "caption"=>$clang->gT("1st time limit warning message timer")); - - $qattributes["time_limit_warning_display_time"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>110, - "inputtype"=>"integer", - "help"=>$clang->gT("The 'time limit warning' will stay visible for this many seconds (will not turn off if this setting is left blank)"), - "caption"=>$clang->gT("1st time limit warning message display time")); - - $qattributes["time_limit_warning_message"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>112, - "inputtype"=>"textarea", - "help"=>$clang->gT("The message to display as a 'time limit warning' (a default warning will display if this is left blank)"), - "caption"=>$clang->gT("1st time limit warning message")); - - $qattributes["time_limit_warning_style"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>114, - "inputtype"=>"textarea", - "help"=>$clang->gT("CSS style used when the 'time limit warning' message is displayed"), - "caption"=>$clang->gT("1st time limit warning CSS style")); - - $qattributes["time_limit_warning_2"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>116, - "inputtype"=>"integer", - "help"=>$clang->gT("Display the 2nd 'time limit warning' when there are this many seconds remaining in the countdown (warning will not display if left blank)"), - "caption"=>$clang->gT("2nd time limit warning message timer")); - - $qattributes["time_limit_warning_2_display_time"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>118, - "inputtype"=>"integer", - "help"=>$clang->gT("The 2nd 'time limit warning' will stay visible for this many seconds (will not turn off if this setting is left blank)"), - "caption"=>$clang->gT("2nd time limit warning message display time")); - - $qattributes["time_limit_warning_2_message"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>120, - "inputtype"=>"textarea", - "help"=>$clang->gT("The 2nd message to display as a 'time limit warning' (a default warning will display if this is left blank)"), - "caption"=>$clang->gT("2nd time limit warning message")); - - $qattributes["time_limit_warning_2_style"]=array( - "types"=>"STUX", - 'category'=>$clang->gT('Timer'), - 'sortorder'=>122, - "inputtype"=>"textarea", - "help"=>$clang->gT("CSS style used when the 2nd 'time limit warning' message is displayed"), - "caption"=>$clang->gT("2nd time limit warning CSS style")); - - $qattributes["show_title"]=array( - "types"=>"|", - 'category'=>$clang->gT('File metadata'), - 'sortorder'=>124, - "inputtype"=>"singleselect", - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>1, - "help"=>$clang->gT("Is the participant required to give a title to the uploaded file?"), - "caption"=>$clang->gT("Show title")); - - $qattributes["show_comment"]=array( - "types"=>"|", - 'category'=>$clang->gT('File metadata'), - 'sortorder'=>126, - "inputtype"=>"singleselect", - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>1, - "help"=>$clang->gT("Is the participant required to give a comment to the uploaded file?"), - "caption"=>$clang->gT("Show comment")); - - - $qattributes["max_filesize"]=array( - "types"=>"|", - 'category'=>$clang->gT('Other'), - 'sortorder'=>128, - "inputtype"=>"integer", - 'default'=>1024, - "help"=>$clang->gT("The participant cannot upload a single file larger than this size"), - "caption"=>$clang->gT("Maximum file size allowed (in KB)")); - - $qattributes["max_num_of_files"]=array( - "types"=>"|", - 'category'=>$clang->gT('Other'), - 'sortorder'=>130, - "inputtype"=>"text", - 'default'=>1, - "help"=>$clang->gT("Maximum number of files that the participant can upload for this question"), - "caption"=>$clang->gT("Max number of files")); - - $qattributes["min_num_of_files"]=array( - "types"=>"|", - 'category'=>$clang->gT('Other'), - 'sortorder'=>132, - "inputtype"=>"text", - 'default'=>0, - "help"=>$clang->gT("Minimum number of files that the participant must upload for this question"), - "caption"=>$clang->gT("Min number of files")); - - $qattributes["allowed_filetypes"]=array( - "types"=>"|", - 'category'=>$clang->gT('Other'), - 'sortorder'=>134, - 'inputtype'=>'text', - 'default'=>"png, gif, doc, odt", - "help"=>$clang->gT("Allowed file types in comma separated format. e.g. pdf,doc,odt"), - "caption"=>$clang->gT("Allowed file types")); - - $qattributes["random_group"]=array( - "types"=>"15ABCDEFGHIKLMNOPQRSTUXY!:;|", - 'category'=>$clang->gT('Logic'), - 'sortorder'=>100, - 'inputtype'=>'text', - "help"=>$clang->gT("Place questions into a specified randomization group, all questions included in the specified group will appear in a random order"), - "caption"=>$clang->gT("Randomization group name")); - - // This is added to support historical behavior. Early versions of 1.92 used a value of "No", so if there was a min_sum_value or equals_sum_value, the question was not valid - // unless those criteria were met. In later releases of 1.92, the default was changed so that missing values were allowed even if those attributes were set - // This attribute lets authors control whether missing values should be allowed in those cases without needing to set min_answers - // Existing surveys will use the old behavior, but if the author edits the question, the default will be the new behavior. - $qattributes["value_range_allows_missing"]=array( - "types"=>"K", - 'category'=>$clang->gT('Input'), - 'sortorder'=>100, - "inputtype"=>"singleselect", - 'options'=>array(0=>$clang->gT('No'), - 1=>$clang->gT('Yes')), - 'default'=>1, - "help"=>$clang->gT("Is no answer (missing) allowed when either 'Equals sum value' or 'Minimum sum value' are set?"), - "caption"=>$clang->gT("Value range allows missing")); - - //This builds a more useful array (don't modify) - if ($returnByName==false) - { - foreach($qattributes as $qname=>$qvalue) - { - for ($i=0; $i<=strlen($qvalue['types'])-1; $i++) - { - $qat[substr($qvalue['types'], $i, 1)][]=array("name"=>$qname, - "inputtype"=>$qvalue['inputtype'], - "category"=>$qvalue['category'], - "sortorder"=>$qvalue['sortorder'], - "readonly"=>isset($qvalue['readonly_when_active'])?$qvalue['readonly_when_active']:false, - "options"=>isset($qvalue['options'])?$qvalue['options']:'', - "default"=>isset($qvalue['default'])?$qvalue['default']:'', - "help"=>$qvalue['help'], - "caption"=>$qvalue['caption']); - } - } - return $qat; - } - else { - return $qattributes; - } -} - - -function CategorySort($a, $b) -{ - $result=strnatcasecmp($a['category'], $b['category']); - if ($result==0) - { - $result=$a['sortorder']-$b['sortorder']; - } - return $result; -} - -if (!function_exists('get_magic_quotes_gpc')) { - /** - * Gets the current configuration setting of magic_quotes_gpc - * NOTE: Compat variant for PHP 6+ versions - * - * @link http://www.php.net/manual/en/function.get-magic-quotes-gpc.php - * @return int 0 if magic_quotes_gpc is off, 1 otherwise. - */ - function get_magic_quotes_gpc() { - return 0; - } -} - -// make sure the given string (which comes from a POST or GET variable) -// is safe to use in MySQL. This does nothing if gpc_magic_quotes is on. -function auto_escape($str) { - global $connect; - if (!get_magic_quotes_gpc()) { - return $connect->escape($str); - } - return $str; -} -// the opposite of the above: takes a POST or GET variable which may or -// may not have been 'auto-quoted', and return the *unquoted* version. -// this is useful when the value is destined for a web page (eg) not -// a SQL query. -function auto_unescape($str) { - if (!isset($str)) {return null;}; - if (!get_magic_quotes_gpc()) { - return $str; - } - return stripslashes($str); -} -// make a string safe to include in an HTML 'value' attribute. -function html_escape($str) { - // escape newline characters, too, in case we put a value from - // a TEXTAREA into an value attribute. - return str_replace(array("\x0A","\x0D"),array(" "," "), - htmlspecialchars( $str, ENT_QUOTES )); -} - -// make a string safe to include in a JavaScript String parameter. -function javascript_escape($str, $strip_tags=false, $htmldecode=false) { - $new_str =''; - - if ($htmldecode==true) { - $str=html_entity_decode($str,ENT_QUOTES,'UTF-8'); - } - if ($strip_tags==true) - { - $str=strip_tags($str); - } - return str_replace(array('\'','"', "\n", "\r"), - array("\\'",'\u0022', "\\n",'\r'), - $str); -} - -// This function returns the header as result string -// If you want to echo the header use doHeader() ! -function getHeader($meta = false) -{ - global $embedded, $surveyid, $rooturl, $defaultlang, $js_header_includes, $css_header_includes; - - $js_header_includes = array_unique($js_header_includes); - $css_header_includes = array_unique($css_header_includes); - - $interviewer=returnglobal('interviewer'); - if (!empty($interviewer) || (isset($_SESSION['interviewer']) && $_SESSION['interviewer'] == true)) - { - $interviewer = true; - $_SESSION['interviewer'] = true; - } - else - { - $interviewer = false; - } - - if ($interviewer) - { - $js_header_includes[] = '/../../js/popup.js'; //queXS Addition - include_once("quexs.php"); - if (AUTO_LOGOUT_MINUTES !== false) - { - $js_header_includes[] = $rooturl . "/../../js/childnap.js"; //queXS Addition - } - } - - if (isset($_SESSION['s_lang']) && $_SESSION['s_lang']) - { - $surveylanguage= $_SESSION['s_lang']; - } - elseif (isset($surveyid) && $surveyid) - { - $surveylanguage=GetBaseLanguageFromSurveyID($surveyid); - } - else - { - $surveylanguage=$defaultlang; - } - - $js_header = ''; $css_header=''; - foreach ($js_header_includes as $jsinclude) - { - if (substr($jsinclude,0,4) == 'http') - $js_header .= "\n"; - else - $js_header .= "\n"; - } - - foreach ($css_header_includes as $cssinclude) - { - $css_header .= "\n"; - } - - - - $header= "\n" - . "\n" - . "\n" - . "\n" - . "" - . "" - . $js_header; - - if ($meta) - $header .= $meta; - - if ( !$embedded ) - { - return $header; - } - else - { - global $embedded_headerfunc; - if ( function_exists( $embedded_headerfunc ) ) - return $embedded_headerfunc($header); - } -} - -function doHeader() -{ - echo getHeader(); -} - -function doAdminFooter() -{ - echo getAdminFooter(); -} - -function getAdminFooter($url, $explanation) -{ - global $js_admin_includes, $homeurl; - global $versionnumber, $buildnumber, $setfont, $imageurl, $clang; - - if ($buildnumber != "") - { - $buildtext="Build $buildnumber"; - } - else - { - $buildtext=""; - } - - //If user is not logged in, don't print the version number information in the footer. - $versiontitle=$clang->gT('Version'); - if(!isset($_SESSION['loginID'])) - { - $versionnumber=""; - $buildtext=""; - $versiontitle=""; - } - - $strHTMLFooter = "\n"; - $js_admin_includes = array_unique($js_admin_includes); - foreach ($js_admin_includes as $jsinclude) - { - $strHTMLFooter .= "\n"; - } - - $strHTMLFooter.="\n"; - return $strHTMLFooter; -} - - - - -/** -* This function returns the header for the printable survey -* @return String -* -*/ -function getPrintableHeader() -{ - global $rooturl,$homeurl; - $headelements = ' - - - - '; - return $headelements; -} - - - -// This function returns the Footer as result string -// If you want to echo the Footer use doFooter() ! -function getFooter() -{ - global $embedded; - - if ( !$embedded ) - { - return "\n\n\t\n\n"; - } - else - { - global $embedded_footerfunc; - if ( function_exists( $embedded_footerfunc ) ) - return $embedded_footerfunc(); - } -} - - -function doFooter() -{ - echo getFooter(); -} - - - -// This function replaces field names in a text with the related values -// (e.g. for email and template functions) -function ReplaceFields ($text,$fieldsarray, $bReplaceInsertans=true, $staticReplace=true) -{ - - if ($bReplaceInsertans) - { - $replacements = array(); - foreach ( $fieldsarray as $key => $value ) - { - $replacements[substr($key,1,-1)] = $value; - } - $text = LimeExpressionManager::ProcessString($text, NULL, $replacements, false, 2, 1, false, false, $staticReplace); - } - else - { - foreach ( $fieldsarray as $key => $value ) - { - $text=str_replace($key, $value, $text); - } - } - return $text; -} - - -/** -* This function mails a text $body to the recipient $to. -* You can use more than one recipient when using a semikolon separated string with recipients. -* If you send several emails at once please supply an email object so that it can be re-used over and over. Especially with SMTP connections this speeds up things by 200%. -* If you supply an email object Do not forget to close the mail connection by calling $mail->SMTPClose(); -* -* @param mixed $mail This is an PHPMailer object. If null, one will be created automatically and unset afterwards. If supplied it won't be unset. -* @param string $body Body text of the email in plain text or HTML -* @param mixed $subject Email subject -* @param mixed $to Array with several email addresses or single string with one email address -* @param mixed $from -* @param mixed $sitename -* @param mixed $ishtml -* @param mixed $bouncemail -* @param mixed $attachment -* @return bool If successful returns true -*/ -function SendEmailMessage($mail, $body, $subject, $to, $from, $sitename, $ishtml=false, $bouncemail=null, $attachment=null, $customheaders="") -{ - - global $emailmethod, $emailsmtphost, $emailsmtpuser, $emailsmtppassword, $defaultlang, $emailsmtpdebug; - global $rootdir, $maildebug, $maildebugbody, $emailsmtpssl, $clang, $demoModeOnly, $emailcharset; - if (!is_array($to)){ - $to=array($to); - } - if (!is_array($customheaders) && $customheaders == '') - { - $customheaders=array(); - } - if ($demoModeOnly==true) - { - $maildebug=$clang->gT('Email was not sent because demo-mode is activated.'); - $maildebugbody=''; - return false; - } - - if (is_null($bouncemail) ) - { - $sender=$from; - } - else - { - $sender=$bouncemail; - } - $bUnsetEmail=false; - if (is_null($mail)) - { - $bUnsetEmail=true; - $mail = new PHPMailer; - } - else - { - $mail->SMTPKeepAlive=true; - } - - if (!$mail->SetLanguage($defaultlang,$rootdir.'/classes/phpmailer/language/')) - { - $mail->SetLanguage('en',$rootdir.'/classes/phpmailer/language/'); - } - $mail->CharSet = $emailcharset; - if (isset($emailsmtpssl) && trim($emailsmtpssl)!=='' && $emailsmtpssl!==0) { - if ($emailsmtpssl===1) {$mail->SMTPSecure = "ssl";} - else {$mail->SMTPSecure = $emailsmtpssl;} - } - - $fromname=''; - $fromemail=$from; - if (strpos($from,'<')) - { - $fromemail=substr($from,strpos($from,'<')+1,strpos($from,'>')-1-strpos($from,'<')); - $fromname=trim(substr($from,0, strpos($from,'<')-1)); - } - - $sendername=''; - $senderemail=$sender; - if (strpos($sender,'<')) - { - $senderemail=substr($sender,strpos($sender,'<')+1,strpos($sender,'>')-1-strpos($sender,'<')); - $sendername=trim(substr($sender,0, strpos($sender,'<')-1)); - } - - switch ($emailmethod) { - case "qmail": - $mail->IsQmail(); - break; - case "smtp": - $mail->IsSMTP(); - if ($emailsmtpdebug>0) - { - $mail->SMTPDebug = $emailsmtpdebug; - } - if (strpos($emailsmtphost,':')>0) - { - $mail->Host = substr($emailsmtphost,0,strpos($emailsmtphost,':')); - $mail->Port = substr($emailsmtphost,strpos($emailsmtphost,':')+1); - } - else { - $mail->Host = $emailsmtphost; - } - $mail->Username =$emailsmtpuser; - $mail->Password =$emailsmtppassword; - if (trim($emailsmtpuser)!="") - { - $mail->SMTPAuth = true; - } - break; - case "sendmail": - $mail->IsSendmail(); - break; - default: - //Set to the default value to rule out incorrect settings. - $emailmethod="mail"; - $mail->IsMail(); - } - - $mail->SetFrom($fromemail, $fromname); - $mail->Sender = $senderemail; // Sets Return-Path for error notifications - foreach ($to as $singletoemail) - { - if (strpos($singletoemail, '<') ) - { - $toemail=substr($singletoemail,strpos($singletoemail,'<')+1,strpos($singletoemail,'>')-1-strpos($singletoemail,'<')); - $toname=trim(substr($singletoemail,0, strpos($singletoemail,'<')-1)); - $mail->AddAddress($toemail,$toname); - } - else - { - $mail->AddAddress($singletoemail); - } - } - if (is_array($customheaders)) - { - foreach ($customheaders as $key=>$val) { - $mail->AddCustomHeader($val); - } - } - $mail->AddCustomHeader("X-Surveymailer: $sitename Emailer (LimeSurvey.sourceforge.net)"); - if (get_magic_quotes_gpc() != "0") {$body = stripcslashes($body);} - if ($ishtml) { - $mail->IsHTML(true); - $mail->Body = $body; - $mail->AltBody = trim(strip_tags(html_entity_decode($body,ENT_QUOTES,'UTF-8'))); - } else - { - $mail->IsHTML(false); - $mail->Body = $body; - } - - // add the attachment if there is one - if(!is_null($attachment)) - $mail->AddAttachment($attachment); - - if (trim($subject)!='') {$mail->Subject = "=?$emailcharset?B?" . base64_encode($subject) . "?=";} - if ($emailsmtpdebug>0) { - ob_start(); - } - $sent=$mail->Send(); - $maildebug=$mail->ErrorInfo; - if ($emailsmtpdebug>0) { - $maildebug .= '
    • '.$clang->gT('SMTP debug output:').'
    • '.strip_tags(ob_get_contents()).'
      '; - ob_end_clean(); - } - $maildebugbody=$mail->Body; - $mail->ClearAddresses(); - $mail->ClearCustomHeaders(); - if ($bUnsetEmail) - { - unset($mail); - } - return $sent; -} - - - -/** -* This functions removes all HTML tags, Javascript, CRs, linefeeds and other strange chars from a given text -* -* @param string $sTextToFlatten Text you want to clean -* @param boolan $bDecodeHTMLEntities If set to true then all HTML entities will be decoded to the specified charset. Default: false -* @param string $sCharset Charset to decode to if $decodeHTMLEntities is set to true -* -* @return string Cleaned text -*/ -function FlattenText($sTextToFlatten, $bDecodeHTMLEntities=false, $sCharset='UTF-8', $bStripNewLines=true, $keepSpan=false) -{ - $sNicetext = strip_javascript($sTextToFlatten); - // When stripping tags, add a space before closing tags so that strings with embedded HTML tables don't get concatenated - $sNicetext = str_replace(' so can show EM syntax-highlighting; add space before tags so that word-wrapping not destroyed when remove tags. - $sNicetext = strip_tags($sNicetext,' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      '); - } - else { - $sNicetext = strip_tags($sNicetext); - } - if ($bStripNewLines ){ // strip new lines - $sNicetext = preg_replace(array('~\Ru~'),array(' '), $sNicetext); - } - else // unify newlines to \r\n - { - $sNicetext = preg_replace(array('~\Ru~'), array("\r\n"), $sNicetext); - } - if ($bDecodeHTMLEntities==true) - { - $sNicetext = str_replace(' ',' ', $sNicetext); // html_entity_decode does not convert   to spaces - $sNicetext = html_entity_decode($sNicetext, ENT_QUOTES, $sCharset); - } - $sNicetext = trim($sNicetext); - return $sNicetext; -} - -/** -* getGroupsByQuestion($surveyid) -* @global string $surveyid -* @return returns a keyed array of groups to questions ie: array([1]=>[2]) question qid 1, is in group gid 2. -*/ -function getGroupsByQuestion($surveyid) { - global $surveyid, $dbprefix; - - $output=array(); - - $surveyid=sanitize_int($surveyid); - $query="SELECT qid, gid FROM ".db_table_name('questions')." WHERE sid='$surveyid'"; - $result = db_execute_assoc($query); - while ($val = $result->FetchRow()) - { - $output[$val['qid']]=$val['gid']; - } - return $output; -} - -/** -* Run an arbitrary sequence of semicolon-delimited SQL commands -* -* Assumes that the input text (file or string) consists of -* a number of SQL statements ENDING WITH SEMICOLONS. The -* semicolons MUST be the last character in a line. -* Lines that are blank or that start with "#" or "--" (postgres) are ignored. -* Only tested with mysql dump files (mysqldump -p -d limesurvey) -* Function kindly borrowed by Moodle -* @uses $dbprefix -* @param string $sqlfile The path where a file with sql commands can be found on the server. -* @param string $sqlstring If no path is supplied then a string with semicolon delimited sql -* commands can be supplied in this argument. -* @return bool Returns true if database was modified successfully. -*/ -function modify_database($sqlfile='', $sqlstring='') -{ - global $dbprefix; - global $defaultuser; - global $defaultpass; - global $siteadminemail; - global $siteadminname; - global $defaultlang; - global $codeString; - global $rootdir, $homedir; - global $connect; - global $clang; - global $modifyoutput; - global $databasetabletype; - - require_once($homedir."/classes/core/sha256.php"); - - $success = true; // Let's be optimistic - $modifyoutput=''; - - if (!empty($sqlfile)) { - if (!is_readable($sqlfile)) { - $success = false; - echo '

      Tried to modify database, but "'. $sqlfile .'" doesn\'t exist!

      '; - return $success; - } else { - $lines = file($sqlfile); - } - } else { - $sqlstring = trim($sqlstring); - if ($sqlstring{strlen($sqlstring)-1} != ";") { - $sqlstring .= ";"; // add it in if it's not there. - } - $lines[] = $sqlstring; - } - - $command = ''; - - foreach ($lines as $line) { - $line = rtrim($line); - $length = strlen($line); - - if ($length and $line[0] <> '#' and substr($line,0,2) <> '--') { - if (substr($line, $length-1, 1) == ';') { - $line = substr($line, 0, $length-1); // strip ; - $command .= $line; - $command = str_replace('prefix_', $dbprefix, $command); // Table prefixes - $command = str_replace('$defaultuser', $defaultuser, $command); - $command = str_replace('$defaultpass', SHA256::hashing($defaultpass), $command); - $command = str_replace('$siteadminname', $siteadminname, $command); - $command = str_replace('$siteadminemail', $siteadminemail, $command); - $command = str_replace('$defaultlang', $defaultlang, $command); - $command = str_replace('$sessionname', 'ls'.sRandomChars(20,'123456789'), $command); - $command = str_replace('$databasetabletype', $databasetabletype, $command); - - if (! db_execute_num($command)) { //Checked - $command=htmlspecialchars($command); - $modifyoutput .="
      ".sprintf($clang->gT("SQL command failed: %s Reason: %s"),"".$command."","".$connect->ErrorMsg()."
      "); - $success = false; - } - else - { - $command=htmlspecialchars($command); - $modifyoutput .=". "; - } - - $command = ''; - } else { - $command .= $line; - } - } - } - - return $success; - -} - - - -// unsets all Session variables to kill session -function killSession() //added by Dennis -{ - // Delete the Session Cookie - $CookieInfo = session_get_cookie_params(); - if ( (empty($CookieInfo['domain'])) && (empty($CookieInfo['secure'])) ) { - setcookie(session_name(), '', time()-3600, $CookieInfo['path']); - } elseif (empty($CookieInfo['secure'])) { - setcookie(session_name(), '', time()-3600, $CookieInfo['path'], $CookieInfo['domain']); - } else { - setcookie(session_name(), '', time()-3600, $CookieInfo['path'], $CookieInfo['domain'], $CookieInfo['secure']); - } - unset($_COOKIE[session_name()]); - foreach ($_SESSION as $key =>$value) - { - //echo $key." = ".$value."
      "; - unset($_SESSION[$key]); - } - $_SESSION = array(); // redundant with previous lines - session_unset(); - @session_destroy(); -} - - - - - - - -// set the rights of a user and his children -function setuserrights($uid, $rights) -{ - global $connect; - $uid=sanitize_int($uid); - $updates = "create_survey=".$rights['create_survey'] - . ", create_user=".$rights['create_user'] - . ", delete_user=".$rights['delete_user'] - . ", superadmin=".$rights['superadmin'] - . ", configurator=".$rights['configurator'] - . ", manage_template=".$rights['manage_template'] - . ", manage_label=".$rights['manage_label']; - $uquery = "UPDATE ".db_table_name('users')." SET ".$updates." WHERE uid = ".$uid; - return $connect->Execute($uquery); //Checked -} - - -function createPassword() -{ - $pwchars = "abcdefhjmnpqrstuvwxyz23456789"; - $password_length = 8; - $passwd = ''; - - for ($i=0; $i<$password_length; $i++) - { - $passwd .= $pwchars[(int)floor(rand(0,strlen($pwchars)-1))]; - } - return $passwd; -} - -function getgroupuserlist() -{ - global $ugid, $dbprefix, $scriptname, $connect, $clang; - - $ugid=sanitize_int($ugid); - $surveyidquery = "SELECT a.uid, a.users_name FROM ".db_table_name('users')." AS a LEFT JOIN (SELECT uid AS id FROM ".db_table_name('user_in_groups')." WHERE ugid = {$ugid}) AS b ON a.uid = b.id WHERE id IS NULL ORDER BY a.users_name"; - - $surveyidresult = db_execute_assoc($surveyidquery); //Checked - if (!$surveyidresult) {return "Database Error";} - $surveyselecter = ""; - $surveynames = $surveyidresult->GetRows(); - if ($surveynames) - { - foreach($surveynames as $sv) - { - $surveyselecter .= "gT("Please choose...")."\n".$surveyselecter; - return $surveyselecter; -} - -/** -* Retrieve a HTML \n".$surveyselecter;} - else {$surveyselecter = "\n".$surveyselecter;} - return $surveyselecter; -} - -function getsurveyusergrouplist($outputformat='htmloptions') -{ - global $surveyid, $dbprefix, $scriptname, $connect, $clang, $usercontrolSameGroupPolicy; - $surveyid=sanitize_int($surveyid); - - $surveyidquery = "SELECT a.ugid, a.name, MAX(d.ugid) AS da FROM ".db_table_name('user_groups')." AS a LEFT JOIN (SELECT b.ugid FROM ".db_table_name('user_in_groups')." AS b LEFT JOIN (SELECT * FROM ".db_table_name('survey_permissions')." WHERE sid = {$surveyid}) AS c ON b.uid = c.uid WHERE c.uid IS NULL) AS d ON a.ugid = d.ugid GROUP BY a.ugid, a.name HAVING MAX(d.ugid) IS NOT NULL"; - $surveyidresult = db_execute_assoc($surveyidquery); //Checked - if (!$surveyidresult) {return "Database Error";} - $surveyselecter = ""; - $surveynames = $surveyidresult->GetRows(); - - if (isset($usercontrolSameGroupPolicy) && - $usercontrolSameGroupPolicy == true) - { - $authorizedGroupsList=getusergrouplist('simplegidarray'); - } - - if ($surveynames) - { - foreach($surveynames as $sv) - { - if (!isset($usercontrolSameGroupPolicy) || - $usercontrolSameGroupPolicy == false || - in_array($sv['ugid'],$authorizedGroupsList)) - { - $surveyselecter .= "gT("Please choose...")."\n".$surveyselecter;} - else {$surveyselecter = "\n".$surveyselecter;} - - if ($outputformat == 'simpleugidarray') - { - return $simpleugidarray; - } - else - { - return $surveyselecter; - } -} - -function getusergrouplist($outputformat='optionlist') -{ - global $dbprefix, $scriptname, $connect, $clang; - - //$squery = "SELECT ugid, name FROM ".db_table_name('user_groups') ." WHERE owner_id = {$_SESSION['loginID']} ORDER BY name"; - $squery = "SELECT a.ugid, a.name, a.owner_id, b.uid FROM ".db_table_name('user_groups') ." AS a LEFT JOIN ".db_table_name('user_in_groups') ." AS b ON a.ugid = b.ugid WHERE uid = {$_SESSION['loginID']} ORDER BY name"; - - $sresult = db_execute_assoc($squery); //Checked - if (!$sresult) {return "Database Error";} - $selecter = ""; - $groupnames = $sresult->GetRows(); - $simplegidarray=array(); - if ($groupnames) - { - foreach($groupnames as $gn) - { - $selecter .= "\n".$selecter;} - //else {$selecter = "\n".$selecter;} - - if ($outputformat == 'simplegidarray') - { - return $simplegidarray; - } - else - { - return $selecter; - } -} - - -function languageDropdown($surveyid,$selected) -{ - global $homeurl; - $slangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($slangs,$baselang); - $html = ""; - return $html; -} - -function languageDropdownClean($surveyid,$selected) -{ - $slangs = GetAdditionalLanguagesFromSurveyID($surveyid); - $baselang = GetBaseLanguageFromSurveyID($surveyid); - array_unshift($slangs,$baselang); - $html = ""; - return $html; -} - -function BuildCSVFromQuery($Query) -{ - global $dbprefix, $connect; - $QueryResult = db_execute_assoc($Query) or safe_die ("ERROR: $QueryResult
      ".$connect->ErrorMsg()); //safe - preg_match('/FROM (\w+)( |,)/i', $Query, $MatchResults); - $TableName = $MatchResults[1];; - if ($dbprefix) - { - $TableName = substr($TableName, strlen($dbprefix), strlen($TableName)); - } - $Output = "\n#\n# " . strtoupper($TableName) . " TABLE\n#\n"; - $HeaderDone = false; $ColumnNames = ""; - while ($Row = $QueryResult->FetchRow()) - { - - if (!$HeaderDone) - { - foreach ($Row as $Key=>$Value) - { - $ColumnNames .= CSVEscape($Key).","; //Add all the column names together - } - $ColumnNames = substr($ColumnNames, 0, -1); //strip off last comma space - $Output .= "$ColumnNames\n"; - $HeaderDone=true; - } - $ColumnValues = ""; - foreach ($Row as $Key=>$Value) - { - $Value=str_replace("\r\n", "\n", $Value); - $Value=str_replace("\r", "\n", $Value); - $ColumnValues .= CSVEscape($Value) . ","; - } - $ColumnValues = substr($ColumnValues, 0, -1); //strip off last comma space - $Output .= str_replace("\n","\\n","$ColumnValues")."\n"; - } - return $Output; -} - -function CSVEscape($str) -{ - $str= str_replace('\n','\%n',$str); - return '"' . str_replace('"','""', $str) . '"'; -} - -function convertCSVRowToArray($string, $seperator, $quotechar) -{ - $fields=preg_split('/' . $seperator . '(?=([^"]*"[^"]*")*(?![^"]*"))/',trim($string)); - $fields=array_map('CSVUnquote',$fields); - return $fields; -} - - -/** -* This function removes surrounding and masking quotes from the CSV field -* -* @param mixed $field -* @return mixed -*/ -function CSVUnquote($field) -{ - //print $field.":"; - $field = preg_replace ("/^\040*\"/", "", $field); - $field = preg_replace ("/\"\040*$/", "", $field); - $field= str_replace('""','"',$field); - //print $field."\n"; - return $field; -} - -/** -* CleanLanguagesFromSurvey() removes any languages from survey tables that are not in the passed list -* @param string $sid - the currently selected survey -* @param string $availlangs - space seperated list of additional languages in survey -* @return bool - always returns true -*/ -function CleanLanguagesFromSurvey($sid, $availlangs) -{ - global $connect; - $sid=sanitize_int($sid); - $baselang = GetBaseLanguageFromSurveyID($sid); - - if (!empty($availlangs) && $availlangs != " ") - { - $availlangs=sanitize_languagecodeS($availlangs); - $langs = explode(" ",$availlangs); - if($langs[count($langs)-1] == "") array_pop($langs); - } - - $sqllang = "language <> '".$baselang."' ";; - - if (!empty($availlangs) && $availlangs != " ") - { - foreach ($langs as $lang) - { - $sqllang .= "and language <> '".$lang."' "; - } - } - - // Remove From Answers Table - $query = "SELECT qid FROM ".db_table_name('questions')." WHERE sid='{$sid}' and ($sqllang)"; - $qidresult = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - while ($qrow = $qidresult->FetchRow()) - { - $myqid = $qrow['qid']; - $query = "DELETE FROM ".db_table_name('answers')." WHERE qid='$myqid' and ($sqllang)"; - $connect->Execute($query) or safe_die($connect->ErrorMsg()); //Checked - } - - // Remove From Questions Table - $query = "DELETE FROM ".db_table_name('questions')." WHERE sid='{$sid}' and ($sqllang)"; - $connect->Execute($query) or safe_die($connect->ErrorMsg()); //Checked - - // Remove From Groups Table - $query = "DELETE FROM ".db_table_name('groups')." WHERE sid='{$sid}' and ($sqllang)"; - $connect->Execute($query) or safe_die($connect->ErrorMsg()); //Checked - - return true; -} - -/** -* FixLanguageConsistency() fixes missing groups,questions,answers & assessments for languages on a survey -* @param string $sid - the currently selected survey -* @param string $availlangs - space seperated list of additional languages in survey - if empty all additional languages of a survey are checked against the base language -* @return bool - always returns true -*/ -function FixLanguageConsistency($sid, $availlangs='') -{ - global $connect, $databasetype; - - if (trim($availlangs)!='') - { - $availlangs=sanitize_languagecodeS($availlangs); - $langs = explode(" ",$availlangs); - if($langs[count($langs)-1] == "") array_pop($langs); - } else { - $langs=GetAdditionalLanguagesFromSurveyID($sid); - } - - $baselang = GetBaseLanguageFromSurveyID($sid); - $sid=sanitize_int($sid); - - $query = "SELECT * FROM ".db_table_name('quota_languagesettings')." join ".db_table_name('quota')." q on quotals_quota_id=q.id WHERE q.sid='{$sid}' AND quotals_language='{$baselang}'"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); - if ($result->RecordCount() > 0) - { - while ($qls = $result->FetchRow()) - { - foreach ($langs as $lang) - { - $query = "SELECT quotals_id FROM ".db_table_name('quota_languagesettings')." WHERE quotals_quota_id='{$qls['quotals_quota_id']}' AND quotals_language='{$lang}'"; - $gresult = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($gresult->RecordCount() < 1) - { - $query = "INSERT INTO ".db_table_name('quota_languagesettings') - ." (quotals_quota_id,quotals_language,quotals_name,quotals_message,quotals_url,quotals_urldescrip) VALUES (" - . "'".$qls['quotals_quota_id']."'," - . "'".$lang."'," - . db_quoteall($qls['quotals_name'])."," - . db_quoteall($qls['quotals_message'])."," - . "'".$qls['quotals_url']."'," - . db_quoteall($qls['quotals_urldescrip'])."" - . ")"; - $connect->Execute($query) or safe_die($connect->ErrorMsg()); //Checked - db_switchIDInsert('quota_languagesettings',false); - } - } - reset($langs); - } - } - - $query = "SELECT * FROM ".db_table_name('groups')." WHERE sid='{$sid}' AND language='{$baselang}' ORDER BY group_order"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($result->RecordCount() > 0) - { - while($group = $result->FetchRow()) - { - foreach ($langs as $lang) - { - $query = "SELECT gid FROM ".db_table_name('groups')." WHERE sid='{$sid}' AND gid='{$group['gid']}' AND language='{$lang}'"; - $gresult = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($gresult->RecordCount() < 1) - { - db_switchIDInsert('groups',true); - $query = "INSERT INTO ".db_table_name('groups')." (gid,sid,group_name,group_order,description,grelevance,language) VALUES('{$group['gid']}','{$group['sid']}',".db_quoteall($group['group_name']).",'{$group['group_order']}',".db_quoteall($group['description']).",'".db_quote($group['grelevance'])."','{$lang}')"; - $connect->Execute($query) or safe_die($connect->ErrorMsg()); //Checked - db_switchIDInsert('groups',false); - } - } - reset($langs); - } - } - - $quests = array(); - $query = "SELECT * FROM ".db_table_name('questions')." WHERE sid='{$sid}' AND language='{$baselang}' ORDER BY question_order"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($result->RecordCount() > 0) - { - while($question = $result->FetchRow()) - { - array_push($quests,$question['qid']); - foreach ($langs as $lang) - { - $query = "SELECT qid FROM ".db_table_name('questions')." WHERE sid='{$sid}' AND qid='{$question['qid']}' AND language='{$lang}' AND scale_id={$question['scale_id']}"; - $gresult = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($gresult->RecordCount() < 1) - { - db_switchIDInsert('questions',true); - $query = "INSERT INTO ".db_table_name('questions')." (qid,sid,gid,type,title,question,preg,help,other,mandatory,question_order,language, scale_id,parent_qid, relevance) VALUES('{$question['qid']}','{$question['sid']}','{$question['gid']}','{$question['type']}',".db_quoteall($question['title']).",".db_quoteall($question['question']).",".db_quoteall($question['preg']).",".db_quoteall($question['help']).",'{$question['other']}','{$question['mandatory']}','{$question['question_order']}','{$lang}',{$question['scale_id']},{$question['parent_qid']}, '{$question['relevance']}')"; - $connect->Execute($query) or safe_die($query."
      ".$connect->ErrorMsg()); //Checked - db_switchIDInsert('questions',false); - } - } - reset($langs); - } - - $sqlans = ""; - foreach ($quests as $quest) - { - $sqlans .= " OR qid = '".$quest."' "; - } - - $query = "SELECT * FROM ".db_table_name('answers')." WHERE language='{$baselang}' and (".trim($sqlans,' OR').") ORDER BY qid, code"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($result->RecordCount() > 0) - { - while($answer = $result->FetchRow()) - { - foreach ($langs as $lang) - { - $query = "SELECT qid FROM ".db_table_name('answers')." WHERE code='{$answer['code']}' AND qid='{$answer['qid']}' AND language='{$lang}' AND scale_id={$answer['scale_id']}"; - $gresult = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($gresult->RecordCount() < 1) - { - db_switchIDInsert('answers',true); - $query = "INSERT INTO ".db_table_name('answers')." (qid,code,answer,scale_id,sortorder,language,assessment_value) VALUES('{$answer['qid']}',".db_quoteall($answer['code']).",".db_quoteall($answer['answer']).",{$answer['scale_id']},'{$answer['sortorder']}','{$lang}',{$answer['assessment_value']})"; - $connect->Execute($query) or safe_die($connect->ErrorMsg()); //Checked - db_switchIDInsert('answers',false); - } - } - reset($langs); - } - } - } - - - $query = "SELECT * FROM ".db_table_name('assessments')." WHERE sid='{$sid}' AND language='{$baselang}'"; - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($result->RecordCount() > 0) - { - while($assessment = $result->FetchRow()) - { - foreach ($langs as $lang) - { - $query = "SELECT id FROM ".db_table_name('assessments')." WHERE sid='{$sid}' AND id='{$assessment['id']}' AND language='{$lang}'"; - $gresult = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - if ($gresult->RecordCount() < 1) - { - db_switchIDInsert('assessments',true); - $query = "INSERT INTO ".db_table_name('assessments')." (id,sid,scope,gid,name,minimum,maximum,message,language) " - ."VALUES('{$assessment['id']}','{$assessment['sid']}',".db_quoteall($assessment['scope']).",".db_quoteall($assessment['gid']).",".db_quoteall($assessment['name']).",".db_quoteall($assessment['minimum']).",".db_quoteall($assessment['maximum']).",".db_quoteall($assessment['message']).",'{$lang}')"; - $connect->Execute($query) or safe_die($connect->ErrorMsg()); //Checked - db_switchIDInsert('assessments',false); - } - } - reset($langs); - } - } - - - - return true; -} - -function incompleteAnsFilterstate() -{ - global $filterout_incomplete_answers; - $letsfilter=''; - $letsfilter = returnglobal('filterinc'); //read get/post filterinc - - // first let's initialize the incompleteanswers session variable - if ($letsfilter != '') - { // use the read value if not empty - $_SESSION['incompleteanswers']=$letsfilter; - } - elseif (!isset($_SESSION['incompleteanswers'])) - { // sets default variable value from config file - $_SESSION['incompleteanswers'] = $filterout_incomplete_answers; - } - - if ($_SESSION['incompleteanswers']=='filter') { - return "filter"; //COMPLETE ANSWERS ONLY - } - elseif ($_SESSION['incompleteanswers']=='show') { - return false; //ALL ANSWERS - } - elseif ($_SESSION['incompleteanswers']=='incomplete') { - return "inc"; //INCOMPLETE ANSWERS ONLY - } - else - { // last resort is to prevent filtering - return false; - } -} - -/** -* captcha_enabled($screen, $usecaptchamode) -* @param string $screen - the screen name for which to test captcha activation -* -* @return boolean - returns true if captcha must be enabled -**/ -function captcha_enabled($screen, $captchamode='') -{ - switch($screen) - { - case 'registrationscreen': - if ($captchamode == 'A' || - $captchamode == 'B' || - $captchamode == 'D' || - $captchamode == 'R') - { - return true; - } - else - { - return false; - } - break; - case 'surveyaccessscreen': - if ($captchamode == 'A' || - $captchamode == 'B' || - $captchamode == 'C' || - $captchamode == 'X') - { - return true; - } - else - { - return false; - } - break; - case 'saveandloadscreen': - if ($captchamode == 'A' || - $captchamode == 'C' || - $captchamode == 'D' || - $captchamode == 'S') - { - return true; - } - else - { - return false; - } - return true; - break; - default: - return true; - break; - } -} - - -/** -* used for import[survey|questions|groups] -* -* @param mixed $string -* @return mixed -*/ -function convertCsvreturn2return($string) -{ - $string= str_replace('\n', "\n", $string); - return str_replace('\%n', '\n', $string); -} - - - -/** -* Checks that each object from an array of CSV data [question-rows,answer-rows,labelsets-row] supports at least a given language -* -* @param mixed $csvarray array with a line of csv data per row -* @param mixed $idkeysarray array of integers giving the csv-row numbers of the object keys -* @param mixed $langfieldnum integer giving the csv-row number of the language(s) filed -* ==> the language field can be a single language code or a -* space separated language code list -* @param mixed $langcode the language code to be tested -* @param mixed $hasheader if we should strip off the first line (if it contains headers) -*/ -function bDoesImportarraySupportsLanguage($csvarray,$idkeysarray,$langfieldnum,$langcode, $hasheader = false) -{ - // An array with one row per object id and langsupport status as value - $objlangsupportarray=Array(); - if ($hasheader === true) - { // stripping first row to skip headers if any - array_shift($csvarray); - } - - foreach ($csvarray as $csvrow) - { - $rowcontents = convertCSVRowToArray($csvrow,',','"'); - $rowid = ""; - foreach ($idkeysarray as $idfieldnum) - { - $rowid .= $rowcontents[$idfieldnum]."-"; - } - $rowlangarray = explode (" ", $rowcontents[$langfieldnum]); - if (!isset($objlangsupportarray[$rowid])) - { - if (array_search($langcode,$rowlangarray)!== false) - { - $objlangsupportarray[$rowid] = "true"; - } - else - { - $objlangsupportarray[$rowid] = "false"; - } - } - else - { - if ($objlangsupportarray[$rowid] == "false" && - array_search($langcode,$rowlangarray) !== false) - { - $objlangsupportarray[$rowid] = "true"; - } - } - } // end foreach rown - - // If any of the object doesn't support the given language, return false - if (array_search("false",$objlangsupportarray) === false) - { - return true; - } - else - { - return false; - } -} - -/** This function checks to see if there is an answer saved in the survey session -* data that matches the $code. If it does, it returns that data. -* It is used when building a questions text to allow incorporating the answer -* to an earlier question into the text of a later question. -* IE: Q1: What is your name? [Jason] -* Q2: Hi [Jason] how are you ? -* This function is called from the retriveAnswers function. -* -* @param mixed $code -* @param mixed $phpdateformat The date format in which any dates are shown -* @return mixed returns the answerText from session variable corresponding to a question code -*/ -function retrieve_Answer($code, $phpdateformat=null) -{ - //This function checks to see if there is an answer saved in the survey session - //data that matches the $code. If it does, it returns that data. - //It is used when building a questions text to allow incorporating the answer - //to an earlier question into the text of a later question. - //IE: Q1: What is your name? [Jason] - // Q2: Hi [Jason] how are you ? - //This function is called from the retriveAnswers function. - global $dbprefix, $connect, $clang; - //Find question details - if (isset($_SESSION[$code])) - { - $questiondetails=getsidgidqidaidtype($code); - //the getsidgidqidaidtype function is in common.php and returns - //a SurveyID, GroupID, QuestionID and an Answer code - //extracted from a "fieldname" - ie: 1X2X3a - // also returns question type - - if ($questiondetails['type'] == "M" || $questiondetails['type'] == "P") - { - if ((strpos($code,'comment')>0 || strpos($code,'other')>0) && isset($_SESSION[$code])) - { - return $_SESSION[$code]; - } - $query="SELECT * FROM {$dbprefix}questions WHERE parent_qid='".$questiondetails['qid']."' AND language='".$_SESSION['s_lang']."'"; - $result=db_execute_assoc($query) or safe_die("Error getting answer
      $query
      ".$connect->ErrorMsg()); //Checked - while($row=$result->FetchRow()) - { - if (isset($_SESSION[$code.$row['title']]) && $_SESSION[$code.$row['title']] == "Y") - { - $returns[] = $row['question']; - } - elseif (isset($_SESSION[$code]) && $_SESSION[$code] == "Y" && $questiondetails['aid']==$row['title']) - { - return $row['question']; - } - } - if (isset($_SESSION[$code."other"]) && $_SESSION[$code."other"]) - { - $returns[]=$_SESSION[$code."other"]; - } - if (isset($returns)) - { - $return=implode(", ", $returns); - if (strpos($return, ",")) - { - $return=substr_replace($return, " &", strrpos($return, ","), 1); - } - } - else - { - //$return=$clang->gT("No answer"); - $return = ""; //queXS Addition - } - } - elseif (!$_SESSION[$code] && $_SESSION[$code] !=0) - { - //$return=$clang->gT("No answer"); - $return = ""; //queXS Addition - } - else - { - $return=getextendedanswer($code, $_SESSION[$code], 'INSERTANS',$phpdateformat); - } - } - else - { - $return=$clang->gT("Error") . "($code)"; - } - return html_escape($return); -} - -/** -* Check if a table does exist in the database -* -* @param mixed $sid Table name to check for (without dbprefix!)) -* @return boolean True or false if table exists or not -*/ -function tableExists($tablename) -{ - global $connect; - static $tablelist; - - if (!isset($tablelist)) $tablelist = $connect->MetaTables(); - if ($tablelist==false) - { - return false; - } - foreach ($tablelist as $tbl) - { - if (db_quote_id($tbl) == db_table_name($tablename)) - { - return true; - } - } - return false; -} - -// Returns false if the survey is anonymous, -// and a token table exists: in this case the completed field of a token -// will contain 'Y' instead of the submitted date to ensure privacy -// Returns true otherwise -function bIsTokenCompletedDatestamped($thesurvey) -{ - if ($thesurvey['anonymized'] == 'Y' && tableExists('tokens_'.$thesurvey['sid'])) - { - return false; - } - else - { - return true; - } -} - -/** -* example usage -* $date = "2006-12-31 21:00"; -* $shift "+6 hours"; // could be days, weeks... see function strtotime() for usage -* -* echo sql_date_shift($date, "Y-m-d H:i:s", $shift); -* -* will output: 2007-01-01 03:00:00 -* -* @param mixed $date -* @param mixed $dformat -* @param mixed $shift -* @return string -*/ -function date_shift($date, $dformat, $shift) -{ - return date($dformat, strtotime($shift, strtotime($date))); -} - - -// getBounceEmail: returns email used to receive error notifications -function getBounceEmail($surveyid) -{ - $surveyInfo=getSurveyInfo($surveyid); - - if ($surveyInfo['bounceprocessing'] == 'G') - { - return getGlobalSetting('siteadminbounce'); - } - else if ($surveyInfo['bounce_email'] == '') - { - return null; // will be converted to from in MailText - } - else - { - return $surveyInfo['bounce_email']; - } -} - -// getEmailFormat: returns email format for the survey -// returns 'text' or 'html' -function getEmailFormat($surveyid) -{ - - $surveyInfo=getSurveyInfo($surveyid); - if ($surveyInfo['htmlemail'] == 'Y') - { - return 'html'; - } - else - { - return 'text'; - } - -} - -// Check if user has manage rights for a template -function hasTemplateManageRights($userid, $templatefolder) { - global $connect; - global $dbprefix; - $userid=sanitize_int($userid); - $templatefolder=sanitize_paranoid_string($templatefolder); - $query = "SELECT ".db_quote_id('use')." FROM {$dbprefix}templates_rights WHERE uid=".$userid." AND folder LIKE '".$templatefolder."'"; - - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Safe - - if ($result->RecordCount() == 0) return false; - - $row = $result->FetchRow(); - - return $row["use"]; -} - -/** -* This function creates an incrementing answer code based on the previous source-code -* -* @param mixed $sourcecode The previous answer code -*/ -function getNextCode($sourcecode) -{ - $i=1; - $found=true; - $foundnumber=-1; - while ($i<=strlen($sourcecode) && $found) - { - $found=is_numeric(substr($sourcecode,-$i)); - if ($found) - { - $foundnumber=substr($sourcecode,-$i); - $i++; - } - } - if ($foundnumber==-1) - { - return($sourcecode); - } - else - { - $foundnumber++; - $result=substr($sourcecode,0,strlen($sourcecode)-strlen($foundnumber)).$foundnumber; - return($result); - } - -} - -/** -* Translink -* -* @param mixed $type -* @param mixed $oldid -* @param mixed $newid -* @param mixed $text -* @return mixed -*/ -function translink($type, $oldid, $newid, $text) -{ - global $relativeurl; - if (!isset($_POST['translinksfields'])) - { - return $text; - } - - if ($type == 'survey') - { - $pattern = "([^'\"]*)/upload/surveys/$oldid/"; - $replace = "$relativeurl/upload/surveys/$newid/"; - return preg_replace('#'.$pattern.'#', $replace, $text); - } - elseif ($type == 'label') - { - $pattern = "([^'\"]*)/upload/labels/$oldid/"; - $replace = "$relativeurl/upload/labels/$newid/"; - return preg_replace('#'.$pattern.'#', $replace, $text); - } - else - { - return $text; - } -} - -/** -* This function creates the old fieldnames for survey import -* -* @param mixed $iOldSID The old survey id -* @param mixed $iNewSID The new survey id -* @param array $aGIDReplacements An array with group ids (oldgid=>newgid) -* @param array $aQIDReplacements An array with question ids (oldqid=>newqid) -*/ -function aReverseTranslateFieldnames($iOldSID,$iNewSID,$aGIDReplacements,$aQIDReplacements) -{ - $aGIDReplacements=array_flip($aGIDReplacements); - $aQIDReplacements=array_flip($aQIDReplacements); - if ($iOldSID==$iNewSID) { - $forceRefresh=true; // otherwise grabs the cached copy and throws undefined index exceptions - } - else { - $forceRefresh=false; - } - $aFieldMap=createFieldMap($iNewSID,'full',$forceRefresh); - $aFieldMappings=array(); - foreach ($aFieldMap as $sFieldname=>$aFieldinfo) - { - if ($aFieldinfo['qid']!=null) - { - $aFieldMappings[$sFieldname]=$iOldSID.'X'.$aGIDReplacements[$aFieldinfo['gid']].'X'.$aQIDReplacements[$aFieldinfo['qid']].$aFieldinfo['aid']; - // now also add a shortened field mapping which is needed for certain kind of condition mappings - $aFieldMappings[$iNewSID.'X'.$aFieldinfo['gid'].'X'.$aFieldinfo['qid']]=$iOldSID.'X'.$aGIDReplacements[$aFieldinfo['gid']].'X'.$aQIDReplacements[$aFieldinfo['qid']]; - } - } - return array_flip($aFieldMappings); -} - - -/** - * Return an array describing what queXS questionnaireId and sampleId to filter results on - * - * @return array The questionnaire Id and sample Id to filter to (sample id is null for entire questionnaire) - * @author Adam Zammit - * @since 2011-09-07 - */ -function questionnaireSampleFilterstate() -{ - $letsfilter = returnglobal('quexsfilterinc'); - - $_SESSION['quexsanswers']=$letsfilter; - - $qs = explode(":",$_SESSION['quexsanswers']); - - if (count($qs) == 2) - { - return $qs; - } - return false; -} - -/** -* This function replaces the old insertans tags with new ones across a survey -* -* @param string $newsid Old SID -* @param string $oldsid New SID -* @param mixed $fieldnames Array array('oldfieldname'=>'newfieldname') -*/ -function TranslateInsertansTags($newsid,$oldsid,$fieldnames) -{ - global $connect, $dbprefix; - - $newsid=sanitize_int($newsid); - $oldsid=sanitize_int($oldsid); - - - # translate 'surveyls_urldescription' and 'surveyls_url' INSERTANS tags in surveyls - $sql = "SELECT surveyls_survey_id, surveyls_language, surveyls_urldescription, surveyls_url from {$dbprefix}surveys_languagesettings WHERE surveyls_survey_id=".$newsid." AND (surveyls_urldescription LIKE '%{INSERTANS:".$oldsid."X%' OR surveyls_url LIKE '%{INSERTANS:".$oldsid."X%')"; - $res = db_execute_assoc($sql) or safe_die("Can't read groups table in transInsertAns ".$connect->ErrorMsg()); // Checked - - while ($qentry = $res->FetchRow()) - { - $urldescription = $qentry['surveyls_urldescription']; - $endurl = $qentry['surveyls_url']; - $language = $qentry['surveyls_language']; - - foreach ($fieldnames as $sOldFieldname=>$sNewFieldname) - { - $pattern = $sOldFieldname; - $replacement = $sNewFieldname; - $urldescription=preg_replace('/'.$pattern.'/', $replacement, $urldescription); - $endurl=preg_replace('/'.$pattern.'/', $replacement, $endurl); - } - - if (strcmp($urldescription,$qentry['surveyls_urldescription']) !=0 || - (strcmp($endurl,$qentry['surveyls_url']) !=0)) - { - // Update Field - $sqlupdate = "UPDATE {$dbprefix}surveys_languagesettings SET surveyls_urldescription='".db_quote($urldescription)."', surveyls_url='".db_quote($endurl)."' WHERE surveyls_survey_id=$newsid AND surveyls_language='$language'"; - $updateres=$connect->Execute($sqlupdate) or safe_die ("Couldn't update INSERTANS in surveys_languagesettings
      $sqlupdate
      ".$connect->ErrorMsg()); //Checked - } // Enf if modified - } // end while qentry - - # translate 'quotals_urldescrip' and 'quotals_url' INSERTANS tags in quota_languagesettings - $sql = "SELECT quotals_id, quotals_urldescrip, quotals_url from {$dbprefix}quota_languagesettings qls,{$dbprefix}quota q WHERE sid=".$newsid." AND q.id=qls.quotals_quota_id AND (quotals_urldescrip LIKE '%{INSERTANS:".$oldsid."X%' OR quotals_url LIKE '%{INSERTANS:".$oldsid."X%')"; - $res = db_execute_assoc($sql) or safe_die("Can't read quota table in transInsertAns ".$connect->ErrorMsg()); // Checked - - while ($qentry = $res->FetchRow()) - { - $urldescription = $qentry['quotals_urldescrip']; - $endurl = $qentry['quotals_url']; - - foreach ($fieldnames as $sOldFieldname=>$sNewFieldname) - { - $pattern = $sOldFieldname; - $replacement = $sNewFieldname; - $urldescription=preg_replace('/'.$pattern.'/', $replacement, $urldescription); - $endurl=preg_replace('/'.$pattern.'/', $replacement, $endurl); - } - - if (strcmp($urldescription,$qentry['quotals_urldescrip']) !=0 || - (strcmp($endurl,$qentry['quotals_url']) !=0)) - { - // Update Field - $sqlupdate = "UPDATE {$dbprefix}quota_languagesettings SET quotals_urldescrip='".db_quote($urldescription)."', quotals_url='".db_quote($endurl)."' WHERE quotals_id={$qentry['quotals_id']}"; - $updateres=$connect->Execute($sqlupdate) or safe_die ("Couldn't update INSERTANS in quota_languagesettings
      $sqlupdate
      ".$connect->ErrorMsg()); //Checked - } // Enf if modified - } // end while qentry - - - # translate 'description' INSERTANS tags in groups - $sql = "SELECT gid, language, group_name, description from {$dbprefix}groups WHERE sid=".$newsid." AND description LIKE '%{INSERTANS:".$oldsid."X%' OR group_name LIKE '%{INSERTANS:".$oldsid."X%'"; - $res = db_execute_assoc($sql) or safe_die("Can't read groups table in transInsertAns ".$connect->ErrorMsg()); // Checked - - while ($qentry = $res->FetchRow()) - { - $gpname = $qentry['group_name']; - $description = $qentry['description']; - $gid = $qentry['gid']; - $language = $qentry['language']; - - foreach ($fieldnames as $sOldFieldname=>$sNewFieldname) - { - $pattern = $sOldFieldname; - $replacement = $sNewFieldname; - $gpname = preg_replace('/'.$pattern.'/', $replacement, $gpname); - $description=preg_replace('/'.$pattern.'/', $replacement, $description); - } - - if (strcmp($description,$qentry['description']) !=0 || - strcmp($gpname,$qentry['group_name']) !=0) - { - // Update Fields - $sqlupdate = "UPDATE {$dbprefix}groups SET description='".db_quote($description)."', group_name='".db_quote($gpname)."' WHERE gid=$gid AND language='$language'"; - $updateres=$connect->Execute($sqlupdate) or safe_die ("Couldn't update INSERTANS in groups
      $sqlupdate
      ".$connect->ErrorMsg()); //Checked - } // Enf if modified - } // end while qentry - - # translate 'question' and 'help' INSERTANS tags in questions - $sql = "SELECT qid, language, question, help from {$dbprefix}questions WHERE sid=".$newsid." AND (question LIKE '%{INSERTANS:".$oldsid."X%' OR help LIKE '%{INSERTANS:".$oldsid."X%')"; - $res = db_execute_assoc($sql) or safe_die("Can't read question table in transInsertAns ".$connect->ErrorMsg()); // Checked - - while ($qentry = $res->FetchRow()) - { - $question = $qentry['question']; - $help = $qentry['help']; - $qid = $qentry['qid']; - $language = $qentry['language']; - - foreach ($fieldnames as $sOldFieldname=>$sNewFieldname) - { - $pattern = $sOldFieldname; - $replacement = $sNewFieldname; - $question=preg_replace('/'.$pattern.'/', $replacement, $question); - $help=preg_replace('/'.$pattern.'/', $replacement, $help); - } - - if (strcmp($question,$qentry['question']) !=0 || - strcmp($help,$qentry['help']) !=0) - { - // Update Field - $sqlupdate = "UPDATE {$dbprefix}questions SET question='".db_quote($question)."', help='".db_quote($help)."' WHERE qid=$qid AND language='$language'"; - $updateres=$connect->Execute($sqlupdate) or safe_die ("Couldn't update INSERTANS in question
      $sqlupdate
      ".$connect->ErrorMsg()); //Checked - } // Enf if modified - } // end while qentry - - - # translate 'answer' INSERTANS tags in answers - $sql = "SELECT a.qid, a.language, a.code, a.answer from {$dbprefix}answers as a INNER JOIN {$dbprefix}questions as b ON a.qid=b.qid WHERE b.sid=".$newsid." AND a.answer LIKE '%{INSERTANS:".$oldsid."X%'"; - $res = db_execute_assoc($sql) or safe_die("Can't read answers table in transInsertAns ".$connect->ErrorMsg()); // Checked - - while ($qentry = $res->FetchRow()) - { - $answer = $qentry['answer']; - $code = $qentry['code']; - $qid = $qentry['qid']; - $language = $qentry['language']; - - foreach ($fieldnames as $sOldFieldname=>$sNewFieldname) - { - $pattern = $sOldFieldname; - $replacement = $sNewFieldname; - $answer=preg_replace('/'.$pattern.'/', $replacement, $answer); - } - - if (strcmp($answer,$qentry['answer']) !=0) - { - // Update Field - $sqlupdate = "UPDATE {$dbprefix}answers SET answer='".db_quote($answer)."' WHERE qid=$qid AND code='$code' AND language='$language'"; - $updateres=$connect->Execute($sqlupdate) or safe_die ("Couldn't update INSERTANS in answers
      $sqlupdate
      ".$connect->ErrorMsg()); //Checked - } // Enf if modified - } // end while qentry -} - - -/** -* put your comment there... -* -* @param mixed $id -* @param mixed $type -*/ -function hasResources($id,$type='survey') -{ - global $publicdir,$uploaddir; - $dirname = $uploaddir; - - if ($type == 'survey') - { - $dirname .= "/surveys/$id"; - } - elseif ($type == 'label') - { - $dirname .= "/labels/$id"; - } - else - { - return false; - } - - if (is_dir($dirname) && $dh=opendir($dirname)) - { - while(($entry = readdir($dh)) !== false) - { - if($entry !== '.' && $entry !== '..') - { - return true; - break; - } - } - closedir($dh); - } - else - { - return false; - } - - return false; -} - -/** -* Creates a random sequence of characters -* -* @param mixed $length Length of resulting string -* @param string $pattern To define which characters should be in the resulting string -*/ -function sRandomChars($length,$pattern="23456789abcdefghijkmnpqrstuvwxyz") -{ - $patternlength = strlen($pattern)-1; - for($i=0;$i<$length;$i++) - { - if(isset($key)) - $key .= $pattern{rand(0,$patternlength)}; - else - $key = $pattern{rand(0,$patternlength)}; - } - return $key; -} - - - -/** -* used to translate simple text to html (replacing \n with
      -* -* @param mixed $mytext -* @param mixed $ishtml -* @return mixed -*/ -function conditional_nl2br($mytext,$ishtml,$encoded='') -{ - if ($ishtml === true) - { - // $mytext has been processed by clang->gT with html mode - // and thus \n has already been translated to - if ($encoded == '') - { - $mytext=str_replace(' ', '
      ',$mytext); - } - return str_replace("\n", '
      ',$mytext); - } - else - { - return $mytext; - } -} - -function conditional2_nl2br($mytext,$ishtml) -{ - if ($ishtml === true) - { - return str_replace("\n", '
      ',$mytext); - } - else - { - return $mytext; - } -} - -function br2nl( $data ) { - return preg_replace( '!!iU', "\n", $data ); -} - - -function safe_die($text) -{ - //Only allowed tag:
      - $textarray=explode('
      ',$text); - $textarray=array_map('htmlspecialchars',$textarray); - die(implode( '
      ',$textarray)); -} - -/** -* getQuotaInformation() returns quota information for the current survey -* @param string $surveyid - Survey identification number -* @param string $quotaid - Optional quotaid that restricts the result to a given quota -* @return array - nested array, Quotas->Members->Fields -*/ -function getQuotaInformation($surveyid,$language,$quotaid='all') -{ - global $clang, $clienttoken; - $baselang = GetBaseLanguageFromSurveyID($surveyid); - - $query = "SELECT * FROM ".db_table_name('quota').", ".db_table_name('quota_languagesettings')." - WHERE ".db_table_name('quota').".id = ".db_table_name('quota_languagesettings').".quotals_quota_id - AND sid='{$surveyid}' - AND quotals_language='".$language."'"; - if ($quotaid != 'all') - { - $query .= " AND id=$quotaid"; - } - - $result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - $quota_info = array(); - $x=0; - - $surveyinfo=getSurveyInfo($surveyid); - - // Check all quotas for the current survey - if ($result->RecordCount() > 0) - { - while ($survey_quotas = $result->FetchRow()) - { - //Modify the URL - thanks janokary - $survey_quotas['quotals_url']=str_replace("{SAVEDID}",isset($_SESSION['srid']) ? $_SESSION['srid'] : '', $survey_quotas['quotals_url']); - $survey_quotas['quotals_url']=str_replace("{SID}", $surveyid, $survey_quotas['quotals_url']); - $survey_quotas['quotals_url']=str_replace("{LANG}", $clang->getlangcode(), $survey_quotas['quotals_url']); - $survey_quotas['quotals_url']=str_replace("{TOKEN}",$clienttoken, $survey_quotas['quotals_url']); - - array_push($quota_info,array('Name' => $survey_quotas['name'], - 'Limit' => $survey_quotas['qlimit'], - 'Action' => $survey_quotas['action'], - 'Message' => $survey_quotas['quotals_message'], - 'Url' => templatereplace(passthruReplace($survey_quotas['quotals_url'], $surveyinfo)), - 'UrlDescrip' => $survey_quotas['quotals_urldescrip'], - 'AutoloadUrl' => $survey_quotas['autoload_url'])); - $query = "SELECT * FROM ".db_table_name('quota_members')." WHERE quota_id='{$survey_quotas['id']}'"; - $result_qe = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - $quota_info[$x]['members'] = array(); - if ($result_qe->RecordCount() > 0) - { - while ($quota_entry = $result_qe->FetchRow()) - { - $query = "SELECT type, title,gid FROM ".db_table_name('questions')." WHERE qid='{$quota_entry['qid']}' AND language='{$baselang}'"; - $result_quest = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked - $qtype = $result_quest->FetchRow(); - - $fieldnames = "0"; - - if ($qtype['type'] == "I" || $qtype['type'] == "G" || $qtype['type'] == "Y") - { - $fieldnames=array(0 => $surveyid.'X'.$qtype['gid'].'X'.$quota_entry['qid']); - $value = $quota_entry['code']; - } - - if($qtype['type'] == "L" || $qtype['type'] == "O" || $qtype['type'] =="!") - { - $fieldnames=array(0 => $surveyid.'X'.$qtype['gid'].'X'.$quota_entry['qid']); - $value = $quota_entry['code']; - } - - if($qtype['type'] == "M") - { - $fieldnames=array(0 => $surveyid.'X'.$qtype['gid'].'X'.$quota_entry['qid'].$quota_entry['code']); - $value = "Y"; - } - - if($qtype['type'] == "A" || $qtype['type'] == "B") - { - $temp = explode('-',$quota_entry['code']); - $fieldnames=array(0 => $surveyid.'X'.$qtype['gid'].'X'.$quota_entry['qid'].$temp[0]); - $value = $temp[1]; - } - - array_push($quota_info[$x]['members'],array('Title' => $qtype['title'], - 'type' => $qtype['type'], - 'code' => $quota_entry['code'], - 'value' => $value, - 'qid' => $quota_entry['qid'], - 'fieldnames' => $fieldnames)); - } - } - $x++; - } - } - return $quota_info; -} - -/** -* get_quotaCompletedCount() returns the number of answers matching the quota -* @param string $surveyid - Survey identification number -* @param string $quotaid - quota id for which you want to compute the completed field -* @return string - number of mathing entries in the result DB or 'N/A' -*/ -function get_quotaCompletedCount($surveyid, $quotaid) -{ - $result ="N/A"; - $quota_info = getQuotaInformation($surveyid,GetBaseLanguageFromSurveyID($surveyid),$quotaid); - $quota = $quota_info[0]; - - if ( db_tables_exist(db_table_name_nq('survey_'.$surveyid)) && - count($quota['members']) > 0) - { - $fields_list = array(); // Keep a list of fields for easy reference - // construct an array of value for each $quota['members']['fieldnames'] - unset($querycond); - $fields_query = array(); - foreach($quota['members'] as $member) - { - foreach($member['fieldnames'] as $fieldname) - { - if (!in_array($fieldname,$fields_list)){ - $fields_list[] = $fieldname; - $fields_query[$fieldname] = array(); - } - $fields_query[$fieldname][]= db_quote_id($fieldname)." = '{$member['value']}'"; - } - } - - foreach($fields_list as $fieldname) - { - $select_query = " ( ".implode(' OR ',$fields_query[$fieldname]).' )'; - $querycond[] = $select_query; - } - - $querysel = "SELECT count(id) as count FROM ".db_table_name('survey_'.$surveyid)." WHERE ".implode(' AND ',$querycond)." "." AND submitdate IS NOT NULL"; - $result = db_execute_assoc($querysel) or safe_die($connect->ErrorMsg()); //Checked - $quota_check = $result->FetchRow(); - $result = $quota_check['count']; - } - - return $result; -} - -function fix_FCKeditor_text($str) -{ - $str = str_replace('
      ','',$str); - if ($str == "
      " || $str == " " || $str == " ") - { - $str = ""; - } - if (preg_match("/^[\s]+$/",$str)) - { - $str=''; - } - if ($str == "\n") - { - $str = ""; - } - if (trim($str) == " " || trim($str)=='') - { // chrome adds a single   element to empty fckeditor fields - $str = ""; - } - - return $str; -} - - -function recursive_stripslashes($array_or_string) -{ - if (is_array($array_or_string)) - { - return array_map('recursive_stripslashes', $array_or_string); - } - else - { - return stripslashes($array_or_string); - } -} - - - - -/** -* This is a helper function for GetAttributeFieldNames -* -* @param mixed $fieldname -*/ -function filterforattributes ($fieldname) -{ - if (strpos($fieldname,'attribute_')===false) return false; else return true; -} - - -/** -* Retrieves the attribute field names from the related token table -* -* @param mixed $surveyid The survey ID -* @return array The fieldnames -*/ -function GetAttributeFieldNames($surveyid,$filter=true) -{ - global $dbprefix, $connect; - if (tableExists('tokens_'.$surveyid) === false) - { - return Array(); - } - $tokenfieldnames = array_values($connect->MetaColumnNames("{$dbprefix}tokens_$surveyid", true)); - if ($filter) - { - return array_filter($tokenfieldnames,'filterforattributes'); - } - return $tokenfieldnames; -} - -/** -* Retrieves the token field names usable for conditions from the related token table -* -* @param mixed $surveyid The survey ID -* @return array The fieldnames -*/ -function GetTokenConditionsFieldNames($surveyid) -{ - $extra_attrs=GetAttributeFieldNames($surveyid); - $basic_attrs=Array('firstname','lastname','email','token','language','sent','remindersent','remindercount','usesleft'); - $basic_attrs[] = 'callattempts'; //queXS addition - $basic_attrs[] = 'onappointment'; //queXS addition - $basic_attrs[] = 'perccomplete'; //queXS addition - $basic_attrs[] = 'messagesleft'; //queXS addition - return array_merge($basic_attrs,$extra_attrs); -} - -/** -* Retrieves the attribute names from the related token table -* -* @param mixed $surveyid The survey ID -* @param boolean $onlyAttributes Set this to true if you only want the fieldnames of the additional attribue fields - defaults to false -* @param boolean $quexs True to include queXS fieldnames -* @return array The fieldnames as key and names as value in an Array -*/ -function GetTokenFieldsAndNames($surveyid, $onlyAttributes=false, $quexs=true) -{ - global $dbprefix, $connect, $clang; - if (tableExists('tokens_'.$surveyid) === false) - { - return Array(); - } - $extra_attrs=GetAttributeFieldNames($surveyid); - $basic_attrs=Array('firstname','lastname','email','token','language','sent','remindersent','remindercount','usesleft'); - if ($quexs) - { - $basic_attrs[] = 'callattempts'; //queXS addition - $basic_attrs[] = 'onappointment'; //queXS addition - $basic_attrs[] = 'perccomplete'; //queXS addition - $basic_attrs[] = 'messagesleft'; //queXS addition - } - $basic_attrs_names=Array( - $clang->gT('First name'), - $clang->gT('Last name'), - $clang->gT('Email address'), - $clang->gT('Token code'), - $clang->gT('Language code'), - $clang->gT('Invitation sent date'), - $clang->gT('Last Reminder sent date'), - $clang->gT('Total numbers of sent reminders'), - $clang->gT('Uses left') - ); - - if ($quexs) - { - include_once(dirname(__FILE__) . '/quexs.php'); - $basic_attrs_names[] = T_('queXS: Number of call attempts'); //queXS addition - $basic_attrs_names[] = T_('queXS: On appointment?'); //queXS addition - $basic_attrs_names[] = T_('queXS: Percentage complete'); //queXS addition - $basic_attrs_names[] = T_('queXS: Number of answering machine messages left'); //queXS addition - } - - $thissurvey=getSurveyInfo($surveyid); - $attdescriptiondata=!empty($thissurvey['attributedescriptions']) ? $thissurvey['attributedescriptions'] : ""; - $attdescriptiondata=explode("\n",$attdescriptiondata); - $attributedescriptions=array(); - $basic_attrs_and_names=array(); - $extra_attrs_and_names=array(); - foreach ($attdescriptiondata as $attdescription) - { - $attributedescriptions['attribute_'.substr($attdescription,10,strpos($attdescription,'=')-10)] = substr($attdescription,strpos($attdescription,'=')+1); - } - foreach ($extra_attrs as $fieldname) - { - if (isset($attributedescriptions[$fieldname])) - { - $extra_attrs_and_names[$fieldname]=$attributedescriptions[$fieldname]; - } - else - { - $extra_attrs_and_names[$fieldname]=sprintf($clang->gT('Attribute %s'),substr($fieldname,10)); - } - } - if ($onlyAttributes===false) - { - $basic_attrs_and_names=array_combine($basic_attrs,$basic_attrs_names); - return array_merge($basic_attrs_and_names,$extra_attrs_and_names); - } - else - { - return $extra_attrs_and_names; - } -} - -/** -* Retrieves the token attribute value from the related token table -* -* @param mixed $surveyid The survey ID -* @param mixed $attrName The token-attribute field name -* @param mixed $token The token code -* @return string The token attribute value (or null on error) -*/ -function GetAttributeValue($surveyid,$attrName,$token) -{ - global $dbprefix, $connect; - $attrName=strtolower($attrName); - if ($attrName == 'callattempts' || $attrName == 'onappointment' || $attrName == 'perccomplete' || $attrName == 'messagesleft') //queXS addition - { - include_once("quexs.php"); - $quexs_operator_id = get_operator_id(); - $quexs_case_id = get_case_id($quexs_operator_id); - if ($quexs_case_id) - { - if ($attrName == 'callattempts') - return get_call_attempts($quexs_case_id); - else if ($attrName == 'onappointment') - return is_on_appointment($quexs_case_id,$quexs_operator_id); - else if ($attrName == 'perccomplete') - return get_percent_complete($quexs_case_id); - else if ($attrName == 'messagesleft') - return get_messages_left($quexs_case_id); - } - else - return 0; - } - else if (!tableExists('tokens_'.$surveyid) || !in_array($attrName,GetTokenConditionsFieldNames($surveyid))) - { - return null; - } - $sanitized_token=$connect->qstr($token,get_magic_quotes_gpc()); - $surveyid=sanitize_int($surveyid); - - $query="SELECT $attrName FROM {$dbprefix}tokens_$surveyid WHERE token=$sanitized_token"; - $result=db_execute_num($query); - $count=$result->RecordCount(); - if ($count != 1) - { - return null; - } - else - { - $row=$result->FetchRow(); - return $row[0]; - } -} - -/** -* This function strips any content between and including @siU' // Strip style tags properly - /* ,'@<[\/\!]*?[^<>]*?>@si', // Strip out HTML tags - '@@' // Strip multi-line comments including CDATA - */ - ); - $text = preg_replace($search, '', $content); - return $text; -} - - -/** -* This function cleans files from the temporary directory being older than 1 day -* @todo Make the days configurable -*/ -function cleanTempDirectory() -{ - global $tempdir; - $dir= $tempdir.'/'; - $dp = opendir($dir) or die ('Could not open temporary directory'); - while ($file = readdir($dp)) { - if (is_file($dir.$file) && (filemtime($dir.$file)) < (strtotime('-1 days')) && $file!='.gitignore' && $file!='index.html' && $file!='readme.txt' && $file!='..' && $file!='.' && $file!='.svn') { - @unlink($dir.$file); - } - } - $dir= $tempdir.'/upload/'; - $dp = opendir($dir) or die ('Could not open temporary directory'); - while ($file = readdir($dp)) { - if (is_file($dir.$file) && (filemtime($dir.$file)) < (strtotime('-1 days')) && $file!='.gitignore' && $file!='index.html' && $file!='readme.txt' && $file!='..' && $file!='.' && $file!='.svn') { - @unlink($dir.$file); - } - } - closedir($dp); -} - - -function use_firebug() -{ - if(FIREBUG == true) - { - return ''; - }; -}; - -/** -* This is a convenience function for the coversion of datetime values -* -* @param mixed $value -* @param mixed $fromdateformat -* @param mixed $todateformat -* @return string -*/ -function convertDateTimeFormat($value, $fromdateformat, $todateformat) -{ - $datetimeobj = new Date_Time_Converter($value , $fromdateformat); - return $datetimeobj->convert($todateformat); -} - - -/** -* This function removes the UTF-8 Byte Order Mark from a string -* -* @param string $str -* @return string -*/ -function removeBOM($str=""){ - if(substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) { - $str=substr($str, 3); - } - return $str; -} - -/** -* This function requests the latest update information from the LimeSurvey.org website -* -* @returns array Contains update information or false if the request failed for some reason -*/ -function GetUpdateInfo() -{ - return false; //queXS Addition - global $homedir, $debug, $buildnumber, $versionnumber; - require_once($homedir."/classes/http/http.php"); - - $http=new http_class; - - /* Connection timeout */ - $http->timeout=0; - /* Data transfer timeout */ - $http->data_timeout=0; - $http->user_agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; - $http->GetRequestArguments("http://update.limesurvey.org?build=$buildnumber",$arguments); - - $updateinfo=false; - $error=$http->Open($arguments); - $error=$http->SendRequest($arguments); - - $http->ReadReplyHeaders($headers); - - - if($error=="") { - $body=''; $full_body=''; - for(;;){ - $error = $http->ReadReplyBody($body,10000); - if($error != "" || strlen($body)==0) break; - $full_body .= $body; - } - $updateinfo=json_decode($full_body,true); - if ($http->response_status!='200') - { - $updateinfo['errorcode']=$http->response_status; - $updateinfo['errorhtml']=$full_body; - } - } - else - { - $updateinfo['errorcode']=$error; - $updateinfo['errorhtml']=$error; - } - unset( $http ); - return $updateinfo; -} - - - -/** -* This function updates the actual global variables if an update is available after using GetUpdateInfo -* @return Array with update or error information -*/ -function updatecheck() -{ - return false; - global $buildnumber; - $updateinfo=GetUpdateInfo(); - if (isset($updateinfo['Targetversion']['build']) && (int)$updateinfo['Targetversion']['build']>(int)$buildnumber && trim($buildnumber)!='') - { - setGlobalSetting('updateavailable',1); - setGlobalSetting('updatebuild',$updateinfo['Targetversion']['build']); - setGlobalSetting('updateversion',$updateinfo['Targetversion']['versionnumber']); - } - else - { - setGlobalSetting('updateavailable',0); - } - setGlobalSetting('updatelastcheck',date('Y-m-d H:i:s')); - return $updateinfo; -} - -/** -* This function removes a directory recursively -* -* @param mixed $dirname -* @return bool -*/ -function rmdirr($dirname) -{ - // Sanity check - if (!file_exists($dirname)) { - return false; - } - - // Simple delete for a file - if (is_file($dirname) || is_link($dirname)) { - return @unlink($dirname); - } - - // Loop through the folder - $dir = dir($dirname); - while (false !== $entry = $dir->read()) { - // Skip pointers - if ($entry == '.' || $entry == '..') { - continue; - } - - // Recurse - rmdirr($dirname . DIRECTORY_SEPARATOR . $entry); - } - - // Clean up - $dir->close(); - return @rmdir($dirname); -} - -function getTokenData($surveyid, $token) -{ - global $dbprefix, $connect; - $query = "SELECT * FROM ".db_table_name('tokens_'.$surveyid)." WHERE token='".db_quote($token)."'"; - $result = db_execute_assoc($query) or safe_die("Couldn't get token info in getTokenData()
      ".$query."
      ".$connect->ErrorMsg()); //Checked - $thistoken=array(); // so has default value - while($row=$result->FetchRow()) - { - $thistoken=array("firstname"=>$row['firstname'], - "lastname"=>$row['lastname'], - "email"=>$row['email'], - "language" =>$row['language'], - "usesleft" =>$row['usesleft'], - ); - $attrfieldnames=GetAttributeFieldnames($surveyid); - foreach ($attrfieldnames as $attr_name) - { - $thistoken[$attr_name]=$row[$attr_name]; - } - } // while - return $thistoken; -} - - -/** -* This function returns the complete directory path to a given template name -* -* @param mixed $sTemplateName -*/ -function sGetTemplatePath($sTemplateName) -{ - global $standardtemplaterootdir, $usertemplaterootdir, $defaulttemplate; - if (isStandardTemplate($sTemplateName)) - { - return $standardtemplaterootdir.'/'.$sTemplateName; - } - else - { - if (is_dir($usertemplaterootdir.'/'.$sTemplateName)) - { - return $usertemplaterootdir.'/'.$sTemplateName; - } - elseif (is_dir($usertemplaterootdir.'/'.$defaulttemplate)) - { - return $usertemplaterootdir.'/'.$defaulttemplate; - } - elseif (isStandardTemplate($defaulttemplate)) - { - return $standardtemplaterootdir.'/'.$defaulttemplate; - } - else - { - return $standardtemplaterootdir.'/default'; - } - } -} - -/** -* This function returns the complete URL path to a given template name -* -* @param mixed $sTemplateName -*/ -function sGetTemplateURL($sTemplateName) -{ - global $standardtemplaterooturl, $standardtemplaterootdir, $usertemplaterooturl, $usertemplaterootdir, $defaulttemplate; - if (isStandardTemplate($sTemplateName)) - { - return $standardtemplaterooturl.'/'.$sTemplateName; - } - else - { - if (file_exists($usertemplaterootdir.'/'.$sTemplateName)) - { - return $usertemplaterooturl.'/'.$sTemplateName; - } - elseif (file_exists($usertemplaterootdir.'/'.$defaulttemplate)) - { - return $usertemplaterooturl.'/'.$defaulttemplate; - } - elseif (isStandardTemplate($defaulttemplate)) - { - return $standardtemplaterooturl.'/'.$defaulttemplate; - } - else - { - return $standardtemplaterooturl.'/default'; - } - } -} - -/** -* Return the goodchars to be used when filtering input for numbers. -* -* @param $lang string language used, for localisation -* @param $integer bool use only integer -* @param $negative bool allow negative values -*/ -function getNumericalFormat($lang = 'en', $integer = false, $negative = true) { - $goodchars = "0123456789"; - if ($integer === false) $goodchars .= "."; //Todo, add localisation - if ($negative === true) $goodchars .= "-"; //Todo, check databases - return $goodchars; -} - -/** -* Return an array of subquestions for a given sid/qid -* -* @param int $sid -* @param int $qid -* @param $sLanguage Language of the subquestion text -*/ -function getSubQuestions($sid, $qid, $sLanguage) { - global $dbprefix, $connect, $clang; - static $subquestions; - - if (!isset($subquestions[$sid])) - { - $subquestions[$sid]=array(); - } - if (!isset($subquestions[$sid][$sLanguage])) { - $sid = sanitize_int($sid); - $query = "SELECT sq.*, q.other FROM {$dbprefix}questions as sq, {$dbprefix}questions as q" - ." WHERE sq.parent_qid=q.qid AND q.sid=$sid" - ." AND sq.language='".$sLanguage. "' " - ." AND q.language='".$sLanguage. "' " - ." ORDER BY sq.parent_qid, q.question_order,sq.scale_id , sq.question_order"; - $result=db_execute_assoc($query) or safe_die ("Couldn't get perform answers query
      $query
      ".$connect->ErrorMsg()); //Checked - $resultset=array(); - while ($row=$result->FetchRow()) - { - $resultset[$row['parent_qid']][] = $row; - } - $subquestions[$sid][$sLanguage] = $resultset; - } - if (isset($subquestions[$sid][$sLanguage][$qid])) return $subquestions[$sid][$sLanguage][$qid]; - return array(); -} - -/** -* Wrapper function to retrieve an xmlwriter object and do error handling if it is not compiled -* into PHP -*/ -function getXMLWriter() { - if (!extension_loaded('xmlwriter')) { - safe_die('XMLWriter class not compiled into PHP, please contact your system administrator'); - } else { - $xmlwriter = new XMLWriter(); - } - return $xmlwriter; -} - - - -/* -* Return a sql statement for renaming a table -*/ -function db_rename_table($oldtable, $newtable) -{ - global $connect; - - $dict = NewDataDictionary($connect); - $result=$dict->RenameTableSQL($oldtable, $newtable); - return $result[0]; -} - -/** -* Returns true when a token can not be used (either doesn't exist or has less then one usage left -* -* @param mixed $tid Token -*/ -function usedTokens($token) -{ - global $dbprefix, $surveyid; - - $utresult = true; - $query = "SELECT tid, usesleft from {$dbprefix}tokens_$surveyid WHERE token=".db_quoteall($token); - - $result=db_execute_assoc($query,null,true); - if ($result !== false) { - $row=$result->FetchRow(); - if ($row['usesleft']>0) $utresult = false; - } - return $utresult; -} - -/** -* Return true if the actual survey answer is completed -* -* @param int $surveyid The survey id -* @param int $srid The survey answer id -*/ -function isCompleted($surveyid,$srid) -{ - global $connect; - $completed = false; - if($surveyid && $srid) - { - $sRow=$connect->GetRow("SELECT active FROM ".db_table_name('surveys')." WHERE sid=$surveyid"); - if($sRow['active']=='Y') - { - $sridRow=$connect->GetRow("SELECT submitdate FROM ".db_table_name('survey_'.$surveyid)." WHERE id=$srid"); - if($sridRow && $sridRow['submitdate']) - { - $completed=true; - } - } - } - return $completed; -}; - -/** -* redirect() generates a redirect URL for the apporpriate SSL mode then applies it. -* -* @param $ssl_mode string 's' or '' (empty). -*/ -function redirect($ssl_mode) -{ - $url = 'http'.$ssl_mode.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; - if (!headers_sent()) - { // If headers not sent yet... then do php redirect - ob_clean(); - header('Location: '.$url); - ob_flush(); - exit; - }; -}; - -/** -* SSL_mode() $force_ssl is on or off, it checks if the current -* request is to HTTPS (or not). If $force_ssl is on, and the -* request is not to HTTPS, it redirects the request to the HTTPS -* version of the URL, if the request is to HTTPS, it rewrites all -* the URL variables so they also point to HTTPS. -*/ -function SSL_mode() -{ - global $rooturl , $homeurl , $publicurl , $tempurl , $imageurl , $uploadurl; - global $usertemplaterooturl , $standardtemplaterooturl; - global $parsedurl , $relativeurl , $fckeditordir , $ssl_emergency_override; - - $https = isset($_SERVER['HTTPS'])?$_SERVER['HTTPS']:''; - if($ssl_emergency_override !== true ) - { - $force_ssl = strtolower(getGlobalSetting('force_ssl')); - } - else - { - $force_ssl = 'off'; - }; - if( $force_ssl == 'on' && $https == '' ) - { - redirect('s'); - } - if( $force_ssl == 'off' && $https != '') - { - redirect(''); - }; -}; - - -/** -* Creates an array with details on a particular response for display purposes -* Used in Print answers (done), Detailed response view (Todo:)and Detailed admin notification email (done) -* -* @param mixed $iSurveyID -* @param mixed $iResponseID -* @param mixed $sLanguageCode -* @param boolean $bHonorConditions Apply conditions -*/ -function aGetFullResponseTable($iSurveyID, $iResponseID, $sLanguageCode, $bHonorConditions=false) -{ - global $connect; - $aFieldMap = createFieldMap($iSurveyID,'full',false,false,$sLanguageCode); - //Get response data - $idquery = "SELECT * FROM ".db_table_name('survey_'.$iSurveyID)." WHERE id=".$iResponseID; - $idrow=$connect->GetRow($idquery) or safe_die ("Couldn't get entry
      \n$idquery
      \n".$connect->ErrorMsg()); //Checked - - // Create array of non-null values - those are the relevant ones - $aRelevantFields = array(); - - foreach ($aFieldMap as $sKey=>$fname) - { - if (!is_null($idrow[$fname['fieldname']])) - { - $aRelevantFields[$sKey]=$fname; - } - } - - $aResultTable=array(); - - $oldgid = 0; - $oldqid = 0; - foreach ($aRelevantFields as $sKey=>$fname) - { - if (!empty($fname['qid'])) - { - $attributes = getQuestionAttributes($fname['qid']); - if (getQuestionAttributeValue($attributes, 'hidden') == 1) - { - continue; - } - } - $question = $fname['question']; - $subquestion=''; - if (isset($fname['gid']) && !empty($fname['gid'])) { - //Check to see if gid is the same as before. if not show group name - if ($oldgid !== $fname['gid']) - { - $oldgid = $fname['gid']; - $aResultTable['gid_'.$fname['gid']]=array($fname['group_name']); - } - } - if (isset($fname['qid']) && !empty($fname['qid'])) - { - if ($oldqid !== $fname['qid']) - { - $oldqid = $fname['qid']; - if (isset($fname['subquestion']) || isset($fname['subquestion1']) || isset($fname['subquestion2'])) - { - $aResultTable['qid_'.$fname['sid'].'X'.$fname['gid'].'X'.$fname['qid']]=array($fname['question'],'',''); - } - else - { - $answer=getextendedanswer($fname['fieldname'], $idrow[$fname['fieldname']]); - $aResultTable[$fname['fieldname']]=array($question,'',$answer); - continue; - } - } - } - else - { - $answer=getextendedanswer($fname['fieldname'], $idrow[$fname['fieldname']]); - $aResultTable[$fname['fieldname']]=array($question,'',$answer); - continue; - } - if (isset($fname['subquestion'])) - $subquestion = "{$fname['subquestion']}"; - - if (isset($fname['subquestion1'])) - $subquestion = "{$fname['subquestion1']}"; - - if (isset($fname['subquestion2'])) - $subquestion .= "[{$fname['subquestion2']}]"; - - $answer=getextendedanswer($fname['fieldname'], $idrow[$fname['fieldname']]); - $aResultTable[$fname['fieldname']]=array('',$subquestion,$answer); - } - return $aResultTable; -} - - - -/** -* Check if $str is an integer, or string representation of an integer -* -* @param mixed $mStr -*/ -function bIsNumericInt($mStr) -{ - if(is_int($mStr)) - return true; - elseif(is_string($mStr)) - return preg_match("/^[0-9]+$/", $mStr); - return false; -} - -/** -* Invert key/values of an associative array, preserving multiple values in -* the source array as a single key with multiple values in the resulting -* array. -* -* This is not the same as array_flip(), which flattens the structure of the -* source array. -* -* @param array $aArr -*/ -function aArrayInvert($aArr) -{ - $aRet = array(); - foreach($aArr as $k => $v) - $aRet[$v][] = $k; - return $aRet; -} - -/** -* Include Keypad headers -*/ -function vIncludeKeypad() -{ - global $js_header_includes, $css_header_includes, $clang; - - $js_header_includes[] = '/scripts/jquery/jquery.keypad.min.js'; - if ($clang->langcode !== 'en') - { - $js_header_includes[] = '/scripts/jquery/locale/jquery.ui.keypad-'.$clang->langcode.'.js'; - } - $css_header_includes[] = '/scripts/jquery/css/jquery.keypad.alt.css'; -} - -/** -* Strips the DB prefix from a string - does not verify just strips the according number of characters -* -* @param mixed $sTableName -* @return string -*/ -function sStripDBPrefix($sTableName) -{ - global $dbprefix; - return substr($sTableName,strlen($dbprefix)); -} - -/* -* Emit the standard (last) onsubmit handler for the survey. -* -* This code in injected in the three questionnaire modes right after the
      element, -* before the individual questions emit their own onsubmit replacement code. -*/ -function sDefaultSubmitHandler() -{ - return << - - -EOS; -} - -/** -* This function fixes the group ID and type on all subquestions -* -*/ -function fixSubquestions() -{ - $surveyidresult=db_select_limit_assoc("select sq.qid, sq.parent_qid, sq.gid as sqgid, q.gid, sq.type as sqtype, q.type - from ".db_table_name('questions')." sq JOIN ".db_table_name('questions')." q on sq.parent_qid=q.qid - where sq.parent_qid>0 and (sq.gid!=q.gid or sq.type!=q.type)",1000); - while ($sv = $surveyidresult->FetchRow()) - { - db_execute_assoc('update '.db_table_name('questions')." set type='{$sv['type']}', gid={$sv['gid']} where qid={$sv['qid']}"); - } - -} - -/** -* Need custom version of JSON encode to avoid having Expression Manager mangle it -* @param type $val -* @return type -*/ -function ls_json_encode($val) -{ - $ans = json_encode($val); - $ans = str_replace(array('{','}'),array('{ ',' }'), $ans); - return $ans; -} - -/** -* This function returns the real IP address under all configurations -* -*/ -function getIPAddress() -{ - global $bServerBehindProxy; - if ($bServerBehindProxy) - { - if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet - { - return $_SERVER['HTTP_CLIENT_IP']; - } - elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy - { - return $_SERVER['HTTP_X_FORWARDED_FOR']; - } - } - if (!empty($_SERVER['REMOTE_ADDR'])) - { - return $_SERVER['REMOTE_ADDR']; - } - else - { - return '127.0.0.1'; - } -} - -// Closing PHP tag intentionally omitted - yes, it is okay diff --git a/include/limesurvey/config-defaults.php b/include/limesurvey/config-defaults.php deleted file mode 100644 index 6aa223a3..00000000 --- a/include/limesurvey/config-defaults.php +++ /dev/null @@ -1,639 +0,0 @@ - slow but convenient and user friendly -// * popup: adds an icon that runs a popup with and html editor -// --> faster, but html code is displayed on the form -// * none: no html editor -$defaulthtmleditormode = 'inline'; - -// $defaultquestionselectormode -// * sets the default for the question-type selector : full or none -// users without specific preference inherit this setup -// * full : javascript selector with picture of the question type -// * none : basic html selector -$defaultquestionselectormode = 'full'; - -// $defaulttemplateeditormode -// * sets the default for the template editor : full or none -// users without specific preference inherit this setup -// * full : javascript editor mode, with Editarea (text formatting, search and replace and real-time syntax highlight) -// * none : basic textarea -$defaulttemplateeditormode = 'full'; - -// $surveyPreview_require_Auth -// Enforce Authentication to the LS system -// before beeing able to preview a survey (testing a non active survey) -// Default is true -$surveyPreview_require_Auth = true; - - -// $use_one_time_passwords -// Activate One time passwords -// The user can call the limesurvey login at /limesurvey/admin and pass username and -// a one time password which was previously written into the users table (column one_time_pw) by -// an external application. -// This setting has to be turned on to enable the usage of one time passwords (default = off). -$use_one_time_passwords = false; - - -// $display_user_password_in_html -// Option to tell LS to display the automatically generated user password in the html GUI or not -$display_user_password_in_html = false; - - -// $display_user_password_in_email -// Option to tell LS to display the automatically generated user password in the welcome email or not -$display_user_password_in_email = true; - - -// $useWebserverAuth -// Enable delegation of authentication to the webserver. -// If you set this parameter to true and set your webserver to authenticate -// users accessing the /admin subdirectory, then the username returned by -// the webserver will be trusted by LimeSurvey and used for authentication -// unless a username mapping is used see $userArrayMap below -// -// The user still needs to be defined in the limesurvey database in order to -// login and get his permissions (unless $WebserverAuth_autocreateUser is set to true) -$useWebserverAuth = false; - -// $userArrayMap -// Enable username mapping -// This parameter is an array mapping username from the webserver to username -// defined in LimeSurvey -// Can be usefull if you have no way to add an 'admin' user to the database -// used by the webserver, then you could map your true loginame to admin with -// $userArrayMap = Array ('mylogin' => 'admin'); -// -// $WebserverAuth_autocreateUser -// Enable this if you want to automatically create users authenticated by the -// webserver in LS -// Default is false (commenting this options also means false) -// $WebserverAuth_autocreateUser = false; -// -// $WebserverAuth_autouserprofile -// This parameter MUST be defined if you set $WebserverAuth_autocreateUser to true -// otherwise autocreateUser will be disabled. -// This is an array describing the default profile to use for auto-created users -// This profile will be the same for all users (unless you define the optionnal -// 'hook_get_autouserprofile' function). -// -//$WebserverAuth_autouserprofile = Array( -// 'full_name' => 'autouser', -// 'email' => $siteadminemail, -// 'lang' => 'en', -// 'htmleditormode' => $defaulthtmleditormode, -// 'templatelist' => 'default,basic', -// 'create_survey' => 1, -// 'create_user' => 0, -// 'delete_user' => 0, -// 'superadmin' => 0, -// 'configurator' =>0, -// 'manage_template' => 0, -// 'manage_label' => 0); -// -// -// The optionnal 'hook_get_autouserprofile' function -// is for advanced user usage only. -// It is used to customize the profile of the imported user -// If set, the this function will overwrite the $WebserverAuth_autouserprofile -// defined above by its return value -// -// You can use any external DB in order to fill the profile for the user_name -// passed as the first parameter -// A dummy example for the 'hook_get_autouserprofile' function is given -// below: -//function hook_get_autouserprofile($user_name) -//{ -// return Array( -// 'full_name' => '$user_name', -// 'email' => "$user_name@localdomain.org", -// 'lang' => 'en', -// 'htmleditormode' => 'inline', -// 'templatelist' => 'default,basic,MyOrgTemplate', -// 'create_survey' => 1, -// 'create_user' => 0, -// 'delete_user' => 0, -// 'superadmin' => 0, -// 'configurator' =>0, -// 'manage_template' => 0, -// 'manage_label' => 0); -//} - - -//$filterxsshtml -// Enables filtering of suspicious html tags in survey, group, questions -// and answer texts in the administration interface -// Only set this to false if you absolutely trust the users -// you created for the administration of LimeSurvey and if you want to -// allow these users to be able to use Javascript etc. . -$filterxsshtml = true; - -// $usercontrolSameGroupPolicy -// If this option is set to true, then limesurvey operators will only 'see' -// users that belong to at least one of their groups -// Otherwise they can see all operators defines in LimeSurvey -$usercontrolSameGroupPolicy = true; - -// $addTitleToLinks -// If this option is set to true, then LimeSurvey will add 'title' html element -// to all links used in menus. This will help screen reader to analyse the -// menus. Only set this to true if you're using a screen reader because -// it overlaps with tooltips. This option shouldn't be required anymore -// for new releases of screen readers. -$addTitleToLinks = false; - -// $demoModeOnly -// If this option is set to true, then LimeSurvey will go into demo mode. -// Demo mode disables the following things: -// -// * Disables changing of the admin user's details and password -// * Disables uploading files on the Template Editor -// * Disables sending email invitations and reminders -// * Disables doing a database dump -// * Disables the ability to save the following global settings: Site name, Default language, Default Htmleditor Mode, XSS filter - -$demoModeOnly = false; - -/** ----------------------------------------------------- - * Because columns are tricky things, in terms of balancing visual - * layout against semantic markup. The choice has been left to the - * system administrator or designer. (Who ever cares most.) - * - * $column_style defines how columns are rendered for survey answers. - * There are four possible options: - * 'css' using one of the various CSS only methods for creating - columns (see template style sheet for details). - * 'ul' using multiple floated unordered lists. (DEFAULT) - * 'table' using conventional tables based layout. - * NULL blocks the use of columns - */ -$column_style = 'ul'; - -/** - * $hide_groupdescr_allinone. - * This parameter 'hide_groupdescr_allinone' can be set to control - * if the group description should be hidden if the group description of a group of questions - * with all questions hidden by conditions is displayed in all-in-one survey mode. - * hide_groupdescr_allinone can be set to true or false (default: true) - */ -$hide_groupdescr_allinone=true; - - -/** - * Use FireBug Lite for JavaScript and template development and testing. - * This allows you to use all the features of Firebug in any browser. - * see http://getfirebug.com/lite.html for more info. - */ -$use_firebug_lite = false; - -/* - * When activated there are additional values like arithmetic mean and standard deviation at statistics. - * This only affects question types "A" (5 point array) and "5" (5 point choice). - * Furthermore data is aggregated to get a faster overview. - */ -$showaggregateddata = 1; - - -/** - * When this settings is true/1 (default) then the standard templates that are delivered with the - * LimeSurvey installation package are read-only. If you want to modify a template just copy it first. - * This prevents upgrade problems later because if you modify your standard templates you could accidenitally - * overwrite these on a LimSurvey upgrade. Only set this to 0 if you know what you are doing. - */ -$standard_templates_readonly = true; - - -/** - * When this settings is true/1 (default = false/0) then the printable survey option will show a reference - * to the "lime_survey_12345" table which stores the survey answers. - * It will show a code like "12345X22X333name": - * 12345 = surveyID - * 22 = groupID - * 333 = questionID - * name = answer code (only shown for certain question types - * - * This code will be shown in front of each question and in front of each answer option at the printable survey. - * It can be used as a data analysis code book for querying data from the main response table. - */ -$showsgqacode = false; - - - -/** - * PDF Export Settings - * This feature activates PDF export for printable survey and Print Answers - * The PDF export is totally experimental. The output is mostly ugly. - * At this point no support can be given - if you want to help to fix it please get in touch with us - */ - -$usepdfexport = 0; //Set 0 to disable; 1 to enable -$pdfdefaultfont = 'freemono'; //Default font for the pdf Export -$pdffontsize = 9; //Fontsize for normal text; Surveytitle is +4; grouptitle is +2 -$notsupportlanguages = array('zh-Hant-TW','zh-Hant-HK','zh-Hans','ja','th'); -$pdforientation = 'P'; // Set L for Landscape or P for portrait format - - - -// RemoteControl Settings -/** - * This value determines if the RemoteControl is enabled (true) or not (false) - */ -$enableLsrc = false; - -/** - * This value determines if you can save survey structures (as .csv) into your lsrc folder in export menu - */ -$export4lsrc = false; - -// CAS Settings -/** - * Please note that CAS functionality is very basic and you have to modify the client to your needs. - * At least the hard work is done. - * The Client is deployed in Limesurvey and a file login_check_cas.php does what login_check.php does in normal mode. - * - * $casEnabled determines if CAS should be used or not for Authentication. - * $casAuthServer the servername of the cas Auth Server. Without http:// - * $casAuthPort CAS Server listening Port - * $casAuthUri relative uri from $casAuthServer to cas workingdirectory - */ -$casEnabled = false; -$casAuthServer = 'localhost'; -$casAuthPort = 8443; -$casAuthUri = '/cas-server/'; - - -/** - * Statistics chart settings - * Different languages need different fonts to properly create charts - this is what the following settings are for - */ - -/** - * $chartfontfile - set the font file name used to created the charts in statistics - this font must reside in /fonts - * Set this to specific font-file (for example 'vera.ttf') or set it to 'auto' and LimeSurvey tried to pick the best font depending on your survey base language - */ -$chartfontfile='auto'; - -/** - * $chartfontsize - set the size of the font to created the charts in statistics - */ -$chartfontsize =10; - - -/** - * $updatecheckperiod - sets how often LimeSurvey checks for updates - the number sets the number of days between updates. - * Set to 0 to disable any update checks - * Recommended: 7 - */ -$updatecheckperiod=0; - -/** - * @var $showxquestions string allows you to control whether or not - * {THEREAREXQUESTIONS} is displayed (if it is included in a template) - * hide = always hide {THEREAREXQUESTIONS} - * show = always show {THEREAREXQUESTIONS} - * choose = allow survey admins to choose - */ -$showxquestions = 'choose'; - - -/** - * @var $showgroupinfo string allows you to control whether or not - * {GROUPNAME} and/or {GROUPDESCRIPTION} are displayed (if they are - * included in a template) - * none = always hide both title and description - * name = always {GROUPNAME} only - * description = always show {GROUPDESCRIPTION} only - * both = always show both {GROUPNAME} and {GROUPDESCRIPTION} - * choose = allow survey admins to choose - */ -$showgroupinfo = 'choose'; - - -/** - * @var $showqnumcode string allows you to control whether or not - * {QUESTION_NUMBER} and/or {QUESTION_CODE} are displayed (if they - * are included in a template) - * none = always hide both {QUESTION_NUMBER} and {QUESTION_CODE} - * code = always show {QUESTION_CODE} only - * number = always show {QUESTION_NUMBER} only - * both = always show both {QUESTION_NUMBER} and {QUESTION_CODE} - * choose = allow survey admins to choose - */ -$showqnumcode = 'choose'; - - -/** - * @var $force_ssl string - forces LimeSurvey to run through HTTPS or to block HTTPS - * 'on' = force SSL/HTTPS to be on (This will cause LimeSurvey - * to fail in SSL is turned off) - * 'off' = block SSL/HTTPS (this prevents LimeSurvey from - * running through SSL) - * '' = do nothing (default) - * - * DO NOT turn on secure unless you are sure SSL/HTTPS is working and - * that you have a current, working, valid certificate. If you are - * unsure whether your server has a valid certificate, just add 's' - * to the http part of your normal LimeSurvey URL. - * e.g. https://your.domain.org/limesurvey/admin/admin.php - * If LimeSurvey comes up as normal, then everything is fine. If you - * get a page not found error or permission denied error then - */ -$force_ssl = ''; // DO not turn on unless you are sure your server supports SSL/HTTPS - - -/** - * @var $ssl_emergency_override boolean forces SSL off - * if You've turned HTTPS/SSL on in the global settings but your - * server doesn't have HTTPS enabled, the only way to turn it off is - * by changing a value in the database directly. This allows you to - * force HTTPS off while you change the global settings for Force Secure. - * - * false = do nothing; - * true = override $force_ssl=on; - * - * This should always be false except in emergencies where you change - * it to true until you fix the problem. - */ -$ssl_emergency_override = false; - - -/** -* @var $ipInfoDbAPIKey Get your IP Info DB key from http://ipinfodb.com/ -* If you have the API key, you can use it to get the initial approximate location of the participant. -*/ -$ipInfoDbAPIKey = ''; - -// Google Maps API key. http://code.google.com/apis/maps/signup.html -// To have questions that require google Maps! - -$googleMapsAPIKey = ''; - -// Google Analytics API key: http://www.google.com/analytics/ -$googleAnalyticsAPIKey = ''; - -// Style for using Google Analytics -// 0 = Don't use Analytics -// 1 = Default -// 2 = SurveyName-[SID]/GroupName -$googleAnalyticsStyle = '0'; - -// Google Translate API key: https://code.google.com/apis/language/translate/v2/getting_started.html -$googletranslateapikey = ''; - -/** -* This variable defines the total space available to the file upload question across all surveys. If set to 0 then no limit applies. -* -* @var $iFileUploadTotalSpaceMB Integer number to determine the available space in MB - Default: 0 -* -*/ -$iFileUploadTotalSpaceMB=0; - -/** -* Set this variable to true to indicate that your server is behind a proxy. -* This will ensure the correct captioning of IP addresses instead of just the proxy address -* -* @var $bServerBehindProxy Default: false -* -*/ -$bServerBehindProxy=false; - -//DO NOT EVER CHANGE THE FOLLOWING 5 LINES --------------- -require_once(dirname(__FILE__).'/config.php'); -if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']!='' && $_SERVER['HTTPS']!='off') -{ - $rooturl=str_replace('http://', 'https://', $rooturl); -} -//----------------------------------------------------- - -// === Advanced Setup -// The following parameters need information from config.php -// and thus are defined here (After reading your config.php file). -// This means that if you want to tweak these very advanced parameters -// you'll have to do this in this file and not in config.php -// In this case, don't forget to backup your config-defaults.php settings when upgrading LS -// and report them to the new config-defaults.php file (Do not simply overwrite the new -// config-defaults file with your old one - -//The following url and dir locations do not need to be modified unless you have a non-standard -//LimeSurvey installation. Do not change unless you know what you are doing. - -$homeurl = "$rooturl/admin"; // The website location (url) of the admin scripts -$publicurl = "$rooturl"; // The public website location (url) of the public survey script -$tempurl = "$rooturl/tmp"; -$imageurl = "$rooturl/images"; // Location of button bar files for admin script -$uploadurl = "$rooturl/upload"; -$standardtemplaterooturl = "$rooturl/templates"; // Location of the standard templates -$usertemplaterooturl = "$uploadurl/templates"; // Location of the user templates - - -$homedir = "$rootdir".DIRECTORY_SEPARATOR."admin"; // The directory path of the admin scripts -$publicdir = "$rootdir"; // The directory path of the public scripts -$tempdir = "$rootdir".DIRECTORY_SEPARATOR."tmp"; // The directory path where LimeSurvey can store temporary files -$imagedir = "$rootdir".DIRECTORY_SEPARATOR."images"; // The directory path of the image directory -$uploaddir = "$rootdir".DIRECTORY_SEPARATOR."upload"; -$standardtemplaterootdir = "$rootdir".DIRECTORY_SEPARATOR."templates"; // The directory path of the standard templates -$usertemplaterootdir = "$uploaddir".DIRECTORY_SEPARATOR."templates"; // The directory path of the user templates - -$sCKEditorURL = "$homeurl/scripts/ckeditor.36"; -$ckeditexpandtoolbar = true; // defines if the CKeditor toolbar should be opened by default -$pdfexportdir = "$homedir/classes/tcpdf"; //Directory with the tcpdf.php extensiontcpdf.php -$pdffonts = $pdfexportdir.'/fonts'; //Directory for the TCPDF fonts - -// Computing relative url -// $relativeurl is the url relative to you DocumentRoot where is installed LimeSurvey. -// Usually same as $rooturl without http://{$_SERVER['HTTP_HOST']}. -// $relativeurl is now automatically computed from $rooturl -if(!isset($cmd_install) || !$cmd_install==true) -{ - $parsedurl = parse_url($rooturl); - $relativeurl= isset($parsedurl['path']) ? $parsedurl['path'] : ""; -} -else -{ - // commandline installation, no relativeurl needed -} diff --git a/include/limesurvey/config-ldap.php b/include/limesurvey/config-ldap.php deleted file mode 100644 index 15b33553..00000000 --- a/include/limesurvey/config-ldap.php +++ /dev/null @@ -1,215 +0,0 @@ - diff --git a/include/limesurvey/config.php b/include/limesurvey/config.php deleted file mode 100644 index 681316a0..00000000 --- a/include/limesurvey/config.php +++ /dev/null @@ -1,90 +0,0 @@ - 'autouser', -// 'email' => $siteadminemail, -// 'htmledtirmode' => $defaulthtmleditormode, -// 'templatelist' => 'default,basic', -// 'create_survey' => 1, -// 'lang' => DEFAULT_LOCALE, -// 'create_user' => 1, -// 'delete_user' => 1, -// 'superadmin' => 1, -// 'configurator' => 1, -// 'manage_template' => 1, -// 'manage_label' => 1); -// - diff --git a/include/limesurvey/delete.php b/include/limesurvey/delete.php deleted file mode 100644 index 46208ef0..00000000 --- a/include/limesurvey/delete.php +++ /dev/null @@ -1,91 +0,0 @@ -FetchRow(); - $stg_SessionName=$usrow['stg_value']; - if ($surveyid) - { - @session_name($stg_SessionName.'-runtime-'.$surveyid); - } - else - { - @session_name($stg_SessionName.'-runtime-publicportal'); - } -} -else -{ - session_name("LimeSurveyRuntime-$surveyid"); -} -session_set_cookie_params(0,$relativeurl.'/admin/'); -@session_start(); -$baselang = GetBaseLanguageFromSurveyID($surveyid); -$clang = new limesurvey_lang($baselang); - -if (empty($_SESSION) || !isset($_SESSION['fieldname'])) -{ - die("You don't have a valid session !"); -} - - $sFieldname = $_GET['fieldname']; - $sFilename = sanitize_filename($_GET['filename']); - $sOriginalFileName=sanitize_filename($_GET['name']); - if (substr($sFilename,0,6)=='futmp_') - { - $sFileDir = $tempdir.'/upload/'; - } - elseif(substr($sFilename,0,3)=='fu_'){ - $sFileDir = "{$uploaddir}/surveys/{$surveyid}/files/"; - } - else die('Invalid filename'); - - $sJSON = $_SESSION[$sFieldname]; - $aFiles = json_decode(stripslashes($sJSON),true); - - if(substr($sFilename,0,3)=='fu_'){ - $iFileIndex=0; - $found=false; - foreach ($aFiles as $aFile) - { - if ($aFile['filename']==$sFilename) - { - $found=true; - break; - } - $iFileIndex++; - } - if ($found==true) unset($aFiles[$iFileIndex]); - $_SESSION[$sFieldname] = ls_json_encode($aFiles); - } - - if (@unlink($sFileDir.$sFilename)) - { - echo sprintf($clang->gT('File %s deleted'), $sOriginalFileName); - } - else - echo $clang->gT('Oops, There was an error deleting the file'); - -?> diff --git a/include/limesurvey/docs/.htaccess b/include/limesurvey/docs/.htaccess deleted file mode 100644 index b1afaaa5..00000000 --- a/include/limesurvey/docs/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ -# Do not remove this file. With a correct apache configuration -# this file should prevent snooping on your LimeSurvey version by -# reading the release_notes.txt -deny from all \ No newline at end of file diff --git a/include/limesurvey/docs/demosurveys/Language_Question_Test.csv b/include/limesurvey/docs/demosurveys/Language_Question_Test.csv deleted file mode 100644 index 5a2674d6..00000000 --- a/include/limesurvey/docs/demosurveys/Language_Question_Test.csv +++ /dev/null @@ -1,73 +0,0 @@ -# LimeSurvey Survey Dump -# DBVersion 111 -# This is a dumped survey from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# SURVEYS TABLE -# -"sid","owner_id","admin","active","expires","adminemail","private","faxto","format","template","url","language","additional_languages","datestamp","usecookie","notification","allowregister","attribute1","attribute2","allowsave","autonumber_start","autoredirect","allowprev","ipaddr","useexpiry","refurl","datecreated" -"31565","1","","N","2007-02-11","","Y","","S","default","","en","hr nl ","N","N","0","N","","","Y","0","N","Y","N","N","N","2007-02-11" - -# -# GROUPS TABLE -# -"gid","sid","group_name","group_order","description","language" -"11","31565","group_name_hr","0","description_hr","hr" -"11","31565","group_name_nl","0","description_nl","nl" -"11","31565","group_name_en","0","description_en","en" - -# -# QUESTIONS TABLE -# -"qid","sid","gid","type","title","question","preg","help","other","mandatory","lid","question_order","language" -"49","31565","11","I","code_en","qeustion_en","","questionhelp_en","N","N","0","0","en" -"49","31565","11","I","code_en","qeustion_hr","","questionhelp_cr","N","N","0","0","hr" -"49","31565","11","I","code_en","qeustion_nl","","questionhelp_nl","N","N","0","0","nl" -"50","31565","11","M","code","question_en","","questionhelp_en","N","N","0","1","en" -"50","31565","11","M","code","question_hr","","questionhelp_hr","N","N","0","1","hr" -"50","31565","11","M","code","question_nl","","questionhelp_nl","N","N","0","1","nl" - -# -# ANSWERS TABLE -# -"qid","code","answer","default_value","sortorder","language" -"50","c1","answer_en1","","1","en" -"50","c1","answer_hr1","","1","hr" -"50","c1","answer_nl1","","1","nl" -"50","c2","answer_en2","","2","en" -"50","c2","answer_hr2","","2","hr" -"50","c2","answer_nl2","","2","nl" -"50","c3","answer_en3","","3","en" -"50","c3","answer_hr3","","3","hr" -"50","c3","answer_nl3","","3","nl" - -# -# CONDITIONS TABLE -# - -# -# LABELSETS TABLE -# - -# -# LABELS TABLE -# - -# -# QUESTION_ATTRIBUTES TABLE -# - -# -# ASSESSMENTS TABLE -# - -# -# SURVEYS_LANGUAGESETTINGS TABLE -# -"surveyls_survey_id","surveyls_language","surveyls_title","surveyls_description","surveyls_welcometext","surveyls_urldescription","surveyls_email_invite_subj","surveyls_email_invite","surveyls_email_remind_subj","surveyls_email_remind","surveyls_email_register_subj","surveyls_email_register","surveyls_email_confirm_subj","surveyls_email_confirm" -"31565","en","Test for language question","description_en","welcome_en","urldescrip_en","Invitation to participate in survey","Dear {FIRSTNAME},\n\nYou have been invited to participate in a survey.\n\nThe survey is titled:\n""{SURVEYNAME}""\n\n""{SURVEYDESCRIPTION}""\n\nTo participate, please click on the link below.\n\nSincerely,\n\n{ADMINNAME} ({ADMINEMAIL})\n\n----------------------------------------------\nClick here to do the survey:\n{SURVEYURL}","Reminder to participate in survey","Dear {FIRSTNAME},\n\nRecently we invited you to participate in a survey.\n\nWe note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.\n\nThe survey is titled:\n""{SURVEYNAME}""\n\n""{SURVEYDESCRIPTION}""\n\nTo participate, please click on the link below.\n\nSincerely,\n\n{ADMINNAME} ({ADMINEMAIL})\n\n----------------------------------------------\nClick here to do the survey:\n{SURVEYURL}","Survey Registration Confirmation","Dear {FIRSTNAME},\n\nYou, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.\n\nTo complete this survey, click on the following URL:\n\n{SURVEYURL}\n\nIf you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.","Confirmation of completed survey","Dear {FIRSTNAME},\n\nThis email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.\n\nIf you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.\n\nSincerely,\n\n{ADMINNAME}" -"31565","hr","short_title_hr","description_hr","welcome_hr","urldescrip_hr","example@example.com","email_invite_hr","example@example.com","email_remind_hr","example@example.com","email_register_hr","example@example.com","email_confirm_hr" -"31565","nl","short_title_nl","description_nl","welcome_nl","urldescrip_nl","example@example.com","email_invite_nl","example@example.com","email_remind_nl","example@example.com","email_register_nl","example@example.com","email_confirm_nl" - diff --git a/include/limesurvey/docs/demosurveys/Randomization_Group_Test.lss b/include/limesurvey/docs/demosurveys/Randomization_Group_Test.lss deleted file mode 100644 index 8980406b..00000000 --- a/include/limesurvey/docs/demosurveys/Randomization_Group_Test.lss +++ /dev/null @@ -1,2762 +0,0 @@ - - - Survey - 155 - - fr - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[Q1]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q2]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q3]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q4]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q4]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q5]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q5]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q6]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q6]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q7]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q7]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q8]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q8]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q9]]> - ]]> - - - - - - - - - - - - - - - - - <![CDATA[Q9]]> - - - - - - - - - - - - - - - - - - <![CDATA[g1q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[g1q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[g1q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[g1q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[g1q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[g1q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[g2q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[g2q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[g2q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[g2q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[g2q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[g2q3]]> - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - -
      -To Illustrate this:
      -
      -                    A      B       C
      ----------------------------------------
      -Rand Group1  Q1 |  Q4  | Q7
      -                          --------------------
      -Rand Group2  Q2 |  Q5  | Q8
      -                          --------------------
      -Rand Group3  Q3 |  Q6  | Q9
      -
      -
      -
      ]]>
      - - - - - -
      you have been invited to participate in a survey.

      The survey is titled:
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      To participate, please click on the link below.

      Sincerely,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Click here to do the survey:
      {SURVEYURL}

      If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
      {OPTOUTURL}]]>
      - -
      Recently we invited you to participate in a survey.

      We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

      The survey is titled:
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      To participate, please click on the link below.

      Sincerely,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Click here to do the survey:
      {SURVEYURL}

      If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
      {OPTOUTURL}]]>
      - -
      You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

      To complete this survey, click on the following URL:

      {SURVEYURL}

      If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
      - -
      this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

      If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

      Sincerely,

      {ADMINNAME}]]>
      - - -
      A new response was submitted for your survey '{SURVEYNAME}'.

      Click the following link to reload the survey:
      {RELOADURL}

      Click the following link to see the individual response:
      {VIEWRESPONSEURL}

      Click the following link to edit the individual response:
      {EDITRESPONSEURL}

      View statistics by clicking here:
      {STATISTICSURL}]]>
      - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

      A new response was submitted for your survey '{SURVEYNAME}'.

      Click the following link to reload the survey:
      {RELOADURL}

      Click the following link to see the individual response:
      {VIEWRESPONSEURL}

      Click the following link to edit the individual response:
      {EDITRESPONSEURL}

      View statistics by clicking here:
      {STATISTICSURL}


      The following answers were given by the participant:
      {ANSWERTABLE}]]>
      - -
      - - - - - - Cette enquête permettra de tester la fonctionnalité de la randomisation de groupe, il contient 3 groupes avec 3 questions à un groupe. La première question de chaque groupe est en rand groupe1, la deuxième question dans chaque groupe est en rand groupe2, et la dernière question de chaque groupe est en rand groupe3. Les groupes de l'enquête sont du groupe A, B, C. Pour illustrer ceci:

      -

      -
      -                     A      B       C
      - ---------------------------------------
      - Rand Group1  Q1 |  Q4  | Q7
      -                           --------------------
      - Rand Group2  Q2 |  Q5  | Q8
      -                           --------------------
      - Rand Group3  Q3 |  Q6  | Q9

      -]]>
      - - - - - - - - - - - - - - - - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Bonjour, - -Une nouvelle réponse a été soumise pour votre questionnaire '{SURVEYNAME}'. - -Cliquer sur le lien suivant pour recharger votre questionnaire : -{RELOADURL} - -Cliquer sur le lien suivant pour voir la réponse : -{VIEWRESPONSEURL} - -Cliquez sur le lien suivant pour éditer la réponse individuelle : -{EDITRESPONSEURL} - -Visualiser les statistiques en cliquant ici : -{STATISTICSURL} - - -les réponses suivantes ont été données par le participant : -{ANSWERTABLE}]]> - -
      -
      -
      -
      diff --git a/include/limesurvey/docs/demosurveys/SAMPLE_SURVEY_191_EN_DE_FR.lss b/include/limesurvey/docs/demosurveys/SAMPLE_SURVEY_191_EN_DE_FR.lss deleted file mode 100644 index 23775760..00000000 --- a/include/limesurvey/docs/demosurveys/SAMPLE_SURVEY_191_EN_DE_FR.lss +++ /dev/null @@ -1,14844 +0,0 @@ - - - Survey - 146 - - fr - de-informal - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cid - qid - scenario - cqid - cfieldname - method - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - specialtype - scale_id - sqid - language - defaultvalue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LimeSurvey can use a lot of condition and filter to show or hide question. You an use AND or OR condition. You can use previous question answers and tokens.

      -

      - More information on condition on the LimeSurvey documentation

      -]]>
      - -
      - - - - - - - LimeSurvey peut utiliser de nombreuses conditions et filtres pour masquer certaines questions. Il est possible d'utiliser des conditions de type OR ou AND. Vous pouvez utiliser les réponses précédentes mais aussi les attributs des invitations.

      -

      - Plus d'informations sur les conditions sur La documentation de LimeSurvey

      -]]>
      - -
      - - - - - - - Limesurvey unterstützt eine Vielzahl von Bedingungen und Filtern zum Anzeigen und Vestecken von Fragen. Dies umfasst Bedingungen mit UND- sowie ODER-Verknüpfungen. Weitere Informationen finden sich in der LimeSurvey Dokumentation.

      -]]>
      - -
      - - - - - - Array Filter and Array Filter Exclusion]]> - - - - - - - - Fitre de tableau]]> - - - - - - - - Array Filter und Array Filter Exclusion gefiltert werden.]]> - - -
      -
      - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - - - - - - - - - <![CDATA[S]]> - - - - - - - - - - - - - - - - - <![CDATA[S]]> - - - - - - - - - - - - - - - - - <![CDATA[S]]> - - - - - - - - - - - - - - - - - <![CDATA[T]]> - - - - - - - - - - - - - - - - - <![CDATA[T]]> - - - - - - - - - - - - - - - - - <![CDATA[T]]> - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - <![CDATA[S1]]> - - - - - - - - - - - - - - - - - <![CDATA[S1]]> - - - - - - - - - - - - - - - - - <![CDATA[S1]]> - - - - - - - - - - - - - - - - - <![CDATA[T1]]> - - - - - - - - - - - - - - - - - <![CDATA[T1]]> - - - - - - - - - - - - - - - - - <![CDATA[T1]]> - - Langer freier Text, Eingabefeld mit Größenangaben:

      -

      - Breite: 3
      - Anzahl Zeilen: 2
      - Maximale Zeichenanzahl: 6

      -]]>
      - - - - - - - - -
      - - - - - - - <![CDATA[Q]]> - - - - - - - - - - - - - - - - - <![CDATA[Q]]> - - - - - - - - - - - - - - - - - <![CDATA[Q]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - <![CDATA[M2]]> - - - - - - - - - - - - - - - - - <![CDATA[M2]]> - - - - - - - - - - - - - - - - - <![CDATA[M2]]> - - - - - - - - - - - - - - - - - <![CDATA[N]]> - - - - - - - - - - - - - - - - - <![CDATA[N]]> - - - - - - - - - - - - - - - - - <![CDATA[N]]> - - - - - - - - - - - - - - - - - <![CDATA[Q]]> - - - - - - - - - - - - - - - - - <![CDATA[Q]]> - - - - - - - - - - - - - - - - - <![CDATA[Q]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - <![CDATA[Q2]]> - - - - - - - - - - - - - - - - - <![CDATA[Q2]]> - - - - - - - - - - - - - - - - - <![CDATA[Q2]]> - -Genauigkeit = 0,1
      -Minimumwert
      -Maximumwert
      -Nutzung des Text-Separators]]>
      - - - - - - - - -
      - - - - - - - <![CDATA[Y]]> - - - - - - - - - - - - - - - - - <![CDATA[Y]]> - - - - - - - - - - - - - - - - - <![CDATA[Y]]> - - - - - - - - - - - - - - - - - <![CDATA[G]]> - - - - - - - - - - - - - - - - - <![CDATA[G]]> - - - - - - - - - - - - - - - - - <![CDATA[G]]> - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - <![CDATA[I]]> - - - - Cette question change la langue du questionnaire en cours, mieux vaut ne l'utiliser qu'a cela.

      -

      - Cela peut être intéressant de poser cette question au démarrage du questionnaire.

      -]]>
      - - - - - - -
      - - - - - - - <![CDATA[I]]> - - - - This question change the language of the actual survey : don't use for other thing.

      -

      - It can be interesting to use it at survey start

      -]]>
      - - - - - - -
      - - - - - - - <![CDATA[I]]> - - - - - - - - - - - - - - - - - <![CDATA[!2]]> - - - - - - - - - - - - - - - - - <![CDATA[!2]]> - - - - - - - - - - - - - - - - - <![CDATA[!2]]> - - - - - - - - - - - - - - - - - <![CDATA[L]]> - - - - - - - - - - - - - - - - - <![CDATA[L]]> - - - - - - - - - - - - - - - - - <![CDATA[L]]> - - - - - - - - - - - - - - - - - <![CDATA[O]]> - - - - - - - - - - - - - - - - - <![CDATA[O]]> - - - - - - - - - - - - - - - - - <![CDATA[O]]> - - - - - - - - - - - - - - - - - <![CDATA[M]]> - - - - - - - - - - - - - - - - - <![CDATA[M]]> - - - - - - - - - - - - - - - - - <![CDATA[M]]> - - - - - - - - - - - - - - - - - <![CDATA[M2]]> - - - - - - - - - - - - - - - - - <![CDATA[M2]]> - - - - - - - - - - - - - - - - - <![CDATA[M2]]> - - Mehrfachauswahl (mit Exklusivauswahl)

      -]]>
      - - - - - - - - -
      - - - - - - - <![CDATA[K]]> - - - - - - - - - - - - - - - - - <![CDATA[K]]> - -$(document).ready(function() { - $('#answer87262X32X427SQ002comment').hide(); -}); -Multiple option with comments (default answers and 1 Minimum Answer)]]> - - - - - - - - - - - - - - - - <![CDATA[K]]> - - - - - - - - - - - - - - - - - <![CDATA[D]]> - - - - - - - - - - - - - - - - - <![CDATA[D]]> - - - - - - - - - - - - - - - - - <![CDATA[D]]> - - - - - - - - - - - - - - - - - <![CDATA[D1]]> - - - - - - - - - - - - - - - - - <![CDATA[D1]]> - - - - - - - - - - - - - - - - - <![CDATA[D1]]> - - - - - - - - - - - - - - - - - <![CDATA[R]]> - - - - - - - - - - - - - - - - - <![CDATA[R]]> - -jQuery(document).ready(function () { -$("#CHOICES_25 option[value='A1'").remove(); -}); -]]> - - - - - - - - - - - - - - - - <![CDATA[R]]> - -jQuery(document).ready(function () { -$("#CHOICES_25 option[value='A1'").remove(); -}); -]]> - - - - - - - - - - - - - - - - <![CDATA[F]]> - - - - - - - - - - - - - - - - - <![CDATA[F]]> - - - - - - - - - - - - - - - - - <![CDATA[F]]> - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - <![CDATA[E]]> - - - - - - - - - - - - - - - - - <![CDATA[E]]> - - - - - - - - - - - - - - - - - <![CDATA[E]]> - - - - - - - - - - - - - - - - - <![CDATA[X]]> - - - - - - - - - - - - - - - - - <![CDATA[X]]> - - - - - - - - - - - - - - - - - <![CDATA[X]]> - - - - - - - - - - - - - - - - - <![CDATA[;]]> - - - - - - - - - - - - - - - - - <![CDATA[;]]> - - - - - - - - - - - - - - - - - <![CDATA[;]]> - - - - - - - - - - - - - - - - - <![CDATA[:]]> - - - - - - - - - - - - - - - - - <![CDATA[:]]> - - - - - - - - - - - - - - - - - <![CDATA[:]]> - - - - - - - - - - - - - - - - - <![CDATA[:2]]> - - - - - - - - - - - - - - - - - <![CDATA[:2]]> - - - - - - - - - - - - - - - - - <![CDATA[:2]]> - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - <![CDATA[12]]> - - - - - - - - - - - - - - - - - <![CDATA[12]]> - - - - - - - - - - - - - - - - - <![CDATA[12]]> - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - <![CDATA[AN]]> - - - - - - - - - - - - - - - - - <![CDATA[AN]]> - - - - - - - - - - - - - - - - - <![CDATA[AN]]> - - - - - - - - - - - - - - - - - <![CDATA[!1]]> - - - - - - - - - - - - - - - - - <![CDATA[!1]]> - - - - - - - - - - - - - - - - - <![CDATA[!1]]> - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - <![CDATA[R1]]> - - - - - - - - - - - - - - - - - <![CDATA[R1]]> - - - - - - - - - - - - - - - - - <![CDATA[R1]]> - - - - - - - - - - - - - - - - - <![CDATA[XB]]> - - - - - - - - - - - - - - - - - <![CDATA[XB]]> - - - - - - - - - - - - - - - - - <![CDATA[XB]]> - - - - - - - - - - - - - - - - - <![CDATA[XC]]> - - - - - - - - - - - - - - - - - <![CDATA[XC]]> - - - - - - - - - - - - - - - - - <![CDATA[XC]]> - - - - - - - - - - - - - - - - - <![CDATA[QC]]> - - - - - - - - - - - - - - - - - <![CDATA[QC]]> - - - - - - - - - - - - - - - - - <![CDATA[QC]]> - - - - - - - - - - - - - - - - - <![CDATA[QCYes]]> - - - - - - - - - - - - - - - - - <![CDATA[QCYes]]> - - - - - - - - - - - - - - - - - <![CDATA[QCYes]]> - - - - - - - - - - - - - - - - - <![CDATA[QCNo]]> - - - - - - - - - - - - - - - - - <![CDATA[QCNo]]> - - - - - - - - - - - - - - - - - <![CDATA[QCNo]]> - - - - - - - - - - - - - - - - - <![CDATA[QCDefault]]> - - - - - - - - - - - - - - - - - <![CDATA[QCDefault]]> - - - - - - - - - - - - - - - - - <![CDATA[QCDefault]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS1]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS1]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS1]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS2]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS2]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS2]]> - - - - - - - - - - - - - - - - - <![CDATA[CC01]]> - Afficher la question 1 sur l'une des questions précédentes.]]> - - - - - - - - - - - - - - - - <![CDATA[CC01]]> - Show question 1 at one of previous question]]> - - - - - - - - - - - - - - - - <![CDATA[CC01]]> - - - - - - - - - - - - - - - - - <![CDATA[QC02]]> - Afficher la question 1 sur l'une des questions précédentes.]]> - - - - - - - - - - - - - - - - <![CDATA[QC02]]> - Show question 2 at one of previous question.]]> - - - - - - - - - - - - - - - - <![CDATA[QC02]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS3]]> - Afficher sur l'une des questions précédentes.]]> - - - - - - - - - - - - - - - - <![CDATA[QCS3]]> - display an previous question.]]> - - - - - - - - - - - - - - - - <![CDATA[QCS3]]> - - - - - - - - - - - - - - - - - <![CDATA[AF]]> - - - - - - - - - - - - - - - - - <![CDATA[AF]]> - - - - - - - - - - - - - - - - - <![CDATA[AF]]> - - - - - - - - - - - - - - - - - <![CDATA[FAF]]> - - - - - - - - - - - - - - - - - <![CDATA[FAF]]> - - - - - - - - - - - - - - - - - <![CDATA[FAF]]> - - - - - - - - - - - - - - - - - <![CDATA[FAFE]]> - - - - - - - - - - - - - - - - - <![CDATA[FAFE]]> - - - - - - - - - - - - - - - - - <![CDATA[FAFE]]> - - - - - - - - - - -
      -
      - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ003]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ003]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ003]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ003]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ003]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ003]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ004]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ004]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ004]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SH101]]> - - - - - - - - - - - - - - - - - <![CDATA[SH101]]> - - - - - - - - - - - - - - - - - <![CDATA[SH101]]> - - - - - - - - - - - - - - - - - <![CDATA[SH102]]> - - - - - - - - - - - - - - - - - <![CDATA[SH102]]> - - - - - - - - - - - - - - - - - <![CDATA[SH102]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ201]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ201]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ201]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ202]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ202]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ202]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ05]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ05]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ05]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - alert(bravo);]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - Dies ist die Willkommensnachricht des Fragebogens. Sie kann unter Fragebogeneinstellungen -> Texte angepasst werden.

      -]]>
      - - - - - - - - - - - - - - - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hallo, - -Eine neue Antwort wurde für die Umfrage '{SURVEYNAME}' abgegeben. - -Klicke auf den folgenden Link um die Umfrage neu zu laden: -{RELOADURL} - -Klicke auf den folgenden Link um den Antwortdatensatz anzusehen: -{VIEWRESPONSEURL} - -Klicke auf den folgenden Link um den Antwortdatensatz zu bearbeiten: -{EDITRESPONSEURL} - -Um die Statistik zu sehen, klicke hier: -{STATISTICSURL} - - -Die folgenden Antworten wurden vom Teilnehmer gegeben: -{ANSWERTABLE}]]> - -
      - - - - - - - This is the welcome text for the survey! You can can edit it in the survey properties.

      -]]>
      - - This is the end message for the survey! A good place to thank you to answer to this survey.

      -

      - LimeSurvey : THE survey software is a free software, help LimeSurvey project : donate

      -]]>
      - - - -
      You have been invited to participate in a survey.

      The survey is titled:
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      To participate, please click on the link below.

      Sincerely,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Click here to do the survey:
      {SURVEYURL}

      If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
      {OPTOUTURL}]]>
      - -
      Recently we invited you to participate in a survey.

      We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

      The survey is titled:
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      To participate, please click on the link below.

      Sincerely,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Click here to do the survey:
      {SURVEYURL}

      If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
      {OPTOUTURL}]]>
      - -
      You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

      To complete this survey, click on the following URL:

      {SURVEYURL}

      If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
      - -
      This email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

      If you have any further questions about this email, please contact {ADMINNAME} at {ADMINEMAIL}.

      Sincerely,

      {ADMINNAME}]]>
      - - - - - - -
      - - - - - - - Ceci est le message d'accueil de votre sondage !! Vous pouvez l'éditer dans les paramètres du questionnaire.

      -]]>
      - - Ceci est le message de fin de votre questionnaire ! Un bon endroit pour vous remercier d'avoir répondu à ce questionnaire.

      -

      - LimeSurvey : THE survey software est un logiciel libre, pour soutenir le projet : donation

      -]]>
      - - - -
      Vous avez été invité à participer à un questionnaire.

      Celui-ci est intitulé :
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      Pour participer, veuillez cliquer sur le lien ci-dessous.

      Cordialement,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Cliquez ici pour remplir ce questionnaire :
      {SURVEYURL}

      Si vous ne souhaitez pas participer à ce questionnaire et ne souhaitez plus recevoir aucune invitation, veuillez cliquer sur le lien suivant :
      {OPTOUTURL}]]>
      - -
      Vous avez été invité à participer à un questionnaire récemment.

      Nous avons pris en compte que vous n'avez pas encore complété le questionnaire, et nous vous rappelons que celui-ci est toujours disponible si vous souhaitez participer.

      Le questionnaire est intitulé :
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      Pour participer, veuillez cliquer sur le lien ci-dessous.

      Cordialement,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Cliquez ici pour faire le questionnaire:
      {SURVEYURL}

      Si vous ne souhaitez pas participer à ce questionnaire et ne souhaitez plus recevoir aucune invitation, veuillez cliquer sur le lien suivant :
      {OPTOUTURL}]]>
      - -
      Vous (ou quelqu'un utilisant votre adresse électronique) vous êtes enregistré pour participer à un questionnaire en ligne intitulé {SURVEYNAME}.

      Pour compléter ce questionnaire, cliquez sur le lien suivant :

      {SURVEYURL}

      Si vous avez des questions à propos de ce questionnaire, ou si vous ne vous êtes pas enregistré pour participer à celui-ci et croyez que ce courriel est une erreur, veuillez contacter {ADMINNAME} sur {ADMINEMAIL}]]>
      - -
      Ce courriel vous confirme que vous avez complété le questionnaire intitulé {SURVEYNAME} et que votre réponse a été enregistrée. Merci pour votre participation.

      Si vous avez des questions à propos de ce courriel, veuillez contacter {ADMINNAME} sur {ADMINEMAIL}.

      Cordialement,

      {ADMINNAME}]]>
      - - - - - - -
      -
      -
      -
      diff --git a/include/limesurvey/docs/demosurveys/limesurvey2_sample_survey_english.lss b/include/limesurvey/docs/demosurveys/limesurvey2_sample_survey_english.lss deleted file mode 100644 index 7530b2d2..00000000 --- a/include/limesurvey/docs/demosurveys/limesurvey2_sample_survey_english.lss +++ /dev/null @@ -1,35724 +0,0 @@ - - - Survey - 154 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - specialtype - scale_id - sqid - language - defaultvalue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - -Please make sure that num is less than num2, otherwise you won't be able to answer some of the validation tests.
      -Also, in order to see the Dynamic Relevance page, the value for num must be greater than 10.]]>
      - - - -
      - - - - - - -This page is only shown when num from the previous page is greater than 10. It's current value is {num}.
      -You must enter values for age and yearsMarried in order to complete some of the Validation Tests later in this survey; and age must be greater than yearsMarried.]]>
      - - - 10]]> -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[math]]> - -
      FunctionSyntaxResult
      Absolute valueabs({num}){if(is_numeric(num),abs(num),'')}
      Arc cosineacos({num}){if(is_numeric(num),acos(num),'')}
      Arc sineasin({num}){if(is_numeric(num),asin(num),'')}
      Arc tangent of two variablesatan2({num},{num2}){if(is_numeric(num) && is_numeric(num2),atan2(num,num2),'')}
      Arc tangentatan({num}){if(is_numeric(num),atan(num),'')}
      Round fractions upceil({num}){if(is_numeric(num),ceil(num),'')}
      Cosinecos({num}){if(is_numeric(num),cos(num),'')}
      Calculates the exponent of eexp({num}){if(is_numeric(num),exp(num),'')}
      Round fractions downfloor({num}){if(is_numeric(num),floor(num),'')}
      Finds whether a value is not a numberis_nan({num}){if(is_numeric(num),is_nan(num),'')}
      Natural logarithmlog({num}){if(is_numeric(num),log(num),'')}
      Get value of pipi(){pi()}
      Exponential expressionpow({num},{num2}){if(is_numeric(num) && is_numeric(num2),pow(num,num2),'')}
      Generate a random integerrand(){rand()}
      Rounds a floatround({num}){if(is_numeric(num),round(num),'')}
      Sinesin({num}){if(is_numeric(num),sin(num),'')}
      Square rootsqrt({num}){if(is_numeric(num),sqrt(num),'')}
      Calculate the sum of values in an arraysum({num}){if(is_numeric(num),sum(num),'')}
      Tangenttan({num}){if(is_numeric(num),tan(num),'')}
      Find lowest valuemin({num2},{num},{num}+{num2},{num}-{num2},{num}*{num2},{num}/2){if(is_numeric(num),min(num2,num,num+num2,num-num2,num*num2,num/2),'')}
      Find highest valuemax({num2},{num},{num}+{num2},{num}-{num2},{num}*{num2},{num}/2){if(is_numeric(num),max(num2,num,num+num2,num-num2,num*num2,num/2),'')}
      Sumsum({num2},{num},{num}+{num2},{num}-{num2},{num}*{num2},{num}/2){if(is_numeric(num),sum(num2,num,num+num2,num-num2,num*num2,num/2),'')}
      Join array elements with a stringimplode('~',{num2},{num},{num}+{num2},{num}-{num2},{num}*{num2},{num}/2){implode('~',num2,num,num+num2,num-num2,num*num2,num/2)}
      Get the integer value of a variableintval({num}){if(is_numeric(num),intval(num),'')}
      Finds whether the type of a variable is floatis_float({num}){if(is_numeric(num),is_float(num),'')}
      Finds whether the type of a variable is integeris_int({num}){if(is_numeric(num),is_int(num),'')}
      Finds whether the type of a variable is NULLis_null({num}){is_null(num)}
      Finds whether a variable is a number or a numeric stringis_numeric({num}){is_numeric(num)}
      Finds whether the type of a variable is stringis_string({num}){is_string(num)}
      Determine whether a variable is considered to be emptyis_empty({num}){is_empty(num)}
      ]]> - - - - - - - - - - - - - - - - - <![CDATA[num]]> - - - - - - - - - - - - - - - - - - <![CDATA[num]]> - - - - - - - - - - - - - - - - - - <![CDATA[num]]> - - - - - - - - - - - - - - - - - - <![CDATA[num2]]> - - - - - - - - - - - - - - - - - - <![CDATA[num2]]> - - - - - - - - - - - - - - - - - - <![CDATA[num2]]> - - - - - - - - - - - - - - - - - - <![CDATA[name]]> - - - - - - - - - - - - - - - - - - <![CDATA[name]]> - - - - - - - - - - - - - - - - - - <![CDATA[name]]> - - - - - - - - - - - - - - - - - - <![CDATA[age]]> - - - - - - - - - - - - - - - - - - <![CDATA[age]]> - - - - - - - - - - - - - - - - - - <![CDATA[age]]> - - - - - - - - - - - - - - - - - - <![CDATA[married]]> - - - 5 (and one hopes much older)]]> - - - - - - - 5]]> - - - - - - - - <![CDATA[married]]> - - - 5 (and one hopes much older)]]> - - - - - - - 5]]> - - - - - - - - <![CDATA[married]]> - - - 5 (and one hopes much older)]]> - - - - - - - 5]]> - - - - - - - - <![CDATA[numKids]]> - - - 11 (and one hopes much older)]]> - - - - - - - 11]]> - - - - - - - - <![CDATA[numKids]]> - - - 11 (and one hopes much older)]]> - - - - - - - 11]]> - - - - - - - - <![CDATA[numKids]]> - - - 11 (and one hopes much older)]]> - - - - - - - 11]]> - - - - - - - - <![CDATA[message2]]> - -{if(is_empty(name),'',if(is_empty(age),'How old are you?',implode(' ','So, you are',age,'years old. Funny, you don\'t look it.')))}
      -{if(numKids>0,implode(' ','I hope you enjoy playing with your',if(numKids==1,'child!',implode(' ',numKids,'children!')),' I love my two girls!'),'')}
      -{if(numKids>1,implode('','The sum of the ages of your first ',min(5,numKids),' children is ',sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK),''),'')}
      -{if(sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)>age,'Wow, that means that the combined age of your children exceeds your own!','')}
      -{if((married=='Y' and max(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)>yearsMarried),'Hmmm, your oldest child is older than your marriage. Interesting.','')}]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[yearsMarried]]> - - - - - - - - - - - - - - - - - - <![CDATA[yearsMarried]]> - - - - - - - - - - - - - - - - - - <![CDATA[yearsMarried]]> - - - - - - - - - - - - - - - - - - <![CDATA[kid1]]> - - - - - - - - - - = 1]]> - - - - - - - - <![CDATA[kid1]]> - - - - - - - - - - = 1]]> - - - - - - - - <![CDATA[kid1]]> - - - - - - - - - - = 1]]> - - - - - - - - <![CDATA[kid2]]> - - - - - - - - - - = 2]]> - - - - - - - - <![CDATA[kid2]]> - - - - - - - - - - = 2]]> - - - - - - - - <![CDATA[kid2]]> - - - - - - - - - - = 2]]> - - - - - - - - <![CDATA[kid3]]> - - - - - - - - - - = 3]]> - - - - - - - - <![CDATA[kid3]]> - - - - - - - - - - = 3]]> - - - - - - - - <![CDATA[kid3]]> - - - - - - - - - - = 3]]> - - - - - - - - <![CDATA[kid4]]> - - - - - - - - - - = 4]]> - - - - - - - - <![CDATA[kid4]]> - - - - - - - - - - = 4]]> - - - - - - - - <![CDATA[kid4]]> - - - - - - - - - - = 4]]> - - - - - - - - <![CDATA[kid5]]> - - - - - - - - - - = 5]]> - - - - - - - - <![CDATA[kid5]]> - - - - - - - - - - = 5]]> - - - - - - - - <![CDATA[kid5]]> - - - - - - - - - - = 5]]> - - - - - - - - <![CDATA[q5pointChoice]]> - How much do you like LimeSurvey?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[q5pointChoice]]> - How much do you like LimeSurvey?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[q5pointChoice]]> - How much do you like LimeSurvey?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListDropdown]]> - - What is your favorite pastime?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListDropdown]]> - - What is your favorite pastime?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListDropdown]]> - - What is your favorite pastime?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListRadio]]> - - What is your favorite color?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListRadio]]> - - What is your favorite color?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListRadio]]> - - What is your favorite color?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListWithComment]]> - Who is your favorite relative?  Why?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListWithComment]]> - Who is your favorite relative?  Why?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListWithComment]]> - Who is your favorite relative?  Why?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray]]> - How much do you like these foods?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray]]> - How much do you like these foods?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray]]> - How much do you like these foods?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray10Point]]> - How much pain to you currently feel in the following locations?  1 = none, 10 = extreme

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray10Point]]> - How much pain to you currently feel in the following locations?  1 = none, 10 = extreme

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray10Point]]> - How much pain to you currently feel in the following locations?  1 = none, 10 = extreme

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray5Point]]> - How much do you like the following?  (1 = not at all, 5 = extremely)

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray5Point]]> - How much do you like the following?  (1 = not at all, 5 = extremely)

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray5Point]]> - How much do you like the following?  (1 = not at all, 5 = extremely)

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayISD]]> - How should the following change?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayISD]]> - How should the following change?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayISD]]> - How should the following change?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayNumbers]]> - How long should it take to fix the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayNumbers]]> - How long should it take to fix the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayNumbers]]> - How long should it take to fix the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayTexts]]> - Who are your favorite characters in the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayTexts]]> - Who are your favorite characters in the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayTexts]]> - Who are your favorite characters in the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayYNU]]> - Which of the following conditions have you had?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayYNU]]> - Which of the following conditions have you had?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayYNU]]> - Which of the following conditions have you had?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayByColumn]]> - How tall are the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayByColumn]]> - How tall are the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayByColumn]]> - How tall are the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayDualScale]]> - For each of these issues, how severe and bothersome are they?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayDualScale]]> - For each of these issues, how severe and bothersome are they?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayDualScale]]> - For each of these issues, how severe and bothersome are they?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qDate]]> - When was your most recent birthday?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qDate]]> - When was your most recent birthday?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qDate]]> - When was your most recent birthday?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qFileUpload]]> - Please upload a picture

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qFileUpload]]> - Please upload a picture

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qFileUpload]]> - Please upload a picture

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qGender]]> - What gender are you?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qGender]]> - What gender are you?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qGender]]> - What gender are you?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qLanguage]]> - Pick a new language

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qLanguage]]> - Pick a new language

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qLanguage]]> - Pick a new language

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleNumerical]]> - How old are the following people (or how old were  they when they died)?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleNumerical]]> - How old are the following people (or how old were  they when they died)?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleNumerical]]> - How old are the following people (or how old were  they when they died)?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qNumerical]]> - How old are you?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qNumerical]]> - How old are you?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qNumerical]]> - How old are you?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qRanking]]> - Please rate your  favorite activities:

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qRanking]]> - Please rate your  favorite activities:

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qRanking]]> - Please rate your  favorite activities:

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qTextDisplay]]> - This is just a text display.  Is the rendered value saved anywhere?  Is there a database field for it (e.g. to emulate the Equation question type)?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qTextDisplay]]> - This is just a text display.  Is the rendered value saved anywhere?  Is there a database field for it (e.g. to emulate the Equation question type)?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qTextDisplay]]> - This is just a text display.  Is the rendered value saved anywhere?  Is there a database field for it (e.g. to emulate the Equation question type)?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qYesNo]]> - Do you love LimeSurvey?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qYesNo]]> - Do you love LimeSurvey?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qYesNo]]> - Do you love LimeSurvey?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qHugeText]]> - - Please paste your resume

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qHugeText]]> - - Please paste your resume

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qHugeText]]> - - Please paste your resume

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qLongText]]> - Please write an essay saying  how much you love LimeSurvey.

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qLongText]]> - Please write an essay saying  how much you love LimeSurvey.

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qLongText]]> - Please write an essay saying  how much you love LimeSurvey.

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleShort]]> - What are the names of your best friends?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleShort]]> - What are the names of your best friends?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleShort]]> - What are the names of your best friends?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qShort]]> - What is your favorite food?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qShort]]> - What is your favorite food?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qShort]]> - What is your favorite food?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleChoice]]> - Where would you like to vacation this year?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleChoice]]> - Where would you like to vacation this year?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleChoice]]> - Where would you like to vacation this year?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultChoiceComment]]> - Which of the following  do you like?   Please comment why or why not for each.

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultChoiceComment]]> - Which of the following  do you like?   Please comment why or why not for each.

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultChoiceComment]]> - Which of the following  do you like?   Please comment why or why not for each.

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[OnPageRelevance]]> - - - - - - - - - - - - - - - - - - <![CDATA[OnPageRelevance]]> - - - - - - - - - - - - - - - - - - <![CDATA[OnPageRelevance]]> - - - - - - - - - - - - - - - - - - <![CDATA[showAny]]> - - - - - - - - - - - - - - - - - - <![CDATA[tThanks]]> - - You're all done, thanks!

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[tThanks]]> - - You're all done, thanks!

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[tThanks]]> - - You're all done, thanks!

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[tSummary1]]> - -Question#QuestionResponseCodeResponse -num{num.question}{num}{num.shown} -num2{num2.question}{num2}{num2.shown} -showAny{showAny.question}{showAny}{showAny.shown} -name{name.question}{name}{name.shown} -age{age.question}{age}{age.shown} -married{married.question}{married}{married.shown} -yearsMarried{yearsMarried.question}{yearsMarried}{yearsMarried.shown} -numKids{numKids.question}{numKids}{numKids.shown} -kid1{kid1.question}{kid1}{kid1.shown} -kid2{kid2.question}{kid2}{kid2.shown} -kid3{kid3.question}{kid3}{kid3.shown} -kid4{kid4.question}{kid4}{kid4.shown} -kid5{kid5.question}{kid5}{kid5.shown} -q5pointChoice{q5pointChoice.question}{q5pointChoice}{q5pointChoice.shown} -qListDropdown{qListDropdown.question}{qListDropdown}{qListDropdown.shown} -qListRadio{qListRadio.question}{qListRadio}{qListRadio.shown} -qListWithComment{qListWithComment.question}{qListWithComment}{qListWithComment.shown} -qListWithComment_comment{qListWithComment_comment.question}{qListWithComment_comment}{qListWithComment_comment.shown} -qArray_F1{qArray_F1.question}{qArray_F1}{qArray_F1.shown} -qArray_F2{qArray_F2.question}{qArray_F2}{qArray_F2.shown} -qArray_F3{qArray_F3.question}{qArray_F3}{qArray_F3.shown} -qArray_F4{qArray_F4.question}{qArray_F4}{qArray_F4.shown} -qArray_F5{qArray_F5.question}{qArray_F5}{qArray_F5.shown} -qArray10Point_L1{qArray10Point_L1.question}{qArray10Point_L1}{qArray10Point_L1.shown} -qArray10Point_L2{qArray10Point_L2.question}{qArray10Point_L2}{qArray10Point_L2.shown} -qArray10Point_L3{qArray10Point_L3.question}{qArray10Point_L3}{qArray10Point_L3.shown} -qArray10Point_L4{qArray10Point_L4.question}{qArray10Point_L4}{qArray10Point_L4.shown} -qArray10Point_L5{qArray10Point_L5.question}{qArray10Point_L5}{qArray10Point_L5.shown} -qArray10Point_L6{qArray10Point_L6.question}{qArray10Point_L6}{qArray10Point_L6.shown} -qArray5Point_1{qArray5Point_1.question}{qArray5Point_1}{qArray5Point_1.shown} -qArray5Point_2{qArray5Point_2.question}{qArray5Point_2}{qArray5Point_2.shown} -qArray5Point_3{qArray5Point_3.question}{qArray5Point_3}{qArray5Point_3.shown} -qArray5Point_4{qArray5Point_4.question}{qArray5Point_4}{qArray5Point_4.shown} -qArray5Point_5{qArray5Point_5.question}{qArray5Point_5}{qArray5Point_5.shown} -qArray5Point_6{qArray5Point_6.question}{qArray5Point_6}{qArray5Point_6.shown} -qArrayISD_1{qArrayISD_1.question}{qArrayISD_1}{qArrayISD_1.shown} -qArrayISD_2{qArrayISD_2.question}{qArrayISD_2}{qArrayISD_2.shown} -qArrayISD_3{qArrayISD_3.question}{qArrayISD_3}{qArrayISD_3.shown} -qArrayISD_4{qArrayISD_4.question}{qArrayISD_4}{qArrayISD_4.shown} -qArrayISD_5{qArrayISD_5.question}{qArrayISD_5}{qArrayISD_5.shown} -qArrayISD_6{qArrayISD_6.question}{qArrayISD_6}{qArrayISD_6.shown} -qArrayISD_7{qArrayISD_7.question}{qArrayISD_7}{qArrayISD_7.shown} -qArrayNumbers_ls1_min{qArrayNumbers_ls1_min.question}{qArrayNumbers_ls1_min}{qArrayNumbers_ls1_min.shown} -qArrayNumbers_ls1_max{qArrayNumbers_ls1_max.question}{qArrayNumbers_ls1_max}{qArrayNumbers_ls1_max.shown} -qArrayNumbers_ls1_avg{qArrayNumbers_ls1_avg.question}{qArrayNumbers_ls1_avg}{qArrayNumbers_ls1_avg.shown} -qArrayNumbers_todo_min{qArrayNumbers_todo_min.question}{qArrayNumbers_todo_min}{qArrayNumbers_todo_min.shown} -qArrayNumbers_todo_max{qArrayNumbers_todo_max.question}{qArrayNumbers_todo_max}{qArrayNumbers_todo_max.shown} -qArrayNumbers_todo_avg{qArrayNumbers_todo_avg.question}{qArrayNumbers_todo_avg}{qArrayNumbers_todo_avg.shown} -qArrayNumbers_honey_min{qArrayNumbers_honey_min.question}{qArrayNumbers_honey_min}{qArrayNumbers_honey_min.shown} -qArrayNumbers_honey_max{qArrayNumbers_honey_max.question}{qArrayNumbers_honey_max}{qArrayNumbers_honey_max.shown} -qArrayNumbers_honey_avg{qArrayNumbers_honey_avg.question}{qArrayNumbers_honey_avg}{qArrayNumbers_honey_avg.shown} -qArrayNumbers_econ_min{qArrayNumbers_econ_min.question}{qArrayNumbers_econ_min}{qArrayNumbers_econ_min.shown} -qArrayNumbers_econ_max{qArrayNumbers_econ_max.question}{qArrayNumbers_econ_max}{qArrayNumbers_econ_max.shown} -qArrayNumbers_econ_avg{qArrayNumbers_econ_avg.question}{qArrayNumbers_econ_avg}{qArrayNumbers_econ_avg.shown} -qArrayTexts_hp_1st{qArrayTexts_hp_1st.question}{qArrayTexts_hp_1st}{qArrayTexts_hp_1st.shown} -qArrayTexts_hp_2nd{qArrayTexts_hp_2nd.question}{qArrayTexts_hp_2nd}{qArrayTexts_hp_2nd.shown} -qArrayTexts_hp_3rd{qArrayTexts_hp_3rd.question}{qArrayTexts_hp_3rd}{qArrayTexts_hp_3rd.shown} -qArrayTexts_st_1st{qArrayTexts_st_1st.question}{qArrayTexts_st_1st}{qArrayTexts_st_1st.shown} -qArrayTexts_st_2nd{qArrayTexts_st_2nd.question}{qArrayTexts_st_2nd}{qArrayTexts_st_2nd.shown} -qArrayTexts_st_3rd{qArrayTexts_st_3rd.question}{qArrayTexts_st_3rd}{qArrayTexts_st_3rd.shown} -qArrayTexts_sw_1st{qArrayTexts_sw_1st.question}{qArrayTexts_sw_1st}{qArrayTexts_sw_1st.shown} -qArrayTexts_sw_2nd{qArrayTexts_sw_2nd.question}{qArrayTexts_sw_2nd}{qArrayTexts_sw_2nd.shown} -qArrayTexts_sw_3rd{qArrayTexts_sw_3rd.question}{qArrayTexts_sw_3rd}{qArrayTexts_sw_3rd.shown} -qArrayYNU_1{qArrayYNU_1.question}{qArrayYNU_1}{qArrayYNU_1.shown} -qArrayYNU_2{qArrayYNU_2.question}{qArrayYNU_2}{qArrayYNU_2.shown} -qArrayYNU_3{qArrayYNU_3.question}{qArrayYNU_3}{qArrayYNU_3.shown} -qArrayYNU_4{qArrayYNU_4.question}{qArrayYNU_4}{qArrayYNU_4.shown} -qArrayYNU_5{qArrayYNU_5.question}{qArrayYNU_5}{qArrayYNU_5.shown} -qArrayByColumn_1{qArrayByColumn_1.question}{qArrayByColumn_1}{qArrayByColumn_1.shown} -qArrayByColumn_2{qArrayByColumn_2.question}{qArrayByColumn_2}{qArrayByColumn_2.shown} -qArrayByColumn_3{qArrayByColumn_3.question}{qArrayByColumn_3}{qArrayByColumn_3.shown} -qArrayByColumn_4{qArrayByColumn_4.question}{qArrayByColumn_4}{qArrayByColumn_4.shown} -qArrayByColumn_5{qArrayByColumn_5.question}{qArrayByColumn_5}{qArrayByColumn_5.shown} -qArrayDualScale_money_0{qArrayDualScale_money_0.question}{qArrayDualScale_money_0}{qArrayDualScale_money_0.shown} -qArrayDualScale_money_1{qArrayDualScale_money_1.question}{qArrayDualScale_money_1}{qArrayDualScale_money_1.shown} -qArrayDualScale_health_0{qArrayDualScale_health_0.question}{qArrayDualScale_health_0}{qArrayDualScale_health_0.shown} -qArrayDualScale_health_1{qArrayDualScale_health_1.question}{qArrayDualScale_health_1}{qArrayDualScale_health_1.shown} -qArrayDualScale_md_0{qArrayDualScale_md_0.question}{qArrayDualScale_md_0}{qArrayDualScale_md_0.shown} -qArrayDualScale_md_1{qArrayDualScale_md_1.question}{qArrayDualScale_md_1}{qArrayDualScale_md_1.shown} -qDate{qDate.question}{qDate}{qDate.shown} -qFileUpload{qFileUpload.question}{qFileUpload}{qFileUpload.shown} -qGender{qGender.question}{qGender}{qGender.shown} -qLanguage{qLanguage.question}{qLanguage}{qLanguage.shown} -qMultipleNumerical_self{qMultipleNumerical_self.question}{qMultipleNumerical_self}{qMultipleNumerical_self.shown} -qMultipleNumerical_mom{qMultipleNumerical_mom.question}{qMultipleNumerical_mom}{qMultipleNumerical_mom.shown} -qMultipleNumerical_dad{qMultipleNumerical_dad.question}{qMultipleNumerical_dad}{qMultipleNumerical_dad.shown} -qNumerical{qNumerical.question}{qNumerical}{qNumerical.shown} -qRanking_1{qRanking_1.question}{qRanking_1}{qRanking_1.shown} -qRanking_2{qRanking_2.question}{qRanking_2}{qRanking_2.shown} -qRanking_3{qRanking_3.question}{qRanking_3}{qRanking_3.shown} -qRanking_4{qRanking_4.question}{qRanking_4}{qRanking_4.shown} -qTextDisplay{qTextDisplay.question}{qTextDisplay}{qTextDisplay.shown} -qYesNo{qYesNo.question}{qYesNo}{qYesNo.shown} -qHugeText{qHugeText.question}{qHugeText}{qHugeText.shown} -qLongText{qLongText.question}{qLongText}{qLongText.shown} -qMultipleShort_friend{qMultipleShort_friend.question}{qMultipleShort_friend}{qMultipleShort_friend.shown} -qMultipleShort_family{qMultipleShort_family.question}{qMultipleShort_family}{qMultipleShort_family.shown} -qMultipleShort_work{qMultipleShort_work.question}{qMultipleShort_work}{qMultipleShort_work.shown} -qShort{qShort.question}{qShort}{qShort.shown} -qMultipleChoice_Hawaii{qMultipleChoice_Hawaii.question}{qMultipleChoice_Hawaii}{qMultipleChoice_Hawaii.shown} -qMultipleChoice_Bahamas{qMultipleChoice_Bahamas.question}{qMultipleChoice_Bahamas}{qMultipleChoice_Bahamas.shown} -qMultipleChoice_NewZealand{qMultipleChoice_NewZealand.question}{qMultipleChoice_NewZealand}{qMultipleChoice_NewZealand.shown} -qMultChoiceComment_junk{qMultChoiceComment_junk.question}{qMultChoiceComment_junk}{qMultChoiceComment_junk.shown} -qMultChoiceComment_junkcomment{qMultChoiceComment_junkcomment.question}{qMultChoiceComment_junkcomment}{qMultChoiceComment_junkcomment.shown} -qMultChoiceComment_rtv{qMultChoiceComment_rtv.question}{qMultChoiceComment_rtv}{qMultChoiceComment_rtv.shown} -qMultChoiceComment_rtvcomment{qMultChoiceComment_rtvcomment.question}{qMultChoiceComment_rtvcomment}{qMultChoiceComment_rtvcomment.shown} -qMultChoiceComment_ex{qMultChoiceComment_ex.question}{qMultChoiceComment_ex}{qMultChoiceComment_ex.shown} -qMultChoiceComment_excomment{qMultChoiceComment_excomment.question}{qMultChoiceComment_excomment}{qMultChoiceComment_excomment.shown} -]]> - - - - - - - - - - - - - - - - - <![CDATA[tSummary1]]> - -Question#QuestionResponseCodeResponse -num{num.question}{num}{num.shown} -num2{num2.question}{num2}{num2.shown} -showAny{showAny.question}{showAny}{showAny.shown} -name{name.question}{name}{name.shown} -age{age.question}{age}{age.shown} -married{married.question}{married}{married.shown} -yearsMarried{yearsMarried.question}{yearsMarried}{yearsMarried.shown} -numKids{numKids.question}{numKids}{numKids.shown} -kid1{kid1.question}{kid1}{kid1.shown} -kid2{kid2.question}{kid2}{kid2.shown} -kid3{kid3.question}{kid3}{kid3.shown} -kid4{kid4.question}{kid4}{kid4.shown} -kid5{kid5.question}{kid5}{kid5.shown} -q5pointChoice{q5pointChoice.question}{q5pointChoice}{q5pointChoice.shown} -qListDropdown{qListDropdown.question}{qListDropdown}{qListDropdown.shown} -qListRadio{qListRadio.question}{qListRadio}{qListRadio.shown} -qListWithComment{qListWithComment.question}{qListWithComment}{qListWithComment.shown} -qListWithComment_comment{qListWithComment_comment.question}{qListWithComment_comment}{qListWithComment_comment.shown} -qArray_F1{qArray_F1.question}{qArray_F1}{qArray_F1.shown} -qArray_F2{qArray_F2.question}{qArray_F2}{qArray_F2.shown} -qArray_F3{qArray_F3.question}{qArray_F3}{qArray_F3.shown} -qArray_F4{qArray_F4.question}{qArray_F4}{qArray_F4.shown} -qArray_F5{qArray_F5.question}{qArray_F5}{qArray_F5.shown} -qArray10Point_L1{qArray10Point_L1.question}{qArray10Point_L1}{qArray10Point_L1.shown} -qArray10Point_L2{qArray10Point_L2.question}{qArray10Point_L2}{qArray10Point_L2.shown} -qArray10Point_L3{qArray10Point_L3.question}{qArray10Point_L3}{qArray10Point_L3.shown} -qArray10Point_L4{qArray10Point_L4.question}{qArray10Point_L4}{qArray10Point_L4.shown} -qArray10Point_L5{qArray10Point_L5.question}{qArray10Point_L5}{qArray10Point_L5.shown} -qArray10Point_L6{qArray10Point_L6.question}{qArray10Point_L6}{qArray10Point_L6.shown} -qArray5Point_1{qArray5Point_1.question}{qArray5Point_1}{qArray5Point_1.shown} -qArray5Point_2{qArray5Point_2.question}{qArray5Point_2}{qArray5Point_2.shown} -qArray5Point_3{qArray5Point_3.question}{qArray5Point_3}{qArray5Point_3.shown} -qArray5Point_4{qArray5Point_4.question}{qArray5Point_4}{qArray5Point_4.shown} -qArray5Point_5{qArray5Point_5.question}{qArray5Point_5}{qArray5Point_5.shown} -qArray5Point_6{qArray5Point_6.question}{qArray5Point_6}{qArray5Point_6.shown} -qArrayISD_1{qArrayISD_1.question}{qArrayISD_1}{qArrayISD_1.shown} -qArrayISD_2{qArrayISD_2.question}{qArrayISD_2}{qArrayISD_2.shown} -qArrayISD_3{qArrayISD_3.question}{qArrayISD_3}{qArrayISD_3.shown} -qArrayISD_4{qArrayISD_4.question}{qArrayISD_4}{qArrayISD_4.shown} -qArrayISD_5{qArrayISD_5.question}{qArrayISD_5}{qArrayISD_5.shown} -qArrayISD_6{qArrayISD_6.question}{qArrayISD_6}{qArrayISD_6.shown} -qArrayISD_7{qArrayISD_7.question}{qArrayISD_7}{qArrayISD_7.shown} -qArrayNumbers_ls1_min{qArrayNumbers_ls1_min.question}{qArrayNumbers_ls1_min}{qArrayNumbers_ls1_min.shown} -qArrayNumbers_ls1_max{qArrayNumbers_ls1_max.question}{qArrayNumbers_ls1_max}{qArrayNumbers_ls1_max.shown} -qArrayNumbers_ls1_avg{qArrayNumbers_ls1_avg.question}{qArrayNumbers_ls1_avg}{qArrayNumbers_ls1_avg.shown} -qArrayNumbers_todo_min{qArrayNumbers_todo_min.question}{qArrayNumbers_todo_min}{qArrayNumbers_todo_min.shown} -qArrayNumbers_todo_max{qArrayNumbers_todo_max.question}{qArrayNumbers_todo_max}{qArrayNumbers_todo_max.shown} -qArrayNumbers_todo_avg{qArrayNumbers_todo_avg.question}{qArrayNumbers_todo_avg}{qArrayNumbers_todo_avg.shown} -qArrayNumbers_honey_min{qArrayNumbers_honey_min.question}{qArrayNumbers_honey_min}{qArrayNumbers_honey_min.shown} -qArrayNumbers_honey_max{qArrayNumbers_honey_max.question}{qArrayNumbers_honey_max}{qArrayNumbers_honey_max.shown} -qArrayNumbers_honey_avg{qArrayNumbers_honey_avg.question}{qArrayNumbers_honey_avg}{qArrayNumbers_honey_avg.shown} -qArrayNumbers_econ_min{qArrayNumbers_econ_min.question}{qArrayNumbers_econ_min}{qArrayNumbers_econ_min.shown} -qArrayNumbers_econ_max{qArrayNumbers_econ_max.question}{qArrayNumbers_econ_max}{qArrayNumbers_econ_max.shown} -qArrayNumbers_econ_avg{qArrayNumbers_econ_avg.question}{qArrayNumbers_econ_avg}{qArrayNumbers_econ_avg.shown} -qArrayTexts_hp_1st{qArrayTexts_hp_1st.question}{qArrayTexts_hp_1st}{qArrayTexts_hp_1st.shown} -qArrayTexts_hp_2nd{qArrayTexts_hp_2nd.question}{qArrayTexts_hp_2nd}{qArrayTexts_hp_2nd.shown} -qArrayTexts_hp_3rd{qArrayTexts_hp_3rd.question}{qArrayTexts_hp_3rd}{qArrayTexts_hp_3rd.shown} -qArrayTexts_st_1st{qArrayTexts_st_1st.question}{qArrayTexts_st_1st}{qArrayTexts_st_1st.shown} -qArrayTexts_st_2nd{qArrayTexts_st_2nd.question}{qArrayTexts_st_2nd}{qArrayTexts_st_2nd.shown} -qArrayTexts_st_3rd{qArrayTexts_st_3rd.question}{qArrayTexts_st_3rd}{qArrayTexts_st_3rd.shown} -qArrayTexts_sw_1st{qArrayTexts_sw_1st.question}{qArrayTexts_sw_1st}{qArrayTexts_sw_1st.shown} -qArrayTexts_sw_2nd{qArrayTexts_sw_2nd.question}{qArrayTexts_sw_2nd}{qArrayTexts_sw_2nd.shown} -qArrayTexts_sw_3rd{qArrayTexts_sw_3rd.question}{qArrayTexts_sw_3rd}{qArrayTexts_sw_3rd.shown} -qArrayYNU_1{qArrayYNU_1.question}{qArrayYNU_1}{qArrayYNU_1.shown} -qArrayYNU_2{qArrayYNU_2.question}{qArrayYNU_2}{qArrayYNU_2.shown} -qArrayYNU_3{qArrayYNU_3.question}{qArrayYNU_3}{qArrayYNU_3.shown} -qArrayYNU_4{qArrayYNU_4.question}{qArrayYNU_4}{qArrayYNU_4.shown} -qArrayYNU_5{qArrayYNU_5.question}{qArrayYNU_5}{qArrayYNU_5.shown} -qArrayByColumn_1{qArrayByColumn_1.question}{qArrayByColumn_1}{qArrayByColumn_1.shown} -qArrayByColumn_2{qArrayByColumn_2.question}{qArrayByColumn_2}{qArrayByColumn_2.shown} -qArrayByColumn_3{qArrayByColumn_3.question}{qArrayByColumn_3}{qArrayByColumn_3.shown} -qArrayByColumn_4{qArrayByColumn_4.question}{qArrayByColumn_4}{qArrayByColumn_4.shown} -qArrayByColumn_5{qArrayByColumn_5.question}{qArrayByColumn_5}{qArrayByColumn_5.shown} -qArrayDualScale_money_0{qArrayDualScale_money_0.question}{qArrayDualScale_money_0}{qArrayDualScale_money_0.shown} -qArrayDualScale_money_1{qArrayDualScale_money_1.question}{qArrayDualScale_money_1}{qArrayDualScale_money_1.shown} -qArrayDualScale_health_0{qArrayDualScale_health_0.question}{qArrayDualScale_health_0}{qArrayDualScale_health_0.shown} -qArrayDualScale_health_1{qArrayDualScale_health_1.question}{qArrayDualScale_health_1}{qArrayDualScale_health_1.shown} -qArrayDualScale_md_0{qArrayDualScale_md_0.question}{qArrayDualScale_md_0}{qArrayDualScale_md_0.shown} -qArrayDualScale_md_1{qArrayDualScale_md_1.question}{qArrayDualScale_md_1}{qArrayDualScale_md_1.shown} -qDate{qDate.question}{qDate}{qDate.shown} -qFileUpload{qFileUpload.question}{qFileUpload}{qFileUpload.shown} -qGender{qGender.question}{qGender}{qGender.shown} -qLanguage{qLanguage.question}{qLanguage}{qLanguage.shown} -qMultipleNumerical_self{qMultipleNumerical_self.question}{qMultipleNumerical_self}{qMultipleNumerical_self.shown} -qMultipleNumerical_mom{qMultipleNumerical_mom.question}{qMultipleNumerical_mom}{qMultipleNumerical_mom.shown} -qMultipleNumerical_dad{qMultipleNumerical_dad.question}{qMultipleNumerical_dad}{qMultipleNumerical_dad.shown} -qNumerical{qNumerical.question}{qNumerical}{qNumerical.shown} -qRanking_1{qRanking_1.question}{qRanking_1}{qRanking_1.shown} -qRanking_2{qRanking_2.question}{qRanking_2}{qRanking_2.shown} -qRanking_3{qRanking_3.question}{qRanking_3}{qRanking_3.shown} -qRanking_4{qRanking_4.question}{qRanking_4}{qRanking_4.shown} -qTextDisplay{qTextDisplay.question}{qTextDisplay}{qTextDisplay.shown} -qYesNo{qYesNo.question}{qYesNo}{qYesNo.shown} -qHugeText{qHugeText.question}{qHugeText}{qHugeText.shown} -qLongText{qLongText.question}{qLongText}{qLongText.shown} -qMultipleShort_friend{qMultipleShort_friend.question}{qMultipleShort_friend}{qMultipleShort_friend.shown} -qMultipleShort_family{qMultipleShort_family.question}{qMultipleShort_family}{qMultipleShort_family.shown} -qMultipleShort_work{qMultipleShort_work.question}{qMultipleShort_work}{qMultipleShort_work.shown} -qShort{qShort.question}{qShort}{qShort.shown} -qMultipleChoice_Hawaii{qMultipleChoice_Hawaii.question}{qMultipleChoice_Hawaii}{qMultipleChoice_Hawaii.shown} -qMultipleChoice_Bahamas{qMultipleChoice_Bahamas.question}{qMultipleChoice_Bahamas}{qMultipleChoice_Bahamas.shown} -qMultipleChoice_NewZealand{qMultipleChoice_NewZealand.question}{qMultipleChoice_NewZealand}{qMultipleChoice_NewZealand.shown} -qMultChoiceComment_junk{qMultChoiceComment_junk.question}{qMultChoiceComment_junk}{qMultChoiceComment_junk.shown} -qMultChoiceComment_junkcomment{qMultChoiceComment_junkcomment.question}{qMultChoiceComment_junkcomment}{qMultChoiceComment_junkcomment.shown} -qMultChoiceComment_rtv{qMultChoiceComment_rtv.question}{qMultChoiceComment_rtv}{qMultChoiceComment_rtv.shown} -qMultChoiceComment_rtvcomment{qMultChoiceComment_rtvcomment.question}{qMultChoiceComment_rtvcomment}{qMultChoiceComment_rtvcomment.shown} -qMultChoiceComment_ex{qMultChoiceComment_ex.question}{qMultChoiceComment_ex}{qMultChoiceComment_ex.shown} -qMultChoiceComment_excomment{qMultChoiceComment_excomment.question}{qMultChoiceComment_excomment}{qMultChoiceComment_excomment.shown} -]]> - - - - - - - - - - - - - - - - - <![CDATA[tSummary1]]> - -Question#QuestionResponseCodeResponse -num{num.question}{num}{num.shown} -num2{num2.question}{num2}{num2.shown} -showAny{showAny.question}{showAny}{showAny.shown} -name{name.question}{name}{name.shown} -age{age.question}{age}{age.shown} -married{married.question}{married}{married.shown} -yearsMarried{yearsMarried.question}{yearsMarried}{yearsMarried.shown} -numKids{numKids.question}{numKids}{numKids.shown} -kid1{kid1.question}{kid1}{kid1.shown} -kid2{kid2.question}{kid2}{kid2.shown} -kid3{kid3.question}{kid3}{kid3.shown} -kid4{kid4.question}{kid4}{kid4.shown} -kid5{kid5.question}{kid5}{kid5.shown} -q5pointChoice{q5pointChoice.question}{q5pointChoice}{q5pointChoice.shown} -qListDropdown{qListDropdown.question}{qListDropdown}{qListDropdown.shown} -qListRadio{qListRadio.question}{qListRadio}{qListRadio.shown} -qListWithComment{qListWithComment.question}{qListWithComment}{qListWithComment.shown} -qListWithComment_comment{qListWithComment_comment.question}{qListWithComment_comment}{qListWithComment_comment.shown} -qArray_F1{qArray_F1.question}{qArray_F1}{qArray_F1.shown} -qArray_F2{qArray_F2.question}{qArray_F2}{qArray_F2.shown} -qArray_F3{qArray_F3.question}{qArray_F3}{qArray_F3.shown} -qArray_F4{qArray_F4.question}{qArray_F4}{qArray_F4.shown} -qArray_F5{qArray_F5.question}{qArray_F5}{qArray_F5.shown} -qArray10Point_L1{qArray10Point_L1.question}{qArray10Point_L1}{qArray10Point_L1.shown} -qArray10Point_L2{qArray10Point_L2.question}{qArray10Point_L2}{qArray10Point_L2.shown} -qArray10Point_L3{qArray10Point_L3.question}{qArray10Point_L3}{qArray10Point_L3.shown} -qArray10Point_L4{qArray10Point_L4.question}{qArray10Point_L4}{qArray10Point_L4.shown} -qArray10Point_L5{qArray10Point_L5.question}{qArray10Point_L5}{qArray10Point_L5.shown} -qArray10Point_L6{qArray10Point_L6.question}{qArray10Point_L6}{qArray10Point_L6.shown} -qArray5Point_1{qArray5Point_1.question}{qArray5Point_1}{qArray5Point_1.shown} -qArray5Point_2{qArray5Point_2.question}{qArray5Point_2}{qArray5Point_2.shown} -qArray5Point_3{qArray5Point_3.question}{qArray5Point_3}{qArray5Point_3.shown} -qArray5Point_4{qArray5Point_4.question}{qArray5Point_4}{qArray5Point_4.shown} -qArray5Point_5{qArray5Point_5.question}{qArray5Point_5}{qArray5Point_5.shown} -qArray5Point_6{qArray5Point_6.question}{qArray5Point_6}{qArray5Point_6.shown} -qArrayISD_1{qArrayISD_1.question}{qArrayISD_1}{qArrayISD_1.shown} -qArrayISD_2{qArrayISD_2.question}{qArrayISD_2}{qArrayISD_2.shown} -qArrayISD_3{qArrayISD_3.question}{qArrayISD_3}{qArrayISD_3.shown} -qArrayISD_4{qArrayISD_4.question}{qArrayISD_4}{qArrayISD_4.shown} -qArrayISD_5{qArrayISD_5.question}{qArrayISD_5}{qArrayISD_5.shown} -qArrayISD_6{qArrayISD_6.question}{qArrayISD_6}{qArrayISD_6.shown} -qArrayISD_7{qArrayISD_7.question}{qArrayISD_7}{qArrayISD_7.shown} -qArrayNumbers_ls1_min{qArrayNumbers_ls1_min.question}{qArrayNumbers_ls1_min}{qArrayNumbers_ls1_min.shown} -qArrayNumbers_ls1_max{qArrayNumbers_ls1_max.question}{qArrayNumbers_ls1_max}{qArrayNumbers_ls1_max.shown} -qArrayNumbers_ls1_avg{qArrayNumbers_ls1_avg.question}{qArrayNumbers_ls1_avg}{qArrayNumbers_ls1_avg.shown} -qArrayNumbers_todo_min{qArrayNumbers_todo_min.question}{qArrayNumbers_todo_min}{qArrayNumbers_todo_min.shown} -qArrayNumbers_todo_max{qArrayNumbers_todo_max.question}{qArrayNumbers_todo_max}{qArrayNumbers_todo_max.shown} -qArrayNumbers_todo_avg{qArrayNumbers_todo_avg.question}{qArrayNumbers_todo_avg}{qArrayNumbers_todo_avg.shown} -qArrayNumbers_honey_min{qArrayNumbers_honey_min.question}{qArrayNumbers_honey_min}{qArrayNumbers_honey_min.shown} -qArrayNumbers_honey_max{qArrayNumbers_honey_max.question}{qArrayNumbers_honey_max}{qArrayNumbers_honey_max.shown} -qArrayNumbers_honey_avg{qArrayNumbers_honey_avg.question}{qArrayNumbers_honey_avg}{qArrayNumbers_honey_avg.shown} -qArrayNumbers_econ_min{qArrayNumbers_econ_min.question}{qArrayNumbers_econ_min}{qArrayNumbers_econ_min.shown} -qArrayNumbers_econ_max{qArrayNumbers_econ_max.question}{qArrayNumbers_econ_max}{qArrayNumbers_econ_max.shown} -qArrayNumbers_econ_avg{qArrayNumbers_econ_avg.question}{qArrayNumbers_econ_avg}{qArrayNumbers_econ_avg.shown} -qArrayTexts_hp_1st{qArrayTexts_hp_1st.question}{qArrayTexts_hp_1st}{qArrayTexts_hp_1st.shown} -qArrayTexts_hp_2nd{qArrayTexts_hp_2nd.question}{qArrayTexts_hp_2nd}{qArrayTexts_hp_2nd.shown} -qArrayTexts_hp_3rd{qArrayTexts_hp_3rd.question}{qArrayTexts_hp_3rd}{qArrayTexts_hp_3rd.shown} -qArrayTexts_st_1st{qArrayTexts_st_1st.question}{qArrayTexts_st_1st}{qArrayTexts_st_1st.shown} -qArrayTexts_st_2nd{qArrayTexts_st_2nd.question}{qArrayTexts_st_2nd}{qArrayTexts_st_2nd.shown} -qArrayTexts_st_3rd{qArrayTexts_st_3rd.question}{qArrayTexts_st_3rd}{qArrayTexts_st_3rd.shown} -qArrayTexts_sw_1st{qArrayTexts_sw_1st.question}{qArrayTexts_sw_1st}{qArrayTexts_sw_1st.shown} -qArrayTexts_sw_2nd{qArrayTexts_sw_2nd.question}{qArrayTexts_sw_2nd}{qArrayTexts_sw_2nd.shown} -qArrayTexts_sw_3rd{qArrayTexts_sw_3rd.question}{qArrayTexts_sw_3rd}{qArrayTexts_sw_3rd.shown} -qArrayYNU_1{qArrayYNU_1.question}{qArrayYNU_1}{qArrayYNU_1.shown} -qArrayYNU_2{qArrayYNU_2.question}{qArrayYNU_2}{qArrayYNU_2.shown} -qArrayYNU_3{qArrayYNU_3.question}{qArrayYNU_3}{qArrayYNU_3.shown} -qArrayYNU_4{qArrayYNU_4.question}{qArrayYNU_4}{qArrayYNU_4.shown} -qArrayYNU_5{qArrayYNU_5.question}{qArrayYNU_5}{qArrayYNU_5.shown} -qArrayByColumn_1{qArrayByColumn_1.question}{qArrayByColumn_1}{qArrayByColumn_1.shown} -qArrayByColumn_2{qArrayByColumn_2.question}{qArrayByColumn_2}{qArrayByColumn_2.shown} -qArrayByColumn_3{qArrayByColumn_3.question}{qArrayByColumn_3}{qArrayByColumn_3.shown} -qArrayByColumn_4{qArrayByColumn_4.question}{qArrayByColumn_4}{qArrayByColumn_4.shown} -qArrayByColumn_5{qArrayByColumn_5.question}{qArrayByColumn_5}{qArrayByColumn_5.shown} -qArrayDualScale_money_0{qArrayDualScale_money_0.question}{qArrayDualScale_money_0}{qArrayDualScale_money_0.shown} -qArrayDualScale_money_1{qArrayDualScale_money_1.question}{qArrayDualScale_money_1}{qArrayDualScale_money_1.shown} -qArrayDualScale_health_0{qArrayDualScale_health_0.question}{qArrayDualScale_health_0}{qArrayDualScale_health_0.shown} -qArrayDualScale_health_1{qArrayDualScale_health_1.question}{qArrayDualScale_health_1}{qArrayDualScale_health_1.shown} -qArrayDualScale_md_0{qArrayDualScale_md_0.question}{qArrayDualScale_md_0}{qArrayDualScale_md_0.shown} -qArrayDualScale_md_1{qArrayDualScale_md_1.question}{qArrayDualScale_md_1}{qArrayDualScale_md_1.shown} -qDate{qDate.question}{qDate}{qDate.shown} -qFileUpload{qFileUpload.question}{qFileUpload}{qFileUpload.shown} -qGender{qGender.question}{qGender}{qGender.shown} -qLanguage{qLanguage.question}{qLanguage}{qLanguage.shown} -qMultipleNumerical_self{qMultipleNumerical_self.question}{qMultipleNumerical_self}{qMultipleNumerical_self.shown} -qMultipleNumerical_mom{qMultipleNumerical_mom.question}{qMultipleNumerical_mom}{qMultipleNumerical_mom.shown} -qMultipleNumerical_dad{qMultipleNumerical_dad.question}{qMultipleNumerical_dad}{qMultipleNumerical_dad.shown} -qNumerical{qNumerical.question}{qNumerical}{qNumerical.shown} -qRanking_1{qRanking_1.question}{qRanking_1}{qRanking_1.shown} -qRanking_2{qRanking_2.question}{qRanking_2}{qRanking_2.shown} -qRanking_3{qRanking_3.question}{qRanking_3}{qRanking_3.shown} -qRanking_4{qRanking_4.question}{qRanking_4}{qRanking_4.shown} -qTextDisplay{qTextDisplay.question}{qTextDisplay}{qTextDisplay.shown} -qYesNo{qYesNo.question}{qYesNo}{qYesNo.shown} -qHugeText{qHugeText.question}{qHugeText}{qHugeText.shown} -qLongText{qLongText.question}{qLongText}{qLongText.shown} -qMultipleShort_friend{qMultipleShort_friend.question}{qMultipleShort_friend}{qMultipleShort_friend.shown} -qMultipleShort_family{qMultipleShort_family.question}{qMultipleShort_family}{qMultipleShort_family.shown} -qMultipleShort_work{qMultipleShort_work.question}{qMultipleShort_work}{qMultipleShort_work.shown} -qShort{qShort.question}{qShort}{qShort.shown} -qMultipleChoice_Hawaii{qMultipleChoice_Hawaii.question}{qMultipleChoice_Hawaii}{qMultipleChoice_Hawaii.shown} -qMultipleChoice_Bahamas{qMultipleChoice_Bahamas.question}{qMultipleChoice_Bahamas}{qMultipleChoice_Bahamas.shown} -qMultipleChoice_NewZealand{qMultipleChoice_NewZealand.question}{qMultipleChoice_NewZealand}{qMultipleChoice_NewZealand.shown} -qMultChoiceComment_junk{qMultChoiceComment_junk.question}{qMultChoiceComment_junk}{qMultChoiceComment_junk.shown} -qMultChoiceComment_junkcomment{qMultChoiceComment_junkcomment.question}{qMultChoiceComment_junkcomment}{qMultChoiceComment_junkcomment.shown} -qMultChoiceComment_rtv{qMultChoiceComment_rtv.question}{qMultChoiceComment_rtv}{qMultChoiceComment_rtv.shown} -qMultChoiceComment_rtvcomment{qMultChoiceComment_rtvcomment.question}{qMultChoiceComment_rtvcomment}{qMultChoiceComment_rtvcomment.shown} -qMultChoiceComment_ex{qMultChoiceComment_ex.question}{qMultChoiceComment_ex}{qMultChoiceComment_ex.shown} -qMultChoiceComment_excomment{qMultChoiceComment_excomment.question}{qMultChoiceComment_excomment}{qMultChoiceComment_excomment.shown} -]]> - - - - - - - - - - - - - - - - - <![CDATA[af5pc]]> - - - - - - - - - - - - - - - - - - <![CDATA[af5pc]]> - - - - - - - - - - - - - - - - - - <![CDATA[af5pc]]> - - - - - - - - - - - - - - - - - - <![CDATA[afSrcFilter]]> - - - - - - - - - - - - - - - - - - <![CDATA[afSrcFilter]]> - - - - - - - - - - - - - - - - - - <![CDATA[afSrcFilter]]> - - - - - - - - - - - - - - - - - - <![CDATA[afDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[afDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[afDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[afA10p]]> - - - - - - - - - - - - - - - - - - <![CDATA[afA10p]]> - - - - - - - - - - - - - - - - - - <![CDATA[afA10p]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMFtext]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMFtext]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMFtext]]> - - - - - - - - - - - - - - - - - - <![CDATA[afYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[afYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[afYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[afISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[afISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[afISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[afAFR]]> - - - - - - - - - - - - - - - - - - <![CDATA[afAFR]]> - - - - - - - - - - - - - - - - - - <![CDATA[afAFR]]> - - - - - - - - - - - - - - - - - - <![CDATA[afAMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[afAMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[afAMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afL]]> - - - - - - - - - - - - - - - - - - <![CDATA[afL]]> - - - - - - - - - - - - - - - - - - <![CDATA[afL]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeAMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeAMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeAMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMFtext]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMFtext]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMFtext]]> - - - - - - - - - - - - - - - - - - <![CDATA[afe5pc]]> - - - - - - - - - - - - - - - - - - <![CDATA[afe5pc]]> - - - - - - - - - - - - - - - - - - <![CDATA[afe5pc]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeA10p]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeA10p]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeA10p]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeAFR]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeAFR]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeAFR]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeL]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeL]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeL]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MC]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MC]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MC]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1R]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1R]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1R]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1K]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1K]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1K]]> - - - - - - - - - - - - - - - - - - <![CDATA[v2K]]> - - - num and num2 from the Dynamic Math display page, so based on current values, between {num} and {num2}.]]> - - - - - - - - - - - - - - - <![CDATA[v1AMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[v3K]]> - - - - - - - - - - - - - - - - - - <![CDATA[v3K]]> - - - - - - - - - - - - - - - - - - <![CDATA[v3K]]> - - - - - - - - - - - - - - - - - - <![CDATA[v4K]]> - - - num from the Dynamic Math Display page.)]]> - - - - - - - - - - - - - - - <![CDATA[oL]]> - - - - - - - - - - - - - - - - - - <![CDATA[oL]]> - - - - - - - - - - - - - - - - - - <![CDATA[oL]]> - - - - - - - - - - - - - - - - - - <![CDATA[oDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[oDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[oDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMN]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMN]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMN]]> - - - - - - - - - - - - - - - - - - <![CDATA[oN]]> - - - - - - - - - - - - - - - - - - <![CDATA[oN]]> - - - - - - - - - - - - - - - - - - <![CDATA[oN]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMS]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMS]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMS]]> - - - - - - - - - - - - - - - - - - <![CDATA[oSFT]]> - - - - - - - - - - - - - - - - - - <![CDATA[oSFT]]> - - - - - - - - - - - - - - - - - - <![CDATA[oSFT]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[oMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[hidden1]]> - - - - - - - - - - - - - - - - - - <![CDATA[hidden1]]> - - - - - - - - - - - - - - - - - - <![CDATA[hidden1]]> - - - - - - - - - - - - - - - - - - <![CDATA[hidden2]]> - 3}]]> - - - - - - - - - - - - - - - - - <![CDATA[hidden2]]> - 3}]]> - - - - - - - - - - - - - - - - - <![CDATA[hidden2]]> - 3}]]> - - - - - - - - - - - - - - - - - <![CDATA[hidden3]]> - - - - - - - - - - 50]]> - - - - - - - - <![CDATA[hidden3]]> - - - - - - - - - - 50]]> - - - - - - - - <![CDATA[hidden3]]> - - - - - - - - - - 50]]> - - - - - - - - <![CDATA[hidden4]]> - - - - - - - - - - - - - - - - - - <![CDATA[hidden4]]> - - - - - - - - - - - - - - - - - - <![CDATA[hidden4]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MC_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MC_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MC_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MCC_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MCC_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MCC_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1R_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1R_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1R_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1K_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1K_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1K_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v2K_mnr]]> - - - num and num2 from the Dynamic Math Display page. So, base on current values, the sum must be between {num} and {num2}]]> - - - - - - - - - - - - - - - <![CDATA[v1AMF_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1AMF_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1AMF_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v3K_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v3K_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v3K_mnr]]> - - - - - - - - - - - - - - - - - - <![CDATA[v4K_mnr]]> - - - num from the Dynamic Math Display page, so based on current values, the sum must equal {num}]]> - - - - - - - - - - - - - - - <![CDATA[v5N]]> - - - yearsMarried and age (both from the Dynamic Relevance page), so based on current values, between {yearsMarried} and {age})]]> - - - - - - - - - - - - - - - <![CDATA[vQ]]> - - - - - - - - - - - - - - - - - - <![CDATA[vS]]> - - - - - - - - - - - - - - - - - - <![CDATA[vS]]> - - - - - - - - - - - - - - - - - - <![CDATA[vS]]> - - - - - - - - - - - - - - - - - - <![CDATA[vT]]> - - - - - - - - - - - - - - - - - - <![CDATA[vT]]> - - - - - - - - - - - - - - - - - - <![CDATA[vT]]> - - - - - - - - - - - - - - - - - - <![CDATA[vU]]> - - - - - - - - - - - - - - - - - - <![CDATA[vU]]> - - - - - - - - - - - - - - - - - - <![CDATA[vU]]> - - - - - - - - - - - - - - - - - - <![CDATA[vfMFtext]]> - - - afSrcFilter in the Array Filter Tests page.
      Please enter a valid US phone number. The Validation Equation is /^(?:\(\d{ 3 }\))\s*\d{ 3 }-\d{ 4 }$/]]>
      - - - - - - - -
      - - - - - - - <![CDATA[city]]> - - - - - - - - - - - - - - - - - - <![CDATA[city]]> - - - - - - - - - - - - - - - - - - <![CDATA[city]]> - - - - - - - - - - - - - - - - - - <![CDATA[yearsThere]]> - - - - - - - - - - - - - - - - - - <![CDATA[yearsThere]]> - - - - - - - - - - - - - - - - - - <![CDATA[yearsThere]]> - - - - - - - - - - - - - - - - - - <![CDATA[ranking]]> - - - - - - - - - - - - - - - - - - <![CDATA[ranking]]> - - - - - - - - - - - - - - - - - - <![CDATA[ranking]]> - - - - - - - - - - - - - - - - - - <![CDATA[opinions]]> - - - - - - - - - - - - - - - - - - <![CDATA[opinions]]> - - - - - - - - - - - - - - - - - - <![CDATA[opinions]]> - - - - - - - - - - - - - - - - - - <![CDATA[worries]]> - - - - - - - - - - - - - - - - - - <![CDATA[worries]]> - - - - - - - - - - - - - - - - - - <![CDATA[worries]]> - - - - - - - - - - - - - - - - - - <![CDATA[report]]> - - - - - - - - - - - - - - - - - - - -
      #QuestionCodeValueShown
      {city.qid}{city.question}{city}{city.value}{city.shown}
      {yearsThere.qid}{yearsThere.question}{yearsThere}{yearsThere.value}{yearsThere.shown}
      {ranking_1.qid}{ranking_1.question}{ranking_1}{ranking_1.value}{ranking_1.shown}
      {ranking_2.qid}{ranking_2.question}{ranking_2}{ranking_2.value}{ranking_2.shown}
      {ranking_3.qid}{ranking_3.question}{ranking_3}{ranking_3.value}{ranking_3.shown}
      {ranking_4.qid}{ranking_4.question}{ranking_4}{ranking_4.value}{ranking_4.shown}
      {opinions_tax.qid}{opinions_tax.question}{opinions_tax}{opinions_tax.value}{opinions_tax.shown}
      {opinions_srv.qid}{opinions_srv.question}{opinions_srv}{opinions_srv.value}{opinions_srv.shown}
      {opinions_evt.qid}{opinions_evt.question}{opinions_evt}{opinions_evt.value}{opinions_evt.shown}
      {worries_taxes_0.qid}{worries_taxes_0.question}{worries_taxes_0}{worries_taxes_0.value}{worries_taxes_0.shown}
      {worries_taxes_1.qid}{worries_taxes_1.question}{worries_taxes_1}{worries_taxes_1.value}{worries_taxes_1.shown}
      {worries_smog_0.qid}{worries_smog_0.question}{worries_smog_0}{worries_smog_0.value}{worries_smog_0.shown}
      {worries_smog_1.qid}{worries_smog_1.question}{worries_smog_1}{worries_smog_1.value}{worries_smog_1.shown}
      {worries_trans_0.qid}{worries_trans_0.question}{worries_trans_0}{worries_trans_0.value}{worries_trans_0.shown}
      {worries_trans_1.qid}{worries_trans_1.question}{worries_trans_1}{worries_trans_1.value}{worries_trans_1.shown}
      -Is this correct? -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[report]]> - - - - - - - - - - - - - - - - - - - -
      #QuestionCodeValueShown
      {city.qid}{city.question}{city}{city.value}{city.shown}
      {yearsThere.qid}{yearsThere.question}{yearsThere}{yearsThere.value}{yearsThere.shown}
      {ranking_1.qid}{ranking_1.question}{ranking_1}{ranking_1.value}{ranking_1.shown}
      {ranking_2.qid}{ranking_2.question}{ranking_2}{ranking_2.value}{ranking_2.shown}
      {ranking_3.qid}{ranking_3.question}{ranking_3}{ranking_3.value}{ranking_3.shown}
      {ranking_4.qid}{ranking_4.question}{ranking_4}{ranking_4.value}{ranking_4.shown}
      {opinions_tax.qid}{opinions_tax.question}{opinions_tax}{opinions_tax.value}{opinions_tax.shown}
      {opinions_srv.qid}{opinions_srv.question}{opinions_srv}{opinions_srv.value}{opinions_srv.shown}
      {opinions_evt.qid}{opinions_evt.question}{opinions_evt}{opinions_evt.value}{opinions_evt.shown}
      {worries_taxes_0.qid}{worries_taxes_0.question}{worries_taxes_0}{worries_taxes_0.value}{worries_taxes_0.shown}
      {worries_taxes_1.qid}{worries_taxes_1.question}{worries_taxes_1}{worries_taxes_1.value}{worries_taxes_1.shown}
      {worries_smog_0.qid}{worries_smog_0.question}{worries_smog_0}{worries_smog_0.value}{worries_smog_0.shown}
      {worries_smog_1.qid}{worries_smog_1.question}{worries_smog_1}{worries_smog_1.value}{worries_smog_1.shown}
      {worries_trans_0.qid}{worries_trans_0.question}{worries_trans_0}{worries_trans_0.value}{worries_trans_0.shown}
      {worries_trans_1.qid}{worries_trans_1.question}{worries_trans_1}{worries_trans_1.value}{worries_trans_1.shown}
      -Is this correct? -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[report]]> - - - - - - - - - - - - - - - - - - - -
      #QuestionCodeValueShown
      {city.qid}{city.question}{city}{city.value}{city.shown}
      {yearsThere.qid}{yearsThere.question}{yearsThere}{yearsThere.value}{yearsThere.shown}
      {ranking_1.qid}{ranking_1.question}{ranking_1}{ranking_1.value}{ranking_1.shown}
      {ranking_2.qid}{ranking_2.question}{ranking_2}{ranking_2.value}{ranking_2.shown}
      {ranking_3.qid}{ranking_3.question}{ranking_3}{ranking_3.value}{ranking_3.shown}
      {ranking_4.qid}{ranking_4.question}{ranking_4}{ranking_4.value}{ranking_4.shown}
      {opinions_tax.qid}{opinions_tax.question}{opinions_tax}{opinions_tax.value}{opinions_tax.shown}
      {opinions_srv.qid}{opinions_srv.question}{opinions_srv}{opinions_srv.value}{opinions_srv.shown}
      {opinions_evt.qid}{opinions_evt.question}{opinions_evt}{opinions_evt.value}{opinions_evt.shown}
      {worries_taxes_0.qid}{worries_taxes_0.question}{worries_taxes_0}{worries_taxes_0.value}{worries_taxes_0.shown}
      {worries_taxes_1.qid}{worries_taxes_1.question}{worries_taxes_1}{worries_taxes_1.value}{worries_taxes_1.shown}
      {worries_smog_0.qid}{worries_smog_0.question}{worries_smog_0}{worries_smog_0.value}{worries_smog_0.shown}
      {worries_smog_1.qid}{worries_smog_1.question}{worries_smog_1}{worries_smog_1.value}{worries_smog_1.shown}
      {worries_trans_0.qid}{worries_trans_0.question}{worries_trans_0}{worries_trans_0.value}{worries_trans_0.shown}
      {worries_trans_1.qid}{worries_trans_1.question}{worries_trans_1}{worries_trans_1.value}{worries_trans_1.shown}
      -Is this correct? -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[report2]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Var - SGQA - INSERTANS:SGQA
      - city - 82556X129X3206 - {82556X129X3206}, {INSERTANS:82556X129X3206}
      - yearsThere - 82556X129X3207 - {82556X129X3207}, {INSERTANS:82556X129X3207}
      - ranking_2 - 82556X129X32082 - {82556X129X32082}, {INSERTANS:82556X129X32082}
      - opinions_srv - 82556X129X3209srv - {82556X129X3209srv}, {INSERTANS:82556X129X3209srv}
      - worries_smog_0 - 82556X129X3210smog#0 - {82556X129X3210smog#0}, {INSERTANS:82556X129X3210smog#0}
      - worries_trans_1 - 82556X129X3210trans#1 - {82556X129X3210trans#1}, {INSERTANS:82556X129X3210trans#1}
      -

      -  

      ]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[num_gt_num2]]> - num) is less than the second number (num2), otherwise you will not be able to answer some of the validation tests.]]> - - - - - - - - - = num2]]> - - - - - - - - <![CDATA[num_lt_10]]> - num is less than 10, you will not be able to see the Dynamic Relevance page; and since that page asks your age, you will not be able to complete the validation questions later in the survey, that depend upon your age.]]> - - - - - - - - - - - - - - - - - <![CDATA[no_age_ymarried]]> - age and yearsMarried in order to complete some of the Validation Tests later in the survey.
      -In order to enter age, you must enter your name. In order to enter yearsMarried, you must say you are more than 5 years old.]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[age_lt_ym]]> - -Please correct this or you won't be able to pass some of the Validation Tests later in this survey.]]> - - - - - - - - - = age]]> - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[junk]]> - - - - - - - - - - - - - - - - - - <![CDATA[junk]]> - - - - - - - - - - - - - - - - - - <![CDATA[junk]]> - - - - - - - - - - - - - - - - - - <![CDATA[Hawaii]]> - - - - - - - - - - - - - - - - - - <![CDATA[Hawaii]]> - - - - - - - - - - - - - - - - - - <![CDATA[Hawaii]]> - - - - - - - - - - - - - - - - - - <![CDATA[rtv]]> - - - - - - - - - - - - - - - - - - <![CDATA[rtv]]> - - - - - - - - - - - - - - - - - - <![CDATA[rtv]]> - - - - - - - - - - - - - - - - - - <![CDATA[Bahamas]]> - - - - - - - - - - - - - - - - - - <![CDATA[Bahamas]]> - - - - - - - - - - - - - - - - - - <![CDATA[Bahamas]]> - - - - - - - - - - - - - - - - - - <![CDATA[ex]]> - - - - - - - - - - - - - - - - - - <![CDATA[ex]]> - - - - - - - - - - - - - - - - - - <![CDATA[ex]]> - - - - - - - - - - - - - - - - - - <![CDATA[friend]]> - - - - - - - - - - - - - - - - - - <![CDATA[friend]]> - - - - - - - - - - - - - - - - - - <![CDATA[friend]]> - - - - - - - - - - - - - - - - - - <![CDATA[Europe]]> - - - - - - - - - - - - - - - - - - <![CDATA[Europe]]> - - - - - - - - - - - - - - - - - - <![CDATA[Europe]]> - - - - - - - - - - - - - - - - - - <![CDATA[family]]> - - - - - - - - - - - - - - - - - - <![CDATA[family]]> - - - - - - - - - - - - - - - - - - <![CDATA[family]]> - - - - - - - - - - - - - - - - - - <![CDATA[NewZealand]]> - - - - - - - - - - - - - - - - - - <![CDATA[NewZealand]]> - - - - - - - - - - - - - - - - - - <![CDATA[NewZealand]]> - - - - - - - - - - - - - - - - - - <![CDATA[self]]> - - - - - - - - - - - - - - - - - - <![CDATA[self]]> - - - - - - - - - - - - - - - - - - <![CDATA[self]]> - - - - - - - - - - - - - - - - - - <![CDATA[mom]]> - - - - - - - - - - - - - - - - - - <![CDATA[mom]]> - - - - - - - - - - - - - - - - - - <![CDATA[mom]]> - - - - - - - - - - - - - - - - - - <![CDATA[work]]> - - - - - - - - - - - - - - - - - - <![CDATA[work]]> - - - - - - - - - - - - - - - - - - <![CDATA[work]]> - - - - - - - - - - - - - - - - - - <![CDATA[money]]> - - - - - - - - - - - - - - - - - - <![CDATA[money]]> - - - - - - - - - - - - - - - - - - <![CDATA[money]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[dad]]> - - - - - - - - - - - - - - - - - - <![CDATA[dad]]> - - - - - - - - - - - - - - - - - - <![CDATA[dad]]> - - - - - - - - - - - - - - - - - - <![CDATA[health]]> - - - - - - - - - - - - - - - - - - <![CDATA[health]]> - - - - - - - - - - - - - - - - - - <![CDATA[health]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[md]]> - - - - - - - - - - - - - - - - - - <![CDATA[md]]> - - - - - - - - - - - - - - - - - - <![CDATA[md]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[1st]]> - - - - - - - - - - - - - - - - - - <![CDATA[1st]]> - - - - - - - - - - - - - - - - - - <![CDATA[1st]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[hp]]> - - - - - - - - - - - - - - - - - - <![CDATA[hp]]> - - - - - - - - - - - - - - - - - - <![CDATA[hp]]> - - - - - - - - - - - - - - - - - - <![CDATA[2nd]]> - - - - - - - - - - - - - - - - - - <![CDATA[2nd]]> - - - - - - - - - - - - - - - - - - <![CDATA[2nd]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[ls1]]> - - - - - - - - - - - - - - - - - - <![CDATA[ls1]]> - - - - - - - - - - - - - - - - - - <![CDATA[ls1]]> - - - - - - - - - - - - - - - - - - <![CDATA[st]]> - - - - - - - - - - - - - - - - - - <![CDATA[st]]> - - - - - - - - - - - - - - - - - - <![CDATA[st]]> - - - - - - - - - - - - - - - - - - <![CDATA[3rd]]> - - - - - - - - - - - - - - - - - - <![CDATA[3rd]]> - - - - - - - - - - - - - - - - - - <![CDATA[3rd]]> - - - - - - - - - - - - - - - - - - <![CDATA[min]]> - - - - - - - - - - - - - - - - - - <![CDATA[min]]> - - - - - - - - - - - - - - - - - - <![CDATA[min]]> - - - - - - - - - - - - - - - - - - <![CDATA[sw]]> - - - - - - - - - - - - - - - - - - <![CDATA[sw]]> - - - - - - - - - - - - - - - - - - <![CDATA[sw]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[max]]> - - - - - - - - - - - - - - - - - - <![CDATA[max]]> - - - - - - - - - - - - - - - - - - <![CDATA[max]]> - - - - - - - - - - - - - - - - - - <![CDATA[todo]]> - - - - - - - - - - - - - - - - - - <![CDATA[todo]]> - - - - - - - - - - - - - - - - - - <![CDATA[todo]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[avg]]> - - - - - - - - - - - - - - - - - - <![CDATA[avg]]> - - - - - - - - - - - - - - - - - - <![CDATA[avg]]> - - - - - - - - - - - - - - - - - - <![CDATA[honey]]> - - - - - - - - - - - - - - - - - - <![CDATA[honey]]> - - - - - - - - - - - - - - - - - - <![CDATA[honey]]> - - - - - - - - - - - - - - - - - - <![CDATA[econ]]> - - - - - - - - - - - - - - - - - - <![CDATA[econ]]> - - - - - - - - - - - - - - - - - - <![CDATA[econ]]> - - - - - - - - - - - - - - - - - - <![CDATA[F1]]> - - - - - - - - - - - - - - - - - - <![CDATA[F1]]> - - - - - - - - - - - - - - - - - - <![CDATA[F1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[L1]]> - - - - - - - - - - - - - - - - - - <![CDATA[L1]]> - - - - - - - - - - - - - - - - - - <![CDATA[L1]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - - - <![CDATA[L2]]> - - - - - - - - - - - - - - - - - - <![CDATA[L2]]> - - - - - - - - - - - - - - - - - - <![CDATA[L2]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[7]]> - - - - - - - - - - - - - - - - - - <![CDATA[7]]> - - - - - - - - - - - - - - - - - - <![CDATA[7]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[F2]]> - - - - - - - - - - - - - - - - - - <![CDATA[F2]]> - - - - - - - - - - - - - - - - - - <![CDATA[F2]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - - - <![CDATA[L3]]> - - - - - - - - - - - - - - - - - - <![CDATA[L3]]> - - - - - - - - - - - - - - - - - - <![CDATA[L3]]> - - - - - - - - - - - - - - - - - - <![CDATA[L4]]> - - - - - - - - - - - - - - - - - - <![CDATA[L4]]> - - - - - - - - - - - - - - - - - - <![CDATA[L4]]> - - - - - - - - - - - - - - - - - - <![CDATA[F3]]> - - - - - - - - - - - - - - - - - - <![CDATA[F3]]> - - - - - - - - - - - - - - - - - - <![CDATA[F3]]> - - - - - - - - - - - - - - - - - - <![CDATA[L5]]> - - - - - - - - - - - - - - - - - - <![CDATA[L5]]> - - - - - - - - - - - - - - - - - - <![CDATA[L5]]> - - - - - - - - - - - - - - - - - - <![CDATA[L6]]> - - - - - - - - - - - - - - - - - - <![CDATA[L6]]> - - - - - - - - - - - - - - - - - - <![CDATA[L6]]> - - - - - - - - - - - - - - - - - - <![CDATA[F4]]> - - - - - - - - - - - - - - - - - - <![CDATA[F4]]> - - - - - - - - - - - - - - - - - - <![CDATA[F4]]> - - - - - - - - - - - - - - - - - - <![CDATA[F5]]> - - - - - - - - - - - - - - - - - - <![CDATA[F5]]> - - - - - - - - - - - - - - - - - - <![CDATA[F5]]> - - - - - - - - - - - - - - - - - - <![CDATA[q5C]]> - - - - - - - - - - - - - - - - - - <![CDATA[q5C]]> - - - - - - - - - - - - - - - - - - <![CDATA[q5C]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLR]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLR]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLR]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLWC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLWC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLWC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA10P]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA10P]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA10P]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA5P]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA5P]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA5P]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[qABC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qABC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qABC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qADS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qADS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qADS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qFU]]> - - - - - - - - - - - - - - - - - - <![CDATA[qFU]]> - - - - - - - - - - - - - - - - - - <![CDATA[qFU]]> - - - - - - - - - - - - - - - - - - <![CDATA[qG]]> - - - - - - - - - - - - - - - - - - <![CDATA[qG]]> - - - - - - - - - - - - - - - - - - <![CDATA[qG]]> - - - - - - - - - - - - - - - - - - <![CDATA[qL]]> - - - - - - - - - - - - - - - - - - <![CDATA[qL]]> - - - - - - - - - - - - - - - - - - <![CDATA[qL]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qR]]> - - - - - - - - - - - - - - - - - - <![CDATA[qR]]> - - - - - - - - - - - - - - - - - - <![CDATA[qR]]> - - - - - - - - - - - - - - - - - - <![CDATA[qTD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qTD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qTD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qYN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qYN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qYN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qHT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qHT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qHT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[w]]> - - - - - - - - - - - - - - - - - - <![CDATA[w]]> - - - - - - - - - - - - - - - - - - <![CDATA[w]]> - - - - - - - - - - - - - - - - - - <![CDATA[p]]> - - - - - - - - - - - - - - - - - - <![CDATA[p]]> - - - - - - - - - - - - - - - - - - <![CDATA[p]]> - - - - - - - - - - - - - - - - - - <![CDATA[s]]> - - - - - - - - - - - - - - - - - - <![CDATA[s]]> - - - - - - - - - - - - - - - - - - <![CDATA[s]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[taxes]]> - - - - - - - - - - - - - - - - - - <![CDATA[taxes]]> - - - - - - - - - - - - - - - - - - <![CDATA[taxes]]> - - - - - - - - - - - - - - - - - - <![CDATA[smog]]> - - - - - - - - - - - - - - - - - - <![CDATA[smog]]> - - - - - - - - - - - - - - - - - - <![CDATA[smog]]> - - - - - - - - - - - - - - - - - - <![CDATA[tax]]> - - - - - - - - - - - - - - - - - - <![CDATA[tax]]> - - - - - - - - - - - - - - - - - - <![CDATA[tax]]> - - - - - - - - - - - - - - - - - - <![CDATA[trans]]> - - - - - - - - - - - - - - - - - - <![CDATA[trans]]> - - - - - - - - - - - - - - - - - - <![CDATA[trans]]> - - - - - - - - - - - - - - - - - - <![CDATA[srv]]> - - - - - - - - - - - - - - - - - - <![CDATA[srv]]> - - - - - - - - - - - - - - - - - - <![CDATA[srv]]> - - - - - - - - - - - - - - - - - - <![CDATA[evt]]> - - - - - - - - - - - - - - - - - - <![CDATA[evt]]> - - - - - - - - - - - - - - - - - - <![CDATA[evt]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - - - - - - - - - - - - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hallo, - -Eine neue Antwort wurde für die Umfrage '{SURVEYNAME}' abgegeben. - -Klicken Sie auf den folgenden Link um die Umfrage neu zu laden: -{RELOADURL} - -Klicken Sie auf den folgenden Link um den Antwortdatensatz anzusehen: -{VIEWRESPONSEURL} - -Klicken Sie auf den folgenden Link um den Antwortdatensatz zu bearbeiten: -{EDITRESPONSEURL} - -Um die Statistik zu sehen, klicken Sie hier: -{STATISTICSURL} - - -Die folgenden Antworten wurden vom Teilnehmer gegeben: -{ANSWERTABLE}]]> - - - - - - - - -
    • Dynamic tailoring of question text, including real-time Assessments. This includes access to a dozen question attributes so that you can show print-answer-like reports mid-survey
    • -
    • Dynamic control of question visibility via Relevance - like dynamic, complex Conditions
    • -
    • Flagging irrelevant questions as Not Applicable (they get NULLed in the database)
    • -
    • Cascading relevance - since irrelevant questions have their responses blanked out, relevance conditions can be cascaded by checking whether any single predecessor has a valid response.
    • -
    • Refer to questions by the SPSS/R variable_label (title/code) or via SGQA code
    • -
    • Navigation Index that lets you jump backwards, change answers, then safely jump forwards again (it will re-compute and validate everything in between)
    • -
    • Default Values (group All Question Types) - Note that if questions with default values become irrelevant, are saved, then become relevant again, the default values are restored
    • -
    • Enhanced development and debugging tools - e.g. from admin mode, select 'Survey Logic File' to see one-page view of all question/sub-question/answer text, conditions, attributes, relevance, validation, and tailoring; and click on any variable name to open a new window to edit that question or group.
    • - -

      -Please be sure to change your answers on the page, and navigate back and forth to see how it changes which questions you see and what they say.]]> - - - - -
      you have been invited to participate in a survey.

      The survey is titled:
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      To participate, please click on the link below.

      Sincerely,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Click here to do the survey:
      {SURVEYURL}

      If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
      {OPTOUTURL}]]>
      - -
      Recently we invited you to participate in a survey.

      We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

      The survey is titled:
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      To participate, please click on the link below.

      Sincerely,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Click here to do the survey:
      {SURVEYURL}

      If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
      {OPTOUTURL}]]>
      - -
      You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

      To complete this survey, click on the following URL:

      {SURVEYURL}

      If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
      - -
      this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

      If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

      Sincerely,

      {ADMINNAME}]]>
      - - -
      A new response was submitted for your survey '{SURVEYNAME}'.

      Click the following link to reload the survey:
      {RELOADURL}

      Click the following link to see the individual response:
      {VIEWRESPONSEURL}

      Click the following link to edit the individual response:
      {EDITRESPONSEURL}

      View statistics by clicking here:
      {STATISTICSURL}]]>
      - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

      A new response was submitted for your survey '{SURVEYNAME}'.

      Click the following link to reload the survey:
      {RELOADURL}

      Click the following link to see the individual response:
      {VIEWRESPONSEURL}

      Click the following link to edit the individual response:
      {EDITRESPONSEURL}

      View statistics by clicking here:
      {STATISTICSURL}


      The following answers were given by the participant:
      {ANSWERTABLE}]]>
      - - - - - - - -

      -
      - Cette démo vous montre tous les types de questions et les options disponiblesdans les versions de LimeSurvey 1.92 + Beaucoup de nouvelles capacitésd'utiliser les haut-ExpressionManager (EM), y compris dynamique, basée sur la pertinence, en cascade, des branchements conditionnels et les micro-adaptation des questions.
      -
      -
      -
      -
      -
      -
      -
      -
      -  
      -
      -
      -
      -
      -
      -
      - -
      -]]> - - - - - - - - - - - - - - - - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Bonjour, - -Une nouvelle réponse a été soumise pour votre questionnaire '{SURVEYNAME}'. - -Cliquer sur le lien suivant pour recharger votre questionnaire : -{RELOADURL} - -Cliquer sur le lien suivant pour voir la réponse : -{VIEWRESPONSEURL} - -Cliquez sur le lien suivant pour éditer la réponse individuelle : -{EDITRESPONSEURL} - -Visualiser les statistiques en cliquant ici : -{STATISTICSURL} - - -les réponses suivantes ont été données par le participant : -{ANSWERTABLE}]]> - -
      -
      -
      - diff --git a/include/limesurvey/docs/demosurveys/limesurvey_sample_survey_english.lss b/include/limesurvey/docs/demosurveys/limesurvey_sample_survey_english.lss deleted file mode 100644 index 8fd56b60..00000000 --- a/include/limesurvey/docs/demosurveys/limesurvey_sample_survey_english.lss +++ /dev/null @@ -1,7079 +0,0 @@ - - - Survey - 143 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cid - qid - scenario - cqid - cfieldname - method - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - specialtype - scale_id - sqid - language - defaultvalue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LimeSurvey can use a lot of condition and filter to show or hide question. You an use AND or OR condition. You can use previous question answer and toke.

      -

      More information on condition on the LimeSurvey documentation

      ]]>
      - -
      - - - - - - Array Filter and Array Filter Exclusion]]> - - -
      -
      - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - - - - - - - - - <![CDATA[S]]> - - - - - - - - - - - - - - - - - <![CDATA[T]]> - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - <![CDATA[S1]]> - - - - - - - - - - - - - - - - - <![CDATA[T1]]> - - - - - - - - - - - - - - - - - <![CDATA[Q]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - <![CDATA[M2]]> - - - - - - - - - - - - - - - - - <![CDATA[N]]> - - - - - - - - - - - - - - - - - <![CDATA[Q]]> - - - - - - - - - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - <![CDATA[Q2]]> - - - - - - - - - - - - - - - - - <![CDATA[Y]]> - - - - - - - - - - - - - - - - - <![CDATA[G]]> - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - <![CDATA[I]]> - - - This question change the language of the actual survey : don't use for other thing.

      It can be interesting to use it at survey start

      ]]>
      - - - - - - -
      - - - - - - - <![CDATA[!2]]> - - - - - - - - - - - - - - - - - <![CDATA[L]]> - - - - - - - - - - - - - - - - - <![CDATA[O]]> - - - - - - - - - - - - - - - - - <![CDATA[M]]> - - - - - - - - - - - - - - - - - <![CDATA[M2]]> - - - - - - - - - - - - - - - - - <![CDATA[K]]> - - - - - - - - - - - - - - - - - <![CDATA[D]]> - - - - - - - - - - - - - - - - - <![CDATA[D1]]> - - - - - - - - - - - - - - - - - <![CDATA[R]]> - - - - - - - - - - - - - - - - - <![CDATA[F]]> - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - <![CDATA[E]]> - - - - - - - - - - - - - - - - - <![CDATA[X]]> - - - - - - - - - - - - - - - - - <![CDATA[;]]> - - - - - - - - - - - - - - - - - <![CDATA[:]]> - - - - - - - - - - - - - - - - - <![CDATA[:2]]> - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - <![CDATA[12]]> - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - <![CDATA[AN]]> - - - - - - - - - - - - - - - - - <![CDATA[!1]]> - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - <![CDATA[R1]]> - - - - - - - - - - - - - - - - - <![CDATA[XB]]> - - - - - - - - - - - - - - - - - <![CDATA[XC]]> - - - - - - - - - - - - - - - - - <![CDATA[QC]]> - - - - - - - - - - - - - - - - - <![CDATA[QCYes]]> - - - - - - - - - - - - - - - - - <![CDATA[QCNo]]> - - - - - - - - - - - - - - - - - <![CDATA[QCDefault]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS1]]> - - - - - - - - - - - - - - - - - <![CDATA[QCS2]]> - - - - - - - - - - - - - - - - - <![CDATA[CC01]]> - Show question 1 at one of previous question]]> - - - - - - - - - - - - - - - - <![CDATA[QC02]]> - Show question 2 at one of previous question.]]> - - - - - - - - - - - - - - - - <![CDATA[QCS3]]> - display an previous question.]]> - - - - - - - - - - - - - - - - <![CDATA[AF]]> - - - - - - - - - - - - - - - - - <![CDATA[FAF]]> - - - - - - - - - - - - - - - - - <![CDATA[FAFE]]> - - - - - - - - - - -
      -
      - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ003]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ001]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ002]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ003]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ004]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ05]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQX04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQY04]]> - - - - - - - - - - - - - - - - - <![CDATA[SH101]]> - - - - - - - - - - - - - - - - - <![CDATA[SH102]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ201]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ202]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ01]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ02]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ03]]> - - - - - - - - - - - - - - - - - <![CDATA[SQ04]]> - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - private - faxto - format - template - language - additional_languages - datestamp - usecookie - notification - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - tokenlength - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - - - - - - - - This is the welcome text for the survey! You can can edit it in the survey properties.

      ]]>
      - This is the end message for the survey! A good place to thank you to answer to this survey.

      -

      LimeSurvey : THE survey software is a free software, help LimeSurvey project : donate

      ]]>
      - - - -
      You have been invited to participate in a survey.

      The survey is titled:
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      To participate, please click on the link below.

      Sincerely,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Click here to do the survey:
      {SURVEYURL}

      If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
      {OPTOUTURL}]]>
      - -
      Recently we invited you to participate in a survey.

      We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

      The survey is titled:
      "{SURVEYNAME}"

      "{SURVEYDESCRIPTION}"

      To participate, please click on the link below.

      Sincerely,

      {ADMINNAME} ({ADMINEMAIL})

      ----------------------------------------------
      Click here to do the survey:
      {SURVEYURL}

      If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
      {OPTOUTURL}]]>
      - -
      You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

      To complete this survey, click on the following URL:

      {SURVEYURL}

      If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
      - -
      This email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

      If you have any further questions about this email, please contact {ADMINNAME} at {ADMINEMAIL}.

      Sincerely,

      {ADMINNAME}]]>
      - -
      -
      -
      -
      diff --git a/include/limesurvey/docs/demosurveys/ls2_EM_question_attributes.lss b/include/limesurvey/docs/demosurveys/ls2_EM_question_attributes.lss deleted file mode 100644 index 8cdecd78..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_EM_question_attributes.lss +++ /dev/null @@ -1,6661 +0,0 @@ - - - Survey - 155 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - specialtype - scale_id - sqid - language - defaultvalue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[OnPageRelevance]]> - - - - - - - - - - - - - - - - - - <![CDATA[q5pointChoice]]> - How much do you like LimeSurvey?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListDropdown]]> - - What is your favorite pastime?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListRadio]]> - - What is your favorite color?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qListWithComment]]> - Who is your favorite relative?  Why?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray]]> - How much do you like these foods?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray10Point]]> - How much pain to you currently feel in the following locations?  1 = none, 10 = extreme

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArray5Point]]> - How much do you like the following?  (1 = not at all, 5 = extremely)

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayISD]]> - How should the following change?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayNumbers]]> - How long should it take to fix the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayTexts]]> - Who are your favorite characters in the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayYNU]]> - Which of the following conditions have you had?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayByColumn]]> - How tall are the following?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qArrayDualScale]]> - For each of these issues, how severe and bothersome are they?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qDate]]> - When was your most recent birthday?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qFileUpload]]> - Please upload a picture

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qGender]]> - What gender are you?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qLanguage]]> - Pick a new language

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleNumerical]]> - How old are the following people (or how old were  they when they died)?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qNumerical]]> - How old are you?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qRanking]]> - Please rate your  favorite activities:

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qTextDisplay]]> - This is just a text display.  Is the rendered value saved anywhere?  Is there a database field for it (e.g. to emulate the Equation question type)?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qYesNo]]> - Do you love LimeSurvey?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qHugeText]]> - - Please paste your resume

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qLongText]]> - Please write an essay saying  how much you love LimeSurvey.

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleShort]]> - What are the names of your best friends?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qShort]]> - What is your favorite food?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultipleChoice]]> - Where would you like to vacation this year?

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[qMultChoiceComment]]> - Which of the following  do you like?   Please comment why or why not for each.

      -]]>
      - - - - - - - - - -
      - - - - - - - <![CDATA[note]]> - - - - - - - - - - - - - - - - - - <![CDATA[report1]]> - -QcodeQuestionResponse CodeResponse -q5pointChoice{q5pointChoice.question}{q5pointChoice}{q5pointChoice.shown} -qListDropdown{qListDropdown.question}{qListDropdown}{qListDropdown.shown} -qListDropdown_other{qListDropdown_other.question}{qListDropdown_other}{qListDropdown_other.shown} -qListRadio{qListRadio.question}{qListRadio}{qListRadio.shown} -qListRadio_other{qListRadio_other.question}{qListRadio_other}{qListRadio_other.shown} -qListWithComment{qListWithComment.question}{qListWithComment}{qListWithComment.shown} -qListWithComment_comment{qListWithComment_comment.question}{qListWithComment_comment}{qListWithComment_comment.shown} -qArray_F1{qArray_F1.question}{qArray_F1}{qArray_F1.shown} -qArray_F2{qArray_F2.question}{qArray_F2}{qArray_F2.shown} -qArray_F3{qArray_F3.question}{qArray_F3}{qArray_F3.shown} -qArray_F4{qArray_F4.question}{qArray_F4}{qArray_F4.shown} -qArray_F5{qArray_F5.question}{qArray_F5}{qArray_F5.shown} -qArray10Point_L1{qArray10Point_L1.question}{qArray10Point_L1}{qArray10Point_L1.shown} -qArray10Point_L2{qArray10Point_L2.question}{qArray10Point_L2}{qArray10Point_L2.shown} -qArray10Point_L3{qArray10Point_L3.question}{qArray10Point_L3}{qArray10Point_L3.shown} -qArray10Point_L4{qArray10Point_L4.question}{qArray10Point_L4}{qArray10Point_L4.shown} -qArray10Point_L5{qArray10Point_L5.question}{qArray10Point_L5}{qArray10Point_L5.shown} -qArray10Point_L6{qArray10Point_L6.question}{qArray10Point_L6}{qArray10Point_L6.shown} -qArray5Point_1{qArray5Point_1.question}{qArray5Point_1}{qArray5Point_1.shown} -qArray5Point_2{qArray5Point_2.question}{qArray5Point_2}{qArray5Point_2.shown} -qArray5Point_3{qArray5Point_3.question}{qArray5Point_3}{qArray5Point_3.shown} -qArray5Point_4{qArray5Point_4.question}{qArray5Point_4}{qArray5Point_4.shown} -qArray5Point_5{qArray5Point_5.question}{qArray5Point_5}{qArray5Point_5.shown} -qArray5Point_6{qArray5Point_6.question}{qArray5Point_6}{qArray5Point_6.shown} -qArrayISD_1{qArrayISD_1.question}{qArrayISD_1}{qArrayISD_1.shown} -qArrayISD_2{qArrayISD_2.question}{qArrayISD_2}{qArrayISD_2.shown} -qArrayISD_3{qArrayISD_3.question}{qArrayISD_3}{qArrayISD_3.shown} -qArrayISD_4{qArrayISD_4.question}{qArrayISD_4}{qArrayISD_4.shown} -qArrayISD_5{qArrayISD_5.question}{qArrayISD_5}{qArrayISD_5.shown} -qArrayISD_6{qArrayISD_6.question}{qArrayISD_6}{qArrayISD_6.shown} -qArrayISD_7{qArrayISD_7.question}{qArrayISD_7}{qArrayISD_7.shown} -qArrayNumbers_ls1_min{qArrayNumbers_ls1_min.question}{qArrayNumbers_ls1_min}{qArrayNumbers_ls1_min.shown} -qArrayNumbers_ls1_max{qArrayNumbers_ls1_max.question}{qArrayNumbers_ls1_max}{qArrayNumbers_ls1_max.shown} -qArrayNumbers_ls1_avg{qArrayNumbers_ls1_avg.question}{qArrayNumbers_ls1_avg}{qArrayNumbers_ls1_avg.shown} -qArrayNumbers_todo_min{qArrayNumbers_todo_min.question}{qArrayNumbers_todo_min}{qArrayNumbers_todo_min.shown} -qArrayNumbers_todo_max{qArrayNumbers_todo_max.question}{qArrayNumbers_todo_max}{qArrayNumbers_todo_max.shown} -qArrayNumbers_todo_avg{qArrayNumbers_todo_avg.question}{qArrayNumbers_todo_avg}{qArrayNumbers_todo_avg.shown} -qArrayNumbers_honey_min{qArrayNumbers_honey_min.question}{qArrayNumbers_honey_min}{qArrayNumbers_honey_min.shown} -qArrayNumbers_honey_max{qArrayNumbers_honey_max.question}{qArrayNumbers_honey_max}{qArrayNumbers_honey_max.shown} -qArrayNumbers_honey_avg{qArrayNumbers_honey_avg.question}{qArrayNumbers_honey_avg}{qArrayNumbers_honey_avg.shown} -qArrayNumbers_econ_min{qArrayNumbers_econ_min.question}{qArrayNumbers_econ_min}{qArrayNumbers_econ_min.shown} -qArrayNumbers_econ_max{qArrayNumbers_econ_max.question}{qArrayNumbers_econ_max}{qArrayNumbers_econ_max.shown} -qArrayNumbers_econ_avg{qArrayNumbers_econ_avg.question}{qArrayNumbers_econ_avg}{qArrayNumbers_econ_avg.shown} -qArrayTexts_hp_1st{qArrayTexts_hp_1st.question}{qArrayTexts_hp_1st}{qArrayTexts_hp_1st.shown} -qArrayTexts_hp_2nd{qArrayTexts_hp_2nd.question}{qArrayTexts_hp_2nd}{qArrayTexts_hp_2nd.shown} -qArrayTexts_hp_3rd{qArrayTexts_hp_3rd.question}{qArrayTexts_hp_3rd}{qArrayTexts_hp_3rd.shown} -qArrayTexts_st_1st{qArrayTexts_st_1st.question}{qArrayTexts_st_1st}{qArrayTexts_st_1st.shown} -qArrayTexts_st_2nd{qArrayTexts_st_2nd.question}{qArrayTexts_st_2nd}{qArrayTexts_st_2nd.shown} -qArrayTexts_st_3rd{qArrayTexts_st_3rd.question}{qArrayTexts_st_3rd}{qArrayTexts_st_3rd.shown} -qArrayTexts_sw_1st{qArrayTexts_sw_1st.question}{qArrayTexts_sw_1st}{qArrayTexts_sw_1st.shown} -qArrayTexts_sw_2nd{qArrayTexts_sw_2nd.question}{qArrayTexts_sw_2nd}{qArrayTexts_sw_2nd.shown} -qArrayTexts_sw_3rd{qArrayTexts_sw_3rd.question}{qArrayTexts_sw_3rd}{qArrayTexts_sw_3rd.shown} -qArrayYNU_1{qArrayYNU_1.question}{qArrayYNU_1}{qArrayYNU_1.shown} -qArrayYNU_2{qArrayYNU_2.question}{qArrayYNU_2}{qArrayYNU_2.shown} -qArrayYNU_3{qArrayYNU_3.question}{qArrayYNU_3}{qArrayYNU_3.shown} -qArrayYNU_4{qArrayYNU_4.question}{qArrayYNU_4}{qArrayYNU_4.shown} -qArrayYNU_5{qArrayYNU_5.question}{qArrayYNU_5}{qArrayYNU_5.shown} -qArrayByColumn_1{qArrayByColumn_1.question}{qArrayByColumn_1}{qArrayByColumn_1.shown} -qArrayByColumn_2{qArrayByColumn_2.question}{qArrayByColumn_2}{qArrayByColumn_2.shown} -qArrayByColumn_3{qArrayByColumn_3.question}{qArrayByColumn_3}{qArrayByColumn_3.shown} -qArrayByColumn_4{qArrayByColumn_4.question}{qArrayByColumn_4}{qArrayByColumn_4.shown} -qArrayByColumn_5{qArrayByColumn_5.question}{qArrayByColumn_5}{qArrayByColumn_5.shown} -qArrayDualScale_money_0{qArrayDualScale_money_0.question}{qArrayDualScale_money_0}{qArrayDualScale_money_0.shown} -qArrayDualScale_money_1{qArrayDualScale_money_1.question}{qArrayDualScale_money_1}{qArrayDualScale_money_1.shown} -qArrayDualScale_health_0{qArrayDualScale_health_0.question}{qArrayDualScale_health_0}{qArrayDualScale_health_0.shown} -qArrayDualScale_health_1{qArrayDualScale_health_1.question}{qArrayDualScale_health_1}{qArrayDualScale_health_1.shown} -qArrayDualScale_md_0{qArrayDualScale_md_0.question}{qArrayDualScale_md_0}{qArrayDualScale_md_0.shown} -qArrayDualScale_md_1{qArrayDualScale_md_1.question}{qArrayDualScale_md_1}{qArrayDualScale_md_1.shown} -qDate{qDate.question}{qDate}{qDate.shown} -qFileUpload{qFileUpload.question}{qFileUpload}{qFileUpload.shown} -qFileUpload_filecount{qFileUpload_filecount.question}{qFileUpload_filecount}{qFileUpload_filecount.shown} -qGender{qGender.question}{qGender}{qGender.shown} -qLanguage{qLanguage.question}{qLanguage}{qLanguage.shown} -qMultipleNumerical_self{qMultipleNumerical_self.question}{qMultipleNumerical_self}{qMultipleNumerical_self.shown} -qMultipleNumerical_mom{qMultipleNumerical_mom.question}{qMultipleNumerical_mom}{qMultipleNumerical_mom.shown} -qMultipleNumerical_dad{qMultipleNumerical_dad.question}{qMultipleNumerical_dad}{qMultipleNumerical_dad.shown} -qNumerical{qNumerical.question}{qNumerical}{qNumerical.shown} -qRanking_1{qRanking_1.question}{qRanking_1}{qRanking_1.shown} -qRanking_2{qRanking_2.question}{qRanking_2}{qRanking_2.shown} -qRanking_3{qRanking_3.question}{qRanking_3}{qRanking_3.shown} -qRanking_4{qRanking_4.question}{qRanking_4}{qRanking_4.shown} -qTextDisplay{qTextDisplay.question}{qTextDisplay}{qTextDisplay.shown} -qYesNo{qYesNo.question}{qYesNo}{qYesNo.shown} -qHugeText{qHugeText.question}{qHugeText}{qHugeText.shown} -qLongText{qLongText.question}{qLongText}{qLongText.shown} -qMultipleShort_friend{qMultipleShort_friend.question}{qMultipleShort_friend}{qMultipleShort_friend.shown} -qMultipleShort_family{qMultipleShort_family.question}{qMultipleShort_family}{qMultipleShort_family.shown} -qMultipleShort_work{qMultipleShort_work.question}{qMultipleShort_work}{qMultipleShort_work.shown} -qShort{qShort.question}{qShort}{qShort.shown} -qMultipleChoice_Hawaii{qMultipleChoice_Hawaii.question}{qMultipleChoice_Hawaii}{qMultipleChoice_Hawaii.shown} -qMultipleChoice_Bahamas{qMultipleChoice_Bahamas.question}{qMultipleChoice_Bahamas}{qMultipleChoice_Bahamas.shown} -qMultipleChoice_Europe{qMultipleChoice_Europe.question}{qMultipleChoice_Europe}{qMultipleChoice_Europe.shown} -qMultipleChoice_NewZealand{qMultipleChoice_NewZealand.question}{qMultipleChoice_NewZealand}{qMultipleChoice_NewZealand.shown} -qMultChoiceComment_junk{qMultChoiceComment_junk.question}{qMultChoiceComment_junk}{qMultChoiceComment_junk.shown} -qMultChoiceComment_junkcomment{qMultChoiceComment_junkcomment.question}{qMultChoiceComment_junkcomment}{qMultChoiceComment_junkcomment.shown} -qMultChoiceComment_rtv{qMultChoiceComment_rtv.question}{qMultChoiceComment_rtv}{qMultChoiceComment_rtv.shown} -qMultChoiceComment_rtvcomment{qMultChoiceComment_rtvcomment.question}{qMultChoiceComment_rtvcomment}{qMultChoiceComment_rtvcomment.shown} -qMultChoiceComment_ex{qMultChoiceComment_ex.question}{qMultChoiceComment_ex}{qMultChoiceComment_ex.shown} -qMultChoiceComment_excomment{qMultChoiceComment_excomment.question}{qMultChoiceComment_excomment}{qMultChoiceComment_excomment.shown} -]]> - - - - - - - - - - - - - - - - - <![CDATA[report2]]> - -QcodeTypeSQGQGIDQIDgseqqseq -q5pointChoice{q5pointChoice.type}{q5pointChoice.sgqa}{q5pointChoice.gid}{q5pointChoice.qid}{q5pointChoice.gseq}{q5pointChoice.qseq} -qListDropdown{qListDropdown.type}{qListDropdown.sgqa}{qListDropdown.gid}{qListDropdown.qid}{qListDropdown.gseq}{qListDropdown.qseq} -qListDropdown_other{qListDropdown_other.type}{qListDropdown_other.sgqa}{qListDropdown_other.gid}{qListDropdown_other.qid}{qListDropdown_other.gseq}{qListDropdown_other.qseq} -qListRadio{qListRadio.type}{qListRadio.sgqa}{qListRadio.gid}{qListRadio.qid}{qListRadio.gseq}{qListRadio.qseq} -qListRadio_other{qListRadio_other.type}{qListRadio_other.sgqa}{qListRadio_other.gid}{qListRadio_other.qid}{qListRadio_other.gseq}{qListRadio_other.qseq} -qListWithComment{qListWithComment.type}{qListWithComment.sgqa}{qListWithComment.gid}{qListWithComment.qid}{qListWithComment.gseq}{qListWithComment.qseq} -qListWithComment_comment{qListWithComment_comment.type}{qListWithComment_comment.sgqa}{qListWithComment_comment.gid}{qListWithComment_comment.qid}{qListWithComment_comment.gseq}{qListWithComment_comment.qseq} -qArray_F1{qArray_F1.type}{qArray_F1.sgqa}{qArray_F1.gid}{qArray_F1.qid}{qArray_F1.gseq}{qArray_F1.qseq} -qArray_F2{qArray_F2.type}{qArray_F2.sgqa}{qArray_F2.gid}{qArray_F2.qid}{qArray_F2.gseq}{qArray_F2.qseq} -qArray_F3{qArray_F3.type}{qArray_F3.sgqa}{qArray_F3.gid}{qArray_F3.qid}{qArray_F3.gseq}{qArray_F3.qseq} -qArray_F4{qArray_F4.type}{qArray_F4.sgqa}{qArray_F4.gid}{qArray_F4.qid}{qArray_F4.gseq}{qArray_F4.qseq} -qArray_F5{qArray_F5.type}{qArray_F5.sgqa}{qArray_F5.gid}{qArray_F5.qid}{qArray_F5.gseq}{qArray_F5.qseq} -qArray10Point_L1{qArray10Point_L1.type}{qArray10Point_L1.sgqa}{qArray10Point_L1.gid}{qArray10Point_L1.qid}{qArray10Point_L1.gseq}{qArray10Point_L1.qseq} -qArray10Point_L2{qArray10Point_L2.type}{qArray10Point_L2.sgqa}{qArray10Point_L2.gid}{qArray10Point_L2.qid}{qArray10Point_L2.gseq}{qArray10Point_L2.qseq} -qArray10Point_L3{qArray10Point_L3.type}{qArray10Point_L3.sgqa}{qArray10Point_L3.gid}{qArray10Point_L3.qid}{qArray10Point_L3.gseq}{qArray10Point_L3.qseq} -qArray10Point_L4{qArray10Point_L4.type}{qArray10Point_L4.sgqa}{qArray10Point_L4.gid}{qArray10Point_L4.qid}{qArray10Point_L4.gseq}{qArray10Point_L4.qseq} -qArray10Point_L5{qArray10Point_L5.type}{qArray10Point_L5.sgqa}{qArray10Point_L5.gid}{qArray10Point_L5.qid}{qArray10Point_L5.gseq}{qArray10Point_L5.qseq} -qArray10Point_L6{qArray10Point_L6.type}{qArray10Point_L6.sgqa}{qArray10Point_L6.gid}{qArray10Point_L6.qid}{qArray10Point_L6.gseq}{qArray10Point_L6.qseq} -qArray5Point_1{qArray5Point_1.type}{qArray5Point_1.sgqa}{qArray5Point_1.gid}{qArray5Point_1.qid}{qArray5Point_1.gseq}{qArray5Point_1.qseq} -qArray5Point_2{qArray5Point_2.type}{qArray5Point_2.sgqa}{qArray5Point_2.gid}{qArray5Point_2.qid}{qArray5Point_2.gseq}{qArray5Point_2.qseq} -qArray5Point_3{qArray5Point_3.type}{qArray5Point_3.sgqa}{qArray5Point_3.gid}{qArray5Point_3.qid}{qArray5Point_3.gseq}{qArray5Point_3.qseq} -qArray5Point_4{qArray5Point_4.type}{qArray5Point_4.sgqa}{qArray5Point_4.gid}{qArray5Point_4.qid}{qArray5Point_4.gseq}{qArray5Point_4.qseq} -qArray5Point_5{qArray5Point_5.type}{qArray5Point_5.sgqa}{qArray5Point_5.gid}{qArray5Point_5.qid}{qArray5Point_5.gseq}{qArray5Point_5.qseq} -qArray5Point_6{qArray5Point_6.type}{qArray5Point_6.sgqa}{qArray5Point_6.gid}{qArray5Point_6.qid}{qArray5Point_6.gseq}{qArray5Point_6.qseq} -qArrayISD_1{qArrayISD_1.type}{qArrayISD_1.sgqa}{qArrayISD_1.gid}{qArrayISD_1.qid}{qArrayISD_1.gseq}{qArrayISD_1.qseq} -qArrayISD_2{qArrayISD_2.type}{qArrayISD_2.sgqa}{qArrayISD_2.gid}{qArrayISD_2.qid}{qArrayISD_2.gseq}{qArrayISD_2.qseq} -qArrayISD_3{qArrayISD_3.type}{qArrayISD_3.sgqa}{qArrayISD_3.gid}{qArrayISD_3.qid}{qArrayISD_3.gseq}{qArrayISD_3.qseq} -qArrayISD_4{qArrayISD_4.type}{qArrayISD_4.sgqa}{qArrayISD_4.gid}{qArrayISD_4.qid}{qArrayISD_4.gseq}{qArrayISD_4.qseq} -qArrayISD_5{qArrayISD_5.type}{qArrayISD_5.sgqa}{qArrayISD_5.gid}{qArrayISD_5.qid}{qArrayISD_5.gseq}{qArrayISD_5.qseq} -qArrayISD_6{qArrayISD_6.type}{qArrayISD_6.sgqa}{qArrayISD_6.gid}{qArrayISD_6.qid}{qArrayISD_6.gseq}{qArrayISD_6.qseq} -qArrayISD_7{qArrayISD_7.type}{qArrayISD_7.sgqa}{qArrayISD_7.gid}{qArrayISD_7.qid}{qArrayISD_7.gseq}{qArrayISD_7.qseq} -qArrayNumbers_ls1_min{qArrayNumbers_ls1_min.type}{qArrayNumbers_ls1_min.sgqa}{qArrayNumbers_ls1_min.gid}{qArrayNumbers_ls1_min.qid}{qArrayNumbers_ls1_min.gseq}{qArrayNumbers_ls1_min.qseq} -qArrayNumbers_ls1_max{qArrayNumbers_ls1_max.type}{qArrayNumbers_ls1_max.sgqa}{qArrayNumbers_ls1_max.gid}{qArrayNumbers_ls1_max.qid}{qArrayNumbers_ls1_max.gseq}{qArrayNumbers_ls1_max.qseq} -qArrayNumbers_ls1_avg{qArrayNumbers_ls1_avg.type}{qArrayNumbers_ls1_avg.sgqa}{qArrayNumbers_ls1_avg.gid}{qArrayNumbers_ls1_avg.qid}{qArrayNumbers_ls1_avg.gseq}{qArrayNumbers_ls1_avg.qseq} -qArrayNumbers_todo_min{qArrayNumbers_todo_min.type}{qArrayNumbers_todo_min.sgqa}{qArrayNumbers_todo_min.gid}{qArrayNumbers_todo_min.qid}{qArrayNumbers_todo_min.gseq}{qArrayNumbers_todo_min.qseq} -qArrayNumbers_todo_max{qArrayNumbers_todo_max.type}{qArrayNumbers_todo_max.sgqa}{qArrayNumbers_todo_max.gid}{qArrayNumbers_todo_max.qid}{qArrayNumbers_todo_max.gseq}{qArrayNumbers_todo_max.qseq} -qArrayNumbers_todo_avg{qArrayNumbers_todo_avg.type}{qArrayNumbers_todo_avg.sgqa}{qArrayNumbers_todo_avg.gid}{qArrayNumbers_todo_avg.qid}{qArrayNumbers_todo_avg.gseq}{qArrayNumbers_todo_avg.qseq} -qArrayNumbers_honey_min{qArrayNumbers_honey_min.type}{qArrayNumbers_honey_min.sgqa}{qArrayNumbers_honey_min.gid}{qArrayNumbers_honey_min.qid}{qArrayNumbers_honey_min.gseq}{qArrayNumbers_honey_min.qseq} -qArrayNumbers_honey_max{qArrayNumbers_honey_max.type}{qArrayNumbers_honey_max.sgqa}{qArrayNumbers_honey_max.gid}{qArrayNumbers_honey_max.qid}{qArrayNumbers_honey_max.gseq}{qArrayNumbers_honey_max.qseq} -qArrayNumbers_honey_avg{qArrayNumbers_honey_avg.type}{qArrayNumbers_honey_avg.sgqa}{qArrayNumbers_honey_avg.gid}{qArrayNumbers_honey_avg.qid}{qArrayNumbers_honey_avg.gseq}{qArrayNumbers_honey_avg.qseq} -qArrayNumbers_econ_min{qArrayNumbers_econ_min.type}{qArrayNumbers_econ_min.sgqa}{qArrayNumbers_econ_min.gid}{qArrayNumbers_econ_min.qid}{qArrayNumbers_econ_min.gseq}{qArrayNumbers_econ_min.qseq} -qArrayNumbers_econ_max{qArrayNumbers_econ_max.type}{qArrayNumbers_econ_max.sgqa}{qArrayNumbers_econ_max.gid}{qArrayNumbers_econ_max.qid}{qArrayNumbers_econ_max.gseq}{qArrayNumbers_econ_max.qseq} -qArrayNumbers_econ_avg{qArrayNumbers_econ_avg.type}{qArrayNumbers_econ_avg.sgqa}{qArrayNumbers_econ_avg.gid}{qArrayNumbers_econ_avg.qid}{qArrayNumbers_econ_avg.gseq}{qArrayNumbers_econ_avg.qseq} -qArrayTexts_hp_1st{qArrayTexts_hp_1st.type}{qArrayTexts_hp_1st.sgqa}{qArrayTexts_hp_1st.gid}{qArrayTexts_hp_1st.qid}{qArrayTexts_hp_1st.gseq}{qArrayTexts_hp_1st.qseq} -qArrayTexts_hp_2nd{qArrayTexts_hp_2nd.type}{qArrayTexts_hp_2nd.sgqa}{qArrayTexts_hp_2nd.gid}{qArrayTexts_hp_2nd.qid}{qArrayTexts_hp_2nd.gseq}{qArrayTexts_hp_2nd.qseq} -qArrayTexts_hp_3rd{qArrayTexts_hp_3rd.type}{qArrayTexts_hp_3rd.sgqa}{qArrayTexts_hp_3rd.gid}{qArrayTexts_hp_3rd.qid}{qArrayTexts_hp_3rd.gseq}{qArrayTexts_hp_3rd.qseq} -qArrayTexts_st_1st{qArrayTexts_st_1st.type}{qArrayTexts_st_1st.sgqa}{qArrayTexts_st_1st.gid}{qArrayTexts_st_1st.qid}{qArrayTexts_st_1st.gseq}{qArrayTexts_st_1st.qseq} -qArrayTexts_st_2nd{qArrayTexts_st_2nd.type}{qArrayTexts_st_2nd.sgqa}{qArrayTexts_st_2nd.gid}{qArrayTexts_st_2nd.qid}{qArrayTexts_st_2nd.gseq}{qArrayTexts_st_2nd.qseq} -qArrayTexts_st_3rd{qArrayTexts_st_3rd.type}{qArrayTexts_st_3rd.sgqa}{qArrayTexts_st_3rd.gid}{qArrayTexts_st_3rd.qid}{qArrayTexts_st_3rd.gseq}{qArrayTexts_st_3rd.qseq} -qArrayTexts_sw_1st{qArrayTexts_sw_1st.type}{qArrayTexts_sw_1st.sgqa}{qArrayTexts_sw_1st.gid}{qArrayTexts_sw_1st.qid}{qArrayTexts_sw_1st.gseq}{qArrayTexts_sw_1st.qseq} -qArrayTexts_sw_2nd{qArrayTexts_sw_2nd.type}{qArrayTexts_sw_2nd.sgqa}{qArrayTexts_sw_2nd.gid}{qArrayTexts_sw_2nd.qid}{qArrayTexts_sw_2nd.gseq}{qArrayTexts_sw_2nd.qseq} -qArrayTexts_sw_3rd{qArrayTexts_sw_3rd.type}{qArrayTexts_sw_3rd.sgqa}{qArrayTexts_sw_3rd.gid}{qArrayTexts_sw_3rd.qid}{qArrayTexts_sw_3rd.gseq}{qArrayTexts_sw_3rd.qseq} -qArrayYNU_1{qArrayYNU_1.type}{qArrayYNU_1.sgqa}{qArrayYNU_1.gid}{qArrayYNU_1.qid}{qArrayYNU_1.gseq}{qArrayYNU_1.qseq} -qArrayYNU_2{qArrayYNU_2.type}{qArrayYNU_2.sgqa}{qArrayYNU_2.gid}{qArrayYNU_2.qid}{qArrayYNU_2.gseq}{qArrayYNU_2.qseq} -qArrayYNU_3{qArrayYNU_3.type}{qArrayYNU_3.sgqa}{qArrayYNU_3.gid}{qArrayYNU_3.qid}{qArrayYNU_3.gseq}{qArrayYNU_3.qseq} -qArrayYNU_4{qArrayYNU_4.type}{qArrayYNU_4.sgqa}{qArrayYNU_4.gid}{qArrayYNU_4.qid}{qArrayYNU_4.gseq}{qArrayYNU_4.qseq} -qArrayYNU_5{qArrayYNU_5.type}{qArrayYNU_5.sgqa}{qArrayYNU_5.gid}{qArrayYNU_5.qid}{qArrayYNU_5.gseq}{qArrayYNU_5.qseq} -qArrayByColumn_1{qArrayByColumn_1.type}{qArrayByColumn_1.sgqa}{qArrayByColumn_1.gid}{qArrayByColumn_1.qid}{qArrayByColumn_1.gseq}{qArrayByColumn_1.qseq} -qArrayByColumn_2{qArrayByColumn_2.type}{qArrayByColumn_2.sgqa}{qArrayByColumn_2.gid}{qArrayByColumn_2.qid}{qArrayByColumn_2.gseq}{qArrayByColumn_2.qseq} -qArrayByColumn_3{qArrayByColumn_3.type}{qArrayByColumn_3.sgqa}{qArrayByColumn_3.gid}{qArrayByColumn_3.qid}{qArrayByColumn_3.gseq}{qArrayByColumn_3.qseq} -qArrayByColumn_4{qArrayByColumn_4.type}{qArrayByColumn_4.sgqa}{qArrayByColumn_4.gid}{qArrayByColumn_4.qid}{qArrayByColumn_4.gseq}{qArrayByColumn_4.qseq} -qArrayByColumn_5{qArrayByColumn_5.type}{qArrayByColumn_5.sgqa}{qArrayByColumn_5.gid}{qArrayByColumn_5.qid}{qArrayByColumn_5.gseq}{qArrayByColumn_5.qseq} -qArrayDualScale_money_0{qArrayDualScale_money_0.type}{qArrayDualScale_money_0.sgqa}{qArrayDualScale_money_0.gid}{qArrayDualScale_money_0.qid}{qArrayDualScale_money_0.gseq}{qArrayDualScale_money_0.qseq} -qArrayDualScale_money_1{qArrayDualScale_money_1.type}{qArrayDualScale_money_1.sgqa}{qArrayDualScale_money_1.gid}{qArrayDualScale_money_1.qid}{qArrayDualScale_money_1.gseq}{qArrayDualScale_money_1.qseq} -qArrayDualScale_health_0{qArrayDualScale_health_0.type}{qArrayDualScale_health_0.sgqa}{qArrayDualScale_health_0.gid}{qArrayDualScale_health_0.qid}{qArrayDualScale_health_0.gseq}{qArrayDualScale_health_0.qseq} -qArrayDualScale_health_1{qArrayDualScale_health_1.type}{qArrayDualScale_health_1.sgqa}{qArrayDualScale_health_1.gid}{qArrayDualScale_health_1.qid}{qArrayDualScale_health_1.gseq}{qArrayDualScale_health_1.qseq} -qArrayDualScale_md_0{qArrayDualScale_md_0.type}{qArrayDualScale_md_0.sgqa}{qArrayDualScale_md_0.gid}{qArrayDualScale_md_0.qid}{qArrayDualScale_md_0.gseq}{qArrayDualScale_md_0.qseq} -qArrayDualScale_md_1{qArrayDualScale_md_1.type}{qArrayDualScale_md_1.sgqa}{qArrayDualScale_md_1.gid}{qArrayDualScale_md_1.qid}{qArrayDualScale_md_1.gseq}{qArrayDualScale_md_1.qseq} -qDate{qDate.type}{qDate.sgqa}{qDate.gid}{qDate.qid}{qDate.gseq}{qDate.qseq} -qFileUpload{qFileUpload.type}{qFileUpload.sgqa}{qFileUpload.gid}{qFileUpload.qid}{qFileUpload.gseq}{qFileUpload.qseq} -qFileUpload_filecount{qFileUpload_filecount.type}{qFileUpload_filecount.sgqa}{qFileUpload_filecount.gid}{qFileUpload_filecount.qid}{qFileUpload_filecount.gseq}{qFileUpload_filecount.qseq} -qGender{qGender.type}{qGender.sgqa}{qGender.gid}{qGender.qid}{qGender.gseq}{qGender.qseq} -qLanguage{qLanguage.type}{qLanguage.sgqa}{qLanguage.gid}{qLanguage.qid}{qLanguage.gseq}{qLanguage.qseq} -qMultipleNumerical_self{qMultipleNumerical_self.type}{qMultipleNumerical_self.sgqa}{qMultipleNumerical_self.gid}{qMultipleNumerical_self.qid}{qMultipleNumerical_self.gseq}{qMultipleNumerical_self.qseq} -qMultipleNumerical_mom{qMultipleNumerical_mom.type}{qMultipleNumerical_mom.sgqa}{qMultipleNumerical_mom.gid}{qMultipleNumerical_mom.qid}{qMultipleNumerical_mom.gseq}{qMultipleNumerical_mom.qseq} -qMultipleNumerical_dad{qMultipleNumerical_dad.type}{qMultipleNumerical_dad.sgqa}{qMultipleNumerical_dad.gid}{qMultipleNumerical_dad.qid}{qMultipleNumerical_dad.gseq}{qMultipleNumerical_dad.qseq} -qNumerical{qNumerical.type}{qNumerical.sgqa}{qNumerical.gid}{qNumerical.qid}{qNumerical.gseq}{qNumerical.qseq} -qRanking_1{qRanking_1.type}{qRanking_1.sgqa}{qRanking_1.gid}{qRanking_1.qid}{qRanking_1.gseq}{qRanking_1.qseq} -qRanking_2{qRanking_2.type}{qRanking_2.sgqa}{qRanking_2.gid}{qRanking_2.qid}{qRanking_2.gseq}{qRanking_2.qseq} -qRanking_3{qRanking_3.type}{qRanking_3.sgqa}{qRanking_3.gid}{qRanking_3.qid}{qRanking_3.gseq}{qRanking_3.qseq} -qRanking_4{qRanking_4.type}{qRanking_4.sgqa}{qRanking_4.gid}{qRanking_4.qid}{qRanking_4.gseq}{qRanking_4.qseq} -qTextDisplay{qTextDisplay.type}{qTextDisplay.sgqa}{qTextDisplay.gid}{qTextDisplay.qid}{qTextDisplay.gseq}{qTextDisplay.qseq} -qYesNo{qYesNo.type}{qYesNo.sgqa}{qYesNo.gid}{qYesNo.qid}{qYesNo.gseq}{qYesNo.qseq} -qHugeText{qHugeText.type}{qHugeText.sgqa}{qHugeText.gid}{qHugeText.qid}{qHugeText.gseq}{qHugeText.qseq} -qLongText{qLongText.type}{qLongText.sgqa}{qLongText.gid}{qLongText.qid}{qLongText.gseq}{qLongText.qseq} -qMultipleShort_friend{qMultipleShort_friend.type}{qMultipleShort_friend.sgqa}{qMultipleShort_friend.gid}{qMultipleShort_friend.qid}{qMultipleShort_friend.gseq}{qMultipleShort_friend.qseq} -qMultipleShort_family{qMultipleShort_family.type}{qMultipleShort_family.sgqa}{qMultipleShort_family.gid}{qMultipleShort_family.qid}{qMultipleShort_family.gseq}{qMultipleShort_family.qseq} -qMultipleShort_work{qMultipleShort_work.type}{qMultipleShort_work.sgqa}{qMultipleShort_work.gid}{qMultipleShort_work.qid}{qMultipleShort_work.gseq}{qMultipleShort_work.qseq} -qShort{qShort.type}{qShort.sgqa}{qShort.gid}{qShort.qid}{qShort.gseq}{qShort.qseq} -qMultipleChoice_Hawaii{qMultipleChoice_Hawaii.type}{qMultipleChoice_Hawaii.sgqa}{qMultipleChoice_Hawaii.gid}{qMultipleChoice_Hawaii.qid}{qMultipleChoice_Hawaii.gseq}{qMultipleChoice_Hawaii.qseq} -qMultipleChoice_Bahamas{qMultipleChoice_Bahamas.type}{qMultipleChoice_Bahamas.sgqa}{qMultipleChoice_Bahamas.gid}{qMultipleChoice_Bahamas.qid}{qMultipleChoice_Bahamas.gseq}{qMultipleChoice_Bahamas.qseq} -qMultipleChoice_Europe{qMultipleChoice_Europe.type}{qMultipleChoice_Europe.sgqa}{qMultipleChoice_Europe.gid}{qMultipleChoice_Europe.qid}{qMultipleChoice_Europe.gseq}{qMultipleChoice_Europe.qseq} -qMultipleChoice_NewZealand{qMultipleChoice_NewZealand.type}{qMultipleChoice_NewZealand.sgqa}{qMultipleChoice_NewZealand.gid}{qMultipleChoice_NewZealand.qid}{qMultipleChoice_NewZealand.gseq}{qMultipleChoice_NewZealand.qseq} -qMultChoiceComment_junk{qMultChoiceComment_junk.type}{qMultChoiceComment_junk.sgqa}{qMultChoiceComment_junk.gid}{qMultChoiceComment_junk.qid}{qMultChoiceComment_junk.gseq}{qMultChoiceComment_junk.qseq} -qMultChoiceComment_junkcomment{qMultChoiceComment_junkcomment.type}{qMultChoiceComment_junkcomment.sgqa}{qMultChoiceComment_junkcomment.gid}{qMultChoiceComment_junkcomment.qid}{qMultChoiceComment_junkcomment.gseq}{qMultChoiceComment_junkcomment.qseq} -qMultChoiceComment_rtv{qMultChoiceComment_rtv.type}{qMultChoiceComment_rtv.sgqa}{qMultChoiceComment_rtv.gid}{qMultChoiceComment_rtv.qid}{qMultChoiceComment_rtv.gseq}{qMultChoiceComment_rtv.qseq} -qMultChoiceComment_rtvcomment{qMultChoiceComment_rtvcomment.type}{qMultChoiceComment_rtvcomment.sgqa}{qMultChoiceComment_rtvcomment.gid}{qMultChoiceComment_rtvcomment.qid}{qMultChoiceComment_rtvcomment.gseq}{qMultChoiceComment_rtvcomment.qseq} -qMultChoiceComment_ex{qMultChoiceComment_ex.type}{qMultChoiceComment_ex.sgqa}{qMultChoiceComment_ex.gid}{qMultChoiceComment_ex.qid}{qMultChoiceComment_ex.gseq}{qMultChoiceComment_ex.qseq} -qMultChoiceComment_excomment{qMultChoiceComment_excomment.type}{qMultChoiceComment_excomment.sgqa}{qMultChoiceComment_excomment.gid}{qMultChoiceComment_excomment.qid}{qMultChoiceComment_excomment.gseq}{qMultChoiceComment_excomment.qseq} -]]> - - - - - - - - - - - - - - - - - <![CDATA[report3]]> - -QcodeMandatoryGroup relevance eqnRelevance eqnRelevance Status -q5pointChoice{q5pointChoice.mandatory}{q5pointChoice.grelevance}{q5pointChoice.relevance}{q5pointChoice.relevanceStatus} -qListDropdown{qListDropdown.mandatory}{qListDropdown.grelevance}{qListDropdown.relevance}{qListDropdown.relevanceStatus} -qListDropdown_other{qListDropdown_other.mandatory}{qListDropdown_other.grelevance}{qListDropdown_other.relevance}{qListDropdown_other.relevanceStatus} -qListRadio{qListRadio.mandatory}{qListRadio.grelevance}{qListRadio.relevance}{qListRadio.relevanceStatus} -qListRadio_other{qListRadio_other.mandatory}{qListRadio_other.grelevance}{qListRadio_other.relevance}{qListRadio_other.relevanceStatus} -qListWithComment{qListWithComment.mandatory}{qListWithComment.grelevance}{qListWithComment.relevance}{qListWithComment.relevanceStatus} -qListWithComment_comment{qListWithComment_comment.mandatory}{qListWithComment_comment.grelevance}{qListWithComment_comment.relevance}{qListWithComment_comment.relevanceStatus} -qArray_F1{qArray_F1.mandatory}{qArray_F1.grelevance}{qArray_F1.relevance}{qArray_F1.relevanceStatus} -qArray_F2{qArray_F2.mandatory}{qArray_F2.grelevance}{qArray_F2.relevance}{qArray_F2.relevanceStatus} -qArray_F3{qArray_F3.mandatory}{qArray_F3.grelevance}{qArray_F3.relevance}{qArray_F3.relevanceStatus} -qArray_F4{qArray_F4.mandatory}{qArray_F4.grelevance}{qArray_F4.relevance}{qArray_F4.relevanceStatus} -qArray_F5{qArray_F5.mandatory}{qArray_F5.grelevance}{qArray_F5.relevance}{qArray_F5.relevanceStatus} -qArray10Point_L1{qArray10Point_L1.mandatory}{qArray10Point_L1.grelevance}{qArray10Point_L1.relevance}{qArray10Point_L1.relevanceStatus} -qArray10Point_L2{qArray10Point_L2.mandatory}{qArray10Point_L2.grelevance}{qArray10Point_L2.relevance}{qArray10Point_L2.relevanceStatus} -qArray10Point_L3{qArray10Point_L3.mandatory}{qArray10Point_L3.grelevance}{qArray10Point_L3.relevance}{qArray10Point_L3.relevanceStatus} -qArray10Point_L4{qArray10Point_L4.mandatory}{qArray10Point_L4.grelevance}{qArray10Point_L4.relevance}{qArray10Point_L4.relevanceStatus} -qArray10Point_L5{qArray10Point_L5.mandatory}{qArray10Point_L5.grelevance}{qArray10Point_L5.relevance}{qArray10Point_L5.relevanceStatus} -qArray10Point_L6{qArray10Point_L6.mandatory}{qArray10Point_L6.grelevance}{qArray10Point_L6.relevance}{qArray10Point_L6.relevanceStatus} -qArray5Point_1{qArray5Point_1.mandatory}{qArray5Point_1.grelevance}{qArray5Point_1.relevance}{qArray5Point_1.relevanceStatus} -qArray5Point_2{qArray5Point_2.mandatory}{qArray5Point_2.grelevance}{qArray5Point_2.relevance}{qArray5Point_2.relevanceStatus} -qArray5Point_3{qArray5Point_3.mandatory}{qArray5Point_3.grelevance}{qArray5Point_3.relevance}{qArray5Point_3.relevanceStatus} -qArray5Point_4{qArray5Point_4.mandatory}{qArray5Point_4.grelevance}{qArray5Point_4.relevance}{qArray5Point_4.relevanceStatus} -qArray5Point_5{qArray5Point_5.mandatory}{qArray5Point_5.grelevance}{qArray5Point_5.relevance}{qArray5Point_5.relevanceStatus} -qArray5Point_6{qArray5Point_6.mandatory}{qArray5Point_6.grelevance}{qArray5Point_6.relevance}{qArray5Point_6.relevanceStatus} -qArrayISD_1{qArrayISD_1.mandatory}{qArrayISD_1.grelevance}{qArrayISD_1.relevance}{qArrayISD_1.relevanceStatus} -qArrayISD_2{qArrayISD_2.mandatory}{qArrayISD_2.grelevance}{qArrayISD_2.relevance}{qArrayISD_2.relevanceStatus} -qArrayISD_3{qArrayISD_3.mandatory}{qArrayISD_3.grelevance}{qArrayISD_3.relevance}{qArrayISD_3.relevanceStatus} -qArrayISD_4{qArrayISD_4.mandatory}{qArrayISD_4.grelevance}{qArrayISD_4.relevance}{qArrayISD_4.relevanceStatus} -qArrayISD_5{qArrayISD_5.mandatory}{qArrayISD_5.grelevance}{qArrayISD_5.relevance}{qArrayISD_5.relevanceStatus} -qArrayISD_6{qArrayISD_6.mandatory}{qArrayISD_6.grelevance}{qArrayISD_6.relevance}{qArrayISD_6.relevanceStatus} -qArrayISD_7{qArrayISD_7.mandatory}{qArrayISD_7.grelevance}{qArrayISD_7.relevance}{qArrayISD_7.relevanceStatus} -qArrayNumbers_ls1_min{qArrayNumbers_ls1_min.mandatory}{qArrayNumbers_ls1_min.grelevance}{qArrayNumbers_ls1_min.relevance}{qArrayNumbers_ls1_min.relevanceStatus} -qArrayNumbers_ls1_max{qArrayNumbers_ls1_max.mandatory}{qArrayNumbers_ls1_max.grelevance}{qArrayNumbers_ls1_max.relevance}{qArrayNumbers_ls1_max.relevanceStatus} -qArrayNumbers_ls1_avg{qArrayNumbers_ls1_avg.mandatory}{qArrayNumbers_ls1_avg.grelevance}{qArrayNumbers_ls1_avg.relevance}{qArrayNumbers_ls1_avg.relevanceStatus} -qArrayNumbers_todo_min{qArrayNumbers_todo_min.mandatory}{qArrayNumbers_todo_min.grelevance}{qArrayNumbers_todo_min.relevance}{qArrayNumbers_todo_min.relevanceStatus} -qArrayNumbers_todo_max{qArrayNumbers_todo_max.mandatory}{qArrayNumbers_todo_max.grelevance}{qArrayNumbers_todo_max.relevance}{qArrayNumbers_todo_max.relevanceStatus} -qArrayNumbers_todo_avg{qArrayNumbers_todo_avg.mandatory}{qArrayNumbers_todo_avg.grelevance}{qArrayNumbers_todo_avg.relevance}{qArrayNumbers_todo_avg.relevanceStatus} -qArrayNumbers_honey_min{qArrayNumbers_honey_min.mandatory}{qArrayNumbers_honey_min.grelevance}{qArrayNumbers_honey_min.relevance}{qArrayNumbers_honey_min.relevanceStatus} -qArrayNumbers_honey_max{qArrayNumbers_honey_max.mandatory}{qArrayNumbers_honey_max.grelevance}{qArrayNumbers_honey_max.relevance}{qArrayNumbers_honey_max.relevanceStatus} -qArrayNumbers_honey_avg{qArrayNumbers_honey_avg.mandatory}{qArrayNumbers_honey_avg.grelevance}{qArrayNumbers_honey_avg.relevance}{qArrayNumbers_honey_avg.relevanceStatus} -qArrayNumbers_econ_min{qArrayNumbers_econ_min.mandatory}{qArrayNumbers_econ_min.grelevance}{qArrayNumbers_econ_min.relevance}{qArrayNumbers_econ_min.relevanceStatus} -qArrayNumbers_econ_max{qArrayNumbers_econ_max.mandatory}{qArrayNumbers_econ_max.grelevance}{qArrayNumbers_econ_max.relevance}{qArrayNumbers_econ_max.relevanceStatus} -qArrayNumbers_econ_avg{qArrayNumbers_econ_avg.mandatory}{qArrayNumbers_econ_avg.grelevance}{qArrayNumbers_econ_avg.relevance}{qArrayNumbers_econ_avg.relevanceStatus} -qArrayTexts_hp_1st{qArrayTexts_hp_1st.mandatory}{qArrayTexts_hp_1st.grelevance}{qArrayTexts_hp_1st.relevance}{qArrayTexts_hp_1st.relevanceStatus} -qArrayTexts_hp_2nd{qArrayTexts_hp_2nd.mandatory}{qArrayTexts_hp_2nd.grelevance}{qArrayTexts_hp_2nd.relevance}{qArrayTexts_hp_2nd.relevanceStatus} -qArrayTexts_hp_3rd{qArrayTexts_hp_3rd.mandatory}{qArrayTexts_hp_3rd.grelevance}{qArrayTexts_hp_3rd.relevance}{qArrayTexts_hp_3rd.relevanceStatus} -qArrayTexts_st_1st{qArrayTexts_st_1st.mandatory}{qArrayTexts_st_1st.grelevance}{qArrayTexts_st_1st.relevance}{qArrayTexts_st_1st.relevanceStatus} -qArrayTexts_st_2nd{qArrayTexts_st_2nd.mandatory}{qArrayTexts_st_2nd.grelevance}{qArrayTexts_st_2nd.relevance}{qArrayTexts_st_2nd.relevanceStatus} -qArrayTexts_st_3rd{qArrayTexts_st_3rd.mandatory}{qArrayTexts_st_3rd.grelevance}{qArrayTexts_st_3rd.relevance}{qArrayTexts_st_3rd.relevanceStatus} -qArrayTexts_sw_1st{qArrayTexts_sw_1st.mandatory}{qArrayTexts_sw_1st.grelevance}{qArrayTexts_sw_1st.relevance}{qArrayTexts_sw_1st.relevanceStatus} -qArrayTexts_sw_2nd{qArrayTexts_sw_2nd.mandatory}{qArrayTexts_sw_2nd.grelevance}{qArrayTexts_sw_2nd.relevance}{qArrayTexts_sw_2nd.relevanceStatus} -qArrayTexts_sw_3rd{qArrayTexts_sw_3rd.mandatory}{qArrayTexts_sw_3rd.grelevance}{qArrayTexts_sw_3rd.relevance}{qArrayTexts_sw_3rd.relevanceStatus} -qArrayYNU_1{qArrayYNU_1.mandatory}{qArrayYNU_1.grelevance}{qArrayYNU_1.relevance}{qArrayYNU_1.relevanceStatus} -qArrayYNU_2{qArrayYNU_2.mandatory}{qArrayYNU_2.grelevance}{qArrayYNU_2.relevance}{qArrayYNU_2.relevanceStatus} -qArrayYNU_3{qArrayYNU_3.mandatory}{qArrayYNU_3.grelevance}{qArrayYNU_3.relevance}{qArrayYNU_3.relevanceStatus} -qArrayYNU_4{qArrayYNU_4.mandatory}{qArrayYNU_4.grelevance}{qArrayYNU_4.relevance}{qArrayYNU_4.relevanceStatus} -qArrayYNU_5{qArrayYNU_5.mandatory}{qArrayYNU_5.grelevance}{qArrayYNU_5.relevance}{qArrayYNU_5.relevanceStatus} -qArrayByColumn_1{qArrayByColumn_1.mandatory}{qArrayByColumn_1.grelevance}{qArrayByColumn_1.relevance}{qArrayByColumn_1.relevanceStatus} -qArrayByColumn_2{qArrayByColumn_2.mandatory}{qArrayByColumn_2.grelevance}{qArrayByColumn_2.relevance}{qArrayByColumn_2.relevanceStatus} -qArrayByColumn_3{qArrayByColumn_3.mandatory}{qArrayByColumn_3.grelevance}{qArrayByColumn_3.relevance}{qArrayByColumn_3.relevanceStatus} -qArrayByColumn_4{qArrayByColumn_4.mandatory}{qArrayByColumn_4.grelevance}{qArrayByColumn_4.relevance}{qArrayByColumn_4.relevanceStatus} -qArrayByColumn_5{qArrayByColumn_5.mandatory}{qArrayByColumn_5.grelevance}{qArrayByColumn_5.relevance}{qArrayByColumn_5.relevanceStatus} -qArrayDualScale_money_0{qArrayDualScale_money_0.mandatory}{qArrayDualScale_money_0.grelevance}{qArrayDualScale_money_0.relevance}{qArrayDualScale_money_0.relevanceStatus} -qArrayDualScale_money_1{qArrayDualScale_money_1.mandatory}{qArrayDualScale_money_1.grelevance}{qArrayDualScale_money_1.relevance}{qArrayDualScale_money_1.relevanceStatus} -qArrayDualScale_health_0{qArrayDualScale_health_0.mandatory}{qArrayDualScale_health_0.grelevance}{qArrayDualScale_health_0.relevance}{qArrayDualScale_health_0.relevanceStatus} -qArrayDualScale_health_1{qArrayDualScale_health_1.mandatory}{qArrayDualScale_health_1.grelevance}{qArrayDualScale_health_1.relevance}{qArrayDualScale_health_1.relevanceStatus} -qArrayDualScale_md_0{qArrayDualScale_md_0.mandatory}{qArrayDualScale_md_0.grelevance}{qArrayDualScale_md_0.relevance}{qArrayDualScale_md_0.relevanceStatus} -qArrayDualScale_md_1{qArrayDualScale_md_1.mandatory}{qArrayDualScale_md_1.grelevance}{qArrayDualScale_md_1.relevance}{qArrayDualScale_md_1.relevanceStatus} -qDate{qDate.mandatory}{qDate.grelevance}{qDate.relevance}{qDate.relevanceStatus} -qFileUpload{qFileUpload.mandatory}{qFileUpload.grelevance}{qFileUpload.relevance}{qFileUpload.relevanceStatus} -qFileUpload_filecount{qFileUpload_filecount.mandatory}{qFileUpload_filecount.grelevance}{qFileUpload_filecount.relevance}{qFileUpload_filecount.relevanceStatus} -qGender{qGender.mandatory}{qGender.grelevance}{qGender.relevance}{qGender.relevanceStatus} -qLanguage{qLanguage.mandatory}{qLanguage.grelevance}{qLanguage.relevance}{qLanguage.relevanceStatus} -qMultipleNumerical_self{qMultipleNumerical_self.mandatory}{qMultipleNumerical_self.grelevance}{qMultipleNumerical_self.relevance}{qMultipleNumerical_self.relevanceStatus} -qMultipleNumerical_mom{qMultipleNumerical_mom.mandatory}{qMultipleNumerical_mom.grelevance}{qMultipleNumerical_mom.relevance}{qMultipleNumerical_mom.relevanceStatus} -qMultipleNumerical_dad{qMultipleNumerical_dad.mandatory}{qMultipleNumerical_dad.grelevance}{qMultipleNumerical_dad.relevance}{qMultipleNumerical_dad.relevanceStatus} -qNumerical{qNumerical.mandatory}{qNumerical.grelevance}{qNumerical.relevance}{qNumerical.relevanceStatus} -qRanking_1{qRanking_1.mandatory}{qRanking_1.grelevance}{qRanking_1.relevance}{qRanking_1.relevanceStatus} -qRanking_2{qRanking_2.mandatory}{qRanking_2.grelevance}{qRanking_2.relevance}{qRanking_2.relevanceStatus} -qRanking_3{qRanking_3.mandatory}{qRanking_3.grelevance}{qRanking_3.relevance}{qRanking_3.relevanceStatus} -qRanking_4{qRanking_4.mandatory}{qRanking_4.grelevance}{qRanking_4.relevance}{qRanking_4.relevanceStatus} -qTextDisplay{qTextDisplay.mandatory}{qTextDisplay.grelevance}{qTextDisplay.relevance}{qTextDisplay.relevanceStatus} -qYesNo{qYesNo.mandatory}{qYesNo.grelevance}{qYesNo.relevance}{qYesNo.relevanceStatus} -qHugeText{qHugeText.mandatory}{qHugeText.grelevance}{qHugeText.relevance}{qHugeText.relevanceStatus} -qLongText{qLongText.mandatory}{qLongText.grelevance}{qLongText.relevance}{qLongText.relevanceStatus} -qMultipleShort_friend{qMultipleShort_friend.mandatory}{qMultipleShort_friend.grelevance}{qMultipleShort_friend.relevance}{qMultipleShort_friend.relevanceStatus} -qMultipleShort_family{qMultipleShort_family.mandatory}{qMultipleShort_family.grelevance}{qMultipleShort_family.relevance}{qMultipleShort_family.relevanceStatus} -qMultipleShort_work{qMultipleShort_work.mandatory}{qMultipleShort_work.grelevance}{qMultipleShort_work.relevance}{qMultipleShort_work.relevanceStatus} -qShort{qShort.mandatory}{qShort.grelevance}{qShort.relevance}{qShort.relevanceStatus} -qMultipleChoice_Hawaii{qMultipleChoice_Hawaii.mandatory}{qMultipleChoice_Hawaii.grelevance}{qMultipleChoice_Hawaii.relevance}{qMultipleChoice_Hawaii.relevanceStatus} -qMultipleChoice_Bahamas{qMultipleChoice_Bahamas.mandatory}{qMultipleChoice_Bahamas.grelevance}{qMultipleChoice_Bahamas.relevance}{qMultipleChoice_Bahamas.relevanceStatus} -qMultipleChoice_Europe{qMultipleChoice_Europe.mandatory}{qMultipleChoice_Europe.grelevance}{qMultipleChoice_Europe.relevance}{qMultipleChoice_Europe.relevanceStatus} -qMultipleChoice_NewZealand{qMultipleChoice_NewZealand.mandatory}{qMultipleChoice_NewZealand.grelevance}{qMultipleChoice_NewZealand.relevance}{qMultipleChoice_NewZealand.relevanceStatus} -qMultChoiceComment_junk{qMultChoiceComment_junk.mandatory}{qMultChoiceComment_junk.grelevance}{qMultChoiceComment_junk.relevance}{qMultChoiceComment_junk.relevanceStatus} -qMultChoiceComment_junkcomment{qMultChoiceComment_junkcomment.mandatory}{qMultChoiceComment_junkcomment.grelevance}{qMultChoiceComment_junkcomment.relevance}{qMultChoiceComment_junkcomment.relevanceStatus} -qMultChoiceComment_rtv{qMultChoiceComment_rtv.mandatory}{qMultChoiceComment_rtv.grelevance}{qMultChoiceComment_rtv.relevance}{qMultChoiceComment_rtv.relevanceStatus} -qMultChoiceComment_rtvcomment{qMultChoiceComment_rtvcomment.mandatory}{qMultChoiceComment_rtvcomment.grelevance}{qMultChoiceComment_rtvcomment.relevance}{qMultChoiceComment_rtvcomment.relevanceStatus} -qMultChoiceComment_ex{qMultChoiceComment_ex.mandatory}{qMultChoiceComment_ex.grelevance}{qMultChoiceComment_ex.relevance}{qMultChoiceComment_ex.relevanceStatus} -qMultChoiceComment_excomment{qMultChoiceComment_excomment.mandatory}{qMultChoiceComment_excomment.grelevance}{qMultChoiceComment_excomment.relevance}{qMultChoiceComment_excomment.relevanceStatus} -]]> - - - - - - - - - - - - - - - - - <![CDATA[report4]]> - -QcodeJavaScript varnameJavaScript rownameCoded valueAssessment Value -q5pointChoice{q5pointChoice.jsName}{q5pointChoice.rowdivid}{q5pointChoice.code}{q5pointChoice.value} -qListDropdown{qListDropdown.jsName}{qListDropdown.rowdivid}{qListDropdown.code}{qListDropdown.value} -qListDropdown_other{qListDropdown_other.jsName}{qListDropdown_other.rowdivid}{qListDropdown_other.code}{qListDropdown_other.value} -qListRadio{qListRadio.jsName}{qListRadio.rowdivid}{qListRadio.code}{qListRadio.value} -qListRadio_other{qListRadio_other.jsName}{qListRadio_other.rowdivid}{qListRadio_other.code}{qListRadio_other.value} -qListWithComment{qListWithComment.jsName}{qListWithComment.rowdivid}{qListWithComment.code}{qListWithComment.value} -qListWithComment_comment{qListWithComment_comment.jsName}{qListWithComment_comment.rowdivid}{qListWithComment_comment.code}{qListWithComment_comment.value} -qArray_F1{qArray_F1.jsName}{qArray_F1.rowdivid}{qArray_F1.code}{qArray_F1.value} -qArray_F2{qArray_F2.jsName}{qArray_F2.rowdivid}{qArray_F2.code}{qArray_F2.value} -qArray_F3{qArray_F3.jsName}{qArray_F3.rowdivid}{qArray_F3.code}{qArray_F3.value} -qArray_F4{qArray_F4.jsName}{qArray_F4.rowdivid}{qArray_F4.code}{qArray_F4.value} -qArray_F5{qArray_F5.jsName}{qArray_F5.rowdivid}{qArray_F5.code}{qArray_F5.value} -qArray10Point_L1{qArray10Point_L1.jsName}{qArray10Point_L1.rowdivid}{qArray10Point_L1.code}{qArray10Point_L1.value} -qArray10Point_L2{qArray10Point_L2.jsName}{qArray10Point_L2.rowdivid}{qArray10Point_L2.code}{qArray10Point_L2.value} -qArray10Point_L3{qArray10Point_L3.jsName}{qArray10Point_L3.rowdivid}{qArray10Point_L3.code}{qArray10Point_L3.value} -qArray10Point_L4{qArray10Point_L4.jsName}{qArray10Point_L4.rowdivid}{qArray10Point_L4.code}{qArray10Point_L4.value} -qArray10Point_L5{qArray10Point_L5.jsName}{qArray10Point_L5.rowdivid}{qArray10Point_L5.code}{qArray10Point_L5.value} -qArray10Point_L6{qArray10Point_L6.jsName}{qArray10Point_L6.rowdivid}{qArray10Point_L6.code}{qArray10Point_L6.value} -qArray5Point_1{qArray5Point_1.jsName}{qArray5Point_1.rowdivid}{qArray5Point_1.code}{qArray5Point_1.value} -qArray5Point_2{qArray5Point_2.jsName}{qArray5Point_2.rowdivid}{qArray5Point_2.code}{qArray5Point_2.value} -qArray5Point_3{qArray5Point_3.jsName}{qArray5Point_3.rowdivid}{qArray5Point_3.code}{qArray5Point_3.value} -qArray5Point_4{qArray5Point_4.jsName}{qArray5Point_4.rowdivid}{qArray5Point_4.code}{qArray5Point_4.value} -qArray5Point_5{qArray5Point_5.jsName}{qArray5Point_5.rowdivid}{qArray5Point_5.code}{qArray5Point_5.value} -qArray5Point_6{qArray5Point_6.jsName}{qArray5Point_6.rowdivid}{qArray5Point_6.code}{qArray5Point_6.value} -qArrayISD_1{qArrayISD_1.jsName}{qArrayISD_1.rowdivid}{qArrayISD_1.code}{qArrayISD_1.value} -qArrayISD_2{qArrayISD_2.jsName}{qArrayISD_2.rowdivid}{qArrayISD_2.code}{qArrayISD_2.value} -qArrayISD_3{qArrayISD_3.jsName}{qArrayISD_3.rowdivid}{qArrayISD_3.code}{qArrayISD_3.value} -qArrayISD_4{qArrayISD_4.jsName}{qArrayISD_4.rowdivid}{qArrayISD_4.code}{qArrayISD_4.value} -qArrayISD_5{qArrayISD_5.jsName}{qArrayISD_5.rowdivid}{qArrayISD_5.code}{qArrayISD_5.value} -qArrayISD_6{qArrayISD_6.jsName}{qArrayISD_6.rowdivid}{qArrayISD_6.code}{qArrayISD_6.value} -qArrayISD_7{qArrayISD_7.jsName}{qArrayISD_7.rowdivid}{qArrayISD_7.code}{qArrayISD_7.value} -qArrayNumbers_ls1_min{qArrayNumbers_ls1_min.jsName}{qArrayNumbers_ls1_min.rowdivid}{qArrayNumbers_ls1_min.code}{qArrayNumbers_ls1_min.value} -qArrayNumbers_ls1_max{qArrayNumbers_ls1_max.jsName}{qArrayNumbers_ls1_max.rowdivid}{qArrayNumbers_ls1_max.code}{qArrayNumbers_ls1_max.value} -qArrayNumbers_ls1_avg{qArrayNumbers_ls1_avg.jsName}{qArrayNumbers_ls1_avg.rowdivid}{qArrayNumbers_ls1_avg.code}{qArrayNumbers_ls1_avg.value} -qArrayNumbers_todo_min{qArrayNumbers_todo_min.jsName}{qArrayNumbers_todo_min.rowdivid}{qArrayNumbers_todo_min.code}{qArrayNumbers_todo_min.value} -qArrayNumbers_todo_max{qArrayNumbers_todo_max.jsName}{qArrayNumbers_todo_max.rowdivid}{qArrayNumbers_todo_max.code}{qArrayNumbers_todo_max.value} -qArrayNumbers_todo_avg{qArrayNumbers_todo_avg.jsName}{qArrayNumbers_todo_avg.rowdivid}{qArrayNumbers_todo_avg.code}{qArrayNumbers_todo_avg.value} -qArrayNumbers_honey_min{qArrayNumbers_honey_min.jsName}{qArrayNumbers_honey_min.rowdivid}{qArrayNumbers_honey_min.code}{qArrayNumbers_honey_min.value} -qArrayNumbers_honey_max{qArrayNumbers_honey_max.jsName}{qArrayNumbers_honey_max.rowdivid}{qArrayNumbers_honey_max.code}{qArrayNumbers_honey_max.value} -qArrayNumbers_honey_avg{qArrayNumbers_honey_avg.jsName}{qArrayNumbers_honey_avg.rowdivid}{qArrayNumbers_honey_avg.code}{qArrayNumbers_honey_avg.value} -qArrayNumbers_econ_min{qArrayNumbers_econ_min.jsName}{qArrayNumbers_econ_min.rowdivid}{qArrayNumbers_econ_min.code}{qArrayNumbers_econ_min.value} -qArrayNumbers_econ_max{qArrayNumbers_econ_max.jsName}{qArrayNumbers_econ_max.rowdivid}{qArrayNumbers_econ_max.code}{qArrayNumbers_econ_max.value} -qArrayNumbers_econ_avg{qArrayNumbers_econ_avg.jsName}{qArrayNumbers_econ_avg.rowdivid}{qArrayNumbers_econ_avg.code}{qArrayNumbers_econ_avg.value} -qArrayTexts_hp_1st{qArrayTexts_hp_1st.jsName}{qArrayTexts_hp_1st.rowdivid}{qArrayTexts_hp_1st.code}{qArrayTexts_hp_1st.value} -qArrayTexts_hp_2nd{qArrayTexts_hp_2nd.jsName}{qArrayTexts_hp_2nd.rowdivid}{qArrayTexts_hp_2nd.code}{qArrayTexts_hp_2nd.value} -qArrayTexts_hp_3rd{qArrayTexts_hp_3rd.jsName}{qArrayTexts_hp_3rd.rowdivid}{qArrayTexts_hp_3rd.code}{qArrayTexts_hp_3rd.value} -qArrayTexts_st_1st{qArrayTexts_st_1st.jsName}{qArrayTexts_st_1st.rowdivid}{qArrayTexts_st_1st.code}{qArrayTexts_st_1st.value} -qArrayTexts_st_2nd{qArrayTexts_st_2nd.jsName}{qArrayTexts_st_2nd.rowdivid}{qArrayTexts_st_2nd.code}{qArrayTexts_st_2nd.value} -qArrayTexts_st_3rd{qArrayTexts_st_3rd.jsName}{qArrayTexts_st_3rd.rowdivid}{qArrayTexts_st_3rd.code}{qArrayTexts_st_3rd.value} -qArrayTexts_sw_1st{qArrayTexts_sw_1st.jsName}{qArrayTexts_sw_1st.rowdivid}{qArrayTexts_sw_1st.code}{qArrayTexts_sw_1st.value} -qArrayTexts_sw_2nd{qArrayTexts_sw_2nd.jsName}{qArrayTexts_sw_2nd.rowdivid}{qArrayTexts_sw_2nd.code}{qArrayTexts_sw_2nd.value} -qArrayTexts_sw_3rd{qArrayTexts_sw_3rd.jsName}{qArrayTexts_sw_3rd.rowdivid}{qArrayTexts_sw_3rd.code}{qArrayTexts_sw_3rd.value} -qArrayYNU_1{qArrayYNU_1.jsName}{qArrayYNU_1.rowdivid}{qArrayYNU_1.code}{qArrayYNU_1.value} -qArrayYNU_2{qArrayYNU_2.jsName}{qArrayYNU_2.rowdivid}{qArrayYNU_2.code}{qArrayYNU_2.value} -qArrayYNU_3{qArrayYNU_3.jsName}{qArrayYNU_3.rowdivid}{qArrayYNU_3.code}{qArrayYNU_3.value} -qArrayYNU_4{qArrayYNU_4.jsName}{qArrayYNU_4.rowdivid}{qArrayYNU_4.code}{qArrayYNU_4.value} -qArrayYNU_5{qArrayYNU_5.jsName}{qArrayYNU_5.rowdivid}{qArrayYNU_5.code}{qArrayYNU_5.value} -qArrayByColumn_1{qArrayByColumn_1.jsName}{qArrayByColumn_1.rowdivid}{qArrayByColumn_1.code}{qArrayByColumn_1.value} -qArrayByColumn_2{qArrayByColumn_2.jsName}{qArrayByColumn_2.rowdivid}{qArrayByColumn_2.code}{qArrayByColumn_2.value} -qArrayByColumn_3{qArrayByColumn_3.jsName}{qArrayByColumn_3.rowdivid}{qArrayByColumn_3.code}{qArrayByColumn_3.value} -qArrayByColumn_4{qArrayByColumn_4.jsName}{qArrayByColumn_4.rowdivid}{qArrayByColumn_4.code}{qArrayByColumn_4.value} -qArrayByColumn_5{qArrayByColumn_5.jsName}{qArrayByColumn_5.rowdivid}{qArrayByColumn_5.code}{qArrayByColumn_5.value} -qArrayDualScale_money_0{qArrayDualScale_money_0.jsName}{qArrayDualScale_money_0.rowdivid}{qArrayDualScale_money_0.code}{qArrayDualScale_money_0.value} -qArrayDualScale_money_1{qArrayDualScale_money_1.jsName}{qArrayDualScale_money_1.rowdivid}{qArrayDualScale_money_1.code}{qArrayDualScale_money_1.value} -qArrayDualScale_health_0{qArrayDualScale_health_0.jsName}{qArrayDualScale_health_0.rowdivid}{qArrayDualScale_health_0.code}{qArrayDualScale_health_0.value} -qArrayDualScale_health_1{qArrayDualScale_health_1.jsName}{qArrayDualScale_health_1.rowdivid}{qArrayDualScale_health_1.code}{qArrayDualScale_health_1.value} -qArrayDualScale_md_0{qArrayDualScale_md_0.jsName}{qArrayDualScale_md_0.rowdivid}{qArrayDualScale_md_0.code}{qArrayDualScale_md_0.value} -qArrayDualScale_md_1{qArrayDualScale_md_1.jsName}{qArrayDualScale_md_1.rowdivid}{qArrayDualScale_md_1.code}{qArrayDualScale_md_1.value} -qDate{qDate.jsName}{qDate.rowdivid}{qDate.code}{qDate.value} -qFileUpload{qFileUpload.jsName}{qFileUpload.rowdivid}{qFileUpload.code}{qFileUpload.value} -qFileUpload_filecount{qFileUpload_filecount.jsName}{qFileUpload_filecount.rowdivid}{qFileUpload_filecount.code}{qFileUpload_filecount.value} -qGender{qGender.jsName}{qGender.rowdivid}{qGender.code}{qGender.value} -qLanguage{qLanguage.jsName}{qLanguage.rowdivid}{qLanguage.code}{qLanguage.value} -qMultipleNumerical_self{qMultipleNumerical_self.jsName}{qMultipleNumerical_self.rowdivid}{qMultipleNumerical_self.code}{qMultipleNumerical_self.value} -qMultipleNumerical_mom{qMultipleNumerical_mom.jsName}{qMultipleNumerical_mom.rowdivid}{qMultipleNumerical_mom.code}{qMultipleNumerical_mom.value} -qMultipleNumerical_dad{qMultipleNumerical_dad.jsName}{qMultipleNumerical_dad.rowdivid}{qMultipleNumerical_dad.code}{qMultipleNumerical_dad.value} -qNumerical{qNumerical.jsName}{qNumerical.rowdivid}{qNumerical.code}{qNumerical.value} -qRanking_1{qRanking_1.jsName}{qRanking_1.rowdivid}{qRanking_1.code}{qRanking_1.value} -qRanking_2{qRanking_2.jsName}{qRanking_2.rowdivid}{qRanking_2.code}{qRanking_2.value} -qRanking_3{qRanking_3.jsName}{qRanking_3.rowdivid}{qRanking_3.code}{qRanking_3.value} -qRanking_4{qRanking_4.jsName}{qRanking_4.rowdivid}{qRanking_4.code}{qRanking_4.value} -qTextDisplay{qTextDisplay.jsName}{qTextDisplay.rowdivid}{qTextDisplay.code}{qTextDisplay.value} -qYesNo{qYesNo.jsName}{qYesNo.rowdivid}{qYesNo.code}{qYesNo.value} -qHugeText{qHugeText.jsName}{qHugeText.rowdivid}{qHugeText.code}{qHugeText.value} -qLongText{qLongText.jsName}{qLongText.rowdivid}{qLongText.code}{qLongText.value} -qMultipleShort_friend{qMultipleShort_friend.jsName}{qMultipleShort_friend.rowdivid}{qMultipleShort_friend.code}{qMultipleShort_friend.value} -qMultipleShort_family{qMultipleShort_family.jsName}{qMultipleShort_family.rowdivid}{qMultipleShort_family.code}{qMultipleShort_family.value} -qMultipleShort_work{qMultipleShort_work.jsName}{qMultipleShort_work.rowdivid}{qMultipleShort_work.code}{qMultipleShort_work.value} -qShort{qShort.jsName}{qShort.rowdivid}{qShort.code}{qShort.value} -qMultipleChoice_Hawaii{qMultipleChoice_Hawaii.jsName}{qMultipleChoice_Hawaii.rowdivid}{qMultipleChoice_Hawaii.code}{qMultipleChoice_Hawaii.value} -qMultipleChoice_Bahamas{qMultipleChoice_Bahamas.jsName}{qMultipleChoice_Bahamas.rowdivid}{qMultipleChoice_Bahamas.code}{qMultipleChoice_Bahamas.value} -qMultipleChoice_Europe{qMultipleChoice_Europe.jsName}{qMultipleChoice_Europe.rowdivid}{qMultipleChoice_Europe.code}{qMultipleChoice_Europe.value} -qMultipleChoice_NewZealand{qMultipleChoice_NewZealand.jsName}{qMultipleChoice_NewZealand.rowdivid}{qMultipleChoice_NewZealand.code}{qMultipleChoice_NewZealand.value} -qMultChoiceComment_junk{qMultChoiceComment_junk.jsName}{qMultChoiceComment_junk.rowdivid}{qMultChoiceComment_junk.code}{qMultChoiceComment_junk.value} -qMultChoiceComment_junkcomment{qMultChoiceComment_junkcomment.jsName}{qMultChoiceComment_junkcomment.rowdivid}{qMultChoiceComment_junkcomment.code}{qMultChoiceComment_junkcomment.value} -qMultChoiceComment_rtv{qMultChoiceComment_rtv.jsName}{qMultChoiceComment_rtv.rowdivid}{qMultChoiceComment_rtv.code}{qMultChoiceComment_rtv.value} -qMultChoiceComment_rtvcomment{qMultChoiceComment_rtvcomment.jsName}{qMultChoiceComment_rtvcomment.rowdivid}{qMultChoiceComment_rtvcomment.code}{qMultChoiceComment_rtvcomment.value} -qMultChoiceComment_ex{qMultChoiceComment_ex.jsName}{qMultChoiceComment_ex.rowdivid}{qMultChoiceComment_ex.code}{qMultChoiceComment_ex.value} -qMultChoiceComment_excomment{qMultChoiceComment_excomment.jsName}{qMultChoiceComment_excomment.rowdivid}{qMultChoiceComment_excomment.code}{qMultChoiceComment_excomment.value} -]]> - - - - - - - - - - - - - - - - - <![CDATA[report0]]> - -QcodeINSERTANSQcode.shown -q5pointChoice{INSERTANS:14272X54X930}{q5pointChoice.shown} -qListDropdown{INSERTANS:14272X54X931}{qListDropdown.shown} -qListDropdown_other{INSERTANS:14272X54X931other}{qListDropdown_other.shown} -qListRadio{INSERTANS:14272X54X932}{qListRadio.shown} -qListRadio_other{INSERTANS:14272X54X932other}{qListRadio_other.shown} -qListWithComment{INSERTANS:14272X54X933}{qListWithComment.shown} -qListWithComment_comment{INSERTANS:14272X54X933comment}{qListWithComment_comment.shown} -qArray_F1{INSERTANS:14272X54X934F1}{qArray_F1.shown} -qArray_F2{INSERTANS:14272X54X934F2}{qArray_F2.shown} -qArray_F3{INSERTANS:14272X54X934F3}{qArray_F3.shown} -qArray_F4{INSERTANS:14272X54X934F4}{qArray_F4.shown} -qArray_F5{INSERTANS:14272X54X934F5}{qArray_F5.shown} -qArray10Point_L1{INSERTANS:14272X54X935L1}{qArray10Point_L1.shown} -qArray10Point_L2{INSERTANS:14272X54X935L2}{qArray10Point_L2.shown} -qArray10Point_L3{INSERTANS:14272X54X935L3}{qArray10Point_L3.shown} -qArray10Point_L4{INSERTANS:14272X54X935L4}{qArray10Point_L4.shown} -qArray10Point_L5{INSERTANS:14272X54X935L5}{qArray10Point_L5.shown} -qArray10Point_L6{INSERTANS:14272X54X935L6}{qArray10Point_L6.shown} -qArray5Point_1{INSERTANS:14272X54X9361}{qArray5Point_1.shown} -qArray5Point_2{INSERTANS:14272X54X9362}{qArray5Point_2.shown} -qArray5Point_3{INSERTANS:14272X54X9363}{qArray5Point_3.shown} -qArray5Point_4{INSERTANS:14272X54X9364}{qArray5Point_4.shown} -qArray5Point_5{INSERTANS:14272X54X9365}{qArray5Point_5.shown} -qArray5Point_6{INSERTANS:14272X54X9366}{qArray5Point_6.shown} -qArrayISD_1{INSERTANS:14272X54X9371}{qArrayISD_1.shown} -qArrayISD_2{INSERTANS:14272X54X9372}{qArrayISD_2.shown} -qArrayISD_3{INSERTANS:14272X54X9373}{qArrayISD_3.shown} -qArrayISD_4{INSERTANS:14272X54X9374}{qArrayISD_4.shown} -qArrayISD_5{INSERTANS:14272X54X9375}{qArrayISD_5.shown} -qArrayISD_6{INSERTANS:14272X54X9376}{qArrayISD_6.shown} -qArrayISD_7{INSERTANS:14272X54X9377}{qArrayISD_7.shown} -qArrayNumbers_ls1_min{INSERTANS:14272X54X938ls1_min}{qArrayNumbers_ls1_min.shown} -qArrayNumbers_ls1_max{INSERTANS:14272X54X938ls1_max}{qArrayNumbers_ls1_max.shown} -qArrayNumbers_ls1_avg{INSERTANS:14272X54X938ls1_avg}{qArrayNumbers_ls1_avg.shown} -qArrayNumbers_todo_min{INSERTANS:14272X54X938todo_min}{qArrayNumbers_todo_min.shown} -qArrayNumbers_todo_max{INSERTANS:14272X54X938todo_max}{qArrayNumbers_todo_max.shown} -qArrayNumbers_todo_avg{INSERTANS:14272X54X938todo_avg}{qArrayNumbers_todo_avg.shown} -qArrayNumbers_honey_min{INSERTANS:14272X54X938honey_min}{qArrayNumbers_honey_min.shown} -qArrayNumbers_honey_max{INSERTANS:14272X54X938honey_max}{qArrayNumbers_honey_max.shown} -qArrayNumbers_honey_avg{INSERTANS:14272X54X938honey_avg}{qArrayNumbers_honey_avg.shown} -qArrayNumbers_econ_min{INSERTANS:14272X54X938econ_min}{qArrayNumbers_econ_min.shown} -qArrayNumbers_econ_max{INSERTANS:14272X54X938econ_max}{qArrayNumbers_econ_max.shown} -qArrayNumbers_econ_avg{INSERTANS:14272X54X938econ_avg}{qArrayNumbers_econ_avg.shown} -qArrayTexts_hp_1st{INSERTANS:14272X54X939hp_1st}{qArrayTexts_hp_1st.shown} -qArrayTexts_hp_2nd{INSERTANS:14272X54X939hp_2nd}{qArrayTexts_hp_2nd.shown} -qArrayTexts_hp_3rd{INSERTANS:14272X54X939hp_3rd}{qArrayTexts_hp_3rd.shown} -qArrayTexts_st_1st{INSERTANS:14272X54X939st_1st}{qArrayTexts_st_1st.shown} -qArrayTexts_st_2nd{INSERTANS:14272X54X939st_2nd}{qArrayTexts_st_2nd.shown} -qArrayTexts_st_3rd{INSERTANS:14272X54X939st_3rd}{qArrayTexts_st_3rd.shown} -qArrayTexts_sw_1st{INSERTANS:14272X54X939sw_1st}{qArrayTexts_sw_1st.shown} -qArrayTexts_sw_2nd{INSERTANS:14272X54X939sw_2nd}{qArrayTexts_sw_2nd.shown} -qArrayTexts_sw_3rd{INSERTANS:14272X54X939sw_3rd}{qArrayTexts_sw_3rd.shown} -qArrayYNU_1{INSERTANS:14272X54X9401}{qArrayYNU_1.shown} -qArrayYNU_2{INSERTANS:14272X54X9402}{qArrayYNU_2.shown} -qArrayYNU_3{INSERTANS:14272X54X9403}{qArrayYNU_3.shown} -qArrayYNU_4{INSERTANS:14272X54X9404}{qArrayYNU_4.shown} -qArrayYNU_5{INSERTANS:14272X54X9405}{qArrayYNU_5.shown} -qArrayByColumn_1{INSERTANS:14272X54X9411}{qArrayByColumn_1.shown} -qArrayByColumn_2{INSERTANS:14272X54X9412}{qArrayByColumn_2.shown} -qArrayByColumn_3{INSERTANS:14272X54X9413}{qArrayByColumn_3.shown} -qArrayByColumn_4{INSERTANS:14272X54X9414}{qArrayByColumn_4.shown} -qArrayByColumn_5{INSERTANS:14272X54X9415}{qArrayByColumn_5.shown} -qArrayDualScale_money_0{INSERTANS:14272X54X942money#0}{qArrayDualScale_money_0.shown} -qArrayDualScale_money_1{INSERTANS:14272X54X942money#1}{qArrayDualScale_money_1.shown} -qArrayDualScale_health_0{INSERTANS:14272X54X942health#0}{qArrayDualScale_health_0.shown} -qArrayDualScale_health_1{INSERTANS:14272X54X942health#1}{qArrayDualScale_health_1.shown} -qArrayDualScale_md_0{INSERTANS:14272X54X942md#0}{qArrayDualScale_md_0.shown} -qArrayDualScale_md_1{INSERTANS:14272X54X942md#1}{qArrayDualScale_md_1.shown} -qDate{INSERTANS:14272X54X943}{qDate.shown} -qFileUpload{INSERTANS:14272X54X944}{qFileUpload.shown} -qFileUpload_filecount{INSERTANS:14272X54X944_filecount}{qFileUpload_filecount.shown} -qGender{INSERTANS:14272X54X945}{qGender.shown} -qLanguage{INSERTANS:14272X54X946}{qLanguage.shown} -qMultipleNumerical_self{INSERTANS:14272X54X947self}{qMultipleNumerical_self.shown} -qMultipleNumerical_mom{INSERTANS:14272X54X947mom}{qMultipleNumerical_mom.shown} -qMultipleNumerical_dad{INSERTANS:14272X54X947dad}{qMultipleNumerical_dad.shown} -qNumerical{INSERTANS:14272X54X948}{qNumerical.shown} -qRanking_1{INSERTANS:14272X54X9491}{qRanking_1.shown} -qRanking_2{INSERTANS:14272X54X9492}{qRanking_2.shown} -qRanking_3{INSERTANS:14272X54X9493}{qRanking_3.shown} -qRanking_4{INSERTANS:14272X54X9494}{qRanking_4.shown} -qTextDisplay{INSERTANS:14272X54X950}{qTextDisplay.shown} -qYesNo{INSERTANS:14272X54X951}{qYesNo.shown} -qHugeText{INSERTANS:14272X54X952}{qHugeText.shown} -qLongText{INSERTANS:14272X54X953}{qLongText.shown} -qMultipleShort_friend{INSERTANS:14272X54X954friend}{qMultipleShort_friend.shown} -qMultipleShort_family{INSERTANS:14272X54X954family}{qMultipleShort_family.shown} -qMultipleShort_work{INSERTANS:14272X54X954work}{qMultipleShort_work.shown} -qShort{INSERTANS:14272X54X955}{qShort.shown} -qMultipleChoice_Hawaii{INSERTANS:14272X54X956Hawaii}{qMultipleChoice_Hawaii.shown} -qMultipleChoice_Bahamas{INSERTANS:14272X54X956Bahamas}{qMultipleChoice_Bahamas.shown} -qMultipleChoice_Europe{INSERTANS:14272X54X956Europe}{qMultipleChoice_Europe.shown} -qMultipleChoice_NewZealand{INSERTANS:14272X54X956NewZealand}{qMultipleChoice_NewZealand.shown} -qMultChoiceComment_junk{INSERTANS:14272X54X957junk}{qMultChoiceComment_junk.shown} -qMultChoiceComment_junkcomment{INSERTANS:14272X54X957junkcomment}{qMultChoiceComment_junkcomment.shown} -qMultChoiceComment_rtv{INSERTANS:14272X54X957rtv}{qMultChoiceComment_rtv.shown} -qMultChoiceComment_rtvcomment{INSERTANS:14272X54X957rtvcomment}{qMultChoiceComment_rtvcomment.shown} -qMultChoiceComment_ex{INSERTANS:14272X54X957ex}{qMultChoiceComment_ex.shown} -qMultChoiceComment_excomment{INSERTANS:14272X54X957excomment}{qMultChoiceComment_excomment.shown} -]]> - - - - - - - - - - - - - - - - - <![CDATA[report00]]> - -QcodeINSERTANSQcode.shown -q5pointChoice{INSERTANS:14272X54X930}{q5pointChoice.shown} -qListDropdown{INSERTANS:14272X54X931}{qListDropdown.shown} -qListDropdown_other{INSERTANS:14272X54X931other}{qListDropdown_other.shown} -qListRadio{INSERTANS:14272X54X932}{qListRadio.shown} -qListRadio_other{INSERTANS:14272X54X932other}{qListRadio_other.shown} -qListWithComment{INSERTANS:14272X54X933}{qListWithComment.shown} -qListWithComment_comment{INSERTANS:14272X54X933comment}{qListWithComment_comment.shown} -qArray_F1{INSERTANS:14272X54X934F1}{qArray_F1.shown} -qArray_F2{INSERTANS:14272X54X934F2}{qArray_F2.shown} -qArray_F3{INSERTANS:14272X54X934F3}{qArray_F3.shown} -qArray_F4{INSERTANS:14272X54X934F4}{qArray_F4.shown} -qArray_F5{INSERTANS:14272X54X934F5}{qArray_F5.shown} -qArray10Point_L1{INSERTANS:14272X54X935L1}{qArray10Point_L1.shown} -qArray10Point_L2{INSERTANS:14272X54X935L2}{qArray10Point_L2.shown} -qArray10Point_L3{INSERTANS:14272X54X935L3}{qArray10Point_L3.shown} -qArray10Point_L4{INSERTANS:14272X54X935L4}{qArray10Point_L4.shown} -qArray10Point_L5{INSERTANS:14272X54X935L5}{qArray10Point_L5.shown} -qArray10Point_L6{INSERTANS:14272X54X935L6}{qArray10Point_L6.shown} -qArray5Point_1{INSERTANS:14272X54X9361}{qArray5Point_1.shown} -qArray5Point_2{INSERTANS:14272X54X9362}{qArray5Point_2.shown} -qArray5Point_3{INSERTANS:14272X54X9363}{qArray5Point_3.shown} -qArray5Point_4{INSERTANS:14272X54X9364}{qArray5Point_4.shown} -qArray5Point_5{INSERTANS:14272X54X9365}{qArray5Point_5.shown} -qArray5Point_6{INSERTANS:14272X54X9366}{qArray5Point_6.shown} -qArrayISD_1{INSERTANS:14272X54X9371}{qArrayISD_1.shown} -qArrayISD_2{INSERTANS:14272X54X9372}{qArrayISD_2.shown} -qArrayISD_3{INSERTANS:14272X54X9373}{qArrayISD_3.shown} -qArrayISD_4{INSERTANS:14272X54X9374}{qArrayISD_4.shown} -qArrayISD_5{INSERTANS:14272X54X9375}{qArrayISD_5.shown} -qArrayISD_6{INSERTANS:14272X54X9376}{qArrayISD_6.shown} -qArrayISD_7{INSERTANS:14272X54X9377}{qArrayISD_7.shown} -qArrayNumbers_ls1_min{INSERTANS:14272X54X938ls1_min}{qArrayNumbers_ls1_min.shown} -qArrayNumbers_ls1_max{INSERTANS:14272X54X938ls1_max}{qArrayNumbers_ls1_max.shown} -qArrayNumbers_ls1_avg{INSERTANS:14272X54X938ls1_avg}{qArrayNumbers_ls1_avg.shown} -qArrayNumbers_todo_min{INSERTANS:14272X54X938todo_min}{qArrayNumbers_todo_min.shown} -qArrayNumbers_todo_max{INSERTANS:14272X54X938todo_max}{qArrayNumbers_todo_max.shown} -qArrayNumbers_todo_avg{INSERTANS:14272X54X938todo_avg}{qArrayNumbers_todo_avg.shown} -qArrayNumbers_honey_min{INSERTANS:14272X54X938honey_min}{qArrayNumbers_honey_min.shown} -qArrayNumbers_honey_max{INSERTANS:14272X54X938honey_max}{qArrayNumbers_honey_max.shown} -qArrayNumbers_honey_avg{INSERTANS:14272X54X938honey_avg}{qArrayNumbers_honey_avg.shown} -qArrayNumbers_econ_min{INSERTANS:14272X54X938econ_min}{qArrayNumbers_econ_min.shown} -qArrayNumbers_econ_max{INSERTANS:14272X54X938econ_max}{qArrayNumbers_econ_max.shown} -qArrayNumbers_econ_avg{INSERTANS:14272X54X938econ_avg}{qArrayNumbers_econ_avg.shown} -qArrayTexts_hp_1st{INSERTANS:14272X54X939hp_1st}{qArrayTexts_hp_1st.shown} -qArrayTexts_hp_2nd{INSERTANS:14272X54X939hp_2nd}{qArrayTexts_hp_2nd.shown} -qArrayTexts_hp_3rd{INSERTANS:14272X54X939hp_3rd}{qArrayTexts_hp_3rd.shown} -qArrayTexts_st_1st{INSERTANS:14272X54X939st_1st}{qArrayTexts_st_1st.shown} -qArrayTexts_st_2nd{INSERTANS:14272X54X939st_2nd}{qArrayTexts_st_2nd.shown} -qArrayTexts_st_3rd{INSERTANS:14272X54X939st_3rd}{qArrayTexts_st_3rd.shown} -qArrayTexts_sw_1st{INSERTANS:14272X54X939sw_1st}{qArrayTexts_sw_1st.shown} -qArrayTexts_sw_2nd{INSERTANS:14272X54X939sw_2nd}{qArrayTexts_sw_2nd.shown} -qArrayTexts_sw_3rd{INSERTANS:14272X54X939sw_3rd}{qArrayTexts_sw_3rd.shown} -qArrayYNU_1{INSERTANS:14272X54X9401}{qArrayYNU_1.shown} -qArrayYNU_2{INSERTANS:14272X54X9402}{qArrayYNU_2.shown} -qArrayYNU_3{INSERTANS:14272X54X9403}{qArrayYNU_3.shown} -qArrayYNU_4{INSERTANS:14272X54X9404}{qArrayYNU_4.shown} -qArrayYNU_5{INSERTANS:14272X54X9405}{qArrayYNU_5.shown} -qArrayByColumn_1{INSERTANS:14272X54X9411}{qArrayByColumn_1.shown} -qArrayByColumn_2{INSERTANS:14272X54X9412}{qArrayByColumn_2.shown} -qArrayByColumn_3{INSERTANS:14272X54X9413}{qArrayByColumn_3.shown} -qArrayByColumn_4{INSERTANS:14272X54X9414}{qArrayByColumn_4.shown} -qArrayByColumn_5{INSERTANS:14272X54X9415}{qArrayByColumn_5.shown} -qArrayDualScale_money_0{INSERTANS:14272X54X942money#0}{qArrayDualScale_money_0.shown} -qArrayDualScale_money_1{INSERTANS:14272X54X942money#1}{qArrayDualScale_money_1.shown} -qArrayDualScale_health_0{INSERTANS:14272X54X942health#0}{qArrayDualScale_health_0.shown} -qArrayDualScale_health_1{INSERTANS:14272X54X942health#1}{qArrayDualScale_health_1.shown} -qArrayDualScale_md_0{INSERTANS:14272X54X942md#0}{qArrayDualScale_md_0.shown} -qArrayDualScale_md_1{INSERTANS:14272X54X942md#1}{qArrayDualScale_md_1.shown} -qDate{INSERTANS:14272X54X943}{qDate.shown} -qFileUpload{INSERTANS:14272X54X944}{qFileUpload.shown} -qFileUpload_filecount{INSERTANS:14272X54X944_filecount}{qFileUpload_filecount.shown} -qGender{INSERTANS:14272X54X945}{qGender.shown} -qLanguage{INSERTANS:14272X54X946}{qLanguage.shown} -qMultipleNumerical_self{INSERTANS:14272X54X947self}{qMultipleNumerical_self.shown} -qMultipleNumerical_mom{INSERTANS:14272X54X947mom}{qMultipleNumerical_mom.shown} -qMultipleNumerical_dad{INSERTANS:14272X54X947dad}{qMultipleNumerical_dad.shown} -qNumerical{INSERTANS:14272X54X948}{qNumerical.shown} -qRanking_1{INSERTANS:14272X54X9491}{qRanking_1.shown} -qRanking_2{INSERTANS:14272X54X9492}{qRanking_2.shown} -qRanking_3{INSERTANS:14272X54X9493}{qRanking_3.shown} -qRanking_4{INSERTANS:14272X54X9494}{qRanking_4.shown} -qTextDisplay{INSERTANS:14272X54X950}{qTextDisplay.shown} -qYesNo{INSERTANS:14272X54X951}{qYesNo.shown} -qHugeText{INSERTANS:14272X54X952}{qHugeText.shown} -qLongText{INSERTANS:14272X54X953}{qLongText.shown} -qMultipleShort_friend{INSERTANS:14272X54X954friend}{qMultipleShort_friend.shown} -qMultipleShort_family{INSERTANS:14272X54X954family}{qMultipleShort_family.shown} -qMultipleShort_work{INSERTANS:14272X54X954work}{qMultipleShort_work.shown} -qShort{INSERTANS:14272X54X955}{qShort.shown} -qMultipleChoice_Hawaii{INSERTANS:14272X54X956Hawaii}{qMultipleChoice_Hawaii.shown} -qMultipleChoice_Bahamas{INSERTANS:14272X54X956Bahamas}{qMultipleChoice_Bahamas.shown} -qMultipleChoice_Europe{INSERTANS:14272X54X956Europe}{qMultipleChoice_Europe.shown} -qMultipleChoice_NewZealand{INSERTANS:14272X54X956NewZealand}{qMultipleChoice_NewZealand.shown} -qMultChoiceComment_junk{INSERTANS:14272X54X957junk}{qMultChoiceComment_junk.shown} -qMultChoiceComment_junkcomment{INSERTANS:14272X54X957junkcomment}{qMultChoiceComment_junkcomment.shown} -qMultChoiceComment_rtv{INSERTANS:14272X54X957rtv}{qMultChoiceComment_rtv.shown} -qMultChoiceComment_rtvcomment{INSERTANS:14272X54X957rtvcomment}{qMultChoiceComment_rtvcomment.shown} -qMultChoiceComment_ex{INSERTANS:14272X54X957ex}{qMultChoiceComment_ex.shown} -qMultChoiceComment_excomment{INSERTANS:14272X54X957excomment}{qMultChoiceComment_excomment.shown} -]]> - - - - - - - - - - -
      -
      - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[q5C]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLD]]> - - - - - - - - - - - - - - - - - - <![CDATA[junk]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLR]]> - - - - - - - - - - - - - - - - - - <![CDATA[Hawaii]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLWC]]> - - - - - - - - - - - - - - - - - - <![CDATA[rtv]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA]]> - - - - - - - - - - - - - - - - - - <![CDATA[Bahamas]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA10P]]> - - - - - - - - - - - - - - - - - - <![CDATA[ex]]> - - - - - - - - - - - - - - - - - - <![CDATA[qA5P]]> - - - - - - - - - - - - - - - - - - <![CDATA[friend]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[Europe]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAN]]> - - - - - - - - - - - - - - - - - - <![CDATA[family]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAT]]> - - - - - - - - - - - - - - - - - - <![CDATA[NewZealand]]> - - - - - - - - - - - - - - - - - - <![CDATA[qAYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[self]]> - - - - - - - - - - - - - - - - - - <![CDATA[qABC]]> - - - - - - - - - - - - - - - - - - <![CDATA[mom]]> - - - - - - - - - - - - - - - - - - <![CDATA[qADS]]> - - - - - - - - - - - - - - - - - - <![CDATA[work]]> - - - - - - - - - - - - - - - - - - <![CDATA[qD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qFU]]> - - - - - - - - - - - - - - - - - - <![CDATA[money]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[qG]]> - - - - - - - - - - - - - - - - - - <![CDATA[dad]]> - - - - - - - - - - - - - - - - - - <![CDATA[qL]]> - - - - - - - - - - - - - - - - - - <![CDATA[health]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMN]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[qN]]> - - - - - - - - - - - - - - - - - - <![CDATA[md]]> - - - - - - - - - - - - - - - - - - <![CDATA[qR]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[qTD]]> - - - - - - - - - - - - - - - - - - <![CDATA[qYN]]> - - - - - - - - - - - - - - - - - - <![CDATA[1st]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[qHT]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[qLT]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMS]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[qS]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[hp]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[2nd]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[ls1]]> - - - - - - - - - - - - - - - - - - <![CDATA[st]]> - - - - - - - - - - - - - - - - - - <![CDATA[3rd]]> - - - - - - - - - - - - - - - - - - <![CDATA[min]]> - - - - - - - - - - - - - - - - - - <![CDATA[sw]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[max]]> - - - - - - - - - - - - - - - - - - <![CDATA[todo]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[avg]]> - - - - - - - - - - - - - - - - - - <![CDATA[honey]]> - - - - - - - - - - - - - - - - - - <![CDATA[econ]]> - - - - - - - - - - - - - - - - - - <![CDATA[F1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[L1]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - - - <![CDATA[L2]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[7]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[F2]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - - - <![CDATA[L3]]> - - - - - - - - - - - - - - - - - - <![CDATA[L4]]> - - - - - - - - - - - - - - - - - - <![CDATA[F3]]> - - - - - - - - - - - - - - - - - - <![CDATA[L5]]> - - - - - - - - - - - - - - - - - - <![CDATA[L6]]> - - - - - - - - - - - - - - - - - - <![CDATA[F4]]> - - - - - - - - - - - - - - - - - - <![CDATA[F5]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - -
    • Samples of every question type
    • -
    • Default values for any question type that accepts defaults
    • -
    • Reports showing all 16 available EM dot notation suffixes
    • -
    • Proper Qcode and SGQA naming of all variables
    • -
    ]]> - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - - - - - diff --git a/include/limesurvey/docs/demosurveys/ls2_array_filter_tests.lss b/include/limesurvey/docs/demosurveys/ls2_array_filter_tests.lss deleted file mode 100644 index 5bdb4189..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_array_filter_tests.lss +++ /dev/null @@ -1,15022 +0,0 @@ - - - Survey - 155.5 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[f_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[ads_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[an_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[at_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[afive_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[aten_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[aynu_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[aisd_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[af_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[list_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[mc_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[mcc_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[mn_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[ms_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[ar_t1]]> - - - - - - - - - - - - - - - - - - <![CDATA[ads_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[an_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[at_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[afive_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[aten_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[aynu_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[aisd_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[af_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[list_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[mc_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[mcc_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[mn_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[ms_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[ar_et1]]> - - - - - - - - - - - - - - - - - - <![CDATA[f_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[an_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[at_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[afive_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[aten_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[aynu_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[aisd_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[af_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[list_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[mc_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[mcc_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[mn_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[ms_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[ar_t2]]> - - - - - - - - - - - - - - - - - - <![CDATA[ads_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[an_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[at_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[afive_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[aten_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[aynu_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[aisd_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[af_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[list_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[mc_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[mcc_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[mn_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[ms_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[ar_et2]]> - - - - - - - - - - - - - - - - - - <![CDATA[f_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[an_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[at_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[afive_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[aten_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[aynu_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[aisd_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[af_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[list_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[mc_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[mcc_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[mn_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[ms_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[ar_t3]]> - - - - - - - - - - - - - - - - - - <![CDATA[ads_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[an_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[at_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[afive_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[aten_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[aynu_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[aisd_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[af_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[list_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[mc_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[mcc_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[mn_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[ms_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[ar_et3]]> - - - - - - - - - - - - - - - - - - <![CDATA[f_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[an_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[at_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[afive_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[aten_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[aynu_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[aisd_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[af_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[list_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[mc_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[mcc_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[mn_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[ms_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[ar_t4]]> - - - - - - - - - - - - - - - - - - <![CDATA[ads_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[an_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[at_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[afive_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[aten_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[aynu_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[aisd_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[af_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[list_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[mc_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[mcc_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[mn_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[ms_et4]]> - - - - - - - - - - - - - - - - - - <![CDATA[ar_et4]]> - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[m]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - Change the type of first question (f1) to demonstrate that each of the following types of questions can trigger filtering of the other questions:

    Multiple choice
    Multiple choice with comments
    Multiple short text
    Multiple numeric
    Array (5 point, 10 point, Yes/No/Unknown, Increase/Same/Decrease, Column)
    Array (Dual Scale, Text, Numbers)
    Ranking]]>
    - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - .printouttable { margin:1em auto; } .printouttable th { text-align: center; } .printouttable td { border-color: #ddf #ddf #ddf #ddf; border-style: solid; border-width: 1px; padding:0.1em 1em 0.1em 0.5em; } .printouttable td:first-child { font-weight: 700; text-align: right; padding-right: 5px; padding-left: 5px; } .printouttable .printanswersquestion td{ background-color:#F7F8FF; } .printouttable .printanswersquestionhead td{ text-align: left; background-color:#ddf; } .printouttable .printanswersgroup td{ text-align: center; font-weight:bold; padding-top:1em; } Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_cascading_array_filter.lss b/include/limesurvey/docs/demosurveys/ls2_cascading_array_filter.lss deleted file mode 100644 index ac9db83b..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_cascading_array_filter.lss +++ /dev/null @@ -1,2230 +0,0 @@ - - - Survey - 155 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cid - qid - scenario - cqid - cfieldname - method - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - -]]> - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[Q01]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q03]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q04]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q04A]]> - {Q04.shown} your favorite brand of  made-at-home electronics?]]> - - - - - - - - - - - - - - - - - <![CDATA[Q06]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q06A]]> - -]]> - - - - - - - - - - - - - - - - - <![CDATA[Q02]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q05]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q05A]]> - {Q05.shown} your favorite not-made-at-home brand of electronics?]]> - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[D]]> - - - - - - - - - - - - - - - - - - <![CDATA[E]]> - - - - - - - - - - - - - - - - - - <![CDATA[F]]> - - - - - - - - - - - - - - - - - - <![CDATA[G]]> - - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - - <![CDATA[I]]> - - - - - - - - - - - - - - - - - - <![CDATA[J]]> - - - - - - - - - - - - - - - - - - <![CDATA[NA]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[D]]> - - - - - - - - - - - - - - - - - - <![CDATA[E]]> - - - - - - - - - - - - - - - - - - <![CDATA[F]]> - - - - - - - - - - - - - - - - - - <![CDATA[G]]> - - - - - - - - - - - - - - - - - - <![CDATA[H]]> - - - - - - - - - - - - - - - - - - <![CDATA[I]]> - - - - - - - - - - - - - - - - - - <![CDATA[J]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[6]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleAnalyticsStyle - googleAnalyticsAPIKey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - This survey is based off the design of a survey courtesy of Joy Lane Research, LLC.

    -

    - They identified a bug in 1.91+ which prevented proper use of cascading array filters.  In 1.91+, say you first pick several options from Q01 and Q02, then pick a favorite from Q04.  If you uncheck the favorite option in Q01, that option does not disappear from Q04.  We also discovered the 'other' option were not being handled correctly.

    -

    - This survey shows that LimeSurvey 1.92 with Expression Manager makes the cascading work correctly.  It also lets us pick an 'other' option and have its label carry through to subsequent questions.  This survey also shows that you can simultaneously use array_filter and array_filter_exclude (see question Q05).

    -]]>
    - - This survey is based off the design of a survey courtesy of Joy Lane Research, LLC.

    -

    - They identified a bug in 1.91+ which prevented proper use of cascading array filters.  In 1.91+, say you first pick several options from Q01 and Q02, then pick a favorite from Q04.  If you uncheck the favorite option in Q01, that option does not disappear from Q04.  We also discovered the 'other' option were not being handled correctly.

    -

    - This survey shows that LimeSurvey 1.92 with Expression Manager makes the cascading work correctly.  It also lets us pick an 'other' option and have its label carry through to subsequent questions.  This survey also shows that you can simultaneously use array_filter and array_filter_exclude (see question Q05).

    -]]>
    - - - - -
    You have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    This email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} at {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - - - - - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_cascading_array_filter_exclude.lss b/include/limesurvey/docs/demosurveys/ls2_cascading_array_filter_exclude.lss deleted file mode 100644 index cd4e3054..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_cascading_array_filter_exclude.lss +++ /dev/null @@ -1,928 +0,0 @@ - - - Survey - 155 - - en - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[l1]]> - - - - - - - - - - - - - - - - - - <![CDATA[l2]]> - - - - - - - - - - - - - - - - - - <![CDATA[l3]]> - - - - - - - - - - - - - - - - - - <![CDATA[l4]]> - - - - - - - - - - - - - - - - - - <![CDATA[l5]]> - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[cross]]> - - - - - - - - - - - - - - - - - - <![CDATA[circl]]> - - - - - - - - - - - - - - - - - - <![CDATA[trian]]> - - - - - - - - - - - - - - - - - - <![CDATA[spira]]> - - - - - - - - - - - - - - - - - - <![CDATA[squar]]> - - - - - - - - - - - - - - - - - - <![CDATA[cross]]> - - - - - - - - - - - - - - - - - - <![CDATA[circl]]> - - - - - - - - - - - - - - - - - - <![CDATA[spira]]> - - - - - - - - - - - - - - - - - - <![CDATA[trian]]> - - - - - - - - - - - - - - - - - - <![CDATA[squar]]> - - - - - - - - - - - - - - - - - - <![CDATA[cross]]> - - - - - - - - - - - - - - - - - - <![CDATA[circl]]> - - - - - - - - - - - - - - - - - - <![CDATA[spira]]> - - - - - - - - - - - - - - - - - - <![CDATA[trian]]> - - - - - - - - - - - - - - - - - - <![CDATA[squar]]> - - - - - - - - - - - - - - - - - - <![CDATA[cross]]> - - - - - - - - - - - - - - - - - - <![CDATA[circl]]> - - - - - - - - - - - - - - - - - - <![CDATA[spira]]> - - - - - - - - - - - - - - - - - - <![CDATA[trian]]> - - - - - - - - - - - - - - - - - - <![CDATA[squar]]> - - - - - - - - - - - - - - - - - - <![CDATA[cross]]> - - - - - - - - - - - - - - - - - - <![CDATA[circl]]> - - - - - - - - - - - - - - - - - - <![CDATA[spira]]> - - - - - - - - - - - - - - - - - - <![CDATA[trian]]> - - - - - - - - - - - - - - - - - - <![CDATA[squar]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}

    If you have blacklisted before but want to participate in this survey and want to receive invitations please click the following link:
    {OPTINURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - .printouttable { margin:1em auto; } .printouttable th { text-align: center; } .printouttable td { border-color: #ddf #ddf #ddf #ddf; border-style: solid; border-width: 1px; padding:0.1em 1em 0.1em 0.5em; } .printouttable td:first-child { font-weight: 700; text-align: right; padding-right: 5px; padding-left: 5px; } .printouttable .printanswersquestion td{ background-color:#F7F8FF; } .printouttable .printanswersquestionhead td{ text-align: left; background-color:#ddf; } .printouttable .printanswersgroup td{ text-align: center; font-weight:bold; padding-top:1em; } Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_comma_as_radix_separator.lss b/include/limesurvey/docs/demosurveys/ls2_comma_as_radix_separator.lss deleted file mode 100644 index e1bad4dd..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_comma_as_radix_separator.lss +++ /dev/null @@ -1,2008 +0,0 @@ - - - Survey - 155 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[Q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q4]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q5]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q6]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q7]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q8]]> - - - - - - - - - - - - - - - - - - <![CDATA[Q9]]> - - - - - - - - - - - - - - - - - - <![CDATA[thanks]]> - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[X]]> - - - - - - - - - - - - - - - - - - <![CDATA[Y]]> - - - - - - - - - - - - - - - - - - <![CDATA[Z]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[X]]> - - - - - - - - - - - - - - - - - - <![CDATA[Y]]> - - - - - - - - - - - - - - - - - - <![CDATA[Z]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_countifop_sumifop.lss b/include/limesurvey/docs/demosurveys/ls2_countifop_sumifop.lss deleted file mode 100644 index bf60d7be..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_countifop_sumifop.lss +++ /dev/null @@ -1,920 +0,0 @@ - - - Survey - 155.5 - - en - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[an]]> - - - - - - - Purpose - - Equation - - Result - - - - - - # answered - - count(self) - - {count(self)} - - - - grand total - - sum(self) - - {sum(self)} - - - - # answered in column C - - count(self.sq_C) - - {count(self.sq_C)} - - - - sum of column C - - sum(self.sq_C) - - {sum(self.sq_C)} - - - - sum of columns B-D - - sum(self.sq_B.sq_C.sq_D) - - {sum(self.sq_B.sq_C.sq_D)} - - - - # of negative values - - countifop("lt",0,self) - - {countifop("lt",0,self)} - - - - sum of positive values - - sumifop("gt",0,self) - - {sumifop("gt",0,self)} - - - - count of even numbers - - countifop("RX","/[02468]$/",self) - - {countifop("RX","/[02468]$/",self)} - - - - sum of odd numbers - - sumifop("RX","/[13579]$/",self) - - {sumifop("RX","/[13579]$/",self)} - - - -

    -  

    -]]>
    - - - - - - - -
    - - - - - - - <![CDATA[result]]> - - - - - Purpose - - Equation - - Result - - - - - - # answered - - count(that.an) - - {count(that.an)} - - - - grand total - - sum(that.an) - - {sum(that.an)} - - - - # answered in column C - - count(that.an.sq_C) - - {count(that.an.sq_C)} - - - - sum of column C - - sum(that.an.sq_C) - - {sum(that.an.sq_C)} - - - - sum of columns B-D - - sum(that.an.sq_B.sq_C.sq_D) - - {sum(that.an.sq_B.sq_C.sq_D)} - - - - # of negative values - - countifop("lt",0,that.an) - - {countifop("lt",0,that.an)} - - - - sum of positive values - - sumifop("gt",0,that.an) - - {sumifop("gt",0,that.an)} - - - - count of even numbers - - countifop("RX","/[02468]$/",that.an) - - {countifop("RX","/[02468]$/",that.an)} - - - - sum of odd numbers - - sumifop("RX","/[13579]$/",that.an) - - {sumifop("RX","/[13579]$/",that.an)} - - - -

    -  

    -]]>
    - - - - - - - - - -
    -
    -
    - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[D]]> - - - - - - - - - - - - - - - - - - <![CDATA[E]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_em_tailoring.lss b/include/limesurvey/docs/demosurveys/ls2_em_tailoring.lss deleted file mode 100644 index 59c600be..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_em_tailoring.lss +++ /dev/null @@ -1,3746 +0,0 @@ - - - Survey - 155 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -It demonstrates the use of hidden Equation-type questions, whose values are stored in the database even though hidden on the screen.]]> - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[math]]> - -FunctionSyntaxResult -Absolute valueabs({num}){if(is_numeric(num),abs(num),'')} -Arc cosineacos({num}){if(is_numeric(num),acos(num),'')} -Arc sineasin({num}){if(is_numeric(num),asin(num),'')} -Arc tangent of two variablesatan2({num},{num2}){if(is_numeric(num) && is_numeric(num2),atan2(num,num2),'')} -Arc tangentatan({num}){if(is_numeric(num),atan(num),'')} -Round fractions upceil({num}){if(is_numeric(num),ceil(num),'')} -Cosinecos({num}){if(is_numeric(num),cos(num),'')} -Calculates the exponent of eexp({num}){if(is_numeric(num),exp(num),'')} -Round fractions downfloor({num}){if(is_numeric(num),floor(num),'')} -Finds whether a value is not a numberis_nan({num}){if(is_numeric(num),is_nan(num),'')} -Natural logarithmlog({num}){if(is_numeric(num),log(num),'')} -Get value of pipi(){pi()} -Exponential expressionpow({num},{num2}){if(is_numeric(num) && is_numeric(num2),pow(num,num2),'')} -Generate a random integerrand(){rand()} -Rounds a floatround({num}){if(is_numeric(num),round(num),'')} -Sinesin({num}){if(is_numeric(num),sin(num),'')} -Square rootsqrt({num}){if(is_numeric(num),sqrt(num),'')} -Calculate the sum of values in an arraysum({num}){if(is_numeric(num),sum(num),'')} -Tangenttan({num}){if(is_numeric(num),tan(num),'')} -Find lowest valuemin({num2},{num},{num}+{num2},{num}-{num2},{num}*{num2},{num}/2){if(is_numeric(num),min(num2,num,num+num2,num-num2,num*num2,num/2),'')} -Find highest valuemax({num2},{num},{num}+{num2},{num}-{num2},{num}*{num2},{num}/2){if(is_numeric(num),max(num2,num,num+num2,num-num2,num*num2,num/2),'')} -Sumsum({num2},{num},{num}+{num2},{num}-{num2},{num}*{num2},{num}/2){if(is_numeric(num),sum(num2,num,num+num2,num-num2,num*num2,num/2),'')} -Join array elements with a stringimplode('~',{num2},{num},{num}+{num2},{num}-{num2},{num}*{num2},{num}/2){implode('~',num2,num,num+num2,num-num2,num*num2,num/2)} -Get the integer value of a variableintval({num}){if(is_numeric(num),intval(num),'')} -Finds whether the type of a variable is floatis_float({num}){if(is_numeric(num),is_float(num),'')} -Finds whether the type of a variable is integeris_int({num}){if(is_numeric(num),is_int(num),'')} -Finds whether the type of a variable is NULLis_null({num}){is_null(num)} -Finds whether a variable is a number or a numeric stringis_numeric({num}){is_numeric(num)} -Finds whether the type of a variable is stringis_string({num}){is_string(num)} -Determine whether a variable is considered to be emptyis_empty({num}){is_empty(num)} -]]> - - - - - - - - - - - - - - - - - <![CDATA[num]]> - - - - - - - - - - - - - - - - - - <![CDATA[num2]]> - - - - - - - - - - - - - - - - - - <![CDATA[name]]> - - - - - - - - - - - - - - - - - - <![CDATA[age]]> - - - - - - - - - - - - - - - - - - <![CDATA[married]]> - - - 5 (and one hopes much older)]]> - - - - - - - 5]]> - - - - - - - - <![CDATA[numKids]]> - - - 11 (and one hopes much older)]]> - - - - - - - 11]]> - - - - - - - - <![CDATA[message2]]> - -{if(is_empty(name),'',if(is_empty(age),'How old are you?',implode(' ','So, you are',age,'years old. Funny, you don\'t look it.')))}
    -{if(numKids>0,implode(' ','I hope you enjoy playing with your',if(numKids==1,'child!',implode(' ',numKids,'children!')),' I love my two girls!'),'')}
    -{if(numKids>1,implode('','The sum of the ages of your first ',min(5,numKids),' children is ',sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK),''),'')}
    -{if(sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)>age,'Wow, that means that the combined age of your children exceeds your own!','')}
    -{if((married=='Y' and max(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)>yearsMarried),'Hmmm, your oldest child is older than your marriage. Interesting.','')}]]>
    - - - - - - - - - -
    - - - - - - - <![CDATA[yearsMarried]]> - - - - - - - - - - - - - - - - - - <![CDATA[kid1]]> - - - - - - - - - - = 1]]> - - - - - - - - <![CDATA[kid2]]> - - - - - - - - - - = 2]]> - - - - - - - - <![CDATA[kid3]]> - - - - - - - - - - = 3]]> - - - - - - - - <![CDATA[kid4]]> - - - - - - - - - - = 4]]> - - - - - - - - <![CDATA[kid5]]> - - - - - - - - - - = 5]]> - - - - - - - - <![CDATA[tThanks]]> - - You're all done, thanks!

    -]]>
    - - - - - - - - - -
    - - - - - - - <![CDATA[city]]> - - - - - - - - - - - - - - - - - - <![CDATA[yearsThere]]> - - - - - - - - - - - - - - - - - - <![CDATA[ranking]]> - - - - - - - - - - - - - - - - - - <![CDATA[opinions]]> - - - - - - - - - - - - - - - - - - <![CDATA[worries]]> - - - - - - - - - - - - - - - - - - <![CDATA[report]]> - - - - - - - - - - - - - - - - - - - -
    #QuestionCodeValueShown
    {city.qid}{city.question}{city}{city.value}{city.shown}
    {yearsThere.qid}{yearsThere.question}{yearsThere}{yearsThere.value}{yearsThere.shown}
    {ranking_1.qid}{ranking_1.question}{ranking_1}{ranking_1.value}{ranking_1.shown}
    {ranking_2.qid}{ranking_2.question}{ranking_2}{ranking_2.value}{ranking_2.shown}
    {ranking_3.qid}{ranking_3.question}{ranking_3}{ranking_3.value}{ranking_3.shown}
    {ranking_4.qid}{ranking_4.question}{ranking_4}{ranking_4.value}{ranking_4.shown}
    {opinions_tax.qid}{opinions_tax.question}{opinions_tax}{opinions_tax.value}{opinions_tax.shown}
    {opinions_srv.qid}{opinions_srv.question}{opinions_srv}{opinions_srv.value}{opinions_srv.shown}
    {opinions_evt.qid}{opinions_evt.question}{opinions_evt}{opinions_evt.value}{opinions_evt.shown}
    {worries_taxes_0.qid}{worries_taxes_0.question}{worries_taxes_0}{worries_taxes_0.value}{worries_taxes_0.shown}
    {worries_taxes_1.qid}{worries_taxes_1.question}{worries_taxes_1}{worries_taxes_1.value}{worries_taxes_1.shown}
    {worries_smog_0.qid}{worries_smog_0.question}{worries_smog_0}{worries_smog_0.value}{worries_smog_0.shown}
    {worries_smog_1.qid}{worries_smog_1.question}{worries_smog_1}{worries_smog_1.value}{worries_smog_1.shown}
    {worries_trans_0.qid}{worries_trans_0.question}{worries_trans_0}{worries_trans_0.value}{worries_trans_0.shown}
    {worries_trans_1.qid}{worries_trans_1.question}{worries_trans_1}{worries_trans_1.value}{worries_trans_1.shown}
    -Is this correct? -]]>
    - - - - - - - - - -
    - - - - - - - <![CDATA[report2]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Var - SGQA - INSERTANS:SGQA
    - city - 36849X70X1445 - {36849X70X1445}, {INSERTANS:36849X70X1445}
    - yearsThere - 36849X70X1446 - {36849X70X1446}, {INSERTANS:36849X70X1446}
    - ranking_2 - 36849X70X14472 - {36849X70X14472}, {INSERTANS:36849X70X14472}
    - opinions_srv - 36849X70X1448srv - {36849X70X1448srv}, {INSERTANS:36849X70X1448srv}
    - worries_smog_0 - 36849X70X1449smog#0 - {36849X70X1449smog#0}, {INSERTANS:36849X70X1449smog#0}
    - worries_trans_1 - 36849X70X1449trans#1 - {36849X70X1449trans#1}, {INSERTANS:36849X70X1449trans#1}
    -

    -  

    ]]>
    - - - - - - - - - -
    - - - - - - - <![CDATA[weight]]> - - - - - - - - - - - - - - - - - - <![CDATA[height]]> - - - - - - - - - - - - - - - - - - <![CDATA[BMI]]> - - - - - - - - - - - - - - - - - - <![CDATA[weight_status]]> - - - - - - - - - - - - - - - - - - <![CDATA[Report]]> - -Your Body Mass Index (BMI) is {round(BMI,2)}.
    -Assuming you are an adult, you are {weight_status}.]]>
    - - - - - - - - - -
    - - - - - - - <![CDATA[weight_units]]> - - - - - - - - - - - - - - - - - - <![CDATA[height_units]]> - - - - - - - - - - - - - - - - - - <![CDATA[weight_kg]]> - - - - - - - - - - - - - - - - - - <![CDATA[height_m]]> - - - - - - - - - - - -
    -
    - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[taxes]]> - - - - - - - - - - - - - - - - - - <![CDATA[smog]]> - - - - - - - - - - - - - - - - - - <![CDATA[tax]]> - - - - - - - - - - - - - - - - - - <![CDATA[trans]]> - - - - - - - - - - - - - - - - - - <![CDATA[srv]]> - - - - - - - - - - - - - - - - - - <![CDATA[evt]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_em_validation_q.lss b/include/limesurvey/docs/demosurveys/ls2_em_validation_q.lss deleted file mode 100644 index a7983823..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_em_validation_q.lss +++ /dev/null @@ -1,1823 +0,0 @@ - - - Survey - 155.5 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[mc]]> - - - - - - - - - - - - - - - - - - <![CDATA[a]]> - - - - - - - - - - - - - - - - - - <![CDATA[b]]> - - - - - - - - - - - - - - - - - - <![CDATA[c]]> - - - - - - - - - - - - - - - - - - <![CDATA[e]]> - - - - - - - - - - - - - - - - - - <![CDATA[f]]> - - - - - - - - - - - - - - - - - - <![CDATA[p]]> - - - - - - - - - - - - - - - - - - <![CDATA[r]]> - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[D]]> - - - - - - - - - - - - - - - - - - <![CDATA[E]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (countif("D",self) + countif("S",self))]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - =3]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - This survey demonstrates the use of:

    -
      -
    • - Whole question validation (which now works for more question types)
    • -
    • - Using the 'self' variable within those validation equations
    • -
    • - Creating a multiple forced choice array (must pick one from each column)
    • -
    -]]>
    - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_group_relevance.lss b/include/limesurvey/docs/demosurveys/ls2_group_relevance.lss deleted file mode 100644 index f9bb9391..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_group_relevance.lss +++ /dev/null @@ -1,4249 +0,0 @@ - - - Survey - 155 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - 0]]> - - - - - - - - - - 1 && p1_rel != ""]]> - - - - - - - - - - 2 && p2_rel != ""]]> - - - - - - - - - - 3 && p3_rel != ""]]> - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[name]]> - - - - - - - - - - - - - - - - - - <![CDATA[gender]]> - - - - - - - - - - - - - - - - - - <![CDATA[cohabs]]> - - - - - - - - - - - - - - - - - - <![CDATA[p1_sex]]> - - - - - - - - - - - - - - - - - - <![CDATA[p1_name]]> - - - - - - - - - - - - - - - - - - <![CDATA[p1_age]]> - - - - - - - - - - - - - - - - - - <![CDATA[p1_rel]]> - - - - - - - - - - - - - - - - - - <![CDATA[p1_sum]]> - =1,p1_rel_other,p1_rel.shown)}.]]> - - - - - - - - - - - - - - - - - <![CDATA[age]]> - - - - - - - - - - - - - - - - - - <![CDATA[p2_sex]]> - - - - - - - - - - - - - - - - - - <![CDATA[p2_name]]> - - - - - - - - - - - - - - - - - - <![CDATA[p2_age]]> - - - - - - - - - - - - - - - - - - <![CDATA[p2_rel]]> - - - - - - - - - - - - - - - - - - <![CDATA[p2_sum]]> - =1,p2_rel_other,p2_rel.shown)}.]]> - - - - - - - - - - - - - - - - - <![CDATA[p3_sex]]> - - - - - - - - - - - - - - - - - - <![CDATA[p3_name]]> - - - - - - - - - - - - - - - - - - <![CDATA[p3_age]]> - - - - - - - - - - - - - - - - - - <![CDATA[p3_rel]]> - - - - - - - - - - - - - - - - - - <![CDATA[p3_sum]]> - =1,p3_rel_other,p3_rel.shown)}.]]> - - - - - - - - - - - - - - - - - <![CDATA[p4_sex]]> - - - - - - - - - - - - - - - - - - <![CDATA[p4_name]]> - - - - - - - - - - - - - - - - - - <![CDATA[p4_age]]> - - - - - - - - - - - - - - - - - - <![CDATA[p4_rel]]> - - - - - - - - - - - - - - - - - - <![CDATA[p4_sum]]> - =1,p4_rel_other,p4_rel.shown)}.]]> - - - - - - - - - - - - - - - - - <![CDATA[s_you]]> - - - - - - - - - - - - - - - - - - <![CDATA[sp1]]> - =1,p1_rel_other,p1_rel.shown)}.]]> - - - - - - - - - 0 && p1_rel !=""]]> - - - - - - - - <![CDATA[sp2]]> - =1,p2_rel_other,p2_rel.shown)}.]]> - - - - - - - - - 1 && p2_rel!=""]]> - - - - - - - - <![CDATA[sp3]]> - =1,p3_rel_other,p3_rel.shown)}.]]> - - - - - - - - - 2 && p3_rel!=""]]> - - - - - - - - <![CDATA[sp4]]> - =1,p4_rel_other,p4_rel.shown)}.]]> - - - - - - - - - 3 && p4_rel != ""]]> - - - - - - - - <![CDATA[comment]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - It demonstrates how group-level relevance can make it easier to implement a "loop" of questions. After creating the group for Person 1, I exported the group. Since I used qcode variable names like p1_name instead of the SGQA code, I could use a text editor to quickly edit and re-import the group several times (e.g. it took about 10 seconds to edit and re-import each repeating group, ensuring that all variables had unique variables names and that the group-level logic was correct).

    - -

    This also shows how you can prevent the Finished message from appearing until the survey is truly finished (e.g. all needed groups are completed).

    ]]>
    - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_maximum_chars_feature.lss b/include/limesurvey/docs/demosurveys/ls2_maximum_chars_feature.lss deleted file mode 100644 index 0bc12bd0..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_maximum_chars_feature.lss +++ /dev/null @@ -1,1716 +0,0 @@ - - - Survey - 155 - - en - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[S]]> - - - - - - - - - - - - - - - - - - <![CDATA[t]]> - - - - - - - - - - - - - - - - - - <![CDATA[u]]> - - - - - - - - - - - - - - - - - - <![CDATA[n]]> - - - - - - - - - - - - - - - - - - <![CDATA[k]]> - - - - - - - - - - - - - - - - - - <![CDATA[q]]> - - - - - - - - - - - - - - - - - - <![CDATA[colon]]> - - - - - - - - - - - - - - - - - - <![CDATA[semicolon]]> - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[a]]> - - - - - - - - - - - - - - - - - - <![CDATA[b]]> - - - - - - - - - - - - - - - - - - <![CDATA[c]]> - - - - - - - - - - - - - - - - - - <![CDATA[a]]> - - - - - - - - - - - - - - - - - - <![CDATA[b]]> - - - - - - - - - - - - - - - - - - <![CDATA[c]]> - - - - - - - - - - - - - - - - - - <![CDATA[a]]> - - - - - - - - - - - - - - - - - - <![CDATA[b]]> - - - - - - - - - - - - - - - - - - <![CDATA[c]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[a]]> - - - - - - - - - - - - - - - - - - <![CDATA[b]]> - - - - - - - - - - - - - - - - - - <![CDATA[c]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_plurals_test.lss b/include/limesurvey/docs/demosurveys/ls2_plurals_test.lss deleted file mode 100644 index 3008f4f6..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_plurals_test.lss +++ /dev/null @@ -1,2248 +0,0 @@ - - - Survey - 155 - - en - - - - qid - specialtype - scale_id - sqid - language - defaultvalue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[minSelect]]> - fewest options you want to be able to select?]]> - - - - - - - - - - - - - - - - - <![CDATA[maxSelect]]> - maximum number of options you want to be able to select?]]> - - - - - - - - - - - - - - - - - <![CDATA[minVal]]> - minimum allowable value?]]> - - - - - - - - - - - - - - - - - <![CDATA[maxVal]]> - maximum allowable value?]]> - - - - - - - - - - - - - - - - - <![CDATA[afSrcFilter]]> - - - - - - - - - - - - - - - - - - <![CDATA[array1]]> - - - - - - - - - - - - - - - - - - <![CDATA[array2]]> - - - - - - - - - - - - - - - - - - <![CDATA[array3]]> - - - - - - - - - - - - - - - - - - <![CDATA[array4]]> - - - - - - - - - - - - - - - - - - <![CDATA[marray1]]> - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_self_and_that.lss b/include/limesurvey/docs/demosurveys/ls2_self_and_that.lss deleted file mode 100644 index b73a37bc..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_self_and_that.lss +++ /dev/null @@ -1,1029 +0,0 @@ - - - Survey - 155.5 - - en - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - self.suffix is internally expanded to a comma-separated list of all variable names for the current question. Thus, it is useful for functions that take a variable number of arguments, like sum(), count(), min(), max(), and implode().
    -that.suffix is also expanded.]]>
    - - - -
    -
    -
    - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[q1]]> - - - -sum = {sum(self.NAOK)}
    -min = {min(self.NAOK)}
    -max = {max(self.NAOK)}
    -list = {list(self.NAOK)}
    -stddev = {stddev(self.NAOK)}
    -mean = {if(count(self.NAOK)>0,sum(self.NAOK) / count(self.NAOK),'')}]]>
    - - - - - - - -
    - - - - - - - <![CDATA[q2]]> - - Here is what you entered for question 1, along with the row, column and grand totals.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -   - A - B - C - Total
    - 1 - {q1_1_A} - {q1_1_B} - {q1_1_C} - {sum(that.q1.sq_1)}
    - 2 - {q1_2_A} - {q1_2_B} - {q1_2_C} - {sum(that.q1.sq_2)}
    - 3 - {q1_3_A} - {q1_3_B} - {q1_3_C} - {sum(that.q1.sq_3)}
    - Total - {sum(that.q1.sq_A)} - {sum(that.q1.sq_B)} - {sum(that.q1.sq_C)} - {sum(that.q1)}
    -

    -  

    -]]>
    - - - This is only shown if you answered q1 (e.g. relevance = { count(that.q1)>0 })

    -

    - Note that you can use multiple sub-selectors on self and that.  You can also use the nosq selector to select all columns or rows that do not match the desired pattern.

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Goal - Syntax - Result
    - Sum of odd columns - { sum(that.q1.sq_1.sq_3) } - {sum(that.q1.sq_1.sq_3)}
    - # answered in odd rows - { count(that.q1.nosq_B) } - {count(that.q1.nosq_B)}
    - Max of values in row 2 and column B - { max(that.q1.sq_2.sq_B) } - {max(that.q1.sq_2.sq_B)}
    -

    -  

    -]]>
    - - - - - - - 0]]> -
    - - - - - - - <![CDATA[q3]]> - -how many checked = {count(self.nocomments)}
    -comments = {list(self.comments)}
    ]]>
    - - - - - - - - - -
    -
    -
    - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - =3]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - -
      -
    • -     self
    • -
    • -     self.suffix
    • -
    • -     self.sub-selector
    • -
    • -     self.sub-selector.suffix
    • -
    -
    -suffix is any of the normal qcode suffixes (e.g. NAOK, value, shown)
    -sub-selector is one of:
    -
    -    comments - only subquestions that are comments (e.g. from multiple choice with comment and list with comment)
    -    nocomments - only subquestions that are not comments
    -    sq_X - where X is a row or column identifier. Only sub-questions matching pattern X are selected.
    -
    -The 'that' variable is like the 'self' variable, but lets you refer to other questions. Its syntax is:
    -
      -
    • -     that.qname
    • -
    • -     that.qname.suffix
    • -
    • -     that.qname.sub-selector
    • -
    • -     that.qname.sub-selector.suffix
    • -
    -
    -qname is the question name without any sub-question extensions. So, say you create a question 'q1', that is its qname
    -
    -Examples:
    -
      -
    • -     Has any part of question q1 been answered? { count(that.q1.NAOK)>0 }
    • -
    • -     What is the assessment score for q2? { sum(that.q2.valueNAOK) }
    • -
    • -     What is the grand total of q3? { sum(that.q3.NAOK) }
    • -
    • -     What is the total of row C in q4? { sum(that.q4.sq_C.NAOK) }
    • -
    • -     What is the total of column 2 in q4? { sum(that.q4.sq_2.NAOK) }
    • -
    -]]>
    - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_subquestion_relevance.lss b/include/limesurvey/docs/demosurveys/ls2_subquestion_relevance.lss deleted file mode 100644 index 82360e2d..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_subquestion_relevance.lss +++ /dev/null @@ -1,1319 +0,0 @@ - - - Survey - 155 - - en - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[afSrcFilter]]> - - - - - - - - - - - - - - - - - - <![CDATA[min]]> - - - - - - - - - - - - - - - - - - <![CDATA[max]]> - - - - - - - - - - - - - - - - - - <![CDATA[afK]]> - - - - - - - - - - - - - - - - - - <![CDATA[afeK]]> - - - - - - - - - - - - - - - - - - <![CDATA[Notes]]> -
    -You answered {count(afK_sq1.NAOK,afK_sq2.NAOK,afK_sq3.NAOK,afK_sq4.NAOK,afK_sq5.NAOK,afK_other.NAOK)} questions in afK (sum = {sum(afK_sq1.NAOK,afK_sq2.NAOK,afK_sq3.NAOK,afK_sq4.NAOK,afK_sq5.NAOK,afK_other.NAOK)}).
    -and {count(afeK_sq1.NAOK,afeK_sq2.NAOK,afeK_sq3.NAOK,afeK_sq4.NAOK,afeK_sq5.NAOK,afeK_other.NAOK)} questions in afeK (sum = {sum(afeK_sq1.NAOK,afeK_sq2.NAOK,afeK_sq3.NAOK,afeK_sq4.NAOK,afeK_sq5.NAOK,afeK_other.NAOK)}).]]>
    - - - - - - - - - -
    -
    -
    - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[other]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_test_em_sq_validation.lss b/include/limesurvey/docs/demosurveys/ls2_test_em_sq_validation.lss deleted file mode 100644 index eaf8c08f..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_test_em_sq_validation.lss +++ /dev/null @@ -1,3756 +0,0 @@ - - - Survey - 155 - - en - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[sqK]]> - - - - - - - - - - - - - - - - - - <![CDATA[sqQ]]> - - - - - - - - - - - - - - - - - - <![CDATA[sqMFT]]> - - - - - - - - - - - - - - - - - - <![CDATA[sqMFN]]> - - - - - - - - - - - - - - - - - - <![CDATA[sqS]]> - - - - - - - - - - - - - - - - - - <![CDATA[sqT]]> - - - - - - - - - - - - - - - - - - <![CDATA[sqU]]> - - - - - - - - - - - - - - - - - - <![CDATA[sqN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qK]]> - - - - - - - - - - - - - - - - - - <![CDATA[qQ]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMFT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qMFN]]> - - - - - - - - - - - - - - - - - - <![CDATA[qS]]> - - - - - - - - - - - - - - - - - - <![CDATA[qT]]> - - - - - - - - - - - - - - - - - - <![CDATA[qU]]> - - - - - - - - - - - - - - - - - - <![CDATA[qN]]> - - - - - - - - - - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[Test]]> - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[l]]> - - - - - - - - - - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[h]]> - - - - - - - - - - - - - - - - - - <![CDATA[q1]]> - - - - - - - - - - - - - - - - - - <![CDATA[q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[q2]]> - - - - - - - - - - - - - - - - - - <![CDATA[q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[q3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[A]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[B]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[C]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[4]]> - - - - - - - - - - - - - - - - - - <![CDATA[5]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - = q1_sq2 && q1_sq2 >= q1_sq3 && q1_sq3 >= q1_sq4]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleanalyticsstyle - googleanalyticsapikey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/ls2_validation_tests.lss b/include/limesurvey/docs/demosurveys/ls2_validation_tests.lss deleted file mode 100644 index 17013bbf..00000000 --- a/include/limesurvey/docs/demosurveys/ls2_validation_tests.lss +++ /dev/null @@ -1,6362 +0,0 @@ - - - Survey - 155 - - en - - - - qid - code - answer - assessment_value - sortorder - language - scale_id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - specialtype - scale_id - sqid - language - defaultvalue - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - gid - sid - group_name - group_order - description - language - randomization_group - grelevance - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[v1MC]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1MCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1R]]> - - - - - - - - - - - - - - - - - - <![CDATA[v1K]]> - - - - - - - - - - - - - - - - - - <![CDATA[v2K]]> - - - num and num2 from the first page, so based on current values, between {num} and {num2}.]]> - - - - - - - - - - - - - - - <![CDATA[v1AMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[v3K]]> - - - - - - - - - - - - - - - - - - <![CDATA[v4K]]> - - - num from the first page.)]]> - - - - - - - - - - - - - - - <![CDATA[v5N]]> - - - yearsMarried and age (both from the first page), so based on current values, between {yearsMarried} and {age})]]> - - - - - - - - - - - - - - - <![CDATA[vQ]]> - - - - - - - - - - - - - - - - - - <![CDATA[vS]]> - - - - - - - - - - - - - - - - - - <![CDATA[vT]]> - - - - - - - - - - - - - - - - - - <![CDATA[vU]]> - - - - - - - - - - - - - - - - - - <![CDATA[vfMFtext]]> - - - afSrcFilter from the first page.
    -Please enter a valid US phone number. The Validation Equation is /^(?:\(\d{ 3 }\))\s*\d{ 3 }-\d{ 4 }$/]]>
    - - - - - - - -
    - - - - - - - <![CDATA[Finished]]> - - - - - - - - - - - - - - - - - - <![CDATA[num]]> - - - - - - - - - - - - - - - - - - <![CDATA[num2]]> - - - - - - - - - - - - - - - - - - <![CDATA[age]]> - - - - - - - - - - - - - - - - - - <![CDATA[yearsMarried]]> - - - - - - - - - - - - - - - - - - <![CDATA[afSrcFilter]]> - - - - - - - - - - - - - - - - - - <![CDATA[minSelect]]> - fewest options you want to be able to select?]]> - - - - - - - - - - - - - - - - - <![CDATA[maxSelect]]> - maximum number of options you want to be able to select?]]> - - - - - - - - - - - - - - - - - <![CDATA[afDS]]> - - - - - - - - - - - - - - - - - - <![CDATA[afAMF]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMFtext]]> - - - - - - - - - - - - - - - - - - <![CDATA[af5pc]]> - - - - - - - - - - - - - - - - - - <![CDATA[afA10p]]> - - - - - - - - - - - - - - - - - - <![CDATA[afYNU]]> - - - - - - - - - - - - - - - - - - <![CDATA[afISD]]> - - - - - - - - - - - - - - - - - - <![CDATA[afAFR]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMCC]]> - - - - - - - - - - - - - - - - - - <![CDATA[afL]]> - - - - - - - - - - - - - - - - - - <![CDATA[afMN]]> - - - -Enter at least {minSelect} and at most {maxSelect} values.]]> - - - - - - - - - - - - - - - <![CDATA[afMS]]> - - - - - - - - - - - -
    -
    - - - qid - parent_qid - sid - gid - type - title - question - preg - help - other - mandatory - question_order - language - scale_id - same_default - relevance - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq1]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq2]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq3]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq4]]> - - - - - - - - - - - - - - - - - - <![CDATA[sq5]]> - - - - - - - - - - - - - - - - qid - attribute - value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sid - admin - expires - startdate - adminemail - anonymized - faxto - format - savetimings - template - language - additional_languages - datestamp - usecookie - allowregister - allowsave - autonumber_start - autoredirect - allowprev - printanswers - ipaddr - refurl - publicstatistics - publicgraphs - listpublic - htmlemail - tokenanswerspersistence - assessments - usecaptcha - usetokens - bounce_email - attributedescriptions - emailresponseto - emailnotificationto - tokenlength - showxquestions - showgroupinfo - shownoanswer - showqnumcode - bouncetime - bounceprocessing - bounceaccounttype - bounceaccounthost - bounceaccountpass - bounceaccountencryption - bounceaccountuser - showwelcome - showprogress - allowjumps - navigationdelay - nokeyboard - alloweditaftercompletion - googleAnalyticsStyle - googleAnalyticsAPIKey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - surveyls_survey_id - surveyls_language - surveyls_title - surveyls_description - surveyls_welcometext - surveyls_endtext - surveyls_url - surveyls_urldescription - surveyls_email_invite_subj - surveyls_email_invite - surveyls_email_remind_subj - surveyls_email_remind - surveyls_email_register_subj - surveyls_email_register - surveyls_email_confirm_subj - surveyls_email_confirm - surveyls_dateformat - email_admin_notification_subj - email_admin_notification - email_admin_responses_subj - email_admin_responses - surveyls_numberformat - - - - - - - pression-based validation.
    -It also shows how color coding is used to show whether each question and sub-question is valid.]]>
    - - - - - -
    you have been invited to participate in a survey.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    Recently we invited you to participate in a survey.

    We note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.

    The survey is titled:
    "{SURVEYNAME}"

    "{SURVEYDESCRIPTION}"

    To participate, please click on the link below.

    Sincerely,

    {ADMINNAME} ({ADMINEMAIL})

    ----------------------------------------------
    Click here to do the survey:
    {SURVEYURL}

    If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:
    {OPTOUTURL}]]>
    - -
    You, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.

    To complete this survey, click on the following URL:

    {SURVEYURL}

    If you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.]]>
    - -
    this email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.

    If you have any further questions about this email, please contact {ADMINNAME} on {ADMINEMAIL}.

    Sincerely,

    {ADMINNAME}]]>
    - - -
    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}]]>
    - - - .printouttable { - margin:1em auto; - } - .printouttable th { - text-align: center; - } - .printouttable td { - border-color: #ddf #ddf #ddf #ddf; - border-style: solid; - border-width: 1px; - padding:0.1em 1em 0.1em 0.5em; - } - - .printouttable td:first-child { - font-weight: 700; - text-align: right; - padding-right: 5px; - padding-left: 5px; - - } - .printouttable .printanswersquestion td{ - background-color:#F7F8FF; - } - - .printouttable .printanswersquestionhead td{ - text-align: left; - background-color:#ddf; - } - - .printouttable .printanswersgroup td{ - text-align: center; - font-weight:bold; - padding-top:1em; - } - Hello,

    A new response was submitted for your survey '{SURVEYNAME}'.

    Click the following link to reload the survey:
    {RELOADURL}

    Click the following link to see the individual response:
    {VIEWRESPONSEURL}

    Click the following link to edit the individual response:
    {EDITRESPONSEURL}

    View statistics by clicking here:
    {STATISTICSURL}


    The following answers were given by the participant:
    {ANSWERTABLE}]]>
    - -
    -
    -
    -
    diff --git a/include/limesurvey/docs/demosurveys/sample_survey.csv b/include/limesurvey/docs/demosurveys/sample_survey.csv deleted file mode 100644 index 0010d934..00000000 --- a/include/limesurvey/docs/demosurveys/sample_survey.csv +++ /dev/null @@ -1,294 +0,0 @@ -# LimeSurvey Survey Dump -# DBVersion 142 -# This is a dumped survey from the LimeSurvey Script -# http://www.limesurvey.org/ -# Do not change this header! - -# -# SURVEYS TABLE -# -"sid","owner_id","admin","active","expires","startdate","adminemail","private","faxto","format","template","language","additional_languages","datestamp","usecookie","notification","allowregister","allowsave","autonumber_start","autoredirect","allowprev","printanswers","ipaddr","refurl","datecreated","publicstatistics","publicgraphs","listpublic","htmlemail","tokenanswerspersistence","assessments","usecaptcha","usetokens","bounce_email","attributedescriptions","emailresponseto","tokenlength" -"29846","1","Administratorname","N","","","admin@localhost","Y","000-00000000","G","default","en","","Y","N","0","N","Y","4","N","Y","Y","N","N","2008-04-21","Y","Y","N","N","N","Y","N","N","admin@localhost","","admin@localhost","15" - -# -# GROUPS TABLE -# -"gid","sid","group_name","group_order","description","language" -"613","29846","Array Questions","0","This is a group with the different array questions.","en" -"614","29846","Text Questions","4","","en" -"615","29846","Mask Questions","1","This is the group description.","en" -"616","29846","Single Choice Questions","3","","en" -"617","29846","Multiple Choice Questions","2","This group consist only of Multiple Choice questions.","en" - -# -# QUESTIONS TABLE -# -"qid","sid","gid","type","title","question","preg","help","other","mandatory","lid","lid1","question_order","language" -"3406","29846","613","A","A","Type A - Array 5 Point Choice Question","","","N","N","0","0","0","en" -"3407","29846","613","B","B","Type B - Array 10 point choice Question","","This is the help text for this question. ","N","N","0","0","1","en" -"3408","29846","613","C","C","Type C - Array Yes/No/Uncertain Question","","","N","N","0","0","2","en" -"3409","29846","613","E","E","Type E - Array Increase/Same/Decrease Question","","This is the questions help text.","N","N","0","0","3","en" -"3410","29846","613","F","F","Type F - Array using Flexible Labels question","","This is a array using a flexible label set. Flexible labels sets can be created with as many answer as you like to. We created only one for this survey that will be re-used over and over.","N","N","318","0","4","en" -"3411","29846","613","H","H","Type H - Array Flexible Labels by Column question","","This is the same question type as before just the orientation has changed","N","N","318","0","6","en" -"3412","29846","613","F","Semantic","Semantic Differential Question Type
    ","","This question type is a modification of Array (flexible labels).
    ","N","N","319","0","7","en" -"3413","29846","613","1","DualScale-radio","Array (Flexible Labels) dual scale (radio)
    ","","","N","N","320","320","9","en" -"3414","29846","613",":",":","Array (Multi Flexi) (Numbers) - Allows a table of dropdowns containing number selections set by question attributes.
    ","","","N","N","321","0","11","en" -"3415","29846","613",";",";","Array (Multi Flexi) (Text) - Allows a table of text inputs
    ","","","N","N","321","0","12","en" -"3416","29846","613","1","DualScale-dropdown","Array (Flexible Labels) dual scale (dropdown)
    ","","","N","N","320","320","10","en" -"3417","29846","613",":",":","Array (Multi Flexi) (Numbers - checkbox) - Allows a table of dropdowns containing number selections set by question attributes.
    ","","","N","N","321","0","13","en" -"3418","29846","613","F","F","Type F - Array using Flexible Labels question (answerwidth = 50)
    ","","This is a array using a flexible label set. Flexible labels sets can be created with as many answer as you like to. We created only one for this survey that will be re-used over and over.","N","N","318","0","5","en" -"3419","29846","614","Q","Q","Type Q - Multiple Short Text Question","","This is a Multiple Short Text Question","N","N","0","0","0","en" -"3420","29846","614","T","T","Type T - Long Text Question?","","Helptext","N","N","0","0","4","en" -"3421","29846","614","S","S","Type S - Short Free Text?","","helptext","N","N","0","0","3","en" -"3422","29846","614","U","U","Type U - Huge Free text?","","Helptext","N","N","0","0","5","en" -"3423","29846","614","Q","Q","Type Q - Multiple Short Text Question (with suffix and prefix)
    ","","This is a Multiple Short Text Question","N","N","0","0","1","en" -"3424","29846","614","Q","Q","Type Q - Multiple Short Text Question (long "answers")
    ","","This is a Multiple Short Text Question","N","N","0","0","2","en" -"3425","29846","615","X","X","Type X - Boilerplate question","","This is the boilerplate question type. It's not so much a question but a simple text display.","N","Y","0","0","9","en" -"3426","29846","615","G","G","Type G - Gender question?","","This is a standard question aksing for the participiant's sex.","N","N","0","0","2","en" -"3427","29846","615","N","N","Type N - Numerical Input Question","","","N","Y","0","0","3","en" -"3428","29846","615","R","R","Type R - Ranking Question","","","N","N","0","0","8","en" -"3429","29846","615","Y","Y","Type Y - Yes/No Question","","","N","N","0","0","10","en" -"3430","29846","615","D","D","Type D - Date question?","","Helptext","N","N","0","0","0","en" -"3431","29846","615","K","K","Multiple Numerical Input
    ","","","N","N","0","0","4","en" -"3432","29846","615","K","K","Multiple Numerical Input (slider layout)
    ","","You can slide the button along.
    ","N","Y","0","0","7","en" -"3433","29846","615","D","D","Type D - Date question? (dropdown dates)
    ","","Helptext","N","N","0","0","1","en" -"3434","29846","615","K","K","Multiple Numerical Input (equals 10)
    ","","add numbers to the boxes above
    ","N","N","0","0","6","en" -"3435","29846","615","K","K","Multiple Numerical Input (with prefix and suffix)
    ","","","N","N","0","0","5","en" -"3436","29846","616","Z","Z","Type Z - List Flexible Labels (Radio)","","This question is reusing the same label set as some of the array questions.","N","N","318","0","5","en" -"3437","29846","616","W","W","Type W - List Flexible Labels Dropdown question type","","This question is reusing the same label set as some of the array questions.","N","N","318","0","4","en" -"3438","29846","616","O","O","Type O - List with Comment Question","","","N","N","0","0","3","en" -"3439","29846","616","L","L","Type L - List Radio qeustion","","","Y","N","0","0","2","en" -"3440","29846","616","5","5","Type 5 - 5 point choice","","Help2","N","N","0","0","1","en" -"3441","29846","616","!","!","Type ! - List Dropdown Question","","","Y","N","0","0","0","en" -"3442","29846","617","P","P","Type P - Multiple Options Question with Comments ","","This is a Multiple Options Question with the ability to comment it.","Y","N","0","0","1","en" -"3443","29846","617","M","M","Type M - Multiple Options Question","","This is a type M multiple Options questions.","Y","N","0","0","0","en" -"3444","29846","613","K","Semantic-Slider","Semantic Differential in Slider Layout Question Type
    ","","","N","N","0","0","8","en" - -# -# ANSWERS TABLE -# -"qid","code","answer","default_value","assessment_value","sortorder","language" -"3406","A1","FBI","N","0","0","en" -"3406","A2","CIA","N","0","1","en" -"3406","A3","G5","N","0","2","en" -"3406","A4","NASA","N","0","3","en" -"3407","B1","Darth Vader","N","0","0","en" -"3407","B2","Luke Skywalker","N","0","1","en" -"3407","B3","Princess Leia","N","0","2","en" -"3407","B4","Jabba the Hut","N","0","3","en" -"3408","C1","I am blonde","N","0","0","en" -"3408","C2","I am blue","N","0","1","en" -"3408","C3","I am pissed","N","0","2","en" -"3408","C4","I am drunk","N","0","3","en" -"3409","E1","Pain","N","0","0","en" -"3409","E2","Pleasure","N","0","1","en" -"3409","E3","Luck","N","0","2","en" -"3409","E4","Happiness","N","0","3","en" -"3410","F1","Deannan Troi","N","0","0","en" -"3410","F2","Wesley Crusher","N","0","1","en" -"3410","F3","Jean-Luc Picard","N","0","2","en" -"3410","F4","Seven of Nine","N","0","3","en" -"3411","H1","Deannan Troi","N","0","0","en" -"3411","H2","Wesley Crusher","N","0","1","en" -"3411","H3","Data","N","0","2","en" -"3411","H4","Jean-Luc Picard","N","0","3","en" -"3412","1","sweet|bitter","N","1","1","en" -"3412","2","fair|unfair","N","2","2","en" -"3412","3","warm|cold","N","3","3","en" -"3412","4","beautiful|ugly","N","4","4","en" -"3412","5","meaningful|meaningless","N","5","5","en" -"3412","6","bright|dark","N","6","6","en" -"3413","1","television program","N","1","1","en" -"3413","2","radio program","N","2","2","en" -"3413","3","cinema program","N","3","3","en" -"3414","1","Google","N","1","1","en" -"3414","2","Yahoo","N","2","2","en" -"3414","3","Microsoft Search","N","3","3","en" -"3415","1","Google","N","1","1","en" -"3415","2","Yahoo","N","2","2","en" -"3415","3","Microsoft Search","N","3","3","en" -"3416","1","television program","N","1","1","en" -"3416","2","radio program","N","2","2","en" -"3416","3","cinema program","N","3","3","en" -"3417","1","Google","N","1","1","en" -"3417","2","Yahoo","N","2","2","en" -"3417","3","Microsoft Search","N","3","3","en" -"3418","F1","Deannan Troi","N","0","0","en" -"3418","F2","Wesley Crusher","N","0","1","en" -"3418","F3","Jean-Luc Picard","N","0","2","en" -"3418","F4","Seven of Nine","N","0","3","en" -"3419","Q1","blue","N","0","0","en" -"3419","Q2","red","N","0","1","en" -"3419","Q3","green","N","0","2","en" -"3423","Q1","blue","N","0","0","en" -"3423","Q2","red","N","0","1","en" -"3423","Q3","green","N","0","2","en" -"3424","Q1","blue is the colour of the sky. the sky is very high. the sky is also very big","N","0","0","en" -"3424","Q2","red is the colour of blood. blood is very useful. blood is a very nice color","N","0","1","en" -"3424","Q3","green is the color of trees. I like trees. I especially like climbing them with a rope and harness.","N","0","2","en" -"3428","R1","Red","N","0","0","en" -"3428","R2","Green","N","0","1","en" -"3428","R3","Blue","N","0","2","en" -"3431","1","Apples","N","1","1","en" -"3431","2","Oranges","N","2","2","en" -"3431","3","Bananas","N","3","3","en" -"3432","1","Apples","N","1","1","en" -"3432","2","Oranges","N","2","2","en" -"3432","3","Bananas","N","3","3","en" -"3434","1","Apples","N","1","1","en" -"3434","2","Oranges","N","2","2","en" -"3434","3","Bananas","N","3","3","en" -"3435","1","Apples","N","1","1","en" -"3435","2","Oranges","N","2","2","en" -"3435","3","Bananas","N","3","3","en" -"3438","O1","Red","N","0","0","en" -"3438","O2","Green","N","0","1","en" -"3438","O3","Blue","N","0","2","en" -"3439","L1"," Green","N","0","0","en" -"3439","L2","Red","N","0","1","en" -"3439","L3","Blue","N","0","2","en" -"3441","EC1","Green","N","0","0","en" -"3441","EC2","Red","N","0","1","en" -"3441","EC3","Blue","N","0","2","en" -"3442","P1","I am glad","N","0","0","en" -"3442","P2","I don't care","N","0","1","en" -"3442","P3","I am unhappy","N","0","2","en" -"3443","M1","Yes","N","0","0","en" -"3443","M2","No","N","0","1","en" -"3443","M3","Maybe","N","0","2","en" -"3444","1","|sweet|bitter","N","0","1","en" -"3444","2","|fair|unfair","N","0","2","en" -"3444","3","|warm|cold","N","0","3","en" -"3444","4","|beautiful|ugly","N","0","4","en" -"3444","5","|meaningful|meaningless","N","0","5","en" -"3444","6","|bright|dark","N","0","6","en" - -# -# CONDITIONS TABLE -# - -# -# LABELSETS TABLE -# -"lid","label_name","languages" -"318","Test Labelset","en" -"319","-2_to_+2","en" -"320","1_to_5","en" -"321","Search Engine Criteria","en" - -# -# LABELS TABLE -# -"lid","code","title","sortorder","language","assessment_value" -"318","TL1","6 - Like it very much","0","en","0" -"318","TL2","5","1","en","0" -"318","TL3","4","2","en","0" -"318","TL4","3","3","en","0" -"318","TL5","2","4","en","0" -"318","TL6","1 - Dont like it at all","5","en","0" -"319","1","-2","1","en","1" -"319","2","-1","2","en","2" -"319","3","0","3","en","3" -"319","4","1","4","en","4" -"319","5","2","5","en","5" -"320","1","1","1","en","1" -"320","2","2","2","en","2" -"320","3","3","3","en","3" -"320","4","4","4","en","4" -"320","5","5","5","en","5" -"321","ACC","Accuracy","3","en","0" -"321","DSN","Design","2","en","0" -"321","SPD","Speed","1","en","0" - -# -# QUESTION_ATTRIBUTES TABLE -# -"qaid","qid","attribute","value" -"2758","3413","answer_width","50" -"2759","3413","dualscale_headerA","satisfaction" -"2760","3413","dualscale_headerB","importance" -"2761","3414","multiflexible_max","20" -"2762","3414","multiflexible_step","2" -"2763","3414","multiflexible_min","10" -"2764","3416","answer_width","50" -"2765","3432","equals_num_value","10" -"2766","3432","slider_layout","1" -"2767","3433","dropdown_dates","1" -"2768","3434","equals_num_value","10" -"2769","3416","dualscale_headerA","satisfaction" -"2770","3416","dualscale_headerB","importance" -"2771","3416","use_dropdown","1" -"2772","3417","multiflexible_max","20" -"2773","3417","multiflexible_step","2" -"2774","3417","multiflexible_min","10" -"2775","3417","multiflexible_checkbox","1" -"2776","3418","answer_width","50" -"2777","3435","prefix","prefix" -"2778","3423","suffix","suffix" -"2779","3423","prefix","prefix" -"2780","3435","suffix","suffix" -"2781","3416","array_filter","" -"2782","3416","array_filter_exclude","" -"2783","3416","dropdown_prepostfix","" -"2784","3416","dropdown_separators","" -"2785","3416","hidden","0" -"2786","3416","page_break","0" -"2787","3416","public_statistics","0" -"2788","3416","random_order","0" -"2789","3416","scale_export","0" -"2790","3444","equals_num_value","" -"2791","3444","hide_tip","0" -"2792","3444","hidden","0" -"2793","3444","max_num_value","" -"2794","3444","max_num_value_sgqa","" -"2795","3444","maximum_chars","" -"2796","3444","min_num_value","" -"2797","3444","min_num_value_sgqa","" -"2798","3444","num_value_equals_sgqa","" -"2799","3444","page_break","0" -"2800","3444","prefix","" -"2801","3444","public_statistics","0" -"2802","3444","random_order","0" -"2803","3444","slider_layout","1" -"2804","3444","slider_min","-5" -"2805","3444","slider_max","+5" -"2806","3444","slider_accuracy","1" -"2807","3444","slider_default","0" -"2808","3444","slider_middlestart","1" -"2809","3444","slider_showminmax","1" -"2810","3444","slider_separator","|" -"2811","3444","suffix","" -"2812","3444","text_input_width","" -"2813","3413","array_filter","" -"2814","3413","array_filter_exclude","" -"2815","3413","dropdown_prepostfix","" -"2816","3413","dropdown_separators","" -"2817","3413","hidden","0" -"2818","3413","page_break","0" -"2819","3413","public_statistics","0" -"2820","3413","random_order","0" -"2821","3413","use_dropdown","0" -"2822","3413","scale_export","0" - -# -# ASSESSMENTS TABLE -# - -# -# SURVEYS_LANGUAGESETTINGS TABLE -# -"surveyls_survey_id","surveyls_language","surveyls_title","surveyls_description","surveyls_welcometext","surveyls_endtext","surveyls_url","surveyls_urldescription","surveyls_email_invite_subj","surveyls_email_invite","surveyls_email_remind_subj","surveyls_email_remind","surveyls_email_register_subj","surveyls_email_register","surveyls_email_confirm_subj","surveyls_email_confirm","surveyls_dateformat" -"29846","en","Sample Survey for v1.80 (all questions plus most options)","This is a sample survey showing all the question types you can use in LimeSurvey version 1.80 (or later).
    \nIt also shows some of the options available for each question.
    ","This is the welcome text for the survey!
    \nYou can can edit it in the survey properties.","This is the end text for the survey!
    \nYou can can edit it in the survey properties.
    ","","","Invitation to participate in survey","Dear {FIRSTNAME},\n\nYou have been invited to participate in a survey.\n\nThe survey is titled:\n""{SURVEYNAME}""\n\n""{SURVEYDESCRIPTION}""\n\nTo participate, please click on the link below.\n\nSincerely,\n\n{ADMINNAME} ({ADMINEMAIL})\n\n----------------------------------------------\nClick here to do the survey:\n{SURVEYURL}","Reminder to participate in survey","Dear {FIRSTNAME},\n\nRecently we invited you to participate in a survey.\n\nWe note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.\n\nThe survey is titled:\n""{SURVEYNAME}""\n\n""{SURVEYDESCRIPTION}""\n\nTo participate, please click on the link below.\n\nSincerely,\n\n{ADMINNAME} ({ADMINEMAIL})\n\n----------------------------------------------\nClick here to do the survey:\n{SURVEYURL}","Survey registration confirmation","Dear {FIRSTNAME},\n\nYou, or someone using your email address, have registered to participate in an online survey titled {SURVEYNAME}.\n\nTo complete this survey, click on the following URL:\n\n{SURVEYURL}\n\nIf you have any questions about this survey, or if you did not register to participate and believe this email is in error, please contact {ADMINNAME} at {ADMINEMAIL}.","Confirmation of completed survey","Dear {FIRSTNAME},\n\nThis email is to confirm that you have completed the survey titled {SURVEYNAME} and your response has been saved. Thank you for participating.\n\nIf you have any further questions about this email, please contact {ADMINNAME} at {ADMINEMAIL}.\n\nSincerely,\n\n{ADMINNAME}","1" - -# -# QUOTA TABLE -# - -# -# QUOTA_MEMBERS TABLE -# - -# -# QUOTA_LANGUAGESETTINGS TABLE -# - diff --git a/include/limesurvey/docs/license.txt b/include/limesurvey/docs/license.txt deleted file mode 100644 index 8c4ea928..00000000 --- a/include/limesurvey/docs/license.txt +++ /dev/null @@ -1,3 +0,0 @@ -See COPYRIGHT.PHP and LICENSE.php in the main directory for more information. - - \ No newline at end of file diff --git a/include/limesurvey/docs/manual.html b/include/limesurvey/docs/manual.html deleted file mode 100644 index 1d8d97d9..00000000 --- a/include/limesurvey/docs/manual.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - -LimeSurvey Instruction Manual - -. - - - - - - - -

    If the page does -not refresh, click here to open the online manual on -http://www.limesurvey.org

    - - - diff --git a/include/limesurvey/docs/release_notes.txt b/include/limesurvey/docs/release_notes.txt deleted file mode 100644 index 979292be..00000000 --- a/include/limesurvey/docs/release_notes.txt +++ /dev/null @@ -1,3097 +0,0 @@ -Welcome to LimeSurvey v1.92+! - -Warranty: This program is provided "as is" without warranties of any kind, either expressed or implied, -including, but not limited to, the implied warranties of merchantability and fitness for a particular -purpose. The entire risk as to the quality and performance of the program is with you. -Should the program prove defective, you assume the cost of all necessary servicing, repair or correction. -In no event will any copyright holder be liable to you for damages, including any general, special, -incidental or consequential damages arising out of the use or inability to use the program -(including but not limited to loss of data or data being rendered inaccurate or losses sustained -by you or third parties or a failure of the program to operate with any other programs). - - -This release does have the following requirements: - --One of these databases: MySQL 4.1 or higher, Microsoft SQL Server 2000 or higher, Postgres 8.1 or higher --PHP 5.x or higher with mbstring library installed. (for localizations) -Check out detailed requirements at http://docs.limesurvey.org/tiki-index.php?page=Installation - - -HOW TO INSTALL ---------------- -If you are doing a complete new installation please refer to the manual at -http://docs.limesurvey.org - -Please also have a look at the "Installation security hints" section of the online manual in order to secure your installation. - - -=== UPGRADING===== - -We suggest to check out and hold close to the instructions, which can be found in our online manual: -http://docs.limesurvey.org/tiki-index.php?page=Upgrading+from+a+previous+version - - -HOW TO UPGRADE from earlier versions of LimeSurvey (<=1.08) -------------------------------------------------------------- -We are sorry but you can't upgrade from versions <= 1.0.8. Seriously! -The database structure has changed that much it wouldn't be feasible. -However, you can import old survey structures from version 1.0 (when you create a new survey there is an option to do that). -Just do a new installation as described on http://docs.limesurvey.org. - - -HOW TO UPGRADE from LimeSurvey 1.45 or later (<=1.70) ------------------------------------------------------- -1. Make backups of your files and database. -2. Backup your config.php. -3. Delete all old files -4. Upload the new version to the same place. -5. Adjust the settings in config.php to the setting from the backup config.php. - --Do NOT just copy over the old config.php over the new one.-- -6. Run the installer in /admin/install/index.php to update the database. -7. Done. - -Special note for UPGRADING from 1.53 to 1.72(+) ------------------------------------------------- -After you upgraded please check the global user rights of each user. There was a -new superadmin right introduced. The upgrade script is guessing who to make -superadmin - so this is not perfect and has to be supervised by YOU. - -HOW TO UPGRADE from a LimeSurvey 1.70(+) version to the latest 1.9x --------------------------------------------------------------------- -1. Make backups of your files (especially config.php and config-ldap.php) - and database. -2. Export all your customized templates. -3. Backup your limesurvey/upload resources directory. -4. Delete all old files. -5. Upload the new version to the same place. -6. Copy your backuped config.php file overwriting the one from the new release -7. Have a look to the config-defaults.php file for any new parameters that - could suit your setup. If you need to change the default setting, copy the - parameter lines to your config.php file and adjust their values accordingly. -8. Copy your previously backuped 'upload' directory to the new - limesurvey/upload directory. -9. Run the installer in /admin/install/index.php to update the database. -10. Copy back all your customized templates to /upload/templates. You might have to adjust your templates since the CSS has been changed since version 1.72x. - It is easier to try adapting one of the default templates to your template again instead of fixing your old template! -11. Done. - -Thank you to everyone who helped with this new release! - - - -Changes from 1.92+ (build 120909) to 1.92+ (build 120919) September 19, 2012 --Fixed issue #6528: Save changes on label set results in a php warning when text contains a tab character (Carsten Schmitz) --Fixed issue #6536: HTML editor converts special characters to html entities within equations (Carsten Schmitz) --Fixed issue #6547: Arbitrary URL redirect - parameter "redirect" (Carsten Schmitz) --Fixed issue #6553: $column_style global parameter aren't used (Denis Chenu) - -Changes from 1.92+ (build 120822) to 1.92+ (build 120909) September 9, 2012 --Fixed issue #6530: Since latest update unable to upload documents in survey (Denis Chenu) --Fixed issue #6543: SQL injection in activate_functions.php - parameter "sid" (jcleeland) --Fixed issue #6544: SQL injection in activate_functions.php - parameter "fixnumbering" (jcleeland) --Fixed issue #6545: SQL injection in preview.php - parameter "lang". Sanitized language string. (jcleeland) --Fixed issue #6546: SQL injection in userrighthandling.php - parameter "ugid" (jcleeland) - - -Changes from 1.92+ (build 120815) to 1.92+ (build 120822) August 22, 2012 --Fixed issue #6423: Potential XSS in 'Resume survey' load form (Carsten Schmitz) -#Updated translation: Chinese (Simplified) by jun9 -#Updated translation: French (France) by BenoitBouvarel -#Updated translation: Italian by lfanfoni -#Updated translation: Korean by gregshin -#Updated translation: Spanish (Chile) by jergas -#Updated translation: Thai - - -Changes from 1.92+ (build 120808) to 1.92+ (build 120815) August 15, 2012 --Fixed issue #6319: Preview group can throw error (Denis Chenu) --Fixed issue #6442 : Adding labels fails without numbers in last Code field in Label Set editor (Denis Chenu) --Fixed issue #6452: File Upload not working with embedded_layout use (Carsten Schmitz) --Fixed issue #6465: Assessment typo (Carsten Schmitz) --Fixed issue #6467 : checkbox for 'other' missing for multiple choice (Denis Chenu) --Fixed issue #6470 : Bad emplacement of Other text input box for large screen in Multiple option (Denis Chenu) --Fixed issue #6476: Error in data entry when using multiple choice with comment questions and MSSQL (Carsten Schmitz) --Fixed issue: Multiple option with checkbox : Other can be checked at submit with empty value (Denis Chenu) --Fixed issue: Remove escape character (\) from any field evaluated by EM. (Thomas White) -#Updated translation: French (France) by BenoitBouvarel, DenisChenu -#Updated translation: German by debianese -#Updated translation: Greek by kiolalis -#Updated translation: Italian by lfanfoni -#Updated translation: Japanese by nomoto -#Updated translation: Malay by ayahanda -#Updated translation: Polish by elisa - - -Changes from 1.92+ (build 120801) to 1.92+ (build 120808) August 8, 2012 --Fixed issue #6424: Lastpage field not being added in MSSQL when upgrading from 1.85 or older (Carsten Schmitz) --Fixed issue #6439: Question type Array (numbers) does not work with numbers >10 as labels (Thomas White) -#Updated translation: Czech by slansky -#Updated translation: German by c_schmitz -#Updated translation: German (Informal) by c_schmitz -#Updated translation: Malay by ayahanda -#Updated translation: Polish by elisa -#Updated translation: Turkish by kayazeren - -Changes from 1.92+ (build 120725) to 1.92+ (build 120801) August 1, 2012 --Fixed issue #6066: File upload fails if single oder double quotes are used (Carsten Schmitz) --Fixed issue #6287: Unable to export QueXML with Postgresql 9.1 (Adam Zammit) --Fixed issue #6297: QueXML Export broken Dev Removed condition checking for queXML export (Adam Zammit) --Fixed issue #6334: Don't have a valid session in file upload question (Carsten Schmitz) --Fixed issue #6387: Broken Add vs Replace Buttons on Quick Add for Labels (tpartner) --Fixed issue #6395: QuickAdd permits longer codes than 5 characters (Carsten Schmitz) -#Updated translation: Albanian by emiljan, c_schmitz -#Updated translation: Czech by slansky -#Updated translation: German by c_schmitz -#Updated translation: German (Informal) by c_schmitz -#Updated translation: Italian by lfanfoni -#Updated translation: Italian (Formal) by gifino -#Updated translation: Norwegian (Bokmal) by reidarborgersen, dittaeva -#Updated translation: Polish by elisa -#Updated translation: Turkish by kayazeren - - -Changes from 1.92+ (build 120718) to 1.92+ (build 120725) July 25, 2012 --Fixed issue #6312: Editing Survey Security Permissions as non-super-admin and non-survey owner throws PHP Fatal Error (Stephanie King) --Fixed Issue #6312 - Editing Survey Security Permissions as non-super-admin and non-survey owner throws PHP Fatal Error (Stephanie King) --Fixed issue #6335 : Group preview add answer (Denis Chenu) --Fixed issue #6336 : Bad template URL if templatedir is not exist (Denis Chenu) --Fixed issue #6337 : $defaulttemplate aren't allways used (Denis Chenu) --Fixed issue #6340: Error "String offset cast occured" when adding user and using PHP 5.4 or later (Carsten Schmitz) --Fixed issue #6346: Statistic page filter not remembering statistics language (Carsten Schmitz) --Fixed issue #6348: Bar chart not translated in statistics when changing statistics language (Carsten Schmitz) --Fixed issue #6349: condition does not work while using slider with stars (Thomas White) --Fixed issue: Bad CSS for empty other comment in mandatory question for citronade (Denis Chenu) --New feature: Ability to reset Expression Manager for admin with showlogicfile (Denis Chenu) - - -Changes from 1.92+ (build 120711) to 1.92+ (build 120718) July 18, 2012 --Fixed issue #6328: pre-filling of hidden questions does not work (Thomas White) --Fixed issue #6304: Reloading unfinished survey can submit it without user interaction / reloading survey don't goe to actual step (Denis Chenu) --Fixed issue #6318: Attributes/validation cut off when checking with EM (Carsten Schmitz) --Fixed issue #6329: Language titles in language switcher are displayed in the currently used language instead of the native name (Carsten Schmitz) --Fixed issue #6330: Regex engine does not accept a leading zero even if explicitly specified as acceptable (Thomas White) --Fixed issue: Other comment mandatory requires 2 or more characters in comment field instead of 1 or more characters (Thomas White) --Fixed issue: Whole Question Validation (em_validation_q) missing from several question types (Thomas White) -#Updated translation: Chinese (Simplified) by yooyooh -#Updated translation: Czech by slansky -#Updated translation: French (France) by DenisChenu -#Updated translation: German by Mazi -#Updated translation: German (Informal) by c_schmitz -#Updated translation: Italian by lfanfoni -#Updated translation: Polish by elisa -#Updated translation: Spanish (Spain) by danielgeisler - - -Changes from 1.92+ (build 120704) to 1.92+ (build 120711) July 11, 2012 --Fixed issue #6207: Error "Ambiguous column name 'qid'" when using MSSQL server and editing answer options (Carsten Schmitz) --Fixed issue #6252: English warning message though German language set (Carsten Schmitz) --Fixed issue #6282: Error accessing a survey from a language that it hasn't (Carsten Schmitz) --Fixed issue #6284: In some cases statistics' layout is broken (Carsten Schmitz) --Fixed issue #6290: Array (texts) responses with single quotes are truncated on data entry screen (Carsten Schmitz) --Fixed issue #6300: Token can be duplicated under some condition (Denis Chenu) --Fixed issue #6305: Assessment values are not shown in logic file; nor in question, and group previews (Thomas White) --Fixed issue #6309 : Bad javascript for Multiple choice with "Other option" (Denis Chenu) --Fixed issue: Several remote file inclusion vulnerabilities (only when register_globals is activated) (Carsten Schmitz) --Fixed issue: When magic quotes enabled on the server then quoting was not correct on the response data (Carsten Schmitz) -#Updated translation: Czech by slansky -#Updated translation: French (France) by DenisChenu -#Updated translation: German by c_schmitz -#Updated translation: Italian by lfanfoni -#Updated translation: Polish by elisa -#Updated translation: Russian by gdemin -#Updated translation: Spanish (Spain) by gap1981 -#Updated translation: Turkish by kayazeren - - -Changes from 1.92+ (build 120623) to 1.92+ (build 120704) July 4, 2012 -#Updated translation: Czech by slansky -#Updated translation: Italian by lfanfoni -#Updated translation: Spanish (Chile) by SirCrovax --Fixed issue #5849: Unable to paste into numeric question types (Thomas White) --Fixed issue #6188: Display error in conditions editor when selecting several options per sub-question (Carsten Schmitz) --Fixed issue #6210 Inconsistent database after deleting a file by "clear & exit" button (Denis Chenu) --Fixed issue #6250 : Public statistics always use default template (Denis Chenu) --Fixed issue #6256: Touch event support (tpartner) --Fixed issue #6271: text entry fields use onchange instead of onkeyup events to propagate changes (Thomas White) --Fixed issue #6281: hidden variables used in equations have wrong name so don't POST properly (Thomas White) --Fixed issue #6296: Question type file upload dose not work (tpartner) --Fixed issue #6298: File upload button too narrow in Safari + Chrome (tpartner) --Fixed issue: Array filter of ranking does not work reliably across browsers (Thomas White) --Fixed issue: Changes to comments in multiple choice checkbox could not trigger changes in tailoring (Thomas White) --Fixed issue: Clearing "other" value in multiple choice checkbox did not clear associated comment (Thomas White) --Fixed issue: EM unit tests broken due to missing LEMradix variable. (Thomas White) --Fixed issue: Revert to using onchange instead of onkeyup for Array Numbers when using dropdown lists of numbers (Thomas White) --Fixed issue: Show Survey Logic File does not show survey title, description, welcome, endmsg, endurl, nor any errors within them (Thomas White) --Fixed issue: Unchecking entries in multiple choice checkbox did not clear associated comment (Thomas White) --Fixed issue: Wrong flag image for ZH-Hant-TW (Carsten Schmitz) --Fixed issue: Removed dot in front of languageswitch drop down. (Marcel Minke) - - - -Changes from 1.92+ (build 120620) to 1.92+ (build 120623) June 22, 2012 --Fixed issue #6240: conversion of conditions to relevance can fail for multiple choice tests during some upgrades (Thomas White) -#Updated translation: Chinese (Simplified) by yooyooh -#Updated translation: French (France) by DenisChenu -#Updated translation: Italian by gifino, lfanfoni -#Updated translation: Polish by elisa - - -Changes from 1.92+ (build 120613) to 1.92+ (build 120620) June 20, 2012 --Fixed issue #5766: exclude_all_others_auto does not work (Thomas White) --Fixed issue #6205: Add http:// by default to endurl for indication (Denis Chenu) --Fixed issue #6207: [Microsoft][ODBC SQL Server Driver][SQL Server]Ambiguous column name 'qid' (Carsten Schmitz) --Fixed issue #6207: [Microsoft][ODBC SQL Server Driver][SQL Server]Ambiguous column name 'qid' (Thomas White) --Fixed issue #6208 : Adding user to user group leads to error message (Denis Chenu) --Fixed issue #6211: Problems with two "file upload" question types in the same question group (Thomas White) --Fixed issue #6213: File upload questions tips have an error in italian (Thomas White) --Fixed issue #6214: relevance equations that only contain static replacement values cause JS crash (Thomas White) --Fixed issue #6221: Array filtering does not work when trigger question has multiple inputs per row (Thomas White) --Fixed issue #6222: Conditions not working when it relies on value from a hidden question (Thomas White) --Fixed issue #6223: Admin login does not work with postgres right after install (Carsten Schmitz) --Fixed issue #6224: resetadminpw.php: SQL-string for postgres incorrect (Carsten Schmitz) --Fixed issue #6225: unable to pass qcode-named variables via URL (Thomas White) --Fixed issue #6226 & #6229: Only end message with Cannot edit answer (token and edit answers after submitting activated) (Denis Chenu) --Fixed issue #6231: EM doesn't convert condition correctly, OR becomes AND (Thomas White) --Fixed issue #6235: Javascript errors when use equations for min/max num values in Ranking questions (Thomas White) --Fixed issue #6238: array filtering does not work for Ranking questions (Thomas White) --Fixed issue #6239: Ranking style questions can't be used to filter other questions (Thomas White) --Fixed issue: Array-filter algorithms for Ranking questions do not appear in Show Logic File (Thomas White) --Fixed issue: PHP errors thrown if use invalid array filter question (Thomas White) --Fixed issue: QID links in Show Survey Logic File should open new edit-question window, not just view question (Thomas White) --Fixed issue: ShowLogicFile did not show array filters for List(Radio) questions when "other" advanced question option selected (Thomas White) -#Updated translation: Chinese (Simplified) by yooyooh -#Updated translation: Italian by lfanfoni, gifino -#Updated translation: Polish by elisa -#Updated translation: Swedish -#Updated translation: Turkish by kayazeren - - -Changes from 1.92+ (build 120608) to 1.92+ (build 120613) June 13, 2012 --Fixed issue #6100: English in other language (Thomas White) --Fixed issue #6130: Response emails sent as "text/plain" but with HTML embedded (Carsten Schmitz) --Fixed issue #6147: "Please rank at least x items" not being translated (Carsten Schmitz) --Fixed issue #6151: CSS errors on public statistics page (Carsten Schmitz) --Fixed issue #6153: "Cannot find data type DATE" when activating a survey with MSSQL 2005 (Carsten Schmitz) --Fixed issue #6168: Question preview ignores "no answer" setting (Thomas White) --Fixed issue #6177: uppercase logical operators (e.g. 'OR') in EM yield JavaScript errors (Thomas White) --Fixed issue #6178: es-CL is listed as Spanish (Mexico) instead of Spanish (Chile) (Carsten Schmitz) --Fixed issue #6186: Array Question Type: EM doesn't convert condition correctly, AND becomes OR (Thomas White) --Fixed issue #6187: Javascript Error on em_javascript.js : attr is undefined (Thomas White) --Fixed issue #6196: Misplaced PopUpEditor icon (tpartner) --Fixed issue #6200: if enter text into other box, then click the other checkbox, the entered text disappears (Thomas White) --Fixed issue #6201: Fatal error: Cannot redeclare replacenewline() (Thomas White) --Fixed issue: "Please check at least one item" not appropriate for single select list questions (Thomas White) -#Updated translation: Arabic by maan -#Updated translation: Croatian by rovinj -#Updated translation: Czech by slansky -#Updated translation: German by c_schmitz -#Updated translation: German (Informal) by c_schmitz -#Updated translation: Italian by lfanfoni -#Updated translation: Korean by heasunchun -#Updated translation: Norwegian (Bokmål) by c_schmitz -#Updated translation: Polish by elisa -#Updated translation: Portuguese (Brazil) by mauriciofurtado -#Updated translation: Spanish (Mexican) by scoutino - -Changes from 1.92+ (build 120607) to 1.92+ (build 120608) June 7, 2012 -Fixed issue HTML error in hidden field for equation question type - -Changes from 1.92+ (build 120530) to 1.92+ (build 120607) June 7, 2012 --Fixed issue #6122: EM seems to be holding a cache in admin dev: now only setting language in EM (mennodekker) --Fixed issue #6155: Error on MSSQL: Ambiguous column name qid (Menno Dekker) --Fixed issue #5943: exclusive option in multiple choice hide all other answer options (Thomas White) --Fixed issue #6057: Hitting RETURN while typing in M.C. 'Other' of non-tracked survey looses all survey input (tpartner) --Fixed issue #6140: Survey doesn't start from where it was left on Token Persistence (Thomas White) --Fixed issue #6149: EM shows wrong result for number generated by rand() function (Thomas White) --Fixed issue #6154: File upload questions not mandatory anymore (Thomas White) --Fixed issue #6158: In question-by-question mode, EM replacements in same group but on different page use (Thomas White) --Fixed issue #6163: error in mandatory array_filter-ed multi-numeric and multiple-short questions --Fixed issue #6165: unable to implement affirmative exclusive non-answer in array_filter_exclude --Fixed issue #06079: sub-question filtering broken if "other" or "no answer" option is given (Thomas White) --Fixed issue #6171: variable < X is true even if variable isn't answered (Thomas White) --Fixed issue #6172: Update to Version 1.92+ from 1.91+ Cannot Complete - Reason: Duplicate column name 'grelevance' (Thomas White) --Fixed issue #6173: users can skip min_sum_value and equals_sum_value questions (Thomas White) --Fixed issue #6176: replacements of other value for multiple-choice don't appear when click previous (Thomas White) --Fixed issue: Assesments for multi choice question (Denis Chenu) --Fixed issue: Error in PostgreSQL DB create script. (Jonathan Harker) --Fixed issue: Error in upgrade from old DB versions (Carsten Schmitz) --Fixed issue: Errors in Postgres DB creation script (Carsten Schmitz) --Fixed issue: Google Analytics Style #2 breaks if group names contain special characters (Thomas White) --Fixed issue: mktime() function needs to be passed integer values (Thomas White) --Fixed issue: 'other' status flag missing from Show Logic File (Thomas White) --Fixed issue: Errors in Postgres upgrade and DB creation (Carsten Schmitz) -#Updated translation: Amharic by mezwor -#Updated translation: Czech by slansky -#Updated translation: Dutch -#Updated translation: Dutch (Informal) -#Updated translation: Estonian by LimAlf -#Updated translation: Italian by lfanfoni -#Updated translation: Polish by elisa -#Updated translation: Portuguese (Portugal) by algarvio -#Updated translation: Slovenian -#Updated translation: Spanish (Chile) by SirCrovax -#Updated translation: Turkish by kayazeren - - -Changes from 1.92+ (build 120529) to 1.92+ (build 120530) May 28, 2012 --Fixed issue #6133: Race condition with concurrent upload of similar "survey structure" (Carsten Schmitz) - -Changes from 1.92+ (build 120526) to 1.92+ (build 120529) May 28, 2012 --Fixed issue #6106: Mandatory error shown when testing a question (Carsten Schmitz) --Fixed issue #6133: Race condition with concurrent upload of similar "survey structure" (Carsten Schmitz) --Fixed issue #6136: Relevance evaluation with Postgres fails when using regular expressions (Carsten Schmitz) --Fixed issue: Admin language switching to survey language (Carsten Schmitz) - -Changes from 1.92+ (build 120517) to 1.92+ (build 120526) May 26, 2012 -#Updated translation: Dutch by Nickko -#Updated translation: Dutch (Informal) by Nickko (root) -#Updated translation: French by Denis Chenu, Nickko -#Updated translation: German (Informal) by c_schmitz (root) -#Updated translation: German by c_schmitz -#Updated translation: Polish (elisa-ls) -#Updated translation: Dutch -#Updated translation: Portuguese -#Updated translation: Slovenian --Fixed issue #6122: EM seems to be holding a cache in admin dev: only set language when a surveyid is set (mennodekker) --Fixed issue #5766: exclude_all_others_auto does not work (Thomas White) --Fixed issue #6114: Mail encryption really off for bounce managment (Denis Chenu) --Fixed issue #6119: Apostrophe bug in statistics PDF and Excel output (Carsten Schmitz) --Fixed issue #6124: User with limited rights is allowed to export complete MySQL DB --Fixed issue: User with configurator access doesn't have acces to global settings (Denis Chenu) --Fixed issue: Survey list does not show surveys having deleted owners (Carsten Schmitz) - - -Changes from 1.92+ (build 120516) to 1.92+ (build 120517) May 17, 2012 --Fixed issue: Missing translations / texts - -Changes from 1.92+ (build 120509) to 1.92+ (build 120516) May 16, 2012 -+New translation: Spanish (Chile) kindly provided by Victor Pinto (Carsten Schmitz) -#Updated translation: Polish (elisa-ls) -#Updated translation: Amharic kindly provided by Mezene Worku -#Updated translation: Czech (lukas-slansky) -#Updated translation: German by c_schmitz -#Updated translation: Persian - kindly provided by Morteza Farahbod -#Updated translation: Turkish - 100% - kindly provided by Kaya Zeren --Fixed issue #5766: exclude_all_others_auto does not work (Thomas White) --Fixed issue #5943: Exclusive option in multiple choice hides all other answer options (Thomas White) --Fixed issue #6003: Text truncated after single quote when browsing responses to Multiple short text question. (Thomas White) --Fixed issue #6046: Resume later deletes answers from db when all questions are on one page (Thomas White) --Fixed issue #6078: Invalid LimeExpressionManager->ngT() calls (TMSWhite) --Fixed issue #6086: 1.92+ Build 120509 Conditions do not work with probably good logic (Thomas White) --Fixed issue #6087: cascading array filter fails for depth>=3 in group and question modes (Thomas White) --Fixed issue #6093: Wrong result when comparing decimal values from equation question types in surveys using comma as decimal point (Thomas White) --Fixed issue #6102: "Print your answers" shows EM syntax errors (Thomas White) --Fixed issue #6048: Conditions editor produces fatal error: maximum allocated memory (Carsten Schmitz) --Fixed issue #6080: Wrong validation for multiple numeric questions --Fixed issue #6085: By pasting a subquestion code can contain a space (Carsten Schmitz) --Fixed issue: Misaligned input with multi column on citronade (Denis Chenu) --Fixed issue: Array-filter equations not visible for List-type questions in Show Survey Logic file (Thomas White) --Fixed issue: Datestamp on not date stamped survey. Dev: use 1980-01-01 for 'All database same value' (Denis Chenu) --Fixed issue: Endless javascript loop in answer edit or subquestion edit (Denis Chenu) --Fixed issue: Missing translations for jQuery popup calendar (Carsten Schmitz) --Fixed issue: Nice exit if surveyid is invalid (Denis Chenu) --Fixed issue: Unable to add label in label set administration (Carsten Schmitz) - - -Changes from 1.92+ (build 120501) to 1.92+ (build 120509) May 9, 2012 -+New translation: Afrikaans -+New translation: Amharic - kindly provided by Mezene Worku -#Updated translation: Polish (elisa-ls) -#Updated translation: German (Carsten Schmitz) -#Updated translation: German (informal) (Carsten Schmitz) -#Updated translation: Persian by M. Farahbod (Carsten Schmitz) -#Updated translation: Portuguese (Brazil) by Flávio Rodrigues (Carsten Schmitz) --Fixed issue #5975: Confirmation screen broken for iterate survey feature (tpartner) --Fixed issue #5987: prefix and suffix are misaligned for "total" field at miltiple numeric question (tpartner) --Fixed issue #6030: answeroption not left-aligned (tpartner) --Fixed issue #6030: answeroption not left-aligned Dev Fixed up CSS for list-radio questions (tpartner) --Fixed issue #6044: Use advanced question settings such as numbers_only, display_rows, max_characters, prefix, suffix, ... at data entry screen. (Marcel Minke) --Fixed issue #6062: Language selector is missing on survey without description nor welcome message (tpartner) --Fixed issue #6075: Content of previous answer is not replaced, instead placeholder of selected answer is shown: eg. {TOKEN:ATTRIBUTE_2} (Thomas White) --Fixed issue #6030: answeroption not left-aligned with multiple-opt-comments Dev : move input outside label (Denis Chenu) --Fixed issue #6030: Misalign input in multi-line answers / citronade part Dev : fixed some issue with little screen too (Denis Chenu) --Fixed issue #6048: Conditions editor produces fatal error: maximum allocated memory (Carsten Schmitz) --Fixed issue #6059: EM puts spaces between variables (Carsten Schmitz) --Fixed issue #6061: Duplicate codes when adding new answer options/subquestions/labels (Carsten Schmitz) --Fixed issue #6065: Error when creating a new survey by copying an existing one (Carsten Schmitz) --Fixed issue #6071: Notices if using mssql and changing/importing survey (Carsten Schmitz) --Fixed issue: Added quota_languagesettings table to the fixlanguageconsistency() array - when languages are added, matching quota entries are created for each language (jcleeland) --Fixed issue: Behaviour change on 'resume later' (Carsten Schmitz) --Fixed issue: db_quoteall added to fixlanguageconsistency() function when copying quota translations. (jcleeland) --Fixed issue: Submit date set even though participant was screened out by a quota (Carsten Schmitz) --Fixed issue: Several HTML fixes for data entry screen (data entry & data edit) (Marcel Minke) - - -Changes from 1.92+ (build 120425) to 1.92+ (build 120501) May 1, 2012 --Fixed issue #6008: File upload doesn't work from date entry, not available in response edit (mennodekker) --Fixed issue #6045: Firefox 12 vertical scrolling problem in admin view (and other pages) (Carsten Schmitz) --Fixed issue #6056 - Quota languages don't update (jcleeland) --Fixed issue: Images inserted into HTML emails were not properly linked to the server (Carsten Schmitz) --Fixed issue: Fixed several HTML issues for data entry mode --Fixed issue: Partial fix (just data entry - editing data missing) for bug #6044: Use advanced question settings such as numbers_only, display_rows, max_characters, prefix, suffix, ... at data entry screen. (Marcel Minke) - - -Changes from 1.92+ (build 120418) to 1.92+ (build 120425) April 25, 2012 --Fixed issue #5988: Problem displaying words with French accent within Expression Manager (Carsten Schmitz) --Fixed issue #6027: Users who have token creation permission can't create token table (Carsten Schmitz) --Fixed issue #6035: Insertans not working in multiple options with comments (Carsten Schmitz) --Fixed issue #6036: Reminder sent to people which opted out (Carsten Schmitz) --Fixed issue #6037: Zero uses left by default when importing tokens from CSV (Carsten Schmitz) --Fixed issue #6042: Check for existing token taables after activation -> switch to closed access (Carsten Schmitz) --Fixed issue #6043: Errors creating surveys in MSSQL (Carsten Schmitz) -#Updated translation: Czech (lukas-slansky) -#Updated translation: Danish - kindly provided by Søren O'Neill (Carsten Schmitz) -#Updated translation: Finnish kindly provided by Flo Apps Oy (Carsten Schmitz) -#Updated translation: German (Carsten Schmitz) -#Updated translation: Italian - kindly provided by Alberto Danese (Carsten Schmitz) -#Updated translation: Spanish (Mexico) (Carsten Schmitz) - - -Changes from 1.92+ (build 120412) to 1.92+ (build 120418) April 18, 2012 --Fixed issue #5896: Miscellaneous, rarely used, qcode.* attributes showing blank values (Thomas White) --Fixed issue #6006: Error in LImeExpressionManage.php anytime using an array (numbers) with checkboxes and Mandatory (Thomas White) --Fixed issue #6007: Token variables resolving as 'undefined variable' after Version 1.91+ Build 11026 (Thomas White) --Fixed issue #6013: passthru stopped working (Thomas White) --Fixed issue #6015: INSERTANS does not work in end message (Thomas White) --Fixed issue #6024: $deletenonvalues option no longer working in 1.92+ (Thomas White) --Fixed issue #5986: Import label set does not properly show an error for invalid files (Carsten Schmitz) --Fixed issue #6016: Load Unfinished Survey button does not display for existing survey (Carsten Schmitz) --Fixed issue #6018: Using mssqlnative the "date" question type uses DATETIME type and not DATE (Carsten Schmitz) --Fixed issue: Notice when using mssqlnative driver (Carsten Schmitz) --Fixed issue: Only set EM variables for {TOKEN:xxxx} when token table exists; and only for declared attributes (Thomas White) --Fixed issue: Participant IP address not correctly captured if server is behind proxy (Carsten Schmitz) --Fixed issue: Warning if upload file and there is no minimum number of files specified (Thomas White) -#Updated translation: Czech kindly provided by Slansky Lukas -#Updated translation: French kindly provided by Guillaume Jaouen -#Updated translation: German -#Updated translation: German (informal) (Carsten Schmitz) - - -Changes from 1.92+ (build 120405) to 1.92+ (build 120412) April 12, 2012 --Fixed issue #5962: View Response Details does not work correctly if responses are filtered (Statistics) (Thomas White) --Fixed issue #5985: Notifications using INSERTANS and/or QCODE don't work with all-in-one presentation of survey (Thomas White) --Fixed issue #5992: After upgrade to Version 1.92+ Build 120405 the uploaded file information gets corrupted. (Thomas White) --Fixed issue #6002: @@SURVEYURL@@ placeholder fails to translate (Thomas White) --Fixed issue #5976: Iterate survey sets all "uses_left" to "1" even if there has been set a larger number previously (Carsten Schmitz) --Fixed issue #5997 : upload windows are on default survey langage (Denis Chenu) --Fixed issue: Bad HTML in editgroup(Denis Chenu) --Fixed issue: Mssqlnative driver gives back weird date format in export (Carsten Schmitz) --Fixed issue: With certain Apache configurations then em_javascript.js file was not readable (Carsten Schmitz) -#Updated translation: Danish - kindly provided by Søren O'Neill (Carsten Schmitz) -#Updated translation: Galician - kindly provided by Carlos Neira Cortizas (Carsten Schmitz) -#Updated translation: German Updated translation: German (informal) (Carsten Schmitz) -#Updated translation: Greek by Yannis Kaskamanidis (Carsten Schmitz) -#Updated translation: Spanish (Mexico) (Carsten Schmitz) - - -Changes from 1.92+ (build 120330) to 1.92+ (build 120405) April 5, 2012 --Fixed issue #5877: Resume later doesn't work with a survey allowing public registration (Carsten Schmitz) --Fixed issue #5971: Strange behavior of expression manager - static equation results not visible (Thomas White) --Fixed issue #5979: values prefilled via URL are not passed through to end URL Dev also syntax highlighted end URL so can see if it contains typos (Thomas White) --Fixed issue #5981: EM attributes that should be static generate elements (Thomas White) --Fixed issue #5982: Wrong replacement field properties (Thomas White) --Fixed issue #5984: Javascript error with upload question type for italian language Dev: add js option on clang (Denis Chenu) --Fixed issue #5960: Start language always saved as English (Carsten Schmitz) --Fixed issue #5969: Trying to import a question group without a matching language gives no proper error (Carsten Schmitz) --Fixed issue: When there are multiple languages, getSubQuestions() returns wrong values (often a mix of language-specific values) (Thomas White) - - -Changes from 1.92+ (build 120325) to 1.92+ (build 120330) Mar 30, 2012 --Fixed issue #5948: Mandatory directive for question is ignored for array (numbers) using checkbox layout (Thomas White) --Fixed issue #5952: Error in statistics (Carsten Schmitz) --Fixed issue #5957: Cannot check integrity database (Carsten Schmitz) --Fixed issue #5962: View Response details does not work correctly if responses are filtered (Carsten Schmitz) --Fixed issue: Certain French characters garbled in statistics display and other areas (Carsten Schmitz) --Fixed issue: Error if s_lang are not in survey langage (Denis Chenu) --Fixed issue: When trying to export to application then not all fields are shown (Carsten Schmitz) - -Changes from 1.92+ (build 120324) to 1.92+ (build 120325) Mar 23, 2012 --Fixed issue #5877: Resume later doesn't work with a survey allowing public registration (magiclko) --Fixed issue: MSSQL error on importing survey (Carsten Schmitz) - -Changes from 1.92+ (build 120323) to 1.92+ (build 120324) Mar 23, 2012 --Fixed issue #5877: Resume later doesn't work with a survey allowing public registration (magiclko) --Fixed issue #5934: Generating new Lablesets won't work (magiclko) --Fixed issue #5946: SQL error while creating new survey (Carsten Schmitz) - -Changes from 1.92+ (build 120319) to 1.92+ (build 120323) Mar 23, 2012 --Fixed issue #5731: Randomization group name seems to block "Test this survey" (Thomas White) --Fixed issue #5909: Re-uploading files after deletions and other problems with File Upload question type and Expression Manager (Carsten Schmitz) --Fixed issue #5932: Default answers to hidden questions are not saved to database (Thomas White) --Fixed issue #5933: Uploaded files with uppercase extensions show placeholder instead of image (Carsten Schmitz) --Fixed issue #5936: INSERTANS or TOKEN cannot be used in mail adress notification (Denis Chenu) --Fixed issue #5941: Quotas fail to terminate survey (Carsten Schmitz) --Fixed issue #5942: unable to activate survey after some modification (Denis Chenu) --Fixed issue #5944: Cannot grant "Survey security" permission to another user (Carsten Schmitz) --Fixed issue: Conditions were not properly converted to EM expressions when magicquotes are enabled (Carsten Schmitz) - -Changes from 1.92+ (build 120314) to 1.92+ (build 120319) Mar 19, 2012 -#Updated translation: Hungarian by Pongrácz István (Carsten Schmitz) --Fixed issue #5904: Database upgrade fails with errors on Postgres (Carsten Schmitz) --Fixed issue #5913: Bad SQL syntax in file create-mssql.sql (Carsten Schmitz) --Fixed issue #5917: Bold text not showing when using default template (Carsten Schmitz) --Fixed issue #5921: Duplicate header field names for Dual scale question type when exporting to application (Carsten Schmitz) --Fixed issue #5924: Wrong alignment of subquestion text and radiobuttons in Array questions with RTL languages (Carsten Schmitz) --Fixed issue #5926: With multilingual surveys the sheetname on Excel export was not always in the base language (Carsten Schmitz) --Fixed issue #5927: Default template Yes/No questions & Male/Female alignment (Carsten Schmitz) --Fixed issue: Error in update scripts for MSSQL server (Carsten Schmitz) --Fixed issue: PHP warning when importing label set without labels (Carsten Schmitz) - -Changes from 1.92+ (build 120311) to 1.92+ (build 120314) Mar 14, 2012 -+New feature #5492: Changing global settings takes you away from survey design Now it "remembers" the referee url and redirect to that url after saving global settings! (magiclko) --Fixed issue #5898: {GOOGLE_ANALYTICS_JAVASCRIPT} integration errors (Thomas White) --Fixed issue #5835: Standard survey header is not used in public statistics (Carsten Schmitz) --Fixed issue: Notice if Referer is not set (Shnoulle) --Fixed issue: Textareas in survey taking were not properly quoted when displayed again (Carsten Schmitz) --Fixed issue: Invalid email in 'resume later' save form did not show an error message (Carsten Schmitz) --Fixed issue: HTMLeditor popup not properly filtering some input variables (Carsten Schmitz) - - -Changes from 1.92 (build 120302) to 1.92+ (build 120311) Mar 11, 2012 --Fixed issue #5859: Question group import does not update references properly (Thomas White) --Fixed issue #5875: Flexible Labels do not register in french when apostrophes are in label text. (magiclko) --Fixed issue #5879: em_validation_q generates duplicative JavaScript (Thomas White) --Fixed issue #5880: Make em_q_fn_validation and em_sq_fn_validation more easily visible (Thomas White) --Fixed issue #5887: Minimum answers in Ranking question type are deactivated (Thomas White) --Fixed issue #5892: With question type "Short free text" and "display row" set, the text field is shown with some code (Thomas White) --Fixed issue #5894: INSERTANS (and qcode.shown) returning wrong values for some question types --Fixed issue #5895: On-page substitution of comment for List with Comment type not being displayed (Thomas White) --Fixed issue #5897: Survey ID not set correctly after row insert in servey_NNN table (Thomas White) --Fixed issue #5778: Multiple choice answer for rtl in basic,bluenegrey,citronade,clear_logo,eireicon (Shnoulle) --Fixed issue #5778: Template for RTL : limespired, mint_idea,sherpa,vallendar (Shnoulle) --Fixed issue #5870: Progress indicator in quick-translate hiding to early. Some language (like Irish or Chinese) did not translate. (Carsten Schmitz) --Fixed issue #5876: Cryptic error message when trying to run LimeSurvey using an outdated PHP version (Carsten Schmitz) --Fixed issue #5878: Progress-bar not showing because of JS /eval folder being blocked (Carsten Schmitz) --Fixed issue: Uploaded files fail if target directory does not exist. (Thomas White) --Fixed issue: Data not saved and validations don't work when use multiflexible_checkbox option in Array (numbers) question type (Thomas White) --Fixed issue: Differencation for good/empty and good/not-empty (Shnoulle) --Fixed issue: Equation question types were only capturing the contents of the first replacement element (Thomas White) --Fixed issue: Error on upgrade from 1.90 or earlier (Carsten Schmitz) --Fixed issue: Group preview sometimes does not work (Thomas White) --Fixed issue: hide_type advanced question option not available for all question types (Thomas White) --Fixed issue: JavaScript IDs for validation messages start with a number, which does not pass strict HTML validation criteria (Thomas White) --Fixed issue: When using question type Array (Numbers) with multiflexible_checkbox input and radix separator = comma, JavaScript throws error when trying to fix radix separator (Thomas White) -#Updated translation: Greek by Γιάννης Κασκαμανίδης (Carsten Schmitz) - -Changes from 1.91+ (build 120302) to 1.92 (build 120303) Mar 3, 2012 -+New feature #5780: Information when there is no matching label set (shnoulle) -+New feature #5103: Support conditional piping/tailoring and complex calculations via embedded equation parser (tmswhite) -+New feature #5104: Create new question type for stored calculation results, called Equation (tmswhite) -+New feature #5268: Do all LimeReplacementField and Token replacements in a single function (tmswhite) -+New feature #5269: Use ExpressionManager for Branching logic as optional alternative to Conditions (tmswhite) -+New feature #5279: Add a GUI for ExpressionManager (tmswhite) -+New feature #5288: Optionally replace Assessments with ExpressionManager features (tmswhite) -+New feature: Each type of validation tip can be styled separately (so if a question fails validation checks, you can see whether it is because of wrong number of answers, wrong value range, wrong sum range, or wrong regex criteria). (tmswhite) -+New feature: JavaScript question type selector and Editarea template can be desactivated by user (shnoulle) -+New feature: EM reserved word "this" which refers the the current sgqa code (tmswhite) -+New feature: Question_attribute 'em_validation_q': "Boolean equation to validate the whole question" (tmswhite) -+New feature: Question_attribute 'em_validation_q_tip': "Tip to show user describing the Question Validation Equation" (tmswhite) -+New feature: Question_attribute 'em_validation_sq': "Boolean equation to validate each sub-question." (tmswhite) -+New feature: Question_attribute 'em_validation_sq_tip': "Tip to show user describing the Sub-Question Validation Equation." (tmswhite) -+New feature: Added Tools button to access Expression Manager Test Suite (tmswhite) -+New feature: Allow Regular-Expression validation of question type ';' (ARRAY (Multi Flexi) Text) (tmswhite) -+New feature: Allow Regular-Expression validation of question type 'Q' (Multiple Short Text) (tmswhite) -+New feature: Google Analytics Support (tmswhite) -+New feature: Support dynamic validation range for multiflexible_min and multiflexible_max when in text input mode (tmswhite) -+New feature: dropdown_prefix attribute for List (dropdown) - lets you prefix each entry with its visible order in the list (tmswhite) -+New feature: dropdown_size attribute for List (dropdown) - lets you specify number of visible rows in the dropdown box (tmswhite) -+New feature: Code/QID visible in quick-translation answers/subquestions/questions for easier orientation (c_schmitz) -+New feature: Show Logic File for Entire Survey, with all conditions, validation, and tailoring (tmswhite) -+New feature: Sets "equals" as the default comparison operator for conditions (jcleeland) -+New feature: Quick-add feature for label sets which (was in _dev branch but was accidentally removed with merge in from _dev_tms branch) (tmswhite) -#Updated feature: Added German translations to 1.91 sample survey. (maziminke) -#Updated feature: Browse of submitted responses now only shows relevant questions and answers. (tmswhite) -#Updated feature: Default values now available for the following question types: Date, Short/Long/Huge Text, Multiple ShortText, Multiple Numerical (tmswhite) -#Updated feature: Deprecated min_num_value_sgqa, max_num_value_sgqa, and num_value_equals_sgqa (tmswhite) -#Updated feature: array_filter - now also available for multiple_numeric and multiple_short_text (tmswhite) -#Updated feature: exclude_all_others - now also available for multiple_choice_with_comments (tmswhite) -#Updated feature: max_answers - now also available for all array types, multiple_numeric and multiple_short_text (tmswhite) -#Updated feature: max_num_value_n - now also available for multiple_numeric (tmswhite) -#Updated feature: min_answers - now also available for all array types, multiple_numeric and multiple_short_text (tmswhite) -#Updated feature: Add many more unit tests to EM and group/sort them. Contributed by GCi participant Aaron Schmitz (tmswhite) -#Updated feature: min_num_value_n - now also available for multiple_numeric (tmswhite) - - -Changes from 1.91+ (build 120224) to 1.91+ (build 120302) Mar 2, 2012 --Fixed issue #5721: Login with admin and default password doesn't work on Postgres with certain server versions (Carsten Schmitz) --Fixed issue #5783: Surveys created in versions pre QuickTranslate do not set permission rights correctly (Carsten Schmitz) --Fixed issue: Updater bugging out if no files exist for backup (Carsten Schmitz) -#Updated translation: German (Informal) by Gregor Herrmann (Carsten Schmitz) -#Updated translation: German Updated translation: German (informal) (Carsten Schmitz) -#Updated translation: Indonesian (Carsten Schmitz) -#Updated translation: Portuguese (Brazil) (Carsten Schmitz) -#Updated translation: Turkish (Carsten Schmitz) -#Update translation: Greek by Yannis Kaskamanidis (Carsten Schmitz) - - -Changes from 1.91+ (build 12416) to 1.91+ (build 120224) Feb 24, 2012 --Fixed issue #05752: statistics_user.php - always shown in baselang (magiclko) --Fixed issue #05764: If enter Y-scale and X-scale at same time, and click save, only Y-scale is saved (magiclko) --Fixed issue #5824: QueXML export FAIL (Adam Zammit) --Fixed issue #5831: User name not properly quoted on display (Carsten Schmitz) --Fixed issue #5832: Unsanitized variable id when viewing a single response (Carsten Schmitz) --Fixed issue: Fieldnames are not being properly sanitized (Carsten Schmitz) --Fixed issue: Quote dbname correctly and use utf-8 for postgres installation (Stephan Beyer) - -Changes from 1.91+ (build 12358) to 1.91+ (build 12416) Feb 7, 2012 -#Updated translation: Greek by Yannis Kaskamanidis (c_schmitz) --Fixed issue #5734: Problem upgrading from 1.72 to 1.91+ (c_schmitz) --Fixed issue #5739: Wrong percentage in graphs with List with Comments question types (c_schmitz) --Fixed issue #5749: Wrong date conversion when using certain date formats (c_schmitz) --Fixed issue #5775: SQL error on translation (shnoulle) - -Changes from 1.91+ (build 12170) to 1.91+ (build 12358) Feb 5, 2012 -#Updated translation: German (maziminke) --Fixed issue: Added missing information about a token being required for sending invitations. (maziminke) --Fixed issue #5589: Error messages when user deletes himself (c_schmitz) --Fixed issue #5592: Wrong answer mapping for dual scale matrix in detailed admin notification email (c_schmitz) --Fixed issue #5648: Quota list of questions is not sorted (c_schmitz) --Fixed issue #5688: Quota answers not in base language (c_schmitz) --Fixed issue #5695: When creating a survey 'List survey publicly' defaults to Yes instead of Np (c_schmitz) --Fixed issue #5751: Quick translation - assignment problem with dual matrix (c_schmitz) --Fixed issue #5590: 1980-01-01 in printview (tpartner) --Fixed issue #5692: Google Maps do not reappear where field is has conditions (tpartner) --Fixed issue: Fixing notice introduced with commit 12113 (mennodekker) --Fixed issue: uploader on preview (mennodekker) - -Changes from 1.91+ (build 11804) to 1.91+ (build 12170) Jan 23, 2012 -#Updated translation: French (b00z00) -#Updated translation: German (c_schmitz) -#Updated translation: German Informal (c_schmitz) -#Updated translation: Polish (elisa-ls) -#Updated translation: Portuguese (Brazil) (c_schmitz) -#Updated translation: Russian (c_schmitz) -#Updated translation: Turkish by Kaya Zeren (c_schmitz) -#Updated feature: Added German translations to 1.91 sample survey. (maziminke) -+New feature: Code/QID visible in quick-translation answers/subquestions/questions for easier orientation (c_schmitz) --Fixed issue #5645 : Upload file question for all in one survey and Fancy URLs (shnoulle) --Fixed issue #5628: SQL error after setting a filter in statistics and removing it again (c_schmitz) --Fixed issue #5649: Error message on numerical input type question not working for more than one question of this type (c_schmitz) --Fixed issue #5662: Clicking the 'Browse' button in statistics to browser filtered data shows all reponses (c_schmitz) --Fixed issue #5678: usesleft field is not created by RemoteControl in tokens table (c_schmitz) --Fixed issue #5643: CMS integration hack. Note: this option was removed for 2.00 (shnoulle) --Fixed issue: Display columns layout for citronade (shnoulle) --Fixed issue: php alert and bad deletion of file in upload file question (shnoulle) --Fixed issue: Answers not properly added for dual scale questions when adding a new language to the survey (c_schmitz) --Fixed issue: Missing sorting for groups/question in quick translate (c_schmitz) --Fixed issue: Broken pdf export of printable survey due to incorrect filename (mennodekker) --Fixed issue: printanswers shows json string for file upload fields (mennodekker) - -Changes from 1.91+ (build 11379) to 1.91+ (build 11804) Dec 30, 2011 -#Updated translation: Hungarian by GCI participant Andor Uhlár (c_schmitz) -#Updated translation: French (b00z00) -#Updated translation: Czech by GCI participant Martin Janeček (c_schmitz) -#Updated translation: Indonesian 100% by Ivan Lanin (c_schmitz) -#Updated translation: Indonesian by Jeremy Malcolm (c_schmitz) -#Updated translation: Lithuanian by Roland As (c_schmitz) -#Updated translation: Portuguese by João Santa Comba (c_schmitz) -#Updated translation: Slovak (c_schmitz) -#Updated translation: Spanish (es) (kadejo) -#Updated translation: Turkish by GCI participant Mtmecax (c_schmitz) -#Updated translations: Backported relevant translations from the Yii version (c_schmitz) --Fixed issue #5587: Unable to take ranking questions on Android phone browsers (tpartner) --Fixed issue: If SMTP sending fails due to invalid domain all following invitations in the same batch fail too if using SMTP (c_schmitz) - -Changes from 1.91+ (build 11343) to 1.91+ (build 11379) Nov 16, 2011 --Fixed issue #5580: conditions don't work when using slider with emoticons and evaluation is done on the same page (lemeur) --Fixed issue #5570: INSERTANS does not return other comment in multiple questions with Other activated (c_schmitz) --Fixed issue #5574: Error in printable survey with Postgres/MSSQL (c_schmitz) --Fixed issue #5576: Quick-translation adds backslashes before quotes and double-quotes when magic_quotes are activated (c_schmitz) --Fixed issue #5578: $sitename not loaded (c_schmitz) --Fixed issue: Printable survey was not displaying 'Other' when other was selected as a condition (jcleeland) --Fixed issue: Languages in language changer select box were not sorted by the current language (c_schmitz) --Fixed issue: Memory issue in integrity check (c_schmitz) --Fixed issue: XSS injection due to improper quoting in tool tips - thanks for reporting to Joshua Tiago via Secunia Vulnerability Coordination Reward Program (SVCRP) (c_schmitz) - - -Changes from 1.91+ (build 11228) to 1.91+ (build 11343) Nov 8, 2011 --Fixed issue #5126: CSV export - no new lines (c_schmitz) --Fixed issue #5455: INSERTANS not working in Multiple options with comments (c_schmitz) --Fixed issue #5508: $printanswershonorsconditions settings doesn't work - all questions are shown in Print Answers page (c_schmitz) --Fixed issue #5532: Problem with encoding Polish character "a" (c_schmitz) --Fixed issue #5536: Error when clicking "resume later" and token persistence enabled. (c_schmitz) --Fixed issue #5538: Further file uploads may fail after first upload processed following Next/Prev question group - patch by litotes (c_schmitz) --Fixed issue #5549: queXML: Yes/no and gender questions are not translated (azammitdcarf) --Fixed issue #5557: Basic admin notification and Detailed admin notification email templates are blank after upgrade from 1.90 (c_schmitz) --Fixed issue: Problems on exporting tokens (c_schmitz) --Fixed issue: Slow export of tokens (c_schmitz) - -Changes from 1.91+ (build 11136) to 1.91+ (build 11228) Oct 20, 2011 -#Updated translation: Danish by Andreas Christoffersen (c_schmitz) -#Updated translation: Czech (c_schmitz) -#Updated translation: Polish (elisa-ls) --Fixed issue #5489: Survey Iteration changes value usesleft in user table to 0 instead of 1 (lemeur) --Fixed issue #5126: CSV export - no new lines (c_schmitz) --Fixed issue #5323: .missing class added in answered filtered array question "Show question index / allow jumping" modality - patch by flocs (c_schmitz) --Fixed issue #5418: Failing check on fieldnames POST variable (c_schmitz) --Fixed issue #5466: "List (radio)" question displayed always as unanswered when using question index and 'Other' option (c_schmitz) --Fixed issue #5474: Not possible to send a token to multiple email addresses (c_schmitz) --Fixed issue #5491: SMTP error messages though emails are sent fine (c_schmitz) --Fixed issue #5494: When exporting statistics to PDF format with more than 35 entries(answers) answers are overlapping on the following page (c_schmitz) --Fixed issue #5495: Error when importing questions (list type) with default value set (c_schmitz) --Fixed issue #5508: $printanswershonorsconditions settings doesn't work - all questions are shown in Print Answers page (c_schmitz) --Fixed issue #5515: File uploads fail if title or comment contains apostrophe (') (c_schmitz) --Fixed issue: Administration user could gain access to database information reserved for Super-administrators (c_schmitz) - -Changes from 1.91+ (build 11110) to 1.91+ (build 11136) -#Updated translation: Danish by Andreas Christoffersen (c_schmitz) -#Updated translation: Czech (c_schmitz) --Fixed issue #5489: Survey Iteration changes value usesleft in user table to 0 instead of 1 (lemeur) --Fixed issue: Administration user could gain access to database information reserved for Super-administrators (c_schmitz) --Fixed issue: Integrity check reporting errors with subquestions due to invalid type or group id (c_schmitz) - -Changes from 1.91+ (build 11026) to 1.91+ (build 11110) -#Updated translation: Polish (elisa-ls) --Fixed issue: Re-implemented commit 10985 ("groups of "or"ed conditions were displaying multiple times") (maziminke) --Fied issue: Some single choice questions were missing answer codes for available answer options. Some questions using "other" text fields were missing correct IDs. (maziminke) --Fixed issue #5476: File upload questions hidden by condition with min file upload set prevent survey submission (lemeur) --Fixed issue #5477: Users with all rights unticked still see everyone in the system in the surveylist view (lemeur) --Fixed issue #5483: Conditions using previous answers as rightoperand do not work when both questions are on the same page (lemeur) --Fixed issue #5493: Conditions using previous answers (coded as @sgqa@) aren't translated when survey is imported. (lemeur) --Fixed issue #5488: multi numeric - slider, inital value dont register (tpartner) --Fixed issue: slider layout multinumeric can't be answered without javascript (shnoulle) --Fixed issue: Path disclosure vulnerabilities (c_schmitz) --Fixed issue: Templates not editable in Chinese (c_schmitz) - -Changes from 1.91+ (build 11018) to 1.91+ (build 11026) -#Updated translation: Italian by Paride Buetti (c_schmitz) --Fixed issue #5426: Language chooser (c_schmitz) --Fixed issue: Tabs not properly displaying for subquestion/answer editing (c_schmitz) - -Changes from 1.91+ (build 10951) to 1.91+ (build 11018) -#Updated translation : French (b00z00) -#Updated translation: German (c_schmitz) -#Updated translation: German informal (c_schmitz) --Fixed issue: Survey Name not displaying when $showsgqacode is false. (jcleeland) --Fixed issue: groups of "or"ed conditions were displaying multiple times. Removed additional "group by" entries in initial SQL that was causing the repeated processing of groups. (jcleeland) --Fixed issue #5426: default